ZGlmZiAtLWdpdCBhL2RidXMvLm1haWxtYXAgYi9kYnVzLy5tYWlsbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMzg2YjkKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLy5tYWlsbWFwCkBAIC0wLDAgKzEsMTAgQEAKK0JlbmphbWluIFJlZWQgPHJhbmdlcnJpY2tAYmVmdW5rLmNvbT4gQmVuamFtaW4gUmVlZCA8cmFuZ2VyQGJlZnVuay5jb20+CitCZW5qYW1pbiBSZWVkIDxyYW5nZXJyaWNrQGJlZnVuay5jb20+IEJlbmphbWluIFJlZWQgPHJhbmdlckBTaW4ubG9jYWw+CitDaHJpc3RpYW4gRHl3YW4gPGNocmlzdGlhbi5keXdhbkBsYW5lZG8uY29tPiBDaHJpc3RpYW4gRHl3YW4gPGNocmlzdGlhbkBsYW5lZG8uY29tPgorQ29saW4gV2FsdGVycyA8d2FsdGVyc0B2ZXJidW0ub3JnPiBDb2xpbiBXYWx0ZXJzIDx3YWx0ZXJzQGxpZ2h0Ym94LmxvY2FsZG9tYWluPgorQ29saW4gV2FsdGVycyA8d2FsdGVyc0B2ZXJidW0ub3JnPiBDb2xpbiBXYWx0ZXJzIDx3YWx0ZXJzQHNwYWNlLWdob3N0LnZlcmJ1bS5wcml2YXRlPgorSGF2b2MgUGVubmluZ3RvbiA8aHBAcG9ib3guY29tPiBIYXZvYyBQZW5uaW5ndG9uIDxocEBsb2NhbGhvc3QubG9jYWxkb21haW4+CitSYWxmIEhhYmFja2VyIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+IFJhbGYgSGFiYWNrZXIgPFJhbGYuSGFiYWNrZXJAZnJlZW5ldC5kZT4KK1JhbGYgSGFiYWNrZXIgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4gUmFsZiBIYWJhY2tlciA8cmFsZkBzMTUyOTEzNTkub25saW5laG9tZS1zZXJ2ZXIuaW5mbz4KK1JhbGYgSGFiYWNrZXIgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4gdW5rbm93biA8QWRtaW5pc3RyYXRvckAuKG5vbmUpPgorUmFsZiBIYWJhY2tlciA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPiB1bmtub3duIDxIYWJhY2tlckAuKG5vbmUpPgpkaWZmIC0tZ2l0IGEvZGJ1cy9BVVRIT1JTIGIvZGJ1cy9BVVRIT1JTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOGFmZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL0FVVEhPUlMKQEAgLTAsMCArMSwxMjIgQEAKK0FsYmFuIENyZXF1eSA8YWxiYW4uY3JlcXV5QGNvbGxhYm9yYS5jby51az4KK0FsZXhhbmRlciBMYXJzc29uIDxhbGV4bEByZWRoYXQuY29tPgorQW5kZXJzIENhcmxzc29uIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KK0FuZHJlIEhlaW5lY2tlIDxhaGVpbmVja2VAaW50ZXZhdGlvbi5kZT4KK0FydGVtIEJpdHl1dHNraXkgPEFydGVtLkJpdHl1dHNraXlAbm9raWEuY29tPgorQXVyZWxpZW4gSmFybm8gPGF1cmVsMzJAZGViaWFuLm9yZz4KK0JlbmphbWluIFJlZWQgPHJhbmdlcnJpY2tAYmVmdW5rLmNvbT4KK0JyaWFuIENhbWVyb24gPGJyaWFuLmNhbWVyb25Ab3JhY2xlLmNvbT4KK0JyaWFuIENhbWVyb24gPGJyaWFuLmNhbWVyb25Ac3VuLmNvbT4KK0NocmlzIE1heW8gPGFrbGhmZXggZ21haWwgY29tPgorQ2hyaXN0aWFuIER5d2FuIDxjaHJpc3RpYW4uZHl3YW5AbGFuZWRvLmNvbT4KK0NocmlzdGlhbiBFaHJsaWNoZXIgPENoLkVocmxpY2hlckBnbXguZGU+CitDaHJpc3RpYW4gUGVyc2NoIChHTk9NRSkgPGNocGVAZ25vbWUub3JnPgorQ29saW4gV2FsdGVycyA8d2FsdGVyc0B2ZXJidW0ub3JnPgorQ29saW4gV2F0c29uIDxjandhdHNvbkB1YnVudHUuY29tPgorQ29zaW1vIEFsZmFyYW5vIDxjb3NpbW8uYWxmYXJhbm9AY29sbGFib3JhLmNvLnVrPgorQ3Jpc3RpYW4gUm9kcsOtZ3VleiA8Y3Jpc3RpYW4ucm9kcmlndWV6QG9wZW5zdXNlLm9yZz4KK0N5cmlsIEJydWxlYm9pcyA8a2liaUBkZWJpYW4ub3JnPgorRGFuaWVsIFAuIEJlcnJhbmdlIDxkYW5AYmVycmFuZ2UuY29tPgorRGFuaWVsIFJlZWQgPGRqckByZWRoYXQuY29tPgorRGF2aWQgWmV1dGhlbiA8ZGF2aWR6QHJlZGhhdC5jb20+CitEZW5uaXMgS2FhcnNlbWFrZXIgPGRlbm5pc0BrYWFyc2VtYWtlci5uZXQ+CitEaWVnbyBFLiAnRmxhbWVleWVzJyBQZXR0ZW7DsiA8ZmxhbWVleWVzQGdtYWlsLmNvbT4KK0VhbW9uIFdhbHNoIDxld2Fsc2hAdHljaG8ubnNhLmdvdj4KK0ZlZGVyaWNvIE1lbmEgUXVpbnRlcm8gPGZlZGVyaWNvQG5vdmVsbC5jb20+CitGcmFuayBPc3RlcmZlbGQgPGZyYW5rQGtkYWIubmV0PgorRnJlZGVyaWMgQ3JvemF0IDxmY3JvemF0QG1hbmRyaXZhLmNvbT4KK0ZyaWRyaWNoIMWgdHJiYSA8ZnJpZHJpY2guc3RyYmFAYmx1ZXdpbi5jaD4KK0dyemVnb3J6IETEhWJyb3dza2kgPGdkeEBwb2N6dGEuZm0+CitIYXJhbGQgRmVybmVuZ2VsIDxoYXJyeUBrZGV2ZWxvcC5vcmc+CitIYXJyaSBQb3J0ZW4gPHBvcnRlbkBrZGUub3JnPgorSGFzc28gVGVwcGVyIDxoYXNzb0Blc3RwYWsuZWU+CitIYXZvYyBQZW5uaW5ndG9uIDxocEBwb2JveC5jb20+CitIYXZvYyBQZW5uaW5ndG9uIDxocEByZWRoYXQuY29tPgorSGVuZHJpayBCdXNjaG1laWVyIDxoYnVzY2htZUBUZWNoRmFrLlVuaS1CaWVsZWZlbGQuREU+CitKYW1lcyBDYXJ0ZXIgPGp3Y2FydDJAdHljaG8ubnNhLmdvdj4KK0phbWVzIFdlc3RieSA8ancrZGViaWFuQGphbWVzd2VzdGJ5Lm5ldD4KK0phbWVzIFdpbGxjb3ggPGp3aWxsY294QGdub21lLm9yZz4KK0plbnMgR3JhbnNldWVyIDxqZW5zZ3JAZ214Lm5ldD4KK0rDqXLDqW1pZSBEaW1pbm8gPGplcmVtaWVAZGltaW5vLm9yZz4KK0ppxZnDrSBLbGltZcWhIDxqa2xpbWVzQHJlZGhhdC5jb20+CitKb2UgTWFyY3VzIENsYXJrZSA8bWFyY3VzQGZyZWVkZXNrdG9wLm9yZz4KK0pvZSBTaGF3IDxqb2VzaGF3QG5vdmVsbC5jb20+CitKb2hhbiBHeWxsZW5zcGV0eiA8am9oYW5neUBheGlzLmNvbT4KK0pvaGFubmVzIENhcmxzc29uIDxqb2hhbm5lcy5jYXJsc3Nvbi54QHNvbnllcmljc3Nvbi5jb20+CitKb2huIChKNSkgUGFsbWllcmkgPGpvaG5wQHJlZGhhdC5jb20+CitKb24gR29zdGluZyA8eXVrYXJpb25zZW5AZ21haWwuY29tPgorSm9uIFRyb3dicmlkZ2UgPHRyb3dAeGltaWFuLmNvbT4KK0theSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KK0tpbW1vIEjDpG3DpGzDpGluZW4gPGtpbW1vLmhhbWFsYWluZW5Abm9raWEuY29tPgorS2phcnRhbiBNYXJhYXMgPGttYXJhYXNAZ25vbWUub3JnPgorS3Jpc3RpYW4gSMO4Z3NiZXJnIDxrcmhAcmVkaGF0LmNvbT4KK0tyaXN0aWFuIFJpZXR2ZWxkIDxrcmlzQGd0ay5vcmc+CitLdXJ0IE1pbGxlciA8a3VydEBpbnRyaWNhdGVzb2Z0d2FyZS5jb20+CitMYXdyZW5jZSBSLiBTdGVlZ2VyIDxsc3RlZWdlckBnbWFpbC5jb20+CitMZW5uYXJ0IFBvZXR0ZXJpbmcgPGxlbm5hcnRAcG9ldHRlcmluZy5uZXQ+CitMZW5uYXJ0IFBvZXR0ZXJpbmcgPG16cW9oZkAwcG9pbnRlci5kZT4KK0xpb25lbCBMYW5kd2VybGluIDxsaW9uZWwubGFuZHdlcmxpbkBvcGVud2lkZS5mcj4KK0x1aXogQXVndXN0byBWb24gRGVudHogPGx1aXouZGVudHotdm9uQG5va2lhLmNvbT4KK01hcmMgQnJvY2tzY2htaWR0IDxoZUBkZWJpYW4ub3JnPgorTWFyYyBNdXR6IDxtYXJjQGtkYWIubmV0PgorTWFyY3VzIEJyaW5rbWFubiA8bWFyY3VzLmJyaW5rbWFubkBydWhyLXVuaS1ib2NodW0uZGU+CitNYXJrIEJyYW5kIDxtYWJyYW5kQG1hYnJhbmQubmw+CitNYXJrIE1jTG91Z2hsaW4gPG1hcmtAc2t5bmV0LmllPgorTWF0dGhpYXMgQ2xhc2VuIDxtY2xhc2VuQHJlZGhhdC5jb20+CitNYXR0IE1jQ3V0Y2hlbiA8bWF0dEBtYXR0bWNjdXRjaGVuLm5ldD4KK01pY2hhZWwgTWVla3MgPG1pY2hhZWwubWVla3NAbm92ZWxsLmNvbT4KK01pY2hhZWwgTWVla3MgPG1pY2hhZWxAeGltaWFuLmNvbT4KK01pa2FlbCBIYWxsZW5kYWwgPG1pY2tlQGNvZGVmYWN0b3J5LnNlPgorTWlrYWVsIEhhbGxlbmRhbCA8bWlja2VAaW1lbmRpby5jb20+CitNaWtlIE1jUXVhaWQgPG1pa2VAbWlrZW1jcXVhaWQuY29tPgorTWlsb3NsYXYgVHJtYWMgPG1pdHJAdm9sbnkuY3o+CitNdXJyYXkgQ3VtbWluZyA8bXVycmF5Y0BtdXJyYXljLmNvbT4KK05ndXnhu4VuIFRow6FpIE5n4buNYyBEdXkgPHBjbG91ZHNAZ21haWwuY29tPgorT2xlIEFuZHLDqSBWYWRsYSBSYXZuw6VzIDxvbGUuYW5kcmUucmF2bmFzQHRhbmRiZXJnLmNvbT4KK09saXZpZXIgQW5kcmlldSA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CitPc3dhbGQgQnVkZGVuaGFnZW4gPG9zc2lAa2RlLm9yZz4KK093ZW4gRnJhc2VyLUdyZWVuIDxvd2VuQGRpc2NvYmFiZS5uZXQ+CitQYXRyaWNrIHZvbiBSZXRoIDxwYXRyaWNrLnZvbnJldGhAZ21haWwuY29tPgorUGF1IEdhcmNpYSBpIFF1aWxlcyA8cGdxdWlsZXNAZWxwYXVlci5vcmc+CitQYXVsIEJvbGxlIDxwZWJvbGxlQHRpc2NhbGkubmw+CitQZXRlciBCcmVpdGVubG9obmVyIDxwZWJAbXBwbXUubXBnLmRlPgorUGV0ZXIgS8O8bW1lbCA8c3ludGhldGljcHBAZ214Lm5ldD4KK1BldGVyIE1jQ3VyZHkgPHBtY2N1cmR5QHNrZXB0b3BvdGFtdXM+CitQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+CitQbMOhY2lkbyBSZXZpbGxhIDx1bmtub3duQHVua25vd24uZG9tYWluPgorUmFsZiBIYWJhY2tlciA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorUmF5IFN0cm9kZSA8cnN0cm9kZUByZWRoYXQuY29tPgorUmljaGFyZCBBLiBIYW5raW5zIDxyaWNoYXJkLmEuaGFua2luc0BnbWFpbC5jb20+CitSaWNoYXJkIEh1Z2hlcyA8cmljaGFyZEBodWdoc2llLmNvbT4KK1JpY2hhcmQgSHVsdCA8cmh1bHRAY29kZWZhY3Rvcnkuc2U+CitSaWNoYXJkIEh1bHQgPHJpY2hhcmRAaW1lbmRpby5jb20+CitSb2JlcnQgTWNRdWVlbiA8cm9ib3QxMDFAZGViaWFuLm9yZz4KK1JvYmVydG8gR3VpZG8gPGJvYjRqb2JAZ21haWwuY29tPgorUm9tYWluIFBva3J6eXdrYSA8cm9tYWluQGtkYWIuY29tPgorUm9zcyBCdXJ0b24gPHJvc3NAb3BlbmVkaGFuZC5jb20+CitSeWFuIExvcnRpZSA8ZGVzcnRAZGVzcnQuY2E+CitTYXNjaGEgU2lsYmUgPHNhc2NoYS1wZ3BAc2lsYmUub3JnPgorU2FzY2hhIFNpbGJlIDxzYXNjaGEtd2ViLWJ1Z3MuZnJlZWRlc2t0b3Aub3JnQHNpbGJlLm9yZz4KK1Njb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QG5ldHNwbGl0LmNvbT4KK1Njb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QHVidW50dS5jb20+CitTZWJhc3RpYW4gU2F1ZXIgPHNlYnNhdWVyQGtkYWIubmV0PgorU2V0aCBOaWNrZWxsIDxzZXRoQGdub21lLm9yZz4KK1NpbW9uIE1jVml0dGllIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CitTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CitTbGVkeiA8c2xlZHpATU9CSUwtNDAwLTU4Ni5pbnRlcm4uZHJlc2VhcmNoLmRlPgorU3RldmUgR3J1YmIgPHNncnViYkByZWRoYXQuY29tPgorU3ZlbiBIZXJ6YmVyZyA8c3ZlbkBpbWVuZGlvLmNvbT4KK1RoaWFnbyBNYWNpZWlyYSA8dGhpYWdvQGtkZS5vcmc+CitUaW0gRGlqa3N0cmEgPHRpbUBmYW1kaWprc3RyYS5vcmc+CitUb2JpYXMgTXVlbGxlciA8ZmRvLWJ1Z3NAY3J5cHRvYml0Y2guZGU+CitUb21hcyBIb2dlciA8dGhvZ2VyQHJlZGhhdC5jb20+CitUb21hcyBQZWxrYSA8dHBlbGthQHJlZGhhdC5jb20+CitUb20gSHVnaGVzIDx0b20uaHVnaGVzQHBhbG0uY29tPgorVG9yIExpbGxxdmlzdCA8dG1sQGlraS5maT4KK1dhbGRvIEJhc3RpYW4gPGJhc3RpYW5Aa2RlLm9yZz4KK1dpbGxpYW0gTGFjaGFuY2UgPHdybGFjaEBnbWFpbC5jb20+CitXaWxsIFRob21wc29uIDx3aWxsLnRob21wc29uQGNvbGxhYm9yYS5jby51az4KK1d1bGYgQy4gS3J1ZWdlciA8cGhpbGFudHJvcEBleGhlcmJvLm9yZz4KK1hhbiBMb3BleiA8eGFuQGdub21lLm9yZz4KK1lhYWtvdiBTZWxrb3dpdHogPHlzZWxrb3dpdHpAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorWmFjayBSdXNpbiA8emFja0BrZGUub3JnPgpkaWZmIC0tZ2l0IGEvZGJ1cy9BbmRyb2lkLmJwIGIvZGJ1cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YzRjOTEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw5IEBACitzdWJkaXJzID0gWworICAgICJidXMiLAorICAgICJkYnVzIiwKK10KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJkYnVzLWhlYWRlcnMiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorfQpkaWZmIC0tZ2l0IGEvZGJ1cy9BbmRyb2lkLm1rIGIvZGJ1cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNTNlN2QKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL0FuZHJvaWQubWsKQEAgLTAsMCArMSBAQAoraW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9kYnVzL0NPUFlJTkcgYi9kYnVzL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI2MGIxMAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvQ09QWUlORwpAQCAtMCwwICsxLDU1MiBAQAorRC1CdXMgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHlvdXIgY2hvaWNlIG9mIHRoZSBBY2FkZW1pYyBGcmVlCitMaWNlbnNlIHZlcnNpb24gMi4xLCBvciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisob3IsIGF0IHlvdXIgb3B0aW9uIGFueSBsYXRlciB2ZXJzaW9uKS4KKworQm90aCBsaWNlbnNlcyBhcmUgaW5jbHVkZWQgaGVyZS4gU29tZSBvZiB0aGUgc3RhbmRhbG9uZSBiaW5hcmllcyBhcmUKK3VuZGVyIHRoZSBHUEwgb25seTsgaW4gcGFydGljdWxhciwgYnV0IG5vdCBsaW1pdGVkIHRvLAordG9vbHMvZGJ1cy1jbGVhbnVwLXNvY2tldHMuYyBhbmQgdGVzdC9kZWNvZGUtZ2Nvdi5jLiBFYWNoIHNvdXJjZSBjb2RlCitmaWxlIGlzIG1hcmtlZCB3aXRoIHRoZSBwcm9wZXIgY29weXJpZ2h0IGluZm9ybWF0aW9uIC0gaWYgeW91IGZpbmQgYQorZmlsZSB0aGF0IGlzbid0IG1hcmtlZCBwbGVhc2UgYnJpbmcgaXQgdG8gb3VyIGF0dGVudGlvbi4KKworVGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZQordi4gMi4xCisKK1RoaXMgQWNhZGVtaWMgRnJlZSBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKSBhcHBsaWVzIHRvIGFueSBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAgKHRoZSAiT3JpZ2luYWwgV29yayIpIHdob3NlIG93bmVyICh0aGUgIkxpY2Vuc29yIikgaGFzIHBsYWNlZCB0aGUgZm9sbG93aW5nIG5vdGljZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBPcmlnaW5hbCBXb3JrOgorCitMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisKKzEpIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBMaWNlbnNvciBoZXJlYnkgZ3JhbnRzIFlvdSBhCit3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUsIHBlcnBldHVhbCwgc3VibGljZW5zZWFibGUKK2xpY2Vuc2UgdG8gZG8gdGhlIGZvbGxvd2luZzoKKworYSkgdG8gcmVwcm9kdWNlIHRoZSBPcmlnaW5hbCBXb3JrIGluIGNvcGllczsKKworYikgdG8gcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzICgiRGVyaXZhdGl2ZSBXb3JrcyIpIGJhc2VkIHVwb24gdGhlIE9yaWdpbmFsIFdvcms7CisKK2MpIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBPcmlnaW5hbCBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRvIHRoZSBwdWJsaWM7CisKK2QpIHRvIHBlcmZvcm0gdGhlIE9yaWdpbmFsIFdvcmsgcHVibGljbHk7IGFuZAorCitlKSB0byBkaXNwbGF5IHRoZSBPcmlnaW5hbCBXb3JrIHB1YmxpY2x5LgorCisyKSBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gTGljZW5zb3IgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLAorcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlLCBwZXJwZXR1YWwsIHN1YmxpY2Vuc2VhYmxlIGxpY2Vuc2UsIHVuZGVyCitwYXRlbnQgY2xhaW1zIG93bmVkIG9yIGNvbnRyb2xsZWQgYnkgdGhlIExpY2Vuc29yIHRoYXQgYXJlIGVtYm9kaWVkIGluCit0aGUgT3JpZ2luYWwgV29yayBhcyBmdXJuaXNoZWQgYnkgdGhlIExpY2Vuc29yLCB0byBtYWtlLCB1c2UsIHNlbGwgYW5kCitvZmZlciBmb3Igc2FsZSB0aGUgT3JpZ2luYWwgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3Jrcy4KKworMykgR3JhbnQgb2YgU291cmNlIENvZGUgTGljZW5zZS4gVGhlIHRlcm0gIlNvdXJjZSBDb2RlIiBtZWFucyB0aGUKK3ByZWZlcnJlZCBmb3JtIG9mIHRoZSBPcmlnaW5hbCBXb3JrIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdCBhbmQKK2FsbCBhdmFpbGFibGUgZG9jdW1lbnRhdGlvbiBkZXNjcmliaW5nIGhvdyB0byBtb2RpZnkgdGhlIE9yaWdpbmFsCitXb3JrLiBMaWNlbnNvciBoZXJlYnkgYWdyZWVzIHRvIHByb3ZpZGUgYSBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlCitTb3VyY2UgQ29kZSBvZiB0aGUgT3JpZ2luYWwgV29yayBhbG9uZyB3aXRoIGVhY2ggY29weSBvZiB0aGUgT3JpZ2luYWwKK1dvcmsgdGhhdCBMaWNlbnNvciBkaXN0cmlidXRlcy4gTGljZW5zb3IgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHNhdGlzZnkKK3RoaXMgb2JsaWdhdGlvbiBieSBwbGFjaW5nIGEgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBTb3VyY2UgQ29kZQoraW4gYW4gaW5mb3JtYXRpb24gcmVwb3NpdG9yeSByZWFzb25hYmx5IGNhbGN1bGF0ZWQgdG8gcGVybWl0CitpbmV4cGVuc2l2ZSBhbmQgY29udmVuaWVudCBhY2Nlc3MgYnkgWW91IGZvciBhcyBsb25nIGFzIExpY2Vuc29yCitjb250aW51ZXMgdG8gZGlzdHJpYnV0ZSB0aGUgT3JpZ2luYWwgV29yaywgYW5kIGJ5IHB1Ymxpc2hpbmcgdGhlCithZGRyZXNzIG9mIHRoYXQgaW5mb3JtYXRpb24gcmVwb3NpdG9yeSBpbiBhIG5vdGljZSBpbW1lZGlhdGVseQorZm9sbG93aW5nIHRoZSBjb3B5cmlnaHQgbm90aWNlIHRoYXQgYXBwbGllcyB0byB0aGUgT3JpZ2luYWwgV29yay4KKworNCkgRXhjbHVzaW9ucyBGcm9tIExpY2Vuc2UgR3JhbnQuIE5laXRoZXIgdGhlIG5hbWVzIG9mIExpY2Vuc29yLCBub3IKK3RoZSBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIHRvIHRoZSBPcmlnaW5hbCBXb3JrLCBub3IgYW55IG9mIHRoZWlyCit0cmFkZW1hcmtzIG9yIHNlcnZpY2UgbWFya3MsIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgT3JpZ2luYWwgV29yayB3aXRob3V0IGV4cHJlc3MgcHJpb3Igd3JpdHRlbgorcGVybWlzc2lvbiBvZiB0aGUgTGljZW5zb3IuIE5vdGhpbmcgaW4gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIGRlZW1lZCB0bworZ3JhbnQgYW55IHJpZ2h0cyB0byB0cmFkZW1hcmtzLCBjb3B5cmlnaHRzLCBwYXRlbnRzLCB0cmFkZSBzZWNyZXRzIG9yCithbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIExpY2Vuc29yIGV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCitoZXJlaW4uIE5vIHBhdGVudCBsaWNlbnNlIGlzIGdyYW50ZWQgdG8gbWFrZSwgdXNlLCBzZWxsIG9yIG9mZmVyIHRvCitzZWxsIGVtYm9kaW1lbnRzIG9mIGFueSBwYXRlbnQgY2xhaW1zIG90aGVyIHRoYW4gdGhlIGxpY2Vuc2VkIGNsYWltcworZGVmaW5lZCBpbiBTZWN0aW9uIDIuIE5vIHJpZ2h0IGlzIGdyYW50ZWQgdG8gdGhlIHRyYWRlbWFya3Mgb2YKK0xpY2Vuc29yIGV2ZW4gaWYgc3VjaCBtYXJrcyBhcmUgaW5jbHVkZWQgaW4gdGhlIE9yaWdpbmFsIFdvcmsuIE5vdGhpbmcKK2luIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBpbnRlcnByZXRlZCB0byBwcm9oaWJpdCBMaWNlbnNvciBmcm9tCitsaWNlbnNpbmcgdW5kZXIgZGlmZmVyZW50IHRlcm1zIGZyb20gdGhpcyBMaWNlbnNlIGFueSBPcmlnaW5hbCBXb3JrCit0aGF0IExpY2Vuc29yIG90aGVyd2lzZSB3b3VsZCBoYXZlIGEgcmlnaHQgdG8gbGljZW5zZS4KKworNSkgVGhpcyBzZWN0aW9uIGludGVudGlvbmFsbHkgb21pdHRlZC4KKworNikgQXR0cmlidXRpb24gUmlnaHRzLiBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgQ29kZSBvZiBhbnkKK0Rlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgY3JlYXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQgb3IgdHJhZGVtYXJrCitub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBDb2RlIG9mIHRoZSBPcmlnaW5hbCBXb3JrLCBhcyB3ZWxsIGFzIGFueQorbm90aWNlcyBvZiBsaWNlbnNpbmcgYW5kIGFueSBkZXNjcmlwdGl2ZSB0ZXh0IGlkZW50aWZpZWQgdGhlcmVpbiBhcyBhbgorIkF0dHJpYnV0aW9uIE5vdGljZS4iIFlvdSBtdXN0IGNhdXNlIHRoZSBTb3VyY2UgQ29kZSBmb3IgYW55CitEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGNyZWF0ZSB0byBjYXJyeSBhIHByb21pbmVudCBBdHRyaWJ1dGlvbgorTm90aWNlIHJlYXNvbmFibHkgY2FsY3VsYXRlZCB0byBpbmZvcm0gcmVjaXBpZW50cyB0aGF0IFlvdSBoYXZlCittb2RpZmllZCB0aGUgT3JpZ2luYWwgV29yay4KKworNykgV2FycmFudHkgb2YgUHJvdmVuYW5jZSBhbmQgRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gTGljZW5zb3IKK3dhcnJhbnRzIHRoYXQgdGhlIGNvcHlyaWdodCBpbiBhbmQgdG8gdGhlIE9yaWdpbmFsIFdvcmsgYW5kIHRoZSBwYXRlbnQKK3JpZ2h0cyBncmFudGVkIGhlcmVpbiBieSBMaWNlbnNvciBhcmUgb3duZWQgYnkgdGhlIExpY2Vuc29yIG9yIGFyZQorc3VibGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugd2l0aCB0aGUgcGVybWlzc2lvbgorb2YgdGhlIGNvbnRyaWJ1dG9yKHMpIG9mIHRob3NlIGNvcHlyaWdodHMgYW5kIHBhdGVudCByaWdodHMuIEV4Y2VwdCBhcworZXhwcmVzc2x5IHN0YXRlZCBpbiB0aGUgaW1tZWRpYXRlbHkgcHJvY2VlZGluZyBzZW50ZW5jZSwgdGhlIE9yaWdpbmFsCitXb3JrIGlzIHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZSBvbiBhbiAiQVMgSVMiIEJBU0lTIGFuZCBXSVRIT1VUCitXQVJSQU5UWSwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sCit0aGUgd2FycmFudGllcyBvZiBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgT0YgVEhFIE9SSUdJTkFMCitXT1JLIElTIFdJVEggWU9VLiBUaGlzIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgY29uc3RpdHV0ZXMgYW4gZXNzZW50aWFsCitwYXJ0IG9mIHRoaXMgTGljZW5zZS4gTm8gbGljZW5zZSB0byBPcmlnaW5hbCBXb3JrIGlzIGdyYW50ZWQgaGVyZXVuZGVyCitleGNlcHQgdW5kZXIgdGhpcyBkaXNjbGFpbWVyLgorCis4KSBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gVW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBhbmQgdW5kZXIgbm8gbGVnYWwKK3RoZW9yeSwgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvcgorb3RoZXJ3aXNlLCBzaGFsbCB0aGUgTGljZW5zb3IgYmUgbGlhYmxlIHRvIGFueSBwZXJzb24gZm9yIGFueSBkaXJlY3QsCitpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueQorY2hhcmFjdGVyIGFyaXNpbmcgYXMgYSByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIHRoZSB1c2Ugb2YgdGhlCitPcmlnaW5hbCBXb3JrIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBkYW1hZ2VzIGZvciBsb3NzIG9mCitnb29kd2lsbCwgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZAorYWxsIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMuIFRoaXMgbGltaXRhdGlvbiBvZiBsaWFiaWxpdHkKK3NoYWxsIG5vdCBhcHBseSB0byBsaWFiaWxpdHkgZm9yIGRlYXRoIG9yIHBlcnNvbmFsIGluanVyeSByZXN1bHRpbmcKK2Zyb20gTGljZW5zb3IncyBuZWdsaWdlbmNlIHRvIHRoZSBleHRlbnQgYXBwbGljYWJsZSBsYXcgcHJvaGliaXRzIHN1Y2gKK2xpbWl0YXRpb24uIFNvbWUganVyaXNkaWN0aW9ucyBkbyBub3QgYWxsb3cgdGhlIGV4Y2x1c2lvbiBvcgorbGltaXRhdGlvbiBvZiBpbmNpZGVudGFsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc28gdGhpcyBleGNsdXNpb24KK2FuZCBsaW1pdGF0aW9uIG1heSBub3QgYXBwbHkgdG8gWW91LgorCis5KSBBY2NlcHRhbmNlIGFuZCBUZXJtaW5hdGlvbi4gSWYgWW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorT3JpZ2luYWwgV29yayBvciBhIERlcml2YXRpdmUgV29yaywgWW91IG11c3QgbWFrZSBhIHJlYXNvbmFibGUgZWZmb3J0Cit1bmRlciB0aGUgY2lyY3Vtc3RhbmNlcyB0byBvYnRhaW4gdGhlIGV4cHJlc3MgYXNzZW50IG9mIHJlY2lwaWVudHMgdG8KK3RoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIE5vdGhpbmcgZWxzZSBidXQgdGhpcyBMaWNlbnNlIChvciBhbm90aGVyCit3cml0dGVuIGFncmVlbWVudCBiZXR3ZWVuIExpY2Vuc29yIGFuZCBZb3UpIGdyYW50cyBZb3UgcGVybWlzc2lvbiB0bworY3JlYXRlIERlcml2YXRpdmUgV29ya3MgYmFzZWQgdXBvbiB0aGUgT3JpZ2luYWwgV29yayBvciB0byBleGVyY2lzZQorYW55IG9mIHRoZSByaWdodHMgZ3JhbnRlZCBpbiBTZWN0aW9uIDEgaGVyZWluLCBhbmQgYW55IGF0dGVtcHQgdG8gZG8KK3NvIGV4Y2VwdCB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIChvciBhbm90aGVyIHdyaXR0ZW4KK2FncmVlbWVudCBiZXR3ZWVuIExpY2Vuc29yIGFuZCBZb3UpIGlzIGV4cHJlc3NseSBwcm9oaWJpdGVkIGJ5CitVLlMuIGNvcHlyaWdodCBsYXcsIHRoZSBlcXVpdmFsZW50IGxhd3Mgb2Ygb3RoZXIgY291bnRyaWVzLCBhbmQgYnkKK2ludGVybmF0aW9uYWwgdHJlYXR5LiBUaGVyZWZvcmUsIGJ5IGV4ZXJjaXNpbmcgYW55IG9mIHRoZSByaWdodHMKK2dyYW50ZWQgdG8gWW91IGluIFNlY3Rpb24gMSBoZXJlaW4sIFlvdSBpbmRpY2F0ZSBZb3VyIGFjY2VwdGFuY2Ugb2YKK3RoaXMgTGljZW5zZSBhbmQgYWxsIG9mIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucy4KKworMTApIFRlcm1pbmF0aW9uIGZvciBQYXRlbnQgQWN0aW9uLiBUaGlzIExpY2Vuc2Ugc2hhbGwgdGVybWluYXRlCithdXRvbWF0aWNhbGx5IGFuZCBZb3UgbWF5IG5vIGxvbmdlciBleGVyY2lzZSBhbnkgb2YgdGhlIHJpZ2h0cyBncmFudGVkCit0byBZb3UgYnkgdGhpcyBMaWNlbnNlIGFzIG9mIHRoZSBkYXRlIFlvdSBjb21tZW5jZSBhbiBhY3Rpb24sCitpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0sIGFnYWluc3QgTGljZW5zb3Igb3IgYW55CitsaWNlbnNlZSBhbGxlZ2luZyB0aGF0IHRoZSBPcmlnaW5hbCBXb3JrIGluZnJpbmdlcyBhIHBhdGVudC4gVGhpcwordGVybWluYXRpb24gcHJvdmlzaW9uIHNoYWxsIG5vdCBhcHBseSBmb3IgYW4gYWN0aW9uIGFsbGVnaW5nIHBhdGVudAoraW5mcmluZ2VtZW50IGJ5IGNvbWJpbmF0aW9ucyBvZiB0aGUgT3JpZ2luYWwgV29yayB3aXRoIG90aGVyIHNvZnR3YXJlCitvciBoYXJkd2FyZS4KKworMTEpIEp1cmlzZGljdGlvbiwgVmVudWUgYW5kIEdvdmVybmluZyBMYXcuIEFueSBhY3Rpb24gb3Igc3VpdCByZWxhdGluZwordG8gdGhpcyBMaWNlbnNlIG1heSBiZSBicm91Z2h0IG9ubHkgaW4gdGhlIGNvdXJ0cyBvZiBhIGp1cmlzZGljdGlvbgord2hlcmVpbiB0aGUgTGljZW5zb3IgcmVzaWRlcyBvciBpbiB3aGljaCBMaWNlbnNvciBjb25kdWN0cyBpdHMgcHJpbWFyeQorYnVzaW5lc3MsIGFuZCB1bmRlciB0aGUgbGF3cyBvZiB0aGF0IGp1cmlzZGljdGlvbiBleGNsdWRpbmcgaXRzCitjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucy4gVGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBVbml0ZWQgTmF0aW9ucworQ29udmVudGlvbiBvbiBDb250cmFjdHMgZm9yIHRoZSBJbnRlcm5hdGlvbmFsIFNhbGUgb2YgR29vZHMgaXMKK2V4cHJlc3NseSBleGNsdWRlZC4gQW55IHVzZSBvZiB0aGUgT3JpZ2luYWwgV29yayBvdXRzaWRlIHRoZSBzY29wZSBvZgordGhpcyBMaWNlbnNlIG9yIGFmdGVyIGl0cyB0ZXJtaW5hdGlvbiBzaGFsbCBiZSBzdWJqZWN0IHRvIHRoZQorcmVxdWlyZW1lbnRzIGFuZCBwZW5hbHRpZXMgb2YgdGhlIFUuUy4gQ29weXJpZ2h0IEFjdCwgMTcgVS5TLkMuIMOCwqcgMTAxCitldCBzZXEuLCB0aGUgZXF1aXZhbGVudCBsYXdzIG9mIG90aGVyIGNvdW50cmllcywgYW5kIGludGVybmF0aW9uYWwKK3RyZWF0eS4gVGhpcyBzZWN0aW9uIHNoYWxsIHN1cnZpdmUgdGhlIHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZS4KKworMTIpIEF0dG9ybmV5cyBGZWVzLiBJbiBhbnkgYWN0aW9uIHRvIGVuZm9yY2UgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZQorb3Igc2Vla2luZyBkYW1hZ2VzIHJlbGF0aW5nIHRoZXJldG8sIHRoZSBwcmV2YWlsaW5nIHBhcnR5IHNoYWxsIGJlCitlbnRpdGxlZCB0byByZWNvdmVyIGl0cyBjb3N0cyBhbmQgZXhwZW5zZXMsIGluY2x1ZGluZywgd2l0aG91dAorbGltaXRhdGlvbiwgcmVhc29uYWJsZSBhdHRvcm5leXMnIGZlZXMgYW5kIGNvc3RzIGluY3VycmVkIGluCitjb25uZWN0aW9uIHdpdGggc3VjaCBhY3Rpb24sIGluY2x1ZGluZyBhbnkgYXBwZWFsIG9mIHN1Y2ggYWN0aW9uLiBUaGlzCitzZWN0aW9uIHNoYWxsIHN1cnZpdmUgdGhlIHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZS4KKworMTMpIE1pc2NlbGxhbmVvdXMuIFRoaXMgTGljZW5zZSByZXByZXNlbnRzIHRoZSBjb21wbGV0ZSBhZ3JlZW1lbnQKK2NvbmNlcm5pbmcgdGhlIHN1YmplY3QgbWF0dGVyIGhlcmVvZi4gSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UKK2lzIGhlbGQgdG8gYmUgdW5lbmZvcmNlYWJsZSwgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgb25seSB0bwordGhlIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBpdCBlbmZvcmNlYWJsZS4KKworMTQpIERlZmluaXRpb24gb2YgIllvdSIgaW4gVGhpcyBMaWNlbnNlLiAiWW91IiB0aHJvdWdob3V0IHRoaXMKK0xpY2Vuc2UsIHdoZXRoZXIgaW4gdXBwZXIgb3IgbG93ZXIgY2FzZSwgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhCitsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyByaWdodHMgdW5kZXIsIGFuZCBjb21wbHlpbmcgd2l0aCBhbGwgb2YgdGhlCit0ZXJtcyBvZiwgdGhpcyBMaWNlbnNlLiBGb3IgbGVnYWwgZW50aXRpZXMsICJZb3UiIGluY2x1ZGVzIGFueSBlbnRpdHkKK3RoYXQgY29udHJvbHMsIGlzIGNvbnRyb2xsZWQgYnksIG9yIGlzIHVuZGVyIGNvbW1vbiBjb250cm9sIHdpdGgKK3lvdS4gRm9yIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsCitkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZSBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoCitlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3Igb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eQorcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZSBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwKK293bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworMTUpIFJpZ2h0IHRvIFVzZS4gWW91IG1heSB1c2UgdGhlIE9yaWdpbmFsIFdvcmsgaW4gYWxsIHdheXMgbm90CitvdGhlcndpc2UgcmVzdHJpY3RlZCBvciBjb25kaXRpb25lZCBieSB0aGlzIExpY2Vuc2Ugb3IgYnkgbGF3LCBhbmQKK0xpY2Vuc29yIHByb21pc2VzIG5vdCB0byBpbnRlcmZlcmUgd2l0aCBvciBiZSByZXNwb25zaWJsZSBmb3Igc3VjaAordXNlcyBieSBZb3UuCisKK1RoaXMgbGljZW5zZSBpcyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBMYXdyZW5jZSBFLiBSb3Nlbi4gQWxsIHJpZ2h0cworcmVzZXJ2ZWQuIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGlzCitsaWNlbnNlIHdpdGhvdXQgbW9kaWZpY2F0aW9uLiBUaGlzIGxpY2Vuc2UgbWF5IG5vdCBiZSBtb2RpZmllZCB3aXRob3V0Cit0aGUgZXhwcmVzcyB3cml0dGVuIHBlcm1pc3Npb24gb2YgaXRzIGNvcHlyaWdodCBvd25lci4KKworCistLSAKK0VORCBPRiBBQ0FERU1JQyBGUkVFIExJQ0VOU0UuIFRoZSBmb2xsb3dpbmcgaXMgaW50ZW5kZWQgdG8gZGVzY3JpYmUgdGhlIGVzc2VudGlhbCAKK2RpZmZlcmVuY2VzIGJldHdlZW4gdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSAoQUZMKSB2ZXJzaW9uIDEuMCBhbmQgb3RoZXIgCitvcGVuIHNvdXJjZSBsaWNlbnNlczoKKworVGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSBpcyBzaW1pbGFyIHRvIHRoZSBCU0QsIE1JVCwgVW9JL05DU0EgYW5kIEFwYWNoZSAKK2xpY2Vuc2VzIGluIG1hbnkgcmVzcGVjdHMgYnV0IGl0IGlzIGludGVuZGVkIHRvIHNvbHZlIGEgZmV3IHByb2JsZW1zIHdpdGggCit0aG9zZSBsaWNlbnNlcy4KKyAgICAKKyogVGhlIEFGTCBpcyB3cml0dGVuIHNvIGFzIHRvIG1ha2UgaXQgY2xlYXIgd2hhdCBzb2Z0d2FyZSBpcyBiZWluZyAKK2xpY2Vuc2VkIChieSB0aGUgaW5jbHVzaW9uIG9mIGEgc3RhdGVtZW50IGZvbGxvd2luZyB0aGUgY29weXJpZ2h0IG5vdGljZSAKK2luIHRoZSBzb2Z0d2FyZSkuIFRoaXMgd2F5LCB0aGUgbGljZW5zZSBmdW5jdGlvbnMgYmV0dGVyIHRoYW4gYSB0ZW1wbGF0ZSAKK2xpY2Vuc2UuIFRoZSBCU0QsIE1JVCBhbmQgVW9JL05DU0EgbGljZW5zZXMgYXBwbHkgdG8gdW5pZGVudGlmaWVkIHNvZnR3YXJlLgorICAgIAorKiBUaGUgQUZMIGNvbnRhaW5zIGEgY29tcGxldGUgY29weXJpZ2h0IGdyYW50IHRvIHRoZSBzb2Z0d2FyZS4gVGhlIEJTRCAKK2FuZCBBcGFjaGUgbGljZW5zZXMgYXJlIHZhZ3VlIGFuZCBpbmNvbXBsZXRlIGluIHRoYXQgcmVzcGVjdC4KKyAgICAKKyogVGhlIEFGTCBjb250YWlucyBhIGNvbXBsZXRlIHBhdGVudCBncmFudCB0byB0aGUgc29mdHdhcmUuIFRoZSBCU0QsIE1JVCwgCitVb0kvTkNTQSBhbmQgQXBhY2hlIGxpY2Vuc2VzIHJlbHkgb24gYW4gaW1wbGllZCBwYXRlbnQgbGljZW5zZSBhbmQgY29udGFpbiAKK25vIGV4cGxpY2l0IHBhdGVudCBncmFudC4KKyAgICAKKyogVGhlIEFGTCBtYWtlcyBpdCBjbGVhciB0aGF0IG5vIHRyYWRlbWFyayByaWdodHMgYXJlIGdyYW50ZWQgdG8gdGhlIAorbGljZW5zb3IncyB0cmFkZW1hcmtzLiBUaGUgQXBhY2hlIGxpY2Vuc2UgY29udGFpbnMgc3VjaCBhIHByb3Zpc2lvbiwgYnV0IHRoZSAKK0JTRCwgTUlUIGFuZCBVb0kvTkNTQSBsaWNlbnNlcyBkbyBub3QuCisgICAgCisqIFRoZSBBRkwgaW5jbHVkZXMgdGhlIHdhcnJhbnR5IGJ5IHRoZSBsaWNlbnNvciB0aGF0IGl0IGVpdGhlciBvd25zIHRoZSAKK2NvcHlyaWdodCBvciB0aGF0IGl0IGlzIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUgdW5kZXIgYSBsaWNlbnNlLiBOb25lIG9mIAordGhlIG90aGVyIGxpY2Vuc2VzIGNvbnRhaW4gdGhhdCB3YXJyYW50eS4gQWxsIG90aGVyIHdhcnJhbnRpZXMgYXJlIGRpc2NsYWltZWQsIAorYXMgaXMgdGhlIGNhc2UgZm9yIHRoZSBvdGhlciBsaWNlbnNlcy4KKworKiBUaGUgQUZMIGlzIGl0c2VsZiBjb3B5cmlnaHRlZCAod2l0aCB0aGUgcmlnaHQgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIAord2l0aG91dCBtb2RpZmljYXRpb24pLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgb3duZXIgb2YgdGhlIGNvcHlyaWdodCB0byB0aGUgCitsaWNlbnNlIHdpbGwgY29udHJvbCBjaGFuZ2VzLiBUaGUgQXBhY2hlIGxpY2Vuc2UgY29udGFpbnMgYSBjb3B5cmlnaHQgbm90aWNlLCAKK2J1dCB0aGUgQlNELCBNSVQgYW5kIFVvSS9OQ1NBIGxpY2Vuc2VzIGRvIG5vdC4gCistLQorU1RBUlQgT0YgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKy0tCisKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisJCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQorCisgQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKKwkJCSAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCitzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcworR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KK3VzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKK3RoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAoraWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCithbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCitUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQorZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKK2dyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoreW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKK3NvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKK3JpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCisoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAorZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KKworICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgordGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKK3NvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KK3RoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCithdXRob3JzJyByZXB1dGF0aW9ucy4KKworICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQorcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQorcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQorcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55CitwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LgorDAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKK2Egbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCit1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCityZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKK21lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Cit0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAorZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKK2xhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KK3RoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCitBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQoraXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCitXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KKworICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKK3NvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQorY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQorY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQorbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OworYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCit5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KKyAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKKyAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAorICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKKyAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCisgICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgorICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQorICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQorICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKKyAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcworICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0CisgICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgorICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQorDAorVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQord2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKK3VuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgorU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQorICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucworICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKKyAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgorICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKKyAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KKyAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgorICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCisgICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKKyAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCisgICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCisKK1RoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCitjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQorYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCitjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCitzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKK2FueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Citmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQorb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKK2l0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KKworSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZworYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAorYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCitkaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisMCisgIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAorb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCit2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCitIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgordGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKK3BhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCit0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KK3RoaXMgTGljZW5zZS4KKworICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCithbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCithcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgorY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisMCisgIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKK21heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwordGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZworY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCit0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucworb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCitiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQorbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKK3RoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24uCisKKyAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgordG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKK21ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCitvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCitvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCitGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KK09USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKK1BST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECitPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUworVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQorUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCitSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCitSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAorSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCitPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECitUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKK1lPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCitQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorCSAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0CitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KKworICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAordG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKK3RoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2RidXMvQ2hhbmdlTG9nIGIvZGJ1cy9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJjMzNkNAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsNSBAQAorMjAwOC0wNC0xNiAgSm9obiAoSjUpIFBhbG1pZXJpIDxqb2hucEByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLW1vbml0b3IuYzogdGFrZSBvdXQgdGhlIHRyYWlsaW5nIGNvbW1hIGluIHRoZQorCSAgUHJvZmlsZUF0dHJpYnV0ZUZsYWdzIGVudW0gYXMgaXQgaXNuJ3QgaW4gb3VyIHN0eWxlIGd1aWRlcworCSAgYW5kIGNhdXNlcyBzb21lIGNvbXBpbGVycyB0byBlcnJvciBvdXQKZGlmZiAtLWdpdCBhL2RidXMvQ2hhbmdlTG9nLnByZS0xLTAgYi9kYnVzL0NoYW5nZUxvZy5wcmUtMS0wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYjU5ODIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL0NoYW5nZUxvZy5wcmUtMS0wCkBAIC0wLDAgKzEsMTUxNDYgQEAKKzIwMDYtMTEtMDkgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIFJlbGVhc2VkIDEuMC4wCisKKzIwMDYtMTEtMDkgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIEFVVEhPUlM6IGFkZGVkIFBldGVyIGFuZCBUb3Igb2Ygd2luZG93cyBwb3J0aW5nIGZhbWUKKworMjAwNi0xMS0wOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBhZGQgYSBub3RlIGFib3V0IHByb3RvY29sIHN0YWJpbGl0eQorCisJKiBkb2MvVE9ETzogUmVtb3ZlICJpbXBvcnRhbnQgZm9yIDEuMCIgc2VjdGlvbiwgcmVwbGFjZSB3aXRoCisJImltcG9ydGFudCBmb3IgMS4yIiBzZWN0aW9uCisJCisyMDA2LTExLTA4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBSRUFETUU6IHJlbW92ZSBzb21lIG9mIHRoZSBvdXQgb2YgZGF0ZSBmbGFncworCisJKiBkb2MvVE9ETzogUmVtb3ZlIHRvZG8gaXRlbXMgd2hpY2ggYXJlIGRvbmUKKworMjAwNi0xMS0wOCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy1tb25pdG9yLmM6IEhhbmRsZSBzaWdpbnQgc28gd2UgZmx1c2ggc3Rkb3V0CisJKFBhdGNoIGZyb20gT2xsaSBTYWxsaSA8b2xsaSBkb3Qgc2FsbGkgYXQgY29sbGFib3JhIGRvdCBjbyBkb3QgdWs+KQorCisyMDA2LTExLTA4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLW1vbml0b3IuMTogdXBkYXRlIHRoZSBtYW5wYWdlIGZvciBkYnVzLW1vbml0b3IKKwkoUGF0Y2ggZnJvbSBPbGxpIFNhbGxpIDxvbGxpIGRvdCBzYWxsaSBhdCBjb2xsYWJvcmEgZG90IGNvIGRvdCB1az4pCisKKzIwMDYtMTEtMDggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIEFVVEhPUlM6IFVwZGF0ZSB3aXRoIGFsbCBwZW9wbGUgbGlzdGVkIGluIHRoZSBDaGFuZ2VMb2cKKworMjAwNi0xMS0wOCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy1tb25pdG9yLmM6IGFkZCBwcm9maWxpbmcgdG9vbHMgdG8gZGJ1cy1tb25pdG9yCisJKFBhdGNoIGZyb20gT2xsaSBTYWxsaSA8b2xsaSBkb3Qgc2FsbGkgYXQgY29sbGFib3JhIGRvdCBjbyBkb3QgdWs+KQorCisyMDA2LTExLTA3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogSEFDS0lORzogVXBkYXRlIHJlbGVhc2UgaW5zdHJ1Y3Rpb25zIHRvIGluY2x1ZGUgc3R1ZmYgYWJvdXQKKwlzdGFibGUgcmVsZWFzZXMsIGJyYW5jaGluZywgZXRjLiBNYXkgbm90IGJlIHRvdGFsbHkgY29ycmVjdCwKKwlwbGVhc2UgZml4IGlmIG5lZWRlZCwgYnV0IGtlZXAgaW5zdHJ1Y3Rpb25zIHVwLXRvLWRhdGUgc28gd2UgZG8KKwllYWNoIHN0YWJsZSByZWxlYXNlIGNvbnNpc3RlbnRseSBpbiB0aGUgZnV0dXJlLgorCisyMDA2LTExLTA3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWwsIGRvYy9kYnVzLWZhcS54bWwsIFJFQURNRTogdmFyaW91cworCWRvY3VtZW50YXRpb24gdXBkYXRlcy4gQnVtcCBmYXEvc3BlYyB2ZXJzaW9ucyAobm90IHRvIDEuMDsgSSBkb24ndAorCXRoaW5rIHRoZSBzcGVjIHdpbGwgYmUgImZpbmlzaGVkIi8xLjAgd2hlbiB3ZSBzaGlwIHRoZSAxLjAgbGlicmFyeSkuCisKKzIwMDYtMTEtMDYgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9idXMuYzogTWlzc2VkIHBhdGNoIC0gcGFzcyBpbiB0aGUgY29udGV4dCB0byB0aGUgZGlyZWN0b3J5IHdhdGNoCisKKzIwMDYtMTEtMDIgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIFJlbGVhc2VkIEQtQnVzIDEuMCBSQyAzKDAuOTUpCisKKzIwMDYtMTEtMDIgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9hY3RpdmF0aW9uLmMgKGJ1c19hY3RpdmF0aW9uX25ldyk6IGRvbid0IGZhaWwgaWYgd2UgY2FuIG5vdCByZWFkCisJdGhlIGRpcmVjdG9yeSBhcyBpdCBtYXkgbm90IGV4aXN0CisKKzIwMDYtMTEtMDIgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKHNlcnZpY2VfZGlyc19maW5kX2Rpcik6IHVzZSAKKwlfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgc28gd2UgZG9uJ3QgZ2V0IHN0dWNrIGluIGFuIGluZmluaXRlIGxvb3AKKwkoc3RhcnRfYnVzY29uZmlnX2NoaWxkKTogbW92ZSBwcm9jZXNzaW5nIG9mIHN0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMKKwl0YWdzIGhlcmUgYmVjYXVzZSB0aGV5IGhhdmUgbm8gY29udGVudAorCShidXNfY29uZmlnX3BhcnNlcl9jb250ZW50KTogY2hlY2sgd2UgZG9uJ3QgaGF2ZSBjb250ZW50IGluIAorCXN0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMgdGFnCisKKzIwMDYtMTEtMDIgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL01ha2VmaWxlLmFtOiBNYWtlIHN1cmUgdGhlIC92YXIvbGliL2RidXMgZGlyZWN0b3J5IGlzIGNyZWF0ZWQKKwlQYWNrYWdlcnMgbmVlZCB0byBvd24gdGhpcyBkaXJlY3RvcnkKKworMjAwNi0xMS0wMiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvcnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLnNoOiBmaXhlZCBzY3JpcHQgdG8gcmVwbGFjZSB0aGUgCisJPHN0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnM+IHRhZyB3aXRoIGEgPHNldmljZWRpcj4gdGFnIHRoYXQKKwlwb2ludHMgdG8gdGhlIHRlc3Qgc2VydmljZSBkaXJlY3RvcnkKKworMjAwNi0xMS0wMiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBBZGQgYSBjaGVjayBmb3IgRElSICpkaXJwLT5kZF9mZAorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11dGlsLXVuaXg6IGlmIEhBVkVfRERGRCBpcyBkZWZpbmVkIHVzZSAKKwlESVIgKmRpcnAtPmRkX2ZkIGVsc2UgdXNlIERJUiAqZGlycC0+X19kZF9mZC4gIFRoaXMgdGFrZXMgY2FyZQorCW9mIGJvdGggU29sYXJpcyBhbmQgSXJpeAorCisyMDA2LTExLTAxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL2RidXMtZGFlbW9uLjEuaW46IGRvY3VtZW50IHN0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMKKworMjAwNi0xMS0wMSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBleHBvc2UgREJVU19EQVRBRElSCisJCisJKiBidXMvY29uZmlnLXBhcnNlci5jOiBhZGQgdGhlIHN0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMgZWxlbWVudAorCXRvIHRoZSBwYXJzZXIKKwkoYnVzX2NvbmZpZ19wYXJzZXJfY29udGVudCk6IHByb2Nlc3MgdGhlIHN0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMKKwllbGVtZW50IGJ5IGdldHRpbmcgdGhlIHN0YW5kYXJkIGRpcmVjdG9yaWVzIGZyb20gc3lzZGVwcyBhbmQgbWVyZ2luZworCXRoZW0gaW50byB0aGUgc2VydmljZSBkaXJlY3RvcnkgbGlzdAorCSh0ZXN0X2RlZmF1bHRfc2Vzc2lvbl9zZXJ2aWNlZGlycyk6IG1ha2Ugc3VyZSB3ZSBnZXQgd2hhdCB3ZSBleHBlY3QKKworCSogYnVzL3Nlc3Npb24uY29uZi5pbjogcmVwbGFjZSB0aGUgc2VydmljZWRpciB0YWcgd2l0aCB0aGUgCisJc3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycyB0YWcKKworCSogZGJ1cy9kYnVzLWxpc3QuaDogcmVtb3ZlIHRoZSB0eXBlZGVmIG9mIERCdXNMaXN0IGFuZCBwbGFjZSBpdCBpbgorCWRidXMtc3lzZGVwcy5oIHRvIGF2b2lkIGNpcmN1bGFyIGhlYWRlciBkZXBlbmRlbmNpZXMKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuaDogYWRkIHRoZSB0eXBlZGVmIG9mIERCdXNMaXN0CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYyAoc3BsaXRfcGF0aHNfYW5kX2FwcGVuZCk6IHV0aWxpdHkgZnVuY3Rpb24KKwl3aGljaCB0YWtlcyBhIHN0cmluZyBvZiBkaXJlY3RvcmllcyBkZWxpbWl0ZWQgYnkgY29sb25zLCBwYXJzZXMgdGhlbSAKKwlvdXQsIGFwcGVuZHMgYSBzdWZmaXggYW5kIHB1dHMgdGhlbSBpbiBhIGxpc3QgaWdub3JpbmcgZW1wdHkgZWxlbWVudHMKKwkoX2RidXNfZ2V0X3N0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMpOiByZXR1cm5zIHRoZSBzdGFuZGFyZCAKKwlkaXJlY3RvcmllcyBmb3IgYSBzZXNzaW9uIGJ1cyB0byBsb29rIGZvciBzZXJ2aWNlIGFjdGl2YXRpb24gZmlsZXMKKwlvbiBVbml4IHdoaWNoIGluY2x1ZGVzIHRoZSBYREdfREFUQV9IT01FLCBYREdfREFUQV9ESVJTIGFuZCAKKwlEQlVTX0RBVEFESVIgZGlyZWN0b3JpZXMKKworCSogdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9tYW55LXJ1bGVzLmNvbmY6IGFkZCB0aGUgCisJc3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycyB0YWcgdG8gdGhlIHZhbGlkIGNvbmZpZyBmaWxlIHRlc3RzCisKKzIwMDYtMTAtMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLWxhdW5jaC4xLCBkb2MvVE9ETzogY2FwdHVyZSBpbnRlbnQgdG8gY2hhbmdlIHRoZQorCWNvbW1hbmQgbGluZSBvcHRpb25zIG9mIGRidXMtbGF1bmNoIGEgYml0IHBvc3QgMS4wCisKKzIwMDYtMTAtMjcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCQorCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSk6IGRvY3VtZW50CisJaG93IHRvIGNob29zZSBzaGFyZWQgdnMuIHByaXZhdGUgY29ubmVjdGlvbnMKKworMjAwNi0xMC0yNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy10ZXN0LmM6IGVuY2xvc2UgbW9yZSBvZiB0aGUgZmlsZSBpbiB0aGUKKwlEQlVTX0JVSUxEX1RFU1RTIGNoZWNrLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy1wdGhyZWFkLmMgKFBUSFJFQURfQ0hFQ0spOiBmaXggZm9yCisJREJVU19ESVNBQkxFX0FTU0VSVCBjYXNlLgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfdXNlcik6IGRvY3VtZW50CisJdGhhdCBpdCBvbmx5IHdvcmtzIG9uIHRoZSBzZXJ2ZXIgc2lkZQorCisJKiBkYnVzL2RidXMtYnVzLmM6IGFkZCBhIGdsb2JhbCBsb2NrIGNvdmVyaW5nIHRoZSBCdXNEYXRhIHdlCisJYXR0YWNoIHRvIGVhY2ggY29ubmVjdGlvbgorCShpbnRlcm5hbF9idXNfZ2V0KTogbG9jayBvdXIgYWNjZXNzIHRvIHRoZSBCdXNEYXRhCisJKGRidXNfYnVzX3JlZ2lzdGVyKTogbG9jayB0aGUgZW50aXJlIHJlZ2lzdHJhdGlvbiBwcm9jZXNzCisJd2l0aCBfREJVU19MT0NLKGJ1c19kYXRhcykuIElmIHdlIGdldCB0aGUgbG9jayBhbmQgCisJcmVnaXN0cmF0aW9uIGlzIGFscmVhZHkgY29tcGxldGUsIHNpbGVudGx5IHJldHVybiAodnMuIHByZXZpb3VzCisJYmVoYXZpb3Igb2YgYWJvcnRpbmcpLgorCShkYnVzX2J1c19zZXRfdW5pcXVlX25hbWUpOiBsb2NrIHRoZSBCdXNEYXRhCisJKGRidXNfYnVzX2dldF91bmlxdWVfbmFtZSk6IGxvY2sgdGhlIEJ1c0RhdGEKKworMjAwNi0xMC0yNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYyAoc2VydmljZV9kaXJzX2ZpbmRfZGlyLCAKKwlzZXJ2aWNlX2RpcnNfYXBwZW5kX3VuaXF1ZV9vcl9mcmVlLCAKKwlzZXJ2aWNlX2RpcnNfYXBwZW5kX2xpbmtfdW5pcXVlX29yX2ZyZWUpOiBOZXcgc3RhdGljIG1ldGhvZHMKKwlmb3Igb25seSBhcHBlbmRpbmcgdW5pcXVlIHNlcnZpY2UgZGlyZWN0b3J5IG5hbWVzIGludG8KKwl0aGUgc2VydmljZSBkaXJlY3RvcnkgbGlzdAorCShtZXJnZV9pbmNsdWRlZCwgYnVzX2NvbmZpZ19wYXJzZXJfY29udGVudCk6IE9ubHkgYWRkIHVuaXF1ZQorCXNlcnZpY2UgZGlyZWN0b3J5IG5hbWVzIGludG8gdGhlIGxpc3QKKworMjAwNi0xMC0yNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXB0aHJlYWQuYzogbWFrZSB0aGUgImNvdW50IiBhbmQgImhvbGRlciIKKwl2YXJpYWJsZXMgdm9sYXRpbGUsIHN1Z2dlc3RlZCBieSBUaGlhZ28uIERvY3VtZW50IHN0cnVjdCBmaWVsZHMuCisJKFBUSFJFQURfQ0hFQ0spOiByZW1vdmUgcHRocmVhZCBlcnJvciBjaGVja2luZyBpZiBhc3NlcnRpb25zIGFyZQorCWRpc2FibGVkLCBzaG91bGQgcmVkdWNlIHRoZSBuby1hc3NlcnRpb25zIGNhc2UgdG8gdGhlIGJhcmUKKwltaW5pbXVtIGNvZGUuCisKKzIwMDYtMTAtMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCQorCSogZGJ1cy9kYnVzLXN5c2RlcHMtcHRocmVhZC5jIChfZGJ1c19wdGhyZWFkX211dGV4X2xvY2spOiBjaGFuZ2UKKwl0byBiZSByZWN1cnNpdmUKKwkoX2RidXNfcHRocmVhZF9tdXRleF91bmxvY2spOiBtYWtlIGl0IHJlY3Vyc2l2ZQorCShfZGJ1c19wdGhyZWFkX2NvbmR2YXJfd2FpdCk6IHNhdmUvcmVzdG9yZSB0aGUgcmVjdXJzaW9uIGNvdW50CisJKF9kYnVzX3B0aHJlYWRfY29uZHZhcl93YWl0X3RpbWVvdXQpOiBzYXZlL3Jlc3RvcmUgdGhlIHJlY3Vyc2lvbiBjb3VudAorCisyMDA2LTEwLTI2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IGNsYXJpZnkgdGhlIFVVSUQgdGV4dCBzbGlnaHRseQorCisJKiBkYnVzL2RidXMtc3lzZGVwcy1wdGhyZWFkLmM6IGNoZWNrIGZvciBhbmQgbW9zdGx5IGFib3J0IG9uCisJcHRocmVhZCBlcnJvcnMuIEFkZCBEQnVzTXV0ZXhQVGhyZWFkIGFuZCBEQnVzQ29uZFZhclBUaHJlYWQgCisJaW4gcHJlcGFyYXRpb24gZm9yIGJlaW5nIGFibGUgdG8gZXh0ZW5kIHRoZW0gZm9yIGUuZy4gcmVjdXJzaXZlCisJbXV0ZXhlcy4KKworMjAwNi0xMC0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKyAgICAgICAgKiBkYnVzL2RidXMtdGhyZWFkcy5baGNdOiBEb2N1bWVudGF0aW9uIGltcHJvdmVtZW50cy4gQ2xhcmlmeSBob3cgCisJY29uZGl0aW9uIHZhcmlhYmxlcyByZWxhdGUgdG8gcmVjdXJzaXZlIG11dGV4ZXMuCisJCisgICAgICAgICogZGJ1cy9kYnVzLXN5c2RlcHMtcHRocmVhZC5jLCBkYnVzL2RidXMtc3lzZGVwcy13aW4tdGhyZWFkLmMsIAorCWRidXMvZGJ1cy10aHJlYWRzLmM6IFNwbGl0IHRoZSBwbGF0Zm9ybXMtc3BlY2lmaWMgdGhyZWFkIAorCWltcGxlbWVudGF0aW9ucyBpbnRvIHRoZWlyIG93biBmaWxlcy4KKwkKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXB0aHJlYWQuYworCShfZGJ1c19wdGhyZWFkX2NvbmR2YXJfd2FpdF90aW1lb3V0KTogaW52ZXJ0IHRoZSByZXR1cm4gdmFsdWUsIGl0CisJd2FzIGJhY2t3YXJkLiBOb3QgdGhhdCBhbnl0aGluZyB1c2VzIGl0LgorCisyMDA2LTEwLTI2ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzLXN5c2RlcHMtdW5peC5jIChfZGJ1c19zZXRfbG9jYWxfY3JlZHMpOiBDbGVhbiB1cCB0aGUKKwlMT0NBTF9DUkVEUyB2cyBDTVNHQ1JFRCBzdHVmZiBhIGJpdC4gIFByZWZlciBDTVNHQ1JFRC4gIFRoaXMKKwluZWVkcyB0byBiZSBjbGVhbmVkIHVwIG1vcmUuCisKKwkqIGRvYy9UT0RPOiBBZGQgYSB0b2RvIHRoYXQgKkJTRCBoYWNrZXJzIHNob3VsZCBsb29rIGF0IGNsZWFuaW5nCisJdXAgdGhlIENSRURTIGlzc3VlLgorCisyMDA2LTEwLTI2ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW4sIGRidXMtMS5wYy5pbjogQ2hlY2sgdG8gc2VlIGlmIHRocmVhZCBtZXRob2RzIAorCWFyZSBpbiBnbGliYyBvciBsaWJwdGhyZWFkIGFuZCBhZGQgLWxwdGhyZWFkIHRvIHRoZSBsaW5rIHN0YWdlIAorCWlmIGl0IGlzIHRoZSBsYXR0ZXIKKworMjAwNi0xMC0yNiAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvQGtkZS5vcmc+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKF9kYnVzX2Nvbm5lY3Rpb25fb3Blbl9pbnRlcm5hbCk6IEZpeAorICAgICAgICBidWcgODc4MDogdGhlIGNvbm5lY3Rpb24gbG9jayBpcyBvbmx5IHJlcXVpcmVkIHdoaWxlIHJlY29yZGluZworICAgICAgICB0aGUgc2hhcmVkIGNvbm5lY3Rpb24sIHNvIHByb3RlY3Qgb25seSB0aGF0IGNvZGUKKyAgICAgICAgc2VjdGlvbi4gRG9uJ3QgcmVxdWlyZSBjb25uZWN0aW9uX2xvb2t1cF9zaGFyZWQgdG8gcmV0dXJuIGEKKyAgICAgICAgbG9ja2VkIGNvbm5lY3Rpb24uCisKKzIwMDYtMTAtMjYgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnb0BrZGUub3JnPgorCisJKiB0b29scy9kYnVzLWxhdW5jaC14MTEuYyAoZ2V0X3Nlc3Npb25fZmlsZSwgaW5pdF94X2F0b21zKToKKyAgICAgICAgY2hlY2sgaWYgZ2V0X21hY2hpbmVfdXVpZCgpIHJldHVybnMgTlVMTCBiZWZvcmUgcHJvY2VlZGluZyBhbnkKKyAgICAgICAgZnVydGhlcjogd2UgY2FuJ3QgaW5pdCB0aGUgWCBhdG9tcyBvciBjcmVhdGUgYSBzZXNzaW9uIGZpbGUKKyAgICAgICAgbmFtZSBpZiB0aGVyZSBpcyBubyBtYWNoaW5lIElELgorCVRoaXMgc29sdmVzIGEgY3Jhc2ggcmVwb3J0ZWQgYnkgc29tZSB1c2VycyBpZgorICAgICAgICAtLWV4aXQtd2l0aC1zZXNzaW9uIHdhcyB1c2VkIHdpdGhvdXQgLS1hdXRvbGF1bmNoPTxtYWNoaW5lLWlkPgorCisyMDA2LTEwLTI2ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLWxhdW5jaC5jIChtYWluKTogcnVuIHRoZSBkYnVzLWRhZW1vbiBpbiB0aGUgYnVpbGRkaXIKKwlpZiB0ZXN0cyBhcmUgZW5hYmxlZCBhbmQgdGhlIERCVVNfVVNFX1RFU1RfQklOQVJZIGVudiB2YXJpYWJsZSBpcyBzZXQKKworCSogdG9vbHMvcnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLnNoOiBzZXQgREJVU19VU0VfVEVTVF9CSU5BUlkKKwliZWZvcmUgd2UgcnVuIGRidXMtbGF1bmNoCisKKwkqIGNvbmZpZ3VyZS5pbjogZGVmaW5lIFRFU1RfQlVTX0JJTkFSWSB0byBiZSB0aGUgZnVsbCBwYXRoIHRvIAorCWRidXMtZGFlbW9uIGluIHRoZSBidWlsZCByb290IAorCisyMDA2LTEwLTI1ICBTam9lcmQgU2ltb25zICA8c2pvZXJkQGx1b24ubmV0PgorCisJKiBkYnVzL01ha2VmaWxlLmFtOgorCSogdG9vbHMvTWFrZWZpbGUuYW06CisJKiB0b29zL2RidXMtdXVpZGdlbi4xOgorCQlNb3ZlIHRoZSBtYWNoaW5lLWlkIGZpbGUgdG8gL3Zhci9saWIvZGJ1cyAKKworMjAwNi0xMC0yNCAgRGF2aWQgWmV1dGhlbiAgPGRhdmlkekByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdGhyZWFkcy5jIChpbml0X3VuaW5pdGlhbGl6ZWRfbG9ja3MpOiBGaXggdHlwbyBzbyBpdCdzCisJX2RidXNfYXNzZXJ0ICh0aHJlYWRfaW5pdF9nZW5lcmF0aW9uICE9IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbikKKwlub3QgX2RidXNfYXNzZXJ0ICh0aHJlYWRfaW5pdF9nZW5lcmF0aW9uID09IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbikKKworMjAwNi0xMC0yNCAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvQGtkZS5vcmc+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmg6CisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmM6IEFkZCBmdW5jdGlvbgorCV9kYnVzX21ha2VfZmlsZV93b3JsZF9yZWFkYWJsZSB0aGF0IGNobW9kcyBhIGZpbGUgdG8gMDY0NC4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jIChfZGJ1c19nZXRfYXV0b2xhdW5jaF9hZGRyZXNzKToKKyAgICAgICAgQXZvaWQgd3JpdGluZyB0byB0aGUgc3RhdGljICJhcmd2IiBhcnJheSwgdGhlcmVieSBhdm9pZGluZyBhCisgICAgICAgIENPVyBvbiB0aGUgY2hpbGQgcHJvY2Vzcy4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c19jcmVhdGVfdXVpZF9maWxlX2V4Y2x1c2l2ZWx5KToKKyAgICAgICAgY2FsbCBfZGJ1c19tYWtlX2ZpbGVfd29ybGRfcmVhZGFibGUgb24gdGhlIGNyZWF0ZWQgZmlsZS4KKworMjAwNi0xMC0yMyAgRGF2aWQgWmV1dGhlbiAgPGRhdmlkekByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVtb3J5LmM6IFVzZSBhdG9taWMgdmFyaWFibGUgdG8gcHJvdGVjdAorCW5fYmxvY2tzX291dHN0YW5kaW5nIG90aGVyd2lzZSBPT00gd2lsbCBiZSByZXBvcnRlZCB1c2luZyBTTVAgb24KKwlzb21lIGFyY2hlcworCQorCSogYnVzL2Rpc3BhdGNoLmM6IEFkZCBtaXNzaW5nIGVuZCBvZiBsaW5lIGNoYXJhY3RlcnMKKworCSogYnVzL2Rlc2t0b3AtZmlsZS5jIChwYXJzZV9zZWN0aW9uX3N0YXJ0LCBwYXJzZV9rZXlfdmFsdWUpIAorCShidXNfZGVza3RvcF9maWxlX2xvYWQpOiBQcm9wZXJ0bHkgaGFuZGxlIE9PTQorCisJKiBkYnVzL2RidXMtdGhyZWFkcy5jIChpbml0X3VuaW5pdGlhbGl6ZWRfbG9ja3MpOiBDaGVjayB0aGF0CisJdGhyZWFkX2luaXRfZ2VuZXJhdGlvbiBlcXVhbHMgX2RidXNfY3VycmVudF9nZW5lcmF0aW9uLCBub3QgMAorCisyMDA2LTEwLTIyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaDogbW92ZSBwcm90b3R5cGUgb2YKKwlfZGJ1c19idXNfbm90aWZ5X3NoYXJlZF9jb25uZWN0aW9uX2Rpc2Nvbm5lY3RlZF91bmxvY2tlZCgpIGhlcmUgc28KKwlpdCBpc24ndCBpbiBhIHB1YmxpYyBoZWFkZXIgYW5kIGRvZXNuJ3QgZW5kIHVwIGluIHRoZSBEQnVzQnVzCisJZ3JvdXAgaW4gRG94eWdlbgorCisyMDA2LTEwLTIxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBkaXN0IGNsZWFudXAtbWFuLXBhZ2VzLnNoIHNvIGl0J3MgaW4KKwl0aGUgdGFyYmFsbCBpZiBwYWNrYWdlcnMgd2FudCB0byBydW4gaXQKKworCSogY2xlYW51cC1tYW4tcGFnZXMuc2g6IEFkZCBhIHNjcmlwdCB3aGljaCBtdW5nZXMgYWxsIHRoZSBpbnRlcm5hbAorCUFQSSBtYW4gcGFnZXMgb3V0IG9mIHRoZSBEb3h5Z2VuIG91dHB1dC4gVGhpcyByZWR1Y2VzIHRoZSBzaXplIG9mCisJdGhlIGluc3RhbGxlZCBtYW4gcGFnZXMgZnJvbSA3IHRvIDIgbWVncywgYW5kIGF2b2lkcworCW5hbWVzcGFjZS1wb2xsdXRpbmcgcGFnZXMuIFJpZ2h0IG5vdyAobGlrZSBEb3h5Z2VuKSB0aGlzIHNjcmlwdAorCWlzbid0IGluIHRoZSBidWlsZCwgaXQncyBzb21ldGhpbmcgcGFja2FnZXJzIGNhbiBkbyBtYW51YWxseS4KKworMjAwNi0xMC0yMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmg6IGRvbid0IGluY2x1ZGUgdGhlIHdhdGNoL3RpbWVvdXQKKwlmdW5jdGlvbnMgaW4gY29ubmVjdGlvbiBzZWN0aW9uCisKKzIwMDYtMTAtMjEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBEb2N1bWVudGF0aW9uISBXaGVlISBEb3h5Z2VuIG5vdyAxMDAlIHNpbGVudC4gSWYgeW91IG1ha2UgaXQKKwlhbmdyeSBhZ2FpbiwgeW91IHdpbGwgYmUgcHVuaXNoZWQuCisJCisyMDA2LTEwLTIxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogTW9yZSBkb2N1bWVudGF0aW9uIC0gYWxsIHB1YmxpYyBBUEkgbm93IGRvY3VtZW50ZWQgYWNjb3JkaW5nIHRvCisJRG94eWdlbgorCisyMDA2LTEwLTIxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogRG9jdW1lbnQgYSBidW5jaCBvZiB1bmRvY3VtZW50ZWQgc3R1ZmYKKwkKKzIwMDYtMTAtMjEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBDbGVhbiB1cCBEb3h5Z2VuIGdyb3VwIG1hcmtlcnMgZm9yIHB1YmxpYyBBUEkgc28gRG94eWdlbiBmaW5kcworCWV2ZXJ5dGhpbmcgKG5vdCBjb21wcmVoZW5zaXZlbHkgZml4ZWQgZm9yIHByaXZhdGUgQVBJKS4KKwlNZWFucyBhbGwgcmVtYWluaW5nIERveHlnZW4gd2FybmluZ3MgYXJlIGp1c3QgYWJvdXQgbWlzc2luZyBkb2NzCisJYW5kIHRodXMgcHJldHR5IHNpbXBsZSB0byByZXNvbHZlLgorCQorMjAwNi0xMC0yMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisJCisJKiBkYnVzL2RidXMtbWFjcm9zLmg6IGFkZCBEQlVTX0dOVUNfREVQUkVDQVRFRCBtYWNybworCisJKiBkYnVzL2RidXMtbWVzc2FnZS5oOiBtYXJrIGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcnJheV9sZW4oKSAKKwlhcyBEQlVTX0dOVUNfREVQUkVDQVRFRAorCisyMDA2LTEwLTIxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworICAgICAgICAqIE1vdmUgYWxsIHByaXZhdGUgQVBJIGludG8gdGhlIHByaXZhdGUgRG94eWdlbiBncm91cCBzZWN0aW9ucyBvZgorCXRoZSBmaWxlcywgc28gdGhleSBkb24ndCBzaG93IHVwIGluIHRoZSBwdWJsaWMgQVBJIGRvY3MKKwkKKzIwMDYtMTAtMjEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5oOiBwdXQgI2lmbmRlZiBEQlVTX0RJU0FCTEVfREVQUkVDQVRFRCBhcm91bmQgCisJZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FycmF5X2xlbigpLgorCisJKiB0aHJvdWdob3V0OiBkb2N1bWVudGF0aW9uIGltcHJvdmVtZW50cy4KKworMjAwNi0xMC0yMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9UT0RPOiByZW1vdmUgdGhlIGludDY0IHRoaW5nIGZyb20gMS4wIHNpbmNlIGl0IGRvZXNuJ3QKKwltYXR0ZXIsIGFuZCB0aGUgbWVzc2FnZS1sb2FkZXItYnJlYWtlciB0aGluZyBzaW5jZSBub2JvZHkgaXMgZ29pbmcKKwl0byBkbyBpdC4gIEFkZCBhbiBpdGVtIHRvIDEuMCBhYm91dCBzdXBwb3J0aW5nIHJlY3Vyc2l2ZSBsb2NrcworCWluIGRidXNfdGhyZWFkc19pbml0X2RlZmF1bHQoKSB0aG91Z2gsIHNpbmNlIGl0IHNob3VsZCBiZSBlYXN5LgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChfZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGVfZGlzcGF0Y2gpOgorCUZpeCB0aGlzIGluIHRoZSAhZGlzcGF0Y2ggY2FzZSB0byBhdm9pZCBidXN5LWxvb3BpbmcgYWZ0ZXIKKwlkaXNjb25uZWN0aW9uCisKKyAgICAgICAgKiBNb3JlIG1pc2MgZG9jcyBpbXByb3ZlbWVudHMKKworMjAwNi0xMC0xOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIG1vcmUgRG94eWdlbi1yZWxhdGVkIGZpeGVzIChsb3RzIG9mIG1vdmluZyB0aGluZ3MgZnJvbSB0aGUKKwlwdWJsaWMgdG8gaW50ZXJuYWwgc2VjdGlvbiBpbiBkYnVzLWNvbm5lY3Rpb24uYykKKworMjAwNi0xMC0xOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIEZpeCBhIHBpbGUgb2YgRG94eWdlbiB3YXJuaW5ncyBhbmQgbWlzc2luZyBkb2NzCisKKzIwMDYtMTAtMTkgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9kaXItd2F0Y2gtZGVmYXVsdC5jLCBidXMvZGlyLXdhdGNoLWRub3RpZnkuYywgCisJYnVzL2Rpci13YXRjaC1rcXVldWUuYyAoYnVzX3dhdGNoX2RpcmVjdG9yeSk6IFBhc3MgaW4gYSBCdXNDb250ZXh0IAorCWluc3RlYWQgb2YgYSB2b2lkICouICBrcXVldWUgdXNlcyB0aGlzIHRvIGdldCB0aGUgY29udGV4dCdzIGxvb3AKKwl3aGlsZSB0aGUgb3RoZXIgbW9kdWxlcyBpZ25vcmUgdGhlIHBhcmFtZXRlci4gIFRoaXMgYWxsb3dzIHVzIHRvCisJYXZvaWQgcGxhdGZvcm0gY29uZGl0aW9uYWxzCisKKwkqIGJ1cy9idXMuYyAocHJvY2Vzc19jb25maWdfcG9zdGluaXQpOiBQYXNzIGluIHRoZSBjb250ZXh0IHRvIHRoZSAKKwl3YXRjaAorCisyMDA2LTEwLTE5ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBidXMvbWVzc2FnZWJ1cy5pbiwgYnVzL3JjLm1lc3NhZ2VidXMuaW46IHJ1biBkYnVzLXV1aWRnZW4gLS1lbnN1cmUKKwl3aGVuIHN0YXJ0aW5nIHRoZSBzeXN0ZW0gYnVzCisKKzIwMDYtMTAtMTggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogTW9yZSBmaXh1cHMgZm9yIGNyb3NzIGNvbXBpbGUgKFBhdGNoIGZyb20gCisJTWFyY28gUHJhY3VjY2kgPGRldmVsb3BtZW50IGF0IHByYWN1Y2NpIGRvdCBjb20+KQorCisyMDA2LTEwLTE3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy1zZW5kLmMgKG1haW4pOiBkb24ndCBjbG9zZSBzaGFyZWQgY29ubmVjdGlvbiwgZml4CisJZnJvbSBUaW1vIEhvZW5pZworCisyMDA2LTEwLTE3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluIChDUFBGTEFHUyk6IGRvbid0IGRvIC1EREJVU19BUElfU1VCSkVDVF9UT19DSEFOR0UgaGVyZQorCisJKiBkYnVzL2RidXMuaDogZHJvcCB0aGUgREJVU19BUElfU1VCSkVDVF9UT19DSEFOR0UgcmVxdWlyZW1lbnQsCisJc2luY2UgcmVhbGlzdGljYWxseSBpdCBkb2Vzbid0IGxvb2sgbGlrZSB3ZSdsbCBiZSBjaGFuZ2luZyBpdAorCWFueW1vcmUuCisKKzIwMDYtMTAtMTcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmMgKF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkKTogbmV3IGZ1bmN0aW9uIHRvCisJYmUgdXNlZCBmb3IgcmV0dXJuX2lmX2ZhaWwgdHlwZSB3YXJuaW5nczsgcHJlZml4ZXMgdGhlIHBpZCwgYW5kCisJZmF0YWwgYnkgZGVmYXVsdC4KKworMjAwNi0xMC0xNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBSZWxlYXNlZCAxLjAgUkMgMigwLjk0KQorCUFkZCBjaGVjayBmb3IgLWZQSUMgYW5kIGVuYWJsZSBpdCBpZiBhdmFpbGFibGUKKworMjAwNi0xMC0xNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZG9jL1RPRE86IFJlbW92ZSB0aGUgY2hlY2sgVE9ETyBpdGVtCisKKzIwMDYtMTAtMTMgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMtdHJhbnNwb3J0LXNvY2tldC5jIChleGNoYW5nZV9jcmVkZW50aWFscyk6CisJUHJpbnQgb3V0IG1vcmUgZGV0YWlsZWQgZXJyb3JzIGlmIHJlYWRpbmcgb3Igc2VuZGluZworCWNyZWRlbnRpYWxzIGZhaWwgKFBhdGNoIGZyb20gSnVsaW8gTS4gTWVyaW5vIFZpZGFsIAorCTxqbW12IGF0IE5ldEJTRCBkb3Qgb3JnPikKKworMjAwNi0xMC0xMyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiB3aGVuIGNoZWNraW5nIGZvciBwb3NpeCBnZXRwd25hbV9yIGFzc3VtZSB0cnVlCisJZm9yIGNyb3NzIGNvbXBpbGVzCisKKzIwMDYtMTAtMTMgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIGdldGhvc3RieW5hbWUgZmlyc3QgYmVmb3JlIHdlIGNoZWNrIGZvciBpdAorCWluIGxpYm5zbC4gIE9uIGdudSBzeXN0ZW1zIGl0IGlzIGltcGxlbWVuZXRlZCAKKworMjAwNi0xMC0xMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMKKwkoZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2spOiBmaXggdG8gaGFuZGxlIGNsb3NlZAorCWNvbm5lY3Rpb25zLCBmcm9tIFRhbWJldCBJbmdvIGJ1ZyAjODYzMQorCisyMDA2LTEwLTExICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IHVzZSBBQ19UUllfQ09NUElMRSBmb3IgZGlyZmQgaW5zdGVhZCBvZiBBQ19UUllfUlVOCisKKzIwMDYtMTAtMTEgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvbmFtZS10ZXN0L01ha2VmaWxlLmFtOiBkb24ndCBsaW5rIGFnYWluc3QgYm90aCBsaWJkYnVzIGFuZAorCWxpYmRidXMtY29udmVuaWVuY2UKKworMjAwNi0xMC0xMSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBjaGVjayBmb3IgZGlyZmQgZXZlbiBpZiBpdCBpcyBhIG1hY3JvCisJKFBhdGNoIGZyb20gVGltb3RoeSBSZWRhZWxsaSA8ZHJpenp0IGF0IGd1ZmkgZG90IG9yZz4pCisKKzIwMDYtMTAtMDggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogZGVmaW5lIF9QT1NJWF9QVEhSRUFEX1NFTUFOVElDUyBvbiBzb2xhcmlzCisJYXZvaWQgdXNpbmcgZGlyZmQgb24gc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgZGlyZmQgCisJKFBhdGNoIGJ5IEJyaWFuIENhbWVyb24gPGJyaWFuIGRvdCBjYW1lcm9uIGF0IHN1biBkb3QgY29tPikgCisKKzIwMDYtMTAtMDIgIEpvaG4gKEo1KSBQYWxtaWVpciAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2Fib3J0KTogUmVtb3ZlIGZyb20gCisJI2lmbmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUUyBtYWNybyB0byBmaXggZGlzdGNoZWNrCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYyAoX2RidXNfcHJpbnRfYmFja3RyYWNlKTogUmVtb3ZlIGZyb20KKwkjaWYgIWRlZmluZWQgKERCVVNfRElTQUJMRV9BU1NFUlQpIHx8IGRlZmluZWQoREJVU19CVUlMRF9URVNUUykKKwltYWNybyBiZWNhdXNlIF9kYnVzX2Fib3J0IGNhbGxzIGl0CisKKwkqIHRvb2xzL01ha2VmaWxlLmFtOiBBZGQgZGJ1cy1sYXVuY2guaCB0byB0aGUgc291cmNlIGxpc3Qgc28gZGlzdGNoZWNrCisJd29ya3MKKworMjAwNi0xMC0wMiAgSm9obiAoSjUpIFBhbG1pZWlyICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC11bml4LmMgKGRpcmVudF9idWZfc2l6ZSk6IEFkZCBjaGVjayBmb3IKKwlNQVhOQU1FTEVOIGZvciBNYWMgT1NYLiAgKFBhdGNoIGZyb20gSm9uYXMgQiA8c2Fub2l4IGF0IGdtYWlsIGRvdCBjb20+KQorCisyMDA2LTEwLTAyICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ29Aa2RlLm9yZz4KKworCSogdG9vbHMvZGJ1cy1sYXVuY2guYyAobWFpbik6IG1ha2UgaXQgY29tcGxhaW4gYW5kIGFib3J0CisJZXhlY3V0aW9uIGluIGNhc2UgYW4gdW5rbm93biBvcHRpb24gaXMgZ2l2ZW4uIEFsc28sIHByb2Nlc3MKKwl0aGUgJy0tJyBhcmd1bWVudCBhcyB0aGUgZW5kIG9mIGFyZ3VtZW50cy4KKworMjAwNi0xMC0wMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLmMgKHByaW50X3ZhcmlhYmxlcyk6IGlmIG5vIHN5bnRheCBpcyBnaXZlbiwKKwlkb24ndCBwcmludCBzb21ldGhpbmcgdGhhdCdzIHNvcnQtb2YtaGFsZi1zaC1zeW50YXgsIGp1c3QgcHJpbnQKKwlhIHBsYWluIGtleS12YWx1ZSBwYWlycyB0aGluZy4KKworCSogdG9vbHMvZGJ1cy1sYXVuY2gteDExLmM6IHVzZSBtYWNoaW5lIElEIHJhdGhlciB0aGFuIGhvc3RuYW1lIGZvcgorCXRoZSBsb2NhbCBtYWNoaW5lIHJlcHJlc2VudGF0aW9uIChidXQgc3RpbGwgaGF2ZSB0aGUgaG9zdG5hbWUgaW4KKwl0aGUgZGlzcGxheSkuIFJlbW92ZSB0aGUgaG9zdG5hbWUgZnJvbSB0aGUgZGlzcGxheSBpZiBpdCBpcworCWxvY2FsaG9zdC4gQ2hhbmdlIHNlc3Npb24gZmlsZXMgdG8gYmUgbmFtZWQKKwl+Ly5kYnVzL3Nlc3Npb24tYnVzL21hY2hpbmUtZGlzcGxheS4gQ2hhbmdlIFggYXRvbXMgdG8gYmUKKwl1bmRlcnNjb3JlLXByZWZpeGVkIHNvIG5vYm9keSB3aGluZXMgYWJvdXQgSUNDQ00gY29tcGxpYW5jZS4KKwlPdGhlcndpc2UgbmFtZSB0aGVtIHRoZSBzYW1lIGFzIHRoZSBlbnYgdmFyaWFibGVzLgorCUNoYW5nZSBzZXNzaW9uIGZpbGUgZm9ybWF0IHRvIGluY2x1ZGUga2V5LXZhbHVlIHBhaXJzIGFuZCBhbgorCWV4cGxhbmF0b3J5IGNvbW1lbnQuIEtleXMgYXJlIHRoZSBzYW1lIGFzIHRoZSBlbnYgdmFyaWFibGVzLgorCShzZXRfYWRkcmVzc19pbl94MTEpOiBYIHByb3BlcnR5IGZvcm1hdCBjYW4ndCBkZXBlbmQgb24KKwlzaXplb2YocGlkX3QpIG9uIGEgcGFydGljdWxhciBtYWNoaW5lLCBmaXggdG8gYWx3YXlzIGJlIDMyIGJpdHMKKworCSogdG9vbHMvZGJ1cy1sYXVuY2guYzogbWFrZSAtLWF1dG9sYXVuY2ggdGFrZSBhIG1hY2hpbmUgaWQKKwlhcmd1bWVudC4gSWYgLS1hdXRvbGF1bmNoIGlzIHVzZWQgd2l0aCBhIHByb2dyYW0gdG8gcnVuLCBjb21wbGFpbgorCWZvciBub3cgKGJ1dCBhZGQgYSBGSVhNRSkuIEFsc28sIGRvbid0IGxvb2sgZm9yIGV4aXN0aW5nIGJ1cyBpZiAKKwl0aGVyZSdzIGEgcHJvZ3JhbSB0byBydW4gKGJ1dCBhZGQgYSBGSVhNRSkuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYyAoX2RidXNfZ2V0X2F1dG9sYXVuY2hfYWRkcmVzcyk6IHBhc3MKKwltYWNoaW5lIHV1aWQgdG8gZGJ1cy1sYXVuY2ggKGF2b2lkcyBsaW5raW5nIGRidXMtbGF1bmNoIHRvIGxpYmRidXMKKwlqdXN0IHRvIGdldCB0aGlzLCBhbmQgYXZvaWRzIGR1cGxpY2F0aW5nIHV1aWQtcmVhZGluZyBjb2RlKS4KKworCSogdG9vbHMvZGJ1cy1sYXVuY2guMTogY2xhcmlmeSB2YXJpb3VzIHRoaW5ncworCQorMjAwNi0xMC0wMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvdGVzdC1zZXJ2aWNlLmMgKHBhdGhfbWVzc2FnZV9mdW5jKTogcmVtb3ZlIGJyb2tlbiBleHRyYQorCXVucmVmIHRoYXQgd2FzIGhpZGRlbiBieSB0aGUgYnVncyBpbiBkYnVzLWNvbm5lY3Rpb24uYy9kYnVzLWJ1cy5jCisKKwkqIHRlc3QvdGVzdC1zaGVsbC1zZXJ2aWNlLmMgKHBhdGhfbWVzc2FnZV9mdW5jKTogc2FtZSBmaXgKKwkKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMKKwkoX2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzX3VubG9ja2VkKTogYnJlYWsgdXAgdGhlCisJZnVuY3Rpb24gYSBsaXR0bGUgZm9yIGNsYXJpdHkgYW5kIGZpeCB0aGUgbm90aWZpY2F0aW9uIG9mCisJZGJ1cy1idXMuYyB0byBub3QgcmVxdWlyZSBkaXNwYXRjaCB0byBiZSBjb21wbGV0ZQorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fdW5yZWYpOiBpbXByb3ZlIHRoZQorCXdhcm5pbmcgd2hlbiB5b3UgdHJ5IHRvIGZpbmFsaXplIGFuIG9wZW4gY29ubmVjdGlvbi4KKwkKKzIwMDYtMTAtMDEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtYnVzLmMKKwkoaW50ZXJuYWxfYnVzX2dldCk6IG9ubHkgd2VhayByZWYgdGhlIGNvbm5lY3Rpb247IHRoaXMgbWVhbnMgCisJX2RidXNfYnVzX25vdGlmeV9zaGFyZWRfY29ubmVjdGlvbl9kaXNjb25uZWN0ZWRfdW5sb2NrZWQgY2FuIGJlCisJY2FsbGVkIHNhZmVseSBpbiBhbnkgY29udGV4dAorCShfZGJ1c19idXNfbm90aWZ5X3NoYXJlZF9jb25uZWN0aW9uX2Rpc2Nvbm5lY3RlZF91bmxvY2tlZCk6IGRvbid0CisJdW5yZWYKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYworCShfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQpOiBtb3ZlCisJX2RidXNfYnVzX25vdGlmeV9zaGFyZWRfY29ubmVjdGlvbl9kaXNjb25uZWN0ZWRfdW5sb2NrZWQgaGVyZQorCXdoZW4gcXVldWluZyBEaXNjb25uZWN0ZWQgaW5zdGVhZCBvZiB3aGVuIHRoZSBEaXNjb25uZWN0ZWQgbWVzc2FnZQorCWFycml2ZXMsIHNvIGRidXNfYnVzX2dldCgpIHdvbid0IHJldHVybiBjbG9zZWQgY29ubmVjdGlvbnMuCisJCisyMDA2LTEwLTAxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoX2RidXNfY29ubmVjdGlvbl9jbG9zZV9pZl9vbmx5X29uZV9yZWYpOiAKKwlBZGQgYSBoYWNrIHRvIG1ha2UgREJ1c05ld0Nvbm5lY3Rpb25GdW5jdGlvbiB3b3JrIHJpZ2h0LgorCisJKiBkYnVzL2RidXMtc2VydmVyLXNvY2tldC5jIChoYW5kbGVfbmV3X2NsaWVudF9mZF9hbmRfdW5sb2NrKTogdXNlCisJdGhlIGhhY2sgaGVyZS4gQWxzbywgZml4IHRoZSB0b2RvIGFib3V0IHJlZmNvdW50IGxlYWsuCisJCisJKiBkYnVzL2RidXMtc2VydmVyLWRlYnVnLXBpcGUuYyAoX2RidXNfdHJhbnNwb3J0X2RlYnVnX3BpcGVfbmV3KToKKwlhbmQgdXNlIHRoZSBoYWNrIGhlcmUKKwkKKyAgICAgICAgKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiBLaWxsIHRoZSAic2hhcmVkIiBmbGFnIHZzLiB0aGUKKwkic2hhcmVhYmxlIiBmbGFnOyB0aGlzIHdhcyBjb21wbGV0ZWx5IGJyb2tlbiwgc2luY2UgaXQgbWVhbnQgCisJZGJ1c19jb25uZWN0aW9uX29wZW4oKSByZXR1cm5lZCBhIGNvbm5lY3Rpb24gb2YgdW5rbm93bgorCXNoYXJlZC1uZXNzLiBOb3csIHdlIGFsd2F5cyBob2xkIGEgcmVmIG9uIGFueXRoaW5nIG9wZW5lZCAKKwlhcyBzaGFyZWFibGUuCisKKwlNb3ZlIHRoZSBjYWxsIHRvIG5vdGlmeSBkYnVzLWJ1cy5jIGludG8KKwljb25uZWN0aW9uX2ZvcmdldF9zaGFyZWRfdW5sb2NrZWQsIHNvIGxpYmRidXMgY29uc2lzdGVudGx5IGZvcmdldHMKKwlhbGwgaXRzIGtub3dsZWRnZSBvZiBhIGNvbm5lY3Rpb24gYXQgb25jZS4gVGhpcyBleHBvc2VkIG51bWVyb3VzCisJcGxhY2VzIHdoZXJlIHRoaW5ncyB3ZXJlIHRvdGFsbHkgYnJva2VuIGlmIHdlIGRyb3BwZWQgYSByZWYgaW5zaWRlCisJZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCB3aGVyZQorCWNvbm5lY3Rpb25fZm9yZ2V0X3NoYXJlZF91bmxvY2tlZCB3YXMgcHJldmlvdXNseSwgc28gbW92ZQorCWNvbm5lY3Rpb25fZm9yZ2V0X3NoYXJlZF91bmxvY2tlZCBpbnRvCisJX2RidXNfY29ubmVjdGlvbl91cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2suIEFsc28gbW92ZSB0aGUKKwlleGl0X29uX2Rpc2Nvbm5lY3QgaGVyZS4KKworCShzaGFyZWRfY29ubmVjdGlvbnNfc2h1dGRvd24pOiB0aGlzIGFzc3VtZWQgd2VhayByZWZzIHRvIHRoZQorCXNoYXJlZCBjb25uZWN0aW9uczsgc2luY2Ugd2UgaGF2ZSBzdHJvbmcgcmVmcyBub3csIHRoZSBhc3NlcnRpb24gCisJd2FzIGZhaWxpbmcgYW5kIHN0dWZmIHdhcyBsZWZ0IGluIHRoZSBoYXNoLiBGaXggaXQgdG8gY2xvc2UKKwlzdGlsbC1vcGVuIHNoYXJlZCBjb25uZWN0aW9ucy4KKwkKKwkqIGJ1cy9kaXNwYXRjaC5jOiBmaXh1cCB0byB1c2UgZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSBvbiB0aGUgCisJZGVidWcgcGlwZSBjb25uZWN0aW9ucworCQorCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKTogb25seSBub3RpZnkKKwlkYnVzLWJ1cy5jIGlmIHRoZSBjbG9zZWQgY29ubmVjdGlvbiBpcyBpbiBmYWN0IHNoYXJlZAorCShfZGJ1c19jb25uZWN0aW9uX2Nsb3NlX3Bvc3NpYmx5X3NoYXJlZCk6IHJlbmFtZSBmcm9tIAorCV9kYnVzX2Nvbm5lY3Rpb25fY2xvc2VfaW50ZXJuYWwKKwkoZGJ1c19jb25uZWN0aW9uX2Nsb3NlLCBkYnVzX2Nvbm5lY3Rpb25fb3BlbiwKKwlkYnVzX2Nvbm5lY3Rpb25fb3Blbl9wcml2YXRlKTogSW1wcm92ZSBkb2NzIHRvIGV4cGxhaW4gdGhlIGRlYWwKKwl3aXRoIHdoZW4geW91IHNob3VsZCBjbG9zZSBvciB1bnJlZiBvciBib3RoCisKKwkqIGRidXMvZGJ1cy1idXMuYworCShfZGJ1c19idXNfbm90aWZ5X3NoYXJlZF9jb25uZWN0aW9uX2Rpc2Nvbm5lY3RlZF91bmxvY2tlZCk6IHJlbmFtZQorCWZyb20gX2RidXNfYnVzX2NoZWNrX2Nvbm5lY3Rpb25fYW5kX3VucmVmX3VubG9ja2VkIGFuZCBtb2RpZnkgdG8KKwlsb29wIG92ZXIgYWxsIGNvbm5lY3Rpb25zCisKKwkqIHRlc3QvdGVzdC11dGlscy5jICh0ZXN0X2Nvbm5lY3Rpb25fc2h1dGRvd24pOiBkb24ndCB0cnkgdG8gY2xvc2UKKwlzaGFyZWQgY29ubmVjdGlvbnMuCisKKwkqIHRlc3QvbmFtZS10ZXN0L3Rlc3QtdGhyZWFkcy1pbml0LmMgKG1haW4pOiBmaXggd2FybmluZ3MgaW4gaGVyZQorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19hYm9ydCk6IHN1cHBvcnQgREJVU19CTE9DS19PTl9BQk9SVAorCWVudiB2YXJpYWJsZSB0byBjYXVzZSBibG9ja2luZyB3YWl0aW5nIGZvciBnZGI7IGRyb3AKKwlEQlVTX1BSSU5UX0JBQ0tUUkFDRSBhbmQganVzdCBjYWxsIF9kYnVzX3ByaW50X2JhY2t0cmFjZSgpIAorCXVuY29uZGl0aW9uYWxseS4KKworCSogY29uZmlndXJlLmluOiBhZGQgLWV4cG9ydC1keW5hbWljIHRvIGxpYnRvb2wgZmxhZ3MgaWYgYXNzZXJ0aW9ucyBlbmFibGVkCisJc28gX2RidXNfcHJpbnRfYmFja3RyYWNlIHdvcmtzLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmMgKF9kYnVzX3ByaW50X2JhY2t0cmFjZSk6IHVzZSBmcHJpbnRmCisJaW5zdGVhZCBvZiBfZGJ1c192ZXJib3NlIHRvIHByaW50IHRoZSBiYWNrdHJhY2UsIGFuZCBkaWFnbm9zZSBsYWNrIAorCW9mIC1yZHluYW1pYy8tZXhwb3J0LWR5bmFtaWMKKwkKKzIwMDYtMDktMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtYnVzLmMgKGRidXNfYnVzX2dldF9wcml2YXRlLCBkYnVzX2J1c19nZXQpIAorCShpbnRlcm5hbF9idXNfZ2V0KTogZml4IHNjcmV3eSBjb2RlIGZvcm1hdHRpbmcuIHdob2V2ZXIgY29tbWl0dGVkCisJdGhhdCB3YXMgbm90IHBheWluZyBhdHRlbnRpb24hCisKKzIwMDYtMDktMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW4gKExUX0NVUlJFTlQsIExUX0FHRSk6IGluY3JlbWVudCBjdXJyZW50IGFuZCBhZ2UgdG8KKwlyZWZsZWN0IGFkZGl0aW9uIG9mIGludGVyZmFjZXMuCisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBkZXNjcmliZSBhIG5ldworCW9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIuR2V0TWFjaGluZUlkIG1ldGhvZAorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19za2lwX3doaXRlX3JldmVyc2UpOiBuZXcgZnVuY3Rpb24KKwkoX2RidXNfc3RyaW5nX3NraXBfd2hpdGUsIF9kYnVzX3N0cmluZ19za2lwX2JsYW5rKTogdXNlIG5ldworCURCVVNfSVNfQVNDSUlfQkxBTkssIERCVVNfSVNfQVNDSUlfV0hJVEUgbWFjcm9zIGFuZCBmaXggYXNzZXJ0aW9uCisJYXQgZW5kIG9mIHNraXBfd2hpdGUKKwkoX2RidXNfc3RyaW5nX2Nob3Bfd2hpdGUpOiBuZXcgZnVuY3Rpb24KKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25zX3NldHVwX2Nvbm5lY3Rpb24pOiBjYWxsCisJZGJ1c19jb25uZWN0aW9uX3NldF9yb3V0ZV9wZWVyX21lc3NhZ2VzLgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jCisJKF9kYnVzX2Nvbm5lY3Rpb25fcGVlcl9maWx0ZXJfdW5sb2NrZWRfbm9fdXBkYXRlKTogbW9kaWZ5IHRvCisJc3VwcG9ydCBhIEdldE1hY2hpbmVJZCBtZXRob2QuCisKKwlBbHNvLCBzdXBwb3J0IGEgbmV3IGZsYWcgdG8gbGV0IHRoZSBidXMgcGFzcyBwZWVyIG1ldGhvZHMgdGhyb3VnaAorCXRvIGFwcHMgb24gdGhlIGJ1cywgd2hpY2ggY2FuIGJlIHNldCB3aXRoCisJZGJ1c19jb25uZWN0aW9uX3NldF9yb3V0ZV9wZWVyX21lc3NhZ2VzLgorCisJRmluYWxseSwgaGFuZGxlIGFuZCByZXR1cm4gYW4gZXJyb3IgZm9yIGFueXRoaW5nIHVua25vd24gb24gdGhlCisJUGVlciBpbnRlcmZhY2UsIHdoaWNoIHdpbGwgYWxsb3cgdXMgdG8gZXh0ZW5kIHRoZSBQZWVyIGludGVyZmFjZQorCWluIHRoZSBmdXR1cmUgd2l0aG91dCBmZWFyIHRoYXQgd2UncmUgbm93IGludGVyY2VwdGluZyBzb21ldGhpbmcKKwlhcHBzIHdlcmUgd2FudGluZyB0byBzZWUuCisJCisJKiB0b29scy9kYnVzLXV1aWRnZW4uYzogYSB0aGluIHdyYXBwZXIgYXJvdW5kIHRoZSBmdW5jdGlvbnMgaW4gCisJZGJ1cy9kYnVzLXV1aWRnZW4uYworCisJKiBkYnVzL2RidXMtdXVpZGdlbi5jOiBpbXBsZW1lbnQgdGhlIGJ1bGsgb2YgdGhlIGRidXMtdXVpZGdlbgorCWJpbmFyeSBoZXJlLCBzaW5jZSBtb3N0IG9mIHRoZSBjb2RlIGlzIGFscmVhZHkgaW4gbGliZGJ1cworCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19yZWFkX2xvY2FsX21hY2hpbmVfdXVpZCk6IHJlYWQgdGhlCisJdXVpZCBmcm9tIHRoZSBzeXN0ZW0gY29uZmlnIGZpbGUKKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c19nZW5lcmF0ZV91dWlkLCBfZGJ1c191dWlkX2VuY29kZSkgCisJKF9kYnVzX3JlYWRfdXVpZF9maWxlX3dpdGhvdXRfY3JlYXRpbmcpIAorCShfZGJ1c19jcmVhdGVfdXVpZF9maWxlX2V4Y2x1c2l2ZWx5LCBfZGJ1c19yZWFkX3V1aWRfZmlsZSk6IG5ldworCXV1aWQtcmVsYXRlZCBmdW5jdGlvbnMsIHBhcnRseSBmYWN0b3JlZCBvdXQgZnJvbSBkYnVzLXNlcnZlci5jCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2Vycm9yX2Zyb21fZXJybm8pOiBjb252ZXJ0IEVFWElTVCB0bworCURCVVNfRVJST1JfRklMRV9FWElTVFMgaW5zdGVhZCBvZiBFRVhJU1QKKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmggKERCVVNfRVJST1JfRklMRV9FWElTVFMpOiBhZGQgZmlsZSBleGlzdHMgZXJyb3IKKworCSogdG9vbHMvZGJ1cy1jbGVhbnVwLXNvY2tldHMuMTogZXhwbGFpbiB3aGF0IHRoZSBwb2ludCBvZiB0aGlzCisJdGhpbmcgaXMgYSBiaXQgbW9yZQorCisJKiBhdXRvZ2VuLnNoIChydW5fY29uZmlndXJlKTogYWRkIC0tY29uZmlnLWNhY2hlIHRvIGRlZmF1bHQKKwljb25maWd1cmUgYXJncworCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmggKF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQpOiBkaXNhYmxlIHRoZQorCWVycm9yIHNldC9jbGVhciBhc3NlcnRpb25zIHdoZW4gREJVU19ESVNBQkxFX0NIRUNLUyBpcyBkZWZpbmVkCisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLmMgKG1haW4pOiBpZiB4ZGlzcGxheSBoYXNuJ3QgYmVlbiBvcGVuZWQsCisJZG9uJ3QgdHJ5IHRvIHNhdmUgYWRkcmVzcywgZml4ZXMgY3Jhc2ggaW4gbWFrZSBjaGVjaworCQorMjAwNi0wOS0zMCAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvQGtkZS5vcmc+CisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIERCVVNfQklORElSIGFzIGEgI2RlZmluZSB0byBDIHNvdXJjZSBjb2RlLgorCisJKiB0b29scy9kYnVzLWxhdW5jaC5jCisJKiB0b29scy9kYnVzLWxhdW5jaC5oCisJKiB0b29scy9kYnVzLWxhdW5jaC14MTEuYzoKKwkqIHRvb2xzL2RidXMtbGF1bmNoLjE6IEFkZCB0aGUgLS1hdXRvbGF1bmNoIG9wdGlvbiB0bworCWRidXMtbGF1bmNoLCB3aGljaCBtYWtlcyBpdCBzY2FuIGZvciBhbiBleGlzdGluZyBzZXNzaW9uCisJc3RhcnRlZCB3aXRoIC0tYXV0b2xhdW5jaC4gV2l0aCB0aGF0IG9wdGlvbiwgaXQgYWxzbyBjcmVhdGVzCisJYW4gWDExIHdpbmRvdyBhbmQgc2F2ZXMgdGhlIGJ1cyBhZGRyZXNzIGFuZCBQSUQgdG8gaXQuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmg6CisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmMgKF9kYnVzX2dldF9hdXRvbGF1bmNoX2FkZHJlc3MpOiBBZGQKKwlhIGZ1bmN0aW9uIHRoYXQgcnVucyAiZGJ1cy1sYXVuY2ggLS1hdXRvbGF1bmNoIiB0byByZXRyaWV2ZQorCXRoZSBydW5uaW5nIEQtQnVzIHNlc3Npb24gYWRkcmVzcyAob3Igc3RhcnQgb25lIGlmIG5vbmUgd2FzIHJ1bm5pbmcpCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYzogQWRkIHRoZSBoYW5kbGVyIGZvciB0aGUgImF1dG9sYXVuY2g6IgorICAgICAgICBhZGRyZXNzIHByb3RvY29sLCB3aGljaCB0cmllcyB0byBnZXQgdGhlIHJ1bm5pbmcgc2Vzc2lvbiBmcm9tCisgICAgICAgIGRidXMtbGF1bmNoLgorCisJKiBkYnVzL2RidXMtYnVzLmM6CisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmg6IE1ha2UgImF1dG9sYXVuY2g6IiBiZSB0aGUgZGVmYXVsdAorCUQtQnVzIHNlc3Npb24gYnVzIGFkZHJlc3MuCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IEZpeCBob3JyaWJsZSB0eXBvIGluIGVycm9yIG1lc3NhZ2UuCisKKzIwMDYtMDktMTggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL01ha2VmaWxlLmFtOiB1c2UgQEVYUEFOREVEX0RBVEFESVJAIGluc3RlYWQgb2YgQERBVEFESVJOQU1FQCAgCisKKzIwMDYtMDktMTcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmMgKF9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfYXV0aGVudGljYXRlZCk6CisJZml4IHNvIHRoYXQgaWYgdW5peF91c2VyX2Z1bmN0aW9uIGlzIHNldCBvbiB3aW5kb3dzLCB3ZSBzdGlsbAorCWRvIHRoZSBkZWZhdWx0IGNoZWNrIHRoYXQgdGhlIGF1dGggaWRlbnRpdHkgbWF0Y2hlcyB0aGUgYnVzIGlkZW50aXR5CisKKzIwMDYtMDktMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmMgKF9kYnVzX3RyYW5zcG9ydF9vcGVuKTogbW9kaWZ5IHRvIGRlbGVnYXRlCisJdG8gX2RidXNfdHJhbnNwb3J0X29wZW5fcGxhdGZvcm1fc3BlY2lmaWMsCisJX2RidXNfdHJhbnNwb3J0X29wZW5fc29ja2V0LAorCWFuZCBfZGJ1c190cmFuc3BvcnRfb3Blbl9kZWJ1Z19waXBlCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtcHJvdGVjdGVkLmg6IGFkZCBfZGJ1c190cmFuc3BvcnRfb3Blbl9wbGF0Zm9ybV9zcGVjaWZpYworCisyMDA2LTA5LTE2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworICAgICAgICBBdHRlbXB0IGF1ZGl0aW5nIHB1YmxpYyBBUEkgdG8gcmVtb3ZlIGFsbCBjYXNlcyB3aGVyZSBhIFVuaXgKKwlmdW5jdGlvbiByZXR1cm5zIHdlaXJkIGVtdWxhdGVkIGdvbyB0byBXaW5kb3dzLiBUaGlzIHByb2JhYmx5IAorCWJyZWFrcyB0aGUgYnVzIGRhZW1vbiBvbiBXaW5kb3dzLCB0byBmaXggaXQgYWdhaW4gd2UgbWF5IAorCW5lZWQgdG8gc3RvcCBwcm9jZXNzaW5nIHVuaXgtc3BlY2lmaWMgY29uZmlnIG9wdGlvbnMgb24gV2luZG93cywKKwlhbmQgbWF5IG5lZWQgdG8gYWRkIFdpbmRvd3Mtc3BlY2lmaWMgcHVibGljIEFQSSBvciBjb25maWcgb3B0aW9ucy4KKwkKKwkqIGNvbmZpZ3VyZS5pbiAoTFRfQ1VSUkVOVCwgTFRfQUdFKTogaW5jcmVtZW50IGN1cnJlbnQgYW5kIGFnZSwKKwl0byByZWZsZWN0IGFkZGVkIGludGVyZmFjZXM7IHNob3VsZCBub3QgYnJlYWsgc29uYW1lLgorCQorCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jIChfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2F1dGhlbnRpY2F0ZWQpOiBkbworCW5vdCBpbnZva2UgdW5peCB1c2VyIGZ1bmN0aW9uIG9uIFdpbmRvd3MuIEtpbmQgb2YgYSBoYWNreSBmaXgsIGJ1dCAKKwl3ZSBkb24ndCB3YW50IGEgInVuaXggdWlkIiBsZWFraW5nIG91dCBvbiBXaW5kb3dzLgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X3NvY2tldCk6IGFkZCBuZXcgQVBJCisJdG8gZ2V0IHRoZSBzb2NrZXQgZmQgb24gV2luZG93cyBvciBVTklYCisJKGRidXNfY29ubmVjdGlvbl9nZXRfdW5peF9mZCk6IG1ha2UgdGhpcyBhbHdheXMgZmFpbCBvbiBXaW5kb3dzCisKKzIwMDYtMDktMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc2VydmVyLmMgKGRidXNfc2VydmVyX2xpc3Rlbik6IGNoYW5nZSBob3cgdGhpcyB3b3JrcworCXRvIGJlIGFibGUgdG8gZGVsZWdhdGUgdG8gYSBzZXQgb2YgaGFuZGxlcnMgdGhhdCBjYW4gc3VjY2VlZCwKKwlmYWlsLCBvciBjaG9vc2Ugbm90IHRvIGhhbmRsZS4gQWxsb3dzIHVzIHRvIGhhdmUgCisJZGJ1c19zZXJ2ZXJfbGlzdGVuX3BsYXRmb3JtX3NwZWNpZmljLgorCisJKiBkYnVzL2RidXMtc2VydmVyLXNvY2tldC5jIChfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl90Y3Bfc29ja2V0KToKKwlmYWN0b3Igb3V0IHRoZSB0Y3Agc29ja2V0IHN0dWZmIHRvIGJlIHVzZWQgb24gd2luZG93cywgbGVhdmluZworCXVuaXggZG9tYWluIHNvY2tldCBvbmx5IGluIGRidXMtc29ja2V0LXVuaXguYworCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXNvY2tldC5jCisJKF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX3RjcF9zb2NrZXQpOiBmYWN0b3Igb3V0IHRoZSB0Y3Agc29ja2V0CisJc3R1ZmYgdG8gYmUgdXNlZCBvbiB3aW5kb3dzLCBsZWF2aW5nIHVuaXggZG9tYWluIHNvY2tldCBvbmx5IAorCWluIGRidXMtdHJhbnNwb3J0LXVuaXguYworCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfdXNlcik6IGluc2VydAorCXRlbXBvcmFyeSBoYWNrIHRvIGJlIHN1cmUgdGhpcyBmYWlscyBvbiB3aW5kb3dzCisJKGRidXNfY29ubmVjdGlvbl9nZXRfdW5peF9wcm9jZXNzX2lkKTogZGl0dG8KKworMjAwNi0wOS0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYyAoX2RidXNfb3Blbl90Y3Bfc29ja2V0KSAKKwkoX2RidXNfb3Blbl91bml4X3NvY2tldCwgX2RidXNfb3Blbl9zb2NrZXQpOiBjaGFuZ2UgQVBJIGZvciAKKwlfZGJ1c19vcGVuX3NvY2tldCBzbyB0aGUgZG9tYWluL3R5cGUvcHJvdG9jb2wgZnJvbSBzeXN0ZW0gaGVhZGVycworCWFyZSBub3QgcmVxdWlyZWQuIFRoaXMgaXMga2luZCBvZiBwb2ludGxlc3MgdGhvdWdoIHVubGVzcyB3ZSBtb3ZlCisJcGFydCBvZiBfZGJ1c19jb25uZWN0X3RjcF9zb2NrZXQgaW50byBzeXNkZXBzLmMgaW5zdGVhZCBvZgorCXN5c2RlcHMtdW5peC5jLCB3aGljaCB3b3VsZCBtZWFuIGFkZGluZyBhIHdyYXBwZXIgYXJvdW5kCisJYmluZC9saXN0ZW4vZXRjLgorCUFsc28sIGFkZCBEQnVzRXJyb3IgdG8gdGhlIHNvY2tldC1vcGVuaW5nIGZ1bmN0aW9ucyBzbyB0aGV5IAorCWRvbid0IHJlcXVpcmUgdXNlIG9mIGVycm5vLgorCisyMDA2LTA5LTE2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5oOiBzbWFsbCBjaGFuZ2UgdG8gUGV0ZXIncyBwYXRjaCB0byBtYWtlCisJZGJ1cy1zeXNkZXBzLXVuaXgtdXRpbC5jIGJ1aWxkLCBhZGQgdW5peC1zcGVjaWZpYyBzeXNkZXBzIGhlYWRlci4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuaCwgZGJ1cy1zeXNkZXBzLXVuaXguYzogcGF0Y2ggZnJvbSBQZXRlciAKKwlLw7xtbWVsIGJ1ZyAjODI0OSB0byBtYWtlIHRoZSBzeXNkZXBzLmggcmVhZC93cml0ZS9vcGVuL2Nsb3NlCisJZnVuY3Rpb25zIHNwZWNpZmljYWxseSBmb3Igc29ja2V0cyBvbmx5LCBhbmQgbW92ZSBnZW5lcmljIAorCXJlYWQvd3JpdGUvb3Blbi9jbG9zZSBpbnRvIHVuaXgtc3BlY2lmaWMgY29kZS4KKworMjAwNi0wOS0xNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jICh1bml4X2RvX2l0ZXJhdGlvbik6IGZpeCBhIHZhbGdyaW5kCisJY29tcGxhaW50IGFib3V0IGFjY2Vzc2luZyByZXZlbnRzIHdoZW4gcG9sbCByZXR1cm5zIDAsIGZyb20gSnVsaWFuIFNld2FyZC4KKworMjAwNi0wOS0xNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogUmVsZWFzZWQgMS4wIFJDIDEgKDAuOTMpIAorCisyMDA2LTA5LTE0ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11dGlsLXVuaXguYyAoX2RidXNfd3JpdGVfcGlkX2ZpbGUpOgorCXVzZSBfZGJ1c19jbG9zZSBpbnN0ZWFkIG9mIGNsb3NlCisKKzIwMDYtMDktMTQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmM6IEFkZCBzdXBwb3J0IGZvciBMT0NBTF9DUkVEUyBzb2NrZXQKKwljcmVkZW50aWFscy4gIEZpeGVzICJleHRlcm5hbCIgYXV0aGVudGljYXRpb24gdW5kZXIgZS5nLiBOZXRCU0QKKwl3aGljaCBkb2VzIG5vdCBzdXBwb3J0IGFueSBvdGhlciBzb2NrZXQgY3JlZGVudGlhbHMgbWVjaGFuaXNtLgorCShQYXRjaCBmcm9tIEp1bGlvIE0uIE1lcmlubyBWaWRhbCAgPGptbXYgYXQgTmV0QlNEIGRvdCBvcmc+KQorCisyMDA2LTA5LTE0ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdGhyZWFkcy5jOiBBbGxvdyByZWN1cnNpdmUgbXV0ZXgncyB0byBiZSBwYXNzZWQgaW50bworCWRidXNfdGhyZWFkc19pbml0IGFuZCBiZSB1c2VkIGJ5IHRoZSBkYnVzIG11dGV4IGZ1bmN0aW9ucyB0bworCWF2b2lkIGRlYWRsb2Nrcy4KKworCSogZG9jL1RPRE86IFJlbW92ZSByZWN1cnNpdmUgbXV0ZXggZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoIFRPRE8gaXRlbQorCisyMDA2LTA5LTEzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11dGlsLXVuaXguYyAoX2RidXNfZGlyZWN0b3J5X2dldF9uZXh0X2ZpbGUpOgorCXVzZSB0aHJlYWRzYWZlIHJlYWRkaXJfciBpbnN0ZWFkIG9mIHJlYWRkaXIKKworMjAwNi0wOS0xMyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy10aHJlYWRzLmMgKGRidXNfdGhyZWFkc19pbml0X2RlZmF1bHQpOiBOZXcgbWV0aG9kIGZvcgorCWluaXRpYWxpemluZyB0aGUgaW50ZXJuYWwgdGhyZWFkIGltcGxlbWVudGF0aW9uIChQYXRjaCBmcm9tCisJQWxleGFuZGVyIExhcnNzb24gPGFsZXhsIGF0IHJlZGhhdCBkb3QgY29tPikKKworMjAwNi0wOS0xMSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcmVtb3ZlIGEgYnVuY2ggb2YgdG9kbyBpdGVtcyBmcm9tIHRoZSAxLjAgbGlzdAorCisyMDA2LTA5LTExICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBidXMvYWN0aXZhdGlvbi5jLCBidXMvZGVza3RvcC1maWxlLmM6IERpc3Rpbmd1aXNoIGJldHdlZW4gT09NIGFuZAorCWtleSBub3QgZm91bmQKKworMjAwNi0wOS0xMSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWludGVybmFsLmM6IEFkZCBkYnVzX2lzX3ZlcmJvc2Ugc28gd2UgY2FuIGhhdmUgbW9yZQorCWNvbXBsZXggZGVidWdnaW5nIGNvZGUKKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtYmFzaWMuYyAoX2RidXNfbWFyc2hhbF9yZWFkX2ZpeGVkX211bHRpKTogTW92ZQorCWJldHdlZW4gdGhlIHRlc3Qgc3VpdGUgaWZkZWZzCisJKF9kYnVzX3ZlcmJvc2VfYnl0ZXMpOiByZXR1cm4gaWYgdmVyYm9zaXR5IGlzIG5vdCBlbmFibGVkIAorCisyMDA2LTA5LTExICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUtdXRpbC5jLCBkYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUuYzoKKwlyZW1vdmUgREJ1c01hcmsKKworMjAwNi0wOS0xMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKyAgICAgICBwYXRjaCBtb3N0bHkgYnkgUGV0ZXIgS8O8bW1lbCwgYnVnICM4MjExCisJCisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmM6IG5ldyBmaWxlLCB3aGljaCBzcGxpdHMgb3V0CisJdW5peC1zcGVjaWZpYyBzdHVmZiBpbiBkYnVzLXN5c2RlcHMuYworCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOiBkb24ndCBpbmNsdWRlIGFueSBVTklYLW9ubHkgaGVhZGVycywgCisJYW5kIG1vdmUgdW5peC1zcGVjaWZpYyBzdHVmZiB0byBkYnVzLXN5c2RlcHMtdW5peC5jCisKKwkqIGNvbmZpZ3VyZS5pbjogY2hlY2sgSEFWRV9FUlJOT19ICisJCisyMDA2LTA5LTA4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBidXMvdGVzdC1tYWluLmMgKG1haW4pOiBJbml0aWFsaXplIHRocmVhZGluZyBkdXJpbmcgdGVzdHMKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoX2RidXNfY29ubmVjdGlvbl9uZXdfZm9yX3RyYW5zcG9ydCk6CisJVW5sb2NrIGNvbm5lY3Rpb24gb24gZXJyb3IKKwkoZ2VuZXJhdGVfbG9jYWxfZXJyb3JfbWVzc2FnZSk6IHN0YXRpYyBtZXRob2QgZm9yIGdlbmVyYXRpbmcKKwlhbiBlcnJvciBtZXNzYWdlIHdoZW4gd2UgZG9uJ3QgaGF2ZSBhIG1lc3NhZ2UgdG8gcmVwbHkgdG8KKwkoX2RidXNfY29ubmVjdGlvbl9ibG9ja19wZW5kaW5nX2NhbGwpOiBTZW5kIGEgZGlzY29ubmVjdCBlcnJvcgorCWluc3RlYWQgb2YganVzdCBhIHRpbWVvdXQgKE5VTEwpIHdoZW4gdGhlIGJ1cyBnZXRzIGRpc2Nvbm5lY3RlZAorCXdoaWxlIGJsb2NraW5nIGZvciBhIHJlcGx5LgorCQorMjAwNi0wOS0wOCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKTogUHJvcGVybHkgcmVtb3ZlCisJZmlsdGVycyAoUGF0Y2ggZnJvbSBLaW1tbyBIw6Rtw6Rsw6RpbmVuIAorCTxraW1tbyBkb3QgaGFtYWxhaW5lbiBhdCBub2tpYSBkb3QgY29tPikKKworMjAwNi0wOS0wNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaDogQWRkIHByb3RvdHlwZSBmb3IgCisJX2RidXNfY29ubmVjdGlvbl90ZXN0X2dldF9sb2NrcyB0byByZW1vdmUgd2FybmluZworCisyMDA2LTA5LTA3ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3Bhd24uYyAoX2RidXNfc3Bhd25fYXN5bmNfd2l0aF9iYWJ5c2l0dGVyKTogTWFrZSBzdXJlIHdlCisJY2xvc2UgY2hpbGRfZXJyX3JlcG9ydF9waXBlW1dSSVRFX0VORF0gb24gZXhlYyAoUGF0Y2ggZnJvbSAKKwlLaW1tbyBIw6Rtw6Rsw6RpbmVuIDxraW1tbyBkb3QgaGFtYWxhaW5lbiBhdCBub2tpYSBkb3QgY29tPikKKworMjAwNi0wOS0wNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogQ2xlYW4gdXAgY2xvc2UgY2FsbHMgdG8gdXNlIF9kYnVzX2Nsb3NlIChQYXRjaCBmcm9tIAorCUtpbW1vIEjDpG3DpGzDpGluZW4gPGtpbW1vIGRvdCBoYW1hbGFpbmVuIGF0IG5va2lhIGRvdCBjb20+KQorCisyMDA2LTA5LTA2ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkb2MvVE9ETzoKKwktIFJlbW92ZSBwZW5kaW5nIGNhbGwgbG9ja2luZyB0b2RvIGl0ZW0KKwktIGRidXNfY29ubmVjdGlvbl9vcGVuIG5vdyBob2xkcyBoYXJkIHJlZi4gIFJlbW92ZSB0b2RvIGl0ZW0KKwktIGRvIHByb3BlciBsb2NraW5nIG9uIF9kYnVzX2J1c19jaGVja19jb25uZWN0aW9uX2FuZF91bnJlZgorCSAgYW5kIGhhbmRsZSBEQlVTX0JVU19TVEFSVEVSLiBSZW1vdmUgdG9kbyBpdGVtCisJLSBXYXJuIG9uIGNsb3Npbmcgb2YgYSBzaGFyZWQgY29ubmVjdGlvbi4gIFJlbW92ZSB0b2RvIGl0ZW0KKworCSogYnVzL2J1cy5jLCBidXMvY29ubmVjdGlvbi5jLCBidXMvZGlzcGF0Y2guYywgZGJ1cy9kYnVzLWJ1cy5jLAorCWRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IFVzZSB0aGUgZGJ1c19jb25uZWN0aW9uX2Nsb3NlX2ludGVybmFsCisJc28gd2UgZG9uJ3QgZ2V0IHRoZSB3YXJuaW5nIHdoZW4gY2xvc2luZyBzaGFyZWQgY29ubmVjdGlvbnMKKworCSogdGVzdC90ZXN0LXNlcnZpY2UuYywgdGVzdC90ZXN0LXNoZWxsLXNlcnZpY2UuYzogQXBwbGljYXRpb25zCisJZG9uJ3QgY2xvc2Ugc2hhcmVkIGNvbm5lY3Rpb25zIHRoZW1zZWx2ZXMgc28gd2UgdW5yZWYgaW5zdGVhZCBvZgorCWNsb3NlCisKKwkqIHRlc3QvdGVzdC11dGlscy5jICh0ZXN0X2Nvbm5lY3Rpb25fc2h1dGRvd24pOiBDbG9zZSB0aGUgY29ubmVjdGlvbgorCisJKiBkYnVzL2RidXMtYnVzLmMgKF9kYnVzX2J1c19jaGVja19jb25uZWN0aW9uX2FuZF91bnJlZik6IENoYW5nZWQgdG8KKwlfZGJ1c19idXNfY2hlY2tfY29ubmVjdGlvbl9hbmRfdW5yZWZfdW5sb2NrZWQgc2luY2Ugd2Ugb25seSBjYWxsIHRoaXMKKwltZXRob2Qgb24gYSBsb2NrZWQgY29ubmVjdGlvbi4gIAorCU1ha2Ugc3VyZSB3ZSBjYWxsIF9kYnVzX2Nvbm5lY3Rpb25fdW5yZWZfdW5sb2NrZWQgaW5zdGVhZCBvZiAKKwlkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgYWxzby4KKwlIYW5kbGUgREJVU19CVVNfU1RBUlRFUiBjb3JyZWN0bHkKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoY29ubmVjdGlvbl9yZWNvcmRfc2hhcmVkX3VubG9ja2VkKToKKwlNYXJrIGFzIHNoYXJlZCBhbmQgaGFyZCByZWYgdGhlIGNvbm5lY3Rpb24KKwkoY29ubmVjdGlvbl9mb3JnZXRfc2hhcmVkX3VubG9ja2VkKTogUmVtb3ZlIHRoZSBoYXJkIHJlZiBmcm9tIHRoZSAKKwljb25uZWN0aW9uCisJKF9kYnVzX2Nvbm5lY3Rpb25fY2xvc2VfaW50ZXJuYWxfYW5kX3VubG9jayk6ICBOZXcgaW50ZXJuYWwgZnVuY3Rpb24KKwl3aGljaCB0YWtlcyBhIGxvY2tlZCBjb25uZWN0aW9uIGFuZCB1bmxvY2tzIGl0IGFmdGVyIGNsb3NpbmcgaXQKKwkoX2RidXNfY29ubmVjdGlvbl9jbG9zZV9pbnRlcm5hbCk6IE5ldyBpbnRlcm5hbCBmdW5jdGlvbiB3aGljaCBhY3RzCisJbGlrZSB0aGUgb3JpZ29uYWwgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIG1ldGhvZCBieSBncmFiYmluZyBhIGNvbm5lY3Rpb24KKwlsb2NrIGFuZCBjYWxsaW5nIF9kYnVzX2Nvbm5lY3Rpb25fY2xvc2VfaW50ZXJuYWxfYW5kX3VubG9jaworCShkYnVzX2Nvbm5lY3Rpb25fY2xvc2UpOiBQdWJsaWMgY2xvc2UgbWV0aG9kLCB3YXJucyB3aGVuIHRoZSBhcHAKKwl0cnlzIHRvIGNsb3NlIGEgc2hhcmVkIGNvbm5lY3Rpb24KKworMjAwNi0wOS0wNiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogYnVzL2RyaXZlci5jOgorCShidXNfZHJpdmVyX2dlbmVyYXRlX2ludHJvc3BlY3Rfc3RyaW5nKTogTmV3IG1ldGhvZCBmb3IgcG9wdWxhdGluZworCWEgREJ1c1N0cmluZyB3aXRoIHRoZSBpbnRyb3NwZWN0IGRhdGEKKwkoYnVzX2RyaXZlcl9oYW5kbGVfaW50cm9zcGVjdCk6IE1vdmUgaW50cm9zcGVjdCBnZW5lcmF0aW9uIGNvZGUgdG8gCisJYnVzX2RyaXZlcl9nZW5lcmF0ZV9pbnRyb3NwZWN0X3N0cmluZworCisJKiBidXMvbWFpbi5jOgorCShpbnRyb3NwZWN0KTogTmV3IGZ1bmN0aW9uIHdoaWNoIHByaW50cyBvdXQgdGhlIGludHJvcGVjdCBkYXRhIGFuZAorCWV4aXRzCisJKG1haW4pOiBBZGQgYSAtLWludHJvc3BlY3Qgc3dpdGNoCisKKzIwMDYtMDktMDYgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRvYy9UT0RPOiBSZW1vdmVkIGR0ZCBwdWJsaXNoaW5nIGl0ZW0uICAKKwlJdCBzZWVtcyB0aGUgZHRkIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgYXQKKwlodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvaW50cm9zcGVjdC5kdGQKKworMjAwNi0wOS0wNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZG9jL1RPRE8sIHZhcmlvdXMgc291cmNlIGZpbGVzOiBBdWRpdGVkIHRvZG8ncyBhbmQgRklYTUUncyBhbmQKKwlwcmVwZW5kZWQgdGhlIG9uZXMgd2Ugc2hvdWxkIGJlIGxvb2tpbmcgYXQgd2l0aCAxLjAuICBUaG9zZQorCXByZXBlbmRlZCB3aXRoIDEuMD8gbmVlZCBjbGVyaWZpY2F0aW9uIG9yIG1pZ2h0IG5vdCBiZSBuZWVkZWQKKwlmb3IgMS4wCisKKzIwMDYtMDktMDUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1wZW5kaW5nLWNhbGwuYzogQWRkIHNvbWUgY2hlY2tzIHNvIHdlIGRvbid0IGNyYXNoIG9uCisJTlVMTCBpbiB0aGUgcHVibGljIEFQSSAoUGF0Y2ggZnJvbSBLaW1tbyBIw6Rtw6Rsw6RpbmVuIAorCTxraW1tbyBkb3QgaGFtYWxhaW5lbiBhdCBub2tpYSBkb3QgY29tPikKKworMjAwNi0wOS0wNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBGaXggZm9yIE9TLVggY29tcGlsZSB0aW1lIGVuZGlhbiBpc3N1ZXMgKHBhdGNoIGZyb20KKwlCZW5qYW1pbiBSZWVkIDxyYW5nZXIgYXQgYmVmdW5rIGRvdCBjb20+KQorCisyMDA2LTA5LTA1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IENoZWNrIGZvciBuby1jb21tb24gY29tcGlsZXIgZmxhZyAoT1MtWCBmaXggZnJvbQorCUJlbmphbWluIFJlZWQgPHJhbmdlciBhdCBiZWZ1bmsgZG90IGNvbT4pCisKKzIwMDYtMDktMDEgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLmM6IEFkZCBhIHNpZ3Rlcm0gaGFuZGxlciAocGF0Y2ggZnJvbSBGcmVkZXJpYyBDcm96YXQKKwk8ZmNyb3phdCBhdCBtYW5kcml2YSBkb3QgY29tPikKKworMjAwNi0wOC0yOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvdGVzdC1zZXJ2aWNlLmMgKHBhdGhfbWVzc2FnZV9mdW5jKTogZml4IGxhY2sgb2YgcmV0dXJuIHZhbHVlCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3ByaW50Zl9zdHJpbmdfdXBwZXJfYm91bmQpOiBmaXgKKwlmb3JtYXR0aW5nLCByZW1vdmUgI2lmZGVmLCBhbmQgZml4IGRvY3MuICNpZmRlZiBkb2Vzbid0IG1ha2UKKwlhbnkgbW9yZSBzZW5zZSB0aGFuIG9uIGFueXRoaW5nIGVsc2UgaW4gdGhpcyBmaWxlLgorCShfZGJ1c19nZXRfdG1wZGlyKTogYWRkIGNvbnN0IHRvIHJldHVybiB2YWx1ZSwgYW5kIGtlZXAgdGhlCisJcmVzdWx0cyBvZiB0aGUgdmFyaW91cyBnZXRlbnYgYXJvdW5kIGluIGEgc3RhdGljIHZhcmlhYmxlLgorCisyMDA2LTA4LTI5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC5jLCBkYnVzL2RidXMtc3lzZGVwcy11dGlsLXVuaXguYzogY2hhbmdlCisJZnJvbSBSYWxmIEhhYmFja2VyIHRvIG1vdmUgVU5JWC1zcGVjaWZpYyBzeXNkZXBzIGludG8gYSBzZXBhcmF0ZSBmaWxlLgorCisyMDA2LTA4LTI1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiB0ZXN0L01ha2VmaWxlLmFtOiBjaGFuZ2UgZmluZCB0byB1c2Ugc3ludGF4IHRoYXQgd29ya3Mgd2l0aCBub24KKwlnbnUgdmVyc2lvbnMgb2YgZmluZAorCisyMDA2LTA4LTI1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmM6IGZpeCBpbnZhbGlkIGRlcmVmIHdoZW4gY2hlY2tpbmcgaWYKKwlhIHZ0YWJsZSBtZXRob2QgZXhpc3RzIChQYXRjaCBmcm9tIENocmlzdGlhbiBFaHJsaWNoZXIgCisJPGNoIGRvdCBlaHJsaWNoZXIgYXQgZ214IGRvdCBkZT4pCisKKzIwMDYtMDgtMjUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiwgZGJ1cy9NYWtlZmlsZS5hbSwgdGVzdC9uYW1lLXRlc3QvcnVuLXRlc3Quc2gsIAorCXRlc3QvbmFtZS10ZXN0L01ha2VmaWxlLmFtOiBGaXhlZCBzb21lIGlzc3VlcyB3aXRoIGdldHRpbmcgZ2V0IGRidXMgCisJdG8gYnVpbGQgd2l0aCBidWlsZGRpciAhPSBzcmNkaXIgKFRha2VuIGZyb20gYSBwYXRjaCBieSBCZXJuYXJkIExlYWsKKwk8YmVybmFyZCBhdCBicmVuZGEtYXJrbGUgZG90IGRlbW9uIGRvdCBjbyBkb3QgdWs+KQorCisyMDA2LTA4LTI1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IEZpeCBEQlVTX0RBRU1PTkRJUiB0byB1c2UgRVhQQU5ERURfQklORElSIGZvciB0aGUKKwlkZWZhdWx0IGNhc2UKKworMjAwNi0wOC0yNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmFjLCBidXMvTWFrZWZpbGUuYW06IEdlbmVyYWxpemUga3F1ZXVlIHN1cHBvcnQgc28gdGhhdAorCWl0IHdvcmtzIG9uIGFueSBzeXN0ZW0gcHJvdmlkaW5nIHRoaXMgaW50ZXJmYWNlLCBub3Qgb25seSBGcmVlQlNELgorCUZvciBleGFtcGxlLCBOZXRCU0QuIChQYXRjaCBieSBKdWxpbyBNLiBNZXJpbm8gVmlkYWwgIDxqbW12IGF0IE5ldEJTRCBkb3Qgb3JnPikKKworMjAwNi0wOC0yMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9kYnVzLWZhcS54bWwsIGRvYy9kYnVzLXR1dG9yaWFsLnhtbDogc29tZSBpbXByb3ZlbWVudHMgdG8KKwl0aGUgZG9jcworCisyMDA2LTA4LTE4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBSZWxlYXNlZCAwLjkyIAorCisyMDA2LTA4LTE4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdGhyZWFkcy5jIChkYnVzX3RocmVhZHNfaW5pdCk6IGNoYW5nZSB0aGUgZG9jdW1lbnRhdGlvbgorCXRvIHJlZmxlY3QgdGhlIGluaXQgbGF0ZSBjaGFuZ2UKKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9uZXcpOiBDaGVjayB1c2VyIGJlZm9yZSB3ZSBmb3JrIHNvIHdlIGNhbgorCXByaW50IG91dCBhbiBlcnJvciBtZXNzYWdlIGEgdXNlciB3aWxsIGJlIGFibGUgdG8gc2VlCisKKzIwMDYtMDgtMTggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwlQYXRjaCBwcm92aWRlZCBieSBSYWxmIEhhYmFja2VyIChyYWxmIGRvdCBoYWJhY2tlciBhdCBmcmVlbmV0IGRvdCBkZSkgCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMsIGRidXMvZGJ1cy10aHJlYWRzLmMsIGRidXMvZGJ1cy1pbnRlcm5hbHMuaDoKKwlBZGQgdHdvIG1vcmUgZ2xvYmFsIGxvY2tzIGZvciB1c2Ugb24gd2luZG93cyBwbGF0Zm9ybXMuICBUaGVzZSBhcmUKKwl1bnVzZWQgb24gbm9uLXdpbmRvd3MgcGxhdGZvcm1zIGJ1dCBhcmUgbm90IGlmZGVmZWQgb3V0IHRvIGF2b2lkCisJcG90ZW50aWFsIGJ1Z3MgKGkuZS4gdGhlIGZldyBieXRlcyBsb3N0IGRvZXMgbm90IHdhcnJlbnQgdGhlIGV4dHJhCisJbWFpbnRhbmVuY2UgYW5kIGNvbXBsZXhpdHkgdGhhdCBoYXZpbmcgc2VwZXJhdGUgc2V0cyBvZiBsb2NrcyB3b3VsZAorCWNhdXNlKQorCisyMDA2LTA4LTE4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBidXMvc2VydmljZXMuYyAoYnVzX3JlZ2lzdHJ5X2FjcXVpcmVfc2VydmljZSk6IFJldHVybiBhbiBlcnJvcgorCXdoZW4gYW4gYXBwbGljYXRpb24gdHJpZXMgdG8gcmVnaXN0ZXIgdGhlIG9yZy5mcmVlZGVza3RvcC5EQnVzIEJ1cyBOYW1lCisKKwkqIGJ1cy9zZXJ2aWNlcy5jIChidXNfcmVnaXN0cnlfcmVsZWFzZV9zZXJ2aWNlKTogUmV0dXJuIGFuIGVycm9yCisJd2hlbiBhbiBhcHBsaWNhdGlvbiB0cmllcyB0byByZWxlYXNlIHRoZSBvcmcuZnJlZWRlc2t0b3AuREJ1cyBCdXMgTmFtZQorCisyMDA2LTA4LTE3ICBBbHAgVG9rZXIgIDxhbHBAYXRva2VyLmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IEZpeCBzb21lIG1pbm9yIHR5cG9zLgorCisyMDA2LTA4LTE3ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IHVzZSAkd2l0aF9pbml0X3NjcmlwdHMgaW5zdGVhZCBvZiAkb3BlcmF0aW5nX3N5c3RlbQorCXRvIGRldGVybWluZSB3aGVyZSB0byBzdG9yZSB0aGUgcGlkIHNpbmNlIHRoZSBpbml0IHNjcmlwdHMgbWFuaXB1bGF0ZSAKKwl0aGUgcGlkIGZpbGUgKHBhdGNoIGZyb20gTWFyY2VsbyBSaWNhcmRvIExlaXRuZXIgCisJPG1hcmNlbG8gZG90IGxlaXRuZXIgYXQgdGVycmEgZG90IGNvbSBkb3QgYnI+LiAgCisKKzIwMDYtMDgtMTYgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy10aHJlYWRzLmM6IEFkZCBzdGF0aWMgREJ1c0xpc3QgKnVuaW5pdGlhbGl6ZWRfbXV0ZXhfbGlzdCBhbmQKKwlzdGF0aWMgREJ1c0xpc3QgKnVuaW5pdGlhbGl6ZWRfY29uZHZhcl9saXN0IHRvIHN1cHBvcnQgbmV3IGxhdGUgCisJaW5pdGlhbGl6YXRpb24gdGhyZWFkaW5nIG1vZGVsLiAgSW4gdGhpcyBtb2RlbCB0aHJlYWRzIGNhbiBiZSBpbml0aWFsaXplZAorCWV2ZW4gYWZ0ZXIgdGhlIEQtQnVzIEFQSSBoYXMgYmVlbiB1c2VkIGJ1dCBzdGlsbCBuZWVkcyB0byBiZSBpbml0aWFsaXplZCAKKwliZWZvcmUgdGhlIHNlY29uZCB0aHJlYWQgaGFzIGJlZW4gc3RhcnRlZC4gIE11dGV4ZXMgYW5kIGNvbmR2YXIgYWRkcmVzc2VzCisJYXJlIHN0b3JlZCBpbiB0aGUgdHdvIHN0YXRpYyBsaXN0cyBhbmQgYXJlIHJlcGxhY2VkIHdpdGggYWN0dWFsbCBsb2NrcworCXdoZW4gdGhyZWFkcyBhcmUgaW5pdGFsaXplZC4KKwkoX2RidXNfbXV0ZXhfbmV3X2F0X2xvY2F0aW9uKTogTmV3IG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBtdXRleCBhbmQgcGxhY2luZworCXRoZSBsb2NhdGlvbiBpbnRvIHRoZSBzdGF0aWMgbGlzdAorCShfZGJ1c19tdXRleF9mcmVlX2F0X2xvY2F0aW9uKTogTmV3IG1ldGhvZCBmb3IgcmVtb3ZpbmcgYSBtdXRleCBsb2NhdGlvbiAKKwlmcm9tIHRoZSBzdGF0aWMgbGlzdCBhbmQgZnJlZWluZyB0aGUgbXV0ZXgKKwkoX2RidXNfY29uZHZhcl9uZXdfYXRfbG9jYXRpb24pOiBOZXcgbWV0aG9kIGZvciBjcmVhdGluZyBhIGNvbmRpdGlvbmFsIAorCXZhcmlhYmxlIGFuZCBwbGFjaW5nIHRoZSBsb2NhdGlvbiBpbnRvIHRoZSBzdGF0aWMgbGlzdAorCShfZGJ1c19jb25kdmFyX2ZyZWVfYXRfbG9jYXRpb24pOiBOZXcgbWV0aG9kIGZvciByZW1vdmluZyBhIGNvbmRpdGlvbmFsCisJdmFyaWFibGUgbG9jYXRpb24gZnJvbSB0aGUgc3RhdGljIGxpc3QgYW5kIGZyZWVpbmcgdGhlIGNvbmRpdGlvbmFsIHZhcmlhYmxlIAorCShpbml0X3VuaW5pdGlhbGl6ZWRfbG9ja3MpOiBBdG9taWMgbWV0aG9kIHdoaWNoIGdvZXMgdGhyb3VnaCB0aGUgc3RhdGljIAorCWxpc3RzIG9mIG11dGV4IGFuZCBjb25kdmFyIGxvY2F0aW9uIGFuZCB1cGRhdGVzIHRoZW0gd2l0aCBhY3R1YWxsIGxvY2tzCisJKGluaXRfZ2xvYmFsX2xvY2tzKTogY2hhbmdlZCB0byBpbml0X2xvY2tzCisJCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOgorCShfZGJ1c19jb25uZWN0aW9uX3Rlc3RfZ2V0X2xvY2tzKTogTmV3IG1ldGhvZCBmb3IgdGVzdHMgdG8gY2hlY2sgY29ubmVjdGlvbnMKKwkoX2RidXNfY29ubmVjdGlvbl9uZXdfZm9yX3RyYW5zcG9ydCk6IFVzZSB0aGUgbmV3IGF0X2xvY2F0aW9uIG11dGV4IGFuZAorCWNvbmR2YXIgQVBJCisJKGRidXNfY29ubmVjdGlvbl9hbGxvY2F0ZV9kYXRhX3Nsb3QpOiBQYXNzIGluIHRoZSBnbG9iYWwgbG9jayBhZGRyZXNzCisJdG8gX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9hbGxvYworCisJKiBkYnVzL2RidXMtZGF0YXNsb3QuYzoKKwkoX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9hbGxvYyk6IFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgbXV0ZXgKKwlpbnN0ZWFkIG9mIHRoZSBtdXRleCBpdHNlbGYKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzoKKwkoZGJ1c19tZXNzYWdlX2FsbG9jYXRlX2RhdGFfc2xvdCk6IFBhc3MgaW4gdGhlIGdsb2JhbCBsb2NrIGFkZHJlc3MKKwl0byBfZGJ1c19kYXRhX3Nsb3RfYWxsb2NhdG9yX2FsbG9jCisKKwkqIGRidXMvZGJ1cy1wZW5kaW5nLWNhbGwuYzoKKwkoZGJ1c19wZW5kaW5nX2NhbGxfYWxsb2NhdGVfZGF0YV9zbG90KTogUGFzcyBpbiB0aGUgZ2xvYmFsIGxvY2sgYWRkcmVzcworCXRvIF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfYWxsb2MKKworCSogZGJ1cy9kYnVzLXNlcnZlci5jOgorCShfZGJ1c19zZXJ2ZXJfaW5pdF9iYXNlKTogVXNlIHRoZSBuZXcgYXRfbG9jYXRpb24gbXV0ZXggQVBJCisJKGRidXNfc2VydmVyX2FsbG9jYXRlX2RhdGFfc2xvdCk6IFBhc3MgaW4gdGhlIGdsb2JhbCBsb2NrIGFkZHJlc3MKKwl0byBfZGJ1c19kYXRhX3Nsb3RfYWxsb2NhdG9yX2FsbG9jCisKKwkqIHRlc3QvbmFtZS10ZXN0L3Rlc3QtdGhyZWFkcy1pbml0LmM6IE5ldyB0ZXN0IGNhc2UgZm9yIGxhdGUgdGhyZWFkCisJaW5pdGlhbGl6YXRpb24KKworMjAwNi0wOC0xNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWRhdGFzbG90LmMgKF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfYWxsb2MpOgorCUNoYW5nZSBfZGJ1c19hYm9ydCB0byBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgYmVjYXVzZSBfZGJ1c19hYm9ydAorCWNhdXNlcyBjb21waWxlIHByb2JsZW1zIHdoZW4gYXNzZXJ0cyBhcmUgdHVybmVkIG9mZgorCUtlZXBpbmcgX2RidXNfd2FybiBmb3IgcHJpbnRpbmcgb3V0IHRoZSBtZXNzYWdlIHNvIGV2ZW4gaWYKKwlhc3NlcnRzIGFyZSB0dXJuZWQgb2ZmIHRoZSB1c2VyIGdldHMgdGhlIG1lc3NhZ2VzIHRoYXQgc29tZXRoaW5nIGlzIAorCXdyb25nIAorCisyMDA2LTA4LTE0ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJUGF0Y2hlcyBieSBLamFydGFuIE1hcmFhcyA8a21hcmFhcyBhdCBnbm9tZSBkb3Qgb3JnPgorCisJKiBidXMvc2VydmljZXMuYyAoYnVzX3NlcnZpY2VfbGlzdF9xdWV1ZWRfb3duZXJzKToKKwlBZGQgYSBwb2ludGVyIGNhc3QgdG8gZml4IGNvbXBpbGVyIHdhcm5pbmcKKworCSogZGJ1cy9kYnVzLWRhdGFzbG90LmMgKF9kYnVzX2RhdGFfc2xvdF9saXN0X2dldCk6CisJcmV0dXJuIGEgTlVMTCBpbnN0ZWFkIG9mIEZBTFNFIHNpbmNlIHRoZSByZXR1cm4gdHlwZQorCWlzIG5vdCBleHBlY3RpbmcgYSBib29sZWFuCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLWJhc2ljLmMgKF9kYnVzX21hcnNoYWxfdGVzdCk6CisJUmVtb3ZlIHVudXNlZCB2YXJpYWJsZQorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUtdXRpbC5jIChub2RlX25ldyk6CisJcmV0dXJuIGEgTlVMTCBpbnN0ZWFkIG9mIEZBTFNFIHNpbmNlIHRoZSByZXR1cm4gdHlwZQorCWlzIG5vdCBleHBlY3RpbmcgYSBib29sZWFuCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5jIChfZGJ1c190cmFuc3BvcnRfZGVidWdfcGlwZV9uZXcpOgorCVNlbmQgYSBOVUxMIGludG8gX2RidXNfdHJhbnNwb3J0X25ld19mb3JfZmQgaW5zdGVhZCBvZiBhIEZBTFNFCisJYmVjYXVzZSB3ZSBhcmUgZXhwZWN0aW5nIGEgcG9pbnRlciBub3QgYSBib29sZWFuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWwuYyAoX2RidXNfZ2V0X3RtcGRpcik6IAorCWFkZCB2b2lkIGFzIHRoZSBwYXJhbWV0ZXIgc28gc29tZSBjb21waWxlcnMKKwlkb24ndCBjb21wbGFpbgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYyAoX2RidXNfdHJhbnNwb3J0X25ld19mb3JfZG9tYWluX3NvY2tldCwKKwkgIF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX3RjcF9zb2NrZXQpOgorCVNlbmQgYSBOVUxMIGludG8gX2RidXNfdHJhbnNwb3J0X25ld19mb3JfZmQgaW5zdGVhZCBvZiBhIEZBTFNFCisJYmVjYXVzZSB3ZSBhcmUgZXhwZWN0aW5nIGEgcG9pbnRlciBub3QgYSBib29sZWFuCisKKwkqIHRlc3Qvc2hlbGwtdGVzdC5jICh0ZXN0X2NvbW1hbmRfbGluZSk6CisJY2FzdCB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIF9kYnVzX2xpc3RfYXBwZW5kIHRvIGF2b2lkIGNvbXBpbGVyCisJd2FybmluZ3MKKworCSogdGVzdC90ZXN0LW5hbWVzLmMgKG1haW4pOiByZW1vdmUgdW51c2VkIHZhcmlhYmxlCisKKwkqIHRlc3QvdGVzdC1zZXJ2aWNlLmMgKGNoZWNrX2hlbGxvX2Zyb21fc2VsZl9yZXBseSk6CisJSW5pdGlhbGl6ZSBlY2hvX21lc3NhZ2UgYW5kIGVjaG9fcmVwbHkgdG8gTlVMTAorCQorCSogdGVzdC90ZXN0LXNoZWxsLXNlcnZpY2UuYyAoaGFuZGxlX2VjaG8pOgorCVJlbW92ZSB1bnVzZWQgdmFyaWFibGUgYW5kIGNhc3QgdGhlIHRoaXJkIHBhcmFtZXRlciBwYXNzZWQgdG8KKwlkYnVzX2Nvbm5lY3Rpb25fZ2V0X29iamVjdF9wYXRoX2RhdGEgdG8gYXZvaWQgY29tcGlsZXIgd2Fycm5pbmdzCisKKwkqIHRlc3QvbmFtZS10ZXN0L3Rlc3QtbmFtZXMuYyAoY2xlYXJfbWVzc2FnZV9xdWV1ZSk6CisJUmVtb3ZlIHVudXNlZCBmdW5jdGlvbgorCisJKiB0ZXN0L25hbWUtdGVzdC90ZXN0LXBlbmRpbmctY2FsbC1kaXNwYXRjaC5jOgorCUZpeCBmb3JtYXQgc3RyaW5nIGluIHByaW50ZgorCisKKzIwMDYtMDgtMTQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1idXMuYzoKKwkqIHRlc3QvbmFtZS10ZXN0L3Rlc3QtbmFtZXMuYzoKKwlSZW1vdmUgdGVzdCBtZXRob2QgZGJ1c19idXNfY29ubmVjdGlvbl9nZXRfdW5pcXVlX25hbWUgYmVjYXVzZSAKKwl3ZSBhbHJlYWR5IGhhdmUgcHVibGljIG1ldGhvZCBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgdGhhdCAKKwlkb2VzIHRoZSBleGFjdCBzYW1lIHRoaW5nCisKKzIwMDYtMDgtMTAgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zaWduYXR1cmUuYzoKKwlmaXggdHlwb3MgaW4gSnVsaW8ncyBwcmV2aW91cyBwYXRjaCB3aGljaCBjYXVzZSBtYWtlIGNoZWNrIHRvIGZhaWwKKworMjAwNi0wOC0xMCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWFkZHJlc3MuYyAoX2RidXNfYWRkcmVzc190ZXN0KTogUmV2ZXJ0IGxlYWtpbmcgc3RyY21wLiAgCisJSW4gYW55IGNhc2UgaXQgd2FzIHdyb25nIHNpbmNlIHRoaXMgaXMgYSB0ZXN0IGNoZWNraW5nIHRvIHNlZSBpZgorCWFkZHJlc3MgcGFyc2luZyBpcyBjb3JyZWN0LiAgVGhlcmUgd2FzIG5vIG5lZWQgdG8gZ2V0IHRoZSB0cnVlCisJdG1wIGRpcmVjdG9yeS4gIAorCisyMDA2LTA4LTEwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWFjcm9zLmg6IFJldmVydCB0aGUgYWRkaXRpb24gb2Ygc3RkZGVmLmgKKwlhcyB3ZSBzaG91bGQgbm90IGJlIGFkZGluZyBpdCB0byBsaWJyYXJ5IGhlYWRlcnMgCisKKzIwMDYtMDgtMTAgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zaWduYXR1cmUuYzoKKwlGaXggdGhlIHVuaXQgdGVzdHMgc28gdGhhdCB0aGV5IHdvcmsgaWYgYXNzZXJ0aW9ucyBhcmUgbm90IGVuYWJsZWQuCisJKHBhdGNoIGZyb20gSnVsaW8gTS4gTWVyaW5vIFZpZGFsICA8am1tdiBhdCBOZXRCU0QgZG90IG9yZz4pCisKKzIwMDYtMDgtMTAgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL3J1bi13aXRoLXRtcC1zZXNzaW9uLWJ1cy5zaDoKKwkqIHRlc3QvbmFtZS10ZXN0L3J1bi10ZXN0LnNoOgorCVJlbW92ZSBiYXNoaXNtcyAocGF0Y2ggZnJvbSBKdWxpbyBNLiBNZXJpbm8gVmlkYWwKKwk8am1tdiBhdCBOZXRCU0QgZG90IG9yZz4pCisKKzIwMDYtMDgtMTAgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIGEgdmVyc2lvbiAoPj0gMi42LjApIGNoZWNrIGZvciBsaWJ4bWwyCisKKzIwMDYtMDgtMTAgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogbWFrZSBzdXJlIHRoZSBjb21waWxlciBzdXBwb3J0cyAtV2Zsb2F0LWVxdWFsCisJCisJKiBidXMvZGlyLXdhdGNoLWRub3RpZnkuYzogbW92ZSBmdW5jdGlvbmFsIGNvZGUgYWZ0ZXIgCisJdmFyaWFibGUgZGVjbGVyYXRpb25zIChDOTkgZml4KSAgKHBhdGNoZXMgZnJvbSBKZW5zIEdyYW5zZXVlcgorCTxqZW5zZ3IgYXQgZ214IGRvdCBuZXQ+CisKKzIwMDYtMDgtMTAgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tYWNyb3MuaDoKKwlhZGQgI2luY2x1ZGUgPHN0ZGRlZi5oPiBzbyB0aGF0IFN1biBjb21waWxlcnMgZG9uJ3QgY29tcGxhaW4gYWJvdXQKKwl0aGUgZGVmaW5pbmcgTlVMTAorCisyMDA2LTA4LTEwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOgorCSogZGJ1cy9kYnVzLWFkZHJlc3MuYzoKKwkqIGJ1cy9hY3RpdmF0aW9uLmM6CisJKiB0ZXN0L3NoZWxsLXRlc3QuYzoKKwlkb24ndCBoYXJkY29kZSB0bXAgZGlyZWN0b3J5IChwYXRjaCBmcm9tIERhdmUgTWVpa2xlIAorCTxkbWsgYXQgZGF2ZW1laWtsZSBkb3QgY28gZG90IHVrPikKKworMjAwNi0wOC0wOSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWRhdGFzbG90LmMgKF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfYWxsb2MpOgorCUNoYW5nZSBhbiBhc3NlcnQgdG8gYSBkZXRhaWxlZCB3YXJuaW5nIGFuZCBhYm9ydC4gIAorCVdoZW4gYWxsb2NhdG9yLT5sb2NrICE9IG11dGV4IGl0IGluZGljYXRlcyB0aGF0IHRoZSB1c2VyIGhhcyBmYWlsZWQKKwl0byBpbml0YWxpemUgdGhyZWFkcyBiZWZvcmUgdXNpbmcgdGhlIEQtQnVzIGxpYnJhcnkuICBUaGlzIHdhcm5pbmcKKwloZWxwcyB0aGUgdXNlciBpZGVudGlmeSB0aGUgaXNzdWUgYW5kIGZpeCB0aGVpciBhcHAuCisKKzIwMDYtMDgtMDggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwlUaGVzZSBhcmUgYWxsIHBhdGNoZXMgZnJvbSBLamFydGFuIE1hcmFhcyA8a21hcmFhcyBhdCBnbm9tZSBkb3Qgb3JnPgorCXdpdGggY2xlYW51cHMgb2YgYnVncyBmb3VuZCBmcm9tIENvdmVyaXR5IHJlcG9ydHM6CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWwuYyAoX2RidXNfd3JpdGVfcGlkX2ZpbGUpOgorCWNsb3NlIHRoZSBmaWxlIG9uIGVycm9yIHRvIGF2b2lkIGEgbGVhaworCisJKiBidXMvZXhwaXJlbGlzdC5jIChidXNfZXhwaXJlX2xpc3RfdGVzdCk6CisJQ2hlY2sgZm9yIE5VTEwgb24gZGJ1c19uZXcwCisKKwkqIGJ1cy9hY3RpdmF0aW9uLmMgKHVwZGF0ZV9kaXJlY3RvcnkpOgorCXJlbW92ZSBkZWFkIGNvZGUKKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYyAobWVyZ2Vfc2VydmljZV9jb250ZXh0X2hhc2gsIHN0YXJ0X3NlbGludXhfY2hpbGQpOgorCUZpeCBzb21lIGxlYWtzCisKKwkqIGJ1cy9idXMuYyAocHJvY2Vzc19jb25maWdfZXZlcnlfdGltZSk6CisJRml4ZWQgYSBsZWFrCisKKwkqIGJ1cy9kZXNrdG9wLWZpbGUuYyAocGFyc2Vfa2V5X3ZhbHVlKToKKwlGaXhlZCBsZWFrCisKKwkqIGJ1cy9zZWxpbnV4LmMgKGJ1c19zZWxpbnV4X2lkX3RhYmxlX2luc2VydCk6CisJRml4ZWQgbGVhaworCisyMDA2LTA4LTA4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtb2JqZWN0LXRyZWUuYyAoX2RidXNfb2JqZWN0X3N1YnRyZWVfbmV3KToKKwlyZW1vdmUgZGVhZCBjb2RlCisKKzIwMDYtMDgtMDggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL3J1bi13aXRoLXRtcC1zZXNzaW9uLWJ1cy5zaDogdXNlICMhL2Jpbi9zaCBpbnN0ZWFkIG9mCisJIyEvYmluL2Jhc2gKKworMjAwNi0wOC0wOCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogRG94eWZpbGUuaW46IGZpeCB0aGUgSU5QVVQgbGluZSBzbyB3ZSBjYW4gZ2VuZXJhdGUgZG9jcyAKKwl3aGVuIHNvdXJjZWRpciAhPSBidWlsZGRpciAocGF0Y2ggZnJvbSBDeWd3aW4gUG9ydHMgbWFpbnRhaW5lcgorCTx5c2Vsa293aXR6IGF0IHVzZXJzIGRvdCBzb3VyY2Vmb3JnZSBkb3QgbmV0PgorCisyMDA2LTA4LTA4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5oOgorCSogZGJ1cy9kYnVzLXN5c2RlcHMuYzogCisJKiBkYnVzL2RidXMtc3RyaW5nLmM6IAorCXMvX2RidXNfcHJpbnRmX2xlbmd0aC9fZGJ1c19wcmludGZfc3RyaW5nX3VwcGVyX2JvdW5kIHRvIGNvbWZvcm0gd2l0aAorCUdMaWIncyBmdW5jdGlvbiB3aGljaCBkb2VzIHRoZSBzYW1lIHRoaW5nCisKKwkqIGNvbmZpZ3VyZS5pbjoKKwkqIGJ1cy9NYWtlZmlsZS5hbToKKwkqIGJ1cy9kaXItd2F0Y2gtZGVmYXVsdC5jOgorCSogYnVzL2Rpci13YXRjaC1kbm90aWZ5LmM6CisJKiBidXMvZGlyLXdhdGNoLWtxdWV1ZS5jOgorCUFkZCBrcXVldWUgZGlyZWN0b3J5IHdhdGNoaW5nIGZvciBmcmVlYnNkIGFuZCBzcGxpdCB0aGUgZGlyZWN0b3J5CisJd2F0Y2hpbmcgY29kZSBpbnRvIHNlcGVyYXRlIGZpbGVzIHBlciBtZXRob2QvYXJjaAorCShwYXRjaGVzIGZyb20gVGltb3RoeSBSZWRhZWxsaSA8ZHJpenp0IGF0IGd1ZmkgZG90b3JnPikKKworMjAwNi0wOC0wOCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOgorCSogdG9vbHMvTWFrZWZpbGUuYW06CisJKiB0b29scy9kYnVzLWxhdW5jaC5jOgorCSogYnVzL01ha2VmaWxlLmFtOgorCWFsbG93IC0td2l0aC1kYnVzLWRhZW1vbmRpciBzd2l0Y2ggdG8gYmUgdXNlZCB0byBtYWtlIHRoZQorCWRhZW1vbiBpbnN0YWxsIHRvIGEgc2VwZXJhdGUgYmluZGlyIGxpa2UgL3Vzci9saWJleGVjCisJKHBhdGNoIGZyb20gQnJpYW4gQ2FtZXJvbiA8YnJpYW4gZG90IGNhbWVyb24gYXQgc3VuIGRvdCBjb20pCisKKzIwMDYtMDgtMDggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9NYWtlZmlsZS5hbSAoaW5zdGFsbC1kYXRhLWhvb2spOiByZW1vdmVkIHRoZSBzbGFzaCBhZnRlciAKKwkkKERFU1RESVIpIHNvIHdlIGRvbid0IGdldCB0aGUgZG91YmxlIHNsYXNoIHdoaWNoIGRvZXMgbm90IHdvcmsKKwlpbiB3aW5kb3dzIChwYXRjaCBmcm9tIEFuZHJhcyBQb3JqZXN6IAorCTxhbmRyYXMgZG90IHBvcmplc3ogYXQgc2llbWVucyBkb3QgY29tPikKKworMjAwNi0wOC0wOCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuaDoKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmM6IAorCSAgYWRkIF9kYnVzX3ByaW50Zl9sZW5ndGggKHBhdGNoIGZyb20gUGV0ZXIgS8O8bW1lbCAKKwkgIDxzeW50aGV0aWNwcCBhdCBnbXggZG90IG5ldD4pCisKKzIwMDYtMDgtMDggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYzogdW5pc3RkLmggaXMgbm90IHVzZWQgCisJKF9kYnVzX3ZlcmJvc2VfcmVhbCk6IG9ubHkgZW5hYmxlIHZlcmJvc2UgcHJpbnRpbmcgCisJaWYgREJVU19WRVJCT1NFIGVudmlyb25tZW50IHZhciBpcyBzZXQgdG8gJzEnCisJKHBhdGNoIGZyb20gUGV0ZXIgS8O8bW1lbCA8c3ludGhldGljcHAgYXQgZ214IGRvdCBuZXQ+KQorCisyMDA2LTA4LTA4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IGFkZCBhIEdDQyBmbGFnIGNoZWNrIGZvciAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudAorCXNvIHdlIHN0aWxsIGNvbXBpbGUgb24gb2xkZXIgZ2NjIChwYXRjaCBmcm9tIEZyZWRlcmljIFBldGVycyAKKwk8ZnBldGVycyBhdCAwZCBkb3QgYmU+CisKKzIwMDYtMDgtMDQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IGFkZCAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudAorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiBjaGFuZ2UgYWxsIHRoZSBwZW5kaW5nIGNhbGwgc3R1ZmYgdG8KKwlyZWZsZWN0IHRoZSBmYWN0IHRoYXQgcGVuZGluZyBjYWxsIG9wZXJhdGlvbnMgdXNlIHRoZSBjb25uZWN0aW9uCisJbG9jaworCisJKiBkYnVzL2RidXMtcGVuZGluZy1jYWxsLmM6IGFkZCBsb2NraW5nIGhlcmUKKworCSogZGJ1cy9kYnVzLWVycm9ycy5jIChzdHJ1Y3QgREJ1c1JlYWxFcnJvcik6IGRvbid0IG1ha2UgdGhlIG5hbWUKKwlmaWVsZCBjb25zdCBjb25zaXN0ZW50IHdpdGggaG93IG1lc3NhZ2UgZmllbGQgaXMgZG9uZQorCisyMDA2LTA4LTAzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBzL0QtQlVTL0QtQnVzL2cKKworMjAwNi0wOC0wMyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW9iamVjdC10cmVlLmM6IFBhdGNoIGJ5IEJlbmphbWluIE90dGUgCisJPGluN3kxMTggYXQgcHVibGljLnVuaS1oYW1idXJnIGRvdCBkZT4gLSBmaXggaW52YWxpZAorCXJlYWQvd3JpdGUgcmVwb3J0ZWQgYnkgdmFsZ3JpbmQKKworMjAwNi0wNy0yNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogUmVsZWFzZWQgMC45MQorCisyMDA2LTA3LTIyICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOgorCShfZGJ1c19jb25uZWN0aW9uX2F0dGFjaF9wZW5kaW5nX2NhbGxfdW5sb2NrZWQpOgorCShjb25uZWN0aW9uX3RpbWVvdXRfYW5kX2NvbXBsZXRlX2FsbF9wZW5kaW5nX2NhbGxzX3VubG9ja2VkKToKKwlNYWtlIHN1cmUgd2Ugc2V0IHRpbWVvdXRfYWRkZWQgb24gcGVuZGluZyBjYWxscyB0byBGQUxTRSB3aGVuCisJd2UgcmVtb3ZlIHRoZSB0aW1lb3V0IGZyb20gdGhlIGNvbm5lY3Rpb24KKworMjAwNi0wNy0yMSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogUmVtb3ZlZCBzb21lIGV4dHJhIGJpbmRpbmdzIHN0dWZmIGxpbmdlcmluZyBhcm91bmQgKHRoYW5rcyB0aW1vKQorCSogZGJ1cy1wZW5kaW5nY2FsbC5jIChfZGJ1c19wZW5kaW5nX2NhbGxfbmV3KTogCisJcy9kYnVzX2Nvbm5lY3Rpb25fcmVmL19kYnVzX2Nvbm5lY3Rpb25fcmVmX3VubG9ja2VkIGZpeGVzIGFzc2VydGlvbgorCXdoZW4gd2UgdHJpZWQgdG8gdGFrZSBhIGxvY2sgb24gYW4gYWxyZWFkeSBsb2NrZWQgY29ubmVjdGlvbgorCisyMDA2LTA3LTE3ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBSZWxlYXNlZCAwLjkwCisKKzIwMDYtMDctMTcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5jIChfZGJ1c190eXBlX3RvX3N0cmluZyk6IHN1cHBvcnQgNjQtYml0CisJaW50cywgcmVwb3J0ZWQgYnkgT3dlbiBUYXlsb3IKKworMjAwNi0wNy0xNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZG9jL1RPRE86CisJKiBkYnVzL2RidXMtYnVzLmM6CisJKiBkYnVzLWVycm9ycy5jOgorCSogZGJ1cy9kYnVzLW1hcnNoYWwtdmFsaWRhdGUuYzoKKwkgIFJlbW92ZWQgVE9ETyBpdGVtcyB3aGljaCB3ZXJlIGZpeGVkIG9yIGFyZSBubyBsb25nZXIgcmVsZXZlbnQKKworMjAwNi0wNy0xNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy1xdDQtMS5wYy5pbiwgZGJ1cy1zaGFycC5wYy5pbjoKKwlSZW1vdmUgc3RyYXkgZmlsZXMgZnJvbSB0aGUgc3RyaXBwZWQgYmluZGluZ3MKKworMjAwNi0wNy0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1wZW5kaW5nLWNhbGwuYyAoX2RidXNfcGVuZGluZ19jYWxsX3NldF90aW1lb3V0X2Vycm9yKToKKwlJbXByb3ZlIHRoZSBlcnJvciBtZXNzYWdlIG9uIHJlcGx5IHRpbWVvdXQKKworMjAwNi0wNy0xNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogUmVtb3ZlIGFsbCBiaW5kaW5ncworCisyMDA2LTA3LTEzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSk6IHJldHVybiBUUlVFCisJYW5kIHNldCBwZW5kaW5nX3JlcGx5IG91dCBhcmcgdG8gTlVMTCBpcyBjb25uZWN0aW9uIGlzIGRpc2Nvbm5lY3RlZAorCShjb25uZWN0aW9uX3RpbWVvdXRfYW5kX2NvbXBsZXRlX2FsbF9wZW5kaW5nX2NhbGxzX3VubG9ja2VkKTogTmV3CisJc3RhdGljIG1ldGhvZCBmb3IgY2xlYW5pbmcgdXAgcGVuZGluZyBjYWxscyBvbiBkaXNjb25uZWN0CisJKF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCk6IElmIHdlIGhhdmUgcGVuZGluZyAKKwljYWxscyBxdWV1ZWQgdGltZW91dHMgb24gZGlzY29ubmVjdCAKKworCSAqIGRidXMvZGJ1cy1wZW5kaW5nLWNhbGwuYyAoX2RidXNfcGVuZGluZ19jYWxsX3NldF9jb25uZWN0aW9uKToKKwlSZW1vdmUgCisKKzIwMDYtMDctMTMgIENhcmxvcyBHYXJjaWEgQ2FtcG9zICA8Y2FybG9zZ2NAZ25vbWUub3JnPgorCisJKiBidXMvYWN0aXZhdGlvbi5bY2hdIChidXNfYWN0aXZhdGlvbl9saXN0X3NlcnZpY2VzKTogbmV3IGZ1bmN0aW9uIHRvIAorCWdldCB0aGUgbGlzdCBvZiBzZXJ2aWNlcyB0aGF0IGNhbiBiZSBhY3RpdmF0ZWQKKworCSogYnVzL2Rpc3BhdGNoLmM6IHRlc3QgY292ZXJhZ2UgZm9yIHRoZSBuZXcgYnVzIG1ldGhvZAorCUxpc3RBY3RpdmF0YWJsZU5hbWVzCisKKwkqIGJ1cy9kcml2ZXIuYzogbmV3IGJ1cyBtZXRob2QgTGlzdEFjdGl2YXRhYmxlTmFtZXMgdG8gZ2V0IHRoZSBsaXN0IG9mCisJc2VydmljZXMgdGhhdCBjYW4gYmUgYWN0aXZhdGVkCisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBMaXN0QWN0aXZhdGFibGVOYW1lcyBtZXRob2QgZG9jdW1lbnRhdGlvbgorCisyMDA2LTA3LTEyICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCSogZGJ1cy9NYWtlZmlsZS5hbTogYWRkIGRidXMtcGVuZGluZy1jYWxsLWludGVybmFsLmggdG8gdGhlIGxpc3Qgb2YKKwlzb3VyY2UgZmlsZXMKKworMjAwNi0wNy0xMiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWZhY3RvcnkuYzoKKwlGaXggaW5kZXggaW50byBhbiBhcnJheSAocGF0Y2ggYnkgUGV0ZXIgS8O8bW1lbCA8c3ludGhldGljcHAgYXQgZ214Lm5ldD4pCisKKzIwMDYtMDctMTIgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oOgorCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzoKKwkqIGZpbGUgZGJ1cy9kYnVzLXBlbmRpbmctY2FsbC5jOgorCSogZGJ1cy9kYnVzLXBlbmRpbmctY2FsbC5oOgorCU1ha2UgREJ1c1BlbmRpbmdDYWxsIGFuIG9wYXF1ZSB0eXBlIGV2ZW4gdG8gRC1CdXMgaW50ZXJuYWxzCisKKzIwMDYtMDctMDcgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmg6IHJlbW92ZSBjb25uZWN0aW9uX2Rpc2Nvbm5lY3QgYW5kIHJlcGxhY2Ugd2l0aAorCWNvbm5lY3Rpb25fY2xvc2UKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzogaW5jbHVkZSBkYnVzLWJ1cy5oCisJKF9kYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZV9kaXNwYXRjaCk6IG1ha2Ugc3RhdGljCisKKzIwMDYtMDctMDcgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9jbG9zZSk6IHJlbW92ZWQgZGVwcmVjYXRlZAorCWZ1bmN0aW9uCisJKGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCk6IE9uIGRpc2Nvbm5lY3QgdW5yZWYgYW55IHNoYXJlZCBjb25uZWN0aW9ucworCisJKiBkYnVzL2RidXMtYnVzLmMgKF9kYnVzX2J1c19jaGVja19jb25uZWN0aW9uX2FuZF91bnJlZik6IG5ldyBmdW5jdGlvbgorCWZvciBjbGVhbmluZyB1cCBzaGFyZWQgY29ubmVjdGlvbnMgb24gZGlzY29ubmVjdAorCShpbnRlcm5hbF9idXNfZ2V0KTogZ2V0IGEgaGFyZCByZWZyZW5jZSB0byBzaGFyZWQgY29ubmVjdGlvbnMgd2hlbgorCXRoZXkgYXJlIGNyZWF0ZWQKKwkKKwkqIGRvYy9UT0RPOiBSZW1vdmUgaXRlbXMgd2hpY2ggYXJlIG5vIGxvbmdlciByZWxldmVudCBvciBoYXZlIGJlZW4gZml4ZWQKKwlTcGxpdCAxLjAgdG9kbyBpdGVtcyB3aXRoIGEgMC45MCBmcmVlemUgdG9kbyBsaXN0CisgCisyMDA2LTA2LTE0ICBSb3NzIEJ1cnRvbiAgPHJvc3NAb3BlbmVkaGFuZC5jb20+CisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmM6CisJRnJlZSBhIGxlYWtpbmcgR0FycmF5IChzdXJlbHkgbm90ISkgaW4gZGJ1c19nX21ldGhvZF9yZXR1cm4uCisKKzIwMDYtMDYtMTQgIFJvc3MgQnVydG9uICA8cm9zc0BvcGVuZWRoYW5kLmNvbT4KKworCSogdG9vbHMvTWFrZWZpbGUuYW06CisJKiB0b29scy9kYnVzLW1vbml0b3IuYzoKKwlEb24ndCB1c2UgdGhlIEdMaWIgYmluZGluZ3MgaW4gZGJ1cy1tb25pdG9yIChwYXRjaCBmcm9tIFJhbGYKKwlIYWJhY2tlcikuCisJCisyMDA2LTA2LTE0ICBSb3NzIEJ1cnRvbiAgPHJvc3NAb3BlbmVkaGFuZC5jb20+CisKKwkqIHRvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5jOgorCUFsc28gcHJpbnQgdGhlIG9iamVjdCBwYXRoIHdoZW4gb3V0cHV0dGluZyBzaWduYWxzIG9yIG1ldGhvZCBjYWxscy4KKworMjAwNi0wNi0xMyAgVGhpYWdvIE1hY2llaXJhIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogcXQvc3JjL01ha2VmaWxlLmFtOiBpbnN0YWxsIHRoZSBxZGJ1cy5oIGhlYWRlci4KKwlUaGlzIGFsbG93cyBwZW9wbGUgdG8gYWN0dWFsbHkgdXNlIHRoZSBpbnN0YWxsZWQgY29kZS4KKworMjAwNi0wNi0xMiAgUm9zcyBCdXJ0b24gIDxyb3NzQG9wZW5lZGhhbmQuY29tPgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmM6CisJRG9uJ3QgbGVhayBhIEdBcnJheSB3aGVuIGZpcmluZyBzaWduYWxzICh0aGFuayBSb2IgVGF5bG9yIGZvciByZXZpZXcpLgorCisyMDA2LTA2LTEyICBUaGlhZ28gTWFjaWVpcmEgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBSZWxlYXNlZCAwLjYyCisKKzIwMDYtMDYtMTIgIFRoaWFnbyBNYWNpZWlyYSA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIGRidXMvZGJ1cy1hcmNoLWRlcHMuaC5pbjogUmVtb3ZlIHNwdXJpb3VzIHNlbWktY29sb25zIHRoYXQKKyAgICAgICAgYnJlYWsgcGVkYW50aWMgYnVpbGRzLiBDbG9zZXMgYnVnIDYwNDMgKHBhdGNoIGFwcHJvdmVkIGJ5CisgICAgICAgIEhhdm9jIGJhY2sgaW4gRmVicnVhcnkpLgorCisyMDA2LTA2LTEyICBUaGlhZ28gTWFjaWVpcmEgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC9zcmMvcWRidXNpbnRlZ3JhdG9yLmNwcDogRml4IGJ1ZyBpbiBwYXJzaW5nIGFzeW5jIG1ldGhvZHMKKyAgICAgICAgdGhhdCB0b29rIGEgUURCdXNNZXNzYWdlIHBhcmFtZXRlci4KKwkqIHF0L3NyYy9xZGJ1c2J1cy5oOiBBZGQgYSBkZWZhdWx0IGZsYWcgZm9yIFJlcXVlc3ROYW1lLgorCSogcXQvdG9vbHMvZGJ1cy5jcHA6IERvbid0IHVzZSBhdXRvbWF0aWMgY2FsbCBiZWNhdXNlIHdlIG1pZ2h0CisgICAgICAgIGJlIGNhbGxpbmcgYW4gYXN5bmMgbWV0aG9kOiByZXF1ZXN0IGEgcmVwbHkuCisKKzIwMDYtMDYtMTEgIFRoaWFnbyBNYWNpZWlyYSA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHRlc3QvcXQvKjogVXBkYXRlIHRoZSB0ZXN0Y2FzZXMsIGluY2x1ZGluZyB0ZXN0aW5nIHRoZSBuZXcKKyAgICAgICAgZnVuY3Rpb25hbGl0eSBvZiBzZW5kaW5nIG51bGwgUUJ5dGVBcnJheSBhbmQgUVN0cmluZyBvdmVyIHRoZQorICAgICAgICBidXMuIEFkZCBuZXcgaGVhZGVydGVzdCB0ZXN0IGFuZCByZXN0b3JlIHRoZSBvbGQKKyAgICAgICAgcWRidXN4bWxwYXJzZXIgdGVzdC4KKworMjAwNi0wNi0xMSAgVGhpYWdvIE1hY2llaXJhIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogcXQvdG9vbHMvZGJ1c2NwcDJ4bWwuY3BwOiBDb21waWxlIG9uIFdpbmRvd3MuCisJKiBxdC90b29scy9kYnVzaWRsMmNwcC5jcHA6IEFkZCBtaXNzaW5nIG5ld2xpbmUuCisKKwkqIHF0L2V4YW1wbGVzL01ha2VmaWxlLmFtOgorCSogcXQvZXhhbXBsZXMvY2hhdC5oOiBVc2UgVUktZ2VuZXJhdGVkIGZpbGVzIHdpdGggdGhlIHVpXyouaAorCWZvcm0uCisKKwkqIHF0L3NyYy9xZGJ1c21hcnNoYWxsLmNwcDogQWxsb3cgc2VuZGluZyBvZiBRU3RyaW5nKCkgYW5kCisJUUJ5dGVBcnJheSgpIChudWxscykgb3ZlciB0aGUgYnVzLgorCSogcXQvc3JjL3FkYnVzYWJzdHJhY3RpbnRlcmZhY2UuY3BwOiBVc2UgdGhlIGNvcnJlY3QgdmFyaWFibGUsCisJdGhlIG9uZSB0aGF0IGhhcyB0aGUgc2lnbmF0dXJlIHN1ZmZpeCBzdHJpcHBlZC4KKwkqIHF0L3NyYy9xZGJ1c3JlcGx5Lmg6IE1ha2Ugc29tZSBtZXRob2RzIGNvbnN0LgorCisyMDA2LTA2LTA5ICBUaGlhZ28gTWFjaWVpcmEgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJUGF0Y2ggZnJvbSBUaW1vIEhvZW5pZyA8dGhvZW5pZ0BzdXNlLmRlPi4KKworCSogcXQvZGJ1cy9NYWtlZmlsZS5hbTogTmV3IGZpbGUuICBGaXggIm1ha2UgZGlzdCIsIGFkZCBhbGwgaGVhZGVycworCXJlcXVpcmVkIGR1cmluZyBidWlsZCB0byBFWFRSQV9ESVNULgorCSogcXQvc3JjL01ha2VmaWxlLmFtOiBGaXggIm1ha2UgZGlzdCIsIGFkZCAncWRidXMuaCcgdG8gRVhUUkFfRElTVC4KKwkqIHF0L01ha2VmaWxlLmFtOiBGaXggIm1ha2UgZGlzdCIsIGFkZCAnZGJ1cycgdG8gRElTVF9TVUJESVJTLgorCSogY29uZmlndXJlLmluOiBGaXggIm1ha2UgZGlzdCIsIHRha2UgY2FyZSB0aGF0IHRoZSBNYWtlZmlsZSBmb3IKKwlxdC9kYnVzIGlzIGJlaW5nIGdlbmVyYXRlZC4KKworMjAwNi0wNi0wNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogYnVzL2J1cy5jOiBGaXggZWF2ZXNkcm9wcGluZyBvbiBtZXRob2QgY2FsbHMKKworMjAwNi0wNi0wNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOgorCSogZGJ1cy9kYnVzLXVzZXJkYi11dGlsLmM6CisJQWRkIFNvbGFyaXMgY29uc29sZSBvd25lciBwYXRjaCBmcm9tIEFydGVtIEthY2hpdGNoa2luZQorCisyMDA2LTA2LTA3ICBUaGlhZ28gTWFjaWVpcmEgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC9NYWtmaWxlLmFtOgorCSogcXQvc3JjL01ha2VmaWxlLmFtOiBGaXggdGhlIEVYVFJBX0RJU1QgYWZ0ZXIgdGhlCisJcmVvcmdhbmlzYXRpb24uIFRoYW5rcyB0byBUaW1vIEhvZW5pZyBmb3IgcG9pbnRpbmcgdGhpcyBvdXQuCisKKzIwMDYtMDYtMDYgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogZ2xpYi9kYnVzLWd0eXBlLXNwZWNpYWxpemVkLmM6IEZpeCBvYnZpb3VzIGxlYWsgb2YgR0FycmF5IGluIGV2ZXJ5CisJICBjYWxsIHRvIGRidXNfZ190eXBlX2dldF9zdHJ1Y3QuCisKKzIwMDYtMDYtMDYgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS11dGlscy5jOiBGaXggdGhlIGZhaWxpbmcgdGVzdCB3aGVyZSBzdGF0aWMgc3RyaW5nCisJICBwb2ludGVycyB3ZXJlIHB1dCBpbnRvIGEgR1B0ckFycmF5LWJhc2VkIHNwZWNpYWxpc2VkIGNvbGxlY3Rpb24sIGFuZAorCSAgdGhlbiBmcmVlZCBhbG9uZyB3aXRoIHRoZSBhcnJheS4gR1ZhbHVlcyB3aGljaCB5b3UgYWRkIGludG8KKwkgIGNvbGxlY3Rpb25zIG9yIG1hcHMgd2hpY2ggaGF2ZSB0aGUgTk9DT1BZIGZsYWcgc2V0IGFyZSBhc3N1bWVkIHRvIG5vdAorCSAgYmVsb25nIHRvIHRoZSBjYWxsZXIsIHNvIHJhdGhlciB0aGFuIHRoZSBleGlzdGluZyBwb2ludGVyLXN0ZWFsaW5nCisJICBzZW1hbnRpY3MsIHRoZXkgYXJlIGNvcGllZCBpbnN0ZWFkLiBHaXZlbiB0aGF0IHRoZSBtYWluIGNvbnN1bWVycyBvZgorCSAgdGhpcyBhYnN0cmFjdGlvbiBhcmUgdGhlIGJpbmRpbmdzIHRoZW1zZWx2ZXMsIEkgZG9uJ3QgdGhpbmsgdGhpcyBpcworCSAgdG9vIGJhZCwgYnV0IG90aGVycyBzaG91bGQgd2F0Y2ggdGhlaXIgY2hvaWNlIG9mIHRha2UgdnMgc2V0X3N0YXRpYy4KKworMjAwNi0wNi0wNiAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLXV0aWxzLmM6IFNwb3R0ZWQgYSB3YXJuaW5nIGFib3V0IHRoZSByZXR1cm4gdmFsdWUKKwkgIG9mIGdfc2xpc3RfcHJlcGVuZCBub3QgYmVpbmcgdXNlZC4gRml4ZWQgY29weWluZyBvZiBzbGlzdC1iYXNlZAorCSAgc3BlY2lhbGlzZWQgY29sbGVjdGlvbnMsIHRoZW4gd3JvdGUgYSB0ZXN0IGNhc2UgYW5kIGZvdW5kIHRoYXQgaXQgd2FzCisJICBhbGwgYnJva2VuLiBXZW50IG9uIHRvIGZpeCBpdGVyYXRpbmcgYW5kIGFwcGVuZGluZyB0b28uIEdvb2QgdGhpbmcKKwkgIG5vYm9keSB1c2VzIHRoaXMgY29kZSB5ZXQuCisKKzIwMDYtMDYtMDYgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS11dGlscy5jOiBSZW1vdmUgZHVwbGljYXRlZCBjb2RlIGJ5IGhhdmluZyBhbGwgb2YKKwkgIHRoZSBpdGVyYXRvcnMgdXNlIGd2YWx1ZV90YWtlX3B0cmFycmF5X3ZhbHVlICh0aGUgR1ZhbHVlcyB0aGVtc2VsdmVzCisJICBhcmUgZGlzY2FyZGVkIHdpdGhvdXQgdW5zZXR0aW5nLCBzbyBpdCBtYWtlcyBubyBkaWZmZXJlbmNlIHdoZXRoZXIKKwkgIHdlIHRha2Ugb3Igc2V0X3N0YXRpYykuIFJlbW92ZSBjYXNlcyBmb3IgR19UWVBFX1BPSU5URVIgYmVjYXVzZQorCSAgdGhlcmUgcmVhbGx5IGlzIG5vdGhpbmcgdXNlZnVsIHdlIGNhbiBkbyB3aXRoIHRoZW0gaW4gb3VyCisJICBzcGVjaWFsaXNlZCB0eXBlcyAtIHdlICpuZWVkKiBib3hlZCBjb3B5L2ZyZWUgZnVuY3Rpb25zIGF0IHRoZSB2ZXJ5CisJICBsZWFzdC4KKworMjAwNi0wNi0wNSAgVGhpYWdvIE1hY2llaXJhIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogcXQvZGJ1czogQWRkIGRpcmVjdG9yeS4gSSBoYWQgZm9yZ290dGVuIHRvIGFkZCB0aGlzCisJeWVzdGVyZGF5IGFmdGVyIHRoZSBtb3ZlLi4uCisKKwkqIHF0L2V4YW1wbGVzL01ha2VmaWxlLmFtOgorCSogcXQvZXhhbXBsZXMvZGJ1cy5jcHA6IE1vdmVkIHRvIHF0L3Rvb2xzL2RidXMuY3BwLgorCisJKiBxdC90b29scy9NYWtlZmlsZS5hbToKKwkqIHF0L3Rvb2xzL2RidXMuY3BwOiBNb3ZlZCBmcm9tIHF0L2V4YW1wbGVzL2RidXMuY3BwLgorCUFkZGVkIGZlYXR1cmUgdG8gZ2V0IGFuZCBzZXQgcHJvcGVydGllcy4KKwlBZGRlZCB2YWxpZGF0aW9uIG9mIHNlcnZpY2UsIG9iamVjdCBwYXRoIGFuZCBpbnRlcmZhY2UgbmFtZXMuCisKKwkqIHF0L3Rvb2xzL2RidXNpZGwyY3BwLmNwcDogVHdvIG5ldyBmZWF0dXJlczoKKwkxKSBBbGxvdyBzcGVjaWZ5aW5nIGJvdGggdGhlIGhlYWRlciBhbmQgdGhlIHNvdXJjZSBmaWxlIG5hbWVzLAorCWJ5IHNlcGFyYXRpbmcgdGhlbSB3aXRoIGEgY29sb24uCisJMikgRG9uJ3Qgd3JpdGUgYW4gaW50ZXJmYWNlIG91dHB1dCBpZiB0aGUgLXAgc3dpdGNoIHdhc24ndAorCWdpdmVuLCBidXQgdGhlIC1hIHdhcy4KKworCSogcXQvc3JjLyo6IEZpeCB1c2FnZSBvZiBJdGVyYXRvcnMgYW5kIENvbnN0SXRlcmF0b3JzLgorCUZpeCBzaGFkb3dpbmcgb2YgdmFyaWFibGVzIGJ5IG90aGVyIHZhcmlhYmxlcyAoLVdzaGFkb3cpLgorCUZpeCBrZXl3b3JkLWNsZWFubGluZXNzIGluIGhlYWRlcnMuCisJRml4IEFTQ0lJLWNhc3QgKFFMYXRpbjFTdHJpbmcsIFFMYXRpbjFDaGFyKS4KKwlGaXggdmFsaWRhdGlvbiBvZiBtZW1iZXIgbmFtZXMuCisJQWRkIGV4dHJhIGNoZWNraW5nIG9mIGludHJvc3BlY3Rpb24gZGF0YSBkdXJpbmcgWE1MIHBhcnNpbmcuCisJVmFyaW91cyBidWcgZml4ZXMuCisKKzIwMDYtMDYtMDQgIFRoaWFnbyBNYWNpZWlyYSA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIGRidXMvTWFrZWZpbGUuYW06CisJKiBkYnVzL3FkYnVzLmg6IFJlbW92ZSB1bm5lY2Vzc2FyeSBmaWxlLiBUaGlzIGlzIG1pcnJvcmVkIGludG8KKyAgICAgICAgcXQvZGJ1cy9xZGJ1cy5oIG5vdy4KKworMjAwNi0wNi0wNCAgVGhpYWdvIE1hY2llaXJhIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogY29uZmlndXJlLmluOiBNYWtlIC0tZGlzYWJsZS1xdCBhY3R1YWxseSBkbworICAgICAgICAgIHNvbWV0aGluZy4gUGF0Y2ggaW5zcGlyZWQgYnkgWmFjayBSdXNpbi4KKworMjAwNi0wNi0wNCAgVGhpYWdvIE1hY2llaXJhIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogcXQvOiBVcGRhdGUgdG8gU3VidmVyc2lvbiByNTQ4MDMyLgorCVRoaXMgaW5jbHVkZXMgYSBiaWcgcmVvcmdhbmlzYXRpb24gb2YgdGhlIGZpbGVzIGluc2lkZSB0aGUKKwlzdWJkaXIuCisKKzIwMDYtMDUtMzAgIFNqb2VyZCBTaW1vbnMgIDxzam9lcmRAbHVvbi5uZXQ+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmM6IE1ha2UgdGNwIHNvY2tldCBjb25uZWN0aW9uIGVycm9yIHNvbWV3aGF0IG1vcmUKKwljbGVhcjogIAorCSJGYWlsZWQgdG8gY29ubmVjdCB0byBzb2NrZXQgPGhvc3Q+Ojxwb3J0PiA8ZXJyb3I+IiBpbnN0ZWFkIG9mCisJIkZhaWxlZCB0byBjb25uZWN0IHRvIHNvY2tldCA8aG9zdD46IDxlcnJvcj46PHBvcnQ+IgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYzogRml4IGNyYXNoIHdoZW4gbm8gaG9zdCBvcHRpb24gaXMgZ2l2ZW4KKwlmb3IgYSB0Y3AgdHJhbnNwb3J0LiAKKworMjAwNi0wNS0yOSAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0Lyo6IFVwZGF0ZSB0aGUgUXREQnVzIGJpbmRpbmdzIHVwIHRvIHJldmlzaW9uIDU0NjMxMCBpbgorICAgICAgICBTdWJ2ZXJzaW9uLgorCVRoaXMgYWRkcyB0aGUgZGJ1c2NwcDJ4bWwgdG9vbCwgdGhhdCBwYXJzZXMgYSBDKysgaGVhZGVyIGFuZAorICAgICAgICBvdXRwdXRzIGEgRC1CVVMgSW50cm9zcGVjdGlvbiBYTUwuCisKKzIwMDYtMDUtMjEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmM6IFB1dCBpbiBhIHBpbGUgb2YgYXNzZXJ0aW9ucyB0aGF0IHRoZSBwcm94eSBuYW1lCisJaXMgbm90IE5VTEwgd2hlbiBpdCBzaG91bGRuJ3QgYmUuIEFsc28gYSBjb3VwbGUgb2YgcG9zc2libGUgZml4ZXMKKwlmb3IgIzQ2MzcgdGhvdWdoIEkgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgdGhlIGJ1ZyBoYXBwZW5zLCB0byBiZQorCWhvbmVzdC4uLiBhbHNvIHRoZSBvYmplY3QgY29uc3RydWN0b3IgaGFzIGFuIGFzc2VydCBuYW1lICE9IE5VTEwKKwlhbmQgdGhlIG5hbWUgaXMgb25seSBjdXJyZW50bHkgTlVMTCBmb3IgcGVlci10by1wZWVyIHByb3hpZXMgdGhhdCAKKwlJIGRvbid0IHRoaW5rIGFueW9uZSB1c2VzPyBTbyBpdCBzaG91bGQgYmUgYXNzZXJ0aW5nLgorCUFueXdheSwgZm9yIG5vdyBhdCBsZWFzdCBzZWUgaWYgd2UgZ2V0IGFuIGVhcmxpZXIgYXNzZXJ0aW9uIGZhaWx1cmUuCisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUtdXRpbHMuYzogUHV0IGluIGEgY291cGxlIG9mIGFzc2VydGlvbnMgZm9yCisJYXBwYXJlbnRseSBicm9rZW4gY29kZSB0byBiZSBzdXJlIHRoZSB0ZXN0cyBmYWlsIGFuZCBzb21lb25lIAorCXdpbGwgZml4IHRoZW0uLi4KKworMjAwNi0wNS0wNyAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0L3FkYnVzbWFyc2hhbGwuY3BwOiBGaXggYSBwcm9ibGVtIG9mIGRlbWFyc2hhbGxpbmcgbGlzdHMKKyAgICAgICAgYW5kIGFycmF5cyB3aGVuIHRoZXkgaGFkIGEgc2luZ2xlIGVsZW1lbnQ6IGhhc19uZXh0IHJldHVybnMKKyAgICAgICAgZmFsc2UsIGV2ZW4gYmVmb3JlIHlvdSByZWFkIHRoZSBlbGVtZW50LiBTbywgaW5zdGVhZCwgY2hlY2sKKyAgICAgICAgdGhlIGFycmF5IGxlbmd0aC4KKworMjAwNi0wNS0wNiAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0L3FkYnVzbWVzc2FnZS5jcHA6CisJKiBxdC9xZGJ1c3R5cGVoZWxwZXJfcC5oOgorCSogcXQvcWRidXNpbnRlZ3JhdG9yLmNwcDogZ2NjIDMuNCBkb2Vzbid0IGxpa2UgUV9GT1JFQUNIIHdoZW4KKwl0aGUgbGlzdCBpcyBhIGNvbnN0LXJlZmVyZW5jZQorCisyMDA2LTA1LTAzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBBZGRpbmcgb2xkIGRvYyBwYXRjaCB0aGF0IG5ldmVyIGdvdCBhcHBsaWVkCisJCisJKiBkYnVzL2J1cy5jIChkYnVzX2J1c19hZGRfbWF0Y2gpOiBBZGQgZG9jdW1lbnRhdGlvbgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogQWRkIGRvY3VtZW50YXRpb24gZm9yIHRoZSBtYXRjaCBydWxlcworCSAgYW5kIHRoZSBBZGRNYXRjaCBhbmQgUmVtb3ZlTWF0Y2ggbWV0aG9kcworCisyMDA2LTA1LTAyICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogcXQvZGJ1c2lkbDJjcHAuY3BwOiBUaGVyZSdzIG5vIGNhbGxBc3luYy4gVXNlIHRoZSBjb3JyZWN0CisgICAgICAgIGNhbGwgKHI1MzU1MDYpCisKKwkqIHF0L2RidXNpZGwyY3BwLmNwcDoKKwkqIHF0L3FkYnVzYWJzdHJhY3RhZGFwdG9yLmNwcDoKKwkqIHF0L3FkYnVzYWJzdHJhY3RhZGFwdG9yLmg6IE1ha2UgUURCdXNBZGFwdG9yQ29ubmVjdG9yIGJlIGEKKyAgICAgICAgc2libGluZyBvZiB0aGUgUURCdXNBYnN0cmFjdEFkYXB0b3Igb2JqZWN0cyBpbnN0ZWFkIG9mIHRoZQorICAgICAgICBwYXJlbnQuIChyNTM1ODQ4KQorCisJKiBxdC9kYnVzaWRsMmNwcC5jcHA6CisJKiBxdC9xZGJ1c2Fic3RyYWN0aW50ZXJmYWNlLmNwcDoKKwkqIHF0L3FkYnVzYWJzdHJhY3RpbnRlcmZhY2UuaDoKKwkqIHF0L3FkYnVzYWJzdHJhY3RpbnRlcmZhY2VfcC5oOgorCSogcXQvcWRidXNpbnRlcmZhY2UuY3BwOiBNYWtlIHByb3BlcnRpZXMgaW4gaW50ZXJmYWNlcworICAgICAgICBhY3R1YWxseSB3b3JrLiBUaGUgY29kZSB0aGF0IHdhcyBnZW5lcmF0ZWQgd291bGQgbm90IGNvbXBpbGUsCisgICAgICAgIGR1ZSB0byBtb2MgY2FsbHMgdG8gZnVuY3Rpb25zIHRoYXQgZGlkIG5vdCBleGlzdC4gVGhleSBub3cKKyAgICAgICAgc2hhbGwuIChyNTM2NTcxKQorCisyMDA2LTA0LTMwICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogTWFrZWZpbGUuYW06CisJKiBjb25maWd1cmUuaW46CisJKiBkYnVzLXF0NC0xLnBjLmluOiBBZGQgYSBwa2ctY29uZmlnIGZpbGUgZm9yIGxpYmRidXMtcXQ0LTEuCisJVGhhbmtzIHRvIEJyYWQgSGFyZHMgZm9yIHByb3ZpZGluZyB0aGUgcGF0Y2gKKworMjAwNi0wNC0yOSAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0L2RidXNpZGwyY3BwLmNwcDogVGhlcmUncyBubyBjYWxsQXN5bmMuIFVzZSB0aGUgY29ycmVjdAorICAgICAgICBjYWxsLiAocjUzNTUwNikKKworMjAwNi0wNC0yOSAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0L2V4YW1wbGVzL2RidXMuY3BwOiBFbmhhbmNlIGVycm9yIG1lc3NhZ2VzIGFuZCB1c2UKKyAgICAgICAgUURCdXNJbnRlcmZhY2VQdHIuCisKKzIwMDYtMDQtMjkgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC9xZGJ1c2ludGVyZmFjZS5oOiBSZW5hbWUgUURCdXNSZWYgdG8gUURCdXNJbnRlcmZhY2VQdHIKKyAgICAgICAgYW5kIGRpc2FibGUgdGhlIGNvcHkgb3BlcmF0b3JzLiAocjUzMzc3MiwgcjUzNDc0NikKKworCSogcXQvcWRidXNlcnJvci5oOiBSZW1vdmUgdGhlIGF1dG9tYXRpYyBjYXN0IHRvIGJvb2wuIChyNTMzOTI5KQorCisJKiBxdC9xZGJ1c2Fic3RyYWN0aW50ZXJmYWNlLmNwcDoKKwkqIHF0L3FkYnVzYWJzdHJhY3RpbnRlcmZhY2UuaDogQ2hhbmdlIHRoZSBkZWZhdWx0IGNhbGwgbW9kZSB0bworICAgICAgICBub3QgdXNlIHRoZSBldmVudCBsb29wLiBBZGQgY29udmVuaWVuY2UgY2FsbCgpIG1ldGhvZHMgdGhhdAorICAgICAgICB0YWtlIGEgQ2FsbE1vZGUgcGFyYW1ldGVyLiAocjUzNDA0MikKKworCSogcXQvcWRidXNjb25uZWN0aW9uLmg6IENoYW5nZSB0aGUgZGVmYXVsdCBjYWxsIG1vZGUgdG8gbm90CisgICAgICAgIHVzZSB0aGUgZXZlbnQgbG9vcC4gKHI1MzQwNDIpCisKKwkqIHF0L3FkYnVzaW50ZXJmYWNlLmNwcDoKKwkqIHF0L3FkYnVzaW50ZXJmYWNlLmg6IEFkZCBhIG1ldGhvZCB0byB0ZWxsIHVzIGlmIHRoZQorCWludGVyZmFjZSBpcyB2YWxpZCAoc2luY2Ugd2UgZG9uJ3QgcmV0dXJuIGEgbnVsbCBwb2ludGVyCisJYW55bW9yZSkgKHI1MzQwOTkpCisKKwkqIHF0L3FkYnVzaW50ZXJmYWNlX3AuaDogRG9uJ3QgY3Jhc2ggaWYgbWV0YU9iamVjdCBpcyAwCisgICAgICAgIChyNTM0MTAxKQorCisJKiBxdC9xZGJ1c2ludGVybmFsZmlsdGVycy5jcHA6IERlY291cGxlIHRoZSBpbnRyb3NwZWN0aW9uCisgICAgICAgIGZ1bmN0aW9uIGluIHR3byBzbyB0YWh0IHdlIGdldCB0aGUgY2hhbmNlIHRvIGludHJvc3BlY3QKKyAgICAgICAgd2l0aG91dCBoYXZpbmcgYSBRREJ1c01lc3NhZ2UgKHI1MzQxMDIpCisKKwkqIHF0L3FkYnVzYnVzLmg6CisJKiBxdC9xZGJ1c2Nvbm5lY3Rpb24uY3BwOgorCSogcXQvcWRidXNjb25uZWN0aW9uX3AuaDoKKwkqIHF0L3FkYnVzaW50ZWdyYXRvci5jcHA6IEtlZXAgYSBsaXN0IG9mIG91ciBvd24gbmFtZXMgdG8KKyAgICAgICAgYXZvaWQgYSByb3VuZC10cmlwIHRvIHRoZSBzZXJ2ZXIgd2hlbiBhdHRlbXB0aW5nIHRvIGludHJvc3BlY3QKKyAgICAgICAgb25lIG9mIG91ciBvd24gb2JqZWN0cy4gQWxzbyBtYWtlIHN1cmUgdGhlIGZpbHRlciBmdW5jdGlvbnMKKyAgICAgICAgbWF0Y2ggdGhlIGVtcHR5IGludGVyZmFjZSBhcyB3ZWxsLiAocjUzNDEwOCkKKwlEb24ndCBrZWVwIHRoZSBjb25uZWN0aW9uIG5hbWVzLiBJbnN0ZWFkLCB0cnVzdCB0aGUgdW5pcXVlCisgICAgICAgIGNvbm5lY3Rpb24gbmFtZSAocjUzNDExMSkKKwlSZW1vdmUgZXZlbnQgbG9vcCB1c2FnZSAocjUzNDExMikKKworMjAwNi0wNC0yOSAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0L3FkYnVzaW50ZWdyYXRvci5jcHA6IEZpeCBhc3NlcnRpb24gZmFpbHVyZSBzcG90dGVkIGJ5CisJQnJhZCBIYXJkcy4KKworMjAwNi0wNC0yOCAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmM6IEZpeCBwcm9wZXJ0aWVzIHNvIHRoYXQgdGhleSBjYW4gYmUgZ2l2ZW4gaW4KKwlhbnkgb3JkZXIsIG1ha2luZyBpdCBlYXNpZXIgZm9yIHBlb3BsZSB3aG8gaW5oZXJpdCBmcm9tIHRoaXMKKwlvYmplY3QuCisKKzIwMDYtMDQtMjggIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS11dGlscy5jOiBQYXRjaCBmcm9tIEpha3ViIFN0YWNob3dza2kgdG8gZml4IGxlYWtpbmcKKwlvZiBtZW1vcnkgZnJvbSB3aXRoaW4gcG9pbnRlciBhcnJheXMgYW5kIGxpc3RzLiBGaXhlcyBidWcgIzYzMDAuCisKKzIwMDYtMDQtMjggIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS5jOiBQYXRjaCBmcm9tIEpha3ViIFN0YWNob3dza2kgdG8gZml4IGEgbGVhayBpbgorCWdlbmVyYXRpbmcgc3RydWN0IHNpZ25hdHVyZXMuIEZpeGVzIGJ1ZyAjNjA4My4KKworMjAwNi0wNC0yOCAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBxdC9NYWtlZmlsZS5hbTogVHdlYWsgQ0xFQU5GSUxFUyBmcm9tIHFkYnVzY29ubmVjdGlvbi5tb2MKKwl0byBxZGJ1c2Nvbm5lY3Rpb25fcC5tb2MuCisKKzIwMDYtMDQtMjQgSm9obiAoSjUpIFBhbG1pZXJpIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBSRUFETUUsIElOU1RBTEw6IERvYyBmaXhlcworCVBhdGNoIGZyb20gQnJhZCBIYXJkcyA8YnJhZGggYXQgZnJvZ21vdXRoLm5ldD4KKworMjAwNi0wNC0yMyAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0L2V4YW1wbGVzL2RidXMuY3BwOiBVc2UgdGhlIG5ldyBtZXJnZWQtaW50ZXJmYWNlIG1vZGUgZm9yCisJdGhlIGR5bmFtaWMgbWV0YSBvYmplY3QuIE5vIG5lZWQgdG8gZ3Vlc3Mgd2hpY2ggaW50ZXJmYWNlIHRvCisJY2FsbC4KKworMjAwNi0wNC0yMyAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0L3FkYnVzY29ubmVjdGlvbl9wLmg6CisJKiBxdC9xZGJ1c21ldGFvYmplY3QuY3BwOgorCSogcXQvcWRidXNtZXRhb2JqZWN0X3AuaDoKKwkqIHF0L3FkYnVzaW50ZWdyYXRvci5jcHA6IFVzZSB0aGUgbmV3IG1lcmdlZC1pbnRlcmZhY2UgbW9kZQorCWZvciB0aGUgZHluYW1pYyBtZXRhIG9iamVjdC4gTm8gbmVlZCB0byBndWVzcyB3aGljaAorCWludGVyZmFjZSB0byBjYWxsLgorCSogcXQvcWRidXNhYnN0cmFjdGludGVyZmFjZV9wLmg6CisJKiBxdC9xZGJ1c2Nvbm5lY3Rpb24uY3BwOgorCSogcXQvcWRidXNpbnRlZ3JhdG9yLmNwcDoKKwkqIHF0L3FkYnVzaW50ZXJmYWNlLmNwcDoKKwkqIHF0L3FkYnVzaW50ZXJmYWNlLmg6IE1ha2UgZmluZEludGVyZmFjZSBhbHdheXMgcmV0dXJuIGEgbm9uLW51bGwgcG9pbnRlci4KKwlBZGQgYSBRREJ1c1JlZiB0aGF0IGxvb2tzIGFuZCBiZWhhdmVzIGxpa2UgRENPUFJlZi4KKworMjAwNi0wNC0yMyAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IEludGVyZmFjZXMgYXJlIG9wdGlvbmFsIGluIG1ldGhvZAorICAgICAgICBjYWxscywgc28gZG9uJ3QgZ2l2ZSB1cCBpZiB0aGUgaW50ZXJmYWNlIHBhcmFtZXRlciBpcyBOVUxMLgorCVBhdGNoIHJldmlld2VkIGJ5IEhhdm9jIFBlbm5pbmd0b24uCisKKzIwMDYtMDQtMjMgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC9xZGJ1c3JlcGx5Lmg6IEFkZCBkZWZhdWx0IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0KKyAgICAgICAgICAocjUzMjYyNSkKKwkqIHF0L3FkYnVzdHlwZWhlbHBlcl9wLmg6IFVzZSBhIGNsZWFuIG5hbWVzcGFjZTogbm8gZm9yZWFjaCgpCisgICAgICAgICAgaW4gcHVibGljIGhlYWRlcnMgKHI1MzI5NTIpCisJKiBxdC9xZGJ1c2Fic3RyYWN0aW50ZXJmYWNlLmNwcDoKKwkqIHF0L3FkYnVzYWJzdHJhY3RpbnRlcmZhY2VfcC5oOiBBZGQgdGhlIEF1dG9EZXRlY3QgbW9kZSBhbmQKKyAgICAgICAgICBtYWtlIGl0IHRoZSBkZWZhdWx0IChyNTMyOTUxKQorCisyMDA2LTA0LTE5ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiBGaXggYXNzZXJ0cworCVBhdGNoIGZyb20gVGltIE1vbG9uZXkgPHQubW9sb25leSBhdCB2ZXJpem9uLm5ldD4KKworMjAwNi0wNC0xOSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogbW9uby9Db25uZWN0aW9uLmNzLCBtb25vL01lc3NhZ2UuY3M6IENoZWNrIFRhcmdldCB0eXBlCisJUGF0Y2ggZnJvbSBBYXJvbiBCb2Nrb3ZlciAoYWJvY2tvdmVyIGF0IG5vdmVsbC5jb20pCisKKzIwMDYtMDQtMTMgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBJTlNUQUxMOiBmaW5lLXR1bmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIFF0NCBiaW5kaW5nLgorCisyMDA2LTA0LTE2ICBEYW5pZWwgUC4gQmVycmFuZ2UgIDxkYW5AYmVycmFuZ2UuY29tPgorCisJKiB0b29scy9kYnVzLXByaW50LW1lc3NhZ2UuYzogQWRkZWQgc3VwcG9ydCBmb3IgcHJpbnRpbmcgb2YgYWxsIAorCSAgcmVtYWluaW5nIGRhdGEgdHlwZXMuIEZpeGVkIGxvZ2ljIGZvciBpbmRlbnRhdGlvbiBvZiBjb21wb3VuZAorCSAgZGF0YSB0eXBlcy4KKwkKKzIwMDYtMDQtMTUgIERhbmllbCBQLiBCZXJyYW5nZSAgPGRhbkBiZXJyYW5nZS5jb20+CisKKwkqIElOU1RBTEw6IGZpbGwgb3V0IGNvbnRlbnQgb2YgZmlsZSBwcm92aWRpbmcgREJ1cyBzcGVjaWZpYworCSAgYnVpbGQgaW5zdGFsbGF0aW9ucywgZm9sbG93ZWQgYnkgZ2VuZXJpYyBBdXRvKiBJTlNUQUxMIGZpbGUKKwkgIGNvbnRlbnQKKwkKKzIwMDYtMDQtMTMgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC9xZGJ1c2ludGVncmF0b3IuY3BwOiBXb3JrIGFyb3VuZCBnKysgMy4zIGJ1Zy4KKwkgIFBhdGNoIGJ5IFN0ZWZhbiBFaWxlcnMuIChyNTI5NTM3KQorCisyMDA2LTA0LTEzICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogcXQvcWRidXNpbnRlcm5hbGZpbHRlcnMuY3BwOiBEb24ndCBzaG93IHRoZSBwYXJlbnQncworICAJICBjb250ZW50cyAocjUyODIwOCkKKworMjAwNi0wNC0xMCAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0L01ha2VmaWxlLmFtOiBmaXggdGhlIGRlcGVuZGVuY3kgZm9yCisgICAgICAgICAgcWRidXNjb25uZWN0aW9uX3AubW9jLiBJdCdzIGluY2x1ZGVkIGluIHFkYnVzaW50ZWdyYXRvci5jcHAsCisJICBub3QgaW4gcWRidXNjb25uZWN0aW9uLmNwcC4KKwkgIFRoYW5rcyB0byBKYWt1YiBTdGFjaG93c2tpIDxzdGFjaG93c2tpQGh5cGFpci5uZXQ+IGZvcgorICAgICAgICAgIHNwb3R0aW5nIHRoaXMuCisKKzIwMDYtMDQtMTAgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC9leGFtcGxlcy9saXN0bmFtZXMuY3BwOgorCSogcXQvZXhhbXBsZXMvTWFrZWZpbGUuYW06IFRocmVlIHdheXMgdG8gbGlzdCB0aGUgbmFtZXMgb24gdGhlCisJICBidXMuCisKKzIwMDYtMDQtMTAgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiB0ZXN0L3F0L3RzdF9oYWwuY3BwOiBSZW1vdmUgdGhlIHdhaXRpbmcsIHNpbmNlIGl0J3Mgbm90CisgICAgICAgICAgbmVlZGVkIGFueW1vcmUuIFJlcXVpcmVzIFF0IDQuMS4zIHRvIHdvcmsgcHJvcGVybHkuIChyNTI4MTQ4KQorCisyMDA2LTA0LTEwICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCU1lcmdlIGZyb20gU3VidmVyc2lvbjoKKwkqIHF0L3F0LWRidXMucWRvY2NvbmY6IFVwZGF0ZSBUcm9sbHRlY2gncyB3ZWJwYWdlIGxpbmsgdG8KKwkgIHNvbWV0aGluZyB0aGF0IGV4aXN0cyAocjUyNjMxNSkKKwkqIHF0L3FkYnVzaW50ZXJuYWxmaWx0ZXJzLmNwcDogQ29ycmVjdGx5IGRldGVjdCBub24tc2NyaXB0YWJsZQorCSAgc2xvdHMvc2lnbmFscyAocjUyNjMxNikKKwkqIHF0L3FkYnVzaW50ZXJuYWxmaWx0ZXJzLmNwcDogRml4IHRoZSBzZXRQcm9wZXJ0eSBjYWxsIGFuZAorCSAgYWxzbyByZXR1cm4gYW4gdW5rbm93bi1tZXRob2QgZXJyb3IgaWYgdGhlIHBhcmFtZXRlcnMgZG9uJ3QKKwkgIG1hdGNoIGZvciBvcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzLiAocjUyNjg0MikKKwkqIHF0L2V4YW1wbGVzL2RidXMuY3BwOiBBbGxvdyBwYXNzaW5nIG9mIFFWYXJpYW50cyAocjUyNjg0MykKKwkqIHF0L3FkYnVzaW50ZWdyYXRvci5jcHA6IFJlc3RvcmUgdGhlIHByb3BlciBvcmRlciBvZgorCSAgZGVsaXZlcnk6IGRvbid0IG1ha2UgbWV0aG9kIHJldHVybnMgYmUgZGVsaXZlcmVkIG9uIHByaW9yaXR5CisJICAocjUyODE1MCkKKworMjAwNi0wMy0yOCAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiBxdC9NYWtlZmlsZS5hbTogYWRkIHF0L2V4YW1wbGVzCisJKiBxdC9leGFtcGxlczogQWRkIFF0REJ1cyBleGFtcGxlIHByb2dyYW1zOgorCSAgLSBoZWxsbzogSGVsbG8sIFdvcmxkCisJICAtIHBpbmc6IFNpbXBsZSBtZXRob2QtY2FsbGluZyBwcm9ncmFtCisJICAtIHBvbmc6IFNpbXBsZSBvYmplY3QtZXhwb3J0aW5nIHByb2dyYW0gKG5vdCB1c2luZyBhZGFwdG9ycykKKwkgIC0gY29tcGxleHBpbmc6IEludGVyYWN0aXZlIG1ldGhvZC1jYWxsaW5nIHByb2dyYW0gCisJCShhbHNvIGdldHMgYW5kIHNldHMgcHJvcGVydGllcykuCisJICAtIGNvbXBsZXhwb25nOiBTYW1wbGUgcHJvZ3JhbSBleHBvcnRpbmcgbWV0aG9kcywgc2lnbmFscyBhbmQKKwkJcHJvcGVydGllcywgdXNpbmcgYWRhcHRvcnMuCisJICAtIGRidXM6IFNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBhIGdlbmVyaWMgbWV0aG9kLWNhbGxpbmcKKwkJcHJvZ3JhbSwgc2ltaWxhciB0byAnZGJ1cy1zZW5kJywgYnV0IHdpdGggc2VtYW50aWNzCisJCXNpbWlsYXIgdG8gJ2Rjb3AnLgorCSAgLSBjaGF0OiBTaW1wbGlzdGljIGNoYXQgcHJvZ3JhbSwgaW1wbGVtZW50ZWQgdXNpbmcgc2lnbmFscworCQlhbmQgdGhlIHN5c3RlbSBidXMuIExvb2tzIGxpa2UgSVJDLgorCisyMDA2LTAzLTI4ICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogY29uZmlndXJlLmluOiBEZXRlY3QgUXRHdWkgKG5lY2Vzc2FyeSBmb3Igb25lIG9mIHRoZQorICAgICAgICAgIGV4YW1wbGUgcHJvZ3JhbXMpLiBOb3RlOiB0aGlzIGluY3JlYXNlcyB0aGUgbWluaW11bSByZXF1aXJlZAorICAgICAgICAgIHZlcnNpb24gb2YgUXQgdG8gNC4xLjMuCisKKzIwMDYtMDMtMjggIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiB0ZXN0L3F0Lyo6IFN5bmMgd2l0aCBLREUgU3VidmVyc2lvbiByZXZpc2lvbiA1MjM2NDcuCisgICAgICAgIFVwZGF0ZSB0aGUgdGVzdGNhc2VzIHRvIHRoZSBuZXcgQVBJLiBSZW1vdmUgdGVzdGNhc2VzIGZvcgorICAgICAgICBjbGFzc2VzIHRoYXQgYXJlIG5vIGxvbmdlciBwdWJsaWMgb3IgaGF2ZSBiZWVuIHJlbW92ZWQuCisKKzIwMDYtMDMtMjggIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC8qOiAKKwkqIGRidXMvcWRidXMuaDogU3luYyB3aXRoIEtERSBTdWJ2ZXJzaW9uIHJldmlzaW9uCisJNTIzNjQ3LiBIb3BlZnVsbHksIHRoaXMgd2lsbCBiZSB0aGUgbGFzdCBvZiB0aGUKKwlzb3VyY2UtaW5jb21wYXRpYmxlIGNoYW5nZXMuIERvY3VtZW50YXRpb24gaGFzIGJlZW4gaW1wcm92ZWQ7CisJc3VwcG9ydCBmb3IgUUxpc3Q8YmFzaWMtdHlwZXM+IGhhcyBiZWVuIGFkZGVkOyBRREJ1c09iamVjdCBpcworCWdvbmU7IFFEQnVzKEFic3RyYWN0KUludGVyZmFjZSBpcyBub3cgYSBRT2JqZWN0IHdpdGgKKwlhdXRvLWdlbmVyYXRlZCBtZXRhLW9iamVjdDsgUURCdXNJbnRyb3NwZWN0aW9uIGlzIG1hcmtlZAorCXByaXZhdGUsIHNpbmNlIFFNZXRhT2JqZWN0IGNhbiBiZSB1c2VkIG5vdzsgbG90cyBvZiBidWdmaXhlcy4KKworMjAwNi0wMy0xNiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCVBhdGNoIGZyb20gTWlsb3N6IERlcmV6eW5za2kgPGludGVybmFsZXJyb3IgYXQgZ21haWwuY29tPgorCQorCSogY29uZmlndXJlLmluOgorCU91dHB1dCB0aGUgc2VydmljZSBkaXJlY3RvcnkgaW4gdGhlIGNvbmZpZ3VyZSBzdW1tYXJ5CisKKwkqIGRidXMtMS5wYy5pbjoKKwlBZGQgc2Vzc2lvbl9idXNfc2VydmljZXNfZGlyCisKKzIwMDYtMDMtMTAgIFJvc3MgQnVydG9uICA8cm9zc0BvcGVuZWRoYW5kLmNvbT4KKworCSogdG9vbHMvZGJ1cy1wcmludC1tZXNzYWdlLmM6CisJQWRkIHN1cHBvcnQgZm9yIG9iamVjdCBwYXRocyBhbmQgc2lnbmF0dXJlcy4KKworMjAwNi0wMy0wNiAgU2pvZXJkIFNpbW9ucyA8c2pvZXJkQGx1b24ubmV0PgorCisJKiBidXMvYnVzLmM6IChidXNfY29udGV4dF9yZWxvYWRfY29uZmlnKTogRmx1c2ggdGhlIHVzZXIgZGF0YWJhc2UgY2FjaGUgb24KKwljb25maWcgcmVsb2FkLgorCSogYnVzL2RidXMtZGFlbW9uLjEuaW46IEFsc28gbm90ZSB0aGF0IFNJR0hVUCBmbHVzaGVzIHRoZSB1c2VyL2dyb3VwCisJaW5mb3JtYXRpb24gY2FjaGVzCisJKiBkYnVzL2RidXMtaGFzaC5jOiAoX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfYWxsKTogCisJKiBkYnVzL2RidXMtaGFzaC5oOiBBZGQgZnVuY3Rpb24gdG8gcmVtb3ZlIGFsbCBlbnRyaWVzIGZyb20gYSBoYXNoIHRhYmxlCisJKiBkYnVzL2RidXMtdXNlcmRiLmM6IChfZGJ1c191c2VyX2RhdGFiYXNlX2ZsdXNoKToKKwkqIGRidXMvZGJ1cy11c2VyZGIuaDogQWRkIGZ1bmN0aW9uIHRvIGZsdXNoIGFsbCB1c2VyL2dyb3VwIGluZm9ybWF0aW9uCisJY2FjaGVzLgorCisyMDA2LTAzLTA2ICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogcXQvZGJ1c2lkbDJjcHAuY3BwOgorCSogcXQvTWFrZWZpbGUuYW06IGFkZCB0aGUgZGJ1c2lkbDJjcHAgdG9vbCwgdGhlIHJlcGxhY2VtZW50CisJZm9yIGRjb3BpZGwyY3BwLCBmb3VuZCBpbiB0aGUgS0RFIGluc3RhbGxhdGlvbnMgKG9yIHRoZSBtb3JlCisJbW9kZXJuIGthbHlwdHVzKTogZ2VuZXJhdGUgUXQ0IEMrKyBjb2RlIGZvciB0aGUgaW5wdXQgWE1MCisJaW50cm9zcGVjdGlvbi4gQ3VycmVudGx5IG5vIElETCBwYXJzaW5nLgorCisyMDA2LTAzLTA2ICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogdGVzdC9xdC8qOiBVcGRhdGUgdGhlIHNlbGYtdGVzdHMuCisKKzIwMDYtMDMtMDYgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC8qOiAKKwkqIGRidXMvcWRidXMuaDogU3luYyB3aXRoIEtERSBTdWJ2ZXJzaW9uIHJldmlzaW9uIDUxNjIzNy4gVGhpcworCXJlcHJlc2VudHMgdGhlIGZpcnN0IGZlYXR1cmUtY29tcGxldGUgdmVyc2lvbiBvZiB0aGUgUXQ0CisJYmluZGluZ3Mgc2luY2UgSSB0b29rIG92ZSBtYWludGFpbmVyc2hpcC4KKworMjAwNi0wMy0wNiAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0L0RveHlmaWxlOiBBZGRpbmcgYSBEb3h5ZmlsZSBmb3IgdGhlIFF0NCBiaW5kaW5ncworICAgICAgICBkaXIuIFRoaXMgaXMgQysrLCBzbyB3ZSBjYW4ndCB1c2UgdGhlIERCdXMgb25lcy4KKworMjAwNi0wMy0wMiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4OiBSZW1vdmUgcmVmcmVuY2UgdG8gc3lzL2NkZWZzLmgKKwkoUGF0Y2ggZnJvbSBBcnRlbSBLYWNoaXRjaGtpbmUgPEFydGVtLkthY2hpdGNoa2luIGF0IFN1bi5DT00+KQorCisyMDA2LTAzLTAyICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiAKKwkoX2RidXNfY29ubmVjdGlvbl9ibG9ja19wZW5kaW5nX2NhbGwpOgorCUNoZWNrIHRvIHNlZSBpZiBvdXIgZGF0YSBoYXMgYWxyZWFkeSBiZWVuIHJlYWQgb2ZmIHRoZSBjb25uZWN0aW9uCisJYnkgYW5vdGhlciBibG9ja2luZyBwZW5kaW5nIGNhbGwgYmVmb3JlIHdlIGJsb2NrIGluIHBvbGwuCisJKGNoZWNrX2Zvcl9yZXBseV9hbmRfdXBkYXRlX2Rpc3BhdGNoX3VubG9ja2VkKToKKwlDb2RlIHRha2VuIGZyb20gX2RidXNfY29ubmVjdGlvbl9ibG9ja19wZW5kaW5nX2NhbGwgLSBjaGVja3MgZm9yCisJYW4gYWxyZWFkeSByZWFkIHJlcGx5IGFuZCB1cGRhdGVzIHRoZSBkaXNwYXRjaCBpZiB0aGVyZSBpcyBvbmUuCisKKwkqIHRlc3QvbmFtZS10ZXN0L3Rlc3QtcGVuZGluZy1jYWxsLWRpc3BhdGNoLmM6CisJTmV3IHRlc3QgZm9yIG1ha2luZyBzdXJlIHdlIGRvbid0IGdldCBzdHVjayBwb2xsaW5nIGEgCisJZGJ1cyBjb25uZWN0aW9uIHdoaWNoIGhhcyBubyBkYXRhIG9uIHRoZSBzb2NrZXQgd2hlbgorCWJsb2NraW5nIG91dCBvZiBvcmRlciBvbiB0d28gb3IgbW9yZSBwZW5kaW5nIGNhbGxzLgorCisyMDA2LTAyLTI4ICBUaGlhZ28gTWFjaWVpcmEgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC9NYWtlZmlsZS5hbTogUGF0Y2ggYnkgU2pvZXJkIFNpbW9ucy4gTW9yZSAubW9jIGlzc3VlczoKKyAgICAgICAgbWFrZS9hdXRvbWFrZSBkb24ndCBkZXRlY3QgdGhhdCB3ZSdyZSB0YWxraW5nIGFib3V0IHRoZSBzYW1lCisgICAgICAgIC5sbyBmaWxlIGlmIEkgc3BlY2lmeSB0aGUgZnVsbCBwYXRoIHRvIHRoZSBzb3VyY2UgZmlsZXMuCisKKzIwMDYtMDItMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvZGJ1cy1kYWVtb24uMS5pbjogaW1wcm92ZSB0aGUgbGFuZ3VhZ2UgaW4gYSBjb3VwbGUgc3BvdHMgSSBub3RpY2VkCisKKwkqIGRidXMvZGJ1cy1idXMuYyAoaW50ZXJuYWxfYnVzX2dldCk6IGluIHRoZSBlcnJvciBtZXNzYWdlIGlmIHRoZQorCXNlc3Npb24gYnVzIHZhcmlhYmxlIGlzIHVuc2V0LCBzdWdnZXN0ICJtYW4gZGJ1cy1sYXVuY2giIGFuZCAibWFuCisJZGJ1cy1kYWVtb24iIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGZpeCB0aGUgcHJvYmxlbQorCisyMDA2LTAyLTI1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWdsaWItdG9vbC5jICh1c2FnZSk6IGZpeCB1cCB0aGUgdXNhZ2UgbWVzc2FnZSwgc29tZW9uZQorCXNob3VsZCBtYWtlIHRoaXMgdGhpbmcgdXNlIHRoZSBuZXcgZ2xpYiBvcHRpb25zIHBhcnNlcgorCisyMDA2LTAyLTI1ICBUaGlhZ28gTWFjaWVpcmEgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC9NYWtlZmlsZS5hbTogUGF0Y2ggYnkgU2pvZXJkIFNpbW9ucy4gRml4IHRoZSBwYXRoIHRvIHRoZQorICAgICAgICAubG8gZmlsZXMgdGFraW5nIG1vYyBzb3VyY2VzLgorCisyMDA2LTAyLTI1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLmgsIGRidXMvTWFrZWZpbGUuYW06IGFkZCBkYnVzLXNpZ25hdHVyZS5oIHRvIGRidXMuaAorCWFuZCBpbnN0YWxsIGl0IGFzIGEgcHVibGljIGhlYWRlcgorCisyMDA2LTAyLTI0ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBSZWxlYXNlZCAwLjYxCisKKzIwMDYtMDItMjQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisJCisJKiBwcm94aWVzLnB5OiBGaXggdGhlIGNhbGxjaGFpbgorCisyMDA2LTAyLTI0ICBKb2huIChKNSkgUGFsbWllcmkgPGpvaG5wQHJlZGhhdC5jb20+CisJCisJKiBwYXRjaCBmcm9tIFNqb2VyZCBTaW1vbnMgPHNqb2VyZCBhdCBkZWJpYW4ub3JnPjoJCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWwuYyAoX2RidXNfZ3JvdXBfaW5mb19mcmVlKTogTW92ZWQgdG8gCisJZGJ1cy9kYnVzLXN5c2RlcHMuYworCisJKiBkYnVzL2RidXMtdXNlcmRiLmMgKF9kYnVzX2dyb3VwX2luZm9fZnJlZV9hbGxvY2F0ZWQpOiBEb24ndAorCWNhbGwgX2RidXNfZ3JvdXBfaW5mb19mcmVlX2FsbG9jYXRlZCB3aGljaCBjYXVzZXMgaW5maW5pdGUgbG9vcCwKKwljb3JyZWN0bHkgY2FsbCBfZGJ1c19ncm91cF9pbmZvX2ZyZWUKKworMjAwNi0wMi0yMCAgVGhpYWdvIE1hY2llaXJhIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogcXQvcWRidXNpbnRlcmZhY2VfcC5oOgorCSogcXQvcWRidXNpbnRlcmZhY2UuY3BwOiBVc2UgdGhlIHN0YW5kYXJkCisJb3JnLmZyZWVkZXNrdG9wLkRCdXMuTWV0aG9kLk5vUmVwbHkgYW5ub3RhdGlvbiBmb3IgdGhlICJhc3luYyIKKwljYWxscyBpbnN0ZWFkIG9mIGNyZWF0aW5nIG9uZSBmb3IgdXMuCisKKwkqIHF0L3FkYnVzY29ubmVjdGlvbl9wLmg6CisJKiBxdC9xZGJ1c2ludGVncmF0b3IuY3BwOiBSZW1vdmUgZGVidWdnaW5nIGNvZGUuCisKKwkqIHF0L3FkYnVzaW50ZWdyYXRvci5jcHA6CisJKiBxdC9xZGJ1c21lc3NhZ2UuY3BwOgorCSogcXQvcWRidXNtZXNzYWdlX3AuaDoKKwkqIHF0L3FkYnVzbWVzc2FnZS5oOiBDaGFuZ2UgdGhlIGJlaGF2aW91ciBvZiBhdXRvbWF0aWMKKwlyZXBseS1zZW5kaW5nOiBub3cgYSByZXBseSBpcyBhbHdheXMgc2VudCwgdW5sZXNzIHRoZSBjYWxsZXIKKwlkaWRuJ3QgcmVxdWVzdCBvbmUgb3IgaWYgdGhlIHVzZXIgc2xvdCBoYXMgYWxyZWFkeSBzZW50IG9uZS4KKworMjAwNi0wMi0xNiAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBjb25maWd1cmUuaW46IFBhdGNoIGZyb20gRGViaWFuIHBhY2thZ2VzIGJ5IFNqb2VyZCBTaW1vbnMKKwk8c2pvZXJkQGRlYmlhbi5vcmc+IHRvIGFkZCAtLXdpdGgtcXQtbW9jIGFuZCAtLXdpdGgtcXQzLW1vYworCWFyZ3VtZW50cyBzbyBpdCdzIHBvc3NpYmxlIHRvIGJ1aWxkIGJvdGggYmluZGluZ3MgaW4gdGhlCisJc2FtZSB0cmVlLgorCisJKiBxdC9NYWtlZmlsZS5hbTogRml4IHRydW5jYXRlZCB2YWx1ZSBzbyB0aGF0IG1ha2UgZGlzdCB3b3Jrcy4KKworMjAwNi0wMi0xNiAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBhY2luY2x1ZGUubTQsIGNvbmZpZ3VyZS5pbjogUGF0Y2ggZnJvbSBCcmFkIEhhcmRzCisJPGJyYWRoQGZyb2dtb3V0aC5uZXQ+IHRvIGF2b2lkIHdhcm5pbmdzIGZyb20gYXV0b2NvbmYgMS45IGJ5CisJaW1wcm92aW5nIHF1b3RpbmcsIHJlLW9yZGVyaW5nIGEgZmV3IGNoZWNrcywgYW5kIGEgZmV3IG90aGVyCisJYWVzdGhldGljIHRpZHktdXBzLgorCisyMDA2LTAyLTE2ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9maXhlZF9hcnJheSk6CisJUGF0Y2ggZnJvbSBSb2IgVGF5bG9yIDxyb2IudGF5bG9yQGNvbGxhYm9yYS5jby51az4gdG8gY29ycmVjdCBhIGJvZ3VzCisJYXNzZXJ0aW9uIHRoYXQgdGhlIG5leHQgZWxlbWVudCB0byByZWFkIGZyb20gdGhlIGl0ZXIgaXMgZml4ZWQgaW4KKwlzaXplLiBUaGlzIGlzIG5vdCB0aGUgY2FzZSB3aGVuIHlvdSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgaXRlciwKKwliZWNhdXNlIHRoZSBuZXh0IGVsZW1lbnQgdHlwZSBpcyBJTlZBTElELgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbik6IENvcnJlY3QgYQorCWEgYm9ndXMgYXNzZXJ0IHdoaWNoIG1lYW5zIHRoYXQgeW91IG1heSBub3QgaW5pdGlhbGlzZSBhIDAtbGVuZ3RoCisJc3RyaW5nIHVubGVzcyB5b3UgcHJvdmlkZSBhIG5vbi1OVUxMIHBvaW50ZXIuIFRoaXMgcHJldmVudGVkCisJeW91IGZyb20gbWFyc2hhbGxpbmcgbWVzc2FnZXMgY29udGFpbmluZyB6ZXJvLWxlbmd0aCBhcnJheXMgaW4KKwlzb21lIGNhc2VzLgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLmMgKGRlbWFyc2hhbF9jb2xsZWN0aW9uX2FycmF5KTogQW5vdGhlciBwYXRjaAorCWZyb20gUm9iIHRvIGNvcnJlY3QgYm9ndXMgYXNzZXJ0cyB3aGVuIHRyeWluZyB0byBkZW1hcnNoYWwgYW4KKwlhcnJheSBhbmQgZ2V0X2ZpeGVkX2FycmF5IGdvdCB5b3UgMCBlbGVtZW50cy4gQXBwZW5kIG5vdGhpbmcgdG8KKwl0aGUgR0FycmF5IGluIHRoaXMgY2FzZS4KKworCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmM6IEFkZCBhIHRlc3QgY2FzZSBmb3Igcm91bmQtdHJpcHBpbmcKKwlhbiBlbXB0eSBhcnJheSB2aWEgdGhlIGdsaWIgYmluZGluZ3MuIFdpdGhvdXQgYWxsIG9mIHRoZSBhYm92ZQorCXBhdGNoZXMsIHRoaXMgbmV3IHRlc3QgZmFpbHMuCisKKzIwMDYtMDItMTYgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogZ2xpYi9kYnVzLWdtYWluLmM6IE1ha2UgdGhlIHByZXZpb3VzIGNvbW1pdCBjb21waWxlLgorCisJKiBweXRob24vX2RidXMucHksIHB5dGhvbi9tYXRjaHJ1bGVzLnB5OiBQYXRjaCBmcm9tIE9sZSBBbmRyZQorCVJhdm5hYXMgPG9sZS5hbmRyZS5yYXZuYWFzQGNvbGxhYm9yYS5jby51az4gdG8gYWxsb3cgeW91IHRvCisJc3BlY2lmeSBzZW5kZXJfa2V5d29yZD0iZm9vIiwgcGF0aF9rZXl3b3JkPSJiYXIiIHdoZW4gYWRkaW5nCisJYSBzaWduYWwgbGlzdGVuZXIsIHNvIHRoYXQgeW91IGNhbiBiaW5kIHRvIHNpZ25hbHMgZ2VuZXJpY2FsbHkKKwlidXQgc3RpbGwgZG8gc29tZXRoaW5nIHVzZWZ1bCBpbiB5b3VyIGNhbGxiYWNrLgorCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXg6IERlbWFyc2hhbCB0aGUgYnl0ZSB0eXBlIGFzIHVuc2lnbmVkCisJY2hhcnMgc28gdGhhdCB0aGV5J3JlIG5vdCBjYXN0IHRvIGNoYXJzIGFuZCBtYWRlIG5lZ2F0aXZlLiBUaGFua3MKKwl0byBKYWt1YiBTdGFjaG93c2tpIGZvciByZXBvcnRpbmcgdGhpcyBhbmQgdGVzdGluZyB0aGUgZml4LgorCisyMDA2LTAyLTE1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtZ2xpYi5oOgorCSogZ2xpYi9kYnVzLWdtYWluLmg6CisJKGRidXNfZ19jb25uZWN0aW9uX29wZW4pOiBuZXcgbWV0aG9kIGZvciBvcGVubmluZworCWEgY29ubmVjdGlvbiB0byBhbiBhcmJpdHJhcnkgYWRkcmVzcyBpbiB0aGUgZ2xpYiBiaW5kaW5ncworCisJKiBDaGFuZ2VMb2c6IGNoZWNraW4gbGFzdCBlbnRyeSB3aGljaCBkb2Vzbid0IHNlZW0gdG8gYmUgY29tbWl0ZWQKKworMjAwNi0wMi0xMyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy1sYXVuY2guYzogRml4ZWQgc2ggc3ludGF4IG91dHB1dAorCisyMDA2LTAyLTEzICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5jLCBnbGliL2RidXMtZ21haW4uYywKKwlnbGliL2RidXMtZ3NpZ25hdHVyZS5jLCBnbGliL2RidXMtZ3R5cGUtc3BlY2lhbGl6ZWQuYywKKwlnbGliL2RidXMtZ3R5cGUtc3BlY2lhbGl6ZWQuaCwgZ2xpYi9kYnVzLWd2YWx1ZS11dGlscy5jLAorCWdsaWIvZGJ1cy1ndmFsdWUtdXRpbHMuaCwgZ2xpYi9kYnVzLWd2YWx1ZS5jOgorCVBhdGNoIGZyb20gUm9iIFRheWxvciA8cm9iLnRheWxvckBjb2xsYWJvcmEuY28udWs+IHRvIGFkZCBhIGJpZworCW1pc3NpbmcgcGllY2Ugb2YgdGhlIGdsaWIgYmluZGluZ3Mgamlnc2F3IHB1enpsZS4gVGhpcyBtb2RpZmllcworCXRoZSBleGlzdGluZyBzcGVjaWFsaXNlZCB0eXBlcyB0byBoYXZlIE4gdHlwZSBwYXJhbWV0ZXJzIChyYXRoZXIKKwl0aGFuIHRoZSBjdXJyZW50IDEgb3IgMiBmb3IgYXJyYXlzIGFuZCBkaWN0aW9uYXJpZXMgcmVzcGVjdGl2ZWx5KS4KKwlZb3UgY2FuIHRoZW4gdXNlIHRoaXMgdG8gZ2V0IGEgZ2xpYiB0eXBlIHRvIHJlcHJlc2VudCBhbnkgYXJiaXRyYXJ5CisJRC1CdXMgc3RydWN0IHR5cGUgdXNpbmcgZGJ1c19nX3R5cGVfZ2V0X3N0cnVjdC4gVGhlIG9ubHkKKwlpbXBsZW1lbnRhdGlvbiBvZiB0aGVzZSB0eXBlcyBpcyB3aXRoIEdWYWx1ZUFycmF5cyBhcyBiZWZvcmUsCisJYnV0IGl0J3Mgbm93IHBvc3NpYmxlIHRvIHN0b3JlIHRoZXNlIGluIGFycmF5cywgZW1pdCB0aGVtIGluCisJc2lnbmFscywgZXRjLgorCisyMDA2LTAyLTEwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc2lnbmF0dXJlLmMgKGRidXNfc2lnbmF0dXJlX2l0ZXJfcmVjdXJzZSk6IENvcnJlY3RseQorCWRlYWwgd2l0aCBuZXN0ZWQgYXJyYXlzIChCdWcgIzU4MjMpIFBhdGNoIGJ5IFRoaWFnbyBNYWNpZWlyYSAKKwk8dGhpYWdvLm1hY2llaXJhIGF0IHRyb2xsdGVjaC5jb20+CisKKzIwMDYtMDItMTAgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIG1vbm8vZG9jL01ha2VmaWxlLmFtOiBGaXggcGFyYWxsZWwgbWFrZSBwcm9ibGVtIHdpdGggbW9uby1kb2MKKwkoQnVnICM0MjEzKSBQYXRjaCBmcm9tIERvdWcgR29sZHN0ZWluIDxjYXJkb2UgYXQgZ2VudG9vLm9yZz4KKworMjAwNi0wMi0xMCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25zX2V4cGVjdF9yZXBseSk6IE1ha2UKKwlwZW5kaW5nIHJlcGx5IGxpbWl0IG5vdCBjb21tb24gdG8gYWxsIGNvbm5lY3Rpb25zIChCdWcgIzU0MTYpCisJUGF0Y2ggZnJvbSBLaW1tbyBIw6Rtw6Rsw6RpbmVuIDxraW1tby5oYW1hbGFpbmVuIGF0IG5va2lhLmNvbT4KKworMjAwNi0wMi0xMCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy1sYXVuY2guYzogRml4ZWQgY3NoIHN5bnRheCBvdXRwdXQgKEJ1ZyAjNTcyMCkKKworMjAwNi0wMi0xMCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZ2NqL01ha2VmaWxlLmFtOiBwb2ludCB0byBjb3JyZWN0IGphciBjb21tYW5kIChCdWcgIzQ1MjkpCisJcGF0Y2ggZnJvbSBEb3VnIEdvbGRzdGVpbiA8Y2FyZG9lIGF0IGdlbnRvby5vcmc+CisKKzIwMDYtMDItMDkgIEpvZSBTaGF3ICA8am9lc2hhd0Bub3ZlbGwuY29tPgorCisJKiBtb25vL0FyZ3VtZW50cy5jczogRml4IGEgbWFnaWMgbnVtYmVyIGluIHRoZSBtb25vIGJpbmRpbmdzCisJdGhhdCBkb2Vzbid0IHdvcmsgb24gNjQgYml0IGFyY2hlcy4gIFBhdGNoIGZyb20gUGV0ZXIgSm9oYW5zb24uCisKKzIwMDYtMDEtMjcgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLltjaF06IFBhdGNoIGJhc2VkIG9uIFJpY2FyZG8gS2Vra2kncworCXBhdGNoIHRvIHVzZSBhbiBhbm5vdGF0aW9uIG9yZy5mcmVlZGVza3RvcC5EQnVzLkdMaWIuQ2xpZW50Q1N5bWJvbAorCXdoZW4gZ2VuZXJhdGluZyB0aGUgY2xpZW50LXNpZGUgbWV0aG9kcywgaW5zdGVhZCBvZiBvdmVybG9hZGluZworCUNTeW1ib2wgd2hpY2ggYnJva2UgZXZlcnl0aGluZyBob3JyaWJseS4gTXkgYXBvbG9naWVzLgorCisyMDA2LTAxLTI3ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIGdsaWIvZGJ1cy1ndHlwZS1zcGVjaWFsaXplZC5bY2hdLCBnbGliL2RidXMtZ3ZhbHVlLXV0aWxzLmM6IFBhdGNoCisJYnkgbWUgYW5kIFJvYiBUYXlsb3IgdG8gYWRkIGEgc2ltcGxlX2ZyZWUgZnVuY3Rpb24gdG8gRC1CdXMgbWFwCisJYW5kIGNvbGxlY3Rpb24gdHlwZXMsIHdoaWNoIGFsbG93cyB0aG9zZSB0eXBlcyB3aGljaCBjYW4gYmUgZnJlZWQKKwl3aXRoIGEgR0Rlc3Ryb3lOb3RpZnkgKHN1Y2ggYXMgR0hhc2hUYWJsZXMgYW5kIEdBcnJheXMsIGJ1dCBub3QKKwlHUHRyQXJyYXlzKSB0byBiZSBzdG9yZWQgYXMgdGhlIHZhbHVlcyBpbiBoYXNodGFibGVzLgorCisJKiB0ZXN0L2dsaWIvdGVzdC1kYnVzLWdsaWIuYywgdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLntjLHhtbH06CisJUGF0Y2ggYnkgUm9iIFRheWxvciB0byBhZGQgbmVzdGVkIGRpY3RzIHRvIHRoZSBnbGliIHRlc3RzIHRvIGNoZWNrCisJdGhlIGFib3ZlIGNvZGUgd29ya3MsIGFuZCBhcHBlYXJzIG5vdCB0byBsZWFrIHdoZW4gY2FsbGVkIHJlcGVhdGVkbHkuCisKKzIwMDYtMDEtMjcgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS5jIChkZW1hcnNoYWxfdmFsdWVhcnJheSk6IFBhdGNoIGZyb20gUm9iIFRheWxvcgorCXRvIGZyZWUgYSBELUJ1cyBhbGxvY2F0ZWQgc3RyaW5nIHdpdGggZGJ1c19mcmVlICgpIGluc3RlYWQgb2YKKwlnX2ZyZWUgKCkuCisKKzIwMDYtMDEtMjcgIElhaW4gSG9sbWVzICA8aWFpbkBvcGVuZWRoYW5kLmNvbT4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dfcHJveHlfZGlzcG9zZSk6IFByb3RlY3QgdGhlIGRpc3Bvc2UKKwltZXRob2QgZnJvbSBiZWluZyBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCisKKzIwMDYtMDEtMTkgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmM6IFBhdGNoIGZyb20gUm9iIFRheWxvcgorCTxyb2IudGF5bG9yQGNvbGxhYm9yYS5jby51az4gdG8gYWRkIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgYmluZGluZ3MKKwl0byBhcnJheXMgdGhhdCBhcmUgcmVwcmVzZW50ZWQgYXMgR1B0ckFycmF5cyByYXRoZXIgdGhhbiBHQXJyYXlzIChpZQorCXNpemUtdmFyaWFibGUgdGhpbmdzLCBzdWNoIGFzIHN0cmluZ3MsIG9iamVjdHMsIHN0cnVjdHMsIGV0YykuCisKKzIwMDYtMDEtMDUgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogZGJ1cy9kYnVzLWdsaWIuaCwgZ2xpYi9kYnVzLWdwcm94eS5jOiBQYXRjaCBmcm9tIFJpY2FyZG8gS2Vra2kKKwk8cmljYXJkby5rZWtraUBtb3ZpYWwuZmk+IHRvIG1ha2UgaXQgcG9zc2libGUgdG8gaW5oZXJpdCBmcm9tCisJREJ1c0dQcm94eSwgYnkgc3BsaXR0aW5nIHRoZSBEQnVzR1Byb3h5IHN0cnVjdCBpbnRvIGEgcHVibGljIHBhcnQgYW5kCisJYSBwcml2YXRlIHBhcnQsIGFuZCBtb3ZpbmcgdGhlIHNldHRpbmcgb2YgdGhlIERCdXNHUHJveHlNYW5hZ2VyIGludG8gYQorCWNvbm5lY3Rpb24gcHJvcGVydHksIGFsbG93aW5nIHByb3BlciBHT2JqZWN0IGNvbnN0cnVjdGlvbi4KKworMjAwNi0wMS0wNSAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYzogUGF0Y2ggZnJvbSBSaWNhcmRvIEtla2tpCisJPHJpY2FyZG8ua2Vra2lAbW92aWFsLmZpPiB0byBtYWtlIGRidXMtYmluZGluZy10b29sIGhlZWQgQyBzeW1ib2wgbmFtZQorCWFubm90YXRpb25zIHdoZW4gZ2VuZXJhdGluZyBnbGliIGNsaWVudCBiaW5kaW5ncy4KKworMjAwNS0xMi0xOSBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc2hhcmVkLmg6IENhbGwgaXQgc2hhcmVkIGNvbnN0YW50cyBpbnN0ZWFkIG9mIHNoYXJlZCBtYWNyb3MKKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6IGFkZCBET3h5Z2VuIG1hcmt1cCB0byBxdWlldCB3YXJuaW5ncworCisyMDA1LTEyLTE5IEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zaGFyZWQuaDogYWRkIERPeHlnZW4gbWFya3VwIHRvIHF1aWV0IHdhcm5pbmdzCisKKzIwMDUtMTItMTkgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4gCisKKwkqIGRidXMvZGJ1cy1tYWNyb3MuaDogY29ycmVjdCBET3h5Z2VuIGVuZCBvZiBzZWN0aW9uIChzL31AL0B9KQorCisyMDA1LTEyLTE5ICBSb3NzIEJ1cnRvbiAgPHJvc3NAb3BlbmVkaGFuZC5jb20+CisKKwkqIGRvYy9kYnVzLXR1dG9yaWFsLnhtbDoKKwlEb2N1bWVudCB0aGUgR2xpYiBjbGllbnQtc2lkZSBiaW5kaW5ncywgYW5kIGxpc3QgYWxsIHBvc3NpYmxlIGFubm90YXRpb25zLgorCisyMDA1LTEyLTE5ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2J1cy5jIChkYnVzX2J1c19yZWxlYXNlX25hbWUpOiBBZGQgZG9jdW1lbnRhdGlvbgorCisyMDA1LTEyLTA2ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIHB5dGhvbi9zZXJ2aWNlLnB5OiBzL3N1Y2Vzc2Z1bC9zdWNjZXNzZnVsLyBzbyB3ZSdyZSBhbGxvY2F0aW5nIHRvCisJYW5kIHJlYWRpbmcgZnJvbSB0aGUgc2FtZSB2YXJpYWJsZS4gT29wcy4KKworMjAwNS0xMS0zMCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogUmVsZWFzZWQgMC42MAorCisyMDA1LTExLTMwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiB0ZXN0L3F0L01ha2VmaWxlLmFtOiBidWlsZCBmcm9tIHNyY2RpcgorCisJKiBxdC9xdGNvbm5lY3Rpb24uY3BwIChyZXF1ZXN0TmFtZSk6IENoYW5nZWQgUFJPSElCSVRfUkVQTEFDRSB0byBBTExPV19SRVBMQUNFCisJTm90ZSAtIHRoaXMgY29kZSBpcyB3cm9uZyBhbmQgbmVlZHMgdG8gYmUgZml4ZWQgYnkgdGhlIFF0IGJpbmRpbmcKKwlkZXZlbG9wZXJzLiAgVGhlIGZsYWdzIHNob3VsZCBiZSB0cmVhdGVkIGFzIGJpdGZpZWxkcyBhbmQgbm90IGVudW1zLgorCisJKiBxdC9xdGNvbm5lY3Rpb24uaDogQ2hhbmdlIFByb2hpYml0UmVwbGFjZSB0byBBbGxvd1JlcGxhY2UKKworMjAwNS0xMS0zMCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWxpc3QuYyAoX2RidXNfbGlzdF9pbnNlcnRfYWZ0ZXJfbGluaywgX2RidXNfbGlzdF9pbnNlcnRfYWZ0ZXIsIAorCSAgbGlua19hZnRlcik6IHJlbW92ZSAjaWZkZWYgREJVU19CVUlMRF9URVNUUyBzaW5jZSB3ZSB1c2UgdGhlc2UgbWV0aG9kcyAKKwkgIGluIHByb2R1Y3Rpb24gY29kZQorCisyMDA1LTExLTMwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZSk6IEFkZCBuZXcKKwltZXRob2QgZm9yIGdldHRpbmcgbWVzc2FnZXMgb2ZmIHRoZSBidXMgaW4gdGhlIGFic2VuY2Ugb2YgYQorCW1haW5sb29wLiAgVGhpcyBtZXRob2QgaXMgbXVjaCBsaWtlIAorCWRidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlX2Rpc3BhdGNoIGV4Y2VwdCBpdCBkb2VzIG5vdCBkaXNwYXRjaAorCXRoZSBtZXNzYWdlcyB0byBhIHJlZ2lzdGVyZWQgZmlsdGVyIGZ1bmN0aW9uLiAgSW5zdGVhZCBpdAorCWFsbG93cyBhIGRldmVsb3BlciB0byBwcm9jZXNzIG1lc3NhZ2VzIGJ5IGRpcmVjdGx5IHBvcHBpbmcKKwl0aGVtIG9mZiB0aGUgYnVzLgorCisyMDA1LTExLTMwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBidXMvZGVza3RvcC1maWxlLmMgKHBhcnNlX2tleV92YWx1ZSk6IElnbm9yZSBsb2NhbGVzIGFsbG93aW5nIAorCXRoZSBwYXJzZXIgdG8gY29udGludWUgaW5zdGVhZCBvZiByZXR1cm5pbmcgZXJyb3IKKwkoYnVzX2Rlc2t0b3BfZmlsZV9sb2FkKTogRG8gbm90IGZyZWUgcGFyc2VyIGRhdGEgd2hlbgorCXBhcnNlX3NlY3Rpb25fc3RhcnQgb3IgcGFyc2Vfa2V5X3ZhbHVlIGZhaWxzIGJlY2F1c2UgaXQgd2FzIAorCWFscmVhZHkgZnJlZWQgYnkgcGFyc2VyX2ZyZWUgKHBhdGNoIGZyb20gQ2FybG9zIEdhcmNpYSBDYW1wb3MgIAorCTxjYXJsb3NnYyBhdCBnbm9tZS5vcmc+KQorCisyMDA1LTExLTMwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtYXV0aC5jLCBkYnVzL2RidXMtY29ubmVjdGlvbi5jLCBkYnVzL2RidXMta2V5cmluZy5jLAorCWRidXMvZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5jLCBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYworCWdsaWIvZGJ1cy1nbGliLXRvb2wuYywgZ2xpYi9kYnVzLWdwYXJzZXIuYywgZ2xpYi9kYnVzLWdwcm94eS5jCisJdGVzdC90ZXN0LXNlZ2ZhdWx0LmMsIHRlc3QvdGVzdC11dGlscy5jLAorCXRlc3QvZ2xpYi90ZXN0LWRidXMtZ2xpYi5jLCB0b29scy9kYnVzLWNsZWFudXAtc29ja2V0cy5jCisJdG9vbHMvZGJ1cy1sYXVuY2guYywgdG9vbHMvZGJ1cy10cmVlLXZpZXcuYywgdG9vbHMvZGJ1cy12aWV3ZXIuYzoKKwlWYXJpb3VzIGNsZWFudXAgb2YgZGVhZCBjb2RlIGFuZCBjb21waWxlciB3YXJuaW5ncyAocGF0Y2ggZnJvbQorCUtqYXJ0YW4gTWFyYWFzIDxrbWFyYWFzIGF0IGdub21lLm9yZz4pIAorCisyMDA1LTExLTMwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBnbGliL2RidXMtZ21haW4uYyAoY29ubmVjdGlvbl9zZXR1cF9hZGRfd2F0Y2gpOiBwbHVnZ2VkIGEgbGVhaworCShwYXRjaCBmcm9tIENhcmxvcyBHYXJuYWNobyBQYXJybyA8Y2FybG9zZyBhdCBnbm9tZS5vcmc+CisKKzIwMDUtMTEtMjcgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4OiBSZXBhaXIgbXkgcHJldmlvdXMgY29tbWl0IHdoaWNoIHJldmVydGVkCisJcGFydCBvZiB0aGUgcHJlY2VkaW5nIG9uZS4gT29wcy4gTWVyZ2UgcGF0Y2ggYnkgSm9oYW4gSGVkYmVyZworCTxqb2hhbi5oZWRiZXJnQG5va2lhLmNvbT4gdG8gZml4IG1hcnNoYWxsaW5nIG9mIDE2LWJpdCBpbnRlZ2VyIHZhbHVlcworCW9uIGJpZy1lbmRpYW4gcGxhdGZvcm1zLgorCisJKiB0ZXN0L3B5dGhvbi90ZXN0LWNsaWVudC5weTogQWRkIHNvbWUgMTYtYml0IGludGVnZXJzIHRvIHRoZSB0ZXN0CisJdmFsdWVzLgorCisyMDA1LTExLTI3ICBDYXJsb3MgR2FyY2lhIENhbXBvcyAgPGNhcmxvc2djQGdub21lLm9yZz4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYzogQXBwZW5kIGEgR1ZhbHVlIGluc3RlYWQgb2YgYSBiYXNpYyB0eXBlIGluCisJbWV0aG9kIHJldHVybiBtZXNzYWdlIGZvciBwcm9wZXJ0eSBnZXR0ZXJzCisKKzIwMDUtMTEtMjcgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4OiBGaXggYSBidWcgd2hlcmUgZG9pbmcgYSBzdHJpY3QgYXBwZW5kCisJd2l0aCB0eXBlIHYgb2YgYW4gaW5zdGFuY2Ugb2YgZGJ1cy5WYXJpYW50KGZvbywgdHlwZT0neCcpIGNhdXNlZAorCWl0IHRvIGJlIGJveGVkIHR3aWNlIGJlZm9yZSBzZW5kaW5nIG92ZXIgdGhlIGJ1cy4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LCBweXRob24vc2VydmljZS5weSwKKwl0ZXN0L3B5dGhvbi90ZXN0LWNsaWVudC5weTogVXBkYXRlIHRoZSBjb25zdGFudHMgZm9yIHRoZSBuZXcKKwlyZXF1ZXN0X25hbWUgZmxhZ3MsIGFuZCB1cGRhdGUgY29tbWVudHMvdGVzdCBjYXNlcyBub3cgdGhhdCBxdWV1ZWluZworCWlzIHRoZSBkZWZhdWx0IGFjdGlvbi4KKworMjAwNS0xMS0yMiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOgorCS0gQ2hhbmdlIHZlcnNpb24gdG8gMC42MCBmb3IgaW1wZW5kaW5nIHJlbGVhc2UKKwktIHVwcGVkIHRoZSBzb25hbWVzIGJlY2F1c2Ugb2YgQUJJIGFuZCBBUEkgYnJlYWthZ2UKKworMjAwNS0xMS0yMiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBBZGQgdGVzdC9uYW1lLXRlc3QvTWFrZWZpbGUgdG8gdGhlIGdlbmVyYXRlZAorCU1ha2VmaWxlIGxpc3QKKworCSogZGJ1cy9kYnVzLXNoYXJlZC5oICgjZGVmaW5lIERCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UKToKKwlOZXcgZmxhZyB3aGljaCByZXBsYWNlcyBEQlVTX05BTUVfRkxBR19QUk9ISUJJVF9SRVBMQUNFTUVOVAorCSgjZGVmaW5lIERCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRSk6IE5ldyBmbGFnIGZvciBzcGVjaWZ5aW5nCisJbm90IHRvIHF1ZXVlIGFuIG93ZXIgaWYgaXQgY2FuJ3QgYmUgdGhlIHByaW1hcnkgb3duZXIKKworCSogYnVzL2J1cy5oOiBBZGQgbmV3IGludGVybmFsIEJ1c093bmVyIHN0cnVjdAorCisJKiBidXMvZHJpdmVyLmMgKGJ1c19kcml2ZXJfaGFuZGxlX2hlbGxvKTogU2VuZCBmbGFncyAoMCBmb3IgZGVmYXVsdCkKKwl0byBidXNfcmVnaXN0cnlfZW5zdXJlIGFuZCBkb24ndCBzZXQgdGhlIHByb2hpYml0X3JlcGxhY2VtZW50IGZsYWcKKwlzaW5jZSB0aGV5IGFyZSBub3cgc2V0IHBlciBCdXNPd25lciBhbmQgbm90IHBlciBuYW1lLgorCShidXNfZHJpdmVyX2hhbmRsZV9saXN0X3F1ZXVlZF9vd25lcnMpOiBidXMgbWV0aG9kIChMaXN0UXVldWVkT3duZXJzKSAKKwl0aGF0IHJldHVybnMgdGhlIGxpc3Qgb2YgY29ubmVjdGlvbnMgaW4gYSBuYW1lJ3MgY29ubmVjdGlvbiBxdWV1ZQorCQorCSogYnVzL3NlcnZpY2VzLmMgKHN0cnVjdCBCdXNTZXJ2aWNlKTogcmVtb3ZlIHByb2hpYml0X3JlcGxhY2VtZW50IGZpZWxkCisJKHN0cnVjdCBCdXNPd25lcik6IG5ldyBzdHJ1Y3QgZm9yIGtlZXBpbmcgdHJhY2sgb2YgcXVldWVkIGNvbm5lY3Rpb25zCisJYW5kIHRoZWlyIGFzc29jaWF0ZWQgZmxhZ3MgZm9yIHRoZSBxdWV1ZQorCShzdHJ1Y3QgQnVzUmVnaXN0cnkpOiBhZGQgYSBCdXNPd25lciBtZW1vcnkgcG9vbAorCShidXNfcmVnaXN0cnlfbmV3KTogaW5pdGlhbGl6ZSB0aGUgQnVzT3duZXIgbWVtb3J5IHBvb2wKKwkoYnVzX3JlZ2lzdHJ5X3VucmVmKTogZnJlZSB0aGUgQnVzT3duZXIgbWVtb3J5IHBvb2wKKwkoX2J1c19zZXJ2aWNlX2ZpbmRfb3duZXJfbGluayk6IG5ldyBpbnRlcm5hbCBtZXRob2QgZm9yCisJc2VhcmNoaW5nIHRoZSBxdWV1ZSBmb3IgYSBzcGVjaWZpYyBjb25uZWN0aW9uCisJKGJ1c19vd25lcl9zZXRfZmxhZ3MpOiBuZXcgbWV0aG9kIGZvciBhZGRpbmcgc2V0dGluZyB0aGUgZmxhZ3Mgb24gYQorCWJ1cyBvd25lcgorCShidXNfb3duZXJfbmV3KTogbmV3IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBCdXNPd25lciBvYmplY3QgZnJvbSB0aGUKKwlwb29sIGFuZCBzZXRzIGl0cyBmbGFncworCShidXNfb3duZXJfcmVmLCBidXNfb3duZXJfdW5yZWYpOiByZWYgY291bnRpbmcgZm9yIEJ1c093bmVyIG9iamVjdHMKKwkoYnVzX3JlZ2lzdHJ5X2Vuc3VyZSk6IEFkZCB0aGUgZmxhZ3MgcGFyYW1ldGVyCisJKGJ1c19yZWdpc3RyeV9hY3F1aXJlX3NlcnZpY2UpOiBTd2l0Y2ggZnJvbSB1c2luZyByYXcgY29ubmVjdGlvbnMgdG8KKwl1c2luZyB0aGUgQnVzT3duZXIgc3RydWN0CisJQWRkIG5ldyBzdGF0ZSBtYWNoaW5lIGZvciBkZWFsaW5nIHdpdGggdGhlIG5ldyBzZXQgb2YgZmxhZ3MKKwkoYnVzX3JlZ2lzdHJ5X3NldF9zZXJ2aWNlX2NvbnRleHRfdGFibGUsIHN0cnVjdCBPd25lcnNoaXBDYW5jZWxEYXRhLCAKKwljYW5jZWxfb3duZXJzaGlwLCBmcmVlX293bmVyc2hpcF9jYW5jZWxfZGF0YSwgCisJYWRkX2NhbmNlbF9vd25lcnNoaXBfdG9fdHJhbnNhY3Rpb24sIHN0cnVjdCBPd25lcnNoaXBSZXN0b3JlRGF0YSwgCisJcmVzdG9yZV9vd25lcnNoaXAsIGZyZWVfb3duZXJzaGlwX3Jlc3RvcmVfZGF0YSwgCisJYWRkX3Jlc3RvcmVfb3duZXJzaGlwX3RvX3RyYW5zYWN0aW9uKTogU3dpdGNoIHRvIHVzaW5nIEJ1c093bmVyIAorCWluc3RlYWQgb2YgcmF3IGNvbm5lY3Rpb25zCisJKGJ1c19zZXJ2aWNlX2FkZF9vd25lcik6IEFkZCBmbGFncyBwYXJhbWV0ZXIKKwlTd2l0Y2ggdG8gdXNpbmcgQnVzT3duZXIgaW5zdGVhZCBvZiByYXcgY29ubmVjdGlvbnMKKwlBZGQgc3RhdGUgbWFjaGluZSBmb3IgZGVhbGluZyB3aXRoIHRoZSBuZXcgc2V0IG9mIGZsYWdzCisJKGJ1c19zZXJ2aWNlX3N3YXBfb3duZXIpOiBTd2FwcyB0aGUgZmlyc3QgYW5kIHNlY29uZCBvd25lcnMgaW4gdGhlCisJcXVldWUuICBVc2VkIHRvIG1ha2Ugc3VyZSBwcm9wZXIgc2lnbmFscyBhcmUgc2VudCB3aGVuIGEgc2VydmljZSBsb29zZXMgCisJb3IgZ2FpbnMgcHJpbWFyeSBvd25lcnNoaXAuICBXZSBuZXZlciBpbnNlcnQgYW4gb3duZXIgYXQgdGhlIHRvcCBvZiB0aGUKKwlxdWV1ZS4gIEluc3RlYWQgd2UgaW5zZXJ0IGl0IGluIHRoZSBzZWNvbmQgcG9zaXRpb24gYW5kIHRoZW4gc3dhcC4KKwkoYnVzX3NlcnZpY2VfcmVtb3ZlX293bmVyKTogUmVtb3ZlIHRoZSBvd25lciBmcm9tIHRoZSBxdWV1ZSBzZW5kaW5nCisJb3V0IHRoZSBOYW1lTG9zdCBhbmQgTmFtZU93bmVyQ2hhbmdlZCBzaWduYWxzIGlmIHRoZSB3ZSB3ZXJlIHRoZSAKKwlwcmltYXJ5IG93bmVyCisJKGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyc19jb25uZWN0aW9uKTogTmV3IG1ldGhvZCB0aGF0IGV4dHJhY3RzCisJdGhlIGNvbm5lY3Rpb24gZnJvbSB0aGUgcHJpbWFyeSBvd25lcgorCShidXNfc2VydmljZV9nZXRfcHJpbWFyeV9vd25lcik6IFJldHVybnMgdGhlIEJ1c093bmVyIGluc3RlYWQgb2YgdGhlIAorCWNvbm5lY3Rpb24KKwkoYnVzX3NlcnZpY2VfZ2V0X2FsbG93X3JlcGxhY2VtZW50KTogQ2hhbmdlZCBmcm9tIHRoZSBvbGQgCisJYnVzX3NlcnZpY2VfZ2V0X3Byb2hpYml0X3JlcGxhY2VtZW50IG1ldGhvZC4gIENoZWNrcyB0aGUgZmxhZ3Mgb2YgdGhlIAorCXByaW1hcnkgb3duZXIgYW5kIHJldHVybnMgaWYgaXQgY2FuIGJlIHJlcGxhY2VkIG9yIG5vdAorCShidXNfc2VydmljZV9zZXRfcHJvaGliaXRfcmVwbGFjZW1lbnQpOiByZW1vdmVkCisJKGJ1c19zZXJ2aWNlX2hhc19vd25lcik6IHJldHVybnMgVFJVRSBpZiBhbmQgb3duZXIgd2l0aAorCXRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiBleGlzdHMgaW4gdGhlIHF1ZXVlCisJCisJKiBkYnVzL2RidXMtYnVzLmMgKGRidXNfYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXF1ZV9uYW1lKTogTmV3IGhlbHBlcgorCW1ldGhvZCB0aGF0IG9ubHkgY29tcGlsZXMgaWYgdGVzdHMgYXJlIGVuYWJsZWQuICBBbGxvd3MgdXMgdG8gZ2V0IHRoZSAKKwl1bmlxdWUgbmFtZSBvZiBhIGNvbm5lY3Rpb24gc28gd2UgY2FuIGNoZWNrIGl0IGFnYWluc3QgdGhlIHF1ZXVlIHdoZW4KKwlkb2luZyByZWdyZXNzaW9uIHRlc3RzCisKKwkqIGJ1cy9hY3RpdmF0aW9uLmMgKGJ1c19hY3RpdmF0aW9uX3NlbmRfcGVuZGluZ19hdXRvX2FjdGl2YXRlKSwKKwlidXMvZGlzcGF0Y2guYyAoYnVzX2Rpc3BhdGNoKSwgIAorCWJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfZ2V0X3NlcnZpY2Vfb3duZXIsIAorCWJ1c19kcml2ZXJfaGFuZGxlX2dldF9jb25uZWN0aW9uX3VuaXhfdXNlciwgCisJYnVzX2RyaXZlcl9oYW5kbGVfZ2V0X2Nvbm5lY3Rpb25fdW5peF9wcm9jZXNzX2lkLAorCWJ1c19kcml2ZXJfaGFuZGxlX2dldF9jb25uZWN0aW9uX3NlbGludXhfc2VjdXJpdHlfY29udGV4dCksCisJYnVzL3NpZ25hbHMuYyAoY29ubmVjdGlvbl9pc19wcmltYXJ5X293bmVyKTogCisJdXNlIGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyc19jb25uZWN0aW9uIGluc3RlYWQgb2YKKwlidXNfc2VydmljZV9nZXRfcHJpbWFyeV9vd25lcgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19jb25uZWN0X3VuaXhfc29ja2V0LCAKKwlfZGJ1c19saXN0ZW5fdW5peF9zb2NrZXQpOiBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgc29ja2V0CisJcGF0aCBhbmQgdXNlIHRoYXQgaW5zdGVhZCBvZiB1c2luZyBhIGZpeGVkIGxlbmd0aCB3aGljaCB3YXMKKwljYXVzaW5nIHNvY2tldCBuYW1lcyB0byBjb250YWluIG1hbnkgdHJhaWxpbmcgTnVsIGJ5dGVzLgorCisJKiBkYnVzL2RidXMtZ2xpYi1sb3dsZXZlbC5oLCBnbGliL2RidXMtZ29iamVjdC5jCisJKGRidXNfZ19tZXRob2RfZ2V0X3NlbmRlcik6IE5ldyBtZXRob2QgZm9yIGV4dHJhY3RpbmcgdGhlIHNlbmRlciAKKwlmcm9tIGEgREJ1c0dNZXRob2RJbnZvY2F0aW9uCisJKGRidXNfZ19tZXRob2RfcmV0dXJuX2dldF9yZXBseSk6IGNoYW5nZWQgbmFtZSB0byAKKwlkYnVzX2dfbWV0aG9kX2dldF9yZXBseQorCShkYnVzX2dfbWV0aG9kX3JldHVybl9zZW5kX3JlcGx5KTogY2hhbmdlZCBuYW1lIHRvCisJZGJ1c19nX21ldGhvZF9zZW5kIHJlcGx5CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBOZXcgZG9jcyB0aGF0IGRlc2NyaWJlIGhvdyB0aGUgbmV3CisJcXVldWVpbmcgc3lzdGVtIHdvcmtzIGFuZCB0YWxrcyBhYm91dCB0aGUgY2hhbmdlcyB0byB0aGUgaG93CisJd2Ugc3BlY2lmeSBzb2NrZXQgbmFtZXMKKworCSogZ2xpYi9leGFtcGxlcy9leGFtcGxlLXNlcnZpY2UuYywgCisJZ2xpYi9leGFtcGxlcy9leGFtcGxlLXNpZ25hbC1lbWl0dGVyLmMsCisJZ2xpYi9leGFtcGxlcy9zdGF0ZW1hY2hpbmUvc3RhdGVtYWNoaW5lLXNlcnZlci5jOgorCUNoYW5nZWQgdGhlIFJlcXVlc3ROYW1lIGZsYWdzIHRvIHRoZSBuZXcgc3lzdGVtCisKKwkqIHRlc3QvbmFtZS10ZXN0LyAodGVzdC1uYW1lcy5jLCBydW4tdGVzdC5zaCwgTWFrZWZpbGUuYW0pOiBOZXcKKwlyZWdyZXNzaW9uIHRlc3Qgc3VpdGUgZm9yIHRlc3RpbmcgdmFyaW91cyBzdGF0ZXMgb2YgdGhlIG5ldworCXF1ZXVlaW5nIHN5c3RlbQorCQorMjAwNS0xMS0xNSAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBkYnVzL2RidXMtZ2xpYi1sb3dsZXZlbC5oLCBnbGliL2RidXMtZ29iamVjdC5jOiBQYXRjaCBmcm9tIFJvYgorCVRheWxvciB0byBhZGQgdHdvIG1ldGhvZHMsIGRidXNfZ19tZXRob2RfcmV0dXJuX2dldF9yZXBseSBhbmQKKwlkYnVzX2dfbWV0aG9kX3JldHVybl9zZW5kX3JlcGx5LCB0byBhbGxvdyB5b3UgdG8gZ2V0IHRoZSByZXBseQorCW1lc3NhZ2UgZnJvbSBhIERCdXNHTWV0aG9kSW52b2NhdGlvbiwgYXBwZW5kIGFyYml0cmFyeSBzdHVmZiB0byBpdCwKKwlhbmQgc2VuZCBpdC4gVGhlIEdMaWIgYmluZGluZ3MgY2FuJ3QgbWFyc2hhbCBhIHJldHVybiB2YWx1ZSBvZgorCXNvbWV0aGluZyBsaWtlIGEocykgaWYgdGhlIGFycmF5IGlzIGVtcHR5IC0gdWx0aW1hdGVseSB0aGV5IHNob3VsZCBiZQorCW1hZGUgdG8gaGVlZCB0aGUgc2lnbmF0dXJlIG9mIHRoZSBvdXQgYXJndW1lbnRzIGFzIHRoZSBQeXRob24gYmluZGluZ3MKKwlub3cgY2FuLCBidXQgdGhpcyBpcyBhIHdvcmthYmxlIGludGVyaW0gc29sdXRpb24gd2hpY2ggbWlnaHQgaGF2ZQorCW90aGVyIGFwcGxpY2F0aW9ucy4KKworMjAwNS0xMS0xNSAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBidXMvZHJpdmVyLmMsIGJ1cy9zZXJ2aWNlcy5jLCBidXMvc2VydmljZXMuaDogQWRkIGEgUmVsZWFzZU5hbWUKKwltZXRob2QgdG8gb3JnLmZyZWVkZXNrdG9wLkRCdXMgdG8gcmVsZWFzZSBhIGJ1cyBuYW1lIG9yIGdpdmUgdXAKKwl3YWl0aW5nIGluIHRoZSBxdWV1ZSBmb3IgaXQuCisKKwkqIGRidXMvZGJ1cy1idXMuYywgZGJ1cy9kYnVzLWJ1cy5oLCBkYnVzL2RidXMtc2hhcmVkLmg6IEFkZCBhCisJZGJ1c19idXNfcmVsZWFzZV9uYW1lIG1ldGhvZCB0byBzZW5kIHRoZSBSZWxlYXNlTmFtZSBtZXRob2QgY2FsbHMuCisJQWRkIGNvbnN0YW50cyBmb3IgdGhlIHJldHVybiB2YWx1ZXMgdG8gZGJ1cy9kYnVzLXNoYXJlZC5oLgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogRG9jdW1lbnQgdGhlIG5ldyBSZWxlYXNlTmFtZSBtZXRob2QKKwlpbiB0aGUgc3BlY2lmaWNhdGlvbi4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4OiBBZGQgYSBsb3ctbGV2ZWwgcHl0aG9uIGJpbmRpbmcgZm9yIHRoZQorCXJlbGVhc2UgbmFtZSBtZXRob2QuCisKKwkqIHB5dGhvbi9leGNlcHRpb25zLnB5LCBweXRob24vc2VydmljZS5weTogTWFrZSBmcmVlaW5nIEJ1c05hbWUKKwlvYmplY3RzIHJlbGVhc2UgdGhlIG5hbWUuIEFkZCBhIE5hbWVFeGlzdHNFeGNlcHRpb24sIGFuZCBmaXggYQorCWJ1ZyB3aXRoIGNyZWF0aW5nIFVua25vd25NZXRob2RFeGNlcHRpb24uCisKKwkqIHRlc3QvcHl0aG9uL3Rlc3QtY2xpZW50LnB5OiBBZGQgdGVzdHMgZm9yIGZyZWVpbmcgQnVzTmFtZQorCW9iamVjdHMgY2F1c2luZyBuYW1lcyB0byBiZSByZWxlYXNlZC4KKworMjAwNS0xMS0xNCAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBweXRob24vc2VydmljZS5weTogSW5jbHVkZSB0aGUgdHJhY2ViYWNrIGluIHRoZSBlcnJvciByZXBseSB3aGVuIHdlCisJc2VuZCBhbiBleGNlcHRpb24gb3ZlciB0aGUgYnVzLiBfQkVTVF8gX1BBVENIXyBfRVZFUl8KKworMjAwNS0xMS0xNCAgRGF2aWQgWmV1dGhlbiAgPGRhdmlkekByZWRoYXQuY29tPgorCisJUGF0Y2ggZnJvbSBUaW1vIEhvZW5pZyA8dGhvZW5pZ0BzdXNlLmRlPi4KKworCSogYnVzL2J1cy5jOiBJJ3ZlIHJlY2VudGx5IGludmVzdGlnYXRlZCB3aHkgdGhlIGF1dG9tYXRpYyByZWxvYWQKKwlvZiBjb25maWd1cmF0aW9uIGZpbGVzIGRvZXMgbm90IHdvcmsgYXMgZXhwZWN0ZWQuCisKKwlDdXJyZW50bHksIHJlbG9hZGluZyBjb25maWd1cmF0aW9uIGZpbGVzIGRvZXMgb25seSB3b3JrIHdoZW4KKwlydW5uaW5nIGRidXMtZGFlbW9uIHdpdGggLS1ub2RhZW1vbi4gIElmIHdlIGFyZSBydW5uaW5nIGFzIGRhZW1vbgorCXdlJ3JlIGhpdHRpbmcgYSBkbm90aWZ5IGJ1ZyBvbmNlIHdlIGZvcmsgdGhlIHByb2Nlc3MuCisKKwlXZSdyZSBpbml0aWFsaXppbmcgdGhlIGRub3RpZnkgZmRzIGJlZm9yZSBjYWxsaW5nIGZvcmsoKS4gIE9uY2UKKwl0aGUgY2hpbGQgcHJvY2VzcyBmb3JrZWQgaXQgZG9lcyBzdGlsbCBoYXZlIHRoZSBmZHMgKGFuZCB0aGV5CisJc3RpbGwgc2hvdyB1cCBpbiAvcHJvYy9gcGlkb2YgZGJ1cy1kYWVtb25gL2ZkLykgYnV0IHdlJ3JlIG5vdAorCWdldHRpbmcgU0lHSU8gYXMgY2hhbmdlcyBhcmUgbWFkZSB0byB0aGUgY29uZmlndXJhdGlvbiBmaWxlcy4KKworCVRoZSBhdHRhY2hlZCBwYXRjaCBtb3ZlcyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGRub3RpZnkgZmRzIHRvCisJcHJvY2Vzc19jb25maWdfcG9zdGluaXQoKS4gIFRoaXMgaXMgc2FmZSBmb3IgYWxsIGN1cnJlbnQgY29kZQorCXBhdGhzIGFuZCBzb2x2ZXMgdGhlIGRub3RpZnkgZGlzZnVuY3Rpb24uICBJZiB3ZSdyZSBydW5uaW5nCisJZGJ1cy1kYWVtb24gYXMgZGFlbW9uIHRoZSBmZHMgZm9yIGRub3RpZnkgYXJlIG5vdyBiZWluZworCWluaXRpYWxpemVkIGFmdGVyIGZvcmsoKSBmb3IgdGhlIGNoaWxkIHByb2Nlc3MuCisKKwkqIGNvbmZpZ3VyZS5pbjogVGhlIGN1cnJlbnQgY29uZmlndXJlLmluIGNoZWNrIGZvciBkbm90aWZ5IHByb2JlcworCSd4JHRhcmdldF9vcycgZm9yIGJlaW5nICd4bGludXgtZ251Jy4gIEkndmUgY2hhbmdlZCB0aGUgY2hlY2sgdG8KKwltYXRjaCBmb3IgJ3hsaW51eCcsIHRvby4gQWRkaXRpb25hbGx5IEkgaGF2ZSBhZGFwdGVkIHRoZSBjb25maWd1cmUKKwlvcHRpb24ncyBzdHlsZSB0byBtYXRjaCB3aXRoIHRoZSBvdGhlcnMuCisKKzIwMDUtMTEtMTQgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogcHl0aG9uL2RlY29yYXRvcnMucHksIHB5dGhvbi9zZXJ2aWNlLnB5OiBBZGQgYSBuZXcgYXJndW1lbnQgdG8gdGhlCisJZGJ1cy5zZXJ2aWNlLm1ldGhvZCBkZWNvcmF0b3IgY2FsbGVkIHNlbmRlcl9rZXl3b3JkLCB3aGljaCBpZiBzZXQsCisJc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGFuIGFyZ3VtZW50IHdoaWNoIHdpbGwgYmUgcHJvdmlkZWQgdGhlIGJ1cworCW5hbWUgb2YgdGhlIG1ldGhvZCBjYWxsZXIuCisKKwkqIHRlc3QvcHl0aG9uL3Rlc3QtY2xpZW50LnB5LCB0ZXN0L3B5dGhvbi90ZXN0LXNlcnZpY2UucHk6IEFkZCBhCisJbWV0aG9kIGFuZCB0ZXN0IHRvIGNoZWNrIHRoZSBzZW5kZXJfa2V5d29yZCBmdW5jdGlvbmFsaXR5LgorCisyMDA1LTExLTA3ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBidXMvZHJpdmVyLmMgKGJ1c19kcml2ZXJfaGFuZGxlX3JlbG9hZF9jb25maWcpOiBNYWtlIHN1cmUgd2Ugc2VuZCBhbiAKKwllbXB0eSByZXBseSBzbyBibG9ja2luZyBjYWxscyBkb24ndCBibG9jayBmb3JldmVyIChQYXRjaCBmcm9tIFNqb2VyZCAKKwlTaW1vbnMgPHNqb2VyZCBhdCBsdW9uLm5ldD4pCisKKwkqIEFVVEhPUlM6IEFkZCBSb2JlcnQgTWNRdWVlbiBmb3IgaGlzIHdvcmsgb24gdGhlIFB5dGhvbgorCUJpbmRpbmdzIGFuZCBvdGhlciBwYXJ0cyBvZiBELUJ1cworCisyMDA1LTExLTA3ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIHB5dGhvbi9kZWNvcmF0b3JzLnB5OiBDaGFuZ2UgZW1pdF9zaWduYWwgZnVuY3Rpb24gdG8gdXNlIHRoZQorCXNpZ25hdHVyZSBhbm5vdGF0aW9uIG9mIHRoZSBzaWduYWwgd2hlbiBtYXJoc2FsbGluZyB0aGUgYXJndW1lbnRzIGZyb20KKwl0aGUgc2VydmljZS4gRml4IGEgYnVnIHdoZXJlIHRoZSBjb2RlIGNoZWNraW5nIHNpZ25hdHVyZSBsZW5ndGgKKwlhZ2FpbnN0IGFyZ3VtZW50IGxlbmd0aCByZWZlcmVuY2VkIHRoZSB3cm9uZyB2YXJpYWJsZS4KKworCSogcHl0aG9uL2ludHJvc3BlY3RfcGFyc2VyLnB5OiBBdm9pZCBhZGRpbmcgdGhlIHR5cGUgc2lnbmF0dXJlIG9mCisJc2lnbmFsIGFyZ3VtZW50cyB0byBhbnkgbWV0aG9kcyB3aGljaCBvY2N1ciBhZnRlciB0aGVtIGluIHRoZQorCWludHJvc3BlY3Rpb24gZGF0YSAoISkgYnkgbWFraW5nIHRoZSBwYXJzZXIgYSBsaXR0bGUgbW9yZSBjYXJlZnVsCisJYWJvdXQgaXRzIGN1cnJlbnQgc3RhdGUuCisKKwkqIHB5dGhvbi9zZXJ2aWNlLnB5OiBSZW1vdmUgZGVidWcgcHJpbnRzIGZyb20gbGFzdCBjb21taXQgKGFnYWluIDpEKS4KKworCSogdGVzdC9weXRob24vdGVzdC1jbGllbnQucHksIHRlc3QvcHl0aG9uL3Rlc3Qtc2VydmljZS5weTogQWRkIHRlc3QKKwlzaWduYWxzIHdpdGggc2lnbmF0dXJlIGRlY29yYXRvcnMgdG8gdGVzdCB0aGUgc3RyaWN0IG1hcnNoYWxsaW5nIGNvZGUKKwlnaXZlcyBlcnJvcnMgYXQgdGhlIHJpZ2h0IHRpbWUuIENvdWxkIGRvIHdpdGggY2hlY2tpbmcgdGhlIHNpZ25hbHMKKwlhY3R1YWxseSBnZXQgZW1pdHRlZCB0b28sIGdpdmVuIHRoYXQgdGhlIHRlc3QgZG9lcyBub3RoaW5nIHdpdGgKKwlzaWduYWxzIGF0IHRoZSBtb21lbnQuLi4KKworMjAwNS0xMS0wNyAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBweXRob24vX2RidXMucHk6IEFkZCBXZWFrUmVmZXJlbmNlRGljdGlvbmFyeSBjYWNoZSBvZiBkYnVzLkJ1cworCWluc3RhbmNlcyB0byBzdG9wIG1hZG5lc3Mgb2YgY3JlYXRpbmcgbmV3IGluc3RhbmNlcyByZXByZXNlbnRpbmcKKwl0aGUgc2FtZSBidXMgY29ubmVjdGlvbiBhbGwgdGhlIHRpbWUsIHJlbmRlcmluZyBhbnkgdHJhY2tpbmcgb2YKKwltYXRjaCBydWxlcyBhbmQgYnVzIG5hbWVzIHF1aXRlIG1lYW5pbmdsZXNzLiBDYXVnaHQgYSBidWcgd2hlcmUKKwl0aGUgcHJpdmF0ZSBhcmd1bWVudCB0byBTZXNzaW9uQnVzKCkgYW5kIGZyaWVuZHMgd2FzIGJlaW5nIHBhc3NlZAorCWluIGFzIHVzZV9kZWZhdWx0X21haW5sb29wIGJ5IG1pc3Rha2UuIFN0aWxsIHNvbWUgcHJvYmxlbXMgd2l0aAorCW11bHRpcGxlIGRidXNfYmluZGluZy5Db25uZWN0aW9uIGluc3RhbmNlcyByZXByZXNlbnRpbmcgdGhlIHNhbWUKKwlsb3ctbGV2ZWwgY29ubmVjdGlvbiAoZWcgd2hlbiB5b3UgdXNlIGJvdGggU2Vzc2lvbkJ1cygpIGFuZAorCVN0YXJ0ZXJCdXMoKSBpbiBzYW1lIHByb2Nlc3MpLCBidXQgaXQncyBhIGxvdCBiZXR0ZXIgbm93IHRoYW4gaXQKKwl3YXMuCisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eDogQWRkIGNvbnN0YW50cyB3aXRoIHRoZSByZXR1cm4gdmFsdWVzCisJZm9yIGJ1c19yZXF1ZXN0X25hbWUoKS4KKworCSogcHl0aG9uL3NlcnZpY2UucHk6IFN0b3JlIGJ1cyBuYW1lIGluc3RhbmNlcyBpbiBhIHBlci1kYnVzLkJ1cyBjYWNoZQorCWFuZCByZXRyaWV2ZSB0aGUgc2FtZSBpbnN0YW5jZXMgZm9yIHRoZSBzYW1lIG5hbWUsIHNvIGRlbGV0aW9uIGNhbiBiZQorCWRvbmUgd2l0aCByZWZjb3VudGluZy4gQWxzbyBub3cgdGhyb3dzIHNvbWUga2luZCBvZiBlcnJvciBpZiB5b3UKKwlkb24ndCBhY3R1YWxseSBnZXQgdGhlIG5hbWUgeW91IHJlcXVlc3RlZCwgdW5saWtlIHByZXZpb3VzbHkuLi4KKworCSogdGVzdC9weXRob24vdGVzdC1jbGllbnQucHk6IEFkZCB0ZXN0cyBmb3IgaW5zdGFuY2UgY2FjaGluZyBvZiBidXNlcworCWFuZCBidXMgbmFtZSBvYmplY3RzLgorCisyMDA1LTExLTA0ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eCwgdGVzdC9weXRob24vdGVzdC1jbGllbnQucHk6IEZpeAorCW1hcnNoYWxsaW5nIG9mIGJvb2xlYW4gdmFsdWVzLiBBZGQgc29tZSBib29sZWFucyB0byB0aGUgdmFsdWVzIGluCisJdGhlIHRlc3QgY2xpZW50LgorCisJKiBweXRob24vZGVjb3JhdG9ycy5weSwgcHl0aG9uL3NlcnZpY2UucHk6IEFkZCBhbiAnYXN5bmNfY2FsbGJhY2tzJworCWFyZ3VtZW50IHRvIHRoZSBkYnVzLnNlcnZpY2UubWV0aG9kIGRlY29yYXRvciwgd2hpY2ggYWxsb3dzIHlvdSB0bworCW5hbWUgYXJndW1lbnRzIHRvIHRha2UgdHdvIGNhbGxiYWNrIGZ1bmN0aW9ucyBmb3IgcmVwbHlpbmcgd2l0aAorCXJldHVybiB2YWx1ZXMgb3IgYW4gZXhjZXB0aW9uLgorCisJKiB0ZXN0L3B5dGhvbi90ZXN0LWNsaWVudC5weSwgdGVzdC9weXRob24vdGVzdC1zZXJ2aWNlLnB5OiBBZGQgdGVzdAorCWNhc2UgdXNpbmcgYXN5bmNocm9ub3VzIG1ldGhvZCByZXBseSBmdW5jdGlvbnMsIGJvdGggcmV0dXJuIHZhbHVlcyBhbmQKKwllcnJvcnMsIGFuZCBmcm9tIHdpdGhpbiBib3RoIHRoZSBmdW5jdGlvbiBpdHNlbGYgYW5kIGZyb20gYSBtYWlubG9vcAorCWNhbGxiYWNrLgorCisJKiBweXRob24vZGVjb3JhdG9ycy5weSwgcHl0aG9uL3NlcnZpY2UucHk6IFBlcmZvcm0gY2hlY2tpbmcgdGhhdCB0aGUKKwludW1iZXIgb2YgbWV0aG9kL3NpZ25hbCBhcmd1bWVudHMgbWF0Y2hlcyB0aGUgbnVtYmVyIG9mIHR5cGVzIGluIHRoZQorCXNpZ25hdHVyZSBhdCBjbGFzcyBsb2FkaW5nIHRpbWUsIG5vdCB3aGVuIHlvdSBmaXJzdCBpbnRyb3NwZWN0IHRoZQorCWNsYXNzLgorCisJKiBweXRob24vc2VydmljZS5weTogUmVtb3ZlIGRlYnVnIHByaW50IGxlZnQgYnkgdGhlIGxhc3QgY29tbWl0LgorCisyMDA1LTExLTAzICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIHB5dGhvbi9zZXJ2aWNlLnB5OiBIZWF2eSByZWZhY3RvcmluZyBvZiBtZXRob2QgaW52b2NhdGlvbiwgd2l0aAorCWhvcGVmdWxseSBubyBlZmZlY3Qgb24gZnVuY3Rpb25hbGl0eS4gTnVrZWQgX2Rpc3BhdGNoX2RidXNfbWV0aG9kX2NhbGwKKwlpbiBmYXZvdXIgb2YgYSBuZXcgX21lc3NhZ2VfY2IgdGhhdCB1c2VzIHNlcGVyYXRlIGZ1bmN0aW9ucyBmb3IKKwlsb29raW5nIHVwIHRoZSBtZXRob2QgdG8gY2FsbCwgbWFyc2hhbGxpbmcgdGhlIHJldHVybiB2YWx1ZXMsIGFuZAorCXNlbmRpbmcgZXhjZXB0aW9ucyBhcyBlcnJvcnMsIGFuZCBpcyBlYXNpZXIgdG8gZm9sbG93IGFzIGEKKwljb25zZXF1ZW5jZS4gIEZpeGVzIHNvbWUgY29ybmVyIGNhc2VzIGFib3V0IHJldHVybmluZyB0aGluZ3MgdGhhdAorCWRvbid0IG1hdGNoIHlvdXIgZGVjbGFyZWQgb3V0X3NpZ25hdHVyZSwgYWxsb3dzIGV4Y2VwdGlvbnMgdG8gZGVmaW5lCisJX2RidXNfZXJyb3JfbmFtZSBhbmQgaGF2ZSBpdCBiZSBzZW50IG92ZXIgdGhlIGJ1cyBhcyB0aGUgZXJyb3IgbmFtZSwKKwlhbmQgcGF2ZXMgdGhlIHdheSBmb3IgY29vbCBzdHVmZiBsaWtlIGhlZWRpbmcgdGhlIG1lc3NhZ2Ugbm8gcmVwbHkKKwlmbGFnLCBhc3luY2hyb25vdXMgbWV0aG9kIGltcGxlbWVudGF0aW9ucywgaW5mb3JtaW5nIHRoZSBtZXRob2Qgb2YgdGhlCisJc2VuZGVyLCBhbmQgaW5jbHVkaW5nIGJhY2t0cmFjZXMgaW4gdGhlIGVycm9yIG1lc3NhZ2VzLgorCisJKiB0ZXN0L3B5dGhvbi90ZXN0LWNsaWVudC5weTogQ2F0Y2ggYW5kIHByaW50IGV4Y2VwdGlvbnMgdGhyb3duIGluIHRoZQorCWFzeW5jIGNhbGxiYWNrIHRlc3RzLCByYXRoZXIgdGhhbiBwYXNzaW5nIHRoZW0gdG8gdGhlIGxvdy1sZXZlbAorCWJpbmRpbmdzIHRvIGJlIGlnbm9yZWQgaW4gYSBub2lzeSBhbmQgZnJ1c3RyYXRpbmcgbWFubmVyLgorCisyMDA1LTExLTAzICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIHB5dGhvbi9fZGJ1cy5weSwgcHl0aG9uL3Byb3hpZXMucHksIHB5dGhvbi9zZXJ2aWNlLnB5OiBBZGQgX19yZXByX18KKwlmdW5jdGlvbnMgdG8gZGJ1cy5CdXMsIGRidXMuc2VydmljZS5CdXNOYW1lIGFuZCBkYnVzLnNlcnZpY2UuT2JqZWN0LAorCXR3ZWFrIG90aGVycyB0byBiZSBjb25zaXN0ZW50LgorCisJKiB0ZXN0L3B5dGhvbi90ZXN0LWNsaWVudC5weTogVHdlYWsgb3V0cHV0IG9mIHRlc3RJbmhlcml0YW5jZS4KKworMjAwNS0xMC0yOSAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBweXRob24vc2VydmljZS5weTogTWFqb3IgY2hhbmdlcyB0byBhbGxvdyBtdWx0aXBsZSBpbmhlcml0YW5jZQorCWZyb20gY2xhc3NlcyB0aGF0IGRlZmluZSBELUJ1cyBpbnRlcmZhY2VzOgorCQorCSAxLiBDcmVhdGUgYSBuZXcgSW50ZXJmYWNlIGNsYXNzIHdoaWNoIGlzIHRoZSBwYXJlbnQgY2xhc3Mgb2YKKwkgICAgT2JqZWN0LCBhbmQgbWFrZSB0aGUgT2JqZWN0VHlwZSBtZXRhY2xhc3MgaW50byBJbnRlcmZhY2VUeXBlLgorCQorCSAyLiBQYXRjaCB3cml0dGVuIHdpdGggUm9iIFRheWxvciB0byByZXBsYWNlIHVzZSBvZiBtZXRob2RfdnRhYmxlCisJICAgIHdpdGggY29kZSB0aGF0IHdhbGtzIHRoZSBjbGFzcydzIF9fTVJPX18gKG1ldGhvZCByZXNvbHV0aW9uIG9yZGVyKQorCSAgICB0byBiZWhhdmUgbGlrZSBQeXRob24gZG9lcyB3aGVuIGludm9raW5nIG1ldGhvZHMgYW5kIGFsbG93CisJICAgIG92ZXJyaWRpbmcgYXMgeW91J2QgZXhwZWN0LiBDb2RlIGlzIHF1aXRlIHRyaWNreSBiZWNhdXNlCisJICAgIHdlIGhhdmUgdG8gZmluZCB0d28gbWV0aG9kcywgdGhlIG9uZSB0byBpbnZva2Ugd2hpY2ggaGFzIHRoZQorCSAgICByaWdodCBuYW1lIGFuZCBpc24ndCBkZWNvcmF0ZWQgd2l0aCB0aGUgL3dyb25nLyBpbnRlcmZhY2UsCisJICAgIGFuZCB0aGUgb25lIHRvIHBpY2sgdXAgdGhlIHNpZ25hdHVyZXMgZnJvbSB3aGljaCBpcyBkZWNvcmF0ZWQKKwkgICAgd2l0aCB0aGUgcmlnaHQgaW50ZXJmYWNlLgorCQorCSAgICBUaGUgc2FtZSBjYXZlYXRzIGFwcGx5IGFzIHRvIG5vcm1hbCBtdWx0aXBsZSBpbmhlcml0YW5jZSAtCisJICAgIHRoaXMgaGFzIHVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgeW91IHRyeSBhbmQgaW5oZXJpdCBmcm9tIHR3bworCSAgICBjbGFzc2VzIHRoYXQgZGVmaW5lIGEgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSBidXQgYXJlCisJICAgIGRlY29yYXRlZCB3aXRoIGRpZmZlcmVudCBpbnRlcmZhY2VzLiBZb3Ugc2hvdWxkIGRlY29yYXRlCisJICAgIHlvdXIgb3ZlcnJpZGluZyBtZXRob2Qgd2l0aCB0aGUgaW50ZXJmYWNlIHlvdSB3YW50LgorCQorCSAzLiBSZXBsYWNlIGdydW5neSBpbnRyb3NwZWN0aW9uIFhNTCBnZW5lcmF0aW9uIGNvZGUgaW4gdGhlIG1ldGFjbGFzcworCSAgICB3aXRoIGRpY3Rpb25hcmllcyB0aGF0IGNvcGUgY29ycmVjdGx5IHdpdGggbXVsdGlwbGUgaW5oZXJpdGFuY2UKKwkgICAgYW5kIHRoZSBvdmVycmlkaW5nIG9mIG1ldGhvZHMuIFRoaXMgYWxzbyB1c2VzIHRoZSBzaWduYXR1cmUKKwkgICAgZGVjb3JhdGlvbnMgdG8gcHJvdmlkZSBjb3JyZWN0IGludHJvc3BlY3Rpb24gZGF0YSwgaW5jbHVkaW5nCisJICAgIHRoZSBkZWJ1dCBhcHBlYXJhbmNlIG9mIHRoZSB0eXBlcyBvZiB5b3VyIHJldHVybiB2YWx1ZXMuIDpECisKKwkqIHRlc3QvcHl0aG9uL3Rlc3QtY2xpZW50LnB5LCB0ZXN0L3B5dGhvbi90ZXN0LXNlcnZpY2UucHk6IEFkZCBhIHRlc3QKKwljYXNlIHRvIHRyeSBpbnZva2luZyBhbiBtZXRob2QgdGhhdCBvdmVycmlkZXMgb25lIGluaGVyaXRlZCBmcm9tIGEKKwlELUJ1cyBpbnRlcmZhY2UgY2xhc3MuCisKKzIwMDUtMTAtMjkgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4OiBUd2VhayAncmFpc2UgQXNzZXJ0aW9uRXJyb3InIHRvIGFzc2VydCgpLgorCUFkZCBjaGVja2luZyBmb3IgdGhlIGVuZCBvZiBzdHJ1Y3QgY2hhcmFjdGVyIHdoZW4gbWFyc2hhbGxpbmcgYQorCXN0cnVjdCBpbiBNZXNzYWdlSXRlci5hcHBlbmRfc3RyaWN0LgorCisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1zZXJ2aWNlLnB5LAorCXB5dGhvbi9leGFtcGxlcy9nY29uZi1wcm94eS1zZXJ2aWNlLnB5LAorCXB5dGhvbi9leGFtcGxlcy9nY29uZi1wcm94eS1zZXJ2aWNlMi5weTogVXBkYXRlIHRvIHVzZSBnb2JqZWN0CisJbWFpbmxvb3AgZGlyZWN0bHkgcmF0aGVyIHRoYW4gYXBwZWFyaW5nIHRvIGRlcGVuZCBvbiBndGsuCisKKwkqIHB5dGhvbi90ZXN0L3Rlc3QtY2xpZW50LnB5LCBweXRob24vdGVzdC90ZXN0LXNlcnZlci5weTogUmVtb3ZlCisJb2Jzb2xldGUgYW5kIGJyb2tlbiB0ZXN0IHNjcmlwdHMgZm9yIG9sZCBiaW5kaW5ncy4gV2UgaGF2ZSB1cCB0byBkYXRlCisJYW5kIHdvcmtpbmcgdGVzdHMgaW4gdGVzdC9weXRob24vLgorCisyMDA1LTEwLTI5ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIHB5dGhvbi9kZWNvcmF0b3JzLnB5OiBBZGQgb3B0aW9uYWwgYXJndW1lbnRzIHRvIHRoZSBtZXRob2QgYW5kCisJc2lnbmFsIGRlY29yYXRvcnMgdG8gYWxsb3cgeW91IHRvIHNwZWNpZnkgdGhlIHNpZ25hdHVyZSBvZiBhcmd1bWVudHMKKwlhbmQgcmV0dXJuIHZhbHVlcy4gUHJlc2VydmUgdGhlIGRvYyBzdHJpbmdzIG9mIHNpZ25hbCBmdW5jdGlvbnMgaW4gdGhlCisJZGVjb3JhdGVkIHZlcnNpb24sIGZvciBweWRvYyBhbmQgZnJpZW5kcy4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LCBweXRob24vcHJveGllcy5weTogUmVwbGFjZSB0aGUKKwlwYXJzZV9zaWduYXR1cmVfYmxvY2sgZnVuY3Rpb24gd2l0aCBhbiBpdGVyYWJsZSBkYnVzLlNpZ25hdHVyZSgpCisJdHlwZS4gRml4IGEgYnVnIGluIE1lc3NhZ2VJdGVyLmFwcGVuZF9zdHJpY3Qgd2hlcmUgeW91IGNvdWxkIGFwcGVuZAorCWFueXRoaW5nIGJ5IGNsYWltaW5nIGl0IHdhcyBhIHN0cmluZy4KKworCSogcHl0aG9uL3NlcnZpY2UucHk6IFVzZSB0aGUgb3V0X3NpZ25hdHVyZSBkZWNvcmF0aW9uIG9uIG1ldGhvZHMgdG8KKwltYXJzaGFsIHJldHVybiB2YWx1ZXMsIG1lYW5pbmcgeW91IG5vIGxvbmdlciByZXF1aXJlIGRidXMuQXJyYXkoKQorCW9yIGRidXMuRGljdGlvbmFyeSgpIHRvIGluZGljYXRlIHRoZSB0eXBlIHdoZW4gcmV0dXJuaW5nIGVtcHR5CisJYXJyYXlzIG9yIGRpY3Rpb25hcmllcy4gRml4IGEgYnVnIHdoZXJlIGV4Y2VwdGlvbnMgd2hpY2ggYXJlIGRlZmluZWQKKwlpbiBfX21haW5fXyBhcmUgbm90IHR1cm5lZCBpbnRvIGVycm9yIHJlcGxpZXMuCisKKwkqIHRlc3QvcHl0aG9uL3Rlc3QtY2xpZW50LnB5LCB0ZXN0L3B5dGhvbi90ZXN0LXNlcnZpY2UucHk6IEFkZCB0ZXN0CisJZm9yIGNvcnJlY3QgbWFyc2hhbGxpbmcgb2YgcmV0dXJuIHZhbHVlcyBhY2NvcmRpbmcgdG8gb3V0X3NpZ25hdHVyZS4KKwlGaXggYSBidWcgaW4gdGhlIGFzeW5jIGNhbGwgdGVzdCB3aGVyZSB0aGUgZXJyb3JfaGFuZGxlciBpcyBtaXNzaW5nIGEKKwlzZWxmIGFyZ3VtZW50LgorCisyMDA1LTEwLTI5ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIGdsaWIvTWFrZWZpbGUuYW0sIGdsaWIvZXhhbXBsZXMvTWFrZWZpbGUuYW0sCisJZ2xpYi9leGFtcGxlcy9zdGF0ZW1hY2hpbmUvTWFrZWZpbGUuYW06IE1lcmdlIHBhdGNoIGZyb20gVWJ1bnR1IGJ5CisJRGFuaWVsIFN0b25lIHRvIHJlcGxhY2UgZXhwbGljaXQgY2FsbHMgdG8gbGlidG9vbCB3aXRoICQoTElCVE9PTCkuCisKKwkqIHRlc3QvcHl0aG9uLy5jdnNpZ25vcmU6IEFkZCBydW4td2l0aC10bXAtc2Vzc2lvbi1idXMuY29uZi4KKworCSogdG9vbHMvZGJ1cy1tb25pdG9yLjEsIHRvb2xzL2RidXMtbW9uaXRvci5jOiBNZXJnZSBkYnVzLW1vbml0b3IgcGF0Y2gKKwlmcm9tIFVidW50dSBieSBEYW5pZWwgU2lsdmVyc3RvbmUgdG8gYWxsb3cgc3BlY2lmeWluZyBtYXRjaCBydWxlcyBvbgorCXRoZSBjb21tYW5kIGxpbmUuCisKKzIwMDUtMTAtMjcgIFJvc3MgQnVydG9uICA8cm9zc0BvcGVuZWRoYW5kLmNvbT4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtaGVhZGVyLmM6CisJUmVtb3ZlIGRlYWQgY29kZS4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYzoKKwlTdG9wIGNvbXBpbGVyIHdhcm5pbmcuCisKKzIwMDUtMTAtMjUgIFJvc3MgQnVydG9uICA8cm9zc0BvcGVuZWRoYW5kLmNvbT4KKworCSogZGJ1cy9kYnVzLWF1dGguYzoKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItdW5peC5jOgorCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmM6CisJKiBnbGliL2RidXMtZ21haW4uYzoKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmM6CisJQWRkIHNvbWUgY29uc3Qga2V5d29yZHMuCisKKzIwMDUtMTAtMjUgIFJvc3MgQnVydG9uICA8cm9zc0BvcGVuZWRoYW5kLmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6CisJRG9jdW1lbnQgdGhlIE5vUmVwbHkgYW5ub3RhdGlvbi4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmg6CisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYzoKKwlSZXNwZWN0IHRoZSBOb1JlcGx5IGFubm90YXRpb24uCisKKzIwMDUtMTAtMjQgIFJvYmVydCBNY1F1ZWVuIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXggKFN0cmluZywgTWVzc2FnZUl0ZXIpOiBtYWtlIEQtQnVzIHN0cmluZ3MKKwlkZXJpdmUgZnJvbSB1bmljb2RlIGluc3RlYWQgb2Ygc3RyLCBhbmQgZW5jb2RlL2RlY29kZSBVVEYtOCB3aGVuCisJbWFyc2hhbGxpbmcvdW5tYXJzaGFsbGluZyBidXMgbWVzc2FnZXMKKworCSogcHl0aG9uL2ludHJvc3BlY3RfcGFyc2VyLnB5OiBlbmNvZGUgaW50cm9zcGVjdGlvbiBkYXRhIGFzIFVURi04CisJYmVmb3JlIHBhc3NpbmcgdGhlIGJ1ZmZlciBpbnRvIGxpYnhtbDIKKworCSogdGVzdC9weXRob24vdGVzdC1jbGllbnQucHk6IGFkZCB1bmljb2RlIHRlc3Qgc3RyaW5ncworCisJKiB0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy8uY3ZzaWdub3JlLCB0ZXN0L3B5dGhvbi8uY3ZzaWdub3JlOgorCWlnbm9yZSBnZW5lcmF0ZWQgcHl0aG9uIHRlc3QgZmlsZXMKKworMjAwNS0xMC0xNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS11dGlscy5jIChoYXNoX2ZyZWVfZnJvbV9ndHlwZSk6IGhhbmRsZSBnZG91YmxlCisJYW5kIEdfVFlQRV9WQUxVRV9BUlJBWSAoREJVU19UWVBFX1NUUlVDVCkKKwkoZ3ZhbHVlX2Zyb21faGFzaF92YWx1ZSwgaGFzaF92YWx1ZV9mcm9tX2d2YWx1ZSk6IGhhbmRsZSBnZG91YmxlCisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuYyAoZGJ1c19ndmFsdWVfdG9fc2lnbmF0dXJlKTogYWRkIG1pc3NpbmcKKwlEQlVTX1NUUlVDVF9CRUdJTl9DSEFSIGFuZCBEQlVTX1NUUlVDVF9FTkRfQ0hBUiBjaGFyYXRlcnMKKwl3aGVuIGNvbnN0cnVjdGluZyBzdHJ1Y3Qgc2lnbmF0dXJlcworCisJKiBweXRob24vX2RidXMucHkgKEJ1cyk6IGhhbmRsZSBwcml2YXRlIGNvbm5lY3Rpb25zIHVzaW5nIHRoZQorCXByaXZhdGUga2V5d29yZCBpbiB0aGUgY29uc3RydWN0b3IuIGRlZmF1bHRzIHRvIHByaXZhdGU9RmFsc2UKKwkoQnVzOjpjbG9zZSk6IG5ldyBtZXRob2QgdG8gY2xvc2UgYSBjb25uZWN0aW9uIHRvIHRoZSBidXMKKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4IChDb25uZWN0aW9uOjpjbG9zZSk6IHJlbmFtZWQgbWV0aG9kCisJd2FzIHByZXZpb3VzbHkgY2FsbGVkIGRpc2Nvbm5lY3QKKwkoYnVzX2dldCk6IG5vdyBzdXBwb3J0cyBnZXR0aW5nIGEgcHJpdmF0ZSBjb25uZWN0aW9uCisKKwkqIHB5dGhvbi9wcm94aWVzLnB5IChQcm94eU1ldGhvZDo6X19jYWxsX18pOiBjaGVjayBpZiBpZ25vcmVfcmVwbHkKKwlrZXl3b3JkIGlzIHNldCB0byBUcnVlLiAgaWYgaXQgaXMsIGV4ZWN1dGUgdGhlIG1ldGhvZCB3aXRob3V0IHdhaXRpbmcKKwlmb3IgYSByZXBseQorCShQcm94eU9iamVjdDo6X2ludHJvc3BlY3RfZXhlY3V0ZV9xdWV1ZSk6IG5ldyBtZXRob2QgZm9yIGV4ZWN1dGluZworCWFsbCB0aGUgcGVuZGluZyBtZXRob2RzIHRoYXQgd2VyZSB3YWl0aW5nIGZvciB0aGUgaW50cm9zcGVjdCB0bworCWZpbmlzaC4gIHRoaXMgaXMgY2FsbGVkIHdoZW4gaW50cm9zcGVjdCBlaXRoZXIgc3VjY2VlZHMgb3IgZmFpbHMKKwkoUHJveHlPYmplY3Q6Ol9pbnRyb3NwZWN0X2Vycm9yX2hhbmRsZXIpOiBjYWxsIHF1ZXVlZCBtZXRob2RzCisKKzIwMDUtMTAtMTQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eCAoTWVzc2FnZUl0ZXI6OmFwcGVuZF9zdHJpY3QpOiBjaGVjayBmb3IKKwlTVFJVQ1RfQkVHSU4gbm90IFRZUEVfU1RSVUNUIGluIGluZGljYXRlIHdlIGFyZSBtYXJzaGFsbGluZyBhIHN0cnVjdAorCisJKiBweXRob24vc2VydmljZS5weSAoT2JqZWN0OjpfbWVzc2FnZV9jYik6IGhhbmRsZSBleGNlcHRpb25zIGNvcnJlY3RseQorCWJ5IHNlbmRpbmcgdGhlbSBvdmVyIHRoZSB3aXJlIHRvIHRoZSBjYWxsaW5nIGFwcC4gIFRoaXMgbWFrZXMgc3VyZQorCXRoZSBjbGllbnQgcmV0dXJucyBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIHdhaXRpbmcgdGhlIDE1IHNlY29uZHMgdG8KKwl0aW1lb3V0LgorCisJKiB0ZXN0L3B5dGhvbi90ZXN0LWNsaWVudC5weSAoVGVzdERCdXNCaW5kaW5nczo6dGVzdEJlbmNobWFya0ludHJvc3BlY3QpOiAKKwlBZGQgYSB0ZXN0IHRvIGJlbmNobWFyayBob3cgbG9uZyBpdCB0YWtlcyB0byBpbnRyb3NwZWN0IGEgc2VydmljZSBhbmQgCisJY2FsbCBhIG1ldGhvZCB3aGljaCByZXR1cm5zIGEgbGFyZ2UgZWxlbWVudCAocHJldHR5IGZhc3QpCisKKwkqIHRlc3QvcHl0aG9uL3Rlc3Qtc2VydmljZS5weSAoVGVzdE9iamVjdDo6R2V0Q29tcGxleEFycmF5KTogbmV3IHRlc3QgCisJbWV0aG9kIHdoaWNoIHB1c2hlcyBhIGxvdCBvZiBkYXRhCisKKzIwMDUtMTAtMTMgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9zZXJ2aWNlLnB5KE9iamVjdFR5cGU6Ol9yZWZsZWN0X29uX3NpZ25hbCwgX3JlZmxlY3Rfb25fbWV0aG9kKTogCQorCXJlY2xhaW0gbWVtb3J5IG91dHNpZGUgb2YgdGhlIGxvb3AgYW5kIHVzZSBkZWwgaXN0ZWFkIG9mIGp1c3Qgc2V0dGluZworCXRoZSBrZXkgdG8gTm9uZQorCisyMDA1LTEwLTEzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vc2VydmljZS5weSAoT2JqZWN0VHlwZTo6X3JlZmxlY3Rfb25fc2lnbmFsKTogQWx3YXlzIGNsb3NlCisJc2lnbmFsIHRhZyBldmVuIHdoZW4gdGhlcmUgYXJlIG5vIGFyZ3VtZW50cworCisyMDA1LTEwLTEzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IFNldCBtb25vLCBtb25vLWRvY3MgYW5kIFF0MyB0byBkZWZhdWx0CisJdG8gbm8gaW5zdGVhZCBvZiBhdXRvIHdoZW4gYnVpbGRpbmcuICBUaGVzZSBiaW5kaW5ncyBkbyBub3QKKwloYXZlIGZ1bGwgdGltZSBtYWludGFpbmVycyBhbmQgd2lsbCBub3QgYmUgc3VwcG9ydGVkIGZvciB0aGUKKwkxLjAgcmVsZWFzZS4KKworMjAwNS0xMC0xMiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCXBhdGNoZXMgZnJvbSBNaWNoYWVsIEtyaXZvcnVjaGtvIDxtaXNoYSBhdCBzdW4uY29tPjogCisJCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChfZGJ1c19jb25uZWN0aW9uX3F1ZXVlX3JlY2VpdmVkX21lc3NhZ2VfbGluaywKKwlfZGJ1c19jb25uZWN0aW9uX21lc3NhZ2Vfc2VudCwgCisJX2RidXNfY29ubmVjdGlvbl9zZW5kX3ByZWFsbG9jYXRlZF91bmxvY2tlZF9ub191cGRhdGUsIAorCV9kYnVzX2Nvbm5lY3Rpb25fcG9wX21lc3NhZ2VfbGlua191bmxvY2tlZCk6IGhhbmRsZSB0aGUgY2FzZSB3aGVuIHBhdGggCisJaXMgTlVMTCB3aGVuIGNhbGxpbmcgX2RidXNfdmVyYm9zZQorCisJKiBjb25maWd1cmUuaW46IGNoZWNrIGZvciBmdW5jdGlvbnMgZ2V0cGVlcnVjcmVkIGFuZCBnZXRwZWVyZWlkCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3JlYWRfY3JlZGVudGlhbHNfdW5peF9zb2NrZXQpOiBwcm92aWRlcyAKKwlzdXBwb3J0IG9mIGF1dGggRVhURVJOQUwgb24gU29sYXJpcyAxMCsgKGdldHBlZXJ1Y3JlZCksIEZyZWVCU0QgNC42KywgCisJT3BlbkJTRCAzLjArIGFuZCBGcmVlQlNEIDUuMCsgYXMgd2VsbCBhcyBNYWNPU1ggMTAuMisgKGdldHBlZXJlaWQpLiAKKwlQYXRjaCB3YXMgb25seSB0ZXN0ZWQgb24gU29sYXJpcyAxMCB4ODYgc28gaXQgbWlnaHQgYmUgaXNzdWVzCisJd2l0aCBvdGhlciBwbGF0Zm9ybXMgKGkuZS4gQlNEcyBhbmQgTWFjT1NYKQorCQorCisyMDA1LTEwLTA1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLmMgKG1hcnNoYWxfdmFyaWFudCk6IGNhbGwgX2RidXNfZ3ZhbHVlX21hcnNoYWwgCisJaW5zdGVhZCBvZiBtYXJzaGFsIGJhc2ljIHNvIHdlIGNhbiBoYW5kbGUgcmVjdXJzaXZlIHR5cGVzIGluIGEgdmFyaWFudAorCisJKiB0ZXN0L2dsaWIvdGVzdC1kYnVzLWdsaWIuYzogQWRkIHRlc3QgZm9yIG1hcnNoYWxpbmcgcmVjdXJpdmUgdHlwZXMKKwlpbiB2YXJpYW50cworCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYywgdGVzdC1zZXJ2aWNlLWdsaWIueG1sCisJKG15X29iamVjdF9lY2hvX3ZhcmlhbnQgW0VjaG9WYXJpYW50XSwgCisJbXlfb2JqZWN0X3Byb2Nlc3NfdmFyaWFudF9vZl9hcnJheV9vZl9pbnRzMTIzCisJW1Byb2Nlc3NWYXJpYW50T2ZBcnJheU9mSW50czEyM10pOiAKKwlBZGQgdHdvIHRlc3QgbWV0aG9kcworCisJKiBweXRob24vaW50cm9zcGVjdF9wYXJzZXIucHk6IE5ldyBtb2R1bGUgZm9yIHBhcnNpbmcgaW50cm9zcGVjdAorCWRhdGEuCisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eDoKKwkodmFyaW91cyBwbGFjZXMpOiB3aGVuIHRocm93aW5nIGVycm9ycyBmaXggdG8gdXNlIGVycm9ybXNnIGluc3RlYWQgCisJb2YgbWVzc2FnZSBsb2NhbCB2YXJpYWJsZSBiZWNhdXNlIFB5cmV4IGNhbiBnZXQgY29uZnVzZWQgd2l0aCBvdGhlciAKKwltZXNzYWdlIHZhcmlhYmxlcyAoaW5pdGlhbCBwYXRjaCBieSBSb2JlcnQgTWNRdWVlbiAKKwk8cm9iZXJ0Lm1jcXVlZW4gYXQgY29sbGFib3JhLmNvLnVrPikKKwkoTWVzc2FnZUl0ZXI6OnBhcnNlX3NpZ25hdHVyZV9ibG9jayk6IG5ldyBtZXRob2QgZm9yIGdldHRpbmcgdGhlIG5leHQKKwlibG9jayBpbiBhIHNpZ25pdHVyZS4KKwkoTWVzc2FnZUl0ZXI6OmFwcGVuZF9zdHJpY3QpOiBuZXcgbWV0aG9kIGZvciBhcHBlbmRpbmcgdmFsdWVzIHN0cmljdGx5CisJdXNpbmcgdGhlIHBhc3NlZCBpbiBzaWduYXR1cmUgaW5zdGVhZCBvZiBndWVzc2luZyBhdCB0aGUgdHlwZQorCShNZXNzYWdlSXR0ZXI6OiBhcHBlbmRfZGljdCwgYXBwZW5kX3N0cnVjdCwgYXBwZW5kX2FycmF5KTogdXNlIAorCXNpZ25hdHVyZXMgdG8gbWFyc2hhbCBjaGlsZHJlbiBpZiB0aGUgc2lnbmF0dXJlIGlzIGF2YWlsYWJsZQorCQorCSogcHl0aG9uL2V4Y2VwdGlvbnMucHkgKEludHJvc3BlY3Rpb25QYXJzZXJFeGNlcHRpb24pOiBuZXcgZXhjZXB0aW9uCisKKwkqIHB5dGhvbi9wcm94aWVzLnB5IChQcm94eU1ldGhvZDo6X19jYWxsX18pOiBNYXJzaGFsIGFyZ3Mgd2l0aCAKKwlpbnRyb3NwZWN0ZWQgc2lnbmF0dXJlcyBpZiBhdmFpbGFibGUsIGVsc2Ugd2UgZmFsbCBiYWNrIHRvIHRoZQorCW9sZCB3YXkgb2YgZG9pbmcgdGhpbmdzLgorCShQcm94eU9iamVjdDo6X2ludHJvc3BlY3RfcmVwbHlfaGFuZGxlciApOiBwYXJzZSBpbnRyb3NwZWN0aW9uIGRhdGEKKwkKKwkqIHB5dGhvbi9zZXJ2aWNlLnB5IChPYmplY3RUeXBlOjpfcmVmbGVjdF9vbl9tZXRob2QpOiBQcm9wZXJseQorCXRlcm1pbmF0ZSA8bWV0aG9kPiBpZiB0aGVyZSBhcmUgbm8gYXJncyBpbiB0aGUgcmVmbGVjdGlvbiBkYXRhCisKKwkqIHRlc3QvcHl0aG9uL3Rlc3QtY2xpZW50LnB5OiBhZGQgdGVzdHMgZm9yIHRhbGtpbmcgd2l0aCB0aGUgR0xpYgorCXRlc3Qgc2VydmVyLiAgVGhpcyBnaXZlcyB1cyBiZXR0ZXIgY292ZXJhZ2UgZm9yIGludHJvc3BlY3Rpb24gc2luY2UKKwlweXRob24gdG8gcHl0aG9uIHdpbGwgYWx3YXlzIGdlbmVyYXRlIGFyZ3VtZW50cyBhcyB2YXJpYW50cy4gIEl0IGFsc28KKwlhbGxvd3MgdXMgdG8gdGVzdCB0aGUgcm9idXN0bmVzcyBvZiB0aGUgR0xpYiBiaW5kaW5ncyBhbmQgaW50ZXJsYW5ndWFnZQorCWNvbW11bmljYXRpb25zLgorCisJCisyMDA1LTEwLTAzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBidXMvZHJpdmVyLmMgKGJ1c19kcml2ZXJfaGFuZGxlX2ludHJvc3BlY3QpOiBBZGQgc2lnbmFscworCXRvIHRoZSBpbnRyb3NwZWN0IGRhdGEuIChwYXRjaCBmcm9tIERhbmllbCBQLiBCZXJyYW5nZSAKKwk8ZGFuIGF0IGJlcnJhbmdlLmNvbT4pCisKKwkqIGJ1cy9kaXNwYXRjaC5jIChjaGVja19leGlzdGVudF9waW5nKTogQWRkIHRlc3RjYXNlIGZvciBQaW5nCisJCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChfZGJ1c19jb25uZWN0aW9uX3BlZXJfZmlsdGVyLAorCV9kYnVzX2Nvbm5lY3Rpb25fcnVuX2J1aWx0aW5fZmlsdGVycyk6IENoYW5nZWQgdGhlc2UgdG8KKwliZSB1bmxvY2tfbm9fdXBkYXRlIGZ1bmN0aW9ucyBhbmQgY2FsbCAKKwlfZGJ1c19jb25uZWN0aW9uX3NlbmRfdW5sb2NrZWRfbm9fdXBkYXRlIGluc3RlYWQgb2YKKwlkYnVzX2Nvbm5lY3Rpb25fc2VuZCB0byBhdm9pZCBsb2NraW5nIGVycm9ycy4KKwkKKwkqIGRvYy9UT0RPOiBSZW1vdmVkIHRoZSBtYWtlIFBpbmcgdGVzdCBUT0RPCisJCisyMDA1LTA5LTI2ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL1B5dGhvbi5weXg6IEZpeGVkIG1lbW9yeSBsZWFrcyB3aGVuIHRocm93aW5nIGVycm9ycy4KKwlXZSBub3cgY29weSB0aGUgbWVzc2FnZSBmcm9tIGEgREJ1c0Vycm9yIGFuZCB0aGVuIGZyZWUgCisJdGhlIGVycm9yIG9iamVjdCBiZWZvciB0aHJvd2luZyB0aGUgZXJyb3IKKworCSogZ2xpYi9kYnVzLWdsaWItdG9vbC5jOiByZW1vdmVkIGV4dHJhIGNvbW1hIGF0IHRoZSBlbmQgb2YgdGhlCisJREJ1c0JpbmRpbmdPdXRwdXRNb2RlIGVudW0gd2hpY2ggd2FzIGNhdXNpbmcgYSB3YXJuaW5nLgorCSNpbmNsdWRlIDx0aW1lLmg+IHNvIHVzaW5nIHRpbWVfdCBpcyBleHBsaWNpdGx5IGRlZmluZWQKKworMjAwNS0wOS0yNiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogSW50ZWdyYXRlIHBhdGNoZXMgZnJvbSBMZW5uYXJ0IFBvZXR0ZXJpbmcgPG16c3FiIGF0IDBwb2ludGVyLmRlPjoKKwktIGRidXMvZGJ1cy1idXMuYworCShpbnRlcm5hbF9idXNfZ2V0KTogbmV3IG1ldGhvZCB0aGF0IHRha2Ugb3ZlciB0aGUgaGVhdnkgbGlmdGluZworCW9mIGRidXNfYnVzX2dldCBhbmQgYWRkcyB0aGUgYWJpbGl0eSB0byBnZXQgYSBwcml2YXRlIGNvbm5lY3Rpb24KKwl0byB0aGUgYnVzCisJKGRidXNfYnVzX2dldCk6IHdyYXBwZXIgdG8gaW50ZXJuYWxfYnVzX2dldCB0aGF0IHByb3ZpZGVzIHRoZSBzYW1lCisJaW50ZXJmYWNlIGFzIGluIHByZXZpb3VzIHZlcnNpb25zCisJKGRidXNfYnVzX2dldF9wcml2YXRlKTogbmV3IG1ldGhvZCB0aGF0IGlzIGEgd3JhcHBlciB0byAKKwlpbnRlcm5hbF9idXNfZ2V0IHRvIGdldCBhIHByaXZhdGUgY29ubmVjdGlvbiB0byB0aGUgYnVzCisKKwktIGRidXMvZGJ1cy1idXMuaAorCShkYnVzX2J1c19nZXRfcHJpdmF0ZSk6IGFkZCBhcyBhIHB1YmxpYyBsaWJkYnVzIGludGVyZmFjZQorCisJLSBkYnVzLTEucGMuaW46IG91dHB1dCBzeXN0ZW1fYnVzX2RlZmF1bHRfYWRkcmVzcyBhbmQgCisJc3lzY29uZmRpciB2YXJpYWJsZXMgc28gYXBwcyBjYW4gdXNlIHRoZW0gd2hlbiBjb21waWxpbmcKKworMjAwNS0wOS0yMyAgSGFyYWxkIEZlcm5lbmdlbCAgPGhhcnJ5QGtkZXZlbG9wLm9yZz4KKwkqIGRidXMvcXQ6IE5ldyBRdCBiaW5kaW5ncworCisyMDA1LTA5LTEyICBXYWxkbyBCYXN0aWFuICA8YmFzdGlhbkBrZGUub3JnPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5jLAorCWRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sLCB0ZXN0L01ha2VmaWxlLmFtLAorCXRlc3QvdGVzdC1uYW1lcy5jOiBhbGxvdyBoeXBoZW5zIGluIGJ1cyBuYW1lcy4KKworMjAwNS0wOS0xMSAgTWFyayBNY0xvdWdobGluICA8bWFya0Bza3luZXQuaWU+CisKKwkqIHRlc3QvZGF0YS9hdXRoL2ZhbGxiYWNrLmF1dGgtc2NyaXB0OiB3ZSBkb24ndAorCXJldHJ5IHRoZSBFWFRFUk5BTCBtZXRob2Qgd2hlbiB3ZSBrbm93IGl0cyBnb2luZworCXRvIGZhaWwgYW55bW9yZS4KKworMjAwNS0wOS0xMSAgTWFyayBNY0xvdWdobGluICA8bWFya0Bza3luZXQuaWU+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmg6IHJlbmFtZQorCShhZGR8cmVtb3ZlfHRvZ2dsZSlfKHdhdGNofHRpbWVvdXQpIHRvIHVubG9ja2VkKCkKKwkKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IGRpdHRvLgorCQorCSogZGJ1cy9kYnVzLXRpbWVvdXQuYywgZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmM6CisJVXBkYXRlIHNvbWUgY2FsbGVycyBmb3IgdGhlIHJlbmFtaW5nLgorCisyMDA1LTA5LTEwICBNYXJrIE1jTG91Z2hsaW4gIDxtYXJrQHNreW5ldC5pZT4KKworCSogZGJ1cy9kYnVzLWF1dGguYzogKHJlY29yZF9tZWNoYW5pc21zKTogZG9uJ3QKKwlyZXRyeSB0aGUgZmlyc3QgYXV0aCBtZWNoYW5pc20gYmVjYXVzZSB3ZSBrbm93CisJd2UncmUganVzdCBnb2luZyB0byBnZXQgcmVqZWN0ZWQgYWdhaW4uCisJCisJKiBkYnVzL2RidXMta2V5cmluZy5jOiAoX2RidXNfa2V5cmluZ19yZWxvYWQpOgorCUZpeCB0aGlua28gLi4uIGFuZCB3aGF0IGEgbmFzdHkgbGl0dGxlIGJ1Z2dlciB0bworCXRyYWNrIGRvd24geW91IHdlcmUgLi4uCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6CisJKF9kYnVzX2Nvbm5lY3Rpb25fYWRkX3dhdGNoKSwKKwkoX2RidXNfY29ubmVjdGlvbl9yZW1vdmVfd2F0Y2gpOiBhZGQgbm90ZSBhYm91dAorCXRoZXNlIG5lZWRpbmcgdGhlIGNvbm5lY3Rpb24gdG8gYmUgbG9ja2VkLgorCShfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQpOgorCXNldCBzdGF0dXMgdG8gREFUQV9SRU1BSU5TIHdoZW4gd2UgcXVldWUgdGhlCisJZGlzY29ubmVjdGVkIG1lc3NhZ2UuCisJCisJKiBidXMvZGlzcGF0Y2guYzoKKwkoYnVzX2Rpc3BhdGNoKTogZml4IHdhcm5pbmcuCisJKGNoZWNrX2V4aXN0ZW50X3NlcnZpY2Vfbm9fYXV0b19zdGFydCk6CisJRXhwZWN0IENoaWxkU2lnbmFsZWQgZXJyb3IgdG9vLgorCShjaGVja19leGlzdGVudF9oZWxsb19mcm9tX3NlbGYpOiBmaXggYW5vdGhlcgorCWNvdXBsZSBvZiB3YXJuaW5ncy4KKwkKKzIwMDUtMDktMDggIEpvZSBTaGF3ICA8am9lc2hhd0Bub3ZlbGwuY29tPgorCisJUGF0Y2hlcyBmcm9tIEphbWVzIFdpbGxjb3ggPHNub3JwQHNub3JwLm5ldD4KKworCSogbW9uby9NYWtlZmlsZS5hbTogQWRkIEludDE2LmNzIGFuZCBVSW50MTYuY3MKKworCSogbW9uby9EQnVzVHlwZS9BcnJheS5jczogSGFuZGxlIG11bHRpZGltZW5zaW9uYWwgYXJyYXlzLCBhbmQKKwlzdXBwb3J0IGFycmF5ICJvdXQiIHBhcmFtZXRlcnMuCisKKwkqIG1vbm8vREJ1c1R5cGUvSW50MTYuY3MsIG1vbm8vREJ1c1R5cGUvVUludDE2LmNzOiBOZXcgZmlsZXMsCisJZm9yIDE2LWJpdCBpbnQgc3VwcG9ydC4KKworMjAwNS0wOS0wNiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogUmVsZWFzZWQgMC41MAorCisJKiBQYXRjaCBmcm9tIFN0ZXZlIEdydWJiOgorCS0gYnVzL2FjdGl2YXRpb24uYyAoYnVzX2FjdGl2YXRpb25fc2VydmljZV9yZWxvYWRfdGVzdCk6IGNsZWFuIHVwCisJc29tZSBpbmRlbnRhdGlvbgorCS0gZGJ1cy9kYnVzLWtleXJpbmcuYyAoX2RidXNfa2V5cmluZ19yZWxvYWQpOiBmaXggY29uZGl0aW9uYWwgCisJLSBkYnVzL2RidXMtbWVzc2FnZS1mYWN0b3J5LmMgKGdlbmVyYXRlX3NwZWNpYWwpOiBmaXggYSBjb3VwbGUgb2YKKwlidWZmZXIgb3ZlcmZsb3dzIGluIHRoZSB0ZXN0IHN1aXRlLiAgVGhpcyBpcyBub24gY3JpdGljYWwgYmVjYXVzZQorCWl0IGNhbiBub3QgYmUgZXhwbG9pdGVkIGFuZCB0aGlzIGNvZGUgaXMgb25seSBydW4gd2hlbiBkb2luZyBhIAorCW1ha2UgY2hlY2suCisKKwkqIFBhdGNoIGZyb20gWWFha292IFNlbGtvd2l0ejogQnVpbGQgZml4ZXMgZm9yIEN5Z3dpbgorCS0gY29uZmlndXJlLmluOiBEb24ndCBjaGVjayBhbmQgbGluayBhZ2FpbnN0IGtkZWNvcmUsIG9ubHkgcXQgaGVhZGVycworCS0gZGJ1cy9NYWtlZmlsZS5hbTogQWRkIC1uby11bmRlZmluZWQgdG8gbGliZGJ1c18xX2xhX0xERkxBR1MKKwktIGdjai9vcmcvZnJlZWRlc2t0b3AvZGJ1cy9NYWtlZmlsZS5hbToKKwlhZGQgbGliZGJ1c19nY2pfMV9sYV9MREZMQUdTID0gLW5vLXVuZGVmaW5lZAorCS0gZ2xpYi9NYWtlZmlsZS5hbTogQWRkIC1uby11bmRlZmluZWQgdG8gbGliZGJ1c19nbGliXzFfbGFfTERGTEFHUworCWFuZCAkKERCVVNfR0xJQl9MSUJTKSB0byBkYnVzX2JpbmRpbmdfdG9vbF9MREFERAorCS0gcXQvTWFrZWZpbGUuYW06IEFkZCAtbm8tdW5kZWZpbmVkIHRvIGxpYmRidXNfcXRfMV9sYV9MREZMQUdTCisJLSB0b29scy9NYWtlZmlsZS5hbTogQWRkIHBsYXRmb3JtIGV4dGVudGlvbnMgdG8gYmluYXJpZXMgCisJKGkuZS4gLmV4ZSBvbiB3aW5kb3dzKQorCisJKiBjb25maWd1cmUuaW46IAorCS0gTWFrZSBpdCBzbyBpZiBubyBzdWl0YWJsZSB2ZXJzaW9uIG9mIHB5dGhvbiBpcyBmb3VuZCB3ZSBvbmx5IAorCWRpc2FibGUgYnVpbGRpbmcgcHl0aG9uIGluc3RlYWQgb2YgZXhpdGluZyB0aGUgY29uZmlndXJlIHNjcmlwdAorCS0gUmVxdWlyZSB2ZXJzaW9uIDIuNCBvZiBnbGliIGZvciBnbGliIGJpbmRpbmdzCisJLSBVcCB2ZXJzaW9uIHRvIDAuNTAKKworCSogcHl0aG9uL19faW5pdF9fLnB5OiBTeW5jIHZlcnNpb24gd2l0aCBsaWJkYnVzIHRvICgwLDUwLDApCisJCisyMDA1LTA5LTA1ICBPbGl2aWVyIEFuZHJpZXUgIDxvbGl2X19hQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZGJ1cy9kYnVzLW9iamVjdC10cmVlLmMgKGZpbmRfc3VidHJlZV9yZWN1cnNlKToKKwlhIGNvdXBsZSBvZiBvcHRpbWl6YXRpb25zIChidWcgIzcxMCk6CisJLSBkbyBhIGJpbmFyeSBzZWFyY2ggaW4gdGhlIHRyZWUKKwktIGluc2VydCBhIG5ldyBjaGlsZCBhdCB0aGUgcmlnaHQgcGxhY2UgZGlyZWN0bHksIG5vIG5lZWQgZm9yCisJICBxc29ydCBhbnltb3JlCisJLSBkbyB0aGUgImRvdWJsZSBhbGxvYyIgdGhpbmcgd2hlbiBhbGxvY2F0aW5nIGNoaWxkcmVuCisKKzIwMDUtMDgtMzEgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9NYWtlZmlsZS5hbTogQnJlYWsgb24gcHlyZXhjIGVycm9ycyBpbnN0ZWFkIG9mIGlnbm9yaW5nIHRoZW0KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4OiBNZW1vcnkgbWFuYWdlbWVudCBmb28KKwkoZ2xvYmFsKTogcmVtb3ZlIGhhY2t5IF91c2VyX2RhdGFfcmVmZXJlbmNlcyBnbG9iYWwgbGlzdAorCShHSUxfc2FmZV9jdW5yZWdpc3Rlcl9mdW5jdGlvbl9oYW5kbGVyKTogdXNlcmRhdGEgbm93IHN0dWZmZWQgaW50bworCXR1cGxlcy4gVW5yZWYgdXNlcl9kYXRhCisJKEdJTF9zYWZlX2NtZXNzYWdlX2Z1bmN0aW9uX2hhbmRsZXIpOiB1c2VyZGF0YSBub3cgc3R1ZmZlZCBpbnRvIHR1cGxlcworCShDb25uZWN0aW9uOjpfX2RlbF9fKTogUmVtb3ZlIGFuZCByZXBsYWNlIHdpdGggX19kZWFsbG9jX18gbWV0aG9kCisJKENvbm5lY3Rpb246OmFkZF9maWx0ZXIpOiBTdHVmZiB1c2VyX2RhdGEgaW50byBhIHR1cGxlLiAgVXNlIFB5X0lOQ1JFRgorCXRvIGtlZXAgdHVwbGUgZnJvbSBiZWluZyBkZWFsbG9jYXRlZCBpbnN0ZWFkIG9mIHRoZSBnbG9iYWwgdmFyIGhhY2sKKwkoQ29ubmVjdGlvbjo6cmVnaXN0ZXJfb2JqZWN0X3BhdGgpOiBTdHVmZiB1c2VyX2RhdGEgaW50byBhIHR1cGxlLgorCVVzZSBQeV9JTkNSRUYgdG8ga2VlcCB0dXBsZSBmcm9tIGJlaW5nIGRlYWxsb2NhdGVkIGluc3RlYWQgb2YgdGhlIAorCWdsb2JhbCB2YXIgaGFjaworCShDb25uZWN0aW9uOjpyZWdpc3Rlcl9mYWxsYmFjayk6IFN0dWZmIHVzZXJfZGF0YSBpbnRvIGEgdHVwbGUuCisJVXNlIFB5X0lOQ1JFRiB0byBrZWVwIHR1cGxlIGZyb20gYmVpbmcgZGVhbGxvY2F0ZWQgaW5zdGVhZCBvZiB0aGUgCisJZ2xvYmFsIHZhciBoYWNrCisJKEdJTF9zYWZlX3BlbmRpbmdfY2FsbF9ub3RpZmljYXRpb24pOiBEb24ndCB1bnJlZiB0aGUgbWVzc2FnZQorCWJlY2F1c2UgaXQgZ2V0cyB1bnJlZmZlZCB3aGVuIGdvaW5nIG91dCBvZiBzY29wZS4gIFB5X1hERUNSRUYKKwl0aGUgdXNlcl9kYXRhCisJKFBlbmRpbmdDYWxsOjpfX2RlbF9fKTogUmVtb3ZlIGFuZCByZXBsYWNlIHdpdGggX19kZWFsbG9jX18gbWV0aG9kCisJKFBlbmRpbmdDYWxsOjpzZXRfbm90aWZ5KTogcmVmIHRoZSBwZW5kaW5nIGNhbGwgYmVjYXVzZSB3ZSB3aWxsCisJbmVlZCBpdCB0byBzdGljayBhcm91bmQgZm9yIHdoZW4gdGhlIG5vdGlmeSBjYWxsYmFjayBnZXRzIGNhbGxlZAorCShNZXNzYWdlOjpfX2RlbF9fKTogUmVtb3ZlIGFuZCByZXBsYWNlIHdpdGggX19kZWFsbG9jX18gbWV0aG9kCisKKwkqIHB5dGhvbi9kYnVzX2dsaWJfYmluZGluZ3MucHl4IChpbml0X2d0aHJlYWRzKTogQ2hhbmdlZCB0byAKKwlndGhyZWFkc19pbml0IHRvIG1hdGNoIHVwIHdpdGggdGhlIGRidXMgY2FsbAorCisJKiBweXRob24vZ2xpYi5weSAoaW5pdF90aHJlYWRzKTogQ2hhbmdlZCB0byB0aHJlYWRzX2luaXQgdG8gbWF0Y2gKKwl1cCB3aXRoIGdvYmplY3QudGhyZWFkc19pbml0KCkuICBpbml0X3RocmVhZHMgaXMga2VwdCBmb3IgYmFja3dhcmRzCisJY29tcGF0IGJ1dCB3aWxsIG1vc3QgbGlrZWx5IGJlIGRlcHJlY2F0ZWQgaW4gdGhlIGZ1dHVyZQorCisJKiB0ZXN0L3B5dGhvbi90ZXN0LWNsaWVudC5weTogCisJLSByZXZhbXAgdG8gdXNlIFB5dGhvbidzIHVuaXR0ZXN0IGZ1bmN0aW9uYWxpdHkKKwktIGFkZCBhc3luYyBjYWxsIHRlc3RzCisJLSBzZXR1cCB0aHJlYWRzIGluIGdsaWIgYW5kIGRidXMgc28gd2UgbWFrZSBzdXJlIGxvY2tzIGFyZSB3b3JraW5nCisJCisyMDA1LTA4LTMwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXggCisJKF9wZW5kaW5nX2NhbGxfbm90aWZpY2F0aW9uLCBjdW5yZWdpc3Rlcl9mdW5jdGlvbl9oYW5kbGVyLCAKKwljbWVzc2FnZV9mdW5jdGlvbl9oYW5kbGVyKTogQWxsIGNhbGxiYWNrIGZ1bmN0aW9ucyBoYXZlIGJlZW4gcmVhcnJhbmdlZCAKKwl0byB3b3JrYXJvdW5kIGEgYnVnIGluIFB5cmV4IHdoZW4gd29ya2luZyB3aXRoIHRoZSBHSUwgd2hpY2ggaXMgUHl0aG9uJ3MgCisJZ2xvYmFsIGxvY2sgd2hlbiBkZWFsaW5nIHdpdGggdGhyZWFkcy4gIFRoZXkgaGF2ZSBiZWVuIHNwbGl0IGludG8KKwlhIHdyYXBwZXIgZnVuY3Rpb24gKHdoaWNoIGFzc3VtZXMgdGhlIG5hbWUgb2YgdGhlIG9sZCBmdW5jdGlvbikgYW5kCisJYSBfR0lMX3NhZmVfPGZ1bmN0aW9uIG5hbWU+IGZ1bmN0aW9uIHdoaWNoIGNvbnRhaW5zIHRoZSBmdW5jdGlvbmFsaXR5CisJb2YgdGhlIG9sZCBmdW5jdGlvbi4gIFRoaXMgZW5zdXJlcyB0aGF0IFB5cmV4IGRvZXMgbm90IHdyaXRlIGNvZGUKKwl0aGUgbG9jayBpcyByZWxlYXNlZC4KKwkKKworMjAwNS0wOC0zMCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4IChfcGVuZGluZ19jYWxsX25vdGlmaWNhdGlvbik6IE9idGFpbiB0aGUKKwlHSUwgZ2xvYmFsIGxvY2sgd2hlbiBjYWxsaW5nIGJhY2sgaW50byBQeXRob24KKworMjAwNS0wOC0yOSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogUmVsZWFzZSAwLjM2LjIKKworCSogQWRkIEhhdm9jJ3MgcGF0Y2ggdGhhdCBuZXZlciBnb3QgYXBwbGllZCB0byBIRUFEIChCdWcgIzI0MzYpOgorCisJKiBidXMvcG9saWN5LmMgKGJ1c19wb2xpY3lfYWxsb3dfdXNlcik6IGNoYW5nZSBkZWZhdWx0ICJ1c2VyIGlzCisJYWxsb3dlZCIgdG8gYmUgInVzZXIgaGFzIHNhbWUgdWlkIGFzIHRoZSBidXMgaXRzZWxmIjsgYW55CisJYWxsb3cvZGVueSBydWxlcyB3aWxsIG92ZXJyaWRlLgorCisJKiBidXMvc2Vzc2lvbi5jb25mLmluOiBkb24ndCBhbGxvdyBhbGwgdXNlcnMsIHNpbmNlIG5vdyBieSBkZWZhdWx0CisJdGhlIHVzZXIgdGhhdCByYW4gdGhlIGJ1cyBjYW4gY29ubmVjdC4KKworMjAwNS0wOC0yNiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogdG9vbHMvZGJ1cy1wcmludC1tZXNzYWdlLmMgKHByaW50X21lc3NhZ2UpOiBGbHVzaCBzdGRvdXQKKwlhZnRlciBwcmludGluZyBhIG1lc3NhZ2UsIHNvIHRoYXQgcmVkaXJlY3RpbmcgdG8gYSBmaWxlLCB0aGVuCisJaGl0dGluZyBDdHJsLUMgd29ya3MuCisKKzIwMDUtMDgtMjUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eDogVHJhY2tlZCBkb3duIGEgbWFqb3IgbWVtbGVhayBhbmQgZml4ZWQgaXQKKwkoRW1wdHlNZXNzYWdlKTogbmV3IGNsYXNzIHRoYXQgc3ViY2xhc3NlcyBNZXNzYWdlLiAgVGhpcyBpcyBhIHdvcmthcm91bmQKKwl0byBhIFB5cmV4IGJ1ZyB0aGF0IGZhaWxzIHRvIGNhbGwgX19kZWxfXyB3aGVuIHRoZSBNZXNzYWdlIG9iamVjdCBnb2VzIG91dAorCW9mIHNjb3BlLiAgRm9yIHNvbWUgcmVhc29uIHN1YmNsYXNzaW5nIE1lc3NhZ2UgZml4ZXMgdGhpcyBidWcKKwkoQnVzOjpzZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKTogdXNlIEVtcHR5TWVzc2FnZSBpbnN0ZWFkIG9mIE1lc3NhZ2UKKwktIHMvTWVzc2FnZShfY3JlYXRlPTApL0VtcHR5TWVzc2FnZSBldmVyeXdoZXJlIGVsc2UKKwkKKwkqIHRlc3QvcHl0aG9uL3Rlc3Qte3NlcnZlcnxjbGllbnR9LnB5OiBhZGQgdGhlIHB5dGhvbi8ubGlicyBkaXJlY3RvcnkKKwl0byB0aGUgbG9va3VwIHBhdGggc28gZGJ1c19iaW5kaW5ncyBhbmQgZGJ1c19nbGliX2JpbmRpbmdzIGRvbid0CisJZ2V0IHBpY2tlZCB1cCBmcm9tIHRoZSBzeXN0ZW0KKworMjAwNS0wOC0yNSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dfcHJveHlfY2FsbCk6IERvYyB1cGRhdGUsIHRoYW5rcworCXRvIFJ5YW4gTG9ydGllIGZvciB0aGUgc3VnZ2VzdGlvbi4KKworMjAwNS0wOC0yNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogdGVzdC9weXRob246IEFkZCBweXRob24gcmVncmVzc2lvbiB0ZXN0CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIHRlc3QvcHl0aG9uL01ha2VmaWxlCisKKwkqIHRlc3QvTWFrZWZpbGUuYW06IEFkZCB0aGUgcHl0aG9uIGRpcmVjdG9yeSB0byBTVUJESVJTCisKKzIwMDUtMDgtMjQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIFJlbGVhc2UgMC4zNi4xCisKKwkqIHB5dGhvbi9fZGJ1cy5weTogCisJKEludGVyZmFjZTo6Y29ubmVjdF90b19zaWduYWwpOiBwcm9waWdhdGUga2V5d29yZHMgZm9yIG1hdGNoIG9uIGFyZ3MKKwkoQnVzOjphZGRfc2lnbmFsX3JlY2VpdmVyKTogRml4IHR5cG8gcy9kYnVzX2ludGVmYWNlL2RidXNfaW50ZXJmYWNlCisKKwkqIHB5dGhvbi9wcm94aWVzLnB5IChQcm94eU9iamVjdDo6Y29ubmVjdF90b19zaWduYWwpOgorCXByb3BpZ2F0ZSBrZXl3b3JkcyBmb3IgbWF0Y2ggb24gYXJncworCisJKiBNYWtlZmlsZS5hbTogcG9pbnQgZXZlcnl0aGluZyB0byBweWV4ZWNkaXIgc2luY2UgcHl0aG9uIGJvcmtzCisJb24gbXVsdGlsaWIKKworMjAwNS0wOC0yMyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogUmVsZWFzZSAwLjM2CisKKzIwMDUtMDgtMjMgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIHRlc3QvZ2xpYi9NYWtlZmlsZS5hbTogRG9uJ3QgbXVsdGlwbHktZGVmaW5lIEVYVFJBX0RJU1QuCisKKzIwMDUtMDgtMjMgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9kYnVzX2dsaWJfYmluZGluZ3MucHl4OiByZW9yZGVyIGltcG9ydHMgYW5kIGMgZGVmaW5pdGlvbnMKKwl0byBmaXggc29tZSB3cmFuaW5ncy4gV2Ugbm93IHVzZSBkYnVzX2JpbmRpbmdzLkRCdXNDb25uZWN0aW9uIGluc3RlYWQKKwlvZiBkZWZpbmluZyBEQnVzQ29ubmVjdGlvbiBvdXJzZWx2ZXMuCisKKzIwMDUtMDgtMTggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9kYnVzLnB0aDogTmV3IHBhdGggZmlsZSB0byBmaXggdXAgcHJvYmxlbXMgd2hlbiBpbnN0YWxsaW5nCisJYyBsaWJyYXJpZXMgdG8gbGliNjQgYW5kIHB5dGhvbiBmaWxlcyB0byBsaWIuCisKKwkqIHB5dGhvbi9NYWtlZmlsZS5hbTogaW5zdGFsbCBkYnVzLnB0aCBpbiB0aGUgY29ycmVjdCBzcG90CisKKzIwMDUtMDgtMTcgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisJKiBDaGFuZ2VMb2c6IGNsZWFuIHVwIG15IGxhc3QgZW50cnkgYSBiaXQKKworCSogZG9jL2ludHJvc3BlY3QueHNsOiBOZXcgc3R5bGVzaGVldCBmb3IgY29udmVydGluZyBpbnRyb3NwZWN0aW9uIGRhdGEKKwlpbnRvIGJyb3dzZXIgcmVuZGVyYWJsZSB4aHRtbC4gQ29udHJpYnV0ZWQgYnkgTGVubmFydCBQb2V0dGVyaW5nLgorCisJKiBkb2MvaW50cm9zcGVjdC5kdGQ6IEZpeHVwcyBpbiB0aGUgaW50cm9zcGVjdCBmb3JtYXQgZnJvbSBMZW5uYXJ0CisJUG9ldHRlcmluZy4KKworCSogZG9jL2RidXMtdHV0b3JpYWwueG1sOiAKKwktIEFkZCBDb2xpbiBXYWx0ZXIgdG8gdGhlIEF1dGhvcnMgc2VjdGlvbiBmb3IgYXV0aG9yaW5nIHRoZSBHTGliCisJc2VjdGlvbgorCS0gQWRkIGRlc2NyaXB0aW9ucyBvZiB0aGUgbmV3IHNpZ25hdHVyZSBhbmQgdHlwZSBmdW5jdGlvbmFsaXR5CisJaW4gdGhlIFB5dGhvbiBjb21wbGV4IHR5cGUgbWFwcGluZyBzZWN0aW9uCisJLSBBZGQgYSBzaWRlbm90ZSBvbiB0aGUgbmV3IGFyZ3MgbWF0Y2hpbmcgZnVuY3Rpb25hbGl0eSBpbiAKKwl0aGUgUHl0aG9uIGJpbmRpbmdzCisJLSBGaXhlZCB1cCBzb21lIG9mIHRoZSBleGFtcGxlcyB0byB1c2UgdGhlIGdvYmplY3QuTWFpbkxvb3AKKwlpbnN0ZWFkIG9mIGd0ay5tYWluCisJCisJKiBweXRob24vX2RidXMucHk6CisJKEJ1czo6X2NyZWF0ZV9hcmdzX2RpY3QpOiBOZXcuIENvbnZlcnRzIGEgaGFzaCBvZiBhcmcgbWF0Y2hlcworCXRvIGEgbW9yZSB1c2VhYmxlIGZvcm1hdAorCShCdXM6OmFkZF9zaWduYWxfcmVjZWl2ZXIpOiBhZGQgYSAqKmtleXdvcmRzIHBhcmFtZXRlciBmb3IgY2F0Y2hpbmcKKwlhcmcgbWF0Y2ggcGFyYW1ldGVycworCShCdXM6OnJlbW92ZV9zaWduYWxfcmVjZWl2ZXIpOiBhZGQgYSAqKmtleXdvcmRzIHBhcmFtZXRlciBmb3IgY2F0Y2hpbmcKKwlhcmcgbWF0Y2ggcGFyYW1ldGVycworCQorCSogcHl0aG9uL21hdGNocnVsZXMucHk6CisJKE1hdGNoVHJlZTo6ZXhlY19tYXRjaGVzKTogQ2hlY2sgZm9yIGFyZyBtYXRjaGVzCisJKFNpZ25hbE1hdGNoUnVsZTo6YWRkX2FyZ3NfbWF0Y2gpOiBOZXcgbWV0aG9kCisJKFNpZ25hbE1hdGNoUnVsZTo6ZXhlY3V0ZSk6IEFkZGVkIGFyZ3NfbGlzdCBwYXJhbWV0ZXIgYXMgYW4gb3B0aW1pemF0aW9uCisJc28gd2UgZG9uJ3QgaGF2ZSB0byBtYXJzaGFsIHRoZSBhcmdzIG1vcmUgdGhhbiBvbmNlCisJKFNpZ25hbE1hdGNoUnVsZTo6bWF0Y2hfYXJnc19mcm9tX2xpc3QpOiBOZXcgbWV0aG9kIHRoYXQgY2hlY2tzIHRvIHNlZQorCWlmIHRoZSBydWxlJ3MgYXJnIG1hdGNoZXMgbWF0Y2ggYW4gYXJndW1lbnQgbGlzdC4gIE9ubHkgYXJndW1lbnRzCisJc2V0IGluIHRoZSBydWxlIGFyZSBjaGVja2VkLgorCShTaWduYWxNYXRjaFJ1bGU6Om1hdGNoX2FyZ3NfZnJvbV9ydWxlKTogTmV3IG1ldGhvZCB0aGF0IGNoZWNrcyB0byBzZWUKKwlpZiB0aGUgcnVsZSdzIGFyZyBtYXRjaGVzIG1hdGNoIGFub3RoZXIgcnVsZSdzLiAgQWxsIGFyZ3MgaGF2ZSB0byBtYXRjaAorCWluIG9yZGVyIGZvciB0aGlzIG1ldGhvZCB0byByZXR1cm4gdHJ1ZS4gIElmIGVpdGhlciBydWxlIGhhcyBtb3JlIGFyZ3MKKwl0aGVuIGl0IGlzIG5vdCBhIG1hdGNoLgorCShTaWduYWxNYXRjaFJ1bGU6OmlzX21hdGNoKTogQWRkIGFyZ3MgbWF0Y2gKKwkoU2lnbmFsTWF0Y2hSdWxlOjpyZXByKTogQWRkIGFyZ3MgdG8gdGhlIGZpbmFsIG91dHB1dCBpZiB0aGV5IGV4aXN0CisKKzIwMDUtMDgtMTcgIFJvc3MgQnVydG9uICA8cm9zc0BidXJ0b25pbmkuY29tPgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmM6CisJKGRidXNfZ19wcm94eV9jYWxsX25vX3JlcGx5KTogdW5yZWYgdGhlIG1lc3NhZ2Ugb25jZSBzZW50LgorCShkYnVzX2dfcHJveHlfY2FsbCk6IHByb3RlY3QgYWdhaW5zdCBOVUxMIHByb3h5LgorCisyMDA1LTA4LTE2ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vX19pbml0X18ucHk6IFZlcnNpb24gdXBkYXRlZCAoMCwgNDMsIDApCisJCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXg6IAorCS0gRml4ZWQgdHlwZSBvYmplY3RzIHRvIGhhdmUgc2VsZiBwYXNzZWQgaW50byBfX2luaXRfXworCS0gQWRkZWQgdGhlIFZhcmlhbnQgdHlwZQorCS0gQWRkIHRoZSBhYmlsaXR5IHRvIHNwZWNpZnkgdHlwZXMgb3Igc2lnbmF0dXJlcyBmb3IgQXJyYXksIFZhcmlhbnQgCisJYW5kIERpY3Rpb25hcnkKKwkoQ29ubmVjdGlvbjo6c2VuZF93aXRoX3JlcGx5X2hhbmRsZXJzKTogcmV0dXJuIGEgUGVuZGluZ0NhbGwgb2JqZWN0CisJKF9wZW5kaW5nX2NhbGxfbm90aWZpY2F0aW9uKTogaGFuZGxlIHRoZSBjYXNlIHdoZW4gYW4gZXJyb3IgaXMgcmV0dXJuZWQgCisJd2l0aG91dCBhbiBlcnJvciBtZXNzYWdlIGluIHRoZSBib2R5CisJKE1lc3NhZ2VJdGVyOjpnZXRfYm9vbGVhbik6IHJldHVybiBUcnVlIG9yIEZhbHNlIGluc3RlYWQgb2YgYW4gaW50ZWdlcgorCShNZXNzYWdlSXRlcjo6cHl0aG9uX3ZhbHVlX3RvX2RidXNfc2lnKTogYWRkIGRpcmVjdCBjaGVja2luZyBvZiB0eXBlcyAKKwlhbmQgYWRkIGNoZWNrcyBmb3Igb2JqZWN0cyB3aXRoIGVtYmVkZWQgc2lnbmF0dXJlcyBvciB0eXBlcyAoQXJyYXksIAorCVZhcmlhbnQgYW5kIERpY3Rpb25hcnkpCisJKE1lc3NhZ2VJdGVyOjphcHBlbmRfYnl0ZSk6IGhhbmRsZSBjYXNlIHdoZW4gdGhlIHZhbHVlIGlzIGEgZGJ1cy5CeXRlCisJKE1lc3NhZ2VJdGVyOjphcHBlbmRfZGljdCk6IGhhbmRsZSBlbWJlZGVkIHR5cGVzIG9yIHNpZ25hdHVyZXMKKwkoTWVzc2FnZUl0ZXI6OmFwcGVuZF9hcnJheSk6IGhhbmRsZSBlbWJlZGVkIHR5cGVzIG9yIHNpZ25hdHVyZXMKKwkoTWVzc2FnZUl0ZXI6OmFwcGVuZF92YXJpYW50KTogbmV3IG1ldGhvZAorCQorCSogcHl0aG9uL3Byb3hpZXMucHk6CisJKERlZmVyZWRNZXRob2QpOiBOZXcuIER1bW15IGV4ZWN1dGFibGUgb2JqZWN0IHVzZWQgd2hlbiBxdWV1aW5nIGNhbGxzIAorCWJsb2NraW5nIG9uIGludHJvc3BlY3Rpb24gZGF0YQorCShQcm94eU1ldGhvZDo6X19jYWxsX18pOiBhZGQgdGhlIHRpbWVvdXQga2V5d29yZCBmb3Igc3BlY2lmeWluZyBsb25nZXIgCisJb3Igc2hvcnRlciB0aW1lb3V0cyBmb3IgbWV0aG9kIGNhbGxzCisJKFByb3h5T2JqZWN0KTogQWRkIGZpcnN0IHBhc3MgYXQgYW4gaW50cm9zcGVjdGlvbiBzdGF0ZSBtYWNoaW5lCisJKFByb3h5T2JqZWN0OjpfX2luaXRfXyk6IEFkZCBpbnRyb3NwZWN0IGtleXdvcmQgZm9yIHR1cmluZyBvZmYgYW4gb24gCisJaW50cm9zcGVjdGlvbi4gCisJKFByb3h5T2JqZWN0OjpfSW50cm9zcGVjdCk6IEludGVybmFsIEludHJvc3BlY3QgY2FsbCB0aGF0IGJ5cGFzc2VzIAorCXRoZSB1c3VhbCBtZWNoYW5pc21zIGZvciBzZW5kaW5nIG1lc3NhZ2VzLiAgVGhpcyBpcyB0byBhdm9pZCBhIGRlYWRsb2NrCisJd2hlcmUgdGhlIEludG9zcGVjdCBjYWxsIHdvdWxkIGJlIHF1ZXVlZCB3YWl0aW5nIGZvciB0aGUgSW50cm9zcGVjdCAKKwljYWxsIHRvIGZpbmlzaCA7LSkKKwkoUHJveHlPYmplY3Q6Ol9pbnRyb3NwZWN0X3JlcGx5X2hhbmRsZXIpOiBOZXcuICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgCisJd2hlbiBpbnRyb3NwZWN0aW9uIHJldHVybnMgd2l0aCBubyBlcnJvcgorCShQcm94eU9iamVjdDo6X2ludHJvc3BlY3RfZXJyb3JfaGFuZGxlcik6IE5ldy4gIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCAKKwl3aGVuIGludHJvc3BlY3Rpb24gZW5jb3VudGVycyBhbiBlcnJvcgorCShQcm94eU9iamVjdDo6X19nZXRhdHRyX18pOiBDb2RlIHRvIGhhbmRsZSBkaWZmZXJlbnQgaW50cm9zcGVjdGlvbiAKKwlzdGF0ZXMuICBRdWV1ZSBhc3luYyBjYWxscyBvciBibG9jayBibG9ja2luZyBjYWxscyBpZiB3ZSBhcmUgCisJaW50cm9zcGVjdGluZy4gIFBhc3MgdGhyb3VnaCBhcyBub3JtYWwgaWYgd2UgYXJlIG5vdCBvciBhcmUgZG9uZSB3aXRoIAorCWludHJvc3BlY3RpbmcuCisJCisJKiBweXRob24vc2VydmljZS5weTogSW1wb3J0IHNpZ25hbCBhbmQgbWV0aG9kIGZyb20gZGVjb3JhdG9ycy5weQorCisJKiBweXRob24vdHlwZXMucHk6IEFkZCBWYXJpYW50IHR5cGUKKworMjAwNS0wOC0xNiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoZGJ1c19zZXRfZ19lcnJvcik6IERvbid0IGxvc2UgaWYgdGhlCisJREJ1c0Vycm9yIG1lc3NhZ2UgaXMgTlVMTC4KKworMjAwNS0wOC0wOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuYzogYXBwbHkgcGF0Y2ggZnJvbSBUaW1vIFRlcmFzIHRvIG1ha2UgYQorCW1hbGxvYydkIGNvcHkgb2YgdGhlIG5hbWUgcGFyYW1ldGVyCisKKzIwMDUtMDgtMDkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2Vfc2V0X3JlcGx5X3NlcmlhbCk6IHByaW50CisJd2FybmluZyBpZiB0aGUgcmVwbHkgc2VyaWFsIGlzIHNldCB0byAwCisKKzIwMDUtMDgtMDQgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUtdXRpbHMuaCAoX2RidXNfZ190eXBlX3NwZWNpYWxpemVkX2J1aWx0aW5zX2luaXQpCisJKGRidXNfZ190eXBlX2lzX2ZpeGVkLCBkYnVzX2dfdHlwZV9maXhlZF9nZXRfc2l6ZSkKKwkoZGJ1c19ndmFsdWVfc2V0X2Zyb21fcG9pbnRlciwgZGJ1c19nX2hhc2hfdGFibGVfdmFsdWVfZm9yZWFjaCkKKwkoZGJ1c19nX2hhc2hfdGFibGVfaW5zZXJ0X3ZhbHVlcywgZGJ1c19nX2hhc2hfdGFibGVfaW5zZXJ0X3N0ZWFsX3ZhbHVlcykKKwkoZGJ1c19ndHlwZV9pc192YWxpZF9oYXNoX2tleSwgZGJ1c19ndHlwZV9pc192YWxpZF9oYXNoX3ZhbHVlKQorCShkYnVzX2dfaGFzaF9mdW5jX2Zyb21fZ3R5cGUsIGRidXNfZ19oYXNoX2ZyZWVfZnJvbV9ndHlwZSkKKwkoZGJ1c19nX2hhc2hfZXF1YWxfZnJvbV9ndHlwZSwgZGJ1c19ndmFsdWVfc3RvciwgZGJ1c19ndmFsdWVfdGFrZSk6CisJKiBnbGliL2RidXMtZ3ZhbHVlLmggKGRidXNfZ192YWx1ZV90eXBlc19pbml0KQorCShkYnVzX2d2YWx1ZV9kZW1hcnNoYWwsIGRidXNfZ3ZhbHVlX2RlbWFyc2hhbF92YXJpYW50KQorCShkYnVzX2d2YWx1ZV9kZW1hcnNoYWxfbWVzc2FnZSwgZGJ1c19ndmFsdWVfbWFyc2hhbCk6CisJCisJUHJlZml4IG5hbWUgd2l0aCBfIHRvIGVuc3VyZSB0aGV5J3JlIG5vdCBleHBvcnRlZC4gIEFsbCBjYWxsZXJzCisJdXBkYXRlZC4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS5jICh0eXBlY29kZV90b19ndHlwZSkKKwkoZGJ1c190eXBlY29kZV9tYXBzX3RvX2Jhc2ljLCBiYXNpY190eXBlY29kZV90b19ndHlwZSkKKwkoc2lnbmF0dXJlX2l0ZXJfdG9fZ190eXBlX2RpY3QpCisJKHNpZ25hdHVyZV9pdGVyX3RvX2dfdHlwZV9hcnJheSkKKwkoZGJ1c19ndHlwZV9mcm9tX3NpZ25hdHVyZV9pdGVyLCBkYnVzX2d0eXBlX2Zyb21fc2lnbmF0dXJlKQorCShkYnVzX2d0eXBlc19mcm9tX2FyZ19zaWduYXR1cmUpOgorCU1vdmUgdG8gZGJ1cy1nc2lnbmF0dXJlLmMuCisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5jIChkYnVzX2JpbmRpbmdfdG9vbF9vdXRwdXRfZ2xpYl9zZXJ2ZXIpOiBDYWxsCisJZGJ1c19nX3R5cGVfc3BlY2lhbGl6ZWRfYnVpbHRpbnNfaW5pdCBpbnN0ZWFkIG9mIGRidXNfZ192YWx1ZV90eXBlc19pbml0LgorCShkYnVzX2JpbmRpbmdfdG9vbF9vdXRwdXRfZ2xpYl9jbGllbnQpOiBEaXR0by4KKworCSogZ2xpYi9NYWtlZmlsZS5hbSAoREJVU19HTElCX0lOVEVSTkFMUyk6IEFkZCBkYnVzLWdzaWduYXR1cmUuYworCWFuZCBkYnVzLWdzaWduYXR1cmUuaAorCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYyAobXlfb2JqZWN0X3JlY19hcnJheXMpOiBEZWxldGUKKwl1bnVzZWQgdmFyaWFibGUuCisKKzIwMDUtMDgtMDMgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmM6IEFkZCB0ZXN0cyBvbiBoYXJkY29kZWQgb2JqZWN0IGluZm87IHRoaXMgc2hvdWxkCisJY2F0Y2ggYW55IGluY29tcGF0aWJsZSBjaGFuZ2VzIGFjY2lkZW50YWxseSBtYWRlLgorCisyMDA1LTA4LTAzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfcmVhZF9jcmVkZW50aWFsc191bml4X3NvY2tldCk6IGZpeAorCXR5cG8sIGZyb20gSnVsaWVuIFB1eWR0CisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGJ1c19jb25uZWN0aW9uX2Rpc2Nvbm5lY3RlZCk6IHdlIHdlcmUgYWx3YXlzCisJZG9pbmcgYSB3YWl0X2Zvcl9tZW1vcnkgZHVlIHRvIGEgYnVnZ3kgbG9vcCwgZm91bmQgYnkgVGltbyBIb2VuaWcKKworMjAwNS0wOC0wMSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCVBhdGNoIGZyb20gSm9lIE1hcmt1cyBDbGFya2U6CQorCQorCSogZ2xpYi9kYnVzLWdpZGwuYyAocHJvcGVydHlfaW5mb191bnJlZiwgYXJnX2luZm9fdW5yZWYpOiBGaXgKKwl1c2UtYWZ0ZXItZnJlZS4KKworMjAwNS0wOC0wMSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKwkKKwlQYXRjaCBmcm9tIEpvZSBNYXJrdXMgQ2xhcmtlOgkKKwkKKwkqIHRvb2xzL2RidXMtc2VuZC5jIChtYWluKTogCisJCisJRG9uJ3QgdXNlIEM5OSBzdHlsZSBpbml0aWFsaXplcnMgKGJ1ZyAjMzkzMykuCisJCisyMDA1LTA4LTAxICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJUGF0Y2ggZnJvbSBKb2UgTWFya3VzIENsYXJrZToJCisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuYyAoZGJ1c19nX3ZhbHVlX3R5cGVzX2luaXQpOiAKKwkqIGdsaWIvZGJ1cy1ndmFsdWUtdXRpbHMuYyAoZGJ1c19nX3R5cGVfc3BlY2lhbGl6ZWRfYnVpbHRpbnNfaW5pdCkgCisJKiBnbGliL2RidXMtZ29iamVjdC5jICh3cml0ZV9pbnRlcmZhY2UpOgorCisJRG9uJ3QgdXNlIEM5OSBzdHlsZSBpbml0aWFsaXplcnMgKGJ1ZyAjMzkzMykuCisKKzIwMDUtMDctMzEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLXZpZXdlci5jIChsb2FkX2NoaWxkX25vZGVzKTogZml4IGludm9jYXRpb24gb2YKKwlkYnVzX2dfcHJveHlfY2FsbCwgZml4IGZyb20gUGlvdHIgWmllbGluc2tpIGJ1ZyAjMzkyMAorCisyMDA1LTA3LTMwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZml4IGEgYnVuY2ggb2YgRG94eWdlbiB3YXJuaW5ncyBhbmQgbWlzdGFrZXMKKworMjAwNS0wNy0zMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3N0cmluZ19wYXJzZV91aW50KTogcmVtb3ZlICNpZmRlZgorCURCVVNfQlVJTERfVEVTVFMgc2luY2UgaXQncyBub3cgdXNlZCBpbiBwcm9kdWN0aW9uIGNvZGUKKworMjAwNS0wNy0yOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvZ2xpYi90ZXN0LXByb2ZpbGUuYyAod3JpdGVfanVuayk6IGluaXRpYWxpemUgdGhlIGp1bmsKKwlidWZmZXIgc28gdmFsZ3JpbmQgZG9lc24ndCBoYXZlIGEgYnJlYWtkb3duCisKKzIwMDUtMDctMjkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvc2lnbmFscy5jIChidXNfc2lnbmFsc190ZXN0KTogYWRkIG1hdGNoX3J1bGVfZXF1YWwoKSB0ZXN0cworCShtYXRjaF9ydWxlX21hdGNoZXMpOiByZW1vdmUgdW51c2VkIGFyZworCSh0ZXN0X21hdGNoaW5nKTogYWRkIHRlc3RzIGZvciBtYXRjaF9ydWxlX21hdGNoZXMoKQorCisJKiBidXMvc2lnbmFscy5jIChidXNfbWF0Y2hfcnVsZV9wYXJzZV9hcmdfbWF0Y2gpOiBhZGQgYWJpbGl0eSB0bworCWRvIGFyZzA9J2ZvbycgYXJnNT0nYmFyJyBpbiB0aGUgbWF0Y2ggcnVsZXMKKwkobWF0Y2hfcnVsZV9tYXRjaGVzKTogZG9uJ3QgbWF0Y2ggaWYgdGhlIGFyZzA9J2ZvbycgZG9lc24ndCBtYXRjaC4KKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmggKERCVVNfTUFYSU1VTV9NQVRDSF9SVUxFX0FSR19OVU1CRVIpOiBhZGQgdGhpcworCisyMDA1LTA3LTI5ICBSb3NzIEJ1cnRvbiAgPHJvc3NAb3BlbmVkaGFuZC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6CisJRG9uJ3QgY3JlYXRlIGEgREJ1c0NvbmRWYXIgd2hpY2ggaXMgbmV2ZXIgdXNlZC4KKworMjAwNS0wNy0yNyAgUm9zcyBCdXJ0b24gIDxyb3NzQG9wZW5lZGhhbmQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOgorCVJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgbWF4aW11bSBjYWNoZWQgbWVzc2FnZSB0byAxMEsuCisKKzIwMDUtMDctMjUgIFJvc3MgQnVydG9uICA8cm9zc0BvcGVuZWRoYW5kLmNvbT4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jOgorCVJlbW92ZSBtYXRjaGVzIHdoZW4gYWxsIHByb3hpZXMgYXJlIHVucmVnaXN0ZXJlZC4KKworMjAwNS0wNy0yNCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS5jIChzaWduYXR1cmVfaXRlcl90b19nX3R5cGVfYXJyYXkpOiBEb24ndCByZXF1aXJlCisJdHlwZWRhdGE7IHJlY3Vyc2l2ZSBhcnJheXMgd29uJ3QgaGF2ZSBpdC4KKworCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmM6CisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYzoKKwkqIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi54bWw6IEFkZCByZWN1cnNpdmUgYXJyYXlzIHRlc3RzLgorCQorMjAwNS0wNy0yMCAgSm9obiAoSjUpIFBhbG1pZWlyICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL19kYnVzLnB5LCBfdXRpbC5weSwgZGVjb3JhdG9ycy5weSwgZXh0cmFjdC5weSwgbWF0Y2hydWxlcy5weS4KKwlwcm94aWVzLnB5LCBzZXJ2aWNlLnB5OiBDbGVhbnVwIG9mIGNvZGUgYWZ0ZXIgcnVubmluZyBpdCB0aHJvdWdoIHRoZQorCXB5Zmxha2VzIGNvZGUgY2hlY2tlciBtb3N0bHkgZGVhbGluZyB3aXRoIHVuZGVmaW5lZCBuYW1lcy4gIAorCShCdWcgIzM4MjgsIFBhdGNoIGZyb20gQW50aG9ueSBCYXh0ZXIgPGFudGhvbnlAaW50ZXJsaW5rLmNvbS5hdT4pCisKKzIwMDUtMDctMTcgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIE5FV1M6IFVwZGF0ZSB0byAwLjM1LjIKKworMjAwNS0wNy0xNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL19kYnVzLnB5OiBSZW1vdmUgaW1wb3J0IG9mIHRoZSBkYnVzLnNlcnZpY2VzCisJbW9kdWxlIGFzIGl0IG5vIGxvbmdlciBleGlzdHMgKHBhdGNoIGZyb20gRGltaXR1ciBLaXJvdikKKworCSogcHl0aG9uL3NlcnZpY2UucHkgKE9iamVjdDo6X19pbml0X18pOiBGaXhlZCB0eXBvCisJcy9uYW1lL2J1c19uYW1lIChwYXRjaCBmcm9tIERpbWl0dXIgS2lyb3YpCisKKwkqIHB5dGhvbi9leGFtcGxlcy9leGFtcGxlLXNpZ25hbC1lbWl0dGVyLnB5OiBpbXBvcnQgZGJ1cy5nbGliCisJdG8gZ2V0IHRoZSBtYWluIGxvb3AgYW5kIHVzZSBnbGliIG1haW5sb29wIGluc3RlYWQgb2YgZ3RrIHNvCisJWCBkb2Vzbid0IGhhdmUgdG8gYmUgcnVubmluZy4KKworCSogcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUtc2lnbmFsLXJlY2lwaWVudC5weTogaW1wb3J0IGRidXMuZ2xpYgorCXRvIGdldCB0aGUgbWFpbiBsb29wIGFuZCB1c2UgZ2xpYiBtYWlubG9vcCBpbnN0ZWFkIG9mIGd0ayBzbworCVggZG9lc24ndCBoYXZlIHRvIGJlIHJ1bm5pbmcuIEltcG9ydCB0aGUgZGVjb3JhdG9ycyBtb2R1bGUKKwlkaXJlY3RseS4KKworCSogdGVzdC9nbGliL01ha2VmaWxlLmFtOiAgQWRkZWQgRElTVF9FWFRSQSBmaWxlcyB0aGF0IGRpc3RjaGVjaworCWRpZG4ndCBwaWNrIHVwIG9uIGJ1dCBhcmUgbmVlZGVkIHRvIGJ1aWxkCisKKwkqIGNvbmZpZ3VyZS5pbjogdXBwZWQgdmVyc2lvbiB0byAwLjM1LjIKKworCSogYnVzL2RyaXZlci5jLCBidXMvc2VsaW51eC5jLCBidXMvc2VsaW51eC5oLCBkYnVzL2RidXMtcHJvdG9jb2wuaDoKKwlhZGRlZCBDb2xpbiBXYWx0ZXJzJyBTRUxpbnV4IEFQSSByZW5hbWUgcGF0Y2ggZnJvbSBoZWFkIAorCXMvdW5peCBzZXJjdXJpdHkgY29udGV4dC9zZWxpbnV4IHNlY3VyaXR5IGNvbnRleHQvCisKKzIwMDUtMDctMTYgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9NYWtlZmlsZS5hbTogZGJ1c19iaW5kaW5nLnB4ZC5pbiBzaG91bGQgYmUgaW5jbHVkZWQgCisJaW4gRVhUUkFfRElTVCBub3QgZGJ1c19iaW5kaW5nLnB4ZAorCWZpeCB1cCAkKHNyY2RpcikgaG9wZWZ1bGx5IGZvciB0aGUgbGFzdCB0aW1lCisKKwkqIE5FV1M6IFVwZGF0ZSB0byAwLjM1LjEKKworMjAwNS0wNy0xNiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2hhbmRsZV9nZXRfY29ubmVjdGlvbl9zZWxpbnV4X3NlY3VyaXR5X2NvbnRleHQpOiBSZW5hbWVkCisJZnJvbSBidXNfZHJpdmVyX2hhbmRsZV9nZXRfY29ubmVjdGlvbl91bml4X3NlY3VyaXR5X2NvbnRleHQuICBVcGRhdGUgZm9yCisJZXJyb3IgdXNhZ2UuCisJKG1lc3NhZ2VfaGFuZGxlcnMpOiBVcGRhdGUgZm9yIHJlbmFtZXMuCisKKwkqIGJ1cy9zZWxpbnV4LmMgKGJ1c19zZWxpbnV4X2FsbG93c19zZW5kKTogSGFuZGxlIE9PTSBvbgorCV9kYnVzX3N0cmluZ19pbml0IGZhaWx1cmUgY29ycmVjdGx5LgorCShidXNfc2VsaW51eF9hcHBlbmRfY29udGV4dCk6IENvbnZlcnQgU0lEIHRvIGNvbnRleHQuICBBcHBlbmQgaXQKKwlhcyBhIGJ5dGUgYXJyYXkuCisJKGJ1c19zZWxpbnV4X3NodXRkb3duKTogSGFuZGxlIHRoZSBjYXNlIHdoZXJlIGJ1c19zZWxpbnV4X2Z1bGxfaW5pdAorCWhhc24ndCBiZWVuIGNhbGxlZC4KKworCSogYnVzL3NlbGludXguaDogVXBkYXRlIHByb3RvdHlwZS4KKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmggKERCVVNfRVJST1JfU0VMSU5VWF9TRUNVUklUWV9DT05URVhUX1VOS05PV04pOiBSZW5hbWVkCisJZnJvbSBEQlVTX0VSUk9SX1VOSVhfU0VDVVJJVFlfQ09OVEVYVF9VTktOT1dOLgorCisyMDA1LTA3LTE1ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBkb2MvVE9ETzogQWRkIG5vdGUgYWJvdXQgY29udmVuaWVuY2Ugd3JhcHBlcnMuCisKKzIwMDUtMDctMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIE5FV1M6IFVwZGF0ZSB0byAwLjM1CisKKzIwMDUtMDctMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGdsaWIvTWFrZWZpbGUuYW06IEFkZCBtYWtlLWRidXMtZ2xpYi1lcnJvci1zd2l0Y2guc2ggdG8gRVhUUkFfRElTVAorCXNvIGRpc3RjaGVjayBkb2Vzbid0IGZhaWwKKworCSogZ2xpYi9leGFtcGxlcy9NYWtlZmlsZS5hbTogQWRkIGV4YW1wbGUtc2VydmljZS54bWwgYW5kIAorCWV4YW1wbGUtc2lnbmFsLWVtaXR0ZXIueG1sIHRvIEVYVFJBX0RJU1Qgc28gZGlzdGNoZWNrIGRvZXNuJ3QgZmFpbAorCisJKiBnbGliL2V4YW1wbGVzL3N0YXRlbWFjaGluZS9NYWtlZmlsZS5hbTogQWRkIHN0YXRlbWFjaGluZS54bWwgYW5kCisJc3RhdGVtYWNoaW5lLXNlcnZlci54bWwgdG8gRVhUUkFfRElTVCBzbyBkaXN0Y2hlY2sgZG9lc24ndCBmYWlsCisKKwkqIHB5dGhvbi9NYWtlZmlsZS5hbTogUHJlcHJlbmQgJChzcmNkaXIpLyB0byBzb3VyY2UgZmlsZXMgc28gdGhlCisJY29tcGlsZXIgbG9va3MgaW4gdGhlIHJpZ2h0IHBsYWNlcyBkdXJpbmcgZGlzdGNoZWNrCisKKzIwMDUtMDctMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGdsaWIvZXhhbXBsZS9NYWtlZmlsZS5hbTogRml4IGEgdHlwbyB3aGljaCBjYXVzZSBtYWtlIGRpc3RjaGVjaworCXRvIGZhaWwKKworMjAwNS0wNy0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUtc2VydmljZS5weSwKKwlweXRob24vZXhhbXBsZXMvZXhhbXBsZS1zaWduYWwtZW1pdHRlci5weTogRml4ZWQgdXAgZXhhbXBsZXMKKwlmb3IgQVBJIGNoYW5nZXMKKworMjAwNS0wNy0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL19faW5pdF9fLnB5OiBVcHBlZCB0byB2ZXJzaW9uICgwLDQyLDApIGJlY2F1c2Ugb2YKKwl0aGUgQVBJIGNoYW5nZQorCisyMDA1LTA3LTE1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBDaGFuZ2VMb2c6IGZpeCBkYXRlIGluIGxhc3QgZW50cnkKKworCSogY29uZmlndXJlLmluLCBidXMvc3lzdGVtLmNvbmYuaW46IGFkZCB0aGUgYWJpbGl0eSB0byBjb25maWd1cmUgCisJdGhlIHN5c3RlbSBidXMgdXNlciBhdCBjb21waWxldGltZSB3aXRoIHRoZSAtLXdpdGgtZGJ1cy11c2VyIGZsYWcKKwkocGF0Y2ggZnJvbSBLcmlzdG9mIFZhbnNhbnQpCisKKzIwMDUtMDctMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9kaXNwYXRjaC5jLCB0ZXN0L3Rlc3Qtc2VydmljZS5jOiBBZGQgdGVzdGNhc2UKKwlmb3Igc2VuZGluZyBtZXNzYWdlcyB0byBvbmVzZWxmIChUT0RPIGl0ZW0pLgorCisJKiBweXRob24vc2VydmljZS5weSAoY2xhc3MgT2JqZWN0KTogU3dhcCBvcmRlcmluZyBvZiBidXNfbmFtZSAKKwlhbmQgb2JqZWN0X3BhdGggcGFyYW1ldGVycyB0byBiZXR0ZXIgc3VwcG9ydCBpbmhlcml0YW5jZS4KKworCSogZG9jL2RidXMtdHV0b3JpYWwueG1sOiBjaGFuZ2UgUHl0aG9uIGRvY3MgdG8gcmVmbGVjdCBjaGFuZ2UKKwlpbiBwYXJhbWV0ZXIgb3JkZXJpbmcgYW5kIGZpeCB0aGUgaW5oZXJpdGFuY2Ugc2VjdGlvbi4KKworCSogZG9jL1RPRE86IHJlbW92ZSBzZW5kaW5nIG1lc3NhZ2UgdG8gb25lc2VsZiBUT0RPIGl0ZW0KKworMjAwNS0wNy0xNSAgUm9zcyBCdXJ0b24gIDxyb3NzQG9wZW5lZGhhbmQuY29tPgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmM6CisJRml4IGEgbGVhayB3aGVuIGNhbGxpbmcgbWV0aG9kcyB2aWEgdGhlIHByb3h5LgorCisyMDA1LTA3LTE1ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBidXMvc2VsaW51eC5jIChidXNfc2VsaW51eF9hcHBlbmRfY29udGV4dCk6IFdyYXAgaW4KKwlIQVZFX1NFTElOVVguCisKKzIwMDUtMDctMTQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9fZGJ1cy5weSAoQnVzOjpyZW1vdmVfc2lnbmFsX3JlY2VpdmVyKToKKwlkb24ndCBhZGQgYSBjYWxsYmFjayB0byB0aGUgbWF0Y2ggaWYgbm9uZSBoYXMgYmVlbiBwYXNzZWQgaW4KKwkKKwkqIHB5dGhvbi9tYXRjaHJ1bGVzLnB5IChTaWduYWxNYXRjaFRyZWU6OnJlbW92ZSk6IGlmIHRoZSBydWxlCisJYmVpbmcgbWF0Y2hlZCBkb2VzIG5vdCBoYXZlIGEgY2FsbGJhY2sgdHJlYXQgaXQgYXMgYSB3aWxkY2FyZAorCWZpeCBtYXRjaGluZyBsb2dpYworCisJKiBkb2MvZGJ1cy10dXRvcmlhbC54bWw6IEFkZCBQeXRob24gdHV0b3JpYWwKKworMjAwNS0wNy0xNCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogYnVzL2RyaXZlci5jCisJKGJ1c19kcml2ZXJfaGFuZGxlX2dldF9jb25uZWN0aW9uX3VuaXhfc2VjdXJpdHlfY29udGV4dCk6IE5ldyBmdW5jdGlvbi4KKwkobWVzc2FnZV9oYW5kbGVycyk6IEFkZC4KKworCSogYnVzL3NlbGludXguYyAoYnVzX3NlbGludXhfYXBwZW5kX2NvbnRleHQpOiBOZXcgZnVuY3Rpb247IGFwcGVuZHMKKwlzZWN1cml0eSBjb250ZXh0IHRvIG1lc3NhZ2UuCisKKwkqIGJ1cy9zZWxpbnV4Lmg6IFByb3RvdHlwZS4KKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmggKERCVVNfRVJST1JfVU5JWF9TRUNVUklUWV9DT05URVhUX1VOS05PV04pOiBOZXcuCisKKzIwMDUtMDctMTQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9hY3RpdmF0aW9uLmM6IGNsZWFuIHVwIGFsbCB0YWJzIHRvIGJlIDggc3BhY2VzIAorCShidXNfYWN0aXZhdGlvbl9hY3RpdmF0ZV9zZXJ2aWNlKTogbWFrZSBzdXJlIHdlIGNsZWFuIHVwCisJaWYgYWN0aXZhdGlvbiBmYWlscworCisJKiBidXMvZGlzcGF0Y2guYzogY2xlYW4gdXAgYWxsIHRhYnMgdG8gYmUgOCBzcGFjZXMgCisJKGNoZWNrX3NoZWxsX2ZhaWxfc2VydmljZV9hdXRvX3N0YXJ0KTogTmV3IGZ1bmN0aW9uCisJdGVzdHMgdG8gbWFrZSBzdXJlIHdlIGdldCBmYWlsIHByb3Blcmx5IHdoZW4gdHJ5aW5nIHRvIGF1dG8gc3RhcnQgYSBzZXJ2aWNlCisJd2l0aCBhIGZhdWx0eSBjb21tYW5kIGxpbmUKKwkoY2hlY2tfc2hlbGxfc2VydmljZV9zdWNjZXNzX2F1dG9fc3RhcnQpOiBOZXcgZnVuY3Rpb24gdGVzdHMgdG8gbWFrZSBzdXJlCisJYXV0byBzdGFydGVkIHNlcnZpY2VzIGdldCB0aGUgYXJndW1lbnRzIG9uIHRoZSBjb21tYW5kIGxpbmUKKworCSogdGVzdC90ZXN0LXNoZWxsLXNlcnZpY2UuYzogQWRkZWQgc2VydmljZSBmb3IgdGVzdGluZyBhdXRvLXN0YXJ0aW5nIHdpdGggCisJY29tbWFuZCBsaW5lIGFyZ3VtZW50cworCisJKiB0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9kZWJ1Zy1zaGVsbC1lY2hvLWZhaWwuc2VydmljZS5pbiwgCisJdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvZGVidWctc2hlbGwtZWNoby1zdWNjZXNzLnNlcnZpY2UuaW46CisJQWRkZWQgc2VydmljZSBmaWxlcyBmb3IgdGVzdGluZyBhdXRvLXN0YXJ0aW5nIHdpdGggY29tbWFuZCBsaW5lIGFyZ3VtZW50cworCisJKiAqLy5jdnNpZ25vcmU6IGFkZGVkIGEgYnVuY2ggb2YgZ2VuZXJhdGVkIGZpbGVzIHRvIHZhcmlvdXMgLmN2c2lnbm9yZSBmaWxlcworCisyMDA1LTA3LTE0ICBSb2RyaWdvIE1veWEgIDxyb2RyaWdvQG5vdmVsbC5jb20+CisKKwkqIGRidXMvZGJ1cy1zaGVsbC5bY2hdOiBjb3B5L3Bhc3RlZCBjb2RlIGZyb20gR0xpYi4KKwkKKwkqIGRidXMvTWFrZWZpbGUuYW06IGFkZGVkIG5ldyBmaWxlcyB0byBidWlsZC4KKworCSogYnVzL2FjdGl2YXRpb24uYyAoYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSk6IHN1cHBvcnQKKwlhY3RpdmF0aW9uIGNvbW1hbmRzIHdpdGggcGFyYW1ldGVycy4KKworCSogdGVzdC9zaGVsbC10ZXN0LmM6IGFkZGVkIHRlc3QgcHJvZ3JhbSBmb3IgdGhlIHNoZWxsIHBhcnNpbmcKKwljb2RlLgorCisyMDA1LTA3LTEzICBEYXZpZCBaZXV0aGVuICA8ZGF2aWR6QHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL2RidXMtc2VuZC5jIChhcHBlbmRfYXJnLCB0eXBlX2Zyb21fbmFtZSk6IEFsc28gc3VwcG9ydCAxNiBhbmQKKwk2NCBiaXQgc2lnbmVkIGFuZCB1bnNpZ25lZCBwYXJhbWV0ZXJzCisKKzIwMDUtMDctMTMgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi8uY3ZzaWdub3JlOiByZW1vdmUgZGJ1c19iaW5kaW5ncy5weXgsIGFkZCBkYnVzX2JpbmRpbmdzLnB4ZAorCisJKiBweXRob24vc2VydmljZS5weSAoY2xhc3MgTmFtZSk6IHJlbmFtZWQgQnVzTmFtZSB0byBtYWtlIGl0IGNsZWFyZXIKKwl3aGF0IHRoZSBvYmplY3QgaXMgZm9yIChhIG5hbWUgb24gdGhlIGJ1cykKKworCSogcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUtc2VydmljZS5weSwKKwlweXRob24vZXhhbXBsZXMvZXhhbXBsZS1zaWduYWwtZW1pdHRlci5weTogY2hhbmdlIHRoZSBOYW1lIG9iamVjdCB0bworCUJ1c05hbWUKKworMjAwNS0wNy0xMiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCVBhdGNoIGZyb20gSmltIEdldHR5cyA8SmltLkdldHR5c0BocC5jb20+LgorCisJKiB0b29scy9kYnVzLWxhdW5jaC5jOiBJbmNsdWRlIHN5cy9zZWxlY3QuaC4KKworMjAwNS0wNy0xMiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbjogcmVtb3ZlZAorCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXg6IEFkZGVkLgorCS0gRml4ZWQgc29tZSBtZW1sZWFrcyAocGF0Y2ggZnJvbSAKKwlTZWFuIE1laW5lcnMgPHNlYW4ubWVpbmVyc0BsaW5zcGlyZWluYy5jb20+KQorCS0gQnJva2Ugb3V0IHRoZSAjaW5jbHVkZSAiZGJ1c19oX3dyYXBwZXIuaCIgYW5kIHB1dCBpdCBpbiBpdHMKKwlvd24gcHhkIGZpbGUgKFB5cmV4IGRlZmluaXRpb24pCisJLSBCcm9rZSBvdXQgZ2xpYiBkZXBlbmRhbmNpZXMgaW50byBpdHMgb3duIHB5eCBtb2R1bGUKKwkKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnBkeDogQWRkZWQuCisJLSBEZWZpbmVzIEMgY2xhc3MgQ29ubmVjdGlvbiBmb3IgZXhwb3J0aW5nIHRvIG90aGVyIG1vZHVsZXMKKworCSogcHl0aG9uL2RidXNfZ2xpYl9iaW5kaW5ncy5weXg6IEFkZGVkLgorCS0gTmV3IG1vZHVsZSB0byBoYW5kbGUgbG93bGV2ZWwgZGJ1cy1nbGliIG1haW5sb29wIGludGVncmF0aW9uCisKKwkqIHB5dGhvbi9nbGliLnB5OiBBZGRlZC4KKwktIFJlZ2lzdGVycyB0aGUgZ2xpYiBtYWlubG9vcCB3aGVuIHlvdSBpbXBvcnQgdGhpcyBtb2R1bGUKKworCSogcHl0aG9uL3NlcnZpY2VzLnB5OiBSZW1vdmVkIChyZW5hbWVkIHRvIHNlcnZpY2UucHkpCisJCisJKiBweXRob24vc2VydmljZS5weTogQWRkZWQuCisJLSAoY2xhc3MgU2VydmVyKTogcmVuYW1lZCBOYW1lCisKKwkqIHB5dGhvbi9fX2luaXRfXy5weTogQnVtcCBybyB2ZXJzaW9uICgwLDQxLDApCisJLWRvbid0IGltcG9ydCB0aGUgZGVjb3JhdG9ycyBvciBzZXJ2aWNlIG1vZHVsZQorCWJ5IGRlZmF1bHQuICBUaGVzZSBub3cgcmVzaWRlIGluIHRoZSBkYnVzLnNlcnZpY2UgbmFtZXNwYWNlCisKKwkqIHB5dGhvbi9fZGJ1cy5weSAoQnVzOjpfX2luaXRfXyk6IEFkZCBjb2RlIHJ1biB0aGUgbWFpbiBsb29wIAorCXNldHVwIGZ1bmN0aW9uIG9uIGNyZWF0aW9uIAorCisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1zZXJ2aWNlLnB5LAorCXB5dGhvbi9leGFtcGxlcy9leGFtcGxlLXNpZ25hbC1lbWl0dGVyLnB5OiB1cGRhdGUgZXhhbXBsZXMKKworCSogcHl0aG9uL2V4YW1wbGVzL2djb25mLXByb3h5LXNlcnZpY2UucHksCisJcHl0aG9uL2V4YW1wbGVzL2djb25mLXByb3h5LXNlcnZpY2UyLnB5OiBUT0RPIGZpeCB0aGVzZSB1cAorCisJKiBkb2MvVE9ETzogQWRkaXRpb24KKwktIEFkZGVkIGEgUHl0aG9uIEJpbmRpbmdzIDEuMCBzZWN0aW9uCisJLSBhZGRlZCAiQWRkIG1hdGNoIG9uIGFyZ3Mgb3IgbWF0Y2ggb24gZGV0YWlscyB0byBtYXRjaCBydWxlcyIKKworCisyMDA1LTA3LTEyICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBnbGliL2V4YW1wbGVzL3N0YXRlbWFjaGluZS9NYWtlZmlsZS5hbSAoc3RhdGVtYWNoaW5lLXNlcnZlci1nbHVlLmgpIAorCShzdGF0ZW1hY2hpbmUtZ2x1ZS5oKTogCisJKiBnbGliL2V4YW1wbGVzL01ha2VmaWxlLmFtIChleGFtcGxlLXNlcnZpY2UtZ2x1ZS5oKSAKKwkoZXhhbXBsZS1zaWduYWwtZW1pdHRlci1nbHVlLmgpOiAKKwkqIGdsaWIvTWFrZWZpbGUuYW0gKGRidXMtZ2xpYi1lcnJvci1zd2l0Y2guaCk6IAorCUFkZCBsaWJ0b29sIC0tbW9kZT1leGVjdXRlIHNvIHdlIHVzZSB0aGUgYnVpbHQgbGlicmFyeSBpbnN0ZWFkCisJb2YgYW55IGluc3RhbGxlZCBvbmUuCisKKzIwMDUtMDctMTEgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuYyAoc3RydWN0IF9EQnVzR1ZhbHVlKTogRGVsZXRlLgorCShkYnVzX2dfdmFsdWVfdHlwZXNfaW5pdCk6IFJlbW92ZSBhc3NlcnRpb24uCisJKGRidXNfZ192YWx1ZV9nZXRfZ190eXBlLCBkYnVzX2dfdmFsdWVfb3BlbikKKwkoZGJ1c19nX3ZhbHVlX2l0ZXJhdG9yX2dldF92YWx1ZXMsIGRidXNfZ192YWx1ZV9nZXRfc2lnbmF0dXJlKQorCShkYnVzX2dfdmFsdWVfY29weSwgZGJ1c19nX3ZhbHVlX2ZyZWUpOiBEZWxldGUgdW5pbXBsZW1lbnRlZAorCWZ1bmN0aW9ucyByZWxhdGVkIHRvIERCdXNHVmFsdWUuICBOb3cgd2UgbWFyc2hhbC9kZW1hcnNoYWwKKwlzdHJ1Y3R1cmVzIGFzIEdWYWx1ZUFycmF5LgorCShkYnVzX2d0eXBlX2Zyb21fc2lnbmF0dXJlX2l0ZXIpOiBSZXR1cm4gR19UWVBFX1ZBTFVFX0FSUkFZIGZvcgorCXN0cnVjdHVyZXMuCisJKHNpZ25hdHVyZV9pdGVyX3RvX2dfdHlwZV9hcnJheSk6IERvbid0IGNhbGwKKwlzaWduYXR1cmVfaXRlcl90b19nX3R5cGVfc3RydWN0LgorCShzaWduYXR1cmVfaXRlcl90b19nX3R5cGVfc3RydWN0KTogRGVsZXRlLgorCShkYnVzX2d2YWx1ZV90b19zaWduYXR1cmUpOiBEZWxldGUuCisJKGRidXNfZ3ZhbHVlX3RvX3NpZ25hdHVyZSk6IE5ldyBmdW5jdGlvbiB3aXRoIHNhbWUgbmFtZSBhcyBvdGhlcgorCW9uZTsgd2UgY2FuIGNvbnZlcnQgc3RydWN0dXJlcyB0byBzaWduYXR1cmVzLgorCShkZW1hcnNoYWxfdmFsdWVhcnJheSk6IE5ldyBmdW5jdGlvbi4KKwkoZ2V0X3R5cGVfZGVtYXJzaGFsbGVyKTogVXNlIGl0LgorCShkZW1hcnNoYWxfcmVjdXJzZSk6IERlbGV0ZS4KKwkobWFyc2hhbF9wcm94eSk6IE5ldyBmdW5jdGlvbi4KKwkobWFyc2hhbF9tYXApOiBXYXJuIGlmIHdlIGNhbid0IGRldGVybWluZSBzaWduYXR1cmUgZnJvbSB0eXBlLgorCShtYXJzaGFsX2NvbGxlY3Rpb25fcHRyYXJyYXkpOiBEaXR0by4KKwkobWFyc2hhbF9jb2xsZWN0aW9uX2FycmF5KTogRGl0dG8uCisJKGdldF90eXBlX21hcnNoYWxsZXIpOiBVc2UgbWFyc2hhbF92YWx1ZWFycmF5LgorCShtYXJzaGFsX3JlY3Vyc2UpOiBEZWxldGUuCisJKF9kYnVzX2d2YWx1ZV90ZXN0KTogQWRkIHNvbWUgdGVzdHMuCisKKwkqIGRidXMvZGJ1cy1nbGliLmggKHN0cnVjdCBfREJ1c0dWYWx1ZUl0ZXJhdG9yKTogCisJKGRidXNfZ192YWx1ZV9nZXRfZ190eXBlLCBEQlVTX1RZUEVfR19WQUxVRSkKKwkoZGJ1c19nX3ZhbHVlX29wZW4sIGRidXNfZ192YWx1ZV9pdGVyYXRvcl9nZXRfdmFsdWUpCisJKGRidXNfZ192YWx1ZV9pdGVyYXRvcl9nZXRfdmFsdWVzLCBkYnVzX2dfdmFsdWVfaXRlcmF0b3JfcmVjdXJzZSkKKwkoZGJ1c19nX3ZhbHVlX2ZyZWUpOiBSZW1vdmUgcHJvdG90eXBlcy4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmMgKGRidXNfZ190eXBlX2dldF9sb29rdXBfZnVuY3Rpb24pOiBIYW5kbGUKKwlHX1RZUEVfVkFMVUVfQVJSQVkuCisKKwkqIGdsaWIvZXhhbXBsZXMvZXhhbXBsZS1zZXJ2aWNlLmM6CisJKiBnbGliL2V4YW1wbGVzL2V4YW1wbGUtY2xpZW50LmM6IEltcGxlbWVudCBHZXRUdXBsZS4KKworCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmM6CisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYzoKKwkqIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi54bWw6IEFkZCBzdHJ1Y3R1cmUgdGVzdHMuCisKKzIwMDUtMDctMTAgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGRvYy9UT0RPOiBLbm9jayBvZmYgc29tZSBHTGliIGl0ZW1zIHdpdGggdGhpcyBwYXRjaC4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS11dGlscy5jIChfZGJ1c19ndHlwZV9jYW5fc2lnbmFsX2Vycm9yKSAKKwkoX2RidXNfZ3ZhbHVlX3NpZ25hbHNfZXJyb3IpOiBOZXcgZnVuY3Rpb25zLgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLXV0aWxzLmg6IFByb3RvdHlwZSB0aGVtLgorCisJKiBnbGliL2RidXMtZ29iamVjdC5jIChhcmdfaXRlcmF0ZSk6IFVwZGF0ZSB0byBoYW5kbGUgcmV0dXJuIHZhbHMKKwlhbmQgY2hhbmdlIHRvIG5vdCBvdXRwdXQgY29uc3QvcmV0dmFsIGZsYWdzIGZvciBpbnB1dCBhcmdzLiAgQWxsCisJY2FsbGVycyB1cGRhdGVkLgorCShpbnZva2Vfb2JqZWN0X21ldGhvZCk6IFJlZmFjdG9yIHRvIGhhbmRsZSByZXR1cm4gdmFsdWVzLiAgQWRkCisJc29tZSBtb3JlIGNvbW1lbnRzIGluIHZhcmlvdXMgcGxhY2VzLiAgUmVtb3ZlIGRlYnVnIGdfcHJpbnQuCisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5oIChEQlVTX0dMSUJfQU5OT1RBVElPTl9SRVRVUk5WQUwpOiBOZXcuCisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5jIChkYnVzX2dfdHlwZV9nZXRfbWFyc2hhbF9uYW1lKToKKwlIYW5kbGUgR19UWVBFX05PTkUuCisJKGNvbXB1dGVfZ3NpZ25hdHVyZSk6IE5ldyBmdW5jdGlvbjsgcmVmYWN0b3JlZCBmcm9tIGNvZGUgZnJvbQorCWNvbXB1dGVfbWFyc2hhbGxlciBhbmQgY29tcHV0ZV9tYXJzaGFsbGVyX25hbWUuICBFbmhhbmNlIHRvCisJaGFuZGxlIHJldHVybiB2YWx1ZXMgYW5kIGFzeW5jIG9wcyBtb3JlIGNsZWFubHkuICBVcGRhdGUgZm9yCisJYXN5bmMgb3BzIHJldHVybmluZyBOT05FIGluc3RlYWQgb2YgQk9PTEVBTi4KKwkoY29tcHV0ZV9tYXJzaGFsbGVyLCBjb21wdXRlX21hcnNoYWxsZXJfbmFtZSk6IENhbGwgY29tcHV0ZV9nc2lnbmF0dXJlCisJYW5kIG91dHB1dCBhcHByb3ByaWF0ZSBzdHJpbmcuCisJKGdlbmVyYXRlX2dsdWUpOiBIYW5kbGUgcmV0dXJuIHZhbHVlIGFubm90YXRpb24uICBBbHNvIGRvbid0IGR1bXAKKwljb25zdG5lc3MgZmxhZyBmb3IgaW5wdXQgYXJndW1lbnRzLgorCisJKiBnbGliL01ha2VmaWxlLmFtIChEQlVTX0dMSUJfSU5URVJOQUxTKTogTmV3IHZhcmlhYmxlOyBjb250YWlucworCWZpbGVzIHNoYXJlZCBiZXR3ZWVuIGluc3RhbGxlZCBsaWJyYXJ5IGFuZCB1dGlsaXRpZXMuCisJKGxpYmRidXNfZ2xpYl8xX2xhX1NPVVJDRVMpOiBNb3ZlIHNvbWUgc3R1ZiBpbnRvIERCVVNfR0xJQl9JTlRFUk5BTFMuCisJKGxpYmRidXNfZ3Rvb2xfbGFfU09VUkNFUyk6IFN1Y2sgaW4gREJVU19HTElCX0lOVEVSTkFMUyBzbyB0aGUKKwliaW5kaW5nIHRvb2wgY2FuIGFjY2VzcyBndHlwZSB1dGlsaXR5IGZ1bmN0aW9ucy4KKworCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLmM6IAorCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLnhtbDogCisJKiB0ZXN0L2dsaWIvdGVzdC1kYnVzLWdsaWIuYzogQWRkIHNvbWUgdGVzdHMgZm9yIHJldHVybiB2YWx1ZXMuCisKKzIwMDUtMDctMDkgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGdsaWIvZGJ1cy1ncGFyc2VyLmMgKHBhcnNlX2Fubm90YXRpb24pOiBBZGQgYW5ub3RhdGlvbnMgdG8KKwlhcmd1bWVudCBpZiBhdmFpbGFibGUsIG5vdCBtZXRob2QuCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGFyZ19pdGVyYXRlKTogTW9yZSB2ZXJib3NlIHdhcm5pbmdzLgorCShpbnZva2Vfb2JqZWN0X21ldGhvZCk6IEZpcnN0LCByZW1vdmUgc29tZSByZWR1bmRhbnQKKwlHVmFsdWVzIChvYmplY3RfdmFsdWUsIGVycm9yX3ZhbHVlKSBpbiBmYXZvciBvZiB3b3JraW5nIG9uCisJYXJyYXkgZGlyZWN0bHkuICBTZWNvbmQsIHJld29yayBjb25zdG5lc3MgdG8gYmUgbGVzcyBidWdneS4KKwlOb3cgd2UgaXRlcmF0ZSBkaXJlY3RseSBvdmVyIHRoZSBhcmd1bWVudCBtZXRhZGF0YSBpbnN0ZWFkCisJb2YgcGFyYWxsZWwgaXRlcmF0aW5nIG92ZXIgb3V0cHV0IHNpZ25hdHVyZSBhbmQgbWV0YWRhdGEuCisKKwkqIGdsaWIvZGJ1cy1nbGliLXRvb2wuaDogQWRkIElOVkFMSURfQU5OT1RBVElPTiBlcnJvci4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmMgKGdlbmVyYXRlX2dsdWUpOiBCYXJmIG9uIGNvbnN0CisJYW5ub3RhdGlvbiBvbiBpbnB1dCBhcmdzLgorCQorMjAwNS0wNy0wOSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmggKERCVVNfR0xJQl9BTk5PVEFUSU9OX0NPTlNUKToKKwlEZWZpbmUuCisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5jIChnZW5lcmF0ZV9nbHVlKTogSGFuZGxlIENvbnN0CisJYW5ub3RhdGlvbi4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoYXJnX2l0ZXJhdGUpOiBVcGRhdGUgdG8gcGFyc2UgY29uc3R2YWwgdG9vLgorCShtZXRob2RfZGlyX3NpZ25hdHVyZV9mcm9tX29iamVjdF9pbmZvKTogSGFuZGxlIGFyZ19pdGVyYXRlIGNoYW5nZS4KKwkod3JpdGVfaW50ZXJmYWNlKTogRGl0dG8uCisJKGxvb2t1cF9vYmplY3RfaW5mbyk6IERvbid0IGJhcmYgaWYgZm9ybWF0X3ZlcnNpb24gaXMgPiAwLgorCShpbnZva2Vfb2JqZWN0X21ldGhvZCk6IEhhbmRsZSBhcmcgY29uc3RuZXNzLgorCisJKiBnbGliL2RidXMtZ2lkbC5jIChzdHJ1Y3QgQXJnSW5mbyk6IEFkZCBhbm5vdGF0aW9ucy4KKwkoYXJnX2luZm9fbmV3KTogQ3JlYXRlLgorCShhcmdfaW5mb191bnJlZik6IERlc3Ryb3kuCisJKGFyZ19pbmZvX2dldF9hbm5vdGF0aW9ucywgYXJnX2luZm9fZ2V0X2Fubm90YXRpb24pIAorCShhcmdfaW5mb19hZGRfYW5ub3RhdGlvbik6IE5ldyBmdW5jdGlvbnMuCisKKwkqIGdsaWIvZGJ1cy1naWRsLmg6IFByb3RvdHlwZSB0aGVtLgorCisJKiBnbGliL2RidXMtZ3BhcnNlci5jIChwYXJzZV9hbm5vdGF0aW9uKTogQWxsb3cgYW5ub3RhdGlvbnMgaW4KKwlhcmdzLCBkaXNhbGxvdyB0aGVtIGluIHByb3BlcnRpZXMuCisJKHBhcnNlX2Fubm90YXRpb24pOiBIYW5kbGUgYXJnIGFubm90YXRpb25zLgorCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIueG1sOiAKKwkqIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi5jOiBVcGRhdGUgdG8gbWFrZSBzb21lIG1ldGhvZHMKKwljb25zdC4KKworMjAwNS0wNy0wOCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLnhtbDogCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYzoKKwkqIHRlc3QvZ2xpYi90ZXN0LWRidXMtZ2xpYi5jOiBUZXN0IGF7c3Z9LgorCisJKiBnbGliL2V4YW1wbGVzL3N0YXRlbWFjaGluZS9zdGF0ZW1hY2hpbmUuYzoKKwkqIGdsaWIvZXhhbXBsZXMvc3RhdGVtYWNoaW5lL3N0YXRlbWFjaGluZS1zZXJ2ZXIuYzoKKwkqIGdsaWIvZXhhbXBsZXMvc3RhdGVtYWNoaW5lL3N0YXRlbWFjaGluZS1jbGllbnQuYzogRml4IHNvbWUgYnVncywKKwlhZGQgcHJvZ3Jlc3MgYmFyLCBldGMuCisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuYyAocmVnaXN0ZXJfYXJyYXksIHJlZ2lzdGVyX2RpY3QpOiBEZWxldGU7IG5vdAorCW5lZWRlZCBhbnltb3JlIGR1ZSB0byBnZW5lcmljIGFycmF5L21hcCBtYXJzaGFsbGluZy4KKwkoZGJ1c19nX3ZhbHVlX3R5cGVzX2luaXQpOiBEb24ndCByZWdpc3RlciBiYXNpYyBhcnJheXMgb3IgdGhlCisJc3RyaW5nL3N0cmluZyBoYXNoLgorCShkYnVzX2d0eXBlX2Zyb21fc2lnbmF0dXJlX2l0ZXIpOiBEb24ndCB0cnkgdG8gcmVjdXJzZSBpbnRvCisJdmFyaWFudHMuCisJKGRidXNfZ3R5cGVfdG9fc2lnbmF0dXJlKTogQ2hlY2sgY29sbGVjdGlvbi9tYXAgYmVmb3JlIHR5cGUKKwltZXRhZGF0YS4KKwkoZGVtYXJzaGFsX2dhcnJheV9iYXNpYyk6IFJlbmFtZWQgdG8gZGVtYXJzaGFsX2NvbGxlY3Rpb25fYXJyYXkuCisJKGRlbWFyc2hhbF9naGFzaHRhYmxlKTogUmVuYW1lZCB0byBkZW1hcnNoYWxfbWFwOyBmaXggdG8gdXNlIG5ldworCWdlbmVyaWMgbWFwIGNyZWF0aW9uL2FwcGVuZCBmdW5jdGlvbnMgaW5zdGVhZCBvZiBoYXNoIHRhYmxlCisJc3BlY2lmaWNhbGx5LgorCShnZXRfdHlwZV9kZW1hcnNoYWxsZXIpOiBIYW5kbGUgbWFwcy4KKwkoZGVtYXJzaGFsX2NvbGxlY3Rpb24pOiBEaXNwYXRjaCBvbiBjb2xsZWN0aW9uIHR5cGUgdG8gZWl0aGVyCisJZGVtYXJzaGFsX2NvbGxlY3Rpb25fcHRyYXJyYXkgb3IgZGVtYXJzaGFsX2NvbGxlY3Rpb25fYXJyYXkuCisJKGdldF90eXBlX21hcnNoYWxsZXIpOiBIYW5kbGUgbWFwcy4KKwkobWFyc2hhbF9jb2xsZWN0aW9uKTogRGlzcGF0Y2ggY29sbGVjdGlvbiB0eXBlIHRvIGVpdGhlcgorCW1hcnNoYWxfY29sbGVjdGlvbl9wdHJhcnJheSBvciBtYXJzaGFsX2NvbGxlY3Rpb25fYXJyYXkuCisJKF9kYnVzX2d2YWx1ZV90ZXN0KTogTmV3IHRlc3QuCisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUtdXRpbHMuYyAodW5zZXRfYW5kX2ZyZWVfZ192YWx1ZSk6IE5ldyBmdW5jdGlvbi4KKwkoaGFzaF9mcmVlX2Zyb21fZ3R5cGUpOiBVc2UgaXQgdG8gZnJlZSBHVmFsdWVzLgorCShoYXNodGFibGVfYXBwZW5kKTogTmV3IGZ1bmN0aW9uLgorCShwdHJhcnJheV9hcHBlbmQpOiBGaXggcHJvdG90eXBlLgorCShzbGlzdF9hcHBlbmQpOiBEaXR0by4KKwkoX2RidXNfZ3ZhbHVlX3V0aWxzX3Rlc3QpOiBFeHRlbmQgdGVzdHMuCisKKwkqIGdsaWIvZGJ1cy1ndHlwZS1zcGVjaWFsaXplZC5jCisJKGRidXNfZ190eXBlX3NwZWNpYWxpemVkX2luaXRfYXBwZW5kKTogUmVuYW1lZCBmcm9tCisJZGJ1c19nX3R5cGVfc3BlY2lhbGl6ZWRfY29sbGVjdGlvbl9pbml0X2FwcGVuZC4gIFJlbW92ZSBjb25zdCBmcm9tCisJdmFsdWUsIHNpbmNlIHdlIHN0ZWFsIGl0LgorCShkYnVzX2dfdHlwZV9zcGVjaWFsaXplZF9tYXBfYXBwZW5kKTogTmV3IGZ1bmN0aW9uLgorCisJKiBnbGliL2RidXMtZ3R5cGUtc3BlY2lhbGl6ZWQuaDogVXBkYXRlIHByb3RvdHlwZXMuCisJQWRkIERCdXNHVHlwZVNwZWNpYWxpemVkTWFwQXBwZW5kRnVuYy4KKworCSogZ2xpYi9kYnVzLWd0ZXN0LmMgKGRidXNfZ2xpYl9pbnRlcm5hbF9kb19ub3RfdXNlX3J1bl90ZXN0cyk6IFJ1bgorCV9kYnVzX2d2YWx1ZV90ZXN0LgorCQorCSogZ2xpYi9kYnVzLWd0ZXN0Lmg6IFByb3RvdHlwZSBpdC4KKworMjAwNS0wNy0wOCAgUm9zcyBCdXJ0b24gIDxyb3NzQG9wZW5lZGhhbmQuY29tPgorCisJKiBkYnVzL2RidXMtZ2xpYi5oOgorCUFkZCBEQnlzR0FzeW5jRGF0YSBmb3IgdGhlIGFzeW5jIGJpbmRpbmdzLgorCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYzoKKwlSZS1lbmFibGUgdGhlIGFzeW5jIGJpbmRpbmdzLgorCisJKiB0ZXN0L2dsaWIvdGVzdC1kYnVzLWdsaWIuYzoKKwlBZGQgYSB0ZXN0IGZvciB0aGUgZ2VuZXJhdGVkIGFzeW5jIGJpbmRpbmdzLgorCisyMDA1LTA3LTA4ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBkb2MvVE9ETzogVXBkYXRlIEdMaWIgdG9kbyBiaXRzLCBhbHNvIGFkZCBhIHBvc3QtMS4wIFRPRE8gZm9yIGEKKwljb25uZWN0aW9uIGNvbmNlcHQuCisJCisyMDA1LTA3LTA4ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCQorCSogdG9vbHMvTWFrZWZpbGUuYW06IEtpbGwgb2YgcHJpbnQtaW50cm9zcGVjdCBpbiBmYXZvciBvZiB1c2luZworCWRidXMtc2VuZCAtLXByaW50LXJlcGx5PWxpdGVyYWwuCisKKwkqIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi54bWw6IAorCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLmMgKG15X29iamVjdF9nZXRfb2Jqcyk6IE5ldyB0ZXN0CisJZm9yICJhbyIuCisKKwkqIHRlc3QvZ2xpYi90ZXN0LWRidXMtZ2xpYi5jIChlY2hvX3JlY2VpdmVkX2NiKTogRnJlZSBlY2hvIGRhdGEuCisJKG1haW4pOiBUZXN0IEdldE9ianMuCisKKwkqIGdsaWIvZXhhbXBsZXMvc3RhdGVtYWNoaW5lL01ha2VmaWxlLmFtOgorCSogZ2xpYi9leGFtcGxlcy9zdGF0ZW1hY2hpbmUvc20tbWFyc2hhbC5saXN0OgorCSogZ2xpYi9leGFtcGxlcy9zdGF0ZW1hY2hpbmUvc3RhdGVtYWNoaW5lLWNsaWVudC5jOgorCSogZ2xpYi9leGFtcGxlcy9zdGF0ZW1hY2hpbmUvc3RhdGVtYWNoaW5lLXNlcnZlci5jOgorCSogZ2xpYi9leGFtcGxlcy9zdGF0ZW1hY2hpbmUvc3RhdGVtYWNoaW5lLXNlcnZlci54bWw6CisJKiBnbGliL2V4YW1wbGVzL3N0YXRlbWFjaGluZS9zdGF0ZW1hY2hpbmUuYzoKKwkqIGdsaWIvZXhhbXBsZXMvc3RhdGVtYWNoaW5lL3N0YXRlbWFjaGluZS5oOgorCSogZ2xpYi9leGFtcGxlcy9zdGF0ZW1hY2hpbmUvc3RhdGVtYWNoaW5lLnhtbDoKKworCU5ldyBleGFtcGxlLgorCisJKiBnbGliL2V4YW1wbGVzL2V4YW1wbGUtc2VydmljZS5jIChtYWluKTogTW92ZSBpbnZvY2F0aW9uCisJb2YgZGJ1c19nX29iamVjdF90eXBlX2luc3RhbGxfaW5mbyBlYXJsaWVyLCB0byBlbXBoYXNpemUgaXQKKwlzaG91bGQgb25seSBiZSBkb25lIG9uY2UuCisKKwkqIGdsaWIvZXhhbXBsZXMvZXhhbXBsZS1zaWduYWwtZW1pdHRlci5jIChtYWluKTogRGl0dG8uCisKKwkqIGdsaWIvZXhhbXBsZXMvTWFrZWZpbGUuYW0gKFNVQkRJUlMpOiBJbmNsdWRlIHN0YXRlbWFjaGluZS4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS5oIChkYnVzX2d0eXBlX3RvX3NpZ25hdHVyZSkKKwkoZGJ1c19ndmFsdWVfbWFyc2hhbCk6IFVwZGF0ZSBwcm90b3R5cGVzLgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLmM6IFVwZGF0ZSBhbGwgbWFyc2hhbGxpbmcgZnVuY3Rpb25zIHRvIHRha2UKKwljb25zdCBHVmFsdWUgaW5zdGVhZCBvZiBHVmFsdWUuCisJKHNpZ25hdHVyZV9pdGVyX3RvX2dfdHlwZV9hcnJheSk6IFJldHVybiBhIEdQdHJBcnJheSBmb3Igbm9uZml4ZWQKKwl0eXBlcy4KKwkoZGJ1c19ndmFsdWVfdG9fc2lnbmF0dXJlKTogVXBkYXRlIGZvciBkYnVzX2d0eXBlX3RvX3NpZ25hdHVyZQorCWNoYW5nZS4KKwkoZGJ1c19ndHlwZV90b19zaWduYXR1cmUpOiBIYW5kbGUgZ2VuZXJpYyBjb2xsZWNpdG9ucyBhbmQgbWFwcy4KKwlSZXR1cm4gYSBuZXdseS1hbGxvY2F0ZWQgc3RyaW5nLgorCShkZW1hcnNoYWxfcHJveHksIGRlbWFyc2hhbF9vYmplY3RfcGF0aCwgZGVtYXJzaGFsX29iamVjdCkKKwkoZGVtYXJzaGFsX3N0cnYsIGRlbWFyc2hhbF9naGFzaHRhYmxlKTogU2V0IGVycm9yLCBkb24ndCBhc3NlcnQgaWYKKwl3ZSBnZXQgdGhlIHdyb25nIHR5cGVzIGZyb20gbWVzc2FnZS4KKwkoZ2V0X3R5cGVfZGVtYXJzaGFsbGVyKTogTmV3IGZ1bmN0aW9uLCBleHRyYWN0ZWQgZnJvbQorCWRidXNfZ3ZhbHVlX2RlbWFyc2hhbC4KKwkoZGVtYXJzaGFsX2NvbGxlY3Rpb24pOiBOZXcgZnVuY3Rpb24sIGRlbWFyc2hhbHMgZ2VuZXJpYworCWNvbGxlY3Rpb24uCisJKGRidXNfZ3ZhbHVlX2RlbWFyc2hhbCk6IEp1c3QgaW52b2tlIHJlc3VsdCBvZgorCWdldF90eXBlX2RlbWFyc2hhbGxlci4gIFRocm93IGVycm9yIGlmIHdlIGRvbid0IGhhdmUgb25lLgorCShtYXJzaGFsX2dhcnJheV9iYXNpYyk6IEFib3J0IG9uIE9PTS4KKwkoZ2V0X3R5cGVfbWFyc2hhbGxlcik6IE5ldyBmdW5jdGlvbiwgZXh0cmFjdGVkIGZyb20KKwlkYnVzX2d2YWx1ZV9tYXJzaGFsLgorCShjb2xsZWN0aW9uX21hcnNoYWxfaXRlcmF0b3IsIG1hcnNoYWxfY29sbGVjdGlvbik6IE5ldyBmdW5jdGlvbnM7CisJaW1wbGVtZW50cyBnZW5lcmljIG1hcnNoYWxsaW5nIGZvciBhbiBpdGVyYXRhYmxlIHNwZWNpYWxpemVkCisJY29sbGVjdGlvbi4KKwkoZGJ1c19ndmFsdWVfbWFyc2hhbCk6IEp1c3QgaW52b2tlIHJlc3VsdCBvZiBnZXRfdHlwZV9tYXJzaGFsbGVyLgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLXV0aWxzLmMgKGd2YWx1ZV9mcm9tX3B0cmFycmF5X3ZhbHVlKTogSGFuZGxlCisJR19UWVBFX1NUUklORy4KKwkocHRyYXJyYXlfdmFsdWVfZnJvbV9ndmFsdWUpOiBEaXR0by4KKwkocHRyYXJyYXlfYXBwZW5kLCBwdHJhcnJheV9mcmVlKTogTmV3IGZ1bmN0aW9ucy4KKwkoc2xpc3RfY29uc3RydWN0b3IsIHNsaXN0X2l0ZXJhdG9yLCBzbGlzdF9jb3B5X2VsdCwgc2xpc3RfY29weSkgCisJKHNsaXN0X2FwcGVuZCwgc2xpc3RfZW5kX2FwcGVuZCwgc2xpc3RfZnJlZSk6IE5ldyBmdW5jdGlvbnMuCisJKGRidXNfZ190eXBlX3NwZWNpYWxpemVkX2J1aWx0aW5zX2luaXQpOiBBZGQgYXBwZW5kIGZ1Y3Rpb25zCisJZm9yIEdQdHJBcnJheSBhbmQgR1NMaXN0LiAgUmVnaXN0ZXIgR1NMaXN0LgorCSh0ZXN0X3NwZWNpYWxpemVkX2hhc2gsIF9kYnVzX2d2YWx1ZV91dGlsc190ZXN0KTogTmV3IGZ1bmN0aW9ucy4KKworCSogZ2xpYi9kYnVzLWd0eXBlLXNwZWNpYWxpemVkLmggKERCdXNHVHlwZVNwZWNpYWxpemVkQXBwZW5kQ29udGV4dCk6CisJTmV3LgorCShkYnVzX2dfdHlwZV9zcGVjaWFsaXplZF9jb2xsZWN0aW9uX2luaXRfYXBwZW5kKQorCShkYnVzX2dfdHlwZV9zcGVjaWFsaXplZF9jb2xsZWN0aW9uX2FwcGVuZCkKKwkoZGJ1c19nX3R5cGVfc3BlY2lhbGl6ZWRfY29sbGVjdGlvbl9lbmRfYXBwZW5kKTogUHJvdG90eXBlLgorCShEQnVzR1R5cGVTcGVjaWFsaXplZENvbGxlY3Rpb25WdGFibGUpOiBBZGQgYXBwZW5kX2Z1bmMgYW5kCisJZW5kX2FwcGVuZF9mdW5jLgorCisJKiBnbGliL2RidXMtZ3R5cGUtc3BlY2lhbGl6ZWQuYyAoZGJ1c19nX3R5cGVfc3BlY2lhbGl6ZWRfY29sbGVjdGlvbl9pbml0X2FwcGVuZCkgCisJKGRidXNfZ190eXBlX3NwZWNpYWxpemVkX2NvbGxlY3Rpb25fYXBwZW5kKSAKKwkoZGJ1c19nX3R5cGVfc3BlY2lhbGl6ZWRfY29sbGVjdGlvbl9lbmRfYXBwZW5kKTogTmV3IGZ1bmN0aW9ucy4KKwkoZGJ1c19nX3R5cGVfbWFwX3ZhbHVlX2l0ZXJhdGUpOiBUYWtlIGNvbnN0IEdWYWx1ZS4KKwkoZGJ1c19nX3R5cGVfY29sbGVjdGlvbl92YWx1ZV9pdGVyYXRlKTogRGl0dG8uCisKKwkqIGdsaWIvZGJ1cy1ndGVzdC5jIChkYnVzX2dsaWJfaW50ZXJuYWxfZG9fbm90X3VzZV9ydW5fdGVzdHMpOiBSdW4KKwlfZGJ1c19ndmFsdWVfdXRpbHNfdGVzdC4KKwkKKwkqIGdsaWIvZGJ1cy1ndGVzdC5oOiBQcm90b3R5cGUgaXQuCisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19nX3Byb3h5X21hbmFnZXJfZmlsdGVyKTogQXZvaWQKKwl1c2luZyB1bmluaXRpYWxpemVkIG93bmVyX2xpc3QuCisJKGRidXNfZ19wcm94eV9iZWdpbl9jYWxsX2ludGVybmFsKTogTW92ZSByZXR1cm5faWZfZmFpbCB0bworCXB1YmxpYyBBUEkuCisJKGRidXNfZ19wcm94eV9lbmRfY2FsbF9pbnRlcm5hbCk6IFVwZGF0ZSB0byB1c2UgZXJyb3Igc2V0CisJZnJvbSBkYnVzX2d2YWx1ZV9kZW1hcnNoYWwgaW5zdGVhZCBvZiBzZXR0aW5nIGl0IGhlcmUuCisJKGRidXNfZ19wcm94eV9iZWdpbl9jYWxsKTogTW92ZSByZXR1cm5faWZfZmFpbCBoZXJlLgorCisJKiBnbGliL2RidXMtZ29iamVjdC5jICh3cml0ZV9pbnRlcmZhY2UpOiBVcGRhdGUgZm9yCisJZGJ1c19ndHlwZV90b19zaWduYXR1cmUgcmV0dXJuaW5nIG5ldyBzdHJpbmcuCisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIGdsaWIvZXhhbXBsZXMvc3RhdGVtYWNoaW5lLgorCisyMDA1LTA3LTA4ICBKb2UgU2hhdyAgPGpvZXNoYXdAbm92ZWxsLmNvbT4KKworCSogY29uZmlndXJlLmluOiBBZGQgYSBjb25maWd1cmUgb3B0aW9uLCAtLXdpdGgtY29uc29sZS1hdXRoLWRpcgorCQorCSogZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC5jIChfZGJ1c191c2VyX2F0X2NvbnNvbGUpOiBVc2UgdGhlCisJbmV3IHNldHRpbmcuICBQYXRjaCBmcm9tIEtheSBTaWV2ZXJzLgorCisyMDA1LTA3LTA2ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBkYnVzL2RidXMtZ2xpYi5oIChEQnVzR1BlbmRpbmdDYWxsLCBEQnVzR1BlbmRpbmdDYWxsTm90aWZ5KQorCShEQlVTX1RZUEVfR19QRU5ESU5HX0NBTEwsIGRidXNfZ19wZW5kaW5nX2NhbGxfZ2V0X2dfdHlwZSkKKwkoZGJ1c19nX3BlbmRpbmdfY2FsbF9yZWYsIGRidXNfZ19wZW5kaW5nX2NhbGxfdW5yZWYpOiBEZWxldGUuCisJKGRidXNfZ19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSwgZGJ1c19nX3BlbmRpbmdfY2FsbF9jYW5jZWwpOgorCURlbGV0ZSBpbiBmYXZvciBvZiBkYnVzX2dfcHJveHlfYmVnaW5fY2FsbCBhbmQKKwlkYnVzX2dfcHJveHlfY2FuY2VsX2NhbGwuCisJKERCdXNHUHJveHlDYWxsLCBEQnVzR1Byb3h5Q2FsbE5vdGlmeSk6IE5ldy4KKwkoZGJ1c19nX3Byb3h5X2JlZ2luX2NhbGwpOiBDaGFuZ2UgcHJvdG90eXBlIHRvIHRha2UgY2FsbGJhY2ssIHVzZXIKKwlkYXRhLCBhbmQgZGVzdHJveSBmdW5jdGlvbi4gIFRoaXMgcmVwbGFjZXMKKwlkYnVzX2dfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkuCisJKGRidXNfZ19wcm94eV9jYW5jZWxfY2FsbCk6IFByb3RvdHlwZS4KKwkoREJ1c0dBc3luY0RhdGEpOiBEZWxldGUsIHNob3VsZG4ndCBiZSBuZWVkZWQgYW55bW9yZS4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChzdHJ1Y3QgX0RCdXNHUHJveHkpOiBBZGQgY2FsbF9pZF9jb3VudGVyIGFuZAorCXBlbmRpbmdfY2FsbHMgbWFwLgorCShzdHJ1Y3QgX0RCdXNHUHJveHlNYW5hZ2VyKTogQWRkIGJ1c19wcm94eSBtZW1iZXIsIHdoaWNoIGlzIGFuCisJaW50ZXJuYWwgcHJveHkgZm9yIGNhbGxzIHRvIHRoZSBidXMuIFJlbW92ZQorCXBlbmRpbmdfbmFtZW93bmVyX2NhbGxzLCBub3cgdGhlIGludGVybmFsIHByb3h5IGtlZXBzIHRyYWNrLgorCShkYnVzX2dfcHJveHlfbWFuYWdlcl91bnJlZik6IFVucmVmIGJ1cyBwcm94eSwgcmVtb3ZlIHJlZmVyZW5jZSB0bworCXBlbmRpbmdfbmFtZW93bmVyX2NhbGxzLgorCShnb3RfbmFtZV9vd25lcl9jYik6IFVwZGF0ZSBwcm90b3R5cGUsIGFuZCB1c2UKKwlkYnVzX2dfcHJveHlfZW5kX2NhbGwuCisJKGdvdF9uYW1lX293bmVyX2NiKTogUmVtb3ZlIHJlZmVyZW5jZSB0byBwZW5kaW5nX25hbWVvd25lcl9jYWxscy4KKwkoZGJ1c19nX3Byb3h5X21hbmFnZXJfcmVnaXN0ZXIpOiBEZWxldGUgZGlyZWN0bHkgbGliZGJ1cyBjb2RlIGluCisJZmF2b3Igb2YgdXNpbmcgaW50ZXJuYWwgcHJveHkuCisJKGRidXNfZ19wcm94eV9tYW5hZ2VyX3VucmVnaXN0ZXIpOiBVcGRhdGUgdG8gdXNlCisJZGJ1c19nX3Byb3h5X2NhbmNlbF9jYWxsIGZvciBhbnkgcGVuZGluZyBHZXROYW1lT3duZXIgY2FsbC4KKwkoZGJ1c19nX3Byb3h5X2luaXQpOiBJbml0aWFsaXplIHBlbmRpbmcgY2FsbHMgbWFwLgorCShkYnVzX2dfcHJveHlfY29uc3RydWN0b3IpOiBOZXcuCisJKGRidXNfZ19wcm94eV9jbGFzc19pbml0KTogQWRkIGdldC9zZXQgcHJvcGVydHkgZnVuY3Rpb25zLAorCWNvbnN0cnVjdG9yLCBhbmQgYWRkIE5BTUUsIFBBVEgsIGFuZCBJTlRFUkZBQ0UgcHJvcGVydGllcy4KKwkoY2FuY2VsX3BlbmRpbmdfY2FsbCk6IE5ldyBmdW5jdGlvbi4KKwkoZGJ1c19nX3Byb3h5X2Rpc3Bvc2UpOiBJdGVyYXRlIG92ZXIgYW55IG91dHN0YW5kaW5nIGNhbGxzIGFuZAorCWNhbmNlbCB0aGVtLgorCShkYnVzX2dfcHJveHlfc2V0X3Byb3BlcnR5LCBkYnVzX2dfcHJveHlfZ2V0X3Byb3BlcnR5KTogTmV3LgorCShHUGVuZGluZ05vdGlmeUNsb3N1cmUpOiBOZXcgc3RydWN0dXJlLgorCShkX3BlbmRpbmdfY2FsbF9ub3RpZnksIGRfcGVuZGluZ19jYWxsX2ZyZWUpOiBNb3ZlZCBoZXJlIGZyb20KKwlkYnVzLWdsaWIuYy4KKwkoREJVU19HX1ZBTFVFX0FSUkFZX0NPTExFQ1RfQUxMKTogTW92ZWQgYXJvdW5kIHRvIHNhdGlzZnkgZnVuY3Rpb24KKwlvcmRlcmluZy4KKwkobWFuYWdlcl9iZWdpbl9idXNfY2FsbCk6IE5ldyBpbnRlcm5hbCBmdW5jdGlvbiBmb3IgdGFsa2luZyB0bworCWludGVybmFsIGJ1cyBwcm94eS4KKwkoZGJ1c19nX3Byb3h5X25ldyk6IENvbnN0cnVjdCBvYmplY3QgdXNpbmcgR09iamV0IHByb3BlcnRpZXMuCisJKGRidXNfZ19wcm94eV9iZWdpbl9jYWxsX2ludGVybmFsKTogVXBkYXRlIHRvIHRha2UgdXNlciBkYXRhLCBldGMuCisJQ3JlYXRlIGNsb3N1cmUgb2Ygc2FtZSwgYW5kIGluc2VydCBjYWxsIGludG8gbWFwIG9mIHBlbmRpbmcgY2FsbHMuCisJKGRidXNfZ19wcm94eV9lbmRfY2FsbF9pbnRlcm5hbCk6IFRha2UgY2FsbCBpZCBpbnN0ZWFkIG9mIHBlbmRpbmcKKwljYWxsLiAgTG9vayB1cCBwZW5kaW5nIGNhbGwgaW4gY3VycmVudCBzZXQuICBSZW1vdmUgaXQgd2hlbiB3ZSd2ZQorCWNvbXBsZXRlZC4KKwkoZGJ1c19nX3BlbmRpbmdfY2FsbF9lbmQsIGRidXNfZ19wcm94eV9lbmRfY2FsbF9pbnRlcm5hbCk6IERlbGV0ZS4KKwkoZGJ1c19nX3Byb3h5X2JlZ2luX2NhbGwpOiBDaGFuZ2UgQVBJIHRvIHRha2UgY2FsbGJhY2ssIHVzZXIgZGF0YSwKKwlhbmQgZGVzdHJveSBmdW5jdGlvbiBkaXJlY3RseS4KKwkoZGJ1c19nX3Byb3h5X2VuZF9jYWxsKTogVXBkYXRlIHRvIHRha2UgREJ1c0dQcm94eUNhbGwuCisJKGRidXNfZ19wcm94eV9jYWxsKTogSW52b2tlIHdpdGggTlVMTCBjYWxsYmFjay4KKwkoZGJ1c19nX3Byb3h5X2NhbmNlbF9jYWxsKTogTmV3IGZ1bmN0aW9uLCByZXBsYWNlcworCWRidXNfZ19wZW5kaW5nX2NhbGxfY2FuY2VsLgorCisJKiBnbGliL2RidXMtZ3BhcnNlci5jICh2YWxpZGF0ZV9zaWduYXR1cmUpOiBGaXggY2FsbCB0bworCWRidXNfc2V0X2dfZXJyb3IuCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGRidXNfZ19vYmplY3RfdHlwZV9kYnVzX21ldGFkYXRhX3F1YXJrKToKKwlOZXcgcXVhcmsgZm9yIGF0dGFjaGluZyBtZXRhZGF0YSB0byBHVHlwZS4KKwkoaW5mb19oYXNoKTogRGVsZXRlLgorCShsb29rdXBfb2JqZWN0X2luZm8pOiBMb29rIHVwIHVzaW5nIHF1YXJrLgorCShkYnVzX2dfb2JqZWN0X3R5cGVfaW5zdGFsbF9pbmZvKTogQ2hlY2sgdGhhdCBhIHR5cGUgaXMgY2xhc3NlZCwKKwlub3QgdGhhdCBpdCdzIGFuIG9iamVjdC4gIEFsc28ganVzdCBpbnN0YWxsIHR5cGUgZGF0YSB1c2luZyBxdWFyaworCWluc3RlYWQgb2YgdXNpbmcgZ2xvYmFsIGhhc2guCisKKwkqIGdsaWIvZGJ1cy1nbGliLmMgKGRidXNfZ19wZW5kaW5nX2NhbGxfcmVmKSAKKwkoZGJ1c19nX3BlbmRpbmdfY2FsbF91bnJlZiwgZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2dfdHlwZSkKKwkoR1BlbmRpbmdOb3RpZnlDbG9zdXJlKTogRGVsZXRlLgorCShkX3BlbmRpbmdfY2FsbF9ub3RpZnksIGRfcGVuZGluZ19jYWxsX2ZyZWUpOiBNb3ZlIHRvIGRidXMtZ3Byb3h5LmMuCisJKGRidXNfZ19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSwgZGJ1c19nX3BlbmRpbmdfY2FsbF9jYW5jZWwpOiBEZWxldGUuCisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5jIChnZW5lcmF0ZV9jbGllbnRfZ2x1ZSk6IERpc2FibGUgYXN5bmMKKwljbGllbnQgbWV0aG9kIGdlbmVyYXRpb24gdW50aWwgd2UgY2FuIGZpeCBpdC4uLgorCQorCSogdG9vbHMvZGJ1cy12aWV3ZXIuYyAobG9hZF9jaGlsZF9ub2Rlcyk6IFVzZSBkYnVzX2dfcHJveHlfY2FsbC4KKwkobG9hZF9mcm9tX3NlcnZpY2VfdGhyZWFkX2Z1bmMpOiBEaXR0by4KKworCSogdG9vbHMvZGJ1cy1uYW1lcy1tb2RlbC5jIChzdHJ1Y3QgTmFtZXNNb2RlbCk6IEhvbGQKKwlEQnVzR1Byb3h5Q2FsbC4KKwkoaGF2ZV9uYW1lc19ub3RpZnkpOiBVcGRhdGUgcHJvdG90eXBlLCB1c2UKKwlkYnVzX2dfcHJveHlfY2FuY2VsX2NhbGwuCisJKG5hbWVzX21vZGVsX3JlbG9hZCk6IFVwZGF0ZSBmb3IgbmV3IGRidXNfZ19wcm94eV9iZWdpbl9jYWxsIEFQSS4KKworCSogdG9vbHMvZGJ1cy1tb25pdG9yLmMgKGZpbHRlcl9mdW5jKTogVXBkYXRlIGZvciBwcmludF9tZXNzYWdlCisJQVBJIGNoYW5nZS4KKworCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmM6IEFkZCBtb3JlIHRlc3RzIGZvciBhc3luYworCWludm9jYXRpb25zLiAgVXBkYXRlIG1hbnkgYmVnaW5fY2FsbC9lbmRfY2FsbCBwYWlycyB0byBqdXN0IHVzZQorCWRidXNfZ19wcm94eV9jYWxsLgorCisJKiB0b29scy9kYnVzLXNlbmQuYyAobWFpbik6IEFkZCAtLXByaW50LXJlcGx5PWxpdGVyYWwgbW9kZS4gIFRoaXMKKwlhbGxvd3MgdXMgdG8gZHVtcCBwcmludC1pbnRyb3NwZWN0LmMuCisKKwkqIHRvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5oIChwcmludF9tZXNzYWdlKTogQWRkIGxpdGVyYWwgYXJndW1lbnQKKwl0byBwcmludF9tZXNzYWdlIHdoaWNoIGlzIGludGVuZGVkIHRvIGFsbG93IHByaW50aW5nIGFyZ3VtZW50cyB3aXRob3V0CisJbWV0YWRhdGEgbGlrZSAic3RyaW5nPSIuCisKKwkqIHRvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5jIChwcmludF9pdGVyKTogQWRkIGxpdGVyYWwgYXJndW1lbnQuCisJKHByaW50X21lc3NhZ2UpOiBBbGxvdyBwcmludGluZyBzdHJpbmcgbWVzc2FnZXMgbGl0ZXJhbGx5LgorCisyMDA1LTA3LTA1ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmMgKG1hcnNoYWxfZGJ1c19tZXNzYWdlX3RvX2dfbWFyc2hhbGxlcik6CisJUmVtb3ZlIHZhbHVlIHJlZmNvdW50IGxlYWssIG9yaWdpbmFsIHBhdGNoIGZyb20gSm9ybiBCYWF5ZW4KKwk8am9ybkBvcGVuZWRoYW5kLmNvbT4uICBBbHNvIHJlbW92ZSB1c2VsZXNzIGV4dHJhIHZhbHVlIGluIGZhdm9yCisJb2YgcHJlcGVuZGluZyB0byB2YWx1ZSBhcnJheSBkaXJlY3RseS4KKworMjAwNS0wNy0wMiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWdtYWluLmMgKF9kYnVzX2dtYWluX3Rlc3QpOiBGaXggdGVzdC4KKworMjAwNS0wNy0wMSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCVBhdGNoIGZyb20gSm9uYXRoYW4gTWF0dGhldyA8am9uYXRoYW5Aa2FvbGluLmhuLm9yZz4KKwkKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuYyAoYmFzaWNfdHlwZWNvZGVfdG9fZ3R5cGUpOiBGaXggcmV0dXJuIHR5cGUuCisJKGRidXNfZ192YWx1ZV90eXBlc19pbml0KTogTWFyc2hhbCBHX1RZUEVfQ0hBUiBhcyBEQlVTX1RZUEVfQllURSwKKwlHX1RZUEVfTE9ORyBhcyBEQlVTX1RZUEVfSU5UMzIsIEdfVFlQRV9VTE9ORyBhcyBEQlVTX1RZUEVfVUlOVDMyLAorCWFuZCBHX1RZUEVfRkxPQVQgYXMgREJVU19UWVBFX0RPVUJMRS4KKworMjAwNS0wNi0zMCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmM6CisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYzoKKwkqIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi54bWw6IFVwZGF0ZSB0ZXN0cyBmb3IgbmV3IGVycm9yCisJc2V0dGluZyBiaXRzLCBhbHNvIGFkZCBhc3luYyB0ZXN0cyAocGF0Y2ggZnJvbSBSb3NzIEJ1cnRvbikuCisKKwkqIHRlc3QvZ2xpYi9NYWtlZmlsZS5hbSAodGVzdF9zZXJ2aWNlX2dsaWJfTERBREQpOiBBZGQKKwlEQlVTX0dMSUJfVEhSRUFEU19MSUJTLgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmMgKGdldF9uYW1lX293bmVyKQorCShkYnVzX2dfcGVuZGluZ19jYWxsX2VuZF92YWxpc3QpOiBEaXR0by4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoZXJyb3JfbWV0YWRhdGEpOiBOZXcgbWFwcGluZyBmcm9tIEdFcnJvcgorCWRvbWFpbiAoR1F1YXJrKSB0byBEQnVzR0Vycm9ySW5mby4gIAorCShnZXJyb3JfZG9tYWluY29kZV90b19kYnVzX2Vycm9yX25hbWUpOiBBdHRlbXB0IHRvIGxvb2sgdXAgZXJyb3IKKwlxdWFyayBpbiBlcnJvcl9tZXRhZGF0YS4gIFRha2UgbWVzc2FnZSBpbnRlcmZhY2UgYXMgZGVmYXVsdAorCWVycm9yIG1lc3NhZ2UgaW50ZXJmYWNlLgorCShnZXJyb3JfdG9fZGJ1c19lcnJvcl9tZXNzYWdlKTogUGFzcyBtZXNzYWdlIGludGVyZmFjZS4KKwkoZGJ1c19zZXRfZ19lcnJvcik6IFJlc3VycmVjdGVkLgorCShkYnVzX2dfZXJyb3JfaW5mb19mcmVlKTogTmV3IGZ1bmN0aW9uLgorCShkYnVzX2dfb2JqZWN0X3R5cGVfaW5zdGFsbF9pbmZvKTogVXNlIGdfdHlwZV9jbGFzc19yZWYgaW5zdGVhZAorCW9mIF9wZWVrIHRvIGFjdHVhbGx5IGNyZWF0ZSB0aGUgb2JqZWN0IGNsYXNzIGlmIGl0IGhhc24ndCBiZWVuCisJY3JlYXRlZCB5ZXQuCisJKGRidXNfZ19lcnJvcl9kb21haW5fcmVnaXN0ZXIpOiBOZXcgZnVuY3Rpb24uCisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jIChkYnVzX2dfYnVzX2dldCk6IFN3aXRjaCB0byBkYnVzX3NldF9nX2Vycm9yLgorCisJKiBnbGliL2RidXMtZ3BhcnNlci5jICh2YWxpZGF0ZV9zaWduYXR1cmUpOiBEaXR0by4KKworCSogZGJ1cy9kYnVzLWdsaWIuaCAoZGJ1c19nX2Vycm9yX3NldCk6IERlbGV0ZS4KKwkoZGJ1c19nX2Vycm9yX2RvbWFpbl9yZWdpc3Rlcik6IFByb3RvdHlwZS4KKworCSogZ2xpYi9kYnVzLWdsaWIuYyAoZGJ1c19nX2Vycm9yX3NldCk6IERlbGV0ZS4KKwlVcGRhdGUgdGVzdHMuCisKKzIwMDUtMDYtMjkgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGRidXMvZGJ1cy1nbGliLmg6IERlbGV0ZSBEQlVTX1RZUEVfR19QUk9YWV9BUlJBWS4gIEFkZAorCURCVVNfVFlQRV9HX09CSkVDVF9QQVRILgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLmMgKGRidXNfZ192YWx1ZV90eXBlc19pbml0KTogUmVtb3ZlIG1hcnNoYWxsZXJzCisJZm9yIEdfVFlQRV9PQkpFQ1QgYW5kIERCVVNfVFlQRV9HX1BST1hZX0FSUkFZICh0aGUgbGF0dGVyIHNob3VsZAorCWJlIGhhbmRsZWQgbW9yZSBnZW5lcmljYWxseSkuICBBZGQgREJVU19UWVBFX0dfT0JKRUNUX1BBVEguCisJKGRidXNfZ19vYmplY3RfcGF0aF9nZXRfZ190eXBlKTogTmV3IGZ1bmN0aW9uLgorCShkYnVzX2d0eXBlX2Zyb21fc2lnbmF0dXJlX2l0ZXIpOiBNYXAgREJVU19UWVBFX09CSkVDVF9QQVRICisJdG8gREJVU19UWVBFX0dfT0JKRUNUX1BBVEggYnkgZGVmYXVsdC4KKwkoZGVtYXJzaGFsX3Byb3h5KTogUmVtb3ZlIHVudXNlZCBuYW1lIHZhcmlhYmxlLgorCShkZW1hcnNoYWxfb2JqZWN0X3BhdGgsIG1hcnNoYWxfb2JqZWN0X3BhdGgpOiBOZXcgZnVuY3Rpb25zLgorCShkZW1hcnNoYWxfcHJveHlfYXJyYXksIG1hcnNoYWxfcHJveHlfYXJyYXkpOiBEZWxldGUuCisJCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYyAoZGJ1c19nX3R5cGVfZ2V0X2NfbmFtZSk6IE1hcAorCURCVVNfVFlQRV9HX09CSkVDVF9QQVRIIHRvIGNoYXIgKi4KKwkoZGJ1c19nX3R5cGVfZ2V0X2xvb2t1cF9mdW5jdGlvbik6IE1hcCBidWlsdGluCisJREJVU19UWVBFX0dfT0JKRUNUX1BBVEguCisKKwkqIHRlc3QvZ2xpYi90ZXN0LWRidXMtZ2xpYi5jCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYyAobXlfb2JqZWN0X29ianBhdGgpOiAKKwlBZGFwdCB0ZXN0cyB0byBuZXcgb2JqZWN0IHBhdGggbWFyc2hhbGxpbmcuCisKKzIwMDUtMDYtMjkgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogZm9yY2UgY2hlY2sgZm9yIFB5dGhvbiA+PSAyLjQKKworMjAwNS0wNi0yOSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKwkKKwlQYXRjaCBmcm9tIFJvc3MgQnVydG9uIDxyb3NzQG9wZW5lZGhhbmQuY29tPgorCQorCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoaW52b2tlX29iamVjdF9tZXRob2QpOiBVbnNldCBvYmplY3QKKwl2YWx1ZSBpbiBhbGwgY2FzZXMsIG5vdCBvbmx5IGluIGFzeW5jIGNhc2UuCisKKzIwMDUtMDYtMjkgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoc3RydWN0IF9EQnVzR1Byb3h5KTogQWRkIG5ldyBtZW1iZXIKKwluYW1lX2NhbGwgZm9yIGtlZXBpbmcgdHJhY2sgb2YgYW55IG91dGdvaW5nIEdldE5hbWVPd25lciBjYWxsLgorCUFsc28gYWRkIGZvcl9vd25lciBhbmQgYXNzb2NpYXRlZC4KKwkoc3RydWN0IF9EQnVzR1Byb3h5TWFuYWdlcik6IEFkZCBvd25lcl9uYW1lcywgd2hpY2ggaXMgaGFzaCB0YWJsZQorCXRoYXQgbWFwcyBhIGJhc2UgbmFtZSB0byBhIGxpc3Qgb2YgbmFtZXMgaXQgb3ducyAodGhhdCB3ZSdyZQorCWludGVyZXN0ZWQgaW4pLiAgQWRkIHBlbmRpbmdfbmFtZW93bmVyX2NhbGxzIHdoaWNoIGlzIGEgbGlzdCBvZgorCWFsbCBvdXRzdGFuZGluZyBHZXROYW1lT3duZXI7IGF2b2lkcyB1cyBoYXZpbmcgdG8gaXRlcmF0ZSBvdmVyCisJZXZlcnkgcHJveHkuICBBZGQgdW5hc3NvY2lhdGVkX3Byb3hpZXMgd2hpY2gga2VlcHMgdHJhY2sgb2YgbmFtZQorCXByb3hpZXMgd2l0aCBubyBhc3NvY2lhdGVkIG5hbWUgb3duZXIuCisJKGRidXNfZ19wcm94eV9tYW5hZ2VyX3VucmVmKTogRGVzdHJveSBvd25lcl9uYW1lcy4KKwkoc3RydWN0IERCdXNHUHJveHlOYW1lT3duZXJJbmZvKTogTmV3IHN0cnVjdCBmb3Iga2VlcGluZyB0cmFjayBvZgorCW5hbWUgcmVmY291bnRzLgorCShmaW5kX25hbWVfaW5faW5mbywgbmFtZV9vd25lcl9mb3JlYWNoKQorCShkYnVzX2dfcHJveHlfbWFuYWdlcl9sb29rdXBfbmFtZV9vd25lciwgaW5zZXJ0X25hbWVpbmZvKQorCShkYnVzX2dfcHJveHlfbWFuYWdlcl9tb25pdG9yX25hbWVfb3duZXIpCisJKGRidXNfZ19wcm94eV9tYW5hZ2VyX3VubW9uaXRvcl9uYW1lX293bmVyKQorCSh1bmFzc29jaWF0ZV9wcm94aWVzLCBkYnVzX2dfcHJveHlfbWFuYWdlcl9yZXBsYWNlX25hbWVfb3duZXIpOgorCU5ldyBmdW5jdGlvbnM7IHRoZXkgbWFuaXB1bGF0ZSB0aGUgb3duZXJfbmFtZXMgbWFwcGluZy4KKwkoZ290X25hbWVfb3duZXJfY2IpOiBOZXcgZnVuY3Rpb24uCisJKGdldF9uYW1lX293bmVyKTogTmV3IGZ1bmN0aW9uLCBleHRyYWN0ZWQgZnJvbQorCWRidXNfZ19wcm94eV9uZXdfZm9yX25hbWVfb3duZXIuCisJKGRidXNfZ19wcm94eV9tYW5hZ2VyX3JlZ2lzdGVyKTogRm9yIG5vdyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YKKwlhbGwgTmFtZU93bmVyQ2hhbmdlZC4gIEFsc28gaWYgdGhlIHByb3h5IGlzIGZvciBhIG5hbWUsIGlmIHdlCisJZG9uJ3QgYWxyZWFkeSBrbm93IHRoZSBuYW1lIG93bmVyLCBxdWV1ZSBhIG5ldyBHZXROYW1lT3duZXIKKwlyZXF1ZXN0IGFuZCBhZGQgaXQgdG8gb3VyIGxpc3Qgb2YgdW5hc3NvY2lhdGVkIHByb3hpZXMuICBPdGhlcndpc2UKKwlpbmMgdGhlIHJlZmNvdW50LgorCShkYnVzX2dfcHJveHlfbWFuYWdlcl91bnJlZ2lzdGVyKTogSWYgdGhpcyBwcm94eSBpcyBmb3IgYSBuYW1lLAorCWNhbmNlbCBhbnkgcGVuZGluZyBHZXROYW1lT3duZXIgY2FsbCwgZXRjLgorCShkYnVzX2dfcHJveHlfbWFuYWdlcl9maWx0ZXIpOiBIYW5kbGUgTmFtZU93bmVyQ2hhbmdlZC4gIEFsc28gdXNlCisJdGhlIG93bmVyX25hbWVzIG1hcHBpbmcgdG8gbG9vayB1cCB0aGUgY3VycmVudCBuYW1lcyBmb3IgdGhlCisJc2lnbmFsIHNvdXJjZSwgYW5kIGRpc3BhdGNoIHRvIGFueSBwcm94aWVzIGZvciB0aGF0IG5hbWUuCisJKGRidXNfZ19wcm94eV9uZXcpOiBJbml0aWFsaXplIG5ldyBtZW1iZXJzLgorCShkYnVzX2dfcHJveHlfbmV3X2Zvcl9uYW1lKTogRGVsZXRlIHVudXNlZCBwcm94eSB2YXJpYWJsZS4KKwkoZGJ1c19nX3Byb3h5X25ld19mb3JfbmFtZV9vd25lcik6IFVzZSBnZXRfbmFtZV9vd25lci4KKwkoZGJ1c19nX3BlbmRpbmdfY2FsbF9lbmRfdmFsaXN0KTogTmV3IGZ1bmN0aW9uLCBleHRyYWN0ZWQgZnJvbQorCWRidXNfZ19wcm94eV9lbmRfY2FsbF9pbnRlcm5hbC4gIFVzZWZ1bCB3aGVuIHdlIGRvbid0IGhhdmUgYSBwcm94eQorCWJ1dCB3YW50IHRvIHVzZSB0aGUgR0xpYiBpbmZyYXN0cnVjdHVyZS4gIEFsc28gbm90ZSBob3cgbWFueQorCWFyZ3VtZW50cyBpbiByZXBseSB3ZXJlIG92ZXIuCisJKGRidXNfZ19wZW5kaW5nX2NhbGxfZW5kKTogTmV3IGZ1bmN0aW9uLCBqdXN0IGNhbGwKKwlkYnVzX2dfcGVuZGluZ19jYWxsX2VuZF92YWxpc3QuCisJKGRidXNfZ19wcm94eV9lbmRfY2FsbF9pbnRlcm5hbCk6IEp1c3QgY2FsbAorCWRidXNfZ19wZW5kaW5nX2NhbGxfZW5kX3ZhbGlzdC4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoX2RidXNfZ29iamVjdF9sb29rdXBfbWFyc2hhbGxlcik6IEZpeCBsb29rdXAKKwlvZiBidWlsdGluIG1hcnNoYWxsZXIgZm9yIFNUUklOR19TVFJJTkdfU1RSSU5HLgorCisJKiB0ZXN0L2dsaWIvdGVzdC1kYnVzLWdsaWIuYzogCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYzoKKwkqIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi54bWw6CisJRXh0ZW5kIHRlc3RzIHRvIGNvdmVyIG5hbWUgcHJveGllcywgZGVzdHJ1Y3Rpb24gb2Ygb3duZXIgcHJveGllcywKKwlldGMuCisJCisJKiBnbGliL2V4YW1wbGVzL2V4YW1wbGUtc2lnbmFsLXJlY2lwaWVudC5jCisJKGRidXNfZ19wcm94eV9uZXdfZm9yX25hbWVfb3duZXIpOiBDcmVhdGUgYSBuYW1lIHByb3h5LgorCQorCSogdG9vbHMvZGJ1cy1zZW5kLmMgKG1haW4pOiBQcmludCBELUJVUyBlcnJvciBuYW1lIGluIGFkZGl0aW9uCisJdG8gbWVzc2FnZS4KKworMjAwNS0wNi0yOCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluIChjdW5yZWdpc3Rlcl9mdW5jdGlvbl9oYW5kbGVyLAorCWNtZXNzYWdlX2Z1bmN0aW9uX2hhbmRsZXIpOiBQYXRjaCBmcm9tIAorCUFudGhvbnkgQmF4dGVyIDxhbnRob255QGludGVybGluay5jb20uYXU+IGZpeGVzIHRocmVhZGluZyBwcm9ibGVtcworCWJ5IHVzaW5nIHRoZSBQeV9HSUxTdGF0ZV9FbnN1cmUvUmVsZWFzZSB0byBzeW5jaHJvbml6ZSB3aXRoIHRoZQorCXB5dGhvbiBydW50aW1lLgorCQorMjAwNS0wNi0yOCAgUmF5IFN0cm9kZSAgPHJzdHJvZGVAcmVkaGF0LmNvbT4KKworCSogIGRidXMvZGJ1cy1zcGF3bi5jIChfZGJ1c19iYWJ5c2l0dGVyX3VucmVmKToga2lsbAorCWJhYnlzaXR0ZXIgaGVscGVyIHByb2Nlc3Mgb24gbGFzdCB1bnJlZiwgYnVnICMyODEzLgorCisyMDA1LTA2LTI3ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiB0ZXN0L2dsaWIvdGVzdC1kYnVzLWdsaWIuYzogCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYzoKKwkqIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi54bWw6CisJVGVzdCBoYXNoIHRhYmxlIHNpZ25hbCBlbWl0dGluZy4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoX2RidXNfZ29iamVjdF9sb29rdXBfbWFyc2hhbGxlcik6IENvbnZlcnQKKwl0eXBlcyB0byB0aGVpciBmdW5kYW1lbnRhbCBiYXNpcyB0eXBlcywgc2luY2UgdGhpcyBpcyB3aGF0CisJbWFyc2hhbGxlcnMgb3BlcmF0ZSBvbi4gIEFsc28gYWRkIGFuIGVudHJ5IGZvciBWT0lEX19CT1hFRC4KKwkoZGJ1c19nX29iamVjdF9yZWdpc3Rlcl9tYXJzaGFsbGVyX2FycmF5KTogQ29udmVydCB0byBmdW5kYW1lbnRhbC4KKworMjAwNS0wNi0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9kYnVzLXR1dG9yaWFsLnhtbDogZml4IG5hbWVzIG9mIGludGVyZmFjZS9zZXJ2aWNlL3BhdGgsIGZpeAorCWZyb20gRG9uIFBhcmsKKworMjAwNS0wNi0yNiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWdsaWIuYyAoZGJ1c19zZXRfZ19lcnJvcik6IERlbGV0ZS4KKwkoZGJ1c19nX2Vycm9yX3NldCk6IE5ldyBwdWJsaWMgZnVuY3Rpb24gZnJvbSBpdHMgYXNoZXM7IHVzZWQgYnkKKwlib3RoIHNlcnZpY2Utc2lkZSBtZXRob2QgaW1wbGVtZW50YXRpb24gYW5kIEdMaWIgYmluZGluZ3MKKwlpbnRlcm5hbHMuCisJKGRidXNfZ19lcnJvcl9oYXNfbmFtZSwgZGJ1c19nX2Vycm9yX2dldF9uYW1lKTogTmV3IGZ1bmN0aW9uLgorCShfZGJ1c19nbGliX3Rlc3QpOiBBZGQgc29tZSB0ZXN0cy4KKworCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmMgKG1haW4pOiBUZXN0IGRidXNfZ19lcnJvcl9oYXNfbmFtZS4KKworCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLmMgKG15X29iamVjdF90aHJvd19lcnJvcik6IFVzZQorCWRidXNfZ19lcnJvcl9zZXQuCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGdlcnJvcl90b19kYnVzX2Vycm9yX21lc3NhZ2UpOiBIYW5kbGUKKwllcnJvcnMgdGhyb3duIGJ5IGRidXNfZ19lcnJvcl9zZXQuCisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jIChkYnVzX2dfYnVzX2dldCk6IENoYW5nZSB0byBkYnVzX2dfZXJyb3Jfc2V0LgorCisJKiBnbGliL2RidXMtZ3BhcnNlci5jICh2YWxpZGF0ZV9zaWduYXR1cmUpOiBEaXR0by4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dfcHJveHlfbmV3X2Zvcl9uYW1lX293bmVyKSAKKwkoZGJ1c19nX3Byb3h5X2VuZF9jYWxsX2ludGVybmFsKTogRGl0dG8uCisKKwkqIGdsaWIvTWFrZWZpbGUuYW06IEdlbmVyYXRlIGRidXMtZ2xpYi1lcnJvci1zd2l0Y2guaCwgd2hpY2gKKwljb252ZXJ0cyBEQlVTX0VSUk9SX3ggdG8gREJVU19HRVJST1JfeC4KKwkobGliZGJ1c19nbGliXzFfbGFfU09VUkNFUywgQlVJTFRfU09VUkNFUywgQ0xFQU5GSUxFUyk6IEFkZCBpdC4KKworCSogZG9jL1RPRE86IFJlbW92ZSBlcnJvciBUT0RPLgorCisJKiBkb2MvZGJ1cy10dXRvcmlhbC54bWw6IFVwZGF0ZSB3aXRoIGRvY3VtZW50YXRpb24gYWJvdXQgZXJyb3IKKwloYW5kbGluZy4KKworCSogZGJ1cy9tYWtlLWRidXMtZ2xpYi1lcnJvci1lbnVtLnNoOiBUaWdodGVuIHVwIHJlZ2V4cCB0byBtYWtlCisJc3VyZSB3ZSBvbmx5IGNoYW5nZSBEQlVTX0VSUk9SIHRvIERCVVNfR0VSUk9SLCBub3QgYWxsIEVSUk9SIHRvCisJR0VSUk9SLiAgQWxzbyBhZGQgREJVU19HRVJST1JfUkVNT1RFX0VYQ0VQVElPTi4KKworMjAwNS0wNi0yMiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKwkKKwlQYXRjaCBmcm9tIFJvc3MgQnVydG9uIDxyb3NzQG9wZW5lZGhhbmQuY29tPgorCisJKiBnbGliL2RidXMtZ29iamVjdC5jIChkYnVzX2dfbWV0aG9kX3JldHVybik6IEZyZWUgb3V0X3NpZy4KKworMjAwNS0wNi0yMCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogY29uZmlndXJlLmluOiBBZGQgZ2xpYi9leGFtcGxlcy4KKworCSogZ2xpYi9NYWtlZmlsZS5hbTogQWRkIGV4YW1wbGVzLworCisJKiBnbGliL2V4YW1wbGVzLy5jdnNpZ25vcmUKKwkqIGdsaWIvZXhhbXBsZXMvTWFrZWZpbGUuYW0KKwkqIGdsaWIvZXhhbXBsZXMvZXhhbXBsZS1jbGllbnQuYworCSogZ2xpYi9leGFtcGxlcy9leGFtcGxlLXNlcnZpY2UuYworCSogZ2xpYi9leGFtcGxlcy9leGFtcGxlLXNlcnZpY2UueG1sCisJKiBnbGliL2V4YW1wbGVzL2V4YW1wbGUtc2lnbmFsLWVtaXR0ZXIuYworCSogZ2xpYi9leGFtcGxlcy9leGFtcGxlLXNpZ25hbC1lbWl0dGVyLnhtbAorCSogZ2xpYi9leGFtcGxlcy9leGFtcGxlLXNpZ25hbC1yZWNpcGllbnQuYzoKKwlOZXcgZmlsZXM7IEdMaWIgYmluZGluZyBleGFtcGxlcywgcG9ydGVkIGZyb20KKwlweXRob24vZXhhbXBsZXMuCisKKzIwMDUtMDYtMjAgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGRidXMvZGJ1cy1nbGliLmg6IAorCSogZ2xpYi9kYnVzLWdwcm94eS5jOiBSZW5hbWUgZGJ1c19nX3Byb3h5X2ludm9rZSB0bworCWRidXNfZ19wcm94eV9jYWxsLgorCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYzogCisJKiBkb2MvZGJ1cy10dXRvcmlhbC54bWw6IAorCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmM6IFVwZGF0ZSBmb3IgcmVuYW1lLgorCQorMjAwNS0wNi0yMCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCVBhdGNoIHN1Z2dlc3RlZCBieSBSb3NzIEJ1cnRvbiA8cm9zc0BvcGVuZWRoYW5kLmNvbT4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoZXhwb3J0X3NpZ25hbHMpOiBGcmVlIHNpZ25hbCBuYW1lLgorCShnX3ZhbHVlX2luaXQpOiBVc2UgR19WQUxVRV9OT0NPUFlfQ09OVEVOVFMgdG8gcGx1ZworCW1lbW9yeSBsZWFrLiAgQWRkIGEgYml0IG9mIGRvY3VtZW50YXRpb24uCisJKGRidXNfZ19tZXRob2RfcmV0dXJuX2Vycm9yKTogRnJlZSBjb250ZXh0LCBhbmQgbm90ZSB3ZSBkbworCXNvLgorCisyMDA1LTA2LTE4ICBNdXJyYXkgQ3VtbWluZyAgPG11cnJheWNAbXVycmF5Yy5jb20+CisKKwkqIGRidXMvZGJ1cy1nbGliLmg6CisJKiBnbGliL2RidXMtZ29iamVjdC5jOgorCSogZ2xpYi9kYnVzLWdwcm94eS5jOgorCSogZ2xpYi9kYnVzLWd2YWx1ZS5jOiBQcmVkZWNsYXJlIHN0cnVjdHMgYXMgCisJdHlwZWRlZiBzdHJ1Y3QgX1NvbWV0aGluZyBTb21ldGhpbmcgaW5zdGVhZCBvZiAKKyAgCXR5cGVkZWYgc3RydWN0IFNvbWV0aGluZyBTb21ldGhpbmcsIHNvIHdlIGNhbiAKKwlyZWRlY2xhcmUgdGhlIHByb3RvdHlwZXMuIE90aGVyIEdOT01FIGxpYnJhcmllcyAKKwlkbyB0aGlzIGFscmVhZHkuCisKKzIwMDUtMDYtMTcgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIHRvb2xzL2RidXMtbmFtZXMtbW9kZWwuYyAoaGF2ZV9uYW1lc19ub3RpZnkpOiBGaXggY2FsbAorCXRvIGRidXNfZ19wcm94eV9lbmRfY2FsbC4KKwkKKzIwMDUtMDYtMTcgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19nX3Byb3h5X2VtaXRfcmVtb3RlX3NpZ25hbCk6IERvbid0CisJc3BldyB3YXJuaW5ncyBpZiB3ZSBnZXQgbWFsZm9ybWVkIHJlbW90ZSBzaWduYWxzLgorCisJKiBnbGliL2RidXMtZ29iamVjdC5jIChwcm9wc2lnX2l0ZXJhdGUpOiBOZXcgZnVuY3Rpb24uCisJKGxvb2t1cF9vYmplY3RfaW5mbyk6IE5ldyBmdW5jdGlvbiwgZXh0cmFjdGVkIGZyb20KKwlsb29rdXBfb2JqZWN0X2FuZF9tZXRob2QuCisJKGludHJvc3BlY3RfcHJvcGVydGllcywgaW50cm9zcGVjdF9zaWduYWxzKTogRGVsZXRlOyB0aGVzZQorCWFyZSBtZXJnZWQgaW50byB3cml0ZV9pbnRlcmZhY2UuCisJKHdyaXRlX2ludGVyZmFjZSk6IFdyaXRlIG91dCBzaWduYWxzIGFuZCBwcm9wZXJ0aWVzIGhlcmU7CisJZHVtcCB0aGUgb3JnLmd0ay5vYmplY3Qgc3R1ZmYgYW5kIHVzZSB0aGUgaW50ZXJmYWNlIGdpdmVuCisJaW4gdGhlIGludHJvc3BlY3Rpb24gZGF0YSBibG9iLiAgQWxzbyBmaXggdXAgcHJvcGVydHkgWE1MLgorCShsb29rdXBfdmFsdWVzKTogTmV3IGZ1bmN0aW9uLgorCShpbnRyb3NwZWN0X2ludGVyZmFjZXMpOiBHYXRoZXIgYSBtYXBwaW5nIGZyb20gaW50ZXJmYWNlIHRvIGEKKwlsaXN0IG9mIGl0cyBtZXRob2RzLCBzaWduYWxzLCBhbmQgcHJvcGVydGllcywgdGhlbiB3cml0ZSBvdXQKKwllYWNoIGludGVyZmFjZS4KKwkobG9va3VwX29iamVjdF9hbmRfbWV0aG9kKTogVXNlIGxvb2t1cF9vYmplY3RfaW5mby4KKwkoc3RydWN0IERCdXNHU2lnbmFsQ2xvc3VyZSk6IEFkZCBpbnRlcmZhY2UuCisJKGRidXNfZ19zaWduYWxfY2xvc3VyZV9uZXcpOiBBZGQgaW50ZXJmYWNlLiBEb24ndCBkdXAgc2lnbmFtZTsKKwl3ZSBjYW4ganVzdCB1c2UgdGhlIGNvbnN0YW50IGRhdGEuCisJKGRidXNfZ19zaWduYWxfY2xvc3VyZV9maW5hbGl6ZSk6IERvbid0IGZyZWUgc2lnbmFsIG5hbWUuCisJKHNpZ25hbF9lbWl0dGVyX21hcnNoYWxsZXIpOiBVc2UgaW50ZXJmYWNlIGZyb20gc2lnbmFsIGNsb3N1cmUuCisJKGV4cG9ydF9zaWduYWxzKTogT25seSBleHBvcnQgc2lnbmFscyBtZW50aW9uZWQgaW4gaW50cm9zcGVjdGlvbgorCWJsb2IuCisJKGRidXNfZ19jb25uZWN0aW9uX3JlZ2lzdGVyX2dfb2JqZWN0KTogV2FybiBpZiB3ZSBoYXZlIG5vCisJaW50cm9zcGVjdGlvbiBkYXRhIGZvciBhbiBvYmplY3QuCisJKGZ1bmNzaWdfZXF1YWwpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlLgorCShkYnVzX2dfb2JqZWN0X3JlZ2lzdGVyX21hcnNoYWxsZXIpOiBUYWtlIHZhcmFyZ3MgaW5zdGVhZCBvZgorCWxpc3QuCisJKGRidXNfZ19vYmplY3RfcmVnaXN0ZXJfbWFyc2hhbGxlcl9hcnJheSk6IE5ldyBmdW5jdGlvbiwKKwlleHRyYWN0ZWQgZnJvbSBvbGQgZGJ1c19nX29iamVjdF9yZWdpc3Rlcl9tYXJzaGFsbGVyLgorCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYyAoc3RydWN0IERCdXNCaW5kaW5nVG9vbENEYXRhKTogQWRkCisJc2lnbmFscyBhbmQgcHJvcGVydHkgZGF0YS4KKwkod3JpdGVfcXVvdGVkX3N0cmluZyk6IE5ldyBmdW5jdGlvbiwgZXh0cmFjdGVkIGZyb20gZ2VuZXJhdGVfZ2x1ZS4KKwkoZ2VuZXJhdGVfZ2x1ZSk6IFdyaXRlIHNpZ25hbHMgYW5kIHByb3BlcnRpZXMgdG8gaW50cm9zcGVjdGlvbgorCWJsb2IuCisKKwkqIGRidXMvZGJ1cy1nbGliLmggKHN0cnVjdCBEQnVzR09iamVjdEluZm8pOiBJbmNsdWRlCisJZXhwb3J0ZWRfc2lnbmFscyBhbmQgZXhwb3J0ZWRfcHJvcGVydGllcy4KKwkoZGJ1c19nX29iamVjdF9yZWdpc3Rlcl9tYXJzaGFsbGVyKTogVXBkYXRlIHByb3RvdHlwZS4KKwkoZGJ1c19nX29iamVjdF9yZWdpc3Rlcl9tYXJzaGFsbGVyX2FycmF5KTogUHJvdG90eXBlLgorCQorCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmM6IEV4dGVuZCB0ZXN0aW5nIHRvIGNvdmVyIG5ldyBzaWduYWxzLgorCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYzogQWRkIG5ldyB0ZXN0IHNpZ25hbHMgYW5kIG1ldGhvZAorCXRvIGVtaXQgdGhlbS4KKworCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLnhtbDogQWRkIHNvbWUgdGVzdCBzaWduYWxzLgorCisJKiB0ZXN0L2dsaWIvTWFrZWZpbGUuYW0gKEJVSUxUX1NPVVJDRVMpOiBBZGQgbXktb2JqZWN0LW1hcnNoYWwuYworCWFuZCBteS1vYmplY3QtbWFyc2hhbC5oCisJKHRlc3Rfc2VydmljZV9nbGliX1NPVVJDRVMsIHRlc3RfZGJ1c19nbGliX1NPVVJDRVMpOiBBZGQKKwlteS1vYmplY3QtbWFyc2hhbC5jLgorCShteS1vYmplY3QtbWFyc2hhbC5jLCBteS1vYmplY3QtbWFyc2hhbC5oKTogSW1wbGVtZW50LgorCisJKiB0ZXN0L2dsaWIvLmN2c2lnbm9yZTogVXBkYXRlLgorCisJKiBkb2MvVE9ETzogUmVtb3ZlIHR3byBHTGliIFRPRE8gaXRlbXMgZml4ZWQgYnkgdGhpcworCXBhdGNoLgorCisyMDA1LTA2LTE2ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBkb2MvVE9ETzogVXBkYXRlIGZvciBHTGliIGJpbmRpbmdzLgorCQorMjAwNS0wNi0xNiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmM6CisJKiBnbGliL2RidXMtZ29iamVjdC5jOgorCSogZ2xpYi9kYnVzLWdwcm94eS5jOiAgQWRkIE5va2lhIGNvcHlyaWdodDsgUGF0Y2gKKwlmcm9tIFJvc3MgQnVydG9uLCBmb3IgaGlzIEdMaWIgYmluZGluZ3Mgd29yay4KKworMjAwNS0wNi0xNiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoZnVuY3NpZ19oYXNoLCBmdW5jc2lnX2VxdWFsKTogVXNlIG5fcGFyYW1zCisJdG8gaXRlcmF0ZSBpbnN0ZWFkIG9mIHdhbGtpbmcgdG8gR19UWVBFX0lOVkFMSUQuCisKKwlQYXRjaCBiYXNlZCBvbiBhIHBhdGNoIGZyb20gUnlhbiBHYW1tb24uCisKKzIwMDUtMDYtMTYgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfbmV3KTogU2V0IHBhcnNlciB0byBOVUxMCisJYWZ0ZXIgd2UgdW5yZWYgaXQgKFBhdGNoIGZyb20gQ2hyaXMgQm9zY29sbywgIzIxNzQpLgorCQorMjAwNS0wNi0xNiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluOiBJbXBvcnQgc2l6ZV90LAorCV9faW50NjRfdCwgX191aW50NjRfdCwgYW5kIF9fc2lnbmVkLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIDxIQVZFX0NNU0dDUkVEPiAod3JpdGVfY3JlZGVudGlhbHNfYnl0ZSk6CisJRGVmaW5lIGNtc2cgc3RydWN0LCBvdXRwdXQgaXQuCisJKF9kYnVzX3JlYWRfY3JlZGVudGlhbHNfdW5peF9zb2NrZXQpOgorCVVzZSBjbXNnIHN0cnVjdC4KKwkKKwlQYXRjaCBmcm9tIEpvZSBNYXJrdXMgQ2xhcmtlIGZvciBGcmVlQlNEIHN1cHBvcnQuCisJCisyMDA1LTA2LTE2ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiB0b29scy9kYnVzLXNlbmQuYyAoYXBwZW5kX2FycmF5KTogVXNlIHN0cnRvay4KKwkoYXBwZW5kX2RpY3QpOiBOZXcgZnVuY3Rpb24uCisJKHR5cGVfZnJvbV9uYW1lKTogTmV3IGZ1bmN0aW9uLCBleHRyYWN0ZWQgZnJvbSBtYWluLgorCShtYWluKTogSGFuZGxlIHNlbmRpbmcgZGljdHMuCisKKwkqIHRvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5jIChwcmludF9pdGVyKTogUHJpbnQgZGljdAorCWVudHJpZXMuCisJCisyMDA1LTA2LTE2ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLmMgKG1hcnNoYWxfYmFzaWMpOiBNYXJzaGFsIE5VTEwgc3RyaW5nCisJdmFsdWVzIGFzIHRoZSBlbXB0eSBzdHJpbmcgKCMyOTQ4KS4KKwkKKzIwMDUtMDYtMTYgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGRidXMvTWFrZWZpbGUuYW06CisJKiBtb25vL2RvYy9NYWtlZmlsZS5hbToKKwkqIHRlc3QvZ2xpYi9NYWtlZmlsZS5hbToKKworCUZpeCBzcmNkaXIgIT0gYnVpbGRkaXIgaXNzdWVzIChQYXRjaCBmcm9tIENocmlzIFdpbHNvbiwgIzM0NzcpCisKKzIwMDUtMDYtMTYgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLWhlYWRlci5jIChfZGJ1c19oZWFkZXJfbG9hZCk6IFNldAorCWhlYWRlciBieXRlIG9yZGVyIGZyb20gZXhwZWN0ZWQgYnl0ZSBvcmRlciAoUGF0Y2ggZnJvbSBDaHJpcyBXaWxzb24sICMzNDc1KS4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtYnl0ZXN3YXAuYyAoYnl0ZXN3YXBfYm9keV9oZWxwZXIpOiAKKwlJbmNyZW1lbnQgcG9pbnRlciBhZnRlciBzd2FwcGluZyBmaXhlZCBhcnJheS4gIEFkZCBhc3NlcnRpb24KKwlmb3IgYXJyYXkgbGVuZ3RoLgorCQkKKzIwMDUtMDYtMTUgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgPEhBVkVfQ01TR0NSRUQ+IChfZGJ1c19yZWFkX2NyZWRlbnRpYWxzX3VuaXhfc29ja2V0KToKKwlGaXggY2FsbCB0byBkYnVzX3NldF9lcnJvci4gIChQYXRjaCBmcm9tIE1pY2hhZWwgQmFuY2ssICMzNDYxKQorCQorMjAwNS0wNi0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogTkVXUzogVXBkYXRlIHRvIDAuMzQKKworMjAwNS0wNi0xNSAgRGF2aWQgWmV1dGhlbiAgPGRhdmlkekByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW4gKExUX0NVUlJFTlQpOiBSZXZlcnQgYmFjayB0byAxIGFzIHRoZSBsaWJyYXJ5CisJaGFzbid0IGNoYW5nZWQgYW5kIHdlJ3ZlIGNlcnRhaW5seSBub3QgY29tbWl0dGVkIHRvIHByb3RvY29sCisJc3RhYmlsaXR5IHlldC4gIEFsbCB0aGlzIGRvZXMgaXMgdG8gYnJlYWsgQUJJLiBTZWUgY29tbWl0IG5vdGUKKwlmcm9tIGhwQHJlZGhhdC5jb20gMjAwNS0wNS0wNSBmb3IgZGV0YWlscy4KKwkKKzIwMDUtMDYtMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKF9kYnVzX2Nvbm5lY3Rpb25fcGVlcl9maWx0ZXIpOiBOZXcgbWV0aG9kIAorCShfZGJ1c19jb25uZWN0aW9uX3J1bl9idWlsdGluX2ZpbHRlcnMpOiBOZXcgbWV0aG9kCisJKGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCk6IFJ1biB0aGUgYnVpbHRpbiBmaWx0ZXJzIHdoaWNoIGluIHR1cm4KKwlydW5zIHRoZSBwZWVyIGZpbHRlciB3aGljaCBoYW5kbGVzIFBpbmcgbWVzc2FnZXMuCisKKwkqIGRvYy9UT0RPOiAKKwkgLSBQaW5nIGlzbid0IGhhbmRsZWQ6IFRoaXMgcGF0Y2ggZml4ZXMgaXQKKwkgCisJIC0gQWRkIGEgdGVzdCBjYXNlIGZvciB0aGUgUGluZyBtZXNzYWdlOiBhZGRlZCBUT0RPIGl0ZW0KKworMjAwNS0wNi0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzoKKwkoZGJ1c19tZXNzYWdlX2hhc19wYXRoKTogTmV3IG1ldGhvZAorCShkYnVzX21lc3NhZ2VfaGFzX2ludGVyZmFjZSk6IE5ldyBtZXRob2QKKwkoZGJ1c19tZXNzYWdlX2hhc19tZW1iZXIpOiBOZXcgbWV0aG9kCisKKwkqIGRidXMvZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfY2hlY2tfZGlyX2lzX3ByaXZhdGVfdG9fdXNlcik6CisJTmV3IG1ldGhvZAorCisJKiBkYnVzL2RidXMta2V5cmluZy5jIChfZGJ1c19rZXlyaW5nX3JlbG9hZCk6IENoZWNrIHRvIHNlZSB0aGF0IAorCXRoZSBrZXlyaW5nIGRpcmVjdG9yeSBpcyBwcml2YXRlIHRvIHRoZSB1c2VyCisKKwkqIGRvYy9UT0RPOgorCSAtIFRoZSBjb252ZW5pZW5jZSBmdW5jdGlvbnMgaW4gZGJ1cy1idXMuaCBzaG91bGQgcGVyaGFwcyBoYXZlCisJIHRoZSBzaWduYXR1cmVzIHRoYXQgdGhleSB3b3VsZCBoYXZlIGlmIHRoZXkgd2VyZSBhdXRvZ2VuZXJhdGVkCisJIHN0dWJzLiBlLmcuIHRoZSBhY3F1aXJlIHNlcnZpY2UgZnVuY3Rpb24uIFdlIHNob3VsZCBhbHNvIGV2YWx1YXRlCisJIHdoaWNoIG9mIHRoZXNlIGZ1bmN0aW9ucyB0byBpbmNsdWRlLCBpbiBsaWdodCBvZiB0aGUgZmFjdCB0aGF0CisJIEdMaWIvUXQgbmF0aXZlIHN0dWJzIHdpbGwgcHJvYmFibHkgYWxzbyBleGlzdC46IFB1bnRlZAorCisJIC0gYWRkIGRidXNfbWVzc2FnZV9oYXNfcGF0aCgpLCBtYXliZSBoYXNfbWVtYmVyL2ludGVyZmFjZToKKwkgZml4ZWQgaW4gdGhpcyBwYXRjaAorCisJIC0gaW4gZGJ1cy1rZXlyaW5nLmMsIGVuZm9yY2UgdGhhdCB0aGUga2V5cmluZyBkaXIgaXMgbm90CisJIHdvcmxkIHJlYWRhYmxlL3dyaXRhYmxlOiBGaXhlZCBpbiB0aGlzIHBhdGNoCisKKzIwMDUtMDYtMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmg6IEFkZGVkIGEgbmV3IHZhbGlkYXRpb24KKwllcnJvciBjb2RlIERCVVNfVkFMSURJVFlfVU5LTk9XTl9PT01fRVJST1IgPSAtNCBmb3IgCisJb3V0IG9mIG1lbW9yeSBlcnJvcnMgd2hlbiB2YWxpZGF0aW5nIHNpZ25pdHVyZXMKKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtaGVhZGVyLmM6IHVzZSBEQlVTX1ZBTElESVRZX1VOS05PV05fT09NX0VSUk9SCisJaW4gcGxhY2VzIHdoZXJlIHdlIHByZXZpb3VzbHkgdXNlZCBEQlVTX1ZBTElEIGFuZCBhIEZBTFNFIHJldHVybiAKKwl2YWx1ZSB0byBpbmRpY2F0ZSBPT00KKwkKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmMgKF9kYnVzX3ZhbGlkYXRlX3NpZ25hdHVyZV93aXRoX3JlYXNvbik6CisJVXNlIGEgc3RhY2sgdG8gdHJhY2sgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbnNpZGUgY29udGFpbmVycy4gIFRoZSAKKwlzdGFjayB2YWx1ZXMgYXJlIHRoZW4gdXNlZCB0byB2YWxpZGF0ZSB0aGF0IGRpY3QgZW50cmllcyBoYXZlIG9ubHkgdHdvCisJZWxlbWVudHMgd2l0aGluIHRoZW0uCisJKHZhbGlkYXRlX2JvZHlfaGVscGVyKTogY2hlY2sgdGhlIHJlYXNvbiBmb3IgZmFpbHVyZSB3aGVuIHZhbGlkYXRpbmcKKwl2YXJpZW50cworCQorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAobG9hZF9tZXNzYWdlKTogdXNlIAorCURCVVNfVkFMSURJVFlfVU5LTk9XTl9PT01fRVJST1IgaW4gcGxhY2VzIHdoZXJlIHdlIHByZXZpb3VzbHkgdXNlZCAKKwlEQlVTX1ZBTElEIGFuZCBhIEZBTFNFIHJldHVybiB2YWx1ZSB0byBpbmRpY2F0ZSBPT00KKworCSogZG9jL1RPRE86IHJlbW92ZSAiLSB2YWxpZGF0ZSBkaWN0IGVudHJ5IG51bWJlciBvZiBmaWVsZHMiIGFzIHRoaXMKKwlwYXRjaCBmaXhlcyBpdAorCisyMDA1LTA2LTE0ICBEYXZpZCBaZXV0aGVuICA8ZGF2aWR6QHJlZGhhdC5jb20+CisKKwkqIGJ1cy9idXMuYyAocHJvY2Vzc19jb25maWdfZXZlcnlfdGltZSk6IERyb3AgZXhpc3RpbmcgY29uZi1kaXIKKwl3YXRjaGVzIChpZiBhcHBsaWNhYmxlKSBhbmQgYWRkIG5ldyB3YXRjaGVzCisKKwkqIGJ1cy9tYWluLmMgKHNpZ25hbF9oYW5kbGVyKTogSGFuZGxlIFNJR0lPIGlmIHVzaW5nIERfTk9USUZZCisJKG1haW4pOiBTZXR1cCBTSUdJTyBzaWduYWwgaGFuZGxlciBpZiB1c2luZyBEX05PVElGWQorCisJKiBidXMvY29uZmlnLXBhcnNlci5oOiBBZGQgcHJvdG90eXBlIGJ1c19jb25maWdfcGFyc2VyX2dldF9jb25mX2RpcnMKKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYyAoc3RydWN0IEJ1c0NvbmZpZ1BhcnNlcik6IEFkZCBjb25mX2RpcnMgbGlzdAorCShtZXJnZV9pbmNsdWRlZCk6IEFsc28gbWVyZ2UgY29uZl9kaXJzIGxpc3QKKwkoYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYpOiBDbGVhciBjb25mX2RpcnMgbGlzdAorCShpbmNsdWRlX2Rpcik6IEFkZCBkaXJlY3RvcnkgdG8gY29uZl9kaXJzIGxpc3QKKwkoYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X2NvbmZfZGlycyk6IE5ldyBmdW5jdGlvbgorCisJKiBidXMvZGlyLXdhdGNoLltjaF06IE5ldyBmaWxlcworCisJKiBidXMvTWFrZWZpbGUuYW0gKEJVU19TT1VSQ0VTKTogQWRkIGRpci13YXRjaC5bY2hdCisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIGNoZWNrcyBmb3IgRF9OT1RJRlkgb24gTGludXgKKworMjAwNS0wNi0xNCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmM6CisJKiBnbGliL2RidXMtZ29iamVjdC5jOgorCSogZ2xpYi9kYnVzLWd2YWx1ZS5jOiBGaXggaW5kZW50YXRpb24gYW5kIGJyYWNlIHN0eWxlLgorCQorMjAwNS0wNi0xNCAgUm9zcyBCdXJ0b24gPHJvc3NAb3BlbmVkaGFuZC5jb20+LgorCisJKiBnbGliL2RidXMtZ2xpYi5oOiBNYWtlIERCdXNHTWV0aG9kSW52b2NhdGlvbgorCWEgcHJpdmF0ZSBzdHJ1Y3R1cmUuICBSZWFycmFuZ2UgcHJvdG90eXBlcyBhIGJpdC4KKwkKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19nX3Byb3h5X2ludm9rZSk6IEFkZAorCWRvY3VtZW50YXRpb24gZm9yIGZpcnN0X2FyZ190eXBlLgorCQorCSogZ2xpYi9kYnVzLWdvYmplY3QuYzogTW92ZSBEQnVzR01ldGhvZEludm9jYXRpb24KKwloZXJlLCBhZGQgZG9jdW1lbnRhdGlvbi4gIE1vdmUgZGJ1c19nX21ldGhvZF9yZXR1cm4KKwlhbmQgZGJ1c19nX21ldGhvZF9yZXR1cm5fZXJyb3IgaW50byBwdWJsaWMgQVBJCisJc2VjdGlvbi4KKworMjAwNS0wNi0xNCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoX2RidXNfZ29iamVjdF9sb29rdXBfbWFyc2hhbGxlcik6CisJQWRkIG1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudHMsIG5vdGljZWQgYnkgUm9zcyBCdXJ0b24uCisJCisyMDA1LTA2LTEzICBSb3NzIEJ1cnRvbiA8cm9zc0BvcGVuZWRoYW5kLmNvbT4uCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmM6IEhhbmRsZSBlcnJvcnMgb24gbWVzc2FnZQorCWRlbWFyc2hhbGxpbmcgYnkgc2VuZGluZyBlcnJvciBtZXNzYWdlIGJhY2suCisJKiBnbGliL2RidXMtZ3ZhbHVlLmM6IEluaXRpYWxpemUgcmV0dXJuIHZhcmlhYmxlcy4KKworMjAwNS0wNi0xMyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9NYWtlZmlsZS5hbTogRml4IHRoaW5rbyBpbiBsYXN0IHBhdGNoLgorCisyMDA1LTA2LTEzICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBnbGliL01ha2VmaWxlLmFtOiBNb3ZlIGRidXMtZ3R5cGUtc3BlY2lhbGl6ZWQuYworCWFuZCBkYnVzLWd0eXBlLXNwZWNpYWxpemVkLmggaW50byBhIF9IRUFERVJTIHZhcmlhYmxlLAorCWluc3RhbGwgdGhlbS4KKworMjAwNS0wNi0xMiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCUFzeW5jIHNpZ25hbHMgYW5kIHZhcmlvdXMgYnVnZml4ZXMgYW5kIHRlc3RpbmcgYnkKKwlSb3NzIEJ1cnRvbiA8cm9zc0BvcGVuZWRoYW5kLmNvbT4uCisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuaDogKHN0cnVjdCBEQnVzQmFzaWNHVmFsdWUpOiBEZWxldGUuCisJKGRidXNfZ3ZhbHVlX2dlbm1hcnNoYWxfbmFtZV9mcm9tX3R5cGUpCisJKGRidXNfZ3ZhbHVlX2N0eXBlX2Zyb21fdHlwZSk6IE1vdmVkIHRvIGRidXMtYmluZGluZy10b29sLWdsaWIuYy4KKwkoZGJ1c19ndHlwZV90b19kYnVzX3R5cGUpOiBSZW5hbWVkIHRvIGRidXNfZ3R5cGVfZnJvbV9zaWduYXR1cmUuCisJKGRidXNfZ192YWx1ZV90eXBlc19pbml0LCBkYnVzX2d0eXBlX2Zyb21fc2lnbmF0dXJlKQorCShkYnVzX2d0eXBlX2Zyb21fc2lnbmF0dXJlX2l0ZXIsIGRidXNfZ3R5cGVfdG9fc2lnbmF0dXJlKQorCShkYnVzX2d0eXBlc19mcm9tX2FyZ19zaWduYXR1cmUpOiBOZXcgZnVuY3Rpb24gcHJvdG90eXBlcy4KKwkoZGJ1c19ndmFsdWVfZGVtYXJzaGFsKTogVGFrZSBjb250ZXh0IGFuZCBlcnJvciBhcmd1bWVudHMuCisJKGRidXNfZ3ZhbHVlX2RlbWFyc2hhbF92YXJpYW50KTogTmV3IGZ1bmN0aW9uLgorCShkYnVzX2d2YWx1ZV9kZW1hcnNoYWxfbWVzc2FnZSk6IE5ldyBmdW5jdGlvbi4KKwkoZGJ1c19ndmFsdWVfc3RvcmUpOiBEZWxldGUuCisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuYzoKKworCUZpbGUgaGFzIGJlZW4gYWxtb3N0IGVudGlyZWx5IHJld3JpdHRlbjsgbm93IHdlIHNwZWNpYWwtY2FzZQorCW1vcmUgdHlwZXMgc3VjaCBhcyBEQlVTX1RZUEVfU0lHTkFUVVJFLCBoYW5kbGUgYXJyYXlzIGFuZAorCWhhc2ggdGFibGVzIGNvcnJlY3RseSwgZXRjLiAgRnVsbCBzdXBwb3J0IGZvciByZWN1cnNpdmUgdmFsdWVzCisJaXMgbm90IHlldCBjb21wbGV0ZS4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dfcHJveHlfY2xhc3NfaW5pdCk6IENoYW5nZSBsYXN0CisJYXJndW1lbnQgb2Ygc2lnbmFsIHRvIEdfVFlQRV9QT0lOVEVSIHNpbmNlIHdlIG5vdyBwYXNzIGEKKwlzdHJ1Y3R1cmUuCisJKGxvb2t1cF9nX21hcnNoYWxsZXIpOiBEZWxldGUgaW4gZmF2b3Igb2YKKwlfZGJ1c19nb2JqZWN0X2xvb2t1cF9tYXJzaGFsbGVyLgorCShtYXJzaGFsX2RidXNfbWVzc2FnZV90b19nX21hcnNoYWxsZXIpOiBVc2UKKwlfZGJ1c19nb2JqZWN0X2xvb2t1cF9tYXJzaGFsbGVyIGFuZCBkYnVzX2d2YWx1ZV9kZW1hcnNoYWxfbWVzc2FnZQorCXRvIGhhbmRsZSByZW1vdGUgc2lnbmFsIGNhbGxiYWNrcy4KKwkoZGJ1c19nX3Byb3h5X25ld19mcm9tX3Byb3h5KTogTmV3IGZ1bmN0aW9uOyBjcmVhdGVzIGEgbmV3CisJREJ1c0dQcm94eSBieSBjb3B5aW5nIGFuIGV4aXN0aW5nIG9uZS4KKwkoZGJ1c19nX3Byb3h5X2dldF9pbnRlcmZhY2UsIGRidXNfZ19wcm94eV9zZXRfaW50ZXJmYWNlKQorCShkYnVzX2dfcHJveHlfZ2V0X3BhdGgpOiBOZXcgZnVuY3Rpb25zLgorCShkYnVzX2dfcHJveHlfbWFyc2hhbF9hcmdzX3RvX21lc3NhZ2UpOiBOZXcgZnVuY3Rpb247CisJZmFjdG9yZWQgb3V0IG9mIGV4aXN0aW5nIGNvZGUuCisJKERCVVNfR19WQUxVRV9BUlJBWV9DT0xMRUNUX0FMTCk6IENvbGxlY3QgYWxsIGFyZ3VtZW50cworCWZyb20gYSB2YXJhcmdzIGFycmF5LgorCShkYnVzX2dfcHJveHlfYmVnaW5fY2FsbF9pbnRlcm5hbCk6IE5ldyBmdW5jdGlvbi4KKwkoZGJ1c19nX3Byb3h5X2VuZF9jYWxsX2ludGVybmFsKTogTmV3IGZ1bmN0aW9uLgorCShkYnVzX2dfcHJveHlfYmVnaW5fY2FsbCk6IFRha2UgR1R5cGVzIGluc3RlYWQgb2YgREJ1cyB0eXBlcworCWFzIGFyZ3VtZW50czsgc2ltcGx5IGludm9rZSBkYnVzX2dfcHJveHlfYmVnaW5fY2FsbF9pbnRlcm5hbAorCWFmdGVyIGNvbGxlY3RpbmcgYXJncyBpbnRvIHZhbHVlIGFycmF5LgorCShkYnVzX2dfcHJveHlfZW5kX2NhbGwpOiBUYWtlIEdUeXBlcyBpbnN0ZWFkIG9mIERCdXMgdHlwZXM7CisJaW52b2tlIGRidXNfZ19wcm94eV9lbmRfY2FsbF9pbnRlcm5hbC4KKwkoZGJ1c19nX3Byb3h5X2ludm9rZSk6IFNpbXBseSBpbnZva2UgYmVnaW5fY2FsbF9pbnRlcmFubCBhbmQKKwllbmRfY2FsbF9pbnRlcm5hbC4KKwkoZGJ1c19nX3Byb3h5X2NhbGxfbm9fcmVwbHkpOiBUYWtlIEdUeXBlcyBpbnN0ZWFkIG9mIERCdXMKKwl0eXBlcy4KKwkoYXJyYXlfZnJlZV9hbGwpOiBOZXcgZnVuY3Rpb24uCisJKGRidXNfZ19wcm94eV9hZGRfc2lnbmFsKTogVGFrZSBHVHlwZXMuCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0Lmg6CisJKF9kYnVzX2dsaWJfbWFyc2hhbF9kYnVzX21lc3NhZ2VfdG9fZ3ZhbHVlX2FycmF5KTogRGVsZXRlLgorCShfZGJ1c19nb2JqZWN0X2dldF9wYXRoLCBfZGJ1c19nb2JqZWN0X2xvb2t1cF9tYXJzaGFsbGVyKToKKwlQcm90b3R5cGUuCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmM6IEFkZCBhIGdsb2JhbCBtYXJzaGFsX3RhYmxlIGhhc2ggd2hpY2gKKwlzdG9yZXMgbWFwcGluZ3MgZnJvbSB0eXBlIHNpZ25hdHVyZXMgdG8gbWFyc2hhbGxlcnMuICBDaGFuZ2UgbG90cworCW9mIGludm9jYXRpb25zIG9mIGRidXNfZ3R5cGVfdG9fZGJ1c190eXBlIHRvCisJZGJ1c19ndHlwZV90b19zaWduYXR1cmUuCisJKF9kYnVzX2dsaWJfbWFyc2hhbF9kYnVzX21lc3NhZ2VfdG9fZ3ZhbHVlX2FycmF5KTogRGVsZXRlLgorCShpbnRyb3NwZWN0X3NpZ25hbHMpOiBGaXggdGVzdCBmb3IgcXVlcnkucmV0dXJuX3R5cGUuCisJKHNldF9vYmplY3RfcHJvcGVydHkpOiBVcGRhdGUgaW52b2NhdGlvbiBvZiBkYnVzX2d2YWx1ZV9kZW1hcnNoYWwuCisJKGludm9rZV9vYmplY3RfbWV0aG9kKTogTWFueSBjaGFuZ2VzLiAgSGFuZGxlIGFzeW5jaHJvbm91cworCWludm9jYXRpb25zLiAgQ29udmVydCBhcmd1bWVudHMgd2l0aAorCWRidXNfZ3ZhbHVlX2RlbWFyc2hhbF9tZXNzYWdlLiAgSGFuZGxlIGVycm9ycy4gIFVzZQorCURCdXNTaWduYXR1cmVJdGVyIGluc3RlYWQgb2Ygc3RybGVuIG9uIGFyZ3MuIEhhbmRsZSBhbGwgYXJndW1lbnRzCisJZ2VuZXJpY2FsbHkuICBTcGVjaWFsLWNhc2UgdmFyaWFudHMuCisJKGRidXNfZ19tZXRob2RfcmV0dXJuLCBkYnVzX2dfbWV0aG9kX3JldHVybl9lcnJvcik6IE5ldyBmdW5jdGlvbi4KKwkoREJ1c0dTaWduYWxDbG9zdXJlKTogTmV3IHN0cnVjdHVyZSwgY2xvc2VzIG92ZXIgc2lnbmFsCisJaW5mb3JtYXRpb24uCisJKGRidXNfZ19zaWduYWxfY2xvc3VyZV9uZXcpOiBOZXcgZnVuY3Rpb24uCisJKGRidXNfZ19zaWduYWxfY2xvc3VyZV9maW5hbGl6ZSk6IE5ldyBmdW5jdGlvbi4KKwkoc2lnbmFsX2VtaXR0ZXJfbWFyc2hhbGxlcik6IE5ldyBmdW5jdGlvbjsgaXMgc3BlY2lhbCBtYXJzaGFsbGVyCisJd2hpY2ggZW1pdHMgc2lnbmFscyBvbiBidXMuCisJKGV4cG9ydF9zaWduYWxzKTogTmV3IGZ1bmN0aW9uOyBpbnRyb3NwZWN0cyBvYmplY3Qgc2lnbmFscyBhbmQKKwljb25uZWN0cyB0byB0aGVtLgorCShkYnVzX2dfb2JqZWN0X3R5cGVfaW5zdGFsbF9pbmZvKTogVGFrZSBHVHlwZSBpbnN0ZWFkIG9mCisJR09iamVjdENsYXNzLgorCShkYnVzX2dfY29ubmVjdGlvbl9yZWdpc3Rlcl9nX29iamVjdCk6IEludm9rZSBleHBvcnRfc2lnbmFscy4KKwkoZGJ1c19nX2Nvbm5lY3Rpb25fbG9va3VwX2dfb2JqZWN0KTogTmV3IGZ1bmN0aW9uLgorCShEQnVzR0Z1bmNTaWduYXR1cmUpIE5ldyBzdHJ1Y3R1cmU7IHVzZWQgZm9yIG1hcHBpbmcgdHlwZQorCXNpZ25hdHVyZXMgdG8gbWFyc2hhbGxlcnMuCisJKGZ1bmNzaWdfaGFzaCk6IE5ldyBmdW5jdGlvbjsgaGFzaGVzIERCdXNHRnVuY1NpZ25hdHVyZS4KKwkoZnVuY3NpZ19lcXVhbCk6IE5ldyBmdW5jdGlvbjsgY29tcGFyZXMgREJ1c0dGdW5jU2lnbmF0dXJlLgorCShfZGJ1c19nb2JqZWN0X2xvb2t1cF9tYXJzaGFsbGVyKTogTmV3IGZ1bmN0aW9uLgorCShkYnVzX2dfb2JqZWN0X3JlZ2lzdGVyX21hcnNoYWxsZXIpOiBOZXcgZnVuY3Rpb247IHVzZWQgdG8KKwlyZWdpc3RlciBhIG1hcnNoYWxsZXIgYXQgcnVudGltZSBmb3IgYSBwYXJ0aWN1bGFyIHNpZ25hdHVyZS4KKworCSogZ2xpYi9kYnVzLWdtYWluLmMgKF9kYnVzX2dtYWluX3Rlc3QpOiBBZGQgdmFyaW91cyB0ZXN0cy4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmg6IEFkZCBEQlVTX0dMSUJfQU5OT1RBVElPTl9BU1lOQworCXdoaWNoIG5vdGVzIGEgc2VydmVyIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUKKwlhc3luY2hyb25vdXMuCisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5jCisJKGRidXNfYmluZGluZ190b29sX291dHB1dF9nbGliX3NlcnZlcik6IENhbGwKKwlkYnVzX2dfdmFsdWVfdHlwZXNfaW5pdC4KKwkod3JpdGVfZm9ybWFsX3BhcmFtZXRlcnMpOiBVc2UgZGJ1c19ndHlwZV9mcm9tX3NpZ25hdHVyZS4gIEhhbmRsZQorCXZhcmlhbnRzIHNwZWNpYWxseS4KKwkoZGJ1c19nX3R5cGVfZ2V0X2xvb2t1cF9mdW5jdGlvbik6IFR1cm4gR1R5cGUgaW50byBhbiBpbnZvY2F0aW9uCisJb2YgYSBsb29rdXAgZnVuY3Rpb24uCisJKHdyaXRlX2FyZ3NfZm9yX2RpcmVjdGlvbik6IFVzZSBkYnVzX2dfdHlwZV9nZXRfbG9va3VwX2Z1bmN0aW9uLgorCSh3cml0ZV91bnR5cGVkX291dF9hcmdzKTogTmV3IG1ldGhvZDsgd3JpdGUgb3V0cHV0IGFyZ3VtZW50cy4KKwkod3JpdGVfZm9ybWFsX2RlY2xhcmF0aW9uc19mb3JfZGlyZWN0aW9uKTogRnVuY3Rpb24gZm9yCisJd3JpdGluZyBwcm90b3R5cGVzLgorCSh3cml0ZV9mb3JtYWxfcGFyYW1ldGVyc19mb3JfZGlyZWN0aW9uKTogRnVuY3Rpb24gZm9yCisJd3JpdGluZyBpbXBsZW1lbnRhdGlvbnMuCisJKHdyaXRlX3R5cGVkX2FyZ3NfZm9yX2RpcmVjdGlvbik6IEZ1bmN0aW9uIGZvciB3cml0aW5nCisJYXJndW1lbnRzIHByZWZpeGVkIHdpdGggR1R5cGVzLgorCSh3cml0ZV9hc3luY19tZXRob2RfY2xpZW50KTogV3JpdGUgb3V0IGFzeW5jIHZlcnNpb24KKwlvZiBtZXRob2QuCisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5jOiBJbmNsdWRlIGRidXMtZ3ZhbHVlLXV0aWxzLmguCisJKGRidXNfZ190eXBlX2dldF9tYXJzaGFsX25hbWUpOiBNb3ZlIG1hcHBpbmcgZnJvbSBHVHlwZQorCXRvIG1hcnNoYWwgbmFtZSBpbnRvIGhlcmUuCisJKGRidXNfZ190eXBlX2dldF9jX25hbWUpOiBNb3ZlIGludG8gaGVyZS4KKwkoY29tcHV0ZV9tYXJzaGFsbGVyKTogQ29udmVydCBzaWduYXR1cmUgdG8gdHlwZSB3aXRoCisJZGJ1c19ndHlwZV9mcm9tX3NpZ25hdHVyZSwgdXNlIGRidXNfZ190eXBlX2dldF9tYXJzaGFsX25hbWUuCisJKGNvbXB1dGVfbWFyc2hhbGxlcl9uYW1lKTogRGl0dG8uCisJKGNvbXB1dGVfbWFyc2hhbGxlcik6IEhhbmRsZSBhc3luYyBzaWduYWwgYW5ub3RhdGlvbnMuCisJKGdhdGhlcl9tYXJzaGFsbGVycyk6IFJldHVybiBpZiB3ZSBkb24ndCBoYXZlIGEga25vd24KKwlwcmVmaXguCisJKGdlbmVyYXRlX2dsdWUpOiBDb2xsZWN0IGludHJvc3BlY3Rpb24gYmxvYiBoZXJlLCBhbmQKKwl3cml0ZSBhbGwgb2YgdGhlIGJsb2IgYXQgdGhlIGVuZC4gIFRoaXMgYWxsb3dzIGFuIG9iamVjdAorCXdpdGggbXVsdGlwbGUgaW50ZXJmYWNlcyB0byB3b3JrLgorCU1hcmsgYXN5bmMgbWV0aG9kcyBpbiBpbnRyb3NwZWN0aW9uIGJsb2IuCisKKwkqIGdsaWIvTWFrZWZpbGUuYW0gKGxpYmRidXNfZ2xpYl8xX2xhX1NPVVJDRVMpOiBBZGQKKwlkYnVzLWd0eXBlLXNwZWNpYWxpemVkLmMsIGRidXMtZ3R5cGUtc3BlY2lhbGl6ZWQuaCwKKwlkYnVzLWd2YWx1ZS11dGlscy5oLCBkYnVzLWd2YWx1ZS11dGlscy5jLgorCisJKiBkYnVzL2RidXMtZ2xpYi5oOiBEb24ndCBpbmNsdWRlIGRidXMtcHJvdG9jb2wuaDsgdGhpcworCWF2b2lkcyBwZW9wbGUgYWNjaWRlbnRhbGx5IHVzaW5nIERCVVNfVFlQRV8qIHdoaWNoIHNob3VsZAorCW5vdCBiZSBuZWNlc3NhcnkgYW55bW9yZS4KKwlEbyBpbmNsdWRlIGRidXMtZ3R5cGUtc3BlY2lhbGl6ZWQuaCwgd2hpY2ggYXJlIHV0aWxpdGllcworCWZvciBHTGliIGNvbnRhaW5lciB0eXBlcy4KKwlBZGQgdmFyaW91cyAjZGVmaW5lcyBmb3IgdHlwZXMgc3VjaCBhcworCURCVVNfVFlQRV9HX0JPT0xFQU5fQVJSQVkuCisJKERCdXNHVmFsdWVJdGVyYXRvciwgREJ1c0dWYWx1ZSk6IERlZmluZSwgbm90IGZ1bGx5IHVzZWQKKwl5ZXQuCisJKGRidXNfZ192YWx1ZV9nZXRfZ190eXBlKTogVHlwZSBmb3IgcmVjdXJzaXZlIHZhbHVlLgorCShkYnVzX2dfdmFsdWVfb3BlbiwgZGJ1c19nX3ZhbHVlX2l0ZXJhdG9yX2dldF92YWx1ZSkKKwkoZGJ1c19nX3ZhbHVlX2l0ZXJhdG9yX2dldF92YWx1ZXMsIGRidXNfZ192YWx1ZV9pdGVyYXRvcl9yZWN1cnNlKQorCShkYnVzX2dfdmFsdWVfZnJlZSk6IFByb3RvdHlwZXMuCisJKGRidXNfZ19vYmplY3RfcmVnaXN0ZXJfbWFyc2hhbGxlciwgZGJ1c19nX3Byb3h5X25ld19mcm9tX3Byb3h5KTogUHJvdG90eXBlLgorCShkYnVzX2dfcHJveHlfc2V0X2ludGVyZmFjZSk6IFByb3RvdHlwZS4KKwkoZGJ1c19nX3Byb3h5X2JlZ2luX2NhbGwsIGRidXNfZ19wcm94eV9lbmRfY2FsbCkKKwkoZGJ1c19nX3Byb3h5X2NhbGxfbm9fcmVwbHkpOiBUYWtlIEdMaWIgdHlwZXMgaW5zdGVhZCBvZiBEQnVzCisJdHlwZXMuCisJKGRidXNfZ19wcm94eV9nZXRfcGF0aCwgZGJ1c19nX3Byb3h5X2dldF9pbnRlcmZhY2UpOgorCUFjY2Vzc29ycy4KKwkoREJ1c0dBc3luY0RhdGEsIERCdXNHTWV0aG9kSW52b2NhdGlvbik6IFN0cnVjdHVyZXMgZm9yCisJZG9pbmcgYXN5bmMgaW52b2NhdGlvbnMuCisJKGRidXNfZ19tZXRob2RfcmV0dXJuLCBkYnVzX2dfbWV0aG9kX3JldHVybl9lcnJvcik6CisJUHJvdG90eXBlcy4KKwkqIGRvYy9kYnVzLXR1dG9yaWFsLnhtbDogVXBkYXRlIEdMaWIgc2VjdGlvbi4KKwkKKwkqIHRvb2xzL2RidXMtdmlld2VyLmMgKGxvYWRfY2hpbGRfbm9kZXMpOiBVcGRhdGUKKwlmb3IgbmV3IGludm9jYXRpb24gdHlwZSBvZiBkYnVzX2dfcHJveHlfZW5kX2NhbGwuCisJKGxvYWRfZnJvbV9zZXJ2aWNlX3RocmVhZF9mdW5jKTogRGl0dG8uCisKKwkqIHRvb2xzL3ByaW50LWludHJvc3BlY3QuYyAobWFpbik6IERpdHRvLgorCisJKiB0b29scy9kYnVzLW5hbWVzLW1vZGVsLmMgKGhhdmVfbmFtZXNfbm90aWZ5KQorCShuYW1lc19tb2RlbF9yZWxvYWQsIG5hbWVzX21vZGVsX3NldF9jb25uZWN0aW9uKQorCVVzZSBHVHlwZXMuCisKKwkqIHB5dGhvbi9NYWtlZmlsZS5hbSAoSU5DTFVERVMpOiBEZWZpbmUgREJVU19DT01QSUxBVElPTiwKKwluZWVkZWQgc2luY2UgUHl0aG9uIGJpbmRpbmdzIHVzZSBHTGliIGJpbmRpbmdzLgorCisJKiB0ZXN0L2dsaWIvTWFrZWZpbGUuYW0gKElOQ0xVREVTKTogRGVmaW5lIERCVVNfQ09NUElMQVRJT04uCisJQWRkIC0tcHJlZml4IGFyZ3VtZW50LgorCisJKiB0b29scy9NYWtlZmlsZS5hbTogRGVmaW5lIERCVVNfQ09NUElMQVRJT04uICBSZW1vdmUKKwl1bm5lZWRlZCAtLWlnbm9yZS11bnN1cHBvcnRlZCBhcmcuCisJCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYzogCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIueG1sOgorCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmM6IEFkZCBtYW55IG1vcmUgdGVzdHMuCisKKzIwMDUtMDYtMDYgIERhdmlkIFpldXRoZW4gIDxkYXZpZHpAcmVkaGF0LmNvbT4KKworCSogZG9jL1RPRE86IEFkZCBpdGVtIGFib3V0IG5lZWQgdG8gcmVtb3ZlIGRlcHJlY2F0ZWQgZnVuY3Rpb25zLgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5oOiBBZGQgcHJvdG90eXBlIGZvciBkYnVzX2Nvbm5lY3Rpb25fZGlzY29ubmVjdAorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZGlzY29ubmVjdCk6IE5ldyBmdW5jdGlvbgorCXRvIHJlcGFpciB0aGUgQUJJIHdoaWNoIHdhcyBicm9rZW4gd2l0aCB0aGUgbGFzdCBjb21taXQuCisKKzIwMDUtMDYtMDIgIEpvaG4gKEo1KSBQYWxtaWVyaSA8am9obnBAcmVkaGF0LmNvbT4KKworCSogIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMsIGRidXMvZGJ1cy1jb25uZWN0aW9uLmggCisJKGRidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0KTogcmVuYW1lZCB0byBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgCisJZm9yIEFQSSBzeW1tZXRyeSB3aXRoIGRidXNfY29ubmVjdGlvbl9vcGVuCisJKF9kYnVzX2Nvbm5lY3Rpb25fb3Blbl9pbnRlcm5hbCk6IAorCXMvZGJ1c19jb25uZWN0aW9uX2Rpc2Nvbm5lY3QvZGJ1c19jb25uZWN0aW9uX2Nsb3NlCisKKwkqIGRidXMvZGJ1cy1idXMuYyAoZGJ1c19idXNfZ2V0KToKKwlzL2RidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0L2RidXNfY29ubmVjdGlvbl9jbG9zZQorCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfY29ubmVjdGlvbnNfdW5yZWYsIAorCWJ1c19jb25uZWN0aW9uc19zZXR1cF9jb25uZWN0aW9uLCBidXNfY29ubmVjdGlvbnNfZXhwaXJlX2luY29tcGxldGUpOgorCXMvZGJ1c19jb25uZWN0aW9uX2Rpc2Nvbm5lY3QvZGJ1c19jb25uZWN0aW9uX2Nsb3NlCisKKwkqIGJ1cy9kaXNwYXRjaC5jIChidXNfZGlzcGF0Y2gsIGtpbGxfY2xpZW50X2Nvbm5lY3Rpb24sIAorCWtpbGxfY2xpZW50X2Nvbm5lY3Rpb25fdW5jaGVja2VkLCBjaGVja19oZWxsb19jb25uZWN0aW9uKToKKwlzL2RidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0L2RidXNfY29ubmVjdGlvbl9jbG9zZQorCisJKiBidXMvYnVzLmMgKG5ld19jb25uZWN0aW9uX2NhbGxiYWNrKToKKwlzL2RidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0L2RidXNfY29ubmVjdGlvbl9jbG9zZQorCisJKiB0b29scy9kYnVzLXNlbmQuYyAobWFpbik6CisJcy9kYnVzX2Nvbm5lY3Rpb25fZGlzY29ubmVjdC9kYnVzX2Nvbm5lY3Rpb25fY2xvc2UKKworCSogdGVzdC9nbGliL3Rlc3QtcHJvZmlsZS5jIChub19idXNfdGhyZWFkX2Z1bmMsIHdpdGhfYnVzX3RocmVhZF9mdW5jKToKKwlzL2RidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0L2RidXNfY29ubmVjdGlvbl9jbG9zZQorCQorCSogdGVzdC90ZXN0LXNlcnZpY2UuYyAocGF0aF9tZXNzYWdlX2Z1bmMsIGZpbHRlcl9mdW5jKToKKwlzL2RidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0L2RidXNfY29ubmVjdGlvbl9jbG9zZQorCQorCSogZG9jL1RPRE86IHJlbW92ZSBjb25uZWN0aW9uX29wZW4vY29ubmVjdGlvbl9kaXNjb25uZWN0IGxhY2tzIHN5bW1ldHJ5IAlpdGVtIHRoYXQgd2FzIGp1c3QgZml4ZWQKKwkKKzIwMDUtMDUtMjUgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOiBNb3ZlIHZhcmlvdXMgYnVzIHNlcnZpY2UgI2RlZmluZXMgc3VjaAorCSAgYXMgREJVU19TRVJWSUNFX0RCVVMgYW5kIERCVVNfTkFNRV9GTEFHX1BST0hJQklUX1JFUExBQ0VNRU5UIHRvCisJICBkYnVzL2RidXMtc2hhcmVkLmguCisJKiBkYnVzL2RidXMtc2hhcmVkLmg6IFZhcmlvdXMgZGVmaW5lcyBtb3ZlZCBoZXJlLgorCSogZGJ1cy9kYnVzLW1hcnNoYWwtaGVhZGVyLmM6IEluY2x1ZGUgZGJ1cy1zaGFyZWQuaC4KKworMjAwNS0wNS0yNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL19faW5pdF9fLnB5OiBQeXRob24gYmluZGluZ3MgZGVzZXJ2ZSBhIG1pbm9yIHZlcnNpb24KKwl1cGRhdGUuICBVcHBlZCB0byAoMCwgNDAsIDIpCisKKzIwMDUtMDUtMjQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9kZWNvcmF0b3JzLnB5OiBhZGQgZXhwbGljaXRseV9wYXNzX21lc3NhZ2UgZGVjb3JhdG9yCisJZm9yIHBhc3NpbmcgaW4gdGhlIGRidXMgbWVzc2FnZSBhcyBrZXl3b3JkIGZvciBlZGdlIGNhc2Ugc2lnbmFsCisJaGFuZGxpbmcKKworCSogcHl0aG9uL21hdGNocnVsZXMucHkgKFNpZ25hbE1hdGNoUnVsZS5fX3JlcHJfXyk6IGZpeCBvdXRwdXQKKwl0byBjb25mb3JtIHdpdGggd2hhdCBkYnVzIGV4cGVjdHMgZm9yIG1hdGNoIHJ1bGVzCisJKFNpZ25hbE1hdGNoUnVsZS5leGVjdXRlKTogYWRkIHRoZSBkYnVzIG1lc3NhZ2UgYXMgYSBrZXl3b3JkCisJaWYgdGhlIHNpZ25hbCBoYW5kbGVyIGhhcyByZXF1ZXN0ZWQgaXQKKworCSogcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUvc2lnbmFsLXJlY2lwaWVudC5weTogYWRkZWQgc29tZSBtb3JlCisJZXhhbXBsZXMgb24gaG93IHRvIGhvb2sgdXAgdG8gc2lnbmFscworCisyMDA1LTA1LTIzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vZGVjb3JhdG9ycy5weTogaW1wb3J0IGRidXNfYmluZGluZ3MKKworCSogcHl0aG9uL21hdGNocnVsZXMucHkgKFNpZ25hbE1hdGNoUnVsZSwgU2lnbmFsTWF0Y2hUcmVlLCAKKwlTaWduYWxNYXRjaE5vZGUpOiBuZXcgY2xhc3NlcyB0aGF0IGltcGxlbWVudCB3aWxkY2FyZCBzaWduYWwKKwljYWxsYmFjayBtYXRjaGluZyB1c2luZyBhIHRyZWUgbG9va3VwLiBIZWF2aWx5IG1vZGlmaWVkIGZyb20gYQorCXBhdGNoIHNlbnQgYnkgQ2Vsc28gUGludG8gKGZkLm8gYnVnICMzMjQxKQorCisJKiBfZGJ1cy5weSAoYWRkX3NpZ25hbF9yZWNlaXZlciwgcmVtb3ZlX3NpZ25hbF9yZWNlaXZlciwgX3NpZ25hbF9mdW5jKToKKwl1c2UgbmV3IG1hdGNoIGNsYXNzZXMgdG8gaGFuZGxlIHNpZ25hbHMuCisKKzIwMDUtMDUtMTkgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisJCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXguaW46IHMvVFlQRV9QQVRIL1RZUEVfT0JKRUNUX1BBVEgKKworMjAwNS0wNS0xOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogdXNlIEdMSUJfR05VX0dFVFRFWFQgdG8gZ2V0IElOVExMSUJTIGFuZCByZXF1aXJlCisJZ2V0dGV4dC4gTm90IHJlYWxseSB3b3J0aCByZXF1aXJpbmcgeWV0IHBlcmhhcHMsIGJ1dCBhbnkKKwlwcm9kdWN0aW9uIHF1YWxpdHkgMS4wIHdvdWxkIHJlcXVpcmUgaXQgc28gd2Ugc2hvdWxkIGdvIGFoZWFkIGFuZAorCWdldCB0aGluZ3Mgc2V0IHVwLiBXZSBkbyBoYXZlIGEgY291cGxlIHRva2VuIGNhbGxzIHRvCisJYmluZHRleHRkb21haW4gaW4gdGhlIGNvZGUgYWxyZWFkeS4KKworMjAwNS0wNS0xNiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWdtYWluLmMgKGlvX2hhbmRsZXJfZGlzcGF0Y2gpOiBmaXggZGVhZGxvY2sKKwl3aGVuIHVzaW5nIHJlY3Vyc2l2ZSBnX21haW5fbG9vcHMKKworCSogcHl0aG9uL19kYnVzLnB5IChjbGFzcyBCdXMpOiBhZGQgdGhlIFByb3h5T2JqZWN0Q2xhc3MKKwlhbGlhcyBmb3IgUHJveHlPYmplY3QgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIHRoZSBUd2lzdGVkIAorCW5ldHdvcmtpbmcgZnJhbWV3b3JrIHRvIGludGVncmF0ZSBkYnVzLgorCisJKiBweXRob24vcHJveGllcy5weSAoY2xhc3MgUHJveHlPYmplY3QpOiBhZGQgdGhlIFByb3h5TWV0aG9kQ2xhc3MKKwlhbGlhcyBmb3IgUHJveHlNZXRob2QgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIHRoZSBUd2lzdGVkIAorCW5ldHdvcmtpbmcgZnJhbWV3b3JrIHRvIGludGVncmF0ZSBkYnVzLiAKKworMjAwNS0wNS0xMSAgUm9zcyBCdXJ0b24gIDxyb3NzQG9wZW5lZGhhbmQuY29tPgorCisJKiBnbGliL2RidXMtZ2xpYi10b29sLmM6IEFkZCAtLXByZWZpeCBhcmd1bWVudC4KKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5oOiBBZGQgcHJlZml4IGFyZ3VtZW50LgorCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmMgKGNvbXB1dGVfbWFyc2hhbGxlcl9uYW1lKToKKwlBZGQgcHJlZml4IGFyZ3VtZW50LgorCShnZW5lcmF0ZV9nbHVlKTogUGFzcyBwcmVmaXggYXJndW1lbnQgZG93bi4KKwkoZGJ1c19iaW5kaW5nX3Rvb2xfb3V0cHV0X2dsaWJfc2VydmVyKTogUGFzcyBwcmVmaXggdG8KKwlnbGliLWdlbm1hcnNoYWwuCisJCisyMDA1LTA1LTExICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiB0b29scy9kYnVzLXNlbmQuYyAoYXBwZW5kX2FycmF5KTogTmV3IGZ1bmN0aW9uLgorCShhcHBlbmRfYXJnKTogQnJva2VuIG91dCBmcm9tIG1haW4uCisJKG1haW4pOiBBZGQgY2hlZXN5IGhhY2sgdG8gc2VuZCBhcnJheXMgYW5kIHZhcmlhbnRzLgorCSh1c2FnZSk6IFVwZGF0ZS4KKwkqIHRvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5jIChwcmludF9pdGVyKTogQnJva2VuIG91dAorCWZyb20gbWFpbi4KKworMjAwNS0wNS0xMSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZGJ1cy9kYnVzLXNpZ25hdHVyZS5jIChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9zaWduYXR1cmUpOgorCU5ldyBmdW5jdGlvbiwgcmV0dXJucyBzaWduYXR1cmUgc3RyaW5nIGZvciBzaWduYXR1cmUgaXRlci4KKwkqIGRidXMvZGJ1cy1zaWduYXR1cmUuaDogUHJvdG90eXBlIGl0LgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X3NpZ25hdHVyZSk6CisJTmV3IGZ1bmN0aW9uLCByZXR1cm5zIHNpZ25hdHVyZSBzdHJpbmcgZm9yIG1lc3NhZ2UgaXRlci4KKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FycmF5X2xlbik6IE5ldyBmdW5jdGlvbiwgcmV0dXJucworCWxlbmd0aCBvZiBhcnJheS4KKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2ZpeGVkX2FycmF5KTogRml4IGFzc2VydGlvbjsgdGhpcworCWZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIHdoZW4gdGhlIGl0ZXIgaXMgcG9pbnRpbmcgdG8gdGhlCisJY29udGVudHMgb2YgYW4gYXJyYXkKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6IFByb3RvdHlwZXMuCisJKiBkYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUuYyAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2FycmF5X2xlbmd0aCk6CisJTmV3IGZ1bmN0aW9uOyByZXR1cm5zIGxlbmd0aCBvZiBhbiBhcnJheS4KKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oOiBQcm90b3R5cGUgaXQuCisJCisyMDA1LTA1LTExICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11dGlsLmMgPCFIQVZFX1BPU0lYX0dFVFBXTkFNX1I+OiBGaXgKKwljb21waWxhdGlvbiBlcnJvci4KKwkKKzIwMDUtMDUtMDggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11dGlsLmMgKF9kYnVzX2JlY29tZV9kYWVtb24pOiB3cml0ZSB0aGUKKwlkYWVtb24ncyBwaWQsIG5vdCB0aGUgcGFyZW50J3MgcGlkLCB0byB0aGUgZmlsZSBkZXNjcmlwdG9yLgorCVJlcG9ydGVkIGJ5IFRhaiBNb3J0b24uCisKKzIwMDUtMDUtMDUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW4gKExUXyopOiBhZGQgbm90ZXMgb24gaG93IHRoZSBsaWJ0b29sIHZlcnNpb25pbmcKKwl3b3JrcyB0byBzYXZlIHRoaW5raW5nLiBJbmNyZW1lbnQgc29uYW1lIHRvIGluZGljYXRlIHByb3RvY29sCisJYnJlYWthZ2UgKHRob3VnaCByZWFsbHkgdGhlIGxpYnJhcnkgaW50ZXJmYWNlIGhhc24ndCBjaGFuZ2VkIEkKKwlndWVzcykKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jIChfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2F1dGhlbnRpY2F0ZWQpOgorCXZlcmlmeSB0aGUgR1VJRCByZWNlaXZlZCBmcm9tIHNlcnZlciBtYXRjaGVzIHdoYXQgd2Ugd2VyZQorCWV4cGVjdGluZywgaWYgd2UgaGFkIGFuIGV4cGVjdGF0aW9uCisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKHNlbmRfb2spOiBzZW5kIEdVSUQgYWxvbmcgd2l0aCB0aGUgT0sgY29tbWFuZAorCShfZGJ1c19hdXRoX2dldF9ndWlkX2Zyb21fc2VydmVyKTogbmV3IGZ1bmN0aW9uCisJKHNlbmRfYmVnaW4pOiBwYXJzZSB0aGUgT0sgYXJncworCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogYWRkIEdVSUQgdG8gdGhlIGF1dGggcHJvdG9jb2wKKworMjAwNS0wNS0wNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogRml4IG15IG5hbWUgaW4gcHJldmlvdXMgY2hhbmdlbG9nIDspCisKKwkqIHB5dGhvbi9wcm94aWVzLnB5IChQcm94eU9iamVjdC5fX2dldGF0dHJfXyk6IGFkZCBmdXJ0aGVyIHBhdGNoCisJZnJvbSBBbnRob255IEJheHRlciB0byB0aHJvdyBhbiBBdHRyaWJ1dGVFcnJvciB3aGVuIHB5dGhvbiAKKwlfX3NwZWNpYWxfXyBmdW5jdGlvbnMgYXJlIGNhbGxlZCBpbnN0ZWFkIG9mIG1hcnNobGluZyB0aGVtIG92ZXIgCisJdGhlIGJ1cyAoQnVnIzE2ODUgY29tbWVudCAzKS4KKworMjAwNS0wNS0wNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL01ha2VmaWxlLmFtOiBjaGFuZ2VkIHRvIHVzZSBweWV4ZWNkaXIgZm9yIHRoZSBiaW5kaW5nCisJc2hhcmVkIGxpYnJhcmllcyAoQnVnIzI0OTQpCisKKwkqIHB5dGhvbi9leGNlcHRpb25zLnB5OiBicmluZyBleGNlcHRpb25zIG92ZXIgZnJvbSB0aGUgYmluZGluZ3MKKwlzbyB0aGV5IGNhbiBiZSB1c2VkIGluIGFwcGxpY2F0aW9ucyAoQnVnIzIwMzYpCisJTWFrZSBhbGwgZXhjZXB0aW9ucyBkZXJpdmUgZnJvbSBEQnVzRXhjZXB0aW9uCisKKwkqIHB5dGhvbi9fZGJ1cy5weSwgcHl0aG9uL3Byb3hpZXMucHk6IGltcGxlbWVudCBfX3JlcHJfXyBpbiBhIGNvdXBsZQorCW9mIGNsYXNzZXMgc28gdGhhdCBwcmludCBvYmogZG9lc24ndCB0aHJvdyBhbiBleGNlcHRpb24gKEJ1ZyAjMTY4NSkKKworMjAwNS0wNS0wMyAgUm9zcyBCdXJ0b24gIDxyb3NzQG9wZW5lZGhhbmQuY29tPgorCisJKiBnbGliL2RidXMtZ29iamVjdC5jIChkYnVzX2dfY29ubmVjdGlvbl9yZWdpc3Rlcl9nX29iamVjdCk6CisJUmV0dXJuIGlmIHdlIGdldCBhbiBlcnJvciBkdXJpbmcgcmVnaXN0cmF0aW9uLiAgU2V0IHVwIGEKKwl3ZWFrIHJlZmVyZW5jZSBvbiBvYmplY3QgdG8gdW5yZWdpc3RlciBpZiBvYmplY3QgaXMgZGVzdHJveWVkLgorCSh1bnJlZ2lzdGVyX2dvYmplY3QpOiBOZXcgZnVuY3Rpb24uCisJCisyMDA1LTA1LTAxICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXguaW46IAorCS0gYWRkZWQgbmV3IHR5cGUgY2xhc3NlcyBmb3IgaGludGluZyB0byB0aGUgbWFyYXNoYWxlciB3aGF0IHR5cGUgCisJdG8gc2VuZCBvdmVyIHRoZSB3aXJlCisJLSBhZGRlZCBpbnQxNiBhbmQgdWludDE2IG1hcnNoYWxlcnMKKwktIEZpeGVkIGEgYnVnIGluIHRoZSB0eXBlIGNvbnN0YW50cyB0aGF0IGNhdXNlZCBpbnQzMiB0byBnbyBvdXQKKwlhcyB1aW50MTYgb3ZlciB0aGUgd2lyZQorCSogcHl0aG9uL2RidXMucHk6IHNwbGl0IHVwIGludG8gZGlmZmVyZW50IGZpbGVzIGFuZCByZW5hbWVkIF9kYnVzLnB5CisJKiBweXRob24vX19pbml0X18ucHksIHB5dGhvbi9fdXRpbC5weSwgcHl0aG9uL2RlY29yYXRvcnMucHksIAorCXB5dGhvbi9leGNlcHRpb25zLnB5LCBweXRob24vcHJveGllcy5weSwgcHl0aG9uL3NlcnZpY2VzLnB5LAorCXB5dGhvbi90eXBlcy5weTogbmV3IGZpbGVzIHNwbGl0IG9mZiBmcm9tIGRidXMucHkKKwkqIHB5dGhvbi9NYWtlZmlsZS5hbTogQWRkIG5ldyBmaWxlcywgcmVtb3ZlIGRidXMucHkgYW5kIAorCWluc3RhbGwgYWxsIHB5dGhvbiBmaWxlcyB0byA8cHl0aG9uIG1vZHVsZSBkaXI+L2RidXMKKwkqIHB5dGhvbi9leGFtcGxlcy8qOiBBZGRlZCAjIS91c3IvYmluL2VudiBweXRob24gdG8gdGhlIHRvcCBvZgorCWV2ZXJ5IGV4YW1wbGUuICBQYXRjaCBwcm92aWRlZCBieSBUYXRhdmFydHkgS2FseWFuCisKKzIwMDUtMDQtMjUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIE5FV1M6IFVwZGF0ZSB0byAwLjMzCisKKzIwMDUtMDQtMjUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbiAoc2VuZF93aXRoX3JlcGx5X2hhbmRsZXJzKTogTmV3IHNlbmQKKwltZXRob2QgZm9yIGRvaW5nIGFzeW5jIGNhbGxzCisJKF9wZW5kaW5nX2NhbGxfbm90aWZpY2F0aW9uKTogTmV3IEMgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIHBlbmRuaW5nIGNhbGwKKwljYWxsYmFja3MKKwkoc2V0X25vdGlmeSk6IE5ldyBtZXRob2QgZm9yIHNldHRpbmcgcGVuZGluZyBjYWxsIG5vdGlmaWNhdGlvbgorCQorCSogcHl0aG9uL2RidXMucHk6IG5ldyB2ZXJzaW9uIHR1cGxlICJ2ZXJzaW9uIiBpcyBzZXQgYXQgKDAsIDQwLCAwKQorCUFzeW5jIGNhcGFiaWxpdGllcyBhZGRlZCB0byByZW1vdGUgbWV0aG9kIGNhbGxzCisJKFNlbmRlcik6IGNsYXNzIHJlbW92ZWQKKwkoUmVtb3RlU2VydmljZSk6IGNsYXNzIHJlbW92ZWQKKwkoT2JqZWN0VHJlZSk6IGNsYXNzIHJlbW92ZWQgZm9yIG5vdworCShSZW1vdGVPYmplY3QpOiBSZW5hbWVkIHRvIFByb3h5T2JqZWN0CisJKFJlbW90ZU1ldGhvZCk6IFJlbmFtZWQgdG8gUHJveHlNZXRob2QKKwkobWV0aG9kKTogRGVjb3JhdG9yIGFkZGVkIGZvciBkZWNvcmF0aW5nIHB5dGhvbiBtZXRob2RzIGFzIGRidXMgbWV0aG9kcworCShzaWduYWwpOiBEZWNvcmF0b3IgYWRkZWQgZm9yIGRlY29yYXRpbmcgcHl0aG9uIG1ldGhvZHMgYXMgc2lnbmFsIGVtaXR0ZXJzCisJKE9iamVjdFR5cGUpOiBNZXRhY2xhc3MgYWRkZWQgZm9yIGdlbmVyYXRpbmcgaW50cm9zcGVjdGlvbiBkYXRhIGFuZCB0aGUKKwltZXRob2QgY2FsbGJhY2sgdnRhYmxlCisJKEludGVyZmFjZSk6IFdyYXBwZXIgY2xhc3MgYWRkZWQgdG8gd3JhcCBvYmplY3RzIGluIGEgZGJ1cyBpbnRlcmZhY2UKKwkoT2JqZWN0KTogVXNlcyBPYmplY3RUeXBlIGFzIGl0cyBtZXRhY2xhc3MgYW5kIGV4cG9ydHMgSW50cm9zcGVjdAorCW9mIHRoZSBvcmcuZnJlZWRlc2t0b3AuREJ1cy5JbnRyb3NwZWN0YWJsZSBpbnRlcmZhY2UKKwkoVmFsaWRhdGlvbkV4Y2VwdGlvbiwgVW5rbm93bk1ldGhvZEV4Y2VwdGlvbik6IG5ldyBleGNlcHRpb25zCisKKwkqIHB5dGhvbi9leGFtcGxlcy8qOiBNb2RpZmllZCB0byBmaXQgd2l0aCB0aGUgbmV3IGJpbmRpbmdzCisKKzIwMDUtMDQtMjMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MpOiBmaXggZG9jIGNvbW1lbnQsCisJcmVwb3J0ZWQgYnkgVG9ueSBIb3VnaHRvbgorCisJKiB0ZXN0L3Rlc3Qtc2VydmljZS5jIChtYWluKTogdGVzdAorCWRidXNfY29ubmVjdGlvbl9nZXRfb2JqZWN0X3BhdGhfZGF0YSgpCisKKwkqIGRidXMvZGJ1cy1vYmplY3QtdHJlZS5jIChmaW5kX2hhbmRsZXIpOiBiZSBzdXJlIHdlIGFsd2F5cyBpbml0CisJdGhlIGV4YWN0X21hdGNoCisJKF9kYnVzX29iamVjdF90cmVlX2dldF91c2VyX2RhdGFfdW5sb2NrZWQpOiBuZXcgZnVuY3Rpb24gdXNlZCBieQorCWRidXNfY29ubmVjdGlvbl9nZXRfb2JqZWN0X3BhdGhfZGF0YSgpCisJKGRvX3JlZ2lzdGVyKTogYWRkIGFzc2VydGlvbiB0ZXN0IGZvciBnZXRfdXNlcl9kYXRhX3VubG9ja2VkCisJKG9iamVjdF90cmVlX3Rlc3RfaXRlcmF0aW9uKTogbW9yZSB0ZXN0cworCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X29iamVjdF9wYXRoX2RhdGEpOgorCW5ldyBmdW5jdGlvbiBmcm9tIERhbiBSZWVkIHRvIGxldCB5b3UgZ2V0IHRoZSB1c2VyIGRhdGEgZnJvbSAKKwlkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfb2JqZWN0X3BhdGgoKQorCisyMDA1LTA0LTIzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUtdXRpbC5jOiBGaXhlZCBidWZmZXIgb3ZlcmZsb3cKKwlpbiBudW1lcm91cyBwbGFjZXMgdGhhdCBkaWQgbm90IGFjY291bnQgZm9yIHRoZSBOVUxMIHRlcm1pbmF0b3IKKwkoc2lnbmF0dXJlX2Zyb21fc2VlZCk6IGNoYW5nZWQgdGhlIG1hbnVhbCBzdHJpbmcgY29weSBsb29wIHRvIAorCWp1c3QgdXNlIHN0cmNweSBpbnN0ZWFkCisJbWFrZSBjaGVjayBzaG91bGQgbm93IHBhc3MKKworMjAwNS0wNC0xOSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtaGVhZGVyLmMgKF9kYnVzX2hlYWRlcl9jcmVhdGUpOiBGaXggYXNzZXJ0CisJc28gdGhhdCBpdCBhbGxvd3MgbWVzc2FnZXMgdGhhdCBhcmUgbm90IHNpZ25hbHMgdG8gcGFzcyBpbiAKKwlOVUxMIGFzIHRoZSBpbnRlcmZhY2UuCisKKzIwMDUtMDQtMTggIERhdmlkIFpldXRoZW4gIDxkYXZpZHpAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWdtYWluLmMgKGlvX2hhbmRsZXJfZGVzdHJveV9zb3VyY2UpOiAKKwkodGltZW91dF9oYW5kbGVyX2Rlc3Ryb3lfc291cmNlLCBjb25uZWN0aW9uX3NldHVwX2ZyZWUpOiAKKwlBbHNvIHVucmVmIHRoZSBzb3VyY2UgdG8gYXZvaWQgbWVtb3J5IGxlYWtzLgorCisyMDA1LTA0LTEzICBEYXZpZCBaZXV0aGVuICA8ZGF2aWR6QHJlZGhhdC5jb20+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKGJ1c19jb25maWdfcGFyc2VyX25ldyk6IEJ1bXAgdGhpcyB0byBhCisJbW9yZSByZWFzb25hYmxlLCB5ZXQgc3RpbGwgdG90YWxseSBhcmJpdHJhcnksIHZhbHVlIDotKS4gCisKKzIwMDUtMDQtMTMgIERhdmlkIFpldXRoZW4gIDxkYXZpZHpAcmVkaGF0LmNvbT4KKworCSogZG9jL1RPRE86IEFkZGVkIGFuICJpbXBvcnRhbnQgZm9yIDEuMCIgaXRlbSBhYm91dCBzZWxpbnV4CisJYWxsb3cvZGVueSBtZXNzYWdlcworCisyMDA1LTA0LTEzICBEYXZpZCBaZXV0aGVuICA8ZGF2aWR6QHJlZGhhdC5jb20+CisKKwkqIGJ1cy9zZWxpbnV4LmM6IEFkZCBjLWZpbGUtc3R5bGUgdG8gdG9wIG9mIGZpbGUKKwkobG9nX2F1ZGl0X2NhbGxiYWNrKTogRG9uJ3QgZnJlZSB0aGUgZGF0YSBoZXJlIGFueW1vcmUKKwkoYnVzX3NlbGludXhfY2hlY2spOiBEb24ndCB0YWtlIHNwaWQgYW5kIHRwaWQgc2luY2UgYXBwZW5kaW5nCisJdGhhdCB0byBhdXhkYXRhIG1heSBPT00uCisJKGJ1c19zZWxpbnV4X2FsbG93c19hY3F1aXJlX3NlcnZpY2UpOiBIYW5kbGUgT09NIGFuZCBzaWduYWwgYmFjaworCXRvIHRoZSBjYWxsZXIgaWYgd2UgYXJlIE9PTSBieSB0YWtpbmcgYW4gZXJyb3Igb2JqZWN0LgorCShidXNfc2VsaW51eF9hbGxvd3Nfc2VuZCk6IC1kby0KKworCSogYnVzL3NlbGludXguaDogRml4IHByb3RvdHlwZXMgZm9yIGJ1c19zZWxpbnV4X2FsbG93c19hY3F1aXJlX3NlcnZpY2UKKwlhbmQgYnVzX3NlbGludXhfYWxsb3dzX3NlbmQKKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kpOiBQYXNzIGVycm9yIGFuZAorCXBhc3Mgb24gT09NIHRocm93biBieSBidXNfc2VsaW51eF9hbGxvd3Nfc2VuZCgpCisKKwkqIGJ1cy9zZXJ2aWNlcy5jIChidXNfcmVnaXN0cnlfYWNxdWlyZV9zZXJ2aWNlKTogUGFzcyBlcnJvciBhbmQKKwlwYXNzIG9uIE9PTSB0aHJvd24gYnkgYnVzX3NlbGludXhfYWxsb3dzX2FjcXVpcmVfc2VydmljZSgpCisKKzIwMDUtMDQtMTMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBnbGliL2RidXMtZ21haW4uYyAobWVzc2FnZV9xdWV1ZV9kaXNwYXRjaCk6IG9ubHkgZGlzcGF0Y2ggb25lCisJbWVzc2FnZSBhdCBhIHRpbWUgdG8gYXZvaWQgbW9ub3BvbGl6aW5nIHRoZSBtYWluIGxvb3AsIGJ1ZyAKKwkjMjk1MyBmcm9tIEJlbmphbWluIE90dGUKKworMjAwNS0wNC0wOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoY29weSk6IGNoYW5nZSBhIG1lbWNweSB0byBtZW1tb3ZlIGR1ZSB0bworCXBvc3NpYmxlIG92ZXJsYXAsIGZpeCBmcm9tIERhbmllbCBSZWVkCisJKGZpeHVwX2FsaWdubWVudCk6IGZpeCBzaWduZWRuZXNzIHdhcm5pbmdzCisJKF9kYnVzX3N0cmluZ19hcHBlbmRfdW5pY2hhcik6IGRpdHRvCisKKzIwMDUtMDQtMDkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS11dGlsLmMgKF9kYnVzX21lc3NhZ2VfdGVzdCk6IGZpeCBzaWduZWRuZXNzIHdhcm5pbmcKKworCSogZ2xpYi9kYnVzLWdsaWItdG9vbC5jIChtYWluKTogZml4IHdhcm5pbmcKKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmMgKGdlbmVyYXRlX2dsdWUpOiBmaXggd2FybmluZworCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZV9kaXNwYXRjaCk6CisJYWRkIGEgbmV3IGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgaW4gc2ltcGxlIGFwcGxpY2F0aW9ucyB0aGF0CisJZG9uJ3QgaGF2ZSBhIG1haW4gbG9vcCBhbmQgYXJlIHdpbGxpbmcgdG8gYmxvY2sKKworMjAwNS0wNC0wNSAgRGF2aWQgWmV1dGhlbiAgPGRhdmlkekByZWRoYXQuY29tPgorCisJRml4IGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTI4ODkKKworCSogZ2xpYi9kYnVzLWdtYWluLmM6CisJKGlvX2hhbmRsZXJfZGVzdHJveV9zb3VyY2UpOiBSZW1vdmUgZnJvbSBsaXN0IG9mIElPIGhhbmRsZXJzCisJb2YgdGhlIENvbm5lY3Rpb25TZXR1cCBvYmplY3QKKwkodGltZW91dF9oYW5kbGVyX2Rlc3Ryb3lfc291cmNlKTogLWRvLSBmb3IgdGltZW91dCBoYW5kbGVycworCShpb19oYW5kbGVyX3NvdXJjZV9maW5hbGl6ZWQpOiBEb24ndCByZW1vdmUgZnJvbSBsaXN0IHNpbmNlCisJd2Ugbm93IGRvIHRoYXQgaW4gaW9faGFuZGxlcl9kZXN0cm95X3NvdXJjZSgpLiBSZW5hbWVkIGZyb20KKwlpb19oYW5kbGVyX3NvdXJjZV9kZXN0cm95ZWQKKwkodGltZW91dF9oYW5kbGVyX3NvdXJjZV9kZXN0cm95ZWQpOiAtZG8tIGZvciB0aW1lb3V0IGhhbmRsZXJzCisJKGNvbm5lY3Rpb25fc2V0dXBfZnJlZSk6IEl0IGlzIG5vdyBzYWZlIHRvIGl0ZXJhdGUgb3ZlciBhbGwKKwlJTyBhbmQgdGltZW91dCBoYW5kbGVycyBhcyB0aGUgX2Rlc3Ryb3lfc291cmNlIHJlbW92ZXMgdGhlbQorCWZyb20gdGhlIGxpc3Qgc3luY2hyb25vdXNseQorCisyMDA1LTAzLTMwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBjaGFuZ2UgY2hlY2sgdG8gZ3RrIDIuNAorCisJKiB0b29scy9kYnVzLXZpZXdlci5jIChuYW1lX2NvbWJvX2NoYW5nZWRfY2FsbGJhY2spOiByZW1vdmUKKwlndGtfY29tYm9fYm94X2dldF9hY3RpdmVfdGV4dCgpIHVzYWdlIHRvIGRlY3JlbWVudCBHVEsgcmVxdWlyZW1lbnQKKwl0byAyLjQKKworMjAwNS0wMy0yOSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogTmV3czogVXBkYXRlIDAuMzIKKworCSogSEFDS0lORzogRml4ZWQgcmVhbGVhc2UgaW5zdHJ1Y3Rpb25zLiAgY29uZmlndXJlLmluIHNob3VsZCBiZSB1cGRhdGVkIHRvCisJICB0aGUgbmV4dCByZWxlYXNlIGJ5IHRoZSBwZXJzb24gd2hvIG1hZGUgdGhlIGxhc3QgcmVsZWFzZS4KKworMjAwNS0wMy0yOSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL2x2YWx1ZV9jYXN0X3Bvc3RfcHJvY2Vzcy5weSAtIHJlbW92ZWQuICBQYXRjaCBoYXMgYmVlbgorCSAgc3VibWl0dGVkIHRvIFB5cmV4IG1haW50YWluZXJzIHRoYXQgZml4ZXMgZ2NjNC4wIGVycm9ycworCisJKiBweXRob24vTWFrZWZpbGUuYW06IHJlbW92ZWQgcmVmcmVuY2VzIHRvIGx2YWx1ZV9jYXN0X3Bvc3RfcHJvY2Vzcy5weQorCisyMDA1LTAzLTI0ICBEYW5pZWwgUmVlZCAgPG5AbWwub3JnPgorCisJKiB0b29scy9NYWtlZmlsZS5hbTogTWFrZSBwcmludC1pbnRyb3NwZWN0IGFuZAorCWRidXMtYnVzLWludHJvc3BlY3QueG1sIGJ1aWxkaW5nIGNvbmRpdGlvbmFsIG9uIEhBVkVfR0xJQi4KKworMjAwNS0wMy0yMiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvTWFrZWZpbGUuYW06IFBhdGNoIGJ5IENvbGluIFdhbHRlcnMgdGhhdCBmaXhlcyBkaXN0Y2hlY2sKKworCSogZGJ1cy9kYnVzLXVzZXJkYi5jLCBkYnVzL2RidXMtdXNlcmRiLXV0aWwuYzogQWRkIHBhdGNoIHdlIGhhdmUgCisJICBoYWQgaW4gUmVkIEhhdCBwYWNrYWdlcyBmb3IgYSB3aGlsZSBidXQgZm9yIHNvbWUgcmVhc29uIG5ldmVyIAorCSAgZ290IG1lcmdlZCB1cHN0cmVhbQorCSAgKF9kYnVzX2lzX2FfbnVtYmVyKTogTmV3IGNoZWNrcyBpZiBhIHN0cmluZworCSAgY2FuIGJlIGNvbnZlcnRlZCB0byBhIG51bWJlciBhbmQgZG9lcyB0aGUgY29udmVyc2lvbiBpZiBpdCBjYW4KKwkgIChfZGJ1c191c2VyX2RhdGFiYXNlX2xvb2t1cCk6IEFkZCBjaGVjayB0byBzZWUgaWYgdGhlIGdpdmVuIHVzZXJuYW1lCisJICBpcyBhIHVkaS4gIFRoaXMgYWxsb3dzIHVkaSdzIHRvIGJlIHVzZWQgaW5zdGVhZCBvZiB1c2VybmFtZXMgaW4gdGhlCisJICBjb25maWcgZmlsZS4KKwkgIChfZGJ1c191c2VyX2RhdGFiYXNlX2xvb2t1cF9ncm91cCk6IEFkZCBjaGVjayB0byBzZWUgaWYgdGhlIGdpdmVuIGdyb3VwbmFtZQorCSAgaXMgYSBnZGkuICBUaGlzIGFsbG93cyBnZGkncyB0byBiZSB1c2VkIGluc3RlYWQgb2YgZ3JvdXBuYW1lcyBpbiB0aGUKKwkgIGNvbmZpZyBmaWxlLgorCisyMDA1LTAzLTIxICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vbHZhbHVlX2Nhc3RfcG9zdF9wcm9jZXNzLnB5IC0gYWRkZWQgcG9zdCBwcm9jZXNzb3IgdG8gZml4IFB5cmV4CisJICBjb2RlIHNvIHRoYXQgaXQgY29tcGlsZXMgd2l0aCBnY2M0LjAKKworCSogcHl0aG9uL01ha2VmaWxlLmFtOiBBZGRlZCBsdmFsdWVfY2FzdF9wb3N0X3Byb2Nlc3MucHkgdG8gRVhUUkFfRElTVAorCSAgcnVuIGRidXNfYmluZGluZ3MuYyB0aHJvdWdoIGx2YWx1ZV9jYXN0X3Bvc3RfcHJvY2Vzcy5weSBhbmQgY29weSB0aGUKKwkgIHJlc3VsdHMgYmFjayB0byBkYnVzX2JpbmRpbmcuYworCisyMDA1LTAzLTIwICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJUGF0Y2ggc3VnZ2VzdGVkIGJ5IEluZ3V2YSBSYWphc2VraGFyIDxyaW5ndXZhQG5vdmVsbC5jb20+LgorCisJKiBjb25maWd1cmUuaW46IFJlcXVpcmUgR1RLKyAyLjYuCisJCisyMDA1LTAzLTIwICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBNYWtlZmlsZS5hbSAoU1VCRElSUywgRElTVF9TVUJESVJTKTogQnVpbGQgdG9vbHMgYmVmb3JlIHRlc3QuCisKKzIwMDUtMDMtMTcgIFRvbSBQYXJrZXIgIDxwYWxmcmV5QHRldnAubmV0PgorCisJKiBkYnVzL2RidXMtdXNlcmRiLmMgKF9kYnVzX3VzZXJfZGF0YWJhc2VfbG9va3VwKTogRG9uJ3QKKwlwcmludCBEQlVTX1VJRF9VTlNFVDsgaW5zdGVhZCBwcmludCBwYXNzZWQgdXNlcm5hbWUuICBBbHNvCisJYmUgc3VyZSB0byBhY3R1YWxseSB1c2UgZ2lkIGxvb2tlZCB1cCBpbiBjYWNoZS4KKwkKKwkqIGRidXMvZGJ1cy11c2VyZGItdXRpbC5jIChfZGJ1c191c2VyX2RhdGFiYXNlX2xvb2t1cF9ncm91cCk6IERpdHRvCisJZm9yIERCVVNfR0lEX1VOU0VUIGFuZCBncm91cG5hbWUuCisKKzIwMDUtMDMtMTcgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGJ1cy9wcmludC1pbnRyb3NwZWN0LmM6IE1vdmUgdG8gdG9vbHMvLgorCSogYnVzL3J1bi13aXRoLXRtcC1zZXNzaW9uLWJ1cy5zaDogRGl0dG8uCisJCisJKiBnbGliL01ha2VmaWxlLmFtIChkYnVzLWdsaWItYmluZGluZ3MuaCk6IE1vdmUKKwlnZW5lcmF0aW9uIHRvIHRvb2xzL01ha2VmaWxlLmFtLgorCisJKiB0ZXN0L2dsaWIvcnVuLXRlc3Quc2g6IFVwZGF0ZSB0byBoYW5kbGUgbW92ZQorCW9mIHJ1bi13aXRoLXRtcC1zZXNzaW9uLWJ1cy5zaC4KKworCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLmM6IFVwZGF0ZSB0byBoYW5kbGUKKwltb3ZlIG9mIGRidXMtZ2xpYi1iaW5kaW5ncy5oLgorCisJKiB0b29scy9wcmludC1pbnRyb3NwZWN0LmM6IE1vdmVkIGhlcmUKKwlmcm9tIGJ1cy8sIGFuZCBwb3J0ZWQgdG8gR0xpYiBiaW5kaW5ncy4KKworCSogdG9vbHMvcnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLnNoOiBNb3ZlZCBoZXJlCisJZnJvbSBidXMvLgorCisJKiB0b29scy9NYWtlZmlsZS5hbTogR2VuZXJhdGUgZGJ1cy1nbGliLWJpbmRpbmdzLmgKKwlhbmQgZGJ1cy1idXMtaW50cm9zcGVjdC54bWwgaGVyZS4KKworCSogdG9vbHMvLmN2c2lnbm9yZSwgZ2xpYi8uY3ZzaWdub3JlLCBidXMvLmN2c2lnbm9yZToKKwlVcGRhdGUuCisKKzIwMDUtMDMtMTcgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGJ1cy9kcml2ZXIuYyAod3JpdGVfYXJnc19mb3JfZGlyZWN0aW9uKTogVXNlCisJX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIHRvIHJldHJpZXZlIHN0cmluZzsKKwlfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIGRvZXNuJ3QgYWN0dWFsbHkgcmV0dXJuCisJYSBOVUxMLXRlcm1pbmF0ZWQgc3Vic3RyaW5nLgorCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYzogSW5jbHVkZSBkYnVzLWdsaWItYmluZGluZ3MuaC4KKwkobWFpbik6IENoYW5nZSB0byB1c2Ugb3JnX2ZyZWVkZXNrdG9wX0RCdXNfcmVxdWVzdF9uYW1lCisJaW5zdGVhZCBvZiB1c2luZyBnX3Byb3h5X2JlZ2luX2NhbGwvZW5kX2NhbGwuCisKKzIwMDUtMDMtMTUgIEpvZSBTaGF3ICA8am9lc2hhd0Bub3ZlbGwuY29tPgorCisJKiBtb25vL1Byb3h5QnVpbGRlci5jcyAoQnVpbGRGaW5hbGl6ZXIpOiBGaXggc29tZSBpbnZhbGlkIElMIHdoZW4KKwlnZW5lcmF0aW5nIHRoZSBmaW5hbGl6ZXIuICBGaXhlcyBmcm9tIEJlbiBNYXVyZXIuCisKKzIwMDUtMDMtMTIgIEpvZSBTaGF3ICA8am9lc2hhd0Bub3ZlbGwuY29tPgorCisJKiBtb25vL0J1c0RyaXZlci5jczogVXBkYXRlIG1ldGhvZCBuYW1lczogTGlzdFNlcnZpY2VzCisJYmVjb21lcyBMaXN0TmFtZXM7IEdldE93bmVyIGJlY29tZXMgR2V0TmFtZU93bmVyLgorCisJKiBtb25vL1Byb3h5QnVpbGRlci5jcyAoQnVpbGRGaW5hbGl6ZXIpOiBOZWVkIHRvIGxvYWQgYXJnIDAKKwlvbnRvIHRoZSBldmFsIHN0YWNrIHdoZW4gcmVtb3ZpbmcgdGhlIGRlbGVnYXRlLgorCisyMDA1LTAzLTEyICBKb2UgU2hhdyAgPGpvZXNoYXdAbm92ZWxsLmNvbT4KKworCSogbW9uby9kYnVzLXNoYXJwLmRsbC5jb25maWcuaW46IERvbid0IGhhcmRjb2RlIDAgZm9yCisJTFRfQ1VSUkVOVC4gIFNldCBpdCB0byB0aGUgYXV0b2NvbmYgdmFyaWFibGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSogbW9uby9Qcm94eUJ1aWxkZXIuY3M6IEFkZCBhIGZpbmFsaXplciB0byB0aGUgZ2VuZXJhdGVkIHByb3h5CisJY2xhc3NlcyB0aGF0IGRpc2Nvbm5lY3RzIHRoZSBzaWduYWwgaGFuZGxlciBkZWxlZ2F0ZSBmcm9tIHRoZQorCXNlcnZpY2Ugb2JqZWN0LiAgRml4ZXMgYSBiaWcgbGVhayBvZiBwcm94eSBvYmplY3RzIG9uIHRoZQorCWNsaWVudCBzaWRlIG9mIHRoaW5ncy4gIFBhdGNoIGZyb20gQmVuIE1hdXJlcgorCTxibWF1cmVyQHhpbWlhbi5jb20+CisKKzIwMDUtMDMtMTIgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGJ1cy9kcml2ZXIuYyAod3JpdGVfYXJnc19mb3JfZGlyZWN0aW9uKTogTmV3IGZ1bmN0aW9uLAorCXBhcnNlcyBhIHR5cGUgc2lnbmF0dXJlIGludG8gYXJndW1lbnRzIGFuZCBvdXRwdXRzIHRvCisJWE1MLgorCShidXNfZHJpdmVyX2hhbmRsZV9pbnRyb3NwZWN0KTogVXNlIGl0IGluc3RlYWQgb2YKKwloYXJkY29kaW5nIFhNTCBmb3IgY2VydGFpbiBzaWduYXR1cmVzLgorCQorCSogYnVzL01ha2VmaWxlLmFtIChkYnVzLWJ1cy1pbnRyb3NwZWN0LnhtbCk6IEFkZAorCWRlcGVuZGVuY3kgb24gZGJ1cy1kYWVtb24uCisKKwkqIGdsaWIvZGJ1cy1nbGliLXRvb2wuYyAobWFpbik6IFBhcnNlIGlnbm9yZV91bnN1cHBvcnRlZAorCWFyZ3VtZW50LCBwYXNzIGl0IHRvIGRidXNfYmluZGluZ190b29sX291dHB1dF9nbGliX2NsaWVudC4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmMKKwkoZ2VuZXJhdGVfY2xpZW50X2dsdWUpOiBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uLgorCShkYnVzX2JpbmRpbmdfdG9vbF9vdXRwdXRfZ2xpYl9jbGllbnQpOiBBZGQKKwlHX0JFR0lOX0RFQ0xTL0dfRU5EX0RFQ0xTLgorCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYyAoY29tcHV0ZV9jbGllbnRfbWV0aG9kX25hbWUpOgorCUNoYW5nZSB0byBqdXN0IHRha2UgaWZhY2UgcHJlZml4IGRpcmVjdGx5LgorCSh3cml0ZV9mb3JtYWxfcGFyYW1ldGVycyk6IENsYXJpZnkgZXJyb3IgbWVzc2FnZS4KKwkoY2hlY2tfc3VwcG9ydGVkX3BhcmFtZXRlcnMpOiBOZXcgZnVuY3Rpb247IGNoZWNrcyB0byBzZWUgdHlwZQorCXNpZ25hdHVyZXMgb2YgbWV0aG9kIHBhcmFtZXRlcnMgYXJlIHN1cHBvcnRlZC4KKwkoZ2VuZXJhdGVfY2xpZW50X2dsdWUpOiBIYW5kbGUgaWdub3JlX3Vuc3VwcG9ydGVkIGZsYWcuCisJKGRidXNfYmluZGluZ190b29sX291dHB1dF9nbGliX2NsaWVudCk6IEhhbmRsZSBpZ25vcmVfdW5zdXBwb3J0ZWQKKwlwYXJhbWV0ZXIuCisKKwkqIGdsaWIvTWFrZWZpbGUuYW0gKGRidXMtZ2xpYi1iaW5kaW5ncy5oKTogUGFzcworCS0taWdub3JlLXVuc3VwcG9ydGVkIGJ5IGRlZmF1bHQgdW50aWwgZ2xpYiBiaW5kaW5ncworCXN1cHBvcnQgYXJyYXlzLgorCisyMDA1LTAzLTExICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBnbGliL01ha2VmaWxlLmFtOiBHZW5lcmF0ZSBkYnVzLWdsaWItYmluZGluZ3MuaCBhbmQKKwlpbnN0YWxsIGl0LgorCisJKiBidXMvcHJpbnQtaW50cm9zcGVjdC5jOiBOZXcgZmlsZTsgcHJpbnRzIGludHJvc3BlY3Rpb24KKwlkYXRhIGZvciBhIGdpdmVuIG5hbWUgYW5kIG9iamVjdCBwYXRoLgorCisJKiBidXMvcnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLnNoOiBOZXcgZmlsZSwgcmVmYWN0b3JlZAorCWZyb20gdGVzdC9nbGliL3J1bi10ZXN0LnNoLiAgQ3JlYXRlcyBhIHRlbXBvcmFyeSBzZXNzaW9uCisJYnVzIGFuZCBydW5zIGFub3RoZXIgcHJvZ3JhbS4KKworCSogdGVzdC9nbGliL3J1bi10ZXN0LnNoOiBSZWZhY3RvciB0byBpbnZva2UKKwlydW4td2l0aC10bXAtc2Vzc2lvbi1idXMuc2guCisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfaW50cm9zcGVjdCk6IEZpeCB0byBwcmludCBuZXcKKwlpbnRyb3NwZWN0aW9uIGZvcm1hdC4gIEFsc28gY2hhbmdlIHRvIHVzZSBEQlVTX1RZUEVfeF9BU19TVFJJTkcKKwltYWNyb3MgaW5zdGVhZCBvZiBoYXJkY29kaW5nLgorCisJKiBnbGliLy5jdnNpZ25vcmUsIGJ1cy8uY3ZzaWdub3JlLCB0ZXN0L2dsaWIvLmN2c2lnbm9yZTogVXBkYXRlLgorCisyMDA1LTAzLTExICBKb2UgU2hhdyAgPGpvZXNoYXdAbm92ZWxsLmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSk6IFJlbW92ZQorCXRoaXMgdW5yZWY7IGl0IGRvZXNuJ3QgbWF0Y2ggdXAgZXZlbmx5IGluIHNvbWUgY29kZXBhdGhzLgorCShfZGJ1c19jb25uZWN0aW9uX2Jsb2NrX3BlbmRpbmdfY2FsbCk6IFVucmVmIGF0IGV2ZXJ5IGV4aXRwb2ludDsKKwl0aGlzIGV2ZW5seSBtYXRjaGVzIHdpdGggdGhlIHJlZiBuZWFyIHRoZSB0b3Agb2YgdGhpcyBmdW5jdGlvbi4KKworMjAwNS0wMy0wOSAgSm9lIFNoYXcgIDxqb2VzaGF3QG5vdmVsbC5jb20+CisKKwkqIGRidXMvZGJ1cy1vYmplY3QtdHJlZS5jCisJKF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayk6IElmIGNoZWNrcyBhcmUgZW5hYmxlZAorCWFuZCB3ZSB0cnkgdG8gdW5yZWdpc3RlciBhIHBhdGggdGhhdCdzIG5vdCByZWdpc3RlcmVkLCBzdGlsbCBnbworCXRocm91Z2ggdGhlIHByb2Nlc3Mgb2YgdW5sb2NraW5nIGFuZCBkb24ndCBqdXN0IHJldHVybi4KKworMjAwNS0wMy0wOSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dfcHJveHlfaW52b2tlKTogTmV3IG1ldGhvZDsgY2FsbHMKKwl0byB0aGlzIGFyZSBnZW5lcmF0ZWQgZm9yIGNsaWVudC1zaWRlIHdyYXBwZXJzLiAgSW52b2tlcyBhCisJRC1CVVMgbWV0aG9kIGFuZCByZXR1cm5zIHJlcGx5IHZhbHVlcy4gIAorCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYyAod3JpdGVfYXJnc19zaWdfZm9yX2RpcmVjdGlvbik6IE5ldworCWZ1bmN0aW9uOyB3cml0ZXMgc2lnbmF0dXJlIHN0cmluZyBmb3IgYXJndW1lbnQgZGlyZWN0aW9uLgorCSh3cml0ZV9hcmdzX2Zvcl9kaXJlY3Rpb24pOiBDaGFuZ2UgdG8gcGFzcyBpbnB1dCB2YWx1ZXMgZGlyZWN0bHkKKwlpbnN0ZWFkIG9mIHZpYSBhZGRyZXNzLCBhbmQgZml4IGluZGVudGF0aW9uLgorCShnZW5lcmF0ZV9jbGllbnRfZ2x1ZSk6IENoYW5nZSB0byBpbnZva2UgZGJ1c19nX3Byb3h5X2ludm9rZS4gIEFsc28KKwltYWtlIGdlbmVyYXRlZCB3cmFwcGVycyBpbmxpbmVhYmxlLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZml4ZWRfYXJyYXkpOiBBZGQKKwlub3RlIGFib3V0IHVzaW5nIGRidXNfdHlwZV9pc19maXhlZC4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtYmFzaWMuYyAoX2RidXNfdHlwZV9pc19maXhlZCk6IE1vdmVkIHRvCisJZGJ1cy9kYnVzLXNpZ25hdHVyZS5jIGFzIGRidXNfdHlwZV9pc19maXhlZC4KKworCUFsbCBjYWxsZXJzIHVwZGF0ZWQuCisKKwkqIGRidXMvZGJ1cy1zaWduYXR1cmUuYyAoZGJ1c190eXBlX2lzX2ZpeGVkKTogTW92ZWQgaGVyZQorCWZyb20gZGJ1cy9kYnVzLW1hcnNoYWwtYmFzaWMuYzpfZGJ1c190eXBlX2lzX2ZpeGVkLgorCisJKiBkYnVzL2RidXMtc2lnbmF0dXJlLmg6IFByb3RvdHlwZS4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmMgKGNvbXB1dGVfbWFyc2hhbGxlcl9uYW1lKTogRml4CisJZXJyb3IgcHJpbnRmIGNvZGUuCisKKwkqIHRlc3QvZ2xpYi90ZXN0LWRidXMtZ2xpYi5jIChtYWluKTogQmUgc3VyZSB0byBjbGVhciBlcnJvciBhcworCWFwcHJvcHJpYXRlIGluc3RlYWQgb2YganVzdCBmcmVlaW5nIGl0LgorCShtYWluKTogRnJlZSByZXR1cm5lZCBzdHJpbmdzIHVzaW5nIGdfZnJlZS4KKworCSogdGVzdC9nbGliL01ha2VmaWxlLmFtICh0ZXN0LXNlcnZpY2UtZ2xpYi1nbHVlLmgpCisJKHRlc3Qtc2VydmljZS1nbGliLWJpbmRpbmdzLmgpOiBBZGQgZGVwZW5kZW5jeSBvbiBkYnVzLWJpbmRpbmctdG9vbC4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS5jIChNQVBfQkFTSUMpOiBSZWZhY3RvcmVkIGZyb20gTUFQX0JBU0lDX0lOSVQ7CisJc2ltcGx5IG1hcHMgYSBzaW1wbGUgRC1CVVMgdHlwZSB0byBHVHlwZS4KKwkoZGJ1c19kYnVzX3R5cGVfdG9fZ3R5cGUpOiBGdW5jdGlvbiB3aGljaCBtYXBzIEQtQlVTIHR5cGUgdG8KKwlHVHlwZS4KKwkoZGJ1c19ndmFsdWVfaW5pdCk6IEp1c3QgaW52b2tlIGRidXNfZGJ1c190eXBlX3RvX2d0eXBlIGFuZAorCWluaXRpYWxpemUgdGhlIHZhbHVlIHdpdGggaXQuCisJKGRidXNfZ3ZhbHVlX2JpbmRpbmdfdHlwZV9mcm9tX3R5cGUpOiBVbnVzZWQsIGRlbGV0ZS4KKwkoZGJ1c19ndmFsdWVfZGVtYXJzaGFsKTogU3dpdGNoIHRvIGhhcmRjb2RpbmcgZGVtYXJzaGFsbGluZyBmb3IKKwl2YXJpb3VzIHR5cGVzIGluc3RlYWQgb2YgdW5tYXJzaGFsbGluZyB0byB2YWx1ZSBkYXRhIGRpcmVjdGx5LgorCVJlbW92ZSBjYW5fY29udmVydCBib29sZWFuLgorCShkYnVzX2d2YWx1ZV9tYXJzaGFsKTogUmVtb3ZlIGR1cGxpY2F0ZSBpbml0aWFsaXphdGlvbjsgc3dpdGNoIHRvCisJcmV0dXJuaW5nIGRpcmVjdGx5IGluc3RlYWQgb2YgdXNpbmcgY2FuX2NvbnZlcnQgYm9vbGVhbi4KKwkoZGJ1c19ndmFsdWVfc3RvcmUpOiBOZXcgZnVuY3Rpb247IG5vdCByZWxhdGVkIHRvIEQtQlVTIHBlci1zZS4KKwlTdG9yZXMgYSBHVmFsdWUgaW4gYSBwb2ludGVyIHRvIGEgdmFsdWUgb2YgaXRzIGNvcnJlc3BvbmRpbmcgQworCXR5cGUuCisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuaDogUmVtb3ZlIGRidXNfZ3ZhbHVlX2JpbmRpbmdfdHlwZV9mcm9tX3R5cGUsCisJYWRkIGRidXNfZ3ZhbHVlX3N0b3JlLgorCisyMDA1LTAzLTA4ICBKb2UgU2hhdyAgPGpvZXNoYXdAbm92ZWxsLmNvbT4KKworCUZpeCBhIGJ1bmNoIG9mIGxpZmVjeWNsZSBhbmQgbWVtb3J5IG1hbmFnZW1lbnQgcHJvYmxlbXMKKwlpbiB0aGUgbW9ubyBiaW5kaW5ncy4KKworCSogbW9uby9Bcmd1bWVudHMuY3MgKEFyZ3VtZW50cyk6IEltcGxlbWVudCBJRGlzcG9zYWJsZQorCisJKiBtb25vL0J1cy5jcyAoQnVzKTogRG9uJ3QgYWxsb3cgcHVibGljIGluc3RhbnRpYXRpb24uICBUaGlzIGlzCisJc3RyaWN0bHkgYSBzdGF0aWMgY2xhc3MuCisKKwkqIG1vbm8vQ29ubmVjdGlvbi5jczogTW92ZSB0aGUgREJ1c09iamVjdFBhdGhWVGFibGUgYW5kIGFzc29jaWF0ZWQKKwlkZWxlZ2F0ZXMgaW50byB0aGlzIGZpbGUuCisJKENvbm5lY3Rpb24pOiBJbXBsZW1lbnQgSURpc3Bvc2FibGUuCisJKERpc3Bvc2UpOiBEaXNjb25uZWN0IHRoZSBjb25uZWN0aW9uIGFuZCBzZXQgdGhlIHJhdyBjb25uZWN0aW9uCisJcG9pbnRlciB0byBJbnRQdHIuWmVyby4KKwkofkNvbm5lY3Rpb24pOiBDYWxsIERpc3Bvc2UoKS4KKwkoUmVnaXN0ZXJPYmplY3RQYXRoKTogQWRkZWQuICBNYW5hZ2VzIHRoZSByZWdpc3RyYXRpb24gb2Ygb2JqZWN0CisJcGF0aHMgc28gd2UgY2FuIGNsZWFubHkgZGlzY29ubmVjdCB0aGVtIGF0IGRpc3Bvc2UvZmluYWxpemUgdGltZS4KKwkoVW5yZWdpc3Rlck9iamVjdFBhdGgpOiBEaXR0by4KKwkoc2V0X1Jhd0Nvbm5lY3Rpb24pOiBVbnJlZ2lzdGVyIGFsbCBvZiB0aGUgb2JqZWN0IHBhdGhzIHdoZW4KKwljaGFuZ2luZyB0aGUgdW5kZXJseWluZyBEQnVzQ29ubmVjdGlvbi4gIEFkZCB0aGVtIGJhY2sgb250byB0aGUKKwluZXcgY29ubmVjdGlvbiwgaWYgYW55LgorCisJKiBtb25vL0hhbmRsZXIuY3M6IERvbid0IGltcGxlbWVudCBJRGlzcG9zYWJsZTsgaXQgZG9lc24ndCB1c2UgYW55CisJbW9yZSB1bm1hbmFnZWQgcmVzb3VyY2VzIGFueW1vcmUsIHNvIGl0J3Mgbm90IG5lY2Vzc2FyeS4gIE1vdmUgYWxsCisJdGhlIERCdXNPYmplY3RQYXRoVlRhYmxlIHN0dWZmIG91dCBvZiBoZXJlLgorCShIYW5kbGVyKTogU2F2ZSByZWZlcmVuY2VzIHRvIG91ciBkZWxlZ2F0ZXMgc28gdGhhdCB0aGV5IGRvbid0IGdldAorCWZpbmFsaXplZC4gIENhbGwgQ29ubmVjdGlvbi5SZWdpc3Rlck9iamVjdFBhdGgoKSBpbnN0ZWFkIG9mCisJZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX29iamVjdF9wYXRoKCkgZGlyZWN0bHkuCisJKE1lc3NhZ2VfQ2FsbGVkKTogRGlzcG9zZSB0aGUgbWVzc2FnZSBhZnRlciB3ZSdyZSBmaW5pc2hlZCB3aXRoCisJaXQuCisKKwkqIG1vbm8vTWVzc2FnZS5jcyAoTWVzc2FnZSk6IEltcGxlbWVudCBJRGlzcG9zYWJsZS4KKwkoRGlzcG9zZSk6IERpc3Bvc2UgdGhlIEFyZ3VtZW50cywgYW5kIHNldCB0aGUgUmF3TWVzc2FnZSB0bworCUludFB0ci5aZXJvLgorCShTZW5kV2l0aFJlcGx5QW5kQmxvY2spOiBXZSBvd24gdGhlIHJlZiB0byB0aGUgcmVwbHkgdGhhdCBjb21lcworCWJhY2sgZnJvbSBkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jaygpIHNvIGFkZCBhCisJY29tbWVudCBhYm91dCB0aGF0IGFuZCB1bnJlZiBpdCBhZnRlciB3ZSd2ZSBjb25zdHJ1Y3RlZCBhIG1hbmFnZWQKKwlNZXRob2RSZXR1cm4gY2xhc3MgYXJvdW5kIGl0LiAgRml4ZXMgYSBiaWcsIGJpZyBsZWFrLgorCisJKiBtb25vL1Byb3h5QnVpbGRlci5jczogUmVmbGVjdCBpbnRvIE1lc3NhZ2UgdG8gZ2V0IHRoZSBEaXNwb3NlCisJbWV0aG9kLgorCShCdWlsZFNpZ25hbEhhbmRsZXIpOiBBZnRlciB3ZSd2ZSBzZW50IHRoZSBTaWduYWwgbWVzc2FnZSwgZGlzcG9zZQorCW9mIGl0LgorCShCdWlsZE1ldGhvZCk6IERpc3Bvc2Ugb2YgdGhlIG1ldGhvZCBjYWxsIGFuZCByZXBseSBtZXNzYWdlcyBhZnRlcgorCXdlJ3ZlIHNlbnQgdGhlIG1lc3NhZ2UgYW5kIGV4dHJhY3RlZCB0aGUgZGF0YSB3ZSB3YW50IGZyb20gdGhlCisJcmVwbHkuCisKKwkqIG1vbm8vU2VydmljZS5jcyAoVW5yZWdpc3Rlck9iamVjdCk6IERvbid0IGNhbGwgaGFuZGxlci5EaXNwb3NlKCkKKwlhbnltb3JlLgorCShTZXJ2aWNlX0ZpbHRlckNhbGxlZCk6IERpc3Bvc2Ugb2YgdGhlIG1lc3NhZ2UgYWZ0ZXIgd2UncmUKKwlmaW5pc2hlZCB3aXRoIGl0LgorCisyMDA1LTAzLTA4ICBKb2UgU2hhdyAgPGpvZXNoYXdAbm92ZWxsLmNvbT4KKworICAgICAgICAqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkpOgorICAgICAgICBBZnRlciB3ZSBhdHRhY2ggb3VyIHBlbmRpbmcgY2FsbCB0byB0aGUgY29ubmVjdGlvbiwgdW5yZWYKKyAgICAgICAgaXQuICBGaXhlcyBhIGxlYWsuCisgCisgICAgICAgICogbW9uby9Db25uZWN0aW9uLmNzIChzZXRfUmF3Q29ubmVjdGlvbik6IERpc2Nvbm5lY3Qgb3VyCisgICAgICAgIGZpbHRlciBhbmQgbWF0Y2ggY2FsbGJhY2tzIGZyb20gdGhlIG9sZCBjb25uZWN0aW9uIGFuZAorICAgICAgICByZWNvbm5lY3QgdGhlbSB0byB0aGUgbmV3IGNvbm5lY3Rpb24sIGlmIGFueS4KKworCSogbW9uby9EQnVzVHlwZS9BcnJheS5jczogIkNvZGUiIGlzIGEgc3RhdGljIG1lbWJlciwgc28KKwlkb24ndCB1c2UgInRoaXMiIHRvIHJlZmVyIHRvIGl0LiAgRml4IGZvciBzdHJpY3RlciBjaGVja2luZworCWluIE1vbm8gMS4xLjQuCisgCisgICAgICAgICogbW9uby9EQnVzVHlwZS9PYmplY3RQYXRoLmNzIChBcHBlbmQpOiBEb24ndCBsZWFrIHRoZQorCW9iamVjdCBwYXRoIHRoYXQgd2UgcGFzcyBpbnRvIHVubWFuYWdlZCBjb2RlLgorIAorICAgICAgICAqIG1vbm8vREJ1c1R5cGUvU3RyaW5nLmNzIChBcHBlbmQpOiBEb24ndCBsZWFrIHRoZSBzdHJpbmcKKwl0aGF0IHdlIHBhc3MgaW50byB1bm1hbmdlZCBjb2RlLgorCisyMDA1LTAzLTA3ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCSogTkVXUzogVXBkYXRlIGZvciAwLjMxCisKKwkqIGNvbmZpZ3VyZS5pbjogUmVsZWFzZSAwLjMxCisJYWRkIExUX0NVUlJFTlQsIExUX1JFVklTSU9OLCBMVF9BR0UgZm9yIGVhc3kgc29uYW1lIGJ1bXBpbmcKKworCSogcXQvTWFrZWZpbGUuYW06IGZpeGVkIGJ1aWxkCisKKwkqIGRidXMvTWFrZWZpbGUuYW06IHNvbmFtZSBidW1wIGZvciBsaWJkYnVzCisKKwkqIGdsaWIvTWFrZWZpbGUuYW06IHNvbmFtZSBidW1wIGZvciBsaWJkYnVzLWdsaWIKKworMjAwNS0wMy0wNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmM6CisJKHBzZXVkb3JhbmRvbV9nZW5lcmF0ZV9yYW5kb21fYnl0ZXNfYnVmZmVyKTogZml4IHRvIGhhdmUgbm8gcmV0dXJuCisJdmFsdWUKKwkoX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2J5dGVzX2J1ZmZlcik6IGZpeCByZXR1cm4gdmFsdWUKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC5jOiBzL0dFVFBXTkFNRS9HRVRQV05BTS8gc28gY29uZmlndXJlCisJY2hlY2tzIGFjdHVhbGx5IHdvcmssIGZyb20gVG9tIFBhcmtlciA8ZmRvQHRldnAubmV0PgorCisyMDA1LTAzLTAxICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiB0ZXN0L2dsaWIvdGVzdC1kYnVzLWdsaWIuYyAobG9zZSwgbG9zZV9nZXJyb3IpOiBVdGlsaXR5CisJZnVuY3Rpb25zIGNvcGllZCBmcm9tIGRidXMtZ2xpYi10b29sLmMuCisJKG1haW4pOiBDb252ZXJ0IGxvdHMgb2YgZXJyb3IgY29kZSB0byB1c2UgdGhlbS4KKwlBbHNvIGFkZCBzb21lIHRlc3RpbmcgZm9yIGludHJvc3BlY3Rpb24gYml0cy4KKworMjAwNS0wMy0wMSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKwkKKwkqIGRvYy9UT0RPOiBSZW1vdmUgaW50cm9zcGVjdGlvbiBzaWduYXR1cmUgVE9ETy4KKworMjAwNS0wMi0yNyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWdpZGwuYyAocHJvcGVydHlfaW5mb19nZXRfdHlwZSwgYXJnX2luZm9fZ2V0X3R5cGUpOgorCUNoYW5nZSByZXR1cm4gdmFsdWUgdG8gY29uc3QgY2hhciAqIGluc3RlYWQgb2YgaW50IHNvIHdlIGNhbiBkbworCWZ1bGwgc2lnbmF0dXJlcy4KKwkoc3RydWN0IFByb3BlcnR5SW5mbywgc3RydWN0IEFyZ0luZm8pOiBTdG9yZSBjaGFyICouCisJKHByb3BlcnR5X2luZm9fbmV3LCBhcmdfaW5mb19uZXcpOiBVcGRhdGUgcGFyYW1ldGVycywgc3RyZHVwLgorCShwcm9wZXJ0eV9pbmZvX3VucmVmLCBhcmdfaW5mb191bnJlZik6IEZyZWUuCisKKwkqIGdsaWIvZGJ1cy1naWRsLmg6IFVwZGF0ZSBwcm90b3R5cGVzLgorCisJKiBnbGliL2RidXMtZ3BhcnNlci5jIChiYXNpY190eXBlX2Zyb21fc3RyaW5nKTogRGVsZXRlLgorCSh2YWxpZGF0ZV9zaWduYXR1cmUpOiBOZXcgZnVuY3Rpb24sIGp1c3QgdmFsaWRhdGVzIHNpZ25hdHVyZSBhbmQKKwlzZXRzIEdFcnJvci4KKwkocGFyc2VfcHJvcGVydHksIHBhcnNlX2FyZyk6IEludm9rZSB2YWxpZGF0ZV9zaWduYXR1cmUuICBTdG9yZQorCXNpZ25hdHVyZSBpbnN0ZWFkIG9mIGp1c3QgdHlwZSBjb2RlLgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLmMgKGJhc2VfdHlwZV9mcm9tX3NpZ25hdHVyZSk6IE5ldyB1dGlsaXR5CisJZnVuY3Rpb24gdG8gcmV0dXJuIGEgcHJpbWFyeSB0eXBlIGZvciBhIHNpZ25hdHVyZSwgZHJvcHBpbmcKKwlpbmZvcm1hdGlvbiBhYm91dCB0eXBlcyBpbiBjb250YWluZXIgdHlwZXMuCisJKGRidXNfZ3ZhbHVlX2dlbm1hcnNoYWxfbmFtZV9mcm9tX3R5cGUpCisJKGRidXNfZ3ZhbHVlX2JpbmRpbmdfdHlwZV9mcm9tX3R5cGUpCisJKGRidXNfZ3ZhbHVlX2N0eXBlX2Zyb21fdHlwZSk6IFVwZGF0ZSB0byB0YWtlIGZ1bGwgc2lnbmF0dXJlCisJIGluc3RlYWQgb2YgdHlwZSBjb2RlLgorCShkYnVzX2d0eXBlX3RvX2RidXNfdHlwZSk6IE1vdmVkIGhlcmUgZnJvbSBnbGliL2RidXMtZ29iamVjdC5jLgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLmg6IFVwZGF0ZSBwcm90b3R5cGVzIGZvciBhYm92ZS4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoZ3R5cGVfdG9fZGJ1c190eXBlKTogTW92ZWQgdG8KKwlnbGliL2RidXMtZ3ZhbHVlLmMgYXMgZGJ1c19ndHlwZV90b19kYnVzX3R5cGUuCisJKGludHJvc3BlY3RfcHJvcGVydGllcywgaW50cm9zcGVjdF9zaWduYWxzLCB3cml0ZV9pbnRlcmZhY2UpOgorCVVwZGF0ZSB0byBoYW5kbGUgc2lnbmF0dXJlcywgYW5kIHJlbW92ZSB1c2FnZSBvZgorCV9kYnVzX2d1dGlsc190eXBlX3RvX3N0cmluZy4KKwkoaGFuZGxlX2ludHJvc3BlY3QpOiBQcmludCBvdXQgdHlwZSBjb2RlcyBpbnN0ZWFkIG9mIGUuZy4gInN0cmluZyIKKwlpbiBoYXJkY29kZWQgaW50cm9zcGVjdGlvbiBYTUw7IGFsc28gdXNlIHhfQVNfU1RSSU5HIGNvbnN0YW50cworCWluc3RlYWQgb2YgaGFyZGNvZGluZyBpbiBzdHJpbmcuCisKKwkqIGdsaWIvZGJ1cy1nbGliLXRvb2wuYyAocHJldHR5X3ByaW50KTogSGFuZGxlIHNpZ25hdHVyZSBjaGFuZ2UKKwl0byBzdHJpbmcuICBSZW1vdmUgdXNhZ2Ugb2YgX2RidXNfZ3V0aWxzX3R5cGVfdG9fc3RyaW5nLgorCisJKiBnbGliL2RidXMtZ3V0aWxzLmMgKF9kYnVzX2d1dGlsc190eXBlX3RvX3N0cmluZyk6IERlbGV0ZS4KKworCSogZ2xpYi9kYnVzLWd1dGlscy5oIChfZGJ1c19ndXRpbHNfdHlwZV90b19zdHJpbmcpOiBVcGRhdGUgZm9yCisJZGVsZXRpb24uCisJCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYyAoY29tcHV0ZV9tYXJzaGFsbGVyKQorCShjb21wdXRlX21hcnNoYWxsZXJfbmFtZSwgZ2VuZXJhdGVfZ2x1ZSk6IEhhbmRsZSBzaWduYXR1cmUgY2hhbmdlCisJdG8gc3RyaW5nLgorCSh3cml0ZV9mb3JtYWxfcGFyYW1ldGVycywgd3JpdGVfYXJnc19mb3JfZGlyZWN0aW9uKTogRGl0dG8sIGFuZAorCXJlbW92ZSBGSVhNRS4KKworCSogdG9vbHMvZGJ1cy10cmVlLXZpZXcuYyAodHlwZV90b19zdHJpbmcpOiBEZWxldGUuCisJKGluZm9fc2V0X2Z1bmNfdGV4dCk6IFVwZGF0ZSB0byBwcmludCBmdWxsIHNpZ25hdHVyZXMuCisKKwkqIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi54bWw6IENoYW5nZSB0eXBlcyB0byBuZXcKKwlpbnRyb3NwZWN0aW9uIGZvcm1hdC4KKworMjAwNS0wMi0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9UT0RPOiByZW1vdmUgdGhlICJndWlkIiBpdGVtCisKKwkqIHRlc3QvZ2xpYi90ZXN0LXByb2ZpbGUuYyAobm9fYnVzX3RocmVhZF9mdW5jKTogdXNlIG9wZW5fcHJpdmF0ZQorCSh3aXRoX2J1c190aHJlYWRfZnVuYyk6IHVzZSBvcGVuX3ByaXZhdGUKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSk6IG5ldworCWZ1bmN0aW9uIHRoYXQgd29ya3MgbGlrZSB0aGUgb2xkIGRidXNfY29ubmVjdGlvbl9vcGVuKCkKKwkoZGJ1c19jb25uZWN0aW9uX29wZW4pOiBub3cgcmV0dXJucyBhbiBleGlzdGluZyBjb25uZWN0aW9uIGlmCisJcG9zc2libGUKKworCSogZGJ1cy9kYnVzLXNlcnZlci11bml4LmMgKGhhbmRsZV9uZXdfY2xpZW50X2ZkX2FuZF91bmxvY2spOiBwYXNzCisJdGhyb3VnaCB0aGUgR1VJRCB0byB0aGUgdHJhbnNwb3J0CisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYyAoX2RidXNfc2VydmVyX2luaXRfYmFzZSk6IGtlZXAgYXJvdW5kIHRoZQorCUdVSUQgaW4gaGV4LWVuY29kZWQgZm9ybS4KKworCSogZGJ1cy9kYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmMgKF9kYnVzX3RyYW5zcG9ydF9kZWJ1Z19waXBlX25ldyk6CisJcGFzcyBHVUlEIGFyZ3VtZW50IGluIHRvIHRoZSB0cmFuc3BvcnQKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMgKF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX2ZkKTogYWRkCisJZ3VpZCBhcmd1bWVudAorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmMgKF9kYnVzX3RyYW5zcG9ydF9pbml0X2Jhc2UpOiBhZGQgZ3VpZCBhcmd1bWVudAorCisJKiBkYnVzL2RidXMtYXV0aC5jIChfZGJ1c19hdXRoX3NlcnZlcl9uZXcpOiBhZGQgZ3VpZCBhcmd1bWVudAorCisyMDA1LTAyLTI1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IGRvY3VtZW50IHRoZSBHVUlEIHRoaW5nCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYyAoX2RidXNfc2VydmVyX2luaXRfYmFzZSk6IGluaXRpYWxpemUgYQorCWdsb2JhbGx5IHVuaXF1ZSBJRCBmb3IgdGhlIHNlcnZlciwgYW5kIHB1dCBhICJndWlkPWhleGVuY29kZWQiCisJZmllbGQgaW4gdGhlIGFkZHJlc3MKKworCSogZGJ1cy9kYnVzLWJ1cy5jOiBmaXggbWlzc2luZyAjaW5jbHVkZSBvZiBkYnVzLXRocmVhZHMtaW50ZXJuYWwuaAorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiBkaXR0bworCisJKiBkYnVzL2RidXMtZGF0YXNsb3QuYzogZGl0dG8KKworCSogZGJ1cy9kYnVzLWxpc3QuYzogZGl0dG8KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oOiB3YWl0LCBqdXN0IGluY2x1ZGUKKwlkYnVzLXRocmVhZHMtaW50ZXJuYWwuaCBoZXJlCisJCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19jb3B5X3RvX2J1ZmZlcik6IG1vdmUgYmFjayBmb3IKKwl1c2UgaW4gbWFpbiBsaWJyYXJ5CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2dlbmVyYXRlX3JhbmRvbV9ieXRlc19idWZmZXIpOiBuZXcgZnVuY3Rpb24KKworMjAwNS0wMi0yNCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogdGVzdC9nbGliL01ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIHRlc3Qtc2VydmljZS1nbGliLnhtbAorCisyMDA1LTAyLTI0ICBKb2huIChKNSkgUGFsbWllaXIgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBnbGliL01ha2VmaWxlLmFtOiBhZGRlZCBkYnVzLWdvYmplY3QuaCB0byBzb3VyY2VzIGxpc3QKKwlzbyBkaXN0Y2hlY2sgZG9lc24ndCBmYWlsCisJCisyMDA1LTAyLTI0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXNlcnZlci5jLCBkYnVzL2RidXMtc2VydmVyLXVuaXguYzogY2hhbmdlIHNlbWFudGljcyBzbworCXlvdSBtdXN0IGRpc2Nvbm5lY3QgYmVmb3JlIHVucmVmLCBzaW5jZSBsb2NraW5nIGFuZCBvdGhlciB0aGluZ3MKKwlhcmUgc2NyZXdlZCB1cCBvdGhlcndpc2UuIEZpeCBhc3NvcnRlZCBvdGhlciBsb2NraW5nIHN0dWZmLgorCisJKiBkYnVzL2RidXMtc2lnbmF0dXJlLmMgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2VsZW1lbnRfdHlwZSk6CisJZml4IGNvbXBpbGF0aW9uCisKKwkqIGRidXMvZGJ1cy10aHJlYWRzLWludGVybmFsLmg6IG1vdmUgdGhlIG11dGV4L2NvbmR2YXIgd3JhcHBlcnMKKwlpbnRvIGEgcHJpdmF0ZSBoZWFkZXIgYW5kIGRvbid0IGV4cG9ydCBmcm9tIHRoZSBsaWJyYXJ5CisKKwkqIHRocm91Z2hvdXQgLSBjYWxsIF9kYnVzX3RocmVhZF9zdHVmZiB2cy4gZGJ1c190aHJlYWRfc3R1ZmYKKworMjAwNS0wMi0yNCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKwkKKwkqIGRidXMvZGJ1cy1zaWduYXR1cmUuYzogTmV3IGZpbGU7IGltcGxlbWVudHMgdmFyaW91cyBmdW5jdGlvbnMKKwlyZWxhdGVkIHRvIHR5cGUgc2lnbmF0dXJlcy4gIEluY2x1ZGVzIGFuIGludGVyYXRvciBmb3IgcGFyc2luZywKKwl2YWxpZGF0aW9uIGZ1bmN0aW9ucy4KKwkoZGJ1c190eXBlX2lzX2Jhc2ljKTogTW92ZWQgaGVyZSBmcm9tCisJZGJ1cy1tYXJzaGFsLWJhc2ljLmM6X2RidXNfdHlwZV9pc19iYXNpYy4KKwkoZGJ1c190eXBlX2lzX2NvbnRhaW5lcik6IE1vdmVkIGhlcmUgZnJvbQorCWRidXMtbWFyc2hhbC1iYXNpYy5jOl9kYnVzX3R5cGVfaXNfY29udGFpbmVyLgorCisJQWxsIGNhbGxlcnMgb2YgX2RidXNfdHlwZV9pc19jb250YWluZXIgYW5kIF9kYnVzX3R5cGVfaXNfYmFzaWMKKwl1cGRhdGVkLCBhbmQgaW5jbHVkZSBkYnVzLXNpZ25hdHVyZS5oLgorCisJKiBkYnVzL2RidXMtc2lnbmF0dXJlLmg6IE5ldyBmaWxlOyBwcm90b3R5cGVzIGZvciB0aGUgYWJvdmUuCisKKwkqIGRidXMvTWFrZWZpbGUuYW0gKERCVVNfTElCX1NPVVJDRVMpOiBBZGQgZGJ1cy1zaWduYXR1cmUuYywKKwlkYnVzLXNpZ25hdHVyZS5oLgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5jIChtYXBfdHlwZV9jaGFyX3RvX3R5cGUpOiBOZXcgdXRpbGl0eQorCWZ1bmN0aW9uIGZhY3RvcmVkIG91dCBvZiBfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZS4KKwkoX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmVfY19zdHIpOiBOZXcgZnVuY3Rpb247IHJldHVybnMgZmlyc3QKKwl0eXBlIGNvZGUgZm9yIGEgdHlwZSBzaWduYXR1cmUgY2hhcmFjdGVyLgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5oOiBQcm90b3R5cGUgX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmVfY19zdHIsCisJaGFuZGxlIGZ1bmN0aW9uIG1vdmVzLgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUuaDogRXhwb3J0IF9kYnVzX3R5cGVfc2lnbmF0dXJlX25leHQuCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5jIChfZGJ1c190eXBlX3NpZ25hdHVyZV9uZXh0KTogTmV3CisJZnVuY3Rpb247IHNraXBzIHRvIG5leHQgY29tcGxldGUgdHlwZSBpbiB0eXBlIHNpZ25hdHVyZS4KKwlJbXBsZW1lbnRlZCB1c2luZyBwcmV2aW91cyBza2lwX29uZV9jb21wbGV0ZV90eXBlLiAgTm93CisJc2tpcF9vbmVfY29tcGxldGVfdHlwZSBqdXN0IGRlbGVnYXRlcyB0bworCV9kYnVzX3R5cGVfc2lnbmF0dXJlX25leHQuCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLWJhc2ljLmMgKF9kYnVzX3R5cGVfaXNfYmFzaWMpOiBNb3ZlZAorCXRvIGRidXMtc2lnbmF0dXJlLmMKKwkoX2RidXNfdHlwZV9pc19jb250YWluZXIpOiBEaXR0by4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IFVwZGF0ZSBpbnRyb3NwZWN0aW9uIHNhbXBsZSB0bworCXVzZSByZWFsIHR5cGUgc2lnbmF0dXJlcy4KKworCSogZGJ1cy9kYnVzLXRlc3QuaDogUHJvdG90eXBlIHNpZ25hdHVyZSB0ZXN0LgorCisJKiBkYnVzL2RidXMtdGVzdC5jIChkYnVzX2ludGVybmFsX2RvX25vdF91c2VfcnVuX3Rlc3RzKTogUnVuCisJc2lnbmF0dXJlIHRlc3RzLgorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaCAoREJVU19FUlJPUl9JTlZBTElEX1NJR05BVFVSRSk6IE5ldyBlcnJvci4KKworMjAwNS0wMi0yMyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluIChQZW5kaW5nQ2FsbDo6Z2V0X3JlcGx5KToKKwlzL2RidXNfcGVuZGluZ19jYWxsX2dldF9yZXBseS9kYnVzX3BlbmRpbmdfY2FsbF9zdGVhbF9yZXBseQorCisyMDA1LTAyLTIxICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBkYnVzL2RidXMtdGVzdC1tYWluLmMgKG1haW4pOiBUYWtlIG9wdGlvbmFsIHNwZWNpZmljIHRlc3QKKwlhcmd1bWVudC4KKworCSogZGJ1cy9kYnVzLXRlc3QuYyAocnVuX3Rlc3QpOiBOZXcgZnVuY3Rpb24sIHJ1bnMgYSB0ZXN0IGZ1bmN0aW9uCisJd2l0aCBubyBkYXRhIGRpcmVjdG9yeS4KKwkocnVuX2RhdGFfdGVzdCk6IExpa2UgYWJvdmUsIGJ1dCB0YWtlcyBkYXRhIGRpcmVjdG9yeS4KKwkoZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX3J1bl90ZXN0cyk6IFRha2UKKwlzcGVjaWZpYyB0ZXN0IGFyZ3VtZW50LiAgUmVwbGFjZSBsb3RzIG9mIGN1dCBuJyBwYXN0ZSBjb2RlCisJd2l0aCBydW5fdGVzdCBhbmQgcnVuX2RhdGFfdGVzdC4KKworCSogZGJ1cy9kYnVzLXRlc3QuaDogVXBkYXRlIHByb3RvdHlwZSBmb3IKKwlkYnVzX2ludGVybmFsX2RvX25vdF91c2VfcnVuX3Rlc3RzLgorCisyMDA1LTAyLTIwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworICAgICAgICBGaXggYnVncyByZXBvcnRlZCBieSBEYW5pZWwgUC4gQmVycmFuZ2UKKwkKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYyAoX2RidXNfc2VydmVyX3VucmVmX3VubG9ja2VkKTogbmV3IGZ1bmN0aW9uCisJKHByb3RlY3RlZF9jaGFuZ2Vfd2F0Y2gpOiBuZXcgZnVuY3Rpb24KKwkoX2RidXNfc2VydmVyX3RvZ2dsZV93YXRjaCwgX2RidXNfc2VydmVyX3JlbW92ZV93YXRjaCkKKwkoX2RidXNfc2VydmVyX2FkZF93YXRjaCk6IGNoYW5nZSB0byB3b3JrIGxpa2UgdGhlCisJZGJ1cy1jb25uZWN0aW9uLmMgZXF1aXZhbGVudHM7IGxpa2UgdGhvc2UsIHByb2JhYmx5IGtpbmQgb2YKKwlidXN0ZWQsIGJ1dCBzaG91bGQgYXQgbGVhc3QgbW9zdGx5IHdvcmsgZm9yIG5vdworCShkYnVzX3NlcnZlcl9kaXNjb25uZWN0KTogZHJvcCB0aGUgbG9jayBpZiB3ZSB3ZXJlIGFscmVhZHkKKwlkaXNjb25uZWN0ZWQsIHBhdGNoIGZyb20gRGFuaWVsIFAuIEJlcnJhbmdlCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYyAoX2RidXNfc2VydmVyX3RvZ2dsZV90aW1lb3V0KSAKKwkoX2RidXNfc2VydmVyX3JlbW92ZV90aW1lb3V0LCBfZGJ1c19zZXJ2ZXJfYWRkX3RpbWVvdXQpOiBhbGwgdGhlCisJc2FtZSBzdHVmZgorCisJKiBkb2MvVE9ETzogdG9kbyBhYm91dCB1bnNjcmV3aW5nIHRoaXMgbWVzcworCisyMDA1LTAyLTE5ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYworCShkYnVzX2JpbmRpbmdfdG9vbF9vdXRwdXRfZ2xpYl9zZXJ2ZXIpOiBGaXggaW9jaGFubmVsIHJlZmNvdW50aW5nLgorCisJKiBnbGliL2RidXMtZ2xpYi10b29sLmM6IEluY2x1ZGUgZGJ1cy1nbGliLXRvb2wuaCwgYXMgd2VsbAorCWFzIGVycm5vLmggYW5kIHN5cy9zdGF0LmguCisJKGxvc2UpOiBOZXcgZnVuY3Rpb24sIHByaW50cyBlcnJvciB3aXRoCisJbmV3bGluZSBhbmQgZXhpdHMuCisJKGxvc2VfZ2Vycm9yKTogU2ltaWxhciwgYnV0IHRha2VzIEdFcnJvciBmb3IgbWVzc2FnZS4KKwkobWFpbik6IEFkZCAtLW91dHB1dCBhcmd1bWVudCB0byBzcGVjaWZ5IG91dHB1dCBmaWxlIHRvIHdyaXRlIHRvLAorCWluc3RlYWQgb2YgYWx3YXlzIHByaW50aW5nIHRvIHN0ZG91dC4gIEluIHRoaXMgbW9kZSwgZGV0ZXJtaW5lCisJdGltZXN0YW1wcyBvbiBzb3VyY2UgZmlsZXMgdG8gc2VlIHdoZXRoZXIgYW55IGFyZSBuZXdlciB0aGFuIHRoZQorCXRhcmdldCBmaWxlLiAgSWYgbm90LCBleGl0LiAgQWxzbyBjb252ZXJ0IGEgbnVtYmVyIG9mIGVycm9yCisJbWVzc2FnZXMgdG8gdXNlIGxvc2UgKHNpbmNlIGl0J3Mgc2hvcnRlciksIGFuZCBzd2l0Y2ggdG8gdXNpbmcKKwlnX2lvX2NoYW5uZWxfc2h1dGRvd24uCisKKzIwMDUtMDItMTkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBnbGliL2RidXMtZ29iamVjdC5jCisJKF9kYnVzX2dsaWJfbWFyc2hhbF9kYnVzX21lc3NhZ2VfdG9fZ3ZhbHVlX2FycmF5KTogYWRkIGRvY3MKKworCSogZ2xpYi9kYnVzLWdsaWIuYzogZml4IGRveHlnZW4gd2FybmluZ3MKKworCSogZ2xpYi9kYnVzLWdwYXJzZXIuYyAocGFyc2VfYW5ub3RhdGlvbik6IGVycm9yIGlmIGFuIGFubm90YXRpb24KKwlpcyBmb3VuZCBvbiBhbiA8YXJnPgorCisyMDA1LTAyLTE3ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBnbGliL2RidXMtZ29iamVjdC5oOiBEb24ndCBleHBvcnQKKwlfZGJ1c19nbGliX21hcnNoYWxfZGJ1c19tZXNzYWdlX3RvX2d2YWx1ZV9hcnJheS4KKwkKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKF9kYnVzX2dsaWJfbWFyc2hhbF9kYnVzX21lc3NhZ2VfdG9fZ3ZhbHVlX2FycmF5KTogRG8gcmVuYW1lLgorCShpbnZva2Vfb2JqZWN0X21ldGhvZCk6IEhhbmRsZSBpdC4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChtYXJzaGFsX2RidXNfbWVzc2FnZV90b19nX21hcnNoYWxsZXIpOgorCUhhbmRsZSByZW5hbWUuCisJCisyMDA1LTAyLTE3ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBidXMvLmN2c2lnbm9yZSwgZG9jLy5jdnNpZ25vcmUKKwkqIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLy5jdnNpZ25vcmUsIHRlc3QvZ2xpYi8uY3ZzaWdub3JlOgorCVVwZGF0ZS4KKworMjAwNS0wMi0xNyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKwkKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oIChEQlVTX1NFUlZJQ0VfT1JHX0ZSRUVERVNLVE9QX0RCVVMpOgorCVJlbmFtZSB0byBEQlVTX1NFUlZJQ0VfREJVUy4KKwkoREJVU19QQVRIX09SR19GUkVFREVTS1RPUF9EQlVTKTogUmVuYW1lIHRvIERCVVNfUEFUSF9EQlVTLgorCShEQlVTX1BBVEhfT1JHX0ZSRUVERVNLVE9QX0xPQ0FMKTogUmVuYW1lIHRvIERCVVNfUEFUSF9MT0NBTC4KKwlDaGFuZ2UgdGhlIHZhbHVlIGZyb20gIm9yZy5mcmVlZGVza3RvcC5Mb2NhbCIKKwl0byAib3JnLmZyZWVkZXNrdG9wLkRCdXMuTG9jYWwiLgorCShEQlVTX0lOVEVSRkFDRV9PUkdfRlJFRURFU0tUT1BfREJVUyk6IFJlbmFtZSB0byBEQlVTX0lOVEVSRkFDRV9EQlVTLgorCShEQlVTX0lOVEVSRkFDRV9PUkdfRlJFRURFU0tUT1BfSU5UUk9TUEVDVEFCTEUpOiBSZW5hbWUgdG8KKwlEQlVTX0lOVEVSRkFDRV9JTlRST1NQRUNUQUJMRS4KKwlDaGFuZ2UgdGhlIHZhbHVlIGZyb20gIm9yZy5mcmVlZGVza3RvcC5JbnRyb3NwZWN0YWJsZSIKKwl0byAib3JnLmZyZWVkZXNrdG9wLkRCdXMuSW50cm9zcGVjdGFibGUiLgorCShEQlVTX0lOVEVSRkFDRV9PUkdfRlJFRURFU0tUT1BfUFJPUEVSVElFUyk6IFJlbmFtZSB0bworCURCVVNfSU5URVJGQUNFX1BST1BFUlRJRVMuCisJQ2hhbmdlIHRoZSB2YWx1ZSBmcm9tICJvcmcuZnJlZWRlc2t0b3AuUHJvcGVydGllcyIKKwl0byAib3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllcyIuCisJKERCVVNfSU5URVJGQUNFX09SR19GUkVFREVTS1RPUF9QRUVSKTogUmVuYW1lIHRvCisJREJVU19JTlRFUkZBQ0VfUEVFUi4KKwlDaGFuZ2UgdGhlIHZhbHVlIGZyb20gIm9yZy5mcmVlZGVza3RvcC5QZWVyIgorCXRvICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyIi4KKwkoREJVU19JTlRFUkZBQ0VfT1JHX0ZSRUVERVNLVE9QX0xPQ0FMKTogCisJREJVU19JTlRFUkZBQ0VfTE9DQUwuCisJQ2hhbmdlIHRoZSB2YWx1ZSBmcm9tICJvcmcuZnJlZWRlc2t0b3AuTG9jYWwiCisJdG8gIm9yZy5mcmVlZGVza3RvcC5EQnVzLkxvY2FsIi4KKworCUFsbCBvdGhlciB1c2VycyBvZiB0aG9zZSBjb25zdGFudHMgaGF2ZSBiZWVuIGNoYW5nZWQuCisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfaW50cm9zcGVjdCk6IFVzZSBjb25zdGFudHMuCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGhhbmRsZV9pbnRyb3NwZWN0KTogVXNlIGNvbnN0YW50cy4KKworCSogZG9jL2RidXMtZmFxLnhtbCwgZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IFVwZGF0ZSBmb3IgcmVuYW1lLgorCisyMDA1LTAyLTE3ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBnbGliL2RidXMtZ3BhcnNlci5jIChzdHJ1Y3QgUGFyc2VyKTogQWRkIGluX2Fubm90YXRpb24gYm9vbGVhbi4KKwkocGFyc2Vfbm9kZSwgcGFyc2VfaW50ZXJmYWNlLCBwYXJzZV9tZXRob2QsIHBhcnNlX3NpZ25hbCkKKwkocGFyc2VfcHJvcGVydHksIHBhcnNlX2Fubm90YXRpb24pOiBMb3NlIGlmIHdlJ3JlIGN1cnJlbnRseSBpbiBhbgorCWFubm90YXRpb24uCisJKHBhcnNlX2Fubm90YXRpb24pOiBOZXcgZnVuY3Rpb24uCisJKHBhcnNlcl9zdGFydF9lbGVtZW50LCBwYXJzZXJfZW5kX2VsZW1lbnQpOiBIYW5kbGUgYW5ub3RhdGlvbi4KKwkocGFyc2VfbWV0aG9kLCBwYXJzZV9pbnRlcmZhY2UpOiBSZW1vdmUgc3VwcG9ydCBmb3IgY19uYW1lIGF0dHJpYnV0ZSwKKwlzd2l0Y2ggdG8gYW5ub3RhdGlvbnMuCisKKwkqIGdsaWIvZGJ1cy1naWRsLmggKGludGVyZmFjZV9pbmZvX2dldF9iaW5kaW5nX25hbWVzKQorCShtZXRob2RfaW5mb19nZXRfYmluZGluZ19uYW1lcykKKwkoaW50ZXJmYWNlX2luZm9fZ2V0X2JpbmRpbmdfbmFtZSwgbWV0aG9kX2luZm9fZ2V0X2JpbmRpbmdfbmFtZSkKKwkoaW50ZXJmYWNlX2luZm9fc2V0X2JpbmRpbmdfbmFtZSwgbWV0aG9kX2luZm9fc2V0X2JpbmRpbmdfbmFtZSk6CisJUmVtb3ZlLgorCShpbnRlcmZhY2VfaW5mb19nZXRfYW5ub3RhdGlvbnMsIG1ldGhvZF9pbmZvX2dldF9hbm5vdGF0aW9ucykKKwkoaW50ZXJmYWNlX2luZm9fZ2V0X2Fubm90YXRpb24sIG1ldGhvZF9pbmZvX2dldF9hbm5vdGF0aW9uKQorCShpbnRlcmZhY2VfaW5mb19hZGRfYW5ub3RhdGlvbiwgbWV0aG9kX2luZm9fYWRkX2Fubm90YXRpb24pOgorCVByb3RvdHlwZS4KKworCSogZ2xpYi9kYnVzLWdpZGwuYyAoc3RydWN0IEludGVyZmFjZUluZm8pOiBTdWJzdGl0dXRlICJhbm5vdGF0aW9ucyIKKwlmb3IgImJpbmRpbmdzIi4KKwkoc3RydWN0IE1ldGhvZEluZm8pOiBEaXR0by4KKwlTdHJhaWdodGZvd2FyZCBjb252ZXJzaW9uIG9mIGJpbmRpbmcgbWV0aG9kcyBpbnRvIGFubm90YXRpb24gbWV0aG9kcworCWFzIHByb3RvdHlwZWQuCisKKwkqIGdsaWIvZGJ1cy1nbGliLXRvb2wuYyAocHJldHR5X3ByaW50KTogUHJpbnQgYW5ub3RhdGlvbnMuCisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5oIChEQlVTX0dMSUJfQU5OT1RBVElPTl9DX1NZTUJPTCk6IERlZmluZS4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmMgKGdhdGhlcl9tYXJzaGFsbGVycywgZ2VuZXJhdGVfZ2x1ZSk6CisJVXNlIG5ldyBhbm5vdGF0aW9uIEFQSS4KKworCSogZG9jL2ludHJvc3BlY3QuZHRkOiBGaXggYSBudW1iZXIgb2YgRFREIHN5bnRheCBlcnJvcnMuICBBZGQKKwlhbm5vdGF0aW9uIGVsZW1lbnQuCisJCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogRGlzY3VzcyBpbnRyb3NwZWN0aW9uIGFubm90YXRpb25zLAorCWluY2x1ZGUgbGlzdCBvZiB3ZWxsLWtub3duIGFubm90YXRpb25zLgorCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIueG1sOiBNYWtlIHZhbGlkYXRlIGFnYWluc3QgbmV3IERURC4KKworMjAwNS0wMi0xNyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCVRoaXMgcGF0Y2ggaXMgYmFzZWQgb24gaW5pdGlhbCB3b3JrIGZyb20KKwlQYXVsIEt1bGluaWV3aWN6IDxrdWxpbmlld0BwdXJkdWUuZWR1Pi4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS5jIChkYnVzX2d2YWx1ZV9pbml0KTogTmV3IGZ1bmN0aW9uOyBtb3ZlCisJaW5pdGlhbGl6YXRpb24gb2YgR1ZhbHVlIGZyb20gZGJ1cyB0eXBlIHRvIGhlcmUuCisJKGRidXNfZ3ZhbHVlX2dlbm1hcnNoYWxfbmFtZV9mcm9tX3R5cGUpOiBOZXcgZnVuY3Rpb247IGdlbmVyYXRlcyBhIHN0cmluZworCWZvciB0aGUgImdsaWItZ2VubWFyc2hhbCIgcHJvZ3JhbSBmcm9tIGEgREJ1cyB0eXBlLgorCShkYnVzX2d2YWx1ZV9iaW5kaW5nX3R5cGVfZnJvbV90eXBlKTogTmV3IGZ1bmN0aW9uOyB0dXJucyBhIERCdXMgdHlwZQorCWludG8gdGhlIEMgbmFtZSBmb3IgaXQgd2UgdXNlIGluIHRoZSBnbGliIGJpbmRpbmdzLgorCShkYnVzX2d2YWx1ZV9jdHlwZV9mcm9tX3R5cGUpOiBOZXcgZnVuY3Rpb247IG1hcHMgYSBEQnVzIHR5cGUgaW50byBhCisJZ2xpYiBDIHR5cGUgKG5vdCBHVmFsdWUpLgorCShkYnVzX2d2YWx1ZV9kZW1hcnNoYWwpOiBpbnZva2UgZGJ1c19ndmFsdWVfaW5pdC4KKworCSogZ2xpYi9kYnVzLWd1dGlscy5jIChfZGJ1c19ndXRpbHNfd2luY2Fwc190b191c2NvcmUpOiBNb3ZlZCBoZXJlCisJZnJvbSBkYnVzLWdvYmplY3QuYy4KKworCSogZ2xpYi9kYnVzLWd1dGlscy5oOiBQcm90b3R5cGUgaXQuCisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYzogSW5jbHVkZSBuZXcgZGJ1cy1nb2JqZWN0LmguCisJKG1hcnNoYWxfZGJ1c19tZXNzYWdlX3RvX2dfbWFyc2hhbGxlcik6IFVzZSBuZXcgc2hhcmVkIGZ1bmN0aW9uCisJZGJ1c19nbGliX21hcnNoYWxfZGJ1c19tZXNzYWdlX3RvX2d2YWx1ZV9hcnJheS4KKworCSogZ2xpYi9kYnVzLWdwYXJzZXIuYyAocGFyc2VfaW50ZXJmYWNlLCBwYXJzZV9tZXRob2QpOiBIYW5kbGUgY19uYW1lIGF0dHJpYnV0ZS4KKwlXaWxsIGJlIGNoYW5nZWQgb25jZSB3ZSBoYXZlIGFubm90YXRpb25zLgorCisJKiBnbGliL2RidXMtZ29iamVjdC5jOiBDaGFuZ2UgaW5mb19oYXNoX211dGV4IGZyb20gR1N0YXRpY011dGV4IHRvCisJR1N0YXRpY1JXTG9jay4gIENhbGxlcnMgdXBkYXRlZC4KKwkod2luY2Fwc190b191c2NvcmUpOiBNb3ZlIHRvIGRidXMtZ3V0aWxzLmMuICBDYWxsZXJzIHVwZGF0ZWQuCisJKHN0cmluZ190YWJsZV9uZXh0KTogTmV3IGZ1bmN0aW9uIGZvciBpdGVyYXRpbmcgb3ZlciB6ZXJvLXRlcm1pbmF0ZWQKKwlzdHJpbmcgdmFsdWUgYXJyYXkuCisJKHN0cmluZ190YWJsZV9sb29rdXApOiBOZXcgZnVuY3Rpb247IHJldHJpZXZlcyBzcGVjaWZpYyBlbnRyeSBpbgorCWFycmF5LgorCShnZXRfbWV0aG9kX2RhdGEpOiBOZXcgZnVuY3Rpb247IGxvb2sgdXAgbWV0aG9kIGRhdGEgaW4gb2JqZWN0IGRhdGEgY2h1bmsuCisJKG9iamVjdF9lcnJvcl9kb21haW5fcHJlZml4X2Zyb21fb2JqZWN0X2luZm8pCisJKG9iamVjdF9lcnJvcl9jb2RlX2Zyb21fb2JqZWN0X2luZm8pOiBOZXcgZnVuY3Rpb25zLCBidXQgbm90IGltcGxlbWVudGVkIHlldC4KKwkobWV0aG9kX2ludGVyZmFjZV9mcm9tX29iamVjdF9pbmZvKTogTmV3IGZ1bmN0aW9uOyByZXRyaWV2ZSBpbnRlcmZhY2UgbmFtZS4KKwkobWV0aG9kX25hbWVfZnJvbV9vYmplY3RfaW5mbyk6IE5ldyBmdW5jdGlvbjsgcmV0cmlldmUgbWV0aG9kIG5hbWUuCisJKG1ldGhvZF9hcmdfaW5mb19mcm9tX29iamVjdF9pbmZvKTogTmV3IGZ1bmN0aW9uOyByZXRyaWV2ZSBhcmd1bWVudCBkYXRhLgorCShhcmdfaXRlcmF0ZSk6IE5ldyBmdW5jdGlvbjsgaXRlcmF0ZXMgb3ZlciBzZXJpYWxpemVkIGFyZ3VtZW50IGRhdGEuCisJKG1ldGhvZF9kaXJfc2lnbmF0dXJlX2Zyb21fb2JqZWN0X2luZm8pOiBOZXcgZnVuY3Rpb247IHJldHVybnMgYQorCUdTdHJpbmcgaG9sZGluZyB0eXBlIHNpZ25hdHVyZSBmb3IgYXJndW1lbnRzIGZvciBqdXN0IG9uZQorCWRpcmVjdGlvbiAoaW5wdXQgb3Igb3V0cHV0KS4KKwkobWV0aG9kX2lucHV0X3NpZ25hdHVyZV9mcm9tX29iamVjdF9pbmZvKQorCShtZXRob2Rfb3V0cHV0X3NpZ25hdHVyZV9mcm9tX29iamVjdF9pbmZvKTogTmV3IGZ1bmN0aW9ucy4KKwkoZGJ1c19nbGliX21hcnNoYWxfZGJ1c19tZXNzYWdlX3RvX2d2YWx1ZV9hcnJheSk6IE5ldyBzaGFyZWQgZnVuY3Rpb247CisJY29udmVydHMgZGJ1cyBtZXNzYWdlIGFyZ3VtZW50cyBpbnRvIGEgR1ZhbHVlIGFycmF5LiAgVXNlZCBmb3IgYm90aAorCXNpZ25hbCBoYW5kbGluZyBhbmQgbWV0aG9kIGludm9jYXRpb24uCisJKHN0cnVjdCBEQnVzR2xpYldyaXRlSXRlcmZhY2VEYXRhKTogTmV3IHV0aWxpdHkgc3RydWN0dXJlLgorCSh3cml0ZV9pbnRlcmZhY2UpOiBOZXcgZnVuY3Rpb247IGdlbmVyYXRlIGludHJvc3BlY3Rpb24gWE1MIGZvcgorCWFuIGludGVyZmFjZS4KKwkoaW50cm9zcGVjdF9pbnRlcmZhY2VzKTogTmV3IGZ1bmN0aW9uOyBnYXRoZXJzIGFsbCBpbnRlcmZhY2UtPm1ldGhvZHMsCisJZ2VuZXJhdGVzIGludHJvc3BlY3Rpb24gWE1MIGZvciB0aGVtLgorCShoYW5kbGVfaW50cm9zcGVjdCk6IEludm9rZSBpbnRyb3NwZWN0X2ludGVyZmFjZXMuCisJKGdldF9vYmplY3RfcHJvcGVydHkpOiBCZSBzdXJlIHRvIHplcm8taW5pdGFsaXplIHN0YWNrLWFsbG9jYXRlZCBHVmFsdWUuCisJKGxvb2t1cF9vYmplY3RfYW5kX21ldGhvZCk6IE5ldyBmdW5jdGlvbjsgZXhhbWluZXMgYW4gaW5jb21pbmcgbWVzc2FnZQorCWFuZCBhdHRlbXB0cyB0byBtYXRjaCBpdCB1cCAodmlhIGludGVyZmFjZSwgbWV0aG9kIG5hbWUsIGFuZCBhcmd1bWVudAorCXNpZ25hdHVyZSkgd2l0aCBhIGtub3duIG9iamVjdCBhbmQgbWV0aG9kLgorCShnZXJyb3JfZG9tYWluY29kZV90b19kYnVzX2Vycm9yX25hbWUpOiBOZXcgZnVuY3Rpb247IGNvbnZlcnRzIGEKKwlHRXJyb3IgZG9tYWluIGFuZCBjb2RlIGludG8gYSBEQnVzIGVycm9yIG5hbWUuICBOZWVkcyBHRXJyb3IgZGF0YQorCWFkZGVkIHRvIG9iamVjdCBpbnRyb3NwZWN0aW9uIHRvIHdvcmsgd2VsbC4KKwkoZ2Vycm9yX3RvX2RidXNfZXJyb3JfbWVzc2FnZSk6IENyZWF0ZXMgYSBEQnVzTWVzc2FnZSBlcnJvciByZXR1cm4gZnJvbQorCUdFcnJvci4KKwkoaW52b2tlX29iamVjdF9tZXRob2QpOiBOZXcgZnVuY3Rpb24gdG8gaW52b2tlIGFuIG9iamVjdCBtZXRob2QKKwlsb29rZWQgdXAgdmlhIGxvb2t1cF9vYmplY3RfYW5kX21ldGhvZC4gIFBhcnNlcyB0aGUgaW5jb21pbmcKKwltZXNzYWdlLCB0dXJucyBpdCBpbnRvIGEgR1ZhbHVlIGFycmF5LCB0aGVuIGludm9rZXMgdGhlIG1hcnNoYWxsZXIKKwlzcGVjaWZpZWQgaW4gdGhlIERCdXNHTWV0aG9kSW5mby4gIENyZWF0ZXMgYSBuZXcgbWVzc2FnZSB3aXRoCisJZWl0aGVyIHJldHVybiB2YWx1ZXMgb3IgZXJyb3IgbWVzc2FnZSBhcyBhcHByb3ByaWF0ZS4KKwkoZ29iamVjdF9tZXNzYWdlX2Z1bmN0aW9uKTogSW52b2tlIGxvb2t1cF9vYmplY3RfYW5kX21ldGhvZCBhbmQKKwlpbnZva2Vfb2JqZWN0X21ldGhvZC4KKworCSogZ2xpYi9kYnVzLWdsaWItdG9vbC5jOiBJbmNsdWRlIGRidXMtYmluZGluZy10b29sLWdsaWIuaC4KKwkoZW51bSBEQnVzQmluZGluZ091dHB1dE1vZGUpOiBOZXcgZW51bSBmb3IgYmluZGluZyBvdXRwdXQgbW9kZXMuCisJKHByZXR0eV9wcmludCk6IFByaW50IGJpbmRpbmcgbmFtZXMuCisJKGRidXNfYmluZGluZ190b29sX2Vycm9yX3F1YXJrKTogR0Vycm9yIGJpdHMuCisJKHZlcnNpb24pOiBGaXggdHlwby4KKwkobWFpbik6IENyZWF0ZSBHSU9DaGFubmVsIGZvciBvdXRwdXQuICBQYXJzZSBuZXcgLS1tb2RlIGFyZ3VtZW50LAorCXBvc3NpYmxlIHZhbHVlcyBhcmUgInByZXR0eS1wcmludCIsICJnbGliLXNlcnZlciIsICJnbGliLWNsaWVudCIuCisJVXNlIG1vZGUgdG8gaW52b2tlIGFwcHJvcHJpYXRlIGZ1bmN0aW9uLgorCQorCSogZ2xpYi9kYnVzLWdvYmplY3QuaDogUHJvdG90eXBlIGRidXNfZ2xpYl9tYXJzaGFsX2RidXNfbWVzc2FnZV90b19ndmFsdWVfYXJyYXkuCisKKwkqIGdsaWIvZGJ1cy1nbGliLXRvb2wuaDogTmV3IGhlYWRlciwganVzdCBpbmNsdWRlcyBHRXJyb3IgYml0cworCWZvciBub3cuCisKKwkqIGdsaWIvZGJ1cy1naWRsLmMgKHN0cnVjdCBJbnRlcmZhY2VJbmZvKTogQWRkIGJpbmRpbmdzIGhhc2h0YWJsZTsKKwltYXBzIGJpbmRpbmcgc3R5bGUgdG8gbmFtZS4KKwkoc3RydWN0IE1ldGhvZEluZm8pOiBEaXR0by4KKwkoZ2V0X2hhc2hfa2V5cywgZ2V0X2hhc2hfa2V5KTogVXRpbGl0eSBmdW5jdGlvbiwgcmV0dXJucyBrZXlzIGZvcgorCWEgR0hhc2hUYWJsZS4KKwkoaW50ZXJmYWNlX2luZm9fbmV3LCBtZXRob2RfaW5mb19uZXcpOiBJbml0aWFsaXplIGJpbmRpbmdzLgorCShpbnRlcmZhY2VfaW5mb191bnJlZiwgbWV0aG9kX2luZm9fdW5yZWYpOiBEZXN0cm95IGJpbmRpbmdzLgorCShtZXRob2RfaW5mb19nZXRfYmluZGluZ19uYW1lcywgbWV0aG9kX2luZm9fZ2V0X2JpbmRpbmdfbmFtZSkKKwkoaW50ZXJmYWNlX2luZm9fZ2V0X2JpbmRpbmdfbmFtZXMsIGludGVyZmFjZV9pbmZvX2dldF9iaW5kaW5nX25hbWUpOgorCUZ1bmN0aW9ucyBmb3IgcmV0cmlldmluZyBiaW5kaW5nIG5hbWVzLgorCShtZXRob2RfaW5mb19zZXRfYmluZGluZ19uYW1lLCBpbnRlcmZhY2VfaW5mb19zZXRfYmluZGluZ19uYW1lKToKKwlGdW5jdGlvbnMgZm9yIHNldHRpbmcgYmluZGluZyBuYW1lcy4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmg6IE5ldyBmaWxlLCBoYXMgcHJvdG90eXBlcworCWZvciBnbGliIGJpbmRpbmcgZ2VuZXJhdGlvbi4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmM6IE5ldyBmaWxlLCBpbXBsZW1lbnRzIHNlcnZlci1zaWRlCisJYW5kIGNsaWVudC1zaWRlIGdsaWIgZ2x1ZSBnZW5lcmF0aW9uLgorCisJKiBnbGliL01ha2VmaWxlLmFtIChkYnVzX2JpbmRpbmdfdG9vbF9TT1VSQ0VTKTogQWRkCisJZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5jLCBkYnVzLWJpbmRpbmctdG9vbC1nbGliLmgsCisJZGJ1cy1nbGliLXRvb2wuaC4KKworCSogZGJ1cy9kYnVzLWdsaWIuaCAoc3RydWN0IERCdXNHTWV0aG9kTWFyc2hhbGxlcik6IFJlbW92ZSBpbiBmYXZvcgorCW9mIHVzaW5nIEdDbG9zdXJlTWFyc2hhbCBkaXJlY3RseS4KKwkoc3RydWN0IERCdXNHT2JqZWN0SW5mbyk6IEFkZCBuX2luZm9zIG1lbWJlci4KKworCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLnhtbDogTmV3IGZpbGU7IGNvbnRhaW5zIGludHJvc3BlY3Rpb24gZGF0YQorCWZvciBNeVRlc3RPYmplY3QgdXNlZCBpbiB0ZXN0LXNlcnZpY2UtZ2xpYi5jLgorCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYyAoZW51bSBNeU9iamVjdEVycm9yKTogTmV3IEdFcnJvciBlbnVtLgorCShteV9vYmplY3RfZG9fbm90aGluZywgbXlfb2JqZWN0X2luY3JlbWVudCwgbXlfb2JqZWN0X3Rocm93X2Vycm9yKQorCShteV9vYmplY3RfdXBwZXJjYXNlLCBteV9vYmplY3RfbWFueV9hcmdzKTogTmV3IHRlc3QgbWV0aG9kcy4KKwkobWFpbik6IFVzZSBkYnVzX2dfb2JqZWN0X2NsYXNzX2luc3RhbGxfaW5mbyB0byBpbmNsdWRlIGdlbmVyYXRlZCBvYmplY3QKKwlpbmZvLgorCisJKiB0ZXN0L2dsaWIvTWFrZWZpbGUuYW06IEdlbmVyYXRlIHNlcnZlci1zaWRlIGdsdWUgZm9yIHRlc3Qtc2VydmljZS1nbGliLmMsCisJYXMgd2VsbCBhcyBjbGllbnQtc2lkZSBiaW5kaW5ncy4KKworCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmM6IEluY2x1ZGUgdGVzdC1zZXJ2aWNlLWdsaWItYmluZGluZ3MuaC4KKwkobWFpbik6IEFjdGl2YXRlIFRlc3RTdWl0ZUdMaWJTZXJ2aWNlOyB0ZXN0IGludm9rZSBhIGJ1bmNoIG9mIGl0cyBtZXRob2RzCisJdXNpbmcgYm90aCB0aGUgZGJ1c19ncHJveHkgc3R1ZmYgZGlyZWN0bHkgYXMgd2VsbCBhcyB0aGUgZ2VuZXJhdGVkIGJpbmRpbmdzLgorCisyMDA1LTAyLTE1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKTogYWx3YXlzCisJY29tcGxldGUgYSBwZW5kaW5nIGNhbGwsIGRvbid0IHJ1biBmaWx0ZXJzIGZpcnN0LgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmMgKGRidXNfZ19wcm94eV9lbmRfY2FsbCk6IGNoYW5nZSB0byB1c2UKKwlkYnVzX3BlbmRpbmdfY2FsbF9zdGVhbF9yZXBseQorCisJKiBkYnVzL2RidXMtcGVuZGluZy1jYWxsLmMgKGRidXNfcGVuZGluZ19jYWxsX2Jsb2NrKToganVzdCBjYWxsCisJX2RidXNfY29ubmVjdGlvbl9ibG9ja19wZW5kaW5nX2NhbGwKKwkoZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X3JlcGx5KTogY2hhbmdlIHRvIHN0ZWFsX3JlcGx5IGFuZCByZXR1cm4gYQorCXJlZgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jCisJKGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKTogcG9ydCB0byB3b3JrIGluIHRlcm1zCisJb2YgREJ1c1BlbmRpbmdDYWxsCisJKF9kYnVzX2Nvbm5lY3Rpb25fYmxvY2tfcGVuZGluZ19jYWxsKTogcmVwbGFjZSBibG9ja19mb3JfcmVwbHkKKwl3aXRoIHRoaXMKKworMjAwNS0wMi0xNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy11c2VyZGItdXRpbC5jIChfZGJ1c191c2VyX2RhdGFiYXNlX2xvb2t1cF9ncm91cCk6CisJcHJvcGVybHkgaGFuZGxlIGxvb2tpbmcgdXAgZ3JvdXAgaW5mb3JtYXRpb24gYnkgbmFtZTsgZml4IAorCWZyb20gakBib290bGFiLm9yZworCisyMDA1LTAyLTEzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX3JldHVybl9tZXNzYWdlKSAKKwkoZGJ1c19jb25uZWN0aW9uX2JvcnJvd19tZXNzYWdlKTogaG9sZCBkaXNwYXRjaCBsb2NrIHdoaWxlIG1lc3NhZ2UKKwlpcyBvdXRzdGFuZGluZworCShfZGJ1c19jb25uZWN0aW9uX2Jsb2NrX2Zvcl9yZXBseSk6IGhvbGQgZGlzcGF0Y2ggbG9jayB3aGlsZSB3ZQorCWJsb2NrIGZvciB0aGUgcmVwbHksIHNvIG5vYm9keSBzdGVhbHMgb3VyIHJlcGx5CisJKGRidXNfY29ubmVjdGlvbl9wb3BfbWVzc2FnZSk6IGhvbGQgdGhlIGRpc3BhdGNoIGxvY2sgd2hpbGUgd2UKKwlwbHVjayB0aGUgbWVzc2FnZQorCisyMDA1LTAyLTEzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoX2RidXNfY29ubmVjdGlvbl9hY3F1aXJlX2Rpc3BhdGNoKQorCShfZGJ1c19jb25uZWN0aW9uX3JlbGVhc2VfZGlzcGF0Y2gpCisJKF9kYnVzX2Nvbm5lY3Rpb25fYWNxdWlyZV9pb19wYXRoKQorCShfZGJ1c19jb25uZWN0aW9uX3JlbGVhc2VfaW9fcGF0aCk6IG1ha2UgdGhlIG11dGV4IGFuZCBjb25kdmFyCisJY29udHJvbCBhY2Nlc3MgdG8gdGhlICJhY3F1aXJlZCIgZmxhZy4gRHJvcCB0aGUgY29ubmVjdGlvbiBsb2NrCisJd2hpbGUgd2FpdGluZyBvbiB0aGUgY29uZHZhci4gSG9wZWZ1bGx5IHRoZXNlIGFyZSBiYWJ5IHN0ZXBzIGluCisJcm91Z2hseSB0aGUgcmlnaHQgZGlyZWN0aW9uLgorCisyMDA1LTAyLTEzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzogdXNlIHNlcGFyYXRlIG11dGV4ZXMgZm9yIHRoZSBjb25kaXRpb24KKwl2YXJpYWJsZXM7IHRoaXMgaXMgc29tZSBraW5kIG9mIGJhc2VsaW5lIGZvciBzYW5pdHksIGJ1dCB0aGUKKwljb25kaXRpb24gdmFyaWFibGVzIHN0aWxsIGFyZW4ndCB1c2VkIGNvcnJlY3RseSBhZmFpY3QKKworMjAwNS0wMi0xMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1vYmplY3QtdHJlZS5jIChoYW5kbGVfZGVmYXVsdF9pbnRyb3NwZWN0X2FuZF91bmxvY2spOgorCWZpeCBhIGRvdWJsZS11bmxvY2sKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYworCShfZGJ1c19jb25uZWN0aW9uX2RldGFjaF9wZW5kaW5nX2NhbGxfdW5sb2NrZWQpOiBhZGQgdGhpcworCisgICAgICAgIEluaXRpYWwgc2VtaS1jb3JyZWN0IHBhc3MgdGhyb3VnaCB0byBmaXggdGhyZWFkIGxvY2tpbmc7IHRoZXJlIGFyZQorCXN0aWxsIHNvbWUgaXNzdWVzIHdpdGggdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBwYXRocyBJJ20gcHJldHR5CisJc3VyZQorCQorCSogZGJ1cy9kYnVzLXNlcnZlci5jOiBhZGQgYSBtdXRleCBvbiBEQnVzU2VydmVyIGFuZCBhcHByb3ByaWF0ZQorCWxvY2svdW5sb2NrIGNhbGxzCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKF9kYnVzX2Nvbm5lY3Rpb25fZG9faXRlcmF0aW9uX3VubG9ja2VkKToKKwlyZW5hbWUgdG8gYWRkIF91bmxvY2tlZAorCShzdHJ1Y3QgREJ1c0Nvbm5lY3Rpb24pOiBtb3ZlICJkaXNwYXRjaF9hY3F1aXJlZCIgYW5kCisJImlvX3BhdGhfYWNxdWlyZWQiIHRvIHVzZSBvbmx5IG9uZSBiaXQgZWFjaC4KKwkoQ09OTkVDVElPTl9MT0NLLCBDT05ORUNUSU9OX1VOTE9DSyk6IGFkZCBjaGVja3Mgd2l0aCAhREJVU19ESVNBQkxFX0NIRUNLUworCShkYnVzX2Nvbm5lY3Rpb25fc2V0X3dhdGNoX2Z1bmN0aW9ucyk6IGhhY2t5IGZpeCB0byByZWVudHJhbmN5CisJKF9kYnVzX2Nvbm5lY3Rpb25fYWRkX3dhdGNoLCBfZGJ1c19jb25uZWN0aW9uX3JlbW92ZV93YXRjaCkgCisJKF9kYnVzX2Nvbm5lY3Rpb25fdG9nZ2xlX3dhdGNoLCBfZGJ1c19jb25uZWN0aW9uX2FkZF90aW1lb3V0KSAKKwkoX2RidXNfY29ubmVjdGlvbl9yZW1vdmVfdGltZW91dCkgCisJKF9kYnVzX2Nvbm5lY3Rpb25fdG9nZ2xlX3RpbWVvdXQpOiBkcm9wIGxvY2sgd2hlbiBjYWxsaW5nIG91dCB0bworCXVzZXIgZnVuY3Rpb25zOyBkb25lIGluIGEgaGFja3kvYmFkIHdheS4KKwkoX2RidXNfY29ubmVjdGlvbl9zZW5kX2FuZF91bmxvY2spOiBhZGQgYSBtaXNzaW5nIHVubG9jaworCShfZGJ1c19jb25uZWN0aW9uX2Jsb2NrX2Zvcl9yZXBseSk6IGFkZCBhIG1pc3NpbmcgdW5sb2NrCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYyAoX2RidXNfdHJhbnNwb3J0X2dldF9pc19hdXRoZW50aWNhdGVkKToKKwlkcm9wIGxvY2sgaW4gYSBoYWNreSBwcm9iYWJseSB1bnNhZmUgd2F5IHRvIGNhbGwgb3V0IHRvIHVzZXIKKwlmdW5jdGlvbgorCisyMDA1LTAyLTEyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy10cmVlLXZpZXcuYyAoaW5mb19zZXRfZnVuY190ZXh0KTogZGlzcGxheSBtb3JlCisJZGV0YWlscyBvbiBhcmdzCisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfbGlzdF9zZXJ2aWNlcyk6IGxpc3QgdGhlIGJ1cworCWRyaXZlcgorCisJKiBnbGliL2RidXMtZ3BhcnNlci5jIChwYXJzZV9hcmcpOiBnZW5lcmF0ZSBhbiBhcmcgbmFtZSBpZiBub25lIGlzIHN1cHBsaWVkCisKKwkqIGdsaWIvZGJ1cy1naWRsLmMgKHNpZ25hbF9pbmZvX2dldF9uX2FyZ3MpOiBuZXcgZnVuY3Rpb24KKwkobWV0aG9kX2luZm9fZ2V0X25fYXJncyk6IG5ldyBmdW5jdGlvbgorCisyMDA1LTAyLTEyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2hhbmRsZV9pbnRyb3NwZWN0KTogYWRkIGludHJvc3BlY3Rpb24KKwlmb3IgYnVzIGRyaXZlcgorCisyMDA1LTAyLTEyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL2RyaXZlci5jOiBwdXQgdGhlIHNpZ25hdHVyZSBvZiBlYWNoIGJ1cyBkcml2ZXIgbWV0aG9kIGluIHRoZQorCXRhYmxlIG9mIGhhbmRsZXJzIGFuZCBjaGVjayBpdCBvbiBpbmNvbWluZyBjYWxsczsgdGhpcyBpc24ndAorCXJlYWxseSB1c2VmdWwsIGJ1dCBnb2luZyB0byBhZGQgaW50cm9zcGVjdCBzdXBwb3J0IGluIGEgbWludXRlLgorCisyMDA1LTAyLTExICBKb2UgU2hhdyAgPGpvZXNoYXdAbm92ZWxsLmNvbT4KKworCSogbW9uby9Db25uZWN0aW9uLmNzOiBUaGUgdW5wcmVkaWN0YWJpbGl0eSBvZiBmaW5hbGl6ZXJzIGluIG1vbm8KKwlwcmV2ZW50cyB1cyBmcm9tIGRldGVybWluaXN0aWNhbGx5IGRpc2Nvbm5lY3RpbmcgdGhlIGZpbHRlcnMgZnJvbQorCXRoZSBTZXJ2aWNlIGNsYXNzJ3MgZmluYWxpemVyLCBzbyBtb3ZlIHRyYWNraW5nIG9mIGZpbHRlcnMgYW5kCisJbWF0Y2hlcyBoZXJlLiAgQWRkIEFQSSBmb3IgdGhhdC4KKworCSogbW9uby9TZXJ2aWNlLmNzOiBSZW1vdmUgdGhlIGNvZGUsIGFkZCBjb2RlIHdoaWNoIGNhbGxzIHRoZQorCW1ldGhvZHMgbm93IG9uIHRoZSBDb25uZWN0aW9uIGNsYXNzLgorCisyMDA1LTAyLTExICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vZGJ1cy5weSAoY2xhc3MgU2VuZGVyKTogYWRkZWQgdG8gc3VwcG9ydCBkYnVzIHNpZ25hbHMgYmV0dGVyCisJKEJ1czo6YWRkX3NpZ25hbF9yZWNlaXZlcik6IGFkZGVkIGV4cGFuZF9hcmdzIHBhcmFtZXRlciB3aGljaCBkZWZhdWx0cworCXRvIFRydWUuICBXaGVuIGV4cGFuZCBhcmdzIGlzIFRydWUgdGhlIHNpZ25hbCBoYW5kbGVyIHdpbGwgcGFzcyB0aGUgCisJbWVzc2FnZSBhcmd1bWVudHMgYXMgcGFyYW1ldGVycyB0byB0aGUgc2lnbmFsIGhhbmRsZXIuICBJZiBGYWxzZQorCXJldmVydCB0byBwcmV2aW91cyBiZWhhdmlvciB3aGVyZSB0aGUgc2lnbmFsIGhhbmRsZXIgbXVzdCBnZXQgdGhlCisJYXJndW1lbnQgbGlzdCBmcm9tIHRoZSBtZXNzYWdlLiAgVGhpcyBpcyB0byBoZWxwIHBvcnQgYXBwbGljYXRpb25zCisJbGlrZSBIQUwgdGhhdCBoYXZlIGEgdGVuZGFuY3kgdG8gc2VuZCB2YXJpYWJsZSBsZW5ndGggYXJndW1lbnQgbGlzdHMuCisJc2VsZi5fbWF0Y2hfcnVsZV90b19yZWNlaXZlcnMgaXMgbm93IGEgZGljdCBvZiBkaWN0cy4KKwkoQnVzOjpyZW1vdmVfc2lnbmFsX3JlY2VpdmVyKTogcG9wIGhhbmRsZXIgb2ZmIHRoZSBkaWN0IGludGVhZCBvZiAKKwlyZW1vdmluZyBpdCBmcm9tIGEgbGlzdAorCShCdXM6Ol9zaWduYWxfZnVuYyk6IGNoYW5nZSBzaWduYWwgaGFuZGxlcnMgc28gdGhhdCBpbnRlcmZhY2UsCisJc2lnbmFsX25hbWUsIHNlcnZpY2UsIHBhdGggYW5kIG1lc3NhZ2UgYXJlIHBhY2tlZCBpbnRvIGEgU2VuZGVyCisJb2JqZWN0IGFuZCB0aGF0IGlzIHBhc3NlZCB0byB0aGUgaGFuZGxlci4gIElmIGV4cGFuZF9hcmdzIGlzIFRydWUKKwlleHRyYWN0IHRoZSBhcmdzIGxpc3QgZnJvbSB0aGUgbWVzc2FnZSBhbmQgYXBwZW5kIGl0IHRvIHRoZSBwYXJhbWV0ZXIKKwlsaXN0CisJCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXguaW4gKGNsYXNzIFNpZ25hdHVyZSk6IGFkZGVkIHRvIHN1cHBvcnQgCisJc2lnbmlhdHVyZSB0eXBlcworCShNZXNzYWdlSXRlcjo6X19pbml0X18pOiBjaGFuZ2VkIGl0ZXJhdGlvbiBsaW1pdCB0byBtYXRjaCBELUJVUworCShNZXNzYWdlSXRlcjo6Z2V0Kik6IGFkZGVkIElOVDE2LCBVSU5UMTYsIFNJR05BVFVSRSwgRElDVF9FTlRSWSwgCisJU1RSVUNUIGFuZCBWQVJJRU5UIHR5cGUgc3VwcG9ydAorCShNZXNzYWdlSXRlcjo6cHl0aG9uX3ZhbHVlX3RvX2RidXNfc2lnKTogbWFkZSByZWN1cnNpdmUgdG8gc3VwcG9ydAorCXJlY3Vyc2l2ZSB0eXBlcworCShNZXNzYWdlSXRlcjo6YXBwZW5kKik6IGFkZGVkIFNpZ25hdHVyZSwgZGljdCwgdHVwbGUgCisJc3VwcG9ydAorCisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1jbGllbnQucHk6IGFkZGVkIGV4YW1wbGVzIG9mIGdldHRpbmcgdHVwbGVzCisJYW5kIGRpY3RzCisKKwkqIHB5dGhvbi9leGFtcGxlcy9leGFtcGxlLXNlcnZpY2UucHk6IGFkZGVkIGV4YW1wbGVzIG9mIHNlbmRpbmcgdHVwbGVzCisJYW5kIGRpY3RzCisKKwkqIHB5dGhvbi9leGFtcGxlcy9leGFtcGxlLXNpZ25hbC1yZWNpcGllbnQucHk6IEZpeGVkIHRvIGhhbmRsZSBuZXcKKwlzaWduYWwgY2FsbGJhY2sgZm9ybWF0CisKKzIwMDUtMDItMTAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0ZXN0L2dsaWIvdGVzdC1kYnVzLWdsaWIuYyAobWFpbik6IGZpeCBzbyB0aGlzIHRlc3QgZG9lc24ndCBmYWlsCisJKGNhbGwgZGJ1c19nX3Byb3h5X2FkZF9zaWduYWwpCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItdW5peC5jIChfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl90Y3Bfc29ja2V0KToKKwllc2NhcGUgdGhlIGhvc3RuYW1lCisJKF9kYnVzX3NlcnZlcl9uZXdfZm9yX2RvbWFpbl9zb2NrZXQpOiBlc2NhcGUgdGhlIHBhdGgKKworCSogZGJ1cy9kYnVzLWFkZHJlc3MuYyAoZGJ1c19hZGRyZXNzX2VzY2FwZV92YWx1ZSk6IG5ldworCShkYnVzX2FkZHJlc3NfdW5lc2NhcGVfdmFsdWUpOiBuZXcKKwkoZGJ1c19wYXJzZV9hZGRyZXNzKTogdW5lc2NhcGUgdmFsdWVzCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlX2FzX2hleCk6IG5ldyBmdW5jdGlvbgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogZXhwbGFpbiBob3cgdG8gZXNjYXBlIHZhbHVlcyBpbgorCWFkZHJlc3NlcworCisyMDA1LTAyLTEwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtZmFjdG9yeS5jIChnZW5lcmF0ZV9zcGVjaWFsKTogbW9kaWZ5IHRlc3QgdG8KKwlhdm9pZCB1c2luZyBhIG5vbi1iYXNpYyBkaWN0IGtleQorCisJKiBkYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS11dGlsLmM6IGFkZCB0ZXN0IGZvciB0aGUgYmVsb3cKKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IHJlcXVpcmUgdGhhdCBkaWN0IGtleXMgYXJlIGEgYmFzaWMKKwl0eXBlCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmMKKwkoX2RidXNfdmFsaWRhdGVfc2lnbmF0dXJlX3dpdGhfcmVhc29uKTogcmVxdWlyZSB0aGF0IGRpY3Qga2V5IGlzIGEKKwliYXNpYyB0eXBlCisKKzIwMDUtMDItMTAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtb2JqZWN0LXRyZWUuYyAoaGFuZGxlX2RlZmF1bHRfaW50cm9zcGVjdF9hbmRfdW5sb2NrKToKKwljaGFuZ2UgdG8gYmUgX2FuZF91bmxvY2sgaW5zdGVhZCBvZiBfdW5sb2NrZWQKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYworCShfZGJ1c19jb25uZWN0aW9uX3NlbmRfcHJlYWxsb2NhdGVkX3VubG9ja2VkX25vX3VwZGF0ZSk6IHJlbmFtZSB0bworCWhhdmUgbm9fdXBkYXRlIHNvIHdlIGNhbiBmaW5kIHRoaXMgYnVnIHF1aWNrbHkgaW4gZnV0dXJlCisKKzIwMDUtMDItMTAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS11dGlsLmMgKHZlcmlmeV90ZXN0X21lc3NhZ2UpOiB0ZXN0cyBmb3Igc3RyaW5nCisJYXJyYXkKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzX3ZhbGlzdCk6IGFkZAorCXN1cHBvcnQgZm9yIGFycmF5cyBvZiBzdHJpbmcvc2lnbmF0dXJlL3BhdGgKKworMjAwNS0wMi0xMCAgSm9lIFNoYXcgIDxqb2VzaGF3QG5vdmVsbC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMKKwkoX2RidXNfY29ubmVjdGlvbl9xdWV1ZV9yZWNlaXZlZF9tZXNzYWdlX2xpbmssCisJX2RidXNfY29ubmVjdGlvbl9tZXNzYWdlX3NlbnQpOiBBZGQgdGhlIHBhdGggdG8KKwl0aGUgdmVyYm9zZSBvdXRwdXQuCisJKF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF9wcmVhbGxvY2F0ZWRfYW5kX3VubG9jayk6IEFkZGVkLiAgQ2FsbHMKKwlfZGJ1c19jb25uZWN0aW9uX3NlbmRfcHJlYWxsb2NhdGVkX3VubG9ja2VkKCksIHVwZGF0ZWQgdGhlCisJZGlzcGF0Y2ggc3RhdHVzLCBhbmQgdW5sb2Nrcy4gIEZpeGVzIGEgYnVnIHdoZXJlIGNlcnRhaW4KKwlzaXR1YXRpb25zIChsaWtlIGEgYnJva2VuIHBpcGUpIGNvdWxkIGNhdXNlIGEgRGlzY29ubmVjdCBtZXNzYWdlCisJdG8gbm90IGJlIHNlbnQsIHRyaWNraW5nIHRoZSBidXMgaW50byB0aGlua2luZyBhIHNlcnZpY2Ugd2FzIHN0aWxsCisJdGhlcmUgd2hlbiB0aGUgcHJvY2VzcyBoYWQgcXVpdC4KKwkoX2RidXNfY29ubmVjdGlvbl9zZW5kX3ByZWFsbG9jYXRlZCk6IENhbGwKKwlfZGJ1c19jb25uZWN0aW9uX3NlbmRfcHJlYWxsb2NhdGVkX2FuZF91bmxvY2soKS4KKwkoX2RidXNfY29ubmVjdGlvbl9zZW5kX2FuZF91bmxvY2spOiBBZGRlZC4gIENhbGxzCisJX2RidXNfY29ubmVjdGlvbl9zZW5kX3ByZWFsbG9jYXRlZF9hbmRfdW5sb2NrKCkuCisJKGRidXNfY29ubmVjdGlvbl9zZW5kKTogQ2FsbCBfZGJ1c19jb25uZWN0aW9uX3NlbmRfYW5kX3VubG9jaygpLgorCShkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5KTogVXBkYXRlIHRoZSBkaXNwYXRjaCBzdGF0dXMgYW5kCisJdW5sb2NrLgorCisJKiBtb25vL1NlcnZpY2UuY3MgKH5TZXJ2aWNlKTogQWRkZWQuICBSZW1vdmVzIHRoZSBmaWx0ZXIgc28gdGhhdAorCXdlIGRvbid0IGdldCB1bm1hbmFnZWQgY29kZSBjYWxsaW5nIGJhY2sgaW50byBhIEdDZWQgZGVsZWdhdGUuCisJKFJlbW92ZUZpbHRlcik7IEFkZGVkLgorCisyMDA1LTAyLTA5ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lcik6CisJLSBSZW1vdmVkIGNoZWNrIGZvciBpdGVyYXRvciB0eXBlIGJlaW5nIGFuIGFycmF5IGJlY2F1c2UKKwlnZXRfYXJnX3R5cGUgZG9lcyBub3Qgd29yayB3aXRoIHdyaXRlciBpdGVyYXRvcnMKKwktIFBhc3MgTlVMTCB0byBfZGJ1c190eXBlX3dyaXRlcl9yZWN1cnNlIGlmIHNpZ25pdHVyZSBpcyBOVUxMCisKKzIwMDUtMDItMDcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogc29tZSBtb3JlIGxhbmd1YWdlIGNsZWFudXBzOyBhZGQKKwlzdHVmZiBhYm91dCBob3cgdG8gZGVhbCB3aXRoIGludmFsaWQgcHJvdG9jb2wgYW5kIGV4dGVuc2lvbgorCXBvaW50czsgYWRkIF8gdG8gYWxsb3dlZCBjaGFycyBpbiBhdXRoIGNvbW1hbmRzOyBhZGQgRVhURU5TSU9OXworCWF1dGggY29tbWFuZCBwcmVmaXgKKworMjAwNS0wMi0wNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHMvZXhwZWN0ZWQvcmVxdWlyZWQvIGluIGEgY291cGxlIHBsYWNlcyBmb3IgY2xhcml0eQorCisyMDA1LTAyLTA3ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBidXMvc2VsaW51eC5jIChidXNfc2VsaW51eF9hbGxvd3Nfc2VuZCk6IEhhbmRsZSBOVUxMIGZvcgorCXNlbmRlciBvciBwcm9wb3NlZF9yZWNpcGllbnQuCisKKzIwMDUtMDItMDYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS1mYWN0b3J5LmMgKGdlbmVyYXRlX3NwZWNpYWwpOiBtb3JlIHRlc3RzCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmMgKHZhbGlkYXRlX2JvZHlfaGVscGVyKTogZGV0ZWN0CisJYXJyYXkgbGVuZ3RoIHRoYXQgZXhjZWVkcyB0aGUgbWF4aW11bQorCisyMDA1LTAyLTA1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtZmFjdG9yeS5jIChnZW5lcmF0ZV9zcGVjaWFsKTogbW9yZSB0ZXN0IGNhc2VzLAorCWluY3JlYXNpbmcgY292ZXJhZ2UKKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtdmFsaWRhdGUuYyAodmFsaWRhdGVfYm9keV9oZWxwZXIpOiByZXR1cm4gdGhlCisJcmVhc29uIHdoeSBhIHNpZ25hdHVyZSB3YXMgaW52YWxpZAorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1oZWFkZXIuYyAobG9hZF9hbmRfdmFsaWRhdGVfZmllbGQpOiBmaXggdG8KKwlza2lwIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBiZWZvcmUgd2UgbG9vayBhdCBpdCBpbiB2YWxpZGF0aW9uCisKKwkqIGRidXMvZGJ1cy1zdHJpbmctdXRpbC5jIChfZGJ1c19zdHJpbmdfdGVzdCk6IGFkZCB0ZXN0cyBmb3IKKwllcXVhbF9zdWJzdHJpbmcKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoX2RidXNfbWVzc2FnZV9sb2FkZXJfbmV3KTogZGVmYXVsdAorCW1heF9tZXNzYWdlX2xlbmd0aCB0byBEQlVTX01BWElNVU1fTUVTU0FHRV9MRU5HVEgKKworMjAwNS0wMi0wNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmMgKHZhbGlkYXRlX2JvZHlfaGVscGVyKTogZml4IGNyYXNoCisJaWYgdGhlIHNpZ25hdHVyZSBvZiBhIHZhcmlhbnQgd2FzIGVtcHR5CisJKF9kYnVzX3ZhbGlkYXRlX3NpZ25hdHVyZV93aXRoX3JlYXNvbik6IGNhdGNoICIoYSkiIChhcnJheSBpbnNpZGUKKwlzdHJ1Y3Qgd2l0aCBubyBlbGVtZW50IHR5cGUpCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWZhY3RvcnkuYyAoZ2VuZXJhdGVfdWludDMyX2NoYW5nZWQpOiBhZGQgbW9yZQorCW1hbmdsZWQgbWVzc2FnZXMgdG8gYnJlYWsgdGhpbmdzCisKKzIwMDUtMDItMDQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmMgKGRidXNfZ19wcm94eV9kaXNjb25uZWN0X3NpZ25hbCk6IHVzZQorCWdfcXVhcmtfdHJ5X3N0cmluZygpIHNvIGl0IGFjdHVhbGx5IGNhbiByZXR1cm4gMAorCShkYnVzX2dfcHJveHlfY29ubmVjdF9zaWduYWwpOiBkaXR0bworCisyMDA1LTAyLTA0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dfcHJveHlfZW1pdF9yZW1vdGVfc2lnbmFsKTogZml4IGEKKwlib2d1cyB3YXJuaW5nCisJKHRyaXN0cmluZ19mcm9tX21lc3NhZ2UpOiBhc3NlcnQgY2xlYW5seSBvbiBudWxsIHBhdGgvaW50ZXJmYWNlCisJKHNob3VsZCBub3QgYmUgcG9zc2libGUgdGhvdWdoIEkgZGVjaWRlZCBsYXRlcikKKwkoZGJ1c19nX3Byb3h5X2Rpc3Bvc2UpOiBtb3ZlIHByb3h5IG1hbmFnZXIgdW5yZWdpc3RyYXRpb24gaGVyZQorCShEQlVTX0dfUFJPWFlfREVTVFJPWUVEKTogYWRkIHRoaXMgbWFjcm8sIGFuZCB1c2UgaXQgaW4gYSBidW5jaCBvZgorCWdfcmV0dXJuX2lmX2ZhaWwoKSBjaGVja3MKKworMjAwNS0wMi0wNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9NYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IGFkZCBEVERzIHRvIG1ha2VmaWxlCisKKwkqIGRvYy9pbnRyb3NwZWN0LmR0ZDogYWRkIGludHJvc3BlY3QuZHRkIGZyb20gRGF2aWQgQS4gV2hlZWxlcgorCSh3aXRoIHNvbWUgbWlub3IgY2hhbmdlcykKKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IGFkZCBkZXByZWNhdGVkIGF0dHJpYnV0ZSB0bworCWludHJvc3BlY3Rpb24gZm9ybWF0CisKKzIwMDUtMDEtMzEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmM6IHJld3JpdGUgaG93IHNpZ25hbHMgd29yayBhZ2FpbiwgdGhpcyB0aW1lIEkKKwl0aGluayBpdCdzIHNvcnQgb2YgcmlnaHQKKworMjAwNS0wMS0zMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL2RidXMtdmlld2VyLmM6IGtpbmQgb2YgaGFsZi1hc3MgaG9vayB1cCB0aGUgb3B0aW9uIG1lbnUuCisKKzIwMDUtMDEtMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLW5hbWVzLW1vZGVsLmM6IGR5bmFtaWNhbGx5IHdhdGNoIE5hbWVPd25lckNoYW5nZWQKKworCSogYXV0b2dlbi5zaDogY2hhbmdlIHRvIGF1dG90b29scyAxLjkKKworCSogZ2xpYi9kYnVzLWdwcm94eS5jOiBjb21wbGV0ZWx5IGNoYW5nZSBob3cgc2lnbmFscyB3b3JrCisJKGRidXNfZ19wcm94eV9hZGRfc2lnbmFsKTogbmV3IGZ1bmN0aW9uIHRvIHNwZWNpZnkgc2lnbmF0dXJlIG9mIGEKKwlzaWduYWwKKwkoZGJ1c19nX3Byb3h5X2VtaXRfcmVjZWl2ZWQpOiBtYXJzaGFsIHRoZSBkYnVzIG1lc3NhZ2UgdG8gR1ZhbHVlcywKKwlhbmQgZ193YXJuaW5nIGlmIHRoZSBpbmNvbWluZyBtZXNzYWdlIGhhcyB0aGUgd3Jvbmcgc2lnbmF0dXJlLgorCisyMDA1LTAxLTMwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy1uYW1lcy1tb2RlbC5jIChoYXZlX25hbWVzX25vdGlmeSk6IGZpeCB0aGlzCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKF9kYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnc192YWxpc3QpOiBjbGVhbgorCXVwIHRoZSBzdHJpbmcgYXJyYXkgaGFuZGxpbmcgYSBiaXQgCisKKzIwMDUtMDEtMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBnbGliL2RidXMtZ2xpYi5jIChkYnVzX2dfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkpOiBuZXcgZnVuY3Rpb24KKwkoZGJ1c19nX3BlbmRpbmdfY2FsbF9jYW5jZWwpOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLWdsaWIuaDogbW92ZSBHVHlwZSBkZWNscyBmb3IgY29ubmVjdGlvbi9tZXNzYWdlIGhlcmU7CisJKiBkYnVzL2RidXMtZ2xpYi5jOiBtb3ZlIGFsbCB0aGUgZ190eXBlIGFuZCByZWYvdW5yZWYgc3R1ZmYgaW4KKwloZXJlLCBqdXN0IGtpbmQgb2YgcmF0aW9uYWxpemluZyBob3cgd2UgaGFuZGxlIGFsbCB0aGF0CisKKwkqIHRvb2xzL2RidXMtbmFtZXMtbW9kZWwuYzogbmV3IGZpbGUgZm9yIGEgdHJlZSBtb2RlbCBsaXN0aW5nIHRoZQorCXNlcnZpY2VzIG9uIGEgYnVzCisKKwkqIHRvb2xzL2RidXMtdHJlZS12aWV3LmMgKG1vZGVsX25ldyk6IHVzZSBwcm9wZXIgdHlwaW5nIG9uIHRoZQorCW1vZGVsIHJvd3MKKworMjAwNS0wMS0zMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jOiBhZGQgYSBjdXN0b20gR1NvdXJjZSBiYWNrIHRoYXQganVzdCBjaGVja3MKKwl3aGV0aGVyIHRoZSBtZXNzYWdlIHF1ZXVlIGhhcyBhbnl0aGluZyBpbiBpdDsgb3RoZXJ3aXNlLCB0aGVyZSBhcmUgCisJY2FzZXMgd2hlcmUgd2Ugd29uJ3Qgc2VlIG1lc3NhZ2VzIGluIHRoZSBxdWV1ZSBzaW5jZSB0aGVyZSB3YXMgbm8gCisJSU8gdmlzaWJsZSB0byB0aGUgZ2xpYiBtYWluIGxvb3AKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaCAoX0RCVVNfREVGQVVMVF9USU1FT1VUX1ZBTFVFKToKKwlpbmNyZWFzZSBkZWZhdWx0IG1lc3NhZ2UgdGltZW91dCB0byAyNSBzZWNvbmRzCisKKzIwMDUtMDEtMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0ZXN0L2dsaWIvdGVzdC1wcm9maWxlLmMgKG5vX2J1c19zdG9wX3NlcnZlcik6IHJlbW92ZSB0aGUKKwl3YXJuaW5nIGFib3V0IHRoZSBnX3dhcm5pbmcgdGhhdCBJIGp1c3QgZml4ZWQKKworCSogZ2xpYi9kYnVzLWdtYWluLmM6IHJld3JpdGUgdGhlIG1haW4gbG9vcCBzdHVmZiB0byBhdm9pZCB0aGUKKwljdXN0b20gc291cmNlLCBzZWVtcyB0byBiZSBhIGxvdCBlYXNpZXIgdG8gdW5kZXJzdGFuZCBhbmQgd29yaworCWJldHRlci4KKworMjAwNS0wMS0zMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKyAgICAgICAgSSB0aGluayB0aGlzIG1haW4gbG9vcCB0aGluZyBpcyBjb25jZXB0dWFsbHkgYnJva2VuLCBidXQgaGVyZSBhcmUgCisJc29tZSBiYW5kIGFpZHMuIEknbGwgbWF5YmUgcmV3cml0ZSBpdCBpbiBhIG1pbnV0ZS4KKwkKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jIChhZGRfdGltZW91dCk6IHRpbWVvdXQgc3R1ZmYgZG9lc24ndCB1c2UgdGhlCisJY3VzdG9tIEdTb3VyY2UsIHNvIGRvbid0IHBhc3MgaXQgaW47IGNvbmZ1c2luZworCShnc291cmNlX3NlcnZlcl9maW5hbGl6ZSwgZ3NvdXJjZV9jb25uZWN0aW9uX2ZpbmFsaXplKTogYWRkCisJZmluYWxpemUgaGFuZGxlcnMgdGhhdCByZW1vdmUgYWxsIHRoZSB3YXRjaGVzLgkKKworMjAwNS0wMS0zMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGludHJvc3BlY3RfcHJvcGVydGllcyk6IGZpeCB0aGUgWE1MCisJZ2VuZXJhdGVkCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV91bnJlZik6IGFkZCBhbiBpbl9jYWNoZSBmbGFnCisJd2hpY2ggZWZmZWN0aXZlbHkgZGV0ZWN0cyB0aGUgdXNlIG9mIGZyZWVkIG1lc3NhZ2VzCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGhhbmRsZV9pbnRyb3NwZWN0KTogbW9kaWZ5IGFuZCByZXR1cm4gdGhlCisJcmVwbHkgbWVzc2FnZSBpbnN0ZWFkIG9mIHRoZSBpbmNvbWluZyBtZXNzYWdlCisKKwkqIGRidXMvZGJ1cy1vYmplY3QtdHJlZS5jIChoYW5kbGVfZGVmYXVsdF9pbnRyb3NwZWN0X3VubG9ja2VkKToKKwlnZWUsIG1heWJlIGl0IHNob3VsZCBTRU5EIFRIRSBYTUwgaW5zdGVhZCBvZiBqdXN0IG1ha2luZyBhIHN0cmluZworCWFuZCBmcmVlaW5nIGl0IGFnYWluIDstKQorCisJKiB0b29scy9kYnVzLXByaW50LW1lc3NhZ2UuYyAocHJpbnRfbWVzc2FnZSk6IGltcHJvdmUgcHJpbnRpbmcgb2YKKwltZXNzYWdlcworCisJKiBjb25maWd1cmUuaW46IGFkZCBkZWJ1Zy1nbGliLnNlcnZpY2UgdG8gdGhlIG91dHB1dAorCisyMDA1LTAxLTMwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworICAgICAgICBkYnVzLXZpZXdlciBpbnRyb3NwZWN0ZWQgYW5kIGRpc3BsYXllZCB0aGUgYnVzIGRyaXZlcgorCQorCSogZGJ1cy9kYnVzLW9iamVjdC10cmVlLmMgCisJKG9iamVjdF90cmVlX3Rlc3RfaXRlcmF0aW9uKTogYWRkIHRlc3RzIGZvciBhIGhhbmRsZXIgcmVnaXN0ZXJlZCBvbiAiLyIKKworCSogZGJ1cy9kYnVzLW9iamVjdC10cmVlLmMKKwkoX2RidXNfZGVjb21wb3NlX3BhdGgpOiBmaXggdG8gaGFuZGxlIHBhdGggIi8iIHByb3Blcmx5CisJKHJ1bl9kZWNvbXBvc2VfdGVzdHMpOiBhZGQgdGVzdHMgZm9yIHBhdGggZGVjb21wb3NpdGlvbgorCQorCSogZ2xpYi9kYnVzLWd1dGlscy5jIChfZGJ1c19ndXRpbHNfc3BsaXRfcGF0aCk6IGZpeCB0byBoYW5kbGUgIi8iCisJcHJvcGVybHkKKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoaGFuZGxlX2ludHJvc3BlY3QpOiBmaXggcXVvdGVzCisKKwkqIHRlc3QvZ2xpYi9ydW4tdGVzdC5zaDogc3VwcG9ydCBsYXVuY2hpbmcgdGhlIGJ1cywgdGhlbiBydW5uaW5nCisJZGJ1cy12aWV3ZXIKKworCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLmMgKG1haW4pOiBwdXQgaW4gYSB0cml2aWFsIGdvYmplY3QKKwlzdWJjbGFzcyBhbmQgcmVnaXN0ZXIgaXQgb24gdGhlIGNvbm5lY3Rpb24KKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2hhbmRsZV9pbnRyb3NwZWN0KTogaW1wbGVtZW50CisJaW50cm9zcGVjdGlvbiBvZiB0aGUgYnVzIGRyaXZlciBzZXJ2aWNlCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOiBhZGQgI2RlZmluZXMgZm9yIHRoZSBYTUwgbmFtZXNwYWNlLAorCWlkZW50aWZpZXJzLCBkb2N0eXBlIGRlY2wKKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2hhbmRsZV9nZXRfc2VydmljZV9vd25lcik6IGhhbmRsZQorCWF0dGVtcHRzIHRvIGdldCBvd25lciBvZiBEQlVTX1NFUlZJQ0VfT1JHX0ZSRUVERVNLVE9QX0RCVVMgYnkgCisJcmV0dXJuaW5nIHRoZSBzZXJ2aWNlIHVuY2hhbmdlZC4KKwkoYnVzX2RyaXZlcl9oYW5kbGVfbWVzc2FnZSk6IHJlbW92ZSBvbGQgY2hlY2sgZm9yIHJlcGx5X3NlcmlhbCBpbgorCW1ldGhvZCBjYWxscywgbm93IHRoZSBtZXNzYWdlIHR5cGUgZGVhbHMgd2l0aCB0aGF0CisJKGJ1c19kcml2ZXJfaGFuZGxlX21lc3NhZ2UpOiBoYW5kbGUgTlVMTCBpbnRlcmZhY2UKKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dfcHJveHlfZ2V0X2J1c19uYW1lKTogbmV3IGZ1bmN0aW9uCisKKwkqIGdsaWIvZGJ1cy1nbG9hZGVyLWV4cGF0LmMgKGRlc2NyaXB0aW9uX2xvYWRfZnJvbV9zdHJpbmcpOiBhbGxvdworCS0xIGZvciBsZW4KKworCSogdG9vbHMvZGJ1cy12aWV3ZXIuYzogYWRkIHN1cHBvcnQgZm9yIGludHJvc3BlY3RpbmcgYSBzZXJ2aWNlIG9uCisJYSBidXMKKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dfcGVuZGluZ19jYWxsX3JlZik6IGFkZAorCShkYnVzX2dfcGVuZGluZ19jYWxsX3VucmVmKTogYWRkCisKKzIwMDUtMDEtMjkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLXRyZWUtdmlldy5jOiBhZGQgc3VwcG9ydCBmb3IgZGlzcGxheWluZyBwcm9wZXJ0aWVzLgorCShydW4gZGJ1cy12aWV3ZXIgd2l0aCBhbiBpbnRyb3NwZWN0IHhtbCBmaWxlIGFzIGFyZywgdGhlbiByZXNpemUKKwl0aGUgd2luZG93IHNvIHRoZSB0cmVlIGVsZW1lbnRzIHNob3cgdXAsIG5vdCBzdXJlIHdoYXQgdGhhdCBpcykKKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoaGFuZGxlX2ludHJvc3BlY3QpOiByZXR1cm4KKwlvcmcuZnJlZWRlc2t0b3AuUHJvcGVydGllcyBhbmQgb3JnLmZyZWVkZXNrdG9wLkludHJvc3BlY3RhYmxlCisJaW50ZXJmYWNlcyB3aGVuIHdlIGFyZSBpbnRyb3NwZWN0ZWQuCisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBhbGxvdyBlbXB0eSBpbnRlcmZhY2UgbmFtZSB3aGVuIAorCUdldC9TZXQgYSBwcm9wZXJ0eQorCisyMDA1LTAxLTI5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9NYWtlZmlsZS5hbTogcmVuYW1lIGRidXMtZ2xpYi10b29sIHRvIGRidXMtYmluZGluZy10b29sOworCXRob3VnaCBpdCB1c2VzIGdsaWIsIGl0IGNvdWxkIGJlIGV4dGVuZGVkIGZvciBhbnkgYmluZGluZyBpbgorCXByaW5jaXBsZQorCisJKiBnbGliL2RidXMtZ29iamVjdC5jIChnb2JqZWN0X21lc3NhZ2VfZnVuY3Rpb24pOiBjaGFuZ2UgdG8gdGhlCisJbmV3IHdheSBwcm9wZXJ0aWVzIHdvcmsKKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6IGFkZCB0aGUgbmV3IGludGVyZmFjZXMKKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IGRvY3VtZW50IHRoZSBpbnRyb3NwZWN0aW9uIGZvcm1hdCwKKwlJbnRyb3NwZWN0YWJsZSBpbnRlcmZhY2UsIGFuZCBhZGQgYW4gb3JnLmZyZWVkZXNrdG9wLlByb3BlcnRpZXMKKwlpbnRlcmZhY2UuCisKKwkqIGdsaWIvZGJ1cy1ncGFyc2VyLmM6IGFkZCBzdXBwb3J0IGZvciBhIDxwcm9wZXJ0eT4gZWxlbWVudAorCisJKiBnbGliL2RidXMtZ2lkbC5jOiBhZGQgUHJvcGVydHlJbmZvCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGhhbmRsZV9pbnRyb3NwZWN0KTogcHV0IHRoZSBvdXRlcm1vc3QKKwk8bm9kZT4gb3V0c2lkZSB0aGUgc2lnbmFsIGFuZCBwcm9wZXJ0eSBkZXNjcmlwdGlvbnMuCisJKGludHJvc3BlY3RfcHJvcGVydGllcyk6IGV4cG9ydCBwcm9wZXJ0aWVzIGFzIDxwcm9wZXJ0eT4gcmF0aGVyCisJdGhhbiBhcyBtZXRob2QgY2FsbHMKKworMjAwNS0wMS0yOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9UT0RPLCBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogc3BlYyBhbmQgVE9ETyB0d2Vha3MKKwlyZWxhdGVkIHRvIGF1dGhlbnRpY2F0aW9uIHByb3RvY29sCisKKzIwMDUtMDEtMjggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbjogVXBkYXRlZCB0byBoYW5kbGUgbmV3IEQtQlVTIHR5cGUgc3lzdGVtCisJCS0gQlVTX0FDVElWQVRJT04gLT4gQlVTX1NUQVJURVIKKwkJLSBEQlVTX0JVU19BQ1RJVkFUSU9OIC0+IERCVVNfQlVTX1NUQVJURVIKKwkJLSBjbGFzcyBNZXNzYWdlSXRlciAoX19pbml0X18pOiBBZGRlZCByZWN1cnNpb24gY2hlY2tpbmcgCisJCXNvIHdlIHRocm93IGEgbmljZSBlcnJvciBpbnN0ZWFkIG9mIGp1c3QgZGlzY29ubmVjdGluZyBmcm9tIHRoZQorCQlidXMuCisJCShnZXQpOiBBZGRlZCBhcmdfdHlwZSBwYXJhbWV0ZXIgZm9yIHJlY3Vyc2lvbi4KKwkJUmVtb3ZlZCB0aGUgbmlsIHR5cGUKKwkJQWRkZWQgc2lnbml0dXJlIHR5cGUgcGxhY2Vob2xkZXIgKG5vdCBpbXBsZW1lbnRlZCkKKwkJQWRkZWQgc3RydWN0IHR5cGUgcGxhY2Vob2xkZXIgKG5vdCBpbXBsZW1lbnRlZCkKKwkJQWRkZWQgdmFyaWVudCB0eXBlIHBsYWNlaG9sZGVyIChub3QgaW1wbGVtZW50ZWQpCisJCUNvbW1lbnRlZCBvdXQgZGljdCB0eXBlIGZvciBub3cJICAgIAorCQkoZ2V0X2VsZW1lbnRfdHlwZSk6IHJlbmFtZWQgZnJvbSBnZXRfYXJyYXlfdHlwZQorCQkoZ2V0XyopOiBjaGFuZ2VkIHRvIHVzZSB0aGUgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljIEFQSQorCQkoZ2V0XypfYXJyYXkpOiByZW1vdmVkIGluIGZhdm9yIG9mIHJlY3Vyc2l2ZSBnZXRfYXJyYXkgbWV0aG9kCisJCShnZXRfYXJyYXkpOiBuZXcgcmVjdXJzaXZlIG1ldGhvZCB3aGljaCBjYWxscyBnZXQgdG8gbWFyc2hhbAorCSAgICAgICAgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheQorCQkodmFsdWVfdG9fZGJ1c19zaWcpOiBOZXcgbWV0aG9kIHJldHVybnMgdGhlIGNvcnJhc3BvbmRpbmcKKwkJZGJ1cyBzaWduaXR1cmUgdG8gYSBweXRob24gdmFsdWUKKwkJKGFwcGVuZCk6IENvbW1lbnQgb3V0IGRpY3QgaGFuZGxpbmcgZm9yIG5vdworCQlIYW5kbGUgbGlzdHMgd2l0aCB0aGUgbmV3IHJlY3Vyc2l2ZSBBUEkKKwkJQ29tbWVudCBvdXQgTm9uZSBoYW5kbGluZyBmb3Igbm93CisJCShhcHBlbmRfbmlsKTogcmVtb3ZlZAorCQkoYXBwZW5kXyopOiBjaGFuZ2VkIHRvIHVzZSBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgQVBJCisJCShhcHBlbmRfKl9hcnJheSk6IHJlbW92ZWQgaW4gZmF2b3Igb2YgcmVjdXJzaXZlIGFwcGVuZF9hcnJheSAKKwkJbWV0aG9kCisJCShfX3N0cl9fKTogTWFrZSBpdCBlYXNpZXIgdG8gcHJpbnQgb3V0IHJlY3Vyc2l2ZSBpdGVyYXRvcnMKKwkJZm9yIGRlYnVnZ2luZworCQktIGNsYXNzIE1lc3NhZ2UgKF9fc3RyX18pOiBtb3ZlZCB0eXBlIGluc3BlY3Rpb24gdG8gdGhlCisJCU1lc3NhZ2VJdGVyIGNsYXNzJyBfX3N0cl9fIG1ldGhvZAorCQkoZ2V0X2l0ZXIpOiBBZGRlZCBhbiBhcHBlbmQgcGFyYW1ldGVyIHdpY2ggZGVmYXVsdHMgdG8gRmFsc2UKKwkJSWYgVHJ1ZSB1c2UgdGhlIG5ldyBBUEkncyB0byBjcmVhdGUgYW4gYXBwZW5kIGl0ZXJhdG9yCisKKwkqIHB5dGhvbi9kYnVzLnB5OiBVcGRhdGUgdG8gdXNlIG5ldyBiaW5kaW5ncyBBUEkKKwkJLSBUWVBFX0FDVElWQVRJT04gLT4gVFlQRV9TVEFSVEVSCisJCS0gY2xhc3MgQnVzIChfZ2V0X21hdGNoX3J1bGUpOiBHZXRTZXJ2aWNlT3duZXIgLT4gR2V0TmFtZU93bmVyCisJCS0gY2xhc3MgQWN0aXZhdGlvbkJ1cyAtPiBjbGFzcyBTdGFydGVyQnVzCisJCS0gY2xhc3MgUmVtb3RlT2JqZWN0IChfX2NhbGxfXyk6IGdldCBhbiBhcHBlbmQgaXRlcmF0b3IKKwkJLSAoX2Rpc3BhdGNoX2RidXNfbWV0aG9kX2NhbGwpOiBnZXQgYW4gYXBwZW5kIGl0ZXJhdG9yCisJCS0gY2xhc3MgT2JqZWN0IChlbWl0X3NpZ25hbCk6IGdldCBhbiBhcHBlbmQgaXRlcmF0b3IKKworCSogcHl0aG9uL2V4YW1wbGVzLzogRml4ZWQgdXAgdGhlIGV4YW1wbGVzIHRvIHdvcmsgd2l0aCB0aGUgbmV3IEFQSQorCQkKKzIwMDUtMDEtMjggIEpvZSBTaGF3ICA8am9lc2hhd0Bub3ZlbGwuY29tPgorCisJKiBjb25maWd1cmUuaW46IEJ1bXAgdmVyc2lvbiB1cCB0byAwLjMwLgorCisJKiBIQUNLSU5HOiBBZGQgYSByZWxlYXNlIGl0ZW0gdG8gYnVtcCB0aGUgdmVyc2lvbiBudW1iZXIgdXAgYWZ0ZXIgCisJYSByZWxlYXNlLgorCisyMDA1LTAxLTI4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IHVwZGF0ZSB0byBkZXNjcmliZSAxNi1iaXQgdHlwZXMgYW5kCisJZGljdCBlbnRyaWVzCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLWJhc2ljLmMgKF9kYnVzX3VucGFja191aW50MTYpOiBmaXggYnJva2VuCisJYXNzZXJ0aW9uCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oIChEQlVTX1RZUEVfRElDVF9FTlRSWSk6IGFkZCBESUNUX0VOVFJZIGFzIGEKKwl0eXBlCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5jOiBpbXBsZW1lbnQKKworMjAwNS0wMS0yNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1hcmNoLWRlcHMuaC5pbjogYWRkIDE2LzMyLWJpdCB0eXBlcworCisJKiBjb25maWd1cmUuaW46IGZpbmQgdGhlIHJpZ2h0IHR5cGUgZm9yIDE2IGFuZCAzMiBiaXQgaW50cyBhcyB3ZWxsCisJYXMgNjQKKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmggKERCVVNfVFlQRV9JTlQxNiwgREJVU19UWVBFX1VJTlQxNik6IGFkZAorCXRoZSAxNi1iaXQgdHlwZXMgc28gcGVvcGxlIGRvbid0IGhhdmUgdG8gc3R1ZmYgdGhlbSBpbiAzMi1iaXQgb3IKKwlieXRlIGFycmF5cy4KKworMjAwNS0wMS0yNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKyAgICAgICAgKiBkYnVzL2RidXMtbWVzc2FnZS5jOiBieXRlc3dhcCB0aGUgbWVzc2FnZSBpZiB5b3UgaW5pdCBhbgorCWl0ZXJhdG9yIHRvIHJlYWQvd3JpdGUgZnJvbSBpdAorCQorCSogZGJ1cy9kYnVzLW1hcnNoYWwtYnl0ZXN3YXAuYzogbmV3IGZpbGUgaW1wbGVtZW50aW5nIAorCV9kYnVzX21hcnNoYWxfYnl0ZXN3YXAoKQorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5jOiBhZGQgX2RidXNfc3dhcF9hcnJheSgpCisKKzIwMDUtMDEtMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCQorCSogZGJ1cy9kYnVzLW1hcnNoYWwtdmFsaWRhdGUtdXRpbC5jOiBicmVhayB0aGlzIG91dCAoYW5kIGZpeAorCWJ1aWxkLCBhcHBhcmVudGx5IC0gbm9ib2R5IG5vdGljZWQ/KQorCQorMjAwNS0wMS0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oOiByZW1vdmUgdG9kbyBjb21tZW50CisKKzIwMDUtMDEtMjUgIEpvZSBTaGF3ICA8am9lc2hhd0Bub3ZlbGwuY29tPgorCisJKiBMYW5kIHRoZSBtb25vIGJpbmRpbmcgY2hhbmdlcyB0byBjb25mb3JtIHRvIHRoZSBuZXcgQVBJcy4KKworCSogbW9uby9NYWtlZmlsZS5hbTogUmVtb3ZlIEN1c3RvbS5jcywgREJ1c1R5cGUvQ3VzdG9tLmNzLAorCURCdXNUeXBlL0RpY3QuY3MsIGFuZCBEQnVzVHlwZS9OaWwuY3MgZnJvbSB0aGUgYnVpbGQuCisKKwkqIG1vbm8vQXJndW1lbnRzLmNzIChHZXRDb2RlQXNTdHJpbmcpOiBBZGRlZC4gIFJldHVybnMgdGhlIGRidXMKKwl0eXBlIGNvZGUgYXMgYSBzdHJpbmcuCisJKEluaXRBcHBlbmRpbmcpOiBSZW5hbWUgZGJ1c19tZXNzYWdlX2FwcGVuZF9pdGVyX2luaXQoKSB0bworCWRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kKCkuCisKKwkqIG1vbm8vQnVzRHJpdmVyLmNzOiBSZW5hbWUgU2VydmljZUV2ZW50SGFuZGxlciB0bworCU5hbWVPd25lckNoYW5nZWRIYW5kbGVyLiAgUmVuYW1lIEdldFNlcnZpY2VPd25lciB0byBHZXRPd25lci4KKwlSZW5hbWUgU2VydmljZU93bmVyQ2hhbmdlZCB0byBOYW1lT3duZXJDaGFuZ2VkLgorCisJKiBtb25vL0Nvbm5lY3Rpb24uY3M6IFJlbmFtZSBCYXNlU2VydmljZSB0byBVbmlxdWVOYW1lLCBhbmQgdGhlCisJdW5kZXJseWluZyBDIGNhbGwuCisKKwkqIG1vbm8vQ3VzdG9tLmNzOiBSZW1vdmVkLiAgVGhlIENVU1RPTSB0eXBlIGhhcyBiZWVuIHJlbW92ZWQuCisKKwkqIG1vbm8vU2VydmljZS5jczogUmVuYW1lIEV4aXN0cyB0byBIYXNPd25lciwgaW50ZXJuYWxseSByZW5hbWUKKwlkYnVzX2J1c19hY3F1aXJlX3NlcnZpY2UoKSB0byBkYnVzX2J1c19yZXF1ZXN0X25hbWUoKS4KKworCSogbW9uby9EQnVzVHlwZS9BcnJheS5jcyAoY3Rvcik6IFVzZSBUeXBlLkdldEVsZW1lbnRUeXBlKCkgaW5zdGVhZAorCW9mIFR5cGUuVW5kZXJseWluZ1N5c3RlbVR5cGUgdG8gZ2V0IHRoZSBjb3JyZWN0IGVsZW1lbnQgdHlwZSBmb3IKKwl0aGUgYXJyYXkuCisJKGN0b3IpOiBVcGRhdGUgY29kZSBmb3IgbmV3IEFQSXM6IHVzZSBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlKCksCisJZGJ1c19tZXNzYWdlX2dldF97ZWxlbWVudHxhcmd9X3R5cGUoKSBpbnN0ZWFkIG9mCisJZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcnJheV9pdGVyYXRvcigpLgorCShBcHBlbmQpOiBSZXBsYWNlIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9hcnJheSgpIHdpdGgKKwlkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lcigpIGFuZAorCWRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lcigpLgorCisJKiBtb25vL0RCdXNUeXBlL0N1c3RvbS5jcywgbW9uby9EQnVzVHlwZS9OaWwuY3M6IFJlbW92ZWQuICBUaGVzZQorCXR5cGVzIGhhdmUgYmVlbiByZW1vdmVkLgorCQorCSogbW9uby9EQnVzVHlwZS8qLmNzOiBSZXBsYWNlIGNhbGxzIG9mCisJZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X1t0eXBlXSgpIHRvIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYygpLAorCWJ1dCBzcGVjaWZ5IHRoZSB0eXBlIGluIHRoZSBEbGxJbXBvcnQgZXh0ZXJuIGRlY2xhcmF0aW9uLiAgRGl0dG8KKwlmb3IgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX1t0eXBlXSgpIC0+CisJZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljKCkuCisKKwkqIG1vbm8vZXhhbXBsZS9CdXNMaXN0ZW5lci5jczogVXBkYXRlIGZvciBTZXJ2aWNlRXZlbnRIYW5kbGVyIC0+CisJTmFtZU93bmVyQ2hhbmdlZEhhbmRsZXIuCisKKzIwMDUtMDEtMjUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbjogUmVuYW1lIG9mIG1ldGhvZHMgYW5kIGJpbmRpbmdzCisJCS0gZ2V0X2Jhc2Vfc2VydmljZSAtPiBnZXRfdW5pcXVlX25hbWUKKwkJLSBidXNfZ2V0X2Jhc2Vfc2VydmljZSAtPiBidXNfZ2V0X3VuaXF1ZV9uYW1lCisJCS0gZGJ1c19idXNfZ2V0X2Jhc2Vfc2VydmljZSAtPiBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUKKwkJLSBBQ1RJVkFUSU9OX1JFUExZX0FDVElWQVRFRCAtPiBEQlVTX1NUQVJUX1JFUExZX1NVQ0NFU1MgCisJCS0gQUNUSVZBVElPTl9SRVBMWV9BTFJFQURZX0FDVElWRSAtPiBEQlVTX1NUQVJUX1JFUExZX0FMUkVBRFlfUlVOTklORworCQktIGJ1c19hY3RpdmF0ZV9zZXJ2aWNlIC0+IGJ1c19zdGFydF9zZXJ2aWNlX2J5X25hbWUKKwkJLSBkYnVzX2J1c19hY3RpdmF0ZV9zZXJ2aWNlIC0+IGRidXNfYnVzX3N0YXJ0X3NlcnZpY2VfYnlfbmFtZQorCQktIGJ1c19hY3F1aXJlX3NlcnZpY2UgLT4gYnVzX3JlcXVlc3RfbmFtZQorCQktIGRidXNfYnVzX2FjcXVpcmVfc2VydmljZSAtPiBkYnVzX2J1c19yZXF1ZXN0X25hbWUKKwkJLSBidXNfc2VydmljZV9leGlzdHMgLT4gYnVzX25hbWVfaGFzX293bmVyCisJCS0gZGJ1c19idXNfc2VydmljZV9leGlzdHMgLT4gZGJ1c19idXNfbmFtZV9oYXNfb3duZXIKKworCSogcHl0aG9uL2RidXMucHk6IFJlbmFtZSBvZiBtZXRob2RzCisJCS0gYWN0aXZhdGVfc2VydmljZSAtPiBzdGFydF9zZXJ2aWNlX2J5X25hbWUKKwkJLSBidXNfYWNxdWlyZV9zZXJ2aWNlIC0+IGJ1c19yZXF1ZXN0X25hbWUKKwkJLSBBQ1RJVkFUSU9OX1JFUExZX0FDVElWQVRFRCAtPiBTVEFSVF9SRVBMWV9TVUNDRVNTIAorCQktIEFDVElWQVRJT05fUkVQTFlfQUxSRUFEWV9BQ1RJVkUgLT4gU1RBUlRfUkVQTFlfQUxSRUFEWV9SVU5OSU5HCisKKwkKKzIwMDUtMDEtMjQgIEpvZSBTaGF3ICA8am9lc2hhd0Bub3ZlbGwuY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2gpOiBQcmludCBvdXQgdGhlCisJc2lnbmF0dXJlIGZvciB0aGUgbWV0aG9kIHRoYXQgY2FuJ3QgYmUgZm91bmQuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9pdGVyX2luaXQpOiBUbyBjaGVjayB0byBzZWUgaWYKKwl0aGUgbWVzc2FnZSBoYXMgYW55IGFyZ3VtZW50cywgd2UgbmVlZCB0byBjYWxsCisJX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSgpLCBub3QKKwlfZGJ1c190eXBlX3JlYWRlcl9oYXNfbmV4dCgpLgorCisyMDA1LTAxLTI0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtZmFjdG9yeS5jOiBtb3JlIHRlc3Rpbmcgb2YgbWVzc2FnZSB2YWxpZGF0aW9uCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oIChEQlVTX01JTklNVU1fSEVBREVSX1NJWkUpOiBtb3ZlIHRvIHRoaXMKKwloZWFkZXIKKworMjAwNS0wMS0yMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWZhY3RvcnkuYywgZGJ1cy9kYnVzLW1lc3NhZ2UtdXRpbC5jOiAKKwlnZXQgdGhpcyBhbGwgd29ya2luZywgbm90IG1hbnkgdGVzdHMgaW4gdGhlIGZyYW1ld29yayB5ZXQgdGhvdWdoCisKKzIwMDUtMDEtMjIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvZGJ1cy1mYXEueG1sLCBkb2MvZGJ1cy10dXRvcmlhbDogYWRkIGEgRkFRIGFuZCB1cGRhdGUKKwl0dXRvcmlhbCwgYmFzZWQgb24gd29yayBmcm9tIERhdmlkIFdoZWVsZXIuCisKKzIwMDUtMDEtMjEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtYnVzLmM6IGFkZCBtb3JlIHJldHVybl9pZl9mYWlsIGNoZWNrcworCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChsb2FkX21lc3NhZ2UpOiBoYXZlIHRoZSAibm8gdmFsaWRhdGlvbiIKKwltb2RlIChoYXZlIHRvIGVkaXQgdGhlIGNvZGUgdG8gdG9nZ2xlIHRoZSBtb2RlIGZvciBub3cgdGhvdWdoKQorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1oZWFkZXIuYyAoX2RidXNfaGVhZGVyX2xvYWQpOiBoYXZlIGEgbW9kZSB0aGF0CisJc2tpcHMgYWxsIHZhbGlkYXRpb247IEkgd2FudCB0byB1c2UgdGhpcyBhdCBsZWFzdCBmb3IgYmVuY2htYXJrCisJYmFzZWxpbmUsIEknbSBub3Qgc3VyZSBpZiBpdCBzaG91bGQgYmUgYSBwdWJsaWNseS1hdmFpbGFibGUgc3dpdGNoLgorCisyMDA1LTAxLTIxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWdtYWluLmM6IGRvbid0IHB1dCB0aGUgR0xpYiBiaW5kaW5ncyBpbiB0aGUgc2FtZQorCXRvcGxldmVsIGRveHlnZW4gZ3JvdXAgYXMgdGhlIGxvdy1sZXZlbCBBUEkgc3R1ZmYKKworCSogZGJ1cy9kYnVzLmg6IG5vdGUgdGhhdCBsaWJkYnVzIGlzIHRoZSBsb3ctbGV2ZWwgQVBJCisKKzIwMDUtMDEtMjAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB1cGRhdGUtZGJ1cy1kb2NzLnNoOiBzY3JpcHQgdG8gdXBkYXRlIGRvY3Mgb24gdGhlIHdlYiBzaXRlLCBvbmx5CisJd29ya3MgZm9yIG1lIHRob3VnaC4gbmVlbmVyLgorCisyMDA1LTAxLTIwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfcG9sbCk6IGFtYXppbmdseSwgdHJ5aW5nIHRvIGNvbXBpbGUKKwljb2RlIGNhbiByZXZlYWwgYnVncyBpbiBpdAorCisyMDA1LTAxLTIwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfcG9sbCk6IGZpeCBzZXZlcmFsIGJ1Z3MgaW4gdGhlCisJc2VsZWN0KCkgdmVyc2lvbiwgcGF0Y2hlcyBmcm9tIFRvciBMaWxscXZpc3QKKworMjAwNS0wMS0yMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9kYnVzLXR1dG9yaWFsLnhtbDogcmVwbGFjZSA+IHdpdGggJmd0OworCisJKiBidXMvc2VydmljZXMuYyAoYnVzX3JlZ2lzdHJ5X2FjcXVpcmVfc2VydmljZSk6IHZhbGlkYXRlIHRoZSBuYW1lCisJYW5kIHJldHVybiBhIGJldHRlciBlcnJvciBpZiBpdCdzIG5vIGdvb2QuCisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBub3RlIE5PX0FVVE9fU1RBUlQgY2hhbmdlCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oIChEQlVTX0hFQURFUl9GTEFHX05PX0FVVE9fU1RBUlQpOiBjaGFuZ2UKKwlmcm9tIEFVVE9fU1RBUlQsIHdlJ3JlIHRvZ2dsaW5nIHRoZSBkZWZhdWx0CisKKwkqIGJ1cy9kaXNwYXRjaC5jOiBhZGFwdCB0aGUgdGVzdHMgdG8gY2hhbmdlIG9mIGF1dG8tc3RhcnQgZGVmYXVsdAorCisyMDA1LTAxLTE4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogcmVuYW1lIGRidXMtZGFlbW9uLTEgdG8gZGJ1cy1kYWVtb24gdGhyb3VnaG91dAorCisyMDA1LTAxLTE4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworICAgICAgICAqIFRocm91Z2hvdXQsIGdyYW5kIHJlbmFtaW5nIHRvIHN0cmlwIG91dCB0aGUgdXNlIG9mICJzZXJ2aWNlIiwKKwlqdXN0IHNheSAibmFtZSIgaW5zdGVhZCAob3IgImJ1cyBuYW1lIiB3aGVuIGFtYmlndW91cykuICBEaWQgbm90CisJY2hhbmdlIHRoZSBpbnRlcm5hbCBjb2RlIG9mIHRoZSBtZXNzYWdlIGJ1cyBpdHNlbGYsIG9ubHkgdGhlCisJcHJvZ3JhbW1lci1mYWNpbmcgQVBJIGFuZCBtZXNzYWdlcy4KKwkKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBmdXJ0aGVyIHVwZGF0ZSB0aGUgbWVzc2FnZSBidXMgc2VjdGlvbgorCQorCSogYnVzL2NvbmZpZy1wYXJzZXIuYyAoYWxsX2FyZV9lcXVpdik6IGZpeCBidWcgdXNpbmcgZnJlZWQgc3RyaW5nCisJaW4gZXJyb3IgY2FzZQorCisyMDA1LTAxLTE3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXR5cGVzLmg6IHJlbW92ZSAxNi1iaXQgdHlwZXMgc2luY2Ugd2UgZG9uJ3QgdXNlIHRoZW0KKwlldmVyCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmMgKF9kYnVzX3ZhbGlkYXRlX3BhdGgpOiBkaXNhbGxvdyBhbnkKKwkiaW52YWxpZCBuYW1lIGNoYXJhY3RlciIgbm90IG9ubHkgbm9uLUFTQ0lJCisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBmdXJ0aGVyIHVwZGF0ZSBzcGVjLCBtZXNzYWdlIGJ1cyAKKwlwYXJ0cyBhcmUgc3RpbGwgb3V0LW9mLWRhdGUgYnV0IHRoZSBtYXJzaGFsaW5nIGV0Yy4gc3R1ZmYgaXMgbm93CisJYWNjdXJhdGUtaXNoCisKKzIwMDUtMDEtMTcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogcGFydGlhbGx5IHVwZGF0ZSBzcGVjCisKKzIwMDUtMDEtMTcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisgICAgICAgICogVGhyb3VnaG91dCwgYWxpZ24gdmFyaWFudCBib2RpZXMgYWNjb3JkaW5nIHRvIHRoZSBjb250YWluZWQKKwl0eXBlLCByYXRoZXIgdGhhbiBhbHdheXMgdG8gOC4gU2hvdWxkIHNhdmUgYSBmYWlyIGJpdCBvZiBzcGFjZSBpbgorCW1lc3NhZ2UgaGVhZGVycy4KKwkKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmMgKF9kYnVzX3ZhbGlkYXRlX2JvZHlfd2l0aF9yZWFzb24pOgorCWZpeCBoYW5kbGluZyBvZiBjYXNlIHdoZXJlIHAgPT0gZW5kCisKKwkqIGRvYy9UT0RPOiByZW1vdmUgdGhlIGRidXNfYm9vbF90IGl0ZW0gYW5kIHZhcmlhbnQgYWxpZ25tZW50IGl0ZW1zCisKKzIwMDUtMDEtMTcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdHlwZXMuaDogaGFyZGNvZGUgZGJ1c19ib29sX3QgdG8gMzIgYml0cworCisJKiBUaHJvdWdob3V0OiBtb2RpZnkgREJVU19UWVBFX0JPT0xFQU4gdG8gYmUgYSAzMi1iaXQgdHlwZSBpbnN0ZWFkCisJb2YgYW4gOC1iaXQgdHlwZS4gTm93IGRidXNfYm9vbF90IGlzIHRoZSB0eXBlIHRvIHVzZSB3aGVuZXZlciB5b3UgCisJYXJlIG1hcnNoYWxpbmcvdW5tYXJzaGFsaW5nIGEgYm9vbGVhbi4KKworMjAwNS0wMS0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKyAgICAgICAgVGhpcyBpcyBhYm91dCBpdCBvbiB3aGF0IGNhbiBiZSBkaXNhYmxlZC9kZWxldGVkIGZyb20gbGliZGJ1cworCWVhc2lseSwgYmFjayBiZWxvdyAxNTBLIGFueWhvdy4gRGVlcGVyIGN1dHMgYXJlIG1vcmUgd29yayB0aGFuIAorCWp1c3QgdHVybmluZyB0aGUgY29kZSBvZmYgYXMgSSd2ZSBkb25lIGhlcmUuCisJCisJKiBkYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5jIChfZGJ1c19wYWNrX2ludDMyKTogd2UgZG9uJ3QgbmVlZCB0aGUKKwlzaWduZWQgaW50IGNvbnZlbmllbmNlIGZ1bmNzCisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYyAoX2RidXNfdmVyYm9zZV9yZWFsKTogb21pdCB3aGVuIG5vdCBpbgorCXZlcmJvc2UgbW9kZQorCisJKiBkYnVzL2RidXMtc3RyaW5nLXV0aWwuYywgZGJ1cy9kYnVzLXN0cmluZy5jOiBtb3JlIGJyZWFraW5nCisJdGhpbmdzIG91dCBvZiBsaWJkYnVzCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMsIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWwuYzogc2FtZQorCQorCSogZGJ1cy9kYnVzLWhhc2guYzogcHVyZ2UgdGhlIFRXT19TVFJJTkdTIGNyYXAgKHdlbGwsIG1ha2UgaXQKKwl0ZXN0cy1lbmFibGVkLW9ubHksIHRob3VnaCBpdCBzaG91bGQgcHJvYmFibHkgYmUgZGVsZXRlZCkKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtdXRpbC5jOiBzYW1lIHN0dWZmCisKKwkqIGRidXMvZGJ1cy1hdXRoLXV0aWwuYzogc2FtZSBzdHVmZgorCisyMDA1LTAxLTE2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXVzZXJkYi11dGlsLmM6IHNwbGl0IG91dCBwYXJ0IG9mIGRidXMtdXNlcmRiLmMKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfdWlkX2Zyb21fc3RyaW5nKTogbW92ZSBoZXJlIHRvIHBhdmUKKwl3YXkgZm9yIHN0cmlwcGluZyBkb3duIGRidXMtdXNlcmRiLmMgc3R1ZmYgaW5jbHVkZWQgaW4gbGliZGJ1cy4KKwlSZW5hbWUgX2RidXNfcGFyc2VfdWlkIGZvciBjb25zaXN0ZW5jeS4KKworMjAwNS0wMS0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYyAoX2RidXNfcmVhbF9hc3NlcnQpOiBwcmludCB0aGUgZnVuY3Rpb24KKwluYW1lIHRoZSBhc3NlcnRpb24gZmFpbGVkIGluCisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuaCAoX2RidXNfcmV0dXJuX2lmX2ZhaWwpIAorCShfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwpOiBhc3NlcnQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24KKwljb250YWluaW5nIHRoZSBjaGVjayBkb2Vzbid0IHN0YXJ0IHdpdGggJ18nLCBzaW5jZSB3ZSBvbmx5IHdhbnQgdG8gCisJdXNlIGNoZWNrcyBvbiBwdWJsaWMgZnVuY3Rpb25zCisJCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCk6IGNoYW5nZQorCWNoZWNrcyB0byBhc3NlcnRpb25zCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLWhlYWRlci5jIChfZGJ1c19oZWFkZXJfc2V0X2ZpZWxkX2Jhc2ljKToKKwljaGFuZ2UgY2hlY2tzIHRvIGFzc2VydHMgZm9yIHByaXZhdGUgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoX2RidXNfbWVzc2FnZV9zZXRfc2VyaWFsKTogY2hlY2tzCisJdG8gYXNzZXJ0cyBmb3IgcHJpdmF0ZSBmdW5jdGlvbgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUuYyAoc2tpcF9vbmVfY29tcGxldGVfdHlwZSk6IHJlbW92ZQorCWJyb2tlbiBhc3NlcnRpb24gdGhhdCB3YXMgYnJlYWtpbmcgbWFrZSBjaGVjaworCShfZGJ1c190eXBlX3JlYWRlcl9hcnJheV9pc19lbXB0eSk6IHJlbW92ZSB0aGlzIHJhdGhlciB0aGFuIGZpeAorCWl0LCB3YXMgb25seSB1c2VkIGluIGFzc2VydGlvbnMKKworMjAwNS0wMS0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvdW51c2VkLWNvZGUtZ2MucHk6IGhhY2t5IHNjcmlwdCB0byBmaW5kIGNvZGUgdGhhdCdzIHVzZWQKKwlvbmx5IGJ5IHRoZSBidXMgKG5vdCBsaWJkYnVzKSBvciB1c2VkIG9ubHkgYnkgdGVzdHMgb3Igbm90IHVzZWQgYXQKKwlhbGwuIEl0IGhhcyBzb21lIGZhbHNlIGFsYXJtcywgYnV0IGxvb2tzIGxpa2Ugd2UgY2FuIGNsZWFuIHVwIGEKKwlsb3Qgb2Ygc2l6ZSBmcm9tIGxpYmRidXMuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMsIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWxzLmMsCisJZGJ1cy9NYWtlZmlsZS5hbTogaW5pdGlhbGx5IG1vdmUgMTBLIG9mIGJpbmFyeSBzaXplIG91dCBvZiBsaWJkYnVzCisJCisyMDA1LTAxLTE2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworICAgICAgICAqIEFkZCBhbmQgZml4IGRvY3MgYWNjb3JkaW5nIHRvIERveHlnZW4gd2FybmluZ3MgdGhyb3VnaG91dAorCXNvdXJjZS4KKwkKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5jCisJKF9kYnVzX3R5cGVfcmVhZGVyX2FycmF5X2lzX2VtcHR5KTogY2hhbmdlIHRoaXMgdG8ganVzdCBjYWxsCisJYXJyYXlfcmVhZGVyX2dldF9hcnJheV9sZW4oKSBhbmQgbWFrZSBpdCBzdGF0aWMKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2VsZW1lbnRfdHlwZSk6IHJlbmFtZQorCWZyb20gZ2V0X2FycmF5X3R5cGUKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQpOiByZW5hbWUgZnJvbSBhcHBlbmRfaXRlcl9pbml0CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5jCisJKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9lbGVtZW50X3R5cGUpOiByZW5hbWUgZnJvbQorCV9kYnVzX3R5cGVfcmVhZGVyX2dldF9hcnJheV90eXBlCisKKzIwMDUtMDEtMTUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0ZXN0L2dsaWIvdGVzdC1wcm9maWxlLmMgKHdpdGhfYnVzX3NlcnZlcl9maWx0ZXIpOiBmaXggY3Jhc2gKKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtYmFzaWMuYyAoX2RidXNfdW5wYWNrX3VpbnQzMik6IGlubGluZSBhcyBtYWNybworCXdoZW4gREJVU19ESVNBQkxFX0FTU0VSVAorCShfZGJ1c19tYXJzaGFsX3NldF9iYXNpYyk6IGJlIHN1cmUgd2UgYWxpZ24gZm9yIHRoZSBzdHJpbmcgbGVuZ3RoCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5jIChza2lwX29uZV9jb21wbGV0ZV90eXBlKTogbWFrZQorCXRoaXMgbG9vayBmYXN0ZXIKKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuKTogYWRkIGFuCisJaW5saW5lIG1hY3JvIHZlcnNpb24KKwkoX2RidXNfc3RyaW5nX3NldF9ieXRlKTogcHJvdmlkZSBpbmxpbmUgbWFjcm8gdmVyc2lvbgorCisyMDA1LTAxLTE1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogTGFuZCB0aGUgbmV3IG1lc3NhZ2UgYXJncyBBUEkgYW5kIHR5cGUgc3lzdGVtLgorCisJVGhpcyBwYXRjaCBpcyBodWdlLCBidXQgdGhlIHB1YmxpYyBBUEkgY2hhbmdlIGlzIG5vdCAKKwlyZWFsbHkgbGFyZ2UuIFRoZSBzZXQgb2YgRC1CVVMgdHlwZXMgaGFzIGNoYW5nZWQgc29tZXdoYXQsIAorCWFuZCB0aGUgYXJnICJnZXR0ZXJzIiBhcmUgbW9yZSBnZWFyZWQgdG93YXJkIGxhbmd1YWdlIGJpbmRpbmdzOworCXRoZXkgZG9uJ3QgbWFrZSBhIGNvcHksIGV0Yy4KKworCVRoZXJlIGFyZSBhbHNvIHNvbWUga25vd24gaXNzdWVzLiBTZWUgdGhlc2UgZW1haWxzIGZvciBkZXRhaWxzCisJb24gdGhpcyBodWdlIHBhdGNoOgorCWh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvYXJjaGl2ZXMvZGJ1cy8yMDA0LURlY2VtYmVyLzAwMTgzNi5odG1sCisgICAgICAgIGh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvYXJjaGl2ZXMvZGJ1cy8yMDA1LUphbnVhcnkvMDAxOTIyLmh0bWwKKwkKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLSo6IGFsbCB0aGUgbmV3IHN0dWZmCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IGJhc2ljYWxseSByZXdyaXR0ZW4KKworCSogZGJ1cy9kYnVzLW1lbW9yeS5jIChjaGVja19ndWFyZHMpOiB3aXRoICJndWFyZHMiIGVuYWJsZWQsIGluaXQKKwlmcmVlZCBibG9ja3MgdG8gYmUgYWxsIG5vbi1udWwgYnl0ZXMgc28gdXNpbmcgZnJlZWQgbWVtb3J5IGlzIGxlc3MKKwlsaWtlbHkgdG8gd29yayByaWdodAorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmMgKF9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nKTogYWRkCisJREJVU19GQUlMX01BTExPQz1OIGVudmlyb25tZW50IHZhcmlhYmxlLCBzbyB5b3UgY2FuIGRvCisJREJVU19GQUlMX01BTExPQz0wIHRvIHNraXAgdGhlIG91dC1vZi1tZW1vcnkgY2hlY2tpbmcsIG9yCisJREJVU19GQUlMX01BTExPQz0xMCB0byBtYWtlIGl0IHJlYWxseSwgcmVhbGx5LCByZWFsbHkgc2xvdyBhbmQKKwl0aG9yb3VnaC4KKworCSogcXQvbWVzc2FnZS5jcHA6IHBvcnQgdG8gdGhlIG5ldyBtZXNzYWdlIGFyZ3MgQVBJCisJKG9wZXJhdG9yPDwpOiB1c2Ugc3RyLnV0ZjgoKSByYXRoZXIgdGhhbiBzdHIudW5pY29kZSgpCisJKHByZXR0eSBzdXJlIHRoaXMgaXMgcmlnaHQgZnJvbSB0aGUgUXQgZG9jcz8pCisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuYzogcG9ydCB0byB0aGUgbmV3IG1lc3NhZ2UgYXJncyBBUEkKKworCSogYnVzL2Rpc3BhdGNoLmMsIGJ1cy9kcml2ZXIuYzogcG9ydCB0byB0aGUgbmV3IG1lc3NhZ2UgYXJncyBBUEkKKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4pOiBpbml0aWFsaXplIHRoZQorCSJsb2NrZWQiIGZsYWcgdG8gVFJVRSBhbmQgYWxpZ25fb2Zmc2V0IHRvIDA7IEkgZ3Vlc3Mgd2UgbmV2ZXIKKwlsb29rZWQgYXQgdGhlc2UgYW55aG93LCBidXQgc2VlbXMgY2xlYW5lci4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5oIChfREJVU19TVFJJTkdfQUxMT0NBVElPTl9QQURESU5HKToKKwltb3ZlIGFsbG9jYXRpb24gcGFkZGluZyBtYWNybyB0byB0aGlzIGhlYWRlcjsgdXNlIGl0IHRvIGltcGxlbWVudAorCShfREJVU19TVFJJTkdfU1RBVElDKTogYWJpbGl0eSB0byBkZWNsYXJlIGEgc3RhdGljIHN0cmluZy4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoX2RidXNfbWVzc2FnZV9oYXNfdHlwZV9pbnRlcmZhY2VfbWVtYmVyKToKKwljaGFuZ2UgdG8gcmV0dXJuIFRSVUUgaWYgdGhlIGludGVyZmFjZSBpcyBub3Qgc2V0LgorCisJKiBkYnVzL2RidXMtc3RyaW5nLltoY106IG1vdmUgdGhlIEQtQlVTIHNwZWNpZmljIHZhbGlkYXRpb24gc3R1ZmYKKwl0byBkYnVzLW1hcnNoYWwtdmFsaWRhdGUuW2hjXQorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5jIChfZGJ1c190eXBlX3RvX3N0cmluZyk6IG1vdmUgaGVyZSBmcm9tCisJZGJ1cy1pbnRlcm5hbHMuYworCisJKiBkYnVzL01ha2VmaWxlLmFtOiBjdXQgb3ZlciBmcm9tIGRidXMtbWFyc2hhbC5baGNdCisJdG8gZGJ1cy1tYXJzaGFsLSouW2hjXQorCisJKiBkYnVzL2RidXMtb2JqZWN0LXRyZWUuYyAoX2RidXNfZGVjb21wb3NlX3BhdGgpOiBtb3ZlIHRoaXMKKwlmdW5jdGlvbiBoZXJlIGZyb20gZGJ1cy1tYXJzaGFsLmMKKworMjAwNS0wMS0xMiAgSm9lIFNoYXcgIDxqb2VzaGF3QG5vdmVsbC5jb20+CisKKwkqIE5FV1M6IFVwZGF0ZSBmb3IgMC4yMy4KKworCSogY29uZmlndXJlLmluOiBSZWxlYXNlIDAuMjMuCisKKzIwMDUtMDEtMTIgIEpvZSBTaGF3ICA8am9lc2hhd0Bub3ZlbGwuY29tPgorCisJKiBtb25vL01ha2VmaWxlLmFtLCBtb25vL2V4YW1wbGUvTWFrZWZpbGUuYW06IEFsd2F5cyBidWlsZCB0aGUgCisJZGJ1cyBETEwgd2l0aCAtLWRlYnVnLiAgQ2xlYW4gdXAgYWZ0ZXIgdGhlIC5tZGIgZmlsZXMgdGhpcyBsZWF2ZXMKKwliZWhpbmQuCisKKwkqIG1vbm8vZG9jL01ha2VmaWxlLmFtOiBOZWVkIHRvIHVuaW5zdGFsbCB0aGUgZG9jcyBvbiAibWFrZQorCXVuaW5zdGFsbCIKKworCSogbW9uby9Bcmd1bWVudHMuY3MgKEdldERCdXNUeXBlQ29uc3RydWN0b3IpOiBJZiB0aGUgdHlwZQorCWlzIGFuIGVudW0sIGdldCB0aGUgZW51bSdzIHVuZGVybHlpbmcgdHlwZS4gIEFub3RoZXIgbW9ubworCTEuMS4zIGZpeC4KKworMjAwNS0wMS0xMSAgSm9lIFNoYXcgIDxqb2VzaGF3QG5vdmVsbC5jb20+CisKKwlQYXRjaCBmcm9tIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKworCSogbW9uby9NYWtlZmlsZS5hbSwgbW9uby9leGFtcGxlL01ha2VmaWxlLmFtOiBEb24ndCByZWRlZmluZQorCURFU1RESVIuICBJdCBicmVha3Mgc3R1ZmYuCisKKzIwMDUtMDEtMTEgIEpvZSBTaGF3ICA8am9lc2hhd0Bub3ZlbGwuY29tPgorCisJUGF0Y2ggZnJvbSBUYW1iZXQgSW5nbyA8dGFtYmV0QHhpbWlhbi5jb20+CisKKwkqIG1vbm8vREJ1c1R5cGUvQXJyYXkuY3MgKEdldCk6IEdldCB0aGUgdW5kZXJseWluZyBlbGVtZW50IHR5cGUgYnkKKwljYWxsaW5nIHR5cGUuR2V0RWxlbWVudFR5cGUoKS4gIFRoZSBjb2RlIHByZXZpb3VzbHkgZGVwZW5kZWQgb24KKwlicm9rZW4gTW9ubyBiZWhhdmlvciwgd2hpY2ggd2FzIGZpeGVkIGluIE1vbm8gMS4xLjMuCisKKwkqIG1vbm8vREJ1c1R5cGUvRGljdC5jcyAoY29uc3RydWN0b3IpOiBGaXggdGhlIHBhcmFtZXRlcnMgZm9yCisJQWN0aXZhdG9yLkNyZWF0ZUluc3RhbmNlKCkgc28gdGhhdCB0aGUgY2xhc3MncyBjb25zdHJ1Y3RvciBpcworCWNhbGxlZCB3aXRoIHRoZSByaWdodCBwYXJhbWV0ZXJzLgorCisyMDA1LTAxLTExICBKb2UgU2hhdyAgPGpvZXNoYXdAbm92ZWxsLmNvbT4KKworCVBhdGNoIGZyb20gVGltbyBUZXLDpHMgPGV4dC10aW1vLnRlcmFzQG5va2lhLmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYworCShfZGJ1c19jb25uZWN0aW9uX3F1ZXVlX3JlY2VpdmVkX21lc3NhZ2VfbGluayk6IENhbGwKKwlfZGJ1c19jb25uZWN0aW9uX3JlbW92ZV90aW1lb3V0KCkgaW5zdGVhZCBvZiB0aGUgX2xvY2tlZCgpCisJdmFyaWFudCwgc2luY2UgaXQncyBhbHdheXMgY2FsbGVkIGZyb20KKwlfZGJ1c19jb25uZWN0aW9uX2hhbmRsZV93YXRjaCgpLCB3aGljaCBoYW5kbGVzIHRoZSBsb2NraW5nLgorCVJlbW92ZWQgdGhlIF9sb2NrZWQoKSB2YXJpYW50IHNpbmNlIGl0J3Mgbm8gbG9uZ2VyIHVzZWQuCisKKzIwMDUtMDEtMDMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmg6IEknbSBhbiBpZGlvdCwgX2RidXNfYXNzZXJ0IGNlcnRhaW5seSBjYW4KKwlyZXR1cm4KKwkKKzIwMDQtMTItMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmg6IGFkZCBfREJVU19HTlVDX05PUkVUVVJOIHRvIF9kYnVzX2Fzc2VydAorCisyMDA1LTAxLTAzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfc3lzZGVwc190ZXN0KTogZml4IHVzaW5nID09IG9uCisJZmxvYXRpbmcgcG9pbnQKKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfaW5zZXJ0X2FsaWdubWVudCk6IG5ldyBmdW5jdGlvbgorCisyMDA1LTAxLTAyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oIChfREJVU19BTElHTl9PRkZTRVQpOiBuZXcgbWFjcm8KKworMjAwNS0wMS0wMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIC1XZmxvYXQtZXF1YWwKKworMjAwNS0wMS0wMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmg6IGFkZCBfREJVU19ET1VCTEVTX0JJVFdJU0VfRVFVQUwgbWFjcm8sIAorCWZvciBhIHZhcmlldHkgb2YgcmVhc29ucyAnPT0nIGRvZXNuJ3QgZG8gdGhpcy4KKworMjAwNC0xMi0zMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZ3MpOiBuZXcgZnVuY3Rpb24KKwlJIGtlZXAgd2lzaGluZyBJIGhhZAorCisyMDA0LTEyLTMwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vZGJ1cy5weTogcy9BQ1RJVkFUSU9OX1JFUExZX0FDVElWRS9BQ1RJVkFUSU9OX1JFUExZX0FDVElWQVRFRAorCisyMDA0LTEyLTMwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXguaW46IENoYW5nZSBEQlVTX0FDVElWQVRJT05fUkVQTFlfQUNUSVZBVEVECisJYW5kIERCVVNfQUNUSVZBVElPTl9SRVBMWV9BTFJFQURZX0FDVElWRSB0byBtYXRjaCB0aGUgdmFsdWVzIGluCisJZGJ1cy1wcm90b2NvbC5oLiAgQmVjYXVzZSB0aGV5IGFyZSBkZWZpbmVzIGFuZCBub3QgZW51bXMgdGhleSBhcmUgbm90CisJYXV0b2dlbmVyYXRlZC4KKworMjAwNC0xMi0yNiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluIChidXNfYWN0aXZhdGVfc2VydmljZSk6IEJpbmQKKwlkYnVzX2J1c19hY3RpdmF0ZV9zZXJ2aWNlCisKKwkqIHB5dGhvbi9kYnVzLnB5IChCdXMuYWN0aXZhdGVfc2VydmljZSk6IGFjdGl2YXRlIGEgc2VydmljZSBvbiB0aGUKKwlidXMuCisKKzIwMDQtMTItMjQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0ZXN0L2RlY29kZS1nY292LmM6IGNoYW5nZSB0byB1c2UgLmdjbm8gYW5kIC5nY2RhIGZpbGVzLCBidXQgdGhlCisJZmlsZSBmb3JtYXQgaGFzIGFsc28gY2hhbmdlZCBhbmQgSSBoYXZlbid0IGFkYXB0ZWQgdG8gdGhhdCB5ZXQKKwkKKwkqIE1ha2VmaWxlLmFtOiBsb2FkIC5nY25vIGZpbGVzIGZyb20gbGF0ZXN0IGdjYworCisyMDA0LTEyLTIzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCSogUGF0Y2ggZnJvbSBSb2IgVGF5bG9yIDxyb2J0YXlsb3JAZmFzdG1haWwuZm0+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbiAoYnVzX2dldF91bml4X3VzZXIpOiBOZXcKKwlsb3dsZXZlbCBiaW5kaW5nCisKKwkqIHB5dGhvbi9kYnVzLnB5IChnZXRfdW5peF91c2VyKTogQWRkZWQgYmluZGluZyB0byAKKwljYWxsIGRidXNfYmluZGluZ3MuYnVzX2dldF91bml4X3VzZXIKKworCSogcHl0aG9uL2V4dHJhY3QucHk6IE1vZGlmaWVkIHRoZSBwcm90b19wYXQgcmVnZXggdG8KKwloYW5kbGUgdW5zaWduZWQgbG9uZworCisyMDA0LTEyLTIxICBPbGl2aWVyIEFuZHJpZXUgIDxvbGl2X19hQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZGJ1cy9tYWtlLWRidXMtZ2xpYi1lcnJvci1lbnVtLnNoOiBvbWl0IHRoZSBmdW5jdGlvbiBrZXl3b3JkIGZvcgorCWJldHRlciBQT1NJWCBjb21wbGlhbmNlLgorCisyMDA0LTEyLTE5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfaW5zZXJ0XzRfYWxpZ25lZCkgCisJKF9kYnVzX3N0cmluZ19pbnNlcnRfOF9hbGlnbmVkKTogbmV3IGZ1bmN0aW9ucworCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19hbGxvY19zcGFjZSk6IG5ldyBmdW5jdGlvbgorCisyMDA0LTEyLTE4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfdmFsaWRhdGVfYXNjaWkpOiB1c2UgSVNBU0NJSQorCW1hY3JvCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IGZpeCBhIGNvbW1lbnQsIGFuZCBhZGQgYSBzdGlsbC11bnVzZWQKKwlub3QtaW1wbGVtZW50ZWQgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuaDogZml4IGNvbW1lbnQKKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oIChfREJVU19JU0FTQ0lJKTogbmV3IG1hY3JvCisKKzIwMDQtMTItMTcgIEpvZSBTaGF3ICA8am9lc2hhd0Bub3ZlbGwuY29tPgorCisJKiBtb25vL0RCdXNUeXBlL0J5dGUuY3MsIG1vbm8vREJ1c1R5cGUvSW50MzIuY3MsCisJbW9uby9EQnVzVHlwZS9JbnQ2NC5jcywgbW9uby9EQnVzVHlwZS9VSW50MzIuY3MsCisJbW9uby9EQnVzVHlwZS9VSW50NjQuY3M6IFVzZSBFbnVtLkdldFVuZGVybHlpbmdUeXBlKCkgaW5zdGVhZCBvZgorCVR5cGUuVW5kZXJseWluZ1N5c3RlbVR5cGUgdG8gZ2V0IHRoZSBhY3R1YWwgc3lzdGVtIHR5cGUKKwl1bmRlcm5lYXRoLiAgVGhpcyBjb2RlIHByZXZpb3VzbHkgZGVwZW5kZWQgb24gdGhlIGJyb2tlbiBNb25vCisJYmVoYXZpb3IsIHdoaWNoIHdhcyBmaXhlZCBpbiAxLjEuMy4KKworMjAwNC0xMS0yNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuaCAoX2RidXNfc3RyaW5nX2dldF9ieXRlKTogaW5saW5lIHdoZW4gYXNzZXJ0cworCWFyZSBkaXNhYmxlZAorCShfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEpOiBpbmxpbmUgd2hlbiBhc3NlcnRzIGFyZSBkaXNhYmxlZAorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiByZWNvcmQgdGhlIF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbiBvZgorCWNyZWF0aW9uIHNvIHdlIGNhbiBjb21wbGFpbiBpZiBkYnVzX3NodXRkb3duKCkgaXMgdXNlZCBpbXByb3Blcmx5LgorCURvIHRoaXMgb25seSBpZiBjaGVja3MgYXJlIGVuYWJsZWQuCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IGRpdHRvCisJCisyMDA0LTExLTI2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdGVzdC9nbGliL3Rlc3QtcHJvZmlsZS5jOiBhZGQgd2l0aF9idXMgbW9kZSB0byBwcm9maWxlIGVjaG9lcworCXRoYXQgZ28gdGhyb3VnaCB0aGUgYnVzLgorCisJKiB0ZXN0L2dsaWIvcnVuLXRlc3Quc2g6IGFkZCBhYmlsaXR5IHRvIHJ1biB0ZXN0LXByb2ZpbGUKKworCSogYnVzL2RidXMtZGFlbW9uLTEuMS5pbjogZml4IHRvIHNheSB0aGF0IFNJR0hVUCBjYXVzZXMgcGFydGlhbAorCWNvbmZpZyBmaWxlIHJlbG9hZC4KKworMjAwNC0xMS0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvZ2xpYi90ZXN0LXByb2ZpbGUuYzogY2xlYW4gdXAgaG93IHRoZSBmYWtlX21hbGxvY19vdmVyaGVhZAorCXRoaW5nIHdhcyBpbXBsZW1lbnRlZAorCisyMDA0LTExLTI2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdGVzdC9nbGliL3Rlc3QtcHJvZmlsZS5jOiB0d2VhayBhIGJpdCwgYWRkIHN1cHBvcnQgZm9yIHNvbWUKKwltYWRlLXVwIG1pbmltYWwgbWFsbG9jIG92ZXJoZWFkIHdpdGggcGxhaW4gc29ja2V0cywgc2luY2UgaW4gCisJcmVhbCBsaWZlIHNvbWUgc29ydCBvZiBidWZmZXJzIGFyZSB1bmF2b2lkYWJsZSB0aHVzIHdlIGNvdWxkIAorCWNvdW50IHRoZW0gaW4gdGhlIHRoZW9yZXRpY2FsIGJlc3QgY2FzZQorCisyMDA0LTExLTI2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2NhY2hlX29yX2ZpbmFsaXplKTogZml4IGJ1ZworCXdoZXJlIEkgd2FzIHRyeWluZyB0byBjYWNoZSBvbmUgdG9vIG1hbnkgbWVzc2FnZXMKKworMjAwNC0xMS0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IHJlaW1wbGVtZW50IG1lc3NhZ2UgY2FjaGUgYXMgYW4gYXJyYXkgd2hpY2ggCisJbWFrZXMgdGhlIGNhY2hlIGFib3V0IHR3aWNlIGFzIGZhc3QgYW5kIHNhdmVzIG1heWJlIDEuNSUgb3ZlcmFsbAorCisyMDA0LTExLTI2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXRocmVhZHMuYyAoaW5pdF9nbG9iYWxfbG9ja3MpOiBmb3Jnb3QgdG8gcHV0IHRoZQorCW1lc3NhZ2UgY2FjaGUgbG9jayBoZXJlCisKKzIwMDQtMTEtMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChzdHJ1Y3QgREJ1c01lc3NhZ2UpOiBwdXQgdGhlIGxvY2tlZCBiaXQgYW5kCisJdGhlICJjaGFyIGJ5dGVfb3JkZXIiIG5leHQgdG8gZWFjaCBvdGhlciB0byBzYXZlIDQgYnl0ZXMKKwkoZGJ1c19tZXNzYWdlX25ld19lbXB0eV9oZWFkZXIpOiByZWR1Y2UgcHJlYWxsb2NhdGlvbiwgc2luY2UgdGhlCisJbWVzc2FnZSBjYWNoZSBzaG91bGQgYWNoaWV2ZSBhIHNpbWlsYXIgZWZmZWN0CisJKGRidXNfbWVzc2FnZV9jYWNoZV9vcl9maW5hbGl6ZSwgZGJ1c19tZXNzYWdlX2dldF9jYWNoZWQpOiBhZGQgYQorCW1lc3NhZ2UgY2FjaGUgdGhhdCBrZWVwcyBhIGZldyBEQnVzTWVzc2FnZSBhcm91bmQgaW4gYSBwb29sLAorCWFub3RoZXIgOCUgc3BlZWR1cCBvciBzby4KKworCSogZGJ1cy9kYnVzLWRhdGFzbG90LmMgKF9kYnVzX2RhdGFfc2xvdF9saXN0X2NsZWFyKTogbmV3IGZ1bmN0aW9uCisKKzIwMDQtMTEtMjUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYyAodW5peF9kb19pdGVyYXRpb24pOiBpZiB3ZSdyZSBnb2luZworCXRvIHdyaXRlLCB3aXRob3V0IHJlYWRpbmcgb3IgYmxvY2tpbmcsIHRyeSBpdCBiZWZvcmUgdGhlIHBvbGwoKQorCWFuZCBza2lwIHRoZSBwb2xsKCkgaWYgbm90aGluZyByZW1haW5zIHRvIHdyaXRlLiBUaGlzIGlzIGFib3V0IGEKKwkzJSBzcGVlZHVwIGluIHRoZSBlY2hvIGNsaWVudC9zZXJ2ZXIKKworMjAwNC0xMS0yNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKyAgICAgICAgVGhlIHByaW1hcnkgY2hhbmdlIGhlcmUgaXMgdG8gYWx3YXlzIHdyaXRlKCkgb25jZSBiZWZvcmUgYWRkaW5nCisJdGhlIHdyaXRlIHdhdGNoLCB3aGljaCBnaXZlcyB1cyBhYm91dCBhIDEwJSBwZXJmb3JtYW5jZSBpbmNyZWFzZS4KKwkKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jOiBhIG51bWJlciBvZiBtb2RpZmljYXRpb25zIHRvIGNvcGUKKwl3aXRoIHJlbW92aW5nIG1lc3NhZ2VzX3BlbmRpbmcKKwkoY2hlY2tfd3JpdGVfd2F0Y2gpOiBwcm9wZXJseSBoYW5kbGUKKwlEQlVTX0FVVEhfU1RBVEVfV0FJVElOR19GT1JfTUVNT1JZOyBhZGFwdCB0byByZW1vdmFsIG9mCisJbWVzc2FnZXNfcGVuZGluZyBzdHVmZgorCShjaGVja19yZWFkX3dhdGNoKTogcHJvcGVybHkgaGFuZGxlIFdBSVRJTkdfRk9SX01FTU9SWSBhbmQKKwlBVVRIRU5USUNBVEVEIGNhc2VzCisJKHVuaXhfaGFuZGxlX3dhdGNoKTogYWZ0ZXIgd3JpdGluZywgc2VlIGlmIHRoZSB3cml0ZSB3YXRjaCBjYW4gYmUKKwlyZW1vdmVkCisJKHVuaXhfZG9faXRlcmF0aW9uKTogYXNzZXJ0IHRoYXQgd3JpdGVfd2F0Y2gvcmVhZF93YXRjaCBhcmUKKwlub24tTlVMTCByYXRoZXIgdGhhbiB0ZXN0aW5nIHRoYXQgdGhleSBhcmVuJ3QsIHNpbmNlIHRoZXkgCisJYXJlbid0IGFsbG93ZWQgdG8gYmUgTlVMTC4gY2hlY2tfd3JpdGVfd2F0Y2goKSBhdCB0aGUgZW5kIHNvIAorCXdlIGFkZCB0aGUgd2F0Y2ggaWYgd2UgZGlkIG5vdCBmaW5pc2ggd3JpdGluZyAoZS5nLiBnb3QgRUFHQUlOKQorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXByb3RlY3RlZC5oOiByZW1vdmUgbWVzc2FnZXNfcGVuZGluZyBjYWxsLAorCXNpbmNlIGl0IHJlc3VsdGVkIGluIHRvbyBtdWNoIGluZWZmaWNpZW50IHdhdGNoIGFkZGluZy9yZW1vdmluZzsgCisJaW5zdGVhZCB3ZSBub3cgcmVxdWlyZSB0aGF0IHRoZSB0cmFuc3BvcnQgdXNlciBkb2VzIGFuIGl0ZXJhdGlvbiAKKwlhZnRlciBxdWV1ZWluZyBvdXRnb2luZyBtZXNzYWdlcywgYW5kIGFmdGVyIHRyeWluZyB0aGUgZmlyc3QKKwl3cml0ZSgpIHdlIGFkZCBhIHdyaXRlIHdhdGNoIGlmIHdlIGdvdCBFQUdBSU4gb3IgZXhjZWVkZWQgb3VyIAorCW1heCBieXRlcyB0byB3cml0ZSBwZXIgaXRlcmF0aW9uIHNldHRpbmcKKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfdmFsaWRhdGVfc2lnbmF0dXJlKTogYWRkIHRoaXMKKwlmdW5jdGlvbgorCisJKiBkYnVzL2RidXMtc2VydmVyLXVuaXguYyAodW5peF9maW5hbGl6ZSk6IHRoZSBzb2NrZXQgbmFtZSB3YXMKKwlmcmVlZCBhbmQgdGhlbiBhY2Nlc3NlZCwgdmFsZ3JpbmQgZmxhZ2dlZCB0aGlzIGJ1ZywgZml4IGl0CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IGZpeCBzZXZlcmFsIGJ1Z3Mgd2hlcmUgSEVBREVSX0ZJRUxEX0xBU1Qgd2FzIHRha2VuCisJYXMgdGhlIGxhc3QgdmFsaWQgZmllbGQgcGx1cyAxLCB3aGVyZSByZWFsbHkgaXQgaXMgZXF1YWwgdG8gdGhlCisJbGFzdCB2YWxpZCBmaWVsZC4gQ29ycmVjdHMgc29tZSBtZXNzYWdlIGNvcnJ1cHRpb24gaXNzdWVzLgorCisJKiBkYnVzL2RidXMtbWFpbmxvb3AuYzogdmVyYm9zaXR5IGNoYW5nZXMKKworCSogZGJ1cy9kYnVzLWtleXJpbmcuYyAoX2RidXNfa2V5cmluZ19uZXdfaG9tZWRpcik6IGhhbmRsZSBPT00KKwlpbnN0ZWFkIG9mIGFib3J0aW5nIGluIG9uZSBvZiB0aGUgdGVzdCBjb2RlcGF0aHMKKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c192ZXJib3NlX3JlYWwpOiBmaXggYSBidWcgdGhhdAorCWNhdXNlZCBub3QgcHJpbnRpbmcgdGhlIHBpZCBldmVyIGFnYWluIGlmIGEgdmVyYm9zZSB3YXMgbWlzc2luZworCXRoZSBuZXdsaW5lIGF0IHRoZSBlbmQKKwkoX2RidXNfaGVhZGVyX2ZpZWxkX3RvX3N0cmluZyk6IGFkZCBIRUFERVJfRklFTERfU0lHTkFUVVJFCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IHZlcmJvc2l0eSBjaGFuZ2VzOyAKKwkoZGJ1c19jb25uZWN0aW9uX2hhc19tZXNzYWdlc190b19zZW5kKTogbmV3IGZ1bmN0aW9uCisJKF9kYnVzX2Nvbm5lY3Rpb25fbWVzc2FnZV9zZW50KTogbm8gbG9uZ2VyIGNhbGwgdHJhbnNwb3J0LT5tZXNzYWdlc19wZW5kaW5nCisJKF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF9wcmVhbGxvY2F0ZWRfdW5sb2NrZWQpOiBkbyBvbmUgaXRlcmF0aW9uIHRvCisJdHJ5IHRvIHdyaXRlKCkgaW1tZWRpYXRlbHksIHNvIHdlIGNhbiBhdm9pZCB0aGUgd3JpdGUgd2F0Y2guIFRoaXMKKwlpcyB0aGUgY29yZSBwdXJwb3NlIG9mIHRoaXMgcGF0Y2hzZXQKKwkoX2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzX3VubG9ja2VkKTogaWYgZGlzY29ubmVjdGVkLAorCWR1bXAgdGhlIG91dGdvaW5nIG1lc3NhZ2UgcXVldWUsIHNvIG5vYm9keSB3aWxsIGdldCBjb25mdXNlZAorCXRyeWluZyB0byBzZW5kIHRoZW0gb3IgdGhpbmtpbmcgc3R1ZmYgaXMgcGVuZGluZyB0byBiZSBzZW50CisKKwkqIGJ1cy90ZXN0LmM6IHZlcmJvc2l0eSBjaGFuZ2VzCisKKwkqIGJ1cy9kcml2ZXIuYzogdmVyYm9zaXR5L2Fzc2VydGlvbiBjaGFuZ2VzCisKKwkqIGJ1cy9kaXNwYXRjaC5jOiBhIGJ1bmNoIG9mIGxpdHRsZSB0d2Vha3MgdG8gZ2V0IGl0IHdvcmtpbmcgYWdhaW4KKwliZWNhdXNlIHRoaXMgcGF0Y2hzZXQgY2hhbmdlcyB3aGVuL3doZXJlIHlvdSBuZWVkIHRvIGJsb2NrLgorCisyMDA0LTExLTIzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdGVzdC9nbGliL3Rlc3QtcHJvZmlsZS5jOiBtb2RpZnkgdG8gYWNjZXB0IGEgcGxhaW5fc29ja2V0cworCWFyZ3VtZW50IGluIHdoaWNoIGNhc2UgaXQgd2lsbCBiZW5jaCBwbGFpbiBzb2NrZXRzIGluc3RlYWQgb2YKKwlsaWJkYnVzLCBmb3IgY29tcGFyaXNvbiBwdXJwb3Nlcy4KKworMjAwNC0xMS0yMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvZ2xpYi90ZXN0LXByb2ZpbGUuYyAoTl9DTElFTlRfVEhSRUFEUyk6IHJ1biBtdWx0aXBsZQorCXRocmVhZHMgZm9yIG1vcmUgdGltZSwgc28gc3lzcHJvZiBjYW4gZ2V0IGEgZ3JpcCBvbiBpdC4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfdmFsaWRhdGVfdXRmOCk6IHJlbW92ZQorCXBvaW50bGVzcyB2YXJpYWJsZQorCisyMDA0LTExLTEzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdGVzdC9nbGliL3Rlc3QtcHJvZmlsZS5jOiBmaXggdGhpcyB0aGluZyB1cCBhIGJpdAorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfbmV3X2VtcHR5X2hlYWRlcik6IGluY3JlYXNlCisJcHJlYWxsb2NhdGlvbiBzaXplcyBieSBhIGZhaXIgYml0OyBub3Qgc3VyZSBpZiB0aGlzIHdpbGwgYmUgYW4KKwlvdmVyYWxsIHBlcmZvcm1hbmNlIHdpbiBvciBub3QsIGJ1dCBpdCBkb2VzIHJlZHVjZSByZWFsbG9jcy4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChzZXRfbGVuZ3RoLCByZWFsbG9jYXRlX2Zvcl9sZW5ndGgpOiBpZ25vcmUKKwl0aGUgdGVzdCBoYWNrIHRoYXQgZm9yY2VkIGNvbnN0YW50IHJlYWxsb2MgaWYgYXNzZXJ0cyBhcmUKKwlkaXNhYmxlZCwgc28gd2UgY2FuIHByb2ZpbGUgc2FuZWx5LiBTcHJpbmtsZSBpbiBzb21lCisJX0RCVVNfVU5MSUtFTFkoKSB3aGljaCBhcmUgcHJvYmFibHkgcG9pbnRsZXNzLCBidXQgYmVmb3JlIEkKKwlub3RpY2VkIHRoZSByZWFsIHBlcmZvcm1hbmNlIHByb2JsZW0gSSBwdXQgdGhlbSBpbi4KKwkoX2RidXNfc3RyaW5nX3ZhbGlkYXRlX3V0ZjgpOiBtaWNyby1vcHRpbWl6ZSB0aGlzIHRoaW5nIGEgbGl0dGxlCisJYml0LCB0aG91Z2ggY2FsbGdyaW5kIHNheXMgaXQgZGlkbid0IGhlbHA7IHRoZW4gc3BlY2lhbC1jYXNlCisJYXNjaWksIHdoaWNoIGRpZCBoZWxwIGEgbG90OyB0aGVuIGJlIHN1cmUgd2UgZGV0ZWN0IG51bCBieXRlcyBhcworCWludmFsaWQsIHdoaWNoIGlzIGEgYnVnZml4LgorCShhbGlnbl9sZW5ndGhfdGhlbl9sZW5ndGhlbik6IGFkZCBzb21lIG1vcmUgX0RCVVNfVU5MSUtFTFkKKwlzdXBlcnN0aXRpb247IHVzZSBtZW1zZXQgdG8gbnVsIHRoZSBwYWRkaW5nIGluc3RlYWQgb2YgYSBtYW51YWwKKwlsb29wLgorCShfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCk6IGlubGluZSB0aGlzIGFzIGEKKwltYWNybzsgaXQgc2hvd2VkIHVwIGluIHRoZSBwcm9maWxlIGJlY2F1c2UgaXQncyB1c2VkIGZvciBsb29wCisJdGVzdHMgYW5kIHNvIGZvcnRoCisKKzIwMDQtMTEtMTAgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGRidXMvZGJ1cy1zcGF3bi5jIChjaGVja19iYWJ5c2l0X2V2ZW50cyk6IEhhbmRsZSBFSU5UUiwKKwlmb3IgZXh0cmEgcGFyYW5vaWEuCisKKzIwMDQtMTEtMDkgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGgpOiBOZXcKKwlmdW5jdGlvbiwgd3JpdGVzIERCdXNTdHJpbmcgdG8gQyBidWZmZXIuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuaDogUHJvdG90eXBlIGl0LgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcpOiBOZXcKKwlmdW5jdGlvbiwgY29udmVydHMgbWVzc2FnZSB0eXBlIGludG8gQyBzdHJpbmcuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6IFByb3RvdHlwZSBpdC4KKworCSogYnVzL3NlbGludXguYyAoYnVzX3NlbGludXhfY2hlY2spOiBUYWtlIHNvdXJjZSBwaWQsCisJdGFyZ2V0IHBpZCwgYW5kIGF1ZGl0IGRhdGEuICBQYXNzIGF1ZGl0IGRhdGEgdG8KKwlhdmNfaGFzX3Blcm0uCisJKGxvZ19hdWRpdF9jYWxsYmFjayk6IE5ldyBmdW5jdGlvbiwgYXBwZW5kcyBleHRyYQorCWF1ZGl0IGluZm9ybWF0aW9uLgorCShidXNfc2VsaW51eF9hbGxvd3NfYWNxdWlyZV9zZXJ2aWNlKTogQWxzbyB0YWtlCisJc2VydmljZSBuYW1lLCBhZGQgaXQgdG8gYXVkaXQgZGF0YS4KKwkoYnVzX3NlbGludXhfYWxsb3dzX3NlbmQpOiBBbHNvIHRha2UgbWVzc2FnZQorCXR5cGUsIGludGVyZmFjZSwgbWV0aG9kIG1lbWJlciwgZXJyb3IgbmFtZSwKKwlhbmQgZGVzdGluYXRpb24sIGFuZCBhZGQgdGhlbSB0byBhdWRpdCBkYXRhLgorCShsb2dfY2IpOiBJbml0aWFsaXplIGZ1bmNfYXVkaXQuCisJCisJKiBidXMvc2VsaW51eC5oIChidXNfc2VsaW51eF9hbGxvd3NfYWNxdWlyZV9zZXJ2aWNlKQorCShidXNfc2VsaW51eF9hbGxvd3Nfc2VuZCk6IFVwZGF0ZSBwcm90b3R5cGVzIAorCisJKiBidXMvc2VydmljZXMuYyAoYnVzX3JlZ2lzdHJ5X2FjcXVpcmVfc2VydmljZSk6IFBhc3MKKwlzZXJ2aWNlIG5hbWUgdG8gYnVzX3NlbGludXhfYWxsb3dzX2FjcXVpcmVfc2VydmljZS4KKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kpOiBQYXNzCisJYWRkaXRpb25hbCBhdWRpdCBkYXRhLiAgTW92ZSBhc3NpZ25tZW50IG9mIGRlc3QKKwl0byBpdHMgb3duIGxpbmUuCisKKzIwMDQtMTEtMDcgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jIChkb19hdXRoZW50aWNhdGlvbik6IEFsd2F5cworCWluaXRpYWxpemUgYXV0aF9jb21wbGV0ZWQuCisJCisyMDA0LTExLTA3ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBidXMvYnVzLmMgKGxvYWRfY29uZmlnKTogQnJlYWsgaW50byB0aHJlZQorCXNlcGFyYXRlIGZ1bmN0aW9uczogcHJvY2Vzc19jb25maWdfZmlyc3RfdGltZV9vbmx5LAorCXByb2Nlc3NfY29uZmlnX2V2ZXJ5X3RpbWUsIGFuZCBwcm9jZXNzX2NvbmZpZ19wb3N0aW5pdC4KKwkocHJvY2Vzc19jb25maWdfZXZlcnlfdGltZSk6IE1vdmUgY2FsbCBvZgorCWJ1c19yZWdpc3RyeV9zZXRfc2VydmljZV9jb250ZXh0X3RhYmxlIGludG8KKwlwcm9jZXNzX2NvbmZpZ19wb3N0aW5pdC4KKwkocHJvY2Vzc19jb25maWdfcG9zdGluaXQpOiBOZXcgZnVuY3Rpb24sIGRvZXMKKwlhbnkgcHJvY2Vzc2luZyB0aGF0IG5lZWRzIHRvIGhhcHBlbiBsYXRlCisJaW4gaW5pdGlhbGl6YXRpb24gKGFuZCBhbHNvIG9uIHJlbG9hZCkuCisJKGJ1c19jb250ZXh0X25ldyk6IEluc3RlYWQgb2YgY2FsbGluZyBsb2FkX2NvbmZpZywKKwlvcGVuIGNvbmZpZyBwYXJzZXIgaGVyZSBhbmQgY2FsbCBwcm9jZXNzX2NvbmZpZ19maXJzdF90aW1lX29ubHkKKwlhbmQgcHJvY2Vzc19jb25maWdfZXZlcnlfdGltZSBkaXJlY3RseS4gIExhdGVyLCBhZnRlcgorCXdlIGhhdmUgZm9ya2VkIGJ1dCBiZWZvcmUgY2hhbmdpbmcgVUlELAorCWludm9rZSBidXNfc2VsaW51eF9mdWxsX2luaXQsIGFuZCB0aGVuIGNhbGwKKwlwcm9jZXNzX2NvbmZpZ19wb3N0aW5pdC4KKwkoYnVzX2NvbnRleHRfcmVsb2FkX2NvbmZpZyk6IEFzIGluIGJ1c19jb250ZXh0X25ldywKKwlsb2FkIHBhcnNlIGZpbGUgaW5zaWRlIGhlcmUsIGFuZCBjYWxsIHByb2Nlc3NfY29uZmlnX2V2ZXJ5X3RpbWUKKwlhbmQgcHJvY2Vzc19jb25maWdfcG9zdGluaXQuCisKKwkqIGJ1cy9zZXJ2aWNlcy5oLCBidXMvc2VydmljZXMuYworCShidXNfcmVnaXN0cnlfc2V0X3NlcnZpY2VfY29udGV4dF90YWJsZSk6IFJlbmFtZQorCWZyb20gYnVzX3JlZ2lzdHJ5X3NldF9zaWRfdGFibGUuICBUYWtlIHN0cmluZyBoYXNoIGZyb20gY29uZmlnCisJcGFyc2VyLCBhbmQgY29udmVydCB0aGVtIGhlcmUgaW50byBTSURzLgorCisJKiBidXMvY29uZmlnLXBhcnNlci5jIChzdHJ1Y3QgQnVzQ29uZmlnUGFyc2VyKTogSGF2ZQorCWNvbmZpZyBwYXJzZXIgb25seSBzdG9yZSBhIG1hcHBpbmcgb2Ygc2VydmljZS0+Y29udGV4dAorCXN0cmluZy4KKwkobWVyZ2Vfc2VydmljZV9jb250ZXh0X2hhc2gpOiBOZXcgZnVuY3Rpb24uCisJKG1lcmdlX2luY2x1ZGVkKTogTWVyZ2UgY29udGV4dCBzdHJpbmcgaGFzaGVzIGluc3RlYWQKKwlvZiB1c2luZyBidXNfc2VsaW51eF9pZF90YWJsZV91bmlvbi4KKwkoYnVzX2NvbmZpZ19wYXJzZXJfbmV3KTogRG9uJ3QgdXNlIGJ1c19zZWxpbnV4X2lkX3RhYmxlX25ldzsKKwlzaW1wbHkgY3JlYXRlIGEgbmV3IHN0cmluZyBoYXNoLgorCShidXNfY29uZmlnX3BhcnNlcl91bnJlZik6IFVucmVmIGl0LgorCShzdGFydF9zZWxpbnV4X2NoaWxkKTogU2ltcGx5IGluc2VydCBzdHJpbmdzIGludG8gaGFzaCwKKwlkb24ndCBjYWxsIGJ1c19zZWxpbnV4X2lkX3RhYmxlX2NvcHlfb3Zlci4KKworCSogYnVzL3NlbGludXguaCwgYnVzL3NlbGludXguYyAoYnVzX3NlbGludXhfaWRfdGFibGVfdW5pb24pCisJKGJ1c19zZWxpbnV4X2lkX3RhYmxlX2NvcHlfb3Zlcik6IERlbGV0ZS4KKworMjAwNC0xMS0wMyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogYnVzL3NlbGludXguYyAoYnVzX3NlbGludXhfcHJlX2luaXQpOiBLaWxsIHNvbWUgdW51c2VkCisJdmFyaWFibGVzLgorCQorMjAwNC0xMS0wMyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogYnVzL3Rlc3QtbWFpbi5jICh0ZXN0X3ByZV9ob29rKTogRml4IHRlc3QgbG9naWMsCisJdGhhbmtzIEpvZXJnIEJhcmZ1cnRoIDxKb2VyZy5CYXJmdXJ0aEBTdW4uQ09NPi4KKworMjAwNC0xMS0wMiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAcmVkaGF0LmNvbT4KKworCSogYnVzL3NlbGludXguYyAoYnVzX3NlbGludXhfaW5pdCk6IFNwbGl0IGludG8gdHdvIGZ1bmN0aW9ucywKKwlidXNfc2VsaW51eF9wcmVfaW5pdCBhbmQgYnVzX3NlbGludXhfcG9zdF9pbml0LgorCShidXNfc2VsaW51eF9wcmVfaW5pdCk6IEp1c3QgZGV0ZXJtaW5lIHdoZXRoZXIgU0VMaW51eCBpcworCWVuYWJsZWQuCisJKGJ1c19zZWxpbnV4X3Bvc3RfaW5pdCk6IERvIGV2ZXJ5dGhpbmcgZWxzZS4KKworCSogYnVzL21haW4uYyAobWFpbik6IENhbGwgYnVzX3NlbGludXhfcHJlX2luaXQgYmVmb3JlIHBhcnNpbmcKKwljb25maWcgZmlsZSwgYW5kIGJ1c19zZWxpbnV4X3Bvc3RfaW5pdCBhZnRlci4gIFRoaXMgZW5zdXJlcyB0aGF0CisJd2UgZG9uJ3QgbG9zZSB0aGUgcG9saWN5cmVsb2FkIG5vdGlmaWNhdGlvbiB0aHJlYWQgdGhhdAorCWJ1c19zZWxpbnV4X2luaXQgY3JlYXRlZCBiZWZvcmUgZm9ya2luZyBwcmV2aW91c2x5LgorCQorCSogYnVzL3Rlc3QtbWFpbi5jICh0ZXN0X3ByZV9ob29rKTogVXBkYXRlIGZvciBzcGxpdC4KKworMjAwNC0xMC0zMSAgT3dlbiBGcmFzZXItR3JlZW4gIDxvd2VuQGRpc2NvYmFiZS5uZXQ+CisKKwlQYXRjaCBmcm9tIEpvaGFuIEZpc2NoZXIgPGxpbnV4QGZpc2NoYXouY29tPgorCQorCSogbW9uby9kb2MvTWFrZWZpbGUuYW0gKGluc3RhbGwtZGF0YS1sb2NhbCk6IEFkZGVkIGRpcmVjdG9yeQorCWluc3RhbGwgZm9yIERFU1RESVIKKworMjAwNC0xMC0yOSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuaCAoX2RidXNfYmVjb21lX2RhZW1vbik6IEFsc28gdGFrZQorCXBhcmFtZXRlciBmb3IgZmQgdG8gd3JpdGUgcGlkIHRvLgkKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfYmVjb21lX2RhZW1vbik6IEltcGxlbWVudCBpdC4KKwkKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfbmV3KTogUGFzcyBwcmludF9waWRfZmQKKwl0byBfZGJ1c19iZWNvbWVfZGFlbW9uIChidWcgIzE3MjApCisKKzIwMDQtMTAtMjkgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHJlZGhhdC5jb20+CisKKwlQYXRjaCBmcm9tIEVkIENhdG11ciA8ZWRAY2F0bXVyLmNvLnVrPgorCisJKiBtb25vL2RvYy9NYWtlZmlsZS5hbSAoaW5zdGFsbC1kYXRhLWxvY2FsKTogSGFuZGxlCisJREVTVERJUi4KKworMjAwNC0xMC0yOSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAcmVkaGF0LmNvbT4KKworCSogYnVzLy5jdnNpZ25vcmUsIHF0Ly5jdnNpZ25vcmU6IFVwZGF0ZS4KKworMjAwNC0xMC0yOSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAcmVkaGF0LmNvbT4KKworCVBhdGNoIGZyb20gS3Jpc3RvZiBWYW5zYW50IDxkZV9sdXB1c0BwYW5kb3JhLmJlPgorCisJKiBjb25maWd1cmUuaW46IERldGVjdCBTbGFja3dhcmUuCisJKiBidXMvTWFrZWZpbGUuYW0gKFNDUklQVF9JTl9GSUxFUyk6IEFkZCByYy5tZXNzYWdlYnVzLmluLgorCSogYnVzL3JjLm1lc3NhZ2VidXMuaW46IE5ldyBmaWxlLgorCisyMDA0LTEwLTI5ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0ByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLW1vbml0b3IuYyAoZmlsdGVyX2Z1bmMpOiBSZXR1cm4KKwlEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQgaW4gZmlsdGVyIGZ1bmN0aW9uCisJZm9yIG5vdy4gIFNlZToKKwlodHRwOi8vZnJlZWRlc2t0b3Aub3JnL3BpcGVybWFpbC9kYnVzLzIwMDQtQXVndXN0LzAwMTQzMy5odG1sCisKKzIwMDQtMTAtMjkgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHJlZGhhdC5jb20+CisKKwlQYXRjaCBmcm9tIE1hdHRoZXcgUmlja2FyZCA8bWpyaWNrYUBlcG9jaC5uY3NjLm1pbD4KKworCSogYnVzL3NlcnZpY2VzLmMgKGJ1c19yZWdpc3RyeV9hY3F1aXJlX3NlcnZpY2UpOiAKKwlDb3JyZWN0bHkgcmV0cmlldmUgc2VydmljZSBuYW1lIGZyb20gREJ1c1N0cmluZworCWZvciBwcmludGluZy4KKworMjAwNC0xMC0yOSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWdsaWIuaDogVXBkYXRlIGRvY3VtZW50YXRpb24gdG8gbm90CisJcmVmZXIgdG8gaW50ZXJuYWwgQVBJcy4KKworMjAwNC0xMC0yNyAgSm9lIFNoYXcgIDxqb2VzaGF3QG5vdmVsbC5jb20+CisKKwkqIG1vbm8vQXJndW1lbnRzLmNzIChHZXREQnVzVHlwZUNvbnN0cnVjdG9yKToKKwl0eXBlLlVuZGVybHlpbmdTeXN0ZW1UeXBlIHdpbGwgcmV0dXJuICJTeXN0ZW0uQnl0ZSIgaWYgeW91IGRvIGl0CisJb24gImJ5dGVbXSIsIHdoaWNoIGlzIG5vdCB3aGF0IHdlIHdhbnQuICBTbyBjaGVjayB0aGUgdHlwZS5Jc0FycmF5CisJcHJvcGVydHkgYW5kIHVzZSBTeXN0ZW0uQXJyYXkgaW5zdGVhZC4KKworMjAwNC0xMC0yNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoZmlsbF91c2VyX2luZm8pOiBPbiBlcnJvcnMgZG8gbm90IGZyZWUKKwl0aGUgREJ1c1VzZXJJbmZvIHN0cnVjdHVyZSBzaW5jZSB0aGlzIGlzIHBhc3NlZCBpbnRvIHRoZSBmdW5jdGlvbi4KKwlUaGlzIHdvdWxkIGNhdXNlIGEgZG91YmxlIGZyZWUgd2hlbiB0aGUgZnVuY3Rpb24gdGhhdCBhbGxvY2F0ZWQKKwl0aGUgc3RydWN0dXJlIHdvdWxkIHRyeSB0byBmcmVlIGl0IHdoZW4gYW4gZXJyb3Igb2NjdXJlZC4KKworCSogKGJ1cy9zZXNzaW9uLmNvbmYuaW4sIGJ1cy9NYWtlZmlsZS5hbSwgZGJ1cy9jb25maWd1cmUuaW4pOgorCXVzZSAvdXNyL3NoYXJlL2RidXMtMS9zZXJ2aWNlcyBpbnN0ZWFkIG9mIC91c3IvbGliL2RidXMtMS4wL3NlcnZpY2VzCisJZm9yIHNlcnZpY2UgYWN0aXZhdGlvbiB0byBhdm9pZCAzMmJpdC82NGJpdCBwYXJhbGxlbCBpbnN0YWxsIGlzc3VlcworCisyMDA0LTEwLTIxICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBBVVRIT1JTOiBGaXggbXkgZW1haWwgYWRkcmVzcywgdGhlIEBnbnUub3JnIG9uZQorCWhhcyBiZWVuIGJvdW5jaW5nIGZvciBzb21lIHRpbWUuICBBbHNvIGFkZCBKNS4KKwkKKzIwMDQtMTAtMjEgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jIChkb19hdXRoZW50aWNhdGlvbik6IFJldHVybgorCWF1dGhlbnRpY2F0aW9uIHN0YXR1cyB0byBjYWxsZXJzLgorCSh1bml4X2hhbmRsZV93YXRjaCk6IElmIHdlIGNvbXBsZXRlZCBhdXRoZW50aWNhdGlvbiB0aGlzIHJvdW5kLAorCWRvbid0IGRvIGFub3RoZXIgcmVhZC4gIEluc3RlYWQgd2FpdCB1bnRpbCB0aGUgbmV4dCBpdGVyYXRpb24sCisJYWZ0ZXIgd2UndmUgcmVhZCBhbnkgcGVuZGluZyBkYXRhIGluIHRoZSBhdXRoIGJ1ZmZlci4KKwkodW5peF9kb19pdGVyYXRpb24pOiBEaXR0by4KKwkodW5peF9oYW5kbGVfd2F0Y2gpOiBVcGRhdGVkIGZvciBuZXcgZG9fYXV0aGVudGljYXRpb24gcHJvdG90eXBlLgorCisyMDA0LTEwLTE4ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBidXMvc2VsaW51eC5jIChidXNfc2VsaW51eF9lbmFibGVkKTogSGFuZGxlCisJLS1kaXNhYmxlLXNlbGludXggY2FzZS4KKwkKKzIwMDQtMTAtMTggIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGJ1cy9zZWxpbnV4Lmg6IEFkZCBidXNfc2VsaW51eF9lbmFibGVkLgorCQorCSogYnVzL3NlbGludXguYyAoYnVzX3NlbGludXhfZW5hYmxlZCk6IEltcGxlbWVudCBpdC4KKwkKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKHN0cnVjdCBpbmNsdWRlKTogQWRkCisJaWZfc2VsaW51eF9lbmFibGVkIG1lbWJlci4KKwkoc3RhcnRfYnVzY29uZmlnX2NoaWxkKTogUGFyc2UgaWZfc2VsaW51eF9lbmFibGVkCisJYXR0cmlidXRlIGZvciBpbmNsdWRlLgorCShidXNfY29uZmlnX3BhcnNlcl9jb250ZW50KTogSGFuZGxlIGl0LgorCisJKiBidXMvc2Vzc2lvbi5jb25mLmluLCBidXMvc3lzdGVtLmNvbmYuaW46IEFkZAorCWluY2x1c2lvbiBvZiBjb250ZXh0IG1hcHBpbmcgdG8gZGVmYXVsdCBjb25maWcgZmlsZXM7CisJY29uZGl0aW9uYWwgb24gU0VMaW51eCBiZWluZyBlbmFibGVkLgorCQorCSogZG9jL2J1c2NvbmZpZy5kdGQ6IEFkZCB0byBpZl9zZWxpbnV4X2VuYWJsZWQgdG8gZGVmYXVsdCBEVEQuCisJCisJKiB0ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvYmFkc2VsaW51eC0xLmNvbmYsIAorCXRlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9iYWRzZWxpbnV4LTIuY29uZjoKKwlUZXN0IGZpbGVzIGZvciBiYWQgc3ludGF4LgorCQorMjAwNC0xMC0xNyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZGJ1cy9kYnVzLW1lbW9yeS5jIChfZGJ1c19pbml0aWFsaXplX21hbGxvY19kZWJ1ZywgY2hlY2tfZ3VhcmRzKQorCShkYnVzX21hbGxvYywgZGJ1c19tYWxsb2MwLCBkYnVzX3JlYWxsb2MpOiBGaXggdXAgcHJpbnRmCisJZm9ybWF0IHNwZWNpZmllciBtaXNtYXRjaGVzLgorCisyMDA0LTEwLTA3ICBPbGl2aWVyIEFuZHJpZXUgIDxvbGl2X19hQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfZmlsZV9nZXRfY29udGVudHMpOiBmaXggYW4gaW5jb3JyZWN0CisJZm9ybWF0IHN0cmluZy4KKworCSogZ2xpYi9kYnVzLWRidXMtZ21haW4uYyAoZGJ1c19nX2J1c19nZXQpOiBkbyBub3QgbWFuZ2xlIE5VTEwKKwlwb2ludGVyIChidWcgIzE1NDAsIExlb25hcmRvIEJvaWtvKS4KKworMjAwNC0wOS0yOCAgSm9uIFRyb3dicmlkZ2UgIDx0cm93QHhpbWlhbi5jb20+CisKKwkqIG1vbm8vQnVzRHJpdmVyLmNzOiBDaGFuZ2VkIEJ1c0RyaXZlciBzdHJ1Y3QgdG8gcmVtb3ZlCisJdGhlIFNlcnZpY2VDcmVhdGVkIGFuZCBTZXJ2aWNlRGVsZXRlZCBldmVudHMgYW5kIHJlcGxhY2UgdGhlbQorCXdpdGggdGhlIG5ldyBTZXJ2aWNlT3duZXJDaGFuZ2VkIGV2ZW50LgorCisJKiBtb25vL2V4YW1wbGUvQnVzTGlzdGVuZXIuY3M6IEFkZGVkIGEgbmV3IGV4YW1wbGUgcHJvZ3JhbSwKKwl3aGljaCBsaXN0ZW5zIGZvciBhbmQgcmVwb3J0cyBhbnkgU2VydmljZU93bmVyQ2hhbmdlZCBldmVudHMKKwlvbiB0aGUgYnVzIGRyaXZlci4KKworCSogbW9uby9leGFtcGxlL01ha2VmaWxlLmFtIChERVNURElSKTogQnVpbGQgY2hhbmdlcyBmb3IgdGhlCisJbmV3IEJ1c0xpc3RlbmVyLmNzIGV4YW1wbGUuCisKKzIwMDQtMDktMjcgIE9saXZpZXIgQW5kcmlldSAgPG9saXZfX2FAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBidXMvc2lnbmFscy5jIChidXNfbWF0Y2hfcnVsZV9wYXJzZSk6IHZhbGlkYXRlIHRoZSBjb21wb25lbnRzIG9mCisJbWF0Y2ggcnVsZXMgKGJ1ZyAjMTQzOSkuCisKKwkqIGRidXMvZGJ1cy1idXMuYyAoZGJ1c19idXNfYWRkX21hdGNoKTogYWRkIGEgbWlzc2luZyBPT00gdGVzdC4KKworMjAwNC0wOS0yNCAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBkb2N1bWVudCBTZXJ2aWNlT3duZXJDaGFuZ2VkCisJc2lnbmFsLgorCQorCSogYnVzL2RyaXZlci5jLCBidXMvZHJpdmVyLmgsIGJ1cy9zZXJ2aWNlcy5jOiBVc2UKKwlTZXJ2aWNlT3duZXJDaGFuZ2VkIHNpZ25hbCBpbnN0ZWFkIG9mIFNlcnZpY2VDcmVhdGVkIGFuZAorCVNlcnZpY2VEZWxldGVkLgorCQorCSogYnVzL2Rpc3BhdGNoLmM6IHVwZGF0ZSB0ZXN0Y2FzZSBmb3IgdGhlIG5ldyBzaWduYWwuCisKKzIwMDQtMDktMjAgIEpvbiBUcm93YnJpZGdlICA8dHJvd0B4aW1pYW4uY29tPgorCisJUGF0Y2ggZnJvbSBOYXQgRnJpZWRtYW4gPG5hdEBub3ZlbGwuY29tPgorCisJKiBtb25vL01ha2VmaWxlLmFtOiBBIG51bWJlciBvZiBzbWFsbCBidWlsZCBmaXhlcyB0byBhbGxvdyAibWFrZQorCWRpc3RjaGVjayIgdG8gc3VjY2VlZC4KKworCSogbW9uby9leGFtcGxlL01ha2VmaWxlLmFtOiAibWFrZSBkaXN0Y2hlY2siIGZpeGVzLgorCisJKiBtb25vL0Fzc2VtYmx5SW5mby5jcy5pbjogV2hlbiBzaWduaW5nIHRoZSBhc3NlbWJseSwgbG9vayBmb3IgdGhlCisJa2V5IGluIEBzcmNkaXJALgorCisJKiB0ZXN0L01ha2VmaWxlLmFtOiAibWFrZSBkaXN0Y2hlY2siIGZpeGVzLgorCisyMDA0LTA5LTE3ICBPbGl2aWVyIEFuZHJpZXUgIDxvbGl2X19hQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfdXNlcl9hdF9jb25zb2xlKTogZml4IG1lbWxlYWsgaW4gT09NLgorCisJKiBkb2MvYnVzY29uZmlnLmR0ZDogdXBkYXRlIHRoZSBEVEQgZm9yIHRoZSBhdF9jb25zb2xlIGF0dHJpYnV0ZS4KKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2hhbmRsZV9oZWxsbyk6IGNvcnJlY3RseSBoYW5kbGUgSGVsbG8KKwltZXNzYWdlcyBhZnRlciB0aGUgZmlyc3Qgb25lIChidWcgIzEzODkpLgorCQorCSogYnVzL2Rpc3BhdGNoLmMgKGNoZWNrX2RvdWJsZV9oZWxsb19tZXNzYWdlKTogYWRkIGEgdGVzdCBjYXNlIGZvcgorCXRoZSBkb3VibGUgaGVsbG8gbWVzc2FnZSBidWcuCisJKGNoZWNrX2V4aXN0ZW50X3NlcnZpY2VfYWN0aXZhdGlvbik6IGZpeCBjaGVjayBvZiBzcGF3bmluZyBlcnJvci4KKwkKKzIwMDQtMDktMTYgIERhdmlkIFpldXRoZW4gIDxkYXZpZEBmdWJhci5kaz4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluOiBBZGQgc3VwcG9ydCBmb3IgaW50NjQgYW5kIHVpbnQ2NAorCisyMDA0LTA5LTEyICBEYXZpZCBaZXV0aGVuICA8ZGF2aWRAZnViYXIuZGs+CisKKwlQYXRjaCBmcm9tIEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9uZXcpOgorCSogYnVzL2J1cy5oOgorCSogYnVzL21haW4uYyAodXNhZ2UpCisJKG1haW4pOgorCUFkZCBjb21tYW5kbGluZSBvcHRpb24gLS1ub2ZvcmsgdG8gb3ZlcnJpZGUgY29uZmlndXJhdGlvbiBmaWxlCisJc2V0dGluZy4KKworMjAwNC0wOS0wOSAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGRidXMvZGJ1cy0qLmg6IHJlbW92ZSB0aGUgOyBhZnRlciBEQlVTXyhCRUdJTnxFTkQpX0RFQ0xTLiBTb21lIEMKKwljb21waWxlcnMgZG9uJ3QgbGlrZSBpdCAoYnVnICM5NzQpLgorCisyMDA0LTA5LTA0ICBIYXJhbGQgRmVybmVuZ2VsICA8aGFycnlAa2RldmVsb3Aub3JnPgorCisJKiBxdC9jb25uZWN0aW9uLio6IEFwcGxpZWQgcGF0Y2ggYnkgSsOpcsO0bWUgTG9kZXd5Y2sKKwk8bG9kZXd5Y2tAY2xpcHBlci5lbnMuZnI+IHRvIGludGVncmF0ZSBhbiBleGlzdGluZworCWNvbm5lY3Rpb24gaW50byB0aGUgUXQgZXZlbnRsb29wCisKKzIwMDQtMDgtMzAgIEpvbiBUcm93YnJpZGdlICA8dHJvd0B4aW1pYW4uY29tPgorCisJKiBtb25vL0J1c0RyaXZlci5jczogQWRkZWQuICBUaGlzIGlzIGEgY2xhc3MgZm9yIGludGVyYWN0aW5nIHdpdGgKKwl0aGUgb3JnLmZyZWVkZXNrdG9wLkRCdXMgc2VydmljZS4KKworCSogbW9uby9NZXNzYWdlLmNzOiBBZGRlZCBhIG1lY2hhbmlzbSB0byBleHBvc2UgdGhlIG1lc3NhZ2UgdGhhdCBpcworCWN1cnJlbnRseSBiZWluZyBkaXNwYXRjaGVkIHZpYSB0aGUgc3RhdGljIE1lc3NhZ2UuQ3VycmVudAorCXByb3BlcnR5LiAgQWRkZWQgTWVzc2FnZS5TZW5kZXIgYW5kIE1lc3NhZ2UuRGVzdGluYXRpb24KKwlwcm9wZXJ0aWVzLgorCisJKiBtb25vL0hhbmRsZXIuY3M6IEV4cG9zZSB0aGUgZGlzcGF0Y2hlZCBtZXNzYWdlIHZpYQorCU1lc3NhZ2UuQ3VycmVudCB3aGVuIGhhbmRsaW5nIG1ldGhvZCBjYWxscy4KKworCSogbW9uby9TZXJ2aWNlLmNzOiBFeHBvc2UgdGhlIGRpc3BhdGNoZWQgbWVzc2FnZSB2aWEKKwlNZXNzYWdlLkN1cnJlbnQgd2hlbiBoYW5kbGluZyBzaWduYWwgZW1pc3Npb25zLgorCQorCSogbW9uby9Db25uZWN0aW9uLmNzOiBCaW5kIGRidXNfYnVzX2dldF9iYXNlX3NlcnZpY2UgdmlhIHRoZQorCUNvbm5lY3Rpb24uQmFzZVNlcnZpY2UgcHJvcGVydHkuCisKKzIwMDQtMDgtMjggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdXNlcmRiLmMgKF9kYnVzX2lzX2NvbnNvbGVfdXNlcik6IHJlbW92ZSB1bnVzZWQgdmFyaWFibGUKKworICAgICAgICBNb3JlIGZpeGVzIGZyb20gU3RldmUgR3J1YmIKKwkKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2Nvbm5lY3RfdGNwX3NvY2tldCk6IGZpeCBmZCBsZWFrCisJKF9kYnVzX2xpc3Rlbl90Y3Bfc29ja2V0KTogZml4IGZkIGxlYWsKKworCSogZGJ1cy9kYnVzLXNwYXduLmMgKHJlYWRfcGlkLCByZWFkX2ludHMpOiBtb3ZlIHRoZSAiYWdhaW46IiBmb3IKKwlFSU5UUiB0byBhIGJpdCBsb3dlciBpbiB0aGUgY29kZQorCisyMDA0LTA4LTI2ICBKb24gVHJvd2JyaWRnZSAgPHRyb3dAeGltaWFuLmNvbT4KKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2hhbmRsZV9zZXJ2aWNlX2V4aXN0cyk6IFJlc3BvbmQgd2l0aAorCVRSVUUgaWYgd2UgYXJlIGlucXVpcmluZyBhYm91dCB0aGUgZXhpc3RlbmNlIG9mIHRoZSBidWlsdC1pbgorCW9yZy5mcmVlZGVza3RvcC5EQnVzIHNlcnZpY2UuCisKKzIwMDQtMDgtMjUgIEpvaG4gUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCSogYnVzL2NvbmZpZy1wYXJzZXIuYzoKKwkoc3RydWN0IFBvbGljeVR5cGUpOiBBZGQgUE9MSUNZX0NPTlNPTEUKKwkoc3RydWN0IEVsZW1lbnQuZC5wb2xpY3kpOiBzL2dpZF9vcl91aWQvZ2lkX3VpZF9vcl9hdF9jb25zb2xlCisJKHN0YXJ0X2J1c2NvbmZpZ19jaGlsZCk6IFNldHMgdXAgY29uc29sZSBlbGVtZW50IHdoZW4KKwk8cG9saWN5IGF0X2NvbnNvbGU9IiI+IGlzIGVuY291bnRlcmVkIGluIGEgcG9saWN5IGZpbGUKKwkoYXBwZW5kX3J1bGVfZnJvbV9lbGVtZW50KTogQ29udmVydCBjb25zb2xlIGVsZW1lbnRzIHRvIGNvbnNvbGUKKwlydWxlcy4KKworCSogYnVzL3BvbGljeS5jOiAKKwkoYnVzX3BvbGljeV9jcmVhdGVfY2xpZW50X3BvbGljeSk6IEFkZCBjb25zb2xlIHJ1bGVzIHRvIHRoZSBjbGllbnQKKwlwb2xpY3kgYmFzZWQgb24gaWYgdGhlIGNsaWVudCBpcyBhdCB0aGUgY29uc29sZQorCShidXNfcG9saWN5X2FwcGVuZF9jb25zb2xlX3J1bGUpOiBOZXcgZnVuY3Rpb24gZm9yIGFkZGluZyBhCisJY29uc29sZSBydWxlIHRvIGEgcG9saWN5CisJKGJ1c19wb2xpY3lfbWVyZ2UpOiBIYW5kbGUgY29uc29sZSBydWxlIG1lcmdpbmcKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuaDogQWRkZWQgdGhlIERCVVNfQ09OU09MRV9ESVIgY29uc3RhbnQKKwl3aGVyZSB3ZSBjaGVjayBmb3IgY29uc29sZSB1c2VyIGZpbGVzCisJCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOgorCShfZGJ1c19maWxlX2V4aXN0cyk6IE5ldyBmdW5jdGlvbiB3aGljaCBjaGVja3MgaWYgdGhlIGdpdmVuCisJZmlsZSBleGlzdHMKKwkoX2RidXNfdXNlcl9hdF9jb25zb2xlKTogTmV3IGZ1bmN0aW9uIHdoaWNoIGRvZXMgdGhlIHN5c3RlbQorCXNwZWNpZmljIHByb2Nlc3Mgb2YgY2hlY2tpbmcgaWYgdGhlIHVzZXIgaXMgYXQgdGhlIGNvbnNvbGUKKworCSogZGJ1cy9kYnVzLXVzZXJkYi5jOgorCShfZGJ1c19pc19jb25zb2xlX3VzZXIpOiBOZXcgZnVuY3Rpb24gY29udmVydHMgYSBVSUQgdG8gdXNlciBuYW1lCisJYW5kIHRoZW4gY2FsbHMgdGhlIHN5c3RlbSBzcGVjaWZpYyBfZGJ1c191c2VyX2F0X2NvbnNvbGUgdG8gCisJc2VlIGlmIHRoZSB1c2VyIGlzIGF0IHRoZSBjb25zb2xlIGFuZCB0aGVyZWZvciBhIGNvbnNvbGUgdXNlcgorCisyMDA0LTA4LTI1ICBPbGl2aWVyIEFuZHJpZXUgIDxvbGl2X19hQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYyAoc2V0X2xpbWl0KToKKwkqIGJ1cy9kYnVzLWRhZW1vbi0xLjEuaW46CisJKiB0ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL21hbnktcnVsZXMuY29uZjogc2V0IHRoZQorCW1heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbiBsaW10IGZyb20gdGhlIGNvbmZpZyBmaWxlLiAKKworCSogZG9jL2J1c2NvbmZpZy5kdGQ6IHVwZGF0ZSB0aGUgRFRELgorCisJKiBidXMvZHJpdmVyLmM6IHJlbW92ZSBzb21lIHVudXNlZCB2YXJpYWJsZXMuCisKKzIwMDQtMDgtMjQgIE1pa2FlbCBIYWxsZW5kYWwgIDxtaWNrZUBpbWVuZGlvLmNvbT4KKworCSogZGJ1cy9kYnVzLWdsaWItbG93bGV2ZWwuaDogUmVtb3ZlZCBkYnVzX2J1c19nZXRfd2l0aF9nX21haW4gc2luY2UgCisJaXQncyBiZWVuIHJlcGxhY2VkIGJ5IGRidXNfZ19idXNfZ2V0CisKKzIwMDQtMDgtMjMgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHJlZGhhdC5jb20+CisKKwlVcGRhdGVkIFNFTGludXggc3VwcG9ydCBmcm9tIE1hdHRoZXcgUmlja2FyZCA8bWpyaWNrYUBlcG9jaC5uY3NjLm1pbD4KKworCSogYnVzL3NlbGludXguaDogUHJvdG90eXBlIGJ1c19zZWxpbnV4X2dldF9wb2xpY3lfcm9vdC4KKworCSogYnVzL3NlbGludXguYzogQ3JlYXRlIGEgdGhyZWFkIGZvciBwb2xpY3kgcmVsb2FkIG5vdGlmaWNhdGlvbi4KKwkoYnVzX3NlbGludXhfZ2V0X3BvbGljeV9yb290KTogSW1wbGVtZW50LgorCisJKiBidXMvY29uZmlnLXBhcnNlci5jIChzdGFydF9idXNjb25maWdfY2hpbGQpCisJKGJ1c19jb25maWdfcGFyc2VyX2NvbnRlbnQpOiBTdXBwb3J0IFNFTGludXgtcm9vdCByZWxhdGl2ZQorCWluY2x1c2lvbi4KKworCSogY29uZmlndXJlLmluIDxIQVZFX1NFTElOVVg+OiBBZGQgLWxwdGhyZWFkLgorCQorCSogYnVzL3Rlc3QtbWFpbi5jICh0ZXN0X3ByZV9ob29rLCB0ZXN0X3Bvc3RfaG9vayk6IE5ldy4KKwkodGVzdF9wb3N0X2hvb2spOiBNb3ZlIG1lbW9yeSBjaGVja2luZyBpbnRvIGhlcmUuCisJKHRlc3RfcHJlX2hvb2ssIHRlc3RfcG9zdF9ob29rKTogTW92ZSBTRUxpbnV4IGNoZWNrcyBpbgorCWhlcmUsIGJ1dCBjb25kaXRpb25hbCBvbiBhIERCVVNfVEVTVF9TRUxJTlVYIGVudmlyb25tZW50CisJdmFyaWFibGUuICBVbmZvcnR1bmF0ZWx5IHdlIGNhbid0IHJ1biB0aGUgU0VMaW51eCBjaGVja3MKKwlhcyBhIG5vcm1hbCB1c2VyLCBzaW5jZSB0aGV5IHdvbid0IGhhdmUgYW55IHBlcm1pc3Npb25zCisJZm9yIC9zZWxpbnV4LiAgU28gdGhpcyB3aWxsIGhhdmUgdG8gYmUgdGVzdGVkIG1hbnVhbGx5CisJZm9yIG5vdywgdW50aWwgd2UgaGF2ZSB2aXJ0dWFsaXphdGlvbiBmb3IgbW9zdCBvZgorCWxpYnNlbGludXguCisJCisyMDA0LTA4LTIzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfY2hhbmdlX2lkZW50aXR5KTogYWRkIHNldGdyb3VwcygpIHRvCisJZHJvcCBzdXBwbGVtZW50YXJ5IGdyb3Vwcywgc3VnZ2VzdGVkIGJ5IFN0ZXZlIEdydWJiCisKKzIwMDQtMDgtMjAgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKHN0YXJ0X2J1c2NvbmZpZ19jaGlsZCk6IFJlbW92ZSBzb21lIHVudXNlZAorCXZhcmlhYmxlcy4KKwkKKwkqIGJ1cy9zZWxpbnV4LmMgKGJ1c19zZWxpbnV4X2lkX3RhYmxlX2luc2VydCk6IEF2b2lkIGNvbXBpbGVyCisJd2FybmluZy4KKworMjAwNC0wOC0xNyAgSm9lIFNoYXcgIDxqb2VzaGF3QG5vdmVsbC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogSWYgLS1lbmFibGUtbW9ubyBpcyBwYXNzZWQgaW4sIGlmIHdlIGNhbid0IGZpbmQKKwltb25vIGVycm9yIG91dC4KKworCSogbW9uby9NYWtlZmlsZS5hbTogVXNlIC9nYWN1dGlsIHRvIGluc3RhbGwgYXNzZW1ibGllcyBpbnRvIHRoZQorCUdBQyBhbmQgbm90IC9yb290LgorCisyMDA0LTA4LTEyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogTkVXUzogdXBkYXRlIGZvciAwLjIyCisKKwkqIGNvbmZpZ3VyZS5pbjogcmVsZWFzZSAwLjIyCisKKzIwMDQtMDgtMTEgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL2RidXMtc2VuZC5jIChtYWluLCB1c2FnZSk6IEFkZCAtLXJlcGx5LXRpbWVvdXQKKwlhcmd1bWVudC4KKworMjAwNC0wOC0xMCAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGJ1cy9idXMuYyAocHJvY2Vzc19jb25maWdfZmlyc3RfdGltZV9vbmx5KTogZ2V0IHJpZCBvZiBhbiB1bnVzZWQKKwlEQnVzRXJyb3IgdGhhdCB3YXMgY2F1c2luZyBhIG1lbW95IGxlYWsgKGJ1ZyAjOTg5KS4KKworCSogZGJ1cy9kYnVzLWtleXJpbmcuYywgZGJ1cy9kYnVzLW1lc3NhZ2UuYzoKKwlmaXggY29tcGlsYXRpb24gb24gU29sYXJpcy9Gb3J0ZSBDIChidWcgIzk3NCkKKworCSogYnVzL21haW4uYyAobWFpbik6IHBsdWcgdHdvIG1pbnVzY3VsZSBtZW1sZWFrcy4KKworMjAwNC0wOC0xMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9kYnVzLXR1dG9yaWFsLnhtbDogYWRkIHNvbWUgbW9yZSBpbmZvIG9uIEdMaWIgYmluZGluZ3MKKworMjAwNC0wOC0wOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIENPUFlJTkc6IHN3aXRjaCB0byBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgaW5zdGVhZCBvZgorCTIuMCwgdG8gcmVzb2x2ZSBjb21wbGFpbnRzIGFib3V0IHBhdGVudCB0ZXJtaW5hdGlvbiBjbGF1c2UuCisKKzIwMDQtMDctMzEgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIFJFQURNRTogYWRkZWQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIC0tZW5hYmxlLXB5dGhvbiAKKwljb25maWd1cmUgc3dpdGNoLgorCisyMDA0LTA3LTMxICBPbGl2aWVyIEFuZHJpZXUgIDxvbGl2X19hQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYyAoYnVzX2NvbmZpZ19wYXJzZXJfbmV3KTogZml4IGFuIGludmFsaWQKKwlfdW5yZWYgaW4gdGhlIFNFTGludXggc3VwcG9ydC4KKworCSogZG9jL2J1c2NvbmZpZy5kdGQ6IHVwZGF0ZSBEVEQgZm9yIFNFTGludXggc3VwcG9ydC4KKworCSogYnVzL2NvbmZpZy1sb2FkZXItbGlieG1sLmM6IGZpeCBlcnJvciBoYW5kbGVyIGFuZCBwYXJzZXIKKwlpbml0aWFsaXNhdGlvbi9jbGVhbnVwLiBPT00gdGVzdCBub3cgd29ya3Mgd2l0aCBsaWJ4bWwyIEhFQUQuCisKKwkqIGNvbmZpZ3VyZS5pbjogcmVtb3ZlIHRoZSB3YXJuaW5nIGFib3V0IGxpYnhtbDIuCisKKwkqIGRidXMvZGJ1cy1idXMuYzogc2lsZW5jZSBkb3h5Z2VuIHdhcm5pbmcuCisKKzIwMDQtMDctMzEgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogTW92ZSAjZXJyb3IgaW4gU0VMaW51eCBjaGVjayB0byBpdHMgb3duIGxpbmUuCisKKzIwMDQtMDctMzEgIE9saXZpZXIgQW5kcmlldSAgPG9saXZfX2FAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmggKF9EQlVTX1NFVF9PT00pOgorCSogYnVzL3V0aWxzLmggKEJVU19TRVRfT09NKTogdXNlIGRidXNfZXJyb3Jfc2V0X2NvbnN0IGluc3RlYWQgb2YKKwlkYnVzX2Vycm9yX3NldC4KKworCSogYnVzL2Rpc3BhdGNoLmMgKGNoZWNrX3NlbmRfZXhpdF90b19zZXJ2aWNlKTogZml4IHRoZSB0ZXN0IGNhc2UsCisJYnJva2VuIGJ5IHRoZSBjaGFuZ2UgaW4gdGhlIF9TRVRfT09NIG1hY3Jvcy4KKworMjAwNC0wNy0zMSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAcmVkaGF0LmNvbT4KKworCSogYnVzL3NlbGludXguYyA8SEFWRV9TRUxJTlVYPjogSW5jbHVkZSB1dGlscy5oIHRvIGdldAorCUJVU19TRVRfT09NLgorCisyMDA0LTA3LTMxICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0ByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IFVzZSBBQ19UUllfQ09NUElMRSBpbnN0ZWFkIG9mIEFDX0VHUkVQX0hFQURFUgorCXRvIGNvcnJlY3RseSBkZXRlY3QgREJVU19fQUNRVUlSRV9TVkMuICBBbHNvIGFkZCBhbgorCUFDX01TR19DSEVDS0lORy4KKworMjAwNC0wNy0yNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwlTRUxpbnV4IHN1cHBvcnQgZnJvbSBNYXR0aGV3IFJpY2thcmQgPG1qcmlja2FAZXBvY2gubmNzYy5taWw+CisKKwkqIGJ1cy9zZWxpbnV4LmMsIGJ1cy9zZWxpbnV4Lmg6IG5ldyBmaWxlIGVuY2Fwc3VsYXRpbmcgc2VsaW51eAorCWZ1bmN0aW9uYWxpdHkKKworCSogY29uZmlndXJlLmluOiBhZGQgLS1lbmFibGUtc2VsaW51eAorCQorCSogYnVzL3BvbGljeS5jIChidXNfcG9saWN5X21lcmdlKTogYWRkIEZJWE1FIHRvIGEgY29tbWVudAorCisJKiBidXMvbWFpbi5jIChtYWluKTogaW5pdGlhbGl6ZSBhbmQgc2h1dCBkb3duIHNlbGludXgKKworCSogYnVzL2Nvbm5lY3Rpb24uYzogc3RvcmUgU0VMaW51eCBJRCBvbiBlYWNoIGNvbm5lY3Rpb24sIHRvIGF2b2lkIAorCXJlcGVhdGVkIGdldHRpbmcgb2YgdGhlIHN0cmluZyBjb250ZXh0IGFuZCBjb252ZXJ0aW5nIGl0IGludG8gCisJYW4gSUQKKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9nZXRfcG9saWN5KTogbmV3IGFjY2Vzc29yLCB0aG91Z2ggaXQKKwlpc24ndCB1c2VkCisJKGJ1c19jb250ZXh0X2NoZWNrX3NlY3VyaXR5X3BvbGljeSk6IGNoZWNrIHdoZXRoZXIgdGhlIHNlY3VyaXR5CisJY29udGV4dCBvZiBzZW5kZXIgY29ubmVjdGlvbiBjYW4gc2VuZCB0byB0aGUgc2VjdXJpdHkgY29udGV4dCBvZgorCXJlY2lwaWVudCBjb25uZWN0aW9uCisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmM6IGFkZCBwYXJzaW5nIGZvciA8c2VsaW51eD4gYW5kIDxhc3NvY2lhdGU+CisJCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmMgKF9kYnVzX3RyYW5zcG9ydF9nZXRfdW5peF9mZCk6IHRvCisJaW1wbGVtZW50IGRidXNfY29ubmVjdGlvbl9nZXRfdW5peF9mZCgpCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9nZXRfdW5peF9mZCk6IG5ldworCWZ1bmN0aW9uLCB1c2VkIGJ5IHRoZSBzZWxpbnV4IHN0dWZmCisJCisyMDA0LTA3LTI5ICBPbGl2aWVyIEFuZHJpZXUgIDxvbGl2X19hQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogYnVzL2NvbmZpZy1sb2FkZXItbGlieG1sLmM6IGNvbXBsZXRlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZgorCWxpYnhtbCBiYWNrZW5kIGZvciBjb25maWcgZmlsZSBsb2FkZXIuIERvZXNuJ3Qgd29yayB3aXRoIGZ1bGwgT09NCisJdGVzdCB5ZXQuIAorCQorCSogY29uZmlndXJlLmluOiBjaGFuZ2UgZXJyb3Igd2hlbiBzZWxlY3RpbmcgbGlieG1sIGludG8gYSB3YXJuaW5nLgorCQorCSogdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzOiBhZGQgdHdvIG5vbi13ZWxsLWZvcm1lZCBYTUwKKwlmaWxlcy4gCisJCisJKiBnbGliL01ha2VmaWxlLmFtOiBsaWJkYnVzX2d0b29sIGFsd2F5cyB1c2VzIGV4cGF0LCBub3QgbGlieG1sLgorCQorCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMgKHVuaXhfaGFuZGxlX3dhdGNoKTogZG8gbm90CisJZGlzY29ubmVjdCBpbiBjYXNlIG9mIERCVVNfV0FUQ0hfSEFOR1VQLCBzZXZlcmFsIGRvX3JlYWRpbmcoKSBtYXkKKwliZSBuZWNlc3NhcnkgdG8gcmVhZCBhbGwgdGhlIGJ1ZmZlci4gKGJ1ZyAjODk0KQorCisJKiBidXMvYWN0aXZhdGlvbi5jIChidXNfYWN0aXZhdGlvbl9hY3RpdmF0ZV9zZXJ2aWNlKTogZml4IGEKKwlwb3RlbnRpYWwgYXNzZXJ0aW9uIGZhaWx1cmUgKGJ1ZyAjODk2KS4gU21hbGwgb3B0aW1pemF0aW9uIGluIHRoZQorCWNhc2Ugb2YgYXV0by1hY3RpdmF0aW9uIG1lc3NhZ2VzLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jICh2ZXJpZnlfdGVzdF9tZXNzYWdlLCBfZGJ1c19tZXNzYWdlX3Rlc3QpOgorCWFkZCB0ZXN0IGNhc2UgZm9yIGJ5dGUtdGhyb3VnaC12YXJhcmcgYnVnICgjOTAxKS4gcGF0Y2ggYnkgS2ltbW8KKwlIw6Rtw6Rsw6RpbmVuLiAKKworMjAwNC0wNy0yOCAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAZ25vbWUub3JnPgorCisJKiBweXRob24vZGJ1cy5weToKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbjoKKwlBZGQgZGJ1cy5pbml0X2d0aHJlYWRzICgpLCBhbGxvdyBlbWl0X3NpZ25hbCB0byBwYXNzCisJYXJndW1lbnRzIHRvIHRoZSBzaWduYWwuCisJCisyMDA0LTA3LTI0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogQVVUSE9SUzogYWRkIHNvbWUgcGVvcGxlLCBub3QgcmVhbGx5IGNvbXByZWhlbnNpdmVseSwgbGV0IG1lCisJa25vdyBpZiBJIG1pc3NlZCB5b3UKKworMjAwNC0wNy0yNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChESVNUX1NVQkRJUlMpOiBhZGQgRElTVF9TVUJESVJTLCBwcm9ibGVtIHNvbHZlZCBieQorCU93ZW4KKworCSogdGVzdC9NYWtlZmlsZS5hbSAoRElTVF9TVUJESVJTKTogaGVyZSBhbHNvCisKKzIwMDQtMDctMjIgIE9saXZpZXIgQW5kcmlldSAgPG9saXZfX2FAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChmaWxsX3VzZXJfaW5mbyk6IGZpeCBpbmV4aXN0ZW50IGxhYmVsIG5hbWUsCisJYnJlYWtpbmcgYnVpbGQgb24gU29sYXJpcywgcmVwb3J0ZWQgYnkgRmFyaGFkIFNhYmVyaSBvbiB0aGUgTUwuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9hcHBlbmRfYXJnc192YWxpc3QpOiBmaXggdGhlCisJdmFfYXJnIGludm9jYXRpb24gdG8gYWNjb3VudCBmb3IgaW50ZWdlciBwcm9tb3Rpb24gaW4gdGhlIGNhc2Ugb2YKKwlEQlVTX1RZUEVfQllURSAodW5zaWduZWQgY2hhciBpcyBwcm9tb3RlZCB0byBpbnQpLiAoYnVnICM5MDEpCisKKwkqIGJ1cy9zZXJ2aWNlcy5jIChidXNfc2VydmljZV9yZW1vdmVfb3duZXIpOiBmaXggYnVnICM5MDIsIHVzZQorCV9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmssIG5vdCBfZGJ1c19saXN0X2dldF9maXJzdC4KKworCSogZGJ1cy9kYnVzLWJ1cy5jIChkYnVzX2J1c19zZXJ2aWNlX2V4aXN0cyk6IHBsdWcgYSBtZW1vcnkgbGVhay4KKworCSogZGJ1cy9kYnVzLW9iamVjdC10cmVlLmMgKGZyZWVfc3VidHJlZV9yZWN1cnNlKTogYWx3YXlzIG51bGwKKwloYW5kbGVyIGZ1bmN0aW9ucyBzbyB0aGF0IHRoZSBhc3NlcnRzIGluIF9kYnVzX29iamVjdF9zdWJ0cmVlX3VucmVmCisJZG8gbm90IGZhaWwuCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jIChkb19yZWFkaW5nKToKKwlfZGJ1c190cmFuc3BvcnRfcXVldWVfbWVzc2FnZXMgcmV0dXJuIHZhbHVlIGlzIG9mIHR5cGUKKwlkYnVzX2Jvb2xfdCwgbm90IERCdXNEaXNwYXRjaFN0YXR1cy4KKwkKKzIwMDQtMDctMTkgIERhdmlkIFpldXRoZW4gIDxkYXZpZEBmdWJhci5kaz4KKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6IEFkZCBEQlVTX0VSUk9SX1VOSVhfUFJPQ0VTU19JRF9VTktOT1dOCisKKwkqIGJ1cy9kaXNwYXRjaC5jOgorCShjaGVja19nZXRfY29ubmVjdGlvbl91bml4X3VzZXIpOiBEZWJ1ZyBzYXlzIEdldFByb3BlcnR5OyBidXQgdGhlCisJbWV0aG9kIGlzIGNhbGxlZCBHZXRDb25uZWN0aW9uVW5peFVzZXIKKwkoY2hlY2tfZ2V0X2Nvbm5lY3Rpb25fdW5peF9wcm9jZXNzX2lkKTogTmV3IGZ1bmN0aW9uCisJKGJ1c19kaXNwYXRjaF90ZXN0KTogQWN0dWFsbHkgY2FsbCBjaGVja19nZXRfY29ubmVjdGlvbl91bml4X3VzZXIoKTsKKwlhbHNvIGNhbGwgY2hlY2tfZ2V0X2Nvbm5lY3Rpb25fdW5peF9wcm9jZXNzX2lkKCkKKwkKKwkqIGJ1cy9kcml2ZXIuYzoKKwkoYnVzX2RyaXZlcl9oYW5kbGVfZ2V0X2Nvbm5lY3Rpb25fdW5peF9wcm9jZXNzX2lkKTogTmV3IGZ1bmN0aW9uLAorCWhhbmRsZXMgR2V0Q29ubmVjdGlvblVuaXhQcm9jZXNzSUQgb24gdGhlIG9yZy5mcmVlZGVza3RvcC5EQnVzCisJaW50ZXJmYWNlCisJCisJKiBkYnVzL2RidXMtYXV0aC5jOgorCShoYW5kbGVfc2VydmVyX2RhdGFfZXh0ZXJuYWxfbWVjaCk6IFNldCBwaWQgZnJvbSB0aGUgY3JlZGVudGlhbHMKKwlvYnRhaW5lZCBmcm9tIHRoZSBzb2NrZXQKKwkKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6CisJKGRidXNfY29ubmVjdGlvbl9nZXRfdW5peF9wcm9jZXNzX2lkKTogTmV3IGZ1bmN0aW9uCisJCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5oOiAKKwlBZGQgcHJvdG90eXBlIGZvciBkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfcHJvY2Vzc19pZAorCQorCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jOgorCShfZGJ1c190cmFuc3BvcnRfZ2V0X3VuaXhfcHJvY2Vzc19pZCk6IE5ldyBmdW5jdGlvbgorCQorCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5oOgorCUFkZCBwcm90b3R5cGUgZm9yIF9kYnVzX3RyYW5zcG9ydF9nZXRfdW5peF9wcm9jZXNzX2lkCisJCisyMDA0LTA3LTE5ICBPbGl2aWVyIEFuZHJpZXUgIDxvbGl2X19hQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogTWVzc2FnZSBjb3VudGVyIGZpeCwgcGF0Y2ggYnkgQ2hyaXN0aWFuCisJSGFtbW9uZCA8Y2hpcHg4NkBnbnVwZGF0ZS5vcmc+CisKKzIwMDQtMDctMTggIFNldGggTmlja2VsbCAgPHNldGhAZ25vbWUub3JnPgorCisJKiBweXRob24vZGJ1cy5weToKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbjoKKwkqIHB5dGhvbi90ZXN0cy90ZXN0LWNsaWVudC5weToKKworCUFkZCBkYnVzLkJ5dGVBcnJheSBhbmQgZGJ1c19iaW5kaW5ncy5CeXRlQXJyYXkKKwl0eXBlcyBzbyB0aGF0IGJ5dGUgc3RyZWFtcyBjYW4gYmUgcGFzc2VkIGJhY2suCisKKwlHaXZlIGpkYWhsaW4gdGhlIGhlYXBzIG9mIGNyZWRpdCB0aGF0IGFyZSBzbworCXJpZ2h0ZnVsbHkgaGlzLgorCQorMjAwNC0wNy0xMiAgU2V0aCBOaWNrZWxsICA8c2V0aEBnbm9tZS5vcmc+CisKKwkqIHB5dGhvbi9kYnVzLnB5OgorCisJQWRkIG1lc3NhZ2UgYXJndW1lbnQgdG8gdGhlIGRlZmF1bHQgb2JqZWN0X21ldGhvZF9oYW5kbGVyCisJZnVuY3Rpb24uCisJCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXguaW46CisKKwlBdXRvbWF0aWNhbGx5IHJldHVybiBOSUwgd2hlbiBwYXNzZWQgYW4gZW1wdHkgbGlzdAorCSh3ZSBjYW4ndCBwYXNzIGJhY2sgYSBsaXN0IHNpbmNlIGxpc3RzIGFyZSB0eXBlZAorCWFuZCB3ZSBkb24ndCBoYXZlIGFueSBpZGVhIHdoYXQgdHlwZSB0aGUgdGhlIGNsaWVudAorCWludGVuZGVkIHRoZSBsaXN0IHRvIGJlLi4uIDotKCApCisJCisyMDA0LTA3LTEwICBTZXRoIE5pY2tlbGwgIDxzZXRoQGdub21lLm9yZz4KKworCSogcHl0aG9uL2V4YW1wbGVzL01ha2VmaWxlLmFtOgorCisJRml4IGRpc3RjaGVjayBicmVha2FnZSBjYXVzZWQgYnkgbmV3IGV4YW1wbGVzLgorCisyMDA0LTA3LTEwICBTZXRoIE5pY2tlbGwgIDxzZXRoQGdub21lLm9yZz4KKworCSogcHl0aG9uL2RidXMucHk6CisKKwlBZGQgIm1lc3NhZ2UiIGFyZ3VtZW50IHRvIHNlcnZpY2Utc2lkZSBkYnVzLk9iamVjdAorCW1ldGhvZHMuIFRoaXMgd2lsbCBicmVhayBleGlzdGluZyBzZXJ2aWNlcyB3cml0dGVuCisJdXNpbmcgdGhlIHB5dGhvbiBiaW5kaW5ncywgYnV0IHdpbGwgYWxsb3cgZXh0cmFjdGlvbgorCW9mIGFsbCB0aGUgbWVzc2FnZSBpbmZvcm1hdGlvbiAoZS5nLiB3aG8gaXRzIGZyb20pLgorCisJQWRkIGltcHJvdmVkICJvYmplY3Qgb3JpZW50ZWQiIHNpZ25hbCBoYW5kbGluZy9lbWlzc2lvbi4KKwkKKwkqIHB5dGhvbi9leGFtcGxlcy9leGFtcGxlLXNlcnZpY2UucHk6CisKKwlOaXggdGhpcyBleGFtcGxlLgorCQorCSogcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUtc2lnbmFsLWVtaXR0ZXIucHk6CisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1zaWduYWwtcmVjaXBpZW50LnB5OgorCisJVHdvIG5ldyBleGFtcGxlcyB0aGF0IHNob3cgaG93IHRvIGVtaXQgYW5kIHJlY2VpdmUKKwlzaWduYWxzIHVzaW5nIHRoZSBuZXcgQVBJcy4KKwkKKwkqIHB5dGhvbi9leGFtcGxlcy9leGFtcGxlLXNpZ25hbHMucHk6CisJKiBweXRob24vZXhhbXBsZXMvZ2NvbmYtcHJveHktc2VydmljZS5weToKKwkqIHB5dGhvbi9leGFtcGxlcy9nY29uZi1wcm94eS1zZXJ2aWNlMi5weToKKworCUFkZCAibWVzc2FnZSIgYXJndW1lbnQgdG8gc2VydmljZSBtZXRob2RzLgorCisyMDA0LTA2LTI4ICBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfZ2V0X2Nvbm5lY3Rpb25fdW5peF91c2VyKQorCSogZGJ1cy9idXMuYyAoZGJ1c19idXNfZ2V0X3VuaXhfdXNlcikKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBpbXBsZW1lbnQgR2V0Q29ubmVjdGlvblVuaXhVc2VyCisJbWV0aG9kIG9mIG9yZy5mcmVlZGVza3RvcC5EQnVzIGludGVyZmFjZS4KKworCSogYnVzL2Rpc3BhdGNoLmM6IHRlc3QgY2FzZQorCisyMDA0LTA2LTIzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vTWFrZWZpbGUuYW06IHN3aXRjaGVkIGluY2x1ZGUgZGlyZWN0b3J5IGZyb20gZ2xpYi8gdG8gZGJ1cy8KKwlzaW5jZSBkYnVzLWdsaWIuaCBtb3ZlZAorIAorMjAwNC0wNi0yMiAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5pbjogcHJldmVudCBidWlsZGluZyB0aGUgZ2NqIHN0dWZmIGFuZCBsaWJ4bWwgbG9hZGVyCisJc2luY2UgdGhleSBhcmUgYnJva2VuLgorCisyMDA0LTA2LTIwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworICAgICAgICAqIGRidXMvZGJ1cy1nbGliLWVycm9yLWVudW0uaDogYXV0b2dlbmVyYXRlIHRoZSBHRXJyb3IgZW51bSAKKwljb2RlcyBmcm9tIHRoZSBkYnVzIGVycm9yIG5hbWVzCisJCisgICAgICAgICogZ2xpYi9kYnVzLWdsaWIuaDogbW92ZSB0byBzdWJkaXIgZGJ1cy8gc2luY2UgaXQncyBpbmNsdWRlZCAKKwlhcyBkYnVzL2RidXMtZ2xpYi5oIGFuZCB0aGF0IGJyZWFrYWdlIGlzIG5vdyB2aXNpYmxlIGR1ZSB0byAKKwlpbmNsdWRpbmcgZGJ1cy9kYnVzLWdsaWIuaCBpbiBkYnVzLWdsaWItbG93bGV2ZWwuaAorCQorCSogZ2xpYi9kYnVzLWdsaWIuaDogcy9ncHJveHkvZ19wcm94eS8KKworCSogZGJ1cy9kYnVzLXNoYXJlZC5oOiBuZXcgaGVhZGVyIHRvIGhvbGQgc3R1ZmYgc2hhcmVkIHdpdGgKKwliaW5kaW5nIEFQSXMKKwkKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oIChEQlVTX0VSUk9SXyopOiBtb3ZlIGVycm9ycyBoZXJlIHJhdGhlcgorCXRoYW4gZGJ1cy1lcnJvcnMuaAorCisJKiBnbGliL2RidXMtZ2xpYi5oIChkYnVzX3NldF9nX2Vycm9yKTogbW92ZSB0bworCWRidXMtZ2xpYi1sb3dsZXZlbC5oCisKKwkqIGdsaWIvZGJ1cy1nbGliLmg6IHJlbW92ZSBkYnVzL2RidXMuaCBmcm9tIGhlcmU7IGNoYW5nZSBhIGJ1bmNoCisJb2Ygc3R1ZmYgdG8gZW5hYmxlIHRoaXMKKworCSogZGJ1cy9kYnVzLWdsaWItbG93bGV2ZWwuaDogcHV0IGRidXMvZGJ1cy5oIGhlcmUKKworCSogYSBidW5jaCBvZiBvdGhlciBjaGFuZ2VzIHdpdGggdGhlIHNhbWUgYmFzaWMgInNlcGFyYXRlIGdsaWIgCisJYmluZGluZ3MgZnJvbSBkYnVzLmgiIHRoZW1lCisJCisyMDA0LTA2LTEwICBPd2VuIEZyYXNlci1HcmVlbiAgPG93ZW5AZGlzY29iYWJlLm5ldD4KKworCSogZGJ1cy1zaGFycC5wYy5pbjogUmVtb3ZlZCBnbGliLXNoYXJwIGluY2x1c2lvbiBpbiBMaWJzLgorCisJKiBweXRob24vZXhhbXBsZXMvTWFrZWZpbGUuYW06IEZpeGVkIHR5cG8gaW4gRVhUUkFfRElTVC4KKworMjAwNC0wNi0wOSAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGJ1cy9kcml2ZXIuYywgZGJ1cy9kYnVzLWJ1cy5jOiB1c2UgQk9PTEVBTiBpbnN0ZWFkIG9mIFVJTlQzMiBmb3IKKwl0aGUgcmVwbHkgdmFsdWUgb2YgdGhlIFNlcnZpY2VFeGlzdHMgbWVzc2FnZS4KKworMjAwNC0wNi0wNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluOiBObyBsb25nZXIgbmVlZCB0byBwYXJzZSBwYXRoCisJZWxlbWVudHMgYW5kIHBhc3MgdGhlbSBhcyBhcnJheXMgb2Ygc3RyaW5ncy4gIFRoZSBDIEFQSSBub3cKKwlhY2NlcHRzIHBsYWluIHBhdGggc3RyaW5ncy4KKwkoX2J1aWxkX3BhcnNlZF9wYXRoKTogcmVtb3ZlZCAKKworMjAwNC0wNi0wNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9UT0RPOiByZW1vdmUgYXV0by1hY3RpdmF0aW9uIGl0ZW0gc2luY2UgaXQncyBkb25lOyBzb3J0CisJaXRlbXMgYnkgaW1wb3J0YW5jZS9taWxlc3RvbmUKKworMjAwNC0wNi0wNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWJ1aWxkZXIuYyAoX2RidXNfbWVzc2FnZV9kYXRhX2xvYWQpOiBhcHBlbmQKKwlyYW5kb20gc2lnbmF0dXJlIHdoZW4gdXNpbmcgUkVRVUlSRURfRklFTERTICh0aGlzIGhhY2sgd29uJ3Qgd29yaworCWluIHRoZSBsb25nIHRlcm0pCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IGNoYW5nZSB0aGUgc2lnbmF0dXJlIHRvIGJlIGEgaGVhZGVyIGZpZWxkLAorCWluc3RlYWQgb2YgbWVzc2FnZS0+c2lnbmF0dXJlIHNwZWNpYWwtY2FzZSBzdHJpbmcuIEluY3JlbWVudGFsCisJc3RlcCBmb3J3YXJkLiBUaGVuIHdlIGNhbiBmaXggdXAgY29kZSB0byBzZW5kIHRoZSBzaWduYXR1cmUgaW4gdGhlCisJbWVzc2FnZSwgdGhlbiBmaXggdXAgY29kZSB0byB2YWxpZGF0ZSBzYWlkIHNpZ25hdHVyZSwgdGhlbiBmaXggdXAKKwljb2RlIHRvIG5vdCBwdXQgdGhlIHR5cGVjb2RlcyBpbmxpbmUsIGV0Yy4KKwkobG9hZF9vbmVfbWVzc2FnZSk6IGRvbid0IG1ha2UgdXAgdGhlIHNpZ25hdHVyZSBhZnRlciB0aGUgZmFjdAorCShkZWNvZGVfaGVhZGVyX2RhdGEpOiByZXF1aXJlIHNpZ25hdHVyZSBmaWVsZCBmb3IgdGhlIGtub3duCisJbWVzc2FnZSB0eXBlcworCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jIChfZGJ1c19tYXJzaGFsX3N0cmluZ19sZW4pOiBuZXcKKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6IGFkZCBEQlVTX0hFQURFUl9GSUVMRF9TSUdOQVRVUkUKKworMjAwNC0wNi0wNyAgT3dlbiBGcmFzZXItR3JlZW4gIDxvd2VuQGRpc2NvYmFiZS5uZXQ+CisKKwkqIG1vbm8vREJ1c1R5cGUvT2JqZWN0UGF0aC5jczogUmVuYW1lZCBQYXRoTmFtZSBhcmd1bWVudCB0byBQYXRoCisKKwkqIG1vbm8vSGFuZGxlci5jczogVXBkYXRlZCB0byBmb2xsb3cgbmV3IHBhdGggYXJndW1lbnQgZm9yCisJKHVuLSlyZWdpc3RlcmluZyBvYmplY3RzLgorCisJKiBtb25vL2V4YW1wbGUvTWFrZWZpbGUuYW06CisJKiBtb25vL01ha2VmaWxlLmFtOgorCSogY29uZmlndXJlLmluOiBCdW1wZWQgcmVxdWlyZWQgdmVyc2lvbiBmb3IgbW9ubyBhbmQgdXNlIG5ldyAtcGtnCisJc3ludGF4IGZvciBkZXBzCisKKzIwMDQtMDYtMDUgIE9saXZpZXIgQW5kcmlldSAgPG9saXZfX2FAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5oLCBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiBoYXZlIG9iamVjdCBwYXRoCisJcmVnaXN0cmF0aW9uIGZ1bmN0aW9ucyB0YWtlIHRoZSBwYXRoIGFyZ3VtZW50IGFzIGNoYXIqIGluc3RlYWQgb2YKKwljaGFyKiouCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmgsIGRidXMvZGJ1cy1tYXJzaGFsLmMgKF9kYnVzX2RlY29tcG9zZV9wYXRoKToKKwlzcGxpdCBvZmYgdGhlIHBhdGggZGVjb21wb3N0aW9uIHBhcnQgb2YKKwlfZGJ1c19kZW1hcnNoYWxfb2JqZWN0X3BhdGguIFNvbWUgbWlzYy4gZml4ZXMgdG8gc2lsZW5jZSBjb21waWxlcgorCXdhcm5pbmdzLiAKKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYywgdGVzdC90ZXN0LXNlcnZpY2UuYzogdXBkYXRlIGFjY29yZGluZ2x5LgorCQorMjAwNC0wNi0wMiAgS3Jpc3RpYW4gSMO4Z3NiZXJnICA8a3JoQHJlZGhhdC5jb20+CisgCisJKiBkYnVzL2RidXMtYXV0aC5jOiBSZXdyaXRlIGF1dGggcHJvdG9jb2wgaGFuZGxpbmcgdG8gdXNlIGEgc3RhdGUKKwltYWNoaW5lIGFwcHJvYWNoLiAgQSBzdGF0ZSBpcyBpbXBsZW1lbnRlZCBhcyBhIGZ1bmN0aW9uIHRoYXQKKwloYW5kbGVzIGluY29taW5nIGV2ZW50cyBhcyBzcGVjaWZpZWQgZm9yIHRoYXQgc3RhdGUuCisJCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogVXBkYXRlIGF1dGggcHJvdG9jb2wgc3RhdGUgbWFjaGluZQorCXNwZWNpZmljYXRpb24gdG8gbWF0Y2ggaW1wbGVtZW50YXRpb24uICBSZW1vdmUgc29tZSBsZWZ0b3ZlcgorCWJhc2U2NCBleGFtcGxlcy4KKworMjAwNC0wNi0wMiAgS3Jpc3RpYW4gSMO4Z3NiZXJnICA8a3JoQHJlZGhhdC5jb20+CisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYywgZ2xpYi9kYnVzLWdtYWluLmMsIGRidXMvZGJ1cy1zdHJpbmcuYywKKwlkYnVzL2RidXMtb2JqZWN0LXRyZWUuYywgZGJ1cy9kYnVzLW1lc3NhZ2UuYzogYWRkIGNvbW1lbnRzIHRvCisJcXVpZXQgZG94eWdlbi4KKworCSogRG94eWZpbGUuaW46IHJlbW92ZSBkZXByZWNhdGVkIG9wdGlvbnMuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWhhbmRsZXIuYywgZGJ1cy9kYnVzLW1lc3NhZ2UtaGFuZGxlci5oLAorCWdsaWIvdGVzdC10aHJlYWQuaCwgZ2xpYi90ZXN0LXRocmVhZC1jbGllbnQuYywKKwlnbGliL3Rlc3QtdGhyZWFkLXNlcnZlci5jLCBnbGliL3Rlc3QtcHJvZmlsZS5jLAorCWdsaWIvdGVzdC1kYnVzLWdsaWIuYzogcmVtb3ZlIHRoZXNlIHVudXNlZCBmaWxlcy4KKworMjAwNC0wNi0wMSAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGRidXMvZGJ1cy1vYmplY3QtdHJlZS5jCisJKF9kYnVzX29iamVjdF90cmVlX2Rpc3BhdGNoX2FuZF91bmxvY2spOiBmaXggZGlzcGF0Y2ggZm9yCisJbm9uLWZhbGxiYWNrIGhhbmRsZXJzIChidWcgIzY4NCkuCisJKF9kYnVzX29iamVjdF9zdWJ0cmVlX25ldyk6IGluaXRpYWxpemUgaW52b2tlX2FzX2ZhbGxiYWNrIGZpZWxkLgorCShmaW5kX3N1YnRyZWVfcmVjdXJzZSk6IHJlcG9ydCB3ZXRoZXIgdGhlIHJldHVybmVkIHN1YnRyZWUgaXMgYW4KKwlleGFjdCBtYXRjaCBvciBhICJmYWxsYmFjayIgbWF0Y2ggaGlnaGVyIHVwIGluIHRoZSB0cmVlLgorCShvYmplY3RfdHJlZV90ZXN0X2l0ZXJhdGlvbik6IHVwZGF0ZSB0ZXN0IGNhc2UuCisKKzIwMDQtMDYtMDEgIFNldGggTmlja2VsbCAgPHNldGhAZ25vbWUub3JnPgorCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXguaW46CisJKiBweXRob24vdGVzdHMvdGVzdC1jbGllbnQucHk6CisKKwlSb3VuZCBvZmYgYmFzaWMgdHlwZSBzdXBwb3J0LiBBZGQgZGljdHMgKHlheSEpLCBhbmQgCisJcmVtYWluaW5nIGFycmF5IHR5cGVzLgorCisJTWFrZSBNZXNzYWdlSXRlciBtb3JlIGdlbmVyYWwgc28gaXQgd29ya3MgZm9yIGRpY3RzIHRvby4KKworCU1hcmsgYWxsIGxvb3AgdmFyaWFibGVzIGFzIEMgaW50ZWdlcnMuCisJCisyMDA0LTA1LTMxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWdpZGwuYyAobWV0aG9kX2luZm9fYWRkX2FyZyk6IGtlZXAgYXJncyBzb3J0ZWQgd2l0aAorCSJpbiIgYmVmb3JlICJvdXQiCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGRidXNfdHlwZV90b19zdHJpbmcpOiBtb3ZlIHRvIGRidXMtZ3V0aWxzLmMKKworCSogZ2xpYi9kYnVzLWdsaWItdG9vbC5jIChtYWluKTogc2V0IHVwIHRvIGhhdmUgYSAtLXNlbGYtdGVzdAorCW9wdGlvbiB0aGF0IHJ1bnMgdGhlIHRlc3RzLCBhbmQgc3RhcnQgZmlsbGluZyBpbiBzb21lIGNvZGUKKwlpbmNsdWRpbmcgZm9yIHN0YXJ0ZXJzIGp1c3QgZHVtcGluZyB0aGUgaW50ZXJmYWNlcyB0byBzdGRvdXQKKworCSogZ2xpYi9NYWtlZmlsZS5hbSAoSU5DTFVERVMpOiBkZWZpbmUgREJVU19MT0NBTEVESVIKKworCSogdGVzdC9kYXRhL3ZhbGlkLWludHJvc3BlY3Rpb24tZmlsZXMvbG90cy1vZi10eXBlcy54bWw6IHRlc3Qgb2YKKwlhbiBleGFtcGxlIGludHJvc3BlY3Rpb24gZmlsZQorCisJKiBnbGliL2RidXMtZ3BhcnNlci5jIChwYXJzZXJfY2hlY2tfZG9jdHlwZSk6IGRvY3R5cGUgc2hvdWxkIGJlCisJIm5vZGUiIChJIHRoaW5rLi4uKQorCisyMDA0LTA1LTMxICBTZXRoIE5pY2tlbGwgIDxzZXRoQGdub21lLm9yZz4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluOgorCSogcHl0aG9uL3Rlc3RzL3Rlc3QtY2xpZW50LnB5OgorCisJVGVzdCBTdWl0ZTogMQorCVB5dGhvbiBCaW5kaW5nczogMAorCisJRml4IHN0cmluZyBhcnJheSBtZW1vcnkgdHJhc2hpbmcgYnVnLi4uIG9vcHMuLi4KKworMjAwNC0wNS0zMCAgU2V0aCBOaWNrZWxsICA8c2V0aEBnbm9tZS5vcmc+CisKKwkqIHB5dGhvbi9kYnVzLnB5OgorCisJQWRkIGEgbmljZXItYnV0LWxlc3MtZmxleGlibGUgYWx0ZXJuYXRlIEFQSSBmb3IgaGFuZGxpbmcgCisJY2FsbHMgdG8gdmlydHVhbCBvYmplY3RzIGluIGRidXMuT2JqZWN0VHJlZS4KKworCVNjcmV3IHVwIHRoZSBhcmd1bWVudCBvcmRlciB0byB0aGUgZGJ1cy5PYmplY3QgY29uc3RydWN0b3IKKwlmb3IgY29uc2lzdGVuY3kgd2l0aCBkYnVzLk9iamVjdFRyZWUgKGFuZCB0byBtYWtlIGRidXNfbWV0aG9kcworCW9wdGlvbmFsIGZvciBmdXR1cmUgZXh0ZW5zaW9uKQorCQorCSogcHl0aG9uL2V4YW1wbGVzL01ha2VmaWxlLmFtOgorCSogcHl0aG9uL2V4YW1wbGVzL2djb25mLXByb3h5LXNlcnZpY2UucHk6CisJKiBweXRob24vZXhhbXBsZXMvZ2NvbmYtcHJveHktc2VydmljZTIucHk6CisKKwlBbHRlcm5hdGUgaW1wbGVtZW50YXRpb24gb2YgZ2NvbmYtcHJveHktc2VydmljZSB1c2luZyB0aGUKKwluaWNlciBkYnVzLk9iamVjdFRyZWUgQVBJLgorCQorCSogcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUtc2VydmljZS5weToKKwkqIHB5dGhvbi90ZXN0cy90ZXN0LXNlcnZlci5weQorCisJUmV2ZXJzZSB0aGUgYXJndW1lbnQgb3JkZXIgdG8gZGVhbCB3aXRoIGRidXMuT2JqZWN0IGNvbnN0cnVjdG9yCisJY2hhbmdlcy4KKwkKKzIwMDQtMDUtMzAgIFNldGggTmlja2VsbCAgPHNldGhAZ25vbWUub3JnPgorCisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1jbGllbnQucHk6CisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1zZXJ2aWNlLnB5OgorCisJVGFrZSBpdCBiYWNrLiBMaXN0cyBzZWVtIHRvIHdvcmsgYnV0IHRoZXkncmUgYnJva2VuCisJaW4gdGhlIHRlc3Qgc3VpdGUuIE1ha2UgdGhlIGJhc2UgZXhhbXBsZXMgdXNlCisJbGlzdHMgKHdvcmtzIGZpbmUpLgorCisyMDA0LTA1LTMwICBTZXRoIE5pY2tlbGwgIDxzZXRoQGdub21lLm9yZz4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluOgorCSogcHl0aG9uL3Rlc3RzL3Rlc3QtY2xpZW50LnB5OgorCisJQWRkIHNvbWUgbW9yZSB0ZXN0cyBhbmQgZml4IGVycm9ycyB0aGF0IGNyb3AgdXAuCisJVW5mb3J0dW5hdGVseSwgY3VycmVudGx5IGl0IHNlZW1zIGxpa2UgbWFyc2hhbGxpbmcKKwlhbmQgdW5tYXJzaGFsbGluZyBvZiBsaXN0cyBpcyBjb21wbGV0ZWx5IGJyb2tlbiA6LSgKKworMjAwNC0wNS0zMCAgU2V0aCBOaWNrZWxsICA8c2V0aEBnbm9tZS5vcmc+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbjoKKworCUFkZCBzdXBwb3J0IGZvciBPYmplY3RQYXRoIHR5cGUuCisKKwkqIHB5dGhvbi9kYnVzLnB5OgorCisJUmVmYWN0b3IgbWVzc2FnZSBoYW5kbGluZyBjb2RlIHRvIGEgY29tbW9uIGZ1bmN0aW9uLgorCQorCSogcHl0aG9uL3Rlc3RzL3Rlc3QtY2xpZW50LnB5OgorCSogcHl0aG9uL3Rlc3RzL3Rlc3Qtc2VydmVyLnB5OgorCisJQWRkIHRlc3RzIHRoYXQgY2hlY2sgdG8gbWFrZSBzdXJlIHZhbHVlcyBvZiBhbGwgdHlwZXMKKwljYW4gYmUgZWNob2VkIGZyb20gYSBzZXJ2aWNlIHcvbyBtYW5nbGluZy4KKwkKKzIwMDQtMDUtMjkgIFNldGggTmlja2VsbCAgPHNldGhAZ25vbWUub3JnPgorCisJKiBweXRob24vZGJ1cy5weToKKworCUFkZCBPYmplY3RUcmVlIGNsYXNzIHdoaWNoIGFsbG93cyBpbXBsZW1lbnRhdGlvbgorCW9mIHRyZWVzIG9mICJ2aXJ0dWFsIiBvYmplY3RzLiBCYXNpY2FsbHkgdGhlIHB5dGhvbgorCXdyYXBwZXIgZm9yICJyZWdpc3Rlcl9mYWxsYmFjayIuCisJCisJKiBweXRob24vZXhhbXBsZXMvTWFrZWZpbGUuYW0KKwkqIHB5dGhvbi9leGFtcGxlcy9nY29uZi1wcm94eS1jbGllbnQucHk6CisJKiBweXRob24vZXhhbXBsZXMvZ2NvbmYtcHJveHktc2VydmljZS5weToKKworCUltcGxlbWVudCBhIHNpbXBsZSBHQ29uZiBwcm94eSBzZXJ2aWNlIHRoYXQgc3VwcG9ydHMKKwlnZXQvc2V0IG9uIHN0cmluZyBhbmQgaW50IEdDb25mIGtleXMgdXNpbmcgdGhlIE9iamVjdFRyZWUuCisJCisyMDA0LTA1LTI5ICBTZXRoIE5pY2tlbGwgIDxzZXRoQGdub21lLm9yZz4KKworCSogcHl0aG9uL2RidXMucHk6CisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1jbGllbnQucHk6CisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1zZXJ2aWNlLnB5OgorCSogcHl0aG9uL2V4YW1wbGVzL2xpc3Qtc3lzdGVtLXNlcnZpY2VzLnB5OgorCisJQWRkIFNlc3Npb25CdXMsIFN5c3RlbUJ1cyBhbmQgQWN0aXZhdGlvbkJ1cyBjbGFzc2VzCisJc28geW91IGRvbid0IG5lZWQgdG8ga25vdyB0aGUgc3BlY2lhbCBsaXR0bGUgQlVTX1RZUEUKKwlmbGFnLgorCQorMjAwNC0wNS0yOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKHByb2Nlc3NfdGVzdF92YWxpZF9zdWJkaXIpOiB0ZW1wb3JhcmlseQorCXN0b3AgdGVzdGluZyBjb25maWcgcGFyc2VyIE9PTSBoYW5kbGluZywgc2luY2UgZXhwYXQgaGFzIGlzc3VlcworCWh0dHA6Ly9mcmVlZGVza3RvcC5vcmcvcGlwZXJtYWlsL2RidXMvMjAwNC1NYXkvMDAxMTUzLmh0bWwKKworCSogYnVzL2RidXMtZGFlbW9uLTEuMS5pbjogY2hhbmdlIHJlcXVlc3RlZF9yZXBseSB0bworCXNlbmRfcmVxdWVzdGVkX3JlcGx5L3JlY2VpdmVfcmVxdWVzdGVkX3JlcGx5IHNvIHdlIGNhbiBzZW5kIHRoZQorCXJlcGxpZXMsIG5vdCBqdXN0IHJlY2VpdmUgdGhlbS4KKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYzogcGFyc2UgdGhlIG5ldworCXNlbmRfcmVxdWVzdGVkX3JlcGx5L3JlY2VpdmVfcmVxdWVzdGVkX3JlcGx5CisKKwkqIGJ1cy9wb2xpY3kuYyAoYnVzX2NsaWVudF9wb2xpY3lfY2hlY2tfY2FuX3NlbmQpOiBhZGQKKwlyZXF1ZXN0ZWRfcmVwbHkgYXJndW1lbnQgYW5kIHVzZSBpdAorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X2NoZWNrX3NlY3VyaXR5X3BvbGljeSk6IHBhc3MgdGhyb3VnaAorCXJlcXVlc3RlZF9yZXBseSBzdGF0dXMgdG8gbWVzc2FnZSBzZW5kIGNoZWNrCisKKwkqIGJ1cy9zeXN0ZW0uY29uZi5pbjogYWRhcHQgdG8gcmVxdWVzdGVkX3JlcGx5IGNoYW5nZQorCQorMjAwNC0wNS0yOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi5jIChtYWluKTogcmVtb3ZlIHVudXNlZCB2YXJpYWJsZQorCisJKiBnbGliL2RidXMtZ2lkbC5jIChiYXNlX2luZm9fcmVmKTogZml4IGEgc2lsbHkgY29tcGlsZXIgd2FybmluZworCisJKiBkYnVzL2RidXMtYXV0aC5oIChlbnVtKTogcmVtb3ZlIEFVVEhFTlRJQ0FURURfV0lUSF9VTlVTRURfQllURVMKKwlmcm9tIHRoZSBlbnVtLCBubyBsb25nZXIgaW4gdXNlLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5oOiBpbmNsdWRlIGNvbmZpZy5oIHNvIERCVVNfVkFfQ09QWSBhY3R1YWxseQorCXdvcmtzIHJpZ2h0LgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiBhZGQgdmFyaW91cyBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgZm9yCisJd2hldGhlciBlcnJvcl9uYW1lIHBhc3NlZCBpbiBpcyBhIHZhbGlkIGVycm9yIG5hbWUuCisKKzIwMDQtMDUtMjggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9nZXRfYXJncyk6IEFkZGVkIHN1cHBvcnQgZm9yCisJT0JKRUNUX1BBVEggYW5kIE9CSkVDVF9QQVRIX0FSUkFZCisKKzIwMDQtMDUtMjggIFNldGggTmlja2VsbCAgPHNldGhAZ25vbWUub3JnPgorCisJKiBweXRob24vZXhhbXBsZXMvTWFrZWZpbGUuYW06CisKKwlGb3JnZXQgdG8gYWRkIE1ha2VmaWxlLmFtLiBEbyBub3QgcGFzcyBnby4KKworMjAwNC0wNS0yOCAgTWljaGFlbCBNZWVrcyAgPG1pY2hhZWxAeGltaWFuLmNvbT4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS5jIChkYnVzX2d2YWx1ZV9tYXJzaGFsLCBkYnVzX2d2YWx1ZV9kZW1hcnNoYWwpOiAKKwlmaXggbm8gaW50NjQgY2FzZS4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfcGFyc2VfYmFzaWNfdHlwZSk6IGltcGwuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKF9kYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWNfdHlwZSksCisJKF9kYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWNfdHlwZV9hcnJheSk6IGltcGwuCisJZHJhc3RpY2FsbHkgc2ltcGxpZnkgfmFsbCByZWxldmFudCBfZ2V0IG1ldGhvZHMgdG8gdXNlIHRoZXNlLgorCShfZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljX2FycmF5KSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljKTogaW1wbAorCWRyYXN0aWNhbGx5IHNpbXBsaWZ5IH5hbGwgcmVsZXZhbnQgX2FwcGVuZCBtZXRob2RzIHRvIHVzZSB0aGVzZS4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtYnVpbGRlci5jIChwYXJzZV9iYXNpY190eXBlKSAKKwkocGFyc2VfYmFzaWNfYXJyYXksIGxvb2t1cF9iYXNpY190eXBlKTogaW1wbC4KKwkoX2RidXNfbWVzc2FnZV9kYXRhX2xvYWQpOiBwcnVuZSBzY2FkcyBvZiBkdXBsaWNhdGUgLworCWN1dCAmIHBhc3RlIGNvZGluZy4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYyAoX2RidXNfZGVtYXJzaGFsX2Jhc2ljX3R5cGVfYXJyYXkpIAorCShfZGJ1c19kZW1hcnNoYWxfYmFzaWNfdHlwZSk6IGltcGxlbWVudCwKKwkoZGVtYXJzaGFsX2FuZF92YWxpZGF0ZV9sZW4vYXJnKTogYmVlZiB1cCBkZWJ1Zy4KKwkoX2RidXNfbWFyc2hhbF9iYXNpY190eXBlLCBfZGJ1c19tYXJzaGFsX2Jhc2ljX3R5cGVfYXJyYXkpOiBpbXBsLgorCisyMDA0LTA1LTI3ICBTZXRoIE5pY2tlbGwgIDxzZXRoQGdub21lLm9yZz4KKworCSogY29uZmlndXJlLmluOgorCSogcHl0aG9uL01ha2VmaWxlLmFtOgorCisJSW5jbHVkZSB0aGUgZXhhbXBsZSBweXRob24gYXBwcyBpbiB0aGUgdGFyYmFsbC4KKwkKKwkqIHB5dGhvbi9leGFtcGxlcy9saXN0LXN5c3RlbS1zZXJ2aWNlcy5weQorCisJQWRkIGEgcHl0aG9uIG5ldyBleGFtcGxlIHRoYXQgZmV0Y2hlcyB0aGUgbGlzdCBvZiBzZXJ2aWNlcworCWZyb20gdGhlIHN5c3RlbSBidXMuCisJCisyMDA0LTA1LTI3ICBTZXRoIE5pY2tlbGwgIDxzZXRoQGdub21lLm9yZz4KKworCSogcHl0aG9uL2RidXMucHk6CisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXguaW46CisKKwlGaXggZmFpbHVyZSB0byBub3RpZnkgdGhhdCBhIHNpZ25hbCB3YXMgbm90IGhhbmRsZWQsCisJcmVzdWx0ZWQgaW4gaHVuZyBmdW5jdGlvbnMuCisJCisyMDA0LTA1LTI1ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0ByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLW1vbml0b3IuYyAobWFpbik6IE1vbml0b3IgYWxsIHR5cGVzIG9mIG1lc3NhZ2VzLgorCisyMDA0LTA1LTIzICBPd2VuIEZyYXNlci1HcmVlbiAgPG93ZW5AZGlzY29iYWJlLm5ldD4KKworCSogbW9uby9IYW5kbGVyLmNzLCBtb25vL1NlcnZpY2UuY3M6IEFkZGVkIFVucmVnaXN0ZXJPYmplY3QgbWV0aG9kCisJd2hpY2ggdW5yZWdpc3RlcnMgdGhlIG9iamVjdCBwYXRoIGFuZCBkaXNwb3NlcyB0aGUgaGFuZGxlci4KKworMjAwNC0wNS0yMyAgS3Jpc3RpYW4gSMO4Z3NiZXJnICA8a3JoQHJlZGhhdC5jb20+CisgCisgICAgICAgIFBhdGNoIGZyb20gVGltbyBUZXLDpHMgPGV4dC10aW1vLnRlcmFzQG5va2lhLmNvbT4gKCM2MTQpOgorICAgICAgICAgCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnc192YWxpc3QpOiBTd2FwCisgICAgICAgIG9wZXJhbmRzIHRvICYmIHNvIHdlIGNhbGwgZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoKSBmb3IgdGhlIGxhc3QKKyAgICAgICAgYXJndW1lbnQgYWxzby4KKworMjAwNC0wNS0yMSAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGRidXMvZGJ1cy1vYmplY3QtdHJlZS5jCisJKF9kYnVzX29iamVjdF90cmVlX2xpc3RfcmVnaXN0ZXJlZF91bmxvY2ssIGxvb2t1cF9zdWJ0cmVlKTogcmV0dXJuCisJY2hpbGRyZW4gZXZlbiBpZiB0aGUgcmVxdWVzdGVkIHBhdGggaXNuJ3QgcmVnaXN0ZXJlZC4KKwkob2JqZWN0X3RyZWVfdGVzdF9pdGVyYXRpb24pOiB0ZXN0IG9iamVjdF90cmVlX2xpc3RfcmVnaXN0ZXJlZC4KKworCSogY29uZmlndXJlLmluOiB1bmRlZmluZSBIQVZFX0FCU1RSQUNUX1NPQ0tFVFMgaW5zdGVhZCBvZiBkZWZpbmluZworCWl0IHRvIDAuCisJCisyMDA0LTA1LTIwICBLcmlzdGlhbiBIw7hnc2JlcmcgIDxrcmhAcmVkaGF0LmNvbT4KKworCSogZG9jL1RPRE86IFJlbW92ZSByZXNvbHZlZCBpdGVtcy4KKworCSogYnVzL2V4cGlyZWxpc3QuaCAoc3RydWN0IEJ1c0V4cGlyZUxpc3QpOiByZW1vdmUgdW51c2VkIG5faXRlbXMKKwlmaWVsZC4KKwkKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGJ1c19jb25uZWN0aW9uc19leHBlY3RfcmVwbHkpOiBFbmZvcmNlIHRoZQorCXBlci1jb25uZWN0aW9uIGxpbWl0IG9uIHBlbmRpbmcgcmVwbGllcy4KKwkKKwlQYXRjaCBmcm9tIEpvbiBUcm93YnJpZGdlIDx0cm93QHhpbWlhbi5jb20+OgorIAorIAkqIGJ1cy9tYWluLmMgKHNldHVwX3JlbG9hZF9waXBlKTogQWRkZWQuICBDcmVhdGVzIGEgcGlwZSBhbmQgc2V0cworIAl1cCBhIHdhdGNoIHRoYXQgdHJpZ2dlcnMgYSBjb25maWcgcmVsb2FkIHdoZW4gb25lIGVuZCBvZiB0aGUgcGlwZQorIAliZWNvbWVzIHJlYWRhYmxlLgorIAkoc2lnbmFsX2hhbmRsZXIpOiBJbnN0ZWFkIG9mIGRvaW5nIHRoZSBjb25maWcgcmVsb2FkIGluIG91ciBTSUdIVVAKKyAJaGFuZGxlciwganVzdCB3cml0ZSB0byB0aGUgcmVsb2FkIHBpcGUgYW5kIGxldCB0aGUgYXNzb2NpYXRlZAorIAl3YXRjaCBoYW5kbGUgdGhlIHJlbG9hZCB3aGVuIGNvbnRyb2wgcmV0dXJucyB0byB0aGUgbWFpbiBsb29wLgorIAorIAkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfcmVsb2FkX2NvbmZpZyk6IEFkZGVkLgorIAlJbXBsZW1lbnRzIGEgUmVsb2FkQ29uZmlnIG1ldGhvZCBmb3IgcmVxdWVzdGluZyBhIGNvbmZpZ3VyYXRpb24KKyAJZmlsZSByZWxvYWQgdmlhIHRoZSBidXMgZHJpdmVyLgorIAorMjAwNC0wNS0xOSAgT3dlbiBGcmFzZXItR3JlZW4gIDxvd2VuQGRpc2NvYmFiZS5uZXQ+CisKKwkqIEhBQ0tJTkc6IFVwZGF0ZWQgcmVsZWFzZSBpbnN0cnVjdGlvbnMgY29uY2VybmluZyB0aGUgd2lraSBwYWdlLgorCisyMDA0LTA1LTE4ICBLcmlzdGlhbiBIw7hnc2JlcmcgIDxrcmhAcmVkaGF0LmNvbT4KKworIAkqIGRidXMvZGJ1cy1hdXRoLmMgKGNsaWVudF90cnlfbmV4dF9tZWNoYW5pc20pOiBSZW1vdmUgbG9naWMgdG8KKwlmaWx0ZXIgYWdhaW5zdCBhdXRoLT5hbGxvd2VkX21lY2hzOyB3ZSBvbmx5IGFkZCBhbGxvd2VkIG1lY2hzIGluCisJcmVjb3JkX21lY2hhbmlzbXMoKS4KKyAKKyAJKiBkYnVzL2RidXMtYXV0aC1zY3JpcHQuYyAoX2RidXNfYXV0aF9zY3JpcHRfcnVuKTogQWRkIGFuCisJQUxMT1dFRF9NRUNIUyB0byBhdXRoLXNjcmlwdCBmb3JtYXQgc28gd2UgY2FuIHNldCB0aGUgbGlzdCBvZgorCWFsbG93ZWQgbWVjaGFuaXNtcy4KKyAKKyAJKiBkYXRhL2F1dGgvY2xpZW50LW91dC1vZi1tZWNoYW5pc21zLmF1dGgtc2NyaXB0OiBOZXcgdGVzdCB0bworCWNoZWNrIGNsaWVudCBkaXNjb25uZWN0cyB3aGVuIGl0IGlzIG91dCBvZiBtZWNoYW5pc21zIHRvIHRyeS4KKyAKKyAJKiBkYnVzL2RidXMtYXV0aC5jIChwcm9jZXNzX2NvbW1hbmQpOiBSZW1vdmUgY2hlY2sgZm9yIGxpbmVzCisJbG9uZ2VyIHRoYXQgMSBNQjsgd2Ugb25seSBidWZmZXIgdXAgbWF4aW11bSAxNiBrQi4KKyAKKyAJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmMsIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jLAorCWRidXMvZGJ1cy1hdXRoLXNjcmlwdC5jLCBkYnVzL2RidXMtYXV0aC5jLCBkYnVzL2RidXMtYXV0aC5oOgorCVJlbW92ZSBhdXRoIHN0YXRlIEFVVEhFTlRJQ0FURURfV0lUSF9VTlVTRURfQllURVMsIGluc3RlYWQgYWx3YXlzCisJYXNzdW1lIHRoZXJlIG1pZ2h0IGJlIHVudXNlZCBieXRlcy4KKyAKKyAJKiBkYnVzL2RidXMtYXV0aC5jIChfZGJ1c19hdXRoX2RvX3dvcmspOiBSZW1vdmUgY2hlY2sgZm9yCisJY2xpZW50LW91dC1vZi1tZWNocywgaXQgaXMgaGFuZGxlZCBpbiBwcm9jZXNzX3JlamVjdCgpLiBNb3ZlIGNoZWNrCisJZm9yIG1heCBmYWlsdXJlcyB0byBzZW5kX3JlamVjdGVkKCksIGFzIGl0J3MgYSBzZXJ2ZXItb25seSB0aGluZy4KKworCSogZGJ1cy9kYnVzLWF1dGguYzogRmFjdG9yIG91dCBwcm90b2NvbCByZXBseSBjb2RlIGludG8gZnVuY3Rpb25zCisJc2VuZF9hdXRoKCksIHNlbmRfZGF0YSgpLCBzZW5kX3JlamVjdGVkKCksIHNlbmRfZXJyb3IoKSwKKwlzZW5kX29rKCksIHNlbmRfYmVnaW4oKSBhbmQgc2VuZF9jYW5jZWwoKS4KKworMjAwNC0wNS0xNyAgS3Jpc3RpYW4gSMO4Z3NiZXJnICA8a3JoQHJlZGhhdC5jb20+CisKKwlSZW1vdmUgYmFzZTY0IGVuY29kaW5nLCByZXBsYWNlIHdpdGggaGV4IGVuY29kaW5nLiBPcmlnaW5hbCBwYXRjaAorCWZyb20gdHJvd0B4aW1pYW4uY29tLCBhZGRlZCBlcnJvciBoYW5kbGluZy4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfYmFzZTY0X2VuY29kZSkKKwkoX2RidXNfc3RyaW5nX2Jhc2U2NF9kZWNvZGUpOiBSZW1vdmUuCisJKF9kYnVzX3N0cmluZ19oZXhfZGVjb2RlKTogQWRkIGVuZF9yZXR1cm4gYXJndW1lbnQgc28gd2UgY2FuCisJZGlzdGluZ3Vpc2ggYmV0d2VlbiBPT00gYW5kIGludmFsaWQgaGV4IGVuY29kaW5nLgorCShfZGJ1c19zdHJpbmdfdGVzdCk6IFJlbW92ZSBiYXNlNjQgdGVzdHMgYW5kIGFkZCB0ZXN0IGNhc2UgZm9yCisJaW52YWxpZCBoZXguCisKKwkqIGRidXMvZGJ1cy1rZXlyaW5nLmMsIGRidXMvZGJ1cy1hdXRoLXNjcmlwdC5jLCBkYnVzL2RidXMtYXV0aC5jOgorCVJlcGxhY2UgYmFzZTY0IHdpdGggaGV4LgorCisJKiB0ZXN0L2RhdGEvYXV0aC9pbnZhbGlkLWhleC1lbmNvZGluZy5hdXRoLXNjcmlwdDogTmV3IHRlc3QgY2FzZQorCWZvciBpbnZhbGlkIGhleCBlbmNvZGVkIGRhdGEgaW4gYXV0aCBwcm90b2NvbC4KKworMjAwNC0wNS0xNyAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGNoZWNrX2Zvcl9yZXBseV91bmxvY2tlZCk6IHBsdWcgYSBtZW1vcnkKKwlsZWFrLgorCisyMDA0LTA1LTE1ICBPd2VuIEZyYXNlci1HcmVlbiAgPG93ZW5AZGlzY29iYWJlLm5ldD4KKworCSogbW9uby9kYnVzLXNoYXJwLmRsbC5jb25maWcuaW46IEFkZGVkIGZvciBHQUMKKwkqIG1vbm8vZGJ1cy1zaGFycC5zbms6IEFkZGVkIGZvciBHQUMKKwkqIG1vbm8vQXNzZW1ibHkuY3MuaW46IEFkZGVkIGZvciBHQUMKKwkqIG1vbm8vTWFrZWZpbGUuYW06IENoYW5nZXMgZm9yIEdBQyBpbnN0YWxsYXRpb24JCisJKiBjb25maWd1cmUuaW46IEFkZGVkIHJlZnMgZm9yIGRidXMtc2hhcnAuZGxsLmNvbmZpZy5pbiBhbmQKKwlBc3NlbWJseS5jcy5pbi4gTW9yZSBmaXhlcyBmb3IgbW9ubyB0ZXN0aW5nCisJKiBtb25vL2V4YW1wbGUvTWFrZWZpbGUuYW06IENoYW5nZWQgdmFyIHRvIENTQworCSogTWFrZWZpbGUuYW06IENoYW5nZWQgZmxhZyBuYW1lIHRvIERCVVNfVVNFX0NTQworCisyMDA0LTA1LTE1ICBPd2VuIEZyYXNlci1HcmVlbiAgPG93ZW5AZGlzY29iYWJlLm5ldD4KKworCSogbW9uby9NYWtlZmlsZS5hbTogQWRkZWQgU1VCRElSUyBmb3IgZG9jcy4gQ2hhbmdlZCBTVUJESVJTIG9yZGVyCisJKiBtb25vL2RvYy8qOiBBZGRlZCBkb2N1bWVudGF0aW9uIGZyYW1ld29yaworCSogY29uZmlndXJlLmluOiBBZGRlZCBtb25vZG9jIGNoZWNrCisJKiBSRUFETUU6IEFkZGVkIGRlc2NyaXB0aW9uIG9mIG1vbm8gY29uZmlndXJlIGZsYWdzCisKKzIwMDQtMDUtMTEgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+OgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogQWRkZWQgYSAiUmVxdWlyZWQiIGNvbHVtbiB0byB0aGUgCisJaGVhZGVyIGZpZWxkcyB0YWJsZSBhbmQgY2hhbmdlZCB0aGUgInplcm8gb3IgbW9yZSIgdmVyYmFnZSBpbgorCXRoZSBhYm92ZSBwYXJhZ3JhcGggdG8gcmVhZCAiVGhlIGhlYWRlciBtdXN0IGNvbnRhaW4gdGhlIHJlcXVpcmVkIAorCW5hbWVkIGhlYWRlciBmaWVsZHMgYW5kIHplcm8gb3IgbW9yZSBvZiB0aGUgb3B0aW9uYWwgbmFtZWQgaGVhZGVyIAorCWZpZWxkcyIuCisJKiB0ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy8qLm1lc3NhZ2U6IEFkZGVkIHRoZSByZXF1aXJlZCBQQVRIIAorCW5hbWVkIGhlYWRlciBmaWVsZCB0byB0aGUgdGVzdHMgc28gdGhhdCB0aGV5IGRvbid0IGZhaWwgb24gCisJJ01pc3NpbmcgcGF0aCBmaWVsZCcKKworMjAwNC0wNS0wNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL2RidXMtYmluZGluZ3MucHl4LmluOiBTdG9wcGVkIHRoZSBiaW5kaW5ncyBmcm9tIHRyYXNoaW5nCisJdGhlIHN0YWNrIGJ5IGltcGxpY2l0bHkgZGVmaW5pbmcgdmFyaWFibGUgYW5kIHBhcmFtZXRlciB0eXBlcyBhbmQKKwlyZW1vdmluZyB0aGUgaGFjayBvZiBkZWZpbmluZyBDIHBvaW50ZXJzIGFzIHB5dGhvbiBvYmplY3RzIGFuZCBsYXRlcgorCWNhc3RpbmcgdGhlbS4KKworMjAwNC0wNS0wMiAgT3dlbiBGcmFzZXItR3JlZW4gIDxvd2VuQGRpc2NvYmFiZS5uZXQ+CisKKwkqIG1vbm8vTWFrZWZpbGUuYW06IFJlbW92ZWQgdGVzdC1kYnVzLXNoYXJwLmV4ZSBmcm9tIGFsbCB0YXJnZXQKKworMjAwNC0wNS0wMSAgT3dlbiBGcmFzZXItR3JlZW4gIDxvd2VuQGRpc2NvYmFiZS5uZXQ+CisKKwkqIG1vbm8vREJ1c1R5cGUvRGljdC5jczogSGFuZGxlIGVtcHR5IGRpY3RzCisJKiBtb25vL0RCdXNUeXBlL0FycmF5LmNzOiBIYW5kbGUgZW1wdHkgYXJyYXlzCisJKiBtb25vL0FyZ3VtZW50cy5jczogSGFuZGxlIGVtcHR5IGFyZ3VtZW50cworCisyMDA0LTA0LTMwICBPd2VuIEZyYXNlci1HcmVlbiAgPG93ZW5AZGlzY29iYWJlLm5ldD4KKworCSogZGJ1cy1zaGFycC5wYy5pbjogTW9kaWZpZWQgdG8gaW5jbHVkZSBpbmNsdWRlIExpYnMgYW5kIFJlcXVpcmVzCisJZmllbGQKKworMjAwNC0wNC0yNSAgS3Jpc3RpYW4gSMO4Z3NiZXJnICA8a3JoQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC0qLm1lc3NhZ2U6IFVwZGF0ZSBtZXNzYWdlCisJdGVzdCBzY3JpcHRzIHRvIG5ldyBoZWFkZXIgZmllbGQgbmFtZXMuCisKKzIwMDQtMDQtMjIgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvYnJlYWstbG9hZGVyLmMgKHJhbmRvbWx5X2RvX25fdGhpbmdzKTogdHJhY2tlZCBkb3duIGJ1ZmZlcgorCW92ZXJmbG93IHRvIHRpbWVzX3dlX2RpZF9lYWNoX3RoaW5nIGFycmF5IHdoaWNoIHdvdWxkIGNob3Agb2ZmIHRoZQorCWZpcnN0IGNoYXJhY3RlciBvZiB0aGUgZmFpbHVyZV9kaXIgc3RyaW5nLiBJbmNyZWFzZWQgdGhlIHNpemUgb2YKKwl0aGUgYXJyYXkgdG8gNyB0byByZWZsZWN0IHRoZSBudW1iZXIgb2YgcmFuZG9tIG11dGF0aW9uIGZ1bmN0aW9ucworCXdlIGhhdmUuCisKKzIwMDQtMDQtMjEgIEtyaXN0aWFuIEjDuGdzYmVyZyAgPGtyaEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc2VydmVyLXVuaXguYyAodW5peF9maW5hbGl6ZSk6IERvbid0IHVucmVmCisJdW5peF9zZXJ2ZXItPndhdGNoIGhlcmUsIGl0IGlzIHVucmVmZmVkIGluIGRpc2Nvbm5lY3QuCisJKF9kYnVzX3NlcnZlcl9uZXdfZm9yX3RjcF9zb2NrZXQpOiBjb252ZXJ0IE5VTEwgaG9zdCB0bworCSJsb2NhbGhvc3QiIGhlcmUgc28gd2UgZG9uJ3QgYXBwZW5kIE5VTEwgdG8gYWRkcmVzcy4KKwkKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYyAoX2RidXNfc2VydmVyX3Rlc3QpOiBBZGQgdGVzdCBjYXNlIGZvcgorCXZhcmlvdXMgYWRkcmVzc2VzLCBpbmNsdWRpbmcgdGNwIHdpdGggbm8gZXhwbGljaXQgaG9zdC4KKworMjAwNC0wNC0yMSAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRlY29kZV9oZWFkZXJfZGF0YSwgZGVjb2RlX3N0cmluZ19maWVsZCk6CisJZml4IGluY29ycmVjdCBzZXR0aW5nIG9mIC5uYW1lX29mZnNldCBpbiB0aGUgSGVhZGVyRmllbGQgKGl0IHdhcworCW9mZiBieSB0d28gYnl0ZXMsIHBvc2l0aW9uZWQgcmlnaHQgYWZ0ZXIgdGhlIG5hbWUgYW5kIHR5cGVjb2RlKQorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X25ldywgYnVzX2NvbnRleHRfdW5yZWYpOiB0ZXN0IGJlZm9yZQorCWNhbGxpbmcgZGJ1c19zZXJ2ZXJfZnJlZV9kYXRhX3Nsb3QgYW5kIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5yZWYKKwlpbiBjYXNlIG9mIGFuIGVycm9yLgorCisJKiB0b29scy9NYWtlZmlsZS5hbTogYWRkICQoREJVU19HTElCX1RPT0xfTElCUyksIHhtbCBsaWJzIG5lZWRlZAorCWJ5IGxpYmRidXMtZ3Rvb2wuCisKKzIwMDQtMDQtMTkgIEtyaXN0aWFuIEjDuGdzYmVyZyAgPGtyaEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYyAodW5peF9kb19pdGVyYXRpb24pOiBSZXdyaXRlIHRvIHVzZQorCV9kYnVzX3BvbGwoKSBpbnN0ZWFkIG9mIHNlbGVjdCgpLgorCisyMDA0LTA0LTE1ICBKb24gVHJvd2JyaWRnZSAgPHRyb3dAeGltaWFuLmNvbT4KKworCSogYnVzL21haW4uYyAoc2lnbmFsX2hhbmRsZXIpOiBSZWxvYWQgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMKKwlvbiBTSUdIVVAuCisJKG1haW4pOiBTZXQgdXAgb3VyIFNJR0hVUCBoYW5kbGVyLgorCisJKiBidXMvYnVzLmMgKHN0cnVjdCBCdXNDb250ZXh0KTogU3RvcmUgdGhlIGNvbmZpZyBmaWxlLCB1c2VyIGFuZAorCWZvcmsgZmxhZyBpbiB0aGUgQnVzQ29udGV4dC4KKwkocHJvY2Vzc19jb25maWdfZmlyc3RfdGltZV9vbmx5KTogQWRkZWQuICBDb250YWlucyB0aGUgY29kZQorCShwcmV2aW91c2x5IGluIGJ1c19jb250ZXh0X25ldykgZm9yIHNldHRpbmcgdXAgdGhlIEJ1c0NvbnRleHQgZnJvbQorCXRoZSBCdXNDb25maWdQYXJzZXIgdGhhdCBzaG91bGQgb25seSBiZSBydW4gdGhlIGZpcnN0IHRpbWUgdGhlCisJY29uZmlnIGZpbGVzIGFyZSByZWFkLgorCShwcm9jZXNzX2NvbmZpZ19ldmVyeV90aW1lKTogQWRkZWQuICBDb250YWlucyB0aGUgY29kZSAocHJldmlvdXNseQorCWluIGJ1c19jb250ZXh0X25ldykgZm9yIHNldHRpbmcgdXAgdGhlIEJ1c0NvbnRleHQgZnJvbSB0aGUKKwlCdXNDb25maWdQYXJzZXIgdGhhdCBzaG91bGQgYmUgcnVuIGV2ZXJ5IHRpbWUgdGhlIGNvbmZpZyBmaWxlcyBhcmUKKwlyZWFkLgorCShsb2FkX2NvbmZpZyk6IEFkZGVkLiAgQnVpbGRzIGEgQnVzQ29uZmlnUGFyc2VyIGZyb20gdGhlIGNvbmZpZworCWZpbGVzIGFuZCBwYXNzZXMgdGhlIHJlc3VsdGluZyBzdHJ1Y3R1cmUgb2ZmIHRvCisJcHJvY2Vzc19jb25maWdfZmlyc3RfdGltZV9vbmx5IChhc3N1bWluZyB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lKQorCWFuZCBwcm9jZXNzX2NvbmZpZ19ldmVyeV90aW1lLgorCShidXNfY29udGV4dF9uZXcpOiBBbGwgb2YgdGhlIGNvbmZpZy1yZWxhdGVkIGNvZGUgaGFzIGJlZW4gbW92ZWQKKwl0byBwcm9jZXNzX2NvbmZpZ19maXJzdF90aW1lX29ubHkgYW5kIHByb2Nlc3NfY29uZmlnX2V2ZXJ5X3RpbWUuCisJTm93IHRoaXMgZnVuY3Rpb24ganVzdCBkb2VzIHRoZSBub24tY29uZmlnLXJlbGF0ZWQgaW5pdGlhbGl6YXRpb25zCisJYW5kIGNhbGxzIGxvYWRfY29uZmlnLgorCShidXNfY29udGV4dF9yZWxvYWRfY29uZmlnKTogQWRkZWQuCisKKzIwMDQtMDQtMTUgIE9saXZpZXIgQW5kcmlldSAgPG9saXZfX2FAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBidXMvZHJpdmVyLmMgKGJ1c19kcml2ZXJfaGFuZGxlX2dldF9zZXJ2aWNlX293bmVyKToKKwlpbXBsZW1lbnQgYSBHZXRTZXJ2aWNlT3duZXIgbWV0aG9kLgorCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IGRvY3VtZW50IGl0LgorCSogZGJ1cy9kYnVzLWVycm9ycy5oOiBhZGQgYSAnU2VydmljZUhhc05vT3duZXInIGVycm9yLgorCQorCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dwcm94eV9uZXdfZm9yX3NlcnZpY2Vfb3duZXIpOgorCWltcGxlbWVudCwgdXNpbmcgdGhlIGJ1cyBHZXRTZXJ2aWNlT3duZXIgbWV0aG9kLgorCisJKiB0ZXN0L2dsaWIvdGVzdC1kYnVzLWdsaWIuYzoKKwl1c2UgZGJ1c19ncHJveHlfbmV3X2Zvcl9zZXJ2aWNlX293bmVyIHNvIHRoYXQgd2UgY2FuIHJlY2VpdmUgdGhlCisJc2lnbmFsLiAKKworMjAwNC0wNC0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jLCBkYnVzL2RidXMtbWVzc2FnZS1idWlsZGVyLmMsCisJZGJ1cy9kYnVzLW1lc3NhZ2UuYywgZGJ1cy9kYnVzLXByb3RvY29sLmgKKwkoREJVU19IRUFERVJfRklFTERfU0VSVklDRSk6IHJlbmFtZWQgREJVU19IRUFERVJfRklFTERfREVTVElOQVRJT04KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jLCBkYnVzL2RidXMtbWVzc2FnZS1idWlsZGVyLmMsCisJZGJ1cy9kYnVzLW1lc3NhZ2UuYywgZGJ1cy9kYnVzLXByb3RvY29sLmgKKwkoREJVU19IRUFERVJfRklFTERfU0VOREVSX1NFUlZJQ0UpOiByZW5hbWVkIERCVVNfSEVBREVSX0ZJRUxEX1NFTkRFUgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmMgKF9kYnVzX2hlYWRlcl9maWVsZF90b19zdHJpbmcpOgorCURCVVNfSEVBREVSX0ZJRUxEX0RFU1RJTkFUSU9OIHJlc29sdmVzIHRvICJkZXN0aW5hdGlvbiIKKwlEQlVTX0hFQURFUl9GSUVMRF9TRU5ERVIgcmVzb2x2ZXMgdG8gInNlbmRlciIKKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWwgKEhlYWRlciBGaWVsZHMgVGFibGUpOgorCXMvU0VSVklDRS9ERVNUSU5BVElPTgorCXMvU0VOREVSX1NFUlZJQ0UvU0VOREVSCisKKworMjAwNC0wNC0xNCAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHRlc3QvZ2xpYi90ZXN0LWRidXMtZ2xpYi5jICh0aW1lZF9leGl0KTogZmFpbCB0aGUgdGVzdCBhZnRlcgorCWEgZmV3IHNlY29uZHMuCisKKzIwMDQtMDQtMTMgIE1pY2hhZWwgTWVla3MgIDxtaWNoYWVsQHhpbWlhbi5jb20+CisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGhhbmRsZV9pbnRyb3NwZWN0KTogc3BsaXQgb3V0CisJKGludHJvc3BlY3RfcHJvcGVydGllcyk6IHRoaXMuCisJKGhhbmRsZV9pbnRyb3NwZWN0KTogaW1wbGVtZW50IHRoaXMuCisKKwkqIHRlc3QvZ2xpYi9NYWtlZmlsZS5hbTogdXNlIHRoZSBhYnNvbHV0ZSBwYXRoIHNvIHRoZSBidXMKKwlkYWVtb24ncyBjaGRpciAoIi8iKSBkb2Vzbid0IGtpbGwgdXMgZGVhZC4KKworCSogY29uZmlndXJlLmluOiBzdWJzdCBBQlNPTFVURV9UT1BfQlVJTERESVIKKworMjAwNC0wNC0xMiAgSm9uIFRyb3dicmlkZ2UgIDx0cm93QHhpbWlhbi5jb20+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKHN0cnVjdCBCdXNDb25maWdQYXJzZXIpOiBBZGRlZAorCWluY2x1ZGVkX2ZpbGVzIGZpZWxkLgorCShzZWVuX2luY2x1ZGUpOiBBZGRlZC4gIENoZWNrcyB3aGV0aGVyIG9yIG5vdCBhIGZpbGUgaGFzIGFscmVhZHkKKwliZWVuIGluY2x1ZGVkIGJ5IGFueSBwYXJlbnQgQnVzQ29uZmlnUGFyc2VyLgorCShidXNfY29uZmlnX3BhcnNlcl9uZXcpOiBDb3B5IHRoZSBwYXJlbnQncyBpbmNsdWRlZF9maWxlcy4KKwkoaW5jbHVkZV9maWxlKTogVHJhY2sgd2hpY2ggZmlsZXMgaGF2ZSBiZWVuIGluY2x1ZGVkLCBhbmQgZmFpbCBvbgorCWNpcmN1bGFyIGluY2x1c2lvbnMuCisJKHByb2Nlc3NfdGVzdF92YWxpZF9zdWJkaXIpOiBDaGFuZ2VkIHByaW50ZiB0byByZXBvcnQgaWYgd2UgYXJlCisJdGVzdGluZyB2YWxpZCBvciBpbnZhbGlkIGNvbmYgZmlsZXMuCisJKGFsbF9hcmVfZXF1aXYpOiBDaGFuZ2VkIHByaW50ZiB0byBiZSBhIGJpdCBjbGVhcmVyIGFib3V0CisJd2hhdCB3ZSBhcmUgYWN0dWFsbHkgZG9pbmcuCisJKGJ1c19jb25maWdfcGFyc2VyX3Rlc3QpOiBUZXN0IGludmFsaWQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworMjAwNC0wNC0wOSAgSm9uIFRyb3dicmlkZ2UgIDx0cm93QHhpbWlhbi5jb20+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKGJ1c19jb25maWdfcGFyc2VyX25ldyk6IEFkZGVkIGEgJ3BhcmVudCcKKwlhcmd1bWVudC4gIElmIG5vbi1udWxsLCB0aGUgbmV3bHktY29uc3RydWN0ZWQgQnVzQ29uZmlnUGFyc2VyIHdpbGwKKwliZSBpbml0aWFsaXplZCB3aXRoIHRoZSBwYXJlbnQncyBCdXNMaW1pdHMgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdAorCXZhbHVlcy4KKwkoaW5jbHVkZV9maWxlKTogV2hlbiBpbmNsdWRpbmcgYSBjb25maWcgZmlsZSwgcGFzcyBpbgorCXRoZSBjdXJyZW50IHBhcnNlciBhcyB0aGUgcGFyZW50IGFuZCB0aGVuIGNvcHkgdGhlIEJ1c0xpbWl0cworCWZyb20gdGhlIGluY2x1ZGVkIEJ1c0NvbmZpZ1BhcnNlciBwYWNrIHRvIHRoZSBjdXJyZW50IHBhcnNlci4KKwkocHJvY2Vzc190ZXN0X3ZhbGlkX3N1YmRpcik6IFJlbmFtZWQgZnJvbSBwcm9jZXNzX3Rlc3Rfc3ViZGlyLgorCShwcm9jZXNzX3Rlc3RfZXF1aXZfc3ViZGlyKTogQWRkZWQuICBXYWxrcyB0aHJvdWdoIGEgZGlyZWN0b3J5LAorCWRlc2NlbmRpbmcgaW50byBlYWNoIHN1YmRpcmVjdG9yeSBhbmQgbG9hZGluZyB0aGUgY29uZmlnIGZpbGVzCisJaXQgZmluZHMgdGhlcmUuICBJZiBhbnkgc3ViZGlyZWN0b3J5IGNvbnRhaW5zIHR3byBjb25maWcgZmlsZXMKKwl0aGF0IGRvbid0IHByb2R1Y2UgaWRlbnRpY2FsIEJ1c0NvbmZpZ1BhcnNlciBzdHJ1Y3RzLCBmYWlsLgorCUZvciBub3csIHRoZSBCdXNDb25maWdQYXJzZXIncyBCdXNQb2xpY2llcyBhcmUgbm90IGNvbXBhcmVkLgorCShidXNfY29uZmlnX3BhcnNlcl90ZXN0KTogQ2FsbCBib3RoIHByb2Nlc3NfdGVzdF92YWxpZF9zdWJkaXIgYW5kCisJcHJvY2Vzc190ZXN0X2VxdWl2X3N1YmRpci4KKworCSogYnVzL2NvbmZpZy1sb2FkZXItbGlieG1sLmMgKGJ1c19jb25maWdfbG9hZCk6IFRha2UgYSBwYXJlbnQKKwlhcmd1bWVudCBhbmQgcGFzcyBpdCBhbG9uZyB0byB0aGUgY2FsbCB0byBidXNfY29uZmlnX3BhcnNlcl9uZXcuCisJQWxzbyBtYWRlIGEgZmV3IHNtYWxsIGNoYW5nZXMgdG8gYWxsb3cgdGhpcyBjb2RlIHRvIGNvbXBpbGUuCisKKwkqIGJ1cy9jb25maWctbG9hZGVyLWV4cGF0LmMgKGJ1c19jb25maWdfbG9hZCk6IFRha2UgYSBwYXJlbnQKKwlhcmd1bWVudCBhbmQgcGFzcyBpdCBhbG9uZyB0byB0aGUgY2FsbCB0byBidXNfY29uZmlnX3BhcnNlcl9uZXcuCisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfbmV3KTogTG9hZCB0aGUgY29uZmlnIGZpbGUKKwl3aXRoIGEgTlVMTCBwYXJlbnQgYXJndW1lbnQuCisKKzIwMDQtMDMtMjkgIE1pY2hhZWwgTWVla3MgIDxtaWNoYWVsQHhpbWlhbi5jb20+CisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGludHJvc3BlY3RfcHJvcGVydGllcyk6IHNwbGl0CisJb3V0LCBmaXggbWFuZ2xlZCAnd2hpbGUnIGZsb3cgY29udHJvbC4KKwkoaW50cm9zcGVjdF9zaWduYWxzKTogaW1wbGVtZW50LgorCShoYW5kbGVfaW50cm9zcGVjdCk6IHVwZGF0ZS4KKworMjAwNC0wMy0yOSAgTWljaGFlbCBNZWVrcyAgPG1pY2hhZWxAeGltaWFuLmNvbT4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoc2V0X29iamVjdF9wcm9wZXJ0eSk6IHNwbGl0IG91dCAvIAorCXJlLXdvcmssIHVzZSB0aGUgcHJvcGVydHkgdHlwZSwgYW5kIG5vdCB0aGUgbWVzc2FnZSB0eXBlKCEpCisJKGdldF9vYmplY3RfcHJvcGVydHkpOiBkaXR0by4KKworICAgICAgICAqIGdsaWIvZGJ1cy1ndmFsdWUuYyAoZGJ1c19ndmFsdWVfZGVtYXJzaGFsKSwKKwkoZGJ1c19ndmFsdWVfbWFyc2hhbCk6IG1ha2UgdGhpcyBjb2RlIHJlLXVzYWJsZSwgbmVlZGVkCisJZm9yIHNpZ25hbHMgdG9vLCBhbHNvIG9uIGJvdGggcHJveHkgYW5kIHNlcnZlciBzaWRlLgorCVJlLXdyaXRlIGZvciBtb3JlIGVmZmljaWVuY3kgLyByZWFkYWJpbGl0eS4KKworMjAwNC0wMy0yOSAgTWljaGFlbCBNZWVrcyAgPG1pY2hhZWxAeGltaWFuLmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYworCShkYnVzX21lc3NhZ2VfbmV3X2Vycm9yX3ByaW50Zik6IGltcGwuCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMKKwkoZGJ1c19jb25uZWN0aW9uX3VucmVnaXN0ZXJfb2JqZWN0X3BhdGgpOiBmaXggd2FybmluZy4KKworCSogY29uZmlndXJlLmluOiBmaXggbm8tbW9uby1pbnN0YWxsZWQgc2l0dWF0aW9uLgorCisyMDA0LTAzLTI3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCVBhdGNoIGZyb20gVGltbyBUZXLDpHM6CisJCisJKiB0b29scy9kYnVzLXNlbmQuYyAobWFpbik6IGlmIC0tcHJpbnQtcmVwbHksIGFzc3VtZSB0eXBlIGlzCisJbWV0aG9kIGNhbGw7IHN1cHBvcnQgYm9vbGVhbiB0eXBlIGFyZ3MKKwkKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkpOiBmaXggYQorCWJ1bmNoIG9mIG1lbWxlYWsgYW5kIGxvZ2ljIGJ1Z3MKKwkKKzIwMDQtMDMtMjMgIE93ZW4gRnJhc2VyLUdyZWVuICA8b3dlbkBkaXNjb2JhYmUubmV0PgorCisgICAgICAgICogbW9uby9Bcmd1bWVudHMuY3M6CisJKiBtb25vL0ludHJvc3BlY3Rvci5jczoKKwkqIG1vbm8vSGFuZGxlci5jczoKKwkqIG1vbm8vSW50ZXJmYWNlUHJveHkuY3M6CisJKiBtb25vL01lc3NhZ2UuY3MKKwkqIG1vbm8vUHJveHlCdWlsZGVyLmNzOgorCSogbW9uby9TZXJ2aWNlLmNzOgorCUFkZGVkIEludGVyZmFjZVByb3h5IGNsYXNzIHRvIGF2b2lkIGJ1aWxkaW5nIHByb3hpZXMgZm9yIGV2ZXJ5CisJb2JqZWN0LgorCisJKiBkYnVzLW1lc3NhZ2UuaDoKKwkqIGRidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3NfdmFsaXN0KQorCShkYnVzX21lc3NhZ2VfaXRlcl9nZXRfb2JqZWN0X3BhdGgpCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9vYmplY3RfcGF0aF9hcnJheSkKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX29iamVjdF9wYXRoKQorCShkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfb2JqZWN0X3BhdGhfYXJyYXkpOgorCUFkZGVkIG9iamVjdF9wYXRoIGl0ZXIgZnVuY3Rpb25zIHRvIGhhbmRsZSBPQkpFQ1RfUEFUSCBhcmd1bWVudHMKKwkKKzIwMDQtMDMtMjMgIE93ZW4gRnJhc2VyLUdyZWVuICA8b3dlbkBkaXNjb2JhYmUubmV0PgorCisJRmlyc3QgY2hlY2tpbiBvZiBtb25vIGJpbmRpbmdzLgorCSogY29uZmlndXJlLmluOgorCSogTWFrZWZpbGUuYW06CisJQnVpbGQgc3R1ZmYgZm9yIHRoZSBiaW5kaW5ncworCSogZGJ1cy1zaGFycC5wYy5pbjogQWRkZWQgZm9yIHBrZ2NvbmZpZworCQorMjAwNC0wMy0yMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvdGVzdC1zZXJ2aWNlLmMgKG1haW4pOiByZW1vdmUgZGVidWcgc3BldworCisyMDA0LTAzLTIxICBPbGl2aWVyIEFuZHJpZXUgIDxvbGl2X19hQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYyAoX2RidXNfbWFyc2hhbF92YWxpZGF0ZV9hcmcpOiBhY2NlcHQgZW1wdHkKKwlhcnJheXMKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaCwgYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfaXRlcl9pbml0KQorCShkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FycmF5X2l0ZXJhdG9yKQorCShkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2RpY3RfaXRlcmF0b3IpOiByZXR1cm4gYSBkYnVzX2Jvb2xfdCB0bworCWluZGljYXRlIHdoZXRoZXIgdGhlIGl0ZXJhdG9yIGlzIGVtcHR5CisKKwkqIGRidXMvZGJ1cy1wZW5kaW5nLWNhbGwuYywgZGJ1cy9kYnVzLXNlcnZlci5jOiBzaWxlbmNlIGNvbXBpbGVyCisJd2FybmluZ3MKKworMjAwNC0wMy0xOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIE5FV1M6IDAuMjEgdXBkYXRlcworCisJKiBjb25maWd1cmUuaW46IDAuMjEKKworCSogZG9jL01ha2VmaWxlLmFtOiBhZGQgYWxsIFhNTFRPIHVzYWdlIHRvIERCVVNfWE1MX0RPQ1NfRU5BQkxFRAorCQorCSogcHl0aG9uL01ha2VmaWxlLmFtOiBjaGFuZ2UgdG8gYXZvaWQgZGlzdCBvZiBkYnVzX2JpbmRpbmdzLmMgc28KKwl5b3UgZG9uJ3QgbmVlZCBweXJleCB0byBtYWtlIGRpc3QKKworCSogcXQvTWFrZWZpbGUuYW0gKGxpYmRidXNfcXRfMV9sYV9TT1VSQ0VTKTogYWRkIGludGVncmF0b3IuaCB0bworCXNvdXJjZXM7IHJ1biBtb2MKKwkKKzIwMDQtMDMtMTggIFJpY2hhcmQgSHVsdCAgPHJpY2hhcmRAaW1lbmRpby5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9nZXRfYXV0b19hY3RpdmF0aW9uKSAKKwkoZGJ1c19tZXNzYWdlX3NldF9hdXRvX2FjdGl2YXRpb24pOiBBZGQgZG94eWdlbiBkb2NzLgorCisyMDA0LTAzLTE2ICBSaWNoYXJkIEh1bHQgIDxyaWNoYXJkQGltZW5kaW8uY29tPgorCisJKiBidXMvYWN0aXZhdGlvbi5jOiAoYnVzX2FjdGl2YXRpb25fc2VydmljZV9jcmVhdGVkKSwKKwkoYnVzX2FjdGl2YXRpb25fc2VuZF9wZW5kaW5nX2F1dG9fYWN0aXZhdGlvbl9tZXNzYWdlcyksCisJKGJ1c19hY3RpdmF0aW9uX2FjdGl2YXRlX3NlcnZpY2UpOgorCSogYnVzL2FjdGl2YXRpb24uaDoKKwkqIGJ1cy9kaXNwYXRjaC5jOiAoYnVzX2Rpc3BhdGNoKSwKKwkoY2hlY2tfbm9uZXhpc3RlbnRfc2VydmljZV9hdXRvX2FjdGl2YXRpb24pLAorCShjaGVja19zZXJ2aWNlX2F1dG9fYWN0aXZhdGVkKSwKKwkoY2hlY2tfc2VnZmF1bHRfc2VydmljZV9hdXRvX2FjdGl2YXRpb24pLAorCShjaGVja19leGlzdGVudF9zZXJ2aWNlX2F1dG9fYWN0aXZhdGlvbiksIChidXNfZGlzcGF0Y2hfdGVzdCk6CisJKiBidXMvZHJpdmVyLmM6IChidXNfZHJpdmVyX2hhbmRsZV9hY3RpdmF0ZV9zZXJ2aWNlKToKKwkqIGJ1cy9zZXJ2aWNlcy5jOiAoYnVzX3JlZ2lzdHJ5X2FjcXVpcmVfc2VydmljZSk6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoZGJ1c19tZXNzYWdlX3NldF9hdXRvX2FjdGl2YXRpb24pLAorCShkYnVzX21lc3NhZ2VfZ2V0X2F1dG9fYWN0aXZhdGlvbik6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5oOgorCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6IEltcGxlbWVudCBhdXRvLWFjdGl2YXRpb24uCisJCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogQWRkIGF1dG8tYWN0aXZhdGlvbiB0byB0aGUgc3BlYy4KKworMjAwNC0wMy0xMiAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmMgKF9kYnVzX21hcnNoYWxfZ2V0X2FyZ19lbmRfcG9zKToKKwlmaXggYSBidWcgd2l0aCBDVVNUT00gdHlwZXMuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKG1lc3NhZ2VfaXRlcl90ZXN0LCBfZGJ1c19tZXNzYWdlX3Rlc3QpOiBhZGQKKwlhIHVuaXQgdGVzdCBmb3IgdGhpcyBidWcgKHVzZWQgdG8gZmFpbCkuCisKKzIwMDQtMDMtMTIgIE1pa2FlbCBIYWxsZW5kYWwgIDxtaWNrZUBpbWVuZGlvLmNvbT4KKworCSogYnVzL2FjdGl2YXRpb24uYzoKKwkoYmFieXNpdHRlcl93YXRjaF9jYWxsYmFjayk6IG5vdGlmeSBhbGwgcGVuZGluZyBhY3RpdmF0aW9ucyB3YWl0aW5nIGZvcgorCSAgdGhlIHNhbWUgZXhlYyB0aGF0IHRoZSBhY3RpdmF0aW9uIGZhaWxlZC4KKwkoYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSk6IHNob3J0Y3V0IHRoZSBhY3RpdmF0aW9uIGlmIHdlIAorCSAgYWxyZWFkeSB3YWl0aW5nIGZvciB0aGUgc2FtZSBleGVjdXRhYmxlIHRvIHN0YXJ0IHVwLgorCisyMDA0LTAzLTEyICBNaWthZWwgSGFsbGVuZGFsICA8bWlja2VAaW1lbmRpby5jb20+CisKKwkqIGJ1cy9hY3RpdmF0aW9uLmM6IAorCS0gQWRkZWQgc2VydmljZSBmaWxlIHJlbG9hZGluZy4gCisJICBFYWNoIHNlcnZpY2UgZmlsZXMgZGlyZWN0b3J5IGlzIGtlcHQgaW4gYW4gaGFzaCB0YWJsZSBpbiAKKwkgIEJ1c0FjdGl2YXRpb24gYW5kIGVhY2ggQnVzQWN0aXZhdGlvbkVudHJ5IGtub3dzIHdoYXQgLnNlcnZpY2UtZmlsZSBpdAorCSAgd2FzIHJlYWQgZnJvbS4gU28gd2hlbiB5b3UgdHJ5IHRvIGFjdGl2YXRlIGEgc2VydmljZSB0aGUgYnVzIHdpbGwgCisJICBjaGVjayBpZiBpdCdzIGJlZW4gdXBkYXRlZCwgcmVtb3ZlZCBvciBpZiBuZXcgLnNlcnZpY2UtZmlsZXMgaGFzIAorCSAgYmVlbiBpbnN0YWxsZWQuCisJLSBUZXN0IGNvZGUgYXQgdGhlIGJvdHRvbSBmb3IgdGhlIHNlcnZpY2UgZmlsZSByZWxvYWRpbmcuCisJKiBidXMvdGVzdC1tYWluLmM6IChtYWluKToKKwkqIGJ1cy90ZXN0Lmg6CisJLSBhZGRlZCBzZXJ2aWNlIHJlbG9hZGluZyB0ZXN0LgorCSogZGJ1cy9kYnVzLXN5c2RlcHMuYzogCisJKiBkYnVzL2RidXMtc3lzZGVwcy5oOiAoX2RidXNfZGVsZXRlX2RpcmVjdG9yeSk6IEFkZGVkLgorCisyMDA0LTAzLTA4ICBNaWNoYWVsIE1lZWtzICA8bWljaGFlbEB4aW1pYW4uY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChfZGJ1c19jb25uZWN0aW9uX2Jsb2NrX2Zvcl9yZXBseSk6IAorCWJhaWwgaW1tZWRpYXRlbHkgaWYgZGlzY29ubmVjdGVkLCB0byBhdm9pZCBidXN5IGxvb3AuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdzX3ZhbGlzdCk6CisJY2xlYW51cCBjdXQvcGFzdGUvaW5lZmZpY2llbmN5LgorCisyMDA0LTAzLTAxICBEYXZpZCBaZXV0aGVuICA8ZGF2aWRAZnViYXIuZGs+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGZfdmFsaXN0KTogRml4IGEKKwlidWcgd2hlcmUgYXJncyB3ZXJlIHVzZWQgdHdpY2UuIFRoaXMgYnVnIHJlc3VsdGVkIGluIGEgc2VnZmF1bHQKKwlvbiBhIERlYmlhbi9QUEMgc3lzdGVtIHdoZW4gc3RhcnRpbmcgdGhlIG1lc3NhZ2VidXMgZGFlbW9uLiBJbmNsdWRlCisJZGJ1cy1zeXNkZXBzLmggZm9yIERCVVNfVkFfQ09QWQorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5oOiBEZWZpbmUgREJVU19WQV9DT1BZIGlmIG5lY2Nlc3NhcnkuIEZyb20gR0xpYgorCisJKiBjb25maWd1cmUuaW46IENoZWNrIGZvciB2YV9jb3B5OyBkZWZpbmUgREJVU19WQV9DT1BZIHRvIHRoZQorCWFwcHJvcHJpYXRlIHZhX2NvcHkgaW1wbGVtZW50YXRpb24uIEZyb20gR0xpYgorIAkKKzIwMDQtMDItMjQgIEpvZSBTaGF3ICA8am9lQHhpbWlhbi5jb20+CisKKwkqIGJ1cy9zZXJ2aWNlcy5jIChidXNfcmVnaXN0cnlfYWNxdWlyZV9zZXJ2aWNlKTogV2UgbmVlZCB0byBwYXNzCisJaW4gdGhlIHNlcnZpY2UgbmFtZSB0byBkYnVzX3NldF9lcnJvcigpIHRvIHByZXZlbnQgYSBjcmFzaC4KKworMjAwMy0xMi0yNiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAZ25vbWUub3JnPgorCisJKiBBVVRIT1JTOiBSZXZlYWwgbXkgVHJ1ZSBpZGVudGl0eS4KKworMjAwMy0xMi0xNyAgTWlrYWVsIEhhbGxlbmRhbCAgPG1pY2tlQGltZW5kaW8uY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzX3ZhbGlzdCk6IAorCS0gQWRkZWQgY2FzZSBmb3IgREJVU19UWVBFX0JZVEUsIHBhdGNoIGZyb20gSm9oYW4gSGVkYmVyZy4KKworMjAwMy0xMi0xMyAgTWlrYWVsIEhhbGxlbmRhbCAgPG1pY2tlQGltZW5kaW8uY29tPgorCisJKiBkb2MvVE9ETzogQWRkZWQgbm90IGFib3V0IGJldHRlciBlcnJvciBjaGVjayBvZiBjb25maWd1cmF0aW9uIGZpbGVzLgorCisyMDAzLTEyLTAyICBSaWNoYXJkIEh1bHQgIDxyaWNoYXJkQGltZW5kaW8uY29tPgorCisJKiBVcGRhdGUgQUZMIHZlcnNpb24gdG8gMi4wIHRocm91Z2hvdXQgdGhlIHNvdXJjZSBmaWxlcyB0byByZWZsZWN0CisJdGhlIHVwZGF0ZSB0aGF0IHdhcyBkb25lIGEgd2hpbGUgYWdvLgorCisyMDAzLTEyLTAyICBSaWNoYXJkIEh1bHQgIDxyaWNoYXJkQGltZW5kaW8uY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfZGljdCk6IFNldAorCXdyb3RlX2RpY3Rfa2V5IHRvIEZBTFNFIG9uIHRoZSBpdGVyIHRoYXQgdGhlIGRpY3QgaXMgYXBwZW5kZWQgdG8sCisJanVzdCBsaWtlIHdoZW4gYXBwZW5kaW5nIG90aGVyIHR5cGVzLiBGaXhlcyBhIGJ1ZyB3aGVyZSBhIGRpY3QKKwljb3VsZG4ndCBiZSBwdXQgaW5zaWRlIGEgZGljdC4KKwkoZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2RpY3Rfa2V5KTogRml4IHR5cG8gaW4gd2FybmluZyBtZXNzYWdlLgorCShtZXNzYWdlX2l0ZXJfdGVzdCwgX2RidXNfbWVzc2FnZV90ZXN0KTogQWRkIHRlc3QgY2FzZSBmb3IgZGljdAorCWluc2lkZSBkaWN0LgorCisyMDAzLTEyLTAxICBEYXZpZCBaZXV0aGVuICA8ZGF2aWRAZnViYXIuZGs+CisKKwkqIHB5dGhvbi9kYnVzLnB5OiBBZGQgdGhlIGFjdHVhbCBtZXNzYWdlIHdoZW4gY2FsbGluZyB0aGUgcmVjaWV2ZXIKKwlvZiBhIHNpZ25hbCBzdWNoIHRoYXQgcGFyYW1ldGVycyBjYW4gYmUgaW5zcGVjdGVkLiBBZGQgdGhlIG1ldGhvZAorCXJlbW92ZV9zaWduYWxfcmVjZWl2ZXIKKwkKKzIwMDMtMTEtMjYgIE1pa2FlbCBIYWxsZW5kYWwgIDxtaWNrZUBpbWVuZGlvLmNvbT4KKworCSogYnVzLyouW2NoXToKKwkqIGRidXMvKi5bY2hdOgorCSogZ2xpYi8qLltjaF06IE1hZGUgcmVmIGZ1bmN0aW9ucyByZXR1cm4gdGhlIHBvaW50ZXIKKworMjAwMy0xMS0yNSAgWmFjayBSdXNpbiAgPHphY2tAa2RlLm9yZz4KKworCSogcXQvaW50ZWdyYXRvci5oLCBxdC9pbnRlZ3JhdG9yLmNwcDogQWRkaW5nIGhhbmRsaW5nIG9mIERCdXNTZXJ2ZXIsCisKKwkqIHF0L3NlcnZlci5oLCBxdC9zZXJ2ZXIuY3BwLCBxdC9NYWtlZmlsZS5hbTogQWRkaW5nIERCdXNTZXJ2ZXIgCisJd3JhcHBlcnMsCisKKwkqIHF0L2Nvbm5lY3Rpb24uaCwgcXQvY29ubmVjdGlvbi5jcHA6IEFkanVzdGluZyB0byBjaGFuZ2VzIGluIAorCXRoZSBJbnRlZ3JhdG9yIGFuZCB0byBiZXR0ZXIgZml0IHdpdGggdGhlIHNlcnZlciwKKworMjAwMy0xMS0yNCAgWmFjayBSdXNpbiAgPHphY2tAa2RlLm9yZz4KKworCSogcXQvY29ubmVjdGlvbi5oLCBxdC9jb25uZWN0aW9uLmNwcDogcmVtb3ZpbmcgaW5pdERidXMgbWV0aG9kIHNpbmNlCisJdGhlIGludGVncmF0b3IgaGFuZGxlcyBpdCBub3cKKworCSogcXQvaW50ZWdyYXRvci5oLCBxdC9pbnRlZ3JhdG9yLmNwcDogcmV3b3JraW5nIGhhbmRsaW5nIG9mIHRpbWVvdXRzLAorCXNpbmNlIFFUaW1lciB3YXNuJ3QgcmVhbGx5IG1lYW50IHRvIGJlIHVzZWQgdGhlIHdheSBEQnVzVGltZW91dCBpcworCisyMDAzLTExLTI0ICBaYWNrIFJ1c2luICA8emFja0BrZGUub3JnPgorCisJKiBxdC9pbnRlZ3JhdG9yLmgsIHF0L2ludGVncmF0b3IuY3BwLCBNYWtlZmlsZS5hbTogQWRkaW5nIAorCUludGVncmF0b3IgY2xhc3Mgd2hpY2ggaW50ZWdyYXRlcyBELUJVUyB3aXRoIHRoZSBRdCBldmVudCBsb29wLAorCisJKiBxdC9jb25uZWN0aW9uLmgsIHF0L2Nvbm5lY3Rpb24uY3BwOiBNb3ZlIGFsbCB0aGUgY29kZSB3aGljaAorCXdhcyBkZWFsaW5nIHdpdGggRC1CVVMgaW50ZWdyYXRpb24gdG8gdGhlIEludGVncmF0b3IgY2xhc3MsCisJYW5kIHN0YXJ0IHVzaW5nIEludGVncmF0b3IsCisKKzIwMDMtMTEtMjMgIFphY2sgUnVzaW4gIDx6YWNrQGtkZS5vcmc+CisKKwkqIHF0L2Nvbm5lY3Rpb24uaCwgcXQvY29ubmVjdGlvbi5jcHA6IEFkZGluZyB0aGUgREJ1c0Nvbm5lY3Rpb24gCisJd3JhcHBlcgorCisJKiBxdC9tZXNzYWdlLmgsIHF0L21lc3NhZ2UuY3BwOiB1cGRhdGluZyB0byB0aGUgY3VycmVudCBELUJVUyBhcGksCisJc3dpdGNoaW5nIG5hbWVzcGFjZXMgdG8gREJ1c1F0LCByZXdvcmtpbmcgdGhlIGNsYXNzLAorCisJKiBNYWtlZmlsZS5jdnM6IHN3aXRjaGluZyBkZXBlbmRlbmNpZXMgc28gdGhhdCBpdCBtYXRjaGVzIEtERSAKKwlzY2hlbWF0aWNzLAorCQorCSogcXQvTWFrZWZpbGUuYW06IGFkZGluZyBjb25uZWN0aW9uLntoLGNwcH0gYW5kIG1lc3NhZ2Uue2gsY3BwfSB0byAKKwl0aGUgbGlicmFyeQorCisyMDAzLTExLTE5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogTkVXUzogdXBkYXRlCisKKyAgICAgICAgKiBjb25maWd1cmUuaW46IGJ1bXAgdmVyc2lvbiB0byAwLjIwCisKKwkqIGNvbmZpZ3VyZS5pbiAoaGF2ZV9xdCk6IGFkZCB5ZXQgYW5vdGhlciBwbGFjZSB0byBsb29rIGZvciBxdAorCShzb21lb25lIGhhbmQgdHJvbGx0ZWNoIGEgLnBjIGZpbGUuLi4pCisKKzIwMDMtMTEtMDEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogYWRkIHN0YXRlIG1hY2hpbmUgZG9jcyBvbiB0aGUgYXV0aAorCXByb3RvY29sOyBqdXN0IGEgZmlyc3QgZHJhZnQsIEknbSBzdXJlIGl0J3Mgd3JvbmcuCQorCisyMDAzLTEwLTI4ICBEYXZpZCBaZXV0aGVuICA8ZGF2aWRAZnViYXIuZGs+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbjogYWRkIGdldF9kaWN0IHRvIGhhbmRsZSBkaWN0aW9uYXJpZXMKKwlyZXR1cm4gdHlwZXMuIEZpeHVwIFRZUEVfKiB0byByZWZsZWN0IGNoYW5nZXMgaW4gZGJ1cy9kYnVzLXByb3RvY29sLmgKKwkKKzIwMDMtMTAtMjggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChnZXRfbmV4dF9maWVsZCk6IGRlbGV0ZSB1bnVzZWQgZnVuY3Rpb24KKworMjAwMy0xMC0yOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9leHBpcmVsaXN0LmMgKGRvX2V4cGlyYXRpb25fd2l0aF9jdXJyZW50X3RpbWUpOiBkZXRlY3QKKwlmYWlsdXJlIG9mIHRoZSBleHBpcmVfZnVuYyBkdWUgdG8gT09NCisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGJ1c19wZW5kaW5nX3JlcGx5X2V4cGlyZWQpOiByZXR1cm4gRkFMU0Ugb24gT09NCisKKwkqIGJ1cy9kaXNwYXRjaC5jIChjaGVja19zZW5kX2V4aXRfdG9fc2VydmljZSk6IGZpeCB0byBoYW5kbGUgdGhlCisJTm9SZXBseSBlcnJvciB0aGF0J3Mgbm93IGNyZWF0ZWQgYnkgdGhlIGJ1cyB3aGVuIHRoZSBzZXJ2aWNlIGV4aXRzCisKKzIwMDMtMTAtMjggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChfZGJ1c19tZXNzYWdlX3Rlc3QpOiBlbmFibGUgYW5kIGZpeCB0aGUKKwl0ZXN0cyBmb3Igc2V0X3BhdGgsIHNldF9pbnRlcmZhY2UsIHNldF9tZW1iZXIsIGV0Yy4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGVzKTogYWxsb3cgMCBieXRlcworCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChzZXRfc3RyaW5nX2ZpZWxkKTogYWx3YXlzIGp1c3QgZGVsZXRlIGFuZAorCXJlLWFwcGVuZCB0aGUgZmllbGQ7IGFjY2VwdCBOVUxMIGZvciBkZWxldGlvbgorCShyZV9hbGlnbl9maWVsZHNfcmVjdXJzZSk6IHJlaW1wbGVtZW50CisJCisyMDAzLTEwLTI2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzogZml4IGRvY3MgdG8gcHJvcGVybHkgZGVzY3JpYmUgdGhlCisJZGlzY29ubmVjdGVkIG1lc3NhZ2UKKwkoX2RidXNfY29ubmVjdGlvbl9ub3RpZnlfZGlzY29ubmVjdGVkKTogcmVtb3ZlIHRoaXMgZnVuY3Rpb247IAorCXdlIGNhbid0IHN5bmNocm9ub3VzbHkgYWRkIHRoZSBkaXNjb25uZWN0ZWQgbWVzc2FnZSwgd2UgaGF2ZSB0byAKKwlkbyBpdCBhZnRlciB3ZSd2ZSBxdWV1ZWQgYW55IHJlbWFpbmluZyByZWFsIG1lc3NhZ2VzCisJKF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCk6IHF1ZXVlIHRoZQorCWRpc2Nvbm5lY3QgbWVzc2FnZSBvbmx5IGlmIHRoZSB0cmFuc3BvcnQgaGFzIGZpbmlzaGVkIHF1ZXVlaW5nIGFsbAorCWl0cyByZWFsIG1lc3NhZ2VzIGFuZCBpcyBkaXNjb25uZWN0ZWQuCisJKGRidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0KTogdXBkYXRlIHRoZSBkaXNwYXRjaCBzdGF0dXMgaGVyZQorCisyMDAzLTEwLTIyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kpOiBmaXggdXAgYXNzZXJ0aW9uCisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyKTogc2V0IHRoZQorCWRlc3RpbmF0aW9uIHRvIHRoZSBjb25uZWN0aW9uJ3MgYmFzZSBzZXJ2aWNlCisKKzIwMDMtMTAtMjAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisgICAgICAgIGhtbSwgbWFrZSBjaGVjayBpcyBjdXJyZW50bHkgbm90IHBhc3NpbmcuCisJCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogYWRkIHJlcXVpcmVtZW50IHRoYXQgY3VzdG9tIHR5cGUKKwluYW1lcyBmb2xsb3cgdGhlIHNhbWUgcnVsZXMgYXMgaW50ZXJmYWNlIG5hbWVzLgorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaDogY2hhbmdlIHNvbWUgb2YgdGhlIGJ5dGUgY29kZXMsIHRvIGF2b2lkCisJZHVwbGljYXRpb24gYW5kIGFsbG93ICdjJyB0byBiZSAnY3VzdG9tJzsgZGljdCBpcyBub3cgJ20nIGZvcgorCSdtYXAnCisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiB1cGRhdGUgdHlwZSBjb2RlcyB0byBtYXRjaAorCWRidXMtcHJvdG9jb2wuaCwgdXNpbmcgdGhlIEFTQ0lJIGJ5dGUgdmFsdWVzLiBSZW5hbWUgdHlwZSBOQU1FRCB0bworCUNVU1RPTS4gQWRkIHR5cGUgT0JKRUNUX1BBVEggdG8gdGhlIHNwZWMuCisKKzIwMDMtMTAtMTcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvZHJpdmVyLmMgKGNyZWF0ZV91bmlxdWVfY2xpZW50X25hbWUpOiB1c2UgIi4iIGFzIHNlcGFyYXRvcgorCWluIGJhc2Ugc2VydmljZSBuYW1lcyBpbnN0ZWFkIG9mICctJworCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSk6IGFsbG93IGdldHRpbmcgbnVsCisJYnl0ZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcKKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oIChfREJVU19MSUtFTFksIF9EQlVTX1VOTElLRUxZKTogYWRkCisJb3B0aW1pemF0aW9uIG1hY3JvcyBzaW5jZSBzdHJpbmcgdmFsaWRhdGlvbiBzZWVtcyB0byBiZSBhIHNsb3cKKwlwb2ludC4KKwkKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiByZXN0cmljdCB2YWxpZAorCXNlcnZpY2UvaW50ZXJmYWNlL21lbWJlci9lcnJvciBuYW1lcy4gQWRkIHRlc3Qgc3VpdGUgY29kZSBmb3IgdGhlCisJbmFtZSB2YWxpZGF0aW9uLgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmM6IGxpbWl0IHNlcnZpY2UvaW50ZXJmYWNlL21lbWJlci9lcnJvciBuYW1lcyAKKwl0byBbMC05XVtBLVpdW2Etel1fCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCk6IGFkZCBtaXNzaW5nCisJZm9ybWF0IGFyZyB0byB2ZXJib3NlIHNwZXcKKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dwcm94eV9jYWxsX25vX3JlcGx5KTogaWYgbm90IG91dCBvZgorCW1lbW9yeSwgcmV0dXJuIGluc3RlYWQgb2YgZ19lcnJvcgorCisJKiB0ZXN0L3Rlc3Qtc2VydmljZS5jIChwYXRoX21lc3NhZ2VfZnVuYyk6IHN1cHBvcnQgZW1pdHRpbmcgYQorCXNpZ25hbCBvbiByZXF1ZXN0CisKKwkqIGRidXMvZGJ1cy1idXMuYyAoaW5pdF9jb25uZWN0aW9uc191bmxvY2tlZCk6IG9ubHkgZmlsbCBpbgorCWFjdGl2YXRpb24gYnVzIHR5cGUgaWYgREJVU19CVVNfQUNUSVZBVElPTiB3YXMgc2V0OyBkZWZhdWx0IHRvCisJYXNzdW1pbmcgdGhlIGFjdGl2YXRpb24gYnVzIHdhcyB0aGUgc2Vzc2lvbiBidXMgc28gdGhhdCBzZXJ2aWNlcworCXN0YXJ0ZWQgbWFudWFsbHkgd2lsbCBzdGlsbCByZWdpc3Rlci4KKwkoaW5pdF9jb25uZWN0aW9uc191bmxvY2tlZCk6IGZpeCBzbyB0aGF0IGluIE9PTSBzaXR1YXRpb24gd2UgZ2V0CisJdGhlIHNhbWUgc2VtYW50aWNzIHdoZW4gcmV0cnlpbmcgdGhlIGZ1bmN0aW9uCisJCisJKiB0ZXN0L3Rlc3Qtc2VydmljZS5jIChtYWluKTogY2hhbmdlIHRvIHVzZSBwYXRoIHJlZ2lzdHJhdGlvbiwgdG8KKwl0ZXN0IHRob3NlIGNvZGVwYXRoczsgcmVnaXN0ZXIgd2l0aCBEQlVTX0JVU19BQ1RJVkFUSU9OIHJhdGhlcgorCXRoYW4gREJVU19CVVNfU0VTU0lPTgorCisyMDAzLTEwLTE2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWd0ZXN0LW1haW4uYzogYnJhY2tldCB3aXRoICNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisKKwkqIE1ha2VmaWxlLmFtIChHQ09WX0RJUlMpOiByZW1vdmUgInRlc3QiLCB3ZSBkb24ndCBjYXJlIGFib3V0IHRlc3QKKwljb3ZlcmFnZSBvZiB0aGUgdGVzdHMKKwkoY292ZXJhZ2UtcmVwb3J0LnR4dCk6IGRvbid0IG1vdmUgdGhlIC5kYSBhbmQgLmJiZyBmaWxlcyBhcm91bmQKKworMjAwMy0xMC0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9idXMuYyAoc3RydWN0IEJ1c0NvbnRleHQpOiByZW1vdmUgc3RydWN0IGZpZWxkIEkgZGlkbid0IG1lYW4KKwl0byBwdXQgdGhlcmUKKworMjAwMy0xMC0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGJ1c19wZW5kaW5nX3JlcGx5X2V4cGlyZWQpOiBlaXRoZXIgY2FuY2VsIG9yCisJZXhlY3V0ZSwgbm90IGJvdGgKKwkoYnVzX2Nvbm5lY3Rpb25zX2NoZWNrX3JlcGx5KTogdXNlIHVubGluaywgbm90IHJlbW92ZV9saW5rLCBhcyB3ZQorCWRvbid0IHdhbnQgdG8gZnJlZSB0aGUgbGluazsgZml4ZXMgZG91YmxlIGZyZWUgbWVzcworCisJKiBkYnVzL2RidXMtcGVuZGluZy1jYWxsLmMgKGRidXNfcGVuZGluZ19jYWxsX2Jsb2NrKTogZml4IGluIGNhc2UKKwl3aGVyZSBubyByZXBseSB3YXMgcmVjZWl2ZWQKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoX2RidXNfcGVuZGluZ19jYWxsX2NvbXBsZXRlX2FuZF91bmxvY2spOgorCWZpeCBhIHJlZmNvdW50IGxlYWsKKworCSogYnVzL3NpZ25hbHMuYyAobWF0Y2hfcnVsZV9tYXRjaGVzKTogYWRkIHNwZWNpYWwgY2FzZXMgZm9yIHRoZQorCWJ1cyBkcml2ZXIsIHNvIHlvdSBjYW4gbWF0Y2ggb24gc2VuZGVyL2Rlc3RpbmF0aW9uIGZvciBpdC4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfYWJvcnQpOiBwcmludCBiYWNrdHJhY2UgaWYKKwlEQlVTX1BSSU5UX0JBQ0tUUkFDRSBpcyBzZXQKKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jOiBhZGQgcGlkIHRvIGFzc2VydGlvbiBmYWlsdXJlIG1lc3NhZ2VzCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IGFkZCBtZXNzYWdlIHR5cGUgY29kZSB0byB0aGUgZGVidWcgc3BldworCisJKiBnbGliL2RidXMtZ3Byb3h5LmMgKGdwcm94eV9nZXRfbWF0Y2hfcnVsZSk6IG1hdGNoIHJ1bGVzIHdhbnQKKwlzZW5kZXI9Zm9vIG5vdCBzZXJ2aWNlPWZvbworCisJKiBkYnVzL2RidXMtYnVzLmMgKGRidXNfYnVzX2dldCk6IGlmIHRoZSBhY3RpdmF0aW9uIGJ1cyBpcyB0aGUKKwlzZXNzaW9uIGJ1cyBidXQgREJVU19TRVNTSU9OX0JVU19BRERSRVNTIGlzbid0IHNldCwgdXNlIAorCURCVVNfQUNUSVZBVElPTl9BRERSRVNTIGluc3RlYWQKKworCSogYnVzL2FjdGl2YXRpb24uYzogc2V0IERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUywKKwlEQlVTX1NZU1RFTV9CVVNfQUREUkVTUyBpZiBhcHByb3ByaWF0ZQorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X25ldyk6IGhhbmRsZSBPT00gY29weWluZyBidXMgdHlwZSBpbnRvCisJY29udGV4dCBzdHJ1Y3QKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X29iamVjdF9wYXRoKTogbmV3IGZ1bmN0aW9uCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9vYmplY3RfcGF0aF9hcnJheSk6IG5ldyBmdW5jdGlvbiAoaGFsZgorCWZpbmlzaGVkLCBkaXNhYmxlZCBmb3IgdGhlIG1vbWVudCkKKwkKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19ncHJveHlfZW5kX2NhbGwpOiBwcm9wZXJseSBoYW5kbGUKKwlEQlVTX01FU1NBR0VfVFlQRV9FUlJPUgorCisJKiB0b29scy9kYnVzLWxhdW5jaC5jIChiYWJ5c2l0KTogc3VwcG9ydCBEQlVTX0RFQlVHX09VVFBVVCB0bworCWF2b2lkIHJlZGlyZWN0aW5nIHN0ZGVyciB0byAvZGV2L251bGwKKwkoYmFieXNpdCk6IGNsb3NlIHN0ZGluIGlmIG5vdCBkb2luZyB0aGUgImV4aXRfd2l0aF9zZXNzaW9uIiB0aGluZworCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19iZWNvbWVfZGFlbW9uKTogZGVsZXRlIHNvbWUgbGVmdG92ZXIKKwlkZWJ1ZyBjb2RlOyBjaGFuZ2UgREJVU19ERUJVR19PVVRQVVQgdG8gb25seSBlbmFibGUgc3RkZXJyLCBub3QKKwlzdGRvdXQvc3RkaW4sIHNvIHRoaW5ncyBkb24ndCBnZXQgY29uZnVzZWQKKwkKKwkqIGJ1cy9zeXN0ZW0uY29uZi5pbjogZml4IHRvIGFsbG93IHJlcGxpZXMsIEkgbW9kaWZpZWQgLmNvbmYKKwlpbnN0ZWFkIG9mIC5jb25mLmluIGFnYWluLgorCisyMDAzLTEwLTE0ICBEYXZpZCBaZXV0aGVuICA8ZGF2aWRAZnViYXIuZGs+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbiAoTWVzc2FnZUl0ZXIuZ2V0KTogZml4ZWQgdHlwbyBpbgorCWFyZ3R5cGUgdG8gYXJnX3R5cGUgd2hlbiByYWlzaW5nIHVua25vd24gYXJnIHR5cGUgZXhjZXB0aW9uLgorCUNoYW5nZWQgdHlwZSBsaXN0IHRvIHJlZmxlY3QgdGhlIGNoYW5nZXMgaW4gZGJ1cy1wcm90b2NvbC5oIHNvIAorCXRoZSBiaW5kaW5ncyBhY3R1YWxseSB3b3JrLgorCisyMDAzLTEwLTE0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdGVzdC9kZWNvZGUtZ2Nvdi5jOiBzdXBwb3J0IGdjYyAzLjMgYWxzbywgdGhvdWdoIGdjYyAzLjMgc2VlbXMKKwl0byBoYXZlIGEgYnVnIGtlZXBpbmcgaXQgZnJvbSBvdXRwdXR0aW5nIHRoZSAuZGEgZmlsZXMgc29tZXRpbWVzCisJKHN0cmluZ19nZXRfc3RyaW5nKTogZG9uJ3QgYXBwZW5kIGdhcmJhZ2UgbnVsIGJ5dGVzIHRvIHRoZSBzdHJpbmcuCisKKzIwMDMtMTAtMTUgIFNldGggTmlja2VsbCAgPHNldGhAZ25vbWUub3JnPgorCisJKiBweXRob24vTWFrZWZpbGUuYW06CisKKwlJbmNsdWRlIGRidXNfaF93cmFwcGVyLmggaW4gdGhlIGRpc3QgdGFyYmFsbC4KKworMjAwMy0xMC0xNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfY2hlY2tfc2VjdXJpdHlfcG9saWN5KTogcmV2YW1wIHRoaXMgdG8KKwl3b3JrIG1vcmUgc2FuZWx5IHdpdGggbmV3IHBvbGljeS1iYXNlZCByZXF1ZXN0ZWQgcmVwbHkgc2V0dXAKKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIpOiBzZXQgYnVzCisJZHJpdmVyIG1lc3NhZ2VzIGFzIG5vIHJlcGx5CisKKwkqIGJ1cy9wb2xpY3kuYyAoYnVzX2NsaWVudF9wb2xpY3lfY2hlY2tfY2FuX3JlY2VpdmUpOiBoYW5kbGUgYQorCXJlcXVlc3RlZF9yZXBseSBhdHRyaWJ1dGUgb24gYWxsb3cvZGVueSBydWxlcworCisJKiBidXMvc3lzdGVtLmNvbmY6IGFkZCA8YWxsb3cgcmVxdWVzdGVkX3JlcGx5PSJ0cnVlIi8+CisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfbWVzc2FnZSk6IGZpeCBjaGVjayBmb3IgcmVwbGllcworCXNlbnQgdG8gdGhlIGJ1cyBkcml2ZXIsIHdoaWNoIHdhcyBiYWNrd2FyZC4gSG93IGRpZCB0aGlzIGV2ZXIgd29yaworCWF0IGFsbCB0aG91Z2g/IEkgdGhpbmsgSSdtIG1pc3Npbmcgc29tZXRoaW5nLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkZWNvZGVfaGVhZGVyX2RhdGEpOiByZXF1aXJlIGVycm9yIGFuZAorCW1ldGhvZCByZXR1cm4gbWVzc2FnZXMgdG8gaGF2ZSBhIHJlcGx5IHNlcmlhbCBmaWVsZCB0byBiZSB2YWxpZAorCShfZGJ1c19tZXNzYWdlX2xvYWRlcl9xdWV1ZV9tZXNzYWdlcyk6IGJyZWFrIHVwIHRoaXMgZnVuY3Rpb247CisJdmFsaWRhdGUgdGhhdCByZXBseSBzZXJpYWwgYW5kIHBsYWluIHNlcmlhbCBhcmUgbm9uemVybzsgCisJY2xlYW4gdXAgdGhlIE9PTS9lcnJvciBoYW5kbGluZy4KKwkoZ2V0X3VpbnRfZmllbGQpOiBkb24ndCByZXR1cm4gLTEgZnJvbSB0aGlzCisJKGRidXNfbWVzc2FnZV9jcmVhdGVfaGVhZGVyKTogZml4IHNpZ25lZC91bnNpZ25lZCBidWcKKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25zX2V4cGVjdF9yZXBseSk6IHNhdmUgc2VyaWFsIG9mCisJdGhlIGluY29taW5nIG1lc3NhZ2UsIG5vdCByZXBseSBzZXJpYWwKKworMjAwMy0xMC0xNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9jb25uZWN0aW9uLmM6IGltcGxlbWVudCBwZW5kaW5nIHJlcGx5IHRyYWNraW5nIHVzaW5nCisJQnVzRXhwaXJlTGlzdAorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X2NoZWNrX3NlY3VyaXR5X3BvbGljeSk6IHZlcmlmeSB0aGF0IGEKKwlyZXBseSBpcyBwZW5kaW5nIGluIG9yZGVyIHRvIGFsbG93IGEgcmVwbHkgdG8gYmUgc2VudC4gRGVueSAKKwltZXNzYWdlcyBvZiB1bmtub3duIHR5cGUuCisKKwkqIGJ1cy9kYnVzLWRhZW1vbi0xLjEuaW46IHVwZGF0ZSB0byBtZW50aW9uIG5ldyByZXNvdXJjZSBsaW1pdHMKKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9nZXRfbWF4X3JlcGxpZXNfcGVyX2Nvbm5lY3Rpb24pOiBuZXcKKwkoYnVzX2NvbnRleHRfZ2V0X3JlcGx5X3RpbWVvdXQpOiBuZXcKKworMjAwMy0xMC0xMyAgU2V0aCBOaWNrZWxsICA8c2V0aEBnbm9tZS5vcmc+CisKKwkqIHB5dGhvbi9NYWtlZmlsZS5hbToKKworCVBhc3MgIm1ha2UgZGlzdGNoZWNrIjogcmVtb3ZlIGEgY291cGxlIGZpbGVzIGZyb20gRElTVF9GSUxFUworCXRoYXQgd2VyZW4ndCBpbmNsdWRlZCBpbiB0aGUgZmluYWwgdmVyc2lvbi4KKworMjAwMy0xMC0xMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworICAgICAgICBBZGRlZCB0ZXN0IGNvZGUgdGhhdCAxKSBzdGFydHMgYW4gYWN0dWFsIGJ1cyBkYWVtb24gYW5kIDIpIHVzZXMKKwlEQnVzR1Byb3h5OyBmaXhlZCBidWdzIHRoYXQgd2VyZSByZXZlYWxlZCBieSB0aGUgdGVzdC4gTG90cyAKKwltb3JlIHRlc3RpbmcgcG9zc2libGUsIGJ1dCB0aGlzIGlzIHRoZSBiYXNpYyBmcmFtZXdvcmsuCisJCisJKiBnbGliL2RidXMtZ3Byb3h5LmMgKGRidXNfZ3Byb3h5X21hbmFnZXJfdW5yZWdpc3Rlcik6IHJlbW92ZQorCWVtcHR5IHByb3h5IGxpc3RzIGZyb20gdGhlIHByb3h5IGxpc3QgaGFzaAorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnc192YWxpc3QpOiBhZGQgYQorCWNvdXBsZSBvZiByZXR1cm5faWZfZmFpbCBjaGVja3MKKworCSogZGJ1cy9kYnVzLXBlbmRpbmctY2FsbC5jIChfZGJ1c19wZW5kaW5nX2NhbGxfbmV3KTogdXNlIGRidXNfbmV3MAorCXRvIGFsbG9jYXRlLCBzbyBldmVyeXRoaW5nIGlzIGNsZWFyZWQgdG8gTlVMTCBhcyBpdCBzaG91bGQgYmUuCisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jIChkYnVzX2Nvbm5lY3Rpb25fc2V0dXBfd2l0aF9nX21haW4pOiBwYXNzCisJc291cmNlIGFzIGRhdGEgdG8gZGJ1c19jb25uZWN0aW9uX3NldF90aW1lb3V0X2Z1bmN0aW9ucygpIGFzIHRoZSAKKwl0aW1lb3V0IGZ1bmN0aW9ucyBleHBlY3RlZAorCisJKiB0ZXN0L2dsaWIvcnVuLXRlc3Quc2g6IGFkZCBhIGxpdHRsZSBzY3JpcHQgdG8gc3RhcnQgdXAgYSBtZXNzYWdlCisJYnVzIGFuZCBydW4gdGVzdHMgdXNpbmcgaXQKKworCSogdG9vbHMvZGJ1cy1sYXVuY2guMTogdXBkYXRlcworCisJKiB0b29scy9kYnVzLWxhdW5jaC5jIChtYWluKTogYWRkIC0tY29uZmlnLWZpbGUgb3B0aW9uCisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLmMgKG1haW4pOiByZW1vdmUgY29uZnVzaW5nIGVsc2UgaWYgKHJ1bnByb2cpCisJdGhhdCBjb3VsZCBuZXZlciBiZSByZWFjaGVkLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4pIAorCShkYnVzX21lc3NhZ2VfbmV3X2Vycm9yLCBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCk6IHNldCB0aGUKKwluby1yZXBseS1leHBlY3RlZCBmbGFnIG9uIGFsbCB0aGVzZS4gUmVkdW5kYW50LCBidXQgbWF5CisJYXMgd2VsbCBiZSBjb25zaXN0ZW50LgorCisyMDAzLTEwLTExICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiB0ZXN0L2RlY29kZS1nY292LmMgKGZ1bmN0aW9uX3NvbHZlX2dyYXBoKTogbWFrZSBicm9rZW4gYmxvY2sKKwlncmFwaCBhIG5vbmZhdGFsIGVycm9yIHNpbmNlIGl0IHNlZW1zIHRvIGJlIGJyb2tlbi4gTmVlZCB0byBkZWJ1ZworCXRoaXMuCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmMgKF9kYnVzX3R5cGVfaXNfdmFsaWQpOiBuZXcgZnVuY3Rpb24gc2luY2Ugd2UKKwljYW4ndCBqdXN0IGNoZWNrIHR5cGUgPiBJTlZBTElEIDwgTEFTVCBhbnltb3JlCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlKTogbmV3IGZ1bmN0aW9uCisJKGRidXNfbWVzc2FnZV9oYXNfc2lnbmF0dXJlKTogbmV3IGZ1bmN0aW9uCisJKHN0cnVjdCBEQnVzTWVzc2FnZSk6IGFkZCBzaWduYXR1cmUgZmllbGQgKHJpZ2h0IG5vdyBpdCBpc24ndCBzZW50CisJb3ZlciB0aGUgd2lyZSwganVzdCBnZW5lcmF0ZWQgb24gdGhlIGZseSkKKwkoZGJ1c19tZXNzYWdlX2NvcHkpOiBjb3B5IHRoZSBzaWduYXR1cmUsIGFuZCBpbml0IHN0cmluZ3MgdG8KKwlwcm9wZXIgbGVuZ3RoIHRvIGF2b2lkIHNvbWUgcmVhbGxvY3MKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcnJheV9pdGVyYXRvcik6IHJldHVybiB2b2lkLCBzaW5jZSBpdAorCWNhbid0IGZhaWwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9kaWN0X2l0ZXJhdG9yKTogcmV0dXJuIHZvaWQgc2luY2UgaXQgY2FuJ3QgZmFpbAorCShfZGJ1c19tZXNzYWdlX2xvYWRlcl9xdWV1ZV9tZXNzYWdlcyk6IGFkZCBzaWxseSB0ZW1wb3JhcnkgaGFjayB0bworCWZpbGwgaW4gbWVzc2FnZS0+c2lnbmF0dXJlIG9uIGxvYWQKKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6IGNoYW5nZSBEQlVTX1RZUEVfKiB2YWx1ZXMgdG8gYmUgQVNDSUkKKwljaGFyYWN0ZXJzLCBzbyB0aGV5IGFyZSByZWxhdGl2ZWx5IGh1bWFuLXJlYWRhYmxlLgorCisyMDAzLTEwLTExICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChfZGJ1c19tZXNzYWdlX3Rlc3QpOiBhZGQgbW9yZSB0ZXN0CisJY292ZXJhZ2UsIGJ1dCAjaWYgMCBmb3Igbm93IHNpbmNlIHRoZXkgdW5jb3ZlciBhIGJ1ZyAKKwlub3QgZml4ZWQgeWV0OyBJIHRoaW5rIGluIHJlX2FsaWduX2ZpZWxkX3JlY3Vyc2UoKQorCShyZV9hbGlnbl9maWVsZF9yZWN1cnNlKTogYWRkIEZJWE1FIGFib3V0IGJyb2tlbiBhc3NlcnRpb24KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfc3lzZGVwc190ZXN0KTogYWRkIG1vcmUgdGVzdCBjb3ZlcmFnZQorCisJKiBidXMvY29ubmVjdGlvbi5jOiBzaGFyZSBhIGNvdXBsZSBjb2RlIGJpdHMgd2l0aCBleHBpcmVsaXN0LmMKKworCSogYnVzL2V4cGlyZWxpc3QuaCwgYnVzL2V4cGlyZWxpc3QuYzogaW1wbGVtZW50IGEgZ2VuZXJpYworCWV4cGlyZS1pdGVtcy1hZnRlci1OLXNlY29uZHMgZmFjaWxpdHksIHdhcyBnb2luZyB0byBzaGFyZSBiZXR3ZWVuCisJZXhwaXJpbmcgY29ubmVjdGlvbnMgYW5kIHJlcGxpZXMsIGRlY2lkZWQgbm90IHRvIHVzZSBmb3IgZXhwaXJpbmcKKwljb25uZWN0aW9ucyBmb3Igbm93LgorCisJKiBDT1BZSU5HOiBpbmNsdWRlIEFGTCAyLjAgKHN0aWxsIG5lZWQgdG8gY2hhbmdlIGFsbCB0aGUgZmlsZSBoZWFkZXJzKQorCisyMDAzLTEwLTA5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBkZWZpbmUgREJVU19IQVZFX0dDQzMzX0dDT1YgaWYgd2UgaGF2ZQorCWdjYyAzLjMuIE5vdCB0aGF0IHdlIGRvIGFueXRoaW5nIGFib3V0IGl0IHlldC4KKworCSogYnVzL3NpZ25hbHMuYyAoYnVzX21hdGNoX3J1bGVfcGFyc2UpOiBpbXBvc2UgbWF4IGxlbmd0aCBvbiB0aGUKKwltYXRjaCBydWxlIHRleHQKKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6IGFkZCBEQlVTX01BWElNVU1fTUFUQ0hfUlVMRV9MRU5HVEgKKworMjAwMy0xMC0wOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKyAgICAgICAgTWFrZSBtYXRjaGluZyBydWxlcyB0aGVvcmV0aWNhbGx5IHdvcmsgKGFkZCBwYXJzZXIpLgorCQorCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kpOiBmaXggdXAgdG8gaGFuZGxlCisJdGhlIGNhc2Ugd2hlcmUgZGVzdGluYXRpb24gaXMgZXhwbGljaXRseSBzcGVjaWZpZWQgYXMgYnVzIGRyaXZlcgorCWFuZCBzb21lb25lIGVsc2UgaXMgZWF2ZXNkcm9wcGluZy4KKwkKKwkqIGJ1cy9wb2xpY3kuYyAoYnVzX2NsaWVudF9wb2xpY3lfY2hlY2tfY2FuX3JlY2VpdmUpOiBmaXggdXAKKwlkZWZpbml0aW9uIG9mIGVhdmVzZHJvcHBpbmcgYW5kIGFzc2VydGlvbgorCisJKiB0b29scy9kYnVzLXNlbmQuYyAobWFpbik6IHVzZSBkYnVzX21lc3NhZ2VfdHlwZV9mcm9tX3N0cmluZworCisJKiBidXMvc2lnbmFscy5jIChidXNfbWF0Y2hfcnVsZV9wYXJzZSk6IGltcGxlbWVudAorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfdHlwZV9mcm9tX3N0cmluZyk6IG5ldworCisJKiBkYnVzL2RidXMtZXJyb3JzLmggKERCVVNfRVJST1JfTUFUQ0hfUlVMRV9JTlZBTElEKTogYWRkCisKKzIwMDMtMTAtMDIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19ncHJveHlfY2FsbF9ub19yZXBseSk6IHJlbmFtZSBmcm9tCisJZGJ1c19ncHJveHlfb25ld2F5X2NhbGwKKworCSogZ2xpYi9kYnVzLWdtYWluLmMgKGRidXNfY29ubmVjdGlvbl9zZXR1cF93aXRoX2dfbWFpbikgCisJKGRidXNfc2VydmVyX3NldHVwX3dpdGhfZ19tYWluKTogZml4IHRvIGFsbG93IGNhbGxpbmcgdGhlbSBtb3JlCisJdGhhbiBvbmNlIG9uIHRoZSBzYW1lIGFyZ3MKKwkoZGJ1c19idXNfZ2V0X3dpdGhfZ19tYWluKTogbmV3IGZ1bmN0aW9uCisKKzIwMDMtMTAtMDIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvZGJ1cy10dXRvcmlhbC54bWw6IHdyaXRlIHNvbWUgc3R1ZmYKKworMjAwMy0wOS0yOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogY29uZmlndXJlLmluOiBzcGxpdCBjaGVja3MgZm9yIERveHlnZW4gZnJvbSBYTUwgZG9jcywgY2hlY2sgZm9yCisJeG1sdG8KKworCSogZG9jL01ha2VmaWxlLmFtOiBYTUwtaWZ5IGFsbCB0aGUgZG9jcywgYW5kIGFkZCBhIGJsYW5rCisJZGJ1cy10dXRvcmlhbC54bWwKKworMjAwMy0wOS0yOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogTWVyZ2UgZGJ1cy1vYmplY3QtbmFtZXMgYnJhbmNoLiBUbyBzZWUgdGhlIGVudGlyZSBwYXRjaCAKKwlkbyBjdnMgZGlmZiAtciBEQlVTX09CSkVDVF9OQU1FU19CUkFOQ0hQT0lOVCAtciBkYnVzLW9iamVjdC1uYW1lcywKKwlpdCdzIGh1dXV1Z2UgdGhvdWdoLgorCVRvIHJldmVydCwgSSB0YWdnZWQgREJVU19CRUZPUkVfT0JKRUNUX05BTUVTX01FUkdFLgorCQorMjAwMy0wOS0yOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogSEFDS0lORzogdXBkYXRlIHRvIHJlZmxlY3QgbmV3IHNlcnZlcgorCisyMDAzLTA5LTI2ICBTZXRoIE5pY2tlbGwgIDxzZXRoQGdub21lLm9yZz4KKworCSogcHl0aG9uL2RidXMucHk6CisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1zaWduYWxzLnB5OgorCisJU3RhcnQgaW1wbGVtZW50aW5nIHNvbWUgbm90aW9ucyBvZiBzaWduYWxzLiBUaGUgQVBJCisJaXMgcmVhbGx5IHRlcnJpYmxlLCBidXQgdGhleSBzb3J0IG9mIHdvcmsgKHdpdGggdGhlCisJZXhjZXB0aW9uIG9mIGJlaW5nIGFibGUgdG8gZmlsdGVyIGJ5IHNlcnZpY2UsIGFuZCB0bworCXRyYW5zbWl0IHNpZ25hbHMgKmFzKiBhIHBhcnRpY3VsYXIgc2VydmljZSkuIE5lZWQgdG8KKwlmaWd1cmUgb3V0IGhvdyB0byBtYWtlIG1lc3NhZ2VzIGNvbWUgZnJvbSB0aGUgc2VydmljZQorCXdlIHJlZ2lzdGVyZWQgOi0oCisJCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXguaW46CisKKwlSZW1vdmVkIGR1cGxpY2F0ZSBtZXNzYWdlX2hhbmRsZXIgY2FsbGJhY2tzLgorCQorMjAwMy0wOS0yNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9zZXNzaW9uLmNvbmYuaW46IGZpeCBteSBtZXNzCisKKzIwMDMtMDktMjUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9zZXNzaW9uLmNvbmYuaW46IGZpeCBzZWN1cml0eSBwb2xpY3ksIHJlcG9ydGVkIGJ5IFNldGggTmlja2VsbAorCisyMDAzLTA5LTI1ICBTZXRoIE5pY2tlbGwgIDxzZXRoQGdub21lLm9yZz4KKworCSogcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUtc2VydmljZS5weToKKworCUpvaGFuIG5vdGljZXMgY29tcGxldGUgd3JvbmcgY29kZSBpbiBleGFtcGxlLXNlcnZpY2UsIGJ1dAorCWNvbXBsZXRlbHkgd3JvbmcgaW4gYSB3YXkgdGhhdCB3b3JrcyBleGFjdGx5IHRoZSBzYW1lICghKS4KKwlKb2hhbiBpcyBjb25mdXNlZCwgaG93IGNvdWxkIHRoaXMgcG9zc2libHkgd29yaz8gRXhhbXBsZQorCWNvZGUgZmFpbHMgdG8gc2VydmUgcHVycG9zZSBvZiBtYWtpbmcgdGhpbmdzIGNsZWFyLgorCVNldGggZml4ZXMuCisKKzIwMDMtMDktMjUgIE1hcmsgTWNMb3VnaGxpbiAgPG1hcmtAc2t5bmV0LmllPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6IGRvbid0IHJlcXVpcmUgaGVhZGVyIGZpZWxkcworCXRvIGJlIDQtYnl0ZSBhbGlnbmVkIGFuZCBzcGVjaWZ5IHRoYXQgZmllbGRzIHNob3VsZCBiZQorCWRpc3Rpbmd1aXNoZWQgZnJvbSBwYWRkaW5nIGJ5IHRoZSBmYWN0IHRoYXQgemVybyBpcyBub3QKKwlhIHZhbGlkIGZpZWxkIG5hbWUuCisJCisJKiBkb2MvVE9ETzogcmVtb3ZlIHJlLWFsaWdubWVudCBpdGVtIGFuZCBhZGQgaXRlbSB0byBkb2MKKwl0aGUgT0JKRUNUX1BBVEggdHlwZS4KKwkKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6CisJKEhlYWRlckZpZWxkKTogcmVuYW1lIHRoZSBvcmlnaW5hbCBtZW1iZXIgdG8gdmFsdWVfb2Zmc2V0CisJYW5kIGludHJvZHVjZSBhIG5hbWVfb2Zmc2V0IG1lbWJlciB0byBrZWVwIHRyYWNrIG9mIHdoZXJlCisJdGhlIGZpZWxkIGFjdHVhbGx5IGJlZ2lucy4KKwkoYWRqdXN0X2ZpZWxkX29mZnNldHMpOiByZW1vdmUuCisJKGFwcGVuZF9pbnRfZmllbGQpLCAoYXBwZW5kX3VpbnRfZmllbGQpLAorCShhcHBlbmRfc3RyaW5nX2ZpZWxkKTogZG9uJ3QgYWxpZ24gdGhlIHN0YXJ0IG9mIHRoZSBoZWFkZXIKKwlmaWVsZCB0byBhIDQtYnl0ZSBib3VuZGFyeS4KKwkoZ2V0X25leHRfZmllbGQpOiBpbXBsIGZpbmRpbmcgdGhlIG5leHQgbWFyaHNhbGxlZCBmaWVsZAorCWFmdGVyIGEgZ2l2ZW4gZmllbGQuCisJKHJlX2FsaWduX2ZpZWxkX3JlY3Vyc2UpOiBpbXBsIHJlLWFsaWduaW5nIGEgbnVtYmVyIG9mCisJYWxyZWFkeSBtYXJzaGFsbGVkIGZpZWxkcy4KKwkoZGVsZXRlX2ZpZWxkKTogaW1wbCBkZWxldGluZyBhIGZpZWxkIG9mIGFueSB0eXBlIGFuZAorCXJlLWFsaWduaW5nIGFueSBmb2xsb3dpbmcgZmllbGRzLgorCShkZWxldGVfaW50X29yX3VpbnRfZmllbGQpLCAoZGVsZXRlX3N0cmluZ19maWVsZCk6IHJlbW92ZS4KKwkoc2V0X2ludF9maWVsZCksIChzZXRfdWludF9maWVsZCk6IG5vIG5lZWQgdG8gcmUtY2hlY2sKKwl0aGF0IHdlIGhhdmUgdGhlIGNvcnJlY3QgdHlwZSBmb3IgdGhlIGZpZWxkLgorCShzZXRfc3RyaW5nX2ZpZWxkKTogZGl0dG8gYW5kIGltcGwgcmUtYWxpZ25pbmcgYW55CisJZm9sbG93aW5nIGZpZWxkcy4KKwkoZGVjb2RlX2hlYWRlcl9kYXRhKTogdXBkYXRlIHRvIHRha2UgaW50byBhY2NvdW50IHRoYXQKKwl0aGUgZmllbGRzIGFyZW4ndCA0LWJ5dGUgYWxpZ25lZCBhbnkgbW9yZSBhbmQgdGhlIG5ldworCXdheSB0byBkaXN0aW5ndWlzaCBwYWRkaW5nIGZyb20gaGVhZGVyIGZpZWxkcy4gQWxzbywKKwlkb24ndCBleGl0IHdoZW4gdGhlcmUgaXMgdG9vIG11Y2ggaGVhZGVyIHBhZGRpbmcuCisJKHByb2Nlc3NfdGVzdF9zdWJkaXIpOiBwcmludCB0aGUgZGlyZWN0b3J5LgorCShfZGJ1c19tZXNzYWdlX3Rlc3QpOiBhZGQgdGVzdCB0byBtYWtlIHN1cmUgYSBmb2xsb3dpbmcKKwlmaWVsZCBpcyByZS1hbGlnbmVkIGNvcnJlY3RseSBhZnRlciBmaWVsZCBkZWxldGlvbi4KKwkKKwkqIGRidXMvZGJ1cy1zdHJpbmcuW2NoXToKKwkoX2RidXNfc3RyaW5nX2luc2VydF9ieXRlcyk6IHJlbmFtZSBmcm9tIGluc2VydF9ieXRlIGFuZAorCWFsbG93IHRoZSBpbnNlcnQgb2YgbXVsdGlwbGUgYnl0ZXMuCisJKF9kYnVzX3N0cmluZ190ZXN0KTogdGVzdCBpbnNlcnRpbmcgbXVsdGlwbGUgYnl0ZXMuCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmM6IChfZGJ1c19tYXJzaGFsX3NldF9zdHJpbmcpOiBhZGQKKwl3YXJuaW5nIG5vdGUgdG8gZG9jcyBhYm91dCBoYXZpbmcgdG8gcmUtYWxpZ24gYW55CisJbWFyc2hhbGxlZCB2YWx1ZXMgZm9sbG93aW5nIHRoZSBzdHJpbmcuCisJCisJKiBkYnVzL2RidXMtbWVzc2FnZS1idWlsZGVyLmM6CisJKGFwcGVuZF9zdHJpbmdfZmllbGQpLCAoX2RidXNfbWVzc2FnZV9kYXRhX2xvYWQpOgorCWRvbid0IGFsaWduIHRoZSBoZWFkZXIgZmllbGQuCisJCisJKiBkYnVzL2RidXMtYXV0aC5jOiAocHJvY2Vzc190ZXN0X3N1YmRpcik6IHByaW50IHRoZQorCWRpcmVjdG9yeS4KKwkKKwkqIHRlc3QvYnJlYWstbG9hZGVyLmM6IChyYW5kb21seV9hZGRfb25lX2J5dGUpOiB1cGQuIGZvcgorCWluc2VydF9ieXRlIGNoYW5nZS4KKwkKKwkqIHRlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1oZWFkZXItZmllbGQtYWxpZ25tZW50Lm1lc3NhZ2U6CisJbmV3IHRlc3QgY2FzZS4KKwkKKwkqIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy91bmtub3duLWhlYWRlci1maWVsZC5tZXNzYWdlOiBzaG92ZQorCWEgZGljdCBpbiB0aGUgdW5rbm93biBmaWVsZC4KKworMjAwMy0wOS0yNSAgU2V0aCBOaWNrZWxsICA8c2V0aEBnbm9tZS5vcmc+CisKKwkqIHB5dGhvbi9kYnVzLnB5OgorCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluOgorCisJSGFuZGxlIHJldHVybiB2YWx1ZXMuCisJCisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1jbGllbnQucHk6CisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1zZXJ2aWNlLnB5OgorCisJUGFzcyBiYWNrIHJldHVybiB2YWx1ZXMgZnJvbSB0aGUgc2VydmljZSB0byB0aGUgY2xpZW50LgorCQorMjAwMy0wOS0yNCAgU2V0aCBOaWNrZWxsICA8c2V0aEBnbm9tZS5vcmc+CisKKwkqIHB5dGhvbi9kYnVzLnB5OgorCisJQ29ubmVjdCBPYmplY3QgbWV0aG9kcyAod2hlbiB5b3UgYXJlIHNoYXJpbmcgYW4gb2JqZWN0KSB1cC4uLiBwYXNzCisJaW4gYSBsaXN0IG9mIG1ldGhvZHMgdG8gYmUgc2hhcmVkLiBTaGFyaW5nIGFsbCB0aGUgbWV0aG9kcyBqdXN0CisJd29ya2VkIG91dCB0b28gd2VpcmQuIFlvdSBjYW4gbm93IGNyZWF0ZSBuaWNlIFNlcnZpY2VzIG92ZXIgdGhlCisJREJ1cyBpbiBQeXRob24uIDotKQorCQorCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluOgorCisJS2VlcCByZWZlcmVuY2VzIHRvIHVzZXJfZGF0YSB0dXBsZXMgcGFzc2VkIGludG8gQyBmdW5jdGlvbnMgc28gCisJUHl0aG9uIGRvZXNuJ3QgZ2FyYmFnZSBjb2xsZWN0IG9uIHVzLgorCisJSW1wbGVtZW50IE1ldGhvZFJldHVybiBhbmQgRXJyb3Igc3ViY2xhc3NlcyBvZiBNZXNzYWdlIGZvciBjcmVhdGluZworCURCdXNNZXNzYWdlJ3Mgb2YgdGhvc2UgdHlwZXMuCisJCisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1jbGllbnQucHk6CisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1zZXJ2aWNlLnB5OgorCisJU2ltcGxlIGV4YW1wbGUgY29kZSBzaG93aW5nIGJvdGggaG93IGNyZWF0ZSBEQnVzIHNlcnZpY2VzIGFuZCBvYmplY3RzLAorCWFuZCBob3cgdG8gdXNlIHRoZW0uCisKKzIwMDMtMDktMjMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19ncHJveHlfbWFuYWdlcl9maWx0ZXIpOiBpbXBsZW1lbnQKKworMjAwMy0wOS0yMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19ncHJveHlfY29ubmVjdF9zaWduYWwpOiBpbXBsZW1lbnQKKwkoZGJ1c19ncHJveHlfZGlzY29ubmVjdF9zaWduYWwpOiBpbXBsZW1lbnQKKwkoZGJ1c19ncHJveHlfbWFuYWdlcl9yZW1vdmVfc2lnbmFsX21hdGNoKTogaW1wbGVtZW50CisJKGRidXNfZ3Byb3h5X21hbmFnZXJfYWRkX3NpZ25hbF9tYXRjaCk6IGltcGxlbWVudAorCShkYnVzX2dwcm94eV9vbmV3YXlfY2FsbCk6IGltcGxlbWVudAorCisyMDAzLTA5LTIzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmMgKHN0cnVjdCBEQnVzR1Byb3h5KTogY29udmVydCB0byBhIEdPYmplY3QKKwlzdWJjbGFzcy4gVGhpcyBtZWFucyBkcm9wcGluZyB0aGUgdHJhbnNwYXJlbnQgdGhyZWFkIHNhZmV0eSBvZiB0aGUKKwlwcm94eTsgeW91IG5vdyBuZWVkIGEgc2VwYXJhdGUgcHJveHkgcGVyLXRocmVhZCwgb3IgeW91ciBvd24KKwlsb2NraW5nIG9uIHRoZSBwcm94eS4gUHJvYmFibHkgcmlnaHQgYW55d2F5LgorCShkYnVzX2dwcm94eV9yZWYsIGRidXNfZ3Byb3h5X3VucmVmKTogbnVrZSwganVzdCB1c2UgZ19vYmplY3RfcmVmCisKKzIwMDMtMDktMjIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmMgKGRidXNfZ3Byb3h5X21hbmFnZXJfZ2V0KTogaW1wbGVtZW50CisKKzIwMDMtMDktMjEgIFNldGggTmlja2VsbCAgPHNldGhAZ25vbWUub3JnPgorCisgICAgICAgIEZpcnN0IGNoZWNraW4gb2YgdGhlIFB5dGhvbiBiaW5kaW5ncy4KKwkKKwkqIHB5dGhvbi8uY3ZzaWdub3JlOgorCSogcHl0aG9uL01ha2VmaWxlLmFtOgorCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluOgorCSogcHl0aG9uL2RidXNfaF93cmFwcGVyLmg6CisKKwlQaWVjZXMgZm9yIFB5cmV4IHRvIG9wZXJhdGUgb24sIGJ1aWxkaW5nIGEgZGJ1c19iaW5kaW5ncy5zbworCXB5dGhvbiBtb2R1bGUgZm9yIGxvdy1sZXZlbCBhY2Nlc3MgdG8gdGhlIERCdXMgQVBJcy4KKwkKKwkqIHB5dGhvbi9kYnVzLnB5OgorCisJSGlnaC1sZXZlbCBQeXRob24gbW9kdWxlIGZvciBhY2Nlc3NpbmcgREJ1cyBvYmplY3RzLgorCisJKiBjb25maWd1cmUuaW46CisJKiBNYWtlZmlsZS5hbToKKworCUJ1aWxkIHN0dWZmIGZvciB0aGUgcHl0aG9uIGJpbmRpbmdzLgorCisJKiBhY2luY2x1ZGUubTQ6CisKKwlFeHRyYSBtYWNybyBuZWVkZWQgZm9yIGZpbmRpbmcgdGhlIFB5dGhvbiBDIGhlYWRlciBmaWxlcy4KKworMjAwMy0wOS0yMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dwcm94eV9tYW5hZ2VyX25ldyk6IHN0YXJ0CisJaW1wbGVtZW50aW5nIHRoZSBwcm94eSBtYW5hZ2VyLCBkaWRuJ3QgZ2V0IHZlcnkgZmFyLgorCisJKiBkYnVzL2RidXMtYnVzLmMgKGRidXNfYnVzX2FkZF9tYXRjaCk6IG5ldworCShkYnVzX2J1c19yZW1vdmVfbWF0Y2gpOiBuZXcKKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dwcm94eV9uZXdfZm9yX3NlcnZpY2UpOiBhZGQgYQorCXBhdGhfbmFtZSBhcmd1bWVudDsgYWRqdXN0IHRoZSBvdGhlciBub3QteWV0LWltcGxlbWVudGVkIAorCWdwcm94eSBjb25zdHJ1Y3RvcnMgdG8gYmUgd2hhdCBJIHRoaW5rIHRoZXkgc2hvdWxkIGJlLgorCisyMDAzLTA5LTIxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtYnVzLmMgKGRidXNfYnVzX2dldCk6IHNldCBleGl0X29uX2Rpc2Nvbm5lY3QgdG8gVFJVRQorCWJ5IGRlZmF1bHQgZm9yIG1lc3NhZ2UgYnVzIGNvbm5lY3Rpb25zLgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2gpOiBleGl0IGlmCisJZXhpdF9vbl9kaXNjb25uZWN0IGZsYWcgaXMgc2V0IGFuZCB3ZSBwcm9jZXNzIHRoZSBkaXNjb25uZWN0ZWQKKwlzaWduYWwuCisJKGRidXNfY29ubmVjdGlvbl9zZXRfZXhpdF9vbl9kaXNjb25uZWN0KTogbmV3IGZ1bmN0aW9uCisKKzIwMDMtMDktMjEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwlHZXQgbWF0Y2hpbmcgcnVsZXMgbW9zdGx5IHdvcmtpbmcgaW4gdGhlIGJ1czsgb25seSBhY3R1YWxseQorCXBhcnNpbmcgdGhlIHJ1bGUgdGV4dCByZW1haW5zLiBIb3dldmVyLCB0aGUgY2xpZW50IHNpZGUgb2YKKwkic2lnbmFsIGNvbm5lY3Rpb25zIiBoYXNuJ3QgYmVlbiBzdGFydGVkLCB0aGlzIHBhdGNoIGlzIG9ubHkgdGhlCisJYnVzIHNpZGUuCisJCisJKiBkYnVzL2Rpc3BhdGNoLmM6IGZpeCBmb3IgdGhlIG1hdGNoaW5nIHJ1bGVzIGNoYW5nZXMKKwkKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfcmVtb3ZlX21hdGNoKQorCShidXNfZHJpdmVyX2hhbmRsZV9hZGRfbWF0Y2gpOiBzZW5kIGFuIGFjayByZXBseSBmcm9tIHRoZXNlCisJbWV0aG9kIGNhbGxzCisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19ncHJveHlfYmVnaW5fY2FsbCk6IGZpeCBvcmRlciBvZgorCWFyZ3VtZW50cywgcmVwb3J0ZWQgYnkgU2V0aCBOaWNrZWxsCisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKGFwcGVuZF9ydWxlX2Zyb21fZWxlbWVudCk6IHN1cHBvcnQKKwllYXZlc2Ryb3A9dHJ1ZXxmYWxzZSBhdHRyaWJ1dGUgb24gcG9saWNpZXMgc28gbWF0Y2ggcnVsZXMgCisJY2FuIGJlIHByZXZlbnRlZCBmcm9tIHNub29waW5nIG9uIHRoZSBzeXN0ZW0gYnVzLgorCisJKiBidXMvZGJ1cy1kYWVtb24tMS4xLmluOiBjb25zaXN0ZW50bHkgdXNlIHRlcm1pbm9sb2d5ICJzZW5kZXIiCisJYW5kICJkZXN0aW5hdGlvbiIgaW4gYXR0cmlidXRlIG5hbWVzOyBmaXggc29tZSBkb2NzIGJ1Z3M7IAorCWFkZCBlYXZlc2Ryb3A9dHJ1ZXxmYWxzZSBhdHRyaWJ1dGUKKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2hhbmRsZV9hZGRfbWF0Y2gpCisJKGJ1c19kcml2ZXJfaGFuZGxlX3JlbW92ZV9tYXRjaCk6IGhhbmRsZSBBZGRNYXRjaCwgUmVtb3ZlTWF0Y2gKKwltZXNzYWdlcworCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaCAoREJVU19TRVJWSUNFX09SR19GUkVFREVTS1RPUF9CUk9BRENBU1QpOiBnZXQKKwlyaWQgb2YgYnJvYWRjYXN0IHNlcnZpY2UgY29uY2VwdCwgc2lnbmFscyBhcmUganVzdCBhbHdheXMgYnJvYWRjYXN0CisKKwkqIGJ1cy9zaWduYWxzLmMsIGJ1cy9kaXNwYXRjaC5jLCBidXMvY29ubmVjdGlvbi5jLCBidXMvYnVzLmM6CisJbW9zdGx5IGltcGxlbWVudCBtYXRjaGluZyBydWxlcyBzdHVmZiAoY3VycmVudGx5IG9ubHkgZXhwb3NlZCBhcyBzaWduYWwKKwljb25uZWN0aW9ucykKKworMjAwMy0wOS0yMSAgTWFyayBNY0xvdWdobGluICA8bWFya0Bza3luZXQuaWU+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDogQ2hhbmdlIHRoZSBoZWFkZXIgZmllbGQgbmFtZQorCXRvIGJlIGFuIGVudW0gYW5kIHVwZGF0ZSB0aGUgcmVzdCBvZiB0aGUgc3BlYyB0byByZWZlcmVuY2UKKwl0aGUgZmllbGRzIHVzaW5nIHRoZSBjb252ZW50aW5hbCBuYW1lLgorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaDogdXBkYXRlIHRvIHJlZmxlY3QgdGhlIHNwZWMuCisKKwkqIGRvYy9UT0RPOiBhZGQgaXRlbSB0byByZW1vdmUgdGhlIDQgYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQuCisJCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiBSZW1vdmUgdGhlIGNvZGUgdG8gZ2VuZXJhbGlzZSB0aGUKKwloZWFkZXIvYm9keSBsZW5ndGggYW5kIHNlcmlhbCBudW1iZXIgaGVhZGVyIGZpZWxkcyBhcyBuYW1lZAorCWhlYWRlciBmaWVsZHMgc28gd2UgY2FuIHJlZmVyZW5jZSBmaWVsZCBuYW1lcyB1c2luZyB0aGUgCisJcHJvdG9jb2wgdmFsdWVzLgorCShhcHBlbmRfaW50X2ZpZWxkKSwgKGFwcGVuZF91aW50X2ZpZWxkKSwgKGFwcGVuZF9zdHJpbmdfZmllbGQpOgorCUFwcGVuZCB0aGUgZmllbGQgbmFtZSBhcyBhIGJ5dGUgcmF0aGVyIHRoYW4gZm91ciBjaGFycy4KKwkoZGVsZXRlX2ludF9vcl91aW50X2ZpZWxkKSwgKGRlbGV0ZV9zdHJpbmdfZmllbGQpOiByZWZsZWN0IHRoZQorCWZhY3QgdGhhdCB0aGUgZmllbGQgbmFtZSBhbmQgdHlwZWNvZGUgbm93IG9jY3VweSA0IGJ5dGVzIGluc3RlYWQKKwlvZiA4LgorCShkZWNvZGVfc3RyaW5nX2ZpZWxkKSwgKGRlY29kZV9oZWFkZXJfZGF0YSk6IHVwZGF0ZSB0byByZWZsZWN0CisJcHJvdG9jb2wgY2hhbmdlcyBhbmQgbW92ZSB0aGUgZmllbGQgc3BlY2lmaWMgZW5jb2RpbmcgZnJvbQorCWRlY29kZV9zdHJpbmdfZmllbGQoKSBiYWNrIGludG8gZGVjb2RlX2hlYWRlcl9kYXRhKCkuCisJCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLltjaF06IChfZGJ1c19oZWFkZXJfZmllbGRfdG9fc3RyaW5nKToKKwlBZGQgdXRpbGl0eSB0byBhaWQgZGVidWdnaW5nLgorCQorCSogZGJ1cy9kYnVzLW1lc3NhZ2UtYnVpbGRlci5jOgorCShhcHBlbmRfc3RyaW5nX2ZpZWxkKSwgKF9kYnVzX21lc3NhZ2VfZGF0YV9sb2FkKTogVXBkYXRlIHRvCisJcmVmbGVjdCBwcm90b2NvbCBjaGFuZ2VzOyBDaGFuZ2UgdGhlIEZJRUxEX05BTUUgZGlyZWN0aXZlCisJdG8gSEVBREVSX0ZJRUxEIGFuZCBhbGxvdyBpdCB0byB0YWtlIHRoZSBmaWVsZCdzIGNvbnZlbnRpb25hbAorCW5hbWUgcmF0aGVyIHRoYW4gdGhlIGFjdHVhbCB2YWx1ZS4KKwkKKwkqIHRlc3QvZGF0YS8qLyoubWVzc2FnZTogVXBkYXRlIHRvIHVzZSBIRUFERVJfRklFTEQgaW5zdGVhZAorCW9mIEZJRUxEX05BTUU7IEFsd2F5cyBhbGlnbiB0aGUgaGVhZGVyIG9uIGFuIDggYnl0ZSBib3VuZGFyeQorCSpiZWZvcmUqIHVwZGF0aW5nIHRoZSBoZWFkZXIgbGVuZ3RoLgorCisyMDAzLTA5LTE1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtcGVuZGluZy1jYWxsLmM6IGFkZCB0aGUgZ2V0L3NldCBvYmplY3QgZGF0YQorCWJvaWxlcnBsYXRlIGFzIGZvciBEQnVzQ29ubmVjdGlvbiwgZXRjLiBVc2UgZ2VuZXJpYyBvYmplY3QgZGF0YQorCWZvciB0aGUgbm90aWZ5IGNhbGxiYWNrLgorCisJKiBnbGliL2RidXMtZ3BhcnNlci5jIChwYXJzZV9ub2RlKTogcGFyc2UgY2hpbGQgbm9kZXMKKworCSogdG9vbHMvZGJ1cy12aWV3ZXIuYzogbW9yZSBoYWNraW5nIG9uIHRoZSBkYnVzLXZpZXdlcgorCQorCSogZ2xpYi9kYnVzLWd1dGlscy5jIChfZGJ1c19ndXRpbHNfc3BsaXRfcGF0aCk6IGFkZCBhIGZpbGUgdG8KKwljb250YWluIGZ1bmN0aW9ucyBzaGFyZWQgYmV0d2VlbiB0aGUgY29udmVuaWVuY2UgbGliIGFuZCB0aGUKKwlpbnN0YWxsZWQgbGliCisKKwkqIGdsaWIvTWFrZWZpbGUuYW0gKGxpYmRidXNfZ2xpYl8xX2xhX0xERkxBR1MpOiBhZGQKKwktZXhwb3J0LXN5bWJvbHMtcmVnZXggdG8gdGhlIEdMaWIgbGlicmFyeQorCisJKiBkYnVzL2RidXMtb2JqZWN0LXRyZWUuYyAoX2RidXNfb2JqZWN0X3RyZWVfZGlzcGF0Y2hfYW5kX3VubG9jayk6CisJZml4IHRoZSBsb2NraW5nIGluIGhlcmUsIGFuZCBhZGQgYSBkZWZhdWx0IGhhbmRsZXIgZm9yCisJSW50cm9zcGVjdCgpIHRoYXQganVzdCByZXR1cm5zIHN1Yi1ub2Rlcy4KKworMjAwMy0wOS0xNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZ2xpYi9kYnVzLWd0aHJlYWQuYyAoZGJ1c19nX3RocmVhZF9pbml0KTogcmVuYW1lIHRvIG1ha2UgZ19mb28KKwlyYXRoZXIgdGhhbiBnZm9vIGNvbnNpc3RlbnQKKworCSogZ2xpYi9kYnVzLWdwcm94eS5oOiBkZWxldGUgZm9yIG5vdywgbW92ZSBjb250ZW50cyB0bworCWRidXMtZ2xpYi5oLCBiZWNhdXNlIHRoZSBpbmNsdWRlIGZpbGVzIGRvbid0IHdvcmsgcmlnaHQgc2luY2Ugd2UKKwlhcmVuJ3QgaW4gdGhlIGRidXMvIHN1YmRpci4KKwkKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19ncHJveHlfc2VuZCk6IGZpbmlzaCBpbXBsZW1lbnRpbmcKKwkoZGJ1c19ncHJveHlfZW5kX2NhbGwpOiBmaW5pc2gKKwkoZGJ1c19ncHJveHlfYmVnaW5fY2FsbCk6IGZpbmlzaAorCisJKiBnbGliL2RidXMtZ21haW4uYyAoZGJ1c19zZXRfZ19lcnJvcik6IG5ldworCisJKiBnbGliL2RidXMtZ29iamVjdC5jIChoYW5kbGVfaW50cm9zcGVjdCk6IGluY2x1ZGUgaW5mb3JtYXRpb24KKwlhYm91dCBjaGlsZCBub2RlcyBpbiB0aGUgaW50cm9zcGVjdGlvbgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fbGlzdF9yZWdpc3RlcmVkKTogbmV3CisJZnVuY3Rpb24gdG8gaGVscCBpbiBpbXBsZW1lbnRhdGlvbiBvZiBpbnRyb3NwZWN0aW9uCisKKwkqIGRidXMvZGJ1cy1vYmplY3QtdHJlZS5jCisJKF9kYnVzX29iamVjdF90cmVlX2xpc3RfcmVnaXN0ZXJlZF9hbmRfdW5sb2NrKTogbmV3IGZ1bmN0aW9uCisKKzIwMDMtMDktMTIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGdsaWIvZGJ1cy1naWRsLmg6IGFkZCBjb21tb24gYmFzZSBjbGFzcyBmb3IgYWxsIHRoZSBmb29faW5mbworCXR5cGVzCisKKyAgICAgICAgKiB0b29scy9kYnVzLXZpZXdlci5jOiBhZGQgR1RLLWJhc2VkIGludHJvc3BlY3Rpb24gVUkgdGhpbmd5CisJc2ltaWxhciB0byBrZGNvcAorCisJKiB0ZXN0L01ha2VmaWxlLmFtOiB0cnkgdGVzdCBzcmNkaXIgLWVmIC4gaW4gYWRkaXRpb24gdG8gdGVzdAorCXNyY2RpciA9IC4sIG9uZSBvZiB0aGVtIHNob3VsZCB3b3JrICh5ZWFoIGxhbWUpCisJCisgICAgICAgICogZ2xpYi9NYWtlZmlsZS5hbTogYnVpbGQgdGhlICJpZGwiIHBhcnNlciBzdHVmZiBhcyBhIGNvbnZlbmllbmNlCisJbGlicmFyeQorCQorCSogZ2xpYi9kYnVzLWdwYXJzZXIuaDogbWFrZSBkZXNjcmlwdGlvbl9sb2FkIHJvdXRpbmVzIHJldHVybgorCU5vZGVJbmZvKiBub3QgUGFyc2VyKgorCisJKiBNYWtlZmlsZS5hbSAoU1VCRElSUyk6IGJ1aWxkIHRlc3QgZGlyIGFmdGVyIGFsbCBsaWJyYXJ5IGRpcnMKKworCSogY29uZmlndXJlLmluOiBhZGQgR1RLKyBkZXRlY3Rpb24KKworMjAwMy0wOS0wNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogTWFrZSBEb3h5Z2VuIGNvbnRlbnRlZC4KKworMjAwMy0wOS0wNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOiBtb3JlIHVwZGF0ZXMKKworMjAwMy0wOS0wNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOiBwYXJ0aWFsIHVwZGF0ZXMKKworCSogYnVzL2RidXMtZGFlbW9uLTEuMS5pbjogZml4IHRoZSBjb25maWcgZmlsZSBkb2NzIGZvciB0aGUKKwl6aWxsaW9udGggdGltZTsgaG9wZWZ1bGx5IEkgZWRpdGVkIHRoZSByaWdodCBmaWxlIHRoaXMgdGltZS4KKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYyAoYXBwZW5kX3J1bGVfZnJvbV9lbGVtZW50KTogc3VwcG9ydAorCXNlbmRfdHlwZSwgc2VuZF9wYXRoLCByZWNlaXZlX3R5cGUsIHJlY2VpdmVfcGF0aAorCisJKiBidXMvcG9saWN5LmM6IGFkZCBtZXNzYWdlIHR5cGUgYW5kIHBhdGggdG8gdGhlIGxpc3Qgb2YgdGhpbmdzCisJdGhhdCBjYW4gYmUgImZpcmV3YWxsZWQiCisKKzIwMDMtMDktMDYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9mYWxsYmFjayk6IGFkZCB0aGlzCisJKGRidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9vYmplY3RfcGF0aCk6IG1ha2UgdGhpcyBub3QgaGFuZGxlCisJbWVzc2FnZXMgdG8gcGF0aHMgYmVsb3cgdGhlIGdpdmVuIHBhdGgKKworMjAwMy0wOS0wMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogdGVzdC9nbGliL01ha2VmaWxlLmFtOiBhZGQgdGhpcyB3aXRoIHJhbmRvbSBnbGliLWxpbmtlZCB0ZXN0CisJcHJvZ3JhbXMKKworCSogZ2xpYi9NYWtlZmlsZS5hbTogcmVtb3ZlIHRoZSByYW5kb20gdGVzdCBwcm9ncmFtcyBmcm9tIGhlcmUsCisJbGVhdmUgb25seSB0aGUgdW5pdCB0ZXN0cworCisJKiBnbGliL2RidXMtZ29iamVjdC5jIChfZGJ1c19nb2JqZWN0X3Rlc3QpOiBhZGQgdGVzdCBmb3IgCisJdXNjb3JlL2phdmFjYXBzIGNvbnZlcnNpb24sIGFuZCBmaXgJCisJKGdldF9vYmplY3RfcHJvcGVydHksIHNldF9vYmplY3RfcHJvcGVydHkpOiBjaGFuZ2UgdG8gLk5FVAorCWNvbnZlbnRpb24gZm9yIG1hcHBpbmcgcHJvcHMgdG8gbWV0aG9kcywgc2V0X0Zvb0Jhci9nZXRfRm9vQmFyLCAKKwlzaW5jZSBvbmUgbGFuZ3VhZ2UgaGFzIHN1Y2ggYSBjb252ZW50aW9uIHdlIG1heSBhcyB3ZWxsIGNvcHkgaXQuIAorCVBsdXMgcmVhbCBtZXRob2RzIGluIGVpdGhlciBnZXRGb29CYXIgb3IgZ2V0X2Zvb19iYXIgc3R5bGUgd29uJ3QgCisJY29sbGlkZSB3aXRoIHRoaXMgY29udmVudGlvbi4KKworMjAwMy0wOS0wMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZ2xpYi9kYnVzLWdwYXJzZXIuYzogaW1wbGVtZW50CisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmM6IHN0YXJ0IGltcGxlbWVudGluZyBza2VsZXRvbnMgc3VwcG9ydAorCisJKiBjb25maWd1cmUuaW46IHdoZW4gZGlzYWJsaW5nIGNoZWNrcy9hc3NlcnQsIGFsc28gZGVmaW5lCisJR19ESVNBQkxFX0FTU0VSVCBhbmQgR19ESVNBQkxFX0NIRUNLUworCisyMDAzLTA5LTAxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBnbGliL01ha2VmaWxlLmFtOiByZWFycmFuZ2UgYSBidW5jaCBvZiBmaWxlcyBhbmQgZ2V0ICJtYWtlCisJY2hlY2siIGZyYW1ld29yayBzZXQgdXAKKworMjAwMy0wOC0zMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZml4IGJ1aWxkIHdpdGggLS1kaXNhYmxlLXRlc3RzCisKKzIwMDMtMDgtMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IHB1cmdlIERCdXNNZXNzYWdlSGFuZGxlcgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS1oYW5kbGVyLmM6IHJlbW92ZSBEQnVzTWVzc2FnZUhhbmRsZXIsIGp1c3QgCisJdXNlIGNhbGxiYWNrcyBldmVyeXdoZXJlCisKKzIwMDMtMDgtMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIHRlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvc3lzdGVtLmQvdGVzdC5jb25mOiBjaGFuZ2UgdG8gCisJcm9vdCBmb3IgdGhlIHVzZXIgc28gd2FybmluZ3MgZG9uJ3QgZ2V0IHByaW50ZWQKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogYWRkIGRidXNfbWVzc2FnZV9nZXRfcGF0aCwKKwlkYnVzX21lc3NhZ2Vfc2V0X3BhdGgKKwkKKwkqIGRidXMvZGJ1cy1vYmplY3QtdHJlZS5jIChkb190ZXN0X2Rpc3BhdGNoKTogYWRkIHRlc3Qgb2YKKwlkaXNwYXRjaGluZyB0byBhIHBhdGgKKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfdmFsaWRhdGVfcGF0aCk6IGFkZAorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jIChfZGJ1c19kZW1hcnNoYWxfb2JqZWN0X3BhdGgpOiBpbXBsZW1lbnQKKwkoX2RidXNfbWFyc2hhbF9vYmplY3RfcGF0aCk6IGltcGxlbWVudAorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaCAoREJVU19IRUFERVJfRklFTERfUEFUSCk6IG5ldyBoZWFkZXIgZmllbGQgCisJdG8gY29udGFpbiB0aGUgcGF0aCB0byB0aGUgdGFyZ2V0IG9iamVjdAorCShEQlVTX0hFQURFUl9GSUVMRF9TRU5ERVJfU0VSVklDRSk6IHJlbmFtZQorCURCVVNfSEVBREVSX0ZJRUxEX1NFTkRFUiB0byBleHBsaWNpdGx5IHNheSBpdCdzIHRoZSBzZW5kZXIgc2VydmljZQorCisyMDAzLTA4LTMwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtb2JqZWN0LXRyZWUuYzogd3JpdGUgdGVzdHMgYW5kIGZpeCB0aGUgZGlzY292ZXJlZCBidWdzCisKKzIwMDMtMDgtMjkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1vYmplY3QtdHJlZS5jOiBtb2RpZnkgdG8gYWxsb3cgb3ZlcmxhcHBpbmcgcGF0aHMgdG8gYmUKKwlyZWdpc3RlcmVkCisJKHN0cnVjdCBEQnVzT2JqZWN0U3VidHJlZSk6IHNocmluayB0aGlzCisJYSBsb3QsIHNpbmNlIHdlIG1heSBoYXZlIGEgbG90IG9mIHRoZW0KKwkoX2RidXNfb2JqZWN0X3RyZWVfZnJlZV9hbGxfdW5sb2NrZWQpOiBpbXBsZW1lbnQKKwkoX2RidXNfb2JqZWN0X3RyZWVfZGlzcGF0Y2hfYW5kX3VubG9jayk6IGltcGxlbWVudAorCisyMDAzLTA4LTI5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmg6IGZpeCBfREJVU19OX0dMT0JBTF9MT0NLUworCisyMDAzLTA4LTI4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJcHVyZ2UgREJ1c09iamVjdElECisJCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiBwb3J0IHRvIG5vIE9iamVjdElELCBjcmVhdGUgYQorCURCdXNPYmplY3RUcmVlLCByZW5hbWUgT2JqZWN0VHJlZSB0byBPYmplY3RQYXRoIGluIHB1YmxpYyBBUEkKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uaCAoc3RydWN0IERCdXNPYmplY3RUcmVlVlRhYmxlKTogZGVsZXRlIAorCWV2ZXJ5dGhpbmcgZXhjZXB0IFVucmVnaXN0ZXJGdW5jdGlvbiBhbmQgTWVzc2FnZUZ1bmN0aW9uCisJCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiBwb3J0IGF3YXkgZnJvbSBEQnVzT2JqZWN0SUQsIAorCWFkZCBEQlVTX1RZUEVfT0JKRUNUX1BBVEgKKwkKKwkqIGRidXMvZGJ1cy1vYmplY3QtcmVnaXN0cnkuW2hjXSwgZGJ1cy9kYnVzLW9iamVjdC5baGNdLCAKKwlkYnVzL2RidXMtb2JqZWN0aWQuW2hjXTogcmVtb3ZlIHRoZXNlLCB3ZSBhcmUgbW92aW5nIHRvIAorCXBhdGgtYmFzZWQgb2JqZWN0IElEcworCisyMDAzLTA4LTI1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisgICAgICAgIEp1c3Qgbm90aWNlZCB0aGF0IGRidXNfbWVzc2FnZV90ZXN0IGlzIGhvc2VkLCBJIHdvbmRlciB3aGVuIEkKKwlicm9rZSB0aGF0LiBJIHRob3VnaHQgbWFrZSBjaGVjayB3YXMgcGFzc2luZyBlYXJsaWVyLi4uCisJCisJKiBkYnVzL2RidXMtb2JqZWN0LXRyZWUuYzogYWRkIG5ldyAib2JqZWN0IHRyZWUiIHRvIG1hdGNoIERDT1AgCisJY29udGFpbmVyIHRyZWUsIHdpbGwgcmVwbGFjZSBtb3N0IG9mIGRidXMtb2JqZWN0LXJlZ2lzdHJ5CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGZfdmFsaXN0KTogZml4IEM5OQorCXNjcmV3dXAKKworMjAwMy0wOC0xOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGVjb2RlX3N0cmluZ19maWVsZCk6IHN1cHBvcnQgRklFTERfU0VOREVSCisJKGRidXNfbWVzc2FnZV9pc19lcnJvcik6IGZpeCB0aGlzIGZ1bmN0aW9uCisKKwkqIGJ1cy9kYnVzLWRhZW1vbi0xLjE6IGNsYXJpZnkgbG9naWMgb24gd2hlbiA8ZGVueT4vPGFsbG93PiBydWxlcworCW1hdGNoCisKKwkqIGJ1cy9wb2xpY3kuYyAoYnVzX2NsaWVudF9wb2xpY3lfY2hlY2tfY2FuX3JlY2VpdmUpOiBmaXggY29kZSB0bworCXJlZmxlY3QgY2xhcmlmaWVkIG1hbiBwYWdlCisJKGJ1c19jbGllbnRfcG9saWN5X2NoZWNrX2Nhbl9zZW5kKTogZGl0dG8KKwkKKwkqIGJ1cy9zZXNzaW9uLmNvbmYuaW46IGZpeHVwCisKKwkqIGJ1cy9zeXN0ZW0uY29uZi5pbjogZml4dXAKKworMjAwMy0wOC0xOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1oYXNoLmMgKF9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3R3b19zdHJpbmdzKTogZml4CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKF9kYnVzX21lc3NhZ2VfbG9hZGVyX3F1ZXVlX21lc3NhZ2VzKTogZml4CisJZHVtYiBidWcgY3JlYXRlZCBlYXJsaWVyICh3cm9uZyBvcmRlciBvZiBhcmdzIHRvCisJZGVjb2RlX2hlYWRlcl9kYXRhKCkpCisJCisJKiB0b29scy9kYnVzLXNlbmQuYzogcG9ydAorCisJKiB0b29scy9kYnVzLXByaW50LW1lc3NhZ2UuYyAocHJpbnRfbWVzc2FnZSk6IHBvcnQKKworICAgICAgICAqIHRlc3QvZGF0YS8qbWVzc2FnZXM6IHBvcnQgYWxsIG1lc3NhZ2VzIG92ZXIKKwkKKyAgICAgICAgKiBkYnVzL2RidXMtbWVzc2FnZS1idWlsZGVyLmM6IHN1cHBvcnQgaW5jbHVkaW5nIAorCW1lc3NhZ2UgdHlwZQorCQorICAgICAgICAqIGJ1cy9kcml2ZXIuYzogcG9ydCBvdmVyCisJCisJKiBidXMvZGlzcGF0Y2guYzogcG9ydCBvdmVyIHRvIG5ldyBzdHVmZgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChfZGJ1c19jb25uZWN0aW9uX25ld19mb3JfdHJhbnNwb3J0KToKKwlyZW5hbWUgZGlzY29ubmVjdCBzaWduYWwgdG8gIkRpc2Nvbm5lY3RlZCIKKworMjAwMy0wOC0xNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCVRoaXMgZG9lc24ndCBjb21waWxlIHlldCwgYnV0IHN5bmNpbmcgdXAgc28gSSBjYW4gaGFjayBvbiBpdCBmcm9tCisJd29yay4gV2hhdCBhcmUgYnJhbmNoZXMgZm9yIGlmIG5vdCBicm9rZW4gY29kZT8gOy0pCisJCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaDogcmVtb3ZlIERCVVNfSEVBREVSX0ZJRUxEX05BTUUsIGFkZAorCURCVVNfSEVBREVSX0ZJRUxEX0lOVEVSRkFDRSwgREJVU19IRUFERVJfRklFTERfTUVNQkVSLAorCURCVVNfSEVBREVSX0ZJRUxEX0VSUk9SX05BTUUKKwkKKwkqIGRidXMvZGJ1cy1oYXNoLmM6IEludHJvZHVjZSBEQlVTX0hBU0hfVFdPX1NUUklOR1MgYXMgaGFjayB0byB1c2UKKwlmb3IgdGhlIGludGVyZmFjZSttZW1iZXIgcGFpcnMKKwkoc3RyaW5nX2hhc2gpOiBjaGFuZ2UgdG8gdXNlIGdfc3RyX2hhc2ggYWxnb3JpdGhtCisJKGZpbmRfZGlyZWN0X2Z1bmN0aW9uLCBmaW5kX3N0cmluZ19mdW5jdGlvbik6IHJlZmFjdG9yIHRoZXNlIHRvCisJc2hhcmUgbW9zdCBjb2RlLgorCQorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogcG9ydCBhbGwgb2YgdGhpcyBvdmVyIHRvIHN1cHBvcnQgCisJaW50ZXJmYWNlL21lbWJlciBmaWVsZHMgaW5zdGVhZCBvZiBuYW1lIGZpZWxkCisKKwkqIGRidXMvZGJ1cy1vYmplY3QtcmVnaXN0cnkuYzogcG9ydCBvdmVyCisJCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ192YWxpZGF0ZV9pbnRlcmZhY2UpOiByZW5hbWUKKwlmcm9tIF9kYnVzX3N0cmluZ192YWxpZGF0ZV9uYW1lCisKKwkqIGJ1cy9kYnVzLWRhZW1vbi0xLjE6IGNoYW5nZSBmaWxlIGZvcm1hdCBmb3IgdGhlIAorCTxkZW55Pi88YWxsb3c+IHN0dWZmIHRvIG1hdGNoIG5ldyBtZXNzYWdlIG5hbWluZyBzY2hlbWUKKworCSogYnVzL3BvbGljeS5jOiBwb3J0IG92ZXIKKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYzogcGFyc2UgbmV3IGZvcm1hdAorCQorMjAwMy0wOC0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW9iamVjdC1yZWdpc3RyeS5jIChhZGRfYW5kX3JlbW92ZV9vYmplY3RzKTogcmVtb3ZlCisJYnJva2VuIGFzc2VydGlvbgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmM6IHNvbWUgaGFja2luZworCisyMDAzLTA4LTE1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXBlbmRpbmctY2FsbC5jIChkYnVzX3BlbmRpbmdfY2FsbF9ibG9jayk6IGltcGxlbWVudAorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jCisJKGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKTogZmFjdG9yIG91dCBpbnRlcm5hbHM7CisJY2hhbmdlIHRvIGNvbnZlcnQgYW55IGVycm9yIHJlcGxpZXMgdG8gREJ1c0Vycm9yIGluc3RlYWQgb2YgCisJcmV0dXJuaW5nIHRoZW0gYXMgYSBtZXNzYWdlCisKKzIwMDMtMDgtMTUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMsIAorCWRidXMvZGJ1cy1wZW5kaW5nLWNhbGwuYzogRmluaXNoIHRoZSBwZW5kaW5nIGNhbGwgc3R1ZmYKKworMjAwMy0wOC0xNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1wZW5kaW5nLWNhbGwuYzogc3RhcnQgb24gbmV3IG9iamVjdCB0aGF0IHdpbGwgcmVwbGFjZQorCURCdXNNZXNzYWdlSGFuZGxlciBhbmQgUmVwbHlIYW5kbGVyRGF0YSBmb3IgdHJhY2tpbmcgb3V0c3RhbmRpbmcKKwlyZXBsaWVzCisKKwkqIGRidXMvZGJ1cy1ncHJveHkuYzogc3RhcnQgb24gcHJveHkgb2JqZWN0IHVzZWQgdG8gY29tbXVuaWNhdGUKKwl3aXRoIHJlbW90ZSBpbnRlcmZhY2VzCisKKwkqIGRidXMvZGJ1cy1naWRsLmM6IGRvIHRoZSBib3JpbmcgYm9pbGVycGxhdGUgaW4gaGVyZQorCQorMjAwMy0wOC0xMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL2Rpc3BhdGNoLmMgKGJ1c19kaXNwYXRjaCk6IG1ha2UgdGhpcyByZXR1cm4gcHJvcGVyIAorCURCdXNIYW5kbGVyUmVzdWx0IHRvIGF2b2lkIERCVVNfRVJST1JfVU5LTk9XTl9NRVRIT0QKKworCSogZGJ1cy9kYnVzLWVycm9ycy5jIChkYnVzX3NldF9lcnJvcik6IHVzZQorCV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmX3ZhbGlzdAorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmX3ZhbGlzdCkKKwkoX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYpOiBuZXcKKworCSogZGJ1cy9kYnVzLWVycm9ycy5oIChEQlVTX0VSUk9SX1VOS05PV05fTUVTU0FHRSk6IGNoYW5nZSB0bworCVVOS05PV05fTUVUSE9ECisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCk6IGhhbmRsZQorCURCVVNfSEFORExFUl9SRVNVTFRfTkVFRF9NRU1PUlk7IHNlbmQgZGVmYXVsdCBlcnJvciByZXBseSBpZiBhCisJbWVzc2FnZSBpcyB1bmhhbmRsZWQuCisKKzIwMDMtMDgtMTEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy90ZXN0LmMgKGNsaWVudF9kaXNjb25uZWN0X2hhbmRsZXIpOiBjaGFuZ2UgdG8gcmV0dXJuCisJSEFORExFRCAod291bGQgaGF2ZSBiZWVuIFJFTU9WRV9NRVNTQUdFKQorCisJKiBkYnVzL2RidXMtb2JqZWN0LmggKGVudW0gREJ1c0hhbmRsZXJSZXN1bHQpOiByZW5hbWUgdG8KKwlIQU5ETEVEL05PVF9ZRVRfSEFORExFRCBpbnN0ZWFkIG9mCisJUkVNT1ZFX01FU1NBR0UvQUxMT1dfTU9SRV9IQU5ETEVSUyB0byBtYWtlIGl0IGNsZWFyZXIgaG93IGl0IAorCXNob3VsZCBiZSB1c2VkLgorCisyMDAzLTA4LTEwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiB0b29scy9kYnVzLXNlbmQuYyAobWFpbik6IGFkZCAtLXR5cGUgYXJndW1lbnQsIGZvciBub3cKKwlzdXBwb3J0aW5nIG9ubHkgbWV0aG9kX2NhbGwgYW5kIHNpZ25hbCB0eXBlcy4KKworCSogdG9vbHMvZGJ1cy1wcmludC1tZXNzYWdlLmM6IHByaW50IG1lc3NhZ2UgdHlwZQorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChfZGJ1c19jb25uZWN0aW9uX25ld19mb3JfdHJhbnNwb3J0KToKKwlpbml0IGNvbm5lY3Rpb24tPm9iamVjdHMKKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOiBmaXggc2dtbAorCisJKiBidXMvKi5jOiBwb3J0IG92ZXIgdG8gb2JqZWN0LWluc3RhbmNlIEFQSSBjaGFuZ2VzCisKKwkqIHRlc3QvdGVzdC1zZXJ2aWNlLmM6IGRpdHRvCisJCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfY3JlYXRlX2hlYWRlcik6IGFsbG93ICNOVUxMCisJbmFtZSwgd2Ugd2lsbCBoYXZlIHRvIGZpeCB1cCB0aGUgcmVzdCBvZiB0aGUgY29kZSB0byBhbHNvIGhhbmRsZQorCXRoaXMKKwkoZGJ1c19tZXNzYWdlX25ldyk6IGdlbmVyaWMgbWVzc2FnZS1jcmVhdGlvbiBjYWxsCisJKHNldF9zdHJpbmdfZmllbGQpOiBhbGxvdyBhcHBlbmRpbmcgbmFtZSBmaWVsZAorCisyMDAzLTA4LTA2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtb2JqZWN0LXJlZ2lzdHJ5LmM6IGltcGxlbWVudCBzaWduYWwgY29ubmVjdGlvbiAKKwlhbmQgZGlzcGF0Y2gKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoX2RidXNfY29ubmVjdGlvbl91bnJlZl91bmxvY2tlZCk6IG5ldworCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmMgKF9kYnVzX21lbWR1cCk6IG5ldyBmdW5jdGlvbgorCisyMDAzLTA4LTAyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfZ2V0X25vX3JlcGx5KQorCShkYnVzX21lc3NhZ2Vfc2V0X25vX3JlcGx5KTogYWRkIHRoZXNlIGFuZCByZW1vdmUKKwlzZXRfaXNfZXJyb3IvZ2V0X2lzX2Vycm9yCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oLCBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6IAorCXJlbW92ZSB0aGUgRVJST1IgZmxhZywgc2luY2UgdGhlcmUncyBub3cgYW4gRVJST1IgdHlwZQorCisyMDAzLTA4LTAxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtb2JqZWN0LXJlZ2lzdHJ5LmMgKF9kYnVzX29iamVjdF9yZWdpc3RyeV9oYW5kbGVfYW5kX3VubG9jayk6CisJaW1wbGVtZW50CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSk6IG5ldyBmdW5jdGlvbgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6IGFkZCAidHlwZSIgYnl0ZSB0byBtZXNzYWdlcworCisyMDAzLTA4LTAxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaCAoREJVU19NRVNTQUdFX1RZUEVfKik6IGludHJvZHVjZQorCWEgbWVzc2FnZSB0eXBlIGVudW0gdG8gZGlzdGluZ3Vpc2gga2luZHMgb2YgbWVzc2FnZQorCShEQlVTX0hFQURFUl9GTEFHX05PX1JFUExZX0VYUEVDVEVEKTogZmxhZyBmb3IgYSBtZXNzYWdlIAorCXRoYXQgbmVlZCBub3QgYmUgcmVwbGllZCB0bworCisyMDAzLTA4LTAxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiBhZGFwdCB0byBEQnVzT2JqZWN0SUQgY2hhbmdlcworCSh1bnBhY2tfOF9vY3RldHMpOiBmaXggbm8tNjQtYml0LWludCBidWcKKworCSogZGJ1cy9kYnVzLW9iamVjdC1yZWdpc3RyeS5jICh2YWxpZGF0ZV9pZCk6IHZhbGlkYXRlIHRoZSAKKwljb25uZWN0aW9uIElEIGJpdHMsIG5vdCBqdXN0IHRoZSBpbnN0YW5jZSBJRC4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoX2RidXNfY29ubmVjdGlvbl9pbml0X2lkKTogaW5pdGlhbGl6ZQorCXRoZSBjb25uZWN0aW9uLWdsb2JhbCAzMyBiaXRzIG9mIHRoZSBvYmplY3QgSUQKKworCSogZGJ1cy9kYnVzLW9iamVjdC1yZWdpc3RyeS5jIChpbmZvX2Zyb21fZW50cnkpOiBmaWxsIGluIAorCW9iamVjdCBJRCBpbiB0aGUgbmV3IHdheQorCisJKiBkYnVzL2RidXMtb2JqZWN0aWQuaDogcmF0aGVyIHRoYW4gaGlnaC9sb3cgYml0cywgc3BlY2lmaWNhbGx5IAorCWRlZmluZSBzZXJ2ZXIvY2xpZW50L2luc3RhbmNlIGJpdHMuCisKKzIwMDMtMDctMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9vYmplY3QpOiBmaXgKKwlidWlsZAorCisyMDAzLTA3LTEzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtb2JqZWN0LmggKHN0cnVjdCBEQnVzT2JqZWN0VlRhYmxlKTogYWRkIHBhZGRpbmcKKwlmaWVsZHMgdG8gREJ1c09iamVjdFZUYWJsZSBhbmQgREJ1c09iamVjdEluZm8KKworMjAwMy0wNy0xMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW9iamVjdC1yZWdpc3RyeS5jOiBpbXBsZW1lbnQgdW5pdCB0ZXN0LAorCWZpeCBidWdzIGRpc2NvdmVyZWQgaW4gcHJvY2VzcworCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiByZW1vdmUgaGFuZGxlcl90YWJsZSBhbmQKKwlyZWdpc3Rlcl9oYW5kbGVyKCksIGFkZCBEQnVzT2JqZWN0UmVnaXN0cnkgdXNhZ2UKKworCSogZGJ1cy9kYnVzLW9iamVjdGlkLmMgKGRidXNfb2JqZWN0X2lkX2lzX251bGwpCisJKGRidXNfb2JqZWN0X2lkX3NldF9udWxsKTogbmV3IGZ1bmN0aW9ucworCisyMDAzLTA3LTA4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtb2JqZWN0LmM6IGltcGxlbWVudCBzb21lIG9mIHRoaXMKKworCSogZGJ1cy9kYnVzLW9iamVjdC1yZWdpc3RyeS5jCisJKF9kYnVzX29iamVjdF9yZWdpc3RyeV9hZGRfYW5kX3VubG9jayk6IGZpbGwgaW4gdGhlIG9iamVjdF9pZCBvdXQKKwlwYXJhbQorCShfZGJ1c19vYmplY3RfcmVnaXN0cnlfbmV3KTogaGFuZGxlIE9PTQorCisyMDAzLTA3LTA4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtb2JqZWN0Lmg6IHNrZXRjaCBvdXQgYW4gQVBJIGZvciByZWdpc3RlcmluZyBvYmplY3RzCisJd2l0aCBhIGNvbm5lY3Rpb24sIHRoYXQgYWxsb3dzIHVzIHRvIHVzZSBhcyBsaXR0bGUgYXMgMjQgYnl0ZXMKKwlwZXIgb2JqZWN0IGFuZCBsZXRzIGFwcGxpY2F0aW9uIGNvZGUgcmVwcmVzZW50IGFuIG9iamVjdCBpbiAKKwlhbnkgY29uY2VpdmFibGUgd2F5LgorCisJKiBkYnVzL2RidXMtb2JqZWN0LXJlZ2lzdHJ5LmM6IGltcGxlbWVudCB0aGUgaGFyZCBiaXRzIG9mIHRoZQorCURCdXNDb25uZWN0aW9uIGFzcGVjdCBvZiBvYmplY3QgQVBJLiBOb3QgeWV0IHdpcmVkIHVwLgorCQorMjAwMy0wNy0wNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYyAoX2RidXNfbWFyc2hhbF9zZXRfb2JqZWN0X2lkKTogbmV3IGZ1bmN0aW9uCisJKF9kYnVzX21hcnNoYWxfb2JqZWN0X2lkKTogbmV3CisJKF9kYnVzX2RlbWFyc2hhbF9vYmplY3RfaWQpOiBuZXcKKwkoX2RidXNfbWFyc2hhbF9nZXRfYXJnX2VuZF9wb3MpOiBzdXBwb3J0IG9iamVjdCBJRCB0eXBlLCBhbmQKKwljb25zb2xpZGF0ZSBpZGVudGljYWwgc3dpdGNoIGNhc2VzLiBEb24ndCBjb25kaXRpb25hbGl6ZSBoYW5kbGluZworCW9mIERCVVNfVFlQRV9VSU5UNjQsIG5lZWQgdG8gaGFuZGxlIHRoZSB0eXBlIGFsd2F5cy4KKwkoX2RidXNfbWFyc2hhbF92YWxpZGF0ZV9hcmcpOiBjb25zb2xpZGF0ZSBpZGVudGljYWwgY2FzZXMsIGFuZAorCWhhbmRsZSBEQlVTX1RZUEVfT0JKRUNUX0lECisKKwkqIGRidXMvZGJ1cy1vYmplY3RpZC5jOiBuZXcgZmlsZSB3aXRoIERCdXNPYmplY3RJRCBkYXRhIHR5cGUuCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOiBhZGQgREJVU19UWVBFX09CSkVDVF9JRAorCisyMDAzLTA5LTI4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiByZWFsIDAuMTMgcmVsZWFzZQorCisyMDAzLTA5LTI4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkb2MvTWFrZWZpbGUuYW0gKGRidXMtc3BlY2lmaWNhdGlvbi5odG1sKTogdGVzdGluZyBhIGZ1bmt5IGhhY2sKKwl0byB3b3JrIHdpdGggRGViaWFuIGRiMmh0bWwKKworMjAwMy0wOS0yOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogY29uZmlndXJlLmluOiAwLjEzCisKKwkqIGRvYy9NYWtlZmlsZS5hbSAoZGJ1cy10ZXN0LXBsYW4uaHRtbCk6IGFjY2VwdCBub25leGlzdGVuY2Ugb2YKKwlzdHlsZXNoZWV0LWltYWdlcyBmb3IgYmVuZWZpdCBvZiBEZWJpYW4KKwkKKwlDaGFuZ2UgYmFjayB0byB1c2luZyBmaWxlc3lzdGVtLWxpbmtlZCBzb2NrZXRzIGZvciB0aGUgc3lzdGVtCisJYnVzLCBzbyBvbmx5IHJvb3QgY2FuIGNyZWF0ZSB0aGUgZGVmYXVsdCBzeXN0ZW0gYnVzIGFkZHJlc3MuCisJCisJKiBidXMvc3lzdGVtLmNvbmYuaW46IGNoYW5nZSB0byB1c2UKKwlEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTCisKKwkqIGRidXMvTWFrZWZpbGUuYW0gKElOQ0xVREVTKTogcmVtb3ZlIERCVVNfU1lTVEVNX0JVU19QQVRIIGRlZmluZQorCWZyb20gaGVyZS4KKworCSogY29uZmlndXJlLmluOiBkZWZpbmUgREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTUworCWhlcmUsIGFuZCBBQ19ERUZJTkUgREJVU19TWVNURU1fUEFUSAorCisyMDAzLTA4LTA5ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZG9jL1RPRE86CisJKiBkb2MvYnVzY29uZmlnLmR0ZDoKKwlBZGQgYnVzY29uZmlnIERURC4KKwkKKzIwMDMtMDgtMDkgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6CisJQWRkIGFjdGl2YXRpb24gcmVwbHkgdmFsdWVzLgorCQorMjAwMy0wOC0wNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogMC4xMgorCisyMDAzLTA4LTA1ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZ2xpYi9kYnVzLWdtYWluLmM6ICh3YXRjaF9mZF9uZXcpLCAod2F0Y2hfZmRfcmVmKSwKKwkod2F0Y2hfZmRfdW5yZWYpLCAoZGJ1c19nc291cmNlX2NoZWNrKSwgKGRidXNfZ3NvdXJjZV9kaXNwYXRjaCksCisJKGFkZF93YXRjaCksIChyZW1vdmVfd2F0Y2gpLCAoY3JlYXRlX3NvdXJjZSk6CisJUmVmY291bnQgZmRzLCBmaXhlcyBzb21lIHJlZW50cmFuY3kgaXNzdWVzLgorCQorMjAwMy0wNy0zMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1idXMuYyAoaW5pdF9jb25uZWN0aW9uc191bmxvY2tlZCk6IGZpeCBkZWZhdWx0IHN5c3RlbQorCWJ1cyBhZGRyZXNzIHRvIGJlIGFic3RyYWN0IGlmIHdlIGhhdmUgYWJzdHJhY3Qgc29ja2V0cworCisJKiBORVdTOiB1cGRhdGUKKworMjAwMy0wNy0yOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9tZXNzYWdlYnVzLmluOiBmaXggdG8gYXZvaWQgcHJvY2Vzc25hbWUvc2VydmljZW5hbWUgCisJY29uZnVzaW9uLCBmcm9tIE1pY2hhZWwgS2VhcmV5CisJaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0xMDA5NjUKKwkKKzIwMDMtMDctMjMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9uYW1lZCk6IAorCWZpeCBmcm9tIEFuZHkgSGFudG9uIHRvIHJlbW92ZSBicm9rZW4gIisxIgorCisyMDAzLTA3LTE2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiB0b29scy9kYnVzLWxhdW5jaC5jIChiYWJ5c2l0KTogY2xvc2Ugc3Rkb3V0L3N0ZGVyciBpbiB0aGUKKwliYWJ5c2l0dGVyIHByb2Nlc3MsIGFzIHN1Z2dlc3RlZCBieSBUaG9tYXMgTGVvbmFyZCwgc28gCisJYW4gImV2YWwgYGRidXMtbGF1bmNoIC0tZXhpdC13aXRoLXNlc3Npb25gIiB3aWxsIGFjdHVhbGx5IAorCXJldHVybgorCisyMDAzLTA3LTE2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBjb25maWd1cmUuaW46IHByaW50IG91dCBFWFBBTkRFRF8qIHZhcmlhYmxlcyBpbiB0aGUgc3VtbWFyeSBhdAorCXRoZSBlbmQ7IGNsZWFuIHVwIHRoZSBjb2RlIHRoYXQgY29tcHV0ZXMgRVhQQU5ERURfIHZhcmlhYmxlcyBhbmQKKwlnZXQgdGhlIG9uZXMgdXNpbmcgZXhlY19wcmVmaXggcmlnaHQuIFNob3VsZCBtYWtlIHRoaW5ncyB3b3JrCisJd2hlbiB5b3UgYnVpbGQgd2l0aG91dCAtLXByZWZpeAorCisyMDAzLTA2LTI5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBtb25vL1Rlc3QuY3MgKGNsYXNzIFRlc3QpOiBmaXJlIHVwIGEgbWFpbiBsb29wIGFuZCBydW4gaXQKKworCSogbW9uby9EQnVzLmNzIChEQnVzKTogZG9uJ3QgZ190aHJlYWRfaW5pdCBzaW5jZSBpdCBjYW4gb25seSBiZQorCWRvbmUgb25jZSwgdGhlIGFwcCBoYXMgdG8gZG8gaXQKKworMjAwMy0wNi0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogbW9uby9Db25uZWN0aW9uLmNzOiBzZXQgdXAgY29ubmVjdGlvbiB3aXRoIHRoZSBnbGliIG1haW4gbG9vcAorCisyMDAzLTA3LTAxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOiBjbGFyaWZ5IHRoZSBmb3JtYXQgb2YgYSB0eXBlIGNvZGUsCisJY2hhbmdlIHN1Z2dlc3RlZCBieSBKaW0gQmxhbmR5CisKKzIwMDMtMDYtMjkgIE1pbG9zbGF2IFRybWFjICA8bWl0ckB2b2xueS5jej4KKworCSogZG9jL01ha2VmaWxlLmFtOgorCSogdG9vbHMvTWFrZWZpbGUuYW06IERvbid0IGFzc3VtZSBzcmNkaXIgPT0gYnVpbGRkaXIuCisKKwkqIGRidXMvZGJ1cy1tZW1vcnkuYyAoZGJ1c19yZWFsbG9jKTogRG9uJ3QgY2hlY2sgZ3VhcmRzIGFmdGVyIHNocmlua2luZworCXRoZSBhbGxvY2F0ZWQgYmxvY2suCisJKF9kYnVzX21lbW9yeV90ZXN0KTogTmV3IGZ1bmN0aW9uLgorCSogZGJ1cy9kYnVzLXRlc3QuaDogQWRkIF9kYnVzX21lbW9yeV90ZXN0ICgpLgorCSogZGJ1cy9kYnVzLXRlc3QuYyAoZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX3J1bl90ZXN0cyk6IENhbGwgaXQuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRlY29kZV9oZWFkZXJfZGF0YSk6IFVzZSAlLjRzIGluc3RlYWQKKwlvZiAlYyVjJWMlYy4KKwkoZGJ1c19tZXNzYWdlX25ldyk6IFJlbW92ZSBvYnNvbGV0ZSBAdG9kby4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYyAoX2RidXNfbWFyc2hhbF9zZXRfaW50NjQpCisJKF9kYnVzX21hcnNoYWxfc2V0X3VpbnQ2NCk6IEZpeCBjb21tZW50LgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChhcHBlbmRfaW50X2ZpZWxkLCBhcHBlbmRfdWludF9maWVsZCk6IERvbid0CisJaGFyZGNvZGUgRklFTERfUkVQTFlfU0VSSUFMLgorCisJKiBkYnVzL2RidXMtbWFpbmxvb3AuYyAoX2RidXNfbG9vcF9yZW1vdmVfd2F0Y2gpCisJKF9kYnVzX2xvb3BfcmVtb3ZlX3RpbWVvdXQpOiBDYXN0IGZ1bmN0aW9uIHBvaW50ZXJzIHRvICh2b2lkICopIGZvciAlcAorCisJKiBjb25maWd1cmUuaW46IEFkZCAtRF9QT1NJWF9DX1NPVVJDRT0xOTkzMDlMIC1EQlNEX1NPVVJDRSB0byBDRkxBR1MKKwlhbmQgZGlzYWJsZSBEQlVTX1VTRV9BVE9NSUNfSU5UXzQ4NiB3aGVuIC0tZW5hYmxlLWFuc2kgaXMgdXNlZAorCisyMDAzLTA2LTI0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBtb25vLyouY3M6IFVzZSBJbnRQdHIuWmVybyBpbnN0ZWFkIG9mICgoSW50UHRyKSAwKQorCisyMDAzLTA2LTIzICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogY29uZmlndXJlLmluOgorCSogZ2NqLy5jdnNpZ25vcmU6CisJKiBnY2ovSGVsbG8uamF2YToKKwkqIGdjai9NYWtlZmlsZS5hbToKKwkqIGdjai9UZXN0TWVzc2FnZS5qYXZhOiAoVGVzdE1lc3NhZ2UpLCAoVGVzdE1lc3NhZ2UubWFpbik6CisJKiBnY2ovb3JnLy5jdnNpZ25vcmU6CisJKiBnY2ovb3JnL01ha2VmaWxlLmFtOgorCSogZ2NqL29yZy9mcmVlZGVza3RvcC8uY3ZzaWdub3JlOgorCSogZ2NqL29yZy9mcmVlZGVza3RvcC9NYWtlZmlsZS5hbToKKwkqIGdjai9vcmcvZnJlZWRlc2t0b3AvZGJ1cy8uY3ZzaWdub3JlOgorCSogZ2NqL29yZy9mcmVlZGVza3RvcC9kYnVzL01ha2VmaWxlLmFtOgorCSogZ2NqL29yZy9mcmVlZGVza3RvcC9kYnVzL01lc3NhZ2UuamF2YTogKE1lc3NhZ2UpLAorCShNZXNzYWdlLk1lc3NhZ2UpOgorCSogZ2NqL29yZy9mcmVlZGVza3RvcC9kYnVzL25hdE1lc3NhZ2UuY2M6CisJRml4IHRoZSBidWlsZCBzeXN0ZW0uCisKKzIwMDMtMDYtMjIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIG1vbm8vQ29ubmVjdGlvbi5jczogYWRkIG1vcmUgYmluZGluZ3MKKworCSogZGJ1cy9kYnVzLXRocmVhZHMuYyAoZGJ1c190aHJlYWRzX2luaXQpOiBhbGxvdyBjYWxsaW5nIHRoaXMKKwltb3JlIHRoYW4gb25jZS4KKworMjAwMy0wNi0yMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogbW9uby9Db25uZWN0aW9uLmNzLCBtb25vL0RCdXMuY3MsIG1vbm8vRXJyb3IuY3M6CisJU3RhcnQgd3JhcHBpbmcgbW9yZSBzdHVmZi4KKworMjAwMy0wNi0yMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogbW9uby9NZXNzYWdlLmNzOiBpbXBsZW1lbnQgTWVzc2FnZS5XcmFwKCkgdGhhdCBlbnN1cmVzIHdlIG9ubHkKKwloYXZlIGEgc2luZ2xlIEMjIHdyYXBwZXIgcGVyIERCdXNNZXNzYWdlLCBhc3N1bWluZyBpdCB3b3JrcyB3aGljaAorCWl0IHByb2JhYmx5IGRvZXNuJ3QuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9hbGxvY2F0ZV9kYXRhX3Nsb3QpOiBuZXcKKwkoZGJ1c19tZXNzYWdlX2ZyZWVfZGF0YV9zbG90KTogbmV3CisJKGRidXNfbWVzc2FnZV9zZXRfZGF0YSk6IG5ldworCShkYnVzX21lc3NhZ2VfZ2V0X2RhdGEpOiBuZXcKKworMjAwMy0wNi0yMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLWRhdGFzbG90LmMgKF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfdW5yZWYpCisJKF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfYWxsb2MpOiByZXdvcmsgdGhlc2UgdG8ga2VlcCBhCisJcmVmZXJlbmNlIGNvdW50IG9uIGVhY2ggc2xvdCBhbmQgYXV0b21hdGljYWxseSBtYW5hZ2UgYSBnbG9iYWwKKwlzbG90IElEIHZhcmlhYmxlIHBhc3NlZCBpbiBieSBhZGRyZXNzCisKKwkqIGJ1cy9idXMuYzogY29udmVydCB0byBuZXcgZGF0YXNsb3QgQVBJCisKKwkqIGRidXMvZGJ1cy1idXMuYzogY29udmVydCB0byBuZXcgZGF0YXNsb3QgQVBJCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IGNvbnZlcnQgdG8gbmV3IGRhdGFzbG90IEFQSQorCisJKiBkYnVzL2RidXMtc2VydmVyLmM6IGNvbnZlcnQgdG8gbmV3IGRhdGFzbG90IEFQSQorCisJKiBnbGliL2RidXMtZ21haW4uYzogZGl0dG8KKworCSogYnVzL3Rlc3QuYzogZGl0dG8KKworCSogYnVzL2Nvbm5lY3Rpb24uYzogZGl0dG8KKworMjAwMy0wNi0yMiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIEFNX1BST0dfR0NKIGFuZCBtb3ZlIEFNX1BST0dfTElCVE9PTAorCWFmdGVyIHRoZSBnY2ogY2hlY2tzIHNvIHRoYXQgdGhlIGNvcnJlY3QgY29uZmlndXJhdGlvbiB0YWdzCisJd2lsbCBiZSBhZGRlZCB0byBsaWJ0b29sLgorCisJKiBkYnVzLWdsaWItMS5wYy5pbjogTm8gbmVlZCB0byBzcGVjaWZ5IGFueSBpbmNsdWRlcyBzaW5jZQorCWRidXMtMS5wYy5pbiBoYXMgdGhvc2UuCisKKzIwMDMtMDYtMjIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIG1vbm8vKiwgZ2NqLyosIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuYW06CisJQ2hlY2sgaW4gbWFrZWZpbGVzIGFuZCBzdWJkaXJzIGZvciBtb25vIGFuZCBnY2ogYmluZGluZ3MuCisJTmVpdGhlciBiaW5kaW5nIGFjdHVhbGx5IGV4aXN0cywganVzdCB0cnlpbmcgdG8gZ2V0IHRocm91Z2gKKwlhbGwgdGhlIGJ1aWxkIGFuZCBvdGhlciBib3JpbmcgYml0cy4KKworMjAwMy0wNi0yMSAgUGhpbGlwIEJsdW5kZWxsICA8cGhpbGJAZ251Lm9yZz4KKworCSogdG9vbHMvZGJ1cy1tb25pdG9yLjE6IFVwZGF0ZWQuCisKKwkqIHRvb2xzL2RidXMtc2VuZC4xOiBMaWtld2lzZS4KKworMjAwMy0wNi0yMCAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jICh1bml4X2hhbmRsZV93YXRjaCk6IENoZWNrCisJZm9yIGhhbmd1cCBhbmQgZXJyb3IgYWZ0ZXIgY2hlY2tpbmcgcmVhZCBzbyB3ZSB3b24ndCBkaXNjYXJkCisJcGVuZGluZyBkYXRhIGlmIGJvdGggaGFuZ3VwIGFuZCByZWFkIGFyZSBzZXQuCisKKzIwMDMtMDYtMTkgIFBoaWxpcCBCbHVuZGVsbCAgPHBoaWxiQGdudS5vcmc+CisKKwkqIHRvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5jIChwcmludF9tZXNzYWdlKTogSGFuZGxlIEJPT0xFQU4uCisKKwkqIHRvb2xzL2RidXMtc2VuZC5jOiBBY2NlcHQgYm90aCAtLXN5c3RlbSBhbmQgLS1zZXNzaW9uLgorCisJKiB0b29scy9kYnVzLW1vbml0b3IuYzogU2FtZSBoZXJlLgorCisyMDAzLTA2LTE5ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZ2xpYi9kYnVzLWdsaWIuaDogRml4IHNvIHRoYXQgZGJ1cy1nbGliLmggY2FuIGJlIHVzZWQKKwlmcm9tIEMrKyAoUGF0Y2ggYnkgTWlsb3NsYXYgVHJtYWMpLgorCisyMDAzLTA2LTE1ICBKb2UgU2hhdyAgPGpvZUBhc3NiYXJuLmNvbT4KKworCSogY29uZmlndXJlLmluOiBDaGVjayBmb3Igc29ja2xlbl90LgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOiBEZWZpbmUgc29ja2xlbl90IGlmIGl0J3Mgbm90IGRlZmluZWQuCisKKwkqIHRlc3QvdGVzdC1zZWdmYXVsdC5jOiBBZGQgI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKwkqIHRvb2xzL01ha2VmaWxlLmFtOiBBZGQgREJVU19YX0NGTEFHUyB0byB0aGUgSU5DTFVERVMgc2luY2UKKwlkYnVzLWxhdW5jaCBuZWVkcyBpdC4KKworMjAwMy0wNi0wOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2xpc3Rlbl91bml4X3NvY2tldCk6IGRvbid0IHVzZQorCVNVTl9MRU4sIGl0IGJyZWFrcyBhYnN0cmFjdCBzb2NrZXQgdXNhZ2UKKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c192ZXJib3NlX3JlYWwpOiBvbmx5IHByaW50IFBJRCBhdAorCXN0YXJ0cyBvZiBsaW5lcy4KKworMjAwMy0wNi0wNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLXNlcnZlci5jIChkYnVzX3NlcnZlcl9saXN0ZW4pOiBhbGxvdyBhYnN0cmFjdCBzb2NrZXRzCisJdXNpbmcgdW5peDphYnN0cmFjdD0vZm9vLCBhbmQgd2hlbiBsaXN0ZW5pbmcgaW4gYSB0bXBkaXIKKwlpLmUuIHVuaXg6dG1wZGlyPS90bXAsIGFsd2F5cyB1c2UgYWJzdHJhY3Qgc29ja2V0cyBpZiB3ZSBjYW4uCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYyAoX2RidXNfdHJhbnNwb3J0X29wZW4pOiBzdXBwb3J0CisJdW5peDphYnN0cmFjdD0vZm9vCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItdW5peC5jIChfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl9kb21haW5fc29ja2V0KToKKwlzdXBwb3J0IGFic3RyYWN0IHNvY2tldHMKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMKKwkoX2RidXNfdHJhbnNwb3J0X25ld19mb3JfZG9tYWluX3NvY2tldCk6IHN1cHBvcnQgYWJzdHJhY3Qgc29ja2V0cworCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19jb25uZWN0X3VuaXhfc29ja2V0KTogYWRkICJhYnN0cmFjdCIKKwl0b2dnbGUgYXMgYW4gYXJndW1lbnQsIGltcGxlbWVudCBhYnN0cmFjdCBuYW1lc3BhY2Ugc3VwcG9ydAorCShfZGJ1c19saXN0ZW5fdW5peF9zb2NrZXQpOiBkaXR0bworCisJKiBjb25maWd1cmUuaW46IGFkZCAtLWVuYWJsZS1hYnN0cmFjdC1zb2NrZXRzIGFuZCBpbXBsZW1lbnQKKwlhIGNvbmZpZ3VyZSBjaGVjayBmb3IgYXV0b2RldGVjdGlvbiBvZiB0aGUgcmlnaHQgdmFsdWUuCisKKzIwMDMtMDYtMDEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIHRvb2xzL2RidXMtY2xlYW51cC1zb2NrZXRzLmM6IGFkZCB1dGlsaXR5IHRvIGNsZWFuIHVwIHNvY2tldHMKKwlpbiAvdG1wICh0aG91Z2ggb24gTGludXggdGhpcyB3aWxsIGVuZCB1cCBiZWluZyB1c2VsZXNzLAorCXdoZW4gd2UgYWRkIGFic3RyYWN0IG5hbWVzcGFjZSBzdXBwb3J0KQorCisJKiBjb25maWd1cmUuaW46IGRlZmluZSBEQlVTX1NFU1NJT05fU09DS0VUX0RJUiBpbiBhZGRpdGlvbiB0bworCXN1YnN0J2luZyBpdAorCisyMDAzLTA1LTI4ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiB0b29scy9kYnVzLW1vbml0b3IuYyAobWFpbik6IEZpeCBzaWxseSB0eXBvIChzLy0tc2Vzc2lvbi8tLXN5c3RlbS8pLgorCisyMDAzLTA1LTE4ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX25ldyk6IFJlbW92ZSBAdG9kby4KKworMjAwMy0wNS0xNyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAZ251Lm9yZz4KKworCSogdG9vbHMvZGJ1cy1zZW5kLmM6IERvbid0IGV4aXQgd2l0aCBhbiBlcnJvciBjb2RlIGlmIC0taGVscCB3YXMKKwlwYXNzZWQuICBEZWZhdWx0IHRvIHVzaW5nIHRoZSBzZXNzaW9uIGJ1cyBpbnN0ZWFkIG9mIHRoZSBzeXN0ZW0KKwlvbmUuCisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLmM6IERpdHRvLgorCisJKiB0b29scy9kYnVzLW1vbml0b3IuYzogRGl0dG8uCisKKwkqIHRvb2xzL2RidXMtc2VuZC4xOiBVcGRhdGUgd2l0aCBuZXcgYXJndW1lbnRzLgorCisJKiB0b29scy9kYnVzLWxhdW5jaC5jOiBFbWl0IGNvZGUgdG8gZXhwb3J0IHZhcmlhYmxlcy4gIE5ldworCWFyZ3VtZW50cyAtcyBhbmQgLWMgdG8gc3BlY2lmeSBzaGVsbCBzeW50YXgsIGFuZCBhIGJpdCBvZiBjb2RlIHRvCisJYXV0b2RldGVjdCBzeW50YXguICBBbHNvLCBhbGxvdyBzcGVjaWZ5aW5nIGEgcHJvZ3JhbSB0byBydW4uCisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLjE6IFVwZGF0ZSB3aXRoIG5ldyBhcmd1bWVudHMuCisKKwkqIHRvb2xzL2RidXMtc2VuZC4xOiBEaXR0by4KKworCSogdG9vbHMvZGJ1cy1tb25pdG9yLjE6IERpdHRvLgorCisyMDAzLTA1LTE3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvY29uZmlnLXBhcnNlci5jIChtZXJnZV9pbmNsdWRlZCk6IG1lcmdlIGluIHBvbGljaWVzIGZyb20KKwljaGlsZCBjb25maWd1cmF0aW9uIGZpbGUuCisKKwkqIGJ1cy9wb2xpY3kuYyAoYnVzX3BvbGljeV9tZXJnZSk6IGZ1bmN0aW9uIHRvIG1lcmdlIHR3byBwb2xpY2llcworCXRvZ2V0aGVyCisKKzIwMDMtMDUtMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiBkaXNhYmxlIHZlcmJvc2UgbG9jayBzcGV3CisKKwkqIHRvb2xzL2RidXMtc2VuZC5jOiBhZGQgLS1wcmludC1yZXBseSBjb21tYW5kIGxpbmUgb3B0aW9uCisKKwkqIHRvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5oIChwcmludF9tZXNzYWdlKTogbmV3IHV0aWwgZnVuY3Rpb24KKwlzaGFyZWQgYnkgZGJ1cy1zZW5kIGFuZCBkYnVzLW1vbml0b3IKKworCSogdG9vbHMvZGJ1cy1tb25pdG9yLmMgKGhhbmRsZXJfZnVuYyk6IGV4aXQgb24gZGlzY29ubmVjdAorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYyAoZG9fcmVhZGluZyk6IGlmIHRoZSB0cmFuc3BvcnQgaXMKKwlkaXNjb25uZWN0ZWQsIGRvbid0IHRyeSB0byB1c2UgdGhlIHJlYWRfd2F0Y2gKKworCSogZGJ1cy9kYnVzLXdhdGNoLmMgKGRidXNfd2F0Y2hfZ2V0X2VuYWJsZWQpOiBhc3NlcnQgd2F0Y2ggIT0gTlVMTAorCXNvIHdlIGNhbiBmaW5kIHRoaXMgYnVnIG1vcmUgZWFzaWx5CisKKzIwMDMtMDUtMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvcG9saWN5LmMgKGZyZWVfcnVsZV9saXN0X2Z1bmMpOiBhdm9pZCBhIGNyYXNoIHdoZW4gcGFzc2VkCisJTlVMTCBhcyBEQnVzSGFzaFRhYmxlIGlzIGFubm95aW5nbHkgbGlrZWx5IHRvIGRvLgorCisyMDAzLTA1LTE2ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiB0b29scy9kYnVzLW1vbml0b3IuYzogQWRkIC0tc2Vzc2lvbiBhcmd1bWVudCBhbmQgdXNhZ2UoKQorCWZ1bmN0aW9uLgorCisJKiB0b29scy9kYnVzLW1vbml0b3IuMTogVXBkYXRlIHdpdGggbmV3IC0tc2Vzc2lvbiBhcmcuCisKKwkqIGJ1cy9NYWtlZmlsZS5hbSAoaW5zdGFsbC1kYXRhLWhvb2spOiBDcmVhdGUKKwkkKGxpYmRpcikvZGJ1cy0xLjAvc2VydmljZXMgc28gdGhhdCB0aGUgc2Vzc2lvbiBidXMgaXMgaGFwcHkuCisKKzIwMDMtMDUtMTUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19hdG9taWNfZGVjLCBfZGJ1c19hdG9taWNfaW5jKTogd29yaworCW9uIG5vbi14ODYuIGlmZGVmJ3MgYXJlIGV2aWwuCisKKzIwMDMtMDUtMTUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IDAuMTEKKworCSogTkVXUzogdXBkYXRlCisKKwkqIGJ1cy9NYWtlZmlsZS5hbSAoaW5pdGRkaXIpOiBhcHBhcmVudGx5IHdlIGFyZSBzdXBwb3NlZCB0byBwdXQKKwlpbml0IHNjcmlwdHMgaW4gL2V0Yy9yYy5kL2luaXQuZCBub3QgL2V0Yy9pbml0LmQKKworCSogYnVzL01ha2VmaWxlLmFtOiByZW1vdmUgdGhlICJ5b3UgbXVzdCAtLWVuYWJsZS10ZXN0cyB0byBtYWtlCisJY2hlY2siIGFzIGl0IGJyb2tlIGRpc3RjaGVjaworCisJKiBidXMvTWFrZWZpbGUuYW0gKGluc3RhbGwtZGF0YS1ob29rKTogY3JlYXRlIC9ldGMvZGJ1cy0xL3N5c3RlbS5kCisKKzIwMDMtMDUtMTMgIEphbWVzIFdpbGxjb3ggIDxqd2lsbGNveEBnbm9tZS5vcmc+CisKKwkqIGNvbmZpZ3VyZS5pbjoKKwkqIGJ1cy9hY3RpdmF0aW9uLmM6IChidXNfYWN0aXZhdGlvbl9zZXJ2aWNlX2NyZWF0ZWQpLAorCShidXNfYWN0aXZhdGlvbl9hY3RpdmF0ZV9zZXJ2aWNlKToKKwkqIGJ1cy9kcml2ZXIuYzogKGJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2RlbGV0ZWQpLAorCShidXNfZHJpdmVyX3NlbmRfc2VydmljZV9jcmVhdGVkKSwgKGJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2xvc3QpLAorCShidXNfZHJpdmVyX3NlbmRfc2VydmljZV9hY3F1aXJlZCksCisJKGJ1c19kcml2ZXJfc2VuZF93ZWxjb21lX21lc3NhZ2UpLAorCShidXNfZHJpdmVyX2hhbmRsZV9saXN0X3NlcnZpY2VzKToKKwkqIGJ1cy9zZXNzaW9uLmNvbmYuaW46CisJKiBkYnVzL2RidXMtYnVzLmM6IChkYnVzX2J1c19hY3F1aXJlX3NlcnZpY2UpLAorCShkYnVzX2J1c19zZXJ2aWNlX2V4aXN0cyksIChkYnVzX2J1c19hY3RpdmF0ZV9zZXJ2aWNlKToKKwkqIGRidXMvZGJ1cy1idXMuaDoKKworCUFkZCBzb21lIGNvbnZlbmllbmNlIEFQSSB3aGljaCBsZXRzIHlvdSBhY3RpdmF0ZSBhIHNlcnZpY2UsIGFuZCBkaWQgYQorCWJ1bmNoIG9mIHMvMC9EQlVTX1RZUEVfSU5WQUxJRC8gaW4gY2FsbHMgdG8gZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzKCkKKwlhbmQgZGJ1c19tZXNzYWdlX2dldF9hcmdzKCkKKworMjAwMy0wNS0xMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYyAoX2RidXNfbWFyc2hhbF92YWxpZGF0ZV9hcmcpOiBmaXggdG8gYXZvaWQKKwljYWxsaW5nIF9kYnVzX21hcnNoYWxfdmFsaWRhdGVfYXJnKCkgZm9yIGV2ZXJ5IGJ5dGUgaW4gYSBieXRlCisJYXJyYXksIGV0Yy4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtaGFuZGxlci5jOiB1c2UgYXRvbWljIHJlZmVyZW5jZSBjb3VudGluZyB0bworCXJlZHVjZSBudW1iZXIgb2YgbG9ja3Mgc2xpZ2h0bHk7IHRoZSBnbG9iYWwgbG9jayBpbiBoZXJlIHN1Y2tzCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMKKwkoX2RidXNfY29ubmVjdGlvbl91cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2spOiB2YXJpYW50IG9mCisJdXBkYXRlX2Rpc3BhdGNoX3N0YXR1cyB0aGF0IGNhbiBiZSBjYWxsZWQgd2l0aCBsb2NrIGhlbGQ7IHRoZW4gdXNlCisJaW4gYSBjb3VwbGUgcGxhY2VzIHRvIHJlZHVjZSBsb2NraW5nL3VubG9ja2luZworCShkYnVzX2Nvbm5lY3Rpb25fc2VuZCk6IGhvbGQgdGhlIGxvY2sgb3ZlciB0aGUgd2hvbGUgZnVuY3Rpb24KKwlpbnN0ZWFkIG9mIGFjcXVpcmluZyBpdCB0d2ljZS4KKworCSogZGJ1cy9kYnVzLXRpbWVvdXQuYyAoX2RidXNfdGltZW91dF9uZXcpOiBoYW5kbGUgT09NCisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGJ1c19jb25uZWN0aW9uc19zZXR1cF9jb25uZWN0aW9uKTogZml4IGFjY2VzcworCXRvIGFscmVhZHktZnJlZWQgbWVtb3J5LgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiBrZWVwIGEgbGl0dGxlIGNhY2hlIG9mIGxpbmtlZCBsaXN0CisJbm9kZXMsIHRvIGF2b2lkIHVzaW5nIHRoZSBnbG9iYWwgbGlua2VkIGxpc3QgYWxsb2MgbG9jayBpbiB0aGUKKwlub3JtYWwgc2VuZC1tZXNzYWdlIGNhc2UuIEluc3RlYWQgd2UganVzdCB1c2UgdGhlIGNvbm5lY3Rpb24gbG9jaworCXRoYXQgd2UgYWxyZWFkeSBoYXZlIHRvIHRha2UuCisKKwkqIGRidXMvZGJ1cy1saXN0LmMgKF9kYnVzX2xpc3RfZmluZF9sYXN0KTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2F0b21pY19pbmMsIF9kYnVzX2F0b21pY19kZWMpOgorCWNoYW5nZSB0byB1c2UgYSBzdHJ1Y3QgZm9yIHRoZSBhdG9taWMgdHlwZTsgZml4IGRvY3MsCisJdGhleSByZXR1cm4gdmFsdWUgYmVmb3JlIGluY3JlbWVudCwgbm90IGFmdGVyIGluY3JlbWVudC4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfYXBwZW5kXzRfYWxpZ25lZCkKKwkoX2RidXNfc3RyaW5nX2FwcGVuZF84X2FsaWduZWQpOiBuZXcgZnVuY3Rpb25zIHRvIHRyeSB0bworCW1pY3Jvb3B0aW1pemUgdGhpcyBvcGVyYXRpb24uCisJKHJlYWxsb2NhdGVfZm9yX2xlbmd0aCk6IGJyZWFrIHRoaXMgb3V0IG9mIHNldF9sZW5ndGgoKSwgdG8KKwlpbXByb3ZlIHByb2ZpbGUgaW5mbywgYW5kIGFsc28gc28gd2UgY2FuIGNvbnNpZGVyIGlubGluaW5nIHRoZQorCXNldF9sZW5ndGgoKSBwYXJ0LgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfbmV3X2VtcHR5X2hlYWRlcik6IGluaXQgZGF0YQorCXN0cmluZ3Mgd2l0aCBzb21lIHByZWFsbG9jYXRpb24sIGN1dHMgZG93biBvbiBvdXIgY2FsbHMgdG8gcmVhbGxvYworCWEgZmFpciBiaXQuIFRob3VnaCBpZiB3ZSBjYW4gZ2V0IHRoZSAibW92ZSBlbnRpcmUgc3RyaW5nIHRvIGVtcHR5CisJc3RyaW5nIiBvcHRpbWl6YXRpb24gYmVsb3cgdG8ga2ljayBpbiBoZXJlLCBpdCB3b3VsZCBiZSBiZXR0ZXIuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX21vdmUpOiBqdXN0IGNhbGwKKwlfZGJ1c19zdHJpbmdfbW92ZV9sZW4KKwkoX2RidXNfc3RyaW5nX21vdmVfbGVuKTogYWRkIGEgc3BlY2lhbCBjYXNlIGZvciBtb3ZpbmcKKwlhbiBlbnRpcmUgc3RyaW5nIGludG8gYW4gZW1wdHkgc3RyaW5nOyB3ZSBjYW4ganVzdAorCXN3YXAgdGhlIHN0cmluZyBkYXRhIGluc3RlYWQgb2YgZG9pbmcgYW55IHJlYWxsb2NzLgorCShfZGJ1c19zdHJpbmdfaW5pdF9wcmVhbGxvY2F0ZWQpOiBuZXcgZnVuY3Rpb24KKworMjAwMy0wNS0xMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCVdyaXRlIGEgInRlc3QtcHJvZmlsZSIgdGhhdCBkb2VzIGVjaG8gY2xpZW50LXNlcnZlciB3aXRoIHRocmVhZHM7CisJcHJvZmlsZSByZXZlYWxzIGxvY2sgY29udGVudGlvbiwgbWVtY3B5L3JlYWxsb2Mgb2YgYnVmZmVycywgYW5kCisJVVRGLTggdmFsaWRhdGlvbiBhcyBob3Qgc3BvdHMuIDIwJSBvZiBsb2NrIGNvbnRlbnRpb24gZWxpbWluYXRlZAorCXdpdGggZGJ1c19hdG9taWNfaW5jL2RlYyBpbXBsZW1lbnRhdGlvbiBvbiB4ODYuICBNdWNoIHJlbWFpbmluZworCWNvbnRlbnRpb24gaXMgZ2xvYmFsIG1lbXBvb2wgbG9ja3MgZm9yIEdMaXN0IGFuZCBEQnVzTGlzdC4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfYXRvbWljX2luYywgX2RidXNfYXRvbWljX2RlYyk6IGFkZAorCXg4NiBpbXBsZW1lbnRhdGlvbgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChzdHJ1Y3QgREJ1c0Nvbm5lY3Rpb24pOiB1c2UKKwlkYnVzX2F0b21pY190IGZvciB0aGUgcmVmZXJlbmNlIGNvdW50CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKHN0cnVjdCBEQnVzTWVzc2FnZSk6IGRlY2xhcmUKKwlkYnVzX2F0b21pY190IHZhbHVlcyBhcyB2b2xhdGlsZQorCisJKiBjb25maWd1cmUuaW46IGNvZGUgdG8gZGV0ZWN0IGFiaWxpdHkgdG8gdXNlIGF0b21pYyBpbnRlZ2VyCisJb3BlcmF0aW9ucyBpbiBhc3NlbWJseSwgZnJvbSBHTGliIHBhdGNoCisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYyAoX2RidXNfdmVyYm9zZV9yZWFsKTogY2FsbCBnZXRwaWQgZXZlcnkKKwl0aW1lLCB0aXJlZCBvZiBpdCBiZWluZyB3cm9uZyBpbiB0aHJlYWRzIGFuZCBmb3JrZWQgcHJvY2Vzc2VzCisKKwkqIGdsaWIvdGVzdC1wcm9maWxlLmM6IGEgbGl0dGxlIHByb2dyYW0gdG8gYm91bmNlIG1lc3NhZ2VzIGJhY2sKKwlhbmQgZm9ydGggYmV0d2VlbiB0aHJlYWRzIGFuZCBlYXQgQ1BVCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IGFkZCBkZWJ1ZyBzcGV3IG1hY3JvcyBmb3IgZGVidWdnaW5nCisJdGhyZWFkIGxvY2tzOyBpbmNsdWRlIGNvbmZpZy5oIGF0IHRvcDsgZml4IGRlYWRsb2NrIGluCisJZGJ1c19jb25uZWN0aW9uX2ZsdXNoKCkKKworMjAwMy0wNS0wOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLXNwYXduLmM6IHMvX2V4aXQvZXhpdC8gYmVjYXVzZSBpdCB3YXMga2VlcGluZyBnY292CisJZGF0YSBmcm9tIGdldHRpbmcgd3JpdHRlbiwgYW5kIHRoZXJlIHdhc24ndCBhIGdvb2QgcmVhc29uIHRvCisJdXNlIF9leGl0IHJlYWxseS4KKworCSogdGVzdC9kZWNvZGUtZ2Nvdi5jIChtYXJrX2luc2lkZV9kYnVzX2J1aWxkX3Rlc3RzKTogZG9uJ3QgY291bnQKKwlkYnVzX3ZlcmJvc2UgbGluZXMgaW4gdGVzdCBjb3ZlcmFnZQorCShtYWluKTogYWRkIGxpc3Qgb2YgZnVuY3Rpb25zIHNvcnRlZCBieSAjIG9mIHVudGVzdGVkIGJsb2NrcworCXRvIHRoZSBjb3ZlcmFnZSByZXBvcnQKKworCSogZGJ1cy9kYnVzLW1lbXBvb2wuYzogcHV0IHNvbWUgdGVzdC1vbmx5IGNvZGUgaW4gREJVU19CVUlMRF9URVNUUworCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jIChfZGJ1c19tYXJzaGFsX3Rlc3QpOiBleHRlbmQgdGVzdCBjb3ZlcmFnZQorCisJKiBkYnVzL2RidXMtbWVzc2FnZS1oYW5kbGVyLmMgKF9kYnVzX21lc3NhZ2VfaGFuZGxlcl90ZXN0KToKKwlleHRlbmQgdGVzdCBjb3ZlcmFnZQorCisJKiB0ZXN0L2RhdGEvYXV0aC9jYW5jZWwuYXV0aC1zY3JpcHQ6IHRlc3QgY2FuY2VsaW5nIGFuCisJYXV0aGVudGljYXRpb24KKworCSogZGJ1cy9NYWtlZmlsZS5hbTogcmVtb3ZlIGRidXMtc2VydmVyLWRlYnVnLltoY10gZm9yIG5vdywgYXMgdGhleQorCWFyZW4ndCB1c2VkLiBpbiBDVlMgaGlzdG9yeSBpZiB3ZSBlbmQgdXAgbmVlZGluZyB0aGVtLgorCisyMDAzLTA1LTA0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS1oYW5kbGVyLmMgKF9kYnVzX21lc3NhZ2VfaGFuZGxlcl90ZXN0KTogYWRkCisJdW5pdCB0ZXN0CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmMgKF9kYnVzX2RlbWFyc2hhbF9zdHJpbmdfYXJyYXkpOiBmaXggdGhpcworCWZ1bmN0aW9uLCB3aGljaCBhc3N1bWVkIGxlbmd0aCB3YXMgaW4gIyBvZiBzdHJpbmdzLCBub3QgYnl0ZXMKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoX2RidXNfbWVzc2FnZV90ZXN0KTogYWRkIHRlc3RzIGZvciBzb21lCisJbWlzc2luZyBjb3ZlcmFnZQorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jCisJKF9kYnVzX2Nvbm5lY3Rpb25fcXVldWVfcmVjZWl2ZWRfbWVzc2FnZSk6IGRpc2FibGUgZnVuY3Rpb24gZm9yCisJbm93LCB3ZSBhcmUgb25seSB1c2luZyBpdCBpbiB0ZXN0IG1vZGUKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoX2RidXNfbWVzc2FnZV9sb2FkZXJfcXVldWVfbWVzc2FnZXMpOgorCXJlbW92ZSBhIG1pc3Rha2VuIEZJWE1FCisKKzIwMDMtMDUtMDQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9wcmVhbGxvY2F0ZV9zZW5kKToKKwl1bmxvY2sgbXV0ZXggb24gc3VjY2Vzc2Z1bCByZXR1cm4sIHBhdGNoIGZyb20gQW5kZXJzIEd1c3RhZnNzb24KKworMjAwMy0wNS0wNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy1nbGliLTEucGMuaW4gKFJlcXVpcmVzKTogZml4IGRlcGVuZGVuY2llcywgZnJvbQorCUFuZGVycyBHdXN0YWZzc29uCisKKzIwMDMtMDUtMDQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLmM6IGltcGxlbWVudAorCisJKiBidXMvbWFpbi5jIChtYWluKSwgYnVzL2J1cy5jIChidXNfY29udGV4dF9uZXcpOgorCWltcGxlbWVudCAtLXByaW50LXBpZCBhbmQgLS1mb3JrCisKKzIwMDMtMDUtMDMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtYWRkcmVzcy5jIChkYnVzX3BhcnNlX2FkZHJlc3MpOiBmaXggYnVnIHdoZW4gYSBrZXkgaW4KKwl0aGUgYWRkcmVzcyBoYWQgbm8gdmFsdWUsIGFuZCBhZGQgdG8gdGVzdCBzdWl0ZS4gRml4IGFuZAorCXJlZ3Jlc3Npb24gdGVzdCBmcm9tIE1pbG9zbGF2IFRybWFjCisKKzIwMDMtMDUtMDMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy13YXRjaC5jIChkYnVzX3dhdGNoX2hhbmRsZSk6IHdhcm4gYW5kIHJldHVybiBpZiBhCisJd2F0Y2ggaXMgaW52YWxpZCB3aGVuIGhhbmRsZWQKKworCSogdG9vbHMvTWFrZWZpbGUuYW0sIHRvb2xzL2RidXMtbGF1bmNoLmMsIHRvb2xzL2RidXMtbGF1bmNoLjE6IGFkZAorCWRidXMtbGF1bmNoIHV0aWxpdHkgdG8gbGF1bmNoIHRoZSBidXMgZnJvbSBhIHNoZWxsIHNjcmlwdC4gIERpZG4ndAorCWFjdHVhbGx5IGltcGxlbWVudCBkYnVzLWxhdW5jaCB5ZXQsIGl0J3MganVzdCBhIHBsYWNlaG9sZGVyIHN0aWxsLgorCisyMDAzLTA1LTAzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvTWFrZWZpbGUuYW0sIGJ1cy9kYnVzLWRhZW1vbi0xLjEuaW46IG1hbiBwYWdlIGZvciB0aGUKKwlkYWVtb247IGFsc28gZG9jdW1lbnRzIGRhZW1vbiBjb25maWcgZmlsZSwgc28gcmVwbGFjZXMKKwlkb2MvY29uZmlnLWZpbGUudHh0LiBDb3JyZWN0ZWQgc29tZSBzdHVmZiBmcm9tIGNvbmZpZy1maWxlLnR4dCBpbgorCXRoZSBwcm9jZXNzIG9mIG1vdmluZyBpdC4KKworMjAwMy0wNS0wMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogdG9vbHMvTWFrZWZpbGUuYW0sIHRvb2xzL2RidXMtc2VuZC4xLCB0b29scy9kYnVzLW1vbml0b3IuMToKKwlhZGQgc29tZSBtYW4gcGFnZXMKKworMjAwMy0wNS0wMyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoZmlsbF91c2VyX2luZm8pOiBUZXN0IGFnYWluc3QKKwlEQlVTX1VJRF9VTlNFVCB0byBkZXRlcm1pbmUgd2hldGhlciB0byBkbyBhIHVpZCBsb29rdXAgb3Igbm90LgorCisJKiBNYWtlZmlsZS5hbTogVXBkYXRlIHRvIHVzZSBuZXcgLnBjIHZlcnNpb25pbmcgc2NoZW1lLgorCisyMDAzLTA1LTAyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL3N5c3RlbS5jb25mLmluOiBhbGxvdyBzZW5kL3JlY2VpdmUgdG8vZnJvbSBtZXNzYWdlIGJ1cworCXNlcnZpY2UKKworMjAwMy0wNC0zMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogcHJpbnQgYSBub3RlIHdoZW4gYnVpbGRpbmcgd2l0aCB1bml0IHRlc3RzIGFuZAorCXdpdGhvdXQgYXNzZXJ0aW9ucworCisyMDAzLTA0LTMwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogTWFrZWZpbGUuYW06IGFkZCBhIGNoZWNrLWxvY2FsIHRoYXQgY29tcGxhaW5zIGlmIHlvdSBkaWRuJ3QKKwljb25maWd1cmUgd2l0aCAtLWVuYWJsZS10ZXN0cworCisyMDAzLTA0LTI5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWdtYWluLmM6IGRvY3MgY2xlYW51cHMKKworCSogZGJ1cy9kYnVzLXR5cGVzLmg6IGFkZCBkb2NzIG9uIGludDY0IHR5cGVzCisKKwkqIGRidXMvZGJ1cy1tZW1vcnkuYzogZml4IGRvY3MgdG8gYXZvaWQgcHV0dGluZyBwcml2YXRlIEFQSSBpbgorCXB1YmxpYyBBUEkgZG9jcyBzZWN0aW9uCisKKzIwMDMtMDQtMjkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzLTEucGMuaW4sIGRidXMtZ2xpYi0xLnBjLmluOiByZW5hbWUgdGhlc2UgZnJvbQorCWRidXMtMS4wLnBjLmluLCBkYnVzLWdsaWItMS4wLnBjLmluLiBBcyB0aGVzZSBjaGFuZ2Ugd2l0aCB0aGUKKwlwYXJhbGxlbCBpbnN0YWxsIEFQSSB2ZXJzaW9uLCBub3Qgd2l0aCB0aGUgRC1CVVMgcGFja2FnZSB2ZXJzaW9uLgorCisJKiBIQUNLSU5HOiBtb3ZlIHNvbWUgb2YgUkVBRE1FIG92ZXIgaGVyZQorCisJKiBSRUFETUU6IHVwZGF0ZXMsIGFuZCBkb2N1bWVudCBBUEkvQUJJIHBvbGljeQorCisJKiBjb25maWd1cmUuaW46IHJlaW5kZW50YXRpb24KKworMjAwMy0wNC0yOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy5oOiBhZGQgInlvdSBoYXZlIHRvIGRlZmluZSBEQlVTX0FQSV9TVUJKRUNUX1RPX0NIQU5HRQorCXRvIHVzZSB0aGlzIGxpYnJhcnkiIHRvIGJlIHN1cmUgcGVvcGxlIGhhdmUgdGhlIHJpZ2h0CisJZXhwZWN0YXRpb25zLgorCisyMDAzLTA0LTI4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBhZGQgLS1lbmFibGUtZG9jcyB3aGljaCBieSBkZWZhdWx0IGlzIGF1dG8geWVzIGlmCisJZG94eWdlbiBhbmQgZGIyaHRtbCBmb3VuZCwgbm8gb3RoZXJ3aXNlOyBidXQgY2FuIGJlIGZvcmNlZCBvbi9vZmYKKworCSogZG9jL01ha2VmaWxlLmFtOiBjb25kaXRpb25hbGl6ZSB3aGV0aGVyIHRvIGJ1aWxkIGRvY3Mgb24KKwktLWVuYWJsZS1kb2NzCisKKzIwMDMtMDQtMjggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IDAuMTAKKworCSogTkVXUzogdXBkYXRlCisKKwkqIGJ1cy9zeXN0ZW0uY29uZi5pbjogYWRkIDxpbmNsdWRlZGlyPnN5c3RlbS5kPC9pbmNsdWRlZGlyPgorCisJKiBkYnVzL2RidXMtdXNlcmRiLmMgKF9kYnVzX3VzZXJfZGF0YWJhc2VfbG9va3VwKTogZml4IGJ1ZyB3aGVuCisJdXNlcm5hbWUgd2FzIHByb3ZpZGVkIGJ1dCBub3QgdWlkCisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKHN0cnVjdCBCdXNDb25maWdQYXJzZXIpOiBrZWVwIHRyYWNrIG9mCisJd2hldGhlciB0aGUgcGFyc2VyIGlzIHRvcGxldmVsIG9yIHdhcyBpbmNsdWRlZDsgY2hhbmdlIHNvbWUKKwlvZiB0aGUgZXJyb3IgaGFuZGxpbmcgaWYgaXQncyBpbmNsdWRlZC4KKworMjAwMy0wNC0yNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCVVuYnJlYWsgbXkgY29kZS4uLgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmMgKF9kYnVzX3RyYW5zcG9ydF9nZXRfZGlzcGF0Y2hfc3RhdHVzKToKKwlyZXBvcnQgY29ycmVjdCBzdGF0dXMgaWYgd2UgZmluaXNoIHByb2Nlc3NpbmcgYXV0aGVudGljYXRpb24KKwlpbnNpZGUgdGhpcyBmdW5jdGlvbi4KKworCSogYnVzL2FjdGl2YXRpb24uYyAodHJ5X3NlbmRfYWN0aXZhdGlvbl9mYWlsdXJlKTogdXNlCisJYnVzX3RyYW5zYWN0aW9uX3NlbmRfZXJyb3JfcmVwbHkKKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25fZ2V0X2dyb3Vwcyk6IHJldHVybiBhbiBlcnJvcgorCWV4cGxhaW5pbmcgdGhlIHByb2JsZW0KKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kpOiBpbXBsZW1lbnQKKwlyZXN0cmljdGlvbiBoZXJlIHRoYXQgaW5hY3RpdmUgY29ubmVjdGlvbnMgY2FuIG9ubHkgc2VuZCB0aGUKKwloZWxsbyBtZXNzYWdlLiBBbHNvLCBhbGxvdyBidXMgZHJpdmVyIHRvIHNlbmQgYW55dGhpbmcgdG8KKwlhbnkgcmVjaXBpZW50LgorCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfY29ubmVjdGlvbl9jb21wbGV0ZSk6IGNyZWF0ZSB0aGUKKwlCdXNDbGllbnRQb2xpY3kgaGVyZSBpbnN0ZWFkIG9mIG9uLWRlbWFuZC4KKwkoYnVzX2Nvbm5lY3Rpb25fZ2V0X3BvbGljeSk6IGRvbid0IHJldHVybiBhbiBlcnJvcgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfbmV3X2Vycm9yX3JlcGx5KTogYWxsb3cgTlVMTAorCXNlbmRlciBmaWVsZCBpbiBtZXNzYWdlIGJlaW5nIHJlcGxpZWQgdG8KKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kpOiBmaXggc2lsbHkgdHlwbworCWNhdXNpbmcgaXQgdG8gcmV0dXJuIEZBTFNFIGFsd2F5cworCisJKiBidXMvcG9saWN5LmMgKGJ1c19jbGllbnRfcG9saWN5X2NoZWNrX2Nhbl9zZW5kKTogZml4IGJ1ZyB3aGVyZQorCXdlIGNoZWNrZWQgc2VuZGVyIHJhdGhlciB0aGFuIGRlc3RpbmF0aW9uCisKKzIwMDMtMDQtMjUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisgICAgICAgIHRlc3Qgc3VpdGUgaXMgc2xpZ2h0bHkgaG9zZWQgYXQgdGhlIG1vbWVudCwgd2lsbCBmaXggc29vbgorCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfY29ubmVjdGlvbnNfZXhwaXJlX2luY29tcGxldGUpOiBmaXggdG8KKwlwcm9wZXJseSBkaXNhYmxlIHRoZSB0aW1lb3V0IHdoZW4gcmVxdWlyZWQKKwkoYnVzX2Nvbm5lY3Rpb25fc2V0X25hbWUpOiBjaGVjayB3aGV0aGVyIHdlIGNhbiByZW1vdmUgaW5jb21wbGV0ZQorCWNvbm5lY3Rpb25zIHRpbWVvdXQgYWZ0ZXIgd2UgY29tcGxldGUgZWFjaCBjb25uZWN0aW9uLgorCisJKiBkYnVzL2RidXMtbWFpbmxvb3AuYyAoY2hlY2tfdGltZW91dCk6IGZpeCB0aGlzIHVwIGEgYml0LAorCXByb2JhYmx5IHN0aWxsIGJyb2tlbi4KKworCSogYnVzL3NlcnZpY2VzLmMgKGJ1c19yZWdpc3RyeV9hY3F1aXJlX3NlcnZpY2UpOiBpbXBsZW1lbnQgbWF4CisJbnVtYmVyIG9mIHNlcnZpY2VzIG93bmVkLCBhbmQgaG9ub3IgYWxsb3cvZGVueSBydWxlcyBvbiB3aGljaAorCXNlcnZpY2VzIGEgY29ubmVjdGlvbiBjYW4gb3duLgorCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfY29ubmVjdGlvbl9nZXRfcG9saWN5KTogcmVwb3J0IGVycm9ycyBoZXJlCisKKwkqIGJ1cy9hY3RpdmF0aW9uLmM6IGltcGxlbWVudCBsaW1pdCBvbiBudW1iZXIgb2YgcGVuZGluZworCWFjdGl2YXRpb25zCisKKzIwMDMtMDQtMjUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmMgKF9kYnVzX3RyYW5zcG9ydF9nZXRfdW5peF91c2VyKTogZml4IGJ1ZworCXdoZXJlIHdlIHVzZWQgPj0gMCBpbnN0ZWFkIG9mICE9IERCVVNfVUlEX1VOU0VULgorCisyMDAzLTA0LTI1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWdtYWluLmMgKHJlbW92ZV93YXRjaCk6IGZpeCBmb3IgYSBjcmFzaCB3aGVuIHdhdGNoZXMKKwl3ZXJlIHRvZ2dsZWQgd2l0aG91dCBhZGQvcmVtb3ZlLCBmaXggZnJvbSBBbmRlcnMgR3VzdGFmc3NvbgorCisyMDAzLTA0LTI0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9iYXNpYy5jb25mOiBhZGQgPGxpbWl0PiB0YWdzIHRvCisJdGhpcyB0ZXN0CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmgsIGJ1cy9jb25maWctcGFyc2VyLmMsIGJ1cy9idXMuYzogSW1wbGVtZW50CisJPGxpbWl0PiB0YWcgaW4gY29uZmlndXJhdGlvbiBmaWxlLgorCisyMDAzLTA0LTI0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL2Rpc3BhdGNoLmM6IHNvbWVob3cgbWlzc2VkIHNvbWUgbmFtZV9pcworCisJKiBkYnVzL2RidXMtdGltZW91dC5jIChfZGJ1c190aW1lb3V0X3NldF9lbmFibGVkKQorCShfZGJ1c190aW1lb3V0X3NldF9pbnRlcnZhbCk6IG5ldworCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfY29ubmVjdGlvbnNfc2V0dXBfY29ubmVjdGlvbik6IHJlY29yZCB0aW1lCisJd2hlbiBlYWNoIGNvbm5lY3Rpb24gaXMgZmlyc3Qgc2V0IHVwLCBhbmQgZXhwaXJlIHRoZW0gYWZ0ZXIgdGhlCisJYXV0aCB0aW1lb3V0IHBhc3Nlcy4KKworMjAwMy0wNC0yNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9uYW1lX2lzKTogcmVuYW1lCisJKGRidXNfbWVzc2FnZV9zZXJ2aWNlX2lzKTogcmVuYW1lCisJKGRidXNfbWVzc2FnZV9zZW5kZXJfaXMpOiByZW5hbWUKKwkoZGJ1c19tZXNzYWdlX2dldF9zZXJ2aWNlKTogcmVuYW1lCisKKzIwMDMtMDQtMjQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IGFkZCAtLWVuYWJsZS1jaGVja3MKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX25ldyk6IHJldmVyc2UgbmFtZS9zZXJ2aWNlIGFyZ3VtZW50cworCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fcHJlYWxsb2NhdGVfc2VuZCk6IGZpeAorCXRvIHVzZSB0aHJlYWQgbG9ja3MuCisJKF9kYnVzX2Nvbm5lY3Rpb25faGFuZGxlcl9kZXN0cm95ZWRfbG9ja2VkKTogbW92ZSBzb21lIHByaXZhdGUKKwlmdW5jdGlvbnMgaW50byBwcm9wZXIgZG9jcyBncm91cAorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmg6IGFkZCBfZGJ1c19yZXR1cm5faWZfZmFpbCwKKwlfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwKKworCVRocm91Z2hvdXQ6IHVzZSBkYnVzX3JldHVybl9pZl9mYWlsCisKKzIwMDMtMDQtMjMgIEphbWVzIFdpbGxjb3ggIDxqd2lsbGNveEBnbm9tZS5vcmc+CisKKwkqIGdsaWIvZGJ1cy1nbGliLmg6CisJKiBnbGliL2RidXMtZ21haW4uYzogKGFkZF90aW1lb3V0KSwgKHdha2V1cF9tYWluKSwgKGNyZWF0ZV9zb3VyY2UpLAorCShkYnVzX2Nvbm5lY3Rpb25fc2V0dXBfd2l0aF9nX21haW4pLAorCShkYnVzX3NlcnZlcl9zZXR1cF93aXRoX2dfbWFpbik6CisJKiBnbGliL3Rlc3QtZGJ1cy1nbGliLmM6IChtYWluKToKKwkqIGdsaWIvdGVzdC10aHJlYWQtY2xpZW50LmM6IChtYWluKToKKwkqIGdsaWIvdGVzdC10aHJlYWQtc2VydmVyLmM6IChuZXdfY29ubmVjdGlvbl9jYWxsYmFjayksIChtYWluKToKKwkqIHRvb2xzL2RidXMtbW9uaXRvci5jOiAobWFpbik6CisKKwlBZGRlZCBhIEdNYWluQ29udGV4dCBhcmd1bWVudCB0byBkYnVzX2Nvbm5lY3Rpb25fc2V0dXBfd2l0aF9nX21haW4oKQorCWFuZCBkYnVzX3NlcnZlcl9zZXR1cF93aXRoX2dfbWFpbigpLgorCisyMDAzLTA0LTIwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6IGRvY3VtZW50IHRoZSByZXN0cmljdGlvbnMgb24KKwltZXNzYWdlIGFuZCBzZXJ2aWNlIG5hbWVzCisKKzIwMDMtMDQtMjIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jLCBkYnVzL2RidXMtbWFyc2hhbC5jOiBhZGQgNjQtYml0IGludGVnZXIKKwlzdXBwb3J0LCBhbmQgZG8gc29tZSBjb2RlIGNsZWFudXBzIHRvIHNoYXJlIG1vcmUgY29kZSBhbmQKKwlzcGVlZCB1cCBhcnJheSBtYXJzaGFsL2RlbWFyc2hhbC4KKworCSogZGJ1cy0xLjAucGMuaW4gKENmbGFncyk6IHB1dCBsaWJkaXIgaW5jbHVkZSBmaWxlIGluIGNmbGFncworCisJKiBjb25maWd1cmUuaW46IGdlbmVyYXRlIGRidXMtYXJjaC1kZXBzLmgKKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmggKERCVVNfVFlQRV9JTlQ2NCwgREJVU19UWVBFX1VJTlQ2NCk6IGFkZAorCTY0LWJpdCB0eXBlY29kZXMKKworMjAwMy0wNC0yMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9vcHBvc2l0ZS1lbmRpYW4ubWVzc2FnZTogZml4IHRlc3QKKwl0byB1c2UgcHJvcGVyIHR5cGUgZm9yIHJwbHkgZmllbGQKKworICAgICAgICAqIHRlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzOiBhZGQgdGVzdHMgZm9yIGJlbG93IHZhbGlkYXRpb24KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGVjb2RlX2hlYWRlcl9kYXRhKTogdmFsaWRhdGUgZmllbGQgdHlwZXMsCisJYW5kIHZhbGlkYXRlIHRoYXQgbmFtZWQgZmllbGRzIGFyZSB2YWxpZCBuYW1lcworCShkZWNvZGVfbmFtZV9maWVsZCk6IGNvbnNpZGVyIG1lc3NhZ2VzIGluIHRoZQorCW9yZy5mcmVlZGVza3RvcC5Mb2NhbC4gbmFtZXNwYWNlIHRvIGJlIGludmFsaWQuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX3ZhbGlkYXRlX25hbWUpOiBuZXcKKworMjAwMy0wNC0xOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2hhbmRsZV9oZWxsbyk6IGNoZWNrIGxpbWl0cyBhbmQKKwlyZXR1cm4gYW4gZXJyb3IgaWYgdGhleSBhcmUgZXhjZWVkZWQuCisKKwkqIGJ1cy9jb25uZWN0aW9uLmM6IG1haW50YWluIHNlcGFyYXRlIGxpc3RzIG9mIGFjdGl2ZSBhbmQgaW5hY3RpdmUKKwljb25uZWN0aW9ucywgYW5kIGEgY291bnQgb2YgZWFjaC4gTWFpbnRhaW4gY291bnQgb2YgY29tcGxldGVkCisJY29ubmVjdGlvbnMgcGVyIHVzZXIuIEltcGxlbWVudCBjb2RlIHRvIGNoZWNrIGNvbm5lY3Rpb24gbGltaXRzLgorCisJKiBkYnVzL2RidXMtbGlzdC5jIChfZGJ1c19saXN0X3VubGluayk6IGV4cG9ydAorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X2NoZWNrX3NlY3VyaXR5X3BvbGljeSk6IGVuZm9yY2UgYSBtYXhpbXVtCisJbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBtZXNzYWdlIHF1ZXVlIGZvciBhIGNvbm5lY3Rpb24KKworMjAwMy0wNC0xOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLWF1dGguYyAocmVjb3JkX21lY2hhbmlzbXMpOiBtZW1sZWFrIGZpeGVzCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3N0cmluZ19zYXZlX3RvX2ZpbGUpOiBmaXggc29tZQorCW1lbWxlYWtzCisKKwkqIGRidXMvZGJ1cy1rZXlyaW5nLmMgKGFkZF9uZXdfa2V5KTogZml4IGEgbWVtbGVhaywgYW5kCisJb24gcmVhbGxvYyBiZSBzdXJlIHRvIHVwZGF0ZSB0aGUgcG9pbnRlciBpbiB0aGUga2V5cmluZworCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ196ZXJvKTogY29tcGVuc2F0ZSBmb3IgYWxpZ24KKwlvZmZzZXQgdG8gYXZvaWQgd3JpdGluZyB0byB1bmFsbG9jYXRlZCBtZW1vcnkKKworCSogZGJ1cy9kYnVzLWF1dGguYyAocHJvY2Vzc19yZWplY3RlZCk6IHJldHVybiBGQUxTRSBpZiB3ZSBmYWlsIHRvCisJdHJ5IHRoZSBuZXh0IG1lY2hhbmlzbSwgc28gd2UgcHJvcGVybHkgaGFuZGxlIE9PTQorCisJKiBkYnVzL2RidXMta2V5cmluZy5jIChfZGJ1c19rZXlyaW5nX25ld19ob21lZGlyKTogZml4IGRvdWJsZS1mcmVlCisJb24gT09NLgorCShfZGJ1c19rZXlyaW5nX25ldyk6IGZpeCBPT00gYnVnCisJKF9kYnVzX2tleXJpbmdfbmV3X2hvbWVkaXIpOiBhbHdheXMgc2V0IGVycm9yOyBpbXBvc2UgYSBtYXhpbXVtCisJbnVtYmVyIG9mIGtleXMgd2UnbGwgbG9hZCBmcm9tIHRoZSBmaWxlLCBtb3N0bHkgdG8gc3BlZWQgdXAgdGhlCisJdGVzdCBzdWl0ZSBhbmQgbWFrZSBpdHMgT09NIGNoZWNrcyBtb3JlIHVzZWZ1bCwgYnV0IGFsc28gZm9yCisJZ2VuZXJhbCBzYW5pdHkuCisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKHByb2Nlc3NfZXJyb3Jfc2VydmVyKTogcmVqZWN0IGF1dGhlbnRpY2F0aW9uCisJaWYgd2UgZ2V0IGFuIGVycm9yIGZyb20gdGhlIGNsaWVudAorCShwcm9jZXNzX2NhbmNlbCk6IG9uIGNhbmNlbCwgc2VuZCBSRUpFQ1RFRCwgcGVyIHRoZSBzcGVjCisJKHByb2Nlc3NfZXJyb3JfY2xpZW50KTogc2VuZCBDQU5DRUwgaWYgd2UgZ2V0IGFuIGVycm9yIGZyb20gdGhlCisJc2VydmVyLgorCisyMDAzLTA0LTE4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtbWFpbmxvb3AuYyAoX2RidXNfbG9vcF9pdGVyYXRlKTogZml4IFVNUiBpbiB2ZXJib3NlCisJZGVidWcgc3BldworCisJKiBkYnVzL2RidXMtYXV0aC5jIChoYW5kbGVfY2xpZW50X2RhdGFfY29va2llX3NoYTFfbWVjaCk6IGZpeCBPT00KKwloYW5kbGluZyBwcm9ibGVtCisKKwkqIGRidXMvZGJ1cy1rZXlyaW5nLmMgKF9kYnVzX2tleXJpbmdfbmV3X2hvbWVkaXIpOiBvbmx5IHdoaW5lCisJYWJvdXQgREJVU19URVNUX0hPTUVESVIgb25jZQorCisJKiBidXMvTWFrZWZpbGUuYW0gKFRFU1RTX0VOVklST05NRU5UKTogcHV0IERCVVNfVEVTVF9IT01FRElSIGluCisJdGhlIGVudmlyb25tZW50CisKKwkqIGJ1cy9kaXNwYXRjaC5jIChidXNfZGlzcGF0Y2hfc2hhMV90ZXN0KTogYWN0dWFsbHkgbG9hZCBzaGExCisJY29uZmlnIGZpbGUgc28gd2UgdGVzdCB0aGUgcmlnaHQgdGhpbmcKKworCVRocm91Z2hvdXQ6IGFzc29ydGVkIGRvY3MgaW1wcm92ZW1lbnRzCisKKzIwMDMtMDQtMTggIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jOiBhZGFwdCB0byB3YXRjaCBjaGFuZ2VzCisKKwkqIGJ1cy9idXMuYywgYnVzL2FjdGl2YXRpb24uYywgZXRjLjogYWRqdXN0IHRvIHdhdGNoIGNoYW5nZXMKKworCSogZGJ1cy9kYnVzLXNlcnZlci5oOiByZW1vdmUgZGJ1c19zZXJ2ZXJfaGFuZGxlX3dhdGNoCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmg6IHJlbW92ZSBkYnVzX2Nvbm5lY3Rpb25faGFuZGxlX3dhdGNoCisKKwkqIGRidXMvZGJ1cy13YXRjaC5jIChkYnVzX3dhdGNoX2hhbmRsZSk6IGNoYW5nZSBEQnVzV2F0Y2ggdG8gd29yaworCWxpa2UgREJ1c1RpbWVvdXQsIHNvIHdlIGRvbid0IG5lZWQgZGJ1c19jb25uZWN0aW9uX2hhbmRsZV93YXRjaAorCWV0Yy4KKworMjAwMy0wNC0xNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy11c2VyZGIuYywgZGJ1cy9kYnVzLXN5c2RlcHMuYzogcmVkbyBhbGwgdGhlIHBhc3N3ZAorCWRhdGFiYXNlIHVzYWdlIHNvIGl0IGFsbCBnb2VzIHZpYSB0aGUgREJ1c1VzZXJEYXRhYmFzZSBjYWNoZS4KKworMjAwMy0wNC0xNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tYWlubG9vcC5jIChfZGJ1c19sb29wX2l0ZXJhdGUpOiBmaXggbG9naWMgc28gdGhhdCBpZgorCXRoZXJlIHdhcyBhbiBPT00gd2F0Y2ggd2Ugc2tpcHBlZCwgd2UgYWx3YXlzIHJldHVybiBUUlVFIHNvIHdlCisJaXRlcmF0ZSBhZ2FpbiB0byBoYXZlIGEgbG9vayBhdCBpdCBhZ2Fpbi4gRml4ZXMgdGVzdCBzdWl0ZSBoYW5nLgorCUNvZGUgcmVhcnJhbmdlbWVudCBhbHNvIGxldHMgdXMgbG9zZSBzb21lIG1lbXNldCBhbmQgb25seSBpdGVyYXRlCisJb3ZlciBjYWxsYmFja3Mgb25jZS4KKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2hhbmRsZV9tZXNzYWdlKTogc2Vuc2Ugb2YgdGVzdCBmb3IKKwlyZXBseSB3YXMgYmFja3dhcmQKKworMjAwMy0wNC0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOiBtYWtlIHNwZWMgc2F5IHNlcmlhbHMgYXJlIHVuc2lnbmVkCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6IGNoYW5nZSBtZXNzYWdlIHNlcmlhbHMgdG8gdW5zaWduZWQKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzogYWRhcHQgdG8gbWVzc2FnZSBzZXJpYWxzIGJlaW5nIHVuc2lnbmVkCisKKzIwMDMtMDQtMTUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9idXMuYzogY3JlYXRlIGFuZCBrZWVwIGFyb3VuZCBhIHNoYXJlZCBEQnVzVXNlckRhdGFiYXNlCisJb2JqZWN0LgorCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfY29ubmVjdGlvbl9nZXRfZ3JvdXBzKTogZG9uJ3QgY2FjaGUKKwlncm91cHMgZm9yIHVzZXIgaW4gdGhlIGNvbm5lY3Rpb24gb2JqZWN0LCBzaW5jZSB1c2VyIGRhdGFiYXNlCisJb2JqZWN0IG5vdyBkb2VzIHRoYXQuCisKKzIwMDMtMDQtMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChfZGJ1c19tZXNzYWdlX2FkZF9zaXplX2NvdW50ZXIpOiBrZWVwIGEKKwlsaXN0IG9mIHNpemUgY291bnRlcnMKKwkoX2RidXNfbWVzc2FnZV9sb2FkZXJfcHV0YmFja19tZXNzYWdlX2xpbmspOiBwdXQgYmFjayBhIHBvcHBlZCBsaW5rCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMKKwkoZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfbGl2ZV9tZXNzYWdlc19zaXplKTogcmVuYW1lCisJbWF4X3JlY2VpdmVkX3NpemUKKwkoZGJ1c19jb25uZWN0aW9uX2dldF9vdXRnb2luZ19zaXplKTogZ2V0IHNpemUgb2Ygb3V0Z29pbmcKKwlxdWV1ZQorCShfZGJ1c19jb25uZWN0aW9uX3NldF9jb25uZWN0aW9uX2NvdW50ZXIpOiByZW1vdmUgdGhpcyBjcnVmdAorCisyMDAzLTA0LTE0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXVzZXJkYi5jOiB1c2VyIGRhdGFiYXNlIGFic3RyYWN0aW9uLCBtb3N0bHkgdG8gZ2V0CisJY2FjaGluZywgYnV0IGF0IHNvbWUgcG9pbnQgd2UgbWlnaHQgd2FudCB0byBiZSBhYmxlIHRvIHVzZSBhCisJZGlmZmVyZW50IGRhdGFiYXNlLgorCisJKiBidXMvZGlzcGF0Y2guYyAoYnVzX2Rpc3BhdGNoX3NoYTFfdGVzdCk6IGFkZCBhIHRlc3QgdGhhdCB1c2VzCisJU0hBMSBjb25mIGZpbGUgdG8gdGVzdCB0aGUgc2hhMSBhdXRoIG1lY2hhbmlzbSwgc2luY2UgdGhlIHJlZ3VsYXIKKwl0ZXN0IGFsd2F5cyB1c2VzIEVYVEVSTkFMIHdoZW4gYXZhaWxhYmxlLgorCisJKiBjb25maWd1cmUuaW4sCisJdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwtc2hhMS5jb25mLmluOgorCWFkZCBjb25mIGZpbGUgdGhhdCByZXF1aXJlcyB1c2Ugb2Ygc2hhMSBhdXRoCisKKzIwMDMtMDQtMTMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKyAgICAgICAgKiB0b29scy9kYnVzLXNlbmQuYywgdG9vbHMvZGJ1cy1tb25pdG9yLmM6IHR3byB1dGlsaXR5IHByb2dyYW1zCisJZnJvbSBQaGlsaXAgQmx1bmRlbGwgdG8gc2VuZCBtZXNzYWdlcyBhbmQgbW9uaXRvciB0aGVtLgorCisyMDAzLTA0LTEzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtbWFpbmxvb3AuYzogZml4IHNvbWUgcmVlbnRyYW5jeSBpc3N1ZXMgYnkgcmVmY291bnRpbmcKKwljYWxsYmFja3MKKworCSogdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwuY29uZi5pbjogYWxsb3cgYWxsCisJdXNlcnMKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jIChfZGJ1c190cmFuc3BvcnRfZ2V0X2Rpc3BhdGNoX3N0YXR1cyk6CisJZml4IHRvIG9ubHkgcmVjb3ZlciB1bnVzZWQgYnl0ZXMgaWYgd2UncmUgYWxyZWFkeSBhdXRoZW50aWNhdGVkCisJKF9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfYXV0aGVudGljYXRlZCk6IGZpeCB0byBzdGlsbCBtYXJrIHVzCisJYXV0aGVudGljYXRlZCBpZiB0aGVyZSBhcmUgdW51c2VkIGJ5dGVzLgorCisJKiBidXMvZGlzcGF0Y2guYzogaW1wbGVtZW50IHNlY3VyaXR5IHBvbGljeSBjaGVja2luZworCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlcik6IG5ldworCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X2NoZWNrX3NlY3VyaXR5X3BvbGljeSk6IG5ldworCisJKiBidXMvZGlzcGF0Y2guYyAoc2VuZF9zZXJ2aWNlX25vbmV4aXN0ZW50X2Vycm9yKTogZGVsZXRlIHRoaXMsCisJbm93IHdlIGp1c3Qgc2V0IHRoZSBEQnVzRXJyb3IgYW5kIGl0IGdldHMgY29udmVydGVkIHRvIGFuIGVycm9yCisJcmVwbHkuCisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGFsbG93X3VzZXJfZnVuY3Rpb24pOiBlbmFibGUgY29kZSB1c2luZyBhY3R1YWwKKwlkYXRhIGZyb20gdGhlIGNvbmZpZyBmaWxlCisKKwkqIGJ1cy9wb2xpY3kuYyAobGlzdF9hbGxvd3NfdXNlcik6IGhhbmRsZSB3aWxkY2FyZCBydWxlcyBmb3IKKwl1c2VyL2dyb3VwIGNvbm5lY3Rpb24gcGVybXMKKworMjAwMy0wNC0xMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYzogTG9hZCB1cCB0aGUgQnVzUG9saWN5IGFuZCBCdXNQb2xpY3lSdWxlcworCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19nZXRfdXNlcl9pZCk6IG5ldyBmdW5jdGlvbgorCisJKiBidXMvcG9saWN5LmMgKGJ1c19wb2xpY3lfYXBwZW5kX21hbmRhdG9yeV9ydWxlKQorCShidXNfcG9saWN5X2FwcGVuZF9kZWZhdWx0X3J1bGUsIGJ1c19wb2xpY3lfYXBwZW5kX3VzZXJfcnVsZSkKKwkoYnVzX3BvbGljeV9hcHBlbmRfZ3JvdXBfcnVsZSk6IG5ldyBmdW5jdGlvbnMKKworMjAwMy0wNC0xMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYyAoYnVzX2NvbmZpZ19wYXJzZXJfbmV3KTogZml4IGEgbWVtbGVhaworCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOiBjaGFuZ2UgREJ1c0NyZWRlbnRpYWxzIHRvIHVzZSBsb25ncyBmb3IKKwl0aGUgcGlkL2dpZC91aWQsIGp1c3QgZm9yIHBhcmFub2lhLgorCisJKiB0ZXN0L2JyZWFrLWxvYWRlci5jIChyYW5kb21seV9kb19uX3RoaW5ncyk6IGZpbmQgYSBieXRlCisJY29udGFpbmluZyBhIHR5cGUgY29kZSwgYW5kIHJhbmRvbWx5IGNoYW5nZSBpdCB0byBhIGRpZmZlcmVudAorCXR5cGUgY29kZS4KKworMjAwMy0wNC0xMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL3BvbGljeS5oOiBjaGFuZ2UgQnVzUG9saWN5IHRvIGJlIHRoZSB0aGluZyBmcm9tIHRoZSBjb25maWcKKwlmaWxlLCBhbmQgcmVuYW1lIG9sZCBCdXNQb2xpY3kgdG8gQnVzQ2xpZW50UG9saWN5CisKKwkqIGJ1cy9idXMuYywgYnVzL2Nvbm5lY3Rpb24uYywgYnVzL2NvbmZpZy1wYXJzZXIuYzogY2hhbmdlIHRvCisJbWF0Y2ggY2hhbmdlIGluIGhvdyBwb2xpY3kgd29ya3MKKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oOiBtYXJrIGFzc2VydF9ub3RfcmVhY2hlZCBhcworCV9fYXR0cmlidXRlKChub3JldHVybikpX18KKworMjAwMy0wNC0xMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDogZml4IGEgc3BvdCB3aXRoIHRoZSB3cm9uZyBuYW1lIGZvcgorCXRoZSBicm9hZGNhc3Qgc2VydmljZS4gVXNlIGJvb2xlYW4gcmV0dXJuIGZvciBTZXJ2aWNlRXhpc3RzLgorCisyMDAzLTA0LTExICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBhZGQgYW5vdGhlciBkaXJlY3RvcnkgdG8gbG9vayBmb3IgcXQgaW4uCisKKzIwMDMtMDQtMTEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBBVVRIT1JTOiBhZGQgQ29saW4gV2FsdGVycworCisyMDAzLTA0LTExICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogTkVXUzogdXBkYXRlCisKKwkqIGNvbmZpZ3VyZS5pbjogMC45CisKKzIwMDMtMDQtMTEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvbWVzc2FnZWJ1cy5pbjogcmVtb3ZlIHBpZCBmaWxlIHdoZW4gc3RvcHBpbmcgdGhlCisJbWVzc2FnZSBidXMsIHNpbmNlIHRoZSBidXMgd29uJ3QgaGF2ZSBwcml2aWxlZ2VzIHRvIHJlbW92ZSBpdAorCWl0c2VsZi4KKworMjAwMy0wNC0xMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfbmV3KTogbW92ZSBjcmVkZW50aWFscyBjaGFuZ2UgYWZ0ZXIKKwljcmVhdGluZyBwaWRmaWxlCisKKzIwMDMtMDQtMTEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIHRlc3QvZGVjb2RlLWdjb3YuYzogYWRkICJiZWxvdyBhdmVyYWdlIGZ1bmN0aW9ucyIgdG8gdGhlCisJY292ZXJhZ2UgcmVwb3J0LCBhbmQgY2hhbmdlIGhvdyBzb21lIG9mIHRoZSBjb2RlIHdvcmtzLgorCisJKiBidXMvdGVzdC1tYWluLmM6IGJyYWNrZXQgc29tZSBzdHVmZiBpbiBEQlVTX0JVSUxEX1RFU1RTIHNvIGl0J3MKKwlub3QgaW4gdGhlIGNvdmVyYWdlIHN0YXRzLgorCisJKiB0ZXN0L3Rlc3Qtc2VydmljZS5jIChtYWluKTogdXNlIF9kYnVzX3ZlcmJvc2Ugbm90IGZwcmludGYgaW4gYQorCWNvdXBsZSBwbGFjZXMgc28gcnVubmluZyB0aGUgdGVzdCBzdWl0ZSBkb2Vzbid0IHJlc3VsdCBpbiBtZWdhc3BhbS4KKworMjAwMy0wNC0xMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL2Rpc3BhdGNoLmMgKGNoZWNrX2V4aXN0ZW50X3NlcnZpY2VfYWN0aXZhdGlvbik6IGFjY2VwdCBhIG5vCisJbWVtb3J5IGVycm9yIGluIGEgcGxhY2Ugd2UgZGlkbid0IGJlZm9yZQorCisJKiBidXMvdGVzdC5jIChidXNfdGVzdF9ydW5fZXZlcnl0aGluZyk6IHJlbW92ZSBoYWNreSAiZG8gaXQgdHdpY2UKKwlpbiBjYXNlIHRoZSBmaXJzdCBvbmUgZmFpbGVkLCIgc2luY2UgdGhlIHRlc3Qgc3VpdGUgaXMgbGVzcworCWJyb2tlbiBub3cuCisKKzIwMDMtMDQtMTAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9kaXNwYXRjaC5jIChjaGVja19zZWdmYXVsdF9zZXJ2aWNlX2FjdGl2YXRpb24pOiBhZGQgdGVzdAorCWZvciBsYXVuY2hpbmcgYW4gZXhlY3V0YWJsZSB0aGF0IGp1c3QgY3Jhc2hlcy4KKworCSogdGVzdC90ZXN0LXNlZ2ZhdWx0LmMgKG1haW4pOiB0cnkgc2V0dGluZyBjb3JlZHVtcHNpemUgdG8gMCBzbyB3ZQorCWRvbid0IGxlYXZlIGEgbWlsbGlvbiBjb3Jlcy4gV2UnbGwgc2VlIGhvdyBwb3J0YWJsZSB0aGlzIGlzLgorCisyMDAzLTA0LTEwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtc3Bhd24uYyAoX2RidXNfc3Bhd25fYXN5bmNfd2l0aF9iYWJ5c2l0dGVyKTogbW92ZSBhbGwKKwl0aGUgcG9zc2libGUgcGFyZW50IGZhaWx1cmVzIGJlZm9yZSB3ZSBmb3JrLCBzbyB0aGF0IHdlIGRvbid0CisJZmFpbCB0byBjcmVhdGUgYSBiYWJ5c2l0dGVyIGFmdGVyIGNyZWF0aW5nIHRoZSBjaGlsZC4KKworCSogYnVzL2FjdGl2YXRpb24uYyAoYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSk6IGtpbGwgY2hpbGQKKwlpZiB3ZSBkb24ndCBzdWNjZXNzZnVsbHkgY29tcGxldGUgdGhlIGFjdGl2YXRpb24uCisKKzIwMDMtMDQtMTAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZmx1c2gpOiBkb24ndCBzcGluIG9uCisJdGhlIGNvbm5lY3Rpb24gaWYgaXQncyBkaXNjb25uZWN0ZWQKKworCSogYnVzL2FjdGl2YXRpb24uYyAoYnVzX2FjdGl2YXRpb25fc2VydmljZV9jcmVhdGVkKTogdXNlIG5ldworCXRyYW5zYWN0aW9uIGZlYXR1cmVzIHRvIHJvbGwgYmFjayByZW1vdmFsIG9mIHBlbmRpbmcgYWN0aXZhdGlvbiBpZgorCXdlIGRvbid0IHN1Y2Nlc3NmdWxseSBjcmVhdGUgdGhlIHNlcnZpY2UgYWZ0ZXIgYWxsLiBEb24ndCByZW1vdmUKKwlwZW5kaW5nIGFjdGl2YXRpb24gaWYgdGhlIGZ1bmN0aW9uIGZhaWxzLgorCisJKiBkYnVzL2RidXMtbGlzdC5jIChfZGJ1c19saXN0X2luc2VydF9iZWZvcmVfbGluaykKKwkoX2RidXNfbGlzdF9pbnNlcnRfYWZ0ZXJfbGluayk6IG5ldyBjb2RlIHRvIGZhY2lsaXRhdGUKKwlzZXJ2aWNlcy5jIGZpeGVzCisKKwkqIGRidXMvZGJ1cy1oYXNoLmMgKF9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZ19wcmVhbGxvY2F0ZWQpOgorCW5ldyBmdW5jdGlvbmFsaXR5LCBzbyB3ZSBjYW4gcHJlYWxsb2NhdGUgdGhlIGFiaWxpdHkgdG8gaW5zZXJ0CisJaW50byBhIGhhc2ggdGFibGUuCisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGJ1c190cmFuc2FjdGlvbl9hZGRfY2FuY2VsX2hvb2spOiBuZXcgZnVuY3Rpb24KKwlhbGxvd2luZyB1cyB0byBwdXQgY3VzdG9tIGhvb2tzIGluIGEgdHJhbnNhY3Rpb24gdG8gYmUgdXNlZCBmb3IKKwljYW5jZWxsaW5nIHNhaWQgdHJhbnNhY3Rpb24KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOiBhZGQgc29tZSBkaXNjdXNzaW9uIG9mIHNlY29uZGFyeQorCXNlcnZpY2Ugb3duZXJzLCBhbmQgZGlzYWxsb3cgemVyby1sZW5ndGggc2VydmljZSBuYW1lcworCisJKiBidXMvc2VydmljZXMuYyAoYnVzX3JlZ2lzdHJ5X2FjcXVpcmVfc2VydmljZSk6IG5ldyBmdW5jdGlvbiwKKwlzcGxpdHMgb3V0IHBhcnQgb2YgYnVzX2RyaXZlcl9oYW5kbGVfYWNxdWlyZV9zZXJ2aWNlKCkgYW5kIGZpeGVzCisJYSBidWcgd2hlcmUgd2UgZGlkbid0IHJlbW92ZSB0aGUgc2VydmljZSBkb2luZyB0aGUgYWNxdWlyaW5nCisJZnJvbSB0aGUgc2Vjb25kYXJ5IHF1ZXVlIGlmIHdlIGZhaWxlZCB0byByZW1vdmUgdGhlIGN1cnJlbnQgb3duZXIKKwlmcm9tIHRoZSBmcm9udCBvZiB0aGUgcXVldWUuCisKKzIwMDMtMDQtMTAgIEFsZXhhbmRlciBMYXJzc29uICA8YWxleGxAcmVkaGF0LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOgorCXMvb3JnLmZyZWVkZXNrdG9wLkJyb2FkY2FzdC9vcmcuZnJlZWRlc2t0b3AuREJ1cy5Ccm9hZGNhc3QvCisKKzIwMDMtMDQtMTAgIEFsZXhhbmRlciBMYXJzc29uICA8YWxleGxAcmVkaGF0LmNvbT4KKworCSogYnVzLy5jdnNpZ25vcmU6CisJKiBnbGliLy5jdnNpZ25vcmU6CisJKiB0ZXN0Ly5jdnNpZ25vcmU6CisJQWRkZWQgZmlsZXMgdG8gY3ZzaWdub3JlCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X25hbWVkKToKKwlNYWtlIGdldF9uYW1lZCgpIHRha2UgdHdvIG91dCBhcmd1bWVudCBhbmQgcmV0dXJuIGEgYm9vbGVhbi4KKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ3NfdmFsaXN0KToKKwlVcGRhdGUgdXNhZ2Ugb2YgZ2V0X25hbWVkKCkuCisJKGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9ieXRlKToKKwlGaXggdHlwbworCShkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfbmFtZWQpCisJRml4IHR5cG8KKwkobWVzc2FnZV9pdGVyX3Rlc3QpLCAoY2hlY2tfbWVzc2FnZV9oYW5kbGluZ190eXBlKSwgKF9kYnVzX21lc3NhZ2VfdGVzdCk6CisJTW9yZSB0ZXN0cy4KKworMjAwMy0wNC0xMCAgQWxleGFuZGVyIExhcnNzb24gIDxhbGV4bEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5bY2hdOgorCUFkZCBhcnJheV90eXBlX3BvcyBhcmd1bWVudCB0byBfZGJ1c19tYXJzaGFsX3ZhbGlkYXRlX2FyZy4KKwlMZXQgeW91IHBhc3MgYSBOVUxMIGVuZF9wb3MgdG8gX2RidXNfbWFyc2hhbF92YWxpZGF0ZV90eXBlLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5bY2hdOgorCU11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBoYXZlIGZ1bGwgdHlwZSBzcGVjaWZpY2F0aW9uIGluIHRoZQorCW91dGVybW9zdCBhcnJheS4gSXRlciBjb2RlIHJlLWFycmFuZ2VkIHRvIGhhbmRsZSB0aGlzLgorCUFkZGVkIHNvbWUgbW9yZSBpdGVyIHRlc3RzLgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6CisJQWRkIG1lIHRvIGF1dGhvcnMuCisJUmVtb3ZlIG9sZCBGSVhNRS4KKwlVcGRhdGUgbmV3IGFycmF5IGVuY29kaW5nIGRlc2NyaXB0aW9uLgorCUNvcnJlY3QgREJVU19TRVJWSUNFX0ZMQUdTX1JFUExBQ0VfRVhJU1RJTkcgZGVzY3JpcHRpb24uCisKKwkqIHRlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2FycmF5LXdpdGgtbWl4ZWQtdHlwZXMubWVzc2FnZToKKwkqIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9hcnJheS1vZi1hcnJheS1vZi11aW50MzIubWVzc2FnZToKKwlDaGFuZ2UgdG8gdGhlIG5ldyBhcnJheSBmb3JtYXQuCisKKwkqIHRlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL3Rvby1zaG9ydC1kaWN0Lm1lc3NhZ2U6CisJRml4IGJ1ZyBpbiB0ZXN0LgorCisJKiB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvcmVjdXJzaXZlLXR5cGVzLm1lc3NhZ2U6CisJRml4IHVwIGFuZCBleHRlbmQgdGVzdC4KKworMjAwMy0wNC0xMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL2Rpc3BhdGNoLmM6IGxvdHMgb2YgZml4ZXMKKworCSogZGJ1cy9kYnVzLW1haW5sb29wLmMgKF9kYnVzX2xvb3BfZGlzcGF0Y2gpOiBleHBvcnQKKwkoX2RidXNfbG9vcF9pdGVyYXRlKTogcmVtb3ZlIG9sZCAicXVpdCBpZiBubyBjYWxsYmFja3MiIGNvZGUsCisJdGhhdCB3YXMgY3JhY2ssIGJyb2tlIHRoZSB0ZXN0IHNlcnZpY2UuCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYyAoX2RidXNfdHJhbnNwb3J0X29wZW4pOiBmaXggZXJyb3IKKwloYW5kbGluZyB0byBhdm9pZCBwaWxpbmcgdXAgZXJyb3JzIGlmIHdlIGdldCBhIGZhaWx1cmUgb24gdGhlCisJZmlyc3QgYWRkcmVzcy4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c19yZWFsX2Fzc2VydF9ub3RfcmVhY2hlZCk6IGluY2x1ZGUKKwlwaWQgaW4gYXNzZXJ0aW9uIGZhaWx1cmVzLgorCisJKiBkYnVzL2RidXMtbWFpbmxvb3AuYyAoX2RidXNfbG9vcF9pdGVyYXRlKTogdXNlIHN0YXRpYyBhcnJheXMgdXAKKwl0byBzb21lIGZpeGVkIHNpemUgb2YgZmlsZSBkZXNjcmlwdG9yIGFycmF5LiBEb24ndCByZXR1cm4gVFJVRQorCWFueXRpbWUgYSB0aW1lb3V0IGV4aXN0cywgdGhhdCBsZWQgdG8gbG90cyBvZiBidXN5IGxvb3Agc2lsbGluZXNzCisJaW4gdGhlIHRlc3RzLgorCisyMDAzLTA0LTA5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1haW5sb29wLmMgKGNoZWNrX3RpbWVvdXQpOiBmaXggdGltZW91dHMsIEkgdGhvdWdodAorCUknZCBjaGVja2VkIHRoaXMgaW4gZWFybGllciBidXQgaGFkbid0LgorCisyMDAzLTA0LTA5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL2Rpc3BhdGNoLmMgKGJ1c19kaXNwYXRjaF90ZXN0KTogZ2V0IGEgYml0IGZ1cnRoZXIgdGhyb3VnaAorCXRoZSBhY3RpdmF0aW9uIHRlc3QgKG1hbiB0aGlzIGlzIGdldHRpbmcgb2xkISkKKworMjAwMy0wNC0wOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvdGVzdC11dGlscy5jOiB1c2UgZGlzcGF0Y2ggc3RhdHVzIGZ1bmN0aW9uIHRvIGZpeCB0aGlzIHVwCisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGNvbm5lY3Rpb25fd2F0Y2hfY2FsbGJhY2spOiBkb24ndCBkaXNwYXRjaAorCWZyb20gaGVyZQorCShjb25uZWN0aW9uX3RpbWVvdXRfY2FsbGJhY2spOiBkb24ndCBkaXNwYXRjaCBmcm9tIGhlcmUKKwkoYnVzX2Nvbm5lY3Rpb25zX3NldHVwX2Nvbm5lY3Rpb24pOiBzZXQgdGhlIGRpc3BhdGNoIHN0YXR1cyBmdW5jdGlvbgorCShidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0ZWQpOiB1bnNldCBpdAorCisJKiBkYnVzL2RidXMtbWFpbmxvb3AuYyAoX2RidXNfbG9vcF9xdWV1ZV9kaXNwYXRjaCk6IG5ldyBmdW5jdGlvbgorCXVzZWQgdG8gYWRkIGEgY29ubmVjdGlvbiB0byBiZSBkaXNwYXRjaGVkCisJKF9kYnVzX2xvb3BfaXRlcmF0ZSk6IGRvIHRoZSBkaXNwYXRjaGluZyBhdCB0aGUgZW5kIG9mIGVhY2gKKwlpdGVyYXRpb24KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYworCShkYnVzX2Nvbm5lY3Rpb25fc2V0X2Rpc3BhdGNoX3N0YXR1c19mdW5jdGlvbik6IG5ldyBmdW5jdGlvbgorCWFsbG93aW5nIHVzIHRvIGZpeCB1cCBtYWluIGxvb3AgdXNhZ2UKKwkoX2RidXNfY29ubmVjdGlvbl9sYXN0X3VucmVmKTogZnJlZSBhbGwgdGhlIHZhcmlvdXMgZnVuY3Rpb24KKwl1c2VyIGRhdGEKKwkoZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKTogY2FsbCB0aGUgRGlzcGF0Y2hTdGF0dXNGdW5jdGlvbgorCXdoZW5ldmVyIHRoaXMgZnVuY3Rpb24gcmV0dXJucworCShkYnVzX2Nvbm5lY3Rpb25faGFuZGxlX3dhdGNoKTogY2FsbCBEaXNwYXRjaFN0YXR1c0Z1bmN0aW9uCisJKGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKTogY2FsbCBEaXNwYXRjaFN0YXR1c0Z1bmN0aW9uCisJKHJlcGx5X2hhbmRsZXJfdGltZW91dCk6IGNhbGwgRGlzcGF0Y2hTdGF0dXNGdW5jdGlvbgorCShkYnVzX2Nvbm5lY3Rpb25fZmx1c2gpOiBjYWxsIERpc3BhdGNoU3RhdHVzRnVuY3Rpb24KKworMjAwMy0wNC0wOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1idXMuYyAoZGJ1c19idXNfcmVnaXN0ZXIpOiBmaXggdXAgZXJyb3IgaGFuZGxpbmcgYW5kCisJYSBtZW1vcnkgbGVhaworCisJKiBidXMvZGlzcGF0Y2guYyAoY2hlY2tfc2VydmljZV9hY3RpdmF0ZWQpOiBmaXggYnVnIGluIHRlc3QKKworCSogZGJ1cy9kYnVzLW1haW5sb29wLmMgKGNoZWNrX3RpbWVvdXQpOiBmaXggdGhpcyB1cAorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmMgKF9kYnVzX3ZlcmJvc2VfcmVhbCk6IGluY2x1ZGUgUElEIGluCisJdmVyYm9zZSBvdXRwdXQgc28gd2UgY2FuIHNvcnQgb3V0IG91dHB1dCBmcm9tIGRpZmZlcmVudCBwcm9jZXNzZXMsCisJZS5nLiBpbiB0aGUgYWN0aXZhdGlvbiBjYXNlLgorCisyMDAzLTA0LTA4ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0BnbnUub3JnPgorCisgCSogYnVzL2J1cy5jIChzdHJ1Y3QgQnVzQ29udGV4dCkgW3BpZGZpbGVdOiBOZXcgbWVtYmVyLCB0byBzdG9yZQorIAl0aGUgcGlkIGZpbGUuCisgCShidXNfY29udGV4dF9uZXcpOiBTZXQgaXQuCisgCShidXNfY29udGV4dF91bnJlZik6IFVzZSBpdCB0byBkZWxldGUgdGhlIHBpZCBmaWxlLgorCisyMDAzLTA0LTA4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYXJyYXktd2l0aC1taXhlZC10eXBlcy5tZXNzYWdlOgorCXJlZ3Jlc3Npb24gdGVzdCB0aGF0IGZhaWxzIGZvciB0aGUgbW9tZW50CisKKwkqIGRidXMvZGJ1cy10ZXN0LmMgKGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9ydW5fdGVzdHMpOiByZW9yZGVyCisJdGVzdHMgZm9yIGNvbnZlbmllbmNlCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmMgKF9kYnVzX21hcnNoYWxfdmFsaWRhdGVfYXJnKTogZG9uJ3QgYWxsb3cKKwlhcnJheSBvZiBuaWwsIGl0IGJyb2tlIHRoaW5ncy4KKworCSogdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYXJyYXktb2YtbmlsLm1lc3NhZ2U6IHJlZ3Jlc3Npb24gdGVzdAorCisJKiB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvYXJyYXktb2YtYXJyYXktb2YtdWludDMyLm1lc3NhZ2U6CisJaGFwcGVuZWQgdG8gd3JpdGUgdGhpcyBzbyBhZGRlZCBpdCB0byBzdWl0ZQorCisyMDAzLTA0LTA4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2hhbmRsZV9hY3F1aXJlX3NlcnZpY2UpOiBpbml0CisJcmV0dmFsL3JlcGx5IGJlZm9yZSBjaGVja2luZyBuYW1lCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmMgKF9kYnVzX21hcnNoYWxfdmFsaWRhdGVfYXJnKTogYWRkIGEKKwlyZWN1cnNpb24gZGVwdGggYXJndW1lbnQKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaCAoc3RydWN0IERCdXNNZXNzYWdlSXRlcik6IHB1dCBzb21lIHBhZGRpbmcKKwlpbiB0aGUgcHVibGljIHN0cnVjdCBmb3IgZnV0dXJlIGV4dGVuc2lvbgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS1idWlsZGVyLmMgKF9kYnVzX21lc3NhZ2VfZGF0YV9sb2FkKTogZml4CisJdHlwbworCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jIChfZGJ1c19tYXJzaGFsX3ZhbGlkYXRlX2FyZyk6IGZpeCBhIHZlcmJvc2UKKwltZXNzYWdlCisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDogZml4IHR5cG8KKworMjAwMy0wNC0wOCAgQWxleGFuZGVyIExhcnNzb24gIDxhbGV4bEByZWRoYXQuY29tPgorCisJSW1wbGVtZW50ZWQgcmVjdXJzaXZlIHR5cGVzLCBuYW1lZCB0eXBlcyBhbmQgbmV3LXN0eWxlIGl0ZXJzCisKKwkqIGJ1cy9kcml2ZXIuYzoKKwkqIGdsaWIvdGVzdC10aHJlYWQtY2xpZW50LmM6ICh0aHJlYWRfZnVuYyk6CisJKiBnbGliL3Rlc3QtdGhyZWFkLXNlcnZlci5jOiAoaGFuZGxlX3Rlc3RfbWVzc2FnZSk6CisJKiB0ZXN0L3Rlc3Qtc2VydmljZS5jOiAoaGFuZGxlX2VjaG8pOgorCVVwZGF0ZSB0byBuZXcgYXBpCisKKwkqIGRidXMvTWFrZWZpbGUuYW06CisJKiBkYnVzL2RidXMtZGljdC5jOgorCSogZGJ1cy9kYnVzLWRpY3QuaDoKKwkqIGRidXMvZGJ1cy5oCisJUmVtb3ZlIERCdXNEaWN0CisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYzogKF9kYnVzX3R5cGVfdG9fc3RyaW5nKToKKwlVcGRhdGUgZm9yIG5ldyB0eXBlcy4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuW2NoXToKKwlJbXBsZW1lbnQgcmVjdXJzaXZlIHR5cGVzIGFuZCB0aGUgbmV3IG1hcnNoYWxsaW5nIGZvcm1hdC4KKwlSZW1vdmUgaGFyZGNvZGVkIGRpY3QgbWFyc2hhbGxpbmcuCisJTWFyc2hhbCBuYW1lZCB0eXBlcy4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtYnVpbGRlci5jOgorCUFkZCBCWVRFX0FSUkFZLgorCVJlbW92ZSByZWZlcmVuY2VzIHRvIG9sZCB0eXBlcworCisJKiBkYnVzL2RidXMtbWVzc2FnZS5bY2hdOgorCU5ldyBub24tcmVmY291bnRlZCBpdGVyIEFQSSB0aGF0IHN1cHBvcnRzIHJlY3Vyc2l2ZSBpdGVycy4KKwlVc2UgaXRlcnMgZm9yIGFwcGVuZGluZywgaW5jbHVkaW5nIHN1cHBvcnQgZm9yIHJlY3Vyc2l2ZQorCWl0ZXJzLgorCUFkZCBieXRlIGFuZCBuYW1lZCB0eXBlIHN1cHBvcnQuCisJVXBkYXRlIGV2ZXJ5dGhpbmcgdG8gbmV3IG1hcnNoYWxsaW5nIGZvcm1hdHMuCisJQWRkIHRlc3RzIGZvciBuZXcgQVBJLgorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaDoKKwlSZW1vdmUgb2xkIGFycmF5IHR5cGVzLgorCUFkZCB0eXBlczogQllURSwgQVJSQVksIERJQ1QsIE5BTUVECisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYzoKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmM6CisJTWFrZSBwYXJzZV9kb3VibGUgbG9jYWxlIHNhZmUuCisKKwkqIGRidXMvZGJ1cy10ZXN0LW1haW4uYzoKKwlDYWxsIHNldGxvY2FsZS4KKworCSogZGJ1cy9kYnVzLXRlc3QuYzoKKwlLaWxsIGRpY3QgdGVzdAorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6CisJVXBkYXRlIHNwZWMKKworCSogdGVzdC9kYXRhL2luY29tcGxldGUtbWVzc2FnZXMvbWlzc2luZy1ib2R5Lm1lc3NhZ2U6CisJKiB0ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtYm9vbGVhbi5tZXNzYWdlOgorCSogdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYmFkLWJvb2xlYW4tYXJyYXkubWVzc2FnZToKKwkqIHRlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2Jvb2xlYW4tYXJyYXktbGVuZ3RoLXRvby1sb25nLm1lc3NhZ2UtcmF3OgorCSogdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYm9vbGVhbi1oYXMtbm8tdmFsdWUubWVzc2FnZS1yYXc6CisJKiB0ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy90b28tc2hvcnQtZGljdC5tZXNzYWdlOgorCSogdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2RpY3Qtc2ltcGxlLm1lc3NhZ2U6CisJKiB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvZGljdC5tZXNzYWdlOgorCSogdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2VtcHRpbmVzcy5tZXNzYWdlOgorCSogdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2xvdHMtb2YtYXJndW1lbnRzLm1lc3NhZ2U6CisJKiB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvbm8tcGFkZGluZy5tZXNzYWdlOgorCSogdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3JlY3Vyc2l2ZS10eXBlcy5tZXNzYWdlOgorCUFkZCBtaXNzaW5nIE5BTUUgZmllbGRzCisJRml4IHVwIGRpY3RzICYgYXJyYXlzCisKKwkqIHRlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2RpY3Qtd2l0aC1uaWwtdmFsdWUubWVzc2FnZToKKwlSZW1vdmVkLCB0aGlzIGlzIG5vdCBpbnZhbGlkIGFueW1vcmUuCisKKwkqIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9yZWN1cnNpdmUtdHlwZXMubWVzc2FnZToKKwlBZGQgbmV3IHRlc3QgZm9yIGRlZXBseSByZWN1cnNpdmUgdHlwZXMuCisKKzIwMDMtMDQtMDcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfYWNxdWlyZV9zZXJ2aWNlKTogcmV0dXJuIGFuCisJZXJyb3IgaWYgeW91IHRyeSB0byBhY3F1aXJlIGEgc2VydmljZSB0aGF0IHN0YXJ0cyB3aXRoICc6JworCisyMDAzLTA0LTA3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOiByZXF1aXJlIHRoYXQgYmFzZSBzZXJ2aWNlIG5hbWVzCisJc3RhcnQgd2l0aCAnOicgYW5kIHRoYXQgdGhlIGJhc2Ugc2VydmljZSBpcyBjcmVhdGVkL2RlbGV0ZWQKKwlhcyBmaXJzdCBhbmQgbGFzdCB0aGluZ3MgYSBjb25uZWN0aW9uIGRvZXMgb24gdGhlIGJ1cworCisJKiBidXMvZGlzcGF0Y2guYyAoY2hlY2tfZXhpc3RlbnRfc2VydmljZV9hY3RpdmF0aW9uKTogbG90cyBtb3JlCisJd29yayBvbiB0aGUgYWN0aXZhdGlvbiB0ZXN0OyBpdCBkb2Vzbid0IGZ1bGx5IHBhc3MgeWV0Li4uCisKKwkqIHRlc3QvdGVzdC1zZXJ2aWNlLmMgKG1haW4pOiBmaXggc28gd2UgZG9uJ3QgbWVtbGVhayB0aGUKKwljb25uZWN0aW9uIHRvIHRoZSBtZXNzYWdlIGJ1cworCShmaWx0ZXJfZnVuYyk6IGFjY2VwdCBhIG1lc3NhZ2UgYXNraW5nIHVzIHRvIGV4aXQKKworMjAwMy0wNC0wNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogcXQvTWFrZWZpbGUuYW0gKGRidXNpbmNsdWRlX0hFQURFUlMpOiBpbnN0YWxsIGRidXMtcXQuaCwKKwlmcm9tIENvbGluIFdhbHRlcnMKKworCSogY29uZmlndXJlLmluOiBmaXhlcyB0byBRdCBkZXRlY3Rpb24gZnJvbSBDb2xpbiBXYWx0ZXJzCisKKwkqIGRvYy9NYWtlZmlsZS5hbTogT25seSByZW1vdmUgZ2VuZXJhdGVkIGRvY2Jvb2sgZGlycyBpZiB0aGV5CisJZXhpc3QsIGZyb20gQ29saW4gV2FsdGVycworCisJKiBkYnVzL2RidXMtYnVzLmM6IGNoYW5nZSBob3cgd2Ugc2V0IHdlbGwta25vd24gY29ubmVjdGlvbnMgdG8KKwlOVUxMLCBzbyB0aGF0IGl0IHdvcmtzIGlmIGEgc2luZ2xlIGNvbm5lY3Rpb24gaXMgc3RvcmVkIGluCisJdHdvIHdlbGwta25vd24gYXJyYXkgc2xvdHMuCisKKwkqIHRlc3QvTWFrZWZpbGUuYW06IHJlbW92ZSBhIGxvdCBvZiBzdHVmZiB0aGF0IGlzbid0IGltbWVkaWF0ZWx5CisJdXNlZnVsLCBpdCdzIGluIENWUyBoaXN0b3J5IGlmIHdlIHdhbnQgaXQuCisKKwkqIHRlc3QvdGVzdC1zZXJ2aWNlLmM6IHVzZSBkYnVzLW1haW5sb29wIGluc3RlYWQgb2YgdGhhdAorCXdhdGNoLltoY10gY3JhY2sKKworMjAwMy0wNC0wNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9NYWtlZmlsZS5hbTogc3BsaXQgbGlzdHMgb2Ygc291cmNlcyBpbnRvIHN0dWZmIHRoYXQgZ29lcyBpbgorCXRoZSBsaWJyYXJ5LCB1dGlsIGZ1bmN0aW9ucyB0aGF0IGdvIGluIHRoZSBsaWIgYW5kIGFyZSBhbHNvIHVzZWQKKwllbHNld2hlcmUsIGFuZCB1dGlsIGZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VkIGluIHRlc3RzL2RhZW1vbiBidXQKKwlkb24ndCBnbyBpbiB0aGUgbGliLgorCisJKiBkYnVzL2RidXMtbWFpbmxvb3AuaCwgZGJ1cy9kYnVzLW1haW5sb29wLmM6IG1vdmUgYnVzL2xvb3AuW2hjXQorCWhlcmUgc28gaXQgY2FuIGJlIHVzZWQgaW4gdGVzdCBiaW5hcmllcyBhbHNvCisKKzIwMDMtMDQtMDYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2JlY29tZV9kYWVtb24pOiB3cml0ZSB0aGUgcGlkZmlsZQorCWhlcmUgaW4gdGhlIHBhcmVudCBwcm9jZXNzLCBzbyB3ZSBjYW4gcmV0dXJuIGFuIGVycm9yIGlmIGl0CisJZmFpbHMuIEFsc28sIG1vdmUgc29tZSBvZiB0aGUgY29kZSBpbnRvIHRoZSBjaGlsZCBzbyB0aGUgcGFyZW50CisJaXMgbGVzcyBob3NlZCBpZiB3ZSBmYWlsIG1pZHdheSB0aHJvdWdoLgorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X25ldyk6IG1vdmUgcGlkZmlsZSBkZXRlY3Rpb24gZnVydGhlciB1cAorCWluIHRoZSBmdW5jdGlvbiwgYmVmb3JlIHdlIHN0YXJ0IG92ZXJ3cml0aW5nIHNvY2tldHMgYW5kIHN1Y2guCisKKwkqIGJ1cy9tZXNzYWdlYnVzLmluOiBhZGp1c3QgdGhpcyBhIGJpdCwgbm90IHN1cmUgaWYgaXQgd2lsbCB3b3JrLgorCisJKiBjb25maWd1cmUuaW46IGFkZCAtLXdpdGgtc3lzdGVtLXBpZC1maWxlIGFuZCAtLXdpdGgtc3lzdGVtLXNvY2tldAorCisyMDAzLTA0LTA2ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBjb25maWd1cmUuaW4gKERCVVNfU1lTVEVNX1BJRF9GSUxFKTogTmV3IHZhcmlhYmxlLgorCisJKiBidXMvc3lzdGVtLmNvbmYuaW46IERlY2xhcmUgYSBwaWRmaWxlLgorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X25ldyk6IFRlc3QgZm9yIGFuIGV4aXN0aW5nIHBpZCBmaWxlLCBhbmQKKwljcmVhdGUgb25lIChpZiBhcHByb3ByaWF0ZSkuCisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKGVudW0gRWxlbWVudFR5cGUpIFtFTEVNRU5UX1BJREZJTEVdOiBOZXcuCisJKHN0cnVjdCBCdXNDb25maWdQYXJzZXIpIFtwaWRmaWxlXTogTmV3LgorCShlbGVtZW50X3R5cGVfdG9fbmFtZSwgbWVyZ2VfaW5jbHVkZWQsIHN0YXJ0X2J1c2NvbmZpZ19jaGlsZCkKKwkoYnVzX2NvbmZpZ19wYXJzZXJfZW5kX2VsZW1lbnQsIGJ1c19jb25maWdfcGFyc2VyX2NvbnRlbnQpOiBIYW5kbGUgaXQuCisJKGJ1c19jb25maWdfcGFyc2VyX3VucmVmKTogRnJlZSBpdC4KKwkoYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3BpZGZpbGUpOiBOZXcgZnVuY3Rpb24uCisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmggKF9kYnVzX3dyaXRlX3BpZF9maWxlKTogUHJvdG90eXBlLgorCisJKiBkYnVzL2RidXMtZXJyb3JzLmggKERCVVNfRVJST1JfUElERklMRV9FWElTVFMpOiBOZXcgZXJyb3IuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3dyaXRlX3BpZF9maWxlKTogTmV3IGZ1bmN0aW9uLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5oOiBQcm90b3R5cGUgaXQuCisKKzIwMDMtMDQtMDYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfbmV3KTogcHJpbnQgdGhlIGFkZHJlc3MgaW4gaGVyZSwgcmF0aGVyCisJdGhhbiBpbiBtYWluKCksIGJlY2F1c2Ugd2UgbmVlZCB0byBkbyBpdCBiZWZvcmUgZm9ya2luZyB0aGUgZGFlbW9uCisKKwkqIGJ1cy9kaXNwYXRjaC5jIChzZW5kX3NlcnZpY2Vfbm9uZXhpc3RlbnRfZXJyb3IpOiBzZXQgdGhlIHNlbmRlcgorCW9uIHRoZSBzZXJ2aWNlIG5vbmV4aXN0ZW50IGVycm9yCisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfYWNxdWlyZV9zZXJ2aWNlKTogc2V0IHRoZQorCXNlbmRlciBvbiB0aGUgQWNxdWlyZVNlcnZpY2UgcmVwbHkKKworCSogdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwuY29uZi5pbjogTWFrZSB0ZXN0CisJc2VydmVyIGFsc28gbGlzdGVuIG9uIGEgVU5JWCBzb2NrZXQgc28gc2VydmljZXMgY2FuIGNvbm5lY3QgdG8gaXQuCisKKzIwMDMtMDQtMDYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy10aHJlYWRzLmM6IFJlZG8gaG93IHRoZSBmYWtlIGRlYnVnIG11dGV4ZXMgYXJlIGRvbmUKKwlzbyBpdCBkZXRlY3RzIGRlYWRsb2NrcyBhbmQgYWxzbyB3ZSBhY3R1YWxseSBpbml0IHRocmVhZHMgd2hlbgorCWRlYnVnZ2luZy4KKworMjAwMy0wNC0wNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLXNlcnZlci11bml4LmMgKF9kYnVzX3NlcnZlcl9uZXdfZm9yX2RvbWFpbl9zb2NrZXQpOgorCXNhdmUgdGhlIGRvbWFpbiBzb2NrZXQgbmFtZSwgYW5kIHVubGluayBpdCB3aGVuIHdlIGRpc2Nvbm5lY3QgdGhlCisJc2VydmVyLiBNZWFucyB0aGF0IGF0IGxlYXN0IHdoZW4gd2UgZXhpdCBub3JtYWxseSwgd2Ugd29uJ3QgbGVhdmUKKwlhIGJ1bmNoIG9mIGp1bmsgaW4gL3RtcAorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYworCShfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl9kb21haW5fc29ja2V0KTogY29kZSBjbGVhbnVwIChuaWNlcgorCW1lbW9yeSBtYW5hZ2VtZW50KS4gKEkgd2FzIG1ha2luZyBhIHJlYWwgY2hhbmdlIGhlcmUgYnV0IHRoZW4KKwlkaWRuJ3QpCisKKzIwMDMtMDQtMDYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfbmV3KTogZml4IHdyb25nIGhhbmRsaW5nIG9mCisJc2VydmVyX2RhdGFfc2xvdF91bnJlZigpIGluIHRoZSBlcnJvciBjYXNlLgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmggKF9kYnVzX2Fzc2VydCk6IGNoYW5nZSBzbyBpdCBwYXNzZXMKKwkiKGNvbmRpdGlvbikgIT0gMCIgdG8gX2RidXNfcmVhbF9hc3NlcnQgc28gdGhhdAorCSJfZGJ1c19hc3NlcnQgKHBvaW50ZXIpIiBkb2Vzbid0IGNhdXNlIGEgd2FybmluZworCisJKiBidXMvbWFpbi5jIChtYWluKTogYWNjZXB0IC0tcHJpbnQtYWRkcmVzcyBvcHRpb24gdG8gcHJpbnQgb3V0CisJdGhlIG1lc3NhZ2UgYnVzIGFkZHJlc3MKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2FzY2lpKTogZXhwb3J0IHRoaXMKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jIChfZGJ1c190cmFuc3BvcnRfb3Blbik6IHNwZWNpYWwgZXJyb3IgZm9yCisJInRtcGRpciIgb3B0aW9uIHRvIHVuaXg6IGFkZHJlc3Mgb24gY2xpZW50IHNpZGUKKworCSogZGJ1cy9kYnVzLXNlcnZlci5jIChkYnVzX3NlcnZlcl9saXN0ZW4pOiBoYW5kbGUgInRtcGRpciIgb3B0aW9uCisJdG8gdW5peDogYWRkcmVzcworCisJKiBjb25maWd1cmUuaW4gKFRFU1RfU09DS0VUX0RJUik6IGxvY2F0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkKKwl3ZSBjYW4gdXNlIHRvIGNyZWF0ZSBzb2NrZXRzIGluIHRoZSB0ZXN0IHN1aXRlLgorCisJKiBidXMvbWFpbi5jIChzaWduYWxfaGFuZGxlcik6IG9uIFNJR1RFUk0sIGV4aXQgdGhlIGRhZW1vbgorCWNsZWFubHkuIFRvIGJlIHVzZWQgZm9yIHRlc3RpbmcuCisKKwkqIGRidXMvZGJ1cy1zcGF3bi5jIChiYWJ5c2l0KTogdXNlIF9kYnVzX3NldF9zaWduYWxfaGFuZGxlcigpCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3NldF9zaWduYWxfaGFuZGxlcik6IG5ldworCisJKiBkYnVzL2RidXMtc2VydmVyLWRlYnVnLXBpcGUuYyAoX2RidXNfdHJhbnNwb3J0X2RlYnVnX3BpcGVfbmV3KToKKwloYW5kbGUgdHJ5aW5nIHRvIGNhbGwgdGhpcyB3aGVuIHRoZXJlJ3Mgbm8gc2VydmVycyBhY3RpdmUKKworMjAwMy0wNC0wNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogTkVXUzogdXBkYXRlCisKKwkqIGNvbmZpZ3VyZS5pbjogMC44CisKKzIwMDMtMDQtMDUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9idXMuYyAoc2V0dXBfc2VydmVyKTogZml4IHRoaXMgc28gZGJ1cy1kYWVtb24tMSBkb2Vzbid0CisJY3Jhc2ggb24gc3RhcnR1cC4gTmVlZCB0byBnZXQgInRyeSBzdGFydGluZyB0aGUgZGFlbW9uIgorCWluIHRoZSB0ZXN0IHN1aXRlIEkgZ3Vlc3MuIDstKQorCisJKiBkYnVzL2RidXMtc2VydmVyLmgsIGRidXMvZGJ1cy1zZXJ2ZXIuYzogcmVtb3ZlIHRoZSBzdHVmZiB0aGF0CisJdHJhY2tlZCB0aGUgbnVtYmVyIG9mIG9wZW4gY29ubmVjdGlvbnM7IGl0J3MgYmV0dGVyIGRvbmUgaW4KKwlhcHBsaWNhdGlvbi1zcGVjaWZpYyBjb2RlIGFzIHlvdSB3YW50IGl0IHRvIHNwYW4gYWxsIHNlcnZlcnMgZXRjLgorCisyMDAzLTA0LTA1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvTWFrZWZpbGUuYW0gKGluc3RhbGwtZGF0YS1ob29rKTogYWRkIG1pc3NpbmcgREVTVERJUiwKKwlwYXRjaCBmcm9tIENvbGluIFdhbHRlcnMKKworMjAwMy0wNC0wNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZG9jL2NvbmZpZy1maWxlLnR4dCAoRWxlbWVudHMpOiBmaXggZG9jcyBvZiA8YXV0aD4gdG8gcmVmbGVjdAorCXJlYWxpdHk7IGluIGZhY3QgbXVsdGlwbGUgbWVjaGFuaXNtcyBhcmUgYWxsb3dlZC4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c19yZWFsX2Fzc2VydCkKKwkoX2RidXNfcmVhbF9hc3NlcnRfbm90X3JlYWNoZWQpOiBtb3ZlIGd1dHMgb2YgX2RidXNfYXNzZXJ0KCkgYW5kCisJX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCkgaW50byBmdW5jdGlvbnMsIHNvIHRoYXQgdGhleSBkb24ndCBzaG93CisJdXAgaW4gYmFzaWMgYmxvY2sgY291bnRzIGZvciB0ZXN0IGNvdmVyYWdlLCBhbmQgZG9uJ3QgdXNlIHVwIGFzCisJbXVjaCBkaXNrIHNwYWNlLiBEb2VzIG1lYW4gc2xvd2VyIGV4ZWN1dGlvbiBzcGVlZCB0aG91Z2gsIHNvCisJYXNzdW1lcyAtLWRpc2FibGUtYXNzZXJ0cyBpcyB0aGUgbm9ybWFsIHByb2R1Y3Rpb24gY2FzZS4KKworMjAwMy0wNC0wNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogdGVzdC9NYWtlZmlsZS5hbSAoZGlzdC1ob29rKTogYWxzbyBkaXN0ICouaW4gZmlsZXMKKworCSogTkVXUzogdXBkYXRlCisKKwkqIGNvbmZpZ3VyZS5pbjogMC43CisKKzIwMDMtMDQtMDUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYzogZG9jcyB3YXJuaW5nCisKKwkqIGRidXMvZGJ1cy1zcGF3bi5jOiBtaXNzaW5nIGRvY3MKKworCSogZGJ1cy9kYnVzLW1lbW9yeS5jIChzdHJ1Y3QgU2h1dGRvd25DbG9zdXJlKTogbWlzc2luZyBkb2NzCisKKzIwMDMtMDQtMDUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9sb29wLmMgKGJ1c19sb29wX2l0ZXJhdGUpOiBmaXggdGhlIHRpbWVvdXQgY29kZSwgdXNpbmcKKwltYWdpYyBmcm9tIEdMaWIKKworCSogZGJ1cy9kYnVzLXNwYXduLmMgKF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYpOiBzZXQgc2l0dGVyX3BpZAorCXRvIC0xIG9uY2Ugd2UndmUgcmVhcGVkIHRoZSBiYWJ5c2l0dGVyCisJKF9kYnVzX2JhYnlzaXR0ZXJfaGFuZGxlX3dhdGNoKTogZG8gYXMgbXVjaCB3b3JrIGFzIHdlIGNhbiwgbm90CisJanVzdCBvbmUgZ28gb2YgaXQKKworCSogYnVzL2FjdGl2YXRpb24uYzogYWRkIGNvZGUgdXNpbmcgREJ1c0JhYnlzaXR0ZXIgc28gdGhhdCB3ZQorCWhhbmRsZSBpdCB3aGVuIGEgc2VydmljZSBmYWlscyB0byBzdGFydCB1cCBwcm9wZXJseS4KKwkoYnVzX2FjdGl2YXRpb25fc2VydmljZV9jcmVhdGVkKTogZG9uJ3QgcmVtb3ZlIHRoZSBhY3RpdmF0aW9uCisJZW50cmllcyBhcyB3ZSBnbywganVzdCBsZXQgdGhlbSBnZXQgcmVtb3ZlZCB3aGVuIHdlIGZyZWUgdGhlIHBlbmRpbmcKKwlhY3RpdmF0aW9uLiBVbnJlZiByZXBseSBtZXNzYWdlcyBhZnRlciBzZW5kaW5nIHRoZW0uCisKKzIwMDMtMDQtMDUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIHRlc3QvZGVjb2RlLWdjb3YuYyAobWFpbik6IHByaW50IHBlci1kaXJlY3Rvcnkgc3RhdHMgaW4gdGhlIHJlcG9ydAorCisJKiBNYWtlZmlsZS5hbSAoY292ZXJhZ2UtcmVwb3J0LnR4dCk6IGRvbid0IGluY2x1ZGUgdGVzdC8qIGluIGdjb3Ygc3RhdHMKKworMjAwMy0wNC0wNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogTWFrZWZpbGUuYW0gKGNvdmVyYWdlLXJlcG9ydC50eHQpOiBhZGQgdGFyZ2V0ICJjb3ZlcmFnZS1yZXBvcnQudHh0IgorCisJKiB0ZXN0L2RlY29kZS1nY292LmM6IGhhY2sgdXAgYSBsaXR0bGUgcHJvZ3JhbSB0byBzdWNrIGRhdGEKKwlvdXQgb2YgZ2NvdiBmaWxlcy4gWWVzIHRoaXMgaXMgc29ydCBvZiBzaWxseS4KKworCSogY29uZmlndXJlLmluOiBkZWZpbmUgc29tZXRoaW5nIGluIGNvbmZpZy5oIGFuZCBkbyBhbgorCUFNX0NPTkRJVElPTkFMIHdoZW4gZ2NvdiBpcyBlbmFibGVkCisKKzIwMDMtMDQtMDQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3Bhd24uYywgZGJ1cy9kYnVzLXNwYXduLmg6IENoYW5nZSBkYnVzX3NwYXduIHRvCisJcmV0dXJuIGEgImJhYnlzaXR0ZXIiIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gbW9uaXRvciB0aGUgc3RhdHVzIG9mCisJdGhlIHNwYXduZWQgcHJvY2VzcyBhbmQgcmVhcCBpdCB3aGVuIHJlcXVpcmVkLgorCisJKiB0ZXN0L3Rlc3Qtc2VnZmF1bHQuYywgdGVzdC90ZXN0LWV4aXQuYywKKwl0ZXN0L3Rlc3Qtc2xlZXAtZm9yZXZlci5jOiBiaW5hcmllcyB0aGF0IGRvIHZhcmlvdXMgbGFtZSB0aGluZ3MsCisJdXNlZCBpbiB0aGUgdGVzdCBzdWl0ZS4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYzoga2lsbCBfZGJ1c19lcnJub190b19zdHJpbmcoKQorCisyMDAzLTA0LTAzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtc3Bhd24uYzogTW92ZSBkYnVzLXNwYXduIGludG8gYSBzZXBhcmF0ZSBmaWxlCisJaW4gcHJlcGFyYXRpb24gZm9yIG1vZGlmeWluZyBpdCwgZGJ1cy1zeXNkZXBzIGlzIGdldHRpbmcKKwlhIGJpdCB1bm1hbmFnZWFibGUuCisKKzIwMDMtMDQtMDMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvbG9vcC5oLCBidXMvbG9vcC5jOiBtYWtlIHRoZSBtYWlubG9vcCBhbiBvYmplY3Qgc28gd2UgY2FuCisJaGF2ZSBtdWx0aXBsZSBvbmVzCisKKwkqIGJ1cy8qLltoY106IGFkYXB0IHRvIG1haW5sb29wIGNoYW5nZQorCisyMDAzLTA0LTAzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL2FjdGl2YXRpb24uYyAobG9hZF9kaXJlY3RvcnkpOiBmaXggdXAgbWVtbGVha3MKKwkoYnVzX2FjdGl2YXRpb25fZW50cnlfZnJlZSk6IGZyZWUgdGhlIGVudHJ5CisKKwkqIGRidXMvZGJ1cy1idXMuYyAoZGJ1c19idXNfYWNxdWlyZV9zZXJ2aWNlKTogcmV0dXJuIGFuIGVycm9yIGlmCisJd2UgZ2V0IG9uZSBmcm9tIHRoZSBtZXNzYWdlIGJ1czsgZml4IG1lbWxlYWtzLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UpOiBuZXcgZnVuY3Rpb24KKworMjAwMy0wNC0wMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYyAoYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYpOiBmcmVlCisJbGlzdCBvZiBtZWNoYW5pc21zLCBidWcgZGlzY292ZXJlZCBieSB0ZXN0IHN1aXRlIGVuaGFuY2VtZW50cworCShwdXR0aW5nIHN5c3RlbS5jb25mIGFuZCBzZXNzaW9uLmNvbmYgaW50byBzdWl0ZSkKKworCSogdGVzdC9NYWtlZmlsZS5hbSwgdGVzdC90ZXN0LXNlcnZpY2UuYzogYWRkIHBsYWNlaG9sZGVyIGZvciBhCisJdGVzdCBzZXJ2aWNlIHRoYXQgd2UnbGwgYWN0aXZhdGUgYXMgcGFydCBvZiB0ZXN0IHN1aXRlLiBEb2Vzbid0CisJZG8gYW55dGhpbmcgeWV0LgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19zZXRlbnYpOiBzdXBwb3J0IHVuc2V0ZW52IGJ5CisJc2V0dGluZyBOVUxMIHZhbHVlLCBhbmQgdXNlIHN5c3RlbSBtYWxsb2Mgbm90IGRidXNfbWFsbG9jKCkKKwl3aGVuIHdlIGhhdmUgdW5hdm9pZGFibGUgbWVtbGVha2FnZS4KKworCSogZGJ1cy9kYnVzLWJ1cy5jIChkYnVzX2J1c19nZXQpOiBmaXggYnVnIHdoZXJlIGJ1cyB0eXBlIG9mIDAKKwlkaWRuJ3Qgd29yaywgYW5kIHN1cHBvcnQgREJVU19CVVNfQUNUSVZBVElPTi4KKworCSogYnVzL2FjdGl2YXRpb24uYyAoY2hpbGRfc2V0dXApOiBwYXNzIG91ciB3ZWxsLWtub3duIGJ1cyB0eXBlIHRvCisJdGhlIGNoaWxkCisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmM6IHN1cHBvcnQgPHR5cGU+IHRvIHNwZWNpZnkgd2VsbC1rbm93biB0eXBlCisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDogZG9jdW1lbnQgdGhlIGVudiB2YXJpYWJsZXMgdG8KKwlsb2NhdGUgd2VsbC1rbm93biBidXNlcyBhbmQgZmluZCBzZXJ2aWNlIGFjdGl2YXRvcgorCisyMDAzLTA0LTAyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdGVzdC9NYWtlZmlsZS5hbSAoYWxsLWxvY2FsKTogYWRkIGEgcnVsZSB0byBjb3B5IHRlc3RzIHRvCisJYnVpbGRkaXIsIHNvIHdlIGNhbiBoYXZlIGdlbmVyYXRlZCB0ZXN0cy4gVXNlIHRoaXMgdG8gcmVtb3ZlIHRoZQorCXNpbGx5IGhhY2sgZm9yIHRlc3Rpbmcgc3lzdGVtLmNvbmYgYW5kIHNlc3Npb24uY29uZi4gV2lsbCB1c2UgdGhpcworCXNob3J0bHkgdG8gZ2VuZXJhdGUgLnNlcnZpY2UgZmlsZXMgcG9pbnRpbmcgdG8gdGVzdCBiaW5hcmllcy4KKworMjAwMy0wNC0wMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoc2V0X2xlbmd0aCk6IGZpeCBhIGJ1ZyAtIHdlIGFsbG9jYXRlZCBtYXggb2YKKwljdXJyZW50IGFsbG9jIGFuZCBuZWVkZWQgbmV3IGxlbmd0aCwgbm90IG1heCBvZiB0aGUgZG91YmxlZAorCWFsbG9jYXRpb24gYW5kIG5lZWRlZCBuZXcgbGVuZ3RoLiBBbHNvLCB3aGVuIGJ1aWxkaW5nIHRlc3RzLAorCWRvbid0IGRvIHRoZSBkb3VibGUtYWxsb2NhdGlvbiBzdHVmZiwganVzdCByZWFsbG9jIGV2ZXJ5IHRpbWUuCisKKzIwMDMtMDQtMDIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19maWxlX2dldF9jb250ZW50cyk6IGluY2x1ZGUgZmlsZW5hbWVzCisJaW4gZXJyb3IgbWVzc2FnZXMKKwkoX2RidXNfc3RyaW5nX2dldF9kaXJuYW1lKTogbmV3CisJKF9kYnVzX3N5c2RlcHNfdGVzdCk6IG5ldworCShfZGJ1c19kaXJlY3Rvcnlfb3Blbik6IGluY2x1ZGUgZGlybmFtZXMgaW4gZXJyb3IgbWVzc2FnZXMKKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYzogaW50ZXJwcmV0IDxpbmNsdWRlPiBhbmQgPGluY2x1ZGVkaXI+IGFuZAorCTxzZXJ2aWNlZGlyPiByZWxhdGl2ZSB0byBjb25maWcgZmlsZSBsb2NhdGlvbiBpZiB0aGUgZ2l2ZW4KKwlmaWxlbmFtZSBpcyBub3QgYWJzb2x1dGUuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2ZpbmRfYnl0ZV9iYWNrd2FyZCk6IG5ldworCisyMDAzLTA0LTAyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX3RyYW5zYWN0aW9uX3NlbmRfZXJyb3JfcmVwbHkpOiBzZXQgc2VuZGVyCisJc2VydmljZSBmb3IgdGhlIGVycm9yLCBhbmQgdW5yZWYgdGhlIHJlcGx5IG9uIHN1Y2Nlc3MKKworCSogYnVzL2FjdGl2YXRpb24uYzogY29udmVydCB0byB1c2UgQnVzVHJhbnNhY3Rpb24gc28gT09NIGNhbiBiZQorCWhhbmRsZWQgY29ycmVjdGx5CisJKGJ1c19hY3RpdmF0aW9uX3NlcnZpY2VfY3JlYXRlZCk6IHNldCBzZW5kZXIgb2YgdGhlIG1lc3NhZ2UKKworMjAwMy0wNC0wMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMsIGJ1cy9idXMuYzogaW1wbGVtZW50IDxzZXJ2aWNlZGlyPiBhbmQKKwk8aW5jbHVkZWRpcj4gKGF0IGxlYXN0IG1vc3RseSkKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfY2hhbmdlX2lkZW50aXR5KTogc2V0IHRoZSBncm91cCBJRAorCWZpcnN0LCB0aGVuIHRoZSB1c2VyIElECisKKzIwMDMtMDQtMDEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYyAoZGJ1c19zZXJ2ZXJfc2V0X2F1dGhfbWVjaGFuaXNtcyk6IG5ldworCWZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKF9kYnVzX2F1dGhfc2V0X21lY2hhbmlzbXMpOiBuZXcKKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c19kdXBfc3RyaW5nX2FycmF5KTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2xpc3Rlbl91bml4X3NvY2tldCk6IGNobW9kIHRoZQorCXNvY2tldCAwNzc3LCBhbmQgdW5saW5rIGFueSBleGlzdGluZyBzb2NrZXQuCisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfbmV3KTogY2hhbmdlIG91ciBVSUQvR0lEIGFuZCBmb3JrIGlmCisJdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBzbyBzcGVjaWZpZXM7IHNldCB1cCBhdXRoIG1lY2hhbmlzbQorCXJlc3RyaWN0aW9ucworCisJKiBidXMvY29uZmlnLXBhcnNlci5jIChidXNfY29uZmlnX3BhcnNlcl9jb250ZW50KTogYWRkIHN1cHBvcnQKKwlmb3IgPGZvcms+IG9wdGlvbiBhbmQgZmlsbCBpbiBjb2RlIGZvciA8YXV0aD4KKworCSogYnVzL3N5c3RlbS5jb25mLmluOiBhZGQgPGZvcmsvPiB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sCisJYW5kIGxpbWl0IGF1dGggbWVjaGFuaXNtcyB0byBFWFRFUk5BTAorCisJKiBkb2MvY29uZmlnLWZpbGUudHh0IChFbGVtZW50cyk6IGFkZCA8Zm9yaz4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfYmVjb21lX2RhZW1vbik6IG5ldyBmdW5jdGlvbgorCShfZGJ1c19jaGFuZ2VfaWRlbnRpdHkpOiBuZXcgZnVuY3Rpb24KKworMjAwMy0wMy0zMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2Nvbm5lY3RfdW5peF9zb2NrZXQpCisJKF9kYnVzX2xpc3Rlbl91bml4X3NvY2tldCk6IGZpeCBvZmYtYnktb25lIGVycm9yIGluIG51bGwKKwl0ZXJtaW5hdGlvbiBzcG90dGVkIGJ5IE5hbGluCisKKzIwMDMtMDMtMzEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMta2V5cmluZy5jIChfZGJ1c19rZXlyaW5nX25ld19ob21lZGlyKTogYWxsb3cgc2V0dGluZworCURCVVNfVEVTVF9IT01FRElSIHdoZW4gdGVzdHMgYXJlIGVuYWJsZWQsIHNvIHdlIGNhbiB0ZXN0IHdpdGhvdXQKKwloYXZpbmcgYSByZWFsIGhvbWUgZGlyZWN0b3J5IGF2YWlsYWJsZS4KKworMjAwMy0wMy0zMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9NYWtlZmlsZS5hbSAoaW5zdGFsbC1kYXRhLWhvb2spOiBjcmVhdGUgL3Zhci9ydW4vZGJ1cworCisJKiBidXMvbWVzc2FnZWJ1cy5pbjogYWRkIGluaXQgc2NyaXB0IGZvciBSZWQgSGF0IC9ldGMvaW5pdC5kCisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIHN1cHBvcnQgZm9yIHNwZWNpZnlpbmcgYSBzdHlsZSBvZiBpbml0IHNjcmlwdAorCXRvIGluc3RhbGwKKworMjAwMy0wMy0zMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKyAgICAgICAgRml4IHNvbWUgYW5ub3lpbmcgREJ1c1N0cmluZyBBUEkgYW5kIGZpeCBhbGwgYWZmZWN0ZWQgY29kZS4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfaW5pdCk6IGdldCByaWQgb2YgYW5ub3lpbmcKKwltYXhfbGVuZ3RoIGFyZ3VtZW50CisJKF9kYnVzX3N0cmluZ19nZXRfZGF0YSk6IGNoYW5nZSB0byByZXR1cm4gc3RyaW5nIGluc3RlYWQgb2YgdXNpbmcKKwlhbiBvdXQgcGFyYW0KKwkoX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhKTogZGl0dG8KKwkoX2RidXNfc3RyaW5nX2dldF9kYXRhX2xlbik6IGRpdHRvCisJKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4pOiBkaXR0bworCisyMDAzLTAzLTMxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL21haW4uYyAobWFpbik6IGZpeCB1cCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0byBiZSBuaWNlcgorCisyMDAzLTAzLTMxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9NYWtlZmlsZS5hbSAoSU5DTFVERVMpOiB1c2UgRVhQQU5ERURfTE9DQUxTVEFURURJUiB0bworCWRlZmluZSBEQlVTX1NZU1RFTV9CVVNfUEFUSCBhcyB3ZSB3YW50IHRvIGNvbXBpbGUgaW4gdGhlIHNhbWUKKwlmaW5hbCBsb2NhdGlvbiB0aGF0IGxhbmRzIGluIHRoZSBjb25maWcgZmlsZQorCisJKiBidXMvY29uZmlnLWxvYWRlci1leHBhdC5jIChidXNfY29uZmlnX2xvYWQpOiBmaXggdHlwZSBvZgorCVhNTF9QYXJzZXIgdmFyaWFibGUKKworCSogZG9jL1RPRE86IHJlbW92ZSBUT0RPIGl0ZW0gZm9yIGRidXNfYnVzX2dldCgpCisKKwkqIGRidXMvZGJ1cy1idXMuYyAoYnVzX2RhdGFfZnJlZSk6IGFkZCBtaXNzaW5nIGxvY2svdW5sb2NrCisKKzIwMDMtMDMtMzEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jIChfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl9kb21haW5fc29ja2V0KQorCShfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl90Y3Bfc29ja2V0KTogdGhlc2UgZGlkbid0IG5lZWQgdGhlICJzZXJ2ZXIiCisJYXJndW1lbnQgc2luY2UgdGhleSBhcmUgYWx3YXlzIGNsaWVudCBzaWRlCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYyAoZGJ1c19zZXJ2ZXJfZ2V0X2FkZHJlc3MpOiBuZXcgZnVuY3Rpb24KKworCSogYnVzL21haW4uYyAobWFpbik6IHRha2UgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBhcyBhbiBhcmd1bWVudC4KKworCSogdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwuY29uZjogbmV3IGZpbGUgdG8KKwl1c2Ugd2l0aCBkaXNwYXRjaC5jIHRlc3RzIGZvciBleGFtcGxlCisKKwkqIGJ1cy90ZXN0LW1haW4uYyAobWFpbik6IHJlcXVpcmUgdGVzdCBkYXRhIGRpcgorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X25ldyk6IGNoYW5nZSB0aGlzIHRvIHRha2UgYQorCWNvbmZpZ3VyYXRpb24gZmlsZSBuYW1lIGFzIGFyZ3VtZW50CisKKwkqIGRvYy9jb25maWctZmlsZS50eHQgKEVsZW1lbnRzKTogYWRkIDxzZXJ2aWNlZGlyPgorCisJKiBidXMvc3lzdGVtLmNvbmYsIGJ1cy9zZXNzaW9uLmNvbmY6IG5ldyBmaWxlcworCisJKiBkYnVzL2RidXMtYnVzLmMgKGRidXNfYnVzX2dldCk6IGxvb2sgZm9yIHN5c3RlbSBidXMgb24KKwl3ZWxsLWtub3duIHNvY2tldCBpZiBub25lIHNldAorCisJKiBjb25maWd1cmUuaW46IGNyZWF0ZSBzeXN0ZW0uY29uZiBhbmQgc2Vzc2lvbi5jb25mCisKKzIwMDMtMDMtMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmM6IGhhY2tpbmcKKworCSogZGJ1cy9kYnVzLW1lbW9yeS5jOiBkb24ndCB1c2UgREJ1c0xpc3QgZm9yIHRoZSBsaXN0IG9mIHN0dWZmCisJdG8gc2h1dCBkb3duLCBzaW5jZSBpdCBjb3VsZCBjYXVzZSB3ZWlyZG5lc3Mgd2l0aCB0aGUgREJ1c0xpc3QKKwlsb2NrCisKKwkqIGRidXMvZGJ1cy1saXN0LmMgKF9kYnVzX2xpc3RfdGVzdCk6IGFkZCB0ZXN0cyBmb3IgdGhlCisJbGluay1vcmllbnRlZCBzdGFjayByb3V0aW5lcworCShhbGxvY19saW5rKTogZnJlZSB0aGUgbWVtcG9vbCBpZiB0aGUgZmlyc3QgYWxsb2MgZnJvbSBpdCBmYWlscworCisJKiBkYnVzL2RidXMtbWVtcG9vbC5jIChzdHJ1Y3QgREJ1c01lbUJsb2NrKTogZml4IGFsaWdubWVudCBpc3N1ZQorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKFVOSUNPREVfVkFMSUQpOiBzeW5jIG5ldyB2ZXJzaW9uIG9mIHRoaXMKKwlmcm9tIEdMaWIKKwkoX2RidXNfc3RyaW5nX3NraXBfd2hpdGUpOiBuZXcKKworCSogZG9jL2NvbmZpZy1maWxlLnR4dCAoRWxlbWVudHMpOiBhZGQgPGluY2x1ZGVkaXI+CisKKzIwMDMtMDMtMjggIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2NvcHlfZGF0YV9sZW4pCisJKF9kYnVzX3N0cmluZ19jb3B5X2RhdGEpOiBuZXcgZnVuY3Rpb25zCisKKzIwMDMtMDMtMjggIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtYnVzLmM6IChidXNfZGF0YV9mcmVlKSwgKGRidXNfYnVzX2dldCk6CisJKiBkYnVzL2RidXMtYnVzLmg6CisJQWRkIGRidXNfYnVzX2dldC4KKworCSogZGJ1cy9kYnVzLW1lbW9yeS5jOgorCUZpeCBhIGRvYyBjb21tZW50LgorCisyMDAzLTAzLTI4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvdGVzdC5jIChidXNfdGVzdF9mbHVzaF9idXMpOiByZW1vdmUgdGhlIHNsZWVwIGZyb20gaGVyZSwKKwlJIHRoaW5rIGl0IG1heSBoYXZlIGp1c3QgYmVlbiBzdXBlcnN0aXRpb24uIE5vdCBzdXJlLgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19iYXNlNjRfZGVjb2RlKTogY2F0Y2ggc29tZSBPT00KKwlmYWlsdXJlcyB0aGF0IHdlcmUgbm90IGJlaW5nIGhhbmRsZWQuCisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKHByb2Nlc3NfYXV0aCk6IGZpeCBhIG1lbWxlYWsgaW4gT09NIGhhbmRsaW5nCisKKwkqIGRidXMvZGJ1cy1tZW1vcnkuYzogYWRkIGFiaWxpdHkgdG8gc2V0IG51bWJlciBvZiBtYWxsb2NzIGluIGEKKwlyb3cgdGhhdCB3aWxsIGZhaWwgb24gb3V0LW9mLW1lbW9yeS4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c190ZXN0X29vbV9oYW5kbGluZyk6IGNvbnZlbmllbmNlCisJZnVuY3Rpb24gZm9yIHRlc3Rpbmcgb3V0LW9mLW1lbW9yeSBoYW5kbGluZy4KKworCSogYnVzL2NvbmZpZy1sb2FkZXItZXhwYXQuYyAobWVtc3VpdGUpOiBkb24ndCB3cmFwIHRoZSBkYnVzCisJYWxsb2NhdGlvbiBmdW5jdGlvbnMsIHRoZXkgZG8gbWFwIGV4YWN0bHkgdG8gdGhlIGV4cGF0IG9uZXMuCisKKzIwMDMtMDMtMjcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvY29uZmlnLWxvYWRlci1saWJ4bWwuYyAoYnVzX2NvbmZpZ19sb2FkKTogYWRkIGFub3RoZXIgZXJyb3IKKwljaGVjaworCisyMDAzLTAzLTI2ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZG9jL1RPRE86CisJQWRkIG5vdGUgYWJvdXQgYXV0b21hdGljIHNlcnZpY2UgYWN0aXZhdGlvbi4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOgorCVJlbmFtZSB0aGUgc3BlY2lmaWNhdGlvbiBhbmQgY2xhcmlmeSBhIGZldyB0aGluZ3MuCisKKzIwMDMtMDMtMjYgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBEb3h5ZmlsZS5pbjoKKwkqIGRidXMvZGJ1cy1hZGRyZXNzLmM6CisJKiBkYnVzL2RidXMtZGljdC5jOgorCSogZGJ1cy9kYnVzLW1hcnNoYWwuYzoKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5jOgorCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmM6CisJRml4IGRvY3VtZW50YXRpb24gd2FybmluZ3MuCisKKzIwMDMtMDMtMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy90ZXN0LW1haW4uYywgZGJ1cy9kYnVzLXRlc3QuYyAobWFpbik6IGNoZWNrIG1lbWxlYWtzCisJYWZ0ZXIgZXZlcnkgdGVzdCBzbyBpdCdzIHF1aWNrIGFuZCBlYXN5IHRvIHNlZSB3aGljaCBsZWFrZWQsIGFuZAorCXNvIHdlIHRlc3QgbXVsdGlwbGUgZGJ1c19zaHV0ZG93bigpIGNhbGxzCisKKwkqIGNvbmZpZ3VyZS5pbjogY2hhbmdlIGNvbmZpZ3VyZS5pbiBYTUwgc3R1ZmYgdG8gYWxzbyBzdXBwb3J0CisJZXhwYXQKKworCSogY29uZmlnLWxvYWRlci1saWJ4bWwuYzogc29tZSBoYWNraW5nCisKKwkqIGNvbmZpZy1sb2FkZXItZXhwYXQuYzogc29tZSBoYWNraW5nCisKKwkqIGNvbmZpZy1wYXJzZXIuYzogc29tZSBoYWNraW5nLCBwbHVzIHRlc3RzCisKKzIwMDMtMDMtMjUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisgICAgICAgICogdGhyb3VnaG91dCAtIGFkZCBtb3JlIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUgorCisJKiBjb25maWd1cmUuaW46IGFkZCAtLXdpdGgteG1sIG9wdGlvbiB0byBzcGVjaWZ5IFhNTCBsaWJyYXJ5LAorCXJpZ2h0IG5vdyBvbmx5IGxpYnhtbCBpcyBzdXBwb3J0ZWQuCisKKwkqIGJ1cy9jb25maWctbG9hZGVyLWxpYnhtbC5jLCBjb25maWctcGFyc2VyLmM6IHN5bmMgc29tZSBtaW5vcgorCW5vbndvcmtpbmcgY29kZSBiZXR3ZWVuIGhvbWUgYW5kIHdvcmssIHN0aWxsIGp1c3Qgc3R1YnMKKworMjAwMy0wMy0yNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3NldF9mZF9ub25ibG9ja2luZyk6IG1vdmUgdG8gdGhpcworCWZpbGUKKworCSogZGJ1cy9kYnVzLWVycm9ycy5jIChkYnVzX3NldF9lcnJvciwgZGJ1c19zZXRfZXJyb3JfY29uc3QpOiBhbGxvdworCU5VTEwgYXJndW1lbnQgZm9yICJtZXNzYWdlIiBpZiB0aGUgZXJyb3IgaXMgYSB3ZWxsLWtub3duIG9uZSwKKwlmaWxsIGluIGEgZ2VuZXJpYyBtZXNzYWdlIGluIHRoaXMgY2FzZS4KKworCSogZGJ1cy9kYnVzLWVycm9ycy5oIChEQnVzUmVzdWx0Q29kZSk6IEtpbGwgREJ1c1Jlc3VsdENvZGUgaW4KKwlmYXZvciBvZiBEQnVzRXJyb3IKKworCSogYnVzL3Rlc3QuYyAoYnVzX3Rlc3RfZmx1c2hfYnVzKTogYWRkCisKKwkqIGJ1cy9wb2xpY3kuYyAoYnVzX3BvbGljeV90ZXN0KTogdGVzdCBjb2RlIHN0dWIKKworMjAwMy0wMy0yNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25zX3NldHVwX2Nvbm5lY3Rpb24pOiBzZXQgdXAKKwl0aGUgImNhbiB0aGlzIHVzZXIgY29ubmVjdCIgZnVuY3Rpb24sIGJ1dCBpdCBhbHdheXMgcmV0dXJucworCVRSVUUgdW50aWwgd2UgaGF2ZSBhIGNvbmZpZyBmaWxlIHBhcnNlciBzbyB3ZSBjYW4gaGF2ZSBhIGNvbmZpZworCWZpbGUgdGhhdCBhbGxvd3MgY29ubmVjdGlvbnMuCisKKzIwMDMtMDMtMjMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy10aHJlYWRzLmMgKGRidXNfbXV0ZXhfbmV3LCBkYnVzX2NvbmR2YXJfbmV3KTogd2l0aAorCURCVVNfQlVJTERfVEVTVFMsIGFjdHVhbGx5IGFsbG9jL2ZyZWUgYSBibG9jayBvZiBtZW1vcnkgZm9yCisJdGhlIG11dGV4LCBzbyB3ZSBjYW4gY2hlY2sgZm9yIHByb3BlciBtZW1vcnkgbWFuYWdlbWVudAorCWFuZCBPT00gaGFuZGxpbmcuCisKKwkqIGRidXMvZGJ1cy1kYXRhc2xvdC5jOiByZW1vdmUgdGhlIG11dGV4IGZyb20KKwlEQnVzRGF0YVNsb3RBbGxvY2F0b3IgYW5kIGxvY2sgaXQgbWFudWFsbHkgd2hlbiB1c2luZyBpdCwKKwl0byBzaW1wbGlmeSBmaXR0aW5nIGl0IGludG8gdGhlIGdsb2JhbCBzbG90cyBmcmFtZXdvcmsuCisKKwkqIGRidXMvZGJ1cy10aHJlYWRzLmMgKGluaXRfc3RhdGljX2xvY2tzKTogcmV3b3JrIGhvdyB3ZSdyZQorCWhhbmRsaW5nIGdsb2JhbCBsb2NrcyBzbyB0aGV5IGFyZSBlYXNpbHkgc2h1dCBkb3duLgorCisJKiBidXMvcG9saWN5LmMgKGJ1c19wb2xpY3lfYXBwZW5kX3J1bGUpOiBmaXgKKworCSogYnVzL3Rlc3QtbWFpbi5jIChtYWluKTogY2hlY2sgZm9yIG1lbWxlYWtzCisKKwkqIGRidXMvZGJ1cy10ZXN0LmMgKGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9ydW5fdGVzdHMpOiBtYWtlCisJdGVzdCBzdWl0ZSBjaGVjayBmb3IgbWVtbGVha3MKKworCSogZGJ1cy9kYnVzLW1lbW9yeS5jOiBhZGQgc3VwcG9ydCBpbiB0ZXN0IG1vZGUgZm9yIHRyYWNraW5nCisJbnVtYmVyIG9mIG91dHN0YW5kaW5nIGJsb2NrcworCisyMDAzLTAzLTIzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvcG9saWN5LmMsIGJ1cy9idXMuYywgYnVzL2Nvbm5lY3Rpb24uYzogaW1wbGVtZW50IGFsbG93L2RlbnkKKwlwb2xpY2llcyBjb2RlCisKKwkqIGRidXMvZGJ1cy1oYXNoLmg6IGFkZCBVTE9ORyBoYXNoIGtleXMKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfZ2V0X2dyb3Vwcyk6IG5ldworCShfZGJ1c19nZXRfZ3JvdXBfaWQpOiBuZXcgZnVuY3Rpb24KKworMjAwMy0wMy0yMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9zZXRfdW5peF91c2VyX2Z1bmN0aW9uKToKKwluZXcgZnVuY3Rpb24KKwkoZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3VzZXIpOiBuZXcgZnVuY3Rpb24KKworMjAwMy0wMy0yMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25fc2VuZF9vb21fZXJyb3IpOiBhc3NlcnQgdGhhdAorCW1lc3NhZ2UgaGFzIGEgc2VuZGVyCisJKGNvbm5lY3Rpb25fZXhlY3V0ZV90cmFuc2FjdGlvbik6IGRpdHRvCisJKGJ1c19jb25uZWN0aW9uX3ByZWFsbG9jYXRlX29vbV9lcnJvcik6IGZpeCB0byBzZXQgdGhlIHNlbmRlciwgYW5kCisJc2V0IHJlY2lwaWVudCB0byB0aGUgZGVzdGluYXRpb24gc2VydmljZSwgbm90IHRoZSBidXMgZHJpdmVyCisKKwkqIGJ1cy9wb2xpY3kuYzogaGFja2luZworCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2Vfc2VydmljZV9pcyk6IG5ldyBmdW5jdGlvbgorCShkYnVzX21lc3NhZ2Vfc2VuZGVyX2lzKTogbmV3CisKKzIwMDMtMDMtMTkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvcG9saWN5LmM6IHN0YXJ0IHNrZXRjaGluZyBjb2RlIGZvciBwb2xpY3kgcmVzdHJpY3Rpb25zIG9uCisJd2hhdCBjb25uZWN0aW9ucyBjYW4gZG8uCisKKzIwMDMtMDMtMTggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvVE9ETzogc29tZSBub3RlcyBvbiBoaWdoLWxldmVsIHRvZG8gaXRlbXMuIExpdHRsZSBuaXRwaWNrCisJc3R1ZmYgaXMgYWxsIGluIEB0b2RvLCBzbyBubyBuZWVkIHRvIGFkZCBpdCBoZXJlLgorCisJKiBkb2MvY29uZmlnLWZpbGUudHh0OiBzb21lIG5vdGVzIG9uIGhvdyBjb25maWcgZmlsZSBtaWdodCBsb29rCisKKzIwMDMtMDMtMTggIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBjb25maWd1cmUuaW46IDAuNgorCisJKiBORVdTOiBVcGRhdGUuCisKKzIwMDMtMDMtMTcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmg6IGFkZCBnY2MgYXR0cmlidXRlcyBzbyB0aGF0CisJb3VyIHByaW50Zi1zdHlsZSBmdW5jdGlvbnMgd2FybiBvbiBiYWQgYXJndW1lbnRzIHRvCisJZm9ybWF0CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2Nvbm5lY3RfdGNwX3NvY2tldCk6IGZpeCBwcmludGYKKwlmb3JtYXQgYnVnCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKF9kYnVzX21lc3NhZ2VfbG9hZGVyX3F1ZXVlX21lc3NhZ2VzKTogZml4CisJcHJpbnRmIGZvcm1hdCBidWcKKworMjAwMy0wMy0xNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy90ZXN0LW1haW4uYyAobWFpbik6IG1ha2UgaXQgcHJpbnQgc29tZXRoaW5nIGFzIGl0IHJ1bnMKKwlzbyBtYWtlIGNoZWNrIGRvZXNuJ3QgbG9vayBzdHVjaworCisJKiBkb2MvbmVnb3RpYXRpb24udHh0LCBkb2MvZGJ1cy1zYXNsLXByb2ZpbGUudHh0OiByZW1vdmUKKwlmcm9tIENWUywgbm93IG9ic29sZXRlCisKKzIwMDMtMDMtMTcgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBidXMvZGlzcGF0Y2guYzogKGJ1c19kaXNwYXRjaCk6CisJUmVmZXRjaCB0aGUgc2VydmljZSBuYW1lIHNpbmNlIGl0IG1heSBoYXZlIGJlZW4gcmVhbGxvY2F0ZWQKKwl3aGVuIGRidXNfbWVzc2FnZV9zZXRfc2VuZGVyIHdhcyBjYWxsZWQuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmM6IChfZGJ1c19hY2NlcHQpOgorCUFkZCBhZGRyZXNzIGFuZCBhZGRyZXNzIGxlbmd0aCB2YXJpYWJsZXMgYW5kIHVzZSB0aGVtIHRvIHN0b3AKKwl2YWxncmluZCBmcm9tIGNvbXBsYWluaW5nLgorCisyMDAzLTAzLTE3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJQWxsIHRlc3RzIHBhc3MsIG5vIG1lbWxlYWtzLCBubyB2YWxncmluZCBjb21wbGFpbnRzLgorCisJKiBidXMvdGVzdC5jOiByZWZjb3VudCBoYW5kbGVyX3Nsb3QKKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25zX25ldyk6IHJlZmNvdW50CisJY29ubmVjdGlvbl9kYXRhX3Nsb3QKKworCSogZGJ1cy9kYnVzLWF1dGgtc2NyaXB0LmMgKF9kYnVzX2F1dGhfc2NyaXB0X3J1bik6IGRlbGV0ZSB1bnVzZWQKKwlieXRlcyBzbyB0aGF0IGF1dGggc2NyaXB0cyBwYXNzLgorCisJKiBidXMvZGlzcGF0Y2guYzogaW5pdCBtZXNzYWdlX2hhbmRsZXJfc2xvdCBzbyBpdCBnZXRzIGFsbG9jYXRlZAorCXByb3Blcmx5CisKKwkqIGJ1cy9kaXNwYXRjaC5jIChtZXNzYWdlX2hhbmRsZXJfc2xvdF9yZWYpOiBmaXggbWVtbGVhaworCisJKiBkYnVzL2RidXMtc2VydmVyLWRlYnVnLXBpcGUuYyAoX2RidXNfc2VydmVyX2RlYnVnX3BpcGVfbmV3KToKKwlkZWFsbG9jIHNlcnZlcl9waXBlX2hhc2ggd2hlbiBubyBsb25nZXIgdXNlZCBmb3IgYmVuZWZpdCBvZgorCWxlYWsgY2hlY2tpbmcKKworCSogZGJ1cy9kYnVzLWF1dGguYyAocHJvY2Vzc19jb21tYW5kKTogbWVtbGVhayBmaXgKKworCSogYnVzL2Rpc3BhdGNoLmMgKGNoZWNrX2hlbGxvX21lc3NhZ2UpOiBtZW1sZWFrIGZpeAorCisyMDAzLTAzLTE2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtYnVzLmMgKGVuc3VyZV9idXNfZGF0YSk6IGZpeCBkb3VibGUtdW5yZWYgb2YgdGhlIGRhdGEgc2xvdAorCisyMDAzLTAzLTE3ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogYnVzL2FjdGl2YXRpb24uYyAoYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSk6IEFwcGVuZAorCXRoZSBwZW5kaW5nIGFjdGl2YXRpb24gZW50cnkgdG8gdGhlIGxpc3Qgb2YgcGVuZGluZyBhY3RpdmF0aW9ucy4KKworMjAwMy0wMy0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL2Rpc3BhdGNoLmMgKGJ1c19kaXNwYXRjaF90ZXN0KTogcmVtb3ZlIGRvdWJsZS11bnJlZnMgb2YKKwljb25uZWN0aW9ucworCisJKiBkYnVzL2RidXMtYWRkcmVzcy5jIChjcmVhdGVfZW50cnkpOiBmaXggT09NIGhhbmRsaW5nIHdoZW4KKwlmYWlsaW5nIHRvIGFsbG9jIGVudHJ5LT5tZXRob2QKKworMjAwMy0wMy0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLXdhdGNoLmMgKF9kYnVzX3dhdGNoX25ldyk6IGhhbmRsZSBmYWlsdXJlIHRvIG1hbGxvYworCXRoZSB3YXRjaAorCisJKiBkYnVzL2RidXMtc2VydmVyLWRlYnVnLXBpcGUuYyAoX2RidXNfdHJhbnNwb3J0X2RlYnVnX3BpcGVfbmV3KToKKwlhZGQgc29tZSBtaXNzaW5nIGRidXNfc2V0X3Jlc3VsdAorCisJKiBidXMvZGlzcGF0Y2guYyAoYnVzX2Rpc3BhdGNoX2FkZF9jb25uZWN0aW9uKTogaGFuZGxlIGZhaWx1cmUgdG8KKwlhbGxvYyB0aGUgREJ1c01lc3NhZ2VIYW5kbGVyCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYyAoX2RidXNfdHJhbnNwb3J0X2Rpc2Nvbm5lY3QpOiBkb24ndCByZWYKKwl0aGUgdHJhbnNwb3J0IGhlcmUsIHNpbmNlIHdlIGNhbGwgdGhpcyBmcm9tIHRoZSBmaW5hbGl6ZXI7IGl0CisJcmVzdWx0ZWQgaW4gYSBkb3VibGUtZmluYWxpemUuCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYyAoX2RidXNfdHJhbnNwb3J0X2Rpc2Nvbm5lY3QpOiBmaXggYSBidWcKKwl3aGVyZSB3ZSB0cmllZCB0byB1c2UgdHJhbnNwb3J0LT5jb25uZWN0aW9uIHRoYXQgd2FzIE5VTEwsCisJaGFwcGVuZWQgd2hlbiB0cmFuc3BvcnQgd2FzIGRpc2Nvbm5lY3RlZCBlYXJseSBvbiBkdWUgdG8gT09NCisKKwkqIGJ1cy8qLmM6IGFkYXB0IHRvIGhhbmRsZSBPT00gZm9yIHdhdGNoZXMvdGltZW91dHMKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmM6IHBvcnQgdG8gaGFuZGxlIE9PTSBkdXJpbmcKKwl3YXRjaCBoYW5kbGluZworCisJKiBkYnVzL2RidXMtYXV0aC5jIChfZGJ1c19hdXRoX2dldF91bnVzZWRfYnl0ZXMpOiByZXR1cm4gYQorCXJlZmVyZW5jZSB0byB1bnVzZWQgYnl0ZXMgaW5zdGVhZCBvZiBhIGNvcHkKKworCSogZGJ1cy9kYnVzLXNlcnZlci5jIChkYnVzX3NlcnZlcl9oYW5kbGVfd2F0Y2gpOiByZXR1cm4gRkFMU0UgZm9yCisJb3V0IG9mIG1lbW9yeQorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25faGFuZGxlX3dhdGNoKTogcmV0dXJuCisJRkFMU0Ugb24gT09NCisKKwkqIGRidXMvZGJ1cy10aW1lb3V0LmMgKGRidXNfdGltZW91dF9oYW5kbGUpOiByZXR1cm4gRkFMU0UgZm9yIG91dAorCW9mIG1lbW9yeQorCisyMDAzLTAzLTE2ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOgorCURvY3VtZW50IHJlcGx5IG1lc3NhZ2UgZm9yIEFjdGl2YXRlU2VydmljZS4KKworMjAwMy0wMy0xNiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9hY3RpdmF0aW9uLmM6IChidXNfcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5X2ZyZWUpLAorCShidXNfcGVuZGluZ19hY3RpdmF0aW9uX2ZyZWUpLCAoYnVzX2FjdGl2YXRpb25fbmV3KSwKKwkoYnVzX2FjdGl2YXRpb25fdW5yZWYpLCAoYnVzX2FjdGl2YXRpb25fc2VydmljZV9jcmVhdGVkKSwKKwkoYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSk6CisJKiBidXMvYWN0aXZhdGlvbi5oOgorCSogYnVzL2J1cy5jOiAoYnVzX2NvbnRleHRfbmV3KToKKwkqIGJ1cy9kZXNrdG9wLWZpbGUuYzogKG5ld19zZWN0aW9uKToKKwkqIGJ1cy9kcml2ZXIuYzogKGJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2RlbGV0ZWQpLAorCShidXNfZHJpdmVyX2hhbmRsZV9hY3RpdmF0ZV9zZXJ2aWNlKToKKwkqIGJ1cy9zZXJ2aWNlcy5jOiAoYnVzX3JlZ2lzdHJ5X25ldyksIChidXNfcmVnaXN0cnlfZW5zdXJlKToKKwkqIGJ1cy9zZXJ2aWNlcy5oOgorCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzoKKwkoZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2spOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRidXNfbWVzc2FnZV9hcHBlbmRfYXJnc192YWxpc3QpOgorCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6CisJTWFrZSBhY3RpdmF0aW9uIHdvcmsgYmV0dGVyLiBOb3cgcGVuZGluZyBhY3RpdmF0aW9ucyB3aWxsIGJlIHF1ZXVlZAorCWFuZCB0aGUgZGFlbW9uIHdvbid0IHRyeSB0byBhY3RpdmF0ZSBzZXJ2aWNlcyB0aGF0IGFyZSBhbHJlYWR5IHJlZ2lzdGVyZWQuCisKKzIwMDMtMDMtMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1idXMuYyAoZW5zdXJlX2J1c19kYXRhKTogaGFuZGxlIGZhaWx1cmUgdG8gc2V0CisJY29ubmVjdGlvbiBkYXRhCisKKwkqIGRidXMvZGJ1cy1tZW1vcnkuYyAoX2RidXNfaW5pdGlhbGl6ZV9tYWxsb2NfZGVidWcpOiBzdXBwb3J0CisJREJVU19NQUxMT0NfQkFDS1RSQUNFUyB0byBwcmludCB0cmFjZSB3aGVuIGZhaWxpbmcgYW4gYWxsb2MKKworMjAwMy0wMy0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfdmFsaWRhdGVfdXRmOCk6IG9vcHMsIHVuYnJlYWsKKwl0aGlzLiBhbHdheXMgcnVuIHRoZSB0ZXN0IHN1aXRlIGJlZm9yZSBjb21taXQuLi4KKworCSogYnVzLyo6IGFkYXB0IHRvIERCdXNDb25uZWN0aW9uIEFQSSBjaGFuZ2VzCisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jOiBhZGFwdCB0byBEQnVzQ29ubmVjdGlvbiBBUEkgY2hhbmdlcywKKwlyZXF1aXJlcyByZW5hbWluZyBzdHVmZiB0byBhdm9pZCBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2ggbmFtZQorCWNvbmZsaWN0LgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmMgKF9kYnVzX3RyYW5zcG9ydF9xdWV1ZV9tZXNzYWdlcyk6IG5ldworCWZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKF9kYnVzX21lc3NhZ2VfbG9hZGVyX3F1ZXVlX21lc3NhZ2VzKToKKwlzZXBhcmF0ZSBmcm9tIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIoKQorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X25fbWVzc2FnZXMpOiByZW1vdmUKKwl0aGlzLCBiZWNhdXNlIGl0J3Mgbm93IGFsd2F5cyBicm9rZW4gdG8gdXNlOyB0aGUgbnVtYmVyIG9mCisJbWVzc2FnZXMgaW4gcXVldWUgdnMuIHRoZSBudW1iZXIgc3RpbGwgYnVmZmVyZWQgYnkgdGhlIG1lc3NhZ2UKKwlsb2FkZXIgaXMgdW5kZWZpbmVkL21lYW5pbmdsZXNzLiBTaG91bGQgdXNlCisJZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0ZSgpLgorCShkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2gpOiByZW5hbWUgZnJvbQorCWRidXNfY29ubmVjdGlvbl9kaXNwYXRjaF9tZXNzYWdlCisKKzIwMDMtMDMtMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX3ZhbGlkYXRlX3V0ZjgpOiBjb3B5IGluIGEgcmVhbAorCWltcGxlbWVudGF0aW9uCisKKzIwMDMtMDMtMTYgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOgorCShkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jayk6CisJRGVjcmVhc2UgY29ubmVjdGlvbi0+bl9pbmNvbWluZyB3aGVuIHJlbW92aW5nIGFuIGVudHJ5CisJZnJvbSB0aGUgbGlzdC4KKwkqIGRidXMvZGJ1cy1kaWN0LmM6IChkYnVzX2RpY3RfZW50cnlfZnJlZSksCisJKGRidXNfZGljdF9zZXRfYm9vbGVhbl9hcnJheSksIChkYnVzX2RpY3Rfc2V0X2ludDMyX2FycmF5KSwKKwkoZGJ1c19kaWN0X3NldF91aW50MzJfYXJyYXkpLCAoZGJ1c19kaWN0X3NldF9kb3VibGVfYXJyYXkpLAorCShkYnVzX2RpY3Rfc2V0X2J5dGVfYXJyYXkpLCAoZGJ1c19kaWN0X3NldF9zdHJpbmdfYXJyYXkpLAorCShkYnVzX2RpY3RfZ2V0X2Jvb2xlYW5fYXJyYXkpLCAoZGJ1c19kaWN0X2dldF9kb3VibGVfYXJyYXkpLAorCShkYnVzX2RpY3RfZ2V0X2J5dGVfYXJyYXkpOgorCUhhbmRsZSBOVUxMIGFycmF5cyBhbmQgc3RyaW5ncy4gQWxzbyBhZGQgc3VwcG9ydCBmb3IgYnl0ZSBhcnJheXMuCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmM6IChfZGJ1c19tYXJzaGFsX2J5dGVfYXJyYXkpLAorCShfZGJ1c19tYXJzaGFsX2RpY3QpLCAoX2RidXNfZGVtYXJzaGFsX2J5dGVfYXJyYXkpLAorCShfZGJ1c19kZW1hcnNoYWxfaW50MzJfYXJyYXkpLCAoX2RidXNfZGVtYXJzaGFsX3VpbnQzMl9hcnJheSksCisJKF9kYnVzX2RlbWFyc2hhbF9kb3VibGVfYXJyYXkpLCAoX2RidXNfZGVtYXJzaGFsX3N0cmluZ19hcnJheSksCisJKF9kYnVzX2RlbWFyc2hhbF9kaWN0KSwgKGRlbWFyc2hhbF9hbmRfdmFsaWRhdGVfbGVuKSwKKwkoX2RidXNfbWFyc2hhbF92YWxpZGF0ZV9hcmcpLCAoX2RidXNfbWFyc2hhbF90ZXN0KToKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmg6CisJQWRkIHN1cHBvcnQgZm9yIG1hcnNoYWxsaW5nIGFuZCBkZW1hcnNoYWxsaW5nIGVtcHR5IGFycmF5cyBhbmQgc3RyaW5ncy4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRidXNfbWVzc2FnZV9hcHBlbmRfYXJnc192YWxpc3QpLAorCShkYnVzX21lc3NhZ2VfYXBwZW5kX3N0cmluZ19hcnJheSksCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9ib29sZWFuKSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jvb2xlYW5fYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfaXRlcl9nZXRfaW50MzJfYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfaXRlcl9nZXRfdWludDMyX2FycmF5KSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2RvdWJsZV9hcnJheSksCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9ieXRlX2FycmF5KSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X3N0cmluZ19hcnJheSksIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZGljdCksCisJKGNoZWNrX21lc3NhZ2VfaGFuZGxpbmcpOgorCUFkZCBzdXBwb3J0IGZvciBnZXR0aW5nIGVtcHR5IGFycmF5cyBhbmQgZGljdHMuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYzogKF9kYnVzX3N0cmluZ192YWxpZGF0ZV91dGY4KToKKwlEb24ndCBkbyBhbnkgdmFsaWRhdGlvbiBhdCBhbGwgZm9yIG5vdywgdGhhdCdzIGJldHRlciB0aGFuIGp1c3QgY2hlY2tpbmcKKwlmb3IgQVNDSUkuCisKKwkqIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9lbXB0aW5lc3MubWVzc2FnZToKKwlOZXcgdGVzdCBtZXNzYWdlIHdpdGggbG90cyBvZiBlbXB0eSBhcnJheXMuCisKKzIwMDMtMDMtMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMKKwkoX2RidXNfY29ubmVjdGlvbl9xdWV1ZV9yZWNlaXZlZF9tZXNzYWdlX2xpbmspOiBuZXcgZnVuY3Rpb24gdGhhdAorCWNhbid0IGZhaWwgZHVlIHRvIE9PTQorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChfZGJ1c19tZXNzYWdlX2xvYWRlcl9wb3BfbWVzc2FnZV9saW5rKToKKwluZXcgZnVuY3Rpb24gcG9wcyBhIG1lc3NhZ2UgdG9nZXRoZXIgd2l0aCBhIGxpc3QgbGluaworCWNvbnRhaW5pbmcgaXQuCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jIChxdWV1ZV9tZXNzYWdlcyk6IHVzZSBuZXcgbGluay1iYXNlZAorCW1lc3NhZ2UgcXVldWluZyBmdW5jdGlvbnMgdG8gYXZvaWQgbmVlZGluZyB0byBhbGxvYyBtZW1vcnkKKworMjAwMy0wMy0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCU9vcHMgLSB0ZXN0IGNvZGUgd2FzIG9ubHkgdGVzdGluZyBmYWlsdXJlIG9mIGFyb3VuZCAzMCBvZiB0aGUKKwltYWxsb2NzIGluIHRoZSB0ZXN0IHBhdGgsIGJ1dCBpdCB0dXJucyBvdXQgdGhlcmUgYXJlIDUwMCsKKwltYWxsb2NzLiBJIGJlbGlldmUgdGhpcyB3YXMgZHVlIHRvIG1pc2d1aWRlZCBsaW5raW5nIHNldHVwIHN1Y2gKKwl0aGF0IHRoZXJlIHdhcyBvbmUgY29weSBvZiBkYnVzX21hbGxvYyBldGMuIGluIHRoZSBkYWVtb24gYW5kIG9uZQorCWluIHRoZSBzaGFyZWQgbGliLCBhbmQgb25seSBkYWVtb24gbWFsbG9jcyB3ZXJlIHRlc3RlZC4gSW4gYW55CisJY2FzZSwgdGhlIHRlc3QgY2FzZSBub3cgdGVzdHMgYWxsIDUwMCsgbWFsbG9jcywgYW5kIGRvZXNuJ3QgcGFzcworCXlldCwgdGhvdWdoIHRoZXJlIGFyZSBsb3RzIG9mIGZpeGVzIGluIHRoaXMgcGF0Y2guCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaF9tZXNzYWdlKTogZml4CisJdGhpcyBzbyB0aGF0IGl0IGRvZXNuJ3QgbmVlZCB0byBhbGxvY2F0ZSBtZW1vcnksIHNpbmNlIGl0CisJaGFzIG5vIHdheSBvZiBpbmRpY2F0aW5nIGZhaWx1cmUgZHVlIHRvIE9PTSAoYW5kIHdvdWxkIGJlCisJYW5ub3lpbmcgaWYgaXQgZGlkKS4KKworCSogZGJ1cy9kYnVzLWxpc3QuYyAoX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayk6IG5ldyBmdW5jdGlvbgorCisJKiBidXMvTWFrZWZpbGUuYW06IHJlYXJyYW5nZSB0byBjcmVhdGUgdHdvIHNlbGYtY29udGFpbmVkCisJbGlicmFyaWVzLCB0byBhdm9pZCBoYXZpbmcgbGlicmFyaWVzIHdpdGggb3ZlcmxhcHBpbmcgc3ltYm9scy4KKwl0aGF0IHdhcyByZXN1bHRpbmcgaW4gd2VpcmRuZXNzLCBlLmcuIEknbSBwcmV0dHkgc3VyZSB0aGVyZQorCXdlcmUgdHdvIGNvcGllcyBvZiBnbG9iYWwgc3RhdGljIHZhcmlhYmxlcy4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jOiBtb3ZlIHRoZSBtYWxsb2MgZGVidWcgc3R1ZmYgdG8KKwlkYnVzLW1lbW9yeS5jCisKKwkqIGRidXMvZGJ1cy1saXN0LmMgKGZyZWVfbGluayk6IGZyZWUgbGlzdCBtZW1wb29sIGlmIGl0IGJlY29tZXMKKwllbXB0eS4KKworCSogZGJ1cy9kYnVzLW1lbW9yeS5jIChfZGJ1c19kaXNhYmxlX21lbV9wb29scyk6IG5ldyBmdW5jdGlvbgorCisJKiBkYnVzL2RidXMtYWRkcmVzcy5jIChkYnVzX3BhcnNlX2FkZHJlc3MpOiBmcmVlIGxpc3Qgbm9kZXMKKwlvbiBmYWlsdXJlLgorCisJKiBidXMvZGlzcGF0Y2guYyAoYnVzX2Rpc3BhdGNoX2FkZF9jb25uZWN0aW9uKTogZnJlZQorCW1lc3NhZ2VfaGFuZGxlcl9zbG90IHdoZW4gbm8gbG9uZ2VyIHVzaW5nIGl0LCBzbworCW1lbW9yeSBsZWFrIGNoZWNrZXJzIGFyZSBoYXBweSBmb3IgdGhlIHRlc3Qgc3VpdGUuCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5jIChkZWJ1Z19maW5hbGl6ZSk6IGZyZWUgc2VydmVyIG5hbWUKKworCSogYnVzL2J1cy5jIChuZXdfY29ubmVjdGlvbl9jYWxsYmFjayk6IGRpc2Nvbm5lY3QgaW4gaGVyZSBpZgorCWJ1c19jb25uZWN0aW9uc19zZXR1cF9jb25uZWN0aW9uIGZhaWxzLgorCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfY29ubmVjdGlvbnNfdW5yZWYpOiBmaXggdG8gZnJlZSB0aGUKKwljb25uZWN0aW9ucworCShidXNfY29ubmVjdGlvbnNfc2V0dXBfY29ubmVjdGlvbik6IGlmIHRoaXMgZmFpbHMsIGRvbid0CisJZGlzY29ubmVjdCB0aGUgY29ubmVjdGlvbiwganVzdCBiZSBzdXJlIHRoZXJlIGFyZSBubyBzaWRlCisJZWZmZWN0cy4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jICh1bmRvX2FsaWdubWVudCk6IHVuYnJlYWsgdGhpcworCisJKiBkYnVzL2RidXMtYXV0aC5jIChfZGJ1c19hdXRoX3VucmVmKTogZnJlZSBzb21lIHN0dWZmIHdlIHdlcmUKKwlsZWFraW5nCisJKF9kYnVzX2F1dGhfbmV3KTogZml4IHRoZSBvcmRlciBpbiB3aGljaCB3ZSBmcmVlIHN0cmluZ3MKKwlvbiBPT00gZmFpbHVyZQorCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0ZWQpOiBmaXggdG8KKwlub3Qgc2VuZCBTZXJ2aWNlRGVsZXRlZCBtdWx0aXBsZSB0aW1lcyBpbiBjYXNlIG9mIG1lbW9yeQorCWFsbG9jYXRpb24gZmFpbHVyZQorCisJKiBkYnVzL2RidXMtYnVzLmMgKGRidXNfYnVzX2dldF9iYXNlX3NlcnZpY2UpOiBuZXcgZnVuY3Rpb24gdG8KKwlnZXQgdGhlIGJhc2Ugc2VydmljZSBuYW1lCisJKGRidXNfYnVzX3JlZ2lzdGVyX2NsaWVudCk6IGRvbid0IHJldHVybiBiYXNlIHNlcnZpY2UgbmFtZSwKKwlpbnN0ZWFkIHN0b3JlIGl0IG9uIHRoZSBEQnVzQ29ubmVjdGlvbiBhbmQgaGF2ZSBhbiBhY2Nlc3NvcgorCWZ1bmN0aW9uIGZvciBpdC4KKwkoZGJ1c19idXNfcmVnaXN0ZXJfY2xpZW50KTogcmVuYW1lIGRidXNfYnVzX3JlZ2lzdGVyKCkKKworCSogYnVzL2Rpc3BhdGNoLmMgKGNoZWNrX2hlbGxvX21lc3NhZ2UpOiB2ZXJpZnkgdGhhdCBvdGhlcgorCWNvbm5lY3Rpb25zIG9uIHRoZSBidXMgYWxzbyBnb3QgdGhlIGNvcnJlY3QgcmVzdWx0cywgbm90CisJanVzdCB0aGUgb25lIHNlbmRpbmcgaGVsbG8KKworMjAwMy0wMy0xNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCU1ha2UgaXQgcGFzcyB0aGUgSGVsbG8gaGFuZGxpbmcgdGVzdCBpbmNsdWRpbmcgYWxsIE9PTSBjb2RlcGF0aHMuCisJTm93IHRvIGRvIG90aGVyIG1lc3NhZ2VzLi4uCisKKwkqIGJ1cy9zZXJ2aWNlcy5jIChidXNfc2VydmljZV9yZW1vdmVfb3duZXIpOiBmaXggY3Jhc2ggd2hlbgorCXJlbW92aW5nIG93bmVyIGZyb20gYW4gZW1wdHkgbGlzdCBvZiBvd25lcnMKKwkoYnVzX3JlZ2lzdHJ5X2Vuc3VyZSk6IGRvbid0IGxlYXZlIHNlcnZpY2UgaW4gdGhlIGxpc3Qgb2YKKwlhIGNvbm5lY3Rpb24ncyBvd25lZCBzZXJ2aWNlcyBpZiB3ZSBmYWlsIHRvIHB1dCB0aGUgc2VydmljZQorCWluIHRoZSBoYXNoIHRhYmxlLgorCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfY29ubmVjdGlvbl9wcmVhbGxvY2F0ZV9vb21fZXJyb3IpOiBzZXQKKwllcnJvciBmbGFnIG9uIHRoZSBPT00gZXJyb3IuCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKF9kYnVzX2Nvbm5lY3Rpb25fbmV3X2Zvcl90cmFuc3BvcnQpOgorCWhhbmRsZSBfZGJ1c190cmFuc3BvcnRfc2V0X2Nvbm5lY3Rpb24gZmFpbHVyZQorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYyAoX2RidXNfdHJhbnNwb3J0X25ld19mb3JfZmQpOiBtb2RpZnkKKwl0byBjcmVhdGUgd2F0Y2hlcyB1cCBmcm9udCBhbmQgc2ltcGx5IGVuYWJsZS9kaXNhYmxlIHRoZW0gYXMKKwluZWVkZWQuCisJKHVuaXhfY29ubmVjdGlvbl9zZXQpOiB0aGlzIGNhbiBub3cgZmFpbCBvbiBPT00KKworCSogZGJ1cy9kYnVzLXRpbWVvdXQuYywgZGJ1cy9kYnVzLXdhdGNoLmM6IGFkZCBjb25jZXB0CisJb2YgZW5hYmxpbmcvZGlzYWJsaW5nIGEgd2F0Y2ggb3IgdGltZW91dC4KKworCSogYnVzL2xvb3AuYyAoYnVzX2xvb3BfaXRlcmF0ZSk6IGRvbid0IHRvdWNoIGRpc2FibGVkCisJd2F0Y2hlcy90aW1lb3V0cworCisJKiBnbGliL2RidXMtZ21haW4uYzogYWRhcHQgdG8gZW5hYmxlL2Rpc2FibGUgd2F0Y2hlcyBhbmQgdGltZW91dHMKKworMjAwMy0wMy0xNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL2Rpc3BhdGNoLmMgKGJ1c19kaXNwYXRjaF90ZXN0KTogT0ssIG5vdyBmaW5hbGx5IGFjdHVhbGx5CisJd3JpdGUgdXNlZnVsIHRlc3QgY29kZSwgYWZ0ZXIgYWxsIHRoYXQgZnV0emluZyBhcm91bmQgOy0pCisKKwlUZXN0IGRvZXMgbm90IHlldCBwYXNzIGJlY2F1c2Ugd2UgY2FuJ3QgaGFuZGxlIE9PTSBpbgorCV9kYnVzX3RyYW5zcG9ydF9tZXNzYWdlc19wZW5kaW5nIChiYXNpY2FsbHksCisJZGJ1c19jb25uZWN0aW9uX3ByZWFsbG9jYXRlX3NlbmQoKSBkb2VzIG5vdCBwcmVhbGxvYyB0aGUgd3JpdGUKKwl3YXRjaCkuIFRvIGZpeCB0aGlzLCBJIHRoaW5rIHdlIG5lZWQgdG8gYWRkIG5ldyBzdHVmZiB0bworCXNldF93YXRjaF9mdW5jdGlvbnMsIG5hbWVseSBhIFNldEVuYWJsZWQgZnVuY3Rpb24gc28gd2UgY2FuIGFsbG9jCisJdGhlIHdhdGNoIGVhcmxpZXIsIHRoZW4gZW5hYmxlIGl0IGxhdGVyLgorCisJKiBkYnVzL01ha2VmaWxlLmFtIChsaWJkYnVzX2NvbnZlbmllbmNlX2xhX1NPVVJDRVMpOiBtb3ZlCisJZGJ1cy1tZW1vcnkuYyB0byB0aGUgY29udmVuaWVuY2UgbGliCisKKwkqIGJ1cy90ZXN0LmM6IHJlbmFtZSBzb21lIHN0YXRpYyBmdW5jdGlvbnMgdG8ga2VlcCB0aGVtIGNsZWFybHkKKwlkaXN0aW5jdCBmcm9tIHN0dWZmIGluIGNvbm5lY3Rpb24uYy4gSGFuZGxlIGNsaWVudCBkaXNjb25uZWN0aW9uLgorCisyMDAzLTAzLTE0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvZGlzcGF0Y2guYyAoYnVzX2Rpc3BhdGNoX3Rlc3QpOiBkbyB0ZXN0IHVzaW5nIGRlYnVnLXBpcGUKKwl0cmFuc3BvcnQsIHRlc3RzIG1vcmUgb2YgdGhlIHJlYWwgY29kZXBhdGguIFNldCB1cCBjbGllbnRzCisJd2l0aCBidXNfc2V0dXBfZGVidWdfY2xpZW50LgorCisJKiBidXMvdGVzdC5jIChidXNfc2V0dXBfZGVidWdfY2xpZW50KTogZnVuY3Rpb24gdG8gc2V0IHVwIGRlYnVnCisJImNsaWVudHMiIG9uIHRoZSBtYWluIGxvb3AKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jIChfZGJ1c190cmFuc3BvcnRfb3Blbik6IGFkZCBkZWJ1Zy1waXBlCisJc3VwcG9ydAorCisJKiBkYnVzL2RidXMtc2VydmVyLmMgKGRidXNfc2VydmVyX2xpc3Rlbik6IGFkZCBkZWJ1Zy1waXBlCisJc2VydmVyIHR5cGUKKworCSogZGJ1cy9kYnVzLXNlcnZlci1kZWJ1Zy5jOiBzdXBwb3J0IGEgZGVidWcgc2VydmVyIGJhc2VkIG9uIHBpcGVzCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2Z1bGxfZHVwbGV4X3BpcGUpOiBuZXcgZnVuY3Rpb24KKwkoX2RidXNfY2xvc2UpOiBuZXcgZnVuY3Rpb24KKworCSogY29uZmlndXJlLmluOiBjaGVjayBmb3Igc29ja2V0cGFpcgorCisyMDAzLTAzLTE0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lbW9yeS5jOiBhZGQgYSAiZGV0ZWN0IGJ1ZmZlciBvdmVyd3JpdGVzIG9uIGZyZWUiCisJY2hlZXN5IGhhY2sKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC1kZWJ1Zy5jOiByZXdvcmsgdGhpcyBhIGdvb2QgYml0IHRvIGJlCisJbGVzcyBjb21wbGljYXRlZC4gaG9wZWZ1bGx5IHN0aWxsIHdvcmtzLgorCisJKiBkYnVzL2RidXMtc2VydmVyLWRlYnVnLmMgKGhhbmRsZV9uZXdfY2xpZW50KTogcmVtb3ZlIHRpbWVvdXQKKwltYW51YWxseQorCisJKiBnbGliL2RidXMtZ21haW4uYyAodGltZW91dF9oYW5kbGVyKTogZG9uJ3QgcmVtb3ZlIHRpbWVvdXQKKwlhZnRlciBydW5uaW5nIGl0CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9jb3B5KTogcmVuYW1lIGZyb20KKwlkYnVzX21lc3NhZ2VfbmV3X2Zyb21fbWVzc2FnZSwgZml4IGl0IHVwIHRvIGNvcHkKKwlhbGwgdGhlIG1lc3NhZ2UgZmllbGRzLCBhZGQgdGVzdCBjYXNlCisKKwkqIGJ1cy9kaXNwYXRjaC5jIChidXNfZGlzcGF0Y2hfdGVzdCk6IGFkZCBzb21lIG1vcmUgdGVzdCBjb2RlLAorCW5vdCBxdWl0ZSBwYXNzaW5nIHlldAorCisyMDAzLTAzLTE0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvbG9vcC5jIChidXNfbG9vcF9pdGVyYXRlKTogYWRkIHRoaXMgc28gd2UgY2FuICJydW4gbG9vcAorCXVudGlsIG5vIHdvcmsgcmVtYWlucyIgaW4gdGVzdCBjb2RlLiAodGhlIGxhcmdlIGRpZmYgaGVyZQorCWlzIGp1c3QgY29kZSBtb3ZlbWVudCwgbm8gYWN0dWFsIGNoYW5nZXMpCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItZGVidWcuYyAoREVGQVVMVF9JTlRFUlZBTCk6IGNoYW5nZSBpbnRlcnZhbCB0bworCTEsIG5vIHBvaW50IHdhaXRpbmcgYXJvdW5kIGZvciB0ZXN0IGNvZGUuCisJKF9kYnVzX3NlcnZlcl9kZWJ1Z19hY2NlcHRfdHJhbnNwb3J0KTogdW5yZWYgdGhlIHRpbWVvdXQKKwlhZnRlciBhZGRpbmcgaXQgKHJpZ2h0PykKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC1kZWJ1Zy5jIChERUZBVUxUX0lOVEVSVkFMKTogZGl0dG8KKworMjAwMy0wMy0xMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy10aW1lb3V0LmMgKF9kYnVzX3RpbWVvdXRfbGlzdF9zZXRfZnVuY3Rpb25zKTogaGFuZGxlCisJb3V0IG9mIG1lbW9yeQorCisJKiBkYnVzL2RidXMtd2F0Y2guYyAoX2RidXNfd2F0Y2hfbGlzdF9zZXRfZnVuY3Rpb25zKTogaGFuZGxlIG91dAorCW9mIG1lbW9yeQorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5oOiBNYWtlIEFkZFdhdGNoRnVuY3Rpb24gYW5kCisJQWRkVGltZW91dEZ1bmN0aW9uIHJldHVybiBhIGJvb2wgc28gdGhleSBjYW4gZmFpbCBvbiBvdXQtb2YtbWVtb3J5CisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfbmV3KTogc2V0IHVwIHRpbWVvdXQgaGFuZGxlcnMKKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25zX3NldHVwX2Nvbm5lY3Rpb24pOiBzZXQgdXAKKwl0aW1lb3V0IGhhbmRsZXJzCisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jOiBhZGFwdCB0byB0aGUgZmFjdCB0aGF0IHNldF9mdW5jdGlvbnMgc3R1ZmYKKwljYW4gZmFpbAorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X25ldyk6IGFkYXB0IHRvIGNoYW5nZXMKKworCSogYnVzL2Nvbm5lY3Rpb24uYzogYWRhcHQgdG8gY2hhbmdlcworCisJKiB0ZXN0L3dhdGNoLmM6IGFkYXB0IHRvIERCdXNXYXRjaCBjaGFuZ2VzCisKKwkqIGJ1cy9kaXNwYXRjaC5jIChidXNfZGlzcGF0Y2hfdGVzdCk6IHN0YXJ0ZWQgYWRkaW5nIHRoaXMgYnV0CisJZGlkbid0IGZpbmlzaAorCisyMDAzLTAzLTE0ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogYnVzL2Rpc3BhdGNoLmMgKHNlbmRfc2VydmljZV9ub25leGlzdGVudF9lcnJvcik6IEZpeCB0eXBvLgorCisyMDAzLTAzLTEzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvdGVzdC5jLCBidXMvdGVzdC5oLCBidXMvTWFrZWZpbGUuYW0sIGJ1cy90ZXN0LW1haW4uYzoKKwlzZXQgdXAgYSB0ZXN0IGZyYW1ld29yayBhcyBmb3IgdGhlIGxpYnJhcnkKKworMjAwMy0wMy0xMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCVRocm91Z2hvdXQ6IHB1cmdlIGdsb2JhbCB2YXJpYWJsZXMsIGludHJvZHVjZSBCdXNBY3RpdmF0aW9uLAorCUJ1c0Nvbm5lY3Rpb25zLCBCdXNSZWdpc3RyeSwgZXRjLiBvYmplY3RzIGluc3RlYWQuCisKKwkqIGJ1cy9idXMuaCwgYnVzL2J1cy5jOiBpbnRyb2R1Y2UgQnVzQ29udGV4dCBhcyBhIGdsb2JhbAorCW1lc3NhZ2UgYnVzIG9iamVjdAorCisJKiB0ZXN0L01ha2VmaWxlLmFtIChURVNUX0JJTkFSSUVTKTogZGlzYWJsZSBidXMtdGVzdCBmb3Igbm93LAorCWdvaW5nIHRvIHJlZG8gdGhpcyBhIGJpdCBkaWZmZXJlbnRseSBJIHRoaW5rCisKKzIwMDMtMDMtMTIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisgICAgICAgIE1lZ2EtcGF0Y2ggdGhhdCBnZXRzIHRoZSBtZXNzYWdlIGJ1cyBkYWVtb24gaW5pdGlhbGx5IGhhbmRsaW5nCisJb3V0LW9mLW1lbW9yeS4gV29yayBzdGlsbCBuZWVkZWQuIEFsc28gbG90cyBvZiByYW5kb20KKwltb3Zpbmcgc3R1ZmYgdG8gREJ1c0Vycm9yIGluc3RlYWQgb2YgUmVzdWx0Q29kZS4KKworCSogZGJ1cy9kYnVzLWxpc3QuYyAoX2RidXNfbGlzdF9sZW5ndGhfaXNfb25lKTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMKKwkoZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2spOiB1c2UgREJ1c0Vycm9yCisKKwkqIGRidXMvZGJ1cy1idXMuYzogYWRhcHQgdG8gQVBJIGNoYW5nZXMsIG1ha2UgaXQgdXNlIERCdXNFcnJvciBub3QKKwlEQnVzUmVzdWx0Q29kZQorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fc2VuZCk6IGRyb3AgdGhlIHJlc3VsdAorCWNvZGUgaGVyZSwgYXMgdGhlIG9ubHkgZmFpbHVyZSBwb3NzaWJsZSBpcyBPT00uCisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGJ1c19jb25uZWN0aW9uX2Rpc2Nvbm5lY3QpOgorCXJlbmFtZSBidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0ZWQgYXMgaXQncyBhIG5vdGlmaWNhdGlvbiBvbmx5CisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfYWNxdWlyZV9zZXJ2aWNlKTogZG9uJ3QgZnJlZQorCSJuYW1lIiBvbiBnZXRfYXJncyBmYWlsdXJlLCBzaG91bGQgYmUgZG9uZSBieSBnZXRfYXJnczsKKwlkb24ndCBkaXNjb25uZWN0IGNsaWVudCBmb3IgYmFkIGFyZ3MsIGp1c3QgcmV0dXJuIGFuIGVycm9yLgorCShidXNfZHJpdmVyX2hhbmRsZV9zZXJ2aWNlX2V4aXN0cyk6IGRpdHRvCisKKwkqIGJ1cy9zZXJ2aWNlcy5jIChidXNfc2VydmljZXNfbGlzdCk6IE5VTEwtdGVybWluYXRlIHJldHVybmVkIGFycmF5CisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfbG9zdCkKKwkoYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfYWNxdWlyZWQpOiBzZW5kIG1lc3NhZ2VzIGZyb20gZHJpdmVyIHRvIGEKKwlzcGVjaWZpYyBjbGllbnQgdG8gdGhlIGNsaWVudCdzIHVuaXF1ZSBuYW1lLCBub3QgdG8gdGhlIGJyb2FkY2FzdAorCXNlcnZpY2UuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRlY29kZV9oZWFkZXJfZGF0YSk6IHJlamVjdCBtZXNzYWdlcyB0aGF0CisJY29udGFpbiBubyBuYW1lIGZpZWxkCisJKF9kYnVzX21lc3NhZ2VfZ2V0X2NsaWVudF9zZXJpYWwpOiByZW5hbWUgdG8KKwlkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCBhbmQgbWFrZSBwdWJsaWMKKwkoX2RidXNfbWVzc2FnZV9zZXRfc2VyaWFsKTogcmVuYW1lIGZyb20gc2V0X2NsaWVudF9zZXJpYWwKKwkoX2RidXNfbWVzc2FnZV9zZXRfcmVwbHlfc2VyaWFsKTogbWFrZSBwdWJsaWMKKwkoX2RidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsKTogbWFrZSBwdWJsaWMKKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25fZm9yZWFjaCk6IGFsbG93IHN0b3BwaW5nCisJaXRlcmF0aW9uIGJ5IHJldHVybmluZyBGQUxTRSBmcm9tIGZvcmVhY2ggZnVuY3Rpb24uCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9zZW5kX3ByZWFsbG9jYXRlZCkKKwkoZGJ1c19jb25uZWN0aW9uX2ZyZWVfcHJlYWxsb2NhdGVkX3NlbmQpCisJKGRidXNfY29ubmVjdGlvbl9wcmVhbGxvY2F0ZV9zZW5kKTogbmV3IEFQSSBmb3Igc2VuZGluZyBhIG1lc3NhZ2UKKwl3aXRob3V0IHBvc3NpYmlsaXR5IG9mIG1hbGxvYyBmYWlsdXJlLgorCShkYnVzX2Nvbm5lY3Rpb25fc2VuZF9tZXNzYWdlKTogcmVuYW1lIHRvIGp1c3QKKwlkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoYW5kIHNhbWUgZm9yIHdob2xlIGZ1bmN0aW9uIGZhbWlseSkKKworCSogZGJ1cy9kYnVzLWVycm9ycy5jIChkYnVzX2Vycm9yX2ZyZWUpOiBtYWtlIHRoaXMgcmVpbml0IHRoZSBlcnJvcgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19leGl0KTogbmV3IGZ1bmN0aW9uCisKKwkqIGJ1cy9hY3RpdmF0aW9uLmM6IGhhbmRsZS9yZXR1cm4gZXJyb3JzCisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuaDogYWRkIG1vcmUgREJVU19FUlJPUiAjZGVmaW5lCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2RpcmVjdG9yeV9vcGVuKSAoX2RidXNfZmlsZV9nZXRfY29udGVudHMpCisJKF9kYnVzX2RpcmVjdG9yeV9nZXRfbmV4dF9maWxlKTogdXNlIERCdXNFcnJvciBpbnN0ZWFkIG9mIERCdXNSZXN1bHRDb2RlCisJKF9kYnVzX3Jlc3VsdF9mcm9tX2Vycm5vKTogbW92ZSB0byB0aGlzIGZpbGUKKworMjAwMy0wMy0xMCAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmM6CisJKF9kYnVzX21hcnNoYWxfc2V0X3N0cmluZyk6CisJVGFrZSBhIGxlbmd0aCBhcmd1bWVudCBzbyB3ZSBjYW4gbWFyc2hhbCB0aGUgY29ycmVjdCBzdHJpbmcKKwlsZW5ndGguCisKKwkoX2RidXNfbWFyc2hhbF9kaWN0KSwgKF9kYnVzX2RlbWFyc2hhbF9kaWN0KSwKKwkoX2RidXNfbWFyc2hhbF9nZXRfYXJnX2VuZF9wb3MpLCAoX2RidXNfbWFyc2hhbF92YWxpZGF0ZV9hcmcpLAorCShfZGJ1c19tYXJzaGFsX3Rlc3QpOgorCSogZGJ1cy9kYnVzLW1hcnNoYWwuaDoKKwlBZGQgc3VwcG9ydCBmb3IgbWFyc2hhbGxpbmcgYW5kIGRlbWFyc2hhbGxpbmcgZGljdHMuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWJ1aWxkZXIuYzogKF9kYnVzX21lc3NhZ2VfZGF0YV9sb2FkKToKKwlBZGQgc3VwcG9ydCBmb3IgVFlQRSBESUNULgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoc2V0X3N0cmluZ19maWVsZCk6CisJQWRqdXN0IGhlYWRlciBwYWRkaW5nLgorCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfYXJnc192YWxpc3QpLCAoZGJ1c19tZXNzYWdlX2FwcGVuZF9kaWN0KSwKKwkoZGJ1c19tZXNzYWdlX2dldF9hcmdzX3ZhbGlzdCksIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUpLAorCShkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZGljdCksIChfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyKSwKKwkoY2hlY2tfbWVzc2FnZV9oYW5kbGluZyksIChjaGVja19oYXZlX3ZhbGlkX21lc3NhZ2UpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDoKKwlBZGQgZnVuY3Rpb25zIGZvciBzZXR0aW5nIGFuZCBnZXR0aW5nIGRpY3RzLgorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaDoKKwlBZGQgREJVU19UWVBFX0RJQ1QuCisKKwkqIGRidXMvZGJ1cy5oOgorCUFkZCBkYnVzLWRpY3QuaAorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6CisJQWRkIGluZm9ybWF0aW9uIGFib3V0IGhvdyBkaWN0cyBhcmUgbWFyc2hhbGxlZC4KKworCSogdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvZGljdC13aXRoLW5pbC12YWx1ZS5tZXNzYWdlOgorCSogdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvdG9vLXNob3J0LWRpY3QubWVzc2FnZToKKwkqIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9kaWN0LXNpbXBsZS5tZXNzYWdlOgorCSogdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2RpY3QubWVzc2FnZToKKwlBZGQgc2FtcGxlIG1lc3NhZ2VzIGNvbnRhaW5pbmcgZGljdHMuCisKKzIwMDMtMDMtMDggIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtZGljdC5oOiBBZGQgREJVU19FTkRfREVDTFMuCisKKzIwMDMtMDMtMDcgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL01ha2VmaWxlLmFtOgorCSogZGJ1cy9kYnVzLWRpY3QuYzogKGRidXNfZGljdF9lbnRyeV9mcmVlKSwgKGRidXNfZGljdF9uZXcpLAorCShkYnVzX2RpY3RfZ2V0X2tleXMpLCAoaW5zZXJ0X2VudHJ5KSwgKGRidXNfZGljdF9zZXRfYm9vbGVhbiksCisJKGRidXNfZGljdF9zZXRfaW50MzIpLCAoZGJ1c19kaWN0X3NldF91aW50MzIpLAorCShkYnVzX2RpY3Rfc2V0X2RvdWJsZSksIChkYnVzX2RpY3Rfc2V0X3N0cmluZyksCisJKGRidXNfZGljdF9zZXRfYm9vbGVhbl9hcnJheSksIChkYnVzX2RpY3Rfc2V0X2ludDMyX2FycmF5KSwKKwkoZGJ1c19kaWN0X3NldF91aW50MzJfYXJyYXkpLCAoZGJ1c19kaWN0X3NldF9kb3VibGVfYXJyYXkpLAorCShkYnVzX2RpY3Rfc2V0X3N0cmluZ19hcnJheSksIChfZGJ1c19kaWN0X3Rlc3QpOgorCSogZGJ1cy9kYnVzLWRpY3QuaDoKKwlGaXggYWNjb3JkaW5nIHRvIGNvbW1lbnRzIGZyb20gSGF2b2MuCisKKzIwMDMtMDMtMDYgIE1pY2hhZWwgTWVla3MgIDxtaWNoYWVsQHNlcnZlci5ob21lPgorCisJKiBjb25maWd1cmUuaW46IGlmIHdlIGRvbid0IGhhdmUga2RlLWNvbmZpZywgZGlzYWJsZSBoYXZlX3F0LgorCisyMDAzLTAzLTA3ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9NYWtlZmlsZS5hbToKKwlBZGQgZGJ1cy1kaWN0LltjaF0KKworCSogZGJ1cy9kYnVzLWRpY3QuYzogKGRidXNfZGljdF9lbnRyeV9mcmVlKSwgKGRidXNfZGljdF9uZXcpLAorCShkYnVzX2RpY3RfcmVmKSwgKGRidXNfZGljdF91bnJlZiksIChkYnVzX2RpY3RfY29udGFpbnMpLAorCShkYnVzX2RpY3RfcmVtb3ZlKSwgKGRidXNfZGljdF9nZXRfdmFsdWVfdHlwZSksCisJKGRidXNfZGljdF9nZXRfa2V5cyksIChkYnVzX2RpY3RfcHV0X2Jvb2xlYW4pLAorCShkYnVzX2RpY3RfcHV0X2ludDMyKSwgKGRidXNfZGljdF9wdXRfdWludDMyKSwKKwkoZGJ1c19kaWN0X3B1dF9kb3VibGUpLCAoZGJ1c19kaWN0X3B1dF9zdHJpbmcpLAorCShkYnVzX2RpY3RfcHV0X2Jvb2xlYW5fYXJyYXkpLCAoZGJ1c19kaWN0X3B1dF9pbnQzMl9hcnJheSksCisJKGRidXNfZGljdF9wdXRfdWludDMyX2FycmF5KSwgKGRidXNfZGljdF9wdXRfZG91YmxlX2FycmF5KSwKKwkoZGJ1c19kaWN0X3B1dF9zdHJpbmdfYXJyYXkpLCAoZGJ1c19kaWN0X2dldF9ib29sZWFuKSwKKwkoZGJ1c19kaWN0X2dldF9pbnQzMiksIChkYnVzX2RpY3RfZ2V0X3VpbnQzMiksCisJKGRidXNfZGljdF9nZXRfZG91YmxlKSwgKGRidXNfZGljdF9nZXRfc3RyaW5nKSwKKwkoZGJ1c19kaWN0X2dldF9ib29sZWFuX2FycmF5KSwgKGRidXNfZGljdF9nZXRfaW50MzJfYXJyYXkpLAorCShkYnVzX2RpY3RfZ2V0X3VpbnQzMl9hcnJheSksIChkYnVzX2RpY3RfZ2V0X2RvdWJsZV9hcnJheSksCisJKGRidXNfZGljdF9nZXRfc3RyaW5nX2FycmF5KSwgKF9kYnVzX2RpY3RfdGVzdCk6CisJKiBkYnVzL2RidXMtZGljdC5oOgorCUFkZCBEQnVzRGljdCBpbXBsZW1lbnRhdGlvbgorCisJKiBkYnVzL2RidXMtdGVzdC5jOiAoZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX3J1bl90ZXN0cyk6CisJKiBkYnVzL2RidXMtdGVzdC5oOgorCUFkZCBfZGJ1c19kaWN0X3Rlc3QKKworMjAwMy0wMy0wNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogdGVzdC9kYXRhL2F1dGgvKjogYWRhcHQgdG8gY2hhbmdlcworCisJKiBkYnVzL2RidXMtYXV0aC1zY3JpcHQuYyAoX2RidXNfYXV0aF9zY3JpcHRfcnVuKTogYWRkCisJVVNFUklEX0JBU0U2NCBhbmQgY2hhbmdlIFVTRVJOQU1FX0JBU0U2NCB0byBwdXQgaW4gdXNlcm5hbWUgbm90CisJdXNlcmlkCisKKwkqIGRidXMvZGJ1cy1rZXlyaW5nLmMgKF9kYnVzX2tleXJpbmdfdmFsaWRhdGVfY29udGV4dCk6IHByZXZlbnQKKwltb3JlIHN0dWZmIGZyb20gYmVpbmcgaW4gYSBjb250ZXh0IG5hbWUsIHRvIG1ha2UgdGhlIHByb3RvY29sCisJc2ltcGxlciB0byBkZWFsIHdpdGgKKworCSogZGJ1cy9kYnVzLWVycm9ycy5jIChkYnVzX2Vycm9yX2hhc19uYW1lKTogbmV3IGZ1bmN0aW9uCisJKGRidXNfZXJyb3JfaXNfc2V0KTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1hdXRoLmM6IHJlcGxhY2UgREJVU19TVFVQSURfVEVTVF9NRUNIIGF1dGgKKwl3aXRoIERCVVNfQ09PS0lFX1NIQTEsIGltcGxlbWVudCBEQlVTX0NPT0tJRV9TSEExCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9mbHVzaCk6IGFsc28gcmVhZAorCW1lc3NhZ2VzIGR1cmluZyBhIGZsdXNoIG9wZXJhdGlvbgorCisJKiBkYnVzL01ha2VmaWxlLmFtOiByZW1vdmUgZGJ1cy1tZDUgc2luY2UgaXQgaXNuJ3QgY3VycmVudGx5IHVzZWQuCisKKzIwMDMtMDMtMDUgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBjb25maWd1cmUuaW46IENoZWNrIGZvciBnZXRob3N0YnluYW1lIG9uIFNvbGFyaXMuCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYzogKF9kYnVzX3RyYW5zcG9ydF9vcGVuKToKKwlSZW1vdmUgZHVwbGljYXRlICJ0Y3AiIGVudHJ5LgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6CisJQ2xhcmlmeSBzb21lIHRoaW5ncy4KKworMjAwMy0wMy0wNSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1hdXRoLmM6IChzZW5kX3JlamVjdGVkKSwgKHByb2Nlc3NfdGVzdF9zdWJkaXIpOgorCSogZGJ1cy9kYnVzLWtleXJpbmcuYzogKF9kYnVzX2tleXJpbmdfbmV3X2hvbWVkaXIpLAorCShfZGJ1c19rZXlyaW5nX3Rlc3QpOgorCSogZGJ1cy9kYnVzLW1kNS5jOiAoX2RidXNfbWQ1X2NvbXB1dGUpOgorCSogZGJ1cy9kYnVzLXNoYS5jOiAoX2RidXNfc2hhX2NvbXB1dGUpOgorCVBsdWcgbWVtb3J5IGxlYWtzLgorCisyMDAzLTAzLTA1ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogUkVBRE1FOiBBZGQgc29tZSB0aGluZ3MuCisKKzIwMDMtMDMtMDQgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3NfdmFsaXN0KTogQWRkIGEgYnJlYWs7CisJYWZ0ZXIgY2FzZSBEQlVTX1RZUEVfQk9PRUxBTi4KKworMjAwMy0wMy0wMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogdGVzdC9icmVhay1sb2FkZXIuYyAocmFuZG9tbHlfc2V0X2V4dHJlbWVfaW50cyk6IGFkZCB0ZXN0IHRoYXQKKwlzZXRzIHJlYWxseSBodWdlIGFuZCBzbWFsbCBpbnRlZ2VycworCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jIChfZGJ1c19tYXJzaGFsX3ZhbGlkYXRlX2FyZyk6IGFkZCBjaGVjaworCXRoYXQgbGVuZ3RoIG9mIGJvb2xlYW4gYXJyYXkgZml0cyBpbiB0aGUgc3RyaW5nLCBhbmQgdGhhdAorCXN0cmluZyBoYXMgcm9vbSBmb3IgYm9vbGVhbiB2YWx1ZSBpbiBzaW5nbGUtYm9vbCBjYXNlLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS1idWlsZGVyLmMgKF9kYnVzX21lc3NhZ2VfZGF0YV9sb2FkKTogYWRkCisJb3B0aW9uYWwgdmFsdWUgdG8gIkFMSUdOIiBjb21tYW5kIHdoaWNoIGlzIHdoYXQgdG8gZmlsbCB0aGUKKwlhbGlnbm1lbnQgd2l0aC4KKworCSogdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL25vLXBhZGRpbmcubWVzc2FnZTogYWRkIHJlZ3Jlc3Npb24KKwl0ZXN0IGZvciB0aGUgbWVzc2FnZSBwYWRkaW5nIHByb2JsZW0KKworMjAwMy0wMy0wMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGVjb2RlX2hlYWRlcl9kYXRhKTogZml4IHRvIGFsd2F5cyBpbml0CisJbWVzc2FnZV9wYWRkaW5nLCBmcm9tIEJlbmphbWluIERhdXZlcmduZQorCisyMDAzLTAzLTAyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBjb25maWd1cmUuaW46IDAuNQorCisJKiBORVdTOiBVcGRhdGUuCisKKzIwMDMtMDMtMDEgIEpvZSBTaGF3ICA8am9lQGFzc2Jhcm4uY29tPgorCisJKiBjb25maWd1cmUuaW46IENoZWNrIGZvciAic3RydWN0IGNtc2djcmVkIiBhbmQgdHJ5IHRvIGFjY2VzcyBpdHMKKwltZW1iZXJzIGZvciBCU0QtbGlrZSB1bmljZXMuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKHJlYWRfY3JlZGVudGlhbHNfYnl0ZSk6IEZvbGQgdGhpcyBiYWNrIGludG8KKwlfZGJ1c19yZWFkX2NyZWRlbnRpYWxzX3VuaXhfc29ja2V0KCkuCisJKF9kYnVzX3JlYWRfY3JlZGVudGlhbHNfdW5peF9zb2NrZXQpOiBVc2UgcmVjdm1zZygpIGluc3RlYWQgb2YKKwlyZWFkKCkgZm9yIHJlYWRpbmcgdGhlIGNyZWRlbnRpYWwgYnl0ZSBvZmYgdGhlIHVuaXggc29ja2V0LiAgVXNlCisJc3RydWN0IGNtc2djcmVkIG9uIHN5c3RlbXMgdGhhdCBzdXBwb3J0IGl0LgorCisyMDAzLTAyLTI3ICBBbGV4YW5kZXIgTGFyc3NvbiAgPGFsZXhsQHJlZGhhdC5jb20+CisKKwkqIGdsaWIvTWFrZWZpbGUuYW06CisJKiBjb25maWd1cmUuaW46CisJTWFrZSBndGhyZWFkcy0yLjAgZGVwZW5kZW5jeSBvcHRpb25hbC4gRG9uJ3QgYnVpbGQgdGhyZWFkIHRlc3QgaWYKKwlpdHMgbm90IGZvdW5kLgorCisyMDAzLTAyLTI3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jCisJKGRidXNfY29ubmVjdGlvbl9zZW5kX21lc3NhZ2Vfd2l0aF9yZXBseV9hbmRfYmxvY2spOiBmaXggZG9oIQorCWRvaCEgZG9oISBidWcgdGhhdCByZXN1bHRlZCBpbiBuZXZlciByZW1vdmluZyBhIHJlcGx5IGZyb20gdGhlCisJcXVldWUsIG5vIHdvbmRlciB3ZSBjYWxsZWQgZ2V0X3JlcGx5X3NlcmlhbCBzbyBtdWNoIDstKQorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChzdHJ1Y3QgREJ1c01lc3NhZ2UpOiBjYWNoZSByZXBseSBzZXJpYWwKKwlhbmQgY2xpZW50IHNlcmlhbCBpbnN0ZWFkIG9mIGRlbWFyc2hhbGluZyB0aGVtIGV2ZXJ5IHRpbWUKKworMjAwMy0wMi0yNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYyAoX2RidXNfZGVtYXJzaGFsX2ludDMyKTogcmV3cml0ZSB0byBiZSBtdWNoCisJbW9yZSBpbmxpbmVkLCB1c2luZyBkYnVzLXN0cmluZy1wcml2YXRlLmgsIHNwZWVkcyB0aGluZ3MgdXAKKwlzdWJzdGFudGlhbGx5CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2ZyZWUpOiBhcHBseSBhbGlnbiBvZmZzZXQKKwl3aGVuIGZyZWVpbmcgdGhlIHN0cmluZworCShfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSk6IGZpeCBmb3IgYWxpZ24gb2Zmc2V0CisJKHVuZG9fYWxpZ25tZW50KTogbmV3IGZ1bmN0aW9uCisKKzIwMDMtMDItMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisgICAgICAgIEFsbCBraW5kcyBvZiBhdWRpdCBmaXhlcyBmcm9tIE93ZW4sIHBsdXMgaW5pdGlhbCBhdHRlbXB0IHRvCisJaGFuZGxlIHVuYWxpZ25lZCBtZW1vcnkgcmV0dXJuZWQgZnJvbSBtYWxsb2MuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2luaXQpOiBjbGFtcCBtYXggbGVuZ3RoIHRvCisJbGVhdmUgcm9vbSBmb3IgYWxpZ25fb2Zmc2V0IGFuZCBudWwgYnl0ZQorCShmaXh1cF9hbGlnbm1lbnQpOiBmdW5jdGlvbiB0byB0cmFjayBhbiBhbGlnbl9vZmZzZXQgYW5kCisJZW5zdXJlIHJlYWwtPnN0ciBpcyBhbGlnbmVkCisJKERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUpOiBsZW4gbXVzdCBiZSBsZXNzIHRoYW4gYWxsb2NhdGVkLAorCXRvIGFsbG93IGEgbnVsIGJ5dGUgcGx1cyBhbGlnbiBvZmZzZXQKKwkoX2RidXNfc3RyaW5nX2xvY2spOiBmaXggb3ZlcmZsb3cgaXNzdWUKKwkoX2RidXNfc3RyaW5nX2luaXRfY29uc3RfbGVuKTogYWRkIGFzc2VydGlvbnMgb24gc2FuaXR5IG9mIGxlbiwKKwlhc3NpZ24gYWxsb2NhdGVkIHRvIGJlIEFMTE9DQVRJT05fUEFERElORyBsYXJnZXIgdGhhbiBsZW4KKwkoc2V0X2xlbmd0aCk6IGZpeHVwIHRoZSBvdmVyZmxvdyBoYW5kbGluZworCShfZGJ1c19zdHJpbmdfZ2V0X2RhdGFfbGVuKTogZml4IG92ZXJmbG93IGluIGFzc2VydGlvbgorCShvcGVuX2dhcCk6IGRldGVjdCBvdmVyZmxvdyBpbiBzaXplIG9mIGdhcCB0byBiZSBvcGVuZWQKKwkoX2RidXNfc3RyaW5nX2xlbmd0aGVuKTogYWRkIG92ZXJmbG93IGNoZWNrCisJKF9kYnVzX3N0cmluZ19hbGlnbl9sZW5ndGgpOiBmaXggb3ZlcmZsb3cgd2l0aCBfREJVU19BTElHTl9WQUxVRQorCShfZGJ1c19zdHJpbmdfYXBwZW5kKTogYWRkIG92ZXJmbG93IGNoZWNrCisJKF9kYnVzX3N0cmluZ19hcHBlbmRfdW5pY2hhcik6IG92ZXJmbG93CisJKF9kYnVzX3N0cmluZ19kZWxldGUpOiBmaXggb3ZlcmZsb3cgaW4gYXNzZXJ0aW9uCisJKF9kYnVzX3N0cmluZ19jb3B5X2xlbik6IG92ZXJmbG93IGluIGFzc2VydGlvbgorCShfZGJ1c19zdHJpbmdfcmVwbGFjZV9sZW4pOiBvdmVyZmxvd3MgaW4gYXNzZXJ0aW9ucworCShfZGJ1c19zdHJpbmdfZmluZCk6IGNoYW5nZSB0byBpbXBsZW1lbnQgaW4gdGVybXMgb2YKKwlfZGJ1c19zdHJpbmdfZmluZF90bworCShfZGJ1c19zdHJpbmdfZmluZF90byk6IGFzc29ydGVkIGZpeGFnZQorCShfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIpOiBhc3NlcnQgY19zdHIgIT0gTlVMTCwKKwlmaXggbG9naWMgc28gdGhlIGZ1bmN0aW9uIHdvcmtzCisJKF9kYnVzX3N0cmluZ19lbmRzX3dpdGhfY19zdHIpOiBmaXggb3ZlcmZsb3cgdGhpbmd5CisJKF9kYnVzX3N0cmluZ19iYXNlNjRfZW5jb2RlKTogb3ZlcmZsb3cgZml4CisJKF9kYnVzX3N0cmluZ192YWxpZGF0ZV9hc2NpaSk6IG92ZXJmbG93CisJKF9kYnVzX3N0cmluZ192YWxpZGF0ZV9udWwpOiBvdmVyZmxvdworCisyMDAzLTAyLTI2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYyAoX2RidXNfbWFyc2hhbF90ZXN0KTogZml4IHRvIHdvcmsgd2l0aCBESVNBQkxFX0FTU0VSVFMKKworMjAwMy0wMi0yNiAgQWxleGFuZGVyIExhcnNzb24gIDxhbGV4bEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46CisJU2V0IERCVVNfR0xJQl9USFJFQURTX0xJQlMgZm9yIGFwcHMgdXNpbmcgZ3RocmVhZC0yLjAKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzoKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmg6CisJRml4IF9kYnVzX2Nvbm5lY3Rpb25fYWNxdWlyZV9pb19wYXRoIGFuZCBfZGJ1c19jb25uZWN0aW9uX2FjcXVpcmVfZGlzcGF0Y2guCisJQWRkIGRidXNfY29ubmVjdGlvbl9zZXRfd2FrZXVwX21haW5fZnVuY3Rpb24gYW5kIHVzZSBpdCB3aGVuIHF1ZXVlaW5nCisJaW5jb21pbmcgYW5kIG91dGdvaW5nIG1lc3NhZ2VzLgorCisKKwkqIGRidXMvZGJ1cy1kYXRhc2xvdC5jOgorCVRocmVhZHNhZmUgdXNhZ2Ugb2YgREJ1c0RhdGFTbG90QWxsb2NhdG9yCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IChkYnVzX21lc3NhZ2VfZ2V0X2FyZ3NfaXRlcik6CisJZGJ1c19uZXcgY2FuIGZhaWwuCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItdW5peC5jOgorCUFkZCB0b2RvIGNvbW1lbnQKKworCSogZ2xpYi9kYnVzLWdtYWluLmM6CisJSW1wbGVtZW50IHRoZSBuZXcgd2FrZXVwIGZ1bmN0aW9ucyBmb3IgZ2xpYi4KKworCSogZ2xpYi9NYWtlZmlsZS5hbToKKwkqIGdsaWIvdGVzdC10aHJlYWQtY2xpZW50LmM6CisJKiBnbGliL3Rlc3QtdGhyZWFkLXNlcnZlci5jOgorCSogZ2xpYi90ZXN0LXRocmVhZC5oOgorCUluaXRpYWwgY3V0IGF0IHNvbWUgdGhyZWFkIHRlc3QgY29kZS4gTm90IHJlYWxseSBkb25lIHlldC4KKworMjAwMy0wMi0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYworCShkYnVzX2Nvbm5lY3Rpb25fc2VuZF9tZXNzYWdlX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKTogZml4IGNyYXNoCisJd2hlcmUgd2UgcmVmJ2QgdGhlIG91dGdvaW5nIG1lc3NhZ2UgaW5zdGVhZCBvZiB0aGUgcmV0dXJuZWQgcmVwbHkKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMgKGRvX2F1dGhlbnRpY2F0aW9uKTogY2hlY2sgcmVhZCB3YXRjaAorCWF0IHRoZSBlbmQgb2YgdGhpcyBmdW5jdGlvbiwgc28gaWYgd2UgZGlkbid0IG5lZWQgdG8gcmVhZCBmb3IKKwlhdXRoZW50aWNhdGlvbiwgd2UgcmVpbnN0YWxsIGl0IGZvciByZWNlaXZpbmcgbWVzc2FnZXMKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX25ld19yZXBseSk6IGFsbG93IHJlcGxpZXMgdG8KKwlhIE5VTEwgc2VuZGVyIGZvciBwZWVyLXRvLXBlZXIgY2FzZQorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYyAoY2hlY2tfcmVhZF93YXRjaCk6IGhhbmRsZQorCSFhdXRoZW50aWNhdGVkIGNhc2UgY29ycmVjdGx5CisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jOiBhZGQgc3VwcG9ydCBmb3IgREJ1c1NlcnZlcgorCisJKiBkYnVzL2RidXMtc2VydmVyLmM6IGFkZCBkYXRhIHNsb3Qgc3VwcG9ydAorCisJKiBnbGliL2RidXMtZ21haW4uYyAoZGJ1c19jb25uZWN0aW9uX3NldHVwX3dpdGhfZ19tYWluKTogY2hlY2sKKwlyZXR1cm4gdmFsdWVzIGFuZCBoYW5kbGUgZXJyb3JzCisKKwkqIGRidXMvZGJ1cy1kYXRhc2xvdC5jOiBmYWN0b3Igb3V0IHRoZSBkYXRhIHNsb3Qgc3R1ZmYgZnJvbQorCURCdXNDb25uZWN0aW9uCisKKwkqIERveHlmaWxlLmluIChJTlBVVCk6IGFkZCBnbGliIHN1YmRpcgorCisJKiBnbGliL2RidXMtZ21haW4uYyAoZGJ1c19jb25uZWN0aW9uX3NldHVwX3dpdGhfZ19tYWluKTogcmVuYW1lCisJc2V0dXBfd2l0aF9nX21haW4gaW5zdGVhZCBvZiBob29rdXBfd2l0aF9nX21haW47IHdyaXRlIGRvY3MKKworMjAwMy0wMi0yNCAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmM6IChfZGJ1c19tYXJzaGFsX3ZhbGlkYXRlX2FyZyk6CisJKiBkYnVzL2RidXMtbWVzc2FnZS1idWlsZGVyLmM6IChfZGJ1c19tZXNzYWdlX2RhdGFfbG9hZCk6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoZGJ1c19tZXNzYWdlX2FwcGVuZF9ib29sZWFuKSwKKwkoZGJ1c19tZXNzYWdlX2FwcGVuZF9ib29sZWFuX2FycmF5KSwKKwkoZGJ1c19tZXNzYWdlX2dldF9hcmdzX3ZhbGlzdCksIChfZGJ1c19tZXNzYWdlX3Rlc3QpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDoKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDoKKwlWYXJpb3VzIGZpeGVzIGFzIHBvaW50ZWQgb3V0IGJ5IEhhdm9jLgorCisJKiB0ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtYm9vbGVhbi1hcnJheS5tZXNzYWdlOgorCSogdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYmFkLWJvb2xlYW4ubWVzc2FnZToKKwlBZGQgaW52YWxpZCBib29sZWFuIHZhbHVlIHRlc3QgY2FzZXMuCisKKzIwMDMtMDItMjQgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmM6IChfZGJ1c190eXBlX3RvX3N0cmluZyk6CisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiAoX2RidXNfbWFyc2hhbF9nZXRfYXJnX2VuZF9wb3MpLAorCShfZGJ1c19tYXJzaGFsX3ZhbGlkYXRlX2FyZyk6CisJKiBkYnVzL2RidXMtbWVzc2FnZS1idWlsZGVyLmM6IChfZGJ1c19tZXNzYWdlX2RhdGFfbG9hZCk6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzX3ZhbGlzdCksCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfYm9vbGVhbiksIChkYnVzX21lc3NhZ2VfYXBwZW5kX2Jvb2xlYW5fYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfZ2V0X2FyZ3NfdmFsaXN0KSwgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9ib29sZWFuKSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2ludDMyKSwgKGRidXNfbWVzc2FnZV9pdGVyX2dldF91aW50MzIpLAorCShkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZG91YmxlKSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jvb2xlYW5fYXJyYXkpLCAobWVzc2FnZV9pdGVyX3Rlc3QpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDoKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOgorCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOgorCSogdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2xvdHMtb2YtYXJndW1lbnRzLm1lc3NhZ2U6CisJQWRkIHN1cHBvcnQgZm9yIGJvb2xlYW4gYW5kIGJvb2xlYW4gYXJyYXkgdHlwZXMuCisKKzIwMDMtMDItMjMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1rZXlyaW5nLmM6IGZpbmlzaCBtb3N0IG9mIHRoaXMgaW1wbGVtZW50YXRpb24gYW5kCisJc2ltcGxlIHVuaXQgdGVzdAorCisJKiBkYnVzL2RidXMtZXJyb3JzLmMgKGRidXNfc2V0X2Vycm9yX2NvbnN0LCBkYnVzX3NldF9lcnJvcik6IG1ha2UKKwl0aGVzZSBiYXJmIGlmIHRoZSBlcnJvciBpc24ndCBjbGVhcmVkIHRvIE5VTEwKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfZGVsZXRlX2ZpbGUpOiBzZXQgZXJyb3Igb24gZmFpbHVyZQorCShfZGJ1c19jcmVhdGVfZGlyZWN0b3J5KTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuYyAoZGJ1c19zZXRfZXJyb3IpOiBmaXggd2FybmluZworCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19oZXhfZW5jb2RlKTogbmV3IGZ1bmN0aW9uCisJKF9kYnVzX3N0cmluZ19oZXhfZGVjb2RlKTogbmV3IGZ1bmN0aW9uCisJKHRlc3RfaGV4X3JvdW5kdHJpcCk6IHRlc3QgY29kZQorCisJKiBkYnVzL2RidXMtc2hhLmMgKF9kYnVzX3NoYV9jb21wdXRlKTogdXNlIGRidXNfc3RyaW5nX2hleF9lbmNvZGUKKworCSogZGJ1cy9kYnVzLW1kNS5jIChfZGJ1c19tZDVfY29tcHV0ZSk6IHVzZSBkYnVzX3N0cmluZ19oZXhfZW5jb2RlCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3N0cmluZ19zYXZlX3RvX2ZpbGUpOiBtYWtlIHRoaXMgdXNlCisJdGhlIHNhdmUtdG8tdGVtcC9yZW5hbWUgdHJpY2sgdG8gYXRvbWljYWxseSB3cml0ZSB0aGUgbmV3IGZpbGUKKwkoX2RidXNfc3RyaW5nX3BhcnNlX3VpbnQpOiBuZXcgZnVuY3Rpb24KKworMjAwMy0wMi0yMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogdGVzdC9NYWtlZmlsZS5hbSAoZGlzdC1ob29rKTogZml4IGRpc3QgZm9yIHRlc3QvZGF0YS9zaGEtMQorCisyMDAzLTAyLTIyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfc3RyaW5nX2FycmF5KToKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2J5dGVfYXJyYXkpOiBGaXggdXAgZG94eWdlbiB3YXJuaW5ncworCisJKiBkYnVzL2RidXMtc2hhLmM6IGFkZCBpbXBsZW1lbnRhdGlvbiBvZiBTSEEtMSBhbGdvcml0aG0KKworCSogZGJ1cy90ZXN0L2RhdGEvc2hhLTE6IGFkZCBVUyBnb3Zlcm5tZW50IHRlc3Qgc3VpdGUgZm9yIFNIQS0xCisKKzIwMDMtMDItMjEgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiAoX2RidXNfZGVtYXJzaGFsX3N0cmluZ19hcnJheSk6CisJTWFrZSBzdHJpbmcgYXJyYXlzIE5VTEwtdGVybWluYXRlZC4KKworCSogZGJ1cy9kYnVzLW1lbW9yeS5jOiAoZGJ1c19mcmVlX3N0cmluZ19hcnJheSk6CisJKiBkYnVzL2RidXMtbWVtb3J5Lmg6CisJTmV3IGZ1bmN0aW9uIGZvciBmcmVlaW5nIE5VTEwtdGVybWluYXRlZCBzdHJpbmcgYXJyYXlzLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS1idWlsZGVyLmM6IChhcHBlbmRfcXVvdGVkX3N0cmluZyksCisJKF9kYnVzX21lc3NhZ2VfZGF0YV9sb2FkKToKKwlBZGQgc3VwcG9ydCBmb3IgYXJyYXkgdHlwZXMuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IChjaGVja19tZXNzYWdlX2hhbmRsaW5nKToKKwlBZGQgbW9yZSB0eXBlcyBhcyB0ZXN0IGNhc2VzLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOiAoX2RidXNfc3RyaW5nX3BhcnNlX2ludCksCisJKF9kYnVzX3N0cmluZ19wYXJzZV9kb3VibGUpOgorCUFkZCB0aGUgc3RhcnQgb2Zmc2V0IHRvIHRoZSBlbmQgb2Zmc2V0LgorCisJKiB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvbG90cy1vZi1hcmd1bWVudHMubWVzc2FnZToKKwlOZXcgdGVzdCBtZXNzYWdlIHdpdGggbG90cyBvZiBhcmd1bWVudHMuCisKKzIwMDMtMDItMjEgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoZGJ1c19tZXNzYWdlX2FwcGVuZF9uaWwpLAorCShkYnVzX21lc3NhZ2VfYXBwZW5kX2ludDMyKSwgKGRidXNfbWVzc2FnZV9hcHBlbmRfdWludDMyKSwKKwkoZGJ1c19tZXNzYWdlX2FwcGVuZF9kb3VibGUpLCAoZGJ1c19tZXNzYWdlX2FwcGVuZF9zdHJpbmcpLAorCShkYnVzX21lc3NhZ2VfYXBwZW5kX2ludDMyX2FycmF5KSwKKwkoZGJ1c19tZXNzYWdlX2FwcGVuZF91aW50MzJfYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfYXBwZW5kX2RvdWJsZV9hcnJheSksCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfYnl0ZV9hcnJheSksCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfc3RyaW5nX2FycmF5KToKKwlGaXggYWxsIG91dC1vZi1tZW1vcnkgaGFuZGxpbmcgaW4gdGhlc2UgZnVuY3Rpb25zLgorCisyMDAzLTAyLTIxICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRidXNfbWVzc2FnZV9hcHBlbmRfbmlsKToKKwlGaXggYSBzaWxseS4KKworMjAwMy0wMi0yMSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IChkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3NfdmFsaXN0KSwKKwkoZGJ1c19tZXNzYWdlX2FwcGVuZF9uaWwpLCAoZGJ1c19tZXNzYWdlX2FwcGVuZF9pbnQzMl9hcnJheSksCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfdWludDMyX2FycmF5KSwKKwkoZGJ1c19tZXNzYWdlX2FwcGVuZF9kb3VibGVfYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfYXBwZW5kX2J5dGVfYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfYXBwZW5kX3N0cmluZ19hcnJheSksIChkYnVzX21lc3NhZ2VfZ2V0X2FyZ3NfdmFsaXN0KSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2ludDMyX2FycmF5KSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X3VpbnQzMl9hcnJheSksCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9kb3VibGVfYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYnl0ZV9hcnJheSksCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9zdHJpbmdfYXJyYXkpOgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5oOgorCUFkZCBmdW5jdGlvbnMgZm9yIGFwcGVuZGluZyBhbmQgZ2V0dGluZyBhcnJheXMuCisKKzIwMDMtMDItMjEgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtbWVtcG9vbC5jIChfZGJ1c19tZW1fcG9vbF9uZXcpOiBNYWtlIHRoZQorCWVsZW1lbnQgc2l6ZSBhdCBsZWFzdCA4IGJ5dGVzLCBmaXhlcyBtZW1wb29sIHRlc3RzIG9uCisJNjQtYml0IG1hY2hpbmVzLgorCisyMDAzLTAyLTIwICBBbGV4YW5kZXIgTGFyc3NvbiAgPGFsZXhsQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jICh1bml4X2RvX2l0ZXJhdGlvbik6CisJVW5sb2NrIHRoZSBjb25uZWN0aW9uIG11dGV4IGR1cmluZyBhIGJsb2NraW5nIHNlbGVjdCBjYWxsLgorCUFkZCB0b2RvIGFib3V0IGhvdyB3ZSBuZWVkIGEgd2F5IHRvIHdha2UgdXAgdGhlIHNlbGVjdC4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaDoKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6CisJQWRkIF9kYnVzX2Nvbm5lY3Rpb25fbG9jayBhbmQgX2RidXNfY29ubmVjdGlvbl91bmxvY2suCisKKzIwMDMtMDItMTkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIERveHlmaWxlLmluIChQUkVERUZJTkVEKTogcHV0IERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUyBpbgorCURveHlmaWxlLmluLCBub3QgRG94eWZpbGUKKworCSogZGJ1cy9kYnVzLWtleXJpbmcuYzogZG8gc29tZSBoYWNraW5nIG9uIHRoaXMKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfZGVsZXRlX2ZpbGUpOiBuZXcKKworCSogZGJ1cy9kYnVzLWVycm9ycy5jIChkYnVzX3NldF9lcnJvcl9jb25zdCk6IGRvIG5vdCBjYWxsCisJZGJ1c19lcnJvcl9pbml0CisJKGRidXNfc2V0X2Vycm9yKTogcmVtb3ZlIGRidXNfZXJyb3JfaW5pdCwgY2hlY2sgZm9yIG1lc3NhZ2UgPT0KKwlOVUxMICpiZWZvcmUqIHdlIHNwcmludGYgaW50byBpdCwgYW5kIGFkZCBAdG9kbyBhYm91dCBpbmNsdWRpbmcKKwlzeXN0ZW0gaGVhZGVycyBpbiB0aGlzIGZpbGUKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfY3JlYXRlX2ZpbGVfZXhjbHVzaXZlbHkpOiBuZXcKKworCSogZGJ1cy9kYnVzLWVycm9ycy5oIChEQlVTX0VSUk9SX0ZBSUxFRCk6IGFkZAorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChnZXRfdXNlcl9pbmZvKTogYnJlYWsgdGhpcyBmdW5jdGlvbiBvdXQgdG8KKwlnZXQgdmFyaW91cyBiaXRzIG9mIHVzZXIgaW5mb3JtYXRpb24gYmFzZWQgb24gZWl0aGVyIHVzZXJuYW1lCisJb3IgdXNlciBJRAorCShfZGJ1c19ob21lZGlyX2Zyb21fdXNlcm5hbWUpOiBuZXcgZnVuY3Rpb24KKworMjAwMy0wMi0xOSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGNvbmZpZ3VyZS5pbjoKKwlBZGQgY2hlY2sgZm9yIG5vbnBvc2l4IGdldHB3bmFtX3IKKworCSogZGJ1cy9kYnVzLW1lbXBvb2wuYzogKF9kYnVzX21lbV9wb29sX25ldyk6CisJQWxpZ24gdGhlIHBvb2wgZWxlbWVudCBzaXplIHRvIGEgc2l6ZW9mICh2b2lkICopIGJvdW5kYXJ5LgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOiAoX2RidXNfc2V0ZW52KSwgKF9kYnVzX2Nvbm5lY3RfdW5peF9zb2NrZXQpLAorCShfZGJ1c19saXN0ZW5fdW5peF9zb2NrZXQpLCAoX2RidXNfY3JlZGVudGlhbHNfZnJvbV91c2VybmFtZSk6CisJR2VuZXJhbCBTb2xhcmlzIGZpeGVzLgorCisJKiB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc2ltcGxlc3QtbWFudWFsLm1lc3NhZ2U6CisJRXhwbGljaXRseSBzdGF0ZSB0aGF0IHdlIHdhbnQgbGl0dGxlLWVuZGlhbiBwYWNraW5nLgorCisyMDAzLTAyLTE5ICBNaWthZWwgSGFsbGVuZGFsICA8bWlja2VAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYyAoZGJ1c19zZXJ2ZXJfbGlzdGVuKTogU3VwcG9ydCB0Y3A6IGFkZHJlc3Nlcy4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMgKF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX3RjcF9zb2NrZXQpOgorCUFkZGVkIHRvIGNyZWF0ZSBhIHRyYW5zcG9ydCBjb25uZWN0aW5nIHVzaW5nIGEgdGNwL2lwIHNvY2tldC4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfY29ubmVjdF90Y3Bfc29ja2V0KTogQWRkZWQgdG8gY29ubmVjdAorCXRvIGEgdGNwIHNvY2tldCBhdCBnaXZlbiBob3N0IGFuZCBwb3J0LgorCShfZGJ1c19saXN0ZW5fdGNwX3NvY2tldCk6IGFkZGVkIHRvIGxpc3RlbiBvbiB0Y3Agc29ja2V0IGZvciBnaXZlbgorCWhvc3RuYW1lIGFuZCBwb3J0LgorCisJKiBkYnVzL2RidXMtc2VydmVyLmMgKGRidXNfc2VydmVyX2xpc3Rlbik6IFN1cHBvcnQgdGNwOiBhZGRyZXNzZXMuCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItdW5peC5jIChfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl90Y3Bfc29ja2V0KToKKwlBZGRlZCB0byBjcmVhdGUgYSBzZXJ2ZXIgbGlzdGVuaW5nIG9uIGEgVENQL0lQIHNvY2tldC4KKworMjAwMy0wMi0xOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCVRocm91Z2hvdXQ6IG1vcCB1cCBhbGwgdGhlIERveHlnZW4gd2FybmluZ3MgYW5kIHVuZG9jdW1lbnRlZAorCXN0dWZmLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChkb19leGVjKTogZG8gbm90IHVzZSBleGVjdnAsIHdlIGRvbid0IHdhbnQKKwl0byBzZWFyY2ggYW55IHBhdGhzLgorCisJKiBkYnVzL2RidXMtdGhyZWFkcy5jOiBtb3ZlIGdsb2JhbCBtdXRleCBpbml0aWFsaXplcnMgdG8KKwlkYnVzLWludGVybmFscy5oLCBtdWx0aXBsZSBwcm90b3R5cGVzIHdhcyBjb25mdXNpbmcgZG94eWdlbgorCWJlc2lkZXMgYmVpbmcga2luZCBvZiB1Z2x5CisKKwkqIERveHlmaWxlIChQUkVERUZJTkVEKTogaGF2ZSBEb3h5Z2VuIGRlZmluZQorCURPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUyBzbyB3ZSBjYW4gZXhjbHVkZSB0aGluZ3MgZnJvbQorCWRvY3Mgd2l0aCAjaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUworCShkbyBub3QgYWJ1c2UgdGhlIGZlYXR1cmUhIGl0J3MgZm9yIHN0dWZmIGxpa2UgdGhlIGF1dG9nZW5lcmF0ZWQKKwltYWNyb3MgaW4gZGJ1cy1tZDUuYywgbm90IGp1c3QgZm9yIHRoaW5ncyB5b3UgZG9uJ3QgZmVlbCBsaWtlCisJZG9jdW1lbnRpbmcuLi4pCisKKzIwMDMtMDItMTggIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX3plcm8pOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLW1kNS5jOiBpbmNsdWRlIE1ENSBpbXBsZW1lbnRhdGlvbiBieSBMLiBQZXRlciBEZXV0c2NoLAorCXdyYXAgaXQgaW4gc29tZSBkYnVzLWZyaWVuZGx5IEFQSQorCisJKiBkYnVzL2RidXMtdHlwZXMuaDogYWRkIDE2LWJpdCB0eXBlcworCisyMDAzLTAyLTE4ICBKb2UgU2hhdyAgPGpvZUBhc3NiYXJuLmNvbT4KKworCSogZGJ1cy9kYnVzLWF1dGguYyAoaGFuZGxlX3NlcnZlcl9kYXRhX3N0dXBpZF90ZXN0X21lY2gpOiBKdXN0IGdldAorCWNyZWRlbnRpYWxzIGZyb20gb3VyIGN1cnJlbnRseSBydW5uaW5nIHByb2Nlc3MuCisJKGdldF93b3JkKTogRml4IGEgYnVnbGV0IHdoZXJlIHdlIHdlcmUgY29weWluZyB0aGUgZW50aXJlIGxlbmd0aAorCWluc3RlYWQgb2YgcmVsYXRpdmUgdG8gb3VyIHBvc2l0aW9uLgorCisJKiBkYnVzL2RidXMtaGFzaC5jIChfZGJ1c19oYXNoX3Rlc3QpOiBEb24ndCB0cnkgdG8gYWxsb2NhdGUgdGhlCisJa2V5cyBvbiB0aGUgc3RhY2suLi4gaXQncyA2NDBrIG9mIGRhdGEuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3JlYWRfY3JlZGVudGlhbHNfdW5peF9zb2NrZXQpOiBBbHdheXMKKwlyZWFkIHRoZSBjcmVkZW50aWFscyBieXRlIG9mZiB0aGUgc29ja2V0LCBldmVuIGlmIHdlIGRvbid0IGhhdmUKKwlTT19QRUVSQ1JFRC4KKwkoX2RidXNfcG9sbCk6IEltcGxlbWVudCBwb2xsKCkgdXNpbmcgc2VsZWN0KCkgZm9yIHN5c3RlbXMgd2hpY2gKKwlkb24ndCBoYXZlIGl0LgorCisJKiBnbGliL3Rlc3QtZGJ1cy1nbGliLmMgKG1haW4pOiBQcmludCBvdXQgYW4gZXJyb3IgaWYgbm8KKwlwYXJhbWV0ZXJzIGFyZSBnaXZlbi4KKworCSogdGVzdC9kYXRhL2F1dGgvZmFsbGJhY2suYXV0aC1zY3JpcHQ6IEFkZGVkLiAgVGVzdHMgdGhhdCBhIGNsaWVudAorCWNhbiBmYWxsYmFjayB0byBhIHNlY29uZGFyeSBhdXRoIG1lY2hhbmlzbSBpZiB0aGUgZmlyc3QgZmFpbHMuCisKKzIwMDMtMDItMTggIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIEFVVEhPUlM6IGFkZCBBbGV4CisKKzIwMDMtMDItMTcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDogbG90cyBvZiBjb3NtZXRpYworCWNsZWFudXBzL3JlYXJyYW5nZW1lbnQsIGFkZCBhc3NvcnRlZCBGSVhNRSwgY2hhbmdlIERCVVNfQUREUkVTUworCWVudiB2YXJpYWJsZSB0byBEQlVTX0JVU19BRERSRVNTLCBzL2NsaWVudC9hcHBsaWNhdGlvbi8sCisJcy9zZXJ2ZXIvYnVzLyAoZXhjZXB0IGluIGF1dGhlbnRpY2F0aW9uIHNlY3Rpb24pLiBBZGQgYSBzZWN0aW9uCisJIk1lc3NhZ2UgQnVzIE1lc3NhZ2UgUm91dGluZyIKKworMjAwMy0wMi0xNyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2UuPgorCisJUmVsZWFzZSAwLjQKKworCSogTkVXUzogVXBkYXRlCisKKzIwMDMtMDItMTcgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6CisJU3BlY2lmaWNhdGlvbiB1cGRhdGVzLgorCisyMDAzLTAyLTE3ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogYnVzL2FjdGl2YXRpb24uYzogKGJ1c19hY3RpdmF0aW9uX2luaXQpLCAoY2hpbGRfc2V0dXApLAorCShidXNfYWN0aXZhdGlvbl9hY3RpdmF0ZV9zZXJ2aWNlKToKKwkqIGJ1cy9hY3RpdmF0aW9uLmg6CisJKiBidXMvbWFpbi5jOiAobWFpbik6CisJU2V0IERCVVNfQUREUkVTUyBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworCSogZGJ1cy9kYnVzLWVycm9ycy5jOiAoZGJ1c19zZXRfZXJyb3IpOgorCURvbid0IHVzZSB2YV9jb3B5IHNpbmNlIHRoYXQncyBhIEM5OSBmZWF0dXJlLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOiAoX2RidXNfc2V0ZW52KSwgKGRvX2V4ZWMpLAorCShfZGJ1c19zcGF3bl9hc3luYyk6CisJKiBkYnVzL2RidXMtc3lzZGVwcy5oOgorCUFkZCBjaGlsZF9zZXR1cF9mdW5jIHRvIF9kYnVzX3NwYXduX2FzeW5jLgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6CisJVXBkYXRlIHNwZWNpZmljYXRpb24uCisKKwkqIHRlc3Qvc3Bhd24tdGVzdC5jOiAoc2V0dXBfZnVuYyksIChtYWluKToKKwlGaXggdGVzdC4KKworMjAwMy0wMi0xNyAgQWxleGFuZGVyIExhcnNzb24gIDxhbGV4bEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChfZGJ1c19jb25uZWN0aW9uX2hhbmRsZXJfZGVzdHJveWVkX2xvY2tlZCk6CisJQWRkZWQgdG9kby4KKworMjAwMy0wMi0xNyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRvYy8uY3ZzaWdub3JlOgorCSogZG9jL01ha2VmaWxlLmFtOgorCSogZG9jL2RidXMtdGVzdC1wbGFuLnNnbWw6CisJQWRkIHRlc3QgcGxhbiBkb2N1bWVudC4KKworCSogdGVzdC9NYWtlZmlsZS5hbToKKwlGaXggZGlzdGNoZWNrLgorCisyMDAzLTAyLTE3ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRlY29kZV9oZWFkZXJfZGF0YSksCisJKF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIpOgorCVNldCB0aGUgaGVhZGVyIHBhZGRpbmcgYW1vdW50IHdoZW4gbG9hZGluZyBhIG1lc3NhZ2UuCisKKzIwMDMtMDItMTYgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBidXMvZGlzcGF0Y2guYzogKHNlbmRfb25lX21lc3NhZ2UpOgorCU9ubHkgc2VuZCBicm9hZGNhc3QgbWVzc2FnZXMgdG8gcmVnaXN0ZXJlZCBjb25uZWN0aW9ucy4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRidXNfbWVzc2FnZV9uYW1lX2lzKToKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6CisJTmV3IGNvbnZlbmllbmNlIGZ1bmN0aW9uLgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LWRlYnVnLmM6IChkb19yZWFkaW5nKToKKwlPbmx5IGRpc3BhdGNoIG9uZSBtZXNzYWdlIHBlciBydW4uCisKKwkqIHRlc3QvTWFrZWZpbGUuYW06CisJKiB0ZXN0L2J1cy10ZXN0LmM6IChuZXdfY29ubmVjdGlvbl9jYWxsYmFjayksIChkaWUpLAorCSh0ZXN0X2hlbGxvX2NsaWVudDFfaGFuZGxlciksICh0ZXN0X2hlbGxvX2NsaWVudDJfaGFuZGxlciksCisJKHRlc3RfaGVsbG9fcmVwbGllcyksIChtYWluKToKKworCSogdGVzdC9idXMtdGVzdC1sb29wLltjaF06CisJQWRkIHRoZXNlLgorCisyMDAzLTAyLTE2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2hfbWVzc2FnZSk6IGZpeAorCWJhY2t3YXJkIGNvbmRpdGlvbmFsCisKKzIwMDMtMDItMTYgIEFsZXhhbmRlciBMYXJzc29uICA8YWxleGxAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzoKKwlJbXBsZW1lbnQgc2VudF9tZXNzYWdlX3dpdGhfcmVwbHkuICh3aXRoX3JlcGx5X2FuZCBibG9jayBpcyBzdGlsbAorCWJ1c3RlZCkuCisJTWFkZSBkaXNwYXRjaF9tZXNzYWdlIG5vdCBsb3NlIG1lc3NhZ2UgaWYgT09NLgorCisJKiBkYnVzL2RidXMtZXJyb3JzLmg6CisJQWRkIE5vUmVwbHkgZXJyb3IgKGZvciByZXBseSB0aW1lb3V0cykuCisKKzIwMDMtMDItMTYgIEFsZXhhbmRlciBMYXJzc29uICA8YWxleGxAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWhhc2guYyAoX2RidXNfaGFzaF90YWJsZV91bnJlZik6CisJQWN0dWFsbHkgZnJlZSBrZXlzIGFuZCB2YWx1ZXMgd2hlbiBkZXN0cm95aW5nIGhhc2h0YWJsZS4KKworMjAwMy0wMi0xNiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1hdXRoLmM6IChjbGllbnRfdHJ5X25leHRfbWVjaGFuaXNtKToKKwlQbHVnIGEgbGVhay4KKworCSogZGJ1cy9kYnVzLXRocmVhZHMuYzogKGRidXNfY29uZHZhcl93YWl0X3RpbWVvdXQpOgorCVJldHVybiBUUlVFIGlmIHRoZXJlJ3Mgbm8gdGhyZWFkIGltcGxlbWVudGF0aW9uIGFyb3VuZC4KKworCSogZ2xpYi9kYnVzLWdtYWluLmM6IChmcmVlX3NvdXJjZSksCisJKGRidXNfY29ubmVjdGlvbl9ob29rdXBfd2l0aF9nX21haW4pOgorCU1ha2Ugc3VyZSB0byByZW1vdmUgdGhlIEdTb3VyY2Ugd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBmaW5hbGl6ZWQuCisKKzIwMDMtMDItMTYgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBidXMvZGlzcGF0Y2guYzogKGJ1c19kaXNwYXRjaF9tZXNzYWdlX2hhbmRsZXIpOgorCSogZGJ1cy9kYnVzLWVycm9ycy5oOgorCVJldHVybiBhbiBlcnJvciBpZiBzb21lb25lIHRyaWVzIHRvIHNlbmQgYSBtZXNzYWdlIHRvIGEgc2VydmljZQorCXRoYXQgZG9lc24ndCBleGlzdC4KKworMjAwMy0wMi0xNiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9hY3RpdmF0aW9uLmM6IChsb2FkX2RpcmVjdG9yeSksIChidXNfYWN0aXZhdGlvbl9pbml0KSwKKwkoYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSk6CisJKiBidXMvYWN0aXZhdGlvbi5oOgorCSogYnVzL2RyaXZlci5jOgorCShidXNfZHJpdmVyX2hhbmRsZV9hY3RpdmF0ZV9zZXJ2aWNlKSwgKGJ1c19kcml2ZXJfaGFuZGxlX21lc3NhZ2UpOgorCU1vcmUgd29yayBvbiB0aGUgYWN0aXZhdGlvbiBoYW5kbGluZy4KKworCSogZGJ1cy9kYnVzLWVycm9ycy5oOgorCUFkZCBzb21lIGVycm9yIG1lc3NhZ2VzCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IChkYnVzX21lc3NhZ2VfbmV3X2Vycm9yX3JlcGx5KToKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6CisJTmV3IGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhbiBlcnJvciBtZXNzYWdlLgorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaDoKKwlBZGQgQUNUSVZBVEVfU0VSVkVSIG1lc3NhZ2UuCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItdW5peC5jOiAodW5peF9oYW5kbGVfd2F0Y2gpLAorCShfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl9kb21haW5fc29ja2V0KToKKwlDYWxsIF9kYnVzX2ZkX3NldF9jbG9zZV9vbl9leGVjLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOiAobWFrZV9waXBlKSwgKGRvX2V4ZWMpLAorCShfZGJ1c19zcGF3bl9hc3luYyksIChfZGJ1c19kaXNhYmxlX3NpZ3BpcGUpLAorCShfZGJ1c19mZF9zZXRfY2xvc2Vfb25fZXhlYyk6CisJKiBkYnVzL2RidXMtc3lzZGVwcy5oOgorCUFkZCBfZGJ1c19mZF9zZXRfY2xvc2Vfb24gZXhlYyBmdW5jdGlvbi4gQWxzbyBhZGQgZnVuY3Rpb24gdGhhdCBjaGVja3MKKwl0aGF0IGFsbCBvcGVuIGZkcyBhcmUgc2V0IHRvIGNsb3NlLW9uLWV4ZWMgYW5kIHdhcm5zIG90aGVyd2lzZS4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmM6CisJKF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX2RvbWFpbl9zb2NrZXQpOgorCUNhbGwgX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMuCisKKzIwMDMtMDItMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9zZXRfY2hhbmdlX3NpZ3BpcGUpOgorCWFsbG93IHBlb3BsZSB0byBhdm9pZCBzZXR0aW5nIFNJR1BJUEUgdG8gU0lHX0lHTgorCShfZGJ1c19jb25uZWN0aW9uX25ld19mb3JfdHJhbnNwb3J0KTogZGlzYWJsZSBTSUdQSVBFIHVubGVzcworCXdlJ3ZlIGJlZW4gYXNrZWQgbm90IHRvCisKKzIwMDMtMDItMTUgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtbGlzdC5jOiAoX2RidXNfbGlzdF9hcHBlbmRfbGluayksCisJKF9kYnVzX2xpc3RfcHJlcGVuZF9saW5rKToKKwkqIGRidXMvZGJ1cy1tZW1vcnkuYzogKGRidXNfbWFsbG9jKSwgKGRidXNfbWFsbG9jMCksCisJKGRidXNfcmVhbGxvYyk6CisJV2FybmluZyBmaXhlcy4KKworMjAwMy0wMi0xNSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9NYWtlZmlsZS5hbToKKwkqIGJ1cy9hY3RpdmF0aW9uLmM6IChidXNfYWN0aXZhdGlvbl9lbnRyeV9mcmVlKSwKKwkoYWRkX2Rlc2t0b3BfZmlsZV9lbnRyeSksIChsb2FkX2RpcmVjdG9yeSksIChidXNfYWN0aXZhdGlvbl9pbml0KToKKwkqIGJ1cy9hY3RpdmF0aW9uLmg6CisJKiBidXMvbWFpbi5jOiAobWFpbik6CisJQWRkIHNpbXBsZSBhY3RpdmF0aW9uIHN1cHBvcnQsIGRvZXNuJ3Qgd29yayB5ZXQgdGhvdWdoLgorCisyMDAzLTAyLTE1ICAgWmFjayBSdXNpbiAgPHphY2tAa2RlLm9yZz4KKworCSogcXQvZGJ1cy1xdGhyZWFkLmNwcDogIHNtYWxsIGNhc3RpbmcgZml4CisKKzIwMDMtMDItMTUgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtZXJyb3JzLmM6IChkYnVzX3NldF9lcnJvcik6CisJKiBkYnVzL2RidXMtZXJyb3JzLmg6CisJQWRkIGEgZmV3IGVycm9ycyBhbmQgbWFrZSBkYnVzX3NldF9lcnJvciB2b2lkLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOgorCShfZGJ1c19lcnJub190b19zdHJpbmcpLCAoY2xvc2VfYW5kX2ludmFsaWRhdGUpLCAobWFrZV9waXBlKSwKKwkod3JpdGVfZXJyX2FuZF9leGl0KSwgKHJlYWRfaW50cyksIChkb19leGVjKSwgKF9kYnVzX3NwYXduX2FzeW5jKToKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmg6CisJQWRkIF9kYnVzX3NwYXduX2FzeW5jLgorCisJKiB0ZXN0L3NwYXduLXRlc3QuYzogKG1haW4pOgorCVRlc3QgZm9yIF9kYnVzX3NwYXduX2FzeW5jLgorCisyMDAzLTAyLTE1ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oOgorCUZpeCBidWlsZCB3aXRob3V0IHRlc3RzLgorCisJKiBkYnVzL2RidXMtbGlzdC5jOiAoYWxsb2NfbGluayk6CisJRml4IGEgc2VnZmF1bHQgd2hlbiBhIG1hbGxvYyBmYWlscy4KKworCSogZGJ1cy9kYnVzLW1lbW9yeS5jOiAoaW5pdGlhbGl6ZV9tYWxsb2NfZGVidWcpLCAoZGJ1c19tYWxsb2MpLAorCShkYnVzX21hbGxvYzApLCAoZGJ1c19yZWFsbG9jKToKKwlBZGQgc3VwcG9ydCBmb3IgbWFsbG9jIGRlYnVnZ2luZy4KKworMjAwMy0wMi0xNSAgQWxleGFuZGVyIExhcnNzb24gIDxhbGV4bEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdGhyZWFkcy5jOgorCSogZGJ1cy9kYnVzLXRocmVhZHMuaDoKKwlBZGQgY29uZHZhcnMuIFJlbW92ZSBzdGF0aWMgbXV0ZXh0IGZyb20gQVBJLgorCUltcGxlbWVudCBzdGF0aWMgbXV0ZXhlcyBieSBpbml0aWFsaXppbmcgdGhlbSBmcm9tIHRocmVhZHNfaW5pdC4KKworCSogZ2xpYi9kYnVzLWd0aHJlYWQuYzoKKwkqIHF0L2RidXMtcXRocmVhZC5jcHA6CisJVXBkYXRlIHdpdGggdGhlIHRocmVhZCBhcGkgY2hhbmdlcy4KKworCisJKiBkYnVzL2RidXMtbGlzdC5jOgorCSogZGJ1cy9kYnVzLWxpc3QuaDoKKwlUdXJuIFN0YXRpY011dGV4IGludG8gbm9ybWFsIG11dGV4ICsgaW5pdCBmdW5jdGlvbi4KKwlFeHBvcnQgbmV3IGZ1bmN0aW9ucyBfZGJ1c19saXN0X2FsbG9jX2xpbmssIF9kYnVzX2xpc3RfZnJlZV9saW5rLAorCV9kYnVzX2xpc3RfYXBwZW5kX2xpbmssIF9kYnVzX2xpc3RfcHJlcGVuZF9saW5rCisKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYzoKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmg6CisJTmV3IHR5cGUgZGJ1c19hdG9taWNfdCwgYW5kIG5ldyBmdW5jdGlvbnMgX2RidXNfYXRvbWljX2luYywKKwlfZGJ1c19hdG9taWNfZGVjLiBPbmx5IHNsb3cgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gYXQgdGhlIG1vbWVudC4KKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6CisJQWRkIERCVVNfTUVTU0FHRV9MT0NBTF9ESVNDT05ORUNUIGRlZmluZQorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOgorCU1ha2UgcmVmL3VucmVmIGF0b21pYy4KKwlGaXggc29tZSBkb2NzLgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oOgorCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzoKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmg6CisJTWFrZSB0aHJlYWRzYWZlLgorCUNoYW5nZSBfcGVlayB0byBfYm9ycm93LF9yZXR1cm4gJiBfc3RlYWxfYm9ycm93ZWQuCisJQ2hhbmdlIGRpc2Nvbm5lY3QgY2FsbGJhY2sgdG8gZXZlbnQuCisJTWFrZSBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2hfbWVzc2FnZXMgcmVlbnRyYW50LgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmM6CisJRG9uJ3QgcmVmIHRoZSBjb25uZWN0aW9uIG9uIGNhbGxzIHRvIHRoZSB0cmFuc3BvcnQKKwlpbXBsZW1lbnRhdGlvbi4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtaGFuZGxlci5jOgorCU1ha2UgdGhyZWFkc2FmZS4KKworCSogZ2xpYi9kYnVzLWdtYWluLmM6CisJRG9uJ3QgdXNlIHBlZWtfbWVzc2FnZSBhbnltb3JlCisKKwkqIHRlc3QvTWFrZWZpbGUuYW06CisJKiB0ZXN0L2RlYnVnLXRocmVhZC5jOgorCSogdGVzdC9kZWJ1Zy10aHJlYWQuaDoKKwlTaW1wbGUgdGhyZWFkIGltcGxlbWVudGF0aW9uIHRoYXQgYXNzZXJ0cygpIG9uIGRlYWRsb2NrcyBpbgorCXNpbmdsZS10aHJlYWRlZCBjb2RlLgorCisJKiB0ZXN0L2J1cy10ZXN0LmM6CisJKG1haW4pIENhbGwgZGVidWdfdGhyZWFkc19pbml0LgorCisJKiB0ZXN0L3dhdGNoLmM6CisJVXNlIGRpc2Nvbm5lY3QgbWVzc2FnZSBpbnN0ZWFkIG9mIGRpc2Nvbm5lY3QgY2FsbGJhY2suCisKKwkqIGJ1cy9jb25uZWN0aW9uLmM6CisJKiBidXMvY29ubmVjdGlvbi5oOgorCURvbid0IGNhbGwgZGJ1c19jb25uZWN0aW9uX3NldF9kaXNjb25uZWN0X2Z1bmN0aW9uLiBJbnN0ZWFkIGV4cG9ydAorCWJ1c19jb25uZWN0aW9uX2Rpc2Nvbm5lY3QuCisKKwkqIGJ1cy9kaXNwYXRjaC5jOgorCUNhbGwgYnVzX2Nvbm5lY3Rpb25fZGlzY29ubmVjdCB3aGVuIHdlIGdldCBhIGRpc2Nvbm5lY3RlZCBtZXNzYWdlLgorCisyMDAzLTAyLTE1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfbmV3KTogZm9vbCBhcm91bmQgd2l0aCB0aGUKKwlkb2NzCisKKzIwMDMtMDItMTQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZW1wb29sLmM6IGZhaWwgaWYgdGhlIGRlYnVnIGZ1bmN0aW9ucyBzbyBpbmRpY2F0ZQorCisJKiBkYnVzL2RidXMtbWVtb3J5LmM6IGZhaWwgaWYgdGhlIGRlYnVnIGZ1bmN0aW9ucyBpbmRpY2F0ZSB3ZQorCXNob3VsZAorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmMgKF9kYnVzX3NldF9mYWlsX2FsbG9jX2NvdW50ZXIpCisJKF9kYnVzX2RlY3JlbWVudF9mYWlsX2FsbG9jX2NvdW50ZXIpOiBkZWJ1ZyBmdW5jdGlvbnMgdG8KKwlzaW11bGF0ZSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlcworCisyMDAzLTAyLTE0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtZXJyb3JzLmggKHN0cnVjdCBEQnVzRXJyb3IpOiBhZGQgYSB3b3JkIG9mIHBhZGRpbmcKKwl0byBEQnVzRXJyb3IKKworMjAwMy0wMi0xMyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9kcml2ZXIuYzogKGJ1c19kcml2ZXJfaGFuZGxlX2hlbGxvKToKKwkqIGJ1cy9kcml2ZXIuaDoKKwkqIGJ1cy9zZXJ2aWNlcy5jOiAoYnVzX3NlcnZpY2VfbG9va3VwKToKKwlSZW9yZGVyIG1lc3NhZ2Ugc2VuZGluZyBzbyB3ZSBnZXQgYSBtb3JlIHNhbmUgb3JkZXIuCisKKwkqIHRlc3QvYnVzLXRlc3QuYzogKG1lc3NhZ2VfaGFuZGxlcik6CisJRml4IHR5b3AuCisKKzIwMDMtMDItMTMgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBidXMvZHJpdmVyLmM6IChidXNfZHJpdmVyX3NlbmRfc2VydmljZV9kZWxldGVkKSwKKwkoYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfY3JlYXRlZCksIChidXNfZHJpdmVyX3NlbmRfc2VydmljZV9sb3N0KSwKKwkoYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfYWNxdWlyZWQpLCAoYnVzX2RyaXZlcl9oYW5kbGVfaGVsbG8pLAorCShidXNfZHJpdmVyX3NlbmRfd2VsY29tZV9tZXNzYWdlKSwKKwkoYnVzX2RyaXZlcl9oYW5kbGVfbGlzdF9zZXJ2aWNlcyksCisJKGJ1c19kcml2ZXJfaGFuZGxlX2FjcXVpcmVfc2VydmljZSksCisJKGJ1c19kcml2ZXJfaGFuZGxlX3NlcnZpY2VfZXhpc3RzKToKKwkqIGRidXMvZGJ1cy1idXMuYzogKGRidXNfYnVzX3JlZ2lzdGVyX2NsaWVudCksCisJKGRidXNfYnVzX2FjcXVpcmVfc2VydmljZSksIChkYnVzX2J1c19zZXJ2aWNlX2V4aXN0cyk6CisJKiBkYnVzL2RidXMtZXJyb3JzLmM6IChkYnVzX3Jlc3VsdF90b19zdHJpbmcpOgorCSogZGJ1cy9kYnVzLWVycm9ycy5oOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyksCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfYXJnc192YWxpc3QpLCAoZGJ1c19tZXNzYWdlX2dldF9hcmdzKSwKKwkoZGJ1c19tZXNzYWdlX2dldF9hcmdzX3ZhbGlzdCksIChkYnVzX21lc3NhZ2VfZ2V0X2FyZ3NfaXRlciksCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSksIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfc3RyaW5nKSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2J5dGVfYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfaXRlcl9nZXRfc3RyaW5nX2FycmF5KSwgKG1lc3NhZ2VfaXRlcl90ZXN0KSwKKwkoY2hlY2tfbWVzc2FnZV9oYW5kbGluZyksIChfZGJ1c19tZXNzYWdlX3Rlc3QpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDoKKwkqIHRlc3QvYnVzLXRlc3QuYzogKG1haW4pOgorCUNoYW5nZSBmaWVsZHMgdG8gYXJndW1lbnRzIGluIG1lc3NhZ2VzLCBzbyB0aGF0IHRoZXkgd29uJ3QgYmUKKwljb25mdXNlZCB3aXRoIGhlYWRlciBmaWVsZHMuCisKKwkqIGdsaWIvdGVzdC1kYnVzLWdsaWIuYzogKG1haW4pOgorCVJlbW92ZSBhcHBlbmRfZmllbGRzIGZyb20gaGVsbG8gbWVzc2FnZS4KKworMjAwMy0wMi0xMyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuYzoKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6CisJKiBkYnVzL2RidXMtc3RyaW5nLmM6CisJRG9jdW1lbnRhdGlvbiBmaXhlcy4KKworMjAwMy0wMi0xMyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jOiAodGltZW91dF9oYW5kbGVyKSwgKGFkZF90aW1lb3V0KSwKKwkocmVtb3ZlX3RpbWVvdXQpOgorCUltcGxlbWVudCBzdXBwb3J0IGZvciB0aW1lb3V0cyBpbiBkYnVzLWdsaWIuCisKKzIwMDMtMDItMTMgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS1idWlsZGVyLmM6IChfZGJ1c19tZXNzYWdlX2RhdGFfbG9hZCk6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAocHJvY2Vzc190ZXN0X3N1YmRpcik6CisJKiB0ZXN0L2JyZWFrLWxvYWRlci5jOiAoZmluZF9icmVha3NfYmFzZWRfb24pOgorCVBsdWcgc29tZSBtZW1vcnkgbGVha3MuCisKKzIwMDMtMDItMTMgIFJpY2hhcmQgSHVsdCAgPHJodWx0QGNvZGVmYWN0b3J5LnNlPgorCisJKiBidXMvbWFpbi5jOiBGaXggYnVpbGQuCisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuaDoKKwkqIGRidXMvZGJ1cy1lcnJvcnMuYzogRml4IGNvcHlyaWdodCBmb3IgQW5kZXJzLgorCisyMDAzLTAyLTEzICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogYnVzL01ha2VmaWxlLmFtOgorCUFkZCB1dGlscy5bY2hdCisKKwkqIGJ1cy9jb25uZWN0aW9uLmM6IChidXNfY29ubmVjdGlvbl9mb3JlYWNoKToKKwlGaXggYSB3YXJuaW5nLgorCisJKiBidXMvZGVza3RvcC1maWxlLmM6IChncm93X2xpbmVzX2luX3NlY3Rpb24pLCAoZ3Jvd19zZWN0aW9ucyksCisJKHVuZXNjYXBlX3N0cmluZyksIChuZXdfc2VjdGlvbiksIChwYXJzZV9zZWN0aW9uX3N0YXJ0KSwKKwkocGFyc2Vfa2V5X3ZhbHVlKSwgKHJlcG9ydF9lcnJvciksIChidXNfZGVza3RvcF9maWxlX2xvYWQpLAorCShidXNfZGVza3RvcF9maWxlX2dldF9zdHJpbmcpOgorCSogYnVzL2Rlc2t0b3AtZmlsZS5oOgorCVVzZSBEQnVzRXJyb3IgZm9yIGVycm9yIHJlcG9ydGluZy4KKworCSogYnVzL2Rpc3BhdGNoLmM6IChzZW5kX29uZV9tZXNzYWdlKSwKKwkoYnVzX2Rpc3BhdGNoX21lc3NhZ2VfaGFuZGxlcik6CisJKiBidXMvZHJpdmVyLmM6IChidXNfZHJpdmVyX3NlbmRfc2VydmljZV9kZWxldGVkKSwKKwkoYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfY3JlYXRlZCksIChidXNfZHJpdmVyX3NlbmRfc2VydmljZV9sb3N0KSwKKwkoYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfYWNxdWlyZWQpLCAoYnVzX2RyaXZlcl9oYW5kbGVfaGVsbG8pLAorCShidXNfZHJpdmVyX3NlbmRfd2VsY29tZV9tZXNzYWdlKSwKKwkoYnVzX2RyaXZlcl9oYW5kbGVfbGlzdF9zZXJ2aWNlcyksCisJKGJ1c19kcml2ZXJfaGFuZGxlX2FjcXVpcmVfc2VydmljZSksCisJKGJ1c19kcml2ZXJfaGFuZGxlX3NlcnZpY2VfZXhpc3RzKToKKwkqIGJ1cy9sb29wLmM6IChidXNfbG9vcF9ydW4pOgorCSogYnVzL21haW4uYzoKKwlVc2UgQlVTX0hBTkRMRV9PT00gaW5zdGVhZCBvZiBfREJVU19IQU5ETEVfT09NLgorCisJKiBidXMvdXRpbHMuYzogKGJ1c193YWl0X2Zvcl9tZW1vcnkpOgorCSogYnVzL3V0aWxzLmg6CisJTmV3IGZpbGVzIHdpdGggZ2VuZXJhbCB1dGlsaXR5IGZ1bmN0aW9ucy4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oOgorCVJlbW92ZSBfREJVU19IQU5ETEVfT09NLgorCisyMDAzLTAyLTEzICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLWVycm9ycy5jOiAoZGJ1c19yZXN1bHRfdG9fc3RyaW5nKSwgKGRidXNfZXJyb3JfaW5pdCksCisJKGRidXNfZXJyb3JfZnJlZSksIChkYnVzX3NldF9lcnJvcl9jb25zdCksIChkYnVzX3NldF9lcnJvcik6CisJKiBkYnVzL2RidXMtZXJyb3JzLmg6CisJQWRkIERCdXNFcnJvciBzdHJ1Y3R1cmUuCisKKzIwMDMtMDItMTMgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc3RhbmRhcmQtYWNxdWlyZS1zZXJ2aWNlLm1lc3NhZ2U6CisJKiB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc3RhbmRhcmQtaGVsbG8ubWVzc2FnZToKKwkqIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC1saXN0LXNlcnZpY2VzLm1lc3NhZ2U6CisJKiB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc3RhbmRhcmQtc2VydmljZS1leGlzdHMubWVzc2FnZToKKwlBZGQgc29tZSBzdGFuZGFyZCBtZXNzYWdlcy4KKworMjAwMy0wMi0xMyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9kcml2ZXIuYzogKGJ1c19kcml2ZXJfc2VuZF93ZWxjb21lX21lc3NhZ2UpLAorCShidXNfZHJpdmVyX2hhbmRsZV9saXN0X3NlcnZpY2VzKSwKKwkoYnVzX2RyaXZlcl9oYW5kbGVfYWNxdWlyZV9zZXJ2aWNlKSwKKwkoYnVzX2RyaXZlcl9oYW5kbGVfc2VydmljZV9leGlzdHMpLCAoYnVzX2RyaXZlcl9oYW5kbGVfbWVzc2FnZSk6CisJVXBkYXRlIGZvciBBUEkgY2hhbmdlcyBpbiBsaWJkYnVzLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoZGJ1c19tZXNzYWdlX25ld19yZXBseSk6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5oOgorCVJlbW92ZSB0aGUgbmFtZSBhcmd1bWVudC4gVGhlIHNwZWMgc3RhdGVzIHRoYXQgcmVwbGllcyBzaG91bGRuJ3QKKwloYXZlIGEgbmFtZS4KKworMjAwMy0wMi0xMyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9kZXNrdG9wLWZpbGUuYzogKHBhcnNlX3NlY3Rpb25fc3RhcnQpLCAocGFyc2Vfa2V5X3ZhbHVlKSwKKwkocmVwb3J0X2Vycm9yKSwgKGJ1c19kZXNrdG9wX2ZpbGVfbG9hZCksIChsb29rdXBfc2VjdGlvbiksCisJKGxvb2t1cF9saW5lKSwgKGJ1c19kZXNrdG9wX2ZpbGVfZ2V0X3JhdyksCisJKGJ1c19kZXNrdG9wX2ZpbGVfZ2V0X3N0cmluZyk6CisJKiBidXMvZGVza3RvcC1maWxlLmg6CisJU29tZSBmaXhlcywgYW5kIG5ldyBmdW5jdGlvbnMgZm9yIGdldHRpbmcgYSBrZXkgdmFsdWUgZnJvbSBhIHNlY3Rpb24uCisKKzIwMDMtMDItMTMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIHRlc3QvZGF0YS9hdXRoL2ZhaWwtYWZ0ZXItbi1hdHRlbXB0cy5hdXRoLXNjcmlwdDogbmV3IHRlc3QKKworCSogZGJ1cy9kYnVzLWF1dGguYyAoc2VuZF9yZWplY3RlZCk6IHNodXRkb3duX21lY2goKSB3aGVuIHdlCisJcmVqZWN0IHRoZSBjbGllbnQuCisKKzIwMDMtMDItMTMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKGhhbmRsZV9zZXJ2ZXJfZGF0YV9leHRlcm5hbF9tZWNoKTogYXJncyB0bworCWRidXNfY3JlZGVudGlhbHNfbWF0Y2ggd2VyZSBiYWNrd2FyZAorCisJKiBkYnVzL2RidXMtYXV0aC1zY3JpcHQuYyAoX2RidXNfYXV0aF9zY3JpcHRfcnVuKTogc3VwcG9ydAorCU5PX0NSRURFTlRJQUxTIGFuZCBST09UX0NSRURFTlRJQUxTCisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKF9kYnVzX2F1dGhfZG9fd29yayk6IG1vdmUgZ2V0X3N0YXRlKCkgcm91dGluZQorCWludG8gaGVyZS4gTmV2ZXIgcHJvY2VzcyBtb3JlIGNvbW1hbmRzIGFmdGVyIHdlJ3ZlIHJlYWNoZWQgYW4KKwllbmQgc3RhdGU7IHN0b3JlIGZ1cnRoZXIgZGF0YSBhcyB1bnVzZWQgYnl0ZXMuCisKKwkqIHRlc3QvZGF0YS9hdXRoLyo6IGFkZCBtb3JlIGF1dGggdGVzdHMKKworCSogZGJ1cy9kYnVzLWF1dGgtc2NyaXB0LmMgKF9kYnVzX2F1dGhfc2NyaXB0X3J1bik6IHN1cHBvcnQgRVhQRUNUCisJY29tbWFuZCB0byBtYXRjaCBleGFjdCBzdHJpbmcgYW5kIEVYUEVDVF9VTlVTRUQgdG8gbWF0Y2ggdW51c2VkCisJYnl0ZXMKKworCSogdGVzdC9NYWtlZmlsZS5hbSAoZGlzdC1ob29rKTogZml4IHRvIGRpc3QgYWxsIHRoZSB0ZXN0IHN0dWZmCisKKzIwMDMtMDItMTIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX3BvcF9saW5lKTogZml4IHRvIGFsc28gc3RyaXAKKwlcciBvZmYgb2YgcG9wcGVkIGxpbmVzCisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKF9kYnVzX2F1dGhfdGVzdCk6IHdyaXRlIGNvZGUgdG8gcnVuIGF1dGgKKwlzY3JpcHRzCisKKwkqIGRidXMvZGJ1cy1hdXRoLXNjcmlwdC5jIChfZGJ1c19hdXRoX3NjcmlwdF9ydW4pOiB3aGVuIGRvaW5nIGEKKwlTRU5ELCBhcHBlbmQgXHJcbgorCisyMDAzLTAyLTEyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL01ha2VmaWxlLmFtOiByZW1vdmUgYnJlYWstbG9hZGVyIGZyb20gdGhlIGJ1aWxkLCBzaW5jZSBpdAorCW1vdmVkLgorCisJKiBjb25maWd1cmUuaW46IGFkZCAtLWVuYWJsZS1nY292IHRvIHR1cm4gb24gY292ZXJhZ2UgcHJvZmlsaW5nCisJZmxhZ3MgYW5kIGRpc2FibGUgb3B0aW1pemF0aW9uCisKKzIwMDMtMDItMTAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKyAgICAgICAgKiBkYnVzL2RidXMtYXV0aC1zY3JpcHQuYywgZGJ1cy9kYnVzLWF1dGgtc2NyaXB0Lmg6IHN5bmMKKwlpbml0aWFsIGN1dCBhdCB0ZXN0IGZyYW1ld29yayBmb3IgREJ1c0F1dGggZnJvbSBsYXB0b3AuCisJRG9lc24ndCBxdWl0ZSB3b3JrIHlldCBidXQgaXQgY29tcGlsZXMgYW5kIEkgbmVlZCB0byBnZXQKKwlpdCBvZmYgdGhlIDI2Nm1oeiBsYXB0b3AuIDstKQorCisJKiBkYnVzL2RidXMtc2VydmVyLWRlYnVnLmMgKF9kYnVzX3NlcnZlcl9kZWJ1Z19hY2NlcHRfdHJhbnNwb3J0KToKKwlmaXggYSBtZW1sZWFrIGluIGVycm9yIGNhc2UKKworMjAwMy0wMi0xMiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9NYWtlZmlsZS5hbToKKwkqIGJ1cy9kZXNrdG9wLWZpbGUuYzoKKwkqIGJ1cy9kZXNrdG9wLWZpbGUuaDoKKwlBZGQgYSBkZXNrdG9wIGZpbGUgcGFyc2VyLgorCisyMDAzLTAyLTExICBaYWNrIFJ1c2luICA8emFja0BrZGUub3JnPgorCisJKiBxdC9tZXNzYWdlLltofGNwcF06IHNhbXBsZSBpbXBsZW1lbnRhdGlvbgorCW9mIHRoZSBLREUgd3JhcHBlciBmb3IgREJ1c01lc3NhZ2UKKworMjAwMy0wMi0wOSAgWmFjayBSdXNpbiAgPHphY2tAa2RlLm9yZz4KKworCSogdGVzdC9idXMtdGVzdC5jOiBtYWtlX2l0X2NvbXBpbGUKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDogbWluaW1hbCBzZW1hbnRpYyBmaXgKKworMjAwMy0wMi0wNiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwlSZWxlYXNlIDAuMworCisJKiBORVdTOiBVcGRhdGUKKworMjAwMy0wMi0wNiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvTWFrZWZpbGUuYW06CisJKiBkYnVzL2RidXMtYnJlYWstbG9hZGVyLmM6CisJKiB0ZXN0L01ha2VmaWxlLmFtOgorCSogdGVzdC9icmVhay1sb2FkZXIuYzoKKwlNb3ZlIGRidXMtYnJlYWstbG9hZGVyIHRvIHRlc3QvIGFuZCByZW5hbWUgaXQgdG8gYnJlYWstbG9hZGVyLgorCisyMDAzLTAyLTAyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMta2V5cmluZy5jLCBkYnVzL2RidXMta2V5cmluZy5oOiB0ZW1wbGF0ZSBmaWxlcworCWZvciBjb2RlIHRvIG1hbmFnZSBjb29raWVzIGluIHlvdXIgaG9tZSBkaXJlY3RvcnkKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2J5dGVzKTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKGdldF9zdGF0ZSk6IGltcG9zZSBhIG1heGltdW0gbnVtYmVyIG9mIHRyaWVzCisJdG8gYXV0aGVudGljYXRlLCB0aGVuIGRpc2Nvbm5lY3QgdGhlIGNsaWVudC4KKworMjAwMy0wMi0wMyAgQWxleGFuZGVyIExhcnNzb24gIDxhbGV4bEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfYXBwZW5kX2ZpZWxkcyk6CisJQ29ycmVjdCBkb2NzLgorCisyMDAzLTAyLTAyICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOgorCVVwZGF0ZSBhZGRyZXNzIGZvcm1hdCBzZWN0aW9uLgorCisyMDAzLTAyLTAyICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogdGVzdC9NYWtlZmlsZS5hbToKKwkqIHRlc3QvYnVzLXRlc3QuYzogKGdldF90aW1lKSwgKGFkZF90aW1lb3V0KSwgKHJlbW92ZV90aW1lb3V0KSwKKwkobWVzc2FnZV9oYW5kbGVyKSwgKG5ld19jb25uZWN0aW9uX2NhbGxiYWNrKSwgKGxvb3BfcXVpdCksCisJKGxvb3BfcnVuKSwgKG1haW4pOgorCUFkZCBidXMgdGVzdC4KKworMjAwMy0wMi0wMiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9kcml2ZXIuYzogKGJ1c19kcml2ZXJfaGFuZGxlX3NlcnZpY2VfZXhpc3RzKToKKwlTaW1wbGlmeSB0aGUgY29kZSBhIGJpdC4KKworCSogZGJ1cy9kYnVzLWJ1cy5jOiAoZGJ1c19idXNfc2VydmljZV9leGlzdHMpOgorCUZpeCBhIHNpbGx5LgorCisyMDAzLTAyLTAyICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogYnVzL01ha2VmaWxlLmFtOgorCUFkZCBsaWJkYnVzLWRhZW1vbi5sYSBhbmQgbGluayB0byBpdC4KKworMjAwMy0wMi0wMSAgSmFtZXMgV2lsbGNveCAgPGp3aWxsY294QGdub21lLm9yZz4KKworCSogYnVzL2RyaXZlci5jOiAoYnVzX2RyaXZlcl9oYW5kbGVfb3duX3NlcnZpY2UpOgorCUFjdHVhbGx5IGluY2x1ZGUgdGhlIHNlcnZpY2UgcmVwbHkgY29kZSBpbiB0aGUgbWVzc2FnZS4KKworMjAwMy0wMi0wMiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9kcml2ZXIuYzogKGJ1c19kcml2ZXJfaGFuZGxlX3NlcnZpY2VfZXhpc3RzKToKKwlEb24ndCB1bnJlZiB0aGUgaW5jb21pbmcgbWVzc2FnZS4KKworMjAwMy0wMi0wMiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy5oOiBBZGQgZGJ1cy1hZGRyZXNzLmggYW5kIGRidXMtYnVzLmgKKworMjAwMy0wMi0wMiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYzogKGRidXNfc2VydmVyX2xpc3Rlbik6CisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmM6IChfZGJ1c190cmFuc3BvcnRfb3Blbik6CisJaWZkZWYgb3V0IHRoZSBjYWxscyB0byB0aGUgZGVidWcgdHJhbnNwb3J0IGFuZCBzZXJ2ZXIuCisKKzIwMDMtMDItMDIgIEFsZXhhbmRlciBMYXJzc29uICA8YWxleGxAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXdhdGNoLmMgKGRidXNfd2F0Y2hfZ2V0X2ZsYWdzKToKKwlBZGQgbm90ZSBpbiB0aGUgZG9jcyB0aGF0IEVSUk9SIG9yIEhBTkdVUCB3b24ndCBiZSByZXR1cm5lZAorCWFuZCBhcmUgYXNzdW1lZCBhbHdheXMgb24uCisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jIChhZGRfd2F0Y2gpOgorCUFsd2F5cyBhZGQgSU9fRVJSIHwgSU9fSFVQCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6CisJQWRkIHNlbWljb2xvbiBhZnRlciBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfc3RyaW5nX2FycmF5KCkuCisJTWFrZXMgcXQgY29kZSBidWlsZCBhZ2FpbgorCisyMDAzLTAyLTAxICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogYnVzL2RyaXZlci5jOiAoY3JlYXRlX3VuaXF1ZV9jbGllbnRfbmFtZSksCisJKGJ1c19kcml2ZXJfaGFuZGxlX2hlbGxvKToKKwlEb24ndCB0YWtlIGEgbmFtZSwganVzdCB1c2UgYSBudW1lcmljIGlkIHRvIGlkZW50aWZ5CisJZWFjaCBjbGllbnQuCisKKwkqIGRidXMvTWFrZWZpbGUuYW06CisJKiBkYnVzL2RidXMtYnVzLmM6IChkYnVzX2J1c19yZWdpc3Rlcl9jbGllbnQpLAorCShkYnVzX2J1c19hY3F1aXJlX3NlcnZpY2UpLCAoZGJ1c19idXNfc2VydmljZV9leGlzdHMpOgorCSogZGJ1cy9kYnVzLWJ1cy5oOgorCUFkZCBuZXcgY29udmVuaWVuY2UgZnVuY3Rpb25zIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIGJ1cy4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDoKKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6CisJRml4IGEgdHlwby4KKworMjAwMy0wMi0wMSAgQWxleGFuZGVyIExhcnNzb24gIDxhbGV4bEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfYXBwZW5kX2ZpZWxkcyk6CisJQWRkIHNvbWUgbW9yZSBkb2MgY29tbWVudHMuCisKKzIwMDMtMDItMDEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1icmVhay1sb2FkZXIuYyAocmFuZG9tbHlfbW9kaWZ5X2xlbmd0aCk6IGNoYW5nZQorCWEgNC1ieXRlIHZhbHVlIGluIHRoZSBtZXNzYWdlIGFzIGlmIGl0IHdlcmUgYSBsZW5ndGgKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfc3RyaW5nX3NhdmVfdG9fZmlsZSk6IGRvbid0IHNldAorCWV4ZWN1dGUgYml0IG9uIHNhdmVkIGZpbGVzCisKKzIwMDMtMDItMDEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1icmVhay1sb2FkZXIuYyAobWFpbik6IG5ldyBwcm9ncmFtIHRvIGZpbmQgbWVzc2FnZXMKKwl0aGF0IGJyZWFrIHRoZSBsb2FkZXIuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3N0cmluZ19hcHBlbmRfdWludCk6IG5ldyBmdW5jdGlvbgorCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfc3RyaW5nX3NhdmVfdG9fZmlsZSk6IG5ldyBmdW5jdGlvbgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19zZXRfYnl0ZSk6IG5ldworCisyMDAzLTAxLTMxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiByZWZhY3RvciB0aGUgdGVzdCBjb2RlIHRvIGJlIG1vcmUgZ2VuZXJhbCwKKwlpbiBwcmVwYXJhdGlvbiBmb3Igd3JpdGluZyBhICJyYW5kb21seSBwZXJtdXRlIHRlc3QgY2FzZXMgdG8KKwl0cnkgdG8gYnJlYWsgdGhlIGxvYWRlciIgcHJvZ3JhbS4KKworMjAwMy0wMS0zMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOiB3b3JrIG9uIHRoZSBzcGVjaWZpY2F0aW9uCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIpOiBjaGVjaworCXRoZSBwcm90b2NvbCB2ZXJzaW9uIG9mIHRoZSBtZXNzYWdlLgorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaDogZHJvcCBzcGVjaWFsIF9SRVBMWSBuYW1lcywgdGhlIHNwZWMKKwlubyBsb25nZXIgc3BlY2lmaWVzIHRoYXQuCisJKERCVVNfU0VSVklDRV9SRVBMWV9TRVJWSUNFX0VYSVNUUyk6IGZpeCBmbGFncyAoMS8yLzQvOCBub3QKKwkxLzIvMy80KQorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jIChfZGJ1c19tYXJzaGFsX2dldF9hcmdfZW5kX3Bvcyk6IGFkZCBtaXNzaW5nCisJImJyZWFrIiBmb3IgREJVU19UWVBFX05JTCwgcmVtb3ZlIEB0b2RvCisKKzIwMDMtMDEtMzEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9zZXRfaXNfZXJyb3JfcmVwbHkpOiByZW5hbWUKKwlqdXN0IHNldF9pc19lcnJvci9nZXRfaXNfZXJyb3IgYXMgdGhpcyBpcyBhIGNvbW1vbmx5LXVzZWQKKwlmdW5jdGlvbiwgYW5kIHdyaXRlIGRvY3MuCisKKzIwMDMtMDEtMzEgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtYWRkcmVzcy5jOiAoZGJ1c19hZGRyZXNzX2VudHJ5X2ZyZWUpOgorCUZyZWUga2V5IGFuZCB2YWx1ZSBsaXN0cy4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jOiAoX2RidXNfdHlwZV90b19zdHJpbmcpOgorCUFkZCB0aGUgdHlwZXMgd2UgZGlkbid0IGhhdmUuCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmM6IChfZGJ1c19tYXJzaGFsX2dldF9hcmdfZW5kX3BvcyksCisJKF9kYnVzX21hcnNoYWxfdmFsaWRhdGVfYXJnKToKKwlBZGQgTklMIHR5cGVzLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoZGJ1c19tZXNzYWdlX3NldF9zZW5kZXIpOgorCVJlbW92ZSB0b2RvIGFib3V0IGJlaW5nIGFibGUgdG8gc2V0IHNlbmRlciB0byBOVUxMLgorCisJKGRidXNfbWVzc2FnZV9zZXRfaXNfZXJyb3JfcmVwbHkpLAorCShkYnVzX21lc3NhZ2VfZ2V0X2lzX2Vycm9yX3JlcGx5KToKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6CisJTmV3IGZ1bmN0aW9ucy4KKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6CisJQWRkIGVycm9yIHJlcGx5IGZsYWcuCisKKwkqIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9vcHBvc2l0ZS1lbmRpYW4ubWVzc2FnZToKKwlBZGQgTklMIHR5cGUgdG8gdGVzdC4KKworMjAwMy0wMS0zMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOiBmdWxseSBzcGVjaWZ5IHRoZSBoZWFkZXIuICBBZGQKKwlmbGFncyBhbmQgbWFqb3IgcHJvdG9jb2wgdmVyc2lvbiwgYW5kIGNoYW5nZSBoZWFkZXIvYm9keSBsZW4gdG8KKwl1bnNpZ25lZC4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtYnVpbGRlci5jIChhcHBlbmRfc2F2ZWRfbGVuZ3RoKTogYXBwZW5kIGxlbmd0aAorCWFzIHVpbnQzMgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfY3JlYXRlX2hlYWRlcik6IGNoYW5nZSBoZWFkZXIKKwlsZW5ndGggYW5kIGJvZHkgbGVuZ3RoIHRvIHVuc2lnbmVkLiBBZGQgdGhlIG5ldyBmaWVsZHMgZnJvbSB0aGUKKwlzcGVjCisJKF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIpOiB1bnNpZ25lZCBoZWFkZXIvYm9keSBsZW4KKworMjAwMy0wMS0zMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLWF1dGguYzogcmV3b3JrIHRvIHVzZSBvbmx5IFJFSkVDVEVELCBubworCU1FQ0hBTklTTVMKKworCSogZG9jL2RidXMtc2FzbC1wcm9maWxlLnR4dDogZHJvcCBNRUNIQU5JU01TIGFuZCBqdXN0CisJdXNlIFJFSkVDVEVELCBzdWdnZXN0ZWQgYnkgTWFyayBNY0xvdWdobGluCisKKzIwMDMtMDEtMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYyAoZGJ1c19zZXJ2ZXJfbGlzdGVuKTogQHRvZG8gYWJvdXQgaG93IHdlIG5lZWQKKwlhIGJldHRlciB3YXkgdG8gcmVwb3J0IGVycm9ycyBoZXJlLiBlLmcuICAidW5peCBhZGRyZXNzIGxhY2tzCisJcGF0aCIgb3Igc29tZXRoaW5nLiBhbHNvICJubyBzdWNoIGZpbGUiIHdoZW4gdGhlIHBhdGggZG9lc24ndAorCWV4aXN0LCBldGMuCisKKwkqIGRidXMvZGJ1cy1hZGRyZXNzLmMgKGRidXNfYWRkcmVzc19lbnRyaWVzX2ZyZWUpOiBhZGQgQHRvZG8gYWJvdXQKKwlsZWFraW5nIGxpc3Qgbm9kZXMKKwkoZGJ1c19wYXJzZV9hZGRyZXNzKTogYWRkIEB0b2RvIGFib3V0IGRvY3VtZW50aW5nIGFkZHJlc3MgZm9ybWF0LAorCWFuZCBhbGxvd2luZyAsIGFuZCA7IHRvIGJlIGVzY2FwZWQKKworMjAwMy0wMS0zMCAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvTWFrZWZpbGUuYW06CisJQWRkIGRidXMtYWRkcmVzcy5bY2hdCisKKwkqIGRidXMvZGJ1cy1hZGRyZXNzLmM6IChkYnVzX2FkZHJlc3NfZW50cnlfZnJlZSksCisJKGRidXNfYWRkcmVzc19lbnRyaWVzX2ZyZWUpLCAoY3JlYXRlX2VudHJ5KSwKKwkoZGJ1c19hZGRyZXNzX2VudHJ5X2dldF9tZXRob2QpLCAoZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSksCisJKGRidXNfcGFyc2VfYWRkcmVzcyksIChfZGJ1c19hZGRyZXNzX3Rlc3QpOgorCSogZGJ1cy9kYnVzLWFkZHJlc3MuaDoKKwlOZXcgZmlsZXMgZm9yIGRlYWxpbmcgd2l0aCBhZGRyZXNzIHBhcnNpbmcuCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6CisJRG9jdW1lbnQgdGltZW91dCBmdW5jdGlvbnMuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6CisJRG9jdW1lbnQgZGJ1c19tZXNzYWdlX25ld19mcm9tX21lc3NhZ2UuCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItZGVidWcuYzoKKwlEb2N1bWVudC4KKworCSogZGJ1cy9kYnVzLXNlcnZlci5jOiAoZGJ1c19zZXJ2ZXJfbGlzdGVuKToKKwlQYXJzZSBhZGRyZXNzIGFuZCB1c2UgY29ycmVjdCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24uCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYzogKF9kYnVzX3N0cmluZ19maW5kX3RvKSwgKF9kYnVzX3N0cmluZ190ZXN0KToKKwkqIGRidXMvZGJ1cy1zdHJpbmcuaDoKKwlOZXcgZnVuY3Rpb24gd2l0aCB0ZXN0LgorCisJKiBkYnVzL2RidXMtdGVzdC5jOiAoZGJ1c19pbnRlcm5hbF9zeW1ib2xfZG9fbm90X3VzZV9ydW5fdGVzdHMpOgorCSogZGJ1cy9kYnVzLXRlc3QuaDoKKwlBZGQgYWRkcmVzcyB0ZXN0cy4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC1kZWJ1Zy5jOgorCURvY3VtZW50LgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmM6IChfZGJ1c190cmFuc3BvcnRfb3Blbik6CisJUGFyc2UgYWRkcmVzcyBhbmQgdXNlIGNvcnJlY3QgdHJhbnNwb3J0IGltcGxlbWVudGF0aW9uLgorCisyMDAzLTAxLTMwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiB1c2UgbWVzc2FnZS0+Ynl0ZV9vcmRlciBpbnN0ZWFkIG9mCisJREJVU19DT01QSUxFUl9CWVRFX09SREVSIHRocm91Z2hvdXQuCisJKGRidXNfbWVzc2FnZV9jcmVhdGVfaGVhZGVyKTogcGFkIGhlYWRlciB0byBhbGlnbiB0aGUKKwlzdGFydCBvZiB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZSB0byA4LWJ5dGUgYm91bmRhcnkKKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuaDogbWFrZSBhbGwgdGhlIGRlbWFyc2hhbGVycyB0YWtlIGNvbnN0CisJREJ1c1N0cmluZyBhcmd1bWVudHMuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIpOgorCXZhbGlkYXRlIG1lc3NhZ2UgYXJncyBoZXJlLCBzbyB3ZSBkb24ndCBoYXZlIHRvIGRvIHNsb3cgdmFsaWRhdGlvbgorCWxhdGVyLCBhbmQgc28gd2UgY2F0Y2ggYmFkIG1lc3NhZ2VzIGFzIHRoZXkgYXJlIGluY29taW5nLiBBbHNvIGFkZAorCWJldHRlciBjaGVja3Mgb24gaGVhZGVyX2xlbiBhbmQgYm9keV9sZW4uIEFsc28gZmlsbCBpbgorCW1lc3NhZ2UtPmJ5dGVfb3JkZXIKKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfdmFsaWRhdGVfdXRmOCk6IG5ldyAobm90CisJaW1wbGVtZW50ZWQgcHJvcGVybHkpCisJKF9kYnVzX3N0cmluZ192YWxpZGF0ZV9udWwpOiBuZXcgZnVuY3Rpb24gdG8gY2hlY2sgYWxsLW51bAorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jIChfZGJ1c19tYXJzaGFsX2dldF9maWVsZF9lbmRfcG9zKTogcmVuYW1lCisJZ2V0X2FyZ19lbmRfcG9zIGFuZCByZW1vdmUgYWxsIHZhbGlkYXRpb24KKwkoX2RidXNfbWFyc2hhbF92YWxpZGF0ZV9hcmcpOiBhY3R1YWxseSBkbyB2YWxpZGF0aW9uIGhlcmUuCisKKzIwMDMtMDEtMjkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGNoZWNrX21lc3NhZ2VfaGFuZGxpbmcpOiBmaXggYXNzZXJ0aW9uCisJZmFpbHVyZSBvbiBzZXRfY2xpZW50X3NlcmlhbAorCisyMDAzLTAxLTI4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtc2VydmVyLWRlYnVnLmM6IEFkZCBkb2Mgc2VjdGlvbiBjb21tZW50cworCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LWRlYnVnLmM6IGFkZCBkb2Mgc2VjdGlvbiBjb21tZW50cworCisyMDAzLTAxLTI4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfYmFzZTY0X2RlY29kZSk6IGFwcGVuZCBieXRlcyBpbgorCXRoZSByZXZlcnNlIG9yZGVyIGZyb20gaG93IEkgaGFkIGl0CisJKF9kYnVzX3N0cmluZ19iYXNlNjRfZW5jb2RlKTogcmV2ZXJzZSBlbmNvZGluZyBvcmRlci4gSSB3YXMKKwliYXNpY2FsbHkgYnl0ZXN3YXBwaW5nIGV2ZXJ5dGhpbmcgZHVyaW5nIGVuY29kaW5nLgorCisyMDAzLTAxLTI4ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaDoKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IChfZGJ1c19jb25uZWN0aW9uX2FkZF90aW1lb3V0KSwKKwkoX2RidXNfY29ubmVjdGlvbl9yZW1vdmVfdGltZW91dCk6CisJQWRkIGZ1bmN0aW9ucyBmb3IgYWRkaW5nIGFuZCByZW1vdmluZyB0aW1lb3V0cy4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRidXNfbWVzc2FnZV9uZXdfZnJvbV9tZXNzYWdlKToKKwlBZGQgbmV3IGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBtZXNzYWdlIGFuZCBjcmVhdGVzIGFuIGV4YWN0CisJY29weSBvZiBpdCwgYnV0IHdpdGggdGhlIHJlZmNvdW50IHNldCB0byAxLgorCShjaGVja19tZXNzYWdlX2hhbmRsaW5nKToKKwlGaXggYnVpbGQgZXJyb3IuCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItcHJvdGVjdGVkLmg6CisJKiBkYnVzL2RidXMtc2VydmVyLmM6IChfZGJ1c19zZXJ2ZXJfaW5pdF9iYXNlKSwKKwkoX2RidXNfc2VydmVyX2ZpbmFsaXplX2Jhc2UpLCAoX2RidXNfc2VydmVyX2FkZF90aW1lb3V0KSwKKwkoZGJ1c19zZXJ2ZXJfc2V0X3RpbWVvdXRfZnVuY3Rpb25zKToKKwkoX2RidXNfc2VydmVyX3JlbW92ZV90aW1lb3V0KToKKwlOZXcgZnVuY3Rpb25zIHNvIHRoYXQgYSBzZXJ2ZXIgY2FuIGFkZCBhbmQgcmVtb3ZlIHRpbWVvdXRzLgorCisJKGRidXNfc2VydmVyX2xpc3Rlbik6CisJQWRkIGNvbW1lbnRlZCBvdXQgY2FsbCB0byBkYnVzX3NlcnZlcl9kZWJ1Z19uZXcuCisKKwkqIGRidXMvZGJ1cy10aW1lb3V0LmM6IChfZGJ1c190aW1lb3V0X25ldyk6CisJQWN0dWFsbHkgc2V0IHRoZSBoYW5kbGVyLCBkb2guCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYzogKF9kYnVzX3RyYW5zcG9ydF9vcGVuKToKKwlBZGQgY29tbWVudGVkIG91dCBjYWxsIHRvIGRidXNfdHJhbnNwb3J0X2RlYnVnX2NsaWVudF9uZXcuCisKKwkqIGRidXMvTWFrZWZpbGUuYW06CisJQWRkIGRidXMtdHJhbnNwb3J0LWRlYnVnLltjaF0gYW5kIGRidXMtc2VydmVyLWRlYnVnLltjaF0KKworMjAwMy0wMS0yOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoY2hlY2tfbWVzc2FnZV9oYW5kbGluZyk6IGZ1bmN0aW9uIHRvIGNoZWNrCisJb24gdGhlIGxvYWRlZCBtZXNzYWdlLCBpdGVyYXRlcyBvdmVyIGl0IGV0Yy4KKworMjAwMy0wMS0yOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogdGVzdC9NYWtlZmlsZS5hbSAoZGlzdC1ob29rKTogZml4IG1ha2UgZGlzdGRpcgorCisJKiBkYnVzL01ha2VmaWxlLmFtIChURVNUU19FTlZJUk9OTUVOVCk6IGZpeCBtYWtlIGNoZWNrCisKKzIwMDMtMDEtMjcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZW1wb29sLmMgKHRpbWVfZm9yX3NpemUpOiByZXBsYWNlIHByaW50ZiB3aXRoCisJX2RidXNfdmVyYm9zZQorCisJKiBkYnVzL2RidXMtbWVzc2FnZS1idWlsZGVyLmMgKF9kYnVzX21lc3NhZ2VfZGF0YV9sb2FkKTogYWxsb3cKKwllbXB0eSBsaW5lczsgZml4IHRoZSBTQVZFX0xFTkdUSCBzdHVmZiB0byBiZQorCVNUQVJUX0xFTkdUSC9FTkRfTEVOR1RIIHNvIGl0IGFjdHVhbGx5IHdvcmtzOyBjb3VwbGUgb3RoZXIKKwlidWdmaXhlcworCisJKiB0ZXN0L01ha2VmaWxlLmFtIChkaXN0LWhvb2spOiBhZGQgZGlzdC1ob29rIGZvciAubWVzc2FnZSBmaWxlcworCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKERCVVNfU1RSSU5HX0NPUFlfUFJFQU1CTEUpOiBzb3VyY2Ugb2YgYSBjb3B5CisJY2FuIGJlIGNvbnN0YW50IG9yIGxvY2tlZC4KKwkoX2RidXNfc3RyaW5nX2ZyZWUpOiBhbGxvdyBmcmVlaW5nIGEgY29uc3Qgc3RyaW5nIGFzCisJZG9jdW1lbnRlZC9pbnRlbmRlZAorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlKTogdXRpbGl0eQorCisJKiBkYnVzL2RidXMtdGVzdC1tYWluLmMgKG1haW4pOiB0YWtlIGFuIGFyZ3VtZW50IHdoaWNoIGlzIHRoZQorCWRpcmVjdG9yeSBjb250YWluaW5nIHRlc3QgZGF0YQorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChfZGJ1c19tZXNzYWdlX3Rlc3QpOiBwYXNzIGEgdGVzdF9kYXRhX2RpcgorCWFyZ3VtZW50IHRvIHRoaXMgYW5kIGxvYWQgYWxsIHRoZSBtZXNzYWdlcyBpbiB0ZXN0L2RhdGEvCisJY2hlY2tpbmcgdGhhdCB0aGV5IGNhbiBiZSBsb2FkZWQgb3Igbm90IGxvYWRlZCBhcyBhcHByb3ByaWF0ZS4KKworMjAwMy0wMS0yNyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9kaXNwYXRjaC5jOiAoYnVzX2Rpc3BhdGNoX21lc3NhZ2VfaGFuZGxlcik6CisJRGlzcGF0Y2ggbWVzc2FnZXMgc2VudCB0byBzZXJ2aWNlcy4KKworCSogYnVzL2RyaXZlci5jOiAoYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfZGVsZXRlZCksCisJKGJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2NyZWF0ZWQpLCAoYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfbG9zdCksCisJKGJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2FjcXVpcmVkKToKKwlBZGQgaGVscGVyIGZ1bmN0aW9ucyBmb3Igc2VuZGluZyBzZXJ2aWNlIHJlbGF0ZWQgbWVzc2FnZXMuCisKKwkoYnVzX2RyaXZlcl9zZW5kX3dlbGNvbWVfbWVzc2FnZSk6CisJU2VuZCBIRUxMT19SRVBMWSBpbnN0ZWFkIG9mIFdFTENPTUUuCisKKwkoYnVzX2RyaXZlcl9oYW5kbGVfbGlzdF9zZXJ2aWNlcyk6CisJU2VuZCBMSVNUX1NFUlZJQ0VTX1JFUExZIGluc3RlYWQgb2YgU0VSVklDRVMuCisKKwkoYnVzX2RyaXZlcl9oYW5kbGVfb3duX3NlcnZpY2UpLAorCShidXNfZHJpdmVyX2hhbmRsZV9zZXJ2aWNlX2V4aXN0cyk6CisJTmV3IG1lc3NhZ2UgaGFuZGxlcnMuCisKKwkoYnVzX2RyaXZlcl9oYW5kbGVfbWVzc2FnZSk6CisJSW52b2tlIG5ldyBtZXNzYWdlIGhhbmRsZXJzLgorCisJKGJ1c19kcml2ZXJfcmVtb3ZlX2Nvbm5lY3Rpb24pOgorCURvbid0IHJlbW92ZSBhbnkgc2VydmljZXMgaGVyZSBzaW5jZSB0aGF0J3MgZG9uZSBhdXRvbWF0aWNhbGx5CisJYnkgYnVzX3NlcnZpY2VfcmVtb3ZlX293bmVyIG5vdy4KKworCSogYnVzL2RyaXZlci5oOgorCU5ldyBmdW5jdGlvbiBzaWduYXR1cmVzLgorCisJKiBidXMvc2VydmljZXMuYzogKGJ1c19zZXJ2aWNlX2FkZF9vd25lcik6CisJU2VuZCBTZXJ2aWNlQWNxdWlyZWQgbWVzc2FnZSBpZiB3ZSdyZSB0aGUgb25seSBwcmltYXJ5IG93bmVyLgorCisJKGJ1c19zZXJ2aWNlX3JlbW92ZV9vd25lcik6CisJU2VuZCBTZXJ2aWNlQWNxdWlyZWQvU2VydmljZUxvc3QgbWVzc2FnZXMuCisKKwkoYnVzX3NlcnZpY2Vfc2V0X3Byb2hpYml0X3JlcGxhY2VtZW50KSwKKwkoYnVzX3NlcnZpY2VfZ2V0X3Byb2hpYml0X3JlcGxhY2VtZW50KToKKwlGdW5jdGlvbnMgZm9yIHNldHRpbmcgcHJvaGliaXQgcmVwbGFjZW1lbnQuCisKKwkoYnVzX3NlcnZpY2VfaGFzX293bmVyKToKKwlOZXcgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgYSBjb25uZWN0aW9uIGlzIGluIHRoZSBvd25lciBxdWV1ZSBvZgorCWEgY2VydGFpbiBzZXJ2aWNlLgorCisJKiBidXMvc2VydmljZXMuaDoKKwlBZGQgbmV3IGZ1bmN0aW9uIHNpZ25hdHVyZXMuCisKKwkqIGRidXMvZGJ1cy1saXN0LmM6IChfZGJ1c19saXN0X3Rlc3QpOgorCUFkZCB0ZXN0cyBmb3IgX2RidXNfbGlzdF9yZW1vdmVfbGFzdCBhbmQgdHJhdmVyc2luZyB0aGUgbGlzdCBiYWNrd2FyZHMuCisKKwkqIGRidXMvZGJ1cy1saXN0Lmg6CisJRml4IGEgdHlwbyBpbiBfZGJ1c19saXN0X2dldF9wcmV2X2xpbmssIGlmIHdlJ3JlIGF0IHRoZSBmaXJzdCBlbGVtZW50IHdlIGNhbid0CisJZ28gYW55IGZ1cnRoZXIsIHNvIHJldHVybiBOVUxMIHRoZW4uCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOgorCUFkZCBuZXcgbWVzc2FnZXMsIHNlcnZpY2UgZmxhZ3MgYW5kIHNlcnZpY2UgcmVwbGllcy4KKworMjAwMy0wMS0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtYnVpbGRlci5jOiBpbXBsZW1lbnQsIGNvbXBsZXRlbHkgdW50ZXN0ZWQuCisKKwkqIHRlc3QvZGF0YS8qOiBhZGQgZGF0YSB0byBiZSB1c2VkIGluIHRlc3RpbmcuCisJIi5tZXNzYWdlIiBmaWxlcyBhcmUgb3VyIHNpbXBsZSBsb2FkYWJsZSB0ZXh0IGZvcm1hdC4KKwkiLm1lc3NhZ2UtcmF3IiB3aWxsIGJlIGJpbmFyeSBkdW1wcyBvZiBtZXNzYWdlcy4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIpOiBuZXcKKworMjAwMy0wMS0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfZmlsZV9nZXRfY29udGVudHMpOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLWVycm9ycy5jIChkYnVzX3Jlc3VsdF90b19zdHJpbmcpOiBhZGQKKwlmaWxlIGVycm9ycworCisJKiBkYnVzL2RidXMtbWVzc2FnZS1idWlsZGVyLmM6IG5ldyBmaWxlLCB3aWxsIGNvbnRhaW4gY29kZSB0byBsb2FkCisJdXAgbWVzc2FnZXMgZnJvbSBmaWxlcy4gTm90IGltcGxlbWVudGVkIHlldC4KKworMjAwMy0wMS0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX3NldF9zZW5kZXIpOiBzdXBwb3J0IGRlbGV0aW5nCisJdGhlIHNlbmRlciBieSBzZXR0aW5nIHRvIE5VTEwKKworMjAwMy0wMS0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworICAgICAgICBUaGUgdW5pdCB0ZXN0cyBwYXNzLCBidXQgb3RoZXJ3aXNlIHVudGVzdGVkLiAgSWYgaXQgYnJlYWtzLCB0aGUKKwl0ZXN0cyBzaG91bGQgaGF2ZSBiZWVuIGJldHRlci4gOy0pCisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfaGVsbG8pOiByZXR1cm4gaWYgd2UgZGlzY29ubmVjdAorCXRoZSBjb25uZWN0aW9uLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiByZWRvIGV2ZXJ5dGhpbmcgc28gd2UgbWFpbnRhaW4KKwltZXNzYWdlLT5oZWFkZXIgYXMgdGhlIG9ubHkgY29weSBvZiB0aGUgdmFyaW91cyBmaWVsZHMuCisJVGhpcyBhdm9pZHMgdGhlIHBvc3NpYmlsaXR5IG9mIG91dC1vZi1tZW1vcnkgaW4gc29tZSBjYXNlcywKKwlmb3IgZXhhbXBsZSBkYnVzX21lc3NhZ2VfbG9jaygpIGNhbid0IHJ1biBvdXQgb2YgbWVtb3J5IGFueW1vcmUsCisJYW5kIGF2b2lkcyBleHRyYSBjb3B5aW5nLiBGaWd1cmVkIEkgbWF5IGFzIHdlbGwgZ28gYWhlYWQgYW5kIGRvCisJdGhpcyBzaW5jZSBpdCB3YXMgYnVzdGVkIGZvciBkYnVzX21lc3NhZ2VfbG9jayB0byBub3QgcmV0dXJuCisJZmFpbHVyZSBvbiBPT00sIGFuZCBkYnVzX21lc3NhZ2Vfd3JpdGVfaGVhZGVyIHdhcyB0b3RhbGx5CisJdW5jaGVja2VkIGZvciBPT00uIEFsc28gZml4ZWQgc29tZSByYW5kb20gb3RoZXIgYnVncy4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYyAoX2RidXNfbWFyc2hhbF9nZXRfZmllbGRfZW5kX3Bvcyk6IHZlcmlmeQorCXRoYXQgc3RyaW5ncyBhcmUgbnVsLXRlcm1pbmF0ZWQuIEFsc28sIGVuZF9wb3MgY2FuIGJlIGVxdWFsCisJdG8gc3RyaW5nIGxlbmd0aCBqdXN0IG5vdCBncmVhdGVyIHRoYW4sIEkgdGhpbmsuCisJKF9kYnVzX21hcnNoYWxfc2V0X2ludDMyKTogbmV3IGZ1bmN0aW9uCisJKF9kYnVzX21hcnNoYWxfc2V0X3VpbnQzMik6IG5ldyBmdW5jdGlvbgorCShfZGJ1c19tYXJzaGFsX3NldF9zdHJpbmcpOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoX2RidXNfY29ubmVjdGlvbl9uZXdfZm9yX3RyYW5zcG9ydCk6IGZpeAorCWEgd2FybmluZywgaW5pdCB0aW1lb3V0X2xpc3QgdG8gTlVMTAorCShkYnVzX2Nvbm5lY3Rpb25fc2VuZF9tZXNzYWdlKTogZG9uJ3QgdXNlIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUKKwkic2VyaWFsIgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19yZXBsYWNlX2xlbik6IG5ldyBmdW5jdGlvbgorCisyMDAzLTAxLTI2ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogYnVzL2RyaXZlci5jOiAoYnVzX2RyaXZlcl9oYW5kbGVfaGVsbG8pLAorCShidXNfZHJpdmVyX3NlbmRfd2VsY29tZV9tZXNzYWdlKToKKwlQbHVnIGxlYWtzCisKKzIwMDMtMDEtMjYgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtYXV0aC5jOiAocHJvY2Vzc19hdXRoKSwgKF9kYnVzX2F1dGhfdW5yZWYpOgorCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzogKF9kYnVzX2Nvbm5lY3Rpb25fbmV3X2Zvcl90cmFuc3BvcnQpLAorCShkYnVzX2Nvbm5lY3Rpb25fdW5yZWYpOgorCSogZGJ1cy9kYnVzLW1hcnNoYWwuYzogKF9kYnVzX21hcnNoYWxfdGVzdCk6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoZGJ1c19tZXNzYWdlX3VucmVmKSwKKwlQbHVnIG1lbW9yeSBsZWFrcy4KKworCShkYnVzX21lc3NhZ2VfZ2V0X2ZpZWxkcyk6CisJUmVtb3ZlIGRlYnVnZ2luZyBwcmludG91dC4KKworCShfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyKToKKwlEb24ndCBzdG9yZSB0aGUgaGVhZGVyIHN0cmluZy4KKworCShfZGJ1c19tZXNzYWdlX3Rlc3QpOgorCVBsdWcgbGVha3MuCisKKzIwMDMtMDEtMjYgIFJpY2hhcmQgSHVsdCAgPHJodWx0QGNvZGVmYWN0b3J5LnNlPgorCisJKiBnbGliL2RidXMtZ21haW4uYyAoZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKTogVHJhdmVyc2UgYSBjb3B5IG9mCisJdGhlIGZpbGUgZGVzY3JpcHRvciBsaXN0LCBzaW5jZSBpdCBjYW4gY2hhbmdlIHVuZGVyIHVzLgorCisyMDAzLTAxLTI1ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZ2xpYi9kYnVzLWdtYWluLmM6IChkYnVzX2Nvbm5lY3Rpb25fcHJlcGFyZSksCisJKGRidXNfY29ubmVjdGlvbl9jaGVjayksIChkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2gpLCAoYWRkX3dhdGNoKSwKKwkocmVtb3ZlX3dhdGNoKSwgKGRidXNfY29ubmVjdGlvbl9ob29rdXBfd2l0aF9nX21haW4pOgorCVJld3JpdGUgdGhlIGdsaWIgaGFuZGxpbmcgdG8gdXNlIGl0cyBvd24gR1NvdXJjZSBpbnN0ZWFkIG9mIGEKKwlHSU9DaGFubmVsIHNvIHdlIGNhbiBjYXRjaCBtZXNzYWdlcyBwdXQgaW4gdGhlIHF1ZXVlIHdoaWxlIHdhaXRpbmcKKwlmb3IgYSByZXBseS4KKworMjAwMy0wMS0yNSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9NYWtlZmlsZS5hbToKKwkqIGJ1cy9jb25uZWN0aW9uLmM6IChjb25uZWN0aW9uX2Rpc2Nvbm5lY3RfaGFuZGxlciksCisJKGNvbm5lY3Rpb25fd2F0Y2hfY2FsbGJhY2spLCAoYnVzX2Nvbm5lY3Rpb25fc2V0dXApOgorCSogYnVzL2Rpc3BhdGNoLmM6IChzZW5kX29uZV9tZXNzYWdlKSwKKwkoYnVzX2Rpc3BhdGNoX2Jyb2FkY2FzdF9tZXNzYWdlKSwgKGJ1c19kaXNwYXRjaF9tZXNzYWdlX2hhbmRsZXIpLAorCShidXNfZGlzcGF0Y2hfYWRkX2Nvbm5lY3Rpb24pLCAoYnVzX2Rpc3BhdGNoX3JlbW92ZV9jb25uZWN0aW9uKToKKwkqIGJ1cy9kaXNwYXRjaC5oOgorCSogYnVzL2RyaXZlci5jOiAoYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfZGVsZXRlZCksCisJKGJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2NyZWF0ZWQpLCAoYnVzX2RyaXZlcl9oYW5kbGVfaGVsbG8pLAorCShidXNfZHJpdmVyX3NlbmRfd2VsY29tZV9tZXNzYWdlKSwKKwkoYnVzX2RyaXZlcl9oYW5kbGVfbGlzdF9zZXJ2aWNlcyksIChidXNfZHJpdmVyX3JlbW92ZV9jb25uZWN0aW9uKSwKKwkoYnVzX2RyaXZlcl9oYW5kbGVfbWVzc2FnZSk6CisJKiBidXMvZHJpdmVyLmg6CisJUmVmYWN0b3IgY29kZSwgcHV0IHRoZSBtZXNzYWdlIGRpc3BhdGNoaW5nIGluIGl0cyBvd24gZmlsZS4gVXNlCisJX0RCVVNfSEFORExFX09PTS4gQWxzbyBzZW5kIFNlcnZpY2VEZWxldGVkIG1lc3NhZ2VzIHdoZW4gYSBjbGllbnQKKwlpcyBkaXNjb25uZWN0ZWQuCisKKzIwMDMtMDEtMjUgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmg6CisJQWRkIF9EQlVTX0hBTkRMRV9PT00gbWFjcm8sIGl0IGRvZXNuJ3QgZG8gYW55dGhpbmcgY3VycmVudGx5LgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDoKKwlJbXBsZW1lbnQgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIuCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOgorCUFkZCBtZXNzYWdlIGFuZCBzZXJ2aWNlIGRlZmluZXMuCisKKzIwMDMtMDEtMjUgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiAoZGJ1c19jb25uZWN0aW9uX3NlbmRfbWVzc2FnZSk6CisJKiBkYnVzL2RidXMtbWVzc2FnZS1pbnRlcm5hbC5oOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKF9kYnVzX21lc3NhZ2VfZ2V0X2NsaWVudF9zZXJpYWwpLAorCShkYnVzX21lc3NhZ2Vfd3JpdGVfaGVhZGVyKToKKwlSZW1vdmUgX2RidXNfbWVzc2FnX3VubG9jayBhbmQgZG9uJ3Qgc2V0IHRoZSBjbGllbnQgc2VyaWFsIG9uIGEKKwltZXNzYWdlIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KKworMjAwMy0wMS0yNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLWxpc3QuYyAoYWxsb2NfbGluayk6IHB1dCBhIHRocmVhZCBsb2NrIG9uIHRoZSBnbG9iYWwKKwlsaXN0X3Bvb2wKKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2hhbmRsZV9saXN0X3NlcnZpY2VzKTogZml4IGEgbGVhaworCW9uIE9PTQorCisyMDAzLTAxLTI1ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLWxpc3QuYzogKGFsbG9jX2xpbmspLCAoZnJlZV9saW5rKToKKwlVc2UgYSBtZW1vcnkgcG9vbCBmb3IgdGhlIGxpbmtzLgorCisyMDAzLTAxLTI1ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogYnVzL2Nvbm5lY3Rpb24uYzogKGJ1c19jb25uZWN0aW9uX2ZvcmVhY2gpOgorCSogYnVzL2Nvbm5lY3Rpb24uaDoKKwlBZGQgbmV3IGJ1c19jb25uZWN0aW9uX2ZvcmVhY2ggZnVuY3Rpb24uCisKKwkqIGJ1cy9kcml2ZXIuYzogKHNlbmRfb25lX21lc3NhZ2UpLCAoYnVzX2RyaXZlcl9icm9hZGNhc3RfbWVzc2FnZSk6CisJQWRkIGZ1bmN0aW9uIHRoYXQgYnJvYWRjYXN0cyBhIG1lc3NhZ2UgdG8gYWxsIGNsaWVudHMuCisKKwkoYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfY3JlYXRlZCksIChidXNfZHJpdmVyX2hhbmRsZV9oZWxsbyksCisJKGJ1c19kcml2ZXJfc2VuZF93ZWxjb21lX21lc3NhZ2UpLAorCShidXNfZHJpdmVyX2hhbmRsZV9saXN0X3NlcnZpY2VzKSwgKGJ1c19kcml2ZXJfbWVzc2FnZV9oYW5kbGVyKToKKwlJbXBsZW1lbnQgZnVuY3Rpb25zIHRoYXQgdGFrZSBjYXJlIG9mIGxpc3Rpbmcgc2VydmljZXMsIGFuZCBub3RpZnlpbmcKKwljbGllbnRzIHdoZW4gbmV3IHNlcnZpY2VzIGFyZSBjcmVhdGVkLgorCisJKiBidXMvc2VydmljZXMuYzogKGJ1c19zZXJ2aWNlc19saXN0KToKKwkqIGJ1cy9zZXJ2aWNlcy5oOgorCUFkZCBuZXcgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIGFycmF5IG9mIHN0cmluZ3Mgd2l0aCB0aGUgY3VycmVudGx5CisJcmVnaXN0ZXJlZCBzZXJ2aWNlcy4KKworCSogZ2xpYi9kYnVzLWdsaWIuaDoKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jOgorCVVwZGF0ZSBjb3B5cmlnaHQgeWVhci4KKworMjAwMy0wMS0yNSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IChkYnVzX2Nvbm5lY3Rpb25fc2VuZF9tZXNzYWdlKToKKwlVbmxvY2sgdGhlIG1lc3NhZ2UgaW4gY2FzZSBpdCB3YXMgc2VudCBlYXJsaWVyLgorCisJKGRidXNfY29ubmVjdGlvbl9zZW5kX21lc3NhZ2Vfd2l0aF9yZXBseV9hbmRfYmxvY2spOgorCVJlbW92ZSB0aGUgcmVwbHkgbWVzc2FnZSBmcm9tIHRoZSBsaXN0LgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiAoX2RidXNfZGVtYXJzaGFsX3N0cmluZ19hcnJheSk6CisJU2V0IGFycmF5X2xlbiBhbmQgbmV3X3BvcyBjb3JyZWN0bHkuCisKKwkoX2RidXNfbWFyc2hhbF90ZXN0KToKKwlSZW1vdmUgZGVidWcgb3V0cHV0LgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS1pbnRlcm5hbC5oOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKF9kYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCk6CisJTmV3IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgcmVwbHkgc2VyaWFsLgorCisJKF9kYnVzX21lc3NhZ2VfdW5sb2NrKToKKwlOZXcgZnVuY3Rpb24gdGhhdCB1bmxvY2tzIGEgbWVzc2FnZSBhbmQgcmVzZXRzIGl0cyBoZWFkZXIuCisKKwkoZGJ1c19tZXNzYWdlX2FwcGVuZF9zdHJpbmdfYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfZ2V0X2ZpZWxkc192YWxpc3QpLAorCShkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZmllbGRfdHlwZSksCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9zdHJpbmdfYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfZ2V0X2ZpZWxkcyksCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfZmllbGRzX3ZhbGlzdCk6CisJSGFuZGxlIHN0cmluZyBhcnJheXMuCisKKwkoZGJ1c19tZXNzYWdlX3NldF9zZW5kZXIpOgorCU1ha2UgdGhpcyBmdW5jdGlvbiBwdWJsaWMgc2luY2UgdGhlIGJ1cyBkYWVtb24gbmVlZHMgaXQuCisKKwkoZGVjb2RlX2hlYWRlcl9kYXRhKToKKwlTZXQgdGhlIHJlcGx5IHNlcmlhbCB0byAtMSBpbml0aWFsbHkuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6CisJQWRkIGRidXNfbWVzc2FnZV9zZXRfc2VuZGVyLgorCisyMDAzLTAxLTI0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6IGFkZCBzb21lIHN0dWZmCisKKzIwMDMtMDEtMjIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDogU3RhcnQgdG8gZG9jdW1lbnQgdGhlIHByb3RvY29sLgorCisyMDAzLTAxLTIyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jCisJKGRidXNfY29ubmVjdGlvbl9zZW5kX21lc3NhZ2Vfd2l0aF9yZXBseV9hbmRfYmxvY2spOiBhZGQgc29tZSBAdG9kbworCisJKiBidXMvZHJpdmVyLmMgKGJ1c19kcml2ZXJfYWRkX2Nvbm5lY3Rpb24pOiBhZGQgYSBGSVhNRSBhYm91dCBtZW1sZWFrCisKKzIwMDMtMDEtMjEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKyAgICAgICAgKHBhdGNoIHVudGVzdGVkIGJlY2F1c2UgY2FuJ3QgY29tcGlsZSkKKworCSogYnVzL2RyaXZlci5jIChjcmVhdGVfdW5pcXVlX2NsaWVudF9uYW1lKTogbWFrZSB0aGlzIGZ1bmN0aW9uCisJbmV2ZXIgcmVjeWNsZSBjbGllbnQgbmFtZXMuIEFsc28sIGNhbGxlciBzaG91bGQgaW5pdGlhbGl6ZQorCXRoZSBEQnVzU3RyaW5nLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19nZXRfY3VycmVudF90aW1lKTogbmV3IGZ1bmN0aW9uCisKKzIwMDMtMDEtMjEgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiAoX2RidXNfbWFyc2hhbF9kb3VibGUpLAorCShfZGJ1c19tYXJzaGFsX2ludDMyKSwgKF9kYnVzX21hcnNoYWxfdWludDMyKSwKKwkoX2RidXNfbWFyc2hhbF9pbnQzMl9hcnJheSksIChfZGJ1c19tYXJzaGFsX3VpbnQzMl9hcnJheSksCisJKF9kYnVzX21hcnNoYWxfZG91YmxlX2FycmF5KSwgKF9kYnVzX21hcnNoYWxfc3RyaW5nX2FycmF5KSwKKwkoX2RidXNfZGVtYXJzaGFsX2ludDMyX2FycmF5KSwgKF9kYnVzX2RlbWFyc2hhbF91aW50MzJfYXJyYXkpLAorCShfZGJ1c19kZW1hcnNoYWxfZG91YmxlX2FycmF5KSwgKF9kYnVzX2RlbWFyc2hhbF9zdHJpbmdfYXJyYXkpLAorCShfZGJ1c19tYXJzaGFsX2dldF9maWVsZF9lbmRfcG9zKSwgKF9kYnVzX21hcnNoYWxfdGVzdCk6CisJKiBkYnVzL2RidXMtbWFyc2hhbC5oOgorCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6CisJQWRkIHN1cHBvcnQgZm9yIG1hcnNoYWxsaW5nIGFuZCBkZW1hcnNoYWxsaW5nIGludGVnZXIsIGRvdWJsZQorCWFuZCBzdHJpbmcgYXJyYXlzLgorCisyMDAzLTAxLTIxICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogYnVzL01ha2VmaWxlLmFtOgorCUFkZCBkcml2ZXIuW2NoXQorCisJKiBidXMvY29ubmVjdGlvbi5jOiAoY29ubmVjdGlvbl9kaXNjb25uZWN0X2hhbmRsZXIpOgorCVJlbW92ZSB0aGUgY29ubmVjdGlvbiBmcm9tIHRoZSBidXMgZHJpdmVyJ3MgbGlzdC4KKworCShjb25uZWN0aW9uX3dhdGNoX2NhbGxiYWNrKTogRGlzcGF0Y2ggbWVzc2FnZXMuCisKKwkoZnJlZV9jb25uZWN0aW9uX2RhdGEpOiBGcmVlIGNvbm5lY3Rpb24gbmFtZS4KKworCShidXNfY29ubmVjdGlvbl9zZXR1cCk6IEFkZCBjb25uZWN0aW9uIHRvIHRoZSBidXMgZHJpdmVyJ3MgbGlzdC4KKwkoYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX293bmVkX3NlcnZpY2UpOgorCShidXNfY29ubmVjdGlvbl9zZXRfbmFtZSksIChidXNfY29ubmVjdGlvbl9nZXRfbmFtZSk6CisJQWRkIGZ1bmN0aW9ucyBmb3Igc2V0dGluZyBhbmQgZ2V0dGluZyB0aGUgY29ubmVjdGlvbidzIG5hbWUuCisKKwkqIGJ1cy9jb25uZWN0aW9uLmg6CisJQWRkIGZ1bmN0aW9uIGhlYWRlcnMuCisKKwkqIGJ1cy9kcml2ZXIuYzogKGNyZWF0ZV91bmlxdWVfY2xpZW50X25hbWUpLAorCShidXNfZHJpdmVyX2hhbmRsZV9oZWxsb19tZXNzYWdlKSwKKwkoYnVzX2RyaXZlcl9zZW5kX3dlbGNvbWVfbWVzc2FnZSksIChidXNfZHJpdmVyX21lc3NhZ2VfaGFuZGxlciksCisJKGJ1c19kcml2ZXJfYWRkX2Nvbm5lY3Rpb24pLCAoYnVzX2RyaXZlcl9yZW1vdmVfY29ubmVjdGlvbik6CisJKiBidXMvZHJpdmVyLmg6CisJKiBidXMvbWFpbi5jOgorCSogYnVzL3NlcnZpY2VzLmM6IChidXNfc2VydmljZV9mcmVlKToKKwkqIGJ1cy9zZXJ2aWNlcy5oOgorCU5ldyBmaWxlIHRoYXQgaGFuZGxlcyBjb21tdW5pY2F0aW9uIGFuZCByZWdpc3RyZWF0aW9uIHdpdGggdGhlIGJ1cworCWl0c2VsZi4KKworMjAwMy0wMS0yMSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IChkYnVzX2Nvbm5lY3Rpb25fc2VuZF9tZXNzYWdlKToKKwlBZGQgYSBuZXcgY2xpZW50X3NlcmlhbCBwYXJhbWV0ZXIuCisKKwkoZGJ1c19jb25uZWN0aW9uX3NlbmRfbWVzc2FnZV93aXRoX3JlcGx5KToKKwlSZW1vdmUgYSBAdG9kbyBzaW5jZSB3ZSd2ZSBpbXBsZW1lbnRlZCB0aGUgYmxvY2tpbmcgZnVuY3Rpb24uCisKKwkoZGJ1c19jb25uZWN0aW9uX3NlbmRfbWVzc2FnZV93aXRoX3JlcGx5X2FuZF9ibG9jayk6CisJTmV3IGZ1bmN0aW9uIHRoYXQgc2VuZHMgYSBtZXNzYWdlIGFuZCB3YWl0cyBmb3IgYSByZXBseSBhbmQKKwl0aGVuIHJldHVybnMgdGhlIHJlcGx5LgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5oOgorCUFkZCBuZXcgZnVuY3Rpb25zLgorCisJKiBkYnVzL2RidXMtZXJyb3JzLmM6IChkYnVzX3Jlc3VsdF90b19zdHJpbmcpOgorCSogZGJ1cy9kYnVzLWVycm9ycy5oOgorCUFkZCBuZXcgREJVU19SRVNVTFQuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWludGVybmFsLmg6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoX2RidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsKSwKKwkoX2RidXNfbWVzc2FnZV9zZXRfc2VuZGVyKSwgKGRidXNfbWVzc2FnZV93cml0ZV9oZWFkZXIpLAorCShkYnVzX21lc3NhZ2VfbmV3X3JlcGx5KSwgKGRlY29kZV9oZWFkZXJfZGF0YSksCisJKF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIpLCAoX2RidXNfbWVzc2FnZV90ZXN0KToKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6CisJQWRkIG5ldyBmdW5jdGlvbnMgdGhhdCBzZXQgdGhlIHJlcGx5IHNlcmlhbCBhbmQgc2VuZGVyLgorCUFsc28gbWFyc2hhbCBhbmQgZGVtYXJzaGFsIHRoZW0gY29ycmVjdGx5IGFuZCBhZGQgdGVzdC4KKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6CisJQWRkIG5ldyBEQlVTX01FU1NBR0VfVFlQRV9TRU5ERVIuCisKKwkqIGdsaWIvZGJ1cy1nbGliLmg6CisJKiBnbGliL2RidXMtZ21haW4uYzogKHdhdGNoX2NhbGxiYWNrKSwgKGZyZWVfY2FsbGJhY2tfZGF0YSksCisJKGFkZF93YXRjaCksIChyZW1vdmVfd2F0Y2gpLCAoYWRkX3RpbWVvdXQpLCAocmVtb3ZlX3RpbWVvdXQpLAorCShkYnVzX2Nvbm5lY3Rpb25faG9va3VwX3dpdGhfZ19tYWluKToKKwkqIGdsaWIvdGVzdC1kYnVzLWdsaWIuYzogKG1haW4pOgorCVJld3JpdGUgdG8gdXNlIEdJT0NoYW5uZWwgYW5kIHJlbW92ZSB0aGUgR1NvdXJjZSBjcmFjay4KKworCSogdGVzdC9lY2hvLWNsaWVudC5jOiAobWFpbik6CisJKiB0ZXN0L3dhdGNoLmM6IChjaGVja19tZXNzYWdlcyk6CisJVXBkYXRlIGZvciBjaGFuZ2VkIEFQSXMKKworMjAwMy0wMS0xOSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvTWFrZWZpbGUuYW06IEFkZCBkYnVzLXRpbWVvdXQuW2PEp10KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzogKF9kYnVzX2Nvbm5lY3Rpb25fbmV3X2Zvcl90cmFuc3BvcnQpOgorCUNyZWF0ZSBhIERCdXNUaW1lb3V0TGlzdC4KKwkoZGJ1c19jb25uZWN0aW9uX3NldF90aW1lb3V0X2Z1bmN0aW9ucyk6IEFkZCBuZXcgZnVuY3Rpb24gdG8KKwlzZXQgdGltZW91dCBjYWxsYmFja3MKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uaDogQWRkIHB1YmxpYyBEQnVzVGltZW91dCBBUEkuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IChkYnVzX21lc3NhZ2VfZ2V0X3NlcnZpY2UpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDoJTmV3IGZ1bmN0aW9uLgorCisJKiBkYnVzL2RidXMtc2VydmVyLmM6IEZpeCBzbWFsbCBkb2MgdHlwby4KKworCSogZGJ1cy9kYnVzLXRpbWVvdXQuW2NoXTogTmV3IGZpbGVzIGZvciBtYWlubG9vcCB0aW1lb3V0cy4KKworMjAwMy0wMS0xOSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX21vdmVfbGVuKTogRG9uJ3QgZGVsZXRlIGFsbAorCW9mIHRoZSBzdHJpbmcsIGp1c3QgYXMgbG9uZyBhcyBzcGVjaWZpZWQuCisKKzIwMDMtMDEtMTkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9nZXRfaXNfYXV0aGVudGljYXRlZCk6CisJbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYyAoZGJ1c19zZXJ2ZXJfc2V0X21heF9jb25uZWN0aW9ucykKKwkoZGJ1c19zZXJ2ZXJfZ2V0X21heF9jb25uZWN0aW9ucywgZGJ1c19zZXJ2ZXJfZ2V0X25fY29ubmVjdGlvbnMpOgorCWtlZXAgdHJhY2sgb2YgY3VycmVudCBudW1iZXIgb2YgY29ubmVjdGlvbnMsIGFuZCBhZGQgQVBJIGZvcgorCXNldHRpbmcgYSBtYXggKGJ1dCBoYXZlbid0IGltcGxlbWVudGVkIGVuZm9yY2luZyB0aGUgbWF4IHlldCkKKworMjAwMy0wMS0xOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMgKHVuaXhfZG9faXRlcmF0aW9uKTogb25seSBkbyB0aGUKKwlyZWFkaW5nL3dyaXRpbmcgaWYgcmVhZF93YXRjaCAhPSBOVUxMIG9yIHdyaXRlX3dhdGNoICE9IE5VTEwuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIpOiBmaXgKKwl0aGUgbWVzc2FnZSBsb2FkZXIgY29kZSB0byBhY3R1YWxseSBsb2FkIG1lc3NhZ2UtPmhlYWRlciBhbmQKKwltZXNzYWdlLT5ib2R5IGludG8gdGhlIG5ld2x5LWNyZWF0ZWQgbWVzc2FnZS4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMgKGNoZWNrX3dyaXRlX3dhdGNoKTogZml4IGEgbWVtIGxlYWsKKwlpbiBPT00gY2FzZQorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9tZXNzYWdlX3NpemUpCisJKGRidXNfY29ubmVjdGlvbl9nZXRfbWF4X21lc3NhZ2Vfc2l6ZSkKKwkoZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfbGl2ZV9tZXNzYWdlc19zaXplKQorCShkYnVzX2Nvbm5lY3Rpb25fZ2V0X21heF9saXZlX21lc3NhZ2VzX3NpemUpOiBpbXBsZW1lbnQgc29tZQorCXJlc291cmNlIGxpbWl0YXRpb24gZnVuY3Rpb25zCisKKwkqIGRidXMvZGJ1cy1yZXNvdXJjZXMuYzogbmV3IGZpbGUgaW1wbGVtZW50aW5nIHNvbWUgb2YgdGhlCisJcmVzb3VyY2UgbGltaXRzIHN0dWZmCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9ieXRlX2FycmF5KTogYWRkCisJbWlzc2luZyBkb2NzLCBhZGQgQHRvZG8gdG8gaGFuZGxlIE9PTSBldGMuCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmMgKF9kYnVzX2RlbWFyc2hhbF9ieXRlX2FycmF5KTogYWRkIG1pc3NpbmcKKwlkb2NzCisKKzIwMDMtMDEtMTggIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl91bnJlZik6IGRpc2Nvbm5lY3QgdGhlCisJY29ubmVjdGlvbiBpZiBpdCBoYXNuJ3QgYmVlbiBhbHJlYWR5LgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5oOiBraWxsIG9mZiB0aGUgaWRlYSBvZiBhbiBFcnJvckZ1bmN0aW9uLAorCXJlcGxhY2Ugd2l0aCBEaXNjb25uZWN0RnVuY3Rpb24uCisKKzIwMDMtMDEtMTggIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKyAgICAgICAgQnVpbGRpbmcgLS1kaXNhYmxlLXZlcmJvc2UtbW9kZSAtLWRpc2FibGUtYXNzZXJ0cyAtLWRpc2FibGUtdGVzdHMKKwljdXRzIHRoZSBsaWJyYXJ5IGZyb20gMTEySyB0byA0NUsgb3Igc28KKworCSogY29uZmlndXJlLmluOiBjaGVjayBmb3IgdmFyYXJncyBtYWNybyBzdXBwb3J0LAorCWFkZCAtLWVuYWJsZS12ZXJib3NlLW1vZGUsIC0tZW5hYmxlLWFzc2VydHMuCisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuaCAoX2RidXNfYXNzZXJ0KTogc3VwcG9ydAorCURCVVNfRElTQUJMRV9BU1NFUlQKKwkoX2RidXNfdmVyYm9zZSk6IHN1cHBvcnQgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisKKzIwMDMtMDEtMTggIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy10ZXN0LmM6IGluY2x1ZGUgY29uZmlnLmggc28gdGhhdCB0ZXN0cyBhY3R1YWxseSBydW4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jOiBhZGQgYXNzZXJ0aW9ucyB0aGF0IHN0dWZmIGlzIDgtYnl0ZSBhbGlnbmVkLAorCXNvIHRoZSBmYWlsdXJlIG1vZGUgd2hlbiB0aGF0IGFzc3VtcHRpb24gZmFpbHMgd2lsbCBiZSBwbGVudHkKKwlvYnZpb3VzLgorCisyMDAzLTAxLTE4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBjb25maWd1cmUuaW46IGRlZmF1bHQgLS1lbmFibGUtdGVzdHMgdG8gJFVTRV9NQUlOVEFJTkVSX01PREUKKworCSogZGJ1cy9NYWtlZmlsZS5hbTogZml4IGl0IHVwIHNvIGR1YnMtdGVzdC1tYWluLmMgaXMgaW5jbHVkZWQgaW4KKwl0aGUgZGlzdHJpYnV0aW9uCisKKwkqIHRlc3QvTWFrZWZpbGUuYW06IGRvbid0IHVzZSBzcGVjaWFsIHZhcmlhYmxlICJURVNUUyIgZm9yIGVjaG8tKgorCXNpbmNlIHdlIGRvbid0IHdhbnQgdG8gdXNlIHRob3NlIGluIG1ha2UgY2hlY2sKKworMjAwMy0wMS0xNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKyAgICAgICAgUmVsZWFzZSAwLjIKKworCSogTkVXUzogdXBkYXRlCisKKzIwMDMtMDEtMTUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0ZXN0L01ha2VmaWxlLmFtOiBmaXggc28gdGhhdCB0ZXN0IHNvdXJjZSBjb2RlIGVuZHMgdXAgaW4gdGhlCisJZGlzdHJpYnV0aW9uIG9uIG1ha2UgZGlzdGNoZWNrCisKKzIwMDMtMDEtMTUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisgICAgICAgIFJlbGVhc2UgMC4xLgorCisJKiBORVdTOiB1cGRhdGUKKworMjAwMy0wMS0xNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy10ZXN0LmMgKGRidXNfaW50ZXJuYWxfc3ltYm9sX2RvX25vdF91c2VfcnVuX3Rlc3RzKToKKwlmaXggYnVpbGQgd2hlbiAtLWRpc2FibGUtdGVzdHMKKworCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBwdXQgSEFDS0lORyBpbiBoZXJlCisKKwkqIEhBQ0tJTkc6IGRvY3VtZW50IHByb2NlZHVyZSBmb3IgbWFraW5nIGEgdGFyYmFsbCByZWxlYXNlLgorCisyMDAzLTAxLTE0ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogYnVzL2Nvbm5lY3Rpb24uYzogKGNvbm5lY3Rpb25fZXJyb3JfaGFuZGxlciksCisJKGJ1c19jb25uZWN0aW9uX3NldHVwKToKKwkqIGJ1cy9tYWluLmM6IChtYWluKToKKwlNYWtlIHN1cmUgdGhhdCB0aGUgREJ1c0Nvbm5lY3Rpb25EYXRhIHN0cnVjdCBpcyBOVUxMZWQKKwlvdXQgdG8gcHJldmVudCBhIHNlZ2ZhdWx0LgorCisJKiBkYnVzL2RidXMtZXJyb3JzLmM6IChkYnVzX3Jlc3VsdF90b19zdHJpbmcpOgorCSogZGJ1cy9kYnVzLWVycm9ycy5oOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRidXNfbWVzc2FnZV9nZXRfZmllbGRzKSwKKwkoZGJ1c19tZXNzYWdlX2dldF9maWVsZHNfdmFsaXN0KSwgKF9kYnVzX21lc3NhZ2VfdGVzdCk6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5oOgorCU1ha2UgZGJ1c19tZXNzYWdlX2dldF9maWVsZHMgcmV0dXJuIGEgcmVzdWx0IGNvZGUgc28gd2UgY2FuCisJdHJhY2sgaW52YWxpZCBmaWVsZHMgYXMgd2VsbCBhcyBvb20uCisKKzIwMDMtMDEtMTEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogY2hhbmdlIC0tZW5hYmxlLXRlc3QvLS1lbmFibGUtYW5zaSBhY3Rpb24taWYtZ2l2ZW4KKwl0byBlbmFibGVfZm9vPSRlbmFibGV2YWwgaW5zdGVhZCBvZiBlbmFibGVfZm9vPXllcworCisyMDAzLTAxLTA4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19hbGlnbl9sZW5ndGgpOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLXRlc3QtbWFpbi5jOiBtb3ZlIG1haW4oKSBmb3IgdGVzdCBhcHAgaGVyZQorCSogZGJ1cy9kYnVzLXRlc3QuYworCShkYnVzX2ludGVybmFsX3N5bWJvbF9kb19ub3RfdXNlX3J1bl90ZXN0cyk6IHdlIGhhdmUgdG8gZXhwb3J0IGEKKwlzeW1ib2wgdG8gcnVuIHRlc3RzLCBiZWNhdXNlIGRidXMtdGVzdCBpc24ndCBpbiB0aGUgbWFpbgorCWxpYnJhcnkKKworICAgICAgICBDb2RlIHJldmlldyBuaXRwaWNrcy4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX3dyaXRlX2hlYWRlcik6IGFkZCBuZXdsaW5lcworCWZvciBwZW9wbGUgd2l0aCBuYXJyb3cgZW1hY3MgOy0pLiBBc3NlcnQgY2xpZW50X3NlcmlhbCB3YXMgZmlsbGVkCisJaW4uIEFzc2VydCBtZXNzYWdlLT5uYW1lICE9IE5VTEwuCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfZmllbGRzKTogaGF2ZSAiZmlyc3RfZmllbGRfdHlwZSIgYXJnIHNlcGFyYXRlCisJZnJvbSB2YSBsaXN0LCBuZWVkZWQgZm9yIEMrKyBiaW5kaW5nIHRoYXQgYWxzbyB1c2VzIHZhcmFyZ3MgSUlSQworCWFuZCBoZWxwcyB3aXRoIHR5cGUgc2FmZXR5CisJKGRidXNfbWVzc2FnZV9uZXcpOiBhZGQgQHRvZG8gYWJvdXQgdXNpbmcgREJ1c1N0cmluZyB0byBzdG9yZQorCXNlcnZpY2UvbmFtZSBpbnRlcm5hbGx5CisJKGRidXNfbWVzc2FnZV9uZXcpOiBkb24ndCBsZWFrIC0+c2VydmljZSBhbmQgLT5uYW1lIG9uIE9PTSBsYXRlcgorCWluIHRoZSBmdW5jdGlvbgorCShkYnVzX21lc3NhZ2VfdW5yZWYpOiBmcmVlIHRoZSBzZXJ2aWNlIG5hbWUKKwkoZGJ1c19tZXNzYWdlX2dldF9maWVsZHMpOiBzYW1lIGNoYW5nZSB0byB2YXJhcmdzCisJaS5lLiBmaXJzdF9maWVsZF90eXBlCisJKF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIpOiBhc3NlcnQgdGhhdCB0aGUgbWVzc2FnZSBkYXRhCisJaXMgYWxpZ25lZCAoaWYgbm90IGl0J3MgYSBidWcgaW4gb3VyIGNvZGUpLiBQdXQgaW4gdmVyYm9zZSBncmlwaW5nCisJYWJvdXQgd2h5IHdlIHNldCBjb3JydXB0ZWQgPSBUUlVFLgorCShkZWNvZGVfaGVhZGVyX2RhdGEpOiBhZGQgRklYTUUgdGhhdCBjaGFyKiBpcyBldmlsLiAgV2FzIGdvaW5nIHRvCisJYWRkIEZJWE1FIGFib3V0IGV2aWwgbG9jYWxlLXNwZWNpZmljIHN0cmluZy5oIHN0cm5jbXAsIGJ1dCBqdXN0CisJc3dpdGNoZWQgdG8gd2Fja3kgc3RyaW5nLWFzLXVpbnQzMiBvcHRpbWl6YXRpb24uIE1vdmUgY2hlY2sgZm9yCisJIm5vIHJvb20gZm9yIGZpZWxkIG5hbWUiIGFib3ZlIGdldF9jb25zdF9kYXRhX2xlbigpIHRvIGF2b2lkCisJYXNzZXJ0aW9uIGZhaWx1cmUgaW4gZ2V0X2NvbnN0X2RhdGFfbGVuIGlmIHdlIGhhdmUgdHJhaWxpbmcgMgorCWJ5dGVzIG9yIHRoZSBsaWtlLiBDaGVjayBmb3Igc2VydmljZSBhbmQgbmFtZSBmaWVsZHMgYmVpbmcKKwlwcm92aWRlZCB0d2ljZS4gRG9uJ3QgbGVhayBzZXJ2aWNlL25hbWUgb24gZXJyb3IuIFJlcXVpcmUgZmllbGQKKwluYW1lcyB0byBiZSBhbGlnbmVkIHRvIDQgYnl0ZXMuCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmM6IG1vdmUgYnl0ZSBzd2FwIHN0dWZmIHRvIGhlYWRlcgorCShfZGJ1c19wYWNrX2ludDMyKTogdXNjb3JlLXByZWZpeAorCShfZGJ1c191bnBhY2tfaW50MzIpOiB1c2NvcmUtcHJlZml4CisJKF9kYnVzX3VucGFja191aW50MzIpOiBleHBvcnQKKwkoX2RidXNfZGVtYXJzaGFsX3N0cmluZyk6IGFkZCBAdG9kbyBjb21wbGFpbmluZyBhYm91dCB1c2Ugb2YKKwltZW1jcHkoKQorCShfZGJ1c19tYXJzaGFsX2dldF9maWVsZF9lbmRfcG9zKTogYWRkIEB0b2RvIGFib3V0IGJhZCBlcnJvcgorCWhhbmRsaW5nIGFsbG93aW5nIGNvcnJ1cHQgZGF0YSB0byBnbyB1bmNoZWNrZWQKKworMjAwMy0wMS0wOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jICh1bml4X2RvX2l0ZXJhdGlvbik6IGFkZCByZWFkL3dyaXRlCisJdG8gdGhlIHNlbGVjdCgpIGFzIG5lZWRlZCBmb3IgYXV0aGVudGljYXRpb24uIChzaG91bGQgYmUgdXNpbmcKKwlfZGJ1c19wb2xsKCkgbm90IHNlbGVjdCwgYnV0IGZvciBhbm90aGVyIGRheSkKKworCSogZGJ1cy9kYnVzLmg6IGluY2x1ZGUgZGJ1cy9kYnVzLXByb3RvY29sLmgKKworMjAwMy0wMS0wOCAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvTWFrZWZpbGUuYW0gKGRidXNpbmNsdWRlX0hFQURFUlMpOiBJbnN0YWxsCisJZGJ1cy1jb25uZWN0aW9uLmgKKworMjAwMy0wMS0wOCAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYzogKF9kYnVzX3R5cGVfdG9fc3RyaW5nKToKKwlOZXcgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgYSB0eXBlLgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiAoX2RidXNfZGVtYXJzaGFsX2J5dGVfYXJyYXkpOgorCSogZGJ1cy9kYnVzLW1hcnNoYWwuaDoKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IChkYnVzX21lc3NhZ2VfZ2V0X2ZpZWxkc192YWxpc3QpLAorCShkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZmllbGRfdHlwZSksIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZG91YmxlKSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2J5dGVfYXJyYXkpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDoKKwlBZGQgbmV3IGNvbnZlbmllbmNlIGZ1bmN0aW9ucyBmb3IgYXBwZW5kaW5nIGFuZCBnZXR0aW5nIG1lc3NhZ2UgZmllbGRzLgorCUFsc28gYWRkIGRlbWFyc2hhbGxpbmcgcm91dGluZXMgZm9yIGJ5dGUgYXJyYXlzLgorCisyMDAzLTAxLTA3ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaDoKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IChfZGJ1c19jb25uZWN0aW9uX25ld19mb3JfdHJhbnNwb3J0KSwKKwkoX2RidXNfY29ubmVjdGlvbl9nZXRfbmV4dF9jbGllbnRfc2VyaWFsKSwKKwkoZGJ1c19jb25uZWN0aW9uX3NlbmRfbWVzc2FnZSk6CisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmg6CisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiAodW5wYWNrX3VpbnQzMiksIChkYnVzX3VucGFja19pbnQzMiksCisJKGRidXNfcGFja19pbnQzMiksIChfZGJ1c19tYXJzaGFsX2RvdWJsZSksIChfZGJ1c19tYXJzaGFsX2ludDMyKSwKKwkoX2RidXNfbWFyc2hhbF91aW50MzIpLCAoX2RidXNfZGVtYXJzaGFsX2RvdWJsZSksCisJKF9kYnVzX2RlbWFyc2hhbF9pbnQzMiksIChfZGJ1c19kZW1hcnNoYWxfdWludDMyKSwKKwkoX2RidXNfZGVtYXJzaGFsX3N0cmluZyksIChfZGJ1c19tYXJzaGFsX2dldF9maWVsZF9lbmRfcG9zKSwKKwkoX2RidXNfdmVyYm9zZV9ieXRlcyksIChfZGJ1c19tYXJzaGFsX3Rlc3QpOgorCSogZGJ1cy9kYnVzLW1hcnNoYWwuaDoKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWludGVybmFsLmg6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoX2RidXNfbWVzc2FnZV9zZXRfY2xpZW50X3NlcmlhbCksCisJKGRidXNfbWVzc2FnZV93cml0ZV9oZWFkZXIpLCAoX2RidXNfbWVzc2FnZV9sb2NrKSwKKwkoZGJ1c19tZXNzYWdlX25ldyksIChkYnVzX21lc3NhZ2VfcmVmKSwgKGRidXNfbWVzc2FnZV91bnJlZiksCisJKGRidXNfbWVzc2FnZV9nZXRfbmFtZSksIChkYnVzX21lc3NhZ2VfYXBwZW5kX2ludDMyKSwKKwkoZGJ1c19tZXNzYWdlX2FwcGVuZF91aW50MzIpLCAoZGJ1c19tZXNzYWdlX2FwcGVuZF9kb3VibGUpLAorCShkYnVzX21lc3NhZ2VfYXBwZW5kX3N0cmluZyksIChkYnVzX21lc3NhZ2VfYXBwZW5kX2J5dGVfYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfZ2V0X2ZpZWxkc19pdGVyKSwgKGRidXNfbWVzc2FnZV9pdGVyX3JlZiksCisJKGRidXNfbWVzc2FnZV9pdGVyX3VucmVmKSwgKGRidXNfbWVzc2FnZV9pdGVyX2hhc19uZXh0KSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCksIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZmllbGRfdHlwZSksCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9zdHJpbmcpLCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2ludDMyKSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X3VpbnQzMiksIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZG91YmxlKSwKKwkoZGVjb2RlX2hlYWRlcl9kYXRhKSwgKF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIpLAorCShtZXNzYWdlX2l0ZXJfdGVzdCksIChfZGJ1c19tZXNzYWdlX3Rlc3QpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDoKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOgorCSogZGJ1cy9kYnVzLXRlc3QuYzogKG1haW4pOgorCSogZGJ1cy9kYnVzLXRlc3QuaDoKKwkqIGdsaWIvdGVzdC1kYnVzLWdsaWIuYzogKG1lc3NhZ2VfaGFuZGxlciksIChtYWluKToKKwkqIHRlc3QvZWNoby1jbGllbnQuYzogKG1haW4pOgorCSogdGVzdC93YXRjaC5jOiAoY2hlY2tfbWVzc2FnZXMpOgorCU1ha2UgbWVzc2FnZXMgc2VuZGFibGUgYW5kIHJlY2VpdmFibGUgZm9yIHJlYWwuCisKKzIwMDMtMDEtMDcgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiAoX2RidXNfbWFyc2hhbF9kb3VibGUpLAorCShfZGJ1c19tYXJzaGFsX3N0cmluZyksIChfZGJ1c19tYXJzaGFsX2J5dGVfYXJyYXkpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRidXNfbWVzc2FnZV9hcHBlbmRfaW50MzIpLAorCShkYnVzX21lc3NhZ2VfYXBwZW5kX3VpbnQzMiksIChkYnVzX21lc3NhZ2VfYXBwZW5kX2RvdWJsZSksCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfc3RyaW5nKSwgKGRidXNfbWVzc2FnZV9hcHBlbmRfYnl0ZV9hcnJheSk6CisJSGFuZGxlIE9PTSByZXN0b3JhdGlvbi4KKworMjAwMy0wMS0wNyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmM6IChfZGJ1c19tYXJzaGFsX3N0cmluZyksCisJKF9kYnVzX2RlbWFyc2hhbF9zdHJpbmcpLCAoX2RidXNfbWFyc2hhbF90ZXN0KToKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmg6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoZGJ1c19tZXNzYWdlX2dldF9uYW1lKSwKKwlEb2N1bWVudCB0aGVzZSBmdW5jdGlvbnMuCisKKwkoZGJ1c19tZXNzYWdlX2FwcGVuZF9pbnQzMiksIChkYnVzX21lc3NhZ2VfYXBwZW5kX3VpbnQzMiksCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfZG91YmxlKSwgKGRidXNfbWVzc2FnZV9hcHBlbmRfc3RyaW5nKSwKKwkoZGJ1c19tZXNzYWdlX2FwcGVuZF9ieXRlX2FycmF5KToKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6CisJQWRkIGZ1bmN0aW9ucyBmb3IgYWRkaW5nIG1lc3NhZ2UgZmllbGRzIG9mIGRpZmZlcmVudCB0eXBlcy4KKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6CisJQWRkIHRoZSBkaWZmZXJlbnQgdHlwZXMuCisKKzIwMDMtMDEtMDUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9jb25uZWN0aW9uLmM6IGltcGxlbWVudCByb3V0aW5lcyBmb3IgaGFuZGxpbmcgY29ubmVjdGlvbnMsCisJZmlyc3QgdGhpbmcgaXMga2VlcGluZyBhIGxpc3Qgb2Ygb3duZWQgc2VydmljZXMgb24gZWFjaCBjb25uZWN0aW9uCisJYW5kIHNldHRpbmcgdXAgd2F0Y2hlcyBldGMuCisKKwkqIGJ1cy9zZXJ2aWNlcy5jOiBpbXBsZW1lbnQgYSBtYXBwaW5nIGZyb20gc2VydmljZSBuYW1lcyB0byBsaXN0cworCW9mIGNvbm5lY3Rpb25zCisKKwkqIGRidXMvZGJ1cy1oYXNoLmM6IGFkZCBEQlVTX0hBU0hfUE9JTlRFUgorCisJKiBkYnVzL2RidXMtdGhyZWFkcy5jIChkYnVzX3N0YXRpY19tdXRleF9sb2NrKTogYWRkIGZ1bmN0aW9ucworCXRvIHVzZSBzdGF0aWMgbXV0ZXhlcyBmb3IgZ2xvYmFsIGRhdGEKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX3NldF9kYXRhKTogYWRkIG5ldworCWNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zIHRvIHNldC9nZXQgYXBwbGljYXRpb24tc3BlY2lmaWMgZGF0YQorCW9uIHRoZSBEQnVzQ29ubmVjdGlvbi4KKworMjAwMy0wMS0wNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfc2xlZXBfbWlsbGlzZWNvbmRzKTogbmV3IGZ1bmN0aW9uCisJKF9kYnVzX3BvbGwpOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oIChfREJVU19TVFJVQ1RfT0ZGU0VUKTogbmV3IG1hY3JvCisJY29waWVkIGZyb20gR0xpYgorCisJKiBidXMvbG9vcC5jOiBpbml0aWFsIGNvZGUgZm9yIHRoZSBkYWVtb24gbWFpbiBsb29wCisKKzIwMDMtMDEtMDQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIHRlc3Qvd2F0Y2guYyAoZXJyb3JfaGFuZGxlcik6IG1ha2UgaXQgc2FmZSBpZiB0aGUgZXJyb3IgaGFuZGxlcgorCWlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyAoaWYgd2Ugcy9lcnJvciBoYW5kbGVyL2Rpc2Nvbm5lY3QKKwloYW5kbGVyLyB3ZSBzaG91bGQganVzdCBndWFyYW50ZWUgaXQncyBjYWxsZWQgb25seSBvbmNlKQorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmMgKF9kYnVzX3RyYW5zcG9ydF9kaXNjb25uZWN0KTogY2FsbCB0aGUKKwllcnJvciBoYW5kbGVyIG9uIGRpc2Nvbm5lY3QgKGl0J3MgcXVpdGUgcG9zc2libGUgd2Ugc2hvdWxkCisJanVzdCBjaGFuZ2UgdGhlIGVycm9yIGhhbmRsZXIgdG8gYSAiZGlzY29ubmVjdCBoYW5kbGVyLCIgSSdtCisJbm90IHN1cmUgd2UgaGF2ZSBhbnkgb3RoZXIgbWVhbmluZ2Z1bCBlcnJvcnMpCisKKwkqIGNvbmZpZ3VyZS5pbjogY2hlY2sgZm9yIGdldHB3bmFtX3IKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jLCBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYywKKwlkYnVzL2RidXMtYXV0aC5jOiBhZGQgY3JlZGVudGlhbHMgc3VwcG9ydCwgYWRkIEVYVEVSTkFMIGF1dGgKKwltZWNoYW5pc20gYXMgaW4gU0FTTCBzcGVjLCB1c2luZyBzb2NrZXQgY3JlZGVudGlhbHMKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfcmVhZF9jcmVkZW50aWFsc191bml4X3NvY2tldCk6IG5ldyBmdW5jdGlvbgorCShfZGJ1c19zZW5kX2NyZWRlbnRpYWxzX3VuaXhfc29ja2V0KTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2FjY2VwdF91bml4X3NvY2tldCk6IHJlbmFtZSBqdXN0CisJZGJ1c19hY2NlcHQoKQorCShfZGJ1c193cml0ZSk6IG9ubHkgY2hlY2sgZXJybm8gaWYgPDAgcmV0dXJuZWQKKwkoX2RidXNfd3JpdGVfdHdvKTogZGl0dG8KKworMjAwMy0wMS0wMiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmM6IChfZGJ1c19tYXJzaGFsX3V0Zjhfc3RyaW5nKSwKKwkoX2RidXNfbWFyc2hhbF9ieXRlX2FycmF5KSwgKF9kYnVzX2RlbWFyc2hhbF91dGY4X3N0cmluZyksCisJKF9kYnVzX21hcnNoYWxfdGVzdCk6CisJKiBkYnVzL2RidXMtbWFyc2hhbC5oOgorCUFkZCBfZGJ1c19tYXJzaGFsX2J5dGVfYXJyYXkgYW5kIHJlbmFtZSBfZGJ1c19tYXJzaGFsX3N0cmluZworCXRvIF9kYnVzX21hcnNoYWxfdXRmOF9zdHJpbmcuIEFsc28gZml4IHNvbWUgdGVzdHMuCisKKzIwMDItMTItMjggIEhhcnJpIFBvcnRlbiAgPHBvcnRlbkBrZGUub3JnPgorCisJKiBjb25maWd1cmUuaW46IGFkZGVkIGNoZWNrIGZvciBDKysgY29tcGlsZXIgYW5kIGEgdmVyeSBjaGVlc3kKKwljaGVjayBmb3IgdGhlIFF0IGludGVncmF0aW9uCisKKwkqIE1ha2VmaWxlLmFtIChTVUJESVJTKTogY29tcGlsZSBxdCBzdWJkaXIgaWYgc3VwcG9ydCBpcyBlbmFibGVkCisKKwkqIHF0L01ha2VmaWxlLmFtOiBhZGRlZAorCisJKiBxdC8uY3ZzaWdub3JlOiBhZGRlZAorCisJKiBxdC9kYnVzLXF0aHJlYWQuY2MsIHF0L2RidXMtcXRocmVhZC5jcHA6IHJlbmFtZWQgZm9ybWVyIHRvCisJbGF0dGVyLCBhZGRlZCAjaWZkZWYgUVRfVEhSRUFEX1NVUFBPUlQgZ3VhcmQuCisKKwkqIGRidXMvTWFrZWZpbGUuYW06IGFkZGVkIG1pc3NpbmcgaGVhZGVycyBmb3IgbWFrZSBkaXN0CisKKzIwMDItMTItMjggIEtyaXN0aWFuIFJpZXR2ZWxkICA8a3Jpc0BndGsub3JnPgorCisJKiBkYnVzL01ha2VmaWxlLmFtOiBmaXh1cCBleHBvcnQtc3ltYm9scy1yZWdleC4KKworMjAwMi0xMi0yNyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGFjaW5jbHVkZS5tNDogQWRkIHRoaXMgZmlsZSBhbmQgcHV0IHRoZQorCVBLR19DSEVDS19NT0RVTEUgbWFjcm8gaW4gaXQuCisKKzIwMDItMTItMjcgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiAoX2RidXNfbWFyc2hhbF9zdHJpbmcpLAorCShfZGJ1c19kZW1hcnNoYWxfZG91YmxlKSwgKF9kYnVzX2RlbWFyc2hhbF9pbnQzMiksCisJKF9kYnVzX2RlbWFyc2hhbF91aW50MzIpLCAoX2RidXNfZGVtYXJzaGFsX3N0cmluZyksCisJKF9kYnVzX21hcnNoYWxfdGVzdCk6CisJTWFrZSB0aGUgZGVtYXJzaGFsbGluZyByb3V0aW5lcyBhbGlnbiB0aGUgcG9zIGFyZ3VtZW50LgorCUFkZCBzdHJpbmcgbWFyc2hhbGxpbmcgdGVzdHMgYW5kIGZpeCB0aGUgb2J2aW91cyBidWdzCisJZGlzY292ZXJlZC4KKworMjAwMi0xMi0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLWF1dGguYzogZml4ZXMgZml4ZXMgZml4ZXMKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmM6IHdpcmUgdXAgc3VwcG9ydCBmb3IKKwllbmNvZGluZy9kZWNvZGluZyBkYXRhIG9uIHRoZSB3aXJlCisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKF9kYnVzX2F1dGhfZW5jb2RlX2RhdGEpCisJKF9kYnVzX2F1dGhfZGVjb2RlX2RhdGEpOiBhcHBlbmQgdG8gdGFyZ2V0IHN0cmluZworCWluc3RlYWQgb2YgbnVraW5nIGl0LgorCisyMDAyLTEyLTI2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5oIChEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIpOiAjaWZkZWYKKwlXT1JEU19CSUdFTkRJQU4gdGhlbiBjb21waWxlciBieXRlIG9yZGVyIGlzIERCVVNfQklHX0VORElBTiwKKwlkb2gKKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYzogQWRkIG1hY3JvcyB0byBkbyBpbnQgc3dhcHBpbmcgaW4tcGxhY2UgYW5kCisJYXZvaWQgc3dhcF9ieXRlcygpIG92ZXJoZWFkIChpZ25vcmluZyBwb3NzaWJsZSBhc3NlbWJseSBzdHVmZiBmb3IKKwlub3cpLiBNYWluIHBvaW50IGlzIGJlY2F1c2UgSSB3YW50ZWQgdW5wYWNrX3VpbnQzMiB0byBpbXBsZW1lbnQKKwlfZGJ1c192ZXJib3NlX2J5dGVzCisJKF9kYnVzX3ZlcmJvc2VfYnl0ZXMpOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfdmFsaWRhdGVfYXNjaWkpOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X2lzX2NvcnJ1cHRlZCk6IGFkZAorCW1lY2hhbmlzbSB0byBoYW5kbGUgYSBjb3JydXB0IG1lc3NhZ2Ugc3RyZWFtCisJKF9kYnVzX21lc3NhZ2VfbG9hZGVyX25ldyk6IGZpeCBwcmVhbGxvY2F0aW9uIHRvIG9ubHkgcHJlYWxsb2MsCisJbm90IHByZWxlbmd0aGVuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX3NraXBfYmxhbmspOiBmaXggdGhpcyBmdW5jdGlvbgorCShfZGJ1c19zdHJpbmdfdGVzdCk6IGVuaGFuY2UgdGVzdHMgZm9yIGNvcHkvbW92ZSBhbmQgZml4IHRoZQorCWZ1bmN0aW9ucworCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYzogSG9sZCByZWZlcmVuY2VzIGluIG1vcmUgcGxhY2VzIHRvCisJYXZvaWQgcmVlbnRyYW5jeSBwcm9ibGVtcworCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmM6IGRpdHRvCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaF9tZXNzYWdlKTogZG9uJ3QKKwlsZWFrIHJlZmVyZW5jZSBjb3VudCBpbiBuby1tZXNzYWdlIGNhc2UKKworCSogdGVzdC93YXRjaC5jIChkb19tYWlubG9vcCk6IGhhbmRsZSBhZGRpbmcvcmVtb3Zpbmcgd2F0Y2hlcworCWR1cmluZyBpdGVyYXRpb24gb3ZlciB0aGUgd2F0Y2hlcy4gQWxzbywgcmVmIHRoZSBjb25uZWN0aW9uL3NlcnZlcgorCXN0b3JlZCBvbiBhIHdhdGNoLCBzbyB3ZSBkb24ndCB0cnkgdG8gbWFuZ2xlIGEgZGVzdHJveWVkIG9uZS4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMgKGRvX2F1dGhlbnRpY2F0aW9uKTogcGVyZm9ybQorCWF1dGhlbnRpY2F0aW9uCisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKGdldF9zdGF0ZSk6IGFkZCBhIHN0YXRlCisJQVVUSEVOVElDQVRFRF9XSVRIX1VOVVNFRF9CWVRFUyBhbmQgcmV0dXJuIGl0IGlmIHJlcXVpcmVkCisJKF9kYnVzX2F1dGhfZ2V0X3VudXNlZF9ieXRlcyk6IGFwcGVuZCB0aGUgdW51c2VkIGJ5dGVzCisJdG8gdGhlIHBhc3NlZCBpbiBzdHJpbmcsIHJhdGhlciB0aGFuIHByZXBlbmQKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jIChfZGJ1c190cmFuc3BvcnRfaW5pdF9iYXNlKTogY3JlYXRlCisJdGhlIGF1dGggY29udmVyc2F0aW9uIERCdXNBdXRoCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jIChfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl9mZCkKKwkoX2RidXNfdHJhbnNwb3J0X25ld19mb3JfZG9tYWluX3NvY2tldCk6IHdoZW4gY3JlYXRpbmcgYQorCXRyYW5zcG9ydCwgcGFzcyBpbiB3aGV0aGVyIGl0J3MgYSBjbGllbnQtc2lkZSBvciBzZXJ2ZXItc2lkZQorCXRyYW5zcG9ydCBzbyB3ZSBrbm93IHdoaWNoIERCdXNBdXRoIHRvIGNyZWF0ZQorCisyMDAyLTEyLTAzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYyAodW5peF9maW5hbGl6ZSk6IGZpbmFsaXplIGJhc2UKKwlfYWZ0ZXJfIGZpbmFsaXppbmcgdGhlIGRlcml2ZWQgbWVtYmVycworCSh1bml4X2Nvbm5lY3Rpb25fc2V0KTogdW5yZWYgd2F0Y2ggaWYgd2UgZmFpbCB0byBhZGQgaXQKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX3VucmVmKTogZGVsZXRlIHRoZQorCXRyYW5zcG9ydCBmaXJzdCwgc28gdGhhdCB0aGUgY29ubmVjdGlvbiBvd25lZCBieSB0aGUKKwl0cmFuc3BvcnQgd2lsbCBiZSB2YWxpZCBhcyB0aGUgdHJhbnNwb3J0IGZpbmFsaXplcy4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMgKHVuaXhfZmluYWxpemUpOiBmcmVlIHRoZSB3cml0ZV93YXRjaAorCWlmIG5lY2Vzc2FyeSwgYW5kIHJlbW92ZSB3YXRjaGVzIGZyb20gdGhlIGNvbm5lY3Rpb24uCisKKwkqIGRidXMvZGJ1cy13YXRjaC5jIChfZGJ1c193YXRjaF9saXN0X2ZyZWUpOiBpbXByb3ZlIGEgY29tbWVudAorCisyMDAyLTEyLTI2ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYzogKF9kYnVzX21hcnNoYWxfc3RyaW5nKSwKKwkoX2RidXNfZGVtYXJzaGFsX2RvdWJsZSksIChfZGJ1c19kZW1hcnNoYWxfaW50MzIpLAorCShfZGJ1c19kZW1hcnNoYWxfdWludDMyKSwgKF9kYnVzX2RlbWFyc2hhbF9zdHJpbmcpLAorCShfZGJ1c19tYXJzaGFsX3Rlc3QpOgorCSogZGJ1cy9kYnVzLW1hcnNoYWwuaDoKKwlBZGQgc3RyaW5nIG1hcnNoYWwgZnVuY3Rpb25zIGFuZCBoYXZlIHRoZSBkZW1hcnNoYWwgZnVuY3Rpb25zCisJcmV0dXJuIHRoZSBuZXcgcG9zaXRpb24uCisKKzIwMDItMTItMjUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRvYy9kYnVzLXNhc2wtcHJvZmlsZS50eHQ6IGRvY3Mgb24gdGhlIGF1dGhlbnRpY2F0aW9uIHByb3RvY29sLAorCWl0IGlzIGEgc2ltcGxlIHByb3RvY29sIHRoYXQganVzdCBtYXBzIGRpcmVjdGx5IHRvIFNBU0wuCisKKwkqIGRidXMvZGJ1cy1hdXRoLmgsIGRidXMvZGJ1cy1hdXRoLmM6IGF1dGhlbnRpY2F0aW9uIHByb3RvY29sCisJaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiwgbm90IGFjdHVhbGx5IHVzZWQgeWV0LgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19maW5kKTogbmV3IGZ1bmN0aW9uCisJKF9kYnVzX3N0cmluZ19lcXVhbCk6IG5ldyBmdW5jdGlvbgorCShfZGJ1c19zdHJpbmdfYmFzZTY0X2VuY29kZSk6IG5ldyBmdW5jdGlvbgorCShfZGJ1c19zdHJpbmdfYmFzZTY0X2RlY29kZSk6IG5ldyBmdW5jdGlvbgorCisyMDAyLTEyLTI1ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9NYWtlZmlsZS5hbToKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmM6IChzd2FwX2J5dGVzKSwgKF9kYnVzX21hcnNoYWxfZG91YmxlKSwKKwkoX2RidXNfbWFyc2hhbF9pbnQzMiksIChfZGJ1c19tYXJzaGFsX3VpbnQzMiksCisJKF9kYnVzX2RlbWFyc2hhbF9kb3VibGUpLCAoX2RidXNfZGVtYXJzaGFsX2ludDMyKSwKKwkoX2RidXNfZGVtYXJzaGFsX3VpbnQzMiksIChfZGJ1c19tYXJzaGFsX3Rlc3QpOgorCSogZGJ1cy9kYnVzLW1hcnNoYWwuaDoKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOgorCSogZGJ1cy9kYnVzLXRlc3QuYzogKG1haW4pOgorCSogZGJ1cy9kYnVzLXRlc3QuaDoKKwlBZGQgdW4tb3B0aW1pemVkIG1hcnNoYWxsaW5nL2RlbWFyc2hhbGxpbmcgcm91dGluZXMuCisKKzIwMDItMTItMjUgIEhhcnJpIFBvcnRlbiAgPHBvcnRlbkBrZGUub3JnPgorCisJKiBxdC9kYnVzLXF0Lmg6IGFkanVzdGVkIGN0b3IgYW5kIGdldHRlciB0byBLREUvUXQgY29udmVudGlvbnMKKworMjAwMi0xMi0yNCAgWmFjayBSdXNpbiAgPHphY2tAa2RlLm9yZz4KKworCSogcXQvZGJ1cy1xdGhyZWFkLmNjOiBhZGRpbmcgLSBpbnRlZ3JhdGVzIFFNdXRleCBpbnRvIERidXMKKwkqIHF0L2RidXMtcXQuaDogc2tlbGV0b24gd2l0aCB0d28gc2FtcGxlIGltcGxlbWVuYXRhdGlvbiBvZiB0aGUKKwltYWluIGxvb3Agc3R1ZmYKKworMjAwMi0xMi0yNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZ2xpYi9kYnVzLWd0aHJlYWQuYzogZml4IGluY2x1ZGUKKworCSogZ2xpYi9kYnVzLWdsaWIuaDogcmVuYW1lIERCdXNNZXNzYWdlSGFuZGxlciBmb3Igbm93LgorCUkgdGhpbmsgZ2xpYiBBUEkgbmVlZHMgdG8gY2hhbmdlLCB0aG91Z2gsIGFzIHlvdSBkb24ndAorCXdhbnQgdG8gdXNlIERCdXNNZXNzYWdlRnVuY3Rpb24sIHlvdSB3YW50IHRvIHVzZSB0aGUKKwlEQnVzTWVzc2FnZUhhbmRsZXIgb2JqZWN0LiBQcm9iYWJseQorCWRidXNfY29ubmVjdGlvbl9vcGVuX3dpdGhfZ19tYWluX2xvb3AoKQorCWFuZCBkYnVzX2Nvbm5lY3Rpb25fc2V0dXBfZ19tYWluX2xvb3AoKSBvciBzb21ldGhpbmcgbGlrZSB0aGF0CisJKGJ1dCB0aGluayBvZiBiZXR0ZXIgbmFtZXMuLi4pIHRoYXQganVzdCBjcmVhdGUgYSBjb25uZWN0aW9uCisJdGhhdCBoYXMgd2F0Y2gvdGltZW91dCBmdW5jdGlvbnMgZXRjLiBhbHJlYWR5IHNldCB1cC4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYworCShkYnVzX2Nvbm5lY3Rpb25fc2VuZF9tZXNzYWdlX3dpdGhfcmVwbHkpOiBuZXcgZnVuY3Rpb24ganVzdCB0bworCXNob3cgaG93IHRoZSBtZXNzYWdlIGhhbmRsZXIgaGVscHMgdXMgZGVhbCB3aXRoIHJlcGxpZXMuCisKKwkqIGRidXMvZGJ1cy1saXN0LmMgKF9kYnVzX2xpc3RfcmVtb3ZlX2xhc3QpOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfdGVzdCk6IGZyZWUgYSBzdHJpbmcgdGhhdAorCXdhc24ndAorCisJKiBkYnVzL2RidXMtaGFzaC5jOiB1c2UgbWVtb3J5IHBvb2xzIGZvciB0aGUgaGFzaCBlbnRyaWVzCisJKHJlYnVpbGRfdGFibGUpOiBiZSBtb3JlIHBhcmFub2lkIGFib3V0IG92ZXJmbG93LCBhbmQKKwlzaHJpbmsgdGFibGUgd2hlbiB3ZSBjYW4KKwkoX2RidXNfaGFzaF90ZXN0KTogcmVkdWNlIG51bWJlciBvZiBzcHJpbnRmcyBhbmQgd3JpdGUKKwl2YWxpZCBDODkuIEFkZCB0ZXN0cyBmb3IgY2FzZSB3aGVyZSB3ZSBncm93IGFuZCB0aGVuCisJc2hyaW5rIHRoZSBoYXNoIHRhYmxlLgorCisJKiBkYnVzL2RidXMtbWVtcG9vbC5oLCBkYnVzL2RidXMtbWVtcG9vbC5jOiBtZW1vcnkgcG9vbHMKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX2hhbmRsZXIpCisJKGRidXNfY29ubmVjdGlvbl91bnJlZ2lzdGVyX2hhbmRsZXIpOiBuZXcgZnVuY3Rpb25zCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9nZXRfbmFtZSk6IG5ldworCisJKiBkYnVzL2RidXMtbGlzdC5jOiBmaXggZG9jcyB0eXBvCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWhhbmRsZXIuaCwgZGJ1cy9kYnVzLW1lc3NhZ2UtaGFuZGxlci5jOgorCWFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBoYW5kbGVyIGZvciBtZXNzYWdlcy4KKworMjAwMi0xMi0xNiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGdsaWIvZGJ1cy1nbGliLmg6CisJKiBnbGliL2RidXMtZ3RocmVhZC5jOiAoZGJ1c19ndGhyZWFkX2luaXQpOgorCURvbid0IHVzZSB0aGUgZ2RidXMgcHJlZml4IGZvciBwdWJsaWMgZnVuY3Rpb25zLgorCisyMDAyLTEyLTE2ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogTWFrZWZpbGUuYW06CisJKiBjb25maWd1cmUuaW46CisJQWRkIEdMaWIgY2hlY2tzIGFuZCBmaXh1cCAucGMgZmlsZXMKKworCSogZ2xpYi9NYWtlZmlsZS5hbToKKwkqIGdsaWIvZGJ1cy1nbGliLmg6CisJKiBnbGliL2RidXMtZ21haW4uYzogKGdkYnVzX2Nvbm5lY3Rpb25fcHJlcGFyZSksCisJKGdkYnVzX2Nvbm5lY3Rpb25fY2hlY2spLCAoZ2RidXNfY29ubmVjdGlvbl9kaXNwYXRjaCksCisJKGdkYnVzX2FkZF9jb25uZWN0aW9uX3dhdGNoKSwgKGdkYnVzX3JlbW92ZV9jb25uZWN0aW9uX3dhdGNoKSwKKwkoZGJ1c19jb25uZWN0aW9uX2dzb3VyY2VfbmV3KToKKwkqIGdsaWIvZGJ1cy1ndGhyZWFkLmM6IChkYnVzX2dtdXRleF9uZXcpLCAoZGJ1c19nbXV0ZXhfZnJlZSksCisJKGRidXNfZ211dGV4X2xvY2spLCAoZGJ1c19nbXV0ZXhfdW5sb2NrKSwgKGRidXNfZ3RocmVhZF9pbml0KToKKwkqIGdsaWIvdGVzdC1kYnVzLWdsaWIuYzogKG1lc3NhZ2VfaGFuZGxlciksIChtYWluKToKKwlBZGQgR0xpYiBzdXBwb3J0LgorCisyMDAyLTEyLTE1ICBIYXJyaSBQb3J0ZW4gIDxwb3J0ZW5Aa2RlLm9yZz4KKworCSogYXV0b2dlbi5zaDogY2hlY2sgZm9yIGxpYnRvb2xpemUgYmVmb3JlIGF0dGVtcHRpbmcgdG8gdXNlIGl0CisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jOiBpbmNsdWRlIDxzeXMvdGltZS5oPiBmb3IgdGltZXZhbAorCXN0cnVjdC4KKworCSogLmN2c2lnbm9yZTogaWdub3JlIG1vcmUgc3RhbXAgZmlsZXMKKworCSogZGJ1cy9kYnVzLXdhdGNoLmMgKF9kYnVzX3dhdGNoX2xpc3RfbmV3KTogZml4ZWQgZG9jIGVycm9yCisKKwkqIHRlc3QvTWFrZWZpbGUuYW06IGFkZGVkIC1JJCh0b3Bfc3JjZGlyKSB0byBiZSBhYmxlIHRvIGNvbXBpbGUKKwl3aXRob3V0IG1ha2UgaW5zdGFsbC4KKworMjAwMi0xMi0xNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLXRocmVhZHMuYzogYWRkIHRocmVhZCBzdHVicyB0aGF0IGEgaGlnaGVyIGxpYnJhcnkKKwlsYXllciBjYW4gZmlsbCBpbi4gZS5nLiB0aGUgR0xpYiB3cmFwcGVyIG1pZ2h0IGZpbGwgdGhlbSBpbiB3aXRoCisJR1RocmVhZCBzdHVmZi4gV2Ugc3RpbGwgbmVlZCB0byB1c2UgdGhpcyB0aHJlYWQgQVBJIHRvCisJdGhyZWFkLXNhZmUtaXplIHRoZSBsaWJyYXJ5LgorCisyMDAyLTEyLTEyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYywgZGJ1cy9kYnVzLXNlcnZlci11bml4LmM6IHVzZSB0aGUKKwliZWxvdyBuZXcgaW50ZXJmYWNlcyBhbmQgaW5jbHVkZSBmZXdlciBzeXN0ZW0gaGVhZGVycy4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfcmVhZCk6IG5ldyBmdW5jdGlvbgorCShfZGJ1c193cml0ZSk6IG5ldyBmdW5jdGlvbgorCShfZGJ1c193cml0ZV90d28pOiBuZXcgZnVuY3Rpb24KKwkoX2RidXNfY29ubmVjdF91bml4X3NvY2tldCk6IG5ldyBmdW5jdGlvbgorCShfZGJ1c19saXN0ZW5fdW5peF9zb2NrZXQpOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtaW50ZXJuYWwuaDogY2hhbmdlIGludGVyZmFjZXMgdG8gdXNlCisJREJ1c1N0cmluZworCisyMDAyLTEyLTExICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtdHlwZXMuaDogYWRkIGRidXNfdW5pY2hhcgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmMgKF9kYnVzX3ZlcmJvc2UpOiB1c2UgX2RidXNfZ2V0ZW52CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9zZW5kX21lc3NhZ2UpOiByZXR1cm4KKwlUUlVFIG9uIHN1Y2Nlc3MKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jOiBpbmNsdWRlIGRidXMtd2F0Y2guaAorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiBpbmNsdWRlIGRidXMtbWVzc2FnZS1pbnRlcm5hbC5oCisKKwkqIEhBQ0tJTkc6IGFkZCBmaWxlIHdpdGggY29kaW5nIGd1aWRlbGluZXMgc3R1ZmYuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuaCwgZGJ1cy9kYnVzLXN0cmluZy5jOiBFbmNhcHN1bGF0ZSBhbGwgc3RyaW5nCisJaGFuZGxpbmcgaGVyZSwgZm9yIHNlY3VyaXR5IHB1cnBvc2VzIChhcyBpbiB2c2Z0cGQpLiBOb3QgYWN0dWFsbHkKKwl1c2luZyB0aGlzIGNsYXNzIHlldC4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuaCwgZGJ1cy9kYnVzLXN5c2RlcHMuYzogRW5jYXBzdWxhdGUgYWxsCisJc3lzdGVtL2xpYmMgdXNhZ2UgaGVyZSwgYXMgaW4gdnNmdHBkLCBmb3IgZWFzZSBvZiBhdWRpdGluZyAoYW5kCisJc2hvdWxkIGFsc28gc2ltcGxpZnkgcG9ydGFiaWxpdHkpLiBIYXZlbid0IGFjdHVhbGx5IG1vdmVkIGFsbCB0aGUKKwlzeXN0ZW0vbGliYyB1c2FnZSBpbnRvIGhlcmUgeWV0LgorCisyMDAyLTExLTI1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmMgKF9kYnVzX3ZlcmJvc2UpOiBmaXggdG8gbm90CisJYWx3YXlzIHByaW50IHRoZSBmaXJzdCB2ZXJib3NlIG1lc3NhZ2UuCisKKzIwMDItMTEtMjQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKyAgICAgICAgKiB0ZXN0L2VjaG8tY2xpZW50LmMsIHRlc3QvZWNoby1zZXJ2ZXIuYzogY2hlZXN5IHRlc3QKKwljbGllbnRzLgorCisJKiBjb25maWd1cmUuaW4gKEFDX0NIRUNLX0ZVTkNTKTogY2hlY2sgZm9yIHdyaXRldgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChfZGJ1c19tZXNzYWdlX2dldF9uZXR3b3JrX2RhdGEpOiBuZXcKKwlmdW5jdGlvbgorCisJKiBkYnVzL2RidXMtbGlzdC5jIChfZGJ1c19saXN0X2ZvcmVhY2gpOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c192ZXJib3NlKTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYywgZGJ1cy9kYnVzLXNlcnZlci5oOiBwdWJsaWMgb2JqZWN0CisJcmVwcmVzZW50aW5nIGEgc2VydmVyIHRoYXQgbGlzdGVucyBmb3IgY29ubmVjdGlvbnMuCisKKwkqIGRidXMvLmN2c2lnbm9yZTogY3JlYXRlCisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuaCwgZGJ1cy9kYnVzLWVycm9ycy5jOgorCXB1YmxpYyBBUEkgZm9yIHJlcG9ydGluZyBlcnJvcnMKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uaCwgZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzoKKwlwdWJsaWMgb2JqZWN0IHJlcHJlc2VudGluZyBhIGNvbm5lY3Rpb24gdGhhdAorCXNlbmRzL3JlY2VpdmVzIG1lc3NhZ2VzLiAoU2FtZSBvYmplY3QgdXNlZCBmb3IKKwlib3RoIGNsaWVudCBhbmQgc2VydmVyLikKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5oLCBkYnVzL2RidXMtdHJhbnNwb3J0LmM6CisJQmFzaWMgYWJzdHJhY3Rpb24gZm9yIGRpZmZlcmVudCBraW5kcyBvZiBzdHJlYW0KKwl0aGF0IHdlIG1pZ2h0IHJlYWQvd3JpdGUgbWVzc2FnZXMgZnJvbS4KKworMjAwMi0xMS0yMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oIChfREJVU19JTlRfTUFYKTogYWRkIF9EQlVTX0lOVF9NSU4KKwlfREJVU19JTlRfTUFYCisKKwkqIGRidXMvZGJ1cy10ZXN0LmMgKG1haW4pOiBhZGQgbGlzdCB0ZXN0LCBhbmQgaW5jbHVkZQorCWRidXMtdGVzdC5oIGFzIGludGVuZGVkCisKKwkqIGRidXMvZGJ1cy1oYXNoLmMgKF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3N0cmluZykKKwkoX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfaW50KTogcmV0dXJuIHZhbHVlIGluZGljYXRlcworCXdoZXRoZXIgdGhlIGVudHJ5IGV4aXN0ZWQgdG8gcmVtb3ZlCisKKwkqIGRidXMvZGJ1cy1saXN0LmM6IGFkZCBsaW5rZWQgbGlzdCB1dGlsaXR5IGNsYXNzLAorCXdpdGggZG9jcyBhbmQgdGVzdHMKKworCSogZGJ1cy9kYnVzLWhhc2guYzogYWRkIFRPRE8gaXRlbSBhYm91dCBzaHJpbmtpbmcgdGhlIGhhc2ggYnVja2V0CisJYXJyYXkgc29tZXRpbWVzLgorCisyMDAyLTExLTIzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBEb3h5ZmlsZS5pbiAoSU5DTFVERV9GSUxFX1BBVFRFUk5TKTogZXhwYW5kIERCVVNfQkVHSU5fREVDTFMvCisJREJVU19FTkRfREVDTFMgdG8gbm90aGluZywgdGhhdCBzaG91bGQgZml4IHRoaXMgb25jZSBhbmQgZm9yIGFsbAorCisJKiBEb3h5ZmlsZS5pbiAoSkFWQURPQ19BVVRPQlJJRUYpOiBzZXQgdG8gWUVTCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMsIGRidXMvZGJ1cy1oYXNoLmM6CisJYWRkIHNvbWUgbWlzc2luZyBAYnJpZWYKKworMjAwMi0xMS0yMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDogcHV0IHNlbWljb2xvbnMgYWZ0ZXIgREVCVUdfQkVHSU5fREVDTFMKKwl0byBhdm9pZCBjb25mdXNpbmcgRG94eWdlbgorCisJKiBkYnVzL2RidXMtaGFzaC5jOiBAfSBub3QgfUAKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoc3RydWN0IERCdXNNZXNzYWdlKTogc3BsaXQgb3V0CisJaW50ZXJuYWxzIGRvY3MKKworMjAwMi0xMS0yMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogY29uZmlndXJlLmluOiBwaWxlIG9uIG1vcmUgd2FybmluZyBmbGFncyBpZiB1c2luZyBnY2MKKworCSogRG94eWZpbGUuaW4gKEVYVFJBQ1RfU1RBVElDKTogc2V0IHRvIE5PLCBzbyB3ZSBkb24ndCBoYXZlCisJdG8gZG9jdW1lbnQgc3RhdGljIGZ1bmN0aW9ucworCisJKiBjb25maWd1cmUuaW46IGFkZCBzdW1tYXJ5IHRvIGVuZCBvZiBjb25maWd1cmUgc28gaXQKKwlsb29rcyBuaWNlIGFuZCBhdHRyYWN0aXZlCisKKwkqIGRidXMvZGJ1cy1oYXNoLmM6IGZpbmlzaCBpbXBsZW1lbnRhdGlvbiBhbmQgd3JpdGUgdW5pdAorCXRlc3RzIGFuZCBkb2NzCisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIC0tZW5hYmxlLXRlc3RzIHRvIGVuYWJsZSB1bml0IHRlc3RzCisKKwkqIGRidXMvZGJ1cy10ZXN0LmM6IHRlc3QgcHJvZ3JhbSB0byBydW4gdW5pdCB0ZXN0cworCWZvciBhbGwgZmlsZXMgaW4gZGJ1cy8qLCBpbml0aWFsbHkgcnVucyBhIHRlc3QgZm9yCisJZGJ1cy1oYXNoLmMKKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oOiBmaWxlIHRvIGhvbGQgc29tZSBpbnRlcm5hbCB1dGlsaXR5IHN0dWZmCisKKzIwMDItMTEtMjIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtaGFzaC5jOiBjb3B5IGluIFRjbCBoYXNoIHRhYmxlLCBub3QgeWV0CisJInBvcnRlZCIgYXdheSBmcm9tIFRjbAorCisJKiBkYnVzL2RidXMtdHlwZXMuaDogaGVhZGVyIGZvciB0eXBlcyBzdWNoIGFzIGRidXNfYm9vbF90CisKKzIwMDItMTEtMjIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMuaDogZml4dXBzIGZvciBkb2Mgd2FybmluZ3MKKworCSogRG94eWZpbGUuaW4gKEZJTEVfUEFUVEVSTlMpOiB3ZSBuZWVkIHRvIHNjYW4gLmggdG8gcGljayB1cAorCW1hY3JvcworCShRVUlFVCk6IG1ha2UgaXQgcXVpZXQgc28gd2UgY2FuIHNlZSB3YXJuaW5ncworCisJKiBkYnVzL2RidXMtbWVtb3J5LmM6IHRlYWNoIEQtQlVTIHRvIGFsbG9jYXRlIGFuZCBmcmVlIG1lbW9yeQorCisyMDAyLTExLTIyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogTWFrZWZpbGUuYW06IGluY2x1ZGUgIkRveHlmaWxlIiB0YXJnZXQgaW4gYWxsLWxvY2FsCisKKwkqIGNvbmZpZ3VyZS5pbjogZ2VuZXJhdGUgdGhlIERveHlmaWxlCisKKwkqIERveHlmaWxlLmluOiBtb3ZlIERveHlmaWxlIGhlcmUsIHNvIHdlIGNhbiB1c2UKKwljb25maWd1cmUgdG8gZ2VuZXJhdGUgYSBEb3h5ZmlsZSB3aXRoIHRoZSByaWdodAorCXZlcnNpb24gbnVtYmVyIGV0Yy4KKworMjAwMi0xMS0yMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IG1vdmUgaW5saW5lIGRvY3MgaW50byAuYyBmaWxlCisKKwkqIERveHlmaWxlIChPVVRQVVRfRElSRUNUT1JZKTogbW92ZSBvdXRwdXQgdG8gZG9jL2FwaQorCXNvIGFsbCBkb2NzIGFyZSB1bmRlciBkb2MvCisJKE1BTl9FWFRFTlNJT04pOiBnZW5lcmF0ZSBtYW4gcGFnZXMuIFVzZSBleHRlbnNpb24KKwkiLjNkYnVzIiB3aGljaCBtYXRjaGVzICIuM3F0IiBvbiBteSBzeXN0ZW0sCisJSSBndWVzcyB0aGlzIGlzIE9LLCBJIGRvbid0IGtub3cgcmVhbGx5LgorCShGSUxFX1BBVFRFUk5TKTogbG9vayBmb3IgLmMgZmlsZXMgbm90IC5oLCBtYWtlcyBzZW5zZQorCWZvciBwbGFpbiBDIEkgdGhpbmsKKworMjAwMi0xMS0yMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogTWFrZWZpbGUuYW0gKFNVQkRJUlMpOiByZW5hbWUgc3ViZGlyICJzZXJ2ZXIiIHRvICJidXMiCisJYmVjYXVzZSBhbnkgYXBwIGNhbiBiZSBhIHNlcnZlciwgYW5kIGFueSBhcHAgY2FuIGJlIGEgY2xpZW50LAorCXRoZSBidXMgaXMgYSBzcGVjaWFsIGtpbmQgb2Ygc2VydmVyLgorCitUaHUgTm92IDIxIDIzOjM1OjMxIDIwMDIgIFphY2sgUnVzaW4gIDx6YWNrQGtkZS5vcmc+CisKKwkqIERveHlmaWxlIDogYWRkaW5nLiBTdGlsbCBuZWVkcyBNYWtlZmlsZSBydWxlcyB0byBiZSBnZW5lcmF0ZWQKKwlhdXRvbWF0aWNhbGx5IChqdXN0IHJ1biAiZG94eWdlbiIgaW4gdGhlIHRvcGxldmVsIGRpciBmb3Igbm93IHRvCisJZ2VuZXJhdGUgZG9jcykKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaCA6IEFkZGluZyBzYW1wbGUgZG9jcyAoamF2YWRvYyBzaW5jZQorCXJlc2VtYmxlcyBndGstZG9jIGEgbGl0dGxlIG1vcmUpCisKKwkqIGRidXMvZGJ1cy5oIDogQWRkaW5nIHNhbXBsZSBkb2NzCisKKzIwMDItMTEtMjEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL01ha2VmaWxlLmFtIChJTkNMVURFUyk6IGRlZmluZSBEQlVTX0NPTVBJTEFUSU9OCisJc28gd2UgY2FuIGFsbG93IG91cnNlbHZlcyB0byBpbmNsdWRlIGZpbGVzIGRpcmVjdGx5LAorCWluc3RlYWQgb2YgaGF2aW5nIHRvIHVzZSBkYnVzLmgKKworCSogZGJ1cy9kYnVzLmg6IGZpbGwgaW4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDogc2tldGNoIG91dCBhIHNhbXBsZSBoZWFkZXIgZmlsZS4KKwlJbmNsdWRlIGdyaXBpbmcgaWYgeW91IGluY2x1ZGUgaXQgZGlyZWN0bHkgaW5zdGVhZCBvZgorCXZpYSBkYnVzLmgKKworCSogZGJ1cy9kYnVzLW1hY3Jvcy5oOiBuZXcgZmlsZSB3aXRoIG1hY3JvcyBmb3IgZXh0ZXJuICJDIiwKKwlUUlVFL0ZBTFNFLCBOVUxMLCBldGMuCisKKwkqIGRvYy9maWxlLWJvaWxlcnBsYXRlLmM6IHB1dCBpbmNsdWRlIGd1YXJkcyBpbiBoZXJlCisKKzIwMDItMTEtMjEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvZmlsZS1ib2lsZXJwbGF0ZS5jOiBpbmNsdWRlIGJvdGggQUZMIGFuZCBHUEwgYm9pbGVycGxhdGUuCisKKwkqIENPUFlJTkc6IGluY2x1ZGUgdGhlIEdQTCBhcyB3ZWxsLCBhbmQgbGljZW5zZSBjb2RlCisJdW5kZXIgYm90aCBBRkwgYW5kIEdQTC4KKworMjAwMi0xMS0yMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGFjY29uZmlnLmg6IGdldCByaWQgb2YgdGhpcworCisJKiBhdXRvZ2VuLnNoIChydW5fY29uZmlndXJlKTogYWRkIC0tbm8tY29uZmlndXJlIG9wdGlvbgorCisJKiBjb25maWd1cmUuaW46IHJlbW92ZSBBQ19BUkdfUFJPR1JBTSB0byBtYWtlCisJYXV0b2NvbmYgY29tcGxhaW4gbGVzcy4gYWRkIEFDX1BSRVJFUS4KKwlhZGQgQUNfREVGSU5FIHRoaXJkIGFyZy4KKworMjAwMi0xMS0yMSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRvYy9NYWtlZmlsZS5hbToKKwlGaXggcmVmZXJlbmNlcyBzbyB3ZSBjYW4gZGlzdGNoZWNrLgorCisyMDAyLTExLTIxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogSW5pdGlhbCBtb2R1bGUgY3JlYXRpb24KKwpkaWZmIC0tZ2l0IGEvZGJ1cy9DaGFuZ2VMb2cucHJlLTEtMiBiL2RidXMvQ2hhbmdlTG9nLnByZS0xLTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIyMDQ0OAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvQ2hhbmdlTG9nLnByZS0xLTIKQEAgLTAsMCArMSwyMDI3IEBACisyMDA4LTA0LTA0ICBKb2huIChKNSkgUGFsbWllcmkgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIFJlbGVhc2VkIDEuMi4xCisKKzIwMDgtMDQtMDMgIEpvaG4gKEo1KSBQYWxtaWVyaSA8am9obnBAcmVkaGF0LmNvbT4KKworCVBhdGNoIGZyb20gU3VtaXQgPHN1bWl0c2tqXzIwQHlhaG9vLmNvbT4sIGNvbW1lbnRzIGFkZGVkCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYyhfZGJ1c190cmFuc3BvcnRfb3Blbik6IGZpeCBtZW0gbGVhaworCisyMDA4LTA0LTAzICBKb2huIChKNSkgUGFsbWllcmkgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9zZW5kKTogYWRkIGRvY3VtZW50YXRpb24KKwkgIHRvIGRlc2NyaWJlIHdoZW4gdG8gY2FsbCBkYnVzX2Nvbm5lY3Rpb25fZmx1c2ggYW5kCisJICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgYWZ0ZXIgYSBjYWxsIHRvIGRidXNfY29ubmVjdGlvbl9zZW5kIGlzIG1hZGUKKwkgIEluaXRpYWwgd29yZGluZyBieSBTdGFuaXNsYXYgQnJhYmVjIDxzYnJhYmVjIGF0IHN1c2UuY3o+IAorCSAgKGZkLm8gYnVnIzEzNTU4KQorCisyMDA4LTA0LTAzICBKb2huIChKNSkgUGFsbWllcmkgPGpvaG5wQHJlZGhhdC5jb20+CisKKwlQYXRjaCBmcm9tIEtpbW1vIEjDpG3DpGzDpGluZW4gPGtpbW1vLmhhbWFsYWluZW4gYXQgbm9raWEuY29tPgorCisJKiBidXMvZXhwaXJlbGlzdC5jCisJICAoZG9fZXhwaXJhdGlvbl93aXRoX2N1cnJlbnRfdGltZSk6IGNhbGN1bGF0ZSBjb3JyZWN0IG1pbiB3YWl0IHRpbWUKKwkgIGFuZCBuZXh0IGludGVydmFsCisJICAoYnVzX2V4cGlyZV9saXN0X2FkZCwgYnVzX2V4cGlyZV9saXN0X2FkZF9saW5rKTogaWYgdGhlIHRpbWVvdXQgaXMgCisJICBkaXNhYmxlZCB3aGVuIHdlIGFkZCBhbiBpdGVtIHRvIHRoZSBleHBpcmUgbGlzdCwgZW5hYmxlIHRoZSB0aW1lb3V0CisJICAoZG9fZXhwaXJhdGlvbl93aXRoX2N1cnJlbnRfdGltZSk6IG9ubHkgc2V0IHRpbWVvdXQgaWYgdGhlcmUgYXJlCisJICBpdGVtcyB0byBleHBpcmUKKworMjAwOC0wNC0wMSAgVGltbyBIb2VuaWcgIDx0aG9lbmlnQHN1c2UuZGU+CisKKwlQYXRjaCBmcm9tIEZyZWRlcmljIENyb3phdCA8ZmNyb3phdEBtYW5kcml2YS5jb20+CisKKwkqIGJ1cy9kaXItd2F0Y2gtaW5vdGlmeS5jIChidXNfd2F0Y2hfZGlyZWN0b3J5KTogT25seSBtb25pdG9yCisJICBJTl9DTE9TRV9XUklURSwgSU5fREVMRVRFLCBJTl9NT1ZFX1RPIGFuZCBJTl9NT1ZFX0ZST00gZXZlbnRzLiBUaGlzCisJICB3YXksIG9ubHkgYXRvbWljIGNoYW5nZXMgdG8gY29uZmlndXJhdGlvbiBmaWxlIGFyZSBtb25pdG9yZWQuCisJKiBidXMvZGlyLXdhdGNoLWlub3RpZnkuYyAoX2hhbmRsZV9pbm90aWZ5X3dhdGNoKTogRml4IHR5cG8gaW4KKwkgIF9kYnVzX3ZlcmJvc2UgZnVuY3Rpb24gY2FsbAorCSogYnVzL2Rpci13YXRjaC1pbm90aWZ5LmMgKGJ1c19kcm9wX2FsbF9kaXJlY3Rvcnlfd2F0Y2hlcyk6IFVzZQorCSAgX2RidXNfc3RyZXJyb3IgaW5zdGVhZCBvZiBwZXJyb3IKKworMjAwOC0wMy0wNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9jb25uZWN0aW9uLmMsIGJ1cy9leHBpcmVsaXN0LmM6IE1ha2UgdGhlIEJ1c0V4cGlyZUxpc3QKKwlzdHJ1Y3Qgb3BhcXVlLCBhZGRpbmcgYWNjZXNzb3JzIGZvciBtYW5pcHVsYXRpbmcgdGhlIGxpc3QuIEluIHRoaXMKKwljb21taXQgdGhlcmUgc2hvdWxkIGJlIG5vIGNoYW5nZSBpbiBmdW5jdGlvbmFsaXR5IG9yIGJlaGF2aW9yLiBUaGUKKwlwdXJwb3NlIG9mIHRoaXMgY2hhbmdlIGlzIHRvIGltcHJvdmUgZW5jYXBzdWxhdGlvbiBwcmlvciB0byBmaXhpbmcKKwlzb21lIGJ1Z3MgS2ltbW8gSMOkbcOkbMOkaW5lbiBmb3VuZCB3aGVyZSB0aGUgdGltZW91dCBpcyBub3QgcHJvcGVybHkKKwl1cGRhdGVkLCBzaW5jZSB3ZSBuZWVkIHRvIGUuZy4gdGFrZSBzb21lIGFjdGlvbiB3aGVuZXZlciBhZGRpbmcKKwlhbmQgcmVtb3Zpbmcgc3R1ZmYgZnJvbSB0aGUgZXhwaXJlIGxpc3QuCisKKzIwMDgtMDMtMzEgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwlQYXRjaCBmcm9tIE93ZW4gVGF5bG9yIDxvdGF5bG9yQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLXgxMS5jOiBDaGVjayBmb3IgWDExIGV2ZW50cyBiZWZvcmUKKwlzZWxlY3RpbmcgKEZETyBidWcgIzE1MjkzKQorCisyMDA4LTAzLTMxICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJUGF0Y2ggZnJvbSBPd2VuIFRheWxvciA8b3RheWxvckByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLWxhdW5jaC14MTEuYzogTWFrZSBzdXJlIHdlIGNhbGwgWEZsdXNoKCkKKwlvbiBhbGwgY29kZSBwYXRocyAoRkRPIGJ1ZyAjMTUyOTMpCisKKzIwMDgtMDMtMjcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLXNlbmQuYyAoYXBwZW5kX2RpY3QpOiBEbyBub3QgcHJvdmlkZSBhIHNpZ25hdHVyZSB0bworCWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyKCkgd2hlbiBvcGVuaW5nIGEgZGljdCBlbnRyeS4KKworMjAwOC0wMy0yNiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCVBhdGNoIGZyb20gU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAbmV0c3BsaXQuY29tPgorCisJKiBkYnVzL2RidXMtYnVzLmM6IFNldCBkZWZhdWx0IGV4aXRfb25fZGlzY29ubmVjdCBhZnRlciByZWdpc3RyYXRpb24gd2l0aAorCXRoZSBidXMsIG5vdCBiZWZvcmUuICBUaGlzIGVuc3VyZXMgdGhhdCBwcm9ncmFtcyB3aGljaCB3aXNoIHRvIHNldAorCWV4aXRfb25fZGlzY29ubmVjdCB0byBGQUxTRSB3aWxsIG5vdCBiZSB0ZXJtaW5hdGVkIGlmIHRoZSBidXMgZXhpdHMKKwlkdXJpbmcgcmVnaXN0cmF0aW9uLiAgKEZETyBCdWcgIzE1MTEyKQorCisyMDA4LTAzLTA0ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBmaXggYnJva2VuIHBvbGwgb24gTWFjIE9TWCAtIGJ1aWxkIHBhdGNoIGJ5IEJlbmphbWluIFJlZWQKKwkqIGNvbmZpZ3VyZS5pbjogY2hlY2sgZm9yIE9TWCdzIGRlYWRsb2NraW5nIHBvbGwKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYyAoX2RidXNfcG9sbCk6IGlmIHdlIGhhdmUgYSBicm9rZW4gcG9sbAorCSAgZG9uJ3QgdXNlIHBvbGwKKworMjAwOC0wMy0wNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY2hlY2sgaWYgdGhlIGxpbmtlciBzdXBwb3J0cyBhIGZsYWcgaW5zdGVhZCBvZiBqdXN0IGNoZWNraW5nIGZvciBHTlUKKwkgIGxkCisJKiBjb25maWd1cmUuaW46IG1vdmUgQU1fUFJPR19MSUJUT09MIHRvIHRoZSB0b3AKKwkgIChsZF9zdXBwb3J0c19mbGFnKTogbmV3IGZ1bmN0aW9uIGZvciBjaGVja2luZyBpZiB0aGUgbGlua2VyIHN1cHBvcnRzCisJICBhIGdpdmVuIGZsYWcKKworMjAwOC0wMy0wNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogYWRkIGEgY2hhbmdlbG9nIGZvciBCZW5qYW1pbiBSZWVkJ3MgZ2l0IHBhdGNoIFJBTlQ6IENoYW5nZSBMb2dzIGFyZQorCSAgaGFuZGxlZCBieSBnaXQgYW5kIGhhdmluZyBhbiBleHRlcm5hbCBjaGFuZ2Vsb2cganVzdCBzY3Jld3MgdXAKKwkgIG1lcmdpbmcuICBXZSBzaG91bGQgd3JpdGUgZG93biBydWxlcyBmb3IgZG9pbmcgZ2l0IGNvbW1pdCBtZXNzYWdlcworCSAgYW5kIGxlYXZlIGl0IGF0IHRoYXQuCisJKiBjb25maWd1cmUuaW46IFBsYXRmb3JtIGJ1aWxkIGZpeGVzIGZvciBNYWMgT1MgWAorCSAgdGhlIERhcndpbiBsaW5rZXIgZG9lcyBub3QgdW5kZXJzdGFuZCB0aGUgLXogb3B0aW9uOyB3cmFwIGl0IGluIAorCSAgYSBjaGVjayBmb3IgJHdpdGhfZ251X2xkLgorCSAgZW52aXJvbiBpcyBvbmx5IGF2YWlsYWJsZSBhdCBydW50aW1lLCBzbyB5b3UgbmVlZCB0byBtYWtlIGEKKwkgIHJlZmVyZW5jZSB0byBfTlNHZXRFbnZpcm9uIGluc3RlYWQgZm9yIHN5bWJvbHMgdG8gcmVzb2x2ZSBwcm9wZXJseS4KKworMjAwOC0wMy0wNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBhZGQgJFRIUkVBRF9MSUJTIHRvIERCVVNfTEFVTkNIRVJfTElCUyBzbyB3ZSBsaW5rIAorCSAgY29ycmVjdGx5CisKKzIwMDgtMDMtMDQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLmM6IHdyYXAgWCdpc20gaW4gI2lmZGVmIHNvIHdlIGNhbiBjb21waWxlIAorCSAgd2l0aG91dCBYCisKKzIwMDgtMDItMjggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYzogZGVmaW5lIF9BSV9BRERSQ09ORklHIGFzIDAgaWYgbm90CisJICBkZWZpbmVkIHNvIHRoYXQgd2UgY2FuIGNvbXBpbGUgd2l0aCBhbiBvbGRlciBnbGliYyAKKworMjAwOC0wMi0yNiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogUmVsZWFzZWQgMS4xLjIwCisKKzIwMDgtMDItMjYgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIENWRS0yMDA4LTA1OTUgLSBzZWN1cml0eSBwb2xpY3kgb2YgdGhlIHR5cGUgPGFsbG93IHNlbmRfaW50ZXJmYWNlPQorCSAgInNvbWUuaW50ZXJmYWNlLldpdGhNZXRob2RzIi8+IHdvcmsgYXMgYW4gaW1wbGljaXQgYWxsb3cgZm9yCisJICBtZXNzYWdlcyBzZW50IHdpdGhvdXQgYW4gaW50ZXJmYWNlIGJ5cGFzc2luZyB0aGUgZGVmYXVsdCBkZW55IHJ1bGVzCisJICBhbmQgcG90ZW50aWFsbHkgYWxsb3dpbmcgcmVzdHJpY3RlZCBtZXRob2RzIGV4cG9ydGVkIG9uIHRoZSBidXMgdG8gYmUKKwkgIGV4ZWN1dGVkIGJ5IHVuYXV0aG9yaXplZCB1c2Vycy4gIFRoaXMgcGF0Y2ggZml4ZXMgdGhlIGlzc3VlLgorCSogYnVzL3BvbGljeS5jIChidXNfY2xpZW50X3BvbGljeV9jaGVja19jYW5fc2VuZCwKKwkgIGJ1c19jbGllbnRfcG9saWN5X2NoZWNrX2Nhbl9yZWNlaXZlKTogc2tpcCBtZXNzYWdlcyB3aXRob3V0IGFuIAorCSAgaW50ZXJmYWNlIHdoZW4gZXZhbHVhdGluZyBhbiBhbGxvdyBydWxlLCBhbmQgdGh1cyBwYXNzIGl0IHRvIHRoZQorCSAgZGVmYXVsdCBkZW55IHJ1bGVzCisKKzIwMDgtMDItMjYgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvcnJlY3RseSB1bnJlZiBjb25uZWN0aW9ucyB3aXRob3V0IGd1aWRzIGR1cmluZyBzaHV0ZG93bgorCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoY2xvc2VfY29ubmVjdGlvbl9vbl9zaHV0ZG93bik6IG5ldyBtZXRob2QKKwkgIHNwbGl0IG91dCBmcm9tIHNoYXJlZF9jb25uZWN0aW9uc19zaHV0ZG93bgorCSAgKHNoYXJlZF9jb25uZWN0aW9uc19zaHV0ZG93bik6IHNodXRkb3duIGFsbCBzaGFyZWQgY29ubmVjdGlvbnMKKwkgIHdpdGhvdXQgZ3VpZHMKKwkgIChfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCk6IGhhbmRsZSBPT00gd2hlbiBwcmVwZW5kaW5nIG5vIGd1aWQKKwkgIGNvbm5lY3Rpb25zIHRvIHRoZSBzaGFyZWRfY29ubmVjdGlvbnNfbm9fZ3VpZCBsaXN0CisJKiBQYXRjaCBieSAgS2ltbW8gSMOkbcOkbMOkaW5lbiA8a2ltbW8gZG90IGhhbWFsYWluZW4gYXQgbm9raWEgZG90IGNvbT4KKworMjAwOC0wMi0yMSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKwkKKwkqIGZpeCBidWlsZCBhZ2FpbnN0IHRoZSBsYXRlc3QgZ2NjL2dsaWJjCisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmM6IGRlZmluZSBfR05VX1NPVVJDRQorCSogYnVzL3NlbGludXguYzogaW5jbHVkZSBsaW1pdHMuaAorCSogUGF0Y2ggYnkgTWF0dGhpYXMgQ2xhc2VuIDxtY2xhc2VuIGF0IHJlZGhhdC5jb20+CisKKzIwMDgtMDItMjEgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGZpeGVzIGRidXMtbGF1bmNoIHNvIHRoZSBidXMgZ29lcyBhd2F5IHdoZW4gWCBkb2VzCisJICAoUmVkIEhhdCBCdWcgIzQzMDQxMikKKwkqIHRvb2xzL2RidXMtbGF1bmNoLmMgKG1haW4pOiBzZXQgeGRpc3BsYXkgPSBOVUxMCisJKiBQYXRjaCBieSBNYXR0aGlhcyBDbGFzZW4gPG1jbGFzZW4gYXQgcmVkaGF0LmNvbT4KKworMjAwOC0wMS0xNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKwkKKwkqIFJlbGVhc2VkIDEuMS40CisKKzIwMDgtMDEtMTcgIFRpbW8gSG9lbmlnICA8dGhvZW5pZ0BzdXNlLmRlPgorCSogZml4IGlub3RpZnkgc3VwcG9ydAorCSogYnVzL2Rpci13YXRjaC1pbm90aWZ5LmMgKF9oYW5kbGVfaW5vdGlmeV93YXRjaCk6IGZpeCByZWFkaW5nIG9mIHRoZQorCWlub3RpZnkgZXZlbnRzLiBBbHNvLCB1c2Ugc3NpemVfdCBub3Qgc2l6ZV90IGZvciAncmV0Jy4KKwkqIGJ1cy9kaXItd2F0Y2gtaW5vdGlmeS5jIChidXNfd2F0Y2hfZGlyZWN0b3J5KTogd2F0Y2ggbm90IG9ubHkgZm9yCisJSU5fTU9ESUZZIGJ1dCBhbHNvIGZvciBJTl9DUkVBVEUgYW5kIElOX0RFTEVURQorCSogYnVzL2Rpci13YXRjaC1pbm90aWZ5LmMgKGJ1c19kcm9wX2FsbF9kaXJlY3Rvcnlfd2F0Y2hlcyk6IGRyb3AgdGhlCisJaW5vdGlmeSB3YXRjaGVzIG1vcmUgZWxlZ2FudGx5IGJ5IGNsb3NpbmcgaW5vdGlmeTpfZmQsIHNldCBpbm90aWZ5X2ZkIHRvCisJLTEgYWZ0ZXIgZHJvcHBpbmcgdGhlIHdhdGNoZXMKKworMjAwOC0wMS0xNSBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IHBvc3QtcmVsZWFzZSB2ZXJzaW9uIGJ1bXAKKworMjAwOC0wMS0xNSBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBSZWxlYXNlZCAxLjEuMyAoMS4yLjBSQzEpCisKKzIwMDgtMDEtMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGZpeCBoYWNraW5nIHRvIHNheSBnaXQgaW5zdGVhZCBvZiBjdnMKKworMjAwOC0wMS0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcGF0Y2ggYnkgU8OpYmFzdGllbiBDb3VyZXQgPDEwZnVuY3Rpb24gYXQgZ21haWwgZG90IGNvbT4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmMgKGFsbF9yZWFkZXJfY2xhc3Nlc1tdKTogd3JhcCBpbiAKKwkjaWZuZGVmIERCVVNfRElTQUJMRV9BU1NFUlQgc2luY2UgaXQgaXMgb25seSB1c2VkIGluIGFzc2VydHMgd2hpY2gKKwlhcmUgbm9vcAorCisyMDA4LTAxLTE1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBwYXRjaCBieSBNYWdudXMgSGVub2NoIDxoZW5vY2ggcGx1cyBiZmRvIGF0IGR0ZWsgZG90IGNoYWxtZXJzIGRvdCBzZT4KKworCSogZGJ1cy9kYnVzLWF1dGguYyAoaGFuZGxlX3NlcnZlcl9kYXRhX2V4dGVybmFsX21lY2gpOiBoYW5kbGUgU0FTTAorCUVYVEVSTkFMJ3MgaW5pdGFsIGVtcHR5IHJlc3BvbmNlIChGRE8gQnVnICM5OTQ1KQorCisyMDA4LTAxLTE1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBidXMvbWVzc2FnZWJ1cy5pbjogYWRkIGxzYiBoZWFkZXJzIChGRE8gQnVnICMxMTQ5MSkKKworMjAwOC0wMS0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcGF0Y2ggYnkgUGV0ZXIgTydHb3JtYW4gPHBvZ21hIGF0IHRoZXdyaXR0ZW53b3JkIGRvdCBjb20+CisKKwkqIGRidXMvZGJ1cy1zcGF3bi5jIChiYWJ5c2l0X3NpZ25hbF9oYW5kbGVyKTogY2hlY2sgd3JpdGUgcmV0dXJuIHZhbHVlCisJc28gd2UgZG9uJ3QgaGFuZyAoRkRPIEJ1ZyAjMTE2NjUpCisKKzIwMDgtMDEtMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHBhdGNoIGJ5IFBldGVyIE8nR29ybWFuIDxwb2dtYSBhdCB0aGV3cml0dGVud29yZCBkb3QgY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5oOiBzdXBwb3J0IGZvciBBSVggcG9sbCBpbXBsZW1lbnRhdGlvbiAoRkRPIEJ1ZyAKKwkjMTE2NjYpCisKKzIwMDgtMDEtMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHRlc3RzL25hbWUtdGVzdC9ydW4tdGVzdC5zaDogbWFrZSBtb3JlIHBvcnRhYmxlIChGRE8gQnVnICMxMTY2NykKKworMjAwOC0wMS0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcGF0Y2ggYnkgS2ltbW8gSMOkbcOkbMOkaW5lbiA8a2ltbW8gZG90IGhhbWFsYWluZW4gYXQgbm9raWEgZG90IGNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoX2RidXNfY29ubmVjdGlvbl9nZXRfbmV4dF9jbGllbnRfc2VyaWFsKToKKwlkb24ndCBjaGVjayBmb3IgPCAwIG9uIGFuIHVuc2lnbmVkIHZhcmlhYmxlIChGRE8gQnVnICMxMjkyNCkKKworMjAwOC0wMS0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKwkKKwkqIHBhdGNoIGJ5IEtpbW1vIEjDpG3DpGzDpGluZW4gPGtpbW1vIGRvdCBoYW1hbGFpbmVuIGF0IG5va2lhIGRvdCBjb20+CisKKwkqIGJ1cy9idXMuYyAoc2V0dXBfc2VydmVyKTogY2hlY2sgZmFpbGVkIGFsbG9jYXRpb24gKEZETyBCdWcgIzEyOTIwKQorCQorMjAwOC0wMS0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKwkKKwkqIHBhdGNoIGJ5IEtpbW1vIEjDpG3DpGzDpGluZW4gPGtpbW1vIGRvdCBoYW1hbGFpbmVuIGF0IG5va2lhIGRvdCBjb20+CisKKwkqIGRidXMvZGJ1cy1zcGF3bi5jIChfZGJ1c19zcGF3bl9hc3luY193aXRoX2JhYnlzaXR0ZXIpOiB0aGUgQVBJIAorCWNvbnRyYWN0IHNheXMgc2l0dGVyX3AgY2FuIGJlIE5VTEwsIHNvIGxldCdzIGNoZWNrIGl0IChGRE8gQnVnICMxMjkxOSkKKworMjAwOC0wMS0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKwkKKwkqIHBhdGNoIGJ5IEtpbW1vIEjDpG3DpGzDpGluZW4gPGtpbW1vIGRvdCBoYW1hbGFpbmVuIGF0IG5va2lhIGRvdCBjb20+CisKKwkqIGRidXMvZGJ1cy1zcGF3bi5jIChyZWFkX2ludHMsIHJlYWRfcGlkKTogdXNlIGNvcnJlY3Qgc3NpemVfdCB0eXBlCisJaW5zdGVhZCBvZiBzaXplX3QgKEZETyBCdWcgIzEyODYyKQorCisyMDA4LTAxLTE1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCQorCSogcGF0Y2ggYnkgS2ltbW8gSMOkbcOkbMOkaW5lbiA8a2ltbW8gZG90IGhhbWFsYWluZW4gYXQgbm9raWEgZG90IGNvbT4KKworCSogZGJ1cy9kYnVzLWVycm9ycy5jIChkYnVzX3NldF9lcnJvcik6IG1ha2Ugc3VyZSB0byBjYWxsIHZhX2VuZCBpZiB3ZQorCWhpdCBhbiBPT00gZXJyb3IgaW5zaWRlIHZhX3N0YXJ0IChGRE8gQnVnICMxMjg0NikKKworMjAwOC0wMS0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKwkKKwkqIHBhdGNoIGJ5IEtpbW1vIEjDpG3DpGzDpGluZW4gPGtpbW1vIGRvdCBoYW1hbGFpbmVuIGF0IG5va2lhIGRvdCBjb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkpOiAKKwlmaXggcG9zc2libGUgY3Jhc2ggaWYgcGVuZGluZ19yZXR1cm4gaXMgTlVMTCAoRkRPIEJ1ZyAjMTI2NzMpCisKKzIwMDgtMDEtMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHBvcnRpb25zIG9mIHBhdGNoIHN1Ym1pdHRlZCBieSBUaW0gTW9vbmV5IAorCTxlbmNoYW50ZXIgYXQgdXNlcnMgZG90IHNvdXJjZWZvcmdlIGRvdCBuZXQ+CisKKwkqIGNvbmZpZ3VyZS5pbjogbmV2ZXIgYXV0by1zZWxlY3QgbGlieG1sIChGRE8gQnVnICMxMjQ3OSkKKworMjAwOC0wMS0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcGF0Y2hlcyBieSBLaW1tbyBIw6Rtw6Rsw6RpbmVuIDxraW1tbyBkb3QgaGFtYWxhaW5lbiBhdCBub2tpYSBkb3QgY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4IChfZGJ1c19nZXRfYXV0b2xhdW5jaF9hZGRyZXNzKTogaGFuZGxlIE9PTQorCShGRE8gQnVnICMxMjk0NSkKKworCSogZGJ1cy9kYnVzLXV1aWRnZW4uYyAocmV0dXJuX3V1aWQpOiBoYW5kbGUgT09NIChGRE8gQnVnICMxMjkyOCkKKworCSogZGJ1cy9kYnVzLW1pc2MuYyAoZGJ1c19nZXRfbG9jYWxfbWFjaGluZV9pZCk6IGhhbmRsZSBPT00sIGZpeCByZXR1cm4KKwl2YWx1ZSB0byByZXR1cm4gTlVMTCBub3QgRkFMU0UgKEZETyBCdWcgIzEyOTQ2KQorCisyMDA4LTAxLTE1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X2NoZWNrX3NlY3VyaXR5X3BvbGljeSk6IHJld3JpdGUgc2VsaW51eCBlcnJvcgorCWhhbmRsaW5nIHRvIG5vdCBhYm9ydCBkdWUgdG8gYSBOVUxMIHJlYWQgYW5kIHRvIHNldCB0aGUgZXJyb3Igb25seSBpZgorCWl0IGlzIG5vdCBhbHJlYWR5IHNldCAoQmFzZWQgb2ZmIG9mIEZETyBCdWcgIzEyNDMwKQorCisyMDA4LTAxLTE1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBwYXRjaCBieSBLaW1tbyBIw6Rtw6Rsw6RpbmVuIDxraW1tbyBkb3QgaGFtYWxhaW5lbiBhdCBub2tpYSBkb3QgY29tPgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmMgKF9kYnVzX3JlYWRfdXVpZF9maWxlX3dpdGhvdXRfY3JlYXRpbmcsCisJX2RidXNfY3JlYXRlX3V1aWRfZmlsZV9leGNsdXNpdmVseSk6IGFkZCBPT00gaGFuZGxpbmcgKEZETyBCdWcgIzEyOTUyKQorCisyMDA4LTAxLTE1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBwYXRjaCBieSBLaW1tbyBIw6Rtw6Rsw6RpbmVuIDxraW1tbyBkb3QgaGFtYWxhaW5lbiBhdCBub2tpYSBkb3QgY29tPgorCisJKiBkYnVzL2RidXMtc3Bhd24uYyAoYmFieXNpdCwgYmFieXNpdHRlcl9pdGVyYXRpb24pOiBhZGQgZXJyb3IKKwloYW5kbGluZyB3aGVuIHBvbGxpbmcgKEZETyBCdWcgIzEyOTU0KSAKKworMjAwOC0wMS0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcGF0Y2ggYnkgS2ltbW8gSMOkbcOkbMOkaW5lbiA8a2ltbW8gZG90IGhhbWFsYWluZW4gYXQgbm9raWEgZG90IGNvbT4KKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYyAobG9jYXRlX2F0dHJpYnV0ZXMpOiByZW1vdmUgZGVhZCBjb2RlIHdoaWNoCisJYWx3YXlzIGV2YWx1YXRlZCB0byBUUlVFCisKKwkqIGRidXMvZGJ1cy1zaGVsbC5jIChfZGJ1c19zaGVsbF9xdW90ZSk6IHJlbW92ZSB1bnVzZWQgY29kZQorCisyMDA4LTAxLTE0ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBwYXRjaCBieSBLaW1tbyBIw6Rtw6Rsw6RpbmVuIDxraW1tbyBkb3QgaGFtYWxhaW5lbiBhdCBub2tpYSBkb3QgY29tPgorCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfY29ubmVjdGlvbl9jb21wbGV0ZSk6IHBsdWcgYSBwb3NzaWJsZSAKKwlCdXNDbGllbnRQb2xpY3kgbGVhayAoRkRPIEJ1ZyAjMTMyNDIpCisKKzIwMDgtMDEtMTQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHBhdGNoIGJ5IEZyZWRlcmljIENyb3phdCA8ZmNyb3phdCBhdCBtYW5kcml2YSBkb3QgY29tPiAoRkRPIEJ6IworCTEzMjY4KQorCisJKiBhZGQgaW5vdGlmeSBzdXBwb3J0CisKKwkqIGJ1cy9NYWtlZmlsZS5hbTogYWRkIGlub3RpZnkgbW9kdWxlIHRvIHRoZSBidWlsZAorCisJKiBidXMvZGlyLXdhdGNoLWlub3RpZnkuYzogaW5vdGlmeSBtb2R1bGUgYmFzZWQgb2ZmIHRoZSBkbm90aWZ5IGFuZAorCWtxdWV1ZSBtb2R1bGVzCisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIGNoZWNrcyBhbmQgc3dpdGNoIGZvciBpbm90aWZ5CisJYWxzbyBhZGQgYSBwcmludG91dCBhdCB0aGUgZW5kIG9mIGNvbmZpZ3VyZSBpZiBpbm90aWZ5IGFuZCBrcXVldWUKKwlzdXBwb3J0IGlzIGJlaW5nIGJ1aWx0IGluIChkbm90aWZ5IGFscmVhZHkgaGFkIHRoaXMpCisKKzIwMDgtMDEtMTQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHBhdGNoIGJ5IEZyZWRlcmljIENyb3phdCA8ZmNyb3phdCBhdCBtYW5kcml2YSBkb3QgY29tPgorCisJKiBidXMvZGlyLXdhdGNoLWRub3RpZnkuYyAoYnVzX3dhdGNoX2RpcmVjdG9yeSk6IHdhdGNoIGZvciBmaWxlCisJY3JlYXRlcyBhbHNvCisKKzIwMDgtMDEtMTQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHBhdGNoIGJ5IEtpbW1vIEjDpG3DpGzDpGluZW4gPGtpbW1vIGRvdCBoYW1hbGFpbmVuIGF0IG5va2lhIGRvdCBjb20+CisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtc29ja2V0LmMoZG9fcmVhZGluZyk6IHJldHVybiBtZXNzYWdlIAorCWxvYWRlciBidWZmZXIgaW4gY2FzZSBvZiBPT00gKEZETyBCdWcjMTI2NjYpCisKKzIwMDgtMDEtMTQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIHdhcm5pbmcgdG8gb3V0cHV0IHdoZW4gbGlieG1sIGlzIHNlbGVjdGVkIHNpbmNlCisJd2UgZG9uJ3QgaGF2ZSBhIGxpYnhtbCBtYWludGFpbmVyIGFuZCBleHBhdCB3b3JrcyBwZXJmZWN0bHkgZmluZQorCWZvciB3aGF0IHdlIG5lZWQgYW4geG1sIHBhcnNlciBmb3IKKworMjAwOC0wMS0xNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogUGF0Y2ggYnkgQW5kcmVhIEx1enphcmRpICA8c2NveCBhdCBzaWcxMSBkb3Qgb3JnPjogY3JlYXRlcyBhCisJX2RidXNfZ2V0ZXVpZCBmdW5jdGlvbiB0byBmaXggRVhURVJOQUwgYXV0aGVudGljYXRpb24gaW4gc2V0dWlkCisJYXBwbGljYXRpb25zCisKKwkqICBkYnVzL2RidXMtc3lzZGVwcy11bml4LmMgKF9kYnVzX2dldGV1aWQpOiB1c2VkIHRvIGdldCB0aGUgZWZmZWN0aXZlCisJdWlkIG9mIHRoZSBydW5uaW5nIHByb2dyYW0KKwkoX2RidXNfY3JlZGVudGlhbHNfYWRkX2Zyb21fY3VycmVudF9wcm9jZXNzKTogdXNlIGdldGV1aWQgaW5zdGVhZCBvZgorCWdldHVpZAorCShfZGJ1c19hcHBlbmRfdXNlcl9mcm9tX2N1cnJlbnRfcHJvY2Vzcyk6IHVzZSBnZXRldWlkIGluc3RlYWQgb2YKKwlnZXR1aWQKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC11bml4LmMgKF9kYnVzX2NoYW5nZV90b19kYWVtb25fdXNlcik6IHVzZQorCWdldGV1aWQgaW5zdGVhZCBvZiBnZXR1aWQKKwkoX2RidXNfdW5peF91c2VyX2lzX2F0X2NvbnNvbGUpOiB1c2UgZ2V0ZXVpZCBpbnN0ZWFkIG9mIGdldHVpZAorCisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4uYyAoX2RidXNfZ2V0ZXVpZCk6IGFkZCBhIHdpbmRvd3MgZXF1aXZpbGFudAorCXRoYXQgcmV0dXJucyBEQlVTX1VJRF9VTlNFVAorCisyMDA3LTEyLTE4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoX2RidXNfY29ubmVjdGlvbl9ibG9ja19wZW5kaW5nX2NhbGwpOgorCWZpeCBsb2NhdGlvbiBvZiBjdXJseSBicmFjZXMKKworMjAwNy0xMS0yMyAgU2pvZXJkIFNpbW9ucyAgPHNqb2VyZEBsdW9uLm5ldD4KKworCSogdG9vbHMvZGJ1cy1sYXVuY2guYzogbGV0IGJvdGggYSBub3JtYWwgZGJ1cy1sYXVuY2ggYW5kIGFuCisJYXV0b2xhdW5jaGVkIGJ1cyBzYXZlIHRoZWlyIHBhcmFtZXRlcnMgaW4gWDExIGlmIHBvc3NpYmxlLiBUaGlzIG1ha2VzCisJdGhlIGF1dG9sYXVuY2ggYW5kIG5vbi1hdXRvbGF1bmNoIGJlaGF2aW91ciBtb3JlIHNpbWlsYXIuIFdpdGggdGhlCisJZXhjZXB0aW9uIHRoYXQgb24gYSBub3JtYWwgbGF1bmNoIHRoZXJlIHdpbGwgYWx3YXlzIGJlIGEgbmV3IHNlc3Npb24KKwlidXMgYW5kIG5vdCBiZWluZyBhYmxlIHRvIHNhdmUgcGFyYW1ldGVycyBpcyBub3QgZmF0YWwuIFRoaXMgYWxzbworCWVuYWJsZXMgdG8gbGF1bmNoIHByb2dyYW1zIGRpcmVjdGx5IHdpdGggYXV0b2xhdW5jaCAobm90IHZlcnkgdXNlZnVsbAorCXRob3VnaCkuCisKKzIwMDctMTAtMzEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvc2VsaW51eC5jIChsb2dfYXVkaXRfY2FsbGJhY2spOiByZXdyaXRlIHRvIHVzZQorCV9kYnVzX3N0cmluZ19jb3B5X3RvX2J1ZmZlcl93aXRoX251bCgpCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2NvcHlfdG9fYnVmZmVyKTogY2hhbmdlIHRvIE5PVAorCW51bC10ZXJtaW5hdGUgdGhlIGJ1ZmZlcjsgZmFpbCBhbiBhc3NlcnRpb24gaWYgdGhlcmUgaXMgbm90IGVub3VnaAorCXNwYWNlIGluIHRoZSB0YXJnZXQgYnVmZmVyLiBUaGlzIGZpeGVzIHR3byBidWdzIHdoZXJlCisJY29weV90b19idWZmZXIgd2FzIHVzZWQgdG8gY29weSB0aGUgYmluYXJ5IGJ5dGVzIGluIGEgVVVJRCwgd2hlcmUKKwludWwgdGVybWluYXRpb24gZGlkIG5vdCBtYWtlIHNlbnNlLiBCdWcgcmVwb3J0ZWQgYnkgRGF2aWQgQ2FzdGVsb3cuCisJKF9kYnVzX3N0cmluZ19jb3B5X3RvX2J1ZmZlcl93aXRoX251bCk6IG5ldyBmdW5jdGlvbiB0aGF0IGFsd2F5cworCW51bC10ZXJtaW5hdGVzIHRoZSBidWZmZXIsIGFuZCBmYWlscyBhbiBhc3NlcnRpb24gaWYgdGhlcmUgaXMgbm90IAorCWVub3VnaCBzcGFjZSBpbiB0aGUgYnVmZmVyLgorCisyMDA3LTEwLTIzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9uZXcpOiB1c2UgdGhlIG5ldyBuYW1lIGhlcmUKKworCSogYnVzL3NlbGludXguYyAoYnVzX3NlbGludXhfYXVkaXRfaW5pdCk6IHJlbmFtZSBmcm9tIGF1ZGl0X2luaXQoKQorCXRvIGF2b2lkIHBvc3NpYmxlIGxpYmMgY29uZmxpY3QsIGFuZCBkZWNsYXJlIGl0IGluIC5oIGZpbGUgdG8KKwlhdm9pZCBhIHdhcm5pbmcKKworMjAwNy0xMC0xOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CQorCQorCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9uZXcpOiBwdXQgYXVkaXRfaW5pdCgpIGluIEhBVkVfU0VMSU5VWAorCQorMjAwNy0xMC0xOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CQorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X25ldyk6IHB1dCB0aGUgYXVkaXRfaW5pdCgpIGluIGhlcmUKKwlpbnN0ZWFkLCB3aGljaCBJIGJlbGlldmUgZW5kcyB1cCBiZWluZyB0aGUgc2FtZSBhcyB3aGVyZSBpdCB3YXMKKwliZWZvcmUsIHRob3VnaCBJJ20gbm90IHN1cmUgSSB1bmRlcnN0YW5kIHdoeSBpdCBnb2VzIGhlcmUuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jIChfZGJ1c19jaGFuZ2VfdG9fZGFlbW9uX3VzZXIpOgorCXJlbW92ZSBhdWRpdF9pbml0KCkgZnJvbSBoZXJlLCB0aGlzIGZpbGUgY2FuJ3QgZGVwZW5kIG9uIGNvZGUgaW4KKwlidXMvIGRpcmVjdG9yeQorCisyMDA3LTEwLTE2ICBTaW1vbiBNY1ZpdHRpZSAgPHNpbW9uLm1jdml0dGllQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmluOiAqQWN0dWFsbHkqIGZpeCBkZXRlY3Rpb24gb2YgaTQ4NiBhdG9taWMgb3BzIC0KKwlteSBwcmV2aW91cyBhdHRlbXB0IGF0IGEgZml4IHdvdWxkIGFsd2F5cyBlbmFibGUgdGhlbSBkdWUgdG8gd3JvbmcKKwlxdW90aW5nLiBQYXRjaCBmcm9tIENvbGluIFdhbHRlcnMgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworMjAwNy0xMC0xMSAgU2ltb24gTWNWaXR0aWUgIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5pbjogZW5hYmxlIEF1dG9jb25mJ3MgQUNfQ19JTkxJTkUgdG8gYXZvaWQgY29tcGlsYXRpb24KKwlmYWlsdXJlIHdpdGggZ2NjIC1hbnNpCisJKiBkYnVzL2RidXMtbWFjcm9zLmgsIGRidXMvZGJ1cy1hcmNoLWRlcHMuaC5pbjogVXNlIG5ldyBtYWNybworCV9EQlVTX0dOVUNfRVhURU5TSU9OICh0aGUgc2FtZSBhcyBHX0dOVUNfRVhURU5TSU9OKSB0byBhdm9pZCAtYW5zaQorCXdhcm5pbmdzIGFib3V0IHVzZSBvZiAibG9uZyBsb25nIi4KKwkqIGRidXMvZGJ1cy1zZXJ2ZXItc29ja2V0LmM6IHJlbW92ZSB1bnVzZWQgdmFyaWFibGUgd2hlbiBhc3NlcnRpb25zCisJYXJlIGRpc2FibGVkCisJKiBkYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5jOiBhdm9pZCBlbXB0eSBzdGF0ZW1lbnRzIGJ5IHJlbW92aW5nCisJc3RyYXkgc2VtaWNvbG9ucworCSogdG9vbHMvZGJ1cy1sYXVuY2guYzogY29udmVydCBDKystc3R5bGUgY29tbWVudCB0byBDLXN0eWxlLCBhZGQge30KKwlmb3IgY2xhcml0eQorCSogLmdpdGlnbm9yZTogaWdub3JlIHZpIHN3YXBmaWxlcworCSogZGJ1cy9kYnVzLWVycm9ycy5oLCBkYnVzL2RidXMtZXJyb3JzLmM6IEFkZCBEQlVTX0VSUk9SX0lOSVQgbWFjcm8sCisJZXF1aXZhbGVudCB0byBjYWxsaW5nIGRidXNfZXJyb3JfaW5pdCgpIG9uIGFuIHVuaW5pdGlhbGl6ZWQgREJ1c0Vycm9yCisJKiBkYnVzL2RidXMtYWRkcmVzcy5jLCBkYnVzL2RidXMtYXV0aC1zY3JpcHQuYywgZGJ1cy9kYnVzLWF1dGgtdXRpbC5jLAorCWRidXMvZGJ1cy1jb25uZWN0aW9uLmMsIGRidXMvZGJ1cy1pbnRlcm5hbHMuYywgZGJ1cy9kYnVzLWtleXJpbmcuYywKKwlkYnVzL2RidXMtbWVzc2FnZS11dGlsLmMsIGRidXMvZGJ1cy1zZXJ2ZXIuYywgZGJ1cy9kYnVzLXNoYS5jLAorCWRidXMvZGJ1cy1zcGF3bi13aW4uYywgZGJ1cy9kYnVzLXNwYXduLmMsCisJZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC13aW4uYywgZGJ1cy9kYnVzLXRyYW5zcG9ydC1zb2NrZXQuYywKKwlkYnVzL2RidXMtdHJhbnNwb3J0LmMsIGRidXMvZGJ1cy11c2VyZGIuYzogdXNlIHRoYXQgbWFjcm8gaW5zdGVhZCBvZgorCWNhbGxpbmcgZGJ1c19lcnJvcl9pbml0KCkgd2hlcmUgaXQncyBjbGVhcmx5IGVxdWl2YWxlbnQKKwkqIGNvbmZpZ3VyZS5pbiwgZGJ1cy9kYnVzLXN5c2RlcHMuaCwgZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jOiBGaXgKKwlkZXRlY3Rpb24gb2YgaTQ4NiBhdG9taWMgb3BzLiBQcmV2aW91c2x5LCB0aGUgYXR0ZW1wdHMgdG8gZGV0ZXJtaW5lCisJc3VwcG9ydCBhdCBjb21waWxlLXRpbWUgb24gRGFyd2luIHdlcmUgY2F1c2luZyB0aGUgaTQ4NiBhdG9taWMgb3BzIHRvCisJYmUgdXNlZCBvbiAqYWxsKiBpMzg2IG9yIHg4Ni02NCBHQ0MgYnVpbGRzIChBSF9WRVJCQVRJTSBjYW4ndCBiZQorCWNvbmRpdGlvbmFsaXplZCBsaWtlIHdlIHdlcmUgdHJ5aW5nIHRvKS4KKworMjAwNy0xMC0xMCAgU2ltb24gTWNWaXR0aWUgIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuYywgZGJ1cy9kYnVzLXByb3RvY29sLmg6IEFkZCBuZXcgZXJyb3IKKwlvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5PYmplY3RQYXRoSW5Vc2UKKwkqIGRidXMvZGJ1cy1vYmplY3QtdHJlZS5oLCBkYnVzL2RidXMtb2JqZWN0LXRyZWUuYywKKwlkYnVzL2RidXMtY29ubmVjdGlvbi5jLCBkYnVzL2RidXMtY29ubmVjdGlvbi5oOiBhZGQgbmV3IGZ1bmN0aW9ucworCWRidXNfY29ubmVjdGlvbl90cnlfcmVnaXN0ZXJfb2JqZWN0X3BhdGggYW5kCisJZGJ1c19jb25uZWN0aW9uX3RyeV9yZWdpc3Rlcl9mYWxsYmFjaywgd2hpY2ggcmFpc2UgT2JqZWN0UGF0aEluVXNlCisJcmF0aGVyIHRoYW4gYXNzZXJ0aW5nLCB0byBtYWtlIG9iamVjdCBwYXRoIHJlZ2lzdHJhdGlvbiBsZXNzIHBhaW5mdWwKKwlmb3IgYmluZGluZ3MKKwkqIC5naXRpZ25vcmU6IGFkZCB2YXJpb3VzIHRoaW5ncyB0aGF0IHdlcmVuJ3QgaW4gLmN2c2lnbm9yZSBiZWNhdXNlCisJQ1ZTIGltcGxpY2l0bHkgaWdub3JlZCB0aGVtOyBnZW5lcmFsbHkgYnJpbmcgdXAgdG8gZGF0ZQorCisyMDA3LTEwLTA5ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiB0b29scy9ydW4td2l0aC10bXAtc2Vzc2lvbi1idXMuc2g6IEZpeCBlbnYgZXhwb3J0cyBmb3IgYmV0dGVyCisJcG9ydGFiaWxpdHkgKCM5MjgwKQorCSogdG9vbHMvZGJ1cy1zZW5kLjE6IERvY3VtZW50IHN5bnRheCBmb3IgY29udGFpbmVyIHR5cGVzIGluIGRidXMtc2VuZAorCW1hbiBmaWxlICgjOTU1MykgLSBwYXRjaCBmcm9tIEphY2sgU3BhYXIgPGpzcGFhciBhdAorCXVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCVtCb3RoIE9LIGZvciBNSVQvWDExIHJlbGljZW5zaW5nIC1zbWN2XQorCisyMDA3LTEwLTA5ICBTaW1vbiBNY1ZpdHRpZSAgPHNpbW9uLm1jdml0dGllQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IFNwZWNpZmljYWxseSBmb3JiaWQgZW1wdHkgc3RydWN0cyAoIzc5NjkpCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogUGF0Y2hlcyBmcm9tIEtyaXN0b2ZmZXIgTHVuZMOpbiB0byBjbGFyaWZ5CisJZGVzY3JpcHRpb24gb2YgREJVU19DT09LSUVfU0hBMSAoIzEwMTg0KSBhbmQgYWxsb3dhYmxlIGNvbnRlbnRzIG9mIGEKKwl2YXJpYW50ICgjMTAxODUsIGFtZW5kZWQgYXMgcGVyIEhhdm9jJ3MgY29tbWVudHMpCisKKwlbQWxsIG9mIHRoZSBhYm92ZSBhcmUgT0sgZm9yIE1JVC9YMTEgbGljZW5zaW5nXQorCisyMDA3LTEwLTAzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmg6IGZkLm8gYnVnICMxMTY3OCBEb24ndCBlcnJvciBvdXQgaWYgY29tcGlsZXIKKwlkb2VzIG5vdCBzdXBwb3J0IHZhcmFyZyBtYWNyb3MuIF9kYnVzX3ZlcmJvc2UgaXMgdGhlIG9ubHkgZnVuY3Rpb24KKwl0aGF0IGRvZXMgdGhpcyBzbyBtYWtlIGl0IGEgbm9vcCBpZiB2YXJhcmcgbWFjcm9zIGFyZSBub3Qgc3VwcG9ydGVkCisJKiBidXMvc2VsaW51eC5jLCBkYnVzL2RidXMtc3lzZGVwcy11dGlsLXVuaXguYzogZmQubyBidWcgIzEyNDI5CisJUmV2ZXJzZSBjaGVjayB0byBzZXRwY2FwIGFuZCBvbmx5IGluaXQgYXVkaXQgaWYgd2Ugd2VyZSByb290CisJKHBhdGNoIGJ5IERhbiBXYWxzaCA8ZHdhbHNoQHJlZGhhdC5jb20+LAorCWh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTEyNDI5KS4gUmV2ZXJzZQorCXdlX3dlcmVfcm9vdCBjaGVjayB0byBzZXRwY2FwIGlmIHdlIHdlcmUgcm9vdC4gIEFsc28gb25seSBpbml0IGF1ZGl0CisJaWYgd2Ugd2VyZSByb290LiAgU28gZXJyb3IgZGJ1cyBtZXNzYWdlIHdpbGwgbm90IHNob3cgdXAgd2hlbiBwb2xpY3kKKwlyZWxvYWQgaGFwcGVucy4gIGRidXMgLXNlc3Npb24gd2lsbCBubyBsb25nZXIgdHJ5IHRvIHNlbmQgYXVkaXQKKwltZXNzYWdlLCBvbmx5IHN5c3RlbSB3aWxsLgorCSogY29uZmlndXJlLmluOiBmZC5vIGJ1ZyAjMTE4NzIgaW1wcm92ZSBsaW5rZXIgdGVzdCBmb3IgLS1nYy1zZWN0aW9ucy4KKwlQYXRjaCBieSBUaW0gTW9vbmV5IDxlbmNoYW50ZXIgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCSogY29uZmlndXJlLmluLCBkYnVzL2RidXMtc3lzZGVwcy5jOiBmZC5vIGJ1ZyAjMTE4NzIgZml4IGNsZWFyZW52IGZvcgorCXN5c3RlbXMgdGhhdCBkbyBub3QgaGF2ZSBpdC4gUGF0Y2ggZnJvbSBCcmlhbiBDYW1lcm9uIDxicmlhbi5jYW1lcm9uCisJYXQgc3VuLmNvbT4KKwkqIHRvb2xzL2RidXMtbGF1bmNoLmM6IGZkLm8gYnVnICMxMjU0NyByZW1vdmUgc3VwZXJmbHVvdXMgaWYuCisJQWxzbyBjb252ZXJ0IHRhYnMgdG8gc3BhY2VzCisJKiBjb25maWd1cmUuaW4sIGJ1cy9NYWtlZmlsZS5hbSwgZGJ1cy9NYWtlZmlsZS5hbTogQ29ycmVjdGx5IGltcGxlbWVudAorCS1mUElDIGFuZCAtZlBJRS4gRm9yIHNlY3VyaXR5IHJlYXNvbnMgd2Ugd2FudCBwb3NzaXRpb24gaW5kZXBlbmRlbnQKKwljb2RlIGZvciBsaWJyYXJpZXMgYW5kIHBvc3NpdGlvbiBpbmRlcGVuZGVudCBleGVjdXRhYmxlIGZvcgorCWV4ZWN1dGFibGVzLiBCZWZvcmUgd2Ugd2VyZSBqdXN0IGVuYWJsaW5nIC1mUElDLiBOb3cgd2UgY29ycmVjdGx5CisJZW5hYmxlIC1mUElDIGFuZCAtUElFIGZvciBsaWJkYnVzIGFuZCB0aGUgYnVzIHJlc3BlY3RpdmVseS4gUHJvcGVyCisJTERfRkxBR1MgYXJlIHNldCBmb3IgZWFjaCBhbHNvLgorCisyMDA3LTA5LTIwICBSeWFuIExvcnRpZSAgPGRlc3J0QGRlc3J0LmNhPgorCisJQWRkIGFyZ3VtZW50IHBhdGggbWF0Y2hpbmcgc3VwcG9ydC4gIEJ1ZyAjMTEwNjYuCisKKwkqIGRidXMvc2lnbmFscy5jIChzdHJ1Y3QgREJ1c01hdGNoUnVsZSwgYnVzX21hdGNoX3J1bGVfbmV3LAorCWJ1c19tYXRjaF9ydWxlX3NldF9hcmcsIGJ1c19tYXRjaF9ydWxlX3BhcnNlX2FyZ19tYXRjaCwKKwltYXRjaF9ydWxlX21hdGNoZXMpOiBBZGQgc3VwcG9ydCBmb3IgcGFyc2luZyBhbmQgbWF0Y2hpbmcgb24KKwlhcmcwcGF0aD0nL3NvbWUvcGF0aCcgdHlwZSBydWxlcy4KKworCSogZGJ1cy9zaWduYWxzLmggKGJ1c19tYXRjaF9ydWxlX3NldF9hcmcpOiBjaGFuZ2UgdG8gdGFrZSBjb25zdAorCURCdXNTdHJpbmcgaW5zdGVhZCBvZiBjb25zdCBjaGFyICogZm9yIHRoZSBzdHJpbmcgdG8gbWF0Y2ggYWdhaW5zdC4KKworCSogZGJ1cy9kYnVzLWJ1cy5jOiBhZGQgYSBxdWljayBub3RlIHRvIGRidXNfYnVzX2FkZF9tYXRjaAorCWRvY3VtZW50YXRpb24gYWJvdXQgdGhlIHBhdGggbWF0Y2hpbmcuCisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBhZGQgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZQorCWNoYW5nZXMgaGVyZS4KKworMjAwNy0wOS0xOSAgUnlhbiBMb3J0aWUgIDxkZXNydEBkZXNydC5jYT4KKworCUFkZCBzdXBwb3J0IGZvciBjb21wYWN0aW5nIERCdXNTdHJpbmdzIHRvIHJlbGVhc2Ugd2FzdGVkIG1lbW9yeS4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5bY2hdIChjb21wYWN0LCBfZGJ1c19zdHJpbmdfY29tcGFjdCwKKwlfZGJ1c19zdHJpbmdfbG9jayk6IG5ldyBjb21wYWN0IGZ1bmN0aW9uIHRvIGZyZWUgdXAgYWxsb2NhdGVkIG1lbW9yeQorCXRoYXQgaXMgbm8gbG9uZ2VyIHVzZWQuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGxvYWRfbWVzc2FnZSk6IGNhbGwgX2RidXNfc3RyaW5nX2NvbXBhY3Qgb24gdGhlCisJbWVzc2FnZSBsb2FkZXIgYnVmZmVyLgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXNvY2tldC5jIChkb19yZWFkaW5nLCBkb193cml0aW5nKTogY2FsbAorCV9kYnVzX3N0cmluZ19jb21wYWN0IG9uIHRoZSBpbmNvbWluZy9vdXRnb2luZyAiZW5jb2RlZCIgYnVmZmVycy4KKworCSogZGJ1cy9kYnVzLXN0cmluZy11dGlsLmMgKF9kYnVzX3N0cmluZ190ZXN0KTogYWRkIGEgZmV3IHRlc3RzIGZvcgorCXN0cmluZyBjb21wYWN0aW5nLgorCisyMDA3LTA5LTEzICBSeWFuIExvcnRpZSAgPGRlc3J0QGRlc3J0LmNhPgorCisJKiBIQUNLSU5HOiBhZGQgbW9yZSBleHBsaWNpdCBnaXQgYnJhbmNoL3RhZyBpbnN0cnVjdGlvbnMKKworMjAwNy0wOS0xMyAgUnlhbiBMb3J0aWUgIDxkZXNydEBkZXNydC5jYT4KKworCW1pZ3JhdGUgZnJvbSBjdnMgdG8gZ2l0IChjdnMyc3ZuIC0+IGdpdC1zdm5pbXBvcnQpLgorCisJKiBIQUNLSU5HOiB1cGRhdGUgcmVsZWFzZS9icmFuY2gvdGFnIGluc3RydWN0aW9ucworCSogKi8uY3ZzaWdub3JlOiByZW5hbWUgdG8gLmdpdGlnbm9yZQorCisJYWxzbywgY2xlYW4gdXAgdGFncyBhbmQgYnJhbmNoIG5hbWVzIHRvIGNvbmZvcm0gdG8gSEFDS0lORworCisyMDA3LTA4LTE3ICBXaWxsaWFtIEpvbiBNY0Nhbm4gIDxtY2Nhbm5Aamh1LmVkdT4KKworCSogdXBkYXRlLWRidXMtZG9jcy5zaDogdXBsb2FkIERURCB0byBzZXJ2ZXIKKworMjAwNy0wOC0xNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLXgxMS5jIChzZXRfYWRkcmVzc19pbl94MTEpOiBmaXggZnJvbSBNaWNoYWVsCisJTG9yZW56IHRvIHVzZSBsb25nIG5vdCBpbnQgd2l0aCBYQ2hhbmdlUHJvcGVydHkgZm9ybWF0IDMyCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jCisJKF9kYnVzX3dyaXRlX3BpZF90b19maWxlX2FuZF9waXBlKTogZmFjdG9yIHRoaXMgb3V0LCBhbmQgdXNlIHRoZQorCXNhbWUgY29kZSBpbiBfZGJ1c19iZWNvbWVfZGFlbW9uICh3aGVyZSB0aGUgcGFyZW50IHdyaXRlcyB0aGUgcGlkCisJZmlsZSBhbmQgdG8gdGhlIHBpZCBwaXBlKSBhbmQgaW4gYnVzX2NvbnRleHRfbmV3ICh3aGVyZSB0aGUgZGFlbW9uCisJd3JpdGVzIGl0cyBvd24gcGlkIGZpbGUgYW5kIHRvIGl0cyBvd24gcGlkIHBpcGUpCisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfbmV3KTogY2xvc2UgdGhlIHBpZCBwaXBlIGFmdGVyIHdlIHByaW50CisJdG8gaXQuIEFsc28sIGRvbid0IHdyaXRlIHRoZSBwaWQgdG8gdGhlIHBpcGUgdHdpY2Ugd2hlbiB3ZSBmb3JrLAorCXNvbWVvbmUgcmVwb3J0ZWQgdGhpcyBidWcgYSBsb25nIHRpbWUgYWdvLgorCisyMDA3LTA4LTAzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBhZGQgbWFqb3IvbWlub3IvbWljcm8gdmVyc2lvbiBudW1iZXIgQUNfU1VCU1QKKworCSogZGJ1cy9kYnVzLWFyY2gtZGVwcy5oLmluIChEQlVTX01BSk9SX1ZFUlNJT04sCisJREJVU19NSU5PUl9WRVJTSU9OLCBEQlVTX01JQ1JPX1ZFUlNJT04sIERCVVNfVkVSU0lPTl9TVFJJTkcsCisJREJVU19WRVJTSU9OKTogY29sbGVjdGlvbiBvZiBtYWNyb3MgdG8gZ2V0IHZlcnNpb24gb2YgbGlicmFyeSB3ZQorCWFyZSBjb21waWxlZCBhZ2FpbnN0LgorCisJKiBkYnVzL2RidXMtbWlzYy5jIChkYnVzX2dldF92ZXJzaW9uKTogbmV3IGZ1bmN0aW9uLCB0byBnZXQKKwl2ZXJzaW9uIG9mIGxpYnJhcnkgd2UgYXJlIGxpbmtlZCBhZ2FpbnN0IGF0IHJ1bnRpbWUuCisKKzIwMDctMDctMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvYWN0aXZhdGlvbi1oZWxwZXIuYyAoY2hlY2tfYnVzX25hbWUpOiBkb24ndCB1c2UKKwlfZGJ1c19jaGVja192YWxpZF9idXNfbmFtZSgpIHdoaWNoIGlzIG9ubHkgYXJvdW5kIHdpdGgKKwktLWVuYWJsZS1jaGVja3MsIGluc3RlYWQgdXNlIF9kYnVzX3ZhbGlkYXRlX2J1c19uYW1lKCkuCisJQnVnICMxMTc2NiBmcm9tIERpZWdvIDxkaWVnb0BwZW1hcy5uZXQ+CisKKzIwMDctMDctMjcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IHBvc3QtcmVsZWFzZSB2ZXJzaW9uIGJ1bXAKKworMjAwNy0wNy0yNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHJlbGVhc2UgMS4xLjIKKworMjAwNy0wNy0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLXRyaXZpYWwuYyAoY2hlY2tfcmV0dXJuX3ZhbHVlcyk6IGRpc2FibGUgYQorCXRlc3QgdGhhdCBoYXJkY29kZWQgdGhlIGJ1cyB1c2VyJ3MgbmFtZQorCisJKiBidXMvZGlzcGF0Y2guYyAoYnVzX2Rpc3BhdGNoX3Rlc3RfY29uZik6IHJlbW92ZSB0aGUgImlmCisJKCF1c2VfbGF1bmNoZXIpIiBhcm91bmQgdGhlIHRlc3RzLCB0aGV5IHdlcmUgb25seSBmYWlsaW5nIGJlY2F1c2UKKwl3ZSBkaWRuJ3QgcGFzcyB0aHJvdWdoIGFsbCB0aGUgZXhwZWN0ZWQgZXJyb3JzIGZyb20gdGhlIGhlbHBlci4KKworCSogYnVzL2FjdGl2YXRpb24tZXhpdC1jb2Rlcy5oCisJKEJVU19TUEFXTl9FWElUX0NPREVfQ0hJTERfU0lHTkFMRUQpOiBhZGQgYSBjb2RlIGZvciBjaGlsZCBzZWdmYXVsdGluZworCShCVVNfU1BBV05fRVhJVF9DT0RFX0dFTkVSSUNfRkFJTFVSRSk6IG1ha2UgIjEiIGJlIGEgZ2VuZXJpYworCWZhaWx1cmUgY29kZSwgc28gaWYgYSB0aGlyZCBwYXJ0eSBsYXVuY2ggaGVscGVyIHdlcmUgd3JpdHRlbiBpdAorCWNvdWxkIGp1c3QgYWx3YXlzIHJldHVybiAxIG9uIGZhaWx1cmUuCisJCisyMDA3LTA3LTI0ICBEYW5pZWwgUC4gQmVycmFuZ2UgPGRhbkBiZXJyYW5nZS5jb20+CisKKwkqIGJ1cy9kYnVzLWRhZW1vbi4xOiBBZGQgZG9jcyBvbiBuZXcgc3ludGF4IG9wdGlvbnMgZm9yIHRoZSBidXMKKwlhZGRyZXNzIHN0cmluZ3MKKworCSogZGJ1cy9kYnVzLWFkZHJlc3MuYzogQWxsb3cgKiBpbiBhZGRyZXNzZXMgKGZvciBiaW5kaW5nIHRvIGFsbAorCWFkZHJlc3NlcykuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmg6CisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmM6IFJlLXdyaXRlIHRvIHVzZSBnZXRhZGRyaW5mbyBpbnN0ZWFkCisJb2YgZ2V0aG9zdGJ5bmFtZSB0byBlbmFibGUgcHJvdG9jb2wgaW5kZXBlbmRhbnQgbmFtZSBsb29rdXAsCisJbWFraW5nIElQdjYgd29yaworCisJKiBkYnVzL2RidXMtc2VydmVyLXNvY2tldC5oOgorCSogZGJ1cy9kYnVzLXNlcnZlci1zb2NrZXQuYzogQWRkIHN1cHBvcnQgZm9yICdmYW1pbHknIGluIHRoZQorCWFkZHJlc3Mgc3RyaW5nIHRvIHNwZWNpZnkgaXB2NCB2cyBpcHY2LiBVc2UgYSBwb3J0IHN0cmluZyB0bworCWFsbG93IGZvciBzZXJ2aWNlIHJlc29sdXRpb24uIEFsbG93IGZvciBiaW5kaW5nIHRvIG11bHRpcGxlCisJc29ja2V0cyBhdCBvbmNlIGluIGNhc2Ugb2YgZHVhbCBJUHY0ICYgSVB2NiBzdGFja3MuCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItdW5peC5jOiBQYXNzIGluIGFuIGFycmF5IG9mIGZpbGUgZGVzY3JpcHRvcnMKKwlpbnN0ZWFkIG9mIGEgc2luZ2xlIG9uZS4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC1zb2NrZXQuaDoKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtc29ja2V0LmM6IEFkZCBzdXBwb3J0IGZvciAnZmFtaWx5JyBpbiB0aGUKKwlhZGRyZXNzIHN0cmluZyB0byBzcGVjaWZ5IGlwdjQgdnMgaXB2Ni4gVXNlIGEgcG9ydCBzdHJpbmcgdG8KKwlhbGxvdyBmb3Igc2VydmljZSByZXNvbHV0aW9uLgorCisyMDA3LTA3LTI0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBhZGQgQU1fUFJPR19DQ19DX08gdG8gYWxsb3cgcGVyLXRhcmdldCBDUFBGTEFHUworCisJKiBidXMvZGlzcGF0Y2guYyAoYnVzX2Rpc3BhdGNoX3Rlc3RfY29uZik6IEZpeCB1cCBzZXR0aW5nCisJVEVTVF9MQVVOQ0hfSEVMUEVSX0NPTkZJRyB0byBpbmNsdWRlIHRoZSBmdWxsIHBhdGgsIGFuZCBlbmFibGUKKwl0ZXN0IHNoZWxsX2ZhaWxfc2VydmljZV9hdXRvX3N0YXJ0IHdoZW4gdXNlX2xhdW5jaGVyPT1UUlVFCisKKwkqIGJ1cy9hY3RpdmF0aW9uLWhlbHBlci1iaW4uYyAoY29udmVydF9lcnJvcl90b19leGl0X2NvZGUpOiBwYXNzCisJdGhyb3VnaCB0aGUgSU5WQUxJRF9BUkdTIGVycm9yIHNvIHRoZSB0ZXN0IHN1aXRlIHdvcmtzCisKKwkqIGJ1cy9hY3RpdmF0aW9uLmMgKGhhbmRsZV9hY3RpdmF0aW9uX2V4aXRfZXJyb3IpOiByZXR1cm4KKwlEQlVTX0VSUk9SX05PX01FTU9SWSBpZiB3ZSBnZXQgQlVTX1NQQVdOX0VYSVRfQ09ERV9OT19NRU1PUlkKKworCSogZGJ1cy9kYnVzLXNwYXduLmMgKF9kYnVzX2JhYnlzaXR0ZXJfZ2V0X2NoaWxkX2V4aXRfc3RhdHVzKToKKwlyZXR1cm4gb25seSB0aGUgZXhpdCBjb2RlIG9mIHRoZSBjaGlsZCwgbm90IHRoZSBlbnRpcmUgdGhpbmd5IGZyb20gCisJd2FpdHBpZCgpLCBhbmQgbWFrZSB0aGUgcmV0dXJuIHZhbHVlIGluZGljYXRlIHdoZXRoZXIgdGhlIGNoaWxkIAorCWV4aXRlZCBub3JtYWxseSAod2l0aCBhIHN0YXR1cyBjb2RlKQorCisJKiBidXMvYnVzLmMgKHByb2Nlc3NfY29uZmlnX2ZpcnN0X3RpbWVfb25seSk6IF9kYnVzX3N0cmR1cCB3b3JrcworCW9uIE5VTEwgc28gbm8gbmVlZCB0byBjaGVjaworCShwcm9jZXNzX2NvbmZpZ19ldmVyeV90aW1lKTogbW92ZSBzZXJ2aWNlaGVscGVyIGluaXQgaGVyZSwgc28gd2UKKwlyZWxvYWQgaXQgb24gSFVQIG9yIGNvbmZpZyBmaWxlIGNoYW5nZQorCisJKiBidXMvTWFrZWZpbGUuYW0gKGluc3RhbGwtZGF0YS1ob29rKTogcmVtb3ZlIGNvbW1lbnQgYmVjYXVzZQorCUVtYWNzIG1ha2UgbW9kZSBzZWVtcyB0byBiZSBncnVtcHkgYWJvdXQgaXQKKworMjAwNy0wNy0yNCAgUmljaGFyZCBIdWdoZXMgIDxyaWNoYXJkQGh1Z2hzaWUuY29tPgorCisJKiBidXMvTWFrZWZpbGUuYW06CisJKiBidXMvdGVzdC1zeXN0ZW0uYzogKGRpZSksIChjaGVja19tZW1sZWFrcyksICh0ZXN0X3ByZV9ob29rKSwKKwkodGVzdF9wb3N0X2hvb2spLCAobWFpbik6CisJQWRkIGJhY2sgdGhlIHRlc3Qtc3lzdGVtLmMgZmlsZSAtIG5vdCBzdXJlIG5vdyB0aGlzIGdvdCBpZ25vcmVkIGluIHRoZQorCWRpZmYuIEkgYmxhbWUgZ2l0LgorCisyMDA3LTA3LTI0ICBSaWNoYXJkIEh1Z2hlcyAgPHJpY2hhcmRAaHVnaHNpZS5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjoKKwlVc2UgdXN0YXIgdG8gZ2VuZXJhdGUgdGhlIHRhcmJhbGw7IHRoaXMgZml4ZXMgdGhlIG1ha2UgZGlzdGNoZWNrCisJcHJvYmxlbSB3aGVuIHRoZSBkYXRhIGZpbGVzIGRvIG5vdCBmaXQgaW4gdGhlIGFyY2hpdmU6CisJdGFyOiBkYnVzLTEuMS4yL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLgorCVRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VGYWlsLnNlcnZpY2UuaW46IGZpbGUgbmFtZSBpcyB0b28KKwlsb25nIChtYXggOTkpOyBub3QgZHVtcGVkCisKKwlXZSBoYXZlIHRvIGhhdmUgdGhlICdsb25nJyBuYW1lcyBhcyB0aGUgc2VydmljZSBoZWxwZXIgbWF0Y2hlcyBieQorCWZpbGVuYW1lIHJhdGhlciB0aGFuIGJ5IHRoZSBuYW1lIGluIHRoZSBzZXJ2aWNlIGZpbGUuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogY29uZmlndXJlLmluOgorCSogdGVzdC9NYWtlZmlsZS5hbToKKwkqIHRlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTCisJdWl0ZU5vRXhlYy5zZXJ2aWNlLmluOgorCSogdGVzdC9kYXRhL2ludmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFMKKwl1aXRlTm9TZXJ2aWNlLnNlcnZpY2UuaW46CisJKiB0ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0UworCXVpdGVOb1VzZXIuc2VydmljZS5pbjoKKwkqIHRlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtL2RlYnVnLWFsbG93LWFsbC1mYWlsLmNvbmYuaW46CisJKiB0ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbS9kZWJ1Zy1hbGxvdy1hbGwtcGFzcy5jb25mLmluOgorCSogdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwtc2hhMS5jb25mLmluOgorCSogdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwuY29uZi5pbjoKKwkqIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpCisJdGVFY2hvU2VydmljZS5zZXJ2aWNlLmluOgorCSogdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWkKKwl0ZVNlZ2ZhdWx0U2VydmljZS5zZXJ2aWNlLmluOgorCSogdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWkKKwl0ZVNoZWxsRWNob1NlcnZpY2VGYWlsLnNlcnZpY2UuaW46CisJKiB0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aQorCXRlU2hlbGxFY2hvU2VydmljZVN1Y2Nlc3Muc2VydmljZS5pbjoKKwkqIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL2RlYnVnLWVjaG8uc2VydmljZS5pbjoKKwkqIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL2RlYnVnLXNlZ2ZhdWx0LnNlcnZpY2UuaW46CisJKiB0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9kZWJ1Zy1zaGVsbC1lY2hvLWZhaWwuc2VydmljZS5pbjoKKwkqIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL2RlYnVnLXNoZWxsLWVjaG8tc3VjY2Vzcy5zZXJ2aWNlLmluOgorCSogdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1MKKwllcnZpY2Uuc2VydmljZS5pbjoKKwkqIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNlZ2ZhCisJdWx0U2VydmljZS5zZXJ2aWNlLmluOgorCSogdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGwKKwlFY2hvU2VydmljZUZhaWwuc2VydmljZS5pbjoKKwkqIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsCisJRWNob1NlcnZpY2VTdWNjZXNzLnNlcnZpY2UuaW46CisJQWRkIHRoZSBkYXRhIGZpbGVzIG5lZWRlZCBieSB0aGUgc3lzdGVtIGFjdGl2YXRpb24gdW5pdCBjaGVja3MuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogYnVzL2Rpc3BhdGNoLmM6IChjaGVja19zZWdmYXVsdF9zZXJ2aWNlX25vX2F1dG9fc3RhcnQpLAorCShjaGVja19sYXVuY2hfc2VydmljZV9maWxlX21pc3NpbmcpLAorCShjaGVja19sYXVuY2hfc2VydmljZV91c2VyX21pc3NpbmcpLAorCShjaGVja19sYXVuY2hfc2VydmljZV9leGVjX21pc3NpbmcpLAorCShjaGVja19sYXVuY2hfc2VydmljZV9zZXJ2aWNlX21pc3NpbmcpLCAoYnVzX2Rpc3BhdGNoX3Rlc3RfY29uZiksCisJKGJ1c19kaXNwYXRjaF90ZXN0X2NvbmZfZmFpbCksIChidXNfZGlzcGF0Y2hfdGVzdCk6CisJQWRkIHVuaXQgdGVzdHMgZm9yIHN5c3RlbSBhY3RpdmF0aW9uLiBNb3N0IGFyZSBjb3BpZWQgZnJvbSB0aGUKKwlzZXNzaW9uIGFjdGl2YXRpb24gdGVzdHMsIGJ1dCBzb21lIGRpZG4ndCBhcHBseSB3aGVuIHVzaW5nIGEgbGF1Y2hlci4KKworMjAwNy0wNy0yNCAgUmljaGFyZCBIdWdoZXMgIDxyaWNoYXJkQGh1Z2hzaWUuY29tPgorCisJKiBidXMvYWN0aXZhdGlvbi5jOiAoYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSk6CisJSWYgdGhlIGJ1cyB1c2VzIGEgc2VydmljZS1sYXVjaGVyLCB0aGVuIHVzZSB0aGUgc2V0dWlkIGxhdWNoZXIuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogY29uZmlndXJlLmluOgorCUFkZCB0aGUgbmVlZGVkIGxpYnJhcnkgZXhwb3J0cyBmb3IgdGhlIG5ldyBsYXVjaGVyLgorCisyMDA3LTA3LTI0ICBSaWNoYXJkIEh1Z2hlcyAgPHJpY2hhcmRAaHVnaHNpZS5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjoKKwlDaGVjayBmb3IgLVdsLC0tZ2Mtc2VjdGlvbnMgc28gd2UgY2FuIHJlYWxseSByZWR1Y2UgdGhlIHNpemUgb2YgdGhlCisJc2V0dWlkIGJpbmFyeS4KKworMjAwNy0wNy0yNCAgUmljaGFyZCBIdWdoZXMgIDxyaWNoYXJkQGh1Z2hzaWUuY29tPgorCisJKiBidXMvYWN0aXZhdGlvbi5jOiAoaGFuZGxlX2FjdGl2YXRpb25fZXhpdF9lcnJvciksCisJKGJhYnlzaXR0ZXJfd2F0Y2hfY2FsbGJhY2spOgorCU1hcCB0aGUgY2hpbGQgZXhpdCBzdGF0dXMgaW50ZWdlciB0byBhIHByb3BlciBkYnVzIGVycm9yLgorCisyMDA3LTA3LTI0ICBSaWNoYXJkIEh1Z2hlcyAgPHJpY2hhcmRAaHVnaHNpZS5jb20+CisKKwkqIGJ1cy9idXMuYzogKHByb2Nlc3NfY29uZmlnX2ZpcnN0X3RpbWVfb25seSksCisJKHByb2Nlc3NfY29uZmlnX2V2ZXJ5X3RpbWUpLCAoYnVzX2NvbnRleHRfdW5yZWYpLAorCShidXNfY29udGV4dF9nZXRfc2VydmljZWhlbHBlcik6CisJKiBidXMvYnVzLmg6CisJQWRkIHRoZSBjb25jZXB0IG9mIGEgc2VydmljZS1oZWxwZXIgYW5kIGFsbG93IGl0J3MgdmFsdWUgdG8gYmUgcmVhZC4KKworMjAwNy0wNy0yNCAgUmljaGFyZCBIdWdoZXMgIDxyaWNoYXJkQGh1Z2hzaWUuY29tPgorCisJKiBidXMvYWN0aXZhdGlvbi5jOiAoYnVzX2FjdGl2YXRpb25fZW50cnlfdW5yZWYpLAorCSh1cGRhdGVfZGVza3RvcF9maWxlX2VudHJ5KToKKwlBZGQgdGhlIGNvbmNlcHQgb2YsIGFuZCByZWFkIHRoZSB2YWx1ZSBvZiB1c2VyIGZyb20gdGhlIGRlc2t0b3AgZmlsZS4KKwlUaGUgdXNlciBzdHJpbmcgaXMgbm90IHJlcXVpcmVkIHVubGVzcyB3ZSBhcmUgdXNpbmcgc3lzdGVtIGFjdGl2YXRpb24uCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogYnVzL2FjdGl2YXRpb24uYzoKKwkqIGJ1cy9kZXNrdG9wLWZpbGUuaDoKKwlNb3ZlIHRoZSBkZWZpbmVzIGludG8gdGhlIGhlYWRlciBmaWxlLCBhcyB3ZSB1c2UgdGhlc2UgaW4gdGhlIGxhdWNoCisJaGVscGVyIGFzIHdlbGwgYXMgdGhlIGRlc2t0b3AgZmlsZSBwYXJzaW5nLgorCisyMDA3LTA3LTI0ICBSaWNoYXJkIEh1Z2hlcyAgPHJpY2hhcmRAaHVnaHNpZS5jb20+CisKKwkqIGJ1cy8uY3ZzaWdub3JlOgorCUFkZCB0aGUgYXV0b2dlbmVyYXRlZCBiaW5hcnkgZmlsZXMuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogYnVzL01ha2VmaWxlLmFtOgorCSogYnVzL3Rlc3QuaDoKKwlBZGQgdGhlIGJ1aWxkIGdsdWUgZm9yIHRoZSBsYXVjaCBoZWxwZXIsIGFuZCBhbHNvIGFkZCB0aGUgbGF1bmNoLWhlbHBlcgorCU9PTSBjaGVja3MgaW50byBtYWtlIGNoZWNrLiBJJ3ZlIHByb2JhYmx5IGJyb2tlbiB0aGUgYnVpbGQsIGdpdmUgbWUgMi4KKworMjAwNy0wNy0yNCAgUmljaGFyZCBIdWdoZXMgIDxyaWNoYXJkQGh1Z2hzaWUuY29tPgorCisJKiBidXMvdGVzdC1sYXVuY2gtaGVscGVyLmM6IChkaWUpLCAoY2hlY2tfbWVtbGVha3MpLAorCSh0ZXN0X3Bvc3RfaG9vayksIChidXNfYWN0aXZhdGlvbl9oZWxwZXJfb29tX3Rlc3QpLCAobWFpbik6CisJQWRkIGEgdGVzdCB3cmFwcGVyIHRvIGFsbG93IE9PTSBjaGVja3Mgb24gdGhlIGxhdW5jaCBoZWxwZXIuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogYnVzL2FjdGl2YXRpb24taGVscGVyLWJpbi5jOiAoY29udmVydF9lcnJvcl90b19leGl0X2NvZGUpLAorCShtYWluKToKKwkqIGJ1cy9hY3RpdmF0aW9uLWhlbHBlci5jOiAoZGVza3RvcF9maWxlX2Zvcl9uYW1lKSwKKwkoY2xlYXJfZW52aXJvbm1lbnQpLCAoY2hlY2tfcGVybWlzc2lvbnMpLCAoY2hlY2tfc2VydmljZV9uYW1lKSwKKwkoZ2V0X3BhcmFtZXRlcnNfZm9yX3NlcnZpY2UpLCAoc3dpdGNoX3VzZXIpLAorCShleGVjX2Zvcl9jb3JyZWN0X3VzZXIpLCAoY2hlY2tfYnVzX25hbWUpLCAoZ2V0X2NvcnJlY3RfcGFyc2VyKSwKKwkobGF1bmNoX2J1c19uYW1lKSwgKGNoZWNrX2RidXNfdXNlciksIChydW5fbGF1bmNoX2hlbHBlcik6CisJKiBidXMvYWN0aXZhdGlvbi1oZWxwZXIuaDoKKwlBZGQgdGhlIGluaXRpYWwgbGF1bmNoLWhlbHBlci4gVGhpcyBpcyBzcGxpdCBpbnRvIGEgbWFpbiBzZWN0aW9uIGFuZCBhCisJYmluYXJ5IGxvYWRlciB0aGF0IGFsbG93cyB1cyB0byBsYXVjaCB0aGUgbWFpbiBzZWN0aW9uIGluIGFub3RoZXIgdGVzdAorCWhhcm5lc3MgdG8gZG8gc3R1ZmYgbGlrZSBPT00gdGVzdGluZy4gTm8gYnVpbGQgZ2x1ZSB5ZXQuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogYnVzL01ha2VmaWxlLmFtOgorCSogYnVzL2NvbmZpZy1wYXJzZXIuYzogKGJ1c19jb25maWdfcGFyc2VyX3VucmVmKSwKKwkoc3RhcnRfYnVzY29uZmlnX2NoaWxkKSwgKGJ1c19jb25maWdfcGFyc2VyX2VuZF9lbGVtZW50KSwKKwkoc2VydmljZWhlbHBlcl9wYXRoKSwgKGJ1c19jb25maWdfcGFyc2VyX2NvbnRlbnQpLAorCShidXNfY29uZmlnX3BhcnNlcl9maW5pc2hlZCksCisJKGJ1c19jb25maWdfcGFyc2VyX2dldF9zZXJ2aWNlaGVscGVyKSwKKwkodGVzdF9kZWZhdWx0X3Nlc3Npb25fc2VydmljZWRpcnMpLAorCSh0ZXN0X2RlZmF1bHRfc3lzdGVtX3NlcnZpY2VkaXJzKSwgKGJ1c19jb25maWdfcGFyc2VyX3Rlc3QpOgorCSogYnVzL2NvbmZpZy1wYXJzZXIuaDoKKwlNYWtlIHRoZSBjb25maWctcGFyc2VyIGNvZGUgdXNlIHRoZSBjb21tb24gY29uZmlnIGNvZGUuCisJQWxzbyBhZGQgdGhlIHNlc3Npb24gYW5kIHN5c3RlbWRpcnMgc3R1ZmYsIGFuZCBtYWtlIHRoZSBjb25maWcgcGFyc2VyCisJYXdhcmUgb2YgdGhlIHNlcnZpY2VoZWxwZXIgZmllbGQuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogYnVzL3N5c3RlbS5jb25mLmluOgorCUFkZCBuZXcgc2VydmljZWhlbHBlciBmaWVsZHMgdG8gdGhlIGRlZmF1bHQgc3lzdGVtLmNvbmYgZmlsZS4KKworMjAwNy0wNy0yNCAgUmljaGFyZCBIdWdoZXMgIDxyaWNoYXJkQGh1Z2hzaWUuY29tPgorCisJKiBidXMvY29uZmlnLXBhcnNlci10cml2aWFsLmM6IChzZXJ2aWNlX2RpcnNfZmluZF9kaXIpLAorCShzZXJ2aWNlX2RpcnNfYXBwZW5kX2xpbmtfdW5pcXVlX29yX2ZyZWUpLCAoYnVzX2NvbmZpZ19wYXJzZXJfbmV3KSwKKwkoYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYpLCAoYnVzX2NvbmZpZ19wYXJzZXJfc3RhcnRfZWxlbWVudCksCisJKGJ1c19jb25maWdfcGFyc2VyX2VuZF9lbGVtZW50KSwgKGJ1c19jb25maWdfcGFyc2VyX2NvbnRlbnQpLAorCShidXNfY29uZmlnX3BhcnNlcl9maW5pc2hlZCksIChidXNfY29uZmlnX3BhcnNlcl9nZXRfdXNlciksCisJKGJ1c19jb25maWdfcGFyc2VyX2dldF90eXBlKSwgKGJ1c19jb25maWdfcGFyc2VyX2dldF9zZXJ2aWNlX2RpcnMpLAorCShjaGVja19yZXR1cm5fdmFsdWVzKSwgKGRvX2xvYWQpLCAoY2hlY2tfbG9hZGVyX29vbV9mdW5jKSwKKwkocHJvY2Vzc190ZXN0X3ZhbGlkX3N1YmRpciksIChtYWtlX2Z1bGxfcGF0aCksIChjaGVja19maWxlX3ZhbGlkKSwKKwkoYnVzX2NvbmZpZ19wYXJzZXJfdHJpdmlhbF90ZXN0KToKKwkqIGJ1cy9jb25maWctcGFyc2VyLXRyaXZpYWwuaDoKKwlBZGQgYSBzZWN1cml0eSBzZW5zaXRpdmUgc3RyaXBwZWQgZG93biBjb25maWcgcGFyc2VyIGZvciB0aGUgc2V0dWlkCisJbGF1bmNoZXIuIFRoaXMgZmlsZSBvbmx5IHJlYWRzIHdoYXQgaXQgbmVlZHMsIGFuZCBkb2Vzbid0IHRyeSB0byBkbworCWFueXRoaW5nIHJlbW90ZWx5IGNsZXZlciBsaWtlIGluY2x1ZGluZyBleHRlcm5hbCBmaWxlcy4KKwlJdCBpcyBub3QgaW50ZW5kZWQgdG8gdmFsaWRhdGUgdGhlIGNvbmZpZyBmaWxlOyBpdCBpcyBleHBlY3RlZCB0aGF0CisJY29uZmlnLXBhcnNlciB3aWxsIGRvIHRoYXQgYmVmb3JlIHRoZSBzZXR1aWQgcHJvZ3JhbSB0cmllcyB0byByZWFkIGl0LgorCisyMDA3LTA3LTI0ICBSaWNoYXJkIEh1Z2hlcyAgPHJpY2hhcmRAaHVnaHNpZS5jb20+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLWNvbW1vbi5jOgorCShidXNfY29uZmlnX3BhcnNlcl9lbGVtZW50X25hbWVfdG9fdHlwZSksCisJKGJ1c19jb25maWdfcGFyc2VyX2VsZW1lbnRfdHlwZV90b19uYW1lKToKKwkqIGJ1cy9jb25maWctcGFyc2VyLWNvbW1vbi5oOgorCVdlIGRvbid0IHdhbnQgdG8gcnVuIHRoZSB3aG9sZSBjb25maWcgcGFyc2VyIHdpdGggYWxsIGl0J3MgZGVwcyBpbiB0aGUKKwlzZXR1aWQgcHJvZ3JhbS4gV2UgbmVlZCB0byBpbXBsZW1lbnQgYSBzdHJpcHBlZCBkb3duIGNvbmZpZyBwYXJzZXIganVzdAorCWZvciB0aGUgbGF1bmNoZXIsIGFuZCB0byBkbyBzbyBJIG5lZWQgc29tZSBjb21tb24gZnVuY3Rpb25zIGFuZAorCWRlZmluZXM7IGFkZCB0aGVtIGhlcmUuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jOgorCShfZGJ1c19nZXRfc3RhbmRhcmRfc3lzdGVtX3NlcnZpY2VkaXJzKToKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXdpbi5jOgorCVByb3ZpZGUgYSB3YXkgdG8gZ2V0IHRoZSBzdGFuZGFyZCBzeXN0ZW0gc2VydmljZWRpcnMsIGp1c3QgbGlrZSB3ZSBkbworCWZvciB0aGUgc2Vzc2lvbiBzZXJ2aWNlIGRpcnMuIFRoZXNlIHNob3VsZCBiZSBzZXBvcmF0ZSwgYXMgdGhlcmUgbWF5CisJYmUgYSBzZWN1cml0eSBpc3N1ZSBzdGFydGluZyB1cCBzb21lIHNlc3Npb24gc3R1ZmYgYXMgcm9vdC4KKwlUaGUgdXNlLWNhc2UgZm9yIHRoZSBzYW1lIGJpbmFyeSBzdGFydGluZyB1cCBwZXItc3lzdGVtIF9hbmRfCisJcGVyLXNlc3Npb24gaXMgYWxzbyBub3QgdmFsaWQuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogYnVzL2RidXMtZGFlbW9uLjEuaW46CisJQWRkIHN0YW5kYXJkX3N5c3RlbV9zZXJ2aWNlZGlycyBhbmQgc2VydmljZWhlbHBlciBpbnRvIHRoZSBtYW4gZmlsZQorCWFuZCBleHBsYWluIHdoYXQgZWFjaCBkb2VzLgorCisyMDA3LTA3LTI0ICBSaWNoYXJkIEh1Z2hlcyAgPHJpY2hhcmRAaHVnaHNpZS5jb20+CisKKwkqIGRvYy9idXNjb25maWcuZHRkOgorCUFkZCBzZXJ2aWNlaGVscGVyIGludG8gdGhlIGR0ZCwgaXQgd2lsbCBzb29uIGJlIGEgdmFsaWQgcGFydCBvZiB0aGUKKwljb25maWcgZmlsZS4KKworMjAwNy0wNy0yNCAgUmljaGFyZCBIdWdoZXMgIDxyaWNoYXJkQGh1Z2hzaWUuY29tPgorCisJKiBkYnVzL2RidXMtc3Bhd24uYzogKHJlYWRfZGF0YSksCisJKF9kYnVzX2JhYnlzaXR0ZXJfZ2V0X2NoaWxkX2V4aXRfc3RhdHVzKToKKwkqIGRidXMvZGJ1cy1zcGF3bi5oOgorCUFkZCBhIGZ1bmN0aW9uIHNvIHdlIGNhbiBnZXQgYWNjZXNzIHRvIHRoZSBleGl0IHN0YXR1cyBvZiB0aGUgbGF1bmNoCisJaGVscGVyLgorCUJ5IHByb3ZpZGluZyB0aGUgcmV0dXJuIGNvZGUgYW5kIG5vdCB0aGUgZXJyb3Igd2UgY2FuIGxlYXZlIHRoZQorCSd3aGF0IGRvZXMgdGhpcyBtZWFuPycgdG8gdGhlIGJ1cyBsYXVuY2ggY29kZSBhbmQgbm90IGluY2x1ZGUgaXQgaW4gdGhlCisJZGJ1cyBkaXJlY3RvcnkuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogYnVzL2FjdGl2YXRpb24tZXhpdC1jb2Rlcy5oOgorCUFkZCBkZWZpbmVzIHdoaWNoIHNwZWNpZnkgdGhlIG91dHB1dCBjb2RlcyBvZiB0aGUgbGF1bmNoIGhlbHBlci4KKwlXZSBoYXZlIHRvIHVzZSBleGl0IGNvZGVzIGFzIHRoaXMgaXMgdGhlIG9ubHkgd2F5IHdlIGNhbiByZXR1cm4gZmFpbHVyZQorCXR5cGUgd2l0aG91dCBnb2luZyBncm90dHkgdGhpbmdzIGxpa2UgcmVkaXJlY3RpbmcgcG9zc2libHktbm9uc2VjdXJlCisJc3RkZXJyIGludG8gdGhlIGVycm9yLgorCisyMDA3LTA3LTI0ICBSaWNoYXJkIEh1Z2hlcyAgPHJpY2hhcmRAaHVnaHNpZS5jb20+CisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOgorCUFkZCBuZXcgZXJyb3IgbmFtZXMgbmVlZGVkIGZvciB0aGUgbGF1bmNoIGhlbHBlci4KKworMjAwNy0wNy0yNCAgUmljaGFyZCBIdWdoZXMgIDxyaWNoYXJkQGh1Z2hzaWUuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOiAoX2RidXNfY2xlYXJlbnYpOgorCSogZGJ1cy9kYnVzLXN5c2RlcHMuaDoKKwlBZGQgYSB3cmFwcGVyIGZvciBjbGVhcmVudi4KKworMjAwNy0wNy0yNCAgUmljaGFyZCBIdWdoZXMgIDxyaWNoYXJkQGh1Z2hzaWUuY29tPgorCisJKiBkb2Mvc3lzdGVtLWFjdGl2YXRpb24udHh0OgorCUFkZCBkZXNpZ24gZG9jdW1lbnQgZm9yIHRoZSBzeXN0ZW0gYWN0aXZhdGlvbiBwYXJ0cy4gSSdsbCBzaG9ydGx5IGJlCisJY29tbWl0dGluZyBtYW55IHBhdGNoZXMgdGhhdCBhZGQgc3lzdGVtIGFjdGl2YXRpb24gdXNpbmcgYSBzZXR1aWQKKwlsYXVuY2hlciBpbnRvIENWUywgc28gZXhwZWN0IHRoaW5ncyB0byBiZSBicm9rZW4gZm9yIGEgZmV3IGhvdXJzLgorCisyMDA3LTA3LTE5ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBjbWFrZS9tb2R1bGVzL0ZpbmRLREVXSU4uY21ha2U6IGZpeGVkIGNvbW1lbnQKKwkqIGNtYWtlL21vZHVsZXMvRmluZEtERVdJTjMyLmNtYWtlOiByZW1vdmVkIG9ic29sYXRlIGNtYWtlIG1vZHVsZQorCisyMDA3LTA3LTE4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2dldF9jYWNoZWQpCisJKGRidXNfbWVzc2FnZV9jYWNoZV9vcl9maW5hbGl6ZSk6IGRvbid0IG1lc3Mgd2l0aCBtZXNzYWdlIGZyb20KKwltZXNzYWdlIGNhY2hlIG91dHNpZGUgb2YgdGhlIGNhY2hlIGxvY2suIEJ1ZyAjOTE2NCBmcm9tIEpvbmF0aGFuCisJTWF0dGhldy4KKworMjAwNy0wNy0xMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIEFkZCBpbmRlbnQtdGFicy1tb2RlOiBuaWwgdG8gYWxsIGZpbGUgaGVhZGVycy4KKworMjAwNy0wNy0xMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWwuYyAoX2RidXNfc3lzZGVwc190ZXN0KTogaW52ZXJ0IHRoZSB0ZXN0CisJZm9yIHBhcnNpbmcgaGV4IGFzIGRvdWJsZSB0byBiZSBzdXJlIGl0IGZhaWxzIHRvIHdvcmsKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfc3RyaW5nX3BhcnNlX2RvdWJsZSk6IGRvbid0IGFsbG93IGhleCBudW1iZXJzLgorCisyMDA3LTA3LTEwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoc3RydWN0IERCdXNDb25uZWN0aW9uKTogRml4IGZyb20gT2xpdmllcgorCUhvY2hyZXV0aW5lciB0byBhdm9pZCB0cnlpbmcgdG8gcHJvdGVjdCBpbmRpdmlkdWFsIGJpdHMgaW4gYSB3b3JkCisJd2l0aCBkaWZmZXJlbnQgbG9ja3MgKG1ha2UgZGlzcGF0Y2hfYWNxdWlyZWQgYW5kIGlvX3BhdGhfYWNxdWlyZWQKKwlkYnVzX2Jvb2xfdCByYXRoZXIgdGhhbiBiaXRmaWVsZHMpCisKKzIwMDctMDctMDkgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXdpbi5jLGRidXMtc3lzZGVwcy13aW4uaCxkYnVzLXN5c2RlcHMtd2luLXV0aWwuYywKKwlkYnVzLXN5c2RlcHMtc3Bhd24td2luLmM6IHN5bmNlZCB3aXRoIHdpbmRidXMgc291cmNlcyAKKworMjAwNy0wNy0wNyAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmMgCisJCShfZGJ1c19nZXRzaWQpOiByZW1vdmUgdW51c2VkIGp1bXAgbGFiZWwKKwkJKF9kYnVzX3JlYWRfY3JlZGVudGlhbHNfc29ja2V0KTogX2RidXNfc3RyaW5nX2luaXQgY291bGQgZmFpbCwgCisJICAgICAgICBjaGVjayBpbml0aWFsaXNhdGlvbgorCQkoX2RidXNfZ2V0X3dvcmtpbmdfZGlyLCBfZGJ1c19pbml0X3dvcmtpbmdfZGlyKTogcmVtb3ZlIHVudXNlZCAKKwkJCWZ1bmN0aW9ucworCisyMDA3LTA3LTA0ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBjbWFrZS9tb2R1bGVzL0ZpbmRLREVXSU4uY21ha2U6IHNlYXJjaCBpbiA8cHJvZ3JhbSBmaWxlcyBkaXI+XHdpbjMybGlicyAKKwlmb3Igd2luZG93cyBzdXBwbGVtZW50YXJ5IHBhY2thZ2VzIHRvbworCisyMDA3LTA2LTMwICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBjbWFrZS9kYnVzL0NNYWtlTGlzdHMudHh0OiBoYW5kbGUgdXNlcmRiIGFzIHVuaXggZmlsZQorCisyMDA3LTA2LTMwICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4uYyxkYnVzL2RidXMtc3lzZGVwcy13aW4uaDogcmVtb3ZlZCBvYnNvbGF0ZSAKKwlEQnVzVXNlckluZm8gY29kZQorCisyMDA3LTA2LTMwICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4uYyAoX2RidXNfZGFlbW9uX2luaXQpOiByZWR1Y2VkIGNvbXBpbGVyIHdhcm5pbmdzCisKKzIwMDctMDYtMjMgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1hdXRoLXNjcmlwdC5jIChfZGJ1c19hdXRoX3NjcmlwdF9ydW4pOiBhZGRlZCBVTklYX09OTFkgYW5kIAorCVdJTl9PTkxZIGNvbW1hbmRzIGZvciBhdXRoIHNjcmlwdHMKKwkqIHRlc3QvZGF0YS9hdXRoL2V4dGVybmFsLXJvb3QuYXV0aC1zY3JpcHQ6IGxpbWl0IGV4ZWN1dGlvbiB0byB1bml4CisKKzIwMDctMDYtMjEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdHJhbnBvcnQuYyAoYXV0aF92aWFfZGVmYXVsdF9ydWxlcyk6IG1hZGUgdGhlIHZlcmJvc2Ugc3BhbQorCWNyb3NzLXBsYXRmb3JtCisKKzIwMDctMDYtMjEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtd2F0Y2guYyAoZGJ1c193YXRjaF9nZXRfZmQpOiAxKSBpdHMgYmVoYXZpb3Igc2hvdWxkCisJbm90IGJlIHRoZSBzYW1lIGFzIGJlZm9yZSwgdGhlIEFCSSBoYXMgbmV2ZXIgYmVlbiBkZWNsYXJlZCBzdGFibGUKKwlvbiBXaW5kb3dzIGFuZCAyKSBkbyBub3QgY29tbWl0IHRvIGNyb3NzLXBsYXRmb3JtIGZpbGVzIHdpdGhvdXQKKwlwb3N0aW5nIHRoZSBleGFjdCBwYXRjaCB0byB0aGUgbWFpbGluZyBsaXN0CisJCisJKiBkYnVzL2RidXMtc3lzZGVwcy11dGlsLmMgKF9kYnVzX3N5c2RlcHNfdGVzdCk6IGFzIEkgaGF2ZSBwb2ludGVkCisJb3V0IGJlZm9yZSwgZWl0aGVyIDB4ZmYgbmVlZHMgdG8gd29yayBvbiBib3RoIHBsYXRmb3Jtcywgb3Igbm9uZQorCW9mIHRoZSBkYnVzIGNvZGUgY2FuIHJlbHkgb24gaXQgd29ya2luZy4gVGhhdCBtZWFucyB0aGUgb3B0aW9ucworCWFyZSAxKSBhdWRpdCB0aGUgY29kZSBmb3IgYW55d2hlcmUgdGhhdCByZWxpZXMgb24gMHhmZiB3b3JraW5nLCBpZgorCW5vbmUgZm91bmQgaWRlYWxseSBhZGQgYSB0ZXN0IHRoYXQgaXQgKmRvZXNuJ3QqIHdvcmsgYW5kIG1ha2UgdW5peAorCXJlamVjdCBpdCBleHBsaWNpdGx5LCBidXQgaW4gYW55IGNhc2UgdGhpcyB0ZXN0IHdvdWxkIGdvIGF3YXkgb3IKKwkyKSBtYWtlIGl0IHdvcmsgb24gV2luZG93cyBhbHNvLCB0aGVuIHdlIGRvbid0IGhhdmUgdG8gZmlndXJlIG91dCAKKwl3aGV0aGVyIHdlIHJlbHkgb24gaXQuCisKKwlBbmQgaW4gZWl0aGVyIGNhc2UsIHBvc3QgdGhlIGV4YWN0IHBhdGNoIHRvIHRoZSBtYWlsaW5nIGxpc3QgYW5kCisJZG9uJ3QganVzdCBjb21taXQuCisKKzIwMDctMDYtMjEgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogY21ha2UvQ01ha2VMaXN0cy50eHQ6IGFkZGVkIFZFUlNJT05fUEFUQ0ggdG8gYmUgYWJsZSB0byAKKwlkaXN0aW5ndWlzaCB3aW4zMiBiaW5hcnkgcmVsZWFzZSBmcm9tIGRidXMgdmVyc2lvbmluZworCisyMDA3LTA2LTIxIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXdpbi5jOiBkZWxldGVkIGxvY2FsIERCdXNDcmVkZW50aWFscyBzdHJ1Y3R1cmUKKwkgICAgKF9kYnVzX2dldHNpZCk6IG5ldyBmdW5jdGlvbgorCSAgICAoX2RidXNfcmVhZF9jcmVkZW50aWFsc19zb2NrZXQpOiB1c2VkIGNvcnJlY3QgZnVuY3Rpb24KKwkgICAgKF9kYnVzX2FwcGVuZF91c2VyX2Zyb21fY3VycmVudF9wcm9jZXNzLCAKKwkgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2FkZF9mcm9tX2N1cnJlbnRfcHJvY2Vzcyk6IGFkZGVkIHJlYWwgCisJICAgICAgICAgICAgc2lkIHJlYWRpbmcKKwkgICAgKF9kYnVzX2NyZWRlbnRpYWxzX3BhcnNlX2FuZF9hZGRfZGVzaXJlZCxfZGJ1c19wYXJzZV91aWQpOiAKKwkgICAgICAgIGRlbGV0ZWQKKworMjAwNy0wNi0yMSBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11dGlsLmMgKF9kYnVzX3N5c2RlcHNfdGVzdCk6IGRvbid0IGNoZWNrIAorCTB4ZmYgYXMgZmxvYXRpbmcgcG9pbnQsIHRoaXMgaXNuJ3Qgc3VwcG9ydGVkIG9uIHdpbjMyIG1hdGggCisJaW1wbGVtZW50YXRpb24KKworMjAwNy0wNi0yMSBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4uYyAoX2RidXNfaG9tZWRpcl9mcm9tX3VzZXJuYW1lLCAKKwlfZGJ1c19ob21lZGlyX2Zyb21fY3VycmVudF9wcm9jZXNzLCBfZGJ1c19hcHBlbmRfZGVzaXJlZF9pZGVudGl0eSk6IAorCXJlbW92ZWQgb2Jzb2xhdGUgZnVuY3Rpb25zCisKKzIwMDctMDYtMjEgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmMsIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWwtd2luLmMsIAorCWRidXMvZGJ1cy1zeXNkZXBzLXdpbi5oOiBkaXNhYmxlZCB1aWQvc2lkIGNvbnZlcnNhdGlvbiBzdHVmZgorCWltcGxlbWVudGF0aW9uIGJ5IFBldGVyIEt1ZW1tZWwgCisKKzIwMDctMDYtMjEgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy13YXRjaC5jIChkYnVzX3dhdGNoX2dldF9mZCk6IHRoaXMgZnVuY3Rpb24gaXMgCisJZGVwcmVjYXRlZCBhbmQgaXRzIGJlaGF2aW9yIHNob3VsZCBiZSBhcyBiZWZvcmUgdW50aWwgYWxsIAorCWNsaWVudCBjb2RlIGlzIG1pZ3JhdGVkLiAKKworMjAwNy0wNi0xOSAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC13aW4uYywgdG9vbHMvZGJ1cy1sYXVuY2gtd2luLmM6IAorCW1zdmM3LjEgZml4ZXMgYnkgSmFyb3NsYXcgU3RhbmllayB0ZXN0ZWQgd2l0aCBtaW5ndyAKKworMjAwNy0wNi0xOSAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmMsIGRidXMvZGJ1cy1zeXNkZXBzLXNwYXduLXdpbi5jLCAKKwlkYnVzL2RidXMtc3lzZGVwcy13aW4uaDogZGlzYWJsZWQgREJ1c1NvY2tldCBpbXBsZW1lbnRhdGlvbgorCWJ5IFBldGVyIEt1ZW1tZWwgCisKKzIwMDctMDYtMTggIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMtd2luLnBhdGNoOiByZW1vdmVkIG9ic29sYXRlIHBhdGNoZXMKKworMjAwNy0wNi0xOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogYnVtcCB2ZXJzaW9uIHRvIDEuMS4yIHNvIENWUyBpcyBoaWdoZXIgdGhhbiBsYXN0CisJcmVsZWFzZSAodGhpcyBpcyBub3QgdGhlIDEuMS4yIHJlbGVhc2UpCisKKzIwMDctMDYtMTggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBSZWxlYXNlIDEuMS4xCisKKzIwMDctMDYtMTggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogZG9jdW1lbnQgb3JnLmZyZWVkZXNrdG9wLkRCdXMuR2V0SWQoKQorCisJKiBidXMvZHJpdmVyLmMgKGJ1c19kcml2ZXJfaGFuZGxlX2dldF9pZCk6IGltcGxlbWVudCBvcmcuZnJlZWRlc2t0b3AuREJ1cy5HZXRJZCgpCisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfbmV3KTogZ2VuZXJhdGUgYSB1bmlxdWUgSUQgZm9yIGVhY2ggYnVzIGNvbnRleHQKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX2dldF9zZXJ2ZXJfaWQpOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLWJ1cy5jIChkYnVzX2J1c19nZXRfaWQpOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLXNlcnZlci5jIChkYnVzX3NlcnZlcl9nZXRfaWQpOiBuZXcgZnVuY3Rpb24KKworMjAwNy0wNi0xOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYyAoX2RidXNfcmVhZF9jcmVkZW50aWFsc19zb2NrZXQpOiBjbGVhbgorCXRoaXMgdXAgYSBsaXR0bGUgYml0LCB0byB0cnkgYW5kIHVuZGVyc3RhbmQgd2h5IHRlbG5ldCdpbmcgdG8gYQorCXNlcnZlciBhbmQgc2VuZGluZyBhIG5vbi1udWwgYnl0ZSBkaWRuJ3QgZGlzY29ubmVjdCBpbW1lZGlhdGVseTsKKwlub3cgaXQgc2VlbXMgdGhhdCBpdCBkb2VzIGRpc2Nvbm5lY3QgaW1tZWRpYXRlbHkgYXMgaXQgc2hvdWxkLAorCXRob3VnaCBJIGRvbid0IHVuZGVyc3RhbmQgd2hhdCBoYXMgY2hhbmdlZC4KKworMjAwNy0wNi0xOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy13YXRjaC5jIChkYnVzX3dhdGNoX2dldF9zb2NrZXQpCisJKGRidXNfd2F0Y2hfZ2V0X3VuaXhfZmQpOiBuZXcgQVBJIHRvIG1hdGNoIERCdXNDb25uZWN0aW9uCisJKGRidXNfd2F0Y2hfZ2V0X2ZkKTogZGVwcmVjYXRlIHRoaXMKKworCVRocm91Z2hvdXQ6IGp1c3Qgcy9kYnVzX3dhdGNoX2dldF9mZC9kYnVzX3dhdGNoX2dldF9zb2NrZXQvZyBmb3IKKwlub3cgc2luY2UgYWxsIHRoZSB0cmFuc3BvcnRzIHVzZSBzb2NrZXRzIGFueXdheQorCQorMjAwNy0wNi0xNiAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLW1hY3Jvcy5oLCBkYnVzL2RidXMtbWVzc2FnZS5jLCAKKwlkYnVzL2RidXMtbWVzc2FnZS5oOiByZW5hbWVkIERCVVNfR05VQ19ERVBSRUNBVEVEIAorCXRvIERCVVNfREVQUkVDQVRFRCBhbmQgZXh0ZW5kZWQgdG8gbXN2YyBjb21waWxlcgorCisyMDA3LTA2LTE1ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBjbWFrZS9DTWFrZUxpc3RzLnR4dDogdXNlIGxvY2FsIGluY2x1ZGUgaGVhZGVyIGZpcnN0CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXdpbi5jOiBtaW5ndyBmaXggb2YgREJ1c0NyZWRlbnRpYWwgc3RydWN0CisKKzIwMDctMDYtMTUgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGNtYWtlL0NvbmZpZ3VyZUNoZWNrcy5jbWFrZSxjbWFrZS9jb25maWcuaC5jbWFrZTogCisJYWRkZWQgY2hlY2sgZm9yIEhBVkVfRVJSTk9fSAorCisJKiBjbWFrZS9kYnVzL0NNYWtlTGlzdHMudHh0OiBhZGRlZCBtaXNzaW5nIGZpbGVzIAorCQorCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC13aW4uYy8uaDogbmV3IGZpbGVzCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXdpbi5jLC5oOiBhZGRlZCByZXF1aXJlZCBfdW5peCBmdW5jdGlvbnMgCisJdG8gbWFrZSBkYnVzIGNvbXBpbGFibGUgb24gd2luMzIgCisJCisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4tdXRpbHMuYywuaDogbW92ZWQgc29tZSBmdW5jdGlvbnMgdG8gCisJZGJ1cy1zeXNkZXBzLXdpbi5jCisJCisJKiBkYnVzLXdpbi5wYXRjaDogcmVtb3ZlZCBhcHBsaWVkIG9yIG9ic29sYXRlIHBhdGNoZXMKKwkKKwlOb3RlOiBkYnVzLXdpbjMyIGlzIG5vdyBjb21waWxhYmxlLCBubyBndWFyYW50ZWUgdGhhdCBpdCBydW5zIAorCXdpdGhvdXQgYW55IHByb2JsZW1zIAorCisyMDA3LTA2LTE1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jIChfZGJ1c19hcHBlbmRfc2Vzc2lvbl9jb25maWdfZmlsZSkKKwkoX2RidXNfYXBwZW5kX3N5c3RlbV9jb25maWdfZmlsZSk6IG5ldyBmdW5jdGlvbnMKKworCSogYnVzL21haW4uYyAobWFpbik6IHVzZSBfZGJ1c19hcHBlbmRfc3lzdGVtX2NvbmZpZ19maWxlKCkgYW5kIAorCV9kYnVzX2FwcGVuZF9zZXNzaW9uX2NvbmZpZ19maWxlKCkKKworCSogZGJ1cy9NYWtlZmlsZS5hbSAoSU5DTFVERVMpOiBtb3ZlIERCVVNfU1lTVEVNX0NPTkZJR19GSUxFIGFuZAorCURCVVNfU0VTU0lPTl9DT05GSUdfRklMRSBpbnRvIHRoaXMgbWFrZWZpbGUKKworMjAwNy0wNi0xNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3NldF9lcnJub190b196ZXJvKQorCShfZGJ1c19nZXRfaXNfZXJybm9fbm9uemVybywgX2RidXNfZ2V0X2lzX2Vycm5vX2VpbnRyKQorCShfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vKTogZmFtaWx5IG9mIGZ1bmN0aW9ucyB0byBhYnN0cmFjdAorCWVycm5vLCB0aG91Z2ggdGhlc2UgYXJlIHNvbWV3aGF0IGJvZ3VzIChyZWFsbHkgd2Ugc2hvdWxkIG1ha2Ugb3VyCisJc29ja2V0IHdyYXBwZXJzIG5vdCB1c2UgZXJybm8gcHJvYmFibHkgLSB0aGUgaXNzdWUgaXMgdGhhdCBhbnkKKwl1c2FnZSBvZiBlcnJubyB0aGF0IGlzbid0IHNvY2tldC1yZWxhdGVkIHByb2JhYmx5IGlzIG5vdAorCWNyb3NzLXBsYXRmb3JtLCBzbyBzaG91bGQgZWl0aGVyIGJlIGluIGEgdW5peC1vbmx5IGZpbGUgdGhhdCBjYW4KKwl1c2UgZXJybm8gZGlyZWN0bHksIG9yIGlzIGEgYnVnIC0gdGhlc2UgZ2VuZXJhbCBlcnJubyB3cmFwcGVycworCWhpZGUgaXNzdWVzIG9mIHRoaXMgbmF0dXJlIGluIG5vbi1zb2NrZXQgY29kZSwgd2hpbGUKKwlzb2NrZXQtc3BlY2lmaWMgQVBJIGNoYW5nZXMgd291bGQgbm90IHNpbmNlIHNvY2tldHMgYXJlIGFsbG93ZWQKKwljcm9zcy1wbGF0Zm9ybSkKKworMjAwNy0wNi0xNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9kaXNwYXRjaC5jIChjaGVja19nZXRfY29ubmVjdGlvbl91bml4X3Byb2Nlc3NfaWQpOiBtb3AgdXAKKwlnZXRwaWQoKSAobm90aWNlZCBieSBQZXRlciBLw7xtbWVsKSBhbmQgYWRhcHQgdGhlIHRlc3QgdG8gCisJZXhwZWN0IGEgInBpZCB1bmtub3duIiBlcnJvciB3aGVuIHJ1bm5pbmcgb24gV2luZG93cy4KKworMjAwNy0wNi0xNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYyAoX2RidXNfY3JlZGVudGlhbHNfcGFyc2VfYW5kX2FkZF91c2VyKToKKwlkZWxldGUgdGhpcyBmdW5jdGlvbiBzaW5jZSBpdCB3YXMgZWZmZWN0aXZlbHkgdGhlIHNhbWUgYXMKKwlfZGJ1c19jcmVkZW50aWFsc19hZGRfZnJvbV91c2VybmFtZSgpCisKKzIwMDctMDYtMTQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtYXV0aC5jOiBhZGFwdCB0byBrZXlyaW5nIGNoYW5nZXMKKworCSogZGJ1cy9kYnVzLWtleXJpbmcuYzogY2hhbmdlIHRvIGF2b2lkIHVzaW5nIHVzZXIgSUQgYW5kIGhvbWUKKwlkaXJlY3RvcnkgZGlyZWN0bHk7IGluc3RlYWQgdXNlIGEKKwlrZXlyaW5nLWxvY2F0aW9uLWZyb20tY3JlZGVudGlhbHMgZnVuY3Rpb24gaW4gZGJ1cy1zeXNkZXBzCisKKwkqIGZpeCB0byB1c2UgX2RidXNfYXBwZW5kX3VzZXJfZnJvbV9jdXJyZW50X3Byb2Nlc3MoKSBpbnN0ZWFkIG9mIAorCV9kYnVzX3VzZXJuYW1lX2Zyb21fY3VycmVudF9wcm9jZXNzKCkgb3IgX2RidXNfYXBwZW5kX2Rlc2lyZWRfaWRlbnRpdHkoKS4KKwkKKzIwMDctMDYtMTQgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIHJldmVydGVkIGdsb2JhbCByZW5hbWUgb2YgZnVuY3Rpb24gX2RidXNfdXNlcm5hbWVfZnJvbV9jdXJyZW50X3Byb2Nlc3MuIAorCUl0IG5lZWRzIHRvbyBtdWNoIHRlc3RzIHRvIHZlcmlmeSB0aGF0IHRoZSBjaGFuZ2UgZG9lcyBub3QgYnJlYWsgYW55dGhpbmcuIAorCUkgaGFkIG92ZXJzZWVuIHRoYXQgdGhlIHNpZ25hdHVyZXMgYXJlIGRpZmZlcmVudCBhbmQgcmVxdWlyZXMgbm9uCisJdHJpdmlhbCBjaGFuZ2VzLiAKKwlUaGlzIGlzIG9uZSAqbWFqb3IqIGRpc2FkdmFudGFnZSBvZiBlbXVsYXRpbmcgb29wIGZ1bmN0aW9uYWxpdHkgd2l0aCBjLiAKKwlZb3UgYXJlIHJlc3BvbnNpYmxlIGZvciBjbGVhbmluZyBldmVyeSBvYmplY3Qgb24gZXZlcnkgZnVuY3Rpb24gcmV0dXJuIHBvaW50CisJd2hpY2ggY291bGQgYmUgYSBuaWdodG1hcmUgaWYgeW91IGFyZSBub3Qgd29ya2luZyB3aXRoIGRidXMgYWxsIHRoZSBkYXlzLgorCisyMDA3LTA2LTE0ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorICAgIAorCSogZGJ1cy9kYnVzLWF1dGguYyAoaGFuZGxlX2NsaWVudF9pbml0aWFsX3Jlc3BvbnNlX2Nvb2tpZV9zaGExX21lY2gpOiAKKwlmaXhlZCB1c2FnZSBvZiBfZGJ1c19hcHBlbmRfZGVzaXJlZF9pZGVudGl0eSgpCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmggKF9kYnVzX3VzZXJuYW1lX2Zyb21fY3VycmVudF9wcm9jZXNzKTogcmVtb3ZlZCBwcm90b3R5cGUKKworMjAwNy0wNi0xNCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKyAgICAKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmM6IG1vdmVkIGdsb2JhbCBsb2NrIHN5c3RlbV91c2VycyBmcm9tIGRidXMtdXNlcmRiLmMKKworMjAwNy0wNi0xNCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKyAgICAKKwkqIGdsb2JhbCByZW5hbWUgb2YgZnVuY3Rpb24gX2RidXNfdXNlcm5hbWVfZnJvbV9jdXJyZW50X3Byb2Nlc3MKKwl0byBfZGJ1c19hcHBlbmRfZGVzaXJlZF9pZGVudGl0eS4gCisJQXBwcm92ZWQgYnkgSGF2b2MgUGVubmluZ3RvbgorCisyMDA3LTA2LTE0ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4uYzogZGlzYWJsZWQgREJ1c1VzZXJJbmZvIHJlbGF0ZWQgY29kZQorCQkoX2RidXNfYXBwZW5kX2Rlc2lyZWRfaWRlbnRpdHksCV9kYnVzX3dpbmRvd3NfdXNlcl9pc19wcm9jZXNzX293bmVyKToKKyAgICAJCW5ldyB3aW4zMiBmdW5jdGlvbnMgYXMgY291bnRlcnBhcnQgb2YgdW5peCByZWxhdGVkIAorCQkoX2RidXNfc2VuZF9jcmVkZW50aWFsc19zb2NrZXQsX2RidXNfcmVhZF9jcmVkZW50aWFsc19zb2NrZXQpOiAKKwkgICAgCXJlbmFtZWQgZnJvbSAuLi5fdW5peF9zb2NrZXQKKwkJKF9kYnVzX3NlbmRfY3JlZGVudGlhbHNfdW5peF9zb2NrZXQpOiByZW1vdmVkIG9ic29sYXRlIGZ1bmN0aW9uCisJCisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4tdXRpbC5jOiBkaXNhYmxlZCBEQnVzR3JvdXBJbmZvIHJlbGF0ZWQgY29kZQorCQkoX2RidXNfdmVyaWZ5X2RhZW1vbl91c2VyLF9kYnVzX2NoYW5nZV90b19kYWVtb25fdXNlcik6IAorCQkgICAgbmV3IHdpbjMyIGZ1bmN0aW9ucyBhcyBjb3VudGVycGFydCBvZiB1bml4IHJlbGF0ZWQKKwkKKzIwMDctMDYtMTQgIFNpbW9uIE1jVml0dGllICA8c2ltb24ubWN2aXR0aWVAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogc2F5IHRoZSBwcm90b2NvbCB2ZXJzaW9uIGlzIDEgaW5zdGVhZCBvZgorCTAgKHBhdGNoIGZyb20gS3Jpc3RvZmZlciBMdW5kw6luLCBmZC5vIzEwMDMzKSBhbmQgcmVtb3ZlIHRoZSBGSVhNRQorCWFib3V0IHJlbW92aW5nIHByb3RvY29sIHZlcnNpb24gZnJvbSBtZXNzYWdlcyAoYXMgcGVyIEhhdm9jJ3MgY29tbWVudAorCW9uIHRoYXQgYnVnKQorCisyMDA3LTA2LTE0ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4uYyAoX2RidXNfcGlkX2Zvcl9sb2csX2RidXNfZmx1c2hfY2FjaGVzKTogCisJbmV3IHdpbjMyIGZ1bmN0aW9ucyBhcyBjb3VudGVycGFydCBvZiB1bml4IHJlbGF0ZWQKKworMjAwNy0wNi0xNCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKwkKKwkqIGNtYWtlL21vZHVsZXMvRmluZEtERVdJTi5jbWFrZSwKKwkgIGNtYWtlL21vZHVsZXMvRmluZEtERVdJTl9QYWNrYWdlci5jbWFrZSwgCisJICBjbWFrZS9tb2R1bGVzL1dpbjMyTWFjcm9zLmNtYWtlOiBuZXcgZmlsZXMgZnJvbSB0aGUgCisJICBrZGV3aW4zMiBwcm9qZWN0CisJKiBjbWFrZS9DTWFrZUxpc3RzLnR4dDogY2xlYW5lZCBzdXBwb3J0IGZvciBrZGV3aW4gaW5zdGFsbGVyIGFuZCAKKwkgIHdpbjMyIGV4cGxvcmVyIHdyYXBwZXIKKworMjAwNy0wNi0xMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisJCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lcik6IEZpeAorCWJyb2tlbiByZXR1cm5faWZfZmFpbCAoa2luZCBvZiBzY2FyeSB0aGF0IHRlc3Qgc3VpdGUgZG9lcyBub3QKKwljb3ZlciB0aGlzKQorCisyMDA3LTA2LTEzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXNlcnZlci1zb2NrZXQuYyAoX2RidXNfc2VydmVyX2xpc3Rlbl9zb2NrZXQpOiBzdXBwb3J0CisJYWxsX2ludGVyZmFjZXM9dHJ1ZXxmYWxzZSBmb3IgdGNwIHNlcnZlcnMKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jIChfZGJ1c19saXN0ZW5fdGNwX3NvY2tldCk6IHN1cHBvcnQKKwlpbmFkZHJfYW55IGZsYWcKKworCSogYnVzL3NlbGludXguYzogZml4IHNvbWUgbWlzc2luZyBpbmNsdWRlcworCisJKiBkYnVzL2RidXMtc2VydmVyLXNvY2tldC5jIChfZGJ1c19zZXJ2ZXJfbGlzdGVuX3NvY2tldCk6IGFsbG93CisJcG9ydCB0byBzaW1wbHkgYmUgb21pdHRlZCBpbiBhZGRpdGlvbiB0byBzcGVjaWZ5aW5nIDAKKworMjAwNy0wNi0xMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYywgYnVzL3NlbGludXguYywgZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC11dGlsLmM6IGFkZAorCWxpYmF1ZGl0IHN1cHBvcnQsIG5vIGNsdWUgd2hhdCB0aGlzIG1lYW5zIHJlYWxseSBidXQgbm93IHdlIGhhdmUKKwlpdC4gUGF0Y2hlcyBmcm9tIEZlZG9yYSBwYWNrYWdlLgorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X25ldyk6IG1vdmUgc2VsaW51eCBpbml0aWFsaXphdGlvbiBhZnRlcgorCWNoYW5naW5nIHRvIGRhZW1vbiB1c2VyLCBwYXRjaCBmcm9tIEZlZG9yYSBwYWNrYWdlCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYyAoYXV0aF92aWFfdW5peF91c2VyX2Z1bmN0aW9uKTogZml4IGEgdHlwbworCisyMDA3LTA2LTEyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIpOiBpbXByb3ZlCisJdGhlIGNoZWNrcy93YXJuaW5ncyBmb3IgY29udGFpbmVkX3NpZ25hdHVyZSBhIGJpdAorCisyMDA3LTA2LTEyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKwkKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5jICh3cml0ZV9vcl92ZXJpZnlfdHlwZWNvZGUpOgorCWltcHJvdmUgdGhlIHdhcm5pbmcgYSBiaXQgaWYgeW91IHdyaXRlIGV4dHJhIGRhdGEgaW50byBhIG1lc3NhZ2UKKworMjAwNy0wNi0xMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKHNoYTFfaGFuZGxlX3NlY29uZF9jbGllbnRfcmVzcG9uc2UpCisJKGhhbmRsZV9zZXJ2ZXJfZGF0YV9hbm9ueW1vdXNfbWVjaCk6IGFkZCB0aGUgcHJvY2VzcyBJRCBmcm9tCisJc29ja2V0IGNyZWRlbnRpYWxzLCBpZiBhdmFpbGFibGUsIGV2ZW4gaWYgbm90IHVzaW5nIEVYVEVSTkFMCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYyAoYXV0aF92aWFfZGVmYXVsdF9ydWxlcyk6IHN1cHBvcnQKKwlhbGxvd19hbm9ueW1vdXMgZmxhZworCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Fub255bW91cykKKwkoZGJ1c19jb25uZWN0aW9uX3NldF9hbGxvd19hbm9ueW1vdXMpOiBuZXcgQVBJIGZvciBjb250cm9sbGluZworCWFub255bW91cyBhY2Nlc3MKKworMjAwNy0wNi0wOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX3BvcF9saW5lKTogZml4IHRoaXMgbm90IHRvCisJdGhpbmsgYW4gZW1wdHkgbGluZSBpcyB0aGUgZW5kIG9mIHRoZSBmaWxlLgorCUFsc28sIGZpeCBzb21lIHdoaXRlc3BhY2UuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmctdXRpbC5jOiBhZGQgbW9yZSB0ZXN0cyBmb3IKKwlfZGJ1c19zdHJpbmdfcG9wX2xpbmUoKSByZXZlYWxpbmcgdGhhdCBpdCB0aGlua3MgYW4gZW1wdHkgbGluZSBpcworCXRoZSBlbmQgb2YgdGhlIGZpbGUsIHdoaWNoIGJyb2tlIGRidXMtYXV0aC1zY3JpcHQuYyBzbyAKKwlpdCBkaWRuJ3QgcmVhbGx5IHJ1biB0aGUgc2NyaXB0cworCisJKiBkYnVzL2RidXMtYXV0aC5jOiBhZGQgQU5PTllNT1VTIG1lY2hhbmlzbQorCisJKiBkYnVzL2RidXMtYXV0aC1zY3JpcHQuYyAoX2RidXNfYXV0aF9zY3JpcHRfcnVuKTogZml4IHRvIGRldGVjdAorCWFuIGVtcHR5L25vLW9wIGF1dGggc2NyaXB0OyBhZGQgY29tbWFuZHMgdG8gY2hlY2sgdGhhdCB3ZSBoYXZlIG9yCisJZG9uJ3QgaGF2ZSB0aGUgZXhwZWN0ZWQgY3JlZGVudGlhbHMJCisKKzIwMDctMDYtMDkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvcG9saWN5LmMgKGJ1c19wb2xpY3lfY3JlYXRlX2NsaWVudF9wb2xpY3kpOiBncmFjZWZ1bGx5CisJY29udGludWUgaWYgdGhlIGNvbm5lY3Rpb24gaGFzIG5vIHVuaXggdXNlciAtIGp1c3QgZG9uJ3QgYXBwbHkgCisJYW55IHVuaXggdXNlciBkZXBlbmRlbnQgcnVsZXMuCisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmM6IHJlbW92ZSBkYnVzLXVzZXJkYi5oIHVzYWdlCisKKwkqIGJ1cy9idXMuYzogcmVtb3ZlIGRidXMtdXNlcmRiLmggdXNhZ2UKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jIChfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2F1dGhlbnRpY2F0ZWQpOgorCXN1cHBvcnQgV2luZG93cyB1c2VyIGZ1bmN0aW9uOyBhbHNvLCBmaXggdGhlIGxvZ2ljIGZvciBjaGVja2luZworCWF1dGggYXMgcm9vdCBpbiB0aGUgZGVmYXVsdCBhdXRoIGNvZGUgKGJyb2tlbiBpbiB0aGUgcHJldmlvdXMKKwljb21taXQpCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMKKwkoZGJ1c19jb25uZWN0aW9uX3NldF93aW5kb3dzX3VzZXJfZnVuY3Rpb24pOiBuZXcgZnVuY3Rpb24KKwkoZGJ1c19jb25uZWN0aW9uX2dldF93aW5kb3dzX3VzZXIpOiBuZXcgZnVuY3Rpb24KKworMjAwNy0wNi0wOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9kaXNwYXRjaC5jIChjaGVja19nZXRfY29ubmVjdGlvbl91bml4X3Byb2Nlc3NfaWQpOiBhZGFwdAorCXNpbmNlIHN5c2RlcHMtdW5peC5oIHN0dWZmIGlzbid0IGluY2x1ZGVkIGFueW1vcmUKKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9uZXcpOiB1c2UgbW9yZSBhYnN0cmFjdCBmdW5jdGlvbnMgdG8KKwljaGFuZ2UgdXNlciwgc28gdGhleSBjYW4gYmUgbm8tb3BzIG9uIFdpbmRvd3MKKworCSogZGJ1cy9kYnVzLWNyZWRlbnRpYWxzLmMsIGRidXMvZGJ1cy1jcmVkZW50aWFscy5oLAorCWRidXMvZGJ1cy1jcmVkZW50aWFscy11dGlsLmM6IG5ldyBmaWxlcyBjb250YWluaW5nIGEgZnVsbHkgb3BhcXVlCisJREJ1c0NyZWRlbnRpYWxzIGRhdGEgdHlwZSB0byByZXBsYWNlIHRoZSBvbGQgbm90IG9wYXF1ZSBvbmUuCisKKwkqIGNvbmZpZ3VyZS5pbiAoREJVU19VTklYKTogZGVmaW5lIERCVVNfVU5JWCB0byBtYXRjaCBEQlVTX1dJTiBvbgorCXdpbmRvd3MKKworCSogZGJ1cy9kYnVzLXVzZXJkYi5oOiBwcm9oaWJpdCBvbiBXaW5kb3dzLCBuZXh0IHN0ZXAgaXMgdG8gY2xlYW4KKwl1cCB0aGUgdXNlcyBvZiBpdCBpbiBidXMvKi5jIGFuZCBmYWN0b3Igb3V0IHRoZSBwYXJ0cyBvZiAKKwljb29raWUgYXV0aCB0aGF0IGRlcGVuZCBvbiBpdAorCQorMjAwNy0wNi0wNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IGltcHJvdmUgc29tZSBkb2NzIHJlbGF0ZWQgdG8gcmVhZGluZyB2YWx1ZXMKKwlmcm9tIGEgbWVzc2FnZSBpdGVyCisKKzIwMDctMDYtMDIgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGNtYWtlOiBhZGRlZCBjeWd3aW4gY29tcGlsZSBzdXBwb3J0CisKKzIwMDctMDYtMDEgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLXdpbi5jOiBuZXcgZmlsZSwgcmVwbGFjZXMgc2NyaXB0IHdyYXBwZXIgb24gd2luMzIuCisKKwkqIGNtYWtlL2RidXMtbGF1bmNoLmJhdC5jbWFrZTogcmVtb3ZlZCBvYnNvbGF0ZSBmaWxlCisKKzIwMDctMDUtMzEgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGJ1cy9tYWluLmMgKG1haW4pOiB1c2VzIF9kYnVzX2dldF9jb25maWdfZmlsZV9uYW1lKCkgdG8gZGV0ZWN0IAorCXNlc3Npb24uY29uZiBsb2NhdGlvbiBvbiB3aW4zMi4gCisKKwkqIGRidXMtc3lzZGVwcy13aW4uaCAoX2RidXNfZ2V0X2NvbmZpZ19maWxlX25hbWUsX2RidXNfZmlsZV9leGlzdHMpOiAKKwluZXcgcHJvdG90eXAsIHVuZGVmaW5lZCBpbnRlcmZhY2UgYWZ0ZXIgaW5jbHVkaW5nIHdpbmRvd3MuaCBiZWNhdXNlIAorCWl0IG1ha2VzIHRyb3VibGUgd2hlbiBhIHBhcmFtYXRlciBpcyBuYW1lZCBpbnRlcmZhY2UuCisKKwkqIGRidXMtc3lzZGVwcy13aW4uYyAoX2RidXNfZ2V0X2luc3RhbGxfcm9vdCwKKwlfZGJ1c19nZXRfY29uZmlnX2ZpbGVfbmFtZSxfZGJ1c19maWxlX2V4aXN0cyk6IAluZXcgZnVuY3Rpb25zLgorCisyMDA3LTA1LTI3ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBidXMvcG9saWN5LmMsZGJ1cy9kYnVzLWludGVybmFscy5jOiBmaXhlZCBpbmNvbnNpc3RhbnQgbGluZSBlbmRpbmdzIAorCWFzIHJlcG9ydGVkIGJ5IFBldGVyIEvDvG1tZWwuCisKKzIwMDctMDUtMjUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIFJlbGVhc2VkIDEuMS4wCisKKzIwMDctMDUtMjUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIFNwbGl0IE5FV1MgYW5kIENoYW5nZUxvZyBpbnRvIGEgLnByZS0xLTAgZmlsZSBhcyBwZXIgSEFDS0lORworCVdlIGZvcmdvdCB0byBkbyB0aGlzIGR1cmluZyB0aGUgMS4wIHJlbGVhc2UgYW5kIGl0IG1ha2VzIHNlbnNlCisJbm93IGFzIHdlIGdldCByZWFkeSB0byByZWxlYXNlIHRoZSBmaXJzdCAxLjEuMCBkZXZlbG9wbWVudCB0YXJiYWxsCisKKzIwMDctMDUtMjUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNyZWF0ZSBkaXJlY3RvcnkgdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9zZXNzaW9uLmQgc28gdGhhdAorCW1ha2UgY2hlY2sgcGFzc2VzCisKKzIwMDctMDUtMjUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIElOU1RBTEw6IHJlbW92ZSBkZXBlbmRhbmNpZXMgZm9yIGJpbmRpbmdzIHNpbmNlIHRoZXkgbm8gbG9uZ2VyCisJYXJlIGEgcGFydCBvZiBjb3JlCisKKzIwMDctMDUtMjUgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItd2luLmMsZGJ1cy9kYnVzLXNlcnZlci13aW4uaDogbmV3IGZpbGUgCisJd2l0aCBlbXB0eSBmdW5jdGlvbiBfZGJ1c19zZXJ2ZXJfbGlzdGVuX3BsYXRmb3JtX3NwZWNpZmljKCkuIAorCisJKiBkYnVzL2RidXMtc2VydmVyLmMgKGxpc3Rlbl9mdW5jcyk6IHVzZXMgCisJX2RidXNfc2VydmVyX2xpc3Rlbl9wbGF0Zm9ybV9zcGVjaWZpYyBvbiBhbnkgcGxhdGZvcm0uCisKKzIwMDctMDUtMjUgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXdpbi5jIChmaWxsX3dpbl91c2VyX2luZm9faG9tZWRpcik6IG5vdCBnZXR0aW5nIAorCXVzZXIgaW5mbyBmcm9tIGEgZG9tYWluIGNvbnRyb2xsZXIgaXNuJ3QgYW4gZXJyb3IsIHRoZSBjb21wdXRlciAKKwltYXkgcnVuIGluIGEgbm9uIGRvbWFpbiBjb250ZXh0LiAKKworMjAwNy0wNS0yNSAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmMgKF9kYnVzX2Z1bGxfZHVwbGV4X3BpcGUpOiBmaXhlZCBhc3NlcnRhdGlvbi4KKworMjAwNy0wNS0yNCAgU2ltb24gTWNWaXR0aWUgIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKHRlc3Rfc2VydmljZV9kaXJfbWF0Y2hlcyk6IGZpeGVkIG9yZGVyaW5nIGZvciB1bml4LgorCisJKiBidXMvY29uZmlnLXBhcnNlci5jICh0ZXN0X2RlZmF1bHRfc2Vzc2lvbl9zZXJ2aWNlZGlycyk6IG1hZGUgYWxsb2NhdGlvbiAKKwlvZiBfcHJvZ3MgcGxhdGZvcm0gaW5kZXBlbmRlbnQuCisKKzIwMDctMDUtMjMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvTWFrZWZpbGUuYW0gKGluc3RhbGwtZGF0YS1ob29rKTogY3JlYXRlIHNlc3Npb24uZAorCisJKiBidXMvc2Vzc2lvbi5jb25mLmluOiBhZGQgc2Vzc2lvbi5kIGZvciB0aGUgc2Vzc2lvbiBidXMsIHNvCisJc2VjdXJpdHkgcG9saWN5IGNhbiBiZSBleHRlbmRlZAorCisyMDA3LTA1LTIyIFJhbGYuSGFiYWNrZXIgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogY21ha2UvQ01ha2VMaXN0cy50eHQ6IGZpeGVkIGNyZWF0aW5nIG9mIFRFU1RfLi4uX0JJTkFSWSB0byBtYWtlIAorCWJ1cy10ZXN0IGFibGUgdG8gZmluZCB0aGUgYmluYXJpZXMuCisKKzIwMDctMDUtMjEgU2ltb24gTWNWaXR0aWUgIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGFjaW5jbHVkZS5tNCwgY29uZmlndXJlLmluOiBJbiByZWNlbnQgYXV0b3Rvb2xzLCAke2RhdGFkaXJ9IGlzCisJZGVmaW5lZCBpbiB0ZXJtcyBvZiAke2RhdGFyb290ZGlyfSwgc28gRVhQQU5ERURfREFUQURJUiBuZWVkcyB0byBiZQorCWV4cGFuZGVkIHJlY3Vyc2l2ZWx5LiBSYXRoZXIgdGhhbiBmaXhpbmcgY29uZmlndXJlLmluIHRvIGRvIHRoaXMsIEkKKwlncmFiYmVkIHRoZSBBU19BQ19FWFBBTkQgbWFjcm8gZnJvbSBhdXRvc3RhcnMuc2YubmV0LCB3aGljaCBzZWVtcyB0byBiZQorCWNvbW1vbmx5IHVzZWQuCisKKzIwMDctMDUtMjEgU2ltb24gTWNWaXR0aWUgIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHVwZGF0ZS1kYnVzLWRvY3Muc2g6IEFzc29ydGVkIGltcHJvdmVtZW50czoKKwktIERlZmF1bHQgdXNlciBpZiAkRkRVU0VSIGlzIG5vdCBzZXQgaXMgdGhlIHNzaCBkZWZhdWx0CisJICAoc2V0IGluIH4vLnNzaC9jb25maWcgb3IgYmFzZWQgb24gdGhlIGxvY2FsIHVzZXJuYW1lKSwgbm90IGEKKwkgIGhhcmQtY29kZWQgImpvaG5wIgorCS0gVGVtcG9yYXJ5IGNoZWNrb3V0IGRpcmVjdG9yeSBpcyBjcmVhdGVkIHNlY3VyZWx5IChwcmV2ZW50aW5nIHN5bWxpbmsKKwkgIGF0dGFja3MpLCBpZiBta3RlbXAoMSkgaXMgYXZhaWxhYmxlCisJLSBVc2UgbWFrZSAtQyByYXRoZXIgdGhhbiBjZCAmJiBtYWtlICYmIGNkIC4uCisKKzIwMDctMDUtMjEgU2ltb24gTWNWaXR0aWUgIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIEhBQ0tJTkc6IFBvaW50IHRvIGNvcnJlY3QgbWFpbGluZyBsaXN0CisKKzIwMDctMDUtMjEgU2ltb24gTWNWaXR0aWUgIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBleHBsaWNpdGx5IHNwZWNpZnkgdGhhdCBTVFJJTkcgY2Fubm90CisJY29udGFpbiBlbWJlZGRlZCBOVUxzLgorCisyMDA3LTA1LTIwIFJhbGYuSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbC5jOiBmaXggaW5saW5lIHByb2JsZW0gb24gd2luMzIuCisKKzIwMDctMDUtMjAgUmFsZi5IYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmMgKGZpbGxfd2luX3VzZXJfaW5mb19ob21lZGlyKTogbm90IHJlYWNoaW5nIAorCWRvbWFpbiBjb250cm9sbGVyIGlzbid0IGFuIGVycm9yLCBjb252ZXJ0ZWQgZXJyb3IgbWVzc2FnZSB0byB2ZXJib3NlIAorCW1lc3NhZ2UuCisKKzIwMDctMDUtMTkgUmFsZi5IYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXRlc3QuYyAoZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX3J1bl90ZXN0cyk6IGRpc2FibGVkIAorCXRlc3RzIG5vdCBydW5uaW5nIG9uIHdpbmNlLgorCisyMDA3LTA1LTE5IFJhbGYuSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYyAoX2RidXNfdmVyYm9zZV9pbml0KTogd2luMzIgcmVxdWlyZXMgJ3Zhcm5hbWU9JyAKKwl0byB1bnNldCBhIGVudmlyb25tZW50IHZhcmlhYmxlLiAKKworMjAwNy0wNS0xOSBSYWxmLkhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19zZXRlbnYpOiB3aW4zMiByZXF1aXJlcyAndmFybmFtZT0nIAorCXRvIHVuc2V0IGEgZW52aXJvbm1lbnQgdmFyaWFibGUuIAorCisyMDA3LTA1LTE5IFJhbGYuSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGJ1cy9wb2xpY3kuYyAoYnVzX3BvbGljeV9jcmVhdGVfY2xpZW50X3BvbGljeSk6IAorCXdpbjMyIHRlbXBvcmFyeSBmaXggdW50aWwgdGhlIHVzZXJkYiBzdHVmZiBpcyBwb3J0ZWQgY29tcGxldGx5LgorCisyMDA3LTA1LTE5ICBSYWxmLkhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc2VydmVyLmMgKGxpc3Rlbl9mdW5jcyk6IAorCV9kYnVzX3NlcnZlcl9saXN0ZW5fcGxhdGZvcm1fc3BlY2lmaWMgaXMgZW1wdHkgb24gd2luMzIsIAorCWxpbWl0ZWQgdG8gdW5peCBvbmx5LgorCisJKiBkYnVzL2RidXMtc2VydmVyLmMgKHZhbGlkX2FkZHJlc3Nlcyk6IGxpbWl0IHVuaXggCisJb25seSBhZGRyZXNzZXMgdG8gdW5peC4gCisKKzIwMDctMDUtMTggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogYWRkIGEgR2V0QWxsIHRvIHRoZSBQcm9wZXJ0aWVzCisJaW50ZXJmYWNlLgorCisyMDA3LTA1LTE3IFJhbGYuSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisgCisJKiBidXNcY29uZmlnLXBhcnNlci5jICh0ZXN0X2RlZmF1bHRfc2Vzc2lvbl9zZXJ2aWNlZGlycyk6CisJd2luMzIgZml4LgorCisyMDA3LTA1LTE3IFJhbGYuSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisgCisJKiBjb25maWd1cmUuaW46IGRlZmluZSBjb25zdGFudCBEQlVTX1VOSVguCisKKzIwMDctMDUtMTQgIFJhbGYgSGFiYWNrZXIgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmMgKF9kYnVzX3ByaW50Zl9zdHJpbmdfdXBwZXJfYm91bmQpOgorCWNvbXBpbGUgZml4IGZvciBNUyBQbGF0Zm9ybSBTREsgNiAKKwlwYXRjaCBmcm9tIE1pY2hhZWwgTHVzY2hhcyA8bWx1c2NoYXNAZ21haWwuY29tPgorCisyMDA3LTA1LTEwICBKb2huIChKNSkgUGFsbWllcmkgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMtMS5wYy5pbjogYWRkIGRhZW1vbmRpciB0byBwYyBmaWxlCisJcGF0Y2ggZnJvbSBCcmlhbiBDYW1lcm9uIDxicmlhbi5jYW1lcm9uIGF0IHN1bi5jb20+CisKKzIwMDctMDUtMDQgIFNpbW9uIE1jVml0dGllIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBtZW50aW9uIHRoZSByZXNlcnZlZCBvLmZkLkRCdXMuTG9jYWwKKwlpbnRlcmZhY2UgYW5kIHRoZSBjb3JyZXNwb25kaW5nIC9vL2ZkL0RCdXMvTG9jYWwgb2JqZWN0IHBhdGg7CisJZGVzY3JpYmUgdGhlbSBhcyByZXNlcnZlZCBhbmQgZm9yYmlkIHVzaW5nIHRoZW0gaW4gYSBzZW50IG1lc3NhZ2UsCisJbWVudGlvbmluZyB0aGF0IGluIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gdGhpcyB3aWxsIGNhdXNlIHRoZQorCWNvbm5lY3Rpb24gdG8gYmUgZHJvcHBlZC4gUGF0Y2ggYXBwcm92ZWQgYnkgSGF2b2MuCisKKzIwMDctMDQtMjggIFJhbGYgSGFiYWNrZXIgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogY21ha2UvOiBkb24ndCBpbnN0YWxsIHRlc3QgYXBwbGljYXRpb25zIGFuZCBzZXJ2aWNlIGZpbGVzLAorCW1vdmVkIENNQUtFX0RFQlVHX1BPU1RGSVggdG8gdG9wIGxldmVsIENNYWtlTGlzdHMudHh0CisKKzIwMDctMDQtMjcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmMgKF9kYnVzX29wZW5fc29ja2V0KTogZml4ICMxMDc4MSBmcm9tCisJVG9iaWFzIE55Z3JlbiwgY2hlY2tpbmcgcG9pbnRlciB0byBmZCB2cy4gMCByYXRoZXIgdGhhbiBjaGVja2luZworCXRoZSBmZCBpdHNlbGYKKworMjAwNy0wNC0yNiBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBjbWFrZS86IGFkZGVkIGRlYnVnIHBvc3RmaXhlcyB0byBkZWJ1ZyBleGUncyBmb3IgCisJZWFzaWVyIGRlYnVnZ2luZy4KKwkqIGRidXNcZGJ1cy1zeXNkZXBzLXdpbi5jIChfZGJ1c193aW5fc2V0X2Vycm9yX2Zyb21fd2luX2Vycm9yKTogCisJcHJpbnQgZXJyb3IgY29kZSBpbiBjYXNlIG5vIHN0cmluZyBtZXNzYWdlIGlzIGF2YWlsYWJsZS4KKworMjAwNy0wNC0wNiBTaW1vbiBNY1ZpdHRpZSA8c2ltb24ubWN2aXR0aWVAY29sbGFib3JhLmNvLnVrPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS11dGlsLmMsIGRidXMvZGJ1cy1tZXNzYWdlLmMsCisJZGJ1cy9kYnVzLW1lc3NhZ2UuaDogQWRkIEFQSSB0byBjb252ZXJ0IGEgREJ1c01lc3NhZ2UgdG8vZnJvbSBhCisJYnl0ZSBhcnJheS4gUGF0Y2ggZnJvbSBEYWZ5ZGQgSGFycmllcyA8ZGFmeWRkLmhhcnJpZXNAY29sbGFib3JhLmNvLnVrPiwKKwlhcHByb3ZlZCBieSBIYXZvYyBQZW5uaW5ndG9uLgorCisyMDA3LTA0LTAzICBUaW1vIEhvZW5pZyAgPHRob2VuaWdAc3VzZS5kZT4KKworCSogZGJ1cy9kYnVzLWFkZHJlc3MuYyAoZGJ1c19wYXJzZV9hZGRyZXNzKTogRG8gbm90IGFjY2VwdCB6ZXJvLQorCSAgbGVuZ3RoIGFkZHJlc3MuCisJKiBkYnVzL2RidXMtYWRkcmVzcy5jIChfZGJ1c19hZGRyZXNzX3Rlc3QpOiBBZGQgdGVzdCBmb3IgemVyby0KKwkgIGxlbmd0aCBhZGRyZXNzLgorCisyMDA3LTAzLTI1IFJhbGYuSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGNtYWtlL2RidXMvQ01ha2VMaXN0cy50eHQ6IGRlYnVnIHBvc3RmaXggYWxzbyBmb3IgbWluZ3cuCisKKzIwMDctMDMtMTYgUmFsZi5IYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogY21ha2UvbW9kdWxlcy9GaW5kRXhwYXQuY21ha2U6IGZpeCBwYWNrYWdlIGRldGVjdGlvbiBvbiB3aW4zMi4KKworCSogUkVBRE1FLndpbjogdXBkYXRlIGluc3RhbGwgaW5zdHJ1Y3Rpb25zLiAKKworMjAwNy0wMy0xNiBSYWxmLkhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5oIChfZGJ1c19zcGxpdF9wYXRoc19hbmRfYXBwZW5kKToKKwluZXcgcHJvdG90eXAKKwkoX0RCVVNfUEFUSF9TRVBBUkFUT1IpOiBuZXcgbWFjcm8uIAorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19zcGxpdF9wYXRoc19hbmRfYXBwZW5kKTogbWVyZ2VkIAorCWZyb20gZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jIGFuZCBkYnVzL2RidXMtc3lzZGVwcy13aW4uYy4gCisKKzIwMDctMDMtMTUgUmFsZi5IYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYywgYnVzL3BvbGljeS5jLCAgCisJYnVzL3BvbGljeS5oLCBidXMvZGJ1cy1kYWVtb24uMS5pbiwKKwlidXMvc2Vzc2lvbi5jb25mLmluOiBhZGRlZCBlYXZlc2Ryb3Agc3VwcG9ydCAKKwlmb3IgcmVwbGllcyAtIHBhdGNoIGJ5IG9sbGkuc2FsbGkgYXQgY29sbGFib3JhLmNvLnVrCisJYXBwcm92ZWQgYnkgSGF2b2MgUGVubmluZ3Rvbi4gCisKKzIwMDctMDMtMTUgUmFsZi5IYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1c1xkYnVzLXN5c2RlcHMtd2luLXRocmVhZC5jOiByZW5hbWVkIHRvIAorCWRidXMtc3lzZGVwcy10aHJlYWQtd2luLmMsIGl0IGlzIGEgcGxhdGZvcm0gZGVwZW5kaW5nIGZpbGUgCisJc2ltaWxhcgl0byBkYnVzLXN5c2RlcHMtcHRocmVhZC5jLgorCisyMDA3LTAzLTE1IFJhbGYuSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGNtYWtlXGRvY1xDTWFrZUxpc3RzLnR4dDogYWRkZWQgcHJlbGltYXJ5IHhtbCBkb2MgCisJc3VwcG9ydCwgbmVlZHMgY21ha2UgRmluZCBzY3JpcHQuCisKKzIwMDctMDMtMTQgUmFsZi5IYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogY21ha2U6IGFkZCBkb3h5Z2VuIHN1cHBvcnQKKworMjAwNy0wMy0xNCAgUmFsZi5IYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogY21ha2UvY29uZmlnLmguY21ha2U6IFdJTkNFIGZpeGVzLCBkZWZpbmVkIERCVVNfVU5JWC4KKworMjAwNy0wMy0xMyAgUmFsZi5IYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC13aW4uYyAoZGJ1c19iZWNvbWVfZGFlbW9uKTogCisJd2luMzIgY29tcGlsZSBmaXguIAorCisyMDA3LTAzLTEzICBSYWxmLkhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzLXdpbi5wYXRjaDogcmVtb3ZlZCBvYnNvbGF0ZSBwYXRjaGVzLiAKKworMjAwNy0wMy0xMyAgUmFsZi5IYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmM6IGFkZGVkIHplcm8gYnl0ZSBzZW5kaW5nIAorCWFuZCByZWNlaXZpbmcgYWZ0ZXIgY29ubmVjdGlvbiBzdGFydCB1cAorCisyMDA3LTAzLTExICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy1sYXVuY2guYyAoZG9fY2xvc2Vfc3RkZXJyKTogZml4IEM4OSBwcm9ibGVtIGFuZAorCWZvcm1hdHRpbmcgcHJvYmxlbQorCisJKiBNb3N0bHkgZml4IHRoZSBEQnVzUGlwZSBtZXNzLgorCS0gcHV0IGxpbmUgYnJlYWsgYWZ0ZXIgZnVuY3Rpb24gcmV0dXJuIHR5cGVzCisJLSBwdXQgc3BhY2UgYmVmb3JlIHBhcmVucworCS0gZG8gbm90IHBhc3Mgc3RydWN0cyBhcm91bmQgYnkgdmFsdWUKKwktIGRvbid0IHVzZSBkYnVzX3N0cmVycm9yIGFmdGVyIGNhbGxpbmcgc3VwcG9zZWRseSBjcm9zcy1wbGF0Zm9ybQorCWFwaQorCS0gZG9uJ3QgbmFtZSBwaXBlIHZhcmlhYmxlcyAiZmQiCisJLSBhYnN0cmFjdCBzcGVjaWFsIGZkIG51bWJlcnMgbGlrZSAtMSBhbmQgMQorCisyMDA3LTAzLTEyICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4uaCwgZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmMsIAorCWRidXMvZGJ1cy1zeXNkZXBzLXV0aWwtd2luLmM6IHJlbmFtZWQgZnVuY3Rpb25zIAorCV9kYnVzX3h4eF9maWxlKCkgdG8gX2RidXNfZmlsZV94eHgoKSB0byByZWZsZWN0IAorCXN0cnVjdCBuYW1lIERCdXNGaWxlLiAKKworMjAwNy0wMy0xMiAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC11bml4LmMgKF9kYnVzX2JlY29tZV9kYWVtb24pOgorCWZpeCBfZGJ1c19waWRfZmQgY2hlY2suIAorCisyMDA3LTAzLTEwICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiB0b29scy9kYnVzLXByaW50LW1lc3NhZ2UuYyAocHJpbnRfbWVzc2FnZSk6CisJYWRkZWQgcHJpbnRpbmcgb2YgdGhlIHJlcGx5IHNlcmlhbCB0byBtZXRob2QgcmV0dXJucyBhbmQgCisJZXJyb3JzLCBzbyB5b3UgY2FuIGFjdHVhbGx5IGZpZ3VyZSBvdXQgdGhlIG1lc3NhZ2UvcmVwbHkgCisJcGFpcnMgLSBwYXRjaCBieSBvbGxpLnNhbGxpIGF0IGNvbGxhYm9yYS5jby51ay4KKworMjAwNy0wMy0xMCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy13aW4ucGF0Y2g6IHJlbW92ZWQgY29tbWl0dGVkIHBhdGNoZXMuIAorCisyMDA3LTAzLTEwICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBidXMvYnVzLmMsIGJ1cy9idXMuaCwgYnVzL21haW4uYywgYnVzL3Rlc3QuYywKKwlkYnVzL2RidXMtc3lzZGVwcy11bml4LmMsIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jLAorCWRidXMvZGJ1cy1zeXNkZXBzLXV0aWwtd2luLmMsIGRidXMvZGJ1cy1zeXNkZXBzLXdpbi5jLAorCWRidXMvZGJ1cy1zeXNkZXBzLmg6IHJlbmFtZWQgX2RidXNfeHh4X3BpcGUgdG8gX2RidXNfcGlwZV94eHgsCisJY29tcGxldGVkIF9kYnVzX3BpcGUgc3VwcG9ydC4gCisKKzIwMDctMDMtMTAgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmggKF9kYnVzX2xpc3Rlbl90Y3Bfc29ja2V0KToKKwljaGFuZ2VkIHR5cGUgb3IgcG9ydCB0byBwb2ludGVyLCBiZWNhdXNlIHRoZSBwb3J0IGlzIGdpdmVuIGJhY2suCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItc29ja2V0LmMgKF9kYnVzX3NlcnZlcl9uZXdfZm9yX3RjcF9zb2NrZXQpOgorCWltcGxlbWVudGVkIHJldHVybmluZyB0Y3AgcG9ydC4gU2tpcHBpbmcgcG9ydCBwYXJhbWV0ZXIKKwlhbmQgbm9uIGludGVnZXIgcG9ydCB2YWx1ZXMgaW4gY29uZmlnIDxsaXN0ZW4+IHN0YXRlbWVudAorCW5lZWRzIG1vcmUgZWZmb3J0LgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmMsIGRidXMvZGJ1cy1zeXNkZXBzLXdpbi5jCisJKF9kYnVzX2xpc3Rlbl90Y3Bfc29ja2V0KTogcmV0dXJuIHRoZSByZWFsIHVzZWQgdGNwIHBvcnQuCisKKwkqIGJ1cy9kYnVzLWRhZW1vbi4xLmluOiBhZGRlZCA8bGlzdGVuPiB0Y3AgZXhhbXBsZXMKKworMjAwNy0wMy0wOSAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogY21ha2UvY29uZmlnLmguY21ha2U6IHdpbjMyIG1zdmMgYnVnIGZpeAorCisyMDA3LTAzLTA5ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBjbWFrZS9jb25maWcuaC5jbWFrZTogZml4ZWQgREJVU19XSU54eCBkZWZpbmVzLAorCXVzaW5nIF9XSU5DRSBkb2VzIG5vdCB3b3JrLgorCisyMDA3LTAzLTA4ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzLXdpbi5wYXRjaDogcmVtb3ZlZCBfZGJ1c193cml0ZV9waXBlKCkgcGF0Y2gsIGl0IGlzIG5vdyAKKwljb21taXR0ZWQuCisKKzIwMDctMDMtMDggIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGJ1cy9idXMuYywgZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jLCBkYnVzL2RidXMtc3lzZGVwcy5oOgorCXJlbmFtZSBwaXBlIHJlbGF0ZWQgd3JpdGUoKSBmdW5jdGlvbiBjYWxscyB0byBfZGJ1c193cml0ZV9waXBlKCkuCisKKzIwMDctMDMtMDggIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMtd2luLnBhdGNoOiBhZGRlZCBidXMvY29uZmlnLWxvYWRlci1saWJleHBhdC5jIHBhdGNoLCAKKwl1c2VzIERCVVNfV0lOIGZvciBhbGxzIHdpbjMyIHJlbGF0ZWQgI2lmZGVmcywgCisJc29tZSBtaW5vciBjbGVhbnVwcworCisyMDA3LTAzLTA4ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzLXdpbi5wYXRjaDogdXBkYXRlZCBwYXRjaCBmb3IgYnVzL2Rpc3BhdGNoLmMuCisKKzIwMDctMDMtMDggIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMtd2luLnBhdGNoOiBkYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3VzZXIsCisJZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3Byb2Nlc3NfaWQpOiBMZXQgcmV0dXJuIHRoZW0gdmFsaWQgdXNlciBpZCdzLCAKKwlvdGhlcndpc2UgYnVzLXRlc3QgZmFpbHMuIEhvdyB0byByZXBsYWNlIG9uIHdpbjMyID8uCisJCisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4uYyAoZmlsbF93aW5fdXNlcl9pbmZvX2hvbWVkaXIpOgorCWZpeCBtZW1vcnkgbGVhay4KKworMjAwNy0wMy0wOCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmMgKF9kYnVzX3dpbl9zZXRfZXJyb3JfZnJvbV93aW5fZXJyb3IpOgorCXVzZSBkYnVzIGZyaWVuZGx5IGVycm9yIG5hbWUuCisJKGZpbGxfd2luX3VzZXJfaW5mb19ob21lZGlyKTogcHJpbnQgdXNlciBuYW1lIGluIGVycm9yIGNhc2UgdG9vLgorCisyMDA3LTAzLTA4ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBjbWFrZS9Db25maWd1cmVDaGVja3MuY21ha2U6IGZpeGVkIHNvY2tldHBhaXIgY2hlY2sKKworMjAwNy0wMy0wOCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogYnVzL2Rpc3BhdGNoLmM6IGRpc2FibGVkIHNlZ2ZhdWx0IHRlc3Qgb24gd2luMzIgZm9yIG5vdworCisyMDA3LTAzLTA4ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBjb25maWd1cmUuaW4sIGNtYWtlL0NvbmZpZ3VyZUNoZWNrcy5jbWFrZTogYWRkZWQgY2hlY2sgCisJZm9yIHNldHJsaW1pdC4gCisJKiB0ZXN0L3Rlc3Qtc2VnZmF1bHQuYzogb25seSBpbmNsdWRlIHNldHJsaW1pdCBzdHVmZiBvbmx5IAorCXdoZW4gYXZhaWxhYmxlLiAgCisKKzIwMDctMDMtMDcgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIHRlc3QvdGVzdC1zZWdmYXVsdC5jOiB1bml4IGNvbXBpbGUgZml4LgorCSogZGJ1cy13aW4ucGF0Y2g6IHJlbW92ZWQgb2Jzb2xhdGUgcGF0Y2hlcy4KKworMjAwNy0wMy0wNyAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogYnVzL2FjdGl2YXRpb24uYzogcmVtb3ZlZCBvYnNvbGF0ZSBpbmNsdWRlIGhlYWRlci4KKwkqIHRlc3QvdGVzdC1zZWdmYXVsdC5jOiB3aW4zMiBjb21waWxlIGZpeCwgcmxpbWl0IAorCWlzbid0IGF2YWlsYWJsZSBvbiB3aW4zMi4KKwkqIGRidXMtd2luLnBhdGNoOiByZW1vdmVkIHNvbWUgbW9yZSBwYXRjaGVzLCB0aGV5CisJYXJlIGFwcGxpZWQgb3Igb2Jzb2xhdGUgCisKKzIwMDctMDMtMDYgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGJ1cy13aW4ucGF0Y2g6IGZpeGVzIHVuaXggbGlzdGVuIHByb2JsZW1zLCBkYnVzLXRlc3QgCisJbm93IHJ1bnMuCisKKzIwMDctMDMtMDYgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGNtYWtlL2RidXMvQ01ha2VMaXN0cy50eHQsY21ha2UvYnVzL0NNYWtlTGlzdHMudHh0LAorCWNtYWtlL0NNYWtlTGlzdHMudHh0OiB3aW4zMiBjb21waWxlIGZpeAorCisyMDA3LTAzLTA0ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzLXdpbi5wYXRjaCwgUkVBRE1FLndpbjogYWRkZWQgYXZhaWxhYmxlIHdpbjMyIAorCXBhdGNoZXMgZnJvbSB3aW5kYnVzIHByb2plY3QgKGh0dHA6Ly9zZi5uZXQvcHJvamVjdHMvd2luZGJ1cykKKworMjAwNy0wMy0wNCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogYnVzL2FjdGl2YXRpb24uYzogKGJ1c19hY3RpdmF0aW9uX2FjdGl2YXRlX3NlcnZpY2UpOgorCWZpeGVkIGNhbGwgdG8gX2RidXNfc3Bhd25fYXN5bmNfd2l0aF9iYWJ5c2l0dGVyKCkuCisKKzIwMDctMDMtMDQgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zcGF3bi5jLGRidXMvZGJ1cy1zcGF3bi5oIChfZGJ1c19zcGF3bl9hc3luY193aXRoX2JhYnlzaXR0ZXIpOgorCWFkZGVkIGVudmlyb25tZW50IHBvaW50ZXIgYXMgZnVuY3Rpb24gcGFyYW1ldGVyLCB1c2VkIG9uIHdpbjMyLgorCisJKiB0ZXN0L3NwYXduLXRlc3QuYzogZml4ZWQgY2FsbCB0byBhYm92ZSBtZW50aW9uZWQgZnVuY3Rpb24uCisKKzIwMDctMDMtMDQgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGNvbmZpZ3VyZS5pbix0ZXN0L3Rlc3Qtc2xlZXAtZm9yZXZlci5jLHRlc3QvdGVzdC1uYW1lcy5jOiAKKwlhZGRlZCBjb25maWd1cmUgY2hlY2sgZm9yIHVuaXN0ZC5oLgorCisyMDA3LTAzLTA0ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiB0ZXN0L01ha2VmaWxlLmFtOiBmaXhlZCB0ZXN0IGRhdGEgY29weSBwcm9ibGVtIGluIAorCW91dCBvZiBzb3VyY2UgYnVpbGQsIHdoZW4gc291cmNlcyBjYW1lIGZyb20gc3ZuIG9yIGN2cy4gCisKKzIwMDctMDMtMDMgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvKi13aW4uKixidXMvKi13aW4uKjogYWRkZWQgd2luMzIgcGxhdGZvcm0gcmVsYXRlZAorCWZpbGVzLiBUaGVzZSBmaWxlcyBhcmUgb25seSBhZGRlZCB0byB0aGUgY21ha2UgYnVpbGQgc3lzdGVtLiAgCisJVGhlIG1pc3NpbmcgZGJ1cy13aW4ucGF0Y2ggZmlsZSB3aWxsIGJlIGFkZGVkIGxhdGVyLiAKKworMjAwNy0wMy0wMyAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogY21ha2U6IG5ldyBkaXJlY3RvcnksIGNvbnRhaW5zIGNtYWtlIGJ1aWxkIHN1cHBvcnQuCisJU2VlIGh0dHA6Ly93d3cuY21ha2Uub3JnIGZvciBtb3JlIGluZm9ybWF0aW9ucy4KKwlDdXJyZW50bHkgb25seSB1bml4IHdpbGwgYmUgYnVpbGRhYmxlIGJlY2F1c2Ugc29tZSAKKwl3aW4zMiByZXF1aXJlZCBmaWxlcyBhcmUgc3RpbGwgbWlzc2luZy4gCisKKzIwMDctMDMtMDMgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnb0BrZGUub3JnPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmM6IGNhcHR1cmUgdGhlIGRidXMtbGF1bmNoIHN0ZGVycgorICAgICAgICBvdXRwdXQgYW5kIGFkZCBpdCB0byB0aGUgREJ1c0Vycm9yIG1lc3NhZ2Ugd2UgcmV0dXJuLgorCisJKiB0b29scy9kYnVzLWxhdW5jaC4xOgorCSogdG9vbHMvZGJ1cy1sYXVuY2guYzogQWRkIG9wdGlvbiAtLWNsb3NlLXN0ZGVyciB0bywgd2VsbCwKKwljbG9zZSBzdGRlcnIgYmVmb3JlIHN0YXJ0aW5nIGRidXMtZGFlbW9uLgorCisyMDA3LTAxLTMxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL2RidXMtZGFlbW9uLjEuaW46IHdyaXRlIGEgc2VjdGlvbiBpbiB0aGUgbWFuIHBhZ2Ugb24gcnVubmluZworCWEgdGVzdCBkYWVtb24gZm9yIGRlYnVnZ2luZyBwdXJwb3NlcworCisyMDA3LTAxLTI2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL3Nlc3Npb24uY29uZi5pbjogb3ZlcnJpZGUgYWxsIHRoZSBkZWZhdWx0IGxpbWl0cyB3aXRoIG11Y2gKKwloaWdoZXIgbGltaXRzIG9uIHRoZSBzZXNzaW9uIGJ1cywgdGhlcmUgaXMgbm8gcmVhc29uIHRoZSBzZXNzaW9uCisJYnVzIHNob3VsZCBoYXZlIGxvdyBsaW1pdHMKKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYyAoYnVzX2NvbmZpZ19wYXJzZXJfbmV3KTogaW5jcmVhc2UgZGVmYXVsdAorCWxpbWl0cyBzbyB0aGV5IGFyZSBsZXNzIGxpa2VseSB0byBiZSBoaXQ7IGluIHBhcnRpY3VsYXIgdGhlIG1heAorCXJlcGxpZXMgcGVyIGNvbm5lY3Rpb24gd2FzIHdheSB0b28gbG93CisKKzIwMDYtMDEtMjUgIFNpbW9uIE1jVml0dGllICA8c2ltb24ubWN2aXR0aWVAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2MvZGJ1cy10dXRvcmlhbC54bWw6IFJlcGxhY2UgUHl0aG9uIHNlY3Rpb24gb2YgdHV0b3JpYWwgd2l0aAorCWEgcG9pbnRlciB0byB0aGUgdHV0b3JpYWwgbWFpbnRhaW5lZCBhcyBwYXJ0IG9mIGRidXMtcHl0aG9uCisKKzIwMDYtMTItMzEgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYzogdW5peCBjb21waWxlIGZpeCwgbW92ZWQgCisJYXRvbWljX2V4Y2hhbmdlX2FuZF9hZGQoKSBmcm9tIGRidXMvZGJ1cy1zeXNkZXBzLmMgCisJdG8gaGVyZSwgaXQncyB1c2VkIGJ5IF9kYnVzX2F0b21pY19pbmMoKSBhbmQgX2RidXNfYXRvbWljX2RlYygpLgorCisyMDA2LTEyLTMxICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiB0b29scy9kYnVzLW1vbml0b3IuYzogZ2V0dGltZW9mZGF5KCkgaXMgbm90IGF2YWlsYWJsZSAKKwlvbiB3aW5kb3dzIHNvIHdlIGhhdmUgdG8gcHJvdmlkZSBvdXIgb3duLiBJdCdzIHRha2VuIGZyb20gCisJbGdwbCdkIGtkZXdpbjMyIHBhY2thZ2UuIC0gUGF0Y2hlcyBmcm9tIENocmlzdGlhbiBFaHJsaWNoZXIKKworMjAwNi0xMi0zMSAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jOiBtb3ZlZCBfZGJ1c19hdG9taWNfaW5jL2RlYygpIAorCWZyb20gZGJ1cy9kYnVzLXN5c2RlcHMuYywgd2luZG93cyB2ZXJzaW9uIG9mIF9kYnVzX2F0b21pY19pbmMvZGVjKCkgCisJaXMgaW4gZGJ1cy1zeXNkZXBzLXdpbi5jIChub3QgaW4gdGhpcyBwYXRjaCkuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmg6IERCdXNBdG9taWM6OnZhbHVlIGlzIGxvbmcgb24gd2luZG93cyB0byBmaXQgCisJd2l0aCBJbnRlcmxvY2tlZEluYy9EZWNyZW1lbnQuIAorCS0gUGF0Y2hlcyBmcm9tIENocmlzdGlhbiBFaHJsaWNoZXIKKwkKKzIwMDYtMTItMzEgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIHRvb2xzL2RidXMtc2VuZC5jLCB0b29scy9kYnVzLW1vbml0b3IuYzogd2luMzIgY29tcGlsZSBmaXguCisKKzIwMDYtMTItMzEgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5jICh0eXBlIERCdXNUeXBlUmVhZGVyQ2xhc3MpOgorCWZpeCBtaXNwYWNlZCBjb25zdCBzdGF0ZW1lbnQuIC0gUGF0Y2ggZnJvbSBQZXRlciBLw7xtbWVsCisKKzIwMDYtMTItMTkgIFJheSBTdHJvZGUgIDxyc3Ryb2RlQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9idXMuYyAocHJvY2Vzc19jb25maWdfZXZlcnlfdGltZSk6CisJZG9uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGJ1cyBjb250ZXh0IGFjdGl2YXRpb24gb2JqZWN0CisJdW50aWwgYWZ0ZXIgd2UndmUgY2hlY2tlZCB0aGF0IHRoZSBuZXcgYWN0aXZhdGlvbiBpcworCXZhbGlkLgorCisJKiBidXMvbWFpbi5jIAorCShzaWduYWxfaGFuZGxlciksIChoYW5kbGVfcmVsb2FkX3dhdGNoKToKKwlkb24ndCBjYWxsIGV4aXQoKSBvbiBmYWlsdXJlLCBpbnN0ZWFkIG1ha2UgZG8gYW5kIGtlZXAKKwlnb2luZy4KKwkoY2xvc2VfcmVsb2FkX3BpcGUpOiBuZXcgZnVuY3Rpb24gdG8gdHVybiBvZmYKKwloYW5ndXAtY2F1c2VzLWNvbmZpZy1yZWxvYWQgYmVoYXZpb3IgaWYgYW4gdW5leHBlY3RlZAorCWVycm9yIG9jY3VycworCisyMDA2LTEyLTEzICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4tdGhyZWFkLmMgKF9kYnVzX2NvbmR2YXJfd2FpdF93aW4zMik6CisJY29ycmVjdG5lc3MgZml4LiAtIFBhdGNoIGZyb20gQ2hyaXN0aWFuIEVocmxpY2hlcgorCisyMDA2LTEyLTEzICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmg6IG1zdmMgYWxzbyBrbm93cyBhYm91dCBfX0ZVTkNUSU9OX18sIAorCXdlIHNob3VsZCBhbHNvIHVzZSBpdC4gLSBQYXRjaCBmcm9tIENocmlzdGlhbiBFaHJsaWNoZXIKKworMjAwNi0xMi0xMyAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKyAgCisJKiBkYnVzLXN5c2RlcHMtdXRpbC5jOiBhZGRlZCB3aW4zMiByZWxhdGVkIHRlc3RzCisKKzIwMDYtMTItMTIgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX3BvcF9saW5lKSwKKwlidXMvZGVza3RvcC1maWxlLmMgKHBhcnNlX3NlY3Rpb25fc3RhcnQsCisJcGFyc2VfY29tbWVudF9vcl9ibGFuayxwYXJzZV9rZXlfdmFsdWUsKTogdXNlcworCV9kYnVzX3N0cmluZ19maW5kX2VvbCgpIHRvIHN1cHBvcnQgcGxhdGZvcm0gaW5kZXBlbmRlbnQgZW9sIHN0eWxlLgorCisyMDA2LTEyLTEyICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3RyaW5nLltjaF0gKF9kYnVzX3N0cmluZ19maW5kX2VvbCk6IG5ldyBmdW5jdGlvbi4gCisJKiBkYnVzL2RidXMtc3RyaW5nLXV0aWwuYyAoX2RidXNfc3RyaW5nX3Rlc3QpOiBhZGRlZCB0ZXN0Y2FzZXMgZm9yIAorCSAgICAgIF9kYnVzX3N0cmluZ19maW5kX2VvbCgpLgorCUFwcHJvdmVkIGJ5OiBIYXZvYyBQZW5uaW5ndG9uLgorCisyMDA2LTEyLTEyICBUaW0gRGlqa3N0cmEgPHRpbUBmYW1kaWprc3RyYS5vcmc+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgc3dpdGNoIHRvIGRpc2FibGUgdXNlcl9kYXRhYmFzZSBjYWNoaW5nLgorCisJKiBkYnVzL2RidXMtdXNlcmRiLXV0aWwuYywgZGJ1cy9kYnVzLXVzZXJkYi5jOiBBZGQgaWZkZWZzIHRvCisJYmUgYWJsZSBkaXNhYmxlIHVzZXJfZGFiYXNlIGNhY2hpbmcuCisKKzIwMDYtMTItMTIgIFRpbSBEaWprc3RyYSA8dGltQGZhbWRpamtzdHJhLm9yZz4KKworCSogYnVzL2J1cy5jLCBidXMvYnVzLmg6IFJlbW92ZSBEQnVzVXNlckRhdGFiYXNlIGZyb20gdGhlIEJ1c0NvbnRleHQgCisJc3RydWN0LiBJdCBpcyB1bm5lY2Vzc2FyeSB3ZSBoYXZlIGEgZ2xvYmFsIG9uZSBhbHJlYWR5LiBBbHNvIHJlbW92ZSAKKwlidXNfY29udGV4dF9nZXRfdXNlcl9kYXRhYmFzZSBmdW5jdGlvbiwgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KKwlGbHVzaCB0aGUgZ2xvYmFsIGRhdGFiYXNlIG9uIHJlbG9hZC4KKworCSogZGJ1cy9kYnVzLXVzZXJkYi11dGlsLmM6IFJlcGxhY2UgX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfZ3JvdXBzIAorCXdpdGggX2RidXNfZ3JvdXBzX2Zyb21fdWlkLiBJdCBubyBsb25nZXIgbmVlZHMgYSBEQnVzVXNlckRhdGFiYXNlLgorCisJKiBkYnVzL2RidXMtdXNlcmRiLmMsIGRidXMvZGJ1cy11c2VyZGIuaDogCisJQWRkIF9kYnVzX3VzZXJfZGF0YWJhc2VfZmx1c2hfc3lzdGVtLiAKKwlNYWtlIG1vcmUgZnVuY3Rpb25zIERCVVNfVVNFUkRCX0lOQ0xVREVTX1BSSVZBVEUuIAorCVNtYWxsIHVucmVsYXRlZCBjaGFuZ2UgaW4gX2RidXNfaXNfYV9udW1iZXI6IGNoYW5nZSAKKwlfZGJ1c19zdHJpbmdfcGFyc2VfaW50IHRvIF9kYnVzX3N0cmluZ19wYXJzZV91aW50LiAKKworCSogYnVzL2Nvbm5lY3Rpb24uYzogQ2hhbmdlIGNhbGwgdG8gX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfZ3JvdXBzIHRvIAorCV9kYnVzX2dyb3Vwc19mcm9tX3VpZC4KKworCSogYnVzL3BvbGljeS5jLCBidXMvcG9saWN5Lmg6IENoYW5nZSBjYWxsIHRvIAorCV9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X2dyb3VwcyB0byBfZGJ1c19ncm91cHNfZnJvbV91aWQuIFJlbW92ZSAKKwlEQnVzVXNlckRhdGFiYXNlIGZyb20gYnVzX3BvbGljeV9hbGxvd191c2VyIHByb3RvdHlwZSwgaXQgbm8gbG9uZ2VyIAorCW5lZWRzIGl0LgorCisyMDA2LTEyLTEyICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBidXMvc2lnbmFsLmM6IEZpeCBtYXRjaF9ydWxlX2VxdWFsIGVycmF0YQorCShDVkUtMjAwNi02MTA3IC0gUGF0Y2ggZnJvbSBLaW1tbyBIw6Rtw6Rsw6RpbmVuIAorCTxraW1tby5oYW1hbGFpbmVuQG5va2lhLmNvbT4pCisKKzIwMDYtMTEtMTkgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnb0BrZGUub3JnPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy1wdGhyZWFkLmMgKF9kYnVzX3B0aHJlYWRfbXV0ZXhfbG9jaywKKyAgICAgICAgX2RidXNfcHRocmVhZF9jb25kdmFyX3dhaXQsCisgICAgICAgIF9kYnVzX3B0aHJlYWRfY29uZHZhcl93YWl0X3RpbWVvdXQpOiBzZXQgcG11dGV4LT5ob2xkZXIgdG8KKyAgICAgICAgcHRocmVhZF9zZWxmKCkgYWZ0ZXIgY29taW5nIGJhY2sgZnJvbSBhIGNvbmRpdGlvbmFsIHZhcmlhYmxlCisgICAgICAgIHdhaXQgYXMgd2VsbCBhcyBpbiBvbmUgY29kZXBhdGggd2hlcmUgaXQgd2FzIGZvcmdvdHRlbi4KKwlBcHByb3ZlZCBieTogSGF2b2MgUGVubmluZ3Rvbi4KKworMjAwNi0xMS0xNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHVwZGF0ZS1kYnVzLWRvY3Muc2g6IGFsbG93IHNldHRpbmcgZmQub3JnIHVzZXJuYW1lIHZpYSBlbnYKKwl2YXJpYWJsZS4gTWFrZSBpdCBydW4gYXV0b2dlbiB3aXRoIC0tZW5hYmxlLXhtbC1kb2NzPXllcworCS0tZW5hYmxlLWRveHlnZW4tZG9jcz15ZXMgc28gY29uZmlndXJlIHdpbGwgZmFpbCBpZiB0aGUgcmVxdWlyZWQKKwl0b29scyBhcmUgbWlzc2luZy4KKworMjAwNi0xMS0xNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9kYnVzLWZhcS54bWw6IG1pbm9yIEZBUSB0d2Vha3MKKworMjAwNi0xMS0xNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisJCisJKiBkYnVzL2RidXMtbWlzYy5jLCBkYnVzL2RidXMtbWlzYy5oOiBNb3ZlCisJZGJ1c19nZXRfbG9jYWxfbWFjaGluZV9pZCgpIHRvIGl0cyBvd24gZmlsZSwgbm8gc3Vic3RhbnRpdmUKKwljaGFuZ2VzLiBUaGVyZSBhcmUgYSBjb3VwbGUgb3RoZXIgdGhpbmdzIHdlIG1pZ2h0IHdhbnQgdG8gYWRkIHRoYXQKKwlhcmUgIm1pc2MiIHNvIG1vdmluZyBvdXQgb2YgZGJ1cy1jb25uZWN0aW9uLltoY10gd2hpY2ggaXMgYmlnCisJZW5vdWdoIGFscmVhZHkuCisJCisyMDA2LTExLTE0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c19nZW5lcmF0ZV91dWlkKTogVGhlIHNwZWMgc2FpZCB0aGUKKwlVVUlEIGhhZCB0aGUgdGltZXN0YW1wIGxhc3QsIGJ1dCB0aGUgaW1wbGVtZW50YXRpb24gaGFkIGl0IGZpcnN0OworCW1vdmUgaXQgdG8gbGFzdCBzaW5jZSBJIHRoaW5rIGl0J3MgYSB0aW55IGJpdCBuaWNlciAoZWFzaWVyIHRvCisJY29tcGFyZSBhdCBhIGdsYW5jZSwgZmFzdGVyIHRvIHNvcnQsIGxlc3MgY29kZSksIGFuZCB3aWxsIG5vdAorCWNhdXNlIGFueSBwcmFjdGljYWwgY29tcGF0aWJpbGl0eSBwcm9ibGVtcy4gQWxzbywgYWx3YXlzIGNvbnZlcnQKKwl0aGUgdGltZXN0YW1wIHRvIGJpZyBlbmRpYW4uCisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBDbGVhbiB1cCB0aGUgZG9jcyBvbiB0aGUgVVVJRC4KKworCSogdG9vbHMvZGJ1cy11dWlkZ2VuLjE6IG1vcmUgcHJvbWluZW50bHkgc2F5IGl0IGlzIG5vdCBzdWl0YWJsZQorCWFzIGEgcmVwbGFjZW1lbnQgZm9yIHJlZ3VsYXIgdXVpZGdlbi9SRkM0MTIyLgorCisyMDA2LTExLTE0ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdGhyZWFkcy5oOiBmaXggREJVU19USFJFQURfRlVOQ1RJT05TX0FMTF9NQVNLIHRvIGhhdmUKKwl0aGUgY29ycmVjdCB2YWx1ZSBzbyB3ZSBkb24ndCBhc3NlcnQgd2hlbiBpbml0YWxpemluZyByZWN1cnNpdmUgdGhyZWFkcworCisJKiB0ZXN0L25hbWUtdGVzdC90ZXN0LXRocmVhZC1pbml0LmM6IGNhbGwgZGJ1c190aHJlYWRzX2luaXRfZGVmYXVsdAorCWluc3RlYWQgb2YgX2RidXNfdGhyZWFkc19pbml0X2RlYnVnIHNpbmNlIGl0IGlzIG1vcmUgb2YgYSByZWFsIHdvcmxkCisJdGVzdAorCmRpZmYgLS1naXQgYS9kYnVzL0NsZWFuU3BlYy5tayBiL2RidXMvQ2xlYW5TcGVjLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NGUxYjYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL0NsZWFuU3BlYy5tawpAQCAtMCwwICsxLDQ5IEBACisjIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIElmIHlvdSBkb24ndCBuZWVkIHRvIGRvIGEgZnVsbCBjbGVhbiBidWlsZCBidXQgd291bGQgbGlrZSB0byB0b3VjaAorIyBhIGZpbGUgb3IgZGVsZXRlIHNvbWUgaW50ZXJtZWRpYXRlIGZpbGVzLCBhZGQgYSBjbGVhbiBzdGVwIHRvIHRoZSBlbmQKKyMgb2YgdGhlIGxpc3QuICBUaGVzZSBzdGVwcyB3aWxsIG9ubHkgYmUgcnVuIG9uY2UsIGlmIHRoZXkgaGF2ZW4ndCBiZWVuCisjIHJ1biBiZWZvcmUuCisjCisjIEUuZy46CisjICAgICAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHRvdWNoIC1jIGV4dGVybmFsL3NxbGl0ZS9zcWxpdGUzLmgpCisjICAgICAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU1RBVElDX0xJQlJBUklFUy9saWJ6X2ludGVybWVkaWF0ZXMpCisjCisjIEFsd2F5cyB1c2UgInRvdWNoIC1jIiBhbmQgInJtIC1mIiBvciAicm0gLXJmIiB0byBncmFjZWZ1bGx5IGRlYWwgd2l0aAorIyBmaWxlcyB0aGF0IGFyZSBtaXNzaW5nIG9yIGhhdmUgYmVlbiBtb3ZlZC4KKyMKKyMgVXNlICQoUFJPRFVDVF9PVVQpIHRvIGdldCB0byB0aGUgIm91dC90YXJnZXQvcHJvZHVjdC9ibGFoLyIgZGlyZWN0b3J5LgorIyBVc2UgJChPVVRfRElSKSB0byByZWZlciB0byB0aGUgIm91dCIgZGlyZWN0b3J5LgorIworIyBJZiB5b3UgbmVlZCB0byByZS1kbyBzb21ldGhpbmcgdGhhdCdzIGFscmVhZHkgbWVudGlvbmVkLCBqdXN0IGNvcHkKKyMgdGhlIGNvbW1hbmQgYW5kIGFkZCBpdCB0byB0aGUgYm90dG9tIG9mIHRoZSBsaXN0LiAgRS5nLiwgaWYgYSBjaGFuZ2UKKyMgdGhhdCB5b3UgbWFkZSBsYXN0IHdlZWsgcmVxdWlyZWQgdG91Y2hpbmcgYSBmaWxlIGFuZCBhIGNoYW5nZSB5b3UKKyMgbWFkZSB0b2RheSByZXF1aXJlcyB0b3VjaGluZyB0aGUgc2FtZSBmaWxlLCBqdXN0IGNvcHkgdGhlIG9sZAorIyB0b3VjaCBzdGVwIGFuZCBhZGQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4KKyMKKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVAorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIyBGb3IgZXhhbXBsZToKKyMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqL0FQUFMvQW5kcm9pZFRlc3RzX2ludGVybWVkaWF0ZXMpCisjJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9jb3JlX2ludGVybWVkaWF0ZXMpCisjJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBmaW5kICQoT1VUX0RJUikgLXR5cGUgZiAtbmFtZSAiSUdUYWxrU2Vzc2lvbioiIC1wcmludDAgfCB4YXJncyAtMCBybSAtZikKKyMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9kYXRhLyopCisKKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVAorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2RidXMvRG94eWZpbGUuaW4gYi9kYnVzL0RveHlmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYWM2MzkKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL0RveHlmaWxlLmluCkBAIC0wLDAgKzEsMTgxIEBACisjIERveHlmaWxlIDAuMQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEdlbmVyYWwgY29uZmlndXJhdGlvbiBvcHRpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQUk9KRUNUX05BTUUgICAgICAgICAgID0gRC1CdXMKK1BST0pFQ1RfTlVNQkVSICAgICAgICAgPSBAVkVSU0lPTkAKK09VVFBVVF9ESVJFQ1RPUlkgICAgICAgPSBkb2MvYXBpCitPVVRQVVRfTEFOR1VBR0UgICAgICAgID0gRW5nbGlzaAorRVhUUkFDVF9BTEwgICAgICAgICAgICA9IE5PCitFWFRSQUNUX1BSSVZBVEUgICAgICAgID0gTk8KK0VYVFJBQ1RfU1RBVElDICAgICAgICAgPSBOTworSElERV9VTkRPQ19NRU1CRVJTICAgICA9IE5PCitISURFX1VORE9DX0NMQVNTRVMgICAgID0gTk8KK0JSSUVGX01FTUJFUl9ERVNDICAgICAgPSBZRVMKK1JFUEVBVF9CUklFRiAgICAgICAgICAgPSBZRVMKK0FMV0FZU19ERVRBSUxFRF9TRUMgICAgPSBOTworRlVMTF9QQVRIX05BTUVTICAgICAgICA9IE5PCitTVFJJUF9GUk9NX1BBVEggICAgICAgID0gCitJTlRFUk5BTF9ET0NTICAgICAgICAgID0gTk8KK1NUUklQX0NPREVfQ09NTUVOVFMgICAgPSBZRVMKK0NBU0VfU0VOU0VfTkFNRVMgICAgICAgPSBZRVMKK1NIT1JUX05BTUVTICAgICAgICAgICAgPSBOTworSElERV9TQ09QRV9OQU1FUyAgICAgICA9IE5PCitWRVJCQVRJTV9IRUFERVJTICAgICAgID0gWUVTCitTSE9XX0lOQ0xVREVfRklMRVMgICAgID0gWUVTCitKQVZBRE9DX0FVVE9CUklFRiAgICAgID0gWUVTCitJTkhFUklUX0RPQ1MgICAgICAgICAgID0gWUVTCitJTkxJTkVfSU5GTyAgICAgICAgICAgID0gWUVTCitTT1JUX01FTUJFUl9ET0NTICAgICAgID0gWUVTCitESVNUUklCVVRFX0dST1VQX0RPQyAgID0gTk8KK1RBQl9TSVpFICAgICAgICAgICAgICAgPSA4CitHRU5FUkFURV9UT0RPTElTVCAgICAgID0gWUVTCitHRU5FUkFURV9URVNUTElTVCAgICAgID0gWUVTCitHRU5FUkFURV9CVUdMSVNUICAgICAgID0gWUVTCitBTElBU0VTICAgICAgICAgICAgICAgID0gCitFTkFCTEVEX1NFQ1RJT05TICAgICAgID0gCitNQVhfSU5JVElBTElaRVJfTElORVMgID0gMzAKK09QVElNSVpFX09VVFBVVF9GT1JfQyAgPSBZRVMKK1NIT1dfVVNFRF9GSUxFUyAgICAgICAgPSBZRVMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gd2FybmluZyBhbmQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1FVSUVUICAgICAgICAgICAgICAgICAgPSBZRVMKK1dBUk5JTkdTICAgICAgICAgICAgICAgPSBZRVMKK1dBUk5fSUZfVU5ET0NVTUVOVEVEICAgPSBZRVMKK1dBUk5fRk9STUFUICAgICAgICAgICAgPSAKK1dBUk5fTE9HRklMRSAgICAgICAgICAgPSAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGlucHV0IGZpbGVzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJTlBVVCAgICAgICAgICAgICAgICAgID0gQHRvcF9zcmNkaXJAL2RidXMKK0ZJTEVfUEFUVEVSTlMgICAgICAgICAgPSAqLmMgKi5oCitSRUNVUlNJVkUgICAgICAgICAgICAgID0gWUVTCisjRVhDTFVERSAgICAgICAgICAgICAgICA9IHRlc3QKKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlIAorIyBFWENMVURFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm5zIHRvIGV4Y2x1ZGUgCisjIGNlcnRhaW4gZmlsZXMgZnJvbSB0aG9zZSBkaXJlY3Rvcmllcy4KKworRVhDTFVERV9QQVRURVJOUyAgICAgICA9IE1ha2VmaWxlLiogQ2hhbmdlTG9nIENIQU5HRVMgQ0hBTkdFUy4qIFJFQURNRSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgUkVBRE1FLiogKi5wbmcgQVVUSE9SUyBERVNJR04gREVTSUdOLiogKi5kZXNrdG9wIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBERVNLVE9QKiBDT01NRU5UUyBIT1dUTyBtYWdpYyBOT1RFUyBUT0RPIFRIQU5LUworCisjIFRoZSBFWEFNUExFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IgCisjIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiBleGFtcGxlIGNvZGUgZnJhZ21lbnRzIHRoYXQgYXJlIGluY2x1ZGVkIChzZWUgCisjIHRoZSBcaW5jbHVkZSBjb21tYW5kKS4KKworRVhBTVBMRV9QQVRIICAgICAgICAgICA9IAorRVhBTVBMRV9QQVRURVJOUyAgICAgICA9IAorRVhBTVBMRV9SRUNVUlNJVkUgICAgICA9IE5PCitJTUFHRV9QQVRIICAgICAgICAgICAgID0gCitJTlBVVF9GSUxURVIgICAgICAgICAgID0gCitGSUxURVJfU09VUkNFX0ZJTEVTICAgID0gTk8KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gc291cmNlIGJyb3dzaW5nCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTT1VSQ0VfQlJPV1NFUiAgICAgICAgID0gWUVTCitJTkxJTkVfU09VUkNFUyAgICAgICAgID0gTk8KK1JFRkVSRU5DRURfQllfUkVMQVRJT04gPSBZRVMKK1JFRkVSRU5DRVNfUkVMQVRJT04gICAgPSBZRVMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGFscGhhYmV0aWNhbCBjbGFzcyBpbmRleAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUxQSEFCRVRJQ0FMX0lOREVYICAgICA9IE5PCitDT0xTX0lOX0FMUEhBX0lOREVYICAgID0gNQorSUdOT1JFX1BSRUZJWCAgICAgICAgICA9IAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgSFRNTCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dFTkVSQVRFX0hUTUwgICAgICAgICAgPSBZRVMKK0hUTUxfT1VUUFVUICAgICAgICAgICAgPSAKK0hUTUxfSEVBREVSICAgICAgICAgICAgPSAKK0hUTUxfRk9PVEVSICAgICAgICAgICAgPSAKK0hUTUxfU1RZTEVTSEVFVCAgICAgICAgPSAKK0hUTUxfQUxJR05fTUVNQkVSUyAgICAgPSBZRVMKK0dFTkVSQVRFX0hUTUxIRUxQICAgICAgPSBOTworR0VORVJBVEVfQ0hJICAgICAgICAgICA9IE5PCitCSU5BUllfVE9DICAgICAgICAgICAgID0gTk8KK1RPQ19FWFBBTkQgICAgICAgICAgICAgPSBOTworRElTQUJMRV9JTkRFWCAgICAgICAgICA9IE5PCitFTlVNX1ZBTFVFU19QRVJfTElORSAgID0gNAorR0VORVJBVEVfVFJFRVZJRVcgICAgICA9IE5PCitUUkVFVklFV19XSURUSCAgICAgICAgID0gMjUwCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBMYVRlWCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dFTkVSQVRFX0xBVEVYICAgICAgICAgPSBOTworTEFURVhfT1VUUFVUICAgICAgICAgICA9IAorQ09NUEFDVF9MQVRFWCAgICAgICAgICA9IE5PCitQQVBFUl9UWVBFICAgICAgICAgICAgID0gYTR3aWRlCitFWFRSQV9QQUNLQUdFUyAgICAgICAgID0gCitMQVRFWF9IRUFERVIgICAgICAgICAgID0gCitQREZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KK1VTRV9QREZMQVRFWCAgICAgICAgICAgPSBOTworTEFURVhfQkFUQ0hNT0RFICAgICAgICA9IE5PCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBSVEYgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHRU5FUkFURV9SVEYgICAgICAgICAgID0gTk8KK1JURl9PVVRQVVQgICAgICAgICAgICAgPSAKK0NPTVBBQ1RfUlRGICAgICAgICAgICAgPSBOTworUlRGX0hZUEVSTElOS1MgICAgICAgICA9IE5PCitSVEZfU1RZTEVTSEVFVF9GSUxFICAgID0gCitSVEZfRVhURU5TSU9OU19GSUxFICAgID0gCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBtYW4gcGFnZSBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dFTkVSQVRFX01BTiAgICAgICAgICAgPSBZRVMKK01BTl9PVVRQVVQgICAgICAgICAgICAgPSBtYW4KK01BTl9FWFRFTlNJT04gICAgICAgICAgPSAuM2RidXMKK01BTl9MSU5LUyAgICAgICAgICAgICAgPSBZRVMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFhNTCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dFTkVSQVRFX1hNTCAgICAgICAgICAgPSBZRVMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIHByZXByb2Nlc3NvciAgIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRU5BQkxFX1BSRVBST0NFU1NJTkcgICA9IFlFUworTUFDUk9fRVhQQU5TSU9OICAgICAgICA9IFlFUworRVhQQU5EX09OTFlfUFJFREVGICAgICA9IFlFUworU0VBUkNIX0lOQ0xVREVTICAgICAgICA9IFlFUworSU5DTFVERV9QQVRIICAgICAgICAgICA9IAorSU5DTFVERV9GSUxFX1BBVFRFUk5TICA9IAorUFJFREVGSU5FRCAgICAgICAgICAgICA9ICJEQlVTX0JFR0lOX0RFQ0xTPSIgCQkJXAorCQkJICJEQlVTX0VORF9ERUNMUz0iIAkJCVwKKwkJCSAiRE9YWUdFTl9TSE9VTERfU0tJUF9USElTIiAJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiREJVU19HTlVDX0RFUFJFQ0FURUQ9IiAgICAgICAgICAgICAgICBcCisJCQkgIl9EQlVTX0RFRklORV9HTE9CQUxfTE9DSyhuYW1lKT0iCVwKKwkJCSAiX0RCVVNfR05VQ19QUklOVEYoZnJvbSx0byk9IgorU0tJUF9GVU5DVElPTl9NQUNST1MgICA9IFlFUworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uOjphZGR0aW9ucyByZWxhdGVkIHRvIGV4dGVybmFsIHJlZmVyZW5jZXMgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RBR0ZJTEVTICAgICAgICAgICAgICAgPSAKK0dFTkVSQVRFX1RBR0ZJTEUgICAgICAgPSAKK0FMTEVYVEVSTkFMUyAgICAgICAgICAgPSBOTworUEVSTF9QQVRIICAgICAgICAgICAgICA9IAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgZG90IHRvb2wgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NMQVNTX0RJQUdSQU1TICAgICAgICAgPSBZRVMKK0hBVkVfRE9UICAgICAgICAgICAgICAgPSBOTworQ0xBU1NfR1JBUEggICAgICAgICAgICA9IFlFUworQ09MTEFCT1JBVElPTl9HUkFQSCAgICA9IFlFUworVEVNUExBVEVfUkVMQVRJT05TICAgICA9IFlFUworSElERV9VTkRPQ19SRUxBVElPTlMgICA9IFlFUworSU5DTFVERV9HUkFQSCAgICAgICAgICA9IFlFUworSU5DTFVERURfQllfR1JBUEggICAgICA9IFlFUworR1JBUEhJQ0FMX0hJRVJBUkNIWSAgICA9IFlFUworRE9UX1BBVEggICAgICAgICAgICAgICA9IAorRE9URklMRV9ESVJTICAgICAgICAgICA9IAorTUFYX0RPVF9HUkFQSF9XSURUSCAgICA9IDY0MAorTUFYX0RPVF9HUkFQSF9IRUlHSFQgICA9IDEwMjQKK0dFTkVSQVRFX0xFR0VORCAgICAgICAgPSBZRVMKK0RPVF9DTEVBTlVQICAgICAgICAgICAgPSBZRVMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbjo6YWRkdGlvbnMgcmVsYXRlZCB0byB0aGUgc2VhcmNoIGVuZ2luZSAgIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU0VBUkNIRU5HSU5FICAgICAgICAgICA9IE5PCmRpZmYgLS1naXQgYS9kYnVzL0hBQ0tJTkcgYi9kYnVzL0hBQ0tJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA1ZmQyZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvSEFDS0lORwpAQCAtMCwwICsxLDM1MSBAQAorVGhlIGd1aWRlbGluZXMgaW4gdGhpcyBmaWxlIGFyZSB0aGUgaWRlYWxzOyBpdCdzIGJldHRlciB0byBzZW5kIGEKK25vdC1mdWxseS1mb2xsb3dpbmctZ3VpZGVsaW5lcyBwYXRjaCB0aGFuIG5vIHBhdGNoIGF0IGFsbCwgdGhvdWdoLiAgV2UKK2NhbiBhbHdheXMgcG9saXNoIGl0IHVwLgorCitNYWlsaW5nIGxpc3QKKz09PQorCitUaGUgRC1CdXMgbWFpbGluZyBsaXN0IGlzIGRidXNAbGlzdHMuZnJlZWRlc2t0b3Aub3JnOyBkaXNjdXNzaW9uCitvZiBwYXRjaGVzLCBldGMuIHNob3VsZCBnbyB0aGVyZS4KKworU2VjdXJpdHkKKz09PQorCitNb3N0IG9mIEQtQnVzIGlzIHNlY3VyaXR5IHNlbnNpdGl2ZS4gIEd1aWRlbGluZXMgcmVsYXRlZCB0byB0aGF0OgorCisgLSBhdm9pZCBtZW1jcHkoKSwgc3ByaW50ZigpLCBzdHJsZW4oKSwgc25wcmludGYsIHN0cmxjYXQoKSwKKyAgIHN0cnN0cigpLCBzdHJ0b2soKSwgb3IgYW55IG9mIHRoaXMgc3R1ZmYuIFVzZSBEQnVzU3RyaW5nLiAKKyAgIElmIERCdXNTdHJpbmcgZG9lc24ndCBoYXZlIHRoZSBmZWF0dXJlIHlvdSBuZWVkLCBhZGQgaXQgCisgICB0byBEQnVzU3RyaW5nLiAKKworICAgVGhlcmUgYXJlIHNvbWUgZXhjZXB0aW9ucywgZm9yIGV4YW1wbGUKKyAgIGlmIHlvdXIgc3RyaW5ncyBhcmUganVzdCB1c2VkIHRvIGluZGV4IGEgaGFzaCB0YWJsZSAKKyAgIGFuZCB5b3UgZG9uJ3QgZG8gYW55IHBhcnNpbmcvbW9kaWZpY2F0aW9uIG9mIHRoZW0sIHBlcmhhcHMKKyAgIERCdXNTdHJpbmcgaXMgd2FzdGVmdWwgYW5kIHdvdWxkbid0IGhlbHAgbXVjaC4gQnV0IGRlZmluaXRlbHkgCisgICBpZiB5b3UncmUgZG9pbmcgYW55IHBhcnNpbmcsIHJlYWxsb2NhdGlvbiwgZXRjLiB1c2UgREJ1c1N0cmluZy4KKworIC0gZG8gbm90IGluY2x1ZGUgc3lzdGVtIGhlYWRlcnMgb3V0c2lkZSBvZiBkYnVzLW1lbW9yeS5jLCAKKyAgIGRidXMtc3lzZGVwcy5jLCBhbmQgb3RoZXIgcGxhY2VzIHdoZXJlIHRoZXkgYXJlIGFscmVhZHkgCisgICBpbmNsdWRlZC4gVGhpcyBnaXZlcyB1cyBvbmUgcGxhY2UgdG8gYXVkaXQgYWxsIGV4dGVybmFsIAorICAgZGVwZW5kZW5jaWVzIG9uIGZlYXR1cmVzIGluIGxpYmMsIGV0Yy4KKworIC0gZG8gbm90IHVzZSBsaWJjIGZlYXR1cmVzIHRoYXQgYXJlICJjb21wbGljYXRlZCIgCisgICBhbmQgbWF5IGNvbnRhaW4gc2VjdXJpdHkgaG9sZXMuIEZvciBleGFtcGxlLCB5b3UgcHJvYmFibHkgc2hvdWxkbid0CisgICB0cnkgdG8gdXNlIHJlZ2NvbXAoKSB0byBjb21waWxlIGFuIHVudHJ1c3RlZCByZWd1bGFyIGV4cHJlc3Npb24uCisgICBSZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBqdXN0IHRvbyBjb21wbGljYXRlZCwgYW5kIHRoZXJlIGFyZSBtYW55IAorICAgZGlmZmVyZW50IGxpYmMncyBvdXQgdGhlcmUuCisKKyAtIHdlIG5lZWQgdG8gZGVzaWduIHRoZSBtZXNzYWdlIGJ1cyBkYWVtb24gKGFuZCBhbnkgc2ltaWxhciBmZWF0dXJlcykKKyAgIHRvIHVzZSBsaW1pdGVkIHByaXZpbGVnZXMsIHJ1biBpbiBhIGNocm9vdCBqYWlsLCBhbmQgc28gb24uCisKK2h0dHA6Ly92c2Z0cGQuYmVhc3RzLm9yZy8gaGFzIG90aGVyIGdvb2Qgc2VjdXJpdHkgc3VnZ2VzdGlvbnMuCisKK0NvZGluZyBTdHlsZQorPT09CisKKyAtIFRoZSBDIGxpYnJhcnkgdXNlcyBHTlUgY29kaW5nIGNvbnZlbnRpb25zLCB3aXRoIEdMaWItbGlrZQorICAgZXh0ZW5zaW9ucyAoZS5nLiBsaW5pbmcgdXAgZnVuY3Rpb24gYXJndW1lbnRzKS4gVGhlCisgICBRdCB3cmFwcGVyIHVzZXMgS0RFIGNvZGluZyBjb252ZW50aW9ucy4KKworIC0gV3JpdGUgZG9jcyBmb3IgYWxsIG5vbi1zdGF0aWMgZnVuY3Rpb25zIGFuZCBzdHJ1Y3RzIGFuZCBzbyBvbi4gdHJ5CisgICAiZG94eWdlbiBEb3h5ZmlsZSIgcHJpb3IgdG8gY29tbWl0IGFuZCBiZSBzdXJlIHRoZXJlIGFyZSBubworICAgd2FybmluZ3MgcHJpbnRlZC4KKworIC0gQWxsIGV4dGVybmFsIGludGVyZmFjZXMgKG5ldHdvcmsgcHJvdG9jb2xzLCBmaWxlIGZvcm1hdHMsIGV0Yy4pCisgICBzaG91bGQgaGF2ZSBkb2N1bWVudGVkIHNwZWNpZmljYXRpb25zIHN1ZmZpY2llbnQgdG8gYWxsb3cgYW4KKyAgIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uIHRvIGJlIHdyaXR0ZW4uIE91ciBpbXBsZW1lbnRhdGlvbiBzaG91bGQKKyAgIGJlIHN0cmljdCBhYm91dCBzcGVjaWZpY2F0aW9uIGNvbXBsaWFuY2UgKHNob3VsZCBub3QgZm9yIGV4YW1wbGUKKyAgIGhldXJpc3RpY2FsbHkgcGFyc2UgYSBmaWxlIGFuZCBhY2NlcHQgbm90LXdlbGwtZm9ybWVkCisgICBkYXRhKS4gQXZvaWRpbmcgaGV1cmlzdGljcyBpcyBhbHNvIGltcG9ydGFudCBmb3Igc2VjdXJpdHkgcmVhc29uczsKKyAgIGlmIGl0IGxvb2tzIGZ1bm55LCBpZ25vcmUgaXQgKG9yIGV4aXQsIG9yIGRpc2Nvbm5lY3QpLgorCitEZXZlbG9wbWVudAorPT09CisKK0QtQnVzIHVzZXMgR2l0IGFzIGl0cyB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtLiBUaGUgbWFpbiByZXBvc2l0b3J5IGlzCitob3N0ZWQgYXQgZ2l0LmZyZWVkZXNrdG9wLm9yZy9kYnVzL2RidXMuIFRvIGNsb25lIEQtQnVzLCBleGVjdXRlIHRoZQorZm9sbG93aW5nIGNvbW1hbmQ6CisKKyAgICBnaXQgY2xvbmUgZ2l0Oi8vZ2l0LmZyZWVkZXNrdG9wLm9yZy9kYnVzL2RidXMKK09SCisgICAgZ2l0IGNsb25lIGdpdC5mcmVlZGVza3RvcC5vcmc6ZGJ1cy9kYnVzCisKK1RoZSBsYXR0ZXIgZm9ybSBpcyB0aGUgb25lIHRoYXQgYWxsb3dzIHB1c2hpbmcsIGJ1dCBpdCBhbHNvIHJlcXVpcmVzCithbiBTU0ggYWNjb3VudCBvbiB0aGUgc2VydmVyLiBUaGUgZm9ybWVyIGZvcm0gYWxsb3dzIGFub255bW91cworY2hlY2tvdXRzLgorCitELUJ1cyBkZXZlbG9wbWVudCBoYXBwZW5zIGluIHR3byBicmFuY2hlcyBpbiBwYXJhbGxlbDogdGhlIGN1cnJlbnQKK3N0YWJsZSBicmFuY2gsIHdpdGggYW4gZXZlbiBtaW5vciBudW1iZXIgKGxpa2UgMS4wLCAxLjIgYW5kIDEuNCksIGFuZAordGhlIG5leHQgZGV2ZWxvcG1lbnQgYnJhbmNoLCB3aXRoIHRoZSBuZXh0IG9kZCBudW1iZXIuCisKK1RoZSBzdGFibGUgYnJhbmNoIGlzIG5hbWVkIGFmdGVyIHRoZSB2ZXJzaW9uIG51bWJlciBpdHNlbGYgKGRidXMtMS4yLAorZGJ1cy0xLjQpLCB3aGVyZWFzIHRoZSBkZXZlbG9wbWVudCBicmFuY2ggaXMgc2ltcGx5IGtub3duIGFzICJtYXN0ZXIiLgorCitXaGVuIG1ha2luZyBhIGNoYW5nZSB0byBELUJ1cywgZG8gdGhlIGZvbGxvd2luZzoKKworIC0gY2hlY2sgb3V0IHRoZSBlYXJsaWVzdCBicmFuY2ggb2YgRC1CdXMgdGhhdCBtYWtlcyBzZW5zZSB0byBoYXZlCisgICB5b3VyIGNoYW5nZSBpbi4gSWYgaXQncyBhIGJ1Z2ZpeCwgaXQncyBub3JtYWxseSB0aGUgY3VycmVudCBzdGFibGUKKyAgIGJyYW5jaDsgaWYgaXQncyBhIGZlYXR1cmUsIGl0J3Mgbm9ybWFsbHkgdGhlICJtYXN0ZXIiIGJyYW5jaC4gSWYKKyAgIHlvdSBoYXZlIGFuIGltcG9ydGFudCBzZWN1cml0eSBmaXgsIHlvdSBtYXkgd2FudCB0byBhcHBseSB0byBvbGRlcgorICAgYnJhbmNoZXMgdG9vLgorCisgLSBmb3IgbGFyZ2UgY2hhbmdlczoKKyAgICAgaWYgeW91J3JlIGRldmVsb3BpbmcgYSBuZXcsIGxhcmdlIGZlYXR1cmUsIGl0J3MgcmVjb21tZW5kZWQKKyAgICAgdG8gY3JlYXRlIGEgbmV3IGJyYW5jaCBhbmQgZG8geW91ciBkZXZlbG9wbWVudCB0aGVyZS4gUHVibGlzaAorICAgICB5b3VyIGJyYW5jaCBhdCBhIHN1aXRhYmxlIHBsYWNlIGFuZCBhc2sgb3RoZXJzIHRvIGhlbHAgeW91CisgICAgIGRldmVsb3AgYW5kIHRlc3QgaXQuIE9uY2UgeW91ciBmZWF0dXJlIGlzIGNvbnNpZGVyZWQgZmluYWxpc2VkLAorICAgICB5b3UgbWF5IG1lcmdlIGl0IGludG8gdGhlICJtYXN0ZXIiIGJyYW5jaC4KKworLSBmb3Igc21hbGwgY2hhbmdlczoKKyAgICAuIG1ha2UgeW91ciBjaGFuZ2UgdG8gdGhlIHNvdXJjZSBjb2RlCisgICAgLiBleGVjdXRlIHRlc3RzIHRvIGd1YXJhbnRlZSB0aGF0IHlvdSdyZSBub3QgaW50cm9kdWNpbmcgYQorICAgICAgcmVncmVzc2lvbi4gRm9yIHRoYXQsIGV4ZWN1dGU6IG1ha2UgY2hlY2sKKyAgICAgIChpZiBwb3NzaWJsZSwgYWRkIGEgbmV3IHRlc3QgdG8gY2hlY2sgdGhlIGZpeCB5b3UncmUKKyAgICAgIGludHJvZHVjaW5nKQorICAgIC4gY29tbWl0IHlvdXIgY2hhbmdlIHVzaW5nICJnaXQgY29tbWl0IgorICAgICAgaW4gdGhlIGNvbW1pdCBtZXNzYWdlLCB3cml0ZSBhIHNob3J0IHNlbnRlbmNlIGRlc2NyaWJpbmcgd2hhdAorICAgICAgeW91IGRpZCBpbiB0aGUgZmlyc3QgbGluZS4gVGhlbiB3cml0ZSBhIGxvbmdlciBkZXNjcmlwdGlvbiBpbgorICAgICAgdGhlIG5leHQgcGFyYWdyYXBoKHMpLgorICAgIC4gcmVwZWF0IHRoZSBwcmV2aW91cyBzdGVwcyBpZiBuZWNlc3NhcnkgdG8gaGF2ZSBtdWx0aXBsZSBjb21taXRzCisKKyAtIGV4dHJhY3QgeW91ciBwYXRjaGVzIGFuZCBzZW5kIHRvIHRoZSBELUJ1cyBtYWlsaW5nIGxpc3QgZm9yCisgICByZXZpZXcgb3IgcG9zdCB0aGVtIHRvIHRoZSBELUJ1cyBCdWd6aWxsYSwgYXR0YWNoaW5nIHRoZW0gdG8gYSBidWcKKyAgIHJlcG9ydC4gVG8gZXh0cmFjdCB0aGUgcGF0Y2hlcywgZXhlY3V0ZToKKyAgICAgZ2l0IGZvcm1hdC1wYXRjaCBvcmlnaW4vbWFzdGVyCisKKyAtIG9uY2UgeW91ciBjb2RlIGhhcyBiZWVuIHJldmlld2VkLCB5b3UgbWF5IHB1c2ggaXQgdG8gdGhlIEdpdAorICAgc2VydmVyOgorICAgICBnaXQgcHVzaCBvcmlnaW4gbXktYnJhbmNoOnJlbW90ZQorICAgT1IKKyAgICAgZ2l0IHB1c2ggb3JpZ2luIGRidXMtWC5ZCisgICBPUgorICAgICBnaXQgcHVzaCBvcmlnaW4gbWFzdGVyCisgICAoY29uc3VsdCB0aGUgR2l0IG1hbnVhbCB0byBrbm93IHdoaWNoIGNvbW1hbmQgYXBwbGllcykKKworIC0gKE9wdGlvbmFsKSBpZiB5b3UndmUgbm90IHdvcmtlZCBvbiAibWFzdGVyIiwgbWVyZ2UgeW91ciBjaGFuZ2VzIHRvCisgICB0aGF0IGJyYW5jaC4gSWYgeW91J3ZlIHdvcmtlZCBvbiBhbiBlYXJsaWVyIGJyYW5jaCB0aGFuIHRoZSBjdXJyZW50CisgICBzdGFibGUsIG1lcmdlIHlvdXIgY2hhbmdlcyB1cHdhcmRzIHRvd2FyZHMgdGhlIHN0YWJsZSBicmFuY2gsIHRoZW4KKyAgIGZyb20gdGhlcmUgaW50byAibWFzdGVyIi4KKworICAgIC4gZXhlY3V0ZTogZ2l0IGNoZWNrb3V0IG1hc3RlcgorICAgIC4gZW5zdXJlIHRoYXQgeW91IGhhdmUgdGhlIGxhdGVzdCAibWFzdGVyIiBmcm9tIHRoZSBzZXJ2ZXIsIHVwZGF0ZQorICAgICAgaWYgeW91IGRvbid0CisgICAgLiBleGVjdXRlOiBnaXQgbWVyZ2UgZGJ1cy1YLlkKKyAgICAuIGlmIHlvdSBoYXZlIGFueSBjb25mbGljdHMsIHJlc29sdmUgdGhlbSwgZ2l0IGFkZCB0aGUgY29uZmxpY3RlZAorICAgICAgZmlsZXMgYW5kIHRoZW4gZ2l0IGNvbW1pdAorICAgIC4gcHVzaCB0aGUgIm1hc3RlciIgYnJhbmNoIHRvIHRoZSBzZXJ2ZXIgYXMgd2VsbAorCisgIEV4ZWN1dGluZyB0aGlzIG1lcmdlIGlzIHJlY29tbWVuZGVkLCBidXQgbm90IG5lY2Vzc2FyeSBmb3IgYWxsCisgIGNoYW5nZXMuIFlvdSBzaG91bGQgZG8gdGhpcyBzdGVwIGlmIHlvdXIgYnVnZml4IGlzIGNyaXRpY2FsIGZvciB0aGUKKyAgZGV2ZWxvcG1lbnQgaW4gIm1hc3RlciIsIG9yIGlmIHlvdSBzdXNwZWN0IHRoYXQgY29uZmxpY3RzIHdpbGwgYXJpc2UKKyAgKHlvdSdyZSB1c3VhbGx5IHRoZSBiZXN0IHBlcnNvbiB0byByZXNvbHZlIGNvbmZsaWN0cyBpbnRyb2R1Y2VkIGJ5CisgIHlvdXIgb3duIGNvZGUpLCBvciBpZiBpdCBoYXMgYmVlbiB0b28gbG9uZyBzaW5jZSB0aGUgbGFzdCBtZXJnZS4KKworCitNYWtpbmcgYSByZWxlYXNlCis9PT0KKworVG8gbWFrZSBhIHJlbGVhc2Ugb2YgRC1CdXMsIGRvIHRoZSBmb2xsb3dpbmc6CisKKyAtIGNoZWNrIG91dCBhIGZyZXNoIGNvcHkgZnJvbSBHaXQKKworIC0gdmVyaWZ5IHRoYXQgdGhlIGxpYnRvb2wgdmVyc2lvbmluZy9saWJyYXJ5IHNvbmFtZSBpcyAKKyAgIGNoYW5nZWQgaWYgaXQgbmVlZHMgdG8gYmUsIG9yIG5vdCBjaGFuZ2VkIGlmIG5vdAorCisgLSB1cGRhdGUgdGhlIGZpbGUgTkVXUyBiYXNlZCBvbiB0aGUgZ2l0IGhpc3RvcnkKKworIC0gdmVyaWZ5IHRoYXQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIGRidXMtc3BlY2lmaWNhdGlvbi54bWwgaXMKKyAgIGNoYW5nZWQgaWYgaXQgbmVlZHMgdG8gYmU7IGlmIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUsIHVwZGF0ZSB0aGUKKyAgIHJlbGVhc2UgZGF0ZSBpbiB0aGF0IGZpbGUKKworIC0gdXBkYXRlIHRoZSBBVVRIT1JTIGZpbGUgd2l0aCAibWFrZSB1cGRhdGUtYXV0aG9ycyIgaWYgbmVjZXNzYXJ5CisKKyAtIHRoZSB2ZXJzaW9uIG51bWJlciBzaG91bGQgaGF2ZSBtYWpvci5taW5vci5taWNybywgZXZlbgorICAgaWYgbWljcm8gaXMgMCwgaS5lLiAiMS4wLjAiIGFuZCAiMS4yLjAiIG5vdCAiMS4wIi8iMS4yIjsgdGhlIG1pY3JvCisgICB2ZXJzaW9uIHNob3VsZCBiZSBldmVuIGZvciByZWxlYXNlcywgYW5kIG9kZCBmb3IgaW50ZXJtZWRpYXRlIHNuYXBzaG90cworCisgLSAibWFrZSBkaXN0Y2hlY2siIChETyBOT1QganVzdCAibWFrZSBkaXN0IiAtIHBhc3MgdGhlIGNoZWNrISkKKworIC0gaWYgbWFrZSBkaXN0Y2hlY2sgZmFpbHMsIGZpeCBpdC4KKworIC0gb25jZSBkaXN0Y2hlY2sgc3VjY2VlZHMsICJnaXQgY29tbWl0IC1hIi4gIFRoaXMgaXMgdGhlIHZlcnNpb24KKyAgIG9mIHRoZSB0cmVlIHRoYXQgY29ycmVzcG9uZHMgZXhhY3RseSB0byB0aGUgcmVsZWFzZWQgdGFyYmFsbC4KKworIC0gdGFnIHRoZSB0cmVlIHdpdGggImdpdCB0YWcgLXMgLW0gJ1JlbGVhc2VkIFguWS5aJyBkYnVzLVguWS5aIgorICAgd2hlcmUgWC5ZLlogaXMgdGhlIHZlcnNpb24gb2YgdGhlIHJlbGVhc2UuICBJZiB5b3UgY2FuJ3Qgc2lnbgorICAgdGhlbiBzaW1wbHkgY3JlYXRlZCBhbiB1bnNpZ25lZCBhbm5vdGF0ZWQgdGFnOgorICAgImdpdCB0YWcgLWEgLW0gJ1JlbGVhc2VkIFguWS5aJyBkYnVzLVguWS5aIi4KKworIC0gYnVtcCB0aGUgdmVyc2lvbiBudW1iZXIgdXAgaW4gY29uZmlndXJlLmFjIChzbyB0aGUgbWljcm8gdmVyc2lvbiBpcyBvZGQpLAorICAgYW5kIGNvbW1pdCBpdC4gIE1ha2Ugc3VyZSB5b3UgZG8gdGhpcyAqYWZ0ZXIqIHRhZ2dpbmcgdGhlIHByZXZpb3VzCisgICByZWxlYXNlISBUaGUgaWRlYSBpcyB0aGF0IGdpdCBoYXMgYSBuZXdlciB2ZXJzaW9uIG51bWJlcgorICAgdGhhbiBhbnl0aGluZyByZWxlYXNlZC4gU2ltaWxhcmx5LCBidW1wIHRoZSB2ZXJzaW9uIG51bWJlciBvZgorICAgZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbCBhbmQgc2V0IHRoZSByZWxlYXNlIGRhdGUgdG8gIihub3QgZmluYWxpemVkKSIuCisKKyAtIG1lcmdlIHRoZSBicmFuY2ggeW91J3ZlIHJlbGVhc2VkIHRvIHRoZSBjaHJvbm9sb2dpY2FsbHktbGF0ZXIKKyAgIGJyYW5jaCAodXN1YWxseSAibWFzdGVyIikuIFlvdSdsbCBwcm9iYWJseSBoYXZlIHRvIGZpeCBhIG1lcmdlCisgICBjb25mbGljdCBpbiBjb25maWd1cmUuYWMgKHRoZSB2ZXJzaW9uIG51bWJlcikuCisKKyAtIHB1c2ggeW91ciBjaGFuZ2VzIGFuZCB0aGUgdGFnIHRvIHRoZSBjZW50cmFsIHJlcG9zaXRvcnkgd2l0aAorICAgICBnaXQgcHVzaCBvcmlnaW4gbWFzdGVyIGRidXMtWC5ZIGRidXMtWC5ZLloKKworIC0gc2NwIHlvdXIgdGFyYmFsbCB0byBmcmVlZGVza3RvcC5vcmcgc2VydmVyIGFuZCBjb3B5IGl0IHRvCisgICBkYnVzLmZyZWVkZXNrdG9wLm9yZzovc3J2L2RidXMuZnJlZWRlc2t0b3Aub3JnL3d3dy9yZWxlYXNlcy9kYnVzL2RidXMtWC5ZLloudGFyLmd6LgorICAgVGhpcyBzaG91bGQgYmUgcG9zc2libGUgaWYgeW91J3JlIGluIGdyb3VwICJkYnVzIgorCisgLSBVcGRhdGUgdGhlIG9ubGluZSBkb2N1bWVudGF0aW9uIHdpdGggYG1ha2UgLUMgZG9jIG1haW50YWluZXItdXBsb2FkLWRvY3NgLgorCisgLSB1cGRhdGUgdGhlIHdpa2kgcGFnZSBodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9Tb2Z0d2FyZS9kYnVzIGJ5CisgICBhZGRpbmcgdGhlIG5ldyByZWxlYXNlIHVuZGVyIHRoZSBEb3dubG9hZCBoZWFkaW5nLiBUaGVuLCBjdXQgdGhlCisgICBsaW5rIGFuZCBjaGFuZ2Vsb2cgZm9yIHRoZSBwcmV2aW91cyB0aGF0IHdhcyB0aGVyZS4KKworIC0gdXBkYXRlIHRoZSB3aWtpIHBhZ2UKKyAgIGh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL1NvZnR3YXJlL0RidXNSZWxlYXNlQXJjaGl2ZSBwYXN0aW5nIHRoZQorICAgcHJldmlvdXMgcmVsZWFzZS4gTm90ZSB0aGF0IGJ1bGxldCBwb2ludHMgZm9yIGVhY2ggb2YgdGhlIGNoYW5nZWxvZworICAgaXRlbXMgbXVzdCBiZSBpbmRlbnRlZCB0aHJlZSBtb3JlIHNwYWNlcyB0byBjb25mb3JtIHRvIHRoZQorICAgZm9ybWF0dGluZyBvZiB0aGUgb3RoZXIgcmVsZWFzZXMgdGhlcmUuCisgIAorIC0gcG9zdCB0byBkYnVzQGxpc3RzLmZyZWVkZXNrdG9wLm9yZyBhbm5vdW5jaW5nIHRoZSByZWxlYXNlLgorIAorCitNYWtpbmcgYSAiLjAiIHN0YWJsZSByZWxlYXNlCis9PT0KKworV2UgY3JlYXRlIGEgYnJhbmNoIGZvciBlYWNoIHN0YWJsZSByZWxlYXNlLiBUaGUgYnJhbmNoIG5hbWUgc2hvdWxkIGJlCitkYnVzLVguWSB3aGljaCBpcyBhIGJyYW5jaCB0aGF0IGhhcyByZWxlYXNlcyB2ZXJzaW9uZWQgWC5ZLlo7CitjaGFuZ2VzIG9uIGEgc3RhYmxlIGJyYW5jaCBzaG91bGQgYmUgbGltaXRlZCB0byBzaWduaWZpY2FudCBidWcgZml4ZXMuCisKK0JlY2F1c2Ugd2Ugd29uJ3QgbWFrZSBtaW5vciBjaGFuZ2VzIGxpa2Uga2VlcGluZyB1cCB3aXRoIHRoZSBsYXRlc3QKK2RlcHJlY2F0aW9ucyBvbiBhIHN0YWJsZSBicmFuY2gsIHN0YWJsZSBicmFuY2hlcyBzaG91bGQgdHVybiBvZmYgdGhlCitnY2Mgd2FybmluZyBmb3IgZGVwcmVjYXRlZCBkZWNsYXJhdGlvbnMgKGUuZy4gc2VlIGNvbW1pdCA0ZWJiMjc1YWI3KS4KKworQmUgZXh0cmEtY2FyZWZ1bCBub3QgdG8gbWVyZ2UgbWFzdGVyIChvciBhbnkgYnJhbmNoIGJhc2VkIG9uIG1hc3RlcikgaW50byBhCitzdGFibGUgYnJhbmNoLgorCitUbyBicmFuY2g6CisgIGdpdCBicmFuY2ggZGJ1cy1YLlkKK2FuZCB1cGxvYWQgdGhlIGJyYW5jaCB0YWcgdG8gdGhlIHNlcnZlcjoKKyAgZ2l0IHB1c2ggb3JpZ2luIGRidXMtWC5ZCisKK1RvIGRldmVsb3AgaW4gdGhpcyBicmFuY2g6CisgIGdpdCBjaGVja291dCBkYnVzLVguWQorCitFbnZpcm9ubWVudCB2YXJpYWJsZXMKKz09PQorCitUaGVzZSBhcmUgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBELUJ1cyBjbGllbnQgbGlicmFyeQorCitEQlVTX1ZFUkJPU0U9MQorVHVybnMgb24gcHJpbnRpbmcgdmVyYm9zZSBtZXNzYWdlcy4gVGhpcyBvbmx5IHdvcmtzIGlmIEQtQnVzIGhhcyBiZWVuCitjb21waWxlZCB3aXRoIC0tZW5hYmxlLXZlcmJvc2UtbW9kZQorCitEQlVTX01BTExPQ19GQUlMX05USD1uCitDYW4gYmUgc2V0IHRvIGEgbnVtYmVyLCBjYXVzaW5nIGV2ZXJ5IG50aCBjYWxsIHRvIGRidXNfYWxsb2Mgb3IKK2RidXNfcmVhbGxvYyB0byBmYWlsLiBUaGlzIG9ubHkgd29ya3MgaWYgRC1CdXMgaGFzIGJlZW4gY29tcGlsZWQgd2l0aAorLS1lbmFibGUtdGVzdHMuCisKK0RCVVNfTUFMTE9DX0ZBSUxfR1JFQVRFUl9USEFOPW4KK0NhbiBiZSBzZXQgdG8gYSBudW1iZXIsIGNhdXNpbmcgZXZlcnkgY2FsbCB0byBkYnVzX2FsbG9jIG9yCitkYnVzX3JlYWxsb2MgdG8gZmFpbCBpZiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGFsbG9jYXRlZCBpcyBncmVhdGVyCit0aGFuIHRoZSBzcGVjaWZpZWQgbnVtYmVyLiBUaGlzIG9ubHkgd29ya3MgaWYgRC1CdXMgaGFzIGJlZW4gY29tcGlsZWQgd2l0aAorLS1lbmFibGUtdGVzdHMuCisKK0RCVVNfVEVTVF9NQUxMT0NfRkFJTFVSRVM9bgorTWFueSBvZiB0aGUgRC1CdXMgdGVzdHMgd2lsbCBydW4gb3ZlciBhbmQgb3Zlciwgb25jZSBmb3IgZWFjaCBtYWxsb2MKK2ludm9sdmVkIGluIHRoZSB0ZXN0LiBFYWNoIHJ1biB3aWxsIGZhaWwgYSBkaWZmZXJlbnQgbWFsbG9jLCBwbHVzIHNvbWUKK251bWJlciBvZiBtYWxsb2NzIGZvbGxvd2luZyB0aGF0IG1hbGxvYyAoYmVjYXVzZSBhIGZhaXIgbnVtYmVyIG9mIGJ1Z3MKK29ubHkgaGFwcGVuIGlmIHR3byBvciBtb3JlIG1hbGxvY3MgZmFpbCBpbiBhIHJvdywgZS5nLiBlcnJvciByZWNvdmVyeQordGhhdCBpdHNlbGYgaW52b2x2ZXMgbWFsbG9jKS4gIFRoaXMgZW52IHZhcmlhYmxlIHNldHMgdGhlIG51bWJlciBvZgorbWFsbG9jcyB0byBmYWlsLgorSGVyZSdzIHdoeSB5b3UgY2FyZTogSWYgc2V0IHRvIDAsIHRoZW4gdGhlIG1hbGxvYyBjaGVja2luZyBpcyBza2lwcGVkLAord2hpY2ggbWFrZXMgdGhlIHRlc3Qgc3VpdGUgYSBoZWNrIG9mIGEgbG90IGZhc3Rlci4gSnVzdCBydW4gd2l0aCB0aGlzCitlbnYgdmFyaWFibGUgdW5zZXQgYmVmb3JlIHlvdSBjb21taXQuCisKK1Rlc3RzCis9PT0KKworVGhlc2UgYXJlIHRoZSB0ZXN0IHByb2dyYW1zIHRoYXQgYXJlIGJ1aWx0IGlmIGRidXMgaXMgY29tcGlsZWQgdXNpbmcKKy0tZW5hYmxlLXRlc3RzLgorCitkYnVzL2RidXMtdGVzdAorVGhpcyBpcyB0aGUgbWFpbiB1bml0IHRlc3QgcHJvZ3JhbSB0aGF0IHRlc3RzIGFsbCBhc3BlY3RzIG9mIHRoZSBELUJ1cworY2xpZW50IGxpYnJhcnkuCisKK2RidXMvYnVzLXRlc3QKK1RoaXMgaXQgdGhlIHVuaXQgdGVzdCBwcm9ncmFtIGZvciB0aGUgbWVzc2FnZSBidXMuCisKK3Rlc3QvYnJlYWstbG9hZGVyCitBIHRlc3QgdGhhdCB0cmllcyB0byBicmVhayB0aGUgbWVzc2FnZSBsb2FkZXIgYnkgcGFzc2luZyBpdCByYW5kb21seQorY3JlYXRlZCBpbnZhbGlkIG1lc3NhZ2VzLgorCit0ZXN0L25hbWUtdGVzdC8qCitUaGlzIGlzIGEgc3VpdGUgb2YgcHJvZ3JhbXMgd2hpY2ggYXJlIHJ1biB3aXRoIGEgdGVtcG9yYXJ5IHNlc3Npb24gYnVzLgorSWYgeW91ciB0ZXN0IGludm9sdmVzIG11bHRpcGxlIHByb2Nlc3NlcyBjb21tdW5pY2F0aW5nLCB5b3VyIGJlc3QgYmV0CitpcyB0byBhZGQgYSB0ZXN0IGluIGhlcmUuCisKKyJtYWtlIGNoZWNrIiBydW5zIGFsbCB0aGUgZGV0ZXJtaW5pc3RpYyB0ZXN0IHByb2dyYW1zIChpLmUuIG5vdCBicmVhay1sb2FkZXIpLgorCisibWFrZSBsY292LWNoZWNrIiBpcyBhdmFpbGFibGUgaWYgeW91IGNvbmZpZ3VyZSB3aXRoIC0tZW5hYmxlLWNvbXBpbGVyLWNvdmVyYWdlCithbmQgZ2l2ZXMgYSBjb21wbGV0ZSByZXBvcnQgb24gdGVzdCBzdWl0ZSBjb3ZlcmFnZS4KKworUGF0Y2hlcworPT09CisKK1BsZWFzZSBmaWxlIHRoZW0gYXQgaHR0cDovL2J1Z3ppbGxhLmZyZWVkZXNrdG9wLm9yZyB1bmRlciBjb21wb25lbnQKK2RidXMsIGFuZCBhbHNvIHBvc3QgdG8gdGhlIG1haWxpbmcgbGlzdCBmb3IgZGlzY3Vzc2lvbi4gIFRoZSBjb21taXQKK3J1bGVzIGFyZToKKworIC0gZm9yIGZpeGVzIHRoYXQgZG9uJ3QgYWZmZWN0IEFQSSBvciBwcm90b2NvbCwgdGhleSBjYW4gYmUgY29tbWl0dGVkCisgICBpZiBhbnkgb25lIHF1YWxpZmllZCByZXZpZXdlciBvdGhlciB0aGFuIHBhdGNoIGF1dGhvcgorICAgcmV2aWV3cyBhbmQgYXBwcm92ZXMKKworIC0gZm9yIGZpeGVzIHRoYXQgZG8gYWZmZWN0IEFQSSBvciBwcm90b2NvbCwgdHdvIHBlb3BsZQorICAgaW4gdGhlIHJldmlld2VyIGdyb3VwIGhhdmUgdG8gcmV2aWV3IGFuZCBhcHByb3ZlIHRoZSBjb21taXQsIGFuZCAKKyAgIHBvc3RpbmcgdG8gdGhlIGxpc3QgaXMgZGVmaW5pdGVseSBtYW5kYXRvcnkKKworIC0gaWYgdGhlcmUncyBhIGxpdmUgdW5yZXNvbHZlZCBjb250cm92ZXJzeSBhYm91dCBhIGNoYW5nZSwKKyAgIGRvbid0IGNvbW1pdCBpdCB3aGlsZSB0aGUgYXJndW1lbnQgaXMgc3RpbGwgcmFnaW5nLgorCisgLSBhdCB0aGVpciBkaXNjcmV0aW9uLCBtZW1iZXJzIG9mIHRoZSByZXZpZXdlciBncm91cCBtYXkgYWxzbyBjb21taXQKKyAgIGJyYW5jaGVzL3BhdGNoZXMgdW5kZXIgdGhlc2UgY29uZGl0aW9uczoKKworICAgLSB0aGUgYnJhbmNoIGRvZXMgbm90IGFkZCBvciBjaGFuZ2UgQVBJLCBBQkkgb3Igd2lyZS1wcm90b2NvbAorCisgICAtIHRoZSBicmFuY2ggc29sdmVzIGEga25vd24gcHJvYmxlbSBhbmQgaXMgY292ZXJlZCBieSB0aGUgcmVncmVzc2lvbiB0ZXN0cworCisgICAtIHRoZXJlIGFyZSBubyBvYmplY3Rpb25zIGZyb20gdGhlIHJlc3Qgb2YgdGhlIHJldmlldyBncm91cCB3aXRoaW4KKyAgICAgYSB3ZWVrIG9mIHRoZSBwYXRjaGVzIGJlaW5nIGF0dGFjaGVkIHRvIEJ1Z3ppbGxhCisKKyAgIC0gdGhlIGNvbW1pdHRlciBnZXRzIGEgcG9zaXRpdmUgcmV2aWV3IG9uIEJ1Z3ppbGxhIGZyb20gc29tZW9uZSB0aGV5CisgICAgIGNvbnNpZGVyIHF1YWxpZmllZCB0byByZXZpZXcgdGhlIGNoYW5nZSAoZS5nLiBhIGNvbGxlYWd1ZSB3aXRoIEQtQnVzCisgICAgIGV4cGVyaWVuY2U7IG5vdCBuZWNlc3NhcmlseSBhIG1lbWJlciBvZiB0aGUgcmV2aWV3ZXIgZ3JvdXApCisKKyAtIHJlZ2FyZGxlc3Mgb2YgcmV2aWV3cywgdG8gY29tbWl0IGEgcGF0Y2g6CisgICAgLSBtYWtlIGNoZWNrIG11c3QgcGFzcworICAgIC0gdGhlIHRlc3Qgc3VpdGUgbXVzdCBiZSBleHRlbmRlZCB0byBjb3ZlciB0aGUgbmV3IGNvZGUKKyAgICAgIGFzIG11Y2ggYXMgcmVhc29uYWJseSBmZWFzaWJsZSAoc2VlIFRlc3RzIGFib3ZlKQorICAgIC0gdGhlIHBhdGNoIGhhcyB0byBmb2xsb3cgdGhlIHBvcnRhYmlsaXR5LCBzZWN1cml0eSwgYW5kIAorICAgICAgc3R5bGUgZ3VpZGVsaW5lcworICAgIC0gdGhlIHBhdGNoIHNob3VsZCBhcyBtdWNoIGFzIHJlYXNvbmFibGUgZG8gb25lIHRoaW5nLCAKKyAgICAgIG5vdCBtYW55IHVucmVsYXRlZCBjaGFuZ2VzCisgICBObyByZXZpZXdlciBzaG91bGQgYXBwcm92ZSBhIHBhdGNoIHdpdGhvdXQgdGhlc2UgYXR0cmlidXRlcywgYW5kCisgICBmYWlsdXJlIG9uIHRoZXNlIHBvaW50cyBpcyBncm91bmRzIGZvciByZXZlcnRpbmcgdGhlIHBhdGNoLgorCitUaGUgcmV2aWV3ZXIgZ3JvdXAgdGhhdCBjYW4gYXBwcm92ZSBwYXRjaGVzOgorCitIYXZvYyBQZW5uaW5ndG9uIDxocEBwb2JveC5uZXQ+CitNaWNoYWVsIE1lZWtzIDxtaWNoYWVsLm1lZWtzQG5vdmVsbC5jb20+CitBbGV4YW5kZXIgTGFyc3NvbiAgPGFsZXhsQHJlZGhhdC5jb20+CitaYWNrIFJ1c2luIDx6YWNrQGtkZS5vcmc+CitKb2UgU2hhdyA8am9lQGFzc2Jhcm4uY29tPgorTWlrYWVsIEhhbGxlbmRhbCA8bWlja2VAaW1lbmRpby5jb20+CitSaWNoYXJkIEh1bHQgPHJpY2hhcmRAaW1lbmRpby5jb20+CitPd2VuIEZyYXNlci1HcmVlbiA8b3dlbkBkaXNjb2JhYmUubmV0PgorT2xpdmllciBBbmRyaWV1IDxvbGl2X19hQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK0NvbGluIFdhbHRlcnMgPHdhbHRlcnNAdmVyYnVtLm9yZz4KK1RoaWFnbyBNYWNpZWlyYSA8dGhpYWdvQGtkZS5vcmc+CitKb2huIFBhbG1pZXJpIDxqb2hucEByZWRoYXQuY29tPgorU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAbmV0c3BsaXQuY29tPgorV2lsbCBUaG9tcHNvbiA8d2lsbC50aG9tcHNvbkBjb2xsYWJvcmEuY28udWs+CitTaW1vbiBNY1ZpdHRpZSA8c2ltb24ubWN2aXR0aWVAY29sbGFib3JhLmNvLnVrPgorRGF2aWQgWmV1dGhlbiA8ZGF2aWR6QHJlZGhhdC5jb20+CmRpZmYgLS1naXQgYS9kYnVzL0lOU1RBTEwgYi9kYnVzL0lOU1RBTEwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE4MmY5OAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvSU5TVEFMTApAQCAtMCwwICsxLDI1MiBAQAorICAgICAgICAgICBEQnVzIEluc3RhbGxhdGlvbgorICAgICAgICAgICA9PT09PT09PT09PT09PT09PQorCitRdWljayBzdGFydAorPT09PT09PT09PT0KKworREJ1cyBjb3VsZCBiZSBidWlsZCB3aXRoIEdOVSBBdXRvVG9vbHMgb3Igd2l0aCBjbWFrZSBmb3IgaXRzIGJ1aWxkIHN5c3RlbSwKK3RodXMgdGhlIGJhc2ljIGluc3RhbGwgcHJvY2VkdXJlIGNhbiBiZSBzdW1tYXJpemVkIGFzOgorCit3aXRoIGF1dG90b29sczoKKworICAgIC4vY29uZmlndXJlIC0tcHJlZml4PS91c3IKKyAgICBtYWtlCisgICAgc3UgbWFrZSBpbnN0YWxsCisKK1RoZSBjb25maWd1cmUgc2NyaXB0IHdpbGwgYXV0b21hdGljYWxseSBkZXRlcm1pbmUgd2hldGhlciB0byB0cnkgYW5kCitidWlsZCBiaW5kaW5ncyBmb3IgR0xpYiwgUXQsIFF0MywgUHl0aG9uIGFuZCBNb25vIGJhc2VkIG9uIHdoYXQgdG9vbHMKK2FyZSBpbnN0YWxsZWQgb24gdGhlIGhvc3Qgc3lzdGVtLiBUaGUgZGVmYXVsdCBidWlsZCBiZWhhdmlvdXIgY2FuIGJlCitvdmVycmlkZGVuIHVzaW5nIHRoZSAtLWVuYWJsZS1YWFgvLS1kaXNhYmxlLVhYWCBhcmd1bWVudHMgdG8gY29uZmlndXJlLgorQSB0eXBpY2FsIHNjZW5hcmlvIGluIHdoaWNoIGl0IGlzIGRlc2lyYWJsZSB0byBvdmVycmlkZSBhdXRvbWF0aWMKK2RldGVjdGlvbiwgaXMgZHVyaW5nIHBhY2thZ2luZyBvZiBiaW5hcnkgYnVpbGRzLCB3aGVyZSBhIHByZWRpY3RhYmxlCitkZXBlbmRhbmN5IGNoYWluIGlzIHJlcXVpcmVkLiBGb3IgbW9yZSBkZXRhaWxzIG9uIEdOVSBBdXRvVG9vbHMKK2luc3RhbGxhdGlvbiwgY29uc3VsdCB0aGUgZ2VuZXJpYyBpbnN0cnVjdGlvbnMgbGF0ZXIgaW4gdGhpcyBkb2N1bWVudAorCit3aXRoIGNtYWtlOgorICAgIG1rZGlyIGRidXMtYnVpbGQtZGlyCisgICAgY2QgZGJ1cy1idWlsZC1kaXIKKyAgICBjbWFrZSAtRyA8bWFrZWZpbGUtZ2VuZXJhdG9yLW5hbWU+IFstRDxvcHRpb24+XSA8ZGJ1cy1zcmMtcm9vdD4vY21ha2UKKyAgICBtYWtlCisgICAgbWFrZSBpbnN0YWxsCisKK2NtYWtlIHdpbGwgYXV0b21hdGljYWxseSBkZXRlcm1pbmUgd2hldGhlciB0byBidWlsZCBzb21lIGZlYXR1cmVzCitiYXNlZCBvbiB3aGF0IHRvb2xzIGFuZC9vciBsaWJyYXJpZXMgYXJlIGluc3RhbGxlZCBvbiB0aGUgaG9zdCBzeXN0ZW0uIAorVGhlIGRlZmF1bHQgYnVpbGQgYmVoYXZpb3VyIGNhbiBiZSBvdmVycmlkZGVuIHVzaW5nIHRoZSAKKy1ERU5BQkxFXzxYWFg+IGFyZ3VtZW50cyB0byBjbWFrZS4KK0EgdHlwaWNhbCBzY2VuYXJpbyBpbiB3aGljaCBpdCBpcyBkZXNpcmFibGUgdG8gb3ZlcnJpZGUgYXV0b21hdGljCitkZXRlY3Rpb24sIGlzIGR1cmluZyBwYWNrYWdpbmcgb2YgYmluYXJ5IGJ1aWxkcywgd2hlcmUgYSBwcmVkaWN0YWJsZQorZGVwZW5kYW5jeSBjaGFpbiBpcyByZXF1aXJlZC4gRm9yIG1vcmUgZGV0YWlscyBvbiBjbWFrZSBpbnN0YWxsYXRpb24sIAorY29uc3VsdCBodHRwOi8vd3d3LmNtYWtlLm9yZy9jbWFrZS9oZWxwL2hlbHAuaHRtbC4gCisKK0V4dGVybmFsIHNvZnR3YXJlIGRlcGVuZGFuY2llcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBvbmx5IGZ1bmRhbWVudGFsIHJlcXVpcmVtZW50IHRvIGJ1aWxkIERCdXMgaXMgYW4gWE1MIHBhcnNlciwKK2hvd2V2ZXIsIHRoZXJlIGFyZSBhIG51bWJlciBvZiBvdGhlciBzb2Z0d2FyZSBwYWNrYWdlcyB3aGljaCAoaWYKK3ByZXNlbnQpIHdpbGwgZW5oYW5jZSBmdW5jdGlvbmFsaXR5LgorCitDb3JlIGxpYnJhcnkKKy0tLS0tLS0tLS0tLQorCisgUmVxdWlzaXRlOgorCisgIC0gR2V0dGV4dAorICAtIGV4cGF0IG9yIGxpYnhtbC0yCisKKyBOQiwgZXhwYXQgaXMgdGhlIHJlY29tbWVuZGVkIFhNTCBwYXJzZXIgYmVjYXVzZSBpdCBoYXMgbW9yZSByb2J1c3QKKyBoYW5kbGluZyBvZiBPT00gY29uZGl0aW9ucy4KKworIE9wdGlvbmFsOgorCisgIC0gbGlic2VsaW51eCAgICAgICAgICAgKGZvciBTRUxpbnV4IGludGVncmF0aW9uKQorICAtIGRub3RpZnkgICAgICAgICAgICAgIChmb3IgYXV0b21hdGljIHNlcnZpY2UgZmlsZSByZWxvYWQpCisgIC0gZG94eWdlbiAgICAgICAgICAgICAgKGZvciBBUEkgZG9jdW1lbnRhdGlvbikKKyAgLSB4bWx0byBvciBtZWlucHJvYzQgICAoZm9yIFNwZWMgJiBvdGhlciBYTUwgZG9jdW1lbnRhdGlvbikKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIHJlc3Qgb2YgdGhpcyBkb2N1bWVudCBjb250YWlucyB0aGUgZ2VuZXJpYyBHTlUgQXV0b1Rvb2xzIGluc3RhbGwKK2luc3J1Y3Rpb25zLi4uLgorCitCYXNpYyBJbnN0YWxsYXRpb24KKz09PT09PT09PT09PT09PT09PQorCisgICBUaGVzZSBhcmUgZ2VuZXJpYyBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLgorCisgICBUaGUgYGNvbmZpZ3VyZScgc2hlbGwgc2NyaXB0IGF0dGVtcHRzIHRvIGd1ZXNzIGNvcnJlY3QgdmFsdWVzIGZvcgordmFyaW91cyBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyB1c2VkIGR1cmluZyBjb21waWxhdGlvbi4gIEl0IHVzZXMKK3Rob3NlIHZhbHVlcyB0byBjcmVhdGUgYSBgTWFrZWZpbGUnIGluIGVhY2ggZGlyZWN0b3J5IG9mIHRoZSBwYWNrYWdlLgorSXQgbWF5IGFsc28gY3JlYXRlIG9uZSBvciBtb3JlIGAuaCcgZmlsZXMgY29udGFpbmluZyBzeXN0ZW0tZGVwZW5kZW50CitkZWZpbml0aW9ucy4gIEZpbmFsbHksIGl0IGNyZWF0ZXMgYSBzaGVsbCBzY3JpcHQgYGNvbmZpZy5zdGF0dXMnIHRoYXQKK3lvdSBjYW4gcnVuIGluIHRoZSBmdXR1cmUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiwgYSBmaWxlCitgY29uZmlnLmNhY2hlJyB0aGF0IHNhdmVzIHRoZSByZXN1bHRzIG9mIGl0cyB0ZXN0cyB0byBzcGVlZCB1cAorcmVjb25maWd1cmluZywgYW5kIGEgZmlsZSBgY29uZmlnLmxvZycgY29udGFpbmluZyBjb21waWxlciBvdXRwdXQKKyh1c2VmdWwgbWFpbmx5IGZvciBkZWJ1Z2dpbmcgYGNvbmZpZ3VyZScpLgorCisgICBJZiB5b3UgbmVlZCB0byBkbyB1bnVzdWFsIHRoaW5ncyB0byBjb21waWxlIHRoZSBwYWNrYWdlLCBwbGVhc2UgdHJ5Cit0byBmaWd1cmUgb3V0IGhvdyBgY29uZmlndXJlJyBjb3VsZCBjaGVjayB3aGV0aGVyIHRvIGRvIHRoZW0sIGFuZCBtYWlsCitkaWZmcyBvciBpbnN0cnVjdGlvbnMgdG8gdGhlIGFkZHJlc3MgZ2l2ZW4gaW4gdGhlIGBSRUFETUUnIHNvIHRoZXkgY2FuCitiZSBjb25zaWRlcmVkIGZvciB0aGUgbmV4dCByZWxlYXNlLiAgSWYgYXQgc29tZSBwb2ludCBgY29uZmlnLmNhY2hlJworY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorCisgICBUaGUgZmlsZSBgY29uZmlndXJlLmluJyBpcyB1c2VkIHRvIGNyZWF0ZSBgY29uZmlndXJlJyBieSBhIHByb2dyYW0KK2NhbGxlZCBgYXV0b2NvbmYnLiAgWW91IG9ubHkgbmVlZCBgY29uZmlndXJlLmluJyBpZiB5b3Ugd2FudCB0byBjaGFuZ2UKK2l0IG9yIHJlZ2VuZXJhdGUgYGNvbmZpZ3VyZScgdXNpbmcgYSBuZXdlciB2ZXJzaW9uIG9mIGBhdXRvY29uZicuCisKK1RoZSBzaW1wbGVzdCB3YXkgdG8gY29tcGlsZSB0aGlzIHBhY2thZ2UgaXM6CisKKyAgMS4gYGNkJyB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHBhY2thZ2UncyBzb3VyY2UgY29kZSBhbmQgdHlwZQorICAgICBgLi9jb25maWd1cmUnIHRvIGNvbmZpZ3VyZSB0aGUgcGFja2FnZSBmb3IgeW91ciBzeXN0ZW0uICBJZiB5b3UncmUKKyAgICAgdXNpbmcgYGNzaCcgb24gYW4gb2xkIHZlcnNpb24gb2YgU3lzdGVtIFYsIHlvdSBtaWdodCBuZWVkIHRvIHR5cGUKKyAgICAgYHNoIC4vY29uZmlndXJlJyBpbnN0ZWFkIHRvIHByZXZlbnQgYGNzaCcgZnJvbSB0cnlpbmcgdG8gZXhlY3V0ZQorICAgICBgY29uZmlndXJlJyBpdHNlbGYuCisKKyAgICAgUnVubmluZyBgY29uZmlndXJlJyB0YWtlcyBhd2hpbGUuICBXaGlsZSBydW5uaW5nLCBpdCBwcmludHMgc29tZQorICAgICBtZXNzYWdlcyB0ZWxsaW5nIHdoaWNoIGZlYXR1cmVzIGl0IGlzIGNoZWNraW5nIGZvci4KKworICAyLiBUeXBlIGBtYWtlJyB0byBjb21waWxlIHRoZSBwYWNrYWdlLgorCisgIDMuIE9wdGlvbmFsbHksIHR5cGUgYG1ha2UgY2hlY2snIHRvIHJ1biBhbnkgc2VsZi10ZXN0cyB0aGF0IGNvbWUgd2l0aAorICAgICB0aGUgcGFja2FnZS4KKworICA0LiBUeXBlIGBtYWtlIGluc3RhbGwnIHRvIGluc3RhbGwgdGhlIHByb2dyYW1zIGFuZCBhbnkgZGF0YSBmaWxlcyBhbmQKKyAgICAgZG9jdW1lbnRhdGlvbi4KKworICA1LiBZb3UgY2FuIHJlbW92ZSB0aGUgcHJvZ3JhbSBiaW5hcmllcyBhbmQgb2JqZWN0IGZpbGVzIGZyb20gdGhlCisgICAgIHNvdXJjZSBjb2RlIGRpcmVjdG9yeSBieSB0eXBpbmcgYG1ha2UgY2xlYW4nLiAgVG8gYWxzbyByZW1vdmUgdGhlCisgICAgIGZpbGVzIHRoYXQgYGNvbmZpZ3VyZScgY3JlYXRlZCAoc28geW91IGNhbiBjb21waWxlIHRoZSBwYWNrYWdlIGZvcgorICAgICBhIGRpZmZlcmVudCBraW5kIG9mIGNvbXB1dGVyKSwgdHlwZSBgbWFrZSBkaXN0Y2xlYW4nLiAgVGhlcmUgaXMKKyAgICAgYWxzbyBhIGBtYWtlIG1haW50YWluZXItY2xlYW4nIHRhcmdldCwgYnV0IHRoYXQgaXMgaW50ZW5kZWQgbWFpbmx5CisgICAgIGZvciB0aGUgcGFja2FnZSdzIGRldmVsb3BlcnMuICBJZiB5b3UgdXNlIGl0LCB5b3UgbWF5IGhhdmUgdG8gZ2V0CisgICAgIGFsbCBzb3J0cyBvZiBvdGhlciBwcm9ncmFtcyBpbiBvcmRlciB0byByZWdlbmVyYXRlIGZpbGVzIHRoYXQgY2FtZQorICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKK0NvbXBpbGVycyBhbmQgT3B0aW9ucworPT09PT09PT09PT09PT09PT09PT09CisKKyAgIFNvbWUgc3lzdGVtcyByZXF1aXJlIHVudXN1YWwgb3B0aW9ucyBmb3IgY29tcGlsYXRpb24gb3IgbGlua2luZyB0aGF0Cit0aGUgYGNvbmZpZ3VyZScgc2NyaXB0IGRvZXMgbm90IGtub3cgYWJvdXQuICBZb3UgY2FuIGdpdmUgYGNvbmZpZ3VyZScKK2luaXRpYWwgdmFsdWVzIGZvciB2YXJpYWJsZXMgYnkgc2V0dGluZyB0aGVtIGluIHRoZSBlbnZpcm9ubWVudC4gIFVzaW5nCithIEJvdXJuZS1jb21wYXRpYmxlIHNoZWxsLCB5b3UgY2FuIGRvIHRoYXQgb24gdGhlIGNvbW1hbmQgbGluZSBsaWtlCit0aGlzOgorICAgICBDQz1jODkgQ0ZMQUdTPS1PMiBMSUJTPS1scG9zaXggLi9jb25maWd1cmUKKworT3Igb24gc3lzdGVtcyB0aGF0IGhhdmUgdGhlIGBlbnYnIHByb2dyYW0sIHlvdSBjYW4gZG8gaXQgbGlrZSB0aGlzOgorICAgICBlbnYgQ1BQRkxBR1M9LUkvdXNyL2xvY2FsL2luY2x1ZGUgTERGTEFHUz0tcyAuL2NvbmZpZ3VyZQorCitDb21waWxpbmcgRm9yIE11bHRpcGxlIEFyY2hpdGVjdHVyZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBZb3UgY2FuIGNvbXBpbGUgdGhlIHBhY2thZ2UgZm9yIG1vcmUgdGhhbiBvbmUga2luZCBvZiBjb21wdXRlciBhdCB0aGUKK3NhbWUgdGltZSwgYnkgcGxhY2luZyB0aGUgb2JqZWN0IGZpbGVzIGZvciBlYWNoIGFyY2hpdGVjdHVyZSBpbiB0aGVpcgorb3duIGRpcmVjdG9yeS4gIFRvIGRvIHRoaXMsIHlvdSBtdXN0IHVzZSBhIHZlcnNpb24gb2YgYG1ha2UnIHRoYXQKK3N1cHBvcnRzIHRoZSBgVlBBVEgnIHZhcmlhYmxlLCBzdWNoIGFzIEdOVSBgbWFrZScuICBgY2QnIHRvIHRoZQorZGlyZWN0b3J5IHdoZXJlIHlvdSB3YW50IHRoZSBvYmplY3QgZmlsZXMgYW5kIGV4ZWN1dGFibGVzIHRvIGdvIGFuZCBydW4KK3RoZSBgY29uZmlndXJlJyBzY3JpcHQuICBgY29uZmlndXJlJyBhdXRvbWF0aWNhbGx5IGNoZWNrcyBmb3IgdGhlCitzb3VyY2UgY29kZSBpbiB0aGUgZGlyZWN0b3J5IHRoYXQgYGNvbmZpZ3VyZScgaXMgaW4gYW5kIGluIGAuLicuCisKKyAgIElmIHlvdSBoYXZlIHRvIHVzZSBhIGBtYWtlJyB0aGF0IGRvZXMgbm90IHN1cHBvcnRzIHRoZSBgVlBBVEgnCit2YXJpYWJsZSwgeW91IGhhdmUgdG8gY29tcGlsZSB0aGUgcGFja2FnZSBmb3Igb25lIGFyY2hpdGVjdHVyZSBhdCBhIHRpbWUKK2luIHRoZSBzb3VyY2UgY29kZSBkaXJlY3RvcnkuICBBZnRlciB5b3UgaGF2ZSBpbnN0YWxsZWQgdGhlIHBhY2thZ2UgZm9yCitvbmUgYXJjaGl0ZWN0dXJlLCB1c2UgYG1ha2UgZGlzdGNsZWFuJyBiZWZvcmUgcmVjb25maWd1cmluZyBmb3IgYW5vdGhlcgorYXJjaGl0ZWN0dXJlLgorCitJbnN0YWxsYXRpb24gTmFtZXMKKz09PT09PT09PT09PT09PT09PQorCisgICBCeSBkZWZhdWx0LCBgbWFrZSBpbnN0YWxsJyB3aWxsIGluc3RhbGwgdGhlIHBhY2thZ2UncyBmaWxlcyBpbgorYC91c3IvbG9jYWwvYmluJywgYC91c3IvbG9jYWwvbWFuJywgZXRjLiAgWW91IGNhbiBzcGVjaWZ5IGFuCitpbnN0YWxsYXRpb24gcHJlZml4IG90aGVyIHRoYW4gYC91c3IvbG9jYWwnIGJ5IGdpdmluZyBgY29uZmlndXJlJyB0aGUKK29wdGlvbiBgLS1wcmVmaXg9UEFUSCcuCisKKyAgIFlvdSBjYW4gc3BlY2lmeSBzZXBhcmF0ZSBpbnN0YWxsYXRpb24gcHJlZml4ZXMgZm9yCithcmNoaXRlY3R1cmUtc3BlY2lmaWMgZmlsZXMgYW5kIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcy4gIElmIHlvdQorZ2l2ZSBgY29uZmlndXJlJyB0aGUgb3B0aW9uIGAtLWV4ZWMtcHJlZml4PVBBVEgnLCB0aGUgcGFja2FnZSB3aWxsIHVzZQorUEFUSCBhcyB0aGUgcHJlZml4IGZvciBpbnN0YWxsaW5nIHByb2dyYW1zIGFuZCBsaWJyYXJpZXMuCitEb2N1bWVudGF0aW9uIGFuZCBvdGhlciBkYXRhIGZpbGVzIHdpbGwgc3RpbGwgdXNlIHRoZSByZWd1bGFyIHByZWZpeC4KKworICAgSW4gYWRkaXRpb24sIGlmIHlvdSB1c2UgYW4gdW51c3VhbCBkaXJlY3RvcnkgbGF5b3V0IHlvdSBjYW4gZ2l2ZQorb3B0aW9ucyBsaWtlIGAtLWJpbmRpcj1QQVRIJyB0byBzcGVjaWZ5IGRpZmZlcmVudCB2YWx1ZXMgZm9yIHBhcnRpY3VsYXIKK2tpbmRzIG9mIGZpbGVzLiAgUnVuIGBjb25maWd1cmUgLS1oZWxwJyBmb3IgYSBsaXN0IG9mIHRoZSBkaXJlY3RvcmllcworeW91IGNhbiBzZXQgYW5kIHdoYXQga2luZHMgb2YgZmlsZXMgZ28gaW4gdGhlbS4KKworICAgSWYgdGhlIHBhY2thZ2Ugc3VwcG9ydHMgaXQsIHlvdSBjYW4gY2F1c2UgcHJvZ3JhbXMgdG8gYmUgaW5zdGFsbGVkCit3aXRoIGFuIGV4dHJhIHByZWZpeCBvciBzdWZmaXggb24gdGhlaXIgbmFtZXMgYnkgZ2l2aW5nIGBjb25maWd1cmUnIHRoZQorb3B0aW9uIGAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCcgb3IgYC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYJy4KKworT3B0aW9uYWwgRmVhdHVyZXMKKz09PT09PT09PT09PT09PT09CisKKyAgIFNvbWUgcGFja2FnZXMgcGF5IGF0dGVudGlvbiB0byBgLS1lbmFibGUtRkVBVFVSRScgb3B0aW9ucyB0bworYGNvbmZpZ3VyZScsIHdoZXJlIEZFQVRVUkUgaW5kaWNhdGVzIGFuIG9wdGlvbmFsIHBhcnQgb2YgdGhlIHBhY2thZ2UuCitUaGV5IG1heSBhbHNvIHBheSBhdHRlbnRpb24gdG8gYC0td2l0aC1QQUNLQUdFJyBvcHRpb25zLCB3aGVyZSBQQUNLQUdFCitpcyBzb21ldGhpbmcgbGlrZSBgZ251LWFzJyBvciBgeCcgKGZvciB0aGUgWCBXaW5kb3cgU3lzdGVtKS4gIFRoZQorYFJFQURNRScgc2hvdWxkIG1lbnRpb24gYW55IGAtLWVuYWJsZS0nIGFuZCBgLS13aXRoLScgb3B0aW9ucyB0aGF0IHRoZQorcGFja2FnZSByZWNvZ25pemVzLgorCisgICBGb3IgcGFja2FnZXMgdGhhdCB1c2UgdGhlIFggV2luZG93IFN5c3RlbSwgYGNvbmZpZ3VyZScgY2FuIHVzdWFsbHkKK2ZpbmQgdGhlIFggaW5jbHVkZSBhbmQgbGlicmFyeSBmaWxlcyBhdXRvbWF0aWNhbGx5LCBidXQgaWYgaXQgZG9lc24ndCwKK3lvdSBjYW4gdXNlIHRoZSBgY29uZmlndXJlJyBvcHRpb25zIGAtLXgtaW5jbHVkZXM9RElSJyBhbmQKK2AtLXgtbGlicmFyaWVzPURJUicgdG8gc3BlY2lmeSB0aGVpciBsb2NhdGlvbnMuCisKK1NwZWNpZnlpbmcgdGhlIFN5c3RlbSBUeXBlCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBUaGVyZSBtYXkgYmUgc29tZSBmZWF0dXJlcyBgY29uZmlndXJlJyBjYW4gbm90IGZpZ3VyZSBvdXQKK2F1dG9tYXRpY2FsbHksIGJ1dCBuZWVkcyB0byBkZXRlcm1pbmUgYnkgdGhlIHR5cGUgb2YgaG9zdCB0aGUgcGFja2FnZQord2lsbCBydW4gb24uICBVc3VhbGx5IGBjb25maWd1cmUnIGNhbiBmaWd1cmUgdGhhdCBvdXQsIGJ1dCBpZiBpdCBwcmludHMKK2EgbWVzc2FnZSBzYXlpbmcgaXQgY2FuIG5vdCBndWVzcyB0aGUgaG9zdCB0eXBlLCBnaXZlIGl0IHRoZQorYC0taG9zdD1UWVBFJyBvcHRpb24uICBUWVBFIGNhbiBlaXRoZXIgYmUgYSBzaG9ydCBuYW1lIGZvciB0aGUgc3lzdGVtCit0eXBlLCBzdWNoIGFzIGBzdW40Jywgb3IgYSBjYW5vbmljYWwgbmFtZSB3aXRoIHRocmVlIGZpZWxkczoKKyAgICAgQ1BVLUNPTVBBTlktU1lTVEVNCisKK1NlZSB0aGUgZmlsZSBgY29uZmlnLnN1YicgZm9yIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgZWFjaCBmaWVsZC4gIElmCitgY29uZmlnLnN1YicgaXNuJ3QgaW5jbHVkZWQgaW4gdGhpcyBwYWNrYWdlLCB0aGVuIHRoaXMgcGFja2FnZSBkb2Vzbid0CituZWVkIHRvIGtub3cgdGhlIGhvc3QgdHlwZS4KKworICAgSWYgeW91IGFyZSBidWlsZGluZyBjb21waWxlciB0b29scyBmb3IgY3Jvc3MtY29tcGlsaW5nLCB5b3UgY2FuIGFsc28KK3VzZSB0aGUgYC0tdGFyZ2V0PVRZUEUnIG9wdGlvbiB0byBzZWxlY3QgdGhlIHR5cGUgb2Ygc3lzdGVtIHRoZXkgd2lsbAorcHJvZHVjZSBjb2RlIGZvciBhbmQgdGhlIGAtLWJ1aWxkPVRZUEUnIG9wdGlvbiB0byBzZWxlY3QgdGhlIHR5cGUgb2YKK3N5c3RlbSBvbiB3aGljaCB5b3UgYXJlIGNvbXBpbGluZyB0aGUgcGFja2FnZS4KKworU2hhcmluZyBEZWZhdWx0cworPT09PT09PT09PT09PT09PQorCisgICBJZiB5b3Ugd2FudCB0byBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIGBjb25maWd1cmUnIHNjcmlwdHMgdG8gc2hhcmUsCit5b3UgY2FuIGNyZWF0ZSBhIHNpdGUgc2hlbGwgc2NyaXB0IGNhbGxlZCBgY29uZmlnLnNpdGUnIHRoYXQgZ2l2ZXMKK2RlZmF1bHQgdmFsdWVzIGZvciB2YXJpYWJsZXMgbGlrZSBgQ0MnLCBgY2FjaGVfZmlsZScsIGFuZCBgcHJlZml4Jy4KK2Bjb25maWd1cmUnIGxvb2tzIGZvciBgUFJFRklYL3NoYXJlL2NvbmZpZy5zaXRlJyBpZiBpdCBleGlzdHMsIHRoZW4KK2BQUkVGSVgvZXRjL2NvbmZpZy5zaXRlJyBpZiBpdCBleGlzdHMuICBPciwgeW91IGNhbiBzZXQgdGhlCitgQ09ORklHX1NJVEUnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgc2l0ZSBzY3JpcHQuCitBIHdhcm5pbmc6IG5vdCBhbGwgYGNvbmZpZ3VyZScgc2NyaXB0cyBsb29rIGZvciBhIHNpdGUgc2NyaXB0LgorCitPcGVyYXRpb24gQ29udHJvbHMKKz09PT09PT09PT09PT09PT09PQorCisgICBgY29uZmlndXJlJyByZWNvZ25pemVzIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyB0byBjb250cm9sIGhvdyBpdAorb3BlcmF0ZXMuCisKK2AtLWNhY2hlLWZpbGU9RklMRScKKyAgICAgVXNlIGFuZCBzYXZlIHRoZSByZXN1bHRzIG9mIHRoZSB0ZXN0cyBpbiBGSUxFIGluc3RlYWQgb2YKKyAgICAgYC4vY29uZmlnLmNhY2hlJy4gIFNldCBGSUxFIHRvIGAvZGV2L251bGwnIHRvIGRpc2FibGUgY2FjaGluZywgZm9yCisgICAgIGRlYnVnZ2luZyBgY29uZmlndXJlJy4KKworYC0taGVscCcKKyAgICAgUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvIGBjb25maWd1cmUnLCBhbmQgZXhpdC4KKworYC0tcXVpZXQnCitgLS1zaWxlbnQnCitgLXEnCisgICAgIERvIG5vdCBwcmludCBtZXNzYWdlcyBzYXlpbmcgd2hpY2ggY2hlY2tzIGFyZSBiZWluZyBtYWRlLiAgVG8KKyAgICAgc3VwcHJlc3MgYWxsIG5vcm1hbCBvdXRwdXQsIHJlZGlyZWN0IGl0IHRvIGAvZGV2L251bGwnIChhbnkgZXJyb3IKKyAgICAgbWVzc2FnZXMgd2lsbCBzdGlsbCBiZSBzaG93bikuCisKK2AtLXNyY2Rpcj1ESVInCisgICAgIExvb2sgZm9yIHRoZSBwYWNrYWdlJ3Mgc291cmNlIGNvZGUgaW4gZGlyZWN0b3J5IERJUi4gIFVzdWFsbHkKKyAgICAgYGNvbmZpZ3VyZScgY2FuIGRldGVybWluZSB0aGF0IGRpcmVjdG9yeSBhdXRvbWF0aWNhbGx5LgorCitgLS12ZXJzaW9uJworICAgICBQcmludCB0aGUgdmVyc2lvbiBvZiBBdXRvY29uZiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBgY29uZmlndXJlJworICAgICBzY3JpcHQsIGFuZCBleGl0LgorCitgY29uZmlndXJlJyBhbHNvIGFjY2VwdHMgc29tZSBvdGhlciwgbm90IHdpZGVseSB1c2VmdWwsIG9wdGlvbnMuCmRpZmYgLS1naXQgYS9kYnVzL01PRFVMRV9MSUNFTlNFX0FGTF9BTkRfR1BMIGIvZGJ1cy9NT0RVTEVfTElDRU5TRV9BRkxfQU5EX0dQTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9NT0RVTEVfTElDRU5TRV9BRkxfQU5EX0dQTApkaWZmIC0tZ2l0IGEvZGJ1cy9NYWtlZmlsZS5hbSBiL2RidXMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBiOTY3MAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzMyBAQAorU1VCRElSUz1kYnVzIGJ1cyB0b29scyB0ZXN0IGRvYworCitwa2djb25maWdkaXIgPSAkKGxpYmRpcikvcGtnY29uZmlnCitwa2djb25maWdfREFUQSA9IGRidXMtMS5wYworCitESVNUQ0xFQU5GSUxFUyA9IAkJXAorCWRidXMtMS5wYworCitFWFRSQV9ESVNUID0JCQlcCisJSEFDS0lORwkJCVwKKwlkYnVzLTEucGMuaW4JCVwKKwljbGVhbnVwLW1hbi1wYWdlcy5zaCAgICBcCisgICAgICAgIENoYW5nZUxvZy5wcmUtMS0wICAgICAgIFwKKyAgICAgICAgTkVXUy5wcmUtMS0wICAgICAgICAgICAgXAorCUNoYW5nZUxvZy5wcmUtMS0yICAgICAgIFwKKyAgICAgICAgTkVXUy5wcmUtMS0yCQlcCisJUkVBRE1FLndpbgkJXAorCVJFQURNRS53aW5jZQkJXAorCVJFQURNRS5jeWd3aW4JCVwKKwlSRUFETUUubGF1bmNoZAkJXAorCWNtYWtlCisKK2FsbC1sb2NhbDogRG94eWZpbGUKKwordXBkYXRlLWF1dGhvcnM6CisJZ2l0IHNob3J0bG9nIC1zIC1lIHwgY3V0IC1jIDgtIHwgc29ydCA+IEFVVEhPUlMKKworRElTVENIRUNLX0NPTkZJR1VSRV9GTEFHUyA9IFwKKwktLXdpdGgtc3lzdGVtZHN5c3RlbXVuaXRkaXI9JCRkY19pbnN0YWxsX2Jhc2UvJChzeXN0ZW1kc3lzdGVtdW5pdGRpcikKKworQUNMT0NBTF9BTUZMQUdTID0gLUkgbTQgJHtBQ0xPQ0FMX0ZMQUdTfQorCitpbmNsdWRlIHRvb2xzL2xjb3YuYW0KZGlmZiAtLWdpdCBhL2RidXMvTWFrZWZpbGUuY3ZzIGIvZGJ1cy9NYWtlZmlsZS5jdnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ0ZTU2NQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvTWFrZWZpbGUuY3ZzCkBAIC0wLDAgKzEsOCBAQAorIyMgLSotIG1ha2VmaWxlIC0qLQorCitjb25maWd1cmU6CisJLi9hdXRvZ2VuLnNoIC0tbm8tY29uZmlndXJlCisKKy5TSUxFTlQ6IAorCisuUEhPTlk6IGNvbmZpZ3VyZQpkaWZmIC0tZ2l0IGEvZGJ1cy9ORVdTIGIvZGJ1cy9ORVdTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZmExNDUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL05FV1MKQEAgLTAsMCArMSw1OTggQEAKK0QtQnVzIDEuNi44ICgyMDEyLTA5LTI4KQorPT0KKworVGhlICJGaXggb25lIHRoaW5nLCBicmVhayBhbm90aGVyIiByZWxlYXNlLgorCivigKIgRm9sbG93IHVwIHRvIENWRS0yMDEyLTM1MjQ6IFRoZSBhZGRpdGlvbmFsIGhhcmRlbmluZworICB3b3JrIHRvIHVzZSBfX3NlY3VyZV9nZXRlbnYoKSBhcyBhIGZvbGxvd3VwIHRvIGJ1ZyAjNTIyMDIKKyAgYnJva2UgY2VydGFpbiBjb25maWd1cmF0aW9ucyBvZiBnbm9tZS1rZXlyaW5nLiAgR2l2ZW4KKyAgdGhlIGRpZmZpY3VsdHkgb2YgbWFraW5nIHRoaXMgd29yayB3aXRob3V0IGV4dGVuc2l2ZQorICBjaGFuZ2VzIHRvIGdub21lLWtleXJpbmcsIHVzZSBvZiBfX3NlY3VyZV9nZXRlbnYoKSBpcworICBkZWZlcnJlZC4KKworRC1CdXMgMS42LjYgKDIwMTItMDktMjgpCis9PQorCitUaGUgIkNsZWFyIHRoZSBlbnZpcm9ubWVudCBpbiB5b3VyIHNldHVpZCBiaW5hcmllcywgcGxlYXNlIiByZWxlYXNlLgorCivigKIgQ1ZFLTIwMTItMzUyNDogRG9uJ3QgYWNjZXNzIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZmQubyAjNTIyMDIpCisgIFRoYW5rcyB0byB3b3JrIGFuZCBpbnB1dCBmcm9tIENvbGluIFdhbHRlcnMsIFNpbW9uIE1jVml0dGllLAorICBHZW9mZnJleSBUaG9tYXMsIGFuZCBvdGhlcnMuCivigKIgVW5peC1zcGVjaWZpYzoKKyAgwrcgRml4IGNvbXBpbGF0aW9uIG9uIFNvbGFyaXMgKGZkLm8gIzUzMjg2LCBKb25hdGhhbiBQZXJraW4pCisgIMK3IFdvcmsgYXJvdW5kIGludGVyZGVwZW5kZW50IGhlYWRlcnMgb24gT3BlbkJTRCBieSBpbmNsdWRpbmcgc3lzL3R5cGVzLmgKKyAgICBiZWZvcmUgZWFjaCB1c2Ugb2Ygc3lzL3NvY2tldC5oIChmZC5vICM1NDQxOCwgQnJhZCBTbWl0aCkKKworRC1CdXMgMS42LjQgKDIwMTItMDctMTgpCis9PQorCivigKIgRGV0ZWN0IHRoYXQgdXNlcnMgYXJlICJhdCB0aGUgY29uc29sZSIgY29ycmVjdGx5IHdoZW4gY29uZmlndXJlZCB3aXRoCisgIGEgbm9uLWRlZmF1bHQgcGF0aCBzdWNoIGFzIC0tZW5hYmxlLWNvbnNvbGUtYXV0aC1kaXI9L3J1bi9jb25zb2xlCisgIChmZC5vICM1MTUyMSwgRGF2ZSBSZWlzbmVyKQorCivigKIgUmVtb3ZlIGFuIGluY29ycmVjdCBhc3NlcnRpb24gZnJvbSBEQnVzVHJhbnNwb3J0IChmZC5vICM1MTY1NywKKyAgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBNYWtlIC0tZW5hYmxlLWRldmVsb3BlciBkZWZhdWx0IHRvICJubyIgKHJlZ3Jlc3Npb24gaW4gMS42LjI7CisgIGZkLm8gIzUxNjU3LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFdpbmRvd3Mtc3BlY2lmaWM6CisgIMK3IExhdW5jaCBkYnVzLWRhZW1vbiBjb3JyZWN0bHkgaWYgaXRzIHBhdGggY29udGFpbnMgYSBzcGFjZQorICAgIChmZC5vICM0OTQ1MCwgV29sZmdhbmcgQmFyb24pCisKK0QtQnVzIDEuNi4yICgyMDEyLTA2LTI3KQorPT0KKworVGhlICJJY2UgQ2FiYmFnZSIgcmVsZWFzZS4KKwor4oCiIENoYW5nZSBob3cgd2UgY3JlYXRlIC92YXIvbGliL2RidXMgc28gaXQgd29ya3MgdW5kZXIgQXV0b21ha2UgPj0gMS4xMS40CisgIChmZC5vICM1MTQwNiwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBEb24ndCByZXR1cm4gZnJvbSBkYnVzX3BlbmRpbmdfY2FsbF9zZXRfbm90aWZ5IHdpdGggYSBsb2NrIGhlbGQgb24gT09NCisgIChmZC5vICM1MTAzMiwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBEaXNjb25uZWN0ICJkZXZlbG9wZXIgbW9kZSIgKGFzc2VydGlvbnMsIHZlcmJvc2UgbW9kZSBldGMuKSBmcm9tCisgIEF1dG9tYWtlIG1haW50YWluZXIgbW9kZS4gRC1CdXMgZGV2ZWxvcGVycyBzaG91bGQgbm93IGNvbmZpZ3VyZSB3aXRoCisgIC0tZW5hYmxlLWRldmVsb3Blci4gQXV0b21ha2UgbWFpbnRhaW5lciBtb2RlIGlzIG5vdyBvbiBieSBkZWZhdWx0OworICBkaXN0cmlidXRpb25zIGNhbiBkaXNhYmxlIGl0IHdpdGggLS1kaXNhYmxlLW1haW50YWluZXItbW9kZS4KKyAgKGZkLm8gIzM0NjcxLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEF1dG9tYXRpY2FsbHkgZGVmaW5lIERCVVNfU1RBVElDX0JVSUxEIGluIHN0YXRpYy1vbmx5IEF1dG90b29scyBidWlsZHMsCisgIGZpeGluZyBsaW5raW5nIHdoZW4gdGFyZ2V0aW5nIFdpbmRvd3MgKGZkLm8gIzMzOTczOyB3aWxsaWFtLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFVuaXgtc3BlY2lmaWM6CisgIMK3IENoZWNrIGZvciBsaWJwdGhyZWFkIHVuZGVyIENNYWtlIG9uIFVuaXggKGZkLm8gIzQ3MjM3LCBTaW1vbiBNY1ZpdHRpZSkKKworRC1CdXMgMS42LjAgKDIwMTItMDYtMDUpCis9PQorCitUaGUg4oCcc291bCBvZiB0aGlzIG1hY2hpbmUgaGFzIGltcHJvdmVk4oCdIHJlbGVhc2UuCisKK1RoaXMgdmVyc2lvbiBzdGFydHMgYSBuZXcgc3RhYmxlIGJyYW5jaCBvZiBELUJ1czogb25seSBidWcgZml4ZXMgd2lsbAorYmUgYWNjZXB0ZWQgaW50byAxLjYueC4gT3RoZXIgY2hhbmdlcyB3aWxsIG5vdyBnbyB0byB0aGUgMS43LnggYnJhbmNoLgorCitTdW1tYXJ5IG9mIGNoYW5nZXMgc2luY2UgMS40Lng6CisKK+KAoiBOZXcgcmVxdWlyZW1lbnRzCisgIMK3IFBUSFJFQURfTVVURVhfUkVDVVJTSVZFIG9uIFVuaXgKKyAgwrcgY29tcGlsZXIgc3VwcG9ydCBmb3IgNjQtYml0IGludGVnZXJzIChpbnQ2NF90IG9yIGVxdWl2YWxlbnQpCisKK+KAoiBELUJ1cyBTcGVjaWZpY2F0aW9uIHYwLjE5CisKK+KAoiBOZXcgZGJ1cy1kYWVtb24gZmVhdHVyZXMKKyAgwrcgPGFsbG93IG93bl9wcmVmaXg9ImNvbS5leGFtcGxlLlNlcnZpY2UiLz4gcnVsZXMgYWxsb3cgdGhlIHNlcnZpY2UgdG8KKyAgICBvd24gbmFtZXMgbGlrZSBjb20uZXhhbXBsZS5TZXJ2aWNlLkluc3RhbmNlMworICDCtyBvcHRpb25hbCBzeXN0ZW1kIGludGVncmF0aW9uIHdoZW4gY2hlY2tpbmcgYXRfY29uc29sZSBwb2xpY2llcworICDCtyAtLW5vcGlkZmlsZSBvcHRpb24sIG1haW5seSBmb3IgdXNlIGJ5IHN5c3RlbWQKKyAgwrcgcGF0aF9uYW1lc3BhY2UgYW5kIGFyZzBuYW1lc3BhY2UgbWF5IGFwcGVhciBpbiBtYXRjaCBydWxlcworICDCtyBlYXZlc2Ryb3BwaW5nIGlzIGRpc2FibGVkIHVubGVzcyB0aGUgbWF0Y2ggcnVsZSBjb250YWlucyBlYXZlc2Ryb3A9dHJ1ZQorCivigKIgTmV3IHB1YmxpYyBBUEkKKyAgwrcgZnVuY3Rpb25zIHRvIHZhbGlkYXRlIHZhcmlvdXMgc3RyaW5nIHR5cGVzIChkYnVzX3ZhbGlkYXRlX3BhdGgoKSBldGMuKQorICDCtyBkYnVzX3R5cGVfaXNfdmFsaWQoKQorICDCtyBEQnVzQmFzaWNWYWx1ZSwgYSB1bmlvbiBvZiBldmVyeSBiYXNpYyB0eXBlCisKK+KAoiBCdWcgZml4ZXMKKyAgwrcgcmVtb3ZlZCBhbiB1bnNhZmUgcmVpbXBsZW1lbnRhdGlvbiBvZiByZWN1cnNpdmUgbXV0ZXhlcworICDCtyBkYnVzLWRhZW1vbiBubyBsb25nZXIgYnVzeS1sb29wcyBpZiBpdCBoYXMgZmFyIHRvbyBtYW55IGZpbGUgZGVzY3JpcHRvcnMKKyAgwrcgZGJ1cy1kYWVtb24uZXhlIC0tcHJpbnQtYWRkcmVzcyB3b3JrcyBvbiBXaW5kb3dzCisgIMK3IGFsbCB0aGUgb3RoZXIgYnVnIGZpeGVzIGZyb20gMS40LjIwCisKK+KAoiBPdGhlciBtYWpvciBpbXBsZW1lbnRhdGlvbiBjaGFuZ2VzCisgIMK3IG9uIExpbnV4LCBkYnVzLWRhZW1vbiB1c2VzIGVwb2xsIGlmIHN1cHBvcnRlZCwgZm9yIGJldHRlciBzY2FsYWJpbGl0eQorICDCtyBkYnVzX3RocmVhZHNfaW5pdCgpIGlnbm9yZXMgaXRzIGFyZ3VtZW50IGFuZCBiZWhhdmVzIGxpa2UKKyAgICBkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0KCkgaW5zdGVhZAorICDCtyByZW1vdmVkIHRoZSBwZXItY29ubmVjdGlvbiBsaW5rIGNhY2hlLCBpbXByb3ZpbmcgZGJ1cy1kYWVtb24gcGVyZm9ybWFuY2UKKwor4oCiIERldmVsb3BlciBmZWF0dXJlcworICDCtyBvcHRpb25hbCBWYWxncmluZCBpbnN0cnVtZW50YXRpb24gKC0td2l0aC12YWxncmluZCkKKyAgwrcgb3B0aW9uYWwgU3RhdHMgaW50ZXJmYWNlIG9uIHRoZSBkYnVzLWRhZW1vbiAoLS1lbmFibGUtc3RhdHMpCisgIMK3IG9wdGlvbmFsbHkgYWJvcnQgd2hlbmV2ZXIgbWFsbG9jKCkgZmFpbHMgKC0tZW5hYmxlLWVtYmVkZGVkLXRlc3RzCisgICAgYW5kIGV4cG9ydCBEQlVTX01BTExPQ19DQU5OT1RfRkFJTD0xKQorCitDaGFuZ2VzIHNpbmNlIDEuNS4xMjoKKwor4oCiIEJlIG1vcmUgY2FyZWZ1bCBhYm91dCBtb25vdG9uaWMgdGltZSB2cy4gcmVhbCB0aW1lLCBmaXhpbmcgREJVU19DT09LSUVfU0hBMQorICBzcGVjLWNvbXBsaWFuY2UgKGZkLm8gIzQ4NTgwLCBEYXZpZCBaZXV0aGVuKQorCivigKIgRG9uJ3QgdXNlIGluc3RhbGwoMSkgd2l0aGluIHRoZSBzb3VyY2UvYnVpbGQgdHJlZXMsIGZpeGluZyB0aGUgYnVpbGQgYXMKKyAgbm9uLXJvb3Qgd2hlbiB1c2luZyBPcGVuQlNEIGluc3RhbGwoMSkgKGZkLm8gIzQ4MjE3LCBBbnRvaW5lIEphY291dG90KQorCivigKIgQWRkIG1pc3NpbmcgY29tbWFzIGluIHNvbWUgdGNwIGFuZCBub25jZS10Y3AgYWRkcmVzc2VzLCBhbmQgcmVtb3ZlCisgIGFuIHVudXNlZCBkdXBsaWNhdGUgY29weSBvZiB0aGUgbm9uY2UtdGNwIHRyYW5zcG9ydCBpbiBXaW5kb3dzIGJ1aWxkcworICAoZmQubyAjNDU4OTYsIFNpbW9uIE1jVml0dGllKQorCitELUJ1cyAxLjUuMTIgKDIwMTItMDMtMjcpCis9PQorCitUaGUg4oCcQmlnIEJvb2sgb2YgU2NpZW5jZeKAnSByZWxlYXNlLgorCivigKIgQWRkIHB1YmxpYyBBUEkgdG8gdmFsaWRhdGUgdmFyaW91cyBzdHJpbmcgdHlwZXM6CisgIGRidXNfdmFsaWRhdGVfcGF0aCgpLCBkYnVzX3ZhbGlkYXRlX2ludGVyZmFjZSgpLCBkYnVzX3ZhbGlkYXRlX21lbWJlcigpLAorICBkYnVzX3ZhbGlkYXRlX2Vycm9yX25hbWUoKSwgZGJ1c192YWxpZGF0ZV9idXNfbmFtZSgpLCBkYnVzX3ZhbGlkYXRlX3V0ZjgoKQorICAoZmQubyAjMzk1NDksIFNpbW9uIE1jVml0dGllKQorCivigKIgVHVybiBEQnVzQmFzaWNWYWx1ZSBpbnRvIHB1YmxpYyBBUEkgc28gYmluZGluZ3MgZG9uJ3QgbmVlZCB0byBpbnZlbnQgdGhlaXIKKyAgb3duICJ1bmlvbiBvZiBldmVyeXRoaW5nIiB0eXBlIChmZC5vICMxMTE5MSwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBFbnVtZXJhdGUgZGF0YSBmaWxlcyBpbmNsdWRlZCBpbiB0aGUgYnVpbGQgcmF0aGVyIHRoYW4gdXNpbmcgZmluZCgxKQorICAoZmQubyAjMzM4NDAsIFNpbW9uIE1jVml0dGllKQorCivigKIgQWRkIHN1cHBvcnQgZm9yIHBvbGljeSBydWxlcyBsaWtlIDxhbGxvdyBvd25fcHJlZml4PSJjb20uZXhhbXBsZS5TZXJ2aWNlIi8+CisgIGluIGRidXMtZGFlbW9uIChmZC5vICM0NjI3MywgQWxiYW4gQ3JlcXV5KQorCivigKIgV2luZG93cy1zcGVjaWZpYzoKKyAgwrcgbWFrZSBkYnVzLWRhZW1vbi5leGUgLS1wcmludC1hZGRyZXNzIChhbmQgLS1wcmludC1waWQpIHdvcmsgYWdhaW4KKyAgICBvbiBXaW4zMiwgYnV0IG5vdCBvbiBXaW5DRSAoZmQubyAjNDYwNDksIFNpbW9uIE1jVml0dGllKQorICDCtyBmaXggZHVwbGljYXRlIGNhc2UgdmFsdWUgd2hlbiBjb21waWxpbmcgYWdhaW5zdCBtaW5ndy13NjQKKyAgICAoZmQubyAjNDczMjEsIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSkKKworRC1CdXMgMS41LjEwICgyMDEyLTAyLTIxKQorPT0KKworVGhlICJmaXJlIGluIERlbGVyaXVtIiByZWxlYXNlLgorCitPbiBVbml4IHBsYXRmb3JtcywgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUgKGFzIHNwZWNpZmllZCBpbiBQT1NJWCAyMDA4IEJhc2UKK2FuZCBTVVN2MikgaXMgbm93IHJlcXVpcmVkLgorCivigKIgRC1CdXMgU3BlY2lmaWNhdGlvbiAwLjE5OgorICDCtyBGb3JtYWxseSBkZWZpbmUgdW5pcXVlIGNvbm5lY3Rpb24gbmFtZXMgYW5kIHdlbGwta25vd24gYnVzIG5hbWVzLAorICAgIGFuZCBkb2N1bWVudCBiZXN0IHByYWN0aWNlcyBmb3IgaW50ZXJmYWNlLCBidXMsIG1lbWJlciBhbmQgZXJyb3IgbmFtZXMsCisgICAgYW5kIG9iamVjdCBwYXRocyAoZmQubyAjMzcwOTUsIFNpbW9uIE1jVml0dGllKQorICDCtyBEb2N1bWVudCB0aGUgc2VhcmNoIHBhdGggZm9yIHNlc3Npb24gYW5kIHN5c3RlbSBzZXJ2aWNlcyBvbiBVbml4LCBhbmQKKyAgICB3aGVyZSB0aGV5IHNob3VsZCBiZSBpbnN0YWxsZWQgYnkgYnVpbGQgc3lzdGVtcyAoZmQubyAjMjE2MjAsIGZkLm8gIzM1MzA2OworICAgIFNpbW9uIE1jVml0dGllKQorICDCtyBEb2N1bWVudCB0aGUgc3lzdGVtZCB0cmFuc3BvcnQgKGZkLm8gIzM1MjMyLCBMZW5uYXJ0IFBvZXR0ZXJpbmcpCisKK+KAoiBNYWtlIGRidXNfdGhyZWFkc19pbml0KCkgdXNlIHRoZSBzYW1lIGJ1aWx0LWluIHRocmVhZGluZyBpbXBsZW1lbnRhdGlvbgorICBhcyBkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0KCk7IHRoZSB1c2VyLXNwZWNpZmllZCBwcmltaXRpdmVzIHRoYXQgaXQKKyAgdGFrZXMgYXMgYSBwYXJhbWV0ZXIgYXJlIG5vdyBpZ25vcmVkIChmZC5vICM0Mzc0NCwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBBbGxvdyBhbGwgY29uZmlndXJlZCBhdXRoIG1lY2hhbmlzbXMsIG5vdCBqdXN0IG9uZSAoZmQubyAjNDUxMDYsCisgIFBhdmVsIFN0cmFzaGtpbikKKwor4oCiIEltcHJvdmUgY21ha2UgYnVpbGQgc3lzdGVtIChSYWxmIEhhYmFja2VyKToKKyAgwrcgc2ltcGxpZnkgWE1MIHBhcnNlciBkZXBlbmRlbmNpZXMgKGZkLm8gIzQxMDI3KQorICDCtyBnZW5lcmF0ZSBidWlsZCB0aW1lc3RhbXAgKGZkLm8gIzQxMDI5KQorICDCtyBvbmx5IGNyZWF0ZSBiYXRjaCBmaWxlcyBvbiBXaW5kb3dzCisgIMK3IGZpeCBvcHRpb24gYW5kIGNhY2hlIHN5bnRheAorICDCtyBhZGQgaGVscC1vcHRpb25zIHRhcmdldAorICDCtyBzaGFyZSBkYnVzLWFyY2gtZGVwcy5oLmluIHdpdGggYXV0b3Rvb2xzIHJhdGhlciB0aGFuIGhhdmluZyBvdXIKKyAgICBvd24gdmVyc2lvbiAoZmQubyAjNDEwMzMpCisKK+KAoiBCdWlsZCB0ZXN0cyBzdWNjZXNzZnVsbHkgd2l0aCBvbGRlciBHTGliLCBhcyBmb3VuZCBpbiBlLmcuIERlYmlhbiA2CisgIChmZC5vICM0MTIxOSwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBBdm9pZCB1c2Ugb2YgZGVwcmVjYXRlZCBHVGhyZWFkIEFQSSAoZmQubyAjNDQ0MTMsIE1hcnRpbiBQaXR0KQorCivigKIgQnVpbGQgZG9jdW1lbnRhdGlvbiBjb3JyZWN0bHkgaWYgbWFuMmh0bWwgZG9lc24ndCBzdXBwb3J0IGZpbGVuYW1lcyBvbgorICBpdHMgY29tbWFuZC1saW5lIChmZC5vICM0Mzg3NSwgSmFjayBOYWdlbCkKKwor4oCiIEltcHJvdmUgdGVzdCBjb3ZlcmFnZS4gVG8gZ2V0IGV2ZW4gbW9yZSBjb3ZlcmFnZSwgcnVuIHRoZSB0ZXN0cyB3aXRoCisgIERCVVNfVEVTVF9TTE9XPTEgKGZkLm8gIzM4Mjg1LCAjNDI4MTE7IFNpbW9uIE1jVml0dGllKQorCivigKIgUmVkdWNlIHRoZSBzaXplIG9mIHRoZSBzaGFyZWQgbGlicmFyeSBieSBtb3ZpbmcgZnVuY3Rpb25hbGl0eSBvbmx5IHVzZWQKKyAgYnkgZGJ1cy1kYWVtb24sIHRlc3RzIGV0Yy4gaW50byB0aGVpciBpbnRlcm5hbCBsaWJyYXJ5IGFuZCBkZWxldGluZworICB1bnVzZWQgY29kZSAoZmQubyAjMzQ5NzYsICMzOTc1OTsgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBBZGQgZGJ1cy1kYWVtb24gLS1ub3BpZGZpbGUgb3B0aW9uLCBvdmVycmlkaW5nIHRoZSBjb25maWd1cmF0aW9uLCBmb3IKKyAgc2V0dXBzIHdoZXJlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gbXVzdCBpbmNsdWRlIDxwaWRmaWxlLz4gdG8gYXZvaWQKKyAgYnJlYWtpbmcgdHJhZGl0aW9uYWwgaW5pdCwgYnV0IHRoZSBwaWQgZmlsZSBpcyBpbiBmYWN0IHVubmVjZXNzYXJ5OyB1c2UKKyAgaXQgdW5kZXIgc3lzdGVtZCB0byBpbXByb3ZlIHN0YXJ0dXAgdGltZSBhIGJpdCAoZmQubyAjNDU1MjAsCisgIExlbm5hcnQgUG9ldHRlcmluZykKKwor4oCiIE9wdGlvbmFsbHkgKGlmIGNvbmZpZ3VyZWQgLS13aXRoLXZhbGdyaW5kKSBhZGQgaW5zdHJ1bWVudGF0aW9uIHRvIGRlYnVnCisgIGxpYmRidXMgYW5kIGFzc29jaWF0ZWQgdG9vbHMgbW9yZSBtZWFuaW5nZnVsbHkgdW5kZXIgVmFsZ3JpbmQKKyAgKGZkLm8gIzM3Mjg2LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEltcHJvdmUgdGhlIGRidXMtc2VuZCgxKSBtYW4gcGFnZSAoZmQubyAjMTQwMDUsIFNpbW9uIE1jVml0dGllKQorCivigKIgTWFrZSBkYnVzLXByb3RvY29sLmggY29tcGF0aWJsZSB3aXRoIEMrKzExIChmZC5vICM0NjE0NywgTWFyYyBNdXR6KQorCivigKIgSWYgdGVzdHMgYXJlIGVuYWJsZWQgYW5kIERCVVNfTUFMTE9DX0NBTk5PVF9GQUlMIGlzIHNldCBpbiB0aGUgZW52aXJvbm1lbnQsCisgIGFib3J0IG9uIGZhaWx1cmUgdG8gbWFsbG9jKCkgKGxpa2UgR0xpYiBkb2VzKSwgdG8gdHVybiBydW5hd2F5IG1lbW9yeSBsZWFrcworICBpbnRvIGEgZGVidWdnYWJsZSBjb3JlLWR1bXAgaWYgYSByZXNvdXJjZSBsaW1pdCBpcyBhcHBsaWVkIChmZC5vICM0MTA0OCwKKyAgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBEb24ndCBjcmFzaCBpZiByZWFsbG9jKCkgcmV0dXJucyBOVUxMIGluIGEgZGVidWcgYnVpbGQgKGZkLm8gIzQxMDQ4LAorICBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFVuaXgtc3BlY2lmaWM6CisgIMK3IFJlcGxhY2Ugb3VyIGJyb2tlbiByZWltcGxlbWVudGF0aW9uIG9mIHJlY3Vyc2l2ZSBtdXRleGVzLCB3aGljaCBoYXMKKyAgICBiZWVuIGJyb2tlbiBzaW5jZSAyMDA2LCB3aXRoIGFuIG9yZGluYXJ5IHB0aHJlYWRzIHJlY3Vyc2l2ZSBtdXRleAorICAgIChmZC5vICM0Mzc0NDsgU2lnbXVuZCBBdWdkYWwsIFNpbW9uIE1jVml0dGllKQorICDCtyBVc2UgZXBvbGwoNykgZm9yIGEgbW9yZSBlZmZpY2llbnQgbWFpbiBsb29wIGluIExpbnV4OyBlcXVpdmFsZW50IHBhdGNoZXMKKyAgICB3ZWxjb21lZCBmb3Igb3RoZXIgT1NzJyBlcXVpdmFsZW50cyBsaWtlIGtxdWV1ZSwgL2Rldi9wb2xsLCBvciBTb2xhcmlzCisgICAgZXZlbnQgcG9ydHMgKGZkLm8gIzMzMzM3OyBTaW1vbiBNY1ZpdHRpZSwgUmFsZiBIYWJhY2tlcikKKyAgwrcgV2hlbiBydW5uaW5nIHVuZGVyIHN5c3RlbWQsIHVzZSBpdCBpbnN0ZWFkIG9mIENvbnNvbGVLaXQgdG8gY2hlY2sKKyAgICB3aGV0aGVyIHRvIGFwcGx5IGF0X2NvbnNvbGUgcG9saWNpZXMgKGZkLm8gIzM5NjA5LCBMZW5uYXJ0IFBvZXR0ZXJpbmcpCisgIMK3IEF2b2lkIGEgaGlnaGx5IHVubGlrZWx5IGZkIGxlYWsgKGZkLm8gIzI5ODgxLCBTaW1vbiBNY1ZpdHRpZSkKKyAgwrcgRG9uJ3QgY2xvc2UgaW52YWxpZCBmZCAtMSBpZiBnZXRhZGRyaW5mbyBmYWlscyAoZmQubyAjMzcyNTgsIGVYZUMwMDFlcikKK8KgIMK3IERvbid0IHRvdWNoIH4vLmRidXMgYW5kIH4vLmRidXMta2V5cmluZ3Mgd2hlbiBydW5uaW5nICdtYWtlIGluc3RhbGxjaGVjaycKKyAgICAoZmQubyAjNDEyMTgsIFNpbW9uIE1jVml0dGllKQorICDCtyBTdG9wIHByZXRlbmRpbmcgd2UgcmVzcGVjdCBYREdfREFUQV9ESVJTIGZvciBzeXN0ZW0gc2VydmljZXM6IHRoZSBsYXVuY2gKKyAgICBoZWxwZXIgZG9lc24ndCBvYmV5IGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBhdm9pZCBwcml2aWxlZ2UgZXNjYWxhdGlvbgorICAgIGF0dGFja3MsIHNvIG1ha2UgdGhlIHN5c3RlbSBidXMgZm9sbG93IHRoZSBzYW1lIHJ1bGVzCisgICAgKGZkLm8gIzIxNjIwLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFdpbmRvd3Mtc3BlY2lmaWM6CisgIMK3IEZpbmQgdGhlIGRidXMtZGFlbW9uIGV4ZWN1dGFibGUgbmV4dCB0byB0aGUgc2hhcmVkIGxpYnJhcnkgKGZkLm8gIzQxNTU4OworICAgIEplc3BlciBEYW0sIFJhbGYgSGFiYWNrZXIpCisgIMK3IFJlbW92ZSB0aGUgZmF1bHR5IGltcGxlbWVudGF0aW9uIG9mIF9kYnVzX2NvbmR2YXJfd2FrZV9hbGwgKGZkLm8gIzQ0NjA5LAorICAgIFNpbW9uIE1jVml0dGllKQorCitELUJ1cyAxLjUuOCAoMjAxMS0wOS0yMSkKKz09CisKK1RoZSAiY3Jvc3MtbWV0ZXJpbmciIHJlbGVhc2UuCisKK0luIGFkZGl0aW9uIHRvIGRlYWQgY29kZSByZW1vdmFsIGFuZCByZWZhY3RvcmluZywgdGhpcyByZWxlYXNlIGNvbnRhaW5zIGFsbAorb2YgdGhlIGJ1Z2ZpeGVzIGZyb20gMS40LjE2LgorCivigKIgQ2xlYW4gdXAgZGVhZCBjb2RlLCBhbmQgbWFrZSBtb3JlIHdhcm5pbmdzIGZhdGFsIGluIGRldmVsb3BtZW50IGJ1aWxkcworICAoZmQubyAjMzkyMzEsIGZkLm8gIzQxMDEyOyBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIElmIGZ1bGwgdGVzdCBjb3ZlcmFnZSBpcyByZXF1ZXN0ZWQgdmlhIC0tZW5hYmxlLXRlc3RzLCBzdHJpY3RseSByZXF1aXJlCisgIFB5dGhvbiwgcHlnb2JqZWN0IGFuZCBkYnVzLXB5dGhvbiwgd2hpY2ggYXJlIHJlcXVpcmVkIGJ5IHNvbWUgdGVzdHM7IGlmIG5vdCwKKyAgYW5kIFB5dGhvbiBpcyBtaXNzaW5nLCBza2lwIHRob3NlIHRlc3RzIHJhdGhlciB0aGFuIGZhaWxpbmcKKyAgKGZkLm8gIzM3ODQ3LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFdoZW4gdXNpbmcgY21ha2UsIHByb3ZpZGUgdGhlIHNhbWUgdmVyc2lvbi1pbmZvIEFQSSBpbiB0aGUgaW5zdGFsbGVkIGhlYWRlcnMKKyAgYXMgZm9yIGF1dG90b29scyAoREJVU19WRVJTSU9OLCBldGMuKSAoZmQubyAjNDA5MDUsIFJhbGYgSGFiYWNrZXIpCisKK+KAoiBBZGQgYSByZWdyZXNzaW9uIHRlc3QgZm9yIGZkLm8gIzM4MDA1IChmZC5vICMzOTgzNiwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBNYWtlICJOT0NPTkZJR1VSRT0xIC4vYXV0b2dlbi5zaCIgbm90IHJ1biBjb25maWd1cmUgKENvbGluIFdhbHRlcnMpCisKK+KAoiBBZGQgX0RCVVNfU1RBVElDX0FTU0VSVCBhbmQgdXNlIGl0IHRvIGNoZWNrIGludmFyaWFudHMgKGZkLm8gIzM5NjM2LAorICBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEZpeCBkdXBsaWNhdGVzIGluIGF1dGhvcnMgbGlzdCAoUmFsZiBIYWJhY2tlcikKKwor4oCiIEZpeCBicm9rZW4gbGlua3MgZnJvbSBkYnVzLXR1dG9yaWFsLmh0bWwgaWYgJChodG1sZGlyKSAhPSAkKGRvY2RpcikKKyAgKGZkLm8gIzM5ODc5LCBDaHJpcyBNYXlvKQorCivigKIgRml4IGEgc21hbGwgbWVtb3J5IGxlYWssIGFuZCBhIGZhaWx1cmUgdG8gcmVwb3J0IGVycm9ycywgd2hlbiB1cGRhdGluZworICBhIHNlcnZpY2UgZmlsZSBlbnRyeSBmb3IgYWN0aXZhdGlvbiAoZmQubyAjMzkyMzAsIFNpbW9uIE1jVml0dGllKQorCivigKIgVW5peC1zcGVjaWZpYzoKKyAgwrcgQ2xlYW4gdXAgKG5vbi1hYnN0cmFjdCkgVW5peCBzb2NrZXRzIG9uIGJ1cyBkYWVtb24gZXhpdCAoZmQubyAjMzg2NTY7CisgICAgQnJpYW4gQ2FtZXJvbiwgU2ltb24gTWNWaXR0aWUpCisgIMK3IE9uIHN5c3RlbXMgdGhhdCB1c2UgbGliY2FwLW5nIGJ1dCBub3Qgc3lzdGVtZCwgZHJvcCBzdXBwbGVtZW50YWwgZ3JvdXBzCisgICAgd2hlbiBzd2l0Y2hpbmcgdG8gdGhlIGRhZW1vbiB1c2VyIChSZWQgSGF0ICM3MjY5NTMsIFN0ZXZlIEdydWJiKQorICDCtyBNYWtlIHRoZSBjbWFrZSBidWlsZCB3b3JrIGFnYWluIG9uIEdOVSBwbGF0Zm9ybXMgKGZkLm8gIzI5MjI4LAorICAgIFNpbW9uIE1jVml0dGllKQorICDCtyBGaXggY29tcGlsYXRpb24gb24gbm9uLUM5OSBzeXN0ZW1zIHRoYXQgaGF2ZSBpbnR0eXBlcy5oIGJ1dCBub3Qgc3RkaW50LmgsCisgICAgbGlrZSBTb2xhcmlzIChmZC5vICM0MDMxMywgRGFnb2JlcnQgTWljaGVsc2VuKQorICDCtyBEZWZpbmUgQ01TR19BTElHTiwgQ01TR19MRU4sIENNU0dfU1BBQ0Ugb24gU29sYXJpcyA8IDEwCisgICAgKGZkLm8gIzQwMjM1LCBTaW1vbiBNY1ZpdHRpZSkKKyAgwrcgQ29wZSB3aXRoIFVuaXhlcyB0aGF0IGRvbid0IGhhdmUgTE9HX1BFUlJPUiwgbGlrZSBTb2xhcmlzIDEwCisgICAgKGZkLm8gIzM5OTg3LCBTaW1vbiBNY1ZpdHRpZSkKKyAgwrcgQ29wZSB3aXRoIHBsYXRmb3JtcyB3aG9zZSB2c25wcmludGYgdmlvbGF0ZXMgYm90aCBQT1NJWCBhbmQgQzk5LCBsaWtlCisgICAgVHJ1NjQsIElSSVggYW5kIEhQLVVYIChmZC5vICMxMTY2OCwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBXaW5kb3dzLXNwZWNpZmljOgorICDCtyBGaXggY29tcGlsYXRpb24gb24gTVNWQywgd2hpY2ggZG9lc24ndCB1bmRlcnN0YW5kICJpbmxpbmUiIHdpdGggaXRzCisgICAgQzk5IG1lYW5pbmcgKGZkLm8gIzQwMDAwOyBSYWxmIEhhYmFja2VyLCBTaW1vbiBNY1ZpdHRpZSkKKyAgwrcgRml4IG1pc3VzZSBvZiBHUGlkIGluIHRlc3QvZGJ1cy1kYWVtb24uYyAoZmQubyAjNDAwMDMsIFNpbW9uIE1jVml0dGllKQorICDCtyBGaXggY3Jvc3MtY29tcGlsYXRpb24gdG8gV2luZG93cyB3aXRoIEF1dG9tYWtlIChmZC5vICM0MDAwMywgU2ltb24gTWNWaXR0aWUpCisKK0QtQnVzIDEuNS42ICgyMDExLTA3LTI5KQorPT0KKworVGhlICJ3ZWlyZCwgZ3JhdnktbGlrZSBhZnRlcnRhc3RlIiByZWxlYXNlLgorCitJbiBhZGRpdGlvbiB0byBuZXcgZmVhdHVyZXMgYW5kIHJlZmFjdG9yaW5nLCB0aGlzIHJlbGVhc2UgY29udGFpbnMgYWxsIG9mIHRoZQorYnVnZml4ZXMgZnJvbSAxLjQuMTQuCisKK1BvdGVudGlhbGx5IGluY29tcGF0aWJsZSAoQnVzdGxlIGFuZCBzaW1pbGFyIGRlYnVnZ2luZyB0b29scyB3aWxsIG5lZWQKK2NoYW5nZXMgdG8gd29yayBhcyBpbnRlbmRlZCk6CisKK+KAoiBEbyBub3QgYWxsb3cgbWF0Y2ggcnVsZXMgdG8gImVhdmVzZHJvcCIgKHJlY2VpdmUgbWVzc2FnZXMgaW50ZW5kZWQgZm9yIGEKKyAgZGlmZmVyZW50IHJlY2lwaWVudCkgYnkgbWlzdGFrZTogZWF2ZXNkcm9wcGVycyBtdXN0IG5vdyBvcHQtaW4gdG8gdGhpcworICBiZWhhdmlvdXIgYnkgcHV0dGluZyAiZWF2ZXNkcm9wPSd0cnVlJyIgaW4gdGhlIG1hdGNoIHJ1bGUsIHdoaWNoIHdpbGwKKyAgbm90IGhhdmUgYW55IHByYWN0aWNhbCBlZmZlY3Qgb24gYnVzZXMgd2hlcmUgZWF2ZXNkcm9wcGluZyBpcyBub3QgYWxsb3dlZAorICAoZmQubyAjMzc4OTAsIENvc2ltbyBBbGZhcmFubykKKworT3RoZXIgY2hhbmdlczoKKwor4oCiIEQtQnVzIFNwZWNpZmljYXRpb24gdmVyc2lvbiAwLjE4IChmZC5vICMzNzg5MCwgZmQubyAjMzk0NTAsIGZkLm8gIzM4MjUyOworICBDb3NpbW8gQWxmYXJhbm8sIFNpbW9uIE1jVml0dGllKQorICDCtyBhZGQgdGhlICJlYXZlc2Ryb3AiIGtleXdvcmQgdG8gbWF0Y2ggcnVsZXMKKyAgwrcgZGVmaW5lIGVhdmVzZHJvcHBpbmcsIHVuaWNhc3QgbWVzc2FnZXMgYW5kIGJyb2FkY2FzdCBtZXNzYWdlcworICDCtyBzdG9wIGNsYWltaW5nIHRoYXQgbWF0Y2ggcnVsZXMgYXJlIG5lZWRlZCB0byBtYXRjaCB1bmljYXN0IG1lc3NhZ2VzIHRvIHlvdQorICDCtyBwcm9tb3RlIHRoZSB0eXBlIHN5c3RlbSB0byBiZSBhIHRvcC1sZXZlbCBzZWN0aW9uCisKK+KAoiBVc2UgREJVU19FUlJPUl9PQkpFQ1RfUEFUSF9JTl9VU0UgaWYgZGJ1c19jb25uZWN0aW9uX3RyeV9yZWdpc3Rlcl9vYmplY3RfcGF0aAorICBvciBkYnVzX2Nvbm5lY3Rpb25fdHJ5X3JlZ2lzdGVyX2ZhbGxiYWNrIGZhaWxzLCBub3QgLi4uQUREUkVTU19JTl9VU0UsCisgIGFuZCBzaW1wbGlmeSBvYmplY3QtcGF0aCByZWdpc3RyYXRpb24gKGZkLm8gIzM4ODc0LCBKacWZw60gS2xpbWXFoSkKKwor4oCiIENvbnNpc3RlbnRseSB1c2UgYXRvbWljIG9wZXJhdGlvbnMgb24gZXZlcnl0aGluZyB0aGF0IGlzIGV2ZXIgbWFuaXB1bGF0ZWQKKyAgdmlhIGF0b21pYyBvcHMsIGFzIHdhcyBkb25lIGZvciBjaGFuZ2VzIHRvIERCdXNDb25uZWN0aW9uJ3MgcmVmY291bnQgaW4KKyAgMS40LjEyIChmZC5vICMzODAwNSwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBGaXggYSBmaWxlIGRlc2NyaXB0b3IgbGVhayB3aGVuIGNvbm5lY3RpbmcgdG8gYSBUQ1Agc29ja2V0IChmZC5vICMzNzI1OCwKKyAgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBNYWtlICJtYWtlIGNoZWNrIiBpbiBhIGNsZWFuIHRyZWUgd29yaywgYnkgbm90IHJ1bm5pbmcgdGVzdHMgdW50aWwKKyAgdGVzdCBkYXRhIGhhcyBiZWVuIHNldCB1cCAoZmQubyAjMzQ0MDUsIFNpbW9uIE1jVml0dGllKQorCivigKIgVGhlIGRidXMtZGFlbW9uIG5vIGxvbmdlciBidXN5LWxvb3BzIGlmIGl0IGhhcyBhIHZlcnkgbGFyZ2UgbnVtYmVyIG9mIGZpbGUKKyAgZGVzY3JpcHRvcnMgKGZkLm8gIzIzMTk0LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFJlZmFjdG9yIG1lc3NhZ2UgZmxvdyB0aHJvdWdoIGRpc3BhdGNoaW5nIHRvIGF2b2lkIGxvY2tpbmcgdmlvbGF0aW9ucyBpZgorICB0aGUgYnVzIGRhZW1vbidzIG1lc3NhZ2UgbGltaXQgaXMgaGl0OyByZW1vdmUgdGhlIHBlci1jb25uZWN0aW9uIGxpbmsgY2FjaGUsCisgIHdoaWNoIHdhcyBtZWFudCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLCBidXQgbm93IHJlZHVjZXMgaXQgKGZkLm8gIzM0MzkzLAorICBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFNvbWUgY21ha2UgZml4ZXMgKFJhbGYgSGFiYWNrZXIpCisKK+KAoiBSZW1vdmUgZGVhZCBjb2RlLCBtYWlubHkgZnJvbSBEQnVzU3RyaW5nIChmZC5vICMzODU3MCwgZmQubyAjMzk2MTA7CisgIFNpbW9uIE1jVml0dGllLCBMZW5uYXJ0IFBvZXR0ZXJpbmcpCisKK+KAoiBTdG9wIHN0b3JpbmcgdHdvIGV4dHJhIGJ5dGUgb3JkZXIgaW5kaWNhdG9ycyBpbiBlYWNoIEQtQnVzIG1lc3NhZ2UKKyAgKGZkLm8gIzM4Mjg3LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEFkZCBhbiBvcHRpb25hbCBTdGF0cyBpbnRlcmZhY2Ugd2hpY2ggY2FuIGJlIHVzZWQgdG8gZ2V0IHN0YXRpc3RpY3MgZnJvbQorICBhIHJ1bm5pbmcgZGJ1cy1kYWVtb24gaWYgZW5hYmxlZCBhdCBjb25maWd1cmUgdGltZSB3aXRoIC0tZW5hYmxlLXN0YXRzCisgIChmZC5vICMzNDA0MCwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBGaXggdmFyaW91cyB0eXBvcyAoZmQubyAjMjcyMjcsIGZkLm8gIzM4Mjg0OyBTYXNjaGEgU2lsYmUsIFNpbW9uIE1jVml0dGllKQorCivigKIgRG9jdW1lbnRhdGlvbiAoZmQubyAjMzYxNTYsIFNpbW9uIE1jVml0dGllKToKKyAgwrcgbGV0IHhzbHRwcm9jIGJlIG92ZXJyaWRkZW4gYXMgdXN1YWw6IC4vY29uZmlndXJlIFhTTFRQUk9DPW15eHNsdHByb2MKKyAgwrcgaW5zdGFsbCBtb3JlIGRvY3VtZW50YXRpb24gYXV0b21hdGljYWxseSwgaW5jbHVkaW5nIG1hbjJodG1sIG91dHB1dAorICDCtyBwdXQgZGJ1cy5kZXZoZWxwIGluIHRoZSByaWdodCBwbGFjZSAoaXQgbXVzdCBnbyBpbiAke2h0bWxkaXJ9KQorCivigKIgVW5peC1zcGVjaWZpYzoKKyAgwrcgbG9vayBmb3Igc3lzdGVtIHNlcnZpY2VzIGluIC9saWIvZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlcyBpbiBhZGRpdGlvbiB0byBhbGwKKyAgICB0aGUgb3RoZXIgd2VsbC1rbm93biBsb2NhdGlvbnM7IG5vdGUgdGhhdCB0aGlzIHNob3VsZCBhbHdheXMgYmUgL2xpYiwKKyAgICBldmVuIG9uIHBsYXRmb3JtcyB3aGVyZSBzaGFyZWQgbGlicmFyaWVzIG9uIHRoZSByb290IEZTIHdvdWxkIGdvIGluIC9saWI2NCwKKyAgICAvbGliL3g4Nl82NC1saW51eC1nbnUgb3Igc2ltaWxhciAoZmQubyAjMzUyMjksIExlbm5hcnQgUG9ldHRlcmluZykKKyAgwrcgb3B0LWluIHRvIGZkIHBhc3Npbmcgb24gU29sYXJpcyAoZmQubyAjMzM0NjUsIFNpbW9uIE1jVml0dGllKQorCivigKIgV2luZG93cy1zcGVjaWZpYyAoUmFsZiBIYWJhY2tlcik6CisgIMK3IGZpeCB1c2Ugb2YgYSBtdXRleCBmb3IgYXV0b2xhdW5jaCBzZXJ2ZXIgZGV0ZWN0aW9uCisgIMK3IGRvbid0IGNyYXNoIG9uIG1hbGxvYyBmYWlsdXJlIGluIF9kYnVzX3ByaW50Zl9zdHJpbmdfdXBwZXJfYm91bmQKKworRC1CdXMgMS41LjQgKDIwMTEtMDYtMTApCis9PQorCitTZWN1cml0eSAobG9jYWwgZGVuaWFsIG9mIHNlcnZpY2UpOgorCivigKIgQnl0ZS1zd2FwIGZvcmVpZ24tZW5kaWFuIG1lc3NhZ2VzIGNvcnJlY3RseSwgcHJldmVudGluZyBhIGxvbmctc3RhbmRpbmcKKyAgbG9jYWwgRG9TIGlmIGZvcmVpZ24tZW5kaWFuIG1lc3NhZ2VzIGFyZSByZWxheWVkIHRocm91Z2ggdGhlIGRidXMtZGFlbW9uCisgIChiYWNrcG9ydGVyczogdGhpcyBpcyBnaXQgY29tbWl0IGMzMjIzYmE2YzQwMWJhODFkZjEzMDU4NTEzMTJhNDdjNDg1ZTZjZDcpCisgIChDVkUtMjAxMS0yMjAwLCBmZC5vICMzODEyMCwgRGViaWFuICM2Mjk5Mzg7IFNpbW9uIE1jVml0dGllKQorCitOZXcgdGhpbmdzOgorCivigKIgVGhlIGNvbnN0YW50IHRvIHVzZSBmb3IgYW4gaW5maW5pdGUgdGltZW91dCBub3cgaGFzIGEgbmFtZSwKKyAgREJVU19USU1FT1VUX0lORklOSVRFLiBJdCBpcyBudW1lcmljYWxseSBlcXVpdmFsZW50IHRvIDB4N2ZmZmZmZmYgKElOVDMyX01BWCkKKyAgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHNvdXJjZSBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgbGliZGJ1cy4KKwor4oCiIElmIEdMaWIgYW5kIERCdXMtR0xpYiBhcmUgYWxyZWFkeSBpbnN0YWxsZWQsIG1vcmUgdGVzdHMgd2lsbCBiZSBidWlsdCwKKyAgcHJvdmlkaW5nIGJldHRlciBjb3ZlcmFnZS4gVGhlIG5ldyB0ZXN0cyBjYW4gYWxzbyBiZSBpbnN0YWxsZWQgdmlhCisgICAgICAuL2NvbmZpZ3VyZSAtLWVuYWJsZS1pbnN0YWxsZWQtdGVzdHMKKyAgZm9yIHN5c3RlbSBpbnRlZ3JhdGlvbiB0ZXN0aW5nLCBpZiByZXF1aXJlZC4gKGZkLm8gIzM0NTcwLCBTaW1vbiBNY1ZpdHRpZSkKKworQ2hhbmdlczoKKwor4oCiIENvbnNpc3RlbnRseSB1c2UgYXRvbWljIG9wZXJhdGlvbnMgZm9yIHRoZSBEQnVzQ29ubmVjdGlvbidzIHJlZmNvdW50LAorICBmaXhpbmcgcG90ZW50aWFsIHRocmVhZGluZyBwcm9ibGVtcyAoZmQubyAjMzgwMDUsIFNpbW9uIE1jVml0dGllKQorCivigKIgRG9uJ3QgdXNlIC1XbCwtLWdjLXNlY3Rpb25zIGJ5IGRlZmF1bHQ6IGluIHByYWN0aWNlIHRoZSBzaXplIGRlY3JlYXNlIGlzCisgIHNtYWxsICgzMDBLaUIgb24geDg2LTY0KSBhbmQgaXQgZnJlcXVlbnRseSBkb2Vzbid0IHdvcmsgaW4gdW51c3VhbAorICB0b29sY2hhaW5zLiBUbyBvcHRpbWl6ZSBmb3IgbWluaW11bSBpbnN0YWxsZWQgc2l6ZSwgeW91IHNob3VsZCBiZW5jaG1hcmsKKyAgdmFyaW91cyBwb3NzaWJpbGl0aWVzIGZvciBDRkxBR1MgYW5kIExERkxBR1MsIGFuZCBzZXQgdGhlIGJlc3QgZmxhZ3MgZm9yCisgIHlvdXIgcGFydGljdWxhciB0b29sY2hhaW4gYXQgY29uZmlndXJlIHRpbWUuIChmZC5vICMzMzQ2NiwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBVc2UgIyEvYmluL3NoIGZvciBydW4td2l0aC10bXAtc2Vzc2lvbi1idXMuc2gsIG1ha2luZyBpdCB3b3JrIG9uICpCU0QKKyAgKGZkLm8gIzM1ODgwLCBUaW1vdGh5IFJlZGFlbGxpKQorCivigKIgVXNlIGxuIC1mcyB0byBzZXQgdXAgZGJ1cyBmb3Igc3lzdGVtZCwgd2hpY2ggc2hvdWxkIGZpeCByZWluc3RhbGxhdGlvbgorICB3aGVuIG5vdCB1c2luZyBhIERFU1RESVIgKGZkLm8gIzM3ODcwLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFdpbmRvd3Mtc3BlY2lmaWMgY2hhbmdlczoKKyAgwrcgZG9uJ3QgdHJ5IHRvIGJ1aWxkIGRidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXIgKGZkLm8gIzM3ODM4LCBNYXJrIEJyYW5kKQorCitELUJ1cyAxLjUuMiAoMjAxMS0wNi0wMSkKKz09CisKK1RoZSAiQm9hciBIdW50ZXIiIHJlbGVhc2UuCisKK05vdGVzIGZvciBkaXN0cmlidXRvcnM6CisKKyAgVGhpcyB2ZXJzaW9uIG9mIEQtQnVzIG5vIGxvbmdlciB1c2VzIC1mUElFIGJ5IGRlZmF1bHQuIERpc3RyaWJ1dGlvbnMgd2lzaGluZworICB0byBoYXJkZW4gdGhlIGRidXMtZGFlbW9uIGFuZCBkYnVzLWxhdW5jaC1oZWxwZXIgY2FuIHJlLWVuYWJsZSB0aGlzIGlmIHRoZWlyCisgIHRvb2xjaGFpbiBzdXBwb3J0cyBpdCByZWxpYWJseSwgdmlhIHNvbWV0aGluZyBsaWtlOgorCisgICAgLi9jb25maWd1cmUgQ0ZMQUdTPS1mUElFIExERkxBR1M9Ii1waWUgLVdsLC16LHJlbHJvIgorCisgIG9yIGJ5IHVzaW5nIGRpc3RyaWJ1dGlvbi1zcGVjaWZpYyB3cmFwcGVycyBzdWNoIGFzIERlYmlhbidzIGhhcmRlbmluZy13cmFwcGVyLgorCitDaGFuZ2VzOgorCisgIOKAoiBELUJ1cyBTcGVjaWZpY2F0aW9uIHYwLjE3CisgICAgwrcgUmVzZXJ2ZSB0aGUgZXh0cmEgY2hhcmFjdGVycyB1c2VkIGluIHNpZ25hdHVyZXMgYnkgR1ZhcmlhbnQKKyAgICAgIChmZC5vICMzNDUyOSwgU2ltb24gTWNWaXR0aWUpCisgICAgwrcgRGVmaW5lIHRoZSBPYmplY3RNYW5hZ2VyIGludGVyZmFjZSAoZmQubyAjMzQ4NjksIERhdmlkIFpldXRoZW4pCisgIOKAoiBEb24ndCBmb3JjZSAtZlBJRTogZGlzdHJpYnV0aW9ucyBhbmQgbGlidG9vbCBrbm93IGJldHRlciB0aGFuIHdlIGRvIHdoZXRoZXIKKyAgICBpdCdzIGRlc2lyYWJsZSAoZmQubyAjMTY2MjEsIGZkLm8gIzI3MjE1OyBTaW1vbiBNY1ZpdHRpZSkKKyAg4oCiIEFsbG93IC0tZGlzYWJsZS1nYy1zZWN0aW9ucywgaW4gY2FzZSB5b3VyIHRvb2xjaGFpbiBvZmZlcnMgdGhlCisgICAgLWZmdW5jdGlvbi1zZWN0aW9ucywgLWZkYXRhLXNlY3Rpb25zIGFuZCAtV2wsLS1nYy1zZWN0aW9ucyBvcHRpb25zCisgICAgYnV0IHRoZXkncmUgYnJva2VuLCBhcyBzZWVuIG9uIFNvbGFyaXMgKGZkLm8gIzMzNDY2LCBTaW1vbiBNY1ZpdHRpZSkKKyAg4oCiIEluc3RhbGwgZGJ1cy1kYWVtb24gYW5kIGRidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXIgaW4gYSBtb3JlIG5vcm1hbCB3YXkKKyAgICAoZmQubyAjMTQ1MTI7IFNpbW9uIE1jVml0dGllLCBsb29zZWx5IGJhc2VkIG9uIGEgcGF0Y2ggZnJvbSBMdWNhIEJhcmJhdG8pCisgIOKAoiBFbnN1cmUgdGhhdCBtYWludGFpbmVycyB1cGxvYWQgZG9jdW1lbnRhdGlvbiB3aXRoIHRoZSByaWdodCBwZXJtaXNzaW9ucworICAgIChmZC5vICMzNjEzMCwgU2ltb24gTWNWaXR0aWUpCisgIOKAoiBEb24ndCBmb3JjZSB1c2VycyBvZiBsaWJkYnVzIHRvIGJlIGxpbmtlZCBhZ2FpbnN0IC1scHRocmVhZCwgLWxydAorICAgIChmZC5vICMzMjgyNywgU2ltb24gTWNWaXR0aWUpCisgIOKAoiBMb2cgc3lzdGVtLWJ1cyBhY3RpdmF0aW9uIGluZm9ybWF0aW9uIHRvIHN5c2xvZyAoZmQubyAjMzU3MDUsCisgICAgQ29saW4gV2FsdGVycykKKyAg4oCiIExvZyBtZXNzYWdlcyBkcm9wcGVkIGR1ZSB0byBxdW90YXMgdG8gc3lzbG9nIChmZC5vICMzNTM1OCwKKyAgICBTaW1vbiBNY1ZpdHRpZSkKKyAg4oCiIE1ha2UgdGhlIG5vbmNlLXRjcCB0cmFuc3BvcnQgd29yayBvbiBVbml4IChmZC5vICMzNDU2OSwgU2ltb24gTWNWaXR0aWUpCisgIOKAoiBPbiBVbml4LCBpZiAvdmFyL2xpYi9kYnVzL21hY2hpbmUtaWQgY2Fubm90IGJlIHJlYWQsIHRyeSAvZXRjL21hY2hpbmUtaWQKKyAgICAoZmQubyAjMzUyMjgsIExlbm5hcnQgUG9ldHRlcmluZykKKyAg4oCiIEluIHRoZSByZWdyZXNzaW9uIHRlc3RzLCBkb24ndCByZXBvcnQgZmRzIGFzICJsZWFrZWQiIGlmIHRoZXkgd2VyZSBvcGVuCisgICAgb24gc3RhcnR1cCAoZmQubyAjMzUxNzMsIFNpbW9uIE1jVml0dGllKQorICDigKIgTWFrZSBkYnVzLW1vbml0b3IgYmFpbCBvdXQgaWYgYXNrZWQgdG8gbW9uaXRvciBtb3JlIHRoYW4gb25lIGJ1cywKKyAgICByYXRoZXIgdGhhbiBzaWxlbnRseSB1c2luZyB0aGUgbGFzdCBvbmUgKGZkLm8gIzI2NTQ4LCBXaWxsIFRob21wc29uKQorICDigKIgQ2xhcmlmeSBkb2N1bWVudGF0aW9uIChmZC5vICMzNTE4MiwgU2ltb24gTWNWaXR0aWUpCisgIOKAoiBDbGVhbiB1cCBtaW5vciBkZWFkIGNvZGUgYW5kIHNvbWUgaW5jb3JyZWN0IGVycm9yIGhhbmRsaW5nCisgICAgKGZkLm8gIzMzMTI4LCBmZC5vICMyOTg4MTsgU2ltb24gTWNWaXR0aWUpCisgIOKAoiBDaGVjayB0aGF0IGNvbXBpbGVyIG9wdGlvbnMgYXJlIHN1cHBvcnRlZCBiZWZvcmUgdXNpbmcgdGhlbSAoZmQubyAjMTk2ODEsCisgICAgU2ltb24gTWNWaXR0aWUpCisgIOKAoiBXaW5kb3dzOgorICAgIOKAoiBSZW1vdmUgb2Jzb2xldGUgd29ya2Fyb3VuZCBmb3Igd2luaW9jdGwuaCAoZmQubyAjMzUwODMsIFJhbGYgSGFiYWNrZXIpCisKK0QtQnVzIDEuNS4wICgyMDExLTA0LTExKQorPT0KKworVGhlICJ5b3UgbmV2ZXIga25vdyB3aGVuIHlvdSBuZWVkIHRvIHRvdyBzb21ldGhpbmcgZnJvbSB5b3VyIGdpYW50CitmbHlpbmcgc2hhcmsiIHJlbGVhc2UuCisKKyAg4oCiIEQtQnVzIFNwZWNpZmljYXRpb24gdjAuMTYKKyAgICDCtyBBZGQgc3VwcG9ydCBmb3IgcGF0aF9uYW1lc3BhY2UgYW5kIGFyZzBuYW1lc3BhY2UgaW4gbWF0Y2ggcnVsZXMKKyAgICAgIChmZC5vICMyNDMxNywgIzM0ODcwOyBXaWxsIFRob21wc29uLCBEYXZpZCBaZXV0aGVuLCBTaW1vbiBNY1ZpdHRpZSkKKyAgICDCtyBNYWtlIGFyZ05wYXRoIHN1cHBvcnQgb2JqZWN0IHBhdGhzLCBub3QganVzdCBvYmplY3QtcGF0aC1saWtlIHN0cmluZ3MsCisgICAgICBhbmQgZG9jdW1lbnQgaXQgYmV0dGVyIChmZC5vICMzMTgxOCwgV2lsbCBUaG9tcHNvbikKKyAg4oCiIExldCB0aGUgYnVzIGRhZW1vbiBpbXBsZW1lbnQgbW9yZSB0aGFuIG9uZSBpbnRlcmZhY2UgKGZkLm8gIzMzNzU3LAorICAgIFNpbW9uIE1jVml0dGllKQorICDigKIgT3B0aW1pemUgX2RidXNfc3RyaW5nX3JlcGxhY2VfbGVuIHRvIHJlZHVjZSB3YXN0ZSAoZmQubyAjMjEyNjEsCisgICAgUm9iZXJ0byBHdWlkbykKKyAg4oCiIFJlcXVpcmUgdXNlciBpbnRlcnZlbnRpb24gdG8gY29tcGlsZSB3aXRoIG1pc3NpbmcgNjQtYml0IHN1cHBvcnQKKyAgICAoZmQubyAjMzUxMTQsIFNpbW9uIE1jVml0dGllKQorICDigKIgQWRkIGRidXNfdHlwZV9pc192YWxpZCBhcyBwdWJsaWMgQVBJIChmZC5vICMyMDQ5NiwgU2ltb24gTWNWaXR0aWUpCisgIOKAoiBSYWlzZSBVbmtub3duT2JqZWN0IGluc3RlYWQgb2YgVW5rbm93bk1ldGhvZCBmb3IgY2FsbHMgdG8gbWV0aG9kcyBvbgorICAgIHBhdGhzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBvYmplY3QgdHJlZSwgYW5kIFVua25vd25JbnRlcmZhY2UgZm9yIGNhbGxzCisgICAgdG8gdW5rbm93biBpbnRlcmZhY2VzIGluIHRoZSBidXMgZGFlbW9uIChmZC5vICMzNDUyNywgTGVubmFydCBQb2V0dGVyaW5nKQorCitELUJ1cyAxLjQuOCAoMjAxMS0wNC0wOCkKKz09CisKK1RoZSAiSXQncyBsaWtlIHRoZSBiZWdpbm5pbmcgb2YgYSBsb2JzdGVyIiByZWxlYXNlLgorCisgIOKAoiBSZW5hbWUgY29uZmlndXJlLmluIHRvIGNvbmZpZ3VyZS5hYywgYW5kIHVwZGF0ZSBpdCB0byBtb2Rlcm4gY29udmVudGlvbnMKKyAgICAoZmQubyAjMzIyNDU7IEphdmllciBKYXJkw7NuLCBTaW1vbiBNY1ZpdHRpZSkKKyAg4oCiIENvcnJlY3RseSBnaXZlIFhER19EQVRBX0hPTUUgcHJpb3JpdHkgb3ZlciBYREdfREFUQV9ESVJTIChmZC5vICMzNDQ5NiwKKyAgICBBbmRlcnMgS2FzZW9yZykKKyAg4oCiIFByZXZlbnQgWDExIGF1dG9sYXVuY2hpbmcgaWYgJERJU1BMQVkgaXMgdW5zZXQgb3IgZW1wdHksIGFuZCBhZGQKKyAgICAtLWRpc2FibGUteDExLWF1dG9sYXVuY2ggY29uZmlndXJlIG9wdGlvbiB0byBwcmV2ZW50IGl0IGFsdG9nZXRoZXIKKyAgICBpbiBlbWJlZGRlZCBlbnZpcm9ubWVudHMgKGZkLm8gIzE5OTk3LCBOQiMyMTk5NjQ7IFNpbW9uIE1jVml0dGllKQorICDigKIgSW5zdGFsbCB0aGUgZG9jdW1lbnRhdGlvbiwgYW5kIGFuIGluZGV4IGZvciBEZXZoZWxwIChmZC5vICMxMzQ5NSwKKyAgICBEZWJpYW4gIzQ1NDE0MjsgU2ltb24gTWNWaXR0aWUsIE1hdHRoaWFzIENsYXNlbikKKyAg4oCiIElmIGNoZWNrcyBhcmUgbm90IGRpc2FibGVkLCBjaGVjayB2YWxpZGl0eSBvZiBzdHJpbmctbGlrZSB0eXBlcyBhbmQKKyAgICBib29sZWFucyB3aGVuIHNlbmRpbmcgdGhlbSAoZmQubyAjMTYzMzgsIE5CIzIyMzE1MjsgU2ltb24gTWNWaXR0aWUpCisgIOKAoiBBZGQgVW5rbm93bk9iamVjdCwgVW5rbm93bkludGVyZmFjZSwgVW5rbm93blByb3BlcnR5IGFuZCBQcm9wZXJ0eVJlYWRPbmx5CisgICAgZXJyb3JzIHRvIGRidXMtc2hhcmVkLmggKGZkLm8gIzM0NTI3LCBMZW5uYXJ0IFBvZXR0ZXJpbmcpCisgIOKAoiBCcmVhayB1cCBhIGh1Z2UgY29uZGl0aW9uYWwgaW4gY29uZmlnLXBhcnNlciBzbyBnY292IGNhbiBwcm9kdWNlIGNvdmVyYWdlCisgICAgZGF0YSAoZmQubyAjMTA4ODcsIFNpbW9uIE1jVml0dGllKQorICDigKIgTGlzdCB3aGljaCBwYXJ0cyBvZiB0aGUgRGVza3RvcCBFbnRyeSBzcGVjaWZpY2F0aW9uIGFyZSBhcHBsaWNhYmxlIHRvCisgICAgLnNlcnZpY2UgZmlsZXMgKGZkLm8gIzE5MTU5LCBTdmVuIEhlcnpiZXJnKQorICDigKIgRG9uJ3Qgc3VwcHJlc3Mgc2VydmljZSBhY3RpdmF0aW9uIGlmIHR3byBzZXJ2aWNlcyBoYXZlIHRoZSBzYW1lIEV4ZWM9CisgICAgKGZkLm8gIzM1NzUwLCBDb2xpbiBXYWx0ZXJzKQorICDigKIgV2luZG93czoKKyAgICDCtyBBdm9pZCB0aGUgbmFtZSBFTEVNRU5UX1RZUEUgZHVlIHRvIG5hbWVzcGFjZS1wb2xsdXRpb24gZnJvbSB3aW5pb2N0bC5oCisgICAgICAoQW5kcmUgSGVpbmVja2UpCisgICAgwrcgSW5jbHVkZSBfZGJ1c19wYXRoX2lzX2Fic29sdXRlIGluIGxpYmRidXMgb24gV2luZG93cywgZml4aW5nIGNvbXBpbGF0aW9uCisgICAgICAoZmQubyAjMzI4MDUsIE1hcmsgQnJhbmQpCisKK0QtQnVzIDEuNC42ICgyMDEwLTAyLTE3KQorPT0KKworVGhlICIxLCAyLCBtaXNzIGEgZmV3LCA5OSwgMTAwIiByZWxlYXNlLgorCisgIOKAoiBSZW1vdmUgdW5maW5pc2hlZCBjaGFuZ2VzIGludGVuZGVkIHRvIHN1cHBvcnQgR1Rlc3QtYmFzZWQgdGVzdHMsCisgICAgd2hpY2ggd2VyZSBtaXN0YWtlbmx5IGluY2x1ZGVkIGluIDEuNC40CisKK0QtQnVzIDEuNC40ICgyMDEwLTAyLTE3KQorPT0KKworICDigKIgU3dpdGNoIGJhY2sgdG8gdXNpbmcgZXZlbiBtaWNybyB2ZXJzaW9ucyBmb3Igc3RhYmxlIHJlbGVhc2VzOyAxLjQuMQorICAgIHNob3VsZCBoYXZlIGJlZW4gY2FsbGVkIDEuNC4yLCBzbyBza2lwIHRoYXQgdmVyc2lvbiBudW1iZXIKKyAg4oCiIERvbid0IGxlYXZlIGJhZCBmaWxlIGRlc2NyaXB0b3JzIGJlaW5nIHdhdGNoZWQgd2hlbiBzcGF3bmluZyBwcm9jZXNzZXMsCisgICAgd2hpY2ggY291bGQgcmVzdWx0IGluIGEgYnVzeS1sb29wIChmZC5vICMzMjk5MiwgTkIjMjAwMjQ4OyBwb3NzaWJseQorICAgIGFsc28gTFAjNjU2MTM0LCBMUCM2ODA0NDQsIExQIzcxMzE1NykKKyAg4oCiIENoZWNrIGZvciBNU0dfTk9TSUdOQUwgY29ycmVjdGx5CisgIOKAoiBGaXggZmFpbHVyZSB0byBkZXRlY3QgYWJzdHJhY3Qgc29ja2V0IHN1cHBvcnQgKGZkLm8gIzI5ODk1KQorICDigKIgTWFrZSBfZGJ1c19zeXN0ZW1fbG9ndiBhY3R1YWxseSBleGl0IHdpdGggREJVU19TWVNURU1fTE9HX0ZBVEFMCisgICAgKGZkLm8gIzMyMjYyLCBOQiMxODA0ODYpCisgIOKAoiBJbXByb3ZlIHNvbWUgZXJyb3IgY29kZSBwYXRocyAoZmQubyAjMjk5ODEsIGZkLm8gIzMyMjY0LCBmZC5vICMzMjI2MiwKKyAgICBmZC5vICMzMzEyOCwgZmQubyAjMzMyNzcsIGZkLm8gIzMzMTI2LCBOQiMxODA0ODYpCisgIOKAoiBBdm9pZCBwb3NzaWJsZSBzeW1saW5rIGF0dGFja3MgaW4gL3RtcCBkdXJpbmcgY29tcGlsYXRpb24gKGZkLm8gIzMyODU0KQorICDigKIgVGlkeSB1cCBkZWFkIGNvZGUgKGZkLm8gIzI1MzA2LCBmZC5vICMzMzEyOCwgZmQubyAjMzQyOTIsIE5CIzE4MDQ4NikKKyAg4oCiIEltcHJvdmUgZ2NjIG1hbGxvYyBhbm5vdGF0aW9ucyAoZmQubyAjMzI3MTApCisgIOKAoiBJZiB0aGUgc3lzdGVtIGJ1cyBpcyBsYXVuY2hlZCB2aWEgc3lzdGVtZCwgcHJvdGVjdCBpdCBmcm9tIHRoZSBPT00ga2lsbGVyCisgIOKAoiBEb2N1bWVudGF0aW9uIGltcHJvdmVtZW50cyAoZmQubyAjMTExOTApCisgIOKAoiBBdm9pZCByZWFkZGlyX3IsIHdoaWNoIGlzIGRpZmZpY3VsdCB0byB1c2UgY29ycmVjdGx5IChmZC5vICM4Mjg0LAorICAgIGZkLm8gIzE1OTIyLCBMUCMyNDE2MTkpCisgIOKAoiBDb3BlIHdpdGggaW52YWxpZCBmaWxlcyBpbiBzZXNzaW9uLmQsIHN5c3RlbS5kIChmZC5vICMxOTE4NiwKKyAgICBEZWJpYW4gIzIzMDIzMSkKKyAg4oCiIERvbid0IGRpc3RyaWJ1dGUgZ2VuZXJhdGVkIGZpbGVzIHRoYXQgZW1iZWQgb3VyIGJ1aWxkZGlyIChmZC5vICMzMDI4NSwKKyAgICBmZC5vICMzNDI5MikKKyAg4oCiIFJhaXNlIHRoZSBzeXN0ZW0gYnVzJ3MgZmQgbGltaXQgdG8gYmUgc3VmZmljaWVudCBmb3IgaXRzIGNvbmZpZ3VyYXRpb24KKyAgICAoZmQubyAjMzM0NzQsIExQIzM4MTA2MykKKyAg4oCiIEZpeCBzeXNsb2cgc3RyaW5nIHByb2Nlc3NpbmcKKyAg4oCiIElnbm9yZSAtV2FkZHJlc3MKKyAg4oCiIFJlbW92ZSBicm9rZW4gZ2NvdiBwYXJzaW5nIGNvZGUgYW5kIC0tZW5hYmxlLWdjb3YsIGFuZCByZXBsYWNlIHRoZW0KKyAgICB3aXRoIGxjb3YgSFRNTCByZXBvcnRzIGFuZCAtLWVuYWJsZS1jb21waWxlci1jb3ZlcmFnZSAoZmQubyAjMTA4ODcpCisgIOKAoiBXaW5kb3dzOgorICAgIMK3IGF2b2lkIGxpdmUtbG9jayBpbiBXaW5kb3dzIENFIGR1ZSB0byB1bmZhaXIgY29uZGl0aW9uIHZhcmlhYmxlcworICDigKIgT3BlbkJTRDoKKyAgICDCtyBzdXBwb3J0IGNyZWRlbnRpYWxzLXBhc3NpbmcgKGZkLm8gIzMyNTQyKQorICDigKIgU29sYXJpczoKKyAgICDCtyBvcHQtaW4gdG8gdGhyZWFkIHNhZmV0eSAoZmQubyAjMzM0NjQpCisKK0QtQnVzIDEuNC4xICgyMCBEZWNlbWJlciAyMDEwKQorPT0KKworIOKAoiBGaXggZm9yIENWRS0yMDEwLTQzNTI6IHNlbmRpbmcgbWVzc2FnZXMgd2l0aCBleGNlc3NpdmVseS1uZXN0ZWQgdmFyaWFudHMgY2FuCisgICBjcmFzaCB0aGUgYnVzLiBUaGUgZXhpc3RpbmcgcmVzdHJpY3Rpb24gdG8gNjQtbGV2ZWxzIG9mIG5lc3RpbmcgcHJldmlvdXNseQorICAgb25seSBhcHBsaWVkIHRvIHRoZSBzdGF0aWMgdHlwZSBzaWduYXR1cmU7IG5vdyBpdCBhbHNvIGFwcGxpZXMgdG8gZHluYW1pYworICAgbmVzdGluZyB1c2luZyB2YXJpYW50cy4gVGhhbmtzIHRvIFLDqW1pIERlbmlzLUNvdXJtb250IGZvciBkaXNjb3ZpbmcgdGhpcworICAgaXNzdWUuCisg4oCiIE9TIFggcG9ydGFiaWxpdHkgZml4ZXMsIGluY2x1ZGluZyBsYXVuY2hkIHN1cHBvcnQuCisg4oCiIFdpbmRvd3MgYXV0b2xhdW5jaCBpbXByb3ZlbWVudHMuCisg4oCiIFZhcmlvdXMgYnVnIGZpeGVzLgorCitELUJ1cyAxLjQuMCAoNiBTZXAgMjAxMCkKKz09CisgLSBzeXN0ZW1kIGhvb2t1cAorCitELUJ1cyAxLjMuMSAoMjMgSnVuZSAyMDEwKQorPT0KKyAtIE5ldyBzdGFuZGFyZGl6ZWQgUHJvcGVydGllc0NoYW5nZWQgc2lnbmFsIGluIHRoZSBwcm9wZXJ0aWVzIGludGVyZmFjZQorIC0gVmFyaW91cyBwb3J0YWJpbGl0eSBmaXhlcywgaW4gcGFydGljdWxhciB0byBXaW5kb3dzIHBsYXRmb3JtcworIC0gU3VwcG9ydCBmb3JraW5nIGJ1cyBzZXJ2aWNlcywgZm9yIGNvbXBhdGliaWxpdHkKKworRC1CdXMgMS4zLjAgKDI5IEp1bHkgMjAwOSkKKz09CisgLSBhYmlsaXR5IGZvciBkYnVzLXNlbmQgdG8gc2VuZCB0byBhbnkgYnVzICgtLWFkZHJlc3MpCisgLSBmaWxlIGRlc2NyaXB0b3IgcGFzc2luZyBvbiBVbml4IHNvY2tldCB0cmFuc3BvcnRzCisgLSB1c2Ugb2YgR0NDIGF0b21pYyBpbnRyaW5zaWNzIGZvciBiZXR0ZXIgcHJvY2Vzc29yIHN1cHBvcnQKKyAgIChyZXF1aXJlcyAtbWFyY2g9aTQ4NiBvciBhYm92ZSBmb3IgeDg2IGNvbXBpbGF0aW9uKQorIC0gdGhyZWFkLXNhZmUgRkRfQ0xPRVhFQyBzZXR0aW5nIG9uIHJlY2VudCBMaW51eCBrZXJuZWxzICgyLjYuMjQtMjcgYW5kIHVwKQorICAgYW5kIGdsaWJjICgyLjkgZm9yIHBpcGUyIGFuZCAyLjEwIGZvciBhY2NlcHQ0KQorIC0gZmVhdHVyZSBuZWdvdGlhdGlvbiBpbiB0aGUgYnVzIGRhZW1vbgpkaWZmIC0tZ2l0IGEvZGJ1cy9ORVdTLnByZS0xLTAgYi9kYnVzL05FV1MucHJlLTEtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTA1YmM1Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9ORVdTLnByZS0xLTAKQEAgLTAsMCArMSw2MTQgQEAKK0QtQnVzIDEuMC4wICgwOCBOb3ZlbWJlciAyMDA2KQorPT0KKy0gRG9jdW1lbnRzIHVwZGF0ZWQgd2l0aCBBUEkvQUJJIGdhcnVudGVlcyAKKy0gQWRkZWQgbWlzc2luZyBwYXRjaCBGcmVlQlNEIG5lZWQgdG8gcnVuIG91dCBvZiB0aGUgYm94CistIGRidXMtbW9uaXRvciBub3cgaGFzIGEgcHJvZmlsZSBtb2RlCistIEFVVEhPUlMgZmlsZSB1cGRhdGVkIHdpdGggbmFtZXMgZnJvbSB0aGUgQ2hhbmdlTG9nCisgIFRoYW5rcyB0byBldmVyeW9uZSB3aG8gaGVscGVkIGdldCB1cyBoZXJlCisKK0QtQnVzIDEuMCBSQyAzICgwLjk1KSAoMDIgTm92ZW1iZXIgMjAwNikKKz09CistIERCVVNfQVBJX1NVQkpFQ1RfVE9fQ0hBTkdFIG5vIGxvbmdlciBuZWVkcyB0byBiZSBkZWZpbmVkIHdoZW4gYnVpbGRpbmcgYXBwcworLSAuL2NvbmZpZ3VyZSBjaGVja3Mgbm93IHdvcmsgd2hlbiBjcm9zcyBjb21waWxpbmcKKy0gZGJ1cy11dWlkZ2VuIC0tZW5zdXJlIGlzIG5vdyBydW4gaW4gdGhlIGluaXQgc2NyaXB0IHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8KKyAgcnVuIGl0IGluIGEgcG9zdCBzY3JpcHQKKy0gZGJ1cy11dWlkZ2VuIG5vdyB3cml0ZXMgb3V0IHRvIC92YXIvbGliL2RidXMgdG8gd29yayB3aXRoIHN5c3RlbXMgdGhhdCBkbyBub3QKKyAgaGF2ZSBhIHdyaXRhYmxlIC9ldGMuIFBhY2thZ2VzIHNob3VsZCBpbnN0YWxsIGFuZCBvd24gdGhlIC92YXIvbGliL2RidXMgCisgIGRpcmVjdG9yeQorLSByZWN1cnNpdmUgbG9ja3MgYXJlIG5vdyB1c2VkIHdoZW4gZGJ1c190aHJlYWRzX2luaXRfZGVmYXVsdCBpcyBjYWxsZWQKKy0gc3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycyB0YWcgYWRkZWQgdG8gdGhlIHNlc3Npb24uY29uZgorICB1bmRlciBhIG5vcm1hbCBidWlsZCB0aGlzIHNwZWNpZmllcyB0aGVzZSBzZXJ2aWNlIGRpcmVjdG9yaWVzOgorICAgIC91c3IvbG9jYWwvc2hhcmUvZGJ1cy0xL3NlcnZpY2VzCisgICAgL3Vzci9zaGFyZS9kYnVzLTEvc2VydmljZXMKKyAgICAkSE9NRS8ubG9jYWwvc2hhcmUvZGJ1cy0xL3NlcnZpY2VzCistIGZpeGVkIGNyYXNoIHdoZW4gYSBzZXJ2aWNlIGRpcmVjdG9yeSBpcyBzcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2UKKy0gZml4ZWQgYSBjcmFzaCBpbiAqQlNEIHdoZW4gd2F0Y2hpbmcgY29uZmlnIGRpcmVjdG9yaWVzIGZvciBjaGFuZ2VzCistIGZpeGVkIElyaXggYnVpbGQgYnkgdXNpbmcgZGlycC0+X19kZF9mZCB0byBnZXQgdGhlIGZpbGUgZGVzY3JpcHRvcgorLSBjbGVhbmVkIHVwIHRoZSBMT0NBTF9DUkVEUyB2cyBDTUdDUkVEIGNyZWRlbnRpYWwgY29kZSBzbyAqQlNEJ3MgZG9uJ3QgCisgIGNyYXNoIGhlcmUgYW55bW9yZQorLSBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJyYXlfbGVuIGRlcHJlY2F0ZWQKKy0gY2xlYW51cC1tYW4tcGFnZXMuc2ggYWRkZWQgc28gcGFja2FnZXJzIGNhbiBjbGVhbiB1cCBEb3h5Z2VuIG1hbiBwYWdlIG91dHB1dAorICBmcm9tIDcgdG8gMiBtZWdzCistIGxhcmdlIGRvY3VtZW50YXRpb24gaW1wcm92ZW1lbnRzCistIG51bWVyb3VzIGJ1ZyBmaXhlcworCitELUJ1cyAxLjAgUkMgMiAoMC45NCkgKDE0IE9jdG9iZXIgMjAwNikKKz09CistIGRidXMtdXVpZGdlbiBiaW5hcnkgYWRkZWQgZm9yIGZ1dHVyZSByZW1vdGUgbWFjaGluZSBpZGVudGlmaWNhdGlvbgorICBwYWNrYWdlcnMgc2hvdWxkIGNhbGwgZGJ1cy11dWlkZ2VuIC0tZW5zdXJlIGluIHRoZWlyIHBvc3QKKy0gR2V0TWFjaGluZUlkIHBlZXIgbWV0aG9kIGFkZGVkIHRvIHRoZSBidXMgQVBJCistIGRidXNfY29ubmVjdGlvbl9zZXRfcm91dGVfcGVlcl9tZXNzYWdlcyBBUEkgYWRkZWQgdG8gbGV0IHRoZSBidXMgc2VuZAorICBwZWVyIG1lc3NhZ2VzIGRpcmVjdGx5IHRvIGFuIGFwcAorLSBBdXRvbGF1bmNoIGFiaWxpdGllcyBhZGRlZCB0byBkYnVzLWxhdW5jaCB3aXRoIHRoZSAtLWF1dG9sYXVuY2ggZmxhZworICBUaGlzIGZlYXR1cmUgYWxsb3dzIGxpYmRidXMgdG8gc3RhcnQgYSBzZXNzaW9uIGJ1cyBpZiBub25lIGNhbiBiZSBmb3VuZAorICBUaGlzIGlzIGFuIGludGVybmFsIGZlYXR1cmUgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBzY3JpcHRzCisgIERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyBpcyBzdGlsbCB0aGUgY29ycmVjdCB3YXkgdG8gc3BlY2lmeSBhIHNlc3Npb24gYnVzCistIGRidXMtbGF1bmNoIG5vdyBwcmludHMgb3V0IGEgc2ltcGxlIGtleSB2YWx1ZSBwYWlycyBpbnN0ZWFkIG9mIHNoZWxsIHNjcmlwdHMKKyAgaWYgb25lIG9mIHRoZSBzaGVsbCBmbGFncyBhcmVuJ3QgdXNlZAorLSBzdXBwb3J0IERCVVNfQkxPQ0tfT05fQUJPUlQgZW52IHZhcmlhYmxlIHRvIGNhdXNlIGJsb2NraW5nIHdhaXRpbmcgZm9yIGdkYgorLSB3ZWFrIHJlZiBhcmUgbm93IGhlbGQgZm9yIHNoYXJlZCBjb25uZWN0aW9ucyBzbyB0aGUgcmlnaHQgdGhpbmdzIGhhcHBlbgorICB0aGlzIGZpeGVzIHNvbWUgcHJldHR5IG1ham9yIGJ1Z3Mgd2l0aCB0aGUgd2F5IGNvbm5lY3Rpb25zIHdlcmUgaGFuZGxlZAorLSBTb21lIHJlZmFjdG9yaW5nIGZvciBXaW5kb3dzIChkb2Vzbid0IGVmZmVjdCBVbml4KQorLSBTb2xhcmlzIGJ1aWxkIGZpeGVzCistIE1hY09TWCBidWlsZCBmaXhlcworLSBDcm9zcyBjb21waWxlIGJ1aWxkIGZpeGVzLiAgV2Ugbm93IGFzc3VtZSBnZXRwd25hbV9yIGlzIHBvc2l4IGFuZCB2YV9saXN0cworICBjYW4gYmUgY29waWVkIGJ5IHZhbHVlIHNpbmNlIHdlIGNhbid0IGNoZWNrIHRoaXMgaW4gYSBjcm9zcyBjb21waWxlLiAgSWYKKyAgdGhpcyBpcyBub3QgdHJ1ZSBmb3IgYSBwYXJ0aWN1bGFyIHRhcmdldCBpcyB1cCB0byB0aGUgZGV2ZWxvcGVyIHRvIHBhdGNoLgorLSBCdWcgZml4aW5nIGFsbCBhcm91bmQKKworRC1CdXMgMS4wIFJDIDEgKDAuOTMpICgxNCBTZXB0ZW1iZXIgMjAwNikKKz09CistIGRidXNfdGhyZWFkc19pbml0X2RlZmF1bHQgYWRkZWQgZm9yIGluaXRhbGl6aW5nIHRocmVhZHMgd2l0aG91dCB0aGUgbmVlZCBmb3IKKyAgYmluZGluZ3MKKy0gRmlsdGVycyBhcmUgbm93IHByb3Blcmx5IHJlbW92ZWQKKy0gZGJ1c19jb25uZWN0aW9uX29wZW4gbm93IGhvbGRzIGEgaGFyZCByZWYgdG8gc2hhcmVkIGNvbm5lY3Rpb25zCistIFdlIG5vdyBwcmludCBvdXQgYSB3YXJuaW5nIGFuZCBkbyBub3RoaW5nIHdoZW4gc29tZW9uZSB0cmllcyB0byBjbG9zZSBhIAorICBzaGFyZWQgY29ubmVjdGlvbgorLSBUaGUgLS1pbnRyb3NwZWN0IHN3aXRjaCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgYnVzIGZvciBwcmludGluZyBvdXQgCisgIGludHJvc3BlY3Rpb24gZGF0YSB3aXRob3V0IGFjdHVhbGx5IHJ1bm5pbmcgdGhlIGJ1cworLSBMT0NBTF9DUkVEUyBzb2NrZXQgY3JlZGVudGlhbHMgYXJlIG5vdyBzdXBwb3J0ZWQgZm9yIHN5c3RlbXMgd2hpY2ggCisgIHN1cHBvcnQgaXQgc3VjaCBhcyBOZXRCU0QKKy0gR2VuZXJhbGl6ZSBrcXVldWUgc3VwcG9ydCBzbyBpdCB3b3JrcyB3aXRoIE5ldEJTRCBhcyB3ZWxsIGFzIEZyZWVCU0QKKy0gTnVtZXJvdXMgYnVnIGZpeGVzIGFuZCBtZW1vcnkgbGVha3MgcGF0Y2hlZAorCitELUJ1cyAwLjkyICgxOCBBdWd1c3QgMjAwNikKKz09CistIFByb3BlciB0aHJlYWQgbG9ja2luZyBhZGRlZCB0byBwZW5kaW5nIGNhbGxzCistIFRocmVhZGluZyBzZW1hbnRpY3MgY2hhbmdlZCBmcm9tIGluaXQgZWFybHkgdG8gaW5pdCBiZWZvcmUgdGhlIHNlY29uZCB0aHJlYWQKKyAgaXMgc3RhcnRlZAorLSBDb3JyZWN0bHkgZXJyb3Igb3V0IHdoZW4gYW4gYXBwbGljYXRpb24gdHJpZXMgdG8gYWNxdWlyZSBvciByZWxlYXNlIHRoZQorICBvcmcuZnJlZWRlc2t0b3AuREJ1cyBuYW1lIGluc3RlYWQgb2Ygc2VuZGluZyBmYWxzZSByZXN1bHQgY29kZXMKKy0ga3F1ZXVlIGRpcmVjdG9yeSB3YXRjaGluZyBjb2RlIGNhbiBub3cgYmUgdXNlZCB0byBtb25pdG9yIGNvbmZpZyBmaWxlIGNoYW5nZXMKKyAgb24gRnJlZUJTRAorLSAtLXdpdGgtZGJ1cy1kYWVtb25kaXIgY29uZmlndXJlIHN3aXRjaCBhZGRlZCBzbyB0aGUgZGFlbW9uIGNhbiBiZSBpbnN0YWxsZWQKKyAgc2VwYXJhdGUgZnJvbSB0aGUgdXNlciBiaW5hcmllcworLSBNYWtlZmlsZXMgZml4ZWQgZm9yIGN5Z3dpbiAKKy0gVmFyaW91cyBmaXhlcyBmb3IgdGhlIG9uZ29pbmcgV2luZG93cyBwb3J0IAorLSBGaXhlZCBkb2NzIGFuZCBjb21tZW50cyB0byB1c2UgdGhlIEQtQnVzIHNwZWxsaW5nIGluc3RlYWQgb2YgRC1CVVMKKy0gTWFueSBtZW1sZWFrcyBhbmQgYnVncyBmaXhlZAorCitELUJ1cyAwLjkxICgyNCBKdWx5IDIwMDYpCis9PQorLSBSZW1vdmUgc29tZSBsaW5nZXJpbmcgYml0cyBsZWZ0IG92ZXIgZnJvbSB0aGUgYmluZGluZ3Mgc3BsaXQKKy0gRml4IGFzc2VydGlvbiBjYXVzaW5nIEQtQnVzIGFwcGxpY2F0aW9ucyB0byBjcmFzaCB3aGVuIGNoZWNrcyBhcmUgZW5hYmxlZAorLSBGaXggYSB0aW1lb3V0IGJ1ZyB3aGljaCB3b3VsZCBibG9jayBhcHBsaWNhdGlvbnMgZnJvbSBiZWluZyBhdXRvIHN0YXJ0ZWQKKworRC1CdXMgMC45MCAoMTcgSnVseSAyMDA2KQorPT0KKy0gQVBJL0FCSSBmcmVlemUgZm9yIDEuMAorLSBCaW5kaW5ncyBhcmUgbm93IHNwbGl0IG91dCBpbnRvIHNlcGVyYXRlIHBhY2thZ2VzCistIExpc3RBY3RpdmF0YWJsZU5hbWVzIGFkZGVkIGFzIGEgbWV0aG9kIG9uIHRoZSBidXMKKy0gUmVtb3ZlZCBkZXByZWNhdGVkIGRidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0ICh1c2UgZGJ1c19jb25uZWN0aW9uX2Nsb3NlKQorLSBTaGFyZWQgY29ubmVjdGlvbnMgYXJlIG5vdyB1bnJlZmZlZCBvbiBkaXNjb25uZWN0CistIEZpeGVkIHBlbmRpbmcgY2FsbHMgZm9yIHRocmVhZGVkIGVudmlvcm5tZW50cworLSBQZW5kaW5nIGNhbGxzIGdldCB0aW1lZCBvdXQgb24gY29ubmVjdGlvbiBkaXNjb25uZWN0CistIGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgcmV0dXJucyBUUlVFIGFuZCBhIE5VTEwgcGVuZGluZyBjYWxsCisgIGlmIHlvdSBjYWxsIGl0IG9uIGEgY29ubmVjdGlvbiBvYmplY3Qgd2hpY2ggaGFzIGJlZW4gZGlzY29ubmVjdGVkIGFscmVhZHkKKyAgKGl0IHJldHVybnMgRkFMU0Ugb24gT3V0IG9mIE1lbW9yeSBlcnJvcnMgb25seSkKKy0gZGJ1cy1tb25pdG9yIG5vdyBjb3JyZWN0bHkgY2F0Y2hlcyBtZXRob2RzLCBub3QganVzdCBzaWduYWxzCistIGRidXMtbW9uaXRvciBub3cgcHJpbnRzIG9iamVjdCBwYXRocyAKKworRC1CVVMgMC42MiAoMTIgSnVuZSAyMDA2KQorPT0KKy0gRG9jIGZpeGVzCistIEFkZGVkIHN1cHBvcnQgZm9yIGFsbCBkYXRhLXR5cGVzIGZvciB0aGUgZGJ1cyB0b29scworLSBGaXhlZCBlYXZlc2Ryb3BwaW5nIG9uIG1ldGhvZCBjYWxscyAoZGJ1cy1tb25pdG9yKQorLSBGaXhlZCBzaWxlbnQgZHJvcHBpbmcgb2YgbWV0aG9kIGNhbGxzIHdpdGggaW50ZXJmYWNlPU5VTEwKKy0gRml4ZWQgY29uc29sZSBvd25lcnNoaXAgcHJvYmxlbXMgaW4gU29sYXJpcworLSBGaXhlZCBpbnN0YWxsYXRpb24gb2YgZGJ1cy1zaWduYXR1cmUuaCBhbmQgI2luY2x1ZGUgaXQgaW4gZGJ1cy9kYnVzLmgKKy0gRmx1c2ggdGhlIHVzZXIgZGF0YWJhc2UgY2FjaGUgb24gY29uZmlnIHJlbG9hZAorLSBHTGliIGJpbmRpbmdzOgorICAtIEZpeCBtZW1vcnkgbGVha3MKKyAgLSBGaXggcHJvcGVydGllcyBpbiBEQnVzR1Byb3h5IHNvIHRoYXQgdGhleSBjYW4gYmUgZ2l2ZW4gaW4gYW55CisgICAgb3JkZXIKKyAgLSBBZGRlZCBsb3RzIG9mIGFzc2VydGlvbnMgdG8gZW5zdXJlIGNvcnJlY3QgdXNlCisgIC0gUmVtb3ZlIGR1cGxpY2F0ZWQgY29kZQorICAtIEZpeCBzdGF0aWMgc3RyaW5nIHBvaW50ZXIgdXNlcyBpbiBHUHRyQXJyYXktYmFzZWQgY29sbGVjdGlvbnMKKy0gUHl0aG9uIGJpbmRpbmdzOgorICAtIFJlbW92ZSByZWZlcmVuY2UgdG8gc3lzL2NkZWZzLmgKKy0gUXQ0IGJpbmRpbmdzOgorICAtIENvZGUgcmVvcmdhbml6ZWQKKyAgLSBBZGRlZCB0aGUgZGJ1c2lkbDJjcHAsIGRidXNjcHAyeG1sIGFuZCBkYnVzIHRvb2xzCisgIC0gQWRkZWQgZXhhbXBsZSBwcm9ncmFtcyAocGluZy1wb25nLCBjb21wbGV4IHBpbmctcG9uZywgbGlzdG5hbWVzLCBjaGF0KQorICAtIFVwZGF0ZWQgc2VsZnRlc3RzCisgIC0gRml4ZWQgY29tcGlsYXRpb24gYW5kIC5tb2MtIGFuZCAudWktZmlsZSBwcm9jZXNzaW5nIGFuZCBjbGVhbmluZworICAtIE1hZGUgY2VudHJhbCBjbGFzc2VzIGRlcml2ZSBmcm9tIFFPYmplY3QKKyAgLSBFbmhhbmNlIGVycm9yIHJlcG9ydGluZworICAtIE1hbnkgYnVnZml4ZXMKKy0gTW9ubyBiaW5kaW5nczoKKyAgLSBNaW5vciBidWdmaXhlcworCitELUJVUyAwLjYxICgyNCBGZWJ1YXJ5IDIwMDYpCis9PQorLSBEb2N1bWVudGF0aW9uIGFsbCBhcm91bmQKKy0gZGJ1cy1sYXVuY2ggbm93IHByb2R1Y2VzIGNvcnJlY3Qgc2ggYW5kIGNzaCBzeW50YXgKKy0gTmVzdGVkIGFycmF5cyBub3cgd29yayBjb3JyZWN0bHkKKy0gR0xpYiBiaW5kaW5nczoKKyAgLSBJbmhlcml0aW5nIGZyb20gREJ1c0dQcm94eSBpcyBub3cgcG9zc2libGUKKyAgLSBHUHRyQXJyYXlzIGNhbiBub3cgYmUgbWFyc2hhbGxlZAorICAtIG9yZy5mcmVlZGVza3RvcC5EQnVzLkdMaWIuQ2xpZW50Q1N5bWJvbCBhbm5vdGF0aW9uIGFkZGVkCisgIC0gT3Blbm5pbmcgY29ubmVjdGlvbnMgdG8gYXJiaXRyYXJ5IGFkZHJlc3NlcyBub3cgc3VwcG9ydGVkCistIFB5dGhvbiBiaW5kaW5nczoKKyAgLSBzZW5kZXJfa2V5d29yZCBhbmQgcGF0aF9rZXl3b3JkIGtleXdvcmRzIGFkZGVkIHRvIHNpZ25hbCBsaXN0ZW5lciBBUEkKKyAgLSBCeXRlIHR5cGVzIG5vdyBkZW1hcnNoYWwgdG8gdW5zaWduZWQgY2hhcgorICAtIGNhbGxpbmcgbWV0aG9kcyBub3cgZG8gdGhlIGNvcnJlY3QgdGhpbmcKKy0gUXQgYmluZGluZ3M6CisgIC0gYm90aCBRdDMgYW5kIFF0NCBiaW5kaW5ncyBjYW4gYmUgYnVpbHQgYXQgdGhlIHNhbWUgdGltZQorICAtIFVzZSB0aGUgc3RhbmRhcmQgb3JnLmZyZWVkZXNrdG9wLkRCdXMuTWV0aG9kLk5vUmVwbHkgYW5ub3RhdGlvbiAKKyAgICBmb3IgdGhlICJhc3luYyIgY2FsbHMgaW5zdGVhZCBvZiBjcmVhdGluZyBvbmUgZm9yIHVzLgorLSBNb25vIGJpbmRpbmdzOgorICAtIDY0Yml0IGFyY2ggZml4ZXMKKy0gTWFzc2l2ZSBidWcgZml4aW5nIGFsbCBhcm91bmQKKworRC1CVVMgMC42MCAoMzAgTm92ZW1iZXIgMjAwNSkKKz09CisKKy0gbWFqb3IgQUJJL0FQSSBjaGFuZ2VzIC0gc29uYW1lcyBjaGFuZ2VkCistIFJlcXVlc3ROYW1lIHF1ZXVpbmcgYmVoYXZpb3IgaGFzIGNoYW5nZWQgKHJlZmVyIHRvIGRidXMtc3BlY2lmaWNhdGlvbikKKyAgLSBEQlVTX05BTUVfRkxBR19QUk9ISUJJVF9SRVBMQUNFTUVOVCBoYXMgYmVlbiByZW1vdmVkIGFuZAorICAgIERCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBmbGFncworLSBzaWduYWxzIGVtaXR0ZWQgYnkgdGhlIGJ1cyBub3cgc2hvdyB1cCBpbiB0aGUgaW50cm9zcGVjdCBkYXRhCistIGF1dGggRVhURVJOQUwgbm93IHN1cHBvcnRlZCBvbiBCU0QgdmFyaWVudHMKKy0gUmVsZWFzZU5hbWUgbWV0aG9kIGFkZGVkIHRvIHRoZSBidXMgdG8gYWxsb3cgYSBzZXJ2aWNlCisgIHRvIHJlbW92ZSBpdHNlbGYgYXMgb3duZXIgb2YgYSBidXMgbmFtZQorLSBkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZSBhZGRlZCBmb3IgZ2V0dGluZyBtZXNzYWdlcyBvZmYgdGhlIGJ1cyAKKyAgaW4gdGhlIGFic2VuY2Ugb2YgYSBtYWlubG9vcAorLSBRdDQgYmluZGluZ3MgYWRkZWQgYW5kIHRoZSBRdDMgYmluZGluZ3MgaGF2ZSBiZWVuIGRlcHJpY2F0ZWQKKy0gcHl0aG9uIGJpbmRpbmdzOgorICAtIG1hcnNoYWwgdXNpbmcgaW50cm9zcGVjdCBkYXRhIGlmIGF2YWlsYWJsZQorICAtIGJldHRlciBleGNlcHRpb24gaGFuZGxpbmcgYW5kIHByb3BpZ2F0aW9uCisgIC0gcHJpdmF0ZSBjb25uZWN0aW9ucyBhcmUgbm93IHN1cHBvcnRlZAorICAtIFVURi04IGNsZWFudXBzCisgIC0gb3V0X3NpZ25hdHVyZSBhZGRlZCB0byBtZXRob2QgZGVjb3JhdG9ycyBmb3Igc3BlY2lmeWluZworICAgIGhvdyB0aGUgcmV0dXJuIHZhbHVlcyBzaG91bGQgYmUgbWFyc2hhbGVkCisgIC0gc2VuZGVyX2tleXdvcmQgYWRkZWQgdG8gbWV0aG9kIGRlY29yYXRvcnMgZm9yIHNwZWNpZnlpbmcKKyAgICBhbmQgYXJndW1lbnQgdG8gcHJvdmlkZSB0aGUgdW5pcXVlIG5hbWUgb2YgdGhlIG1ldGhvZCBjYWxsZXIKKyAgLSBhc3luY19jYWxsYmFja3MgYWRkZWQgdG8gbWV0aG9kIGRlY29yYXRvcnMgCisgIC0gbXVsdGlwbGUgaW5oZXJpdGFuY2Ugb2YgY2xhc3NlcyBub3cgc3VwcG9ydGVkIAorLSBHTGliIGJpbmRpbmdzOgorICAtIHJlc3BlY3QgTm9SZXBseSBhbm5vdGF0aW9ucworICAtIGRidXNfZ19tZXRob2RfcmV0dXJuX2dldF9yZXBseSBhbmQgZGJ1c19nX21ldGhvZF9yZXR1cm5fc2VuZF9yZXBseQorICAgIGFkZGVkIHRvIHRoZSBsb3dsZXZlbCBjb2RlIGZvciB1c2Ugd2hlbiB0aGUgZGJ1cy1nbGliIG1hcnNoYWxsaW5nCisgICAgY29kZSBpcyBub3QgYWRpcXVhdGUKKy0gbnVtZXJvdXMgYnVnIGZpeGVzIGFsbCBhcm91bmQKKworRC1CVVMgMC41MCAoMDYgU2VwdGVtYmVyIDIwMDUpCis9PT0KK1RoaXMgaXMgYSBtaW5vciByZWxlYXNlIGZyb20gMC4zNi4yLiAgVGhlIHNlcmllcyBudW1iZXIgaGFzIGNoYW5nZWQgCitub3QgYmVjYXVzZSBvZiBhbnkgdGVjaG5pY2FsIHJlYXNvbnMgYnV0IGFzIGFuIGluZGljYXRpb24gdGhhdCB3ZQorYXJlIG1vdmluZyBjbG9zZXIgdG8gMS4wLiAgSXQgaXMgaG9wZWQgdGhhdCB0aGlzIHdpbGwgYmUgdGhlIGxhc3QKK3NlcmllcyB0byBzZWUgbWFqb3IgY2hhbmdlcywgbW9zdCBvZiB3aGljaCB3aWxsIGJlIGlzb2xhdGVkIHRvIHRoZQorR0xpYiBhbmQgUHl0aG9uIGJpbmRpbmdzLCBhcyB3ZSB0cmFuc2l0aW9uIHRvIGNvbmNlbnRyYXRlIG1vcmUgb24KK2J1ZyBidXN0aW5nIGFuZCBjb2RlIGF1ZGl0aW5nLgorCistIEQtQnVzIGJ1aWxkcyBvbiB0aGUgQ3lnd2luIHBsYXRmb3JtCistIE1ha2VmaWxlIGNsZWFudXBzCistIFZhcmlvdXMgYnVnIGZpeGVzCistIE9wdGltaXphdGlvbiBvZiB0aGUgZGJ1cyBvYmplY3QgdHJlZSAKKy0gTWVtbGVha3MgYW5kIEdJTCBjcmFzaGVyIGJ1Z3MgaGF2ZSBiZWVuIGZpeGVkIGluIHRoZSBQeXRob24gYmluZGluZ3MKKworRC1CVVMgMC4zNi4yICgyOSBBdWd1c3QgMjAwNSkKKz09PQorLSBTZWN1cml0eTogUmVzdHJpY3Qgb3RoZXIgdXNlcnMgZnJvbSBjb25uZWN0aW5nIHRvIGFub3RoZXIgdXNlcnMgCisgIHNlc3Npb24gYnVzCisKK0QtQlVTIDAuMzYuMSAoMjQgQXVndXN0IDIwMDUpCis9PT0KKy0gUHl0aG9uIEJpbmRpbmdzOgorICAtIGZpeGVkIHRvIHdvcmsgd2l0aCBoYWwtZGV2aWNlLW1hbmFnZXIKKyAgLSBGb3IgNjRiaXQgYnVpbGRzIGV2ZXJ5dGhpbmcgaXMgaW5zdGFsbGVkIHRvIGxpYjY0L3B5dGhvbjIuNC8KKyAgICBzaW5jZSBQeXRob24gY2FuJ3QgaGFuZGxlIG11bHRpbGliCisKK0QtQlVTIDAuMzYgKDIzIEF1Z3VzdCAyMDA1KQorPT09CistIE1heGltdW0gc2l6ZWQgb2YgY2FjaGVkIG1lc3NhZ2VzIGhhdmUgYmVlbiByZWR1Y2VkIHRvIDEwSworLSBNYXRjaCBydWxlcyBub3cgYWxsb3cgbWF0Y2hpbmcgb24gYXJndW1lbnRzIGluc2lkZSB0aGUgbWVzc2FnZQorLSBpbnRyb3NwZWN0LnhzbCBYU0xUIHN0eWxlIHNoZWV0IGFkZGVkIGZvciBmb3JtYXR0aW5nIGludHJvc3BlY3Rpb24KKyAgZGF0YSBpbnRvIFhIVE1MIGZvciBhbmFseXNpcworLSBQeXRob24gYmluZGluZ3M6CisgIC0gbm93IGhhdmUgd29ya2luZyB0eXBlIG9iamVjdHMgZm9yIGV4cGxpY2l0CisgICAgdHlwZWNhc3RpbmcKKyAgLSBWYXJpYW50IHR5cGUgaGFzIGJlZW4gYWRkZWQKKyAgLSBEaWN0aW9uYXJpZXMsIFZhcmlhbnRzIGFuZCBBcnJheXMgY2FuIGFsbCBiZSBwYXNzZWQgdGhlIHNpZ25pdHVyZSBvcgorICAgIHR5cGUocykgb2YgdGhlaXIgY2hpbGRyZW4KKyAgLSB0aGUgb3B0aW9uYWwgdGltZW91dD0ga2V5d29yZCBoYXMgYmVlbiBhZGRlZCB3aGVuIG1ha2luZyBtZXRob2QgY2FsbHMKKyAgLSBtYXRjaCBvbiBhcmdzIGhhcyBiZWVuIGltcGxlbWVudGVkCisgIC0gYSAucHRoIGZpbGUgaGFzIGJlZW4gYWRkZWQgZm9yIGRlYWxpbmcgd2l0aCBsaWJyYXJpZXMgYW5kIHB5dGhvbiBmaWxlcworICAgIGJlaW5nIGluIGRpZmZlcmVudCBkaXJlY3RvcmllcyBzdWNoIGFzIGluIDY0Yml0IGluc3RhbGxzCisgIC0gdmFyaW91cyBidWcgZml4ZXMKKy0gR0xpYiBiaW5kaW5nczoKKyAgLSBkZWVwbHkgcmVjdXJzaXZlIHR5cGVzIG5vdyBzdXBwb3J0ZWQKKyAgLSBtYW55IHN5bWJvbHMgYXJlIG5vIGxvbmdlciBleHBvcnRlZCBhcyBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJCisgIC0gdmFyaW91cyBtZW1sZWFrIGFuZCBvdGhlciBidWcgZml4ZXMKKworRC1CVVMgMC4zNS4yICgxNyBKdWx5IDIwMDUpCis9PT0KKy0gUmVuYW1lIFVuaXggU2VjdXJpdHkgQ29udGV4dCB0byBTRUxpbnV4IFNlY3VyaXR5IENvbnRleHQgaW4gQVBJCistIEZpeGVkIG1vcmUgZGlzdCBlcnJvcnMgdGhhdCBkaXN0Y2hlY2sgZGlkbid0IHBpY2sgdXAgb24KKy0gRml4ZWQgdmFyaW91cyBidWdzIGluIHRoZSBweXRob24gYmluZGluZ3MgdGhhdCBwcmV2ZW50ZWQgdGhlbSBmcm9tIHdvcmtpbmcKKworRC1CVVMgMC4zNS4xICgxNiBKdWx5IDIwMDUpCis9PT0KKy0gRml4ZWQgZGlzdCBlcnJvciB3aGVyZSBweXRob24vZGJ1c19iaW5kaW5ncy5weGQgd2FzIGJlaW5nIHNoaXBwZWQgCisgIGluc3RlYWQgb2YgZGJ1c19iaW5kaW5ncy5weGQuaW4KKy0gVXNlIHRoaXMgaW5zdGVhZCBvZiB0aGUgMC4zNSB0YXJiYWxsIAorCitELUJVUyAwLjM1ICgxNSBKdWx5IDIwMDUpCis9PT0KKy0gLS13aXRoLWRidXMtdXNlciBhZGRlZCB0byB0aGUgY29uZmlndXJlIHNjcmlwdHMgZm9yIGNvbmZpZ3VyaW5nIHRoZSAKKyAgdXNlciB0aGUgc3lzdGVtIGJ1cyBydW5zIG9uCistIC0td2l0aC1jb25zb2xlLWF1dGgtZGlyIGFkZGVkIHRvIGNvbmZpZ3VyZSBzY3JpcHRzIGZvciBjb25maWd1cmluZyB0aGUKKyAgZGlyZWN0b3J5IHRvIGxvb2sgaW4gZm9yIGNvbnNvbGUgdXNlciBsb2NrcworLSBzZXJ2aWNlIGZpbGVzIGZvciBhdXRvLXN0YXJ0aW5nIEQtQnVzIHNlcnZpY2VzIG5vdyBoYXMgdGhlIGFiaWxpdHkgdG8gcGFzcworICBpbiBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHRvIHRoZSBleGVjdXRhYmxlCistIEh1Z2UgYXV0by1zdGFydCBidWcgc3F1YXNoZWQgd2hpY2ggY2F1c2VkIHNvbWUgc2VydmljZXMgbm90IHRvIHN0YXJ0IHdoZW4KKyAgcmVxdWVzdGVkIGluIHJhcGlkIHN1Y2Nlc3Npb24KKy0gU0UtTGludXggc2VjdXJpdHkgY29udGV4dHMgY2FuIG5vdyBiZSBhcHBlbmRlZCB0byBtZXNzYWdlcyBmb3IgaW5zcGVjdGlvbgorICBieSBzZXJ2aWNlcyB0aGF0IGVuZm9yY2UgdGhlaXIgb3duIHNlY3VyaXR5IHBvbGljaWVzCistIENvbGluIHNheXMgdGhlIEdMaWIgYmluZGluZyBhcmUgcmVhZHkgZm9yIGdlbmVyYWwgY29uc3VtcHRpb24KKy0gTmV3IEdMaWIgdHV0b3JpYWwKKy0gTmV3IEdMaWIgZXhhbXBsZSBjb2RlCistIFB5dGhvbiBiaW5kaW5ncyBhcmUgbm93IHZlcnNpb24gKDAsNDIsMCkKKy0gUHl0aG9uIGJpbmRpbmdzIEFQSSBoYXMgY2hhbmdlZCBvbiB0aGUgc2VydmljZSBzaWRlCistIGRidXMuc2VydmljZSBoYXMgYmVlbiBzcGxpdCBvdXQgYXMgYSBzZXBlcmF0ZSBtb2R1bGUKKy0gZGJ1cy5zZXJ2aWNlLlNlcnZpY2UgaXMgcmVuYW1lZCB0byBkYnVzLnNlcnZpY2UuQnVzTmFtZQorLSBkYnVzLnNlcnZpY2UuT2JqZWN0IGhhcyBzd2FwcGVkIHRoZSBidXNfbmFtZSBhbmQgb2JqZWN0X3BhdGggY29uc3RydWN0b3IKKyAgcGFyYW1ldGVycyB0byBtYWtlIGl0IGVhc2llciB0byBkbyBpbmhlcml0YW5jZSBvdmVyIHRoZSBidXMKKy0gZGJ1cy5nbGliIGhhcyBiZWVuIHNlcGVyYXRlZCBvdXQgaW4gb3JkZXIgdG8gbGVzc2VuIHRoZSBkZXBlbmRlbmN5IG9uIGdsaWIKKyAgYW5kIHRvIGFsbG93IG90aGVyIG1haW5sb29wcyB0byBiZSBpbnRlZ3JhdGVkIHdpdGggdGhlIGJpbmRpbmdzIGluY2x1ZGluZworICBhIHBsYW5uZWQgZ2VuZXJpYyBtYWlubG9vcCBmb3Igbm9uLWd1aSBhcHBzLgorLSBQeXRob24gYmluZGluZ3Mgbm93IGFxdWlyZSB0aGUgR0lMIHdoZW4gY2FsbGluZyBiYWNrIGludG8gdGhlIHB5dGhvbgorICBpbnRlcnByZXRlci4gIEZpeGVzIGNyYXNoZXMgd2hlbiB1c2luZyB0aHJlYWRpbmcgYW5kIG90aGVyIHJhbmRvbSBzZWdmYXVsdHMuCistIE5ldyBQeXRob24gdHV0b3JpYWwKKy0gTnVtZXJvdXMgRC1CdXMgYnVnIGZpeGVzIGFsbCBhcm91bmQKKworRC1CVVMgMC4zNCAoMTUgSnVuZSAyMDA1KQorPT09CistIGRidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0IGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgZGJ1c19jb25uZWN0aW9uX2Nsb3NlCistIFRoZSBidXMgY2FuIG5vdyB1c2UgRF9OT1RJRlkgKGlmIGF2YWlsYWJsZSkgdG8gY2hlY2sgd2hlbiBjb25maWd1cmF0aW9uIGZpbGVzIAorICBoYXZlIGNoYW5nZWQgYW5kIHJlbG9hZCB0aGVtCistIE5ldyBkYnVzX21lc3NhZ2VfaGFzX3BhdGgvbWVtYmVyL2ludGVyZmFjZSBBUEkgYWRkZWQKKy0gVGhlIFBpbmcgbWVzc2FnZSBmcm9tIHRoZSBvcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyIGludGVyZmFjZSBpcyBub3cgaGFuZGxlZAorLSBDb21wbGV0ZSBnbGliIGJpbmRpbmdzIG92ZXJoYXVsIChhbmQgYXJlIHN0aWxsIHVuZGVyIGNvbnN0cnVjdGlvbikKKy0gVHV0b3JpYWwgbm93IGhhcyBhbiB1cGRhdGVkIEdMaWIgc2VjdGlvbiAKKy0gR0xpYiBiaW5kaW5ncyBjYW4gbm93IHNlbmQvcmVjZWl2ZSBoYXNoIHRhYmxlcywgYXJyYXlzIGFuZCBvdGhlciBjb21wbGV4IHR5cGVzCistIFB5dGhvbiBiaW5kaW5ncyBvdmVyaGF1bCAobW9zdCBwdWJsaWMgZmFjaW5nIEFQSSdzIGRvbmUpCistIFB5dGhvbiBiaW5kaW5ncyBoYXZlIGJlZW4gc3BsaXQgdXAgaW50byBzZXBhcmF0ZSBmaWxlcworLSBQeXRob24gYWRkZWQgbmV3IHR5cGUgY2xhc3NlcyBmb3IgaGludGluZyB0byB0aGUgbWFyc2hhbGVyIHdoYXQgdHlwZQorICB0byBzZW5kIG92ZXIgdGhlIHdpcmUKKy0gUHl0aG9uIGJpbmRpbmdzIG5vdyBoYXZlIGRlY29yYXRvcnMgZm9yIHNwZWNpZnlpbmcgZXhwb3J0ZWQgbWV0aG9kcyBhbmQgc2lnbmFscworLSBOdW1lcm91cyBidWcgZml4ZXMKKworRC1CVVMgMC4zMyAoMjUgQXByIDIwMDUpCis9PT0KKworLSBkb3duZ3JhZGUgcmVxdWlyZW1lbnQgZnJvbSBHVEsrLTIuNiB0byAyLjQgZm9yIGJ1aWxkaW5nIGd0ayBjb21wb25lbnRzCistIHB5dGhvbiBiaW5kaW5nIEFQSSdzIGhhdmUgYmVlbiBvdmVyaGFsbGVkIHRvIGJlIG1vcmUgInB5dGhvbmljIiBhbmQgY2xlYW5lcgorLSBweXRob24gYmluZGluZ3Mgbm93IGV4cG9ydCBkYnVzLnZlcnNpb24gd2hpY2ggaXMgc2V0IHRvICgwLDQwLDApCistIHB5dGhvbiBiaW5kaW5ncyBub3cgaW1wbGVtZW50IHRoZSBvcmcuZnJlZWRlc2t0b3AuREJ1cy5JbnRyb3NwZWN0YWJsZSBpbnRlcmZhY2UKKy0gcHl0aG9uIGJpbmRpbmcgbWF0Y2ggcnVsZXMgYXJlIG5vdyBtb3JlIGZsZXhhYmxlCistIG1ha2UgY2hlY2sgaGFzIGJlZW4gZml4ZWQKKy0gbWFueSwgbWFueSBtYWpvciBidWcgZml4ZXMKKworRC1CVVMgMC4zMiAoMjkgTWFyIDIwMDUpCis9PT0KKworLSBtb25vIGJpbmRpbmdzIG5vdyBjb21waWxlcyBjb3JyZWN0bHkKKy0gbW9ubyBiaW5kaW5nIGNsZWFudXBzCistIGdsaWIgYmluZGluZ3MgZ2VuZXJhdGVzIHdyYXBwZXJzIGZvciBidXMgbWV0aG9kcyBpbiBkYnVzLWdsaWItYmluZGluZ3MuaAorLSBnbGliIGJpbmRpbmcgY2xlYW51cworLSB1c2VycyBhbmQgZ3JvdXBzIGNhbiBub3cgYmUgc3BlY2lmaWVkIGJ5IFVJRCBhbmQgR0lEIGluIGNvbmZpZyBmaWxlcworLSBudW1lcm91cyBtZW1vcnkgbGVhayBmaXhlcworLSB2YXJpb3VzIG90aGVyIGZpeGVzCisKK0QtQlVTIDAuMzEgKDA3IE1hciAyMDA1KQorPT09CisKKy0gbGFuZCB0aGUgbmV3IG1lc3NhZ2UgYXJncyBBUEkgYW5kIHJlY3Vyc2l2ZSB0eXBlIHN5c3RlbQorLSBhZGQgZG9jcyBhbmQgZml4ZWQgRG94eWdlbiB3YXJuaW5ncyB0aHJvdWdodCBzb3VyY2UKKy0gc3BsaXQgb3V0IHNvbWUgZnVuY3Rpb25zIG5vdCBuZWVkZWQgaW4gbGliZGJ1cyB0byAqLXV0aWwuYyBzb3VyY2UgZmlsZXMKKy0gdGFrZSBvdXQgdHlwZSBjb252aWVuaWVuY2UgZnVuY3Rpb25zCistIGxpYmRidXMgbm93IGJhY2sgYmVsb3cgMTUwSworLSBib29sZWFucyBhcmUgbm93IDMyLWJpdCBpbnN0ZWFkIG9mIDgtYml0CistIHNwZWNpZmljYXRpb24gdXBkYXRlZAorLSBncmFuZCByZW5hbWluZyB0byBzdHJpcCBvdXQgdGhlIHVzZSBvZiAic2VydmljZSIKKyAganVzdCBzYXkgIm5hbWUiIGluc3RlYWQgKG9yICJidXMgbmFtZSIgd2hlbiBhbWJpZ3VvdXMpCistIHJlbmFtZSBkYnVzLWRhZW1vbi0xIHRvIGRidXMtZGFlbW9uIHRocm91Z2hvdXQKKy0gcmVuYW1lIGFjdGl2YXRpb24gdG8gYXV0by1zdGFydAorLSBhdXRvLXN0YXJ0IG9uIGJ5IGRlZmF1bHQgbm93CistIG5vdGUgdGhhdCBsaWJkYnVzIGlzIHRoZSBsb3ctbGV2ZWwgQVBJCistIHB5dGhvbiBiaW5kaW5ncyB1cGRhdGVkIHRvIHRoZSBuZXcgQVBJCistIG1vbm8gYmluZGluZ3MgdXBkYXRlZCB0byB0aGUgbmV3IEFQSQorLSBhZGQgMTYgYml0IHR5cGVzCistIGRpY3Rpb25hcmllcyBhcmUgbm93IEFSUkFZUyBvZiBESUNUX0VOVFJZCistIGRidXMtZ2xpYi10b29sIHJlbmFtZWQgdG8gZGJ1cy1iaW5kaW5nLXRvb2wKKy0gbWFzc2l2ZSByZXdyaXRlIG9mIHRoZSBnbGliIGJpbmRpbmdzCistIHNhbmVyIG5hbWVzIGZvciB0aGUgZGJ1cyBpbnRlcmZhY2UsIG9iamVjdCBwYXRoIGFuZCBzZXJ2aWNlIGRlZmluZXMKKy0gbmV3IGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgdHlwZSBzaWduaXR1cmVzCistIGJ1bXAgc29uYW1lcyBmb3IgbGliZGJ1cyBhbmQgbGliZGJ1cy1nbGliCistIHZhcmlvdXMgc21hbGwgZml4ZXMKKworRC1CVVMgMC4yMyAoMTEgSmFuIDIwMDUpCis9PT0KKworLSBhZGQgc2V0Z3JvdXBzKCkgdG8gZHJvcCBzdXBwbGVtZW50YXJ5IGdyb3VwcworLSB1cGRhdGVkIFNFTGludXggc3VwcG9ydAorLSBhZGQgYW4gImF0IGNvbnNvbGUiIHNlY3VyaXR5IHBvbGljeQorLSBmaXggYSBidWcgd2hlcmUgb3JnLmZyZWVkZXNrdG9wLkRCdXMgd2Fzbid0IHJlY29nbml6ZWQgYXMgYW4gZXhpc3RpbmcKKyAgc2VydmljZS4KKy0gZXJyb3Igb3V0IGlmIC0tZW5hYmxlLW1vbm8gaXMgZXhwbGljaXRseSBzZXQgYW5kIG1vbm8gbGlicyBjYW4ndCBiZSBmb3VuZAorLSBzZXQgdGhlIG1heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbiBsaW1pdCBmcm9tIHRoZSBjb25maWcgZmlsZS4KKy0gcmVtb3ZlZCBkYnVzX2J1Z19nZXRfd2l0aF9nX21haW4gc2luY2UgaXQncyBiZWVuIHJlcGxhY2VkIGJ5CisgIGRidXNfZ19idXNfZ2V0CistIGZpeCBmZCBsZWFrcyBpbiBzb2NrZXQgY29kZQorLSBsb3RzIGFuZCBsb3RzIG9mIG1vbm8gYmluZGluZyB1cGRhdGVzLCBpbmNsdWRpbmcgZml4ZXMgdG8gbWFrZSBpdAorICBjb21wYXRpYmxlIHdpdGggTW9ubyAxLjEuMworLSBhZGRlZCAtLW5vZm9yayBvcHRpb24gdG8gb3ZlcnJpZGUgY29uZmlnIGZpbGUgc2V0dGluZyBhdCBydW50aW1lCistIGFkZGVkIHN1cHBvcnQgZm9yIGludDY0IGFuZCB1aW50NjQgdG8gdGhlIHB5dGhvbiBiaW5kaW5ncworLSBsb3RzIG9mIHB5dGhvbiBiaW5kaW5nIHVwZGF0ZXMKKy0gY29uZmlnIGZpbGUgRFREIHVwZGF0ZXMKKy0gdXNlIFNlcml2Y2VPd25lckNoYW5nZXMgc2lnbmFsIGluc3RlYWQgb2YgU2VydmljZUNyZWF0ZWQgYW5kCisgIFNlcnZpY2VEZWxldGVkCistIGZpeGVzIHRvIHRoZSBhdXRoZW50aWNhdGlvbiBjb2RlCistIG5ldyBpbml0IHNjcmlwdCBmb3IgU2xhY2t3YXJlCistIHByaW50IG91dCB0aGUgcGlkIGV2ZW4gd2hlbiAtLWZvcmsgaXMgcGFzc2VkCistIGluY3JlYXNlIHByZWFsbG9jYXRpb24gc2l6ZXMgaW4gREJ1c01lc3NhZ2UgdG8gaGVhdmlseSByZWR1Y2UKKyAgcmVhbGxvY3MKKy0gbG90cyBvZiBwZXJmb3JtYW5jZSBlbmhhbmNlbWVudHMKKy0gbG90cyBtb3JlIHNtYWxsIGJ1ZyBmaXhlcworCitELUJVUyAwLjIyCis9PT0KKworLSBhZGQgLS1yZXBseS10aW1lb3V0IHRvIGRidXMtc2VuZAorLSBmaXggYSBtZW1sZWFrCistIGZpeCBTb2xhcmlzL0ZvcnRlIGJ1aWxkCistIHN3aXRjaCB0byBBRkwgMi4xIHJhdGhlciB0aGFuIDIuMCB0byBhZGRyZXNzIHBhdGVudCB0ZXJtaW5hdGlvbiBjbGF1c2UgCisgIGNvbmNlcm5zCistIGFkZCBTRUxpbnV4IHN1cHBvcnQKKy0gbW9zdGx5IHJlcGFpciBsaWJ4bWwgYmFja2VuZCBmb3IgY29uZmlnIHBhcnNlciwgc3RpbGwgZG9lc24ndCAKKyAgcGFzcyBvdXQgb2YgbWVtb3J5IHRlc3RzCistIGZpeCBkaXN0Y2hlY2sgdG8gaW5jbHVkZSBsYW5ndWFnZSBiaW5kaW5ncworLSBhZGQgR2V0Q29ubmVjdGlvblVuaXhVc2VyIG1ldGhvZCBvbiBidXMgZHJpdmVyCistIGFsc28gZm9yIFVuaXhQcm9jZXNzSUQKKy0gbG90cyBvZiBQeXRob24sIE1vbm8sIG90aGVyIGJpbmRpbmcgZml4ZXMKKy0gY2hhbmdlIEdMaWIgYmluZGluZ3MgdG8gbm90IGluY2x1ZGUgZGJ1cy9kYnVzLmggKGZ1bGx5IGVuY2Fwc3VsYXRlIGxpYmRidXMpCistIHBhc3MgcGF0aHMgYXMgc3RyaW5ncywgbm90IGFycmF5cyBvZiBzdHJpbmcKKy0gYWRkIG1lc3NhZ2Ugc2lnbmF0dXJlIGhlYWRlciBmaWVsZAorLSBjbGVhbnVwcyB0byBtYXJzaGFsaW5nIGNvZGUKKy0gY2xlYW4gdXAgYXV0aGVudGljYXRpb24gY29kZQorLSByZWxvYWQgY29uZiBmaWxlcyBvbiBTSUdIVVAKKy0gcmVuYW1lIFNFUlZJQ0UvU0VOREVSX1NFUlZJQ0UgdG8gREVTVElOQVRJT04vU0VOREVSCistIGZpeCBjaXJjdWxhciBjb25mIGZpbGUgaW5jbHVzaW9uCistIGFsbG93IGVtcHR5IGFycmF5cworLSB0b25zIG9mIG90aGVyIHNtYWxsIGJ1Z2ZpeGVzCisKK0QtQlVTIDAuMjEKKz09PQorCistIGltcGxlbWVudCAiYXV0byBhY3RpdmF0aW9uIiBmbGFnIG9uIG1lc3NhZ2VzLCBzbyB0aGUgZGVzdGluYXRpb24gCisgIHNlcnZpY2UgY2FuIGJlIGxhdW5jaGVkIGF1dG9tYXRpY2FsbHkKKy0gZml4IGEgYnVnIGluIGN1c3RvbSB0eXBlIG1hcnNoYWxpbmcKKy0gb3B0aW1pemUgY2FzZSB3aGVyZSBtdWx0aXBsZSBhcHBzIGFjdGl2YXRlIHRoZSBzYW1lIHNlcnZpY2UKKyAgKGF2b2lkICJ0aHVuZGVyaW5nIGhlcmQiKQorLSBhZGQgZHluYW1pYyBzZXJ2aWNlIGZpbGUgZGlzY292ZXJ5L3JlbG9hZGluZworLSBmaXggYSBidXN5IGxvb3Agd2hlbiBibG9ja2luZyBmb3IgYSByZXBseQorLSBmaXggYSA2NC1iaXQgY3Jhc2ggaW52b2x2aW5nIHZhcmFyZ3MKKy0gZml4IGEgYnVzIGNyYXNoIHdoZW4gcHJvY2Vzc2luZyBhbiBBY3F1aXJlU2VydmljZQorLSBhbGxvdyBhcHBlbmRpbmcgVFlQRV9CWVRFIHZpYSBhcHBlbmRfYXJnc192YWxpc3QKKy0gZml4IGRpY3RzLWluc2lkZS1kaWN0cworLSBlbmhhbmNlbWVudHMgdG8gUHl0aG9uIGFuZCBRdCBiaW5kaW5ncworCitELUJVUyAwLjIwCis9PT0KKworVGhpcyByZWxlYXNlIGxhbmRzIHNvbWUgdmVyeSBsYXJnZSBBUEkgY2hhbmdlcyBhbmQgbnVtZXJvdXMgYnVnZml4ZXMuCitUaGUgbGlzdCBvZiBjaGFuZ2VzIGlzIHRvbyBsYXJnZSB0byBmdWxseSBkb2N1bWVudCBoZXJlOyBwbGVhc2UgcmVmZXIKK3RvIHRoZSBkb2N1bWVudGF0aW9uLCBhbmQgbWVzc2FnZS1idXMtbGlzdCBhcmNoaXZlcy4KKworRC1CVVMgMC4xMworPT09CisKK1RoaXMgaXMgcHJvYmFibHkgdGhlIGxhc3QgcmVsZWFzZSBiZWZvcmUgbGFuZGluZyB0aGUgbGFyZ2UgQVBJIGNoYW5nZXMKK29uIHRoZSAiZGJ1cy1vYmplY3QtbmFtZXMiIGJyYW5jaC4KKworLSBmaXggc3lzdGVtIGJ1cyB0byBhbHdheXMgdXNlIGZpbGVzeXN0ZW0gc29ja2V0OyBhbnlvbmUgCisgIGNhbiBjcmVhdGUgYW55IGFic3RyYWN0IHNvY2tldCwgd2hpY2ggaXNuJ3Qgc2VjdXJlIAorICBzaW5jZSBpZiB5b3UgY2FuIGNyYXNoIHRoZSBzeXN0ZW0gYnVzIHlvdSdkIGJlIGFibGUKKyAgdG8gcmVwbGFjZSBpdC4KKy0gYWRkIERURCBmb3IgY29uZmlndXJhdGlvbiBmaWxlCistIGltcHJvdmUgc3BlY2lmaWNhdGlvbiBhIGJpdAorCitELUJVUyAwLjEyCis9PT0KKworLSBmaXggInNlcnZpY2UgbWVzc2FnZWJ1cyBzdGF0dXMiIG9uIFJlZCBIYXQKKy0gZml4IGRlbWFyc2hhbGluZyBvZiBEQlVTX1RZUEVfTkFNRUQKKy0gZml4ICJldmFsIGBkYnVzLWxhdW5jaCAtLWV4aXQtd2l0aC1zZXNzaW9uYCIgdG8gZXhpdCBwcm9wZXJseQorLSBmaXggYnVpbGQgd2l0aG91dCAtLXByZWZpeAorLSB1c2VsZXNzIGZvb2xpbmcgd2l0aCBNb25vIGJpbmRpbmdzCistIHVzZWxlc3MgZm9vbGluZyB3aXRoIGdjaiBiaW5kaW5ncworLSBmaXggc3JjZGlyICE9IGJ1aWxkZGlyCistIGZpeCB2YXJpb3VzIGNvbXBpbGVyIHdhcm5pbmdzIGFuZCBvdGhlciBpc3N1ZXMKKy0gYWRkIGdldC9zZXQgZGF0YSB0byBEQnVzTWVzc2FnZQorLSBmaXggaGVhZGVycyBmb3IgQysrCistIE9TIFggYnVpbGQgZml4ZXMKKy0gYWJzdHJhY3QgZG9tYWluIHNvY2tldHMgc3VwcG9ydCAoTGludXggb25seSkKKy0gYWRkIGRidXMtY2xlYW51cC1zb2NrZXRzIHV0aWxpdHkgZm9yIHBlb3BsZQorICBub3QgdXNpbmcgbGludXgKKy0gYmUgY29uc2lzdGVudCBhYm91dCBkZWZhdWx0aW5nIHRvIC0tc2Vzc2lvbi8tLXN5c3RlbSAKKyAgd2l0aCBjb21tYW5kIGxpbmUgdG9vbHMKKy0gbWVyZ2UgaW4gcG9saWNpZXMgZnJvbSBpbmNsdWRlZCBjb25maWcgZmlsZXMKKy0gZml4IGJ1aWxkIG9uIG5vbi14ODYKKy0gZG9jcyB1cGRhdGVzCistIGxvdHMgb2Ygb3RoZXIgYnVnZml4ZXMKKworRC1CVVMgMC4xMQorPT09CisKKy0gYWRkIC0tZW5hYmxlLWRvY3MgdG8gdHVybiBvZmYvb24gdGhlIGRvY2Jvb2sgc3R1ZmYKKyAgKGRvZXNuJ3QgY292ZXIgZG94eWdlbiBzdHVmZiB5ZXQpCistIG1ha2UgcGVvcGxlIGRlZmluZSBEQlVTX0FQSV9TVUJKRUNUX1RPX0NIQU5HRQorICBhbmQgcmVhZCB3YXJuaW5nIGluIFJFQURNRSBzbyB0aGV5IGRvbid0IAorICBleHBlY3QgdGhlIEFQSSB0byBiZSBmcm96ZW4gYWxyZWFkeQorLSByZW5hbWUgLnBjIGZpbGVzIHRvICJkYnVzLTEucGMiIGluc3RlYWQgb2YgCisgICJkYnVzLTEuMC5wYyIgZXRjLiAtIHRoaXMgd2lsbCByZXF1aXJlIGNoYW5naW5nIAorICBwa2ctY29uZmlnIGludm9jYXRpb25zCistIHNvbWUgZG9jcyBjbGVhbnVwcworLSBhZGQgbWFuIHBhZ2VzIGZvciBhbGwgZXhlY3V0YWJsZXMKKy0gYWxsb3cgc2VuZCB0by9mcm9tIGJ1cyBkcml2ZXIgaW4gdGhlIGRlZmF1bHQgc3lzdGVtLmNvbmYKKy0gZml4IHVzZXIgbG9va3VwIGJ1ZworLSBpbXBsZW1lbnQgZGJ1cy1sYXVuY2ggdG8gbGF1bmNoIHRoZSBzZXNzaW9uIG1lc3NhZ2UgYnVzCistIGZpeCBzb21lIHRocmVhZCBkZWFkbG9ja3MKKy0gc29tZSBwZXJmb3JtYW5jZSBwcm9maWxpbmcvb3B0aW1pemF0aW9uCistIGFkZCBkYnVzX2J1c19hY3RpdmF0ZV9zZXJ2aWNlKCkgZnVuY3Rpb24KKy0gZml4IHNvbWUgbWlub3IgYnVncyBoZXJlIGFuZCB0aGVyZQorLSBpbnN0YWxsIFJlZCBIYXQgaW5pdHNjcmlwdCBpbiB0aGUgcmlnaHQgcGxhY2UKKworRC1CVVMgMC4xMAorPT09CisKKy0gcmV2ZXJzZWQgb3JkZXIgb2YgYXJncyB0byBkYnVzX21lc3NhZ2VfbmV3KCkKKy0gcmVuYW1lZCBkYnVzX21lc3NhZ2VfbmFtZV9pcygpIGFuZCBzb21lIG90aGVyCisgIGZ1bmN0aW9ucworLSBjaGFuZ2UgREJ1c1dhdGNoIHRvIGhhdmUgZGJ1c193YXRjaF9oYW5kbGUoKSAKKyAgc2ltaWxhciB0byBkYnVzX3RpbWVvdXRfaGFuZGxlKCksIGRyb3AgCisgIGNvbm5lY3Rpb24vc2VydmVyLXNwZWNpZmljIGhhbmRsZSByb3V0aW5lcworLSBjaGFuZ2UgbWVzc2FnZSBzZXJpYWxzIHRvIGJlIHVuc2lnbmVkCistIGltcGxlbWVudGVkIDxhbGxvdz4vPGRlbnk+LzxsaW1pdD4gZmVhdHVyZXMgZm9yIAorICBjb25maWcgZmlsZTsgc3lzdGVtIGJ1cyBub3cgaGFzIGEgZGVueS1hbGwgcG9saWN5IAorICBieSBkZWZhdWx0LgorLSBzeXN0ZW0uY29uZiBoYXMgPGluY2x1ZGVkaXI+c3lzdGVtLmQ8L2luY2x1ZGVkaXI+CisgIHNvIHBhY2thZ2VzIGNhbiBpbnN0YWxsIGFkZGl0aW9ucyB0byB0aGUgZGVmYXVsdCAKKyAgcG9saWN5IHRvIDxhbGxvdz4gdGhlIG1lc3NhZ2VzIHRoZXkgbmVlZC4gZS5nLgorICBDVVBTIG1pZ2h0IGluc3RhbGwgYSBjdXBzLmNvbmYgLSBzZWUgCisgIHRlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvc3lzdGVtLmQvdGVzdC5jb25mIAorICBmb3IgYW4gZXhhbXBsZS4KKy0gYWRkIHRpbWVvdXRzIGZvciBhdXRoZW50aWNhdGlvbiwgYWN0aXZhdGlvbgorLSBhZGQgZ2xpYi1zdHlsZSAiY2hlY2tzIiBvbiBwdWJsaWMgQVBJLCBlbmFibGUgCisgIHRob3NlIGJ5IGRlZmF1bHQsIGRpc2FibGUgYXNzZXJ0aW9ucyBieSBkZWZhdWx0CistIGFkZCBHTWFpbkNvbnRleHQgYXJndW1lbnQgdG8gR0xpYiBzZXR1cCBmdW5jdGlvbnMsIAorICBjYW4gYmUgTlVMTCBmb3IgZGVmYXVsdCBjb250ZXh0LiBOZWVkZWQgZm9yIHRocmVhZHMuCistIGFkZCA2NC1iaXQgaW50ZWdlciB0eXBlCistIHZhbGlkYXRlIHR5cGUgb2Ygc3RhbmRhcmQgbWVzc2FnZSBoZWFkZXIgZmllbGRzCistIGNvbnNpZGVyIG1lc3NhZ2VzIGluIHRoZSBvcmcuZnJlZWRlc2t0b3AuTG9jYWwKKyAgbmFtZXNwYWNlIHRvIGJlIGludmFsaWQgKHRvIGF2b2lkIGZha2UgZGlzY29ubmVjdCAKKyAgbWVzc2FnZXMgZm9yIGV4YW1wbGUpCistIGZpeCBhc3NvcnRlZCBtZW1vcnkgbGVha3MgYW5kIG90aGVyIGJ1Z3MgaW4gCisgIHRoZSBTSEEtMSBhdXRoIG1lY2hhbmlzbQorLSBjYWNoZSB1c2VyIGRhdGFiYXNlIGluZm9ybWF0aW9uIChncm91cHMgdXNlciBpcyAKKyAgaW4sIGV0Yy4pIGhlbHBzIGEgbG90IHdpdGggTklTCistIGFsd2F5cyBzdG9yZSB1aWRfdCwgcGlkX3QsIGdpZF90IGluICJ1bG9uZyIgCisgIHJhdGhlciB0aGFuICJpbnQiCistIGltcGxlbWVudCBjb25maWcgZmlsZSBzZXR0aW5ncyBmb3Igd2hpY2ggCisgIHVzZXJzIGNhbiBjb25uZWN0CistIFNIQS0xIHVuaXQgdGVzdAorLSBkYnVzLXNlbmQsIGRidXMtbW9uaXRvciBjb21tYW5kIGxpbmUgdXRpbGl0aWVzCistIGZpeGVkIGxvdHMgb2YgbWlzYyBjcmFzaGVzIGFuZCBvdGhlciBidWdzCisKK0QtQlVTIDAuOQorPT09CisKKy0gaW1wbGVtZW50ZWQgYSB0ZXN0IGNhc2UgZm9yIHNlcnZpY2UgYWN0aXZhdGlvbiwKKyAgYW5kIGZpeGVkIG1hbnkgYnVncyBleHBvc2VkIGJ5IHRoYXQKKy0gaW1wbGVtZW50ZWQgcmVjdXJzaXZlIGFyZ3VtZW50IG1hcnNoYWxpbmcvZGVtYXJzaGFsaW5nIAorICBmb3IgbWVzc2FnZXMsIGFsbG93aW5nIG11bHRpZGltZW5zaW9uYWwgYXJyYXlzCistIGZpeGVkIHVwIGludGVncmF0aW9uIG9mIG1lc3NhZ2UgZGlzcGF0Y2ggd2l0aCAKKyAgbWFpbiBsb29wIGJ5IGFkZGluZyBhIGNhbGxiYWNrIG9uIGNoYW5nZSBvZiAKKyAgZGlzcGF0Y2ggc3RhdHVzCistIGFkZCBhIHBpZGZpbGUgZmVhdHVyZSB0byBkYWVtb24KKy0gc29tZSBidWlsZCBmaXhlcworLSBjbGVhbiB1cCB1bml4IGRvbWFpbiBzb2NrZXRzIG9uIGV4aXQKKy0gYWRkIC0tcHJpbnQtYWRkcmVzcyBhbmQgdGhlIGFiaWxpdHkgCisgIHRvIGNyZWF0ZSBhIHJhbmRvbSBzZXJ2ZXIgYWRkcmVzcyAKKyAgaW4gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5CisKK0QtQlVTIDAuOAorPT09CisKKy0gZml4IGR1bWIgYnVnIGluIDAuNworCitELUJVUyAwLjcKKz09PQorCistIGltcGxlbWVudCBjb25maWd1cmF0aW9uIGZpbGUgdXNlZCB0byBjb250cm9sIGJ1cyBjaGFyYWN0ZXJpc3RpY3MKKy0gaW1wbGVtZW50IGRhZW1vbiBtb2RlLCBjaGFuZ2luZyB1c2VyIElELCBhbmQgb3RoZXIgc3lzdGVtCisgIGJ1cyBmZWF0dXJlcworLSBhZGQgaW5pdCBzY3JpcHRzIGZvciBzeXN0ZW13aWRlIGJ1cworLSBhZGQgIm1ha2UgY2hlY2stY292ZXJhZ2UiIHRhcmdldCB0byBjaGVjayB0ZXN0IGNvdmVyYWdlCistIG1vcmUgdGVzdCBzdWl0ZSBhZGRpdGlvbnMKKy0gbWFueSwgbWFueSBidWdmaXhlcworLSBtYW55IEFQSSBjaGFuZ2VzL2ZpeGVzCisKK0QtQlVTIDAuNgorPT09CistIFZhc3RseSBpbXByb3ZlZCBidXMgZGFlbW9uIHRlc3Qgc3VpdGUKKy0gTG90cyBvZiBtaXNjLiBidWdmaXhlcyBhbmQgbWVtb3J5IGxlYWsgZml4ZXMKKy0gU3VwcG9ydCBmb3IgbWFyc2hhbGxpbmcga2V5L3ZhbHVlIGRhdGEKKy0gQWN0aXZhdGlvbiBpbXByb3ZlbWVudHMuCisKK0QtQlVTIDAuNQorPT09CisKKy0gU3BlY2lmaWNhdGlvbiB1cGRhdGVzCistIHBvcnQgdG8gT1MgWCBhbmQgb3RoZXIgQlNEIHZhcmlhbnRzCistIHBvcnQgdG8gU29sYXJpcworLSBQYXJ0aWFsIHdvcmsgb24gY29va2llLWJhc2VkIGF1dGhlbnRpY2F0aW9uCistIFRocmVhZCBzYWZldHkgZml4ZXMKKy0gTG90cyBvZiBtaXNjLiBidWdmaXhlcworLSBTdXBwb3J0IGZvciBtb3JlIGFycmF5IHR5cGVzCistIEFkZCBkYXRhIHNsb3RzIHRvIERCdXNTZXJ2ZXIKKy0gREJ1c1N0cmluZyBzZWN1cml0eSBhdWRpdCBmaXhlcworLSBGaXggZm9yIHN5c3RlbXMgKG9yIHZhbGdyaW5kKSB3aXRoIHVuYWxpZ25lZCBtYWxsb2MgYmxvY2tzCisKK0QtQlVTIDAuNAorPT09CisKKy0gUHJlbGltaW5hcnkgYWN0aXZhdGlvbiBzdXBwb3J0LgorLSBCZXR0ZXIgYXV0aGVudGljYXRpb24gdGVzdCBzdWl0ZQorLSBCdXMgdGVzdCBwcm9ncmFtCistIFNwZWNpZmljYXRpb24gdXBkYXRlcworLSBUaHJlYWQgc2FmZXR5CistIEJ1ZyBmaXhlcworCitELUJVUyAwLjMKKz09PQorCisgLSBQcmVsaW1pbmFyeSBsaW1pdGF0aW9ucyAKKyAtIE1lc3NhZ2Ugc2VuZGluZyB3b3JrcworIC0gQnVzIGNsaWVudAorIC0gQXJyYXkgbWFyc2hhbGxpbmcvZGVtYXJzaGFsbGluZworIC0gU2VydmljZXMKKyAtIEJldHRlciBPT00gaGFuZGxpbmcgaW4gdGhlIGJ1cworIC0gSW4tcHJvYyBkZWJ1ZyB0cmFuc3BvcnQKKyAtIFRyYW5zcG9ydC9zZXJ2ZXIgYWRkcmVzcyBzdXBwb3J0CisKK0QtQlVTIDAuMgorPT09CisKKyAtIEluY2x1ZGUgdGVzdCBjb2RlIGluIHRoZSB0YXJiYWxsLgorCitELUJVUyAwLjEKKz09PQorCisgLSBJbml0aWFsIHJlbGVhc2UuCmRpZmYgLS1naXQgYS9kYnVzL05FV1MucHJlLTEtMiBiL2RidXMvTkVXUy5wcmUtMS0yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ODk4ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL05FV1MucHJlLTEtMgpAQCAtMCwwICsxLDE1MyBAQAorRC1CdXMgMS4yLjEgKDA0IEFwcmlsKQorPT0KKy0gRHVlIHRvIGlzc3VlcyBwdXR0aW5nIHRoZSByZS1saWNlbnNpbmcgZWZmb3J0IG9uIGhvbGQgaW5kZWZpbml0ZWx5LCBpdCBoYXMgCisgIGJlZW4gZGVjaWRlZCB0byBtb3ZlIHRvIDEuMi54IHZlcnNpb25pbmcgc2NoZW1lLiAgQmVpbmcgdGhhdCAxLjEuMjAgaXMgCisgIGNvbnNpZGVyZWQgdG8gYWxzbyBiZSAxLjIuMCBhbmQgdGhpcyBiZWluZyB0aGUgc2Vjb25kIHJlbGVhc2UgaW4gdGhlIDEuMi54IAorICBzdGFibGUgc2VyaWVzIHdlIGhhdmUgdmVyc2lvbmVkIHRoaXMgcmVsZWFzZSAxLjIuMS4gVGhpcyByZWxlYXNlIGNvbnRhaW5zIGEgCisgIG51bWJlciBvZiBidWcgZml4ZXMgaWRlbnRpZmllZCBhZnRlciAxLjEuMjAuCistIGNvbXBpbGVzIHVuZGVyIHNvbWUgb2xkZXIgdmVyc2lvbnMgb2YgZ2xpYmMKKy0gY29tcGlsZXMgd2l0aG91dCBYIHN1cHBvcnQgb25jZSBhZ2FpbgorLSBmaXggc3R1Y2sgc2VydmVyIGdyYWIgaWYgZGJ1cy1sYXVuY2ggaXMgcnVuIGluIGFuIGV4aXN0aW5nIEQtQnVzIFggc2Vzc2lvbgorLSB2YXJpb3VzIE1hYyBPU1ggYnVpbGQgZml4ZXMgYWRkZWQKKy0gZG9uJ3QgdXNlIHRoZSBicm9rZW4gcG9sbCBjYWxsIG9uIE1hYyBPU1gKKy0gYmV0dGVyIGNoZWNrcyBmb3IgbGlua2VyIGZsYWcgc3VwcG9ydCBzaG91bGQgYWxsb3cgRC1CdXMgdG8gbGluayB1bmRlcgorICB2YXJpb3VzIGxpbmtlcnMKKy0gZXhpdF9vbl9kaXNjb25uZWN0IGlzIHNldCBhZnRlciB0aGUgY29ubmVjdGlvbiByZWdpc3RlcnMgd2l0aCBhIGJ1cyBzbyB3ZSAKKyAgZG9uJ3QgZXhpdCBpZiB3ZSBnZXQgYSBkaXNjb25uZWN0IGR1cmluZyB0aGUgaGFuZHNoYWtlCistIGRpY3RzIG5vdyB3b3JrIGNvcnJlY3RseSB3aXRoIGRidXMtc2VuZAorLSBpbm90aWZ5IGJhY2tlbmQgaXMgbm93IGxlc3MgYWdncmVzc2l2ZQorLSBwZW5kaW5nIGNhbGxzIGV4cGlyZSBjb3JyZWN0bHkKKy0gbWVtbGVhayBvZiB1dWlkIHdoZW4gdGhlIGJ1cyBpcyBhdXRvbGF1bmNoZWQgZml4ZWQKKworRC1CdXMgMS4xLjIwIC0gIkNvbmlzdGVuIFdhdGVyIiAoMjcgRmVidWFyeSkKKz09CisKKy0gVGhpcyBpcyB0aGUgbmV4dCBnZW5lcmF0aW9uIHN1cHBvcnRlZCBTVEFCTEUgcmVsZWFzZSBvZiBELUJ1cy4gRm9yIGFsbCAKKyAgaW50ZW50cyBhbmQgcHVycG9zZXMgdGhpcyBpcyB0aGUgMS4yLjAgcmVsZWFzZSBXSVRIT1VUIHRoZSBwbGFubmVkIFgxMS9NSVQgCisgIGxpY2Vuc2UgY2hhbmdlIGR1ZSB0byBhIGNvdXBsZSBvZiBsaWNlbnNlIGhvbGRlcnMgd2hvIGhhdmUgeWV0IHRvIHJlc3BvbmQuCisgIEZvciB0aGUgbW9zdCBwYXJ0IHRoaXMgbGljZW5zZSBjaGFuZ2UgaXMgYmVpbmcgcGVyc3VlZCB0byBzaW1wbGlmeSBsaWNlbnNpbmcKKyAgaXNzdWVzIGFuZCBmaXggYSBjb3VwbGUgb2YgbGljZW5zaW5nIGNvdXJuZXIgY2FzZXMuICBXaGVuIHRoaXMgaGFwcGVucyBELUJ1cworICB3aWxsIGJlIHJlbGVhc2VkIHVuZGVyIHRoZSAxLjIuMCB2ZXJzaW9uLgorCistIEQtQnVzIDEuMC54IGVmZmVjdGl2ZWx5IGdvZXMgaW50byBzZWN1cml0eSBmaXggbW9kZSBhbmQgd2lsbCBvbmx5IGJlCisgIHVwZGF0ZWQgZm9yIG1ham9yIGlzc3Vlcy4KKworLSBGaXhlZCBDVkUtMjAwOC0wNTk1IC0gc2VjdXJpdHkgcG9saWN5IG9mIHRoZSB0eXBlIDxhbGxvdyBzZW5kX2ludGVyZmFjZT0KKyAgInNvbWUuaW50ZXJmYWNlLldpdGhNZXRob2RzIi8+IHdvcmsgYXMgYW4gaW1wbGljaXQgYWxsb3cgZm9yCisgIG1lc3NhZ2VzIHNlbnQgd2l0aG91dCBhbiBpbnRlcmZhY2UgYnlwYXNzaW5nIHRoZSBkZWZhdWx0IGRlbnkgcnVsZXMgYW5kIAorICBwb3RlbnRpYWxseSBhbGxvd2luZyByZXN0cmljdGVkIG1ldGhvZHMgZXhwb3J0ZWQgb24gdGhlIGJ1cyB0byBiZSBleGVjdXRlZAorICBieSB1bmF1dGhvcml6ZWQgdXNlcnMuIAorCistIEZpeGVzIGRidXMtbGF1bmNoIHNvIHRoZSBzZXNzaW9uIGJ1cyBnb2VzIGF3YXkgc28gZG9lcyBELUJ1cworCistIEJ1aWxkcyBhZ2FpbnN0IGxhdGVzdCBnY2MvZ2xpYmMgY2hhbmdlcworCistIENvcnJlY3RseSB1bnJlZiBjb25uZWN0aW9ucyB3aXRob3V0IGd1aWRzIGR1cmluZyBzaHV0ZG93bgorCistIEFib3V0IHRoZSBuYW1lOiBTdWJtaXR0ZWQgYnkgR3JlZyBLIE5pY2hvbHNvbiwgQ29uaXN0ZW4gV2F0ZXIgaXMgYSBsYWtlIGluIAorICBDdW1icmlhLCBFbmdsYW5kIHdoZXJlIHNldmVyYWwgd2F0ZXIgc3BlZWQgcmVjb3JkcyBoYXZlIGJlZW4gYnJva2VuLiBCZXR3ZWVuIAorICAxOTU2IGFuZCAxOTU5IFNpciBNYWxjb2xtJ3Mgc29uIERvbmFsZCBDYW1wYmVsbCBzZXQgZm91ciBzdWNjZXNzaXZlIHJlY29yZHMgb24gIHRoZSBsYWtlIGluIEJsdWViaXJkIEs3LCBhIGh5ZHJvcGxhbmUuCisgIChXaWtpcGVkaWEgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db25pc3Rvbl9XYXRlciNXYXRlcnNwZWVkX3JlY29yZCkKKworRC1CdXMgMS4xLjQgLSAxLjIuMFJDMiAoMTcgSmFudWFyeSAyMDA3KQorPT0KKy0gRml4ZXMgaW5vdGlmeSBzdXBwb3J0CisKK0QtQnVzIDEuMS4zIC0gMS4yLjBSQzEgKDE1IEphbnVhcnkgMjAwNykKKz09CisKKy0gVGhpcyByZWxlYXNlIGlzIGludGVuZGVkIHRvIGJlIFJlbGVhc2UgQ2FuZGlkYXRlIDEgb2YgbWFqb3IgcmVsZWFzZQorICBELUJ1cyAxLjIuMC4gIElmIG5vdGhpbmcgaXMgZm91bmQgdG8gYmUgd3Jvbmcgd2l0aCB0aGlzIHJlbGVhc2UgaXQKKyAgd2lsbCBiZWNvbWUgMS4yLjAgd2l0aGluIGEgd2Vlay4gIElmIHdlIG5lZWQgdG8gbWFrZSBtYWpvciBjaGFuZ2VzCisgIHdlIHdpbGwgcmVsZWFzZSBhbiBSQzIgYW5kIHN0YXJ0IHRoZSBwcm9jZXNzIG92ZXIgYWdhaW4uCisKKy0gVGhpcyBpcyBhIGRldmVsb3BtZW50IHJlbGVhc2UsIHNvIEFQSSdzIG1heSBzdGlsbCBjaGFuZ2UgaWYgcHJvYmxlbXMKKyAgYXJlIGZvdW5kICh0aG91Z2ggdGhpcyBpcyBleHRyZWFtbHkgdW5saWtlbHkpLgorCistIERURCBmb3IgdGhlIGludHJvc3BlY3Rpb24gZm9ybWF0IGlzIGZpeGVkIGFuZCB1cGxvYWRlZCB0byB0aGUgc2VydmVycworCistIFNvdXJjZXMgbm93IHJlc2lkZSBpbiBhIGdpdCByZXBvc2l0b3J5IGF0IAorICBodHRwOi8vZ2l0d2ViLmZyZWVkZXNrdG9wLm9yZy8/cD1kYnVzL2RidXMuZ2l0O2E9c3VtbWFyeQorCistIEFyZ3VtZW50IHBhdGggbWF0Y2hpbmcgb2YgdGhlIHR5cGUgYXJnMHBhdGg9Jy9hYS9iYi8nIGlzIG5vdyBzdXBwb3J0ZWQKKyAgKHNlZSB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbikKKworLSBOZXcgZXJyb3Igb3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuT2JqZWN0UGF0aEluVXNlIGFkZGVkCisKKy0gQXV0b2xhdW5jaGVkIGJ1c3NlcyBub3cgc2F2ZSB0aGVpciBwYXJhbWV0ZXJzIGluIFgxMSBpZiBwb3NzaWJsZSBtYWtpbmcgdGhlbQorICBiZWhhdmUgY2xvc2VyIHRvIGJ1c3NlcyBsYXVuY2hlZCB0aHJvdWdoIHRoZSBub3JtYWwgbWVjaGFuaXNtcyAKKworLSBpbm90aWZ5IGlzIG5vdyB0aGUgZGVmYXVsdCBiYWNrZW5kIGZvciB3YXRjaGluZyBjb25maWd1cmF0aW9uIGZpbGUgY2hhbmdlcworCistIE1vcmUgc3VwcG9ydCBmb3IgdGhlIEFJWCBwbGF0Zm9ybSBoYXMgYmVlbiBhZGRlZAorCistIE51bWVyb3VzIGJ1ZyBmaXhlcyBhbmQgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzCisKK0QtQnVzIDEuMS4yICgyNyBKdWx5IDIwMDcpCis9PQorCistIFRoaXMgcmVsZWFzZSBpcyBpbnRlbmRlZCB0byBiZSBhIGZlYXR1cmUgY29tcGxldGUgYmV0YSBmb3Igc3RhYmxlCisgIHJlbGVhc2UgMS4yLjAsIHBsZWFzZSB0ZXN0IGl0LiAxLjIuMCB3aWxsIGZvbGxvdyBwcmV0dHkgc29vbiBpZiBubworICBtYWpvciBwcm9ibGVtcyBhcmUgZm91bmQuICBXZSdsbCBkbyBtb3JlIGJldGFzIGlmIHNpZ25pZmljYW50CisgIGNoYW5nZXMgYXJlIG1hZGUuCisKKy0gVGhpcyBpcyBhIGRldmVsb3BtZW50IHJlbGVhc2UsIHNvIEFQSSdzIG1heSBzdGlsbCBjaGFuZ2UgaWYgcHJvYmxlbXMKKyAgYXJlIGZvdW5kICh0aG91Z2ggd2Ugd2lsbCB0cnkgaGFyZCBub3QgdG8pLgorCistIFRoZSBzeXN0ZW0gYnVzIG5vdyBzdXBwb3J0cyBzdGFydGluZyBzZXJ2aWNlcyBvbiBkZW1hbmQuIFRoaXMgdXNlcyBhCisgIHNldHVpZCBoZWxwZXIgcHJvZ3JhbSBiZWNhdXNlIHN5c3RlbSBidXMgZGFlbW9uIHJ1bnMgYXMgYSBub2JvZHkKKyAgdXNlciwgd2hpbGUgc2VydmljZXMgaXQgbGF1bmNoZXMgbWF5IG5lZWQgdG8gcnVuIGFzIGEgZGlmZmVyZW50CisgIHVzZXIuCisKKyAgKioqRXh0cmEgZXllcyBhdWRpdGluZyB0aGUgc2V0dWlkIGhlbHBlciBhcmUgZW5jb3VyYWdlZCBhbmQgd291bGQgYmUKKyAgdGltZWx5IHJpZ2h0IG5vdywgYmVmb3JlIDEuMi4wKioqCisKKyAgQSBkZXNpZ24gZG9jIGlzIGF2YWlsYWJsZSBpbiBkb2Mvc3lzdGVtLWFjdGl2YXRpb24udHh0CisKKy0gVGhlIFRDUCBhZGRyZXNzIGZvcm1hdCBoYXMgYmVlbiBlbmhhbmNlZCwgc3VjaCB0aGF0IFRDUCBtYXkgYmUKKyAgYWN0dWFsbHkgdXNhYmxlLiAgVGhlIGRidXMtZGFlbW9uIG1hbiBwYWdlIGRlc2NyaWJlcyB0aGUgbmV3CisgIGVsZW1lbnRzIGluIHRoZSBhZGRyZXNzIGZvcm1hdC4gIDEuMS4xIGhhZCBhZGRlZCBhbiBhbGxfaW50ZXJmYWNlcworICBmbGFnIHRvIHRoZSBmb3JtYXQsIHdoaWNoIGhhcyBiZWVuIHJlbW92ZWQgaW4gZmF2b3Igb2YgYSBjbGVhbmVyCisgIGFwcHJvYWNoLgorCistIFNvbWUgdGhyZWFkLXJlbGF0ZWQgYnVncyBoYXZlIGJlZW4gZml4ZWQsIHRoZXNlIGFyZSBpbXBvcnRhbnQgZml4ZXMKKyAgaWYgeW91IGFyZSB1c2luZyBtdWx0aXBsZSB0aHJlYWRzIHdpdGggbGliZGJ1cywgYW5kIG5vdCBpbXBvcnRhbnQKKyAgb3RoZXJ3aXNlLgorCisKK0QtQnVzIDEuMS4xICgxOCBKdW5lIDIwMDcpCis9PQorLSBUaGlzIGlzIGEgZGV2ZWxvcG1lbnQgcmVsZWFzZSwgdW5sZXNzIHlvdSBuZWVkIHNwZWNpZmljIAorICBmdW5jdGlvbmFsaXR5IHBsZWFzZSB1c2UgdGhlIHN0YWJsZSByZWxlYXNlcyBhcyBBUEkncyBtYXkgY2hhbmdlCisgICh0aG91Z2ggd2Ugd2lsbCB0cnkgaGFyZCBub3QgdG8pCistIFRoZSBidXMgZGFlbW9uIG5vdyBnZW5lcmF0ZXMgYSBnbG9iYWxseS11bmlxdWUgSUQgZm9yIGl0c2VsZiwgd2hpY2ggaXMgYXZhaWxhYmxlIAorICB1c2luZyB0aGUgY29udmVuaWVuY2UgZnVuY3Rpb24gZGJ1c19idXNfZ2V0X2lkKCkuIFVzZSB0aGlzIGFzIGEgdW5pcXVlIElEIAorICBmb3IgYSB1c2VyJ3Mgc2Vzc2lvbiwgZm9yIGV4YW1wbGUuCistIGRidXNfc2VydmVyX2dldF9pZCgpLCBkYnVzX2Nvbm5lY3Rpb25fZ2V0X3NlcnZlcl9pZCgpIG5vdyBhdmFpbGFibGUgdG8gYWNjZXNzCisgIHRoZSB1bmlxdWUgSUQgb2YgYSBwYXJ0aWN1bGFyIGFkZHJlc3MKKy0gZGJ1c193YXRjaF9nZXRfZmQoKSBkZXByZWNhdGVkIHNpbmNlIGl0IGhhZCB1bmNsZWFyIGNyb3NzLXBsYXRmb3JtIHNlbWFudGljcy4KKyAgZGJ1c193YXRjaF9nZXRfdW5peF9mZCgpIGFuZCBkYnVzX3dhdGNoX2dldF9zb2NrZXQoKSByZXBsYWNlIGl0LgorLSBzdXBwb3J0IEFOT05ZTU9VUyBtZWNoYW5pc20gZm9yIGF1dGhlbnRpY2F0aW9uLCB3aGljaCBhbGxvd3MgYSBjbGllbnQgdG8gCisgIGF1dGhlbnRpY2F0ZSBhcyBub2JvZHkgaW4gcGFydGljdWxhcgorLSBhZGQgQVBJIGRidXNfY29ubmVjdGlvbl9zZXRfYWxsb3dfYW5vbnltb3VzKCkgd2hpY2ggd2lsbCBhbGxvdyB0aGUgbWVzc2FnZQorICBzdHJlYW0gdG8gYmVnaW4gaWYgdGhlIGNsaWVudCBhdXRocyBhcyBhbm9ueW1vdXMgKG90aGVyd2lzZSwgdGhlIGNsaWVudCAKKyAgd2lsbCBiZSBkcm9wcGVkIHVubGVzcyB0aGV5IGF1dGggYXMgYSB1c2VyKS4KKy0gdGhlIEFOT05ZTU9VUyBzdXBwb3J0IG1lYW5zIHlvdSBjYW4gbm93IHVzZSBELUJ1cyAod2l0aG91dCBhIGJ1cyBkYWVtb24pIGFzIAorICBhIHByb3RvY29sIGZvciBhIG5ldHdvcmsgc2VydmljZSBwcm92aWRlZCB0byBhbm9ueW1vdXMgSW50ZXJuZXQgb3IgTEFOICAKKyAgY2xpZW50cworLSBtYW55IGludGVybmFsIGNoYW5nZXMgdG8gYmV0dGVyIHN1cHBvcnQgdGhlIFdpbmRvd3MgcG9ydCwgdGhvdWdoIHRoZSAKKyAgcG9ydCBpcyBzdGlsbCBub3QgY29tcGxldGUgaW4gdGhpcyByZWxlYXNlCistIHNvbWUgaW1wcm92ZWQgZG9jdW1lbnRhdGlvbiBhbmQgcmV0dXJuX2lmX2ZhaWwgY2hlY2tzCistIHNvbWUgc21hbGwgYnVnIGZpeGVzCisKK0QtQnVzIDEuMS4wICgyNSBNYXkgMjAwNykKKz09CistIGZpcnN0IHJlbGVhc2UgaW4gdGhlIGRldmVsb3BtZW50IHNlcmllcywgdW5sZXNzIHlvdSBuZWVkIHNwZWNpZmljIAorICBmdW5jdGlvbmFsaXR5IHBsZWFzZSB1c2UgdGhlIHN0YWJsZSByZWxlYXNlcyBhcyBBUEkncyBtYXkgY2hhbmdlCisgICh0aG91Z2ggd2Ugd2lsbCB0cnkgaGFyZCBub3QgdG8pCistIGJldHRlciBlYXZlc2Ryb3BwaW5nIHN1cHBvcnQgbm93IHBpY2tzIHVwIHJlcGx5IG1lc3NhZ2VzIGZvciBkZWJ1Z2dpbmcKKy0gLnBjIGZpbGUgbm93IGxpc3RzIHRoZSBkaXJlY3RvcnkgdGhlIGRhZW1vbiBpcyBpbnN0YWxsZWQgaW50byAoZGFlbW9uZGlyKQorLSBHZXRBbGwgY2FsbCBhZGRlZCB0byB0aGUgcHJvcGVydGllcyBpbnRlcmZhY2UKKy0gc3VwcG9ydCBmb3IgbWVzc2FnZSBzZXJpYWxpemF0aW9uIGFkZGVkIGZvciB1c2Ugd2l0aCBleHRlcm5hbCB0cmFuc3BvcnRzIGxpa2UKKyAgVFVCRVMhISEKKy0gbWFueSBidWdzIGZpeGVkCmRpZmYgLS1naXQgYS9kYnVzL05PVElDRSBiL2RidXMvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MWNhMWQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL05PVElDRQpAQCAtMCwwICsxLDU1MSBAQAorRC1CdXMgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHlvdXIgY2hvaWNlIG9mIHRoZSBBY2FkZW1pYyBGcmVlCitMaWNlbnNlIHZlcnNpb24gMi4xLCBvciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgorQm90aCBsaWNlbnNlcyBhcmUgaW5jbHVkZWQgaGVyZS4gU29tZSBvZiB0aGUgc3RhbmRhbG9uZSBiaW5hcmllcyBhcmUKK3VuZGVyIHRoZSBHUEwgb25seTsgaW4gcGFydGljdWxhciwgYnV0IG5vdCBsaW1pdGVkIHRvLAordG9vbHMvZGJ1cy1jbGVhbnVwLXNvY2tldHMuYyBhbmQgdGVzdC9kZWNvZGUtZ2Nvdi5jLiBFYWNoIHNvdXJjZSBjb2RlCitmaWxlIGlzIG1hcmtlZCB3aXRoIHRoZSBwcm9wZXIgY29weXJpZ2h0IGluZm9ybWF0aW9uIC0gaWYgeW91IGZpbmQgYQorZmlsZSB0aGF0IGlzbid0IG1hcmtlZCBwbGVhc2UgYnJpbmcgaXQgdG8gb3VyIGF0dGVudGlvbi4KKworCitUaGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlCit2LiAyLjEKKworVGhpcyBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgKHRoZSAiTGljZW5zZSIpIGFwcGxpZXMgdG8gYW55IG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcCAodGhlICJPcmlnaW5hbCBXb3JrIikgd2hvc2Ugb3duZXIgKHRoZSAiTGljZW5zb3IiKSBoYXMgcGxhY2VkIHRoZSBmb2xsb3dpbmcgbm90aWNlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgdGhlIE9yaWdpbmFsIFdvcms6CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKworMSkgR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIExpY2Vuc29yIGhlcmVieSBncmFudHMgWW91IGEKK3dvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSwgcGVycGV0dWFsLCBzdWJsaWNlbnNlYWJsZQorbGljZW5zZSB0byBkbyB0aGUgZm9sbG93aW5nOgorCithKSB0byByZXByb2R1Y2UgdGhlIE9yaWdpbmFsIFdvcmsgaW4gY29waWVzOworCitiKSB0byBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3MgKCJEZXJpdmF0aXZlIFdvcmtzIikgYmFzZWQgdXBvbiB0aGUgT3JpZ2luYWwgV29yazsKKworYykgdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIE9yaWdpbmFsIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdG8gdGhlIHB1YmxpYzsKKworZCkgdG8gcGVyZm9ybSB0aGUgT3JpZ2luYWwgV29yayBwdWJsaWNseTsgYW5kCisKK2UpIHRvIGRpc3BsYXkgdGhlIE9yaWdpbmFsIFdvcmsgcHVibGljbHkuCisKKzIpIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBMaWNlbnNvciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsCityb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUsIHBlcnBldHVhbCwgc3VibGljZW5zZWFibGUgbGljZW5zZSwgdW5kZXIKK3BhdGVudCBjbGFpbXMgb3duZWQgb3IgY29udHJvbGxlZCBieSB0aGUgTGljZW5zb3IgdGhhdCBhcmUgZW1ib2RpZWQgaW4KK3RoZSBPcmlnaW5hbCBXb3JrIGFzIGZ1cm5pc2hlZCBieSB0aGUgTGljZW5zb3IsIHRvIG1ha2UsIHVzZSwgc2VsbCBhbmQKK29mZmVyIGZvciBzYWxlIHRoZSBPcmlnaW5hbCBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzLgorCiszKSBHcmFudCBvZiBTb3VyY2UgQ29kZSBMaWNlbnNlLiBUaGUgdGVybSAiU291cmNlIENvZGUiIG1lYW5zIHRoZQorcHJlZmVycmVkIGZvcm0gb2YgdGhlIE9yaWdpbmFsIFdvcmsgZm9yIG1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0IGFuZAorYWxsIGF2YWlsYWJsZSBkb2N1bWVudGF0aW9uIGRlc2NyaWJpbmcgaG93IHRvIG1vZGlmeSB0aGUgT3JpZ2luYWwKK1dvcmsuIExpY2Vuc29yIGhlcmVieSBhZ3JlZXMgdG8gcHJvdmlkZSBhIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUKK1NvdXJjZSBDb2RlIG9mIHRoZSBPcmlnaW5hbCBXb3JrIGFsb25nIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBPcmlnaW5hbAorV29yayB0aGF0IExpY2Vuc29yIGRpc3RyaWJ1dGVzLiBMaWNlbnNvciByZXNlcnZlcyB0aGUgcmlnaHQgdG8gc2F0aXNmeQordGhpcyBvYmxpZ2F0aW9uIGJ5IHBsYWNpbmcgYSBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIFNvdXJjZSBDb2RlCitpbiBhbiBpbmZvcm1hdGlvbiByZXBvc2l0b3J5IHJlYXNvbmFibHkgY2FsY3VsYXRlZCB0byBwZXJtaXQKK2luZXhwZW5zaXZlIGFuZCBjb252ZW5pZW50IGFjY2VzcyBieSBZb3UgZm9yIGFzIGxvbmcgYXMgTGljZW5zb3IKK2NvbnRpbnVlcyB0byBkaXN0cmlidXRlIHRoZSBPcmlnaW5hbCBXb3JrLCBhbmQgYnkgcHVibGlzaGluZyB0aGUKK2FkZHJlc3Mgb2YgdGhhdCBpbmZvcm1hdGlvbiByZXBvc2l0b3J5IGluIGEgbm90aWNlIGltbWVkaWF0ZWx5Citmb2xsb3dpbmcgdGhlIGNvcHlyaWdodCBub3RpY2UgdGhhdCBhcHBsaWVzIHRvIHRoZSBPcmlnaW5hbCBXb3JrLgorCis0KSBFeGNsdXNpb25zIEZyb20gTGljZW5zZSBHcmFudC4gTmVpdGhlciB0aGUgbmFtZXMgb2YgTGljZW5zb3IsIG5vcgordGhlIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgdG8gdGhlIE9yaWdpbmFsIFdvcmssIG5vciBhbnkgb2YgdGhlaXIKK3RyYWRlbWFya3Mgb3Igc2VydmljZSBtYXJrcywgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCitwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBPcmlnaW5hbCBXb3JrIHdpdGhvdXQgZXhwcmVzcyBwcmlvciB3cml0dGVuCitwZXJtaXNzaW9uIG9mIHRoZSBMaWNlbnNvci4gTm90aGluZyBpbiB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgZGVlbWVkIHRvCitncmFudCBhbnkgcmlnaHRzIHRvIHRyYWRlbWFya3MsIGNvcHlyaWdodHMsIHBhdGVudHMsIHRyYWRlIHNlY3JldHMgb3IKK2FueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgTGljZW5zb3IgZXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKK2hlcmVpbi4gTm8gcGF0ZW50IGxpY2Vuc2UgaXMgZ3JhbnRlZCB0byBtYWtlLCB1c2UsIHNlbGwgb3Igb2ZmZXIgdG8KK3NlbGwgZW1ib2RpbWVudHMgb2YgYW55IHBhdGVudCBjbGFpbXMgb3RoZXIgdGhhbiB0aGUgbGljZW5zZWQgY2xhaW1zCitkZWZpbmVkIGluIFNlY3Rpb24gMi4gTm8gcmlnaHQgaXMgZ3JhbnRlZCB0byB0aGUgdHJhZGVtYXJrcyBvZgorTGljZW5zb3IgZXZlbiBpZiBzdWNoIG1hcmtzIGFyZSBpbmNsdWRlZCBpbiB0aGUgT3JpZ2luYWwgV29yay4gTm90aGluZworaW4gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIGludGVycHJldGVkIHRvIHByb2hpYml0IExpY2Vuc29yIGZyb20KK2xpY2Vuc2luZyB1bmRlciBkaWZmZXJlbnQgdGVybXMgZnJvbSB0aGlzIExpY2Vuc2UgYW55IE9yaWdpbmFsIFdvcmsKK3RoYXQgTGljZW5zb3Igb3RoZXJ3aXNlIHdvdWxkIGhhdmUgYSByaWdodCB0byBsaWNlbnNlLgorCis1KSBUaGlzIHNlY3Rpb24gaW50ZW50aW9uYWxseSBvbWl0dGVkLgorCis2KSBBdHRyaWJ1dGlvbiBSaWdodHMuIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBDb2RlIG9mIGFueQorRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBjcmVhdGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCBvciB0cmFkZW1hcmsKK25vdGljZXMgZnJvbSB0aGUgU291cmNlIENvZGUgb2YgdGhlIE9yaWdpbmFsIFdvcmssIGFzIHdlbGwgYXMgYW55Citub3RpY2VzIG9mIGxpY2Vuc2luZyBhbmQgYW55IGRlc2NyaXB0aXZlIHRleHQgaWRlbnRpZmllZCB0aGVyZWluIGFzIGFuCisiQXR0cmlidXRpb24gTm90aWNlLiIgWW91IG11c3QgY2F1c2UgdGhlIFNvdXJjZSBDb2RlIGZvciBhbnkKK0Rlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgY3JlYXRlIHRvIGNhcnJ5IGEgcHJvbWluZW50IEF0dHJpYnV0aW9uCitOb3RpY2UgcmVhc29uYWJseSBjYWxjdWxhdGVkIHRvIGluZm9ybSByZWNpcGllbnRzIHRoYXQgWW91IGhhdmUKK21vZGlmaWVkIHRoZSBPcmlnaW5hbCBXb3JrLgorCis3KSBXYXJyYW50eSBvZiBQcm92ZW5hbmNlIGFuZCBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBMaWNlbnNvcgord2FycmFudHMgdGhhdCB0aGUgY29weXJpZ2h0IGluIGFuZCB0byB0aGUgT3JpZ2luYWwgV29yayBhbmQgdGhlIHBhdGVudAorcmlnaHRzIGdyYW50ZWQgaGVyZWluIGJ5IExpY2Vuc29yIGFyZSBvd25lZCBieSB0aGUgTGljZW5zb3Igb3IgYXJlCitzdWJsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSB3aXRoIHRoZSBwZXJtaXNzaW9uCitvZiB0aGUgY29udHJpYnV0b3Iocykgb2YgdGhvc2UgY29weXJpZ2h0cyBhbmQgcGF0ZW50IHJpZ2h0cy4gRXhjZXB0IGFzCitleHByZXNzbHkgc3RhdGVkIGluIHRoZSBpbW1lZGlhdGVseSBwcm9jZWVkaW5nIHNlbnRlbmNlLCB0aGUgT3JpZ2luYWwKK1dvcmsgaXMgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlIG9uIGFuICJBUyBJUyIgQkFTSVMgYW5kIFdJVEhPVVQKK1dBUlJBTlRZLCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwKK3RoZSB3YXJyYW50aWVzIG9mIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBPRiBUSEUgT1JJR0lOQUwKK1dPUksgSVMgV0lUSCBZT1UuIFRoaXMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBjb25zdGl0dXRlcyBhbiBlc3NlbnRpYWwKK3BhcnQgb2YgdGhpcyBMaWNlbnNlLiBObyBsaWNlbnNlIHRvIE9yaWdpbmFsIFdvcmsgaXMgZ3JhbnRlZCBoZXJldW5kZXIKK2V4Y2VwdCB1bmRlciB0aGlzIGRpc2NsYWltZXIuCisKKzgpIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIGFuZCB1bmRlciBubyBsZWdhbAordGhlb3J5LCB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yCitvdGhlcndpc2UsIHNoYWxsIHRoZSBMaWNlbnNvciBiZSBsaWFibGUgdG8gYW55IHBlcnNvbiBmb3IgYW55IGRpcmVjdCwKK2luZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55CitjaGFyYWN0ZXIgYXJpc2luZyBhcyBhIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3IgdGhlIHVzZSBvZiB0aGUKK09yaWdpbmFsIFdvcmsgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGRhbWFnZXMgZm9yIGxvc3Mgb2YKK2dvb2R3aWxsLCB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kCithbGwgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3Nlcy4gVGhpcyBsaW1pdGF0aW9uIG9mIGxpYWJpbGl0eQorc2hhbGwgbm90IGFwcGx5IHRvIGxpYWJpbGl0eSBmb3IgZGVhdGggb3IgcGVyc29uYWwgaW5qdXJ5IHJlc3VsdGluZworZnJvbSBMaWNlbnNvcidzIG5lZ2xpZ2VuY2UgdG8gdGhlIGV4dGVudCBhcHBsaWNhYmxlIGxhdyBwcm9oaWJpdHMgc3VjaAorbGltaXRhdGlvbi4gU29tZSBqdXJpc2RpY3Rpb25zIGRvIG5vdCBhbGxvdyB0aGUgZXhjbHVzaW9uIG9yCitsaW1pdGF0aW9uIG9mIGluY2lkZW50YWwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzbyB0aGlzIGV4Y2x1c2lvbgorYW5kIGxpbWl0YXRpb24gbWF5IG5vdCBhcHBseSB0byBZb3UuCisKKzkpIEFjY2VwdGFuY2UgYW5kIFRlcm1pbmF0aW9uLiBJZiBZb3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCitPcmlnaW5hbCBXb3JrIG9yIGEgRGVyaXZhdGl2ZSBXb3JrLCBZb3UgbXVzdCBtYWtlIGEgcmVhc29uYWJsZSBlZmZvcnQKK3VuZGVyIHRoZSBjaXJjdW1zdGFuY2VzIHRvIG9idGFpbiB0aGUgZXhwcmVzcyBhc3NlbnQgb2YgcmVjaXBpZW50cyB0bwordGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gTm90aGluZyBlbHNlIGJ1dCB0aGlzIExpY2Vuc2UgKG9yIGFub3RoZXIKK3dyaXR0ZW4gYWdyZWVtZW50IGJldHdlZW4gTGljZW5zb3IgYW5kIFlvdSkgZ3JhbnRzIFlvdSBwZXJtaXNzaW9uIHRvCitjcmVhdGUgRGVyaXZhdGl2ZSBXb3JrcyBiYXNlZCB1cG9uIHRoZSBPcmlnaW5hbCBXb3JrIG9yIHRvIGV4ZXJjaXNlCithbnkgb2YgdGhlIHJpZ2h0cyBncmFudGVkIGluIFNlY3Rpb24gMSBoZXJlaW4sIGFuZCBhbnkgYXR0ZW1wdCB0byBkbworc28gZXhjZXB0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgKG9yIGFub3RoZXIgd3JpdHRlbgorYWdyZWVtZW50IGJldHdlZW4gTGljZW5zb3IgYW5kIFlvdSkgaXMgZXhwcmVzc2x5IHByb2hpYml0ZWQgYnkKK1UuUy4gY29weXJpZ2h0IGxhdywgdGhlIGVxdWl2YWxlbnQgbGF3cyBvZiBvdGhlciBjb3VudHJpZXMsIGFuZCBieQoraW50ZXJuYXRpb25hbCB0cmVhdHkuIFRoZXJlZm9yZSwgYnkgZXhlcmNpc2luZyBhbnkgb2YgdGhlIHJpZ2h0cworZ3JhbnRlZCB0byBZb3UgaW4gU2VjdGlvbiAxIGhlcmVpbiwgWW91IGluZGljYXRlIFlvdXIgYWNjZXB0YW5jZSBvZgordGhpcyBMaWNlbnNlIGFuZCBhbGwgb2YgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zLgorCisxMCkgVGVybWluYXRpb24gZm9yIFBhdGVudCBBY3Rpb24uIFRoaXMgTGljZW5zZSBzaGFsbCB0ZXJtaW5hdGUKK2F1dG9tYXRpY2FsbHkgYW5kIFlvdSBtYXkgbm8gbG9uZ2VyIGV4ZXJjaXNlIGFueSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQKK3RvIFlvdSBieSB0aGlzIExpY2Vuc2UgYXMgb2YgdGhlIGRhdGUgWW91IGNvbW1lbmNlIGFuIGFjdGlvbiwKK2luY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSwgYWdhaW5zdCBMaWNlbnNvciBvciBhbnkKK2xpY2Vuc2VlIGFsbGVnaW5nIHRoYXQgdGhlIE9yaWdpbmFsIFdvcmsgaW5mcmluZ2VzIGEgcGF0ZW50LiBUaGlzCit0ZXJtaW5hdGlvbiBwcm92aXNpb24gc2hhbGwgbm90IGFwcGx5IGZvciBhbiBhY3Rpb24gYWxsZWdpbmcgcGF0ZW50CitpbmZyaW5nZW1lbnQgYnkgY29tYmluYXRpb25zIG9mIHRoZSBPcmlnaW5hbCBXb3JrIHdpdGggb3RoZXIgc29mdHdhcmUKK29yIGhhcmR3YXJlLgorCisxMSkgSnVyaXNkaWN0aW9uLCBWZW51ZSBhbmQgR292ZXJuaW5nIExhdy4gQW55IGFjdGlvbiBvciBzdWl0IHJlbGF0aW5nCit0byB0aGlzIExpY2Vuc2UgbWF5IGJlIGJyb3VnaHQgb25seSBpbiB0aGUgY291cnRzIG9mIGEganVyaXNkaWN0aW9uCit3aGVyZWluIHRoZSBMaWNlbnNvciByZXNpZGVzIG9yIGluIHdoaWNoIExpY2Vuc29yIGNvbmR1Y3RzIGl0cyBwcmltYXJ5CitidXNpbmVzcywgYW5kIHVuZGVyIHRoZSBsYXdzIG9mIHRoYXQganVyaXNkaWN0aW9uIGV4Y2x1ZGluZyBpdHMKK2NvbmZsaWN0LW9mLWxhdyBwcm92aXNpb25zLiBUaGUgYXBwbGljYXRpb24gb2YgdGhlIFVuaXRlZCBOYXRpb25zCitDb252ZW50aW9uIG9uIENvbnRyYWN0cyBmb3IgdGhlIEludGVybmF0aW9uYWwgU2FsZSBvZiBHb29kcyBpcworZXhwcmVzc2x5IGV4Y2x1ZGVkLiBBbnkgdXNlIG9mIHRoZSBPcmlnaW5hbCBXb3JrIG91dHNpZGUgdGhlIHNjb3BlIG9mCit0aGlzIExpY2Vuc2Ugb3IgYWZ0ZXIgaXRzIHRlcm1pbmF0aW9uIHNoYWxsIGJlIHN1YmplY3QgdG8gdGhlCityZXF1aXJlbWVudHMgYW5kIHBlbmFsdGllcyBvZiB0aGUgVS5TLiBDb3B5cmlnaHQgQWN0LCAxNyBVLlMuQy4gw4LCpyAxMDEKK2V0IHNlcS4sIHRoZSBlcXVpdmFsZW50IGxhd3Mgb2Ygb3RoZXIgY291bnRyaWVzLCBhbmQgaW50ZXJuYXRpb25hbAordHJlYXR5LiBUaGlzIHNlY3Rpb24gc2hhbGwgc3Vydml2ZSB0aGUgdGVybWluYXRpb24gb2YgdGhpcyBMaWNlbnNlLgorCisxMikgQXR0b3JuZXlzIEZlZXMuIEluIGFueSBhY3Rpb24gdG8gZW5mb3JjZSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlCitvciBzZWVraW5nIGRhbWFnZXMgcmVsYXRpbmcgdGhlcmV0bywgdGhlIHByZXZhaWxpbmcgcGFydHkgc2hhbGwgYmUKK2VudGl0bGVkIHRvIHJlY292ZXIgaXRzIGNvc3RzIGFuZCBleHBlbnNlcywgaW5jbHVkaW5nLCB3aXRob3V0CitsaW1pdGF0aW9uLCByZWFzb25hYmxlIGF0dG9ybmV5cycgZmVlcyBhbmQgY29zdHMgaW5jdXJyZWQgaW4KK2Nvbm5lY3Rpb24gd2l0aCBzdWNoIGFjdGlvbiwgaW5jbHVkaW5nIGFueSBhcHBlYWwgb2Ygc3VjaCBhY3Rpb24uIFRoaXMKK3NlY3Rpb24gc2hhbGwgc3Vydml2ZSB0aGUgdGVybWluYXRpb24gb2YgdGhpcyBMaWNlbnNlLgorCisxMykgTWlzY2VsbGFuZW91cy4gVGhpcyBMaWNlbnNlIHJlcHJlc2VudHMgdGhlIGNvbXBsZXRlIGFncmVlbWVudAorY29uY2VybmluZyB0aGUgc3ViamVjdCBtYXR0ZXIgaGVyZW9mLiBJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZQoraXMgaGVsZCB0byBiZSB1bmVuZm9yY2VhYmxlLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCBvbmx5IHRvCit0aGUgZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIGl0IGVuZm9yY2VhYmxlLgorCisxNCkgRGVmaW5pdGlvbiBvZiAiWW91IiBpbiBUaGlzIExpY2Vuc2UuICJZb3UiIHRocm91Z2hvdXQgdGhpcworTGljZW5zZSwgd2hldGhlciBpbiB1cHBlciBvciBsb3dlciBjYXNlLCBtZWFucyBhbiBpbmRpdmlkdWFsIG9yIGEKK2xlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciwgYW5kIGNvbXBseWluZyB3aXRoIGFsbCBvZiB0aGUKK3Rlcm1zIG9mLCB0aGlzIExpY2Vuc2UuIEZvciBsZWdhbCBlbnRpdGllcywgIllvdSIgaW5jbHVkZXMgYW55IGVudGl0eQordGhhdCBjb250cm9scywgaXMgY29udHJvbGxlZCBieSwgb3IgaXMgdW5kZXIgY29tbW9uIGNvbnRyb2wgd2l0aAoreW91LiBGb3IgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwKK2RpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2gKK2VudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5CitwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbAorb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisxNSkgUmlnaHQgdG8gVXNlLiBZb3UgbWF5IHVzZSB0aGUgT3JpZ2luYWwgV29yayBpbiBhbGwgd2F5cyBub3QKK290aGVyd2lzZSByZXN0cmljdGVkIG9yIGNvbmRpdGlvbmVkIGJ5IHRoaXMgTGljZW5zZSBvciBieSBsYXcsIGFuZAorTGljZW5zb3IgcHJvbWlzZXMgbm90IHRvIGludGVyZmVyZSB3aXRoIG9yIGJlIHJlc3BvbnNpYmxlIGZvciBzdWNoCit1c2VzIGJ5IFlvdS4KKworVGhpcyBsaWNlbnNlIGlzIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IExhd3JlbmNlIEUuIFJvc2VuLiBBbGwgcmlnaHRzCityZXNlcnZlZC4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoaXMKK2xpY2Vuc2Ugd2l0aG91dCBtb2RpZmljYXRpb24uIFRoaXMgbGljZW5zZSBtYXkgbm90IGJlIG1vZGlmaWVkIHdpdGhvdXQKK3RoZSBleHByZXNzIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBpdHMgY29weXJpZ2h0IG93bmVyLgorCisKKy0tIAorRU5EIE9GIEFDQURFTUlDIEZSRUUgTElDRU5TRS4gVGhlIGZvbGxvd2luZyBpcyBpbnRlbmRlZCB0byBkZXNjcmliZSB0aGUgZXNzZW50aWFsIAorZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIChBRkwpIHZlcnNpb24gMS4wIGFuZCBvdGhlciAKK29wZW4gc291cmNlIGxpY2Vuc2VzOgorCitUaGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIGlzIHNpbWlsYXIgdG8gdGhlIEJTRCwgTUlULCBVb0kvTkNTQSBhbmQgQXBhY2hlIAorbGljZW5zZXMgaW4gbWFueSByZXNwZWN0cyBidXQgaXQgaXMgaW50ZW5kZWQgdG8gc29sdmUgYSBmZXcgcHJvYmxlbXMgd2l0aCAKK3Rob3NlIGxpY2Vuc2VzLgorICAgIAorKiBUaGUgQUZMIGlzIHdyaXR0ZW4gc28gYXMgdG8gbWFrZSBpdCBjbGVhciB3aGF0IHNvZnR3YXJlIGlzIGJlaW5nIAorbGljZW5zZWQgKGJ5IHRoZSBpbmNsdXNpb24gb2YgYSBzdGF0ZW1lbnQgZm9sbG93aW5nIHRoZSBjb3B5cmlnaHQgbm90aWNlIAoraW4gdGhlIHNvZnR3YXJlKS4gVGhpcyB3YXksIHRoZSBsaWNlbnNlIGZ1bmN0aW9ucyBiZXR0ZXIgdGhhbiBhIHRlbXBsYXRlIAorbGljZW5zZS4gVGhlIEJTRCwgTUlUIGFuZCBVb0kvTkNTQSBsaWNlbnNlcyBhcHBseSB0byB1bmlkZW50aWZpZWQgc29mdHdhcmUuCisgICAgCisqIFRoZSBBRkwgY29udGFpbnMgYSBjb21wbGV0ZSBjb3B5cmlnaHQgZ3JhbnQgdG8gdGhlIHNvZnR3YXJlLiBUaGUgQlNEIAorYW5kIEFwYWNoZSBsaWNlbnNlcyBhcmUgdmFndWUgYW5kIGluY29tcGxldGUgaW4gdGhhdCByZXNwZWN0LgorICAgIAorKiBUaGUgQUZMIGNvbnRhaW5zIGEgY29tcGxldGUgcGF0ZW50IGdyYW50IHRvIHRoZSBzb2Z0d2FyZS4gVGhlIEJTRCwgTUlULCAKK1VvSS9OQ1NBIGFuZCBBcGFjaGUgbGljZW5zZXMgcmVseSBvbiBhbiBpbXBsaWVkIHBhdGVudCBsaWNlbnNlIGFuZCBjb250YWluIAorbm8gZXhwbGljaXQgcGF0ZW50IGdyYW50LgorICAgIAorKiBUaGUgQUZMIG1ha2VzIGl0IGNsZWFyIHRoYXQgbm8gdHJhZGVtYXJrIHJpZ2h0cyBhcmUgZ3JhbnRlZCB0byB0aGUgCitsaWNlbnNvcidzIHRyYWRlbWFya3MuIFRoZSBBcGFjaGUgbGljZW5zZSBjb250YWlucyBzdWNoIGEgcHJvdmlzaW9uLCBidXQgdGhlIAorQlNELCBNSVQgYW5kIFVvSS9OQ1NBIGxpY2Vuc2VzIGRvIG5vdC4KKyAgICAKKyogVGhlIEFGTCBpbmNsdWRlcyB0aGUgd2FycmFudHkgYnkgdGhlIGxpY2Vuc29yIHRoYXQgaXQgZWl0aGVyIG93bnMgdGhlIAorY29weXJpZ2h0IG9yIHRoYXQgaXQgaXMgZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSB1bmRlciBhIGxpY2Vuc2UuIE5vbmUgb2YgCit0aGUgb3RoZXIgbGljZW5zZXMgY29udGFpbiB0aGF0IHdhcnJhbnR5LiBBbGwgb3RoZXIgd2FycmFudGllcyBhcmUgZGlzY2xhaW1lZCwgCithcyBpcyB0aGUgY2FzZSBmb3IgdGhlIG90aGVyIGxpY2Vuc2VzLgorCisqIFRoZSBBRkwgaXMgaXRzZWxmIGNvcHlyaWdodGVkICh3aXRoIHRoZSByaWdodCBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgCit3aXRob3V0IG1vZGlmaWNhdGlvbikuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBvd25lciBvZiB0aGUgY29weXJpZ2h0IHRvIHRoZSAKK2xpY2Vuc2Ugd2lsbCBjb250cm9sIGNoYW5nZXMuIFRoZSBBcGFjaGUgbGljZW5zZSBjb250YWlucyBhIGNvcHlyaWdodCBub3RpY2UsIAorYnV0IHRoZSBCU0QsIE1JVCBhbmQgVW9JL05DU0EgbGljZW5zZXMgZG8gbm90LiAKKy0tCitTVEFSVCBPRiBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorLS0KKworCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKKyBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKKwkJCSAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCitzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcworR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KK3VzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKK3RoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAoraWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCithbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCitUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQorZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKK2dyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoreW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKK3NvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKK3JpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCisoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAorZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KKworICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgordGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKK3NvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KK3RoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCithdXRob3JzJyByZXB1dGF0aW9ucy4KKworICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQorcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQorcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQorcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55CitwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LgorDAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKK2Egbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCit1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCityZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKK21lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Cit0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAorZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKK2xhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KK3RoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCitBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQoraXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCitXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KKworICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKK3NvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQorY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQorY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQorbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OworYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCit5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KKyAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKKyAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAorICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKKyAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCisgICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgorICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQorICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQorICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKKyAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcworICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0CisgICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgorICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQorDAorVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQord2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKK3VuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgorU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQorICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucworICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKKyAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgorICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKKyAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KKyAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgorICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCisgICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKKyAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCisgICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCisKK1RoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCitjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQorYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCitjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCitzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKK2FueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Citmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQorb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKK2l0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KKworSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZworYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAorYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCitkaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisMCisgIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAorb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCit2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCitIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgordGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKK3BhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCit0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KK3RoaXMgTGljZW5zZS4KKworICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCithbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCithcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgorY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisMCisgIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKK21heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwordGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZworY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCit0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucworb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCitiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQorbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKK3RoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24uCisKKyAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgordG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKK21ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCitvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCitvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCitGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KK09USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKK1BST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECitPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUworVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQorUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCitSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCitSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAorSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCitPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECitUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKK1lPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCitQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorCSAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0CitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KKworICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAordG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKK3RoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyIG5hbWUgb2YgYXV0aG9yCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQorYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCisgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9kYnVzL1JFQURNRSBiL2RidXMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkODMyY2EKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL1JFQURNRQpAQCAtMCwwICsxLDE2MyBAQAorU2VjdGlvbnMgaW4gdGhpcyBmaWxlIGRlc2NyaWJlOgorIC0gaW50cm9kdWN0aW9uIGFuZCBvdmVydmlldworIC0gbG93LWxldmVsIHZzLiBoaWdoLWxldmVsIEFQSQorIC0gdmVyc2lvbiBudW1iZXJzCisgLSBvcHRpb25zIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0CisgLSBBQkkgc3RhYmlsaXR5IHBvbGljeQorCitJbnRyb2R1Y3Rpb24KKz09PQorCitELUJ1cyBpcyBhIHNpbXBsZSBzeXN0ZW0gZm9yIGludGVycHJvY2VzcyBjb21tdW5pY2F0aW9uIGFuZCBjb29yZGluYXRpb24uCisKK1RoZSAiYW5kIGNvb3JkaW5hdGlvbiIgcGFydCBpcyBpbXBvcnRhbnQ7IEQtQnVzIHByb3ZpZGVzIGEgYnVzIGRhZW1vbiB0aGF0IGRvZXMgdGhpbmdzIGxpa2U6CisgLSBub3RpZnkgYXBwbGljYXRpb25zIHdoZW4gb3RoZXIgYXBwcyBleGl0CisgLSBzdGFydCBzZXJ2aWNlcyBvbiBkZW1hbmQKKyAtIHN1cHBvcnQgc2luZ2xlLWluc3RhbmNlIGFwcGxpY2F0aW9ucworCitTZWUgaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8gZm9yIGxvdHMgb2YgZG9jdW1lbnRhdGlvbiwgCittYWlsaW5nIGxpc3RzLCBldGMuCisKK1NlZSBhbHNvIHRoZSBmaWxlIEhBQ0tJTkcgZm9yIG5vdGVzIG9mIGludGVyZXN0IHRvIGRldmVsb3BlcnMgd29ya2luZyBvbiBELUJ1cy4KKworSWYgeW91J3JlIGNvbnNpZGVyaW5nIEQtQnVzIGZvciB1c2UgaW4gYSBwcm9qZWN0LCB5b3Ugc2hvdWxkIGJlIGF3YXJlCit0aGF0IEQtQnVzIHdhcyBkZXNpZ25lZCBmb3IgYSBjb3VwbGUgb2Ygc3BlY2lmaWMgdXNlIGNhc2VzLCBhICJzeXN0ZW0KK2J1cyIgYW5kIGEgImRlc2t0b3Agc2Vzc2lvbiBidXMuIiBUaGVzZSBhcmUgZG9jdW1lbnRlZCBpbiBtb3JlIGRldGFpbAoraW4gdGhlIEQtQnVzIHNwZWNpZmljYXRpb24gYW5kIEZBUSBhdmFpbGFibGUgb24gdGhlIHdlYiBzaXRlLgorCitJZiB5b3VyIHVzZS1jYXNlIGlzbid0IG9uZSBvZiB0aGVzZSwgRC1CdXMgbWF5IHN0aWxsIGJlIHVzZWZ1bCwgYnV0Citvbmx5IGJ5IGFjY2lkZW50OyBzbyB5b3Ugc2hvdWxkIGV2YWx1YXRlIGNhcmVmdWxseSB3aGV0aGVyIEQtQnVzIG1ha2VzCitzZW5zZSBmb3IgeW91ciBwcm9qZWN0LgorCitOb3RlOiBsb3ctbGV2ZWwgQVBJIHZzLiBoaWdoLWxldmVsIGJpbmRpbmcgQVBJcworPT09CisKK0EgY29yZSBjb25jZXB0IG9mIHRoZSBELUJ1cyBpbXBsZW1lbnRhdGlvbiBpcyB0aGF0ICJsaWJkYnVzIiBpcworaW50ZW5kZWQgdG8gYmUgYSBsb3ctbGV2ZWwgQVBJLiBNb3N0IHByb2dyYW1tZXJzIGFyZSBpbnRlbmRlZCB0byB1c2UKK3RoZSBiaW5kaW5ncyB0byBHTGliLCBRdCwgUHl0aG9uLCBNb25vLCBKYXZhLCBvciB3aGF0ZXZlci4gVGhlc2UKK2JpbmRpbmdzIGhhdmUgdmFyeWluZyBsZXZlbHMgb2YgY29tcGxldGVuZXNzIGFuZCBhcmUgbWFpbnRhaW5lZCBhcworc2VwYXJhdGUgcHJvamVjdHMgZnJvbSB0aGUgbWFpbiBELUJ1cyBwYWNrYWdlLiBUaGUgbWFpbiBELUJ1cyBwYWNrYWdlCitjb250YWlucyB0aGUgbG93LWxldmVsIGxpYmRidXMsIHRoZSBidXMgZGFlbW9uLCBhbmQgYSBmZXcgY29tbWFuZC1saW5lCit0b29scyBzdWNoIGFzIGRidXMtbGF1bmNoLgorCitJZiB5b3UgdXNlIHRoZSBsb3ctbGV2ZWwgQVBJIGRpcmVjdGx5LCB5b3UncmUgc2lnbmluZyB1cCBmb3Igc29tZQorcGFpbi4gVGhpbmsgb2YgdGhlIGxvdy1sZXZlbCBBUEkgYXMgYW5hbG9nb3VzIHRvIFhsaWIgb3IgR0RJLCBhbmQgdGhlCitoaWdoLWxldmVsIEFQSSBhcyBhbmFsb2dvdXMgdG8gUXQvR1RLKy9IVE1MLgorCitWZXJzaW9uIG51bWJlcnMKKz09PQorCitELUJ1cyB1c2VzIHRoZSBjb21tb24gIkxpbnV4IGtlcm5lbCIgdmVyc2lvbmluZyBzeXN0ZW0sIHdoZXJlCitldmVuLW51bWJlcmVkIG1pbm9yIHZlcnNpb25zIGFyZSBzdGFibGUgYW5kIG9kZC1udW1iZXJlZCBtaW5vcgordmVyc2lvbnMgYXJlIGRldmVsb3BtZW50IHNuYXBzaG90cy4KKworU28gZm9yIGV4YW1wbGUsIGRldmVsb3BtZW50IHNuYXBzaG90czogMS4xLjEsIDEuMS4yLCAxLjEuMywgMS4zLjQKK1N0YWJsZSB2ZXJzaW9uczogMS4wLCAxLjAuMSwgMS4wLjIsIDEuMi4xLCAxLjIuMworCitBbGwgcHJlLTEuMCB2ZXJzaW9ucyB3ZXJlIGRldmVsb3BtZW50IHNuYXBzaG90cy4KKworRGV2ZWxvcG1lbnQgc25hcHNob3RzIG1ha2Ugbm8gQUJJIHN0YWJpbGl0eSBndWFyYW50ZWVzIGZvciBuZXcgQUJJCitpbnRyb2R1Y2VkIHNpbmNlIHRoZSBsYXN0IHN0YWJsZSByZWxlYXNlLiBEZXZlbG9wbWVudCBzbmFwc2hvdHMgYXJlCitsaWtlbHkgdG8gaGF2ZSBtb3JlIGJ1Z3MgdGhhbiBzdGFibGUgcmVsZWFzZXMsIG9idmlvdXNseS4KKworQ29uZmlndXJhdGlvbiAKKz09PQorCitkYnVzIGNvdWxkIGJlIGJ1aWxkIGJ5IHVzaW5nIGF1dG90b29scyBvciBjbWFrZS4gCisKK1doZW4gdXNpbmcgYXV0b3Rvb2xzIHRoZSBjb25maWd1cmUgc3RlcCBpcyBpbml0aWF0ZWQgYnkgcnVubmluZyAuL2NvbmZpZ3VyZSAKK3dpdGggb3Igd2l0aG91dCBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gZmxhZ3MuIAorCitXaGVuIHVzaW5nIGNtYWtlIHRoZSBjb25maWd1cmUgc3RlcCBpcyBpbml0aWF0ZWQgYnkgcnVubmluZyB0aGUgY21ha2UgCitwcm9ncmFtIHdpdGggb3Igd2l0aG91dCBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gZmxhZ3MuIAorCitDb25maWd1cmF0aW9uIGZsYWdzCis9PT0KKworV2hlbiB1c2luZyBhdXRvdG9vbHMsIHJ1biAiLi9jb25maWd1cmUgLS1oZWxwIiB0byBzZWUgdGhlIHBvc3NpYmxlCitjb25maWd1cmF0aW9uIG9wdGlvbnMgYW5kIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKworV2hlbiB1c2luZyBjbWFrZSwgaW5zcGVjdCBSRUFETUUuY21ha2UgdG8gc2VlIHRoZSBwb3NzaWJsZQorY29uZmlndXJhdGlvbiBvcHRpb25zIGFuZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisgICAgCitBUEkvQUJJIFBvbGljeQorPT09CisKK05vdyB0aGF0IEQtQnVzIGhhcyByZWFjaGVkIHZlcnNpb24gMS4wLCB0aGUgb2JqZWN0aXZlIGlzIHRoYXQgYWxsCithcHBsaWNhdGlvbnMgZHluYW1pY2FsbHkgbGlua2VkIHRvIGxpYmRidXMgd2lsbCBjb250aW51ZSB3b3JraW5nCitpbmRlZmluaXRlbHkgd2l0aCB0aGUgbW9zdCByZWNlbnQgc3lzdGVtIGFuZCBzZXNzaW9uIGJ1cyBkYWVtb25zLgorCisgLSBUaGUgcHJvdG9jb2wgd2lsbCBuZXZlciBiZSBicm9rZW4gYWdhaW47IGFueSBtZXNzYWdlIGJ1cyBzaG91bGQgCisgICB3b3JrIHdpdGggYW55IGNsaWVudCBmb3JldmVyLiBIb3dldmVyLCBleHRlbnNpb25zIGFyZSBwb3NzaWJsZQorICAgd2hlcmUgdGhlIHByb3RvY29sIGlzIGV4dGVuc2libGUuCisKKyAtIElmIHRoZSBsaWJyYXJ5IEFQSSBpcyBtb2RpZmllZCBpbmNvbXBhdGlibHksIHdlIHdpbGwgcmVuYW1lIGl0IAorICAgYXMgaW4gaHR0cDovL29tZXRlci5jb20vcGFyYWxsZWwuaHRtbCAtIGluIG90aGVyIHdvcmRzLCAKKyAgIGl0IHdpbGwgYWx3YXlzIGJlIHBvc3NpYmxlIHRvIGNvbXBpbGUgYWdhaW5zdCBhbmQgdXNlIHRoZSBvbGRlciAKKyAgIEFQSSwgYW5kIGFwcHMgd2lsbCBhbHdheXMgZ2V0IHRoZSBBUEkgdGhleSBleHBlY3QuCisKK0ludGVyZmFjZXMgY2FuIGFuZCBwcm9iYWJseSB3aWxsIGJlIF9hZGRlZF8uIFRoaXMgbWVhbnMgYm90aCBuZXcKK2Z1bmN0aW9ucyBhbmQgdHlwZXMgaW4gbGliZGJ1cywgYW5kIG5ldyBtZXRob2RzIGV4cG9ydGVkIHRvCithcHBsaWNhdGlvbnMgYnkgdGhlIGJ1cyBkYWVtb24uCisKK1RoZSBhYm92ZSBwb2xpY3kgaXMgaW50ZW5kZWQgdG8gbWFrZSBELUJ1cyBhcyBBUEktc3RhYmxlIGFzIG90aGVyCit3aWRlbHktdXNlZCBsaWJyYXJpZXMgKHN1Y2ggYXMgR1RLKywgUXQsIFhsaWIsIG9yIHlvdXIgZmF2b3JpdGUKK2V4YW1wbGUpLiBJZiB5b3UgaGF2ZSBxdWVzdGlvbnMgb3IgY29uY2VybnMgdGhleSBhcmUgdmVyeSB3ZWxjb21lIG9uCit0aGUgRC1CdXMgbWFpbGluZyBsaXN0LgorCitOT1RFIEFCT1VUIERFVkVMT1BNRU5UIFNOQVBTSE9UUyBBTkQgVkVSU0lPTklORworCitPZGQtbnVtYmVyZWQgbWlub3IgcmVsZWFzZXMgKDEuMS54LCAxLjMueCwgMi4xLngsIGV0Yy4gLQorbWFqb3IubWlub3IubWljcm8pIGFyZSBkZXZlbCBzbmFwc2hvdHMgZm9yIHRlc3RpbmcsIGFuZCBhbnkgbmV3IEFCSQordGhleSBpbnRyb2R1Y2UgcmVsYXRpdmUgdG8gdGhlIGxhc3Qgc3RhYmxlIHZlcnNpb24gaXMgc3ViamVjdCB0bworY2hhbmdlIGR1cmluZyB0aGUgZGV2ZWxvcG1lbnQgY3ljbGUuCisKK0FueSBBQkkgZm91bmQgaW4gYSBzdGFibGUgcmVsZWFzZSwgaG93ZXZlciwgaXMgZnJvemVuLgorCitBQkkgd2lsbCBub3QgYmUgYWRkZWQgaW4gYSBzdGFibGUgc2VyaWVzIGlmIHdlIGNhbiBoZWxwIGl0LiBpLmUuIHRoZQorQUJJIG9mIDEuMi4wIGFuZCAxLjIuNSB5b3UgY2FuIGV4cGVjdCB0byBiZSB0aGUgc2FtZSwgd2hpbGUgdGhlIEFCSSBvZgorMS40LnggbWF5IGFkZCBtb3JlIHN0dWZmIG5vdCBmb3VuZCBpbiAxLjIueC4KKworTk9URSBBQk9VVCBTVEFUSUMgTElOS0lORworCitXZSBhcmUgbm90IHlldCBmaXJtbHkgZnJlZXppbmcgYWxsIHJ1bnRpbWUgZGVwZW5kZW5jaWVzIG9mIHRoZSBsaWJkYnVzCitsaWJyYXJ5LiBGb3IgZXhhbXBsZSwgdGhlIGxpYnJhcnkgbWF5IHJlYWQgY2VydGFpbiBmaWxlcyBhcyBwYXJ0IG9mCitpdHMgaW1wbGVtZW50YXRpb24sIGFuZCB0aGVzZSBmaWxlcyBtYXkgbW92ZSBhcm91bmQgYmV0d2VlbiB2ZXJzaW9ucy4KKworQXMgYSByZXN1bHQsIHdlIGRvbid0IHlldCByZWNvbW1lbmQgc3RhdGljYWxseSBsaW5raW5nIHRvCitsaWJkYnVzLiBBbHNvLCByZWltcGxlbWVudGF0aW9ucyBvZiB0aGUgcHJvdG9jb2wgZnJvbSBzY3JhdGNoIG1pZ2h0CitoYXZlIHRvIHdvcmsgdG8gc3RheSBpbiBzeW5jIHdpdGggaG93IGxpYmRidXMgYmVoYXZlcy4KKworVG8gbG9jayB0aGluZ3MgZG93biBhbmQgZGVjbGFyZSBzdGF0aWMgbGlua2luZyBhbmQgcmVpbXBsZW1lbnRhdGlvbiB0bworYmUgc2FmZSwgd2UnZCBsaWtlIHRvIHNlZSBhbGwgdGhlIGludGVybmFsIGRlcGVuZGVuY2llcyBvZiBsaWJkYnVzCisoZm9yIGV4YW1wbGUsIGZpbGVzIHJlYWQpIHdlbGwtZG9jdW1lbnRlZCBpbiB0aGUgc3BlY2lmaWNhdGlvbiwgYW5kCit3ZSdkIGxpa2UgdG8gaGF2ZSBhIGhpZ2ggZGVncmVlIG9mIGNvbmZpZGVuY2UgdGhhdCB0aGVzZSBkZXBlbmRlbmNpZXMKK2FyZSBzdXBwb3J0YWJsZSBvdmVyIHRoZSBsb25nIHRlcm0gYW5kIGV4dGVuc2libGUgd2hlcmUgcmVxdWlyZWQuCisKK05PVEUgQUJPVVQgSElHSC1MRVZFTCBCSU5ESU5HUworCitOb3RlIHRoYXQgdGhlIGhpZ2gtbGV2ZWwgYmluZGluZ3MgYXJlIF9zZXBhcmF0ZSBwcm9qZWN0c18gZnJvbSB0aGUKK21haW4gRC1CdXMgcGFja2FnZSwgYW5kIGhhdmUgdGhlaXIgb3duIHJlbGVhc2UgY3ljbGVzLCBsZXZlbHMgb2YKK21hdHVyaXR5LCBhbmQgQUJJIHN0YWJpbGl0eSBwb2xpY2llcy4gUGxlYXNlIGNvbnN1bHQgdGhlIGRvY3VtZW50YXRpb24KK2ZvciB5b3VyIGJpbmRpbmcuCisKK0Jvb3RzdHJhcHBpbmcgRC1CdXMgb24gbmV3IHBsYXRmb3JtcworPT09CisKK0EgZnVsbCBidWlsZCBvZiBELUJ1cywgd2l0aCBhbGwgcmVncmVzc2lvbiB0ZXN0cyBlbmFibGVkIGFuZCBydW4sIGhhcyBzb21lCitkZXBlbmRlbmNpZXMgd2hpY2ggdGhlbXNlbHZlcyBkZXBlbmQgb24gRC1CdXMsIGVpdGhlciBmb3IgY29tcGlsYXRpb24gb3IKK2ZvciBzb21lIG9mICp0aGVpciogcmVncmVzc2lvbiB0ZXN0czogR0xpYiwgZGJ1cy1nbGliIGFuZCBkYnVzLXB5dGhvbiBhcmUKK2N1cnJlbnRseSBhZmZlY3RlZC4KKworVG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzLCB3aGVuIGJvb3RzdHJhcHBpbmcgRC1CdXMgZm9yIHRoZSBmaXJzdCB0aW1lCitvbiBhIG5ldyBPUyBvciBDUFUgYXJjaGl0ZWN0dXJlLCB5b3UgY2FuIGVpdGhlciBjcm9zcy1jb21waWxlIHNvbWUgb2YKK3Rob3NlIGNvbXBvbmVudHMsIG9yIGNob29zZSB0aGUgYnVpbGQgb3JkZXIgYW5kIG9wdGlvbnMgY2FyZWZ1bGx5OgorCisqIGJ1aWxkIGFuZCBpbnN0YWxsIEQtQnVzIHdpdGhvdXQgdGVzdHMKKyAgLSBkbyBub3QgdXNlIHRoZSAtLWVuYWJsZS1tb2R1bGFyLXRlc3RzPXllcyBjb25maWd1cmUgb3B0aW9uCisgIC0gZG8gbm90IHVzZSB0aGUgLS1lbmFibGUtdGVzdHM9eWVzIGNvbmZpZ3VyZSBvcHRpb24KKyogYnVpbGQgYW5kIGluc3RhbGwgR0xpYiwgYWdhaW4gd2l0aG91dCB0ZXN0cworKiB1c2UgdGhvc2UgdmVyc2lvbnMgb2YgbGliZGJ1cyBhbmQgR0xpYiB0byBidWlsZCBhbmQgaW5zdGFsbCBkYnVzLWdsaWIKKyogLi4uIGFuZCB1c2UgdGhvc2UgdG8gaW5zdGFsbCBkYnVzLXB5dGhvbgorKiByZWJ1aWxkIGxpYmRidXM7IHRoaXMgdGltZSB5b3UgY2FuIHJ1biBhbGwgb2YgdGhlIHRlc3RzCisqIHJlYnVpbGQgR0xpYjsgdGhpcyB0aW1lIHlvdSBjYW4gcnVuIGFsbCBvZiB0aGUgdGVzdHMKZGlmZiAtLWdpdCBhL2RidXMvUkVBRE1FLmNtYWtlIGIvZGJ1cy9SRUFETUUuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZlYWY1NQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvUkVBRE1FLmNtYWtlCkBAIC0wLDAgKzEsMTcxIEBACitUaGlzIGZpbGUgZGVzY3JpYmVzIGhvdyB0byBjb21waWxlIGRidXMgdXNpbmcgdGhlIGNtYWtlIGJ1aWxkIHN5c3RlbQorCitSZXF1aXJlbWVudHMKKy0tLS0tLS0tLS0tLQorLSBjbWFrZSB2ZXJzaW9uID49IDIuNC40IHNlZSBodHRwOi8vd3d3LmNtYWtlLm9yZworLSBpbnN0YWxsZWQgbGliZXhwYXQgc2VlIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZXhwYXQvIAorICAgIHVuc3VwcG9ydGVkIFJlbFdpdGhEZWJJbmZvIGJ1aWxkcyBjb3VsZCBiZSBmZXRjaGVkIAorICAgIGZyb20gaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9rZGUtd2luZG93cy9maWxlcy9leHBhdC8KKworQnVpbGRpbmcKKy0tLS0tLS0tCisKK1dpbjMyIE1pbkdXLXc2NHwzMgorMS4gaW5zdGFsbCBtaW5ndy13NjQgZnJvbSBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL21pbmd3LXc2NC8KKzIuIGluc3RhbGwgY21ha2UgYW5kIGxpYmV4cGF0CiszLiBnZXQgZGJ1cyBzb3VyY2VzCis0LiB1bnBhY2sgZGJ1cyBzb3VyY2VzIGludG8gYSBzdWIgZGlyZWN0b3J5IChyZWZlcnJlZCBhcyA8ZGJ1cy1zcmMtcm9vdD4gbGF0ZXIpCis1LiBta2RpciBkYnVzLWJ1aWxkCis2LiBjZCBkYnVzLWJ1aWxkCis3LiBydW4gCisgICAgY21ha2UgLUcgIk1pbkdXIE1ha2VmaWxlcyIgWzxvcHRpb25zLCBzZWUgYmVsb3c+XSA8ZGJ1cy1zcmMtcm9vdD4vY21ha2UKKyAgICBtaW5ndzMyLW1ha2UKKyAgICBtaW5ndzMyLW1ha2UgaW5zdGFsbAorCitXaW4zMiBNaWNyb3NvZnQgbm1ha2UKKzEuIGluc3RhbGwgTVNWQyAyMDEwIEV4cHJlc3MgVmVyc2lvbiBmcm9tIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS92aXN1YWxzdHVkaW8vZW4tdXMvcHJvZHVjdHMvMjAxMC1lZGl0aW9ucy92aXN1YWwtY3BwLWV4cHJlc3MKKzIuIGluc3RhbGwgY21ha2UgYW5kIGxpYmV4cGF0CiszLiBnZXQgZGJ1cyBzb3VyY2VzCis0LiB1bnBhY2sgZGJ1cyBzb3VyY2VzIGludG8gYSBzdWIgZGlyZWN0b3J5IChyZWZlcnJlZCBhcyA8ZGJ1cy1zcmMtcm9vdD4gbGF0ZXIpCis1LiBta2RpciBkYnVzLWJ1aWxkCis2LiBjZCBkYnVzLWJ1aWxkCis3LiBydW4gCisgICAgY21ha2UgLUcgIk5NYWtlIE1ha2VmaWxlcyIgWzxvcHRpb25zLCBzZWUgYmVsb3c+XSA8ZGJ1cy1zcmMtcm9vdD4vY21ha2UKKyAgICBubWFrZQorICAgIG5tYWtlIGluc3RhbGwKKworV2luMzIgVmlzdWFsIFN0dWRpbyAyMDEwIEV4cHJlc3MgSURFCisxLiBpbnN0YWxsIE1TVkMgMjAxMCBFeHByZXNzIFZlcnNpb24gZnJvbSBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vdmlzdWFsc3R1ZGlvL2VuLXVzL3Byb2R1Y3RzLzIwMTAtZWRpdGlvbnMvdmlzdWFsLWNwcC1leHByZXNzCisyLiBpbnN0YWxsIGNtYWtlIGFuZCBsaWJleHBhdAorMy4gZ2V0IGRidXMgc291cmNlcworNC4gdW5wYWNrIGRidXMgc291cmNlcyBpbnRvIGEgc3ViIGRpcmVjdG9yeSAocmVmZXJyZWQgYXMgPGRidXMtc3JjLXJvb3Q+IGxhdGVyKQorNS4gbWtkaXIgZGJ1cy1idWlsZAorNi4gY2QgZGJ1cy1idWlsZAorNy4gcnVuCisgICAgICBjbWFrZSAtRyAiVmlzdWFsIFN0dWRpbyAxMCIgWzxvcHRpb25zLCBzZWUgYmVsb3c+XSA8ZGJ1cy1zcmMtcm9vdD4vY21ha2UKKzhhLiBvcGVuIElERSB3aXRoCisgICAgICB2Y2V4cHJlc3MgZGJ1cy5zbG4KKzhiLiBmb3IgaW1tZWRpYXRlIGJ1aWxkIHJ1bgorICAgICAgdmNleHByZXNzIGRidXMuc2xuIC9idWlsZAorCitXaW4zMiBWaXN1YWwgU3R1ZGlvIDIwMTAgUHJvZmVzc2lvbmFsIElERQorMS4gaW5zdGFsbCBNU1ZDIDIwMTAgUHJvZmVzc2lvbmFsIFZlcnNpb24KKzIuIGluc3RhbGwgY21ha2UgYW5kIGxpYmV4cGF0CiszLiBnZXQgZGJ1cyBzb3VyY2VzCis0LiB1bnBhY2sgZGJ1cyBzb3VyY2VzIGludG8gYSBzdWIgZGlyZWN0b3J5IChyZWZlcnJlZCBhcyA8ZGJ1cy1zcmMtcm9vdD4gbGF0ZXIpCis1LiBta2RpciBkYnVzLWJ1aWxkCis2LiBjZCBkYnVzLWJ1aWxkCis3LiBydW4gCisgICAgICBjbWFrZSAtRyAiVmlzdWFsIFN0dWRpbyAxMCIgWzxvcHRpb25zLCBzZWUgYmVsb3c+XSA8ZGJ1cy1zcmMtcm9vdD4vY21ha2UKKzhhLiBvcGVuIElERSB3aXRoCisgICAgICBkZXZlbnYgZGJ1cy5zbG4KKzhiLiBmb3IgaW1tZWRpYXRlIGJ1aWxkIHJ1bgorICAgICAgZGV2ZW52IGRidXMuc2xuIC9idWlsZAorCitMaW51eAorMS4gaW5zdGFsbCBjbWFrZSBhbmQgbGliZXhwYXQKKzIuIGdldCBkYnVzIHNvdXJjZXMKKzMuIHVucGFjayBkYnVzIHNvdXJjZXMgaW50byBhIHN1YiBkaXJlY3RvcnkgKHJlZmVycmVkIGFzIDxkYnVzLXNyYy1yb290PiBsYXRlcikKKzQuIG1rZGlyIGRidXMtYnVpbGQKKzUuIGNkIGRidXMtYnVpbGQKKzYuIHJ1biAKKyAgICBjbWFrZSAtRyAiPGZvciBhdmFpbGFibGUgdGFyZ2V0cywgc2VlIGNtYWtlIC0taGVscCBmb3IgYSBsaXN0PiIgWzxvcHRpb25zLCBzZWUgYmVsb3c+XSA8ZGJ1cy1zcmMtcm9vdD4vY21ha2UKKyAgICBtYWtlCisgICAgbWFrZSBpbnN0YWxsCisKK0ZvciBvdGhlciBjb21waWxlcnMgc2VlIGNtYWtlIC0taGVscCBpbiB0aGUgR2VuZXJhdG9ycyBzZWN0aW9uCisKK0NvbmZpZ3VyYXRpb24gZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hlbiB1c2luZyB0aGUgY21ha2UgYnVpbGQgc3lzdGVtIHRoZSBkYnVzLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZmxhZ3MgdGhhdCBjYW4gYmUgZ2l2ZW4gCit0byB0aGUgY21ha2UgcHJvZ3JhbSBhcmUgdGhlc2UgKHVzZSAtRDxrZXk+PTx2YWx1ZT4gb24gY29tbWFuZCBsaW5lKS4gVGhlIGxpc3RlZCB2YWx1ZXMgCithcmUgdGhlIGRlZmF1bHRzLgorCisvLyBDaG9vc2UgdGhlIHR5cGUgb2YgYnVpbGQsIG9wdGlvbnMgYXJlOiBOb25lKENNQUtFX0NYWF9GTEFHUyBvcgorLy8gQ01BS0VfQ19GTEFHUyB1c2VkKSBEZWJ1ZyBSZWxlYXNlIFJlbFdpdGhEZWJJbmZvIE1pblNpemVSZWwuCitDTUFLRV9CVUlMRF9UWVBFOlNUUklORz1EZWJ1ZworCisvLyBJbmNsdWRlIHBhdGggZm9yIDNyZHBhcnR5IHBhY2thZ2VzCitDTUFLRV9JTkNMVURFX1BBVEg6UEFUSD0KKworLy8gTGlicmFyeSBwYXRoIGZvciAzcmRwYXJ0eSBwYWNrYWdlcworQ01BS0VfTElCUkFSWV9QQVRIOlBBVEg9CisKKy8vIEluc3RhbGwgcGF0aCBwcmVmaXgsIHByZXBlbmRlZCBvbnRvIGluc3RhbGwgZGlyZWN0b3JpZXMuCitDTUFLRV9JTlNUQUxMX1BSRUZJWDpQQVRIPUM6L1Byb2dyYW0gRmlsZXMvZGJ1cworCisKKy8vIGVuYWJsZSB1bml0IHRlc3QgY29kZQorREJVU19CVUlMRF9URVNUUzpCT09MPU9OCisKKy8vIFRoZSBuYW1lIG9mIHRoZSBkYnVzIGRhZW1vbiBleGVjdXRhYmxlCitEQlVTX0RBRU1PTl9OQU1FOlNUUklORz1kYnVzLWRhZW1vbgorCisvLyBEaXNhYmxlIGFzc2VydGlvbiBjaGVja2luZworREJVU19ESVNBQkxFX0FTU0VSVFM6Qk9PTD1PRkYKKworLy8gRGlzYWJsZSBwdWJsaWMgQVBJIHNhbml0eSBjaGVja2luZworREJVU19ESVNBQkxFX0NIRUNLUzpCT09MPU9GRgorCisvLyBlbmFibGUgLWFuc2kgLXBlZGFudGljIGdjYyBmbGFncworREJVU19FTkFCTEVfQU5TSTpCT09MPU9GRgorCisvLyBidWlsZCBET1hZR0VOIGRvY3VtZW50YXRpb24gKHJlcXVpcmVzIERveHlnZW4pCitEQlVTX0VOQUJMRV9ET1hZR0VOX0RPQ1M6Qk9PTD1PRkYKKworLy8gZW5hYmxlIGJ1cyBkYWVtb24gdXNhZ2Ugc3RhdGlzdGljcworREJVU19FTkFCTEVfU1RBVFM6Qk9PTD1PRkYKKworLy8gc3VwcG9ydCB2ZXJib3NlIGRlYnVnIG1vZGUKK0RCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERTpCT09MPU9OCisKKy8vIGJ1aWxkIFhNTCAgZG9jdW1lbnRhdGlvbiAocmVxdWlyZXMgeG1sdG8gb3IgbWVpbnByb2M0KQorREJVU19FTkFCTEVfWE1MX0RPQ1M6Qk9PTD1PTgorCisvLyBTb21lIGF0b21pYyBpbnRlZ2VyIGltcGxlbWVudGF0aW9uIHByZXNlbnQKK0RCVVNfSEFWRV9BVE9NSUNfSU5UOkJPT0w9T0ZGCisKKy8vIGluc3RhbGwgcmVxdWlyZWQgc3lzdGVtIGxpYnJhcmllcworREJVU19JTlNUQUxMX1NZU1RFTV9MSUJTOkJPT0w9T0ZGCisKKy8vIHNlc3Npb24gYnVzIGRlZmF1bHQgYWRkcmVzcworREJVU19TRVNTSU9OX0JVU19ERUZBVUxUX0FERFJFU1M6U1RSSU5HPW5vbmNlLXRjcDoKKworLy8gc3lzdGVtIGJ1cyBkZWZhdWx0IGFkZHJlc3MKK0RCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1M6U1RSSU5HPW5vbmNlLXRjcDoKKworLy8gVXNlIGF0b21pYyBpbnRlZ2VyIGltcGxlbWVudGF0aW9uIGZvciA0ODYKK0RCVVNfVVNFX0FUT01JQ19JTlRfNDg2OkJPT0w9T0ZGCisKKy8vIFVzZSBleHBhdCAoPT0gT04pIG9yIGxpYnhtbDIgKD09T0ZGKQorREJVU19VU0VfRVhQQVQ6Qk9PTD1PTgorCit3aW4zMiBvbmx5OgorLy8gZW5hYmxlIHdpbjMyIGRlYnVnIHBvcnQgZm9yIG1lc3NhZ2Ugb3V0cHV0CitEQlVTX1VTRV9PVVRQVVRfREVCVUdfU1RSSU5HOkJPT0w9T0ZGCisKK2djYyBvbmx5OgorLy8gY29tcGlsZSB3aXRoIGNvdmVyYWdlIHByb2ZpbGluZyBpbnN0cnVtZW50YXRpb24KK0RCVVNfR0NPVl9FTkFCTEVEOkJPT0w9T0ZGCisKK2xpbnV4IG9ubHk6CisvLyBidWlsZCB3aXRoIGRub3RpZnkgc3VwcG9ydCAKK0RCVVNfQlVTX0VOQUJMRV9ETk9USUZZX09OX0xJTlVYOkJPT0w9T04KKworc29sYXJpcyBvbmx5OgorLy8gZW5hYmxlIGNvbnNvbGUgb3duZXIgZmlsZSAKK0hBVkVfQ09OU09MRV9PV05FUl9GSUxFOkJPT0w9T04KKworLy8gRGlyZWN0b3J5IHRvIGNoZWNrIGZvciBjb25zb2xlIG93bmVyc2hpcAorREJVU19DT05TT0xFX09XTkVSX0ZJTEU6U1RSSU5HPS9kZXYvY29uc29sZQorCit4MTEgb25seToKKy8vIEJ1aWxkIHdpdGggWDExIGF1dG8gbGF1bmNoIHN1cHBvcnQKK0RCVVNfQlVJTERfWDExOkJPT0w9T04KKworCitOb3RlOiBUaGUgYWJvdmUgbWVudGlvbmVkIG9wdGlvbnMgY291bGQgYmUgZXh0cmFjdGVkIGFmdGVyIAorY29uZmlndXJpbmcgZnJvbSB0aGUgb3V0cHV0IG9mIHJ1bm5pbmcgIjxtYWtldG9vbD4gaGVscC1vcHRpb25zIiAKK2luIHRoZSBidWlsZCBkaXJlY3RvcnkuIFRoZSByZWxhdGVkIGVudHJpZXMgc3RhcnQgd2l0aCAKK0NNQUtFXyBvciBEQlVTXy4gCmRpZmYgLS1naXQgYS9kYnVzL1JFQURNRS5jeWd3aW4gYi9kYnVzL1JFQURNRS5jeWd3aW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTA0Y2JiNAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvUkVBRE1FLmN5Z3dpbgpAQCAtMCwwICsxLDYgQEAKK1RoZSBjeWd3aW4gZGJ1cyBwb3J0IGlzIGluY2x1ZGVkIGluIG1hc3RlciBicmFuY2ggb2YKK2RidXMgZ2l0IHJlcG9zaXRvcnkgc2luY2UgMS4zLjEuCisKK1RoZSBjeWd3aW4gcG9ydCBvZiBkYnVzIGlzIG1haW50YWluZWQgYnk6CisKK2h0dHA6Ly9zb3VyY2V3YXJlLm9yZy9jeWd3aW5wb3J0cy8KZGlmZiAtLWdpdCBhL2RidXMvUkVBRE1FLmxhdW5jaGQgYi9kYnVzL1JFQURNRS5sYXVuY2hkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMWU1N2QKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL1JFQURNRS5sYXVuY2hkCkBAIC0wLDAgKzEsNjEgQEAKK0xhdW5jaGRbMSwyXSByZXBsYWNlcyBpbml0LCBpbmV0ZCBhbmQgY3JvbiBvbiBNYWMgT1MgWCBzaW5jZSAxMC40ICJUaWdlciIuCitkYnVzIHVzZXMgdGhpcyBzZXJ2aWNlIHRvIHByb3ZpZGUgYSBjb21tb24gc2Vzc2lvbiBidXMgYWRkcmVzcyBmb3IgZWFjaCB1c2VyCithbmQgc28gZGVwcmVjYXRlcyB0aGUgWDExIGVuYWJsZWQgZGJ1cy1sYXVuY2hlci4KKworWzFdIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL01hY09zWC9sYXVuY2hkLmh0bWwKK1syXSBodHRwOi8vbGF1bmNoZC5tYWNvc2ZvcmdlLm9yZy8KKworCitTZXR1cAorPT09CisKK0NvbmZpZ3VyZSB3aXRoIC0tZW5hYmxlLWxhdW5jaGQgYW5kIC0td2l0aG91dC14IChYMTEgc2hvdWxkIG5vdCBoYXJtIGJ1dCBpdCdzCitzaW1wbHkgbm90IG5lY2Vzc2FyeSBhbnkgbW9yZSkKK0FmdGVyIGluc3RhbGxhdGlvbiwgdG8gcHJldmVudCBhIHJlYm9vdCwgbG9hZCB0aGUgZGJ1cyBzZXNzaW9uIHN0YXJ0ZXIgaW50bworbGF1bmNoZCBieSBleGVjdXRpbmc6CiskIGxhdW5jaGN0bCBsb2FkIC9MaWJyYXJ5L0xhdW5jaEFnZW50cy9vcmcuZnJlZWRlc2t0b3AuZGJ1cy1zZXNzaW9uLnBsaXN0CisKK1lvdSBjYW4gY2hhbmdlIHRoZSBsYXVuY2ggYWdlbnQgZGlyIHZpYSBjb25maWd1cmUsIGJ1dCBpdCdzIG5vdCByZWNvbW1lbmRlZC4KK01ha2Ugc3VyZSB0byBleGVjdXRlIHRoZSBhYm92ZSBsaW5lIGFzIHRoZSBhY3R1YWwgdXNlciBmb3Igd2hpY2ggeW91IHdhbnQgdG8KK3VzZSBhIHNlc3Npb24gYnVzIHNpbmNlIGxhdW5jaGQgbWFuYWdlcyBpdHMgYWdlbnRzIG9uIGEgcGVyIHVzZXIgYmFzaXMuCisKKworSG93IGl0IHdvcmtzCis9PT0KKworTGF1bmNoZCBhbGxvY2F0ZXMgYSBzb2NrZXQgYW5kIHByb3ZpZGVzIHRoZSB1bml4IHBhdGggdG8gaXQgdmlhIHRoZSB2YXJpYWJsZQorREJVU19MQVVOQ0hEX1NFU1NJT05fQlVTX1NPQ0tFVCBpbiBsYXVuY2hkJ3MgZW52aXJvbm1lbnQuIEV2ZXJ5IHByb2Nlc3MKK3NwYXduZWQgYnkgbGF1bmNoZCAob3IgZGJ1cy1kYWVtb24sIGlmIHN0YXJlZCBieSBsYXVuY2hkKSBjYW4gYWNjZXNzIGl0IHRocm91Z2gKK2l0cyBvd24gZW52aXJvbm1lbnQuIE90aGVyIHByb2Nlc3NlcyBjYW4gcXVlcnkgbGF1bmNoZCBmb3IgaXQgYnkgZXhlY3V0aW5nOgorJCBsYXVuY2hjdGwgZ2V0ZW52IERCVVNfTEFVTkNIRF9TRVNTSU9OX0JVU19TT0NLRVQKK0hvd2V2ZXIsIHRoaXMgaXMgbm9ybWFsbHkgZG9uZSBieSB0aGUgZGJ1cyBjbGllbnQgbGliIGZvciB5b3UuCisKK0lmIGxhdW5jaGQgc3RhcnQgZGJ1cy1kYWVtb24gd2l0aCBhIGNvbmZpZyBmaWxlIGNvbnRhaW5pbmcgYSAibGF1bmNoZDplbnY9Rk9PIgorYWRkcmVzcywgYXMgdGhlIGRlZmF1bHQgc2Vzc2lvbiBjb25maWcgZG9lcyB3aXRoIGVudj1EQlVTX0xBVU5DSERfU0VTU0lPTl9CVVNfU09DS0VULAordGhlIGRhZW1vbiB3aWxsIGdldCB0aGUgZmlsZSBkZXNjcmlwdG9yIGZyb20gbGF1bmNoZCBhbmQgc3RhcnQgbGlzdGVuaW5nIG9uIGl0LgorVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHVzZWQgdG8gZ2V0IHRoZSBhY3R1YWwgc29ja2V0IHBhdGggd2hpY2ggaXMgcGFzc2VkCit0byBldmVyeSBzZXJ2aWNlIHNwYXduZWQgYnkgZGJ1cy1kYWVtb24gYXMgYSByZXN1bHQgZnJvbSBhdXRvbGF1bmNoIG1lc3NhZ2VzLgorUGxlYXNlIG5vdGUgdGhhdCBpdCdzIG5vdCBwb3NzaWJsZSB0byBzdGFydCBkYnVzLWRhZW1vbiBtYW51YWxseSB3aGVuIHVzaW5nIGEKKyJsYXVuY2hkOiIgYWRkcmVzcy4gT25seSBjaGlsZCBwcm9jZXNzZXMgb2YgbGF1bmNoZCBjYW4gYWNjZXNzIHRoZSBhYm92ZQorbWVudGlvbmVkIGZpbGUgZGVzY3JpcHRvciEKKworVG8gY3JlYXRlIGN1c3RvbSBidXNlcyBqdXN0IHNldCB1cCBhbiBvdGhlciBsYXVuY2ggYWdlbnQuIEFzIGEgcXVpY2sgc3RhcnQgY29weQorL0xpYnJhcnkvTGF1bmNoQWdlbnRzL29yZy5mcmVlZGVza3RvcC5kYnVzLXNlc3Npb24ucGxpc3QsIGNoYW5nZSB0aGUgbGFiZWwKK3RvIGkuZS4gIm9yZy5mcmVlZGVza3RvcC5kYnVzLWZvbyIgYW5kIGNoYW5nZSB0aGUgU2VjdXJlU29ja2V0V2l0aEtleSB2YWx1ZSwKK2kuZS4gdG8gIkRCVVNfTEFVTkNIRF9GT09fQlVTX1NPQ0tFVCIuIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIHRvIGJlIHNldAoraW4gdGhlIGNvbmZpZyBmaWxlIGZvciB5b3VyIG5ldyBidXMgaW4gdGhlIDxsaXN0ZW4+IGVsZW1lbnQgKHNlZSBzZXNzaW9uLmNvbmZpZykuCitUaGVuIGVkaXQgeW91ciAvTGlicmFyeS9MYXVuY2hBZ2VudHMvb3JnLmZyZWVkZXNrdG9wLmRidXMtZm9vLnBsaXN0IHRvIHN0YXJ0CitkYnVzLWRhZW1vbiB3aXRoICItLWNvbmZpZy1maWxlPS9vcHQvbG9jYWwvZXRjL2RidXMtMS9mb28uY29uZiIgaW5zdGVhZCBvZgorIi0tc2Vzc2lvbiIuIE5vdyBsb2FkIHRoZSBuZXcgcGxpc3Qgb250byBsYXVuY2hkIGFzIGRlc2NyaWJlZCBpbiB0aGUgc2V0dXAKK3NlY3Rpb24gb2YgdGhpcyBkb2N1bWVudC4KK0V4ZWN1dGluZyAibGF1bmNoY3RsIGV4cG9ydCIgc2hvdWxkIG5vdyBnaXZlIHlvdSB0d28gc29ja2V0cywgb25lIGluCitEQlVTX0xBVU5DSERfU0VTU0lPTl9CVVNfU09DS0VUIGFuZCB0aGUgbmV3IERCVVNfTEFVTkNIRF9GT09fQlVTX1NPQ0tFVC4KK1RvIGNvbm5lY3QgdG8gdGhpcyBuZXcgYnVzIHVzZSAibGF1bmNoZDplbnY9REJVU19MQVVOQ0hEX0ZPT19CVVNfU09DS0VUIi4KKworU2luY2UgTWFjIE9TIFggMTAuNSAiTGVvcGFyZCIgeW91IGNhbiBhbHNvIGNvbmZpZ3VyZSBsYXVuY2hkIHRvIHN0YXJ0CitkYnVzLWRhZW1vbiBvbiBkZW1hbmQgYXMgc29vbiBhcyBzb21lIHByb2Nlc3MgY29ubmVjdHMgdG8gdGhlIHNvY2tldC4gU2luY2UKK2l0J3MgYnJva2VuIG9uIDEwLjQgdGhpcyBmZWF0dXJlIGlzIGRpc2FibGVkIHBlciBkZWZhdWx0LiBMb29rIGF0CisvTGlicmFyeS9MYXVuY2hBZ2VudHMvb3JnLmZyZWVkZXNrdG9wLmRidXMtc2Vzc2lvbi5wbGlzdCB0byBjaGFuZ2UgaXQuCisKK09uIHRoZSBjbGllbnQgc2lkZSwgdGhlIGVudnZhciBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MgY2FuIGJlIG5vcm1hbGx5IHVzZWQKK2J1dCBpZiBpdCdzIG5vdCBzZXQsIGxhdW5jaGQgaXMgcXVlcmllZCBmb3IgdGhlIHNlc3Npb24gYnVzIHNvY2tldC4KZGlmZiAtLWdpdCBhL2RidXMvUkVBRE1FLndpbiBiL2RidXMvUkVBRE1FLndpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMThmMjNkCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9SRUFETUUud2luCkBAIC0wLDAgKzEsMTExIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorV2luZG93cyBwb3J0IG9mIHRoZSBmcmVlZGVza3RvcC5vcmcgRC1CdXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZlYXR1cmVzIGFuZCBjb21wbGV0ZW5lc3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSB3aW5kb3dzIHBvcnQgb2YgZGJ1cyBwcm92aWRlcyB0aGUgZGJ1cy0xIGxpYnJhcnkgYW5kIG1vc3RseQorYXBwbGljYXRpb25zIHdoaWNoIGFyZSBhbHJlYWR5IGF2YWlsYWJsZSBvbiB1bml4LiBUaGVzZSBhcHBsaWNhdGlvbnMKK2FyZTogZGJ1cy1kYWVtb24sIGRidXMtbGF1bmNoLCBkYnVzLW1vbml0b3IgYW5kIGRidXMtc2VuZC4KK0RCdXMgY29tZXMgd2l0aCBhIHRlc3Qgc3VpdGUgd2hpY2ggaXMgdXNlZCBvbiB1bml4IHRvIGd1YXJhbnRhdGUKK3Byb2R1Y3Rpb24gcXVhbGl0eSBhbmQgdGhpcyB0ZXN0IHN1aXRlIHJ1bnMgbW9zdGx5LiBUaGVyZSBhcmUgc29tZQordGVzdCBub3QgcnVubmluZyB5ZXQgYW5kIHRoZXJlIGlzIGhlbHAgbmVlZGVkIHRvIGdldCB0aGVtIHJ1bm5pbmcuCisKK1N1cHBvcnRlZCBjb21waWxlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KK09uIHdpbmRvd3MgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMjAxMCAoRXhwcmVzcyBhbmQgcHJvZmVzc2lvbmFsIHZhcmlhbnRzKSAKK2FuZCBtaW5ndy13NjR8MzIgYXJlIGtub3duIHRvIHdvcmsuCisKK0J1aWxkaW5nCistLS0tLS0tLQorREJ1cyBjYW4gYmUgYnVpbHQgb24gd2luZG93cyB1c2luZyBhdXRvbWFrZSBvciBjbWFrZS4gU2VlIHRoZQorZmlsZSBSRUFETUUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCitTcGVjaWFsIGNtYWtlIGJ1aWxkIGluc3RydWN0aW9ucyBjYW4gYmUgZm91bmQgaW4gY21ha2UvcmVhZG1lLWNtYWtlLnR4dAorCisKK3dpbmRidXMgYW5kIGRidXM0d2luIFBvcnRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIFdpbmRvd3MgcG9ydHMgZnJvbSB0aGUgd2luZGJ1cyBhbmQgZGJ1czR3aW4gcHJvamVjdHMgaGFzIGJlZW4gbWVyZ2VkCitpbnRvIHRoZSBmcmVlZGVza3RvcCBnaXQgbWFzdGVyIGJyYW5jaCwgYXMgYXBwbGljYWJsZS4gVGhlIHNwZWMgaGFzIGJlZW4KK3VwZGF0ZWQgd2l0aCB3aW5kb3dzIHNwZWNpZmljIHN0dWZmLgorCisKK1Rlc3RzCistLS0tLQorIC0gZGJ1cyBsaWJyYXJ5IGNoZWNrCisgICAgYmluXGRidXMtdGVzdC5leGUgPGJ1aWxkLXJvb3Q+XHRlc3RcZGF0YQorCisgLSBidXMgZGFlbW9uIGNoZWNrCisgICAgYmluXGJ1cy10ZXN0LmV4ZSA8YnVpbGQtcm9vdD5cdGVzdFxkYXRhCisKKyAtIGNoZWNrIGF2YWlsYWJsZSBuYW1lcworICAgIGJpblx0ZXN0X25hbWVzLmV4ZQorCisgLSBjaGVjayBpZiBkYnVzLWRhZW1vbiBpcyBhY2Nlc3NhYmxlCisgICAgYmluXGRidXMtc2VuZC5leGUgLS1zZXNzaW9uIC0tdHlwZT1tZXRob2RfY2FsbCAtLXByaW50LXJlcGx5IC0tZGVzdD1vcmcuZnJlZWRlc2t0b3AuREJ1cyAvIG9yZy5mcmVlZGVza3RvcC5EQnVzLkxpc3ROYW1lcyBtZXRob2QgcmV0dXJuIHNlbmRlcj1vcmcuZnJlZWRlc2t0b3AuREJ1cyAtPiBkZXN0PToxLjQgYXJyYXkgWyBzdHJpbmcgIm9yZy5mcmVlZGVza3RvcC5EQnVzInN0cmluZyAiOjEuNCJdCisKKyAtIHN0YXJ0IHNlc3Npb24gZGJ1cy1kYWVtb24KKyAgICBlaXRoZXIgYnkgcnVubmluZworICAgICAgICBiaW5cZGJ1cy1sYXVuY2gKKyAgICBvcgorICAgICAgICBzdGFydCBiaW5cZGJ1cy1kYWVtb24gLS1zZXNzaW9uCisKKyAgICBCZWZvcmUgcnVubmluZyB0aGVzZSBjb21tYW5kcyB5b3UgbWF5IGV4ZWN1dGUKKyAgICAgICAgc2V0IERCVVNfVkVSQk9TRT0xCisgICAgZm9yIGdldHRpbmcgZGVidWcgaW5mb3MKKworCisgLSBjYWxsIGZ1bmN0aW9uIHJlZ2lzdGVyZCBpbiBkYnVzCisgICAgYmluXGRidXMtc2VuZC5leGUgIC0tZGVzdD1vcmcuZnJlZWRlc2t0b3AuREJ1cyAtLXByaW50LXJlcGx5IC0tdHlwZT1tZXRob2RfY2FsbCAvIG9yZy5mcmVlZGVza3RvcC5EQnVzLlN0YXJ0U2VydmljZUJ5TmFtZSBzdHJpbmc6b3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2UgIHVpbnQzMjo0NTUgbWV0aG9kIHJldHVybiBzZW5kZXI9b3JnLmZyZWVkZXNrdG9wLkRCdXMgLT4gZGVzdD06MS44IHVpbnQzMiAyCisKKyAgICBub3RlOiBXaGVuIGJ1aWxkaW5nIHdpdGggdGhlIFZpc3VhbCBDKysgSURFIHRoZSAqLmV4ZSBmaWxlcyBhcmUgaW4KKyAgICAgICAgICB0aGUgYmluL0RlYnVnIGFuZCBiaW4vUmVsZWFzZSBmb2xkZXIsIG5vdCBpbiB0aGUgYmluIGZvbGRlci4KKworCitGQVEKKy0tLQorCistIEhvdyBmYXIgaXMgV2luREJ1cyBmcm9tIGJlaW5nIHVzYWJsZSBmb3IgcHJvZHVjdGlvbiA/CisKKyAgZGJ1cyBjb21lcyB3aXRoIGEgdGVzdCBzdWl0ZSB3aGljaCBpcyB1c2VkIG9uIHVuaXggdG8gZ3VhcmFudGF0ZQorICBwcm9kdWN0aW9uIHF1YWxpdHkgYW5kIHRoaXMgdGVzdCBzdWl0ZSBydW5zIG1vc3RseS4gVGhlcmUgYXJlIHNvbWUKKyAgdGVzdCBub3QgcnVubmluZyBhbmQgd2UgbmVlZCBoZWxwIHRvIGdldCB0aGVtIHJ1bm5pbmcuCisgIEluIHRoZSBwcmF0aWNlIEkgYW5kIHNvbWUgb3RoZXIgcGVvcGxlIGFyZSB1c2luZyBkYnVzIGZvciBhdCBsZWFzdCBtb3JlCisgIHRoYW4gZm91ciB5ZWFycyBpbiBjb25qdW5jdGlvbiB3aXRoIGtkZSBvbiB3aW5kb3dzIHdpdGhvdXQgYW55IHByb2JsZW1zLgorCistIE9uIFVOSVggRC1CdXMgdXNlcyBVTklYIHNvY2tldHMgdG8gY29tbXVuaWNhdGUgKGNvcnJlY3QgbWUgaWYgSSdtIHdyb25nKS4KKyAgV2hhdCBpcyB1c2VkIG9uIFdpbmRvd3MgPworCisgIHRjcCBzb2NrZXRzLCB0aGVyZSBhcmUgc29tZSBlZmZvcnRzIHRvIGdldCBuYW1lZCBwaXBlIHJ1bm5pbmcsIGJ1dCBzb21lCisgIGRlc2lnbiBwcm9ibGVtcyBvZiB0aGUgd2luMzIgYXBpLCB3ZSBhcmUgbm90IGFibGUgdG8gc29sdmUgd2l0aG91dAorICBiaWdnZXIgY2hhbmdlcyB0byB0aGUgZGJ1cyBjb2RlIGJhc2UgbGV0IHVzIHN0b3AgdGhpcyBlZmZvcnQuCisKKy0gRG8geW91IGhhdmUgYW55IGNsdWUgaWYgZGJ1cy13aW4zMiBjYW4gcnVuIGluIGEgV2luZG93cyBDRSBlbnZpcm9ubWVudD8KKworICBkYnVzIGhhcyBiZWVuIHBvcnRlZCB0byB3aW5jZSwgc2VlIFJFQURNRS53aW5jZSBmb3IgbW9yZSBpbmZvcm1hdGlvbgorCistIERvIHlvdSBrbm93IGlmIHRoZSBDKysgYmluZGluZyBtYWRlIGJ5IE9wZW5XZW5nbyB3aWxsIGJlIGVhc2lseSBwb3J0YWJsZSB0byBXaW5kb3dzPworCisgIFRoZSBPcGVuV2VuZ28gZGJ1cy1jKysgYmluZGluZyBoYXMgYmVlbiBwb3J0ZWQgdG8gd2luZG93cyBzZWUgaW4gV2luREJ1cyBzdm4KKyAgKGh0dHA6Ly9zZi5uZXQvcHJvamVjdHMvd2luZGJ1cykKKyAgVGhlIHJlbGF0ZWQgdGVzdCBhcHBsaWNhdGlvbmEgYXJlIHJ1bm5pbmcgd2VsbC4KKworCitUT0RPCistLS0tCisKK09rdG9iZXIgMjAxMDoKKworLSB0aGUgY29kZSB3cmFwcGVkIHdpdGggREJVU19XSU5fRklYTUUgc2hvdWxkIGJlIGluc3BlY3RlZCBpZiBpdCByZXF1aXJlZCBmb3Igd2luZG93cworCistIGNyZWF0ZSBhIGRidXMgc2V0dXAgaW5zdGFsbGVyCisKKy0gaW1wbGVtZW50IHN5c3RlbSBidXMgYW5kIHN5c3RlbSBidXMgc2VydmljZSBzdGFydGVyCisgIHNlZSBodHRwOi8vd2luZGJ1cy5zdm4uc291cmNlZm9yZ2UubmV0L3ZpZXd2Yy93aW5kYnVzL3RydW5rL2J1cy9idXMtc2VydmljZS13aW4uYworICBmb3IgYSBzdGFydGluZyBwb2ludAorCistIGltcGxlbWVudCBhIHJlYWwgbG9naW4gc2Vzc2lvbiBidXMKKyAgVGhlIHNjb3BlIHBhcmFtZXRlciBvZiB0aGUgYXV0b2xhdW5jaCBtZXRhIHByb3RvY29sIGNvdWxkIGJlIGV4dGVuZGVkIHRvIHN1cHBvcnQgdXNlcgorICBzcGVjaWZpYyBzZXNzaW9uIGJ1c3NlcyAobGlrZSBhbHJlYWR5IGRvbmUgd2l0aCB0aGUgYW1hcm9rIGJ1bmRsZWQgZGJ1cyB3aGljaCB1c2UgYQorICBzaGFyZWQgbWVtb3J5IGFyZWEgbmFtZWQgIkRCdXNEYWVtb25BZGRyZXNzSW5mbzo8dXNlcm5hbWU+Ii4KKyAgQWxzbyB0aGUgZGJ1cyBpbnN0YWxsZXIgc2hvdWxkIHN0YXJ0IGEgc2Vzc2lvbiBidXMgb24gdXNlciBsb2dpbi4KZGlmZiAtLWdpdCBhL2RidXMvUkVBRE1FLndpbmNlIGIvZGJ1cy9SRUFETUUud2luY2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc5MGRjZgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvUkVBRE1FLndpbmNlCkBAIC0wLDAgKzEsODEgQEAKK0RCdXMgRGFlbW9uIGZvciBXaW5kb3dzIENFL1dpbmRvd3MgTW9iaWxlIDYuNQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0J1Z3MgaW4gdXBzdHJlYW0gZm9yIGFueSB3aW5kb3cgdmVyc2lvbjoKKyogTW92ZUZpbGVFeEEgPCAwIHJlc3VsdCBjaGVjayBidWcKKyogZG91YmxlIGRidXNfZnJlZSBzb21ld2hlcmUgSSBmb3Jnb3Qgd2hlcmUgKGNoZWNrIGluIC11Z2x5KQorKiBhbGlnbm1lbnQgaXNzdWUKKyogQ3JlYXRlUHJvY2VzcyBwcm9jZXNzIGluZm9ybWF0aW9uIGhhbmRsZSBsZWFrCisqIF9kYnVzX2dldHNpZCBOVUxMIHZzIElOVkFMSURfSEFORExFX1ZBTFVFCisqIHdpbl9hY2NvdW50X3RvX3NpZAorCitDdXN0b21pc2F0aW9uCis9PT09PT09PT09PT09CisKKzEpIEF0IGluc3RhbGxhdGlvbiwgdGhlIGZvbGxvd2luZyByZWdpc3RyeSB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIHRoZQoraW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvZiB0aGUgZGJ1cyBpbnN0YWxsYXRpb24gKHRoZSBkaXJlY3RvcnkKK2NvbnRhaW5pbmcgdGhlIGJpbiwgZXRjLCBzaGFyZSBmb2xkZXJzKToKKworSEtMTVxTb2Z0d2FyZVxmcmVlZGVza3RvcFxEQnVzXEluc3RhbGwgRGlyZWN0b3J5CisKKzIpIEluc3RlYWQgb2YgZW52aXJvbm1lbnQgdmFyaWFibGUgREJVU19WRVJCT1NFLCB1c2UKK0hLTE1cU29mdHdhcmVcZnJlZWRlc2t0b3BcREJ1c1xWZXJib3NlCisKKzIpIFRoZSBrZXlyaW5nIGRpcmVjdG9yeSBpcyBNWURPQ1VNRU5UU1xkYnVzLWtleXJpbmdzLCBub3QKK0hPTUVQQVRIXC5kYnVzLWtleXJpbmdzLgorCisKK0NvbXBpbGF0aW9uCis9PT09PT09PT09PQorCisuL2NvbmZpZ3VyZSAtLWhvc3Q9YXJtLW1pbmd3MzJjZSBDUFBGTEFHUz0tSS9wYXRoL3RvL2V4cGF0L2luY2x1ZGUgTERGTEFHUz0tTC9wYXRoL3RvL2V4cGF0L2xpYgorCitBIHJlY2VudCB2ZXJzaW9uIG9mIGxpYnRvb2wgaXMgcmVxdWlyZWQsIHdpdGggdGhpcyBjaGFuZ2U6CisKKzIwMTAtMDItMjggIFBpZXJyZSBPc3NtYW4gIDxvc3NtYW5Ab3NzbWFuLmxrcGcuY2VuZGlvLnNlPiAgKHRpbnkgY2hhbmdlKQorICAgICAgICAgICAgUmFsZiBXaWxkZW5odWVzIDxSYWxmLldpbGRlbmh1ZXNAZ214LmRlPgorCisgICAgICAgRml4IGRlcGxpYnMgY2hlY2sgZmFsbGJhY2sgZm9yIDY0LWJpdCBXaW5kb3dzIGFuZCBXaW5kb3dzIENFLgorICAgICAgICogbGlibHRkbC9tNC9saWJ0b29sLm00IChfTFRfQ0hFQ0tfTUFHSUNfTUVUSE9EKTogQWNjZXB0IGZpbGUgZm9ybWF0cworICAgICAgICdwZS1hcm0td2luY2UnIGFuZCAncGUteDg2LTY0Jy4gIEFkZCBub3RlIGFib3V0IGNvbnNpc3RlbmN5IHdpdGggLi4uCisgICAgICAgKiBsaWJsdGRsL2NvbmZpZy9sdG1haW4ubTRzaCAoZnVuY193aW4zMl9saWJpZCk6IC4uLiB0aGUgcmVzcGVjdGl2ZQorICAgICAgIHBhdHRlcm4gaGVyZTsgc3luYyBwYXR0ZXJuIGZyb20gdGhlIGZvcm1lci4KKyAgICAgICAqIHRlc3RzL2RlcGxpYnMtbWluZ3cuYXQgKGRlcGxpYnMgd2l0aG91dCBmaWxlIGNvbW1hbmQpOiBOZXcKKyAgICAgICBmaWxlLCBuZXcgdGVzdC4KKyAgICAgICAqIE1ha2VmaWxlLmFtIChURVNUU1VJVEVfQVQpOiBVcGRhdGUuCisgICAgICAgKiBORVdTOiBVcGRhdGUuCisKKworTUIgdnMgV0NIQVIKKz09PT09PT09PT09CisKK1dpbmRvd3MgQ0Ugb25seSBzdXBwb3J0cyB0aGUgVW5pY29kZSBpbnRlcmZhY2UsIHdoaWxlIERCdXMgRGFlbW9uIHVzZXMKK3RoZSBNdWx0aS1CeXRlIGludGVyZmFjZSBvbiBXaW5kb3dzIGJ5IGRlZmF1bHQuICBUaGUgZ2x1ZSBjb2RlIGRvZXMKK25vdCBzdXBwb3J0IG11bHRpYnl0ZSBpbiBhbGwgY2FzZXMuICBJbiBwYXJ0aWN1bGFyLCB0aGUgX21ic3JjaHIKK2Z1bmN0aW9uIGlzIG5vdCBjb3JyZWN0bHkgaW1wbGVtZW50ZWQuICBJdCBjb3VsZCBiZSBjb3JyZWN0bHkKK2ltcGxlbWVudGVkLCBvciBkYnVzIGRhZW1vbiBjb3VsZCB1c2UgdGhlIHdjaGFyIGludGVyZmFjZSBtb3JlCitjb25zaXN0ZW50bHkgb24gYWxsIFdpbmRvd3MgdGFyZ2V0cy4gIEZvciBub3csIHRoZSBXaW5kb3dzIENFIHBvcnQKK3dpbGwgb25seSB3b3JrIGZvciBmaWxlc3lzdGVtcyB3aXRob3V0IHNvbWUgd2VpcmQgY2hhcmFjdGVycyBpbiBmaWxlCituYW1lcy4gIElzIHRoaXMgYSBzZXJpb3VzIGxpbWl0YXRpb24/CisKKworS25vd24gSXNzdWVzCis9PT09PT09PT09PT0KKworQXV0b2xhdW5jaCBpcyBicm9rZW4gc28gZmFyLgorCitFbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGZha2VkLiAgU29tZSBhcmUgcHVudGVkIHRvIHRoZSByZWdpc3RyeSwgYnV0CitpbiBhbnkgY2FzZSB0aGV5IGNhbiBub3QgYmUgdXNlZCByZWxpYWJseSBmb3IgSVBDLgorCitUaGUgdGVzdCBzdWl0ZSBpcyBub3QgcG9ydGVkIHlldC4KKworZGJ1cy1waXBlLmM6CisgKiBVc2VzIGxpYmMgZmlsZSBkZXNjcmlwdG9ycy4gIE5lZWRlZCBmb3IgLS1wcmludC1hZGRyZXNzIGFuZAorICAgLS1wcmludC1waWQgd2hpY2ggcHJvYmFibHkgZG9uJ3Qgd29yayB5ZXQuCisKK2RidXMtc3lzZGVwcy13aW4uYzoKKyAqIEJhY2t0cmFjZXMgaGF2ZSBiZWVuIGRpc2FibGVkLgorICogX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMgTm90IHN1cHBvcnRlZCwgbWF5YmUgd2Ugc2hvdWxkIGRpc2FibGUKKyAgIHRoZSB3YXJuaW5nLgorICogU2VhcmNoUGF0aEE6IFVzZXMgSEtMTVxcU29mdHdhcmVcXGZyZWVkZXNrdG9wXFxEQnVzXFxJbnN0YWxsIERpcmVjdG9yeQorICAgdG8gbG9jYXRlIGJpbmFyaWVzLgpkaWZmIC0tZ2l0IGEvZGJ1cy9hdXRvZ2VuLnNoIGIvZGJ1cy9hdXRvZ2VuLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE1NTgxMTIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2F1dG9nZW4uc2gKQEAgLTAsMCArMSwxMTEgQEAKKyMhL2Jpbi9zaAorIyBSdW4gdGhpcyB0byBnZW5lcmF0ZSBhbGwgdGhlIGluaXRpYWwgbWFrZWZpbGVzLCBldGMuCisKK3NyY2Rpcj1gZGlybmFtZSAkMGAKK3Rlc3QgLXogIiRzcmNkaXIiICYmIHNyY2Rpcj0uCisKK09SSUdESVI9YHB3ZGAKK2NkICRzcmNkaXIKKworUFJPSkVDVD1kYnVzCitURVNUX1RZUEU9LWYKK0ZJTEU9ZGJ1cy0xLnBjLmluCisKK0RJRT0wCisKK2lmIFsgLWYgLmdpdC9ob29rcy9wcmUtY29tbWl0LnNhbXBsZSAtYSAhIC1mIC5naXQvaG9va3MvcHJlLWNvbW1pdCBdIDsgdGhlbgorICAgIGVjaG8gIkFjdGl2YXRpbmcgcHJlLWNvbW1pdCBob29rLiIKKyAgICBjcCAtYXYgLmdpdC9ob29rcy9wcmUtY29tbWl0LnNhbXBsZSAuZ2l0L2hvb2tzL3ByZS1jb21taXQKKyAgICBjaG1vZCAtYyAreCAgLmdpdC9ob29rcy9wcmUtY29tbWl0CitmaQorCisoYXV0b2NvbmYgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxIHx8IHsKKwllY2hvCisJZWNobyAiWW91IG11c3QgaGF2ZSBhdXRvY29uZiBpbnN0YWxsZWQgdG8gY29tcGlsZSAkUFJPSkVDVC4iCisJZWNobyAiRG93bmxvYWQgdGhlIGFwcHJvcHJpYXRlIHBhY2thZ2UgZm9yIHlvdXIgZGlzdHJpYnV0aW9uLCIKKwllY2hvICJvciBnZXQgdGhlIHNvdXJjZSB0YXJiYWxsIGF0IGZ0cDovL2Z0cC5nbnUub3JnL3B1Yi9nbnUvIgorCURJRT0xCit9CisKKyMgSWYgdGhlIHVzZXIgaGFzbid0IGV4cGxpY2l0bHkgY2hvc2VuIGFuIEF1dG9tYWtlIHZlcnNpb24sIHVzZSAxLjExLiBUaGlzIGlzCisjIHRoZSBlYXJsaWVzdCB2ZXJzaW9uIHRoYXQgZ2l2ZXMgdXMgc2lsZW50IHJ1bGVzLgoraWYgdGVzdCAteiAiJEFVVE9NQUtFIjsgdGhlbgorICAgIEFVVE9NQUtFPWF1dG9tYWtlLTEuMTEKKyAgICBBQ0xPQ0FMPWFjbG9jYWwtMS4xMQorZmkKKworKCRBVVRPTUFLRSAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjEgfHwgeworICAgICAgICBBVVRPTUFLRT1hdXRvbWFrZQorICAgICAgICBBQ0xPQ0FMPWFjbG9jYWwKK30KKworKCRBVVRPTUFLRSAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjEgfHwgeworCWVjaG8KKwllY2hvICJZb3UgbXVzdCBoYXZlIGF1dG9tYWtlIGluc3RhbGxlZCB0byBjb21waWxlICRQUk9KRUNULiIKKwllY2hvICJHZXQgZnRwOi8vZnRwLmN5Z251cy5jb20vcHViL2hvbWUvdHJvbWV5L2F1dG9tYWtlLTEuMmQudGFyLmd6IgorCWVjaG8gIihvciBhIG5ld2VyIHZlcnNpb24gaWYgaXQgaXMgYXZhaWxhYmxlKSIKKwlESUU9MQorfQorCitMSUJUT09MSVpFPWB3aGljaCBsaWJ0b29saXplYAoraWYgISB0ZXN0IC1mICRMSUJUT09MSVpFOyB0aGVuCisJTElCVE9PTElaRT1gd2hpY2ggZ2xpYnRvb2xpemVgCitmaQorCisoJExJQlRPT0xJWkUgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxIHx8IHsKKwllY2hvCisJZWNobyAiWW91IG11c3QgaGF2ZSBsaWJ0b29saXplIGluc3RhbGxlZCB0byBjb21waWxlICRQUk9KRUNULiIKKwllY2hvICJJbnN0YWxsIHRoZSBsaWJ0b29sIHBhY2thZ2UgZnJvbSBmdHAuZ251Lm9yZyBvciBhIG1pcnJvci4iCisJRElFPTEKK30KKworaWYgdGVzdCAiJERJRSIgLWVxIDE7IHRoZW4KKwlleGl0IDEKK2ZpCisKK3Rlc3QgJFRFU1RfVFlQRSAkRklMRSB8fCB7CisJZWNobyAiWW91IG11c3QgcnVuIHRoaXMgc2NyaXB0IGluIHRoZSB0b3AtbGV2ZWwgJFBST0pFQ1QgZGlyZWN0b3J5IgorCWV4aXQgMQorfQorCitpZiB0ZXN0IC16ICIkKiI7IHRoZW4KKwllY2hvICJJIGFtIGdvaW5nIHRvIHJ1biAuL2NvbmZpZ3VyZSB3aXRoIG5vIGFyZ3VtZW50cyAtIGlmIHlvdSB3aXNoICIKKyAgICAgICAgZWNobyAidG8gcGFzcyBhbnkgdG8gaXQsIHBsZWFzZSBzcGVjaWZ5IHRoZW0gb24gdGhlICQwIGNvbW1hbmQgbGluZS4iCitmaQorCiskTElCVE9PTElaRSAtLWNvcHkgLS1mb3JjZQorCiskQUNMT0NBTCAtSSBtNCAkQUNMT0NBTF9GTEFHUworCisjIyBvcHRpb25hbGx5IGZlYXR1cmUgYXV0b2hlYWRlcgorKGF1dG9oZWFkZXIgLS12ZXJzaW9uKSAgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMSAmJiBhdXRvaGVhZGVyCisKKyRBVVRPTUFLRSAtYSAkYW1fb3B0CithdXRvY29uZiB8fCBlY2hvICJhdXRvY29uZiBmYWlsZWQgLSB2ZXJzaW9uIDIuNXggaXMgcHJvYmFibHkgcmVxdWlyZWQiCisKK2NkICRPUklHRElSCisKK2lmIHRlc3QgeCIkTk9DT05GSUdVUkUiID0geDsgdGhlbgorICBydW5fY29uZmlndXJlPXRydWUKKyAgZm9yIGFyZyBpbiAkKjsgZG8KKyAgICBjYXNlICRhcmcgaW4gCisgICAgICAgIC0tbm8tY29uZmlndXJlKQorICAgICAgICAgICAgcnVuX2NvbmZpZ3VyZT1mYWxzZQorICAgICAgICAgICAgOzsKKyAgICAgICAgKikKKyAgICAgICAgICAgIDs7CisgICAgZXNhYworICBkb25lCitlbHNlCisgIHJ1bl9jb25maWd1cmU9ZmFsc2UKK2ZpCisKK2lmICRydW5fY29uZmlndXJlOyB0aGVuCisgICAgJHNyY2Rpci9jb25maWd1cmUgLS1lbmFibGUtZGV2ZWxvcGVyIC0tY29uZmlnLWNhY2hlICIkQCIKKyAgICBlY2hvIAorICAgIGVjaG8gIk5vdyB0eXBlICdtYWtlJyB0byBjb21waWxlICRQUk9KRUNULiIKK2Vsc2UKKyAgICBlY2hvCisgICAgZWNobyAiTm93IHJ1biAnY29uZmlndXJlJyBhbmQgJ21ha2UnIHRvIGNvbXBpbGUgJFBST0pFQ1QuIgorZmkKKwpkaWZmIC0tZ2l0IGEvZGJ1cy9idXMvQW5kcm9pZC5icCBiL2RidXMvYnVzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FiNzczYgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvYnVzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0MSBAQAorY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiZGJ1cy1kYWVtb24iLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItTzMiLAorICAgICAgICAiLUREQlVTX0NPTVBJTEFUSU9OIiwKKyAgICAgICAgIi1EREJVU19EQUVNT05fTkFNRT1cXFwiZGJ1cy1kYWVtb25cXFwiIiwKKyAgICAgICAgIi1EREJVU19TWVNURU1fQ09ORklHX0ZJTEU9XFxcIi9zeXN0ZW0vZXRjL2RidXMuY29uZlxcXCIiLAorICAgICAgICAiLUREQlVTX1NFU1NJT05fQ09ORklHX0ZJTEU9XFxcIi9zeXN0ZW0vZXRjL3Nlc3Npb24uY29uZlxcXCIiLAorICAgICAgICAiLVduby1hZGRyZXNzIiwKKyAgICAgICAgIi1Xbm8tZW1wdHktYm9keSIsCisgICAgICAgICItV25vLXBvaW50ZXItc2lnbiIsCisgICAgICAgICItV25vLXNpZ24tY29tcGFyZSIsCisgICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJhY3RpdmF0aW9uLmMiLAorICAgICAgICAiYnVzLmMiLAorICAgICAgICAiY29uZmlnLWxvYWRlci1leHBhdC5jIiwKKyAgICAgICAgImNvbmZpZy1wYXJzZXIuYyIsCisgICAgICAgICJjb25maWctcGFyc2VyLWNvbW1vbi5jIiwKKyAgICAgICAgImNvbm5lY3Rpb24uYyIsCisgICAgICAgICJkZXNrdG9wLWZpbGUuYyIsCisgICAgICAgICJkaXItd2F0Y2gtZGVmYXVsdC5jIiwKKyAgICAgICAgImRpc3BhdGNoLmMiLAorICAgICAgICAiZHJpdmVyLmMiLAorICAgICAgICAiZXhwaXJlbGlzdC5jIiwKKyAgICAgICAgIm1haW4uYyIsCisgICAgICAgICJwb2xpY3kuYyIsCisgICAgICAgICJzZWxpbnV4LmMiLAorICAgICAgICAic2VydmljZXMuYyIsCisgICAgICAgICJzaWduYWxzLmMiLAorICAgICAgICAidXRpbHMuYyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJleHBhdCIsCisgICAgICAgICJsaWJkYnVzIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvZGJ1cy9idXMvTWFrZWZpbGUuYW0gYi9kYnVzL2J1cy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2JjMDlhCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9idXMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyOTIgQEAKK2NvbmZpZ2Rpcj0kKHN5c2NvbmZkaXIpL2RidXMtMQorZGJ1c19kYWVtb25fZXhlY2RpciA9ICQoREJVU19EQUVNT05ESVIpCisKK0RCVVNfQlVTX0xJQlMgPSBcCisJJChYTUxfTElCUykgXAorCSQoU0VMSU5VWF9MSUJTKSBcCisJJChUSFJFQURfTElCUykgXAorCSQoQURUX0xJQlMpIFwKKwkkKE5FVFdPUktfbGlicykgXAorCSQoTlVMTCkKKworREJVU19MQVVOQ0hFUl9MSUJTID0gXAorCSQoWE1MX0xJQlMpIFwKKwkkKFRIUkVBRF9MSUJTKSBcCisJJChORVRXT1JLX2xpYnMpIFwKKwkkKE5VTEwpCisKK0FNX0NQUEZMQUdTID0gXAorCS1JJCh0b3Bfc3JjZGlyKSBcCisJJChYTUxfQ0ZMQUdTKSBcCisJLUREQlVTX1NZU1RFTV9DT05GSUdfRklMRT1cIiIkKGNvbmZpZ2Rpcikvc3lzdGVtLmNvbmYiXCIgXAorCS1EREJVU19DT01QSUxBVElPTiBcCisJLUREQlVTX1NUQVRJQ19CVUlMRCBcCisJJChOVUxMKQorCisjIGlmIGFzc2VydGlvbnMgYXJlIGVuYWJsZWQsIGltcHJvdmUgYmFja3RyYWNlcworQU1fTERGTEFHUyA9IEBSX0RZTkFNSUNfTERGTEFHQAorCitFRkVOQ0U9CisKK0NPTkZJR19JTl9GSUxFUz0JCQkJXAorCXNlc3Npb24uY29uZi5pbgkJCQlcCisJc3lzdGVtLmNvbmYuaW4JCQkJXAorCW9yZy5mcmVlZGVza3RvcC5kYnVzLXNlc3Npb24ucGxpc3QuaW4KKworY29uZmlnX0RBVEE9CQkJCQlcCisJc2Vzc2lvbi5jb25mCQkJCVwKKwlzeXN0ZW0uY29uZgorCitpZiBEQlVTX0VOQUJMRV9MQVVOQ0hECithZ2VudGRpcj0kKExBVU5DSERfQUdFTlRfRElSKQorYWdlbnRfREFUQT1vcmcuZnJlZWRlc2t0b3AuZGJ1cy1zZXNzaW9uLnBsaXN0CitlbmRpZgorCitpZiBEQlVTX1VTRV9MSUJYTUwKK1hNTF9TT1VSQ0VTPWNvbmZpZy1sb2FkZXItbGlieG1sLmMKK2VuZGlmCitpZiBEQlVTX1VTRV9FWFBBVAorWE1MX1NPVVJDRVM9Y29uZmlnLWxvYWRlci1leHBhdC5jCitlbmRpZgorCitpZiBEQlVTX0JVU19FTkFCTEVfS1FVRVVFCitESVJfV0FUQ0hfU09VUkNFPWRpci13YXRjaC1rcXVldWUuYworZWxzZQoraWYgREJVU19CVVNfRU5BQkxFX0lOT1RJRlkKK0RJUl9XQVRDSF9TT1VSQ0U9ZGlyLXdhdGNoLWlub3RpZnkuYworZWxzZQoraWYgREJVU19CVVNfRU5BQkxFX0ROT1RJRllfT05fTElOVVgKK0RJUl9XQVRDSF9TT1VSQ0U9ZGlyLXdhdGNoLWRub3RpZnkuYworZWxzZQorRElSX1dBVENIX1NPVVJDRT1kaXItd2F0Y2gtZGVmYXVsdC5jCitlbmRpZgorZW5kaWYKK2VuZGlmCisKK0JVU19TT1VSQ0VTPQkJCQkJXAorCWFjdGl2YXRpb24uYwkJCQlcCisJYWN0aXZhdGlvbi5oCQkJCVwKKwlhY3RpdmF0aW9uLWV4aXQtY29kZXMuaAkJCVwKKwlidXMuYwkJCQkJXAorCWJ1cy5oCQkJCQlcCisJY29uZmlnLXBhcnNlci5jCQkJCVwKKwljb25maWctcGFyc2VyLmgJCQkJXAorCWNvbmZpZy1wYXJzZXItY29tbW9uLmMJCQlcCisJY29uZmlnLXBhcnNlci1jb21tb24uaAkJCVwKKwljb25uZWN0aW9uLmMJCQkJXAorCWNvbm5lY3Rpb24uaAkJCQlcCisJZGVza3RvcC1maWxlLmMJCQkJXAorCWRlc2t0b3AtZmlsZS5oCQkJCVwKKwkkKERJUl9XQVRDSF9TT1VSQ0UpCQkJXAorCWRpci13YXRjaC5oCQkJCVwKKwlkaXNwYXRjaC5jCQkJCVwKKwlkaXNwYXRjaC5oCQkJCVwKKwlkcml2ZXIuYwkJCQlcCisJZHJpdmVyLmgJCQkJXAorCWV4cGlyZWxpc3QuYwkJCQlcCisJZXhwaXJlbGlzdC5oCQkJCVwKKwlwb2xpY3kuYwkJCQlcCisJcG9saWN5LmgJCQkJXAorCXNlbGludXguaAkJCQlcCisJc2VsaW51eC5jCQkJCVwKKwlzZXJ2aWNlcy5jCQkJCVwKKwlzZXJ2aWNlcy5oCQkJCVwKKwlzaWduYWxzLmMJCQkJXAorCXNpZ25hbHMuaAkJCQlcCisJc3RhdHMuYwkJCQkJXAorCXN0YXRzLmgJCQkJCVwKKwl0ZXN0LmMJCQkJCVwKKwl0ZXN0LmgJCQkJCVwKKwl1dGlscy5jCQkJCQlcCisJdXRpbHMuaAkJCQkJXAorCSQoWE1MX1NPVVJDRVMpCisKK2RidXNfZGFlbW9uX1NPVVJDRVM9CQkJCVwKKwkkKEJVU19TT1VSQ0VTKQkJCQlcCisJbWFpbi5jCisKK2RidXNfZGFlbW9uX0xEQUREPQkJCQkJXAorCSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEJXAorCSQoRUZFTkNFKQkJCQkJXAorCSQoREJVU19CVVNfTElCUykKKworTEFVTkNIX0hFTFBFUl9TT1VSQ0VTPQkJCQlcCisJJChYTUxfU09VUkNFUykJCQkJXAorCWNvbmZpZy1wYXJzZXItY29tbW9uLmMJCQlcCisJY29uZmlnLXBhcnNlci1jb21tb24uaAkJCVwKKwljb25maWctcGFyc2VyLXRyaXZpYWwuYwkJCVwKKwljb25maWctcGFyc2VyLXRyaXZpYWwuaAkJCVwKKwlkZXNrdG9wLWZpbGUuYwkJCQlcCisJZGVza3RvcC1maWxlLmgJCQkJXAorCXV0aWxzLmMJCQkJCVwKKwl1dGlscy5oCQkJCQlcCisJYWN0aXZhdGlvbi1leGl0LWNvZGVzLmgJCQlcCisJYWN0aXZhdGlvbi1oZWxwZXIuaAkgIAkJXAorCWFjdGl2YXRpb24taGVscGVyLmMKKworIyMgVGhpcyBpcyB0aGUgaW5zdGFsbGVkIGxhdW5jaCBoZWxwZXIgd2l0aCB0aGUgc2V0dWlkIGNoZWNrcworZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl9TT1VSQ0VTPQkJXAorCWFjdGl2YXRpb24taGVscGVyLWJpbi5jCQkJXAorCSQoTEFVTkNIX0hFTFBFUl9TT1VSQ0VTKQorCitkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX0xEQUREPQkJXAorCSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEgXAorCSQoREJVU19MQVVOQ0hFUl9MSUJTKQorCisjIyB3ZSBidWlsZCBhbm90aGVyIGJpbmFyeSBzbyB3ZSBjYW4gZG8gdGhlIGxhdW5jaCB0ZXN0aW5nIHdpdGhvdXQgcm9vdCBwcml2cy4KKyMjIERPIE5PVCBJTlNUQUxMIFRISVMgRklMRQorZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0X1NPVVJDRVM9CQlcCisJYWN0aXZhdGlvbi1oZWxwZXItYmluLmMJCQlcCisJJChMQVVOQ0hfSEVMUEVSX1NPVVJDRVMpCisKK2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9MREFERD0JCVwKKwkkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhIFwKKwkkKERCVVNfTEFVTkNIRVJfTElCUykKKworZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0X0NQUEZMQUdTID0gXAorCSQoQU1fQ1BQRkxBR1MpIFwKKwktREFDVElWQVRJT05fTEFVTkNIRVJfVEVTVAorCisjIyB3ZSBidWlsZCB5ZXQgYW5vdGhlciBiaW5hcnkgc28gd2UgY2FuIGRvIHRoZSBPT00gdGVzdHMKKyMjIERPIE5PVCBJTlNUQUxMIFRISVMgRklMRQorYnVzX3Rlc3RfbGF1bmNoX2hlbHBlcl9TT1VSQ0VTPQkJXAorCXRlc3QtbGF1bmNoLWhlbHBlci5jICAgCQlcCisJJChMQVVOQ0hfSEVMUEVSX1NPVVJDRVMpCisKK2J1c190ZXN0X2xhdW5jaF9oZWxwZXJfTERBREQ9CQlcCisJJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy1pbnRlcm5hbC5sYSBcCisJJChEQlVTX0xBVU5DSEVSX0xJQlMpCisKK2J1c190ZXN0X2xhdW5jaF9oZWxwZXJfQ1BQRkxBR1MgPSBcCisJJChBTV9DUFBGTEFHUykgXAorCS1EQUNUSVZBVElPTl9MQVVOQ0hFUl9URVNUCVwKKwktREFDVElWQVRJT05fTEFVTkNIRVJfRE9fT09NCisKK25vaW5zdF9QUk9HUkFNUyA9CitkYnVzX2RhZW1vbl9leGVjX1BST0dSQU1TID0gZGJ1cy1kYWVtb24KK2lmIERCVVNfVU5JWAorbGliZXhlY19QUk9HUkFNUyA9IGRidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXIKK2VuZGlmIERCVVNfVU5JWAorCisjIyBOb3RlIHRoYXQgVEVTVFMgaGFzIHNwZWNpYWwgbWVhbmluZyAoc3R1ZmYgdG8gdXNlIGluIG1ha2UgY2hlY2spLgorIyMgV2UgZG9uJ3QgYWN0dWFsbHkgd2FudCB0byBydW4gYW55IG9mIHRoZXNlIHRlc3RzIHVudGlsIHRlc3QvIGhhcyBiZWVuCisjIyBjb21waWxlZCwgc28gd2UgZG9uJ3QgcHV0IHRoZW0gaW4gVEVTVFMgaGVyZTsgd2UgcnVuIHRoZW0gaW4gdGVzdC8KKyMjIGluc3RlYWQuCisKK2lmIERCVVNfQlVJTERfVEVTVFMKKyMjIHdlIHVzZSBub2luc3RfUFJPR1JBTVMgbm90IGNoZWNrX1BST0dSQU1TIHNvIHRoYXQgd2UgYnVpbGQKKyMjIGV2ZW4gd2hlbiBub3QgZG9pbmcgIm1ha2UgY2hlY2siCisKKyMgcnVuIGFzIGEgdGVzdCBieSB0ZXN0L01ha2VmaWxlLmFtCitub2luc3RfUFJPR1JBTVMgKz0gYnVzLXRlc3QgYnVzLXRlc3Qtc3lzdGVtCisKK2lmIERCVVNfVU5JWAorIyBydW4gYXMgYSB0ZXN0IGJ5IHRlc3QvTWFrZWZpbGUuYW0KK25vaW5zdF9QUk9HUkFNUyArPSBidXMtdGVzdC1sYXVuY2gtaGVscGVyCisjIHRoaXMgaXMgdXNlZCBieSB0aGUgdGVzdHMgYnV0IGlzIG5vdCxpdHNlbGYsIGEgdGVzdAorbm9pbnN0X1BST0dSQU1TICs9IGRidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXItdGVzdAorZW5kaWYgREJVU19VTklYCisKK2VuZGlmIERCVVNfQlVJTERfVEVTVFMKKworYnVzX3Rlc3Rfc3lzdGVtX1NPVVJDRVM9CQkJXAorCSQoWE1MX1NPVVJDRVMpCQkJCVwKKwljb25maWctcGFyc2VyLWNvbW1vbi5jCQkJXAorCWNvbmZpZy1wYXJzZXItY29tbW9uLmgJCQlcCisJY29uZmlnLXBhcnNlci10cml2aWFsLmMJCQlcCisJY29uZmlnLXBhcnNlci10cml2aWFsLmgJCQlcCisJdXRpbHMuYwkJCQkJXAorCXV0aWxzLmgJCQkJCVwKKwl0ZXN0LXN5c3RlbS5jCisKK2J1c190ZXN0X3N5c3RlbV9MREFERD0kKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhICQoREJVU19CVVNfTElCUykKKworYnVzX3Rlc3RfU09VUkNFUz0JCQkJXAorCSQoQlVTX1NPVVJDRVMpCQkJCVwKKwl0ZXN0LW1haW4uYworCitidXNfdGVzdF9MREFERD0kKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhICQoREJVU19CVVNfTElCUykKKworIyMgbW9wIHVwIHRoZSBnY292IGZpbGVzCitjbGVhbi1sb2NhbDoKKwkvYmluL3JtICouYmIgKi5iYmcgKi5kYSAqLmdjb3YgfHwgdHJ1ZQorCitpbnN0YWxsLWRhdGEtaG9vazoKKwkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxvY2Fsc3RhdGVkaXIpL3J1bi9kYnVzCisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChjb25maWdkaXIpL3N5c3RlbS5kCisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChjb25maWdkaXIpL3Nlc3Npb24uZAorCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoZGF0YWRpcikvZGJ1cy0xL3NlcnZpY2VzCisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChkYXRhZGlyKS9kYnVzLTEvc3lzdGVtLXNlcnZpY2VzCitpZiBIQVZFX1NZU1RFTUQKKyMgSW5zdGFsbCBkYnVzLnNvY2tldCBhcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGEgRC1CdXMgc3RhY2suCisjIERlbGliZXJhdGVseSBub3QgdXNpbmcgJChMTl9TKSBoZXJlOiBsbiAtZnMgaXMgbm90IHVuaXZlcnNhbGx5IHBvcnRhYmxlLAorIyBidXQgbmVpdGhlciBpcyBzeXN0ZW1kLCBzbyBpdCdzIE9LIHRvIGFzc3VtZSBoZXJlIHRoYXQgbG4gY29tcGxpZXMgd2l0aCBTVVMuCisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChzeXN0ZW1kc3lzdGVtdW5pdGRpcikvZGJ1cy50YXJnZXQud2FudHMKKwlsbiAtZnMgLi4vZGJ1cy5zb2NrZXQgJChERVNURElSKSQoc3lzdGVtZHN5c3RlbXVuaXRkaXIpL2RidXMudGFyZ2V0LndhbnRzL2RidXMuc29ja2V0CisjIFVuY29uZGl0aW9uYWxseSBlbmFibGUgRC1CdXMgb24gc3lzdGVtZCBpbnN0YWxsYXRpb25zCisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChzeXN0ZW1kc3lzdGVtdW5pdGRpcikvc29ja2V0cy50YXJnZXQud2FudHMKKwlsbiAtZnMgLi4vZGJ1cy5zb2NrZXQgJChERVNURElSKSQoc3lzdGVtZHN5c3RlbXVuaXRkaXIpL3NvY2tldHMudGFyZ2V0LndhbnRzL2RidXMuc29ja2V0CisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChzeXN0ZW1kc3lzdGVtdW5pdGRpcikvbXVsdGktdXNlci50YXJnZXQud2FudHMKKwlsbiAtZnMgLi4vZGJ1cy5zZXJ2aWNlICQoREVTVERJUikkKHN5c3RlbWRzeXN0ZW11bml0ZGlyKS9tdWx0aS11c2VyLnRhcmdldC53YW50cy9kYnVzLnNlcnZpY2UKK2VuZGlmCisKK2lmIERCVVNfVU5JWAoraW5zdGFsbC1leGVjLWhvb2s6CisJaWYgdGVzdCBgaWQgLXVgIC1lcSAwOyB0aGVuIFwKKwkJY2hvd24gcm9vdDokKERCVVNfVVNFUikgJChERVNURElSKSQobGliZXhlY2RpcikvZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlciQoRVhFRVhUKTsgXAorCQljaG1vZCA0NzUwICQoREVTVERJUikkKGxpYmV4ZWNkaXIpL2RidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXIkKEVYRUVYVCk7IFwKKwllbHNlIFwKKwkJZWNobyAiTm90IGluc3RhbGxpbmcgJChERVNURElSKSQobGliZXhlY2RpcikvZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlciBiaW5hcnkgc2V0dWlkISI7IFwKKwkJZWNobyAiWW91J2xsIG5lZWQgdG8gbWFudWFsbHkgc2V0IHBlcm1pc3Npb25zIHRvIHJvb3Q6JChEQlVTX1VTRVIpIGFuZCBwZXJtaXNzaW9ucyA0NzUwIjsgXAorCWZpCitlbmRpZgorCisjIyMjIEluaXQgc2NyaXB0cyBmdW4KK1NDUklQVF9JTl9GSUxFUz1tZXNzYWdlYnVzLmluIFwKKwkJbWVzc2FnZWJ1cy1jb25maWcuaW4gXAorCQlyYy5tZXNzYWdlYnVzLmluCisKKyMjIFJlZCBIYXQgc3RhcnQKK2lmIERCVVNfSU5JVF9TQ1JJUFRTX1JFRF9IQVQKKworaW5pdGRkaXI9JChzeXNjb25mZGlyKS9yYy5kL2luaXQuZAorCitpbml0ZF9TQ1JJUFRTPSAJXAorCW1lc3NhZ2VidXMKKworZW5kaWYKKyAjIyBSZWQgSGF0IGVuZAorCisjIyBTbGFja3dhcmUgc3RhcnQKK2lmIERCVVNfSU5JVF9TQ1JJUFRTX1NMQUNLV0FSRQorCitpbml0ZGRpcj0kKHN5c2NvbmZkaXIpL3JjLmQvCisKK2luaXRkX1NDUklQVFM9IAlcCisJcmMubWVzc2FnZWJ1cworCitlbmRpZgorIyMgU2xhY2t3YXJlIGVuZAorCisjIyBDeWd3aW4gc3RhcnQKK2lmIERCVVNfSU5JVF9TQ1JJUFRTX0NZR1dJTgorCitiaW5fU0NSSVBUUz0gCVwKKwltZXNzYWdlYnVzLWNvbmZpZworCitlbmRpZgorIyMgQ3lnd2luIGVuZAorCitpZiBIQVZFX1NZU1RFTUQKK1NDUklQVF9JTl9GSUxFUyArPSBcCisJZGJ1cy5zZXJ2aWNlLmluIFwKKwlkYnVzLnNvY2tldC5pbgorCitzeXN0ZW1kc3lzdGVtdW5pdF9EQVRBID0gXAorCWRidXMuc2VydmljZSBcCisJZGJ1cy5zb2NrZXQKK2VuZGlmCisKKyMjIyMgRXh0cmEgZGlzdAorCitFWFRSQV9ESVNUPSQoQ09ORklHX0lOX0ZJTEVTKSAkKFNDUklQVF9JTl9GSUxFUykKZGlmZiAtLWdpdCBhL2RidXMvYnVzL05PVElDRSBiL2RidXMvYnVzL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTFjYTFkCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9idXMvTk9USUNFCkBAIC0wLDAgKzEsNTUxIEBACitELUJ1cyBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgeW91ciBjaG9pY2Ugb2YgdGhlIEFjYWRlbWljIEZyZWUKK0xpY2Vuc2UgdmVyc2lvbiAyLjEsIG9yIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCitCb3RoIGxpY2Vuc2VzIGFyZSBpbmNsdWRlZCBoZXJlLiBTb21lIG9mIHRoZSBzdGFuZGFsb25lIGJpbmFyaWVzIGFyZQordW5kZXIgdGhlIEdQTCBvbmx5OyBpbiBwYXJ0aWN1bGFyLCBidXQgbm90IGxpbWl0ZWQgdG8sCit0b29scy9kYnVzLWNsZWFudXAtc29ja2V0cy5jIGFuZCB0ZXN0L2RlY29kZS1nY292LmMuIEVhY2ggc291cmNlIGNvZGUKK2ZpbGUgaXMgbWFya2VkIHdpdGggdGhlIHByb3BlciBjb3B5cmlnaHQgaW5mb3JtYXRpb24gLSBpZiB5b3UgZmluZCBhCitmaWxlIHRoYXQgaXNuJ3QgbWFya2VkIHBsZWFzZSBicmluZyBpdCB0byBvdXIgYXR0ZW50aW9uLgorCisKK1RoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UKK3YuIDIuMQorCitUaGlzIEFjYWRlbWljIEZyZWUgTGljZW5zZSAodGhlICJMaWNlbnNlIikgYXBwbGllcyB0byBhbnkgb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwICh0aGUgIk9yaWdpbmFsIFdvcmsiKSB3aG9zZSBvd25lciAodGhlICJMaWNlbnNvciIpIGhhcyBwbGFjZWQgdGhlIGZvbGxvd2luZyBub3RpY2UgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgT3JpZ2luYWwgV29yazoKKworTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorCisxKSBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gTGljZW5zb3IgaGVyZWJ5IGdyYW50cyBZb3UgYQord29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlLCBwZXJwZXR1YWwsIHN1YmxpY2Vuc2VhYmxlCitsaWNlbnNlIHRvIGRvIHRoZSBmb2xsb3dpbmc6CisKK2EpIHRvIHJlcHJvZHVjZSB0aGUgT3JpZ2luYWwgV29yayBpbiBjb3BpZXM7CisKK2IpIHRvIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyAoIkRlcml2YXRpdmUgV29ya3MiKSBiYXNlZCB1cG9uIHRoZSBPcmlnaW5hbCBXb3JrOworCitjKSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgT3JpZ2luYWwgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0byB0aGUgcHVibGljOworCitkKSB0byBwZXJmb3JtIHRoZSBPcmlnaW5hbCBXb3JrIHB1YmxpY2x5OyBhbmQKKworZSkgdG8gZGlzcGxheSB0aGUgT3JpZ2luYWwgV29yayBwdWJsaWNseS4KKworMikgR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIExpY2Vuc29yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwKK3JveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSwgcGVycGV0dWFsLCBzdWJsaWNlbnNlYWJsZSBsaWNlbnNlLCB1bmRlcgorcGF0ZW50IGNsYWltcyBvd25lZCBvciBjb250cm9sbGVkIGJ5IHRoZSBMaWNlbnNvciB0aGF0IGFyZSBlbWJvZGllZCBpbgordGhlIE9yaWdpbmFsIFdvcmsgYXMgZnVybmlzaGVkIGJ5IHRoZSBMaWNlbnNvciwgdG8gbWFrZSwgdXNlLCBzZWxsIGFuZAorb2ZmZXIgZm9yIHNhbGUgdGhlIE9yaWdpbmFsIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MuCisKKzMpIEdyYW50IG9mIFNvdXJjZSBDb2RlIExpY2Vuc2UuIFRoZSB0ZXJtICJTb3VyY2UgQ29kZSIgbWVhbnMgdGhlCitwcmVmZXJyZWQgZm9ybSBvZiB0aGUgT3JpZ2luYWwgV29yayBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQgYW5kCithbGwgYXZhaWxhYmxlIGRvY3VtZW50YXRpb24gZGVzY3JpYmluZyBob3cgdG8gbW9kaWZ5IHRoZSBPcmlnaW5hbAorV29yay4gTGljZW5zb3IgaGVyZWJ5IGFncmVlcyB0byBwcm92aWRlIGEgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZQorU291cmNlIENvZGUgb2YgdGhlIE9yaWdpbmFsIFdvcmsgYWxvbmcgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIE9yaWdpbmFsCitXb3JrIHRoYXQgTGljZW5zb3IgZGlzdHJpYnV0ZXMuIExpY2Vuc29yIHJlc2VydmVzIHRoZSByaWdodCB0byBzYXRpc2Z5Cit0aGlzIG9ibGlnYXRpb24gYnkgcGxhY2luZyBhIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgU291cmNlIENvZGUKK2luIGFuIGluZm9ybWF0aW9uIHJlcG9zaXRvcnkgcmVhc29uYWJseSBjYWxjdWxhdGVkIHRvIHBlcm1pdAoraW5leHBlbnNpdmUgYW5kIGNvbnZlbmllbnQgYWNjZXNzIGJ5IFlvdSBmb3IgYXMgbG9uZyBhcyBMaWNlbnNvcgorY29udGludWVzIHRvIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsIFdvcmssIGFuZCBieSBwdWJsaXNoaW5nIHRoZQorYWRkcmVzcyBvZiB0aGF0IGluZm9ybWF0aW9uIHJlcG9zaXRvcnkgaW4gYSBub3RpY2UgaW1tZWRpYXRlbHkKK2ZvbGxvd2luZyB0aGUgY29weXJpZ2h0IG5vdGljZSB0aGF0IGFwcGxpZXMgdG8gdGhlIE9yaWdpbmFsIFdvcmsuCisKKzQpIEV4Y2x1c2lvbnMgRnJvbSBMaWNlbnNlIEdyYW50LiBOZWl0aGVyIHRoZSBuYW1lcyBvZiBMaWNlbnNvciwgbm9yCit0aGUgbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyB0byB0aGUgT3JpZ2luYWwgV29yaywgbm9yIGFueSBvZiB0aGVpcgordHJhZGVtYXJrcyBvciBzZXJ2aWNlIG1hcmtzLCBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKK3Byb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIE9yaWdpbmFsIFdvcmsgd2l0aG91dCBleHByZXNzIHByaW9yIHdyaXR0ZW4KK3Blcm1pc3Npb24gb2YgdGhlIExpY2Vuc29yLiBOb3RoaW5nIGluIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBkZWVtZWQgdG8KK2dyYW50IGFueSByaWdodHMgdG8gdHJhZGVtYXJrcywgY29weXJpZ2h0cywgcGF0ZW50cywgdHJhZGUgc2VjcmV0cyBvcgorYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBMaWNlbnNvciBleGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAoraGVyZWluLiBObyBwYXRlbnQgbGljZW5zZSBpcyBncmFudGVkIHRvIG1ha2UsIHVzZSwgc2VsbCBvciBvZmZlciB0bworc2VsbCBlbWJvZGltZW50cyBvZiBhbnkgcGF0ZW50IGNsYWltcyBvdGhlciB0aGFuIHRoZSBsaWNlbnNlZCBjbGFpbXMKK2RlZmluZWQgaW4gU2VjdGlvbiAyLiBObyByaWdodCBpcyBncmFudGVkIHRvIHRoZSB0cmFkZW1hcmtzIG9mCitMaWNlbnNvciBldmVuIGlmIHN1Y2ggbWFya3MgYXJlIGluY2x1ZGVkIGluIHRoZSBPcmlnaW5hbCBXb3JrLiBOb3RoaW5nCitpbiB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgaW50ZXJwcmV0ZWQgdG8gcHJvaGliaXQgTGljZW5zb3IgZnJvbQorbGljZW5zaW5nIHVuZGVyIGRpZmZlcmVudCB0ZXJtcyBmcm9tIHRoaXMgTGljZW5zZSBhbnkgT3JpZ2luYWwgV29yawordGhhdCBMaWNlbnNvciBvdGhlcndpc2Ugd291bGQgaGF2ZSBhIHJpZ2h0IHRvIGxpY2Vuc2UuCisKKzUpIFRoaXMgc2VjdGlvbiBpbnRlbnRpb25hbGx5IG9taXR0ZWQuCisKKzYpIEF0dHJpYnV0aW9uIFJpZ2h0cy4gWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIENvZGUgb2YgYW55CitEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGNyZWF0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50IG9yIHRyYWRlbWFyaworbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgQ29kZSBvZiB0aGUgT3JpZ2luYWwgV29yaywgYXMgd2VsbCBhcyBhbnkKK25vdGljZXMgb2YgbGljZW5zaW5nIGFuZCBhbnkgZGVzY3JpcHRpdmUgdGV4dCBpZGVudGlmaWVkIHRoZXJlaW4gYXMgYW4KKyJBdHRyaWJ1dGlvbiBOb3RpY2UuIiBZb3UgbXVzdCBjYXVzZSB0aGUgU291cmNlIENvZGUgZm9yIGFueQorRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBjcmVhdGUgdG8gY2FycnkgYSBwcm9taW5lbnQgQXR0cmlidXRpb24KK05vdGljZSByZWFzb25hYmx5IGNhbGN1bGF0ZWQgdG8gaW5mb3JtIHJlY2lwaWVudHMgdGhhdCBZb3UgaGF2ZQorbW9kaWZpZWQgdGhlIE9yaWdpbmFsIFdvcmsuCisKKzcpIFdhcnJhbnR5IG9mIFByb3ZlbmFuY2UgYW5kIERpc2NsYWltZXIgb2YgV2FycmFudHkuIExpY2Vuc29yCit3YXJyYW50cyB0aGF0IHRoZSBjb3B5cmlnaHQgaW4gYW5kIHRvIHRoZSBPcmlnaW5hbCBXb3JrIGFuZCB0aGUgcGF0ZW50CityaWdodHMgZ3JhbnRlZCBoZXJlaW4gYnkgTGljZW5zb3IgYXJlIG93bmVkIGJ5IHRoZSBMaWNlbnNvciBvciBhcmUKK3N1YmxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIHdpdGggdGhlIHBlcm1pc3Npb24KK29mIHRoZSBjb250cmlidXRvcihzKSBvZiB0aG9zZSBjb3B5cmlnaHRzIGFuZCBwYXRlbnQgcmlnaHRzLiBFeGNlcHQgYXMKK2V4cHJlc3NseSBzdGF0ZWQgaW4gdGhlIGltbWVkaWF0ZWx5IHByb2NlZWRpbmcgc2VudGVuY2UsIHRoZSBPcmlnaW5hbAorV29yayBpcyBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2Ugb24gYW4gIkFTIElTIiBCQVNJUyBhbmQgV0lUSE9VVAorV0FSUkFOVFksIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLAordGhlIHdhcnJhbnRpZXMgb2YgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIE9GIFRIRSBPUklHSU5BTAorV09SSyBJUyBXSVRIIFlPVS4gVGhpcyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIGNvbnN0aXR1dGVzIGFuIGVzc2VudGlhbAorcGFydCBvZiB0aGlzIExpY2Vuc2UuIE5vIGxpY2Vuc2UgdG8gT3JpZ2luYWwgV29yayBpcyBncmFudGVkIGhlcmV1bmRlcgorZXhjZXB0IHVuZGVyIHRoaXMgZGlzY2xhaW1lci4KKworOCkgTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgYW5kIHVuZGVyIG5vIGxlZ2FsCit0aGVvcnksIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3IKK290aGVyd2lzZSwgc2hhbGwgdGhlIExpY2Vuc29yIGJlIGxpYWJsZSB0byBhbnkgcGVyc29uIGZvciBhbnkgZGlyZWN0LAoraW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkKK2NoYXJhY3RlciBhcmlzaW5nIGFzIGEgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciB0aGUgdXNlIG9mIHRoZQorT3JpZ2luYWwgV29yayBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgZGFtYWdlcyBmb3IgbG9zcyBvZgorZ29vZHdpbGwsIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQKK2FsbCBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzLiBUaGlzIGxpbWl0YXRpb24gb2YgbGlhYmlsaXR5CitzaGFsbCBub3QgYXBwbHkgdG8gbGlhYmlsaXR5IGZvciBkZWF0aCBvciBwZXJzb25hbCBpbmp1cnkgcmVzdWx0aW5nCitmcm9tIExpY2Vuc29yJ3MgbmVnbGlnZW5jZSB0byB0aGUgZXh0ZW50IGFwcGxpY2FibGUgbGF3IHByb2hpYml0cyBzdWNoCitsaW1pdGF0aW9uLiBTb21lIGp1cmlzZGljdGlvbnMgZG8gbm90IGFsbG93IHRoZSBleGNsdXNpb24gb3IKK2xpbWl0YXRpb24gb2YgaW5jaWRlbnRhbCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHNvIHRoaXMgZXhjbHVzaW9uCithbmQgbGltaXRhdGlvbiBtYXkgbm90IGFwcGx5IHRvIFlvdS4KKworOSkgQWNjZXB0YW5jZSBhbmQgVGVybWluYXRpb24uIElmIFlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKK09yaWdpbmFsIFdvcmsgb3IgYSBEZXJpdmF0aXZlIFdvcmssIFlvdSBtdXN0IG1ha2UgYSByZWFzb25hYmxlIGVmZm9ydAordW5kZXIgdGhlIGNpcmN1bXN0YW5jZXMgdG8gb2J0YWluIHRoZSBleHByZXNzIGFzc2VudCBvZiByZWNpcGllbnRzIHRvCit0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBOb3RoaW5nIGVsc2UgYnV0IHRoaXMgTGljZW5zZSAob3IgYW5vdGhlcgord3JpdHRlbiBhZ3JlZW1lbnQgYmV0d2VlbiBMaWNlbnNvciBhbmQgWW91KSBncmFudHMgWW91IHBlcm1pc3Npb24gdG8KK2NyZWF0ZSBEZXJpdmF0aXZlIFdvcmtzIGJhc2VkIHVwb24gdGhlIE9yaWdpbmFsIFdvcmsgb3IgdG8gZXhlcmNpc2UKK2FueSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaW4gU2VjdGlvbiAxIGhlcmVpbiwgYW5kIGFueSBhdHRlbXB0IHRvIGRvCitzbyBleGNlcHQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSAob3IgYW5vdGhlciB3cml0dGVuCithZ3JlZW1lbnQgYmV0d2VlbiBMaWNlbnNvciBhbmQgWW91KSBpcyBleHByZXNzbHkgcHJvaGliaXRlZCBieQorVS5TLiBjb3B5cmlnaHQgbGF3LCB0aGUgZXF1aXZhbGVudCBsYXdzIG9mIG90aGVyIGNvdW50cmllcywgYW5kIGJ5CitpbnRlcm5hdGlvbmFsIHRyZWF0eS4gVGhlcmVmb3JlLCBieSBleGVyY2lzaW5nIGFueSBvZiB0aGUgcmlnaHRzCitncmFudGVkIHRvIFlvdSBpbiBTZWN0aW9uIDEgaGVyZWluLCBZb3UgaW5kaWNhdGUgWW91ciBhY2NlcHRhbmNlIG9mCit0aGlzIExpY2Vuc2UgYW5kIGFsbCBvZiBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMuCisKKzEwKSBUZXJtaW5hdGlvbiBmb3IgUGF0ZW50IEFjdGlvbi4gVGhpcyBMaWNlbnNlIHNoYWxsIHRlcm1pbmF0ZQorYXV0b21hdGljYWxseSBhbmQgWW91IG1heSBubyBsb25nZXIgZXhlcmNpc2UgYW55IG9mIHRoZSByaWdodHMgZ3JhbnRlZAordG8gWW91IGJ5IHRoaXMgTGljZW5zZSBhcyBvZiB0aGUgZGF0ZSBZb3UgY29tbWVuY2UgYW4gYWN0aW9uLAoraW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltLCBhZ2FpbnN0IExpY2Vuc29yIG9yIGFueQorbGljZW5zZWUgYWxsZWdpbmcgdGhhdCB0aGUgT3JpZ2luYWwgV29yayBpbmZyaW5nZXMgYSBwYXRlbnQuIFRoaXMKK3Rlcm1pbmF0aW9uIHByb3Zpc2lvbiBzaGFsbCBub3QgYXBwbHkgZm9yIGFuIGFjdGlvbiBhbGxlZ2luZyBwYXRlbnQKK2luZnJpbmdlbWVudCBieSBjb21iaW5hdGlvbnMgb2YgdGhlIE9yaWdpbmFsIFdvcmsgd2l0aCBvdGhlciBzb2Z0d2FyZQorb3IgaGFyZHdhcmUuCisKKzExKSBKdXJpc2RpY3Rpb24sIFZlbnVlIGFuZCBHb3Zlcm5pbmcgTGF3LiBBbnkgYWN0aW9uIG9yIHN1aXQgcmVsYXRpbmcKK3RvIHRoaXMgTGljZW5zZSBtYXkgYmUgYnJvdWdodCBvbmx5IGluIHRoZSBjb3VydHMgb2YgYSBqdXJpc2RpY3Rpb24KK3doZXJlaW4gdGhlIExpY2Vuc29yIHJlc2lkZXMgb3IgaW4gd2hpY2ggTGljZW5zb3IgY29uZHVjdHMgaXRzIHByaW1hcnkKK2J1c2luZXNzLCBhbmQgdW5kZXIgdGhlIGxhd3Mgb2YgdGhhdCBqdXJpc2RpY3Rpb24gZXhjbHVkaW5nIGl0cworY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuIFRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMKK0NvbnZlbnRpb24gb24gQ29udHJhY3RzIGZvciB0aGUgSW50ZXJuYXRpb25hbCBTYWxlIG9mIEdvb2RzIGlzCitleHByZXNzbHkgZXhjbHVkZWQuIEFueSB1c2Ugb2YgdGhlIE9yaWdpbmFsIFdvcmsgb3V0c2lkZSB0aGUgc2NvcGUgb2YKK3RoaXMgTGljZW5zZSBvciBhZnRlciBpdHMgdGVybWluYXRpb24gc2hhbGwgYmUgc3ViamVjdCB0byB0aGUKK3JlcXVpcmVtZW50cyBhbmQgcGVuYWx0aWVzIG9mIHRoZSBVLlMuIENvcHlyaWdodCBBY3QsIDE3IFUuUy5DLiDDgsKnIDEwMQorZXQgc2VxLiwgdGhlIGVxdWl2YWxlbnQgbGF3cyBvZiBvdGhlciBjb3VudHJpZXMsIGFuZCBpbnRlcm5hdGlvbmFsCit0cmVhdHkuIFRoaXMgc2VjdGlvbiBzaGFsbCBzdXJ2aXZlIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UuCisKKzEyKSBBdHRvcm5leXMgRmVlcy4gSW4gYW55IGFjdGlvbiB0byBlbmZvcmNlIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UKK29yIHNlZWtpbmcgZGFtYWdlcyByZWxhdGluZyB0aGVyZXRvLCB0aGUgcHJldmFpbGluZyBwYXJ0eSBzaGFsbCBiZQorZW50aXRsZWQgdG8gcmVjb3ZlciBpdHMgY29zdHMgYW5kIGV4cGVuc2VzLCBpbmNsdWRpbmcsIHdpdGhvdXQKK2xpbWl0YXRpb24sIHJlYXNvbmFibGUgYXR0b3JuZXlzJyBmZWVzIGFuZCBjb3N0cyBpbmN1cnJlZCBpbgorY29ubmVjdGlvbiB3aXRoIHN1Y2ggYWN0aW9uLCBpbmNsdWRpbmcgYW55IGFwcGVhbCBvZiBzdWNoIGFjdGlvbi4gVGhpcworc2VjdGlvbiBzaGFsbCBzdXJ2aXZlIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UuCisKKzEzKSBNaXNjZWxsYW5lb3VzLiBUaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50Citjb25jZXJuaW5nIHRoZSBzdWJqZWN0IG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlCitpcyBoZWxkIHRvIGJlIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8KK3RoZSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgZW5mb3JjZWFibGUuCisKKzE0KSBEZWZpbml0aW9uIG9mICJZb3UiIGluIFRoaXMgTGljZW5zZS4gIllvdSIgdGhyb3VnaG91dCB0aGlzCitMaWNlbnNlLCB3aGV0aGVyIGluIHVwcGVyIG9yIGxvd2VyIGNhc2UsIG1lYW5zIGFuIGluZGl2aWR1YWwgb3IgYQorbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyLCBhbmQgY29tcGx5aW5nIHdpdGggYWxsIG9mIHRoZQordGVybXMgb2YsIHRoaXMgTGljZW5zZS4gRm9yIGxlZ2FsIGVudGl0aWVzLCAiWW91IiBpbmNsdWRlcyBhbnkgZW50aXR5Cit0aGF0IGNvbnRyb2xzLCBpcyBjb250cm9sbGVkIGJ5LCBvciBpcyB1bmRlciBjb21tb24gY29udHJvbCB3aXRoCit5b3UuIEZvciBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLAorZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaAorZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkKK3BlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsCitvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKzE1KSBSaWdodCB0byBVc2UuIFlvdSBtYXkgdXNlIHRoZSBPcmlnaW5hbCBXb3JrIGluIGFsbCB3YXlzIG5vdAorb3RoZXJ3aXNlIHJlc3RyaWN0ZWQgb3IgY29uZGl0aW9uZWQgYnkgdGhpcyBMaWNlbnNlIG9yIGJ5IGxhdywgYW5kCitMaWNlbnNvciBwcm9taXNlcyBub3QgdG8gaW50ZXJmZXJlIHdpdGggb3IgYmUgcmVzcG9uc2libGUgZm9yIHN1Y2gKK3VzZXMgYnkgWW91LgorCitUaGlzIGxpY2Vuc2UgaXMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgTGF3cmVuY2UgRS4gUm9zZW4uIEFsbCByaWdodHMKK3Jlc2VydmVkLiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhpcworbGljZW5zZSB3aXRob3V0IG1vZGlmaWNhdGlvbi4gVGhpcyBsaWNlbnNlIG1heSBub3QgYmUgbW9kaWZpZWQgd2l0aG91dAordGhlIGV4cHJlc3Mgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIGl0cyBjb3B5cmlnaHQgb3duZXIuCisKKworLS0gCitFTkQgT0YgQUNBREVNSUMgRlJFRSBMSUNFTlNFLiBUaGUgZm9sbG93aW5nIGlzIGludGVuZGVkIHRvIGRlc2NyaWJlIHRoZSBlc3NlbnRpYWwgCitkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgKEFGTCkgdmVyc2lvbiAxLjAgYW5kIG90aGVyIAorb3BlbiBzb3VyY2UgbGljZW5zZXM6CisKK1RoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgaXMgc2ltaWxhciB0byB0aGUgQlNELCBNSVQsIFVvSS9OQ1NBIGFuZCBBcGFjaGUgCitsaWNlbnNlcyBpbiBtYW55IHJlc3BlY3RzIGJ1dCBpdCBpcyBpbnRlbmRlZCB0byBzb2x2ZSBhIGZldyBwcm9ibGVtcyB3aXRoIAordGhvc2UgbGljZW5zZXMuCisgICAgCisqIFRoZSBBRkwgaXMgd3JpdHRlbiBzbyBhcyB0byBtYWtlIGl0IGNsZWFyIHdoYXQgc29mdHdhcmUgaXMgYmVpbmcgCitsaWNlbnNlZCAoYnkgdGhlIGluY2x1c2lvbiBvZiBhIHN0YXRlbWVudCBmb2xsb3dpbmcgdGhlIGNvcHlyaWdodCBub3RpY2UgCitpbiB0aGUgc29mdHdhcmUpLiBUaGlzIHdheSwgdGhlIGxpY2Vuc2UgZnVuY3Rpb25zIGJldHRlciB0aGFuIGEgdGVtcGxhdGUgCitsaWNlbnNlLiBUaGUgQlNELCBNSVQgYW5kIFVvSS9OQ1NBIGxpY2Vuc2VzIGFwcGx5IHRvIHVuaWRlbnRpZmllZCBzb2Z0d2FyZS4KKyAgICAKKyogVGhlIEFGTCBjb250YWlucyBhIGNvbXBsZXRlIGNvcHlyaWdodCBncmFudCB0byB0aGUgc29mdHdhcmUuIFRoZSBCU0QgCithbmQgQXBhY2hlIGxpY2Vuc2VzIGFyZSB2YWd1ZSBhbmQgaW5jb21wbGV0ZSBpbiB0aGF0IHJlc3BlY3QuCisgICAgCisqIFRoZSBBRkwgY29udGFpbnMgYSBjb21wbGV0ZSBwYXRlbnQgZ3JhbnQgdG8gdGhlIHNvZnR3YXJlLiBUaGUgQlNELCBNSVQsIAorVW9JL05DU0EgYW5kIEFwYWNoZSBsaWNlbnNlcyByZWx5IG9uIGFuIGltcGxpZWQgcGF0ZW50IGxpY2Vuc2UgYW5kIGNvbnRhaW4gCitubyBleHBsaWNpdCBwYXRlbnQgZ3JhbnQuCisgICAgCisqIFRoZSBBRkwgbWFrZXMgaXQgY2xlYXIgdGhhdCBubyB0cmFkZW1hcmsgcmlnaHRzIGFyZSBncmFudGVkIHRvIHRoZSAKK2xpY2Vuc29yJ3MgdHJhZGVtYXJrcy4gVGhlIEFwYWNoZSBsaWNlbnNlIGNvbnRhaW5zIHN1Y2ggYSBwcm92aXNpb24sIGJ1dCB0aGUgCitCU0QsIE1JVCBhbmQgVW9JL05DU0EgbGljZW5zZXMgZG8gbm90LgorICAgIAorKiBUaGUgQUZMIGluY2x1ZGVzIHRoZSB3YXJyYW50eSBieSB0aGUgbGljZW5zb3IgdGhhdCBpdCBlaXRoZXIgb3ducyB0aGUgCitjb3B5cmlnaHQgb3IgdGhhdCBpdCBpcyBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlIHVuZGVyIGEgbGljZW5zZS4gTm9uZSBvZiAKK3RoZSBvdGhlciBsaWNlbnNlcyBjb250YWluIHRoYXQgd2FycmFudHkuIEFsbCBvdGhlciB3YXJyYW50aWVzIGFyZSBkaXNjbGFpbWVkLCAKK2FzIGlzIHRoZSBjYXNlIGZvciB0aGUgb3RoZXIgbGljZW5zZXMuCisKKyogVGhlIEFGTCBpcyBpdHNlbGYgY29weXJpZ2h0ZWQgKHdpdGggdGhlIHJpZ2h0IGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSAKK3dpdGhvdXQgbW9kaWZpY2F0aW9uKS4gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIG93bmVyIG9mIHRoZSBjb3B5cmlnaHQgdG8gdGhlIAorbGljZW5zZSB3aWxsIGNvbnRyb2wgY2hhbmdlcy4gVGhlIEFwYWNoZSBsaWNlbnNlIGNvbnRhaW5zIGEgY29weXJpZ2h0IG5vdGljZSwgCitidXQgdGhlIEJTRCwgTUlUIGFuZCBVb0kvTkNTQSBsaWNlbnNlcyBkbyBub3QuIAorLS0KK1NUQVJUIE9GIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCistLQorCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwordXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQordGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCit5b3VyIHByb2dyYW1zLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0CitpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAoraW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2FueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KK1RoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91CitkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Cit5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQorc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgorcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKKygyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCitkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgorCisgIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwordGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKK2F1dGhvcnMnIHJlcHV0YXRpb25zLgorCisgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCitwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCitwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCitwcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKK3BhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisMCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucworYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKK3JlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgorbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKK3RoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCitlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgorbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgordGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCitpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KK1doZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncworc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Citjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCitub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7CithbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQorICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCisgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKKyAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCisgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCisgICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgorICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCisgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKKyAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCisgICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisMCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCit3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCisgICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQorICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCisgICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKKyAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KK2NvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKK3NwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQorYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKK2Zvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCithY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50CithY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKwwKKyAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0CitvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKK3ZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KK0hvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAorcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KK3RoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwordGhpcyBMaWNlbnNlLgorCisgIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KK2FwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCitjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKwwKKyAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCit0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CitsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCitlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgordGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4KKworICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCit0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcworbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKK29mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKK29mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgorT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCitUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCitQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKK1JFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKK1JFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKK09VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQorWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKK1BST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisJICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2RidXMvYnVzL2FjdGl2YXRpb24tZXhpdC1jb2Rlcy5oIGIvZGJ1cy9idXMvYWN0aXZhdGlvbi1leGl0LWNvZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJiOThkYwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvYnVzL2FjdGl2YXRpb24tZXhpdC1jb2Rlcy5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogYWN0aXZhdGlvbi1leGl0LWNvZGVzLmggIFJldHVybiB2YWx1ZXMgZm9yIHRoZSBsYXVuY2ggaGVscGVyIHdoaWNoIGlzIHNldAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBoZWxwZXIgYW5kIHJlYWQgaW4gZGJ1cy1zcGF3bi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIEJVU19BQ1RJVkFUSU9OX0VYSVRfQ09ERVNfSAorI2RlZmluZSBCVVNfQUNUSVZBVElPTl9FWElUX0NPREVTX0gKKworLyoqIFJldHVybiBjb2RlcyBmcm9tIHRoZSBsYXVuY2ggaGVscGVyIC0gbm90IHB1YmxpYyBBUEkuIEhvd2V2ZXIsCisgKiAgcHJlc3VtYWJseSBpZiBzb21lIHRoaXJkIHBhcnR5IGRpZCB3cml0ZSB0aGVpciBvd24gbGF1bmNoIGhlbHBlciwKKyAqICB0aGV5IHdvdWxkIGhhdmUgdG8gcmVseSBvbiB0aGVzZSwgb3IgYXQgbGVhc3QgYWx3YXlzIHJldHVybgorICogIDEgZm9yIEdFTkVSSUNfRkFJTFVSRS4KKyAqLworI2RlZmluZSBCVVNfU1BBV05fRVhJVF9DT0RFX0dFTkVSSUNfRkFJTFVSRSAgICAgIDEKKyNkZWZpbmUgQlVTX1NQQVdOX0VYSVRfQ09ERV9OT19NRU1PUlkgICAgICAgICAgICAyCisjZGVmaW5lIEJVU19TUEFXTl9FWElUX0NPREVfQ09ORklHX0lOVkFMSUQgICAgICAgMworI2RlZmluZSBCVVNfU1BBV05fRVhJVF9DT0RFX1NFVFVQX0ZBSUxFRCAgICAgICAgIDQKKyNkZWZpbmUgQlVTX1NQQVdOX0VYSVRfQ09ERV9OQU1FX0lOVkFMSUQgICAgICAgICA1CisjZGVmaW5lIEJVU19TUEFXTl9FWElUX0NPREVfU0VSVklDRV9OT1RfRk9VTkQgICAgNgorI2RlZmluZSBCVVNfU1BBV05fRVhJVF9DT0RFX1BFUk1JU1NJT05TX0lOVkFMSUQgIDcKKyNkZWZpbmUgQlVTX1NQQVdOX0VYSVRfQ09ERV9GSUxFX0lOVkFMSUQgICAgICAgICA4CisjZGVmaW5lIEJVU19TUEFXTl9FWElUX0NPREVfRVhFQ19GQUlMRUQgICAgICAgICAgOQorI2RlZmluZSBCVVNfU1BBV05fRVhJVF9DT0RFX0lOVkFMSURfQVJHUyAgICAgICAgIDEwCisjZGVmaW5lIEJVU19TUEFXTl9FWElUX0NPREVfQ0hJTERfU0lHTkFMRUQgICAgICAgMTEKKworI2VuZGlmIC8qIEJVU19BQ1RJVkFUSU9OX0VYSVRfQ09ERVNfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9idXMvYWN0aXZhdGlvbi1oZWxwZXItYmluLmMgYi9kYnVzL2J1cy9hY3RpdmF0aW9uLWhlbHBlci1iaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzYwYWNjCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9idXMvYWN0aXZhdGlvbi1oZWxwZXItYmluLmMKQEAgLTAsMCArMSwxMDAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogYWN0aXZhdGlvbi1oZWxwZXItYmluLmMgIFNldHVpZCBoZWxwZXIgZm9yIGxhdW5jaGluZyBwcm9ncmFtcyBhcyBhIGN1c3RvbQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuIFRoaXMgZmlsZSBpcyBzZWN1cml0eSBzZW5zaXRpdmUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiYWN0aXZhdGlvbi1oZWxwZXIuaCIKKyNpbmNsdWRlICJhY3RpdmF0aW9uLWV4aXQtY29kZXMuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0YXRpYyBpbnQKK2NvbnZlcnRfZXJyb3JfdG9fZXhpdF9jb2RlIChEQnVzRXJyb3IgKmVycm9yKQoreworICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICByZXR1cm4gQlVTX1NQQVdOX0VYSVRfQ09ERV9OT19NRU1PUlk7CisKKyAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0NPTkZJR19JTlZBTElEKSkKKyAgICByZXR1cm4gQlVTX1NQQVdOX0VYSVRfQ09ERV9DT05GSUdfSU5WQUxJRDsKKworICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fU0VUVVBfRkFJTEVEKSkKKyAgICByZXR1cm4gQlVTX1NQQVdOX0VYSVRfQ09ERV9TRVRVUF9GQUlMRUQ7CisKKyAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX1NFUlZJQ0VfSU5WQUxJRCkpCisgICAgcmV0dXJuIEJVU19TUEFXTl9FWElUX0NPREVfU0VSVklDRV9OT1RfRk9VTkQ7CisKKyAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX1BFUk1JU1NJT05TX0lOVkFMSUQpKQorICAgIHJldHVybiBCVVNfU1BBV05fRVhJVF9DT0RFX1BFUk1JU1NJT05TX0lOVkFMSUQ7CisKKyAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0ZJTEVfSU5WQUxJRCkpCisgICAgcmV0dXJuIEJVU19TUEFXTl9FWElUX0NPREVfRklMRV9JTlZBTElEOworCisgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9FWEVDX0ZBSUxFRCkpCisgICAgcmV0dXJuIEJVU19TUEFXTl9FWElUX0NPREVfRVhFQ19GQUlMRUQ7CisKKyAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUykpCisgICAgcmV0dXJuIEJVU19TUEFXTl9FWElUX0NPREVfSU5WQUxJRF9BUkdTOworCisgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9DSElMRF9TSUdOQUxFRCkpCisgICAgcmV0dXJuIEJVU19TUEFXTl9FWElUX0NPREVfQ0hJTERfU0lHTkFMRUQ7CisgIAorICAvKiBzaG91bGQgd2UgYXNzZXJ0PyAqLworICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAlc1xuIiwgZXJyb3ItPm5hbWUsIGVycm9yLT5tZXNzYWdlKTsKKyAgCisgIHJldHVybiBCVVNfU1BBV05fRVhJVF9DT0RFX1NFVFVQX0ZBSUxFRDsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgaW50IHJldHZhbDsKKworICAvKiBkZWZhdWx0IGlzIGFsbCBva2F5ICovCisgIHJldHZhbCA9IDA7CisKKyAgLyogaGF2ZSB3ZSB1c2VkIGEgaGVscCBvcHRpb24gb3Igbm90IHNwZWNpZmllZCB0aGUgY29ycmVjdCBhcmd1bWVudHM/ICovCisgIGlmIChhcmdjICE9IDIgfHwKKyAgICAgIHN0cmNtcCAoYXJndlsxXSwgIi0taGVscCIpID09IDAgfHwKKyAgICAgIHN0cmNtcCAoYXJndlsxXSwgIi1oIikgPT0gMCB8fAorICAgICAgc3RyY21wIChhcmd2WzFdLCAiLT8iKSA9PSAwKQorICAgIHsKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZGJ1cy1kYWVtb24tYWN0aXZhdGlvbi1oZWxwZXIgc2VydmljZS50by5hY3RpdmF0ZVxuIik7CisgICAgICAgIGV4aXQgKDApOworICAgIH0KKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIGlmICghcnVuX2xhdW5jaF9oZWxwZXIgKGFyZ3ZbMV0sICZlcnJvcikpCisgICAgeworICAgICAgLyogY29udmVydCBlcnJvciB0byBhbiBleGl0IGNvZGUgKi8KKyAgICAgIHJldHZhbCA9IGNvbnZlcnRfZXJyb3JfdG9fZXhpdF9jb2RlICgmZXJyb3IpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgIH0KKworICByZXR1cm4gcmV0dmFsOworfQorCmRpZmYgLS1naXQgYS9kYnVzL2J1cy9hY3RpdmF0aW9uLWhlbHBlci5jIGIvZGJ1cy9idXMvYWN0aXZhdGlvbi1oZWxwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmMwMGQyCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9idXMvYWN0aXZhdGlvbi1oZWxwZXIuYwpAQCAtMCwwICsxLDU0OCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBhY3RpdmF0aW9uLWhlbHBlci5jICBTZXR1aWQgaGVscGVyIGZvciBsYXVuY2hpbmcgcHJvZ3JhbXMgYXMgYSBjdXN0b20KKyAqICAgICAgICAgICAgICAgICAgICAgIHVzZXIuIFRoaXMgZmlsZSBpcyBzZWN1cml0eSBzZW5zaXRpdmUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgImJ1cy5oIgorI2luY2x1ZGUgImRyaXZlci5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiZGVza3RvcC1maWxlLmgiCisjaW5jbHVkZSAiY29uZmlnLXBhcnNlci10cml2aWFsLmgiCisjaW5jbHVkZSAiYWN0aXZhdGlvbi1oZWxwZXIuaCIKKyNpbmNsdWRlICJhY3RpdmF0aW9uLWV4aXQtY29kZXMuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8Z3JwLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMtc2hlbGwuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5oPgorCitzdGF0aWMgQnVzRGVza3RvcEZpbGUgKgorZGVza3RvcF9maWxlX2Zvcl9uYW1lIChCdXNDb25maWdQYXJzZXIgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIEJ1c0Rlc2t0b3BGaWxlICpkZXNrdG9wX2ZpbGU7CisgIERCdXNMaXN0ICoqc2VydmljZV9kaXJzOworICBEQnVzTGlzdCAqbGluazsKKyAgREJ1c0Vycm9yIHRtcF9lcnJvcjsKKyAgREJ1c1N0cmluZyBmdWxsX3BhdGg7CisgIERCdXNTdHJpbmcgZmlsZW5hbWU7CisgIGNvbnN0IGNoYXIgKmRpcjsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBkZXNrdG9wX2ZpbGUgPSBOVUxMOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmaWxlbmFtZSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0X2FsbDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfcGF0aCkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0X2ZpbGVuYW1lOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZmaWxlbmFtZSwgbmFtZSkgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZmlsZW5hbWUsICIuc2VydmljZSIpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgc2VydmljZV9kaXJzID0gYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3NlcnZpY2VfZGlycyAocGFyc2VyKTsKKyAgZm9yIChsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoc2VydmljZV9kaXJzKTsKKyAgICAgICBsaW5rICE9IE5VTEw7CisgICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoc2VydmljZV9kaXJzLCBsaW5rKSkKKyAgICB7CisgICAgICBkaXIgPSBsaW5rLT5kYXRhOworICAgICAgX2RidXNfdmVyYm9zZSAoIkxvb2tpbmcgYXQgJyVzJ1xuIiwgZGlyKTsKKworICAgICAgZGJ1c19lcnJvcl9pbml0ICgmdG1wX2Vycm9yKTsKKworICAgICAgLyogY2xlYXIgdGhlIHBhdGggZnJvbSBsYXN0IHRpbWUgKi8KKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmZnVsbF9wYXRoLCAwKTsKKworICAgICAgLyogYnVpbGQgdGhlIGZ1bGwgcGF0aCAqLworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZnVsbF9wYXRoLCBkaXIpIHx8CisgICAgICAgICAgIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZmdWxsX3BhdGgsICZmaWxlbmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJUcnlpbmcgdG8gbG9hZCBmaWxlICclcydcbiIsIF9kYnVzX3N0cmluZ19nZXRfZGF0YSAoJmZ1bGxfcGF0aCkpOworICAgICAgZGVza3RvcF9maWxlID0gYnVzX2Rlc2t0b3BfZmlsZV9sb2FkICgmZnVsbF9wYXRoLCAmdG1wX2Vycm9yKTsKKyAgICAgIGlmIChkZXNrdG9wX2ZpbGUgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZ0bXBfZXJyb3IpOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDb3VsZCBub3QgbG9hZCAlczogJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZ1bGxfcGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdG1wX2Vycm9yLm5hbWUsIHRtcF9lcnJvci5tZXNzYWdlKTsKKworICAgICAgICAgIC8qIHdlIG1heSBoYXZlIGZhaWxlZCBpZiB0aGUgZmlsZSBpcyBub3QgZm91bmQ7IHRoaXMgaXMgbm90IGZhdGFsICovCisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZ0bXBfZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19tb3ZlX2Vycm9yICgmdG1wX2Vycm9yLCBlcnJvcik7CisgICAgICAgICAgICAgIC8qIHdlIG9ubHkgYmFpbCBvdXQgb24gT09NICovCisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJnRtcF9lcnJvcik7CisgICAgICAgIH0KKworICAgICAgLyogZGlkIHdlIGZpbmQgdGhlIGRlc2t0b3AgZmlsZSB3ZSB3YW50PyAqLworICAgICAgaWYgKGRlc2t0b3BfZmlsZSAhPSBOVUxMKQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgLyogRGlkbid0IGZpbmQgZGVza3RvcCBmaWxlOyBzZXQgZXJyb3IgKi8KKyAgaWYgKGRlc2t0b3BfZmlsZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9TRVJWSUNFX05PVF9GT1VORCwKKyAgICAgICAgICAgICAgICAgICAgICAiVGhlIG5hbWUgJXMgd2FzIG5vdCBwcm92aWRlZCBieSBhbnkgLnNlcnZpY2UgZmlsZXMiLAorICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgIH0KKworb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CitvdXRfZmlsZW5hbWU6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworb3V0X2FsbDoKKyAgcmV0dXJuIGRlc2t0b3BfZmlsZTsKK30KKworLyogQ2xlYXJzIHRoZSBlbnZpcm9ubWVudCwgZXhjZXB0IGZvciBEQlVTX1NUQVJURVJfeCwKKyAqIHdoaWNoIHdlIGhhcmRjb2RlIHRvIHRoZSBzeXN0ZW0gYnVzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NsZWFyX2Vudmlyb25tZW50IChEQnVzRXJyb3IgKmVycm9yKQoreworI2lmbmRlZiBBQ1RJVkFUSU9OX0xBVU5DSEVSX1RFU1QKKyAgLyogdG90YWxseSBjbGVhciB0aGUgZW52aXJvbm1lbnQgKi8KKyAgaWYgKCFfZGJ1c19jbGVhcmVudiAoKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fU0VUVVBfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJjb3VsZCBub3QgY2xlYXIgZW52aXJvbm1lbnRcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyNlbmRpZgorCisgIC8qIEVuc3VyZSB0aGUgYnVzIGlzIHNldCB0byBzeXN0ZW0gKi8KKyAgX2RidXNfc2V0ZW52ICgiREJVU19TVEFSVEVSX0FERFJFU1MiLCBEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTKTsKKyAgX2RidXNfc2V0ZW52ICgiREJVU19TVEFSVEVSX0JVU19UWVBFIiwgInN5c3RlbSIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3Blcm1pc3Npb25zIChjb25zdCBjaGFyICpkYnVzX3VzZXIsIERCdXNFcnJvciAqZXJyb3IpCit7CisjaWZuZGVmIEFDVElWQVRJT05fTEFVTkNIRVJfVEVTVAorICB1aWRfdCB1aWQsIGV1aWQ7CisgIHN0cnVjdCBwYXNzd2QgKnB3OworCisgIHB3ID0gTlVMTDsKKyAgdWlkID0gMDsKKyAgZXVpZCA9IDA7CisKKyAgLyogYmFpbCBvdXQgdW5sZXNzIHRoZSBkYnVzIHVzZXIgaXMgaW52b2tpbmcgdGhlIGhlbHBlciAqLworICBwdyA9IGdldHB3bmFtKGRidXNfdXNlcik7CisgIGlmICghcHcpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX1BFUk1JU1NJT05TX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBmaW5kIHVzZXIgJyVzJyIsIGRidXNfdXNlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB1aWQgPSBnZXR1aWQoKTsKKyAgaWYgKHB3LT5wd191aWQgIT0gdWlkKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9QRVJNSVNTSU9OU19JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICJub3QgaW52b2tlZCBmcm9tIHVzZXIgJyVzJyIsIGRidXNfdXNlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIGJhaWwgb3V0IHVubGVzcyB3ZSBhcmUgc2V0dWlkIHRvIHVzZXIgcm9vdCAqLworICBldWlkID0gZ2V0ZXVpZCgpOworICBpZiAoZXVpZCAhPSAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9QRVJNSVNTSU9OU19JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICJub3Qgc2V0dWlkIHJvb3QiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisjZW5kaWYKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19zZXJ2aWNlX25hbWUgKEJ1c0Rlc2t0b3BGaWxlICpkZXNrdG9wX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgY2hhciAqbmFtZV90bXA7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICByZXR2YWwgPSBGQUxTRTsKKworICAvKiB0cnkgdG8gZ2V0IE5hbWUgKi8KKyAgaWYgKCFidXNfZGVza3RvcF9maWxlX2dldF9zdHJpbmcgKGRlc2t0b3BfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU0VSVklDRV9TRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZV90bXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgZ290byBmYWlsZWQ7CisKKyAgLyogdmVyaWZ5IHRoYXQgdGhlIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIGZpbGUgc2VydmljZSBuYW1lICovCisgIGlmIChzdHJjbXAgKHNlcnZpY2VfbmFtZSwgbmFtZV90bXApICE9IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0ZJTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAiU2VydmljZSAnJXMnIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHZhbHVlIiwgbmFtZV90bXApOworICAgICAgZ290byBmYWlsZWRfZnJlZTsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworZmFpbGVkX2ZyZWU6CisgIC8qIHdlIGRvbid0IHJldHVybiB0aGUgbmFtZSwgc28gZnJlZSBpdCBoZXJlICovCisgIGRidXNfZnJlZSAobmFtZV90bXApOworZmFpbGVkOgorICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2dldF9wYXJhbWV0ZXJzX2Zvcl9zZXJ2aWNlIChCdXNEZXNrdG9wRmlsZSAqZGVza3RvcF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAqKmV4ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAqKnVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBjaGFyICpleGVjX3RtcDsKKyAgY2hhciAqdXNlcl90bXA7CisKKyAgZXhlY190bXAgPSBOVUxMOworICB1c2VyX3RtcCA9IE5VTEw7CisKKyAgLyogY2hlY2sgdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgKi8KKyAgaWYgKCFjaGVja19zZXJ2aWNlX25hbWUgKGRlc2t0b3BfZmlsZSwgc2VydmljZV9uYW1lLCBlcnJvcikpCisgICAgZ290byBmYWlsZWQ7CisKKyAgLyogZ2V0IHRoZSBjb21wbGV0ZSBwYXRoIG9mIHRoZSBleGVjdXRhYmxlICovCisgIGlmICghYnVzX2Rlc2t0b3BfZmlsZV9nZXRfc3RyaW5nIChkZXNrdG9wX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NFUlZJQ0VfU0VDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU0VSVklDRV9FWEVDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4ZWNfdG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICAvKiBnZXQgdGhlIHVzZXIgdGhhdCBzaG91bGQgcnVuIHRoaXMgc2VydmljZSAtIHVzZXIgaXMgY29tcHVsc2FyeSBmb3Igc3lzdGVtIGFjdGl2YXRpb24gKi8KKyAgaWYgKCFidXNfZGVza3RvcF9maWxlX2dldF9zdHJpbmcgKGRlc2t0b3BfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU0VSVklDRV9TRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX1VTRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlcl90bXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIC8qIG9ubHkgYXNzaWduIGlmIGFsbCB0aGUgY2hlY2tzIHBhc3NlZCAqLworICAqZXhlYyA9IGV4ZWNfdG1wOworICAqdXNlciA9IHVzZXJfdG1wOworICByZXR1cm4gVFJVRTsKKworZmFpbGVkOgorICBkYnVzX2ZyZWUgKGV4ZWNfdG1wKTsKKyAgZGJ1c19mcmVlICh1c2VyX3RtcCk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citzd2l0Y2hfdXNlciAoY2hhciAqdXNlciwgREJ1c0Vycm9yICplcnJvcikKK3sKKyNpZm5kZWYgQUNUSVZBVElPTl9MQVVOQ0hFUl9URVNUCisgIHN0cnVjdCBwYXNzd2QgKnB3OworCisgIC8qIGZpbmQgdXNlciAqLworICBwdyA9IGdldHB3bmFtICh1c2VyKTsKKyAgaWYgKCFwdykKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fU0VUVVBfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgZmluZCB1c2VyICclcydcbiIsIHVzZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBpbml0aWFsaXplIHRoZSBncm91cCBhY2Nlc3MgbGlzdCAqLworICBpZiAoaW5pdGdyb3VwcyAodXNlciwgcHctPnB3X2dpZCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX1NFVFVQX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGluaXRpYWxpemUgZ3JvdXBzIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIGNoYW5nZSB0byB0aGUgcHJpbWFyeSBncm91cCBmb3IgdGhlIHVzZXIgKi8KKyAgaWYgKHNldGdpZCAocHctPnB3X2dpZCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX1NFVFVQX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHNldGdpZCBncm91cCAlaSIsIHB3LT5wd19naWQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBjaGFuZ2UgdG8gdGhlIHVzZXIgc3BlY2lmaWVkICovCisgIGlmIChzZXR1aWQgKHB3LT5wd191aWQpIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fU0VUVVBfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc2V0dWlkIHVzZXIgJWkiLCBwdy0+cHdfdWlkKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisjZW5kaWYKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZXhlY19mb3JfY29ycmVjdF91c2VyIChjaGFyICpleGVjLCBjaGFyICp1c2VyLCBEQnVzRXJyb3IgKmVycm9yKQoreworICBjaGFyICoqYXJndjsKKyAgaW50IGFyZ2M7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBhcmdjID0gMDsKKyAgcmV0dmFsID0gVFJVRTsKKyAgYXJndiA9IE5VTEw7CisKKyAgaWYgKCFzd2l0Y2hfdXNlciAodXNlciwgZXJyb3IpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBjb252ZXJ0IGNvbW1hbmQgaW50byBhcmd1bWVudHMgKi8KKyAgaWYgKCFfZGJ1c19zaGVsbF9wYXJzZV9hcmd2IChleGVjLCAmYXJnYywgJmFyZ3YsIGVycm9yKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyNpZm5kZWYgQUNUSVZBVElPTl9MQVVOQ0hFUl9ET19PT00KKyAgLyogcmVwbGFjZSB3aXRoIG5ldyBiaW5hcnksIHdpdGggbm8gZW52aXJvbm1lbnQgKi8KKyAgaWYgKGV4ZWN2IChhcmd2WzBdLCBhcmd2KSA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0VYRUNfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZXhlYzogJXMiLCBhcmd2WzBdKTsKKyAgICAgIHJldHZhbCA9IEZBTFNFOworICAgIH0KKyNlbmRpZgorCisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGFyZ3YpOworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2J1c19uYW1lIChjb25zdCBjaGFyICpidXNfbmFtZSwKKyAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBzdHI7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIGJ1c19uYW1lKTsKKyAgaWYgKCFfZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAoJnN0ciwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fU0VSVklDRV9OT1RfRk9VTkQsCisgICAgICAgICAgICAgICAgICAgICAgImJ1cyBuYW1lICclcycgaXMgbm90IGEgdmFsaWQgYnVzIG5hbWVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgYnVzX25hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2dldF9jb3JyZWN0X3BhcnNlciAoQnVzQ29uZmlnUGFyc2VyICoqcGFyc2VyLCBEQnVzRXJyb3IgKmVycm9yKQoreworICBEQnVzU3RyaW5nIGNvbmZpZ19maWxlOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisjaWZkZWYgQUNUSVZBVElPTl9MQVVOQ0hFUl9URVNUCisgIGNvbnN0IGNoYXIgKnRlc3RfY29uZmlnX2ZpbGU7CisjZW5kaWYKKworICByZXR2YWwgPSBGQUxTRTsKKworI2lmZGVmIEFDVElWQVRJT05fTEFVTkNIRVJfVEVTVAorICB0ZXN0X2NvbmZpZ19maWxlID0gTlVMTDsKKworICAvKiB0aGVyZSBpcyBubyBfd2F5XyB3ZSBzaG91bGQgYmUgc2V0dWlkIGlmIHRoaXMgZGVmaW5lIGlzIHNldC4KKyAgICogYnV0IHdlIHNob3VsZCBiZSBkb3VibHkgcGFyYW5vaWQgYW5kIGNoZWNrLi4uICovCisgIGlmIChnZXR1aWQoKSAhPSBnZXRldWlkKCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlci10ZXN0IGJpbmFyeSBpcyBzZXR1aWQhIik7CisKKyAgLyogdGhpcyBpcyBub3QgYSBzZWN1cml0eSBob2xlLiBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgb25seSBwYXNzZWQgaW4gdGhlCisgICAqIGRidXMtZGFlbW9uLWxhdWNoLWhlbHBlci10ZXN0IE5PTi1TRVRVSUQgbGF1bmNoZXIgKi8KKyAgdGVzdF9jb25maWdfZmlsZSA9IF9kYnVzX2dldGVudiAoIlRFU1RfTEFVTkNIX0hFTFBFUl9DT05GSUciKTsKKyAgaWYgKHRlc3RfY29uZmlnX2ZpbGUgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fU0VUVVBfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJ0aGUgVEVTVF9MQVVOQ0hfSEVMUEVSX0NPTkZJRyBlbnYgdmFyaWFibGUgaXMgbm90IHNldCIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorI2VuZGlmCisKKyAgLyogd2UgX29ubHlfIHVzZSB0aGUgcHJlZGVmaW5lZCBzeXN0ZW0gY29uZmlnIGZpbGUgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNvbmZpZ19maWxlKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorI2lmbmRlZiBBQ1RJVkFUSU9OX0xBVU5DSEVSX1RFU1QKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmY29uZmlnX2ZpbGUsIERCVVNfU1lTVEVNX0NPTkZJR19GSUxFKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXRfZnJlZV9jb25maWc7CisgICAgfQorI2Vsc2UKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmY29uZmlnX2ZpbGUsIHRlc3RfY29uZmlnX2ZpbGUpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dF9mcmVlX2NvbmZpZzsKKyAgICB9CisjZW5kaWYKKworICAvKiB3aGVyZSBhcmUgd2UgcG9pbnRpbmcuLi4uICovCisgIF9kYnVzX3ZlcmJvc2UgKCJkYnVzLWRhZW1vbi1hY3RpdmF0aW9uLWhlbHBlcjogdXNpbmcgY29uZmlnIGZpbGU6ICVzXG4iLAorICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZjb25maWdfZmlsZSkpOworCisgIC8qIGdldCB0aGUgZGJ1cyB1c2VyICovCisgICpwYXJzZXIgPSBidXNfY29uZmlnX2xvYWQgKCZjb25maWdfZmlsZSwgVFJVRSwgTlVMTCwgZXJyb3IpOworICBpZiAoKnBhcnNlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGdvdG8gb3V0X2ZyZWVfY29uZmlnOworICAgIH0KKworICAvKiB3b290ICovCisgIHJldHZhbCA9IFRSVUU7CisKK291dF9mcmVlX2NvbmZpZzoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb25maWdfZmlsZSk7CitvdXQ6CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbGF1bmNoX2J1c19uYW1lIChjb25zdCBjaGFyICpidXNfbmFtZSwgQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIsIERCdXNFcnJvciAqZXJyb3IpCit7CisgIEJ1c0Rlc2t0b3BGaWxlICpkZXNrdG9wX2ZpbGU7CisgIGNoYXIgKmV4ZWMsICp1c2VyOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgZXhlYyA9IE5VTEw7CisgIHVzZXIgPSBOVUxMOworICByZXR2YWwgPSBGQUxTRTsKKworICAvKiBnZXQgdGhlIGNvcnJlY3Qgc2VydmljZSBmaWxlIGZvciB0aGUgbmFtZSB3ZSBhcmUgdHJ5aW5nIHRvIGFjdGl2YXRlICovCisgIGRlc2t0b3BfZmlsZSA9IGRlc2t0b3BfZmlsZV9mb3JfbmFtZSAocGFyc2VyLCBidXNfbmFtZSwgZXJyb3IpOworICBpZiAoZGVza3RvcF9maWxlID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIGdldCBleGVjIGFuZCB1c2VyIGZvciBzZXJ2aWNlIG5hbWUgKi8KKyAgaWYgKCFnZXRfcGFyYW1ldGVyc19mb3Jfc2VydmljZSAoZGVza3RvcF9maWxlLCBidXNfbmFtZSwgJmV4ZWMsICZ1c2VyLCBlcnJvcikpCisgICAgZ290byBmaW5pc2g7CisKKyAgX2RidXNfdmVyYm9zZSAoImRidXMtZGFlbW9uLWFjdGl2YXRpb24taGVscGVyOiBOYW1lPSclcydcbiIsIGJ1c19uYW1lKTsKKyAgX2RidXNfdmVyYm9zZSAoImRidXMtZGFlbW9uLWFjdGl2YXRpb24taGVscGVyOiBFeGVjPSclcydcbiIsIGV4ZWMpOworICBfZGJ1c192ZXJib3NlICgiZGJ1cy1kYWVtb24tYWN0aXZhdGlvbi1oZWxwZXI6IFVzZXI9JyVzJ1xuIiwgdXNlcik7CisKKyAgLyogYWN0dWFsbHkgZXhlY3V0ZSAqLworICBpZiAoIWV4ZWNfZm9yX2NvcnJlY3RfdXNlciAoZXhlYywgdXNlciwgZXJyb3IpKQorICAgIGdvdG8gZmluaXNoOworCisgIHJldHZhbCA9IFRSVUU7CisKK2ZpbmlzaDoKKyAgZGJ1c19mcmVlIChleGVjKTsKKyAgZGJ1c19mcmVlICh1c2VyKTsKKyAgYnVzX2Rlc2t0b3BfZmlsZV9mcmVlIChkZXNrdG9wX2ZpbGUpOworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2RidXNfdXNlciAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIsIERCdXNFcnJvciAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmRidXNfdXNlcjsKKworICBkYnVzX3VzZXIgPSBidXNfY29uZmlnX3BhcnNlcl9nZXRfdXNlciAocGFyc2VyKTsKKyAgaWYgKGRidXNfdXNlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9DT05GSUdfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGdldCB1c2VyIGZyb20gY29uZmlnIGZpbGVcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBjaGVjayB0byBzZWUgaWYgcGVybWlzc2lvbnMgYXJlIGNvcnJlY3QgKi8KKyAgaWYgKCFjaGVja19wZXJtaXNzaW9ucyAoZGJ1c191c2VyLCBlcnJvcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorcnVuX2xhdW5jaF9oZWxwZXIgKGNvbnN0IGNoYXIgKmJ1c19uYW1lLAorICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworICBCdXNDb25maWdQYXJzZXIgKnBhcnNlcjsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIHBhcnNlciA9IE5VTEw7CisgIHJldHZhbCA9IEZBTFNFOworCisgIC8qIGNsZWFyIHRoZSBlbnZpcm9ubWVudCwgYXBhcnQgZnJvbSBhIGZldyBzZWxlY3Qgc2V0dGluZ3MgKi8KKyAgaWYgKCFjbGVhcl9lbnZpcm9ubWVudCAoZXJyb3IpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgLyogY2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSB2YWxpZCBidXMgbmFtZSAqLworICBpZiAoIWNoZWNrX2J1c19uYW1lIChidXNfbmFtZSwgZXJyb3IpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgLyogZ2V0IHRoZSBjb3JyZWN0IHBhcnNlciwgZWl0aGVyIHRoZSB0ZXN0IG9yIGRlZmF1bHQgcGFyc2VyICovCisgIGlmICghZ2V0X2NvcnJlY3RfcGFyc2VyICgmcGFyc2VyLCBlcnJvcikpCisgICAgZ290byBlcnJvcjsKKworICAvKiBjaGVjayB3ZSBhcmUgYmVpbmcgaW52b2tlZCBieSB0aGUgY29ycmVjdCBkYnVzIHVzZXIgKi8KKyAgaWYgKCFjaGVja19kYnVzX3VzZXIgKHBhcnNlciwgZXJyb3IpKQorICAgIGdvdG8gZXJyb3JfZnJlZV9wYXJzZXI7CisKKyAgLyogbGF1bmNoIHRoZSBidXMgd2l0aCB0aGUgc2VydmljZSBkZWZpbmVkIHVzZXIgKi8KKyAgaWYgKCFsYXVuY2hfYnVzX25hbWUgKGJ1c19uYW1lLCBwYXJzZXIsIGVycm9yKSkKKyAgICBnb3RvIGVycm9yX2ZyZWVfcGFyc2VyOworCisgIC8qIHdvb2hvbyEgKi8KKyAgcmV0dmFsID0gVFJVRTsKKworZXJyb3JfZnJlZV9wYXJzZXI6CisgIGJ1c19jb25maWdfcGFyc2VyX3VucmVmIChwYXJzZXIpOworZXJyb3I6CisgIHJldHVybiByZXR2YWw7Cit9CisKZGlmZiAtLWdpdCBhL2RidXMvYnVzL2FjdGl2YXRpb24taGVscGVyLmggYi9kYnVzL2J1cy9hY3RpdmF0aW9uLWhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MWE0YzYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2J1cy9hY3RpdmF0aW9uLWhlbHBlci5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogYWN0aXZhdGlvbi1oZWxwZXIuaCAgVGhlIGFjdHVhbCBhY3RpdmF0aW9uIGhlbHBlciBzcGxpdCBmcm9tIHRoZSBtYWluCisgKiAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmb3IgdGVzdGluZy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIEJVU19BQ1RJVkFUSU9OX0hFTFBFUl9ICisjZGVmaW5lIEJVU19BQ1RJVkFUSU9OX0hFTFBFUl9ICisKK2RidXNfYm9vbF90IHJ1bl9sYXVuY2hfaGVscGVyIChjb25zdCBjaGFyICpidXNfbmFtZSwgREJ1c0Vycm9yICplcnJvcik7CisKKworI2VuZGlmIC8qIEJVU19BQ1RJVkFUSU9OX0hFTFBFUl9IICovCmRpZmYgLS1naXQgYS9kYnVzL2J1cy9hY3RpdmF0aW9uLmMgYi9kYnVzL2J1cy9hY3RpdmF0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RmYmE3OAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvYnVzL2FjdGl2YXRpb24uYwpAQCAtMCwwICsxLDI1NzMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogYWN0aXZhdGlvbi5jICBBY3RpdmF0aW9uIG9mIHNlcnZpY2VzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICogQ29weXJpZ2h0IChDKSAyMDAzICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgIEltZW5kaW8gSEIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJhY3RpdmF0aW9uLmgiCisjaW5jbHVkZSAiYWN0aXZhdGlvbi1leGl0LWNvZGVzLmgiCisjaW5jbHVkZSAiZGVza3RvcC1maWxlLmgiCisjaW5jbHVkZSAiZGlzcGF0Y2guaCIKKyNpbmNsdWRlICJzZXJ2aWNlcy5oIgorI2luY2x1ZGUgInRlc3QuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtaGFzaC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXNoZWxsLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXNwYXduLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXRpbWVvdXQuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorI2lmZGVmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKworc3RydWN0IEJ1c0FjdGl2YXRpb24KK3sKKyAgaW50IHJlZmNvdW50OworICBEQnVzSGFzaFRhYmxlICplbnRyaWVzOworICBEQnVzSGFzaFRhYmxlICpwZW5kaW5nX2FjdGl2YXRpb25zOworICBjaGFyICpzZXJ2ZXJfYWRkcmVzczsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgaW50IG5fcGVuZGluZ19hY3RpdmF0aW9uczsgLyoqPCBUaGlzIGlzIGluIGZhY3QgdGhlIG51bWJlciBvZiBCdXNQZW5kaW5nQWN0aXZhdGlvbkVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpLmUuIG51bWJlciBvZiBwZW5kaW5nIGFjdGl2YXRpb24gcmVxdWVzdHMsIG5vdCBwZW5kaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFjdGl2YXRpb25zIHBlciBzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgREJ1c0hhc2hUYWJsZSAqZGlyZWN0b3JpZXM7CisgIERCdXNIYXNoVGFibGUgKmVudmlyb25tZW50OworfTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgaW50IHJlZmNvdW50OworICBjaGFyICpkaXJfYzsKKyAgREJ1c0hhc2hUYWJsZSAqZW50cmllczsKK30gQnVzU2VydmljZURpcmVjdG9yeTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgaW50IHJlZmNvdW50OworICBjaGFyICpuYW1lOworICBjaGFyICpleGVjOworICBjaGFyICp1c2VyOworICBjaGFyICpzeXN0ZW1kX3NlcnZpY2U7CisgIHVuc2lnbmVkIGxvbmcgbXRpbWU7CisgIEJ1c1NlcnZpY2VEaXJlY3RvcnkgKnNfZGlyOworICBjaGFyICpmaWxlbmFtZTsKK30gQnVzQWN0aXZhdGlvbkVudHJ5OworCit0eXBlZGVmIHN0cnVjdCBCdXNQZW5kaW5nQWN0aXZhdGlvbkVudHJ5IEJ1c1BlbmRpbmdBY3RpdmF0aW9uRW50cnk7CisKK3N0cnVjdCBCdXNQZW5kaW5nQWN0aXZhdGlvbkVudHJ5Cit7CisgIERCdXNNZXNzYWdlICphY3RpdmF0aW9uX21lc3NhZ2U7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworCisgIGRidXNfYm9vbF90IGF1dG9fYWN0aXZhdGlvbjsKK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGludCByZWZjb3VudDsKKyAgQnVzQWN0aXZhdGlvbiAqYWN0aXZhdGlvbjsKKyAgY2hhciAqc2VydmljZV9uYW1lOworICBjaGFyICpleGVjOworICBjaGFyICpzeXN0ZW1kX3NlcnZpY2U7CisgIERCdXNMaXN0ICplbnRyaWVzOworICBpbnQgbl9lbnRyaWVzOworICBEQnVzQmFieXNpdHRlciAqYmFieXNpdHRlcjsKKyAgREJ1c1RpbWVvdXQgKnRpbWVvdXQ7CisgIHVuc2lnbmVkIGludCB0aW1lb3V0X2FkZGVkIDogMTsKK30gQnVzUGVuZGluZ0FjdGl2YXRpb247CisKKyNpZiAwCitzdGF0aWMgQnVzU2VydmljZURpcmVjdG9yeSAqCitidXNfc2VydmljZV9kaXJlY3RvcnlfcmVmIChCdXNTZXJ2aWNlRGlyZWN0b3J5ICpkaXIpCit7CisgIF9kYnVzX2Fzc2VydCAoZGlyLT5yZWZjb3VudCk7CisKKyAgZGlyLT5yZWZjb3VudCsrOworCisgIHJldHVybiBkaXI7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK2J1c19zZXJ2aWNlX2RpcmVjdG9yeV91bnJlZiAoQnVzU2VydmljZURpcmVjdG9yeSAqZGlyKQoreworICBpZiAoZGlyID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIF9kYnVzX2Fzc2VydCAoZGlyLT5yZWZjb3VudCA+IDApOworICBkaXItPnJlZmNvdW50LS07CisKKyAgaWYgKGRpci0+cmVmY291bnQgPiAwKQorICAgIHJldHVybjsKKworICBpZiAoZGlyLT5lbnRyaWVzKQorICAgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKGRpci0+ZW50cmllcyk7CisKKyAgZGJ1c19mcmVlIChkaXItPmRpcl9jKTsKKyAgZGJ1c19mcmVlIChkaXIpOworfQorCitzdGF0aWMgdm9pZAorYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeV9mcmVlIChCdXNQZW5kaW5nQWN0aXZhdGlvbkVudHJ5ICplbnRyeSkKK3sKKyAgaWYgKGVudHJ5LT5hY3RpdmF0aW9uX21lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChlbnRyeS0+YWN0aXZhdGlvbl9tZXNzYWdlKTsKKworICBpZiAoZW50cnktPmNvbm5lY3Rpb24pCisgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChlbnRyeS0+Y29ubmVjdGlvbik7CisKKyAgZGJ1c19mcmVlIChlbnRyeSk7Cit9CisKK3N0YXRpYyBCdXNQZW5kaW5nQWN0aXZhdGlvbiAqCitidXNfcGVuZGluZ19hY3RpdmF0aW9uX3JlZiAoQnVzUGVuZGluZ0FjdGl2YXRpb24gKnBlbmRpbmdfYWN0aXZhdGlvbikKK3sKKyAgX2RidXNfYXNzZXJ0IChwZW5kaW5nX2FjdGl2YXRpb24tPnJlZmNvdW50ID4gMCk7CisgIHBlbmRpbmdfYWN0aXZhdGlvbi0+cmVmY291bnQgKz0gMTsKKworICByZXR1cm4gcGVuZGluZ19hY3RpdmF0aW9uOworfQorCitzdGF0aWMgdm9pZAorYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl91bnJlZiAoQnVzUGVuZGluZ0FjdGl2YXRpb24gKnBlbmRpbmdfYWN0aXZhdGlvbikKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgaWYgKHBlbmRpbmdfYWN0aXZhdGlvbiA9PSBOVUxMKSAvKiBoYXNoIHRhYmxlIHJlcXVpcmVzIHRoaXMgKi8KKyAgICByZXR1cm47CisKKyAgX2RidXNfYXNzZXJ0IChwZW5kaW5nX2FjdGl2YXRpb24tPnJlZmNvdW50ID4gMCk7CisgIHBlbmRpbmdfYWN0aXZhdGlvbi0+cmVmY291bnQgLT0gMTsKKworICBpZiAocGVuZGluZ19hY3RpdmF0aW9uLT5yZWZjb3VudCA+IDApCisgICAgcmV0dXJuOworCisgIGlmIChwZW5kaW5nX2FjdGl2YXRpb24tPnRpbWVvdXRfYWRkZWQpCisgICAgeworICAgICAgX2RidXNfbG9vcF9yZW1vdmVfdGltZW91dCAoYnVzX2NvbnRleHRfZ2V0X2xvb3AgKHBlbmRpbmdfYWN0aXZhdGlvbi0+YWN0aXZhdGlvbi0+Y29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPnRpbWVvdXQpOworICAgICAgcGVuZGluZ19hY3RpdmF0aW9uLT50aW1lb3V0X2FkZGVkID0gRkFMU0U7CisgICAgfQorCisgIGlmIChwZW5kaW5nX2FjdGl2YXRpb24tPnRpbWVvdXQpCisgICAgX2RidXNfdGltZW91dF91bnJlZiAocGVuZGluZ19hY3RpdmF0aW9uLT50aW1lb3V0KTsKKworICBpZiAocGVuZGluZ19hY3RpdmF0aW9uLT5iYWJ5c2l0dGVyKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfYmFieXNpdHRlcl9zZXRfd2F0Y2hfZnVuY3Rpb25zIChwZW5kaW5nX2FjdGl2YXRpb24tPmJhYnlzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPmJhYnlzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNldHRpbmcgd2F0Y2ggZnVuY3Rpb25zIHRvIE5VTEwgZmFpbGVkIik7CisKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKHBlbmRpbmdfYWN0aXZhdGlvbi0+YmFieXNpdHRlcik7CisgICAgfQorCisgIGRidXNfZnJlZSAocGVuZGluZ19hY3RpdmF0aW9uLT5zZXJ2aWNlX25hbWUpOworICBkYnVzX2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbi0+ZXhlYyk7CisgIGRidXNfZnJlZSAocGVuZGluZ19hY3RpdmF0aW9uLT5zeXN0ZW1kX3NlcnZpY2UpOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmcGVuZGluZ19hY3RpdmF0aW9uLT5lbnRyaWVzKTsKKworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uRW50cnkgKmVudHJ5ID0gbGluay0+ZGF0YTsKKworICAgICAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeV9mcmVlIChlbnRyeSk7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZwZW5kaW5nX2FjdGl2YXRpb24tPmVudHJpZXMsIGxpbmspOworICAgIH0KKyAgX2RidXNfbGlzdF9jbGVhciAoJnBlbmRpbmdfYWN0aXZhdGlvbi0+ZW50cmllcyk7CisKKyAgcGVuZGluZ19hY3RpdmF0aW9uLT5hY3RpdmF0aW9uLT5uX3BlbmRpbmdfYWN0aXZhdGlvbnMgLT0KKyAgICBwZW5kaW5nX2FjdGl2YXRpb24tPm5fZW50cmllczsKKworICBfZGJ1c19hc3NlcnQgKHBlbmRpbmdfYWN0aXZhdGlvbi0+YWN0aXZhdGlvbi0+bl9wZW5kaW5nX2FjdGl2YXRpb25zID49IDApOworCisgIGRidXNfZnJlZSAocGVuZGluZ19hY3RpdmF0aW9uKTsKK30KKworc3RhdGljIEJ1c0FjdGl2YXRpb25FbnRyeSAqCitidXNfYWN0aXZhdGlvbl9lbnRyeV9yZWYgKEJ1c0FjdGl2YXRpb25FbnRyeSAqZW50cnkpCit7CisgIF9kYnVzX2Fzc2VydCAoZW50cnktPnJlZmNvdW50ID4gMCk7CisgIGVudHJ5LT5yZWZjb3VudCsrOworCisgIHJldHVybiBlbnRyeTsKK30KKworc3RhdGljIHZvaWQKK2J1c19hY3RpdmF0aW9uX2VudHJ5X3VucmVmIChCdXNBY3RpdmF0aW9uRW50cnkgKmVudHJ5KQoreworICBpZiAoZW50cnkgPT0gTlVMTCkgLyogaGFzaCB0YWJsZSByZXF1aXJlcyB0aGlzICovCisgICAgcmV0dXJuOworCisgIF9kYnVzX2Fzc2VydCAoZW50cnktPnJlZmNvdW50ID4gMCk7CisgIGVudHJ5LT5yZWZjb3VudC0tOworCisgIGlmIChlbnRyeS0+cmVmY291bnQgPiAwKQorICAgIHJldHVybjsKKworICBkYnVzX2ZyZWUgKGVudHJ5LT5uYW1lKTsKKyAgZGJ1c19mcmVlIChlbnRyeS0+ZXhlYyk7CisgIGRidXNfZnJlZSAoZW50cnktPnVzZXIpOworICBkYnVzX2ZyZWUgKGVudHJ5LT5maWxlbmFtZSk7CisgIGRidXNfZnJlZSAoZW50cnktPnN5c3RlbWRfc2VydmljZSk7CisKKyAgZGJ1c19mcmVlIChlbnRyeSk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAordXBkYXRlX2Rlc2t0b3BfZmlsZV9lbnRyeSAoQnVzQWN0aXZhdGlvbiAgICAgICAqYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1NlcnZpY2VEaXJlY3RvcnkgKnNfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNEZXNrdG9wRmlsZSAgICAgICpkZXNrdG9wX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICplcnJvcikKK3sKKyAgY2hhciAqbmFtZSwgKmV4ZWMsICp1c2VyLCAqZXhlY190bXAsICpzeXN0ZW1kX3NlcnZpY2U7CisgIEJ1c0FjdGl2YXRpb25FbnRyeSAqZW50cnk7CisgIERCdXNTdGF0IHN0YXRfYnVmOworICBEQnVzU3RyaW5nIGZpbGVfcGF0aDsKKyAgREJ1c0Vycm9yIHRtcF9lcnJvcjsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHJldHZhbCA9IEZBTFNFOworICBuYW1lID0gTlVMTDsKKyAgZXhlYyA9IE5VTEw7CisgIHVzZXIgPSBOVUxMOworICBleGVjX3RtcCA9IE5VTEw7CisgIGVudHJ5ID0gTlVMTDsKKyAgc3lzdGVtZF9zZXJ2aWNlID0gTlVMTDsKKworICBkYnVzX2Vycm9yX2luaXQgKCZ0bXBfZXJyb3IpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmaWxlX3BhdGgpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmZpbGVfcGF0aCwgc19kaXItPmRpcl9jKSB8fAorICAgICAgIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZmaWxlX3BhdGgsIGZpbGVuYW1lKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmICghX2RidXNfc3RhdCAoJmZpbGVfcGF0aCwgJnN0YXRfYnVmLCBOVUxMKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBzdGF0IHRoZSBzZXJ2aWNlIGZpbGVcbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmICghYnVzX2Rlc2t0b3BfZmlsZV9nZXRfc3RyaW5nIChkZXNrdG9wX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NFUlZJQ0VfU0VDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFidXNfZGVza3RvcF9maWxlX2dldF9zdHJpbmcgKGRlc2t0b3BfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU0VSVklDRV9TRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX0VYRUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXhlY190bXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgZ290byBvdXQ7CisKKyAgZXhlYyA9IF9kYnVzX3N0cmR1cCAoX2RidXNfcmVwbGFjZV9pbnN0YWxsX3ByZWZpeCAoZXhlY190bXApKTsKKyAgZGJ1c19mcmVlIChleGVjX3RtcCk7CisgIGV4ZWNfdG1wID0gTlVMTDsKKworICAvKiB1c2VyIGlzIG5vdCBfcmVxdWlyZWRfIHVubGVzcyB3ZSBhcmUgdXNpbmcgc3lzdGVtIGFjdGl2YXRpb24gKi8KKyAgaWYgKCFidXNfZGVza3RvcF9maWxlX2dldF9zdHJpbmcgKGRlc2t0b3BfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU0VSVklDRV9TRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX1VTRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlciwgJnRtcF9lcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJnRtcF9lcnJvcik7CisgICAgICAvKiBpZiB3ZSBnb3QgT09NLCB0aGVuIGV4aXQgKi8KKyAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmdG1wX2Vycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX21vdmVfZXJyb3IgKCZ0bXBfZXJyb3IsIGVycm9yKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogaWYgd2UgaGF2ZSBlcnJvciBiZWNhdXNlIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nIHRoZW4gY29udGludWUgKi8KKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZ0bXBfZXJyb3IpOworICAgICAgICAgIGRidXNfZnJlZSAodXNlcik7CisgICAgICAgICAgdXNlciA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoJnRtcF9lcnJvcik7CisKKyAgLyogc3lzdGVtZCBzZXJ2aWNlIGlzIG5ldmVyIHJlcXVpcmVkICovCisgIGlmICghYnVzX2Rlc2t0b3BfZmlsZV9nZXRfc3RyaW5nIChkZXNrdG9wX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NFUlZJQ0VfU0VDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU0VSVklDRV9TWVNURU1EX1NFUlZJQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3lzdGVtZF9zZXJ2aWNlLCAmdG1wX2Vycm9yKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmdG1wX2Vycm9yKTsKKyAgICAgIC8qIGlmIHdlIGdvdCBPT00sIHRoZW4gZXhpdCAqLworICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZ0bXBfZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfbW92ZV9lcnJvciAoJnRtcF9lcnJvciwgZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBpZiB3ZSBoYXZlIGVycm9yIGJlY2F1c2Ugd2UgZGlkbid0IGZpbmQgYW55dGhpbmcgdGhlbiBjb250aW51ZSAqLworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJnRtcF9lcnJvcik7CisgICAgICAgICAgZGJ1c19mcmVlIChzeXN0ZW1kX3NlcnZpY2UpOworICAgICAgICAgIHN5c3RlbWRfc2VydmljZSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSICgmdG1wX2Vycm9yKTsKKworICBlbnRyeSA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3N0cmluZyAoc19kaXItPmVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKSk7CisKKyAgaWYgKGVudHJ5ID09IE5VTEwpIC8qIE5ldyBmaWxlICovCisgICAgeworICAgICAgLyogRklYTUUgd2UgbmVlZCBhIGJldHRlci1kZWZpbmVkIGFsZ29yaXRobSBmb3Igd2hpY2ggc2VydmljZSBmaWxlIHRvCisgICAgICAgKiBwaWNrIHRoYW4gIndoaWNoZXZlciBvbmUgaXMgZmlyc3QgaW4gdGhlIGRpcmVjdG9yeSBsaXN0aW5nIgorICAgICAgICovCisgICAgICBpZiAoX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChhY3RpdmF0aW9uLT5lbnRyaWVzLCBuYW1lKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXJ2aWNlICVzIGFscmVhZHkgZXhpc3RzIGluIGFjdGl2YXRpb24gZW50cnkgbGlzdFxuIiwgbmFtZSk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgZW50cnkgPSBkYnVzX25ldzAgKEJ1c0FjdGl2YXRpb25FbnRyeSwgMSk7CisgICAgICBpZiAoZW50cnkgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgZW50cnktPm5hbWUgPSBuYW1lOworICAgICAgZW50cnktPmV4ZWMgPSBleGVjOworICAgICAgZW50cnktPnVzZXIgPSB1c2VyOworICAgICAgZW50cnktPnN5c3RlbWRfc2VydmljZSA9IHN5c3RlbWRfc2VydmljZTsKKyAgICAgIGVudHJ5LT5yZWZjb3VudCA9IDE7CisKKyAgICAgIC8qIG93bmVyc2hpcCBoYXMgYmVlbiB0cmFuc2ZlcnJlZCB0byBlbnRyeSwgZG8gbm90IGZyZWUgc2VwYXJhdGVseSAqLworICAgICAgbmFtZSA9IE5VTEw7CisgICAgICBleGVjID0gTlVMTDsKKyAgICAgIHVzZXIgPSBOVUxMOworICAgICAgc3lzdGVtZF9zZXJ2aWNlID0gTlVMTDsKKworICAgICAgZW50cnktPnNfZGlyID0gc19kaXI7CisgICAgICBlbnRyeS0+ZmlsZW5hbWUgPSBfZGJ1c19zdHJkdXAgKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpKTsKKyAgICAgIGlmICghZW50cnktPmZpbGVuYW1lKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZyAoYWN0aXZhdGlvbi0+ZW50cmllcywgZW50cnktPm5hbWUsIGJ1c19hY3RpdmF0aW9uX2VudHJ5X3JlZiAoZW50cnkpKSkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKHNfZGlyLT5lbnRyaWVzLCBlbnRyeS0+ZmlsZW5hbWUsIGJ1c19hY3RpdmF0aW9uX2VudHJ5X3JlZiAoZW50cnkpKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFJldmVydCB0aGUgaW5zZXJ0aW9uIGluIHRoZSBlbnRyaWVzIHRhYmxlICovCisgICAgICAgICAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfc3RyaW5nIChhY3RpdmF0aW9uLT5lbnRyaWVzLCBlbnRyeS0+bmFtZSk7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c192ZXJib3NlICgiQWRkZWQgXCIlc1wiIHRvIGxpc3Qgb2Ygc2VydmljZXNcbiIsIGVudHJ5LT5uYW1lKTsKKyAgICB9CisgIGVsc2UgLyogSnVzdCB1cGRhdGUgdGhlIGVudHJ5ICovCisgICAgeworICAgICAgYnVzX2FjdGl2YXRpb25fZW50cnlfcmVmIChlbnRyeSk7CisgICAgICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcgKGFjdGl2YXRpb24tPmVudHJpZXMsIGVudHJ5LT5uYW1lKTsKKworICAgICAgaWYgKF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3N0cmluZyAoYWN0aXZhdGlvbi0+ZW50cmllcywgbmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiVGhlIG5ldyBzZXJ2aWNlIG5hbWUgXCIlc1wiIG9mIHNlcnZpY2UgZmlsZSBcIiVzXCIgaXMgYWxyZWFkeSBpbiBjYWNoZSwgaWdub3JpbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZmlsZV9wYXRoKSk7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBuZXcgc2VydmljZSBuYW1lIFwiJXNcIiBvZiBzZXJ2aWNlIGZpbGUgXCIlc1wiIGlzIGFscmVhZHkgaW4gY2FjaGUsIGlnbm9yaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmaWxlX3BhdGgpKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICAvKiBvd25lcnNoaXAgaGFzIGJlZW4gdHJhbnNmZXJyZWQgdG8gZW50cnksIGRvIG5vdCBmcmVlIHNlcGFyYXRlbHkgKi8KKyAgICAgIGRidXNfZnJlZSAoZW50cnktPm5hbWUpOworICAgICAgZW50cnktPm5hbWUgPSBuYW1lOworICAgICAgbmFtZSA9IE5VTEw7CisKKyAgICAgIGRidXNfZnJlZSAoZW50cnktPmV4ZWMpOworICAgICAgZW50cnktPmV4ZWMgPSBleGVjOworICAgICAgZXhlYyA9IE5VTEw7CisKKyAgICAgIGRidXNfZnJlZSAoZW50cnktPnVzZXIpOworICAgICAgZW50cnktPnVzZXIgPSB1c2VyOworICAgICAgdXNlciA9IE5VTEw7CisKKyAgICAgIGRidXNfZnJlZSAoZW50cnktPnN5c3RlbWRfc2VydmljZSk7CisgICAgICBlbnRyeS0+c3lzdGVtZF9zZXJ2aWNlID0gc3lzdGVtZF9zZXJ2aWNlOworICAgICAgc3lzdGVtZF9zZXJ2aWNlID0gTlVMTDsKKworICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKGFjdGl2YXRpb24tPmVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPm5hbWUsIGJ1c19hY3RpdmF0aW9uX2VudHJ5X3JlZihlbnRyeSkpKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAvKiBBbHNvIHJlbW92ZSBwYXRoIHRvIGVudHJpZXMgaGFzaCBzaW5jZSB3ZSB3YW50IHRoaXMgaW4gc3luYyB3aXRoCisgICAgICAgICAgICogdGhlIGVudHJpZXMgaGFzaCB0YWJsZSAqLworICAgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3N0cmluZyAoZW50cnktPnNfZGlyLT5lbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPmZpbGVuYW1lKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICBlbnRyeS0+bXRpbWUgPSBzdGF0X2J1Zi5tdGltZTsKKyAgcmV0dmFsID0gVFJVRTsKKworb3V0OgorICAvKiBpZiB0aGVzZSBoYXZlIGJlZW4gdHJhbnNmZXJyZWQgaW50byBlbnRyeSwgdGhlIHZhcmlhYmxlcyB3aWxsIGJlIE5VTEwgKi8KKyAgZGJ1c19mcmVlIChuYW1lKTsKKyAgZGJ1c19mcmVlIChleGVjKTsKKyAgZGJ1c19mcmVlICh1c2VyKTsKKyAgZGJ1c19mcmVlIChzeXN0ZW1kX3NlcnZpY2UpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVfcGF0aCk7CisKKyAgaWYgKGVudHJ5KQorICAgIGJ1c19hY3RpdmF0aW9uX2VudHJ5X3VucmVmIChlbnRyeSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19zZXJ2aWNlX2ZpbGUgKEJ1c0FjdGl2YXRpb24gICAgICAgKmFjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgIEJ1c0FjdGl2YXRpb25FbnRyeSAgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICBCdXNBY3RpdmF0aW9uRW50cnkgKip1cGRhdGVkX2VudHJ5LAorICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICplcnJvcikKK3sKKyAgREJ1c1N0YXQgc3RhdF9idWY7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgQnVzQWN0aXZhdGlvbkVudHJ5ICp0bXBfZW50cnk7CisgIERCdXNTdHJpbmcgZmlsZV9wYXRoOworICBEQnVzU3RyaW5nIGZpbGVuYW1lOworCisgIHJldHZhbCA9IFRSVUU7CisgIHRtcF9lbnRyeSA9IGVudHJ5OworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZW5hbWUsIGVudHJ5LT5maWxlbmFtZSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZpbGVfcGF0aCkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZmlsZV9wYXRoLCBlbnRyeS0+c19kaXItPmRpcl9jKSB8fAorICAgICAgIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZmaWxlX3BhdGgsICZmaWxlbmFtZSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHZhbCA9IEZBTFNFOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmICghX2RidXNfc3RhdCAoJmZpbGVfcGF0aCwgJnN0YXRfYnVmLCBOVUxMKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiKioqKioqIENhbid0IHN0YXQgZmlsZSBcIiVzXCIsIHJlbW92aW5nIGZyb20gY2FjaGVcbiIsCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmaWxlX3BhdGgpKTsKKworICAgICAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfc3RyaW5nIChhY3RpdmF0aW9uLT5lbnRyaWVzLCBlbnRyeS0+bmFtZSk7CisgICAgICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcgKGVudHJ5LT5zX2Rpci0+ZW50cmllcywgZW50cnktPmZpbGVuYW1lKTsKKworICAgICAgdG1wX2VudHJ5ID0gTlVMTDsKKyAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoc3RhdF9idWYubXRpbWUgPiBlbnRyeS0+bXRpbWUpCisgICAgICAgIHsKKyAgICAgICAgICBCdXNEZXNrdG9wRmlsZSAqZGVza3RvcF9maWxlOworICAgICAgICAgIERCdXNFcnJvciB0bXBfZXJyb3I7CisKKyAgICAgICAgICBkYnVzX2Vycm9yX2luaXQgKCZ0bXBfZXJyb3IpOworCisgICAgICAgICAgZGVza3RvcF9maWxlID0gYnVzX2Rlc2t0b3BfZmlsZV9sb2FkICgmZmlsZV9wYXRoLCAmdG1wX2Vycm9yKTsKKyAgICAgICAgICBpZiAoZGVza3RvcF9maWxlID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDb3VsZCBub3QgbG9hZCAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVfcGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcF9lcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZ0bXBfZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBkYnVzX21vdmVfZXJyb3IgKCZ0bXBfZXJyb3IsIGVycm9yKTsKKyAgICAgICAgICAgICAgICAgIHJldHZhbCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZ0bXBfZXJyb3IpOworICAgICAgICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8qIEB0b2RvIFdlIGNhbiByZXR1cm4gT09NIG9yIGEgREJVU19FUlJPUl9GQUlMRUQgZXJyb3IKKyAgICAgICAgICAgKiAgICAgICBIYW5kbGUgdGhlc2UgYm90aCBiZXR0ZXIKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoIXVwZGF0ZV9kZXNrdG9wX2ZpbGVfZW50cnkgKGFjdGl2YXRpb24sIGVudHJ5LT5zX2RpciwgJmZpbGVuYW1lLCBkZXNrdG9wX2ZpbGUsICZ0bXBfZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBidXNfZGVza3RvcF9maWxlX2ZyZWUgKGRlc2t0b3BfZmlsZSk7CisgICAgICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmdG1wX2Vycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZGJ1c19tb3ZlX2Vycm9yICgmdG1wX2Vycm9yLCBlcnJvcik7CisgICAgICAgICAgICAgICAgICByZXR2YWwgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmdG1wX2Vycm9yKTsKKyAgICAgICAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBidXNfZGVza3RvcF9maWxlX2ZyZWUgKGRlc2t0b3BfZmlsZSk7CisgICAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKworb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVfcGF0aCk7CisKKyAgaWYgKHVwZGF0ZWRfZW50cnkgIT0gTlVMTCkKKyAgICAqdXBkYXRlZF9lbnRyeSA9IHRtcF9lbnRyeTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworCisvKiB3YXJuaW5nOiB0aGlzIGRvZXNuJ3QgZnVsbHkgInVuZG8iIGl0c2VsZiBvbiBmYWlsdXJlLCBpLmUuIGRvZXNuJ3Qgc3RyaXAKKyAqIGhhc2ggZW50cmllcyBpdCBhbHJlYWR5IGFkZGVkLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK3VwZGF0ZV9kaXJlY3RvcnkgKEJ1c0FjdGl2YXRpb24gICAgICAgKmFjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICBCdXNTZXJ2aWNlRGlyZWN0b3J5ICpzX2RpciwKKyAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgKmVycm9yKQoreworICBEQnVzRGlySXRlciAqaXRlcjsKKyAgREJ1c1N0cmluZyBkaXIsIGZpbGVuYW1lOworICBCdXNEZXNrdG9wRmlsZSAqZGVza3RvcF9maWxlOworICBEQnVzRXJyb3IgdG1wX2Vycm9yOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIEJ1c0FjdGl2YXRpb25FbnRyeSAqZW50cnk7CisgIERCdXNTdHJpbmcgZnVsbF9wYXRoOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGl0ZXIgPSBOVUxMOworICBkZXNrdG9wX2ZpbGUgPSBOVUxMOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZGlyLCBzX2Rpci0+ZGlyX2MpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmaWxlbmFtZSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfcGF0aCkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR2YWwgPSBGQUxTRTsKKworICAvKiBmcm9tIHRoaXMgcG9pbnQgaXQncyBzYWZlIHRvICJnb3RvIG91dCIgKi8KKworICBpdGVyID0gX2RidXNfZGlyZWN0b3J5X29wZW4gKCZkaXIsIGVycm9yKTsKKyAgaWYgKGl0ZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIG9wZW4gZGlyZWN0b3J5ICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHNfZGlyLT5kaXJfYywKKyAgICAgICAgICAgICAgICAgICAgIGVycm9yID8gZXJyb3ItPm1lc3NhZ2UgOiAidW5rbm93biIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIC8qIE5vdyByZWFkIHRoZSBmaWxlcyAqLworICBkYnVzX2Vycm9yX2luaXQgKCZ0bXBfZXJyb3IpOworICB3aGlsZSAoX2RidXNfZGlyZWN0b3J5X2dldF9uZXh0X2ZpbGUgKGl0ZXIsICZmaWxlbmFtZSwgJnRtcF9lcnJvcikpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0ICghZGJ1c19lcnJvcl9pc19zZXQgKCZ0bXBfZXJyb3IpKTsKKworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZmdWxsX3BhdGgsIDApOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19lbmRzX3dpdGhfY19zdHIgKCZmaWxlbmFtZSwgIi5zZXJ2aWNlIikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiU2tpcHBpbmcgbm9uLS5zZXJ2aWNlIGZpbGUgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZmlsZW5hbWUpKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICBlbnRyeSA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3N0cmluZyAoc19kaXItPmVudHJpZXMsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVuYW1lKSk7CisgICAgICBpZiAoZW50cnkpIC8qIEFscmVhZHkgaGFzIHRoaXMgc2VydmljZSBmaWxlIGluIHRoZSBjYWNoZSAqLworICAgICAgICB7CisgICAgICAgICAgaWYgKCFjaGVja19zZXJ2aWNlX2ZpbGUgKGFjdGl2YXRpb24sIGVudHJ5LCBOVUxMLCBlcnJvcikpCisgICAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmZ1bGxfcGF0aCwgc19kaXItPmRpcl9jKSB8fAorICAgICAgICAgICFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmZnVsbF9wYXRoLCAmZmlsZW5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICAvKiBOZXcgZmlsZSAqLworICAgICAgZGVza3RvcF9maWxlID0gYnVzX2Rlc2t0b3BfZmlsZV9sb2FkICgmZnVsbF9wYXRoLCAmdG1wX2Vycm9yKTsKKyAgICAgIGlmIChkZXNrdG9wX2ZpbGUgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDb3VsZCBub3QgbG9hZCAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZnVsbF9wYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0bXBfZXJyb3IubWVzc2FnZSk7CisKKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJnRtcF9lcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX21vdmVfZXJyb3IgKCZ0bXBfZXJyb3IsIGVycm9yKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZ0bXBfZXJyb3IpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIC8qIEB0b2RvIFdlIGNhbiByZXR1cm4gT09NIG9yIGEgREJVU19FUlJPUl9GQUlMRUQgZXJyb3IKKyAgICAgICAqICAgICAgIEhhbmRsZSB0aGVzZSBib3RoIGJldHRlcgorICAgICAgICovCisgICAgICBpZiAoIXVwZGF0ZV9kZXNrdG9wX2ZpbGVfZW50cnkgKGFjdGl2YXRpb24sIHNfZGlyLCAmZmlsZW5hbWUsIGRlc2t0b3BfZmlsZSwgJnRtcF9lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBidXNfZGVza3RvcF9maWxlX2ZyZWUgKGRlc2t0b3BfZmlsZSk7CisgICAgICAgICAgZGVza3RvcF9maWxlID0gTlVMTDsKKworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDb3VsZCBub3QgYWRkICVzIHRvIGFjdGl2YXRpb24gZW50cnkgbGlzdDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZnVsbF9wYXRoKSwgdG1wX2Vycm9yLm1lc3NhZ2UpOworCisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZ0bXBfZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19tb3ZlX2Vycm9yICgmdG1wX2Vycm9yLCBlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmdG1wX2Vycm9yKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgYnVzX2Rlc2t0b3BfZmlsZV9mcmVlIChkZXNrdG9wX2ZpbGUpOworICAgICAgICAgIGRlc2t0b3BfZmlsZSA9IE5VTEw7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmdG1wX2Vycm9yKSkKKyAgICB7CisgICAgICBkYnVzX21vdmVfZXJyb3IgKCZ0bXBfZXJyb3IsIGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAoIXJldHZhbCkKKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIGVsc2UKKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoaXRlciAhPSBOVUxMKQorICAgIF9kYnVzX2RpcmVjdG9yeV9jbG9zZSAoaXRlcik7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citwb3B1bGF0ZV9lbnZpcm9ubWVudCAoQnVzQWN0aXZhdGlvbiAqYWN0aXZhdGlvbikKK3sKKyAgREJ1c1N0cmluZyAgIGtleTsKKyAgREJ1c1N0cmluZyAgIHZhbHVlOworICBpbnQgICAgICAgICAgaTsKKyAgY2hhciAgICAgICAqKmVudmlyb25tZW50OworICBkYnVzX2Jvb2xfdCAgcmV0dmFsID0gRkFMU0U7CisKKyAgZW52aXJvbm1lbnQgPSBfZGJ1c19nZXRfZW52aXJvbm1lbnQgKCk7CisKKyAgaWYgKGVudmlyb25tZW50ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZrZXkpKQorICAgIHsKKyAgICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoZW52aXJvbm1lbnQpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ2YWx1ZSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZrZXkpOworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoZW52aXJvbm1lbnQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBmb3IgKGkgPSAwOyBlbnZpcm9ubWVudFtpXSAhPSBOVUxMOyBpKyspCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgma2V5LCBlbnZpcm9ubWVudFtpXSkpCisgICAgICAgIGJyZWFrOworCisgICAgICBpZiAoX2RidXNfc3RyaW5nX3NwbGl0X29uX2J5dGUgKCZrZXksICc9JywgJnZhbHVlKSkKKyAgICAgICAgeworICAgICAgICAgIGNoYXIgKmhhc2hfa2V5LCAqaGFzaF92YWx1ZTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgKCZrZXksICZoYXNoX2tleSkpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgKCZ2YWx1ZSwgJmhhc2hfdmFsdWUpKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZyAoYWN0aXZhdGlvbi0+ZW52aXJvbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfa2V5LCBoYXNoX3ZhbHVlKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmtleSwgMCk7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJnZhbHVlLCAwKTsKKyAgICB9CisKKyAgaWYgKGVudmlyb25tZW50W2ldICE9IE5VTEwpCisgICAgZ290byBvdXQ7CisKKyAgcmV0dmFsID0gVFJVRTsKK291dDoKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmtleSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmdmFsdWUpOworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChlbnZpcm9ubWVudCk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworZGJ1c19ib29sX3QKK2J1c19hY3RpdmF0aW9uX3JlbG9hZCAoQnVzQWN0aXZhdGlvbiAgICAgKmFjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAgICoqZGlyZWN0b3JpZXMsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgREJ1c0xpc3QgICAgICAqbGluazsKKyAgY2hhciAgICAgICAgICAqZGlyOworCisgIGlmIChhY3RpdmF0aW9uLT5zZXJ2ZXJfYWRkcmVzcyAhPSBOVUxMKQorICAgIGRidXNfZnJlZSAoYWN0aXZhdGlvbi0+c2VydmVyX2FkZHJlc3MpOworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2RhdGEgKGFkZHJlc3MsICZhY3RpdmF0aW9uLT5zZXJ2ZXJfYWRkcmVzcykpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBpZiAoYWN0aXZhdGlvbi0+ZW50cmllcyAhPSBOVUxMKQorICAgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKGFjdGl2YXRpb24tPmVudHJpZXMpOworICBhY3RpdmF0aW9uLT5lbnRyaWVzID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9TVFJJTkcsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0ZyZWVGdW5jdGlvbilidXNfYWN0aXZhdGlvbl9lbnRyeV91bnJlZik7CisgIGlmIChhY3RpdmF0aW9uLT5lbnRyaWVzID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBpZiAoYWN0aXZhdGlvbi0+ZGlyZWN0b3JpZXMgIT0gTlVMTCkKKyAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChhY3RpdmF0aW9uLT5kaXJlY3Rvcmllcyk7CisgIGFjdGl2YXRpb24tPmRpcmVjdG9yaWVzID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9TVFJJTkcsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzRnJlZUZ1bmN0aW9uKWJ1c19zZXJ2aWNlX2RpcmVjdG9yeV91bnJlZik7CisKKyAgaWYgKGFjdGl2YXRpb24tPmRpcmVjdG9yaWVzID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoZGlyZWN0b3JpZXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIEJ1c1NlcnZpY2VEaXJlY3RvcnkgKnNfZGlyOworCisgICAgICBkaXIgPSBfZGJ1c19zdHJkdXAgKChjb25zdCBjaGFyICopIGxpbmstPmRhdGEpOworICAgICAgaWYgKCFkaXIpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisKKyAgICAgIHNfZGlyID0gZGJ1c19uZXcwIChCdXNTZXJ2aWNlRGlyZWN0b3J5LCAxKTsKKyAgICAgIGlmICghc19kaXIpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2ZyZWUgKGRpcik7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisgICAgICBzX2Rpci0+cmVmY291bnQgPSAxOworICAgICAgc19kaXItPmRpcl9jID0gZGlyOworCisgICAgICBzX2Rpci0+ZW50cmllcyA9IF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfU1RSSU5HLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNGcmVlRnVuY3Rpb24pYnVzX2FjdGl2YXRpb25fZW50cnlfdW5yZWYpOworCisgICAgICBpZiAoIXNfZGlyLT5lbnRyaWVzKQorICAgICAgICB7CisgICAgICAgICAgYnVzX3NlcnZpY2VfZGlyZWN0b3J5X3VucmVmIChzX2Rpcik7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZyAoYWN0aXZhdGlvbi0+ZGlyZWN0b3JpZXMsIHNfZGlyLT5kaXJfYywgc19kaXIpKQorICAgICAgICB7CisgICAgICAgICAgYnVzX3NlcnZpY2VfZGlyZWN0b3J5X3VucmVmIChzX2Rpcik7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisgICAgICAvKiBvbmx5IGZhaWwgb24gT09NLCBpdCBpcyBvayBpZiB3ZSBjYW4ndCByZWFkIHRoZSBkaXJlY3RvcnkgKi8KKyAgICAgIGlmICghdXBkYXRlX2RpcmVjdG9yeSAoYWN0aXZhdGlvbiwgc19kaXIsIGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIH0KKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoZGlyZWN0b3JpZXMsIGxpbmspOworICAgIH0KKworICByZXR1cm4gVFJVRTsKKyBmYWlsZWQ6CisgIHJldHVybiBGQUxTRTsKK30KKworQnVzQWN0aXZhdGlvbioKK2J1c19hY3RpdmF0aW9uX25ldyAoQnVzQ29udGV4dCAgICAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAgICoqZGlyZWN0b3JpZXMsCisgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgQnVzQWN0aXZhdGlvbiAqYWN0aXZhdGlvbjsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBhY3RpdmF0aW9uID0gZGJ1c19uZXcwIChCdXNBY3RpdmF0aW9uLCAxKTsKKyAgaWYgKGFjdGl2YXRpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGFjdGl2YXRpb24tPnJlZmNvdW50ID0gMTsKKyAgYWN0aXZhdGlvbi0+Y29udGV4dCA9IGNvbnRleHQ7CisgIGFjdGl2YXRpb24tPm5fcGVuZGluZ19hY3RpdmF0aW9ucyA9IDA7CisKKyAgaWYgKCFidXNfYWN0aXZhdGlvbl9yZWxvYWQgKGFjdGl2YXRpb24sIGFkZHJlc3MsIGRpcmVjdG9yaWVzLCBlcnJvcikpCisgICAgZ290byBmYWlsZWQ7CisKKyAgIC8qIEluaXRpYWxpemUgdGhpcyBoYXNoIHRhYmxlIG9uY2UsIHdlIGRvbid0IHdhbnQgdG8gbG9zZSBwZW5kaW5nCisgICAqIGFjdGl2YXRpb25zIG9uIHJlbG9hZC4gKi8KKyAgYWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucyA9IF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfU1RSSU5HLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzRnJlZUZ1bmN0aW9uKWJ1c19wZW5kaW5nX2FjdGl2YXRpb25fdW5yZWYpOworCisgIGlmIChhY3RpdmF0aW9uLT5wZW5kaW5nX2FjdGl2YXRpb25zID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBhY3RpdmF0aW9uLT5lbnZpcm9ubWVudCA9IF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0ZyZWVGdW5jdGlvbikgZGJ1c19mcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0ZyZWVGdW5jdGlvbikgZGJ1c19mcmVlKTsKKworICBpZiAoYWN0aXZhdGlvbi0+ZW52aXJvbm1lbnQgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmICghcG9wdWxhdGVfZW52aXJvbm1lbnQgKGFjdGl2YXRpb24pKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgcmV0dXJuIGFjdGl2YXRpb247CisKKyBmYWlsZWQ6CisgIGJ1c19hY3RpdmF0aW9uX3VucmVmIChhY3RpdmF0aW9uKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK0J1c0FjdGl2YXRpb24gKgorYnVzX2FjdGl2YXRpb25fcmVmIChCdXNBY3RpdmF0aW9uICphY3RpdmF0aW9uKQoreworICBfZGJ1c19hc3NlcnQgKGFjdGl2YXRpb24tPnJlZmNvdW50ID4gMCk7CisKKyAgYWN0aXZhdGlvbi0+cmVmY291bnQgKz0gMTsKKworICByZXR1cm4gYWN0aXZhdGlvbjsKK30KKwordm9pZAorYnVzX2FjdGl2YXRpb25fdW5yZWYgKEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb24pCit7CisgIF9kYnVzX2Fzc2VydCAoYWN0aXZhdGlvbi0+cmVmY291bnQgPiAwKTsKKworICBhY3RpdmF0aW9uLT5yZWZjb3VudCAtPSAxOworCisgIGlmIChhY3RpdmF0aW9uLT5yZWZjb3VudCA+IDApCisgICAgcmV0dXJuOworCisgIGRidXNfZnJlZSAoYWN0aXZhdGlvbi0+c2VydmVyX2FkZHJlc3MpOworICBpZiAoYWN0aXZhdGlvbi0+ZW50cmllcykKKyAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChhY3RpdmF0aW9uLT5lbnRyaWVzKTsKKyAgaWYgKGFjdGl2YXRpb24tPnBlbmRpbmdfYWN0aXZhdGlvbnMpCisgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAoYWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucyk7CisgIGlmIChhY3RpdmF0aW9uLT5kaXJlY3RvcmllcykKKyAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChhY3RpdmF0aW9uLT5kaXJlY3Rvcmllcyk7CisgIGlmIChhY3RpdmF0aW9uLT5lbnZpcm9ubWVudCkKKyAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChhY3RpdmF0aW9uLT5lbnZpcm9ubWVudCk7CisKKyAgZGJ1c19mcmVlIChhY3RpdmF0aW9uKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithZGRfYnVzX2Vudmlyb25tZW50IChCdXNBY3RpdmF0aW9uICphY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKnR5cGU7CisKKyAgaWYgKCFidXNfYWN0aXZhdGlvbl9zZXRfZW52aXJvbm1lbnRfdmFyaWFibGUgKGFjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiREJVU19TVEFSVEVSX0FERFJFU1MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZhdGlvbi0+c2VydmVyX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHR5cGUgPSBidXNfY29udGV4dF9nZXRfdHlwZSAoYWN0aXZhdGlvbi0+Y29udGV4dCk7CisgIGlmICh0eXBlICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCFidXNfYWN0aXZhdGlvbl9zZXRfZW52aXJvbm1lbnRfdmFyaWFibGUgKGFjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRCVVNfU1RBUlRFUl9CVVNfVFlQRSIsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChzdHJjbXAgKHR5cGUsICJzZXNzaW9uIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghYnVzX2FjdGl2YXRpb25fc2V0X2Vudmlyb25tZW50X3ZhcmlhYmxlIChhY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiREJVU19TRVNTSU9OX0JVU19BRERSRVNTIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZhdGlvbi0+c2VydmVyX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wICh0eXBlLCAic3lzdGVtIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghYnVzX2FjdGl2YXRpb25fc2V0X2Vudmlyb25tZW50X3ZhcmlhYmxlIChhY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiREJVU19TWVNURU1fQlVTX0FERFJFU1MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmF0aW9uLT5zZXJ2ZXJfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCit0eXBlZGVmIHN0cnVjdAoreworICBCdXNQZW5kaW5nQWN0aXZhdGlvbiAqcGVuZGluZ19hY3RpdmF0aW9uOworICBEQnVzUHJlYWxsb2NhdGVkSGFzaCAqaGFzaF9lbnRyeTsKK30gUmVzdG9yZVBlbmRpbmdEYXRhOworCitzdGF0aWMgdm9pZAorcmVzdG9yZV9wZW5kaW5nICh2b2lkICpkYXRhKQoreworICBSZXN0b3JlUGVuZGluZ0RhdGEgKmQgPSBkYXRhOworCisgIF9kYnVzX2Fzc2VydCAoZC0+cGVuZGluZ19hY3RpdmF0aW9uICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGQtPmhhc2hfZW50cnkgIT0gTlVMTCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIlJlc3RvcmluZyBwZW5kaW5nIGFjdGl2YXRpb24gZm9yIHNlcnZpY2UgJXMsIGhhcyB0aW1lb3V0ID0gJWRcbiIsCisgICAgICAgICAgICAgICAgIGQtPnBlbmRpbmdfYWN0aXZhdGlvbi0+c2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICBkLT5wZW5kaW5nX2FjdGl2YXRpb24tPnRpbWVvdXRfYWRkZWQpOworCisgIF9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZ19wcmVhbGxvY2F0ZWQgKGQtPnBlbmRpbmdfYWN0aXZhdGlvbi0+YWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+aGFzaF9lbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+cGVuZGluZ19hY3RpdmF0aW9uLT5zZXJ2aWNlX25hbWUsIGQtPnBlbmRpbmdfYWN0aXZhdGlvbik7CisKKyAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl9yZWYgKGQtPnBlbmRpbmdfYWN0aXZhdGlvbik7CisKKyAgZC0+aGFzaF9lbnRyeSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX3BlbmRpbmdfcmVzdG9yZV9kYXRhICh2b2lkICpkYXRhKQoreworICBSZXN0b3JlUGVuZGluZ0RhdGEgKmQgPSBkYXRhOworCisgIGlmIChkLT5oYXNoX2VudHJ5KQorICAgIF9kYnVzX2hhc2hfdGFibGVfZnJlZV9wcmVhbGxvY2F0ZWRfZW50cnkgKGQtPnBlbmRpbmdfYWN0aXZhdGlvbi0+YWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5oYXNoX2VudHJ5KTsKKworICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX3VucmVmIChkLT5wZW5kaW5nX2FjdGl2YXRpb24pOworCisgIGRidXNfZnJlZSAoZCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWRkX3Jlc3RvcmVfcGVuZGluZ190b190cmFuc2FjdGlvbiAoQnVzVHJhbnNhY3Rpb24gICAgICAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzUGVuZGluZ0FjdGl2YXRpb24gKnBlbmRpbmdfYWN0aXZhdGlvbikKK3sKKyAgUmVzdG9yZVBlbmRpbmdEYXRhICpkOworCisgIGQgPSBkYnVzX25ldyAoUmVzdG9yZVBlbmRpbmdEYXRhLCAxKTsKKyAgaWYgKGQgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZC0+cGVuZGluZ19hY3RpdmF0aW9uID0gcGVuZGluZ19hY3RpdmF0aW9uOworICBkLT5oYXNoX2VudHJ5ID0gX2RidXNfaGFzaF90YWJsZV9wcmVhbGxvY2F0ZV9lbnRyeSAoZC0+cGVuZGluZ19hY3RpdmF0aW9uLT5hY3RpdmF0aW9uLT5wZW5kaW5nX2FjdGl2YXRpb25zKTsKKworICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX3JlZiAoZC0+cGVuZGluZ19hY3RpdmF0aW9uKTsKKworICBpZiAoZC0+aGFzaF9lbnRyeSA9PSBOVUxMIHx8CisgICAgICAhYnVzX3RyYW5zYWN0aW9uX2FkZF9jYW5jZWxfaG9vayAodHJhbnNhY3Rpb24sIHJlc3RvcmVfcGVuZGluZywgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX3BlbmRpbmdfcmVzdG9yZV9kYXRhKSkKKyAgICB7CisgICAgICBmcmVlX3BlbmRpbmdfcmVzdG9yZV9kYXRhIChkKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIlNhdmVkIHBlbmRpbmcgYWN0aXZhdGlvbiB0byBiZSByZXN0b3JlZCBpZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHNcbiIpOworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2FjdGl2YXRpb25fc2VydmljZV9jcmVhdGVkIChCdXNBY3RpdmF0aW9uICAqYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb247CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBEQnVzTGlzdCAqbGluazsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICAvKiBDaGVjayBpZiBpdCdzIGEgcGVuZGluZyBhY3RpdmF0aW9uICovCisgIHBlbmRpbmdfYWN0aXZhdGlvbiA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3N0cmluZyAoYWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucywgc2VydmljZV9uYW1lKTsKKworICBpZiAoIXBlbmRpbmdfYWN0aXZhdGlvbikKKyAgICByZXR1cm4gVFJVRTsKKworICBidXNfY29udGV4dF9sb2cgKGFjdGl2YXRpb24tPmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgREJVU19TWVNURU1fTE9HX0lORk8sICJTdWNjZXNzZnVsbHkgYWN0aXZhdGVkIHNlcnZpY2UgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lKTsKKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnBlbmRpbmdfYWN0aXZhdGlvbi0+ZW50cmllcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgQnVzUGVuZGluZ0FjdGl2YXRpb25FbnRyeSAqZW50cnkgPSBsaW5rLT5kYXRhOworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZwZW5kaW5nX2FjdGl2YXRpb24tPmVudHJpZXMsIGxpbmspOworCisgICAgICBpZiAoZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGVudHJ5LT5jb25uZWN0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIE9ubHkgc2VuZCBhY3RpdmF0aW9uIHJlcGxpZXMgdG8gcmVndWxhciBhY3RpdmF0aW9uIHJlcXVlc3RzLiAqLworICAgICAgICAgIGlmICghZW50cnktPmF1dG9fYWN0aXZhdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCByZXN1bHQ7CisKKyAgICAgICAgICAgICAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAoZW50cnktPmFjdGl2YXRpb25fbWVzc2FnZSk7CisgICAgICAgICAgICAgIGlmICghbWVzc2FnZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcmVzdWx0ID0gREJVU19TVEFSVF9SRVBMWV9TVUNDRVNTOworCisgICAgICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBlbnRyeS0+Y29ubmVjdGlvbiwgbWVzc2FnZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KKworICByZXR1cm4gVFJVRTsKKworIGVycm9yOgorICByZXR1cm4gRkFMU0U7Cit9CisKK2RidXNfYm9vbF90CitidXNfYWN0aXZhdGlvbl9zZW5kX3BlbmRpbmdfYXV0b19hY3RpdmF0aW9uX21lc3NhZ2VzIChCdXNBY3RpdmF0aW9uICAqYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBCdXNQZW5kaW5nQWN0aXZhdGlvbiAqcGVuZGluZ19hY3RpdmF0aW9uOworICBEQnVzTGlzdCAqbGluazsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICAvKiBDaGVjayBpZiBpdCdzIGEgcGVuZGluZyBhY3RpdmF0aW9uICovCisgIHBlbmRpbmdfYWN0aXZhdGlvbiA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3N0cmluZyAoYWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfc2VydmljZV9nZXRfbmFtZSAoc2VydmljZSkpOworCisgIGlmICghcGVuZGluZ19hY3RpdmF0aW9uKQorICAgIHJldHVybiBUUlVFOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmcGVuZGluZ19hY3RpdmF0aW9uLT5lbnRyaWVzKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBCdXNQZW5kaW5nQWN0aXZhdGlvbkVudHJ5ICplbnRyeSA9IGxpbmstPmRhdGE7CisgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnBlbmRpbmdfYWN0aXZhdGlvbi0+ZW50cmllcywgbGluayk7CisKKyAgICAgIGlmIChlbnRyeS0+YXV0b19hY3RpdmF0aW9uICYmIGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChlbnRyeS0+Y29ubmVjdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqYWRkcmVzc2VkX3JlY2lwaWVudDsKKworICAgICAgICAgIGFkZHJlc3NlZF9yZWNpcGllbnQgPSBidXNfc2VydmljZV9nZXRfcHJpbWFyeV9vd25lcnNfY29ubmVjdGlvbiAoc2VydmljZSk7CisKKyAgICAgICAgICAvKiBSZXN1bWUgZGlzcGF0Y2hpbmcgd2hlcmUgd2UgbGVmdCBvZmYgaW4gYnVzX2Rpc3BhdGNoKCkgKi8KKyAgICAgICAgICBpZiAoIWJ1c19kaXNwYXRjaF9tYXRjaGVzICh0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT5hY3RpdmF0aW9uX21lc3NhZ2UsIGVycm9yKSkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgbGluayA9IG5leHQ7CisgICAgfQorCisgIGlmICghYWRkX3Jlc3RvcmVfcGVuZGluZ190b190cmFuc2FjdGlvbiAodHJhbnNhY3Rpb24sIHBlbmRpbmdfYWN0aXZhdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkNvdWxkIG5vdCBhZGQgY2FuY2VsIGhvb2sgdG8gdHJhbnNhY3Rpb24gdG8gcmV2ZXJ0IHJlbW92aW5nIHBlbmRpbmcgYWN0aXZhdGlvblxuIik7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfc3RyaW5nIChhY3RpdmF0aW9uLT5wZW5kaW5nX2FjdGl2YXRpb25zLCBidXNfc2VydmljZV9nZXRfbmFtZSAoc2VydmljZSkpOworCisgIHJldHVybiBUUlVFOworCisgZXJyb3I6CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBGSVhNRSBAdG9kbyB0aGUgZXJyb3IgbWVzc2FnZXMgaGVyZSB3b3VsZCBpZGVhbGx5IGJlIHByZWFsbG9jYXRlZAorICogc28gd2UgZG9uJ3QgbmVlZCB0byBhbGxvY2F0ZSBtZW1vcnkgdG8gc2VuZCB0aGVtLgorICogVXNpbmcgdGhlIHVzdWFsIHRhY3RpYywgcHJlYWxsb2MgYW4gT09NIG1lc3NhZ2UsIHRoZW4KKyAqIGlmIHdlIGNhbid0IGFsbG9jIHRoZSByZWFsIGVycm9yIHNlbmQgdGhlIE9PTSBlcnJvciBpbnN0ZWFkLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK3RyeV9zZW5kX2FjdGl2YXRpb25fZmFpbHVyZSAoQnVzUGVuZGluZ0FjdGl2YXRpb24gKnBlbmRpbmdfYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c0Vycm9yICAgICAgKmhvdykKK3sKKyAgQnVzQWN0aXZhdGlvbiAqYWN0aXZhdGlvbjsKKyAgREJ1c0xpc3QgKmxpbms7CisgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbjsKKworICBhY3RpdmF0aW9uID0gcGVuZGluZ19hY3RpdmF0aW9uLT5hY3RpdmF0aW9uOworCisgIHRyYW5zYWN0aW9uID0gYnVzX3RyYW5zYWN0aW9uX25ldyAoYWN0aXZhdGlvbi0+Y29udGV4dCk7CisgIGlmICh0cmFuc2FjdGlvbiA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnBlbmRpbmdfYWN0aXZhdGlvbi0+ZW50cmllcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgQnVzUGVuZGluZ0FjdGl2YXRpb25FbnRyeSAqZW50cnkgPSBsaW5rLT5kYXRhOworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZwZW5kaW5nX2FjdGl2YXRpb24tPmVudHJpZXMsIGxpbmspOworCisgICAgICBpZiAoZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGVudHJ5LT5jb25uZWN0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmRfZXJyb3JfcmVwbHkgKHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT5jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+YWN0aXZhdGlvbl9tZXNzYWdlKSkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgbGluayA9IG5leHQ7CisgICAgfQorCisgIGJ1c190cmFuc2FjdGlvbl9leGVjdXRlX2FuZF9mcmVlICh0cmFuc2FjdGlvbik7CisKKyAgcmV0dXJuIFRSVUU7CisKKyBlcnJvcjoKKyAgaWYgKHRyYW5zYWN0aW9uKQorICAgIGJ1c190cmFuc2FjdGlvbl9jYW5jZWxfYW5kX2ZyZWUgKHRyYW5zYWN0aW9uKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEZyZWUgdGhlIHBlbmRpbmcgYWN0aXZhdGlvbiBhbmQgc2VuZCBhbiBlcnJvciBtZXNzYWdlIHRvIGFsbCB0aGUKKyAqIGNvbm5lY3Rpb25zIHRoYXQgd2VyZSB3YWl0aW5nIGZvciBpdC4KKyAqLworc3RhdGljIHZvaWQKK3BlbmRpbmdfYWN0aXZhdGlvbl9mYWlsZWQgKEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzRXJyb3IgICAgICAqaG93KQoreworICAvKiBGSVhNRSB1c2UgcHJlYWxsb2NhdGVkIE9PTSBtZXNzYWdlcyBpbnN0ZWFkIG9mIGJ1c193YWl0X2Zvcl9tZW1vcnkoKSAqLworICB3aGlsZSAoIXRyeV9zZW5kX2FjdGl2YXRpb25fZmFpbHVyZSAocGVuZGluZ19hY3RpdmF0aW9uLCBob3cpKQorICAgIF9kYnVzX3dhaXRfZm9yX21lbW9yeSAoKTsKKworICAvKiBEZXN0cm95IHRoaXMgcGVuZGluZyBhY3RpdmF0aW9uICovCisgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3N0cmluZyAocGVuZGluZ19hY3RpdmF0aW9uLT5hY3RpdmF0aW9uLT5wZW5kaW5nX2FjdGl2YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+c2VydmljZV9uYW1lKTsKK30KKworLyoqCisgKiBEZXBlbmRpbmcgb24gdGhlIGV4aXQgY29kZSBvZiB0aGUgaGVscGVyLCBzZXQgdGhlIGVycm9yIGFjY29yZGluZ2x5CisgKi8KK3N0YXRpYyB2b2lkCitoYW5kbGVfc2VydmljZWhlbHBlcl9leGl0X2Vycm9yIChpbnQgICAgICAgIGV4aXRfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpCit7CisgIHN3aXRjaCAoZXhpdF9jb2RlKQorICAgIHsKKyAgICBjYXNlIEJVU19TUEFXTl9FWElUX0NPREVfTk9fTUVNT1JZOgorICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAiTGF1bmNoZXIgY291bGQgbm90IHJ1biAob3V0IG9mIG1lbW9yeSkiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlVTX1NQQVdOX0VYSVRfQ09ERV9TRVRVUF9GQUlMRUQ6CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fU0VUVVBfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0dXAgZW52aXJvbm1lbnQgY29ycmVjdGx5Iik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJVU19TUEFXTl9FWElUX0NPREVfTkFNRV9JTlZBTElEOgorICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX1NFUlZJQ0VfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAiQnVzIG5hbWUgaXMgbm90IHZhbGlkIG9yIG1pc3NpbmciKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlVTX1NQQVdOX0VYSVRfQ09ERV9TRVJWSUNFX05PVF9GT1VORDoKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9TRVJWSUNFX05PVF9GT1VORCwKKyAgICAgICAgICAgICAgICAgICAgICAiQnVzIG5hbWUgbm90IGZvdW5kIGluIHN5c3RlbSBzZXJ2aWNlIGRpcmVjdG9yeSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVVNfU1BBV05fRVhJVF9DT0RFX1BFUk1JU1NJT05TX0lOVkFMSUQ6CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fUEVSTUlTU0lPTlNfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAiVGhlIHBlcm1pc3Npb24gb2YgdGhlIHNldHVpZCBoZWxwZXIgaXMgbm90IGNvcnJlY3QiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlVTX1NQQVdOX0VYSVRfQ09ERV9GSUxFX0lOVkFMSUQ6CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fUEVSTUlTU0lPTlNfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAiVGhlIHNlcnZpY2UgZmlsZSBpcyBpbmNvcnJlY3Qgb3IgZG9lcyBub3QgaGF2ZSBhbGwgcmVxdWlyZWQgYXR0cmlidXRlcyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVVNfU1BBV05fRVhJVF9DT0RFX0VYRUNfRkFJTEVEOgorICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0VYRUNfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgbGF1bmNoIGRhZW1vbiwgZmlsZSBub3QgZm91bmQgb3IgcGVybWlzc2lvbnMgaW52YWxpZCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVVNfU1BBV05fRVhJVF9DT0RFX0lOVkFMSURfQVJHUzoKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgYXJndW1lbnRzIHRvIGNvbW1hbmQgbGluZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVVNfU1BBV05fRVhJVF9DT0RFX0NISUxEX1NJR05BTEVEOgorICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX1NJR05BTEVELAorICAgICAgICAgICAgICAgICAgICAgICJMYXVuY2hlZCBjaGlsZCB3YXMgc2lnbmFsZWQsIGl0IHByb2JhYmx5IGNyYXNoZWQiKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fQ0hJTERfRVhJVEVELAorICAgICAgICAgICAgICAgICAgICAgICJMYXVuY2ggaGVscGVyIGV4aXRlZCB3aXRoIHVua25vd24gcmV0dXJuIGNvZGUgJWkiLCBleGl0X2NvZGUpOworICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcGVuZGluZ19hY3RpdmF0aW9uX2ZpbmlzaGVkX2NiIChEQnVzQmFieXNpdHRlciAqYmFieXNpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpCit7CisgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb24gPSBkYXRhOworICBkYnVzX2Jvb2xfdCB1c2VzX3NlcnZpY2VoZWxwZXI7CisKKyAgX2RidXNfYXNzZXJ0IChiYWJ5c2l0dGVyID09IHBlbmRpbmdfYWN0aXZhdGlvbi0+YmFieXNpdHRlcik7CisgIF9kYnVzX2JhYnlzaXR0ZXJfcmVmIChiYWJ5c2l0dGVyKTsKKworICAvKiBUaGVyZSBhcmUgdHdvIG1ham9yIGNhc2VzIGhlcmU7IGFyZSB3ZSB0aGUgc3lzdGVtIGJ1cyBvciB0aGUgc2Vzc2lvbj8gIEhlcmUgdGhpcworICAgKiBpcyBkaXN0aW5ndWlzaGVkIGJ5IHdoZXRoZXIgb3Igbm90IHdlIHVzZSBhIHNldHVpZCBoZWxwZXIgbGF1bmNoZXIuICBXaXRoIHRoZSBsYXVuY2ggaGVscGVyLAorICAgKiBzb21lIHByb2Nlc3MgZXhpdCBjb2RlcyBhcmUgbWVhbmluZ2Z1bCwgcHJvY2Vzc2VkIGJ5IGhhbmRsZV9zZXJ2aWNlaGVscGVyX2V4aXRfZXJyb3IuCisgICAqCisgICAqIEluIGJvdGggY2FzZXMgdGhvdWdoLCBqdXN0IGlnbm9yZSB3aGVuIGEgcHJvY2VzcyBleGl0cyB3aXRoIHN0YXR1cyAwOyBpdCdzIHBvc3NpYmxlIGZvcgorICAgKiBhIHByb2dyYW0gdG8gKG1pc2d1aWRlZGx5KSAiZGFlbW9uaXplIiwgYW5kIHRoYXQgYXBwZWFycyB0byB1cyBhcyBhbiBleGl0LiAgVGhpcyBjbG9zZXMgYSByYWNlCisgICAqIGNvbmRpdGlvbiBiZXR3ZWVuIHRoaXMgY29kZSBhbmQgdGhlIGNoaWxkIHByb2Nlc3MgY2xhaW1pbmcgdGhlIGJ1cyBuYW1lLgorICAgKi8KKyAgdXNlc19zZXJ2aWNlaGVscGVyID0gYnVzX2NvbnRleHRfZ2V0X3NlcnZpY2VoZWxwZXIgKHBlbmRpbmdfYWN0aXZhdGlvbi0+YWN0aXZhdGlvbi0+Y29udGV4dCkgIT0gTlVMTDsKKworICAvKiBzdHJpY3RseSBzcGVha2luZyB0aGlzIGlzIHJlZHVuZGFudCB3aXRoIHRoZSBjaGVjayBpbiBkYnVzLXNwYXduIG5vdyAqLworICBpZiAoX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdGVkIChiYWJ5c2l0dGVyKSkKKyAgICB7CisgICAgICBEQnVzRXJyb3IgZXJyb3I7CisgICAgICBEQnVzSGFzaEl0ZXIgaXRlcjsKKyAgICAgIGRidXNfYm9vbF90IGFjdGl2YXRpb25fZmFpbGVkOworICAgICAgaW50IGV4aXRfY29kZSA9IDA7CisKKyAgICAgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICAgICAgX2RidXNfYmFieXNpdHRlcl9zZXRfY2hpbGRfZXhpdF9lcnJvciAoYmFieXNpdHRlciwgJmVycm9yKTsKKworICAgICAgLyogRXhwbGljaXRseSBjaGVjayBmb3IgU1BBV05fQ0hJTERfRVhJVEVEIHRvIGF2b2lkIG92ZXJ3cml0aW5nIGFuCisgICAgICAgKiBleGVjIGVycm9yICovCisgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX0VYSVRFRCkKKyAgICAgICAgICAmJiBfZGJ1c19iYWJ5c2l0dGVyX2dldF9jaGlsZF9leGl0X3N0YXR1cyAoYmFieXNpdHRlciwgJmV4aXRfY29kZSkpCisgICAgICAgIHsKKyAgICAgICAgICBhY3RpdmF0aW9uX2ZhaWxlZCA9IGV4aXRfY29kZSAhPSAwOworCisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlKCZlcnJvcik7CisKKyAgICAgICAgICBpZiAoYWN0aXZhdGlvbl9mYWlsZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICh1c2VzX3NlcnZpY2VoZWxwZXIpCisgICAgICAgICAgICAgICAgaGFuZGxlX3NlcnZpY2VoZWxwZXJfZXhpdF9lcnJvciAoZXhpdF9jb2RlLCAmZXJyb3IpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX2RidXNfYmFieXNpdHRlcl9zZXRfY2hpbGRfZXhpdF9lcnJvciAoYmFieXNpdHRlciwgJmVycm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgYWN0aXZhdGlvbl9mYWlsZWQgPSBUUlVFOworICAgICAgICB9CisKKyAgICAgIGlmIChhY3RpdmF0aW9uX2ZhaWxlZCkKKyAgICAgICAgeworICAgICAgICAgIGJ1c19jb250ZXh0X2xvZyAocGVuZGluZ19hY3RpdmF0aW9uLT5hY3RpdmF0aW9uLT5jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TWVNURU1fTE9HX0lORk8sICJBY3RpdmF0ZWQgc2VydmljZSAnJXMnIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ19hY3RpdmF0aW9uLT5zZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKworICAgICAgICAgIC8qIERlc3Ryb3kgYWxsIHBlbmRpbmcgYWN0aXZhdGlvbnMgd2l0aCB0aGUgc2FtZSBleGVjICovCisgICAgICAgICAgX2RidXNfaGFzaF9pdGVyX2luaXQgKHBlbmRpbmdfYWN0aXZhdGlvbi0+YWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZXIpOworICAgICAgICAgIHdoaWxlIChfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBCdXNQZW5kaW5nQWN0aXZhdGlvbiAqcCA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKTsKKworICAgICAgICAgICAgICBpZiAocCAhPSBwZW5kaW5nX2FjdGl2YXRpb24gJiYgc3RyY21wIChwLT5leGVjLCBwZW5kaW5nX2FjdGl2YXRpb24tPmV4ZWMpID09IDApCisgICAgICAgICAgICAgICAgcGVuZGluZ19hY3RpdmF0aW9uX2ZhaWxlZCAocCwgJmVycm9yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8qIERlc3Ryb3lzIHRoZSBwZW5kaW5nIGFjdGl2YXRpb24gKi8KKyAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb25fZmFpbGVkIChwZW5kaW5nX2FjdGl2YXRpb24sICZlcnJvcik7CisKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgX2RidXNfYmFieXNpdHRlcl91bnJlZiAoYmFieXNpdHRlcik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWRkX2JhYnlzaXR0ZXJfd2F0Y2ggKERCdXNXYXRjaCAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSkKK3sKKyAgQnVzUGVuZGluZ0FjdGl2YXRpb24gKnBlbmRpbmdfYWN0aXZhdGlvbiA9IGRhdGE7CisKKyAgcmV0dXJuIF9kYnVzX2xvb3BfYWRkX3dhdGNoICgKKyAgICAgIGJ1c19jb250ZXh0X2dldF9sb29wIChwZW5kaW5nX2FjdGl2YXRpb24tPmFjdGl2YXRpb24tPmNvbnRleHQpLAorICAgICAgd2F0Y2gpOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX2JhYnlzaXR0ZXJfd2F0Y2ggKERCdXNXYXRjaCAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSkKK3sKKyAgQnVzUGVuZGluZ0FjdGl2YXRpb24gKnBlbmRpbmdfYWN0aXZhdGlvbiA9IGRhdGE7CisKKyAgX2RidXNfbG9vcF9yZW1vdmVfd2F0Y2ggKGJ1c19jb250ZXh0X2dldF9sb29wIChwZW5kaW5nX2FjdGl2YXRpb24tPmFjdGl2YXRpb24tPmNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2gpOworfQorCitzdGF0aWMgdm9pZAordG9nZ2xlX2JhYnlzaXR0ZXJfd2F0Y2ggKERCdXNXYXRjaCAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSkKK3sKKyAgQnVzUGVuZGluZ0FjdGl2YXRpb24gKnBlbmRpbmdfYWN0aXZhdGlvbiA9IGRhdGE7CisKKyAgX2RidXNfbG9vcF90b2dnbGVfd2F0Y2ggKGJ1c19jb250ZXh0X2dldF9sb29wIChwZW5kaW5nX2FjdGl2YXRpb24tPmFjdGl2YXRpb24tPmNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2gpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3BlbmRpbmdfYWN0aXZhdGlvbl90aW1lZF9vdXQgKHZvaWQgKmRhdGEpCit7CisgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb24gPSBkYXRhOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgLyogS2lsbCB0aGUgc3Bhd25lZCBwcm9jZXNzLCBzaW5jZSBpdCBzdWNrcworICAgKiAobm90IHN1cmUgdGhpcyBpcyB3aGF0IHdlIHdhbnQgdG8gZG8sIGJ1dAorICAgKiBtYXkgYXMgd2VsbCB0cnkgaXQgZm9yIG5vdykKKyAgICovCisgIGlmIChwZW5kaW5nX2FjdGl2YXRpb24tPmJhYnlzaXR0ZXIpCisgICAgX2RidXNfYmFieXNpdHRlcl9raWxsX2NoaWxkIChwZW5kaW5nX2FjdGl2YXRpb24tPmJhYnlzaXR0ZXIpOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBkYnVzX3NldF9lcnJvciAoJmVycm9yLCBEQlVTX0VSUk9SX1RJTUVEX09VVCwKKyAgICAgICAgICAgICAgICAgICJBY3RpdmF0aW9uIG9mICVzIHRpbWVkIG91dCIsCisgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPnNlcnZpY2VfbmFtZSk7CisgIGJ1c19jb250ZXh0X2xvZyAocGVuZGluZ19hY3RpdmF0aW9uLT5hY3RpdmF0aW9uLT5jb250ZXh0LAorICAgICAgICAgICAgICAgICAgIERCVVNfU1lTVEVNX0xPR19JTkZPLAorICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYWN0aXZhdGUgc2VydmljZSAnJXMnOiB0aW1lZCBvdXQiLAorICAgICAgICAgICAgICAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+c2VydmljZV9uYW1lKTsKKworICBwZW5kaW5nX2FjdGl2YXRpb25fZmFpbGVkIChwZW5kaW5nX2FjdGl2YXRpb24sICZlcnJvcik7CisKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorY2FuY2VsX3BlbmRpbmcgKHZvaWQgKmRhdGEpCit7CisgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb24gPSBkYXRhOworCisgIF9kYnVzX3ZlcmJvc2UgKCJDYW5jZWxpbmcgcGVuZGluZyBhY3RpdmF0aW9uIG9mICVzXG4iLAorICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPnNlcnZpY2VfbmFtZSk7CisKKyAgaWYgKHBlbmRpbmdfYWN0aXZhdGlvbi0+YmFieXNpdHRlcikKKyAgICBfZGJ1c19iYWJ5c2l0dGVyX2tpbGxfY2hpbGQgKHBlbmRpbmdfYWN0aXZhdGlvbi0+YmFieXNpdHRlcik7CisKKyAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfc3RyaW5nIChwZW5kaW5nX2FjdGl2YXRpb24tPmFjdGl2YXRpb24tPnBlbmRpbmdfYWN0aXZhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ19hY3RpdmF0aW9uLT5zZXJ2aWNlX25hbWUpOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9wZW5kaW5nX2NhbmNlbF9kYXRhICh2b2lkICpkYXRhKQoreworICBCdXNQZW5kaW5nQWN0aXZhdGlvbiAqcGVuZGluZ19hY3RpdmF0aW9uID0gZGF0YTsKKworICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX3VucmVmIChwZW5kaW5nX2FjdGl2YXRpb24pOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FkZF9jYW5jZWxfcGVuZGluZ190b190cmFuc2FjdGlvbiAoQnVzVHJhbnNhY3Rpb24gICAgICAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQZW5kaW5nQWN0aXZhdGlvbiAqcGVuZGluZ19hY3RpdmF0aW9uKQoreworICBpZiAoIWJ1c190cmFuc2FjdGlvbl9hZGRfY2FuY2VsX2hvb2sgKHRyYW5zYWN0aW9uLCBjYW5jZWxfcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9wZW5kaW5nX2NhbmNlbF9kYXRhKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl9yZWYgKHBlbmRpbmdfYWN0aXZhdGlvbik7CisKKyAgX2RidXNfdmVyYm9zZSAoIlNhdmVkIHBlbmRpbmcgYWN0aXZhdGlvbiB0byBiZSBjYW5jZWxlZCBpZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHNcbiIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3VwZGF0ZV9zZXJ2aWNlX2NhY2hlIChCdXNBY3RpdmF0aW9uICphY3RpdmF0aW9uLCBEQnVzRXJyb3IgKmVycm9yKQoreworICBEQnVzSGFzaEl0ZXIgaXRlcjsKKworICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAoYWN0aXZhdGlvbi0+ZGlyZWN0b3JpZXMsICZpdGVyKTsKKyAgd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgeworICAgICAgREJ1c0Vycm9yIHRtcF9lcnJvcjsKKyAgICAgIEJ1c1NlcnZpY2VEaXJlY3RvcnkgKnNfZGlyOworCisgICAgICBzX2RpciA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKTsKKworICAgICAgZGJ1c19lcnJvcl9pbml0ICgmdG1wX2Vycm9yKTsKKyAgICAgIGlmICghdXBkYXRlX2RpcmVjdG9yeSAoYWN0aXZhdGlvbiwgc19kaXIsICZ0bXBfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZ0bXBfZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19tb3ZlX2Vycm9yICgmdG1wX2Vycm9yLCBlcnJvcik7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJnRtcF9lcnJvcik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBCdXNBY3RpdmF0aW9uRW50cnkgKgorYWN0aXZhdGlvbl9maW5kX2VudHJ5IChCdXNBY3RpdmF0aW9uICphY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgKmVycm9yKQoreworICBCdXNBY3RpdmF0aW9uRW50cnkgKmVudHJ5OworCisgIGVudHJ5ID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChhY3RpdmF0aW9uLT5lbnRyaWVzLCBzZXJ2aWNlX25hbWUpOworICBpZiAoIWVudHJ5KQorICAgIHsKKyAgICAgIGlmICghdXBkYXRlX3NlcnZpY2VfY2FjaGUgKGFjdGl2YXRpb24sIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgIGVudHJ5ID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChhY3RpdmF0aW9uLT5lbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgQnVzQWN0aXZhdGlvbkVudHJ5ICp1cGRhdGVkX2VudHJ5OworCisgICAgICBpZiAoIWNoZWNrX3NlcnZpY2VfZmlsZSAoYWN0aXZhdGlvbiwgZW50cnksICZ1cGRhdGVkX2VudHJ5LCBlcnJvcikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICBlbnRyeSA9IHVwZGF0ZWRfZW50cnk7CisgICAgfQorCisgIGlmICghZW50cnkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NFUlZJQ0VfVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAiVGhlIG5hbWUgJXMgd2FzIG5vdCBwcm92aWRlZCBieSBhbnkgLnNlcnZpY2UgZmlsZXMiLAorICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIGVudHJ5OworfQorCitzdGF0aWMgY2hhciAqKgorYnVzX2FjdGl2YXRpb25fZ2V0X2Vudmlyb25tZW50IChCdXNBY3RpdmF0aW9uICphY3RpdmF0aW9uKQoreworICBjaGFyICoqZW52aXJvbm1lbnQ7CisgIGludCBpLCBsZW5ndGg7CisgIERCdXNTdHJpbmcgZW50cnk7CisgIERCdXNIYXNoSXRlciBpdGVyOworCisgIGxlbmd0aCA9IF9kYnVzX2hhc2hfdGFibGVfZ2V0X25fZW50cmllcyAoYWN0aXZhdGlvbi0+ZW52aXJvbm1lbnQpOworCisgIGVudmlyb25tZW50ID0gZGJ1c19uZXcwIChjaGFyICosIGxlbmd0aCArIDEpOworCisgIGlmIChlbnZpcm9ubWVudCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGkgPSAwOworICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAoYWN0aXZhdGlvbi0+ZW52aXJvbm1lbnQsICZpdGVyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZW50cnkpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGVudmlyb25tZW50KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICprZXksICp2YWx1ZTsKKworICAgICAga2V5ID0gKGNvbnN0IGNoYXIgKikgX2RidXNfaGFzaF9pdGVyX2dldF9zdHJpbmdfa2V5ICgmaXRlcik7CisgICAgICB2YWx1ZSA9IChjb25zdCBjaGFyICopIF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoJmVudHJ5LCAiJXM9JXMiLCBrZXksIHZhbHVlKSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgKCZlbnRyeSwgZW52aXJvbm1lbnQgKyBpKSkKKyAgICAgICAgYnJlYWs7CisgICAgICBpKys7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlICgmZW50cnkpOworCisgIGlmIChpICE9IGxlbmd0aCkKKyAgICB7CisgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChlbnZpcm9ubWVudCk7CisgICAgICBlbnZpcm9ubWVudCA9IE5VTEw7CisgICAgfQorCisgIHJldHVybiBlbnZpcm9ubWVudDsKK30KKworZGJ1c19ib29sX3QKK2J1c19hY3RpdmF0aW9uX3NldF9lbnZpcm9ubWVudF92YXJpYWJsZSAoQnVzQWN0aXZhdGlvbiAgICAgKmFjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBjaGFyICAgICAgICAqaGFzaF9rZXk7CisgIGNoYXIgICAgICAgICpoYXNoX3ZhbHVlOworICBkYnVzX2Jvb2xfdCAgcmV0dmFsOworCisgIHJldHZhbCA9IEZBTFNFOworICBoYXNoX2tleSA9IE5VTEw7CisgIGhhc2hfdmFsdWUgPSBOVUxMOworICBoYXNoX2tleSA9IF9kYnVzX3N0cmR1cCAoa2V5KTsKKworICBpZiAoaGFzaF9rZXkgPT0gTlVMTCkKKyAgICBnb3RvIG91dDsKKworICBoYXNoX3ZhbHVlID0gX2RidXNfc3RyZHVwICh2YWx1ZSk7CisKKyAgaWYgKGhhc2hfdmFsdWUgPT0gTlVMTCkKKyAgICBnb3RvIG91dDsKKworICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZyAoYWN0aXZhdGlvbi0+ZW52aXJvbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2tleSwgaGFzaF92YWx1ZSkpCisgICAgZ290byBvdXQ7CisKKyAgcmV0dmFsID0gVFJVRTsKK291dDoKKyAgaWYgKHJldHZhbCA9PSBGQUxTRSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKGhhc2hfa2V5KTsKKyAgICAgIGRidXNfZnJlZSAoaGFzaF92YWx1ZSk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgIH0KKworICByZXR1cm4gcmV0dmFsOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSAoQnVzQWN0aXZhdGlvbiAgKmFjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICBhdXRvX2FjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqYWN0aXZhdGlvbl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c0Vycm9yIHRtcF9lcnJvcjsKKyAgQnVzQWN0aXZhdGlvbkVudHJ5ICplbnRyeTsKKyAgQnVzUGVuZGluZ0FjdGl2YXRpb24gKnBlbmRpbmdfYWN0aXZhdGlvbjsKKyAgQnVzUGVuZGluZ0FjdGl2YXRpb25FbnRyeSAqcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5OworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgREJ1c1N0cmluZyBzZXJ2aWNlX3N0cjsKKyAgY29uc3QgY2hhciAqc2VydmljZWhlbHBlcjsKKyAgY2hhciAqKmFyZ3Y7CisgIGNoYXIgKiplbnZwID0gTlVMTDsKKyAgaW50IGFyZ2M7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgZGJ1c19ib29sX3Qgd2FzX3BlbmRpbmdfYWN0aXZhdGlvbjsKKyAgREJ1c1N0cmluZyBjb21tYW5kOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmIChhY3RpdmF0aW9uLT5uX3BlbmRpbmdfYWN0aXZhdGlvbnMgPj0KKyAgICAgIGJ1c19jb250ZXh0X2dldF9tYXhfcGVuZGluZ19hY3RpdmF0aW9ucyAoYWN0aXZhdGlvbi0+Y29udGV4dCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0xJTUlUU19FWENFRURFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiVGhlIG1heGltdW0gbnVtYmVyIG9mIHBlbmRpbmcgYWN0aXZhdGlvbnMgaGFzIGJlZW4gcmVhY2hlZCwgYWN0aXZhdGlvbiBvZiAlcyBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGVudHJ5ID0gYWN0aXZhdGlvbl9maW5kX2VudHJ5IChhY3RpdmF0aW9uLCBzZXJ2aWNlX25hbWUsIGVycm9yKTsKKyAgaWYgKCFlbnRyeSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogQnlwYXNzIHRoZSByZWdpc3RyeSBsb29rdXAgaWYgd2UncmUgYXV0by1hY3RpdmF0aW5nLCBidXNfZGlzcGF0Y2ggd291bGQgbm90CisgICAqIGNhbGwgdXMgaWYgdGhlIHNlcnZpY2UgaXMgYWxyZWFkeSBhY3RpdmUuCisgICAqLworICBpZiAoIWF1dG9fYWN0aXZhdGlvbikKKyAgICB7CisgICAgICAvKiBDaGVjayBpZiB0aGUgc2VydmljZSBpcyBhY3RpdmUgKi8KKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc2VydmljZV9zdHIsIHNlcnZpY2VfbmFtZSk7CisgICAgICBpZiAoYnVzX3JlZ2lzdHJ5X2xvb2t1cCAoYnVzX2NvbnRleHRfZ2V0X3JlZ2lzdHJ5IChhY3RpdmF0aW9uLT5jb250ZXh0KSwgJnNlcnZpY2Vfc3RyKSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c191aW50MzJfdCByZXN1bHQ7CisKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiU2VydmljZSBcIiVzXCIgaXMgYWxyZWFkeSBhY3RpdmVcbiIsIHNlcnZpY2VfbmFtZSk7CisKKyAgICAgICAgICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChhY3RpdmF0aW9uX21lc3NhZ2UpOworCisgICAgICAgICAgaWYgKCFtZXNzYWdlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiTm8gbWVtb3J5IHRvIGNyZWF0ZSByZXBseSB0byBhY3RpdmF0ZSBtZXNzYWdlXG4iKTsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgcmVzdWx0ID0gREJVU19TVEFSVF9SRVBMWV9BTFJFQURZX1JVTk5JTkc7CisKKyAgICAgICAgICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiTm8gbWVtb3J5IHRvIHNldCBhcmdzIG9mIHJlcGx5IHRvIGFjdGl2YXRlIG1lc3NhZ2VcbiIpOworICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICByZXR2YWwgPSBidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICAgICAgaWYgKCFyZXR2YWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gc2VuZCByZXBseVxuIik7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICB9CisgICAgfQorCisgIHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSA9IGRidXNfbmV3MCAoQnVzUGVuZGluZ0FjdGl2YXRpb25FbnRyeSwgMSk7CisgIGlmICghcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5KQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gY3JlYXRlIHBlbmRpbmcgYWN0aXZhdGlvbiBlbnRyeVxuIik7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBwZW5kaW5nX2FjdGl2YXRpb25fZW50cnktPmF1dG9fYWN0aXZhdGlvbiA9IGF1dG9fYWN0aXZhdGlvbjsKKworICBwZW5kaW5nX2FjdGl2YXRpb25fZW50cnktPmFjdGl2YXRpb25fbWVzc2FnZSA9IGFjdGl2YXRpb25fbWVzc2FnZTsKKyAgZGJ1c19tZXNzYWdlX3JlZiAoYWN0aXZhdGlvbl9tZXNzYWdlKTsKKyAgcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5LT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7CisKKyAgLyogQ2hlY2sgaWYgdGhlIHNlcnZpY2UgaXMgYmVpbmcgYWN0aXZhdGVkICovCisgIHBlbmRpbmdfYWN0aXZhdGlvbiA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3N0cmluZyAoYWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucywgc2VydmljZV9uYW1lKTsKKyAgd2FzX3BlbmRpbmdfYWN0aXZhdGlvbiA9IChwZW5kaW5nX2FjdGl2YXRpb24gIT0gTlVMTCk7CisgIGlmICh3YXNfcGVuZGluZ19hY3RpdmF0aW9uKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZwZW5kaW5nX2FjdGl2YXRpb24tPmVudHJpZXMsIHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGFwcGVuZCBhIG5ldyBlbnRyeSB0byBwZW5kaW5nIGFjdGl2YXRpb25cbiIpOworCisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5X2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+bl9lbnRyaWVzICs9IDE7CisgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPmFjdGl2YXRpb24tPm5fcGVuZGluZ19hY3RpdmF0aW9ucyArPSAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbiA9IGRidXNfbmV3MCAoQnVzUGVuZGluZ0FjdGl2YXRpb24sIDEpOworICAgICAgaWYgKCFwZW5kaW5nX2FjdGl2YXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGNyZWF0ZSBwZW5kaW5nIGFjdGl2YXRpb25cbiIpOworCisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5X2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+YWN0aXZhdGlvbiA9IGFjdGl2YXRpb247CisgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPnJlZmNvdW50ID0gMTsKKworICAgICAgcGVuZGluZ19hY3RpdmF0aW9uLT5zZXJ2aWNlX25hbWUgPSBfZGJ1c19zdHJkdXAgKHNlcnZpY2VfbmFtZSk7CisgICAgICBpZiAoIXBlbmRpbmdfYWN0aXZhdGlvbi0+c2VydmljZV9uYW1lKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBjb3B5IHNlcnZpY2UgbmFtZSBmb3IgcGVuZGluZyBhY3RpdmF0aW9uXG4iKTsKKworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl91bnJlZiAocGVuZGluZ19hY3RpdmF0aW9uKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5X2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+ZXhlYyA9IF9kYnVzX3N0cmR1cCAoZW50cnktPmV4ZWMpOworICAgICAgaWYgKCFwZW5kaW5nX2FjdGl2YXRpb24tPmV4ZWMpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGNvcHkgc2VydmljZSBleGVjIGZvciBwZW5kaW5nIGFjdGl2YXRpb25cbiIpOworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl91bnJlZiAocGVuZGluZ19hY3RpdmF0aW9uKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5X2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmIChlbnRyeS0+c3lzdGVtZF9zZXJ2aWNlKQorICAgICAgICB7CisgICAgICAgICAgcGVuZGluZ19hY3RpdmF0aW9uLT5zeXN0ZW1kX3NlcnZpY2UgPSBfZGJ1c19zdHJkdXAgKGVudHJ5LT5zeXN0ZW1kX3NlcnZpY2UpOworICAgICAgICAgIGlmICghcGVuZGluZ19hY3RpdmF0aW9uLT5zeXN0ZW1kX3NlcnZpY2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gY29weSBzeXN0ZW1kIHNlcnZpY2UgZm9yIHBlbmRpbmcgYWN0aXZhdGlvblxuIik7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIGJ1c19wZW5kaW5nX2FjdGl2YXRpb25fdW5yZWYgKHBlbmRpbmdfYWN0aXZhdGlvbik7CisgICAgICAgICAgICAgIGJ1c19wZW5kaW5nX2FjdGl2YXRpb25fZW50cnlfZnJlZSAocGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5KTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+dGltZW91dCA9CisgICAgICAgIF9kYnVzX3RpbWVvdXRfbmV3IChidXNfY29udGV4dF9nZXRfYWN0aXZhdGlvbl90aW1lb3V0IChhY3RpdmF0aW9uLT5jb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbl90aW1lZF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIGlmICghcGVuZGluZ19hY3RpdmF0aW9uLT50aW1lb3V0KQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBjcmVhdGUgdGltZW91dCBmb3IgcGVuZGluZyBhY3RpdmF0aW9uXG4iKTsKKworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl91bnJlZiAocGVuZGluZ19hY3RpdmF0aW9uKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5X2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfbG9vcF9hZGRfdGltZW91dCAoYnVzX2NvbnRleHRfZ2V0X2xvb3AgKGFjdGl2YXRpb24tPmNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPnRpbWVvdXQpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBhZGQgdGltZW91dCBmb3IgcGVuZGluZyBhY3RpdmF0aW9uXG4iKTsKKworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl91bnJlZiAocGVuZGluZ19hY3RpdmF0aW9uKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5X2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+dGltZW91dF9hZGRlZCA9IFRSVUU7CisKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZwZW5kaW5nX2FjdGl2YXRpb24tPmVudHJpZXMsIHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGFkZCBlbnRyeSB0byBqdXN0LWNyZWF0ZWQgcGVuZGluZyBhY3RpdmF0aW9uXG4iKTsKKworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl91bnJlZiAocGVuZGluZ19hY3RpdmF0aW9uKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5X2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+bl9lbnRyaWVzICs9IDE7CisgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPmFjdGl2YXRpb24tPm5fcGVuZGluZ19hY3RpdmF0aW9ucyArPSAxOworCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZyAoYWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24pKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBwdXQgcGVuZGluZyBhY3RpdmF0aW9uIGluIGhhc2ggdGFibGVcbiIpOworCisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX3VucmVmIChwZW5kaW5nX2FjdGl2YXRpb24pOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoIWFkZF9jYW5jZWxfcGVuZGluZ190b190cmFuc2FjdGlvbiAodHJhbnNhY3Rpb24sIHBlbmRpbmdfYWN0aXZhdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBhZGQgcGVuZGluZyBhY3RpdmF0aW9uIGNhbmNlbCBob29rIHRvIHRyYW5zYWN0aW9uXG4iKTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcgKGFjdGl2YXRpb24tPnBlbmRpbmdfYWN0aXZhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+c2VydmljZV9uYW1lKTsKKworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAod2FzX3BlbmRpbmdfYWN0aXZhdGlvbikKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoYnVzX2NvbnRleHRfZ2V0X3N5c3RlbWRfYWN0aXZhdGlvbiAoYWN0aXZhdGlvbi0+Y29udGV4dCkpCisgICAgeworICAgICAgaWYgKHN0cmNtcCAoc2VydmljZV9uYW1lLCAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxIikgPT0gMCkKKyAgICAgICAgICAvKiBzeXN0ZW1kIGl0c2VsZiBpcyBtaXNzaW5nIGFwcGFyZW50bHkuIFRoYXQgY2FuIGhhcHBlbgorICAgICAgICAgICAgIG9ubHkgZHVyaW5nIGVhcmx5IHN0YXJ0dXAuIExldCdzIGp1c3Qgd2FpdCB1bnRpbCBzeXN0ZW1kCisgICAgICAgICAgICAgY29ubmVjdHMgdG8gdXMgYW5kIGRvIG5vdGhpbmcuICovCisgICAgICAgIHJldHVybiBUUlVFOworCisgICAgICBpZiAoZW50cnktPnN5c3RlbWRfc2VydmljZSkKKyAgICAgICAgeworICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICphY3RpdmF0aW9uX3RyYW5zYWN0aW9uOworICAgICAgICAgIERCdXNTdHJpbmcgc2VydmljZV9zdHJpbmc7CisgICAgICAgICAgQnVzU2VydmljZSAqc2VydmljZTsKKyAgICAgICAgICBCdXNSZWdpc3RyeSAqcmVnaXN0cnk7CisKKyAgICAgICAgICAvKiBPSywgd2UgaGF2ZSBhIHN5c3RlbWQgc2VydmljZSBjb25maWd1cmVkIGZvciB0aGlzIGVudHJ5LAorICAgICAgICAgICAgIGhlbmNlIGxldCdzIGVucXVldWUgYW4gYWN0aXZhdGlvbiByZXF1ZXN0IG1lc3NhZ2UuIFRoaXMKKyAgICAgICAgICAgICBpcyBpbXBsZW1lbnRlZCBhcyBhIGRpcmVjdGVkIHNpZ25hbCwgbm90IGEgbWV0aG9kIGNhbGwsCisgICAgICAgICAgICAgZm9yIHRocmVlIHJlYXNvbnM6IDEpIHdlIGRvbid0IGV4cGVjdCBhIHJlc3BvbnNlIG9uCisgICAgICAgICAgICAgc3VjY2Vzcywgd2hlcmUgd2UganVzdCBleHBlY3QgYSBuYW1lIGFwcGVhcmluZyBvbiB0aGUKKyAgICAgICAgICAgICBidXM7IDIpIGF0IHRoaXMgdGltZSB0aGUgc3lzdGVtZCBzZXJ2aWNlIG1pZ2h0IG5vdCB5ZXQKKyAgICAgICAgICAgICBoYXZlIGNvbm5lY3RlZCwgc28gd2Ugd291bGRuJ3Qga25vdyB0aGUgbWVzc2FnZSBzZXJpYWwgYXQKKyAgICAgICAgICAgICB0aGlzIHBvaW50IHRvIHNldCB1cCBhIHBlbmRpbmcgY2FsbDsgMykgaXQgaXMgdWdseSBpZiB0aGUKKyAgICAgICAgICAgICBidXMgc3VkZGVubHkgYmVjb21lcyB0aGUgY2FsbGVyIG9mIGEgcmVtb3RlIG1ldGhvZC4gKi8KKworICAgICAgICAgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxLkFjdGl2YXRvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWN0aXZhdGlvblJlcXVlc3QiKTsKKyAgICAgICAgICBpZiAoIW1lc3NhZ2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBtZW1vcnkgdG8gY3JlYXRlIGFjdGl2YXRpb24gbWVzc2FnZVxuIik7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX3NldF9zZW5kZXIgKG1lc3NhZ2UsIERCVVNfU0VSVklDRV9EQlVTKSB8fAorICAgICAgICAgICAgICAhZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAobWVzc2FnZSwgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMSIpIHx8CisgICAgICAgICAgICAgICFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZlbnRyeS0+c3lzdGVtZF9zZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBtZW1vcnkgdG8gc2V0IGFyZ3Mgb2YgYWN0aXZhdGlvbiBtZXNzYWdlXG4iKTsKKyAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgLyogQ3JlYXRlIG91ciB0cmFuc2FjdGlvbiAqLworICAgICAgICAgIGFjdGl2YXRpb25fdHJhbnNhY3Rpb24gPSBidXNfdHJhbnNhY3Rpb25fbmV3IChhY3RpdmF0aW9uLT5jb250ZXh0KTsKKyAgICAgICAgICBpZiAoYWN0aXZhdGlvbl90cmFuc2FjdGlvbiA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiTm8gbWVtb3J5IHRvIGNyZWF0ZSBhY3RpdmF0aW9uIHRyYW5zYWN0aW9uXG4iKTsKKyAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgLyogQ2hlY2sgd2hldGhlciBzeXN0ZW1kIGlzIGFscmVhZHkgY29ubmVjdGVkICovCisgICAgICAgICAgcmVnaXN0cnkgPSBidXNfY29ubmVjdGlvbl9nZXRfcmVnaXN0cnkgKGNvbm5lY3Rpb24pOworICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc2VydmljZV9zdHJpbmcsICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEiKTsKKyAgICAgICAgICBzZXJ2aWNlID0gYnVzX3JlZ2lzdHJ5X2xvb2t1cCAocmVnaXN0cnksICZzZXJ2aWNlX3N0cmluZyk7CisKKyAgICAgICAgICBpZiAoc2VydmljZSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBidXNfY29udGV4dF9sb2cgKGFjdGl2YXRpb24tPmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TWVNURU1fTE9HX0lORk8sICJBY3RpdmF0aW5nIHZpYSBzeXN0ZW1kOiBzZXJ2aWNlIG5hbWU9JyVzJyB1bml0PSclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+c3lzdGVtZF9zZXJ2aWNlKTsKKyAgICAgICAgICAgICAgLyogV29uZGVyZnVsLCBzeXN0ZW1kIGlzIGNvbm5lY3RlZCwgbGV0J3MganVzdCBzZW5kIHRoZSBtc2cgKi8KKyAgICAgICAgICAgICAgcmV0dmFsID0gYnVzX2Rpc3BhdGNoX21hdGNoZXMgKGFjdGl2YXRpb25fdHJhbnNhY3Rpb24sIE5VTEwsIGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyc19jb25uZWN0aW9uIChzZXJ2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGVycm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2xvZyAoYWN0aXZhdGlvbi0+Y29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NZU1RFTV9MT0dfSU5GTywgIkFjdGl2YXRpbmcgc3lzdGVtZCB0byBoYW5kLW9mZjogc2VydmljZSBuYW1lPSclcycgdW5pdD0nJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPnN5c3RlbWRfc2VydmljZSk7CisgICAgICAgICAgICAgIC8qIHN5c3RlbWQgaXMgbm90IGFyb3VuZCwgbGV0J3MgImFjdGl2YXRlIiBpdC4gKi8KKyAgICAgICAgICAgICAgcmV0dmFsID0gYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSAoYWN0aXZhdGlvbiwgY29ubmVjdGlvbiwgYWN0aXZhdGlvbl90cmFuc2FjdGlvbiwgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMSIsIGVycm9yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgICAgICAgICBpZiAoIXJldHZhbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnVzX2NvbnRleHRfbG9nIChhY3RpdmF0aW9uLT5jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU1lTVEVNX0xPR19JTkZPLCAiRmFpbGVkIHRvIGFjdGl2YXRlIHZpYSBzeXN0ZW1kOiBzZXJ2aWNlIG5hbWU9JyVzJyB1bml0PSclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+c3lzdGVtZF9zZXJ2aWNlKTsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiZmFpbGVkIHRvIHNlbmQgYWN0aXZhdGlvbiBtZXNzYWdlOiAlc1xuIiwgZXJyb3ItPm5hbWUpOworICAgICAgICAgICAgICBidXNfdHJhbnNhY3Rpb25fY2FuY2VsX2FuZF9mcmVlIChhY3RpdmF0aW9uX3RyYW5zYWN0aW9uKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgYnVzX3RyYW5zYWN0aW9uX2V4ZWN1dGVfYW5kX2ZyZWUgKGFjdGl2YXRpb25fdHJhbnNhY3Rpb24pOworICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisKKyAgICAgIC8qIE9LLCB3ZSBoYXZlIG5vIGNvbmZpZ3VyZWQgc3lzdGVtZCBzZXJ2aWNlLCBoZW5jZSBsZXQncworICAgICAgICAgcHJvY2VlZCB3aXRoIHRyYWRpdGlvbmFsIGFjdGl2YXRpb24uICovCisgICAgfQorCisgIC8qIHVzZSBjb21tYW5kIGFzIHN5c3RlbSBhbmQgc2Vzc2lvbiBkaWZmZXJlbnQgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNvbW1hbmQpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIGRvZXMgdGhlIGJ1cyB1c2UgYSBoZWxwZXI/ICovCisgIHNlcnZpY2VoZWxwZXIgPSBidXNfY29udGV4dF9nZXRfc2VydmljZWhlbHBlciAoYWN0aXZhdGlvbi0+Y29udGV4dCk7CisgIGlmIChzZXJ2aWNlaGVscGVyICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGVudHJ5LT51c2VyID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbW1hbmQpOworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9GSUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgZG8gc3lzdGVtLWJ1cyBhY3RpdmF0aW9uIHdpdGggbm8gdXNlclxuIik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIC8qIGpvaW4gdGhlIGhlbHBlciBwYXRoIGFuZCB0aGUgc2VydmljZSBuYW1lICovCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZjb21tYW5kLCBzZXJ2aWNlaGVscGVyKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmY29tbWFuZCk7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmNvbW1hbmQsICIgIikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbW1hbmQpOworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZjb21tYW5kLCBzZXJ2aWNlX25hbWUpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb21tYW5kKTsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIHRoZSBidXMgZG9lcyBub3QgdXNlIGEgaGVscGVyLCBzbyB3ZSBjYW4gYXBwZW5kIGFyZ3VtZW50cyB3aXRoIHRoZSBleGVjIGxpbmUgKi8KKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmNvbW1hbmQsIGVudHJ5LT5leGVjKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmY29tbWFuZCk7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogY29udmVydCBjb21tYW5kIGludG8gYXJndW1lbnRzICovCisgIGlmICghX2RidXNfc2hlbGxfcGFyc2VfYXJndiAoX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmY29tbWFuZCksICZhcmdjLCAmYXJndiwgZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gcGFyc2UgY29tbWFuZCBsaW5lOiAlc1xuIiwgZW50cnktPmV4ZWMpOworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworCisgICAgICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcgKGFjdGl2YXRpb24tPnBlbmRpbmdfYWN0aXZhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+c2VydmljZV9uYW1lKTsKKworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb21tYW5kKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29tbWFuZCk7CisKKyAgaWYgKCFhZGRfYnVzX2Vudmlyb25tZW50IChhY3RpdmF0aW9uLCBlcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoYXJndik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGVudnAgPSBidXNfYWN0aXZhdGlvbl9nZXRfZW52aXJvbm1lbnQgKGFjdGl2YXRpb24pOworCisgIGlmIChlbnZwID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGFyZ3YpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiU3Bhd25pbmcgJXMgLi4uXG4iLCBhcmd2WzBdKTsKKyAgaWYgKHNlcnZpY2VoZWxwZXIgIT0gTlVMTCkKKyAgICBidXNfY29udGV4dF9sb2cgKGFjdGl2YXRpb24tPmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX1NZU1RFTV9MT0dfSU5GTywgIkFjdGl2YXRpbmcgc2VydmljZSBuYW1lPSclcycgKHVzaW5nIHNlcnZpY2VoZWxwZXIpIiwKKyAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSk7CisgIGVsc2UKKyAgICBidXNfY29udGV4dF9sb2cgKGFjdGl2YXRpb24tPmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX1NZU1RFTV9MT0dfSU5GTywgIkFjdGl2YXRpbmcgc2VydmljZSBuYW1lPSclcyciLAorICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lKTsKKworICBkYnVzX2Vycm9yX2luaXQgKCZ0bXBfZXJyb3IpOworCisgIGlmICghX2RidXNfc3Bhd25fYXN5bmNfd2l0aF9iYWJ5c2l0dGVyICgmcGVuZGluZ19hY3RpdmF0aW9uLT5iYWJ5c2l0dGVyLCBhcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGFjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wX2Vycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIHNwYXduIGNoaWxkXG4iKTsKKyAgICAgIGJ1c19jb250ZXh0X2xvZyAoYWN0aXZhdGlvbi0+Y29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgREJVU19TWVNURU1fTE9HX0lORk8sICJGYWlsZWQgdG8gYWN0aXZhdGUgc2VydmljZSAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIHRtcF9lcnJvci5tZXNzYWdlKTsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZ0bXBfZXJyb3IpOworICAgICAgZGJ1c19tb3ZlX2Vycm9yICgmdG1wX2Vycm9yLCBlcnJvcik7CisgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChhcmd2KTsKKyAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGVudnApOworCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGFyZ3YpOworICBlbnZwID0gTlVMTDsKKworICBfZGJ1c19hc3NlcnQgKHBlbmRpbmdfYWN0aXZhdGlvbi0+YmFieXNpdHRlciAhPSBOVUxMKTsKKworICBfZGJ1c19iYWJ5c2l0dGVyX3NldF9yZXN1bHRfZnVuY3Rpb24gKHBlbmRpbmdfYWN0aXZhdGlvbi0+YmFieXNpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb25fZmluaXNoZWRfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ19hY3RpdmF0aW9uKTsKKworICBpZiAoIV9kYnVzX2JhYnlzaXR0ZXJfc2V0X3dhdGNoX2Z1bmN0aW9ucyAocGVuZGluZ19hY3RpdmF0aW9uLT5iYWJ5c2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2JhYnlzaXR0ZXJfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfYmFieXNpdHRlcl93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZV9iYWJ5c2l0dGVyX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ19hY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gc2V0IGJhYnlzaXR0ZXIgd2F0Y2ggZnVuY3Rpb25zXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90CitidXNfYWN0aXZhdGlvbl9saXN0X3NlcnZpY2VzIChCdXNBY3RpdmF0aW9uICphY3RpdmF0aW9uLAorCQkJICAgICAgY2hhciAgICAgICAgKioqbGlzdHAsCisJCQkgICAgICBpbnQgICAgICAgICAgICphcnJheV9sZW4pCit7CisgIGludCBpLCBqLCBsZW47CisgIGNoYXIgKipyZXR2YWw7CisgIERCdXNIYXNoSXRlciBpdGVyOworCisgIGxlbiA9IF9kYnVzX2hhc2hfdGFibGVfZ2V0X25fZW50cmllcyAoYWN0aXZhdGlvbi0+ZW50cmllcyk7CisgIHJldHZhbCA9IGRidXNfbmV3IChjaGFyICosIGxlbiArIDEpOworCisgIGlmIChyZXR2YWwgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfaGFzaF9pdGVyX2luaXQgKGFjdGl2YXRpb24tPmVudHJpZXMsICZpdGVyKTsKKyAgaSA9IDA7CisgIHdoaWxlIChfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgIHsKKyAgICAgIEJ1c0FjdGl2YXRpb25FbnRyeSAqZW50cnkgPSBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlICgmaXRlcik7CisKKyAgICAgIHJldHZhbFtpXSA9IF9kYnVzX3N0cmR1cCAoZW50cnktPm5hbWUpOworICAgICAgaWYgKHJldHZhbFtpXSA9PSBOVUxMKQorCWdvdG8gZXJyb3I7CisKKyAgICAgIGkrKzsKKyAgICB9CisKKyAgcmV0dmFsW2ldID0gTlVMTDsKKworICBpZiAoYXJyYXlfbGVuKQorICAgICphcnJheV9sZW4gPSBsZW47CisKKyAgKmxpc3RwID0gcmV0dmFsOworICByZXR1cm4gVFJVRTsKKworIGVycm9yOgorICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorICAgIGRidXNfZnJlZSAocmV0dmFsW2ldKTsKKyAgZGJ1c19mcmVlIChyZXR2YWwpOworCisgIHJldHVybiBGQUxTRTsKK30KKworZGJ1c19ib29sX3QKK2RidXNfYWN0aXZhdGlvbl9zeXN0ZW1kX2ZhaWx1cmUgKEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICptZXNzYWdlKQoreworICBEQnVzRXJyb3IgZXJyb3I7CisgIGNvbnN0IGNoYXIgKmNvZGUsICpzdHIsICp1bml0ID0gTlVMTDsKKworICBkYnVzX2Vycm9yX2luaXQoJmVycm9yKTsKKworICAvKiBUaGlzIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgc3lzdGVtZCBhY3RpdmF0b3Igc2VudCB1cyBhCisgICAgIHJlc3BvbnNlLiBXZSdsbCBpbnZhbGlkYXRlIGFsbCBwZW5kaW5nIGFjdGl2YXRpb25zIHRoYXQgbWF0Y2ggdGhlCisgICAgIHVuaXQgbmFtZS4gKi8KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZ1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIGRidXNfc2V0X2Vycm9yKCZlcnJvciwgY29kZSwgc3RyKTsKKworCisgIGlmICh1bml0KQorICAgIHsKKyAgICAgIERCdXNIYXNoSXRlciBpdGVyOworCisgICAgICBidXNfY29udGV4dF9sb2cgKGFjdGl2YXRpb24tPmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU1lTVEVNX0xPR19JTkZPLCAiQWN0aXZhdGlvbiB2aWEgc3lzdGVtZCBmYWlsZWQgZm9yIHVuaXQgJyVzJzogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICB1bml0LAorICAgICAgICAgICAgICAgICAgICAgICBzdHIpOworCisgICAgICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAoYWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlcik7CisKKyAgICAgIHdoaWxlIChfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgICAgICB7CisgICAgICAgICAgQnVzUGVuZGluZ0FjdGl2YXRpb24gKnAgPSBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlICgmaXRlcik7CisKKyAgICAgICAgICBpZiAocC0+c3lzdGVtZF9zZXJ2aWNlICYmIHN0cmNtcCAocC0+c3lzdGVtZF9zZXJ2aWNlLCB1bml0KSA9PSAwKQorICAgICAgICAgICAgcGVuZGluZ19hY3RpdmF0aW9uX2ZhaWxlZChwLCAmZXJyb3IpOworICAgICAgICB9CisgICAgfQorCisgIGRidXNfZXJyb3JfZnJlZSgmZXJyb3IpOworCisgIHJldHVybiBUUlVFOworfQorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2RlZmluZSBTRVJWSUNFX05BTUVfMSAiTXlTZXJ2aWNlMSIKKyNkZWZpbmUgU0VSVklDRV9OQU1FXzIgIk15U2VydmljZTIiCisjZGVmaW5lIFNFUlZJQ0VfTkFNRV8zICJNeVNlcnZpY2UzIgorCisjZGVmaW5lIFNFUlZJQ0VfRklMRV8xICJzZXJ2aWNlLTEuc2VydmljZSIKKyNkZWZpbmUgU0VSVklDRV9GSUxFXzIgInNlcnZpY2UtMi5zZXJ2aWNlIgorI2RlZmluZSBTRVJWSUNFX0ZJTEVfMyAic2VydmljZS0zLnNlcnZpY2UiCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAordGVzdF9jcmVhdGVfc2VydmljZV9maWxlIChEQnVzU3RyaW5nICpkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpleGVjKQoreworICBEQnVzU3RyaW5nICBmaWxlX25hbWUsIGZ1bGxfcGF0aDsKKyAgRklMRSAgICAgICAgKmZpbGU7CisgIGRidXNfYm9vbF90ICByZXRfdmFsOworCisgIHJldF92YWwgPSBUUlVFOworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmZpbGVfbmFtZSwgZmlsZW5hbWUpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsX3BhdGgpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZmdWxsX3BhdGgsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZGlyKSkgfHwKKyAgICAgICFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmZnVsbF9wYXRoLCAmZmlsZV9uYW1lKSkKKyAgICB7CisgICAgICByZXRfdmFsID0gRkFMU0U7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgZmlsZSA9IGZvcGVuIChfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmdWxsX3BhdGgpLCAidyIpOworICBpZiAoIWZpbGUpCisgICAgeworICAgICAgcmV0X3ZhbCA9IEZBTFNFOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGZwcmludGYgKGZpbGUsICJbRC1CVVMgU2VydmljZV1cbk5hbWU9JXNcbkV4ZWM9JXNcbiIsIG5hbWUsIGV4ZWMpOworICBmY2xvc2UgKGZpbGUpOworCitvdXQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgcmV0dXJuIHJldF92YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAordGVzdF9yZW1vdmVfc2VydmljZV9maWxlIChEQnVzU3RyaW5nICpkaXIsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICBEQnVzU3RyaW5nICBmaWxlX25hbWUsIGZ1bGxfcGF0aDsKKyAgZGJ1c19ib29sX3QgcmV0X3ZhbDsKKworICByZXRfdmFsID0gVFJVRTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmZpbGVfbmFtZSwgZmlsZW5hbWUpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsX3BhdGgpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZmdWxsX3BhdGgsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZGlyKSkgfHwKKyAgICAgICFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmZnVsbF9wYXRoLCAmZmlsZV9uYW1lKSkKKyAgICB7CisgICAgICByZXRfdmFsID0gRkFMU0U7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19kZWxldGVfZmlsZSAoJmZ1bGxfcGF0aCwgTlVMTCkpCisgICAgeworICAgICAgcmV0X3ZhbCA9IEZBTFNFOworICAgICAgZ290byBvdXQ7CisgICAgfQorCitvdXQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgcmV0dXJuIHJldF92YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAordGVzdF9yZW1vdmVfZGlyZWN0b3J5IChEQnVzU3RyaW5nICpkaXIpCit7CisgIERCdXNEaXJJdGVyICppdGVyOworICBEQnVzU3RyaW5nICAgZmlsZW5hbWUsIGZ1bGxfcGF0aDsKKyAgZGJ1c19ib29sX3QgIHJldF92YWw7CisKKyAgcmV0X3ZhbCA9IFRSVUU7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZpbGVuYW1lKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfcGF0aCkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGl0ZXIgPSBfZGJ1c19kaXJlY3Rvcnlfb3BlbiAoZGlyLCBOVUxMKTsKKyAgaWYgKGl0ZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICByZXRfdmFsID0gRkFMU0U7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgd2hpbGUgKF9kYnVzX2RpcmVjdG9yeV9nZXRfbmV4dF9maWxlIChpdGVyLCAmZmlsZW5hbWUsIE5VTEwpKQorICAgIHsKKyAgICAgIGlmICghdGVzdF9yZW1vdmVfc2VydmljZV9maWxlIChkaXIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVuYW1lKSkpCisgICAgICAgIHsKKyAgICAgICAgICByZXRfdmFsID0gRkFMU0U7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgIF9kYnVzX2RpcmVjdG9yeV9jbG9zZSAoaXRlcik7CisKKyAgaWYgKCFfZGJ1c19kZWxldGVfZGlyZWN0b3J5IChkaXIsIE5VTEwpKQorICAgIHsKKyAgICAgIHJldF92YWwgPSBGQUxTRTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworCisgIHJldHVybiByZXRfdmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2luaXRfc2VydmljZV9yZWxvYWRfdGVzdCAoREJ1c1N0cmluZyAqZGlyKQoreworICBEQnVzU3RhdCBzdGF0X2J1ZjsKKworICBpZiAoIV9kYnVzX3N0YXQgKGRpciwgJnN0YXRfYnVmLCBOVUxMKSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2NyZWF0ZV9kaXJlY3RvcnkgKGRpciwgTlVMTCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIXRlc3RfcmVtb3ZlX2RpcmVjdG9yeSAoZGlyKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoIV9kYnVzX2NyZWF0ZV9kaXJlY3RvcnkgKGRpciwgTlVMTCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogQ3JlYXRlIG9uZSBpbml0aWFsIGZpbGUgKi8KKyAgaWYgKCF0ZXN0X2NyZWF0ZV9zZXJ2aWNlX2ZpbGUgKGRpciwgU0VSVklDRV9GSUxFXzEsIFNFUlZJQ0VfTkFNRV8xLCAiZXhlYy0xIikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NsZWFudXBfc2VydmljZV9yZWxvYWRfdGVzdCAoREJ1c1N0cmluZyAqZGlyKQoreworICBpZiAoIXRlc3RfcmVtb3ZlX2RpcmVjdG9yeSAoZGlyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb247CisgIGNvbnN0IGNoYXIgICAgKnNlcnZpY2VfbmFtZTsKKyAgZGJ1c19ib29sX3QgICAgZXhwZWN0aW5nX2ZpbmQ7Cit9IENoZWNrRGF0YTsKKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19mdW5jICh2b2lkICpkYXRhKQoreworICBDaGVja0RhdGEgICAgICAgICAgKmQ7CisgIEJ1c0FjdGl2YXRpb25FbnRyeSAqZW50cnk7CisgIERCdXNFcnJvciAgICAgICAgICAgZXJyb3I7CisgIGRidXNfYm9vbF90ICAgICAgICAgcmV0X3ZhbDsKKworICByZXRfdmFsID0gVFJVRTsKKyAgZCA9IGRhdGE7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIGVudHJ5ID0gYWN0aXZhdGlvbl9maW5kX2VudHJ5IChkLT5hY3RpdmF0aW9uLCBkLT5zZXJ2aWNlX25hbWUsICZlcnJvcik7CisgIGlmIChlbnRyeSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgeworICAgICAgICAgIHJldF92YWwgPSBUUlVFOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZC0+ZXhwZWN0aW5nX2ZpbmQpCisgICAgICAgICAgICByZXRfdmFsID0gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghZC0+ZXhwZWN0aW5nX2ZpbmQpCisgICAgICAgIHJldF92YWwgPSBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIHJldF92YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZG9fdGVzdCAoY29uc3QgY2hhciAqZGVzY3JpcHRpb24sIGRidXNfYm9vbF90IG9vbV90ZXN0LCBDaGVja0RhdGEgKmRhdGEpCit7CisgIGRidXNfYm9vbF90IGVycjsKKworICBpZiAob29tX3Rlc3QpCisgICAgZXJyID0gIV9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nIChkZXNjcmlwdGlvbiwgY2hlY2tfZnVuYywgZGF0YSk7CisgIGVsc2UKKyAgICBlcnIgPSAhY2hlY2tfZnVuYyAoZGF0YSk7CisKKyAgaWYgKGVycikKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJUZXN0IGZhaWxlZCIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2RvX3NlcnZpY2VfcmVsb2FkX3Rlc3QgKERCdXNTdHJpbmcgKmRpciwgZGJ1c19ib29sX3Qgb29tX3Rlc3QpCit7CisgIEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb247CisgIERCdXNTdHJpbmcgICAgIGFkZHJlc3M7CisgIERCdXNMaXN0ICAgICAgKmRpcmVjdG9yaWVzOworICBDaGVja0RhdGEgICAgICBkOworCisgIGRpcmVjdG9yaWVzID0gTlVMTDsKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZhZGRyZXNzLCAiIik7CisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmRpcmVjdG9yaWVzLCBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKGRpcikpKQorICAgIHJldHVybiBGQUxTRTsKKworICBhY3RpdmF0aW9uID0gYnVzX2FjdGl2YXRpb25fbmV3IChOVUxMLCAmYWRkcmVzcywgJmRpcmVjdG9yaWVzLCBOVUxMKTsKKyAgaWYgKCFhY3RpdmF0aW9uKQorICAgIHJldHVybiBGQUxTRTsKKworICBkLmFjdGl2YXRpb24gPSBhY3RpdmF0aW9uOworCisgIC8qIENoZWNrIGZvciBleGlzdGluZyBzZXJ2aWNlIGZpbGUgKi8KKyAgZC5leHBlY3RpbmdfZmluZCA9IFRSVUU7CisgIGQuc2VydmljZV9uYW1lID0gU0VSVklDRV9OQU1FXzE7CisKKyAgaWYgKCFkb190ZXN0ICgiRXhpc3Rpbmcgc2VydmljZSBmaWxlIiwgb29tX3Rlc3QsICZkKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogQ2hlY2sgZm9yIG5vbi1leGlzdGluZyBzZXJ2aWNlIGZpbGUgKi8KKyAgZC5leHBlY3RpbmdfZmluZCA9IEZBTFNFOworICBkLnNlcnZpY2VfbmFtZSA9IFNFUlZJQ0VfTkFNRV8zOworCisgIGlmICghZG9fdGVzdCAoIk5vbmV4aXN0aW5nIHNlcnZpY2UgZmlsZSIsIG9vbV90ZXN0LCAmZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIENoZWNrIGZvciBhZGRlZCBzZXJ2aWNlIGZpbGUgKi8KKyAgaWYgKCF0ZXN0X2NyZWF0ZV9zZXJ2aWNlX2ZpbGUgKGRpciwgU0VSVklDRV9GSUxFXzIsIFNFUlZJQ0VfTkFNRV8yLCAiZXhlYy0yIikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGQuZXhwZWN0aW5nX2ZpbmQgPSBUUlVFOworICBkLnNlcnZpY2VfbmFtZSA9IFNFUlZJQ0VfTkFNRV8yOworCisgIGlmICghZG9fdGVzdCAoIkFkZGVkIHNlcnZpY2UgZmlsZSIsIG9vbV90ZXN0LCAmZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIENoZWNrIGZvciByZW1vdmVkIHNlcnZpY2UgZmlsZSAqLworICBpZiAoIXRlc3RfcmVtb3ZlX3NlcnZpY2VfZmlsZSAoZGlyLCBTRVJWSUNFX0ZJTEVfMikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGQuZXhwZWN0aW5nX2ZpbmQgPSBGQUxTRTsKKyAgZC5zZXJ2aWNlX25hbWUgPSBTRVJWSUNFX0ZJTEVfMjsKKworICBpZiAoIWRvX3Rlc3QgKCJSZW1vdmVkIHNlcnZpY2UgZmlsZSIsIG9vbV90ZXN0LCAmZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIENoZWNrIGZvciB1cGRhdGVkIHNlcnZpY2UgZmlsZSAqLworCisgIF9kYnVzX3NsZWVwX21pbGxpc2Vjb25kcyAoMTAwMCk7IC8qIFNsZWVwIGEgc2Vjb25kIHRvIG1ha2Ugc3VyZSB0aGUgbXRpbWUgaXMgdXBkYXRlZCAqLworCisgIGlmICghdGVzdF9jcmVhdGVfc2VydmljZV9maWxlIChkaXIsIFNFUlZJQ0VfRklMRV8xLCBTRVJWSUNFX05BTUVfMywgImV4ZWMtMyIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBkLmV4cGVjdGluZ19maW5kID0gVFJVRTsKKyAgZC5zZXJ2aWNlX25hbWUgPSBTRVJWSUNFX05BTUVfMzsKKworICBpZiAoIWRvX3Rlc3QgKCJVcGRhdGVkIHNlcnZpY2UgZmlsZSwgcGFydCAxIiwgb29tX3Rlc3QsICZkKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZC5leHBlY3RpbmdfZmluZCA9IEZBTFNFOworICBkLnNlcnZpY2VfbmFtZSA9IFNFUlZJQ0VfTkFNRV8xOworCisgIGlmICghZG9fdGVzdCAoIlVwZGF0ZWQgc2VydmljZSBmaWxlLCBwYXJ0IDIiLCBvb21fdGVzdCwgJmQpKQorICAgIHJldHVybiBGQUxTRTsKKworICBidXNfYWN0aXZhdGlvbl91bnJlZiAoYWN0aXZhdGlvbik7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZkaXJlY3Rvcmllcyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90CitidXNfYWN0aXZhdGlvbl9zZXJ2aWNlX3JlbG9hZF90ZXN0IChjb25zdCBEQnVzU3RyaW5nICp0ZXN0X2RhdGFfZGlyKQoreworICBEQnVzU3RyaW5nIGRpcmVjdG9yeTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZGlyZWN0b3J5KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZGlyZWN0b3J5LCBfZGJ1c19nZXRfdG1wZGlyKCkpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZkaXJlY3RvcnksICIvZGJ1cy1yZWxvYWQtdGVzdC0iKSB8fAorICAgICAgIV9kYnVzX2dlbmVyYXRlX3JhbmRvbV9hc2NpaSAoJmRpcmVjdG9yeSwgNikpCisgICAgIHsKKyAgICAgICByZXR1cm4gRkFMU0U7CisgICAgIH0KKworICAvKiBEbyBub3JtYWwgdGVzdHMgKi8KKyAgaWYgKCFpbml0X3NlcnZpY2VfcmVsb2FkX3Rlc3QgKCZkaXJlY3RvcnkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBpbml0aWF0ZSBzZXJ2aWNlIHJlbG9hZCB0ZXN0Iik7CisKKyAgaWYgKCFkb19zZXJ2aWNlX3JlbG9hZF90ZXN0ICgmZGlyZWN0b3J5LCBGQUxTRSkpCisgICAgeworICAgICAgLyogRG8gbm90aGluZz8gKi8KKyAgICB9CisKKyAgLyogRG8gT09NIHRlc3RzICovCisgIGlmICghaW5pdF9zZXJ2aWNlX3JlbG9hZF90ZXN0ICgmZGlyZWN0b3J5KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgaW5pdGlhdGUgc2VydmljZSByZWxvYWQgdGVzdCIpOworCisgIGlmICghZG9fc2VydmljZV9yZWxvYWRfdGVzdCAoJmRpcmVjdG9yeSwgVFJVRSkpCisgICAgeworICAgICAgLyogRG8gbm90aGluZz8gKi8KKyAgICB9CisKKyAgLyogQ2xlYW51cCB0ZXN0IGRpcmVjdG9yeSAqLworICBpZiAoIWNsZWFudXBfc2VydmljZV9yZWxvYWRfdGVzdCAoJmRpcmVjdG9yeSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmZGlyZWN0b3J5KTsKKworICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMvYnVzL2FjdGl2YXRpb24uaCBiL2RidXMvYnVzL2FjdGl2YXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2YyNWIxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9idXMvYWN0aXZhdGlvbi5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogYWN0aXZhdGlvbi5oICBBY3RpdmF0aW9uIG9mIHNlcnZpY2VzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBCVVNfQUNUSVZBVElPTl9ICisjZGVmaW5lIEJVU19BQ1RJVkFUSU9OX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisjaW5jbHVkZSAiYnVzLmgiCisKK0J1c0FjdGl2YXRpb24qIGJ1c19hY3RpdmF0aW9uX25ldyAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgICpjb250ZXh0LAorCQkJCQkJY29uc3QgREJ1c1N0cmluZyAgKmFkZHJlc3MsCisJCQkJCQlEQnVzTGlzdCAgICAgICAgICoqZGlyZWN0b3JpZXMsCisJCQkJCQlEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgYnVzX2FjdGl2YXRpb25fcmVsb2FkICAgICAgICAgICAoQnVzQWN0aXZhdGlvbiAgICAgKmFjdGl2YXRpb24sCisJCQkJCQljb25zdCBEQnVzU3RyaW5nICAqYWRkcmVzcywKKwkJCQkJCURCdXNMaXN0ICAgICAgICAgKipkaXJlY3RvcmllcywKKwkJCQkJCURCdXNFcnJvciAgICAgICAgICplcnJvcik7CitCdXNBY3RpdmF0aW9uKiBidXNfYWN0aXZhdGlvbl9yZWYgICAgICAgICAgICAgIChCdXNBY3RpdmF0aW9uICAgICAqYWN0aXZhdGlvbik7Cit2b2lkICAgICAgICAgICBidXNfYWN0aXZhdGlvbl91bnJlZiAgICAgICAgICAgIChCdXNBY3RpdmF0aW9uICAgICAqYWN0aXZhdGlvbik7CisKK2RidXNfYm9vbF90ICAgYnVzX2FjdGl2YXRpb25fc2V0X2Vudmlyb25tZW50X3ZhcmlhYmxlIChCdXNBY3RpdmF0aW9uICAgICAqYWN0aXZhdGlvbiwKKwkJCQkJCWNvbnN0IGNoYXIgICAgICAgICprZXksCisJCQkJCQljb25zdCBjaGFyICAgICAgICAqdmFsdWUsCisJCQkJCQlEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSAoQnVzQWN0aXZhdGlvbiAgICAgKmFjdGl2YXRpb24sCisJCQkJCQlEQnVzQ29ubmVjdGlvbiAgICAqY29ubmVjdGlvbiwKKwkJCQkJCUJ1c1RyYW5zYWN0aW9uICAgICp0cmFuc2FjdGlvbiwKKwkJCQkJCWRidXNfYm9vbF90ICAgICAgICBhdXRvX2FjdGl2YXRpb24sCisJCQkJCQlEQnVzTWVzc2FnZSAgICAgICAqYWN0aXZhdGlvbl9tZXNzYWdlLAorCQkJCQkJY29uc3QgY2hhciAgICAgICAgKnNlcnZpY2VfbmFtZSwKKwkJCQkJCURCdXNFcnJvciAgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICBidXNfYWN0aXZhdGlvbl9zZXJ2aWNlX2NyZWF0ZWQgIChCdXNBY3RpdmF0aW9uICAgICAqYWN0aXZhdGlvbiwKKwkJCQkJCWNvbnN0IGNoYXIgICAgICAgICpzZXJ2aWNlX25hbWUsCisJCQkJCQlCdXNUcmFuc2FjdGlvbiAgICAqdHJhbnNhY3Rpb24sCisJCQkJCQlEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgYnVzX2FjdGl2YXRpb25fbGlzdF9zZXJ2aWNlcyAgICAoQnVzQWN0aXZhdGlvbiAgICAgKnJlZ2lzdHJ5LAorCQkJCQkJY2hhciAgICAgICAgICAgICoqKmxpc3RwLAorCQkJCQkJaW50ICAgICAgICAgICAgICAgKmFycmF5X2xlbik7CitkYnVzX2Jvb2xfdCAgICBkYnVzX2FjdGl2YXRpb25fc3lzdGVtZF9mYWlsdXJlIChCdXNBY3RpdmF0aW9uICAgICAqYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICptZXNzYWdlKTsKKworZGJ1c19ib29sX3QgICAgYnVzX2FjdGl2YXRpb25fc2VuZF9wZW5kaW5nX2F1dG9fYWN0aXZhdGlvbl9tZXNzYWdlcyAoQnVzQWN0aXZhdGlvbiAgICAgKmFjdGl2YXRpb24sCisJCQkJCQkJCSAgICAgQnVzU2VydmljZSAgICAgICAgKnNlcnZpY2UsCisJCQkJCQkJCSAgICAgQnVzVHJhbnNhY3Rpb24gICAgKnRyYW5zYWN0aW9uLAorCQkJCQkJCQkgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcik7CisKKworI2VuZGlmIC8qIEJVU19BQ1RJVkFUSU9OX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvYnVzL2J1cy5jIGIvZGJ1cy9idXMvYnVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMyN2Y0NgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvYnVzL2J1cy5jCkBAIC0wLDAgKzEsMTY3MSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBidXMuYyAgbWVzc2FnZSBidXMgY29udGV4dCBvYmplY3QKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImJ1cy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImFjdGl2YXRpb24uaCIKKyNpbmNsdWRlICJjb25uZWN0aW9uLmgiCisjaW5jbHVkZSAic2VydmljZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInBvbGljeS5oIgorI2luY2x1ZGUgImNvbmZpZy1wYXJzZXIuaCIKKyNpbmNsdWRlICJzaWduYWxzLmgiCisjaW5jbHVkZSAic2VsaW51eC5oIgorI2luY2x1ZGUgImRpci13YXRjaC5oIgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWhhc2guaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtY3JlZGVudGlhbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisKKyNpZmRlZiBEQlVTX0NZR1dJTgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2VuZGlmCisKK3N0cnVjdCBCdXNDb250ZXh0Cit7CisgIGludCByZWZjb3VudDsKKyAgREJ1c0dVSUQgdXVpZDsKKyAgY2hhciAqY29uZmlnX2ZpbGU7CisgIGNoYXIgKnR5cGU7CisgIGNoYXIgKnNlcnZpY2VoZWxwZXI7CisgIGNoYXIgKmFkZHJlc3M7CisjaWZkZWYgV0FOVF9QSURGSUxFCisgIGNoYXIgKnBpZGZpbGU7CisjZW5kaWYKKyAgY2hhciAqdXNlcjsKKyAgY2hhciAqbG9nX3ByZWZpeDsKKyAgREJ1c0xvb3AgKmxvb3A7CisgIERCdXNMaXN0ICpzZXJ2ZXJzOworICBCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnM7CisgIEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb247CisgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKyAgQnVzUG9saWN5ICpwb2xpY3k7CisgIEJ1c01hdGNobWFrZXIgKm1hdGNobWFrZXI7CisgIEJ1c0xpbWl0cyBsaW1pdHM7CisgIHVuc2lnbmVkIGludCBmb3JrIDogMTsKKyAgdW5zaWduZWQgaW50IHN5c2xvZyA6IDE7CisgIHVuc2lnbmVkIGludCBrZWVwX3VtYXNrIDogMTsKKyAgdW5zaWduZWQgaW50IGFsbG93X2Fub255bW91cyA6IDE7CisgIHVuc2lnbmVkIGludCBzeXN0ZW1kX2FjdGl2YXRpb24gOiAxOworfTsKKworc3RhdGljIGRidXNfaW50MzJfdCBzZXJ2ZXJfZGF0YV9zbG90ID0gLTE7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7Cit9IEJ1c1NlcnZlckRhdGE7CisKKyNkZWZpbmUgQlVTX1NFUlZFUl9EQVRBKHNlcnZlcikgKGRidXNfc2VydmVyX2dldF9kYXRhICgoc2VydmVyKSwgc2VydmVyX2RhdGFfc2xvdCkpCisKK3N0YXRpYyBCdXNDb250ZXh0Kgorc2VydmVyX2dldF9jb250ZXh0IChEQnVzU2VydmVyICpzZXJ2ZXIpCit7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisgIEJ1c1NlcnZlckRhdGEgKmJkOworCisgIGlmICghZGJ1c19zZXJ2ZXJfYWxsb2NhdGVfZGF0YV9zbG90ICgmc2VydmVyX2RhdGFfc2xvdCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgYmQgPSBCVVNfU0VSVkVSX0RBVEEgKHNlcnZlcik7CisgIGlmIChiZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2VydmVyX2ZyZWVfZGF0YV9zbG90ICgmc2VydmVyX2RhdGFfc2xvdCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgY29udGV4dCA9IGJkLT5jb250ZXh0OworCisgIGRidXNfc2VydmVyX2ZyZWVfZGF0YV9zbG90ICgmc2VydmVyX2RhdGFfc2xvdCk7CisKKyAgcmV0dXJuIGNvbnRleHQ7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWRkX3NlcnZlcl93YXRjaCAoREJ1c1dhdGNoICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICpkYXRhKQoreworICBEQnVzU2VydmVyICpzZXJ2ZXIgPSBkYXRhOworICBCdXNDb250ZXh0ICpjb250ZXh0OworCisgIGNvbnRleHQgPSBzZXJ2ZXJfZ2V0X2NvbnRleHQgKHNlcnZlcik7CisKKyAgcmV0dXJuIF9kYnVzX2xvb3BfYWRkX3dhdGNoIChjb250ZXh0LT5sb29wLCB3YXRjaCk7Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfc2VydmVyX3dhdGNoIChEQnVzV2F0Y2ggICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgKmRhdGEpCit7CisgIERCdXNTZXJ2ZXIgKnNlcnZlciA9IGRhdGE7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisKKyAgY29udGV4dCA9IHNlcnZlcl9nZXRfY29udGV4dCAoc2VydmVyKTsKKworICBfZGJ1c19sb29wX3JlbW92ZV93YXRjaCAoY29udGV4dC0+bG9vcCwgd2F0Y2gpOworfQorCitzdGF0aWMgdm9pZAordG9nZ2xlX3NlcnZlcl93YXRjaCAoREJ1c1dhdGNoICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICpkYXRhKQoreworICBEQnVzU2VydmVyICpzZXJ2ZXIgPSBkYXRhOworICBCdXNDb250ZXh0ICpjb250ZXh0OworCisgIGNvbnRleHQgPSBzZXJ2ZXJfZ2V0X2NvbnRleHQgKHNlcnZlcik7CisKKyAgX2RidXNfbG9vcF90b2dnbGVfd2F0Y2ggKGNvbnRleHQtPmxvb3AsIHdhdGNoKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithZGRfc2VydmVyX3RpbWVvdXQgKERCdXNUaW1lb3V0ICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c1NlcnZlciAqc2VydmVyID0gZGF0YTsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKworICBjb250ZXh0ID0gc2VydmVyX2dldF9jb250ZXh0IChzZXJ2ZXIpOworCisgIHJldHVybiBfZGJ1c19sb29wX2FkZF90aW1lb3V0IChjb250ZXh0LT5sb29wLCB0aW1lb3V0KTsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9zZXJ2ZXJfdGltZW91dCAoREJ1c1RpbWVvdXQgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICpkYXRhKQoreworICBEQnVzU2VydmVyICpzZXJ2ZXIgPSBkYXRhOworICBCdXNDb250ZXh0ICpjb250ZXh0OworCisgIGNvbnRleHQgPSBzZXJ2ZXJfZ2V0X2NvbnRleHQgKHNlcnZlcik7CisKKyAgX2RidXNfbG9vcF9yZW1vdmVfdGltZW91dCAoY29udGV4dC0+bG9vcCwgdGltZW91dCk7Cit9CisKK3N0YXRpYyB2b2lkCituZXdfY29ubmVjdGlvbl9jYWxsYmFjayAoREJ1c1NlcnZlciAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqbmV3X2Nvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpCit7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQgPSBkYXRhOworCisgIGlmICghYnVzX2Nvbm5lY3Rpb25zX3NldHVwX2Nvbm5lY3Rpb24gKGNvbnRleHQtPmNvbm5lY3Rpb25zLCBuZXdfY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIG1lbW9yeSB0byBzZXR1cCBuZXcgY29ubmVjdGlvblxuIik7CisKKyAgICAgIC8qIGlmIHdlIGRvbid0IGRvIHRoaXMsIGl0IHdpbGwgZ2V0IHVucmVmJ2Qgd2l0aG91dAorICAgICAgICogYmVpbmcgZGlzY29ubmVjdGVkLi4uIGtpbmQgb2Ygc3RyYW5nZSByZWFsbHkKKyAgICAgICAqIHRoYXQgd2UgaGF2ZSB0byBkbyB0aGlzLCBwZW9wbGUgd29uJ3QgZ2V0IGl0IHJpZ2h0CisgICAgICAgKiBpbiBnZW5lcmFsLgorICAgICAgICovCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKG5ld19jb25uZWN0aW9uKTsKKyAgICB9CisKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfcmVjZWl2ZWRfc2l6ZSAobmV3X2Nvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmxpbWl0cy5tYXhfaW5jb21pbmdfYnl0ZXMpOworCisgIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X21lc3NhZ2Vfc2l6ZSAobmV3X2Nvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+bGltaXRzLm1heF9tZXNzYWdlX3NpemUpOworCisgIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X3JlY2VpdmVkX3VuaXhfZmRzIChuZXdfY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+bGltaXRzLm1heF9pbmNvbWluZ191bml4X2Zkcyk7CisKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfbWVzc2FnZV91bml4X2ZkcyAobmV3X2Nvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+bGltaXRzLm1heF9tZXNzYWdlX3VuaXhfZmRzKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X2FsbG93X2Fub255bW91cyAobmV3X2Nvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5hbGxvd19hbm9ueW1vdXMpOworCisgIC8qIG9uIE9PTSwgd2Ugd29uJ3QgaGF2ZSByZWYnZCB0aGUgY29ubmVjdGlvbiBzbyBpdCB3aWxsIGRpZS4gKi8KK30KKworc3RhdGljIHZvaWQKK2ZyZWVfc2VydmVyX2RhdGEgKHZvaWQgKmRhdGEpCit7CisgIEJ1c1NlcnZlckRhdGEgKmJkID0gZGF0YTsKKworICBkYnVzX2ZyZWUgKGJkKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZXR1cF9zZXJ2ZXIgKEJ1c0NvbnRleHQgKmNvbnRleHQsCisgICAgICAgICAgICAgIERCdXNTZXJ2ZXIgKnNlcnZlciwKKyAgICAgICAgICAgICAgY2hhciAgICAgICoqYXV0aF9tZWNoYW5pc21zLAorICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgQnVzU2VydmVyRGF0YSAqYmQ7CisKKyAgYmQgPSBkYnVzX25ldzAgKEJ1c1NlcnZlckRhdGEsIDEpOworICBpZiAoYmQgPT0gTlVMTCB8fCAhZGJ1c19zZXJ2ZXJfc2V0X2RhdGEgKHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfZGF0YV9zbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJkLCBmcmVlX3NlcnZlcl9kYXRhKSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKGJkKTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGJkLT5jb250ZXh0ID0gY29udGV4dDsKKworICBpZiAoIWRidXNfc2VydmVyX3NldF9hdXRoX21lY2hhbmlzbXMgKHNlcnZlciwgKGNvbnN0IGNoYXIqKikgYXV0aF9tZWNoYW5pc21zKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkYnVzX3NlcnZlcl9zZXRfbmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb24gKHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfY29ubmVjdGlvbl9jYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBOVUxMKTsKKworICBpZiAoIWRidXNfc2VydmVyX3NldF93YXRjaF9mdW5jdGlvbnMgKHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfc2VydmVyX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9zZXJ2ZXJfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlX3NlcnZlcl93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX3NlcnZlcl9zZXRfdGltZW91dF9mdW5jdGlvbnMgKHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9zZXJ2ZXJfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9zZXJ2ZXJfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIsIE5VTEwpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKiBUaGlzIGNvZGUgb25seSBnZXRzIGV4ZWN1dGVkIHRoZSBmaXJzdCB0aW1lIHRoZQorICogY29uZmlnIGZpbGVzIGFyZSBwYXJzZWQuICBJdCBpcyBub3QgZXhlY3V0ZWQKKyAqIHdoZW4gY29uZmlnIGZpbGVzIGFyZSByZWxvYWRlZC4KKyAqLworc3RhdGljIGRidXNfYm9vbF90Citwcm9jZXNzX2NvbmZpZ19maXJzdF90aW1lX29ubHkgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQsCisJCQkJQnVzQ29uZmlnUGFyc2VyICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNDb250ZXh0RmxhZ3MgICBmbGFncywKKwkJCQlEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBsb2dfcHJlZml4OworICBEQnVzTGlzdCAqbGluazsKKyAgREJ1c0xpc3QgKiphZGRyZXNzZXM7CisgIGNvbnN0IGNoYXIgKnVzZXIsICpwaWRmaWxlOworICBjaGFyICoqYXV0aF9tZWNoYW5pc21zOworICBEQnVzTGlzdCAqKmF1dGhfbWVjaGFuaXNtc19saXN0OworICBpbnQgbGVuOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgcmV0dmFsID0gRkFMU0U7CisgIGF1dGhfbWVjaGFuaXNtcyA9IE5VTEw7CisgIHBpZGZpbGUgPSBOVUxMOworCisgIF9kYnVzX2luaXRfc3lzdGVtX2xvZyAoKTsKKworICBpZiAoZmxhZ3MgJiBCVVNfQ09OVEVYVF9GTEFHX1NZU1RFTURfQUNUSVZBVElPTikKKyAgICBjb250ZXh0LT5zeXN0ZW1kX2FjdGl2YXRpb24gPSBUUlVFOworICBlbHNlCisgICAgY29udGV4dC0+c3lzdGVtZF9hY3RpdmF0aW9uID0gRkFMU0U7CisKKyNpZmRlZiBXQU5UX1BJREZJTEUKKyAgLyogQ2hlY2sgZm9yIGFuIGV4aXN0aW5nIHBpZCBmaWxlLiBPZiBjb3Vyc2UgdGhpcyBpcyBhIHJhY2U7CisgICAqIHdlJ2QgaGF2ZSB0byB1c2UgZmNudGwoKSBsb2NrcyBvbiB0aGUgcGlkIGZpbGUgdG8KKyAgICogYXZvaWQgdGhhdC4gQnV0IHdlIHdhbnQgdG8gY2hlY2sgZm9yIHRoZSBwaWQgZmlsZQorICAgKiBiZWZvcmUgb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIHNvY2tldHMsIGV0Yy4KKyAgICovCisKKyAgaWYgKGZsYWdzICYgQlVTX0NPTlRFWFRfRkxBR19XUklURV9QSURfRklMRSkKKyAgICBwaWRmaWxlID0gYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3BpZGZpbGUgKHBhcnNlcik7CisKKyAgaWYgKHBpZGZpbGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIHU7CisgICAgICBEQnVzU3RhdCBzdGJ1ZjsKKworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZ1LCBwaWRmaWxlKTsKKworICAgICAgaWYgKF9kYnVzX3N0YXQgKCZ1LCAmc3RidWYsIE5VTEwpKQorICAgICAgICB7CisjaWZkZWYgREJVU19DWUdXSU4KKyAgICAgICAgICBEQnVzU3RyaW5nIHA7CisgICAgICAgICAgbG9uZyAvKiBpbnQgKi8gcGlkOworCisgICAgICAgICAgX2RidXNfc3RyaW5nX2luaXQgKCZwKTsKKyAgICAgICAgICBfZGJ1c19maWxlX2dldF9jb250ZW50cygmcCwgJnUsIE5VTEwpOworICAgICAgICAgIF9kYnVzX3N0cmluZ19wYXJzZV9pbnQoJnAsIDAsICZwaWQsIE5VTEwpOworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlKCZwKTsKKworICAgICAgICAgIGlmICgoa2lsbCgoaW50KXBpZCwgMCkpKSB7CisgICAgICAgICAgICBkYnVzX3NldF9lcnJvcihOVUxMLCBEQlVTX0VSUk9SX0ZJTEVfRVhJU1RTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInBpZCAlbGQgbm90IHJ1bm5pbmcsIHJlbW92aW5nIHN0YWxlIHBpZCBmaWxlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkKTsKKyAgICAgICAgICAgIF9kYnVzX2RlbGV0ZV9maWxlKCZ1LCBOVUxMKTsKKyAgICAgICAgICB9IGVsc2UgeworI2VuZGlmCisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKwkJICAgICAgICAgICAgICAgICAgIlRoZSBwaWQgZmlsZSBcIiVzXCIgZXhpc3RzLCBpZiB0aGUgbWVzc2FnZSBidXMgaXMgbm90IHJ1bm5pbmcsIHJlbW92ZSB0aGlzIGZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRmaWxlKTsKKwkgICAgICBnb3RvIGZhaWxlZDsKKyNpZmRlZiBEQlVTX0NZR1dJTgorICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CisgICAgfQorCisgIC8qIGtlZXAgYXJvdW5kIHRoZSBwaWQgZmlsZW5hbWUgc28gd2UgY2FuIGRlbGV0ZSBpdCBsYXRlciAqLworICBjb250ZXh0LT5waWRmaWxlID0gX2RidXNfc3RyZHVwIChwaWRmaWxlKTsKKyNlbmRpZgorCisgIC8qIG5vdGUgdGhhdCB0eXBlIG1heSBiZSBOVUxMICovCisgIGNvbnRleHQtPnR5cGUgPSBfZGJ1c19zdHJkdXAgKGJ1c19jb25maWdfcGFyc2VyX2dldF90eXBlIChwYXJzZXIpKTsKKyAgaWYgKGJ1c19jb25maWdfcGFyc2VyX2dldF90eXBlIChwYXJzZXIpICE9IE5VTEwgJiYgY29udGV4dC0+dHlwZSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIHVzZXIgPSBidXNfY29uZmlnX3BhcnNlcl9nZXRfdXNlciAocGFyc2VyKTsKKyAgaWYgKHVzZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBjb250ZXh0LT51c2VyID0gX2RidXNfc3RyZHVwICh1c2VyKTsKKyAgICAgIGlmIChjb250ZXh0LT51c2VyID09IE5VTEwpCisgICAgICAgIGdvdG8gb29tOworICAgIH0KKworICAvKiBTZXQgdXAgdGhlIHByZWZpeCBmb3Igc3lzbG9nIG1lc3NhZ2VzICovCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZsb2dfcHJlZml4KSkKKyAgICBnb3RvIG9vbTsKKyAgaWYgKGNvbnRleHQtPnR5cGUgJiYgIXN0cmNtcCAoY29udGV4dC0+dHlwZSwgInN5c3RlbSIpKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmxvZ19wcmVmaXgsICJbc3lzdGVtXSAiKSkKKyAgICAgICAgZ290byBvb207CisgICAgfQorICBlbHNlIGlmIChjb250ZXh0LT50eXBlICYmICFzdHJjbXAgKGNvbnRleHQtPnR5cGUsICJzZXNzaW9uIikpCisgICAgeworICAgICAgREJ1c0NyZWRlbnRpYWxzICpjcmVkZW50aWFsczsKKworICAgICAgY3JlZGVudGlhbHMgPSBfZGJ1c19jcmVkZW50aWFsc19uZXdfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKCk7CisgICAgICBpZiAoIWNyZWRlbnRpYWxzKQorICAgICAgICBnb3RvIG9vbTsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmxvZ19wcmVmaXgsICJbc2Vzc2lvbiAiKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkZW50aWFscyk7CisgICAgICAgICAgZ290byBvb207CisgICAgICAgIH0KKyAgICAgIGlmICghX2RidXNfY3JlZGVudGlhbHNfdG9fc3RyaW5nX2FwcGVuZCAoY3JlZGVudGlhbHMsICZsb2dfcHJlZml4KSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkZW50aWFscyk7CisgICAgICAgICAgZ290byBvb207CisgICAgICAgIH0KKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmxvZ19wcmVmaXgsICJdICIpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRlbnRpYWxzKTsKKyAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgfQorICAgICAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRlbnRpYWxzKTsKKyAgICB9CisgIGlmICghX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgKCZsb2dfcHJlZml4LCAmY29udGV4dC0+bG9nX3ByZWZpeCkpCisgICAgZ290byBvb207CisgIF9kYnVzX3N0cmluZ19mcmVlICgmbG9nX3ByZWZpeCk7CisKKyAgLyogQnVpbGQgYW4gYXJyYXkgb2YgYXV0aCBtZWNoYW5pc21zICovCisKKyAgYXV0aF9tZWNoYW5pc21zX2xpc3QgPSBidXNfY29uZmlnX3BhcnNlcl9nZXRfbWVjaGFuaXNtcyAocGFyc2VyKTsKKyAgbGVuID0gX2RidXNfbGlzdF9nZXRfbGVuZ3RoIChhdXRoX21lY2hhbmlzbXNfbGlzdCk7CisKKyAgaWYgKGxlbiA+IDApCisgICAgeworICAgICAgaW50IGk7CisKKyAgICAgIGF1dGhfbWVjaGFuaXNtcyA9IGRidXNfbmV3MCAoY2hhciosIGxlbiArIDEpOworICAgICAgaWYgKGF1dGhfbWVjaGFuaXNtcyA9PSBOVUxMKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAgaSA9IDA7CisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoYXV0aF9tZWNoYW5pc21zX2xpc3QpOworICAgICAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGF1dGhfbWVjaGFuaXNtc1tpXSA9IF9kYnVzX3N0cmR1cCAobGluay0+ZGF0YSk7CisgICAgICAgICAgaWYgKGF1dGhfbWVjaGFuaXNtc1tpXSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBvb207CisgICAgICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoYXV0aF9tZWNoYW5pc21zX2xpc3QsIGxpbmspOworICAgICAgICAgIGkgKz0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGF1dGhfbWVjaGFuaXNtcyA9IE5VTEw7CisgICAgfQorCisgIC8qIExpc3RlbiBvbiBvdXIgYWRkcmVzc2VzICovCisKKyAgaWYgKGFkZHJlc3MpCisgICAgeworICAgICAgREJ1c1NlcnZlciAqc2VydmVyOworCisgICAgICBzZXJ2ZXIgPSBkYnVzX3NlcnZlcl9saXN0ZW4gKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YShhZGRyZXNzKSwgZXJyb3IpOworICAgICAgaWYgKHNlcnZlciA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghc2V0dXBfc2VydmVyIChjb250ZXh0LCBzZXJ2ZXIsIGF1dGhfbWVjaGFuaXNtcywgZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZjb250ZXh0LT5zZXJ2ZXJzLCBzZXJ2ZXIpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBhZGRyZXNzZXMgPSBidXNfY29uZmlnX3BhcnNlcl9nZXRfYWRkcmVzc2VzIChwYXJzZXIpOworCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoYWRkcmVzc2VzKTsKKyAgICAgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzU2VydmVyICpzZXJ2ZXI7CisKKyAgICAgICAgICBzZXJ2ZXIgPSBkYnVzX3NlcnZlcl9saXN0ZW4gKGxpbmstPmRhdGEsIGVycm9yKTsKKyAgICAgICAgICBpZiAoc2VydmVyID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoIXNldHVwX3NlcnZlciAoY29udGV4dCwgc2VydmVyLCBhdXRoX21lY2hhbmlzbXMsIGVycm9yKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZjb250ZXh0LT5zZXJ2ZXJzLCBzZXJ2ZXIpKQorICAgICAgICAgICAgZ290byBvb207CisKKyAgICAgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChhZGRyZXNzZXMsIGxpbmspOworICAgICAgICB9CisgICAgfQorCisgIGNvbnRleHQtPmZvcmsgPSBidXNfY29uZmlnX3BhcnNlcl9nZXRfZm9yayAocGFyc2VyKTsKKyAgY29udGV4dC0+c3lzbG9nID0gYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3N5c2xvZyAocGFyc2VyKTsKKyAgY29udGV4dC0+a2VlcF91bWFzayA9IGJ1c19jb25maWdfcGFyc2VyX2dldF9rZWVwX3VtYXNrIChwYXJzZXIpOworICBjb250ZXh0LT5hbGxvd19hbm9ueW1vdXMgPSBidXNfY29uZmlnX3BhcnNlcl9nZXRfYWxsb3dfYW5vbnltb3VzIChwYXJzZXIpOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICByZXR2YWwgPSBUUlVFOworCisgZmFpbGVkOgorICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChhdXRoX21lY2hhbmlzbXMpOworICByZXR1cm4gcmV0dmFsOworCisgb29tOgorICBCVVNfU0VUX09PTSAoZXJyb3IpOworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChhdXRoX21lY2hhbmlzbXMpOworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qIFRoaXMgY29kZSBnZXRzIGV4ZWN1dGVkIGV2ZXJ5IHRpbWUgdGhlIGNvbmZpZyBmaWxlcworICogYXJlIHBhcnNlZDogYm90aCBkdXJpbmcgQnVzQ29udGV4dCBjb25zdHJ1Y3Rpb24KKyAqIGFuZCBvbiByZWxvYWRzLiBUaGlzIGZ1bmN0aW9uIGlzIHNsaWdodGx5IHNjcmV3eQorICogc2luY2UgaXQgY2FuIGRvIGEgImhhbGYgcmVsb2FkIiBpbiBvdXQtb2YtbWVtb3J5CisgKiBzaXR1YXRpb25zLiBSZWFsaXN0aWNhbGx5LCB1bmxpa2VseSB0byBldmVyIG1hdHRlci4KKyAqLworc3RhdGljIGRidXNfYm9vbF90Citwcm9jZXNzX2NvbmZpZ19ldmVyeV90aW1lIChCdXNDb250ZXh0ICAgICAgKmNvbnRleHQsCisJCQkgICBCdXNDb25maWdQYXJzZXIgKnBhcnNlciwKKwkJCSAgIGRidXNfYm9vbF90ICAgICAgaXNfcmVsb2FkLAorCQkJICAgREJ1c0Vycm9yICAgICAgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBmdWxsX2FkZHJlc3M7CisgIERCdXNMaXN0ICpsaW5rOworICBEQnVzTGlzdCAqKmRpcnM7CisgIGNoYXIgKmFkZHI7CisgIGNvbnN0IGNoYXIgKnNlcnZpY2VoZWxwZXI7CisgIGNoYXIgKnM7CisKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGFkZHIgPSBOVUxMOworICByZXR2YWwgPSBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZnVsbF9hZGRyZXNzKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBnZXQgb3VyIGxpbWl0cyBhbmQgdGltZW91dCBsZW5ndGhzICovCisgIGJ1c19jb25maWdfcGFyc2VyX2dldF9saW1pdHMgKHBhcnNlciwgJmNvbnRleHQtPmxpbWl0cyk7CisKKyAgaWYgKGNvbnRleHQtPnBvbGljeSkKKyAgICBidXNfcG9saWN5X3VucmVmIChjb250ZXh0LT5wb2xpY3kpOworICBjb250ZXh0LT5wb2xpY3kgPSBidXNfY29uZmlnX3BhcnNlcl9zdGVhbF9wb2xpY3kgKHBhcnNlcik7CisgIF9kYnVzX2Fzc2VydCAoY29udGV4dC0+cG9saWN5ICE9IE5VTEwpOworCisgIC8qIFdlIGhhdmUgdG8gYnVpbGQgdGhlIGFkZHJlc3MgYmFja3dhcmQsIHNvIHRoYXQKKyAgICogPGxpc3Rlbj4gbGF0ZXIgaW4gdGhlIGNvbmZpZyBmaWxlIGhhdmUgcHJpb3JpdHkKKyAgICovCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9sYXN0X2xpbmsgKCZjb250ZXh0LT5zZXJ2ZXJzKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBhZGRyID0gZGJ1c19zZXJ2ZXJfZ2V0X2FkZHJlc3MgKGxpbmstPmRhdGEpOworICAgICAgaWYgKGFkZHIgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmZnVsbF9hZGRyZXNzKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZmdWxsX2FkZHJlc3MsICI7IikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmZ1bGxfYWRkcmVzcywgYWRkcikpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisKKyAgICAgIGRidXNfZnJlZSAoYWRkcik7CisgICAgICBhZGRyID0gTlVMTDsKKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X3ByZXZfbGluayAoJmNvbnRleHQtPnNlcnZlcnMsIGxpbmspOworICAgIH0KKworICBpZiAoaXNfcmVsb2FkKQorICAgIGRidXNfZnJlZSAoY29udGV4dC0+YWRkcmVzcyk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9kYXRhICgmZnVsbF9hZGRyZXNzLCAmY29udGV4dC0+YWRkcmVzcykpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICAvKiBnZXQgdGhlIHNlcnZpY2UgZGlyZWN0b3JpZXMgKi8KKyAgZGlycyA9IGJ1c19jb25maWdfcGFyc2VyX2dldF9zZXJ2aWNlX2RpcnMgKHBhcnNlcik7CisKKyAgLyogYW5kIHRoZSBzZXJ2aWNlIGhlbHBlciAqLworICBzZXJ2aWNlaGVscGVyID0gYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3NlcnZpY2VoZWxwZXIgKHBhcnNlcik7CisKKyAgcyA9IF9kYnVzX3N0cmR1cChzZXJ2aWNlaGVscGVyKTsKKyAgaWYgKHMgPT0gTlVMTCAmJiBzZXJ2aWNlaGVscGVyICE9IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfZnJlZShjb250ZXh0LT5zZXJ2aWNlaGVscGVyKTsKKyAgICAgIGNvbnRleHQtPnNlcnZpY2VoZWxwZXIgPSBzOworICAgIH0KKworICAvKiBDcmVhdGUgYWN0aXZhdGlvbiBzdWJzeXN0ZW0gKi8KKyAgaWYgKGNvbnRleHQtPmFjdGl2YXRpb24pCisgICAgeworICAgICAgaWYgKCFidXNfYWN0aXZhdGlvbl9yZWxvYWQgKGNvbnRleHQtPmFjdGl2YXRpb24sICZmdWxsX2FkZHJlc3MsIGRpcnMsIGVycm9yKSkKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY29udGV4dC0+YWN0aXZhdGlvbiA9IGJ1c19hY3RpdmF0aW9uX25ldyAoY29udGV4dCwgJmZ1bGxfYWRkcmVzcywgZGlycywgZXJyb3IpOworICAgIH0KKworICBpZiAoY29udGV4dC0+YWN0aXZhdGlvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgcmV0dmFsID0gVFJVRTsKKworIGZhaWxlZDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX2FkZHJlc3MpOworCisgIGlmIChhZGRyKQorICAgIGRidXNfZnJlZSAoYWRkcik7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitsaXN0X2NvbmNhdF9uZXcgKERCdXNMaXN0ICoqYSwKKyAgICAgICAgICAgICAgICAgREJ1c0xpc3QgKipiLAorICAgICAgICAgICAgICAgICBEQnVzTGlzdCAqKnJlc3VsdCkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgKnJlc3VsdCA9IE5VTEw7CisKKyAgZm9yIChsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoYSk7IGxpbms7IGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGEsIGxpbmspKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKHJlc3VsdCwgbGluay0+ZGF0YSkpCisgICAgICAgIGdvdG8gb29tOworICAgIH0KKyAgZm9yIChsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoYik7IGxpbms7IGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGIsIGxpbmspKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKHJlc3VsdCwgbGluay0+ZGF0YSkpCisgICAgICAgIGdvdG8gb29tOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK29vbToKKyAgX2RidXNfbGlzdF9jbGVhciAocmVzdWx0KTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorcmFpc2VfZmlsZV9kZXNjcmlwdG9yX2xpbWl0IChCdXNDb250ZXh0ICAgICAgKmNvbnRleHQpCit7CisKKyAgLyogSSBqdXN0IHBpY2tlZCB0aGlzIG91dCBvZiB0aGluIGFpcjsgd2UgbmVlZCBzb21lIGV4dHJhCisgICAqIGRlc2NyaXB0b3JzIGZvciB0aGluZ3MgbGlrZSBhbnkgaW50ZXJuYWwgcGlwZXMgd2UgY3JlYXRlLAorICAgKiBpbm90aWZ5LCBjb25uZWN0aW9ucyB0byBTRUxpbnV4LCBldGMuCisgICAqLworICB1bnNpZ25lZCBpbnQgYXJiaXRyYXJ5X2V4dHJhX2ZkcyA9IDMyOworICB1bnNpZ25lZCBpbnQgbGltaXQ7CisKKyAgbGltaXQgPSBjb250ZXh0LT5saW1pdHMubWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyArCisgICAgY29udGV4dC0+bGltaXRzLm1heF9pbmNvbXBsZXRlX2Nvbm5lY3Rpb25zCisgICAgKyBhcmJpdHJhcnlfZXh0cmFfZmRzOworCisgIF9kYnVzX3JlcXVlc3RfZmlsZV9kZXNjcmlwdG9yX2xpbWl0IChsaW1pdCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcHJvY2Vzc19jb25maWdfcG9zdGluaXQgKEJ1c0NvbnRleHQgICAgICAqY29udGV4dCwKKwkJCSBCdXNDb25maWdQYXJzZXIgKnBhcnNlciwKKwkJCSBEQnVzRXJyb3IgICAgICAgKmVycm9yKQoreworICBEQnVzSGFzaFRhYmxlICpzZXJ2aWNlX2NvbnRleHRfdGFibGU7CisgIERCdXNMaXN0ICp3YXRjaGVkX2RpcnMgPSBOVUxMOworCisgIHJhaXNlX2ZpbGVfZGVzY3JpcHRvcl9saW1pdCAoY29udGV4dCk7CisKKyAgc2VydmljZV9jb250ZXh0X3RhYmxlID0gYnVzX2NvbmZpZ19wYXJzZXJfc3RlYWxfc2VydmljZV9jb250ZXh0X3RhYmxlIChwYXJzZXIpOworICBpZiAoIWJ1c19yZWdpc3RyeV9zZXRfc2VydmljZV9jb250ZXh0X3RhYmxlIChjb250ZXh0LT5yZWdpc3RyeSwKKwkJCQkJICAgICAgIHNlcnZpY2VfY29udGV4dF90YWJsZSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAoc2VydmljZV9jb250ZXh0X3RhYmxlKTsKKworICAvKiBXZSBuZWVkIHRvIG1vbml0b3IgYm90aCB0aGUgY29uZmlndXJhdGlvbiBkaXJlY3RvcmllcyBhbmQgZGlyZWN0b3JpZXMKKyAgICogY29udGFpbmluZyAuc2VydmljZSBmaWxlcy4KKyAgICovCisgIGlmICghbGlzdF9jb25jYXRfbmV3IChidXNfY29uZmlnX3BhcnNlcl9nZXRfY29uZl9kaXJzIChwYXJzZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3NlcnZpY2VfZGlycyAocGFyc2VyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ3YXRjaGVkX2RpcnMpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGJ1c19zZXRfd2F0Y2hlZF9kaXJzIChjb250ZXh0LCAmd2F0Y2hlZF9kaXJzKTsKKworICBfZGJ1c19saXN0X2NsZWFyICgmd2F0Y2hlZF9kaXJzKTsKKworICByZXR1cm4gVFJVRTsKK30KKworQnVzQ29udGV4dCoKK2J1c19jb250ZXh0X25ldyAoY29uc3QgREJ1c1N0cmluZyAqY29uZmlnX2ZpbGUsCisgICAgICAgICAgICAgICAgIEJ1c0NvbnRleHRGbGFncyAgIGZsYWdzLAorICAgICAgICAgICAgICAgICBEQnVzUGlwZSAgICAgICAgICpwcmludF9hZGRyX3BpcGUsCisgICAgICAgICAgICAgICAgIERCdXNQaXBlICAgICAgICAgKnByaW50X3BpZF9waXBlLAorICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphZGRyZXNzLAorICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgQnVzQ29uZmlnUGFyc2VyICpwYXJzZXI7CisKKyAgX2RidXNfYXNzZXJ0ICgoZmxhZ3MgJiBCVVNfQ09OVEVYVF9GTEFHX0ZPUktfTkVWRVIpID09IDAgfHwKKyAgICAgICAgICAgICAgICAoZmxhZ3MgJiBCVVNfQ09OVEVYVF9GTEFHX0ZPUktfQUxXQVlTKSA9PSAwKTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBjb250ZXh0ID0gTlVMTDsKKyAgcGFyc2VyID0gTlVMTDsKKworICBpZiAoIWRidXNfc2VydmVyX2FsbG9jYXRlX2RhdGFfc2xvdCAoJnNlcnZlcl9kYXRhX3Nsb3QpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgY29udGV4dCA9IGRidXNfbmV3MCAoQnVzQ29udGV4dCwgMSk7CisgIGlmIChjb250ZXh0ID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgY29udGV4dC0+cmVmY291bnQgPSAxOworCisgIF9kYnVzX2dlbmVyYXRlX3V1aWQgKCZjb250ZXh0LT51dWlkKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2RhdGEgKGNvbmZpZ19maWxlLCAmY29udGV4dC0+Y29uZmlnX2ZpbGUpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgY29udGV4dC0+bG9vcCA9IF9kYnVzX2xvb3BfbmV3ICgpOworICBpZiAoY29udGV4dC0+bG9vcCA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgY29udGV4dC0+cmVnaXN0cnkgPSBidXNfcmVnaXN0cnlfbmV3IChjb250ZXh0KTsKKyAgaWYgKGNvbnRleHQtPnJlZ2lzdHJ5ID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBwYXJzZXIgPSBidXNfY29uZmlnX2xvYWQgKGNvbmZpZ19maWxlLCBUUlVFLCBOVUxMLCBlcnJvcik7CisgIGlmIChwYXJzZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgaWYgKCFwcm9jZXNzX2NvbmZpZ19maXJzdF90aW1lX29ubHkgKGNvbnRleHQsIHBhcnNlciwgYWRkcmVzcywgZmxhZ3MsIGVycm9yKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIGlmICghcHJvY2Vzc19jb25maWdfZXZlcnlfdGltZSAoY29udGV4dCwgcGFyc2VyLCBGQUxTRSwgZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICAvKiB3ZSBuZWVkIGFub3RoZXIgcmVmIG9mIHRoZSBzZXJ2ZXIgZGF0YSBzbG90IGZvciB0aGUgY29udGV4dAorICAgKiB0byBvd24KKyAgICovCisgIGlmICghZGJ1c19zZXJ2ZXJfYWxsb2NhdGVfZGF0YV9zbG90ICgmc2VydmVyX2RhdGFfc2xvdCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2Vjb25kIHJlZiBvZiBzZXJ2ZXIgZGF0YSBzbG90IGZhaWxlZCIpOworCisgIC8qIE5vdGUgdGhhdCB3ZSBkb24ndCBrbm93IHdoZXRoZXIgdGhlIHByaW50X2FkZHJfcGlwZSBpcworICAgKiBvbmUgb2YgdGhlIHNvY2tldHMgd2UncmUgdXNpbmcgdG8gbGlzdGVuIG9uLCBvciBzb21lCisgICAqIG90aGVyIHJhbmRvbSB0aGluZy4gQnV0IEkgdGhpbmsgdGhlIGFuc3dlciBpcyAiZG9uJ3QgZG8KKyAgICogdGhhdCB0aGVuIgorICAgKi8KKyAgaWYgKHByaW50X2FkZHJfcGlwZSAhPSBOVUxMICYmIF9kYnVzX3BpcGVfaXNfdmFsaWQgKHByaW50X2FkZHJfcGlwZSkpCisgICAgeworICAgICAgREJ1c1N0cmluZyBhZGRyOworICAgICAgY29uc3QgY2hhciAqYSA9IGJ1c19jb250ZXh0X2dldF9hZGRyZXNzIChjb250ZXh0KTsKKyAgICAgIGludCBieXRlczsKKworICAgICAgX2RidXNfYXNzZXJ0IChhICE9IE5VTEwpOworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmFkZHIpKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyLCBhKSB8fAorICAgICAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkciwgIlxuIikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHIpOworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKworICAgICAgYnl0ZXMgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmFkZHIpOworICAgICAgaWYgKF9kYnVzX3BpcGVfd3JpdGUgKHByaW50X2FkZHJfcGlwZSwgJmFkZHIsIDAsIGJ5dGVzLCBlcnJvcikgIT0gYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBwaXBlIHdyaXRlIHJldHVybnMgYW4gZXJyb3Igb24gZmFpbHVyZSBidXQgbm90IHNob3J0IHdyaXRlICovCisgICAgICAgICAgaWYgKGVycm9yICE9IE5VTEwgJiYgIWRidXNfZXJyb3JfaXNfc2V0IChlcnJvcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbnRpbmcgbWVzc2FnZSBidXMgYWRkcmVzczogZGlkIG5vdCB3cml0ZSBhbGwgYnl0ZXNcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcik7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19waXBlX2lzX3N0ZG91dF9vcl9zdGRlcnIgKHByaW50X2FkZHJfcGlwZSkpCisgICAgICAgIF9kYnVzX3BpcGVfY2xvc2UgKHByaW50X2FkZHJfcGlwZSwgTlVMTCk7CisKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcik7CisgICAgfQorCisgIGNvbnRleHQtPmNvbm5lY3Rpb25zID0gYnVzX2Nvbm5lY3Rpb25zX25ldyAoY29udGV4dCk7CisgIGlmIChjb250ZXh0LT5jb25uZWN0aW9ucyA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgY29udGV4dC0+bWF0Y2htYWtlciA9IGJ1c19tYXRjaG1ha2VyX25ldyAoKTsKKyAgaWYgKGNvbnRleHQtPm1hdGNobWFrZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIC8qIGNoZWNrIHVzZXIgYmVmb3JlIHdlIGZvcmsgKi8KKyAgaWYgKGNvbnRleHQtPnVzZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3ZlcmlmeV9kYWVtb25fdXNlciAoY29udGV4dC0+dXNlcikpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGdldCBVSUQgYW5kIEdJRCBmb3IgdXNlcm5hbWUgXCIlc1wiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+dXNlcik7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogTm93IGJlY29tZSBhIGRhZW1vbiBpZiBhcHByb3ByaWF0ZSBhbmQgd3JpdGUgb3V0IHBpZCBmaWxlIGluIGFueSBjYXNlICovCisgIHsKKyNpZmRlZiBXQU5UX1BJREZJTEUKKyAgICBEQnVzU3RyaW5nIHU7CisKKyAgICBpZiAoY29udGV4dC0+cGlkZmlsZSkKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdSwgY29udGV4dC0+cGlkZmlsZSk7CisKKyAgICBpZiAoKChmbGFncyAmIEJVU19DT05URVhUX0ZMQUdfRk9SS19ORVZFUikgPT0gMCAmJiBjb250ZXh0LT5mb3JrKSB8fAorICAgICAgICAoZmxhZ3MgJiBCVVNfQ09OVEVYVF9GTEFHX0ZPUktfQUxXQVlTKSkKKyAgICAgIHsKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZvcmtpbmcgYW5kIGJlY29taW5nIGRhZW1vblxuIik7CisKKyAgICAgICAgaWYgKCFfZGJ1c19iZWNvbWVfZGFlbW9uIChjb250ZXh0LT5waWRmaWxlID8gJnUgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3BpZF9waXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmtlZXBfdW1hc2spKQorCisgICAgICAgICAgeworICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgfQorICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZvcmsgbm90IHJlcXVlc3RlZFxuIik7CisKKyAgICAgICAgLyogTmVlZCB0byB3cml0ZSBQSUQgZmlsZSBhbmQgdG8gUElEIHBpcGUgZm9yIG91cnNlbHZlcywKKyAgICAgICAgICogbm90IGZvciB0aGUgY2hpbGQgcHJvY2Vzcy4gVGhpcyBpcyBhIG5vLW9wIGlmIHRoZSBwaWRmaWxlCisgICAgICAgICAqIGlzIE5VTEwgYW5kIHByaW50X3BpZF9waXBlIGlzIE5VTEwuCisgICAgICAgICAqLworICAgICAgICBpZiAoIV9kYnVzX3dyaXRlX3BpZF90b19maWxlX2FuZF9waXBlIChjb250ZXh0LT5waWRmaWxlID8gJnUgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9waWRfcGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfZ2V0cGlkICgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgICAgICAgeworICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgfQorICAgICAgfQorI2Vsc2UKKyAgICBpZiAoKChmbGFncyAmIEJVU19DT05URVhUX0ZMQUdfRk9SS19ORVZFUikgPT0gMCAmJiBjb250ZXh0LT5mb3JrKSB8fAorICAgICAgICAoZmxhZ3MgJiBCVVNfQ09OVEVYVF9GTEFHX0ZPUktfQUxXQVlTKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKCFfZGJ1c19iZWNvbWVfZGFlbW9uIChOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+a2VlcF91bWFzaykpCisgICAgICAgICAgeworICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisgIH0KKworICBpZiAocHJpbnRfcGlkX3BpcGUgJiYgX2RidXNfcGlwZV9pc192YWxpZCAocHJpbnRfcGlkX3BpcGUpICYmCisgICAgICAhX2RidXNfcGlwZV9pc19zdGRvdXRfb3Jfc3RkZXJyIChwcmludF9waWRfcGlwZSkpCisgICAgX2RidXNfcGlwZV9jbG9zZSAocHJpbnRfcGlkX3BpcGUsIE5VTEwpOworCisgIGlmICghYnVzX3NlbGludXhfZnVsbF9pbml0ICgpKQorICAgIHsKKyAgICAgIGJ1c19jb250ZXh0X2xvZyAoY29udGV4dCwgREJVU19TWVNURU1fTE9HX0ZBVEFMLCAiU0VMaW51eCBlbmFibGVkIGJ1dCBBVkMgaW5pdGlhbGl6YXRpb24gZmFpbGVkOyBjaGVjayBzeXN0ZW0gbG9nXG4iKTsKKyAgICB9CisKKyAgaWYgKCFwcm9jZXNzX2NvbmZpZ19wb3N0aW5pdCAoY29udGV4dCwgcGFyc2VyLCBlcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmIChwYXJzZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBidXNfY29uZmlnX3BhcnNlcl91bnJlZiAocGFyc2VyKTsKKyAgICAgIHBhcnNlciA9IE5VTEw7CisgICAgfQorCisgIC8qIEhlcmUgd2UgY2hhbmdlIG91ciBjcmVkZW50aWFscyBpZiByZXF1aXJlZCwKKyAgICogYXMgc29vbiBhcyB3ZSd2ZSBzZXQgdXAgb3VyIHNvY2tldHMgYW5kIHBpZGZpbGUKKyAgICovCisgIGlmIChjb250ZXh0LT51c2VyICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jaGFuZ2VfdG9fZGFlbW9uX3VzZXIgKGNvbnRleHQtPnVzZXIsIGVycm9yKSkKKwl7CisJICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisJICBnb3RvIGZhaWxlZDsKKwl9CisKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyAgICAgIC8qIEZJWE1FIC0gd2h5IG5vdCBqdXN0IHB1dCB0aGlzIGluIGZ1bGxfaW5pdCgpIGJlbG93PyAqLworICAgICAgYnVzX3NlbGludXhfYXVkaXRfaW5pdCAoKTsKKyNlbmRpZgorICAgIH0KKworICBkYnVzX3NlcnZlcl9mcmVlX2RhdGFfc2xvdCAoJnNlcnZlcl9kYXRhX3Nsb3QpOworCisgIHJldHVybiBjb250ZXh0OworCisgZmFpbGVkOgorICBpZiAocGFyc2VyICE9IE5VTEwpCisgICAgYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYgKHBhcnNlcik7CisgIGlmIChjb250ZXh0ICE9IE5VTEwpCisgICAgYnVzX2NvbnRleHRfdW5yZWYgKGNvbnRleHQpOworCisgIGlmIChzZXJ2ZXJfZGF0YV9zbG90ID49IDApCisgICAgZGJ1c19zZXJ2ZXJfZnJlZV9kYXRhX3Nsb3QgKCZzZXJ2ZXJfZGF0YV9zbG90KTsKKworICByZXR1cm4gTlVMTDsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb250ZXh0X2dldF9pZCAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqdXVpZCkKK3sKKyAgcmV0dXJuIF9kYnVzX3V1aWRfZW5jb2RlICgmY29udGV4dC0+dXVpZCwgdXVpZCk7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29udGV4dF9yZWxvYWRfY29uZmlnIChCdXNDb250ZXh0ICpjb250ZXh0LAorCQkJICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyOworICBEQnVzU3RyaW5nIGNvbmZpZ19maWxlOworICBkYnVzX2Jvb2xfdCByZXQ7CisKKyAgLyogRmx1c2ggdGhlIHVzZXIgZGF0YWJhc2UgY2FjaGUgKi8KKyAgX2RidXNfZmx1c2hfY2FjaGVzICgpOworCisgIHJldCA9IEZBTFNFOworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmNvbmZpZ19maWxlLCBjb250ZXh0LT5jb25maWdfZmlsZSk7CisgIHBhcnNlciA9IGJ1c19jb25maWdfbG9hZCAoJmNvbmZpZ19maWxlLCBUUlVFLCBOVUxMLCBlcnJvcik7CisgIGlmIChwYXJzZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgaWYgKCFwcm9jZXNzX2NvbmZpZ19ldmVyeV90aW1lIChjb250ZXh0LCBwYXJzZXIsIFRSVUUsIGVycm9yKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIGlmICghcHJvY2Vzc19jb25maWdfcG9zdGluaXQgKGNvbnRleHQsIHBhcnNlciwgZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgcmV0ID0gVFJVRTsKKworICBidXNfY29udGV4dF9sb2cgKGNvbnRleHQsIERCVVNfU1lTVEVNX0xPR19JTkZPLCAiUmVsb2FkZWQgY29uZmlndXJhdGlvbiIpOworIGZhaWxlZDoKKyAgaWYgKCFyZXQpCisgICAgYnVzX2NvbnRleHRfbG9nIChjb250ZXh0LCBEQlVTX1NZU1RFTV9MT0dfSU5GTywgIlVuYWJsZSB0byByZWxvYWQgY29uZmlndXJhdGlvbjogJXMiLCBlcnJvci0+bWVzc2FnZSk7CisgIGlmIChwYXJzZXIgIT0gTlVMTCkKKyAgICBidXNfY29uZmlnX3BhcnNlcl91bnJlZiAocGFyc2VyKTsKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK3NodXRkb3duX3NlcnZlciAoQnVzQ29udGV4dCAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgREJ1c1NlcnZlciAqc2VydmVyKQoreworICBpZiAoc2VydmVyID09IE5VTEwgfHwKKyAgICAgICFkYnVzX3NlcnZlcl9nZXRfaXNfY29ubmVjdGVkIChzZXJ2ZXIpKQorICAgIHJldHVybjsKKworICBpZiAoIWRidXNfc2VydmVyX3NldF93YXRjaF9mdW5jdGlvbnMgKHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2V0dGluZyB3YXRjaCBmdW5jdGlvbnMgdG8gTlVMTCBmYWlsZWQiKTsKKworICBpZiAoIWRidXNfc2VydmVyX3NldF90aW1lb3V0X2Z1bmN0aW9ucyAoc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzZXR0aW5nIHRpbWVvdXQgZnVuY3Rpb25zIHRvIE5VTEwgZmFpbGVkIik7CisKKyAgZGJ1c19zZXJ2ZXJfZGlzY29ubmVjdCAoc2VydmVyKTsKK30KKwordm9pZAorYnVzX2NvbnRleHRfc2h1dGRvd24gKEJ1c0NvbnRleHQgICpjb250ZXh0KQoreworICBEQnVzTGlzdCAqbGluazsKKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNvbnRleHQtPnNlcnZlcnMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIHNodXRkb3duX3NlcnZlciAoY29udGV4dCwgbGluay0+ZGF0YSk7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZjb250ZXh0LT5zZXJ2ZXJzLCBsaW5rKTsKKyAgICB9Cit9CisKK0J1c0NvbnRleHQgKgorYnVzX2NvbnRleHRfcmVmIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICBfZGJ1c19hc3NlcnQgKGNvbnRleHQtPnJlZmNvdW50ID4gMCk7CisgIGNvbnRleHQtPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIGNvbnRleHQ7Cit9CisKK3ZvaWQKK2J1c19jb250ZXh0X3VucmVmIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICBfZGJ1c19hc3NlcnQgKGNvbnRleHQtPnJlZmNvdW50ID4gMCk7CisgIGNvbnRleHQtPnJlZmNvdW50IC09IDE7CisKKyAgaWYgKGNvbnRleHQtPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgREJ1c0xpc3QgKmxpbms7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGaW5hbGl6aW5nIGJ1cyBjb250ZXh0ICVwXG4iLCBjb250ZXh0KTsKKworICAgICAgYnVzX2NvbnRleHRfc2h1dGRvd24gKGNvbnRleHQpOworCisgICAgICBpZiAoY29udGV4dC0+Y29ubmVjdGlvbnMpCisgICAgICAgIHsKKyAgICAgICAgICBidXNfY29ubmVjdGlvbnNfdW5yZWYgKGNvbnRleHQtPmNvbm5lY3Rpb25zKTsKKyAgICAgICAgICBjb250ZXh0LT5jb25uZWN0aW9ucyA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgaWYgKGNvbnRleHQtPnJlZ2lzdHJ5KQorICAgICAgICB7CisgICAgICAgICAgYnVzX3JlZ2lzdHJ5X3VucmVmIChjb250ZXh0LT5yZWdpc3RyeSk7CisgICAgICAgICAgY29udGV4dC0+cmVnaXN0cnkgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgIGlmIChjb250ZXh0LT5hY3RpdmF0aW9uKQorICAgICAgICB7CisgICAgICAgICAgYnVzX2FjdGl2YXRpb25fdW5yZWYgKGNvbnRleHQtPmFjdGl2YXRpb24pOworICAgICAgICAgIGNvbnRleHQtPmFjdGl2YXRpb24gPSBOVUxMOworICAgICAgICB9CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmY29udGV4dC0+c2VydmVycyk7CisgICAgICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXJ2ZXJfdW5yZWYgKGxpbmstPmRhdGEpOworCisgICAgICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmNvbnRleHQtPnNlcnZlcnMsIGxpbmspOworICAgICAgICB9CisgICAgICBfZGJ1c19saXN0X2NsZWFyICgmY29udGV4dC0+c2VydmVycyk7CisKKyAgICAgIGlmIChjb250ZXh0LT5wb2xpY3kpCisgICAgICAgIHsKKyAgICAgICAgICBidXNfcG9saWN5X3VucmVmIChjb250ZXh0LT5wb2xpY3kpOworICAgICAgICAgIGNvbnRleHQtPnBvbGljeSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgaWYgKGNvbnRleHQtPmxvb3ApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19sb29wX3VucmVmIChjb250ZXh0LT5sb29wKTsKKyAgICAgICAgICBjb250ZXh0LT5sb29wID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBpZiAoY29udGV4dC0+bWF0Y2htYWtlcikKKyAgICAgICAgeworICAgICAgICAgIGJ1c19tYXRjaG1ha2VyX3VucmVmIChjb250ZXh0LT5tYXRjaG1ha2VyKTsKKyAgICAgICAgICBjb250ZXh0LT5tYXRjaG1ha2VyID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBkYnVzX2ZyZWUgKGNvbnRleHQtPmNvbmZpZ19maWxlKTsKKyAgICAgIGRidXNfZnJlZSAoY29udGV4dC0+bG9nX3ByZWZpeCk7CisgICAgICBkYnVzX2ZyZWUgKGNvbnRleHQtPnR5cGUpOworICAgICAgZGJ1c19mcmVlIChjb250ZXh0LT5hZGRyZXNzKTsKKyAgICAgIGRidXNfZnJlZSAoY29udGV4dC0+dXNlcik7CisgICAgICBkYnVzX2ZyZWUgKGNvbnRleHQtPnNlcnZpY2VoZWxwZXIpOworCisjaWZkZWYgV0FOVF9QSURGSUxFCisgICAgICBpZiAoY29udGV4dC0+cGlkZmlsZSkKKwl7CisgICAgICAgICAgREJ1c1N0cmluZyB1OworICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdSwgY29udGV4dC0+cGlkZmlsZSk7CisKKyAgICAgICAgICAvKiBEZWxpYmVyYXRlbHkgaWdub3JlIGVycm9ycyBoZXJlLCBzaW5jZSB0aGVyZSdzIG5vdCBtdWNoCisJICAgKiB3ZSBjYW4gZG8gYWJvdXQgaXQsIGFuZCB3ZSdyZSBleGl0aW5nIGFueXdheXMuCisJICAgKi8KKwkgIF9kYnVzX2RlbGV0ZV9maWxlICgmdSwgTlVMTCk7CisKKyAgICAgICAgICBkYnVzX2ZyZWUgKGNvbnRleHQtPnBpZGZpbGUpOworCX0KKyNlbmRpZgorCisgICAgICBkYnVzX2ZyZWUgKGNvbnRleHQpOworCisgICAgICBkYnVzX3NlcnZlcl9mcmVlX2RhdGFfc2xvdCAoJnNlcnZlcl9kYXRhX3Nsb3QpOworICAgIH0KK30KKworLyogdHlwZSBtYXkgYmUgTlVMTCAqLworY29uc3QgY2hhcioKK2J1c19jb250ZXh0X2dldF90eXBlIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+dHlwZTsKK30KKworY29uc3QgY2hhcioKK2J1c19jb250ZXh0X2dldF9hZGRyZXNzIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+YWRkcmVzczsKK30KKworY29uc3QgY2hhcioKK2J1c19jb250ZXh0X2dldF9zZXJ2aWNlaGVscGVyIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+c2VydmljZWhlbHBlcjsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb250ZXh0X2dldF9zeXN0ZW1kX2FjdGl2YXRpb24gKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIHJldHVybiBjb250ZXh0LT5zeXN0ZW1kX2FjdGl2YXRpb247Cit9CisKK0J1c1JlZ2lzdHJ5KgorYnVzX2NvbnRleHRfZ2V0X3JlZ2lzdHJ5IChCdXNDb250ZXh0ICAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPnJlZ2lzdHJ5OworfQorCitCdXNDb25uZWN0aW9ucyoKK2J1c19jb250ZXh0X2dldF9jb25uZWN0aW9ucyAoQnVzQ29udGV4dCAgKmNvbnRleHQpCit7CisgIHJldHVybiBjb250ZXh0LT5jb25uZWN0aW9uczsKK30KKworQnVzQWN0aXZhdGlvbioKK2J1c19jb250ZXh0X2dldF9hY3RpdmF0aW9uIChCdXNDb250ZXh0ICAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPmFjdGl2YXRpb247Cit9CisKK0J1c01hdGNobWFrZXIqCitidXNfY29udGV4dF9nZXRfbWF0Y2htYWtlciAoQnVzQ29udGV4dCAgKmNvbnRleHQpCit7CisgIHJldHVybiBjb250ZXh0LT5tYXRjaG1ha2VyOworfQorCitEQnVzTG9vcCoKK2J1c19jb250ZXh0X2dldF9sb29wIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+bG9vcDsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb250ZXh0X2FsbG93X3VuaXhfdXNlciAoQnVzQ29udGV4dCAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHVpZCkKK3sKKyAgcmV0dXJuIGJ1c19wb2xpY3lfYWxsb3dfdW5peF91c2VyIChjb250ZXh0LT5wb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkKTsKK30KKworLyogRm9yIG5vdyB0aGlzIGlzIG5ldmVyIGFjdHVhbGx5IGNhbGxlZCBiZWNhdXNlIHRoZSBkZWZhdWx0CisgKiBEQnVzQ29ubmVjdGlvbiBiZWhhdmlvciBvZiAnc2FtZSB1c2VyIHRoYXQgb3ducyB0aGUgYnVzIGNhbiBjb25uZWN0JworICogaXMgYWxsIGl0IHdvdWxkIGRvLgorICovCitkYnVzX2Jvb2xfdAorYnVzX2NvbnRleHRfYWxsb3dfd2luZG93c191c2VyIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICp3aW5kb3dzX3NpZCkKK3sKKyAgcmV0dXJuIGJ1c19wb2xpY3lfYWxsb3dfd2luZG93c191c2VyIChjb250ZXh0LT5wb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93c19zaWQpOworfQorCitCdXNQb2xpY3kgKgorYnVzX2NvbnRleHRfZ2V0X3BvbGljeSAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPnBvbGljeTsKK30KKworQnVzQ2xpZW50UG9saWN5KgorYnVzX2NvbnRleHRfY3JlYXRlX2NsaWVudF9wb2xpY3kgKEJ1c0NvbnRleHQgICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvcikKK3sKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIHJldHVybiBidXNfcG9saWN5X2NyZWF0ZV9jbGllbnRfcG9saWN5IChjb250ZXh0LT5wb2xpY3ksIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2ludAorYnVzX2NvbnRleHRfZ2V0X2FjdGl2YXRpb25fdGltZW91dCAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKworICByZXR1cm4gY29udGV4dC0+bGltaXRzLmFjdGl2YXRpb25fdGltZW91dDsKK30KKworaW50CitidXNfY29udGV4dF9nZXRfYXV0aF90aW1lb3V0IChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+bGltaXRzLmF1dGhfdGltZW91dDsKK30KKworaW50CitidXNfY29udGV4dF9nZXRfbWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPmxpbWl0cy5tYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zOworfQorCitpbnQKK2J1c19jb250ZXh0X2dldF9tYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPmxpbWl0cy5tYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9uczsKK30KKworaW50CitidXNfY29udGV4dF9nZXRfbWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+bGltaXRzLm1heF9jb25uZWN0aW9uc19wZXJfdXNlcjsKK30KKworaW50CitidXNfY29udGV4dF9nZXRfbWF4X3BlbmRpbmdfYWN0aXZhdGlvbnMgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIHJldHVybiBjb250ZXh0LT5saW1pdHMubWF4X3BlbmRpbmdfYWN0aXZhdGlvbnM7Cit9CisKK2ludAorYnVzX2NvbnRleHRfZ2V0X21heF9zZXJ2aWNlc19wZXJfY29ubmVjdGlvbiAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPmxpbWl0cy5tYXhfc2VydmljZXNfcGVyX2Nvbm5lY3Rpb247Cit9CisKK2ludAorYnVzX2NvbnRleHRfZ2V0X21heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbiAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPmxpbWl0cy5tYXhfbWF0Y2hfcnVsZXNfcGVyX2Nvbm5lY3Rpb247Cit9CisKK2ludAorYnVzX2NvbnRleHRfZ2V0X21heF9yZXBsaWVzX3Blcl9jb25uZWN0aW9uIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+bGltaXRzLm1heF9yZXBsaWVzX3Blcl9jb25uZWN0aW9uOworfQorCitpbnQKK2J1c19jb250ZXh0X2dldF9yZXBseV90aW1lb3V0IChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+bGltaXRzLnJlcGx5X3RpbWVvdXQ7Cit9CisKK3ZvaWQKK2J1c19jb250ZXh0X2xvZyAoQnVzQ29udGV4dCAqY29udGV4dCwgREJ1c1N5c3RlbUxvZ1NldmVyaXR5IHNldmVyaXR5LCBjb25zdCBjaGFyICptc2csIC4uLikgX0RCVVNfR05VQ19QUklOVEYgKDMsIDQpOworCit2b2lkCitidXNfY29udGV4dF9sb2cgKEJ1c0NvbnRleHQgKmNvbnRleHQsIERCdXNTeXN0ZW1Mb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3QgY2hhciAqbXNnLCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKworICBpZiAoIWNvbnRleHQtPnN5c2xvZykKKyAgICB7CisgICAgICAvKiB3ZSdyZSBub3Qgc3lzbG9nZ2luZzsganVzdCBvdXRwdXQgdG8gc3RkZXJyICovCisgICAgICB2YV9zdGFydCAoYXJncywgbXNnKTsKKyAgICAgIHZmcHJpbnRmIChzdGRlcnIsIG1zZywgYXJncyk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOworICAgICAgdmFfZW5kIChhcmdzKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgdmFfc3RhcnQgKGFyZ3MsIG1zZyk7CisKKyAgaWYgKGNvbnRleHQtPmxvZ19wcmVmaXgpCisgICAgeworICAgICAgREJ1c1N0cmluZyBmdWxsX21zZzsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfbXNnKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZmdWxsX21zZywgY29udGV4dC0+bG9nX3ByZWZpeCkpCisgICAgICAgIGdvdG8gb29tX291dDsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGZfdmFsaXN0ICgmZnVsbF9tc2csIG1zZywgYXJncykpCisgICAgICAgIGdvdG8gb29tX291dDsKKworICAgICAgX2RidXNfc3lzdGVtX2xvZyAoc2V2ZXJpdHksICIlcyIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZ1bGxfbXNnKSk7CisgICAgb29tX291dDoKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9tc2cpOworICAgIH0KKyAgZWxzZQorICAgIF9kYnVzX3N5c3RlbV9sb2d2IChzZXZlcml0eSwgbXNnLCBhcmdzKTsKKworb3V0OgorICB2YV9lbmQgKGFyZ3MpOworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKgorbm9ubnVsbCAoY29uc3QgY2hhciAqbWF5YmVfbnVsbCwKKyAgICAgICAgIGNvbnN0IGNoYXIgKmlmX251bGwpCit7CisgIHJldHVybiAobWF5YmVfbnVsbCA/IG1heWJlX251bGwgOiBpZl9udWxsKTsKK30KKworLyoKKyAqIExvZyBzb21ldGhpbmcgYWJvdXQgYSBtZXNzYWdlLCB1c3VhbGx5IHRoYXQgaXQgd2FzIHJlamVjdGVkLgorICovCitzdGF0aWMgdm9pZAorY29tcGxhaW5fYWJvdXRfbWVzc2FnZSAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZXJyb3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpjb21wbGFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgbWF0Y2hlZF9ydWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKnNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpwcm9wb3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgcmVxdWVzdGVkX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgIGxvZywKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c0Vycm9yIHN0YWNrX2Vycm9yID0gREJVU19FUlJPUl9JTklUOworICBjb25zdCBjaGFyICpzZW5kZXJfbmFtZTsKKyAgY29uc3QgY2hhciAqc2VuZGVyX2xvZ2luZm87CisgIGNvbnN0IGNoYXIgKnByb3Bvc2VkX3JlY2lwaWVudF9sb2dpbmZvOworCisgIGlmIChlcnJvciA9PSBOVUxMICYmICFsb2cpCisgICAgcmV0dXJuOworCisgIGlmIChzZW5kZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBzZW5kZXJfbmFtZSA9IGJ1c19jb25uZWN0aW9uX2dldF9uYW1lIChzZW5kZXIpOworICAgICAgc2VuZGVyX2xvZ2luZm8gPSBidXNfY29ubmVjdGlvbl9nZXRfbG9naW5mbyAoc2VuZGVyKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzZW5kZXJfbmFtZSA9ICIodW5zZXQpIjsKKyAgICAgIHNlbmRlcl9sb2dpbmZvID0gIihidXMpIjsKKyAgICB9CisKKyAgaWYgKHByb3Bvc2VkX3JlY2lwaWVudCAhPSBOVUxMKQorICAgIHByb3Bvc2VkX3JlY2lwaWVudF9sb2dpbmZvID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X2xvZ2luZm8gKHByb3Bvc2VkX3JlY2lwaWVudCk7CisgIGVsc2UKKyAgICBwcm9wb3NlZF9yZWNpcGllbnRfbG9naW5mbyA9ICJidXMiOworCisgIGRidXNfc2V0X2Vycm9yICgmc3RhY2tfZXJyb3IsIGVycm9yX25hbWUsCisgICAgICAiJXMsICVkIG1hdGNoZWQgcnVsZXM7IHR5cGU9XCIlc1wiLCBzZW5kZXI9XCIlc1wiICglcykgIgorICAgICAgImludGVyZmFjZT1cIiVzXCIgbWVtYmVyPVwiJXNcIiBlcnJvciBuYW1lPVwiJXNcIiAiCisgICAgICAicmVxdWVzdGVkX3JlcGx5PVwiJWRcIiBkZXN0aW5hdGlvbj1cIiVzXCIgKCVzKSIsCisgICAgICBjb21wbGFpbnQsCisgICAgICBtYXRjaGVkX3J1bGVzLAorICAgICAgZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpKSwKKyAgICAgIHNlbmRlcl9uYW1lLAorICAgICAgc2VuZGVyX2xvZ2luZm8sCisgICAgICBub25udWxsIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSksICIodW5zZXQpIiksCisgICAgICBub25udWxsIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSksICIodW5zZXQpIiksCisgICAgICBub25udWxsIChkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpLCAiKHVuc2V0KSIpLAorICAgICAgcmVxdWVzdGVkX3JlcGx5LAorICAgICAgbm9ubnVsbCAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSksIERCVVNfU0VSVklDRV9EQlVTKSwKKyAgICAgIHByb3Bvc2VkX3JlY2lwaWVudF9sb2dpbmZvKTsKKworICAvKiBJZiB3ZSBoaXQgT09NIHdoaWxlIHNldHRpbmcgdGhlIGVycm9yLCB0aGlzIHdpbGwgc3lzbG9nICJvdXQgb2YgbWVtb3J5IgorICAgKiB3aGljaCBpcyBpdHNlbGYgYW4gaW5kaWNhdGlvbiB0aGF0IHNvbWV0aGluZyBpcyBzZXJpb3VzbHkgd3JvbmcgKi8KKyAgaWYgKGxvZykKKyAgICBidXNfY29udGV4dF9sb2cgKGNvbnRleHQsIERCVVNfU1lTVEVNX0xPR19TRUNVUklUWSwgIiVzIiwKKyAgICAgICAgc3RhY2tfZXJyb3IubWVzc2FnZSk7CisKKyAgZGJ1c19tb3ZlX2Vycm9yICgmc3RhY2tfZXJyb3IsIGVycm9yKTsKK30KKworLyoKKyAqIGFkZHJlc3NlZF9yZWNpcGllbnQgaXMgdGhlIHJlY2lwaWVudCBzcGVjaWZpZWQgaW4gdGhlIG1lc3NhZ2UuCisgKgorICogcHJvcG9zZWRfcmVjaXBpZW50IGlzIHRoZSByZWNpcGllbnQgd2UncmUgY29uc2lkZXJpbmcgc2VuZGluZworICogdG8gcmlnaHQgdGhpcyBzZWNvbmQsIGFuZCBtYXkgYmUgYW4gZWF2ZXNkcm9wcGVyLgorICoKKyAqIHNlbmRlciBpcyB0aGUgc2VuZGVyIG9mIHRoZSBtZXNzYWdlLgorICoKKyAqIE5VTEwgZm9yIHByb3Bvc2VkX3JlY2lwaWVudCBvciBzZW5kZXIgZGVmaW5pdGVseSBtZWFucyB0aGUgYnVzIGRyaXZlci4KKyAqCisgKiBOVUxMIGZvciBhZGRyZXNzZWRfcmVjaXBpZW50IG1heSBtZWFuIHRoZSBidXMgZHJpdmVyLCBvciBtYXkgbWVhbgorICogbm8gZGVzdGluYXRpb24gd2FzIHNwZWNpZmllZCBpbiB0aGUgbWVzc2FnZSAoZS5nLiBhIHNpZ25hbCkuCisgKi8KK2RidXNfYm9vbF90CitidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICphZGRyZXNzZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqcHJvcG9zZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpkZXN0OworICBCdXNDbGllbnRQb2xpY3kgKnNlbmRlcl9wb2xpY3k7CisgIEJ1c0NsaWVudFBvbGljeSAqcmVjaXBpZW50X3BvbGljeTsKKyAgZGJ1c19pbnQzMl90IHRvZ2dsZXM7CisgIGRidXNfYm9vbF90IGxvZzsKKyAgaW50IHR5cGU7CisgIGRidXNfYm9vbF90IHJlcXVlc3RlZF9yZXBseTsKKworICB0eXBlID0gZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKTsKKyAgZGVzdCA9IGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKG1lc3NhZ2UpOworCisgIC8qIGRpc3BhdGNoLmMgd2FzIHN1cHBvc2VkIHRvIGVuc3VyZSB0aGVzZSBpbnZhcmlhbnRzICovCisgIF9kYnVzX2Fzc2VydCAoZGVzdCAhPSBOVUxMIHx8CisgICAgICAgICAgICAgICAgdHlwZSA9PSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwgfHwKKyAgICAgICAgICAgICAgICAoc2VuZGVyID09IE5VTEwgJiYgIWJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAocHJvcG9zZWRfcmVjaXBpZW50KSkpOworICBfZGJ1c19hc3NlcnQgKHR5cGUgPT0gREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMIHx8CisgICAgICAgICAgICAgICAgYWRkcmVzc2VkX3JlY2lwaWVudCAhPSBOVUxMIHx8CisgICAgICAgICAgICAgICAgc3RyY21wIChkZXN0LCBEQlVTX1NFUlZJQ0VfREJVUykgPT0gMCk7CisKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMOgorICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMOgorICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTjoKKyAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SOgorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgX2RidXNfdmVyYm9zZSAoInNlY3VyaXR5IGNoZWNrIGRpc2FsbG93aW5nIG1lc3NhZ2Ugb2YgdW5rbm93biB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgdHlwZSk7CisKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVELAorICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlIGJ1cyB3aWxsIG5vdCBhY2NlcHQgbWVzc2FnZXMgb2YgdW5rbm93biB0eXBlXG4iKTsKKworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXF1ZXN0ZWRfcmVwbHkgPSBGQUxTRTsKKworICBpZiAoc2VuZGVyICE9IE5VTEwpCisgICAgeworICAgICAgLyogRmlyc3QgdmVyaWZ5IHRoZSBTRUxpbnV4IGFjY2VzcyBjb250cm9scy4gIElmIGFsbG93ZWQgdGhlbgorICAgICAgICogZ28gb24gd2l0aCB0aGUgc3RhbmRhcmQgY2hlY2tzLgorICAgICAgICovCisgICAgICBpZiAoIWJ1c19zZWxpbnV4X2FsbG93c19zZW5kIChzZW5kZXIsIHByb3Bvc2VkX3JlY2lwaWVudCwKKwkJCQkgICAgZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpKSwKKwkJCQkgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpLAorCQkJCSAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSksCisJCQkJICAgIGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSksCisJCQkJICAgIGRlc3QgPyBkZXN0IDogREJVU19TRVJWSUNFX0RCVVMsIGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChlcnJvciAhPSBOVUxMICYmICFkYnVzX2Vycm9yX2lzX3NldCAoZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBkb24ndCBzeXNsb2cgdGhpcywganVzdCBzZXQgdGhlIGVycm9yOiBhdmNfaGFzX3Blcm0gc2hvdWxkCisgICAgICAgICAgICAgICAqIGhhdmUgYWxyZWFkeSB3cml0dGVuIHRvIGVpdGhlciB0aGUgYXVkaXQgbG9nIG9yIHN5c2xvZyAqLworICAgICAgICAgICAgICBjb21wbGFpbl9hYm91dF9tZXNzYWdlIChjb250ZXh0LCBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQsCisgICAgICAgICAgICAgICAgICAiQW4gU0VMaW51eCBwb2xpY3kgcHJldmVudHMgdGhpcyBzZW5kZXIgZnJvbSBzZW5kaW5nIHRoaXMgIgorICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgdG8gdGhpcyByZWNpcGllbnQiLAorICAgICAgICAgICAgICAgICAgMCwgbWVzc2FnZSwgc2VuZGVyLCBwcm9wb3NlZF9yZWNpcGllbnQsIEZBTFNFLCBGQUxTRSwgZXJyb3IpOworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiU0VMaW51eCBzZWN1cml0eSBjaGVjayBkZW55aW5nIHNlbmQgdG8gc2VydmljZVxuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgaWYgKGJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAoc2VuZGVyKSkKKyAgICAgICAgeworICAgICAgICAgIHNlbmRlcl9wb2xpY3kgPSBidXNfY29ubmVjdGlvbl9nZXRfcG9saWN5IChzZW5kZXIpOworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoc2VuZGVyX3BvbGljeSAhPSBOVUxMKTsKKworICAgICAgICAgIC8qIEZpbGwgaW4gcmVxdWVzdGVkX3JlcGx5IHZhcmlhYmxlIHdpdGggVFJVRSBpZiB0aGlzIGlzIGEKKyAgICAgICAgICAgKiByZXBseSBhbmQgdGhlIHJlcGx5IHdhcyBwZW5kaW5nLgorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKHByb3Bvc2VkX3JlY2lwaWVudCAhPSBOVUxMIC8qIG5vdCB0byB0aGUgYnVzIGRyaXZlciAqLyAmJgorICAgICAgICAgICAgICAgICAgYWRkcmVzc2VkX3JlY2lwaWVudCA9PSBwcm9wb3NlZF9yZWNpcGllbnQgLyogbm90IGVhdmVzZHJvcHBpbmcgKi8pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yIGVycm9yMjsKKworICAgICAgICAgICAgICAgICAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IyKTsKKyAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9yZXBseSA9IGJ1c19jb25uZWN0aW9uc19jaGVja19yZXBseSAoYnVzX2Nvbm5lY3Rpb25fZ2V0X2Nvbm5lY3Rpb25zIChzZW5kZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyLCBhZGRyZXNzZWRfcmVjaXBpZW50LCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IyKTsKKyAgICAgICAgICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yMikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21vdmVfZXJyb3IgKCZlcnJvcjIsIGVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIFBvbGljeSBmb3IgaW5hY3RpdmUgY29ubmVjdGlvbnMgaXMgdGhhdCB0aGV5IGNhbiBvbmx5IHNlbmQKKyAgICAgICAgICAgKiB0aGUgaGVsbG8gbWVzc2FnZSB0byB0aGUgYnVzIGRyaXZlcgorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChwcm9wb3NlZF9yZWNpcGllbnQgPT0gTlVMTCAmJgorICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsbG8iKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInNlY3VyaXR5IGNoZWNrIGFsbG93aW5nICVzIG1lc3NhZ2VcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxsbyIpOworICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJzZWN1cml0eSBjaGVjayBkaXNhbGxvd2luZyBub24tJXMgbWVzc2FnZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbGxvIik7CisKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2xpZW50IHRyaWVkIHRvIHNlbmQgYSBtZXNzYWdlIG90aGVyIHRoYW4gJXMgd2l0aG91dCBiZWluZyByZWdpc3RlcmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxsbyIpOworCisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHNlbmRlcl9wb2xpY3kgPSBOVUxMOworCisgICAgICAvKiBJZiB0aGUgc2VuZGVyIGlzIHRoZSBidXMgZHJpdmVyLCB3ZSBhc3N1bWUgYW55IHJlcGx5IHdhcyBhCisgICAgICAgKiByZXF1ZXN0ZWQgcmVwbHkgYXMgYnVzIGRyaXZlciB3b24ndCBzZW5kIGJvZ3VzIG9uZXMKKyAgICAgICAqLworICAgICAgaWYgKGFkZHJlc3NlZF9yZWNpcGllbnQgPT0gcHJvcG9zZWRfcmVjaXBpZW50IC8qIG5vdCBlYXZlc2Ryb3BwaW5nICovICYmCisgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpICE9IDApCisgICAgICAgIHJlcXVlc3RlZF9yZXBseSA9IFRSVUU7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoKHNlbmRlciAhPSBOVUxMICYmIHNlbmRlcl9wb2xpY3kgIT0gTlVMTCkgfHwKKyAgICAgICAgICAgICAgICAoc2VuZGVyID09IE5VTEwgJiYgc2VuZGVyX3BvbGljeSA9PSBOVUxMKSk7CisKKyAgaWYgKHByb3Bvc2VkX3JlY2lwaWVudCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIG9ubHkgdGhlIGJ1cyBkcml2ZXIgY2FuIHNlbmQgdG8gYW4gaW5hY3RpdmUgcmVjaXBpZW50IChhcyBpdAorICAgICAgICogb3ducyBubyBzZXJ2aWNlcywgc28gb3RoZXIgYXBwcyBjYW4ndCBhZGRyZXNzIGl0KS4gSW5hY3RpdmUKKyAgICAgICAqIHJlY2lwaWVudHMgY2FuIHJlY2VpdmUgYW55IG1lc3NhZ2UuCisgICAgICAgKi8KKyAgICAgIGlmIChidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKHByb3Bvc2VkX3JlY2lwaWVudCkpCisgICAgICAgIHsKKyAgICAgICAgICByZWNpcGllbnRfcG9saWN5ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X3BvbGljeSAocHJvcG9zZWRfcmVjaXBpZW50KTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKHJlY2lwaWVudF9wb2xpY3kgIT0gTlVMTCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNlbmRlciA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInNlY3VyaXR5IGNoZWNrIHVzaW5nIE5VTEwgcmVjaXBpZW50IHBvbGljeSBmb3IgbWVzc2FnZSBmcm9tIGJ1c1xuIik7CisgICAgICAgICAgcmVjaXBpZW50X3BvbGljeSA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImEgbWVzc2FnZSB3YXMgc29tZWhvdyBzZW50IHRvIGFuIGluYWN0aXZlIHJlY2lwaWVudCBmcm9tIGEgc291cmNlIG90aGVyIHRoYW4gdGhlIG1lc3NhZ2UgYnVzXG4iKTsKKyAgICAgICAgICByZWNpcGllbnRfcG9saWN5ID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHJlY2lwaWVudF9wb2xpY3kgPSBOVUxMOworCisgIF9kYnVzX2Fzc2VydCAoKHByb3Bvc2VkX3JlY2lwaWVudCAhPSBOVUxMICYmIHJlY2lwaWVudF9wb2xpY3kgIT0gTlVMTCkgfHwKKyAgICAgICAgICAgICAgICAocHJvcG9zZWRfcmVjaXBpZW50ICE9IE5VTEwgJiYgc2VuZGVyID09IE5VTEwgJiYgcmVjaXBpZW50X3BvbGljeSA9PSBOVUxMKSB8fAorICAgICAgICAgICAgICAgIChwcm9wb3NlZF9yZWNpcGllbnQgPT0gTlVMTCAmJiByZWNpcGllbnRfcG9saWN5ID09IE5VTEwpKTsKKworICBsb2cgPSBGQUxTRTsKKyAgaWYgKHNlbmRlcl9wb2xpY3kgJiYKKyAgICAgICFidXNfY2xpZW50X3BvbGljeV9jaGVja19jYW5fc2VuZCAoc2VuZGVyX3BvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+cmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcG9zZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCAmdG9nZ2xlcywgJmxvZykpCisgICAgeworICAgICAgY29tcGxhaW5fYWJvdXRfbWVzc2FnZSAoY29udGV4dCwgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVELAorICAgICAgICAgICJSZWplY3RlZCBzZW5kIG1lc3NhZ2UiLCB0b2dnbGVzLAorICAgICAgICAgIG1lc3NhZ2UsIHNlbmRlciwgcHJvcG9zZWRfcmVjaXBpZW50LCByZXF1ZXN0ZWRfcmVwbHksCisgICAgICAgICAgKGFkZHJlc3NlZF9yZWNpcGllbnQgPT0gcHJvcG9zZWRfcmVjaXBpZW50KSwgZXJyb3IpOworICAgICAgX2RidXNfdmVyYm9zZSAoInNlY3VyaXR5IHBvbGljeSBkaXNhbGxvd2luZyBtZXNzYWdlIGR1ZSB0byBzZW5kZXIgcG9saWN5XG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKGxvZykKKyAgICB7CisgICAgICAvKiBXZSB3YW50IHRvIGRyb3AgdGhpcyBtZXNzYWdlLCBhbmQgYXJlIG9ubHkgbm90IGRvaW5nIHNvIGZvciBiYWNrd2FyZHMKKyAgICAgICAqIGNvbXBhdGliaWxpdHkuICovCisgICAgICBjb21wbGFpbl9hYm91dF9tZXNzYWdlIChjb250ZXh0LCBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQsCisgICAgICAgICAgIldvdWxkIHJlamVjdCBtZXNzYWdlIiwgdG9nZ2xlcywKKyAgICAgICAgICBtZXNzYWdlLCBzZW5kZXIsIHByb3Bvc2VkX3JlY2lwaWVudCwgcmVxdWVzdGVkX3JlcGx5LAorICAgICAgICAgIFRSVUUsIE5VTEwpOworICAgIH0KKworICBpZiAocmVjaXBpZW50X3BvbGljeSAmJgorICAgICAgIWJ1c19jbGllbnRfcG9saWN5X2NoZWNrX2Nhbl9yZWNlaXZlIChyZWNpcGllbnRfcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5yZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NlZF9yZWNpcGllbnQsIHByb3Bvc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgJnRvZ2dsZXMpKQorICAgIHsKKyAgICAgIGNvbXBsYWluX2Fib3V0X21lc3NhZ2UgKGNvbnRleHQsIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCwKKyAgICAgICAgICAiUmVqZWN0ZWQgcmVjZWl2ZSBtZXNzYWdlIiwgdG9nZ2xlcywKKyAgICAgICAgICBtZXNzYWdlLCBzZW5kZXIsIHByb3Bvc2VkX3JlY2lwaWVudCwgcmVxdWVzdGVkX3JlcGx5LAorICAgICAgICAgIChhZGRyZXNzZWRfcmVjaXBpZW50ID09IHByb3Bvc2VkX3JlY2lwaWVudCksIE5VTEwpOworICAgICAgX2RidXNfdmVyYm9zZSAoInNlY3VyaXR5IHBvbGljeSBkaXNhbGxvd2luZyBtZXNzYWdlIGR1ZSB0byByZWNpcGllbnQgcG9saWN5XG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogU2VlIGlmIGxpbWl0cyBvbiBzaXplIGhhdmUgYmVlbiBleGNlZWRlZCAqLworICBpZiAocHJvcG9zZWRfcmVjaXBpZW50ICYmCisgICAgICAoKGRidXNfY29ubmVjdGlvbl9nZXRfb3V0Z29pbmdfc2l6ZSAocHJvcG9zZWRfcmVjaXBpZW50KSA+IGNvbnRleHQtPmxpbWl0cy5tYXhfb3V0Z29pbmdfYnl0ZXMpIHx8CisgICAgICAgKGRidXNfY29ubmVjdGlvbl9nZXRfb3V0Z29pbmdfdW5peF9mZHMgKHByb3Bvc2VkX3JlY2lwaWVudCkgPiBjb250ZXh0LT5saW1pdHMubWF4X291dGdvaW5nX3VuaXhfZmRzKSkpCisgICAgeworICAgICAgY29tcGxhaW5fYWJvdXRfbWVzc2FnZSAoY29udGV4dCwgREJVU19FUlJPUl9MSU1JVFNfRVhDRUVERUQsCisgICAgICAgICAgIlJlamVjdGVkOiBkZXN0aW5hdGlvbiBoYXMgYSBmdWxsIG1lc3NhZ2UgcXVldWUiLAorICAgICAgICAgIDAsIG1lc3NhZ2UsIHNlbmRlciwgcHJvcG9zZWRfcmVjaXBpZW50LCByZXF1ZXN0ZWRfcmVwbHksIFRSVUUsCisgICAgICAgICAgZXJyb3IpOworICAgICAgX2RidXNfdmVyYm9zZSAoInNlY3VyaXR5IHBvbGljeSBkaXNhbGxvd2luZyBtZXNzYWdlIGR1ZSB0byBmdWxsIG1lc3NhZ2UgcXVldWVcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBSZWNvcmQgdGhhdCB3ZSB3aWxsIGFsbG93IGEgcmVwbHkgaGVyZSBpbiB0aGUgZnV0dXJlIChkb24ndAorICAgKiBib3RoZXIgaWYgdGhlIHJlY2lwaWVudCBpcyB0aGUgYnVzIG9yIHRoaXMgaXMgYW4gZWF2ZXNkcm9wcGluZworICAgKiBjb25uZWN0aW9uKS4gT25seSB0aGUgYWRkcmVzc2VkIHJlY2lwaWVudCBtYXkgcmVwbHkuCisgICAqLworICBpZiAodHlwZSA9PSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCAmJgorICAgICAgc2VuZGVyICYmCisgICAgICBhZGRyZXNzZWRfcmVjaXBpZW50ICYmCisgICAgICBhZGRyZXNzZWRfcmVjaXBpZW50ID09IHByb3Bvc2VkX3JlY2lwaWVudCAmJiAvKiBub3QgZWF2ZXNkcm9wcGluZyAqLworICAgICAgIWJ1c19jb25uZWN0aW9uc19leHBlY3RfcmVwbHkgKGJ1c19jb25uZWN0aW9uX2dldF9jb25uZWN0aW9ucyAoc2VuZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIsIGFkZHJlc3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gcmVjb3JkIHJlcGx5IGV4cGVjdGF0aW9uIG9yIHByb2JsZW0gd2l0aCB0aGUgbWVzc2FnZSBleHBlY3RpbmcgYSByZXBseVxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJzZWN1cml0eSBwb2xpY3kgYWxsb3dpbmcgbWVzc2FnZVxuIik7CisgIHJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy9idXMvYnVzLmggYi9kYnVzL2J1cy9idXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTk3ODg0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9idXMvYnVzLmgKQEAgLTAsMCArMSwxMjkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogYnVzLmggIG1lc3NhZ2UgYnVzIGNvbnRleHQgb2JqZWN0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgQlVTX0JVU19ICisjZGVmaW5lIEJVU19CVVNfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWlubG9vcC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1waXBlLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKwordHlwZWRlZiBzdHJ1Y3QgQnVzQWN0aXZhdGlvbiAgICBCdXNBY3RpdmF0aW9uOwordHlwZWRlZiBzdHJ1Y3QgQnVzQ29ubmVjdGlvbnMgICBCdXNDb25uZWN0aW9uczsKK3R5cGVkZWYgc3RydWN0IEJ1c0NvbnRleHQgICAgICAgQnVzQ29udGV4dDsKK3R5cGVkZWYgc3RydWN0IEJ1c1BvbGljeSAgICAgICAgQnVzUG9saWN5OwordHlwZWRlZiBzdHJ1Y3QgQnVzQ2xpZW50UG9saWN5ICBCdXNDbGllbnRQb2xpY3k7Cit0eXBlZGVmIHN0cnVjdCBCdXNQb2xpY3lSdWxlICAgIEJ1c1BvbGljeVJ1bGU7Cit0eXBlZGVmIHN0cnVjdCBCdXNSZWdpc3RyeSAgICAgIEJ1c1JlZ2lzdHJ5OwordHlwZWRlZiBzdHJ1Y3QgQnVzU0VMaW51eElEICAgICBCdXNTRUxpbnV4SUQ7Cit0eXBlZGVmIHN0cnVjdCBCdXNTZXJ2aWNlICAgICAgIEJ1c1NlcnZpY2U7Cit0eXBlZGVmIHN0cnVjdCBCdXNPd25lcgkJQnVzT3duZXI7Cit0eXBlZGVmIHN0cnVjdCBCdXNUcmFuc2FjdGlvbiAgIEJ1c1RyYW5zYWN0aW9uOwordHlwZWRlZiBzdHJ1Y3QgQnVzTWF0Y2htYWtlciAgICBCdXNNYXRjaG1ha2VyOwordHlwZWRlZiBzdHJ1Y3QgQnVzTWF0Y2hSdWxlICAgICBCdXNNYXRjaFJ1bGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGxvbmcgbWF4X2luY29taW5nX2J5dGVzOyAgICAgICAgICAvKio8IEhvdyBtYW55IGluY29taW5nIG1lc3NhZ2UgYnl0ZXMgZm9yIGEgc2luZ2xlIGNvbm5lY3Rpb24gKi8KKyAgbG9uZyBtYXhfaW5jb21pbmdfdW5peF9mZHM7ICAgICAgIC8qKjwgSG93IG1hbnkgaW5jb21pbmcgbWVzc2FnZSB1bml4IGZkcyBmb3IgYSBzaW5nbGUgY29ubmVjdGlvbiAqLworICBsb25nIG1heF9vdXRnb2luZ19ieXRlczsgICAgICAgICAgLyoqPCBIb3cgbWFueSBvdXRnb2luZyBieXRlcyBjYW4gYmUgcXVldWVkIGZvciBhIHNpbmdsZSBjb25uZWN0aW9uICovCisgIGxvbmcgbWF4X291dGdvaW5nX3VuaXhfZmRzOyAgICAgICAvKio8IEhvdyBtYW55IG91dGdvaW5nIHVuaXggZmRzIGNhbiBiZSBxdWV1ZWQgZm9yIGEgc2luZ2xlIGNvbm5lY3Rpb24gKi8KKyAgbG9uZyBtYXhfbWVzc2FnZV9zaXplOyAgICAgICAgICAgIC8qKjwgTWF4IHNpemUgb2YgYSBzaW5nbGUgbWVzc2FnZSBpbiBieXRlcyAqLworICBsb25nIG1heF9tZXNzYWdlX3VuaXhfZmRzOyAgICAgICAgLyoqPCBNYXggbnVtYmVyIG9mIHVuaXggZmRzIG9mIGEgc2luZ2xlIG1lc3NhZ2UqLworICBpbnQgYWN0aXZhdGlvbl90aW1lb3V0OyAgICAgICAgICAgLyoqPCBIb3cgbG9uZyB0byB3YWl0IGZvciBhbiBhY3RpdmF0aW9uIHRvIHRpbWUgb3V0ICovCisgIGludCBhdXRoX3RpbWVvdXQ7ICAgICAgICAgICAgICAgICAvKio8IEhvdyBsb25nIHRvIHdhaXQgZm9yIGFuIGF1dGhlbnRpY2F0aW9uIHRvIHRpbWUgb3V0ICovCisgIGludCBtYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zOyAgICAvKio8IE1heCBudW1iZXIgb2YgYXV0aG9yaXplZCBjb25uZWN0aW9ucyAqLworICBpbnQgbWF4X2luY29tcGxldGVfY29ubmVjdGlvbnM7ICAgLyoqPCBNYXggbnVtYmVyIG9mIGluY29tcGxldGUgY29ubmVjdGlvbnMgKi8KKyAgaW50IG1heF9jb25uZWN0aW9uc19wZXJfdXNlcjsgICAgIC8qKjwgTWF4IG51bWJlciBvZiBjb25uZWN0aW9ucyBhdXRoJ2QgYXMgc2FtZSB1c2VyICovCisgIGludCBtYXhfcGVuZGluZ19hY3RpdmF0aW9uczsgICAgICAvKio8IE1heCBudW1iZXIgb2YgcGVuZGluZyBhY3RpdmF0aW9ucyBmb3IgdGhlIGVudGlyZSBidXMgKi8KKyAgaW50IG1heF9zZXJ2aWNlc19wZXJfY29ubmVjdGlvbjsgIC8qKjwgTWF4IG51bWJlciBvZiBvd25lZCBzZXJ2aWNlcyBmb3IgYSBzaW5nbGUgY29ubmVjdGlvbiAqLworICBpbnQgbWF4X21hdGNoX3J1bGVzX3Blcl9jb25uZWN0aW9uOyAvKio8IE1heCBudW1iZXIgb2YgbWF0Y2ggcnVsZXMgZm9yIGEgc2luZ2xlIGNvbm5lY3Rpb24gKi8KKyAgaW50IG1heF9yZXBsaWVzX3Blcl9jb25uZWN0aW9uOyAgICAgLyoqPCBNYXggbnVtYmVyIG9mIHJlcGxpZXMgdGhhdCBjYW4gYmUgcGVuZGluZyBmb3IgZWFjaCBjb25uZWN0aW9uICovCisgIGludCByZXBseV90aW1lb3V0OyAgICAgICAgICAgICAgICAgIC8qKjwgSG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgdGltaW5nIG91dCBhIHJlcGx5ICovCit9IEJ1c0xpbWl0czsKKwordHlwZWRlZiBlbnVtCit7CisgIEJVU19DT05URVhUX0ZMQUdfTk9ORSA9IDAsCisgIEJVU19DT05URVhUX0ZMQUdfRk9SS19BTFdBWVMgPSAoMSA8PCAxKSwKKyAgQlVTX0NPTlRFWFRfRkxBR19GT1JLX05FVkVSID0gKDEgPDwgMiksCisgIEJVU19DT05URVhUX0ZMQUdfV1JJVEVfUElEX0ZJTEUgPSAoMSA8PCAzKSwKKyAgQlVTX0NPTlRFWFRfRkxBR19TWVNURU1EX0FDVElWQVRJT04gPSAoMSA8PCA0KQorfSBCdXNDb250ZXh0RmxhZ3M7CisKK0J1c0NvbnRleHQqICAgICAgIGJ1c19jb250ZXh0X25ldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgKmNvbmZpZ19maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzQ29udGV4dEZsYWdzICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUGlwZSAgICAgICAgICpwcmludF9hZGRyX3BpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUGlwZSAgICAgICAgICpwcmludF9waWRfcGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgICBidXNfY29udGV4dF9yZWxvYWRfY29uZmlnICAgICAgICAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0LAorCQkJCQkJCQkgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK3ZvaWQgICAgICAgICAgICAgIGJ1c19jb250ZXh0X3NodXRkb3duICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworQnVzQ29udGV4dCogICAgICAgYnVzX2NvbnRleHRfcmVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7Cit2b2lkICAgICAgICAgICAgICBidXNfY29udGV4dF91bnJlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK2RidXNfYm9vbF90ICAgICAgIGJ1c19jb250ZXh0X2dldF9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICp1dWlkKTsKK2NvbnN0IGNoYXIqICAgICAgIGJ1c19jb250ZXh0X2dldF90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworY29uc3QgY2hhciogICAgICAgYnVzX2NvbnRleHRfZ2V0X2FkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7Citjb25zdCBjaGFyKiAgICAgICBidXNfY29udGV4dF9nZXRfc2VydmljZWhlbHBlciAgICAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK2RidXNfYm9vbF90ICAgICAgIGJ1c19jb250ZXh0X2dldF9zeXN0ZW1kX2FjdGl2YXRpb24gICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworQnVzUmVnaXN0cnkqICAgICAgYnVzX2NvbnRleHRfZ2V0X3JlZ2lzdHJ5ICAgICAgICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7CitCdXNDb25uZWN0aW9ucyogICBidXNfY29udGV4dF9nZXRfY29ubmVjdGlvbnMgICAgICAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK0J1c0FjdGl2YXRpb24qICAgIGJ1c19jb250ZXh0X2dldF9hY3RpdmF0aW9uICAgICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworQnVzTWF0Y2htYWtlciogICAgYnVzX2NvbnRleHRfZ2V0X21hdGNobWFrZXIgICAgICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7CitEQnVzTG9vcCogICAgICAgICBidXNfY29udGV4dF9nZXRfbG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK2RidXNfYm9vbF90ICAgICAgIGJ1c19jb250ZXh0X2FsbG93X3VuaXhfdXNlciAgICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICB1aWQpOworZGJ1c19ib29sX3QgICAgICAgYnVzX2NvbnRleHRfYWxsb3dfd2luZG93c191c2VyICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKndpbmRvd3Nfc2lkKTsKK0J1c1BvbGljeSogICAgICAgIGJ1c19jb250ZXh0X2dldF9wb2xpY3kgICAgICAgICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworCitCdXNDbGllbnRQb2xpY3kqICBidXNfY29udGV4dF9jcmVhdGVfY2xpZW50X3BvbGljeSAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK2ludCAgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2dldF9hY3RpdmF0aW9uX3RpbWVvdXQgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworaW50ICAgICAgICAgICAgICAgYnVzX2NvbnRleHRfZ2V0X2F1dGhfdGltZW91dCAgICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7CitpbnQgICAgICAgICAgICAgICBidXNfY29udGV4dF9nZXRfbWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK2ludCAgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2dldF9tYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworaW50ICAgICAgICAgICAgICAgYnVzX2NvbnRleHRfZ2V0X21heF9jb25uZWN0aW9uc19wZXJfdXNlciAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7CitpbnQgICAgICAgICAgICAgICBidXNfY29udGV4dF9nZXRfbWF4X3BlbmRpbmdfYWN0aXZhdGlvbnMgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK2ludCAgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2dldF9tYXhfc2VydmljZXNfcGVyX2Nvbm5lY3Rpb24gICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworaW50ICAgICAgICAgICAgICAgYnVzX2NvbnRleHRfZ2V0X21heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbiAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7CitpbnQgICAgICAgICAgICAgICBidXNfY29udGV4dF9nZXRfbWF4X3JlcGxpZXNfcGVyX2Nvbm5lY3Rpb24gICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK2ludCAgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2dldF9yZXBseV90aW1lb3V0ICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOwordm9pZCAgICAgICAgICAgICAgYnVzX2NvbnRleHRfbG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTeXN0ZW1Mb2dTZXZlcml0eSBzZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLik7CitkYnVzX2Jvb2xfdCAgICAgICBidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gICAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICphZGRyZXNzZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAqcHJvcG9zZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKKworI2VuZGlmIC8qIEJVU19CVVNfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9idXMvY29uZmlnLWxvYWRlci1leHBhdC5jIGIvZGJ1cy9idXMvY29uZmlnLWxvYWRlci1leHBhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NzFmZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2J1cy9jb25maWctbG9hZGVyLWV4cGF0LmMKQEAgLTAsMCArMSwyOTQgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogY29uZmlnLWxvYWRlci1leHBhdC5jICBleHBhdCBYTUwgbG9hZGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJjb25maWctcGFyc2VyLmgiCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGV4cGF0Lmg+CisKK3N0YXRpYyBYTUxfTWVtb3J5X0hhbmRsaW5nX1N1aXRlIG1lbXN1aXRlOworCit0eXBlZGVmIHN0cnVjdAoreworICBCdXNDb25maWdQYXJzZXIgKnBhcnNlcjsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgIERCdXNTdHJpbmcgY29udGVudDsKKyAgREJ1c0Vycm9yICplcnJvcjsKKyAgZGJ1c19ib29sX3QgZmFpbGVkOworfSBFeHBhdFBhcnNlQ29udGV4dDsKKworc3RhdGljIGRidXNfYm9vbF90Citwcm9jZXNzX2NvbnRlbnQgKEV4cGF0UGFyc2VDb250ZXh0ICpjb250ZXh0KQoreworICBpZiAoY29udGV4dC0+ZmFpbGVkKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZjb250ZXh0LT5jb250ZW50KSA+IDApCisgICAgeworICAgICAgaWYgKCFidXNfY29uZmlnX3BhcnNlcl9jb250ZW50IChjb250ZXh0LT5wYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0LT5jb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBjb250ZXh0LT5mYWlsZWQgPSBUUlVFOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZjb250ZXh0LT5jb250ZW50LCAwKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitleHBhdF9TdGFydEVsZW1lbnRIYW5kbGVyICh2b2lkICAgICAgICAgICAgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKiphdHRzKQoreworICBFeHBhdFBhcnNlQ29udGV4dCAqY29udGV4dCA9IHVzZXJEYXRhOworICBpbnQgaTsKKyAgY2hhciAqKm5hbWVzOworICBjaGFyICoqdmFsdWVzOworCisgIC8qIEV4cGF0IHNlZW1zIHRvIHN1Y2sgYW5kIGNhbid0IGFib3J0IHRoZSBwYXJzZSBpZiB3ZQorICAgKiB0aHJvdyBhbiBlcnJvci4gRXhwYXQgMi4wIGlzIHN1cHBvc2VkIHRvIGZpeCB0aGlzLgorICAgKi8KKyAgaWYgKGNvbnRleHQtPmZhaWxlZCkKKyAgICByZXR1cm47CisKKyAgaWYgKCFwcm9jZXNzX2NvbnRlbnQgKGNvbnRleHQpKQorICAgIHJldHVybjsKKworICAvKiAiYXR0cyIgaXMga2V5LCB2YWx1ZSwga2V5LCB2YWx1ZSwgTlVMTCAqLworICBmb3IgKGkgPSAwOyBhdHRzW2ldICE9IE5VTEw7ICsraSkKKyAgICA7IC8qIG5vdGhpbmcgKi8KKworICBfZGJ1c19hc3NlcnQgKGkgJSAyID09IDApOworICBuYW1lcyA9IGRidXNfbmV3MCAoY2hhciAqLCBpIC8gMiArIDEpOworICB2YWx1ZXMgPSBkYnVzX25ldzAgKGNoYXIgKiwgaSAvIDIgKyAxKTsKKworICBpZiAobmFtZXMgPT0gTlVMTCB8fCB2YWx1ZXMgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoY29udGV4dC0+ZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGNvbnRleHQtPmZhaWxlZCA9IFRSVUU7CisgICAgICBkYnVzX2ZyZWUgKG5hbWVzKTsKKyAgICAgIGRidXNfZnJlZSAodmFsdWVzKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaSA9IDA7CisgIHdoaWxlIChhdHRzW2ldICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChpICUgMiA9PSAwKTsKKyAgICAgIG5hbWVzIFtpIC8gMl0gPSAoY2hhciopIGF0dHNbaV07CisgICAgICB2YWx1ZXNbaSAvIDJdID0gKGNoYXIqKSBhdHRzW2krMV07CisKKyAgICAgIGkgKz0gMjsKKyAgICB9CisKKyAgaWYgKCFidXNfY29uZmlnX3BhcnNlcl9zdGFydF9lbGVtZW50IChjb250ZXh0LT5wYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKikgbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKiopIHZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5lcnJvcikpCisgICAgeworICAgICAgZGJ1c19mcmVlIChuYW1lcyk7CisgICAgICBkYnVzX2ZyZWUgKHZhbHVlcyk7CisgICAgICBjb250ZXh0LT5mYWlsZWQgPSBUUlVFOworICAgICAgcmV0dXJuOworICAgIH0KKworICBkYnVzX2ZyZWUgKG5hbWVzKTsKKyAgZGJ1c19mcmVlICh2YWx1ZXMpOworfQorCitzdGF0aWMgdm9pZAorZXhwYXRfRW5kRWxlbWVudEhhbmRsZXIgKHZvaWQgICAgICAgICAgICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbmFtZSkKK3sKKyAgRXhwYXRQYXJzZUNvbnRleHQgKmNvbnRleHQgPSB1c2VyRGF0YTsKKworICBpZiAoIXByb2Nlc3NfY29udGVudCAoY29udGV4dCkpCisgICAgcmV0dXJuOworCisgIGlmICghYnVzX2NvbmZpZ19wYXJzZXJfZW5kX2VsZW1lbnQgKGNvbnRleHQtPnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IpKQorICAgIHsKKyAgICAgIGNvbnRleHQtPmZhaWxlZCA9IFRSVUU7CisgICAgICByZXR1cm47CisgICAgfQorfQorCisvKiBzIGlzIG5vdCAwIHRlcm1pbmF0ZWQuICovCitzdGF0aWMgdm9pZAorZXhwYXRfQ2hhcmFjdGVyRGF0YUhhbmRsZXIgKHZvaWQgICAgICAgICAgICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgbGVuKQoreworICBFeHBhdFBhcnNlQ29udGV4dCAqY29udGV4dCA9IHVzZXJEYXRhOworICBpZiAoY29udGV4dC0+ZmFpbGVkKQorICAgIHJldHVybjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfbGVuICgmY29udGV4dC0+Y29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywgbGVuKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoY29udGV4dC0+ZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGNvbnRleHQtPmZhaWxlZCA9IFRSVUU7CisgICAgICByZXR1cm47CisgICAgfQorfQorCisKK0J1c0NvbmZpZ1BhcnNlcioKK2J1c19jb25maWdfbG9hZCAoY29uc3QgREJ1c1N0cmluZyAgICAgICpmaWxlLAorICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgIGlzX3RvcGxldmVsLAorICAgICAgICAgICAgICAgICBjb25zdCBCdXNDb25maWdQYXJzZXIgKnBhcmVudCwKKyAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICplcnJvcikKK3sKKyAgWE1MX1BhcnNlciBleHBhdDsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgIEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyOworICBFeHBhdFBhcnNlQ29udGV4dCBjb250ZXh0OworICBEQnVzU3RyaW5nIGRpcm5hbWU7CisgIAorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBwYXJzZXIgPSBOVUxMOworICBleHBhdCA9IE5VTEw7CisgIGNvbnRleHQuZXJyb3IgPSBlcnJvcjsKKyAgY29udGV4dC5mYWlsZWQgPSBGQUxTRTsKKworICBmaWxlbmFtZSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNvbnRleHQuY29udGVudCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmRpcm5hbWUpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb250ZXh0LmNvbnRlbnQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIG1lbXN1aXRlLm1hbGxvY19mY24gPSBkYnVzX21hbGxvYzsKKyAgbWVtc3VpdGUucmVhbGxvY19mY24gPSBkYnVzX3JlYWxsb2M7CisgIG1lbXN1aXRlLmZyZWVfZmNuID0gZGJ1c19mcmVlOworCisgIGV4cGF0ID0gWE1MX1BhcnNlckNyZWF0ZV9NTSAoIlVURi04IiwgJm1lbXN1aXRlLCBOVUxMKTsKKyAgaWYgKGV4cGF0ID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZ2V0X2Rpcm5hbWUgKGZpbGUsICZkaXJuYW1lKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgCisgIHBhcnNlciA9IGJ1c19jb25maWdfcGFyc2VyX25ldyAoJmRpcm5hbWUsIGlzX3RvcGxldmVsLCBwYXJlbnQpOworICBpZiAocGFyc2VyID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIGNvbnRleHQucGFyc2VyID0gcGFyc2VyOworCisgIFhNTF9TZXRVc2VyRGF0YSAoZXhwYXQsICZjb250ZXh0KTsKKyAgWE1MX1NldEVsZW1lbnRIYW5kbGVyIChleHBhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBleHBhdF9TdGFydEVsZW1lbnRIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGF0X0VuZEVsZW1lbnRIYW5kbGVyKTsKKyAgWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyIChleHBhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhdF9DaGFyYWN0ZXJEYXRhSGFuZGxlcik7CisKKyAgeworICAgIERCdXNTdHJpbmcgZGF0YTsKKyAgICBjb25zdCBjaGFyICpkYXRhX3N0cjsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZkYXRhKSkKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgfQorCisgICAgaWYgKCFfZGJ1c19maWxlX2dldF9jb250ZW50cyAoJmRhdGEsIGZpbGUsIGVycm9yKSkKKyAgICAgIHsKKyAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkYXRhKTsKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICB9CisKKyAgICBkYXRhX3N0ciA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmRhdGEpOworCisgICAgaWYgKCFYTUxfUGFyc2UgKGV4cGF0LCBkYXRhX3N0ciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZkYXRhKSwgVFJVRSkpCisgICAgICB7CisgICAgICAgIGlmIChjb250ZXh0LmVycm9yICE9IE5VTEwgJiYKKyAgICAgICAgICAgICFkYnVzX2Vycm9yX2lzX3NldCAoY29udGV4dC5lcnJvcikpCisgICAgICAgICAgeworICAgICAgICAgICAgZW51bSBYTUxfRXJyb3IgZTsKKworICAgICAgICAgICAgZSA9IFhNTF9HZXRFcnJvckNvZGUgKGV4cGF0KTsKKyAgICAgICAgICAgIGlmIChlID09IFhNTF9FUlJPUl9OT19NRU1PUlkpCisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGluIGZpbGUgJXMsIGxpbmUgJWQsIGNvbHVtbiAlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9HZXRDdXJyZW50TGluZU51bWJlciAoZXhwYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIgKGV4cGF0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FcnJvclN0cmluZyAoZSkpOworICAgICAgICAgIH0KKworICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRhdGEpOworICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgIH0KKworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZGF0YSk7CisKKyAgICBpZiAoY29udGV4dC5mYWlsZWQpCisgICAgICBnb3RvIGZhaWxlZDsKKyAgfQorCisgIGlmICghYnVzX2NvbmZpZ19wYXJzZXJfZmluaXNoZWQgKHBhcnNlciwgZXJyb3IpKQorICAgIGdvdG8gZmFpbGVkOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmZGlybmFtZSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29udGV4dC5jb250ZW50KTsKKyAgWE1MX1BhcnNlckZyZWUgKGV4cGF0KTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgcmV0dXJuIHBhcnNlcjsKKworIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmZGlybmFtZSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29udGV4dC5jb250ZW50KTsKKyAgaWYgKGV4cGF0KQorICAgIFhNTF9QYXJzZXJGcmVlIChleHBhdCk7CisgIGlmIChwYXJzZXIpCisgICAgYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYgKHBhcnNlcik7CisgIHJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy9idXMvY29uZmlnLWxvYWRlci1saWJ4bWwuYyBiL2RidXMvYnVzL2NvbmZpZy1sb2FkZXItbGlieG1sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzczYTE4MQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvYnVzL2NvbmZpZy1sb2FkZXItbGlieG1sLmMKQEAgLTAsMCArMSwzMjQgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogY29uZmlnLWxvYWRlci1saWJ4bWwuYyAgbGlieG1sMiBYTUwgbG9hZGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImNvbmZpZy1wYXJzZXIuaCIKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8bGlieG1sL3htbHJlYWRlci5oPgorI2luY2x1ZGUgPGxpYnhtbC9wYXJzZXIuaD4KKyNpbmNsdWRlIDxsaWJ4bWwvZ2xvYmFscy5oPgorI2luY2x1ZGUgPGxpYnhtbC94bWxtZW1vcnkuaD4KKyNpZmRlZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qIEFib3V0IHRoZSBlcnJvciBoYW5kbGluZzogCisgKiAgLSBzZXR1cCBhICJzdHJ1Y3R1cmVkIiBlcnJvciBoYW5kbGVyIHRoYXQgY2F0Y2hlcyBzdHJ1Y3R1cmFsCisgKiAgICBlcnJvcnMgYW5kIHNvbWUgb29tIGVycm9ycyAKKyAqICAtIGFzc3VtZSB0aGF0IGEgbGlieG1sIGZ1bmN0aW9uIHJldHVybmluZyBhbiBlcnJvciBjb2RlIG1lYW5zCisgKiAgICBvdXQtb2YtbWVtb3J5CisgKi8KKyNkZWZpbmUgX0RCVVNfTUFZQkVfU0VUX09PTShlKSAoZGJ1c19lcnJvcl9pc19zZXQoZSkgPyAodm9pZCkwIDogX0RCVVNfU0VUX09PTShlKSkKKworCitzdGF0aWMgZGJ1c19ib29sX3QKK3htbF90ZXh0X3N0YXJ0X2VsZW1lbnQgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisJCQl4bWxUZXh0UmVhZGVyICAgICAqcmVhZGVyLAorCQkJREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpuYW1lOworICBpbnQgbl9hdHRyaWJ1dGVzOworICBjb25zdCBjaGFyICoqYXR0cmlidXRlX25hbWVzLCAqKmF0dHJpYnV0ZV92YWx1ZXM7CisgIGRidXNfYm9vbF90IHJldDsKKyAgaW50IGksIHN0YXR1cywgaXNfZW1wdHk7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgcmV0ID0gRkFMU0U7CisgIGF0dHJpYnV0ZV9uYW1lcyA9IE5VTEw7CisgIGF0dHJpYnV0ZV92YWx1ZXMgPSBOVUxMOworCisgIG5hbWUgPSB4bWxUZXh0UmVhZGVyQ29uc3ROYW1lIChyZWFkZXIpOworICBuX2F0dHJpYnV0ZXMgPSB4bWxUZXh0UmVhZGVyQXR0cmlidXRlQ291bnQgKHJlYWRlcik7CisgIGlzX2VtcHR5ID0geG1sVGV4dFJlYWRlcklzRW1wdHlFbGVtZW50IChyZWFkZXIpOworCisgIGlmIChuYW1lID09IE5VTEwgfHwgbl9hdHRyaWJ1dGVzIDwgMCB8fCBpc19lbXB0eSA9PSAtMSkKKyAgICB7CisgICAgICBfREJVU19NQVlCRV9TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgYXR0cmlidXRlX25hbWVzID0gZGJ1c19uZXcwIChjb25zdCBjaGFyICosIG5fYXR0cmlidXRlcyArIDEpOworICBhdHRyaWJ1dGVfdmFsdWVzID0gZGJ1c19uZXcwIChjb25zdCBjaGFyICosIG5fYXR0cmlidXRlcyArIDEpOworICBpZiAoYXR0cmlidXRlX25hbWVzID09IE5VTEwgfHwgYXR0cmlidXRlX3ZhbHVlcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgaSA9IDA7CisgIHdoaWxlICgoc3RhdHVzID0geG1sVGV4dFJlYWRlck1vdmVUb05leHRBdHRyaWJ1dGUgKHJlYWRlcikpID09IDEpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChpIDwgbl9hdHRyaWJ1dGVzKTsKKyAgICAgIGF0dHJpYnV0ZV9uYW1lc1tpXSA9IHhtbFRleHRSZWFkZXJDb25zdE5hbWUgKHJlYWRlcik7CisgICAgICBhdHRyaWJ1dGVfdmFsdWVzW2ldID0geG1sVGV4dFJlYWRlckNvbnN0VmFsdWUgKHJlYWRlcik7CisgICAgICBpZiAoYXR0cmlidXRlX25hbWVzW2ldID09IE5VTEwgfHwgYXR0cmlidXRlX3ZhbHVlc1tpXSA9PSBOVUxMKQorCXsgCisgICAgICAgICAgX0RCVVNfTUFZQkVfU0VUX09PTSAoZXJyb3IpOworCSAgZ290byBvdXQ7CisJfQorICAgICAgaSsrOworICAgIH0KKyAgaWYgKHN0YXR1cyA9PSAtMSkKKyAgICB7CisgICAgICBfREJVU19NQVlCRV9TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIF9kYnVzX2Fzc2VydCAoaSA9PSBuX2F0dHJpYnV0ZXMpOworCisgIHJldCA9IGJ1c19jb25maWdfcGFyc2VyX3N0YXJ0X2VsZW1lbnQgKHBhcnNlciwgbmFtZSwKKwkJCQkJIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywKKwkJCQkJIGVycm9yKTsKKyAgaWYgKHJldCAmJiBpc19lbXB0eSA9PSAxKQorICAgIHJldCA9IGJ1c19jb25maWdfcGFyc2VyX2VuZF9lbGVtZW50IChwYXJzZXIsIG5hbWUsIGVycm9yKTsKKworIG91dDoKKyAgZGJ1c19mcmVlIChhdHRyaWJ1dGVfbmFtZXMpOworICBkYnVzX2ZyZWUgKGF0dHJpYnV0ZV92YWx1ZXMpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHhtbF9zaHV0X3VwICh2b2lkICpjdHgsIGNvbnN0IGNoYXIgKm1zZywgLi4uKQoreworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK3htbF90ZXh0X3JlYWRlcl9lcnJvciAodm9pZCAqYXJnLCB4bWxFcnJvclB0ciB4bWxfZXJyb3IpCit7CisgIERCdXNFcnJvciAqZXJyb3IgPSBhcmc7CisKKyNpZiAwCisgIF9kYnVzX3ZlcmJvc2UgKCJYTUxfRVJST1IgbGV2ZWw9JWQsIGRvbWFpbj0lZCwgY29kZT0lZCwgbXNnPSVzXG4iLAorICAgICAgICAgICAgICAgICB4bWxfZXJyb3ItPmxldmVsLCB4bWxfZXJyb3ItPmRvbWFpbiwKKyAgICAgICAgICAgICAgICAgeG1sX2Vycm9yLT5jb2RlLCB4bWxfZXJyb3ItPm1lc3NhZ2UpOworI2VuZGlmCisKKyAgaWYgKCFkYnVzX2Vycm9yX2lzX3NldCAoZXJyb3IpKQorICAgIHsKKyAgICAgIGlmICh4bWxfZXJyb3ItPmNvZGUgPT0gWE1MX0VSUl9OT19NRU1PUlkpCisgICAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGVsc2UgaWYgKHhtbF9lcnJvci0+bGV2ZWwgPT0gWE1MX0VSUl9FUlJPUiB8fAorICAgICAgICAgICAgICAgeG1sX2Vycm9yLT5sZXZlbCA9PSBYTUxfRVJSX0ZBVEFMKQorICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGxvYWRpbmcgY29uZmlnIGZpbGU6ICclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgeG1sX2Vycm9yLT5tZXNzYWdlKTsKKyAgICB9Cit9CisKKworQnVzQ29uZmlnUGFyc2VyKgorYnVzX2NvbmZpZ19sb2FkIChjb25zdCBEQnVzU3RyaW5nICAgICAgKmZpbGUsCisgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgaXNfdG9wbGV2ZWwsCisgICAgICAgICAgICAgICAgIGNvbnN0IEJ1c0NvbmZpZ1BhcnNlciAqcGFyZW50LAorICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgKmVycm9yKQorCit7CisgIHhtbFRleHRSZWFkZXIgKnJlYWRlcjsKKyAgQnVzQ29uZmlnUGFyc2VyICpwYXJzZXI7CisgIERCdXNTdHJpbmcgZGlybmFtZSwgZGF0YTsKKyAgREJ1c0Vycm9yIHRtcF9lcnJvcjsKKyAgaW50IHJldDsKKyAgCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAgcGFyc2VyID0gTlVMTDsKKyAgcmVhZGVyID0gTlVMTDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZGlybmFtZSkpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZkYXRhKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRpcm5hbWUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmIChpc190b3BsZXZlbCkKKyAgICB7CisgICAgICAvKiB4bWxNZW1TZXR1cCBvbmx5IGZhaWxzIGlmIG9uZSBvZiB0aGUgZnVuY3Rpb25zIGlzIE5VTEwgKi8KKyAgICAgIHhtbE1lbVNldHVwIChkYnVzX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgZGJ1c19tYWxsb2MsCisgICAgICAgICAgICAgICAgICAgZGJ1c19yZWFsbG9jLAorICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmR1cCk7CisgICAgICB4bWxJbml0UGFyc2VyICgpOworICAgICAgeG1sU2V0R2VuZXJpY0Vycm9yRnVuYyAoTlVMTCwgeG1sX3NodXRfdXApOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19nZXRfZGlybmFtZSAoZmlsZSwgJmRpcm5hbWUpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgCisgIHBhcnNlciA9IGJ1c19jb25maWdfcGFyc2VyX25ldyAoJmRpcm5hbWUsIGlzX3RvcGxldmVsLCBwYXJlbnQpOworICBpZiAocGFyc2VyID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19maWxlX2dldF9jb250ZW50cyAoJmRhdGEsIGZpbGUsIGVycm9yKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICByZWFkZXIgPSB4bWxSZWFkZXJGb3JNZW1vcnkgKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmRhdGEpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmRhdGEpLAorCQkJICAgICAgIE5VTEwsIE5VTEwsIDApOworICBpZiAocmVhZGVyID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIHhtbFRleHRSZWFkZXJTZXRQYXJzZXJQcm9wIChyZWFkZXIsIFhNTF9QQVJTRVJfU1VCU1RfRU5USVRJRVMsIDEpOworCisgIGRidXNfZXJyb3JfaW5pdCAoJnRtcF9lcnJvcik7CisgIHhtbFRleHRSZWFkZXJTZXRTdHJ1Y3R1cmVkRXJyb3JIYW5kbGVyIChyZWFkZXIsIHhtbF90ZXh0X3JlYWRlcl9lcnJvciwgJnRtcF9lcnJvcik7CisKKyAgd2hpbGUgKChyZXQgPSB4bWxUZXh0UmVhZGVyUmVhZCAocmVhZGVyKSkgPT0gMSkKKyAgICB7CisgICAgICBpbnQgdHlwZTsKKyAgICAgIAorICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmdG1wX2Vycm9yKSkKKyAgICAgICAgZ290byByZWFkZXJfb3V0OworCisgICAgICB0eXBlID0geG1sVGV4dFJlYWRlck5vZGVUeXBlIChyZWFkZXIpOworICAgICAgaWYgKHR5cGUgPT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19NQVlCRV9TRVRfT09NICgmdG1wX2Vycm9yKTsKKyAgICAgICAgICBnb3RvIHJlYWRlcl9vdXQ7CisgICAgICAgIH0KKworICAgICAgc3dpdGNoICgoeG1sUmVhZGVyVHlwZXMpIHR5cGUpIHsKKyAgICAgIGNhc2UgWE1MX1JFQURFUl9UWVBFX0VMRU1FTlQ6CisJeG1sX3RleHRfc3RhcnRfZWxlbWVudCAocGFyc2VyLCByZWFkZXIsICZ0bXBfZXJyb3IpOworCWJyZWFrOworCisgICAgICBjYXNlIFhNTF9SRUFERVJfVFlQRV9URVhUOgorICAgICAgY2FzZSBYTUxfUkVBREVSX1RZUEVfQ0RBVEE6CisJeworCSAgREJ1c1N0cmluZyBjb250ZW50OworCSAgY29uc3QgY2hhciAqdmFsdWU7CisJICB2YWx1ZSA9IHhtbFRleHRSZWFkZXJDb25zdFZhbHVlIChyZWFkZXIpOworCSAgaWYgKHZhbHVlICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmNvbnRlbnQsIHZhbHVlKTsKKwkgICAgICBidXNfY29uZmlnX3BhcnNlcl9jb250ZW50IChwYXJzZXIsICZjb250ZW50LCAmdG1wX2Vycm9yKTsKKwkgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9EQlVTX01BWUJFX1NFVF9PT00gKCZ0bXBfZXJyb3IpOworCSAgYnJlYWs7CisJfQorCisgICAgICBjYXNlIFhNTF9SRUFERVJfVFlQRV9ET0NVTUVOVF9UWVBFOgorCXsKKwkgIGNvbnN0IGNoYXIgKm5hbWU7CisJICBuYW1lID0geG1sVGV4dFJlYWRlckNvbnN0TmFtZSAocmVhZGVyKTsKKwkgIGlmIChuYW1lICE9IE5VTEwpCisJICAgIGJ1c19jb25maWdfcGFyc2VyX2NoZWNrX2RvY3R5cGUgKHBhcnNlciwgbmFtZSwgJnRtcF9lcnJvcik7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgX0RCVVNfTUFZQkVfU0VUX09PTSAoJnRtcF9lcnJvcik7CisJICBicmVhazsKKwl9CisKKyAgICAgIGNhc2UgWE1MX1JFQURFUl9UWVBFX0VORF9FTEVNRU5UOgorCXsKKwkgIGNvbnN0IGNoYXIgKm5hbWU7CisJICBuYW1lID0geG1sVGV4dFJlYWRlckNvbnN0TmFtZSAocmVhZGVyKTsKKwkgIGlmIChuYW1lICE9IE5VTEwpCisJICAgIGJ1c19jb25maWdfcGFyc2VyX2VuZF9lbGVtZW50IChwYXJzZXIsIG5hbWUsICZ0bXBfZXJyb3IpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9EQlVTX01BWUJFX1NFVF9PT00gKCZ0bXBfZXJyb3IpOworCSAgYnJlYWs7CisJfQorCisgICAgICBjYXNlIFhNTF9SRUFERVJfVFlQRV9ET0NVTUVOVDoKKyAgICAgIGNhc2UgWE1MX1JFQURFUl9UWVBFX0RPQ1VNRU5UX0ZSQUdNRU5UOgorICAgICAgY2FzZSBYTUxfUkVBREVSX1RZUEVfUFJPQ0VTU0lOR19JTlNUUlVDVElPTjoKKyAgICAgIGNhc2UgWE1MX1JFQURFUl9UWVBFX0NPTU1FTlQ6CisgICAgICBjYXNlIFhNTF9SRUFERVJfVFlQRV9FTlRJVFk6CisgICAgICBjYXNlIFhNTF9SRUFERVJfVFlQRV9OT1RBVElPTjoKKyAgICAgIGNhc2UgWE1MX1JFQURFUl9UWVBFX1dISVRFU1BBQ0U6CisgICAgICBjYXNlIFhNTF9SRUFERVJfVFlQRV9TSUdOSUZJQ0FOVF9XSElURVNQQUNFOgorICAgICAgY2FzZSBYTUxfUkVBREVSX1RZUEVfRU5EX0VOVElUWToKKyAgICAgIGNhc2UgWE1MX1JFQURFUl9UWVBFX1hNTF9ERUNMQVJBVElPTjoKKwkvKiBub3RoaW5nIHRvIGRvLCBqdXN0IHJlYWQgb24gKi8KKwlicmVhazsKKworICAgICAgY2FzZSBYTUxfUkVBREVSX1RZUEVfTk9ORToKKyAgICAgIGNhc2UgWE1MX1JFQURFUl9UWVBFX0FUVFJJQlVURToKKyAgICAgIGNhc2UgWE1MX1JFQURFUl9UWVBFX0VOVElUWV9SRUZFUkVOQ0U6CisJX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidW5leHBlY3RlZCBub2RlcyBpbiBYTUwiKTsKKyAgICAgIH0KKworICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmdG1wX2Vycm9yKSkKKyAgICAgICAgZ290byByZWFkZXJfb3V0OworICAgIH0KKworICBpZiAocmV0ID09IC0xKQorICAgIF9EQlVTX01BWUJFX1NFVF9PT00gKCZ0bXBfZXJyb3IpOworCisgcmVhZGVyX291dDoKKyAgeG1sRnJlZVRleHRSZWFkZXIgKHJlYWRlcik7CisgIHJlYWRlciA9IE5VTEw7CisgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJnRtcF9lcnJvcikpCisgICAgeworICAgICAgZGJ1c19tb3ZlX2Vycm9yICgmdG1wX2Vycm9yLCBlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIAorICBpZiAoIWJ1c19jb25maWdfcGFyc2VyX2ZpbmlzaGVkIChwYXJzZXIsIGVycm9yKSkKKyAgICBnb3RvIGZhaWxlZDsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkaXJuYW1lKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkYXRhKTsKKyAgaWYgKGlzX3RvcGxldmVsKQorICAgIHhtbENsZWFudXBQYXJzZXIoKTsKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIHJldHVybiBwYXJzZXI7CisgIAorIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRpcm5hbWUpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRhdGEpOworICBpZiAoaXNfdG9wbGV2ZWwpCisgICAgeG1sQ2xlYW51cFBhcnNlcigpOworICBpZiAocGFyc2VyKQorICAgIGJ1c19jb25maWdfcGFyc2VyX3VucmVmIChwYXJzZXIpOworICBfZGJ1c19hc3NlcnQgKHJlYWRlciA9PSBOVUxMKTsgLyogbXVzdCBnbyB0byByZWFkZXJfb3V0IGZpcnN0ICovCisgIHJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy9idXMvY29uZmlnLXBhcnNlci1jb21tb24uYyBiL2RidXMvYnVzL2NvbmZpZy1wYXJzZXItY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUyMmZmNAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvYnVzL2NvbmZpZy1wYXJzZXItY29tbW9uLmMKQEAgLTAsMCArMSwxOTAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogY29uZmlnLXBhcnNlci1jb21tb24uYyAgQ29tbW9uIGRlZmluZXMgYW5kIHJvdXRpbmVzIGZvciBjb25maWcgZmlsZSBwYXJzaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisgCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiY29uZmlnLXBhcnNlci1jb21tb24uaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCitFbGVtZW50VHlwZQorYnVzX2NvbmZpZ19wYXJzZXJfZWxlbWVudF9uYW1lX3RvX3R5cGUgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIGlmIChzdHJjbXAgKG5hbWUsICJub25lIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9OT05FOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiYnVzY29uZmlnIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9CVVNDT05GSUc7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJ1c2VyIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9VU0VSOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiYXV0aCIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIEVMRU1FTlRfQVVUSDsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInR5cGUiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX0NPTkZJR1RZUEU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJmb3JrIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9GT1JLOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAicGlkZmlsZSIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIEVMRU1FTlRfUElERklMRTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImxpc3RlbiIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIEVMRU1FTlRfTElTVEVOOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiYXV0aCIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIEVMRU1FTlRfQVVUSDsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImFsbG93IikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9BTExPVzsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImRlbnkiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX0RFTlk7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJzZXJ2aWNlaGVscGVyIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9TRVJWSUNFSEVMUEVSOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiaW5jbHVkZWRpciIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIEVMRU1FTlRfSU5DTFVERURJUjsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInN0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX1NUQU5EQVJEX1NFU1NJT05fU0VSVklDRURJUlM7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJzdGFuZGFyZF9zeXN0ZW1fc2VydmljZWRpcnMiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX1NUQU5EQVJEX1NZU1RFTV9TRVJWSUNFRElSUzsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInNlcnZpY2VkaXIiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX1NFUlZJQ0VESVI7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJpbmNsdWRlIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9JTkNMVURFOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAicG9saWN5IikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9QT0xJQ1k7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJsaW1pdCIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIEVMRU1FTlRfTElNSVQ7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJzZWxpbnV4IikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9TRUxJTlVYOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiYXNzb2NpYXRlIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9BU1NPQ0lBVEU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJzeXNsb2ciKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX1NZU0xPRzsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImtlZXBfdW1hc2siKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX0tFRVBfVU1BU0s7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJhbGxvd19hbm9ueW1vdXMiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX0FMTE9XX0FOT05ZTU9VUzsKKyAgICB9CisgIHJldHVybiBFTEVNRU5UX05PTkU7Cit9CisKK2NvbnN0IGNoYXIqCitidXNfY29uZmlnX3BhcnNlcl9lbGVtZW50X3R5cGVfdG9fbmFtZSAoRWxlbWVudFR5cGUgdHlwZSkKK3sKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIEVMRU1FTlRfTk9ORToKKyAgICAgIHJldHVybiBOVUxMOworICAgIGNhc2UgRUxFTUVOVF9CVVNDT05GSUc6CisgICAgICByZXR1cm4gImJ1c2NvbmZpZyI7CisgICAgY2FzZSBFTEVNRU5UX0lOQ0xVREU6CisgICAgICByZXR1cm4gImluY2x1ZGUiOworICAgIGNhc2UgRUxFTUVOVF9VU0VSOgorICAgICAgcmV0dXJuICJ1c2VyIjsKKyAgICBjYXNlIEVMRU1FTlRfTElTVEVOOgorICAgICAgcmV0dXJuICJsaXN0ZW4iOworICAgIGNhc2UgRUxFTUVOVF9BVVRIOgorICAgICAgcmV0dXJuICJhdXRoIjsKKyAgICBjYXNlIEVMRU1FTlRfUE9MSUNZOgorICAgICAgcmV0dXJuICJwb2xpY3kiOworICAgIGNhc2UgRUxFTUVOVF9MSU1JVDoKKyAgICAgIHJldHVybiAibGltaXQiOworICAgIGNhc2UgRUxFTUVOVF9BTExPVzoKKyAgICAgIHJldHVybiAiYWxsb3ciOworICAgIGNhc2UgRUxFTUVOVF9ERU5ZOgorICAgICAgcmV0dXJuICJkZW55IjsKKyAgICBjYXNlIEVMRU1FTlRfRk9SSzoKKyAgICAgIHJldHVybiAiZm9yayI7CisgICAgY2FzZSBFTEVNRU5UX1BJREZJTEU6CisgICAgICByZXR1cm4gInBpZGZpbGUiOworICAgIGNhc2UgRUxFTUVOVF9TVEFOREFSRF9TRVNTSU9OX1NFUlZJQ0VESVJTOgorICAgICAgcmV0dXJuICJzdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzIjsKKyAgICBjYXNlIEVMRU1FTlRfU1RBTkRBUkRfU1lTVEVNX1NFUlZJQ0VESVJTOgorICAgICAgcmV0dXJuICJzdGFuZGFyZF9zeXN0ZW1fc2VydmljZWRpcnMiOworICAgIGNhc2UgRUxFTUVOVF9TRVJWSUNFRElSOgorICAgICAgcmV0dXJuICJzZXJ2aWNlZGlyIjsKKyAgICBjYXNlIEVMRU1FTlRfU0VSVklDRUhFTFBFUjoKKyAgICAgIHJldHVybiAic2VydmljZWhlbHBlciI7CisgICAgY2FzZSBFTEVNRU5UX0lOQ0xVREVESVI6CisgICAgICByZXR1cm4gImluY2x1ZGVkaXIiOworICAgIGNhc2UgRUxFTUVOVF9DT05GSUdUWVBFOgorICAgICAgcmV0dXJuICJ0eXBlIjsKKyAgICBjYXNlIEVMRU1FTlRfU0VMSU5VWDoKKyAgICAgIHJldHVybiAic2VsaW51eCI7CisgICAgY2FzZSBFTEVNRU5UX0FTU09DSUFURToKKyAgICAgIHJldHVybiAiYXNzb2NpYXRlIjsKKyAgICBjYXNlIEVMRU1FTlRfU1lTTE9HOgorICAgICAgcmV0dXJuICJzeXNsb2ciOworICAgIGNhc2UgRUxFTUVOVF9LRUVQX1VNQVNLOgorICAgICAgcmV0dXJuICJrZWVwX3VtYXNrIjsKKyAgICBjYXNlIEVMRU1FTlRfQUxMT1dfQU5PTllNT1VTOgorICAgICAgcmV0dXJuICJhbGxvd19hbm9ueW1vdXMiOworICAgIH0KKworICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJiYWQgZWxlbWVudCB0eXBlIik7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKZGlmZiAtLWdpdCBhL2RidXMvYnVzL2NvbmZpZy1wYXJzZXItY29tbW9uLmggYi9kYnVzL2J1cy9jb25maWctcGFyc2VyLWNvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NmJmNGMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2J1cy9jb25maWctcGFyc2VyLWNvbW1vbi5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogY29uZmlnLXBhcnNlci1jb21tb24uaCAgQ29tbW9uIGRlZmluZXMgYW5kIHJvdXRpbmVzIGZvciBjb25maWcgZmlsZSBwYXJzaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBCVVNfQ09ORklHX1BBUlNFUl9DT01NT05fSAorI2RlZmluZSBCVVNfQ09ORklHX1BBUlNFUl9DT01NT05fSAorCit0eXBlZGVmIGVudW0KK3sKKyAgRUxFTUVOVF9OT05FLAorICBFTEVNRU5UX0JVU0NPTkZJRywKKyAgRUxFTUVOVF9JTkNMVURFLAorICBFTEVNRU5UX1VTRVIsCisgIEVMRU1FTlRfTElTVEVOLAorICBFTEVNRU5UX0FVVEgsCisgIEVMRU1FTlRfUE9MSUNZLAorICBFTEVNRU5UX0xJTUlULAorICBFTEVNRU5UX0FMTE9XLAorICBFTEVNRU5UX0RFTlksCisgIEVMRU1FTlRfRk9SSywKKyAgRUxFTUVOVF9QSURGSUxFLAorICBFTEVNRU5UX1NFUlZJQ0VESVIsCisgIEVMRU1FTlRfU0VSVklDRUhFTFBFUiwKKyAgRUxFTUVOVF9JTkNMVURFRElSLAorICAvKiB0aGlzIGlzIHJlYWxseSA8dHlwZT4sIGJ1dCB3aW5pb2N0bC5oIGRlZmluZXMgRUxFTUVOVF9UWVBFICovCisgIEVMRU1FTlRfQ09ORklHVFlQRSwKKyAgRUxFTUVOVF9TRUxJTlVYLAorICBFTEVNRU5UX0FTU09DSUFURSwKKyAgRUxFTUVOVF9TVEFOREFSRF9TRVNTSU9OX1NFUlZJQ0VESVJTLAorICBFTEVNRU5UX1NUQU5EQVJEX1NZU1RFTV9TRVJWSUNFRElSUywKKyAgRUxFTUVOVF9LRUVQX1VNQVNLLAorICBFTEVNRU5UX1NZU0xPRywKKyAgRUxFTUVOVF9BTExPV19BTk9OWU1PVVMKK30gRWxlbWVudFR5cGU7CisKK0VsZW1lbnRUeXBlIGJ1c19jb25maWdfcGFyc2VyX2VsZW1lbnRfbmFtZV90b190eXBlIChjb25zdCBjaGFyICplbGVtZW50X25hbWUpOworY29uc3QgY2hhciogYnVzX2NvbmZpZ19wYXJzZXJfZWxlbWVudF90eXBlX3RvX25hbWUgKEVsZW1lbnRUeXBlIHR5cGUpOworCisjZW5kaWYgLyogQlVTX0NPTkZJR19QQVJTRVJfQ09NTU9OX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZGJ1cy9idXMvY29uZmlnLXBhcnNlci10cml2aWFsLmMgYi9kYnVzL2J1cy9jb25maWctcGFyc2VyLXRyaXZpYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWY1MGY4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9idXMvY29uZmlnLXBhcnNlci10cml2aWFsLmMKQEAgLTAsMCArMSw3MTYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogY29uZmlnLXBhcnNlci10cml2aWFsLmMgIFhNTC1saWJyYXJ5LWFnbm9zdGljIGNvbmZpZ3VyYXRpb24gZmlsZSBwYXJzZXIKKyAqICAgICAgICAgICAgICAgICAgRG9lcyBub3QgZG8gaW5jbHVkZXMgb3IgYW55dGhpbmcgcmVtb3RlbHkgY29tcGxpY2F0ZWQuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA3IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisgCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiY29uZmlnLXBhcnNlci1jb21tb24uaCIKKyNpbmNsdWRlICJjb25maWctcGFyc2VyLXRyaXZpYWwuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKioKKyAqIFRSSVZJQUwgcGFyc2VyIGZvciBidXMgY29uZmlndXJhdGlvbiBmaWxlLgorICovCitzdHJ1Y3QgQnVzQ29uZmlnUGFyc2VyCit7CisgIEVsZW1lbnRUeXBlIHR5cGU7CisgIERCdXNTdHJpbmcgdXNlcjsgICAgICAgICAgICAgICAgICAvKio8IFVzZXIgdGhlIGRidXMtZGFlbW9uIHJ1bnMgYXMgKi8KKyAgREJ1c1N0cmluZyBidXNfdHlwZTsgICAgICAgICAgICAgIC8qKjwgTWVzc2FnZSBidXMgdHlwZSAqLworICBEQnVzU3RyaW5nIHNlcnZpY2VfaGVscGVyOyAgICAgICAgLyoqPCBMb2NhdGlvbiBvZiB0aGUgc2V0dWlkIGhlbHBlciAqLworICBEQnVzTGlzdCAqc2VydmljZV9kaXJzOyAgICAgICAgICAgLyoqPCBEaXJlY3RvcmllcyB0byBsb29rIGZvciBzZXJ2aWNlcyBpbiAqLworfTsKKworc3RhdGljIGRidXNfYm9vbF90CitzZXJ2aWNlX2RpcnNfZmluZF9kaXIgKERCdXNMaXN0ICoqc2VydmljZV9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkaXIpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIF9kYnVzX2Fzc2VydCAoZGlyICE9IE5VTEwpOworCisgIGZvciAobGluayA9ICpzZXJ2aWNlX2RpcnM7IGxpbms7IGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsoc2VydmljZV9kaXJzLCBsaW5rKSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpsaW5rX2RpcjsKKworICAgICAgbGlua19kaXIgPSAoY29uc3QgY2hhciAqKWxpbmstPmRhdGE7CisgICAgICBpZiAoc3RyY21wIChkaXIsIGxpbmtfZGlyKSA9PSAwKQorICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorc2VydmljZV9kaXJzX2FwcGVuZF9saW5rX3VuaXF1ZV9vcl9mcmVlIChEQnVzTGlzdCAqKnNlcnZpY2VfZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgKmRpcl9saW5rKQoreworICBpZiAoIXNlcnZpY2VfZGlyc19maW5kX2RpciAoc2VydmljZV9kaXJzLCBkaXJfbGluay0+ZGF0YSkpCisgICAgeworICAgICAgX2RidXNfbGlzdF9hcHBlbmRfbGluayAoc2VydmljZV9kaXJzLCBkaXJfbGluayk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19mcmVlIChkaXJfbGluay0+ZGF0YSk7CisgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAoZGlyX2xpbmspOworICAgIH0KK30KKworQnVzQ29uZmlnUGFyc2VyKgorYnVzX2NvbmZpZ19wYXJzZXJfbmV3IChjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICAgICpiYXNlZGlyLAorICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgICAgICBpc190b3BsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnVzQ29uZmlnUGFyc2VyICAgICAgICAqcGFyZW50KQoreworICBCdXNDb25maWdQYXJzZXIgKnBhcnNlcjsKKworICBwYXJzZXIgPSBkYnVzX25ldzAgKEJ1c0NvbmZpZ1BhcnNlciwgMSk7CisgIGlmIChwYXJzZXIgPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZDsKKworICBwYXJzZXItPnR5cGUgPSBFTEVNRU5UX05PTkU7CisKKyAgLyogaW5pdCB0aGUgbGlzdHMgKi8KKyAgcGFyc2VyLT5zZXJ2aWNlX2RpcnMgPSBOVUxMOworCisgIC8qIGluaXQgdGhlIHN0cmluZ3MgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnBhcnNlci0+dXNlcikpCisgICAgZ290byBmYWlsZWRfcGFyc2VyOworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcGFyc2VyLT5idXNfdHlwZSkpCisgICAgZ290byBmYWlsZWRfdHlwZTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnBhcnNlci0+c2VydmljZV9oZWxwZXIpKQorICAgIGdvdG8gZmFpbGVkX2hlbHBlcjsKKworICAvKiB3b290ISAqLworICByZXR1cm4gcGFyc2VyOworCisvKiBhcmdoLiB3ZSBoYXZlIGRvIGRvIHRoaXMgY2FyZWZ1bGx5IGJlY2F1c2Ugb2YgT09NICovCitmYWlsZWRfaGVscGVyOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhcnNlci0+YnVzX3R5cGUpOworZmFpbGVkX3R5cGU6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcGFyc2VyLT51c2VyKTsKK2ZhaWxlZF9wYXJzZXI6CisgIGRidXNfZnJlZSAocGFyc2VyKTsKK2ZhaWxlZDoKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQKK2J1c19jb25maWdfcGFyc2VyX3VucmVmIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcikKK3sKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXJzZXItPnVzZXIpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhcnNlci0+c2VydmljZV9oZWxwZXIpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhcnNlci0+YnVzX3R5cGUpOworCisgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJnBhcnNlci0+c2VydmljZV9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgIChEQnVzRm9yZWFjaEZ1bmN0aW9uKSBkYnVzX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgX2RidXNfbGlzdF9jbGVhciAoJnBhcnNlci0+c2VydmljZV9kaXJzKTsKKworICBkYnVzX2ZyZWUgKHBhcnNlcik7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29uZmlnX3BhcnNlcl9jaGVja19kb2N0eXBlIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmRvY3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmIChzdHJjbXAgKGRvY3R5cGUsICJidXNjb25maWciKSAhPSAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiQ29uZmlndXJhdGlvbiBmaWxlIGhhcyB0aGUgd3JvbmcgZG9jdW1lbnQgdHlwZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgZG9jdHlwZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29uZmlnX3BhcnNlcl9zdGFydF9lbGVtZW50IChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKiphdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICoqYXR0cmlidXRlX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgLyogd2UgZG9uJ3QgZG8gcHJvY2Vzc2luZyBvZiBhdHRyaWJ1dGUgbmFtZXMsIHdlIGRvbid0IG5lZWQgdG8gKi8KKyAgcGFyc2VyLT50eXBlID0gYnVzX2NvbmZpZ19wYXJzZXJfZWxlbWVudF9uYW1lX3RvX3R5cGUgKGVsZW1lbnRfbmFtZSk7CisKKyAgc3dpdGNoIChwYXJzZXItPnR5cGUpCisgICAgeworICAgIGNhc2UgRUxFTUVOVF9TRVJWSUNFSEVMUEVSOgorICAgIGNhc2UgRUxFTUVOVF9VU0VSOgorICAgIGNhc2UgRUxFTUVOVF9DT05GSUdUWVBFOgorICAgICAgLyogY29udGVudCBhYm91dCB0byBiZSBoYW5kbGVkICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgRUxFTUVOVF9TVEFOREFSRF9TWVNURU1fU0VSVklDRURJUlM6CisgICAgICB7CisgICAgICAgIERCdXNMaXN0ICpsaW5rOworICAgICAgICBEQnVzTGlzdCAqZGlyczsKKyAgICAgICAgZGlycyA9IE5VTEw7CisKKyAgICAgICAgaWYgKCFfZGJ1c19nZXRfc3RhbmRhcmRfc3lzdGVtX3NlcnZpY2VkaXJzICgmZGlycykpCisgICAgICAgICAgeworICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB3aGlsZSAoKGxpbmsgPSBfZGJ1c19saXN0X3BvcF9maXJzdF9saW5rICgmZGlycykpKQorICAgICAgICAgICAgc2VydmljZV9kaXJzX2FwcGVuZF9saW5rX3VuaXF1ZV9vcl9mcmVlICgmcGFyc2VyLT5zZXJ2aWNlX2RpcnMsIGxpbmspOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICB7CisgICAgICAgIC8qIHdlIHJlYWxseSBkb24ndCBjYXJlIGFib3V0IHRoZSBvdGhlcnMuLi4gKi8KKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIiBTVEFSVCBXZSBkb24ndCBjYXJlIGFib3V0ICclcycgdHlwZSAnJWknXG4iLCBlbGVtZW50X25hbWUsIHBhcnNlci0+dHlwZSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29uZmlnX3BhcnNlcl9lbmRfZWxlbWVudCAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgKmVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICAgKmVycm9yKQoreworICAvKiB3ZSBkb24ndCBjYXJlICovCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NvbmZpZ19wYXJzZXJfY29udGVudCAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICpjb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIGNvbnRlbnRfc2FuZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb250ZW50X3NhbmUpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKGNvbnRlbnQsIDAsICZjb250ZW50X3NhbmUsIDApKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dF9jb250ZW50OworICAgIH0KKworICAvKiByaXAgb3V0IHdoaXRlIHNwYWNlICovCisgIF9kYnVzX3N0cmluZ19jaG9wX3doaXRlICgmY29udGVudF9zYW5lKTsKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmY29udGVudF9zYW5lKSA9PSAwKQorICAgIHsKKyAgICAgIC8qIG9wdGltaXNlLCB0aGVyZSBpcyBubyBjb250ZW50ICovCisgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgZ290byBvdXRfY29udGVudDsKKyAgICB9CisKKyAgc3dpdGNoIChwYXJzZXItPnR5cGUpCisgICAgeworICAgIGNhc2UgRUxFTUVOVF9TRVJWSUNFRElSOgorICAgICAgeworICAgICAgCWNoYXIgKmNwYXRoOworCisgICAgICAgIC8qIGNvcHkgdGhlIHNhbmUgZGF0YSBpbnRvIGEgY2hhciBhcnJheSAqLworICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2RhdGEoJmNvbnRlbnRfc2FuZSwgJmNwYXRoKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgZ290byBvdXRfY29udGVudDsKKyAgICAgICAgICB9CisKKyAgICAgICAgLyogYXBwZW5kIHRoZSBkeW5hbWljIGNoYXIgc3RyaW5nIHRvIHNlcnZpY2UgZGlycyAqLworICAgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmcGFyc2VyLT5zZXJ2aWNlX2RpcnMsIGNwYXRoKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX2ZyZWUgKGNwYXRoKTsKKyAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICBnb3RvIG91dF9jb250ZW50OworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTEVNRU5UX1NFUlZJQ0VIRUxQRVI6CisgICAgICB7CisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZjb250ZW50X3NhbmUsIDAsICZwYXJzZXItPnNlcnZpY2VfaGVscGVyLCAwKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgZ290byBvdXRfY29udGVudDsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRUxFTUVOVF9VU0VSOgorICAgICAgeworICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmY29udGVudF9zYW5lLCAwLCAmcGFyc2VyLT51c2VyLCAwKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgZ290byBvdXRfY29udGVudDsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRUxFTUVOVF9DT05GSUdUWVBFOgorICAgICAgeworICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmY29udGVudF9zYW5lLCAwLCAmcGFyc2VyLT5idXNfdHlwZSwgMCkpCisgICAgICAgICAgeworICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgIGdvdG8gb3V0X2NvbnRlbnQ7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHsKKyAgICAgICAgLyogd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgb3RoZXJzLi4uIHJlYWxseSAqLworICAgICAgICBfZGJ1c192ZXJib3NlICgiIENPTlRFTlRTIFdlIGRvbid0IGNhcmUgYWJvdXQgJyVzJyB0eXBlICclaSdcbiIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmNvbnRlbnRfc2FuZSksIHBhcnNlci0+dHlwZSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAvKiB3b290ISAqLworICByZXR2YWwgPSBUUlVFOworCitvdXRfY29udGVudDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb250ZW50X3NhbmUpOworb3V0OgorICByZXR1cm4gcmV0dmFsOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NvbmZpZ19wYXJzZXJfZmluaXNoZWQgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgX2RidXNfdmVyYm9zZSAoImZpbmlzaGVkIHNjYW5uaW5nIVxuIik7CisgIHJldHVybiBUUlVFOworfQorCitjb25zdCBjaGFyKgorYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3VzZXIgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKQoreworICByZXR1cm4gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmcGFyc2VyLT51c2VyKTsKK30KKworY29uc3QgY2hhcioKK2J1c19jb25maWdfcGFyc2VyX2dldF90eXBlIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcikKK3sKKyAgcmV0dXJuIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnBhcnNlci0+YnVzX3R5cGUpOworfQorCitEQnVzTGlzdCoqCitidXNfY29uZmlnX3BhcnNlcl9nZXRfc2VydmljZV9kaXJzIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcikKK3sKKyAgcmV0dXJuICZwYXJzZXItPnNlcnZpY2VfZGlyczsKK30KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInRlc3QuaCIKKwordHlwZWRlZiBlbnVtCit7CisgIFZBTElELAorICBJTlZBTElELAorICBVTktOT1dOCit9IFZhbGlkaXR5OworCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3JldHVybl92YWx1ZXMgKGNvbnN0IERCdXNTdHJpbmcgKmZ1bGxfcGF0aCkKK3sKKyAgQnVzQ29uZmlnUGFyc2VyICpwYXJzZXI7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBjb25zdCBjaGFyICp1c2VyOworICBjb25zdCBjaGFyICp0eXBlOworICBEQnVzTGlzdCAqKmRpcnM7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICByZXR2YWwgPSBGQUxTRTsKKworICBwcmludGYgKCJUZXN0aW5nIHZhbHVlcyBmcm9tOiAlc1xuIiwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmdWxsX3BhdGgpKTsKKworICBwYXJzZXIgPSBidXNfY29uZmlnX2xvYWQgKGZ1bGxfcGF0aCwgVFJVRSwgTlVMTCwgJmVycm9yKTsKKyAgaWYgKHBhcnNlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZlcnJvcik7CisgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gbG9hZCB2YWxpZCBmaWxlIGR1ZSB0byBPT01cbiIpOworICAgICAgZ290byBmaW5pc2g7CisgICAgfQorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKCZlcnJvcik7CisKKyAgLyogY2hlY2sgdXNlciByZXR1cm4gdmFsdWUgaXMgb2theSAqLworICB1c2VyID0gYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3VzZXIgKHBhcnNlcik7CisgIGlmICh1c2VyID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIlVzZXIgd2FzIE5VTEwhXG4iKTsKKyAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKyNpZiAwCisgIC8qIHRoZSB1c2VybmFtZSBjYW4gYmUgY29uZmlndXJlZCBpbiBjb25maWd1cmUuaW4gc28gdGhpcyB0ZXN0IGRvZXNuJ3Qgd29yayAqLworICBpZiAoc3RyY21wICh1c2VyLCAiZGJ1cyIpICE9IDApCisgICAgeworICAgICAgX2RidXNfd2FybiAoIlVzZXIgd2FzIGludmFsaWQ7ICclcychXG4iLCB1c2VyKTsKKyAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKyAgcHJpbnRmICgiICAgIDx1c2VyPmRidXM8L3VzZXI+IE9LQVkhXG4iKTsgIAorI2VuZGlmCisgIAorICAvKiBjaGVjayB0eXBlIHJldHVybiB2YWx1ZSBpcyBva2F5ICovCisgIHR5cGUgPSBidXNfY29uZmlnX3BhcnNlcl9nZXRfdHlwZSAocGFyc2VyKTsKKyAgaWYgKHR5cGUgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiVHlwZSB3YXMgTlVMTCFcbiIpOworICAgICAgZ290byBmaW5pc2g7CisgICAgfQorICBpZiAoc3RyY21wICh0eXBlLCAic3lzdGVtIikgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiVHlwZSB3YXMgaW52YWxpZDsgJyVzJyFcbiIsIHVzZXIpOworICAgICAgZ290byBmaW5pc2g7CisgICAgfQorICBwcmludGYgKCIgICAgPHR5cGU+c3lzdGVtPC90eXBlPiBPS0FZIVxuIik7CisKKyAgLyogY2hlY2sgZGlycyByZXR1cm4gdmFsdWUgaXMgb2theSAqLworICBkaXJzID0gYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3NlcnZpY2VfZGlycyAocGFyc2VyKTsKKyAgaWYgKGRpcnMgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiU2VydmljZSBkaXJzIGFyZSBOVUxMIVxuIik7CisgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9CisgIHByaW50ZiAoIiAgICA8c3RhbmRhcmRfc3lzdGVtX3NlcnZpY2VfZGlycy8+IE9LQVkhXG4iKTsKKyAgLyogTk9URTogV2UgdGVzdGVkIHRoZSBzcGVjaWZpYyByZXR1cm4gdmFsdWVzIGluIHRoZSBjb25maWctcGFyc2VyIHRlc3RzICovCisKKyAgLyogd29vaG9vISAqLworICByZXR2YWwgPSBUUlVFOworZmluaXNoOgorICBpZiAocGFyc2VyICE9IE5VTEwpCisgICAgYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYgKHBhcnNlcik7CisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citkb19sb2FkIChjb25zdCBEQnVzU3RyaW5nICpmdWxsX3BhdGgsCisgICAgICAgICBWYWxpZGl0eSAgICAgICAgICB2YWxpZGl0eSwKKyAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIG9vbV9wb3NzaWJsZSkKK3sKKyAgQnVzQ29uZmlnUGFyc2VyICpwYXJzZXI7CisgIERCdXNFcnJvciBlcnJvcjsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgcGFyc2VyID0gYnVzX2NvbmZpZ19sb2FkIChmdWxsX3BhdGgsIFRSVUUsIE5VTEwsICZlcnJvcik7CisgIGlmIChwYXJzZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmZXJyb3IpOworCisgICAgICBpZiAob29tX3Bvc3NpYmxlICYmCisgICAgICAgICAgZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGxvYWQgdmFsaWQgZmlsZSBkdWUgdG8gT09NXG4iKTsKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHZhbGlkaXR5ID09IFZBTElEKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byBsb2FkIHZhbGlkIGZpbGUgYnV0IHN0aWxsIGhhZCBtZW1vcnk6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworCisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSICgmZXJyb3IpOworCisgICAgICBidXNfY29uZmlnX3BhcnNlcl91bnJlZiAocGFyc2VyKTsKKworICAgICAgaWYgKHZhbGlkaXR5ID09IElOVkFMSUQpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiQWNjZXB0ZWQgaW52YWxpZCBmaWxlXG4iKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorfQorCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBEQnVzU3RyaW5nICpmdWxsX3BhdGg7CisgIFZhbGlkaXR5ICAgICAgICAgIHZhbGlkaXR5OworfSBMb2FkZXJPb21EYXRhOworCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2xvYWRlcl9vb21fZnVuYyAodm9pZCAqZGF0YSkKK3sKKyAgTG9hZGVyT29tRGF0YSAqZCA9IGRhdGE7CisKKyAgcmV0dXJuIGRvX2xvYWQgKGQtPmZ1bGxfcGF0aCwgZC0+dmFsaWRpdHksIFRSVUUpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3Byb2Nlc3NfdGVzdF92YWxpZF9zdWJkaXIgKGNvbnN0IERCdXNTdHJpbmcgKnRlc3RfYmFzZV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpzdWJkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGl0eSAgICAgICAgICB2YWxpZGl0eSkKK3sKKyAgREJ1c1N0cmluZyB0ZXN0X2RpcmVjdG9yeTsKKyAgREJ1c1N0cmluZyBmaWxlbmFtZTsKKyAgREJ1c0Rpckl0ZXIgKmRpcjsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgcmV0dmFsID0gRkFMU0U7CisgIGRpciA9IE5VTEw7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnRlc3RfZGlyZWN0b3J5KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgYWxsb2NhdGUgdGVzdF9kaXJlY3RvcnlcbiIpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZW5hbWUsIHN1YmRpcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAodGVzdF9iYXNlX2RpciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RfZGlyZWN0b3J5LCAwKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBjb3B5IHRlc3RfYmFzZV9kaXIgdG8gdGVzdF9kaXJlY3RvcnkiKTsKKworICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZ0ZXN0X2RpcmVjdG9yeSwgJmZpbGVuYW1lKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBhbGxvY2F0ZSBmdWxsIHBhdGgiKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZpbGVuYW1lKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgYWxsb2NhdGUgZmlsZW5hbWUgc3RyaW5nXG4iKTsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIGRpciA9IF9kYnVzX2RpcmVjdG9yeV9vcGVuICgmdGVzdF9kaXJlY3RvcnksICZlcnJvcik7CisgIGlmIChkaXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiQ291bGQgbm90IG9wZW4gJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmdGVzdF9kaXJlY3RvcnkpLAorICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgaWYgKHZhbGlkaXR5ID09IFZBTElEKQorICAgIHByaW50ZiAoIlRlc3RpbmcgdmFsaWQgZmlsZXM6XG4iKTsKKyAgZWxzZSBpZiAodmFsaWRpdHkgPT0gSU5WQUxJRCkKKyAgICBwcmludGYgKCJUZXN0aW5nIGludmFsaWQgZmlsZXM6XG4iKTsKKyAgZWxzZQorICAgIHByaW50ZiAoIlRlc3RpbmcgdW5rbm93biBmaWxlczpcbiIpOworCisgbmV4dDoKKyAgd2hpbGUgKF9kYnVzX2RpcmVjdG9yeV9nZXRfbmV4dF9maWxlIChkaXIsICZmaWxlbmFtZSwgJmVycm9yKSkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIGZ1bGxfcGF0aDsKKyAgICAgIExvYWRlck9vbURhdGEgZDsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfcGF0aCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGluaXQgc3RyaW5nIik7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZ0ZXN0X2RpcmVjdG9yeSwgMCwgJmZ1bGxfcGF0aCwgMCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGNvcHkgZGlyIHRvIGZ1bGxfcGF0aCIpOworCisgICAgICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZmdWxsX3BhdGgsICZmaWxlbmFtZSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGNvbmNhdCBmaWxlIHRvIGRpciIpOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19lbmRzX3dpdGhfY19zdHIgKCZmdWxsX3BhdGgsICIuY29uZiIpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIlNraXBwaW5nIG5vbi0uY29uZiBmaWxlICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVuYW1lKSk7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgfQorCisgICAgICBwcmludGYgKCIgICAgJXNcbiIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVuYW1lKSk7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgZXhwZWN0aW5nICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHkgPT0gVkFMSUQgPyAidmFsaWQiIDoKKyAgICAgICAgICAgICAgICAgICAgICh2YWxpZGl0eSA9PSBJTlZBTElEID8gImludmFsaWQiIDoKKyAgICAgICAgICAgICAgICAgICAgICAodmFsaWRpdHkgPT0gVU5LTk9XTiA/ICJ1bmtub3duIiA6ICI/Pz8iKSkpOworCisgICAgICBkLmZ1bGxfcGF0aCA9ICZmdWxsX3BhdGg7CisgICAgICBkLnZhbGlkaXR5ID0gdmFsaWRpdHk7CisKKyAgICAgIC8qIEZJWE1FIGhhY2thcm91bmQgZm9yIGFuIGV4cGF0IHByb2JsZW0sIHNlZQorICAgICAgICogaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0xMjQ3NDcKKyAgICAgICAqIGh0dHA6Ly9mcmVlZGVza3RvcC5vcmcvcGlwZXJtYWlsL2RidXMvMjAwNC1NYXkvMDAxMTUzLmh0bWwKKyAgICAgICAqLworICAgICAgLyogaWYgKCFfZGJ1c190ZXN0X29vbV9oYW5kbGluZyAoImNvbmZpZy1sb2FkZXIiLCBjaGVja19sb2FkZXJfb29tX2Z1bmMsICZkKSkgKi8KKyAgICAgIGlmICghY2hlY2tfbG9hZGVyX29vbV9mdW5jICgmZCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInRlc3QgZmFpbGVkIik7CisgICAgICAKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICB9CisKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJDb3VsZCBub3QgZ2V0IG5leHQgZmlsZSBpbiAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ0ZXN0X2RpcmVjdG9yeSksCisgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgZmFpbGVkOgorCisgIGlmIChkaXIpCisgICAgX2RidXNfZGlyZWN0b3J5X2Nsb3NlIChkaXIpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRlc3RfZGlyZWN0b3J5KTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogY29udmVuaWVuY2UgZnVuY3Rpb24sIGRvIG5vdCByZXVzZSBvdXRzaWRlIG9mIFRFU1QgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorbWFrZV9mdWxsX3BhdGggKGNvbnN0IERCdXNTdHJpbmcgKnRlc3RfZGF0YV9kaXIsCisJCQkgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqc3ViZGlyLAorCQkJICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmZpbGUsCisJCQkgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZnVsbF9wYXRoKQoreworICBEQnVzU3RyaW5nIGZpbGVuYW1lOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoZnVsbF9wYXRoKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiY291bGRuJ3QgYWxsb2NhdGUgZnVsbCBwYXRoIik7CisgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAodGVzdF9kYXRhX2RpciwgMCwgZnVsbF9wYXRoLCAwKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiY291bGRuJ3QgYWxsb2NhdGUgZnVsbCBwYXRoIik7CisgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZmaWxlbmFtZSwgc3ViZGlyKTsKKyAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlIChmdWxsX3BhdGgsICZmaWxlbmFtZSkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImNvdWxkbid0IGFsbG9jYXRlIGZ1bGwgcGF0aCIpOworICAgICAgZ290byBmaW5pc2g7CisgICAgfQorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmZpbGVuYW1lLCBmaWxlKTsKKyAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlIChmdWxsX3BhdGgsICZmaWxlbmFtZSkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImNvdWxkbid0IGFsbG9jYXRlIGZ1bGwgcGF0aCIpOworICAgICAgZ290byBmaW5pc2g7CisgICAgfQorCisgIC8qIHdvb3QhICovCisgIHJldHZhbCA9IFRSVUU7CisKK2ZpbmlzaDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfZmlsZV92YWxpZCAoREJ1c1N0cmluZyAqZnVsbF9wYXRoLAorCQkJICAgICAgICAgICAgVmFsaWRpdHkgICAgdmFsaWRpdHkpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBpZiAodmFsaWRpdHkgPT0gVkFMSUQpCisgICAgcHJpbnRmICgiVGVzdGluZyB2YWxpZCBmaWxlOlxuIik7CisgIGVsc2UgaWYgKHZhbGlkaXR5ID09IElOVkFMSUQpCisgICAgcHJpbnRmICgiVGVzdGluZyBpbnZhbGlkIGZpbGU6XG4iKTsKKyAgZWxzZQorICAgIHByaW50ZiAoIlRlc3RpbmcgdW5rbm93biBmaWxlOlxuIik7CisKKyAgLyogcHJpbnQgdGhlIGZpbGVuYW1lLCBqdXN0IHNvIHdlIG1hdGNoIHRoZSBvdGhlciBvdXRwdXQgKi8KKyAgcHJpbnRmICgiICAgICVzXG4iLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZ1bGxfcGF0aCkpOworCisgIC8qIG9ubHkgdGVzdCBvbmUgZmlsZSAqLworICByZXR2YWwgPSBkb19sb2FkIChmdWxsX3BhdGgsIHZhbGlkaXR5LCBUUlVFKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NvbmZpZ19wYXJzZXJfdHJpdmlhbF90ZXN0IChjb25zdCBEQnVzU3RyaW5nICp0ZXN0X2RhdGFfZGlyKQoreworICBEQnVzU3RyaW5nIGZ1bGxfcGF0aDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIGlmICh0ZXN0X2RhdGFfZGlyID09IE5VTEwgfHwKKyAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh0ZXN0X2RhdGFfZGlyKSA9PSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoIk5vIHRlc3QgZGF0YVxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIAorICAvKiBXZSBhbHJlYWR5IHRlc3QgZGVmYXVsdF9zZXNzaW9uX3NlcnZpY2VkaXJzIGFuZCBkZWZhdWx0X3N5c3RlbV9zZXJ2aWNlZGlycworICAgKiBpbiBidXNfY29uZmlnX3BhcnNlcl90ZXN0KCkgKi8KKyAgaWYgKCFwcm9jZXNzX3Rlc3RfdmFsaWRfc3ViZGlyICh0ZXN0X2RhdGFfZGlyLCAidmFsaWQtY29uZmlnLWZpbGVzIiwgVkFMSUQpKQorICAgIGdvdG8gZmluaXNoOworCisgIC8qIHdlIGRvbid0IHByb2Nlc3MgYWxsIHRoZSBpbnZhbGlkIGZpbGVzLCBhcyB0aGUgdHJpdmlhbCBwYXJzZXIgY2FuJ3QgaG9wZQorICAgKiB0byB2YWxpZGF0ZSB0aGVtIGFsbCBmb3IgYWxsIGRpZmZlcmVudCBzeW50YXhlcy4gV2UganVzdCBjaGVjayBvbmUgYnJva2VuCisgICAqIGZpbGUgdG8gc2VlIGlmIGp1bmsgaXMgcmVjZWl2ZWQgKi8KKyAgaWYgKCFtYWtlX2Z1bGxfcGF0aCAodGVzdF9kYXRhX2RpciwgImludmFsaWQtY29uZmlnLWZpbGVzIiwgIm5vdC13ZWxsLWZvcm1lZC5jb25mIiwgJmZ1bGxfcGF0aCkpCisgICAgZ290byBmaW5pc2g7CisgIGlmICghY2hlY2tfZmlsZV92YWxpZCAoJmZ1bGxfcGF0aCwgSU5WQUxJRCkpCisgICAgZ290byBmaW5pc2g7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKworICAvKiBqdXN0IHRlc3QgaWYgdGhlIGNoZWNrX2ZpbGVfdmFsaWQgd29ya3Mgb2theSBhbmQgd2UgZ290IHNhbmUgdmFsdWVzICovCisgIGlmICghbWFrZV9mdWxsX3BhdGggKHRlc3RfZGF0YV9kaXIsICJ2YWxpZC1jb25maWctZmlsZXMiLCAic3lzdGVtLmNvbmYiLCAmZnVsbF9wYXRoKSkKKyAgICBnb3RvIGZpbmlzaDsKKyAgaWYgKCFjaGVja19maWxlX3ZhbGlkICgmZnVsbF9wYXRoLCBWQUxJRCkpCisgICAgZ290byBmaW5pc2g7CisgIC8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBnb3QgdGhlIGNvcnJlY3QgdmFsdWVzIGZyb20gdGhlIHBhcnNlciAqLworICBpZiAoIWNoZWNrX3JldHVybl92YWx1ZXMgKCZmdWxsX3BhdGgpKQorICAgIGdvdG8gZmluaXNoOworCisgIC8qIHdvb3QhICovCisgIHJldHZhbCA9IFRSVUU7CisKK2ZpbmlzaDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworCisgIC8qIHdlIGRvbid0IHByb2Nlc3MgZXF1aXYtY29uZmlnLWZpbGVzIGFzIHdlIGRvbid0IGhhbmRsZSA8aW5jbHVkZT4gKi8KKyAgcmV0dXJuIHJldHZhbDsKK30KKworI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KKwpkaWZmIC0tZ2l0IGEvZGJ1cy9idXMvY29uZmlnLXBhcnNlci10cml2aWFsLmggYi9kYnVzL2J1cy9jb25maWctcGFyc2VyLXRyaXZpYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWRkZWY2Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9idXMvY29uZmlnLXBhcnNlci10cml2aWFsLmgKQEAgLTAsMCArMSw3MiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBjb25maWctcGFyc2VyLXRyaXZpYWwuaCAgWE1MLWxpYnJhcnktYWdub3N0aWMgY29uZmlndXJhdGlvbiBmaWxlIHBhcnNlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgQlVTX0NPTkZJR19QQVJTRVJfVFJJVklBTF9ICisjZGVmaW5lIEJVU19DT05GSUdfUEFSU0VSX1RSSVZJQUxfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWhhc2guaD4KKworLyogV2hhdGV2ZXIgWE1MIGxpYnJhcnkgd2UncmUgdXNpbmcganVzdCBwdXNoZXMgZGF0YSBpbnRvIHRoaXMgQVBJICovCisKK3R5cGVkZWYgc3RydWN0IEJ1c0NvbmZpZ1BhcnNlciBCdXNDb25maWdQYXJzZXI7CisKK0J1c0NvbmZpZ1BhcnNlciogYnVzX2NvbmZpZ19wYXJzZXJfbmV3IChjb25zdCBEQnVzU3RyaW5nICAgICAgKmJhc2VkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICBpc190b3BsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCdXNDb25maWdQYXJzZXIgKnBhcmVudCk7CisKK0J1c0NvbmZpZ1BhcnNlciogYnVzX2NvbmZpZ19wYXJzZXJfcmVmICAgICAgICAgICAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlcik7Cit2b2lkICAgICAgICAgICAgIGJ1c19jb25maWdfcGFyc2VyX3VucmVmICAgICAgICAgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIpOworZGJ1c19ib29sX3QgICAgICBidXNfY29uZmlnX3BhcnNlcl9jaGVja19kb2N0eXBlIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZG9jdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90ICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfc3RhcnRfZWxlbWVudCAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqKmF0dHJpYnV0ZV9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqKmF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgIGJ1c19jb25maWdfcGFyc2VyX2VuZF9lbGVtZW50ICAgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICplbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgIGJ1c19jb25maWdfcGFyc2VyX2NvbnRlbnQgICAgICAgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICpjb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgICBidXNfY29uZmlnX3BhcnNlcl9maW5pc2hlZCAgICAgIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworCisvKiBGdW5jdGlvbnMgZm9yIGV4dHJhY3RpbmcgdGhlIHBhcnNlIHJlc3VsdHMgKi8KK2NvbnN0IGNoYXIqIGJ1c19jb25maWdfcGFyc2VyX2dldF91c2VyICAgICAgICAgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKTsKK2NvbnN0IGNoYXIqIGJ1c19jb25maWdfcGFyc2VyX2dldF90eXBlICAgICAgICAgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKTsKK0RCdXNMaXN0KiogIGJ1c19jb25maWdfcGFyc2VyX2dldF9zZXJ2aWNlX2RpcnMgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKTsKKworLyogTG9hZGVyIGZ1bmN0aW9ucyAoYmFja2VuZGVkIG9mZiBvbmUgb2YgdGhlIFhNTCBwYXJzZXJzKS4gIFJldHVybnMgYQorICogZmluaXNoZWQgQ29uZmlnUGFyc2VyLgorICovCitCdXNDb25maWdQYXJzZXIqIGJ1c19jb25maWdfbG9hZCAoY29uc3QgREJ1c1N0cmluZyAgICAgICpmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgaXNfdG9wbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnVzQ29uZmlnUGFyc2VyICpwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICplcnJvcik7CisKKyNlbmRpZiAvKiBCVVNfQ09ORklHX1BBUlNFUl9UUklWSUFMX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvYnVzL2NvbmZpZy1wYXJzZXIuYyBiL2RidXMvYnVzL2NvbmZpZy1wYXJzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2U4ZmJiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9idXMvY29uZmlnLXBhcnNlci5jCkBAIC0wLDAgKzEsMzYzMyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBjb25maWctcGFyc2VyLmMgIFhNTC1saWJyYXJ5LWFnbm9zdGljIGNvbmZpZ3VyYXRpb24gZmlsZSBwYXJzZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImNvbmZpZy1wYXJzZXItY29tbW9uLmgiCisjaW5jbHVkZSAiY29uZmlnLXBhcnNlci5oIgorI2luY2x1ZGUgInRlc3QuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInBvbGljeS5oIgorI2luY2x1ZGUgInNlbGludXguaCIKKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCit0eXBlZGVmIGVudW0KK3sKKyAgLyogd2UgaWdub3JlIHBvbGljaWVzIGZvciB1bmtub3duIGdyb3Vwcy91c2VycyAqLworICBQT0xJQ1lfSUdOT1JFRCwKKworICAvKiBub24taWdub3JlZCAqLworICBQT0xJQ1lfREVGQVVMVCwKKyAgUE9MSUNZX01BTkRBVE9SWSwKKyAgUE9MSUNZX1VTRVIsCisgIFBPTElDWV9HUk9VUCwKKyAgUE9MSUNZX0NPTlNPTEUKK30gUG9saWN5VHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxlbWVudFR5cGUgdHlwZTsKKworICB1bnNpZ25lZCBpbnQgaGFkX2NvbnRlbnQgOiAxOworCisgIHVuaW9uCisgIHsKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgaWdub3JlX21pc3NpbmcgOiAxOworICAgICAgdW5zaWduZWQgaW50IGlmX3NlbGludXhfZW5hYmxlZCA6IDE7CisgICAgICB1bnNpZ25lZCBpbnQgc2VsaW51eF9yb290X3JlbGF0aXZlIDogMTsKKyAgICB9IGluY2x1ZGU7CisKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICBQb2xpY3lUeXBlIHR5cGU7CisgICAgICB1bnNpZ25lZCBsb25nIGdpZF91aWRfb3JfYXRfY29uc29sZTsgICAgICAKKyAgICB9IHBvbGljeTsKKworICAgIHN0cnVjdAorICAgIHsKKyAgICAgIGNoYXIgKm5hbWU7CisgICAgICBsb25nIHZhbHVlOworICAgIH0gbGltaXQ7CisgICAgCisgIH0gZDsKKworfSBFbGVtZW50OworCisvKioKKyAqIFBhcnNlciBmb3IgYnVzIGNvbmZpZ3VyYXRpb24gZmlsZS4gCisgKi8KK3N0cnVjdCBCdXNDb25maWdQYXJzZXIKK3sKKyAgaW50IHJlZmNvdW50OyAgICAgICAgLyoqPCBSZWZlcmVuY2UgY291bnQgKi8KKworICBEQnVzU3RyaW5nIGJhc2VkaXI7ICAvKio8IERpcmVjdG9yeSB3ZSByZXNvbHZlIHBhdGhzIHJlbGF0aXZlIHRvICovCisgIAorICBEQnVzTGlzdCAqc3RhY2s7ICAgICAvKio8IHN0YWNrIG9mIEVsZW1lbnQgKi8KKworICBjaGFyICp1c2VyOyAgICAgICAgICAvKio8IHVzZXIgdG8gcnVuIGFzICovCisKKyAgY2hhciAqc2VydmljZWhlbHBlcjsgLyoqPCBsb2NhdGlvbiBvZiB0aGUgc2V0dWlkIGhlbHBlciAqLworCisgIGNoYXIgKmJ1c190eXBlOyAgICAgICAgICAvKio8IE1lc3NhZ2UgYnVzIHR5cGUgKi8KKyAgCisgIERCdXNMaXN0ICpsaXN0ZW5fb247IC8qKjwgTGlzdCBvZiBhZGRyZXNzZXMgdG8gbGlzdGVuIHRvICovCisKKyAgREJ1c0xpc3QgKm1lY2hhbmlzbXM7IC8qKjwgQXV0aCBtZWNoYW5pc21zICovCisKKyAgREJ1c0xpc3QgKnNlcnZpY2VfZGlyczsgLyoqPCBEaXJlY3RvcmllcyB0byBsb29rIGZvciBzZXNzaW9uIHNlcnZpY2VzIGluICovCisKKyAgREJ1c0xpc3QgKmNvbmZfZGlyczsgICAvKio8IERpcmVjdG9yaWVzIHRvIGxvb2sgZm9yIHBvbGljeSBjb25maWd1cmF0aW9uIGluICovCisKKyAgQnVzUG9saWN5ICpwb2xpY3k7ICAgICAvKio8IFNlY3VyaXR5IHBvbGljeSAqLworCisgIEJ1c0xpbWl0cyBsaW1pdHM7ICAgICAgLyoqPCBMaW1pdHMgKi8KKworICBjaGFyICpwaWRmaWxlOyAgICAgICAgIC8qKjwgUElEIGZpbGUgKi8KKworICBEQnVzTGlzdCAqaW5jbHVkZWRfZmlsZXM7ICAvKio8IEluY2x1ZGVkIGZpbGVzIHN0YWNrICovCisKKyAgREJ1c0hhc2hUYWJsZSAqc2VydmljZV9jb250ZXh0X3RhYmxlOyAvKio8IE1hcCBzZXJ2aWNlIG5hbWVzIHRvIFNFTGludXggY29udGV4dHMgKi8KKworICB1bnNpZ25lZCBpbnQgZm9yayA6IDE7IC8qKjwgVFJVRSB0byBmb3JrIGludG8gZGFlbW9uIG1vZGUgKi8KKworICB1bnNpZ25lZCBpbnQgc3lzbG9nIDogMTsgLyoqPCBUUlVFIHRvIGVuYWJsZSBzeXNsb2cgKi8KKyAgdW5zaWduZWQgaW50IGtlZXBfdW1hc2sgOiAxOyAvKio8IFRSVUUgdG8ga2VlcCBvcmlnaW5hbCB1bWFzayB3aGVuIGZvcmtpbmcgKi8KKworICB1bnNpZ25lZCBpbnQgaXNfdG9wbGV2ZWwgOiAxOyAvKio8IEZBTFNFIGlmIHdlIGFyZSBhIHN1Yi1jb25maWctZmlsZSBpbnNpZGUgYW5vdGhlciBvbmUgKi8KKworICB1bnNpZ25lZCBpbnQgYWxsb3dfYW5vbnltb3VzIDogMTsgLyoqPCBUUlVFIHRvIGFsbG93IGFub255bW91cyBjb25uZWN0aW9ucyAqLworfTsKKworc3RhdGljIEVsZW1lbnQqCitwdXNoX2VsZW1lbnQgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyLAorICAgICAgICAgICAgICBFbGVtZW50VHlwZSAgICAgIHR5cGUpCit7CisgIEVsZW1lbnQgKmU7CisKKyAgX2RidXNfYXNzZXJ0ICh0eXBlICE9IEVMRU1FTlRfTk9ORSk7CisgIAorICBlID0gZGJ1c19uZXcwIChFbGVtZW50LCAxKTsKKyAgaWYgKGUgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmcGFyc2VyLT5zdGFjaywgZSkpCisgICAgeworICAgICAgZGJ1c19mcmVlIChlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgCisgIGUtPnR5cGUgPSB0eXBlOworCisgIHJldHVybiBlOworfQorCitzdGF0aWMgdm9pZAorZWxlbWVudF9mcmVlIChFbGVtZW50ICplKQoreworICBpZiAoZS0+dHlwZSA9PSBFTEVNRU5UX0xJTUlUKQorICAgIGRidXNfZnJlZSAoZS0+ZC5saW1pdC5uYW1lKTsKKyAgCisgIGRidXNfZnJlZSAoZSk7Cit9CisKK3N0YXRpYyB2b2lkCitwb3BfZWxlbWVudCAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpCit7CisgIEVsZW1lbnQgKmU7CisKKyAgZSA9IF9kYnVzX2xpc3RfcG9wX2xhc3QgKCZwYXJzZXItPnN0YWNrKTsKKyAgCisgIGVsZW1lbnRfZnJlZSAoZSk7Cit9CisKK3N0YXRpYyBFbGVtZW50KgorcGVla19lbGVtZW50IChCdXNDb25maWdQYXJzZXIgKnBhcnNlcikKK3sKKyAgRWxlbWVudCAqZTsKKworICBlID0gX2RidXNfbGlzdF9nZXRfbGFzdCAoJnBhcnNlci0+c3RhY2spOworCisgIHJldHVybiBlOworfQorCitzdGF0aWMgRWxlbWVudFR5cGUKK3RvcF9lbGVtZW50X3R5cGUgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKQoreworICBFbGVtZW50ICplOworCisgIGUgPSBfZGJ1c19saXN0X2dldF9sYXN0ICgmcGFyc2VyLT5zdGFjayk7CisKKyAgaWYgKGUpCisgICAgcmV0dXJuIGUtPnR5cGU7CisgIGVsc2UKKyAgICByZXR1cm4gRUxFTUVOVF9OT05FOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK21lcmdlX3NlcnZpY2VfY29udGV4dF9oYXNoIChEQnVzSGFzaFRhYmxlICpkZXN0LAorCQkJICAgIERCdXNIYXNoVGFibGUgKmZyb20pCit7CisgIERCdXNIYXNoSXRlciBpdGVyOworICBjaGFyICpzZXJ2aWNlX2NvcHk7CisgIGNoYXIgKmNvbnRleHRfY29weTsKKworICBzZXJ2aWNlX2NvcHkgPSBOVUxMOworICBjb250ZXh0X2NvcHkgPSBOVUxMOworCisgIF9kYnVzX2hhc2hfaXRlcl9pbml0IChmcm9tLCAmaXRlcik7CisgIHdoaWxlIChfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnNlcnZpY2UgPSBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3N0cmluZ19rZXkgKCZpdGVyKTsKKyAgICAgIGNvbnN0IGNoYXIgKmNvbnRleHQgPSBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlICgmaXRlcik7CisKKyAgICAgIHNlcnZpY2VfY29weSA9IF9kYnVzX3N0cmR1cCAoc2VydmljZSk7CisgICAgICBpZiAoc2VydmljZV9jb3B5ID09IE5VTEwpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgIGNvbnRleHRfY29weSA9IF9kYnVzX3N0cmR1cCAoY29udGV4dCk7CisgICAgICBpZiAoY29udGV4dF9jb3B5ID09IE5VTEwpCisgICAgICAgIGdvdG8gZmFpbDsgCisgICAgICAKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nIChkZXN0LCBzZXJ2aWNlX2NvcHksIGNvbnRleHRfY29weSkpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgc2VydmljZV9jb3B5ID0gTlVMTDsKKyAgICAgIGNvbnRleHRfY29weSA9IE5VTEw7ICAgIAorICAgIH0KKworICByZXR1cm4gVFJVRTsKKworIGZhaWw6CisgIGlmIChzZXJ2aWNlX2NvcHkpCisgICAgZGJ1c19mcmVlIChzZXJ2aWNlX2NvcHkpOworCisgIGlmIChjb250ZXh0X2NvcHkpCisgICAgZGJ1c19mcmVlIChjb250ZXh0X2NvcHkpOworCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZXJ2aWNlX2RpcnNfZmluZF9kaXIgKERCdXNMaXN0ICoqc2VydmljZV9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkaXIpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIF9kYnVzX2Fzc2VydCAoZGlyICE9IE5VTEwpOworCisgIGZvciAobGluayA9ICpzZXJ2aWNlX2RpcnM7IGxpbms7IGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsoc2VydmljZV9kaXJzLCBsaW5rKSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpsaW5rX2RpcjsKKyAgICAgIAorICAgICAgbGlua19kaXIgPSAoY29uc3QgY2hhciAqKWxpbmstPmRhdGE7CisgICAgICBpZiAoc3RyY21wIChkaXIsIGxpbmtfZGlyKSA9PSAwKQorICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NlcnZpY2VfZGlyc19hcHBlbmRfdW5pcXVlX29yX2ZyZWUgKERCdXNMaXN0ICoqc2VydmljZV9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZGlyKQoreworICBpZiAoIXNlcnZpY2VfZGlyc19maW5kX2RpciAoc2VydmljZV9kaXJzLCBkaXIpKQorICAgIHJldHVybiBfZGJ1c19saXN0X2FwcGVuZCAoc2VydmljZV9kaXJzLCBkaXIpOyAgCisKKyAgZGJ1c19mcmVlIChkaXIpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQgCitzZXJ2aWNlX2RpcnNfYXBwZW5kX2xpbmtfdW5pcXVlX29yX2ZyZWUgKERCdXNMaXN0ICoqc2VydmljZV9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAqZGlyX2xpbmspCit7CisgIGlmICghc2VydmljZV9kaXJzX2ZpbmRfZGlyIChzZXJ2aWNlX2RpcnMsIGRpcl9saW5rLT5kYXRhKSkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X2FwcGVuZF9saW5rIChzZXJ2aWNlX2RpcnMsIGRpcl9saW5rKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKGRpcl9saW5rLT5kYXRhKTsKKyAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChkaXJfbGluayk7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK21lcmdlX2luY2x1ZGVkIChCdXNDb25maWdQYXJzZXIgKnBhcnNlciwKKyAgICAgICAgICAgICAgICBCdXNDb25maWdQYXJzZXIgKmluY2x1ZGVkLAorICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGlmICghYnVzX3BvbGljeV9tZXJnZSAocGFyc2VyLT5wb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWQtPnBvbGljeSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFtZXJnZV9zZXJ2aWNlX2NvbnRleHRfaGFzaCAocGFyc2VyLT5zZXJ2aWNlX2NvbnRleHRfdGFibGUsCisJCQkJICAgaW5jbHVkZWQtPnNlcnZpY2VfY29udGV4dF90YWJsZSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoaW5jbHVkZWQtPnVzZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHBhcnNlci0+dXNlcik7CisgICAgICBwYXJzZXItPnVzZXIgPSBpbmNsdWRlZC0+dXNlcjsKKyAgICAgIGluY2x1ZGVkLT51c2VyID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGluY2x1ZGVkLT5idXNfdHlwZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAocGFyc2VyLT5idXNfdHlwZSk7CisgICAgICBwYXJzZXItPmJ1c190eXBlID0gaW5jbHVkZWQtPmJ1c190eXBlOworICAgICAgaW5jbHVkZWQtPmJ1c190eXBlID0gTlVMTDsKKyAgICB9CisgIAorICBpZiAoaW5jbHVkZWQtPmZvcmspCisgICAgcGFyc2VyLT5mb3JrID0gVFJVRTsKKworICBpZiAoaW5jbHVkZWQtPmtlZXBfdW1hc2spCisgICAgcGFyc2VyLT5rZWVwX3VtYXNrID0gVFJVRTsKKworICBpZiAoaW5jbHVkZWQtPnBpZGZpbGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHBhcnNlci0+cGlkZmlsZSk7CisgICAgICBwYXJzZXItPnBpZGZpbGUgPSBpbmNsdWRlZC0+cGlkZmlsZTsKKyAgICAgIGluY2x1ZGVkLT5waWRmaWxlID0gTlVMTDsKKyAgICB9CisgIAorICB3aGlsZSAoKGxpbmsgPSBfZGJ1c19saXN0X3BvcF9maXJzdF9saW5rICgmaW5jbHVkZWQtPmxpc3Rlbl9vbikpKQorICAgIF9kYnVzX2xpc3RfYXBwZW5kX2xpbmsgKCZwYXJzZXItPmxpc3Rlbl9vbiwgbGluayk7CisKKyAgd2hpbGUgKChsaW5rID0gX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayAoJmluY2x1ZGVkLT5tZWNoYW5pc21zKSkpCisgICAgX2RidXNfbGlzdF9hcHBlbmRfbGluayAoJnBhcnNlci0+bWVjaGFuaXNtcywgbGluayk7CisKKyAgd2hpbGUgKChsaW5rID0gX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayAoJmluY2x1ZGVkLT5zZXJ2aWNlX2RpcnMpKSkKKyAgICBzZXJ2aWNlX2RpcnNfYXBwZW5kX2xpbmtfdW5pcXVlX29yX2ZyZWUgKCZwYXJzZXItPnNlcnZpY2VfZGlycywgbGluayk7CisKKyAgd2hpbGUgKChsaW5rID0gX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayAoJmluY2x1ZGVkLT5jb25mX2RpcnMpKSkKKyAgICBfZGJ1c19saXN0X2FwcGVuZF9saW5rICgmcGFyc2VyLT5jb25mX2RpcnMsIGxpbmspOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2Vlbl9pbmNsdWRlIChCdXNDb25maWdQYXJzZXIgICpwYXJzZXIsCisJICAgICAgY29uc3QgREJ1c1N0cmluZyAqZmlsZSkKK3sKKyAgREJ1c0xpc3QgKml0ZXI7CisKKyAgaXRlciA9IHBhcnNlci0+aW5jbHVkZWRfZmlsZXM7CisgIHdoaWxlIChpdGVyICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCEgc3RyY21wIChfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGUpLCBpdGVyLT5kYXRhKSkKKwlyZXR1cm4gVFJVRTsKKworICAgICAgaXRlciA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnBhcnNlci0+aW5jbHVkZWRfZmlsZXMsIGl0ZXIpOworICAgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK0J1c0NvbmZpZ1BhcnNlcioKK2J1c19jb25maWdfcGFyc2VyX25ldyAoY29uc3QgREJ1c1N0cmluZyAgICAgICpiYXNlZGlyLAorICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgIGlzX3RvcGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCdXNDb25maWdQYXJzZXIgKnBhcmVudCkKK3sKKyAgQnVzQ29uZmlnUGFyc2VyICpwYXJzZXI7CisKKyAgcGFyc2VyID0gZGJ1c19uZXcwIChCdXNDb25maWdQYXJzZXIsIDEpOworICBpZiAocGFyc2VyID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcGFyc2VyLT5pc190b3BsZXZlbCA9ICEhaXNfdG9wbGV2ZWw7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcGFyc2VyLT5iYXNlZGlyKSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHBhcnNlcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKCgocGFyc2VyLT5wb2xpY3kgPSBidXNfcG9saWN5X25ldyAoKSkgPT0gTlVMTCkgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfY29weSAoYmFzZWRpciwgMCwgJnBhcnNlci0+YmFzZWRpciwgMCkgfHwKKyAgICAgICgocGFyc2VyLT5zZXJ2aWNlX2NvbnRleHRfdGFibGUgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1NUUklORywKKwkJCQkJCQkgICAgICBkYnVzX2ZyZWUsCisJCQkJCQkJICAgICAgZGJ1c19mcmVlKSkgPT0gTlVMTCkpCisgICAgeworICAgICAgaWYgKHBhcnNlci0+cG9saWN5KQorICAgICAgICBidXNfcG9saWN5X3VucmVmIChwYXJzZXItPnBvbGljeSk7CisgICAgICAKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGFyc2VyLT5iYXNlZGlyKTsKKworICAgICAgZGJ1c19mcmVlIChwYXJzZXIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmIChwYXJlbnQgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBJbml0aWFsaXplIHRoZSBwYXJzZXIncyBsaW1pdHMgZnJvbSB0aGUgcGFyZW50LiAqLworICAgICAgcGFyc2VyLT5saW1pdHMgPSBwYXJlbnQtPmxpbWl0czsKKworICAgICAgLyogVXNlIHRoZSBwYXJlbnQncyBsaXN0IG9mIGluY2x1ZGVkX2ZpbGVzIHRvIGF2b2lkCisJIGNpcmN1bGFyIGluY2x1c2lvbnMuICovCisgICAgICBwYXJzZXItPmluY2x1ZGVkX2ZpbGVzID0gcGFyZW50LT5pbmNsdWRlZF9maWxlczsKKyAgICB9CisgIGVsc2UKKyAgICB7CisKKyAgICAgIC8qIE1ha2UgdXAgc29tZSBudW1iZXJzISB3b290ISAqLworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X2luY29taW5nX2J5dGVzID0gX0RCVVNfT05FX01FR0FCWVRFICogMTI3OworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X291dGdvaW5nX2J5dGVzID0gX0RCVVNfT05FX01FR0FCWVRFICogMTI3OworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X21lc3NhZ2Vfc2l6ZSA9IF9EQlVTX09ORV9NRUdBQllURSAqIDMyOworCisgICAgICAvKiBXZSBzZXQgcmVsYXRpdmVseSBjb25zZXJ2YXRpdmUgdmFsdWVzIGhlcmUgc2luY2UgZHVlIHRvIHRoZQorICAgICAgd2F5IFNDTV9SSUdIVFMgd29ya3Mgd2UgbmVlZCB0byBwcmVhbGxvY2F0ZSBhbiBhcnJheSBmb3IgdGhlCisgICAgICBtYXhpbXVtIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIHdlIGNhbiByZWNlaXZlLiBQaWNraW5nIGEKKyAgICAgIGhpZ2ggdmFsdWUgaGVyZSB0aHVzIHRyYW5zbGF0ZXMgZGlyZWN0bHkgdG8gbW9yZSBtZW1vcnkKKyAgICAgIGFsbG9jYXRpb24uICovCisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfaW5jb21pbmdfdW5peF9mZHMgPSAxMDI0KjQ7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfb3V0Z29pbmdfdW5peF9mZHMgPSAxMDI0KjQ7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfbWVzc2FnZV91bml4X2ZkcyA9IDEwMjQ7CisgICAgICAKKyAgICAgIC8qIE1ha2luZyB0aGlzIGxvbmcgbWVhbnMgdGhlIHVzZXIgaGFzIHRvIHdhaXQgbG9uZ2VyIGZvciBhbiBlcnJvcgorICAgICAgICogbWVzc2FnZSBpZiBzb21ldGhpbmcgc2NyZXdzIHVwLCBidXQgbWFraW5nIGl0IHRvbyBzaG9ydCBtZWFucworICAgICAgICogdGhleSBtaWdodCBzZWUgYSBmYWxzZSBmYWlsdXJlLgorICAgICAgICovCisgICAgICBwYXJzZXItPmxpbWl0cy5hY3RpdmF0aW9uX3RpbWVvdXQgPSAyNTAwMDsgLyogMjUgc2Vjb25kcyAqLworCisgICAgICAvKiBNYWtpbmcgdGhpcyBsb25nIHJpc2tzIG1ha2luZyBhIERPUyBhdHRhY2sgZWFzaWVyLCBidXQgdG9vIHNob3J0CisgICAgICAgKiBhbmQgbGVnaXRpbWF0ZSBhdXRoIHdpbGwgZmFpbC4gIElmIGludGVyYWN0aXZlIGF1dGggKGFzayB1c2VyIGZvcgorICAgICAgICogcGFzc3dvcmQpIGlzIGFsbG93ZWQsIHRoZW4gcG90ZW50aWFsbHkgaXQgaGFzIHRvIGJlIHF1aXRlIGxvbmcuCisgICAgICAgKi8KKyAgICAgIHBhcnNlci0+bGltaXRzLmF1dGhfdGltZW91dCA9IDMwMDAwOyAvKiAzMCBzZWNvbmRzICovCisgICAgICAKKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9pbmNvbXBsZXRlX2Nvbm5lY3Rpb25zID0gNjQ7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfY29ubmVjdGlvbnNfcGVyX3VzZXIgPSAyNTY7CisgICAgICAKKyAgICAgIC8qIE5vdGUgdGhhdCBtYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zIC8gbWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyCisgICAgICAgKiBpcyB0aGUgbnVtYmVyIG9mIHVzZXJzIHRoYXQgd291bGQgaGF2ZSB0byB3b3JrIHRvZ2V0aGVyIHRvCisgICAgICAgKiBET1MgYWxsIHRoZSBvdGhlciB1c2Vycy4KKyAgICAgICAqLworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyA9IDIwNDg7CisgICAgICAKKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9wZW5kaW5nX2FjdGl2YXRpb25zID0gNTEyOworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X3NlcnZpY2VzX3Blcl9jb25uZWN0aW9uID0gNTEyOworCisgICAgICAvKiBGb3IgdGhpcyBvbmUsIGtlZXAgaW4gbWluZCB0aGF0IGl0IGlzbid0IG9ubHkgdGhlIG1lbW9yeSB1c2VkCisgICAgICAgKiBieSB0aGUgbWF0Y2ggcnVsZXMsIGJ1dCBzbG93ZG93biBmcm9tIGxpbmVhcmx5IHdhbGtpbmcgYSBiaWcKKyAgICAgICAqIGxpc3Qgb2YgdGhlbS4gQSBjbGllbnQgYWRkaW5nIG1vcmUgdGhhbiB0aGlzIGlzIGFsbW9zdAorICAgICAgICogY2VydGFpbmx5IGEgYmFkIGlkZWEgZm9yIHRoYXQgcmVhc29uLCBhbmQgc2hvdWxkIGNoYW5nZSB0byBhCisgICAgICAgKiBzbWFsbGVyIG51bWJlciBvZiB3aWRlci1uZXQgbWF0Y2ggcnVsZXMgLSBnZXR0aW5nIGV2ZXJ5IGxhc3QKKyAgICAgICAqIG1lc3NhZ2UgdG8gdGhlIGJ1cyBpcyBwcm9iYWJseSBiZXR0ZXIgdGhhbiBoYXZpbmcgYSB0aG91c2FuZAorICAgICAgICogbWF0Y2ggcnVsZXMuCisgICAgICAgKi8KKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbiA9IDUxMjsKKyAgICAgIAorICAgICAgcGFyc2VyLT5saW1pdHMucmVwbHlfdGltZW91dCA9IC0xOyAvKiBuZXZlciAqLworCisgICAgICAvKiB0aGlzIGlzIGVmZmVjdGl2ZWx5IGEgbGltaXQgb24gbWVzc2FnZSBxdWV1ZSBzaXplIGZvciBtZXNzYWdlcworICAgICAgICogdGhhdCByZXF1aXJlIGEgcmVwbHkKKyAgICAgICAqLworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X3JlcGxpZXNfcGVyX2Nvbm5lY3Rpb24gPSAxMDI0Kjg7CisgICAgfQorICAgICAgCisgIHBhcnNlci0+cmVmY291bnQgPSAxOworICAgICAgCisgIHJldHVybiBwYXJzZXI7Cit9CisKK0J1c0NvbmZpZ1BhcnNlciAqCitidXNfY29uZmlnX3BhcnNlcl9yZWYgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKQoreworICBfZGJ1c19hc3NlcnQgKHBhcnNlci0+cmVmY291bnQgPiAwKTsKKworICBwYXJzZXItPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIHBhcnNlcjsKK30KKwordm9pZAorYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKQoreworICBfZGJ1c19hc3NlcnQgKHBhcnNlci0+cmVmY291bnQgPiAwKTsKKworICBwYXJzZXItPnJlZmNvdW50IC09IDE7CisKKyAgaWYgKHBhcnNlci0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICB3aGlsZSAocGFyc2VyLT5zdGFjayAhPSBOVUxMKQorICAgICAgICBwb3BfZWxlbWVudCAocGFyc2VyKTsKKworICAgICAgZGJ1c19mcmVlIChwYXJzZXItPnVzZXIpOworICAgICAgZGJ1c19mcmVlIChwYXJzZXItPnNlcnZpY2VoZWxwZXIpOworICAgICAgZGJ1c19mcmVlIChwYXJzZXItPmJ1c190eXBlKTsKKyAgICAgIGRidXNfZnJlZSAocGFyc2VyLT5waWRmaWxlKTsKKyAgICAgIAorICAgICAgX2RidXNfbGlzdF9mb3JlYWNoICgmcGFyc2VyLT5saXN0ZW5fb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzRm9yZWFjaEZ1bmN0aW9uKSBkYnVzX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICBfZGJ1c19saXN0X2NsZWFyICgmcGFyc2VyLT5saXN0ZW5fb24pOworCisgICAgICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZwYXJzZXItPnNlcnZpY2VfZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNGb3JlYWNoRnVuY3Rpb24pIGRidXNfZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCZwYXJzZXItPnNlcnZpY2VfZGlycyk7CisKKyAgICAgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJnBhcnNlci0+Y29uZl9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0ZvcmVhY2hGdW5jdGlvbikgZGJ1c19mcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgX2RidXNfbGlzdF9jbGVhciAoJnBhcnNlci0+Y29uZl9kaXJzKTsKKworICAgICAgX2RidXNfbGlzdF9mb3JlYWNoICgmcGFyc2VyLT5tZWNoYW5pc21zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0ZvcmVhY2hGdW5jdGlvbikgZGJ1c19mcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgX2RidXNfbGlzdF9jbGVhciAoJnBhcnNlci0+bWVjaGFuaXNtcyk7CisgICAgICAKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGFyc2VyLT5iYXNlZGlyKTsKKworICAgICAgaWYgKHBhcnNlci0+cG9saWN5KQorICAgICAgICBidXNfcG9saWN5X3VucmVmIChwYXJzZXItPnBvbGljeSk7CisKKyAgICAgIGlmIChwYXJzZXItPnNlcnZpY2VfY29udGV4dF90YWJsZSkKKyAgICAgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAocGFyc2VyLT5zZXJ2aWNlX2NvbnRleHRfdGFibGUpOworICAgICAgCisgICAgICBkYnVzX2ZyZWUgKHBhcnNlcik7CisgICAgfQorfQorCitkYnVzX2Jvb2xfdAorYnVzX2NvbmZpZ19wYXJzZXJfY2hlY2tfZG9jdHlwZSAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICpkb2N0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoc3RyY21wIChkb2N0eXBlLCAiYnVzY29uZmlnIikgIT0gMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkNvbmZpZ3VyYXRpb24gZmlsZSBoYXMgdGhlIHdyb25nIGRvY3VtZW50IHR5cGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGRvY3R5cGUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBUUlVFOworfQorCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBjaGFyICAqbmFtZTsKKyAgY29uc3QgY2hhciAqKnJldGxvYzsKK30gTG9jYXRlQXR0cjsKKworc3RhdGljIGRidXNfYm9vbF90Citsb2NhdGVfYXR0cmlidXRlcyAoQnVzQ29uZmlnUGFyc2VyICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgKiphdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICoqYXR0cmlidXRlX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvciwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpmaXJzdF9hdHRyaWJ1dGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgKipmaXJzdF9hdHRyaWJ1dGVfcmV0bG9jLAorICAgICAgICAgICAgICAgICAgIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworICBjb25zdCBjaGFyICpuYW1lOworICBjb25zdCBjaGFyICoqcmV0bG9jOworICBpbnQgbl9hdHRyczsKKyNkZWZpbmUgTUFYX0FUVFJTIDI0CisgIExvY2F0ZUF0dHIgYXR0cnNbTUFYX0FUVFJTXTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBpbnQgaTsKKworICBfZGJ1c19hc3NlcnQgKGZpcnN0X2F0dHJpYnV0ZV9uYW1lICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGZpcnN0X2F0dHJpYnV0ZV9yZXRsb2MgIT0gTlVMTCk7CisKKyAgcmV0dmFsID0gVFJVRTsKKworICBuX2F0dHJzID0gMTsKKyAgYXR0cnNbMF0ubmFtZSA9IGZpcnN0X2F0dHJpYnV0ZV9uYW1lOworICBhdHRyc1swXS5yZXRsb2MgPSBmaXJzdF9hdHRyaWJ1dGVfcmV0bG9jOworICAqZmlyc3RfYXR0cmlidXRlX3JldGxvYyA9IE5VTEw7CisKKyAgdmFfc3RhcnQgKGFyZ3MsIGZpcnN0X2F0dHJpYnV0ZV9yZXRsb2MpOworCisgIG5hbWUgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IGNoYXIqKTsKKyAgcmV0bG9jID0gdmFfYXJnIChhcmdzLCBjb25zdCBjaGFyKiopOworCisgIHdoaWxlIChuYW1lICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChyZXRsb2MgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKG5fYXR0cnMgPCBNQVhfQVRUUlMpOworCisgICAgICBhdHRyc1tuX2F0dHJzXS5uYW1lID0gbmFtZTsKKyAgICAgIGF0dHJzW25fYXR0cnNdLnJldGxvYyA9IHJldGxvYzsKKyAgICAgIG5fYXR0cnMgKz0gMTsKKyAgICAgICpyZXRsb2MgPSBOVUxMOworCisgICAgICBuYW1lID0gdmFfYXJnIChhcmdzLCBjb25zdCBjaGFyKik7CisgICAgICByZXRsb2MgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IGNoYXIqKik7CisgICAgfQorCisgIHZhX2VuZCAoYXJncyk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChhdHRyaWJ1dGVfbmFtZXNbaV0pCisgICAgeworICAgICAgaW50IGo7CisgICAgICBkYnVzX2Jvb2xfdCBmb3VuZDsKKyAgICAgIAorICAgICAgZm91bmQgPSBGQUxTRTsKKyAgICAgIGogPSAwOworICAgICAgd2hpbGUgKGogPCBuX2F0dHJzKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHN0cmNtcCAoYXR0cnNbal0ubmFtZSwgYXR0cmlidXRlX25hbWVzW2ldKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXRsb2MgPSBhdHRyc1tqXS5yZXRsb2M7CisKKyAgICAgICAgICAgICAgaWYgKCpyZXRsb2MgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgXCIlc1wiIHJlcGVhdGVkIHR3aWNlIG9uIHRoZSBzYW1lIDwlcz4gZWxlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnNbal0ubmFtZSwgZWxlbWVudF9uYW1lKTsKKyAgICAgICAgICAgICAgICAgIHJldHZhbCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICpyZXRsb2MgPSBhdHRyaWJ1dGVfdmFsdWVzW2ldOworICAgICAgICAgICAgICBmb3VuZCA9IFRSVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICArK2o7CisgICAgICAgIH0KKworICAgICAgaWYgKCFmb3VuZCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgXCIlc1wiIGlzIGludmFsaWQgb24gPCVzPiBlbGVtZW50IGluIHRoaXMgY29udGV4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV9uYW1lc1tpXSwgZWxlbWVudF9uYW1lKTsKKyAgICAgICAgICByZXR2YWwgPSBGQUxTRTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgb3V0OgorICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX25vX2F0dHJpYnV0ZXMgKEJ1c0NvbmZpZ1BhcnNlciAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqKmF0dHJpYnV0ZV9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqKmF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgaWYgKGF0dHJpYnV0ZV9uYW1lc1swXSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkF0dHJpYnV0ZSBcIiVzXCIgaXMgaW52YWxpZCBvbiA8JXM+IGVsZW1lbnQgaW4gdGhpcyBjb250ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfbmFtZXNbMF0sIGVsZW1lbnRfbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3N0YXJ0X2J1c2NvbmZpZ19jaGlsZCAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqKmF0dHJpYnV0ZV9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqKmF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgRWxlbWVudFR5cGUgZWxlbWVudF90eXBlOworCisgIGVsZW1lbnRfdHlwZSA9IGJ1c19jb25maWdfcGFyc2VyX2VsZW1lbnRfbmFtZV90b190eXBlIChlbGVtZW50X25hbWUpOworCisgIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9VU0VSKQorICAgIHsKKyAgICAgIGlmICghY2hlY2tfbm9fYXR0cmlidXRlcyAocGFyc2VyLCAidXNlciIsIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9VU0VSKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9DT05GSUdUWVBFKQorICAgIHsKKyAgICAgIGlmICghY2hlY2tfbm9fYXR0cmlidXRlcyAocGFyc2VyLCAidHlwZSIsIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9DT05GSUdUWVBFKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9GT1JLKQorICAgIHsKKyAgICAgIGlmICghY2hlY2tfbm9fYXR0cmlidXRlcyAocGFyc2VyLCAiZm9yayIsIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9GT1JLKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcGFyc2VyLT5mb3JrID0gVFJVRTsKKyAgICAgIAorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9TWVNMT0cpCisgICAgeworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJzeXNsb2ciLCBhdHRyaWJ1dGVfbmFtZXMsIGF0dHJpYnV0ZV92YWx1ZXMsIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAocHVzaF9lbGVtZW50IChwYXJzZXIsIEVMRU1FTlRfU1lTTE9HKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgcGFyc2VyLT5zeXNsb2cgPSBUUlVFOworICAgICAgCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX0tFRVBfVU1BU0spCisgICAgeworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJrZWVwX3VtYXNrIiwgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX0tFRVBfVU1BU0spID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBwYXJzZXItPmtlZXBfdW1hc2sgPSBUUlVFOworICAgICAgCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX1BJREZJTEUpCisgICAgeworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJwaWRmaWxlIiwgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX1BJREZJTEUpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX0xJU1RFTikKKyAgICB7CisgICAgICBpZiAoIWNoZWNrX25vX2F0dHJpYnV0ZXMgKHBhcnNlciwgImxpc3RlbiIsIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9MSVNURU4pID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX0FVVEgpCisgICAgeworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJhdXRoIiwgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX0FVVEgpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX1NFUlZJQ0VIRUxQRVIpCisgICAgeworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJzZXJ2aWNlaGVscGVyIiwgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX1NFUlZJQ0VIRUxQRVIpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX0lOQ0xVREVESVIpCisgICAgeworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJpbmNsdWRlZGlyIiwgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX0lOQ0xVREVESVIpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX1NUQU5EQVJEX1NFU1NJT05fU0VSVklDRURJUlMpCisgICAgeworICAgICAgREJ1c0xpc3QgKmxpbms7CisgICAgICBEQnVzTGlzdCAqZGlyczsKKyAgICAgIGRpcnMgPSBOVUxMOworCisgICAgICBpZiAoIWNoZWNrX25vX2F0dHJpYnV0ZXMgKHBhcnNlciwgInN0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMiLCBhdHRyaWJ1dGVfbmFtZXMsIGF0dHJpYnV0ZV92YWx1ZXMsIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAocHVzaF9lbGVtZW50IChwYXJzZXIsIEVMRU1FTlRfU1RBTkRBUkRfU0VTU0lPTl9TRVJWSUNFRElSUykgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfZ2V0X3N0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMgKCZkaXJzKSkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKChsaW5rID0gX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayAoJmRpcnMpKSkKKyAgICAgICAgICBzZXJ2aWNlX2RpcnNfYXBwZW5kX2xpbmtfdW5pcXVlX29yX2ZyZWUgKCZwYXJzZXItPnNlcnZpY2VfZGlycywgbGluayk7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZSBpZiAoZWxlbWVudF90eXBlID09IEVMRU1FTlRfU1RBTkRBUkRfU1lTVEVNX1NFUlZJQ0VESVJTKQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpsaW5rOworICAgICAgREJ1c0xpc3QgKmRpcnM7CisgICAgICBkaXJzID0gTlVMTDsKKworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJzdGFuZGFyZF9zeXN0ZW1fc2VydmljZWRpcnMiLCBhdHRyaWJ1dGVfbmFtZXMsIGF0dHJpYnV0ZV92YWx1ZXMsIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAocHVzaF9lbGVtZW50IChwYXJzZXIsIEVMRU1FTlRfU1RBTkRBUkRfU1lTVEVNX1NFUlZJQ0VESVJTKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19nZXRfc3RhbmRhcmRfc3lzdGVtX3NlcnZpY2VkaXJzICgmZGlycykpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICgobGluayA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0X2xpbmsgKCZkaXJzKSkpCisgICAgICAgICAgc2VydmljZV9kaXJzX2FwcGVuZF9saW5rX3VuaXF1ZV9vcl9mcmVlICgmcGFyc2VyLT5zZXJ2aWNlX2RpcnMsIGxpbmspOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX0FMTE9XX0FOT05ZTU9VUykKKyAgICB7CisgICAgICBpZiAoIWNoZWNrX25vX2F0dHJpYnV0ZXMgKHBhcnNlciwgImFsbG93X2Fub255bW91cyIsIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9BTExPV19BTk9OWU1PVVMpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBwYXJzZXItPmFsbG93X2Fub255bW91cyA9IFRSVUU7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX1NFUlZJQ0VESVIpCisgICAgeworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJzZXJ2aWNlZGlyIiwgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX1NFUlZJQ0VESVIpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX0lOQ0xVREUpCisgICAgeworICAgICAgRWxlbWVudCAqZTsKKyAgICAgIGNvbnN0IGNoYXIgKmlmX3NlbGludXhfZW5hYmxlZDsKKyAgICAgIGNvbnN0IGNoYXIgKmlnbm9yZV9taXNzaW5nOworICAgICAgY29uc3QgY2hhciAqc2VsaW51eF9yb290X3JlbGF0aXZlOworCisgICAgICBpZiAoKGUgPSBwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9JTkNMVURFKSkgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGUtPmQuaW5jbHVkZS5pZ25vcmVfbWlzc2luZyA9IEZBTFNFOworICAgICAgZS0+ZC5pbmNsdWRlLmlmX3NlbGludXhfZW5hYmxlZCA9IEZBTFNFOworICAgICAgZS0+ZC5pbmNsdWRlLnNlbGludXhfcm9vdF9yZWxhdGl2ZSA9IEZBTFNFOworCisgICAgICBpZiAoIWxvY2F0ZV9hdHRyaWJ1dGVzIChwYXJzZXIsICJpbmNsdWRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZ25vcmVfbWlzc2luZyIsICZpZ25vcmVfbWlzc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZl9zZWxpbnV4X2VuYWJsZWQiLCAmaWZfc2VsaW51eF9lbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGludXhfcm9vdF9yZWxhdGl2ZSIsICZzZWxpbnV4X3Jvb3RfcmVsYXRpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoaWdub3JlX21pc3NpbmcgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChzdHJjbXAgKGlnbm9yZV9taXNzaW5nLCAieWVzIikgPT0gMCkKKyAgICAgICAgICAgIGUtPmQuaW5jbHVkZS5pZ25vcmVfbWlzc2luZyA9IFRSVUU7CisgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChpZ25vcmVfbWlzc2luZywgIm5vIikgPT0gMCkKKyAgICAgICAgICAgIGUtPmQuaW5jbHVkZS5pZ25vcmVfbWlzc2luZyA9IEZBTFNFOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZ25vcmVfbWlzc2luZyBhdHRyaWJ1dGUgbXVzdCBoYXZlIHZhbHVlIFwieWVzXCIgb3IgXCJub1wiIik7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBpZiAoaWZfc2VsaW51eF9lbmFibGVkICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoc3RyY21wIChpZl9zZWxpbnV4X2VuYWJsZWQsICJ5ZXMiKSA9PSAwKQorICAgICAgICAgICAgZS0+ZC5pbmNsdWRlLmlmX3NlbGludXhfZW5hYmxlZCA9IFRSVUU7CisgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChpZl9zZWxpbnV4X2VuYWJsZWQsICJubyIpID09IDApCisgICAgICAgICAgICBlLT5kLmluY2x1ZGUuaWZfc2VsaW51eF9lbmFibGVkID0gRkFMU0U7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlmX3NlbGludXhfZW5hYmxlZCBhdHRyaWJ1dGUgbXVzdCBoYXZlIHZhbHVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBcInllc1wiIG9yIFwibm9cIiIpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisJICAgIH0KKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAoc2VsaW51eF9yb290X3JlbGF0aXZlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoc3RyY21wIChzZWxpbnV4X3Jvb3RfcmVsYXRpdmUsICJ5ZXMiKSA9PSAwKQorICAgICAgICAgICAgZS0+ZC5pbmNsdWRlLnNlbGludXhfcm9vdF9yZWxhdGl2ZSA9IFRSVUU7CisgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChzZWxpbnV4X3Jvb3RfcmVsYXRpdmUsICJubyIpID09IDApCisgICAgICAgICAgICBlLT5kLmluY2x1ZGUuc2VsaW51eF9yb290X3JlbGF0aXZlID0gRkFMU0U7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGludXhfcm9vdF9yZWxhdGl2ZSBhdHRyaWJ1dGUgbXVzdCBoYXZlIHZhbHVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBcInllc1wiIG9yIFwibm9cIiIpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisJICAgIH0KKyAgICAgICAgfQorCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX1BPTElDWSkKKyAgICB7CisgICAgICBFbGVtZW50ICplOworICAgICAgY29uc3QgY2hhciAqY29udGV4dDsKKyAgICAgIGNvbnN0IGNoYXIgKnVzZXI7CisgICAgICBjb25zdCBjaGFyICpncm91cDsKKyAgICAgIGNvbnN0IGNoYXIgKmF0X2NvbnNvbGU7CisKKyAgICAgIGlmICgoZSA9IHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX1BPTElDWSkpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBlLT5kLnBvbGljeS50eXBlID0gUE9MSUNZX0lHTk9SRUQ7CisgICAgICAKKyAgICAgIGlmICghbG9jYXRlX2F0dHJpYnV0ZXMgKHBhcnNlciwgInBvbGljeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGV4dCIsICZjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZXIiLCAmdXNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncm91cCIsICZncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdF9jb25zb2xlIiwgJmF0X2NvbnNvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoKChjb250ZXh0ICYmIHVzZXIpIHx8CisgICAgICAgICAgIChjb250ZXh0ICYmIGdyb3VwKSB8fAorICAgICAgICAgICAoY29udGV4dCAmJiBhdF9jb25zb2xlKSkgfHwKKyAgICAgICAgICAgKCh1c2VyICYmIGdyb3VwKSB8fAorICAgICAgICAgICAodXNlciAmJiBhdF9jb25zb2xlKSkgfHwKKyAgICAgICAgICAgKGdyb3VwICYmIGF0X2NvbnNvbGUpIHx8CisgICAgICAgICAgIShjb250ZXh0IHx8IHVzZXIgfHwgZ3JvdXAgfHwgYXRfY29uc29sZSkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAiPHBvbGljeT4gZWxlbWVudCBtdXN0IGhhdmUgZXhhY3RseSBvbmUgb2YgKGNvbnRleHR8dXNlcnxncm91cHxhdF9jb25zb2xlKSBhdHRyaWJ1dGVzIik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmIChjb250ZXh0ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoc3RyY21wIChjb250ZXh0LCAiZGVmYXVsdCIpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGUtPmQucG9saWN5LnR5cGUgPSBQT0xJQ1lfREVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKGNvbnRleHQsICJtYW5kYXRvcnkiKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBlLT5kLnBvbGljeS50eXBlID0gUE9MSUNZX01BTkRBVE9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGV4dCBhdHRyaWJ1dGUgb24gPHBvbGljeT4gbXVzdCBoYXZlIHRoZSB2YWx1ZSBcImRlZmF1bHRcIiBvciBcIm1hbmRhdG9yeVwiLCBub3QgXCIlc1wiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHVzZXIgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIERCdXNTdHJpbmcgdXNlcm5hbWU7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZ1c2VybmFtZSwgdXNlcik7CisKKyAgICAgICAgICBpZiAoX2RidXNfcGFyc2VfdW5peF91c2VyX2Zyb21fY29uZmlnICgmdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmUtPmQucG9saWN5LmdpZF91aWRfb3JfYXRfY29uc29sZSkpCisgICAgICAgICAgICBlLT5kLnBvbGljeS50eXBlID0gUE9MSUNZX1VTRVI7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgX2RidXNfd2FybiAoIlVua25vd24gdXNlcm5hbWUgXCIlc1wiIGluIG1lc3NhZ2UgYnVzIGNvbmZpZ3VyYXRpb24gZmlsZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChncm91cCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgREJ1c1N0cmluZyBncm91cF9uYW1lOworICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZ3JvdXBfbmFtZSwgZ3JvdXApOworCisgICAgICAgICAgaWYgKF9kYnVzX3BhcnNlX3VuaXhfZ3JvdXBfZnJvbV9jb25maWcgKCZncm91cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZS0+ZC5wb2xpY3kuZ2lkX3VpZF9vcl9hdF9jb25zb2xlKSkKKyAgICAgICAgICAgIGUtPmQucG9saWN5LnR5cGUgPSBQT0xJQ1lfR1JPVVA7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgX2RidXNfd2FybiAoIlVua25vd24gZ3JvdXAgXCIlc1wiIGluIG1lc3NhZ2UgYnVzIGNvbmZpZ3VyYXRpb24gZmlsZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwKTsgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGF0X2NvbnNvbGUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICBkYnVzX2Jvb2xfdCB0OworICAgICAgICAgICB0ID0gKHN0cmNtcCAoYXRfY29uc29sZSwgInRydWUiKSA9PSAwKTsKKyAgICAgICAgICAgaWYgKHQgfHwgc3RyY21wIChhdF9jb25zb2xlLCAiZmFsc2UiKSA9PSAwKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGUtPmQucG9saWN5LmdpZF91aWRfb3JfYXRfY29uc29sZSA9IHQ7IAorICAgICAgICAgICAgICAgZS0+ZC5wb2xpY3kudHlwZSA9IFBPTElDWV9DT05TT0xFOworICAgICAgICAgICAgIH0gIAorICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIHZhbHVlIFwiJXNcIiBmb3IgYXRfY29uc29sZSBpbiBtZXNzYWdlIGJ1cyBjb25maWd1cmF0aW9uIGZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRfY29uc29sZSk7CisKKyAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImFsbCA8cG9saWN5PiBhdHRyaWJ1dGVzIG51bGwgYW5kIHdlIGRpZG4ndCBzZXQgZXJyb3IiKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX0xJTUlUKQorICAgIHsKKyAgICAgIEVsZW1lbnQgKmU7CisgICAgICBjb25zdCBjaGFyICpuYW1lOworCisgICAgICBpZiAoKGUgPSBwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9MSU1JVCkpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAoIWxvY2F0ZV9hdHRyaWJ1dGVzIChwYXJzZXIsICJsaW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSIsICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICI8bGltaXQ+IGVsZW1lbnQgbXVzdCBoYXZlIGEgXCJuYW1lXCIgYXR0cmlidXRlIik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGUtPmQubGltaXQubmFtZSA9IF9kYnVzX3N0cmR1cCAobmFtZSk7CisgICAgICBpZiAoZS0+ZC5saW1pdC5uYW1lID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX1NFTElOVVgpCisgICAgeworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJzZWxpbnV4IiwgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX1NFTElOVVgpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJFbGVtZW50IDwlcz4gbm90IGFsbG93ZWQgaW5zaWRlIDwlcz4gaW4gY29uZmlndXJhdGlvbiBmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X25hbWUsICJidXNjb25maWciKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYXBwZW5kX3J1bGVfZnJvbV9lbGVtZW50IChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZWxlbWVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICoqYXR0cmlidXRlX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICoqYXR0cmlidXRlX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgIGFsbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmxvZzsKKyAgY29uc3QgY2hhciAqc2VuZF9pbnRlcmZhY2U7CisgIGNvbnN0IGNoYXIgKnNlbmRfbWVtYmVyOworICBjb25zdCBjaGFyICpzZW5kX2Vycm9yOworICBjb25zdCBjaGFyICpzZW5kX2Rlc3RpbmF0aW9uOworICBjb25zdCBjaGFyICpzZW5kX3BhdGg7CisgIGNvbnN0IGNoYXIgKnNlbmRfdHlwZTsKKyAgY29uc3QgY2hhciAqcmVjZWl2ZV9pbnRlcmZhY2U7CisgIGNvbnN0IGNoYXIgKnJlY2VpdmVfbWVtYmVyOworICBjb25zdCBjaGFyICpyZWNlaXZlX2Vycm9yOworICBjb25zdCBjaGFyICpyZWNlaXZlX3NlbmRlcjsKKyAgY29uc3QgY2hhciAqcmVjZWl2ZV9wYXRoOworICBjb25zdCBjaGFyICpyZWNlaXZlX3R5cGU7CisgIGNvbnN0IGNoYXIgKmVhdmVzZHJvcDsKKyAgY29uc3QgY2hhciAqc2VuZF9yZXF1ZXN0ZWRfcmVwbHk7CisgIGNvbnN0IGNoYXIgKnJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5OworICBjb25zdCBjaGFyICpvd247CisgIGNvbnN0IGNoYXIgKm93bl9wcmVmaXg7CisgIGNvbnN0IGNoYXIgKnVzZXI7CisgIGNvbnN0IGNoYXIgKmdyb3VwOworCisgIEJ1c1BvbGljeVJ1bGUgKnJ1bGU7CisgIAorICBpZiAoIWxvY2F0ZV9hdHRyaWJ1dGVzIChwYXJzZXIsIGVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbmRfaW50ZXJmYWNlIiwgJnNlbmRfaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAic2VuZF9tZW1iZXIiLCAmc2VuZF9tZW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5kX2Vycm9yIiwgJnNlbmRfZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5kX2Rlc3RpbmF0aW9uIiwgJnNlbmRfZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5kX3BhdGgiLCAmc2VuZF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAic2VuZF90eXBlIiwgJnNlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInJlY2VpdmVfaW50ZXJmYWNlIiwgJnJlY2VpdmVfaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAicmVjZWl2ZV9tZW1iZXIiLCAmcmVjZWl2ZV9tZW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWNlaXZlX2Vycm9yIiwgJnJlY2VpdmVfZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWNlaXZlX3NlbmRlciIsICZyZWNlaXZlX3NlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInJlY2VpdmVfcGF0aCIsICZyZWNlaXZlX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWNlaXZlX3R5cGUiLCAmcmVjZWl2ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZWF2ZXNkcm9wIiwgJmVhdmVzZHJvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbmRfcmVxdWVzdGVkX3JlcGx5IiwgJnNlbmRfcmVxdWVzdGVkX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAicmVjZWl2ZV9yZXF1ZXN0ZWRfcmVwbHkiLCAmcmVjZWl2ZV9yZXF1ZXN0ZWRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvd24iLCAmb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAib3duX3ByZWZpeCIsICZvd25fcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlciIsICZ1c2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3JvdXAiLCAmZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2ciLCAmbG9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCEoc2VuZF9pbnRlcmZhY2UgfHwgc2VuZF9tZW1iZXIgfHwgc2VuZF9lcnJvciB8fCBzZW5kX2Rlc3RpbmF0aW9uIHx8CisgICAgICAgIHNlbmRfdHlwZSB8fCBzZW5kX3BhdGggfHwKKyAgICAgICAgcmVjZWl2ZV9pbnRlcmZhY2UgfHwgcmVjZWl2ZV9tZW1iZXIgfHwgcmVjZWl2ZV9lcnJvciB8fCByZWNlaXZlX3NlbmRlciB8fAorICAgICAgICByZWNlaXZlX3R5cGUgfHwgcmVjZWl2ZV9wYXRoIHx8IGVhdmVzZHJvcCB8fAorICAgICAgICBzZW5kX3JlcXVlc3RlZF9yZXBseSB8fCByZWNlaXZlX3JlcXVlc3RlZF9yZXBseSB8fAorICAgICAgICBvd24gfHwgb3duX3ByZWZpeCB8fCB1c2VyIHx8IGdyb3VwKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJFbGVtZW50IDwlcz4gbXVzdCBoYXZlIG9uZSBvciBtb3JlIGF0dHJpYnV0ZXMiLAorICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICgoc2VuZF9tZW1iZXIgJiYgKHNlbmRfaW50ZXJmYWNlID09IE5VTEwgJiYgc2VuZF9wYXRoID09IE5VTEwpKSB8fAorICAgICAgKHJlY2VpdmVfbWVtYmVyICYmIChyZWNlaXZlX2ludGVyZmFjZSA9PSBOVUxMICYmIHJlY2VpdmVfcGF0aCA9PSBOVUxMKSkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiT24gZWxlbWVudCA8JXM+LCBpZiB5b3Ugc3BlY2lmeSBhIG1lbWJlciB5b3UgbXVzdCBzcGVjaWZ5IGFuIGludGVyZmFjZSBvciBhIHBhdGguIEtlZXAgaW4gbWluZCB0aGF0IG5vdCBhbGwgbWVzc2FnZXMgaGF2ZSBhbiBpbnRlcmZhY2UgZmllbGQuIiwKKyAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X25hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIC8qIEFsbG93ZWQgY29tYmluYXRpb25zIG9mIGVsZW1lbnRzIGFyZToKKyAgICoKKyAgICogICBiYXNlLCBtdXN0IGJlIGFsbCBzZW5kIG9yIGFsbCByZWNlaXZlOgorICAgKiAgICAgbm90aGluZworICAgKiAgICAgaW50ZXJmYWNlCisgICAqICAgICBpbnRlcmZhY2UgKyBtZW1iZXIKKyAgICogICAgIGVycm9yCisgICAqIAorICAgKiAgIGJhc2Ugc2VuZF8gY2FuIGNvbWJpbmUgd2l0aCBzZW5kX2Rlc3RpbmF0aW9uLCBzZW5kX3BhdGgsIHNlbmRfdHlwZSwgc2VuZF9yZXF1ZXN0ZWRfcmVwbHkKKyAgICogICBiYXNlIHJlY2VpdmVfIHdpdGggcmVjZWl2ZV9zZW5kZXIsIHJlY2VpdmVfcGF0aCwgcmVjZWl2ZV90eXBlLCByZWNlaXZlX3JlcXVlc3RlZF9yZXBseSwgZWF2ZXNkcm9wCisgICAqCisgICAqICAgdXNlciwgZ3JvdXAsIG93biwgb3duX3ByZWZpeCBtdXN0IG9jY3VyIGFsb25lCisgICAqCisgICAqIFByZXR0eSBzdXJlIHRoZSBiZWxvdyBzdHVmZiBpcyBicm9rZW4sIEZJWE1FIHRoaW5rIGFib3V0IGl0IG1vcmUuCisgICAqLworCisgIGlmICgoc2VuZF9pbnRlcmZhY2UgJiYgKHNlbmRfZXJyb3IgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9pbnRlcmZhY2UgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9tZW1iZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9lcnJvciB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX3NlbmRlciB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX3JlcXVlc3RlZF9yZXBseSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICBvd24gfHwgb3duX3ByZWZpeCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwKSkgfHwKKworICAgICAgKHNlbmRfbWVtYmVyICYmIChzZW5kX2Vycm9yIHx8CisgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfaW50ZXJmYWNlIHx8CisgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfbWVtYmVyIHx8CisgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfZXJyb3IgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9zZW5kZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9yZXF1ZXN0ZWRfcmVwbHkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgb3duIHx8IG93bl9wcmVmaXggfHwKKyAgICAgICAgICAgICAgICAgICAgICAgdXNlciB8fAorICAgICAgICAgICAgICAgICAgICAgICBncm91cCkpIHx8CisKKyAgICAgIChzZW5kX2Vycm9yICYmIChyZWNlaXZlX2ludGVyZmFjZSB8fAorICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfbWVtYmVyIHx8CisgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9lcnJvciB8fAorICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfc2VuZGVyIHx8CisgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9yZXF1ZXN0ZWRfcmVwbHkgfHwKKyAgICAgICAgICAgICAgICAgICAgICBvd24gfHwgb3duX3ByZWZpeCB8fAorICAgICAgICAgICAgICAgICAgICAgIHVzZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICBncm91cCkpIHx8CisKKyAgICAgIChzZW5kX2Rlc3RpbmF0aW9uICYmIChyZWNlaXZlX2ludGVyZmFjZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfbWVtYmVyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9lcnJvciB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfc2VuZGVyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9yZXF1ZXN0ZWRfcmVwbHkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd24gfHwgb3duX3ByZWZpeCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCkpIHx8CisKKyAgICAgIChzZW5kX3R5cGUgJiYgKHJlY2VpdmVfaW50ZXJmYWNlIHx8CisgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX21lbWJlciB8fAorICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9lcnJvciB8fAorICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9zZW5kZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5IHx8CisgICAgICAgICAgICAgICAgICAgICBvd24gfHwgb3duX3ByZWZpeCB8fAorICAgICAgICAgICAgICAgICAgICAgdXNlciB8fAorICAgICAgICAgICAgICAgICAgICAgZ3JvdXApKSB8fAorCisgICAgICAoc2VuZF9wYXRoICYmIChyZWNlaXZlX2ludGVyZmFjZSB8fAorICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9tZW1iZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfZXJyb3IgfHwKKyAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfc2VuZGVyIHx8CisgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX3JlcXVlc3RlZF9yZXBseSB8fAorICAgICAgICAgICAgICAgICAgICAgb3duIHx8IG93bl9wcmVmaXggfHwKKyAgICAgICAgICAgICAgICAgICAgIHVzZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgIGdyb3VwKSkgfHwKKworICAgICAgKHNlbmRfcmVxdWVzdGVkX3JlcGx5ICYmIChyZWNlaXZlX2ludGVyZmFjZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX21lbWJlciB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX2Vycm9yIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfc2VuZGVyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93biB8fCBvd25fcHJlZml4IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXApKSB8fAorCisgICAgICAocmVjZWl2ZV9pbnRlcmZhY2UgJiYgKHJlY2VpdmVfZXJyb3IgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duIHx8IG93bl9wcmVmaXggfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlciB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCkpIHx8CisKKyAgICAgIChyZWNlaXZlX21lbWJlciAmJiAocmVjZWl2ZV9lcnJvciB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICBvd24gfHwgb3duX3ByZWZpeCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwKSkgfHwKKworICAgICAgKHJlY2VpdmVfZXJyb3IgJiYgKG93biB8fCBvd25fcHJlZml4IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgdXNlciB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwKSkgfHwKKworICAgICAgKGVhdmVzZHJvcCAmJiAob3duIHx8IG93bl9wcmVmaXggfHwKKyAgICAgICAgICAgICAgICAgICAgIHVzZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgIGdyb3VwKSkgfHwKKworICAgICAgKHJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5ICYmIChvd24gfHwgb3duX3ByZWZpeCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwKSkgfHwKKworICAgICAgKG93biAmJiAob3duX3ByZWZpeCB8fCB1c2VyIHx8IGdyb3VwKSkgfHwKKworICAgICAgKG93bl9wcmVmaXggJiYgKG93biB8fCB1c2VyIHx8IGdyb3VwKSkgfHwKKworICAgICAgKHVzZXIgJiYgZ3JvdXApKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgY29tYmluYXRpb24gb2YgYXR0cmlidXRlcyBvbiBlbGVtZW50IDwlcz4iLAorICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgcnVsZSA9IE5VTEw7CisKKyAgLyogSW4gQnVzUG9saWN5UnVsZSwgTlVMTCByZXByZXNlbnRzIHdpbGRjYXJkLgorICAgKiBJbiB0aGUgY29uZmlnIGZpbGUsICcqJyByZXByZXNlbnRzIGl0LgorICAgKi8KKyNkZWZpbmUgSVNfV0lMRENBUkQoc3RyKSAoKHN0cikgJiYgKChzdHIpWzBdKSA9PSAnKicgJiYgKChzdHIpWzFdKSA9PSAnXDAnKQorCisgIGlmIChzZW5kX2ludGVyZmFjZSB8fCBzZW5kX21lbWJlciB8fCBzZW5kX2Vycm9yIHx8IHNlbmRfZGVzdGluYXRpb24gfHwKKyAgICAgIHNlbmRfcGF0aCB8fCBzZW5kX3R5cGUgfHwgc2VuZF9yZXF1ZXN0ZWRfcmVwbHkpCisgICAgeworICAgICAgaW50IG1lc3NhZ2VfdHlwZTsKKyAgICAgIAorICAgICAgaWYgKElTX1dJTERDQVJEIChzZW5kX2ludGVyZmFjZSkpCisgICAgICAgIHNlbmRfaW50ZXJmYWNlID0gTlVMTDsKKyAgICAgIGlmIChJU19XSUxEQ0FSRCAoc2VuZF9tZW1iZXIpKQorICAgICAgICBzZW5kX21lbWJlciA9IE5VTEw7CisgICAgICBpZiAoSVNfV0lMRENBUkQgKHNlbmRfZXJyb3IpKQorICAgICAgICBzZW5kX2Vycm9yID0gTlVMTDsKKyAgICAgIGlmIChJU19XSUxEQ0FSRCAoc2VuZF9kZXN0aW5hdGlvbikpCisgICAgICAgIHNlbmRfZGVzdGluYXRpb24gPSBOVUxMOworICAgICAgaWYgKElTX1dJTERDQVJEIChzZW5kX3BhdGgpKQorICAgICAgICBzZW5kX3BhdGggPSBOVUxMOworICAgICAgaWYgKElTX1dJTERDQVJEIChzZW5kX3R5cGUpKQorICAgICAgICBzZW5kX3R5cGUgPSBOVUxMOworCisgICAgICBtZXNzYWdlX3R5cGUgPSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEOworICAgICAgaWYgKHNlbmRfdHlwZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgbWVzc2FnZV90eXBlID0gZGJ1c19tZXNzYWdlX3R5cGVfZnJvbV9zdHJpbmcgKHNlbmRfdHlwZSk7CisgICAgICAgICAgaWYgKG1lc3NhZ2VfdHlwZSA9PSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBtZXNzYWdlIHR5cGUgXCIlc1wiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfdHlwZSk7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBpZiAoZWF2ZXNkcm9wICYmCisgICAgICAgICAgIShzdHJjbXAgKGVhdmVzZHJvcCwgInRydWUiKSA9PSAwIHx8CisgICAgICAgICAgICBzdHJjbXAgKGVhdmVzZHJvcCwgImZhbHNlIikgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIHZhbHVlIFwiJXNcIiBmb3IgJXMgYXR0cmlidXRlLCBtdXN0IGJlIHRydWUgb3IgZmFsc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZWF2ZXNkcm9wIiwgZWF2ZXNkcm9wKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgaWYgKHNlbmRfcmVxdWVzdGVkX3JlcGx5ICYmCisgICAgICAgICAgIShzdHJjbXAgKHNlbmRfcmVxdWVzdGVkX3JlcGx5LCAidHJ1ZSIpID09IDAgfHwKKyAgICAgICAgICAgIHN0cmNtcCAoc2VuZF9yZXF1ZXN0ZWRfcmVwbHksICJmYWxzZSIpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCB2YWx1ZSBcIiVzXCIgZm9yICVzIGF0dHJpYnV0ZSwgbXVzdCBiZSB0cnVlIG9yIGZhbHNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbmRfcmVxdWVzdGVkX3JlcGx5Iiwgc2VuZF9yZXF1ZXN0ZWRfcmVwbHkpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBydWxlID0gYnVzX3BvbGljeV9ydWxlX25ldyAoQlVTX1BPTElDWV9SVUxFX1NFTkQsIGFsbG93KTsgCisgICAgICBpZiAocnVsZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vbWVtOworICAgICAgCisgICAgICBpZiAoZWF2ZXNkcm9wKQorICAgICAgICBydWxlLT5kLnNlbmQuZWF2ZXNkcm9wID0gKHN0cmNtcCAoZWF2ZXNkcm9wLCAidHJ1ZSIpID09IDApOworCisgICAgICBpZiAobG9nKQorICAgICAgICBydWxlLT5kLnNlbmQubG9nID0gKHN0cmNtcCAobG9nLCAidHJ1ZSIpID09IDApOworCisgICAgICBpZiAoc2VuZF9yZXF1ZXN0ZWRfcmVwbHkpCisgICAgICAgIHJ1bGUtPmQuc2VuZC5yZXF1ZXN0ZWRfcmVwbHkgPSAoc3RyY21wIChzZW5kX3JlcXVlc3RlZF9yZXBseSwgInRydWUiKSA9PSAwKTsKKworICAgICAgcnVsZS0+ZC5zZW5kLm1lc3NhZ2VfdHlwZSA9IG1lc3NhZ2VfdHlwZTsKKyAgICAgIHJ1bGUtPmQuc2VuZC5wYXRoID0gX2RidXNfc3RyZHVwIChzZW5kX3BhdGgpOworICAgICAgcnVsZS0+ZC5zZW5kLmludGVyZmFjZSA9IF9kYnVzX3N0cmR1cCAoc2VuZF9pbnRlcmZhY2UpOworICAgICAgcnVsZS0+ZC5zZW5kLm1lbWJlciA9IF9kYnVzX3N0cmR1cCAoc2VuZF9tZW1iZXIpOworICAgICAgcnVsZS0+ZC5zZW5kLmVycm9yID0gX2RidXNfc3RyZHVwIChzZW5kX2Vycm9yKTsKKyAgICAgIHJ1bGUtPmQuc2VuZC5kZXN0aW5hdGlvbiA9IF9kYnVzX3N0cmR1cCAoc2VuZF9kZXN0aW5hdGlvbik7CisgICAgICBpZiAoc2VuZF9wYXRoICYmIHJ1bGUtPmQuc2VuZC5wYXRoID09IE5VTEwpCisgICAgICAgIGdvdG8gbm9tZW07CisgICAgICBpZiAoc2VuZF9pbnRlcmZhY2UgJiYgcnVsZS0+ZC5zZW5kLmludGVyZmFjZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vbWVtOworICAgICAgaWYgKHNlbmRfbWVtYmVyICYmIHJ1bGUtPmQuc2VuZC5tZW1iZXIgPT0gTlVMTCkKKyAgICAgICAgZ290byBub21lbTsKKyAgICAgIGlmIChzZW5kX2Vycm9yICYmIHJ1bGUtPmQuc2VuZC5lcnJvciA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vbWVtOworICAgICAgaWYgKHNlbmRfZGVzdGluYXRpb24gJiYgcnVsZS0+ZC5zZW5kLmRlc3RpbmF0aW9uID09IE5VTEwpCisgICAgICAgIGdvdG8gbm9tZW07CisgICAgfQorICBlbHNlIGlmIChyZWNlaXZlX2ludGVyZmFjZSB8fCByZWNlaXZlX21lbWJlciB8fCByZWNlaXZlX2Vycm9yIHx8IHJlY2VpdmVfc2VuZGVyIHx8CisgICAgICAgICAgIHJlY2VpdmVfcGF0aCB8fCByZWNlaXZlX3R5cGUgfHwgZWF2ZXNkcm9wIHx8IHJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5KQorICAgIHsKKyAgICAgIGludCBtZXNzYWdlX3R5cGU7CisgICAgICAKKyAgICAgIGlmIChJU19XSUxEQ0FSRCAocmVjZWl2ZV9pbnRlcmZhY2UpKQorICAgICAgICByZWNlaXZlX2ludGVyZmFjZSA9IE5VTEw7CisgICAgICBpZiAoSVNfV0lMRENBUkQgKHJlY2VpdmVfbWVtYmVyKSkKKyAgICAgICAgcmVjZWl2ZV9tZW1iZXIgPSBOVUxMOworICAgICAgaWYgKElTX1dJTERDQVJEIChyZWNlaXZlX2Vycm9yKSkKKyAgICAgICAgcmVjZWl2ZV9lcnJvciA9IE5VTEw7CisgICAgICBpZiAoSVNfV0lMRENBUkQgKHJlY2VpdmVfc2VuZGVyKSkKKyAgICAgICAgcmVjZWl2ZV9zZW5kZXIgPSBOVUxMOworICAgICAgaWYgKElTX1dJTERDQVJEIChyZWNlaXZlX3BhdGgpKQorICAgICAgICByZWNlaXZlX3BhdGggPSBOVUxMOworICAgICAgaWYgKElTX1dJTERDQVJEIChyZWNlaXZlX3R5cGUpKQorICAgICAgICByZWNlaXZlX3R5cGUgPSBOVUxMOworCisgICAgICBtZXNzYWdlX3R5cGUgPSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEOworICAgICAgaWYgKHJlY2VpdmVfdHlwZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgbWVzc2FnZV90eXBlID0gZGJ1c19tZXNzYWdlX3R5cGVfZnJvbV9zdHJpbmcgKHJlY2VpdmVfdHlwZSk7CisgICAgICAgICAgaWYgKG1lc3NhZ2VfdHlwZSA9PSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBtZXNzYWdlIHR5cGUgXCIlc1wiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfdHlwZSk7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgIGlmIChlYXZlc2Ryb3AgJiYKKyAgICAgICAgICAhKHN0cmNtcCAoZWF2ZXNkcm9wLCAidHJ1ZSIpID09IDAgfHwKKyAgICAgICAgICAgIHN0cmNtcCAoZWF2ZXNkcm9wLCAiZmFsc2UiKSA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgdmFsdWUgXCIlc1wiIGZvciAlcyBhdHRyaWJ1dGUsIG11c3QgYmUgdHJ1ZSBvciBmYWxzZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJlYXZlc2Ryb3AiLCBlYXZlc2Ryb3ApOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAocmVjZWl2ZV9yZXF1ZXN0ZWRfcmVwbHkgJiYKKyAgICAgICAgICAhKHN0cmNtcCAocmVjZWl2ZV9yZXF1ZXN0ZWRfcmVwbHksICJ0cnVlIikgPT0gMCB8fAorICAgICAgICAgICAgc3RyY21wIChyZWNlaXZlX3JlcXVlc3RlZF9yZXBseSwgImZhbHNlIikgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIHZhbHVlIFwiJXNcIiBmb3IgJXMgYXR0cmlidXRlLCBtdXN0IGJlIHRydWUgb3IgZmFsc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAicmVjZWl2ZV9yZXF1ZXN0ZWRfcmVwbHkiLCByZWNlaXZlX3JlcXVlc3RlZF9yZXBseSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAKKyAgICAgIHJ1bGUgPSBidXNfcG9saWN5X3J1bGVfbmV3IChCVVNfUE9MSUNZX1JVTEVfUkVDRUlWRSwgYWxsb3cpOyAKKyAgICAgIGlmIChydWxlID09IE5VTEwpCisgICAgICAgIGdvdG8gbm9tZW07CisKKyAgICAgIGlmIChlYXZlc2Ryb3ApCisgICAgICAgIHJ1bGUtPmQucmVjZWl2ZS5lYXZlc2Ryb3AgPSAoc3RyY21wIChlYXZlc2Ryb3AsICJ0cnVlIikgPT0gMCk7CisKKyAgICAgIGlmIChyZWNlaXZlX3JlcXVlc3RlZF9yZXBseSkKKyAgICAgICAgcnVsZS0+ZC5yZWNlaXZlLnJlcXVlc3RlZF9yZXBseSA9IChzdHJjbXAgKHJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5LCAidHJ1ZSIpID09IDApOworICAgICAgCisgICAgICBydWxlLT5kLnJlY2VpdmUubWVzc2FnZV90eXBlID0gbWVzc2FnZV90eXBlOworICAgICAgcnVsZS0+ZC5yZWNlaXZlLnBhdGggPSBfZGJ1c19zdHJkdXAgKHJlY2VpdmVfcGF0aCk7CisgICAgICBydWxlLT5kLnJlY2VpdmUuaW50ZXJmYWNlID0gX2RidXNfc3RyZHVwIChyZWNlaXZlX2ludGVyZmFjZSk7CisgICAgICBydWxlLT5kLnJlY2VpdmUubWVtYmVyID0gX2RidXNfc3RyZHVwIChyZWNlaXZlX21lbWJlcik7CisgICAgICBydWxlLT5kLnJlY2VpdmUuZXJyb3IgPSBfZGJ1c19zdHJkdXAgKHJlY2VpdmVfZXJyb3IpOworICAgICAgcnVsZS0+ZC5yZWNlaXZlLm9yaWdpbiA9IF9kYnVzX3N0cmR1cCAocmVjZWl2ZV9zZW5kZXIpOworCisgICAgICBpZiAocmVjZWl2ZV9wYXRoICYmIHJ1bGUtPmQucmVjZWl2ZS5wYXRoID09IE5VTEwpCisgICAgICAgIGdvdG8gbm9tZW07CisgICAgICBpZiAocmVjZWl2ZV9pbnRlcmZhY2UgJiYgcnVsZS0+ZC5yZWNlaXZlLmludGVyZmFjZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vbWVtOworICAgICAgaWYgKHJlY2VpdmVfbWVtYmVyICYmIHJ1bGUtPmQucmVjZWl2ZS5tZW1iZXIgPT0gTlVMTCkKKyAgICAgICAgZ290byBub21lbTsKKyAgICAgIGlmIChyZWNlaXZlX2Vycm9yICYmIHJ1bGUtPmQucmVjZWl2ZS5lcnJvciA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vbWVtOworICAgICAgaWYgKHJlY2VpdmVfc2VuZGVyICYmIHJ1bGUtPmQucmVjZWl2ZS5vcmlnaW4gPT0gTlVMTCkKKyAgICAgICAgZ290byBub21lbTsKKyAgICB9CisgIGVsc2UgaWYgKG93biB8fCBvd25fcHJlZml4KQorICAgIHsKKyAgICAgIHJ1bGUgPSBidXNfcG9saWN5X3J1bGVfbmV3IChCVVNfUE9MSUNZX1JVTEVfT1dOLCBhbGxvdyk7IAorICAgICAgaWYgKHJ1bGUgPT0gTlVMTCkKKyAgICAgICAgZ290byBub21lbTsKKworICAgICAgaWYgKG93bikKKyAgICAgICAgeworICAgICAgICAgIGlmIChJU19XSUxEQ0FSRCAob3duKSkKKyAgICAgICAgICAgIG93biA9IE5VTEw7CisgICAgICAKKyAgICAgICAgICBydWxlLT5kLm93bi5wcmVmaXggPSAwOworICAgICAgICAgIHJ1bGUtPmQub3duLnNlcnZpY2VfbmFtZSA9IF9kYnVzX3N0cmR1cCAob3duKTsKKyAgICAgICAgICBpZiAob3duICYmIHJ1bGUtPmQub3duLnNlcnZpY2VfbmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgcnVsZS0+ZC5vd24ucHJlZml4ID0gMTsKKyAgICAgICAgICBydWxlLT5kLm93bi5zZXJ2aWNlX25hbWUgPSBfZGJ1c19zdHJkdXAgKG93bl9wcmVmaXgpOworICAgICAgICAgIGlmIChydWxlLT5kLm93bi5zZXJ2aWNlX25hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UgaWYgKHVzZXIpCisgICAgeyAgICAgIAorICAgICAgaWYgKElTX1dJTERDQVJEICh1c2VyKSkKKyAgICAgICAgeworICAgICAgICAgIHJ1bGUgPSBidXNfcG9saWN5X3J1bGVfbmV3IChCVVNfUE9MSUNZX1JVTEVfVVNFUiwgYWxsb3cpOyAKKyAgICAgICAgICBpZiAocnVsZSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBub21lbTsKKworICAgICAgICAgIHJ1bGUtPmQudXNlci51aWQgPSBEQlVTX1VJRF9VTlNFVDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgREJ1c1N0cmluZyB1c2VybmFtZTsKKyAgICAgICAgICBkYnVzX3VpZF90IHVpZDsKKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnVzZXJuYW1lLCB1c2VyKTsKKyAgICAgIAorICAgICAgICAgIGlmIChfZGJ1c19wYXJzZV91bml4X3VzZXJfZnJvbV9jb25maWcgKCZ1c2VybmFtZSwgJnVpZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJ1bGUgPSBidXNfcG9saWN5X3J1bGVfbmV3IChCVVNfUE9MSUNZX1JVTEVfVVNFUiwgYWxsb3cpOyAKKyAgICAgICAgICAgICAgaWYgKHJ1bGUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIG5vbWVtOworCisgICAgICAgICAgICAgIHJ1bGUtPmQudXNlci51aWQgPSB1aWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiVW5rbm93biB1c2VybmFtZSBcIiVzXCIgb24gZWxlbWVudCA8JXM+XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLCBlbGVtZW50X25hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICBlbHNlIGlmIChncm91cCkKKyAgICB7CisgICAgICBpZiAoSVNfV0lMRENBUkQgKGdyb3VwKSkKKyAgICAgICAgeworICAgICAgICAgIHJ1bGUgPSBidXNfcG9saWN5X3J1bGVfbmV3IChCVVNfUE9MSUNZX1JVTEVfR1JPVVAsIGFsbG93KTsgCisgICAgICAgICAgaWYgKHJ1bGUgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisKKyAgICAgICAgICBydWxlLT5kLmdyb3VwLmdpZCA9IERCVVNfR0lEX1VOU0VUOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzU3RyaW5nIGdyb3VwbmFtZTsKKyAgICAgICAgICBkYnVzX2dpZF90IGdpZDsKKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmdyb3VwbmFtZSwgZ3JvdXApOworICAgICAgICAgIAorICAgICAgICAgIGlmIChfZGJ1c19wYXJzZV91bml4X2dyb3VwX2Zyb21fY29uZmlnICgmZ3JvdXBuYW1lLCAmZ2lkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcnVsZSA9IGJ1c19wb2xpY3lfcnVsZV9uZXcgKEJVU19QT0xJQ1lfUlVMRV9HUk9VUCwgYWxsb3cpOyAKKyAgICAgICAgICAgICAgaWYgKHJ1bGUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIG5vbWVtOworCisgICAgICAgICAgICAgIHJ1bGUtPmQuZ3JvdXAuZ2lkID0gZ2lkOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIlVua25vd24gZ3JvdXAgXCIlc1wiIG9uIGVsZW1lbnQgPCVzPlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAsIGVsZW1lbnRfbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJEaWQgbm90IGhhbmRsZSBzb21lIGNvbWJpbmF0aW9uIG9mIGF0dHJpYnV0ZXMgb24gPGFsbG93PiBvciA8ZGVueT4iKTsKKworICBpZiAocnVsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIEVsZW1lbnQgKnBlOworICAgICAgCisgICAgICBwZSA9IHBlZWtfZWxlbWVudCAocGFyc2VyKTsgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAocGUgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHBlLT50eXBlID09IEVMRU1FTlRfUE9MSUNZKTsKKworICAgICAgc3dpdGNoIChwZS0+ZC5wb2xpY3kudHlwZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIFBPTElDWV9JR05PUkVEOgorICAgICAgICAgIC8qIGRyb3AgdGhlIHJ1bGUgb24gdGhlIGZsb29yICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgCisgICAgICAgIGNhc2UgUE9MSUNZX0RFRkFVTFQ6CisgICAgICAgICAgaWYgKCFidXNfcG9saWN5X2FwcGVuZF9kZWZhdWx0X3J1bGUgKHBhcnNlci0+cG9saWN5LCBydWxlKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUE9MSUNZX01BTkRBVE9SWToKKyAgICAgICAgICBpZiAoIWJ1c19wb2xpY3lfYXBwZW5kX21hbmRhdG9yeV9ydWxlIChwYXJzZXItPnBvbGljeSwgcnVsZSkpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBPTElDWV9VU0VSOgorICAgICAgICAgIGlmICghQlVTX1BPTElDWV9SVUxFX0lTX1BFUl9DTElFTlQgKHJ1bGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwlcz4gcnVsZSBjYW5ub3QgYmUgcGVyLXVzZXIgYmVjYXVzZSBpdCBoYXMgYnVzLWdsb2JhbCBzZW1hbnRpY3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9uYW1lKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCFidXNfcG9saWN5X2FwcGVuZF91c2VyX3J1bGUgKHBhcnNlci0+cG9saWN5LCBwZS0+ZC5wb2xpY3kuZ2lkX3VpZF9vcl9hdF9jb25zb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUE9MSUNZX0dST1VQOgorICAgICAgICAgIGlmICghQlVTX1BPTElDWV9SVUxFX0lTX1BFUl9DTElFTlQgKHJ1bGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwlcz4gcnVsZSBjYW5ub3QgYmUgcGVyLWdyb3VwIGJlY2F1c2UgaXQgaGFzIGJ1cy1nbG9iYWwgc2VtYW50aWNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfbmFtZSk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGlmICghYnVzX3BvbGljeV9hcHBlbmRfZ3JvdXBfcnVsZSAocGFyc2VyLT5wb2xpY3ksIHBlLT5kLnBvbGljeS5naWRfdWlkX29yX2F0X2NvbnNvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIAorCisgICAgICAgIGNhc2UgUE9MSUNZX0NPTlNPTEU6CisgICAgICAgICAgaWYgKCFidXNfcG9saWN5X2FwcGVuZF9jb25zb2xlX3J1bGUgKHBhcnNlci0+cG9saWN5LCBwZS0+ZC5wb2xpY3kuZ2lkX3VpZF9vcl9hdF9jb25zb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAKKyAgICAgIGJ1c19wb2xpY3lfcnVsZV91bnJlZiAocnVsZSk7CisgICAgICBydWxlID0gTlVMTDsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKKworIG5vbWVtOgorICBCVVNfU0VUX09PTSAoZXJyb3IpOworIGZhaWxlZDoKKyAgaWYgKHJ1bGUpCisgICAgYnVzX3BvbGljeV9ydWxlX3VucmVmIChydWxlKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3N0YXJ0X3BvbGljeV9jaGlsZCAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqKmF0dHJpYnV0ZV9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqKmF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgaWYgKHN0cmNtcCAoZWxlbWVudF9uYW1lLCAiYWxsb3ciKSA9PSAwKQorICAgIHsKKyAgICAgIGlmICghYXBwZW5kX3J1bGVfZnJvbV9lbGVtZW50IChwYXJzZXIsIGVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfbmFtZXMsIGF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9BTExPVykgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChlbGVtZW50X25hbWUsICJkZW55IikgPT0gMCkKKyAgICB7CisgICAgICBpZiAoIWFwcGVuZF9ydWxlX2Zyb21fZWxlbWVudCAocGFyc2VyLCBlbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX0RFTlkpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJFbGVtZW50IDwlcz4gbm90IGFsbG93ZWQgaW5zaWRlIDwlcz4gaW4gY29uZmlndXJhdGlvbiBmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X25hbWUsICJwb2xpY3kiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc3RhcnRfc2VsaW51eF9jaGlsZCAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICplbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICoqYXR0cmlidXRlX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqKmF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIGNoYXIgKm93bl9jb3B5OworICBjaGFyICpjb250ZXh0X2NvcHk7CisKKyAgb3duX2NvcHkgPSBOVUxMOworICBjb250ZXh0X2NvcHkgPSBOVUxMOworCisgIGlmIChzdHJjbXAgKGVsZW1lbnRfbmFtZSwgImFzc29jaWF0ZSIpID09IDApCisgICAgeworICAgICAgY29uc3QgY2hhciAqb3duOworICAgICAgY29uc3QgY2hhciAqY29udGV4dDsKKyAgICAgIAorICAgICAgaWYgKCFsb2NhdGVfYXR0cmlidXRlcyAocGFyc2VyLCAiYXNzb2NpYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvd24iLCAmb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRleHQiLCAmY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9BU1NPQ0lBVEUpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAob3duID09IE5VTEwgfHwgY29udGV4dCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkVsZW1lbnQgPGFzc29jaWF0ZT4gbXVzdCBoYXZlIGF0dHJpYnV0ZXMgb3duPVwiPHNlcnZpY2VuYW1lPlwiIGFuZCBjb250ZXh0PVwiPHNlbGludXggY29udGV4dD5cIiIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBvd25fY29weSA9IF9kYnVzX3N0cmR1cCAob3duKTsKKyAgICAgIGlmIChvd25fY29weSA9PSBOVUxMKQorICAgICAgICBnb3RvIG9vbTsKKyAgICAgIGNvbnRleHRfY29weSA9IF9kYnVzX3N0cmR1cCAoY29udGV4dCk7CisgICAgICBpZiAoY29udGV4dF9jb3B5ID09IE5VTEwpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZyAocGFyc2VyLT5zZXJ2aWNlX2NvbnRleHRfdGFibGUsCisJCQkJCSAgIG93bl9jb3B5LCBjb250ZXh0X2NvcHkpKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiRWxlbWVudCA8JXM+IG5vdCBhbGxvd2VkIGluc2lkZSA8JXM+IGluIGNvbmZpZ3VyYXRpb24gZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9uYW1lLCAic2VsaW51eCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworIG9vbToKKyAgaWYgKG93bl9jb3B5KQorICAgIGRidXNfZnJlZSAob3duX2NvcHkpOworCisgIGlmIChjb250ZXh0X2NvcHkpICAKKyAgICBkYnVzX2ZyZWUgKGNvbnRleHRfY29weSk7CisKKyAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NvbmZpZ19wYXJzZXJfc3RhcnRfZWxlbWVudCAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICplbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICoqYXR0cmlidXRlX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqKmF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIEVsZW1lbnRUeXBlIHQ7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgLyogcHJpbnRmICgiU1RBUlQ6ICVzXG4iLCBlbGVtZW50X25hbWUpOyAqLworICAKKyAgdCA9IHRvcF9lbGVtZW50X3R5cGUgKHBhcnNlcik7CisKKyAgaWYgKHQgPT0gRUxFTUVOVF9OT05FKQorICAgIHsKKyAgICAgIGlmIChzdHJjbXAgKGVsZW1lbnRfbmFtZSwgImJ1c2NvbmZpZyIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIWNoZWNrX25vX2F0dHJpYnV0ZXMgKHBhcnNlciwgImJ1c2NvbmZpZyIsIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywgZXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIAorICAgICAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9CVVNDT05GSUcpID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBlbGVtZW50IDwlcz4gYXQgcm9vdCBvZiBjb25maWd1cmF0aW9uIGZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X25hbWUpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZSBpZiAodCA9PSBFTEVNRU5UX0JVU0NPTkZJRykKKyAgICB7CisgICAgICByZXR1cm4gc3RhcnRfYnVzY29uZmlnX2NoaWxkIChwYXJzZXIsIGVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKyAgICB9CisgIGVsc2UgaWYgKHQgPT0gRUxFTUVOVF9QT0xJQ1kpCisgICAgeworICAgICAgcmV0dXJuIHN0YXJ0X3BvbGljeV9jaGlsZCAocGFyc2VyLCBlbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfbmFtZXMsIGF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgICAgfQorICBlbHNlIGlmICh0ID09IEVMRU1FTlRfU0VMSU5VWCkKKyAgICB7CisgICAgICByZXR1cm4gc3RhcnRfc2VsaW51eF9jaGlsZCAocGFyc2VyLCBlbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJFbGVtZW50IDwlcz4gaXMgbm90IGFsbG93ZWQgaW4gdGhpcyBjb250ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X25hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0gIAorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NldF9saW1pdCAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIsCisgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqbmFtZSwKKyAgICAgICAgICAgbG9uZyAgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvcikKK3sKKyAgZGJ1c19ib29sX3QgbXVzdF9iZV9wb3NpdGl2ZTsKKyAgZGJ1c19ib29sX3QgbXVzdF9iZV9pbnQ7CisKKyAgbXVzdF9iZV9pbnQgPSBGQUxTRTsKKyAgbXVzdF9iZV9wb3NpdGl2ZSA9IEZBTFNFOworICAKKyAgaWYgKHN0cmNtcCAobmFtZSwgIm1heF9pbmNvbWluZ19ieXRlcyIpID09IDApCisgICAgeworICAgICAgbXVzdF9iZV9wb3NpdGl2ZSA9IFRSVUU7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfaW5jb21pbmdfYnl0ZXMgPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1heF9pbmNvbWluZ191bml4X2ZkcyIpID09IDApCisgICAgeworICAgICAgbXVzdF9iZV9wb3NpdGl2ZSA9IFRSVUU7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfaW5jb21pbmdfdW5peF9mZHMgPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1heF9vdXRnb2luZ19ieXRlcyIpID09IDApCisgICAgeworICAgICAgbXVzdF9iZV9wb3NpdGl2ZSA9IFRSVUU7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfb3V0Z29pbmdfYnl0ZXMgPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1heF9vdXRnb2luZ191bml4X2ZkcyIpID09IDApCisgICAgeworICAgICAgbXVzdF9iZV9wb3NpdGl2ZSA9IFRSVUU7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfb3V0Z29pbmdfdW5peF9mZHMgPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1heF9tZXNzYWdlX3NpemUiKSA9PSAwKQorICAgIHsKKyAgICAgIG11c3RfYmVfcG9zaXRpdmUgPSBUUlVFOworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X21lc3NhZ2Vfc2l6ZSA9IHZhbHVlOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibWF4X21lc3NhZ2VfdW5peF9mZHMiKSA9PSAwKQorICAgIHsKKyAgICAgIG11c3RfYmVfcG9zaXRpdmUgPSBUUlVFOworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X21lc3NhZ2VfdW5peF9mZHMgPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInNlcnZpY2Vfc3RhcnRfdGltZW91dCIpID09IDApCisgICAgeworICAgICAgbXVzdF9iZV9wb3NpdGl2ZSA9IFRSVUU7CisgICAgICBtdXN0X2JlX2ludCA9IFRSVUU7CisgICAgICBwYXJzZXItPmxpbWl0cy5hY3RpdmF0aW9uX3RpbWVvdXQgPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImF1dGhfdGltZW91dCIpID09IDApCisgICAgeworICAgICAgbXVzdF9iZV9wb3NpdGl2ZSA9IFRSVUU7CisgICAgICBtdXN0X2JlX2ludCA9IFRSVUU7CisgICAgICBwYXJzZXItPmxpbWl0cy5hdXRoX3RpbWVvdXQgPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInJlcGx5X3RpbWVvdXQiKSA9PSAwKQorICAgIHsKKyAgICAgIG11c3RfYmVfcG9zaXRpdmUgPSBUUlVFOworICAgICAgbXVzdF9iZV9pbnQgPSBUUlVFOworICAgICAgcGFyc2VyLT5saW1pdHMucmVwbHlfdGltZW91dCA9IHZhbHVlOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyIpID09IDApCisgICAgeworICAgICAgbXVzdF9iZV9wb3NpdGl2ZSA9IFRSVUU7CisgICAgICBtdXN0X2JlX2ludCA9IFRSVUU7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zID0gdmFsdWU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyIpID09IDApCisgICAgeworICAgICAgbXVzdF9iZV9wb3NpdGl2ZSA9IFRSVUU7CisgICAgICBtdXN0X2JlX2ludCA9IFRSVUU7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyA9IHZhbHVlOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyIikgPT0gMCkKKyAgICB7CisgICAgICBtdXN0X2JlX3Bvc2l0aXZlID0gVFJVRTsKKyAgICAgIG11c3RfYmVfaW50ID0gVFJVRTsKKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9jb25uZWN0aW9uc19wZXJfdXNlciA9IHZhbHVlOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibWF4X3BlbmRpbmdfc2VydmljZV9zdGFydHMiKSA9PSAwKQorICAgIHsKKyAgICAgIG11c3RfYmVfcG9zaXRpdmUgPSBUUlVFOworICAgICAgbXVzdF9iZV9pbnQgPSBUUlVFOworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X3BlbmRpbmdfYWN0aXZhdGlvbnMgPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1heF9uYW1lc19wZXJfY29ubmVjdGlvbiIpID09IDApCisgICAgeworICAgICAgbXVzdF9iZV9wb3NpdGl2ZSA9IFRSVUU7CisgICAgICBtdXN0X2JlX2ludCA9IFRSVUU7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfc2VydmljZXNfcGVyX2Nvbm5lY3Rpb24gPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbiIpID09IDApCisgICAgeworICAgICAgbXVzdF9iZV9wb3NpdGl2ZSA9IFRSVUU7CisgICAgICBtdXN0X2JlX2ludCA9IFRSVUU7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfbWF0Y2hfcnVsZXNfcGVyX2Nvbm5lY3Rpb24gPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1heF9yZXBsaWVzX3Blcl9jb25uZWN0aW9uIikgPT0gMCkKKyAgICB7CisgICAgICBtdXN0X2JlX3Bvc2l0aXZlID0gVFJVRTsKKyAgICAgIG11c3RfYmVfaW50ID0gVFJVRTsKKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9yZXBsaWVzX3Blcl9jb25uZWN0aW9uID0gdmFsdWU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiVGhlcmUgaXMgbm8gbGltaXQgY2FsbGVkIFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAobXVzdF9iZV9wb3NpdGl2ZSAmJiB2YWx1ZSA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiPGxpbWl0IG5hbWU9XCIlc1wiPiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyXG4iLAorICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAobXVzdF9iZV9pbnQgJiYKKyAgICAgICh2YWx1ZSA8IF9EQlVTX0lOVF9NSU4gfHwgdmFsdWUgPiBfREJVU19JTlRfTUFYKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICI8bGltaXQgbmFtZT1cIiVzXCI+IHZhbHVlIGlzIHRvbyBsYXJnZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7ICAKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25maWdfcGFyc2VyX2VuZF9lbGVtZW50IChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICplbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBFbGVtZW50VHlwZSB0OworICBjb25zdCBjaGFyICpuOworICBFbGVtZW50ICplOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIC8qIHByaW50ZiAoIkVORDogJXNcbiIsIGVsZW1lbnRfbmFtZSk7ICovCisgIAorICB0ID0gdG9wX2VsZW1lbnRfdHlwZSAocGFyc2VyKTsKKworICBpZiAodCA9PSBFTEVNRU5UX05PTkUpCisgICAgeworICAgICAgLyogc2hvdWxkIHByb2JhYmx5IGJlIGFuIGFzc2VydGlvbiBmYWlsdXJlIGJ1dAorICAgICAgICogYmVpbmcgcGFyYW5vaWQgYWJvdXQgWE1MIHBhcnNlcnMKKyAgICAgICAqLworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiWE1MIHBhcnNlciBlbmRlZCBlbGVtZW50IHdpdGggbm8gZWxlbWVudCBvbiB0aGUgc3RhY2siKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgbiA9IGJ1c19jb25maWdfcGFyc2VyX2VsZW1lbnRfdHlwZV90b19uYW1lICh0KTsKKyAgX2RidXNfYXNzZXJ0IChuICE9IE5VTEwpOworICBpZiAoc3RyY21wIChuLCBlbGVtZW50X25hbWUpICE9IDApCisgICAgeworICAgICAgLyogc2hvdWxkIHByb2JhYmx5IGJlIGFuIGFzc2VydGlvbiBmYWlsdXJlIGJ1dAorICAgICAgICogYmVpbmcgcGFyYW5vaWQgYWJvdXQgWE1MIHBhcnNlcnMKKyAgICAgICAqLworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiWE1MIGVsZW1lbnQgPCVzPiBlbmRlZCBidXQgdG9wbW9zdCBlbGVtZW50IG9uIHRoZSBzdGFjayB3YXMgPCVzPiIsCisgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9uYW1lLCBuKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgZSA9IHBlZWtfZWxlbWVudCAocGFyc2VyKTsKKyAgX2RidXNfYXNzZXJ0IChlICE9IE5VTEwpOworCisgIHN3aXRjaCAoZS0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBFTEVNRU5UX05PTkU6CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJlbGVtZW50IGluIHN0YWNrIGhhcyBubyB0eXBlIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRUxFTUVOVF9JTkNMVURFOgorICAgIGNhc2UgRUxFTUVOVF9VU0VSOgorICAgIGNhc2UgRUxFTUVOVF9DT05GSUdUWVBFOgorICAgIGNhc2UgRUxFTUVOVF9MSVNURU46CisgICAgY2FzZSBFTEVNRU5UX1BJREZJTEU6CisgICAgY2FzZSBFTEVNRU5UX0FVVEg6CisgICAgY2FzZSBFTEVNRU5UX1NFUlZJQ0VESVI6CisgICAgY2FzZSBFTEVNRU5UX1NFUlZJQ0VIRUxQRVI6CisgICAgY2FzZSBFTEVNRU5UX0lOQ0xVREVESVI6CisgICAgY2FzZSBFTEVNRU5UX0xJTUlUOgorICAgICAgaWYgKCFlLT5oYWRfY29udGVudCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJYTUwgZWxlbWVudCA8JXM+IHdhcyBleHBlY3RlZCB0byBoYXZlIGNvbnRlbnQgaW5zaWRlIGl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfZWxlbWVudF90eXBlX3RvX25hbWUgKGUtPnR5cGUpKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgaWYgKGUtPnR5cGUgPT0gRUxFTUVOVF9MSU1JVCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghc2V0X2xpbWl0IChwYXJzZXIsIGUtPmQubGltaXQubmFtZSwgZS0+ZC5saW1pdC52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRUxFTUVOVF9CVVNDT05GSUc6CisgICAgY2FzZSBFTEVNRU5UX1BPTElDWToKKyAgICBjYXNlIEVMRU1FTlRfQUxMT1c6CisgICAgY2FzZSBFTEVNRU5UX0RFTlk6CisgICAgY2FzZSBFTEVNRU5UX0ZPUks6CisgICAgY2FzZSBFTEVNRU5UX1NZU0xPRzoKKyAgICBjYXNlIEVMRU1FTlRfS0VFUF9VTUFTSzoKKyAgICBjYXNlIEVMRU1FTlRfU0VMSU5VWDoKKyAgICBjYXNlIEVMRU1FTlRfQVNTT0NJQVRFOgorICAgIGNhc2UgRUxFTUVOVF9TVEFOREFSRF9TRVNTSU9OX1NFUlZJQ0VESVJTOgorICAgIGNhc2UgRUxFTUVOVF9TVEFOREFSRF9TWVNURU1fU0VSVklDRURJUlM6CisgICAgY2FzZSBFTEVNRU5UX0FMTE9XX0FOT05ZTU9VUzoKKyAgICAgIGJyZWFrOworICAgIH0KKworICBwb3BfZWxlbWVudCAocGFyc2VyKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithbGxfd2hpdGVzcGFjZSAoY29uc3QgREJ1c1N0cmluZyAqc3RyKQoreworICBpbnQgaTsKKworICBfZGJ1c19zdHJpbmdfc2tpcF93aGl0ZSAoc3RyLCAwLCAmaSk7CisKKyAgcmV0dXJuIGkgPT0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbWFrZV9mdWxsX3BhdGggKGNvbnN0IERCdXNTdHJpbmcgKmJhc2VkaXIsCisgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZnVsbF9wYXRoKQoreworICBpZiAoX2RidXNfcGF0aF9pc19hYnNvbHV0ZSAoZmlsZW5hbWUpKQorICAgIHsKKyAgICAgIHJldHVybiBfZGJ1c19zdHJpbmdfY29weSAoZmlsZW5hbWUsIDAsIGZ1bGxfcGF0aCwgMCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoYmFzZWRpciwgMCwgZnVsbF9wYXRoLCAwKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKGZ1bGxfcGF0aCwgZmlsZW5hbWUpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitpbmNsdWRlX2ZpbGUgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgIGlnbm9yZV9taXNzaW5nLAorICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIC8qIEZJWE1FIGdvb2QgdGVzdCBjYXNlIGZvciB0aGlzIHdvdWxkIGxvYWQgZWFjaCBjb25maWcgZmlsZSBpbiB0aGUKKyAgICogdGVzdCBzdWl0ZSBib3RoIGFsb25lLCBhbmQgYXMgYW4gaW5jbHVkZSwgYW5kIGNoZWNrCisgICAqIHRoYXQgdGhlIHJlc3VsdCBpcyB0aGUgc2FtZQorICAgKi8KKyAgQnVzQ29uZmlnUGFyc2VyICppbmNsdWRlZDsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWVfc3RyOworICBEQnVzRXJyb3IgdG1wX2Vycm9yOworICAgICAgICAKKyAgZGJ1c19lcnJvcl9pbml0ICgmdG1wX2Vycm9yKTsKKworICBmaWxlbmFtZV9zdHIgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKworICAvKiBDaGVjayB0byBtYWtlIHN1cmUgdGhpcyBmaWxlIGhhc24ndCBhbHJlYWR5IGJlZW4gaW5jbHVkZWQuICovCisgIGlmIChzZWVuX2luY2x1ZGUgKHBhcnNlciwgZmlsZW5hbWUpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisJCSAgICAgICJDaXJjdWxhciBpbmNsdXNpb24gb2YgZmlsZSAnJXMnIiwKKwkJICAgICAgZmlsZW5hbWVfc3RyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoISBfZGJ1c19saXN0X2FwcGVuZCAoJnBhcnNlci0+aW5jbHVkZWRfZmlsZXMsICh2b2lkICopIGZpbGVuYW1lX3N0cikpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogU2luY2UgcGFyc2VyIGlzIHBhc3NlZCBpbiBhcyB0aGUgcGFyZW50LCBpbmNsdWRlZAorICAgICBpbmhlcml0cyBwYXJzZXIncyBsaW1pdHMuICovCisgIGluY2x1ZGVkID0gYnVzX2NvbmZpZ19sb2FkIChmaWxlbmFtZSwgRkFMU0UsIHBhcnNlciwgJnRtcF9lcnJvcik7CisKKyAgX2RidXNfbGlzdF9wb3BfbGFzdCAoJnBhcnNlci0+aW5jbHVkZWRfZmlsZXMpOworCisgIGlmIChpbmNsdWRlZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZ0bXBfZXJyb3IpOworCisgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJnRtcF9lcnJvciwgREJVU19FUlJPUl9GSUxFX05PVF9GT1VORCkgJiYKKyAgICAgICAgICBpZ25vcmVfbWlzc2luZykKKyAgICAgICAgeworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJnRtcF9lcnJvcik7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGRidXNfbW92ZV9lcnJvciAoJnRtcF9lcnJvciwgZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoJnRtcF9lcnJvcik7CisKKyAgICAgIGlmICghbWVyZ2VfaW5jbHVkZWQgKHBhcnNlciwgaW5jbHVkZWQsIGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIGJ1c19jb25maWdfcGFyc2VyX3VucmVmIChpbmNsdWRlZCk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIC8qIENvcHkgaW5jbHVkZWQncyBsaW1pdHMgYmFjayB0byBwYXJzZXIuICovCisgICAgICBwYXJzZXItPmxpbWl0cyA9IGluY2x1ZGVkLT5saW1pdHM7CisKKyAgICAgIGJ1c19jb25maWdfcGFyc2VyX3VucmVmIChpbmNsdWRlZCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2VydmljZWhlbHBlcl9wYXRoIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqZmlsZW5hbWVfc3RyOworICBjaGFyICpzZXJ2aWNlaGVscGVyOworCisgIGZpbGVuYW1lX3N0ciA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworCisgIC8qIGNvcHkgdG8gYXZvaWQgb3ZlcndyaXRpbmcgd2l0aCBOVUxMIG9uIE9PTSAqLworICBzZXJ2aWNlaGVscGVyID0gX2RidXNfc3RyZHVwIChmaWxlbmFtZV9zdHIpOworCisgIC8qIGNoZWNrIGZvciBPT00gKi8KKyAgaWYgKHNlcnZpY2VoZWxwZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBzYXZlIHRoZSBsYXRlc3Qgc2VydmljZWhlbHBlciBvbmx5IGlmIG5vdCBPT00gKi8KKyAgZGJ1c19mcmVlIChwYXJzZXItPnNlcnZpY2VoZWxwZXIpOworICBwYXJzZXItPnNlcnZpY2VoZWxwZXIgPSBzZXJ2aWNlaGVscGVyOworCisgIC8qIFdlIGRvbid0IGNoZWNrIHdoZXRoZXIgdGhlIGhlbHBlciBleGlzdHM7IGluc3RlYWQgd2UKKyAgICogd291bGQganVzdCBmYWlsIHRvIGV2ZXIgYWN0aXZhdGUgYW55dGhpbmcgaWYgaXQgZG9lc24ndC4KKyAgICogVGhpcyBhbGxvd3MgYW4gYWRtaW4gdG8gZml4IHRoZSBwcm9ibGVtIGlmIGl0IGRvZXNuJ3QgZXhpc3QuCisgICAqIEl0IGFsc28gYWxsb3dzIHRoZSBwYXJzZXIgdGVzdCBzdWl0ZSB0byBzdWNjZXNzZnVsbHkgcGFyc2UKKyAgICogdGVzdCBjYXNlcyB3aXRob3V0IGluc3RhbGxpbmcgdGhlIGhlbHBlci4gOy0pCisgICAqLworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraW5jbHVkZV9kaXIgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKmRpcm5hbWUsCisgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIGZpbGVuYW1lOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNFcnJvciB0bXBfZXJyb3I7CisgIERCdXNEaXJJdGVyICpkaXI7CisgIGNoYXIgKnM7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZmlsZW5hbWUpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworICAKKyAgZGlyID0gX2RidXNfZGlyZWN0b3J5X29wZW4gKGRpcm5hbWUsIGVycm9yKTsKKworICBpZiAoZGlyID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmdG1wX2Vycm9yKTsKKyAgd2hpbGUgKF9kYnVzX2RpcmVjdG9yeV9nZXRfbmV4dF9maWxlIChkaXIsICZmaWxlbmFtZSwgJnRtcF9lcnJvcikpCisgICAgeworICAgICAgREJ1c1N0cmluZyBmdWxsX3BhdGg7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsX3BhdGgpKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5IChkaXJuYW1lLCAwLCAmZnVsbF9wYXRoLCAwKSkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9ICAgICAgCisKKyAgICAgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmZ1bGxfcGF0aCwgJmZpbGVuYW1lKSkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICAKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZW5kc193aXRoX2Nfc3RyICgmZnVsbF9wYXRoLCAiLmNvbmYiKSkKKyAgICAgICAgeworICAgICAgICAgIGlmICghaW5jbHVkZV9maWxlIChwYXJzZXIsICZmdWxsX3BhdGgsIFRSVUUsIGVycm9yKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0IChlcnJvcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyogV2UgbG9nIHRvIHN5c2xvZyB1bmNvbmRpdGlvbmFsbHkgaGVyZSwgYmVjYXVzZSB0aGlzIGlzCisgICAgICAgICAgICAgICAgICAgKiB0aGUgY29uZmlndXJhdGlvbiBwYXJzZXIsIHNvIHdlIGRvbid0IHlldCBrbm93IHdoZXRoZXIKKyAgICAgICAgICAgICAgICAgICAqIHRoaXMgYnVzIGlzIGdvaW5nIHRvIHdhbnQgdG8gd3JpdGUgdG8gc3lzbG9nISAoVGhlcmUncworICAgICAgICAgICAgICAgICAgICogYWxzbyBzb21lIGxheWVyIGludmVyc2lvbiBnb2luZyBvbiwgaWYgd2Ugd2FudCB0byB1c2UKKyAgICAgICAgICAgICAgICAgICAqIHRoZSBidXMgY29udGV4dC4pICovCisgICAgICAgICAgICAgICAgICBfZGJ1c19zeXN0ZW1fbG9nIChEQlVTX1NZU1RFTV9MT0dfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmNvdW50ZXJlZCBlcnJvciAnJXMnIHdoaWxlIHBhcnNpbmcgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLT5tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZnVsbF9wYXRoKSk7CisgICAgICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgIH0KKworICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZ0bXBfZXJyb3IpKQorICAgIHsKKyAgICAgIGRidXNfbW92ZV9lcnJvciAoJnRtcF9lcnJvciwgZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9kYXRhIChkaXJuYW1lLCAmcykpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmcGFyc2VyLT5jb25mX2RpcnMsIHMpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAocyk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisgIAorIGZhaWxlZDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisgIAorICBpZiAoZGlyKQorICAgIF9kYnVzX2RpcmVjdG9yeV9jbG9zZSAoZGlyKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NvbmZpZ19wYXJzZXJfY29udGVudCAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICpjb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBFbGVtZW50ICplOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisjaWYgMAorICB7CisgICAgY29uc3QgY2hhciAqY19zdHI7CisgICAgCisgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChjb250ZW50LCAmY19zdHIpOworCisgICAgcHJpbnRmICgiQ09OVEVOVCAlZCBieXRlczogJXNcbiIsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChjb250ZW50KSwgY19zdHIpOworICB9CisjZW5kaWYKKyAgCisgIGUgPSBwZWVrX2VsZW1lbnQgKHBhcnNlcik7CisgIGlmIChlID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiVGV4dCBjb250ZW50IG91dHNpZGUgb2YgYW55IFhNTCBlbGVtZW50IGluIGNvbmZpZ3VyYXRpb24gZmlsZSIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZSBpZiAoZS0+aGFkX2NvbnRlbnQpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRWxlbWVudCBoYWQgbXVsdGlwbGUgY29udGVudCBibG9ja3MiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgc3dpdGNoICh0b3BfZWxlbWVudF90eXBlIChwYXJzZXIpKQorICAgIHsKKyAgICBjYXNlIEVMRU1FTlRfTk9ORToKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImVsZW1lbnQgYXQgdG9wIG9mIHN0YWNrIGhhcyBubyB0eXBlIik7CisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBjYXNlIEVMRU1FTlRfQlVTQ09ORklHOgorICAgIGNhc2UgRUxFTUVOVF9QT0xJQ1k6CisgICAgY2FzZSBFTEVNRU5UX0FMTE9XOgorICAgIGNhc2UgRUxFTUVOVF9ERU5ZOgorICAgIGNhc2UgRUxFTUVOVF9GT1JLOgorICAgIGNhc2UgRUxFTUVOVF9TWVNMT0c6CisgICAgY2FzZSBFTEVNRU5UX0tFRVBfVU1BU0s6CisgICAgY2FzZSBFTEVNRU5UX1NUQU5EQVJEX1NFU1NJT05fU0VSVklDRURJUlM6ICAgIAorICAgIGNhc2UgRUxFTUVOVF9TVEFOREFSRF9TWVNURU1fU0VSVklDRURJUlM6ICAgIAorICAgIGNhc2UgRUxFTUVOVF9BTExPV19BTk9OWU1PVVM6CisgICAgY2FzZSBFTEVNRU5UX1NFTElOVVg6CisgICAgY2FzZSBFTEVNRU5UX0FTU09DSUFURToKKyAgICAgIGlmIChhbGxfd2hpdGVzcGFjZSAoY29udGVudCkpCisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIHRleHQgY29udGVudCBleHBlY3RlZCBpbnNpZGUgWE1MIGVsZW1lbnQgJXMgaW4gY29uZmlndXJhdGlvbiBmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfZWxlbWVudF90eXBlX3RvX25hbWUgKHRvcF9lbGVtZW50X3R5cGUgKHBhcnNlcikpKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgIGNhc2UgRUxFTUVOVF9QSURGSUxFOgorICAgICAgeworICAgICAgICBjaGFyICpzOworCisgICAgICAgIGUtPmhhZF9jb250ZW50ID0gVFJVRTsKKyAgICAgICAgCisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfZGF0YSAoY29udGVudCwgJnMpKQorICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgCisgICAgICAgIGRidXNfZnJlZSAocGFyc2VyLT5waWRmaWxlKTsKKyAgICAgICAgcGFyc2VyLT5waWRmaWxlID0gczsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTEVNRU5UX0lOQ0xVREU6CisgICAgICB7CisgICAgICAgIERCdXNTdHJpbmcgZnVsbF9wYXRoLCBzZWxpbnV4X3BvbGljeV9yb290OworCisgICAgICAgIGUtPmhhZF9jb250ZW50ID0gVFJVRTsKKworCWlmIChlLT5kLmluY2x1ZGUuaWZfc2VsaW51eF9lbmFibGVkCisJICAgICYmICFidXNfc2VsaW51eF9lbmFibGVkICgpKQorCSAgYnJlYWs7CisKKyAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfcGF0aCkpCisgICAgICAgICAgZ290byBub21lbTsKKworICAgICAgICBpZiAoZS0+ZC5pbmNsdWRlLnNlbGludXhfcm9vdF9yZWxhdGl2ZSkKKwkgIHsKKyAgICAgICAgICAgIGlmICghYnVzX3NlbGludXhfZ2V0X3BvbGljeV9yb290ICgpKQorCSAgICAgIHsKKwkJZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKwkJCQkiQ291bGQgbm90IGRldGVybWluZSBTRUxpbnV4IHBvbGljeSByb290IGZvciByZWxhdGl2ZSBpbmNsdXNpb24iKTsKKwkJX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworCQlyZXR1cm4gRkFMU0U7CisJICAgICAgfQorICAgICAgICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzZWxpbnV4X3BvbGljeV9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19zZWxpbnV4X2dldF9wb2xpY3lfcm9vdCAoKSk7CisgICAgICAgICAgICBpZiAoIW1ha2VfZnVsbF9wYXRoICgmc2VsaW51eF9wb2xpY3lfcm9vdCwgY29udGVudCwgJmZ1bGxfcGF0aCkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIW1ha2VfZnVsbF9wYXRoICgmcGFyc2VyLT5iYXNlZGlyLCBjb250ZW50LCAmZnVsbF9wYXRoKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgIH0KKworICAgICAgICBpZiAoIWluY2x1ZGVfZmlsZSAocGFyc2VyLCAmZnVsbF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+ZC5pbmNsdWRlLmlnbm9yZV9taXNzaW5nLCBlcnJvcikpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIH0KKworICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRUxFTUVOVF9TRVJWSUNFSEVMUEVSOgorICAgICAgeworICAgICAgICBEQnVzU3RyaW5nIGZ1bGxfcGF0aDsKKyAgICAgICAgCisgICAgICAgIGUtPmhhZF9jb250ZW50ID0gVFJVRTsKKworICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZnVsbF9wYXRoKSkKKyAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAKKyAgICAgICAgaWYgKCFtYWtlX2Z1bGxfcGF0aCAoJnBhcnNlci0+YmFzZWRpciwgY29udGVudCwgJmZ1bGxfcGF0aCkpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzZXJ2aWNlaGVscGVyX3BhdGggKHBhcnNlciwgJmZ1bGxfcGF0aCwgZXJyb3IpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICB9CisKKyAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIEVMRU1FTlRfSU5DTFVERURJUjoKKyAgICAgIHsKKyAgICAgICAgREJ1c1N0cmluZyBmdWxsX3BhdGg7CisgICAgICAgIAorICAgICAgICBlLT5oYWRfY29udGVudCA9IFRSVUU7CisKKyAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfcGF0aCkpCisgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgCisgICAgICAgIGlmICghbWFrZV9mdWxsX3BhdGggKCZwYXJzZXItPmJhc2VkaXIsIGNvbnRlbnQsICZmdWxsX3BhdGgpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCFpbmNsdWRlX2RpciAocGFyc2VyLCAmZnVsbF9wYXRoLCBlcnJvcikpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIH0KKworICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgRUxFTUVOVF9VU0VSOgorICAgICAgeworICAgICAgICBjaGFyICpzOworCisgICAgICAgIGUtPmhhZF9jb250ZW50ID0gVFJVRTsKKyAgICAgICAgCisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfZGF0YSAoY29udGVudCwgJnMpKQorICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgCisgICAgICAgIGRidXNfZnJlZSAocGFyc2VyLT51c2VyKTsKKyAgICAgICAgcGFyc2VyLT51c2VyID0gczsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTEVNRU5UX0NPTkZJR1RZUEU6CisgICAgICB7CisgICAgICAgIGNoYXIgKnM7CisKKyAgICAgICAgZS0+aGFkX2NvbnRlbnQgPSBUUlVFOworCisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfZGF0YSAoY29udGVudCwgJnMpKQorICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIAorICAgICAgICBkYnVzX2ZyZWUgKHBhcnNlci0+YnVzX3R5cGUpOworICAgICAgICBwYXJzZXItPmJ1c190eXBlID0gczsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBFTEVNRU5UX0xJU1RFTjoKKyAgICAgIHsKKyAgICAgICAgY2hhciAqczsKKworICAgICAgICBlLT5oYWRfY29udGVudCA9IFRSVUU7CisgICAgICAgIAorICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2RhdGEgKGNvbnRlbnQsICZzKSkKKyAgICAgICAgICBnb3RvIG5vbWVtOworCisgICAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZwYXJzZXItPmxpc3Rlbl9vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcykpCisgICAgICAgICAgeworICAgICAgICAgICAgZGJ1c19mcmVlIChzKTsKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVMRU1FTlRfQVVUSDoKKyAgICAgIHsKKyAgICAgICAgY2hhciAqczsKKyAgICAgICAgCisgICAgICAgIGUtPmhhZF9jb250ZW50ID0gVFJVRTsKKworICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2RhdGEgKGNvbnRlbnQsICZzKSkKKyAgICAgICAgICBnb3RvIG5vbWVtOworCisgICAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZwYXJzZXItPm1lY2hhbmlzbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfZnJlZSAocyk7CisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTEVNRU5UX1NFUlZJQ0VESVI6CisgICAgICB7CisgICAgICAgIGNoYXIgKnM7CisgICAgICAgIERCdXNTdHJpbmcgZnVsbF9wYXRoOworICAgICAgICAKKyAgICAgICAgZS0+aGFkX2NvbnRlbnQgPSBUUlVFOworCisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsX3BhdGgpKQorICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIAorICAgICAgICBpZiAoIW1ha2VfZnVsbF9wYXRoICgmcGFyc2VyLT5iYXNlZGlyLCBjb250ZW50LCAmZnVsbF9wYXRoKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfZGF0YSAoJmZ1bGxfcGF0aCwgJnMpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgfQorCisgICAgICAgIC8qIF9vbmx5XyBleHRyYSBzZXNzaW9uIGRpcmVjdG9yaWVzIGNhbiBiZSBzcGVjaWZpZWQgKi8KKyAgICAgICAgaWYgKCFzZXJ2aWNlX2RpcnNfYXBwZW5kX3VuaXF1ZV9vcl9mcmVlICgmcGFyc2VyLT5zZXJ2aWNlX2RpcnMsIHMpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgICAgICAgIGRidXNfZnJlZSAocyk7CisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgIH0KKworICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRUxFTUVOVF9MSU1JVDoKKyAgICAgIHsKKyAgICAgICAgbG9uZyB2YWw7CisKKyAgICAgICAgZS0+aGFkX2NvbnRlbnQgPSBUUlVFOworCisgICAgICAgIHZhbCA9IDA7CisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX3BhcnNlX2ludCAoY29udGVudCwgMCwgJnZhbCwgTlVMTCkpCisgICAgICAgICAgeworICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGxpbWl0IG5hbWU9XCIlc1wiPiBlbGVtZW50IGhhcyBpbnZhbGlkIHZhbHVlIChjb3VsZCBub3QgcGFyc2UgYXMgaW50ZWdlcikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUtPmQubGltaXQubmFtZSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgfQorCisgICAgICAgIGUtPmQubGltaXQudmFsdWUgPSB2YWw7CisKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIkxvYWRlZCB2YWx1ZSAlbGQgZm9yIGxpbWl0ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBlLT5kLmxpbWl0LnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBlLT5kLmxpbWl0Lm5hbWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKKworIG5vbWVtOgorICBCVVNfU0VUX09PTSAoZXJyb3IpOworICByZXR1cm4gRkFMU0U7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29uZmlnX3BhcnNlcl9maW5pc2hlZCAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmIChwYXJzZXItPnN0YWNrICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiRWxlbWVudCA8JXM+IHdhcyBub3QgY2xvc2VkIGluIGNvbmZpZ3VyYXRpb24gZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfZWxlbWVudF90eXBlX3RvX25hbWUgKHRvcF9lbGVtZW50X3R5cGUgKHBhcnNlcikpKTsKKworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAocGFyc2VyLT5pc190b3BsZXZlbCAmJiBwYXJzZXItPmxpc3Rlbl9vbiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkNvbmZpZ3VyYXRpb24gZmlsZSBuZWVkcyBvbmUgb3IgbW9yZSA8bGlzdGVuPiBlbGVtZW50cyBnaXZpbmcgYWRkcmVzc2VzIik7IAorICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCitjb25zdCBjaGFyKgorYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3VzZXIgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKQoreworICByZXR1cm4gcGFyc2VyLT51c2VyOworfQorCitjb25zdCBjaGFyKgorYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3R5cGUgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKQoreworICByZXR1cm4gcGFyc2VyLT5idXNfdHlwZTsKK30KKworREJ1c0xpc3QqKgorYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X2FkZHJlc3NlcyAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpCit7CisgIHJldHVybiAmcGFyc2VyLT5saXN0ZW5fb247Cit9CisKK0RCdXNMaXN0KioKK2J1c19jb25maWdfcGFyc2VyX2dldF9tZWNoYW5pc21zIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcikKK3sKKyAgcmV0dXJuICZwYXJzZXItPm1lY2hhbmlzbXM7Cit9CisKK0RCdXNMaXN0KioKK2J1c19jb25maWdfcGFyc2VyX2dldF9zZXJ2aWNlX2RpcnMgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKQoreworICByZXR1cm4gJnBhcnNlci0+c2VydmljZV9kaXJzOworfQorCitEQnVzTGlzdCoqCitidXNfY29uZmlnX3BhcnNlcl9nZXRfY29uZl9kaXJzIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcikKK3sKKyAgcmV0dXJuICZwYXJzZXItPmNvbmZfZGlyczsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25maWdfcGFyc2VyX2dldF9mb3JrIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyKQoreworICByZXR1cm4gcGFyc2VyLT5mb3JrOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3N5c2xvZyAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlcikKK3sKKyAgcmV0dXJuIHBhcnNlci0+c3lzbG9nOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X2tlZXBfdW1hc2sgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIpCit7CisgIHJldHVybiBwYXJzZXItPmtlZXBfdW1hc2s7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29uZmlnX3BhcnNlcl9nZXRfYWxsb3dfYW5vbnltb3VzIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyKQoreworICByZXR1cm4gcGFyc2VyLT5hbGxvd19hbm9ueW1vdXM7Cit9CisKK2NvbnN0IGNoYXIgKgorYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3BpZGZpbGUgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIpCit7CisgIHJldHVybiBwYXJzZXItPnBpZGZpbGU7Cit9CisKK2NvbnN0IGNoYXIgKgorYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3NlcnZpY2VoZWxwZXIgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIpCit7CisgIHJldHVybiBwYXJzZXItPnNlcnZpY2VoZWxwZXI7Cit9CisKK0J1c1BvbGljeSoKK2J1c19jb25maWdfcGFyc2VyX3N0ZWFsX3BvbGljeSAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpCit7CisgIEJ1c1BvbGljeSAqcG9saWN5OworCisgIF9kYnVzX2Fzc2VydCAocGFyc2VyLT5wb2xpY3kgIT0gTlVMTCk7IC8qIGNhbiBvbmx5IHN0ZWFsIHRoZSBwb2xpY3kgMSB0aW1lICovCisgIAorICBwb2xpY3kgPSBwYXJzZXItPnBvbGljeTsKKworICBwYXJzZXItPnBvbGljeSA9IE5VTEw7CisKKyAgcmV0dXJuIHBvbGljeTsKK30KKworLyogT3ZlcndyaXRlIGFueSBsaW1pdHMgdGhhdCB3ZXJlIHNldCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlICovCit2b2lkCitidXNfY29uZmlnX3BhcnNlcl9nZXRfbGltaXRzIChCdXNDb25maWdQYXJzZXIgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c0xpbWl0cyAgICAgICAqbGltaXRzKQoreworICAqbGltaXRzID0gcGFyc2VyLT5saW1pdHM7Cit9CisKK0RCdXNIYXNoVGFibGUqCitidXNfY29uZmlnX3BhcnNlcl9zdGVhbF9zZXJ2aWNlX2NvbnRleHRfdGFibGUgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKQoreworICBEQnVzSGFzaFRhYmxlICp0YWJsZTsKKworICBfZGJ1c19hc3NlcnQgKHBhcnNlci0+c2VydmljZV9jb250ZXh0X3RhYmxlICE9IE5VTEwpOyAvKiBjYW4gb25seSBzdGVhbCBvbmNlICovCisKKyAgdGFibGUgPSBwYXJzZXItPnNlcnZpY2VfY29udGV4dF90YWJsZTsKKworICBwYXJzZXItPnNlcnZpY2VfY29udGV4dF90YWJsZSA9IE5VTEw7CisKKyAgcmV0dXJuIHRhYmxlOworfQorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3R5cGVkZWYgZW51bQoreworICBWQUxJRCwKKyAgSU5WQUxJRCwKKyAgVU5LTk9XTgorfSBWYWxpZGl0eTsKKworc3RhdGljIGRidXNfYm9vbF90Citkb19jaGVja19vd25fcnVsZXMgKEJ1c1BvbGljeSAgKnBvbGljeSkKK3sKKyAgY29uc3Qgc3RydWN0IHsKKyAgICBjaGFyICpuYW1lOworICAgIGRidXNfYm9vbF90IGFsbG93ZWQ7CisgIH0gY2hlY2tzW10gPSB7CisgICAgeyJvcmcuZnJlZWRlc2t0b3AiLCBGQUxTRX0sCisgICAgeyJvcmcuZnJlZWRlc2t0b3AuTWFueVN5c3RlbSIsIEZBTFNFfSwKKyAgICB7Im9yZy5mcmVlZGVza3RvcC5NYW55U3lzdGVtcyIsIFRSVUV9LAorICAgIHsib3JnLmZyZWVkZXNrdG9wLk1hbnlTeXN0ZW1zLmZvbyIsIFRSVUV9LAorICAgIHsib3JnLmZyZWVkZXNrdG9wLk1hbnlTeXN0ZW1zLmZvby5iYXIiLCBUUlVFfSwKKyAgICB7Im9yZy5mcmVlZGVza3RvcC5NYW55U3lzdGVtczIiLCBGQUxTRX0sCisgICAgeyJvcmcuZnJlZWRlc2t0b3AuTWFueVN5c3RlbXMyLmZvbyIsIEZBTFNFfSwKKyAgICB7Im9yZy5mcmVlZGVza3RvcC5NYW55U3lzdGVtczIuZm9vLmJhciIsIEZBTFNFfSwKKyAgICB7TlVMTCwgRkFMU0V9CisgIH07CisgIGludCBpID0gMDsKKworICB3aGlsZSAoY2hlY2tzW2ldLm5hbWUpCisgICAgeworICAgICAgREJ1c1N0cmluZyBzZXJ2aWNlX25hbWU7CisgICAgICBkYnVzX2Jvb2xfdCByZXQ7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzZXJ2aWNlX25hbWUpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBpbml0IHN0cmluZyIpOworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc2VydmljZV9uYW1lLCBjaGVja3NbaV0ubmFtZSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGFwcGVuZCBzdHJpbmciKTsKKworICAgICAgcmV0ID0gYnVzX3BvbGljeV9jaGVja19jYW5fb3duIChwb2xpY3ksICZzZXJ2aWNlX25hbWUpOworICAgICAgcHJpbnRmICgiICAgICAgICBDaGVjayBuYW1lICVzOiAlc1xuIiwgY2hlY2tzW2ldLm5hbWUsCisgICAgICAgICAgICAgIHJldCA/ICJhbGxvd2VkIiA6ICJub3QgYWxsb3dlZCIpOworICAgICAgaWYgKGNoZWNrc1tpXS5hbGxvd2VkICYmICFyZXQpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiQ2Fubm90IG93biAlc1xuIiwgY2hlY2tzW2ldLm5hbWUpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgaWYgKCFjaGVja3NbaV0uYWxsb3dlZCAmJiByZXQpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiQ2FuIG93biAlc1xuIiwgY2hlY2tzW2ldLm5hbWUpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzZXJ2aWNlX25hbWUpOworCisgICAgICBpKys7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2RvX2xvYWQgKGNvbnN0IERCdXNTdHJpbmcgKmZ1bGxfcGF0aCwKKyAgICAgICAgIFZhbGlkaXR5ICAgICAgICAgIHZhbGlkaXR5LAorICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgb29tX3Bvc3NpYmxlLAorICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgY2hlY2tfb3duX3J1bGVzKQoreworICBCdXNDb25maWdQYXJzZXIgKnBhcnNlcjsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBwYXJzZXIgPSBidXNfY29uZmlnX2xvYWQgKGZ1bGxfcGF0aCwgVFJVRSwgTlVMTCwgJmVycm9yKTsKKyAgaWYgKHBhcnNlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZlcnJvcik7CisKKyAgICAgIGlmIChvb21fcG9zc2libGUgJiYKKyAgICAgICAgICBkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gbG9hZCB2YWxpZCBmaWxlIGR1ZSB0byBPT01cbiIpOworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAodmFsaWRpdHkgPT0gVkFMSUQpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIGxvYWQgdmFsaWQgZmlsZSBidXQgc3RpbGwgaGFkIG1lbW9yeTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKCZlcnJvcik7CisKKyAgICAgIGlmIChjaGVja19vd25fcnVsZXMgJiYgZG9fY2hlY2tfb3duX3J1bGVzIChwYXJzZXItPnBvbGljeSkgPT0gRkFMU0UpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYgKHBhcnNlcik7CisKKyAgICAgIGlmICh2YWxpZGl0eSA9PSBJTlZBTElEKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkFjY2VwdGVkIGludmFsaWQgZmlsZVxuIik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgREJ1c1N0cmluZyAqZnVsbF9wYXRoOworICBWYWxpZGl0eSAgICAgICAgICB2YWxpZGl0eTsKKyAgZGJ1c19ib29sX3QgICAgICAgY2hlY2tfb3duX3J1bGVzOworfSBMb2FkZXJPb21EYXRhOworCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2xvYWRlcl9vb21fZnVuYyAodm9pZCAqZGF0YSkKK3sKKyAgTG9hZGVyT29tRGF0YSAqZCA9IGRhdGE7CisKKyAgcmV0dXJuIGRvX2xvYWQgKGQtPmZ1bGxfcGF0aCwgZC0+dmFsaWRpdHksIFRSVUUsIGQtPmNoZWNrX293bl9ydWxlcyk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcHJvY2Vzc190ZXN0X3ZhbGlkX3N1YmRpciAoY29uc3QgREJ1c1N0cmluZyAqdGVzdF9iYXNlX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKnN1YmRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkaXR5ICAgICAgICAgIHZhbGlkaXR5KQoreworICBEQnVzU3RyaW5nIHRlc3RfZGlyZWN0b3J5OworICBEQnVzU3RyaW5nIGZpbGVuYW1lOworICBEQnVzRGlySXRlciAqZGlyOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNFcnJvciBlcnJvcjsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgZGlyID0gTlVMTDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdGVzdF9kaXJlY3RvcnkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBhbGxvY2F0ZSB0ZXN0X2RpcmVjdG9yeVxuIik7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZmaWxlbmFtZSwgc3ViZGlyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICh0ZXN0X2Jhc2VfZGlyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVzdF9kaXJlY3RvcnksIDApKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGNvcHkgdGVzdF9iYXNlX2RpciB0byB0ZXN0X2RpcmVjdG9yeSIpOworCisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJnRlc3RfZGlyZWN0b3J5LCAmZmlsZW5hbWUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGFsbG9jYXRlIGZ1bGwgcGF0aCIpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZmlsZW5hbWUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBhbGxvY2F0ZSBmaWxlbmFtZSBzdHJpbmdcbiIpOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgZGlyID0gX2RidXNfZGlyZWN0b3J5X29wZW4gKCZ0ZXN0X2RpcmVjdG9yeSwgJmVycm9yKTsKKyAgaWYgKGRpciA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJDb3VsZCBub3Qgb3BlbiAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ0ZXN0X2RpcmVjdG9yeSksCisgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBpZiAodmFsaWRpdHkgPT0gVkFMSUQpCisgICAgcHJpbnRmICgiVGVzdGluZyB2YWxpZCBmaWxlczpcbiIpOworICBlbHNlIGlmICh2YWxpZGl0eSA9PSBJTlZBTElEKQorICAgIHByaW50ZiAoIlRlc3RpbmcgaW52YWxpZCBmaWxlczpcbiIpOworICBlbHNlCisgICAgcHJpbnRmICgiVGVzdGluZyB1bmtub3duIGZpbGVzOlxuIik7CisKKyBuZXh0OgorICB3aGlsZSAoX2RidXNfZGlyZWN0b3J5X2dldF9uZXh0X2ZpbGUgKGRpciwgJmZpbGVuYW1lLCAmZXJyb3IpKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgZnVsbF9wYXRoOworICAgICAgTG9hZGVyT29tRGF0YSBkOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZnVsbF9wYXRoKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgaW5pdCBzdHJpbmciKTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJnRlc3RfZGlyZWN0b3J5LCAwLCAmZnVsbF9wYXRoLCAwKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgY29weSBkaXIgdG8gZnVsbF9wYXRoIik7CisKKyAgICAgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmZ1bGxfcGF0aCwgJmZpbGVuYW1lKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgY29uY2F0IGZpbGUgdG8gZGlyIik7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2VuZHNfd2l0aF9jX3N0ciAoJmZ1bGxfcGF0aCwgIi5jb25mIikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiU2tpcHBpbmcgbm9uLS5jb25mIGZpbGUgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZmlsZW5hbWUpKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgZ290byBuZXh0OworICAgICAgICB9CisKKyAgICAgIHByaW50ZiAoIiAgICAlc1xuIiwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZmlsZW5hbWUpKTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoIiBleHBlY3RpbmcgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICB2YWxpZGl0eSA9PSBWQUxJRCA/ICJ2YWxpZCIgOgorICAgICAgICAgICAgICAgICAgICAgKHZhbGlkaXR5ID09IElOVkFMSUQgPyAiaW52YWxpZCIgOgorICAgICAgICAgICAgICAgICAgICAgICh2YWxpZGl0eSA9PSBVTktOT1dOID8gInVua25vd24iIDogIj8/PyIpKSk7CisKKyAgICAgIGQuZnVsbF9wYXRoID0gJmZ1bGxfcGF0aDsKKyAgICAgIGQudmFsaWRpdHkgPSB2YWxpZGl0eTsKKyAgICAgIGQuY2hlY2tfb3duX3J1bGVzID0gX2RidXNfc3RyaW5nX2VuZHNfd2l0aF9jX3N0ciAoJmZ1bGxfcGF0aCwKKyAgICAgICAgICAiY2hlY2stb3duLXJ1bGVzLmNvbmYiKTsKKworICAgICAgLyogRklYTUUgaGFja2Fyb3VuZCBmb3IgYW4gZXhwYXQgcHJvYmxlbSwgc2VlCisgICAgICAgKiBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTEyNDc0NworICAgICAgICogaHR0cDovL2ZyZWVkZXNrdG9wLm9yZy9waXBlcm1haWwvZGJ1cy8yMDA0LU1heS8wMDExNTMuaHRtbAorICAgICAgICovCisgICAgICAvKiBpZiAoIV9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nICgiY29uZmlnLWxvYWRlciIsIGNoZWNrX2xvYWRlcl9vb21fZnVuYywgJmQpKSAqLworICAgICAgaWYgKCFjaGVja19sb2FkZXJfb29tX2Z1bmMgKCZkKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidGVzdCBmYWlsZWQiKTsKKyAgICAgIAorICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgIH0KKworICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkNvdWxkIG5vdCBnZXQgbmV4dCBmaWxlIGluICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnRlc3RfZGlyZWN0b3J5KSwKKyAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBmYWlsZWQ6CisKKyAgaWYgKGRpcikKKyAgICBfZGJ1c19kaXJlY3RvcnlfY2xvc2UgKGRpcik7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmdGVzdF9kaXJlY3RvcnkpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2Jvb2xzX2VxdWFsIChkYnVzX2Jvb2xfdCBhLAorCSAgICAgZGJ1c19ib29sX3QgYikKK3sKKyAgcmV0dXJuIGEgPyBiIDogIWI7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc3RyaW5nc19lcXVhbF9vcl9ib3RoX251bGwgKGNvbnN0IGNoYXIgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYikKK3sKKyAgaWYgKGEgPT0gTlVMTCB8fCBiID09IE5VTEwpCisgICAgcmV0dXJuIGEgPT0gYjsKKyAgZWxzZQorICAgIHJldHVybiAhc3RyY21wIChhLCBiKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitlbGVtZW50c19lcXVhbCAoY29uc3QgRWxlbWVudCAqYSwKKwkJY29uc3QgRWxlbWVudCAqYikKK3sKKyAgaWYgKGEtPnR5cGUgIT0gYi0+dHlwZSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFib29sc19lcXVhbCAoYS0+aGFkX2NvbnRlbnQsIGItPmhhZF9jb250ZW50KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgc3dpdGNoIChhLT50eXBlKQorICAgIHsKKworICAgIGNhc2UgRUxFTUVOVF9JTkNMVURFOgorICAgICAgaWYgKCFib29sc19lcXVhbCAoYS0+ZC5pbmNsdWRlLmlnbm9yZV9taXNzaW5nLAorCQkJYi0+ZC5pbmNsdWRlLmlnbm9yZV9taXNzaW5nKSkKKwlyZXR1cm4gRkFMU0U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRUxFTUVOVF9QT0xJQ1k6CisgICAgICBpZiAoYS0+ZC5wb2xpY3kudHlwZSAhPSBiLT5kLnBvbGljeS50eXBlKQorCXJldHVybiBGQUxTRTsKKyAgICAgIGlmIChhLT5kLnBvbGljeS5naWRfdWlkX29yX2F0X2NvbnNvbGUgIT0gYi0+ZC5wb2xpY3kuZ2lkX3VpZF9vcl9hdF9jb25zb2xlKQorCXJldHVybiBGQUxTRTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTEVNRU5UX0xJTUlUOgorICAgICAgaWYgKHN0cmNtcCAoYS0+ZC5saW1pdC5uYW1lLCBiLT5kLmxpbWl0Lm5hbWUpKQorCXJldHVybiBGQUxTRTsKKyAgICAgIGlmIChhLT5kLmxpbWl0LnZhbHVlICE9IGItPmQubGltaXQudmFsdWUpCisJcmV0dXJuIEZBTFNFOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgLyogZG8gbm90aGluZyAqLworICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiBUUlVFOworCit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbGlzdHNfb2ZfZWxlbWVudHNfZXF1YWwgKERCdXNMaXN0ICphLAorCQkJIERCdXNMaXN0ICpiKQoreworICBEQnVzTGlzdCAqaWE7CisgIERCdXNMaXN0ICppYjsKKworICBpYSA9IGE7CisgIGliID0gYjsKKyAgCisgIHdoaWxlIChpYSAhPSBOVUxMICYmIGliICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGVsZW1lbnRzX2VxdWFsIChpYS0+ZGF0YSwgaWItPmRhdGEpKQorCXJldHVybiBGQUxTRTsKKyAgICAgIGlhID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmYSwgaWEpOworICAgICAgaWIgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZiLCBpYik7CisgICAgfQorCisgIHJldHVybiBpYSA9PSBOVUxMICYmIGliID09IE5VTEw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbGlzdHNfb2ZfY19zdHJpbmdzX2VxdWFsIChEQnVzTGlzdCAqYSwKKwkJCSAgREJ1c0xpc3QgKmIpCit7CisgIERCdXNMaXN0ICppYTsKKyAgREJ1c0xpc3QgKmliOworCisgIGlhID0gYTsKKyAgaWIgPSBiOworICAKKyAgd2hpbGUgKGlhICE9IE5VTEwgJiYgaWIgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChpYS0+ZGF0YSwgaWItPmRhdGEpKQorCXJldHVybiBGQUxTRTsKKyAgICAgIGlhID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmYSwgaWEpOworICAgICAgaWIgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZiLCBpYik7CisgICAgfQorCisgIHJldHVybiBpYSA9PSBOVUxMICYmIGliID09IE5VTEw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbGltaXRzX2VxdWFsIChjb25zdCBCdXNMaW1pdHMgKmEsCisJICAgICAgY29uc3QgQnVzTGltaXRzICpiKQoreworICByZXR1cm4KKyAgICAoYS0+bWF4X2luY29taW5nX2J5dGVzID09IGItPm1heF9pbmNvbWluZ19ieXRlcworICAgICB8fCBhLT5tYXhfaW5jb21pbmdfdW5peF9mZHMgPT0gYi0+bWF4X2luY29taW5nX3VuaXhfZmRzCisgICAgIHx8IGEtPm1heF9vdXRnb2luZ19ieXRlcyA9PSBiLT5tYXhfb3V0Z29pbmdfYnl0ZXMKKyAgICAgfHwgYS0+bWF4X291dGdvaW5nX3VuaXhfZmRzID09IGItPm1heF9vdXRnb2luZ191bml4X2ZkcworICAgICB8fCBhLT5tYXhfbWVzc2FnZV9zaXplID09IGItPm1heF9tZXNzYWdlX3NpemUKKyAgICAgfHwgYS0+bWF4X21lc3NhZ2VfdW5peF9mZHMgPT0gYi0+bWF4X21lc3NhZ2VfdW5peF9mZHMKKyAgICAgfHwgYS0+YWN0aXZhdGlvbl90aW1lb3V0ID09IGItPmFjdGl2YXRpb25fdGltZW91dAorICAgICB8fCBhLT5hdXRoX3RpbWVvdXQgPT0gYi0+YXV0aF90aW1lb3V0CisgICAgIHx8IGEtPm1heF9jb21wbGV0ZWRfY29ubmVjdGlvbnMgPT0gYi0+bWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucworICAgICB8fCBhLT5tYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyA9PSBiLT5tYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucworICAgICB8fCBhLT5tYXhfY29ubmVjdGlvbnNfcGVyX3VzZXIgPT0gYi0+bWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyCisgICAgIHx8IGEtPm1heF9wZW5kaW5nX2FjdGl2YXRpb25zID09IGItPm1heF9wZW5kaW5nX2FjdGl2YXRpb25zCisgICAgIHx8IGEtPm1heF9zZXJ2aWNlc19wZXJfY29ubmVjdGlvbiA9PSBiLT5tYXhfc2VydmljZXNfcGVyX2Nvbm5lY3Rpb24KKyAgICAgfHwgYS0+bWF4X21hdGNoX3J1bGVzX3Blcl9jb25uZWN0aW9uID09IGItPm1heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbgorICAgICB8fCBhLT5tYXhfcmVwbGllc19wZXJfY29ubmVjdGlvbiA9PSBiLT5tYXhfcmVwbGllc19wZXJfY29ubmVjdGlvbgorICAgICB8fCBhLT5yZXBseV90aW1lb3V0ID09IGItPnJlcGx5X3RpbWVvdXQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NvbmZpZ19wYXJzZXJzX2VxdWFsIChjb25zdCBCdXNDb25maWdQYXJzZXIgKmEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnVzQ29uZmlnUGFyc2VyICpiKQoreworICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbCAoJmEtPmJhc2VkaXIsICZiLT5iYXNlZGlyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFsaXN0c19vZl9lbGVtZW50c19lcXVhbCAoYS0+c3RhY2ssIGItPnN0YWNrKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFzdHJpbmdzX2VxdWFsX29yX2JvdGhfbnVsbCAoYS0+dXNlciwgYi0+dXNlcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghbGlzdHNfb2ZfY19zdHJpbmdzX2VxdWFsIChhLT5saXN0ZW5fb24sIGItPmxpc3Rlbl9vbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghbGlzdHNfb2ZfY19zdHJpbmdzX2VxdWFsIChhLT5tZWNoYW5pc21zLCBiLT5tZWNoYW5pc21zKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFsaXN0c19vZl9jX3N0cmluZ3NfZXF1YWwgKGEtPnNlcnZpY2VfZGlycywgYi0+c2VydmljZV9kaXJzKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICAvKiBGSVhNRTogY29tcGFyZSBwb2xpY3kgKi8KKworICAvKiBGSVhNRTogY29tcGFyZSBzZXJ2aWNlIHNlbGludXggSUQgdGFibGUgKi8KKworICBpZiAoISBsaW1pdHNfZXF1YWwgKCZhLT5saW1pdHMsICZiLT5saW1pdHMpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIXN0cmluZ3NfZXF1YWxfb3JfYm90aF9udWxsIChhLT5waWRmaWxlLCBiLT5waWRmaWxlKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCEgYm9vbHNfZXF1YWwgKGEtPmZvcmssIGItPmZvcmspKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoISBib29sc19lcXVhbCAoYS0+a2VlcF91bWFzaywgYi0+a2VlcF91bWFzaykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghIGJvb2xzX2VxdWFsIChhLT5pc190b3BsZXZlbCwgYi0+aXNfdG9wbGV2ZWwpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithbGxfYXJlX2VxdWl2IChjb25zdCBEQnVzU3RyaW5nICp0YXJnZXRfZGlyZWN0b3J5KQoreworICBEQnVzU3RyaW5nIGZpbGVuYW1lOworICBEQnVzRGlySXRlciAqZGlyOworICBCdXNDb25maWdQYXJzZXIgKmZpcnN0X3BhcnNlcjsKKyAgQnVzQ29uZmlnUGFyc2VyICpwYXJzZXI7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgZGJ1c19ib29sX3QgZXF1YWw7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBkaXIgPSBOVUxMOworICBmaXJzdF9wYXJzZXIgPSBOVUxMOworICBwYXJzZXIgPSBOVUxMOworICByZXR2YWwgPSBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZmlsZW5hbWUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBhbGxvY2F0ZSBmaWxlbmFtZSBzdHJpbmciKTsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIGRpciA9IF9kYnVzX2RpcmVjdG9yeV9vcGVuICh0YXJnZXRfZGlyZWN0b3J5LCAmZXJyb3IpOworICBpZiAoZGlyID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkNvdWxkIG5vdCBvcGVuICVzOiAlc1xuIiwKKwkJICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHRhcmdldF9kaXJlY3RvcnkpLAorCQkgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZ290byBmaW5pc2hlZDsKKyAgICB9CisKKyAgcHJpbnRmICgiQ29tcGFyaW5nIGVxdWl2YWxlbnQgZmlsZXM6XG4iKTsKKworIG5leHQ6CisgIHdoaWxlIChfZGJ1c19kaXJlY3RvcnlfZ2V0X25leHRfZmlsZSAoZGlyLCAmZmlsZW5hbWUsICZlcnJvcikpCisgICAgeworICAgICAgREJ1c1N0cmluZyBmdWxsX3BhdGg7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsX3BhdGgpKQorCV9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGluaXQgc3RyaW5nIik7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKHRhcmdldF9kaXJlY3RvcnksIDAsICZmdWxsX3BhdGgsIDApKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBjb3B5IGRpciB0byBmdWxsX3BhdGgiKTsKKworICAgICAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmZnVsbF9wYXRoLCAmZmlsZW5hbWUpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBjb25jYXQgZmlsZSB0byBkaXIiKTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfZW5kc193aXRoX2Nfc3RyICgmZnVsbF9wYXRoLCAiLmNvbmYiKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTa2lwcGluZyBub24tLmNvbmYgZmlsZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmaWxlbmFtZSkpOworCSAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgfQorCisgICAgICBwcmludGYgKCIgICAgJXNcbiIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVuYW1lKSk7CisKKyAgICAgIHBhcnNlciA9IGJ1c19jb25maWdfbG9hZCAoJmZ1bGxfcGF0aCwgVFJVRSwgTlVMTCwgJmVycm9yKTsKKworICAgICAgaWYgKHBhcnNlciA9PSBOVUxMKQorCXsKKwkgIF9kYnVzX3dhcm4gKCJDb3VsZCBub3QgbG9hZCBmaWxlICVzOiAlc1xuIiwKKwkJICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZnVsbF9wYXRoKSwKKwkJICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworCSAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCSAgZ290byBmaW5pc2hlZDsKKwl9CisgICAgICBlbHNlIGlmIChmaXJzdF9wYXJzZXIgPT0gTlVMTCkKKwl7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworCSAgZmlyc3RfcGFyc2VyID0gcGFyc2VyOworCX0KKyAgICAgIGVsc2UKKwl7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworCSAgZXF1YWwgPSBjb25maWdfcGFyc2Vyc19lcXVhbCAoZmlyc3RfcGFyc2VyLCBwYXJzZXIpOworCSAgYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYgKHBhcnNlcik7CisJICBpZiAoISBlcXVhbCkKKwkgICAgZ290byBmaW5pc2hlZDsKKwl9CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBmaW5pc2hlZDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisgIGlmIChmaXJzdF9wYXJzZXIpCisgICAgYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYgKGZpcnN0X3BhcnNlcik7CisgIGlmIChkaXIpCisgICAgX2RidXNfZGlyZWN0b3J5X2Nsb3NlIChkaXIpOworCisgIHJldHVybiByZXR2YWw7CisgIAorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3Byb2Nlc3NfdGVzdF9lcXVpdl9zdWJkaXIgKGNvbnN0IERCdXNTdHJpbmcgKnRlc3RfYmFzZV9kaXIsCisJCQkgICBjb25zdCBjaGFyICAgICAgICpzdWJkaXIpCit7CisgIERCdXNTdHJpbmcgdGVzdF9kaXJlY3Rvcnk7CisgIERCdXNTdHJpbmcgZmlsZW5hbWU7CisgIERCdXNEaXJJdGVyICpkaXI7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgZGJ1c19ib29sX3QgZXF1YWw7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBkaXIgPSBOVUxMOworICByZXR2YWwgPSBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdGVzdF9kaXJlY3RvcnkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBhbGxvY2F0ZSB0ZXN0X2RpcmVjdG9yeSIpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZW5hbWUsIHN1YmRpcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAodGVzdF9iYXNlX2RpciwgMCwKKwkJCSAgJnRlc3RfZGlyZWN0b3J5LCAwKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBjb3B5IHRlc3RfYmFzZV9kaXIgdG8gdGVzdF9kaXJlY3RvcnkiKTsKKworICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZ0ZXN0X2RpcmVjdG9yeSwgJmZpbGVuYW1lKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBhbGxvY2F0ZSBmdWxsIHBhdGgiKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZpbGVuYW1lKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgYWxsb2NhdGUgZmlsZW5hbWUgc3RyaW5nIik7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBkaXIgPSBfZGJ1c19kaXJlY3Rvcnlfb3BlbiAoJnRlc3RfZGlyZWN0b3J5LCAmZXJyb3IpOworICBpZiAoZGlyID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkNvdWxkIG5vdCBvcGVuICVzOiAlc1xuIiwKKwkJICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ0ZXN0X2RpcmVjdG9yeSksCisJCSAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBnb3RvIGZpbmlzaGVkOworICAgIH0KKworICB3aGlsZSAoX2RidXNfZGlyZWN0b3J5X2dldF9uZXh0X2ZpbGUgKGRpciwgJmZpbGVuYW1lLCAmZXJyb3IpKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgZnVsbF9wYXRoOworCisgICAgICAvKiBTa2lwIENWUydzIG1hZ2ljIGRpcmVjdG9yaWVzISAqLworICAgICAgaWYgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJmZpbGVuYW1lLCAiQ1ZTIikpCisJY29udGludWU7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsX3BhdGgpKQorCV9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGluaXQgc3RyaW5nIik7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZ0ZXN0X2RpcmVjdG9yeSwgMCwgJmZ1bGxfcGF0aCwgMCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGNvcHkgZGlyIHRvIGZ1bGxfcGF0aCIpOworCisgICAgICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZmdWxsX3BhdGgsICZmaWxlbmFtZSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGNvbmNhdCBmaWxlIHRvIGRpciIpOworICAgICAgCisgICAgICBlcXVhbCA9IGFsbF9hcmVfZXF1aXYgKCZmdWxsX3BhdGgpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworCisgICAgICBpZiAoIWVxdWFsKQorCWdvdG8gZmluaXNoZWQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBmaW5pc2hlZDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0ZXN0X2RpcmVjdG9yeSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworICBpZiAoZGlyKQorICAgIF9kYnVzX2RpcmVjdG9yeV9jbG9zZSAoZGlyKTsKKworICByZXR1cm4gcmV0dmFsOworICAKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnRlc3Rfc2Vzc2lvbl9zZXJ2aWNlX2Rpcl9tYXRjaGVzW10gPSAKKyAgICAgICAgeworI2lmZGVmIERCVVNfVU5JWAorICAgICAgICAgIi90ZXN0aG9tZS9mb28vLnRlc3Rsb2NhbC90ZXN0c2hhcmUvZGJ1cy0xL3NlcnZpY2VzIiwKKyAgICAgICAgICIvdGVzdHVzci90ZXN0bG9jYWwvdGVzdHNoYXJlL2RidXMtMS9zZXJ2aWNlcyIsCisgICAgICAgICAiL3Rlc3R1c3IvdGVzdHNoYXJlL2RidXMtMS9zZXJ2aWNlcyIsCisgICAgICAgICBEQlVTX0RBVEFESVIiL2RidXMtMS9zZXJ2aWNlcyIsCisjZW5kaWYKKy8qIHdpbGwgYmUgZmlsbGVkIGluIHRlc3RfZGVmYXVsdF9zZXNzaW9uX3NlcnZpY2VkaXJzKCkgKi8KKyNpZmRlZiBEQlVTX1dJTgorICAgICAgICAgTlVMTCwKKyAgICAgICAgIE5VTEwsCisjZW5kaWYKKyAgICAgICAgIE5VTEwKKyAgICAgICAgfTsKKworc3RhdGljIGRidXNfYm9vbF90Cit0ZXN0X2RlZmF1bHRfc2Vzc2lvbl9zZXJ2aWNlZGlycyAodm9pZCkKK3sKKyAgREJ1c0xpc3QgKmRpcnM7CisgIERCdXNMaXN0ICpsaW5rOworICBEQnVzU3RyaW5nIHByb2dzOworICBpbnQgaTsKKworI2lmZGVmIERCVVNfV0lOCisgIGNvbnN0IGNoYXIgKmNvbW1vbl9wcm9nczsKKyAgY2hhciBidWZmZXJbMTAyNF07CisKKyAgaWYgKF9kYnVzX2dldF9pbnN0YWxsX3Jvb3QoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSkpCisgICAgeworICAgICAgc3RyY2F0KGJ1ZmZlcixEQlVTX0RBVEFESVIpOworICAgICAgc3RyY2F0KGJ1ZmZlciwiL2RidXMtMS9zZXJ2aWNlcyIpOworICAgICAgdGVzdF9zZXNzaW9uX3NlcnZpY2VfZGlyX21hdGNoZXNbMF0gPSBidWZmZXI7CisgICAgfQorI2VuZGlmCisKKyAgLyogT24gVW5peCB3ZSBkb24ndCBhY3R1YWxseSB1c2UgdGhpcyB2YXJpYWJsZSwgYnV0IGl0J3MgZWFzaWVyIHRvIGhhbmRsZSB0aGUKKyAgICogZGVhbGxvY2F0aW9uIGlmIHdlIGFsd2F5cyBhbGxvY2F0ZSBpdCwgd2hldGhlciBuZWVkZWQgb3Igbm90ICovCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZwcm9ncykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiT09NIGFsbG9jYXRpbmcgcHJvZ3MiKTsKKworI2lmbmRlZiBEQlVTX1VOSVgKKyAgY29tbW9uX3Byb2dzID0gX2RidXNfZ2V0ZW52ICgiQ29tbW9uUHJvZ3JhbUZpbGVzIik7CisKKyAgaWYgKGNvbW1vbl9wcm9ncykgCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmcHJvZ3MsIGNvbW1vbl9wcm9ncykpIAorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwcm9ncyk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnByb2dzLCAiL2RidXMtMS9zZXJ2aWNlcyIpKSAKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcHJvZ3MpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgdGVzdF9zZXNzaW9uX3NlcnZpY2VfZGlyX21hdGNoZXNbMV0gPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEoJnByb2dzKTsKKyAgICB9CisjZW5kaWYKKyAgZGlycyA9IE5VTEw7CisKKyAgcHJpbnRmICgiVGVzdGluZyByZXRyaWV2aW5nIHRoZSBkZWZhdWx0IHNlc3Npb24gc2VydmljZSBkaXJlY3Rvcmllc1xuIik7CisgIGlmICghX2RidXNfZ2V0X3N0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMgKCZkaXJzKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBnZXQgc3RhcmRhcmQgZGlycyIpOworCisgIC8qIG1ha2Ugc3VyZSBvdXIgZGVmYXVsdHMgZW5kIHdpdGggc2hhcmUvZGJ1cy0xL3NlcnZpY2UgKi8KKyAgd2hpbGUgKChsaW5rID0gX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayAoJmRpcnMpKSkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIHBhdGg7CisgICAgICAKKyAgICAgIHByaW50ZiAoIiAgICBkZWZhdWx0IHNlcnZpY2UgZGlyOiAlc1xuIiwgKGNoYXIgKilsaW5rLT5kYXRhKTsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmcGF0aCwgKGNoYXIgKilsaW5rLT5kYXRhKTsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2VuZHNfd2l0aF9jX3N0ciAoJnBhdGgsICJkYnVzLTEvc2VydmljZXMiKSkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoImVycm9yIHdpdGggZGVmYXVsdCBzZXNzaW9uIHNlcnZpY2UgZGlyZWN0b3JpZXNcbiIpOworCSAgICAgIGRidXNfZnJlZSAobGluay0+ZGF0YSk7CisgICAgCSAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmspOworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcHJvZ3MpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorIAorICAgICAgZGJ1c19mcmVlIChsaW5rLT5kYXRhKTsKKyAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChsaW5rKTsKKyAgICB9CisKKyNpZmRlZiBEQlVTX1VOSVgKKyAgaWYgKCFfZGJ1c19zZXRlbnYgKCJYREdfREFUQV9IT01FIiwgIi90ZXN0aG9tZS9mb28vLnRlc3Rsb2NhbC90ZXN0c2hhcmUiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBzZXRlbnYgWERHX0RBVEFfSE9NRSIpOworCisgIGlmICghX2RidXNfc2V0ZW52ICgiWERHX0RBVEFfRElSUyIsICI6L3Rlc3R1c3IvdGVzdGxvY2FsL3Rlc3RzaGFyZTogOi90ZXN0dXNyL3Rlc3RzaGFyZToiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBzZXRlbnYgWERHX0RBVEFfRElSUyIpOworI2VuZGlmCisgIGlmICghX2RidXNfZ2V0X3N0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMgKCZkaXJzKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBnZXQgc3RhcmRhcmQgZGlycyIpOworCisgIC8qIG1ha2Ugc3VyZSB3ZSByZWFkIGFuZCBwYXJzZSB0aGUgZW52IHZhcmlhYmxlIGNvcnJlY3RseSAqLworICBpID0gMDsKKyAgd2hpbGUgKChsaW5rID0gX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayAoJmRpcnMpKSkKKyAgICB7CisgICAgICBwcmludGYgKCIgICAgdGVzdCBzZXJ2aWNlIGRpcjogJXNcbiIsIChjaGFyICopbGluay0+ZGF0YSk7CisgICAgICBpZiAodGVzdF9zZXNzaW9uX3NlcnZpY2VfZGlyX21hdGNoZXNbaV0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIm1vcmUgZGlyZWN0b3JpZXMgcGFyc2VkIHRoYW4gaW4gbWF0Y2ggc2V0XG4iKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKGxpbmstPmRhdGEpOworICAgICAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChsaW5rKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnByb2dzKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAKKyAgICAgIGlmIChzdHJjbXAgKHRlc3Rfc2Vzc2lvbl9zZXJ2aWNlX2Rpcl9tYXRjaGVzW2ldLCAKKyAgICAgICAgICAgICAgICAgIChjaGFyICopbGluay0+ZGF0YSkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIiVzIGRpcmVjdG9yeSBkb2VzIG5vdCBtYXRjaCAlcyBpbiB0aGUgbWF0Y2ggc2V0XG4iLCAKKyAgICAgICAgICAgICAgICAgIChjaGFyICopbGluay0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgIHRlc3Rfc2Vzc2lvbl9zZXJ2aWNlX2Rpcl9tYXRjaGVzW2ldKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKGxpbmstPmRhdGEpOworICAgICAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChsaW5rKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnByb2dzKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgKytpOworCisgICAgICBkYnVzX2ZyZWUgKGxpbmstPmRhdGEpOworICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmspOworICAgIH0KKyAgCisgIGlmICh0ZXN0X3Nlc3Npb25fc2VydmljZV9kaXJfbWF0Y2hlc1tpXSAhPSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoImV4dHJhIGRhdGEgJXMgaW4gdGhlIG1hdGNoIHNldCB3YXMgbm90IG1hdGNoZWRcbiIsCisgICAgICAgICAgICAgIHRlc3Rfc2Vzc2lvbl9zZXJ2aWNlX2Rpcl9tYXRjaGVzW2ldKTsKKworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwcm9ncyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnByb2dzKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICp0ZXN0X3N5c3RlbV9zZXJ2aWNlX2Rpcl9tYXRjaGVzW10gPSAKKyAgICAgICAgeworI2lmZGVmIERCVVNfVU5JWAorICAgICAgICAgIi91c3IvbG9jYWwvc2hhcmUvZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlcyIsCisgICAgICAgICAiL3Vzci9zaGFyZS9kYnVzLTEvc3lzdGVtLXNlcnZpY2VzIiwKKyNlbmRpZgorICAgICAgICAgREJVU19EQVRBRElSIi9kYnVzLTEvc3lzdGVtLXNlcnZpY2VzIiwKKyNpZmRlZiBEQlVTX1VOSVgKKyAgICAgICAgICIvbGliL2RidXMtMS9zeXN0ZW0tc2VydmljZXMiLAorI2VuZGlmCisKKyNpZmRlZiBEQlVTX1dJTgorICAgICAgICAgTlVMTCwKKyNlbmRpZgorICAgICAgICAgTlVMTAorICAgICAgICB9OworCitzdGF0aWMgZGJ1c19ib29sX3QKK3Rlc3RfZGVmYXVsdF9zeXN0ZW1fc2VydmljZWRpcnMgKHZvaWQpCit7CisgIERCdXNMaXN0ICpkaXJzOworICBEQnVzTGlzdCAqbGluazsKKyAgREJ1c1N0cmluZyBwcm9nczsKKyNpZm5kZWYgREJVU19VTklYCisgIGNvbnN0IGNoYXIgKmNvbW1vbl9wcm9nczsKKyNlbmRpZgorICBpbnQgaTsKKworICAvKiBPbiBVbml4IHdlIGRvbid0IGFjdHVhbGx5IHVzZSB0aGlzIHZhcmlhYmxlLCBidXQgaXQncyBlYXNpZXIgdG8gaGFuZGxlIHRoZQorICAgKiBkZWFsbG9jYXRpb24gaWYgd2UgYWx3YXlzIGFsbG9jYXRlIGl0LCB3aGV0aGVyIG5lZWRlZCBvciBub3QgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnByb2dzKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJPT00gYWxsb2NhdGluZyBwcm9ncyIpOworCisjaWZuZGVmIERCVVNfVU5JWAorICBjb21tb25fcHJvZ3MgPSBfZGJ1c19nZXRlbnYgKCJDb21tb25Qcm9ncmFtRmlsZXMiKTsKKworICBpZiAoY29tbW9uX3Byb2dzKSAKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZwcm9ncywgY29tbW9uX3Byb2dzKSkgCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnByb2dzKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmcHJvZ3MsICIvZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlcyIpKSAKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcHJvZ3MpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgdGVzdF9zeXN0ZW1fc2VydmljZV9kaXJfbWF0Y2hlc1sxXSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSgmcHJvZ3MpOworICAgIH0KKyNlbmRpZgorICBkaXJzID0gTlVMTDsKKworICBwcmludGYgKCJUZXN0aW5nIHJldHJpZXZpbmcgdGhlIGRlZmF1bHQgc3lzdGVtIHNlcnZpY2UgZGlyZWN0b3JpZXNcbiIpOworICBpZiAoIV9kYnVzX2dldF9zdGFuZGFyZF9zeXN0ZW1fc2VydmljZWRpcnMgKCZkaXJzKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBnZXQgc3RhcmRhcmQgZGlycyIpOworCisgIC8qIG1ha2Ugc3VyZSBvdXIgZGVmYXVsdHMgZW5kIHdpdGggc2hhcmUvZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlICovCisgIHdoaWxlICgobGluayA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0X2xpbmsgKCZkaXJzKSkpCisgICAgeworICAgICAgREJ1c1N0cmluZyBwYXRoOworICAgICAgCisgICAgICBwcmludGYgKCIgICAgZGVmYXVsdCBzZXJ2aWNlIGRpcjogJXNcbiIsIChjaGFyICopbGluay0+ZGF0YSk7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnBhdGgsIChjaGFyICopbGluay0+ZGF0YSk7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19lbmRzX3dpdGhfY19zdHIgKCZwYXRoLCAiZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlcyIpKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICgiZXJyb3Igd2l0aCBkZWZhdWx0IHN5c3RlbSBzZXJ2aWNlIGRpcmVjdG9yaWVzXG4iKTsKKwkgICAgICBkYnVzX2ZyZWUgKGxpbmstPmRhdGEpOworICAgIAkgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChsaW5rKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnByb2dzKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAKKyAgICAgIGRidXNfZnJlZSAobGluay0+ZGF0YSk7CisgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAobGluayk7CisgICAgfQorCisjaWZkZWYgREJVU19VTklYCisgIGlmICghX2RidXNfc2V0ZW52ICgiWERHX0RBVEFfSE9NRSIsICIvdGVzdGhvbWUvZm9vLy50ZXN0bG9jYWwvdGVzdHNoYXJlIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3Qgc2V0ZW52IFhER19EQVRBX0hPTUUiKTsKKworICBpZiAoIV9kYnVzX3NldGVudiAoIlhER19EQVRBX0RJUlMiLCAiOi90ZXN0dXNyL3Rlc3Rsb2NhbC90ZXN0c2hhcmU6IDovdGVzdHVzci90ZXN0c2hhcmU6IikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3Qgc2V0ZW52IFhER19EQVRBX0RJUlMiKTsKKyNlbmRpZgorICBpZiAoIV9kYnVzX2dldF9zdGFuZGFyZF9zeXN0ZW1fc2VydmljZWRpcnMgKCZkaXJzKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBnZXQgc3RhcmRhcmQgZGlycyIpOworCisgIC8qIG1ha2Ugc3VyZSB3ZSByZWFkIGFuZCBwYXJzZSB0aGUgZW52IHZhcmlhYmxlIGNvcnJlY3RseSAqLworICBpID0gMDsKKyAgd2hpbGUgKChsaW5rID0gX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayAoJmRpcnMpKSkKKyAgICB7CisgICAgICBwcmludGYgKCIgICAgdGVzdCBzZXJ2aWNlIGRpcjogJXNcbiIsIChjaGFyICopbGluay0+ZGF0YSk7CisgICAgICBpZiAodGVzdF9zeXN0ZW1fc2VydmljZV9kaXJfbWF0Y2hlc1tpXSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICgibW9yZSBkaXJlY3RvcmllcyBwYXJzZWQgdGhhbiBpbiBtYXRjaCBzZXRcbiIpOworICAgICAgICAgIGRidXNfZnJlZSAobGluay0+ZGF0YSk7CisgICAgICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmspOworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcHJvZ3MpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorIAorICAgICAgaWYgKHN0cmNtcCAodGVzdF9zeXN0ZW1fc2VydmljZV9kaXJfbWF0Y2hlc1tpXSwgCisgICAgICAgICAgICAgICAgICAoY2hhciAqKWxpbmstPmRhdGEpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgKCIlcyBkaXJlY3RvcnkgZG9lcyBub3QgbWF0Y2ggJXMgaW4gdGhlIG1hdGNoIHNldFxuIiwgCisgICAgICAgICAgICAgICAgICAoY2hhciAqKWxpbmstPmRhdGEsCisgICAgICAgICAgICAgICAgICB0ZXN0X3N5c3RlbV9zZXJ2aWNlX2Rpcl9tYXRjaGVzW2ldKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKGxpbmstPmRhdGEpOworICAgICAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChsaW5rKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnByb2dzKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgKytpOworCisgICAgICBkYnVzX2ZyZWUgKGxpbmstPmRhdGEpOworICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmspOworICAgIH0KKyAgCisgIGlmICh0ZXN0X3N5c3RlbV9zZXJ2aWNlX2Rpcl9tYXRjaGVzW2ldICE9IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiZXh0cmEgZGF0YSAlcyBpbiB0aGUgbWF0Y2ggc2V0IHdhcyBub3QgbWF0Y2hlZFxuIiwKKyAgICAgICAgICAgICAgdGVzdF9zeXN0ZW1fc2VydmljZV9kaXJfbWF0Y2hlc1tpXSk7CisKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcHJvZ3MpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwcm9ncyk7CisgIHJldHVybiBUUlVFOworfQorCQkgICAKK2RidXNfYm9vbF90CitidXNfY29uZmlnX3BhcnNlcl90ZXN0IChjb25zdCBEQnVzU3RyaW5nICp0ZXN0X2RhdGFfZGlyKQoreworICBpZiAodGVzdF9kYXRhX2RpciA9PSBOVUxMIHx8CisgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAodGVzdF9kYXRhX2RpcikgPT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCJObyB0ZXN0IGRhdGFcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmICghdGVzdF9kZWZhdWx0X3Nlc3Npb25fc2VydmljZWRpcnMoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyNpZmRlZiBEQlVTX1dJTgorICBwcmludGYoImRlZmF1bHQgc3lzdGVtIHNlcnZpY2UgZGlyIHNraXBwZWRcbiIpOworI2Vsc2UKKyAgaWYgKCF0ZXN0X2RlZmF1bHRfc3lzdGVtX3NlcnZpY2VkaXJzKCkpCisgICAgcmV0dXJuIEZBTFNFOworI2VuZGlmCisKKyAgaWYgKCFwcm9jZXNzX3Rlc3RfdmFsaWRfc3ViZGlyICh0ZXN0X2RhdGFfZGlyLCAidmFsaWQtY29uZmlnLWZpbGVzIiwgVkFMSUQpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIXByb2Nlc3NfdGVzdF92YWxpZF9zdWJkaXIgKHRlc3RfZGF0YV9kaXIsICJpbnZhbGlkLWNvbmZpZy1maWxlcyIsIElOVkFMSUQpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIXByb2Nlc3NfdGVzdF9lcXVpdl9zdWJkaXIgKHRlc3RfZGF0YV9kaXIsICJlcXVpdi1jb25maWctZmlsZXMiKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCisKZGlmZiAtLWdpdCBhL2RidXMvYnVzL2NvbmZpZy1wYXJzZXIuaCBiL2RidXMvYnVzL2NvbmZpZy1wYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTViZjc0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9idXMvY29uZmlnLXBhcnNlci5oCkBAIC0wLDAgKzEsODcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogY29uZmlnLXBhcnNlci5oICBYTUwtbGlicmFyeS1hZ25vc3RpYyBjb25maWd1cmF0aW9uIGZpbGUgcGFyc2VyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBCVVNfQ09ORklHX1BBUlNFUl9ICisjZGVmaW5lIEJVU19DT05GSUdfUEFSU0VSX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1oYXNoLmg+CisjaW5jbHVkZSAiYnVzLmgiCisKKy8qIFdoYXRldmVyIFhNTCBsaWJyYXJ5IHdlJ3JlIHVzaW5nIGp1c3QgcHVzaGVzIGRhdGEgaW50byB0aGlzIEFQSSAqLworCit0eXBlZGVmIHN0cnVjdCBCdXNDb25maWdQYXJzZXIgQnVzQ29uZmlnUGFyc2VyOworCitCdXNDb25maWdQYXJzZXIqIGJ1c19jb25maWdfcGFyc2VyX25ldyAoY29uc3QgREJ1c1N0cmluZyAgICAgICpiYXNlZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgaXNfdG9wbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnVzQ29uZmlnUGFyc2VyICpwYXJlbnQpOworCitCdXNDb25maWdQYXJzZXIqIGJ1c19jb25maWdfcGFyc2VyX3JlZiAgICAgICAgICAgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIpOwordm9pZCAgICAgICAgICAgICBidXNfY29uZmlnX3BhcnNlcl91bnJlZiAgICAgICAgIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyKTsKK2RidXNfYm9vbF90ICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfY2hlY2tfZG9jdHlwZSAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmRvY3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgIGJ1c19jb25maWdfcGFyc2VyX3N0YXJ0X2VsZW1lbnQgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICplbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKiphdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKiphdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgICBidXNfY29uZmlnX3BhcnNlcl9lbmRfZWxlbWVudCAgIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZWxlbWVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgICBidXNfY29uZmlnX3BhcnNlcl9jb250ZW50ICAgICAgIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90ICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfZmluaXNoZWQgICAgICAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKKworLyogRnVuY3Rpb25zIGZvciBleHRyYWN0aW5nIHRoZSBwYXJzZSByZXN1bHRzICovCitjb25zdCBjaGFyKiBidXNfY29uZmlnX3BhcnNlcl9nZXRfdXNlciAgICAgICAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7Citjb25zdCBjaGFyKiBidXNfY29uZmlnX3BhcnNlcl9nZXRfdHlwZSAgICAgICAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7CitEQnVzTGlzdCoqICBidXNfY29uZmlnX3BhcnNlcl9nZXRfYWRkcmVzc2VzICAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7CitEQnVzTGlzdCoqICBidXNfY29uZmlnX3BhcnNlcl9nZXRfbWVjaGFuaXNtcyAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7CitkYnVzX2Jvb2xfdCBidXNfY29uZmlnX3BhcnNlcl9nZXRfZm9yayAgICAgICAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7CitkYnVzX2Jvb2xfdCBidXNfY29uZmlnX3BhcnNlcl9nZXRfYWxsb3dfYW5vbnltb3VzIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7CitkYnVzX2Jvb2xfdCBidXNfY29uZmlnX3BhcnNlcl9nZXRfc3lzbG9nICAgICAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7CitkYnVzX2Jvb2xfdCBidXNfY29uZmlnX3BhcnNlcl9nZXRfa2VlcF91bWFzayAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7Citjb25zdCBjaGFyKiBidXNfY29uZmlnX3BhcnNlcl9nZXRfcGlkZmlsZSAgICAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7Citjb25zdCBjaGFyKiBidXNfY29uZmlnX3BhcnNlcl9nZXRfc2VydmljZWhlbHBlciAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpOworREJ1c0xpc3QqKiAgYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3NlcnZpY2VfZGlycyAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpOworREJ1c0xpc3QqKiAgYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X2NvbmZfZGlycyAgICAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpOworQnVzUG9saWN5KiAgYnVzX2NvbmZpZ19wYXJzZXJfc3RlYWxfcG9saWN5ICAgICAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpOwordm9pZCAgICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X2xpbWl0cyAgICAgICAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNMaW1pdHMgICAgICAgKmxpbWl0cyk7CisKK0RCdXNIYXNoVGFibGUqIGJ1c19jb25maWdfcGFyc2VyX3N0ZWFsX3NlcnZpY2VfY29udGV4dF90YWJsZSAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpOworCisvKiBMb2FkZXIgZnVuY3Rpb25zIChiYWNrZW5kZWQgb2ZmIG9uZSBvZiB0aGUgWE1MIHBhcnNlcnMpLiAgUmV0dXJucyBhCisgKiBmaW5pc2hlZCBDb25maWdQYXJzZXIuCisgKi8KK0J1c0NvbmZpZ1BhcnNlciogYnVzX2NvbmZpZ19sb2FkIChjb25zdCBEQnVzU3RyaW5nICAgICAgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICBpc190b3BsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCdXNDb25maWdQYXJzZXIgKnBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgKmVycm9yKTsKKworI2VuZGlmIC8qIEJVU19DT05GSUdfUEFSU0VSX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvYnVzL2Nvbm5lY3Rpb24uYyBiL2RidXMvYnVzL2Nvbm5lY3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjk3NThjCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9idXMvY29ubmVjdGlvbi5jCkBAIC0wLDAgKzEsMjM4NSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBjb25uZWN0aW9uLmMgIENsaWVudCBjb25uZWN0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiY29ubmVjdGlvbi5oIgorI2luY2x1ZGUgImRpc3BhdGNoLmgiCisjaW5jbHVkZSAicG9saWN5LmgiCisjaW5jbHVkZSAic2VydmljZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInNpZ25hbHMuaCIKKyNpbmNsdWRlICJleHBpcmVsaXN0LmgiCisjaW5jbHVkZSAic2VsaW51eC5oIgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWhhc2guaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdGltZW91dC5oPgorCisvKiBUcmltIGV4ZWN1dGVkIGNvbW1hbmRzIHRvIHRoaXMgbGVuZ3RoOyB3ZSB3YW50IHRvIGtlZXAgbG9ncyByZWFkYWJsZSAqLworI2RlZmluZSBNQVhfTE9HX0NPTU1BTkRfTEVOIDUwCisKK3N0YXRpYyB2b2lkIGJ1c19jb25uZWN0aW9uX3JlbW92ZV90cmFuc2FjdGlvbnMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgQnVzRXhwaXJlSXRlbSBleHBpcmVfaXRlbTsKKworICBEQnVzQ29ubmVjdGlvbiAqd2lsbF9nZXRfcmVwbHk7CisgIERCdXNDb25uZWN0aW9uICp3aWxsX3NlbmRfcmVwbHk7CisKKyAgZGJ1c191aW50MzJfdCByZXBseV9zZXJpYWw7CisgIAorfSBCdXNQZW5kaW5nUmVwbHk7CisKK3N0cnVjdCBCdXNDb25uZWN0aW9ucworeworICBpbnQgcmVmY291bnQ7CisgIERCdXNMaXN0ICpjb21wbGV0ZWQ7ICAvKio8IExpc3Qgb2YgYWxsIGNvbXBsZXRlZCBjb25uZWN0aW9ucyAqLworICBpbnQgbl9jb21wbGV0ZWQ7ICAgICAgLyoqPCBMZW5ndGggb2YgY29tcGxldGVkIGxpc3QgKi8KKyAgREJ1c0xpc3QgKmluY29tcGxldGU7IC8qKjwgTGlzdCBvZiBhbGwgbm90LXlldC1hY3RpdmUgY29ubmVjdGlvbnMgKi8KKyAgaW50IG5faW5jb21wbGV0ZTsgICAgIC8qKjwgTGVuZ3RoIG9mIGluY29tcGxldGUgbGlzdCAqLworICBCdXNDb250ZXh0ICpjb250ZXh0OworICBEQnVzSGFzaFRhYmxlICpjb21wbGV0ZWRfYnlfdXNlcjsgLyoqPCBOdW1iZXIgb2YgY29tcGxldGVkIGNvbm5lY3Rpb25zIGZvciBlYWNoIFVJRCAqLworICBEQnVzVGltZW91dCAqZXhwaXJlX3RpbWVvdXQ7IC8qKjwgVGltZW91dCBmb3IgZXhwaXJpbmcgaW5jb21wbGV0ZSBjb25uZWN0aW9ucy4gKi8KKyAgaW50IHN0YW1wOyAgICAgICAgICAgICAgICAgICAvKio8IEluY3JlbWVudGluZyBudW1iZXIgKi8KKyAgQnVzRXhwaXJlTGlzdCAqcGVuZGluZ19yZXBsaWVzOyAvKio8IExpc3Qgb2YgcGVuZGluZyByZXBsaWVzICovCisKKyNpZmRlZiBEQlVTX0VOQUJMRV9TVEFUUworICBpbnQgdG90YWxfbWF0Y2hfcnVsZXM7CisgIGludCBwZWFrX21hdGNoX3J1bGVzOworICBpbnQgcGVha19tYXRjaF9ydWxlc19wZXJfY29ubjsKKworICBpbnQgdG90YWxfYnVzX25hbWVzOworICBpbnQgcGVha19idXNfbmFtZXM7CisgIGludCBwZWFrX2J1c19uYW1lc19wZXJfY29ubjsKKyNlbmRpZgorfTsKKworc3RhdGljIGRidXNfaW50MzJfdCBjb25uZWN0aW9uX2RhdGFfc2xvdCA9IC0xOworCit0eXBlZGVmIHN0cnVjdAoreworICBCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnM7CisgIERCdXNMaXN0ICpsaW5rX2luX2Nvbm5lY3Rpb25fbGlzdDsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIERCdXNMaXN0ICpzZXJ2aWNlc19vd25lZDsKKyAgaW50IG5fc2VydmljZXNfb3duZWQ7CisgIERCdXNMaXN0ICptYXRjaF9ydWxlczsKKyAgaW50IG5fbWF0Y2hfcnVsZXM7CisgIGNoYXIgKm5hbWU7CisgIERCdXNMaXN0ICp0cmFuc2FjdGlvbl9tZXNzYWdlczsgLyoqPCBTdHVmZiB3ZSBuZWVkIHRvIHNlbmQgYXMgcGFydCBvZiBhIHRyYW5zYWN0aW9uICovCisgIERCdXNNZXNzYWdlICpvb21fbWVzc2FnZTsKKyAgREJ1c1ByZWFsbG9jYXRlZFNlbmQgKm9vbV9wcmVhbGxvY2F0ZWQ7CisgIEJ1c0NsaWVudFBvbGljeSAqcG9saWN5OworCisgIGNoYXIgKmNhY2hlZF9sb2dpbmZvX3N0cmluZzsKKyAgQnVzU0VMaW51eElEICpzZWxpbnV4X2lkOworCisgIGxvbmcgY29ubmVjdGlvbl90dl9zZWM7ICAvKio8IFRpbWUgd2hlbiB3ZSBjb25uZWN0ZWQgKHNlY29uZHMgY29tcG9uZW50KSAqLworICBsb25nIGNvbm5lY3Rpb25fdHZfdXNlYzsgLyoqPCBUaW1lIHdoZW4gd2UgY29ubmVjdGVkIChtaWNyb3NlYyBjb21wb25lbnQpICovCisgIGludCBzdGFtcDsgICAgICAgICAgICAgICAvKio8IGNvbm5lY3Rpb25zLT5zdGFtcCBsYXN0IHRpbWUgd2Ugd2VyZSB0cmF2ZXJzZWQgKi8KKworI2lmZGVmIERCVVNfRU5BQkxFX1NUQVRTCisgIGludCBwZWFrX21hdGNoX3J1bGVzOworICBpbnQgcGVha19idXNfbmFtZXM7CisjZW5kaWYKK30gQnVzQ29ubmVjdGlvbkRhdGE7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdCBidXNfcGVuZGluZ19yZXBseV9leHBpcmVkIChCdXNFeHBpcmVMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgKmxpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqZGF0YSk7CisKK3N0YXRpYyB2b2lkIGJ1c19jb25uZWN0aW9uX2Ryb3BfcGVuZGluZ19yZXBsaWVzIChCdXNDb25uZWN0aW9ucyAgKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbik7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdCBleHBpcmVfaW5jb21wbGV0ZV90aW1lb3V0ICh2b2lkICpkYXRhKTsKKworI2RlZmluZSBCVVNfQ09OTkVDVElPTl9EQVRBKGNvbm5lY3Rpb24pIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2RhdGEgKChjb25uZWN0aW9uKSwgY29ubmVjdGlvbl9kYXRhX3Nsb3QpKQorCitzdGF0aWMgREJ1c0xvb3AqCitjb25uZWN0aW9uX2dldF9sb29wIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiBidXNfY29udGV4dF9nZXRfbG9vcCAoZC0+Y29ubmVjdGlvbnMtPmNvbnRleHQpOworfQorCisKK3N0YXRpYyBpbnQKK2dldF9jb25uZWN0aW9uc19mb3JfdWlkIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aWRfdCAgICAgIHVpZCkKK3sKKyAgdm9pZCAqdmFsOworICBpbnQgY3VycmVudF9jb3VudDsKKworICAvKiB2YWwgaXMgTlVMTCBpcyAwIHdoZW4gaXQgaXNuJ3QgaW4gdGhlIGhhc2ggeWV0ICovCisgIAorICB2YWwgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF91aW50cHRyIChjb25uZWN0aW9ucy0+Y29tcGxldGVkX2J5X3VzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQpOworCisgIGN1cnJlbnRfY291bnQgPSBfREJVU19QT0lOVEVSX1RPX0lOVCAodmFsKTsKKworICByZXR1cm4gY3VycmVudF9jb3VudDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithZGp1c3RfY29ubmVjdGlvbnNfZm9yX3VpZCAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWlkX3QgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGFkanVzdG1lbnQpCit7CisgIGludCBjdXJyZW50X2NvdW50OworCisgIGN1cnJlbnRfY291bnQgPSBnZXRfY29ubmVjdGlvbnNfZm9yX3VpZCAoY29ubmVjdGlvbnMsIHVpZCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIkFkanVzdGluZyBjb25uZWN0aW9uIGNvdW50IGZvciBVSUQgIiBEQlVTX1VJRF9GT1JNQVQKKyAgICAgICAgICAgICAgICAgIjogd2FzICVkIGFkanVzdG1lbnQgJWQgbWFraW5nICVkXG4iLAorICAgICAgICAgICAgICAgICB1aWQsIGN1cnJlbnRfY291bnQsIGFkanVzdG1lbnQsIGN1cnJlbnRfY291bnQgKyBhZGp1c3RtZW50KTsKKyAgCisgIF9kYnVzX2Fzc2VydCAoY3VycmVudF9jb3VudCA+PSAwKTsKKyAgCisgIGN1cnJlbnRfY291bnQgKz0gYWRqdXN0bWVudDsKKworICBfZGJ1c19hc3NlcnQgKGN1cnJlbnRfY291bnQgPj0gMCk7CisKKyAgaWYgKGN1cnJlbnRfY291bnQgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV91aW50cHRyIChjb25uZWN0aW9ucy0+Y29tcGxldGVkX2J5X3VzZXIsIHVpZCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgICAgICAKKyAgICAgIHJldHZhbCA9IF9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3VpbnRwdHIgKGNvbm5lY3Rpb25zLT5jb21wbGV0ZWRfYnlfdXNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChjdXJyZW50X2NvdW50KSk7CisKKyAgICAgIC8qIG9ubHkgcG9zaXRpdmUgYWRqdXN0bWVudCBjYW4gZmFpbCBhcyBvdGhlcndpc2UKKyAgICAgICAqIGEgaGFzaCBlbnRyeSBzaG91bGQgYWxyZWFkeSBleGlzdAorICAgICAgICovCisgICAgICBfZGJ1c19hc3NlcnQgKGFkanVzdG1lbnQgPiAwIHx8CisgICAgICAgICAgICAgICAgICAgIChhZGp1c3RtZW50IDw9IDAgJiYgcmV0dmFsKSk7CisKKyAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorfQorCit2b2lkCitidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0ZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKyAgQnVzU2VydmljZSAqc2VydmljZTsKKyAgQnVzTWF0Y2htYWtlciAqbWF0Y2htYWtlcjsKKyAgCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworCisgIF9kYnVzX3ZlcmJvc2UgKCIlcyBkaXNjb25uZWN0ZWQsIGRyb3BwaW5nIGFsbCBzZXJ2aWNlIG93bmVyc2hpcCBhbmQgcmVsZWFzaW5nXG4iLAorICAgICAgICAgICAgICAgICBkLT5uYW1lID8gZC0+bmFtZSA6ICIoaW5hY3RpdmUpIik7CisKKyAgLyogRGVsZXRlIG91ciBtYXRjaCBydWxlcyAqLworICBpZiAoZC0+bl9tYXRjaF9ydWxlcyA+IDApCisgICAgeworICAgICAgbWF0Y2htYWtlciA9IGJ1c19jb250ZXh0X2dldF9tYXRjaG1ha2VyIChkLT5jb25uZWN0aW9ucy0+Y29udGV4dCk7CisgICAgICBidXNfbWF0Y2htYWtlcl9kaXNjb25uZWN0ZWQgKG1hdGNobWFrZXIsIGNvbm5lY3Rpb24pOworICAgIH0KKyAgCisgIC8qIERyb3AgYW55IHNlcnZpY2Ugb3duZXJzaGlwLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIHJlcXVpcmVzCisgICAqIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSBnb29kIHdheSB0bworICAgKiBoYW5kbGUgaXQgb3RoZXIgdGhhbiBzbGVlcGluZzsgd2UgY2FuJ3QgImZhaWwiIHRoZSBvcGVyYXRpb24gb2YKKyAgICogZGlzY29ubmVjdGluZyBhIGNsaWVudCwgYW5kIHByZWFsbG9jYXRpbmcgYSBicm9hZGNhc3QgInNlcnZpY2UgaXMKKyAgICogbm93IGdvbmUiIG1lc3NhZ2UgZm9yIGV2ZXJ5IGNsaWVudC1zZXJ2aWNlIHBhaXIgc2VlbXMga2luZCBvZgorICAgKiBpbnZvbHZlZC4KKyAgICovCisgIHdoaWxlICgoc2VydmljZSA9IF9kYnVzX2xpc3RfZ2V0X2xhc3QgKCZkLT5zZXJ2aWNlc19vd25lZCkpKQorICAgIHsKKyAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbjsKKyAgICAgIERCdXNFcnJvciBlcnJvcjsKKworICAgIHJldHJ5OgorICAgICAgCisgICAgICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgICAgICAgIAorICAgICAgd2hpbGUgKCh0cmFuc2FjdGlvbiA9IGJ1c190cmFuc2FjdGlvbl9uZXcgKGQtPmNvbm5lY3Rpb25zLT5jb250ZXh0KSkgPT0gTlVMTCkKKyAgICAgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworICAgICAgICAKKyAgICAgIGlmICghYnVzX3NlcnZpY2VfcmVtb3ZlX293bmVyIChzZXJ2aWNlLCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLCAmZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJmVycm9yKTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgYnVzX3RyYW5zYWN0aW9uX2NhbmNlbF9hbmRfZnJlZSAodHJhbnNhY3Rpb24pOworICAgICAgICAgICAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisgICAgICAgICAgICAgIGdvdG8gcmV0cnk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIHJlbW92ZSBzZXJ2aWNlIG93bmVyOiAlcyAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlJlbW92aW5nIHNlcnZpY2Ugb3duZXIgZmFpbGVkIGZvciBub24tbWVtb3J5LXJlbGF0ZWQgcmVhc29uIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICBidXNfdHJhbnNhY3Rpb25fZXhlY3V0ZV9hbmRfZnJlZSAodHJhbnNhY3Rpb24pOworICAgIH0KKworICBidXNfZGlzcGF0Y2hfcmVtb3ZlX2Nvbm5lY3Rpb24gKGNvbm5lY3Rpb24pOworICAKKyAgLyogbm8gbW9yZSB3YXRjaGluZyAqLworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZXRfd2F0Y2hfZnVuY3Rpb25zIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzZXR0aW5nIHdhdGNoIGZ1bmN0aW9ucyB0byBOVUxMIGZhaWxlZCIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NldF90aW1lb3V0X2Z1bmN0aW9ucyAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2V0dGluZyB0aW1lb3V0IGZ1bmN0aW9ucyB0byBOVUxMIGZhaWxlZCIpOworICAKKyAgZGJ1c19jb25uZWN0aW9uX3NldF91bml4X3VzZXJfZnVuY3Rpb24gKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NldF93aW5kb3dzX3VzZXJfZnVuY3Rpb24gKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgCisgIGRidXNfY29ubmVjdGlvbl9zZXRfZGlzcGF0Y2hfc3RhdHVzX2Z1bmN0aW9uIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCk7CisgIAorICBidXNfY29ubmVjdGlvbl9yZW1vdmVfdHJhbnNhY3Rpb25zIChjb25uZWN0aW9uKTsKKworICBpZiAoZC0+bGlua19pbl9jb25uZWN0aW9uX2xpc3QgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoZC0+bmFtZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgdW5zaWduZWQgbG9uZyB1aWQ7CisgICAgICAgICAgCisgICAgICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAoJmQtPmNvbm5lY3Rpb25zLT5jb21wbGV0ZWQsIGQtPmxpbmtfaW5fY29ubmVjdGlvbl9saXN0KTsKKyAgICAgICAgICBkLT5saW5rX2luX2Nvbm5lY3Rpb25fbGlzdCA9IE5VTEw7CisgICAgICAgICAgZC0+Y29ubmVjdGlvbnMtPm5fY29tcGxldGVkIC09IDE7CisKKyAgICAgICAgICBpZiAoZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3VzZXIgKGNvbm5lY3Rpb24sICZ1aWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIWFkanVzdF9jb25uZWN0aW9uc19mb3JfdWlkIChkLT5jb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkLCAtMSkpCisgICAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiYWRqdXN0aW5nIGRvd253YXJkIHNob3VsZCBuZXZlciBmYWlsIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKCZkLT5jb25uZWN0aW9ucy0+aW5jb21wbGV0ZSwgZC0+bGlua19pbl9jb25uZWN0aW9uX2xpc3QpOworICAgICAgICAgIGQtPmxpbmtfaW5fY29ubmVjdGlvbl9saXN0ID0gTlVMTDsKKyAgICAgICAgICBkLT5jb25uZWN0aW9ucy0+bl9pbmNvbXBsZXRlIC09IDE7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChkLT5jb25uZWN0aW9ucy0+bl9pbmNvbXBsZXRlID49IDApOworICAgICAgX2RidXNfYXNzZXJ0IChkLT5jb25uZWN0aW9ucy0+bl9jb21wbGV0ZWQgPj0gMCk7CisgICAgfQorCisgIGJ1c19jb25uZWN0aW9uX2Ryb3BfcGVuZGluZ19yZXBsaWVzIChkLT5jb25uZWN0aW9ucywgY29ubmVjdGlvbik7CisgIAorICAvKiBmcmVlcyAiZCIgYXMgc2lkZSBlZmZlY3QgKi8KKyAgZGJ1c19jb25uZWN0aW9uX3NldF9kYXRhIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25fZGF0YV9zbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOworICAKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithZGRfY29ubmVjdGlvbl93YXRjaCAoREJ1c1dhdGNoICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGRhdGE7CisKKyAgcmV0dXJuIF9kYnVzX2xvb3BfYWRkX3dhdGNoIChjb25uZWN0aW9uX2dldF9sb29wIChjb25uZWN0aW9uKSwgd2F0Y2gpOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX2Nvbm5lY3Rpb25fd2F0Y2ggKERCdXNXYXRjaCAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBkYXRhOworICAKKyAgX2RidXNfbG9vcF9yZW1vdmVfd2F0Y2ggKGNvbm5lY3Rpb25fZ2V0X2xvb3AgKGNvbm5lY3Rpb24pLCB3YXRjaCk7Cit9CisKK3N0YXRpYyB2b2lkCit0b2dnbGVfY29ubmVjdGlvbl93YXRjaCAoREJ1c1dhdGNoICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGRhdGE7CisKKyAgX2RidXNfbG9vcF90b2dnbGVfd2F0Y2ggKGNvbm5lY3Rpb25fZ2V0X2xvb3AgKGNvbm5lY3Rpb24pLCB3YXRjaCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWRkX2Nvbm5lY3Rpb25fdGltZW91dCAoREJ1c1RpbWVvdXQgICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBkYXRhOworICAKKyAgcmV0dXJuIF9kYnVzX2xvb3BfYWRkX3RpbWVvdXQgKGNvbm5lY3Rpb25fZ2V0X2xvb3AgKGNvbm5lY3Rpb24pLCB0aW1lb3V0KTsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9jb25uZWN0aW9uX3RpbWVvdXQgKERCdXNUaW1lb3V0ICAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uID0gZGF0YTsKKyAgCisgIF9kYnVzX2xvb3BfcmVtb3ZlX3RpbWVvdXQgKGNvbm5lY3Rpb25fZ2V0X2xvb3AgKGNvbm5lY3Rpb24pLCB0aW1lb3V0KTsKK30KKworc3RhdGljIHZvaWQKK2Rpc3BhdGNoX3N0YXR1c19mdW5jdGlvbiAoREJ1c0Nvbm5lY3Rpb24gICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNEaXNwYXRjaFN0YXR1cyBuZXdfc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0xvb3AgKmxvb3AgPSBkYXRhOworICAKKyAgaWYgKG5ld19zdGF0dXMgIT0gREJVU19ESVNQQVRDSF9DT01QTEVURSkKKyAgICB7CisgICAgICB3aGlsZSAoIV9kYnVzX2xvb3BfcXVldWVfZGlzcGF0Y2ggKGxvb3AsIGNvbm5lY3Rpb24pKQorICAgICAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FsbG93X3VuaXhfdXNlcl9mdW5jdGlvbiAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKyAgICAKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKyAgCisgIHJldHVybiBidXNfY29udGV4dF9hbGxvd191bml4X3VzZXIgKGQtPmNvbm5lY3Rpb25zLT5jb250ZXh0LCB1aWQpOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9jb25uZWN0aW9uX2RhdGEgKHZvaWQgKmRhdGEpCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkID0gZGF0YTsKKworICAvKiBzZXJ2aWNlc19vd25lZCBzaG91bGQgYmUgTlVMTCBzaW5jZSB3ZSBzaG91bGQgYmUgZGlzY29ubmVjdGVkICovCisgIF9kYnVzX2Fzc2VydCAoZC0+c2VydmljZXNfb3duZWQgPT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoZC0+bl9zZXJ2aWNlc19vd25lZCA9PSAwKTsKKyAgLyogc2ltaWxhcmx5ICovCisgIF9kYnVzX2Fzc2VydCAoZC0+dHJhbnNhY3Rpb25fbWVzc2FnZXMgPT0gTlVMTCk7CisKKyAgaWYgKGQtPm9vbV9wcmVhbGxvY2F0ZWQpCisgICAgZGJ1c19jb25uZWN0aW9uX2ZyZWVfcHJlYWxsb2NhdGVkX3NlbmQgKGQtPmNvbm5lY3Rpb24sIGQtPm9vbV9wcmVhbGxvY2F0ZWQpOworCisgIGlmIChkLT5vb21fbWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKGQtPm9vbV9tZXNzYWdlKTsKKworICBpZiAoZC0+cG9saWN5KQorICAgIGJ1c19jbGllbnRfcG9saWN5X3VucmVmIChkLT5wb2xpY3kpOworCisgIGlmIChkLT5zZWxpbnV4X2lkKQorICAgIGJ1c19zZWxpbnV4X2lkX3VucmVmIChkLT5zZWxpbnV4X2lkKTsKKyAgCisgIGRidXNfZnJlZSAoZC0+Y2FjaGVkX2xvZ2luZm9fc3RyaW5nKTsKKyAgCisgIGRidXNfZnJlZSAoZC0+bmFtZSk7CisgIAorICBkYnVzX2ZyZWUgKGQpOworfQorCitCdXNDb25uZWN0aW9ucyoKK2J1c19jb25uZWN0aW9uc19uZXcgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9uczsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hbGxvY2F0ZV9kYXRhX3Nsb3QgKCZjb25uZWN0aW9uX2RhdGFfc2xvdCkpCisgICAgZ290byBmYWlsZWRfMDsKKworICBjb25uZWN0aW9ucyA9IGRidXNfbmV3MCAoQnVzQ29ubmVjdGlvbnMsIDEpOworICBpZiAoY29ubmVjdGlvbnMgPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZF8xOworCisgIGNvbm5lY3Rpb25zLT5jb21wbGV0ZWRfYnlfdXNlciA9IF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfVUlOVFBUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOworICBpZiAoY29ubmVjdGlvbnMtPmNvbXBsZXRlZF9ieV91c2VyID09IE5VTEwpCisgICAgZ290byBmYWlsZWRfMjsKKworICBjb25uZWN0aW9ucy0+ZXhwaXJlX3RpbWVvdXQgPSBfZGJ1c190aW1lb3V0X25ldyAoMTAwLCAvKiBpcnJlbGV2YW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmVfaW5jb21wbGV0ZV90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMsIE5VTEwpOworICBpZiAoY29ubmVjdGlvbnMtPmV4cGlyZV90aW1lb3V0ID09IE5VTEwpCisgICAgZ290byBmYWlsZWRfMzsKKworICBfZGJ1c190aW1lb3V0X3NldF9lbmFibGVkIChjb25uZWN0aW9ucy0+ZXhwaXJlX3RpbWVvdXQsIEZBTFNFKTsKKworICBjb25uZWN0aW9ucy0+cGVuZGluZ19yZXBsaWVzID0gYnVzX2V4cGlyZV9saXN0X25ldyAoYnVzX2NvbnRleHRfZ2V0X2xvb3AgKGNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX2NvbnRleHRfZ2V0X3JlcGx5X3RpbWVvdXQgKGNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX3BlbmRpbmdfcmVwbHlfZXhwaXJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zKTsKKyAgaWYgKGNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMgPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZF80OworICAKKyAgaWYgKCFfZGJ1c19sb29wX2FkZF90aW1lb3V0IChidXNfY29udGV4dF9nZXRfbG9vcCAoY29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMtPmV4cGlyZV90aW1lb3V0KSkKKyAgICBnb3RvIGZhaWxlZF81OworICAKKyAgY29ubmVjdGlvbnMtPnJlZmNvdW50ID0gMTsKKyAgY29ubmVjdGlvbnMtPmNvbnRleHQgPSBjb250ZXh0OworICAKKyAgcmV0dXJuIGNvbm5lY3Rpb25zOworCisgZmFpbGVkXzU6CisgIGJ1c19leHBpcmVfbGlzdF9mcmVlIChjb25uZWN0aW9ucy0+cGVuZGluZ19yZXBsaWVzKTsKKyBmYWlsZWRfNDoKKyAgX2RidXNfdGltZW91dF91bnJlZiAoY29ubmVjdGlvbnMtPmV4cGlyZV90aW1lb3V0KTsKKyBmYWlsZWRfMzoKKyAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAoY29ubmVjdGlvbnMtPmNvbXBsZXRlZF9ieV91c2VyKTsKKyBmYWlsZWRfMjoKKyAgZGJ1c19mcmVlIChjb25uZWN0aW9ucyk7CisgZmFpbGVkXzE6CisgIGRidXNfY29ubmVjdGlvbl9mcmVlX2RhdGFfc2xvdCAoJmNvbm5lY3Rpb25fZGF0YV9zbG90KTsKKyBmYWlsZWRfMDoKKyAgcmV0dXJuIE5VTEw7Cit9CisKK0J1c0Nvbm5lY3Rpb25zICoKK2J1c19jb25uZWN0aW9uc19yZWYgKEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucykKK3sKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9ucy0+cmVmY291bnQgPiAwKTsKKyAgY29ubmVjdGlvbnMtPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIGNvbm5lY3Rpb25zOworfQorCit2b2lkCitidXNfY29ubmVjdGlvbnNfdW5yZWYgKEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucykKK3sKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9ucy0+cmVmY291bnQgPiAwKTsKKyAgY29ubmVjdGlvbnMtPnJlZmNvdW50IC09IDE7CisgIGlmIChjb25uZWN0aW9ucy0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICAvKiBkcm9wIGFsbCBpbmNvbXBsZXRlICovCisgICAgICB3aGlsZSAoY29ubmVjdGlvbnMtPmluY29tcGxldGUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworCisgICAgICAgICAgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb25zLT5pbmNvbXBsZXRlLT5kYXRhOworCisgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7CisgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChjb25uZWN0aW9uKTsKKyAgICAgICAgICBidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0ZWQgKGNvbm5lY3Rpb24pOworICAgICAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisgICAgICAgIH0KKworICAgICAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9ucy0+bl9pbmNvbXBsZXRlID09IDApOworICAgICAgCisgICAgICAvKiBkcm9wIGFsbCByZWFsIGNvbm5lY3Rpb25zICovCisgICAgICB3aGlsZSAoY29ubmVjdGlvbnMtPmNvbXBsZXRlZCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisKKyAgICAgICAgICBjb25uZWN0aW9uID0gY29ubmVjdGlvbnMtPmNvbXBsZXRlZC0+ZGF0YTsKKworICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNvbm5lY3Rpb24pOworICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoY29ubmVjdGlvbik7CisgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZGlzY29ubmVjdGVkIChjb25uZWN0aW9uKTsKKyAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbnMtPm5fY29tcGxldGVkID09IDApOworCisgICAgICBidXNfZXhwaXJlX2xpc3RfZnJlZSAoY29ubmVjdGlvbnMtPnBlbmRpbmdfcmVwbGllcyk7CisgICAgICAKKyAgICAgIF9kYnVzX2xvb3BfcmVtb3ZlX3RpbWVvdXQgKGJ1c19jb250ZXh0X2dldF9sb29wIChjb25uZWN0aW9ucy0+Y29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucy0+ZXhwaXJlX3RpbWVvdXQpOworICAgICAgCisgICAgICBfZGJ1c190aW1lb3V0X3VucmVmIChjb25uZWN0aW9ucy0+ZXhwaXJlX3RpbWVvdXQpOworICAgICAgCisgICAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChjb25uZWN0aW9ucy0+Y29tcGxldGVkX2J5X3VzZXIpOworICAgICAgCisgICAgICBkYnVzX2ZyZWUgKGNvbm5lY3Rpb25zKTsKKworICAgICAgZGJ1c19jb25uZWN0aW9uX2ZyZWVfZGF0YV9zbG90ICgmY29ubmVjdGlvbl9kYXRhX3Nsb3QpOworICAgIH0KK30KKworLyogVXNlZCBmb3IgbG9nZ2luZyAqLworc3RhdGljIGRidXNfYm9vbF90CitjYWNoZV9wZWVyX2xvZ2luZm9fc3RyaW5nIChCdXNDb25uZWN0aW9uRGF0YSAqZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAqY29ubmVjdGlvbikKK3sKKyAgREJ1c1N0cmluZyBsb2dpbmZvX2J1ZjsKKyAgdW5zaWduZWQgbG9uZyB1aWQ7CisgIHVuc2lnbmVkIGxvbmcgcGlkOworICBjaGFyICp3aW5kb3dzX3NpZDsKKyAgZGJ1c19ib29sX3QgcHJldl9hZGRlZDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmbG9naW5mb19idWYpKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIHByZXZfYWRkZWQgPSBGQUxTRTsKKyAgaWYgKGRidXNfY29ubmVjdGlvbl9nZXRfdW5peF91c2VyIChjb25uZWN0aW9uLCAmdWlkKSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmbG9naW5mb19idWYsICJ1aWQ9JWxkIiwgdWlkKSkKKyAgICAgICAgZ290byBvb207CisgICAgICBlbHNlCisgICAgICAgIHByZXZfYWRkZWQgPSBUUlVFOworICAgIH0KKworICBpZiAoZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3Byb2Nlc3NfaWQgKGNvbm5lY3Rpb24sICZwaWQpKQorICAgIHsKKyAgICAgIGlmIChwcmV2X2FkZGVkKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZsb2dpbmZvX2J1ZiwgJyAnKSkKKyAgICAgICAgICAgIGdvdG8gb29tOworICAgICAgICB9CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmbG9naW5mb19idWYsICJwaWQ9JWxkIGNvbW09XCIiLCBwaWQpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICAgIC8qIElnbm9yZSBlcnJvcnMgaGVyZTsgd2UgbWF5IG5vdCBoYXZlIHBlcm1pc3Npb25zIHRvIHJlYWQgdGhlCisgICAgICAgKiBwcm9jIGZpbGUuICovCisgICAgICBfZGJ1c19jb21tYW5kX2Zvcl9waWQgKHBpZCwgJmxvZ2luZm9fYnVmLCBNQVhfTE9HX0NPTU1BTkRfTEVOLCBOVUxMKTsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmbG9naW5mb19idWYsICciJykpCisgICAgICAgIGdvdG8gb29tOworICAgIH0KKworICBpZiAoZGJ1c19jb25uZWN0aW9uX2dldF93aW5kb3dzX3VzZXIgKGNvbm5lY3Rpb24sICZ3aW5kb3dzX3NpZCkpCisgICAgeworICAgICAgZGJ1c19ib29sX3QgZGlkX2FwcGVuZDsKKyAgICAgIGRpZF9hcHBlbmQgPSBfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoJmxvZ2luZm9fYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2lkPVwiJXNcIiAiLCB3aW5kb3dzX3NpZCk7CisgICAgICBkYnVzX2ZyZWUgKHdpbmRvd3Nfc2lkKTsKKyAgICAgIGlmICghZGlkX2FwcGVuZCkKKyAgICAgICAgZ290byBvb207CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgKCZsb2dpbmZvX2J1ZiwgJihkLT5jYWNoZWRfbG9naW5mb19zdHJpbmcpKSkKKyAgICBnb3RvIG9vbTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmxvZ2luZm9fYnVmKTsgCisKKyAgcmV0dXJuIFRSVUU7Citvb206CisgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmxvZ2luZm9fYnVmKTsKKyAgIHJldHVybiBGQUxTRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25uZWN0aW9uc19zZXR1cF9jb25uZWN0aW9uIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIAorICBkID0gZGJ1c19uZXcwIChCdXNDb25uZWN0aW9uRGF0YSwgMSk7CisgIAorICBpZiAoZCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBkLT5jb25uZWN0aW9ucyA9IGNvbm5lY3Rpb25zOworICBkLT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgCisgIF9kYnVzX2dldF9tb25vdG9uaWNfdGltZSAoJmQtPmNvbm5lY3Rpb25fdHZfc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkLT5jb25uZWN0aW9uX3R2X3VzZWMpOworICAKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uX2RhdGFfc2xvdCA+PSAwKTsKKyAgCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NldF9kYXRhIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbl9kYXRhX3Nsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLCBmcmVlX2Nvbm5lY3Rpb25fZGF0YSkpCisgICAgeworICAgICAgZGJ1c19mcmVlIChkKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9yb3V0ZV9wZWVyX21lc3NhZ2VzIChjb25uZWN0aW9uLCBUUlVFKTsKKyAgCisgIHJldHZhbCA9IEZBTFNFOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgZC0+c2VsaW51eF9pZCA9IGJ1c19zZWxpbnV4X2luaXRfY29ubmVjdGlvbl9pZCAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKTsKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIC8qIFRoaXMgaXMgYSBiaXQgYm9ndXMgYmVjYXVzZSB3ZSBwcmV0ZW5kIGFsbCBlcnJvcnMKKyAgICAgICAqIGFyZSBPT007IHRoaXMgaXMgZG9uZSBiZWNhdXNlIHdlIGtub3cgdGhhdCBpbiBidXMuYworICAgICAgICogYW4gT09NIGVycm9yIGRpc2Nvbm5lY3RzIHRoZSBjb25uZWN0aW9uLCB3aGljaCBpcworICAgICAgICogdGhlIHNhbWUgdGhpbmcgd2Ugd2FudCBvbiBhbnkgb3RoZXIgZXJyb3IuCisgICAgICAgKi8KKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZXRfd2F0Y2hfZnVuY3Rpb25zIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfY29ubmVjdGlvbl93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX2Nvbm5lY3Rpb25fd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZV9jb25uZWN0aW9uX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICBnb3RvIG91dDsKKyAgCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NldF90aW1lb3V0X2Z1bmN0aW9ucyAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfY29ubmVjdGlvbl90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9jb25uZWN0aW9uX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLCBOVUxMKSkKKyAgICBnb3RvIG91dDsKKworICAvKiBGb3Igbm93IHdlIGRvbid0IG5lZWQgdG8gc2V0IGEgV2luZG93cyB1c2VyIGZ1bmN0aW9uIGJlY2F1c2UKKyAgICogdGhlcmUgYXJlIG5vIHBvbGljaWVzIGluIHRoZSBjb25maWcgZmlsZSBjb250cm9sbGluZyB3aGF0CisgICAqIFdpbmRvd3MgdXNlcnMgY2FuIGNvbm5lY3QuIFRoZSBkZWZhdWx0ICdzYW1lIHVzZXIgdGhhdCBvd25zIHRoZQorICAgKiBidXMgY2FuIGNvbm5lY3QnIGJlaGF2aW9yIG9mIERCdXNDb25uZWN0aW9uIGlzIGZpbmUgb24gV2luZG93cy4KKyAgICovCisgIGRidXNfY29ubmVjdGlvbl9zZXRfdW5peF91c2VyX2Z1bmN0aW9uIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfdW5peF91c2VyX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CisKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9kaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24gKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfY29udGV4dF9nZXRfbG9vcCAoY29ubmVjdGlvbnMtPmNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgZC0+bGlua19pbl9jb25uZWN0aW9uX2xpc3QgPSBfZGJ1c19saXN0X2FsbG9jX2xpbmsgKGNvbm5lY3Rpb24pOworICBpZiAoZC0+bGlua19pbl9jb25uZWN0aW9uX2xpc3QgPT0gTlVMTCkKKyAgICBnb3RvIG91dDsKKyAgCisgIC8qIFNldHVwIHRoZSBjb25uZWN0aW9uIHdpdGggdGhlIGRpc3BhdGNoZXIgKi8KKyAgaWYgKCFidXNfZGlzcGF0Y2hfYWRkX2Nvbm5lY3Rpb24gKGNvbm5lY3Rpb24pKQorICAgIGdvdG8gb3V0OworCisgIGlmIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cyAoY29ubmVjdGlvbikgIT0gREJVU19ESVNQQVRDSF9DT01QTEVURSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2xvb3BfcXVldWVfZGlzcGF0Y2ggKGJ1c19jb250ZXh0X2dldF9sb29wIChjb25uZWN0aW9ucy0+Y29udGV4dCksIGNvbm5lY3Rpb24pKQorICAgICAgICB7CisgICAgICAgICAgYnVzX2Rpc3BhdGNoX3JlbW92ZV9jb25uZWN0aW9uIChjb25uZWN0aW9uKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICBfZGJ1c19saXN0X2FwcGVuZF9saW5rICgmY29ubmVjdGlvbnMtPmluY29tcGxldGUsIGQtPmxpbmtfaW5fY29ubmVjdGlvbl9saXN0KTsKKyAgY29ubmVjdGlvbnMtPm5faW5jb21wbGV0ZSArPSAxOworICAKKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7CisKKyAgLyogTm90ZSB0aGF0IHdlIG1pZ2h0IGRpc2Nvbm5lY3Qgb3Vyc2VsdmVzIGhlcmUsIGJ1dCBpdCBvbmx5IHRha2VzCisgICAqIGVmZmVjdCBvbiByZXR1cm4gdG8gdGhlIG1haW4gbG9vcC4gV2UgY2FsbCB0aGlzIHRvIGZyZWUgdXAKKyAgICogZXhwaXJlZCBjb25uZWN0aW9ucyBpZiBwb3NzaWJsZSwgYW5kIHRvIHF1ZXVlIHRoZSB0aW1lb3V0IGZvciBvdXIKKyAgICogb3duIGV4cGlyYXRpb24uCisgICAqLworICBidXNfY29ubmVjdGlvbnNfZXhwaXJlX2luY29tcGxldGUgKGNvbm5lY3Rpb25zKTsKKyAgCisgIC8qIEFuZCB3ZSBtaWdodCBhbHNvIGRpc2Nvbm5lY3Qgb3Vyc2VsdmVzIGhlcmUsIGJ1dCBhZ2FpbiBpdAorICAgKiBvbmx5IHRha2VzIGVmZmVjdCBvbiByZXR1cm4gdG8gbWFpbiBsb29wLgorICAgKi8KKyAgaWYgKGNvbm5lY3Rpb25zLT5uX2luY29tcGxldGUgPgorICAgICAgYnVzX2NvbnRleHRfZ2V0X21heF9pbmNvbXBsZXRlX2Nvbm5lY3Rpb25zIChjb25uZWN0aW9ucy0+Y29udGV4dCkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIk51bWJlciBvZiBpbmNvbXBsZXRlIGNvbm5lY3Rpb25zIGV4Y2VlZHMgbWF4LCBkcm9wcGluZyBvbGRlc3Qgb25lXG4iKTsKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9ucy0+aW5jb21wbGV0ZSAhPSBOVUxMKTsKKyAgICAgIC8qIERpc2Nvbm5lY3QgdGhlIG9sZGVzdCB1bmF1dGhlbnRpY2F0ZWQgY29ubmVjdGlvbi4gIEZJWE1FCisgICAgICAgKiB3b3VsZCBpdCBiZSBtb3JlIHNlY3VyZSB0byBkcm9wIGEgKnJhbmRvbSogY29ubmVjdGlvbj8gIFRoaXMKKyAgICAgICAqIGFsZ29yaXRobSBzZWVtcyB0byBtZWFuIHRoYXQgaWYgc29tZW9uZSBjYW4gY3JlYXRlIG5ldworICAgICAgICogY29ubmVjdGlvbnMgcXVpY2tseSBlbm91Z2gsIHRoZXkgY2FuIGtlZXAgYW55b25lIGVsc2UgZnJvbQorICAgICAgICogY29tcGxldGluZyBhdXRoZW50aWNhdGlvbi4gQnV0IHJhbmRvbSBtYXkgb3IgbWF5IG5vdCByZWFsbHkKKyAgICAgICAqIGhlbHAgd2l0aCB0aGF0LCBhIG1vcmUgZWxhYm9yYXRlIHNvbHV0aW9uIG1pZ2h0IGJlIHJlcXVpcmVkLgorICAgICAgICovCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGNvbm5lY3Rpb25zLT5pbmNvbXBsZXRlLT5kYXRhKTsKKyAgICB9CisgIAorICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAoIXJldHZhbCkKKyAgICB7CisgICAgICBpZiAoZC0+c2VsaW51eF9pZCkKKyAgICAgICAgYnVzX3NlbGludXhfaWRfdW5yZWYgKGQtPnNlbGludXhfaWQpOworICAgICAgZC0+c2VsaW51eF9pZCA9IE5VTEw7CisgICAgICAKKyAgICAgIGlmICghZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzZXR0aW5nIHdhdGNoIGZ1bmN0aW9ucyB0byBOVUxMIGZhaWxlZCIpOworICAgICAgCisgICAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZXRfdGltZW91dF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzZXR0aW5nIHRpbWVvdXQgZnVuY3Rpb25zIHRvIE5VTEwgZmFpbGVkIik7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfdW5peF91c2VyX2Z1bmN0aW9uIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dpbmRvd3NfdXNlcl9mdW5jdGlvbiAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgIAorICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF9kaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24gKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgICAgIGlmIChkLT5saW5rX2luX2Nvbm5lY3Rpb25fbGlzdCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfYXNzZXJ0IChkLT5saW5rX2luX2Nvbm5lY3Rpb25fbGlzdC0+bmV4dCA9PSBOVUxMKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKGQtPmxpbmtfaW5fY29ubmVjdGlvbl9saXN0LT5wcmV2ID09IE5VTEwpOworICAgICAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChkLT5saW5rX2luX2Nvbm5lY3Rpb25fbGlzdCk7CisgICAgICAgICAgZC0+bGlua19pbl9jb25uZWN0aW9uX2xpc3QgPSBOVUxMOworICAgICAgICB9CisgICAgICAKKyAgICAgIGlmICghZGJ1c19jb25uZWN0aW9uX3NldF9kYXRhIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25fZGF0YV9zbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gc2V0IGNvbm5lY3Rpb24gZGF0YSB0byBudWxsIik7CisKKyAgICAgIC8qICJkIiBoYXMgbm93IGJlZW4gZnJlZWQgKi8KKyAgICB9CisgIAorICByZXR1cm4gcmV0dmFsOworfQorCit2b2lkCitidXNfY29ubmVjdGlvbnNfZXhwaXJlX2luY29tcGxldGUgKEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucykKK3sgICAgCisgIGludCBuZXh0X2ludGVydmFsOworCisgIG5leHRfaW50ZXJ2YWwgPSAtMTsKKyAgCisgIGlmIChjb25uZWN0aW9ucy0+aW5jb21wbGV0ZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGxvbmcgdHZfc2VjLCB0dl91c2VjOworICAgICAgREJ1c0xpc3QgKmxpbms7CisgICAgICBpbnQgYXV0aF90aW1lb3V0OworICAgICAgCisgICAgICBfZGJ1c19nZXRfbW9ub3RvbmljX3RpbWUgKCZ0dl9zZWMsICZ0dl91c2VjKTsKKyAgICAgIGF1dGhfdGltZW91dCA9IGJ1c19jb250ZXh0X2dldF9hdXRoX3RpbWVvdXQgKGNvbm5lY3Rpb25zLT5jb250ZXh0KTsKKyAgCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNvbm5lY3Rpb25zLT5pbmNvbXBsZXRlKTsKKyAgICAgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmNvbm5lY3Rpb25zLT5pbmNvbXBsZXRlLCBsaW5rKTsKKyAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgICAgICAgICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKyAgICAgICAgICBkb3VibGUgZWxhcHNlZDsKKyAgICAgIAorICAgICAgICAgIGNvbm5lY3Rpb24gPSBsaW5rLT5kYXRhOworICAgICAgCisgICAgICAgICAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICAgICAgCisgICAgICAgICAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworICAgICAgCisgICAgICAgICAgZWxhcHNlZCA9IEVMQVBTRURfTUlMTElTRUNPTkRTX1NJTkNFIChkLT5jb25uZWN0aW9uX3R2X3NlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQtPmNvbm5lY3Rpb25fdHZfdXNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR2X3NlYywgdHZfdXNlYyk7CisKKyAgICAgICAgICBpZiAoZWxhcHNlZCA+PSAoZG91YmxlKSBhdXRoX3RpbWVvdXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJUaW1pbmcgb3V0IGF1dGhlbnRpY2F0aW9uIGZvciBjb25uZWN0aW9uICVwXG4iLCBjb25uZWN0aW9uKTsKKyAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChjb25uZWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIFdlIGNhbiBlbmQgdGhlIGxvb3AsIHNpbmNlIHRoZSBjb25uZWN0aW9ucyBhcmUgaW4gb2xkZXN0LWZpcnN0IG9yZGVyICovCisgICAgICAgICAgICAgIG5leHRfaW50ZXJ2YWwgPSAoKGRvdWJsZSlhdXRoX3RpbWVvdXQpIC0gZWxhcHNlZDsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkNvbm5lY3Rpb24gJXAgYXV0aGVudGljYXRpb24gZXhwaXJlcyBpbiAlZCBtaWxsaXNlY29uZHNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sIG5leHRfaW50ZXJ2YWwpOworICAgICAgICAgIAorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgIAorICAgICAgICAgIGxpbmsgPSBuZXh0OworICAgICAgICB9CisgICAgfQorCisgIGJ1c19leHBpcmVfdGltZW91dF9zZXRfaW50ZXJ2YWwgKGNvbm5lY3Rpb25zLT5leHBpcmVfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9pbnRlcnZhbCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZXhwaXJlX2luY29tcGxldGVfdGltZW91dCAodm9pZCAqZGF0YSkKK3sKKyAgQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zID0gZGF0YTsKKworICBfZGJ1c192ZXJib3NlICgiUnVubmluZ1xuIik7CisgIAorICAvKiBub3RlIHRoYXQgdGhpcyBtYXkgcmVtb3ZlIHRoZSB0aW1lb3V0ICovCisgIGJ1c19jb25uZWN0aW9uc19leHBpcmVfaW5jb21wbGV0ZSAoY29ubmVjdGlvbnMpOworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfZ3JvdXBzICAoREJ1c0Nvbm5lY3Rpb24gICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAqKmdyb3VwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKm5fZ3JvdXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIHVuc2lnbmVkIGxvbmcgdWlkOworCisgICpncm91cHMgPSBOVUxMOworICAqbl9ncm91cHMgPSAwOworCisgIGlmIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfdXNlciAoY29ubmVjdGlvbiwgJnVpZCkpCisgICAgeworICAgICAgaWYgKCFfZGJ1c191bml4X2dyb3Vwc19mcm9tX3VpZCAodWlkLCBncm91cHMsIG5fZ3JvdXBzKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJEaWQgbm90IGdldCBhbnkgZ3JvdXBzIGZvciBVSUQgJWx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiR290ICVkIGdyb3VwcyBmb3IgVUlEICVsdVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqbl9ncm91cHMsIHVpZCk7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsgLyogc3VjY2Vzc2Z1bGx5IGdvdCAwIGdyb3VwcyAqLworfQorCitkYnVzX2Jvb2xfdAorYnVzX2Nvbm5lY3Rpb25faXNfaW5fdW5peF9ncm91cCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgZ2lkKQoreworICBpbnQgaTsKKyAgdW5zaWduZWQgbG9uZyAqZ3JvdXBfaWRzOworICBpbnQgbl9ncm91cF9pZHM7CisKKyAgaWYgKCFidXNfY29ubmVjdGlvbl9nZXRfdW5peF9ncm91cHMgKGNvbm5lY3Rpb24sICZncm91cF9pZHMsICZuX2dyb3VwX2lkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBuX2dyb3VwX2lkcykKKyAgICB7CisgICAgICBpZiAoZ3JvdXBfaWRzW2ldID09IGdpZCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfZnJlZSAoZ3JvdXBfaWRzKTsKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgKytpOworICAgIH0KKworICBkYnVzX2ZyZWUgKGdyb3VwX2lkcyk7CisgIHJldHVybiBGQUxTRTsKK30KKworY29uc3QgY2hhciAqCitidXNfY29ubmVjdGlvbl9nZXRfbG9naW5mbyAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICpjb25uZWN0aW9uKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKyAgICAKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworCisgIGlmICghYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChjb25uZWN0aW9uKSkKKyAgICByZXR1cm4gImluYWN0aXZlIjsKKyAgcmV0dXJuIGQtPmNhY2hlZF9sb2dpbmZvX3N0cmluZzsgIAorfQorCitCdXNDbGllbnRQb2xpY3kqCitidXNfY29ubmVjdGlvbl9nZXRfcG9saWN5IChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisgICAgCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoZC0+cG9saWN5ICE9IE5VTEwpOworICAKKyAgcmV0dXJuIGQtPnBvbGljeTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citmb3JlYWNoX2FjdGl2ZSAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgQnVzQ29ubmVjdGlvbkZvcmVhY2hGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNvbm5lY3Rpb25zLT5jb21wbGV0ZWQpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uID0gbGluay0+ZGF0YTsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmY29ubmVjdGlvbnMtPmNvbXBsZXRlZCwgbGluayk7CisKKyAgICAgIGlmICghKCogZnVuY3Rpb24pIChjb25uZWN0aW9uLCBkYXRhKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZm9yZWFjaF9pbmFjdGl2ZSAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICBCdXNDb25uZWN0aW9uRm9yZWFjaEZ1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCit7CisgIERCdXNMaXN0ICpsaW5rOworICAKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZjb25uZWN0aW9ucy0+aW5jb21wbGV0ZSk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBsaW5rLT5kYXRhOworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZjb25uZWN0aW9ucy0+aW5jb21wbGV0ZSwgbGluayk7CisKKyAgICAgIGlmICghKCogZnVuY3Rpb24pIChjb25uZWN0aW9uLCBkYXRhKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ2FsbHMgZnVuY3Rpb24gb24gZWFjaCBhY3RpdmUgY29ubmVjdGlvbjsgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMKKyAqICNGQUxTRSwgc3RvcHMgaXRlcmF0aW5nLiBBY3RpdmUgY29ubmVjdGlvbnMgYXJlIGF1dGhlbnRpY2F0ZWQKKyAqIGFuZCBoYXZlIHNlbnQgYSBIZWxsbyBtZXNzYWdlLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9ucyB0aGUgY29ubmVjdGlvbnMgb2JqZWN0CisgKiBAcGFyYW0gZnVuY3Rpb24gdGhlIGZ1bmN0aW9uCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHBhc3MgdG8gaXQgYXMgYSBzZWNvbmQgYXJnCisgKi8KK3ZvaWQKK2J1c19jb25uZWN0aW9uc19mb3JlYWNoX2FjdGl2ZSAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c0Nvbm5lY3Rpb25Gb3JlYWNoRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQoreworICBmb3JlYWNoX2FjdGl2ZSAoY29ubmVjdGlvbnMsIGZ1bmN0aW9uLCBkYXRhKTsKK30KKworLyoqCisgKiBDYWxscyBmdW5jdGlvbiBvbiBlYWNoIGNvbm5lY3Rpb247IGlmIHRoZSBmdW5jdGlvbiByZXR1cm5zCisgKiAjRkFMU0UsIHN0b3BzIGl0ZXJhdGluZy4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbnMgdGhlIGNvbm5lY3Rpb25zIG9iamVjdAorICogQHBhcmFtIGZ1bmN0aW9uIHRoZSBmdW5jdGlvbgorICogQHBhcmFtIGRhdGEgZGF0YSB0byBwYXNzIHRvIGl0IGFzIGEgc2Vjb25kIGFyZworICovCit2b2lkCitidXNfY29ubmVjdGlvbnNfZm9yZWFjaCAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVzQ29ubmVjdGlvbkZvcmVhY2hGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKK3sKKyAgaWYgKCFmb3JlYWNoX2FjdGl2ZSAoY29ubmVjdGlvbnMsIGZ1bmN0aW9uLCBkYXRhKSkKKyAgICByZXR1cm47CisKKyAgZm9yZWFjaF9pbmFjdGl2ZSAoY29ubmVjdGlvbnMsIGZ1bmN0aW9uLCBkYXRhKTsKK30KKworQnVzQ29udGV4dCoKK2J1c19jb25uZWN0aW9uc19nZXRfY29udGV4dCAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zKQoreworICByZXR1cm4gY29ubmVjdGlvbnMtPmNvbnRleHQ7Cit9CisKKy8qCisgKiBUaGlzIGlzIHVzZWQgdG8gYXZvaWQgY292ZXJpbmcgdGhlIHNhbWUgY29ubmVjdGlvbiB0d2ljZSB3aGVuCisgKiB0cmF2ZXJzaW5nIGNvbm5lY3Rpb25zLiBOb3RlIHRoYXQgaXQgYXNzdW1lcyB3ZSB3aWxsCisgKiBidXNfY29ubmVjdGlvbl9tYXJrX3N0YW1wKCkgZWFjaCBjb25uZWN0aW9uIGF0IGxlYXN0IG9uY2UgcGVyCisgKiBJTlRfTUFYIGluY3JlbWVudHMgb2YgdGhlIGdsb2JhbCBzdGFtcCwgb3Igd3JhcGFyb3VuZCB3b3VsZCBicmVhaworICogdGhpbmdzLgorICovCit2b2lkCitidXNfY29ubmVjdGlvbnNfaW5jcmVtZW50X3N0YW1wIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMpCit7CisgIGNvbm5lY3Rpb25zLT5zdGFtcCArPSAxOworfQorCisvKiBNYXJrIGNvbm5lY3Rpb24gd2l0aCBjdXJyZW50IHN0YW1wLCByZXR1cm4gVFJVRSBpZiBpdAorICogZGlkbid0IGFscmVhZHkgaGF2ZSB0aGF0IHN0YW1wCisgKi8KK2RidXNfYm9vbF90CitidXNfY29ubmVjdGlvbl9tYXJrX3N0YW1wIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisgIAorICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgIAorICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisKKyAgaWYgKGQtPnN0YW1wID09IGQtPmNvbm5lY3Rpb25zLT5zdGFtcCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UKKyAgICB7CisgICAgICBkLT5zdGFtcCA9IGQtPmNvbm5lY3Rpb25zLT5zdGFtcDsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KK30KKworQnVzQ29udGV4dCoKK2J1c19jb25uZWN0aW9uX2dldF9jb250ZXh0IChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKworICByZXR1cm4gZC0+Y29ubmVjdGlvbnMtPmNvbnRleHQ7Cit9CisKK0J1c0Nvbm5lY3Rpb25zKgorYnVzX2Nvbm5lY3Rpb25fZ2V0X2Nvbm5lY3Rpb25zIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisgICAgCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisKKyAgcmV0dXJuIGQtPmNvbm5lY3Rpb25zOworfQorCitCdXNSZWdpc3RyeSoKK2J1c19jb25uZWN0aW9uX2dldF9yZWdpc3RyeSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisKKyAgcmV0dXJuIGJ1c19jb250ZXh0X2dldF9yZWdpc3RyeSAoZC0+Y29ubmVjdGlvbnMtPmNvbnRleHQpOworfQorCitCdXNBY3RpdmF0aW9uKgorYnVzX2Nvbm5lY3Rpb25fZ2V0X2FjdGl2YXRpb24gKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKworICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworCisgIHJldHVybiBidXNfY29udGV4dF9nZXRfYWN0aXZhdGlvbiAoZC0+Y29ubmVjdGlvbnMtPmNvbnRleHQpOworfQorCitCdXNNYXRjaG1ha2VyKgorYnVzX2Nvbm5lY3Rpb25fZ2V0X21hdGNobWFrZXIgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKworICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworCisgIHJldHVybiBidXNfY29udGV4dF9nZXRfbWF0Y2htYWtlciAoZC0+Y29ubmVjdGlvbnMtPmNvbnRleHQpOworfQorCitCdXNTRUxpbnV4SUQqCitidXNfY29ubmVjdGlvbl9nZXRfc2VsaW51eF9pZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisKKyAgcmV0dXJuIGQtPnNlbGludXhfaWQ7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBtZXNzYWdlIGJ1cy4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHJldHVybnMgI1RSVUUgaWYgd2UncmUgYW4gYWN0aXZlIG1lc3NhZ2UgYnVzIHBhcnRpY2lwYW50CisgKi8KK2RidXNfYm9vbF90CitidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKworICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgIAorICByZXR1cm4gZCAhPSBOVUxMICYmIGQtPm5hbWUgIT0gTlVMTDsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25uZWN0aW9uX3ByZWFsbG9jYXRlX29vbV9lcnJvciAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBEQnVzUHJlYWxsb2NhdGVkU2VuZCAqcHJlYWxsb2NhdGVkOworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKworICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7ICAKKworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisKKyAgaWYgKGQtPm9vbV9wcmVhbGxvY2F0ZWQgIT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKyAgCisgIHByZWFsbG9jYXRlZCA9IGRidXNfY29ubmVjdGlvbl9wcmVhbGxvY2F0ZV9zZW5kIChjb25uZWN0aW9uKTsKKyAgaWYgKHByZWFsbG9jYXRlZCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ldyAoREJVU19NRVNTQUdFX1RZUEVfRVJST1IpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX2ZyZWVfcHJlYWxsb2NhdGVkX3NlbmQgKGNvbm5lY3Rpb24sIHByZWFsbG9jYXRlZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIGQtPm5hbWUgbWF5IGJlIE5VTEwsIGJ1dCB0aGF0IGlzIE9LICovCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9lcnJvcl9uYW1lIChtZXNzYWdlLCBEQlVTX0VSUk9SX05PX01FTU9SWSkgfHwKKyAgICAgICFkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChtZXNzYWdlLCBkLT5uYW1lKSB8fAorICAgICAgIWRidXNfbWVzc2FnZV9zZXRfc2VuZGVyIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX2ZyZWVfcHJlYWxsb2NhdGVkX3NlbmQgKGNvbm5lY3Rpb24sIHByZWFsbG9jYXRlZCk7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIC8qIHNldCByZXBseSBzZXJpYWwgdG8gcGxhY2Vob2xkZXIgdmFsdWUganVzdCBzbyBzcGFjZSBpcyBhbHJlYWR5IGFsbG9jYXRlZAorICAgKiBmb3IgaXQuCisgICAqLworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlLCAxNCkpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX2ZyZWVfcHJlYWxsb2NhdGVkX3NlbmQgKGNvbm5lY3Rpb24sIHByZWFsbG9jYXRlZCk7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkLT5vb21fbWVzc2FnZSA9IG1lc3NhZ2U7CisgIGQtPm9vbV9wcmVhbGxvY2F0ZWQgPSBwcmVhbGxvY2F0ZWQ7CisgIAorICByZXR1cm4gVFJVRTsKK30KKwordm9pZAorYnVzX2Nvbm5lY3Rpb25fc2VuZF9vb21fZXJyb3IgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICppbl9yZXBseV90bykKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOyAgCisKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOyAgCisgIF9kYnVzX2Fzc2VydCAoZC0+b29tX21lc3NhZ2UgIT0gTlVMTCk7CisKKyAgLyogc2hvdWxkIGFsd2F5cyBzdWNjZWVkIHNpbmNlIHdlIHNldCBpdCB0byBhIHBsYWNlaG9sZGVyIGVhcmxpZXIgKi8KKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X3JlcGx5X3NlcmlhbCAoZC0+b29tX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsIChpbl9yZXBseV90bykpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkZhaWxlZCB0byBzZXQgcmVwbHkgc2VyaWFsIGZvciBwcmVhbGxvY2F0ZWQgb29tIG1lc3NhZ2UiKTsKKworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChkLT5vb21fbWVzc2FnZSkgIT0gTlVMTCk7CisgIAorICBkYnVzX2Nvbm5lY3Rpb25fc2VuZF9wcmVhbGxvY2F0ZWQgKGNvbm5lY3Rpb24sIGQtPm9vbV9wcmVhbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+b29tX21lc3NhZ2UsIE5VTEwpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAoZC0+b29tX21lc3NhZ2UpOworICBkLT5vb21fbWVzc2FnZSA9IE5VTEw7CisgIGQtPm9vbV9wcmVhbGxvY2F0ZWQgPSBOVUxMOworfQorCisjaWZkZWYgREJVU19FTkFCTEVfU1RBVFMKK3N0YXRpYyB2b2lkCit1cGRhdGVfcGVhayAoaW50ICpwZWFrLAorICAgICAgICAgICAgIGludCBuKQoreworICBpZiAoKnBlYWsgPCBuKQorICAgICpwZWFrID0gbjsKK30KKyNlbmRpZgorCit2b2lkCitidXNfY29ubmVjdGlvbl9hZGRfbWF0Y2hfcnVsZV9saW5rIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgICpsaW5rKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKworICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKworICBfZGJ1c19saXN0X2FwcGVuZF9saW5rICgmZC0+bWF0Y2hfcnVsZXMsIGxpbmspOworCisgIGQtPm5fbWF0Y2hfcnVsZXMgKz0gMTsKKworI2lmZGVmIERCVVNfRU5BQkxFX1NUQVRTCisgIHVwZGF0ZV9wZWFrICgmZC0+cGVha19tYXRjaF9ydWxlcywgZC0+bl9tYXRjaF9ydWxlcyk7CisgIHVwZGF0ZV9wZWFrICgmZC0+Y29ubmVjdGlvbnMtPnBlYWtfbWF0Y2hfcnVsZXNfcGVyX2Nvbm4sIGQtPm5fbWF0Y2hfcnVsZXMpOworCisgIGQtPmNvbm5lY3Rpb25zLT50b3RhbF9tYXRjaF9ydWxlcyArPSAxOworICB1cGRhdGVfcGVhayAoJmQtPmNvbm5lY3Rpb25zLT5wZWFrX21hdGNoX3J1bGVzLAorICAgICAgICAgICAgICAgZC0+Y29ubmVjdGlvbnMtPnRvdGFsX21hdGNoX3J1bGVzKTsKKyNlbmRpZgorfQorCitkYnVzX2Jvb2xfdAorYnVzX2Nvbm5lY3Rpb25fYWRkX21hdGNoX3J1bGUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c01hdGNoUnVsZSAgICpydWxlKQoreworICAgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2FsbG9jX2xpbmsgKHJ1bGUpOworCisgIGlmIChsaW5rID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1c19jb25uZWN0aW9uX2FkZF9tYXRjaF9ydWxlX2xpbmsgKGNvbm5lY3Rpb24sIGxpbmspOworCisgIHJldHVybiBUUlVFOworfQorCit2b2lkCitidXNfY29ubmVjdGlvbl9yZW1vdmVfbWF0Y2hfcnVsZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzTWF0Y2hSdWxlICAgKnJ1bGUpCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworCisgIF9kYnVzX2xpc3RfcmVtb3ZlX2xhc3QgKCZkLT5tYXRjaF9ydWxlcywgcnVsZSk7CisKKyAgZC0+bl9tYXRjaF9ydWxlcyAtPSAxOworICBfZGJ1c19hc3NlcnQgKGQtPm5fbWF0Y2hfcnVsZXMgPj0gMCk7CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9TVEFUUworICBkLT5jb25uZWN0aW9ucy0+dG90YWxfbWF0Y2hfcnVsZXMgLT0gMTsKKyNlbmRpZgorfQorCitpbnQKK2J1c19jb25uZWN0aW9uX2dldF9uX21hdGNoX3J1bGVzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisgIAorICByZXR1cm4gZC0+bl9tYXRjaF9ydWxlczsKK30KKwordm9pZAorYnVzX2Nvbm5lY3Rpb25fYWRkX293bmVkX3NlcnZpY2VfbGluayAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAqbGluaykKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisKKyAgX2RidXNfbGlzdF9hcHBlbmRfbGluayAoJmQtPnNlcnZpY2VzX293bmVkLCBsaW5rKTsKKworICBkLT5uX3NlcnZpY2VzX293bmVkICs9IDE7CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9TVEFUUworICB1cGRhdGVfcGVhayAoJmQtPnBlYWtfYnVzX25hbWVzLCBkLT5uX3NlcnZpY2VzX293bmVkKTsKKyAgdXBkYXRlX3BlYWsgKCZkLT5jb25uZWN0aW9ucy0+cGVha19idXNfbmFtZXNfcGVyX2Nvbm4sCisgICAgICAgICAgICAgICBkLT5uX3NlcnZpY2VzX293bmVkKTsKKworICBkLT5jb25uZWN0aW9ucy0+dG90YWxfYnVzX25hbWVzICs9IDE7CisgIHVwZGF0ZV9wZWFrICgmZC0+Y29ubmVjdGlvbnMtPnBlYWtfYnVzX25hbWVzLAorICAgICAgICAgICAgICAgZC0+Y29ubmVjdGlvbnMtPnRvdGFsX2J1c19uYW1lcyk7CisjZW5kaWYKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25uZWN0aW9uX2FkZF9vd25lZF9zZXJ2aWNlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNTZXJ2aWNlICAgICAqc2VydmljZSkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfYWxsb2NfbGluayAoc2VydmljZSk7CisKKyAgaWYgKGxpbmsgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgYnVzX2Nvbm5lY3Rpb25fYWRkX293bmVkX3NlcnZpY2VfbGluayAoY29ubmVjdGlvbiwgbGluayk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQKK2J1c19jb25uZWN0aW9uX3JlbW92ZV9vd25lZF9zZXJ2aWNlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNTZXJ2aWNlICAgICAqc2VydmljZSkKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisKKyAgX2RidXNfbGlzdF9yZW1vdmVfbGFzdCAoJmQtPnNlcnZpY2VzX293bmVkLCBzZXJ2aWNlKTsKKworICBkLT5uX3NlcnZpY2VzX293bmVkIC09IDE7CisgIF9kYnVzX2Fzc2VydCAoZC0+bl9zZXJ2aWNlc19vd25lZCA+PSAwKTsKKworI2lmZGVmIERCVVNfRU5BQkxFX1NUQVRTCisgIGQtPmNvbm5lY3Rpb25zLT50b3RhbF9idXNfbmFtZXMgLT0gMTsKKyNlbmRpZgorfQorCitpbnQKK2J1c19jb25uZWN0aW9uX2dldF9uX3NlcnZpY2VzX293bmVkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisgIAorICByZXR1cm4gZC0+bl9zZXJ2aWNlc19vd25lZDsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25uZWN0aW9uX2NvbXBsZXRlIChEQnVzQ29ubmVjdGlvbiAgICpjb25uZWN0aW9uLAorCQkJIGNvbnN0IERCdXNTdHJpbmcgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworICB1bnNpZ25lZCBsb25nIHVpZDsKKyAgCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGQtPm5hbWUgPT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoZC0+cG9saWN5ID09IE5VTEwpOworCisgIF9kYnVzX2Fzc2VydCAoIWJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAoY29ubmVjdGlvbikpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9kYXRhIChuYW1lLCAmZC0+bmFtZSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChkLT5uYW1lICE9IE5VTEwpOworICAKKyAgX2RidXNfdmVyYm9zZSAoIk5hbWUgJXMgYXNzaWduZWQgdG8gJXBcbiIsIGQtPm5hbWUsIGNvbm5lY3Rpb24pOworCisgIGQtPnBvbGljeSA9IGJ1c19jb250ZXh0X2NyZWF0ZV9jbGllbnRfcG9saWN5IChkLT5jb25uZWN0aW9ucy0+Y29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisKKyAgLyogd2UgbWF5IGhhdmUgYSBOVUxMIHBvbGljeSBvbiBPT00gb3IgZXJyb3IgZ2V0dGluZyBsaXN0IG9mCisgICAqIGdyb3VwcyBmb3IgYSB1c2VyLiBJbiB0aGUgbGF0dGVyIGNhc2Ugd2UgZG9uJ3QgaGFuZGxlIGl0IHNvCisgICAqIHdlbGwgY3VycmVudGx5LCBhcyBpdCB3aWxsIGp1c3Qga2VlcCBmYWlsaW5nIG92ZXIgYW5kIG92ZXIuCisgICAqLworCisgIGlmIChkLT5wb2xpY3kgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGNyZWF0ZSBzZWN1cml0eSBwb2xpY3kgZm9yIGNvbm5lY3Rpb24gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uKTsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGRidXNfZnJlZSAoZC0+bmFtZSk7CisgICAgICBkLT5uYW1lID0gTlVMTDsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3VzZXIgKGNvbm5lY3Rpb24sICZ1aWQpKQorICAgIHsKKyAgICAgIGlmICghYWRqdXN0X2Nvbm5lY3Rpb25zX2Zvcl91aWQgKGQtPmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkLCAxKSkKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAvKiBDcmVhdGUgYW5kIGNhY2hlIGEgc3RyaW5nIHdoaWNoIGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSAKKyAgICogcGVlciBwcm9jZXNzOyB1c2VkIGZvciBsb2dnaW5nIHB1cnBvc2VzLgorICAgKi8KKyAgaWYgKCFjYWNoZV9wZWVyX2xvZ2luZm9fc3RyaW5nIChkLCBjb25uZWN0aW9uKSkKKyAgICBnb3RvIGZhaWw7CisKKyAgLyogTm93IHRoZSBjb25uZWN0aW9uIGlzIGFjdGl2ZSwgbW92ZSBpdCBiZXR3ZWVuIGxpc3RzICovCisgIF9kYnVzX2xpc3RfdW5saW5rICgmZC0+Y29ubmVjdGlvbnMtPmluY29tcGxldGUsCisgICAgICAgICAgICAgICAgICAgICBkLT5saW5rX2luX2Nvbm5lY3Rpb25fbGlzdCk7CisgIGQtPmNvbm5lY3Rpb25zLT5uX2luY29tcGxldGUgLT0gMTsKKyAgX2RidXNfbGlzdF9hcHBlbmRfbGluayAoJmQtPmNvbm5lY3Rpb25zLT5jb21wbGV0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGQtPmxpbmtfaW5fY29ubmVjdGlvbl9saXN0KTsKKyAgZC0+Y29ubmVjdGlvbnMtPm5fY29tcGxldGVkICs9IDE7CisKKyAgX2RidXNfYXNzZXJ0IChkLT5jb25uZWN0aW9ucy0+bl9pbmNvbXBsZXRlID49IDApOworICBfZGJ1c19hc3NlcnQgKGQtPmNvbm5lY3Rpb25zLT5uX2NvbXBsZXRlZCA+IDApOworCisgIC8qIFNlZSBpZiB3ZSBjYW4gcmVtb3ZlIHRoZSB0aW1lb3V0ICovCisgIGJ1c19jb25uZWN0aW9uc19leHBpcmVfaW5jb21wbGV0ZSAoZC0+Y29ubmVjdGlvbnMpOworCisgIF9kYnVzX2Fzc2VydCAoYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChjb25uZWN0aW9uKSk7CisgIAorICByZXR1cm4gVFJVRTsKK2ZhaWw6CisgIEJVU19TRVRfT09NIChlcnJvcik7CisgIGRidXNfZnJlZSAoZC0+bmFtZSk7CisgIGQtPm5hbWUgPSBOVUxMOworICBpZiAoZC0+cG9saWN5KQorICAgIGJ1c19jbGllbnRfcG9saWN5X3VucmVmIChkLT5wb2xpY3kpOworICBkLT5wb2xpY3kgPSBOVUxMOworICByZXR1cm4gRkFMU0U7Cit9CisKK2NvbnN0IGNoYXIgKgorYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKyAgCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworICAKKyAgcmV0dXJuIGQtPm5hbWU7Cit9CisKKy8qKgorICogQ2hlY2sgd2hldGhlciBjb21wbGV0aW5nIHRoZSBwYXNzZWQtaW4gY29ubmVjdGlvbiB3b3VsZAorICogZXhjZWVkIGxpbWl0cywgYW5kIGlmIHNvIHNldCBlcnJvciBhbmQgcmV0dXJuICNGQUxTRQorICovCitkYnVzX2Jvb2xfdAorYnVzX2Nvbm5lY3Rpb25zX2NoZWNrX2xpbWl0cyAoQnVzQ29ubmVjdGlvbnMgICpjb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqcmVxdWVzdGluZ19jb21wbGV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvcikKK3sKKyAgdW5zaWduZWQgbG9uZyB1aWQ7CisKKyAgaWYgKGNvbm5lY3Rpb25zLT5uX2NvbXBsZXRlZCA+PQorICAgICAgYnVzX2NvbnRleHRfZ2V0X21heF9jb21wbGV0ZWRfY29ubmVjdGlvbnMgKGNvbm5lY3Rpb25zLT5jb250ZXh0KSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTElNSVRTX0VYQ0VFREVELAorICAgICAgICAgICAgICAgICAgICAgICJUaGUgbWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIGNvbm5lY3Rpb25zIGhhcyBiZWVuIHJlYWNoZWQiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3VzZXIgKHJlcXVlc3RpbmdfY29tcGxldGlvbiwgJnVpZCkpCisgICAgeworICAgICAgaWYgKGdldF9jb25uZWN0aW9uc19mb3JfdWlkIChjb25uZWN0aW9ucywgdWlkKSA+PQorICAgICAgICAgIGJ1c19jb250ZXh0X2dldF9tYXhfY29ubmVjdGlvbnNfcGVyX3VzZXIgKGNvbm5lY3Rpb25zLT5jb250ZXh0KSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9MSU1JVFNfRVhDRUVERUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgbWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIGNvbm5lY3Rpb25zIGZvciBVSUQgJWx1IGhhcyBiZWVuIHJlYWNoZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorYnVzX3BlbmRpbmdfcmVwbHlfZnJlZSAoQnVzUGVuZGluZ1JlcGx5ICpwZW5kaW5nKQoreworICBfZGJ1c192ZXJib3NlICgiRnJlZWluZyBwZW5kaW5nIHJlcGx5ICVwLCByZXBsaWVyICVwIHJlY2VpdmVyICVwIHNlcmlhbCAldVxuIiwKKyAgICAgICAgICAgICAgICAgcGVuZGluZywKKyAgICAgICAgICAgICAgICAgcGVuZGluZy0+d2lsbF9zZW5kX3JlcGx5LAorICAgICAgICAgICAgICAgICBwZW5kaW5nLT53aWxsX2dldF9yZXBseSwKKyAgICAgICAgICAgICAgICAgcGVuZGluZy0+cmVwbHlfc2VyaWFsKTsKKworICBkYnVzX2ZyZWUgKHBlbmRpbmcpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19wZW5kaW5nX3JlcGx5X3NlbmRfbm9fcmVwbHkgKEJ1c0Nvbm5lY3Rpb25zICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzUGVuZGluZ1JlcGx5ICpwZW5kaW5nKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgREJ1c01lc3NhZ2VJdGVyIGl0ZXI7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgY29uc3QgY2hhciAqZXJybXNnOworCisgIHJldHZhbCA9IEZBTFNFOworICAKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXcgKERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBkYnVzX21lc3NhZ2Vfc2V0X25vX3JlcGx5IChtZXNzYWdlLCBUUlVFKTsKKyAgCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmctPnJlcGx5X3NlcmlhbCkpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05PX1JFUExZKSkKKyAgICBnb3RvIG91dDsKKworICBlcnJtc2cgPSAiTWVzc2FnZSBkaWQgbm90IHJlY2VpdmUgYSByZXBseSAodGltZW91dCBieSBtZXNzYWdlIGJ1cykiOworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAobWVzc2FnZSwgJml0ZXIpOworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJml0ZXIsIERCVVNfVFlQRV9TVFJJTkcsICZlcnJtc2cpKQorICAgIGdvdG8gb3V0OworICAgIAorICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgcGVuZGluZy0+d2lsbF9nZXRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UpKQorICAgIGdvdG8gb3V0OworCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX3BlbmRpbmdfcmVwbHlfZXhwaXJlZCAoQnVzRXhwaXJlTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgKmxpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpkYXRhKQoreworICBCdXNQZW5kaW5nUmVwbHkgKnBlbmRpbmcgPSBsaW5rLT5kYXRhOworICBCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMgPSBkYXRhOworICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb247CisgIAorICAvKiBObyByZXBseSBpcyBmb3J0aGNvbWluZy4gU28gbnVrZSBpdCBpZiB3ZSBjYW4uIElmIG5vdCwKKyAgICogbGVhdmUgaXQgaW4gdGhlIGxpc3QgdG8gdHJ5IGV4cGlyaW5nIGFnYWluIGxhdGVyIHdoZW4gd2UKKyAgICogZ2V0IG1vcmUgbWVtb3J5LgorICAgKi8KKworICBfZGJ1c192ZXJib3NlICgiRXhwaXJpbmcgcGVuZGluZyByZXBseSAlcCwgcmVwbGllciAlcCByZWNlaXZlciAlcCBzZXJpYWwgJXVcbiIsCisgICAgICAgICAgICAgICAgIHBlbmRpbmcsCisgICAgICAgICAgICAgICAgIHBlbmRpbmctPndpbGxfc2VuZF9yZXBseSwKKyAgICAgICAgICAgICAgICAgcGVuZGluZy0+d2lsbF9nZXRfcmVwbHksCisgICAgICAgICAgICAgICAgIHBlbmRpbmctPnJlcGx5X3NlcmlhbCk7CisgIAorICB0cmFuc2FjdGlvbiA9IGJ1c190cmFuc2FjdGlvbl9uZXcgKGNvbm5lY3Rpb25zLT5jb250ZXh0KTsKKyAgaWYgKHRyYW5zYWN0aW9uID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgaWYgKCFidXNfcGVuZGluZ19yZXBseV9zZW5kX25vX3JlcGx5IChjb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nKSkKKyAgICB7CisgICAgICBidXNfdHJhbnNhY3Rpb25fY2FuY2VsX2FuZF9mcmVlICh0cmFuc2FjdGlvbik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGJ1c19leHBpcmVfbGlzdF9yZW1vdmVfbGluayAoY29ubmVjdGlvbnMtPnBlbmRpbmdfcmVwbGllcywgbGluayk7CisKKyAgYnVzX3BlbmRpbmdfcmVwbHlfZnJlZSAocGVuZGluZyk7CisgIGJ1c190cmFuc2FjdGlvbl9leGVjdXRlX2FuZF9mcmVlICh0cmFuc2FjdGlvbik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfY29ubmVjdGlvbl9kcm9wX3BlbmRpbmdfcmVwbGllcyAoQnVzQ29ubmVjdGlvbnMgICpjb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24pCit7CisgIC8qIFRoZSBEQnVzQ29ubmVjdGlvbiBpcyBhbG1vc3QgMTAwJSBmaW5hbGl6ZWQgaGVyZSwgc28geW91IGNhbid0CisgICAqIGRvIGFueXRoaW5nIHdpdGggaXQgZXhjZXB0IGNoZWNrIGZvciBwb2ludGVyIGVxdWFsaXR5CisgICAqLworICBEQnVzTGlzdCAqbGluazsKKworICBfZGJ1c192ZXJib3NlICgiRHJvcHBpbmcgcGVuZGluZyByZXBsaWVzIHRoYXQgaW52b2x2ZSBjb25uZWN0aW9uICVwXG4iLAorICAgICAgICAgICAgICAgICBjb25uZWN0aW9uKTsKKyAgCisgIGxpbmsgPSBidXNfZXhwaXJlX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKGNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpuZXh0OworICAgICAgQnVzUGVuZGluZ1JlcGx5ICpwZW5kaW5nOworCisgICAgICBuZXh0ID0gYnVzX2V4cGlyZV9saXN0X2dldF9uZXh0X2xpbmsgKGNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmspOworICAgICAgcGVuZGluZyA9IGxpbmstPmRhdGE7CisKKyAgICAgIGlmIChwZW5kaW5nLT53aWxsX2dldF9yZXBseSA9PSBjb25uZWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgLyogV2UgZG9uJ3QgbmVlZCB0byB0cmFjayB0aGlzIHBlbmRpbmcgcmVwbHkgYW55bW9yZSAqLworCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkRyb3BwaW5nIHBlbmRpbmcgcmVwbHkgJXAsIHJlcGxpZXIgJXAgcmVjZWl2ZXIgJXAgc2VyaWFsICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZy0+d2lsbF9zZW5kX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmctPndpbGxfZ2V0X3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmctPnJlcGx5X3NlcmlhbCk7CisgICAgICAgICAgCisgICAgICAgICAgYnVzX2V4cGlyZV9saXN0X3JlbW92ZV9saW5rIChjb25uZWN0aW9ucy0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluayk7CisgICAgICAgICAgYnVzX3BlbmRpbmdfcmVwbHlfZnJlZSAocGVuZGluZyk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHBlbmRpbmctPndpbGxfc2VuZF9yZXBseSA9PSBjb25uZWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgLyogVGhlIHJlcGx5IGlzbid0IGdvaW5nIHRvIGJlIHNlbnQsIHNvIHNldCB0aGluZ3MKKyAgICAgICAgICAgKiB1cCBzbyBpdCB3aWxsIGJlIGV4cGlyZWQgcmlnaHQgYXdheQorICAgICAgICAgICAqLworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJXaWxsIGV4cGlyZSBwZW5kaW5nIHJlcGx5ICVwLCByZXBsaWVyICVwIHJlY2VpdmVyICVwIHNlcmlhbCAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmctPndpbGxfc2VuZF9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLT53aWxsX2dldF9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLT5yZXBseV9zZXJpYWwpOworICAgICAgICAgIAorICAgICAgICAgIHBlbmRpbmctPndpbGxfc2VuZF9yZXBseSA9IE5VTEw7CisgICAgICAgICAgcGVuZGluZy0+ZXhwaXJlX2l0ZW0uYWRkZWRfdHZfc2VjID0gMDsKKyAgICAgICAgICBwZW5kaW5nLT5leHBpcmVfaXRlbS5hZGRlZF90dl91c2VjID0gMDsKKworICAgICAgICAgIGJ1c19leHBpcmVfbGlzdF9yZWNoZWNrX2ltbWVkaWF0ZWx5IChjb25uZWN0aW9ucy0+cGVuZGluZ19yZXBsaWVzKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9Cit9CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgQnVzUGVuZGluZ1JlcGx5ICpwZW5kaW5nOworICBCdXNDb25uZWN0aW9ucyAgKmNvbm5lY3Rpb25zOworfSBDYW5jZWxQZW5kaW5nUmVwbHlEYXRhOworCitzdGF0aWMgdm9pZAorY2FuY2VsX3BlbmRpbmdfcmVwbHkgKHZvaWQgKmRhdGEpCit7CisgIENhbmNlbFBlbmRpbmdSZXBseURhdGEgKmQgPSBkYXRhOworCisgIF9kYnVzX3ZlcmJvc2UgKCJkID0gJXBcbiIsIGQpOworICAKKyAgaWYgKCFidXNfZXhwaXJlX2xpc3RfcmVtb3ZlIChkLT5jb25uZWN0aW9ucy0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkLT5wZW5kaW5nLT5leHBpcmVfaXRlbSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgicGVuZGluZyByZXBseSBkaWQgbm90IGV4aXN0IHRvIGJlIGNhbmNlbGxlZCIpOworCisgIGJ1c19wZW5kaW5nX3JlcGx5X2ZyZWUgKGQtPnBlbmRpbmcpOyAvKiBzaW5jZSBpdCdzIGJlZW4gY2FuY2VsbGVkICovCit9CisKK3N0YXRpYyB2b2lkCitjYW5jZWxfcGVuZGluZ19yZXBseV9kYXRhX2ZyZWUgKHZvaWQgKmRhdGEpCit7CisgIENhbmNlbFBlbmRpbmdSZXBseURhdGEgKmQgPSBkYXRhOworCisgIF9kYnVzX3ZlcmJvc2UgKCJkID0gJXBcbiIsIGQpOworICAKKyAgLyogZC0+cGVuZGluZyBzaG91bGQgYmUgZWl0aGVyIGZyZWVkIG9yIHN0aWxsCisgICAqIGluIHRoZSBsaXN0IG9mIHBlbmRpbmcgcmVwbGllcyAob3duZWQgYnkgc29tZW9uZQorICAgKiBlbHNlKQorICAgKi8KKyAgCisgIGRidXNfZnJlZSAoZCk7Cit9CisKKy8qCisgKiBSZWNvcmQgdGhhdCBhIHJlcGx5IGlzIGFsbG93ZWQ7IHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitidXNfY29ubmVjdGlvbnNfZXhwZWN0X3JlcGx5IChCdXNDb25uZWN0aW9ucyAgKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqd2lsbF9nZXRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgKndpbGxfc2VuZF9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAqcmVwbHlfdG9fdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IpCit7CisgIEJ1c1BlbmRpbmdSZXBseSAqcGVuZGluZzsKKyAgZGJ1c191aW50MzJfdCByZXBseV9zZXJpYWw7CisgIERCdXNMaXN0ICpsaW5rOworICBDYW5jZWxQZW5kaW5nUmVwbHlEYXRhICpjcHJkOworICBpbnQgY291bnQ7CisKKyAgX2RidXNfYXNzZXJ0ICh3aWxsX2dldF9yZXBseSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0ICh3aWxsX3NlbmRfcmVwbHkgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocmVwbHlfdG9fdGhpcyAhPSBOVUxMKTsKKyAgCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X25vX3JlcGx5IChyZXBseV90b190aGlzKSkKKyAgICByZXR1cm4gVFJVRTsgLyogd2Ugd29uJ3QgYWxsb3cgYSByZXBseSwgc2luY2UgY2xpZW50IGRvZXNuJ3QgY2FyZSBmb3Igb25lLiAqLworICAKKyAgcmVwbHlfc2VyaWFsID0gZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKHJlcGx5X3RvX3RoaXMpOworCisgIGxpbmsgPSBidXNfZXhwaXJlX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKGNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMpOworICBjb3VudCA9IDA7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgcGVuZGluZyA9IGxpbmstPmRhdGE7CisKKyAgICAgIGlmIChwZW5kaW5nLT5yZXBseV9zZXJpYWwgPT0gcmVwbHlfc2VyaWFsICYmCisgICAgICAgICAgcGVuZGluZy0+d2lsbF9nZXRfcmVwbHkgPT0gd2lsbF9nZXRfcmVwbHkgJiYKKyAgICAgICAgICBwZW5kaW5nLT53aWxsX3NlbmRfcmVwbHkgPT0gd2lsbF9zZW5kX3JlcGx5KQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlIGhhcyB0aGUgc2FtZSByZXBseSBzZXJpYWwgYXMgYSBjdXJyZW50bHktb3V0c3RhbmRpbmcgZXhpc3RpbmcgbWV0aG9kIGNhbGwiKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgbGluayA9IGJ1c19leHBpcmVfbGlzdF9nZXRfbmV4dF9saW5rIChjb25uZWN0aW9ucy0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rKTsKKyAgICAgIGlmIChwZW5kaW5nLT53aWxsX2dldF9yZXBseSA9PSB3aWxsX2dldF9yZXBseSkKKyAgICAgICAgKytjb3VudDsKKyAgICB9CisgIAorICBpZiAoY291bnQgPj0KKyAgICAgIGJ1c19jb250ZXh0X2dldF9tYXhfcmVwbGllc19wZXJfY29ubmVjdGlvbiAoY29ubmVjdGlvbnMtPmNvbnRleHQpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9MSU1JVFNfRVhDRUVERUQsCisJCSAgICAgICJUaGUgbWF4aW11bSBudW1iZXIgb2YgcGVuZGluZyByZXBsaWVzIHBlciBjb25uZWN0aW9uIGhhcyBiZWVuIHJlYWNoZWQiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcGVuZGluZyA9IGRidXNfbmV3MCAoQnVzUGVuZGluZ1JlcGx5LCAxKTsKKyAgaWYgKHBlbmRpbmcgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICAvKiBzbyB3ZSBjYW4gc2VlIGEgbm90LXlldC1hZGRlZCBwZW5kaW5nIHJlcGx5ICovCisgIHBlbmRpbmctPmV4cGlyZV9pdGVtLmFkZGVkX3R2X3NlYyA9IDE7CisgIHBlbmRpbmctPmV4cGlyZV9pdGVtLmFkZGVkX3R2X3VzZWMgPSAxOworI2VuZGlmCisKKyAgcGVuZGluZy0+d2lsbF9nZXRfcmVwbHkgPSB3aWxsX2dldF9yZXBseTsKKyAgcGVuZGluZy0+d2lsbF9zZW5kX3JlcGx5ID0gd2lsbF9zZW5kX3JlcGx5OworICBwZW5kaW5nLT5yZXBseV9zZXJpYWwgPSByZXBseV9zZXJpYWw7CisgIAorICBjcHJkID0gZGJ1c19uZXcwIChDYW5jZWxQZW5kaW5nUmVwbHlEYXRhLCAxKTsKKyAgaWYgKGNwcmQgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgYnVzX3BlbmRpbmdfcmVwbHlfZnJlZSAocGVuZGluZyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKCFidXNfZXhwaXJlX2xpc3RfYWRkIChjb25uZWN0aW9ucy0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwZW5kaW5nLT5leHBpcmVfaXRlbSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGRidXNfZnJlZSAoY3ByZCk7CisgICAgICBidXNfcGVuZGluZ19yZXBseV9mcmVlIChwZW5kaW5nKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFidXNfdHJhbnNhY3Rpb25fYWRkX2NhbmNlbF9ob29rICh0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxfcGVuZGluZ19yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbF9wZW5kaW5nX3JlcGx5X2RhdGFfZnJlZSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGJ1c19leHBpcmVfbGlzdF9yZW1vdmUgKGNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMsICZwZW5kaW5nLT5leHBpcmVfaXRlbSk7CisgICAgICBkYnVzX2ZyZWUgKGNwcmQpOworICAgICAgYnVzX3BlbmRpbmdfcmVwbHlfZnJlZSAocGVuZGluZyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBjcHJkLT5wZW5kaW5nID0gcGVuZGluZzsKKyAgY3ByZC0+Y29ubmVjdGlvbnMgPSBjb25uZWN0aW9uczsKKyAgCisgIF9kYnVzX2dldF9tb25vdG9uaWNfdGltZSAoJnBlbmRpbmctPmV4cGlyZV9pdGVtLmFkZGVkX3R2X3NlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVuZGluZy0+ZXhwaXJlX2l0ZW0uYWRkZWRfdHZfdXNlYyk7CisKKyAgX2RidXNfdmVyYm9zZSAoIkFkZGVkIHBlbmRpbmcgcmVwbHkgJXAsIHJlcGxpZXIgJXAgcmVjZWl2ZXIgJXAgc2VyaWFsICV1XG4iLAorICAgICAgICAgICAgICAgICBwZW5kaW5nLAorICAgICAgICAgICAgICAgICBwZW5kaW5nLT53aWxsX3NlbmRfcmVwbHksCisgICAgICAgICAgICAgICAgIHBlbmRpbmctPndpbGxfZ2V0X3JlcGx5LAorICAgICAgICAgICAgICAgICBwZW5kaW5nLT5yZXBseV9zZXJpYWwpOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIERCdXNMaXN0ICAgICAgICAqbGluazsKKyAgQnVzQ29ubmVjdGlvbnMgICpjb25uZWN0aW9uczsKK30gQ2hlY2tQZW5kaW5nUmVwbHlEYXRhOworCitzdGF0aWMgdm9pZAorY2FuY2VsX2NoZWNrX3BlbmRpbmdfcmVwbHkgKHZvaWQgKmRhdGEpCit7CisgIENoZWNrUGVuZGluZ1JlcGx5RGF0YSAqZCA9IGRhdGE7CisKKyAgX2RidXNfdmVyYm9zZSAoImQgPSAlcFxuIixkKTsKKworICBidXNfZXhwaXJlX2xpc3RfYWRkX2xpbmsgKGQtPmNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+bGluayk7CisgIGQtPmxpbmsgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfcGVuZGluZ19yZXBseV9kYXRhX2ZyZWUgKHZvaWQgKmRhdGEpCit7CisgIENoZWNrUGVuZGluZ1JlcGx5RGF0YSAqZCA9IGRhdGE7CisKKyAgX2RidXNfdmVyYm9zZSAoImQgPSAlcFxuIixkKTsKKyAgCisgIGlmIChkLT5saW5rICE9IE5VTEwpCisgICAgeworICAgICAgQnVzUGVuZGluZ1JlcGx5ICpwZW5kaW5nID0gZC0+bGluay0+ZGF0YTsKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0ICghYnVzX2V4cGlyZV9saXN0X2NvbnRhaW5zX2l0ZW0gKGQtPmNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlbmRpbmctPmV4cGlyZV9pdGVtKSk7CisgICAgICAKKyAgICAgIGJ1c19wZW5kaW5nX3JlcGx5X2ZyZWUgKHBlbmRpbmcpOworICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGQtPmxpbmspOworICAgIH0KKyAgCisgIGRidXNfZnJlZSAoZCk7Cit9CisKKy8qCisgKiBDaGVjayB3aGV0aGVyIGEgcmVwbHkgaXMgYWxsb3dlZCwgcmVtb3ZlIEJ1c1BlbmRpbmdSZXBseQorICogaWYgc28sIHJldHVybiBUUlVFIGlmIHNvLgorICovCitkYnVzX2Jvb2xfdAorYnVzX2Nvbm5lY3Rpb25zX2NoZWNrX3JlcGx5IChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKnNlbmRpbmdfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpyZWNlaXZpbmdfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICpyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBDaGVja1BlbmRpbmdSZXBseURhdGEgKmNwcmQ7CisgIERCdXNMaXN0ICpsaW5rOworICBkYnVzX3VpbnQzMl90IHJlcGx5X3NlcmlhbDsKKyAgCisgIF9kYnVzX2Fzc2VydCAoc2VuZGluZ19yZXBseSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChyZWNlaXZpbmdfcmVwbHkgIT0gTlVMTCk7CisKKyAgcmVwbHlfc2VyaWFsID0gZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKHJlcGx5KTsKKworICBsaW5rID0gYnVzX2V4cGlyZV9saXN0X2dldF9maXJzdF9saW5rIChjb25uZWN0aW9ucy0+cGVuZGluZ19yZXBsaWVzKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBCdXNQZW5kaW5nUmVwbHkgKnBlbmRpbmcgPSBsaW5rLT5kYXRhOworCisgICAgICBpZiAocGVuZGluZy0+cmVwbHlfc2VyaWFsID09IHJlcGx5X3NlcmlhbCAmJgorICAgICAgICAgIHBlbmRpbmctPndpbGxfZ2V0X3JlcGx5ID09IHJlY2VpdmluZ19yZXBseSAmJgorICAgICAgICAgIHBlbmRpbmctPndpbGxfc2VuZF9yZXBseSA9PSBzZW5kaW5nX3JlcGx5KQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZvdW5kIHBlbmRpbmcgcmVwbHkgd2l0aCBzZXJpYWwgJXVcbiIsIHJlcGx5X3NlcmlhbCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgbGluayA9IGJ1c19leHBpcmVfbGlzdF9nZXRfbmV4dF9saW5rIChjb25uZWN0aW9ucy0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rKTsKKyAgICB9CisKKyAgaWYgKGxpbmsgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiTm8gcGVuZGluZyByZXBseSBleHBlY3RlZFxuIik7CisKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgY3ByZCA9IGRidXNfbmV3MCAoQ2hlY2tQZW5kaW5nUmVwbHlEYXRhLCAxKTsKKyAgaWYgKGNwcmQgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmICghYnVzX3RyYW5zYWN0aW9uX2FkZF9jYW5jZWxfaG9vayAodHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsX2NoZWNrX3BlbmRpbmdfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ByZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19wZW5kaW5nX3JlcGx5X2RhdGFfZnJlZSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGRidXNfZnJlZSAoY3ByZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGNwcmQtPmxpbmsgPSBsaW5rOworICBjcHJkLT5jb25uZWN0aW9ucyA9IGNvbm5lY3Rpb25zOworICAKKyAgYnVzX2V4cGlyZV9saXN0X3VubGluayAoY29ubmVjdGlvbnMtPnBlbmRpbmdfcmVwbGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGluayk7CisgIAorICBfZGJ1c19hc3NlcnQgKCFidXNfZXhwaXJlX2xpc3RfY29udGFpbnNfaXRlbSAoY29ubmVjdGlvbnMtPnBlbmRpbmdfcmVwbGllcywgbGluay0+ZGF0YSkpOworCisgIHJldHVybiBUUlVFOworfQorCisvKgorICogVHJhbnNhY3Rpb25zCisgKgorICogTm90ZSB0aGF0IHRoaXMgaXMgZmFpcmx5IGZyYWdpbGU7IGluIHBhcnRpY3VsYXIsIGRvbid0IHRyeSB0byB1c2UKKyAqIG9uZSB0cmFuc2FjdGlvbiBhY3Jvc3MgYW55IG1haW4gbG9vcCBpdGVyYXRpb25zLgorICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbjsKKyAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2U7CisgIERCdXNQcmVhbGxvY2F0ZWRTZW5kICpwcmVhbGxvY2F0ZWQ7Cit9IE1lc3NhZ2VUb1NlbmQ7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEJ1c1RyYW5zYWN0aW9uQ2FuY2VsRnVuY3Rpb24gY2FuY2VsX2Z1bmN0aW9uOworICBEQnVzRnJlZUZ1bmN0aW9uIGZyZWVfZGF0YV9mdW5jdGlvbjsKKyAgdm9pZCAqZGF0YTsKK30gQ2FuY2VsSG9vazsKKworc3RydWN0IEJ1c1RyYW5zYWN0aW9uCit7CisgIERCdXNMaXN0ICpjb25uZWN0aW9uczsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgREJ1c0xpc3QgKmNhbmNlbF9ob29rczsKK307CisKK3N0YXRpYyB2b2lkCittZXNzYWdlX3RvX3NlbmRfZnJlZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVRvU2VuZCAgKnRvX3NlbmQpCit7CisgIGlmICh0b19zZW5kLT5tZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAodG9fc2VuZC0+bWVzc2FnZSk7CisKKyAgaWYgKHRvX3NlbmQtPnByZWFsbG9jYXRlZCkKKyAgICBkYnVzX2Nvbm5lY3Rpb25fZnJlZV9wcmVhbGxvY2F0ZWRfc2VuZCAoY29ubmVjdGlvbiwgdG9fc2VuZC0+cHJlYWxsb2NhdGVkKTsKKworICBkYnVzX2ZyZWUgKHRvX3NlbmQpOworfQorCitzdGF0aWMgdm9pZAorY2FuY2VsX2hvb2tfY2FuY2VsICh2b2lkICplbGVtZW50LAorICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKQoreworICBDYW5jZWxIb29rICpjaCA9IGVsZW1lbnQ7CisKKyAgX2RidXNfdmVyYm9zZSAoIlJ1bm5pbmcgdHJhbnNhY3Rpb24gY2FuY2VsIGhvb2tcbiIpOworICAKKyAgaWYgKGNoLT5jYW5jZWxfZnVuY3Rpb24pCisgICAgKCogY2gtPmNhbmNlbF9mdW5jdGlvbikgKGNoLT5kYXRhKTsgIAorfQorCitzdGF0aWMgdm9pZAorY2FuY2VsX2hvb2tfZnJlZSAodm9pZCAqZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpCit7CisgIENhbmNlbEhvb2sgKmNoID0gZWxlbWVudDsKKworICBpZiAoY2gtPmZyZWVfZGF0YV9mdW5jdGlvbikKKyAgICAoKiBjaC0+ZnJlZV9kYXRhX2Z1bmN0aW9uKSAoY2gtPmRhdGEpOworCisgIGRidXNfZnJlZSAoY2gpOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9jYW5jZWxfaG9va3MgKEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbikKK3sKKyAgX2RidXNfbGlzdF9mb3JlYWNoICgmdHJhbnNhY3Rpb24tPmNhbmNlbF9ob29rcywKKyAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxfaG9va19mcmVlLCBOVUxMKTsKKyAgCisgIF9kYnVzX2xpc3RfY2xlYXIgKCZ0cmFuc2FjdGlvbi0+Y2FuY2VsX2hvb2tzKTsKK30KKworQnVzVHJhbnNhY3Rpb24qCitidXNfdHJhbnNhY3Rpb25fbmV3IChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb247CisKKyAgdHJhbnNhY3Rpb24gPSBkYnVzX25ldzAgKEJ1c1RyYW5zYWN0aW9uLCAxKTsKKyAgaWYgKHRyYW5zYWN0aW9uID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgdHJhbnNhY3Rpb24tPmNvbnRleHQgPSBjb250ZXh0OworICAKKyAgcmV0dXJuIHRyYW5zYWN0aW9uOworfQorCitCdXNDb250ZXh0KgorYnVzX3RyYW5zYWN0aW9uX2dldF9jb250ZXh0IChCdXNUcmFuc2FjdGlvbiAgKnRyYW5zYWN0aW9uKQoreworICByZXR1cm4gdHJhbnNhY3Rpb24tPmNvbnRleHQ7Cit9CisKK0J1c0Nvbm5lY3Rpb25zKgorYnVzX3RyYW5zYWN0aW9uX2dldF9jb25uZWN0aW9ucyAoQnVzVHJhbnNhY3Rpb24gICp0cmFuc2FjdGlvbikKK3sKKyAgcmV0dXJuIGJ1c19jb250ZXh0X2dldF9jb25uZWN0aW9ucyAodHJhbnNhY3Rpb24tPmNvbnRleHQpOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSkKK3sKKyAgLyogV2UgaGF2ZSB0byBzZXQgdGhlIHNlbmRlciB0byB0aGUgZHJpdmVyLCBhbmQgaGF2ZQorICAgKiB0byBjaGVjayBzZWN1cml0eSBwb2xpY3kgc2luY2UgaXQgd2FzIG5vdCBkb25lIGluCisgICAqIGRpc3BhdGNoLmMKKyAgICovCisgIF9kYnVzX3ZlcmJvc2UgKCJTZW5kaW5nICVzICVzICVzIGZyb20gZHJpdmVyXG4iLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkgOiAiKG5vIGludGVyZmFjZSkiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgOiAiKG5vIG1lbWJlcikiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSA6ICIobm8gZXJyb3IgbmFtZSkiKTsKKyAgICAgICAgICAgICAgICAgCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9zZW5kZXIgKG1lc3NhZ2UsIERCVVNfU0VSVklDRV9EQlVTKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbikpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgLyogYnVzIGRyaXZlciBuZXZlciB3YW50cyBhIHJlcGx5ICovCisgIGRidXNfbWVzc2FnZV9zZXRfbm9fcmVwbHkgKG1lc3NhZ2UsIFRSVUUpOworICAKKyAgLyogSWYgc2VjdXJpdHkgcG9saWN5IGRvZXNuJ3QgYWxsb3cgdGhlIG1lc3NhZ2UsIHdlIHNpbGVudGx5CisgICAqIGVhdCBpdDsgdGhlIGRyaXZlciBkb2Vzbid0IGNhcmUgYWJvdXQgZ2V0dGluZyBhIHJlcGx5LgorICAgKi8KKyAgaWYgKCFidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kgKGJ1c190cmFuc2FjdGlvbl9nZXRfY29udGV4dCAodHJhbnNhY3Rpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBjb25uZWN0aW9uLCBjb25uZWN0aW9uLCBtZXNzYWdlLCBOVUxMKSkKKyAgICByZXR1cm4gVFJVRTsKKworICByZXR1cm4gYnVzX3RyYW5zYWN0aW9uX3NlbmQgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLCBtZXNzYWdlKTsKK30KKworZGJ1c19ib29sX3QKK2J1c190cmFuc2FjdGlvbl9zZW5kIChCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UpCit7CisgIE1lc3NhZ2VUb1NlbmQgKnRvX3NlbmQ7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworICBEQnVzTGlzdCAqbGluazsKKworICBfZGJ1c192ZXJib3NlICgiICB0cnlpbmcgdG8gYWRkICVzIGludGVyZmFjZT0lcyBtZW1iZXI9JXMgZXJyb3I9JXMgdG8gdHJhbnNhY3Rpb24lc1xuIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUiA/ICJlcnJvciIgOgorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSkgIT0gMCA/ICJyZXBseSIgOgorICAgICAgICAgICAgICAgICAibWVzc2FnZSIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSA6ICIodW5zZXQpIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpIDogIih1bnNldCkiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSA6ICIodW5zZXQpIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pID8KKyAgICAgICAgICAgICAgICAgIiIgOiAiIChkaXNjb25uZWN0ZWQpIik7CisKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgIT0gTlVMTCk7CisgIAorICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICByZXR1cm4gVFJVRTsgLyogc2lsZW50bHkgaWdub3JlIGRpc2Nvbm5lY3RlZCBjb25uZWN0aW9ucyAqLworICAKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisgIAorICB0b19zZW5kID0gZGJ1c19uZXcgKE1lc3NhZ2VUb1NlbmQsIDEpOworICBpZiAodG9fc2VuZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgdG9fc2VuZC0+cHJlYWxsb2NhdGVkID0gZGJ1c19jb25uZWN0aW9uX3ByZWFsbG9jYXRlX3NlbmQgKGNvbm5lY3Rpb24pOworICBpZiAodG9fc2VuZC0+cHJlYWxsb2NhdGVkID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19mcmVlICh0b19zZW5kKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9ICAKKyAgCisgIGRidXNfbWVzc2FnZV9yZWYgKG1lc3NhZ2UpOworICB0b19zZW5kLT5tZXNzYWdlID0gbWVzc2FnZTsKKyAgdG9fc2VuZC0+dHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjsKKworICBfZGJ1c192ZXJib3NlICgiYWJvdXQgdG8gcHJlcGVuZCBtZXNzYWdlXG4iKTsKKyAgCisgIGlmICghX2RidXNfbGlzdF9wcmVwZW5kICgmZC0+dHJhbnNhY3Rpb25fbWVzc2FnZXMsIHRvX3NlbmQpKQorICAgIHsKKyAgICAgIG1lc3NhZ2VfdG9fc2VuZF9mcmVlIChjb25uZWN0aW9uLCB0b19zZW5kKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoInByZXBlbmRlZCBtZXNzYWdlXG4iKTsKKyAgCisgIC8qIFNlZSBpZiB3ZSBhbHJlYWR5IGhhZCB0aGlzIGNvbm5lY3Rpb24gaW4gdGhlIGxpc3QKKyAgICogZm9yIHRoaXMgdHJhbnNhY3Rpb24uIElmIHdlIGhhdmUgYSBwZW5kaW5nIG1lc3NhZ2UsCisgICAqIHRoZW4gd2Ugc2hvdWxkIGFscmVhZHkgYmUgaW4gdHJhbnNhY3Rpb24tPmNvbm5lY3Rpb25zCisgICAqLworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmQtPnRyYW5zYWN0aW9uX21lc3NhZ2VzKTsKKyAgX2RidXNfYXNzZXJ0IChsaW5rLT5kYXRhID09IHRvX3NlbmQpOworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmZC0+dHJhbnNhY3Rpb25fbWVzc2FnZXMsIGxpbmspOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIE1lc3NhZ2VUb1NlbmQgKm0gPSBsaW5rLT5kYXRhOworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZkLT50cmFuc2FjdGlvbl9tZXNzYWdlcywgbGluayk7CisgICAgICAKKyAgICAgIGlmIChtLT50cmFuc2FjdGlvbiA9PSB0cmFuc2FjdGlvbikKKyAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgICAgbGluayA9IG5leHQ7CisgICAgfQorCisgIGlmIChsaW5rID09IE5VTEwpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19saXN0X3ByZXBlbmQgKCZ0cmFuc2FjdGlvbi0+Y29ubmVjdGlvbnMsIGNvbm5lY3Rpb24pKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbGlzdF9yZW1vdmUgKCZkLT50cmFuc2FjdGlvbl9tZXNzYWdlcywgdG9fc2VuZCk7CisgICAgICAgICAgbWVzc2FnZV90b19zZW5kX2ZyZWUgKGNvbm5lY3Rpb24sIHRvX3NlbmQpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2Nvbm5lY3Rpb25fY2FuY2VsX3RyYW5zYWN0aW9uIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24pCit7CisgIERCdXNMaXN0ICpsaW5rOworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKyAgCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworICAKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZkLT50cmFuc2FjdGlvbl9tZXNzYWdlcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgTWVzc2FnZVRvU2VuZCAqbSA9IGxpbmstPmRhdGE7CisgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmQtPnRyYW5zYWN0aW9uX21lc3NhZ2VzLCBsaW5rKTsKKyAgICAgIAorICAgICAgaWYgKG0tPnRyYW5zYWN0aW9uID09IHRyYW5zYWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAoJmQtPnRyYW5zYWN0aW9uX21lc3NhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmspOworICAgICAgICAgIAorICAgICAgICAgIG1lc3NhZ2VfdG9fc2VuZF9mcmVlIChjb25uZWN0aW9uLCBtKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KK30KKwordm9pZAorYnVzX3RyYW5zYWN0aW9uX2NhbmNlbF9hbmRfZnJlZSAoQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworICBfZGJ1c192ZXJib3NlICgiVFJBTlNBQ1RJT046IGNhbmNlbGxlZFxuIik7CisgIAorICB3aGlsZSAoKGNvbm5lY3Rpb24gPSBfZGJ1c19saXN0X3BvcF9maXJzdCAoJnRyYW5zYWN0aW9uLT5jb25uZWN0aW9ucykpKQorICAgIGNvbm5lY3Rpb25fY2FuY2VsX3RyYW5zYWN0aW9uIChjb25uZWN0aW9uLCB0cmFuc2FjdGlvbik7CisKKyAgX2RidXNfYXNzZXJ0ICh0cmFuc2FjdGlvbi0+Y29ubmVjdGlvbnMgPT0gTlVMTCk7CisKKyAgX2RidXNfbGlzdF9mb3JlYWNoICgmdHJhbnNhY3Rpb24tPmNhbmNlbF9ob29rcywKKyAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxfaG9va19jYW5jZWwsIE5VTEwpOworCisgIGZyZWVfY2FuY2VsX2hvb2tzICh0cmFuc2FjdGlvbik7CisgIAorICBkYnVzX2ZyZWUgKHRyYW5zYWN0aW9uKTsKK30KKworc3RhdGljIHZvaWQKK2Nvbm5lY3Rpb25fZXhlY3V0ZV90cmFuc2FjdGlvbiAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbikKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworICAKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisKKyAgLyogU2VuZCB0aGUgcXVldWUgaW4gb3JkZXIgKEZJRk8pICovCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9sYXN0X2xpbmsgKCZkLT50cmFuc2FjdGlvbl9tZXNzYWdlcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgTWVzc2FnZVRvU2VuZCAqbSA9IGxpbmstPmRhdGE7CisgICAgICBEQnVzTGlzdCAqcHJldiA9IF9kYnVzX2xpc3RfZ2V0X3ByZXZfbGluayAoJmQtPnRyYW5zYWN0aW9uX21lc3NhZ2VzLCBsaW5rKTsKKyAgICAgIAorICAgICAgaWYgKG0tPnRyYW5zYWN0aW9uID09IHRyYW5zYWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAoJmQtPnRyYW5zYWN0aW9uX21lc3NhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmspOworCisgICAgICAgICAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobS0+bWVzc2FnZSkgIT0gTlVMTCk7CisgICAgICAgICAgCisgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX3NlbmRfcHJlYWxsb2NhdGVkIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS0+cHJlYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS0+bWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICAgICAgbS0+cHJlYWxsb2NhdGVkID0gTlVMTDsgLyogc28gd2UgZG9uJ3QgZG91YmxlLWZyZWUgaXQgKi8KKyAgICAgICAgICAKKyAgICAgICAgICBtZXNzYWdlX3RvX3NlbmRfZnJlZSAoY29ubmVjdGlvbiwgbSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICBsaW5rID0gcHJldjsKKyAgICB9Cit9CisKK3ZvaWQKK2J1c190cmFuc2FjdGlvbl9leGVjdXRlX2FuZF9mcmVlIChCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24pCit7CisgIC8qIEZvciBlYWNoIGNvbm5lY3Rpb24gaW4gdHJhbnNhY3Rpb24tPmNvbm5lY3Rpb25zCisgICAqIHNlbmQgdGhlIG1lc3NhZ2VzCisgICAqLworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworICBfZGJ1c192ZXJib3NlICgiVFJBTlNBQ1RJT046IGV4ZWN1dGluZ1xuIik7CisgIAorICB3aGlsZSAoKGNvbm5lY3Rpb24gPSBfZGJ1c19saXN0X3BvcF9maXJzdCAoJnRyYW5zYWN0aW9uLT5jb25uZWN0aW9ucykpKQorICAgIGNvbm5lY3Rpb25fZXhlY3V0ZV90cmFuc2FjdGlvbiAoY29ubmVjdGlvbiwgdHJhbnNhY3Rpb24pOworCisgIF9kYnVzX2Fzc2VydCAodHJhbnNhY3Rpb24tPmNvbm5lY3Rpb25zID09IE5VTEwpOworCisgIGZyZWVfY2FuY2VsX2hvb2tzICh0cmFuc2FjdGlvbik7CisgIAorICBkYnVzX2ZyZWUgKHRyYW5zYWN0aW9uKTsKK30KKworc3RhdGljIHZvaWQKK2J1c19jb25uZWN0aW9uX3JlbW92ZV90cmFuc2FjdGlvbnMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBNZXNzYWdlVG9TZW5kICp0b19zZW5kOworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKyAgCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworICAKKyAgd2hpbGUgKCh0b19zZW5kID0gX2RidXNfbGlzdF9nZXRfZmlyc3QgKCZkLT50cmFuc2FjdGlvbl9tZXNzYWdlcykpKQorICAgIHsKKyAgICAgIC8qIG9ubHkgaGFzIGFuIGVmZmVjdCBmb3IgdGhlIGZpcnN0IE1lc3NhZ2VUb1NlbmQgbGlzdGluZyB0aGlzIHRyYW5zYWN0aW9uICovCisgICAgICBfZGJ1c19saXN0X3JlbW92ZSAoJnRvX3NlbmQtPnRyYW5zYWN0aW9uLT5jb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uKTsKKworICAgICAgX2RidXNfbGlzdF9yZW1vdmUgKCZkLT50cmFuc2FjdGlvbl9tZXNzYWdlcywgdG9fc2VuZCk7CisgICAgICBtZXNzYWdlX3RvX3NlbmRfZnJlZSAoY29ubmVjdGlvbiwgdG9fc2VuZCk7CisgICAgfQorfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBEQnVzRXJyb3IgdG8gYSBtZXNzYWdlIHJlcGx5CisgKi8KK2RidXNfYm9vbF90CitidXNfdHJhbnNhY3Rpb25fc2VuZF9lcnJvcl9yZXBseSAoQnVzVHJhbnNhY3Rpb24gICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c0Vycm9yICplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgKmluX3JlcGx5X3RvKQoreworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIAorICBfZGJ1c19hc3NlcnQgKGVycm9yICE9IE5VTEwpOworICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIAorICBfZGJ1c192ZXJib3NlICgiU2VuZGluZyBlcnJvciByZXBseSAlcyBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgIGVycm9yLT5uYW1lLCBlcnJvci0+bWVzc2FnZSk7CisKKyAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X2Vycm9yIChpbl9yZXBseV90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci0+bWVzc2FnZSk7CisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3RyYW5zYWN0aW9uX2FkZF9jYW5jZWxfaG9vayAoQnVzVHJhbnNhY3Rpb24gICAgICAgICAgICAgICAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbkNhbmNlbEZ1bmN0aW9uICBjYW5jZWxfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKQoreworICBDYW5jZWxIb29rICpjaDsKKworICBjaCA9IGRidXNfbmV3IChDYW5jZWxIb29rLCAxKTsKKyAgaWYgKGNoID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX3ZlcmJvc2UgKCIgICAgIGFkZGluZyBjYW5jZWwgaG9vayBmdW5jdGlvbiA9ICVwIGRhdGEgPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgY2FuY2VsX2Z1bmN0aW9uLCBkYXRhKTsKKyAgCisgIGNoLT5jYW5jZWxfZnVuY3Rpb24gPSBjYW5jZWxfZnVuY3Rpb247CisgIGNoLT5kYXRhID0gZGF0YTsKKyAgY2gtPmZyZWVfZGF0YV9mdW5jdGlvbiA9IGZyZWVfZGF0YV9mdW5jdGlvbjsKKworICAvKiBJdCdzIGltcG9ydGFudCB0aGF0IHRoZSBob29rcyBnZXQgcnVuIGluIHJldmVyc2Ugb3JkZXIgdGhhdCB0aGV5CisgICAqIHdlcmUgYWRkZWQKKyAgICovCisgIGlmICghX2RidXNfbGlzdF9wcmVwZW5kICgmdHJhbnNhY3Rpb24tPmNhbmNlbF9ob29rcywgY2gpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAoY2gpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIERCVVNfRU5BQkxFX1NUQVRTCitpbnQKK2J1c19jb25uZWN0aW9uc19nZXRfbl9hY3RpdmUgKEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucykKK3sKKyAgcmV0dXJuIGNvbm5lY3Rpb25zLT5uX2NvbXBsZXRlZDsKK30KKworaW50CitidXNfY29ubmVjdGlvbnNfZ2V0X25faW5jb21wbGV0ZSAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zKQoreworICByZXR1cm4gY29ubmVjdGlvbnMtPm5faW5jb21wbGV0ZTsKK30KKworaW50CitidXNfY29ubmVjdGlvbnNfZ2V0X3RvdGFsX21hdGNoX3J1bGVzIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMpCit7CisgIHJldHVybiBjb25uZWN0aW9ucy0+dG90YWxfbWF0Y2hfcnVsZXM7Cit9CisKK2ludAorYnVzX2Nvbm5lY3Rpb25zX2dldF9wZWFrX21hdGNoX3J1bGVzIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMpCit7CisgIHJldHVybiBjb25uZWN0aW9ucy0+cGVha19tYXRjaF9ydWxlczsKK30KKworaW50CitidXNfY29ubmVjdGlvbnNfZ2V0X3BlYWtfbWF0Y2hfcnVsZXNfcGVyX2Nvbm4gKEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucykKK3sKKyAgcmV0dXJuIGNvbm5lY3Rpb25zLT5wZWFrX21hdGNoX3J1bGVzX3Blcl9jb25uOworfQorCitpbnQKK2J1c19jb25uZWN0aW9uc19nZXRfdG90YWxfYnVzX25hbWVzIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMpCit7CisgIHJldHVybiBjb25uZWN0aW9ucy0+dG90YWxfYnVzX25hbWVzOworfQorCitpbnQKK2J1c19jb25uZWN0aW9uc19nZXRfcGVha19idXNfbmFtZXMgKEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucykKK3sKKyAgcmV0dXJuIGNvbm5lY3Rpb25zLT5wZWFrX2J1c19uYW1lczsKK30KKworaW50CitidXNfY29ubmVjdGlvbnNfZ2V0X3BlYWtfYnVzX25hbWVzX3Blcl9jb25uIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMpCit7CisgIHJldHVybiBjb25uZWN0aW9ucy0+cGVha19idXNfbmFtZXNfcGVyX2Nvbm47Cit9CisKK2ludAorYnVzX2Nvbm5lY3Rpb25fZ2V0X3BlYWtfbWF0Y2hfcnVsZXMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKworICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgIHJldHVybiBkLT5wZWFrX21hdGNoX3J1bGVzOworfQorCitpbnQKK2J1c19jb25uZWN0aW9uX2dldF9wZWFrX2J1c19uYW1lcyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKyAgcmV0dXJuIGQtPnBlYWtfYnVzX25hbWVzOworfQorI2VuZGlmIC8qIERCVVNfRU5BQkxFX1NUQVRTICovCmRpZmYgLS1naXQgYS9kYnVzL2J1cy9jb25uZWN0aW9uLmggYi9kYnVzL2J1cy9jb25uZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkzNjAyMQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvYnVzL2Nvbm5lY3Rpb24uaApAQCAtMCwwICsxLDE1NCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBjb25uZWN0aW9uLmggIENsaWVudCBjb25uZWN0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIEJVU19DT05ORUNUSU9OX0gKKyNkZWZpbmUgQlVTX0NPTk5FQ1RJT05fSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKyNpbmNsdWRlICJidXMuaCIKKwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBCdXNDb25uZWN0aW9uRm9yZWFjaEZ1bmN0aW9uKSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpOworCisKK0J1c0Nvbm5lY3Rpb25zKiBidXNfY29ubmVjdGlvbnNfbmV3ICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOworQnVzQ29ubmVjdGlvbnMqIGJ1c19jb25uZWN0aW9uc19yZWYgICAgICAgICAgICAgICAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMpOwordm9pZCAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uc191bnJlZiAgICAgICAgICAgICAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMpOworZGJ1c19ib29sX3QgICAgIGJ1c19jb25uZWN0aW9uc19zZXR1cF9jb25uZWN0aW9uICAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK3ZvaWQgICAgICAgICAgICBidXNfY29ubmVjdGlvbnNfZm9yZWFjaCAgICAgICAgICAgKEJ1c0Nvbm5lY3Rpb25zICAgICAgICAgICAgICAgKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzQ29ubmVjdGlvbkZvcmVhY2hGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKK3ZvaWQgICAgICAgICAgICBidXNfY29ubmVjdGlvbnNfZm9yZWFjaF9hY3RpdmUgICAgKEJ1c0Nvbm5lY3Rpb25zICAgICAgICAgICAgICAgKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzQ29ubmVjdGlvbkZvcmVhY2hGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKK0J1c0NvbnRleHQqICAgICBidXNfY29ubmVjdGlvbnNfZ2V0X2NvbnRleHQgICAgICAgKEJ1c0Nvbm5lY3Rpb25zICAgICAgICAgICAgICAgKmNvbm5lY3Rpb25zKTsKK3ZvaWQgICAgICAgICAgICBidXNfY29ubmVjdGlvbnNfaW5jcmVtZW50X3N0YW1wICAgKEJ1c0Nvbm5lY3Rpb25zICAgICAgICAgICAgICAgKmNvbm5lY3Rpb25zKTsKK0J1c0NvbnRleHQqICAgICBidXNfY29ubmVjdGlvbl9nZXRfY29udGV4dCAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworQnVzQ29ubmVjdGlvbnMqIGJ1c19jb25uZWN0aW9uX2dldF9jb25uZWN0aW9ucyAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqY29ubmVjdGlvbik7CitCdXNSZWdpc3RyeSogICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X3JlZ2lzdHJ5ICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0J1c0FjdGl2YXRpb24qICBidXNfY29ubmVjdGlvbl9nZXRfYWN0aXZhdGlvbiAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworQnVzTWF0Y2htYWtlciogIGJ1c19jb25uZWN0aW9uX2dldF9tYXRjaG1ha2VyICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqY29ubmVjdGlvbik7Citjb25zdCBjaGFyICogICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X2xvZ2luZm8gICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgKmNvbm5lY3Rpb24pOworQnVzU0VMaW51eElEKiAgIGJ1c19jb25uZWN0aW9uX2dldF9zZWxpbnV4X2lkICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqY29ubmVjdGlvbik7CitkYnVzX2Jvb2xfdCAgICAgYnVzX2Nvbm5lY3Rpb25zX2NoZWNrX2xpbWl0cyAgICAgIChCdXNDb25uZWN0aW9ucyAgICAgICAgICAgICAgICpjb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAgKnJlcXVlc3RpbmdfY29tcGxldGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICAgKmVycm9yKTsKK3ZvaWQgICAgICAgICAgICBidXNfY29ubmVjdGlvbnNfZXhwaXJlX2luY29tcGxldGUgKEJ1c0Nvbm5lY3Rpb25zICAgICAgICAgICAgICAgKmNvbm5lY3Rpb25zKTsKKworZGJ1c19ib29sX3QgICAgIGJ1c19jb25uZWN0aW9uc19leHBlY3RfcmVwbHkgICAgICAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAgICAgICAgICAgICAgICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAgKndpbGxfZ2V0X3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqd2lsbF9zZW5kX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgICAgICAgICAqcmVwbHlfdG9fdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90ICAgICBidXNfY29ubmVjdGlvbnNfY2hlY2tfcmVwbHkgICAgICAgKEJ1c0Nvbm5lY3Rpb25zICAgICAgICAgICAgICAgKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gICAgICAgICAgICAgICAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgICpzZW5kaW5nX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqcmVjZWl2aW5nX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgICAgICAgICAqcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICAgICAgICplcnJvcik7CisKK2RidXNfYm9vbF90ICAgICBidXNfY29ubmVjdGlvbl9tYXJrX3N0YW1wICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworCitkYnVzX2Jvb2xfdCBidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK2NvbnN0IGNoYXIgKmJ1c19jb25uZWN0aW9uX2dldF9uYW1lICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCitkYnVzX2Jvb2xfdCBidXNfY29ubmVjdGlvbl9wcmVhbGxvY2F0ZV9vb21fZXJyb3IgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK3ZvaWQgICAgICAgIGJ1c19jb25uZWN0aW9uX3NlbmRfb29tX2Vycm9yICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICppbl9yZXBseV90byk7CisKKy8qIGNhbGxlZCBieSBzaWduYWxzLmMgKi8KK2RidXNfYm9vbF90IGJ1c19jb25uZWN0aW9uX2FkZF9tYXRjaF9ydWxlICAgICAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzTWF0Y2hSdWxlICAgKnJ1bGUpOwordm9pZCAgICAgICAgYnVzX2Nvbm5lY3Rpb25fYWRkX21hdGNoX3J1bGVfbGluayAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAqbGluayk7Cit2b2lkICAgICAgICBidXNfY29ubmVjdGlvbl9yZW1vdmVfbWF0Y2hfcnVsZSAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c01hdGNoUnVsZSAgICpydWxlKTsKK2ludCAgICAgICAgIGJ1c19jb25uZWN0aW9uX2dldF9uX21hdGNoX3J1bGVzICAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKKworCisvKiBjYWxsZWQgYnkgc2VydmljZXMuYyAqLworZGJ1c19ib29sX3QgYnVzX2Nvbm5lY3Rpb25fYWRkX293bmVkX3NlcnZpY2UgICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNTZXJ2aWNlICAgICAqc2VydmljZSk7Cit2b2lkICAgICAgICBidXNfY29ubmVjdGlvbl9yZW1vdmVfb3duZWRfc2VydmljZSAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlKTsKK3ZvaWQgICAgICAgIGJ1c19jb25uZWN0aW9uX2FkZF9vd25lZF9zZXJ2aWNlX2xpbmsgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgKmxpbmspOworaW50ICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25fc2VydmljZXNfb3duZWQgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCisvKiBjYWxsZWQgYnkgZHJpdmVyLmMgKi8KK2RidXNfYm9vbF90IGJ1c19jb25uZWN0aW9uX2NvbXBsZXRlIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgICpjb25uZWN0aW9uLAorCQkJCSAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgICAgICAgICAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICAgICAgICplcnJvcik7CisKKy8qIGNhbGxlZCBieSBkaXNwYXRjaC5jIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgZHJvcHBlZCAqLwordm9pZCAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZGlzY29ubmVjdGVkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKK2RidXNfYm9vbF90ICAgICAgYnVzX2Nvbm5lY3Rpb25faXNfaW5fdW5peF9ncm91cCAoREJ1c0Nvbm5lY3Rpb24gICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICBnaWQpOworZGJ1c19ib29sX3QgICAgICBidXNfY29ubmVjdGlvbl9nZXRfdW5peF9ncm91cHMgIChEQnVzQ29ubmVjdGlvbiAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAqKmdyb3VwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgKm5fZ3JvdXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAqZXJyb3IpOworQnVzQ2xpZW50UG9saWN5KiBidXNfY29ubmVjdGlvbl9nZXRfcG9saWN5ICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgKmNvbm5lY3Rpb24pOworCisvKiB0cmFuc2FjdGlvbiBBUEkgc28gd2UgY2FuIHNlbmQgb3Igbm90IHNlbmQgYSBibG9jayBvZiBtZXNzYWdlcyBhcyBhIHdob2xlICovCisKK3R5cGVkZWYgdm9pZCAoKiBCdXNUcmFuc2FjdGlvbkNhbmNlbEZ1bmN0aW9uKSAodm9pZCAqZGF0YSk7CisKK0J1c1RyYW5zYWN0aW9uKiBidXNfdHJhbnNhY3Rpb25fbmV3ICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CitCdXNDb250ZXh0KiAgICAgYnVzX3RyYW5zYWN0aW9uX2dldF9jb250ZXh0ICAgICAgKEJ1c1RyYW5zYWN0aW9uICAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uKTsKK0J1c0Nvbm5lY3Rpb25zKiBidXNfdHJhbnNhY3Rpb25fZ2V0X2Nvbm5lY3Rpb25zICAoQnVzVHJhbnNhY3Rpb24gICAgICAgICAgICAgICAqdHJhbnNhY3Rpb24pOworZGJ1c19ib29sX3QgICAgIGJ1c190cmFuc2FjdGlvbl9zZW5kICAgICAgICAgICAgIChCdXNUcmFuc2FjdGlvbiAgICAgICAgICAgICAgICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgICAgICAgICAqbWVzc2FnZSk7CitkYnVzX2Jvb2xfdCAgICAgYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKEJ1c1RyYW5zYWN0aW9uICAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgICAgICAgICAgICptZXNzYWdlKTsKK2RidXNfYm9vbF90ICAgICBidXNfdHJhbnNhY3Rpb25fc2VuZF9lcnJvcl9yZXBseSAoQnVzVHJhbnNhY3Rpb24gICAgICAgICAgICAgICAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNFcnJvciAgICAgICAgICAgICAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgICAgICAgICAgICppbl9yZXBseV90byk7Cit2b2lkICAgICAgICAgICAgYnVzX3RyYW5zYWN0aW9uX2NhbmNlbF9hbmRfZnJlZSAgKEJ1c1RyYW5zYWN0aW9uICAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uKTsKK3ZvaWQgICAgICAgICAgICBidXNfdHJhbnNhY3Rpb25fZXhlY3V0ZV9hbmRfZnJlZSAoQnVzVHJhbnNhY3Rpb24gICAgICAgICAgICAgICAqdHJhbnNhY3Rpb24pOworZGJ1c19ib29sX3QgICAgIGJ1c190cmFuc2FjdGlvbl9hZGRfY2FuY2VsX2hvb2sgIChCdXNUcmFuc2FjdGlvbiAgICAgICAgICAgICAgICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb25DYW5jZWxGdW5jdGlvbiAgY2FuY2VsX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pOworCisvKiBjYWxsZWQgYnkgc3RhdHMuYywgb25seSBwcmVzZW50IGlmIERCVVNfRU5BQkxFX1NUQVRTICovCitpbnQgYnVzX2Nvbm5lY3Rpb25zX2dldF9uX2FjdGl2ZSAgICAgICAgICAgICAgICAgIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMpOworaW50IGJ1c19jb25uZWN0aW9uc19nZXRfbl9pbmNvbXBsZXRlICAgICAgICAgICAgICAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zKTsKK2ludCBidXNfY29ubmVjdGlvbnNfZ2V0X3RvdGFsX21hdGNoX3J1bGVzICAgICAgICAgKEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucyk7CitpbnQgYnVzX2Nvbm5lY3Rpb25zX2dldF9wZWFrX21hdGNoX3J1bGVzICAgICAgICAgIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMpOworaW50IGJ1c19jb25uZWN0aW9uc19nZXRfcGVha19tYXRjaF9ydWxlc19wZXJfY29ubiAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zKTsKK2ludCBidXNfY29ubmVjdGlvbnNfZ2V0X3RvdGFsX2J1c19uYW1lcyAgICAgICAgICAgKEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucyk7CitpbnQgYnVzX2Nvbm5lY3Rpb25zX2dldF9wZWFrX2J1c19uYW1lcyAgICAgICAgICAgIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMpOworaW50IGJ1c19jb25uZWN0aW9uc19nZXRfcGVha19idXNfbmFtZXNfcGVyX2Nvbm4gICAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zKTsKKworaW50IGJ1c19jb25uZWN0aW9uX2dldF9wZWFrX21hdGNoX3J1bGVzICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworaW50IGJ1c19jb25uZWN0aW9uX2dldF9wZWFrX2J1c19uYW1lcyAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCisjZW5kaWYgLyogQlVTX0NPTk5FQ1RJT05fSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9idXMvZGJ1cy5zZXJ2aWNlLmluIGIvZGJ1cy9idXMvZGJ1cy5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MDk0N2MKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2J1cy9kYnVzLnNlcnZpY2UuaW4KQEAgLTAsMCArMSw5IEBACitbVW5pdF0KK0Rlc2NyaXB0aW9uPUQtQnVzIFN5c3RlbSBNZXNzYWdlIEJ1cworUmVxdWlyZXM9ZGJ1cy5zb2NrZXQKK0FmdGVyPXN5c2xvZy50YXJnZXQKKworW1NlcnZpY2VdCitFeGVjU3RhcnQ9QEVYUEFOREVEX0JJTkRJUkAvZGJ1cy1kYWVtb24gLS1zeXN0ZW0gLS1hZGRyZXNzPXN5c3RlbWQ6IC0tbm9mb3JrIC0tbm9waWRmaWxlIC0tc3lzdGVtZC1hY3RpdmF0aW9uCitFeGVjUmVsb2FkPUBFWFBBTkRFRF9CSU5ESVJAL2RidXMtc2VuZCAtLXByaW50LXJlcGx5IC0tc3lzdGVtIC0tdHlwZT1tZXRob2RfY2FsbCAtLWRlc3Q9b3JnLmZyZWVkZXNrdG9wLkRCdXMgLyBvcmcuZnJlZWRlc2t0b3AuREJ1cy5SZWxvYWRDb25maWcKK09PTVNjb3JlQWRqdXN0PS05MDAKZGlmZiAtLWdpdCBhL2RidXMvYnVzL2RidXMuc29ja2V0LmluIGIvZGJ1cy9idXMvZGJ1cy5zb2NrZXQuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRjYmU1OAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvYnVzL2RidXMuc29ja2V0LmluCkBAIC0wLDAgKzEsNSBAQAorW1VuaXRdCitEZXNjcmlwdGlvbj1ELUJ1cyBTeXN0ZW0gTWVzc2FnZSBCdXMgU29ja2V0CisKK1tTb2NrZXRdCitMaXN0ZW5TdHJlYW09QERCVVNfU1lTVEVNX1NPQ0tFVEAKZGlmZiAtLWdpdCBhL2RidXMvYnVzL2Rlc2t0b3AtZmlsZS5jIGIvZGJ1cy9idXMvZGVza3RvcC1maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU0NDFjNQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvYnVzL2Rlc2t0b3AtZmlsZS5jCkBAIC0wLDAgKzEsODAyIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRlc2t0b3AtZmlsZS5jICAuZGVza3RvcCBmaWxlIHBhcnNlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlICJkZXNrdG9wLWZpbGUuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCit0eXBlZGVmIHN0cnVjdAoreworICBjaGFyICprZXk7CisgIGNoYXIgKnZhbHVlOworfSBCdXNEZXNrdG9wRmlsZUxpbmU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGNoYXIgKnNlY3Rpb25fbmFtZTsKKyAgCisgIGludCBuX2xpbmVzOworICBCdXNEZXNrdG9wRmlsZUxpbmUgKmxpbmVzOworICBpbnQgbl9hbGxvY2F0ZWRfbGluZXM7ICAKK30gQnVzRGVza3RvcEZpbGVTZWN0aW9uOworCitzdHJ1Y3QgQnVzRGVza3RvcEZpbGUKK3sKKyAgaW50IG5fc2VjdGlvbnM7CisgIEJ1c0Rlc2t0b3BGaWxlU2VjdGlvbiAqc2VjdGlvbnM7CisgIGludCBuX2FsbG9jYXRlZF9zZWN0aW9uczsKK307CisKKy8qKgorICogUGFyc2VyIGZvciBzZXJ2aWNlIGZpbGVzLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICBEQnVzU3RyaW5nIGRhdGE7IC8qKjwgVGhlIGRhdGEgZnJvbSB0aGUgZmlsZSAqLworCisgIEJ1c0Rlc2t0b3BGaWxlICpkZXNrdG9wX2ZpbGU7IC8qKjwgVGhlIHJlc3VsdGluZyBvYmplY3QgKi8KKyAgaW50IGN1cnJlbnRfc2VjdGlvbjsgICAgLyoqPCBUaGUgY3VycmVudCBzZWN0aW9uIGJlaW5nIHBhcnNlZCAqLworICAKKyAgaW50IHBvczsgICAgICAgICAgLyoqPCBDdXJyZW50IHBvc2l0aW9uICovCisgIGludCBsZW47ICAgICAgICAgIC8qKjwgTGVuZ3RoICovCisgIGludCBsaW5lX251bTsgICAgIC8qKjwgQ3VycmVudCBsaW5lIG51bWJlciAqLworICAKK30gQnVzRGVza3RvcEZpbGVQYXJzZXI7CisKKyNkZWZpbmUgVkFMSURfS0VZX0NIQVIgMQorI2RlZmluZSBWQUxJRF9MT0NBTEVfQ0hBUiAyCitzdGF0aWMgdW5zaWduZWQgY2hhciB2YWxpZFsyNTZdID0geyAKKyAgIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIAorICAgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgCisgICAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDMgLCAweDIgLCAweDAgLCAKKyAgIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIAorICAgMHgwICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgCisgICAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDIgLCAKKyAgIDB4MCAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIAorICAgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgCisgICAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAKKyAgIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIAorICAgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgCisgICAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAKKyAgIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIAorICAgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgCisgICAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAKKyAgIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIAorfTsKKworc3RhdGljIHZvaWQgcmVwb3J0X2Vycm9yIChCdXNEZXNrdG9wRmlsZVBhcnNlciAqcGFyc2VyLAorCQkJICBjaGFyICAgICAgICAgICAgICAgICAqbWVzc2FnZSwKKwkJCSAgY29uc3QgY2hhciAgICAgICAgICAgKmVycm9yX25hbWUsCisJCQkgIERCdXNFcnJvciAgICAgICAgICAgICplcnJvcik7CisKK3N0YXRpYyB2b2lkCitwYXJzZXJfZnJlZSAoQnVzRGVza3RvcEZpbGVQYXJzZXIgKnBhcnNlcikKK3sKKyAgYnVzX2Rlc2t0b3BfZmlsZV9mcmVlIChwYXJzZXItPmRlc2t0b3BfZmlsZSk7CisgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhcnNlci0+ZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfZGVza3RvcF9maWxlX2xpbmVfZnJlZSAoQnVzRGVza3RvcEZpbGVMaW5lICpsaW5lKQoreworICBkYnVzX2ZyZWUgKGxpbmUtPmtleSk7CisgIGRidXNfZnJlZSAobGluZS0+dmFsdWUpOworfQorCitzdGF0aWMgdm9pZAorYnVzX2Rlc2t0b3BfZmlsZV9zZWN0aW9uX2ZyZWUgKEJ1c0Rlc2t0b3BGaWxlU2VjdGlvbiAqc2VjdGlvbikKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNlY3Rpb24tPm5fbGluZXM7IGkrKykKKyAgICBidXNfZGVza3RvcF9maWxlX2xpbmVfZnJlZSAoJnNlY3Rpb24tPmxpbmVzW2ldKTsKKworICBkYnVzX2ZyZWUgKHNlY3Rpb24tPmxpbmVzKTsKKyAgZGJ1c19mcmVlIChzZWN0aW9uLT5zZWN0aW9uX25hbWUpOworfQorCit2b2lkCitidXNfZGVza3RvcF9maWxlX2ZyZWUgKEJ1c0Rlc2t0b3BGaWxlICpkZXNrdG9wX2ZpbGUpCit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBkZXNrdG9wX2ZpbGUtPm5fc2VjdGlvbnM7IGkrKykKKyAgICBidXNfZGVza3RvcF9maWxlX3NlY3Rpb25fZnJlZSAoJmRlc2t0b3BfZmlsZS0+c2VjdGlvbnNbaV0pOworICBkYnVzX2ZyZWUgKGRlc2t0b3BfZmlsZS0+c2VjdGlvbnMpOworCisgIGRidXNfZnJlZSAoZGVza3RvcF9maWxlKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citncm93X2xpbmVzX2luX3NlY3Rpb24gKEJ1c0Rlc2t0b3BGaWxlU2VjdGlvbiAqc2VjdGlvbikKK3sKKyAgQnVzRGVza3RvcEZpbGVMaW5lICpsaW5lczsKKyAgCisgIGludCBuZXdfbl9saW5lczsKKworICBpZiAoc2VjdGlvbi0+bl9hbGxvY2F0ZWRfbGluZXMgPT0gMCkKKyAgICBuZXdfbl9saW5lcyA9IDE7CisgIGVsc2UKKyAgICBuZXdfbl9saW5lcyA9IHNlY3Rpb24tPm5fYWxsb2NhdGVkX2xpbmVzKjI7CisKKyAgbGluZXMgPSBkYnVzX3JlYWxsb2MgKHNlY3Rpb24tPmxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChCdXNEZXNrdG9wRmlsZUxpbmUpICogbmV3X25fbGluZXMpOworCisgIGlmIChsaW5lcyA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIHNlY3Rpb24tPmxpbmVzID0gbGluZXM7CisgIHNlY3Rpb24tPm5fYWxsb2NhdGVkX2xpbmVzID0gbmV3X25fbGluZXM7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ3Jvd19zZWN0aW9ucyAoQnVzRGVza3RvcEZpbGUgKmRlc2t0b3BfZmlsZSkKK3sKKyAgaW50IG5ld19uX3NlY3Rpb25zOworICBCdXNEZXNrdG9wRmlsZVNlY3Rpb24gKnNlY3Rpb25zOworICAKKyAgaWYgKGRlc2t0b3BfZmlsZS0+bl9hbGxvY2F0ZWRfc2VjdGlvbnMgPT0gMCkKKyAgICBuZXdfbl9zZWN0aW9ucyA9IDE7CisgIGVsc2UKKyAgICBuZXdfbl9zZWN0aW9ucyA9IGRlc2t0b3BfZmlsZS0+bl9hbGxvY2F0ZWRfc2VjdGlvbnMqMjsKKworICBzZWN0aW9ucyA9IGRidXNfcmVhbGxvYyAoZGVza3RvcF9maWxlLT5zZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoQnVzRGVza3RvcEZpbGVTZWN0aW9uKSAqIG5ld19uX3NlY3Rpb25zKTsKKyAgaWYgKHNlY3Rpb25zID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgZGVza3RvcF9maWxlLT5zZWN0aW9ucyA9IHNlY3Rpb25zOworICAKKyAgZGVza3RvcF9maWxlLT5uX2FsbG9jYXRlZF9zZWN0aW9ucyA9IG5ld19uX3NlY3Rpb25zOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgY2hhciAqCit1bmVzY2FwZV9zdHJpbmcgKEJ1c0Rlc2t0b3BGaWxlUGFyc2VyICpwYXJzZXIsCisgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICpzdHIsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBwb3MsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBlbmRfcG9zLAorICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAqZXJyb3IpCit7CisgIGNoYXIgKnJldHZhbCwgKnE7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICAvKiBsZW4gKyAxIGlzIGVub3VnaCwgYmVjYXVzZSB1bmVzY2FwaW5nIG5ldmVyIG1ha2VzIHRoZQorICAgKiBzdHJpbmcgbG9uZ2VyCisgICAqLworICByZXR2YWwgPSBkYnVzX21hbGxvYyAoZW5kX3BvcyAtIHBvcyArIDEpOworICBpZiAocmV0dmFsID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBxID0gcmV0dmFsOworICAKKyAgd2hpbGUgKHBvcyA8IGVuZF9wb3MpCisgICAgeworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoc3RyLCBwb3MpID09IDApCisJeworCSAgLyogRm91bmQgYW4gZW1iZWRkZWQgbnVsbCAqLworCSAgZGJ1c19mcmVlIChyZXR2YWwpOworICAgICAgICAgIHJlcG9ydF9lcnJvciAocGFyc2VyLCAiVGV4dCB0byBiZSB1bmVzY2FwZWQgY29udGFpbnMgZW1iZWRkZWQgbnVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJVU19ERVNLVE9QX1BBUlNFX0VSUk9SX0lOVkFMSURfRVNDQVBFUywgZXJyb3IpOworCSAgcmV0dXJuIE5VTEw7CisJfQorCisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChzdHIsIHBvcykgPT0gJ1xcJykKKwl7CisJICBwb3MgKys7CisKKwkgIGlmIChwb3MgPj0gZW5kX3BvcykKKwkgICAgeworCSAgICAgIC8qIEVzY2FwZSBhdCBlbmQgb2Ygc3RyaW5nICovCisJICAgICAgZGJ1c19mcmVlIChyZXR2YWwpOworICAgICAgICAgICAgICByZXBvcnRfZXJyb3IgKHBhcnNlciwgIlRleHQgdG8gYmUgdW5lc2NhcGVkIGVuZGVkIGluIFxcIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVVNfREVTS1RPUF9QQVJTRV9FUlJPUl9JTlZBTElEX0VTQ0FQRVMsIGVycm9yKTsKKwkgICAgICByZXR1cm4gTlVMTDsKKwkgICAgfQorCisJICBzd2l0Y2ggKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoc3RyLCBwb3MpKQorCSAgICB7CisJICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgICAqcSsrID0gJyAnOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgICAgICpxKysgPSAnXHQnOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgY2FzZSAnbic6CisgICAgICAgICAgICAgICpxKysgPSAnXG4nOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgY2FzZSAncic6CisgICAgICAgICAgICAgICpxKysgPSAnXHInOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICAqcSsrID0gJ1xcJzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIGRlZmF1bHQ6CisJICAgICAvKiBJbnZhbGlkIGVzY2FwZSBjb2RlICovCisJICAgICBkYnVzX2ZyZWUgKHJldHZhbCk7CisgICAgICAgICAgICAgcmVwb3J0X2Vycm9yIChwYXJzZXIsICJUZXh0IHRvIGJlIHVuZXNjYXBlZCBoYWQgaW52YWxpZCBlc2NhcGUgc2VxdWVuY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVTX0RFU0tUT1BfUEFSU0VfRVJST1JfSU5WQUxJRF9FU0NBUEVTLCBlcnJvcik7CisgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisJICAgIH0KKwkgIHBvcysrOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAqcSsrID1fZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHN0ciwgcG9zKTsKKworCSAgcG9zKys7CisJfQorICAgIH0KKworICAqcSA9IDA7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIEJ1c0Rlc2t0b3BGaWxlU2VjdGlvbiogCituZXdfc2VjdGlvbiAoQnVzRGVza3RvcEZpbGUgKmRlc2t0b3BfZmlsZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqbmFtZSkKK3sKKyAgaW50IG47CisgIGNoYXIgKm5hbWVfY29weTsKKyAgCisgIGlmIChkZXNrdG9wX2ZpbGUtPm5fYWxsb2NhdGVkX3NlY3Rpb25zID09IGRlc2t0b3BfZmlsZS0+bl9zZWN0aW9ucykKKyAgICB7CisgICAgICBpZiAoIWdyb3dfc2VjdGlvbnMgKGRlc2t0b3BfZmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBuYW1lX2NvcHkgPSBfZGJ1c19zdHJkdXAgKG5hbWUpOworICBpZiAobmFtZV9jb3B5ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbiA9IGRlc2t0b3BfZmlsZS0+bl9zZWN0aW9uczsKKyAgZGVza3RvcF9maWxlLT5zZWN0aW9uc1tuXS5zZWN0aW9uX25hbWUgPSBuYW1lX2NvcHk7CisKKyAgZGVza3RvcF9maWxlLT5zZWN0aW9uc1tuXS5uX2xpbmVzID0gMDsKKyAgZGVza3RvcF9maWxlLT5zZWN0aW9uc1tuXS5saW5lcyA9IE5VTEw7CisgIGRlc2t0b3BfZmlsZS0+c2VjdGlvbnNbbl0ubl9hbGxvY2F0ZWRfbGluZXMgPSAwOworCisgIGlmICghZ3Jvd19saW5lc19pbl9zZWN0aW9uICgmZGVza3RvcF9maWxlLT5zZWN0aW9uc1tuXSkpCisgICAgeworICAgICAgZGJ1c19mcmVlIChkZXNrdG9wX2ZpbGUtPnNlY3Rpb25zW25dLnNlY3Rpb25fbmFtZSk7CisgICAgICBkZXNrdG9wX2ZpbGUtPnNlY3Rpb25zW25dLnNlY3Rpb25fbmFtZSA9IE5VTEw7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgZGVza3RvcF9maWxlLT5uX3NlY3Rpb25zICs9IDE7CisgIAorICByZXR1cm4gJmRlc2t0b3BfZmlsZS0+c2VjdGlvbnNbbl07ICAKK30KKworc3RhdGljIEJ1c0Rlc2t0b3BGaWxlU2VjdGlvbiogCitvcGVuX3NlY3Rpb24gKEJ1c0Rlc2t0b3BGaWxlUGFyc2VyICpwYXJzZXIsCisgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICpuYW1lKQoreyAgCisgIEJ1c0Rlc2t0b3BGaWxlU2VjdGlvbiAqc2VjdGlvbjsKKworICBzZWN0aW9uID0gbmV3X3NlY3Rpb24gKHBhcnNlci0+ZGVza3RvcF9maWxlLCBuYW1lKTsKKyAgaWYgKHNlY3Rpb24gPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgCisgIHBhcnNlci0+Y3VycmVudF9zZWN0aW9uID0gcGFyc2VyLT5kZXNrdG9wX2ZpbGUtPm5fc2VjdGlvbnMgLSAxOworICBfZGJ1c19hc3NlcnQgKCZwYXJzZXItPmRlc2t0b3BfZmlsZS0+c2VjdGlvbnNbcGFyc2VyLT5jdXJyZW50X3NlY3Rpb25dID09IHNlY3Rpb24pOworICAKKyAgcmV0dXJuIHNlY3Rpb247Cit9CisKK3N0YXRpYyBCdXNEZXNrdG9wRmlsZUxpbmUgKgorbmV3X2xpbmUgKEJ1c0Rlc2t0b3BGaWxlUGFyc2VyICpwYXJzZXIpCit7CisgIEJ1c0Rlc2t0b3BGaWxlU2VjdGlvbiAqc2VjdGlvbjsKKyAgQnVzRGVza3RvcEZpbGVMaW5lICpsaW5lOworICAKKyAgc2VjdGlvbiA9ICZwYXJzZXItPmRlc2t0b3BfZmlsZS0+c2VjdGlvbnNbcGFyc2VyLT5jdXJyZW50X3NlY3Rpb25dOworCisgIGlmIChzZWN0aW9uLT5uX2FsbG9jYXRlZF9saW5lcyA9PSBzZWN0aW9uLT5uX2xpbmVzKQorICAgIHsKKyAgICAgIGlmICghZ3Jvd19saW5lc19pbl9zZWN0aW9uIChzZWN0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGxpbmUgPSAmc2VjdGlvbi0+bGluZXNbc2VjdGlvbi0+bl9saW5lcysrXTsKKworICBfREJVU19aRVJPKCpsaW5lKTsKKyAgICAKKyAgcmV0dXJuIGxpbmU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraXNfYmxhbmtfbGluZSAoQnVzRGVza3RvcEZpbGVQYXJzZXIgKnBhcnNlcikKK3sKKyAgaW50IHA7CisgIGNoYXIgYzsKKyAgCisgIHAgPSBwYXJzZXItPnBvczsKKworICBjID0gX2RidXNfc3RyaW5nX2dldF9ieXRlICgmcGFyc2VyLT5kYXRhLCBwKTsKKworICB3aGlsZSAoYyAmJiBjICE9ICdcbicpCisgICAgeworICAgICAgaWYgKCEoYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8IGMgPT0gJ1xuJyB8fCBjID09ICdccicgfHwgYyA9PSAnXGYnKSkKKwlyZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgIHArKzsKKyAgICAgIGMgPSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZwYXJzZXItPmRhdGEsIHApOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3BhcnNlX2NvbW1lbnRfb3JfYmxhbmsgKEJ1c0Rlc2t0b3BGaWxlUGFyc2VyICpwYXJzZXIpCit7CisgIGludCBsaW5lX2VuZCwgZW9sX2xlbjsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmRfZW9sICgmcGFyc2VyLT5kYXRhLCBwYXJzZXItPnBvcywgJmxpbmVfZW5kLCAmZW9sX2xlbikpCisgICAgbGluZV9lbmQgPSBwYXJzZXItPmxlbjsKKworICBpZiAobGluZV9lbmQgPT0gcGFyc2VyLT5sZW4pCisgICAgcGFyc2VyLT5wb3MgPSBwYXJzZXItPmxlbjsKKyAgZWxzZQorICAgIHBhcnNlci0+cG9zID0gbGluZV9lbmQgKyBlb2xfbGVuOworICAKKyAgcGFyc2VyLT5saW5lX251bSArPSAxOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2lzX3ZhbGlkX3NlY3Rpb25fbmFtZSAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgLyogNS4gR3JvdXAgbmFtZXMgbWF5IGNvbnRhaW4gYWxsIEFTQ0lJIGNoYXJhY3RlcnMgZXhjZXB0IGZvciBjb250cm9sIGNoYXJhY3RlcnMgYW5kICdbJyBhbmQgJ10nLiAqLworCisgIHdoaWxlICgqbmFtZSkKKyAgICB7CisgICAgICBpZiAoISgoKm5hbWUgPj0gJ0EnICYmICpuYW1lIDw9ICdaJykgfHwgKCpuYW1lID49ICdhJyB8fCAqbmFtZSA8PSAneicpIHx8CisJICAgICpuYW1lID09ICdcbicgfHwgKm5hbWUgPT0gJ1x0JykpCisJcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBuYW1lKys7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3BhcnNlX3NlY3Rpb25fc3RhcnQgKEJ1c0Rlc2t0b3BGaWxlUGFyc2VyICpwYXJzZXIsIERCdXNFcnJvciAqZXJyb3IpCit7CisgIGludCBsaW5lX2VuZCwgZW9sX2xlbjsKKyAgY2hhciAqc2VjdGlvbl9uYW1lOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAgIAorICBpZiAoIV9kYnVzX3N0cmluZ19maW5kX2VvbCAoJnBhcnNlci0+ZGF0YSwgcGFyc2VyLT5wb3MsICZsaW5lX2VuZCwgJmVvbF9sZW4pKQorICAgIGxpbmVfZW5kID0gcGFyc2VyLT5sZW47CisgIAorICBpZiAobGluZV9lbmQgLSBwYXJzZXItPnBvcyA8PSAyIHx8CisgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZwYXJzZXItPmRhdGEsIGxpbmVfZW5kIC0gMSkgIT0gJ10nKQorICAgIHsKKyAgICAgIHJlcG9ydF9lcnJvciAocGFyc2VyLCAiSW52YWxpZCBzeW50YXggZm9yIHNlY3Rpb24gaGVhZGVyIiwgQlVTX0RFU0tUT1BfUEFSU0VfRVJST1JfSU5WQUxJRF9TWU5UQVgsIGVycm9yKTsKKyAgICAgIHBhcnNlcl9mcmVlIChwYXJzZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBzZWN0aW9uX25hbWUgPSB1bmVzY2FwZV9zdHJpbmcgKHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2VyLT5kYXRhLCBwYXJzZXItPnBvcyArIDEsIGxpbmVfZW5kIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisKKyAgaWYgKHNlY3Rpb25fbmFtZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHBhcnNlcl9mcmVlIChwYXJzZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIWlzX3ZhbGlkX3NlY3Rpb25fbmFtZSAoc2VjdGlvbl9uYW1lKSkKKyAgICB7CisgICAgICByZXBvcnRfZXJyb3IgKHBhcnNlciwgIkludmFsaWQgY2hhcmFjdGVycyBpbiBzZWN0aW9uIG5hbWUiLCBCVVNfREVTS1RPUF9QQVJTRV9FUlJPUl9JTlZBTElEX0NIQVJTLCBlcnJvcik7CisgICAgICBwYXJzZXJfZnJlZSAocGFyc2VyKTsKKyAgICAgIGRidXNfZnJlZSAoc2VjdGlvbl9uYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKG9wZW5fc2VjdGlvbiAocGFyc2VyLCBzZWN0aW9uX25hbWUpID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19mcmVlIChzZWN0aW9uX25hbWUpOworICAgICAgcGFyc2VyX2ZyZWUgKHBhcnNlcik7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAobGluZV9lbmQgPT0gcGFyc2VyLT5sZW4pCisgICAgcGFyc2VyLT5wb3MgPSBwYXJzZXItPmxlbjsKKyAgZWxzZQorICAgIHBhcnNlci0+cG9zID0gbGluZV9lbmQgKyBlb2xfbGVuOworICAKKyAgcGFyc2VyLT5saW5lX251bSArPSAxOworCisgIGRidXNfZnJlZSAoc2VjdGlvbl9uYW1lKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3BhcnNlX2tleV92YWx1ZSAoQnVzRGVza3RvcEZpbGVQYXJzZXIgKnBhcnNlciwgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgaW50IGxpbmVfZW5kLCBlb2xfbGVuOworICBpbnQga2V5X3N0YXJ0LCBrZXlfZW5kOworICBpbnQgdmFsdWVfc3RhcnQ7CisgIGludCBwOworICBjaGFyICp2YWx1ZSwgKnRtcDsKKyAgREJ1c1N0cmluZyBrZXk7CisgIEJ1c0Rlc2t0b3BGaWxlTGluZSAqbGluZTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmRfZW9sICgmcGFyc2VyLT5kYXRhLCBwYXJzZXItPnBvcywgJmxpbmVfZW5kLCAmZW9sX2xlbikpCisgICAgbGluZV9lbmQgPSBwYXJzZXItPmxlbjsKKyAgCisgIHAgPSBwYXJzZXItPnBvczsKKyAga2V5X3N0YXJ0ID0gcDsKKyAgd2hpbGUgKHAgPCBsaW5lX2VuZCAmJgorCSAodmFsaWRbX2RidXNfc3RyaW5nX2dldF9ieXRlICgmcGFyc2VyLT5kYXRhLCBwKV0gJiBWQUxJRF9LRVlfQ0hBUikpCisgICAgcCsrOworICBrZXlfZW5kID0gcDsKKyAgCisgIGlmIChrZXlfc3RhcnQgPT0ga2V5X2VuZCkKKyAgICB7CisgICAgICByZXBvcnRfZXJyb3IgKHBhcnNlciwgIkVtcHR5IGtleSBuYW1lIiwgQlVTX0RFU0tUT1BfUEFSU0VfRVJST1JfSU5WQUxJRF9TWU5UQVgsIGVycm9yKTsKKyAgICAgIHBhcnNlcl9mcmVlIChwYXJzZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBXZSBpZ25vcmUgbG9jYWxlcyBmb3Igbm93ICovCisgIGlmIChwIDwgbGluZV9lbmQgJiYgX2RidXNfc3RyaW5nX2dldF9ieXRlICgmcGFyc2VyLT5kYXRhLCBwKSA9PSAnWycpCisgICAgeworICAgICAgaWYgKGxpbmVfZW5kID09IHBhcnNlci0+bGVuKQorCXBhcnNlci0+cG9zID0gcGFyc2VyLT5sZW47CisgICAgICBlbHNlCisJcGFyc2VyLT5wb3MgPSBsaW5lX2VuZCArIGVvbF9sZW47CisJICAKKyAgICAgIHBhcnNlci0+bGluZV9udW0gKz0gMTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAKKyAgLyogU2tpcCBzcGFjZSBiZWZvcmUgJz0nICovCisgIHdoaWxlIChwIDwgbGluZV9lbmQgJiYgX2RidXNfc3RyaW5nX2dldF9ieXRlICgmcGFyc2VyLT5kYXRhLCBwKSA9PSAnICcpCisgICAgcCsrOworCisgIGlmIChwIDwgbGluZV9lbmQgJiYgX2RidXNfc3RyaW5nX2dldF9ieXRlICgmcGFyc2VyLT5kYXRhLCBwKSAhPSAnPScpCisgICAgeworICAgICAgcmVwb3J0X2Vycm9yIChwYXJzZXIsICJJbnZhbGlkIGNoYXJhY3RlcnMgaW4ga2V5IG5hbWUiLCBCVVNfREVTS1RPUF9QQVJTRV9FUlJPUl9JTlZBTElEX0NIQVJTLCBlcnJvcik7CisgICAgICBwYXJzZXJfZnJlZSAocGFyc2VyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKHAgPT0gbGluZV9lbmQpCisgICAgeworICAgICAgcmVwb3J0X2Vycm9yIChwYXJzZXIsICJObyAnPScgaW4ga2V5L3ZhbHVlIHBhaXIiLCBCVVNfREVTS1RPUF9QQVJTRV9FUlJPUl9JTlZBTElEX1NZTlRBWCwgZXJyb3IpOworICAgICAgcGFyc2VyX2ZyZWUgKHBhcnNlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIFNraXAgdGhlICc9JyAqLworICBwKys7CisKKyAgLyogU2tpcCBzcGFjZSBhZnRlciAnPScgKi8KKyAgd2hpbGUgKHAgPCBsaW5lX2VuZCAmJiBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZwYXJzZXItPmRhdGEsIHApID09ICcgJykKKyAgICBwKys7CisKKyAgdmFsdWVfc3RhcnQgPSBwOworICAKKyAgdmFsdWUgPSB1bmVzY2FwZV9zdHJpbmcgKHBhcnNlciwgJnBhcnNlci0+ZGF0YSwgdmFsdWVfc3RhcnQsIGxpbmVfZW5kLCBlcnJvcik7CisgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHBhcnNlcl9mcmVlIChwYXJzZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBsaW5lID0gbmV3X2xpbmUgKHBhcnNlcik7CisgIGlmIChsaW5lID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19mcmVlICh2YWx1ZSk7CisgICAgICBwYXJzZXJfZnJlZSAocGFyc2VyKTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmtleSkpCisgICAgeworICAgICAgZGJ1c19mcmVlICh2YWx1ZSk7CisgICAgICBwYXJzZXJfZnJlZSAocGFyc2VyKTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9sZW4gKCZwYXJzZXItPmRhdGEsIGtleV9zdGFydCwga2V5X2VuZCAtIGtleV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXksIDApKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgma2V5KTsKKyAgICAgIGRidXNfZnJlZSAodmFsdWUpOworICAgICAgcGFyc2VyX2ZyZWUgKHBhcnNlcik7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgKCZrZXksICZ0bXApKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgma2V5KTsKKyAgICAgIGRidXNfZnJlZSAodmFsdWUpOworICAgICAgcGFyc2VyX2ZyZWUgKHBhcnNlcik7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIF9kYnVzX3N0cmluZ19mcmVlICgma2V5KTsKKyAgCisgIGxpbmUtPmtleSA9IHRtcDsKKyAgbGluZS0+dmFsdWUgPSB2YWx1ZTsKKworICBpZiAobGluZV9lbmQgPT0gcGFyc2VyLT5sZW4pCisgICAgcGFyc2VyLT5wb3MgPSBwYXJzZXItPmxlbjsKKyAgZWxzZQorICAgIHBhcnNlci0+cG9zID0gbGluZV9lbmQgKyBlb2xfbGVuOworICAKKyAgcGFyc2VyLT5saW5lX251bSArPSAxOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorcmVwb3J0X2Vycm9yIChCdXNEZXNrdG9wRmlsZVBhcnNlciAqcGFyc2VyLAorCSAgICAgIGNoYXIgICAgICAgICAgICAgICAgICptZXNzYWdlLAorCSAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICplcnJvcl9uYW1lLAorCSAgICAgIERCdXNFcnJvciAgICAgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqc2VjdGlvbl9uYW1lID0gTlVMTDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIGlmIChwYXJzZXItPmN1cnJlbnRfc2VjdGlvbiAhPSAtMSkKKyAgICBzZWN0aW9uX25hbWUgPSBwYXJzZXItPmRlc2t0b3BfZmlsZS0+c2VjdGlvbnNbcGFyc2VyLT5jdXJyZW50X3NlY3Rpb25dLnNlY3Rpb25fbmFtZTsKKworICBpZiAoc2VjdGlvbl9uYW1lKQorICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgZXJyb3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIkVycm9yIGluIHNlY3Rpb24gJXMgYXQgbGluZSAlZDogJXNcbiIsIHNlY3Rpb25fbmFtZSwgcGFyc2VyLT5saW5lX251bSwgbWVzc2FnZSk7CisgIGVsc2UKKyAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIGVycm9yX25hbWUsCisgICAgICAgICAgICAgICAgICAgICJFcnJvciBhdCBsaW5lICVkOiAlc1xuIiwgcGFyc2VyLT5saW5lX251bSwgbWVzc2FnZSk7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZAorZHVtcF9kZXNrdG9wX2ZpbGUgKEJ1c0Rlc2t0b3BGaWxlICpmaWxlKQoreworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgZmlsZS0+bl9zZWN0aW9uczsgaSsrKQorICAgIHsKKyAgICAgIGludCBqOworICAgICAgCisgICAgICBwcmludGYgKCJbJXNdXG4iLCBmaWxlLT5zZWN0aW9uc1tpXS5zZWN0aW9uX25hbWUpOworCisgICAgICBmb3IgKGogPSAwOyBqIDwgZmlsZS0+c2VjdGlvbnNbaV0ubl9saW5lczsgaisrKQorCXsKKwkgIHByaW50ZiAoIiVzPSVzXG4iLCBmaWxlLT5zZWN0aW9uc1tpXS5saW5lc1tqXS5rZXksCisJCSAgZmlsZS0+c2VjdGlvbnNbaV0ubGluZXNbal0udmFsdWUpOworCX0KKyAgICB9Cit9CisjZW5kaWYKKworQnVzRGVza3RvcEZpbGUqCitidXNfZGVza3RvcF9maWxlX2xvYWQgKERCdXNTdHJpbmcgKmZpbGVuYW1lLAorCQkgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgc3RyOworICBCdXNEZXNrdG9wRmlsZVBhcnNlciBwYXJzZXI7CisgIERCdXNTdGF0IHNiOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAgLyogQ2xlYXJseSB0aGVyZSdzIGEgcmFjZSBoZXJlLCBidXQgaXQncyBqdXN0IHRvIG1ha2UgaXQgdW5saWtlbHkKKyAgICogdGhhdCB3ZSBkbyBzb21ldGhpbmcgc2lsbHksIHdlIHN0aWxsIGhhbmRsZSBkb2luZyBpdCBiZWxvdy4KKyAgICovCisgIGlmICghX2RidXNfc3RhdCAoZmlsZW5hbWUsICZzYiwgZXJyb3IpKQorICAgIHJldHVybiBOVUxMOworCisgIGlmIChzYi5zaXplID4gX0RCVVNfT05FX0tJTE9CWVRFICogMTI4KQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkRlc2t0b3AgZmlsZSBzaXplICglbGQgYnl0ZXMpIGlzIHRvbyBsYXJnZSIsIChsb25nKSBzYi5zaXplKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICBpZiAoIV9kYnVzX2ZpbGVfZ2V0X2NvbnRlbnRzICgmc3RyLCBmaWxlbmFtZSwgZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ192YWxpZGF0ZV91dGY4ICgmc3RyLCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgVVRGLTgiKTsgICAKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgCisgIHBhcnNlci5kZXNrdG9wX2ZpbGUgPSBkYnVzX25ldzAgKEJ1c0Rlc2t0b3BGaWxlLCAxKTsKKyAgaWYgKHBhcnNlci5kZXNrdG9wX2ZpbGUgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgcGFyc2VyLmRhdGEgPSBzdHI7CisgIHBhcnNlci5saW5lX251bSA9IDE7CisgIHBhcnNlci5wb3MgPSAwOworICBwYXJzZXIubGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZwYXJzZXIuZGF0YSk7CisgIHBhcnNlci5jdXJyZW50X3NlY3Rpb24gPSAtMTsKKworICB3aGlsZSAocGFyc2VyLnBvcyA8IHBhcnNlci5sZW4pCisgICAgeworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnBhcnNlci5kYXRhLCBwYXJzZXIucG9zKSA9PSAnWycpCisJeworCSAgaWYgKCFwYXJzZV9zZWN0aW9uX3N0YXJ0ICgmcGFyc2VyLCBlcnJvcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKGlzX2JsYW5rX2xpbmUgKCZwYXJzZXIpIHx8CisJICAgICAgIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnBhcnNlci5kYXRhLCBwYXJzZXIucG9zKSA9PSAnIycpCisJcGFyc2VfY29tbWVudF9vcl9ibGFuayAoJnBhcnNlcik7CisgICAgICBlbHNlCisJeworCSAgaWYgKCFwYXJzZV9rZXlfdmFsdWUgKCZwYXJzZXIsIGVycm9yKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisJfQorICAgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhcnNlci5kYXRhKTsKKworICByZXR1cm4gcGFyc2VyLmRlc2t0b3BfZmlsZTsKK30KKworc3RhdGljIEJ1c0Rlc2t0b3BGaWxlU2VjdGlvbiAqCitsb29rdXBfc2VjdGlvbiAoQnVzRGVza3RvcEZpbGUgKmRlc2t0b3BfZmlsZSwKKwkJY29uc3QgY2hhciAgICAgKnNlY3Rpb25fbmFtZSkKK3sKKyAgQnVzRGVza3RvcEZpbGVTZWN0aW9uICpzZWN0aW9uOworICBpbnQgaTsKKyAgCisgIGlmIChzZWN0aW9uX25hbWUgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgCisgIGZvciAoaSA9IDA7IGkgPCBkZXNrdG9wX2ZpbGUtPm5fc2VjdGlvbnM7IGkgKyspCisgICAgeworICAgICAgc2VjdGlvbiA9ICZkZXNrdG9wX2ZpbGUtPnNlY3Rpb25zW2ldOworCisgICAgICBpZiAoc3RyY21wIChzZWN0aW9uLT5zZWN0aW9uX25hbWUsIHNlY3Rpb25fbmFtZSkgPT0gMCkKKwlyZXR1cm4gc2VjdGlvbjsKKyAgICB9CisgIAorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIEJ1c0Rlc2t0b3BGaWxlTGluZSAqCitsb29rdXBfbGluZSAoQnVzRGVza3RvcEZpbGUgICAgICAgICpkZXNrdG9wX2ZpbGUsCisJICAgICBCdXNEZXNrdG9wRmlsZVNlY3Rpb24gKnNlY3Rpb24sCisJICAgICBjb25zdCBjaGFyICAgICAgICAgICAgKmtleW5hbWUpCit7CisgIEJ1c0Rlc2t0b3BGaWxlTGluZSAqbGluZTsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNlY3Rpb24tPm5fbGluZXM7IGkrKykKKyAgICB7CisgICAgICBsaW5lID0gJnNlY3Rpb24tPmxpbmVzW2ldOworICAgICAgCisgICAgICBpZiAoc3RyY21wIChsaW5lLT5rZXksIGtleW5hbWUpID09IDApCisJcmV0dXJuIGxpbmU7CisgICAgfQorICAKKyAgcmV0dXJuIE5VTEw7Cit9CisKK2RidXNfYm9vbF90CitidXNfZGVza3RvcF9maWxlX2dldF9yYXcgKEJ1c0Rlc2t0b3BGaWxlICAqZGVza3RvcF9maWxlLAorCQkJICBjb25zdCBjaGFyICAgICAgKnNlY3Rpb25fbmFtZSwKKwkJCSAgY29uc3QgY2hhciAgICAgICprZXluYW1lLAorCQkJICBjb25zdCBjaGFyICAgICAqKnZhbCkKK3sKKyAgQnVzRGVza3RvcEZpbGVTZWN0aW9uICpzZWN0aW9uOworICBCdXNEZXNrdG9wRmlsZUxpbmUgKmxpbmU7CisKKyAgKnZhbCA9IE5VTEw7CisKKyAgc2VjdGlvbiA9IGxvb2t1cF9zZWN0aW9uIChkZXNrdG9wX2ZpbGUsIHNlY3Rpb25fbmFtZSk7CisgIAorICBpZiAoIXNlY3Rpb24pCisgICAgcmV0dXJuIEZBTFNFOworCisgIGxpbmUgPSBsb29rdXBfbGluZSAoZGVza3RvcF9maWxlLAorCQkgICAgICBzZWN0aW9uLAorCQkgICAgICBrZXluYW1lKTsKKworICBpZiAoIWxpbmUpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgKnZhbCA9IGxpbmUtPnZhbHVlOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90CitidXNfZGVza3RvcF9maWxlX2dldF9zdHJpbmcgKEJ1c0Rlc2t0b3BGaWxlICAqZGVza3RvcF9maWxlLAorCQkJICAgICBjb25zdCBjaGFyICAgICAgKnNlY3Rpb24sCisJCQkgICAgIGNvbnN0IGNoYXIgICAgICAqa2V5bmFtZSwKKwkJCSAgICAgY2hhciAgICAgICAgICAgKip2YWwsCisJCQkgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKnJhdzsKKyAKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgKnZhbCA9IE5VTEw7CisgIAorICBpZiAoIWJ1c19kZXNrdG9wX2ZpbGVfZ2V0X3JhdyAoZGVza3RvcF9maWxlLCBzZWN0aW9uLCBrZXluYW1lLCAmcmF3KSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJObyBcIiVzXCIga2V5IGluIC5zZXJ2aWNlIGZpbGVcbiIsIGtleW5hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAqdmFsID0gX2RidXNfc3RyZHVwIChyYXcpOworCisgIGlmICgqdmFsID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2RidXMvYnVzL2Rlc2t0b3AtZmlsZS5oIGIvZGJ1cy9idXMvZGVza3RvcC1maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThlNzhlOAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvYnVzL2Rlc2t0b3AtZmlsZS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGVza3RvcC1maWxlLmggIC5kZXNrdG9wIGZpbGUgcGFyc2VyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZm5kZWYgQlVTX0RFU0tUT1BfRklMRV9ICisjZGVmaW5lIEJVU19ERVNLVE9QX0ZJTEVfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorCisjZGVmaW5lIEJVU19ERVNLVE9QX1BBUlNFX0VSUk9SX0lOVkFMSURfU1lOVEFYICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRGVza3RvcFBhcnNlRXJyb3IuSW52YWxpZFN5bnRheCIKKyNkZWZpbmUgQlVTX0RFU0tUT1BfUEFSU0VfRVJST1JfSU5WQUxJRF9FU0NBUEVTICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5EZXNrdG9wUGFyc2VFcnJvci5JbnZhbGlkRXNjYXBlcyIKKyNkZWZpbmUgQlVTX0RFU0tUT1BfUEFSU0VfRVJST1JfSU5WQUxJRF9DSEFSUyAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5EZXNrdG9wUGFyc2VFcnJvci5JbnZhbGlkQ2hhcnMiCisKKyNkZWZpbmUgREJVU19TRVJWSUNFX1NFQ1RJT04gICJELUJVUyBTZXJ2aWNlIgorI2RlZmluZSBEQlVTX1NFUlZJQ0VfTkFNRSAgICAgIk5hbWUiCisjZGVmaW5lIERCVVNfU0VSVklDRV9FWEVDICAgICAiRXhlYyIKKyNkZWZpbmUgREJVU19TRVJWSUNFX1VTRVIgICAgICJVc2VyIgorI2RlZmluZSBEQlVTX1NFUlZJQ0VfR1JPVVAgICAgIkdyb3VwIgorI2RlZmluZSBEQlVTX1NFUlZJQ0VfU1lTVEVNRF9TRVJWSUNFICJTeXN0ZW1kU2VydmljZSIKKwordHlwZWRlZiBzdHJ1Y3QgQnVzRGVza3RvcEZpbGUgQnVzRGVza3RvcEZpbGU7CisKK0J1c0Rlc2t0b3BGaWxlICpidXNfZGVza3RvcF9maWxlX2xvYWQgKERCdXNTdHJpbmcgICAgICpmaWxlbmFtZSwKKwkJCQkgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKK3ZvaWQgICAgICAgICAgICBidXNfZGVza3RvcF9maWxlX2ZyZWUgKEJ1c0Rlc2t0b3BGaWxlICpmaWxlKTsKKworZGJ1c19ib29sX3QgYnVzX2Rlc2t0b3BfZmlsZV9nZXRfcmF3ICAgIChCdXNEZXNrdG9wRmlsZSAgKmRlc2t0b3BfZmlsZSwKKwkJCQkJIGNvbnN0IGNoYXIgICAgICAqc2VjdGlvbl9uYW1lLAorCQkJCQkgY29uc3QgY2hhciAgICAgICprZXluYW1lLAorCQkJCQkgY29uc3QgY2hhciAgICAgKip2YWwpOworZGJ1c19ib29sX3QgYnVzX2Rlc2t0b3BfZmlsZV9nZXRfc3RyaW5nIChCdXNEZXNrdG9wRmlsZSAgKmRlc2t0b3BfZmlsZSwKKwkJCQkJIGNvbnN0IGNoYXIgICAgICAqc2VjdGlvbiwKKwkJCQkJIGNvbnN0IGNoYXIgICAgICAqa2V5bmFtZSwKKwkJCQkJIGNoYXIgICAgICAgICAgICoqdmFsLAorCQkJCQkgREJ1c0Vycm9yICAgICAgICplcnJvcik7CisKKworI2VuZGlmIC8qIEJVU19ERVNLVE9QX0ZJTEVfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9idXMvZGlyLXdhdGNoLWRlZmF1bHQuYyBiL2RidXMvYnVzL2Rpci13YXRjaC1kZWZhdWx0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkzNjFiMQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvYnVzL2Rpci13YXRjaC1kZWZhdWx0LmMKQEAgLTAsMCArMSwzNSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkaXItd2F0Y2gtZGVmYXVsdC5jICBPUyBzcGVjaWZpYyBkaXJlY3RvcnkgY2hhbmdlIG5vdGlmaWNhdGlvbiBmb3IgbWVzc2FnZSBidXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSAiZGlyLXdhdGNoLmgiCisKKworLyogTm9PcCAqLworCit2b2lkCitidXNfc2V0X3dhdGNoZWRfZGlycyAoQnVzQ29udGV4dCAqY29udGV4dCwgREJ1c0xpc3QgKipkaXJlY3RvcmllcykKK3sKK30KZGlmZiAtLWdpdCBhL2RidXMvYnVzL2Rpci13YXRjaC1kbm90aWZ5LmMgYi9kYnVzL2J1cy9kaXItd2F0Y2gtZG5vdGlmeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOGQ3ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2J1cy9kaXItd2F0Y2gtZG5vdGlmeS5jCkBAIC0wLDAgKzEsOTMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGlyLXdhdGNoLWRub3RpZnkuYyAgT1Mgc3BlY2lmaWMgZGlyZWN0b3J5IGNoYW5nZSBub3RpZmljYXRpb24gZm9yIG1lc3NhZ2UgYnVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjZGVmaW5lIF9HTlVfU09VUkNFCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpZmRlZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSAiZGlyLXdhdGNoLmgiCisKKyNkZWZpbmUgTUFYX0RJUlNfVE9fV0FUQ0ggMTI4CisKKy8qIHVzZSBhIHN0YXRpYyBhcnJheSB0byBhdm9pZCBoYW5kbGluZyBPT00gKi8KK3N0YXRpYyBpbnQgZmRzW01BWF9ESVJTX1RPX1dBVENIXTsKK3N0YXRpYyBpbnQgbnVtX2ZkcyA9IDA7CisKK3ZvaWQKK2J1c193YXRjaF9kaXJlY3RvcnkgKGNvbnN0IGNoYXIgKmRpciwgQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgaW50IGZkOworCisgIF9kYnVzX2Fzc2VydCAoZGlyICE9IE5VTEwpOworCisgIGlmIChudW1fZmRzID49IE1BWF9ESVJTX1RPX1dBVENIICkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiQ2Fubm90IHdhdGNoIGNvbmZpZyBkaXJlY3RvcnkgJyVzJy4gQWxyZWFkeSB3YXRjaGluZyAlZCBkaXJlY3Rvcmllc1xuIiwgZGlyLCBNQVhfRElSU19UT19XQVRDSCk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgZmQgPSBvcGVuIChkaXIsIE9fUkRPTkxZKTsKKyAgaWYgKGZkIDwgMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiQ2Fubm90IG9wZW4gZGlyZWN0b3J5ICclcyc7IGVycm9yICclcydcbiIsIGRpciwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKGZjbnRsIChmZCwgRl9OT1RJRlksIEROX0NSRUFURXxETl9ERUxFVEV8RE5fUkVOQU1FfEROX01PRElGWSkgPT0gLTEpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkNhbm5vdCBzZXR1cCBEX05PVElGWSBmb3IgJyVzJyBlcnJvciAnJXMnXG4iLCBkaXIsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgY2xvc2UgKGZkKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgCisgIGZkc1tudW1fZmRzKytdID0gZmQ7CisgIF9kYnVzX3ZlcmJvc2UgKCJBZGRlZCB3YXRjaCBvbiBjb25maWcgZGlyZWN0b3J5ICclcydcbiIsIGRpcik7CisKKyBvdXQ6CisgIDsKK30KKwordm9pZCAKK2J1c19kcm9wX2FsbF9kaXJlY3Rvcnlfd2F0Y2hlcyAodm9pZCkKK3sKKyAgaW50IGk7CisgCisgIF9kYnVzX3ZlcmJvc2UgKCJEcm9wcGluZyBhbGwgd2F0Y2hlcyBvbiBjb25maWcgZGlyZWN0b3JpZXNcbiIpOworIAorICBmb3IgKGkgPSAwOyBpIDwgbnVtX2ZkczsgaSsrKQorICAgIHsKKyAgICAgIGlmIChjbG9zZSAoZmRzW2ldKSAhPSAwKQorCXsKKwkgIF9kYnVzX3ZlcmJvc2UgKCJFcnJvciBjbG9zaW5nIGZkICVkIGZvciBjb25maWcgZGlyZWN0b3J5IHdhdGNoXG4iLCBmZHNbaV0pOworCX0KKyAgICB9CisgIAorICBudW1fZmRzID0gMDsKK30KZGlmZiAtLWdpdCBhL2RidXMvYnVzL2Rpci13YXRjaC1pbm90aWZ5LmMgYi9kYnVzL2J1cy9kaXItd2F0Y2gtaW5vdGlmeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlOWJlOTgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2J1cy9kaXItd2F0Y2gtaW5vdGlmeS5jCkBAIC0wLDAgKzEsMjc5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IiAtKi0gKi8KKy8qIGRpci13YXRjaC1pbm90aWZ5LmMgIE9TIHNwZWNpZmljIGRpcmVjdG9yeSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGZvciBtZXNzYWdlIGJ1cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgKiAgICAgICAgICAgKGMpIDIwMDYgTWFuZHJpdmEKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvaW5vdGlmeS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtd2F0Y2guaD4KKyNpbmNsdWRlICJkaXItd2F0Y2guaCIKKworI2RlZmluZSBNQVhfRElSU19UT19XQVRDSCAxMjgKKyNkZWZpbmUgSU5PVElGWV9FVkVOVF9TSVpFIChzaXplb2Yoc3RydWN0IGlub3RpZnlfZXZlbnQpKQorI2RlZmluZSBJTk9USUZZX0JVRl9MRU4gKDEwMjQgKiAoSU5PVElGWV9FVkVOVF9TSVpFICsgMTYpKQorCisvKiB1c2UgYSBzdGF0aWMgYXJyYXkgdG8gYXZvaWQgaGFuZGxpbmcgT09NICovCitzdGF0aWMgaW50IHdkc1tNQVhfRElSU19UT19XQVRDSF07CitzdGF0aWMgY2hhciAqZGlyc1tNQVhfRElSU19UT19XQVRDSF07CitzdGF0aWMgaW50IG51bV93ZHMgPSAwOworc3RhdGljIGludCBpbm90aWZ5X2ZkID0gLTE7CitzdGF0aWMgREJ1c1dhdGNoICp3YXRjaCA9IE5VTEw7CitzdGF0aWMgREJ1c0xvb3AgKmxvb3AgPSBOVUxMOworCitzdGF0aWMgZGJ1c19ib29sX3QKK19oYW5kbGVfaW5vdGlmeV93YXRjaCAoREJ1c1dhdGNoICpwYXNzZWRfd2F0Y2gsIHVuc2lnbmVkIGludCBmbGFncywgdm9pZCAqZGF0YSkKK3sKKyAgY2hhciBidWZmZXJbSU5PVElGWV9CVUZfTEVOXTsKKyAgc3NpemVfdCByZXQgPSAwOworICBpbnQgaSA9IDA7CisgIHBpZF90IHBpZDsKKyAgZGJ1c19ib29sX3QgaGF2ZV9jaGFuZ2UgPSBGQUxTRTsKKworICByZXQgPSByZWFkIChpbm90aWZ5X2ZkLCBidWZmZXIsIElOT1RJRllfQlVGX0xFTik7CisgIGlmIChyZXQgPCAwKQorICAgIF9kYnVzX3ZlcmJvc2UgKCJFcnJvciByZWFkaW5nIGlub3RpZnkgZXZlbnQ6ICclcydcbiIsIF9kYnVzX3N0cmVycm9yKGVycm5vKSk7CisgIGVsc2UgaWYgKCFyZXQpCisgICAgX2RidXNfdmVyYm9zZSAoIkVycm9yIHJlYWRpbmcgaW5vdGlmeSBldmVudDogYnVmZmVyIHRvbyBzbWFsbFxuIik7CisKKyAgd2hpbGUgKGkgPCByZXQpCisgICAgeworICAgICAgc3RydWN0IGlub3RpZnlfZXZlbnQgKmV2OworICAgICAgcGlkID0gX2RidXNfZ2V0cGlkICgpOworCisgICAgICBldiA9IChzdHJ1Y3QgaW5vdGlmeV9ldmVudCAqKSAmYnVmZmVyW2ldOworICAgICAgaSArPSBJTk9USUZZX0VWRU5UX1NJWkUgKyBldi0+bGVuOworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICAgICAgaWYgKGV2LT5sZW4pCisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJldmVudCBuYW1lOiAnJXMnXG4iLCBldi0+bmFtZSk7CisgICAgICBfZGJ1c192ZXJib3NlICgiaW5vdGlmeSBldmVudDogd2Q9JWQgbWFzaz0ldSBjb29raWU9JXUgbGVuPSV1XG4iLCBldi0+d2QsIGV2LT5tYXNrLCBldi0+Y29va2llLCBldi0+bGVuKTsKKyNlbmRpZgorICAgICAgX2RidXNfdmVyYm9zZSAoIlNlbmRpbmcgU0lHSFVQIHNpZ25hbCBvbiByZWNlcHRpb24gb2YgYSBpbm90aWZ5IGV2ZW50XG4iKTsKKyAgICAgIGhhdmVfY2hhbmdlID0gVFJVRTsKKyAgICB9CisgIGlmIChoYXZlX2NoYW5nZSkKKyAgICAodm9pZCkga2lsbCAocGlkLCBTSUdIVVApOworCisgIHJldHVybiBUUlVFOworfQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIHZvaWQKK19zZXRfd2F0Y2hlZF9kaXJzX2ludGVybmFsIChEQnVzTGlzdCAqKmRpcmVjdG9yaWVzKQoreworICBpbnQgbmV3X3dkc1tNQVhfRElSU19UT19XQVRDSF07CisgIGNoYXIgKm5ld19kaXJzW01BWF9ESVJTX1RPX1dBVENIXTsKKyAgREJ1c0xpc3QgKmxpbms7CisgIGludCBpLCBqLCB3ZDsKKworICBmb3IgKGkgPSAwOyBpIDwgTUFYX0RJUlNfVE9fV0FUQ0g7IGkrKykKKyAgICB7CisgICAgICBuZXdfd2RzW2ldID0gLTE7CisgICAgICBuZXdfZGlyc1tpXSA9IE5VTEw7CisgICAgfQorCisgIGkgPSAwOworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoZGlyZWN0b3JpZXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIG5ld19kaXJzW2krK10gPSAoY2hhciAqKWxpbmstPmRhdGE7CisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChkaXJlY3RvcmllcywgbGluayk7CisgICAgfQorCisgIC8qIExvb2sgZm9yIGRpcmVjdG9yaWVzIGluIGJvdGggdGhlIG9sZCBhbmQgbmV3IHNldHMsIGlmCisgICAqIHdlIGZpbmQgb25lLCBtb3ZlIGl0cyBkYXRhIGludG8gdGhlIG5ldyBzZXQuCisgICAqLworICBmb3IgKGkgPSAwOyBuZXdfZGlyc1tpXTsgaSsrKQorICAgIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fd2RzOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGlyc1tqXSAmJiBzdHJjbXAgKG5ld19kaXJzW2ldLCBkaXJzW2pdKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBuZXdfd2RzW2ldID0gd2RzW2pdOworICAgICAgICAgICAgICBuZXdfZGlyc1tpXSA9IGRpcnNbal07CisgICAgICAgICAgICAgIHdkc1tqXSA9IC0xOworICAgICAgICAgICAgICBkaXJzW2pdID0gTlVMTDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogQW55IGRpcmVjdG9yaWVzIHdlIGZpbmQgaW4gIndkcyIgd2l0aCBhIG5vbnplcm8gZmQgbXVzdAorICAgKiBub3QgYmUgaW4gdGhlIG5ldyBzZXQsIHNvIHBlcmZvcm0gY2xlYW51cCBub3cuCisgICAqLworICBmb3IgKGogPSAwOyBqIDwgbnVtX3dkczsgaisrKQorICAgIHsKKyAgICAgIGlmICh3ZHNbal0gIT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICBpbm90aWZ5X3JtX3dhdGNoIChpbm90aWZ5X2ZkLCB3ZHNbal0pOworICAgICAgICAgIGRidXNfZnJlZSAoZGlyc1tqXSk7CisgICAgICAgICAgd2RzW2pdID0gLTE7CisgICAgICAgICAgZGlyc1tqXSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgZm9yIChpID0gMDsgbmV3X2RpcnNbaV07IGkrKykKKyAgICB7CisgICAgICBpZiAobmV3X3dkc1tpXSA9PSAtMSkKKyAgICAgICAgeworICAgICAgICAgIC8qIEZJWE1FIC0gbGVzcyBsYW1lIGVycm9yIGhhbmRsaW5nIGZvciBmYWlsaW5nIHRvIGFkZCBhIHdhdGNoOyB3ZSBtYXkgbmVlZCB0byBzbGVlcC4gKi8KKyAgICAgICAgICB3ZCA9IGlub3RpZnlfYWRkX3dhdGNoIChpbm90aWZ5X2ZkLCBuZXdfZGlyc1tpXSwgSU5fQ0xPU0VfV1JJVEUgfCBJTl9ERUxFVEUgfCBJTl9NT1ZFRF9UTyB8IElOX01PVkVEX0ZST00pOworICAgICAgICAgIGlmICh3ZCA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIE5vdCBhbGwgc2VydmljZSBkaXJlY3RvcmllcyBuZWVkIHRvIGV4aXN0LiAqLworICAgICAgICAgICAgICBpZiAoZXJybm8gIT0gRU5PRU5UKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJDYW5ub3Qgc2V0dXAgaW5vdGlmeSBmb3IgJyVzJzsgZXJyb3IgJyVzJ1xuIiwgbmV3X2RpcnNbaV0sIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgbmV3X3dkc1tpXSA9IC0xOworICAgICAgICAgICAgICAgICAgbmV3X2RpcnNbaV0gPSBOVUxMOworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIG5ld193ZHNbaV0gPSB3ZDsKKyAgICAgICAgICBuZXdfZGlyc1tpXSA9IF9kYnVzX3N0cmR1cCAobmV3X2RpcnNbaV0pOworICAgICAgICAgIGlmICghbmV3X2RpcnNbaV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIEZJWE1FIGhhdmUgbGVzcyBsYW1lIGhhbmRsaW5nIGZvciBPT00sIHdlIGp1c3Qgc2lsZW50bHkgZmFpbCB0bworICAgICAgICAgICAgICAgKiB3YXRjaC4gIChJbiByZWFsaXR5IHRob3VnaCwgdGhlIHdob2xlIE9PTSBoYW5kbGluZyBpbiBkYnVzIGlzIHN0dXBpZAorICAgICAgICAgICAgICAgKiBidXQgd2Ugd29uJ3QgZ28gaW50byB0aGF0IGluIHRoaXMgY29tbWVudCA9KSApCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBpbm90aWZ5X3JtX3dhdGNoIChpbm90aWZ5X2ZkLCB3ZCk7CisgICAgICAgICAgICAgIG5ld193ZHNbaV0gPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICBudW1fd2RzID0gaTsKKworICBmb3IgKGkgPSAwOyBpIDwgTUFYX0RJUlNfVE9fV0FUQ0g7IGkrKykKKyAgICB7CisgICAgICB3ZHNbaV0gPSBuZXdfd2RzW2ldOworICAgICAgZGlyc1tpXSA9IG5ld19kaXJzW2ldOworICAgIH0KKworIG91dDo7Cit9CisKKyNpbmNsdWRlIDxzdGRpby5oPgorc3RhdGljIHZvaWQKK19zaHV0ZG93bl9pbm90aWZ5ICh2b2lkICpkYXRhKQoreworICBEQnVzTGlzdCAqZW1wdHkgPSBOVUxMOworCisgIGlmIChpbm90aWZ5X2ZkID09IC0xKQorICAgIHJldHVybjsKKworICBfc2V0X3dhdGNoZWRfZGlyc19pbnRlcm5hbCAoJmVtcHR5KTsKKworICBpZiAod2F0Y2ggIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19sb29wX3JlbW92ZV93YXRjaCAobG9vcCwgd2F0Y2gpOworICAgICAgX2RidXNfd2F0Y2hfaW52YWxpZGF0ZSAod2F0Y2gpOworICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgKHdhdGNoKTsKKyAgICAgIF9kYnVzX2xvb3BfdW5yZWYgKGxvb3ApOworICAgIH0KKyAgd2F0Y2ggPSBOVUxMOworICBsb29wID0gTlVMTDsKKworICBjbG9zZSAoaW5vdGlmeV9mZCk7CisgIGlub3RpZnlfZmQgPSAtMTsKK30KKworc3RhdGljIGludAorX2luaXRfaW5vdGlmeSAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgaW50IHJldCA9IDA7CisKKyAgaWYgKGlub3RpZnlfZmQgPT0gLTEpCisgICAgeworI2lmZGVmIEhBVkVfSU5PVElGWV9JTklUMQorICAgICAgaW5vdGlmeV9mZCA9IGlub3RpZnlfaW5pdDEgKElOX0NMT0VYRUMpOworICAgICAgLyogVGhpcyBlbnN1cmVzIHdlIHN0aWxsIHJ1biBvbiBvbGRlciBMaW51eCBrZXJuZWxzLgorICAgICAgICogaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjM5NTcKKyAgICAgICAqLworICAgICAgaWYgKGlub3RpZnlfZmQgPCAwKQorICAgICAgICBpbm90aWZ5X2ZkID0gaW5vdGlmeV9pbml0ICgpOworI2Vsc2UKKyAgICAgIGlub3RpZnlfZmQgPSBpbm90aWZ5X2luaXQgKCk7CisjZW5kaWYKKyAgICAgIGlmIChpbm90aWZ5X2ZkIDw9IDApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiQ2Fubm90IGluaXRpYWxpemUgaW5vdGlmeVxuIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIGxvb3AgPSBidXNfY29udGV4dF9nZXRfbG9vcCAoY29udGV4dCk7CisgICAgICBfZGJ1c19sb29wX3JlZiAobG9vcCk7CisKKyAgICAgIHdhdGNoID0gX2RidXNfd2F0Y2hfbmV3IChpbm90aWZ5X2ZkLCBEQlVTX1dBVENIX1JFQURBQkxFLCBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9oYW5kbGVfaW5vdGlmeV93YXRjaCwgTlVMTCwgTlVMTCk7CisKKyAgICAgIGlmICh3YXRjaCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIlVuYWJsZSB0byBjcmVhdGUgaW5vdGlmeSB3YXRjaFxuIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19sb29wX2FkZF93YXRjaCAobG9vcCwgd2F0Y2gpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIlVuYWJsZSB0byBhZGQgcmVsb2FkIHdhdGNoIHRvIG1haW4gbG9vcCIpOworICAgICAgICAgIF9kYnVzX3dhdGNoX3VucmVmICh3YXRjaCk7CisgICAgICAgICAgd2F0Y2ggPSBOVUxMOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfcmVnaXN0ZXJfc2h1dGRvd25fZnVuYyAoX3NodXRkb3duX2lub3RpZnksIE5VTEwpKQorICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJVbmFibGUgdG8gcmVnaXN0ZXIgc2h1dGRvd24gZnVuYyIpOworICAgICAgICAgIF9kYnVzX3dhdGNoX3VucmVmICh3YXRjaCk7CisgICAgICAgICAgd2F0Y2ggPSBOVUxMOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgfQorICAgIH0KKworICByZXQgPSAxOworCitvdXQ6CisgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQKK2J1c19zZXRfd2F0Y2hlZF9kaXJzIChCdXNDb250ZXh0ICpjb250ZXh0LCBEQnVzTGlzdCAqKmRpcmVjdG9yaWVzKQoreworICBpZiAoIV9pbml0X2lub3RpZnkgKGNvbnRleHQpKQorICAgIHJldHVybjsKKworICBfc2V0X3dhdGNoZWRfZGlyc19pbnRlcm5hbCAoZGlyZWN0b3JpZXMpOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy9idXMvZGlyLXdhdGNoLWtxdWV1ZS5jIGIvZGJ1cy9idXMvZGlyLXdhdGNoLWtxdWV1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNjI5MGMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2J1cy9kaXItd2F0Y2gta3F1ZXVlLmMKQEAgLTAsMCArMSwyNTAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGlyLXdhdGNoLWtxdWV1ZS5jICBPUyBzcGVjaWZpYyBkaXJlY3RvcnkgY2hhbmdlIG5vdGlmaWNhdGlvbiBmb3IgbWVzc2FnZSBidXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvZXZlbnQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiYnVzLmgiCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXdhdGNoLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKyNpbmNsdWRlICJkaXItd2F0Y2guaCIKKworI2RlZmluZSBNQVhfRElSU19UT19XQVRDSCAxMjgKKworc3RhdGljIGludCBrcSA9IC0xOworc3RhdGljIGludCBmZHNbTUFYX0RJUlNfVE9fV0FUQ0hdOworc3RhdGljIGNoYXIgKmRpcnNbTUFYX0RJUlNfVE9fV0FUQ0hdOworc3RhdGljIGludCBudW1fZmRzID0gMDsKK3N0YXRpYyBEQnVzV2F0Y2ggKndhdGNoID0gTlVMTDsKK3N0YXRpYyBEQnVzTG9vcCAqbG9vcCA9IE5VTEw7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2hhbmRsZV9rcXVldWVfd2F0Y2ggKERCdXNXYXRjaCAqd2F0Y2gsIHVuc2lnbmVkIGludCBmbGFncywgdm9pZCAqZGF0YSkKK3sKKyAgc3RydWN0IGtldmVudCBldjsKKyAgc3RydWN0IHRpbWVzcGVjIG51bGx0cyA9IHsgMCwgMCB9OworICBpbnQgcmVzOworICBwaWRfdCBwaWQ7CisKKyAgcmVzID0ga2V2ZW50IChrcSwgTlVMTCwgMCwgJmV2LCAxLCAmbnVsbHRzKTsKKworICAvKiBTbGVlcCBmb3IgaGFsZiBhIHNlY29uZCB0byBhdm9pZCBhIHJhY2Ugd2hlbiBmaWxlcyBhcmUgaW5zdGFsbCgxKSdkCisgICAqIHRvIHN5c3RlbS5kLiAqLworICB1c2xlZXAoNTAwMDAwKTsKKworICBpZiAocmVzID4gMCkKKyAgICB7CisgICAgICBwaWQgPSBnZXRwaWQgKCk7CisgICAgICBfZGJ1c192ZXJib3NlICgiU2VuZGluZyBTSUdIVVAgc2lnbmFsIG9uIHJlY2VwdGlvbiBvZiBhIGtldmVudFxuIik7CisgICAgICAodm9pZCkga2lsbCAocGlkLCBTSUdIVVApOworICAgIH0KKyAgZWxzZSBpZiAocmVzIDwgMCAmJiBlcnJubyA9PSBFQkFERikKKyAgICB7CisgICAgICBrcSA9IC0xOworICAgICAgaWYgKHdhdGNoICE9IE5VTEwpCisJeworCSAgX2RidXNfbG9vcF9yZW1vdmVfd2F0Y2ggKGxvb3AsIHdhdGNoKTsKKyAgICAgICAgICBfZGJ1c193YXRjaF9pbnZhbGlkYXRlICh3YXRjaCk7CisgICAgICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgKHdhdGNoKTsKKwkgIHdhdGNoID0gTlVMTDsKKwl9CisgICAgICBwaWQgPSBnZXRwaWQgKCk7CisgICAgICBfZGJ1c192ZXJib3NlICgiU2VuZGluZyBTSUdIVVAgc2lnbmFsIHNpbmNlIGtxdWV1ZSBoYXMgYmVlbiBjbG9zZWRcbiIpOworICAgICAgKHZvaWQpIGtpbGwgKHBpZCwgU0lHSFVQKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQKK19pbml0X2txdWV1ZSAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgaW50IHJldCA9IDA7CisKKyAgaWYgKGtxIDwgMCkKKyAgICB7CisKKyAgICAgIGtxID0ga3F1ZXVlICgpOworICAgICAgaWYgKGtxIDwgMCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJDYW5ub3QgY3JlYXRlIGtxdWV1ZTsgZXJyb3IgJyVzJ1xuIiwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisJICBnb3RvIG91dDsKKwl9CisKKyAgICAgICAgbG9vcCA9IGJ1c19jb250ZXh0X2dldF9sb29wIChjb250ZXh0KTsKKworICAgICAgICB3YXRjaCA9IF9kYnVzX3dhdGNoX25ldyAoa3EsIERCVVNfV0FUQ0hfUkVBREFCTEUsIFRSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaGFuZGxlX2txdWV1ZV93YXRjaCwgTlVMTCwgTlVMTCk7CisKKwlpZiAod2F0Y2ggPT0gTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c193YXJuICgiVW5hYmxlIHRvIGNyZWF0ZSBrcXVldWUgd2F0Y2hcbiIpOworCSAgICBjbG9zZSAoa3EpOworCSAgICBrcSA9IC0xOworCSAgICBnb3RvIG91dDsKKwkgIH0KKworCWlmICghX2RidXNfbG9vcF9hZGRfd2F0Y2ggKGxvb3AsIHdhdGNoKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c193YXJuICgiVW5hYmxlIHRvIGFkZCByZWxvYWQgd2F0Y2ggdG8gbWFpbiBsb29wIik7CisJICAgIF9kYnVzX3dhdGNoX2ludmFsaWRhdGUgKHdhdGNoKTsKKwkgICAgX2RidXNfd2F0Y2hfdW5yZWYgKHdhdGNoKTsKKwkgICAgd2F0Y2ggPSBOVUxMOworCSAgICBjbG9zZSAoa3EpOworCSAgICBrcSA9IC0xOworICAgICAgICAgICAgZ290byBvdXQ7CisJICB9CisgICAgfQorCisgIHJldCA9IDE7CisKK291dDoKKyAgcmV0dXJuIHJldDsKK30KKwordm9pZAorYnVzX3NldF93YXRjaGVkX2RpcnMgKEJ1c0NvbnRleHQgKmNvbnRleHQsIERCdXNMaXN0ICoqZGlyZWN0b3JpZXMpCit7CisgIGludCBuZXdfZmRzW01BWF9ESVJTX1RPX1dBVENIXTsKKyAgY2hhciAqbmV3X2RpcnNbTUFYX0RJUlNfVE9fV0FUQ0hdOworICBEQnVzTGlzdCAqbGluazsKKyAgaW50IGksIGosIGYsIGZkOworICBzdHJ1Y3Qga2V2ZW50IGV2OworCisgIGlmICghX2luaXRfa3F1ZXVlIChjb250ZXh0KSkKKyAgICBnb3RvIG91dDsKKworICBmb3IgKGkgPSAwOyBpIDwgTUFYX0RJUlNfVE9fV0FUQ0g7IGkrKykKKyAgICB7CisgICAgICBuZXdfZmRzW2ldID0gLTE7CisgICAgICBuZXdfZGlyc1tpXSA9IE5VTEw7CisgICAgfQorCisgIGkgPSAwOworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoZGlyZWN0b3JpZXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIG5ld19kaXJzW2krK10gPSAoY2hhciAqKWxpbmstPmRhdGE7CisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChkaXJlY3RvcmllcywgbGluayk7CisgICAgfQorCisgIC8qIExvb2sgZm9yIGRpcmVjdG9yaWVzIGluIGJvdGggdGhlIG9sZCBhbmQgbmV3IHNldHMsIGlmCisgICAqIHdlIGZpbmQgb25lLCBtb3ZlIGl0cyBkYXRhIGludG8gdGhlIG5ldyBzZXQuCisgICAqLworICBmb3IgKGkgPSAwOyBuZXdfZGlyc1tpXTsgaSsrKQorICAgIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fZmRzOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGlyc1tqXSAmJiBzdHJjbXAgKG5ld19kaXJzW2ldLCBkaXJzW2pdKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBuZXdfZmRzW2ldID0gZmRzW2pdOworCSAgICAgIG5ld19kaXJzW2ldID0gZGlyc1tqXTsKKwkgICAgICBmZHNbal0gPSAtMTsKKwkgICAgICBkaXJzW2pdID0gTlVMTDsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogQW55IGRpcmVjdG9yeSB3ZSBmaW5kIGluICJmZHMiIHdpdGggYSBub256ZXJvIGZkIG11c3QKKyAgICogbm90IGJlIGluIHRoZSBuZXcgc2V0LCBzbyBwZXJmb3JtIGNsZWFudXAgbm93LgorICAgKi8KKyAgZm9yIChqID0gMDsgaiA8IG51bV9mZHM7IGorKykKKyAgICB7CisgICAgICBpZiAoZmRzW2pdICE9IC0xKQorICAgICAgICB7CisgICAgICAgICAgY2xvc2UgKGZkc1tqXSk7CisJICBkYnVzX2ZyZWUgKGRpcnNbal0pOworCSAgZmRzW2pdID0gLTE7CisJICBkaXJzW2pdID0gTlVMTDsKKwl9CisgICAgfQorCisgIGZvciAoaSA9IDA7IG5ld19kaXJzW2ldOyBpKyspCisgICAgeworICAgICAgaWYgKG5ld19mZHNbaV0gPT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBGSVhNRSAtIGxlc3MgbGFtZSBlcnJvciBoYW5kbGluZyBmb3IgZmFpbGluZyB0byBhZGQgYSB3YXRjaDsKKwkgICAqIHdlIG1heSBuZWVkIHRvIHNsZWVwLgorCSAgICovCisgICAgICAgICAgZmQgPSBvcGVuIChuZXdfZGlyc1tpXSwgT19SRE9OTFkpOworICAgICAgICAgIGlmIChmZCA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChlcnJubyAhPSBFTk9FTlQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIkNhbm5vdCBvcGVuIGRpcmVjdG9yeSAnJXMnOyBlcnJvciAnJXMnXG4iLCBuZXdfZGlyc1tpXSwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBuZXdfZmRzW2ldID0gLTE7CisgICAgICAgICAgICAgICAgICBuZXdfZGlyc1tpXSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBFVl9TRVQgKCZldiwgZmQsIEVWRklMVF9WTk9ERSwgRVZfQUREIHwgRVZfRU5BQkxFIHwgRVZfQ0xFQVIsCisgICAgICAgICAgICAgICAgICBOT1RFX0RFTEVURSB8IE5PVEVfRVhURU5EIHwgTk9URV9XUklURSB8IE5PVEVfUkVOQU1FLCAwLCAwKTsKKyAgICAgICAgICBpZiAoa2V2ZW50IChrcSwgJmV2LCAxLCBOVUxMLCAwLCBOVUxMKSA9PSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIkNhbm5vdCBzZXR1cCBhIGtldmVudCBmb3IgJyVzJzsgZXJyb3IgJyVzJ1xuIiwgbmV3X2RpcnNbaV0sIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICAgICAgICBjbG9zZSAoZmQpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworCSAgbmV3X2Zkc1tpXSA9IGZkOworCSAgbmV3X2RpcnNbaV0gPSBfZGJ1c19zdHJkdXAgKG5ld19kaXJzW2ldKTsKKwkgIGlmICghbmV3X2RpcnNbaV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIEZJWE1FIGhhdmUgbGVzcyBsYW1lIGhhbmRsaW5nIGZvciBPT00sIHdlIGp1c3Qgc2lsZW50bHkgZmFpbCB0bworCSAgICAgICAqIHdhdGNoLiAgKEluIHJlYWxpdHkgdGhvdWdoLCB0aGUgd2hvbGUgT09NIGhhbmRsaW5nIGluIGRidXMgaXMKKwkgICAgICAgKiBzdHVwaWQgYnV0IHdlIHdvbid0IGdvIGludG8gdGhhdCBpbiB0aGlzIGNvbW1lbnQgPSkgKQorCSAgICAgICAqLworICAgICAgICAgICAgICBjbG9zZSAoZmQpOworCSAgICAgIG5ld19mZHNbaV0gPSAtMTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgbnVtX2ZkcyA9IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9ESVJTX1RPX1dBVENIOyBpKyspCisgICAgeworICAgICAgZmRzW2ldID0gbmV3X2Zkc1tpXTsKKyAgICAgIGRpcnNbaV0gPSBuZXdfZGlyc1tpXTsKKyAgICB9CisKKyBvdXQ6CisgIDsKK30KZGlmZiAtLWdpdCBhL2RidXMvYnVzL2Rpci13YXRjaC5oIGIvZGJ1cy9idXMvZGlyLXdhdGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ0NTI5ZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvYnVzL2Rpci13YXRjaC5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGlyLXdhdGNoLmggIFdhdGNoIGRpcmVjdG9yaWVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgImJ1cy5oIgorCisjaWZuZGVmIERJUl9XQVRDSF9ICisjZGVmaW5lIERJUl9XQVRDSF9ICisKKy8qKgorICogVXBkYXRlIHRoZSBzZXQgb2YgZGlyZWN0b3JpZXMgdG8gbW9uaXRvciBmb3IgY2hhbmdlcy4gIFRoZQorICogb3BlcmF0aW5nLXN5c3RlbS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIHNob3VsZAorICogYXZvaWQgY3JlYXRpbmcgYSB3aW5kb3cgd2hlcmUgYSBkaXJlY3RvcnkgaW4gYm90aCB0aGUKKyAqIG9sZCBhbmQgbmV3IHNldCBpc24ndCBtb25pdG9yZWQuCisgKgorICogQHBhcmFtIGNvbnRleHQgVGhlIGJ1cyBjb250ZXh0CisgKiBAcGFyYW0gZGlycyBMaXN0IG9mIHN0cmluZ3Mgd2hpY2ggYXJlIGRpcmVjdG9yeSBwYXRocworICovCit2b2lkIGJ1c19zZXRfd2F0Y2hlZF9kaXJzIChCdXNDb250ZXh0ICpjb250ZXh0LCBEQnVzTGlzdCAqKmRpcnMpOworCisjZW5kaWYgLyogRElSX1dBVENIX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvYnVzL2Rpc3BhdGNoLmMgYi9kYnVzL2J1cy9kaXNwYXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhOTZmOWQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2J1cy9kaXNwYXRjaC5jCkBAIC0wLDAgKzEsNDkxMCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkaXNwYXRjaC5jICBNZXNzYWdlIGRpc3BhdGNoZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIENvZGVGYWN0b3J5IEFCCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNCAgSW1lbmRpbyBIQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRpc3BhdGNoLmgiCisjaW5jbHVkZSAiY29ubmVjdGlvbi5oIgorI2luY2x1ZGUgImRyaXZlci5oIgorI2luY2x1ZGUgInNlcnZpY2VzLmgiCisjaW5jbHVkZSAiYWN0aXZhdGlvbi5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiYnVzLmgiCisjaW5jbHVkZSAic2lnbmFscy5oIgorI2luY2x1ZGUgInRlc3QuaCIKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisvKiBUaGlzIGlzIGhhcmQtY29kZWQgaW4gdGhlIGZpbGVzIGluIHZhbGlkLWNvbmZpZy1maWxlcy0qLiBXZSBoYXZlIHRvIHVzZQorICogdGhlIGRlYnVnLXBpcGUgdHJhbnNwb3J0IGJlY2F1c2UgdGhlIHRlc3RzIGluIHRoaXMgZmlsZSByZXF1aXJlIHRoYXQKKyAqIGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUoKSBkb2VzIG5vdCBibG9jay4gKi8KKyNkZWZpbmUgVEVTVF9ERUJVR19QSVBFICJkZWJ1Zy1waXBlOm5hbWU9dGVzdC1zZXJ2ZXIiCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2VuZF9vbmVfbWVzc2FnZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICBCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBpZiAoIWJ1c19jb250ZXh0X2NoZWNrX3NlY3VyaXR5X3BvbGljeSAoY29udGV4dCwgdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICByZXR1cm4gVFJVRTsgLyogc2lsZW50bHkgZG9uJ3Qgc2VuZCBpdCAqLworCisgIGlmIChkYnVzX21lc3NhZ2VfY29udGFpbnNfdW5peF9mZHMobWVzc2FnZSkgJiYKKyAgICAgICFkYnVzX2Nvbm5lY3Rpb25fY2FuX3NlbmRfdHlwZShjb25uZWN0aW9uLCBEQlVTX1RZUEVfVU5JWF9GRCkpCisgICAgcmV0dXJuIFRSVUU7IC8qIHNpbGVudGx5IGRvbid0IHNlbmQgaXQgKi8KKworICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kICh0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90CitidXNfZGlzcGF0Y2hfbWF0Y2hlcyAoQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmFkZHJlc3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzRXJyb3IgdG1wX2Vycm9yOworICBCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnM7CisgIERCdXNMaXN0ICpyZWNpcGllbnRzOworICBCdXNNYXRjaG1ha2VyICptYXRjaG1ha2VyOworICBEQnVzTGlzdCAqbGluazsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICAvKiBzZW5kZXIgYW5kIHJlY2lwaWVudCBjYW4gYm90aCBiZSBOVUxMIGZvciB0aGUgYnVzIGRyaXZlciwKKyAgICogb3IgZm9yIHNpZ25hbHMgd2l0aCBubyBwYXJ0aWN1bGFyIHJlY2lwaWVudAorICAgKi8KKworICBfZGJ1c19hc3NlcnQgKHNlbmRlciA9PSBOVUxMIHx8IGJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAoc2VuZGVyKSk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpICE9IE5VTEwpOworCisgIGNvbnRleHQgPSBidXNfdHJhbnNhY3Rpb25fZ2V0X2NvbnRleHQgKHRyYW5zYWN0aW9uKTsKKworICAvKiBGaXJzdCwgc2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgYWRkcmVzc2VkX3JlY2lwaWVudCwgaWYgdGhlcmUgaXMgb25lLiAqLworICBpZiAoYWRkcmVzc2VkX3JlY2lwaWVudCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghYnVzX2NvbnRleHRfY2hlY2tfc2VjdXJpdHlfcG9saWN5IChjb250ZXh0LCB0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIsIGFkZHJlc3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKGRidXNfbWVzc2FnZV9jb250YWluc191bml4X2ZkcyAobWVzc2FnZSkgJiYKKyAgICAgICAgICAhZGJ1c19jb25uZWN0aW9uX2Nhbl9zZW5kX3R5cGUgKGFkZHJlc3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyaWVkIHRvIHNlbmQgbWVzc2FnZSB3aXRoIFVuaXggZmlsZSBkZXNjcmlwdG9ycyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInRvIGEgY2xpZW50IHRoYXQgZG9lc24ndCBzdXBwb3J0IHRoYXQuIik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorCisgICAgICAvKiBEaXNwYXRjaCB0aGUgbWVzc2FnZSAqLworICAgICAgaWYgKCFidXNfdHJhbnNhY3Rpb25fc2VuZCAodHJhbnNhY3Rpb24sIGFkZHJlc3NlZF9yZWNpcGllbnQsIG1lc3NhZ2UpKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogTm93IGRpc3BhdGNoIHRvIG90aGVycyB3aG8gbG9vayBpbnRlcmVzdGVkIGluIHRoaXMgbWVzc2FnZSAqLworICBjb25uZWN0aW9ucyA9IGJ1c190cmFuc2FjdGlvbl9nZXRfY29ubmVjdGlvbnMgKHRyYW5zYWN0aW9uKTsKKyAgZGJ1c19lcnJvcl9pbml0ICgmdG1wX2Vycm9yKTsKKyAgbWF0Y2htYWtlciA9IGJ1c19jb250ZXh0X2dldF9tYXRjaG1ha2VyIChjb250ZXh0KTsKKworICByZWNpcGllbnRzID0gTlVMTDsKKyAgaWYgKCFidXNfbWF0Y2htYWtlcl9nZXRfcmVjaXBpZW50cyAobWF0Y2htYWtlciwgY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlciwgYWRkcmVzc2VkX3JlY2lwaWVudCwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY2lwaWVudHMpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmcmVjaXBpZW50cyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0Nvbm5lY3Rpb24gKmRlc3Q7CisKKyAgICAgIGRlc3QgPSBsaW5rLT5kYXRhOworCisgICAgICBpZiAoIXNlbmRfb25lX21lc3NhZ2UgKGRlc3QsIGNvbnRleHQsIHNlbmRlciwgYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgdHJhbnNhY3Rpb24sICZ0bXBfZXJyb3IpKQorICAgICAgICBicmVhazsKKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnJlY2lwaWVudHMsIGxpbmspOworICAgIH0KKworICBfZGJ1c19saXN0X2NsZWFyICgmcmVjaXBpZW50cyk7CisKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmdG1wX2Vycm9yKSkKKyAgICB7CisgICAgICBkYnVzX21vdmVfZXJyb3IgKCZ0bXBfZXJyb3IsIGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitidXNfZGlzcGF0Y2ggKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSkKK3sKKyAgY29uc3QgY2hhciAqc2VuZGVyLCAqc2VydmljZV9uYW1lOworICBEQnVzRXJyb3IgZXJyb3I7CisgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbjsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgREJ1c0hhbmRsZXJSZXN1bHQgcmVzdWx0OworICBEQnVzQ29ubmVjdGlvbiAqYWRkcmVzc2VkX3JlY2lwaWVudDsKKworICByZXN1bHQgPSBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisKKyAgdHJhbnNhY3Rpb24gPSBOVUxMOworICBhZGRyZXNzZWRfcmVjaXBpZW50ID0gTlVMTDsKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIGNvbnRleHQgPSBidXNfY29ubmVjdGlvbl9nZXRfY29udGV4dCAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydCAoY29udGV4dCAhPSBOVUxMKTsKKworICAvKiBJZiB3ZSBjYW4ndCBldmVuIGFsbG9jYXRlIGFuIE9PTSBlcnJvciwgd2UganVzdCBnbyB0byBzbGVlcAorICAgKiB1bnRpbCB3ZSBjYW4uCisgICAqLworICB3aGlsZSAoIWJ1c19jb25uZWN0aW9uX3ByZWFsbG9jYXRlX29vbV9lcnJvciAoY29ubmVjdGlvbikpCisgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworCisgIC8qIFJlZiBjb25uZWN0aW9uIGluIGNhc2Ugd2UgZGlzY29ubmVjdCBpdCBhdCBzb21lIHBvaW50IGluIGhlcmUgKi8KKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7CisKKyAgc2VydmljZV9uYW1lID0gZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSk7CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyAgeworICAgIGNvbnN0IGNoYXIgKmludGVyZmFjZV9uYW1lLCAqbWVtYmVyX25hbWUsICplcnJvcl9uYW1lOworCisgICAgaW50ZXJmYWNlX25hbWUgPSBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSk7CisgICAgbWVtYmVyX25hbWUgPSBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSk7CisgICAgZXJyb3JfbmFtZSA9IGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSk7CisKKyAgICBfZGJ1c192ZXJib3NlICgiRElTUEFUQ0g6ICVzICVzICVzIHRvICVzXG4iLAorICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9uYW1lID8gaW50ZXJmYWNlX25hbWUgOiAiKG5vIGludGVyZmFjZSkiLAorICAgICAgICAgICAgICAgICAgIG1lbWJlcl9uYW1lID8gbWVtYmVyX25hbWUgOiAiKG5vIG1lbWJlcikiLAorICAgICAgICAgICAgICAgICAgIGVycm9yX25hbWUgPyBlcnJvcl9uYW1lIDogIihubyBlcnJvciBuYW1lKSIsCisgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lID8gc2VydmljZV9uYW1lIDogInBlZXIiKTsKKyAgfQorI2VuZGlmIC8qIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERSAqLworCisgIC8qIElmIHNlcnZpY2VfbmFtZSBpcyBOVUxMLCBpZiBpdCdzIGEgc2lnbmFsIHdlIHNlbmQgaXQgdG8gYWxsCisgICAqIGNvbm5lY3Rpb25zIHdpdGggYSBtYXRjaCBydWxlLiBJZiBpdCdzIG5vdCBhIHNpZ25hbCwgdGhlcmUKKyAgICogYXJlIHNvbWUgc3BlY2lhbCBjYXNlcyBoZXJlIGJ1dCBtb3N0bHkgd2UganVzdCBiYWlsIG91dC4KKyAgICovCisgIGlmIChzZXJ2aWNlX25hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9MT0NBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlzY29ubmVjdGVkIikpCisgICAgICAgIHsKKyAgICAgICAgICBidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0ZWQgKGNvbm5lY3Rpb24pOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpICE9IERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCkKKyAgICAgICAgeworICAgICAgICAgIC8qIERCdXNDb25uZWN0aW9uIGFsc28gaGFuZGxlcyBzb21lIG9mIHRoZXNlIGF1dG9tYXRpY2FsbHksIHdlIGxlYXZlCisgICAgICAgICAgICogaXQgdG8gZG8gc28uCisgICAgICAgICAgICovCisgICAgICAgICAgcmVzdWx0ID0gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogQ3JlYXRlIG91ciB0cmFuc2FjdGlvbiAqLworICB0cmFuc2FjdGlvbiA9IGJ1c190cmFuc2FjdGlvbl9uZXcgKGNvbnRleHQpOworICBpZiAodHJhbnNhY3Rpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoJmVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAvKiBBc3NpZ24gYSBzZW5kZXIgdG8gdGhlIG1lc3NhZ2UgKi8KKyAgaWYgKGJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgc2VuZGVyID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pOworICAgICAgX2RidXNfYXNzZXJ0IChzZW5kZXIgIT0gTlVMTCk7CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX3NldF9zZW5kZXIgKG1lc3NhZ2UsIHNlbmRlcikpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoJmVycm9yKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICAvKiBXZSBuZWVkIHRvIHJlZmV0Y2ggdGhlIHNlcnZpY2UgbmFtZSBoZXJlLCBiZWNhdXNlCisgICAgICAgKiBkYnVzX21lc3NhZ2Vfc2V0X3NlbmRlciBjYW4gY2F1c2UgdGhlIGhlYWRlciB0byBiZQorICAgICAgICogcmVhbGxvY2F0ZWQsIGFuZCB0aHVzIHRoZSBzZXJ2aWNlX25hbWUgcG9pbnRlciB3aWxsIGJlY29tZQorICAgICAgICogaW52YWxpZC4KKyAgICAgICAqLworICAgICAgc2VydmljZV9uYW1lID0gZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSk7CisgICAgfQorCisgIGlmIChzZXJ2aWNlX25hbWUgJiYKKyAgICAgIHN0cmNtcCAoc2VydmljZV9uYW1lLCBEQlVTX1NFUlZJQ0VfREJVUykgPT0gMCkgLyogdG8gYnVzIGRyaXZlciAqLworICAgIHsKKyAgICAgIGlmICghYnVzX2NvbnRleHRfY2hlY2tfc2VjdXJpdHlfcG9saWN5IChjb250ZXh0LCB0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLCBOVUxMLCBOVUxMLCBtZXNzYWdlLCAmZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIlNlY3VyaXR5IHBvbGljeSByZWplY3RlZCBtZXNzYWdlXG4iKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c192ZXJib3NlICgiR2l2aW5nIG1lc3NhZ2UgdG8gJXNcbiIsIERCVVNfU0VSVklDRV9EQlVTKTsKKyAgICAgIGlmICghYnVzX2RyaXZlcl9oYW5kbGVfbWVzc2FnZSAoY29ubmVjdGlvbiwgdHJhbnNhY3Rpb24sIG1lc3NhZ2UsICZlcnJvcikpCisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgZWxzZSBpZiAoIWJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAoY29ubmVjdGlvbikpIC8qIGNsaWVudHMgbXVzdCB0YWxrIHRvIGJ1cyBkcml2ZXIgZmlyc3QgKi8KKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiUmVjZWl2ZWQgbWVzc2FnZSBmcm9tIG5vbi1yZWdpc3RlcmVkIGNsaWVudC4gRGlzY29ubmVjdGluZy5cbiIpOworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChjb25uZWN0aW9uKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgZWxzZSBpZiAoc2VydmljZV9uYW1lICE9IE5VTEwpIC8qIHJvdXRlIHRvIG5hbWVkIHNlcnZpY2UgKi8KKyAgICB7CisgICAgICBEQnVzU3RyaW5nIHNlcnZpY2Vfc3RyaW5nOworICAgICAgQnVzU2VydmljZSAqc2VydmljZTsKKyAgICAgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKworICAgICAgX2RidXNfYXNzZXJ0IChzZXJ2aWNlX25hbWUgIT0gTlVMTCk7CisKKyAgICAgIHJlZ2lzdHJ5ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X3JlZ2lzdHJ5IChjb25uZWN0aW9uKTsKKworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzZXJ2aWNlX3N0cmluZywgc2VydmljZV9uYW1lKTsKKyAgICAgIHNlcnZpY2UgPSBidXNfcmVnaXN0cnlfbG9va3VwIChyZWdpc3RyeSwgJnNlcnZpY2Vfc3RyaW5nKTsKKworICAgICAgaWYgKHNlcnZpY2UgPT0gTlVMTCAmJiBkYnVzX21lc3NhZ2VfZ2V0X2F1dG9fc3RhcnQgKG1lc3NhZ2UpKQorICAgICAgICB7CisgICAgICAgICAgQnVzQWN0aXZhdGlvbiAqYWN0aXZhdGlvbjsKKyAgICAgICAgICAvKiBXZSBjYW4ndCBkbyB0aGUgc2VjdXJpdHkgcG9saWN5IGNoZWNrIGhlcmUsIHNpbmNlIHRoZSBhZGRyZXNzZWQKKyAgICAgICAgICAgKiByZWNpcGllbnQgc2VydmljZSBkb2Vzbid0IGV4aXN0IHlldC4gV2UgZG8gaXQgYmVmb3JlIHNlbmRpbmcgdGhlCisgICAgICAgICAgICogbWVzc2FnZSBhZnRlciB0aGUgc2VydmljZSBoYXMgYmVlbiBjcmVhdGVkLgorICAgICAgICAgICAqLworICAgICAgICAgIGFjdGl2YXRpb24gPSBidXNfY29ubmVjdGlvbl9nZXRfYWN0aXZhdGlvbiAoY29ubmVjdGlvbik7CisKKyAgICAgICAgICBpZiAoIWJ1c19hY3RpdmF0aW9uX2FjdGl2YXRlX3NlcnZpY2UgKGFjdGl2YXRpb24sIGNvbm5lY3Rpb24sIHRyYW5zYWN0aW9uLCBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgc2VydmljZV9uYW1lLCAmZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmZXJyb3IpOworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSgpIGZhaWxlZDogJXNcbiIsIGVycm9yLm5hbWUpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzZXJ2aWNlID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoJmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05BTUVfSEFTX05PX09XTkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiTmFtZSBcIiVzXCIgZG9lcyBub3QgZXhpc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBhZGRyZXNzZWRfcmVjaXBpZW50ID0gYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXJzX2Nvbm5lY3Rpb24gKHNlcnZpY2UpOworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoYWRkcmVzc2VkX3JlY2lwaWVudCAhPSBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBOb3cgc2VuZCB0aGUgbWVzc2FnZSB0byBpdHMgZGVzdGluYXRpb24gKG9yIG5vdCwgaWYKKyAgICogYWRkcmVzc2VkX3JlY2lwaWVudCA9PSBOVUxMKSwgYW5kIG1hdGNoIGl0IGFnYWluc3Qgb3RoZXIgY29ubmVjdGlvbnMnCisgICAqIG1hdGNoIHJ1bGVzLgorICAgKi8KKyAgaWYgKCFidXNfZGlzcGF0Y2hfbWF0Y2hlcyAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIGFkZHJlc3NlZF9yZWNpcGllbnQsIG1lc3NhZ2UsICZlcnJvcikpCisgICAgZ290byBvdXQ7CisKKyBvdXQ6CisgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICB7CisgICAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIElmIHdlIGRpc2Nvbm5lY3RlZCBpdCwgd2Ugd29uJ3QgYm90aGVyIHRvIHNlbmQgaXQgYW55IGVycm9yCisgICAgICAgICAgICogbWVzc2FnZXMuCisgICAgICAgICAgICovCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIk5vdCBzZW5kaW5nIGVycm9yIHRvIGNvbm5lY3Rpb24gd2UgZGlzY29ubmVjdGVkXG4iKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICBidXNfY29ubmVjdGlvbl9zZW5kX29vbV9lcnJvciAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgICAgICAgICAvKiBjYW5jZWwgdHJhbnNhY3Rpb24gZHVlIHRvIE9PTSAqLworICAgICAgICAgIGlmICh0cmFuc2FjdGlvbiAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBidXNfdHJhbnNhY3Rpb25fY2FuY2VsX2FuZF9mcmVlICh0cmFuc2FjdGlvbik7CisgICAgICAgICAgICAgIHRyYW5zYWN0aW9uID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogVHJ5IHRvIHNlbmQgdGhlIHJlYWwgZXJyb3IsIGlmIG5vIG1lbSB0byBkbyB0aGF0LCBzZW5kCisgICAgICAgICAgICogdGhlIE9PTSBlcnJvcgorICAgICAgICAgICAqLworICAgICAgICAgIF9kYnVzX2Fzc2VydCAodHJhbnNhY3Rpb24gIT0gTlVMTCk7CisgICAgICAgICAgaWYgKCFidXNfdHJhbnNhY3Rpb25fc2VuZF9lcnJvcl9yZXBseSAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yLCBtZXNzYWdlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fc2VuZF9vb21fZXJyb3IgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworCisgICAgICAgICAgICAgIC8qIGNhbmNlbCB0cmFuc2FjdGlvbiBkdWUgdG8gT09NICovCisgICAgICAgICAgICAgIGlmICh0cmFuc2FjdGlvbiAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGJ1c190cmFuc2FjdGlvbl9jYW5jZWxfYW5kX2ZyZWUgKHRyYW5zYWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgfQorCisgIGlmICh0cmFuc2FjdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGJ1c190cmFuc2FjdGlvbl9leGVjdXRlX2FuZF9mcmVlICh0cmFuc2FjdGlvbik7CisgICAgfQorCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitidXNfZGlzcGF0Y2hfbWVzc2FnZV9maWx0ZXIgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgcmV0dXJuIGJ1c19kaXNwYXRjaCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7Cit9CisKK2RidXNfYm9vbF90CitidXNfZGlzcGF0Y2hfYWRkX2Nvbm5lY3Rpb24gKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfZGlzcGF0Y2hfbWVzc2FnZV9maWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKwordm9pZAorYnVzX2Rpc3BhdGNoX3JlbW92ZV9jb25uZWN0aW9uIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgLyogSGVyZSB3ZSB0ZWxsIHRoZSBidXMgZHJpdmVyIHRoYXQgd2Ugd2FudCB0byBnZXQgb2ZmLiAqLworICBidXNfZHJpdmVyX3JlbW92ZV9jb25uZWN0aW9uIChjb25uZWN0aW9uKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX2ZpbHRlciAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19kaXNwYXRjaF9tZXNzYWdlX2ZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworfQorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyogVGhpcyBpcyB1c2VkIHRvIGtub3cgd2hldGhlciB3ZSBuZWVkIHRvIGJsb2NrIGluIG9yZGVyIHRvIGZpbmlzaAorICogc2VuZGluZyBhIG1lc3NhZ2UsIG9yIHdoZXRoZXIgdGhlIGluaXRpYWwgZGJ1c19jb25uZWN0aW9uX3NlbmQoKQorICogYWxyZWFkeSBmbHVzaGVkIHRoZSBxdWV1ZS4KKyAqLworI2RlZmluZSBTRU5EX1BFTkRJTkcoY29ubmVjdGlvbikgKGRidXNfY29ubmVjdGlvbl9oYXNfbWVzc2FnZXNfdG9fc2VuZCAoY29ubmVjdGlvbikpCisKK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogQ2hlY2sxRnVuYykgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0KTsKK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogQ2hlY2syRnVuYykgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCitzdGF0aWMgZGJ1c19ib29sX3QgY2hlY2tfbm9fbGVmdG92ZXJzIChCdXNDb250ZXh0ICpjb250ZXh0KTsKKworc3RhdGljIHZvaWQKK2Jsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqd2hhdF9pc19leHBlY3RlZCkKK3sKKyAgX2RidXNfdmVyYm9zZSAoImV4cGVjdGluZzogJXNcbiIsIHdoYXRfaXNfZXhwZWN0ZWQpOworCisgIHdoaWxlIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cyAoY29ubmVjdGlvbikgPT0KKyAgICAgICAgIERCVVNfRElTUEFUQ0hfQ09NUExFVEUgJiYKKyAgICAgICAgIGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBidXNfdGVzdF9ydW5fYnVzX2xvb3AgKGNvbnRleHQsIFRSVUUpOworICAgICAgYnVzX3Rlc3RfcnVuX2NsaWVudHNfbG9vcCAoRkFMU0UpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3NwaW5fY29ubmVjdGlvbl91bnRpbF9hdXRoZW50aWNhdGVkIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgX2RidXNfdmVyYm9zZSAoIlNwaW5uaW5nIHRvIGF1dGggY29ubmVjdGlvbiAlcFxuIiwgY29ubmVjdGlvbik7CisgIHdoaWxlICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19hdXRoZW50aWNhdGVkIChjb25uZWN0aW9uKSAmJgorICAgICAgICAgZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIGJ1c190ZXN0X3J1bl9idXNfbG9vcCAoY29udGV4dCwgRkFMU0UpOworICAgICAgYnVzX3Rlc3RfcnVuX2NsaWVudHNfbG9vcCAoRkFMU0UpOworICAgIH0KKyAgX2RidXNfdmVyYm9zZSAoIiAuLi4gZG9uZSBzcGlubmluZyB0byBhdXRoIGNvbm5lY3Rpb24gJXBcbiIsIGNvbm5lY3Rpb24pOworfQorCisvKiBjb21wZW5zYXRlIGZvciBmYWN0IHRoYXQgcG9wX21lc3NhZ2UoKSBjYW4gcmV0dXJuICNOVUxMIGR1ZSB0byBPT00gKi8KK3N0YXRpYyBEQnVzTWVzc2FnZSoKK3BvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIHdoaWxlIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cyAoY29ubmVjdGlvbikgPT0KKyAgICAgICAgIERCVVNfRElTUEFUQ0hfTkVFRF9NRU1PUlkpCisgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworCisgIHJldHVybiBkYnVzX2Nvbm5lY3Rpb25fcG9wX21lc3NhZ2UgKGNvbm5lY3Rpb24pOworfQorCitzdGF0aWMgREJ1c01lc3NhZ2UqCitib3Jyb3dfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICB3aGlsZSAoZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXMgKGNvbm5lY3Rpb24pID09CisgICAgICAgICBEQlVTX0RJU1BBVENIX05FRURfTUVNT1JZKQorICAgIF9kYnVzX3dhaXRfZm9yX21lbW9yeSAoKTsKKworICByZXR1cm4gZGJ1c19jb25uZWN0aW9uX2JvcnJvd19tZXNzYWdlIChjb25uZWN0aW9uKTsKK30KKworc3RhdGljIHZvaWQKK3dhcm5fdW5leHBlY3RlZF9yZWFsIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBsaW5lKQoreworICBpZiAobWVzc2FnZSkKKyAgICBfZGJ1c193YXJuICgiJXM6JWQgcmVjZWl2ZWQgbWVzc2FnZSBpbnRlcmZhY2UgXCIlc1wiIG1lbWJlciBcIiVzXCIgZXJyb3IgbmFtZSBcIiVzXCIgb24gJXAsIGV4cGVjdGluZyAlc1xuIiwKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiwgbGluZSwKKyAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSA6ICIodW5zZXQpIiwKKyAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA6ICIodW5zZXQpIiwKKyAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpIDogIih1bnNldCkiLAorICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgZXhwZWN0ZWQpOworICBlbHNlCisgICAgX2RidXNfd2FybiAoIiVzOiVkIHJlY2VpdmVkIG5vIG1lc3NhZ2Ugb24gJXAsIGV4cGVjdGluZyAlc1xuIiwKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiwgbGluZSwgY29ubmVjdGlvbiwgZXhwZWN0ZWQpOworfQorCisjZGVmaW5lIHdhcm5fdW5leHBlY3RlZChjb25uZWN0aW9uLCBtZXNzYWdlLCBleHBlY3RlZCkgXAorICB3YXJuX3VuZXhwZWN0ZWRfcmVhbCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgZXhwZWN0ZWQsIF9EQlVTX0ZVTkNUSU9OX05BTUUsIF9fTElORV9fKQorCitzdGF0aWMgdm9pZAordmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UpCit7CisgIF9kYnVzX3ZlcmJvc2UgKCJSZWNlaXZlZCBtZXNzYWdlIGludGVyZmFjZSBcIiVzXCIgbWVtYmVyIFwiJXNcIiBlcnJvciBuYW1lIFwiJXNcIiBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpIDogIih1bnNldCkiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgOiAiKHVuc2V0KSIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpIDogIih1bnNldCkiLAorICAgICAgICAgICAgICAgICBjb25uZWN0aW9uKTsKK30KKwordHlwZWRlZiBlbnVtCit7CisgIFNFUlZJQ0VfQ1JFQVRFRCwKKyAgT1dORVJfQ0hBTkdFRCwKKyAgU0VSVklDRV9ERUxFVEVECit9IFNlcnZpY2VJbmZvS2luZDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgU2VydmljZUluZm9LaW5kIGV4cGVjdGVkX2tpbmQ7CisgIGNvbnN0IGNoYXIgKmV4cGVjdGVkX3NlcnZpY2VfbmFtZTsKKyAgZGJ1c19ib29sX3QgZmFpbGVkOworICBEQnVzQ29ubmVjdGlvbiAqc2tpcF9jb25uZWN0aW9uOworfSBDaGVja1NlcnZpY2VPd25lckNoYW5nZWREYXRhOworCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NlcnZpY2Vfb3duZXJfY2hhbmdlZF9mb3JlYWNoIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSkKK3sKKyAgQ2hlY2tTZXJ2aWNlT3duZXJDaGFuZ2VkRGF0YSAqZCA9IGRhdGE7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBEQnVzRXJyb3IgZXJyb3I7CisgIGNvbnN0IGNoYXIgKnNlcnZpY2VfbmFtZSwgKm9sZF9vd25lciwgKm5ld19vd25lcjsKKworICBpZiAoZC0+ZXhwZWN0ZWRfa2luZCA9PSBTRVJWSUNFX0NSRUFURUQKKyAgICAgICYmIGNvbm5lY3Rpb24gPT0gZC0+c2tpcF9jb25uZWN0aW9uKQorICAgIHJldHVybiBUUlVFOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgZC0+ZmFpbGVkID0gVFJVRTsKKworICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCByZWNlaXZlIGEgbWVzc2FnZSBvbiAlcCwgZXhwZWN0aW5nICVzXG4iLAorICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwgIk5hbWVPd25lckNoYW5nZWQiKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgZWxzZSBpZiAoIWRidXNfbWVzc2FnZV9pc19zaWduYWwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWVPd25lckNoYW5nZWQiKSkKKyAgICB7CisgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJOYW1lT3duZXJDaGFuZ2VkIik7CisKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICByZWdldF9zZXJ2aWNlX2luZm9fZGF0YToKKyAgICAgIHNlcnZpY2VfbmFtZSA9IE5VTEw7CisgICAgICBvbGRfb3duZXIgPSBOVUxMOworICAgICAgbmV3X293bmVyID0gTlVMTDsKKworICAgICAgZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZvbGRfb3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZuZXdfb3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKworICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgIF9kYnVzX3dhaXRfZm9yX21lbW9yeSAoKTsKKyAgICAgICAgICAgICAgZ290byByZWdldF9zZXJ2aWNlX2luZm9fZGF0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGdldCB0aGUgZXhwZWN0ZWQgYXJndW1lbnRzXG4iKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgaWYgKChkLT5leHBlY3RlZF9raW5kID09IFNFUlZJQ0VfQ1JFQVRFRCAgICAmJiAoIG9sZF9vd25lclswXSB8fCAhbmV3X293bmVyWzBdKSkKKyAgICAgICAgICB8fCAoZC0+ZXhwZWN0ZWRfa2luZCA9PSBPV05FUl9DSEFOR0VEICAgJiYgKCFvbGRfb3duZXJbMF0gfHwgIW5ld19vd25lclswXSkpCisgICAgICAgICAgfHwgKGQtPmV4cGVjdGVkX2tpbmQgPT0gU0VSVklDRV9ERUxFVEVEICYmICghb2xkX293bmVyWzBdIHx8ICBuZXdfb3duZXJbMF0pKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJpbmNvbnNpc3RlbnQgTmFtZU93bmVyQ2hhbmdlZCBhcmd1bWVudHNcbiIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmIChzdHJjbXAgKHNlcnZpY2VfbmFtZSwgZC0+ZXhwZWN0ZWRfc2VydmljZV9uYW1lKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoImV4cGVjdGVkIGluZm8gb24gc2VydmljZSAlcywgZ290IGluZm8gb24gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZC0+ZXhwZWN0ZWRfc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKCpzZXJ2aWNlX25hbWUgPT0gJzonICYmIG5ld19vd25lclswXQorICAgICAgICAgICYmIHN0cmNtcCAoc2VydmljZV9uYW1lLCBuZXdfb3duZXIpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiaW5jb25zaXN0ZW50IFNlcnZpY2VPd25lZENoYW5nZWQgbWVzc2FnZSAoXCIlc1wiIFsgJXMgLT4gJXMgXSlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lLCBvbGRfb3duZXIsIG5ld19vd25lcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgZC0+ZmFpbGVkID0gRkFMU0U7CisKKyBvdXQ6CisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiAhZC0+ZmFpbGVkOworfQorCisKK3N0YXRpYyB2b2lkCitraWxsX2NsaWVudF9jb25uZWN0aW9uIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBjaGFyICpiYXNlX3NlcnZpY2U7CisgIGNvbnN0IGNoYXIgKnM7CisgIENoZWNrU2VydmljZU93bmVyQ2hhbmdlZERhdGEgc29jZDsKKworICBfZGJ1c192ZXJib3NlICgia2lsbGluZyBjb25uZWN0aW9uICVwXG4iLCBjb25uZWN0aW9uKTsKKworICBzID0gZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChzICE9IE5VTEwpOworCisgIHdoaWxlICgoYmFzZV9zZXJ2aWNlID0gX2RidXNfc3RyZHVwIChzKSkgPT0gTlVMTCkKKyAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisKKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7CisKKyAgLyoga2ljayBpbiB0aGUgZGlzY29ubmVjdCBoYW5kbGVyIHRoYXQgdW5yZWZzIHRoZSBjb25uZWN0aW9uICovCisgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoY29ubmVjdGlvbik7CisKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIF9kYnVzX2Fzc2VydCAoYnVzX3Rlc3RfY2xpZW50X2xpc3RlZCAoY29ubmVjdGlvbikpOworCisgIC8qIFJ1biBkaXNjb25uZWN0IGhhbmRsZXIgaW4gdGVzdC5jICovCisgIGlmIChidXNfY29ubmVjdGlvbl9kaXNwYXRjaF9vbmVfbWVzc2FnZSAoY29ubmVjdGlvbikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic29tZXRoaW5nIHJlY2VpdmVkIG9uIGNvbm5lY3Rpb24gYmVpbmcga2lsbGVkIG90aGVyIHRoYW4gdGhlIGRpc2Nvbm5lY3QiKTsKKworICBfZGJ1c19hc3NlcnQgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpOworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworICBjb25uZWN0aW9uID0gTlVMTDsKKyAgX2RidXNfYXNzZXJ0ICghYnVzX3Rlc3RfY2xpZW50X2xpc3RlZCAoY29ubmVjdGlvbikpOworCisgIHNvY2QuZXhwZWN0ZWRfa2luZCA9IFNFUlZJQ0VfREVMRVRFRDsKKyAgc29jZC5leHBlY3RlZF9zZXJ2aWNlX25hbWUgPSBiYXNlX3NlcnZpY2U7CisgIHNvY2QuZmFpbGVkID0gRkFMU0U7CisgIHNvY2Quc2tpcF9jb25uZWN0aW9uID0gTlVMTDsKKworICBidXNfdGVzdF9jbGllbnRzX2ZvcmVhY2ggKGNoZWNrX3NlcnZpY2Vfb3duZXJfY2hhbmdlZF9mb3JlYWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb2NkKTsKKworICBkYnVzX2ZyZWUgKGJhc2Vfc2VydmljZSk7CisKKyAgaWYgKHNvY2QuZmFpbGVkKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBnZXQgdGhlIGV4cGVjdGVkIE5hbWVPd25lckNoYW5nZWQgKGRlbGV0aW9uKSBtZXNzYWdlcyIpOworCisgIGlmICghY2hlY2tfbm9fbGVmdG92ZXJzIChjb250ZXh0KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzdHVmZiBsZWZ0IGluIG1lc3NhZ2UgcXVldWVzIGFmdGVyIGRpc2Nvbm5lY3RpbmcgYSBjbGllbnQiKTsKK30KKworc3RhdGljIHZvaWQKK2tpbGxfY2xpZW50X2Nvbm5lY3Rpb25fdW5jaGVja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgLyogVGhpcyBraWxscyB0aGUgY29ubmVjdGlvbiB3aXRob3V0IGV4cGVjdGluZyBpdCB0byBhZmZlY3QKKyAgICogdGhlIHJlc3Qgb2YgdGhlIGJ1cy4KKyAgICovCisgIF9kYnVzX3ZlcmJvc2UgKCJVbmNoZWNrZWQga2lsbCBvZiBjb25uZWN0aW9uICVwXG4iLCBjb25uZWN0aW9uKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fcmVmIChjb25uZWN0aW9uKTsKKyAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChjb25uZWN0aW9uKTsKKyAgLyogZGlzcGF0Y2hpbmcgZGlzY29ubmVjdCBoYW5kbGVyIHdpbGwgdW5yZWYgb25jZSAqLworICBpZiAoYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2hfb25lX21lc3NhZ2UgKGNvbm5lY3Rpb24pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm1lc3NhZ2Ugb3RoZXIgdGhhbiBkaXNjb25uZWN0IGRpc3BhdGNoZWQgYWZ0ZXIgZmFpbHVyZSB0byByZWdpc3RlciIpOworCisgIF9kYnVzX2Fzc2VydCAoIWJ1c190ZXN0X2NsaWVudF9saXN0ZWQgKGNvbm5lY3Rpb24pKTsKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZGJ1c19ib29sX3QgZmFpbGVkOworfSBDaGVja05vTWVzc2FnZXNEYXRhOworCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX25vX21lc3NhZ2VzX2ZvcmVhY2ggKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpCit7CisgIENoZWNrTm9NZXNzYWdlc0RhdGEgKmQgPSBkYXRhOworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKworICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgaWYgKG1lc3NhZ2UgIT0gTlVMTCkKKyAgICB7CisgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJubyBtZXNzYWdlcyIpOworCisgICAgICBkLT5mYWlsZWQgPSBUUlVFOworICAgIH0KKworICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICByZXR1cm4gIWQtPmZhaWxlZDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19ub19sZWZ0b3ZlcnMgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIENoZWNrTm9NZXNzYWdlc0RhdGEgbm1kOworCisgIG5tZC5mYWlsZWQgPSBGQUxTRTsKKyAgYnVzX3Rlc3RfY2xpZW50c19mb3JlYWNoIChjaGVja19ub19tZXNzYWdlc19mb3JlYWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZubWQpOworCisgIGlmIChubWQuZmFpbGVkKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJsZWZ0b3ZlciBtZXNzYWdlIGZvdW5kXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19oZWxsb19tZXNzYWdlIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgREJ1c01lc3NhZ2UgKm5hbWVfbWVzc2FnZTsKKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0Vycm9yIGVycm9yOworICBjb25zdCBjaGFyICpuYW1lOworICBjb25zdCBjaGFyICphY3F1aXJlZDsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBuYW1lID0gTlVMTDsKKyAgYWNxdWlyZWQgPSBOVUxMOworICBtZXNzYWdlID0gTlVMTDsKKyAgbmFtZV9tZXNzYWdlID0gTlVMTDsKKworICBfZGJ1c192ZXJib3NlICgiY2hlY2tfaGVsbG9fbWVzc2FnZSBmb3IgJXBcbiIsIGNvbm5lY3Rpb24pOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxsbyIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7IC8qIGJlY2F1c2Ugd2UgbWF5IGdldCBkaXNjb25uZWN0ZWQgKi8KKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9oYXNfc2lnbmF0dXJlIChtZXNzYWdlLCAiIikpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWQgKHByZXN1bWFibHkgYXV0aCBmYWlsZWQpXG4iKTsKKworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIC8qIHNlbmQgb3VyIG1lc3NhZ2UgKi8KKyAgYnVzX3Rlc3RfcnVuX2NsaWVudHNfbG9vcCAoU0VORF9QRU5ESU5HIChjb25uZWN0aW9uKSk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZCAocHJlc3VtYWJseSBhdXRoIGZhaWxlZClcbiIpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gSGVsbG8iKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29ubmVjdGlvbiB3YXMgZGlzY29ubmVjdGVkIChwcmVzdW1hYmx5IGF1dGggZmFpbGVkKVxuIik7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICJIZWxsbyIsIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9oYXNfc2VuZGVyIChtZXNzYWdlLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2UgaGFzIHdyb25nIHNlbmRlciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgOiAiKG5vbmUpIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgeworICAgICAgICAgIDsgLyogZ29vZCwgdGhpcyBpcyBhIHZhbGlkIHJlc3BvbnNlICovCisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIm5vdCB0aGlzIGVycm9yIik7CisKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIENoZWNrU2VydmljZU93bmVyQ2hhbmdlZERhdGEgc29jZDsKKworICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTikKKyAgICAgICAgeworICAgICAgICAgIDsgLyogZ29vZCwgZXhwZWN0ZWQgKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAibWV0aG9kIHJldHVybiBmb3IgSGVsbG8iKTsKKworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICByZXRyeV9nZXRfaGVsbG9fbmFtZToKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgibm8gbWVtb3J5IHRvIGdldCBzZXJ2aWNlIG5hbWUgYXJnIGZyb20gaGVsbG9cbiIpOworICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgIF9kYnVzX3dhaXRfZm9yX21lbW9yeSAoKTsKKyAgICAgICAgICAgICAgZ290byByZXRyeV9nZXRfaGVsbG9fbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpOworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgdGhlIGV4cGVjdGVkIHNpbmdsZSBzdHJpbmcgYXJndW1lbnQgdG8gaGVsbG9cbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBfZGJ1c192ZXJib3NlICgiR290IGhlbGxvIG5hbWU6ICVzXG4iLCBuYW1lKTsKKworICAgICAgd2hpbGUgKCFkYnVzX2J1c19zZXRfdW5pcXVlX25hbWUgKGNvbm5lY3Rpb24sIG5hbWUpKQorICAgICAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisKKyAgICAgIHNvY2QuZXhwZWN0ZWRfa2luZCA9IFNFUlZJQ0VfQ1JFQVRFRDsKKyAgICAgIHNvY2QuZXhwZWN0ZWRfc2VydmljZV9uYW1lID0gbmFtZTsKKyAgICAgIHNvY2QuZmFpbGVkID0gRkFMU0U7CisgICAgICBzb2NkLnNraXBfY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247IC8qIHdlIGhhdmVuJ3QgZG9uZSBBZGRNYXRjaCBzbyB3b24ndCBnZXQgaXQgb3Vyc2VsdmVzICovCisgICAgICBidXNfdGVzdF9jbGllbnRzX2ZvcmVhY2ggKGNoZWNrX3NlcnZpY2Vfb3duZXJfY2hhbmdlZF9mb3JlYWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc29jZCk7CisKKyAgICAgIGlmIChzb2NkLmZhaWxlZCkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIG5hbWVfbWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAvKiBDbGllbnQgc2hvdWxkIGFsc28gaGF2ZSBnb3R0ZW4gU2VydmljZUFjcXVpcmVkICovCisKKyAgICAgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RpbmcgJXMsIGdvdCBub3RoaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICJOYW1lQWNxdWlyZWQiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgaWYgKCEgZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lQWNxdWlyZWQiKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RpbmcgJXMsIGdvdCBzbXRoZyBlbHNlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICJOYW1lQWNxdWlyZWQiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgcmV0cnlfZ2V0X2FjcXVpcmVkX25hbWU6CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwgJmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZhY3F1aXJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJubyBtZW1vcnkgdG8gZ2V0IHNlcnZpY2UgbmFtZSBhcmcgZnJvbSBhY3F1aXJlZFxuIik7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworICAgICAgICAgICAgICBnb3RvIHJldHJ5X2dldF9hY3F1aXJlZF9uYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSk7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGdldCB0aGUgZXhwZWN0ZWQgc2luZ2xlIHN0cmluZyBhcmd1bWVudCB0byBTZXJ2aWNlQWNxdWlyZWRcbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBfZGJ1c192ZXJib3NlICgiR290IGFjcXVpcmVkIG5hbWU6ICVzXG4iLCBhY3F1aXJlZCk7CisKKyAgICAgIGlmIChzdHJjbXAgKGFjcXVpcmVkLCBuYW1lKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkFjcXVpcmVkIG5hbWUgaXMgJXMgYnV0IGV4cGVjdGVkICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkLCBuYW1lKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgYWNxdWlyZWQgPSBOVUxMOworICAgIH0KKworICBpZiAoIWNoZWNrX25vX2xlZnRvdmVycyAoY29udGV4dCkpCisgICAgZ290byBvdXQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgX2RidXNfdmVyYm9zZSAoImVuZGluZyAtIHJldHZhbCA9ICVkXG4iLCByZXR2YWwpOworCisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIGlmIChuYW1lX21lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChuYW1lX21lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIHJldHVybnMgVFJVRSBpZiB0aGUgY29ycmVjdCB0aGluZyBoYXBwZW5zLAorICogYnV0IHRoZSBjb3JyZWN0IHRoaW5nIG1heSBpbmNsdWRlIE9PTSBlcnJvcnMuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfZG91YmxlX2hlbGxvX21lc3NhZ2UgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIHJldHZhbCA9IEZBTFNFOworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIF9kYnVzX3ZlcmJvc2UgKCJjaGVja19kb3VibGVfaGVsbG9fbWVzc2FnZSBmb3IgJXBcbiIsIGNvbm5lY3Rpb24pOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxsbyIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgJnNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICAvKiBzZW5kIG91ciBtZXNzYWdlICovCisgIGJ1c190ZXN0X3J1bl9jbGllbnRzX2xvb3AgKFNFTkRfUEVORElORyAoY29ubmVjdGlvbikpOworCisgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNvbm5lY3Rpb24pOyAvKiBiZWNhdXNlIHdlIG1heSBnZXQgZGlzY29ubmVjdGVkICovCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IHRvIEhlbGxvIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICJIZWxsbyIsIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9oYXNfc2VuZGVyIChtZXNzYWdlLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2UgaGFzIHdyb25nIHNlbmRlciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgOiAiKG5vbmUpIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgIT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAibWV0aG9kIHJldHVybiBmb3IgSGVsbG8iKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIWNoZWNrX25vX2xlZnRvdmVycyAoY29udGV4dCkpCisgICAgZ290byBvdXQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19nZXRfY29ubmVjdGlvbl91bml4X3VzZXIgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgY29uc3QgY2hhciAqYmFzZV9zZXJ2aWNlX25hbWU7CisgIGRidXNfdWludDMyX3QgdWlkOworCisgIHJldHZhbCA9IEZBTFNFOworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIF9kYnVzX3ZlcmJvc2UgKCJjaGVja19nZXRfY29ubmVjdGlvbl91bml4X3VzZXIgZm9yICVwXG4iLCBjb25uZWN0aW9uKTsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2V0Q29ubmVjdGlvblVuaXhVc2VyIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBiYXNlX3NlcnZpY2VfbmFtZSA9IGRidXNfYnVzX2dldF91bmlxdWVfbmFtZSAoY29ubmVjdGlvbik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmYmFzZV9zZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIC8qIHNlbmQgb3VyIG1lc3NhZ2UgKi8KKyAgYnVzX3Rlc3RfcnVuX2NsaWVudHNfbG9vcCAoU0VORF9QRU5ESU5HIChjb25uZWN0aW9uKSk7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7IC8qIGJlY2F1c2Ugd2UgbWF5IGdldCBkaXNjb25uZWN0ZWQgKi8KKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gR2V0Q29ubmVjdGlvblVuaXhVc2VyIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICJHZXRDb25uZWN0aW9uVW5peFVzZXIiLCBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAibm90IHRoaXMgZXJyb3IiKTsKKworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTikKKyAgICAgICAgeworICAgICAgICAgIDsgLyogZ29vZCwgZXhwZWN0ZWQgKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGhvZF9yZXR1cm4gZm9yIEdldENvbm5lY3Rpb25Vbml4VXNlciIpOworCisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgIHJldHJ5X2dldF9wcm9wZXJ0eToKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIm5vIG1lbW9yeSB0byBnZXQgdWlkIGJ5IEdldENvbm5lY3Rpb25Vbml4VXNlclxuIik7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworICAgICAgICAgICAgICBnb3RvIHJldHJ5X2dldF9wcm9wZXJ0eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpOworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgdGhlIGV4cGVjdGVkIERCVVNfVFlQRV9VSU5UMzIgZnJvbSBHZXRDb25uZWN0aW9uVW5peFVzZXJcbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICBpZiAoIWNoZWNrX25vX2xlZnRvdmVycyAoY29udGV4dCkpCisgICAgZ290byBvdXQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19nZXRfY29ubmVjdGlvbl91bml4X3Byb2Nlc3NfaWQgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgY29uc3QgY2hhciAqYmFzZV9zZXJ2aWNlX25hbWU7CisgIGRidXNfdWludDMyX3QgcGlkOworCisgIHJldHZhbCA9IEZBTFNFOworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIF9kYnVzX3ZlcmJvc2UgKCJjaGVja19nZXRfY29ubmVjdGlvbl91bml4X3Byb2Nlc3NfaWQgZm9yICVwXG4iLCBjb25uZWN0aW9uKTsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2V0Q29ubmVjdGlvblVuaXhQcm9jZXNzSUQiKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGJhc2Vfc2VydmljZV9uYW1lID0gZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lIChjb25uZWN0aW9uKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZiYXNlX3NlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgLyogc2VuZCBvdXIgbWVzc2FnZSAqLworICBidXNfdGVzdF9ydW5fY2xpZW50c19sb29wIChTRU5EX1BFTkRJTkcgKGNvbm5lY3Rpb24pKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICBkYnVzX2Nvbm5lY3Rpb25fcmVmIChjb25uZWN0aW9uKTsgLyogYmVjYXVzZSB3ZSBtYXkgZ2V0IGRpc2Nvbm5lY3RlZCAqLworICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sICJyZXBseSB0byBHZXRDb25uZWN0aW9uVW5peFByb2Nlc3NJRCIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKworICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCByZWNlaXZlIGEgcmVwbHkgdG8gJXMgJWQgb24gJXBcbiIsCisgICAgICAgICAgICAgICAgICAiR2V0Q29ubmVjdGlvblVuaXhQcm9jZXNzSUQiLCBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorI2lmZGVmIERCVVNfV0lOCisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsIERCVVNfRVJST1JfVU5JWF9QUk9DRVNTX0lEX1VOS05PV04pKQorICAgICAgICB7CisgICAgICAgICAgLyogV2UgYXJlIGV4cGVjdGluZyB0aGlzIGVycm9yLCBzaW5jZSB3ZSBrbm93IGluIHRoZSB0ZXN0IHN1aXRlIHdlIGFyZW4ndAorICAgICAgICAgICAqIHRhbGtpbmcgdG8gYSBjbGllbnQgcnVubmluZyBvbiBVTklYCisgICAgICAgICAgICovCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIldpbmRvd3MgY29ycmVjdGx5IGRvZXMgbm90IHN1cHBvcnQgR2V0Q29ubmVjdGlvblVuaXhQcm9jZXNzSURcbiIpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIm5vdCB0aGlzIGVycm9yIik7CisKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyNpZmRlZiBEQlVTX1dJTgorICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAiR2V0Q29ubmVjdGlvblVuaXhQcm9jZXNzSUQgdG8gZmFpbCBvbiBXaW5kb3dzIik7CisgICAgICBnb3RvIG91dDsKKyNlbHNlCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCBleHBlY3RlZCAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0aG9kX3JldHVybiBmb3IgR2V0Q29ubmVjdGlvblVuaXhQcm9jZXNzSUQiKTsKKworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICByZXRyeV9nZXRfcHJvcGVydHk6CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJnBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJubyBtZW1vcnkgdG8gZ2V0IHBpZCBieSBHZXRDb25uZWN0aW9uVW5peFByb2Nlc3NJRFxuIik7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworICAgICAgICAgICAgICBnb3RvIHJldHJ5X2dldF9wcm9wZXJ0eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpOworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgdGhlIGV4cGVjdGVkIERCVVNfVFlQRV9VSU5UMzIgZnJvbSBHZXRDb25uZWN0aW9uVW5peFByb2Nlc3NJRFxuIik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiB0ZXN0IGlmIHJldHVybmVkIHBpZCBpcyB0aGUgc2FtZSBhcyBvdXIgb3duIHBpZAorICAgICAgICAgICAqCisgICAgICAgICAgICogQHRvZG8gSXQgd291bGQgcHJvYmFibHkgYmUgZ29vZCB0byByZXN0cnVjdHVyZSB0aGUgdGVzdHMKKyAgICAgICAgICAgKiAgICAgICBpbiBhIHdheSBzbyBvdXIgcGFyZW50IGlzIHRoZSBidXMgdGhhdCB3ZSdyZSB0ZXN0aW5nCisgICAgICAgICAgICogICAgICAgY2F1c2UgdGhlbiB3ZSBjYW4gdGVzdCB0aGF0IHRoZSBwaWQgcmV0dXJuZWQgbWF0Y2hlcworICAgICAgICAgICAqICAgICAgIGdldHBwaWQoKQorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChwaWQgIT0gKGRidXNfdWludDMyX3QpIF9kYnVzX2dldHBpZCAoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSk7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJSZXN1bHQgZnJvbSBHZXRDb25uZWN0aW9uVW5peFByb2Nlc3NJRCBpcyBub3Qgb3VyIG93biBwaWRcbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qICFEQlVTX1dJTiAqLworICAgIH0KKworICBpZiAoIWNoZWNrX25vX2xlZnRvdmVycyAoY29udGV4dCkpCisgICAgZ290byBvdXQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19hZGRfbWF0Y2hfYWxsIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgREJ1c0Vycm9yIGVycm9yOworICBjb25zdCBjaGFyICplbXB0eSA9ICIiOworCisgIHJldHZhbCA9IEZBTFNFOworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIF9kYnVzX3ZlcmJvc2UgKCJjaGVja19hZGRfbWF0Y2hfYWxsIGZvciAlcFxuIiwgY29ubmVjdGlvbik7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFkZE1hdGNoIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICAvKiBlbXB0eSBzdHJpbmcgbWF0Y2ggcnVsZSBtYXRjaGVzIGV2ZXJ5dGhpbmcgKi8KKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsIERCVVNfVFlQRV9TVFJJTkcsICZlbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7IC8qIGJlY2F1c2Ugd2UgbWF5IGdldCBkaXNjb25uZWN0ZWQgKi8KKworICAvKiBzZW5kIG91ciBtZXNzYWdlICovCisgIGJ1c190ZXN0X3J1bl9jbGllbnRzX2xvb3AgKFNFTkRfUEVORElORyAoY29ubmVjdGlvbikpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gQWRkTWF0Y2giKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29ubmVjdGlvbiB3YXMgZGlzY29ubmVjdGVkXG4iKTsKKworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgcmVjZWl2ZSBhIHJlcGx5IHRvICVzICVkIG9uICVwXG4iLAorICAgICAgICAgICAgICAgICAgIkFkZE1hdGNoIiwgc2VyaWFsLCBjb25uZWN0aW9uKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICB2ZXJib3NlX21lc3NhZ2VfcmVjZWl2ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2hhc19zZW5kZXIgKG1lc3NhZ2UsIERCVVNfU0VSVklDRV9EQlVTKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZSBoYXMgd3Jvbmcgc2VuZGVyICVzXG4iLAorICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA6ICIobm9uZSkiKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAibm90IHRoaXMgZXJyb3IiKTsKKworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTikKKyAgICAgICAgeworICAgICAgICAgIDsgLyogZ29vZCwgZXhwZWN0ZWQgKi8KKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSA9PSBzZXJpYWwpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJtZXRob2QgcmV0dXJuIGZvciBBZGRNYXRjaCIpOworCisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKCFjaGVja19ub19sZWZ0b3ZlcnMgKGNvbnRleHQpKQorICAgIGdvdG8gb3V0OworCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIHJldHVybnMgVFJVRSBpZiB0aGUgY29ycmVjdCB0aGluZyBoYXBwZW5zLAorICogYnV0IHRoZSBjb3JyZWN0IHRoaW5nIG1heSBpbmNsdWRlIE9PTSBlcnJvcnMuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfaGVsbG9fY29ubmVjdGlvbiAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIERCdXNFcnJvciBlcnJvcjsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgY29ubmVjdGlvbiA9IGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKFRFU1RfREVCVUdfUElQRSwgJmVycm9yKTsKKyAgaWYgKGNvbm5lY3Rpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmZXJyb3IpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmICghYnVzX3NldHVwX2RlYnVnX2NsaWVudCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChjb25uZWN0aW9uKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgc3Bpbl9jb25uZWN0aW9uX3VudGlsX2F1dGhlbnRpY2F0ZWQgKGNvbnRleHQsIGNvbm5lY3Rpb24pOworCisgIGlmICghY2hlY2tfaGVsbG9fbWVzc2FnZSAoY29udGV4dCwgY29ubmVjdGlvbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgKGNvbm5lY3Rpb24pID09IE5VTEwpCisgICAgeworICAgICAgLyogV2UgZGlkbid0IHN1Y2Nlc3NmdWxseSByZWdpc3Rlciwgc28gd2UgY2FuJ3QKKyAgICAgICAqIGRvIHRoZSB1c3VhbCBraWxsX2NsaWVudF9jb25uZWN0aW9uKCkgY2hlY2tzCisgICAgICAgKi8KKyAgICAgIGtpbGxfY2xpZW50X2Nvbm5lY3Rpb25fdW5jaGVja2VkIChjb25uZWN0aW9uKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIWNoZWNrX2FkZF9tYXRjaF9hbGwgKGNvbnRleHQsIGNvbm5lY3Rpb24pKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGtpbGxfY2xpZW50X2Nvbm5lY3Rpb24gKGNvbnRleHQsIGNvbm5lY3Rpb24pOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworI2RlZmluZSBOT05FWElTVEVOVF9TRVJWSUNFX05BTUUgInRlc3QudGhpcy5zZXJ2aWNlLmRvZXMubm90LmV4aXN0LmV3dW9pdXJqZGZ4Y3ZuIgorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX25vbmV4aXN0ZW50X3NlcnZpY2Vfbm9fYXV0b19zdGFydCAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgY29uc3QgY2hhciAqbm9uZXhpc3RlbnQgPSBOT05FWElTVEVOVF9TRVJWSUNFX05BTUU7CisgIGRidXNfdWludDMyX3QgZmxhZ3M7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0YXJ0U2VydmljZUJ5TmFtZSIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgZGJ1c19tZXNzYWdlX3NldF9hdXRvX3N0YXJ0IChtZXNzYWdlLCBGQUxTRSk7CisKKyAgZmxhZ3MgPSAwOworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZub25leGlzdGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sICJyZXBseSB0byBBY3RpdmF0ZVNlcnZpY2Ugb24gbm9uZXhpc3RlbnQiKTsKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICJTdGFydFNlcnZpY2VCeU5hbWUiLCBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2UgaGFzIHdyb25nIHNlbmRlciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA6ICIobm9uZSkiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1NFUlZJQ0VfVU5LTk9XTikpCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgZXhwZWN0ZWQgYWxzbyAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJub3QgdGhpcyBlcnJvciIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgZXhwZWN0IHRvIHN1Y2Nlc3NmdWxseSBhY3RpdmF0ZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIE5PTkVYSVNURU5UX1NFUlZJQ0VfTkFNRSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX25vbmV4aXN0ZW50X3NlcnZpY2VfYXV0b19zdGFydCAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoTk9ORVhJU1RFTlRfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY2hvIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gRWNobyIpOworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCByZWNlaXZlIGEgcmVwbHkgdG8gJXMgJWQgb24gJXBcbiIsCisgICAgICAgICAgICAgICAgICAiRWNobyBtZXNzYWdlIChhdXRvIGFjdGl2YXRpb24pIiwgc2VyaWFsLCBjb25uZWN0aW9uKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICB2ZXJib3NlX21lc3NhZ2VfcmVjZWl2ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKQorICAgIHsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2hhc19zZW5kZXIgKG1lc3NhZ2UsIERCVVNfU0VSVklDRV9EQlVTKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlIGhhcyB3cm9uZyBzZW5kZXIgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgOiAiKG5vbmUpIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgeworICAgICAgICAgIDsgLyogZ29vZCwgdGhpcyBpcyBhIHZhbGlkIHJlc3BvbnNlICovCisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9TRVJWSUNFX1VOS05PV04pKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGV4cGVjdGVkIGFsc28gKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAibm90IHRoaXMgZXJyb3IiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGV4cGVjdCB0byBzdWNjZXNzZnVsbHkgYWN0aXZhdGUgJXNcbiIsCisgICAgICAgICAgICAgICAgICBOT05FWElTVEVOVF9TRVJWSUNFX05BTUUpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19iYXNlX3NlcnZpY2VfYWN0aXZhdGVkIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKmluaXRpYWxfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKipiYXNlX3NlcnZpY2VfcCkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0Vycm9yIGVycm9yOworICBjb25zdCBjaGFyICpiYXNlX3NlcnZpY2UsICpiYXNlX3NlcnZpY2VfZnJvbV9idXMsICpvbGRfb3duZXI7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBiYXNlX3NlcnZpY2UgPSBOVUxMOworICBvbGRfb3duZXIgPSBOVUxMOworICBiYXNlX3NlcnZpY2VfZnJvbV9idXMgPSBOVUxMOworCisgIG1lc3NhZ2UgPSBpbml0aWFsX21lc3NhZ2U7CisgIGRidXNfbWVzc2FnZV9yZWYgKG1lc3NhZ2UpOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lT3duZXJDaGFuZ2VkIikpCisgICAgeworICAgICAgQ2hlY2tTZXJ2aWNlT3duZXJDaGFuZ2VkRGF0YSBzb2NkOworCisgICAgcmVnZXRfc2VydmljZV9uYW1lX2FyZzoKKyAgICAgIGJhc2Vfc2VydmljZSA9IE5VTEw7CisgICAgICBvbGRfb3duZXIgPSBOVUxMOworICAgICAgYmFzZV9zZXJ2aWNlX2Zyb21fYnVzID0gTlVMTDsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmYmFzZV9zZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZvbGRfb3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmJhc2Vfc2VydmljZV9mcm9tX2J1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworICAgICAgICAgICAgICBnb3RvIHJlZ2V0X3NlcnZpY2VfbmFtZV9hcmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZSAlcyBkb2Vzbid0IGhhdmUgYSBzZXJ2aWNlIG5hbWU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiTmFtZU93bmVyQ2hhbmdlZCAoY3JlYXRpb24pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIGlmICgqYmFzZV9zZXJ2aWNlICE9ICc6JykKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RlZCBiYXNlIHNlcnZpY2UgYWN0aXZhdGlvbiwgZ290IFwiJXNcIiBpbnN0ZWFkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGJhc2Vfc2VydmljZSk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKHN0cmNtcCAoYmFzZV9zZXJ2aWNlLCBiYXNlX3NlcnZpY2VfZnJvbV9idXMpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiRXhwZWN0ZWQgYmFzZSBzZXJ2aWNlIGFjdGl2YXRpb24sIGdvdCBcIiVzXCIgaW5zdGVhZCB3aXRoIG93bmVyIFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBiYXNlX3NlcnZpY2UsIGJhc2Vfc2VydmljZV9mcm9tX2J1cyk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKG9sZF9vd25lclswXSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJSZWNlaXZlZCBhbiBvbGRfb3duZXIgYXJndW1lbnQgZHVyaW5nIGJhc2Ugc2VydmljZSBhY3RpdmF0aW9uLCBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgb2xkX293bmVyKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBzb2NkLmV4cGVjdGVkX2tpbmQgPSBTRVJWSUNFX0NSRUFURUQ7CisgICAgICBzb2NkLmV4cGVjdGVkX3NlcnZpY2VfbmFtZSA9IGJhc2Vfc2VydmljZTsKKyAgICAgIHNvY2QuZmFpbGVkID0gRkFMU0U7CisgICAgICBzb2NkLnNraXBfY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisgICAgICBidXNfdGVzdF9jbGllbnRzX2ZvcmVhY2ggKGNoZWNrX3NlcnZpY2Vfb3duZXJfY2hhbmdlZF9mb3JlYWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc29jZCk7CisKKyAgICAgIGlmIChzb2NkLmZhaWxlZCkKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAiTmFtZU93bmVyQ2hhbmdlZCAoY3JlYXRpb24pIGZvciBiYXNlIHNlcnZpY2UiKTsKKworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmIChiYXNlX3NlcnZpY2VfcCkKKyAgICAqYmFzZV9zZXJ2aWNlX3AgPSBiYXNlX3NlcnZpY2U7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfc2VydmljZV9hY3RpdmF0ZWQgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICphY3RpdmF0ZWRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqYmFzZV9zZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKmluaXRpYWxfbWVzc2FnZSkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0Vycm9yIGVycm9yOworICBkYnVzX3VpbnQzMl90IGFjdGl2YXRpb25fcmVzdWx0OworCisgIHJldHZhbCA9IEZBTFNFOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBtZXNzYWdlID0gaW5pdGlhbF9tZXNzYWdlOworICBkYnVzX21lc3NhZ2VfcmVmIChtZXNzYWdlKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmFtZU93bmVyQ2hhbmdlZCIpKQorICAgIHsKKyAgICAgIENoZWNrU2VydmljZU93bmVyQ2hhbmdlZERhdGEgc29jZDsKKyAgICAgIGNvbnN0IGNoYXIgKnNlcnZpY2VfbmFtZSwgKmJhc2Vfc2VydmljZV9mcm9tX2J1cywgKm9sZF9vd25lcjsKKworICAgIHJlZ2V0X3NlcnZpY2VfbmFtZV9hcmc6CisgICAgICBzZXJ2aWNlX25hbWUgPSBOVUxMOworICAgICAgb2xkX293bmVyID0gTlVMTDsKKyAgICAgIGJhc2Vfc2VydmljZV9mcm9tX2J1cyA9IE5VTEw7CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm9sZF9vd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmYmFzZV9zZXJ2aWNlX2Zyb21fYnVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgICAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisgICAgICAgICAgICAgIGdvdG8gcmVnZXRfc2VydmljZV9uYW1lX2FyZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlICVzIGRvZXNuJ3QgaGF2ZSBhIHNlcnZpY2UgbmFtZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lT3duZXJDaGFuZ2VkIChjcmVhdGlvbikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgaWYgKHN0cmNtcCAoc2VydmljZV9uYW1lLCBhY3RpdmF0ZWRfbmFtZSkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RlZCB0byBzZWUgc2VydmljZSAlcyBjcmVhdGVkLCBzYXcgJXMgaW5zdGVhZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBhY3RpdmF0ZWRfbmFtZSwgc2VydmljZV9uYW1lKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoc3RyY21wIChiYXNlX3NlcnZpY2VfbmFtZSwgYmFzZV9zZXJ2aWNlX2Zyb21fYnVzKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIk5hbWVPd25lckNoYW5nZWQgcmVwb3J0cyB3cm9uZyBiYXNlIHNlcnZpY2U6ICVzIG93bmVyLCBleHBlY3RlZCAlcyBpbnN0ZWFkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGJhc2Vfc2VydmljZV9mcm9tX2J1cywgYmFzZV9zZXJ2aWNlX25hbWUpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmIChvbGRfb3duZXJbMF0pCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiZXhwZWN0ZWQgYSAlcywgZ290IGEgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIk5hbWVPd25lckNoYW5nZWQgKGNyZWF0aW9uKSIsCisgICAgICAgICAgICAgICAgICAgICAgIk5hbWVPd25lckNoYW5nZWQgKGNoYW5nZSkiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBzb2NkLmV4cGVjdGVkX2tpbmQgPSBTRVJWSUNFX0NSRUFURUQ7CisgICAgICBzb2NkLnNraXBfY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisgICAgICBzb2NkLmZhaWxlZCA9IEZBTFNFOworICAgICAgc29jZC5leHBlY3RlZF9zZXJ2aWNlX25hbWUgPSBzZXJ2aWNlX25hbWU7CisgICAgICBidXNfdGVzdF9jbGllbnRzX2ZvcmVhY2ggKGNoZWNrX3NlcnZpY2Vfb3duZXJfY2hhbmdlZF9mb3JlYWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc29jZCk7CisKKyAgICAgIGlmIChzb2NkLmZhaWxlZCkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICBzZXJ2aWNlX25hbWUgPSBOVUxMOworICAgICAgb2xkX293bmVyID0gTlVMTDsKKyAgICAgIGJhc2Vfc2VydmljZV9mcm9tX2J1cyA9IE5VTEw7CisKKyAgICAgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RlZCBhIHJlcGx5IHRvICVzLCBnb3Qgbm90aGluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAiU3RhcnRTZXJ2aWNlQnlOYW1lIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJOYW1lT3duZXJDaGFuZ2VkIGZvciB0aGUgYWN0aXZhdGVkIG5hbWUiKTsKKworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpICE9IERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4pCisgICAgeworICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAicmVwbHkgdG8gU3RhcnRTZXJ2aWNlQnlOYW1lIik7CisKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBhY3RpdmF0aW9uX3Jlc3VsdCA9IDA7CisgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmYWN0aXZhdGlvbl9yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgaWYgKCFkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGhhdmUgYWN0aXZhdGlvbiByZXN1bHQgZmlyc3QgYXJndW1lbnQgdG8gJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICJTdGFydFNlcnZpY2VCeU5hbWUiLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGFjdGl2YXRpb25fcmVzdWx0ID09IERCVVNfU1RBUlRfUkVQTFlfU1VDQ0VTUykKKyAgICAgICAgOyAvKiBHb29kICovCisgICAgICBlbHNlIGlmIChhY3RpdmF0aW9uX3Jlc3VsdCA9PSBEQlVTX1NUQVJUX1JFUExZX0FMUkVBRFlfUlVOTklORykKKyAgICAgICAgOyAvKiBHb29kIGFsc28gKi8KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJBY3RpdmF0aW9uIHJlc3VsdCB3YXMgJXUsIG5vIGdvb2QuXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGFjdGl2YXRpb25fcmVzdWx0KTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICBpZiAoIWNoZWNrX25vX2xlZnRvdmVycyAoY29udGV4dCkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2VzIHdlcmUgbGVmdCBvdmVyIGFmdGVyIHZlcmlmeWluZyBleGlzdGVudCBhY3RpdmF0aW9uIHJlc3VsdHNcbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NlcnZpY2VfYXV0b19hY3RpdmF0ZWQgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqYWN0aXZhdGVkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqYmFzZV9zZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqaW5pdGlhbF9tZXNzYWdlKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIG1lc3NhZ2UgPSBpbml0aWFsX21lc3NhZ2U7CisgIGRidXNfbWVzc2FnZV9yZWYgKG1lc3NhZ2UpOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lT3duZXJDaGFuZ2VkIikpCisgICAgeworICAgICAgY29uc3QgY2hhciAqc2VydmljZV9uYW1lOworICAgICAgQ2hlY2tTZXJ2aWNlT3duZXJDaGFuZ2VkRGF0YSBzb2NkOworCisgICAgcmVnZXRfc2VydmljZV9uYW1lX2FyZzoKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworICAgICAgICAgICAgICBnb3RvIHJlZ2V0X3NlcnZpY2VfbmFtZV9hcmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZSAlcyBkb2Vzbid0IGhhdmUgYSBzZXJ2aWNlIG5hbWU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiTmFtZU93bmVyQ2hhbmdlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIGlmIChzdHJjbXAgKHNlcnZpY2VfbmFtZSwgYWN0aXZhdGVkX25hbWUpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiRXhwZWN0ZWQgdG8gc2VlIHNlcnZpY2UgJXMgY3JlYXRlZCwgc2F3ICVzIGluc3RlYWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgYWN0aXZhdGVkX25hbWUsIHNlcnZpY2VfbmFtZSk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgc29jZC5leHBlY3RlZF9raW5kID0gU0VSVklDRV9DUkVBVEVEOworICAgICAgc29jZC5leHBlY3RlZF9zZXJ2aWNlX25hbWUgPSBzZXJ2aWNlX25hbWU7CisgICAgICBzb2NkLmZhaWxlZCA9IEZBTFNFOworICAgICAgc29jZC5za2lwX2Nvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAgICAgYnVzX3Rlc3RfY2xpZW50c19mb3JlYWNoIChjaGVja19zZXJ2aWNlX293bmVyX2NoYW5nZWRfZm9yZWFjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvY2QpOworCisgICAgICBpZiAoc29jZC5mYWlsZWQpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICAvKiBOb3RlIHRoYXQgdGhpcyBkaWZmZXJzIGZyb20gcmVndWxhciBhY3RpdmF0aW9uIGluIHRoYXQgd2UgZG9uJ3QgZ2V0IGEKKyAgICAgICAqIHJlcGx5IHRvIEFjdGl2YXRlU2VydmljZSBoZXJlLgorICAgICAgICovCisKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICBtZXNzYWdlID0gTlVMTDsKKyAgICAgIHNlcnZpY2VfbmFtZSA9IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAiTmFtZU93bmVyQ2hhbmdlZCBmb3IgdGhlIGFjdGl2YXRlZCBuYW1lIik7CisKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfc2VydmljZV9kZWFjdGl2YXRlZCAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICphY3RpdmF0ZWRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpiYXNlX3NlcnZpY2UpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgQ2hlY2tTZXJ2aWNlT3duZXJDaGFuZ2VkRGF0YSBzb2NkOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIC8qIE5vdyB3ZSBhcmUgZXhwZWN0aW5nIFNlcnZpY2VPd25lckNoYW5nZWQgKGRlbGV0aW9uKSBtZXNzYWdlcyBmb3IgdGhlIGJhc2UKKyAgICogc2VydmljZSBhbmQgdGhlIGFjdGl2YXRlZF9uYW1lLiAgVGhlIGJhc2Ugc2VydmljZQorICAgKiBub3RpZmljYXRpb24gaXMgcmVxdWlyZWQgdG8gY29tZSBsYXN0LgorICAgKi8KKyAgc29jZC5leHBlY3RlZF9raW5kID0gU0VSVklDRV9ERUxFVEVEOworICBzb2NkLmV4cGVjdGVkX3NlcnZpY2VfbmFtZSA9IGFjdGl2YXRlZF9uYW1lOworICBzb2NkLmZhaWxlZCA9IEZBTFNFOworICBzb2NkLnNraXBfY29ubmVjdGlvbiA9IE5VTEw7CisgIGJ1c190ZXN0X2NsaWVudHNfZm9yZWFjaCAoY2hlY2tfc2VydmljZV9vd25lcl9jaGFuZ2VkX2ZvcmVhY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvY2QpOworCisgIGlmIChzb2NkLmZhaWxlZCkKKyAgICBnb3RvIG91dDsKKworICBzb2NkLmV4cGVjdGVkX2tpbmQgPSBTRVJWSUNFX0RFTEVURUQ7CisgIHNvY2QuZXhwZWN0ZWRfc2VydmljZV9uYW1lID0gYmFzZV9zZXJ2aWNlOworICBzb2NkLmZhaWxlZCA9IEZBTFNFOworICBzb2NkLnNraXBfY29ubmVjdGlvbiA9IE5VTEw7CisgIGJ1c190ZXN0X2NsaWVudHNfZm9yZWFjaCAoY2hlY2tfc2VydmljZV9vd25lcl9jaGFuZ2VkX2ZvcmVhY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvY2QpOworCisgIGlmIChzb2NkLmZhaWxlZCkKKyAgICBnb3RvIG91dDsKKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NlbmRfZXhpdF90b19zZXJ2aWNlIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpiYXNlX3NlcnZpY2UpCit7CisgIGRidXNfYm9vbF90IGdvdF9lcnJvcjsKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgX2RidXNfdmVyYm9zZSAoIlNlbmRpbmcgZXhpdCBtZXNzYWdlIHRvIHRoZSB0ZXN0IHNlcnZpY2VcbiIpOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIC8qIEtpbGwgb2ZmIHRoZSB0ZXN0IHNlcnZpY2UgYnkgc2VuZGluZyBpdCBhIHF1aXQgbWVzc2FnZSAqLworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeGl0Iik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBEbyB0aGlzIGFnYWluOyB3ZSBzdGlsbCBuZWVkIHRoZSBzZXJ2aWNlIHRvIGV4aXQuLi4gKi8KKyAgICAgIGlmICghY2hlY2tfc2VuZF9leGl0X3RvX3NlcnZpY2UgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUsIGJhc2Vfc2VydmljZSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgJnNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICAgICAgLyogRG8gdGhpcyBhZ2Fpbjsgd2Ugc3RpbGwgbmVlZCB0aGUgc2VydmljZSB0byBleGl0Li4uICovCisgICAgICBpZiAoIWNoZWNrX3NlbmRfZXhpdF90b19zZXJ2aWNlIChjb250ZXh0LCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lLCBiYXNlX3NlcnZpY2UpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIC8qIHNlbmQgbWVzc2FnZSAqLworICBidXNfdGVzdF9ydW5fY2xpZW50c19sb29wIChTRU5EX1BFTkRJTkcgKGNvbm5lY3Rpb24pKTsKKworICAvKiByZWFkIGl0IGluIGFuZCB3cml0ZSBpdCBvdXQgdG8gdGVzdCBzZXJ2aWNlICovCisgIGJ1c190ZXN0X3J1bl9idXNfbG9vcCAoY29udGV4dCwgRkFMU0UpOworCisgIC8qIHNlZSBpZiB3ZSBnb3QgYW4gZXJyb3IgZHVyaW5nIG1lc3NhZ2UgYnVzIGRpc3BhdGNoaW5nICovCisgIGJ1c190ZXN0X3J1bl9jbGllbnRzX2xvb3AgKEZBTFNFKTsKKyAgbWVzc2FnZSA9IGJvcnJvd19tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGdvdF9lcnJvciA9IG1lc3NhZ2UgIT0gTlVMTCAmJiBkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SOworICBpZiAobWVzc2FnZSkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmV0dXJuX21lc3NhZ2UgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICAgICAgbWVzc2FnZSA9IE5VTEw7CisgICAgfQorCisgIGlmICghZ290X2Vycm9yKQorICAgIHsKKyAgICAgIC8qIElmIG5vIGVycm9yLCB3YWl0IGZvciB0aGUgdGVzdCBzZXJ2aWNlIHRvIGV4aXQgKi8KKyAgICAgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInRlc3Qgc2VydmljZSB0byBleGl0Iik7CisKKyAgICAgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKyAgICB9CisKKyAgaWYgKGdvdF9lcnJvcikKKyAgICB7CisgICAgICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAobWVzc2FnZSAhPSBOVUxMKTsKKworICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSAhPSBzZXJpYWwpCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3Igd2l0aCB0aGUgY29ycmVjdCByZXBseSBzZXJpYWwiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYSBubyBtZW1vcnkgZXJyb3IgZnJvbSBhc2tpbmcgdGVzdCBzZXJ2aWNlIHRvIGV4aXQiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c192ZXJib3NlICgiR290IGVycm9yICVzIHdoZW4gYXNraW5nIHRlc3Qgc2VydmljZSB0byBleGl0XG4iLAorICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSk7CisKKyAgICAgIC8qIERvIHRoaXMgYWdhaW47IHdlIHN0aWxsIG5lZWQgdGhlIHNlcnZpY2UgdG8gZXhpdC4uLiAqLworICAgICAgaWYgKCFjaGVja19zZW5kX2V4aXRfdG9fc2VydmljZSAoY29udGV4dCwgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSwgYmFzZV9zZXJ2aWNlKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFjaGVja19zZXJ2aWNlX2RlYWN0aXZhdGVkIChjb250ZXh0LCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUsIGJhc2Vfc2VydmljZSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICAvKiBTaG91bGQgbm93IGhhdmUgYSBOb1JlcGx5IGVycm9yIGZyb20gdGhlIEV4aXQoKSBtZXRob2QKKyAgICAgICAqIGNhbGw7IGl0IHNob3VsZCBoYXZlIGNvbWUgYWZ0ZXIgYWxsIHRoZSBkZWFjdGl2YXRpb24KKyAgICAgICAqIHN0dWZmLgorICAgICAgICovCisgICAgICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKworICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBseSB0byBFeGl0KCkgbWV0aG9kIGNhbGwiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19SRVBMWSkpCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9SZXBseSBlcnJvciBmcm9tIEV4aXQoKSBtZXRob2QgY2FsbCIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSkgIT0gc2VyaWFsKQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yIHdpdGggdGhlIGNvcnJlY3QgcmVwbHkgc2VyaWFsIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgX2RidXNfdmVyYm9zZSAoIkdvdCBlcnJvciAlcyBhZnRlciB0ZXN0IHNlcnZpY2UgZXhpdGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSk7CisKKyAgICAgIGlmICghY2hlY2tfbm9fbGVmdG92ZXJzIChjb250ZXh0KSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlcyB3ZXJlIGxlZnQgb3ZlciBhZnRlciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBfREJVU19GVU5DVElPTl9OQU1FKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfZ290X2Vycm9yIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpmaXJzdF9lcnJvcl9uYW1lLAorICAgICAgICAgICAgICAgICAuLi4pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIHZhX2xpc3QgYXA7CisgIGRidXNfYm9vbF90IGVycm9yX2ZvdW5kOworICBjb25zdCBjaGFyICplcnJvcl9uYW1lOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGdldCBhbiBleHBlY3RlZCBlcnJvclxuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgIT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAiYW4gZXJyb3IiKTsKKworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGVycm9yX2ZvdW5kID0gRkFMU0U7CisKKyAgdmFfc3RhcnQgKGFwLCBmaXJzdF9lcnJvcl9uYW1lKTsKKyAgZXJyb3JfbmFtZSA9IGZpcnN0X2Vycm9yX25hbWU7CisgIHdoaWxlIChlcnJvcl9uYW1lICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwgZXJyb3JfbmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICBlcnJvcl9mb3VuZCA9IFRSVUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGVycm9yX25hbWUgPSB2YV9hcmcgKGFwLCBjaGFyKik7CisgICAgfQorICB2YV9lbmQgKGFwKTsKKworICBpZiAoIWVycm9yX2ZvdW5kKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RlZCBlcnJvciAlcyBvciBvdGhlciwgZ290ICVzIGluc3RlYWRcbiIsCisgICAgICAgICAgICAgICAgICBmaXJzdF9lcnJvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCit0eXBlZGVmIGVudW0KK3sKKyAgR09UX1NFUlZJQ0VfQ1JFQVRFRCwKKyAgR09UX1NFUlZJQ0VfREVMRVRFRCwKKyAgR09UX0VSUk9SLAorICBHT1RfU09NRVRISU5HX0VMU0UKK30gR290U2VydmljZUluZm87CisKK3N0YXRpYyBHb3RTZXJ2aWNlSW5mbworY2hlY2tfZ290X3NlcnZpY2VfaW5mbyAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIEdvdFNlcnZpY2VJbmZvIG1lc3NhZ2Vfa2luZDsKKworICBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmFtZU93bmVyQ2hhbmdlZCIpKQorICAgIHsKKyAgICAgIERCdXNFcnJvciBlcnJvcjsKKyAgICAgIGNvbnN0IGNoYXIgKnNlcnZpY2VfbmFtZSwgKm9sZF9vd25lciwgKm5ld19vd25lcjsKKyAgICAgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICAgIHJlZ2V0X3NlcnZpY2VfaW5mb19kYXRhOgorICAgICAgc2VydmljZV9uYW1lID0gTlVMTDsKKyAgICAgIG9sZF9vd25lciA9IE5VTEw7CisgICAgICBuZXdfb3duZXIgPSBOVUxMOworCisgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm9sZF9vd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm5ld19vd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gcmVnZXRfc2VydmljZV9pbmZvX2RhdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgidW5leHBlY3RlZCBhcmd1bWVudHMgZm9yIE5hbWVPd25lckNoYW5nZWQgbWVzc2FnZVxuIik7CisgICAgICAgICAgICAgIG1lc3NhZ2Vfa2luZCA9IEdPVF9TT01FVEhJTkdfRUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIW9sZF9vd25lclswXSkKKyAgICAgICAgbWVzc2FnZV9raW5kID0gR09UX1NFUlZJQ0VfQ1JFQVRFRDsKKyAgICAgIGVsc2UgaWYgKCFuZXdfb3duZXJbMF0pCisgICAgICAgIG1lc3NhZ2Vfa2luZCA9IEdPVF9TRVJWSUNFX0RFTEVURUQ7CisgICAgICBlbHNlCisgICAgICAgIG1lc3NhZ2Vfa2luZCA9IEdPVF9TT01FVEhJTkdfRUxTRTsKKworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgIH0KKyAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICBtZXNzYWdlX2tpbmQgPSBHT1RfRVJST1I7CisgIGVsc2UKKyAgICBtZXNzYWdlX2tpbmQgPSBHT1RfU09NRVRISU5HX0VMU0U7CisKKyAgcmV0dXJuIG1lc3NhZ2Vfa2luZDsKK30KKworI2RlZmluZSBFWElTVEVOVF9TRVJWSUNFX05BTUUgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIgorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2V4aXN0ZW50X3NlcnZpY2Vfbm9fYXV0b19zdGFydCAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgREJ1c01lc3NhZ2UgKmJhc2Vfc2VydmljZV9tZXNzYWdlOworICBjb25zdCBjaGFyICpiYXNlX3NlcnZpY2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGNvbnN0IGNoYXIgKmV4aXN0ZW50ID0gRVhJU1RFTlRfU0VSVklDRV9OQU1FOworICBkYnVzX3VpbnQzMl90IGZsYWdzOworCisgIGJhc2Vfc2VydmljZV9tZXNzYWdlID0gTlVMTDsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RhcnRTZXJ2aWNlQnlOYW1lIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBkYnVzX21lc3NhZ2Vfc2V0X2F1dG9fc3RhcnQgKG1lc3NhZ2UsIEZBTFNFKTsKKworICBmbGFncyA9IDA7CisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmV4aXN0ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgJnNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgLyogbm93IHdhaXQgZm9yIHRoZSBtZXNzYWdlIGJ1cyB0byBoZWFyIGJhY2sgZnJvbSB0aGUgYWN0aXZhdGVkCisgICAqIHNlcnZpY2UuCisgICAqLworICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sICJhY3RpdmF0ZWQgc2VydmljZSB0byBjb25uZWN0Iik7CisKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYW55IG1lc3NhZ2VzIGFmdGVyICVzICVkIG9uICVwXG4iLAorICAgICAgICAgICAgICAgICAgIlN0YXJ0U2VydmljZUJ5TmFtZSIsIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKyAgX2RidXNfdmVyYm9zZSAoIiAgKGFmdGVyIHNlbmRpbmcgJXMpXG4iLCAiU3RhcnRTZXJ2aWNlQnlOYW1lIik7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2UgaGFzIHdyb25nIHNlbmRlciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA6ICIobm9uZSkiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX0VYSVRFRCkgfHwKKyAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9TUEFXTl9DSElMRF9TSUdOQUxFRCkgfHwKKyAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9TUEFXTl9FWEVDX0ZBSUxFRCkpCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgZXhwZWN0ZWQgYWxzbyAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBleHBlY3QgZXJyb3IgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBHb3RTZXJ2aWNlSW5mbyBtZXNzYWdlX2tpbmQ7CisKKyAgICAgIGlmICghY2hlY2tfYmFzZV9zZXJ2aWNlX2FjdGl2YXRlZCAoY29udGV4dCwgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgJmJhc2Vfc2VydmljZSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBiYXNlX3NlcnZpY2VfbWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICBtZXNzYWdlID0gTlVMTDsKKworICAgICAgLyogV2UgbWF5IG5lZWQgdG8gYmxvY2sgaGVyZSBmb3IgdGhlIHRlc3Qgc2VydmljZSB0byBleGl0IG9yIGZpbmlzaCB1cCAqLworICAgICAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAidGVzdCBzZXJ2aWNlIHRvIGV4aXQgb3IgZmluaXNoIHVwIik7CisKKyAgICAgIG1lc3NhZ2UgPSBkYnVzX2Nvbm5lY3Rpb25fYm9ycm93X21lc3NhZ2UgKGNvbm5lY3Rpb24pOworICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYW55IG1lc3NhZ2VzIGFmdGVyIGJhc2Ugc2VydmljZSBjcmVhdGlvbiBub3RpZmljYXRpb25cbiIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIG1lc3NhZ2Vfa2luZCA9IGNoZWNrX2dvdF9zZXJ2aWNlX2luZm8gKG1lc3NhZ2UpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmV0dXJuX21lc3NhZ2UgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICAgICAgbWVzc2FnZSA9IE5VTEw7CisKKyAgICAgIHN3aXRjaCAobWVzc2FnZV9raW5kKQorICAgICAgICB7CisgICAgICAgIGNhc2UgR09UX1NPTUVUSElOR19FTFNFOgorICAgICAgICAgIF9kYnVzX3dhcm4gKCJVbmV4cGVjdGVkIG1lc3NhZ2UgYWZ0ZXIgQWN0aXZhdGVTZXJ2aWNlICIKKyAgICAgICAgICAgICAgICAgICAgICAiKHNob3VsZCBiZSBhbiBlcnJvciBvciBhIHNlcnZpY2UgYW5ub3VuY2VtZW50Iik7CisgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgY2FzZSBHT1RfRVJST1I6CisgICAgICAgICAgaWYgKCFjaGVja19nb3RfZXJyb3IgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfU1BBV05fQ0hJTERfRVhJVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05PX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAvKiBBIHNlcnZpY2UgZGVsZXRlZCBzaG91bGQgYmUgY29taW5nIGFsb25nIG5vdyBhZnRlciB0aGlzIGVycm9yLgorICAgICAgICAgICAqIFdlIGNhbiBhbHNvIGdldCB0aGUgZXJyb3IgKmFmdGVyKiB0aGUgc2VydmljZSBkZWxldGVkLgorICAgICAgICAgICAqLworCisgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisKKyAgICAgICAgY2FzZSBHT1RfU0VSVklDRV9ERUxFVEVEOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoZSBzZXJ2aWNlIHN0YXJ0ZWQgdXAgYW5kIGdvdCBhIGJhc2UgYWRkcmVzcywgYnV0IHRoZW4KKyAgICAgICAgICAgICAqIGZhaWxlZCB0byByZWdpc3RlciB1bmRlciBFWElTVEVOVF9TRVJWSUNFX05BTUUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ2hlY2tTZXJ2aWNlT3duZXJDaGFuZ2VkRGF0YSBzb2NkOworCisgICAgICAgICAgICBzb2NkLmV4cGVjdGVkX2tpbmQgPSBTRVJWSUNFX0RFTEVURUQ7CisgICAgICAgICAgICBzb2NkLmV4cGVjdGVkX3NlcnZpY2VfbmFtZSA9IGJhc2Vfc2VydmljZTsKKyAgICAgICAgICAgIHNvY2QuZmFpbGVkID0gRkFMU0U7CisgICAgICAgICAgICBzb2NkLnNraXBfY29ubmVjdGlvbiA9IE5VTEw7CisKKyAgICAgICAgICAgIGJ1c190ZXN0X2NsaWVudHNfZm9yZWFjaCAoY2hlY2tfc2VydmljZV9vd25lcl9jaGFuZ2VkX2ZvcmVhY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb2NkKTsKKworICAgICAgICAgICAgaWYgKHNvY2QuZmFpbGVkKQorICAgICAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICAgICAgLyogTm93IHdlIHNob3VsZCBnZXQgYW4gZXJyb3IgYWJvdXQgdGhlIHNlcnZpY2UgZXhpdGluZworICAgICAgICAgICAgICogaWYgd2UgZGlkbid0IGdldCBpdCBiZWZvcmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChtZXNzYWdlX2tpbmQgIT0gR09UX0VSUk9SKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAiZXJyb3IgYWJvdXQgc2VydmljZSBleGl0aW5nIik7CisKKyAgICAgICAgICAgICAgICAvKiBhbmQgcHJvY2VzcyBldmVyeXRoaW5nIGFnYWluICovCisgICAgICAgICAgICAgICAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgICAgICAgICAgICAgICAgaWYgKCFjaGVja19nb3RfZXJyb3IgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfU1BBV05fQ0hJTERfRVhJVEVELAorCQkJCSAgICAgIERCVVNfRVJST1JfTk9fTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBHT1RfU0VSVklDRV9DUkVBVEVEOgorICAgICAgICAgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICAgICAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gcG9wIG1lc3NhZ2Ugd2UganVzdCBwdXQgYmFjayEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvdWxkIGhhdmUgYmVlbiBhIE5hbWVPd25lckNoYW5nZWQgKGNyZWF0aW9uKVxuIik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFjaGVja19zZXJ2aWNlX2FjdGl2YXRlZCAoY29udGV4dCwgY29ubmVjdGlvbiwgRVhJU1RFTlRfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2Vfc2VydmljZSwgbWVzc2FnZSkpCisgICAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICAgICAgbWVzc2FnZSA9IE5VTEw7CisKKyAgICAgICAgICBpZiAoIWNoZWNrX25vX2xlZnRvdmVycyAoY29udGV4dCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlcyB3ZXJlIGxlZnQgb3ZlciBhZnRlciBzdWNjZXNzZnVsIGFjdGl2YXRpb25cbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworCSAgaWYgKCFjaGVja19zZW5kX2V4aXRfdG9fc2VydmljZSAoY29udGV4dCwgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWElTVEVOVF9TRVJWSUNFX05BTUUsIGJhc2Vfc2VydmljZSkpCisJICAgIGdvdG8gb3V0OworCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICBpZiAoYmFzZV9zZXJ2aWNlX21lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChiYXNlX3NlcnZpY2VfbWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworI2lmbmRlZiBEQlVTX1dJTl9GSVhNRQorLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19zZWdmYXVsdF9zZXJ2aWNlX25vX2F1dG9fc3RhcnQgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGNvbnN0IGNoYXIgKnNlZ3Zfc2VydmljZTsKKyAgZGJ1c191aW50MzJfdCBmbGFnczsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RhcnRTZXJ2aWNlQnlOYW1lIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBkYnVzX21lc3NhZ2Vfc2V0X2F1dG9fc3RhcnQgKG1lc3NhZ2UsIEZBTFNFKTsKKworICBzZWd2X3NlcnZpY2UgPSAib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2VnZmF1bHRTZXJ2aWNlIjsKKyAgZmxhZ3MgPSAwOworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZzZWd2X3NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gYWN0aXZhdGluZyBzZWdmYXVsdCBzZXJ2aWNlIik7CisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29ubmVjdGlvbiB3YXMgZGlzY29ubmVjdGVkXG4iKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICByZXR2YWwgPSBGQUxTRTsKKworICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCByZWNlaXZlIGEgcmVwbHkgdG8gJXMgJWQgb24gJXBcbiIsCisgICAgICAgICAgICAgICAgICAiU3RhcnRTZXJ2aWNlQnlOYW1lIiwgc2VyaWFsLCBjb25uZWN0aW9uKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICB2ZXJib3NlX21lc3NhZ2VfcmVjZWl2ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKQorICAgIHsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2hhc19zZW5kZXIgKG1lc3NhZ2UsIERCVVNfU0VSVklDRV9EQlVTKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlIGhhcyB3cm9uZyBzZW5kZXIgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgOiAiKG5vbmUpIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgeworICAgICAgICAgIDsgLyogZ29vZCwgdGhpcyBpcyBhIHZhbGlkIHJlc3BvbnNlICovCisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9GQUlMRUQpKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgY2hhciAqc2VydmljZWhlbHBlcjsKKyAgICAgICAgICBzZXJ2aWNlaGVscGVyID0gYnVzX2NvbnRleHRfZ2V0X3NlcnZpY2VoZWxwZXIgKGNvbnRleHQpOworICAgICAgICAgIC8qIG1ha2Ugc3VyZSB0aGlzIG9ubHkgaGFwcGVucyB3aXRoIHRoZSBsYXVuY2ggaGVscGVyICovCisgICAgICAgICAgX2RidXNfYXNzZXJ0IChzZXJ2aWNlaGVscGVyICE9IE5VTEwpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfU1BBV05fQ0hJTERfU0lHTkFMRUQpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGV4cGVjdGVkIGFsc28gKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAibm90IHRoaXMgZXJyb3IiKTsKKworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgZXhwZWN0IHRvIHN1Y2Nlc3NmdWxseSBhY3RpdmF0ZSBzZWdmYXVsdCBzZXJ2aWNlXG4iKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19zZWdmYXVsdF9zZXJ2aWNlX2F1dG9fc3RhcnQgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKCJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTZWdmYXVsdFNlcnZpY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY2hvIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gRWNobyBvbiBzZWdmYXVsdCBzZXJ2aWNlIik7CisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29ubmVjdGlvbiB3YXMgZGlzY29ubmVjdGVkXG4iKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICByZXR2YWwgPSBGQUxTRTsKKworICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCByZWNlaXZlIGEgcmVwbHkgdG8gJXMgJWQgb24gJXBcbiIsCisgICAgICAgICAgICAgICAgICAiRWNobyBtZXNzYWdlIChhdXRvIGFjdGl2YXRpb24pIiwgc2VyaWFsLCBjb25uZWN0aW9uKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICB2ZXJib3NlX21lc3NhZ2VfcmVjZWl2ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKQorICAgIHsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2hhc19zZW5kZXIgKG1lc3NhZ2UsIERCVVNfU0VSVklDRV9EQlVTKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlIGhhcyB3cm9uZyBzZW5kZXIgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgOiAiKG5vbmUpIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgeworICAgICAgICAgIDsgLyogZ29vZCwgdGhpcyBpcyBhIHZhbGlkIHJlc3BvbnNlICovCisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9TUEFXTl9DSElMRF9TSUdOQUxFRCkpCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgZXhwZWN0ZWQgYWxzbyAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJub3QgdGhpcyBlcnJvciIpOworCisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBleHBlY3QgdG8gc3VjY2Vzc2Z1bGx5IGFjdGl2YXRlIHNlZ2ZhdWx0IHNlcnZpY2VcbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKyNlbmRpZgorCisjZGVmaW5lIFRFU1RfRUNIT19NRVNTQUdFICJUZXN0IGVjaG8gbWVzc2FnZSIKKyNkZWZpbmUgVEVTVF9SVU5fSEVMTE9fRlJPTV9TRUxGX01FU1NBR0UgIlRlc3Qgc2VuZGluZyBtZXNzYWdlIHRvIHNlbGYiCisKKy8qIHJldHVybnMgVFJVRSBpZiB0aGUgY29ycmVjdCB0aGluZyBoYXBwZW5zLAorICogYnV0IHRoZSBjb3JyZWN0IHRoaW5nIG1heSBpbmNsdWRlIE9PTSBlcnJvcnMuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfZXhpc3RlbnRfaGVsbG9fZnJvbV9zZWxmIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgY29uc3QgY2hhciAqdGV4dDsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoRVhJU1RFTlRfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSdW5IZWxsb0Zyb21TZWxmIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICB0ZXh0ID0gVEVTVF9SVU5fSEVMTE9fRlJPTV9TRUxGX01FU1NBR0U7CisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKworICAvKiBOb3RlOiBpZiB0aGlzIHRlc3QgaXMgcnVuIGluIE9PTSBtb2RlLCBpdCB3aWxsIGJsb2NrIHdoZW4gdGhlIGJ1cworICAgKiBkb2Vzbid0IHNlbmQgYSByZXBseSBkdWUgdG8gT09NLgorICAgKi8KKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgZnJvbSBydW5uaW5nIGhlbGxvIGZyb20gc2VsZiIpOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gcG9wIG1lc3NhZ2UhIFNob3VsZCBoYXZlIGJlZW4gcmVwbHkgZnJvbSBSdW5IZWxsb0Zyb21TZWxmIG1lc3NhZ2VcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpICE9IHNlcmlhbCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiV3JvbmcgcmVwbHkgc2VyaWFsXG4iKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIHJldHVybiBUUlVFOworfQorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2V4aXN0ZW50X3BpbmcgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKEVYSVNURU5UX1NFUlZJQ0VfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL1Rlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGluZyIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgJnNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgLyogTm90ZTogaWYgdGhpcyB0ZXN0IGlzIHJ1biBpbiBPT00gbW9kZSwgaXQgd2lsbCBibG9jayB3aGVuIHRoZSBidXMKKyAgICogZG9lc24ndCBzZW5kIGEgcmVwbHkgZHVlIHRvIE9PTS4KKyAgICovCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IGZyb20gcnVubmluZyBQaW5nIik7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byBwb3AgbWVzc2FnZSEgU2hvdWxkIGhhdmUgYmVlbiByZXBseSBmcm9tIFBpbmcgbWVzc2FnZVxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSkgIT0gc2VyaWFsKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJXcm9uZyByZXBseSBzZXJpYWxcbiIpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgIT0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTikKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiVW5leHBlY3RlZCBtZXNzYWdlIHJldHVybiBkdXJpbmcgUGluZ1xuIik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19leGlzdGVudF9nZXRfbWFjaGluZV9pZCAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgY29uc3QgY2hhciAqbWFjaGluZV9pZDsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoRVhJU1RFTlRfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZXRNYWNoaW5lSWQiKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIC8qIE5vdGU6IGlmIHRoaXMgdGVzdCBpcyBydW4gaW4gT09NIG1vZGUsIGl0IHdpbGwgYmxvY2sgd2hlbiB0aGUgYnVzCisgICAqIGRvZXNuJ3Qgc2VuZCBhIHJlcGx5IGR1ZSB0byBPT00uCisgICAqLworICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sICJyZXBseSBmcm9tIHJ1bm5pbmcgR2V0TWFjaGluZUlkIik7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byBwb3AgbWVzc2FnZSEgU2hvdWxkIGhhdmUgYmVlbiByZXBseSBmcm9tIEdldE1hY2hpbmVJZCBtZXNzYWdlXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSAhPSBzZXJpYWwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIldyb25nIHJlcGx5IHNlcmlhbFxuIik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSAhPSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJVbmV4cGVjdGVkIG1lc3NhZ2UgcmV0dXJuIGR1cmluZyBHZXRNYWNoaW5lSWRcbiIpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgbWFjaGluZV9pZCA9IE5VTEw7CisgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCBOVUxMLCBEQlVTX1RZUEVfU1RSSU5HLCAmbWFjaGluZV9pZCwgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGdldCBhIG1hY2hpbmUgSUQgaW4gcmVwbHkgdG8gR2V0TWFjaGluZUlkXG4iKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChtYWNoaW5lX2lkID09IE5VTEwgfHwgc3RybGVuIChtYWNoaW5lX2lkKSAhPSAzMikKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTWFjaGluZSBpZCBsb29rcyBib2d1czogJyVzJ1xuIiwgbWFjaGluZV9pZCA/IG1hY2hpbmVfaWQgOiAibnVsbCIpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogV2UgY2FuJ3QgY2hlY2sgdGhhdCB0aGUgbWFjaGluZSBpZCBpcyBjb3JyZWN0IGJlY2F1c2UgZHVyaW5nIG1ha2UgY2hlY2sgaXQgaXMKKyAgICoganVzdCBtYWRlIHVwIGZvciBlYWNoIHByb2Nlc3Mgc2VwYXJhdGVseQorICAgKi8KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19leGlzdGVudF9zZXJ2aWNlX2F1dG9fc3RhcnQgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIERCdXNNZXNzYWdlICpiYXNlX3NlcnZpY2VfbWVzc2FnZTsKKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgY29uc3QgY2hhciAqYmFzZV9zZXJ2aWNlOworICBjb25zdCBjaGFyICp0ZXh0OworCisgIGJhc2Vfc2VydmljZV9tZXNzYWdlID0gTlVMTDsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoRVhJU1RFTlRfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY2hvIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICB0ZXh0ID0gVEVTVF9FQ0hPX01FU1NBR0U7CisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKworICAvKiBub3cgd2FpdCBmb3IgdGhlIG1lc3NhZ2UgYnVzIHRvIGhlYXIgYmFjayBmcm9tIHRoZSBhY3RpdmF0ZWQKKyAgICogc2VydmljZS4KKyAgICovCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IHRvIEVjaG8gb24gZXhpc3RlbnQgc2VydmljZSIpOworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgcmVjZWl2ZSBhbnkgbWVzc2FnZXMgYWZ0ZXIgYXV0byBzdGFydCAlZCBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKyAgX2RidXNfdmVyYm9zZSAoIiAgKGFmdGVyIHNlbmRpbmcgJXMpXG4iLCAiYXV0byBzdGFydCIpOworCisgIC8qIHdlIHNob3VsZCBnZXQgemVybyBvciB0d28gU2VydmljZU93bmVyQ2hhbmdlZCBzaWduYWxzICovCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCkKKyAgICB7CisgICAgICBHb3RTZXJ2aWNlSW5mbyBtZXNzYWdlX2tpbmQ7CisKKyAgICAgIGlmICghY2hlY2tfYmFzZV9zZXJ2aWNlX2FjdGl2YXRlZCAoY29udGV4dCwgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgJmJhc2Vfc2VydmljZSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBiYXNlX3NlcnZpY2VfbWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICBtZXNzYWdlID0gTlVMTDsKKworICAgICAgLyogV2UgbWF5IG5lZWQgdG8gYmxvY2sgaGVyZSBmb3IgdGhlIHRlc3Qgc2VydmljZSB0byBleGl0IG9yIGZpbmlzaCB1cCAqLworICAgICAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAic2VydmljZSB0byBleGl0Iik7CisKKyAgICAgIC8qIFNob3VsZCBnZXQgYSBzZXJ2aWNlIGNyZWF0aW9uIG5vdGlmaWNhdGlvbiBmb3IgdGhlIGFjdGl2YXRlZAorICAgICAgICogc2VydmljZSBuYW1lLCBvciBhIHNlcnZpY2UgZGVsZXRpb24gb24gdGhlIGJhc2Ugc2VydmljZSBuYW1lCisgICAgICAgKi8KKyAgICAgIG1lc3NhZ2UgPSBkYnVzX2Nvbm5lY3Rpb25fYm9ycm93X21lc3NhZ2UgKGNvbm5lY3Rpb24pOworICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJObyBtZXNzYWdlIGFmdGVyIGF1dG8gYWN0aXZhdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgIihzaG91bGQgYmUgYSBzZXJ2aWNlIGFubm91bmNlbWVudClcbiIpOworICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9yZXR1cm5fbWVzc2FnZSAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisgICAgICAgICAgbWVzc2FnZSA9IE5VTEw7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgbWVzc2FnZV9raW5kID0gY2hlY2tfZ290X3NlcnZpY2VfaW5mbyAobWVzc2FnZSk7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl9yZXR1cm5fbWVzc2FnZSAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisgICAgICBtZXNzYWdlID0gTlVMTDsKKworICAgICAgc3dpdGNoIChtZXNzYWdlX2tpbmQpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBHT1RfU0VSVklDRV9DUkVBVEVEOgorICAgICAgICAgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICAgICAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gcG9wIG1lc3NhZ2Ugd2UganVzdCBwdXQgYmFjayEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvdWxkIGhhdmUgYmVlbiBhIE5hbWVPd25lckNoYW5nZWQgKGNyZWF0aW9uKVxuIik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgLyogQ2hlY2sgdGhhdCBTZXJ2aWNlT3duZXJDaGFuZ2VkIChjcmVhdGlvbikgd2FzIGNvcnJlY3RseSByZWNlaXZlZCAqLworICAgICAgICAgIGlmICghY2hlY2tfc2VydmljZV9hdXRvX2FjdGl2YXRlZCAoY29udGV4dCwgY29ubmVjdGlvbiwgRVhJU1RFTlRfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9zZXJ2aWNlLCBtZXNzYWdlKSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworCisgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgICBtZXNzYWdlID0gTlVMTDsKKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgR09UX1NFUlZJQ0VfREVMRVRFRDoKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGUgc2VydmljZSBzdGFydGVkIHVwIGFuZCBnb3QgYSBiYXNlIGFkZHJlc3MsIGJ1dCB0aGVuCisgICAgICAgICAgICAgKiBmYWlsZWQgdG8gcmVnaXN0ZXIgdW5kZXIgRVhJU1RFTlRfU0VSVklDRV9OQU1FCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIENoZWNrU2VydmljZU93bmVyQ2hhbmdlZERhdGEgc29jZDsKKworICAgICAgICAgICAgc29jZC5leHBlY3RlZF9raW5kID0gU0VSVklDRV9ERUxFVEVEOworICAgICAgICAgICAgc29jZC5leHBlY3RlZF9zZXJ2aWNlX25hbWUgPSBiYXNlX3NlcnZpY2U7CisgICAgICAgICAgICBzb2NkLmZhaWxlZCA9IEZBTFNFOworICAgICAgICAgICAgc29jZC5za2lwX2Nvbm5lY3Rpb24gPSBOVUxMOworICAgICAgICAgICAgYnVzX3Rlc3RfY2xpZW50c19mb3JlYWNoIChjaGVja19zZXJ2aWNlX293bmVyX2NoYW5nZWRfZm9yZWFjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvY2QpOworCisgICAgICAgICAgICBpZiAoc29jZC5mYWlsZWQpCisgICAgICAgICAgICAgIGdvdG8gb3V0OworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBHT1RfRVJST1I6CisgICAgICAgIGNhc2UgR09UX1NPTUVUSElOR19FTFNFOgorICAgICAgICAgIF9kYnVzX3dhcm4gKCJVbmV4cGVjdGVkIG1lc3NhZ2UgYWZ0ZXIgYXV0byBhY3RpdmF0aW9uXG4iKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBPSywgbm93IHdlJ3ZlIGRlYWx0IHdpdGggU2VydmljZU93bmVyQ2hhbmdlZCBzaWduYWxzLCBub3cgc2hvdWxkCisgICAqIGNvbWUgdGhlIG1ldGhvZCByZXBseSAob3IgZXJyb3IpIGZyb20gdGhlIGluaXRpYWwgbWV0aG9kIGNhbGwKKyAgICovCisKKyAgLyogTm90ZTogaWYgdGhpcyB0ZXN0IGlzIHJ1biBpbiBPT00gbW9kZSwgaXQgd2lsbCBibG9jayB3aGVuIHRoZSBidXMKKyAgICogZG9lc24ndCBzZW5kIGEgcmVwbHkgZHVlIHRvIE9PTS4KKyAgICovCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IGZyb20gZWNobyBtZXNzYWdlIGFmdGVyIGF1dG8tYWN0aXZhdGlvbiIpOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gcG9wIG1lc3NhZ2UhIFNob3VsZCBoYXZlIGJlZW4gcmVwbHkgZnJvbSBlY2hvIG1lc3NhZ2VcbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSkgIT0gc2VyaWFsKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJXcm9uZyByZXBseSBzZXJpYWxcbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGlmICghY2hlY2tfZXhpc3RlbnRfcGluZyAoY29udGV4dCwgY29ubmVjdGlvbikpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFjaGVja19leGlzdGVudF9nZXRfbWFjaGluZV9pZCAoY29udGV4dCwgY29ubmVjdGlvbikpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFjaGVja19leGlzdGVudF9oZWxsb19mcm9tX3NlbGYgKGNvbnRleHQsIGNvbm5lY3Rpb24pKQorICAgIGdvdG8gb3V0OworCisgIGlmICghY2hlY2tfc2VuZF9leGl0X3RvX3NlcnZpY2UgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYSVNURU5UX1NFUlZJQ0VfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9zZXJ2aWNlKSkKKyAgICBnb3RvIG91dDsKKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIGlmIChiYXNlX3NlcnZpY2VfbWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKGJhc2Vfc2VydmljZV9tZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisjZGVmaW5lIFNFUlZJQ0VfRklMRV9NSVNTSU5HX05BTUUgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlRG90U2VydmljZUZpbGVEb2VzTm90RXhpc3QiCisKKy8qIHJldHVybnMgVFJVRSBpZiB0aGUgY29ycmVjdCB0aGluZyBoYXBwZW5zLAorICogYnV0IHRoZSBjb3JyZWN0IHRoaW5nIG1heSBpbmNsdWRlIE9PTSBlcnJvcnMuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfbGF1bmNoX3NlcnZpY2VfZmlsZV9taXNzaW5nIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChTRVJWSUNFX0ZJTEVfTUlTU0lOR19OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY2hvIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gc2VydmljZSBmaWxlIG1pc3Npbmcgc2hvdWxkIGZhaWwgdG8gYXV0by1zdGFydCIpOworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgcmVjZWl2ZSBhIHJlcGx5IHRvICVzICVkIG9uICVwXG4iLAorICAgICAgICAgICAgICAgICAgIkVjaG8gbWVzc2FnZSAoYXV0byBhY3RpdmF0aW9uKSIsIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9oYXNfc2VuZGVyIChtZXNzYWdlLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZSBoYXMgd3Jvbmcgc2VuZGVyICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpIDogIihub25lKSIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgYSB2YWxpZCByZXNwb25zZSAqLworICAgICAgICB9CisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfU0VSVklDRV9VTktOT1dOKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UoImdvdCBzZXJ2aWNlIHVua25vd25cbiIpOworICAgICAgICAgIDsgLyogZ29vZCwgdGhpcyBpcyBleHBlY3RlZCAob25seSB2YWxpZCB3aGVuIHVzaW5nIGxhdW5jaCBoZWxwZXIpICovCisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIm5vdCB0aGlzIGVycm9yIik7CisKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGV4cGVjdCB0byBzdWNjZXNzZnVsbHkgYXV0by1zdGFydCBtaXNzaW5nIHNlcnZpY2VcbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworI2RlZmluZSBTRVJWSUNFX1VTRVJfTUlTU0lOR19OQU1FICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb1VzZXIiCisKKy8qIHJldHVybnMgVFJVRSBpZiB0aGUgY29ycmVjdCB0aGluZyBoYXBwZW5zLAorICogYnV0IHRoZSBjb3JyZWN0IHRoaW5nIG1heSBpbmNsdWRlIE9PTSBlcnJvcnMuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfbGF1bmNoX3NlcnZpY2VfdXNlcl9taXNzaW5nIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChTRVJWSUNFX1VTRVJfTUlTU0lOR19OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY2hvIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLAorICAJCQkJCSAgICJyZXBseSB0byBzZXJ2aWNlIHdoaWNoIHNob3VsZCBmYWlsIHRvIGF1dG8tc3RhcnQgKG1pc3NpbmcgVXNlcikiKTsKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICJFY2hvIG1lc3NhZ2UgKGF1dG8gYWN0aXZhdGlvbikiLCBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2UgaGFzIHdyb25nIHNlbmRlciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA6ICIobm9uZSkiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1NQQVdOX0ZJTEVfSU5WQUxJRCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlKCJnb3Qgc2VydmljZSBmaWxlIGludmFsaWRcbiIpOworICAgICAgICAgIDsgLyogZ29vZCwgdGhpcyBpcyBleHBlY3RlZCAob25seSB2YWxpZCB3aGVuIHVzaW5nIGxhdW5jaCBoZWxwZXIpICovCisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIm5vdCB0aGlzIGVycm9yIik7CisKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGV4cGVjdCB0byBzdWNjZXNzZnVsbHkgYXV0by1zdGFydCBtaXNzaW5nIHNlcnZpY2VcbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworI2RlZmluZSBTRVJWSUNFX0VYRUNfTUlTU0lOR19OQU1FICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb0V4ZWMiCisKKy8qIHJldHVybnMgVFJVRSBpZiB0aGUgY29ycmVjdCB0aGluZyBoYXBwZW5zLAorICogYnV0IHRoZSBjb3JyZWN0IHRoaW5nIG1heSBpbmNsdWRlIE9PTSBlcnJvcnMuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfbGF1bmNoX3NlcnZpY2VfZXhlY19taXNzaW5nIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChTRVJWSUNFX0VYRUNfTUlTU0lOR19OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY2hvIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLAorICAJCQkJCSAgICJyZXBseSB0byBzZXJ2aWNlIHdoaWNoIHNob3VsZCBmYWlsIHRvIGF1dG8tc3RhcnQgKG1pc3NpbmcgRXhlYykiKTsKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICJFY2hvIG1lc3NhZ2UgKGF1dG8gYWN0aXZhdGlvbikiLCBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2UgaGFzIHdyb25nIHNlbmRlciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA6ICIobm9uZSkiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1NFUlZJQ0VfVU5LTk9XTikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlKCJjb3VsZCBub3QgYWN0aXZhdGUgYXMgaW52YWxpZCBzZXJ2aWNlIGZpbGUgd2FzIG5vdCBhZGRlZFxuIik7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGV4cGVjdGVkIGFzIHdlIHNob3VsZG4ndCBoYXZlIGJlZW4gYWRkZWQgdG8KKyAgICAgICAgICAgICAqIHRoZSBhY3RpdmF0aW9uIGxpc3Qgd2l0aCBhIG1pc3NpbmcgRXhlYyBrZXkgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1NQQVdOX0ZJTEVfSU5WQUxJRCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlKCJnb3Qgc2VydmljZSBmaWxlIGludmFsaWRcbiIpOworICAgICAgICAgIDsgLyogZ29vZCwgdGhpcyBpcyBhbGxvd2VkLCBhbmQgaXMgdGhlIG1lc3NhZ2UgcGFzc2VkIGJhY2sgZnJvbSB0aGUKKyAgICAgICAgICAgICAqIGxhdW5jaCBoZWxwZXIgKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAibm90IHRoaXMgZXJyb3IiKTsKKworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgZXhwZWN0IHRvIHN1Y2Nlc3NmdWxseSBhdXRvLXN0YXJ0IG1pc3Npbmcgc2VydmljZVxuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisjZGVmaW5lIFNFUlZJQ0VfU0VSVklDRV9NSVNTSU5HX05BTUUgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vU2VydmljZSIKKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19sYXVuY2hfc2VydmljZV9zZXJ2aWNlX21pc3NpbmcgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKFNFUlZJQ0VfU0VSVklDRV9NSVNTSU5HX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVjaG8iKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisgIAkJCQkJICAgInJlcGx5IHRvIHNlcnZpY2Ugd2hpY2ggc2hvdWxkIGZhaWwgdG8gYXV0by1zdGFydCAobWlzc2luZyBTZXJ2aWNlKSIpOworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgcmVjZWl2ZSBhIHJlcGx5IHRvICVzICVkIG9uICVwXG4iLAorICAgICAgICAgICAgICAgICAgIkVjaG8gbWVzc2FnZSAoYXV0byBhY3RpdmF0aW9uKSIsIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9oYXNfc2VuZGVyIChtZXNzYWdlLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZSBoYXMgd3Jvbmcgc2VuZGVyICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpIDogIihub25lKSIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgYSB2YWxpZCByZXNwb25zZSAqLworICAgICAgICB9CisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfU0VSVklDRV9VTktOT1dOKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UoImNvdWxkIG5vdCBhY3RpdmF0ZSBhcyBpbnZhbGlkIHNlcnZpY2UgZmlsZSB3YXMgbm90IGFkZGVkXG4iKTsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgZXhwZWN0ZWQgYXMgd2Ugc2hvdWxkbid0IGhhdmUgYmVlbiBhZGRlZCB0bworICAgICAgICAgICAgICogdGhlIGFjdGl2YXRpb24gbGlzdCB3aXRoIGEgbWlzc2luZyBFeGVjIGtleSAqLworICAgICAgICB9CisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfU1BBV05fRklMRV9JTlZBTElEKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UoImdvdCBzZXJ2aWNlIGZpbGUgaW52YWxpZFxuIik7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGFsbG93ZWQsIGFuZCBpcyB0aGUgbWVzc2FnZSBwYXNzZWQgYmFjayBmcm9tIHRoZQorICAgICAgICAgICAgICogbGF1bmNoIGhlbHBlciAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJub3QgdGhpcyBlcnJvciIpOworCisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBleHBlY3QgdG8gc3VjY2Vzc2Z1bGx5IGF1dG8tc3RhcnQgbWlzc2luZyBzZXJ2aWNlXG4iKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKyNkZWZpbmUgU0hFTExfRkFJTF9TRVJWSUNFX05BTUUgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VGYWlsIgorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NoZWxsX2ZhaWxfc2VydmljZV9hdXRvX3N0YXJ0IChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKFNIRUxMX0ZBSUxfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY2hvIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gc2hlbGwgRWNobyBvbiBzZXJ2aWNlIHdoaWNoIHNob3VsZCBmYWlsIHRvIGF1dG8tc3RhcnQiKTsKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICJFY2hvIG1lc3NhZ2UgKGF1dG8gYWN0aXZhdGlvbikiLCBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2UgaGFzIHdyb25nIHNlbmRlciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA6ICIobm9uZSkiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUykpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlKCJnb3QgaW52YWxpZCBhcmdzXG4iKTsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgZXhwZWN0ZWQgYWxzbyAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJub3QgdGhpcyBlcnJvciIpOworCisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBleHBlY3QgdG8gc3VjY2Vzc2Z1bGx5IGF1dG8tc3RhcnQgc2hlbGwgZmFpbCBzZXJ2aWNlXG4iKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKyNkZWZpbmUgU0hFTExfU1VDQ0VTU19TRVJWSUNFX05BTUUgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VTdWNjZXNzIgorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NoZWxsX3NlcnZpY2Vfc3VjY2Vzc19hdXRvX3N0YXJ0IChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIERCdXNNZXNzYWdlICpiYXNlX3NlcnZpY2VfbWVzc2FnZTsKKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgY29uc3QgY2hhciAqYmFzZV9zZXJ2aWNlOworICBjb25zdCBjaGFyICphcmd2WzddID0ge05VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEx9OworCisgIGJhc2Vfc2VydmljZV9tZXNzYWdlID0gTlVMTDsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoU0hFTExfU1VDQ0VTU19TRVJWSUNFX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVjaG8iKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIC8qIG5vdyB3YWl0IGZvciB0aGUgbWVzc2FnZSBidXMgdG8gaGVhciBiYWNrIGZyb20gdGhlIGFjdGl2YXRlZAorICAgKiBzZXJ2aWNlLgorICAgKi8KKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gRWNobyBvbiBzaGVsbCBzdWNjZXNzIHNlcnZpY2UiKTsKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYW55IG1lc3NhZ2VzIGFmdGVyIGF1dG8gc3RhcnQgJWQgb24gJXBcbiIsCisgICAgICAgICAgICAgICAgICBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisgIF9kYnVzX3ZlcmJvc2UgKCIgIChhZnRlciBzZW5kaW5nICVzKVxuIiwgImF1dG8gc3RhcnQiKTsKKworICAvKiB3ZSBzaG91bGQgZ2V0IHplcm8gb3IgdHdvIFNlcnZpY2VPd25lckNoYW5nZWQgc2lnbmFscyAqLworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpCisgICAgeworICAgICAgR290U2VydmljZUluZm8gbWVzc2FnZV9raW5kOworCisgICAgICBpZiAoIWNoZWNrX2Jhc2Vfc2VydmljZV9hY3RpdmF0ZWQgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsICZiYXNlX3NlcnZpY2UpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgYmFzZV9zZXJ2aWNlX21lc3NhZ2UgPSBtZXNzYWdlOworICAgICAgbWVzc2FnZSA9IE5VTEw7CisKKyAgICAgIC8qIFdlIG1heSBuZWVkIHRvIGJsb2NrIGhlcmUgZm9yIHRoZSB0ZXN0IHNlcnZpY2UgdG8gZXhpdCBvciBmaW5pc2ggdXAgKi8KKyAgICAgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInNlcnZpY2UgdG8gZXhpdCIpOworCisgICAgICAvKiBTaG91bGQgZ2V0IGEgc2VydmljZSBjcmVhdGlvbiBub3RpZmljYXRpb24gZm9yIHRoZSBhY3RpdmF0ZWQKKyAgICAgICAqIHNlcnZpY2UgbmFtZSwgb3IgYSBzZXJ2aWNlIGRlbGV0aW9uIG9uIHRoZSBiYXNlIHNlcnZpY2UgbmFtZQorICAgICAgICovCisgICAgICBtZXNzYWdlID0gZGJ1c19jb25uZWN0aW9uX2JvcnJvd19tZXNzYWdlIChjb25uZWN0aW9uKTsKKyAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiTm8gbWVzc2FnZSBhZnRlciBhdXRvIGFjdGl2YXRpb24gIgorICAgICAgICAgICAgICAgICAgICAgICIoc2hvdWxkIGJlIGEgc2VydmljZSBhbm5vdW5jZW1lbnQpXG4iKTsKKyAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmV0dXJuX21lc3NhZ2UgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICAgICAgICAgIG1lc3NhZ2UgPSBOVUxMOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIG1lc3NhZ2Vfa2luZCA9IGNoZWNrX2dvdF9zZXJ2aWNlX2luZm8gKG1lc3NhZ2UpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmV0dXJuX21lc3NhZ2UgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICAgICAgbWVzc2FnZSA9IE5VTEw7CisKKyAgICAgIHN3aXRjaCAobWVzc2FnZV9raW5kKQorICAgICAgICB7CisgICAgICAgIGNhc2UgR09UX1NFUlZJQ0VfQ1JFQVRFRDoKKyAgICAgICAgICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgICAgICAgICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIHBvcCBtZXNzYWdlIHdlIGp1c3QgcHV0IGJhY2shICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInNob3VsZCBoYXZlIGJlZW4gYSBOYW1lT3duZXJDaGFuZ2VkIChjcmVhdGlvbilcbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8qIENoZWNrIHRoYXQgU2VydmljZU93bmVyQ2hhbmdlZCAoY3JlYXRpb24pIHdhcyBjb3JyZWN0bHkgcmVjZWl2ZWQgKi8KKyAgICAgICAgICBpZiAoIWNoZWNrX3NlcnZpY2VfYXV0b19hY3RpdmF0ZWQgKGNvbnRleHQsIGNvbm5lY3Rpb24sIFNIRUxMX1NVQ0NFU1NfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9zZXJ2aWNlLCBtZXNzYWdlKSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworCisgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgICBtZXNzYWdlID0gTlVMTDsKKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgR09UX1NFUlZJQ0VfREVMRVRFRDoKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGUgc2VydmljZSBzdGFydGVkIHVwIGFuZCBnb3QgYSBiYXNlIGFkZHJlc3MsIGJ1dCB0aGVuCisgICAgICAgICAgICAgKiBmYWlsZWQgdG8gcmVnaXN0ZXIgdW5kZXIgU0hFTExfU1VDQ0VTU19TRVJWSUNFX05BTUUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ2hlY2tTZXJ2aWNlT3duZXJDaGFuZ2VkRGF0YSBzb2NkOworCisgICAgICAgICAgICBzb2NkLmV4cGVjdGVkX2tpbmQgPSBTRVJWSUNFX0RFTEVURUQ7CisgICAgICAgICAgICBzb2NkLmV4cGVjdGVkX3NlcnZpY2VfbmFtZSA9IGJhc2Vfc2VydmljZTsKKyAgICAgICAgICAgIHNvY2QuZmFpbGVkID0gRkFMU0U7CisgICAgICAgICAgICBzb2NkLnNraXBfY29ubmVjdGlvbiA9IE5VTEw7CisgICAgICAgICAgICBidXNfdGVzdF9jbGllbnRzX2ZvcmVhY2ggKGNoZWNrX3NlcnZpY2Vfb3duZXJfY2hhbmdlZF9mb3JlYWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc29jZCk7CisKKyAgICAgICAgICAgIGlmIChzb2NkLmZhaWxlZCkKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEdPVF9FUlJPUjoKKyAgICAgICAgY2FzZSBHT1RfU09NRVRISU5HX0VMU0U6CisgICAgICAgICAgX2RidXNfd2FybiAoIlVuZXhwZWN0ZWQgbWVzc2FnZSBhZnRlciBhdXRvIGFjdGl2YXRpb25cbiIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCisgIC8qIE9LLCBub3cgd2UndmUgZGVhbHQgd2l0aCBTZXJ2aWNlT3duZXJDaGFuZ2VkIHNpZ25hbHMsIG5vdyBzaG91bGQKKyAgICogY29tZSB0aGUgbWV0aG9kIHJlcGx5IChvciBlcnJvcikgZnJvbSB0aGUgaW5pdGlhbCBtZXRob2QgY2FsbAorICAgKi8KKworICAvKiBOb3RlOiBpZiB0aGlzIHRlc3QgaXMgcnVuIGluIE9PTSBtb2RlLCBpdCB3aWxsIGJsb2NrIHdoZW4gdGhlIGJ1cworICAgKiBkb2Vzbid0IHNlbmQgYSByZXBseSBkdWUgdG8gT09NLgorICAgKi8KKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgZnJvbSBlY2hvIG1lc3NhZ2UgYWZ0ZXIgYXV0by1hY3RpdmF0aW9uIik7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byBwb3AgbWVzc2FnZSEgU2hvdWxkIGhhdmUgYmVlbiByZXBseSBmcm9tIGVjaG8gbWVzc2FnZVxuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSAhPSBzZXJpYWwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIldyb25nIHJlcGx5IHNlcmlhbFxuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmYXJndlswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZhcmd2WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmFyZ3ZbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmYXJndlszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZhcmd2WzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmFyZ3ZbNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmYXJndls2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRXJyb3IgZ2V0dGluZyBhcmd1bWVudHMgZnJvbSByZXR1cm5cbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAvKiBkb24ndCB3b3JyeSBhYm91dCBhcmdbMF0gYXMgaXQgbWF5IGJlIGRpZmZlcmVudAorICAgICAgZGVwZW5kaW5nIG9uIHRoZSBwYXRoIHRvIHRoZSB0ZXN0cworICAgKi8KKyAgaWYgKHN0cmNtcCgiLXRlc3QiLCBhcmd2WzFdKSAhPSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJVbmV4cGVjdGVkIGFyZ3ZbMV0gaW4gc2hlbGwgc3VjY2VzcyBzZXJ2aWNlIHRlc3QgKGV4cGVjdGVkOiAlcywgZ290OiAlcylcbiIsCisgICAgICAgICAgICAgICAgICAiLXRlc3QiLCBhcmd2WzFdKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoc3RyY21wKCJ0aGF0IiwgYXJndlsyXSkgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiVW5leHBlY3RlZCBhcmd2WzJdIGluIHNoZWxsIHN1Y2Nlc3Mgc2VydmljZSB0ZXN0IChleHBlY3RlZDogJXMsIGdvdDogJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICJ0aGF0IiwgYXJndlsyXSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKHN0cmNtcCgid2UgZ2V0IiwgYXJndlszXSkgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiVW5leHBlY3RlZCBhcmd2WzNdIGluIHNoZWxsIHN1Y2Nlc3Mgc2VydmljZSB0ZXN0IChleHBlY3RlZDogJXMsIGdvdDogJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICJ3ZSBnZXQiLCBhcmd2WzNdKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoc3RyY21wKCJiYWNrIiwgYXJndls0XSkgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiVW5leHBlY3RlZCBhcmd2WzRdIGluIHNoZWxsIHN1Y2Nlc3Mgc2VydmljZSB0ZXN0IChleHBlY3RlZDogJXMsIGdvdDogJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICJiYWNrIiwgYXJndls0XSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKHN0cmNtcCgiLS13aGF0IiwgYXJndls1XSkgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiVW5leHBlY3RlZCBhcmd2WzVdIGluIHNoZWxsIHN1Y2Nlc3Mgc2VydmljZSB0ZXN0IChleHBlY3RlZDogJXMsIGdvdDogJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICItLXdoYXQiLCBhcmd2WzVdKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoc3RyY21wKCJ3ZSBwdXQgaW4iLCBhcmd2WzZdKSAhPSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJVbmV4cGVjdGVkIGFyZ3ZbNl0gaW4gc2hlbGwgc3VjY2VzcyBzZXJ2aWNlIHRlc3QgKGV4cGVjdGVkOiAlcywgZ290OiAlcylcbiIsCisgICAgICAgICAgICAgICAgICAgIndlIHB1dCBpbiIsIGFyZ3ZbNl0pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGlmICghY2hlY2tfc2VuZF9leGl0X3RvX3NlcnZpY2UgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIRUxMX1NVQ0NFU1NfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX3NlcnZpY2UpKQorICAgIGdvdG8gb3V0OworCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgaWYgKGJhc2Vfc2VydmljZV9tZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAoYmFzZV9zZXJ2aWNlX21lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIENoZWNrMUZ1bmMgZnVuYzsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKK30gQ2hlY2sxRGF0YTsKKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19vb21fY2hlY2sxX2Z1bmMgKHZvaWQgKmRhdGEpCit7CisgIENoZWNrMURhdGEgKmQgPSBkYXRhOworCisgIGlmICghICgqIGQtPmZ1bmMpIChkLT5jb250ZXh0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFjaGVja19ub19sZWZ0b3ZlcnMgKGQtPmNvbnRleHQpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlcyB3ZXJlIGxlZnQgb3Zlciwgc2hvdWxkIGJlIGNvdmVyZWQgYnkgdGVzdCBzdWl0ZVxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorY2hlY2sxX3RyeV9pdGVyYXRpb25zIChCdXNDb250ZXh0ICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sxRnVuYyAgZnVuYykKK3sKKyAgQ2hlY2sxRGF0YSBkOworCisgIGQuZnVuYyA9IGZ1bmM7CisgIGQuY29udGV4dCA9IGNvbnRleHQ7CisKKyAgaWYgKCFfZGJ1c190ZXN0X29vbV9oYW5kbGluZyAoZGVzY3JpcHRpb24sIGNoZWNrX29vbV9jaGVjazFfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmQpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInRlc3QgZmFpbGVkIik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfZ2V0X3NlcnZpY2VzIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKwkJICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkgICAgY29uc3QgY2hhciAgICAgKm1ldGhvZCwKKwkJICAgIGNoYXIgICAgICAgICAqKipzZXJ2aWNlcywKKwkJICAgIGludCAgICAgICAgICAgICpsZW4pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzRXJyb3IgZXJyb3I7CisgIGNoYXIgKipzcnZzOworICBpbnQgbDsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBtZXNzYWdlID0gTlVMTDsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisJCQkJCSAgREJVU19QQVRIX0RCVVMsCisJCQkJCSAgREJVU19JTlRFUkZBQ0VfREJVUywKKwkJCQkJICBtZXRob2QpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgJnNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAvKiBzZW5kIG91ciBtZXNzYWdlICovCisgIGJ1c190ZXN0X3J1bl9jbGllbnRzX2xvb3AgKFNFTkRfUEVORElORyAoY29ubmVjdGlvbikpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNvbm5lY3Rpb24pOyAvKiBiZWNhdXNlIHdlIG1heSBnZXQgZGlzY29ubmVjdGVkICovCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IHRvIExpc3RBY3RpdmF0YWJsZU5hbWVzL0xpc3ROYW1lcyIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKworICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCByZWNlaXZlIGEgcmVwbHkgdG8gJXMgJWQgb24gJXBcbiIsCisJCSAgbWV0aG9kLCBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorCXsKKwkgIDsgLyogZ29vZCwgdGhpcyBpcyBhIHZhbGlkIHJlc3BvbnNlICovCisJfQorICAgICAgZWxzZQorCXsKKwkgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIm5vdCB0aGlzIGVycm9yIik7CisKKwkgIGdvdG8gb3V0OworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOKQorCXsKKwkgIDsgLyogZ29vZCwgZXhwZWN0ZWQgKi8KKwl9CisgICAgICBlbHNlCisJeworCSAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLAorCQkJICAgIm1ldGhvZF9yZXR1cm4gZm9yIExpc3RBY3RpdmF0YWJsZU5hbWVzL0xpc3ROYW1lcyIpOworCisJICBnb3RvIG91dDsKKwl9CisKKyAgICByZXRyeV9nZXRfcHJvcGVydHk6CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCAmZXJyb3IsCisJCQkJICBEQlVTX1RZUEVfQVJSQVksCisJCQkJICBEQlVTX1RZUEVfU1RSSU5HLAorCQkJCSAgJnNydnMsICZsLAorCQkJCSAgREJVU19UWVBFX0lOVkFMSUQpKQorCXsKKwkgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKwkgICAgeworCSAgICAgIF9kYnVzX3ZlcmJvc2UgKCJubyBtZW1vcnkgdG8gbGlzdCBzZXJ2aWNlcyBieSAlc1xuIiwgbWV0aG9kKTsKKwkgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisJICAgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworCSAgICAgIGdvdG8gcmV0cnlfZ2V0X3Byb3BlcnR5OworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBfZGJ1c19hc3NlcnQgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKTsKKwkgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgdGhlIGV4cGVjdGVkIERCVVNfVFlQRV9BUlJBWSBmcm9tICVzXG4iLCBtZXRob2QpOworCSAgICAgIGdvdG8gb3V0OworCSAgICB9CisJfSBlbHNlIHsKKwkgICpzZXJ2aWNlcyA9IHNydnM7CisJICAqbGVuID0gbDsKKwl9CisgICAgfQorCisgIGlmICghY2hlY2tfbm9fbGVmdG92ZXJzIChjb250ZXh0KSkKKyAgICBnb3RvIG91dDsKKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2xpc3Rfc2VydmljZXMgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorCQkgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAgKm1lc3NhZ2U7CisgIERCdXNNZXNzYWdlICAqYmFzZV9zZXJ2aWNlX21lc3NhZ2U7CisgIGNvbnN0IGNoYXIgICAqYmFzZV9zZXJ2aWNlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgZGJ1c19ib29sX3QgICByZXR2YWw7CisgIGNvbnN0IGNoYXIgICAqZXhpc3RlbnQgPSBFWElTVEVOVF9TRVJWSUNFX05BTUU7CisgIGRidXNfdWludDMyX3QgZmxhZ3M7CisgIGNoYXIgICAgICAgICoqc2VydmljZXM7CisgIGludCAgICAgICAgICAgbGVuOworCisgIF9kYnVzX3ZlcmJvc2UgKCJjaGVja19saXN0X3NlcnZpY2VzIGZvciAlcFxuIiwgY29ubmVjdGlvbik7CisKKyAgaWYgKCFjaGVja19nZXRfc2VydmljZXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sICJMaXN0QWN0aXZhdGFibGVOYW1lcyIsICZzZXJ2aWNlcywgJmxlbikpCisgICAgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2FycmF5X2NvbnRhaW5zICgoY29uc3QgY2hhciAqKilzZXJ2aWNlcywgZXhpc3RlbnQpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGdldCB0aGUgZXhwZWN0ZWQgJXMgZnJvbSBMaXN0QWN0aXZhdGFibGVOYW1lc1xuIiwgZXhpc3RlbnQpOworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2VydmljZXMpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChzZXJ2aWNlcyk7CisKKyAgYmFzZV9zZXJ2aWNlX21lc3NhZ2UgPSBOVUxMOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKwkJCQkJICBEQlVTX1BBVEhfREJVUywKKwkJCQkJICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorCQkJCQkgICJTdGFydFNlcnZpY2VCeU5hbWUiKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGRidXNfbWVzc2FnZV9zZXRfYXV0b19zdGFydCAobWVzc2FnZSwgRkFMU0UpOworCisgIGZsYWdzID0gMDsKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisJCQkJIERCVVNfVFlQRV9TVFJJTkcsICZleGlzdGVudCwKKwkJCQkgREJVU19UWVBFX1VJTlQzMiwgJmZsYWdzLAorCQkJCSBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKworICAvKiBub3cgd2FpdCBmb3IgdGhlIG1lc3NhZ2UgYnVzIHRvIGhlYXIgYmFjayBmcm9tIHRoZSBhY3RpdmF0ZWQKKyAgICogc2VydmljZS4KKyAgICovCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgImFjdGl2YXRlZCBzZXJ2aWNlIHRvIGNvbm5lY3QiKTsKKworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgcmVjZWl2ZSBhbnkgbWVzc2FnZXMgYWZ0ZXIgJXMgJWQgb24gJXBcbiIsCisJCSAgIlN0YXJ0U2VydmljZUJ5TmFtZSIsIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKyAgX2RidXNfdmVyYm9zZSAoIiAgKGFmdGVyIHNlbmRpbmcgJXMpXG4iLCAiU3RhcnRTZXJ2aWNlQnlOYW1lIik7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwgREJVU19TRVJWSUNFX0RCVVMpKQorCXsKKwkgIF9kYnVzX3dhcm4gKCJNZXNzYWdlIGhhcyB3cm9uZyBzZW5kZXIgJXNcbiIsCisJCSAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA/CisJCSAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA6ICIobm9uZSkiKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKwkJCQkgREJVU19FUlJPUl9OT19NRU1PUlkpKQorCXsKKwkgIDsgLyogZ29vZCwgdGhpcyBpcyBhIHZhbGlkIHJlc3BvbnNlICovCisJfQorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorCQkJCSAgICAgIERCVVNfRVJST1JfU1BBV05fQ0hJTERfRVhJVEVEKSB8fAorCSAgICAgICBkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisJCQkJICAgICAgREJVU19FUlJPUl9TUEFXTl9DSElMRF9TSUdOQUxFRCkgfHwKKwkgICAgICAgZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorCQkJCSAgICAgIERCVVNfRVJST1JfU1BBV05fRVhFQ19GQUlMRUQpKQorCXsKKwkgIDsgLyogZ29vZCwgdGhpcyBpcyBleHBlY3RlZCBhbHNvICovCisJfQorICAgICAgZWxzZQorCXsKKwkgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGV4cGVjdCBlcnJvciAlc1xuIiwKKwkJICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSk7CisJICBnb3RvIG91dDsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgR290U2VydmljZUluZm8gbWVzc2FnZV9raW5kOworCisgICAgICBpZiAoIWNoZWNrX2Jhc2Vfc2VydmljZV9hY3RpdmF0ZWQgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisJCQkJCSBtZXNzYWdlLCAmYmFzZV9zZXJ2aWNlKSkKKwlnb3RvIG91dDsKKworICAgICAgYmFzZV9zZXJ2aWNlX21lc3NhZ2UgPSBtZXNzYWdlOworICAgICAgbWVzc2FnZSA9IE5VTEw7CisKKyAgICAgIC8qIFdlIG1heSBuZWVkIHRvIGJsb2NrIGhlcmUgZm9yIHRoZSB0ZXN0IHNlcnZpY2UgdG8gZXhpdCBvciBmaW5pc2ggdXAgKi8KKyAgICAgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInRlc3Qgc2VydmljZSB0byBleGl0IG9yIGZpbmlzaCB1cCIpOworCisgICAgICBtZXNzYWdlID0gZGJ1c19jb25uZWN0aW9uX2JvcnJvd19tZXNzYWdlIChjb25uZWN0aW9uKTsKKyAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpCisJeworCSAgX2RidXNfd2FybiAoIkRpZCBub3QgcmVjZWl2ZSBhbnkgbWVzc2FnZXMgYWZ0ZXIgYmFzZSBzZXJ2aWNlIGNyZWF0aW9uIG5vdGlmaWNhdGlvblxuIik7CisJICBnb3RvIG91dDsKKwl9CisKKyAgICAgIG1lc3NhZ2Vfa2luZCA9IGNoZWNrX2dvdF9zZXJ2aWNlX2luZm8gKG1lc3NhZ2UpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmV0dXJuX21lc3NhZ2UgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICAgICAgbWVzc2FnZSA9IE5VTEw7CisKKyAgICAgIHN3aXRjaCAobWVzc2FnZV9raW5kKQorCXsKKwljYXNlIEdPVF9TT01FVEhJTkdfRUxTRToKKwljYXNlIEdPVF9FUlJPUjoKKwljYXNlIEdPVF9TRVJWSUNFX0RFTEVURUQ6CisJICBfZGJ1c193YXJuICgiVW5leHBlY3RlZCBtZXNzYWdlIGFmdGVyIEFjdGl2YXRlU2VydmljZSAiCisJCSAgICAgICIoc2hvdWxkIGJlIGFuIGVycm9yIG9yIGEgc2VydmljZSBhbm5vdW5jZW1lbnQpXG4iKTsKKwkgIGdvdG8gb3V0OworCisJY2FzZSBHT1RfU0VSVklDRV9DUkVBVEVEOgorCSAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisJICBpZiAobWVzc2FnZSA9PSBOVUxMKQorCSAgICB7CisJICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byBwb3AgbWVzc2FnZSB3ZSBqdXN0IHB1dCBiYWNrISAiCisJCQkgICJzaG91bGQgaGF2ZSBiZWVuIGEgTmFtZU93bmVyQ2hhbmdlZCAoY3JlYXRpb24pXG4iKTsKKwkgICAgICBnb3RvIG91dDsKKwkgICAgfQorCisJICBpZiAoIWNoZWNrX3NlcnZpY2VfYWN0aXZhdGVkIChjb250ZXh0LCBjb25uZWN0aW9uLCBFWElTVEVOVF9TRVJWSUNFX05BTUUsCisJCQkJCWJhc2Vfc2VydmljZSwgbWVzc2FnZSkpCisJICAgIGdvdG8gb3V0OworCisJICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCSAgbWVzc2FnZSA9IE5VTEw7CisKKwkgIGlmICghY2hlY2tfbm9fbGVmdG92ZXJzIChjb250ZXh0KSkKKwkgICAgeworCSAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlcyB3ZXJlIGxlZnQgb3ZlciBhZnRlciBzdWNjZXNzZnVsIGFjdGl2YXRpb25cbiIpOworCSAgICAgIGdvdG8gb3V0OworCSAgICB9CisKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgaWYgKCFjaGVja19nZXRfc2VydmljZXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sICJMaXN0TmFtZXMiLCAmc2VydmljZXMsICZsZW4pKQorICAgIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcnJheV9jb250YWlucyAoKGNvbnN0IGNoYXIgKiopc2VydmljZXMsIGV4aXN0ZW50KSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgdGhlIGV4cGVjdGVkICVzIGZyb20gTGlzdE5hbWVzXG4iLCBleGlzdGVudCk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2VydmljZXMpOworCisgIGlmICghY2hlY2tfc2VuZF9leGl0X3RvX3NlcnZpY2UgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisJCQkJICAgRVhJU1RFTlRfU0VSVklDRV9OQU1FLCBiYXNlX3NlcnZpY2UpKQorICAgIGdvdG8gb3V0OworCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgaWYgKGJhc2Vfc2VydmljZV9tZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAoYmFzZV9zZXJ2aWNlX21lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIENoZWNrMkZ1bmMgZnVuYzsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247Cit9IENoZWNrMkRhdGE7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfb29tX2NoZWNrMl9mdW5jICh2b2lkICpkYXRhKQoreworICBDaGVjazJEYXRhICpkID0gZGF0YTsKKworICBpZiAoISAoKiBkLT5mdW5jKSAoZC0+Y29udGV4dCwgZC0+Y29ubmVjdGlvbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghY2hlY2tfbm9fbGVmdG92ZXJzIChkLT5jb250ZXh0KSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZXMgd2VyZSBsZWZ0IG92ZXIsIHNob3VsZCBiZSBjb3ZlcmVkIGJ5IHRlc3Qgc3VpdGVcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrMl90cnlfaXRlcmF0aW9ucyAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIENoZWNrMkZ1bmMgICAgICBmdW5jKQoreworICBDaGVjazJEYXRhIGQ7CisKKyAgZC5mdW5jID0gZnVuYzsKKyAgZC5jb250ZXh0ID0gY29udGV4dDsKKyAgZC5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKworICBpZiAoIV9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nIChkZXNjcmlwdGlvbiwgY2hlY2tfb29tX2NoZWNrMl9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZCkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIiVzIGZhaWxlZCBkdXJpbmcgb29tXG4iLCBkZXNjcmlwdGlvbik7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ0ZXN0IGZhaWxlZCIpOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZXRlbnZfVEVTVF9MQVVOQ0hfSEVMUEVSX0NPTkZJRyhjb25zdCBEQnVzU3RyaW5nICp0ZXN0X2RhdGFfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqZmlsZW5hbWUpCit7CisgIERCdXNTdHJpbmcgZnVsbDsKKyAgREJ1c1N0cmluZyBmaWxlOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAodGVzdF9kYXRhX2RpciwgMCwgJmZ1bGwsIDApKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZSwgZmlsZW5hbWUpOworCisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmZ1bGwsICZmaWxlKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGwpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiU2V0dGluZyBURVNUX0xBVU5DSF9IRUxQRVJfQ09ORklHIHRvICclcydcbiIsCisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZ1bGwpKTsKKworICBfZGJ1c19zZXRlbnYgKCJURVNUX0xBVU5DSF9IRUxQRVJfQ09ORklHIiwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZnVsbCkpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX2Rpc3BhdGNoX3Rlc3RfY29uZiAoY29uc3QgREJ1c1N0cmluZyAqdGVzdF9kYXRhX2RpciwKKwkJICAgICAgICBjb25zdCBjaGFyICAgICAgICpmaWxlbmFtZSwKKwkJICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICB1c2VfbGF1bmNoZXIpCit7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisgIERCdXNDb25uZWN0aW9uICpmb287CisgIERCdXNDb25uZWN0aW9uICpiYXI7CisgIERCdXNDb25uZWN0aW9uICpiYXo7CisgIERCdXNFcnJvciBlcnJvcjsKKworICAvKiBzYXZlIHRoZSBjb25maWcgbmFtZSBmb3IgdGhlIGFjdGl2YXRpb24gaGVscGVyICovCisgIGlmICghc2V0ZW52X1RFU1RfTEFVTkNIX0hFTFBFUl9DT05GSUcgKHRlc3RfZGF0YV9kaXIsIGZpbGVuYW1lKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkgc2V0dGluZyBURVNUX0xBVU5DSF9IRUxQRVJfQ09ORklHIik7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIGNvbnRleHQgPSBidXNfY29udGV4dF9uZXdfdGVzdCAodGVzdF9kYXRhX2RpciwgZmlsZW5hbWUpOworICBpZiAoY29udGV4dCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBmb28gPSBkYnVzX2Nvbm5lY3Rpb25fb3Blbl9wcml2YXRlIChURVNUX0RFQlVHX1BJUEUsICZlcnJvcik7CisgIGlmIChmb28gPT0gTlVMTCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgYWxsb2MgY29ubmVjdGlvbiIpOworCisgIGlmICghYnVzX3NldHVwX2RlYnVnX2NsaWVudCAoZm9vKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3Qgc2V0IHVwIGNvbm5lY3Rpb24iKTsKKworICBzcGluX2Nvbm5lY3Rpb25fdW50aWxfYXV0aGVudGljYXRlZCAoY29udGV4dCwgZm9vKTsKKworICBpZiAoIWNoZWNrX2hlbGxvX21lc3NhZ2UgKGNvbnRleHQsIGZvbykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaGVsbG8gbWVzc2FnZSBmYWlsZWQiKTsKKworICBpZiAoIWNoZWNrX2RvdWJsZV9oZWxsb19tZXNzYWdlIChjb250ZXh0LCBmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRvdWJsZSBoZWxsbyBtZXNzYWdlIGZhaWxlZCIpOworCisgIGlmICghY2hlY2tfYWRkX21hdGNoX2FsbCAoY29udGV4dCwgZm9vKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJBZGRNYXRjaCBtZXNzYWdlIGZhaWxlZCIpOworCisgIGJhciA9IGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKFRFU1RfREVCVUdfUElQRSwgJmVycm9yKTsKKyAgaWYgKGJhciA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhbGxvYyBjb25uZWN0aW9uIik7CisKKyAgaWYgKCFidXNfc2V0dXBfZGVidWdfY2xpZW50IChiYXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBzZXQgdXAgY29ubmVjdGlvbiIpOworCisgIHNwaW5fY29ubmVjdGlvbl91bnRpbF9hdXRoZW50aWNhdGVkIChjb250ZXh0LCBiYXIpOworCisgIGlmICghY2hlY2tfaGVsbG9fbWVzc2FnZSAoY29udGV4dCwgYmFyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJoZWxsbyBtZXNzYWdlIGZhaWxlZCIpOworCisgIGlmICghY2hlY2tfYWRkX21hdGNoX2FsbCAoY29udGV4dCwgYmFyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJBZGRNYXRjaCBtZXNzYWdlIGZhaWxlZCIpOworCisgIGJheiA9IGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKFRFU1RfREVCVUdfUElQRSwgJmVycm9yKTsKKyAgaWYgKGJheiA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhbGxvYyBjb25uZWN0aW9uIik7CisKKyAgaWYgKCFidXNfc2V0dXBfZGVidWdfY2xpZW50IChiYXopKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBzZXQgdXAgY29ubmVjdGlvbiIpOworCisgIHNwaW5fY29ubmVjdGlvbl91bnRpbF9hdXRoZW50aWNhdGVkIChjb250ZXh0LCBiYXopOworCisgIGlmICghY2hlY2tfaGVsbG9fbWVzc2FnZSAoY29udGV4dCwgYmF6KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJoZWxsbyBtZXNzYWdlIGZhaWxlZCIpOworCisgIGlmICghY2hlY2tfYWRkX21hdGNoX2FsbCAoY29udGV4dCwgYmF6KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJBZGRNYXRjaCBtZXNzYWdlIGZhaWxlZCIpOworCisjaWZkZWYgREJVU19XSU5fRklYTUUKKyAgX2RidXNfd2FybigiVE9ETzogdGVzdGluZyBvZiBHZXRDb25uZWN0aW9uVW5peFVzZXIgbWVzc2FnZSBza2lwcGVkIGZvciBub3dcbiIpOworICBfZGJ1c193YXJuKCJUT0RPOiB0ZXN0aW5nIG9mIEdldENvbm5lY3Rpb25Vbml4UHJvY2Vzc0lEIG1lc3NhZ2Ugc2tpcHBlZCBmb3Igbm93XG4iKTsKKyNlbHNlCisgIGlmICghY2hlY2tfZ2V0X2Nvbm5lY3Rpb25fdW5peF91c2VyIChjb250ZXh0LCBiYXopKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkdldENvbm5lY3Rpb25Vbml4VXNlciBtZXNzYWdlIGZhaWxlZCIpOworCisgIGlmICghY2hlY2tfZ2V0X2Nvbm5lY3Rpb25fdW5peF9wcm9jZXNzX2lkIChjb250ZXh0LCBiYXopKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkdldENvbm5lY3Rpb25Vbml4UHJvY2Vzc0lEIG1lc3NhZ2UgZmFpbGVkIik7CisjZW5kaWYKKworICBpZiAoIWNoZWNrX2xpc3Rfc2VydmljZXMgKGNvbnRleHQsIGJheikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiTGlzdEFjdGl2YXRhYmxlTmFtZXMgbWVzc2FnZSBmYWlsZWQiKTsKKworICBpZiAoIWNoZWNrX25vX2xlZnRvdmVycyAoY29udGV4dCkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2VzIHdlcmUgbGVmdCBvdmVyIGFmdGVyIHNldHRpbmcgdXAgaW5pdGlhbCBjb25uZWN0aW9uc1xuIik7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbml0aWFsIGNvbm5lY3Rpb24gc2V0dXAgZmFpbGVkIik7CisgICAgfQorCisgIGNoZWNrMV90cnlfaXRlcmF0aW9ucyAoY29udGV4dCwgImNyZWF0ZV9hbmRfaGVsbG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2hlbGxvX2Nvbm5lY3Rpb24pOworCisgIGNoZWNrMl90cnlfaXRlcmF0aW9ucyAoY29udGV4dCwgZm9vLCAibm9uZXhpc3RlbnRfc2VydmljZV9ub19hdXRvX3N0YXJ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19ub25leGlzdGVudF9zZXJ2aWNlX25vX2F1dG9fc3RhcnQpOworCisjaWZkZWYgREJVU19XSU5fRklYTUUKKyAgX2RidXNfd2FybigiVE9ETzogZGlzcGF0Y2guYyBzZWdmYXVsdF9zZXJ2aWNlX25vX2F1dG9fc3RhcnQgdGVzdFxuIik7CisjZWxzZQorICBjaGVjazJfdHJ5X2l0ZXJhdGlvbnMgKGNvbnRleHQsIGZvbywgInNlZ2ZhdWx0X3NlcnZpY2Vfbm9fYXV0b19zdGFydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfc2VnZmF1bHRfc2VydmljZV9ub19hdXRvX3N0YXJ0KTsKKyNlbmRpZgorCisgIGNoZWNrMl90cnlfaXRlcmF0aW9ucyAoY29udGV4dCwgZm9vLCAiZXhpc3RlbnRfc2VydmljZV9ub19hdXRvX3N0YXJ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19leGlzdGVudF9zZXJ2aWNlX25vX2F1dG9fc3RhcnQpOworCisgIGNoZWNrMl90cnlfaXRlcmF0aW9ucyAoY29udGV4dCwgZm9vLCAibm9uZXhpc3RlbnRfc2VydmljZV9hdXRvX3N0YXJ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19ub25leGlzdGVudF9zZXJ2aWNlX2F1dG9fc3RhcnQpOworCisKKyNpZmRlZiBEQlVTX1dJTl9GSVhNRQorICBfZGJ1c193YXJuKCJUT0RPOiBkaXNwYXRjaC5jIHNlZ2ZhdWx0X3NlcnZpY2VfYXV0b19zdGFydCB0ZXN0XG4iKTsKKyNlbHNlCisgIC8qIG9ubHkgZG8gdGhlIHNlZ2ZhdWx0IHRlc3QgaWYgd2UgYXJlIG5vdCB1c2luZyB0aGUgbGF1bmNoZXIgKi8KKyAgY2hlY2syX3RyeV9pdGVyYXRpb25zIChjb250ZXh0LCBmb28sICJzZWdmYXVsdF9zZXJ2aWNlX2F1dG9fc3RhcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3NlZ2ZhdWx0X3NlcnZpY2VfYXV0b19zdGFydCk7CisjZW5kaWYKKworICAvKiBvbmx5IGRvIHRoZSBzaGVsbCBmYWlsIHRlc3QgaWYgd2UgYXJlIG5vdCB1c2luZyB0aGUgbGF1bmNoZXIgKi8KKyAgY2hlY2syX3RyeV9pdGVyYXRpb25zIChjb250ZXh0LCBmb28sICJzaGVsbF9mYWlsX3NlcnZpY2VfYXV0b19zdGFydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfc2hlbGxfZmFpbF9zZXJ2aWNlX2F1dG9fc3RhcnQpOworCisgIC8qIHNwZWNpZmljIHRvIGxhdW5jaGVyICovCisgIGlmICh1c2VfbGF1bmNoZXIpCisgICAgaWYgKCFjaGVja19sYXVuY2hfc2VydmljZV9maWxlX21pc3NpbmcgKGNvbnRleHQsIGZvbykpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWQgbm90IGdldCBzZXJ2aWNlIGZpbGUgbm90IGZvdW5kIGVycm9yIik7CisKKyNpZiAwCisgIC8qIE5vdGU6IG5lZWQgdG8gcmVzb2x2ZSBzb21lIGlzc3VlcyB3aXRoIHRoZSB0ZXN0aW5nIGNvZGUgaW4gb3JkZXIgdG8gcnVuCisgICAqIHRoaXMgaW4gb29tIChoYW5kbGUgdGhhdCB3ZSBzb21ldGltZXMgZG9uJ3QgZ2V0IHJlcGxpZXMgYmFjayBmcm9tIHRoZSBidXMKKyAgICogd2hlbiBvb20gaGFwcGVucywgd2l0aG91dCBibG9ja2luZyB0aGUgdGVzdCkuCisgICAqLworICBjaGVjazJfdHJ5X2l0ZXJhdGlvbnMgKGNvbnRleHQsIGZvbywgImV4aXN0ZW50X3NlcnZpY2VfYXV0b19hdXRvX3N0YXJ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19leGlzdGVudF9zZXJ2aWNlX2F1dG9fc3RhcnQpOworI2VuZGlmCisKKyAgaWYgKCFjaGVja19leGlzdGVudF9zZXJ2aWNlX2F1dG9fc3RhcnQgKGNvbnRleHQsIGZvbykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZXhpc3RlbnQgc2VydmljZSBhdXRvIHN0YXJ0IGZhaWxlZCIpOworCisgIGlmICghY2hlY2tfc2hlbGxfc2VydmljZV9zdWNjZXNzX2F1dG9fc3RhcnQgKGNvbnRleHQsIGZvbykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2hlbGwgc3VjY2VzcyBzZXJ2aWNlIGF1dG8gc3RhcnQgZmFpbGVkIik7CisKKyAgX2RidXNfdmVyYm9zZSAoIkRpc2Nvbm5lY3RpbmcgZm9vLCBiYXIsIGFuZCBiYXpcbiIpOworCisgIGtpbGxfY2xpZW50X2Nvbm5lY3Rpb25fdW5jaGVja2VkIChmb28pOworICBraWxsX2NsaWVudF9jb25uZWN0aW9uX3VuY2hlY2tlZCAoYmFyKTsKKyAga2lsbF9jbGllbnRfY29ubmVjdGlvbl91bmNoZWNrZWQgKGJheik7CisKKyAgYnVzX2NvbnRleHRfdW5yZWYgKGNvbnRleHQpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kaXNwYXRjaF90ZXN0X2NvbmZfZmFpbCAoY29uc3QgREJ1c1N0cmluZyAqdGVzdF9kYXRhX2RpciwKKwkJICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmZpbGVuYW1lKQoreworICBCdXNDb250ZXh0ICpjb250ZXh0OworICBEQnVzQ29ubmVjdGlvbiAqZm9vOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgLyogc2F2ZSB0aGUgY29uZmlnIG5hbWUgZm9yIHRoZSBhY3RpdmF0aW9uIGhlbHBlciAqLworICBpZiAoIXNldGVudl9URVNUX0xBVU5DSF9IRUxQRVJfQ09ORklHICh0ZXN0X2RhdGFfZGlyLCBmaWxlbmFtZSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5IHNldHRpbmcgVEVTVF9MQVVOQ0hfSEVMUEVSX0NPTkZJRyIpOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBjb250ZXh0ID0gYnVzX2NvbnRleHRfbmV3X3Rlc3QgKHRlc3RfZGF0YV9kaXIsIGZpbGVuYW1lKTsKKyAgaWYgKGNvbnRleHQgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZm9vID0gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAoVEVTVF9ERUJVR19QSVBFLCAmZXJyb3IpOworICBpZiAoZm9vID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFsbG9jIGNvbm5lY3Rpb24iKTsKKworICBpZiAoIWJ1c19zZXR1cF9kZWJ1Z19jbGllbnQgKGZvbykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IHNldCB1cCBjb25uZWN0aW9uIik7CisKKyAgc3Bpbl9jb25uZWN0aW9uX3VudGlsX2F1dGhlbnRpY2F0ZWQgKGNvbnRleHQsIGZvbyk7CisKKyAgaWYgKCFjaGVja19oZWxsb19tZXNzYWdlIChjb250ZXh0LCBmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImhlbGxvIG1lc3NhZ2UgZmFpbGVkIik7CisKKyAgaWYgKCFjaGVja19kb3VibGVfaGVsbG9fbWVzc2FnZSAoY29udGV4dCwgZm9vKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkb3VibGUgaGVsbG8gbWVzc2FnZSBmYWlsZWQiKTsKKworICBpZiAoIWNoZWNrX2FkZF9tYXRjaF9hbGwgKGNvbnRleHQsIGZvbykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiQWRkTWF0Y2ggbWVzc2FnZSBmYWlsZWQiKTsKKworICAvKiB0aGlzIG9ubHkgdGVzdHMgdGhlIGFjdGl2YXRpb24uYyB1c2VyIGNoZWNrICovCisgIGlmICghY2hlY2tfbGF1bmNoX3NlcnZpY2VfdXNlcl9taXNzaW5nIChjb250ZXh0LCBmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInVzZXIgbWlzc2luZyBkaWQgbm90IHRyaWdnZXIgZXJyb3IiKTsKKworICAvKiB0aGlzIG9ubHkgdGVzdHMgdGhlIGRlc2t0b3AuYyBleGVjIGNoZWNrICovCisgIGlmICghY2hlY2tfbGF1bmNoX3NlcnZpY2VfZXhlY19taXNzaW5nIChjb250ZXh0LCBmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImV4ZWMgbWlzc2luZyBkaWQgbm90IHRyaWdnZXIgZXJyb3IiKTsKKworICAvKiB0aGlzIG9ubHkgdGVzdHMgdGhlIGRlc2t0b3AuYyBzZXJ2aWNlIGNoZWNrICovCisgIGlmICghY2hlY2tfbGF1bmNoX3NlcnZpY2Vfc2VydmljZV9taXNzaW5nIChjb250ZXh0LCBmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNlcnZpY2UgbWlzc2luZyBkaWQgbm90IHRyaWdnZXIgZXJyb3IiKTsKKworICBfZGJ1c192ZXJib3NlICgiRGlzY29ubmVjdGluZyBmb29cbiIpOworCisgIGtpbGxfY2xpZW50X2Nvbm5lY3Rpb25fdW5jaGVja2VkIChmb28pOworCisgIGJ1c19jb250ZXh0X3VucmVmIChjb250ZXh0KTsKKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19kaXNwYXRjaF90ZXN0IChjb25zdCBEQnVzU3RyaW5nICp0ZXN0X2RhdGFfZGlyKQoreworICAvKiBydW4gbm9ybWFsIGFjdGl2YXRpb24gdGVzdHMgKi8KKyAgX2RidXNfdmVyYm9zZSAoIk5vcm1hbCBhY3RpdmF0aW9uIHRlc3RzXG4iKTsKKyAgaWYgKCFidXNfZGlzcGF0Y2hfdGVzdF9jb25mICh0ZXN0X2RhdGFfZGlyLAorICAJCQkgICAgICAgInZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwuY29uZiIsIEZBTFNFKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyNpZmRlZiBEQlVTX1dJTgorICBfZGJ1c193YXJuKCJJbmZvOiBMYXVuY2ggaGVscGVyIGFjdGl2YXRpb24gdGVzdHMgc2tpcHBlZCBiZWNhdXNlIGxhdW5jaC1oZWxwZXIgaXMgbm90IHN1cHBvcnRlZCB5ZXRcbiIpOworI2Vsc2UKKyAgLyogcnVuIGxhdW5jaC1oZWxwZXIgYWN0aXZhdGlvbiB0ZXN0cyAqLworICBfZGJ1c192ZXJib3NlICgiTGF1bmNoIGhlbHBlciBhY3RpdmF0aW9uIHRlc3RzXG4iKTsKKyAgaWYgKCFidXNfZGlzcGF0Y2hfdGVzdF9jb25mICh0ZXN0X2RhdGFfZGlyLAorICAJCQkgICAgICAgInZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vZGVidWctYWxsb3ctYWxsLXBhc3MuY29uZiIsIFRSVUUpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBydW4gc2VsZWN0IGxhdW5jaC1oZWxwZXIgYWN0aXZhdGlvbiB0ZXN0cyBvbiBicm9rZW4gc2VydmljZSBmaWxlcyAqLworICBpZiAoIWJ1c19kaXNwYXRjaF90ZXN0X2NvbmZfZmFpbCAodGVzdF9kYXRhX2RpciwKKyAgCQkJICAgICAgICAgICAgInZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vZGVidWctYWxsb3ctYWxsLWZhaWwuY29uZiIpKQorICAgIHJldHVybiBGQUxTRTsKKyNlbmRpZgorCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2Rpc3BhdGNoX3NoYTFfdGVzdCAoY29uc3QgREJ1c1N0cmluZyAqdGVzdF9kYXRhX2RpcikKK3sKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgREJ1c0Nvbm5lY3Rpb24gKmZvbzsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICAvKiBUZXN0IFNIQTEgYXV0aGVudGljYXRpb24gKi8KKyAgX2RidXNfdmVyYm9zZSAoIlRlc3RpbmcgU0hBMSBjb250ZXh0XG4iKTsKKworICBjb250ZXh0ID0gYnVzX2NvbnRleHRfbmV3X3Rlc3QgKHRlc3RfZGF0YV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwtc2hhMS5jb25mIik7CisgIGlmIChjb250ZXh0ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGZvbyA9IGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKFRFU1RfREVCVUdfUElQRSwgJmVycm9yKTsKKyAgaWYgKGZvbyA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhbGxvYyBjb25uZWN0aW9uIik7CisKKyAgaWYgKCFidXNfc2V0dXBfZGVidWdfY2xpZW50IChmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBzZXQgdXAgY29ubmVjdGlvbiIpOworCisgIHNwaW5fY29ubmVjdGlvbl91bnRpbF9hdXRoZW50aWNhdGVkIChjb250ZXh0LCBmb28pOworCisgIGlmICghY2hlY2tfaGVsbG9fbWVzc2FnZSAoY29udGV4dCwgZm9vKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJoZWxsbyBtZXNzYWdlIGZhaWxlZCIpOworCisgIGlmICghY2hlY2tfYWRkX21hdGNoX2FsbCAoY29udGV4dCwgZm9vKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJhZGRtYXRjaCBtZXNzYWdlIGZhaWxlZCIpOworCisgIGlmICghY2hlY2tfbm9fbGVmdG92ZXJzIChjb250ZXh0KSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZXMgd2VyZSBsZWZ0IG92ZXIgYWZ0ZXIgc2V0dGluZyB1cCBpbml0aWFsIFNIQS0xIGNvbm5lY3Rpb25cbiIpOworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW5pdGlhbCBjb25uZWN0aW9uIHNldHVwIGZhaWxlZCIpOworICAgIH0KKworICBjaGVjazFfdHJ5X2l0ZXJhdGlvbnMgKGNvbnRleHQsICJjcmVhdGVfYW5kX2hlbGxvX3NoYTEiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2hlbGxvX2Nvbm5lY3Rpb24pOworCisgIGtpbGxfY2xpZW50X2Nvbm5lY3Rpb25fdW5jaGVja2VkIChmb28pOworCisgIGJ1c19jb250ZXh0X3VucmVmIChjb250ZXh0KTsKKworICByZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisKK2RidXNfYm9vbF90CitidXNfdW5peF9mZHNfcGFzc2luZ190ZXN0KGNvbnN0IERCdXNTdHJpbmcgKnRlc3RfZGF0YV9kaXIpCit7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisgIERCdXNDb25uZWN0aW9uICpmb28sICpiYXI7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgREJ1c01lc3NhZ2UgKm07CisgIGludCBvbmVbMl0sIHR3b1syXSwgeCwgeSwgejsKKyAgY2hhciByOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBjb250ZXh0ID0gYnVzX2NvbnRleHRfbmV3X3Rlc3QgKHRlc3RfZGF0YV9kaXIsICJ2YWxpZC1jb25maWctZmlsZXMvZGVidWctYWxsb3ctYWxsLmNvbmYiKTsKKyAgaWYgKGNvbnRleHQgPT0gTlVMTCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgYWxsb2MgY29udGV4dCIpOworCisgIGZvbyA9IGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKFRFU1RfREVCVUdfUElQRSwgJmVycm9yKTsKKyAgaWYgKGZvbyA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhbGxvYyBjb25uZWN0aW9uIik7CisKKyAgaWYgKCFidXNfc2V0dXBfZGVidWdfY2xpZW50IChmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBzZXQgdXAgY29ubmVjdGlvbiIpOworCisgIHNwaW5fY29ubmVjdGlvbl91bnRpbF9hdXRoZW50aWNhdGVkIChjb250ZXh0LCBmb28pOworCisgIGlmICghY2hlY2tfaGVsbG9fbWVzc2FnZSAoY29udGV4dCwgZm9vKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJoZWxsbyBtZXNzYWdlIGZhaWxlZCIpOworCisgIGlmICghY2hlY2tfYWRkX21hdGNoX2FsbCAoY29udGV4dCwgZm9vKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJBZGRNYXRjaCBtZXNzYWdlIGZhaWxlZCIpOworCisgIGJhciA9IGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKFRFU1RfREVCVUdfUElQRSwgJmVycm9yKTsKKyAgaWYgKGJhciA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhbGxvYyBjb25uZWN0aW9uIik7CisKKyAgaWYgKCFidXNfc2V0dXBfZGVidWdfY2xpZW50IChiYXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBzZXQgdXAgY29ubmVjdGlvbiIpOworCisgIHNwaW5fY29ubmVjdGlvbl91bnRpbF9hdXRoZW50aWNhdGVkIChjb250ZXh0LCBiYXIpOworCisgIGlmICghY2hlY2tfaGVsbG9fbWVzc2FnZSAoY29udGV4dCwgYmFyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJoZWxsbyBtZXNzYWdlIGZhaWxlZCIpOworCisgIGlmICghY2hlY2tfYWRkX21hdGNoX2FsbCAoY29udGV4dCwgYmFyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJBZGRNYXRjaCBtZXNzYWdlIGZhaWxlZCIpOworCisgIGlmICghKG0gPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCgiLyIsICJhLmIuYyIsICJkIikpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhbGxvYyBtZXNzYWdlIik7CisKKyAgaWYgKCEoX2RidXNfZnVsbF9kdXBsZXhfcGlwZShvbmUsIG9uZSsxLCBUUlVFLCAmZXJyb3IpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byBhbGxvY2F0ZSBwaXBlICMxIik7CisKKyAgaWYgKCEoX2RidXNfZnVsbF9kdXBsZXhfcGlwZSh0d28sIHR3bysxLCBUUlVFLCAmZXJyb3IpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byBhbGxvY2F0ZSBwaXBlICMyIik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MobSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VOSVhfRkQsIG9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VOSVhfRkQsIHR3bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VOSVhfRkQsIHR3bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiRmFpbGVkIHRvIGF0dGFjaCBmZHMuIik7CisKKyAgaWYgKCFfZGJ1c19jbG9zZShvbmVbMF0sICZlcnJvcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gY2xvc2UgcGlwZSAjMSAiKTsKKyAgaWYgKCFfZGJ1c19jbG9zZSh0d29bMF0sICZlcnJvcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gY2xvc2UgcGlwZSAjMiAiKTsKKworICBpZiAoIShkYnVzX2Nvbm5lY3Rpb25fY2FuX3NlbmRfdHlwZShmb28sIERCVVNfVFlQRV9VTklYX0ZEKSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJDb25uZWN0aW9uIGNhbm5vdCBkbyBmZCBwYXNzaW5nIik7CisKKyAgaWYgKCEoZGJ1c19jb25uZWN0aW9uX2Nhbl9zZW5kX3R5cGUoYmFyLCBEQlVTX1RZUEVfVU5JWF9GRCkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiQ29ubmVjdGlvbiBjYW5ub3QgZG8gZmQgcGFzc2luZyIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGZvbywgbSwgTlVMTCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gc2VuZCBmZHMiKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYobSk7CisKKyAgYnVzX3Rlc3RfcnVuX2NsaWVudHNfbG9vcCAoU0VORF9QRU5ESU5HIChmb28pKTsKKworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBmb28sICJ1bml4IGZkIHJlY2VwdGlvbiBvbiBmb28iKTsKKworICBpZiAoIShtID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChmb28pKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byByZWNlaXZlIG1zZyIpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2lzX3NpZ25hbChtLCAiYS5iLmMiLCAiZCIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiYm9ndXMgbWVzc2FnZSByZWNlaXZlZCIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZihtKTsKKworICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGNvbnRleHQsIGJhciwgInVuaXggZmQgcmVjZXB0aW9uIG9uIGJhciIpOworCisgIGlmICghKG0gPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGJhcikpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiRmFpbGVkIHRvIHJlY2VpdmUgbXNnIik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXNfc2lnbmFsKG0sICJhLmIuYyIsICJkIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJib2d1cyBtZXNzYWdlIHJlY2VpdmVkIik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MobSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCwgJngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VTklYX0ZELCAmeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VOSVhfRkQsICZ6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gcGFyc2UgZmRzLiIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZihtKTsKKworICBpZiAod3JpdGUoeCwgIlgiLCAxKSAhPSAxKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiRmFpbGVkIHRvIHdyaXRlIHRvIHBpcGUgIzEiKTsKKyAgaWYgKHdyaXRlKHksICJZIiwgMSkgIT0gMSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byB3cml0ZSB0byBwaXBlICMyIik7CisgIGlmICh3cml0ZSh6LCAiWiIsIDEpICE9IDEpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gd3JpdGUgdG8gcGlwZSAjMi8ybmQgZmQiKTsKKworICBpZiAoIV9kYnVzX2Nsb3NlKHgsICZlcnJvcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gY2xvc2UgcGlwZSAjMS9vdGhlciBzaWRlICIpOworICBpZiAoIV9kYnVzX2Nsb3NlKHksICZlcnJvcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gY2xvc2UgcGlwZSAjMi9vdGhlciBzaWRlICIpOworICBpZiAoIV9kYnVzX2Nsb3NlKHosICZlcnJvcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gY2xvc2UgcGlwZSAjMi9vdGhlciBzaXplIDJuZCBmZCAiKTsKKworICBpZiAocmVhZChvbmVbMV0sICZyLCAxKSAhPSAxIHx8IHIgIT0gJ1gnKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiRmFpbGVkIHRvIHJlYWQgdmFsdWUgZnJvbSBwaXBlLiIpOworICBpZiAocmVhZCh0d29bMV0sICZyLCAxKSAhPSAxIHx8IHIgIT0gJ1knKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiRmFpbGVkIHRvIHJlYWQgdmFsdWUgZnJvbSBwaXBlLiIpOworICBpZiAocmVhZCh0d29bMV0sICZyLCAxKSAhPSAxIHx8IHIgIT0gJ1onKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiRmFpbGVkIHRvIHJlYWQgdmFsdWUgZnJvbSBwaXBlLiIpOworCisgIGlmICghX2RidXNfY2xvc2Uob25lWzFdLCAmZXJyb3IpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiRmFpbGVkIHRvIGNsb3NlIHBpcGUgIzEgIik7CisgIGlmICghX2RidXNfY2xvc2UodHdvWzFdLCAmZXJyb3IpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiRmFpbGVkIHRvIGNsb3NlIHBpcGUgIzIgIik7CisKKyAgX2RidXNfdmVyYm9zZSAoIkRpc2Nvbm5lY3RpbmcgZm9vXG4iKTsKKyAga2lsbF9jbGllbnRfY29ubmVjdGlvbl91bmNoZWNrZWQgKGZvbyk7CisKKyAgX2RidXNfdmVyYm9zZSAoIkRpc2Nvbm5lY3RpbmcgYmFyXG4iKTsKKyAga2lsbF9jbGllbnRfY29ubmVjdGlvbl91bmNoZWNrZWQgKGJhcik7CisKKyAgYnVzX2NvbnRleHRfdW5yZWYgKGNvbnRleHQpOworCisgIHJldHVybiBUUlVFOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzL2J1cy9kaXNwYXRjaC5oIGIvZGJ1cy9idXMvZGlzcGF0Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjViYTdhCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9idXMvZGlzcGF0Y2guaApAQCAtMCwwICsxLDM4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRpc3BhdGNoLmggIE1lc3NhZ2UgZGlzcGF0Y2hlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBCVVNfRElTUEFUQ0hfSAorI2RlZmluZSBCVVNfRElTUEFUQ0hfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSAiY29ubmVjdGlvbi5oIgorCitkYnVzX2Jvb2xfdCBidXNfZGlzcGF0Y2hfYWRkX2Nvbm5lY3Rpb24gICAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK3ZvaWQgICAgICAgIGJ1c19kaXNwYXRjaF9yZW1vdmVfY29ubmVjdGlvbiAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworZGJ1c19ib29sX3QgYnVzX2Rpc3BhdGNoX21hdGNoZXMgICAgICAgICAgIChCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpyZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworCisjZW5kaWYgLyogQlVTX0RJU1BBVENIX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvYnVzL2RyaXZlci5jIGIvZGJ1cy9idXMvZHJpdmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc0ZTBmMwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvYnVzL2RyaXZlci5jCkBAIC0wLDAgKzEsMjAzNSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkcml2ZXIuYyAgQnVzIGNsaWVudCAoZHJpdmVyKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJhY3RpdmF0aW9uLmgiCisjaW5jbHVkZSAiY29ubmVjdGlvbi5oIgorI2luY2x1ZGUgImRyaXZlci5oIgorI2luY2x1ZGUgImRpc3BhdGNoLmgiCisjaW5jbHVkZSAic2VydmljZXMuaCIKKyNpbmNsdWRlICJzZWxpbnV4LmgiCisjaW5jbHVkZSAic2lnbmFscy5oIgorI2luY2x1ZGUgInN0YXRzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tZXNzYWdlLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0YXRpYyBkYnVzX2Jvb2xfdCBidXNfZHJpdmVyX3NlbmRfd2VsY29tZV9tZXNzYWdlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqaGVsbG9fbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKKworZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX293bmVyX2NoYW5nZWQgKGNvbnN0IGNoYXIgICAgICpzZXJ2aWNlX25hbWUsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgICAgICpvbGRfb3duZXIsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgICAgICpuZXdfb3duZXIsCisJCQkJICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKwkJCQkgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBjb25zdCBjaGFyICpudWxsX3NlcnZpY2U7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgbnVsbF9zZXJ2aWNlID0gIiI7CisgIF9kYnVzX3ZlcmJvc2UgKCJzZW5kaW5nIG5hbWUgb3duZXIgY2hhbmdlZDogJXMgWyVzIC0+ICVzXVxuIiwKKyAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICBvbGRfb3duZXIgPyBvbGRfb3duZXIgOiBudWxsX3NlcnZpY2UsCisgICAgICAgICAgICAgICAgIG5ld19vd25lciA/IG5ld19vd25lciA6IG51bGxfc2VydmljZSk7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsIChEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lT3duZXJDaGFuZ2VkIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfc2VuZGVyIChtZXNzYWdlLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgZ290byBvb207CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgb2xkX293bmVyID8gJm9sZF9vd25lciA6ICZudWxsX3NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCBuZXdfb3duZXIgPyAmbmV3X293bmVyIDogJm51bGxfc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICBnb3RvIG9vbTsKKworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9oYXNfc2lnbmF0dXJlIChtZXNzYWdlLCAic3NzIikpOworCisgIHJldHZhbCA9IGJ1c19kaXNwYXRjaF9tYXRjaGVzICh0cmFuc2FjdGlvbiwgTlVMTCwgTlVMTCwgbWVzc2FnZSwgZXJyb3IpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7CisKKyBvb206CisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIEJVU19TRVRfT09NIChlcnJvcik7CisgIHJldHVybiBGQUxTRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2xvc3QgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJICAgICAgY29uc3QgY2hhciAgICAgKnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsIChEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lTG9zdCIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChtZXNzYWdlLCBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbikpIHx8CisgICAgICAhZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIG1lc3NhZ2UpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9Cit9CisKK2RidXNfYm9vbF90CitidXNfZHJpdmVyX3NlbmRfc2VydmljZV9hY3F1aXJlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWVBY3F1aXJlZCIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChtZXNzYWdlLCBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbikpIHx8CisgICAgICAhZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIG1lc3NhZ2UpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY3JlYXRlX3VuaXF1ZV9jbGllbnRfbmFtZSAoQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgKnN0cikKK3sKKyAgLyogV2UgbmV2ZXIgd2FudCB0byB1c2UgdGhlIHNhbWUgdW5pcXVlIGNsaWVudCBuYW1lIHR3aWNlLCBiZWNhdXNlCisgICAqIHdlIHdhbnQgdG8gZ3VhcmFudGVlIHRoYXQgaWYgeW91IHNlbmQgYSBtZXNzYWdlIHRvIGEgZ2l2ZW4gdW5pcXVlCisgICAqIG5hbWUsIHlvdSBhbHdheXMgZ2V0IHRoZSBzYW1lIGFwcGxpY2F0aW9uLiBTbyB3ZSB1c2UgdHdvIG51bWJlcnMKKyAgICogZm9yIElOVF9NQVggKiBJTlRfTUFYIGNvbWJpbmF0aW9ucywgc2hvdWxkIGJlIHByZXR0eSBzYWZlIGFnYWluc3QKKyAgICogd3JhcGFyb3VuZC4KKyAgICovCisgIC8qIEZJWE1FIHRoZXNlIHNob3VsZCBiZSBpbiBCdXNSZWdpc3RyeSByYXRoZXIgdGhhbiBzdGF0aWMgdmFycyAqLworICBzdGF0aWMgaW50IG5leHRfbWFqb3JfbnVtYmVyID0gMDsKKyAgc3RhdGljIGludCBuZXh0X21pbm9yX251bWJlciA9IDA7CisgIGludCBsZW47CisKKyAgbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisKKyAgd2hpbGUgKFRSVUUpCisgICAgeworICAgICAgLyogc3RhcnQgb3V0IHdpdGggMS0wLCBnbyB0byAxLTEsIDEtMiwgMS0zLAorICAgICAgICogdXAgdG8gMS1NQVhJTlQsIHRoZW4gMi0wLCAyLTEsIGV0Yy4KKyAgICAgICAqLworICAgICAgaWYgKG5leHRfbWlub3JfbnVtYmVyIDw9IDApCisgICAgICAgIHsKKyAgICAgICAgICBuZXh0X21ham9yX251bWJlciArPSAxOworICAgICAgICAgIG5leHRfbWlub3JfbnVtYmVyID0gMDsKKyAgICAgICAgICBpZiAobmV4dF9tYWpvcl9udW1iZXIgPD0gMCkKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIklOVF9NQVggKiBJTlRfTUFYIGNsaWVudHMgd2VyZSBhZGRlZCIpOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX2Fzc2VydCAobmV4dF9tYWpvcl9udW1iZXIgPiAwKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAobmV4dF9taW5vcl9udW1iZXIgPj0gMCk7CisKKyAgICAgIC8qIGFwcG5hbWU6TUFKT1ItTUlOT1IgKi8KKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kIChzdHIsICI6IikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2ludCAoc3RyLCBuZXh0X21ham9yX251bWJlcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kIChzdHIsICIuIikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2ludCAoc3RyLCBuZXh0X21pbm9yX251bWJlcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgbmV4dF9taW5vcl9udW1iZXIgKz0gMTsKKworICAgICAgLyogQ2hlY2sgaWYgYSBjbGllbnQgd2l0aCB0aGUgbmFtZSBleGlzdHMgKi8KKyAgICAgIGlmIChidXNfcmVnaXN0cnlfbG9va3VwIChyZWdpc3RyeSwgc3RyKSA9PSBOVUxMKQorCWJyZWFrOworCisgICAgICAvKiBkcm9wIHRoZSBudW1iZXIgYWdhaW4sIHRyeSB0aGUgbmV4dCBvbmUuICovCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoc3RyLCBsZW4pOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9oZWxsbyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyB1bmlxdWVfbmFtZTsKKyAgQnVzU2VydmljZSAqc2VydmljZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBCdXNSZWdpc3RyeSAqcmVnaXN0cnk7CisgIEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9uczsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICAvKiBXZSBhbHJlYWR5IGhhbmRsZWQgYW4gSGVsbG8gbWVzc2FnZSBmb3IgdGhpcyBjb25uZWN0aW9uLiAqLworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiQWxyZWFkeSBoYW5kbGVkIGFuIEhlbGxvIG1lc3NhZ2UiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogTm90ZSB0aGF0IHdoZW4gdGhlc2UgbGltaXRzIGFyZSBleGNlZWRlZCB3ZSBkb24ndCBkaXNjb25uZWN0IHRoZQorICAgKiBjb25uZWN0aW9uOyB3ZSBqdXN0IHNvcnQgb2YgbGVhdmUgaXQgaGFuZ2luZyB0aGVyZSB1bnRpbCBpdCB0aW1lcworICAgKiBvdXQgb3IgZGlzY29ubmVjdHMgaXRzZWxmIG9yIGlzIGRyb3BwZWQgZHVlIHRvIHRoZSBtYXggbnVtYmVyIG9mCisgICAqIGluY29tcGxldGUgY29ubmVjdGlvbnMuIEl0J3MgZXZlbiBPSyBpZiB0aGUgY29ubmVjdGlvbiB3YW50cyB0bworICAgKiByZXRyeSB0aGUgaGVsbG8gbWVzc2FnZSwgd2Ugc3VwcG9ydCB0aGF0LgorICAgKi8KKyAgY29ubmVjdGlvbnMgPSBidXNfY29ubmVjdGlvbl9nZXRfY29ubmVjdGlvbnMgKGNvbm5lY3Rpb24pOworICBpZiAoIWJ1c19jb25uZWN0aW9uc19jaGVja19saW1pdHMgKGNvbm5lY3Rpb25zLCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ1bmlxdWVfbmFtZSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgcmVnaXN0cnkgPSBidXNfY29ubmVjdGlvbl9nZXRfcmVnaXN0cnkgKGNvbm5lY3Rpb24pOworCisgIGlmICghY3JlYXRlX3VuaXF1ZV9jbGllbnRfbmFtZSAocmVnaXN0cnksICZ1bmlxdWVfbmFtZSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0XzA7CisgICAgfQorCisgIGlmICghYnVzX2Nvbm5lY3Rpb25fY29tcGxldGUgKGNvbm5lY3Rpb24sICZ1bmlxdWVfbmFtZSwgZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0XzA7CisgICAgfQorCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9zZW5kZXIgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2dldF9uYW1lIChjb25uZWN0aW9uKSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0XzA7CisgICAgfQorCisgIGlmICghYnVzX2RyaXZlcl9zZW5kX3dlbGNvbWVfbWVzc2FnZSAoY29ubmVjdGlvbiwgbWVzc2FnZSwgdHJhbnNhY3Rpb24sIGVycm9yKSkKKyAgICBnb3RvIG91dF8wOworCisgIC8qIENyZWF0ZSB0aGUgc2VydmljZSAqLworICBzZXJ2aWNlID0gYnVzX3JlZ2lzdHJ5X2Vuc3VyZSAocmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdW5pcXVlX25hbWUsIGNvbm5lY3Rpb24sIDAsIHRyYW5zYWN0aW9uLCBlcnJvcik7CisgIGlmIChzZXJ2aWNlID09IE5VTEwpCisgICAgZ290byBvdXRfMDsKKworICBfZGJ1c19hc3NlcnQgKGJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAoY29ubmVjdGlvbikpOworICByZXR2YWwgPSBUUlVFOworCisgb3V0XzA6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmdW5pcXVlX25hbWUpOworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfc2VuZF93ZWxjb21lX21lc3NhZ2UgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKmhlbGxvX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNNZXNzYWdlICp3ZWxjb21lOworICBjb25zdCBjaGFyICpuYW1lOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIG5hbWUgPSBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydCAobmFtZSAhPSBOVUxMKTsKKworICB3ZWxjb21lID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChoZWxsb19tZXNzYWdlKTsKKyAgaWYgKHdlbGNvbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAod2VsY29tZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAod2VsY29tZSk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9oYXNfc2lnbmF0dXJlICh3ZWxjb21lLCBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORykpOworCisgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLCB3ZWxjb21lKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHdlbGNvbWUpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHdlbGNvbWUpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX2xpc3Rfc2VydmljZXMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgaW50IGxlbjsKKyAgY2hhciAqKnNlcnZpY2VzOworICBCdXNSZWdpc3RyeSAqcmVnaXN0cnk7CisgIGludCBpOworICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjsKKyAgREJ1c01lc3NhZ2VJdGVyIHN1YjsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICByZWdpc3RyeSA9IGJ1c19jb25uZWN0aW9uX2dldF9yZWdpc3RyeSAoY29ubmVjdGlvbik7CisKKyAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIWJ1c19yZWdpc3RyeV9saXN0X3NlcnZpY2VzIChyZWdpc3RyeSwgJnNlcnZpY2VzLCAmbGVuKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChyZXBseSwgJml0ZXIpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZpdGVyLCBEQlVTX1RZUEVfQVJSQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ViKSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChzZXJ2aWNlcyk7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHsKKyAgICAvKiBJbmNsdWRlIHRoZSBidXMgZHJpdmVyIGluIHRoZSBsaXN0ICovCisgICAgY29uc3QgY2hhciAqdl9TVFJJTkcgPSBEQlVTX1NFUlZJQ0VfREJVUzsKKyAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJnN1YiwgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfU1RSSU5HKSkKKyAgICAgIHsKKyAgICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2VydmljZXMpOworICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICB9CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbGVuKQorICAgIHsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmc3ViLCBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2aWNlc1tpXSkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChzZXJ2aWNlcyk7CisgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICsraTsKKyAgICB9CisKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2VydmljZXMpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmaXRlciwgJnN1YikpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9saXN0X2FjdGl2YXRhYmxlX3NlcnZpY2VzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisJCQkJCSAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisJCQkJCSAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIGludCBsZW47CisgIGNoYXIgKipzZXJ2aWNlczsKKyAgQnVzQWN0aXZhdGlvbiAqYWN0aXZhdGlvbjsKKyAgaW50IGk7CisgIERCdXNNZXNzYWdlSXRlciBpdGVyOworICBEQnVzTWVzc2FnZUl0ZXIgc3ViOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGFjdGl2YXRpb24gPSBidXNfY29ubmVjdGlvbl9nZXRfYWN0aXZhdGlvbiAoY29ubmVjdGlvbik7CisKKyAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIWJ1c19hY3RpdmF0aW9uX2xpc3Rfc2VydmljZXMgKGFjdGl2YXRpb24sICZzZXJ2aWNlcywgJmxlbikpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAocmVwbHksICZpdGVyKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmaXRlciwgREJVU19UWVBFX0FSUkFZLAorCQkJCQkgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcsCisJCQkJCSAmc3ViKSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChzZXJ2aWNlcyk7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHsKKyAgICAvKiBJbmNsdWRlIHRoZSBidXMgZHJpdmVyIGluIHRoZSBsaXN0ICovCisgICAgY29uc3QgY2hhciAqdl9TVFJJTkcgPSBEQlVTX1NFUlZJQ0VfREJVUzsKKyAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJnN1YiwgREJVU19UWVBFX1NUUklORywKKwkJCQkJICZ2X1NUUklORykpCisgICAgICB7CisJZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2VydmljZXMpOworCWRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCUJVU19TRVRfT09NIChlcnJvcik7CisJcmV0dXJuIEZBTFNFOworICAgICAgfQorICB9CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbGVuKQorICAgIHsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmc3ViLCBEQlVTX1RZUEVfU1RSSU5HLAorCQkJCQkgICAmc2VydmljZXNbaV0pKQorCXsKKwkgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKHNlcnZpY2VzKTsKKwkgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCSAgQlVTX1NFVF9PT00gKGVycm9yKTsKKwkgIHJldHVybiBGQUxTRTsKKwl9CisgICAgICArK2k7CisgICAgfQorCisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKHNlcnZpY2VzKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJml0ZXIsICZzdWIpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9oYW5kbGVfYWNxdWlyZV9zZXJ2aWNlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIERCdXNTdHJpbmcgc2VydmljZV9uYW1lOworICBjb25zdCBjaGFyICpuYW1lOworICBkYnVzX3VpbnQzMl90IHNlcnZpY2VfcmVwbHk7CisgIGRidXNfdWludDMyX3QgZmxhZ3M7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5OworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHJlZ2lzdHJ5ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X3JlZ2lzdHJ5IChjb25uZWN0aW9uKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfdmVyYm9zZSAoIlRyeWluZyB0byBvd24gbmFtZSAlcyB3aXRoIGZsYWdzIDB4JXhcbiIsIG5hbWUsIGZsYWdzKTsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgcmVwbHkgPSBOVUxMOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc2VydmljZV9uYW1lLCBuYW1lKTsKKworICBpZiAoIWJ1c19yZWdpc3RyeV9hY3F1aXJlX3NlcnZpY2UgKHJlZ2lzdHJ5LCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2aWNlX25hbWUsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2aWNlX3JlcGx5LCB0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgZ290byBvdXQ7CisKKyAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChyZXBseSwgREJVU19UWVBFX1VJTlQzMiwgJnNlcnZpY2VfcmVwbHksIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLCByZXBseSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAocmVwbHkpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9oYW5kbGVfcmVsZWFzZV9zZXJ2aWNlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIERCdXNTdHJpbmcgc2VydmljZV9uYW1lOworICBjb25zdCBjaGFyICpuYW1lOworICBkYnVzX3VpbnQzMl90IHNlcnZpY2VfcmVwbHk7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5OworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHJlZ2lzdHJ5ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X3JlZ2lzdHJ5IChjb25uZWN0aW9uKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfdmVyYm9zZSAoIlRyeWluZyB0byByZWxlYXNlIG5hbWUgJXNcbiIsIG5hbWUpOworCisgIHJldHZhbCA9IEZBTFNFOworICByZXBseSA9IE5VTEw7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzZXJ2aWNlX25hbWUsIG5hbWUpOworCisgIGlmICghYnVzX3JlZ2lzdHJ5X3JlbGVhc2Vfc2VydmljZSAocmVnaXN0cnksIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcnZpY2VfbmFtZSwgJnNlcnZpY2VfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sIGVycm9yKSkKKyAgICBnb3RvIG91dDsKKworICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKHJlcGx5LCBEQlVTX1RZUEVfVUlOVDMyLCAmc2VydmljZV9yZXBseSwgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKCFidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChyZXBseSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9zZXJ2aWNlX2V4aXN0cyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBEQnVzU3RyaW5nIHNlcnZpY2VfbmFtZTsKKyAgQnVzU2VydmljZSAqc2VydmljZTsKKyAgZGJ1c19ib29sX3Qgc2VydmljZV9leGlzdHM7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5OworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHJlZ2lzdHJ5ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X3JlZ2lzdHJ5IChjb25uZWN0aW9uKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgaWYgKHN0cmNtcCAobmFtZSwgREJVU19TRVJWSUNFX0RCVVMpID09IDApCisgICAgeworICAgICAgc2VydmljZV9leGlzdHMgPSBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc2VydmljZV9uYW1lLCBuYW1lKTsKKyAgICAgIHNlcnZpY2UgPSBidXNfcmVnaXN0cnlfbG9va3VwIChyZWdpc3RyeSwgJnNlcnZpY2VfbmFtZSk7CisgICAgICBzZXJ2aWNlX2V4aXN0cyA9IHNlcnZpY2UgIT0gTlVMTDsKKyAgICB9CisKKyAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9CT09MRUFOLCAmc2VydmljZV9leGlzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLCByZXBseSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAocmVwbHkpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9hY3RpdmF0ZV9zZXJ2aWNlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBkYnVzX3VpbnQzMl90IGZsYWdzOworICBjb25zdCBjaGFyICpuYW1lOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb247CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgYWN0aXZhdGlvbiA9IGJ1c19jb25uZWN0aW9uX2dldF9hY3RpdmF0aW9uIChjb25uZWN0aW9uKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBfZGJ1c192ZXJib3NlICgiTm8gbWVtb3J5IHRvIGdldCBhcmd1bWVudHMgdG8gU3RhcnRTZXJ2aWNlQnlOYW1lXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgaWYgKCFidXNfYWN0aXZhdGlvbl9hY3RpdmF0ZV9zZXJ2aWNlIChhY3RpdmF0aW9uLCBjb25uZWN0aW9uLCB0cmFuc2FjdGlvbiwgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgbmFtZSwgZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJidXNfYWN0aXZhdGlvbl9hY3RpdmF0ZV9zZXJ2aWNlKCkgZmFpbGVkXG4iKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NlbmRfYWNrX3JlcGx5IChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfbm9fcmVwbHkgKG1lc3NhZ2UpKQorICAgIHJldHVybiBUUlVFOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX3VwZGF0ZV9hY3RpdmF0aW9uX2Vudmlyb25tZW50IChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb247CisgIERCdXNNZXNzYWdlSXRlciBpdGVyOworICBEQnVzTWVzc2FnZUl0ZXIgZGljdF9pdGVyOworICBEQnVzTWVzc2FnZUl0ZXIgZGljdF9lbnRyeV9pdGVyOworICBpbnQgYXJyYXlfdHlwZTsKKyAgaW50IGtleV90eXBlOworICBEQnVzTGlzdCAqa2V5cywgKmtleV9saW5rOworICBEQnVzTGlzdCAqdmFsdWVzLCAqdmFsdWVfbGluazsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBhY3RpdmF0aW9uID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X2FjdGl2YXRpb24gKGNvbm5lY3Rpb24pOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXQgKG1lc3NhZ2UsICZpdGVyKTsKKworICAvKiBUaGUgbWVzc2FnZSBzaWduYXR1cmUgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkIGZvciB1cywKKyAgICogc28gbGV0J3MganVzdCBhc3NlcnQgaXQncyByaWdodC4KKyAgICovCisjaWZuZGVmIERCVVNfRElTQUJMRV9BU1NFUlQKKyAgICB7CisgICAgICBpbnQgbXNnX3R5cGUgPSBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZpdGVyKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChtc2dfdHlwZSA9PSBEQlVTX1RZUEVfQVJSQVkpOworICAgIH0KKyNlbmRpZgorCisgIGRidXNfbWVzc2FnZV9pdGVyX3JlY3Vyc2UgKCZpdGVyLCAmZGljdF9pdGVyKTsKKworICByZXR2YWwgPSBGQUxTRTsKKworICAvKiBUaGVuIGxvb3AgdGhyb3VnaCB0aGUgc2VudCBkaWN0aW9uYXJ5LCBhZGQgdGhlIGxvY2F0aW9uIG9mCisgICAqIHRoZSBlbnZpcm9ubWVudCBrZXlzIGFuZCB2YWx1ZXMgdG8gbGlzdHMuIFRoZSByZXN1bHQgd2lsbAorICAgKiBiZSBpbiByZXZlcnNlIG9yZGVyLCBzbyB3ZSBkb24ndCBoYXZlIHRvIGNvbnN0YW50bHkgc2VhcmNoCisgICAqIGZvciB0aGUgZW5kIG9mIHRoZSBsaXN0IGluIGEgbG9vcC4KKyAgICovCisgIGtleXMgPSBOVUxMOworICB2YWx1ZXMgPSBOVUxMOworICB3aGlsZSAoKGFycmF5X3R5cGUgPSBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZkaWN0X2l0ZXIpKSA9PSBEQlVTX1RZUEVfRElDVF9FTlRSWSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlICgmZGljdF9pdGVyLCAmZGljdF9lbnRyeV9pdGVyKTsKKworICAgICAgd2hpbGUgKChrZXlfdHlwZSA9IGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJmRpY3RfZW50cnlfaXRlcikpID09IERCVVNfVFlQRV9TVFJJTkcpCisgICAgICAgIHsKKyAgICAgICAgICBjaGFyICprZXk7CisgICAgICAgICAgY2hhciAqdmFsdWU7CisgICAgICAgICAgaW50IHZhbHVlX3R5cGU7CisKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKCZkaWN0X2VudHJ5X2l0ZXIsICZrZXkpOworICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZkaWN0X2VudHJ5X2l0ZXIpOworCisgICAgICAgICAgdmFsdWVfdHlwZSA9IGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJmRpY3RfZW50cnlfaXRlcik7CisKKyAgICAgICAgICBpZiAodmFsdWVfdHlwZSAhPSBEQlVTX1RZUEVfU1RSSU5HKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKCZkaWN0X2VudHJ5X2l0ZXIsICZ2YWx1ZSk7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgma2V5cywga2V5KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmdmFsdWVzLCB2YWx1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJmRpY3RfZW50cnlfaXRlcik7CisgICAgICAgIH0KKworICAgICAgaWYgKGtleV90eXBlICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgICAgICBicmVhazsKKworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJmRpY3RfaXRlcik7CisgICAgfQorCisgIGlmIChhcnJheV90eXBlICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgIGdvdG8gb3V0OworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfbGlzdF9nZXRfbGVuZ3RoICgma2V5cykgPT0gX2RidXNfbGlzdF9nZXRfbGVuZ3RoICgmdmFsdWVzKSk7CisKKyAga2V5X2xpbmsgPSBrZXlzOworICB2YWx1ZV9saW5rID0gdmFsdWVzOworICB3aGlsZSAoa2V5X2xpbmsgIT0gTlVMTCkKKyAgeworICAgICAgY29uc3QgY2hhciAqa2V5OworICAgICAgY29uc3QgY2hhciAqdmFsdWU7CisKKyAgICAgIGtleSA9IGtleV9saW5rLT5kYXRhOworICAgICAgdmFsdWUgPSB2YWx1ZV9saW5rLT5kYXRhOworCisgICAgICBpZiAoIWJ1c19hY3RpdmF0aW9uX3NldF9lbnZpcm9ubWVudF92YXJpYWJsZSAoYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksIHZhbHVlLCBlcnJvcikpCisgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJidXNfYWN0aXZhdGlvbl9zZXRfZW52aXJvbm1lbnRfdmFyaWFibGUoKSBmYWlsZWRcbiIpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAga2V5X2xpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZrZXlzLCBrZXlfbGluayk7CisgICAgICB2YWx1ZV9saW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmdmFsdWVzLCB2YWx1ZV9saW5rKTsKKyAgfQorCisgIC8qIEZJWE1FOiBXZSBjYW4gZmFpbCBlYXJseSBoYXZpbmcgc2V0IG9ubHkgc29tZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLAorICAgKiAoYmVjYXVzZSBvZiBPT00gZmFpbHVyZSkuICBJdCdzIHNvcnQgb2YgaGFyZCB0byBmaXggYW5kIGl0IGRvZXNuJ3QgcmVhbGx5CisgICAqIG1hdHRlciwgc28gd2UncmUgcHVudGluZyBmb3Igbm93LgorICAgKi8KKyAgaWYgKGtleV9saW5rICE9IE5VTEwpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFzZW5kX2Fja19yZXBseSAoY29ubmVjdGlvbiwgdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGVycm9yKSkKKyAgICBnb3RvIG91dDsKKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBfZGJ1c19saXN0X2NsZWFyICgma2V5cyk7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZ2YWx1ZXMpOworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX2FkZF9tYXRjaCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgQnVzTWF0Y2hSdWxlICpydWxlOworICBjb25zdCBjaGFyICp0ZXh0OworICBEQnVzU3RyaW5nIHN0cjsKKyAgQnVzTWF0Y2htYWtlciAqbWF0Y2htYWtlcjsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICB0ZXh0ID0gTlVMTDsKKyAgcnVsZSA9IE5VTEw7CisKKyAgaWYgKGJ1c19jb25uZWN0aW9uX2dldF9uX21hdGNoX3J1bGVzIChjb25uZWN0aW9uKSA+PQorICAgICAgYnVzX2NvbnRleHRfZ2V0X21heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbiAoYnVzX3RyYW5zYWN0aW9uX2dldF9jb250ZXh0ICh0cmFuc2FjdGlvbikpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9MSU1JVFNfRVhDRUVERUQsCisgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24gXCIlc1wiIGlzIG5vdCBhbGxvd2VkIHRvIGFkZCBtb3JlIG1hdGNoIHJ1bGVzICIKKyAgICAgICAgICAgICAgICAgICAgICAiKGluY3JlYXNlIGxpbWl0cyBpbiBjb25maWd1cmF0aW9uIGZpbGUgaWYgcmVxdWlyZWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKGNvbm5lY3Rpb24pID8KKyAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbikgOgorICAgICAgICAgICAgICAgICAgICAgICIoaW5hY3RpdmUpIik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIG1lbW9yeSB0byBnZXQgYXJndW1lbnRzIHRvIEFkZE1hdGNoXG4iKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgdGV4dCk7CisKKyAgcnVsZSA9IGJ1c19tYXRjaF9ydWxlX3BhcnNlIChjb25uZWN0aW9uLCAmc3RyLCBlcnJvcik7CisgIGlmIChydWxlID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisKKyAgbWF0Y2htYWtlciA9IGJ1c19jb25uZWN0aW9uX2dldF9tYXRjaG1ha2VyIChjb25uZWN0aW9uKTsKKworICBpZiAoIWJ1c19tYXRjaG1ha2VyX2FkZF9ydWxlIChtYXRjaG1ha2VyLCBydWxlKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmICghc2VuZF9hY2tfcmVwbHkgKGNvbm5lY3Rpb24sIHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBlcnJvcikpCisgICAgeworICAgICAgYnVzX21hdGNobWFrZXJfcmVtb3ZlX3J1bGUgKG1hdGNobWFrZXIsIHJ1bGUpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKKworICByZXR1cm4gVFJVRTsKKworIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICBpZiAocnVsZSkKKyAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9yZW1vdmVfbWF0Y2ggKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIEJ1c01hdGNoUnVsZSAqcnVsZTsKKyAgY29uc3QgY2hhciAqdGV4dDsKKyAgREJ1c1N0cmluZyBzdHI7CisgIEJ1c01hdGNobWFrZXIgKm1hdGNobWFrZXI7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgdGV4dCA9IE5VTEw7CisgIHJ1bGUgPSBOVUxMOworCisgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZ0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBtZW1vcnkgdG8gZ2V0IGFyZ3VtZW50cyB0byBSZW1vdmVNYXRjaFxuIik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIHRleHQpOworCisgIHJ1bGUgPSBidXNfbWF0Y2hfcnVsZV9wYXJzZSAoY29ubmVjdGlvbiwgJnN0ciwgZXJyb3IpOworICBpZiAocnVsZSA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkOworCisgIC8qIFNlbmQgdGhlIGFjayBiZWZvcmUgd2UgcmVtb3ZlIHRoZSBydWxlLCBzaW5jZSB0aGUgYWNrIGlzIHVuZG9uZQorICAgKiBvbiB0cmFuc2FjdGlvbiBjYW5jZWwsIGJ1dCBydWxlIHJlbW92YWwgaXNuJ3QuCisgICAqLworICBpZiAoIXNlbmRfYWNrX3JlcGx5IChjb25uZWN0aW9uLCB0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgZXJyb3IpKQorICAgIGdvdG8gZmFpbGVkOworCisgIG1hdGNobWFrZXIgPSBidXNfY29ubmVjdGlvbl9nZXRfbWF0Y2htYWtlciAoY29ubmVjdGlvbik7CisKKyAgaWYgKCFidXNfbWF0Y2htYWtlcl9yZW1vdmVfcnVsZV9ieV92YWx1ZSAobWF0Y2htYWtlciwgcnVsZSwgZXJyb3IpKQorICAgIGdvdG8gZmFpbGVkOworCisgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKKworICByZXR1cm4gVFJVRTsKKworIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICBpZiAocnVsZSkKKyAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9nZXRfc2VydmljZV9vd25lciAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisJCQkJICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKwkJCQkgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqdGV4dDsKKyAgY29uc3QgY2hhciAqYmFzZV9uYW1lOworICBEQnVzU3RyaW5nIHN0cjsKKyAgQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5OworICBCdXNTZXJ2aWNlICpzZXJ2aWNlOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgcmVnaXN0cnkgPSBidXNfY29ubmVjdGlvbl9nZXRfcmVnaXN0cnkgKGNvbm5lY3Rpb24pOworCisgIHRleHQgPSBOVUxMOworICByZXBseSA9IE5VTEw7CisKKyAgaWYgKCEgZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCBlcnJvciwKKwkJCSAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdGV4dCwKKwkJCSAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICBnb3RvIGZhaWxlZDsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgdGV4dCk7CisgIHNlcnZpY2UgPSBidXNfcmVnaXN0cnlfbG9va3VwIChyZWdpc3RyeSwgJnN0cik7CisgIGlmIChzZXJ2aWNlID09IE5VTEwgJiYKKyAgICAgIF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJnN0ciwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgIHsKKyAgICAgIC8qIE9SR19GUkVFREVTS1RPUF9EQlVTIG93bnMgaXRzZWxmICovCisgICAgICBiYXNlX25hbWUgPSBEQlVTX1NFUlZJQ0VfREJVUzsKKyAgICB9CisgIGVsc2UgaWYgKHNlcnZpY2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OQU1FX0hBU19OT19PV05FUiwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGdldCBvd25lciBvZiBuYW1lICclcyc6IG5vIHN1Y2ggbmFtZSIsIHRleHQpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYmFzZV9uYW1lID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyc19jb25uZWN0aW9uIChzZXJ2aWNlKSk7CisgICAgICBpZiAoYmFzZV9uYW1lID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBGSVhNRSAtIGhvdyBpcyB0aGlzIGVycm9yIHBvc3NpYmxlPyAqLworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGV0ZXJtaW5lIHVuaXF1ZSBuYW1lIGZvciAnJXMnIiwgdGV4dCk7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIF9kYnVzX2Fzc2VydCAoKmJhc2VfbmFtZSA9PSAnOicpOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGJhc2VfbmFtZSAhPSBOVUxMKTsKKworICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIGlmICghIGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAocmVwbHksCisJCQkJICBEQlVTX1RZUEVfU1RSSU5HLCAmYmFzZV9uYW1lLAorCQkJCSAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIGdvdG8gb29tOworCisgIGlmICghIGJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIGdvdG8gb29tOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgIHJldHVybiBUUlVFOworCisgb29tOgorICBCVVNfU0VUX09PTSAoZXJyb3IpOworCisgZmFpbGVkOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIGlmIChyZXBseSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX2xpc3RfcXVldWVkX293bmVycyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorCQkJCSAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorCQkJCSAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqdGV4dDsKKyAgREJ1c0xpc3QgKmJhc2VfbmFtZXM7CisgIERCdXNMaXN0ICpsaW5rOworICBEQnVzU3RyaW5nIHN0cjsKKyAgQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5OworICBCdXNTZXJ2aWNlICpzZXJ2aWNlOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIERCdXNNZXNzYWdlSXRlciBpdGVyLCBhcnJheV9pdGVyOworICBjaGFyICpkYnVzX3NlcnZpY2VfbmFtZSA9IERCVVNfU0VSVklDRV9EQlVTOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHJlZ2lzdHJ5ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X3JlZ2lzdHJ5IChjb25uZWN0aW9uKTsKKworICBiYXNlX25hbWVzID0gTlVMTDsKKyAgdGV4dCA9IE5VTEw7CisgIHJlcGx5ID0gTlVMTDsKKworICBpZiAoISBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIGVycm9yLAorCQkJICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZ0ZXh0LAorCQkJICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgIGdvdG8gZmFpbGVkOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCB0ZXh0KTsKKyAgc2VydmljZSA9IGJ1c19yZWdpc3RyeV9sb29rdXAgKHJlZ2lzdHJ5LCAmc3RyKTsKKyAgaWYgKHNlcnZpY2UgPT0gTlVMTCAmJgorICAgICAgX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmc3RyLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgeworICAgICAgLyogT1JHX0ZSRUVERVNLVE9QX0RCVVMgb3ducyBpdHNlbGYgKi8KKyAgICAgIGlmICghIF9kYnVzX2xpc3RfYXBwZW5kICgmYmFzZV9uYW1lcywgZGJ1c19zZXJ2aWNlX25hbWUpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisgIGVsc2UgaWYgKHNlcnZpY2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OQU1FX0hBU19OT19PV05FUiwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGdldCBvd25lcnMgb2YgbmFtZSAnJXMnOiBubyBzdWNoIG5hbWUiLCB0ZXh0KTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghYnVzX3NlcnZpY2VfbGlzdF9xdWV1ZWRfb3duZXJzIChzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiYXNlX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoYmFzZV9uYW1lcyAhPSBOVUxMKTsKKworICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChyZXBseSwgJml0ZXIpOworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFycmF5X2l0ZXIpKQorICAgIGdvdG8gb29tOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmYmFzZV9uYW1lcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgY2hhciAqdW5hbWU7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAobGluay0+ZGF0YSAhPSBOVUxMKTsKKyAgICAgIHVuYW1lID0gKGNoYXIgKilsaW5rLT5kYXRhOworCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJmFycmF5X2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdW5hbWUpKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmJhc2VfbmFtZXMsIGxpbmspOworICAgIH0KKworICBpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZpdGVyLCAmYXJyYXlfaXRlcikpCisgICAgZ290byBvb207CisKKworICBpZiAoISBidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICBnb3RvIG9vbTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgQlVTX1NFVF9PT00gKGVycm9yKTsKKworIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICBpZiAocmVwbHkpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisKKyAgaWYgKGJhc2VfbmFtZXMpCisgICAgX2RidXNfbGlzdF9jbGVhciAoJmJhc2VfbmFtZXMpOworCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9nZXRfY29ubmVjdGlvbl91bml4X3VzZXIgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKnNlcnZpY2U7CisgIERCdXNTdHJpbmcgc3RyOworICBCdXNSZWdpc3RyeSAqcmVnaXN0cnk7CisgIEJ1c1NlcnZpY2UgKnNlcnY7CisgIERCdXNDb25uZWN0aW9uICpjb25uOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIHVuc2lnbmVkIGxvbmcgdWlkOworICBkYnVzX3VpbnQzMl90IHVpZDMyOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHJlZ2lzdHJ5ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X3JlZ2lzdHJ5IChjb25uZWN0aW9uKTsKKworICBzZXJ2aWNlID0gTlVMTDsKKyAgcmVwbHkgPSBOVUxMOworCisgIGlmICghIGRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwgZXJyb3IsCisJCQkgICAgICAgREJVU19UWVBFX1NUUklORywgJnNlcnZpY2UsCisJCQkgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgZ290byBmYWlsZWQ7CisKKyAgX2RidXNfdmVyYm9zZSAoImFza2VkIGZvciBVSUQgb2YgY29ubmVjdGlvbiAlc1xuIiwgc2VydmljZSk7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIHNlcnZpY2UpOworICBzZXJ2ID0gYnVzX3JlZ2lzdHJ5X2xvb2t1cCAocmVnaXN0cnksICZzdHIpOworICBpZiAoc2VydiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKwkJICAgICAgREJVU19FUlJPUl9OQU1FX0hBU19OT19PV05FUiwKKwkJICAgICAgIkNvdWxkIG5vdCBnZXQgVUlEIG9mIG5hbWUgJyVzJzogbm8gc3VjaCBuYW1lIiwgc2VydmljZSk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgY29ubiA9IGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyc19jb25uZWN0aW9uIChzZXJ2KTsKKworICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3VzZXIgKGNvbm4sICZ1aWQpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGRldGVybWluZSBVSUQgZm9yICclcyciLCBzZXJ2aWNlKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICB1aWQzMiA9IHVpZDsKKyAgaWYgKCEgZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmdWlkMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIGdvdG8gb29tOworCisgIGlmICghIGJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIGdvdG8gb29tOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgIHJldHVybiBUUlVFOworCisgb29tOgorICBCVVNfU0VUX09PTSAoZXJyb3IpOworCisgZmFpbGVkOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIGlmIChyZXBseSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX2dldF9jb25uZWN0aW9uX3VuaXhfcHJvY2Vzc19pZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCQkgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKwkJCQkJCSAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisJCQkJCQkgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqc2VydmljZTsKKyAgREJ1c1N0cmluZyBzdHI7CisgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKyAgQnVzU2VydmljZSAqc2VydjsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm47CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgdW5zaWduZWQgbG9uZyBwaWQ7CisgIGRidXNfdWludDMyX3QgcGlkMzI7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgcmVnaXN0cnkgPSBidXNfY29ubmVjdGlvbl9nZXRfcmVnaXN0cnkgKGNvbm5lY3Rpb24pOworCisgIHNlcnZpY2UgPSBOVUxMOworICByZXBseSA9IE5VTEw7CisKKyAgaWYgKCEgZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCBlcnJvciwKKwkJCSAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmc2VydmljZSwKKwkJCSAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICBnb3RvIGZhaWxlZDsKKworICBfZGJ1c192ZXJib3NlICgiYXNrZWQgZm9yIFBJRCBvZiBjb25uZWN0aW9uICVzXG4iLCBzZXJ2aWNlKTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgc2VydmljZSk7CisgIHNlcnYgPSBidXNfcmVnaXN0cnlfbG9va3VwIChyZWdpc3RyeSwgJnN0cik7CisgIGlmIChzZXJ2ID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorCQkgICAgICBEQlVTX0VSUk9SX05BTUVfSEFTX05PX09XTkVSLAorCQkgICAgICAiQ291bGQgbm90IGdldCBQSUQgb2YgbmFtZSAnJXMnOiBubyBzdWNoIG5hbWUiLCBzZXJ2aWNlKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBjb25uID0gYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXJzX2Nvbm5lY3Rpb24gKHNlcnYpOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfcHJvY2Vzc19pZCAoY29ubiwgJnBpZCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfVU5JWF9QUk9DRVNTX0lEX1VOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBkZXRlcm1pbmUgUElEIGZvciAnJXMnIiwgc2VydmljZSk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgcGlkMzIgPSBwaWQ7CisgIGlmICghIGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAocmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJnBpZDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoISBidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICBnb3RvIG9vbTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgQlVTX1NFVF9PT00gKGVycm9yKTsKKworIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICBpZiAocmVwbHkpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9nZXRfYWR0X2F1ZGl0X3Nlc3Npb25fZGF0YSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCSAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKwkJCQkJICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisJCQkJCSAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqc2VydmljZTsKKyAgREJ1c1N0cmluZyBzdHI7CisgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKyAgQnVzU2VydmljZSAqc2VydjsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm47CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgdm9pZCAqZGF0YSA9IE5VTEw7CisgIGRidXNfdWludDMyX3QgZGF0YV9zaXplOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHJlZ2lzdHJ5ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X3JlZ2lzdHJ5IChjb25uZWN0aW9uKTsKKworICBzZXJ2aWNlID0gTlVMTDsKKyAgcmVwbHkgPSBOVUxMOworCisgIGlmICghIGRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwgZXJyb3IsCisJCQkgICAgICAgREJVU19UWVBFX1NUUklORywgJnNlcnZpY2UsCisJCQkgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgZ290byBmYWlsZWQ7CisKKyAgX2RidXNfdmVyYm9zZSAoImFza2VkIGZvciBhdWRpdCBzZXNzaW9uIGRhdGEgZm9yIGNvbm5lY3Rpb24gJXNcbiIsIHNlcnZpY2UpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBzZXJ2aWNlKTsKKyAgc2VydiA9IGJ1c19yZWdpc3RyeV9sb29rdXAgKHJlZ2lzdHJ5LCAmc3RyKTsKKyAgaWYgKHNlcnYgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisJCSAgICAgIERCVVNfRVJST1JfTkFNRV9IQVNfTk9fT1dORVIsCisJCSAgICAgICJDb3VsZCBub3QgZ2V0IGF1ZGl0IHNlc3Npb24gZGF0YSBmb3IgbmFtZSAnJXMnOiBubyBzdWNoIG5hbWUiLCBzZXJ2aWNlKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBjb25uID0gYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXJzX2Nvbm5lY3Rpb24gKHNlcnYpOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2FkdF9hdWRpdF9zZXNzaW9uX2RhdGEgKGNvbm4sICZkYXRhLCAmZGF0YV9zaXplKSB8fCBkYXRhID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfQURUX0FVRElUX0RBVEFfVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGRldGVybWluZSBhdWRpdCBzZXNzaW9uIGRhdGEgZm9yICclcyciLCBzZXJ2aWNlKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBpZiAoISBkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKHJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX0JZVEUsICZkYXRhLCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIGdvdG8gb29tOworCisgIGlmICghIGJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIGdvdG8gb29tOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgIHJldHVybiBUUlVFOworCisgb29tOgorICBCVVNfU0VUX09PTSAoZXJyb3IpOworCisgZmFpbGVkOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIGlmIChyZXBseSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX2dldF9jb25uZWN0aW9uX3NlbGludXhfc2VjdXJpdHlfY29udGV4dCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCQkJICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorCQkJCQkJCSAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorCQkJCQkJCSAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqc2VydmljZTsKKyAgREJ1c1N0cmluZyBzdHI7CisgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKyAgQnVzU2VydmljZSAqc2VydjsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm47CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgQnVzU0VMaW51eElEICpjb250ZXh0OworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHJlZ2lzdHJ5ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X3JlZ2lzdHJ5IChjb25uZWN0aW9uKTsKKworICBzZXJ2aWNlID0gTlVMTDsKKyAgcmVwbHkgPSBOVUxMOworCisgIGlmICghIGRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwgZXJyb3IsCisJCQkgICAgICAgREJVU19UWVBFX1NUUklORywgJnNlcnZpY2UsCisJCQkgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgZ290byBmYWlsZWQ7CisKKyAgX2RidXNfdmVyYm9zZSAoImFza2VkIGZvciBzZWN1cml0eSBjb250ZXh0IG9mIGNvbm5lY3Rpb24gJXNcbiIsIHNlcnZpY2UpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBzZXJ2aWNlKTsKKyAgc2VydiA9IGJ1c19yZWdpc3RyeV9sb29rdXAgKHJlZ2lzdHJ5LCAmc3RyKTsKKyAgaWYgKHNlcnYgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisJCSAgICAgIERCVVNfRVJST1JfTkFNRV9IQVNfTk9fT1dORVIsCisJCSAgICAgICJDb3VsZCBub3QgZ2V0IHNlY3VyaXR5IGNvbnRleHQgb2YgbmFtZSAnJXMnOiBubyBzdWNoIG5hbWUiLCBzZXJ2aWNlKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBjb25uID0gYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXJzX2Nvbm5lY3Rpb24gKHNlcnYpOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgY29udGV4dCA9IGJ1c19jb25uZWN0aW9uX2dldF9zZWxpbnV4X2lkIChjb25uKTsKKyAgaWYgKCFjb250ZXh0KQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1NFTElOVVhfU0VDVVJJVFlfQ09OVEVYVF9VTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGV0ZXJtaW5lIHNlY3VyaXR5IGNvbnRleHQgZm9yICclcyciLCBzZXJ2aWNlKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBpZiAoISBidXNfc2VsaW51eF9hcHBlbmRfY29udGV4dCAocmVwbHksIGNvbnRleHQsIGVycm9yKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBpZiAoISBidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICBnb3RvIG9vbTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgQlVTX1NFVF9PT00gKGVycm9yKTsKKworIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICBpZiAocmVwbHkpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9yZWxvYWRfY29uZmlnIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorCQkJCSBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKwkJCQkgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBCdXNDb250ZXh0ICpjb250ZXh0OworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgcmVwbHkgPSBOVUxMOworCisgIGNvbnRleHQgPSBidXNfY29ubmVjdGlvbl9nZXRfY29udGV4dCAoY29ubmVjdGlvbik7CisgIGlmICghYnVzX2NvbnRleHRfcmVsb2FkX2NvbmZpZyAoY29udGV4dCwgZXJyb3IpKQorICAgIGdvdG8gZmFpbGVkOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgaWYgKCEgYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLCByZXBseSkpCisgICAgZ290byBvb207CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIHJldHVybiBUUlVFOworCisgb29tOgorICBCVVNfU0VUX09PTSAoZXJyb3IpOworCisgZmFpbGVkOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIGlmIChyZXBseSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX2dldF9pZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBEQnVzU3RyaW5nIHV1aWQ7CisgIGNvbnN0IGNoYXIgKnZfU1RSSU5HOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ1dWlkKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXBseSA9IE5VTEw7CisKKyAgY29udGV4dCA9IGJ1c19jb25uZWN0aW9uX2dldF9jb250ZXh0IChjb25uZWN0aW9uKTsKKyAgaWYgKCFidXNfY29udGV4dF9nZXRfaWQgKGNvbnRleHQsICZ1dWlkKSkKKyAgICBnb3RvIG9vbTsKKworICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIHZfU1RSSU5HID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmdXVpZCk7CisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZ2X1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICBnb3RvIG9vbTsKKworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9oYXNfc2lnbmF0dXJlIChyZXBseSwgInMiKSk7CisKKyAgaWYgKCEgYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLCByZXBseSkpCisgICAgZ290byBvb207CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ1dWlkKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIHJldHVybiBUUlVFOworCisgb29tOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBCVVNfU0VUX09PTSAoZXJyb3IpOworCisgIGlmIChyZXBseSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ1dWlkKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBjaGFyICpuYW1lOworICBjb25zdCBjaGFyICppbl9hcmdzOworICBjb25zdCBjaGFyICpvdXRfYXJnczsKKyAgZGJ1c19ib29sX3QgKCogaGFuZGxlcikgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworfSBNZXNzYWdlSGFuZGxlcjsKKworLyogRm9yIHNwZWVkIGl0IG1pZ2h0IGJlIHVzZWZ1bCB0byBzb3J0IHRoaXMgaW4gb3JkZXIgb2YKKyAqIGZyZXF1ZW5jeSBvZiB1c2UgKGJ1dCBkb2Vzbid0IG1hdHRlciB3aXRoIG9ubHkgYSBmZXcgaXRlbXMKKyAqIGFueWhvdykKKyAqLworc3RhdGljIGNvbnN0IE1lc3NhZ2VIYW5kbGVyIGRidXNfbWVzc2FnZV9oYW5kbGVyc1tdID0geworICB7ICJIZWxsbyIsCisgICAgIiIsCisgICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcsCisgICAgYnVzX2RyaXZlcl9oYW5kbGVfaGVsbG8gfSwKKyAgeyAiUmVxdWVzdE5hbWUiLAorICAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HIERCVVNfVFlQRV9VSU5UMzJfQVNfU1RSSU5HLAorICAgIERCVVNfVFlQRV9VSU5UMzJfQVNfU1RSSU5HLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX2FjcXVpcmVfc2VydmljZSB9LAorICB7ICJSZWxlYXNlTmFtZSIsCisgICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcsCisgICAgREJVU19UWVBFX1VJTlQzMl9BU19TVFJJTkcsCisgICAgYnVzX2RyaXZlcl9oYW5kbGVfcmVsZWFzZV9zZXJ2aWNlIH0sCisgIHsgIlN0YXJ0U2VydmljZUJ5TmFtZSIsCisgICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcgREJVU19UWVBFX1VJTlQzMl9BU19TVFJJTkcsCisgICAgREJVU19UWVBFX1VJTlQzMl9BU19TVFJJTkcsCisgICAgYnVzX2RyaXZlcl9oYW5kbGVfYWN0aXZhdGVfc2VydmljZSB9LAorICB7ICJVcGRhdGVBY3RpdmF0aW9uRW52aXJvbm1lbnQiLAorICAgIERCVVNfVFlQRV9BUlJBWV9BU19TVFJJTkcgREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVJfQVNfU1RSSU5HIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HIERCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUl9BU19TVFJJTkcsCisgICAgIiIsCisgICAgYnVzX2RyaXZlcl9oYW5kbGVfdXBkYXRlX2FjdGl2YXRpb25fZW52aXJvbm1lbnQgfSwKKyAgeyAiTmFtZUhhc093bmVyIiwKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICBEQlVTX1RZUEVfQk9PTEVBTl9BU19TVFJJTkcsCisgICAgYnVzX2RyaXZlcl9oYW5kbGVfc2VydmljZV9leGlzdHMgfSwKKyAgeyAiTGlzdE5hbWVzIiwKKyAgICAiIiwKKyAgICBEQlVTX1RZUEVfQVJSQVlfQVNfU1RSSU5HIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX2xpc3Rfc2VydmljZXMgfSwKKyAgeyAiTGlzdEFjdGl2YXRhYmxlTmFtZXMiLAorICAgICIiLAorICAgIERCVVNfVFlQRV9BUlJBWV9BU19TVFJJTkcgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcsCisgICAgYnVzX2RyaXZlcl9oYW5kbGVfbGlzdF9hY3RpdmF0YWJsZV9zZXJ2aWNlcyB9LAorICB7ICJBZGRNYXRjaCIsCisgICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcsCisgICAgIiIsCisgICAgYnVzX2RyaXZlcl9oYW5kbGVfYWRkX21hdGNoIH0sCisgIHsgIlJlbW92ZU1hdGNoIiwKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICAiIiwKKyAgICBidXNfZHJpdmVyX2hhbmRsZV9yZW1vdmVfbWF0Y2ggfSwKKyAgeyAiR2V0TmFtZU93bmVyIiwKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICBidXNfZHJpdmVyX2hhbmRsZV9nZXRfc2VydmljZV9vd25lciB9LAorICB7ICJMaXN0UXVldWVkT3duZXJzIiwKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICBEQlVTX1RZUEVfQVJSQVlfQVNfU1RSSU5HIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX2xpc3RfcXVldWVkX293bmVycyB9LAorICB7ICJHZXRDb25uZWN0aW9uVW5peFVzZXIiLAorICAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HLAorICAgIERCVVNfVFlQRV9VSU5UMzJfQVNfU1RSSU5HLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX2dldF9jb25uZWN0aW9uX3VuaXhfdXNlciB9LAorICB7ICJHZXRDb25uZWN0aW9uVW5peFByb2Nlc3NJRCIsCisgICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcsCisgICAgREJVU19UWVBFX1VJTlQzMl9BU19TVFJJTkcsCisgICAgYnVzX2RyaXZlcl9oYW5kbGVfZ2V0X2Nvbm5lY3Rpb25fdW5peF9wcm9jZXNzX2lkIH0sCisgIHsgIkdldEFkdEF1ZGl0U2Vzc2lvbkRhdGEiLAorICAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HLAorICAgIERCVVNfVFlQRV9BUlJBWV9BU19TVFJJTkcgREJVU19UWVBFX0JZVEVfQVNfU1RSSU5HLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX2dldF9hZHRfYXVkaXRfc2Vzc2lvbl9kYXRhIH0sCisgIHsgIkdldENvbm5lY3Rpb25TRUxpbnV4U2VjdXJpdHlDb250ZXh0IiwKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICBEQlVTX1RZUEVfQVJSQVlfQVNfU1RSSU5HIERCVVNfVFlQRV9CWVRFX0FTX1NUUklORywKKyAgICBidXNfZHJpdmVyX2hhbmRsZV9nZXRfY29ubmVjdGlvbl9zZWxpbnV4X3NlY3VyaXR5X2NvbnRleHQgfSwKKyAgeyAiUmVsb2FkQ29uZmlnIiwKKyAgICAiIiwKKyAgICAiIiwKKyAgICBidXNfZHJpdmVyX2hhbmRsZV9yZWxvYWRfY29uZmlnIH0sCisgIHsgIkdldElkIiwKKyAgICAiIiwKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICBidXNfZHJpdmVyX2hhbmRsZV9nZXRfaWQgfSwKKyAgeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0KK307CisKK3N0YXRpYyBkYnVzX2Jvb2xfdCBidXNfZHJpdmVyX2hhbmRsZV9pbnRyb3NwZWN0IChEQnVzQ29ubmVjdGlvbiAqLAorICAgIEJ1c1RyYW5zYWN0aW9uICosIERCdXNNZXNzYWdlICosIERCdXNFcnJvciAqKTsKKworc3RhdGljIGNvbnN0IE1lc3NhZ2VIYW5kbGVyIGludHJvc3BlY3RhYmxlX21lc3NhZ2VfaGFuZGxlcnNbXSA9IHsKKyAgeyAiSW50cm9zcGVjdCIsICIiLCBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywgYnVzX2RyaXZlcl9oYW5kbGVfaW50cm9zcGVjdCB9LAorICB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfQorfTsKKworI2lmZGVmIERCVVNfRU5BQkxFX1NUQVRTCitzdGF0aWMgY29uc3QgTWVzc2FnZUhhbmRsZXIgc3RhdHNfbWVzc2FnZV9oYW5kbGVyc1tdID0geworICB7ICJHZXRTdGF0cyIsICIiLCAiYXtzdn0iLCBidXNfc3RhdHNfaGFuZGxlX2dldF9zdGF0cyB9LAorICB7ICJHZXRDb25uZWN0aW9uU3RhdHMiLCAicyIsICJhe3N2fSIsIGJ1c19zdGF0c19oYW5kbGVfZ2V0X2Nvbm5lY3Rpb25fc3RhdHMgfSwKKyAgeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0KK307CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBjaGFyICpuYW1lOworICBjb25zdCBNZXNzYWdlSGFuZGxlciAqbWVzc2FnZV9oYW5kbGVyczsKKyAgY29uc3QgY2hhciAqZXh0cmFfaW50cm9zcGVjdGlvbjsKK30gSW50ZXJmYWNlSGFuZGxlcjsKKworLyogVGhlc2Ugc2hvdWxkIGlkZWFsbHkgYmUgc29ydGVkIGJ5IGZyZXF1ZW5jeSBvZiB1c2UsIGFsdGhvdWdoIGl0CisgKiBwcm9iYWJseSBkb2Vzbid0IG1hdHRlciB3aXRoIHRoaXMgZmV3IGl0ZW1zICovCitzdGF0aWMgSW50ZXJmYWNlSGFuZGxlciBpbnRlcmZhY2VfaGFuZGxlcnNbXSA9IHsKKyAgeyBEQlVTX0lOVEVSRkFDRV9EQlVTLCBkYnVzX21lc3NhZ2VfaGFuZGxlcnMsCisgICAgIiAgICA8c2lnbmFsIG5hbWU9XCJOYW1lT3duZXJDaGFuZ2VkXCI+XG4iCisgICAgIiAgICAgIDxhcmcgdHlwZT1cInNcIi8+XG4iCisgICAgIiAgICAgIDxhcmcgdHlwZT1cInNcIi8+XG4iCisgICAgIiAgICAgIDxhcmcgdHlwZT1cInNcIi8+XG4iCisgICAgIiAgICA8L3NpZ25hbD5cbiIKKyAgICAiICAgIDxzaWduYWwgbmFtZT1cIk5hbWVMb3N0XCI+XG4iCisgICAgIiAgICAgIDxhcmcgdHlwZT1cInNcIi8+XG4iCisgICAgIiAgICA8L3NpZ25hbD5cbiIKKyAgICAiICAgIDxzaWduYWwgbmFtZT1cIk5hbWVBY3F1aXJlZFwiPlxuIgorICAgICIgICAgICA8YXJnIHR5cGU9XCJzXCIvPlxuIgorICAgICIgICAgPC9zaWduYWw+XG4iIH0sCisgIHsgREJVU19JTlRFUkZBQ0VfSU5UUk9TUEVDVEFCTEUsIGludHJvc3BlY3RhYmxlX21lc3NhZ2VfaGFuZGxlcnMsIE5VTEwgfSwKKyNpZmRlZiBEQlVTX0VOQUJMRV9TVEFUUworICB7IEJVU19JTlRFUkZBQ0VfU1RBVFMsIHN0YXRzX21lc3NhZ2VfaGFuZGxlcnMsIE5VTEwgfSwKKyNlbmRpZgorICB7IE5VTEwsIE5VTEwsIE5VTEwgfQorfTsKKworc3RhdGljIGRidXNfYm9vbF90Cit3cml0ZV9hcmdzX2Zvcl9kaXJlY3Rpb24gKERCdXNTdHJpbmcgKnhtbCwKKwkJCSAgY29uc3QgY2hhciAqc2lnbmF0dXJlLAorCQkJICBkYnVzX2Jvb2xfdCBpbikKK3sKKyAgREJ1c1R5cGVSZWFkZXIgdHlwZXJlYWRlcjsKKyAgREJ1c1N0cmluZyBzaWdzdHI7CisgIGludCBjdXJyZW50X3R5cGU7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzaWdzdHIsIHNpZ25hdHVyZSk7CisgIF9kYnVzX3R5cGVfcmVhZGVyX2luaXRfdHlwZXNfb25seSAoJnR5cGVyZWFkZXIsICZzaWdzdHIsIDApOworCisgIHdoaWxlICgoY3VycmVudF90eXBlID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnR5cGVyZWFkZXIpKSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICB7CisgICAgICBjb25zdCBEQnVzU3RyaW5nICpzdWJzaWc7CisgICAgICBpbnQgc3RhcnQsIGxlbjsKKworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfZ2V0X3NpZ25hdHVyZSAoJnR5cGVyZWFkZXIsICZzdWJzaWcsICZzdGFydCwgJmxlbik7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICh4bWwsICIgICAgICA8YXJnIGRpcmVjdGlvbj1cIiVzXCIgdHlwZT1cIiIsCisJCQkJICAgICAgIGluID8gImluIiA6ICJvdXQiKSkKKwlnb3RvIG9vbTsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9sZW4gKHhtbCwKKwkJCQkgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzdWJzaWcpICsgc3RhcnQsCisJCQkJICAgIGxlbikpCisJZ290byBvb207CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKHhtbCwgIlwiLz5cbiIpKQorCWdvdG8gb29tOworCisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmdHlwZXJlYWRlcik7CisgICAgfQorICByZXR1cm4gVFJVRTsKKyBvb206CisgIHJldHVybiBGQUxTRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfZ2VuZXJhdGVfaW50cm9zcGVjdF9zdHJpbmcgKERCdXNTdHJpbmcgKnhtbCkKK3sKKyAgY29uc3QgSW50ZXJmYWNlSGFuZGxlciAqaWg7CisgIGNvbnN0IE1lc3NhZ2VIYW5kbGVyICptaDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKHhtbCwgREJVU19JTlRST1NQRUNUXzFfMF9YTUxfRE9DVFlQRV9ERUNMX05PREUpKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICh4bWwsICI8bm9kZT5cbiIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBmb3IgKGloID0gaW50ZXJmYWNlX2hhbmRsZXJzOyBpaC0+bmFtZSAhPSBOVUxMOyBpaCsrKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKHhtbCwgIiAgPGludGVyZmFjZSBuYW1lPVwiJXNcIj5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaC0+bmFtZSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgZm9yIChtaCA9IGloLT5tZXNzYWdlX2hhbmRsZXJzOyBtaC0+bmFtZSAhPSBOVUxMOyBtaCsrKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoeG1sLCAiICAgIDxtZXRob2QgbmFtZT1cIiVzXCI+XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1oLT5uYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgIGlmICghd3JpdGVfYXJnc19mb3JfZGlyZWN0aW9uICh4bWwsIG1oLT5pbl9hcmdzLCBUUlVFKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgIGlmICghd3JpdGVfYXJnc19mb3JfZGlyZWN0aW9uICh4bWwsIG1oLT5vdXRfYXJncywgRkFMU0UpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICh4bWwsICIgICAgPC9tZXRob2Q+XG4iKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoaWgtPmV4dHJhX2ludHJvc3BlY3Rpb24gIT0gTlVMTCAmJgorICAgICAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICh4bWwsIGloLT5leHRyYV9pbnRyb3NwZWN0aW9uKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKHhtbCwgIiAgPC9pbnRlcmZhY2U+XG4iKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKHhtbCwgIjwvbm9kZT5cbiIpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9pbnRyb3NwZWN0IChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIHhtbDsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBjb25zdCBjaGFyICp2X1NUUklORzsKKworICBfZGJ1c192ZXJib3NlICgiSW50cm9zcGVjdCgpIG9uIGJ1cyBkcml2ZXJcbiIpOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHJlcGx5ID0gTlVMTDsKKworICBpZiAoISBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIGVycm9yLAorCQkJICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ4bWwpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghYnVzX2RyaXZlcl9nZW5lcmF0ZV9pbnRyb3NwZWN0X3N0cmluZyAoJnhtbCkpCisgICAgZ290byBvb207CisKKyAgdl9TVFJJTkcgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ4bWwpOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgaWYgKCEgZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdl9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIGdvdG8gb29tOworCisgIGlmICghIGJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIGdvdG8gb29tOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnhtbCk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIEJVU19TRVRfT09NIChlcnJvcik7CisKKyAgaWYgKHJlcGx5KQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmeG1sKTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKK2RidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9tZXNzYWdlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKwkJCSAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpuYW1lLCAqaW50ZXJmYWNlOworICBjb25zdCBJbnRlcmZhY2VIYW5kbGVyICppaDsKKyAgY29uc3QgTWVzc2FnZUhhbmRsZXIgKm1oOworICBkYnVzX2Jvb2xfdCBmb3VuZF9pbnRlcmZhY2UgPSBGQUxTRTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMS5BY3RpdmF0b3IiLCAiQWN0aXZhdGlvbkZhaWx1cmUiKSkKKyAgICB7CisgICAgICBCdXNDb250ZXh0ICpjb250ZXh0OworCisgICAgICBjb250ZXh0ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X2NvbnRleHQgKGNvbm5lY3Rpb24pOworICAgICAgcmV0dXJuIGRidXNfYWN0aXZhdGlvbl9zeXN0ZW1kX2ZhaWx1cmUoYnVzX2NvbnRleHRfZ2V0X2FjdGl2YXRpb24oY29udGV4dCksIG1lc3NhZ2UpOworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSAhPSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRHJpdmVyIGdvdCBhIG5vbi1tZXRob2QtY2FsbCBtZXNzYWdlLCBpZ25vcmluZ1xuIik7CisgICAgICByZXR1cm4gVFJVRTsgLyogd2UganVzdCBpZ25vcmUgdGhpcyAqLworICAgIH0KKworICAvKiBtYXkgYmUgTlVMTCwgd2hpY2ggbWVhbnMgImFueSBpbnRlcmZhY2Ugd2lsbCBkbyIgKi8KKyAgaW50ZXJmYWNlID0gZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpOworCisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpICE9IE5VTEwpOworCisgIG5hbWUgPSBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSk7CisKKyAgX2RidXNfdmVyYm9zZSAoIkRyaXZlciBnb3QgYSBtZXRob2QgY2FsbDogJXNcbiIsIG5hbWUpOworCisgIC8qIHNlY3VyaXR5IGNoZWNrcyBzaG91bGQgaGF2ZSBrZXB0IHRoaXMgZnJvbSBnZXR0aW5nIGhlcmUgKi8KKyNpZm5kZWYgREJVU19ESVNBQkxFX0FTU0VSVAorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnNlbmRlciA9IGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChzZW5kZXIgIT0gTlVMTCB8fCBzdHJjbXAgKG5hbWUsICJIZWxsbyIpID09IDApOworICAgIH0KKyNlbmRpZgorCisgIGZvciAoaWggPSBpbnRlcmZhY2VfaGFuZGxlcnM7IGloLT5uYW1lICE9IE5VTEw7IGloKyspCisgICAgeworICAgICAgaWYgKGludGVyZmFjZSAhPSBOVUxMICYmIHN0cmNtcCAoaW50ZXJmYWNlLCBpaC0+bmFtZSkgIT0gMCkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGZvdW5kX2ludGVyZmFjZSA9IFRSVUU7CisKKyAgICAgIGZvciAobWggPSBpaC0+bWVzc2FnZV9oYW5kbGVyczsgbWgtPm5hbWUgIT0gTlVMTDsgbWgrKykKKyAgICAgICAgeworICAgICAgICAgIGlmIChzdHJjbXAgKG1oLT5uYW1lLCBuYW1lKSAhPSAwKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRm91bmQgZHJpdmVyIGhhbmRsZXIgZm9yICVzXG4iLCBuYW1lKTsKKworICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2hhc19zaWduYXR1cmUgKG1lc3NhZ2UsIG1oLT5pbl9hcmdzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDYWxsIHRvICVzIGhhcyB3cm9uZyBhcmdzICglcywgZXhwZWN0ZWQgJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1oLT5pbl9hcmdzKTsKKworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbGwgdG8gJXMgaGFzIHdyb25nIGFyZ3MgKCVzLCBleHBlY3RlZCAlcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaC0+aW5fYXJncyk7CisgICAgICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCgqIG1oLT5oYW5kbGVyKSAoY29ubmVjdGlvbiwgdHJhbnNhY3Rpb24sIG1lc3NhZ2UsIGVycm9yKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJEcml2ZXIgaGFuZGxlciBzdWNjZWVkZWRcbiIpOworICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkRyaXZlciBoYW5kbGVyIHJldHVybmVkIGZhaWx1cmVcbiIpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIk5vIGRyaXZlciBoYW5kbGVyIGZvciBtZXNzYWdlIFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgbmFtZSk7CisKKyAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBmb3VuZF9pbnRlcmZhY2UgPyBEQlVTX0VSUk9SX1VOS05PV05fTUVUSE9EIDogREJVU19FUlJPUl9VTktOT1dOX0lOVEVSRkFDRSwKKyAgICAgICAgICAgICAgICAgICIlcyBkb2VzIG5vdCB1bmRlcnN0YW5kIG1lc3NhZ2UgJXMiLAorICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX0RCVVMsIG5hbWUpOworCisgIHJldHVybiBGQUxTRTsKK30KKwordm9pZAorYnVzX2RyaXZlcl9yZW1vdmVfY29ubmVjdGlvbiAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIC8qIEZJWE1FIDEuMCBEb2VzIG5vdGhpbmcgZm9yIG5vdywgc2hvdWxkIHVucmVnaXN0ZXIgdGhlIGNvbm5lY3Rpb24KKyAgICogd2l0aCB0aGUgYnVzIGRyaXZlci4KKyAgICovCit9CmRpZmYgLS1naXQgYS9kYnVzL2J1cy9kcml2ZXIuaCBiL2RidXMvYnVzL2RyaXZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxM2IyNzYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2J1cy9kcml2ZXIuaApAQCAtMCwwICsxLDUyIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRyaXZlci5oICBCdXMgY2xpZW50IChkcml2ZXIpCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIEJVU19EUklWRVJfSAorI2RlZmluZSBCVVNfRFJJVkVSX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKwordm9pZCAgICAgICAgYnVzX2RyaXZlcl9yZW1vdmVfY29ubmVjdGlvbiAgICAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK2RidXNfYm9vbF90IGJ1c19kcml2ZXJfaGFuZGxlX21lc3NhZ2UgICAgICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90IGJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2xvc3QgICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfYWNxdWlyZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCBidXNfZHJpdmVyX3NlbmRfc2VydmljZV9vd25lcl9jaGFuZ2VkICAoY29uc3QgY2hhciAgICAgKnNlcnZpY2VfbmFtZSwKKwkJCQkJCSAgICBjb25zdCBjaGFyICAgICAqb2xkX293bmVyLAorCQkJCQkJICAgIGNvbnN0IGNoYXIgICAgICpuZXdfb3duZXIsCisJCQkJCQkgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorCQkJCQkJICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCBidXNfZHJpdmVyX2dlbmVyYXRlX2ludHJvc3BlY3Rfc3RyaW5nICAoREJ1c1N0cmluZyAqeG1sKTsKKworCisKKyNlbmRpZiAvKiBCVVNfRFJJVkVSX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvYnVzL2V4cGlyZWxpc3QuYyBiL2RidXMvYnVzL2V4cGlyZWxpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTEyZWE0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9idXMvZXhwaXJlbGlzdC5jCkBAIC0wLDAgKzEsNDAyIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGV4cGlyZWxpc3QuYyAgTGlzdCBvZiBpdGVtcyB0aGF0IGV4cGlyZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImV4cGlyZWxpc3QuaCIKKyNpbmNsdWRlICJ0ZXN0LmgiCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWlubG9vcC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10aW1lb3V0Lmg+CisKK3N0cnVjdCBCdXNFeHBpcmVMaXN0Cit7CisgIERCdXNMaXN0ICAgICAgKml0ZW1zOyAvKio8IExpc3Qgb2YgQnVzRXhwaXJlSXRlbSAqLworICBEQnVzVGltZW91dCAgICp0aW1lb3V0OworICBEQnVzTG9vcCAgICAgICpsb29wOworICBCdXNFeHBpcmVGdW5jICBleHBpcmVfZnVuYzsKKyAgdm9pZCAgICAgICAgICAqZGF0YTsKKyAgaW50ICAgICAgICAgICAgZXhwaXJlX2FmdGVyOyAvKio8IEV4cGlyZSBhZnRlciBtaWxsaXNlY29uZHMgKHRob3VzYW5kdGhzKSAqLworfTsKKworc3RhdGljIGRidXNfYm9vbF90IGV4cGlyZV90aW1lb3V0X2hhbmRsZXIgKHZvaWQgKmRhdGEpOworCitCdXNFeHBpcmVMaXN0KgorYnVzX2V4cGlyZV9saXN0X25ldyAoREJ1c0xvb3AgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGV4cGlyZV9hZnRlciwKKyAgICAgICAgICAgICAgICAgICAgIEJ1c0V4cGlyZUZ1bmMgIGV4cGlyZV9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqZGF0YSkKK3sKKyAgQnVzRXhwaXJlTGlzdCAqbGlzdDsKKworICBsaXN0ID0gZGJ1c19uZXcwIChCdXNFeHBpcmVMaXN0LCAxKTsKKyAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBsaXN0LT5leHBpcmVfZnVuYyA9IGV4cGlyZV9mdW5jOworICBsaXN0LT5kYXRhID0gZGF0YTsKKyAgbGlzdC0+bG9vcCA9IGxvb3A7CisgIGxpc3QtPmV4cGlyZV9hZnRlciA9IGV4cGlyZV9hZnRlcjsKKworICBsaXN0LT50aW1lb3V0ID0gX2RidXNfdGltZW91dF9uZXcgKDEwMCwgLyogaXJyZWxldmFudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZV90aW1lb3V0X2hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCwgTlVMTCk7CisgIGlmIChsaXN0LT50aW1lb3V0ID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisKKyAgX2RidXNfdGltZW91dF9zZXRfZW5hYmxlZCAobGlzdC0+dGltZW91dCwgRkFMU0UpOworCisgIGlmICghX2RidXNfbG9vcF9hZGRfdGltZW91dCAobGlzdC0+bG9vcCwgbGlzdC0+dGltZW91dCkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgcmV0dXJuIGxpc3Q7CisKKyBmYWlsZWQ6CisgIGlmIChsaXN0LT50aW1lb3V0KQorICAgIF9kYnVzX3RpbWVvdXRfdW5yZWYgKGxpc3QtPnRpbWVvdXQpOworCisgIGRidXNfZnJlZSAobGlzdCk7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQKK2J1c19leHBpcmVfbGlzdF9mcmVlIChCdXNFeHBpcmVMaXN0ICpsaXN0KQoreworICBfZGJ1c19hc3NlcnQgKGxpc3QtPml0ZW1zID09IE5VTEwpOworCisgIF9kYnVzX2xvb3BfcmVtb3ZlX3RpbWVvdXQgKGxpc3QtPmxvb3AsIGxpc3QtPnRpbWVvdXQpOworCisgIF9kYnVzX3RpbWVvdXRfdW5yZWYgKGxpc3QtPnRpbWVvdXQpOworCisgIGRidXNfZnJlZSAobGlzdCk7Cit9CisKK3ZvaWQKK2J1c19leHBpcmVfdGltZW91dF9zZXRfaW50ZXJ2YWwgKERCdXNUaW1lb3V0ICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBuZXh0X2ludGVydmFsKQoreworICBpZiAobmV4dF9pbnRlcnZhbCA+PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3RpbWVvdXRfc2V0X2ludGVydmFsICh0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfaW50ZXJ2YWwpOworICAgICAgX2RidXNfdGltZW91dF9zZXRfZW5hYmxlZCAodGltZW91dCwgVFJVRSk7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJFbmFibGVkIGFuIGV4cGlyZSB0aW1lb3V0IHdpdGggaW50ZXJ2YWwgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBuZXh0X2ludGVydmFsKTsKKyAgICB9CisgIGVsc2UgaWYgKGRidXNfdGltZW91dF9nZXRfZW5hYmxlZCAodGltZW91dCkpCisgICAgeworICAgICAgX2RidXNfdGltZW91dF9zZXRfZW5hYmxlZCAodGltZW91dCwgRkFMU0UpOworCisgICAgICBfZGJ1c192ZXJib3NlICgiRGlzYWJsZWQgYW4gZXhwaXJlIHRpbWVvdXRcbiIpOworICAgIH0KKyAgZWxzZQorICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBuZWVkIHRvIGRpc2FibGUgdGhpcyBleHBpcmUgdGltZW91dFxuIik7Cit9CisKK3ZvaWQKK2J1c19leHBpcmVfbGlzdF9yZWNoZWNrX2ltbWVkaWF0ZWx5IChCdXNFeHBpcmVMaXN0ICpsaXN0KQoreworICBfZGJ1c192ZXJib3NlICgic2V0dGluZyBpbnRlcnZhbCBvbiBleHBpcmUgbGlzdCB0byAwIGZvciBpbW1lZGlhdGUgcmVjaGVja1xuIik7CisKKyAgYnVzX2V4cGlyZV90aW1lb3V0X3NldF9pbnRlcnZhbCAobGlzdC0+dGltZW91dCwgMCk7Cit9CisKK3N0YXRpYyBpbnQKK2RvX2V4cGlyYXRpb25fd2l0aF9tb25vdG9uaWNfdGltZSAoQnVzRXhwaXJlTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgdHZfc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICB0dl91c2VjKQoreworICBEQnVzTGlzdCAqbGluazsKKyAgaW50IG5leHRfaW50ZXJ2YWwsIG1pbl93YWl0X3RpbWUsIGl0ZW1zX3RvX2V4cGlyZTsKKworICBuZXh0X2ludGVydmFsID0gLTE7CisgIG1pbl93YWl0X3RpbWUgPSAzNjAwICogMTAwMDsgLyogdGhpcyBpcyByZXNldCBhbnl3YXkgaWYgdXNlZCAqLworICBpdGVtc190b19leHBpcmUgPSAwOworICAKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZsaXN0LT5pdGVtcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZsaXN0LT5pdGVtcywgbGluayk7CisgICAgICBkb3VibGUgZWxhcHNlZDsKKyAgICAgIEJ1c0V4cGlyZUl0ZW0gKml0ZW07CisKKyAgICAgIGl0ZW0gPSBsaW5rLT5kYXRhOworCisgICAgICBlbGFwc2VkID0gRUxBUFNFRF9NSUxMSVNFQ09ORFNfU0lOQ0UgKGl0ZW0tPmFkZGVkX3R2X3NlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+YWRkZWRfdHZfdXNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHZfc2VjLCB0dl91c2VjKTsKKworICAgICAgaWYgKCgoaXRlbS0+YWRkZWRfdHZfc2VjID09IDApICYmIChpdGVtLT5hZGRlZF90dl91c2VjID09IDApKSB8fAorICAgICAgICAgICgobGlzdC0+ZXhwaXJlX2FmdGVyID4gMCkgJiYgKGVsYXBzZWQgPj0gKGRvdWJsZSkgbGlzdC0+ZXhwaXJlX2FmdGVyKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRXhwaXJpbmcgYW4gaXRlbSAlcFxuIiwgaXRlbSk7CisKKyAgICAgICAgICAvKiBJZiB0aGUgZXhwaXJlIGZ1bmN0aW9uIGZhaWxzLCB3ZSBqdXN0IGVuZCB1cCBleHBpcmluZworICAgICAgICAgICAqIHRoaXMgaXRlbSBuZXh0IHRpbWUgd2Ugd2FsayB0aHJvdWdoIHRoZSBsaXN0LiBUaGlzIHdvdWxkCisgICAgICAgICAgICogYmUgYW4gaW5kZXRlcm1pbmF0ZSB0aW1lIG5vcm1hbGx5LCBzbyB3ZSBzZXQgdXAgdGhlCisgICAgICAgICAgICogbmV4dF9pbnRlcnZhbCB0byBiZSAic2hvcnRseSIgKGp1c3QgZW5vdWdoIHRvIGF2b2lkCisgICAgICAgICAgICogYSBidXN5IGxvb3ApCisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKCEoKiBsaXN0LT5leHBpcmVfZnVuYykgKGxpc3QsIGxpbmssIGxpc3QtPmRhdGEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBuZXh0X2ludGVydmFsID0gX2RidXNfZ2V0X29vbV93YWl0ICgpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAobGlzdC0+ZXhwaXJlX2FmdGVyID4gMCkKKyAgICAgICAgeworICAgICAgICAgIGRvdWJsZSB0b193YWl0OworCisgICAgICAgICAgaXRlbXNfdG9fZXhwaXJlID0gMTsKKyAgICAgICAgICB0b193YWl0ID0gKGRvdWJsZSkgbGlzdC0+ZXhwaXJlX2FmdGVyIC0gZWxhcHNlZDsKKyAgICAgICAgICBpZiAobWluX3dhaXRfdGltZSA+IHRvX3dhaXQpCisgICAgICAgICAgICBtaW5fd2FpdF90aW1lID0gdG9fd2FpdDsKKyAgICAgICAgfQorCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisKKyAgaWYgKG5leHRfaW50ZXJ2YWwgPCAwICYmIGl0ZW1zX3RvX2V4cGlyZSkKKyAgICBuZXh0X2ludGVydmFsID0gbWluX3dhaXRfdGltZTsKKworICByZXR1cm4gbmV4dF9pbnRlcnZhbDsKK30KKworc3RhdGljIHZvaWQKK2J1c19leHBpcmVsaXN0X2V4cGlyZSAoQnVzRXhwaXJlTGlzdCAqbGlzdCkKK3sKKyAgaW50IG5leHRfaW50ZXJ2YWw7CisKKyAgbmV4dF9pbnRlcnZhbCA9IC0xOworCisgIGlmIChsaXN0LT5pdGVtcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGxvbmcgdHZfc2VjLCB0dl91c2VjOworCisgICAgICBfZGJ1c19nZXRfbW9ub3RvbmljX3RpbWUgKCZ0dl9zZWMsICZ0dl91c2VjKTsKKworICAgICAgbmV4dF9pbnRlcnZhbCA9IGRvX2V4cGlyYXRpb25fd2l0aF9tb25vdG9uaWNfdGltZSAobGlzdCwgdHZfc2VjLCB0dl91c2VjKTsKKyAgICB9CisKKyAgYnVzX2V4cGlyZV90aW1lb3V0X3NldF9pbnRlcnZhbCAobGlzdC0+dGltZW91dCwgbmV4dF9pbnRlcnZhbCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZXhwaXJlX3RpbWVvdXRfaGFuZGxlciAodm9pZCAqZGF0YSkKK3sKKyAgQnVzRXhwaXJlTGlzdCAqbGlzdCA9IGRhdGE7CisKKyAgX2RidXNfdmVyYm9zZSAoIlJ1bm5pbmdcbiIpOworCisgIC8qIG5vdGUgdGhhdCB0aGlzIG1heSByZW1vdmUgdGhlIHRpbWVvdXQgKi8KKyAgYnVzX2V4cGlyZWxpc3RfZXhwaXJlIChsaXN0KTsKKworICByZXR1cm4gVFJVRTsKK30KKwordm9pZAorYnVzX2V4cGlyZV9saXN0X3JlbW92ZV9saW5rIChCdXNFeHBpcmVMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICpsaW5rKQoreworICBfZGJ1c19saXN0X3JlbW92ZV9saW5rICgmbGlzdC0+aXRlbXMsIGxpbmspOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2V4cGlyZV9saXN0X3JlbW92ZSAoQnVzRXhwaXJlTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ1c0V4cGlyZUl0ZW0gKml0ZW0pCit7CisgIHJldHVybiBfZGJ1c19saXN0X3JlbW92ZSAoJmxpc3QtPml0ZW1zLCBpdGVtKTsKK30KKwordm9pZAorYnVzX2V4cGlyZV9saXN0X3VubGluayAoQnVzRXhwaXJlTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgKmxpbmspCit7CisgIF9kYnVzX2xpc3RfdW5saW5rICgmbGlzdC0+aXRlbXMsIGxpbmspOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2V4cGlyZV9saXN0X2FkZCAoQnVzRXhwaXJlTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgIEJ1c0V4cGlyZUl0ZW0gKml0ZW0pCit7CisgIGRidXNfYm9vbF90IHJldDsKKworICByZXQgPSBfZGJ1c19saXN0X3ByZXBlbmQgKCZsaXN0LT5pdGVtcywgaXRlbSk7CisgIGlmIChyZXQgJiYgIWRidXNfdGltZW91dF9nZXRfZW5hYmxlZCAobGlzdC0+dGltZW91dCkpCisgICAgYnVzX2V4cGlyZV90aW1lb3V0X3NldF9pbnRlcnZhbCAobGlzdC0+dGltZW91dCwgMCk7CisKKyAgcmV0dXJuIHJldDsKK30KKwordm9pZAorYnVzX2V4cGlyZV9saXN0X2FkZF9saW5rIChCdXNFeHBpcmVMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICpsaW5rKQoreworICBfZGJ1c19hc3NlcnQgKGxpbmstPmRhdGEgIT0gTlVMTCk7CisgIAorICBfZGJ1c19saXN0X3ByZXBlbmRfbGluayAoJmxpc3QtPml0ZW1zLCBsaW5rKTsKKworICBpZiAoIWRidXNfdGltZW91dF9nZXRfZW5hYmxlZCAobGlzdC0+dGltZW91dCkpCisgICAgYnVzX2V4cGlyZV90aW1lb3V0X3NldF9pbnRlcnZhbCAobGlzdC0+dGltZW91dCwgMCk7Cit9CisKK0RCdXNMaXN0KgorYnVzX2V4cGlyZV9saXN0X2dldF9maXJzdF9saW5rIChCdXNFeHBpcmVMaXN0ICpsaXN0KQoreworICByZXR1cm4gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmxpc3QtPml0ZW1zKTsKK30KKworREJ1c0xpc3QqCitidXNfZXhwaXJlX2xpc3RfZ2V0X25leHRfbGluayAoQnVzRXhwaXJlTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICpsaW5rKQoreworICByZXR1cm4gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmbGlzdC0+aXRlbXMsIGxpbmspOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2V4cGlyZV9saXN0X2NvbnRhaW5zX2l0ZW0gKEJ1c0V4cGlyZUxpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzRXhwaXJlSXRlbSAqaXRlbSkKK3sKKyAgcmV0dXJuIF9kYnVzX2xpc3RfZmluZF9sYXN0ICgmbGlzdC0+aXRlbXMsIGl0ZW0pICE9IE5VTEw7Cit9CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEJ1c0V4cGlyZUl0ZW0gaXRlbTsKKyAgaW50IGV4cGlyZV9jb3VudDsKK30gVGVzdEV4cGlyZUl0ZW07CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAordGVzdF9leHBpcmVfZnVuYyAoQnVzRXhwaXJlTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgKmxpbmssCisgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpkYXRhKQoreworICBUZXN0RXhwaXJlSXRlbSAqdDsKKworICB0ID0gKFRlc3RFeHBpcmVJdGVtKikgbGluay0+ZGF0YTsKKworICB0LT5leHBpcmVfY291bnQgKz0gMTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3RpbWVfYWRkX21pbGxpc2Vjb25kcyAobG9uZyAqdHZfc2VjLAorICAgICAgICAgICAgICAgICAgICAgICBsb25nICp0dl91c2VjLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICBtaWxsaXNlY29uZHMpCit7CisgICp0dl9zZWMgPSAqdHZfc2VjICsgbWlsbGlzZWNvbmRzIC8gMTAwMDsKKyAgKnR2X3VzZWMgPSAqdHZfdXNlYyArIG1pbGxpc2Vjb25kcyAqIDEwMDA7CisgIGlmICgqdHZfdXNlYyA+PSAxMDAwMDAwKQorICAgIHsKKyAgICAgICp0dl91c2VjIC09IDEwMDAwMDA7CisgICAgICAqdHZfc2VjICs9IDE7CisgICAgfQorfQorCitkYnVzX2Jvb2xfdAorYnVzX2V4cGlyZV9saXN0X3Rlc3QgKGNvbnN0IERCdXNTdHJpbmcgKnRlc3RfZGF0YV9kaXIpCit7CisgIERCdXNMb29wICpsb29wOworICBCdXNFeHBpcmVMaXN0ICpsaXN0OworICBsb25nIHR2X3NlYywgdHZfdXNlYzsKKyAgbG9uZyB0dl9zZWNfbm90X2V4cGlyZWQsIHR2X3VzZWNfbm90X2V4cGlyZWQ7CisgIGxvbmcgdHZfc2VjX2V4cGlyZWQsIHR2X3VzZWNfZXhwaXJlZDsKKyAgbG9uZyB0dl9zZWNfcGFzdCwgdHZfdXNlY19wYXN0OworICBUZXN0RXhwaXJlSXRlbSAqaXRlbTsKKyAgaW50IG5leHRfaW50ZXJ2YWw7CisgIGRidXNfYm9vbF90IHJlc3VsdCA9IEZBTFNFOworCisKKyAgbG9vcCA9IF9kYnVzX2xvb3BfbmV3ICgpOworICBfZGJ1c19hc3NlcnQgKGxvb3AgIT0gTlVMTCk7CisKKyNkZWZpbmUgRVhQSVJFX0FGVEVSIDEwMAorICAKKyAgbGlzdCA9IGJ1c19leHBpcmVfbGlzdF9uZXcgKGxvb3AsIEVYUElSRV9BRlRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfZXhwaXJlX2Z1bmMsIE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGxpc3QgIT0gTlVMTCk7CisKKyAgX2RidXNfZ2V0X21vbm90b25pY190aW1lICgmdHZfc2VjLCAmdHZfdXNlYyk7CisKKyAgdHZfc2VjX25vdF9leHBpcmVkID0gdHZfc2VjOworICB0dl91c2VjX25vdF9leHBpcmVkID0gdHZfdXNlYzsKKyAgdGltZV9hZGRfbWlsbGlzZWNvbmRzICgmdHZfc2VjX25vdF9leHBpcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICZ0dl91c2VjX25vdF9leHBpcmVkLCBFWFBJUkVfQUZURVIgLSAxKTsKKworICB0dl9zZWNfZXhwaXJlZCA9IHR2X3NlYzsKKyAgdHZfdXNlY19leHBpcmVkID0gdHZfdXNlYzsKKyAgdGltZV9hZGRfbWlsbGlzZWNvbmRzICgmdHZfc2VjX2V4cGlyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnR2X3VzZWNfZXhwaXJlZCwgRVhQSVJFX0FGVEVSKTsKKyAgCisKKyAgdHZfc2VjX3Bhc3QgPSB0dl9zZWMgLSAxOworICB0dl91c2VjX3Bhc3QgPSB0dl91c2VjOworCisgIGl0ZW0gPSBkYnVzX25ldzAgKFRlc3RFeHBpcmVJdGVtLCAxKTsKKworICBpZiAoaXRlbSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIGl0ZW0tPml0ZW0uYWRkZWRfdHZfc2VjID0gdHZfc2VjOworICBpdGVtLT5pdGVtLmFkZGVkX3R2X3VzZWMgPSB0dl91c2VjOworICBpZiAoIWJ1c19leHBpcmVfbGlzdF9hZGQgKGxpc3QsICZpdGVtLT5pdGVtKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvdXQgb2YgbWVtb3J5Iik7CisKKyAgbmV4dF9pbnRlcnZhbCA9CisgICAgZG9fZXhwaXJhdGlvbl93aXRoX21vbm90b25pY190aW1lIChsaXN0LCB0dl9zZWNfbm90X2V4cGlyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dl91c2VjX25vdF9leHBpcmVkKTsKKyAgX2RidXNfYXNzZXJ0IChpdGVtLT5leHBpcmVfY291bnQgPT0gMCk7CisgIF9kYnVzX3ZlcmJvc2UgKCJuZXh0X2ludGVydmFsID0gJWRcbiIsIG5leHRfaW50ZXJ2YWwpOworICBfZGJ1c19hc3NlcnQgKG5leHRfaW50ZXJ2YWwgPT0gMSk7CisgIAorICBuZXh0X2ludGVydmFsID0KKyAgICBkb19leHBpcmF0aW9uX3dpdGhfbW9ub3RvbmljX3RpbWUgKGxpc3QsIHR2X3NlY19leHBpcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHZfdXNlY19leHBpcmVkKTsKKyAgX2RidXNfYXNzZXJ0IChpdGVtLT5leHBpcmVfY291bnQgPT0gMSk7CisgIF9kYnVzX3ZlcmJvc2UgKCJuZXh0X2ludGVydmFsID0gJWRcbiIsIG5leHRfaW50ZXJ2YWwpOworICBfZGJ1c19hc3NlcnQgKG5leHRfaW50ZXJ2YWwgPT0gLTEpOworCisgIG5leHRfaW50ZXJ2YWwgPQorICAgIGRvX2V4cGlyYXRpb25fd2l0aF9tb25vdG9uaWNfdGltZSAobGlzdCwgdHZfc2VjX3Bhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dl91c2VjX3Bhc3QpOworICBfZGJ1c19hc3NlcnQgKGl0ZW0tPmV4cGlyZV9jb3VudCA9PSAxKTsKKyAgX2RidXNfdmVyYm9zZSAoIm5leHRfaW50ZXJ2YWwgPSAlZFxuIiwgbmV4dF9pbnRlcnZhbCk7CisgIF9kYnVzX2Fzc2VydCAobmV4dF9pbnRlcnZhbCA9PSAxMDAwICsgRVhQSVJFX0FGVEVSKTsKKworICBidXNfZXhwaXJlX2xpc3RfcmVtb3ZlIChsaXN0LCAmaXRlbS0+aXRlbSk7CisgIGRidXNfZnJlZSAoaXRlbSk7CisgIAorICBidXNfZXhwaXJlX2xpc3RfZnJlZSAobGlzdCk7CisgIF9kYnVzX2xvb3BfdW5yZWYgKGxvb3ApOworICAKKyAgcmVzdWx0ID0gVFJVRTsKKworIG9vbToKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMvYnVzL2V4cGlyZWxpc3QuaCBiL2RidXMvYnVzL2V4cGlyZWxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODdjYjk3Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9idXMvZXhwaXJlbGlzdC5oCkBAIC0wLDAgKzEsODAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZXhwaXJlbGlzdC5oICBMaXN0IG9mIHN0dWZmIHRoYXQgZXhwaXJlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBCVVNfRVhQSVJFX0xJU1RfSAorI2RlZmluZSBCVVNfRVhQSVJFX0xJU1RfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFpbmxvb3AuaD4KKwordHlwZWRlZiBzdHJ1Y3QgQnVzRXhwaXJlTGlzdCBCdXNFeHBpcmVMaXN0OwordHlwZWRlZiBzdHJ1Y3QgQnVzRXhwaXJlSXRlbSBCdXNFeHBpcmVJdGVtOworCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIEJ1c0V4cGlyZUZ1bmMpIChCdXNFeHBpcmVMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAqbGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKmRhdGEpOworCisKKy8qIGVtYmVkIHRoaXMgaW4gYSBjaGlsZCBleHBpcmUgaXRlbSBzdHJ1Y3QgKi8KK3N0cnVjdCBCdXNFeHBpcmVJdGVtCit7CisgIGxvbmcgYWRkZWRfdHZfc2VjOyAgLyoqPCBUaW1lIHdlIHdlcmUgYWRkZWQgKHNlY29uZHMgY29tcG9uZW50KSAqLworICBsb25nIGFkZGVkX3R2X3VzZWM7IC8qKjwgVGltZSB3ZSB3ZXJlIGFkZGVkIChtaWNyb3NlYyBjb21wb25lbnQpICovCit9OworCitCdXNFeHBpcmVMaXN0KiBidXNfZXhwaXJlX2xpc3RfbmV3ICAgICAgICAgICAgICAgICAoREJ1c0xvb3AgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBleHBpcmVfYWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzRXhwaXJlRnVuYyAgZXhwaXJlX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqZGF0YSk7Cit2b2lkICAgICAgICAgICBidXNfZXhwaXJlX2xpc3RfZnJlZSAgICAgICAgICAgICAgICAoQnVzRXhwaXJlTGlzdCAqbGlzdCk7Cit2b2lkICAgICAgICAgICBidXNfZXhwaXJlX2xpc3RfcmVjaGVja19pbW1lZGlhdGVseSAoQnVzRXhwaXJlTGlzdCAqbGlzdCk7Cit2b2lkICAgICAgICAgICBidXNfZXhwaXJlX2xpc3RfcmVtb3ZlX2xpbmsgICAgICAgICAoQnVzRXhwaXJlTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICpsaW5rKTsKK2RidXNfYm9vbF90ICAgIGJ1c19leHBpcmVfbGlzdF9yZW1vdmUgICAgICAgICAgICAgIChCdXNFeHBpcmVMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c0V4cGlyZUl0ZW0gKml0ZW0pOworREJ1c0xpc3QqICAgICAgYnVzX2V4cGlyZV9saXN0X2dldF9maXJzdF9saW5rICAgICAgKEJ1c0V4cGlyZUxpc3QgKmxpc3QpOworREJ1c0xpc3QqICAgICAgYnVzX2V4cGlyZV9saXN0X2dldF9uZXh0X2xpbmsgICAgICAgKEJ1c0V4cGlyZUxpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAqbGluayk7CitkYnVzX2Jvb2xfdCAgICBidXNfZXhwaXJlX2xpc3RfYWRkICAgICAgICAgICAgICAgICAoQnVzRXhwaXJlTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNFeHBpcmVJdGVtICppdGVtKTsKK3ZvaWQgICAgICAgICAgIGJ1c19leHBpcmVfbGlzdF9hZGRfbGluayAgICAgICAgICAgIChCdXNFeHBpcmVMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgKmxpbmspOworZGJ1c19ib29sX3QgICAgYnVzX2V4cGlyZV9saXN0X2NvbnRhaW5zX2l0ZW0gICAgICAgKEJ1c0V4cGlyZUxpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzRXhwaXJlSXRlbSAqaXRlbSk7Cit2b2lkICAgICAgICAgICBidXNfZXhwaXJlX2xpc3RfdW5saW5rICAgICAgICAgICAgICAoQnVzRXhwaXJlTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICpsaW5rKTsKKworLyogdGhpcyBtYWNybyBhbmQgZnVuY3Rpb24gYXJlIHNlbWktcmVsYXRlZCB1dGlsaXR5IGZ1bmN0aW9ucywgbm90IHJlYWxseSBwYXJ0IG9mIHRoZQorICogQnVzRXhwaXJlTGlzdCBBUEkKKyAqLworCisjZGVmaW5lIEVMQVBTRURfTUlMTElTRUNPTkRTX1NJTkNFKG9yaWdfdHZfc2VjLCBvcmlnX3R2X3VzZWMsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3dfdHZfc2VjLCBub3dfdHZfdXNlYykgICAgIFwKKyAoKChkb3VibGUpIChub3dfdHZfc2VjKSAtIChkb3VibGUpIChvcmlnX3R2X3NlYykpICogMTAwMC4wICsgICBcCisgKChkb3VibGUpIChub3dfdHZfdXNlYykgLSAoZG91YmxlKSAob3JpZ190dl91c2VjKSkgLyAxMDAwLjApCisKK3ZvaWQgYnVzX2V4cGlyZV90aW1lb3V0X3NldF9pbnRlcnZhbCAoREJ1c1RpbWVvdXQgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgbmV4dF9pbnRlcnZhbCk7CisKKyNlbmRpZiAvKiBCVVNfRVhQSVJFX0xJU1RfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9idXMvbWFpbi5jIGIvZGJ1cy9idXMvbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMGJlM2MKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2J1cy9tYWluLmMKQEAgLTAsMCArMSw2NDEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogbWFpbi5jICBtYWluKCkgZm9yIG1lc3NhZ2UgYnVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJidXMuaCIKKyNpbmNsdWRlICJkcml2ZXIuaCIKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXdhdGNoLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZmRlZiBIQVZFX1NJR05BTF9ICisjaW5jbHVkZSA8c2lnbmFsLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPiAgICAgLyogZm9yIHdyaXRlKCkgYW5kIFNUREVSUl9GSUxFTk8gKi8KKyNlbmRpZgorI2luY2x1ZGUgInNlbGludXguaCIKKworc3RhdGljIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisKKyNpZmRlZiBEQlVTX1VOSVgKKworc3RhdGljIGludCByZWxvYWRfcGlwZVsyXTsKKyNkZWZpbmUgUkVMT0FEX1JFQURfRU5EIDAKKyNkZWZpbmUgUkVMT0FEX1dSSVRFX0VORCAxCisKK3N0YXRpYyB2b2lkIGNsb3NlX3JlbG9hZF9waXBlIChEQnVzV2F0Y2ggKiopOworCit0eXBlZGVmIGVudW0KKyB7CisgICBBQ1RJT05fUkVMT0FEID0gJ3InLAorICAgQUNUSU9OX1FVSVQgPSAncScKKyB9IFNpZ25hbEFjdGlvbjsKKworc3RhdGljIHZvaWQKK3NpZ25hbF9oYW5kbGVyIChpbnQgc2lnKQoreworICBzd2l0Y2ggKHNpZykKKyAgICB7CisjaWZkZWYgREJVU19CVVNfRU5BQkxFX0ROT1RJRllfT05fTElOVVgKKyAgICBjYXNlIFNJR0lPOgorICAgICAgLyogZXhwbGljaXQgZmFsbC10aHJvdWdoICovCisjZW5kaWYgLyogREJVU19CVVNfRU5BQkxFX0ROT1RJRllfT05fTElOVVggICovCisjaWZkZWYgU0lHSFVQCisgICAgY2FzZSBTSUdIVVA6CisgICAgICB7CisgICAgICAgIERCdXNTdHJpbmcgc3RyOworICAgICAgICBjaGFyIGFjdGlvblsyXSA9IHsgQUNUSU9OX1JFTE9BRCwgJ1wwJyB9OworCisgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBhY3Rpb24pOworICAgICAgICBpZiAoKHJlbG9hZF9waXBlW1JFTE9BRF9XUklURV9FTkRdID4gMCkgJiYKKyAgICAgICAgICAgICFfZGJ1c193cml0ZV9zb2NrZXQgKHJlbG9hZF9waXBlW1JFTE9BRF9XUklURV9FTkRdLCAmc3RyLCAwLCAxKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBJZiB3ZSByZWNlaXZlIFNJR0hVUCBvZnRlbiBlbm91Z2ggdG8gZmlsbCB0aGUgcGlwZSBidWZmZXIgKDQwOTYKKyAgICAgICAgICAgICAqIHRpbWVzIG9uIG9sZCBMaW51eCwgNjU1MzYgb24gbW9kZXJuIExpbnV4KSBiZWZvcmUgaXQgY2FuIGJlCisgICAgICAgICAgICAgKiBkcmFpbmVkLCBsZXQncyBqdXN0IHdhcm4gYW5kIGlnbm9yZS4gVGhlIGNvbmZpZ3VyYXRpb24gd2lsbCBiZQorICAgICAgICAgICAgICogcmVsb2FkZWQgd2hpbGUgZHJhaW5pbmcgdGhlIHBpcGUgYnVmZmVyLCB3aGljaCBpcyB3aGF0IHdlCisgICAgICAgICAgICAgKiB3YW50ZWQuIEl0J3MgaGFybWxlc3MgdGhhdCBpdCB3aWxsIGJlIHJlbG9hZGVkIGZld2VyIHRpbWVzIHRoYW4KKyAgICAgICAgICAgICAqIHdlIGFza2VkIGZvciwgc2luY2UgdGhlIHJlbG9hZCBpcyBkZWxheWVkIGFueXdheSwgc28gbmV3IGNoYW5nZXMKKyAgICAgICAgICAgICAqIHdpbGwgYmUgcGlja2VkIHVwLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFdlIHVzZSB3cml0ZSgpIGJlY2F1c2UgX2RidXNfd2FybiB1c2VzIHZmcHJpbnRmLCB3aGljaCBpc24ndAorICAgICAgICAgICAgICogYXN5bmMtc2lnbmFsLXNhZmUuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhpcyBpcyBuZWNlc3NhcmlseSBVbml4LXNwZWNpZmljLCBidXQgc28gYXJlIFBPU0lYIHNpZ25hbHMsCisgICAgICAgICAgICAgKiBzby4uLiAqLworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWVzc2FnZVtdID0KKyAgICAgICAgICAgICAgIlVuYWJsZSB0byB3cml0ZSB0byByZWxvYWQgcGlwZSAtIGJ1ZmZlciBmdWxsP1xuIjsKKworICAgICAgICAgICAgd3JpdGUgKFNUREVSUl9GSUxFTk8sIG1lc3NhZ2UsIHN0cmxlbiAobWVzc2FnZSkpOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICBjYXNlIFNJR1RFUk06CisgICAgICB7CisgICAgICAgIERCdXNTdHJpbmcgc3RyOworICAgICAgICBjaGFyIGFjdGlvblsyXSA9IHsgQUNUSU9OX1FVSVQsICdcMCcgfTsKKyAgICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIGFjdGlvbik7CisgICAgICAgIGlmICgocmVsb2FkX3BpcGVbUkVMT0FEX1dSSVRFX0VORF0gPCAwKSB8fAorICAgICAgICAgICAgIV9kYnVzX3dyaXRlX3NvY2tldCAocmVsb2FkX3BpcGVbUkVMT0FEX1dSSVRFX0VORF0sICZzdHIsIDAsIDEpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIElmIHdlIGNhbid0IHdyaXRlIHRvIHRoZSBzb2NrZXQsIGR5aW5nIHNlZW1zIGEgbW9yZQorICAgICAgICAgICAgICogaW1wb3J0YW50IHJlc3BvbnNlIHRvIFNJR1RFUk0gdGhhbiBjbGVhbmluZyB1cCBzb2NrZXRzLAorICAgICAgICAgICAgICogc28gd2UgZXhpdC4gV2UnZCB1c2UgZXhpdCgpLCBidXQgdGhhdCdzIG5vdCBhc3luYy1zaWduYWwtc2FmZSwKKyAgICAgICAgICAgICAqIHNvIHdlJ2xsIGhhdmUgdG8gcmVzb3J0IHRvIF9leGl0KCkuICovCisgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtZXNzYWdlW10gPQorICAgICAgICAgICAgICAiVW5hYmxlIHRvIHdyaXRlIHRlcm1pbmF0aW9uIHNpZ25hbCB0byBwaXBlIC0gYnVmZmVyIGZ1bGw/XG4iCisgICAgICAgICAgICAgICJXaWxsIGV4aXQgaW5zdGVhZC5cbiI7CisKKyAgICAgICAgICAgIHdyaXRlIChTVERFUlJfRklMRU5PLCBtZXNzYWdlLCBzdHJsZW4gKG1lc3NhZ2UpKTsKKyAgICAgICAgICAgIF9leGl0ICgxKTsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9Cit9CisjZW5kaWYgLyogREJVU19VTklYICovCisKK3N0YXRpYyB2b2lkCit1c2FnZSAodm9pZCkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCBEQlVTX0RBRU1PTl9OQU1FICIgWy0tdmVyc2lvbl0gWy0tc2Vzc2lvbl0gWy0tc3lzdGVtXSBbLS1jb25maWctZmlsZT1GSUxFXSBbLS1wcmludC1hZGRyZXNzWz1ERVNDUklQVE9SXV0gWy0tcHJpbnQtcGlkWz1ERVNDUklQVE9SXV0gWy0tZm9ya10gWy0tbm9mb3JrXSBbLS1pbnRyb3NwZWN0XSBbLS1hZGRyZXNzPUFERFJFU1NdIFstLXN5c3RlbWQtYWN0aXZhdGlvbl0gWy0tbm9waWRmaWxlXVxuIik7CisgIGV4aXQgKDEpOworfQorCitzdGF0aWMgdm9pZAordmVyc2lvbiAodm9pZCkKK3sKKyAgcHJpbnRmICgiRC1CdXMgTWVzc2FnZSBCdXMgRGFlbW9uICVzXG4iCisgICAgICAgICAgIkNvcHlyaWdodCAoQykgMjAwMiwgMjAwMyBSZWQgSGF0LCBJbmMuLCBDb2RlRmFjdG9yeSBBQiwgYW5kIG90aGVyc1xuIgorICAgICAgICAgICJUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuXG4iCisgICAgICAgICAgIlRoZXJlIGlzIE5PIHdhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLlxuIiwKKyAgICAgICAgICBEQlVTX1ZFUlNJT05fU1RSSU5HKTsKKyAgZXhpdCAoMCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbnRyb3NwZWN0ICh2b2lkKQoreworICBEQnVzU3RyaW5nIHhtbDsKKyAgY29uc3QgY2hhciAqdl9TVFJJTkc7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnhtbCkpCisgICAgZ290byBvb207CisKKyAgaWYgKCFidXNfZHJpdmVyX2dlbmVyYXRlX2ludHJvc3BlY3Rfc3RyaW5nICgmeG1sKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnhtbCk7CisgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgdl9TVFJJTkcgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ4bWwpOworICBwcmludGYgKCIlc1xuIiwgdl9TVFJJTkcpOworCisgIGV4aXQgKDApOworCisgb29tOgorICBfZGJ1c193YXJuICgiQ2FuIG5vdCBpbnRyb3NwZWN0IC0gT3V0IG9mIG1lbW9yeVxuIik7CisgIGV4aXQgKDEpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfdHdvX2NvbmZpZ19maWxlcyAoY29uc3QgREJ1c1N0cmluZyAqY29uZmlnX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpleHRyYV9hcmcpCit7CisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoY29uZmlnX2ZpbGUpID4gMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICItLSVzIHNwZWNpZmllZCBidXQgY29uZmlndXJhdGlvbiBmaWxlICVzIGFscmVhZHkgcmVxdWVzdGVkXG4iLAorICAgICAgICAgICAgICAgZXh0cmFfYXJnLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGNvbmZpZ19maWxlKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja190d29fYWRkcmVzc2VzIChjb25zdCBEQnVzU3RyaW5nICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqZXh0cmFfYXJnKQoreworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGFkZHJlc3MpID4gMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICItLSVzIHNwZWNpZmllZCBidXQgYWRkcmVzcyAlcyBhbHJlYWR5IHJlcXVlc3RlZFxuIiwKKyAgICAgICAgICAgICAgIGV4dHJhX2FyZywgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChhZGRyZXNzKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja190d29fYWRkcl9kZXNjcmlwdG9ycyAoY29uc3QgREJ1c1N0cmluZyAqYWRkcl9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpleHRyYV9hcmcpCit7CisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYWRkcl9mZCkgPiAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIi0tJXMgc3BlY2lmaWVkIGJ1dCBwcmludGluZyBhZGRyZXNzIHRvICVzIGFscmVhZHkgcmVxdWVzdGVkXG4iLAorICAgICAgICAgICAgICAgZXh0cmFfYXJnLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGFkZHJfZmQpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2NoZWNrX3R3b19waWRfZGVzY3JpcHRvcnMgKGNvbnN0IERCdXNTdHJpbmcgKnBpZF9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmV4dHJhX2FyZykKK3sKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChwaWRfZmQpID4gMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICItLSVzIHNwZWNpZmllZCBidXQgcHJpbnRpbmcgcGlkIHRvICVzIGFscmVhZHkgcmVxdWVzdGVkXG4iLAorICAgICAgICAgICAgICAgZXh0cmFfYXJnLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHBpZF9mZCkpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorfQorCisjaWZkZWYgREJVU19VTklYCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV9yZWxvYWRfd2F0Y2ggKERCdXNXYXRjaCAgICAqd2F0Y2gsCisJCSAgICAgdW5zaWduZWQgaW50ICBmbGFncywKKwkJICAgICB2b2lkICAgICAgICAgKmRhdGEpCit7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgREJ1c1N0cmluZyBzdHI7CisgIGNoYXIgKmFjdGlvbl9zdHI7CisgIGNoYXIgYWN0aW9uID0gJ1wwJzsKKworICB3aGlsZSAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisKKyAgaWYgKChyZWxvYWRfcGlwZVtSRUxPQURfUkVBRF9FTkRdID4gMCkgJiYKKyAgICAgIF9kYnVzX3JlYWRfc29ja2V0IChyZWxvYWRfcGlwZVtSRUxPQURfUkVBRF9FTkRdLCAmc3RyLCAxKSAhPSAxKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJDb3VsZG4ndCByZWFkIGZyb20gcmVsb2FkIHBpcGUuXG4iKTsKKyAgICAgIGNsb3NlX3JlbG9hZF9waXBlICgmd2F0Y2gpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGFjdGlvbl9zdHIgPSBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKCZzdHIpOworICBpZiAoYWN0aW9uX3N0ciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGFjdGlvbiA9IGFjdGlvbl9zdHJbMF07CisgICAgfQorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisKKyAgLyogdGhpcyBjYW4gb25seSBmYWlsIGlmIHdlIGRvbid0IHVuZGVyc3RhbmQgdGhlIGNvbmZpZyBmaWxlCisgICAqIG9yIE9PTS4gIEVpdGhlciB3YXkgd2Ugc2hvdWxkIGp1c3Qgc3RpY2sgd2l0aCB0aGUgY3VycmVudGx5CisgICAqIGxvYWRlZCBjb25maWcuCisgICAqLworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgc3dpdGNoIChhY3Rpb24pCisgICAgeworICAgIGNhc2UgQUNUSU9OX1JFTE9BRDoKKyAgICAgIGlmICghIGJ1c19jb250ZXh0X3JlbG9hZF9jb25maWcgKGNvbnRleHQsICZlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmZXJyb3IpOworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKTsKKyAgICAgICAgICBfZGJ1c193YXJuICgiVW5hYmxlIHRvIHJlbG9hZCBjb25maWd1cmF0aW9uOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBQ1RJT05fUVVJVDoKKyAgICAgIHsKKyAgICAgICAgREJ1c0xvb3AgKmxvb3A7CisgICAgICAgIC8qCisgICAgICAgICAqIE9uIE9TcyB3aXRob3V0IGFic3RyYWN0IHNvY2tldHMsIHdlIHdhbnQgdG8gcXVpdAorICAgICAgICAgKiBncmFjZWZ1bGx5IHJhdGhlciB0aGFuIGJlaW5nIGtpbGxlZCBieSBTSUdURVJNLAorICAgICAgICAgKiBzbyB0aGF0IERCdXNTZXJ2ZXIgZ2V0cyBhIGNoYW5jZSB0byBjbGVhbiB1cCB0aGUKKyAgICAgICAgICogc29ja2V0cyBmcm9tIHRoZSBmaWxlc3lzdGVtLiBmZC5vICMzODY1NgorICAgICAgICAgKi8KKyAgICAgICAgbG9vcCA9IGJ1c19jb250ZXh0X2dldF9sb29wIChjb250ZXh0KTsKKyAgICAgICAgaWYgKGxvb3AgIT0gTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c19sb29wX3F1aXQgKGxvb3ApOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3NldHVwX3JlbG9hZF9waXBlIChEQnVzTG9vcCAqbG9vcCkKK3sKKyAgREJ1c0Vycm9yIGVycm9yOworICBEQnVzV2F0Y2ggKndhdGNoOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBpZiAoIV9kYnVzX2Z1bGxfZHVwbGV4X3BpcGUgKCZyZWxvYWRfcGlwZVswXSwgJnJlbG9hZF9waXBlWzFdLAorCQkJICAgICAgIFRSVUUsICZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIlVuYWJsZSB0byBjcmVhdGUgcmVsb2FkIHBpcGU6ICVzXG4iLAorCQkgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIHdhdGNoID0gX2RidXNfd2F0Y2hfbmV3IChyZWxvYWRfcGlwZVtSRUxPQURfUkVBRF9FTkRdLAorCQkJICAgREJVU19XQVRDSF9SRUFEQUJMRSwgVFJVRSwKKwkJCSAgIGhhbmRsZV9yZWxvYWRfd2F0Y2gsIE5VTEwsIE5VTEwpOworCisgIGlmICh3YXRjaCA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJVbmFibGUgdG8gY3JlYXRlIHJlbG9hZCB3YXRjaDogJXNcbiIsCisJCSAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19sb29wX2FkZF93YXRjaCAobG9vcCwgd2F0Y2gpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJVbmFibGUgdG8gYWRkIHJlbG9hZCB3YXRjaCB0byBtYWluIGxvb3A6ICVzXG4iLAorCQkgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCit9CisKK3N0YXRpYyB2b2lkCitjbG9zZV9yZWxvYWRfcGlwZSAoREJ1c1dhdGNoICoqd2F0Y2gpCit7CisgICAgX2RidXNfbG9vcF9yZW1vdmVfd2F0Y2ggKGJ1c19jb250ZXh0X2dldF9sb29wIChjb250ZXh0KSwgKndhdGNoKTsKKyAgICBfZGJ1c193YXRjaF9pbnZhbGlkYXRlICgqd2F0Y2gpOworICAgIF9kYnVzX3dhdGNoX3VucmVmICgqd2F0Y2gpOworICAgICp3YXRjaCA9IE5VTEw7CisKKyAgICBfZGJ1c19jbG9zZV9zb2NrZXQgKHJlbG9hZF9waXBlW1JFTE9BRF9SRUFEX0VORF0sIE5VTEwpOworICAgIHJlbG9hZF9waXBlW1JFTE9BRF9SRUFEX0VORF0gPSAtMTsKKworICAgIF9kYnVzX2Nsb3NlX3NvY2tldCAocmVsb2FkX3BpcGVbUkVMT0FEX1dSSVRFX0VORF0sIE5VTEwpOworICAgIHJlbG9hZF9waXBlW1JFTE9BRF9XUklURV9FTkRdID0gLTE7Cit9CisjZW5kaWYgLyogREJVU19VTklYICovCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBEQnVzRXJyb3IgZXJyb3I7CisgIERCdXNTdHJpbmcgY29uZmlnX2ZpbGU7CisgIERCdXNTdHJpbmcgYWRkcmVzczsKKyAgREJ1c1N0cmluZyBhZGRyX2ZkOworICBEQnVzU3RyaW5nIHBpZF9mZDsKKyAgY29uc3QgY2hhciAqcHJldl9hcmc7CisgIERCdXNQaXBlIHByaW50X2FkZHJfcGlwZTsKKyAgREJ1c1BpcGUgcHJpbnRfcGlkX3BpcGU7CisgIGludCBpOworICBkYnVzX2Jvb2xfdCBwcmludF9hZGRyZXNzOworICBkYnVzX2Jvb2xfdCBwcmludF9waWQ7CisgIEJ1c0NvbnRleHRGbGFncyBmbGFnczsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmY29uZmlnX2ZpbGUpKQorICAgIHJldHVybiAxOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhZGRyZXNzKSkKKyAgICByZXR1cm4gMTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYWRkcl9mZCkpCisgICAgcmV0dXJuIDE7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnBpZF9mZCkpCisgICAgcmV0dXJuIDE7CisKKyAgcHJpbnRfYWRkcmVzcyA9IEZBTFNFOworICBwcmludF9waWQgPSBGQUxTRTsKKworICBmbGFncyA9IEJVU19DT05URVhUX0ZMQUdfV1JJVEVfUElEX0ZJTEU7CisKKyAgcHJldl9hcmcgPSBOVUxMOworICBpID0gMTsKKyAgd2hpbGUgKGkgPCBhcmdjKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKyAgICAgIGlmIChzdHJjbXAgKGFyZywgIi0taGVscCIpID09IDAgfHwKKyAgICAgICAgICBzdHJjbXAgKGFyZywgIi1oIikgPT0gMCB8fAorICAgICAgICAgIHN0cmNtcCAoYXJnLCAiLT8iKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgdXNhZ2UgKCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS12ZXJzaW9uIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHZlcnNpb24gKCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1pbnRyb3NwZWN0IikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGludHJvc3BlY3QgKCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1ub2ZvcmsiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgZmxhZ3MgJj0gfkJVU19DT05URVhUX0ZMQUdfRk9SS19BTFdBWVM7CisgICAgICAgICAgZmxhZ3MgfD0gQlVTX0NPTlRFWFRfRkxBR19GT1JLX05FVkVSOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tZm9yayIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBmbGFncyAmPSB+QlVTX0NPTlRFWFRfRkxBR19GT1JLX05FVkVSOworICAgICAgICAgIGZsYWdzIHw9IEJVU19DT05URVhUX0ZMQUdfRk9SS19BTFdBWVM7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1ub3BpZGZpbGUiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgZmxhZ3MgJj0gfkJVU19DT05URVhUX0ZMQUdfV1JJVEVfUElEX0ZJTEU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1zeXN0ZW1kLWFjdGl2YXRpb24iKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgZmxhZ3MgfD0gQlVTX0NPTlRFWFRfRkxBR19TWVNURU1EX0FDVElWQVRJT047CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1zeXN0ZW0iKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgY2hlY2tfdHdvX2NvbmZpZ19maWxlcyAoJmNvbmZpZ19maWxlLCAic3lzdGVtIik7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX2FwcGVuZF9zeXN0ZW1fY29uZmlnX2ZpbGUgKCZjb25maWdfZmlsZSkpCisgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLXNlc3Npb24iKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgY2hlY2tfdHdvX2NvbmZpZ19maWxlcyAoJmNvbmZpZ19maWxlLCAic2Vzc2lvbiIpOworCisgICAgICAgICAgaWYgKCFfZGJ1c19hcHBlbmRfc2Vzc2lvbl9jb25maWdfZmlsZSAoJmNvbmZpZ19maWxlKSkKKyAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJzdHIgKGFyZywgIi0tY29uZmlnLWZpbGU9IikgPT0gYXJnKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgY2hhciAqZmlsZTsKKworICAgICAgICAgIGNoZWNrX3R3b19jb25maWdfZmlsZXMgKCZjb25maWdfZmlsZSwgImNvbmZpZy1maWxlIik7CisKKyAgICAgICAgICBmaWxlID0gc3RyY2hyIChhcmcsICc9Jyk7CisgICAgICAgICAgKytmaWxlOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmY29uZmlnX2ZpbGUsIGZpbGUpKQorICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHByZXZfYXJnICYmCisgICAgICAgICAgICAgICBzdHJjbXAgKHByZXZfYXJnLCAiLS1jb25maWctZmlsZSIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBjaGVja190d29fY29uZmlnX2ZpbGVzICgmY29uZmlnX2ZpbGUsICJjb25maWctZmlsZSIpOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmY29uZmlnX2ZpbGUsIGFyZykpCisgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLWNvbmZpZy1maWxlIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIC8qIHdhaXQgZm9yIG5leHQgYXJnICovCisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cnN0ciAoYXJnLCAiLS1hZGRyZXNzPSIpID09IGFyZykKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGU7CisKKyAgICAgICAgICBjaGVja190d29fYWRkcmVzc2VzICgmYWRkcmVzcywgImFkZHJlc3MiKTsKKworICAgICAgICAgIGZpbGUgPSBzdHJjaHIgKGFyZywgJz0nKTsKKyAgICAgICAgICArK2ZpbGU7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCBmaWxlKSkKKyAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChwcmV2X2FyZyAmJgorICAgICAgICAgICAgICAgc3RyY21wIChwcmV2X2FyZywgIi0tYWRkcmVzcyIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBjaGVja190d29fYWRkcmVzc2VzICgmYWRkcmVzcywgImFkZHJlc3MiKTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsIGFyZykpCisgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLWFkZHJlc3MiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgLyogd2FpdCBmb3IgbmV4dCBhcmcgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3Ryc3RyIChhcmcsICItLXByaW50LWFkZHJlc3M9IikgPT0gYXJnKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgY2hhciAqZGVzYzsKKworICAgICAgICAgIGNoZWNrX3R3b19hZGRyX2Rlc2NyaXB0b3JzICgmYWRkcl9mZCwgInByaW50LWFkZHJlc3MiKTsKKworICAgICAgICAgIGRlc2MgPSBzdHJjaHIgKGFyZywgJz0nKTsKKyAgICAgICAgICArK2Rlc2M7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyX2ZkLCBkZXNjKSkKKyAgICAgICAgICAgIGV4aXQgKDEpOworCisgICAgICAgICAgcHJpbnRfYWRkcmVzcyA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHByZXZfYXJnICYmCisgICAgICAgICAgICAgICBzdHJjbXAgKHByZXZfYXJnLCAiLS1wcmludC1hZGRyZXNzIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGNoZWNrX3R3b19hZGRyX2Rlc2NyaXB0b3JzICgmYWRkcl9mZCwgInByaW50LWFkZHJlc3MiKTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJfZmQsIGFyZykpCisgICAgICAgICAgICBleGl0ICgxKTsKKworICAgICAgICAgIHByaW50X2FkZHJlc3MgPSBUUlVFOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tcHJpbnQtYWRkcmVzcyIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBwcmludF9hZGRyZXNzID0gVFJVRTsgLyogYW5kIHdlJ2xsIGdldCB0aGUgbmV4dCBhcmcgaWYgYXBwcm9wcmlhdGUgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3Ryc3RyIChhcmcsICItLXByaW50LXBpZD0iKSA9PSBhcmcpCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBjaGFyICpkZXNjOworCisgICAgICAgICAgY2hlY2tfdHdvX3BpZF9kZXNjcmlwdG9ycyAoJnBpZF9mZCwgInByaW50LXBpZCIpOworCisgICAgICAgICAgZGVzYyA9IHN0cmNociAoYXJnLCAnPScpOworICAgICAgICAgICsrZGVzYzsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnBpZF9mZCwgZGVzYykpCisgICAgICAgICAgICBleGl0ICgxKTsKKworICAgICAgICAgIHByaW50X3BpZCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHByZXZfYXJnICYmCisgICAgICAgICAgICAgICBzdHJjbXAgKHByZXZfYXJnLCAiLS1wcmludC1waWQiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgY2hlY2tfdHdvX3BpZF9kZXNjcmlwdG9ycyAoJnBpZF9mZCwgInByaW50LXBpZCIpOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmcGlkX2ZkLCBhcmcpKQorICAgICAgICAgICAgZXhpdCAoMSk7CisKKyAgICAgICAgICBwcmludF9waWQgPSBUUlVFOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tcHJpbnQtcGlkIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50X3BpZCA9IFRSVUU7IC8qIGFuZCB3ZSdsbCBnZXQgdGhlIG5leHQgYXJnIGlmIGFwcHJvcHJpYXRlICovCisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHVzYWdlICgpOworICAgICAgICB9CisKKyAgICAgIHByZXZfYXJnID0gYXJnOworCisgICAgICArK2k7CisgICAgfQorCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmNvbmZpZ19maWxlKSA9PSAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIk5vIGNvbmZpZ3VyYXRpb24gZmlsZSBzcGVjaWZpZWQuXG4iKTsKKyAgICAgIHVzYWdlICgpOworICAgIH0KKworICBfZGJ1c19waXBlX2ludmFsaWRhdGUgKCZwcmludF9hZGRyX3BpcGUpOworICBpZiAocHJpbnRfYWRkcmVzcykKKyAgICB7CisgICAgICBfZGJ1c19waXBlX2luaXRfc3Rkb3V0ICgmcHJpbnRfYWRkcl9waXBlKTsKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmFkZHJfZmQpID4gMCkKKyAgICAgICAgeworICAgICAgICAgIGxvbmcgdmFsOworICAgICAgICAgIGludCBlbmQ7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfcGFyc2VfaW50ICgmYWRkcl9mZCwgMCwgJnZhbCwgJmVuZCkgfHwKKyAgICAgICAgICAgICAgZW5kICE9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYWRkcl9mZCkgfHwKKyAgICAgICAgICAgICAgdmFsIDwgMCB8fCB2YWwgPiBfREJVU19JTlRfTUFYKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJJbnZhbGlkIGZpbGUgZGVzY3JpcHRvcjogXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZhZGRyX2ZkKSk7CisgICAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgX2RidXNfcGlwZV9pbml0ICgmcHJpbnRfYWRkcl9waXBlLCB2YWwpOworICAgICAgICB9CisgICAgfQorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJfZmQpOworCisgIF9kYnVzX3BpcGVfaW52YWxpZGF0ZSAoJnByaW50X3BpZF9waXBlKTsKKyAgaWYgKHByaW50X3BpZCkKKyAgICB7CisgICAgICBfZGJ1c19waXBlX2luaXRfc3Rkb3V0ICgmcHJpbnRfcGlkX3BpcGUpOworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmcGlkX2ZkKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBsb25nIHZhbDsKKyAgICAgICAgICBpbnQgZW5kOworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX3BhcnNlX2ludCAoJnBpZF9mZCwgMCwgJnZhbCwgJmVuZCkgfHwKKyAgICAgICAgICAgICAgZW5kICE9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmcGlkX2ZkKSB8fAorICAgICAgICAgICAgICB2YWwgPCAwIHx8IHZhbCA+IF9EQlVTX0lOVF9NQVgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkludmFsaWQgZmlsZSBkZXNjcmlwdG9yOiBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnBpZF9mZCkpOworICAgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIF9kYnVzX3BpcGVfaW5pdCAoJnByaW50X3BpZF9waXBlLCB2YWwpOworICAgICAgICB9CisgICAgfQorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBpZF9mZCk7CisKKyAgaWYgKCFidXNfc2VsaW51eF9wcmVfaW5pdCAoKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiU0VMaW51eCBwcmUtaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIGNvbnRleHQgPSBidXNfY29udGV4dF9uZXcgKCZjb25maWdfZmlsZSwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmludF9hZGRyX3BpcGUsICZwcmludF9waWRfcGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGgoJmFkZHJlc3MpID4gMCA/ICZhZGRyZXNzIDogTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb25maWdfZmlsZSk7CisgIGlmIChjb250ZXh0ID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byBzdGFydCBtZXNzYWdlIGJ1czogJXNcbiIsCisgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICAvKiBidXNfY29udGV4dF9uZXcoKSBjbG9zZXMgdGhlIHByaW50X2FkZHJfcGlwZSBhbmQKKyAgICogcHJpbnRfcGlkX3BpcGUKKyAgICovCisKKyNpZmRlZiBEQlVTX1VOSVgKKyAgc2V0dXBfcmVsb2FkX3BpcGUgKGJ1c19jb250ZXh0X2dldF9sb29wIChjb250ZXh0KSk7CisKKyAgLyogUE9TSVggc2lnbmFscyBhcmUgVW5peC1zcGVjaWZpYywgYW5kIF9kYnVzX3NldF9zaWduYWxfaGFuZGxlciBpcworICAgKiB1bmltcGxlbWVudGVkIChhbmQgcHJvYmFibHkgdW5pbXBsZW1lbnRhYmxlKSBvbiBXaW5kb3dzLCBzbyB0aGVyZSdzCisgICAqIG5vIHBvaW50IGluIHRyeWluZyB0byBtYWtlIHRoZSBoYW5kbGVyIHBvcnRhYmxlIHRvIG5vbi1Vbml4LiAqLworCisgIF9kYnVzX3NldF9zaWduYWxfaGFuZGxlciAoU0lHVEVSTSwgc2lnbmFsX2hhbmRsZXIpOworI2lmZGVmIFNJR0hVUAorICBfZGJ1c19zZXRfc2lnbmFsX2hhbmRsZXIgKFNJR0hVUCwgc2lnbmFsX2hhbmRsZXIpOworI2VuZGlmCisjaWZkZWYgREJVU19CVVNfRU5BQkxFX0ROT1RJRllfT05fTElOVVgKKyAgX2RidXNfc2V0X3NpZ25hbF9oYW5kbGVyIChTSUdJTywgc2lnbmFsX2hhbmRsZXIpOworI2VuZGlmIC8qIERCVVNfQlVTX0VOQUJMRV9ETk9USUZZX09OX0xJTlVYICovCisjZW5kaWYgLyogREJVU19VTklYICovCisKKyAgX2RidXNfdmVyYm9zZSAoIldlIGFyZSBvbiBELUJ1cy4uLlxuIik7CisgIF9kYnVzX2xvb3BfcnVuIChidXNfY29udGV4dF9nZXRfbG9vcCAoY29udGV4dCkpOworCisgIGJ1c19jb250ZXh0X3NodXRkb3duIChjb250ZXh0KTsKKyAgYnVzX2NvbnRleHRfdW5yZWYgKGNvbnRleHQpOworICBidXNfc2VsaW51eF9zaHV0ZG93biAoKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RidXMvYnVzL21lc3NhZ2VidXMtY29uZmlnLmluIGIvZGJ1cy9idXMvbWVzc2FnZWJ1cy1jb25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk0NTlkYwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvYnVzL21lc3NhZ2VidXMtY29uZmlnLmluCkBAIC0wLDAgKzEsMTc4IEBACisjIS9iaW4vc2gKKyMKKyMgbWVzc2FnZWJ1cy1jb25maWcsIENvcHlyaWdodCAyMDA5IFlhYWtvdiBTZWxrb3dpdHoKKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEN5Z3dpbiBwb3J0IG9mIGRidXMuCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBJbml0aWFsaXphdGlvbgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitQUk9HTkFNRT0kKGJhc2VuYW1lICQwKQorX3RkaXI9JChkaXJuYW1lICQwKQorUFJPR0RJUj0kKGNkICRfdGRpciAmJiBwd2QpCisKK0NTSUhfU0NSSVBUPS91c3Ivc2hhcmUvY3NpaC9jeWd3aW4tc2VydmljZS1pbnN0YWxsYXRpb24taGVscGVyLnNoCisKKyMgU3ViZGlyZWN0b3J5IHdoZXJlIHRoZSBuZXcgcGFja2FnZSBpcyBiZWluZyBpbnN0YWxsZWQKK1BSRUZJWD1AcHJlZml4QAorCisjIERpcmVjdG9yeSB3aGVyZSB0aGUgY29uZmlnIGZpbGVzIGFyZSBzdG9yZWQKK1NZU0NPTkZESVI9QHN5c2NvbmZkaXJAL2RidXMtMQorREVWRElSPS9kZXYKK0xPR0RJUj0vdmFyL2xvZworUlVORElSPSQoZGlybmFtZSBAREJVU19TWVNURU1fUElEX0ZJTEVAKQorU09DS0RJUj0kKGRpcm5hbWUgQERCVVNfU1lTVEVNX1NPQ0tFVEApCisKK3NvdXJjZSAke0NTSUhfU0NSSVBUfQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgUm91dGluZTogaW5zdGFsbF9zZXJ2aWNlCisjICAgSW5zdGFsbCBtZXNzYWdlYnVzIGFzIGEgc2VydmljZQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitpbnN0YWxsX3NlcnZpY2UoKSB7CisKKyAgaWYgY3NpaF9pc19udAorICB0aGVuCisKKyAgICAjIENoZWNrIGlmIG1lc3NhZ2VidXMgaXMgaW5zdGFsbGVkIGFuZCByZW1vdmUgb24gdXNlciByZXF1ZXN0LgorICAgIGlmIGN5Z3J1bnNydiAtUSBtZXNzYWdlYnVzID4gL2Rldi9udWxsIDI+JjEKKyAgICB0aGVuCisgICAgICBjc2loX3dhcm5pbmcgIlRoZSBtZXNzYWdlYnVzIHNlcnZpY2UgaXMgYWxyZWFkeSBpbnN0YWxsZWQuIgorICAgICAgZWNobworICAgICAgaWYgY3NpaF9yZXF1ZXN0ICJEbyB5b3Ugd2FudCB0byByZWluc3RhbGwgaXQgd2l0aCBkaWZmZXJlbnQgYXJncz8iCisgICAgICB0aGVuCisgICAgICAgIGN5Z3J1bnNydiAtRSBtZXNzYWdlYnVzCisgICAgICAgIGN5Z3J1bnNydiAtUiBtZXNzYWdlYnVzCisgICAgICBmaQorICAgIGZpCisKKyAgICAjIEluc3RhbGwgbWVzc2FnZWJ1cyBzZXJ2aWNlIGlmIGl0IGlzIG5vdCBhbHJlYWR5IGluc3RhbGxlZAorICAgIGlmICEgY3lncnVuc3J2IC1RIG1lc3NhZ2VidXMgPiAvZGV2L251bGwgMj4mMQorICAgIHRoZW4KKyAgICAgIGVjaG8KKyAgICAgIGNzaWhfd2FybmluZyAiVGhlIGZvbGxvd2luZyBmdW5jdGlvbiByZXF1aXJlcyBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMhIgorICAgICAgaWYgY3NpaF9yZXF1ZXN0ICJEbyB5b3Ugd2FudCB0byBpbnN0YWxsIG1lc3NhZ2VidXMgYXMgc2VydmljZT8iCisgICAgICB0aGVuCisgICAgICAgIGlmIGN5Z3J1bnNydiAtSSBtZXNzYWdlYnVzIC1kICJDWUdXSU4gRC1CdXMgc3lzdGVtIHNlcnZpY2UiIC1wIEBFWFBBTkRFRF9CSU5ESVJAL2RidXMtZGFlbW9uIC1hICItLW5vZm9yayAtLXN5c3RlbSIKKyAgICAgICAgdGhlbgorCSAgZWNobworCSAgY3NpaF9pbmZvcm0gIlRoZSBtZXNzYWdlYnVzIHNlcnZpY2UgaGFzIGJlZW4gaW5zdGFsbGVkIHVuZGVyIHRoZSBMb2NhbFN5c3RlbSIKKwkgIGNzaWhfaW5mb3JtICJhY2NvdW50IChhbHNvIGtub3duIGFzIFNZU1RFTSkuIFRvIHN0YXJ0IHRoZSBzZXJ2aWNlIG5vdywgY2FsbCIKKyAgICAgICAgICBjc2loX2luZm9ybSAiXGBuZXQgc3RhcnQgbWVzc2FnZWJ1cycgb3IgXGBjeWdydW5zcnYgLVMgbWVzc2FnZWJ1cycuIE90aGVyd2lzZSwgaXQiCisgICAgICAgICAgY3NpaF9pbmZvcm0gIndpbGwgc3RhcnQgYXV0b21hdGljYWxseSBhZnRlciB0aGUgbmV4dCByZWJvb3QuIgorCSAgZWNobworCSAgY3NpaF9pbmZvcm0gIkNoZWNrICR7U1lTQ09ORkRJUn0vc3lzdGVtLmNvbmYgZmlyc3QsIGlmIGl0IHN1aXRzIHlvdXIgbmVlZHMuIgorICAgICAgICBmaQorICAgICAgZmkgIyB1c2VyIGFsbG93ZWQgdXMgdG8gaW5zdGFsbCBtZXNzYWdlYnVzCisgICAgZmkgIyBtZXNzYWdlYnVzIGFscmVhZHkgaW5zdGFsbGVkCisgIGZpICMgY3NpaF9pc19udAorfSAjIC0tLSBFbmQgb2YgaW5zdGFsbF9zZXJ2aWNlIC0tLSAjCisKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIE1haW4gRW50cnkgUG9pbnQKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKyMgQ2hlY2sgaG93IHRoZSBzY3JpcHQgaGFzIGJlZW4gc3RhcnRlZC4gIElmCisjICAgKDEpIGl0IGhhcyBiZWVuIHN0YXJ0ZWQgYnkgZ2l2aW5nIHRoZSBmdWxsIHBhdGggYW5kCisjICAgICAgIHRoYXQgcGF0aCBpcyAvZXRjL3Bvc3RpbnN0YWxsLCBPUgorIyAgICgyKSBPdGhlcndpc2UsIGlmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorIyAgICAgICBDT05GSUdfQVVUT19BTlNXRVJfTk8gaXMgc2V0CisjIHRoZW4gc2V0IGF1dG9fYW5zd2VyIHRvICJubyIuICBUaGlzIGFsbG93cyBhdXRvbWF0aWMKKyMgY3JlYXRpb24gb2YgdGhlIGNvbmZpZyBmaWxlcyBpbiAvZXRjIHcvbyBvdmVyd3JpdGluZworIyB0aGVtIGlmIHRoZXkgYWxyZWFkeSBleGlzdC4gIEluIGJvdGggY2FzZXMsIGNvbG9yCisjIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIHN1cHByZXNzZWQsIHNvIGFzIHRvIHByZXZlbnQKKyMgY2x1dHRlcmluZyBzZXR1cCdzIGxvZ2ZpbGVzLgoraWYgWyAiJFBST0dESVIiID0gIi9ldGMvcG9zdGluc3RhbGwiIF0KK3RoZW4KKyAgY3NpaF9hdXRvX2Fuc3dlcj0ibm8iCisgIGNzaWhfZGlzYWJsZV9jb2xvcgorZmkKK2lmIFsgLW4gIiR7Q09ORklHX0FVVE9fQU5TV0VSX05PfSIgXQordGhlbgorICBjc2loX2F1dG9fYW5zd2VyPSJubyIKKyAgY3NpaF9kaXNhYmxlX2NvbG9yCitmaQorCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBQYXJzZSBvcHRpb25zCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3doaWxlIDoKK2RvCisgIGNhc2UgJCMgaW4KKyAgMCkKKyAgICBicmVhaworICAgIDs7CisgIGVzYWMKKworICBvcHRpb249JDEKKyAgc2hpZnQKKworICBjYXNlICIkb3B0aW9uIiBpbgorICAtZCB8IC0tZGVidWcgKQorICAgIHNldCAteAorICAgIGNzaWhfdHJhY2Vfb24KKyAgICA7OworCisgIC15IHwgLS15ZXMgKQorICAgIGNzaWhfYXV0b19hbnN3ZXI9eWVzCisgICAgOzsKKworICAtbiB8IC0tbm8gKQorICAgIGNzaWhfYXV0b19hbnN3ZXI9bm8KKyAgICA7OworCisgICopCisgICAgZWNobyAidXNhZ2U6ICR7UFJPR05BTUV9IFtPUFRJT05dLi4uIgorICAgIGVjaG8KKyAgICBlY2hvICJUaGlzIHNjcmlwdCBjcmVhdGVzIGEgYmFzaWMgbWVzc2FnZWJ1cyBjb25maWd1cmF0aW9uLiIKKyAgICBlY2hvCisgICAgZWNobyAiT3B0aW9uczoiCisgICAgZWNobyAiICAgIC0tZGVidWcgIC1kICAgICBFbmFibGUgc2hlbGwncyBkZWJ1ZyBvdXRwdXQuIgorICAgIGVjaG8gIiAgICAtLXllcyAgICAteSAgICAgQW5zd2VyIGFsbCBxdWVzdGlvbnMgd2l0aCBcInllc1wiIGF1dG9tYXRpY2FsbHkuIgorICAgIGVjaG8gIiAgICAtLW5vICAgICAtbiAgICAgQW5zd2VyIGFsbCBxdWVzdGlvbnMgd2l0aCBcIm5vXCIgYXV0b21hdGljYWxseS4iCisgICAgZWNobworICAgIGV4aXQgMQorICAgIDs7CisKKyAgZXNhYworZG9uZQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQWN0aW9uIQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgQ2hlY2sgZm9yICR7U1lTQ09ORkRJUn0gZGlyZWN0b3J5Citjc2loX21ha2VfZGlyICIke1NZU0NPTkZESVJ9IiAiQ2Fubm90IGNyZWF0ZSBnbG9iYWwgY29uZmlndXJhdGlvbiBmaWxlcy4iCitjaG1vZCA3NzUgIiR7U1lTQ09ORkRJUn0iCitzZXRmYWNsIC1tIHU6c3lzdGVtOnJ3eCAiJHtTWVNDT05GRElSfSIKKworIyBDaGVjayBmb3IgJHtERVZESVJ9IGRpcmVjdG9yeQorY3NpaF9tYWtlX2RpciAiJHtERVZESVJ9IiAiU3lzbG9nZ2luZyB1c2luZyBtZXNzYWdlYnVzIHdpbGwgbm90IHdvcmsuIgorY2htb2QgNzc1ICIke0RFVkRJUn0iCitzZXRmYWNsIC1tIHU6c3lzdGVtOnJ3eCAiJHtERVZESVJ9IgorCisjIENoZWNrIGZvciAke0xPR0RJUn0gZGlyZWN0b3J5Citjc2loX21ha2VfZGlyICIke0xPR0RJUn0iICJTeXNsb2dnaW5nIHVzaW5nIG1lc3NhZ2VidXMgd2lsbCBub3Qgd29yay4iCitjaG1vZCA3NzUgIiR7TE9HRElSfSIKK3NldGZhY2wgLW0gdTpzeXN0ZW06cnd4ICIke0xPR0RJUn0iCisKKyMgQ2hlY2sgZm9yICR7UlVORElSfSBkaXJlY3RvcnkKK2NzaWhfbWFrZV9kaXIgIiR7UlVORElSfSIgIlBJRCBmaWxlcyBvZiBydW5uaW5nIHByb2Nlc3NlcyB3aWxsIG5vdCBiZSBjcmVhdGVkLiIKK2NobW9kIDc3NSAiJHtSVU5ESVJ9Igorc2V0ZmFjbCAtbSB1OnN5c3RlbTpyd3ggIiR7UlVORElSfSIKKworIyBDaGVjayBmb3IgJHtTT0NLRElSfSBkaXJlY3RvcnkKK2NzaWhfbWFrZV9kaXIgIiR7U09DS0RJUn0iICJTT0NLRVQgZmlsZXMgb2YgcnVubmluZyBwcm9jZXNzZXMgd2lsbCBub3QgYmUgY3JlYXRlZC4iCitjaG1vZCA3NzUgIiR7U09DS0RJUn0iCitzZXRmYWNsIC1tIHU6c3lzdGVtOnJ3eCAiJHtTT0NLRElSfSIKKworIyBtYXliZTogY3NpaF9hdXRvX2Fuc3dlcj1ubyB3aWxsIHNraXAsCisjIGludGVyYWN0aXZlIHVzZXIgd2lsbCBnZXQgYSBjaGFuY2UgdG8gb3ZlcnJpZGUKK2luc3RhbGxfc2VydmljZQorCisKK2VjaG8KK2VjaG8gIkNvbmZpZ3VyYXRpb24gZmluaXNoZWQuIEhhdmUgZnVuISIKZGlmZiAtLWdpdCBhL2RidXMvYnVzL21lc3NhZ2VidXMuaW4gYi9kYnVzL2J1cy9tZXNzYWdlYnVzLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMmVlMDcKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2J1cy9tZXNzYWdlYnVzLmluCkBAIC0wLDAgKzEsOTIgQEAKKyMhL2Jpbi9zaAorIworIyBtZXNzYWdlYnVzOiAgIFRoZSBELUJVUyBzeXN0ZW13aWRlIG1lc3NhZ2UgYnVzCisjCisjIGNoa2NvbmZpZzogMzQ1IDIyIDg1CisjIGRlc2NyaXB0aW9uOiAgVGhpcyBpcyBhIGRhZW1vbiB3aGljaCBicm9hZGNhc3RzIG5vdGlmaWNhdGlvbnMgb2Ygc3lzdGVtIGV2ZW50cyBcCisjICAgICAgICAgICAgICAgYW5kIG90aGVyIG1lc3NhZ2VzLiBTZWUgaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8KKyMKKyMgcHJvY2Vzc25hbWU6IGRidXMtZGFlbW9uCisjIHBpZGZpbGU6IEBEQlVTX1NZU1RFTV9QSURfRklMRUAKKyMKKyMjIyBCRUdJTiBJTklUIElORk8KKyMgUHJvdmlkZXM6IG1lc3NhZ2VidXMKKyMgUmVxdWlyZWQtU3RhcnQ6ICRzeXNsb2cgJGxvY2FsX2ZzCisjIFJlcXVpcmVkLVN0b3A6ICRzeXNsb2cgJGxvY2FsX2ZzCisjIERlZmF1bHQtU3RhcnQ6IDIgMyA0IDUKKyMgRGVmYXVsdC1TdG9wOiAwIDEgNgorIyBTaG9ydC1EZXNjcmlwdGlvbjogVGhlIEQtQnVzIHN5c3RlbXdpZGUgbWVzc2FnZSBidXMKKyMgRGVzY3JpcHRpb246IFRoaXMgaXMgYSBkYWVtb24gd2hpY2ggYnJvYWRjYXN0cyBub3RpZmljYXRpb25zIG9mIHN5c3RlbSAKKyMgIGV2ZW50cyBhbmQgb3RoZXIgbWVzc2FnZXMuIFNlZSBodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzCisjIyMgRU5EIElOSVQgSU5GTworCisjIFNhbml0eSBjaGVja3MuCitbIC14IEBFWFBBTkRFRF9CSU5ESVJAL2RidXMtZGFlbW9uIF0gfHwgZXhpdCAwCisKKyMgU291cmNlIGZ1bmN0aW9uIGxpYnJhcnkuCisuIEBFWFBBTkRFRF9TWVNDT05GRElSQC9yYy5kL2luaXQuZC9mdW5jdGlvbnMKKworIyBzbyB3ZSBjYW4gcmVhcnJhbmdlIHRoaXMgZWFzaWx5Citwcm9jZXNzbmFtZT1kYnVzLWRhZW1vbgorc2VydmljZW5hbWU9bWVzc2FnZWJ1cworCitSRVRWQUw9MAorCitzdGFydCgpIHsKKyAgICBlY2hvIC1uICQiU3RhcnRpbmcgc3lzdGVtIG1lc3NhZ2UgYnVzOiAiCisgICAgaWYgWyAteCBARVhQQU5ERURfQklORElSQC9kYnVzLXV1aWRnZW4gXSA7IHRoZW4KKyAgICAgICAgQEVYUEFOREVEX0JJTkRJUkAvZGJ1cy11dWlkZ2VuIC0tZW5zdXJlCisgICAgZmkKKworICAgIGRhZW1vbiAtLWNoZWNrICRzZXJ2aWNlbmFtZSAkcHJvY2Vzc25hbWUgLS1zeXN0ZW0KKyAgICBSRVRWQUw9JD8KKyAgICBlY2hvCisgICAgWyAkUkVUVkFMIC1lcSAwIF0gJiYgdG91Y2ggQEVYUEFOREVEX0xPQ0FMU1RBVEVESVJAL2xvY2svc3Vic3lzLyRzZXJ2aWNlbmFtZQorfQorCitzdG9wKCkgeworICAgIGVjaG8gLW4gJCJTdG9wcGluZyBzeXN0ZW0gbWVzc2FnZSBidXM6ICIKKworICAgICMjIHdlIGRvbid0IHdhbnQgdG8ga2lsbCBhbGwgdGhlIHBlci11c2VyICRwcm9jZXNzbmFtZSwgd2Ugd2FudAorICAgICMjIHRvIHVzZSB0aGUgcGlkIGZpbGUgKm9ubHkqOyBiZWNhdXNlIHdlIHVzZSB0aGUgZmFrZSBub25leGlzdGVudCAKKyAgICAjIyBwcm9ncmFtIG5hbWUgIiRzZXJ2aWNlbmFtZSIgdGhhdCBzaG91bGQgYmUgc2FmZS1pc2gKKyAgICBraWxscHJvYyAkc2VydmljZW5hbWUgLVRFUk0KKyAgICBSRVRWQUw9JD8KKyAgICBlY2hvCisgICAgaWYgWyAkUkVUVkFMIC1lcSAwIF07IHRoZW4KKyAgICAgICAgcm0gLWYgQEVYUEFOREVEX0xPQ0FMU1RBVEVESVJAL2xvY2svc3Vic3lzLyRzZXJ2aWNlbmFtZQorICAgICAgICBybSAtZiBAREJVU19TWVNURU1fUElEX0ZJTEVACisgICAgZmkKK30KKworIyBTZWUgaG93IHdlIHdlcmUgY2FsbGVkLgorY2FzZSAiJDEiIGluCisgICAgc3RhcnQpCisgICAgICAgIHN0YXJ0CisgICAgICAgIDs7CisgICAgc3RvcCkKKyAgICAgICAgc3RvcAorICAgICAgICA7OworICAgIHN0YXR1cykKKyAgICAgICAgc3RhdHVzICRzZXJ2aWNlbmFtZQorICAgICAgICBSRVRWQUw9JD8KKyAgICAgICAgOzsKKyAgICByZXN0YXJ0KQorICAgICAgICBzdG9wCisgICAgICAgIHN0YXJ0CisgICAgICAgIDs7CisgICAgY29uZHJlc3RhcnQpCisgICAgICAgIGlmIFsgLWYgQEVYUEFOREVEX0xPQ0FMU1RBVEVESVJAL2xvY2svc3Vic3lzLyRzZXJ2aWNlbmFtZSBdOyB0aGVuCisgICAgICAgICAgICBzdG9wCisgICAgICAgICAgICBzdGFydAorICAgICAgICBmaQorICAgICAgICA7OworICAgIHJlbG9hZCkKKyAgICAgICAgZWNobyAiTWVzc2FnZSBidXMgY2FuJ3QgcmVsb2FkIGl0cyBjb25maWd1cmF0aW9uLCB5b3UgaGF2ZSB0byByZXN0YXJ0IGl0IgorICAgICAgICBSRVRWQUw9JD8KKyAgICAgICAgOzsKKyAgICAqKQorICAgICAgICBlY2hvICQiVXNhZ2U6ICQwIHtzdGFydHxzdG9wfHN0YXR1c3xyZXN0YXJ0fGNvbmRyZXN0YXJ0fHJlbG9hZH0iCisgICAgICAgIDs7Citlc2FjCitleGl0ICRSRVRWQUwKZGlmZiAtLWdpdCBhL2RidXMvYnVzL29yZy5mcmVlZGVza3RvcC5kYnVzLXNlc3Npb24ucGxpc3QuaW4gYi9kYnVzL2J1cy9vcmcuZnJlZWRlc2t0b3AuZGJ1cy1zZXNzaW9uLnBsaXN0LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZmYzNzAKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2J1cy9vcmcuZnJlZWRlc2t0b3AuZGJ1cy1zZXNzaW9uLnBsaXN0LmluCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZS8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5MYWJlbDwva2V5PgorCTxzdHJpbmc+b3JnLmZyZWVkZXNrdG9wLmRidXMtc2Vzc2lvbjwvc3RyaW5nPgorCisJPGtleT5TZXJ2aWNlSVBDPC9rZXk+CisJPHRydWUvPgorCisJPCEtLSBQbGVhc2UgdW5jb21tZW50IG9uIDEwLjQ7IE9uRGVtYW5kIGRvZXNuJ3Qgd29yayBwcm9wZXJseSB0aGVyZS4gLS0+CisJPCEtLQorCTxrZXk+T25EZW1hbmQ8L2tleT4KKwk8ZmFsc2UgLz4KKwktLT4KKworCTxrZXk+UHJvZ3JhbUFyZ3VtZW50czwva2V5PgorCTxhcnJheT4KKwkJPHN0cmluZz5AREJVU19EQUVNT05ESVJAL2RidXMtZGFlbW9uPC9zdHJpbmc+CisJCTxzdHJpbmc+LS1ub2Zvcms8L3N0cmluZz4KKwkJPHN0cmluZz4tLXNlc3Npb248L3N0cmluZz4KKwk8L2FycmF5PgorCisJPGtleT5Tb2NrZXRzPC9rZXk+CisJPGRpY3Q+CisJCTxrZXk+dW5peF9kb21haW5fbGlzdGVuZXI8L2tleT4KKwkJPGRpY3Q+CisJCQk8a2V5PlNlY3VyZVNvY2tldFdpdGhLZXk8L2tleT4KKwkJCTxzdHJpbmc+REJVU19MQVVOQ0hEX1NFU1NJT05fQlVTX1NPQ0tFVDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJPC9kaWN0PgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2RidXMvYnVzL3BvbGljeS5jIGIvZGJ1cy9idXMvcG9saWN5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc5Y2VhOQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvYnVzL3BvbGljeS5jCkBAIC0wLDAgKzEsMTMxMyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBwb2xpY3kuYyAgQnVzIHNlY3VyaXR5IHBvbGljeQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAicG9saWN5LmgiCisjaW5jbHVkZSAic2VydmljZXMuaCIKKyNpbmNsdWRlICJ0ZXN0LmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1oYXNoLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorCitCdXNQb2xpY3lSdWxlKgorYnVzX3BvbGljeV9ydWxlX25ldyAoQnVzUG9saWN5UnVsZVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGFsbG93KQoreworICBCdXNQb2xpY3lSdWxlICpydWxlOworCisgIHJ1bGUgPSBkYnVzX25ldzAgKEJ1c1BvbGljeVJ1bGUsIDEpOworICBpZiAocnVsZSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHJ1bGUtPnR5cGUgPSB0eXBlOworICBydWxlLT5yZWZjb3VudCA9IDE7CisgIHJ1bGUtPmFsbG93ID0gYWxsb3c7CisKKyAgc3dpdGNoIChydWxlLT50eXBlKQorICAgIHsKKyAgICBjYXNlIEJVU19QT0xJQ1lfUlVMRV9VU0VSOgorICAgICAgcnVsZS0+ZC51c2VyLnVpZCA9IERCVVNfVUlEX1VOU0VUOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfR1JPVVA6CisgICAgICBydWxlLT5kLmdyb3VwLmdpZCA9IERCVVNfR0lEX1VOU0VUOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfU0VORDoKKyAgICAgIHJ1bGUtPmQuc2VuZC5tZXNzYWdlX3R5cGUgPSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEOworCisgICAgICAvKiBhbGxvdyBydWxlcyBkZWZhdWx0IHRvIFRSVUUgKG9ubHkgcmVxdWVzdGVkIHJlcGxpZXMgYWxsb3dlZCkKKyAgICAgICAqIGRlbnkgcnVsZXMgZGVmYXVsdCB0byBGQUxTRSAob25seSB1bnJlcXVlc3RlZCByZXBsaWVzIGRlbmllZCkKKyAgICAgICAqLworICAgICAgcnVsZS0+ZC5zZW5kLnJlcXVlc3RlZF9yZXBseSA9IHJ1bGUtPmFsbG93OworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfUkVDRUlWRToKKyAgICAgIHJ1bGUtPmQucmVjZWl2ZS5tZXNzYWdlX3R5cGUgPSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEOworICAgICAgLyogYWxsb3cgcnVsZXMgZGVmYXVsdCB0byBUUlVFIChvbmx5IHJlcXVlc3RlZCByZXBsaWVzIGFsbG93ZWQpCisgICAgICAgKiBkZW55IHJ1bGVzIGRlZmF1bHQgdG8gRkFMU0UgKG9ubHkgdW5yZXF1ZXN0ZWQgcmVwbGllcyBkZW5pZWQpCisgICAgICAgKi8KKyAgICAgIHJ1bGUtPmQucmVjZWl2ZS5yZXF1ZXN0ZWRfcmVwbHkgPSBydWxlLT5hbGxvdzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlVTX1BPTElDWV9SVUxFX09XTjoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgCisgIHJldHVybiBydWxlOworfQorCitCdXNQb2xpY3lSdWxlICoKK2J1c19wb2xpY3lfcnVsZV9yZWYgKEJ1c1BvbGljeVJ1bGUgKnJ1bGUpCit7CisgIF9kYnVzX2Fzc2VydCAocnVsZS0+cmVmY291bnQgPiAwKTsKKworICBydWxlLT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiBydWxlOworfQorCit2b2lkCitidXNfcG9saWN5X3J1bGVfdW5yZWYgKEJ1c1BvbGljeVJ1bGUgKnJ1bGUpCit7CisgIF9kYnVzX2Fzc2VydCAocnVsZS0+cmVmY291bnQgPiAwKTsKKworICBydWxlLT5yZWZjb3VudCAtPSAxOworICAKKyAgaWYgKHJ1bGUtPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgc3dpdGNoIChydWxlLT50eXBlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQlVTX1BPTElDWV9SVUxFX1NFTkQ6CisgICAgICAgICAgZGJ1c19mcmVlIChydWxlLT5kLnNlbmQucGF0aCk7CisgICAgICAgICAgZGJ1c19mcmVlIChydWxlLT5kLnNlbmQuaW50ZXJmYWNlKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPmQuc2VuZC5tZW1iZXIpOworICAgICAgICAgIGRidXNfZnJlZSAocnVsZS0+ZC5zZW5kLmVycm9yKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPmQuc2VuZC5kZXN0aW5hdGlvbik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQlVTX1BPTElDWV9SVUxFX1JFQ0VJVkU6CisgICAgICAgICAgZGJ1c19mcmVlIChydWxlLT5kLnJlY2VpdmUucGF0aCk7CisgICAgICAgICAgZGJ1c19mcmVlIChydWxlLT5kLnJlY2VpdmUuaW50ZXJmYWNlKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPmQucmVjZWl2ZS5tZW1iZXIpOworICAgICAgICAgIGRidXNfZnJlZSAocnVsZS0+ZC5yZWNlaXZlLmVycm9yKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPmQucmVjZWl2ZS5vcmlnaW4pOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJVU19QT0xJQ1lfUlVMRV9PV046CisgICAgICAgICAgZGJ1c19mcmVlIChydWxlLT5kLm93bi5zZXJ2aWNlX25hbWUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJVU19QT0xJQ1lfUlVMRV9VU0VSOgorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJVU19QT0xJQ1lfUlVMRV9HUk9VUDoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgCisgICAgICBkYnVzX2ZyZWUgKHJ1bGUpOworICAgIH0KK30KKworc3RydWN0IEJ1c1BvbGljeQoreworICBpbnQgcmVmY291bnQ7CisKKyAgREJ1c0xpc3QgKmRlZmF1bHRfcnVsZXM7ICAgICAgICAgLyoqPCBEZWZhdWx0IHBvbGljeSBydWxlcyAqLworICBEQnVzTGlzdCAqbWFuZGF0b3J5X3J1bGVzOyAgICAgICAvKio8IE1hbmRhdG9yeSBwb2xpY3kgcnVsZXMgKi8KKyAgREJ1c0hhc2hUYWJsZSAqcnVsZXNfYnlfdWlkOyAgICAgLyoqPCBwZXItVUlEIHBvbGljeSBydWxlcyAqLworICBEQnVzSGFzaFRhYmxlICpydWxlc19ieV9naWQ7ICAgICAvKio8IHBlci1HSUQgcG9saWN5IHJ1bGVzICovCisgIERCdXNMaXN0ICphdF9jb25zb2xlX3RydWVfcnVsZXM7IC8qKjwgY29uc29sZSB1c2VyIHBvbGljeSBydWxlcyB3aGVyZSBhdF9jb25zb2xlPSJ0cnVlIiovCisgIERCdXNMaXN0ICphdF9jb25zb2xlX2ZhbHNlX3J1bGVzOyAvKio8IGNvbnNvbGUgdXNlciBwb2xpY3kgcnVsZXMgd2hlcmUgYXRfY29uc29sZT0iZmFsc2UiKi8KK307CisKK3N0YXRpYyB2b2lkCitmcmVlX3J1bGVfZnVuYyAodm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCit7CisgIEJ1c1BvbGljeVJ1bGUgKnJ1bGUgPSBkYXRhOworCisgIGJ1c19wb2xpY3lfcnVsZV91bnJlZiAocnVsZSk7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX3J1bGVfbGlzdF9mdW5jICh2b2lkICpkYXRhKQoreworICBEQnVzTGlzdCAqKmxpc3QgPSBkYXRhOworCisgIGlmIChsaXN0ID09IE5VTEwpIC8qIERCdXNIYXNoVGFibGUgaXMgb24gY3JhY2sgKi8KKyAgICByZXR1cm47CisgIAorICBfZGJ1c19saXN0X2ZvcmVhY2ggKGxpc3QsIGZyZWVfcnVsZV9mdW5jLCBOVUxMKTsKKyAgCisgIF9kYnVzX2xpc3RfY2xlYXIgKGxpc3QpOworCisgIGRidXNfZnJlZSAobGlzdCk7Cit9CisKK0J1c1BvbGljeSoKK2J1c19wb2xpY3lfbmV3ICh2b2lkKQoreworICBCdXNQb2xpY3kgKnBvbGljeTsKKworICBwb2xpY3kgPSBkYnVzX25ldzAgKEJ1c1BvbGljeSwgMSk7CisgIGlmIChwb2xpY3kgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBwb2xpY3ktPnJlZmNvdW50ID0gMTsKKyAgCisgIHBvbGljeS0+cnVsZXNfYnlfdWlkID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9VSU5UUFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX3J1bGVfbGlzdF9mdW5jKTsKKyAgaWYgKHBvbGljeS0+cnVsZXNfYnlfdWlkID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisKKyAgcG9saWN5LT5ydWxlc19ieV9naWQgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1VJTlRQVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfcnVsZV9saXN0X2Z1bmMpOworICBpZiAocG9saWN5LT5ydWxlc19ieV9naWQgPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZDsKKworICByZXR1cm4gcG9saWN5OworICAKKyBmYWlsZWQ6CisgIGJ1c19wb2xpY3lfdW5yZWYgKHBvbGljeSk7CisgIHJldHVybiBOVUxMOworfQorCitCdXNQb2xpY3kgKgorYnVzX3BvbGljeV9yZWYgKEJ1c1BvbGljeSAqcG9saWN5KQoreworICBfZGJ1c19hc3NlcnQgKHBvbGljeS0+cmVmY291bnQgPiAwKTsKKworICBwb2xpY3ktPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIHBvbGljeTsKK30KKwordm9pZAorYnVzX3BvbGljeV91bnJlZiAoQnVzUG9saWN5ICpwb2xpY3kpCit7CisgIF9kYnVzX2Fzc2VydCAocG9saWN5LT5yZWZjb3VudCA+IDApOworCisgIHBvbGljeS0+cmVmY291bnQgLT0gMTsKKworICBpZiAocG9saWN5LT5yZWZjb3VudCA9PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJnBvbGljeS0+ZGVmYXVsdF9ydWxlcywgZnJlZV9ydWxlX2Z1bmMsIE5VTEwpOworICAgICAgX2RidXNfbGlzdF9jbGVhciAoJnBvbGljeS0+ZGVmYXVsdF9ydWxlcyk7CisKKyAgICAgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJnBvbGljeS0+bWFuZGF0b3J5X3J1bGVzLCBmcmVlX3J1bGVfZnVuYywgTlVMTCk7CisgICAgICBfZGJ1c19saXN0X2NsZWFyICgmcG9saWN5LT5tYW5kYXRvcnlfcnVsZXMpOworCisgICAgICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZwb2xpY3ktPmF0X2NvbnNvbGVfdHJ1ZV9ydWxlcywgZnJlZV9ydWxlX2Z1bmMsIE5VTEwpOworICAgICAgX2RidXNfbGlzdF9jbGVhciAoJnBvbGljeS0+YXRfY29uc29sZV90cnVlX3J1bGVzKTsKKworICAgICAgX2RidXNfbGlzdF9mb3JlYWNoICgmcG9saWN5LT5hdF9jb25zb2xlX2ZhbHNlX3J1bGVzLCBmcmVlX3J1bGVfZnVuYywgTlVMTCk7CisgICAgICBfZGJ1c19saXN0X2NsZWFyICgmcG9saWN5LT5hdF9jb25zb2xlX2ZhbHNlX3J1bGVzKTsKKworICAgICAgaWYgKHBvbGljeS0+cnVsZXNfYnlfdWlkKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAocG9saWN5LT5ydWxlc19ieV91aWQpOworICAgICAgICAgIHBvbGljeS0+cnVsZXNfYnlfdWlkID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBpZiAocG9saWN5LT5ydWxlc19ieV9naWQpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChwb2xpY3ktPnJ1bGVzX2J5X2dpZCk7CisgICAgICAgICAgcG9saWN5LT5ydWxlc19ieV9naWQgPSBOVUxMOworICAgICAgICB9CisgICAgICAKKyAgICAgIGRidXNfZnJlZSAocG9saWN5KTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWRkX2xpc3RfdG9fY2xpZW50IChEQnVzTGlzdCAgICAgICAgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICBCdXNDbGllbnRQb2xpY3kgICpjbGllbnQpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChsaXN0KTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBCdXNQb2xpY3lSdWxlICpydWxlID0gbGluay0+ZGF0YTsKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGxpc3QsIGxpbmspOworCisgICAgICBzd2l0Y2ggKHJ1bGUtPnR5cGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfVVNFUjoKKyAgICAgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfR1JPVVA6CisgICAgICAgICAgLyogVGhlc2UgYXJlbid0IHBlci1jb25uZWN0aW9uIHBvbGljaWVzICovCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfT1dOOgorICAgICAgICBjYXNlIEJVU19QT0xJQ1lfUlVMRV9TRU5EOgorICAgICAgICBjYXNlIEJVU19QT0xJQ1lfUlVMRV9SRUNFSVZFOgorICAgICAgICAgIC8qIFRoZXNlIGFyZSBwZXItY29ubmVjdGlvbiAqLworICAgICAgICAgIGlmICghYnVzX2NsaWVudF9wb2xpY3lfYXBwZW5kX3J1bGUgKGNsaWVudCwgcnVsZSkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworQnVzQ2xpZW50UG9saWN5KgorYnVzX3BvbGljeV9jcmVhdGVfY2xpZW50X3BvbGljeSAoQnVzUG9saWN5ICAgICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBCdXNDbGllbnRQb2xpY3kgKmNsaWVudDsKKyAgZGJ1c191aWRfdCB1aWQ7CisgIGRidXNfYm9vbF90IGF0X2NvbnNvbGU7CisKKyAgX2RidXNfYXNzZXJ0IChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2F1dGhlbnRpY2F0ZWQgKGNvbm5lY3Rpb24pKTsKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICBjbGllbnQgPSBidXNfY2xpZW50X3BvbGljeV9uZXcgKCk7CisgIGlmIChjbGllbnQgPT0gTlVMTCkKKyAgICBnb3RvIG5vbWVtOworCisgIGlmICghYWRkX2xpc3RfdG9fY2xpZW50ICgmcG9saWN5LT5kZWZhdWx0X3J1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50KSkKKyAgICBnb3RvIG5vbWVtOworCisgIC8qIHdlIGF2b2lkIHRoZSBvdmVyaGVhZCBvZiBsb29raW5nIHVwIHVzZXIncyBncm91cHMKKyAgICogaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgZ3JvdXAgcnVsZXMgYW55d2F5CisgICAqLworICBpZiAoX2RidXNfaGFzaF90YWJsZV9nZXRfbl9lbnRyaWVzIChwb2xpY3ktPnJ1bGVzX2J5X2dpZCkgPiAwKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgKmdyb3VwczsKKyAgICAgIGludCBuX2dyb3VwczsKKyAgICAgIGludCBpOworICAgICAgCisgICAgICBpZiAoIWJ1c19jb25uZWN0aW9uX2dldF91bml4X2dyb3VwcyAoY29ubmVjdGlvbiwgJmdyb3VwcywgJm5fZ3JvdXBzLCBlcnJvcikpCisgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgCisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChpIDwgbl9ncm91cHMpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzTGlzdCAqKmxpc3Q7CisgICAgICAgICAgCisgICAgICAgICAgbGlzdCA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3VpbnRwdHIgKHBvbGljeS0+cnVsZXNfYnlfZ2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzW2ldKTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAobGlzdCAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIWFkZF9saXN0X3RvX2NsaWVudCAobGlzdCwgY2xpZW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBkYnVzX2ZyZWUgKGdyb3Vwcyk7CisgICAgICAgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKworICAgICAgZGJ1c19mcmVlIChncm91cHMpOworICAgIH0KKyAgCisgIGlmIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfdXNlciAoY29ubmVjdGlvbiwgJnVpZCkpCisgICAgeworICAgICAgaWYgKF9kYnVzX2hhc2hfdGFibGVfZ2V0X25fZW50cmllcyAocG9saWN5LT5ydWxlc19ieV91aWQpID4gMCkKKyAgICAgICAgeworICAgICAgICAgIERCdXNMaXN0ICoqbGlzdDsKKyAgICAgICAgICAKKyAgICAgICAgICBsaXN0ID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfdWludHB0ciAocG9saWN5LT5ydWxlc19ieV91aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQpOworICAgICAgICAgIAorICAgICAgICAgIGlmIChsaXN0ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghYWRkX2xpc3RfdG9fY2xpZW50IChsaXN0LCBjbGllbnQpKQorICAgICAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgLyogQWRkIGNvbnNvbGUgcnVsZXMgKi8KKyAgICAgIGF0X2NvbnNvbGUgPSBfZGJ1c191bml4X3VzZXJfaXNfYXRfY29uc29sZSAodWlkLCBlcnJvcik7CisgICAgICAKKyAgICAgIGlmIChhdF9jb25zb2xlKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFhZGRfbGlzdF90b19jbGllbnQgKCZwb2xpY3ktPmF0X2NvbnNvbGVfdHJ1ZV9ydWxlcywgY2xpZW50KSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGRidXNfZXJyb3JfaXNfc2V0IChlcnJvcikgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghYWRkX2xpc3RfdG9fY2xpZW50ICgmcG9saWN5LT5hdF9jb25zb2xlX2ZhbHNlX3J1bGVzLCBjbGllbnQpKQorICAgICAgICB7CisgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoIWFkZF9saXN0X3RvX2NsaWVudCAoJnBvbGljeS0+bWFuZGF0b3J5X3J1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50KSkKKyAgICBnb3RvIG5vbWVtOworCisgIGJ1c19jbGllbnRfcG9saWN5X29wdGltaXplIChjbGllbnQpOworICAKKyAgcmV0dXJuIGNsaWVudDsKKworIG5vbWVtOgorICBCVVNfU0VUX09PTSAoZXJyb3IpOworIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICBpZiAoY2xpZW50KQorICAgIGJ1c19jbGllbnRfcG9saWN5X3VucmVmIChjbGllbnQpOworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitsaXN0X2FsbG93c191c2VyIChkYnVzX2Jvb2xfdCAgICAgICAgICAgZGVmLAorICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgICAgICAqKmxpc3QsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyAgKmdyb3VwX2lkcywKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBuX2dyb3VwX2lkcykKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIGRidXNfYm9vbF90IGFsbG93ZWQ7CisgIAorICBhbGxvd2VkID0gZGVmOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChsaXN0KTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBCdXNQb2xpY3lSdWxlICpydWxlID0gbGluay0+ZGF0YTsKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGxpc3QsIGxpbmspOworCisgICAgICBpZiAocnVsZS0+dHlwZSA9PSBCVVNfUE9MSUNZX1JVTEVfVVNFUikKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJMaXN0ICVwIHVzZXIgcnVsZSB1aWQ9IkRCVVNfVUlEX0ZPUk1BVCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCwgcnVsZS0+ZC51c2VyLnVpZCk7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKHJ1bGUtPmQudXNlci51aWQgPT0gREJVU19VSURfVU5TRVQpCisgICAgICAgICAgICA7IC8qICcqJyB3aWxkY2FyZCAqLworICAgICAgICAgIGVsc2UgaWYgKHJ1bGUtPmQudXNlci51aWQgIT0gdWlkKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHJ1bGUtPnR5cGUgPT0gQlVTX1BPTElDWV9SVUxFX0dST1VQKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkxpc3QgJXAgZ3JvdXAgcnVsZSBnaWQ9IkRCVVNfR0lEX0ZPUk1BVCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCwgcnVsZS0+ZC5ncm91cC5naWQpOworICAgICAgICAgIAorICAgICAgICAgIGlmIChydWxlLT5kLmdyb3VwLmdpZCA9PSBEQlVTX0dJRF9VTlNFVCkKKyAgICAgICAgICAgIDsgIC8qICcqJyB3aWxkY2FyZCAqLworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgICAgd2hpbGUgKGkgPCBuX2dyb3VwX2lkcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAocnVsZS0+ZC5ncm91cC5naWQgPT0gZ3JvdXBfaWRzW2ldKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoaSA9PSBuX2dyb3VwX2lkcykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBjb250aW51ZTsKKworICAgICAgYWxsb3dlZCA9IHJ1bGUtPmFsbG93OworICAgIH0KKyAgCisgIHJldHVybiBhbGxvd2VkOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hbGxvd191bml4X3VzZXIgKEJ1c1BvbGljeSAgICAgICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICB1aWQpCit7CisgIGRidXNfYm9vbF90IGFsbG93ZWQ7CisgIHVuc2lnbmVkIGxvbmcgKmdyb3VwX2lkczsKKyAgaW50IG5fZ3JvdXBfaWRzOworCisgIC8qIE9uIE9PTSBvciBlcnJvciB3ZSBhbHdheXMgcmVqZWN0IHRoZSB1c2VyICovCisgIGlmICghX2RidXNfdW5peF9ncm91cHNfZnJvbV91aWQgKHVpZCwgJmdyb3VwX2lkcywgJm5fZ3JvdXBfaWRzKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRGlkIG5vdCBnZXQgYW55IGdyb3VwcyBmb3IgVUlEICVsdVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHVpZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIERlZmF1bHQgdG8gInVzZXIgb3duaW5nIGJ1cyIgY2FuIGNvbm5lY3QgKi8KKyAgYWxsb3dlZCA9IF9kYnVzX3VuaXhfdXNlcl9pc19wcm9jZXNzX293bmVyICh1aWQpOworCisgIGFsbG93ZWQgPSBsaXN0X2FsbG93c191c2VyIChhbGxvd2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvbGljeS0+ZGVmYXVsdF9ydWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2lkcywgbl9ncm91cF9pZHMpOworCisgIGFsbG93ZWQgPSBsaXN0X2FsbG93c191c2VyIChhbGxvd2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvbGljeS0+bWFuZGF0b3J5X3J1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfaWRzLCBuX2dyb3VwX2lkcyk7CisKKyAgZGJ1c19mcmVlIChncm91cF9pZHMpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJVSUQgJWx1IGFsbG93ZWQgPSAlZFxuIiwgdWlkLCBhbGxvd2VkKTsKKyAgCisgIHJldHVybiBhbGxvd2VkOworfQorCisvKiBGb3Igbm93IHRoaXMgaXMgbmV2ZXIgYWN0dWFsbHkgY2FsbGVkIGJlY2F1c2UgdGhlIGRlZmF1bHQKKyAqIERCdXNDb25uZWN0aW9uIGJlaGF2aW9yIG9mICdzYW1lIHVzZXIgdGhhdCBvd25zIHRoZSBidXMgY2FuCisgKiBjb25uZWN0JyBpcyBhbGwgaXQgd291bGQgZG8uIFNldCB0aGUgd2luZG93cyB1c2VyIGZ1bmN0aW9uIGluCisgKiBjb25uZWN0aW9uLmMgaWYgdGhlIGNvbmZpZyBmaWxlIGV2ZXIgc3VwcG9ydHMgZG9pbmcgc29tZXRoaW5nCisgKiBpbnRlcmVzdGluZyBoZXJlLgorICovCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hbGxvd193aW5kb3dzX3VzZXIgKEJ1c1BvbGljeSAgICAgICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICp3aW5kb3dzX3NpZCkKK3sKKyAgLyogV2luZG93cyBoYXMgbm8gcG9saWNpZXMgaGVyZSBzaW5jZSBvbmx5IHRoZSBzZXNzaW9uIGJ1cworICAgKiBpcyByZWFsbHkgdXNlZCBmb3Igbm93LCBzbyBqdXN0IGNoZWNraW5nIHRoYXQgdGhlCisgICAqIGNvbm5lY3RpbmcgcGVyc29uIGlzIHRoZSBzYW1lIGFzIHRoZSBidXMgb3duZXIgaXMgZmluZS4KKyAgICovCisgIHJldHVybiBfZGJ1c193aW5kb3dzX3VzZXJfaXNfcHJvY2Vzc19vd25lciAod2luZG93c19zaWQpOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hcHBlbmRfZGVmYXVsdF9ydWxlIChCdXNQb2xpY3kgICAgICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQb2xpY3lSdWxlICAqcnVsZSkKK3sKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJnBvbGljeS0+ZGVmYXVsdF9ydWxlcywgcnVsZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1c19wb2xpY3lfcnVsZV9yZWYgKHJ1bGUpOworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hcHBlbmRfbWFuZGF0b3J5X3J1bGUgKEJ1c1BvbGljeSAgICAgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzUG9saWN5UnVsZSAgKnJ1bGUpCit7CisgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZwb2xpY3ktPm1hbmRhdG9yeV9ydWxlcywgcnVsZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1c19wb2xpY3lfcnVsZV9yZWYgKHJ1bGUpOworCisgIHJldHVybiBUUlVFOworfQorCisKKworc3RhdGljIERCdXNMaXN0KioKK2dldF9saXN0IChEQnVzSGFzaFRhYmxlICpoYXNoLAorICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIGtleSkKK3sKKyAgREJ1c0xpc3QgKipsaXN0OworCisgIGxpc3QgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF91aW50cHRyIChoYXNoLCBrZXkpOworCisgIGlmIChsaXN0ID09IE5VTEwpCisgICAgeworICAgICAgbGlzdCA9IGRidXNfbmV3MCAoREJ1c0xpc3QqLCAxKTsKKyAgICAgIGlmIChsaXN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3VpbnRwdHIgKGhhc2gsIGtleSwgbGlzdCkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2ZyZWUgKGxpc3QpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBsaXN0OworfQorCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hcHBlbmRfdXNlcl9ydWxlIChCdXNQb2xpY3kgICAgICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQb2xpY3lSdWxlICAqcnVsZSkKK3sKKyAgREJ1c0xpc3QgKipsaXN0OworCisgIGxpc3QgPSBnZXRfbGlzdCAocG9saWN5LT5ydWxlc19ieV91aWQsIHVpZCk7CisKKyAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAobGlzdCwgcnVsZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1c19wb2xpY3lfcnVsZV9yZWYgKHJ1bGUpOworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hcHBlbmRfZ3JvdXBfcnVsZSAoQnVzUG9saWN5ICAgICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICBnaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQb2xpY3lSdWxlICAqcnVsZSkKK3sKKyAgREJ1c0xpc3QgKipsaXN0OworCisgIGxpc3QgPSBnZXRfbGlzdCAocG9saWN5LT5ydWxlc19ieV9naWQsIGdpZCk7CisKKyAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAobGlzdCwgcnVsZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1c19wb2xpY3lfcnVsZV9yZWYgKHJ1bGUpOworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hcHBlbmRfY29uc29sZV9ydWxlIChCdXNQb2xpY3kgICAgICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgYXRfY29uc29sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzUG9saWN5UnVsZSAgKnJ1bGUpCit7CisgIGlmIChhdF9jb25zb2xlKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZwb2xpY3ktPmF0X2NvbnNvbGVfdHJ1ZV9ydWxlcywgcnVsZSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZwb2xpY3ktPmF0X2NvbnNvbGVfZmFsc2VfcnVsZXMsIHJ1bGUpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGJ1c19wb2xpY3lfcnVsZV9yZWYgKHJ1bGUpOworCisgIHJldHVybiBUUlVFOworCit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYXBwZW5kX2NvcHlfb2ZfcG9saWN5X2xpc3QgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAqKnRvX2FwcGVuZCkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIERCdXNMaXN0ICp0bXBfbGlzdDsKKworICB0bXBfbGlzdCA9IE5VTEw7CisKKyAgLyogUHJlYWxsb2NhdGUgYWxsIG91ciBsaW5rcyAqLworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAodG9fYXBwZW5kKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmdG1wX2xpc3QsIGxpbmstPmRhdGEpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbGlzdF9jbGVhciAoJnRtcF9saXN0KTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAodG9fYXBwZW5kLCBsaW5rKTsKKyAgICB9CisKKyAgLyogTm93IGFwcGVuZCB0aGVtICovCisgIHdoaWxlICgobGluayA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0X2xpbmsgKCZ0bXBfbGlzdCkpKQorICAgIHsKKyAgICAgIGJ1c19wb2xpY3lfcnVsZV9yZWYgKGxpbmstPmRhdGEpOworICAgICAgX2RidXNfbGlzdF9hcHBlbmRfbGluayAobGlzdCwgbGluayk7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK21lcmdlX2lkX2hhc2ggKERCdXNIYXNoVGFibGUgKmRlc3QsCisgICAgICAgICAgICAgICBEQnVzSGFzaFRhYmxlICp0b19hYnNvcmIpCit7CisgIERCdXNIYXNoSXRlciBpdGVyOworICAKKyAgX2RidXNfaGFzaF9pdGVyX2luaXQgKHRvX2Fic29yYiwgJml0ZXIpOworICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIGlkID0gX2RidXNfaGFzaF9pdGVyX2dldF91aW50cHRyX2tleSAoJml0ZXIpOworICAgICAgREJ1c0xpc3QgKipsaXN0ID0gX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpOworICAgICAgREJ1c0xpc3QgKip0YXJnZXQgPSBnZXRfbGlzdCAoZGVzdCwgaWQpOworCisgICAgICBpZiAodGFyZ2V0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKCFhcHBlbmRfY29weV9vZl9wb2xpY3lfbGlzdCAodGFyZ2V0LCBsaXN0KSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19wb2xpY3lfbWVyZ2UgKEJ1c1BvbGljeSAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgQnVzUG9saWN5ICp0b19hYnNvcmIpCit7CisgIC8qIEZJWE1FIE5vdCBwcm9wZXJseSBhdG9taWMsIGJ1dCBhcyB1c2VkIGZvciBjb25maWd1cmF0aW9uIGZpbGVzIHdlCisgICAqIGRvbid0IHJlbHkgb24gaXQgcXVpdGUgc28gbXVjaC4KKyAgICovCisgIAorICBpZiAoIWFwcGVuZF9jb3B5X29mX3BvbGljeV9saXN0ICgmcG9saWN5LT5kZWZhdWx0X3J1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9fYWJzb3JiLT5kZWZhdWx0X3J1bGVzKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBpZiAoIWFwcGVuZF9jb3B5X29mX3BvbGljeV9saXN0ICgmcG9saWN5LT5tYW5kYXRvcnlfcnVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b19hYnNvcmItPm1hbmRhdG9yeV9ydWxlcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghYXBwZW5kX2NvcHlfb2ZfcG9saWN5X2xpc3QgKCZwb2xpY3ktPmF0X2NvbnNvbGVfdHJ1ZV9ydWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvX2Fic29yYi0+YXRfY29uc29sZV90cnVlX3J1bGVzKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFhcHBlbmRfY29weV9vZl9wb2xpY3lfbGlzdCAoJnBvbGljeS0+YXRfY29uc29sZV9mYWxzZV9ydWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvX2Fic29yYi0+YXRfY29uc29sZV9mYWxzZV9ydWxlcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghbWVyZ2VfaWRfaGFzaCAocG9saWN5LT5ydWxlc19ieV91aWQsCisgICAgICAgICAgICAgICAgICAgICAgdG9fYWJzb3JiLT5ydWxlc19ieV91aWQpKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGlmICghbWVyZ2VfaWRfaGFzaCAocG9saWN5LT5ydWxlc19ieV9naWQsCisgICAgICAgICAgICAgICAgICAgICAgdG9fYWJzb3JiLT5ydWxlc19ieV9naWQpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RydWN0IEJ1c0NsaWVudFBvbGljeQoreworICBpbnQgcmVmY291bnQ7CisKKyAgREJ1c0xpc3QgKnJ1bGVzOworfTsKKworQnVzQ2xpZW50UG9saWN5KgorYnVzX2NsaWVudF9wb2xpY3lfbmV3ICh2b2lkKQoreworICBCdXNDbGllbnRQb2xpY3kgKnBvbGljeTsKKworICBwb2xpY3kgPSBkYnVzX25ldzAgKEJ1c0NsaWVudFBvbGljeSwgMSk7CisgIGlmIChwb2xpY3kgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBwb2xpY3ktPnJlZmNvdW50ID0gMTsKKworICByZXR1cm4gcG9saWN5OworfQorCitCdXNDbGllbnRQb2xpY3kgKgorYnVzX2NsaWVudF9wb2xpY3lfcmVmIChCdXNDbGllbnRQb2xpY3kgKnBvbGljeSkKK3sKKyAgX2RidXNfYXNzZXJ0IChwb2xpY3ktPnJlZmNvdW50ID4gMCk7CisKKyAgcG9saWN5LT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiBwb2xpY3k7Cit9CisKK3N0YXRpYyB2b2lkCitydWxlX3VucmVmX2ZvcmVhY2ggKHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgQnVzUG9saWN5UnVsZSAqcnVsZSA9IGRhdGE7CisKKyAgYnVzX3BvbGljeV9ydWxlX3VucmVmIChydWxlKTsKK30KKwordm9pZAorYnVzX2NsaWVudF9wb2xpY3lfdW5yZWYgKEJ1c0NsaWVudFBvbGljeSAqcG9saWN5KQoreworICBfZGJ1c19hc3NlcnQgKHBvbGljeS0+cmVmY291bnQgPiAwKTsKKworICBwb2xpY3ktPnJlZmNvdW50IC09IDE7CisKKyAgaWYgKHBvbGljeS0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZwb2xpY3ktPnJ1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlX3VucmVmX2ZvcmVhY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICBfZGJ1c19saXN0X2NsZWFyICgmcG9saWN5LT5ydWxlcyk7CisKKyAgICAgIGRidXNfZnJlZSAocG9saWN5KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfcnVsZXNfYnlfdHlwZV91cF90byAoQnVzQ2xpZW50UG9saWN5ICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQb2xpY3lSdWxlVHlwZSAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAgICAqdXBfdG8pCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmcG9saWN5LT5ydWxlcyk7CisgIHdoaWxlIChsaW5rICE9IHVwX3RvKQorICAgIHsKKyAgICAgIEJ1c1BvbGljeVJ1bGUgKnJ1bGUgPSBsaW5rLT5kYXRhOworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZwb2xpY3ktPnJ1bGVzLCBsaW5rKTsKKworICAgICAgaWYgKHJ1bGUtPnR5cGUgPT0gdHlwZSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKCZwb2xpY3ktPnJ1bGVzLCBsaW5rKTsKKyAgICAgICAgICBidXNfcG9saWN5X3J1bGVfdW5yZWYgKHJ1bGUpOworICAgICAgICB9CisgICAgICAKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KK30KKwordm9pZAorYnVzX2NsaWVudF9wb2xpY3lfb3B0aW1pemUgKEJ1c0NsaWVudFBvbGljeSAqcG9saWN5KQoreworICBEQnVzTGlzdCAqbGluazsKKworICAvKiBUaGUgaWRlYSBoZXJlIGlzIHRoYXQgaWYgd2UgaGF2ZToKKyAgICogCisgICAqIDxhbGxvdyBzZW5kX2ludGVyZmFjZT0iZm9vLmJhciIvPgorICAgKiA8ZGVueSBzZW5kX2ludGVyZmFjZT0iKiIvPgorICAgKgorICAgKiAoZm9yIGV4YW1wbGUpIHRoZSBkZW55IHdpbGwgYWx3YXlzIG92ZXJyaWRlIHRoZSBhbGxvdy4gIFNvIHdlCisgICAqIGRlbGV0ZSB0aGUgYWxsb3cuIERpdHRvIGZvciBkZW55IGZvbGxvd2VkIGJ5IGFsbG93LCBldGMuIFRoaXMgaXMKKyAgICogYSBkdW1iIHRoaW5nIHRvIHB1dCBpbiBhIGNvbmZpZyBmaWxlLCBidXQgdGhlIDxpbmNsdWRlPiBmZWF0dXJlCisgICAqIG9mIGZpbGVzIGFsbG93cyBmb3IgYW4gImluaGVyaXRhbmNlIGFuZCBvdmVycmlkZSIgcGF0dGVybiB3aGVyZQorICAgKiBpdCBjb3VsZCBtYWtlIHNlbnNlLiBJZiBhbiBpbmNsdWRlZCBmaWxlIHdhbnRzIHRvICJzdGFydCBvdmVyIgorICAgKiB3aXRoIGEgYmxhbmtldCBkZW55LCBubyBwb2ludCBrZWVwaW5nIHRoZSBydWxlcyBmcm9tIHRoZSBwYXJlbnQKKyAgICogZmlsZS4KKyAgICovCisKKyAgX2RidXNfdmVyYm9zZSAoIk9wdGltaXppbmcgcG9saWN5IHdpdGggJWQgcnVsZXNcbiIsCisgICAgICAgICAgICAgICAgIF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAoJnBvbGljeS0+cnVsZXMpKTsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmcG9saWN5LT5ydWxlcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgQnVzUG9saWN5UnVsZSAqcnVsZTsKKyAgICAgIERCdXNMaXN0ICpuZXh0OworICAgICAgZGJ1c19ib29sX3QgcmVtb3ZlX3ByZWNlZGluZzsKKworICAgICAgbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnBvbGljeS0+cnVsZXMsIGxpbmspOworICAgICAgcnVsZSA9IGxpbmstPmRhdGE7CisgICAgICAKKyAgICAgIHJlbW92ZV9wcmVjZWRpbmcgPSBGQUxTRTsKKworICAgICAgX2RidXNfYXNzZXJ0IChydWxlICE9IE5VTEwpOworICAgICAgCisgICAgICBzd2l0Y2ggKHJ1bGUtPnR5cGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfU0VORDoKKyAgICAgICAgICByZW1vdmVfcHJlY2VkaW5nID0KKyAgICAgICAgICAgIHJ1bGUtPmQuc2VuZC5tZXNzYWdlX3R5cGUgPT0gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCAmJgorICAgICAgICAgICAgcnVsZS0+ZC5zZW5kLnBhdGggPT0gTlVMTCAmJgorICAgICAgICAgICAgcnVsZS0+ZC5zZW5kLmludGVyZmFjZSA9PSBOVUxMICYmCisgICAgICAgICAgICBydWxlLT5kLnNlbmQubWVtYmVyID09IE5VTEwgJiYKKyAgICAgICAgICAgIHJ1bGUtPmQuc2VuZC5lcnJvciA9PSBOVUxMICYmCisgICAgICAgICAgICBydWxlLT5kLnNlbmQuZGVzdGluYXRpb24gPT0gTlVMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfUkVDRUlWRToKKyAgICAgICAgICByZW1vdmVfcHJlY2VkaW5nID0KKyAgICAgICAgICAgIHJ1bGUtPmQucmVjZWl2ZS5tZXNzYWdlX3R5cGUgPT0gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCAmJgorICAgICAgICAgICAgcnVsZS0+ZC5yZWNlaXZlLnBhdGggPT0gTlVMTCAmJgorICAgICAgICAgICAgcnVsZS0+ZC5yZWNlaXZlLmludGVyZmFjZSA9PSBOVUxMICYmCisgICAgICAgICAgICBydWxlLT5kLnJlY2VpdmUubWVtYmVyID09IE5VTEwgJiYKKyAgICAgICAgICAgIHJ1bGUtPmQucmVjZWl2ZS5lcnJvciA9PSBOVUxMICYmCisgICAgICAgICAgICBydWxlLT5kLnJlY2VpdmUub3JpZ2luID09IE5VTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQlVTX1BPTElDWV9SVUxFX09XTjoKKyAgICAgICAgICByZW1vdmVfcHJlY2VkaW5nID0KKyAgICAgICAgICAgIHJ1bGUtPmQub3duLnNlcnZpY2VfbmFtZSA9PSBOVUxMOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJVU19QT0xJQ1lfUlVMRV9VU0VSOgorICAgICAgICBjYXNlIEJVU19QT0xJQ1lfUlVMRV9HUk9VUDoKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnZhbGlkIHJ1bGUiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICBpZiAocmVtb3ZlX3ByZWNlZGluZykKKyAgICAgICAgcmVtb3ZlX3J1bGVzX2J5X3R5cGVfdXBfdG8gKHBvbGljeSwgcnVsZS0+dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmspOworICAgICAgCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIkFmdGVyIG9wdGltaXphdGlvbiwgcG9saWN5IGhhcyAlZCBydWxlc1xuIiwKKyAgICAgICAgICAgICAgICAgX2RidXNfbGlzdF9nZXRfbGVuZ3RoICgmcG9saWN5LT5ydWxlcykpOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NsaWVudF9wb2xpY3lfYXBwZW5kX3J1bGUgKEJ1c0NsaWVudFBvbGljeSAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1BvbGljeVJ1bGUgICAqcnVsZSkKK3sKKyAgX2RidXNfdmVyYm9zZSAoIkFwcGVuZGluZyBydWxlICVwIHdpdGggdHlwZSAlZCB0byBwb2xpY3kgJXBcbiIsCisgICAgICAgICAgICAgICAgIHJ1bGUsIHJ1bGUtPnR5cGUsIHBvbGljeSk7CisgIAorICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmcG9saWN5LT5ydWxlcywgcnVsZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1c19wb2xpY3lfcnVsZV9yZWYgKHJ1bGUpOworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NsaWVudF9wb2xpY3lfY2hlY2tfY2FuX3NlbmQgKEJ1c0NsaWVudFBvbGljeSAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1JlZ2lzdHJ5ICAgICAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICByZXF1ZXN0ZWRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICpyZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICp0b2dnbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAqbG9nKQoreworICBEQnVzTGlzdCAqbGluazsKKyAgZGJ1c19ib29sX3QgYWxsb3dlZDsKKyAgCisgIC8qIHBvbGljeS0+cnVsZXMgaXMgaW4gdGhlIG9yZGVyIHRoZSBydWxlcyBhcHBlYXJlZAorICAgKiBpbiB0aGUgY29uZmlnIGZpbGUsIGkuZS4gbGFzdCBydWxlIHRoYXQgYXBwbGllcyB3aW5zCisgICAqLworCisgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIGNoZWNraW5nIHNlbmQgcnVsZXNcbiIpOworICAqdG9nZ2xlcyA9IDA7CisgIAorICBhbGxvd2VkID0gRkFMU0U7CisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmcG9saWN5LT5ydWxlcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgQnVzUG9saWN5UnVsZSAqcnVsZSA9IGxpbmstPmRhdGE7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZwb2xpY3ktPnJ1bGVzLCBsaW5rKTsKKyAgICAgIAorICAgICAgLyogUnVsZSBpcyBza2lwcGVkIGlmIGl0IHNwZWNpZmllcyBhIGRpZmZlcmVudAorICAgICAgICogbWVzc2FnZSBuYW1lIGZyb20gdGhlIG1lc3NhZ2UsIG9yIGEgZGlmZmVyZW50CisgICAgICAgKiBkZXN0aW5hdGlvbiBmcm9tIHRoZSBtZXNzYWdlCisgICAgICAgKi8KKyAgICAgIAorICAgICAgaWYgKHJ1bGUtPnR5cGUgIT0gQlVTX1BPTElDWV9SVUxFX1NFTkQpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBub24tc2VuZCBydWxlXG4iKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICBpZiAocnVsZS0+ZC5zZW5kLm1lc3NhZ2VfdHlwZSAhPSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgIT0gcnVsZS0+ZC5zZW5kLm1lc3NhZ2VfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgcnVsZSBmb3IgZGlmZmVyZW50IG1lc3NhZ2UgdHlwZVxuIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIC8qIElmIGl0J3MgYSByZXBseSwgdGhlIHJlcXVlc3RlZF9yZXBseSBmbGFnIGtpY2tzIGluICovCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBmb3IgYWxsb3csIHJlcXVlc3RlZF9yZXBseT10cnVlIG1lYW5zIHRoZSBydWxlIGFwcGxpZXMKKyAgICAgICAgICAgKiBvbmx5IHdoZW4gcmVwbHkgd2FzIHJlcXVlc3RlZC4gcmVxdWVzdGVkX3JlcGx5PWZhbHNlIG1lYW5zCisgICAgICAgICAgICogYWx3YXlzIGFsbG93LgorICAgICAgICAgICAqLworICAgICAgICAgIGlmICghcmVxdWVzdGVkX3JlcGx5ICYmIHJ1bGUtPmFsbG93ICYmIHJ1bGUtPmQuc2VuZC5yZXF1ZXN0ZWRfcmVwbHkgJiYgIXJ1bGUtPmQuc2VuZC5lYXZlc2Ryb3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIGFsbG93IHJ1bGUgc2luY2UgaXQgb25seSBhcHBsaWVzIHRvIHJlcXVlc3RlZCByZXBsaWVzIGFuZCBkb2VzIG5vdCBhbGxvdyBlYXZlc2Ryb3BwaW5nXG4iKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBmb3IgZGVueSwgcmVxdWVzdGVkX3JlcGx5PWZhbHNlIG1lYW5zIHRoZSBydWxlIGFwcGxpZXMgb25seQorICAgICAgICAgICAqIHdoZW4gdGhlIHJlcGx5IHdhcyBub3QgcmVxdWVzdGVkLiByZXF1ZXN0ZWRfcmVwbHk9dHJ1ZSBtZWFucyB0aGUKKyAgICAgICAgICAgKiBydWxlIGFsd2F5cyBhcHBsaWVzLgorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChyZXF1ZXN0ZWRfcmVwbHkgJiYgIXJ1bGUtPmFsbG93ICYmICFydWxlLT5kLnNlbmQucmVxdWVzdGVkX3JlcGx5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBkZW55IHJ1bGUgc2luY2UgaXQgb25seSBhcHBsaWVzIHRvIHVucmVxdWVzdGVkIHJlcGxpZXNcbiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAocnVsZS0+ZC5zZW5kLnBhdGggIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgc3RyY21wIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQuc2VuZC5wYXRoKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBydWxlIGZvciBkaWZmZXJlbnQgcGF0aFxuIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAKKyAgICAgIGlmIChydWxlLT5kLnNlbmQuaW50ZXJmYWNlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBUaGUgaW50ZXJmYWNlIGlzIG9wdGlvbmFsIGluIG1lc3NhZ2VzLiBGb3IgYWxsb3cgcnVsZXMsIGlmIHRoZSBtZXNzYWdlCisgICAgICAgICAgICogaGFzIG5vIGludGVyZmFjZSB3ZSB3YW50IHRvIHNraXAgdGhlIHJ1bGUgKGFuZCB0aHVzIG5vdCBhbGxvdyk7CisgICAgICAgICAgICogZm9yIGRlbnkgcnVsZXMsIGlmIHRoZSBtZXNzYWdlIGhhcyBubyBpbnRlcmZhY2Ugd2Ugd2FudCB0byB1c2UgdGhlCisgICAgICAgICAgICogcnVsZSAoYW5kIHRodXMgZGVueSkuCisgICAgICAgICAgICovCisgICAgICAgICAgZGJ1c19ib29sX3Qgbm9faW50ZXJmYWNlOworCisgICAgICAgICAgbm9faW50ZXJmYWNlID0gZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID09IE5VTEw7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKChub19pbnRlcmZhY2UgJiYgcnVsZS0+YWxsb3cpIHx8CisgICAgICAgICAgICAgICghbm9faW50ZXJmYWNlICYmIAorICAgICAgICAgICAgICAgc3RyY21wIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQuc2VuZC5pbnRlcmZhY2UpICE9IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBydWxlIGZvciBkaWZmZXJlbnQgaW50ZXJmYWNlXG4iKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgaWYgKHJ1bGUtPmQuc2VuZC5tZW1iZXIgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgIT0gTlVMTCAmJgorICAgICAgICAgICAgICBzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICBydWxlLT5kLnNlbmQubWVtYmVyKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBydWxlIGZvciBkaWZmZXJlbnQgbWVtYmVyXG4iKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgaWYgKHJ1bGUtPmQuc2VuZC5lcnJvciAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSkgIT0gTlVMTCAmJgorICAgICAgICAgICAgICBzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgcnVsZS0+ZC5zZW5kLmVycm9yKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBydWxlIGZvciBkaWZmZXJlbnQgZXJyb3IgbmFtZVxuIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAKKyAgICAgIGlmIChydWxlLT5kLnNlbmQuZGVzdGluYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIC8qIHJlY2VpdmVyIGNhbiBiZSBOVUxMIGZvciBtZXNzYWdlcyB0aGF0IGFyZSBzZW50IHRvIHRoZQorICAgICAgICAgICAqIG1lc3NhZ2UgYnVzIGl0c2VsZiwgd2UgY2hlY2sgdGhlIHN0cmluZ3MgaW4gdGhhdCBjYXNlIGFzCisgICAgICAgICAgICogYnVpbHQtaW4gc2VydmljZXMgZG9uJ3QgaGF2ZSBhIERCdXNDb25uZWN0aW9uIGJ1dCBtZXNzYWdlcworICAgICAgICAgICAqIHRvIHRoZW0gaGF2ZSBhIGRlc3RpbmF0aW9uIHNlcnZpY2UgbmFtZS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAocmVjZWl2ZXIgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX2Rlc3RpbmF0aW9uIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQuc2VuZC5kZXN0aW5hdGlvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgcnVsZSBiZWNhdXNlIG1lc3NhZ2UgZGVzdCBpcyBub3QgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlLT5kLnNlbmQuZGVzdGluYXRpb24pOworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgREJ1c1N0cmluZyBzdHI7CisgICAgICAgICAgICAgIEJ1c1NlcnZpY2UgKnNlcnZpY2U7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgcnVsZS0+ZC5zZW5kLmRlc3RpbmF0aW9uKTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIHNlcnZpY2UgPSBidXNfcmVnaXN0cnlfbG9va3VwIChyZWdpc3RyeSwgJnN0cik7CisgICAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgcnVsZSBiZWNhdXNlIGRlc3QgJXMgZG9lc24ndCBleGlzdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQuc2VuZC5kZXN0aW5hdGlvbik7CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKCFidXNfc2VydmljZV9oYXNfb3duZXIgKHNlcnZpY2UsIHJlY2VpdmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBydWxlIGJlY2F1c2UgZGVzdCAlcyBpc24ndCBvd25lZCBieSByZWNlaXZlclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQuc2VuZC5kZXN0aW5hdGlvbik7CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgLyogVXNlIHRoaXMgcnVsZSAqLworICAgICAgYWxsb3dlZCA9IHJ1bGUtPmFsbG93OworICAgICAgKmxvZyA9IHJ1bGUtPmQuc2VuZC5sb2c7CisgICAgICAoKnRvZ2dsZXMpKys7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHVzZWQgcnVsZSwgYWxsb3cgbm93ID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkKTsKKyAgICB9CisKKyAgcmV0dXJuIGFsbG93ZWQ7Cit9CisKKy8qIFNlZSBkb2NzIG9uIHdoYXQgdGhlIGFyZ3MgbWVhbiBvbiBidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3koKQorICogY29tbWVudAorICovCitkYnVzX2Jvb2xfdAorYnVzX2NsaWVudF9wb2xpY3lfY2hlY2tfY2FuX3JlY2VpdmUgKEJ1c0NsaWVudFBvbGljeSAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1JlZ2lzdHJ5ICAgICAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICByZXF1ZXN0ZWRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICphZGRyZXNzZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqcHJvcG9zZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgKnRvZ2dsZXMpCit7CisgIERCdXNMaXN0ICpsaW5rOworICBkYnVzX2Jvb2xfdCBhbGxvd2VkOworICBkYnVzX2Jvb2xfdCBlYXZlc2Ryb3BwaW5nOworCisgIGVhdmVzZHJvcHBpbmcgPQorICAgIGFkZHJlc3NlZF9yZWNpcGllbnQgIT0gcHJvcG9zZWRfcmVjaXBpZW50ICYmCisgICAgZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSkgIT0gTlVMTDsKKyAgCisgIC8qIHBvbGljeS0+cnVsZXMgaXMgaW4gdGhlIG9yZGVyIHRoZSBydWxlcyBhcHBlYXJlZAorICAgKiBpbiB0aGUgY29uZmlnIGZpbGUsIGkuZS4gbGFzdCBydWxlIHRoYXQgYXBwbGllcyB3aW5zCisgICAqLworCisgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIGNoZWNraW5nIHJlY2VpdmUgcnVsZXMsIGVhdmVzZHJvcHBpbmcgPSAlZFxuIiwgZWF2ZXNkcm9wcGluZyk7CisgICp0b2dnbGVzID0gMDsKKyAgCisgIGFsbG93ZWQgPSBGQUxTRTsKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZwb2xpY3ktPnJ1bGVzKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBCdXNQb2xpY3lSdWxlICpydWxlID0gbGluay0+ZGF0YTsKKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnBvbGljeS0+cnVsZXMsIGxpbmspOyAgICAgIAorICAgICAgCisgICAgICBpZiAocnVsZS0+dHlwZSAhPSBCVVNfUE9MSUNZX1JVTEVfUkVDRUlWRSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIG5vbi1yZWNlaXZlIHJ1bGVcbiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIGlmIChydWxlLT5kLnJlY2VpdmUubWVzc2FnZV90eXBlICE9IERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSAhPSBydWxlLT5kLnJlY2VpdmUubWVzc2FnZV90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBydWxlIGZvciBkaWZmZXJlbnQgbWVzc2FnZSB0eXBlXG4iKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgLyogZm9yIGFsbG93LCBlYXZlc2Ryb3A9ZmFsc2UgbWVhbnMgdGhlIHJ1bGUgZG9lc24ndCBhcHBseSB3aGVuCisgICAgICAgKiBlYXZlc2Ryb3BwaW5nLiBlYXZlc2Ryb3A9dHJ1ZSBtZWFucyBhbHdheXMgYWxsb3cuCisgICAgICAgKi8KKyAgICAgIGlmIChlYXZlc2Ryb3BwaW5nICYmIHJ1bGUtPmFsbG93ICYmICFydWxlLT5kLnJlY2VpdmUuZWF2ZXNkcm9wKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgYWxsb3cgcnVsZSBzaW5jZSBpdCBkb2Vzbid0IGFwcGx5IHRvIGVhdmVzZHJvcHBpbmdcbiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIC8qIGZvciBkZW55LCBlYXZlc2Ryb3A9dHJ1ZSBtZWFucyB0aGUgcnVsZSBhcHBsaWVzIG9ubHkgd2hlbgorICAgICAgICogZWF2ZXNkcm9wcGluZzsgZWF2ZXNkcm9wPWZhbHNlIG1lYW5zIGFsd2F5cyBkZW55LgorICAgICAgICovCisgICAgICBpZiAoIWVhdmVzZHJvcHBpbmcgJiYgIXJ1bGUtPmFsbG93ICYmIHJ1bGUtPmQucmVjZWl2ZS5lYXZlc2Ryb3ApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBkZW55IHJ1bGUgc2luY2UgaXQgb25seSBhcHBsaWVzIHRvIGVhdmVzZHJvcHBpbmdcbiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIC8qIElmIGl0J3MgYSByZXBseSwgdGhlIHJlcXVlc3RlZF9yZXBseSBmbGFnIGtpY2tzIGluICovCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBmb3IgYWxsb3csIHJlcXVlc3RlZF9yZXBseT10cnVlIG1lYW5zIHRoZSBydWxlIGFwcGxpZXMKKyAgICAgICAgICAgKiBvbmx5IHdoZW4gcmVwbHkgd2FzIHJlcXVlc3RlZC4gcmVxdWVzdGVkX3JlcGx5PWZhbHNlIG1lYW5zCisgICAgICAgICAgICogYWx3YXlzIGFsbG93LgorICAgICAgICAgICAqLworICAgICAgICAgIGlmICghcmVxdWVzdGVkX3JlcGx5ICYmIHJ1bGUtPmFsbG93ICYmIHJ1bGUtPmQucmVjZWl2ZS5yZXF1ZXN0ZWRfcmVwbHkgJiYgIXJ1bGUtPmQucmVjZWl2ZS5lYXZlc2Ryb3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIGFsbG93IHJ1bGUgc2luY2UgaXQgb25seSBhcHBsaWVzIHRvIHJlcXVlc3RlZCByZXBsaWVzIGFuZCBkb2VzIG5vdCBhbGxvdyBlYXZlc2Ryb3BwaW5nXG4iKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBmb3IgZGVueSwgcmVxdWVzdGVkX3JlcGx5PWZhbHNlIG1lYW5zIHRoZSBydWxlIGFwcGxpZXMgb25seQorICAgICAgICAgICAqIHdoZW4gdGhlIHJlcGx5IHdhcyBub3QgcmVxdWVzdGVkLiByZXF1ZXN0ZWRfcmVwbHk9dHJ1ZSBtZWFucyB0aGUKKyAgICAgICAgICAgKiBydWxlIGFsd2F5cyBhcHBsaWVzLgorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChyZXF1ZXN0ZWRfcmVwbHkgJiYgIXJ1bGUtPmFsbG93ICYmICFydWxlLT5kLnJlY2VpdmUucmVxdWVzdGVkX3JlcGx5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBkZW55IHJ1bGUgc2luY2UgaXQgb25seSBhcHBsaWVzIHRvIHVucmVxdWVzdGVkIHJlcGxpZXNcbiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAocnVsZS0+ZC5yZWNlaXZlLnBhdGggIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgc3RyY21wIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQucmVjZWl2ZS5wYXRoKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBydWxlIGZvciBkaWZmZXJlbnQgcGF0aFxuIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAKKyAgICAgIGlmIChydWxlLT5kLnJlY2VpdmUuaW50ZXJmYWNlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBUaGUgaW50ZXJmYWNlIGlzIG9wdGlvbmFsIGluIG1lc3NhZ2VzLiBGb3IgYWxsb3cgcnVsZXMsIGlmIHRoZSBtZXNzYWdlCisgICAgICAgICAgICogaGFzIG5vIGludGVyZmFjZSB3ZSB3YW50IHRvIHNraXAgdGhlIHJ1bGUgKGFuZCB0aHVzIG5vdCBhbGxvdyk7CisgICAgICAgICAgICogZm9yIGRlbnkgcnVsZXMsIGlmIHRoZSBtZXNzYWdlIGhhcyBubyBpbnRlcmZhY2Ugd2Ugd2FudCB0byB1c2UgdGhlCisgICAgICAgICAgICogcnVsZSAoYW5kIHRodXMgZGVueSkuCisgICAgICAgICAgICovCisgICAgICAgICAgZGJ1c19ib29sX3Qgbm9faW50ZXJmYWNlOworCisgICAgICAgICAgbm9faW50ZXJmYWNlID0gZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID09IE5VTEw7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKChub19pbnRlcmZhY2UgJiYgcnVsZS0+YWxsb3cpIHx8CisgICAgICAgICAgICAgICghbm9faW50ZXJmYWNlICYmCisgICAgICAgICAgICAgICBzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcnVsZS0+ZC5yZWNlaXZlLmludGVyZmFjZSkgIT0gMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIHJ1bGUgZm9yIGRpZmZlcmVudCBpbnRlcmZhY2VcbiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgIAorCisgICAgICBpZiAocnVsZS0+ZC5yZWNlaXZlLm1lbWJlciAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSAhPSBOVUxMICYmCisgICAgICAgICAgICAgIHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQucmVjZWl2ZS5tZW1iZXIpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIHJ1bGUgZm9yIGRpZmZlcmVudCBtZW1iZXJcbiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBpZiAocnVsZS0+ZC5yZWNlaXZlLmVycm9yICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSAhPSBOVUxMICYmCisgICAgICAgICAgICAgIHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICBydWxlLT5kLnJlY2VpdmUuZXJyb3IpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIHJ1bGUgZm9yIGRpZmZlcmVudCBlcnJvciBuYW1lXG4iKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKHJ1bGUtPmQucmVjZWl2ZS5vcmlnaW4gIT0gTlVMTCkKKyAgICAgICAgeyAgICAgICAgICAKKyAgICAgICAgICAvKiBzZW5kZXIgY2FuIGJlIE5VTEwgZm9yIG1lc3NhZ2VzIHRoYXQgb3JpZ2luYXRlIGZyb20gdGhlCisgICAgICAgICAgICogbWVzc2FnZSBidXMgaXRzZWxmLCB3ZSBjaGVjayB0aGUgc3RyaW5ncyBpbiB0aGF0IGNhc2UgYXMKKyAgICAgICAgICAgKiBidWlsdC1pbiBzZXJ2aWNlcyBkb24ndCBoYXZlIGEgREJ1c0Nvbm5lY3Rpb24gYnV0IHdpbGwKKyAgICAgICAgICAgKiBzdGlsbCBzZXQgdGhlIHNlbmRlciBvbiB0aGVpciBtZXNzYWdlcy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoc2VuZGVyID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2hhc19zZW5kZXIgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQucmVjZWl2ZS5vcmlnaW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIHJ1bGUgYmVjYXVzZSBtZXNzYWdlIHNlbmRlciBpcyBub3QgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlLT5kLnJlY2VpdmUub3JpZ2luKTsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJ1c1NlcnZpY2UgKnNlcnZpY2U7CisgICAgICAgICAgICAgIERCdXNTdHJpbmcgc3RyOworCisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBydWxlLT5kLnJlY2VpdmUub3JpZ2luKTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIHNlcnZpY2UgPSBidXNfcmVnaXN0cnlfbG9va3VwIChyZWdpc3RyeSwgJnN0cik7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoc2VydmljZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIHJ1bGUgYmVjYXVzZSBvcmlnaW4gJXMgZG9lc24ndCBleGlzdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQucmVjZWl2ZS5vcmlnaW4pOworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmICghYnVzX3NlcnZpY2VfaGFzX293bmVyIChzZXJ2aWNlLCBzZW5kZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIHJ1bGUgYmVjYXVzZSBvcmlnaW4gJXMgaXNuJ3Qgb3duZWQgYnkgc2VuZGVyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZS0+ZC5yZWNlaXZlLm9yaWdpbik7CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIAorICAgICAgLyogVXNlIHRoaXMgcnVsZSAqLworICAgICAgYWxsb3dlZCA9IHJ1bGUtPmFsbG93OworICAgICAgKCp0b2dnbGVzKSsrOworCisgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSB1c2VkIHJ1bGUsIGFsbG93IG5vdyA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZCk7CisgICAgfQorCisgIHJldHVybiBhbGxvd2VkOworfQorCisKKworc3RhdGljIGRidXNfYm9vbF90CitidXNfcnVsZXNfY2hlY2tfY2FuX293biAoREJ1c0xpc3QgKnJ1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnNlcnZpY2VfbmFtZSkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIGRidXNfYm9vbF90IGFsbG93ZWQ7CisgIAorICAvKiBydWxlcyBpcyBpbiB0aGUgb3JkZXIgdGhlIHJ1bGVzIGFwcGVhcmVkCisgICAqIGluIHRoZSBjb25maWcgZmlsZSwgaS5lLiBsYXN0IHJ1bGUgdGhhdCBhcHBsaWVzIHdpbnMKKyAgICovCisKKyAgYWxsb3dlZCA9IEZBTFNFOworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnJ1bGVzKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBCdXNQb2xpY3lSdWxlICpydWxlID0gbGluay0+ZGF0YTsKKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnJ1bGVzLCBsaW5rKTsKKyAgICAgIAorICAgICAgLyogUnVsZSBpcyBza2lwcGVkIGlmIGl0IHNwZWNpZmllcyBhIGRpZmZlcmVudCBzZXJ2aWNlIG5hbWUgZnJvbQorICAgICAgICogdGhlIGRlc2lyZWQgb25lLgorICAgICAgICovCisgICAgICAKKyAgICAgIGlmIChydWxlLT50eXBlICE9IEJVU19QT0xJQ1lfUlVMRV9PV04pCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpZiAoIXJ1bGUtPmQub3duLnByZWZpeCAmJiBydWxlLT5kLm93bi5zZXJ2aWNlX25hbWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyIChzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQub3duLnNlcnZpY2VfbmFtZSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAocnVsZS0+ZC5vd24ucHJlZml4KQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgY2hhciAqZGF0YTsKKyAgICAgICAgICBjaGFyIG5leHRfY2hhcjsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlLT5kLm93bi5zZXJ2aWNlX25hbWUpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBkYXRhID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpOworICAgICAgICAgIG5leHRfY2hhciA9IGRhdGFbc3RybGVuIChydWxlLT5kLm93bi5zZXJ2aWNlX25hbWUpXTsKKyAgICAgICAgICBpZiAobmV4dF9jaGFyICE9ICdcMCcgJiYgbmV4dF9jaGFyICE9ICcuJykKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIC8qIFVzZSB0aGlzIHJ1bGUgKi8KKyAgICAgIGFsbG93ZWQgPSBydWxlLT5hbGxvdzsKKyAgICB9CisKKyAgcmV0dXJuIGFsbG93ZWQ7Cit9CisKK2RidXNfYm9vbF90CitidXNfY2xpZW50X3BvbGljeV9jaGVja19jYW5fb3duIChCdXNDbGllbnRQb2xpY3kgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpzZXJ2aWNlX25hbWUpCit7CisgIHJldHVybiBidXNfcnVsZXNfY2hlY2tfY2FuX293biAocG9saWN5LT5ydWxlcywgc2VydmljZV9uYW1lKTsKK30KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKK2RidXNfYm9vbF90CitidXNfcG9saWN5X2NoZWNrX2Nhbl9vd24gKEJ1c1BvbGljeSAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqc2VydmljZV9uYW1lKQoreworICByZXR1cm4gYnVzX3J1bGVzX2NoZWNrX2Nhbl9vd24gKHBvbGljeS0+ZGVmYXVsdF9ydWxlcywgc2VydmljZV9uYW1lKTsKK30KKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCisKZGlmZiAtLWdpdCBhL2RidXMvYnVzL3BvbGljeS5oIGIvZGJ1cy9idXMvcG9saWN5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZmNmY0OAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvYnVzL3BvbGljeS5oCkBAIC0wLDAgKzEsMTY5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIHBvbGljeS5oICBCdXMgc2VjdXJpdHkgcG9saWN5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgQlVTX1BPTElDWV9ICisjZGVmaW5lIEJVU19QT0xJQ1lfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKyNpbmNsdWRlICJidXMuaCIKKwordHlwZWRlZiBlbnVtCit7CisgIEJVU19QT0xJQ1lfUlVMRV9TRU5ELAorICBCVVNfUE9MSUNZX1JVTEVfUkVDRUlWRSwKKyAgQlVTX1BPTElDWV9SVUxFX09XTiwKKyAgQlVTX1BPTElDWV9SVUxFX1VTRVIsCisgIEJVU19QT0xJQ1lfUlVMRV9HUk9VUAorfSBCdXNQb2xpY3lSdWxlVHlwZTsKKworLyoqIGRldGVybWluZXMgd2hldGhlciB0aGUgcnVsZSBhZmZlY3RzIGEgY29ubmVjdGlvbiwgb3Igc29tZSBnbG9iYWwgaXRlbSAqLworI2RlZmluZSBCVVNfUE9MSUNZX1JVTEVfSVNfUEVSX0NMSUVOVChydWxlKSAoISgocnVsZSktPnR5cGUgPT0gQlVTX1BPTElDWV9SVUxFX1VTRVIgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocnVsZSktPnR5cGUgPT0gQlVTX1BPTElDWV9SVUxFX0dST1VQKSkKKworc3RydWN0IEJ1c1BvbGljeVJ1bGUKK3sKKyAgaW50IHJlZmNvdW50OworICAKKyAgQnVzUG9saWN5UnVsZVR5cGUgdHlwZTsKKworICB1bnNpZ25lZCBpbnQgYWxsb3cgOiAxOyAvKio8ICNUUlVFIGlmIHRoaXMgYWxsb3dzLCAjRkFMU0UgaWYgaXQgZGVuaWVzICovCisgIAorICB1bmlvbgorICB7CisgICAgc3RydWN0CisgICAgeworICAgICAgLyogbWVzc2FnZSB0eXBlIGNhbiBiZSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEIG1lYW5pbmcgImFueSIgKi8KKyAgICAgIGludCAgIG1lc3NhZ2VfdHlwZTsKKyAgICAgIC8qIGFueSBvZiB0aGVzZSBjYW4gYmUgTlVMTCBtZWFuaW5nICJhbnkiICovCisgICAgICBjaGFyICpwYXRoOworICAgICAgY2hhciAqaW50ZXJmYWNlOworICAgICAgY2hhciAqbWVtYmVyOworICAgICAgY2hhciAqZXJyb3I7CisgICAgICBjaGFyICpkZXN0aW5hdGlvbjsKKyAgICAgIHVuc2lnbmVkIGludCBlYXZlc2Ryb3AgOiAxOworICAgICAgdW5zaWduZWQgaW50IHJlcXVlc3RlZF9yZXBseSA6IDE7CisgICAgICB1bnNpZ25lZCBpbnQgbG9nIDogMTsKKyAgICB9IHNlbmQ7CisKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICAvKiBtZXNzYWdlIHR5cGUgY2FuIGJlIERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQgbWVhbmluZyAiYW55IiAqLworICAgICAgaW50ICAgbWVzc2FnZV90eXBlOworICAgICAgLyogYW55IG9mIHRoZXNlIGNhbiBiZSBOVUxMIG1lYW5pbmcgImFueSIgKi8KKyAgICAgIGNoYXIgKnBhdGg7CisgICAgICBjaGFyICppbnRlcmZhY2U7CisgICAgICBjaGFyICptZW1iZXI7CisgICAgICBjaGFyICplcnJvcjsKKyAgICAgIGNoYXIgKm9yaWdpbjsKKyAgICAgIHVuc2lnbmVkIGludCBlYXZlc2Ryb3AgOiAxOworICAgICAgdW5zaWduZWQgaW50IHJlcXVlc3RlZF9yZXBseSA6IDE7CisgICAgfSByZWNlaXZlOworCisgICAgc3RydWN0CisgICAgeworICAgICAgLyogY2FuIGJlIE5VTEwgbWVhbmluZyAiYW55IiAqLworICAgICAgY2hhciAqc2VydmljZV9uYW1lOworICAgICAgLyogaWYgcHJlZml4IGlzIHNldCwgYW55IG5hbWUgc3RhcnRpbmcgd2l0aCBzZXJ2aWNlX25hbWUgY2FuIGJlIG93bmVkICovCisgICAgICB1bnNpZ25lZCBpbnQgcHJlZml4IDogMTsKKyAgICB9IG93bjsKKworICAgIHN0cnVjdAorICAgIHsKKyAgICAgIC8qIGNhbiBiZSBEQlVTX1VJRF9VTlNFVCBtZWFuaW5nICJhbnkiICovCisgICAgICBkYnVzX3VpZF90IHVpZDsKKyAgICB9IHVzZXI7CisKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICAvKiBjYW4gYmUgREJVU19HSURfVU5TRVQgbWVhbmluZyAiYW55IiAqLworICAgICAgZGJ1c19naWRfdCBnaWQ7CisgICAgfSBncm91cDsKKworICB9IGQ7Cit9OworCitCdXNQb2xpY3lSdWxlKiBidXNfcG9saWN5X3J1bGVfbmV3ICAgKEJ1c1BvbGljeVJ1bGVUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGFsbG93KTsKK0J1c1BvbGljeVJ1bGUqIGJ1c19wb2xpY3lfcnVsZV9yZWYgICAoQnVzUG9saWN5UnVsZSAgICAqcnVsZSk7Cit2b2lkICAgICAgICAgICBidXNfcG9saWN5X3J1bGVfdW5yZWYgKEJ1c1BvbGljeVJ1bGUgICAgKnJ1bGUpOworCitCdXNQb2xpY3kqICAgICAgIGJ1c19wb2xpY3lfbmV3ICAgICAgICAgICAgICAgICAgICh2b2lkKTsKK0J1c1BvbGljeSogICAgICAgYnVzX3BvbGljeV9yZWYgICAgICAgICAgICAgICAgICAgKEJ1c1BvbGljeSAgICAgICAgKnBvbGljeSk7Cit2b2lkICAgICAgICAgICAgIGJ1c19wb2xpY3lfdW5yZWYgICAgICAgICAgICAgICAgIChCdXNQb2xpY3kgICAgICAgICpwb2xpY3kpOworQnVzQ2xpZW50UG9saWN5KiBidXNfcG9saWN5X2NyZWF0ZV9jbGllbnRfcG9saWN5ICAoQnVzUG9saWN5ICAgICAgICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90ICAgICAgYnVzX3BvbGljeV9hbGxvd191bml4X3VzZXIgICAgICAgKEJ1c1BvbGljeSAgICAgICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgIHVpZCk7CitkYnVzX2Jvb2xfdCAgICAgIGJ1c19wb2xpY3lfYWxsb3dfd2luZG93c191c2VyICAgIChCdXNQb2xpY3kgICAgICAgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICp3aW5kb3dzX3NpZCk7CitkYnVzX2Jvb2xfdCAgICAgIGJ1c19wb2xpY3lfYXBwZW5kX2RlZmF1bHRfcnVsZSAgIChCdXNQb2xpY3kgICAgICAgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQb2xpY3lSdWxlICAgICpydWxlKTsKK2RidXNfYm9vbF90ICAgICAgYnVzX3BvbGljeV9hcHBlbmRfbWFuZGF0b3J5X3J1bGUgKEJ1c1BvbGljeSAgICAgICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1BvbGljeVJ1bGUgICAgKnJ1bGUpOworZGJ1c19ib29sX3QgICAgICBidXNfcG9saWN5X2FwcGVuZF91c2VyX3J1bGUgICAgICAoQnVzUG9saWN5ICAgICAgICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aWRfdCAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzUG9saWN5UnVsZSAgICAqcnVsZSk7CitkYnVzX2Jvb2xfdCAgICAgIGJ1c19wb2xpY3lfYXBwZW5kX2dyb3VwX3J1bGUgICAgIChCdXNQb2xpY3kgICAgICAgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2dpZF90ICAgICAgICBnaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQb2xpY3lSdWxlICAgICpydWxlKTsKK2RidXNfYm9vbF90ICAgICAgYnVzX3BvbGljeV9hcHBlbmRfY29uc29sZV9ydWxlICAgKEJ1c1BvbGljeSAgICAgICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICBhdF9jb25zb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzUG9saWN5UnVsZSAgICAqcnVsZSk7CisKK2RidXNfYm9vbF90ICAgICAgYnVzX3BvbGljeV9tZXJnZSAgICAgICAgICAgICAgICAgKEJ1c1BvbGljeSAgICAgICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1BvbGljeSAgICAgICAgKnRvX2Fic29yYik7CisKK0J1c0NsaWVudFBvbGljeSogYnVzX2NsaWVudF9wb2xpY3lfbmV3ICAgICAgICAgICAgICAgKHZvaWQpOworQnVzQ2xpZW50UG9saWN5KiBidXNfY2xpZW50X3BvbGljeV9yZWYgICAgICAgICAgICAgICAoQnVzQ2xpZW50UG9saWN5ICAqcG9saWN5KTsKK3ZvaWQgICAgICAgICAgICAgYnVzX2NsaWVudF9wb2xpY3lfdW5yZWYgICAgICAgICAgICAgKEJ1c0NsaWVudFBvbGljeSAgKnBvbGljeSk7CitkYnVzX2Jvb2xfdCAgICAgIGJ1c19jbGllbnRfcG9saWN5X2NoZWNrX2Nhbl9zZW5kICAgIChCdXNDbGllbnRQb2xpY3kgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNSZWdpc3RyeSAgICAgICpyZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIHJlcXVlc3RlZF9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgKnJlY2VpdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCAgICAgKnRvZ2dsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICpsb2cpOworZGJ1c19ib29sX3QgICAgICBidXNfY2xpZW50X3BvbGljeV9jaGVja19jYW5fcmVjZWl2ZSAoQnVzQ2xpZW50UG9saWN5ICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzUmVnaXN0cnkgICAgICAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICByZXF1ZXN0ZWRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICphZGRyZXNzZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAqcHJvcG9zZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCAgICAgKnRvZ2dsZXMpOworZGJ1c19ib29sX3QgICAgICBidXNfY2xpZW50X3BvbGljeV9jaGVja19jYW5fb3duICAgICAoQnVzQ2xpZW50UG9saWN5ICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqc2VydmljZV9uYW1lKTsKK2RidXNfYm9vbF90ICAgICAgYnVzX2NsaWVudF9wb2xpY3lfYXBwZW5kX3J1bGUgICAgICAgKEJ1c0NsaWVudFBvbGljeSAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1BvbGljeVJ1bGUgICAgKnJ1bGUpOwordm9pZCAgICAgICAgICAgICBidXNfY2xpZW50X3BvbGljeV9vcHRpbWl6ZSAgICAgICAgICAoQnVzQ2xpZW50UG9saWN5ICAqcG9saWN5KTsKKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKK2RidXNfYm9vbF90ICAgICAgYnVzX3BvbGljeV9jaGVja19jYW5fb3duICAgICAoQnVzUG9saWN5ICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpzZXJ2aWNlX25hbWUpOworI2VuZGlmCisKKyNlbmRpZiAvKiBCVVNfUE9MSUNZX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvYnVzL3JjLm1lc3NhZ2VidXMuaW4gYi9kYnVzL2J1cy9yYy5tZXNzYWdlYnVzLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MmNhNzcKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2J1cy9yYy5tZXNzYWdlYnVzLmluCkBAIC0wLDAgKzEsNzkgQEAKKyMhL2Jpbi9zaAorIworIyBtZXNzYWdlYnVzOiAgIFRoZSBELUJVUyBzeXN0ZW13aWRlIG1lc3NhZ2UgYnVzCisjCisjIGNoa2NvbmZpZzogMzQ1IDk3IDAzCisjIGRlc2NyaXB0aW9uOiAgVGhpcyBpcyBhIGRhZW1vbiB3aGljaCBicm9hZGNhc3RzIG5vdGlmaWNhdGlvbnMgb2Ygc3lzdGVtIGV2ZW50cyBcCisjICAgICAgICAgICAgICAgYW5kIG90aGVyIG1lc3NhZ2VzLiBTZWUgaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8KKyMKKyMgcHJvY2Vzc25hbWU6IGRidXMtZGFlbW9uCisjIHBpZGZpbGU6IEBEQlVTX1NZU1RFTV9QSURfRklMRUAKKyMKKworIyBTYW5pdHkgY2hlY2tzLgorI1sgLXggQEVYUEFOREVEX0JJTkRJUkAvZGJ1cy1kYWVtb24gXSB8fCBleGl0IDAKKworIyBTb3VyY2UgZnVuY3Rpb24gbGlicmFyeS4KKyMuIEBFWFBBTkRFRF9TWVNDT05GRElSQC9yYy5kL2luaXQuZC9mdW5jdGlvbnMKKworIyBzbyB3ZSBjYW4gcmVhcnJhbmdlIHRoaXMgZWFzaWx5CisjcHJvY2Vzc25hbWU9ZGJ1cy1kYWVtb24KKyNzZXJ2aWNlbmFtZT1tZXNzYWdlYnVzCisKKyNSRVRWQUw9MAorCitzdGFydCgpIHsKKyAgICBlY2hvICJTdGFydGluZyBzeXN0ZW0gbWVzc2FnZSBidXMiCisgICAgaWYgWyAteCBARVhQQU5ERURfQklORElSQC9kYnVzLXV1aWRnZW4gXSA7IHRoZW4KKyAgICAgICAgQEVYUEFOREVEX0JJTkRJUkAvZGJ1cy11dWlkZ2VuIC0tZW5zdXJlCisgICAgZmkKKworICAgIGlmIFsgLXggQEVYUEFOREVEX0JJTkRJUkAvZGJ1cy1kYWVtb24gXTt0aGVuCisgICAgCUBFWFBBTkRFRF9CSU5ESVJAL2RidXMtZGFlbW9uIC0tc3lzdGVtCisgICAgZmkKKyAgICAjZGFlbW9uIC0tY2hlY2sgJHNlcnZpY2VuYW1lICRwcm9jZXNzbmFtZSAtLXN5c3RlbQorICAgICNSRVRWQUw9JD8KKyAgICAjZWNobworICAgICNbICRSRVRWQUwgLWVxIDAgXSAmJiB0b3VjaCBARVhQQU5ERURfTE9DQUxTVEFURURJUkAvbG9jay9zdWJzeXMvJHNlcnZpY2VuYW1lCit9CisKK3N0b3AoKSB7CisgICAgZWNobyAiU3RvcHBpbmcgc3lzdGVtIG1lc3NhZ2UgYnVzIgorCisgICAgIyMgd2UgZG9uJ3Qgd2FudCB0byBraWxsIGFsbCB0aGUgcGVyLXVzZXIgJHByb2Nlc3NuYW1lLCB3ZSB3YW50CisgICAgIyMgdG8gdXNlIHRoZSBwaWQgZmlsZSAqb25seSo7IGJlY2F1c2Ugd2UgdXNlIHRoZSBmYWtlIG5vbmV4aXN0ZW50IAorICAgICMjIHByb2dyYW0gbmFtZSAiJHNlcnZpY2VuYW1lIiB0aGF0IHNob3VsZCBiZSBzYWZlLWlzaAorICAgIGtpbGxhbGwgZGJ1cy1kYWVtb24KKyAgICAjUkVUVkFMPSQ/CisgICAgI2VjaG8KKyAgICAjaWYgWyAkUkVUVkFMIC1lcSAwIF07IHRoZW4KKyAgICAjICAgIHJtIC1mIEBFWFBBTkRFRF9MT0NBTFNUQVRFRElSQC9sb2NrL3N1YnN5cy8kc2VydmljZW5hbWUKKyAgICAjICAgIHJtIC1mIEBEQlVTX1NZU1RFTV9QSURfRklMRUAKKyAgICAjZmkKK30KKworIyBTZWUgaG93IHdlIHdlcmUgY2FsbGVkLgorY2FzZSAiJDEiIGluCisgICAgc3RhcnQpCisgICAgICAgIHN0YXJ0CisgICAgICAgIDs7CisgICAgc3RvcCkKKyAgICAgICAgc3RvcAorICAgICAgICA7OworICAgIHN0YXR1cykKKyAgICAgICAgc3RhdHVzICRzZXJ2aWNlbmFtZQorICAgICAgICBSRVRWQUw9JD8KKyAgICAgICAgOzsKKyAgICByZXN0YXJ0KQorICAgICAgICBzdG9wCisgICAgICAgIHN0YXJ0CisgICAgICAgIDs7CisgICAgcmVsb2FkKQorICAgICAgICBlY2hvICJNZXNzYWdlIGJ1cyBjYW4ndCByZWxvYWQgaXRzIGNvbmZpZ3VyYXRpb24sIHlvdSBoYXZlIHRvIHJlc3RhcnQgaXQiCisgICAgICAgIFJFVFZBTD0kPworICAgICAgICA7OworICAgICopCisgICAgICAgIGVjaG8gJCJVc2FnZTogJDAge3N0YXJ0fHN0b3B8c3RhdHVzfHJlc3RhcnR8cmVsb2FkfSIKKyAgICAgICAgOzsKK2VzYWMKK2V4aXQgJFJFVFZBTApkaWZmIC0tZ2l0IGEvZGJ1cy9idXMvc2VsaW51eC5jIGIvZGJ1cy9idXMvc2VsaW51eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2Mjg3ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2J1cy9zZWxpbnV4LmMKQEAgLTAsMCArMSwxMDkzIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0KKyAqIHNlbGludXguYyAgU0VMaW51eCBzZWN1cml0eSBjaGVja3MgZm9yIEQtQnVzCisgKgorICogQXV0aG9yOiBNYXR0aGV3IFJpY2thcmQgPG1qcmlja2FAZXBvY2gubmNzYy5taWw+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2lmbmRlZiBEQlVTX1dJTgorI2luY2x1ZGUgPGRidXMvZGJ1cy11c2VyZGIuaD4KKyNlbmRpZgorI2luY2x1ZGUgInNlbGludXguaCIKKyNpbmNsdWRlICJzZXJ2aWNlcy5oIgorI2luY2x1ZGUgInBvbGljeS5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiY29uZmlnLXBhcnNlci5oIgorCisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU0VMSU5VWAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxzZWxpbnV4L3NlbGludXguaD4KKyNpbmNsdWRlIDxzZWxpbnV4L2F2Yy5oPgorI2luY2x1ZGUgPHNlbGludXgvYXZfcGVybWlzc2lvbnMuaD4KKyNpbmNsdWRlIDxzZWxpbnV4L2ZsYXNrLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxncnAuaD4KKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KKyNpZmRlZiBIQVZFX0xJQkFVRElUCisjaW5jbHVkZSA8Y2FwLW5nLmg+CisjaW5jbHVkZSA8bGliYXVkaXQuaD4KKyNlbmRpZiAvKiBIQVZFX0xJQkFVRElUICovCisKKyNkZWZpbmUgQlVTX1NJRF9GUk9NX1NFTElOVVgoc2lkKSAgKChCdXNTRUxpbnV4SUQqKSAoc2lkKSkKKyNkZWZpbmUgU0VMSU5VWF9TSURfRlJPTV9CVVMoc2lkKSAgKChzZWN1cml0eV9pZF90KSAoc2lkKSkKKworI2lmZGVmIEhBVkVfU0VMSU5VWAorLyogU3RvcmUgdGhlIHZhbHVlIHRlbGxpbmcgdXMgaWYgU0VMaW51eCBpcyBlbmFibGVkIGluIHRoZSBrZXJuZWwuICovCitzdGF0aWMgZGJ1c19ib29sX3Qgc2VsaW51eF9lbmFibGVkID0gRkFMU0U7CisKKy8qIFN0b3JlIGFuIGF2Y19lbnRyeV9yZWYgdG8gc3BlZWQgQVZDIGRlY2lzaW9ucy4gKi8KK3N0YXRpYyBzdHJ1Y3QgYXZjX2VudHJ5X3JlZiBhZXJlZjsKKworLyogU3RvcmUgdGhlIFNJRCBvZiB0aGUgYnVzIGl0c2VsZiB0byB1c2UgYXMgdGhlIGRlZmF1bHQuICovCitzdGF0aWMgc2VjdXJpdHlfaWRfdCBidXNfc2lkID0gU0VDU0lEX1dJTEQ7CisKKy8qIFRocmVhZCB0byBsaXN0ZW4gZm9yIFNFTGludXggc3RhdHVzIGNoYW5nZXMgdmlhIG5ldGxpbmsuICovCitzdGF0aWMgcHRocmVhZF90IGF2Y19ub3RpZnlfdGhyZWFkOworCisvKiBQcm90b3R5cGVzIGZvciBBVkMgY2FsbGJhY2sgZnVuY3Rpb25zLiAgKi8KK3N0YXRpYyB2b2lkIGxvZ19jYWxsYmFjayAoY29uc3QgY2hhciAqZm10LCAuLi4pOworc3RhdGljIHZvaWQgbG9nX2F1ZGl0X2NhbGxiYWNrICh2b2lkICpkYXRhLCBzZWN1cml0eV9jbGFzc190IGNsYXNzLCBjaGFyICpidWYsIHNpemVfdCBidWZsZWZ0KTsKK3N0YXRpYyB2b2lkICphdmNfY3JlYXRlX3RocmVhZCAodm9pZCAoKnJ1bikgKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGF2Y19zdG9wX3RocmVhZCAodm9pZCAqdGhyZWFkKTsKK3N0YXRpYyB2b2lkICphdmNfYWxsb2NfbG9jayAodm9pZCk7CitzdGF0aWMgdm9pZCBhdmNfZ2V0X2xvY2sgKHZvaWQgKmxvY2spOworc3RhdGljIHZvaWQgYXZjX3JlbGVhc2VfbG9jayAodm9pZCAqbG9jayk7CitzdGF0aWMgdm9pZCBhdmNfZnJlZV9sb2NrICh2b2lkICpsb2NrKTsKKworLyogQVZDIGNhbGxiYWNrIHN0cnVjdHVyZXMgZm9yIHVzZSBpbiBhdmNfaW5pdC4gICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGF2Y19tZW1vcnlfY2FsbGJhY2sgbWVtX2NiID0KK3sKKyAgLmZ1bmNfbWFsbG9jID0gZGJ1c19tYWxsb2MsCisgIC5mdW5jX2ZyZWUgPSBkYnVzX2ZyZWUKK307CitzdGF0aWMgY29uc3Qgc3RydWN0IGF2Y19sb2dfY2FsbGJhY2sgbG9nX2NiID0KK3sKKyAgLmZ1bmNfbG9nID0gbG9nX2NhbGxiYWNrLAorICAuZnVuY19hdWRpdCA9IGxvZ19hdWRpdF9jYWxsYmFjaworfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXZjX3RocmVhZF9jYWxsYmFjayB0aHJlYWRfY2IgPQoreworICAuZnVuY19jcmVhdGVfdGhyZWFkID0gYXZjX2NyZWF0ZV90aHJlYWQsCisgIC5mdW5jX3N0b3BfdGhyZWFkID0gYXZjX3N0b3BfdGhyZWFkCit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBhdmNfbG9ja19jYWxsYmFjayBsb2NrX2NiID0KK3sKKyAgLmZ1bmNfYWxsb2NfbG9jayA9IGF2Y19hbGxvY19sb2NrLAorICAuZnVuY19nZXRfbG9jayA9IGF2Y19nZXRfbG9jaywKKyAgLmZ1bmNfcmVsZWFzZV9sb2NrID0gYXZjX3JlbGVhc2VfbG9jaywKKyAgLmZ1bmNfZnJlZV9sb2NrID0gYXZjX2ZyZWVfbG9jaworfTsKKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KKworLyoqCisgKiBMb2cgY2FsbGJhY2sgdG8gbG9nIGRlbmlhbCBtZXNzYWdlcyBmcm9tIHRoZSBBVkMuCisgKiBUaGlzIGlzIHVzZWQgaW4gYXZjX2luaXQuICBMb2dzIHRvIGJvdGggc3RhbmRhcmQKKyAqIGVycm9yIGFuZCBzeXNsb2dkLgorICoKKyAqIEBwYXJhbSBmbXQgdGhlIGZvcm1hdCBzdHJpbmcKKyAqIEBwYXJhbSB2YXJpYWJsZSBhcmd1bWVudCBsaXN0CisgKi8KKyNpZmRlZiBIQVZFX1NFTElOVVgKKworI2lmZGVmIEhBVkVfTElCQVVESVQKK3N0YXRpYyBpbnQgYXVkaXRfZmQgPSAtMTsKKyNlbmRpZgorCit2b2lkCitidXNfc2VsaW51eF9hdWRpdF9pbml0KHZvaWQpCit7CisjaWZkZWYgSEFWRV9MSUJBVURJVCAgCisgIGF1ZGl0X2ZkID0gYXVkaXRfb3BlbiAoKTsKKworICBpZiAoYXVkaXRfZmQgPCAwKQorICAgIHsKKyAgICAgIC8qIElmIGtlcm5lbCBkb2Vzbid0IHN1cHBvcnQgYXVkaXQsIGJhaWwgb3V0ICovCisgICAgICBpZiAoZXJybm8gPT0gRUlOVkFMIHx8IGVycm5vID09IEVQUk9UT05PU1VQUE9SVCB8fCBlcnJubyA9PSBFQUZOT1NVUFBPUlQpCisgICAgICAgIHJldHVybjsKKyAgICAgIC8qIElmIHVzZXIgYnVzLCBiYWlsIG91dCAqLworICAgICAgaWYgKGVycm5vID09IEVQRVJNICYmIGdldHVpZCgpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgb3BlbmluZyBjb25uZWN0aW9uIHRvIHRoZSBhdWRpdCBzdWJzeXN0ZW0iKTsKKyAgICB9CisjZW5kaWYgLyogSEFWRV9MSUJBVURJVCAqLworfQorCitzdGF0aWMgdm9pZCAKK2xvZ19jYWxsYmFjayAoY29uc3QgY2hhciAqZm10LCAuLi4pIAoreworICB2YV9saXN0IGFwOworCisgIHZhX3N0YXJ0KGFwLCBmbXQpOworCisjaWZkZWYgSEFWRV9MSUJBVURJVAorICBpZiAoYXVkaXRfZmQgPj0gMCkKKyAgeworICAgIGNhcG5nX2dldF9jYXBzX3Byb2Nlc3MoKTsKKyAgICBpZiAoY2FwbmdfaGF2ZV9jYXBhYmlsaXR5KENBUE5HX0VGRkVDVElWRSwgQ0FQX0FVRElUX1dSSVRFKSkKKyAgICB7CisgICAgICBjaGFyIGJ1ZltQQVRIX01BWCoyXTsKKyAgICAKKyAgICAgIC8qIEZJWE1FOiBuZWVkIHRvIGNoYW5nZSB0aGlzIHRvIHNob3cgcmVhbCB1c2VyICovCisgICAgICB2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCBhcCk7CisgICAgICBhdWRpdF9sb2dfdXNlcl9hdmNfbWVzc2FnZShhdWRpdF9mZCwgQVVESVRfVVNFUl9BVkMsIGJ1ZiwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBnZXR1aWQoKSk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisjZW5kaWYgLyogSEFWRV9MSUJBVURJVCAqLworICAKKyAgdnN5c2xvZyAoTE9HX1VTRVIgfCBMT0dfSU5GTywgZm10LCBhcCk7CisgIHZhX2VuZChhcCk7Cit9CisKKy8qKgorICogT24gYSBwb2xpY3kgcmVsb2FkIHdlIG5lZWQgdG8gcmVwYXJzZSB0aGUgU0VMaW51eCBjb25maWd1cmF0aW9uIGZpbGUsIHNpbmNlCisgKiB0aGlzIGNvdWxkIGhhdmUgY2hhbmdlZC4gIFNlbmQgYSBTSUdIVVAgdG8gcmVsb2FkIGFsbCBjb25maWdzLgorICovCitzdGF0aWMgaW50Citwb2xpY3lfcmVsb2FkX2NhbGxiYWNrICh1X2ludDMyX3QgZXZlbnQsIHNlY3VyaXR5X2lkX3Qgc3NpZCwgCisgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cml0eV9pZF90IHRzaWQsIHNlY3VyaXR5X2NsYXNzX3QgdGNsYXNzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc192ZWN0b3JfdCBwZXJtcywgYWNjZXNzX3ZlY3Rvcl90ICpvdXRfcmV0YWluZWQpCit7CisgIGlmIChldmVudCA9PSBBVkNfQ0FMTEJBQ0tfUkVTRVQpCisgICAgcmV0dXJuIHJhaXNlIChTSUdIVVApOworICAKKyAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogTG9nIGFueSBhdXhpbGlhcnkgZGF0YSAKKyAqLworc3RhdGljIHZvaWQKK2xvZ19hdWRpdF9jYWxsYmFjayAodm9pZCAqZGF0YSwgc2VjdXJpdHlfY2xhc3NfdCBjbGFzcywgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVmdCkKK3sKKyAgREJ1c1N0cmluZyAqYXVkbXNnID0gZGF0YTsKKworICBpZiAoYnVmbGVmdCA+IChzaXplX3QpIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoKGF1ZG1zZykpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2NvcHlfdG9fYnVmZmVyX3dpdGhfbnVsIChhdWRtc2csIGJ1ZiwgYnVmbGVmdCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgREJ1c1N0cmluZyBzOworCisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCgmcywgIkJ1ZmZlciB0b28gc21hbGwgZm9yIGF1ZGl0IG1lc3NhZ2UiKTsKKworICAgICAgaWYgKGJ1ZmxlZnQgPiAoc2l6ZV90KSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCgmcykpCisgICAgICAgIF9kYnVzX3N0cmluZ19jb3B5X3RvX2J1ZmZlcl93aXRoX251bCAoJnMsIGJ1ZiwgYnVmbGVmdCk7CisgICAgfQorfQorCisvKioKKyAqIENyZWF0ZSB0aHJlYWQgdG8gbm90aWZ5IHRoZSBBVkMgb2YgZW5mb3JjaW5nIGFuZCBwb2xpY3kgcmVsb2FkCisgKiBjaGFuZ2VzIHZpYSBuZXRsaW5rLgorICoKKyAqIEBwYXJhbSBydW4gdGhlIHRocmVhZCBydW4gZnVuY3Rpb24KKyAqIEByZXR1cm4gcG9pbnRlciB0byB0aGUgdGhyZWFkCisgKi8KK3N0YXRpYyB2b2lkICoKK2F2Y19jcmVhdGVfdGhyZWFkICh2b2lkICgqcnVuKSAodm9pZCkpCit7CisgIGludCByYzsKKworICByYyA9IHB0aHJlYWRfY3JlYXRlICgmYXZjX25vdGlmeV90aHJlYWQsIE5VTEwsICh2b2lkICooKikgKHZvaWQgKikpIHJ1biwgTlVMTCk7CisgIGlmIChyYyAhPSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gc3RhcnQgQVZDIHRocmVhZDogJXNcbiIsIF9kYnVzX3N0cmVycm9yIChyYykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICByZXR1cm4gJmF2Y19ub3RpZnlfdGhyZWFkOworfQorCisvKiBTdG9wIEFWQyBuZXRsaW5rIHRocmVhZC4gICovCitzdGF0aWMgdm9pZAorYXZjX3N0b3BfdGhyZWFkICh2b2lkICp0aHJlYWQpCit7CisgIHB0aHJlYWRfY2FuY2VsICgqKHB0aHJlYWRfdCAqKSB0aHJlYWQpOworfQorCisvKiBBbGxvY2F0ZSBhIG5ldyBBVkMgbG9jay4gICovCitzdGF0aWMgdm9pZCAqCithdmNfYWxsb2NfbG9jayAodm9pZCkKK3sKKyAgcHRocmVhZF9tdXRleF90ICphdmNfbXV0ZXg7CisKKyAgYXZjX211dGV4ID0gZGJ1c19uZXcgKHB0aHJlYWRfbXV0ZXhfdCwgMSk7CisgIGlmIChhdmNfbXV0ZXggPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiQ291bGQgbm90IGNyZWF0ZSBtdXRleDogJXNcbiIsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICBwdGhyZWFkX211dGV4X2luaXQgKGF2Y19tdXRleCwgTlVMTCk7CisKKyAgcmV0dXJuIGF2Y19tdXRleDsKK30KKworLyogQWNxdWlyZSBhbiBBVkMgbG9jay4gICovCitzdGF0aWMgdm9pZAorYXZjX2dldF9sb2NrICh2b2lkICpsb2NrKQoreworICBwdGhyZWFkX211dGV4X2xvY2sgKGxvY2spOworfQorCisvKiBSZWxlYXNlIGFuIEFWQyBsb2NrLiAgKi8KK3N0YXRpYyB2b2lkCithdmNfcmVsZWFzZV9sb2NrICh2b2lkICpsb2NrKQoreworICBwdGhyZWFkX211dGV4X3VubG9jayAobG9jayk7Cit9CisKKy8qIEZyZWUgYW4gQVZDIGxvY2suICAqLworc3RhdGljIHZvaWQKK2F2Y19mcmVlX2xvY2sgKHZvaWQgKmxvY2spCit7CisgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSAobG9jayk7CisgIGRidXNfZnJlZSAobG9jayk7Cit9CisjZW5kaWYgLyogSEFWRV9TRUxJTlVYICovCisKKy8qKgorICogUmV0dXJuIHdoZXRoZXIgb3Igbm90IFNFTGludXggaXMgZW5hYmxlZDsgbXVzdCBiZQorICogY2FsbGVkIGFmdGVyIGJ1c19zZWxpbnV4X2luaXQuCisgKi8KK2RidXNfYm9vbF90CitidXNfc2VsaW51eF9lbmFibGVkICh2b2lkKQoreworI2lmZGVmIEhBVkVfU0VMSU5VWAorICByZXR1cm4gc2VsaW51eF9lbmFibGVkOworI2Vsc2UKKyAgcmV0dXJuIEZBTFNFOworI2VuZGlmIC8qIEhBVkVfU0VMSU5VWCAqLworfQorCisvKioKKyAqIERvIGVhcmx5IGluaXRpYWxpemF0aW9uOyBkZXRlcm1pbmUgd2hldGhlciBTRUxpbnV4IGlzIGVuYWJsZWQuCisgKi8KK2RidXNfYm9vbF90CitidXNfc2VsaW51eF9wcmVfaW5pdCAodm9pZCkKK3sKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyAgaW50IHI7CisgIF9kYnVzX2Fzc2VydCAoYnVzX3NpZCA9PSBTRUNTSURfV0lMRCk7CisgIAorICAvKiBEZXRlcm1pbmUgaWYgd2UgYXJlIHJ1bm5pbmcgYW4gU0VMaW51eCBrZXJuZWwuICovCisgIHIgPSBpc19zZWxpbnV4X2VuYWJsZWQgKCk7CisgIGlmIChyIDwgMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiQ291bGQgbm90IHRlbGwgaWYgU0VMaW51eCBpcyBlbmFibGVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBzZWxpbnV4X2VuYWJsZWQgPSByICE9IDA7CisgIHJldHVybiBUUlVFOworI2Vsc2UKKyAgcmV0dXJuIFRSVUU7CisjZW5kaWYKK30KKworLyoqCisgKiBJbml0aWFsaXplIHRoZSB1c2VyIHNwYWNlIGFjY2VzcyB2ZWN0b3IgY2FjaGUgKEFWQykgZm9yIEQtQnVzIGFuZCBzZXQgdXAKKyAqIGxvZ2dpbmcgY2FsbGJhY2tzLgorICovCitkYnVzX2Jvb2xfdAorYnVzX3NlbGludXhfZnVsbF9pbml0ICh2b2lkKQoreworI2lmZGVmIEhBVkVfU0VMSU5VWAorICBjaGFyICpidXNfY29udGV4dDsKKworICBfZGJ1c19hc3NlcnQgKGJ1c19zaWQgPT0gU0VDU0lEX1dJTEQpOworICAKKyAgaWYgKCFzZWxpbnV4X2VuYWJsZWQpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIlNFTGludXggbm90IGVuYWJsZWQgaW4gdGhpcyBrZXJuZWwuXG4iKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiU0VMaW51eCBpcyBlbmFibGVkIGluIHRoaXMga2VybmVsLlxuIik7CisKKyAgYXZjX2VudHJ5X3JlZl9pbml0ICgmYWVyZWYpOworICBpZiAoYXZjX2luaXQgKCJhdmMiLCAmbWVtX2NiLCAmbG9nX2NiLCAmdGhyZWFkX2NiLCAmbG9ja19jYikgPCAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gc3RhcnQgQWNjZXNzIFZlY3RvciBDYWNoZSAoQVZDKS5cbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJBY2Nlc3MgVmVjdG9yIENhY2hlIChBVkMpIHN0YXJ0ZWQuXG4iKTsKKyAgICB9CisKKyAgaWYgKGF2Y19hZGRfY2FsbGJhY2sgKHBvbGljeV9yZWxvYWRfY2FsbGJhY2ssIEFWQ19DQUxMQkFDS19SRVNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgMCwgMCkgPCAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gYWRkIHBvbGljeSByZWxvYWQgY2FsbGJhY2s6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBhdmNfZGVzdHJveSAoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgYnVzX2NvbnRleHQgPSBOVUxMOworICBidXNfc2lkID0gU0VDU0lEX1dJTEQ7CisKKyAgaWYgKGdldGNvbiAoJmJ1c19jb250ZXh0KSA8IDApCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkVycm9yIGdldHRpbmcgY29udGV4dCBvZiBidXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgICAgCisgIGlmIChhdmNfY29udGV4dF90b19zaWQgKGJ1c19jb250ZXh0LCAmYnVzX3NpZCkgPCAwKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJFcnJvciBnZXR0aW5nIFNJRCBmcm9tIGJ1cyBjb250ZXh0OiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgZnJlZWNvbiAoYnVzX2NvbnRleHQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBmcmVlY29uIChidXNfY29udGV4dCk7CisgIAorI2VuZGlmIC8qIEhBVkVfU0VMSU5VWCAqLworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBEZWNyZW1lbnQgU0lEIHJlZmVyZW5jZSBjb3VudC4KKyAqIAorICogQHBhcmFtIHNpZCB0aGUgU0lEIHRvIGRlY3JlbWVudAorICovCit2b2lkCitidXNfc2VsaW51eF9pZF91bnJlZiAoQnVzU0VMaW51eElEICpzaWQpCit7CisjaWZkZWYgSEFWRV9TRUxJTlVYCisgIGlmICghc2VsaW51eF9lbmFibGVkKQorICAgIHJldHVybjsKKworICBfZGJ1c19hc3NlcnQgKHNpZCAhPSBOVUxMKTsKKyAgCisgIHNpZHB1dCAoU0VMSU5VWF9TSURfRlJPTV9CVVMgKHNpZCkpOworI2VuZGlmIC8qIEhBVkVfU0VMSU5VWCAqLworfQorCit2b2lkCitidXNfc2VsaW51eF9pZF9yZWYgKEJ1c1NFTGludXhJRCAqc2lkKQoreworI2lmZGVmIEhBVkVfU0VMSU5VWAorICBpZiAoIXNlbGludXhfZW5hYmxlZCkKKyAgICByZXR1cm47CisKKyAgX2RidXNfYXNzZXJ0IChzaWQgIT0gTlVMTCk7CisgIAorICBzaWRnZXQgKFNFTElOVVhfU0lEX0ZST01fQlVTIChzaWQpKTsKKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KK30KKworLyoqCisgKiBEZXRlcm1pbmUgaWYgdGhlIFNFTGludXggc2VjdXJpdHkgcG9saWN5IGFsbG93cyB0aGUgZ2l2ZW4gc2VuZGVyCisgKiBzZWN1cml0eSBjb250ZXh0IHRvIGdvIHRvIHRoZSBnaXZlbiByZWNpcGllbnQgc2VjdXJpdHkgY29udGV4dC4KKyAqIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgcmVxdWVzdGVkIHBlcm1pc3Npb25zIGFyZSB0byBiZQorICogZ3JhbnRlZCBmcm9tIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBtZXNzYWdlIGJ1cyBvciB0byBhbm90aGVyCisgKiBvcHRpb25hbGx5IHN1cHBsaWVkIHNlY3VyaXR5IGlkZW50aWZpZXIgKGUuZy4gZm9yIGEgc2VydmljZQorICogY29udGV4dCkuICBDdXJyZW50bHkgdGhlc2UgcGVybWlzc2lvbnMgYXJlIGVpdGhlciBzZW5kX21zZyBvcgorICogYWNxdWlyZV9zdmMgaW4gdGhlIGRidXMgY2xhc3MuCisgKgorICogQHBhcmFtIHNlbmRlcl9zaWQgc291cmNlIHNlY3VyaXR5IGNvbnRleHQKKyAqIEBwYXJhbSBvdmVycmlkZV9zaWQgaXMgdGhlIHRhcmdldCBzZWN1cml0eSBjb250ZXh0LiAgSWYgU0VDU0lEX1dJTEQgdGhpcyB3aWxsCisgKiAgICAgICAgdXNlIHRoZSBjb250ZXh0IG9mIHRoZSBidXMgaXRzZWxmIChlLmcuIHRoZSBkZWZhdWx0KS4KKyAqIEBwYXJhbSB0YXJnZXRfY2xhc3MgaXMgdGhlIHRhcmdldCBzZWN1cml0eSBjbGFzcy4KKyAqIEBwYXJhbSByZXF1ZXN0ZWQgaXMgdGhlIHJlcXVlc3RlZCBwZXJtaXNzaW9ucy4KKyAqIEByZXR1cm5zICNUUlVFIGlmIHNlY3VyaXR5IHBvbGljeSBhbGxvd3MgdGhlIHNlbmQuCisgKi8KKyNpZmRlZiBIQVZFX1NFTElOVVgKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX3NlbGludXhfY2hlY2sgKEJ1c1NFTGludXhJRCAgICAgICAgKnNlbmRlcl9zaWQsCisgICAgICAgICAgICAgICAgICAgQnVzU0VMaW51eElEICAgICAgICAqb3ZlcnJpZGVfc2lkLAorICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5X2NsYXNzX3QgICAgIHRhcmdldF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICBhY2Nlc3NfdmVjdG9yX3QgICAgICByZXF1ZXN0ZWQsCisJCSAgIERCdXNTdHJpbmcgICAgICAgICAgKmF1eGRhdGEpCit7CisgIGlmICghc2VsaW51eF9lbmFibGVkKQorICAgIHJldHVybiBUUlVFOworCisgIC8qIE1ha2UgdGhlIHNlY3VyaXR5IGNoZWNrLiAgQVZDIGNoZWNrcyBlbmZvcmNpbmcgbW9kZSBoZXJlIGFzIHdlbGwuICovCisgIGlmIChhdmNfaGFzX3Blcm0gKFNFTElOVVhfU0lEX0ZST01fQlVTIChzZW5kZXJfc2lkKSwKKyAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVfc2lkID8KKyAgICAgICAgICAgICAgICAgICAgU0VMSU5VWF9TSURfRlJPTV9CVVMgKG92ZXJyaWRlX3NpZCkgOgorICAgICAgICAgICAgICAgICAgICBTRUxJTlVYX1NJRF9GUk9NX0JVUyAoYnVzX3NpZCksIAorICAgICAgICAgICAgICAgICAgICB0YXJnZXRfY2xhc3MsIHJlcXVlc3RlZCwgJmFlcmVmLCBhdXhkYXRhKSA8IDApCisgICAgeworICAgIHN3aXRjaCAoZXJybm8pCisgICAgICB7CisgICAgICBjYXNlIEVBQ0NFUzoKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIlNFTGludXggZGVueWluZyBkdWUgdG8gc2VjdXJpdHkgcG9saWN5LlxuIik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIGNhc2UgRUlOVkFMOgorICAgICAgICBfZGJ1c192ZXJib3NlICgiU0VMaW51eCBkZW55aW5nIGR1ZSB0byBpbnZhbGlkIHNlY3VyaXR5IGNvbnRleHQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIlNFTGludXggZGVueWluZyBkdWUgdG86ICVzXG4iLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8qIEhBVkVfU0VMSU5VWCAqLworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY29ubmVjdGlvbiBjYW4gYWNxdWlyZSBhIHNlcnZpY2UsCisgKiBhc3N1bWluZyB0aGUgZ2l2ZW4gc2VjdXJpdHkgSUQgaXMgbmVlZGVkIGZvciB0aGF0IHNlcnZpY2UuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gY29ubmVjdGlvbiB0aGF0IHdhbnRzIHRvIG93biB0aGUgc2VydmljZQorICogQHBhcmFtIHNlcnZpY2Vfc2lkIHRoZSBTSUQgb2YgdGhlIHNlcnZpY2UgZnJvbSB0aGUgdGFibGUKKyAqIEByZXR1cm5zICNUUlVFIGlmIGFjcXVpcmUgaXMgcGVybWl0dGVkLgorICovCitkYnVzX2Jvb2xfdAorYnVzX3NlbGludXhfYWxsb3dzX2FjcXVpcmVfc2VydmljZSAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzU0VMaW51eElEICAgICAgICpzZXJ2aWNlX3NpZCwKKwkJCQkgICAgY29uc3QgY2hhciAgICAgICAgICpzZXJ2aWNlX25hbWUsCisJCQkJICAgIERCdXNFcnJvciAgICAgICAgICAqZXJyb3IpCit7CisjaWZkZWYgSEFWRV9TRUxJTlVYCisgIEJ1c1NFTGludXhJRCAqY29ubmVjdGlvbl9zaWQ7CisgIHVuc2lnbmVkIGxvbmcgc3BpZDsKKyAgREJ1c1N0cmluZyBhdXhkYXRhOworICBkYnVzX2Jvb2xfdCByZXQ7CisgIAorICBpZiAoIXNlbGludXhfZW5hYmxlZCkKKyAgICByZXR1cm4gVFJVRTsKKyAgCisgIGNvbm5lY3Rpb25fc2lkID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X3NlbGludXhfaWQgKGNvbm5lY3Rpb24pOworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfdW5peF9wcm9jZXNzX2lkIChjb25uZWN0aW9uLCAmc3BpZCkpCisgICAgc3BpZCA9IDA7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmF1eGRhdGEpKQorICAgIGdvdG8gb29tOworIAorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXhkYXRhLCAic2VydmljZT0iKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXhkYXRhLCBzZXJ2aWNlX25hbWUpKQorICAgIGdvdG8gb29tOworCisgIGlmIChzcGlkKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1eGRhdGEsICIgc3BpZD0iKSkKKwlnb3RvIG9vbTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3VpbnQgKCZhdXhkYXRhLCBzcGlkKSkKKwlnb3RvIG9vbTsKKyAgICB9CisgIAorICByZXQgPSBidXNfc2VsaW51eF9jaGVjayAoY29ubmVjdGlvbl9zaWQsCisJCQkgICBzZXJ2aWNlX3NpZCwKKwkJCSAgIFNFQ0NMQVNTX0RCVVMsCisJCQkgICBEQlVTX19BQ1FVSVJFX1NWQywKKwkJCSAgICZhdXhkYXRhKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmF1eGRhdGEpOworICByZXR1cm4gcmV0OworCisgb29tOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmF1eGRhdGEpOworICBCVVNfU0VUX09PTSAoZXJyb3IpOworICByZXR1cm4gRkFMU0U7CisKKyNlbHNlCisgIHJldHVybiBUUlVFOworI2VuZGlmIC8qIEhBVkVfU0VMSU5VWCAqLworfQorCisvKioKKyAqIENoZWNrIGlmIFNFTGludXggc2VjdXJpdHkgY29udHJvbHMgYWxsb3cgdGhlIG1lc3NhZ2UgdG8gYmUgc2VudCB0byBhCisgKiBwYXJ0aWN1bGFyIGNvbm5lY3Rpb24gYmFzZWQgb24gdGhlIHNlY3VyaXR5IGNvbnRleHQgb2YgdGhlIHNlbmRlciBhbmQKKyAqIHRoYXQgb2YgdGhlIHJlY2VpdmVyLiBUaGUgZGVzdGluYXRpb24gY29ubmVjdGlvbiBuZWVkIG5vdCBiZSB0aGUKKyAqIGFkZHJlc3NlZCByZWNpcGllbnQsIGl0IGNvdWxkIGJlIGFuICJlYXZlc2Ryb3BwZXIiCisgKgorICogQHBhcmFtIHNlbmRlciB0aGUgc2VuZGVyIG9mIHRoZSBtZXNzYWdlLgorICogQHBhcmFtIHByb3Bvc2VkX3JlY2lwaWVudCB0aGUgY29ubmVjdGlvbiB0aGUgbWVzc2FnZSBpcyB0byBiZSBzZW50IHRvLgorICogQHJldHVybnMgd2hldGhlciB0byBhbGxvdyB0aGUgc2VuZAorICovCitkYnVzX2Jvb2xfdAorYnVzX3NlbGludXhfYWxsb3dzX3NlbmQgKERCdXNDb25uZWN0aW9uICAgICAqc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgICAqcHJvcG9zZWRfcmVjaXBpZW50LAorCQkJIGNvbnN0IGNoYXIgICAgICAgICAqbXNndHlwZSwKKwkJCSBjb25zdCBjaGFyICAgICAgICAgKmludGVyZmFjZSwKKwkJCSBjb25zdCBjaGFyICAgICAgICAgKm1lbWJlciwKKwkJCSBjb25zdCBjaGFyICAgICAgICAgKmVycm9yX25hbWUsCisJCQkgY29uc3QgY2hhciAgICAgICAgICpkZXN0aW5hdGlvbiwKKwkJCSBEQnVzRXJyb3IgICAgICAgICAgKmVycm9yKQoreworI2lmZGVmIEhBVkVfU0VMSU5VWAorICBCdXNTRUxpbnV4SUQgKnJlY2lwaWVudF9zaWQ7CisgIEJ1c1NFTGludXhJRCAqc2VuZGVyX3NpZDsKKyAgdW5zaWduZWQgbG9uZyBzcGlkLCB0cGlkOworICBEQnVzU3RyaW5nIGF1eGRhdGE7CisgIGRidXNfYm9vbF90IHJldDsKKyAgZGJ1c19ib29sX3Qgc3RyaW5nX2FsbG9jZWQ7CisKKyAgaWYgKCFzZWxpbnV4X2VuYWJsZWQpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKCFzZW5kZXIgfHwgIWRidXNfY29ubmVjdGlvbl9nZXRfdW5peF9wcm9jZXNzX2lkIChzZW5kZXIsICZzcGlkKSkKKyAgICBzcGlkID0gMDsKKyAgaWYgKCFwcm9wb3NlZF9yZWNpcGllbnQgfHwgIWRidXNfY29ubmVjdGlvbl9nZXRfdW5peF9wcm9jZXNzX2lkIChwcm9wb3NlZF9yZWNpcGllbnQsICZ0cGlkKSkKKyAgICB0cGlkID0gMDsKKworICBzdHJpbmdfYWxsb2NlZCA9IEZBTFNFOworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYXV4ZGF0YSkpCisgICAgZ290byBvb207CisgIHN0cmluZ19hbGxvY2VkID0gVFJVRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXhkYXRhLCAibXNndHlwZT0iKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXhkYXRhLCBtc2d0eXBlKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoaW50ZXJmYWNlKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1eGRhdGEsICIgaW50ZXJmYWNlPSIpKQorCWdvdG8gb29tOworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV4ZGF0YSwgaW50ZXJmYWNlKSkKKwlnb3RvIG9vbTsKKyAgICB9CisKKyAgaWYgKG1lbWJlcikKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXhkYXRhLCAiIG1lbWJlcj0iKSkKKwlnb3RvIG9vbTsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1eGRhdGEsIG1lbWJlcikpCisJZ290byBvb207CisgICAgfQorCisgIGlmIChlcnJvcl9uYW1lKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1eGRhdGEsICIgZXJyb3JfbmFtZT0iKSkKKwlnb3RvIG9vbTsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1eGRhdGEsIGVycm9yX25hbWUpKQorCWdvdG8gb29tOworICAgIH0KKworICBpZiAoZGVzdGluYXRpb24pCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV4ZGF0YSwgIiBkZXN0PSIpKQorCWdvdG8gb29tOworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV4ZGF0YSwgZGVzdGluYXRpb24pKQorCWdvdG8gb29tOworICAgIH0KKworICBpZiAoc3BpZCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXhkYXRhLCAiIHNwaWQ9IikpCisJZ290byBvb207CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF91aW50ICgmYXV4ZGF0YSwgc3BpZCkpCisJZ290byBvb207CisgICAgfQorCisgIGlmICh0cGlkKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1eGRhdGEsICIgdHBpZD0iKSkKKwlnb3RvIG9vbTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3VpbnQgKCZhdXhkYXRhLCB0cGlkKSkKKwlnb3RvIG9vbTsKKyAgICB9CisKKyAgc2VuZGVyX3NpZCA9IGJ1c19jb25uZWN0aW9uX2dldF9zZWxpbnV4X2lkIChzZW5kZXIpOworICAvKiBBIE5VTEwgcHJvcG9zZWRfcmVjaXBpZW50IG1lYW5zIHRoZSBidXMgaXRzZWxmLiAqLworICBpZiAocHJvcG9zZWRfcmVjaXBpZW50KQorICAgIHJlY2lwaWVudF9zaWQgPSBidXNfY29ubmVjdGlvbl9nZXRfc2VsaW51eF9pZCAocHJvcG9zZWRfcmVjaXBpZW50KTsKKyAgZWxzZQorICAgIHJlY2lwaWVudF9zaWQgPSBCVVNfU0lEX0ZST01fU0VMSU5VWCAoYnVzX3NpZCk7CisKKyAgcmV0ID0gYnVzX3NlbGludXhfY2hlY2sgKHNlbmRlcl9zaWQsIAorCQkJICAgcmVjaXBpZW50X3NpZCwKKwkJCSAgIFNFQ0NMQVNTX0RCVVMsIAorCQkJICAgREJVU19fU0VORF9NU0csCisJCQkgICAmYXV4ZGF0YSk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXhkYXRhKTsKKworICByZXR1cm4gcmV0OworCisgb29tOgorICBpZiAoc3RyaW5nX2FsbG9jZWQpCisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXhkYXRhKTsKKyAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgcmV0dXJuIEZBTFNFOworICAKKyNlbHNlCisgIHJldHVybiBUUlVFOworI2VuZGlmIC8qIEhBVkVfU0VMSU5VWCAqLworfQorCitkYnVzX2Jvb2xfdAorYnVzX3NlbGludXhfYXBwZW5kX2NvbnRleHQgKERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorCQkJICAgIEJ1c1NFTGludXhJRCAgICpzaWQsCisJCQkgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworI2lmZGVmIEhBVkVfU0VMSU5VWAorICBjaGFyICpjb250ZXh0OworCisgIGlmIChhdmNfc2lkX3RvX2NvbnRleHQgKFNFTElOVVhfU0lEX0ZST01fQlVTIChzaWQpLCAmY29udGV4dCkgPCAwKQorICAgIHsKKyAgICAgIGlmIChlcnJubyA9PSBFTk9NRU0pCisgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBlbHNlCisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgZ2V0dGluZyBjb250ZXh0IGZyb20gU0lEOiAlc1xuIiwKKwkJCV9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisJCQkJIERCVVNfVFlQRV9BUlJBWSwKKwkJCQkgREJVU19UWVBFX0JZVEUsCisJCQkJICZjb250ZXh0LAorCQkJCSBzdHJsZW4gKGNvbnRleHQpLAorCQkJCSBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZnJlZWNvbiAoY29udGV4dCk7CisgIHJldHVybiBUUlVFOworI2Vsc2UKKyAgcmV0dXJuIFRSVUU7CisjZW5kaWYKK30KKworLyoqCisgKiBHZXRzIHRoZSBzZWN1cml0eSBjb250ZXh0IG9mIGEgY29ubmVjdGlvbiB0byB0aGUgYnVzLiBJdCBpcyB1cCB0bworICogdGhlIGNhbGxlciB0byBmcmVlY29uKCkgd2hlbiB0aGV5IGFyZSBkb25lLiAKKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbiB0byBnZXQgdGhlIGNvbnRleHQgb2YuCisgKiBAcGFyYW0gY29uIHRoZSBsb2NhdGlvbiB0byBzdG9yZSB0aGUgc2VjdXJpdHkgY29udGV4dC4KKyAqIEByZXR1cm5zICNUUlVFIGlmIGNvbnRleHQgaXMgc3VjY2Vzc2Z1bGx5IG9idGFpbmVkLgorICovCisjaWZkZWYgSEFWRV9TRUxJTlVYCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19jb25uZWN0aW9uX3JlYWRfc2VsaW51eF9jb250ZXh0IChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgKipjb24pCit7CisgIGludCBmZDsKKworICBpZiAoIXNlbGludXhfZW5hYmxlZCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uICE9IE5VTEwpOworICAKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfZmQgKGNvbm5lY3Rpb24sICZmZCkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBnZXQgZmlsZSBkZXNjcmlwdG9yIG9mIHNvY2tldC5cbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmIChnZXRwZWVyY29uIChmZCwgY29uKSA8IDApCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkVycm9yIGdldHRpbmcgY29udGV4dCBvZiBzb2NrZXQgcGVlcjogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBfZGJ1c192ZXJib3NlICgiU3VjY2Vzc2Z1bGx5IHJlYWQgY29ubmVjdGlvbiBjb250ZXh0LlxuIik7CisgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8qIEhBVkVfU0VMSU5VWCAqLworCisvKioKKyAqIFJlYWQgdGhlIFNFTGludXggSUQgZnJvbSB0aGUgY29ubmVjdGlvbi4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbiB0byByZWFkIGZyb20KKyAqIEByZXR1cm5zIHRoZSBTSUQgaWYgc3VjY2Vzc2Z1bGx5IGRldGVybWluZWQsICNOVUxMIG90aGVyd2lzZS4KKyAqLworQnVzU0VMaW51eElEKgorYnVzX3NlbGludXhfaW5pdF9jb25uZWN0aW9uX2lkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworI2lmZGVmIEhBVkVfU0VMSU5VWAorICBjaGFyICpjb247CisgIHNlY3VyaXR5X2lkX3Qgc2lkOworICAKKyAgaWYgKCFzZWxpbnV4X2VuYWJsZWQpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCFidXNfY29ubmVjdGlvbl9yZWFkX3NlbGludXhfY29udGV4dCAoY29ubmVjdGlvbiwgJmNvbikpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlYWQgYW4gU0VMaW51eCBjb250ZXh0IGZyb20gY29ubmVjdGlvbiIpOworICAgICAgX2RidXNfdmVyYm9zZSAoIkVycm9yIGdldHRpbmcgcGVlciBjb250ZXh0LlxuIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIkNvbnZlcnRpbmcgY29udGV4dCB0byBTSUQgdG8gc3RvcmUgb24gY29ubmVjdGlvblxuIik7CisKKyAgaWYgKGF2Y19jb250ZXh0X3RvX3NpZCAoY29uLCAmc2lkKSA8IDApCisgICAgeworICAgICAgaWYgKGVycm5vID09IEVOT01FTSkKKyAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBnZXR0aW5nIFNJRCBmcm9tIGNvbnRleHQgXCIlc1wiOiAlc1xuIiwKKwkJCWNvbiwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAKKyAgICAgIF9kYnVzX3dhcm4gKCJFcnJvciBnZXR0aW5nIFNJRCBmcm9tIGNvbnRleHQgXCIlc1wiOiAlc1xuIiwKKwkJICBjb24sIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgCisgICAgICBmcmVlY29uIChjb24pOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorIAorICBmcmVlY29uIChjb24pOyAKKyAgcmV0dXJuIEJVU19TSURfRlJPTV9TRUxJTlVYIChzaWQpOworI2Vsc2UKKyAgcmV0dXJuIE5VTEw7CisjZW5kaWYgLyogSEFWRV9TRUxJTlVYICovCit9CisKKworLyoqCisgKiBGdW5jdGlvbiBmb3IgZnJlZWluZyBoYXNoIHRhYmxlIGRhdGEuICBUaGVzZSBTSURzCisgKiBzaG91bGQgbm8gbG9uZ2VyIGJlIHJlZmVyZW5jZWQuCisgKi8KK3N0YXRpYyB2b2lkCitidXNfc2VsaW51eF9pZF90YWJsZV9mcmVlX3ZhbHVlIChCdXNTRUxpbnV4SUQgKnNpZCkKK3sKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyAgLyogTlVMTCBzb21ldGltZXMgZHVlIHRvIGhvdyBEQnVzSGFzaFRhYmxlIHdvcmtzICovCisgIGlmIChzaWQpCisgICAgYnVzX3NlbGludXhfaWRfdW5yZWYgKHNpZCk7CisjZW5kaWYgLyogSEFWRV9TRUxJTlVYICovCit9CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyB0YWJsZSBtYXBwaW5nIHNlcnZpY2UgbmFtZXMgdG8gc2VjdXJpdHkgSUQuCisgKiBBIHNlY3VyaXR5IElEIGlzIGEgImNvbXBpbGVkIiBzZWN1cml0eSBjb250ZXh0LCBhIHNlY3VyaXR5CisgKiBjb250ZXh0IGlzIGp1c3QgYSBzdHJpbmcuCisgKgorICogQHJldHVybnMgdGhlIG5ldyB0YWJsZSBvciAjTlVMTCBpZiBubyBtZW1vcnkKKyAqLworREJ1c0hhc2hUYWJsZSoKK2J1c19zZWxpbnV4X2lkX3RhYmxlX25ldyAodm9pZCkKK3sKKyAgcmV0dXJuIF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzRnJlZUZ1bmN0aW9uKSBkYnVzX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNGcmVlRnVuY3Rpb24pIGJ1c19zZWxpbnV4X2lkX3RhYmxlX2ZyZWVfdmFsdWUpOworfQorCisvKiogCisgKiBIYXNoZXMgYSBzZXJ2aWNlIG5hbWUgYW5kIHNlcnZpY2UgY29udGV4dCBpbnRvIHRoZSBzZXJ2aWNlIFNJRAorICogdGFibGUgYXMgYSBzdHJpbmcgYW5kIGEgU0lELgorICoKKyAqIEBwYXJhbSBzZXJ2aWNlX25hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UuCisgKiBAcGFyYW0gc2VydmljZV9jb250ZXh0IGlzIHRoZSBjb250ZXh0IG9mIHRoZSBzZXJ2aWNlLgorICogQHBhcmFtIHNlcnZpY2VfdGFibGUgaXMgdGhlIHRhYmxlIHRvIGhhc2ggdGhlbSBpbnRvLgorICogQHJldHVybiAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK2J1c19zZWxpbnV4X2lkX3RhYmxlX2luc2VydCAoREJ1c0hhc2hUYWJsZSAqc2VydmljZV90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpzZXJ2aWNlX2NvbnRleHQpCit7CisjaWZkZWYgSEFWRV9TRUxJTlVYCisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgc2VjdXJpdHlfaWRfdCBzaWQ7CisgIGNoYXIgKmtleTsKKworICBpZiAoIXNlbGludXhfZW5hYmxlZCkKKyAgICByZXR1cm4gVFJVRTsKKworICBzaWQgPSBTRUNTSURfV0lMRDsKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAga2V5ID0gX2RidXNfc3RyZHVwIChzZXJ2aWNlX25hbWUpOworICBpZiAoa2V5ID09IE5VTEwpCisgICAgcmV0dXJuIHJldHZhbDsKKyAgCisgIGlmIChhdmNfY29udGV4dF90b19zaWQgKChjaGFyICopIHNlcnZpY2VfY29udGV4dCwgJnNpZCkgPCAwKQorICAgIHsKKyAgICAgIGlmIChlcnJubyA9PSBFTk9NRU0pCisgICAgICAgIHsKKwkgIGRidXNfZnJlZSAoa2V5KTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisJfQorCisgICAgICBfZGJ1c193YXJuICgiRXJyb3IgZ2V0dGluZyBTSUQgZnJvbSBjb250ZXh0IFwiJXNcIjogJXNcbiIsCisJCSAgKGNoYXIgKikgc2VydmljZV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKHNlcnZpY2VfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVVNfU0lEX0ZST01fU0VMSU5VWCAoc2lkKSkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfdmVyYm9zZSAoIlBhcnNlZCBcdHNlcnZpY2U6ICVzIFxuXHRcdGNvbnRleHQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAga2V5LCAKKyAgICAgICAgICAgICAgICAgIHNpZC0+Y3R4KTsKKworICAvKiBUaGVzZSBhcmUgb3duZWQgYnkgdGhlIGhhc2gsIHNvIGNsZWFyIHRoZW0gdG8gYXZvaWQgdW5yZWYgKi8KKyAga2V5ID0gTlVMTDsKKyAgc2lkID0gU0VDU0lEX1dJTEQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKyAgCisgb3V0OgorICBpZiAoc2lkICE9IFNFQ1NJRF9XSUxEKQorICAgIHNpZHB1dCAoc2lkKTsKKworICBpZiAoa2V5KQorICAgIGRidXNfZnJlZSAoa2V5KTsKKworICByZXR1cm4gcmV0dmFsOworI2Vsc2UKKyAgcmV0dXJuIFRSVUU7CisjZW5kaWYgLyogSEFWRV9TRUxJTlVYICovCit9CisKKworLyoqCisgKiBGaW5kIHRoZSBzZWN1cml0eSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgc2VydmljZQorICogbmFtZS4gIFJldHVybiBhIHBvaW50ZXIgdG8gdGhpcyBTSUQsIG9yICNOVUxML1NFQ1NJRF9XSUxEIGlmIHRoZQorICogc2VydmljZSBpcyBub3QgZm91bmQgaW4gdGhlIGhhc2ggdGFibGUuICBUaGlzIHNob3VsZCBiZSBuZWFybHkgYQorICogY29uc3RhbnQgdGltZSBvcGVyYXRpb24uICBJZiBTRUxpbnV4IHN1cHBvcnQgaXMgbm90IGF2YWlsYWJsZSwKKyAqIGFsd2F5cyByZXR1cm4gTlVMTC4KKyAqCisgKiBAcGFyYW0gc2VydmljZV90YWJsZSB0aGUgaGFzaCB0YWJsZSB0byBjaGVjayBmb3Igc2VydmljZSBuYW1lLgorICogQHBhcmFtIHNlcnZpY2VfbmFtZSB0aGUgbmFtZSBvZiB0aGUgc2VydmljZSB0byBsb29rIGZvci4KKyAqIEByZXR1cm5zIHRoZSBTRUxpbnV4IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmljZQorICovCitCdXNTRUxpbnV4SUQqCitidXNfc2VsaW51eF9pZF90YWJsZV9sb29rdXAgKERCdXNIYXNoVGFibGUgICAgKnNlcnZpY2VfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnNlcnZpY2VfbmFtZSkKK3sKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyAgc2VjdXJpdHlfaWRfdCBzaWQ7CisKKyAgc2lkID0gU0VDU0lEX1dJTEQ7ICAgICAvKiBkZWZhdWx0IGNvbnRleHQgKi8KKworICBpZiAoIXNlbGludXhfZW5hYmxlZCkKKyAgICByZXR1cm4gTlVMTDsKKyAgCisgIF9kYnVzX3ZlcmJvc2UgKCJMb29raW5nIHVwIHNlcnZpY2UgU0lEIGZvciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpKTsKKworICBzaWQgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKHNlcnZpY2VfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpKTsKKworICBpZiAoc2lkID09IFNFQ1NJRF9XSUxEKQorICAgIF9kYnVzX3ZlcmJvc2UgKCJTZXJ2aWNlICVzIG5vdCBmb3VuZFxuIiwgCisgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpKTsKKyAgZWxzZQorICAgIF9kYnVzX3ZlcmJvc2UgKCJTZXJ2aWNlICVzIGZvdW5kXG4iLCAKKyAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNlcnZpY2VfbmFtZSkpOworCisgIHJldHVybiBCVVNfU0lEX0ZST01fU0VMSU5VWCAoc2lkKTsKKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogR2V0IHRoZSBTRUxpbnV4IHBvbGljeSByb290LiAgVGhpcyBpcyB1c2VkIHRvIGZpbmQgdGhlIEQtQnVzCisgKiBzcGVjaWZpYyBjb25maWcgZmlsZSB3aXRoaW4gdGhlIHBvbGljeS4KKyAqLworY29uc3QgY2hhciAqCitidXNfc2VsaW51eF9nZXRfcG9saWN5X3Jvb3QgKHZvaWQpCit7CisjaWZkZWYgSEFWRV9TRUxJTlVYCisgIHJldHVybiBzZWxpbnV4X3BvbGljeV9yb290ICgpOworI2Vsc2UKKyAgcmV0dXJuIE5VTEw7CisjZW5kaWYgLyogSEFWRV9TRUxJTlVYICovCit9IAorCisvKioKKyAqIEZvciBkZWJ1Z2dpbmc6ICBQcmludCBvdXQgdGhlIGN1cnJlbnQgaGFzaCB0YWJsZSBvZiBzZXJ2aWNlIFNJRHMuCisgKi8KK3ZvaWQKK2J1c19zZWxpbnV4X2lkX3RhYmxlX3ByaW50IChEQnVzSGFzaFRhYmxlICpzZXJ2aWNlX3RhYmxlKQoreworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorI2lmZGVmIEhBVkVfU0VMSU5VWAorICBEQnVzSGFzaEl0ZXIgaXRlcjsKKworICBpZiAoIXNlbGludXhfZW5hYmxlZCkKKyAgICByZXR1cm47CisgIAorICBfZGJ1c192ZXJib3NlICgiU2VydmljZSBTSUQgVGFibGU6XG4iKTsKKyAgX2RidXNfaGFzaF9pdGVyX2luaXQgKHNlcnZpY2VfdGFibGUsICZpdGVyKTsKKyAgd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgeworICAgICAgY29uc3QgY2hhciAqa2V5ID0gX2RidXNfaGFzaF9pdGVyX2dldF9zdHJpbmdfa2V5ICgmaXRlcik7CisgICAgICBzZWN1cml0eV9pZF90IHNpZCA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJUaGUga2V5IGlzICVzXG4iLCBrZXkpOworICAgICAgX2RidXNfdmVyYm9zZSAoIlRoZSBjb250ZXh0IGlzICVzXG4iLCBzaWQtPmN0eCk7CisgICAgICBfZGJ1c192ZXJib3NlICgiVGhlIHJlZmNvdW50IGlzICVkXG4iLCBzaWQtPnJlZmNudCk7CisgICAgfQorI2VuZGlmIC8qIEhBVkVfU0VMSU5VWCAqLworI2VuZGlmIC8qIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERSAqLworfQorCisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyNpZmRlZiBIQVZFX1NFTElOVVgKKy8qKgorICogUHJpbnQgb3V0IHNvbWUgQVZDIHN0YXRpc3RpY3MuCisgKi8KK3N0YXRpYyB2b2lkCitidXNfYXZjX3ByaW50X3N0YXRzICh2b2lkKQoreworICBzdHJ1Y3QgYXZjX2NhY2hlX3N0YXRzIGNzdGF0czsKKworICBpZiAoIXNlbGludXhfZW5hYmxlZCkKKyAgICByZXR1cm47CisgIAorICBfZGJ1c192ZXJib3NlICgiQVZDIFN0YXRpc3RpY3M6XG4iKTsKKyAgYXZjX2NhY2hlX3N0YXRzICgmY3N0YXRzKTsKKyAgYXZjX2F2X3N0YXRzICgpOworICBfZGJ1c192ZXJib3NlICgiQVZDIENhY2hlIFN0YXRpc3RpY3M6XG4iKTsKKyAgX2RidXNfdmVyYm9zZSAoIkVudHJ5IGxvb2t1cHM6ICVkXG4iLCBjc3RhdHMuZW50cnlfbG9va3Vwcyk7CisgIF9kYnVzX3ZlcmJvc2UgKCJFbnRyeSBoaXRzOiAlZFxuIiwgY3N0YXRzLmVudHJ5X2hpdHMpOworICBfZGJ1c192ZXJib3NlICgiRW50cnkgbWlzc2VzICVkXG4iLCBjc3RhdHMuZW50cnlfbWlzc2VzKTsKKyAgX2RidXNfdmVyYm9zZSAoIkVudHJ5IGRpc2NhcmRzOiAlZFxuIiwgY3N0YXRzLmVudHJ5X2Rpc2NhcmRzKTsKKyAgX2RidXNfdmVyYm9zZSAoIkNBViBsb29rdXBzOiAlZFxuIiwgY3N0YXRzLmNhdl9sb29rdXBzKTsKKyAgX2RidXNfdmVyYm9zZSAoIkNBViBoaXRzOiAlZFxuIiwgY3N0YXRzLmNhdl9oaXRzKTsKKyAgX2RidXNfdmVyYm9zZSAoIkNBViBwcm9iZXM6ICVkXG4iLCBjc3RhdHMuY2F2X3Byb2Jlcyk7CisgIF9kYnVzX3ZlcmJvc2UgKCJDQVYgbWlzc2VzOiAlZFxuIiwgY3N0YXRzLmNhdl9taXNzZXMpOworfQorI2VuZGlmIC8qIEhBVkVfU0VMSU5VWCAqLworI2VuZGlmIC8qIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERSAqLworCisKKy8qKgorICogRGVzdHJveSB0aGUgQVZDIGJlZm9yZSB3ZSB0ZXJtaW5hdGUuCisgKi8KK3ZvaWQKK2J1c19zZWxpbnV4X3NodXRkb3duICh2b2lkKQoreworI2lmZGVmIEhBVkVfU0VMSU5VWAorICBpZiAoIXNlbGludXhfZW5hYmxlZCkKKyAgICByZXR1cm47CisKKyAgX2RidXNfdmVyYm9zZSAoIkFWQyBzaHV0ZG93blxuIik7CisKKyAgaWYgKGJ1c19zaWQgIT0gU0VDU0lEX1dJTEQpCisgICAgeworICAgICAgc2lkcHV0IChidXNfc2lkKTsKKyAgICAgIGJ1c19zaWQgPSBTRUNTSURfV0lMRDsKKworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorIAorICAgICAgaWYgKF9kYnVzX2lzX3ZlcmJvc2UoKSkgCisgICAgICAgIGJ1c19hdmNfcHJpbnRfc3RhdHMgKCk7CisgCisjZW5kaWYgLyogREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFICovCisKKyAgICAgIGF2Y19kZXN0cm95ICgpOworI2lmZGVmIEhBVkVfTElCQVVESVQKKyAgICAgIGF1ZGl0X2Nsb3NlIChhdWRpdF9mZCk7CisjZW5kaWYgLyogSEFWRV9MSUJBVURJVCAqLworICAgIH0KKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KK30KKworLyogVGhlICFIQVZFX0xJQkFVRElUIGNhc2UgbGl2ZXMgaW4gZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jICovCisjaWZkZWYgSEFWRV9MSUJBVURJVAorLyoqCisgKiBDaGFuZ2VzIHRoZSB1c2VyIGFuZCBncm91cCB0aGUgYnVzIGlzIHJ1bm5pbmcgYXMuCisgKgorICogQHBhcmFtIHVzZXIgdGhlIHVzZXIgdG8gYmVjb21lCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvcnMKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBmYWlsdXJlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jaGFuZ2VfdG9fZGFlbW9uX3VzZXIgIChjb25zdCBjaGFyICAgICp1c2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAqZXJyb3IpCit7CisgIGRidXNfdWlkX3QgdWlkOworICBkYnVzX2dpZF90IGdpZDsKKyAgREJ1c1N0cmluZyB1OworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdSwgdXNlcik7CisKKyAgaWYgKCFfZGJ1c19nZXRfdXNlcl9pZF9hbmRfcHJpbWFyeV9ncm91cCAoJnUsICZ1aWQsICZnaWQpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIlVzZXIgJyVzJyBkb2VzIG5vdCBhcHBlYXIgdG8gZXhpc3Q/IiwKKyAgICAgICAgICAgICAgICAgICAgICB1c2VyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogSWYgd2Ugd2VyZSByb290ICovCisgIGlmIChfZGJ1c19nZXRldWlkICgpID09IDApCisgICAgeworICAgICAgaW50IHJjOworCisgICAgICBjYXBuZ19jbGVhciAoQ0FQTkdfU0VMRUNUX0JPVEgpOworICAgICAgY2FwbmdfdXBkYXRlIChDQVBOR19BREQsIENBUE5HX0VGRkVDVElWRSB8IENBUE5HX1BFUk1JVFRFRCwKKyAgICAgICAgICAgICAgICAgICAgQ0FQX0FVRElUX1dSSVRFKTsKKyAgICAgIHJjID0gY2FwbmdfY2hhbmdlX2lkICh1aWQsIGdpZCwgQ0FQTkdfRFJPUF9TVVBQX0dSUCk7CisgICAgICBpZiAocmMpCisgICAgICAgIHsKKyAgICAgICAgICBzd2l0Y2ggKHJjKSB7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBkcm9wIGNhcGFiaWxpdGllczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIC00OgorICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IEdJRCB0byAlbHU6ICVzIiwgZ2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAtNToKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byBkcm9wIHN1cHBsZW1lbnRhcnkgZ3JvdXBzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAtNjoKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCBVSUQgdG8gJWx1OiAlcyIsIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgLTc6CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byB1bnNldCBrZWVwLWNhcGFiaWxpdGllczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworIHJldHVybiBUUlVFOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kYnVzL2J1cy9zZWxpbnV4LmggYi9kYnVzL2J1cy9zZWxpbnV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhYjM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvYnVzL3NlbGludXguaApAQCAtMCwwICsxLDcyIEBACisvKiBzZWxpbnV4LmggIFNFTGludXggc2VjdXJpdHkgY2hlY2sgaGVhZGVycyBmb3IgRC1CVVMKKyAqCisgKiBBdXRob3I6IE1hdHRoZXcgUmlja2FyZCA8bWpyaWNrYUBlcG9jaC5uY3NjLm1pbD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBCVVNfU0VMSU5VWF9ICisjZGVmaW5lIEJVU19TRUxJTlVYX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1oYXNoLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWNvbm5lY3Rpb24uaD4KKyNpbmNsdWRlICJzZXJ2aWNlcy5oIgorCitkYnVzX2Jvb2xfdCBidXNfc2VsaW51eF9wcmVfaW5pdCAodm9pZCk7CitkYnVzX2Jvb2xfdCBidXNfc2VsaW51eF9mdWxsX2luaXQodm9pZCk7Cit2b2lkICAgICAgICBidXNfc2VsaW51eF9zaHV0ZG93biAodm9pZCk7CisKK2RidXNfYm9vbF90IGJ1c19zZWxpbnV4X2VuYWJsZWQgICh2b2lkKTsKKwordm9pZCBidXNfc2VsaW51eF9pZF9yZWYgICAgKEJ1c1NFTGludXhJRCAqc2lkKTsKK3ZvaWQgYnVzX3NlbGludXhfaWRfdW5yZWYgIChCdXNTRUxpbnV4SUQgKnNpZCk7CisKK0RCdXNIYXNoVGFibGUqIGJ1c19zZWxpbnV4X2lkX3RhYmxlX25ldyAgICAodm9pZCk7CitCdXNTRUxpbnV4SUQqICBidXNfc2VsaW51eF9pZF90YWJsZV9sb29rdXAgKERCdXNIYXNoVGFibGUgICAgKnNlcnZpY2VfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnNlcnZpY2VfbmFtZSk7CitkYnVzX2Jvb2xfdCAgICBidXNfc2VsaW51eF9pZF90YWJsZV9pbnNlcnQgKERCdXNIYXNoVGFibGUgICAgKnNlcnZpY2VfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqc2VydmljZV9jb250ZXh0KTsKK3ZvaWQgICAgICAgICAgIGJ1c19zZWxpbnV4X2lkX3RhYmxlX3ByaW50ICAoREJ1c0hhc2hUYWJsZSAgICAqc2VydmljZV90YWJsZSk7Citjb25zdCBjaGFyKiAgICBidXNfc2VsaW51eF9nZXRfcG9saWN5X3Jvb3QgKHZvaWQpOworCitkYnVzX2Jvb2xfdCAgICBidXNfc2VsaW51eF9hcHBlbmRfY29udGV4dCAgICAgIChEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKwkJCQkJCUJ1c1NFTGludXhJRCAgICpjb250ZXh0LAorCQkJCQkJREJ1c0Vycm9yICAgICAgKmVycm9yKTsKKworZGJ1c19ib29sX3QgYnVzX3NlbGludXhfYWxsb3dzX2FjcXVpcmVfc2VydmljZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNTRUxpbnV4SUQgICAqc2VydmljZV9zaWQsCisJCQkJCQljb25zdCBjaGFyICAgICAqc2VydmljZV9uYW1lLAorCQkJCQkJREJ1c0Vycm9yICAgICAgKmVycm9yKTsKKworZGJ1c19ib29sX3QgYnVzX3NlbGludXhfYWxsb3dzX3NlbmQgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gKnNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpwcm9wb3NlZF9yZWNpcGllbnQsCisJCQkJCQljb25zdCBjaGFyICAgICAqbXNndHlwZSwgLyogU3VwcGxlbWVudGFyeSBhdWRpdCBkYXRhICovCisJCQkJCQljb25zdCBjaGFyICAgICAqaW50ZXJmYWNlLAorCQkJCQkJY29uc3QgY2hhciAgICAgKm1lbWJlciwKKwkJCQkJCWNvbnN0IGNoYXIgICAgICplcnJvcl9uYW1lLAorCQkJCQkJY29uc3QgY2hhciAgICAgKmRlc3RpbmF0aW9uLAorCQkJCQkJREJ1c0Vycm9yICAgICAgKmVycm9yKTsKKworQnVzU0VMaW51eElEKiBidXNfc2VsaW51eF9pbml0X2Nvbm5lY3Rpb25faWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CisKKwordm9pZCBidXNfc2VsaW51eF9hdWRpdF9pbml0KHZvaWQpOworCisjZW5kaWYgLyogQlVTX1NFTElOVVhfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9idXMvc2VydmljZXMuYyBiL2RidXMvYnVzL3NlcnZpY2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYzODBmYQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvYnVzL3NlcnZpY2VzLmMKQEAgLTAsMCArMSwxMzA0IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIHNlcnZpY2VzLmMgIFNlcnZpY2UgbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWhhc2guaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tZW1wb29sLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hcnNoYWwtdmFsaWRhdGUuaD4KKworI2luY2x1ZGUgImRyaXZlci5oIgorI2luY2x1ZGUgInNlcnZpY2VzLmgiCisjaW5jbHVkZSAiY29ubmVjdGlvbi5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiYWN0aXZhdGlvbi5oIgorI2luY2x1ZGUgInBvbGljeS5oIgorI2luY2x1ZGUgImJ1cy5oIgorI2luY2x1ZGUgInNlbGludXguaCIKKworc3RydWN0IEJ1c1NlcnZpY2UKK3sKKyAgaW50IHJlZmNvdW50OworCisgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKyAgY2hhciAqbmFtZTsKKyAgREJ1c0xpc3QgKm93bmVyczsKK307CisKK3N0cnVjdCBCdXNPd25lcgoreworICBpbnQgcmVmY291bnQ7CisKKyAgQnVzU2VydmljZSAqc2VydmljZTsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm47CisKKyAgdW5zaWduZWQgaW50IGFsbG93X3JlcGxhY2VtZW50IDogMTsKKyAgdW5zaWduZWQgaW50IGRvX25vdF9xdWV1ZSA6IDE7Cit9OworCitzdHJ1Y3QgQnVzUmVnaXN0cnkKK3sKKyAgaW50IHJlZmNvdW50OworCisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisgIAorICBEQnVzSGFzaFRhYmxlICpzZXJ2aWNlX2hhc2g7CisgIERCdXNNZW1Qb29sICAgKnNlcnZpY2VfcG9vbDsKKyAgREJ1c01lbVBvb2wgICAqb3duZXJfcG9vbDsKKworICBEQnVzSGFzaFRhYmxlICpzZXJ2aWNlX3NpZF90YWJsZTsKK307CisKK0J1c1JlZ2lzdHJ5KgorYnVzX3JlZ2lzdHJ5X25ldyAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5OworCisgIHJlZ2lzdHJ5ID0gZGJ1c19uZXcwIChCdXNSZWdpc3RyeSwgMSk7CisgIGlmIChyZWdpc3RyeSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHJlZ2lzdHJ5LT5yZWZjb3VudCA9IDE7CisgIHJlZ2lzdHJ5LT5jb250ZXh0ID0gY29udGV4dDsKKyAgCisgIHJlZ2lzdHJ5LT5zZXJ2aWNlX2hhc2ggPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKKyAgaWYgKHJlZ2lzdHJ5LT5zZXJ2aWNlX2hhc2ggPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZDsKKyAgCisgIHJlZ2lzdHJ5LT5zZXJ2aWNlX3Bvb2wgPSBfZGJ1c19tZW1fcG9vbF9uZXcgKHNpemVvZiAoQnVzU2VydmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpOworCisgIGlmIChyZWdpc3RyeS0+c2VydmljZV9wb29sID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisKKyAgcmVnaXN0cnktPm93bmVyX3Bvb2wgPSBfZGJ1c19tZW1fcG9vbF9uZXcgKHNpemVvZiAoQnVzT3duZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSk7CisKKyAgaWYgKHJlZ2lzdHJ5LT5vd25lcl9wb29sID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisKKyAgcmVnaXN0cnktPnNlcnZpY2Vfc2lkX3RhYmxlID0gTlVMTDsKKyAgCisgIHJldHVybiByZWdpc3RyeTsKKworIGZhaWxlZDoKKyAgYnVzX3JlZ2lzdHJ5X3VucmVmIChyZWdpc3RyeSk7CisgIHJldHVybiBOVUxMOworfQorCitCdXNSZWdpc3RyeSAqCitidXNfcmVnaXN0cnlfcmVmIChCdXNSZWdpc3RyeSAqcmVnaXN0cnkpCit7CisgIF9kYnVzX2Fzc2VydCAocmVnaXN0cnktPnJlZmNvdW50ID4gMCk7CisgIHJlZ2lzdHJ5LT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiByZWdpc3RyeTsKK30KKwordm9pZAorYnVzX3JlZ2lzdHJ5X3VucmVmICAoQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5KQoreworICBfZGJ1c19hc3NlcnQgKHJlZ2lzdHJ5LT5yZWZjb3VudCA+IDApOworICByZWdpc3RyeS0+cmVmY291bnQgLT0gMTsKKworICBpZiAocmVnaXN0cnktPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgaWYgKHJlZ2lzdHJ5LT5zZXJ2aWNlX2hhc2gpCisgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHJlZ2lzdHJ5LT5zZXJ2aWNlX2hhc2gpOworICAgICAgaWYgKHJlZ2lzdHJ5LT5zZXJ2aWNlX3Bvb2wpCisgICAgICAgIF9kYnVzX21lbV9wb29sX2ZyZWUgKHJlZ2lzdHJ5LT5zZXJ2aWNlX3Bvb2wpOworICAgICAgaWYgKHJlZ2lzdHJ5LT5vd25lcl9wb29sKQorICAgICAgICBfZGJ1c19tZW1fcG9vbF9mcmVlIChyZWdpc3RyeS0+b3duZXJfcG9vbCk7CisgICAgICBpZiAocmVnaXN0cnktPnNlcnZpY2Vfc2lkX3RhYmxlKQorICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChyZWdpc3RyeS0+c2VydmljZV9zaWRfdGFibGUpOworICAgICAgCisgICAgICBkYnVzX2ZyZWUgKHJlZ2lzdHJ5KTsKKyAgICB9Cit9CisKK0J1c1NlcnZpY2UqCitidXNfcmVnaXN0cnlfbG9va3VwIChCdXNSZWdpc3RyeSAgICAgICpyZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnNlcnZpY2VfbmFtZSkKK3sKKyAgQnVzU2VydmljZSAqc2VydmljZTsKKworICBzZXJ2aWNlID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChyZWdpc3RyeS0+c2VydmljZV9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNlcnZpY2VfbmFtZSkpOworCisgIHJldHVybiBzZXJ2aWNlOworfQorCitzdGF0aWMgREJ1c0xpc3QgKgorX2J1c19zZXJ2aWNlX2ZpbmRfb3duZXJfbGluayAoQnVzU2VydmljZSAqc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTGlzdCAqbGluazsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmc2VydmljZS0+b3duZXJzKTsKKworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIEJ1c093bmVyICpidXNfb3duZXI7CisKKyAgICAgIGJ1c19vd25lciA9IChCdXNPd25lciAqKSBsaW5rLT5kYXRhOworICAgICAgaWYgKGJ1c19vd25lci0+Y29ubiA9PSBjb25uZWN0aW9uKSAKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZzZXJ2aWNlLT5vd25lcnMsIGxpbmspOworICAgIH0KKworICByZXR1cm4gbGluazsKK30KKworc3RhdGljIHZvaWQKK2J1c19vd25lcl9zZXRfZmxhZ3MgKEJ1c093bmVyICpvd25lciwKKyAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgZmxhZ3MpCit7CisgICBvd25lci0+YWxsb3dfcmVwbGFjZW1lbnQgPSAKKyAgICAgICAgKGZsYWdzICYgREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQpICE9IEZBTFNFOworCisgICBvd25lci0+ZG9fbm90X3F1ZXVlID0KKyAgICAgICAgKGZsYWdzICYgREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFKSAhPSBGQUxTRTsKK30KKworc3RhdGljIEJ1c093bmVyICoKK2J1c19vd25lcl9uZXcgKEJ1c1NlcnZpY2UgKnNlcnZpY2UsIAorICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm4sIAorCSAgICAgICBkYnVzX3VpbnQzMl90IGZsYWdzKQoreworICBCdXNPd25lciAqcmVzdWx0OworCisgIHJlc3VsdCA9IF9kYnVzX21lbV9wb29sX2FsbG9jIChzZXJ2aWNlLT5yZWdpc3RyeS0+b3duZXJfcG9vbCk7CisgIGlmIChyZXN1bHQgIT0gTlVMTCkKKyAgICB7CisgICAgICByZXN1bHQtPnJlZmNvdW50ID0gMTsKKyAgICAgIC8qIGRvbid0IHJlZiB0aGUgY29ubmVjdGlvbiBiZWNhdXNlIHdlIGRvbid0IHdhbnQKKyAgICAgICAgIHRvIGJsb2NrIHRoZSBjb25uZWN0aW9uIGZyb20gZ29pbmcgYXdheS4KKyAgICAgICAgIHRyYW5zYWN0aW9ucyB0YWtlIGNhcmUgb2YgcmVmZmluZyB0aGUgY29ubmVjdGlvbgorICAgICAgICAgYnV0IHdlIG5lZWQgdG8gdXNlIHJlZmNvdW50aW5nIG9uIHRoZSBvd25lcgorICAgICAgICAgc28gdGhhdCB0aGUgb3duZXIgZG9lcyBub3QgZ2V0IGZyZWVkIGJlZm9yZQorICAgICAgICAgd2UgY2FuIGRlcmVmIHRoZSBjb25uZWN0aW9uIGluIHRoZSB0cmFuc2FjdGlvbgorICAgICAgICovCisgICAgICByZXN1bHQtPmNvbm4gPSBjb25uOworICAgICAgcmVzdWx0LT5zZXJ2aWNlID0gc2VydmljZTsKKworICAgICAgaWYgKCFidXNfY29ubmVjdGlvbl9hZGRfb3duZWRfc2VydmljZSAoY29ubiwgc2VydmljZSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19tZW1fcG9vbF9kZWFsbG9jIChzZXJ2aWNlLT5yZWdpc3RyeS0+b3duZXJfcG9vbCwgcmVzdWx0KTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgIGJ1c19vd25lcl9zZXRfZmxhZ3MgKHJlc3VsdCwgZmxhZ3MpOworICAgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIEJ1c093bmVyICoKK2J1c19vd25lcl9yZWYgKEJ1c093bmVyICpvd25lcikKK3sKKyAgX2RidXNfYXNzZXJ0IChvd25lci0+cmVmY291bnQgPiAwKTsKKyAgb3duZXItPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIG93bmVyOworfQorCitzdGF0aWMgdm9pZAorYnVzX293bmVyX3VucmVmICAoQnVzT3duZXIgKm93bmVyKQoreworICBfZGJ1c19hc3NlcnQgKG93bmVyLT5yZWZjb3VudCA+IDApOworICBvd25lci0+cmVmY291bnQgLT0gMTsKKworICBpZiAob3duZXItPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX293bmVkX3NlcnZpY2UgKG93bmVyLT5jb25uLCBvd25lci0+c2VydmljZSk7CisgICAgICBfZGJ1c19tZW1fcG9vbF9kZWFsbG9jIChvd25lci0+c2VydmljZS0+cmVnaXN0cnktPm93bmVyX3Bvb2wsIG93bmVyKTsKKyAgICB9Cit9CisKK0J1c1NlcnZpY2UqCitidXNfcmVnaXN0cnlfZW5zdXJlIChCdXNSZWdpc3RyeSAgICAgICAgICAgICAgICpyZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAgICAgKnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgICAgICAgICAgKm93bmVyX2Nvbm5lY3Rpb25faWZfY3JlYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gICAgICAgICAgICAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICAgICplcnJvcikKK3sKKyAgQnVzU2VydmljZSAqc2VydmljZTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIF9kYnVzX2Fzc2VydCAob3duZXJfY29ubmVjdGlvbl9pZl9jcmVhdGVkICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHRyYW5zYWN0aW9uICE9IE5VTEwpOworCisgIHNlcnZpY2UgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKHJlZ2lzdHJ5LT5zZXJ2aWNlX2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc2VydmljZV9uYW1lKSk7CisgIGlmIChzZXJ2aWNlICE9IE5VTEwpCisgICAgcmV0dXJuIHNlcnZpY2U7CisgIAorICBzZXJ2aWNlID0gX2RidXNfbWVtX3Bvb2xfYWxsb2MgKHJlZ2lzdHJ5LT5zZXJ2aWNlX3Bvb2wpOworICBpZiAoc2VydmljZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgc2VydmljZS0+cmVnaXN0cnkgPSByZWdpc3RyeTsgIAorICBzZXJ2aWNlLT5yZWZjb3VudCA9IDE7CisKKyAgX2RidXNfdmVyYm9zZSAoImNvcHlpbmcgc3RyaW5nICVwICclcycgdG8gc2VydmljZS0+bmFtZVxuIiwKKyAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNlcnZpY2VfbmFtZSkpOworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2RhdGEgKHNlcnZpY2VfbmFtZSwgJnNlcnZpY2UtPm5hbWUpKQorICAgIHsKKyAgICAgIF9kYnVzX21lbV9wb29sX2RlYWxsb2MgKHJlZ2lzdHJ5LT5zZXJ2aWNlX3Bvb2wsIHNlcnZpY2UpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgX2RidXNfdmVyYm9zZSAoImNvcGllZCBzdHJpbmcgJXAgJyVzJyB0byAnJXMnXG4iLAorICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc2VydmljZV9uYW1lKSwKKyAgICAgICAgICAgICAgICAgc2VydmljZS0+bmFtZSk7CisKKyAgaWYgKCFidXNfZHJpdmVyX3NlbmRfc2VydmljZV9vd25lcl9jaGFuZ2VkIChzZXJ2aWNlLT5uYW1lLCAKKwkJCQkJICAgICAgTlVMTCwKKwkJCQkJICAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKG93bmVyX2Nvbm5lY3Rpb25faWZfY3JlYXRlZCksCisJCQkJCSAgICAgIHRyYW5zYWN0aW9uLCBlcnJvcikpCisgICAgeworICAgICAgYnVzX3NlcnZpY2VfdW5yZWYgKHNlcnZpY2UpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmICghYnVzX2FjdGl2YXRpb25fc2VydmljZV9jcmVhdGVkIChidXNfY29udGV4dF9nZXRfYWN0aXZhdGlvbiAocmVnaXN0cnktPmNvbnRleHQpLAorCQkJCSAgICAgICBzZXJ2aWNlLT5uYW1lLCB0cmFuc2FjdGlvbiwgZXJyb3IpKQorICAgIHsKKyAgICAgIGJ1c19zZXJ2aWNlX3VucmVmIChzZXJ2aWNlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgCisgIGlmICghYnVzX3NlcnZpY2VfYWRkX293bmVyIChzZXJ2aWNlLCBvd25lcl9jb25uZWN0aW9uX2lmX2NyZWF0ZWQsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLCBlcnJvcikpCisgICAgeworICAgICAgYnVzX3NlcnZpY2VfdW5yZWYgKHNlcnZpY2UpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKHJlZ2lzdHJ5LT5zZXJ2aWNlX2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSkpCisgICAgeworICAgICAgLyogVGhlIGFkZF9vd25lciBnZXRzIHJldmVydGVkIG9uIHRyYW5zYWN0aW9uIGNhbmNlbCAqLworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgCisgIHJldHVybiBzZXJ2aWNlOworfQorCit2b2lkCitidXNfcmVnaXN0cnlfZm9yZWFjaCAoQnVzUmVnaXN0cnkgICAgICAgICAgICAgICAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgQnVzU2VydmljZUZvcmVhY2hGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0hhc2hJdGVyIGl0ZXI7CisgIAorICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAocmVnaXN0cnktPnNlcnZpY2VfaGFzaCwgJml0ZXIpOworICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICB7CisgICAgICBCdXNTZXJ2aWNlICpzZXJ2aWNlID0gX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpOworCisgICAgICAoKiBmdW5jdGlvbikgKHNlcnZpY2UsIGRhdGEpOworICAgIH0KK30KKworZGJ1c19ib29sX3QKK2J1c19yZWdpc3RyeV9saXN0X3NlcnZpY2VzIChCdXNSZWdpc3RyeSAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqKmxpc3RwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICphcnJheV9sZW4pCit7CisgIGludCBpLCBqLCBsZW47CisgIGNoYXIgKipyZXR2YWw7CisgIERCdXNIYXNoSXRlciBpdGVyOworICAgCisgIGxlbiA9IF9kYnVzX2hhc2hfdGFibGVfZ2V0X25fZW50cmllcyAocmVnaXN0cnktPnNlcnZpY2VfaGFzaCk7CisgIHJldHZhbCA9IGRidXNfbmV3IChjaGFyICosIGxlbiArIDEpOworCisgIGlmIChyZXR2YWwgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfaGFzaF9pdGVyX2luaXQgKHJlZ2lzdHJ5LT5zZXJ2aWNlX2hhc2gsICZpdGVyKTsKKyAgaSA9IDA7CisgIHdoaWxlIChfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgIHsKKyAgICAgIEJ1c1NlcnZpY2UgKnNlcnZpY2UgPSBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlICgmaXRlcik7CisKKyAgICAgIHJldHZhbFtpXSA9IF9kYnVzX3N0cmR1cCAoc2VydmljZS0+bmFtZSk7CisgICAgICBpZiAocmV0dmFsW2ldID09IE5VTEwpCisJZ290byBlcnJvcjsKKworICAgICAgaSsrOworICAgIH0KKworICByZXR2YWxbaV0gPSBOVUxMOworICAKKyAgaWYgKGFycmF5X2xlbikKKyAgICAqYXJyYXlfbGVuID0gbGVuOworICAKKyAgKmxpc3RwID0gcmV0dmFsOworICByZXR1cm4gVFJVRTsKKyAgCisgZXJyb3I6CisgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspCisgICAgZGJ1c19mcmVlIChyZXR2YWxbaV0pOworICBkYnVzX2ZyZWUgKHJldHZhbCk7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3JlZ2lzdHJ5X2FjcXVpcmVfc2VydmljZSAoQnVzUmVnaXN0cnkgICAgICAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICpyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAgICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNDb25uZWN0aW9uICpvbGRfb3duZXJfY29ubjsKKyAgQnVzQ2xpZW50UG9saWN5ICpwb2xpY3k7CisgIEJ1c1NlcnZpY2UgKnNlcnZpY2U7CisgIEJ1c0FjdGl2YXRpb24gICphY3RpdmF0aW9uOworICBCdXNTRUxpbnV4SUQgKnNpZDsKKyAgQnVzT3duZXIgKnByaW1hcnlfb3duZXI7CisgCisgIHJldHZhbCA9IEZBTFNFOworCisgIGlmICghX2RidXNfdmFsaWRhdGVfYnVzX25hbWUgKHNlcnZpY2VfbmFtZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHNlcnZpY2VfbmFtZSkpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgIlJlcXVlc3RlZCBidXMgbmFtZSBcIiVzXCIgaXMgbm90IHZhbGlkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNlcnZpY2VfbmFtZSkpOworICAgICAgCisgICAgICBfZGJ1c192ZXJib3NlICgiQXR0ZW1wdCB0byBhY3F1aXJlIGludmFsaWQgc2VydmljZSBuYW1lXG4iKTsKKyAgICAgIAorICAgICAgZ290byBvdXQ7CisgICAgfQorICAKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoc2VydmljZV9uYW1lLCAwKSA9PSAnOicpCisgICAgeworICAgICAgLyogTm90IGFsbG93ZWQ7IG9ubHkgYmFzZSBzZXJ2aWNlcyBjYW4gc3RhcnQgd2l0aCAnOicgKi8KKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBhY3F1aXJlIGEgc2VydmljZSBzdGFydGluZyB3aXRoICc6JyBzdWNoIGFzIFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpKTsKKyAgICAgIAorICAgICAgX2RidXNfdmVyYm9zZSAoIkF0dGVtcHQgdG8gYWNxdWlyZSBpbnZhbGlkIGJhc2Ugc2VydmljZSBuYW1lIFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNlcnZpY2VfbmFtZSkpOworICAgICAgCisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoc2VydmljZV9uYW1lLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAiQ29ubmVjdGlvbiBcIiVzXCIgaXMgbm90IGFsbG93ZWQgdG8gb3duIHRoZSBzZXJ2aWNlIFwiJXNcImJlY2F1c2UgIgorICAgICAgICAgICAgICAgICAgICAgICJpdCBpcyByZXNlcnZlZCBmb3IgRC1CdXMnIHVzZSBvbmx5IiwKKyAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKGNvbm5lY3Rpb24pID8KKyAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbikgOgorICAgICAgICAgICAgICAgICAgICAgICIoaW5hY3RpdmUpIiwKKyAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NFUlZJQ0VfREJVUyk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcG9saWN5ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X3BvbGljeSAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydCAocG9saWN5ICE9IE5VTEwpOworCisgIC8qIE5vdGUgdGhhdCBpZiBzaWQgaXMgI05VTEwgdGhlbiB0aGUgYnVzJ3Mgb3duIGNvbnRleHQgZ2V0cyB1c2VkCisgICAqIGluIGJ1c19jb25uZWN0aW9uX3NlbGludXhfYWxsb3dzX2FjcXVpcmVfc2VydmljZSgpCisgICAqLworICBzaWQgPSBidXNfc2VsaW51eF9pZF90YWJsZV9sb29rdXAgKHJlZ2lzdHJ5LT5zZXJ2aWNlX3NpZF90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUpOworCisgIGlmICghYnVzX3NlbGludXhfYWxsb3dzX2FjcXVpcmVfc2VydmljZSAoY29ubmVjdGlvbiwgc2lkLAorCQkJCQkgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNlcnZpY2VfbmFtZSksIGVycm9yKSkKKyAgICB7CisKKyAgICAgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoZXJyb3IpICYmCisJICBkYnVzX2Vycm9yX2hhc19uYW1lIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorCXsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24gXCIlc1wiIGlzIG5vdCBhbGxvd2VkIHRvIG93biB0aGUgc2VydmljZSBcIiVzXCIgZHVlICIKKyAgICAgICAgICAgICAgICAgICAgICAidG8gU0VMaW51eCBwb2xpY3kiLAorICAgICAgICAgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAoY29ubmVjdGlvbikgPworICAgICAgICAgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2dldF9uYW1lIChjb25uZWN0aW9uKSA6CisgICAgICAgICAgICAgICAgICAgICAgIihpbmFjdGl2ZSkiLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc2VydmljZV9uYW1lKSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIAorICBpZiAoIWJ1c19jbGllbnRfcG9saWN5X2NoZWNrX2Nhbl9vd24gKHBvbGljeSwgc2VydmljZV9uYW1lKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiQ29ubmVjdGlvbiBcIiVzXCIgaXMgbm90IGFsbG93ZWQgdG8gb3duIHRoZSBzZXJ2aWNlIFwiJXNcIiBkdWUgIgorICAgICAgICAgICAgICAgICAgICAgICJ0byBzZWN1cml0eSBwb2xpY2llcyBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKGNvbm5lY3Rpb24pID8KKyAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbikgOgorICAgICAgICAgICAgICAgICAgICAgICIoaW5hY3RpdmUpIiwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNlcnZpY2VfbmFtZSkpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmIChidXNfY29ubmVjdGlvbl9nZXRfbl9zZXJ2aWNlc19vd25lZCAoY29ubmVjdGlvbikgPj0KKyAgICAgIGJ1c19jb250ZXh0X2dldF9tYXhfc2VydmljZXNfcGVyX2Nvbm5lY3Rpb24gKHJlZ2lzdHJ5LT5jb250ZXh0KSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTElNSVRTX0VYQ0VFREVELAorICAgICAgICAgICAgICAgICAgICAgICJDb25uZWN0aW9uIFwiJXNcIiBpcyBub3QgYWxsb3dlZCB0byBvd24gbW9yZSBzZXJ2aWNlcyAiCisgICAgICAgICAgICAgICAgICAgICAgIihpbmNyZWFzZSBsaW1pdHMgaW4gY29uZmlndXJhdGlvbiBmaWxlIGlmIHJlcXVpcmVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChjb25uZWN0aW9uKSA/CisgICAgICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pIDoKKyAgICAgICAgICAgICAgICAgICAgICAiKGluYWN0aXZlKSIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorICAKKyAgc2VydmljZSA9IGJ1c19yZWdpc3RyeV9sb29rdXAgKHJlZ2lzdHJ5LCBzZXJ2aWNlX25hbWUpOworCisgIGlmIChzZXJ2aWNlICE9IE5VTEwpCisgICAgeworICAgICAgcHJpbWFyeV9vd25lciA9IGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyIChzZXJ2aWNlKTsKKyAgICAgIGlmIChwcmltYXJ5X293bmVyICE9IE5VTEwpCisgICAgICAgIG9sZF9vd25lcl9jb25uID0gcHJpbWFyeV9vd25lci0+Y29ubjsKKyAgICAgIGVsc2UKKyAgICAgICAgb2xkX293bmVyX2Nvbm4gPSBOVUxMOworICAgIH0KKyAgZWxzZQorICAgIG9sZF9vd25lcl9jb25uID0gTlVMTDsKKyAgICAgIAorICBpZiAoc2VydmljZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHNlcnZpY2UgPSBidXNfcmVnaXN0cnlfZW5zdXJlIChyZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUsIGNvbm5lY3Rpb24sIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLCBlcnJvcik7CisgICAgICBpZiAoc2VydmljZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcHJpbWFyeV9vd25lciA9IGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyIChzZXJ2aWNlKTsKKyAgaWYgKHByaW1hcnlfb3duZXIgPT0gTlVMTCkKKyAgICBnb3RvIG91dDsKKworICBpZiAob2xkX293bmVyX2Nvbm4gPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHByaW1hcnlfb3duZXItPmNvbm4gPT0gY29ubmVjdGlvbik7CisKKyAgICAgICpyZXN1bHQgPSBEQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9QUklNQVJZX09XTkVSOyAgICAgIAorICAgIH0KKyAgZWxzZSBpZiAob2xkX293bmVyX2Nvbm4gPT0gY29ubmVjdGlvbikKKyAgICB7CisgICAgICBidXNfb3duZXJfc2V0X2ZsYWdzIChwcmltYXJ5X293bmVyLCBmbGFncyk7CisgICAgICAqcmVzdWx0ID0gREJVU19SRVFVRVNUX05BTUVfUkVQTFlfQUxSRUFEWV9PV05FUjsKKyAgICB9CisgIGVsc2UgaWYgKCgoZmxhZ3MgJiBEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUpICYmCisgICAgICAgICAgICEoYnVzX3NlcnZpY2VfZ2V0X2FsbG93X3JlcGxhY2VtZW50IChzZXJ2aWNlKSkpIHx8CisJICAgKChmbGFncyAmIERCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRSkgJiYKKyAgICAgICAgICAgIShmbGFncyAmIERCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcpKSkgCisgICAgeworICAgICAgREJ1c0xpc3QgKmxpbms7CisgICAgICBCdXNPd25lciAqdGVtcF9vd25lcjsKKyAgICAvKiBTaW5jZSB3ZSBjYW4ndCBiZSBxdWV1ZWQgaWYgd2UgYXJlIGFscmVhZHkgaW4gdGhlIHF1ZXVlCisgICAgICAgcmVtb3ZlIHVzICovCisKKyAgICAgIGxpbmsgPSBfYnVzX3NlcnZpY2VfZmluZF9vd25lcl9saW5rIChzZXJ2aWNlLCBjb25uZWN0aW9uKTsKKyAgICAgIGlmIChsaW5rICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19saXN0X3VubGluayAoJnNlcnZpY2UtPm93bmVycywgbGluayk7CisgICAgICAgICAgdGVtcF9vd25lciA9IChCdXNPd25lciAqKWxpbmstPmRhdGE7CisgICAgICAgICAgYnVzX293bmVyX3VucmVmICh0ZW1wX293bmVyKTsgCisgICAgICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmspOworICAgICAgICB9CisgICAgICAKKyAgICAgICpyZXN1bHQgPSBEQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9FWElTVFM7CisgICAgfQorICBlbHNlIGlmICghKGZsYWdzICYgREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFKSAmJgorICAgICAgICAgICAoIShmbGFncyAmIERCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcpIHx8CisJICAgICEoYnVzX3NlcnZpY2VfZ2V0X2FsbG93X3JlcGxhY2VtZW50IChzZXJ2aWNlKSkpKQorICAgIHsKKyAgICAgIC8qIFF1ZXVlIHRoZSBjb25uZWN0aW9uICovCisgICAgICBpZiAoIWJ1c19zZXJ2aWNlX2FkZF9vd25lciAoc2VydmljZSwgY29ubmVjdGlvbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sIGVycm9yKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICAKKyAgICAgICpyZXN1bHQgPSBEQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9JTl9RVUVVRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBSZXBsYWNlIHRoZSBjdXJyZW50IG93bmVyICovCisKKyAgICAgIC8qIFdlIGVucXVldWUgdGhlIG5ldyBvd25lciBhbmQgcmVtb3ZlIHRoZSBmaXJzdCBvbmUgYmVjYXVzZQorICAgICAgICogdGhhdCB3aWxsIGNhdXNlIE5hbWVBY3F1aXJlZCBhbmQgTmFtZUxvc3QgbWVzc2FnZXMgdG8KKyAgICAgICAqIGJlIHNlbnQuCisgICAgICAgKi8KKyAgICAgIAorICAgICAgaWYgKCFidXNfc2VydmljZV9hZGRfb3duZXIgKHNlcnZpY2UsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sIGVycm9yKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGlmIChwcmltYXJ5X293bmVyLT5kb19ub3RfcXVldWUpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIWJ1c19zZXJ2aWNlX3JlbW92ZV9vd25lciAoc2VydmljZSwgb2xkX293bmVyX2Nvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLCBlcnJvcikpCisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFidXNfc2VydmljZV9zd2FwX293bmVyIChzZXJ2aWNlLCBvbGRfb3duZXJfY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLCBlcnJvcikpCisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbiA9PSBidXNfc2VydmljZV9nZXRfcHJpbWFyeV9vd25lciAoc2VydmljZSktPmNvbm4pOworICAgICAgKnJlc3VsdCA9IERCVVNfUkVRVUVTVF9OQU1FX1JFUExZX1BSSU1BUllfT1dORVI7CisgICAgfQorCisgIGFjdGl2YXRpb24gPSBidXNfY29udGV4dF9nZXRfYWN0aXZhdGlvbiAocmVnaXN0cnktPmNvbnRleHQpOworICByZXR2YWwgPSBidXNfYWN0aXZhdGlvbl9zZW5kX3BlbmRpbmdfYXV0b19hY3RpdmF0aW9uX21lc3NhZ2VzIChhY3RpdmF0aW9uLAorCQkJCQkJCQkgc2VydmljZSwKKwkJCQkJCQkJIHRyYW5zYWN0aW9uLAorCQkJCQkJCQkgZXJyb3IpOworICAKKyBvdXQ6CisgIHJldHVybiByZXR2YWw7Cit9CisKK2RidXNfYm9vbF90CitidXNfcmVnaXN0cnlfcmVsZWFzZV9zZXJ2aWNlIChCdXNSZWdpc3RyeSAgICAgICpyZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICpyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAgICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIEJ1c1NlcnZpY2UgKnNlcnZpY2U7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAoc2VydmljZV9uYW1lLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc2VydmljZV9uYW1lKSkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAiR2l2ZW4gYnVzIG5hbWUgXCIlc1wiIGlzIG5vdCB2YWxpZCIsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpKTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoIkF0dGVtcHQgdG8gcmVsZWFzZSBpbnZhbGlkIHNlcnZpY2UgbmFtZVxuIik7CisKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChzZXJ2aWNlX25hbWUsIDApID09ICc6JykKKyAgICB7CisgICAgICAvKiBOb3QgYWxsb3dlZDsgdGhlIGJhc2Ugc2VydmljZSBuYW1lIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlbGVhc2VkICovCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVsZWFzZSBhIHNlcnZpY2Ugc3RhcnRpbmcgd2l0aCAnOicgc3VjaCBhcyBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc2VydmljZV9uYW1lKSk7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJBdHRlbXB0IHRvIHJlbGVhc2UgaW52YWxpZCBiYXNlIHNlcnZpY2UgbmFtZSBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpKTsKKworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICBpZiAoX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyIChzZXJ2aWNlX25hbWUsIERCVVNfU0VSVklDRV9EQlVTKSkKKyAgICB7CisgICAgICAvKiBOb3QgYWxsb3dlZDsgdGhlIGJhc2Ugc2VydmljZSBuYW1lIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlbGVhc2VkICovCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVsZWFzZSB0aGUgJXMgc2VydmljZSBiZWNhdXNlIGl0IGlzIG93bmVkIGJ5IHRoZSBidXMiLAorICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX0RCVVMpOworCisgICAgICBfZGJ1c192ZXJib3NlICgiQXR0ZW1wdCB0byByZWxlYXNlIHNlcnZpY2UgbmFtZSBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX0RCVVMpOworCisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgc2VydmljZSA9IGJ1c19yZWdpc3RyeV9sb29rdXAgKHJlZ2lzdHJ5LCBzZXJ2aWNlX25hbWUpOworCisgIGlmIChzZXJ2aWNlID09IE5VTEwpCisgICAgeworICAgICAgKnJlc3VsdCA9IERCVVNfUkVMRUFTRV9OQU1FX1JFUExZX05PTl9FWElTVEVOVDsKKyAgICB9CisgIGVsc2UgaWYgKCFidXNfc2VydmljZV9oYXNfb3duZXIgKHNlcnZpY2UsIGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgICpyZXN1bHQgPSBEQlVTX1JFTEVBU0VfTkFNRV9SRVBMWV9OT1RfT1dORVI7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFidXNfc2VydmljZV9yZW1vdmVfb3duZXIgKHNlcnZpY2UsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sIGVycm9yKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoIWJ1c19zZXJ2aWNlX2hhc19vd25lciAoc2VydmljZSwgY29ubmVjdGlvbikpOworICAgICAgKnJlc3VsdCA9IERCVVNfUkVMRUFTRV9OQU1FX1JFUExZX1JFTEVBU0VEOworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICByZXR1cm4gcmV0dmFsOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3JlZ2lzdHJ5X3NldF9zZXJ2aWNlX2NvbnRleHRfdGFibGUgKEJ1c1JlZ2lzdHJ5ICAgKnJlZ2lzdHJ5LAorCQkJCQlEQnVzSGFzaFRhYmxlICp0YWJsZSkKK3sKKyAgREJ1c0hhc2hUYWJsZSAqbmV3X3RhYmxlOworICBEQnVzSGFzaEl0ZXIgaXRlcjsKKyAgCisgIG5ld190YWJsZSA9IGJ1c19zZWxpbnV4X2lkX3RhYmxlX25ldyAoKTsKKyAgaWYgKCFuZXdfdGFibGUpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX2hhc2hfaXRlcl9pbml0ICh0YWJsZSwgJml0ZXIpOworICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpzZXJ2aWNlID0gX2RidXNfaGFzaF9pdGVyX2dldF9zdHJpbmdfa2V5ICgmaXRlcik7CisgICAgICBjb25zdCBjaGFyICpjb250ZXh0ID0gX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpOworCisgICAgICBpZiAoIWJ1c19zZWxpbnV4X2lkX3RhYmxlX2luc2VydCAobmV3X3RhYmxlLAorCQkJCQlzZXJ2aWNlLAorCQkJCQljb250ZXh0KSkKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKHJlZ2lzdHJ5LT5zZXJ2aWNlX3NpZF90YWJsZSkKKyAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChyZWdpc3RyeS0+c2VydmljZV9zaWRfdGFibGUpOworICByZWdpc3RyeS0+c2VydmljZV9zaWRfdGFibGUgPSBuZXdfdGFibGU7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorYnVzX3NlcnZpY2VfdW5saW5rX293bmVyIChCdXNTZXJ2aWNlICAgICAgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c093bmVyICAgICAgICAqb3duZXIpCit7CisgIF9kYnVzX2xpc3RfcmVtb3ZlX2xhc3QgKCZzZXJ2aWNlLT5vd25lcnMsIG93bmVyKTsKKyAgYnVzX293bmVyX3VucmVmIChvd25lcik7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfc2VydmljZV91bmxpbmsgKEJ1c1NlcnZpY2UgKnNlcnZpY2UpCit7CisgIF9kYnVzX2Fzc2VydCAoc2VydmljZS0+b3duZXJzID09IE5VTEwpOworCisgIC8qIHRoZSBzZXJ2aWNlIG1heSBub3QgYmUgaW4gdGhlIGhhc2gsIGlmCisgICAqIHRoZSBmYWlsdXJlIGNhdXNpbmcgdHJhbnNhY3Rpb24gY2FuY2VsCisgICAqIHdhcyBpbiB0aGUgcmlnaHQgcGxhY2UsIGJ1dCB0aGF0J3MgT0sKKyAgICovCisgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3N0cmluZyAoc2VydmljZS0+cmVnaXN0cnktPnNlcnZpY2VfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLT5uYW1lKTsKKyAgCisgIGJ1c19zZXJ2aWNlX3VucmVmIChzZXJ2aWNlKTsKK30KKworc3RhdGljIHZvaWQKK2J1c19zZXJ2aWNlX3JlbGluayAoQnVzU2VydmljZSAgICAgICAgICAgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIERCdXNQcmVhbGxvY2F0ZWRIYXNoICpwcmVhbGxvY2F0ZWQpCit7CisgIF9kYnVzX2Fzc2VydCAoc2VydmljZS0+b3duZXJzID09IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHByZWFsbG9jYXRlZCAhPSBOVUxMKTsKKworICBfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmdfcHJlYWxsb2NhdGVkIChzZXJ2aWNlLT5yZWdpc3RyeS0+c2VydmljZV9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVhbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UpOworICAKKyAgYnVzX3NlcnZpY2VfcmVmIChzZXJ2aWNlKTsKK30KKworLyoqCisgKiBEYXRhIHVzZWQgdG8gcmVwcmVzZW50IGFuIG93bmVyc2hpcCBjYW5jZWxsYXRpb24gaW4KKyAqIGEgYnVzIHRyYW5zYWN0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICBCdXNPd25lciAqb3duZXI7ICAgICAgICAgICAgLyoqPCB0aGUgb3duZXIgKi8KKyAgQnVzU2VydmljZSAqc2VydmljZTsgICAgICAgIC8qKjwgc2VydmljZSB0byBjYW5jZWwgb3duZXJzaGlwIG9mICovCit9IE93bmVyc2hpcENhbmNlbERhdGE7CisKK3N0YXRpYyB2b2lkCitjYW5jZWxfb3duZXJzaGlwICh2b2lkICpkYXRhKQoreworICBPd25lcnNoaXBDYW5jZWxEYXRhICpkID0gZGF0YTsKKworICAvKiBXZSBkb24ndCBuZWVkIHRvIHNlbmQgbWVzc2FnZXMgbm90aWZ5aW5nIG9mIHRoZXNlCisgICAqIGNoYW5nZXMsIHNpbmNlIHdlJ3JlIHJldmVydGluZyBzb21ldGhpbmcgdGhhdCB3YXMKKyAgICogY2FuY2VsbGVkIChlZmZlY3RpdmVseSBuZXZlciByZWFsbHkgaGFwcGVuZWQpCisgICAqLworICBidXNfc2VydmljZV91bmxpbmtfb3duZXIgKGQtPnNlcnZpY2UsIGQtPm93bmVyKTsKKyAgCisgIGlmIChkLT5zZXJ2aWNlLT5vd25lcnMgPT0gTlVMTCkKKyAgICBidXNfc2VydmljZV91bmxpbmsgKGQtPnNlcnZpY2UpOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9vd25lcnNoaXBfY2FuY2VsX2RhdGEgKHZvaWQgKmRhdGEpCit7CisgIE93bmVyc2hpcENhbmNlbERhdGEgKmQgPSBkYXRhOworCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZC0+b3duZXItPmNvbm4pOworICBidXNfb3duZXJfdW5yZWYgKGQtPm93bmVyKTsKKyAgYnVzX3NlcnZpY2VfdW5yZWYgKGQtPnNlcnZpY2UpOworICAKKyAgZGJ1c19mcmVlIChkKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithZGRfY2FuY2VsX293bmVyc2hpcF90b190cmFuc2FjdGlvbiAoQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c093bmVyICAgICAgICpvd25lcikKK3sKKyAgT3duZXJzaGlwQ2FuY2VsRGF0YSAqZDsKKworICBkID0gZGJ1c19uZXcgKE93bmVyc2hpcENhbmNlbERhdGEsIDEpOworICBpZiAoZCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGQtPnNlcnZpY2UgPSBzZXJ2aWNlOworICBkLT5vd25lciA9IG93bmVyOworCisgIGlmICghYnVzX3RyYW5zYWN0aW9uX2FkZF9jYW5jZWxfaG9vayAodHJhbnNhY3Rpb24sIGNhbmNlbF9vd25lcnNoaXAsIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9vd25lcnNoaXBfY2FuY2VsX2RhdGEpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAoZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGJ1c19zZXJ2aWNlX3JlZiAoZC0+c2VydmljZSk7CisgIGJ1c19vd25lcl9yZWYgKG93bmVyKTsKKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoZC0+b3duZXItPmNvbm4pOworIAorICByZXR1cm4gVFJVRTsKK30KKworLyogdGhpcyBmdW5jdGlvbiBpcyBzZWxmLWNhbmNlbGxpbmcgaWYgeW91IGNhbmNlbCB0aGUgdHJhbnNhY3Rpb24gKi8KK2RidXNfYm9vbF90CitidXNfc2VydmljZV9hZGRfb3duZXIgKEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBCdXNPd25lciAqYnVzX293bmVyOworICBEQnVzTGlzdCAqYnVzX293bmVyX2xpbms7CisgIAorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgLyogU2VuZCBzZXJ2aWNlIGFjcXVpcmVkIG1lc3NhZ2UgZmlyc3QsIE9PTSB3aWxsIHJlc3VsdAorICAqIGluIGNhbmNlbGxpbmcgdGhlIHRyYW5zYWN0aW9uCisgICovCisgIGlmIChzZXJ2aWNlLT5vd25lcnMgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIWJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2FjcXVpcmVkIChjb25uZWN0aW9uLCBzZXJ2aWNlLT5uYW1lLCB0cmFuc2FjdGlvbiwgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgYnVzX293bmVyX2xpbmsgPSBfYnVzX3NlcnZpY2VfZmluZF9vd25lcl9saW5rIChzZXJ2aWNlLCBjb25uZWN0aW9uKTsKKyAgCisgIGlmIChidXNfb3duZXJfbGluayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGJ1c19vd25lciA9IGJ1c19vd25lcl9uZXcgKHNlcnZpY2UsIGNvbm5lY3Rpb24sIGZsYWdzKTsKKyAgICAgIGlmIChidXNfb3duZXIgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGJ1c19vd25lcl9zZXRfZmxhZ3MgKGJ1c19vd25lciwgZmxhZ3MpOworICAgICAgaWYgKCEoZmxhZ3MgJiBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HKSB8fCBzZXJ2aWNlLT5vd25lcnMgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZzZXJ2aWNlLT5vd25lcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX293bmVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnVzX293bmVyX3VucmVmIChidXNfb3duZXIpOworICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfbGlzdF9pbnNlcnRfYWZ0ZXIgKCZzZXJ2aWNlLT5vd25lcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZzZXJ2aWNlLT5vd25lcnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfb3duZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBidXNfb3duZXJfdW5yZWYgKGJ1c19vd25lcik7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgIAorICAgIH0gCisgIGVsc2UgCisgICAgeworICAgICAgLyogVXBkYXRlIHRoZSBsaW5rIHNpbmNlIHdlIGFyZSBhbHJlYWR5IGluIHRoZSBxdWV1ZQorICAgICAgICogTm8gbmVlZCBmb3Igb3BlcmF0aW9ucyB0aGF0IGNhbiBwcm9kdWNlIE9PTQorICAgICAgICovCisKKyAgICAgIGJ1c19vd25lciA9IChCdXNPd25lciAqKSBidXNfb3duZXJfbGluay0+ZGF0YTsKKyAgICAgIGlmIChmbGFncyAmIERCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcpCisgICAgICAgIHsKKwkgIERCdXNMaXN0ICpsaW5rOworICAgICAgICAgIF9kYnVzX2xpc3RfdW5saW5rICgmc2VydmljZS0+b3duZXJzLCBidXNfb3duZXJfbGluayk7CisJICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnNlcnZpY2UtPm93bmVycyk7CisJICBfZGJ1c19hc3NlcnQgKGxpbmsgIT0gTlVMTCk7CisJICAKKyAgICAgICAgICBfZGJ1c19saXN0X2luc2VydF9hZnRlcl9saW5rICgmc2VydmljZS0+b3duZXJzLCBsaW5rLCBidXNfb3duZXJfbGluayk7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgYnVzX293bmVyX3NldF9mbGFncyAoYnVzX293bmVyLCBmbGFncyk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgaWYgKCFhZGRfY2FuY2VsX293bmVyc2hpcF90b190cmFuc2FjdGlvbiAodHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19vd25lcikpCisgICAgeworICAgICAgYnVzX3NlcnZpY2VfdW5saW5rX293bmVyIChzZXJ2aWNlLCBidXNfb3duZXIpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEJ1c093bmVyICAgICAgICpvd25lcjsKKyAgQnVzU2VydmljZSAgICAgKnNlcnZpY2U7CisgIEJ1c093bmVyICAgICAgICpiZWZvcmVfb3duZXI7IC8qIHJlc3RvcmUgdG8gcG9zaXRpb24gYmVmb3JlIHRoaXMgY29ubmVjdGlvbiBpbiBvd25lcnMgbGlzdCAqLworICBEQnVzTGlzdCAgICAgICAqb3duZXJfbGluazsKKyAgREJ1c0xpc3QgICAgICAgKnNlcnZpY2VfbGluazsKKyAgREJ1c1ByZWFsbG9jYXRlZEhhc2ggKmhhc2hfZW50cnk7Cit9IE93bmVyc2hpcFJlc3RvcmVEYXRhOworCitzdGF0aWMgdm9pZAorcmVzdG9yZV9vd25lcnNoaXAgKHZvaWQgKmRhdGEpCit7CisgIE93bmVyc2hpcFJlc3RvcmVEYXRhICpkID0gZGF0YTsKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgX2RidXNfYXNzZXJ0IChkLT5zZXJ2aWNlX2xpbmsgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoZC0+b3duZXJfbGluayAhPSBOVUxMKTsKKyAgCisgIGlmIChkLT5zZXJ2aWNlLT5vd25lcnMgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKGQtPmhhc2hfZW50cnkgIT0gTlVMTCk7CisgICAgICBidXNfc2VydmljZV9yZWxpbmsgKGQtPnNlcnZpY2UsIGQtPmhhc2hfZW50cnkpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoZC0+aGFzaF9lbnRyeSA9PSBOVUxMKTsKKyAgICB9CisgIAorICAvKiBXZSBkb24ndCBuZWVkIHRvIHNlbmQgbWVzc2FnZXMgbm90aWZ5aW5nIG9mIHRoZXNlCisgICAqIGNoYW5nZXMsIHNpbmNlIHdlJ3JlIHJldmVydGluZyBzb21ldGhpbmcgdGhhdCB3YXMKKyAgICogY2FuY2VsbGVkIChlZmZlY3RpdmVseSBuZXZlciByZWFsbHkgaGFwcGVuZWQpCisgICAqLworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmQtPnNlcnZpY2UtPm93bmVycyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGxpbmstPmRhdGEgPT0gZC0+YmVmb3JlX293bmVyKQorICAgICAgICBicmVhazsKKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmQtPnNlcnZpY2UtPm93bmVycywgbGluayk7CisgICAgfQorICAKKyAgX2RidXNfbGlzdF9pbnNlcnRfYmVmb3JlX2xpbmsgKCZkLT5zZXJ2aWNlLT5vd25lcnMsIGxpbmssIGQtPm93bmVyX2xpbmspOworCisgIC8qIE5vdGUgdGhhdCByZW1vdmluZyB0aGVuIHJlc3RvcmluZyB0aGlzIGNoYW5nZXMgdGhlIG9yZGVyIGluIHdoaWNoCisgICAqIFNlcnZpY2VEZWxldGVkIG1lc3NhZ2VzIGFyZSBzZW50IG9uIGRlc3RydWN0aW9uIG9mIHRoZQorICAgKiBjb25uZWN0aW9uLiAgVGhpcyBzaG91bGQgYmUgT0sgYXMgdGhlIG9ubHkgZ3VhcmFudGVlIHRoZXJlIGlzCisgICAqIHRoYXQgdGhlIGJhc2Ugc2VydmljZSBpcyBkZXN0cm95ZWQgbGFzdCwgYW5kIHdlIG5ldmVyIGV2ZW4KKyAgICogdGVudGF0aXZlbHkgcmVtb3ZlIHRoZSBiYXNlIHNlcnZpY2UuCisgICAqLworICBidXNfY29ubmVjdGlvbl9hZGRfb3duZWRfc2VydmljZV9saW5rIChkLT5vd25lci0+Y29ubiwgZC0+c2VydmljZV9saW5rKTsKKyAgCisgIGQtPmhhc2hfZW50cnkgPSBOVUxMOworICBkLT5zZXJ2aWNlX2xpbmsgPSBOVUxMOworICBkLT5vd25lcl9saW5rID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfb3duZXJzaGlwX3Jlc3RvcmVfZGF0YSAodm9pZCAqZGF0YSkKK3sKKyAgT3duZXJzaGlwUmVzdG9yZURhdGEgKmQgPSBkYXRhOworCisgIGlmIChkLT5zZXJ2aWNlX2xpbmspCisgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGQtPnNlcnZpY2VfbGluayk7CisgIGlmIChkLT5vd25lcl9saW5rKQorICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChkLT5vd25lcl9saW5rKTsKKyAgaWYgKGQtPmhhc2hfZW50cnkpCisgICAgX2RidXNfaGFzaF90YWJsZV9mcmVlX3ByZWFsbG9jYXRlZF9lbnRyeSAoZC0+c2VydmljZS0+cmVnaXN0cnktPnNlcnZpY2VfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5oYXNoX2VudHJ5KTsKKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGQtPm93bmVyLT5jb25uKTsKKyAgYnVzX293bmVyX3VucmVmIChkLT5vd25lcik7CisgIGJ1c19zZXJ2aWNlX3VucmVmIChkLT5zZXJ2aWNlKTsKKyAgCisgIGRidXNfZnJlZSAoZCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWRkX3Jlc3RvcmVfb3duZXJzaGlwX3RvX3RyYW5zYWN0aW9uIChCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNPd25lciAgICAgICAqb3duZXIpCit7CisgIE93bmVyc2hpcFJlc3RvcmVEYXRhICpkOworICBEQnVzTGlzdCAqbGluazsKKworICBkID0gZGJ1c19uZXcgKE93bmVyc2hpcFJlc3RvcmVEYXRhLCAxKTsKKyAgaWYgKGQgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBkLT5zZXJ2aWNlID0gc2VydmljZTsKKyAgZC0+b3duZXIgPSBvd25lcjsKKyAgZC0+c2VydmljZV9saW5rID0gX2RidXNfbGlzdF9hbGxvY19saW5rIChzZXJ2aWNlKTsKKyAgZC0+b3duZXJfbGluayA9IF9kYnVzX2xpc3RfYWxsb2NfbGluayAob3duZXIpOworICBkLT5oYXNoX2VudHJ5ID0gX2RidXNfaGFzaF90YWJsZV9wcmVhbGxvY2F0ZV9lbnRyeSAoc2VydmljZS0+cmVnaXN0cnktPnNlcnZpY2VfaGFzaCk7CisgIAorICBidXNfc2VydmljZV9yZWYgKGQtPnNlcnZpY2UpOworICBidXNfb3duZXJfcmVmIChkLT5vd25lcik7CisgIGRidXNfY29ubmVjdGlvbl9yZWYgKGQtPm93bmVyLT5jb25uKTsKKworICBkLT5iZWZvcmVfb3duZXIgPSBOVUxMOworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnNlcnZpY2UtPm93bmVycyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGxpbmstPmRhdGEgPT0gb3duZXIpCisgICAgICAgIHsKKyAgICAgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmc2VydmljZS0+b3duZXJzLCBsaW5rKTsKKworICAgICAgICAgIGlmIChsaW5rKQorICAgICAgICAgICAgZC0+YmVmb3JlX293bmVyID0gbGluay0+ZGF0YTsKKworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZzZXJ2aWNlLT5vd25lcnMsIGxpbmspOworICAgIH0KKyAgCisgIGlmIChkLT5zZXJ2aWNlX2xpbmsgPT0gTlVMTCB8fAorICAgICAgZC0+b3duZXJfbGluayA9PSBOVUxMIHx8CisgICAgICBkLT5oYXNoX2VudHJ5ID09IE5VTEwgfHwKKyAgICAgICFidXNfdHJhbnNhY3Rpb25fYWRkX2NhbmNlbF9ob29rICh0cmFuc2FjdGlvbiwgcmVzdG9yZV9vd25lcnNoaXAsIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9vd25lcnNoaXBfcmVzdG9yZV9kYXRhKSkKKyAgICB7CisgICAgICBmcmVlX293bmVyc2hpcF9yZXN0b3JlX2RhdGEgKGQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3NlcnZpY2Vfc3dhcF9vd25lciAoQnVzU2VydmljZSAgICAgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c0xpc3QgKnN3YXBfbGluazsKKyAgQnVzT3duZXIgKnByaW1hcnlfb3duZXI7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgLyogV2Ugc2VuZCBvdXQgbm90aWZpY2F0aW9ucyBiZWZvcmUgd2UgZG8gYW55IHdvcmsgd2UKKyAgICogbWlnaHQgaGF2ZSB0byB1bmRvIGlmIHRoZSBub3RpZmljYXRpb24tc2VuZGluZyBmYWlsZWQKKyAgICovCisgIAorICAvKiBTZW5kIHNlcnZpY2UgbG9zdCBtZXNzYWdlICovCisgIHByaW1hcnlfb3duZXIgPSBidXNfc2VydmljZV9nZXRfcHJpbWFyeV9vd25lciAoc2VydmljZSk7CisgIGlmIChwcmltYXJ5X293bmVyID09IE5VTEwgfHwgcHJpbWFyeV9vd25lci0+Y29ubiAhPSBjb25uZWN0aW9uKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlRyaWVkIHRvIHN3YXAgYSBub24gcHJpbWFyeSBvd25lciIpOworCisgICAgCisgIGlmICghYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfbG9zdCAoY29ubmVjdGlvbiwgc2VydmljZS0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbiwgZXJyb3IpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoc2VydmljZS0+b3duZXJzID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiVHJpZWQgdG8gc3dhcCBvd25lciBvZiBhIHNlcnZpY2UgdGhhdCBoYXMgbm8gb3duZXJzIik7CisgICAgfQorICBlbHNlIGlmIChfZGJ1c19saXN0X2xlbmd0aF9pc19vbmUgKCZzZXJ2aWNlLT5vd25lcnMpKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlRyaWVkIHRvIHN3YXAgb3duZXIgb2YgYSBzZXJ2aWNlIHRoYXQgaGFzIG5vIG90aGVyIG93bmVycyBpbiB0aGUgcXVldWUiKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbGluazsKKyAgICAgIEJ1c093bmVyICpuZXdfb3duZXI7CisgICAgICBEQnVzQ29ubmVjdGlvbiAqbmV3X293bmVyX2Nvbm47CisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnNlcnZpY2UtPm93bmVycyk7CisgICAgICBfZGJ1c19hc3NlcnQgKGxpbmsgIT0gTlVMTCk7CisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmc2VydmljZS0+b3duZXJzLCBsaW5rKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAobGluayAhPSBOVUxMKTsKKworICAgICAgbmV3X293bmVyID0gKEJ1c093bmVyICopbGluay0+ZGF0YTsKKyAgICAgIG5ld19vd25lcl9jb25uID0gbmV3X293bmVyLT5jb25uOworCisgICAgICBpZiAoIWJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX293bmVyX2NoYW5nZWQgKHNlcnZpY2UtPm5hbWUsCisgCQkJCQkJICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbiksCisgCQkJCQkJICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAobmV3X293bmVyX2Nvbm4pLAorIAkJCQkJCSAgdHJhbnNhY3Rpb24sIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAvKiBUaGlzIHdpbGwgYmUgb3VyIG5ldyBvd25lciAqLworICAgICAgaWYgKCFidXNfZHJpdmVyX3NlbmRfc2VydmljZV9hY3F1aXJlZCAobmV3X293bmVyX2Nvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFhZGRfcmVzdG9yZV9vd25lcnNoaXBfdG9fdHJhbnNhY3Rpb24gKHRyYW5zYWN0aW9uLCBzZXJ2aWNlLCBwcmltYXJ5X293bmVyKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiB1bmxpbmsgdGhlIHByaW1hcnkgYW5kIG1ha2UgaXQgdGhlIHNlY29uZCBsaW5rICovCisgIHN3YXBfbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZzZXJ2aWNlLT5vd25lcnMpOworICBfZGJ1c19saXN0X3VubGluayAoJnNlcnZpY2UtPm93bmVycywgc3dhcF9saW5rKTsKKworICBfZGJ1c19saXN0X2luc2VydF9hZnRlcl9saW5rICgmc2VydmljZS0+b3duZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmc2VydmljZS0+b3duZXJzKSwKKwkJCQlzd2FwX2xpbmspOworCisgIHJldHVybiBUUlVFOworfQorCisvKiB0aGlzIGZ1bmN0aW9uIGlzIHNlbGYtY2FuY2VsbGluZyBpZiB5b3UgY2FuY2VsIHRoZSB0cmFuc2FjdGlvbiAqLworZGJ1c19ib29sX3QKK2J1c19zZXJ2aWNlX3JlbW92ZV9vd25lciAoQnVzU2VydmljZSAgICAgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgQnVzT3duZXIgKnByaW1hcnlfb3duZXI7CisgIAorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIC8qIFdlIHNlbmQgb3V0IG5vdGlmaWNhdGlvbnMgYmVmb3JlIHdlIGRvIGFueSB3b3JrIHdlCisgICAqIG1pZ2h0IGhhdmUgdG8gdW5kbyBpZiB0aGUgbm90aWZpY2F0aW9uLXNlbmRpbmcgZmFpbGVkCisgICAqLworICAKKyAgLyogU2VuZCBzZXJ2aWNlIGxvc3QgbWVzc2FnZSAqLworICBwcmltYXJ5X293bmVyID0gYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXIgKHNlcnZpY2UpOworICBpZiAocHJpbWFyeV9vd25lciAhPSBOVUxMICYmIHByaW1hcnlfb3duZXItPmNvbm4gPT0gY29ubmVjdGlvbikKKyAgICB7CisgICAgICBpZiAoIWJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2xvc3QgKGNvbm5lY3Rpb24sIHNlcnZpY2UtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBpZiB3ZSBhcmUgbm90IHRoZSBwcmltYXJ5IG93bmVyIHRoZW4ganVzdCByZW1vdmUgdXMgZnJvbSB0aGUgcXVldWUgKi8KKyAgICAgIERCdXNMaXN0ICpsaW5rOworICAgICAgQnVzT3duZXIgKnRlbXBfb3duZXI7CisKKyAgICAgIGxpbmsgPSBfYnVzX3NlcnZpY2VfZmluZF9vd25lcl9saW5rIChzZXJ2aWNlLCBjb25uZWN0aW9uKTsKKyAgICAgIF9kYnVzX2xpc3RfdW5saW5rICgmc2VydmljZS0+b3duZXJzLCBsaW5rKTsKKyAgICAgIHRlbXBfb3duZXIgPSAoQnVzT3duZXIgKilsaW5rLT5kYXRhOworICAgICAgYnVzX293bmVyX3VucmVmICh0ZW1wX293bmVyKTsgCisgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAobGluayk7CisKKyAgICAgIHJldHVybiBUUlVFOyAKKyAgICB9CisKKyAgaWYgKHNlcnZpY2UtPm93bmVycyA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlRyaWVkIHRvIHJlbW92ZSBvd25lciBvZiBhIHNlcnZpY2UgdGhhdCBoYXMgbm8gb3duZXJzIik7CisgICAgfQorICBlbHNlIGlmIChfZGJ1c19saXN0X2xlbmd0aF9pc19vbmUgKCZzZXJ2aWNlLT5vd25lcnMpKQorICAgIHsKKyAgICAgIGlmICghYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2Vfb3duZXJfY2hhbmdlZCAoc2VydmljZS0+bmFtZSwKKyAJCQkJCQkgIGJ1c19jb25uZWN0aW9uX2dldF9uYW1lIChjb25uZWN0aW9uKSwKKyAJCQkJCQkgIE5VTEwsCisgCQkJCQkJICB0cmFuc2FjdGlvbiwgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgREJ1c0xpc3QgKmxpbms7CisgICAgICBCdXNPd25lciAqbmV3X293bmVyOworICAgICAgREJ1c0Nvbm5lY3Rpb24gKm5ld19vd25lcl9jb25uOworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZzZXJ2aWNlLT5vd25lcnMpOworICAgICAgX2RidXNfYXNzZXJ0IChsaW5rICE9IE5VTEwpOworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnNlcnZpY2UtPm93bmVycywgbGluayk7CisgICAgICBfZGJ1c19hc3NlcnQgKGxpbmsgIT0gTlVMTCk7CisKKyAgICAgIG5ld19vd25lciA9IChCdXNPd25lciAqKWxpbmstPmRhdGE7CisgICAgICBuZXdfb3duZXJfY29ubiA9IG5ld19vd25lci0+Y29ubjsKKworICAgICAgaWYgKCFidXNfZHJpdmVyX3NlbmRfc2VydmljZV9vd25lcl9jaGFuZ2VkIChzZXJ2aWNlLT5uYW1lLAorIAkJCQkJCSAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pLAorIAkJCQkJCSAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKG5ld19vd25lcl9jb25uKSwKKyAJCQkJCQkgIHRyYW5zYWN0aW9uLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgLyogVGhpcyB3aWxsIGJlIG91ciBuZXcgb3duZXIgKi8KKyAgICAgIGlmICghYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfYWNxdWlyZWQgKG5ld19vd25lcl9jb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghYWRkX3Jlc3RvcmVfb3duZXJzaGlwX3RvX3RyYW5zYWN0aW9uICh0cmFuc2FjdGlvbiwgc2VydmljZSwgcHJpbWFyeV9vd25lcikpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgCisgIGJ1c19zZXJ2aWNlX3VubGlua19vd25lciAoc2VydmljZSwgcHJpbWFyeV9vd25lcik7CisKKyAgaWYgKHNlcnZpY2UtPm93bmVycyA9PSBOVUxMKQorICAgIGJ1c19zZXJ2aWNlX3VubGluayAoc2VydmljZSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0J1c1NlcnZpY2UgKgorYnVzX3NlcnZpY2VfcmVmIChCdXNTZXJ2aWNlICpzZXJ2aWNlKQoreworICBfZGJ1c19hc3NlcnQgKHNlcnZpY2UtPnJlZmNvdW50ID4gMCk7CisgIAorICBzZXJ2aWNlLT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiBzZXJ2aWNlOworfQorCit2b2lkCitidXNfc2VydmljZV91bnJlZiAoQnVzU2VydmljZSAqc2VydmljZSkKK3sKKyAgX2RidXNfYXNzZXJ0IChzZXJ2aWNlLT5yZWZjb3VudCA+IDApOworICAKKyAgc2VydmljZS0+cmVmY291bnQgLT0gMTsKKworICBpZiAoc2VydmljZS0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHNlcnZpY2UtPm93bmVycyA9PSBOVUxMKTsKKyAgICAgIAorICAgICAgZGJ1c19mcmVlIChzZXJ2aWNlLT5uYW1lKTsKKyAgICAgIF9kYnVzX21lbV9wb29sX2RlYWxsb2MgKHNlcnZpY2UtPnJlZ2lzdHJ5LT5zZXJ2aWNlX3Bvb2wsIHNlcnZpY2UpOworICAgIH0KK30KKworREJ1c0Nvbm5lY3Rpb24gKgorYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXJzX2Nvbm5lY3Rpb24gKEJ1c1NlcnZpY2UgKnNlcnZpY2UpCit7CisgIEJ1c093bmVyICpvd25lcjsKKworICBvd25lciA9IGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyIChzZXJ2aWNlKTsKKworICBpZiAob3duZXIgIT0gTlVMTCkKKyAgICByZXR1cm4gb3duZXItPmNvbm47CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKK30KKworQnVzT3duZXIqCitidXNfc2VydmljZV9nZXRfcHJpbWFyeV9vd25lciAoQnVzU2VydmljZSAqc2VydmljZSkKK3sKKyAgcmV0dXJuIF9kYnVzX2xpc3RfZ2V0X2ZpcnN0ICgmc2VydmljZS0+b3duZXJzKTsKK30KKworY29uc3QgY2hhcioKK2J1c19zZXJ2aWNlX2dldF9uYW1lIChCdXNTZXJ2aWNlICpzZXJ2aWNlKQoreworICByZXR1cm4gc2VydmljZS0+bmFtZTsKK30KKworZGJ1c19ib29sX3QKK2J1c19zZXJ2aWNlX2dldF9hbGxvd19yZXBsYWNlbWVudCAoQnVzU2VydmljZSAqc2VydmljZSkKK3sKKyAgQnVzT3duZXIgKm93bmVyOworICBEQnVzTGlzdCAqbGluazsKKyAKKyAgX2RidXNfYXNzZXJ0IChzZXJ2aWNlLT5vd25lcnMgIT0gTlVMTCk7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZzZXJ2aWNlLT5vd25lcnMpOworICBvd25lciA9IChCdXNPd25lciAqKSBsaW5rLT5kYXRhOworCisgIHJldHVybiBvd25lci0+YWxsb3dfcmVwbGFjZW1lbnQ7Cit9CisKK2RidXNfYm9vbF90CitidXNfc2VydmljZV9oYXNfb3duZXIgKEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlLAorCQkgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBfYnVzX3NlcnZpY2VfZmluZF9vd25lcl9saW5rIChzZXJ2aWNlLCBjb25uZWN0aW9uKTsKKyAKKyAgaWYgKGxpbmsgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QgCitidXNfc2VydmljZV9saXN0X3F1ZXVlZF9vd25lcnMgKEJ1c1NlcnZpY2UgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqKnJldHVybl9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgX2RidXNfYXNzZXJ0ICgqcmV0dXJuX2xpc3QgPT0gTlVMTCk7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZzZXJ2aWNlLT5vd25lcnMpOworICBfZGJ1c19hc3NlcnQgKGxpbmsgIT0gTlVMTCk7CisgIAorICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIEJ1c093bmVyICpvd25lcjsKKyAgICAgIGNvbnN0IGNoYXIgKnVuYW1lOworCisgICAgICBvd25lciA9IChCdXNPd25lciAqKSBsaW5rLT5kYXRhOworICAgICAgdW5hbWUgPSBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAob3duZXItPmNvbm4pOworCisgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kIChyZXR1cm5fbGlzdCwgKGNoYXIgKil1bmFtZSkpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmc2VydmljZS0+b3duZXJzLCBsaW5rKTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKKyAgCisgb29tOgorICBfZGJ1c19saXN0X2NsZWFyIChyZXR1cm5fbGlzdCk7CisgIEJVU19TRVRfT09NIChlcnJvcik7CisgIHJldHVybiBGQUxTRTsKK30KZGlmZiAtLWdpdCBhL2RidXMvYnVzL3NlcnZpY2VzLmggYi9kYnVzL2J1cy9zZXJ2aWNlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NmRkOWYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2J1cy9zZXJ2aWNlcy5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogc2VydmljZXMuaCAgU2VydmljZSBtYW5hZ2VtZW50CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgQlVTX1NFUlZJQ0VTX0gKKyNkZWZpbmUgQlVTX1NFUlZJQ0VTX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtaGFzaC5oPgorI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJidXMuaCIKKwordHlwZWRlZiB2b2lkICgqIEJ1c1NlcnZpY2VGb3JlYWNoRnVuY3Rpb24pIChCdXNTZXJ2aWNlICAgICAgICpzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICpkYXRhKTsKKworQnVzUmVnaXN0cnkqIGJ1c19yZWdpc3RyeV9uZXcgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CitCdXNSZWdpc3RyeSogYnVzX3JlZ2lzdHJ5X3JlZiAgICAgICAgICAgICAoQnVzUmVnaXN0cnkgICAgICAgICAgICAgICAgICpyZWdpc3RyeSk7Cit2b2lkICAgICAgICAgYnVzX3JlZ2lzdHJ5X3VucmVmICAgICAgICAgICAoQnVzUmVnaXN0cnkgICAgICAgICAgICAgICAgICpyZWdpc3RyeSk7CitCdXNTZXJ2aWNlKiAgYnVzX3JlZ2lzdHJ5X2xvb2t1cCAgICAgICAgICAoQnVzUmVnaXN0cnkgICAgICAgICAgICAgICAgICpyZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICAgKnNlcnZpY2VfbmFtZSk7CitCdXNTZXJ2aWNlKiAgYnVzX3JlZ2lzdHJ5X2Vuc3VyZSAgICAgICAgICAoQnVzUmVnaXN0cnkgICAgICAgICAgICAgICAgICpyZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICAgKnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKm93bmVyX2Nvbm5lY3Rpb25faWZfY3JlYXRlZCwKKwkJCQkJICAgZGJ1c191aW50MzJfdCAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICAqZXJyb3IpOwordm9pZCAgICAgICAgIGJ1c19yZWdpc3RyeV9mb3JlYWNoICAgICAgICAgKEJ1c1JlZ2lzdHJ5ICAgICAgICAgICAgICAgICAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzU2VydmljZUZvcmVhY2hGdW5jdGlvbiAgICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOworZGJ1c19ib29sX3QgIGJ1c19yZWdpc3RyeV9saXN0X3NlcnZpY2VzICAgKEJ1c1JlZ2lzdHJ5ICAgICAgICAgICAgICAgICAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAqKipsaXN0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgKmFycmF5X2xlbik7CitkYnVzX2Jvb2xfdCAgYnVzX3JlZ2lzdHJ5X2FjcXVpcmVfc2VydmljZSAoQnVzUmVnaXN0cnkgICAgICAgICAgICAgICAgICpyZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgICAgICAgICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICAgICAgICAgICAgKnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgIGJ1c19yZWdpc3RyeV9yZWxlYXNlX3NlcnZpY2UgKEJ1c1JlZ2lzdHJ5ICAgICAgICAgICAgICAgICAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAgICAgICAqc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgICAgICAgICAgICAqcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICAgICAgICAgICAgICAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgYnVzX3JlZ2lzdHJ5X3NldF9zZXJ2aWNlX2NvbnRleHRfdGFibGUgKEJ1c1JlZ2lzdHJ5ICAgICAgICAgICAqcmVnaXN0cnksCisJCQkJCQkgICAgIERCdXNIYXNoVGFibGUgICAgICAgICAqdGFibGUpOworCitCdXNTZXJ2aWNlKiAgICAgYnVzX3NlcnZpY2VfcmVmICAgICAgICAgICAgICAgICAgICAgICAoQnVzU2VydmljZSAgICAgKnNlcnZpY2UpOwordm9pZCAgICAgICAgICAgIGJ1c19zZXJ2aWNlX3VucmVmICAgICAgICAgICAgICAgICAgICAgKEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlKTsKK2RidXNfYm9vbF90ICAgICBidXNfc2VydmljZV9hZGRfb3duZXIgICAgICAgICAgICAgICAgIChCdXNTZXJ2aWNlICAgICAqc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJCSAgICAgICBkYnVzX3VpbnQzMl90ICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgYnVzX3NlcnZpY2Vfc3dhcF9vd25lciAgICAgICAgICAgICAgICAoQnVzU2VydmljZSAgICAgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgYnVzX3NlcnZpY2VfcmVtb3ZlX293bmVyICAgICAgICAgICAgICAoQnVzU2VydmljZSAgICAgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgYnVzX3NlcnZpY2VfaGFzX293bmVyICAgICAgICAgICAgICAgICAoQnVzU2VydmljZSAgICAgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworQnVzT3duZXIqICAgICAgIGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyICAgICAgICAgKEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlKTsKK2RidXNfYm9vbF90ICAgICBidXNfc2VydmljZV9nZXRfYWxsb3dfcmVwbGFjZW1lbnQgICAgIChCdXNTZXJ2aWNlICAgICAqc2VydmljZSk7Citjb25zdCBjaGFyKiAgICAgYnVzX3NlcnZpY2VfZ2V0X25hbWUgICAgICAgICAgICAgICAgICAoQnVzU2VydmljZSAgICAgKnNlcnZpY2UpOworZGJ1c19ib29sX3QgICAgIGJ1c19zZXJ2aWNlX2xpc3RfcXVldWVkX293bmVycyAgICAgICAgKEJ1c1NlcnZpY2UgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICoqcmV0dXJuX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpOworCitEQnVzQ29ubmVjdGlvbiogYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXJzX2Nvbm5lY3Rpb24gKEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlKTsKKyNlbmRpZiAvKiBCVVNfU0VSVklDRVNfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9idXMvc2Vzc2lvbi5jb25mLmluIGIvZGJ1cy9idXMvc2Vzc2lvbi5jb25mLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMjFmZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2J1cy9zZXNzaW9uLmNvbmYuaW4KQEAgLTAsMCArMSw2MyBAQAorPCEtLSBUaGlzIGNvbmZpZ3VyYXRpb24gZmlsZSBjb250cm9scyB0aGUgcGVyLXVzZXItbG9naW4tc2Vzc2lvbiBtZXNzYWdlIGJ1cy4KKyAgICAgQWRkIGEgc2Vzc2lvbi1sb2NhbC5jb25mIGFuZCBlZGl0IHRoYXQgcmF0aGVyIHRoYW4gY2hhbmdpbmcgdGhpcyAKKyAgICAgZmlsZSBkaXJlY3RseS4gLS0+CisKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQnVzIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDwhLS0gT3VyIHdlbGwta25vd24gYnVzIHR5cGUsIGRvbid0IGNoYW5nZSB0aGlzIC0tPgorICA8dHlwZT5zZXNzaW9uPC90eXBlPgorCisgIDwhLS0gSWYgd2UgZm9yaywga2VlcCB0aGUgdXNlcidzIG9yaWdpbmFsIHVtYXNrIHRvIGF2b2lkIGFmZmVjdGluZworICAgICAgIHRoZSBiZWhhdmlvciBvZiBjaGlsZCBwcm9jZXNzZXMuIC0tPgorICA8a2VlcF91bWFzay8+CisKKyAgPGxpc3Rlbj5AREJVU19TRVNTSU9OX0JVU19ERUZBVUxUX0FERFJFU1NAPC9saXN0ZW4+CisKKyAgPHN0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMgLz4KKworICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDwhLS0gQWxsb3cgZXZlcnl0aGluZyB0byBiZSBzZW50IC0tPgorICAgIDxhbGxvdyBzZW5kX2Rlc3RpbmF0aW9uPSIqIiBlYXZlc2Ryb3A9InRydWUiLz4KKyAgICA8IS0tIEFsbG93IGV2ZXJ5dGhpbmcgdG8gYmUgcmVjZWl2ZWQgLS0+CisgICAgPGFsbG93IGVhdmVzZHJvcD0idHJ1ZSIvPgorICAgIDwhLS0gQWxsb3cgYW55b25lIHRvIG93biBhbnl0aGluZyAtLT4KKyAgICA8YWxsb3cgb3duPSIqIi8+CisgIDwvcG9saWN5PgorCisgIDwhLS0gQ29uZmlnIGZpbGVzIGFyZSBwbGFjZWQgaGVyZSB0aGF0IGFtb25nIG90aGVyIHRoaW5ncywgCisgICAgICAgZnVydGhlciByZXN0cmljdCB0aGUgYWJvdmUgcG9saWN5IGZvciBzcGVjaWZpYyBzZXJ2aWNlcy4gLS0+CisgIDxpbmNsdWRlZGlyPnNlc3Npb24uZDwvaW5jbHVkZWRpcj4KKworICA8IS0tIFRoaXMgaXMgaW5jbHVkZWQgbGFzdCBzbyBsb2NhbCBjb25maWd1cmF0aW9uIGNhbiBvdmVycmlkZSB3aGF0J3MgCisgICAgICAgaW4gdGhpcyBzdGFuZGFyZCBmaWxlIC0tPgorICA8aW5jbHVkZSBpZ25vcmVfbWlzc2luZz0ieWVzIj5zZXNzaW9uLWxvY2FsLmNvbmY8L2luY2x1ZGU+CisKKyAgPGluY2x1ZGUgaWZfc2VsaW51eF9lbmFibGVkPSJ5ZXMiIHNlbGludXhfcm9vdF9yZWxhdGl2ZT0ieWVzIj5jb250ZXh0cy9kYnVzX2NvbnRleHRzPC9pbmNsdWRlPgorCisgIDwhLS0gRm9yIHRoZSBzZXNzaW9uIGJ1cywgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcmVsYXRpdmVseS1sb3cgbGltaXRzIAorICAgICAgIHdpdGggZXNzZW50aWFsbHkgaW5maW5pdGUgbGltaXRzLCBzaW5jZSB0aGUgYnVzIGlzIGp1c3QgcnVubmluZyAKKyAgICAgICBhcyB0aGUgdXNlciBhbnl3YXksIHVzaW5nIHVwIGJ1cyByZXNvdXJjZXMgaXMgbm90IHNvbWV0aGluZyB3ZSBuZWVkIAorICAgICAgIHRvIHdvcnJ5IGFib3V0LiBJbiBzb21lIGNhc2VzLCB3ZSBkbyBzZXQgdGhlIGxpbWl0cyBsb3dlciB0aGFuIAorICAgICAgICJhbGwgYXZhaWxhYmxlIG1lbW9yeSIgaWYgZXhjZWVkaW5nIHRoZSBsaW1pdCBpcyBhbG1vc3QgY2VydGFpbmx5IGEgYnVnLCAKKyAgICAgICBoYXZpbmcgdGhlIGJ1cyBlbmZvcmNlIGEgbGltaXQgaXMgbmljZXIgdGhhbiBhIGh1Z2UgbWVtb3J5IGxlYWsuIEJ1dCB0aGUgCisgICAgICAgaW50ZW50IGlzIHRoYXQgdGhlc2UgbGltaXRzIHNob3VsZCBuZXZlciBiZSBoaXQuIC0tPgorCisgIDwhLS0gdGhlIG1lbW9yeSBsaW1pdHMgYXJlIDFHIGluc3RlYWQgb2Ygc2F5IDRHIGJlY2F1c2UgdGhleSBjYW4ndCBleGNlZWQgMzItYml0IHNpZ25lZCBpbnQgbWF4IC0tPgorICA8bGltaXQgbmFtZT0ibWF4X2luY29taW5nX2J5dGVzIj4xMDAwMDAwMDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9pbmNvbWluZ191bml4X2ZkcyI+MjUwMDAwMDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9vdXRnb2luZ19ieXRlcyI+MTAwMDAwMDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfb3V0Z29pbmdfdW5peF9mZHMiPjI1MDAwMDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfbWVzc2FnZV9zaXplIj4xMDAwMDAwMDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9tZXNzYWdlX3VuaXhfZmRzIj40MDk2PC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9InNlcnZpY2Vfc3RhcnRfdGltZW91dCI+MTIwMDAwPC9saW1pdD4gIAorICA8bGltaXQgbmFtZT0iYXV0aF90aW1lb3V0Ij4yNDAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyI+MTAwMDAwPC9saW1pdD4gIAorICA8bGltaXQgbmFtZT0ibWF4X2luY29tcGxldGVfY29ubmVjdGlvbnMiPjEwMDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9jb25uZWN0aW9uc19wZXJfdXNlciI+MTAwMDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9wZW5kaW5nX3NlcnZpY2Vfc3RhcnRzIj4xMDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfbmFtZXNfcGVyX2Nvbm5lY3Rpb24iPjUwMDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbiI+NTAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X3JlcGxpZXNfcGVyX2Nvbm5lY3Rpb24iPjUwMDAwPC9saW1pdD4KKworPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS9kYnVzL2J1cy9zaWduYWxzLmMgYi9kYnVzL2J1cy9zaWduYWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg1MDZkMwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvYnVzL3NpZ25hbHMuYwpAQCAtMCwwICsxLDI4MTUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogc2lnbmFscy5jICBCdXMgc2lnbmFsIGNvbm5lY3Rpb24gaW1wbGVtZW50YXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDUgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJzaWduYWxzLmgiCisjaW5jbHVkZSAic2VydmljZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmg+CisKK3N0cnVjdCBCdXNNYXRjaFJ1bGUKK3sKKyAgaW50IHJlZmNvdW50OyAgICAgICAvKio8IHJlZmVyZW5jZSBjb3VudCAqLworCisgIERCdXNDb25uZWN0aW9uICptYXRjaGVzX2dvX3RvOyAvKio8IE93bmVyIG9mIHRoZSBydWxlICovCisKKyAgdW5zaWduZWQgaW50IGZsYWdzOyAvKio8IEJ1c01hdGNoRmxhZ3MgKi8KKworICBpbnQgICBtZXNzYWdlX3R5cGU7CisgIGNoYXIgKmludGVyZmFjZTsKKyAgY2hhciAqbWVtYmVyOworICBjaGFyICpzZW5kZXI7CisgIGNoYXIgKmRlc3RpbmF0aW9uOworICBjaGFyICpwYXRoOworCisgIHVuc2lnbmVkIGludCAqYXJnX2xlbnM7CisgIGNoYXIgKiphcmdzOworICBpbnQgYXJnc19sZW47Cit9OworCisjZGVmaW5lIEJVU19NQVRDSF9BUkdfTkFNRVNQQUNFICAgMHg0MDAwMDAwdQorI2RlZmluZSBCVVNfTUFUQ0hfQVJHX0lTX1BBVEggIDB4ODAwMDAwMHUKKworI2RlZmluZSBCVVNfTUFUQ0hfQVJHX0ZMQUdTIChCVVNfTUFUQ0hfQVJHX05BTUVTUEFDRSB8IEJVU19NQVRDSF9BUkdfSVNfUEFUSCkKKworQnVzTWF0Y2hSdWxlKgorYnVzX21hdGNoX3J1bGVfbmV3IChEQnVzQ29ubmVjdGlvbiAqbWF0Y2hlc19nb190bykKK3sKKyAgQnVzTWF0Y2hSdWxlICpydWxlOworCisgIHJ1bGUgPSBkYnVzX25ldzAgKEJ1c01hdGNoUnVsZSwgMSk7CisgIGlmIChydWxlID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcnVsZS0+cmVmY291bnQgPSAxOworICBydWxlLT5tYXRjaGVzX2dvX3RvID0gbWF0Y2hlc19nb190bzsKKworI2lmbmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgIF9kYnVzX2Fzc2VydCAocnVsZS0+bWF0Y2hlc19nb190byAhPSBOVUxMKTsKKyNlbmRpZgorICAKKyAgcmV0dXJuIHJ1bGU7Cit9CisKK0J1c01hdGNoUnVsZSAqCitidXNfbWF0Y2hfcnVsZV9yZWYgKEJ1c01hdGNoUnVsZSAqcnVsZSkKK3sKKyAgX2RidXNfYXNzZXJ0IChydWxlLT5yZWZjb3VudCA+IDApOworCisgIHJ1bGUtPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIHJ1bGU7Cit9CisKK3ZvaWQKK2J1c19tYXRjaF9ydWxlX3VucmVmIChCdXNNYXRjaFJ1bGUgKnJ1bGUpCit7CisgIF9kYnVzX2Fzc2VydCAocnVsZS0+cmVmY291bnQgPiAwKTsKKworICBydWxlLT5yZWZjb3VudCAtPSAxOworICBpZiAocnVsZS0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPmludGVyZmFjZSk7CisgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPm1lbWJlcik7CisgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPnNlbmRlcik7CisgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPmRlc3RpbmF0aW9uKTsKKyAgICAgIGRidXNfZnJlZSAocnVsZS0+cGF0aCk7CisgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPmFyZ19sZW5zKTsKKworICAgICAgLyogY2FuJ3QgdXNlIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkoKSBzaW5jZSB0aGVyZQorICAgICAgICogYXJlIGVtYmVkZGVkIE5VTEwKKyAgICAgICAqLworICAgICAgaWYgKHJ1bGUtPmFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgIGkgPSAwOworICAgICAgICAgIHdoaWxlIChpIDwgcnVsZS0+YXJnc19sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChydWxlLT5hcmdzW2ldKQorICAgICAgICAgICAgICAgIGRidXNfZnJlZSAocnVsZS0+YXJnc1tpXSk7CisgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGRidXNfZnJlZSAocnVsZS0+YXJncyk7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgZGJ1c19mcmVlIChydWxlKTsKKyAgICB9Cit9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKy8qIE5vdGUgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBkbyBlc2NhcGluZywgc28gaXQncyBvbmx5CisgKiBnb29kIGZvciBkZWJ1ZyBzcGV3IGF0IHRoZSBtb21lbnQKKyAqLworc3RhdGljIGNoYXIqCittYXRjaF9ydWxlX3RvX3N0cmluZyAoQnVzTWF0Y2hSdWxlICpydWxlKQoreworICBEQnVzU3RyaW5nIHN0cjsKKyAgY2hhciAqcmV0OworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgeworICAgICAgY2hhciAqczsKKyAgICAgIHdoaWxlICgocyA9IF9kYnVzX3N0cmR1cCAoIm5vbWVtIikpID09IE5VTEwpCisgICAgICAgIDsgLyogb25seSBPSyBmb3IgZGVidWcgc3Bldy4uLiAqLworICAgICAgcmV0dXJuIHM7CisgICAgfQorICAKKyAgaWYgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX01FU1NBR0VfVFlQRSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmc3RyLCAidHlwZT0nJXMnIiwKKyAgICAgICAgICAgIGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAocnVsZS0+bWVzc2FnZV90eXBlKSkpCisgICAgICAgIGdvdG8gbm9tZW07CisgICAgfQorCisgIGlmIChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9JTlRFUkZBQ0UpCisgICAgeworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICIsIikpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICB9CisgICAgICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKCZzdHIsICJpbnRlcmZhY2U9JyVzJyIsIHJ1bGUtPmludGVyZmFjZSkpCisgICAgICAgIGdvdG8gbm9tZW07CisgICAgfQorCisgIGlmIChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9NRU1CRVIpCisgICAgeworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICIsIikpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICB9CisgICAgICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKCZzdHIsICJtZW1iZXI9JyVzJyIsIHJ1bGUtPm1lbWJlcikpCisgICAgICAgIGdvdG8gbm9tZW07CisgICAgfQorCisgIGlmIChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9QQVRIKQorICAgIHsKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPiAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiLCIpKQorICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmc3RyLCAicGF0aD0nJXMnIiwgcnVsZS0+cGF0aCkpCisgICAgICAgIGdvdG8gbm9tZW07CisgICAgfQorCisgIGlmIChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9QQVRIX05BTUVTUEFDRSkKKyAgICB7CisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID4gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgIiwiKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoJnN0ciwgInBhdGhfbmFtZXNwYWNlPSclcyciLCBydWxlLT5wYXRoKSkKKyAgICAgICAgZ290byBub21lbTsKKyAgICB9CisKKyAgaWYgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX1NFTkRFUikKKyAgICB7CisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID4gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgIiwiKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoJnN0ciwgInNlbmRlcj0nJXMnIiwgcnVsZS0+c2VuZGVyKSkKKyAgICAgICAgZ290byBub21lbTsKKyAgICB9CisKKyAgaWYgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX0RFU1RJTkFUSU9OKQorICAgIHsKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPiAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiLCIpKQorICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmc3RyLCAiZGVzdGluYXRpb249JyVzJyIsIHJ1bGUtPmRlc3RpbmF0aW9uKSkKKyAgICAgICAgZ290byBub21lbTsKKyAgICB9CisKKyAgaWYgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX0NMSUVOVF9JU19FQVZFU0RST1BQSU5HKQorICAgIHsKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPiAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiLCIpKQorICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmc3RyLCAiZWF2ZXNkcm9wPSclcyciLAorICAgICAgICAgICAgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX0NMSUVOVF9JU19FQVZFU0RST1BQSU5HKSA/CisgICAgICAgICAgICAidHJ1ZSIgOiAiZmFsc2UiKSkKKyAgICAgICAgZ290byBub21lbTsKKyAgICB9CisKKyAgaWYgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX0FSR1MpCisgICAgeworICAgICAgaW50IGk7CisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJncyAhPSBOVUxMKTsKKworICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAoaSA8IHJ1bGUtPmFyZ3NfbGVuKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHJ1bGUtPmFyZ3NbaV0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19ib29sX3QgaXNfcGF0aCwgaXNfbmFtZXNwYWNlOworCisgICAgICAgICAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgIiwiKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaXNfcGF0aCA9IChydWxlLT5hcmdfbGVuc1tpXSAmIEJVU19NQVRDSF9BUkdfSVNfUEFUSCkgIT0gMDsKKyAgICAgICAgICAgICAgaXNfbmFtZXNwYWNlID0gKHJ1bGUtPmFyZ19sZW5zW2ldICYgQlVTX01BVENIX0FSR19OQU1FU1BBQ0UpICE9IDA7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJnJWQlcz0nJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcGF0aCA/ICJwYXRoIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX25hbWVzcGFjZSA/ICJuYW1lc3BhY2UiIDogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmFyZ3NbaV0pKQorICAgICAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJnN0ciwgJnJldCkpCisgICAgZ290byBub21lbTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgIHJldHVybiByZXQ7CisgIAorIG5vbWVtOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgIHsKKyAgICBjaGFyICpzOworICAgIHdoaWxlICgocyA9IF9kYnVzX3N0cmR1cCAoIm5vbWVtIikpID09IE5VTEwpCisgICAgICA7ICAvKiBvbmx5IE9LIGZvciBkZWJ1ZyBzcGV3Li4uICovCisgICAgcmV0dXJuIHM7CisgIH0KK30KKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUgKi8KKworZGJ1c19ib29sX3QKK2J1c19tYXRjaF9ydWxlX3NldF9tZXNzYWdlX3R5cGUgKEJ1c01hdGNoUnVsZSAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgdHlwZSkKK3sKKyAgcnVsZS0+ZmxhZ3MgfD0gQlVTX01BVENIX01FU1NBR0VfVFlQRTsKKworICBydWxlLT5tZXNzYWdlX3R5cGUgPSB0eXBlOworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX21hdGNoX3J1bGVfc2V0X2ludGVyZmFjZSAoQnVzTWF0Y2hSdWxlICpydWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICppbnRlcmZhY2UpCit7CisgIGNoYXIgKm5ldzsKKworICBfZGJ1c19hc3NlcnQgKGludGVyZmFjZSAhPSBOVUxMKTsKKworICBuZXcgPSBfZGJ1c19zdHJkdXAgKGludGVyZmFjZSk7CisgIGlmIChuZXcgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcnVsZS0+ZmxhZ3MgfD0gQlVTX01BVENIX0lOVEVSRkFDRTsKKyAgZGJ1c19mcmVlIChydWxlLT5pbnRlcmZhY2UpOworICBydWxlLT5pbnRlcmZhY2UgPSBuZXc7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90CitidXNfbWF0Y2hfcnVsZV9zZXRfbWVtYmVyIChCdXNNYXRjaFJ1bGUgKnJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKm1lbWJlcikKK3sKKyAgY2hhciAqbmV3OworCisgIF9kYnVzX2Fzc2VydCAobWVtYmVyICE9IE5VTEwpOworCisgIG5ldyA9IF9kYnVzX3N0cmR1cCAobWVtYmVyKTsKKyAgaWYgKG5ldyA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBydWxlLT5mbGFncyB8PSBCVVNfTUFUQ0hfTUVNQkVSOworICBkYnVzX2ZyZWUgKHJ1bGUtPm1lbWJlcik7CisgIHJ1bGUtPm1lbWJlciA9IG5ldzsKKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19tYXRjaF9ydWxlX3NldF9zZW5kZXIgKEJ1c01hdGNoUnVsZSAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqc2VuZGVyKQoreworICBjaGFyICpuZXc7CisKKyAgX2RidXNfYXNzZXJ0IChzZW5kZXIgIT0gTlVMTCk7CisKKyAgbmV3ID0gX2RidXNfc3RyZHVwIChzZW5kZXIpOworICBpZiAobmV3ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJ1bGUtPmZsYWdzIHw9IEJVU19NQVRDSF9TRU5ERVI7CisgIGRidXNfZnJlZSAocnVsZS0+c2VuZGVyKTsKKyAgcnVsZS0+c2VuZGVyID0gbmV3OworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX21hdGNoX3J1bGVfc2V0X2Rlc3RpbmF0aW9uIChCdXNNYXRjaFJ1bGUgKnJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqZGVzdGluYXRpb24pCit7CisgIGNoYXIgKm5ldzsKKworICBfZGJ1c19hc3NlcnQgKGRlc3RpbmF0aW9uICE9IE5VTEwpOworCisgIG5ldyA9IF9kYnVzX3N0cmR1cCAoZGVzdGluYXRpb24pOworICBpZiAobmV3ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJ1bGUtPmZsYWdzIHw9IEJVU19NQVRDSF9ERVNUSU5BVElPTjsKKyAgZGJ1c19mcmVlIChydWxlLT5kZXN0aW5hdGlvbik7CisgIHJ1bGUtPmRlc3RpbmF0aW9uID0gbmV3OworCisgIHJldHVybiBUUlVFOworfQorCit2b2lkCitidXNfbWF0Y2hfcnVsZV9zZXRfY2xpZW50X2lzX2VhdmVzZHJvcHBpbmcgKEJ1c01hdGNoUnVsZSAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgaXNfZWF2ZXNkcm9wcGluZykKK3sKKyAgaWYgKGlzX2VhdmVzZHJvcHBpbmcpCisgICAgcnVsZS0+ZmxhZ3MgfD0gQlVTX01BVENIX0NMSUVOVF9JU19FQVZFU0RST1BQSU5HOworICBlbHNlCisgICAgcnVsZS0+ZmxhZ3MgJj0gfihCVVNfTUFUQ0hfQ0xJRU5UX0lTX0VBVkVTRFJPUFBJTkcpOworfQorCitkYnVzX2Jvb2xfdAorYnVzX21hdGNoX3J1bGVfc2V0X3BhdGggKEJ1c01hdGNoUnVsZSAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICBpc19uYW1lc3BhY2UpCit7CisgIGNoYXIgKm5ldzsKKworICBfZGJ1c19hc3NlcnQgKHBhdGggIT0gTlVMTCk7CisKKyAgbmV3ID0gX2RidXNfc3RyZHVwIChwYXRoKTsKKyAgaWYgKG5ldyA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBydWxlLT5mbGFncyAmPSB+KEJVU19NQVRDSF9QQVRIfEJVU19NQVRDSF9QQVRIX05BTUVTUEFDRSk7CisKKyAgaWYgKGlzX25hbWVzcGFjZSkKKyAgICBydWxlLT5mbGFncyB8PSBCVVNfTUFUQ0hfUEFUSF9OQU1FU1BBQ0U7CisgIGVsc2UKKyAgICBydWxlLT5mbGFncyB8PSBCVVNfTUFUQ0hfUEFUSDsKKworICBkYnVzX2ZyZWUgKHJ1bGUtPnBhdGgpOworICBydWxlLT5wYXRoID0gbmV3OworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX21hdGNoX3J1bGVfc2V0X2FyZyAoQnVzTWF0Y2hSdWxlICAgICAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGlzX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBpc19uYW1lc3BhY2UpCit7CisgIGludCBsZW5ndGg7CisgIGNoYXIgKm5ldzsKKworICBfZGJ1c19hc3NlcnQgKHZhbHVlICE9IE5VTEwpOworCisgIC8qIGFyZ3NfbGVuIGlzIHRoZSBudW1iZXIgb2YgYXJncyBub3QgaW5jbHVkaW5nIG51bGwgdGVybWluYXRpb24KKyAgICogaW4gdGhlIGNoYXIqKgorICAgKi8KKyAgaWYgKGFyZyA+PSBydWxlLT5hcmdzX2xlbikKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgKm5ld19hcmdfbGVuczsKKyAgICAgIGNoYXIgKipuZXdfYXJnczsKKyAgICAgIGludCBuZXdfYXJnc19sZW47CisgICAgICBpbnQgaTsKKworICAgICAgbmV3X2FyZ3NfbGVuID0gYXJnICsgMTsKKworICAgICAgLyogYWRkIGFub3RoZXIgKyAxIGhlcmUgZm9yIG51bGwgdGVybWluYXRpb24gKi8KKyAgICAgIG5ld19hcmdzID0gZGJ1c19yZWFsbG9jIChydWxlLT5hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoY2hhciAqKSAqIChuZXdfYXJnc19sZW4gKyAxKSk7CisgICAgICBpZiAobmV3X2FyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAvKiBOVUxMIHRoZSBuZXcgc2xvdHMgKi8KKyAgICAgIGkgPSBydWxlLT5hcmdzX2xlbjsKKyAgICAgIHdoaWxlIChpIDw9IG5ld19hcmdzX2xlbikgLyogPD0gZm9yIG51bGwgdGVybWluYXRpb24gKi8KKyAgICAgICAgeworICAgICAgICAgIG5ld19hcmdzW2ldID0gTlVMTDsKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgcnVsZS0+YXJncyA9IG5ld19hcmdzOworCisgICAgICAvKiBhbmQgbm93IGFkZCB0byB0aGUgbGVuZ3RocyAqLworICAgICAgbmV3X2FyZ19sZW5zID0gZGJ1c19yZWFsbG9jIChydWxlLT5hcmdfbGVucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChpbnQpICogKG5ld19hcmdzX2xlbiArIDEpKTsKKworICAgICAgaWYgKG5ld19hcmdfbGVucyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIC8qIHplcm8gdGhlIG5ldyBzbG90cyAqLworICAgICAgaSA9IHJ1bGUtPmFyZ3NfbGVuOworICAgICAgd2hpbGUgKGkgPD0gbmV3X2FyZ3NfbGVuKSAvKiA8PSBmb3IgbnVsbCB0ZXJtaW5hdGlvbiAqLworICAgICAgICB7CisgICAgICAgICAgbmV3X2FyZ19sZW5zW2ldID0gMDsKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKworICAgICAgcnVsZS0+YXJnX2xlbnMgPSBuZXdfYXJnX2xlbnM7CisgICAgICBydWxlLT5hcmdzX2xlbiA9IG5ld19hcmdzX2xlbjsKKyAgICB9CisKKyAgbGVuZ3RoID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHZhbHVlKTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9kYXRhICh2YWx1ZSwgJm5ldykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJ1bGUtPmZsYWdzIHw9IEJVU19NQVRDSF9BUkdTOworCisgIGRidXNfZnJlZSAocnVsZS0+YXJnc1thcmddKTsKKyAgcnVsZS0+YXJnX2xlbnNbYXJnXSA9IGxlbmd0aDsKKyAgcnVsZS0+YXJnc1thcmddID0gbmV3OworCisgIGlmIChpc19wYXRoKQorICAgIHJ1bGUtPmFyZ19sZW5zW2FyZ10gfD0gQlVTX01BVENIX0FSR19JU19QQVRIOworCisgIGlmIChpc19uYW1lc3BhY2UpCisgICAgcnVsZS0+YXJnX2xlbnNbYXJnXSB8PSBCVVNfTUFUQ0hfQVJHX05BTUVTUEFDRTsKKworICAvKiBOVUxMIHRlcm1pbmF0aW9uIGRpZG4ndCBnZXQgYnVzdGVkICovCisgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1tydWxlLT5hcmdzX2xlbl0gPT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnX2xlbnNbcnVsZS0+YXJnc19sZW5dID09IDApOworCisgIHJldHVybiBUUlVFOworfQorCisjZGVmaW5lIElTV0hJVEUoYykgKCgoYykgPT0gJyAnKSB8fCAoKGMpID09ICdcdCcpIHx8ICgoYykgPT0gJ1xuJykgfHwgKChjKSA9PSAnXHInKSkKKworc3RhdGljIGRidXNfYm9vbF90CitmaW5kX2tleSAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmtleSwKKyAgICAgICAgICBpbnQgICAgICAgICAgICAgICp2YWx1ZV9wb3MsCisgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKnA7CisgIGNvbnN0IGNoYXIgKnM7CisgIGNvbnN0IGNoYXIgKmtleV9zdGFydDsKKyAgY29uc3QgY2hhciAqa2V5X2VuZDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIHMgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHN0cik7CisKKyAgcCA9IHMgKyBzdGFydDsKKworICB3aGlsZSAoKnAgJiYgSVNXSElURSAoKnApKQorICAgICsrcDsKKworICBrZXlfc3RhcnQgPSBwOworCisgIHdoaWxlICgqcCAmJiAqcCAhPSAnPScgJiYgIUlTV0hJVEUgKCpwKSkKKyAgICArK3A7CisKKyAga2V5X2VuZCA9IHA7CisKKyAgd2hpbGUgKCpwICYmIElTV0hJVEUgKCpwKSkKKyAgICArK3A7CisgIAorICBpZiAoa2V5X3N0YXJ0ID09IGtleV9lbmQpCisgICAgeworICAgICAgLyogRW1wdHkgbWF0Y2ggcnVsZXMgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBhcmUgT0sgKi8KKyAgICAgICp2YWx1ZV9wb3MgPSBwIC0gczsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoKnAgIT0gJz0nKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgIk1hdGNoIHJ1bGUgaGFzIGEga2V5IHdpdGggbm8gc3Vic2VxdWVudCAnPScgY2hhcmFjdGVyIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICArK3A7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfbGVuIChrZXksIGtleV9zdGFydCwga2V5X2VuZCAtIGtleV9zdGFydCkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgKnZhbHVlX3BvcyA9IHAgLSBzOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZmluZF92YWx1ZSAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICprZXksCisgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKnZhbHVlX2VuZCwKKyAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpwOworICBjb25zdCBjaGFyICpzOworICBjaGFyIHF1b3RlX2NoYXI7CisgIGludCBvcmlnX2xlbjsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHZhbHVlKTsKKyAgCisgIHMgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHN0cik7CisKKyAgcCA9IHMgKyBzdGFydDsKKworICBxdW90ZV9jaGFyID0gJ1wwJzsKKworICB3aGlsZSAoKnApCisgICAgeworICAgICAgaWYgKHF1b3RlX2NoYXIgPT0gJ1wwJykKKyAgICAgICAgeworICAgICAgICAgIHN3aXRjaCAoKnApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlICdcMCc6CisgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKworICAgICAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgICAgICBxdW90ZV9jaGFyID0gJ1wnJzsKKyAgICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgJywnOgorICAgICAgICAgICAgICArK3A7CisgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKworICAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICBxdW90ZV9jaGFyID0gJ1xcJzsKKyAgICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICh2YWx1ZSwgKnApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHF1b3RlX2NoYXIgPT0gJ1xcJykKKyAgICAgICAgeworICAgICAgICAgIC8qIFwgb25seSBjb3VudHMgYXMgYW4gZXNjYXBlIGlmIGVzY2FwaW5nIGEgcXVvdGUgbWFyayAqLworICAgICAgICAgIGlmICgqcCAhPSAnXCcnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAodmFsdWUsICdcXCcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAodmFsdWUsICpwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgcXVvdGVfY2hhciA9ICdcMCc7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Fzc2VydCAocXVvdGVfY2hhciA9PSAnXCcnKTsKKworICAgICAgICAgIGlmICgqcCA9PSAnXCcnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBxdW90ZV9jaGFyID0gJ1wwJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICh2YWx1ZSwgKnApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIG5leHQ6CisgICAgICArK3A7CisgICAgfQorCisgZG9uZToKKworICBpZiAocXVvdGVfY2hhciA9PSAnXFwnKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICh2YWx1ZSwgJ1xcJykpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgfQorICBlbHNlIGlmIChxdW90ZV9jaGFyID09ICdcJycpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAiVW5iYWxhbmNlZCBxdW90YXRpb24gbWFya3MgaW4gbWF0Y2ggcnVsZSIpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICBlbHNlCisgICAgX2RidXNfYXNzZXJ0IChxdW90ZV9jaGFyID09ICdcMCcpOworCisgIC8qIFplcm8tbGVuZ3RoIHZhbHVlcyBhcmUgYWxsb3dlZCAqLworICAKKyAgKnZhbHVlX2VuZCA9IHAgLSBzOworICAKKyAgcmV0dXJuIFRSVUU7CisKKyBmYWlsZWQ6CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKHZhbHVlLCBvcmlnX2xlbik7CisgIHJldHVybiBGQUxTRTsKK30KKworLyogZHVwbGljYXRlcyBhcmVuJ3QgYWxsb3dlZCBzbyB0aGUgcmVhbCBsZWdpdGltYXRlIG1heCBpcyBvbmx5IDYgb3IKKyAqIHNvLiBMZWF2aW5nIGV4dHJhIHNvIHdlIGRvbid0IGhhdmUgdG8gYm90aGVyIHRvIHVwZGF0ZSBpdC4KKyAqIEZJWE1FIHRoaXMgaXMgc29ydCBvZiBidXN0ZWQgbm93IHdpdGggYXJnIG1hdGNoaW5nLCBidXQgd2UgbGV0CisgKiB5b3UgbWF0Y2ggb24gdXAgdG8gMTAgYXJncyBmb3Igbm93CisgKi8KKyNkZWZpbmUgTUFYX1JVTEVfVE9LRU5TIDE2CisKKy8qIHRoaXMgaXMgc2xpZ2h0bHkgdG9vIGhpZ2ggbGV2ZWwgdG8gYmUgdGVybWVkIGEgInRva2VuIgorICogYnV0IGxldCdzIG5vdCBiZSBwZWRhbnRpYy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY2hhciAqa2V5OworICBjaGFyICp2YWx1ZTsKK30gUnVsZVRva2VuOworCitzdGF0aWMgZGJ1c19ib29sX3QKK3Rva2VuaXplX3J1bGUgKGNvbnN0IERCdXNTdHJpbmcgKnJ1bGVfdGV4dCwKKyAgICAgICAgICAgICAgIFJ1bGVUb2tlbiAgICAgICAgIHRva2Vuc1tNQVhfUlVMRV9UT0tFTlNdLAorICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpIAoreworICBpbnQgaTsKKyAgaW50IHBvczsKKyAgREJ1c1N0cmluZyBrZXk7CisgIERCdXNTdHJpbmcgdmFsdWU7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZrZXkpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ2YWx1ZSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZrZXkpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaSA9IDA7CisgIHBvcyA9IDA7CisgIHdoaWxlIChpIDwgTUFYX1JVTEVfVE9LRU5TICYmCisgICAgICAgICBwb3MgPCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocnVsZV90ZXh0KSkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHRva2Vuc1tpXS5rZXkgPT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHRva2Vuc1tpXS52YWx1ZSA9PSBOVUxMKTsKKworICAgICAgaWYgKCFmaW5kX2tleSAocnVsZV90ZXh0LCBwb3MsICZrZXksICZwb3MsIGVycm9yKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmtleSkgPT0gMCkKKyAgICAgICAgZ290byBuZXh0OworICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgma2V5LCAmdG9rZW5zW2ldLmtleSkpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmICghZmluZF92YWx1ZSAocnVsZV90ZXh0LCBwb3MsIHRva2Vuc1tpXS5rZXksICZ2YWx1ZSwgJnBvcywgZXJyb3IpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJnZhbHVlLCAmdG9rZW5zW2ldLnZhbHVlKSkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgIG5leHQ6CisgICAgICArK2k7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisgIAorIG91dDoKKyAgaWYgKCFyZXR2YWwpCisgICAgeworICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAodG9rZW5zW2ldLmtleSB8fCB0b2tlbnNbaV0udmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHRva2Vuc1tpXS5rZXkpOworICAgICAgICAgIGRidXNfZnJlZSAodG9rZW5zW2ldLnZhbHVlKTsKKyAgICAgICAgICB0b2tlbnNbaV0ua2V5ID0gTlVMTDsKKyAgICAgICAgICB0b2tlbnNbaV0udmFsdWUgPSBOVUxMOworICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIF9kYnVzX3N0cmluZ19mcmVlICgma2V5KTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ2YWx1ZSk7CisgIAorICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19tYXRjaF9ydWxlX3BhcnNlX2FyZ19tYXRjaCAoQnVzTWF0Y2hSdWxlICAgICAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGRidXNfYm9vbF90IGlzX3BhdGggPSBGQUxTRTsKKyAgZGJ1c19ib29sX3QgaXNfbmFtZXNwYWNlID0gRkFMU0U7CisgIERCdXNTdHJpbmcga2V5X3N0cjsKKyAgdW5zaWduZWQgbG9uZyBhcmc7CisgIGludCBsZW5ndGg7CisgIGludCBlbmQ7CisKKyAgLyogRm9yIG5vdywgYXJnMD0nZm9vJyBhbHdheXMgaW1wbGllcyB0aGF0ICdmb28nIGlzIGEKKyAgICogREJVU19UWVBFX1NUUklORy4gU29tZWRheSB3ZSBjb3VsZCBhZGQgYW4gYXJnMHR5cGU9J2ludDMyJyB0aGluZworICAgKiBpZiB3ZSB3YW50ZWQsIHdoaWNoIHdvdWxkIHNwZWNpZnkgYW5vdGhlciB0eXBlLCBpbiB3aGljaCBjYXNlCisgICAqIGFyZzA9JzUnIHdvdWxkIGhhdmUgdGhlIDUgcGFyc2VkIGFzIGFuIGludCByYXRoZXIgdGhhbiBzdHJpbmcuCisgICAqLworICAKKyAgLyogRmlyc3Qgd2UgbmVlZCB0byBwYXJzZSBhcmcwID0gMCwgYXJnMjcgPSAyNyAqLworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgma2V5X3N0ciwga2V5KTsKKyAgbGVuZ3RoID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZrZXlfc3RyKTsKKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZrZXlfc3RyKSA8IDQpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAiS2V5ICclcycgaW4gbWF0Y2ggcnVsZSBzdGFydHMgd2l0aCAnYXJnJyBidXQgbGFja3MgYW4gYXJnIG51bWJlci4gU2hvdWxkIGJlICdhcmcwJyBvciAnYXJnNycgZm9yIGV4YW1wbGUuXG4iLCBrZXkpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX3BhcnNlX3VpbnQgKCZrZXlfc3RyLCAzLCAmYXJnLCAmZW5kKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTUFUQ0hfUlVMRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICJLZXkgJyVzJyBpbiBtYXRjaCBydWxlIHN0YXJ0cyB3aXRoICdhcmcnIGJ1dCBjb3VsZCBub3QgcGFyc2UgYXJnIG51bWJlci4gU2hvdWxkIGJlICdhcmcwJyBvciAnYXJnNycgZm9yIGV4YW1wbGUuXG4iLCBrZXkpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmIChlbmQgIT0gbGVuZ3RoKQorICAgIHsKKyAgICAgIGlmICgoZW5kICsgc3RybGVuICgicGF0aCIpKSA9PSBsZW5ndGggJiYKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZW5kc193aXRoX2Nfc3RyICgma2V5X3N0ciwgInBhdGgiKSkKKyAgICAgICAgeworICAgICAgICAgIGlzX3BhdGggPSBUUlVFOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZrZXlfc3RyLCAiYXJnMG5hbWVzcGFjZSIpKQorICAgICAgICB7CisgICAgICAgICAgaW50IHZhbHVlX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh2YWx1ZSk7CisKKyAgICAgICAgICBpc19uYW1lc3BhY2UgPSBUUlVFOworCisgICAgICAgICAgaWYgKCFfZGJ1c192YWxpZGF0ZV9idXNfbmFtZXNwYWNlICh2YWx1ZSwgMCwgdmFsdWVfbGVuKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICJhcmcwbmFtZXNwYWNlPSclcycgaXMgbm90IGEgdmFsaWQgcHJlZml4IG9mIGEgYnVzIG5hbWUiLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICh2YWx1ZSkpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgIktleSAnJXMnIGluIG1hdGNoIHJ1bGUgY29udGFpbnMganVuayBhZnRlciBhcmd1bWVudCBudW1iZXIgKCV1KS4gT25seSAnYXJnJXVwYXRoJyAoZm9yIGV4YW1wbGUpIG9yICdhcmcwbmFtZXNwYWNlJyBhcmUgdmFsaWQiLCBrZXksIGFyZywgYXJnKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBJZiB3ZSBkaWRuJ3QgY2hlY2sgdGhpcyB3ZSBjb3VsZCBhbGxvY2F0ZSBhIGh1Z2UgYW1vdW50IG9mIFJBTSAqLworICBpZiAoYXJnID4gREJVU19NQVhJTVVNX01BVENIX1JVTEVfQVJHX05VTUJFUikKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTUFUQ0hfUlVMRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICJLZXkgJyVzJyBpbiBtYXRjaCBydWxlIGhhcyBhcmcgbnVtYmVyICVsdSBidXQgdGhlIG1heGltdW0gaXMgJWQuXG4iLCBrZXksICh1bnNpZ25lZCBsb25nKSBhcmcsIERCVVNfTUFYSU1VTV9NQVRDSF9SVUxFX0FSR19OVU1CRVIpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICAKKyAgaWYgKChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9BUkdTKSAmJgorICAgICAgcnVsZS0+YXJnc19sZW4gPiAoaW50KSBhcmcgJiYKKyAgICAgIHJ1bGUtPmFyZ3NbYXJnXSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgIkFyZ3VtZW50ICVkIG1hdGNoZWQgbW9yZSB0aGFuIG9uY2UgaW4gbWF0Y2ggcnVsZVxuIiwga2V5KTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgCisgIGlmICghYnVzX21hdGNoX3J1bGVfc2V0X2FyZyAocnVsZSwgYXJnLCB2YWx1ZSwgaXNfcGF0aCwgaXNfbmFtZXNwYWNlKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIHJldHVybiBUUlVFOworCisgZmFpbGVkOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoKKyAqIFRoZSBmb3JtYXQgaXMgY29tbWEtc2VwYXJhdGVkIHdpdGggc3RyaW5ncyBxdW90ZWQgd2l0aCBzaW5nbGUgcXVvdGVzCisgKiBhcyBmb3IgdGhlIHNoZWxsICh0byBlc2NhcGUgYSBsaXRlcmFsIHNpbmdsZSBxdW90ZSwgdXNlICdcJycpLgorICoKKyAqIHR5cGU9J3NpZ25hbCcsc2VuZGVyPSdvcmcuZnJlZWRlc2t0b3AuREJ1cycsaW50ZXJmYWNlPSdvcmcuZnJlZWRlc2t0b3AuREJ1cycsbWVtYmVyPSdGb28nLAorICogcGF0aD0nL2Jhci9mb28nLGRlc3RpbmF0aW9uPSc6NDUyMzQ1LjM0JworICoKKyAqLworQnVzTWF0Y2hSdWxlKgorYnVzX21hdGNoX3J1bGVfcGFyc2UgKERCdXNDb25uZWN0aW9uICAgKm1hdGNoZXNfZ29fdG8sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqcnVsZV90ZXh0LAorICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBCdXNNYXRjaFJ1bGUgKnJ1bGU7CisgIFJ1bGVUb2tlbiB0b2tlbnNbTUFYX1JVTEVfVE9LRU5TKzFdOyAvKiBOVUxMIHRlcm1pbmF0aW9uICsgMSAqLworICBpbnQgaTsKKyAgCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocnVsZV90ZXh0KSA+IERCVVNfTUFYSU1VTV9NQVRDSF9SVUxFX0xFTkdUSCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTElNSVRTX0VYQ0VFREVELAorICAgICAgICAgICAgICAgICAgICAgICJNYXRjaCBydWxlIHRleHQgaXMgJWQgYnl0ZXMsIG1heGltdW0gaXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChydWxlX3RleHQpLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfTUFYSU1VTV9NQVRDSF9SVUxFX0xFTkdUSCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICBtZW1zZXQgKHRva2VucywgJ1wwJywgc2l6ZW9mICh0b2tlbnMpKTsKKyAgCisgIHJ1bGUgPSBidXNfbWF0Y2hfcnVsZV9uZXcgKG1hdGNoZXNfZ29fdG8pOworICBpZiAocnVsZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIAorICBpZiAoIXRva2VuaXplX3J1bGUgKHJ1bGVfdGV4dCwgdG9rZW5zLCBlcnJvcikpCisgICAgZ290byBmYWlsZWQ7CisgIAorICBpID0gMDsKKyAgd2hpbGUgKHRva2Vuc1tpXS5rZXkgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIHRtcF9zdHI7CisgICAgICBpbnQgbGVuOworICAgICAgY29uc3QgY2hhciAqa2V5ID0gdG9rZW5zW2ldLmtleTsKKyAgICAgIGNvbnN0IGNoYXIgKnZhbHVlID0gdG9rZW5zW2ldLnZhbHVlOworICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnRtcF9zdHIsIHZhbHVlKTsKKyAgICAgIGxlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmdG1wX3N0cik7CisKKyAgICAgIGlmIChzdHJjbXAgKGtleSwgInR5cGUiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgaW50IHQ7CisKKyAgICAgICAgICBpZiAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfTUVTU0FHRV9UWVBFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTUFUQ0hfUlVMRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktleSAlcyBzcGVjaWZpZWQgdHdpY2UgaW4gbWF0Y2ggcnVsZVxuIiwga2V5KTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgdCA9IGRidXNfbWVzc2FnZV90eXBlX2Zyb21fc3RyaW5nICh2YWx1ZSk7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKHQgPT0gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIG1lc3NhZ2UgdHlwZSAoJXMpIGluIG1hdGNoIHJ1bGVcbiIsIHZhbHVlKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIWJ1c19tYXRjaF9ydWxlX3NldF9tZXNzYWdlX3R5cGUgKHJ1bGUsIHQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChrZXksICJzZW5kZXIiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX1NFTkRFUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLZXkgJXMgc3BlY2lmaWVkIHR3aWNlIGluIG1hdGNoIHJ1bGVcbiIsIGtleSk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFfZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAoJnRtcF9zdHIsIDAsIGxlbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VuZGVyIG5hbWUgJyVzJyBpcyBpbnZhbGlkXG4iLCB2YWx1ZSk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFidXNfbWF0Y2hfcnVsZV9zZXRfc2VuZGVyIChydWxlLCB2YWx1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGtleSwgImludGVyZmFjZSIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfSU5URVJGQUNFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTUFUQ0hfUlVMRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktleSAlcyBzcGVjaWZpZWQgdHdpY2UgaW4gbWF0Y2ggcnVsZVxuIiwga2V5KTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3ZhbGlkYXRlX2ludGVyZmFjZSAoJnRtcF9zdHIsIDAsIGxlbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXJmYWNlIG5hbWUgJyVzJyBpcyBpbnZhbGlkXG4iLCB2YWx1ZSk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFidXNfbWF0Y2hfcnVsZV9zZXRfaW50ZXJmYWNlIChydWxlLCB2YWx1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGtleSwgIm1lbWJlciIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfTUVNQkVSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTUFUQ0hfUlVMRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktleSAlcyBzcGVjaWZpZWQgdHdpY2UgaW4gbWF0Y2ggcnVsZVxuIiwga2V5KTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3ZhbGlkYXRlX21lbWJlciAoJnRtcF9zdHIsIDAsIGxlbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVtYmVyIG5hbWUgJyVzJyBpcyBpbnZhbGlkXG4iLCB2YWx1ZSk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFidXNfbWF0Y2hfcnVsZV9zZXRfbWVtYmVyIChydWxlLCB2YWx1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGtleSwgInBhdGgiKSA9PSAwIHx8CisgICAgICAgICAgc3RyY21wIChrZXksICJwYXRoX25hbWVzcGFjZSIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2Jvb2xfdCBpc19uYW1lc3BhY2UgPSAoc3RyY21wIChrZXksICJwYXRoX25hbWVzcGFjZSIpID09IDApOworCisgICAgICAgICAgaWYgKHJ1bGUtPmZsYWdzICYgKEJVU19NQVRDSF9QQVRIIHwgQlVTX01BVENIX1BBVEhfTkFNRVNQQUNFKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXRoIG9yIHBhdGhfbmFtZXNwYWNlIHNwZWNpZmllZCB0d2ljZSBpbiBtYXRjaCBydWxlXG4iKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3ZhbGlkYXRlX3BhdGggKCZ0bXBfc3RyLCAwLCBsZW4pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTUFUQ0hfUlVMRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhdGggJyVzJyBpcyBpbnZhbGlkXG4iLCB2YWx1ZSk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFidXNfbWF0Y2hfcnVsZV9zZXRfcGF0aCAocnVsZSwgdmFsdWUsIGlzX25hbWVzcGFjZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGtleSwgImRlc3RpbmF0aW9uIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9ERVNUSU5BVElPTikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLZXkgJXMgc3BlY2lmaWVkIHR3aWNlIGluIG1hdGNoIHJ1bGVcbiIsIGtleSk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFfZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAoJnRtcF9zdHIsIDAsIGxlbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVzdGluYXRpb24gbmFtZSAnJXMnIGlzIGludmFsaWRcbiIsIHZhbHVlKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIWJ1c19tYXRjaF9ydWxlX3NldF9kZXN0aW5hdGlvbiAocnVsZSwgdmFsdWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChrZXksICJlYXZlc2Ryb3AiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgLyogZG8gbm90IGRldGVjdCAiZWF2ZXNkcm9wIiBiZWluZyB1c2VkIG1vcmUgdGhhbiBvbmNlIGluIHJ1bGU6CisgICAgICAgICAgICogMSkgaXQncyBub3QgcG9zc2libGUsIGl0J3Mgb25seSBpbiB0aGUgZmxhZ3MKKyAgICAgICAgICAgKiAyKSBpdCBtaWdodCBiZSB1c2VkIHR3aWNlIHRvIGRpc2FibGUgZWF2ZXNkcm9wcGluZyB3aGVuIGl0J3MKKyAgICAgICAgICAgKiBhdXRvbWF0aWNhbGx5IGFkZGVkIChlZyBkYnVzLW1vbml0b3IvYnVzdGxlKSAqLworCisgICAgICAgICAgLyogd2UgYWNjZXB0IG9ubHkgInRydWV8ZmFsc2UiIGFzIHBvc3NpYmxlIHZhbHVlcyAqLworICAgICAgICAgIGlmICgoc3RyY21wICh2YWx1ZSwgInRydWUiKSA9PSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnVzX21hdGNoX3J1bGVfc2V0X2NsaWVudF9pc19lYXZlc2Ryb3BwaW5nIChydWxlLCBUUlVFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKHZhbHVlLCAiZmFsc2UiKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBidXNfbWF0Y2hfcnVsZV9zZXRfY2xpZW50X2lzX2VhdmVzZHJvcHBpbmcgKHJ1bGUsIEZBTFNFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZWF2ZXNkcm9wPSclcycgaXMgaW52YWxpZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0IHNob3VsZCBiZSAndHJ1ZScgb3IgJ2ZhbHNlJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGtleSwgImFyZyIsIDMpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIWJ1c19tYXRjaF9ydWxlX3BhcnNlX2FyZ19tYXRjaCAocnVsZSwga2V5LCAmdG1wX3N0ciwgZXJyb3IpKQorICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIGtleSBcIiVzXCIgaW4gbWF0Y2ggcnVsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSk7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKworICAgICAgKytpOworICAgIH0KKyAgCisKKyAgZ290byBvdXQ7CisgIAorIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICBpZiAocnVsZSkKKyAgICB7CisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgICAgICBydWxlID0gTlVMTDsKKyAgICB9CisKKyBvdXQ6CisgIAorICBpID0gMDsKKyAgd2hpbGUgKHRva2Vuc1tpXS5rZXkgfHwgdG9rZW5zW2ldLnZhbHVlKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoaSA8IE1BWF9SVUxFX1RPS0VOUyk7CisgICAgICBkYnVzX2ZyZWUgKHRva2Vuc1tpXS5rZXkpOworICAgICAgZGJ1c19mcmVlICh0b2tlbnNbaV0udmFsdWUpOworICAgICAgKytpOworICAgIH0KKyAgCisgIHJldHVybiBydWxlOworfQorCit0eXBlZGVmIHN0cnVjdCBSdWxlUG9vbCBSdWxlUG9vbDsKK3N0cnVjdCBSdWxlUG9vbAoreworICAvKiBNYXBzIG5vbi1OVUxMIGludGVyZmFjZSBuYW1lcyB0byBub24tTlVMTCAoREJ1c0xpc3QgKiopcyAqLworICBEQnVzSGFzaFRhYmxlICpydWxlc19ieV9pZmFjZTsKKworICAvKiBMaXN0IG9mIEJ1c01hdGNoUnVsZXMgd2hpY2ggZG9uJ3Qgc3BlY2lmeSBhbiBpbnRlcmZhY2UgKi8KKyAgREJ1c0xpc3QgKnJ1bGVzX3dpdGhvdXRfaWZhY2U7Cit9OworCitzdHJ1Y3QgQnVzTWF0Y2htYWtlcgoreworICBpbnQgcmVmY291bnQ7CisKKyAgLyogUG9vbHMgb2YgcnVsZXMsIGdyb3VwZWQgYnkgdGhlIHR5cGUgb2YgbWVzc2FnZSB0aGV5IG1hdGNoLiAwCisgICAqIChEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEKSByZXByZXNlbnRzIHJ1bGVzIHRoYXQgZG8gbm90IHNwZWNpZnkgYSBtZXNzYWdlCisgICAqIHR5cGUuCisgICAqLworICBSdWxlUG9vbCBydWxlc19ieV90eXBlW0RCVVNfTlVNX01FU1NBR0VfVFlQRVNdOworfTsKKworc3RhdGljIHZvaWQKK3J1bGVfbGlzdF9mcmVlIChEQnVzTGlzdCAqKnJ1bGVzKQoreworICB3aGlsZSAoKnJ1bGVzICE9IE5VTEwpCisgICAgeworICAgICAgQnVzTWF0Y2hSdWxlICpydWxlOworCisgICAgICBydWxlID0gKCpydWxlcyktPmRhdGE7CisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgICAgICBfZGJ1c19saXN0X3JlbW92ZV9saW5rIChydWxlcywgKnJ1bGVzKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitydWxlX2xpc3RfcHRyX2ZyZWUgKERCdXNMaXN0ICoqbGlzdCkKK3sKKyAgLyogV2UgaGF2ZSB0byBjb3BlIHdpdGggTlVMTCBiZWNhdXNlIHRoZSBoYXNoIHRhYmxlIGZyZWVzIHRoZSAiZXhpc3RpbmciCisgICAqIHZhbHVlICh3aGljaCBpcyBOVUxMKSB3aGVuIGNyZWF0aW5nIGEgbmV3IHRhYmxlIGVudHJ5Li4uCisgICAqLworICBpZiAobGlzdCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHJ1bGVfbGlzdF9mcmVlIChsaXN0KTsKKyAgICAgIGRidXNfZnJlZSAobGlzdCk7CisgICAgfQorfQorCitCdXNNYXRjaG1ha2VyKgorYnVzX21hdGNobWFrZXJfbmV3ICh2b2lkKQoreworICBCdXNNYXRjaG1ha2VyICptYXRjaG1ha2VyOworICBpbnQgaTsKKworICBtYXRjaG1ha2VyID0gZGJ1c19uZXcwIChCdXNNYXRjaG1ha2VyLCAxKTsKKyAgaWYgKG1hdGNobWFrZXIgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBtYXRjaG1ha2VyLT5yZWZjb3VudCA9IDE7CisKKyAgZm9yIChpID0gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRDsgaSA8IERCVVNfTlVNX01FU1NBR0VfVFlQRVM7IGkrKykKKyAgICB7CisgICAgICBSdWxlUG9vbCAqcCA9IG1hdGNobWFrZXItPnJ1bGVzX2J5X3R5cGUgKyBpOworCisgICAgICBwLT5ydWxlc19ieV9pZmFjZSA9IF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfU1RSSU5HLAorICAgICAgICAgIGRidXNfZnJlZSwgKERCdXNGcmVlRnVuY3Rpb24pIHJ1bGVfbGlzdF9wdHJfZnJlZSk7CisKKyAgICAgIGlmIChwLT5ydWxlc19ieV9pZmFjZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vbWVtOworICAgIH0KKworICByZXR1cm4gbWF0Y2htYWtlcjsKKworIG5vbWVtOgorICBmb3IgKGkgPSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEOyBpIDwgREJVU19OVU1fTUVTU0FHRV9UWVBFUzsgaSsrKQorICAgIHsKKyAgICAgIFJ1bGVQb29sICpwID0gbWF0Y2htYWtlci0+cnVsZXNfYnlfdHlwZSArIGk7CisKKyAgICAgIGlmIChwLT5ydWxlc19ieV9pZmFjZSA9PSBOVUxMKQorICAgICAgICBicmVhazsKKyAgICAgIGVsc2UKKyAgICAgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAocC0+cnVsZXNfYnlfaWZhY2UpOworICAgIH0KKyAgZGJ1c19mcmVlIChtYXRjaG1ha2VyKTsKKworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIERCdXNMaXN0ICoqCitidXNfbWF0Y2htYWtlcl9nZXRfcnVsZXMgKEJ1c01hdGNobWFrZXIgKm1hdGNobWFrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICBjcmVhdGUpCit7CisgIFJ1bGVQb29sICpwOworCisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZV90eXBlID49IDApOworICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2VfdHlwZSA8IERCVVNfTlVNX01FU1NBR0VfVFlQRVMpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJMb29raW5nIHVwIHJ1bGVzIGZvciBtZXNzYWdlX3R5cGUgJWQsIGludGVyZmFjZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICBpbnRlcmZhY2UgIT0gTlVMTCA/IGludGVyZmFjZSA6ICI8bnVsbD4iKTsKKworICBwID0gbWF0Y2htYWtlci0+cnVsZXNfYnlfdHlwZSArIG1lc3NhZ2VfdHlwZTsKKworICBpZiAoaW50ZXJmYWNlID09IE5VTEwpCisgICAgeworICAgICAgcmV0dXJuICZwLT5ydWxlc193aXRob3V0X2lmYWNlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIERCdXNMaXN0ICoqbGlzdDsKKworICAgICAgbGlzdCA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3N0cmluZyAocC0+cnVsZXNfYnlfaWZhY2UsIGludGVyZmFjZSk7CisKKyAgICAgIGlmIChsaXN0ID09IE5VTEwgJiYgY3JlYXRlKQorICAgICAgICB7CisgICAgICAgICAgY2hhciAqZHVwcGVkX2ludGVyZmFjZTsKKworICAgICAgICAgIGxpc3QgPSBkYnVzX25ldzAgKERCdXNMaXN0ICosIDEpOworICAgICAgICAgIGlmIChsaXN0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICAgIGR1cHBlZF9pbnRlcmZhY2UgPSBfZGJ1c19zdHJkdXAgKGludGVyZmFjZSk7CisgICAgICAgICAgaWYgKGR1cHBlZF9pbnRlcmZhY2UgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19mcmVlIChsaXN0KTsKKyAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiQWRkaW5nIGxpc3QgZm9yIHR5cGUgJWQsIGlmYWNlICVzXG4iLCBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlKTsKKworICAgICAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nIChwLT5ydWxlc19ieV9pZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwcGVkX2ludGVyZmFjZSwgbGlzdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfZnJlZSAobGlzdCk7CisgICAgICAgICAgICAgIGRidXNfZnJlZSAoZHVwcGVkX2ludGVyZmFjZSk7CisgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIHJldHVybiBsaXN0OworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2J1c19tYXRjaG1ha2VyX2djX3J1bGVzIChCdXNNYXRjaG1ha2VyICptYXRjaG1ha2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICppbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICoqcnVsZXMpCit7CisgIFJ1bGVQb29sICpwOworCisgIGlmIChpbnRlcmZhY2UgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgaWYgKCpydWxlcyAhPSBOVUxMKQorICAgIHJldHVybjsKKworICBfZGJ1c192ZXJib3NlICgiR0NpbmcgSFQgZW50cnkgZm9yIG1lc3NhZ2VfdHlwZSAldSwgaW50ZXJmYWNlICVzXG4iLAorICAgICAgICAgICAgICAgICBtZXNzYWdlX3R5cGUsIGludGVyZmFjZSk7CisKKyAgcCA9IG1hdGNobWFrZXItPnJ1bGVzX2J5X3R5cGUgKyBtZXNzYWdlX3R5cGU7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKHAtPnJ1bGVzX2J5X2lmYWNlLCBpbnRlcmZhY2UpCisgICAgICA9PSBydWxlcyk7CisKKyAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfc3RyaW5nIChwLT5ydWxlc19ieV9pZmFjZSwgaW50ZXJmYWNlKTsKK30KKworQnVzTWF0Y2htYWtlciAqCitidXNfbWF0Y2htYWtlcl9yZWYgKEJ1c01hdGNobWFrZXIgKm1hdGNobWFrZXIpCit7CisgIF9kYnVzX2Fzc2VydCAobWF0Y2htYWtlci0+cmVmY291bnQgPiAwKTsKKworICBtYXRjaG1ha2VyLT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiBtYXRjaG1ha2VyOworfQorCit2b2lkCitidXNfbWF0Y2htYWtlcl91bnJlZiAoQnVzTWF0Y2htYWtlciAqbWF0Y2htYWtlcikKK3sKKyAgX2RidXNfYXNzZXJ0IChtYXRjaG1ha2VyLT5yZWZjb3VudCA+IDApOworCisgIG1hdGNobWFrZXItPnJlZmNvdW50IC09IDE7CisgIGlmIChtYXRjaG1ha2VyLT5yZWZjb3VudCA9PSAwKQorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICBmb3IgKGkgPSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEOyBpIDwgREJVU19OVU1fTUVTU0FHRV9UWVBFUzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgUnVsZVBvb2wgKnAgPSBtYXRjaG1ha2VyLT5ydWxlc19ieV90eXBlICsgaTsKKworICAgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHAtPnJ1bGVzX2J5X2lmYWNlKTsKKyAgICAgICAgICBydWxlX2xpc3RfZnJlZSAoJnAtPnJ1bGVzX3dpdGhvdXRfaWZhY2UpOworICAgICAgICB9CisKKyAgICAgIGRidXNfZnJlZSAobWF0Y2htYWtlcik7CisgICAgfQorfQorCisvKiBUaGUgcnVsZSBjYW4ndCBiZSBtb2RpZmllZCBhZnRlciBpdCdzIGFkZGVkLiAqLworZGJ1c19ib29sX3QKK2J1c19tYXRjaG1ha2VyX2FkZF9ydWxlIChCdXNNYXRjaG1ha2VyICAgKm1hdGNobWFrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVzTWF0Y2hSdWxlICAgICpydWxlKQoreworICBEQnVzTGlzdCAqKnJ1bGVzOworCisgIF9kYnVzX2Fzc2VydCAoYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChydWxlLT5tYXRjaGVzX2dvX3RvKSk7CisKKyAgX2RidXNfdmVyYm9zZSAoIkFkZGluZyBydWxlIHdpdGggbWVzc2FnZV90eXBlICVkLCBpbnRlcmZhY2UgJXNcbiIsCisgICAgICAgICAgICAgICAgIHJ1bGUtPm1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgcnVsZS0+aW50ZXJmYWNlICE9IE5VTEwgPyBydWxlLT5pbnRlcmZhY2UgOiAiPG51bGw+Iik7CisKKyAgcnVsZXMgPSBidXNfbWF0Y2htYWtlcl9nZXRfcnVsZXMgKG1hdGNobWFrZXIsIHJ1bGUtPm1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmludGVyZmFjZSwgVFJVRSk7CisKKyAgaWYgKHJ1bGVzID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKHJ1bGVzLCBydWxlKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFidXNfY29ubmVjdGlvbl9hZGRfbWF0Y2hfcnVsZSAocnVsZS0+bWF0Y2hlc19nb190bywgcnVsZSkpCisgICAgeworICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGFzdCAocnVsZXMsIHJ1bGUpOworICAgICAgYnVzX21hdGNobWFrZXJfZ2NfcnVsZXMgKG1hdGNobWFrZXIsIHJ1bGUtPm1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlLT5pbnRlcmZhY2UsIHJ1bGVzKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgYnVzX21hdGNoX3J1bGVfcmVmIChydWxlKTsKKworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICB7CisgICAgY2hhciAqcyA9IG1hdGNoX3J1bGVfdG9fc3RyaW5nIChydWxlKTsKKworICAgIF9kYnVzX3ZlcmJvc2UgKCJBZGRlZCBtYXRjaCBydWxlICVzIHRvIGNvbm5lY3Rpb24gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgcywgcnVsZS0+bWF0Y2hlc19nb190byk7CisgICAgZGJ1c19mcmVlIChzKTsKKyAgfQorI2VuZGlmCisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CittYXRjaF9ydWxlX2VxdWFsIChCdXNNYXRjaFJ1bGUgKmEsCisgICAgICAgICAgICAgICAgICBCdXNNYXRjaFJ1bGUgKmIpCit7CisgIGlmIChhLT5mbGFncyAhPSBiLT5mbGFncykKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGEtPm1hdGNoZXNfZ29fdG8gIT0gYi0+bWF0Y2hlc19nb190bykKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKChhLT5mbGFncyAmIEJVU19NQVRDSF9NRVNTQUdFX1RZUEUpICYmCisgICAgICBhLT5tZXNzYWdlX3R5cGUgIT0gYi0+bWVzc2FnZV90eXBlKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoKGEtPmZsYWdzICYgQlVTX01BVENIX01FTUJFUikgJiYKKyAgICAgIHN0cmNtcCAoYS0+bWVtYmVyLCBiLT5tZW1iZXIpICE9IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICgoYS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfUEFUSCkgJiYKKyAgICAgIHN0cmNtcCAoYS0+cGF0aCwgYi0+cGF0aCkgIT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKChhLT5mbGFncyAmIEJVU19NQVRDSF9JTlRFUkZBQ0UpICYmCisgICAgICBzdHJjbXAgKGEtPmludGVyZmFjZSwgYi0+aW50ZXJmYWNlKSAhPSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoKGEtPmZsYWdzICYgQlVTX01BVENIX1NFTkRFUikgJiYKKyAgICAgIHN0cmNtcCAoYS0+c2VuZGVyLCBiLT5zZW5kZXIpICE9IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICgoYS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfREVTVElOQVRJT04pICYmCisgICAgICBzdHJjbXAgKGEtPmRlc3RpbmF0aW9uLCBiLT5kZXN0aW5hdGlvbikgIT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogd2UgYWxyZWFkeSBjb21wYXJlZCB0aGUgdmFsdWUgb2YgZmxhZ3MsIGFuZAorICAgKiBCVVNfTUFUQ0hfQ0xJRU5UX0lTX0VBVkVTRFJPUFBJTkcgZG9lcyBub3QgaGF2ZSBhbm90aGVyIHN0cnVjdCBtZW1iZXIgKi8KKworICBpZiAoYS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfQVJHUykKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIAorICAgICAgaWYgKGEtPmFyZ3NfbGVuICE9IGItPmFyZ3NfbGVuKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKGkgPCBhLT5hcmdzX2xlbikKKyAgICAgICAgeworICAgICAgICAgIGludCBsZW5ndGg7CisKKyAgICAgICAgICBpZiAoKGEtPmFyZ3NbaV0gIT0gTlVMTCkgIT0gKGItPmFyZ3NbaV0gIT0gTlVMTCkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgICBpZiAoYS0+YXJnX2xlbnNbaV0gIT0gYi0+YXJnX2xlbnNbaV0pCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgICBsZW5ndGggPSBhLT5hcmdfbGVuc1tpXSAmIH5CVVNfTUFUQ0hfQVJHX0ZMQUdTOworCisgICAgICAgICAgaWYgKGEtPmFyZ3NbaV0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChiLT5hcmdzW2ldICE9IE5VTEwpOworICAgICAgICAgICAgICBpZiAobWVtY21wIChhLT5hcmdzW2ldLCBiLT5hcmdzW2ldLCBsZW5ndGgpICE9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorYnVzX21hdGNobWFrZXJfcmVtb3ZlX3J1bGVfbGluayAoREJ1c0xpc3QgICAgICAgKipydWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgICAqbGluaykKK3sKKyAgQnVzTWF0Y2hSdWxlICpydWxlID0gbGluay0+ZGF0YTsKKyAgCisgIGJ1c19jb25uZWN0aW9uX3JlbW92ZV9tYXRjaF9ydWxlIChydWxlLT5tYXRjaGVzX2dvX3RvLCBydWxlKTsKKyAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAocnVsZXMsIGxpbmspOworCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgIHsKKyAgICBjaGFyICpzID0gbWF0Y2hfcnVsZV90b19zdHJpbmcgKHJ1bGUpOworCisgICAgX2RidXNfdmVyYm9zZSAoIlJlbW92ZWQgbWF0Y2ggcnVsZSAlcyBmb3IgY29ubmVjdGlvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICBzLCBydWxlLT5tYXRjaGVzX2dvX3RvKTsKKyAgICBkYnVzX2ZyZWUgKHMpOworICB9CisjZW5kaWYKKyAgCisgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsgIAorfQorCit2b2lkCitidXNfbWF0Y2htYWtlcl9yZW1vdmVfcnVsZSAoQnVzTWF0Y2htYWtlciAgICptYXRjaG1ha2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c01hdGNoUnVsZSAgICAqcnVsZSkKK3sKKyAgREJ1c0xpc3QgKipydWxlczsKKworICBfZGJ1c192ZXJib3NlICgiUmVtb3ZpbmcgcnVsZSB3aXRoIG1lc3NhZ2VfdHlwZSAlZCwgaW50ZXJmYWNlICVzXG4iLAorICAgICAgICAgICAgICAgICBydWxlLT5tZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgIHJ1bGUtPmludGVyZmFjZSAhPSBOVUxMID8gcnVsZS0+aW50ZXJmYWNlIDogIjxudWxsPiIpOworCisgIGJ1c19jb25uZWN0aW9uX3JlbW92ZV9tYXRjaF9ydWxlIChydWxlLT5tYXRjaGVzX2dvX3RvLCBydWxlKTsKKworICBydWxlcyA9IGJ1c19tYXRjaG1ha2VyX2dldF9ydWxlcyAobWF0Y2htYWtlciwgcnVsZS0+bWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZS0+aW50ZXJmYWNlLCBGQUxTRSk7CisKKyAgLyogV2Ugc2hvdWxkIG9ubHkgYmUgYXNrZWQgdG8gcmVtb3ZlIGEgcnVsZSBieSBpZGVudGl0eSByaWdodCBhZnRlciBpdCB3YXMKKyAgICogYWRkZWQsIHNvIHRoZXJlIHNob3VsZCBiZSBhIGxpc3QgZm9yIGl0LgorICAgKi8KKyAgX2RidXNfYXNzZXJ0IChydWxlcyAhPSBOVUxMKTsKKworICBfZGJ1c19saXN0X3JlbW92ZSAocnVsZXMsIHJ1bGUpOworICBidXNfbWF0Y2htYWtlcl9nY19ydWxlcyAobWF0Y2htYWtlciwgcnVsZS0+bWVzc2FnZV90eXBlLCBydWxlLT5pbnRlcmZhY2UsCisgICAgICBydWxlcyk7CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyAgeworICAgIGNoYXIgKnMgPSBtYXRjaF9ydWxlX3RvX3N0cmluZyAocnVsZSk7CisKKyAgICBfZGJ1c192ZXJib3NlICgiUmVtb3ZlZCBtYXRjaCBydWxlICVzIGZvciBjb25uZWN0aW9uICVwXG4iLAorICAgICAgICAgICAgICAgICAgIHMsIHJ1bGUtPm1hdGNoZXNfZ29fdG8pOworICAgIGRidXNfZnJlZSAocyk7CisgIH0KKyNlbmRpZgorICAKKyAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKHJ1bGUpOworfQorCisvKiBSZW1vdmUgYSBzaW5nbGUgcnVsZSB3aGljaCBpcyBlcXVhbCB0byB0aGUgZ2l2ZW4gcnVsZSBieSB2YWx1ZSAqLworZGJ1c19ib29sX3QKK2J1c19tYXRjaG1ha2VyX3JlbW92ZV9ydWxlX2J5X3ZhbHVlIChCdXNNYXRjaG1ha2VyICAgKm1hdGNobWFrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzTWF0Y2hSdWxlICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgKmVycm9yKQoreworICBEQnVzTGlzdCAqKnJ1bGVzOworICBEQnVzTGlzdCAqbGluayA9IE5VTEw7CisKKyAgX2RidXNfdmVyYm9zZSAoIlJlbW92aW5nIHJ1bGUgYnkgdmFsdWUgd2l0aCBtZXNzYWdlX3R5cGUgJWQsIGludGVyZmFjZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgdmFsdWUtPm1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgdmFsdWUtPmludGVyZmFjZSAhPSBOVUxMID8gdmFsdWUtPmludGVyZmFjZSA6ICI8bnVsbD4iKTsKKworICBydWxlcyA9IGJ1c19tYXRjaG1ha2VyX2dldF9ydWxlcyAobWF0Y2htYWtlciwgdmFsdWUtPm1lc3NhZ2VfdHlwZSwKKyAgICAgIHZhbHVlLT5pbnRlcmZhY2UsIEZBTFNFKTsKKworICBpZiAocnVsZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiB3ZSB0cmF2ZXJzZSBiYWNrd2FyZCBiZWNhdXNlIGJ1c19jb25uZWN0aW9uX3JlbW92ZV9tYXRjaF9ydWxlKCkKKyAgICAgICAqIHJlbW92ZXMgdGhlIG1vc3QtcmVjZW50bHktYWRkZWQgcnVsZQorICAgICAgICovCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbGFzdF9saW5rIChydWxlcyk7CisgICAgICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQnVzTWF0Y2hSdWxlICpydWxlOworICAgICAgICAgIERCdXNMaXN0ICpwcmV2OworCisgICAgICAgICAgcnVsZSA9IGxpbmstPmRhdGE7CisgICAgICAgICAgcHJldiA9IF9kYnVzX2xpc3RfZ2V0X3ByZXZfbGluayAocnVsZXMsIGxpbmspOworCisgICAgICAgICAgaWYgKG1hdGNoX3J1bGVfZXF1YWwgKHJ1bGUsIHZhbHVlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnVzX21hdGNobWFrZXJfcmVtb3ZlX3J1bGVfbGluayAocnVsZXMsIGxpbmspOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGxpbmsgPSBwcmV2OworICAgICAgICB9CisgICAgfQorCisgIGlmIChsaW5rID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfTk9UX0ZPVU5ELAorICAgICAgICAgICAgICAgICAgICAgICJUaGUgZ2l2ZW4gbWF0Y2ggcnVsZSB3YXNuJ3QgZm91bmQgYW5kIGNhbid0IGJlIHJlbW92ZWQiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgYnVzX21hdGNobWFrZXJfZ2NfcnVsZXMgKG1hdGNobWFrZXIsIHZhbHVlLT5tZXNzYWdlX3R5cGUsIHZhbHVlLT5pbnRlcmZhY2UsCisgICAgICBydWxlcyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitydWxlX2xpc3RfcmVtb3ZlX2J5X2Nvbm5lY3Rpb24gKERCdXNMaXN0ICAgICAgICoqcnVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbikKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKHJ1bGVzKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBCdXNNYXRjaFJ1bGUgKnJ1bGU7CisgICAgICBEQnVzTGlzdCAqbmV4dDsKKworICAgICAgcnVsZSA9IGxpbmstPmRhdGE7CisgICAgICBuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChydWxlcywgbGluayk7CisKKyAgICAgIGlmIChydWxlLT5tYXRjaGVzX2dvX3RvID09IGNvbm5lY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICBidXNfbWF0Y2htYWtlcl9yZW1vdmVfcnVsZV9saW5rIChydWxlcywgbGluayk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCgocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfU0VOREVSKSAmJiAqcnVsZS0+c2VuZGVyID09ICc6JykgfHwKKyAgICAgICAgICAgICAgICgocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfREVTVElOQVRJT04pICYmICpydWxlLT5kZXN0aW5hdGlvbiA9PSAnOicpKQorICAgICAgICB7CisgICAgICAgICAgLyogVGhlIHJ1bGUgbWF0Y2hlcyB0by9mcm9tIGEgYmFzZSBzZXJ2aWNlLCBzZWUgaWYgaXQncyB0aGUKKyAgICAgICAgICAgKiBvbmUgYmVpbmcgZGlzY29ubmVjdGVkLCBzaW5jZSB3ZSBrbm93IHRoaXMgc2VydmljZSBuYW1lCisgICAgICAgICAgICogd2lsbCBuZXZlciBiZSByZWN5Y2xlZC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBjb25zdCBjaGFyICpuYW1lOworCisgICAgICAgICAgbmFtZSA9IGJ1c19jb25uZWN0aW9uX2dldF9uYW1lIChjb25uZWN0aW9uKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKG5hbWUgIT0gTlVMTCk7IC8qIGJlY2F1c2Ugd2UncmUgYW4gYWN0aXZlIGNvbm5lY3Rpb24gKi8KKworICAgICAgICAgIGlmICgoKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX1NFTkRFUikgJiYKKyAgICAgICAgICAgICAgIHN0cmNtcCAocnVsZS0+c2VuZGVyLCBuYW1lKSA9PSAwKSB8fAorICAgICAgICAgICAgICAoKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX0RFU1RJTkFUSU9OKSAmJgorICAgICAgICAgICAgICAgc3RyY21wIChydWxlLT5kZXN0aW5hdGlvbiwgbmFtZSkgPT0gMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGJ1c19tYXRjaG1ha2VyX3JlbW92ZV9ydWxlX2xpbmsgKHJ1bGVzLCBsaW5rKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9Cit9CisKK3ZvaWQKK2J1c19tYXRjaG1ha2VyX2Rpc2Nvbm5lY3RlZCAoQnVzTWF0Y2htYWtlciAgICptYXRjaG1ha2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24pCit7CisgIGludCBpOworCisgIC8qIEZJWE1FCisgICAqCisgICAqIFRoaXMgc2NhbnMgYWxsIG1hdGNoIHJ1bGVzIG9uIHRoZSBidXMuIFdlIGNvdWxkIGF2b2lkIHRoYXQKKyAgICogZm9yIHRoZSBydWxlcyBiZWxvbmdpbmcgdG8gdGhlIGNvbm5lY3Rpb24sIHNpbmNlIHdlIGtlZXAKKyAgICogYSBsaXN0IG9mIHRob3NlOyBidXQgZm9yIHRoZSBydWxlcyB0aGF0IGp1c3QgcmVmZXIgdG8KKyAgICogdGhlIGNvbm5lY3Rpb24gd2UnZCBuZWVkIHRvIGRvIHNvbWV0aGluZyBtb3JlIGVsYWJvcmF0ZS4KKyAgICovCisKKyAgX2RidXNfYXNzZXJ0IChidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKGNvbm5lY3Rpb24pKTsKKworICBfZGJ1c192ZXJib3NlICgiUmVtb3ZpbmcgYWxsIHJ1bGVzIGZvciBjb25uZWN0aW9uICVwXG4iLCBjb25uZWN0aW9uKTsKKworICBmb3IgKGkgPSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEOyBpIDwgREJVU19OVU1fTUVTU0FHRV9UWVBFUzsgaSsrKQorICAgIHsKKyAgICAgIFJ1bGVQb29sICpwID0gbWF0Y2htYWtlci0+cnVsZXNfYnlfdHlwZSArIGk7CisgICAgICBEQnVzSGFzaEl0ZXIgaXRlcjsKKworICAgICAgcnVsZV9saXN0X3JlbW92ZV9ieV9jb25uZWN0aW9uICgmcC0+cnVsZXNfd2l0aG91dF9pZmFjZSwgY29ubmVjdGlvbik7CisKKyAgICAgIF9kYnVzX2hhc2hfaXRlcl9pbml0IChwLT5ydWxlc19ieV9pZmFjZSwgJml0ZXIpOworICAgICAgd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzTGlzdCAqKml0ZW1zID0gX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpOworCisgICAgICAgICAgcnVsZV9saXN0X3JlbW92ZV9ieV9jb25uZWN0aW9uIChpdGVtcywgY29ubmVjdGlvbik7CisKKyAgICAgICAgICBpZiAoKml0ZW1zID09IE5VTEwpCisgICAgICAgICAgICBfZGJ1c19oYXNoX2l0ZXJfcmVtb3ZlX2VudHJ5ICgmaXRlcik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY29ubmVjdGlvbl9pc19wcmltYXJ5X293bmVyIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnNlcnZpY2VfbmFtZSkKK3sKKyAgQnVzU2VydmljZSAqc2VydmljZTsKKyAgREJ1c1N0cmluZyBzdHI7CisgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIAorICByZWdpc3RyeSA9IGJ1c19jb25uZWN0aW9uX2dldF9yZWdpc3RyeSAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIHNlcnZpY2VfbmFtZSk7CisgIHNlcnZpY2UgPSBidXNfcmVnaXN0cnlfbG9va3VwIChyZWdpc3RyeSwgJnN0cik7CisKKyAgaWYgKHNlcnZpY2UgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7IC8qIFNlcnZpY2UgZG9lc24ndCBleGlzdCBzbyBjb25uZWN0aW9uIGNhbid0IG93biBpdC4gKi8KKworICByZXR1cm4gYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXJzX2Nvbm5lY3Rpb24gKHNlcnZpY2UpID09IGNvbm5lY3Rpb247Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc3RyX2hhc19wcmVmaXggKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqcHJlZml4KQoreworICBzaXplX3QgcHJlZml4X2xlbjsKKyAgcHJlZml4X2xlbiA9IHN0cmxlbiAocHJlZml4KTsKKyAgaWYgKHN0cm5jbXAgKHN0ciwgcHJlZml4LCBwcmVmaXhfbGVuKSA9PSAwKQorICAgIHJldHVybiBUUlVFOworICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK21hdGNoX3J1bGVfbWF0Y2hlcyAoQnVzTWF0Y2hSdWxlICAgICpydWxlLAorICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgKnNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICphZGRyZXNzZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgIEJ1c01hdGNoRmxhZ3MgICAgYWxyZWFkeV9tYXRjaGVkKQoreworICBkYnVzX2Jvb2xfdCB3YW50c190b19lYXZlc2Ryb3AgPSBGQUxTRTsKKyAgaW50IGZsYWdzOworCisgIC8qIEFsbCBmZWF0dXJlcyBvZiB0aGUgbWF0Y2ggcnVsZSBhcmUgQU5EJ2QgdG9nZXRoZXIsCisgICAqIHNvIEZBTFNFIGlmIGFueSBvZiB0aGVtIGRvbid0IG1hdGNoLgorICAgKi8KKworICAvKiBzZW5kZXIvYWRkcmVzc2VkX3JlY2lwaWVudCBvZiAjTlVMTCBtYXkgbWVhbiBidXMgZHJpdmVyLAorICAgKiBvciBmb3IgYWRkcmVzc2VkX3JlY2lwaWVudCBtYXkgbWVhbiBhIG1lc3NhZ2Ugd2l0aCBubworICAgKiBzcGVjaWZpYyByZWNpcGllbnQgKGkuZS4gYSBzaWduYWwpCisgICAqLworCisgIC8qIERvbid0IGJvdGhlciByZS1tYXRjaGluZyBmZWF0dXJlcyB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQgaW1wbGljaXRseS4gKi8KKyAgZmxhZ3MgPSBydWxlLT5mbGFncyAmICh+YWxyZWFkeV9tYXRjaGVkKTsKKworICBpZiAoZmxhZ3MgJiBCVVNfTUFUQ0hfQ0xJRU5UX0lTX0VBVkVTRFJPUFBJTkcpCisgICAgd2FudHNfdG9fZWF2ZXNkcm9wID0gVFJVRTsKKworICBpZiAoZmxhZ3MgJiBCVVNfTUFUQ0hfTUVTU0FHRV9UWVBFKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+bWVzc2FnZV90eXBlICE9IERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQpOworCisgICAgICBpZiAocnVsZS0+bWVzc2FnZV90eXBlICE9IGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKGZsYWdzICYgQlVTX01BVENIX0lOVEVSRkFDRSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICppZmFjZTsKKworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5pbnRlcmZhY2UgIT0gTlVMTCk7CisKKyAgICAgIGlmYWNlID0gZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpOworICAgICAgaWYgKGlmYWNlID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHN0cmNtcCAoaWZhY2UsIHJ1bGUtPmludGVyZmFjZSkgIT0gMCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoZmxhZ3MgJiBCVVNfTUFUQ0hfTUVNQkVSKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm1lbWJlcjsKKworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5tZW1iZXIgIT0gTlVMTCk7CisKKyAgICAgIG1lbWJlciA9IGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKTsKKyAgICAgIGlmIChtZW1iZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoc3RyY21wIChtZW1iZXIsIHJ1bGUtPm1lbWJlcikgIT0gMCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoZmxhZ3MgJiBCVVNfTUFUQ0hfU0VOREVSKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+c2VuZGVyICE9IE5VTEwpOworCisgICAgICBpZiAoc2VuZGVyID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoc3RyY21wIChydWxlLT5zZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX0RCVVMpICE9IDApCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmICghY29ubmVjdGlvbl9pc19wcmltYXJ5X293bmVyIChzZW5kZXIsIHJ1bGUtPnNlbmRlcikpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogTm90ZTogdGhpcyBwYXJ0IGlzIHJlbGV2YW50IGZvciBlYXZlc2Ryb3BwZXIgcnVsZXM6CisgICAqIFR3byBjYXNlczoKKyAgICogMSkgcnVsZSBoYXMgYSBkZXN0aW5hdGlvbiB0byBiZSBtYXRjaGVkCisgICAqICAgKGZsYWcgQlVTX01BVENIX0RFU1RJTkFUSU9OIHByZXNlbnQpLiBSdWxlIHdpbGwgbWF0Y2ggaWY6CisgICAqICAgLSBydWxlLT5kZXN0aW5hdGlvbiBtYXRjaGVzIHRoZSBhZGRyZXNzZWRfcmVjaXBpZW50CisgICAqICAgQU5ECisgICAqICAgLSB3YW50c190b19lYXZlc2Ryb3A9VFJVRQorICAgKgorICAgKiAgIE5vdGU6ICh0aGUgY2FzZSBpbiB3aGljaCBhZGRyZXNzZWRfcmVjaXBpZW50IGlzIHRoZSBhY3R1YWwgcnVsZSBvd25lcgorICAgKiAgIGlzIGhhbmRsZWQgZWxzZXdlcmUgaW4gZGlzcGF0Y2guYzpidXNfZGlzcGF0Y2hfbWF0Y2hlcygpLgorICAgKgorICAgKiAyKSBydWxlIGhhcyBubyBkZXN0aW5hdGlvbi4gUnVsZSB3aWxsIG1hdGNoIGlmOgorICAgKiAgICAtIG1lc3NhZ2UgaGFzIG5vIHNwZWNpZmllZCBkZXN0aW5hdGlvbiAoaWUgYnJvYWRjYXN0cykKKyAgICogICAgICAoTm90ZTogdGhpcyB3aWxsIHJ1bGUgb3V0IHVuaWNhc3QgbWV0aG9kIGNhbGxzIGFuZCB1bmljYXN0IHNpZ25hbHMsCisgICAqICAgICAgZml4aW5nIEZETyMyNjk3NDgpCisgICAqICAgIE9SCisgICAqICAgIC0gd2FudHNfdG9fZWF2ZXNkcm9wPVRSVUUgKGRlc3RpbmF0aW9uLWNhdGNoLWFsbCBzaXR1YXRpb24pCisgICAqLworICBpZiAoZmxhZ3MgJiBCVVNfTUFUQ0hfREVTVElOQVRJT04pCisgICAgeworICAgICAgY29uc3QgY2hhciAqZGVzdGluYXRpb247CisKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+ZGVzdGluYXRpb24gIT0gTlVMTCk7CisKKyAgICAgIGRlc3RpbmF0aW9uID0gZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSk7CisgICAgICBpZiAoZGVzdGluYXRpb24gPT0gTlVMTCkKKyAgICAgICAgLyogYnJvYWRjYXN0LCBidXQgdGhpcyBydWxlIHNwZWNpZmllZCBhIGRlc3RpbmF0aW9uOiBubyBtYXRjaCAqLworICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIC8qIHJ1bGUgb3duZXIgZG9lcyBub3QgaW50ZW5kIHRvIGVhdmVzZHJvcDogd2UnbGwgZGVsaXZlciBvbmx5IG1zZ3MKKyAgICAgICAqIGRpcmVjdGVkIHRvIGl0LCBOT1QgTUFUQ0hJTkcgKi8KKyAgICAgIGlmICghd2FudHNfdG9fZWF2ZXNkcm9wKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChhZGRyZXNzZWRfcmVjaXBpZW50ID09IE5VTEwpCisgICAgICAgIHsgICAgICAgICAgCisgICAgICAgICAgaWYgKHN0cmNtcCAocnVsZS0+ZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX0RCVVMpICE9IDApCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmICghY29ubmVjdGlvbl9pc19wcmltYXJ5X293bmVyIChhZGRyZXNzZWRfcmVjaXBpZW50LCBydWxlLT5kZXN0aW5hdGlvbikpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvKiBubyBkZXN0aW5hdGlvbiBpbiBydWxlICovCisgICAgICAgIGRidXNfYm9vbF90IG1zZ19pc19icm9hZGNhc3Q7CisKKyAgICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5kZXN0aW5hdGlvbiA9PSBOVUxMKTsKKworICAgICAgICBtc2dfaXNfYnJvYWRjYXN0ID0gKGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKG1lc3NhZ2UpID09IE5VTEwpOworCisgICAgICAgIGlmICghd2FudHNfdG9fZWF2ZXNkcm9wICYmICFtc2dfaXNfYnJvYWRjYXN0KQorICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAvKiBpZiB3ZSBhcmUgaGVyZSBydWxlIG93bmVyIGludGVuZHMgdG8gZWF2ZXNkcm9wCisgICAgICAgICAqIE9SCisgICAgICAgICAqIG1lc3NhZ2UgaXMgYmVpbmcgYnJvYWRjYXN0ZWQgKi8KKyAgICB9CisKKyAgaWYgKGZsYWdzICYgQlVTX01BVENIX1BBVEgpCisgICAgeworICAgICAgY29uc3QgY2hhciAqcGF0aDsKKworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5wYXRoICE9IE5VTEwpOworCisgICAgICBwYXRoID0gZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtZXNzYWdlKTsKKyAgICAgIGlmIChwYXRoID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHN0cmNtcCAocGF0aCwgcnVsZS0+cGF0aCkgIT0gMCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoZmxhZ3MgJiBCVVNfTUFUQ0hfUEFUSF9OQU1FU1BBQ0UpCisgICAgeworICAgICAgY29uc3QgY2hhciAqcGF0aDsKKyAgICAgIGludCBsZW47CisKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+cGF0aCAhPSBOVUxMKTsKKworICAgICAgcGF0aCA9IGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobWVzc2FnZSk7CisgICAgICBpZiAocGF0aCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmICghc3RyX2hhc19wcmVmaXggKHBhdGgsIHJ1bGUtPnBhdGgpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGxlbiA9IHN0cmxlbiAocnVsZS0+cGF0aCk7CisKKyAgICAgIC8qIENoZWNrIHRoYXQgdGhlIGFjdHVhbCBhcmd1bWVudCBpcyB3aXRoaW4gdGhlIGV4cGVjdGVkCisgICAgICAgKiBuYW1lc3BhY2UsIHJhdGhlciB0aGFuIGp1c3Qgc3RhcnRpbmcgd2l0aCB0aGF0IHN0cmluZywKKyAgICAgICAqIGJ5IGNoZWNraW5nIHRoYXQgdGhlIG1hdGNoZWQgcHJlZml4IGlzIGZvbGxvd2VkIGJ5IGEgJy8nCisgICAgICAgKiBvciB0aGUgZW5kIG9mIHRoZSBwYXRoLgorICAgICAgICovCisgICAgICBpZiAocGF0aFtsZW5dICE9ICdcMCcgJiYgcGF0aFtsZW5dICE9ICcvJykKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoZmxhZ3MgJiBCVVNfTUFUQ0hfQVJHUykKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIERCdXNNZXNzYWdlSXRlciBpdGVyOworICAgICAgCisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3MgIT0gTlVMTCk7CisKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2luaXQgKG1lc3NhZ2UsICZpdGVyKTsKKyAgICAgIAorICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAoaSA8IHJ1bGUtPmFyZ3NfbGVuKQorICAgICAgICB7CisgICAgICAgICAgaW50IGN1cnJlbnRfdHlwZTsKKyAgICAgICAgICBjb25zdCBjaGFyICpleHBlY3RlZF9hcmc7CisgICAgICAgICAgaW50IGV4cGVjdGVkX2xlbmd0aDsKKyAgICAgICAgICBkYnVzX2Jvb2xfdCBpc19wYXRoLCBpc19uYW1lc3BhY2U7CisKKyAgICAgICAgICBleHBlY3RlZF9hcmcgPSBydWxlLT5hcmdzW2ldOworICAgICAgICAgIGV4cGVjdGVkX2xlbmd0aCA9IHJ1bGUtPmFyZ19sZW5zW2ldICYgfkJVU19NQVRDSF9BUkdfRkxBR1M7CisgICAgICAgICAgaXNfcGF0aCA9IChydWxlLT5hcmdfbGVuc1tpXSAmIEJVU19NQVRDSF9BUkdfSVNfUEFUSCkgIT0gMDsKKyAgICAgICAgICBpc19uYW1lc3BhY2UgPSAocnVsZS0+YXJnX2xlbnNbaV0gJiBCVVNfTUFUQ0hfQVJHX05BTUVTUEFDRSkgIT0gMDsKKyAgICAgICAgICAKKyAgICAgICAgICBjdXJyZW50X3R5cGUgPSBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZpdGVyKTsKKworICAgICAgICAgIGlmIChleHBlY3RlZF9hcmcgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWN0dWFsX2FyZzsKKyAgICAgICAgICAgICAgaW50IGFjdHVhbF9sZW5ndGg7CisKKyAgICAgICAgICAgICAgaWYgKGN1cnJlbnRfdHlwZSAhPSBEQlVTX1RZUEVfU1RSSU5HICYmCisgICAgICAgICAgICAgICAgICAoIWlzX3BhdGggfHwgY3VycmVudF90eXBlICE9IERCVVNfVFlQRV9PQkpFQ1RfUEFUSCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgICAgIGFjdHVhbF9hcmcgPSBOVUxMOworICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKCZpdGVyLCAmYWN0dWFsX2FyZyk7CisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoYWN0dWFsX2FyZyAhPSBOVUxMKTsKKworICAgICAgICAgICAgICBhY3R1YWxfbGVuZ3RoID0gc3RybGVuIChhY3R1YWxfYXJnKTsKKworICAgICAgICAgICAgICBpZiAoaXNfcGF0aCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoYWN0dWFsX2xlbmd0aCA8IGV4cGVjdGVkX2xlbmd0aCAmJgorICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbF9hcmdbYWN0dWFsX2xlbmd0aCAtIDFdICE9ICcvJykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWRfbGVuZ3RoIDwgYWN0dWFsX2xlbmd0aCAmJgorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2FyZ1tleHBlY3RlZF9sZW5ndGggLSAxXSAhPSAnLycpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgICAgICAgaWYgKG1lbWNtcCAoYWN0dWFsX2FyZywgZXhwZWN0ZWRfYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlOIChhY3R1YWxfbGVuZ3RoLCBleHBlY3RlZF9sZW5ndGgpKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlIGlmIChpc19uYW1lc3BhY2UpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkX2xlbmd0aCA+IGFjdHVhbF9sZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIGFjdHVhbCBhcmd1bWVudCBkb2Vzbid0IHN0YXJ0IHdpdGggdGhlIGV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgKiBuYW1lc3BhY2UsIHRoZW4gd2UgZG9uJ3QgbWF0Y2guCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChtZW1jbXAgKGV4cGVjdGVkX2FyZywgYWN0dWFsX2FyZywgZXhwZWN0ZWRfbGVuZ3RoKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZF9sZW5ndGggPCBhY3R1YWxfbGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgdGhhdCB0aGUgYWN0dWFsIGFyZ3VtZW50IGlzIHdpdGhpbiB0aGUgZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgKiBuYW1lc3BhY2UsIHJhdGhlciB0aGFuIGp1c3Qgc3RhcnRpbmcgd2l0aCB0aGF0IHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgKiBieSBjaGVja2luZyB0aGF0IHRoZSBtYXRjaGVkIHByZWZpeCBlbmRzIGluIGEgJy4nLgorICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgICAgICogVGhpcyBkb2Vzbid0IHN0b3AgImZvby5iYXIuIiBtYXRjaGluZyAiZm9vLmJhci4uYmF6IgorICAgICAgICAgICAgICAgICAgICAgICAqIHdoaWNoIGlzIGFuIGludmFsaWQgbmFtZXNwYWNlLCBidXQgYXQgc29tZSBwb2ludCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgKiBkYWVtb24gY2FuJ3QgY292ZXIgdXAgZm9yIGJyb2tlbiBzZXJ2aWNlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0dWFsX2FyZ1tleHBlY3RlZF9sZW5ndGhdICE9ICcuJykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgLyogb3RoZXJ3aXNlIHdlIGhhZCBhbiBleGFjdCBtYXRjaC4gKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWRfbGVuZ3RoICE9IGFjdHVhbF9sZW5ndGggfHwKKyAgICAgICAgICAgICAgICAgICAgICBtZW1jbXAgKGV4cGVjdGVkX2FyZywgYWN0dWFsX2FyZywgZXhwZWN0ZWRfbGVuZ3RoKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgaWYgKGN1cnJlbnRfdHlwZSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZpdGVyKTsKKworICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2dldF9yZWNpcGllbnRzX2Zyb21fbGlzdCAoREJ1c0xpc3QgICAgICAgKipydWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAqKnJlY2lwaWVudHNfcCkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgaWYgKHJ1bGVzID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKHJ1bGVzKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBCdXNNYXRjaFJ1bGUgKnJ1bGU7CisKKyAgICAgIHJ1bGUgPSBsaW5rLT5kYXRhOworCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgICAgICB7CisgICAgICAgIGNoYXIgKnMgPSBtYXRjaF9ydWxlX3RvX3N0cmluZyAocnVsZSk7CisKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIkNoZWNraW5nIHdoZXRoZXIgbWVzc2FnZSBtYXRjaGVzIHJ1bGUgJXMgZm9yIGNvbm5lY3Rpb24gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHMsIHJ1bGUtPm1hdGNoZXNfZ29fdG8pOworICAgICAgICBkYnVzX2ZyZWUgKHMpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIGlmIChtYXRjaF9ydWxlX21hdGNoZXMgKHJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIsIGFkZHJlc3NlZF9yZWNpcGllbnQsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVVNfTUFUQ0hfTUVTU0FHRV9UWVBFIHwgQlVTX01BVENIX0lOVEVSRkFDRSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiUnVsZSBtYXRjaGVkXG4iKTsKKworICAgICAgICAgIC8qIEFwcGVuZCB0byB0aGUgbGlzdCBpZiB3ZSBoYXZlbid0IGFscmVhZHkgKi8KKyAgICAgICAgICBpZiAoYnVzX2Nvbm5lY3Rpb25fbWFya19zdGFtcCAocnVsZS0+bWF0Y2hlc19nb190bykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKHJlY2lwaWVudHNfcCwgcnVsZS0+bWF0Y2hlc19nb190bykpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkNvbm5lY3Rpb24gYWxyZWFkeSByZWNlaXZpbmcgdGhpcyBtZXNzYWdlLCBzbyBub3QgYWRkaW5nIGFnYWluXG4iKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUgKi8KKyAgICAgICAgfQorCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChydWxlcywgbGluayk7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX21hdGNobWFrZXJfZ2V0X3JlY2lwaWVudHMgKEJ1c01hdGNobWFrZXIgICAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNDb25uZWN0aW9ucyAgKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgKipyZWNpcGllbnRzX3ApCit7CisgIGludCB0eXBlOworICBjb25zdCBjaGFyICppbnRlcmZhY2U7CisgIERCdXNMaXN0ICoqbmVpdGhlciwgKipqdXN0X3R5cGUsICoqanVzdF9pZmFjZSwgKipib3RoOworCisgIF9kYnVzX2Fzc2VydCAoKnJlY2lwaWVudHNfcCA9PSBOVUxMKTsKKworICAvKiBUaGlzIGF2b2lkcyBzZW5kaW5nIHNhbWUgbWVzc2FnZSB0byB0aGUgc2FtZSBjb25uZWN0aW9uIHR3aWNlLgorICAgKiBQdXJwb3NlIG9mIHRoZSBzdGFtcCBpbnN0ZWFkIG9mIGEgYm9vbCBpcyB0byBhdm9pZCBpdGVyYXRpbmcgb3ZlcgorICAgKiBhbGwgY29ubmVjdGlvbnMgcmVzZXR0aW5nIHRoZSBib29sIGVhY2ggdGltZS4KKyAgICovCisgIGJ1c19jb25uZWN0aW9uc19pbmNyZW1lbnRfc3RhbXAgKGNvbm5lY3Rpb25zKTsKKworICAvKiBhZGRyZXNzZWRfcmVjaXBpZW50IGlzIGFscmVhZHkgcmVjZWl2aW5nIHRoZSBtZXNzYWdlLCBkb24ndCBhZGQgdG8gbGlzdC4KKyAgICogTlVMTCBhZGRyZXNzZWRfcmVjaXBpZW50IG1lYW5zIGVpdGhlciBidXMgZHJpdmVyLCBvciB0aGlzIGlzIGEgc2lnbmFsCisgICAqIGFuZCB0aHVzIGxhY2tzIGEgc3BlY2lmaWMgYWRkcmVzc2VkX3JlY2lwaWVudC4KKyAgICovCisgIGlmIChhZGRyZXNzZWRfcmVjaXBpZW50ICE9IE5VTEwpCisgICAgYnVzX2Nvbm5lY3Rpb25fbWFya19zdGFtcCAoYWRkcmVzc2VkX3JlY2lwaWVudCk7CisKKyAgdHlwZSA9IGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSk7CisgIGludGVyZmFjZSA9IGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKTsKKworICBuZWl0aGVyID0gYnVzX21hdGNobWFrZXJfZ2V0X3J1bGVzIChtYXRjaG1ha2VyLCBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElELAorICAgICAgTlVMTCwgRkFMU0UpOworICBqdXN0X3R5cGUgPSBqdXN0X2lmYWNlID0gYm90aCA9IE5VTEw7CisKKyAgaWYgKGludGVyZmFjZSAhPSBOVUxMKQorICAgIGp1c3RfaWZhY2UgPSBidXNfbWF0Y2htYWtlcl9nZXRfcnVsZXMgKG1hdGNobWFrZXIsCisgICAgICAgIERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQsIGludGVyZmFjZSwgRkFMU0UpOworCisgIGlmICh0eXBlID4gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCAmJiB0eXBlIDwgREJVU19OVU1fTUVTU0FHRV9UWVBFUykKKyAgICB7CisgICAgICBqdXN0X3R5cGUgPSBidXNfbWF0Y2htYWtlcl9nZXRfcnVsZXMgKG1hdGNobWFrZXIsIHR5cGUsIE5VTEwsIEZBTFNFKTsKKworICAgICAgaWYgKGludGVyZmFjZSAhPSBOVUxMKQorICAgICAgICBib3RoID0gYnVzX21hdGNobWFrZXJfZ2V0X3J1bGVzIChtYXRjaG1ha2VyLCB0eXBlLCBpbnRlcmZhY2UsIEZBTFNFKTsKKyAgICB9CisKKyAgaWYgKCEoZ2V0X3JlY2lwaWVudHNfZnJvbV9saXN0IChuZWl0aGVyLCBzZW5kZXIsIGFkZHJlc3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgcmVjaXBpZW50c19wKSAmJgorICAgICAgICBnZXRfcmVjaXBpZW50c19mcm9tX2xpc3QgKGp1c3RfaWZhY2UsIHNlbmRlciwgYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCByZWNpcGllbnRzX3ApICYmCisgICAgICAgIGdldF9yZWNpcGllbnRzX2Zyb21fbGlzdCAoanVzdF90eXBlLCBzZW5kZXIsIGFkZHJlc3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgcmVjaXBpZW50c19wKSAmJgorICAgICAgICBnZXRfcmVjaXBpZW50c19mcm9tX2xpc3QgKGJvdGgsIHNlbmRlciwgYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCByZWNpcGllbnRzX3ApKSkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X2NsZWFyIChyZWNpcGllbnRzX3ApOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyNpbmNsdWRlICJ0ZXN0LmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3N0YXRpYyBCdXNNYXRjaFJ1bGUqCitjaGVja19wYXJzZSAoZGJ1c19ib29sX3Qgc2hvdWxkX3N1Y2NlZWQsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqdGV4dCkKK3sKKyAgQnVzTWF0Y2hSdWxlICpydWxlOworICBEQnVzU3RyaW5nIHN0cjsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgdGV4dCk7CisgIAorICBydWxlID0gYnVzX21hdGNoX3J1bGVfcGFyc2UgKE5VTEwsICZzdHIsICZlcnJvcik7CisgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICB7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKHNob3VsZF9zdWNjZWVkICYmIHJ1bGUgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIHBhcnNlOiAlczogJXM6IFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZzdHIpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBpZiAoIXNob3VsZF9zdWNjZWVkICYmIHJ1bGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIGZhaWwgdG8gcGFyc2U6IFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICByZXR1cm4gcnVsZTsKK30KKworc3RhdGljIHZvaWQKK2Fzc2VydF9sYXJnZV9ydWxlIChCdXNNYXRjaFJ1bGUgKnJ1bGUpCit7CisgIF9kYnVzX2Fzc2VydCAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfTUVTU0FHRV9UWVBFKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9TRU5ERVIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX0lOVEVSRkFDRSk7CisgIF9kYnVzX2Fzc2VydCAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfTUVNQkVSKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9ERVNUSU5BVElPTik7CisgIF9kYnVzX2Fzc2VydCAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfUEFUSCk7CisKKyAgX2RidXNfYXNzZXJ0IChydWxlLT5tZXNzYWdlX3R5cGUgPT0gREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlLT5pbnRlcmZhY2UgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocnVsZS0+bWVtYmVyICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUtPnNlbmRlciAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlLT5kZXN0aW5hdGlvbiAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlLT5wYXRoICE9IE5VTEwpOworCisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChydWxlLT5pbnRlcmZhY2UsICJvcmcuZnJlZWRlc2t0b3AuREJ1c0ludGVyZmFjZSIpID09IDApOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAocnVsZS0+c2VuZGVyLCAib3JnLmZyZWVkZXNrdG9wLkRCdXNTZW5kZXIiKSA9PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHJ1bGUtPm1lbWJlciwgIkZvbyIpID09IDApOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAocnVsZS0+cGF0aCwgIi9iYXIvZm9vIikgPT0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChydWxlLT5kZXN0aW5hdGlvbiwgIjo0NTIzNDUuMzQiKSA9PSAwKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Cit0ZXN0X3BhcnNpbmcgKHZvaWQgKmRhdGEpCit7CisgIEJ1c01hdGNoUnVsZSAqcnVsZTsKKworICBydWxlID0gY2hlY2tfcGFyc2UgKFRSVUUsICJ0eXBlPSdzaWduYWwnLHNlbmRlcj0nb3JnLmZyZWVkZXNrdG9wLkRCdXNTZW5kZXInLGludGVyZmFjZT0nb3JnLmZyZWVkZXNrdG9wLkRCdXNJbnRlcmZhY2UnLG1lbWJlcj0nRm9vJyxwYXRoPScvYmFyL2ZvbycsZGVzdGluYXRpb249Jzo0NTIzNDUuMzQnIik7CisgIGlmIChydWxlICE9IE5VTEwpCisgICAgeworICAgICAgYXNzZXJ0X2xhcmdlX3J1bGUgKHJ1bGUpOworICAgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKHJ1bGUpOworICAgIH0KKworICAvKiBXaXRoIGV4dHJhIHdoaXRlc3BhY2UgYW5kIHVzZWxlc3MgcXVvdGVzICovCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoVFJVRSwgIiAgICB0eXBlPSdzaWduYWwnLCAgXHRzZW5kZXI9J29yZy5mcmVlZGVzJydrdG9wLkRCdXNTZW5kZXInLCAgIGludGVyZmFjZT0nb3JnLmZyZWVkZXNrdG9wLkRCdXNJbnRlcmZhY2UnJycnJywgXHRtZW1iZXI9J0ZvbycscGF0aD0nL2Jhci9mb28nLGRlc3RpbmF0aW9uPSc6NDUyMzQ1LjM0JycnJyciKTsKKyAgaWYgKHJ1bGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBhc3NlcnRfbGFyZ2VfcnVsZSAocnVsZSk7CisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgICAgfQorCisKKyAgLyogQSBzaW1wbGUgc2lnbmFsIGNvbm5lY3Rpb24gKi8KKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChUUlVFLCAidHlwZT0nc2lnbmFsJyxwYXRoPScvZm9vJyxpbnRlcmZhY2U9J29yZy5CYXInIik7CisgIGlmIChydWxlICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9NRVNTQUdFX1RZUEUpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9JTlRFUkZBQ0UpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9QQVRIKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5tZXNzYWdlX3R5cGUgPT0gREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+aW50ZXJmYWNlICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5wYXRoICE9IE5VTEwpOworCisgICAgICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAocnVsZS0+aW50ZXJmYWNlLCAib3JnLkJhciIpID09IDApOworICAgICAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHJ1bGUtPnBhdGgsICIvZm9vIikgPT0gMCk7CisgIAorICAgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKHJ1bGUpOworICAgIH0KKworICAvKiBhcmdOICovCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoVFJVRSwgImFyZzA9J2ZvbyciKTsKKyAgaWYgKHJ1bGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmZsYWdzID09IEJVU19NQVRDSF9BUkdTKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJncyAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc19sZW4gPT0gMSk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NbMF0gIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NbMV0gPT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAocnVsZS0+YXJnc1swXSwgImZvbyIpID09IDApOworCisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgICAgfQorICAKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChUUlVFLCAiYXJnMT0nZm9vJyIpOworICBpZiAocnVsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+ZmxhZ3MgPT0gQlVTX01BVENIX0FSR1MpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzX2xlbiA9PSAyKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1swXSA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1sxXSAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1syXSA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChydWxlLT5hcmdzWzFdLCAiZm9vIikgPT0gMCk7CisKKyAgICAgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKKyAgICB9CisKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChUUlVFLCAiYXJnMj0nZm9vJyIpOworICBpZiAocnVsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+ZmxhZ3MgPT0gQlVTX01BVENIX0FSR1MpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzX2xlbiA9PSAzKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1swXSA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1sxXSA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1syXSAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1szXSA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChydWxlLT5hcmdzWzJdLCAiZm9vIikgPT0gMCk7CisKKyAgICAgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKKyAgICB9CisgIAorICBydWxlID0gY2hlY2tfcGFyc2UgKFRSVUUsICJhcmc0MD0nZm9vJyIpOworICBpZiAocnVsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+ZmxhZ3MgPT0gQlVTX01BVENIX0FSR1MpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzX2xlbiA9PSA0MSk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NbMF0gPT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NbMV0gPT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NbNDBdICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzWzQxXSA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChydWxlLT5hcmdzWzQwXSwgImZvbyIpID09IDApOworCisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgICAgfQorICAKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChUUlVFLCAiYXJnNjM9J2ZvbyciKTsKKyAgaWYgKHJ1bGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmZsYWdzID09IEJVU19NQVRDSF9BUkdTKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJncyAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc19sZW4gPT0gNjQpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzWzBdID09IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzWzFdID09IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzWzYzXSAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1s2NF0gPT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAocnVsZS0+YXJnc1s2M10sICJmb28iKSA9PSAwKTsKKworICAgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKHJ1bGUpOworICAgIH0KKworICBydWxlID0gY2hlY2tfcGFyc2UgKFRSVUUsICJhcmc3cGF0aD0nL2ZvbyciKTsKKyAgaWYgKHJ1bGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmZsYWdzID0gQlVTX01BVENIX0FSR1MpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzX2xlbiA9PSA4KTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1s3XSAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1s4XSA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChydWxlLT5hcmdzWzddLCAiL2ZvbyIpID09IDApOworICAgICAgX2RidXNfYXNzZXJ0ICgocnVsZS0+YXJnX2xlbnNbN10gJiBCVVNfTUFUQ0hfQVJHX0lTX1BBVEgpCisgICAgICAgICAgPT0gQlVTX01BVENIX0FSR19JU19QQVRIKTsKKworICAgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKHJ1bGUpOworICAgIH0KKworICAvKiBBcmcgMCBuYW1lc3BhY2UgbWF0Y2hlcyAqLworICBydWxlID0gY2hlY2tfcGFyc2UgKFRSVUUsICJhcmcwbmFtZXNwYWNlPSdmb28nIik7CisgIGlmIChydWxlICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyA9PSBCVVNfTUFUQ0hfQVJHUyk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3MgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NfbGVuID09IDEpOworICAgICAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHJ1bGUtPmFyZ3NbMF0sICJmb28iKSA9PSAwKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoKHJ1bGUtPmFyZ19sZW5zWzBdICYgQlVTX01BVENIX0FSR19OQU1FU1BBQ0UpCisgICAgICAgICAgPT0gQlVTX01BVENIX0FSR19OQU1FU1BBQ0UpOworCisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgICAgfQorCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoVFJVRSwgImFyZzBuYW1lc3BhY2U9J2Zvby5iYXInIik7CisgIGlmIChydWxlICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyA9PSBCVVNfTUFUQ0hfQVJHUyk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3MgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NfbGVuID09IDEpOworICAgICAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHJ1bGUtPmFyZ3NbMF0sICJmb28uYmFyIikgPT0gMCk7CisgICAgICBfZGJ1c19hc3NlcnQgKChydWxlLT5hcmdfbGVuc1swXSAmIEJVU19NQVRDSF9BUkdfTkFNRVNQQUNFKQorICAgICAgICAgID09IEJVU19NQVRDSF9BUkdfTkFNRVNQQUNFKTsKKworICAgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKHJ1bGUpOworICAgIH0KKworICAvKiBPbmx5IGFyZzBuYW1lc3BhY2UgaXMgc3VwcG9ydGVkLiAqLworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAiYXJnMW5hbWVzcGFjZT0nZm9vJyIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisKKyAgLyogQW4gZW1wdHkgc3RyaW5nIGlzbid0IGEgdmFsaWQgbmFtZXNwYWNlIHByZWZpeCAoeW91IHNob3VsZCBqdXN0IG5vdAorICAgKiBzcGVjaWZ5IHRoaXMga2V5IGF0IGFsbCkuCisgICAqLworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAiYXJnMG5hbWVzcGFjZT0nJyIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisKKyAgLyogVHJhaWxpbmcgcGVyaW9kcyBhcmVuJ3QgYWxsb3dlZCAoZWFybGllciB2ZXJzaW9ucyBvZiB0aGUgYXJnMG5hbWVzcGFjZQorICAgKiBzcGVjIGFsbG93ZWQgYSBzaW5nbGUgdHJhaWxpbmcgcGVyaW9kLCB3aGljaCBhbHRlcmVkIHRoZSBzZW1hbnRpY3MpICovCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoRkFMU0UsICJhcmcwbmFtZXNwYWNlPSdmb28uJyIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgImFyZzBuYW1lc3BhY2U9J2Zvby5iYXIuJyIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgImFyZzBuYW1lc3BhY2U9J2Zvby4uJyIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgImFyZzBuYW1lc3BhY2U9J2Zvby5iYXIuLiciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworCisgIC8qIFRvby1sYXJnZSBhcmdOICovCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoRkFMU0UsICJhcmczMDA9J2ZvbyciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAiYXJnNjQ9J2ZvbyciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworCisgIC8qIE5vIE4gaW4gYXJnTiAqLworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAiYXJnPSdmb28nIik7CisgIF9kYnVzX2Fzc2VydCAocnVsZSA9PSBOVUxMKTsKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgImFyZ3Y9J2ZvbyciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAiYXJnM2p1bms9J2ZvbyciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAiYXJndW1lbnQ9J2ZvbyciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworICAKKyAgLyogUmVqZWN0IGR1cGxpY2F0ZXMgKi8KKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgInR5cGU9J3NpZ25hbCcsdHlwZT0nbWV0aG9kX2NhbGwnIik7CisgIF9kYnVzX2Fzc2VydCAocnVsZSA9PSBOVUxMKTsKKworICBydWxlID0gY2hlY2tfcGFyc2UgKFRSVUUsICJwYXRoX25hbWVzcGFjZT0nL2Zvby9iYXInIik7CisgIGlmIChydWxlICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyA9PSBCVVNfTUFUQ0hfUEFUSF9OQU1FU1BBQ0UpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5wYXRoICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHJ1bGUtPnBhdGgsICIvZm9vL2JhciIpID09IDApOworCisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgICAgfQorCisgIC8qIEFsbW9zdCBhIGR1cGxpY2F0ZSAqLworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAicGF0aD0nL2ZvbycscGF0aF9uYW1lc3BhY2U9Jy9mb28nIik7CisgIF9kYnVzX2Fzc2VydCAocnVsZSA9PSBOVUxMKTsKKworICAvKiBUcmFpbGluZyAvIHdhcyBzdXBwb3J0ZWQgaW4gdGhlIGluaXRpYWwgcHJvcG9zYWwsIGJ1dCBub3cgaXNuJ3QgKi8KKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgInBhdGhfbmFtZXNwYWNlPScvZm9vLyciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworCisgIC8qIER1cGxpY2F0ZXMgd2l0aCB0aGUgYXJnTiBjb2RlICovCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoRkFMU0UsICJhcmcwPSdmb28nLGFyZzA9J2JhciciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAiYXJnMz0nZm9vJyxhcmczPSdiYXInIik7CisgIF9kYnVzX2Fzc2VydCAocnVsZSA9PSBOVUxMKTsKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgImFyZzMwPSdmb28nLGFyZzMwPSdiYXInIik7CisgIF9kYnVzX2Fzc2VydCAocnVsZSA9PSBOVUxMKTsKKyAgCisgIC8qIFJlamVjdCBicm9rZW4ga2V5cyAqLworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAiYmxhaD0nc2lnbmFsJyIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisKKyAgLyogUmVqZWN0IGJyb2tlbiB2YWx1ZXMgKi8KKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgInR5cGU9J2Nob3VpbiciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAiaW50ZXJmYWNlPSdhYmNAZGVmKysnIik7CisgIF9kYnVzX2Fzc2VydCAocnVsZSA9PSBOVUxMKTsKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgInNlcnZpY2U9J3lvdXBpJyIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisKKyAgLyogQWxsb3cgZW1wdHkgcnVsZSAqLworICBydWxlID0gY2hlY2tfcGFyc2UgKFRSVUUsICIiKTsKKyAgaWYgKHJ1bGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmZsYWdzID09IDApOworICAgICAgCisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgICAgfQorCisgIC8qIEFsbC13aGl0ZXNwYWNlIHJ1bGUgaXMgdGhlIHNhbWUgYXMgZW1wdHkgKi8KKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChUUlVFLCAiICAgIFx0Iik7CisgIGlmIChydWxlICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyA9PSAwKTsKKyAgICAgIAorICAgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKHJ1bGUpOworICAgIH0KKworICAvKiBCdXQgd2l0aCBub24td2hpdGVzcGFjZSBjaGFycyBhbmQgbm8gPXZhbHVlLCBpdCdzIG5vdCBPSyAqLworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAidHlwZSIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKmZpcnN0OworICBjb25zdCBjaGFyICpzZWNvbmQ7Cit9IGVxdWFsaXR5X3Rlc3RzW10gPSB7CisgIHsgInR5cGU9J3NpZ25hbCciLCAidHlwZT0nc2lnbmFsJyIgfSwKKyAgeyAidHlwZT0nc2lnbmFsJyxpbnRlcmZhY2U9J2Zvby5iYXInIiwgImludGVyZmFjZT0nZm9vLmJhcicsdHlwZT0nc2lnbmFsJyIgfSwKKyAgeyAidHlwZT0nc2lnbmFsJyxtZW1iZXI9J2JhciciLCAibWVtYmVyPSdiYXInLHR5cGU9J3NpZ25hbCciIH0sCisgIHsgInR5cGU9J21ldGhvZF9jYWxsJyxzZW5kZXI9JzoxLjAnIiwgInNlbmRlcj0nOjEuMCcsdHlwZT0nbWV0aG9kX2NhbGwnIiB9LAorICB7ICJ0eXBlPSdtZXRob2RfY2FsbCcsZGVzdGluYXRpb249JzoxLjAnIiwgImRlc3RpbmF0aW9uPSc6MS4wJyx0eXBlPSdtZXRob2RfY2FsbCciIH0sCisgIHsgInR5cGU9J21ldGhvZF9jYWxsJyxwYXRoPScvZm9vL2JhciciLCAicGF0aD0nL2Zvby9iYXInLHR5cGU9J21ldGhvZF9jYWxsJyIgfSwKKyAgeyAidHlwZT0nbWV0aG9kX2NhbGwnLGFyZzA9J2JsYWgnIiwgImFyZzA9J2JsYWgnLHR5cGU9J21ldGhvZF9jYWxsJyIgfSwKKyAgeyAidHlwZT0nbWV0aG9kX2NhbGwnLGFyZzA9J2JvbyciLCAiYXJnMD0nYm9vJyx0eXBlPSdtZXRob2RfY2FsbCciIH0sCisgIHsgInR5cGU9J21ldGhvZF9jYWxsJyxhcmcwPSdibGFoJyxhcmcxPSdiYXonIiwgImFyZzA9J2JsYWgnLGFyZzE9J2JheicsdHlwZT0nbWV0aG9kX2NhbGwnIiB9LAorICB7ICJ0eXBlPSdtZXRob2RfY2FsbCcsYXJnMz0nZm9vc2gnIiwgImFyZzM9J2Zvb3NoJyx0eXBlPSdtZXRob2RfY2FsbCciIH0sCisgIHsgImFyZzM9J2Zvb2wnIiwgImFyZzM9J2Zvb2wnIiB9LAorICB7ICJhcmcwbmFtZXNwYWNlPSdmb29sJyIsICJhcmcwbmFtZXNwYWNlPSdmb29sJyIgfSwKKyAgeyAibWVtYmVyPSdmb29kJyIsICJtZW1iZXI9J2Zvb2QnIiB9Cit9OworCitzdGF0aWMgdm9pZAordGVzdF9lcXVhbGl0eSAodm9pZCkKK3sKKyAgaW50IGk7CisgIAorICBpID0gMDsKKyAgd2hpbGUgKGkgPCBfREJVU19OX0VMRU1FTlRTIChlcXVhbGl0eV90ZXN0cykpCisgICAgeworICAgICAgQnVzTWF0Y2hSdWxlICpmaXJzdDsKKyAgICAgIEJ1c01hdGNoUnVsZSAqc2Vjb25kOworICAgICAgaW50IGo7CisgICAgICAKKyAgICAgIGZpcnN0ID0gY2hlY2tfcGFyc2UgKFRSVUUsIGVxdWFsaXR5X3Rlc3RzW2ldLmZpcnN0KTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoZmlyc3QgIT0gTlVMTCk7CisgICAgICBzZWNvbmQgPSBjaGVja19wYXJzZSAoVFJVRSwgZXF1YWxpdHlfdGVzdHNbaV0uc2Vjb25kKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc2Vjb25kICE9IE5VTEwpOworCisgICAgICBpZiAoIW1hdGNoX3J1bGVfZXF1YWwgKGZpcnN0LCBzZWNvbmQpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoInJ1bGUgJXMgYW5kICVzIHNob3VsZCBoYXZlIGJlZW4gZXF1YWxcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZXF1YWxpdHlfdGVzdHNbaV0uZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgZXF1YWxpdHlfdGVzdHNbaV0uc2Vjb25kKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorCisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAoc2Vjb25kKTsKKworICAgICAgLyogQ2hlY2sgdGhhdCB0aGUgcnVsZSBpcyBub3QgZXF1YWwgdG8gYW55IG9mIHRoZQorICAgICAgICogb3RoZXJzIGJlc2lkZXMgaXRzIHBhaXIgbWF0Y2gKKyAgICAgICAqLworICAgICAgaiA9IDA7CisgICAgICB3aGlsZSAoaiA8IF9EQlVTX05fRUxFTUVOVFMgKGVxdWFsaXR5X3Rlc3RzKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChpICE9IGopCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHNlY29uZCA9IGNoZWNrX3BhcnNlIChUUlVFLCBlcXVhbGl0eV90ZXN0c1tqXS5zZWNvbmQpOworCisgICAgICAgICAgICAgIGlmIChtYXRjaF9ydWxlX2VxdWFsIChmaXJzdCwgc2Vjb25kKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfZGJ1c193YXJuICgicnVsZSAlcyBhbmQgJXMgc2hvdWxkIG5vdCBoYXZlIGJlZW4gZXF1YWxcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbGl0eV90ZXN0c1tpXS5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxdWFsaXR5X3Rlc3RzW2pdLnNlY29uZCk7CisgICAgICAgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAoc2Vjb25kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICArK2o7CisgICAgICAgIH0KKworICAgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKGZpcnN0KTsKKworICAgICAgKytpOworICAgIH0KK30KKworc3RhdGljIGNvbnN0IGNoYXIqCitzaG91bGRfbWF0Y2hfbWVzc2FnZV8xW10gPSB7CisgICJ0eXBlPSdzaWduYWwnIiwKKyAgIm1lbWJlcj0nRnJvYmF0ZWQnIiwKKyAgImFyZzA9J2Zvb2JhciciLAorICAidHlwZT0nc2lnbmFsJyxtZW1iZXI9J0Zyb2JhdGVkJyIsCisgICJ0eXBlPSdzaWduYWwnLG1lbWJlcj0nRnJvYmF0ZWQnLGFyZzA9J2Zvb2JhciciLAorICAibWVtYmVyPSdGcm9iYXRlZCcsYXJnMD0nZm9vYmFyJyIsCisgICJ0eXBlPSdzaWduYWwnLGFyZzA9J2Zvb2JhciciLAorICAvKiBUaGUgZGVmaW5pdGlvbiBvZiBhcmdYcGF0aCBtYXRjaGVzIHNheXM6ICJBcyB3aXRoIG5vcm1hbCBhcmd1bWVudCBtYXRjaGVzLAorICAgKiBpZiB0aGUgYXJndW1lbnQgaXMgZXhhY3RseSBlcXVhbCB0byB0aGUgc3RyaW5nIGdpdmVuIGluIHRoZSBtYXRjaCBydWxlCisgICAqIHRoZW4gdGhlIHJ1bGUgaXMgc2F0aXNmaWVkLiIgU28gdGhpcyBzaG91bGQgbWF0Y2ggKGV2ZW4gdGhvdWdoIHRoZQorICAgKiBhcmd1bWVudCBpcyBub3QgYSB2YWxpZCBwYXRoKSEKKyAgICovCisgICJhcmcwcGF0aD0nZm9vYmFyJyIsCisgICJhcmcwbmFtZXNwYWNlPSdmb29iYXInIiwKKyAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqCitzaG91bGRfbm90X21hdGNoX21lc3NhZ2VfMVtdID0geworICAidHlwZT0nbWV0aG9kX2NhbGwnIiwKKyAgInR5cGU9J2Vycm9yJyIsCisgICJ0eXBlPSdtZXRob2RfcmV0dXJuJyIsCisgICJ0eXBlPSdzaWduYWwnLG1lbWJlcj0nT29wc2VkJyIsCisgICJhcmcwPSdibGFoJyIsCisgICJhcmcxPSdmb29iYXInIiwKKyAgImFyZzI9J2Zvb2JhciciLAorICAiYXJnMz0nZm9vYmFyJyIsCisgICJhcmcwPSczJyIsCisgICJhcmcxPSczJyIsCisgICJhcmcwPSdmb29iYXInLGFyZzE9J2FiY2RlZiciLAorICAiYXJnMD0nZm9vYmFyJyxhcmcxPSdhYmNkZWYnLGFyZzI9J2FiY2RlZmdoaScsYXJnMz0nYWJjZGVmZ2hpJyxhcmc0PSdhYmNkZWZnaGknIiwKKyAgImFyZzA9J2Zvb2JhcicsYXJnMT0nYWJjZGVmJyxhcmc0PSdhYmNkZWZnaGknLGFyZzM9J2FiY2RlZmdoaScsYXJnMj0nYWJjZGVmZ2hpJyIsCisgICJhcmcwcGF0aD0nZm9vJyIsCisgICJhcmcwcGF0aD0nZm9vYmFyLyciLAorICAiYXJnMXBhdGg9JzMnIiwKKyAgImFyZzBuYW1lc3BhY2U9J2ZvbyciLAorICAiYXJnMG5hbWVzcGFjZT0nZm9vJyxhcmcxPSdhYmNkZWYnIiwKKyAgImFyZzBuYW1lc3BhY2U9J21vbyciLAorICBOVUxMCit9OworCisjZGVmaW5lIEVYQU1QTEVfTkFNRSAiY29tLmV4YW1wbGUuYmFja2VuZC5mb28iCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3Nob3VsZF9tYXRjaF9tZXNzYWdlXzJbXSA9IHsKKyAgLyogRVhBTVBMRV9OQU1FIGlzIGluIGFsbCBvZiB0aGVzZSBuYW1lc3BhY2VzICovCisgICJhcmcwbmFtZXNwYWNlPSdjb20uZXhhbXBsZS5iYWNrZW5kJyIsCisgICJhcmcwbmFtZXNwYWNlPSdjb20uZXhhbXBsZSciLAorICAiYXJnMG5hbWVzcGFjZT0nY29tJyIsCisKKyAgLyogSWYgdGhlIGNsaWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgZXhhY3RseSwgd2l0aCBubyB0cmFpbGluZyBwZXJpb2QsIHRoZW4KKyAgICogaXQgc2hvdWxkIG1hdGNoLgorICAgKi8KKyAgImFyZzBuYW1lc3BhY2U9J2NvbS5leGFtcGxlLmJhY2tlbmQuZm9vJyIsCisKKyAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKgorc2hvdWxkX25vdF9tYXRjaF9tZXNzYWdlXzJbXSA9IHsKKyAgLyogVGhlc2UgYXJlIG5vdCBldmVuIHByZWZpeGVzICovCisgICJhcmcwbmFtZXNwYWNlPSdjb20uZXhhbXBsZS5iYWNrZW5kLmZvby5iYXInIiwKKyAgImFyZzBuYW1lc3BhY2U9J2NvbS5leGFtcGxlLmJhY2tlbmQuZm9vYmFyJyIsCisKKyAgLyogVGhlc2UgYXJlIHByZWZpeGVzLCBidXQgdGhleSdyZSBub3QgcGFyZW50IG5hbWVzcGFjZXMuICovCisgICJhcmcwbmFtZXNwYWNlPSdjb20uZXhhbXBsZS5iYWNrZW5kLmZvJyIsCisgICJhcmcwbmFtZXNwYWNlPSdjb20uZXhhbXBsZS5iYWNrZW4nIiwKKyAgImFyZzBuYW1lc3BhY2U9J2NvbS5leGFtcGwnIiwKKyAgImFyZzBuYW1lc3BhY2U9J2NvJyIsCisKKyAgTlVMTAorfTsKKworc3RhdGljIHZvaWQKK2NoZWNrX21hdGNoZXMgKGRidXNfYm9vbF90ICBleHBlY3RlZF90b19tYXRjaCwKKyAgICAgICAgICAgICAgIGludCAgICAgICAgICBudW1iZXIsCisgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpydWxlX3RleHQpCit7CisgIEJ1c01hdGNoUnVsZSAqcnVsZTsKKyAgZGJ1c19ib29sX3QgbWF0Y2hlZDsKKworICBydWxlID0gY2hlY2tfcGFyc2UgKFRSVUUsIHJ1bGVfdGV4dCk7CisgIF9kYnVzX2Fzc2VydCAocnVsZSAhPSBOVUxMKTsKKworICAvKiBXZSBjYW4ndCB0ZXN0IHNlbmRlci9kZXN0aW5hdGlvbiBydWxlcyBzaW5jZSB3ZSBwYXNzIE5VTEwgaGVyZSAqLworICBtYXRjaGVkID0gbWF0Y2hfcnVsZV9tYXRjaGVzIChydWxlLCBOVUxMLCBOVUxMLCBtZXNzYWdlLCAwKTsKKworICBpZiAobWF0Y2hlZCAhPSBleHBlY3RlZF90b19tYXRjaCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRXhwZWN0ZWQgcnVsZSAlcyB0byAlcyBtZXNzYWdlICVkLCBmYWlsZWRcbiIsCisgICAgICAgICAgICAgICAgICBydWxlX3RleHQsIGV4cGVjdGVkX3RvX21hdGNoID8KKyAgICAgICAgICAgICAgICAgICJtYXRjaCIgOiAibm90IG1hdGNoIiwgbnVtYmVyKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19tYXRjaGluZyAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIG51bWJlciwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqc2hvdWxkX21hdGNoLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipzaG91bGRfbm90X21hdGNoKQoreworICBpbnQgaTsKKworICBpID0gMDsKKyAgd2hpbGUgKHNob3VsZF9tYXRjaFtpXSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNoZWNrX21hdGNoZXMgKFRSVUUsIG51bWJlciwgbWVzc2FnZSwgc2hvdWxkX21hdGNoW2ldKTsKKyAgICAgICsraTsKKyAgICB9CisKKyAgaSA9IDA7CisgIHdoaWxlIChzaG91bGRfbm90X21hdGNoW2ldICE9IE5VTEwpCisgICAgeworICAgICAgY2hlY2tfbWF0Y2hlcyAoRkFMU0UsIG51bWJlciwgbWVzc2FnZSwgc2hvdWxkX25vdF9tYXRjaFtpXSk7CisgICAgICArK2k7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAordGVzdF9tYXRjaGluZyAodm9pZCkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UxLCAqbWVzc2FnZTI7CisgIGNvbnN0IGNoYXIgKnZfU1RSSU5HOworICBkYnVzX2ludDMyX3Qgdl9JTlQzMjsKKworICBtZXNzYWdlMSA9IGRidXNfbWVzc2FnZV9uZXcgKERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCk7CisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZTEgIT0gTlVMTCk7CisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9tZW1iZXIgKG1lc3NhZ2UxLCAiRnJvYmF0ZWQiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICB2X1NUUklORyA9ICJmb29iYXIiOworICB2X0lOVDMyID0gMzsKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnZfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAKKyAgY2hlY2tfbWF0Y2hpbmcgKG1lc3NhZ2UxLCAxLAorICAgICAgICAgICAgICAgICAgc2hvdWxkX21hdGNoX21lc3NhZ2VfMSwKKyAgICAgICAgICAgICAgICAgIHNob3VsZF9ub3RfbWF0Y2hfbWVzc2FnZV8xKTsKKyAgCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZTEpOworCisgIG1lc3NhZ2UyID0gZGJ1c19tZXNzYWdlX25ldyAoREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKTsKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlMiAhPSBOVUxMKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X21lbWJlciAobWVzc2FnZTIsICJOYW1lT3duZXJDaGFuZ2VkIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgLyogT2J2aW91c2x5IHRoaXMgaXNuJ3QgcmVhbGx5IGEgTmFtZU93bmVyQ2hhbmdlZCBzaWduYWwuICovCisgIHZfU1RSSU5HID0gRVhBTVBMRV9OQU1FOworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdl9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICBjaGVja19tYXRjaGluZyAobWVzc2FnZTIsIDIsCisgICAgICAgICAgICAgICAgICBzaG91bGRfbWF0Y2hfbWVzc2FnZV8yLAorICAgICAgICAgICAgICAgICAgc2hvdWxkX25vdF9tYXRjaF9tZXNzYWdlXzIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZTIpOworfQorCisjZGVmaW5lIFBBVEhfTUFUQ0hfUlVMRSAiYXJnMHBhdGg9Jy9hYS9iYi8nIgorCisvKiBUaGlzIGlzIGEgbGlzdCBvZiBwYXRocyB0aGF0IHNob3VsZCBiZSBtYXRjaGVkIGJ5IFBBVEhfTUFUQ0hfUlVMRSwgdGFrZW4KKyAqIGZyb20gdGhlIHNwZWNpZmljYXRpb24uIE5vdGljZSB0aGF0IG5vdCBhbGwgb2YgdGhlbSBhcmUgYWN0dWFsbHkgbGVnYWwgRC1CdXMKKyAqIHBhdGhzLgorICoKKyAqIFRoZSBhdXRob3Igb2YgdGhpcyB0ZXN0IHRha2VzIG5vIHJlc3BvbnNpYmlsaXR5IGZvciB0aGUgc2VtYW50aWNzIG9mCisgKiB0aGlzIG1hdGNoIHJ1bGUga2V5LgorICovCitzdGF0aWMgY29uc3QgY2hhciAqcGF0aHNfdGhhdF9zaG91bGRfYmVfbWF0Y2hlZFtdID0geworICAgICIvYWEvIiwKKyAgICAiL2FhL2JiLyIsCisgICAgIi9hYS9iYi9jYy8iLAorI2RlZmluZSBGSVJTVF9WQUxJRF9QQVRIX1dISUNIX1NIT1VMRF9NQVRDSCAzCisgICAgIi8iLAorICAgICIvYWEvYmIvY2MiLAorICAgIE5VTEwKK307CisKKy8qIFRoZXNlIHBhdGhzIHNob3VsZCBub3QgYmUgbWF0Y2hlZCBieSBQQVRIX01BVENIX1JVTEUuICovCitzdGF0aWMgY29uc3QgY2hhciAqcGF0aHNfdGhhdF9zaG91bGRfbm90X2JlX21hdGNoZWRbXSA9IHsKKyAgICAiL2FhL2IiLAorICAgICIvYWEiLAorICAgIC8qIG9yIGV2ZW4uLi4gKi8KKyAgICAiL2FhL2JiIiwKKyAgICBOVUxMCit9OworCitzdGF0aWMgdm9pZAordGVzdF9wYXRoX21hdGNoIChpbnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICpwYXRoLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKnJ1bGVfdGV4dCwKKyAgICAgICAgICAgICAgICAgQnVzTWF0Y2hSdWxlICpydWxlLAorICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgIHNob3VsZF9tYXRjaCkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3IChEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpOworICBkYnVzX2Jvb2xfdCBtYXRjaGVkOworCisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZSAhPSBOVUxMKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X21lbWJlciAobWVzc2FnZSwgIkZvbyIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgJnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICBtYXRjaGVkID0gbWF0Y2hfcnVsZV9tYXRjaGVzIChydWxlLCBOVUxMLCBOVUxMLCBtZXNzYWdlLCAwKTsKKworICBpZiAobWF0Y2hlZCAhPSBzaG91bGRfbWF0Y2gpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkV4cGVjdGVkIHJ1bGUgJXMgdG8gJXMgbWVzc2FnZSAiCisgICAgICAgICAgICAgICAgICAid2l0aCBmaXJzdCBhcmcgJXMgb2YgdHlwZSAnJWMnLCBmYWlsZWRcbiIsCisgICAgICAgICAgICAgICAgICBydWxlX3RleHQsCisgICAgICAgICAgICAgICAgICBzaG91bGRfbWF0Y2ggPyAibWF0Y2giIDogIm5vdCBtYXRjaCIsCisgICAgICAgICAgICAgICAgICBwYXRoLAorICAgICAgICAgICAgICAgICAgKGNoYXIpIHR5cGUpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3BhdGhfbWF0Y2hpbmcgKHZvaWQpCit7CisgIEJ1c01hdGNoUnVsZSAqcnVsZTsKKyAgY29uc3QgY2hhciAqKnM7CisKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChUUlVFLCBQQVRIX01BVENIX1JVTEUpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgIT0gTlVMTCk7CisKKyAgZm9yIChzID0gcGF0aHNfdGhhdF9zaG91bGRfYmVfbWF0Y2hlZDsgKnMgIT0gTlVMTDsgcysrKQorICAgIHRlc3RfcGF0aF9tYXRjaCAoREJVU19UWVBFX1NUUklORywgKnMsIFBBVEhfTUFUQ0hfUlVMRSwgcnVsZSwgVFJVRSk7CisKKyAgZm9yIChzID0gcGF0aHNfdGhhdF9zaG91bGRfYmVfbWF0Y2hlZCArIEZJUlNUX1ZBTElEX1BBVEhfV0hJQ0hfU0hPVUxEX01BVENIOworICAgICAgICpzICE9IE5VTEw7IHMrKykKKyAgICB0ZXN0X3BhdGhfbWF0Y2ggKERCVVNfVFlQRV9PQkpFQ1RfUEFUSCwgKnMsIFBBVEhfTUFUQ0hfUlVMRSwgcnVsZSwgVFJVRSk7CisKKyAgZm9yIChzID0gcGF0aHNfdGhhdF9zaG91bGRfbm90X2JlX21hdGNoZWQ7ICpzICE9IE5VTEw7IHMrKykKKyAgICB7CisgICAgICB0ZXN0X3BhdGhfbWF0Y2ggKERCVVNfVFlQRV9TVFJJTkcsICpzLCBQQVRIX01BVENIX1JVTEUsIHJ1bGUsIEZBTFNFKTsKKyAgICAgIHRlc3RfcGF0aF9tYXRjaCAoREJVU19UWVBFX09CSkVDVF9QQVRILCAqcywgUEFUSF9NQVRDSF9SVUxFLCBydWxlLCBGQUxTRSk7CisgICAgfQorCisgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqCitwYXRoX25hbWVzcGFjZV9zaG91bGRfbWF0Y2hfbWVzc2FnZV8xW10gPSB7CisgICJ0eXBlPSdzaWduYWwnLHBhdGhfbmFtZXNwYWNlPScvZm9vJyIsCisgICJ0eXBlPSdzaWduYWwnLHBhdGhfbmFtZXNwYWNlPScvZm9vL1RoZU9iamVjdE1hbmFnZXInIiwKKyAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqCitwYXRoX25hbWVzcGFjZV9zaG91bGRfbm90X21hdGNoX21lc3NhZ2VfMVtdID0geworICAidHlwZT0nc2lnbmFsJyxwYXRoX25hbWVzcGFjZT0nL2JhciciLAorICAidHlwZT0nc2lnbmFsJyxwYXRoX25hbWVzcGFjZT0nL2Jhci9UaGVPYmplY3RNYW5hZ2VyJyIsCisgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKgorcGF0aF9uYW1lc3BhY2Vfc2hvdWxkX21hdGNoX21lc3NhZ2VfMltdID0geworICAidHlwZT0nc2lnbmFsJyxwYXRoX25hbWVzcGFjZT0nL2Zvby9UaGVPYmplY3RNYW5hZ2VyJyIsCisgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKgorcGF0aF9uYW1lc3BhY2Vfc2hvdWxkX25vdF9tYXRjaF9tZXNzYWdlXzJbXSA9IHsKKyAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqCitwYXRoX25hbWVzcGFjZV9zaG91bGRfbWF0Y2hfbWVzc2FnZV8zW10gPSB7CisgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKgorcGF0aF9uYW1lc3BhY2Vfc2hvdWxkX25vdF9tYXRjaF9tZXNzYWdlXzNbXSA9IHsKKyAgInR5cGU9J3NpZ25hbCcscGF0aF9uYW1lc3BhY2U9Jy9mb28vVGhlT2JqZWN0TWFuYWdlciciLAorICBOVUxMCit9OworCitzdGF0aWMgdm9pZAordGVzdF9tYXRjaGluZ19wYXRoX25hbWVzcGFjZSAodm9pZCkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UxOworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTI7CisgIERCdXNNZXNzYWdlICptZXNzYWdlMzsKKworICBtZXNzYWdlMSA9IGRidXNfbWVzc2FnZV9uZXcgKERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCk7CisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZTEgIT0gTlVMTCk7CisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9wYXRoIChtZXNzYWdlMSwgIi9mb28vVGhlT2JqZWN0TWFuYWdlciIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIG1lc3NhZ2UyID0gZGJ1c19tZXNzYWdlX25ldyAoREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKTsKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlMiAhPSBOVUxMKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X3BhdGggKG1lc3NhZ2UyLCAiL2Zvby9UaGVPYmplY3RNYW5hZ2VyL2NoaWxkX29iamVjdCIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIG1lc3NhZ2UzID0gZGJ1c19tZXNzYWdlX25ldyAoREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKTsKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlMyAhPSBOVUxMKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X3BhdGggKG1lc3NhZ2UzLCAiL2Zvby9UaGVPYmplY3RNYW5hZ2VyT3RoZXIiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICBjaGVja19tYXRjaGluZyAobWVzc2FnZTEsIDEsCisgICAgICAgICAgICAgICAgICBwYXRoX25hbWVzcGFjZV9zaG91bGRfbWF0Y2hfbWVzc2FnZV8xLAorICAgICAgICAgICAgICAgICAgcGF0aF9uYW1lc3BhY2Vfc2hvdWxkX25vdF9tYXRjaF9tZXNzYWdlXzEpOworICBjaGVja19tYXRjaGluZyAobWVzc2FnZTIsIDIsCisgICAgICAgICAgICAgICAgICBwYXRoX25hbWVzcGFjZV9zaG91bGRfbWF0Y2hfbWVzc2FnZV8yLAorICAgICAgICAgICAgICAgICAgcGF0aF9uYW1lc3BhY2Vfc2hvdWxkX25vdF9tYXRjaF9tZXNzYWdlXzIpOworICBjaGVja19tYXRjaGluZyAobWVzc2FnZTMsIDMsCisgICAgICAgICAgICAgICAgICBwYXRoX25hbWVzcGFjZV9zaG91bGRfbWF0Y2hfbWVzc2FnZV8zLAorICAgICAgICAgICAgICAgICAgcGF0aF9uYW1lc3BhY2Vfc2hvdWxkX25vdF9tYXRjaF9tZXNzYWdlXzMpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZTMpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UyKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlMSk7Cit9CisKK2RidXNfYm9vbF90CitidXNfc2lnbmFsc190ZXN0IChjb25zdCBEQnVzU3RyaW5nICp0ZXN0X2RhdGFfZGlyKQoreworICBCdXNNYXRjaG1ha2VyICptYXRjaG1ha2VyOworCisgIG1hdGNobWFrZXIgPSBidXNfbWF0Y2htYWtlcl9uZXcgKCk7CisgIGJ1c19tYXRjaG1ha2VyX3JlZiAobWF0Y2htYWtlcik7CisgIGJ1c19tYXRjaG1ha2VyX3VucmVmIChtYXRjaG1ha2VyKTsKKyAgYnVzX21hdGNobWFrZXJfdW5yZWYgKG1hdGNobWFrZXIpOworCisgIGlmICghX2RidXNfdGVzdF9vb21faGFuZGxpbmcgKCJwYXJzaW5nIG1hdGNoIHJ1bGVzIiwgdGVzdF9wYXJzaW5nLCBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJQYXJzaW5nIG1hdGNoIHJ1bGVzIHRlc3QgZmFpbGVkIik7CisKKyAgdGVzdF9lcXVhbGl0eSAoKTsKKyAgdGVzdF9tYXRjaGluZyAoKTsKKyAgdGVzdF9wYXRoX21hdGNoaW5nICgpOworICB0ZXN0X21hdGNoaW5nX3BhdGhfbmFtZXNwYWNlICgpOworCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLworCmRpZmYgLS1naXQgYS9kYnVzL2J1cy9zaWduYWxzLmggYi9kYnVzL2J1cy9zaWduYWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcxZDJlNAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvYnVzL3NpZ25hbHMuaApAQCAtMCwwICsxLDEwMCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBzaWduYWxzLmggIEJ1cyBzaWduYWwgY29ubmVjdGlvbiBpbXBsZW1lbnRhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBCVVNfU0lHTkFMU19ICisjZGVmaW5lIEJVU19TSUdOQUxTX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKwordHlwZWRlZiBlbnVtCit7CisgIEJVU19NQVRDSF9NRVNTQUdFX1RZUEUgICAgICAgICAgICA9IDEgPDwgMCwKKyAgQlVTX01BVENIX0lOVEVSRkFDRSAgICAgICAgICAgICAgID0gMSA8PCAxLAorICBCVVNfTUFUQ0hfTUVNQkVSICAgICAgICAgICAgICAgICAgPSAxIDw8IDIsCisgIEJVU19NQVRDSF9TRU5ERVIgICAgICAgICAgICAgICAgICA9IDEgPDwgMywKKyAgQlVTX01BVENIX0RFU1RJTkFUSU9OICAgICAgICAgICAgID0gMSA8PCA0LAorICBCVVNfTUFUQ0hfUEFUSCAgICAgICAgICAgICAgICAgICAgPSAxIDw8IDUsCisgIEJVU19NQVRDSF9BUkdTICAgICAgICAgICAgICAgICAgICA9IDEgPDwgNiwKKyAgQlVTX01BVENIX1BBVEhfTkFNRVNQQUNFICAgICAgICAgID0gMSA8PCA3LAorICBCVVNfTUFUQ0hfQ0xJRU5UX0lTX0VBVkVTRFJPUFBJTkcgPSAxIDw8IDgKK30gQnVzTWF0Y2hGbGFnczsKKworQnVzTWF0Y2hSdWxlKiBidXNfbWF0Y2hfcnVsZV9uZXcgICAoREJ1c0Nvbm5lY3Rpb24gKm1hdGNoZXNfZ29fdG8pOworQnVzTWF0Y2hSdWxlKiBidXNfbWF0Y2hfcnVsZV9yZWYgICAoQnVzTWF0Y2hSdWxlICAgKnJ1bGUpOwordm9pZCAgICAgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAoQnVzTWF0Y2hSdWxlICAgKnJ1bGUpOworCitkYnVzX2Jvb2xfdCBidXNfbWF0Y2hfcnVsZV9zZXRfbWVzc2FnZV90eXBlIChCdXNNYXRjaFJ1bGUgICAgICpydWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgdHlwZSk7CitkYnVzX2Jvb2xfdCBidXNfbWF0Y2hfcnVsZV9zZXRfaW50ZXJmYWNlICAgIChCdXNNYXRjaFJ1bGUgICAgICpydWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqaW50ZXJmYWNlKTsKK2RidXNfYm9vbF90IGJ1c19tYXRjaF9ydWxlX3NldF9tZW1iZXIgICAgICAgKEJ1c01hdGNoUnVsZSAgICAgKnJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICptZW1iZXIpOworZGJ1c19ib29sX3QgYnVzX21hdGNoX3J1bGVfc2V0X3NlbmRlciAgICAgICAoQnVzTWF0Y2hSdWxlICAgICAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKnNlbmRlcik7CitkYnVzX2Jvb2xfdCBidXNfbWF0Y2hfcnVsZV9zZXRfZGVzdGluYXRpb24gIChCdXNNYXRjaFJ1bGUgICAgICpydWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqZGVzdGluYXRpb24pOworZGJ1c19ib29sX3QgYnVzX21hdGNoX3J1bGVfc2V0X3BhdGggICAgICAgICAoQnVzTWF0Y2hSdWxlICAgICAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBpc19uYW1lc3BhY2UpOworZGJ1c19ib29sX3QgYnVzX21hdGNoX3J1bGVfc2V0X2FyZyAgICAgICAgICAoQnVzTWF0Y2hSdWxlICAgICAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgaXNfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGlzX25hbWVzcGFjZSk7CisKKy8qIENhbGxpbmcgdGhpcyBtZXRob2RzIGEgY2xpZW50IGRlY2xhcmVzIHRoYXQgaXQgaXMgY3JlYXRpbmcgYSBydWxlIHdoaWNoCisgKiBuZWVkcyB0byBlYXZlc2Ryb3AgKGUuZy4sIGRidXMtbW9uaXRvciksIGFueSBvdGhlciBjcmVhdGVkIHJ1bGVzIG5vdAorICogc2V0dGluZyB0aGVtc2VsdmVzIGFzIGVhdmVzZHJvcHBpbmcgd29uJ3QgcmVjZWl2ZSBhbnkgbWVzc2FnZSBub3QgYWRkcmVzc2VkCisgKiB0byB0aGVtLCB3aGVuIGVhdmVkcm9wIGlzIGVuYWJsZWQgaW4gdGhlIHBvbGljeS4gIE9uIHRoZSBvdGhlciBoYW5kLCB3aGVuCisgKiBlYXZlZHJvcCBpcyBub3QgZW5hYmxlZCBpbiBwb2xpY3ksIHRoaXMgbWV0aG9kIHdvbid0IGhhdmUgYW55IGVmZmVjdCAqLwordm9pZCBidXNfbWF0Y2hfcnVsZV9zZXRfY2xpZW50X2lzX2VhdmVzZHJvcHBpbmcgKEJ1c01hdGNoUnVsZSAgICAgKnJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgaXNfZWF2ZXNkcm9wcGluZyk7CisKK0J1c01hdGNoUnVsZSogYnVzX21hdGNoX3J1bGVfcGFyc2UgKERCdXNDb25uZWN0aW9uICAgKm1hdGNoZXNfZ29fdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpydWxlX3RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CisKK0J1c01hdGNobWFrZXIqIGJ1c19tYXRjaG1ha2VyX25ldyAgICh2b2lkKTsKK0J1c01hdGNobWFrZXIqIGJ1c19tYXRjaG1ha2VyX3JlZiAgIChCdXNNYXRjaG1ha2VyICptYXRjaG1ha2VyKTsKK3ZvaWQgICAgICAgICAgIGJ1c19tYXRjaG1ha2VyX3VucmVmIChCdXNNYXRjaG1ha2VyICptYXRjaG1ha2VyKTsKKworZGJ1c19ib29sX3QgYnVzX21hdGNobWFrZXJfYWRkX3J1bGUgICAgICAgICAgICAgKEJ1c01hdGNobWFrZXIgICAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNNYXRjaFJ1bGUgICAgKnJ1bGUpOworZGJ1c19ib29sX3QgYnVzX21hdGNobWFrZXJfcmVtb3ZlX3J1bGVfYnlfdmFsdWUgKEJ1c01hdGNobWFrZXIgICAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNNYXRjaFJ1bGUgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IpOwordm9pZCAgICAgICAgYnVzX21hdGNobWFrZXJfcmVtb3ZlX3J1bGUgICAgICAgICAgKEJ1c01hdGNobWFrZXIgICAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNNYXRjaFJ1bGUgICAgKnJ1bGUpOwordm9pZCAgICAgICAgYnVzX21hdGNobWFrZXJfZGlzY29ubmVjdGVkICAgICAgICAgKEJ1c01hdGNobWFrZXIgICAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24pOworZGJ1c19ib29sX3QgYnVzX21hdGNobWFrZXJfZ2V0X3JlY2lwaWVudHMgICAgICAgKEJ1c01hdGNobWFrZXIgICAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNDb25uZWN0aW9ucyAgKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgKipyZWNpcGllbnRzX3ApOworCisjZW5kaWYgLyogQlVTX1NJR05BTFNfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9idXMvc3RhdHMuYyBiL2RidXMvYnVzL3N0YXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhmZDQ5YgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvYnVzL3N0YXRzLmMKQEAgLTAsMCArMSwzNTIgQEAKKy8qIHN0YXRzLmMgLSBzdGF0aXN0aWNzIGZyb20gdGhlIGJ1cyBkcml2ZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAic3RhdHMuaCIKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oPgorCisjaW5jbHVkZSAiY29ubmVjdGlvbi5oIgorI2luY2x1ZGUgInNlcnZpY2VzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKworI2lmZGVmIERCVVNfRU5BQkxFX1NUQVRTCisKK3N0YXRpYyBEQnVzTWVzc2FnZSAqCituZXdfYXN2X3JlcGx5IChEQnVzTWVzc2FnZSAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICAqaXRlciwKKyAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAgKmFycl9pdGVyKQoreworICBEQnVzTWVzc2FnZSAqcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworCisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChyZXBseSwgaXRlcik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoaXRlciwgREJVU19UWVBFX0FSUkFZLCAie3N2fSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycl9pdGVyKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gcmVwbHk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorb3Blbl9hc3ZfZW50cnkgKERCdXNNZXNzYWdlSXRlciAqYXJyX2l0ZXIsCisgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICplbnRyeV9pdGVyLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqa2V5LAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqdHlwZSwKKyAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKnZhcl9pdGVyKQoreworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyIChhcnJfaXRlciwgREJVU19UWVBFX0RJQ1RfRU5UUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGVudHJ5X2l0ZXIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoZW50cnlfaXRlciwgREJVU19UWVBFX1NUUklORywgJmtleSkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKGFycl9pdGVyLCBlbnRyeV9pdGVyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoZW50cnlfaXRlciwgREJVU19UWVBFX1ZBUklBTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIHZhcl9pdGVyKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoYXJyX2l0ZXIsIGVudHJ5X2l0ZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjbG9zZV9hc3ZfZW50cnkgKERCdXNNZXNzYWdlSXRlciAqYXJyX2l0ZXIsCisgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAqZW50cnlfaXRlciwKKyAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICp2YXJfaXRlcikKK3sKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKGVudHJ5X2l0ZXIsIHZhcl9pdGVyKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoYXJyX2l0ZXIsIGVudHJ5X2l0ZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoYXJyX2l0ZXIsIGVudHJ5X2l0ZXIpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjbG9zZV9hc3ZfcmVwbHkgKERCdXNNZXNzYWdlSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICphcnJfaXRlcikKK3sKKyAgcmV0dXJuIGRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoaXRlciwgYXJyX2l0ZXIpOworfQorCitzdGF0aWMgdm9pZAorYWJhbmRvbl9hc3ZfZW50cnkgKERCdXNNZXNzYWdlSXRlciAqYXJyX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICplbnRyeV9pdGVyLAorICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAqdmFyX2l0ZXIpCit7CisgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyIChlbnRyeV9pdGVyLCB2YXJfaXRlcik7CisgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyIChhcnJfaXRlciwgZW50cnlfaXRlcik7Cit9CisKK3N0YXRpYyB2b2lkCithYmFuZG9uX2Fzdl9yZXBseSAoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKmFycl9pdGVyKQoreworICBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoaXRlciwgYXJyX2l0ZXIpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2Fzdl9hZGRfdWludDMyIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICphcnJfaXRlciwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXksCisgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCB2YWx1ZSkKK3sKKyAgREJ1c01lc3NhZ2VJdGVyIGVudHJ5X2l0ZXIsIHZhcl9pdGVyOworCisgIGlmICghb3Blbl9hc3ZfZW50cnkgKGFycl9pdGVyLCAmZW50cnlfaXRlciwga2V5LCBEQlVTX1RZUEVfVUlOVDMyX0FTX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgJnZhcl9pdGVyKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJnZhcl9pdGVyLCBEQlVTX1RZUEVfVUlOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKKyAgICB7CisgICAgICBhYmFuZG9uX2Fzdl9lbnRyeSAoYXJyX2l0ZXIsICZlbnRyeV9pdGVyLCAmdmFyX2l0ZXIpOworICAgICAgZ290byBvb207CisgICAgfQorCisgIGlmICghY2xvc2VfYXN2X2VudHJ5IChhcnJfaXRlciwgJmVudHJ5X2l0ZXIsICZ2YXJfaXRlcikpCisgICAgZ290byBvb207CisKKyAgcmV0dXJuIFRSVUU7CisKK29vbToKKyAgYWJhbmRvbl9hc3ZfcmVwbHkgKGl0ZXIsIGFycl9pdGVyKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2Fzdl9hZGRfc3RyaW5nIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICphcnJfaXRlciwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXksCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUpCit7CisgIERCdXNNZXNzYWdlSXRlciBlbnRyeV9pdGVyLCB2YXJfaXRlcjsKKworICBpZiAoIW9wZW5fYXN2X2VudHJ5IChhcnJfaXRlciwgJmVudHJ5X2l0ZXIsIGtleSwgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICZ2YXJfaXRlcikpCisgICAgZ290byBvb207CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZ2YXJfaXRlciwgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCisgICAgeworICAgICAgYWJhbmRvbl9hc3ZfZW50cnkgKGFycl9pdGVyLCAmZW50cnlfaXRlciwgJnZhcl9pdGVyKTsKKyAgICAgIGdvdG8gb29tOworICAgIH0KKworICBpZiAoIWNsb3NlX2Fzdl9lbnRyeSAoYXJyX2l0ZXIsICZlbnRyeV9pdGVyLCAmdmFyX2l0ZXIpKQorICAgIGdvdG8gb29tOworCisgIHJldHVybiBUUlVFOworCitvb206CisgIGFiYW5kb25fYXN2X3JlcGx5IChpdGVyLCBhcnJfaXRlcik7CisgIHJldHVybiBGQUxTRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19zdGF0c19oYW5kbGVfZ2V0X3N0YXRzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnM7CisgIERCdXNNZXNzYWdlICpyZXBseSA9IE5VTEw7CisgIERCdXNNZXNzYWdlSXRlciBpdGVyLCBhcnJfaXRlcjsKKyAgc3RhdGljIGRidXNfdWludDMyX3Qgc3RhdHNfc2VyaWFsID0gMDsKKyAgZGJ1c191aW50MzJfdCBpbl91c2UsIGluX2ZyZWVfbGlzdCwgYWxsb2NhdGVkOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGNvbm5lY3Rpb25zID0gYnVzX3RyYW5zYWN0aW9uX2dldF9jb25uZWN0aW9ucyAodHJhbnNhY3Rpb24pOworCisgIHJlcGx5ID0gbmV3X2Fzdl9yZXBseSAobWVzc2FnZSwgJml0ZXIsICZhcnJfaXRlcik7CisKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgLyogR2xvYmFscyAqLworCisgIGlmICghYXN2X2FkZF91aW50MzIgKCZpdGVyLCAmYXJyX2l0ZXIsICJTZXJpYWwiLCBzdGF0c19zZXJpYWwrKykpCisgICAgZ290byBvb207CisKKyAgX2RidXNfbGlzdF9nZXRfc3RhdHMgKCZpbl91c2UsICZpbl9mcmVlX2xpc3QsICZhbGxvY2F0ZWQpOworICBpZiAoIWFzdl9hZGRfdWludDMyICgmaXRlciwgJmFycl9pdGVyLCAiTGlzdE1lbVBvb2xVc2VkQnl0ZXMiLCBpbl91c2UpIHx8CisgICAgICAhYXN2X2FkZF91aW50MzIgKCZpdGVyLCAmYXJyX2l0ZXIsICJMaXN0TWVtUG9vbENhY2hlZEJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5fZnJlZV9saXN0KSB8fAorICAgICAgIWFzdl9hZGRfdWludDMyICgmaXRlciwgJmFycl9pdGVyLCAiTGlzdE1lbVBvb2xBbGxvY2F0ZWRCeXRlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCkpCisgICAgZ290byBvb207CisKKyAgLyogQ29ubmVjdGlvbnMgKi8KKworICBpZiAoIWFzdl9hZGRfdWludDMyICgmaXRlciwgJmFycl9pdGVyLCAiQWN0aXZlQ29ubmVjdGlvbnMiLAorICAgICAgICBidXNfY29ubmVjdGlvbnNfZ2V0X25fYWN0aXZlIChjb25uZWN0aW9ucykpIHx8CisgICAgICAhYXN2X2FkZF91aW50MzIgKCZpdGVyLCAmYXJyX2l0ZXIsICJJbmNvbXBsZXRlQ29ubmVjdGlvbnMiLAorICAgICAgICBidXNfY29ubmVjdGlvbnNfZ2V0X25faW5jb21wbGV0ZSAoY29ubmVjdGlvbnMpKSB8fAorICAgICAgIWFzdl9hZGRfdWludDMyICgmaXRlciwgJmFycl9pdGVyLCAiTWF0Y2hSdWxlcyIsCisgICAgICAgIGJ1c19jb25uZWN0aW9uc19nZXRfdG90YWxfbWF0Y2hfcnVsZXMgKGNvbm5lY3Rpb25zKSkgfHwKKyAgICAgICFhc3ZfYWRkX3VpbnQzMiAoJml0ZXIsICZhcnJfaXRlciwgIlBlYWtNYXRjaFJ1bGVzIiwKKyAgICAgICAgYnVzX2Nvbm5lY3Rpb25zX2dldF9wZWFrX21hdGNoX3J1bGVzIChjb25uZWN0aW9ucykpIHx8CisgICAgICAhYXN2X2FkZF91aW50MzIgKCZpdGVyLCAmYXJyX2l0ZXIsICJQZWFrTWF0Y2hSdWxlc1BlckNvbm5lY3Rpb24iLAorICAgICAgICBidXNfY29ubmVjdGlvbnNfZ2V0X3BlYWtfbWF0Y2hfcnVsZXNfcGVyX2Nvbm4gKGNvbm5lY3Rpb25zKSkgfHwKKyAgICAgICFhc3ZfYWRkX3VpbnQzMiAoJml0ZXIsICZhcnJfaXRlciwgIkJ1c05hbWVzIiwKKyAgICAgICAgYnVzX2Nvbm5lY3Rpb25zX2dldF90b3RhbF9idXNfbmFtZXMgKGNvbm5lY3Rpb25zKSkgfHwKKyAgICAgICFhc3ZfYWRkX3VpbnQzMiAoJml0ZXIsICZhcnJfaXRlciwgIlBlYWtCdXNOYW1lcyIsCisgICAgICAgIGJ1c19jb25uZWN0aW9uc19nZXRfcGVha19idXNfbmFtZXMgKGNvbm5lY3Rpb25zKSkgfHwKKyAgICAgICFhc3ZfYWRkX3VpbnQzMiAoJml0ZXIsICZhcnJfaXRlciwgIlBlYWtCdXNOYW1lc1BlckNvbm5lY3Rpb24iLAorICAgICAgICBidXNfY29ubmVjdGlvbnNfZ2V0X3BlYWtfYnVzX25hbWVzX3Blcl9jb25uIChjb25uZWN0aW9ucykpKQorICAgIGdvdG8gb29tOworCisgIC8qIGVuZCAqLworCisgIGlmICghY2xvc2VfYXN2X3JlcGx5ICgmaXRlciwgJmFycl9pdGVyKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIGdvdG8gb29tOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICByZXR1cm4gVFJVRTsKKworb29tOgorICBpZiAocmVwbHkgIT0gTlVMTCkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICBCVVNfU0VUX09PTSAoZXJyb3IpOworICByZXR1cm4gRkFMU0U7Cit9CisKK2RidXNfYm9vbF90CitidXNfc3RhdHNfaGFuZGxlX2dldF9jb25uZWN0aW9uX3N0YXRzIChEQnVzQ29ubmVjdGlvbiAqY2FsbGVyX2Nvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqYnVzX25hbWUgPSBOVUxMOworICBEQnVzU3RyaW5nIGJ1c19uYW1lX3N0cjsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5ID0gTlVMTDsKKyAgREJ1c01lc3NhZ2VJdGVyIGl0ZXIsIGFycl9pdGVyOworICBzdGF0aWMgZGJ1c191aW50MzJfdCBzdGF0c19zZXJpYWwgPSAwOworICBkYnVzX3VpbnQzMl90IGluX21lc3NhZ2VzLCBpbl9ieXRlcywgaW5fZmRzLCBpbl9wZWFrX2J5dGVzLCBpbl9wZWFrX2ZkczsKKyAgZGJ1c191aW50MzJfdCBvdXRfbWVzc2FnZXMsIG91dF9ieXRlcywgb3V0X2Zkcywgb3V0X3BlYWtfYnl0ZXMsIG91dF9wZWFrX2ZkczsKKyAgQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5OworICBCdXNTZXJ2aWNlICpzZXJ2aWNlOworICBEQnVzQ29ubmVjdGlvbiAqc3RhdHNfY29ubmVjdGlvbjsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICByZWdpc3RyeSA9IGJ1c19jb25uZWN0aW9uX2dldF9yZWdpc3RyeSAoY2FsbGVyX2Nvbm5lY3Rpb24pOworCisgIGlmICghIGRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmJ1c19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmJ1c19uYW1lX3N0ciwgYnVzX25hbWUpOworICBzZXJ2aWNlID0gYnVzX3JlZ2lzdHJ5X2xvb2t1cCAocmVnaXN0cnksICZidXNfbmFtZV9zdHIpOworCisgIGlmIChzZXJ2aWNlID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05BTUVfSEFTX05PX09XTkVSLAorICAgICAgICAgICAgICAgICAgICAgICJCdXMgbmFtZSAnJXMnIGhhcyBubyBvd25lciIsIGJ1c19uYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgc3RhdHNfY29ubmVjdGlvbiA9IGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyc19jb25uZWN0aW9uIChzZXJ2aWNlKTsKKyAgX2RidXNfYXNzZXJ0IChzdGF0c19jb25uZWN0aW9uICE9IE5VTEwpOworCisgIHJlcGx5ID0gbmV3X2Fzdl9yZXBseSAobWVzc2FnZSwgJml0ZXIsICZhcnJfaXRlcik7CisKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgLyogQnVzIGRhZW1vbiBwZXItY29ubmVjdGlvbiBzdGF0cyAqLworCisgIGlmICghYXN2X2FkZF91aW50MzIgKCZpdGVyLCAmYXJyX2l0ZXIsICJTZXJpYWwiLCBzdGF0c19zZXJpYWwrKykgfHwKKyAgICAgICFhc3ZfYWRkX3VpbnQzMiAoJml0ZXIsICZhcnJfaXRlciwgIk1hdGNoUnVsZXMiLAorICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbl9tYXRjaF9ydWxlcyAoc3RhdHNfY29ubmVjdGlvbikpIHx8CisgICAgICAhYXN2X2FkZF91aW50MzIgKCZpdGVyLCAmYXJyX2l0ZXIsICJQZWFrTWF0Y2hSdWxlcyIsCisgICAgICAgIGJ1c19jb25uZWN0aW9uX2dldF9wZWFrX21hdGNoX3J1bGVzIChzdGF0c19jb25uZWN0aW9uKSkgfHwKKyAgICAgICFhc3ZfYWRkX3VpbnQzMiAoJml0ZXIsICZhcnJfaXRlciwgIkJ1c05hbWVzIiwKKyAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25fc2VydmljZXNfb3duZWQgKHN0YXRzX2Nvbm5lY3Rpb24pKSB8fAorICAgICAgIWFzdl9hZGRfdWludDMyICgmaXRlciwgJmFycl9pdGVyLCAiUGVha0J1c05hbWVzIiwKKyAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X3BlYWtfYnVzX25hbWVzIChzdGF0c19jb25uZWN0aW9uKSkgfHwKKyAgICAgICFhc3ZfYWRkX3N0cmluZyAoJml0ZXIsICZhcnJfaXRlciwgIlVuaXF1ZU5hbWUiLAorICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoc3RhdHNfY29ubmVjdGlvbikpKQorICAgIGdvdG8gb29tOworCisgIC8qIERCdXNDb25uZWN0aW9uIHBlci1jb25uZWN0aW9uIHN0YXRzICovCisKKyAgX2RidXNfY29ubmVjdGlvbl9nZXRfc3RhdHMgKHN0YXRzX2Nvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5fbWVzc2FnZXMsICZpbl9ieXRlcywgJmluX2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbl9wZWFrX2J5dGVzLCAmaW5fcGVha19mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0X21lc3NhZ2VzLCAmb3V0X2J5dGVzLCAmb3V0X2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRfcGVha19ieXRlcywgJm91dF9wZWFrX2Zkcyk7CisKKyAgaWYgKCFhc3ZfYWRkX3VpbnQzMiAoJml0ZXIsICZhcnJfaXRlciwgIkluY29taW5nTWVzc2FnZXMiLCBpbl9tZXNzYWdlcykgfHwKKyAgICAgICFhc3ZfYWRkX3VpbnQzMiAoJml0ZXIsICZhcnJfaXRlciwgIkluY29taW5nQnl0ZXMiLCBpbl9ieXRlcykgfHwKKyAgICAgICFhc3ZfYWRkX3VpbnQzMiAoJml0ZXIsICZhcnJfaXRlciwgIkluY29taW5nRkRzIiwgaW5fZmRzKSB8fAorICAgICAgIWFzdl9hZGRfdWludDMyICgmaXRlciwgJmFycl9pdGVyLCAiUGVha0luY29taW5nQnl0ZXMiLCBpbl9wZWFrX2J5dGVzKSB8fAorICAgICAgIWFzdl9hZGRfdWludDMyICgmaXRlciwgJmFycl9pdGVyLCAiUGVha0luY29taW5nRkRzIiwgaW5fcGVha19mZHMpIHx8CisgICAgICAhYXN2X2FkZF91aW50MzIgKCZpdGVyLCAmYXJyX2l0ZXIsICJPdXRnb2luZ01lc3NhZ2VzIiwgb3V0X21lc3NhZ2VzKSB8fAorICAgICAgIWFzdl9hZGRfdWludDMyICgmaXRlciwgJmFycl9pdGVyLCAiT3V0Z29pbmdCeXRlcyIsIG91dF9ieXRlcykgfHwKKyAgICAgICFhc3ZfYWRkX3VpbnQzMiAoJml0ZXIsICZhcnJfaXRlciwgIk91dGdvaW5nRkRzIiwgb3V0X2ZkcykgfHwKKyAgICAgICFhc3ZfYWRkX3VpbnQzMiAoJml0ZXIsICZhcnJfaXRlciwgIlBlYWtPdXRnb2luZ0J5dGVzIiwgb3V0X3BlYWtfYnl0ZXMpIHx8CisgICAgICAhYXN2X2FkZF91aW50MzIgKCZpdGVyLCAmYXJyX2l0ZXIsICJQZWFrT3V0Z29pbmdGRHMiLCBvdXRfcGVha19mZHMpKQorICAgIGdvdG8gb29tOworCisgIC8qIGVuZCAqLworCisgIGlmICghY2xvc2VfYXN2X3JlcGx5ICgmaXRlciwgJmFycl9pdGVyKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY2FsbGVyX2Nvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5KSkKKyAgICBnb3RvIG9vbTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgcmV0dXJuIFRSVUU7CisKK29vbToKKyAgaWYgKHJlcGx5ICE9IE5VTEwpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisKKyAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RidXMvYnVzL3N0YXRzLmggYi9kYnVzL2J1cy9zdGF0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmODQzZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2J1cy9zdGF0cy5oCkBAIC0wLDAgKzEsMzggQEAKKy8qIHN0YXRzLmggLSBzdGF0aXN0aWNzIGZyb20gdGhlIGJ1cyBkcml2ZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEJVU19TVEFUU19ICisjZGVmaW5lIEJVU19TVEFUU19ICisKKyNpbmNsdWRlICJidXMuaCIKKworI2RlZmluZSBCVVNfSU5URVJGQUNFX1NUQVRTICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5EZWJ1Zy5TdGF0cyIKKworZGJ1c19ib29sX3QgYnVzX3N0YXRzX2hhbmRsZV9nZXRfc3RhdHMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworCitkYnVzX2Jvb2xfdCBidXNfc3RhdHNfaGFuZGxlX2dldF9jb25uZWN0aW9uX3N0YXRzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKKworI2VuZGlmIC8qIG11bHRpcGxlLWluY2x1c2lvbiBndWFyZCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9idXMvc3lzdGVtLmNvbmYuaW4gYi9kYnVzL2J1cy9zeXN0ZW0uY29uZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmY0Y2M0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9idXMvc3lzdGVtLmNvbmYuaW4KQEAgLTAsMCArMSw4MyBAQAorPCEtLSBUaGlzIGNvbmZpZ3VyYXRpb24gZmlsZSBjb250cm9scyB0aGUgc3lzdGVtd2lkZSBtZXNzYWdlIGJ1cy4KKyAgICAgQWRkIGEgc3lzdGVtLWxvY2FsLmNvbmYgYW5kIGVkaXQgdGhhdCByYXRoZXIgdGhhbiBjaGFuZ2luZyB0aGlzIAorICAgICBmaWxlIGRpcmVjdGx5LiAtLT4KKworPCEtLSBOb3RlIHRoYXQgdGhlcmUgYXJlIGFueSBudW1iZXIgb2Ygd2F5cyB5b3UgY2FuIGhvc2UgeW91cnNlbGYKKyAgICAgc2VjdXJpdHktd2lzZSBieSBzY3Jld2luZyB1cCB0aGlzIGZpbGU7IGluIHBhcnRpY3VsYXIsIHlvdQorICAgICBwcm9iYWJseSBkb24ndCB3YW50IHRvIGxpc3RlbiBvbiBhbnkgbW9yZSBhZGRyZXNzZXMsIGFkZCBhbnkgbW9yZQorICAgICBhdXRoIG1lY2hhbmlzbXMsIHJ1biBhcyBhIGRpZmZlcmVudCB1c2VyLCBldGMuIC0tPgorCis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJ1cyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorCisgIDwhLS0gT3VyIHdlbGwta25vd24gYnVzIHR5cGUsIGRvIG5vdCBjaGFuZ2UgdGhpcyAtLT4KKyAgPHR5cGU+c3lzdGVtPC90eXBlPgorCisgIDwhLS0gUnVuIGFzIHNwZWNpYWwgdXNlciAtLT4KKyAgPHVzZXI+QERCVVNfVVNFUkA8L3VzZXI+CisKKyAgPCEtLSBGb3JrIGludG8gZGFlbW9uIG1vZGUgLS0+CisgIDxmb3JrLz4KKworICA8IS0tIFdlIHVzZSBzeXN0ZW0gc2VydmljZSBsYXVuY2hpbmcgdXNpbmcgYSBoZWxwZXIgLS0+CisgIDxzdGFuZGFyZF9zeXN0ZW1fc2VydmljZWRpcnMvPgorCisgIDwhLS0gVGhpcyBpcyBhIHNldHVpZCBoZWxwZXIgdGhhdCBpcyB1c2VkIHRvIGxhdW5jaCBzeXN0ZW0gc2VydmljZXMgLS0+CisgIDxzZXJ2aWNlaGVscGVyPkBEQlVTX0xJQkVYRUNESVJAL2RidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXI8L3NlcnZpY2VoZWxwZXI+CisKKyAgPCEtLSBXcml0ZSBhIHBpZCBmaWxlIC0tPgorICA8cGlkZmlsZT5AREJVU19TWVNURU1fUElEX0ZJTEVAPC9waWRmaWxlPgorCisgIDwhLS0gRW5hYmxlIGxvZ2dpbmcgdG8gc3lzbG9nIC0tPgorICA8c3lzbG9nLz4KKworICA8IS0tIE9ubHkgYWxsb3cgc29ja2V0LWNyZWRlbnRpYWxzLWJhc2VkIGF1dGhlbnRpY2F0aW9uIC0tPgorICA8YXV0aD5FWFRFUk5BTDwvYXV0aD4KKworICA8IS0tIE9ubHkgbGlzdGVuIG9uIGEgbG9jYWwgc29ja2V0LiAoYWJzdHJhY3Q9L3BhdGgvdG8vc29ja2V0IAorICAgICAgIG1lYW5zIHVzZSBhYnN0cmFjdCBuYW1lc3BhY2UsIGRvbid0IHJlYWxseSBjcmVhdGUgZmlsZXN5c3RlbSAKKyAgICAgICBmaWxlOyBvbmx5IExpbnV4IHN1cHBvcnRzIHRoaXMuIFVzZSBwYXRoPS93aGF0ZXZlciBvbiBvdGhlciAKKyAgICAgICBzeXN0ZW1zLikgLS0+CisgIDxsaXN0ZW4+QERCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1NAPC9saXN0ZW4+CisKKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8IS0tIEFsbCB1c2VycyBjYW4gY29ubmVjdCB0byBzeXN0ZW0gYnVzIC0tPgorICAgIDxhbGxvdyB1c2VyPSIqIi8+CisKKyAgICA8IS0tIEhvbGVzIG11c3QgYmUgcHVuY2hlZCBpbiBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yCisgICAgICAgICBuYW1lIG93bmVyc2hpcCBhbmQgc2VuZGluZyBtZXRob2QgY2FsbHMgLS0+CisgICAgPGRlbnkgb3duPSIqIi8+CisgICAgPGRlbnkgc2VuZF90eXBlPSJtZXRob2RfY2FsbCIvPgorCisgICAgPCEtLSBTaWduYWxzIGFuZCByZXBseSBtZXNzYWdlcyAobWV0aG9kIHJldHVybnMsIGVycm9ycykgYXJlIGFsbG93ZWQKKyAgICAgICAgIGJ5IGRlZmF1bHQgLS0+CisgICAgPGFsbG93IHNlbmRfdHlwZT0ic2lnbmFsIi8+CisgICAgPGFsbG93IHNlbmRfcmVxdWVzdGVkX3JlcGx5PSJ0cnVlIiBzZW5kX3R5cGU9Im1ldGhvZF9yZXR1cm4iLz4KKyAgICA8YWxsb3cgc2VuZF9yZXF1ZXN0ZWRfcmVwbHk9InRydWUiIHNlbmRfdHlwZT0iZXJyb3IiLz4KKworICAgIDwhLS0gQWxsIG1lc3NhZ2VzIG1heSBiZSByZWNlaXZlZCBieSBkZWZhdWx0IC0tPgorICAgIDxhbGxvdyByZWNlaXZlX3R5cGU9Im1ldGhvZF9jYWxsIi8+CisgICAgPGFsbG93IHJlY2VpdmVfdHlwZT0ibWV0aG9kX3JldHVybiIvPgorICAgIDxhbGxvdyByZWNlaXZlX3R5cGU9ImVycm9yIi8+CisgICAgPGFsbG93IHJlY2VpdmVfdHlwZT0ic2lnbmFsIi8+CisKKyAgICA8IS0tIEFsbG93IGFueW9uZSB0byB0YWxrIHRvIHRoZSBtZXNzYWdlIGJ1cyAtLT4KKyAgICA8YWxsb3cgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLkRCdXMiLz4KKyAgICA8IS0tIEJ1dCBkaXNhbGxvdyBzb21lIHNwZWNpZmljIGJ1cyBzZXJ2aWNlcyAtLT4KKyAgICA8ZGVueSBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuREJ1cyIKKyAgICAgICAgICBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLkRCdXMiCisgICAgICAgICAgc2VuZF9tZW1iZXI9IlVwZGF0ZUFjdGl2YXRpb25FbnZpcm9ubWVudCIvPgorICA8L3BvbGljeT4KKworICA8IS0tIENvbmZpZyBmaWxlcyBhcmUgcGxhY2VkIGhlcmUgdGhhdCBhbW9uZyBvdGhlciB0aGluZ3MsIHB1bmNoIAorICAgICAgIGhvbGVzIGluIHRoZSBhYm92ZSBwb2xpY3kgZm9yIHNwZWNpZmljIHNlcnZpY2VzLiAtLT4KKyAgPGluY2x1ZGVkaXI+c3lzdGVtLmQ8L2luY2x1ZGVkaXI+CisKKyAgPCEtLSBUaGlzIGlzIGluY2x1ZGVkIGxhc3Qgc28gbG9jYWwgY29uZmlndXJhdGlvbiBjYW4gb3ZlcnJpZGUgd2hhdCdzIAorICAgICAgIGluIHRoaXMgc3RhbmRhcmQgZmlsZSAtLT4KKyAgPGluY2x1ZGUgaWdub3JlX21pc3Npbmc9InllcyI+c3lzdGVtLWxvY2FsLmNvbmY8L2luY2x1ZGU+CisKKyAgPGluY2x1ZGUgaWZfc2VsaW51eF9lbmFibGVkPSJ5ZXMiIHNlbGludXhfcm9vdF9yZWxhdGl2ZT0ieWVzIj5jb250ZXh0cy9kYnVzX2NvbnRleHRzPC9pbmNsdWRlPgorCis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL2RidXMvYnVzL3Rlc3QtbGF1bmNoLWhlbHBlci5jIGIvZGJ1cy9idXMvdGVzdC1sYXVuY2gtaGVscGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIzNmI2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvYnVzL3Rlc3QtbGF1bmNoLWhlbHBlci5jCkBAIC0wLDAgKzEsMTQ3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIHRlc3QtbWFpbi5jICBtYWluKCkgZm9yIHRoZSBPT00gY2hlY2sgb2YgdGhlIGxhdW5jaCBoZWxwZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAidGVzdC5oIgorI2luY2x1ZGUgImFjdGl2YXRpb24taGVscGVyLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKmZhaWx1cmUpCit7CisgIGZwcmludGYgKHN0ZGVyciwgIlVuaXQgdGVzdCBmYWlsZWQ6ICVzXG4iLCBmYWlsdXJlKTsKKyAgZXhpdCAoMSk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19tZW1sZWFrcyAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgZGJ1c19zaHV0ZG93biAoKTsKKyAgCisgIHByaW50ZiAoIiVzOiBjaGVja2luZyBmb3IgbWVtbGVha3NcbiIsIG5hbWUpOworICBpZiAoX2RidXNfZ2V0X21hbGxvY19ibG9ja3Nfb3V0c3RhbmRpbmcgKCkgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiJWQgZGJ1c19tYWxsb2MgYmxvY2tzIHdlcmUgbm90IGZyZWVkXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfZ2V0X21hbGxvY19ibG9ja3Nfb3V0c3RhbmRpbmcgKCkpOworICAgICAgZGllICgibWVtbGVha3MiKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3Bvc3RfaG9vayAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgY2hlY2tfbWVtbGVha3MgKG5hbWUpOworfQorI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KKworCisjaWZkZWYgQUNUSVZBVElPTl9MQVVOQ0hFUl9ET19PT00KKworLyogcmV0dXJucyB0cnVlIGlmIGdvb2QgdGhpbmdzIGhhcHBlbiwgb3IgaWYgd2UgZ2V0IE9PTSAqLworc3RhdGljIGRidXNfYm9vbF90CitidXNfYWN0aXZhdGlvbl9oZWxwZXJfb29tX3Rlc3QgKHZvaWQgKmRhdGEpCit7CisgIGNvbnN0IGNoYXIgKnNlcnZpY2U7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIHNlcnZpY2UgPSAoY29uc3QgY2hhciAqKSBkYXRhOworICByZXR2YWwgPSBUUlVFOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgaWYgKCFydW5fbGF1bmNoX2hlbHBlciAoc2VydmljZSwgJmVycm9yKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmZXJyb3IpOworICAgICAgLyogd2UgZmFpbGVkLCBidXQgYSBPT00gaXMgZ29vZCAqLworICAgICAgaWYgKCFkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJGQUlMRUQgU0VMRiBURVNUOiBFcnJvcjogJXNcbiIsIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgIHJldHZhbCA9IEZBTFNFOworICAgICAgICB9CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogd2Ugc3VjY2VlZGVkLCB5YXkhICovCisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKCZlcnJvcik7CisgICAgfQorICByZXR1cm4gcmV0dmFsOworfQorCisjZW5kaWYKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICBjb25zdCBjaGFyICpkaXI7CisgIERCdXNTdHJpbmcgY29uZmlnX2ZpbGU7CisKKyAgaWYgKGFyZ2MgPiAxKQorICAgIGRpciA9IGFyZ3ZbMV07CisgIGVsc2UKKyAgICBkaXIgPSBfZGJ1c19nZXRlbnYgKCJEQlVTX1RFU1RfREFUQSIpOworCisgIGlmIChkaXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJNdXN0IHNwZWNpZnkgdGVzdCBkYXRhIGRpcmVjdG9yeSBhcyBhcmd2WzFdIG9yIGluIERCVVNfVEVTVF9EQVRBIGVudiB2YXJpYWJsZVxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgcHJpbnRmICgiJXM6IFJ1bm5pbmcgbGF1bmNoIGhlbHBlciBPT00gY2hlY2tzXG4iLCBhcmd2WzBdKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmY29uZmlnX2ZpbGUpKQorICAgIHJldHVybiAxOworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZjb25maWdfZmlsZSwgZGlyKSkKKyAgICByZXR1cm4gMTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmY29uZmlnX2ZpbGUsICIvdmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbS9kZWJ1Zy1hbGxvdy1hbGwtcGFzcy5jb25mIikpCisgICAgcmV0dXJuIDE7CisKKyAgLyogdXNlIGEgY29uZmlnIGZpbGUgdGhhdCB3aWxsIGFjdHVhbGx5IHdvcmsuLi4gKi8KKyAgX2RidXNfc2V0ZW52ICgiVEVTVF9MQVVOQ0hfSEVMUEVSX0NPTkZJRyIsCisgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmY29uZmlnX2ZpbGUpKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbmZpZ19maWxlKTsKKworICBpZiAoIV9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nICgiZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19hY3RpdmF0aW9uX2hlbHBlcl9vb21fdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIikpCisgICAgZGllICgiT09NIGZhaWxlZCIpOworCisgIHRlc3RfcG9zdF9ob29rIChhcmd2WzBdKTsKKworICBwcmludGYgKCIlczogU3VjY2Vzc1xuIiwgYXJndlswXSk7CisKKyAgcmV0dXJuIDA7CisjZWxzZSAvKiBEQlVTX0JVSUxEX1RFU1RTICovCisKKyAgcHJpbnRmICgiTm90IGNvbXBpbGVkIHdpdGggdGVzdCBzdXBwb3J0XG4iKTsKKyAgCisgIHJldHVybiAwOworI2VuZGlmCit9CisKZGlmZiAtLWdpdCBhL2RidXMvYnVzL3Rlc3QtbWFpbi5jIGIvZGJ1cy9idXMvdGVzdC1tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY3MzZjNwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvYnVzL3Rlc3QtbWFpbi5jCkBAIC0wLDAgKzEsMTkwIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIHRlc3QtbWFpbi5jICBtYWluKCkgZm9yIG1ha2UgY2hlY2sKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAidGVzdC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tZXNzYWdlLWludGVybmFsLmg+CisjaW5jbHVkZSAic2VsaW51eC5oIgorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworc3RhdGljIHZvaWQKK2RpZSAoY29uc3QgY2hhciAqZmFpbHVyZSkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiVW5pdCB0ZXN0IGZhaWxlZDogJXNcbiIsIGZhaWx1cmUpOworICBleGl0ICgxKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX21lbWxlYWtzIChjb25zdCBjaGFyICpuYW1lKQoreworICBkYnVzX3NodXRkb3duICgpOworICAKKyAgcHJpbnRmICgiJXM6IGNoZWNraW5nIGZvciBtZW1sZWFrc1xuIiwgbmFtZSk7CisgIGlmIChfZGJ1c19nZXRfbWFsbG9jX2Jsb2Nrc19vdXRzdGFuZGluZyAoKSAhPSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCIlZCBkYnVzX21hbGxvYyBibG9ja3Mgd2VyZSBub3QgZnJlZWRcbiIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19nZXRfbWFsbG9jX2Jsb2Nrc19vdXRzdGFuZGluZyAoKSk7CisgICAgICBkaWUgKCJtZW1sZWFrcyIpOworICAgIH0KK30KKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCisKK3N0YXRpYyBEQnVzSW5pdGlhbEZEcyAqaW5pdGlhbF9mZHMgPSBOVUxMOworCitzdGF0aWMgdm9pZAordGVzdF9wcmVfaG9vayAodm9pZCkKK3sKKyAgCisgIGlmIChfZGJ1c19nZXRlbnYgKCJEQlVTX1RFU1RfU0VMSU5VWCIpCisgICAgICAmJiAoIWJ1c19zZWxpbnV4X3ByZV9pbml0ICgpCisJICB8fCAhYnVzX3NlbGludXhfZnVsbF9pbml0ICgpKSkKKyAgICBkaWUgKCJjb3VsZCBub3QgaW5pdCBzZWxpbnV4IHN1cHBvcnQiKTsKKworICBpbml0aWFsX2ZkcyA9IF9kYnVzX2NoZWNrX2ZkbGVha3NfZW50ZXIgKCk7Cit9CisKK3N0YXRpYyBjaGFyICpwcm9nbmFtZSA9ICIiOworCitzdGF0aWMgdm9pZAordGVzdF9wb3N0X2hvb2sgKHZvaWQpCit7CisgIGlmIChfZGJ1c19nZXRlbnYgKCJEQlVTX1RFU1RfU0VMSU5VWCIpKQorICAgIGJ1c19zZWxpbnV4X3NodXRkb3duICgpOworICBjaGVja19tZW1sZWFrcyAocHJvZ25hbWUpOworCisgIF9kYnVzX2NoZWNrX2ZkbGVha3NfbGVhdmUgKGluaXRpYWxfZmRzKTsKKyAgaW5pdGlhbF9mZHMgPSBOVUxMOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgIGNvbnN0IGNoYXIgKmRpcjsKKyAgY29uc3QgY2hhciAqb25seTsKKyAgREJ1c1N0cmluZyB0ZXN0X2RhdGFfZGlyOworCisgIHByb2duYW1lID0gYXJndlswXTsKKworICBpZiAoYXJnYyA+IDEpCisgICAgZGlyID0gYXJndlsxXTsKKyAgZWxzZQorICAgIGRpciA9IF9kYnVzX2dldGVudiAoIkRCVVNfVEVTVF9EQVRBIik7CisKKyAgaWYgKGFyZ2MgPiAyKQorICAgIG9ubHkgPSBhcmd2WzJdOworICBlbHNlCisgICAgb25seSA9IE5VTEw7CisKKyAgaWYgKGRpciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIk11c3Qgc3BlY2lmeSB0ZXN0IGRhdGEgZGlyZWN0b3J5IGFzIGFyZ3ZbMV0gb3IgaW4gREJVU19URVNUX0RBVEEgZW52IHZhcmlhYmxlXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnRlc3RfZGF0YV9kaXIsIGRpcik7CisKKyAgaWYgKCFfZGJ1c190aHJlYWRzX2luaXRfZGVidWcgKCkpCisgICAgZGllICgiaW5pdGlhbGl6aW5nIGRlYnVnIHRocmVhZHMiKTsKKworICBpZiAob25seSA9PSBOVUxMIHx8IHN0cmNtcCAob25seSwgImV4cGlyZS1saXN0IikgPT0gMCkKKyAgICB7CisgICAgICB0ZXN0X3ByZV9ob29rICgpOworICAgICAgcHJpbnRmICgiJXM6IFJ1bm5pbmcgZXhwaXJlIGxpc3QgdGVzdFxuIiwgYXJndlswXSk7CisgICAgICBpZiAoIWJ1c19leHBpcmVfbGlzdF90ZXN0ICgmdGVzdF9kYXRhX2RpcikpCisgICAgICAgIGRpZSAoImV4cGlyZSBsaXN0Iik7CisgICAgICB0ZXN0X3Bvc3RfaG9vayAoKTsKKyAgICB9CisKKyAgaWYgKG9ubHkgPT0gTlVMTCB8fCBzdHJjbXAgKG9ubHksICJjb25maWctcGFyc2VyIikgPT0gMCkKKyAgICB7CisgICAgICB0ZXN0X3ByZV9ob29rICgpOworICAgICAgcHJpbnRmICgiJXM6IFJ1bm5pbmcgY29uZmlnIGZpbGUgcGFyc2VyIHRlc3RcbiIsIGFyZ3ZbMF0pOworICAgICAgaWYgKCFidXNfY29uZmlnX3BhcnNlcl90ZXN0ICgmdGVzdF9kYXRhX2RpcikpCisgICAgICAgIGRpZSAoInBhcnNlciIpOworICAgICAgdGVzdF9wb3N0X2hvb2sgKCk7CisgICAgfQorCisgIGlmIChvbmx5ID09IE5VTEwgfHwgc3RyY21wIChvbmx5LCAic2lnbmFscyIpID09IDApCisgICAgeworICAgICAgdGVzdF9wcmVfaG9vayAoKTsKKyAgICAgIHByaW50ZiAoIiVzOiBSdW5uaW5nIHNpZ25hbHMgdGVzdFxuIiwgYXJndlswXSk7CisgICAgICBpZiAoIWJ1c19zaWduYWxzX3Rlc3QgKCZ0ZXN0X2RhdGFfZGlyKSkKKyAgICAgICAgZGllICgic2lnbmFscyIpOworICAgICAgdGVzdF9wb3N0X2hvb2sgKCk7CisgICAgfQorCisgIGlmIChvbmx5ID09IE5VTEwgfHwgc3RyY21wIChvbmx5LCAiZGlzcGF0Y2gtc2hhMSIpID09IDApCisgICAgeworICAgICAgdGVzdF9wcmVfaG9vayAoKTsKKyAgICAgIHByaW50ZiAoIiVzOiBSdW5uaW5nIFNIQTEgY29ubmVjdGlvbiB0ZXN0XG4iLCBhcmd2WzBdKTsKKyAgICAgIGlmICghYnVzX2Rpc3BhdGNoX3NoYTFfdGVzdCAoJnRlc3RfZGF0YV9kaXIpKQorICAgICAgICBkaWUgKCJzaGExIik7CisgICAgICB0ZXN0X3Bvc3RfaG9vayAoKTsKKyAgICB9CisKKyAgaWYgKG9ubHkgPT0gTlVMTCB8fCBzdHJjbXAgKG9ubHksICJkaXNwYXRjaCIpID09IDApCisgICAgeworICAgICAgdGVzdF9wcmVfaG9vayAoKTsKKyAgICAgIHByaW50ZiAoIiVzOiBSdW5uaW5nIG1lc3NhZ2UgZGlzcGF0Y2ggdGVzdFxuIiwgYXJndlswXSk7CisgICAgICBpZiAoIWJ1c19kaXNwYXRjaF90ZXN0ICgmdGVzdF9kYXRhX2RpcikpIAorICAgICAgICBkaWUgKCJkaXNwYXRjaCIpOworICAgICAgdGVzdF9wb3N0X2hvb2sgKCk7CisgICAgfQorCisgIGlmIChvbmx5ID09IE5VTEwgfHwgc3RyY21wIChvbmx5LCAiYWN0aXZhdGlvbi1zZXJ2aWNlLXJlbG9hZCIpID09IDApCisgICAgeworICAgICAgdGVzdF9wcmVfaG9vayAoKTsKKyAgICAgIHByaW50ZiAoIiVzOiBSdW5uaW5nIHNlcnZpY2UgZmlsZXMgcmVsb2FkaW5nIHRlc3RcbiIsIGFyZ3ZbMF0pOworICAgICAgaWYgKCFidXNfYWN0aXZhdGlvbl9zZXJ2aWNlX3JlbG9hZF90ZXN0ICgmdGVzdF9kYXRhX2RpcikpCisgICAgICAgIGRpZSAoInNlcnZpY2UgcmVsb2FkIik7CisgICAgICB0ZXN0X3Bvc3RfaG9vayAoKTsKKyAgICB9CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICBpZiAob25seSA9PSBOVUxMIHx8IHN0cmNtcCAob25seSwgInVuaXgtZmRzLXBhc3NpbmciKSA9PSAwKQorICAgIHsKKyAgICAgIHRlc3RfcHJlX2hvb2sgKCk7CisgICAgICBwcmludGYgKCIlczogUnVubmluZyB1bml4IGZkIHBhc3NpbmcgdGVzdFxuIiwgYXJndlswXSk7CisgICAgICBpZiAoIWJ1c191bml4X2Zkc19wYXNzaW5nX3Rlc3QgKCZ0ZXN0X2RhdGFfZGlyKSkKKyAgICAgICAgZGllICgidW5peCBmZCBwYXNzaW5nIik7CisgICAgICB0ZXN0X3Bvc3RfaG9vayAoKTsKKyAgICB9CisjZW5kaWYKKworICBwcmludGYgKCIlczogU3VjY2Vzc1xuIiwgYXJndlswXSk7CisKKyAgCisgIHJldHVybiAwOworI2Vsc2UgLyogREJVU19CVUlMRF9URVNUUyAqLworCisgIHByaW50ZiAoIk5vdCBjb21waWxlZCB3aXRoIHRlc3Qgc3VwcG9ydFxuIik7CisgIAorICByZXR1cm4gMDsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZGJ1cy9idXMvdGVzdC1zeXN0ZW0uYyBiL2RidXMvYnVzL3Rlc3Qtc3lzdGVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZhN2Q0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvYnVzL3Rlc3Qtc3lzdGVtLmMKQEAgLTAsMCArMSwxMDcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiIC0qLSAqLworLyogdGVzdC1tYWluLmMgIG1haW4oKSBmb3IgbWFrZSBjaGVjaworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAidGVzdC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworc3RhdGljIHZvaWQKK2RpZSAoY29uc3QgY2hhciAqZmFpbHVyZSkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiVW5pdCB0ZXN0IGZhaWxlZDogJXNcbiIsIGZhaWx1cmUpOworICBleGl0ICgxKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX21lbWxlYWtzIChjb25zdCBjaGFyICpuYW1lKQoreworICBkYnVzX3NodXRkb3duICgpOworCisgIHByaW50ZiAoIiVzOiBjaGVja2luZyBmb3IgbWVtbGVha3NcbiIsIG5hbWUpOworICBpZiAoX2RidXNfZ2V0X21hbGxvY19ibG9ja3Nfb3V0c3RhbmRpbmcgKCkgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiJWQgZGJ1c19tYWxsb2MgYmxvY2tzIHdlcmUgbm90IGZyZWVkXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfZ2V0X21hbGxvY19ibG9ja3Nfb3V0c3RhbmRpbmcgKCkpOworICAgICAgZGllICgibWVtbGVha3MiKTsKKyAgICB9Cit9CisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLworCitzdGF0aWMgdm9pZAordGVzdF9wcmVfaG9vayAodm9pZCkKK3sKK30KKworc3RhdGljIGNoYXIgKnByb2duYW1lID0gIiI7CitzdGF0aWMgdm9pZAordGVzdF9wb3N0X2hvb2sgKHZvaWQpCit7CisgIGNoZWNrX21lbWxlYWtzIChwcm9nbmFtZSk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgY29uc3QgY2hhciAqZGlyOworICBEQnVzU3RyaW5nIHRlc3RfZGF0YV9kaXI7CisKKyAgcHJvZ25hbWUgPSBhcmd2WzBdOworCisgIGlmIChhcmdjID4gMSkKKyAgICBkaXIgPSBhcmd2WzFdOworICBlbHNlCisgICAgZGlyID0gX2RidXNfZ2V0ZW52ICgiREJVU19URVNUX0RBVEEiKTsKKworICBpZiAoZGlyID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiTXVzdCBzcGVjaWZ5IHRlc3QgZGF0YSBkaXJlY3RvcnkgYXMgYXJndlsxXSBvciBpbiBEQlVTX1RFU1RfREFUQSBlbnYgdmFyaWFibGVcbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdGVzdF9kYXRhX2RpciwgZGlyKTsKKworICBpZiAoIV9kYnVzX3RocmVhZHNfaW5pdF9kZWJ1ZyAoKSkKKyAgICBkaWUgKCJpbml0aWFsaXppbmcgZGVidWcgdGhyZWFkcyIpOworCisgIHRlc3RfcHJlX2hvb2sgKCk7CisgIHByaW50ZiAoIiVzOiBSdW5uaW5nIGNvbmZpZyBmaWxlIHBhcnNlciAodHJpdmlhbCkgdGVzdFxuIiwgYXJndlswXSk7CisgIGlmICghYnVzX2NvbmZpZ19wYXJzZXJfdHJpdmlhbF90ZXN0ICgmdGVzdF9kYXRhX2RpcikpCisgICAgZGllICgicGFyc2VyIik7CisgIHRlc3RfcG9zdF9ob29rICgpOworCisgIHByaW50ZiAoIiVzOiBTdWNjZXNzXG4iLCBhcmd2WzBdKTsKKworICByZXR1cm4gMDsKKyNlbHNlIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KKworICBwcmludGYgKCJOb3QgY29tcGlsZWQgd2l0aCB0ZXN0IHN1cHBvcnRcbiIpOworCisgIHJldHVybiAwOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9kYnVzL2J1cy90ZXN0LmMgYi9kYnVzL2J1cy90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNhOTYwNwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvYnVzL3Rlc3QuYwpAQCAtMCwwICsxLDMxNSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiB0ZXN0LmMgIHVuaXQgdGVzdCByb3V0aW5lcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisjaW5jbHVkZSAidGVzdC5oIgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisKKy8qIFRoZSAiZGVidWcgY2xpZW50IiB3YXRjaC90aW1lb3V0IGhhbmRsZXJzIGRvbid0IGRpc3BhdGNoIG1lc3NhZ2VzLAorICogYXMgd2UgbWFudWFsbHkgcHVsbCB0aGVtIGluIG9yZGVyIHRvIHZlcmlmeSB0aGVtLiBUaGlzIGlzIHdoeSB0aGV5CisgKiBhcmUgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgaGFuZGxlcnMgaW4gY29ubmVjdGlvbi5jCisgKi8KK3N0YXRpYyBEQnVzTGlzdCAqY2xpZW50cyA9IE5VTEw7CitzdGF0aWMgREJ1c0xvb3AgKmNsaWVudF9sb29wID0gTlVMTDsKKworc3RhdGljIGRidXNfYm9vbF90CithZGRfY2xpZW50X3dhdGNoIChEQnVzV2F0Y2ggICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSkKK3sKKyAgcmV0dXJuIF9kYnVzX2xvb3BfYWRkX3dhdGNoIChjbGllbnRfbG9vcCwgd2F0Y2gpOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX2NsaWVudF93YXRjaCAoREJ1c1dhdGNoICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpCit7CisgIF9kYnVzX2xvb3BfcmVtb3ZlX3dhdGNoIChjbGllbnRfbG9vcCwgd2F0Y2gpOworfQorCitzdGF0aWMgdm9pZAordG9nZ2xlX2NsaWVudF93YXRjaCAoREJ1c1dhdGNoICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpCit7CisgIF9kYnVzX2xvb3BfdG9nZ2xlX3dhdGNoIChjbGllbnRfbG9vcCwgd2F0Y2gpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FkZF9jbGllbnRfdGltZW91dCAoREJ1c1RpbWVvdXQgICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKQoreworICByZXR1cm4gX2RidXNfbG9vcF9hZGRfdGltZW91dCAoY2xpZW50X2xvb3AsIHRpbWVvdXQpOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX2NsaWVudF90aW1lb3V0IChEQnVzVGltZW91dCAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpCit7CisgIF9kYnVzX2xvb3BfcmVtb3ZlX3RpbWVvdXQgKGNsaWVudF9sb29wLCB0aW1lb3V0KTsKK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitjbGllbnRfZGlzY29ubmVjdF9maWx0ZXIgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0xPQ0FMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXNjb25uZWN0ZWQiKSkKKyAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisKKyAgX2RidXNfdmVyYm9zZSAoIlJlbW92aW5nIGNsaWVudCAlcCBpbiBkaXNjb25uZWN0IGhhbmRsZXJcbiIsCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2xpc3RfcmVtb3ZlICgmY2xpZW50cywgY29ubmVjdGlvbik7CisKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKworICBpZiAoY2xpZW50cyA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2xvb3BfdW5yZWYgKGNsaWVudF9sb29wKTsKKyAgICAgIGNsaWVudF9sb29wID0gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKK30KKworZGJ1c19ib29sX3QKK2J1c19zZXR1cF9kZWJ1Z19jbGllbnQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlciAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2Rpc2Nvbm5lY3RfZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgaWYgKGNsaWVudF9sb29wID09IE5VTEwpCisgICAgeworICAgICAgY2xpZW50X2xvb3AgPSBfZGJ1c19sb29wX25ldyAoKTsKKyAgICAgIGlmIChjbGllbnRfbG9vcCA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2V0X3dhdGNoX2Z1bmN0aW9ucyAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2NsaWVudF93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX2NsaWVudF93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlX2NsaWVudF93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2V0X3RpbWVvdXRfZnVuY3Rpb25zIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9jbGllbnRfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfY2xpZW50X3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLCBOVUxMKSkKKyAgICBnb3RvIG91dDsKKworICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmY2xpZW50cywgY29ubmVjdGlvbikpCisgICAgZ290byBvdXQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKCFyZXR2YWwpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX3JlbW92ZV9maWx0ZXIgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2Rpc2Nvbm5lY3RfZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dhdGNoX2Z1bmN0aW9ucyAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfdGltZW91dF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKworICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGFzdCAoJmNsaWVudHMsIGNvbm5lY3Rpb24pOworCisgICAgICBpZiAoY2xpZW50cyA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbG9vcF91bnJlZiAoY2xpZW50X2xvb3ApOworICAgICAgICAgIGNsaWVudF9sb29wID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gcmV0dmFsOworfQorCit2b2lkCitidXNfdGVzdF9jbGllbnRzX2ZvcmVhY2ggKEJ1c0Nvbm5lY3Rpb25Gb3JlYWNoRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNsaWVudHMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uID0gbGluay0+ZGF0YTsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmY2xpZW50cywgbGluayk7CisKKyAgICAgIGlmICghKCogZnVuY3Rpb24pIChjb25uZWN0aW9uLCBkYXRhKSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KK30KKworZGJ1c19ib29sX3QKK2J1c190ZXN0X2NsaWVudF9saXN0ZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNsaWVudHMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNDb25uZWN0aW9uICpjID0gbGluay0+ZGF0YTsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmY2xpZW50cywgbGluayk7CisKKyAgICAgIGlmIChjID09IGNvbm5lY3Rpb24pCisgICAgICAgIHJldHVybiBUUlVFOworCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCit2b2lkCitidXNfdGVzdF9ydW5fY2xpZW50c19sb29wIChkYnVzX2Jvb2xfdCBibG9ja19vbmNlKQoreworICBpZiAoY2xpZW50X2xvb3AgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgX2RidXNfdmVyYm9zZSAoIi0tLT4gRGlzcGF0Y2hpbmcgb24gXCJjbGllbnQgc2lkZVwiXG4iKTsKKworICAvKiBkaXNwYXRjaCBiZWZvcmUgd2UgYmxvY2sgc28gcGVuZGluZyBkaXNwYXRjaGVzCisgICAqIHdvbid0IG1ha2Ugb3VyIGJsb2NrIHJldHVybiBlYXJseQorICAgKi8KKyAgX2RidXNfbG9vcF9kaXNwYXRjaCAoY2xpZW50X2xvb3ApOworCisgIC8qIERvIG9uZSBibG9ja2luZyB3YWl0LCBzaW5jZSB3ZSdyZSBleHBlY3RpbmcgZGF0YSAqLworICBpZiAoYmxvY2tfb25jZSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiLS0tPiBibG9ja2luZyBvbiBcImNsaWVudCBzaWRlXCJcbiIpOworICAgICAgX2RidXNfbG9vcF9pdGVyYXRlIChjbGllbnRfbG9vcCwgVFJVRSk7CisgICAgfQorCisgIC8qIFRoZW4gbW9wIGV2ZXJ5dGhpbmcgdXAgKi8KKyAgd2hpbGUgKF9kYnVzX2xvb3BfaXRlcmF0ZSAoY2xpZW50X2xvb3AsIEZBTFNFKSkKKyAgICA7CisKKyAgX2RidXNfdmVyYm9zZSAoIi0tLT4gRG9uZSBkaXNwYXRjaGluZyBvbiBcImNsaWVudCBzaWRlXCJcbiIpOworfQorCit2b2lkCitidXNfdGVzdF9ydW5fYnVzX2xvb3AgKEJ1c0NvbnRleHQgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90IGJsb2NrX29uY2UpCit7CisgIF9kYnVzX3ZlcmJvc2UgKCItLS0+IERpc3BhdGNoaW5nIG9uIFwic2VydmVyIHNpZGVcIlxuIik7CisKKyAgLyogZGlzcGF0Y2ggYmVmb3JlIHdlIGJsb2NrIHNvIHBlbmRpbmcgZGlzcGF0Y2hlcworICAgKiB3b24ndCBtYWtlIG91ciBibG9jayByZXR1cm4gZWFybHkKKyAgICovCisgIF9kYnVzX2xvb3BfZGlzcGF0Y2ggKGJ1c19jb250ZXh0X2dldF9sb29wIChjb250ZXh0KSk7CisKKyAgLyogRG8gb25lIGJsb2NraW5nIHdhaXQsIHNpbmNlIHdlJ3JlIGV4cGVjdGluZyBkYXRhICovCisgIGlmIChibG9ja19vbmNlKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCItLS0+IGJsb2NraW5nIG9uIFwic2VydmVyIHNpZGVcIlxuIik7CisgICAgICBfZGJ1c19sb29wX2l0ZXJhdGUgKGJ1c19jb250ZXh0X2dldF9sb29wIChjb250ZXh0KSwgVFJVRSk7CisgICAgfQorCisgIC8qIFRoZW4gbW9wIGV2ZXJ5dGhpbmcgdXAgKi8KKyAgd2hpbGUgKF9kYnVzX2xvb3BfaXRlcmF0ZSAoYnVzX2NvbnRleHRfZ2V0X2xvb3AgKGNvbnRleHQpLCBGQUxTRSkpCisgICAgOworCisgIF9kYnVzX3ZlcmJvc2UgKCItLS0+IERvbmUgZGlzcGF0Y2hpbmcgb24gXCJzZXJ2ZXIgc2lkZVwiXG4iKTsKK30KKwordm9pZAorYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIHdoaWxlIChfZGJ1c19sb29wX2l0ZXJhdGUgKGJ1c19jb250ZXh0X2dldF9sb29wIChjb250ZXh0KSwgRkFMU0UpIHx8CisgICAgICAgICAoY2xpZW50X2xvb3AgPT0gTlVMTCB8fCBfZGJ1c19sb29wX2l0ZXJhdGUgKGNsaWVudF9sb29wLCBGQUxTRSkpKQorICAgIDsKK30KKworQnVzQ29udGV4dCoKK2J1c19jb250ZXh0X25ld190ZXN0IChjb25zdCBEQnVzU3RyaW5nICp0ZXN0X2RhdGFfZGlyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmZpbGVuYW1lKQoreworICBEQnVzRXJyb3IgZXJyb3I7CisgIERCdXNTdHJpbmcgY29uZmlnX2ZpbGU7CisgIERCdXNTdHJpbmcgcmVsYXRpdmU7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNvbmZpZ19maWxlKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTm8gbWVtb3J5XG4iKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICh0ZXN0X2RhdGFfZGlyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnX2ZpbGUsIDApKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJObyBtZW1vcnlcbiIpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb25maWdfZmlsZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZyZWxhdGl2ZSwgZmlsZW5hbWUpOworCisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmNvbmZpZ19maWxlLCAmcmVsYXRpdmUpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJObyBtZW1vcnlcbiIpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb25maWdfZmlsZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBjb250ZXh0ID0gYnVzX2NvbnRleHRfbmV3ICgmY29uZmlnX2ZpbGUsIEJVU19DT05URVhUX0ZMQUdfTk9ORSwgTlVMTCwgTlVMTCwgTlVMTCwgJmVycm9yKTsKKyAgaWYgKGNvbnRleHQgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmZXJyb3IpOworCisgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIGNyZWF0ZSBkZWJ1ZyBidXMgY29udGV4dCBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZSAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgZXJyb3IubWVzc2FnZSk7CisKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb25maWdfZmlsZSk7CisKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbmZpZ19maWxlKTsKKworICByZXR1cm4gY29udGV4dDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kYnVzL2J1cy90ZXN0LmggYi9kYnVzL2J1cy90ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThhMmM2YgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvYnVzL3Rlc3QuaApAQCAtMCwwICsxLDU3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIHRlc3QuaCAgdW5pdCB0ZXN0IHJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBCVVNfVEVTVF9ICisjZGVmaW5lIEJVU19URVNUX0gKKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlICJjb25uZWN0aW9uLmgiCisKK2RidXNfYm9vbF90IGJ1c19kaXNwYXRjaF90ZXN0ICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICAgICAgICAgICAgKnRlc3RfZGF0YV9kaXIpOworZGJ1c19ib29sX3QgYnVzX2Rpc3BhdGNoX3NoYTFfdGVzdCAgICAoY29uc3QgREJ1c1N0cmluZyAgICAgICAgICAgICAqdGVzdF9kYXRhX2Rpcik7CitkYnVzX2Jvb2xfdCBidXNfY29uZmlnX3BhcnNlcl90ZXN0ICAgIChjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICAgICp0ZXN0X2RhdGFfZGlyKTsKK2RidXNfYm9vbF90IGJ1c19jb25maWdfcGFyc2VyX3RyaXZpYWxfdGVzdCAoY29uc3QgREJ1c1N0cmluZyAgICAgICAgKnRlc3RfZGF0YV9kaXIpOworZGJ1c19ib29sX3QgYnVzX3NpZ25hbHNfdGVzdCAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgICAgICAgICAgICAqdGVzdF9kYXRhX2Rpcik7CitkYnVzX2Jvb2xfdCBidXNfZXhwaXJlX2xpc3RfdGVzdCAgICAgIChjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICAgICp0ZXN0X2RhdGFfZGlyKTsKK2RidXNfYm9vbF90IGJ1c19hY3RpdmF0aW9uX3NlcnZpY2VfcmVsb2FkX3Rlc3QgKGNvbnN0IERCdXNTdHJpbmcgICAgKnRlc3RfZGF0YV9kaXIpOworZGJ1c19ib29sX3QgYnVzX3NldHVwX2RlYnVnX2NsaWVudCAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqY29ubmVjdGlvbik7Cit2b2lkICAgICAgICBidXNfdGVzdF9jbGllbnRzX2ZvcmVhY2ggIChCdXNDb25uZWN0aW9uRm9yZWFjaEZ1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOworZGJ1c19ib29sX3QgYnVzX3Rlc3RfY2xpZW50X2xpc3RlZCAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqY29ubmVjdGlvbik7Cit2b2lkICAgICAgICBidXNfdGVzdF9ydW5fYnVzX2xvb3AgICAgIChCdXNDb250ZXh0ICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgICAgICAgYmxvY2spOwordm9pZCAgICAgICAgYnVzX3Rlc3RfcnVuX2NsaWVudHNfbG9vcCAoZGJ1c19ib29sX3QgICAgICAgICAgICAgICAgICAgYmxvY2spOwordm9pZCAgICAgICAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgICAoQnVzQ29udGV4dCAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CitCdXNDb250ZXh0KiBidXNfY29udGV4dF9uZXdfdGVzdCAgICAgIChjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICAgICp0ZXN0X2RhdGFfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAqZmlsZW5hbWUpOworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKK2RidXNfYm9vbF90IGJ1c191bml4X2Zkc19wYXNzaW5nX3Rlc3QgKGNvbnN0IERCdXNTdHJpbmcgICAgICAgICAgICAgKnRlc3RfZGF0YV9kaXIpOworI2VuZGlmCisKKyNlbmRpZgorCisjZW5kaWYgLyogQlVTX1RFU1RfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9idXMvdXRpbHMuYyBiL2RidXMvYnVzL3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QyNDg3MgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvYnVzL3V0aWxzLmMKQEAgLTAsMCArMSw0OCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiB1dGlscy5jICBHZW5lcmFsIHV0aWxpdHkgZnVuY3Rpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICogQ29weXJpZ2h0IChDKSAyMDAzICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1haW5sb29wLmg+CisKK2NvbnN0IGNoYXIgYnVzX25vX21lbW9yeV9tZXNzYWdlW10gPSAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSBpbiBtZXNzYWdlIGJ1cyI7CisKK3ZvaWQKK2J1c19jb25uZWN0aW9uX2Rpc3BhdGNoX2FsbF9tZXNzYWdlcyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIHdoaWxlIChidXNfY29ubmVjdGlvbl9kaXNwYXRjaF9vbmVfbWVzc2FnZSAoY29ubmVjdGlvbikpCisgICAgOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2hfb25lX21lc3NhZ2UgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c0Rpc3BhdGNoU3RhdHVzIHN0YXR1czsKKworICB3aGlsZSAoKHN0YXR1cyA9IGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCAoY29ubmVjdGlvbikpID09IERCVVNfRElTUEFUQ0hfTkVFRF9NRU1PUlkpCisgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworICAKKyAgcmV0dXJuIHN0YXR1cyA9PSBEQlVTX0RJU1BBVENIX0RBVEFfUkVNQUlOUzsKK30KZGlmZiAtLWdpdCBhL2RidXMvYnVzL3V0aWxzLmggYi9kYnVzL2J1cy91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MzM4OTUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2J1cy91dGlscy5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogdXRpbHMuaCAgR2VuZXJhbCB1dGlsaXR5IGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIEJVU19VVElMU19ICisjZGVmaW5lIEJVU19VVElMU19ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKworZXh0ZXJuIGNvbnN0IGNoYXIgYnVzX25vX21lbW9yeV9tZXNzYWdlW107CisjZGVmaW5lIEJVU19TRVRfT09NKGVycm9yKSBkYnVzX3NldF9lcnJvcl9jb25zdCAoKGVycm9yKSwgREJVU19FUlJPUl9OT19NRU1PUlksIGJ1c19ub19tZW1vcnlfbWVzc2FnZSkKKwordm9pZCAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2hfYWxsX21lc3NhZ2VzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitkYnVzX2Jvb2xfdCBidXNfY29ubmVjdGlvbl9kaXNwYXRjaF9vbmVfbWVzc2FnZSAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKKworI2VuZGlmIC8qIEJVU19VVElMU19IICovCmRpZmYgLS1naXQgYS9kYnVzL2NsZWFudXAtbWFuLXBhZ2VzLnNoIGIvZGJ1cy9jbGVhbnVwLW1hbi1wYWdlcy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2U5OGE2Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9jbGVhbnVwLW1hbi1wYWdlcy5zaApAQCAtMCwwICsxLDg2IEBACisjISAvYmluL3NoCisKKyMjIFRoaXMgc2NyaXB0IGNsZWFucyB1cCBwcml2YXRlL2ludGVybmFsIEFQSSBmcm9tIHRoZSBtYW4gcGFnZXMKKyMjIGdlbmVyYXRlZCBieSBEb3h5Z2VuLiAgVGhpcyBicmluZ3MgdGhlIG1hbiBwYWdlcyBkb3duIGZyb20gNyBtZWdzCisjIyB0byAyIG1lZ3MgYW5kIGF2b2lkcyBuYW1lc3BhY2UtcG9sbHV0aW5nIG1hbiBwYWdlcy4gIEl0J3MgcHJvYmFibHkKKyMjIHByZXR0eSBzcGVjaWZpYyB0byBHTlUgdXRpbGl0aWVzLiBQYXRjaGVzIGdsYWRseSBhY2NlcHRlZCB0byBtYWtlCisjIyBpdCB3b3JrIHdpdGhvdXQgdGhlbS4KKworIyMgWW91IHdvdWxkIHJ1biB0aGlzIGFmdGVyIGJ1aWxkaW5nIGRidXMgYW5kIGFmdGVyIHJ1bm5pbmcgImRveHlnZW4KKyMjIERveHlmaWxlIgorCitkaWUoKSB7CisgICAgZWNobyAiJCoiIDE+JjIKKyAgICBleGl0IDEKK30KKworTUFORElSPSQxCitpZiB0ZXN0IHgiJE1BTkRJUiIgPSB4IDsgdGhlbgorICAgIE1BTkRJUj1kb2MvYXBpL21hbi9tYW4zZGJ1cworZmkKKworY2QgIiRNQU5ESVIiIHx8IGRpZSAiQ291bGQgbm90IGNkIHRvICRNQU5ESVIiCisKK3Rlc3QgLWQga2VlcCB8fCBta2RpciBrZWVwIHx8IGRpZSAiQ291bGQgbm90IGNyZWF0ZSAkTUFORElSL2tlZXAgZGlyZWN0b3J5IgordGVzdCAtZCBudWtlIHx8IG1rZGlyIG51a2UgfHwgZGllICJDb3VsZCBub3QgY3JlYXRlICRNQU5ESVIvbnVrZSBkaXJlY3RvcnkiCisKKyMjIGJsYWNrbGlzdAorKGZpbmQgLiAtbWF4ZGVwdGggMSAtbmFtZSAiXyoiIHwgeGFyZ3MgLUkgSVRFTVMgL2Jpbi9tdiBJVEVNUyBudWtlKSB8fCBkaWUgImNvdWxkIG5vdCBtb3ZlIGFsbCB1bmRlcnNjb3JlLXByZWZpeGVkIGl0ZW1zIgorKGZpbmQgLiAtbWF4ZGVwdGggMSAtbmFtZSAiREJ1cypJbnRlcm5hbCoiIHwgeGFyZ3MgLUkgSVRFTVMgL2Jpbi9tdiBJVEVNUyBudWtlKSB8fCBkaWUgImNvdWxkIG5vdCBtb3ZlIGFsbCBpbnRlcm5hbC1jb250YWluaW5nIGl0ZW1zIgorKGZpbmQgLiAtbWF4ZGVwdGggMSAtbmFtZSAiZGJ1c18qX2ludGVybmFsXyoiIHwgeGFyZ3MgLUkgSVRFTVMgL2Jpbi9tdiBJVEVNUyBudWtlKSB8fCBkaWUgImNvdWxkIG5vdCBtb3ZlIGFsbCBpbnRlcm5hbC1jb250YWluaW5nIGl0ZW1zIgorCisjIyB0aGlzIGlzIGtpbmQgb2YgdW5tYWludGFpbmFibGUsIGJ1dCBJIGd1ZXNzIGl0J3Mgbm8gaHVnZSBkaXNhc3RlciBpZiB3ZSBtaXNzIHNvbWV0aGluZy4KKyMjIHRoaXMgbGlzdCBzaG91bGQgb25seSBjb250YWluIG1hbiBwYWdlcyB3aXRoID4xIGxpbmUsIGkuZS4gd2l0aCByZWFsIGNvbnRlbnQ7IHRoZSAKKyMjIG9uZS1saW5lIGNyb3NzLXJlZmVyZW5jZXMgZ2V0IGNsZWFuZWQgdXAgbmV4dC4KK2ZvciBJIGluIERCdXNDb3VudGVyLiogREJ1c0NyZWRlbnRpYWxzLiogREJ1c0RhdGFTbG90LiogREJ1c0RhdGFTbG90QWxsb2NhdG9yLiogREJ1c0RhdGFTbG90TGlzdC4qIFwKKyAgICBEQnVzRGlySXRlci4qIERCdXNGYWtlTXV0ZXguKiBEQnVzRnJlZWRFbGVtZW50LiogREJ1c0dyb3VwSW5mby4qIERCdXNHVUlELiogREJ1c0hhc2hFbnRyeS4qIFwKKyAgICBEQnVzSGFzaEl0ZXIuKiBEQnVzSGFzaFRhYmxlLiogREJ1c0hlYWRlci4qIERCdXNIZWFkZXJGaWVsZC4qIERCdXNLZXkuKiBEQnVzS2V5cmluZy4qIERCdXNMaXN0LiogXAorICAgIERCdXNNYXJzaGFsLiogREJ1c01ENSogREJ1c01lbUJsb2NrLiogREJ1c01lbVBvb2wuKiBEQnVzTWVzc2FnZUdlbmVyYXRvci4qIERCdXNNZXNzYWdlTG9hZGVyLiogXAorICAgIERCdXNNZXNzYWdlUmVhbEl0ZXIuKiBEQnVzT2JqZWN0U3VidHJlZS4qIERCdXNPYmplY3RUcmVlLiogREJ1c1BvbGxGRC4qIERCdXNSZWFsKiBcCisgICAgREJ1c1Jlc291cmNlcy4qIERCdXNTZXJ2ZXJEZWJ1Z1BpcGUuKiBEQnVzU2VydmVyU29ja2V0LiogREJ1c1NlcnZlclVuaXguKiBcCisgICAgREJ1c1NlcnZlclZUYWJsZS4qIERCdXNTSEEuKiBEQnVzU0hBQ29udGV4dC4qIERCdXNTaWduYXR1cmVSZWFsSXRlci4qIERCdXNTdGF0LiogREJ1c1N0cmluZy4qIFwKKyAgICBEQnVzU3lzZGVwcy4qIERCdXNTeXNkZXBzVW5peC4qIERCdXNUaW1lb3V0TGlzdC4qIERCdXNUcmFuc3BvcnQqIERCdXNUeXBlUmVhZGVyKiBEQnVzVHlwZVdyaXRlciogXAorICAgIERCdXNVc2VySW5mby4qIERCdXNXYXRjaExpc3QuKiA7IGRvIAorICAgIGlmIHRlc3QgLWYgIiRJIiA7IHRoZW4KKyAgICAgICAgL2Jpbi9tdiAiJEkiIG51a2UgfHwgZGllICJjb3VsZCBub3QgbW92ZSAkSSB0byAkTUFORElSL251a2UiCisgICAgZmkKK2RvbmUKKworIyMgbWFueSBmaWxlcyBqdXN0IGNvbnRhaW4gIi5zbyBtYW4zZGJ1cy9EQnVzU3RyaW5nSW50ZXJuYWxzLjNkYnVzIiBvciB0aGUgbGlrZSwgCisjIyBpZiB0aGVzZSBwb2ludCB0byBzb21ldGhpbmcgd2UgbnVrZWQsIHdlIHdhbnQgdG8gYWxzbyBudWtlIHRoZSBwb2ludGVyLgorZm9yIEkgaW4gKiA7IGRvCisgICAgaWYgdGVzdCAtZiAiJEkiIDsgdGhlbgorICAgICAgICBMSU5FUz1gd2MgLWwgIiRJIiB8IGN1dCAtZCAnICcgLWYgMWAKKyAgICAgICAgaWYgdGVzdCB4IiRMSU5FUyIgPSB4MSA7IHRoZW4KKyAgICAgICAgICAgIFJFRl9UTz1gY2F0ICIkSSIgfCBzZWQgLWUgJ3MvXC5zbyBtYW4zZGJ1c1wvLy9nJ2AKKyAgICAgICAgICAgICMjIGVjaG8gIiRJIHBvaW50cyB0byAkUkVGX1RPIgorICAgICAgICAgICAgaWYgISB0ZXN0IC1mICIkUkVGX1RPIiA7IHRoZW4KKyAgICAgICAgICAgICAgICAvYmluL212ICIkSSIgbnVrZSB8fCBkaWUgImNvdWxkIG5vdCBtb3ZlICRJIHRvICRNQU5ESVIvbnVrZSIKKyAgICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgZmkKK2RvbmUKKworIyMgd2hpdGVsaXN0CisoZmluZCAuIC1tYXhkZXB0aCAxIC1uYW1lICJkYnVzXyoiIHwgeGFyZ3MgLUkgSVRFTVMgL2Jpbi9tdiBJVEVNUyBrZWVwKSB8fCBkaWUgImNvdWxkIG5vdCBtb3ZlIGFsbCBkYnVzLXByZWZpeGVkIGl0ZW1zIgorKGZpbmQgLiAtbWF4ZGVwdGggMSAtbmFtZSAiREJVU18qIiB8IHhhcmdzIC1JIElURU1TIC9iaW4vbXYgSVRFTVMga2VlcCkgfHwgZGllICJjb3VsZCBub3QgbW92ZSBhbGwgREJVU18tcHJlZml4ZWQgaXRlbXMiCisoZmluZCAuIC1tYXhkZXB0aCAxIC1uYW1lICJEQnVzKiIgfCB4YXJncyAtSSBJVEVNUyAvYmluL212IElURU1TIGtlZXApIHx8IGRpZSAiY291bGQgbm90IG1vdmUgYWxsIERCdXMtcHJlZml4ZWQgaXRlbXMiCisKKyMjIGV2ZXJ5dGhpbmcgZWxzZSBpcyBhc3N1bWVkIGlycmVsZXZhbnQsIHRoaXMgaXMgbW9zdGx5IHN0cnVjdCBmaWVsZHMKKyMjIGZyb20gdGhlIHB1YmxpYyBoZWFkZXJzCisoZmluZCAuIC1tYXhkZXB0aCAxIC10eXBlIGYgfCB4YXJncyAtSSBJVEVNUyAvYmluL212IElURU1TIG51a2UpIHx8IGRpZSAiY291bGQgbm90IG1vdmUgcmVtYWluaW5nIGl0ZW1zIgorCitOVUtFX0NPVU5UPWBmaW5kIG51a2UgLXR5cGUgZiAtbmFtZSAiKiIgfCB3YyAtbGAKK0tFRVBfQ09VTlQ9YGZpbmQga2VlcCAtdHlwZSBmIC1uYW1lICIqIiB8IHdjIC1sYAorTUlTU0lOR19DT1VOVD1gZmluZCAuIC1tYXhkZXB0aCAxIC10eXBlIGYgLW5hbWUgIioiIHwgd2MgLWxgCisKK2VjaG8gIiRLRUVQX0NPVU5UIG1hbiBwYWdlcyBrZXB0IGFuZCAkTlVLRV9DT1VOVCBtYW4gcGFnZXMgdG8gcmVtb3ZlIgorZWNobyAiJE1JU1NJTkdfQ09VTlQgbm90IGhhbmRsZWQiCisKKyhmaW5kIGtlZXAgLXR5cGUgZiAtbmFtZSAiKiIgfCB4YXJncyAtSSBJVEVNUyAvYmluL212IElURU1TIC4pIHx8IGRpZSAiY291bGQgbm90IG1vdmUga2VwdCBpdGVtcyBiYWNrIgorCitybWRpciBrZWVwIHx8IGRpZSAiY291bGQgbm90IHJlbW92ZSAkTUFORElSL2tlZXAiCisKK2VjaG8gIk1hbiBwYWdlcyB0byBiZSBpbnN0YWxsZWQgYXJlIGluICRNQU5ESVIgYW5kIG1hbiBwYWdlcyB0byBpZ25vcmUgYXJlIGluICRNQU5ESVIvbnVrZSIKKworZXhpdCAwCmRpZmYgLS1naXQgYS9kYnVzL2NtYWtlL0NNYWtlTGlzdHMudHh0IGIvZGJ1cy9jbWFrZS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDBhY2RhCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9jbWFrZS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDYxMyBAQAorcHJvamVjdChkYnVzKQorCisjIHdlIG5lZWQgdG8gYmUgdXAgdG8gZGF0ZQorQ01BS0VfTUlOSU1VTV9SRVFVSVJFRChWRVJTSU9OIDIuNC40IEZBVEFMX0VSUk9SKQoraWYoQ09NTUFORCBjbWFrZV9wb2xpY3kpCisgICAgY21ha2VfcG9saWN5KFNFVCBDTVAwMDAzIE5FVykKK2VuZGlmKENPTU1BTkQgY21ha2VfcG9saWN5KQorCisjIHdoZXJlIHRvIGxvb2sgZmlyc3QgZm9yIGNtYWtlIG1vZHVsZXMsIGJlZm9yZSAke0NNQUtFX1JPT1R9L01vZHVsZXMvIGlzIGNoZWNrZWQKK3NldChDTUFLRV9NT0RVTEVfUEFUSCAiJHtDTUFLRV9TT1VSQ0VfRElSfS9tb2R1bGVzIikKKworIyBkZXRlY3QgdmVyc2lvbgoraW5jbHVkZShNYWNyb3NBdXRvdG9vbHMpCithdXRvdmVyc2lvbiguLi9jb25maWd1cmUuYWMgZGJ1cykKKyMgdXNlZCBieSBmaWxlIHZlcnNpb24gaW5mbworc2V0IChEQlVTX1BBVENIX1ZFUlNJT04gIjAiKQorCitpbmNsdWRlKE1hY3JvcykKK1RJTUVTVEFNUChEQlVTX0JVSUxEX1RJTUVTVEFNUCkKKworIyMjIyMjIyMjIyMgYmFzaWMgdmFycyAjIyMjIyMjIyMjIyMjIyMKKworCitpZiAoREJVU0RJUikKKwlzZXQoREJVU19JTlNUQUxMX0RJUiAiJHtEQlVTRElSfSIpCitlbmRpZiAoREJVU0RJUikKK2lmICgkRU5We0RCVVNESVJ9KQorCXNldChEQlVTX0lOU1RBTExfRElSICIkRU5We0RCVVNESVJ9IikKK2VuZGlmICgkRU5We0RCVVNESVJ9KQorCitpZiAoREJVU19JTlNUQUxMX0RJUikKKwlzZXQoQ01BS0VfSU5TVEFMTF9QUkVGSVggIiR7REJVU19JTlNUQUxMX0RJUn0iIENBQ0hFIFBBVEggImluc3RhbGwgcHJlZml4IiBGT1JDRSkKK2Vsc2UgKERCVVNfSU5TVEFMTF9ESVIpCisJc2V0KERCVVNfSU5TVEFMTF9ESVIgIiR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9IikKK2VuZGlmIChEQlVTX0lOU1RBTExfRElSKQorCisjIGF1dG90b29scyBzdHlsZQoraWYgKE5PVCBEQVRBUk9PVERJUikKKyAgICBzZXQgKERBVEFST09URElSIHNoYXJlKQorZW5kaWYoKQorCitpZiAoTk9UIERBVEFESVIpCisgICAgc2V0IChEQVRBRElSICR7REFUQVJPT1RESVJ9KQorZW5kaWYoKQorCitpZiAoTk9UIERPQ0RJUikKKyAgICBTRVQoRE9DRElSICR7REFUQVJPT1RESVJ9L2RvYy9kYnVzKQorZW5kaWYoKQorCitpZiAoTk9UIERCVVNfREFUQURJUikKKyAgICBTRVQoREJVU19EQVRBRElSICR7REFUQURJUn0pCitlbmRpZigpCisKK3NldChwcmVmaXggICAgICAgICAgICAgICAgICAgJHtEQlVTX0lOU1RBTExfRElSfSkKK3NldChleGVjX3ByZWZpeCAgICAgICAgICAgICAgJHtwcmVmaXh9KQorc2V0KEVYUEFOREVEX0xJQkRJUiAgICAgICAgICAke0RCVVNfSU5TVEFMTF9ESVJ9L2xpYikKK3NldChFWFBBTkRFRF9JTkNMVURFRElSICAgICAgJHtEQlVTX0lOU1RBTExfRElSfS9pbmNsdWRlKQorc2V0KEVYUEFOREVEX0JJTkRJUiAgICAgICAgICAke0RCVVNfSU5TVEFMTF9ESVJ9L2JpbikKK3NldChFWFBBTkRFRF9TWVNDT05GRElSICAgICAgJHtEQlVTX0lOU1RBTExfRElSfS9ldGMpCitzZXQoRVhQQU5ERURfREFUQURJUiAgICAgICAgICR7REJVU19JTlNUQUxMX0RJUn0vJHtEQlVTX0RBVEFESVJ9KQorc2V0KERCVVNfTUFDSElORV9VVUlEX0ZJTEUgICAke0RCVVNfSU5TVEFMTF9ESVJ9L2xpYi9kYnVzL21hY2hpbmUtaWQpCitzZXQoREJVU19CSU5ESVIgICAgICAgICAgICAgICR7RVhQQU5ERURfQklORElSfSkKK3NldChEQlVTX0RBRU1PTkRJUiAJCQkgJHtFWFBBTkRFRF9CSU5ESVJ9KQorCisKKyNlbmFibGUgYnVpbGRpbmcgb2Ygc2hhcmVkIGxpYnJhcnkKK1NFVChCVUlMRF9TSEFSRURfTElCUyBPTikKKworaWYgKENZR1dJTikKKyAgIHNldCAoV0lOMzIpCitlbmRpZiAoQ1lHV0lOKQorCisjIHNlYXJjaCBmb3IgcmVxdWlyZWQgcGFja2FnZXMKK2lmIChXSU4zMikKKyAgICAjIGluY2x1ZGUgbG9jYWwgaGVhZGVyIGZpcnN0IHRvIGF2b2lkIHVzaW5nIG9sZCBpbnN0YWxsZWQgaGVhZGVyCisgICAgc2V0IChDTUFLRV9JTkNMVURFX1BBVEggJHtDTUFLRV9JTkNMVURFX1BBVEh9ICR7Q01BS0VfU09VUkNFX0RJUn0vLi4pCisJZmluZF9wYWNrYWdlKExpYkljb252KQorICAgIGluY2x1ZGUoV2luMzJNYWNyb3MpCisgICAgYWRkRXhwbG9yZXJXcmFwcGVyKCR7Q01BS0VfUFJPSkVDVF9OQU1FfSkKK2VuZGlmIChXSU4zMikKKworb3B0aW9uIChEQlVTX1VTRV9FWFBBVCAiVXNlIGV4cGF0ICg9PSBPTikgb3IgbGlieG1sMiAoPT1PRkYpIiBPTikKKworaWYoTk9UIFdJTjMyKQorCW9wdGlvbiAoREJVU19FTkFCTEVfQUJTVFJBQ1RfU09DS0VUUyAiZW5hYmxlIHN1cHBvcnQgZm9yIGFic3RyYWN0IHNvY2tldHMiIE9OKQorCXNldCAoQ01BS0VfVEhSRUFEX1BSRUZFUl9QVEhSRUFEIE9OKQorCWluY2x1ZGUgKEZpbmRUaHJlYWRzKQorZW5kaWYoTk9UIFdJTjMyKQorCisjQUNfQVJHX0VOQUJMRShhc3NlcnRzLCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtYXNzZXJ0c10sW2luY2x1ZGUgYXNzZXJ0aW9uIGNoZWNrc10pLGVuYWJsZV9hc3NlcnRzPSRlbmFibGV2YWwsZW5hYmxlX2Fzc2VydHM9JFVTRV9NQUlOVEFJTkVSX01PREUpCitvcHRpb24gKERCVVNfRElTQUJMRV9BU1NFUlRTICJEaXNhYmxlIGFzc2VydGlvbiBjaGVja2luZyIgT0ZGKQorCitvcHRpb24gKERCVVNfRU5BQkxFX1NUQVRTICJlbmFibGUgYnVzIGRhZW1vbiB1c2FnZSBzdGF0aXN0aWNzIiBPRkYpCisKK29wdGlvbiAoREJVU19FTkFCTEVfU1RBVFMgImVuYWJsZSBidXMgZGFlbW9uIHVzYWdlIHN0YXRpc3RpY3MiIE9GRikKKworaWYgKERCVVNfVVNFX0VYUEFUKQorICAgIGZpbmRfcGFja2FnZShMaWJFeHBhdCkKK2Vsc2UgKCkKKyAgICBmaW5kX3BhY2thZ2UoTGliWG1sMikKK2VuZGlmICgpCitmaW5kX3BhY2thZ2UoWDExKQorCisjIGFuYWxvZ291cyB0byBBQ19VU0VfU1lTVEVNX0VYVEVOU0lPTlMgaW4gY29uZmlndXJlLmFjCithZGRfZGVmaW5pdGlvbnMoLURfUE9TSVhfQ19TT1VSQ0U9MTk5MzA5TCAtRF9HTlVfU09VUkNFKQorCisjIGRvIGNvbmZpZyBjaGVja3MKK0lOQ0xVREUoQ29uZmlndXJlQ2hlY2tzLmNtYWtlKQorCisjIEBUT0RPOiBob3cgdG8gcmVtb3ZlIGxhc3QgZGlyIGZyb20gJHtDTUFLRV9TT1VSQ0VfRElSfSA/CitTRVQoREJVU19TT1VSQ0VfRElSICR7Q01BS0VfU09VUkNFX0RJUn0vLi4pCisKKyMgbWFrZSBzb21lIG1vcmUgbWFjcm9zIGF2YWlsYWJsZQoraW5jbHVkZSAoTWFjcm9MaWJyYXJ5KQorCitpZihWQ1MpCisJc2V0KERCVVNfVkVSQk9TRV9DX1MgMSBDQUNIRSBTVFJJTkcgInZlcmJvc2UgbW9kZSIgRk9SQ0UpCitlbmRpZihWQ1MpCisKK2lmKFdJTjMyKQorCXNldChDTUFLRV9ERUJVR19QT1NURklYICJkIikKKwlpZihNU1ZDKQorCQkjIGNvbnRyb2xsIGZvbGRlcnMgaW4gbXN2YyBwcm9qZWN0cworCQlpbmNsdWRlKFByb2plY3RTb3VyY2VHcm91cCkKKwkJaWYoTk9UIEdST1VQX0NPREUpCisJCQkjc2V0KEdST1VQX0NPREUgc3BsaXQpICNjbWFrZSBkZWZhdWx0CisJCQlzZXQoR1JPVVBfQ09ERSBmbGF0KQorCQllbmRpZihOT1QgR1JPVVBfQ09ERSkKKwkJQUREX0RFRklOSVRJT05TKC1EX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIC1EX0NSVF9OT05TVERDX05PX0RFUFJFQ0FURSkKKworCisJCSMgVXNlIHRoZSBoaWdoZXN0IHdhcm5pbmcgbGV2ZWwKKwkJaWYgKFdBTEwpCisJCQlzZXQoV0FMTCAxIENBQ0hFIFNUUklORyAiYWxsIHdhcm5pbmdzIiAgRk9SQ0UpCisJCQlzZXQoQ01BS0VfQ1hYX1dBUk5JTkdfTEVWRUwgNCBDQUNIRSBTVFJJTkcgIndhcm5pbmcgbGV2ZWwiIEZPUkNFKQorCisJCQlpZihDTUFLRV9DWFhfRkxBR1MgTUFUQ0hFUyAiL1dbMC00XSIpCisJCQkJU1RSSU5HKFJFR0VYIFJFUExBQ0UgIi9XWzAtNF0iICIvVzQiIENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IikKKwkJCWVsc2UoQ01BS0VfQ1hYX0ZMQUdTIE1BVENIRVMgIi9XWzAtNF0iKQorCQkJCVNFVChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAvVzQiKQorCQkJZW5kaWYoQ01BS0VfQ1hYX0ZMQUdTIE1BVENIRVMgIi9XWzAtNF0iKQorCisJCQlpZihDTUFLRV9DX0ZMQUdTIE1BVENIRVMgIi9XWzAtNF0iKQorCQkJCVNUUklORyhSRUdFWCBSRVBMQUNFICIvV1swLTRdIiAiL1c0IiBDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0NfRkxBR1N9IikKKwkJCWVsc2UoQ01BS0VfQ19GTEFHUyBNQVRDSEVTICIvV1swLTRdIikKKwkJCQlTRVQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSAvVzQiKQorCQkJZW5kaWYoQ01BS0VfQ19GTEFHUyBNQVRDSEVTICIvV1swLTRdIikKKwkJZWxzZSAoV0FMTCkKKwkJCXNldChDTUFLRV9DWFhfV0FSTklOR19MRVZFTCAzIENBQ0hFIFNUUklORyAid2FybmluZyBsZXZlbCIgRk9SQ0UpCisJCWVuZGlmIChXQUxMKQorCisJCVNFVChNU1ZDX1dfRVJST1IgICAiIC93ZTQwMjggL3dlNDAxMyAvd2U0MTMzIC93ZTQwNDcgL3dlNDAzMSAvd2U0MDAyIC93ZTQwMDMgL3dlNDExNCIpCisJCVNFVChNU1ZDX1dfRElTQUJMRSAiIC93ZDQxMjcgL3dkNDA5MCAvd2Q0MTAxIC93ZDQyNDQiKQorCisJCVNFVChDTUFLRV9DX0ZMQUdTX0RFQlVHICAgIiR7Q01BS0VfQ19GTEFHU19ERUJVR30gICAvRkljb25maWcuaCAke01TVkNfV19FUlJPUn0gJHtNU1ZDX1dfRElTQUJMRX0iKQorCQlTRVQoQ01BS0VfQ19GTEFHU19SRUxFQVNFICIke0NNQUtFX0NfRkxBR1NfUkVMRUFTRX0gL0ZJY29uZmlnLmggJHtNU1ZDX1dfRVJST1J9ICR7TVNWQ19XX0RJU0FCTEV9IikKKwllbmRpZihNU1ZDKQorZW5kaWYoV0lOMzIpCisKK2lmIChVTklYIEFORCBOT1QgREJVU19ESVNBQkxFX0FTU0VSVFMpCisJIyByZXF1aXJlZCBmb3IgYmFja3RyYWNlCisJU0VUKENNQUtFX0NfRkxBR1NfREVCVUcgICAiJHtDTUFLRV9DX0ZMQUdTX0RFQlVHfSAgIC1XbCwtLWV4cG9ydC1keW5hbWljIikKKwlTRVQoQ01BS0VfQ19GTEFHU19SRUxFQVNFICIke0NNQUtFX0NfRkxBR1NfUkVMRUFTRX0gLVdsLC0tZXhwb3J0LWR5bmFtaWMiKQorCWFkZF9kZWZpbml0aW9ucygtRERCVVNfQlVJTFRfUl9EWU5BTUlDKQorZW5kaWYgKFVOSVggQU5EIE5PVCBEQlVTX0RJU0FCTEVfQVNTRVJUUykKKworU0VUKENNQUtFX0NfRkxBR1NfREVCVUcgIiR7Q01BS0VfQ19GTEFHU19ERUJVR30gIC1EX0RFQlVHIikKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBXaW5kb3dzIENFICg+PSA1LjAuMCkKKyMKKyMgV2luQ0Ugc3VwcG9ydCBub3cgcmVsaWVzIG9uIHRoZSBwcmVzZW5jZSBvZiBwbGF0Zm9ybSBmaWxlcywgZm91bmQgaW4gY21ha2UvbW9kdWxlcy9wbGF0Zm9ybQorIyBDbWFrZSAyLjguMCBkb2Vzbid0IGluY2x1ZGUgV2luQ0UgcGxhdGZvcm0gZmlsZXMgYnkgZGVmYXVsdCwgYnV0IHdvcmtpbmcgb25lcyBjYW4gYmUgZm91bmQKKyMgb24gQ01ha2UncyBidWd0cmFja2VyIDoKKyMgaHR0cDovL3B1YmxpYy5raXR3YXJlLmNvbS9CdWcvdmlldy5waHA/aWQ9NzkxOQorIworIyBmb3IgY21ha2UgMi44LjAgZ2V0IHRoZSBmb2xsb3dpbmcgcGF0Y2ggb25seSA6CisjIGh0dHA6Ly9wdWJsaWMua2l0d2FyZS5jb20vQnVnL2ZpbGVfZG93bmxvYWQucGhwP2ZpbGVfaWQ9Mjk0NCZ0eXBlPWJ1ZworIworIyBhZnRlciBhcHBseWluZyB0aGUgcGF0Y2gsIHlvdSBjYW4gZW5hYmxlIHRoZSBXaW5DRSBidWlsZCBieSBzcGVjaWZ5aW5nIDoKKyMgY21ha2UgWy4uLl0gLURDTUFLRV9TWVNURU1fTkFNRT1XaW5DRSAtRENNQUtFX1NZU1RFTV9WRVJTSU9OPVguWFgKKyMgKHdoZXJlIFguWFggaXMgeW91ciBhY3R1YWwgV2luQ0UgdmVyc2lvbiwgZS5nLiA1LjAyIGZvciBXaW5kb3dzIE1vYmlsZSA2KQorIworIyBOb3RlIHRoYXQgeW91IHNob3VsZCBoYXZlIGEgcHJvcGVyIGNyb3NzLWNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cCBwcmlvciB0byBydW5uaW5nCisjIGNtYWtlLCBpZS4gdGhlIFBBVEgsIElOQ0xVREUgYW5kIExJQiBlbnYgdmFycyBwb2ludGluZyB0byB5b3VyIENFIFNESy90b29sY2hhaW4uCisjCitpZihXSU5DRSkKKworTUVTU0FHRSgiQnVpbGRpbmcgZm9yIFdpbkNFICgke0NNQUtFX1NZU1RFTV9WRVJTSU9OfSkiKQorCitlbmRpZihXSU5DRSkKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCitFTkFCTEVfVEVTVElORygpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRGlzYWxsb3cgaW4tc291cmNlIGJ1aWxkCisjbWFjcm9fZW5zdXJlX291dF9vZl9zb3VyY2VfYnVpbGQoImRidXMgcmVxdWlyZXMgYW4gb3V0IG9mIHNvdXJjZSBidWlsZC4gUGxlYXNlIGNyZWF0ZSBhIHNlcGFyYXRlIGJ1aWxkIGRpcmVjdG9yeSBhbmQgcnVuICdjbWFrZSBwYXRoX3RvX2RidXMgW29wdGlvbnNdJyB0aGVyZS4iKQorCisjIC4uLiBhbmQgd2FybiBpbiBjYXNlIG9mIGFuIGVhcmxpZXIgaW4tc291cmNlIGJ1aWxkCisjc2V0KGdlbmVyYXRlZEZpbGVJblNvdXJjZURpciBFWElTVFMgJHtkYnVzX1NPVVJDRV9ESVJ9L2NvbmZpZy5oKQorI2lmKCR7Z2VuZXJhdGVkRmlsZUluU291cmNlRGlyfSkKKyMgICBtZXNzYWdlKFNUQVRVUyAiY29uZmlnLmggZXhpc3RzIGluIHlvdXIgc291cmNlIGRpcmVjdG9yeS4iKQorI2VuZGlmKCR7Z2VuZXJhdGVkRmlsZUluU291cmNlRGlyfSkKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaWYgKFdJTjMyIE9SIENZR1dJTikKKwlzZXQgKExJQlJBUllfT1VUUFVUX1BBVEggICR7Q01BS0VfQklOQVJZX0RJUn0vYmluKQorZWxzZSAoV0lOMzIgT1IgQ1lHV0lOKQorCXNldCAoTElCUkFSWV9PVVRQVVRfUEFUSCAgJHtDTUFLRV9CSU5BUllfRElSfS9saWIpCitlbmRpZiAoV0lOMzIgT1IgQ1lHV0lOKQorCitzZXQgKEVYRUNVVEFCTEVfT1VUUFVUX1BBVEggJHtDTUFLRV9CSU5BUllfRElSfS9iaW4pCisKKyMgZm9yIGluY2x1ZGluZyBjb25maWcuaCBhbmQgZm9yIGluY2x1ZGVzIGxpa2UgPGRpci9mb28uaD4KK2luY2x1ZGVfZGlyZWN0b3JpZXMoICR7Q01BS0VfU09VUkNFX0RJUn0vLi4gJHtDTUFLRV9CSU5BUllfRElSfSAke0NNQUtFX0lOQ0xVREVfUEFUSH0gKQorCisjIGxpbmtlciBzZWFyY2ggZGlyZWN0b3JpZXMKK2xpbmtfZGlyZWN0b3JpZXMoJHtEQlVTX0xJQl9ESVJ9ICR7TElCUkFSWV9PVVRQVVRfUEFUSH0gKQoraW5jbHVkZV9kaXJlY3RvcmllcyggJHtDTUFLRV9MSUJSQVJZX1BBVEh9ICApCisKK3NldChEQlVTX0lOQ0xVREVTKQorCitFTkFCTEVfVEVTVElORygpCisKKyMjIyMjIyMjIyMjIGNvbW1hbmQgbGluZSBvcHRpb25zICMjIyMjIyMjIyMjIyMjIworIyBUT0RPOiB0YWtlIGNoZWNrIGZyb20gY29uZmlndXJlLmluCisKKyNBQ19BUkdfRU5BQkxFKHRlc3RzLCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtdGVzdHNdLFtlbmFibGUgdW5pdCB0ZXN0IGNvZGVdKSxlbmFibGVfdGVzdHM9JGVuYWJsZXZhbCxlbmFibGVfdGVzdHM9JFVTRV9NQUlOVEFJTkVSX01PREUpCitvcHRpb24gKERCVVNfQlVJTERfVEVTVFMgImVuYWJsZSB1bml0IHRlc3QgY29kZSIgT04pCisgCitpZihEQlVTX0JVSUxEX1RFU1RTKQorICAgIGFkZF9kZWZpbml0aW9ucygtRERCVVNfQlVJTERfVEVTVFMgLUREQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUykKK2VuZGlmKERCVVNfQlVJTERfVEVTVFMpCisKK29wdGlvbiAoREJVU19VU0VfT1VUUFVUX0RFQlVHX1NUUklORyAiZW5hYmxlIHdpbjMyIGRlYnVnIHBvcnQgZm9yIG1lc3NhZ2Ugb3V0cHV0IiBPRkYpCitpZihEQlVTX1VTRV9PVVRQVVRfREVCVUdfU1RSSU5HKQorICAgIGFkZF9kZWZpbml0aW9ucygtRERCVVNfVVNFX09VVFBVVF9ERUJVR19TVFJJTkcpCitlbmRpZihEQlVTX1VTRV9PVVRQVVRfREVCVUdfU1RSSU5HKQorCitpZihXSU4zMikKKwkjIHdpbjMyIGRidXMgc2VydmljZSBzdXBwb3J0IC0gdGhpcyBzdXBwb3J0IGlzIG5vdCBjb21wbGV0ZQorCW9wdGlvbiAoREJVU19TRVJWSUNFICJlbmFibGUgZGJ1cyBzZXJ2aWNlIGluc3RhbGxlciIgT0ZGKQorZW5kaWYoV0lOMzIpCisKKyNBQ19BUkdfRU5BQkxFKGFuc2ksIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1hbnNpXSxbZW5hYmxlIC1hbnNpIC1wZWRhbnRpYyBnY2MgZmxhZ3NdKSxlbmFibGVfYW5zaT0kZW5hYmxldmFsLGVuYWJsZV9hbnNpPW5vKQorb3B0aW9uIChEQlVTX0VOQUJMRV9BTlNJICJlbmFibGUgLWFuc2kgLXBlZGFudGljIGdjYyBmbGFncyIgT0ZGKQoraWYoREJVU19FTkFCTEVfQU5TSSkKKyAgIGlmKE5PVCBNU1ZDKQorICAgICAgICBhZGRfZGVmaW5pdGlvbnMoLWFuc2kgLURfUE9TSVhfQ19TT1VSQ0U9MTk5MzA5TCAtRF9CU0RfU09VUkNFIC1wZWRhbnRpYykKKyAgIGVsc2UoTk9UIE1TVkMpCisgICAgICAgIGFkZF9kZWZpbml0aW9ucygtWmEgLURfUE9TSVhfQ19TT1VSQ0U9MTk5MzA5TCAtRF9CU0RfU09VUkNFIC1XNCkKKyAgIGVuZGlmKE5PVCBNU1ZDKQorZW5kaWYoREJVU19FTkFCTEVfQU5TSSkKKworI0FDX0FSR19FTkFCTEUodmVyYm9zZS1tb2RlLCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtdmVyYm9zZS1tb2RlXSxbc3VwcG9ydCB2ZXJib3NlIGRlYnVnIG1vZGVdKSxlbmFibGVfdmVyYm9zZV9tb2RlPSRlbmFibGV2YWwsZW5hYmxlX3ZlcmJvc2VfbW9kZT0kVVNFX01BSU5UQUlORVJfTU9ERSkKK29wdGlvbiAoREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFICJzdXBwb3J0IHZlcmJvc2UgZGVidWcgbW9kZSIgT04pCisKKyNBQ19BUkdfRU5BQkxFKGNoZWNrcywgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWNoZWNrc10sW2luY2x1ZGUgc2FuaXR5IGNoZWNrcyBvbiBwdWJsaWMgQVBJXSksZW5hYmxlX2NoZWNrcz0kZW5hYmxldmFsLGVuYWJsZV9jaGVja3M9eWVzKQorb3B0aW9uIChEQlVTX0RJU0FCTEVfQ0hFQ0tTICJEaXNhYmxlIHB1YmxpYyBBUEkgc2FuaXR5IGNoZWNraW5nIiBPRkYpCisKK2lmKE5PVCBNU1ZDKQorICAgICNBQ19BUkdfRU5BQkxFKGdjb3YsIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1nY292XSxbY29tcGlsZSB3aXRoIGNvdmVyYWdlIHByb2ZpbGluZyBpbnN0cnVtZW50YXRpb24gKGdjYyBvbmx5KV0pLGVuYWJsZV9nY292PSRlbmFibGV2YWwsZW5hYmxlX2djb3Y9bm8pCisgICAgb3B0aW9uIChEQlVTX0dDT1ZfRU5BQkxFRCAiY29tcGlsZSB3aXRoIGNvdmVyYWdlIHByb2ZpbGluZyBpbnN0cnVtZW50YXRpb24gKGdjYyBvbmx5KSIgT0ZGKQorICAgIGlmKERCVVNfR0NPVl9FTkFCTEVEKQorICAgICAgICAgICAgYWRkX2RlZmluaXRpb25zKC1mcHJvZmlsZS1hcmNzIC1mdGVzdC1jb3ZlcmFnZSkKKyAgICAgICAgICAgICMgRklYTUUhISEhCisgICAgICAgICAgICAjIyByZW1vdmUgb3B0aW1pemF0aW9uCisgICAgIyAgICAgICAgQ0ZMQUdTPWBlY2hvICIkQ0ZMQUdTIiB8IHNlZCAtZSAncy8tT1swLTldKi8vZydgCisgICAgZW5kaWYoREJVU19HQ09WX0VOQUJMRUQpCitlbmRpZihOT1QgTVNWQykKKworI0FDX0FSR19FTkFCTEUoYWJzdHJhY3Qtc29ja2V0cywgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWFic3RyYWN0LXNvY2tldHNdLFt1c2UgYWJzdHJhY3Qgc29ja2V0IG5hbWVzcGFjZSAobGludXggb25seSldKSxlbmFibGVfYWJzdHJhY3Rfc29ja2V0cz0kZW5hYmxldmFsLGVuYWJsZV9hYnN0cmFjdF9zb2NrZXRzPWF1dG8pCisjIC0+IG1vdmVkIGJlZm9yZSBpbmNsdWRlKENvbmZpZ3VyZUNoZWNrcy5jbWFrZSkKKworI0FDX0FSR19FTkFCTEUoc2VsaW51eCwgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXNlbGludXhdLFtidWlsZCB3aXRoIFNFTGludXggc3VwcG9ydF0pLGVuYWJsZV9zZWxpbnV4PSRlbmFibGV2YWwsZW5hYmxlX3NlbGludXg9YXV0bykKKyNzZWxpbnV4IG1pc3NpbmcKKworI0FDX0FSR19FTkFCTEUoZG5vdGlmeSwgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWRub3RpZnldLFtidWlsZCB3aXRoIGRub3RpZnkgc3VwcG9ydCAobGludXggb25seSldKSxlbmFibGVfZG5vdGlmeT0kZW5hYmxldmFsLGVuYWJsZV9kbm90aWZ5PWF1dG8pCitpZigiJHtDTUFLRV9TWVNURU1fTkFNRX0iIFNUUkVRVUFMICJMaW51eCIpCisgICAgb3B0aW9uIChEQlVTX0JVU19FTkFCTEVfRE5PVElGWV9PTl9MSU5VWCAiYnVpbGQgd2l0aCBkbm90aWZ5IHN1cHBvcnQgKGxpbnV4IG9ubHkpIiBPTikgIyBhZGQgYSBjaGVjayAhCitlbmRpZigiJHtDTUFLRV9TWVNURU1fTkFNRX0iIFNUUkVRVUFMICJMaW51eCIpCisKKyNBQ19BUkdfRU5BQkxFKGtxdWV1ZSwgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWtxdWV1ZV0sW2J1aWxkIHdpdGgga3F1ZXVlIHN1cHBvcnQgKEZyZWVCU0Qgb25seSldKSxlbmFibGVfa3F1ZXVlPSRlbmFibGV2YWwsZW5hYmxlX2txdWV1ZT1hdXRvKQorI21pc3NpbmcKKworI0FDX0FSR19FTkFCTEUoY29uc29sZS1vd25lci1maWxlLCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtY29uc29sZS1vd25lci1maWxlXSxbZW5hYmxlIGNvbnNvbGUgb3duZXIgZmlsZV0pLGVuYWJsZV9jb25zb2xlX293bmVyX2ZpbGU9JGVuYWJsZXZhbCxlbmFibGVfY29uc29sZV9vd25lcl9maWxlPWF1dG8pCitTVFJJTkcoVE9VUFBFUiAke0NNQUtFX1NZU1RFTV9OQU1FfSBzeXNuYW1lKQoraWYoIiR7c3lzbmFtZX0iIE1BVENIRVMgIi4qU09MQVJJUy4qIikKKyAgICBvcHRpb24gKEhBVkVfQ09OU09MRV9PV05FUl9GSUxFICJlbmFibGUgY29uc29sZSBvd25lciBmaWxlIChzb2xhcmlzIG9ubHkpIiBPTikKKyAgICBpZihIQVZFX0NPTlNPTEVfT1dORVJfRklMRSkKKyAgICAgICAgc2V0IChEQlVTX0NPTlNPTEVfT1dORVJfRklMRSAiL2Rldi9jb25zb2xlIiBDQUNIRSBTVFJJTkcgIkRpcmVjdG9yeSB0byBjaGVjayBmb3IgY29uc29sZSBvd25lcmhpcCIpCisgICAgZW5kaWYoSEFWRV9DT05TT0xFX09XTkVSX0ZJTEUpCitlbmRpZigiJHtzeXNuYW1lfSIgTUFUQ0hFUyAiLipTT0xBUklTLioiKQorCisjQUNfQVJHX1dJVEgoeG1sLCBBU19IRUxQX1NUUklORyhbLS13aXRoLXhtbD1bbGlieG1sL2V4cGF0XV0sW1hNTCBsaWJyYXJ5IHRvIHVzZV0pKQoraWYoTk9UIExJQlhNTDJfRk9VTkQgQU5EIE5PVCBMSUJFWFBBVF9GT1VORCkKKyAgICBtZXNzYWdlKEZBVEFMICJOZWl0aGVyIGV4cGF0IG5vciBsaWJ4bWwyIGZvdW5kISIpCitlbmRpZihOT1QgTElCWE1MMl9GT1VORCBBTkQgTk9UIExJQkVYUEFUX0ZPVU5EKQorCitpZihEQlVTX1VTRV9FWFBBVCkKKyAgICBTRVQoWE1MX0xJQiAiRXhwYXQiKQorICAgIFNFVChYTUxfTElCUkFSWSAgICAgJHtMSUJFWFBBVF9MSUJSQVJJRVN9KQorICAgIFNFVChYTUxfSU5DTFVERV9ESVIgJHtMSUJFWFBBVF9JTkNMVURFX0RJUn0pCitlbHNlKERCVVNfVVNFX0VYUEFUKQorICAgIFNFVChYTUxfTElCICJMaWJYTUwyIikKKyAgICBTRVQoWE1MX0xJQlJBUlkgICAgICR7TElCWE1MMl9MSUJSQVJJRVN9KQorICAgIFNFVChYTUxfSU5DTFVERV9ESVIgJHtMSUJYTUwyX0lOQ0xVREVfRElSfSkKK2VuZGlmKERCVVNfVVNFX0VYUEFUKQorCisKKyNBQ19BUkdfV0lUSChpbml0LXNjcmlwdHMsIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtaW5pdC1zY3JpcHRzPVtyZWRoYXRdXSxbU3R5bGUgb2YgaW5pdCBzY3JpcHRzIHRvIGluc3RhbGxdKSkKKyNBQ19BUkdfV0lUSChzZXNzaW9uLXNvY2tldC1kaXIsIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtc2Vzc2lvbi1zb2NrZXQtZGlyPVtkaXJuYW1lXV0sW1doZXJlIHRvIHB1dCBzb2NrZXRzIGZvciB0aGUgcGVyLWxvZ2luLXNlc3Npb24gbWVzc2FnZSBidXNdKSkKKyNBQ19BUkdfV0lUSCh0ZXN0LXNvY2tldC1kaXIsIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtdGVzdC1zb2NrZXQtZGlyPVtkaXJuYW1lXV0sW1doZXJlIHRvIHB1dCBzb2NrZXRzIGZvciBtYWtlIGNoZWNrXSkpCisjQUNfQVJHX1dJVEgoc3lzdGVtLXBpZC1maWxlLCBBU19IRUxQX1NUUklORyhbLS13aXRoLXN5c3RlbS1waWQtZmlsZT1bcGlkZmlsZV1dLFtQSUQgZmlsZSBmb3Igc3lzdGVtd2lkZSBkYWVtb25dKSkKKyNBQ19BUkdfV0lUSChzeXN0ZW0tc29ja2V0LCBBU19IRUxQX1NUUklORyhbLS13aXRoLXN5c3RlbS1zb2NrZXQ9W2ZpbGVuYW1lXV0sW1VOSVggZG9tYWluIHNvY2tldCBmb3Igc3lzdGVtd2lkZSBkYWVtb25dKSkKKyNBQ19BUkdfV0lUSChjb25zb2xlLWF1dGgtZGlyLCBBU19IRUxQX1NUUklORyhbLS13aXRoLWNvbnNvbGUtYXV0aC1kaXI9W2Rpcm5hbWVdXSxbZGlyZWN0b3J5IHRvIGNoZWNrIGZvciBjb25zb2xlIG93bmVyaGlwXSkpCisjQUNfQVJHX1dJVEgoY29uc29sZS1vd25lci1maWxlLCBBU19IRUxQX1NUUklORyhbLS13aXRoLWNvbnNvbGUtb3duZXItZmlsZT1bZmlsZW5hbWVdXSxbZmlsZSB3aG9zZSBvd25lciBkZXRlcm1pbmVzIGN1cnJlbnQgY29uc29sZSBvd25lcl0pKQorI0FDX0FSR19XSVRIKGRidXNfdXNlciwgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1kYnVzLXVzZXI9PHVzZXI+XSxbVXNlciBmb3IgcnVubmluZyB0aGUgREJVUyBkYWVtb24gKG1lc3NhZ2VidXMpXSkpCisjQUNfQVJHX1dJVEgoZGJ1c19kYWVtb25kaXIsIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtZGJ1cy1kYWVtb25kaXI9W2Rpcm5hbWVdXSxbRGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHRoZSBEQlVTIGRhZW1vbl0pKQorIyBhbGwgbWlzc2luZyBvciBoYXJkY29kZWQgZm9yIG5vdworCisjICdoaWRkZW4nIG9uZXMKK3NldChhdG9taWNfaW50IE9GRikKK3NldChhdG9taWNfaW50NDg2IE9GRikKK2lmKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNDIEFORCBOT1QgREJVU19FTkFCTEVfQU5TSSkKKyAgICBGSU5EX1BST0dSQU0oVU5BTUVfRVhFQ1VUQUJMRQorICAgICAgICAgICAgICAgICAgICBOQU1FUyB1bmFtZQorICAgICAgICAgICAgICAgICAgICBQQVRIUyAvYmluIC91c3IvYmluIC91c3IvbG9jYWwvYmluIGM6L1Byb2dyYW1tZS9NU3lzL2JpbiBkOi9Qcm9ncmFtbWUvTVN5cy9iaW4pCisKKyAgICBpZihVTkFNRV9FWEVDVVRBQkxFKQorICAgICAgICBFWEVDVVRFX1BST0NFU1MoQ09NTUFORCAke1VOQU1FX0VYRUNVVEFCTEV9ICItbSIKKyAgICAgICAgICAgICAgICAgICAgICAgIE9VVFBVVF9WQVJJQUJMRSBVTkFNRV9PVVRQVVQpCisKKyAgICAgICAgaWYoIlVOQU1FX09VVFBVVCIgTUFUQ0hFUyAiXi4qaVswMTIzXTg2LiokIikKKyAgICAgICAgICAgIHNldChhdG9taWNfaW50IE9OKQorICAgICAgICBlbHNlKCJVTkFNRV9PVVRQVVQiIE1BVENIRVMgIl4uKmlbMDEyM104Ni4qJCIpCisgICAgICAgICAgICBpZigiVU5BTUVfT1VUUFVUIiBNQVRDSEVTICJeLippPzg2LiokIikKKyAgICAgICAgICAgICAgICBzZXQoYXRvbWljX2ludCBPTikKKyAgICAgICAgICAgICAgICBzZXQoYXRvbWljX2ludF80ODYgT04pCisgICAgICAgICAgICBlbmRpZigiVU5BTUVfT1VUUFVUIiBNQVRDSEVTICJeLippPzg2LiokIikKKyAgICAgICAgZW5kaWYoIlVOQU1FX09VVFBVVCIgTUFUQ0hFUyAiXi4qaVswMTIzXTg2LiokIikKKyAgICBlbmRpZihVTkFNRV9FWEVDVVRBQkxFKQorZW5kaWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ0MgQU5EIE5PVCBEQlVTX0VOQUJMRV9BTlNJKQorCitzZXQgKERCVVNfSEFWRV9BVE9NSUNfSU5UICR7YXRvbWljX2ludH0gQ0FDSEUgU1RSSU5HICJTb21lIGF0b21pYyBpbnRlZ2VyIGltcGxlbWVudGF0aW9uIHByZXNlbnQiKQorc2V0IChEQlVTX1VTRV9BVE9NSUNfSU5UXzQ4NiAke2F0b21pY19pbnRfNDg2fSBDQUNIRSBTVFJJTkcgIlVzZSBhdG9taWMgaW50ZWdlciBpbXBsZW1lbnRhdGlvbiBmb3IgNDg2IikKKworaWYoWDExX0ZPVU5EKQorICBvcHRpb24gKERCVVNfQlVJTERfWDExICJCdWlsZCB3aXRoIFgxMSBhdXRvbGF1bmNoIHN1cHBvcnQgIiBPTikKK2VuZGlmKFgxMV9GT1VORCkKKworIyB0ZXN0IGJpbmFyeSBuYW1lcworaWYgKFdJTjMyKQorCSMgQXV0b21ha2UgY2FsbHMgdGhpcyBFWEVFWFQsIGFuZCBDTWFrZSBkb2Vzbid0IGhhdmUgYSBzdGFuZGFyZCBuYW1lCisJIyBmb3IgaXQ7IGZvbGxvdyBBdXRvbWFrZSdzIG5hbWluZyBjb252ZW50aW9uIHNvIHdlIGNhbiBzaGFyZSAuaW4gZmlsZXMKKwlzZXQgKEVYRUVYVCAiLmV4ZSIpCitlbmRpZihXSU4zMikKKworaWYgKE1TVkNfSURFKQorICAgIGlmKENNQUtFX0JVSUxEX1RZUEUgTUFUQ0hFUyBEZWJ1ZykKKwkJc2V0KElERV9CSU4gL0RlYnVnICkKKwkJbWVzc2FnZShTVEFUVVMpCisJCW1lc3NhZ2UoU1RBVFVTICJWaXN1YWwgU3R1ZGlvOiB0ZXN0IHByb2dyYW1zIHdpbGwgb25seSB3b3JrIHdpdGggJ0RlYnVnJyBjb25maWd1cmF0aW9uISIpCisJCW1lc3NhZ2UoU1RBVFVTICJUbyBydW4gdGVzdHMgd2l0aCAnUmVsZWFzZScgY29uZmlndXJhdGlvbiB1c2UgLURDTUFLRV9CVUlMRF9UWVBFPVJlbGVhc2UiKQorCQltZXNzYWdlKFNUQVRVUyAiQWRkICcuLlxcLi5cXHRlc3RcXGRhdGEnIHRvIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9uIG9mIHRoZSB0ZXN0IHByb2dyYW1zIikKKwkJbWVzc2FnZShTVEFUVVMpCisgICAgZWxzZShDTUFLRV9CVUlMRF9UWVBFIE1BVENIRVMgRGVidWcpCisJCXNldChJREVfQklOIC9SZWxlYXNlKQorCQltZXNzYWdlKFNUQVRVUykKKwkJbWVzc2FnZShTVEFUVVMgIlZpc3VhbCBTdHVkaW86IHRlc3QgcHJvZ3JhbXMgd2lsbCBvbmx5IHdvcmsgd2l0aCAnUmVsZWFzZScgY29uZmlndXJhdGlvbiEiKQorCQltZXNzYWdlKFNUQVRVUyAiVG8gcnVuIHRlc3RzIHdpdGggJ0RlYnVnJyBjb25maWd1cmF0aW9uIHVzZSAtRENNQUtFX0JVSUxEX1RZUEU9RGVidWciKQorCQltZXNzYWdlKFNUQVRVUyAiQWRkICcuLlxcLi5cXHRlc3RcXGRhdGEnIHRvIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9uIG9mIHRoZSB0ZXN0IHByb2dyYW1zIikKKwkJbWVzc2FnZShTVEFUVVMpCisgICAgZW5kaWYoQ01BS0VfQlVJTERfVFlQRSBNQVRDSEVTIERlYnVnKQorCXNldCAoVEVTVF9QQVRIX0ZPUkNFIEZPUkNFKQorCUZJTEUoUkVNT1ZFICR7Q01BS0VfQklOQVJZX0RJUn0vZGF0YS9kYnVzLTEvc2VydmljZXMpCitlbmRpZiAoTVNWQ19JREUpCisKKyMjIyMgRmluZCBzb2NrZXQgZGlyZWN0b3JpZXMKKyBpZiAoTk9UICRFTlZ7VE1QRElSfSBTVFJFUVVBTCAiIikKKyAgICAgc2V0IChEQlVTX1NFU1NJT05fU09DS0VUX0RJUiAkRU5We1RNUERJUn0pCisgZWxzZSAoTk9UICRFTlZ7VE1QRElSfSBTVFJFUVVBTCAiIikKKyAgICAgaWYgKE5PVCAkRU5We1RFTVB9IFNUUkVRVUFMICIiKQorICAgICAgICAgc2V0IChEQlVTX1NFU1NJT05fU09DS0VUX0RJUiAkRU5We1RFTVB9KQorICAgICBlbHNlIChOT1QgJEVOVntURU1QfSBTVFJFUVVBTCAiIikKKyAgICAgICAgIGlmIChOT1QgJEVOVntUTVB9IFNUUkVRVUFMICIiKQorICAgICAgICAgICAgIHNldCAoREJVU19TRVNTSU9OX1NPQ0tFVF9ESVIgJEVOVntUTVB9KQorICAgICAgICAgZWxzZSAoTk9UICRFTlZ7VE1QfSBTVFJFUVVBTCAiIikKKyAgICAgICAgIGlmIChXSU4zMikKKyAgICAgICAgICAgICAjU2hvdWxkIG5ldmVyIGhhcHBlbiwgYm90aCBUTVAgYW5kIFRFTVAgc2VlbSBhbHdheXMgc2V0IG9uIFdpbmRvd3MKKyAgICAgICAgICAgICBtZXNzYWdlKEZBVEFMICJDb3VsZCBub3QgZGV0ZXJtaW5lIGEgdXNhYmxlIHRlbXBvcmFyeSBkaXJlY3RvcnkiKQorICAgICAgICAgZWxzZShXSU4zMikKKyAgICAgICAgICAgIHNldCAoREJVU19TRVNTSU9OX1NPQ0tFVF9ESVIgL3RtcCkKKyAgICAgICAgIGVuZGlmKFdJTjMyKQorICAgICAgICAgZW5kaWYgKE5PVCAkRU5We1RNUH0gU1RSRVFVQUwgIiIpCisgICAgIGVuZGlmIChOT1QgJEVOVntURU1QfSBTVFJFUVVBTCAiIikKKyBlbmRpZiAoTk9UICRFTlZ7VE1QRElSfSBTVFJFUVVBTCAiIikKKworI0FDX0FSR19XSVRIKHRlc3Qtc29ja2V0LWRpciwgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC10ZXN0LXNvY2tldC1kaXI9W2Rpcm5hbWVdXSxbV2hlcmUgdG8gcHV0IHNvY2tldHMgZm9yIG1ha2UgY2hlY2tdKSkKKworI0FDX0FSR19XSVRIKHN5c3RlbS1waWQtZmlsZSwgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1zeXN0ZW0tcGlkLWZpbGU9W3BpZGZpbGVdXSxbUElEIGZpbGUgZm9yIHN5c3RlbXdpZGUgZGFlbW9uXSkpCisKKyNpZiAhIHRlc3QgLXogIiR3aXRoX3N5c3RlbV9waWRfZmlsZSI7IHRoZW4KKyMgICBEQlVTX1NZU1RFTV9QSURfRklMRT0kd2l0aF9zeXN0ZW1fcGlkX2ZpbGUKKyNlbGlmIHRlc3QgeCRvcGVyYXRpbmdfc3lzdGVtID0geHJlZGhhdCA7IHRoZW4KKyMgICBEQlVTX1NZU1RFTV9QSURfRklMRT0ke0VYUEFOREVEX0xPQ0FMU1RBVEVESVJ9L3J1bi9tZXNzYWdlYnVzLnBpZAorI2Vsc2UKKyMgICBEQlVTX1NZU1RFTV9QSURfRklMRT0ke0VYUEFOREVEX0xPQ0FMU1RBVEVESVJ9L3J1bi9kYnVzL3BpZAorI2ZpCisjIFRPRE86IGZpeCByZWRoZXQKK2lmIChXSU4zMikKKyAgIyBidXMtdGVzdCBleHBlY3RzIGEgbm9uIGVtcHR5IHN0cmluZworCXNldCAoREJVU19TWVNURU1fUElEX0ZJTEUgIi9kYnVzLXBpZCIpCitlbHNlIChXSU4zMikKKwlzZXQgKERCVVNfU1lTVEVNX1BJRF9GSUxFICR7RVhQQU5ERURfTE9DQUxTVEFURURJUn0vcnVuL2RidXMvcGlkKQorZW5kaWYgKFdJTjMyKQorCisjQUNfQVJHX1dJVEgoc3lzdGVtLXNvY2tldCwgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1zeXN0ZW0tc29ja2V0PVtmaWxlbmFtZV1dLFtVTklYIGRvbWFpbiBzb2NrZXQgZm9yIHN5c3RlbXdpZGUgZGFlbW9uXSkpCisKKyNBQ19BUkdfV0lUSChjb25zb2xlLWF1dGgtZGlyLCBBU19IRUxQX1NUUklORyhbLS13aXRoLWNvbnNvbGUtYXV0aC1kaXI9W2Rpcm5hbWVdXSxbZGlyZWN0b3J5IHRvIGNoZWNrIGZvciBjb25zb2xlIG93bmVyaGlwXSkpCisKK2lmIChXSU4zMikKKwlzZXQgKERCVVNfQ09OU09MRV9BVVRIX0RJUiAiIikKK2Vsc2UgKFdJTjMyKQorCXNldCAoREJVU19DT05TT0xFX0FVVEhfRElSICIvdmFyL3J1bi9jb25zb2xlLyIpCitlbmRpZiAoV0lOMzIpCisKKyNBQ19BUkdfV0lUSChkYnVzX3VzZXIsIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtZGJ1cy11c2VyPTx1c2VyPl0sW1VzZXIgZm9yIHJ1bm5pbmcgdGhlIERCVVMgZGFlbW9uIChtZXNzYWdlYnVzKV0pKQorCitzZXQgKERCVVNfVVNFUiApCisKKworaWYgKFdJTjMyKQorICBzZXQgKERCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1MgIm5vbmNlLXRjcDoiIENBQ0hFIFNUUklORyAic3lzdGVtIGJ1cyBkZWZhdWx0IGFkZHJlc3MiKQorICBzZXQgKERCVVNfU0VTU0lPTl9CVVNfREVGQVVMVF9BRERSRVNTICJub25jZS10Y3A6IiBDQUNIRSBTVFJJTkcgInNlc3Npb24gYnVzIGRlZmF1bHQgYWRkcmVzcyIpCisKKyAgc2V0IChEQlVTX1NZU1RFTV9DT05GSUdfRklMRSAiZXRjL2RidXMtMS9zeXN0ZW0uY29uZiIpCisgIHNldCAoREJVU19TRVNTSU9OX0NPTkZJR19GSUxFICJldGMvZGJ1cy0xL3Nlc3Npb24uY29uZiIpCisgICMgYnVzLXRlc3QgZXhwZWN0cyBhIG5vbiBlbXB0eSBzdHJpbmcKKyAgc2V0IChEQlVTX1VTRVIgIkFkbWluaXN0cmF0b3IiKQorZWxzZSAoV0lOMzIpCisgIHNldCAoREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTUyAidW5peDp0bXBkaXI9IiBDQUNIRSBTVFJJTkcgInN5c3RlbSBidXMgZGVmYXVsdCBhZGRyZXNzIikKKyAgc2V0IChEQlVTX1NFU1NJT05fQlVTX0RFRkFVTFRfQUREUkVTUyAidW5peDpwYXRoPSR7REJVU19TRVNTSU9OX1NPQ0tFVF9ESVJ9IiBDQUNIRSBTVFJJTkcgInNlc3Npb24gYnVzIGRlZmF1bHQgYWRkcmVzcyIpCisgIHNldCAoc3lzY29uZmRpciAiIikKKyAgc2V0IChjb25maWdkaXIgJHtzeXNjb25mZGlyfS9kYnVzLTEgKQorICBzZXQgKERCVVNfU1lTVEVNX0NPTkZJR19GSUxFICAke2NvbmZpZ2Rpcn0vc3lzdGVtLmNvbmYpCisgIHNldCAoREJVU19TRVNTSU9OX0NPTkZJR19GSUxFICR7Y29uZmlnZGlyfS9zZXNzaW9uLmNvbmYpCisgIHNldCAoREJVU19VU0VSICJyb290IikKK2VuZGlmIChXSU4zMikKKworc2V0IChEQlVTX0RBRU1PTl9OQU1FICJkYnVzLWRhZW1vbiIgQ0FDSEUgU1RSSU5HICJUaGUgbmFtZSBvZiB0aGUgZGJ1cyBkYWVtb24gZXhlY3V0YWJsZSIpCisKKyMjIyMjIyMjIyMjIGNyZWF0ZSBjb25maWcuaCAjIyMjIyMjIyMjIyMjIyMKKworI2luY2x1ZGUoQ29uZmlndXJlQ2hlY2tzLmNtYWtlKQorCisjIGJldHRlciB1c2UgZmxhZ3MgZm9yIGdjYworaWYgKE1JTkdXKQorCXNldCAoSEFWRV9HTlVDX1ZBUkFSR1MgMSkKK2VuZGlmKE1JTkdXKQorCisjIGNvbXBpbGVyIGRlZmluaXRpb25zCithZGRfZGVmaW5pdGlvbnMoLURIQVZFX0NPTkZJR19IPTEpCithZGRfZGVmaW5pdGlvbnMoJHtEQlVTX0JVU19DRkxBR1N9KQorCisKK2lmIChEQlVTX0JVSUxEX1RFU1RTKQorICAgICMgc2V0IHZhcmlhYmxlcyB1c2VkIGZvciB0aGUgLmluIGZpbGVzIChzdWJzdGl0dXRlZCBieSBjb25maWd1cmVfZmlsZSkgaW4gdGVzdC9kYXRhOgorICAgIHNldChEQlVTX1RFU1RfRVhFQyAke0VYRUNVVEFCTEVfT1VUUFVUX1BBVEh9JHtJREVfQklOfSkKKyAgICBzZXQoREJVU19URVNUX0RBVEEgJHtDTUFLRV9CSU5BUllfRElSfS90ZXN0L2RhdGEpCisgICAgc2V0KFRFU1RfU09DS0VUX0RJUiAke0RCVVNfU0VTU0lPTl9TT0NLRVRfRElSfSApCisgICAgc2V0KFRFU1RfTEFVTkNIX0hFTFBFUl9CSU5BUlkgJHtFWEVDVVRBQkxFX09VVFBVVF9QQVRIfS9kYnVzLWRhZW1vbi1sYXVuY2gtaGVscGVyLXRlc3QpCisgICAgaWYgKFVOSVgpCisgICAgICAgIHNldCAoVEVTVF9MSVNURU4gInVuaXg6dG1wZGlyPSR7VEVTVF9TT0NLRVRfRElSfSIpCisgICAgZW5kaWYgKFVOSVgpCisgICAgaWYgKFdJTjMyKQorICAgICAgICBzZXQgKFRFU1RfTElTVEVOICJ0Y3A6aG9zdD1sb2NhbGhvc3QiKQorICAgIGVuZGlmIChXSU4zMikKK2VuZGlmICAoREJVU19CVUlMRF9URVNUUykKKworc2V0KERCVVNfTElCUkFSSUVTIGRidXMtMSkKK3NldChEQlVTX0lOVEVSTkFMX0xJQlJBUklFUyBkYnVzLWludGVybmFsKQorCisjIHNldHRpbmdzIGZvciBidWlsZGluZyBhbmQgdXNpbmcgc3RhdGljIGludGVybmFsIGxpYgorIyBpbXBvcnRhbnQgbm90ZTogREJVU19JTlRFUk5BTF94eHh4eF9ERUZJTklUSU9OUyBtdXN0ICpub3QqIGJlIHNldCB3aGVuIGJ1aWxkaW5nIGRidXMtMSBsaWJyYXJ5CitzZXQgKERCVVNfSU5URVJOQUxfQUREX0xJQlJBUllfT1BUSU9OUyBTVEFUSUMpCitzZXQgKERCVVNfSU5URVJOQUxfTElCUkFSWV9ERUZJTklUSU9OUyAiLUREQlVTX1NUQVRJQ19CVUlMRCIpCitzZXQgKERCVVNfSU5URVJOQUxfQ0xJRU5UX0RFRklOSVRJT05TICItRERCVVNfU1RBVElDX0JVSUxEIikKKworY29uZmlndXJlX2ZpbGUoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbmZpZy5oLmNtYWtlICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9jb25maWcuaCApCisKK2lmIChXSU4zMikKK2NvbmZpZ3VyZV9maWxlKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9kYnVzLWVudi5iYXQuY21ha2UgJHtDTUFLRV9CSU5BUllfRElSfS9iaW4vZGJ1cy1lbnYuYmF0ICkKK2luc3RhbGxfZmlsZXMoL2JpbiBGSUxFUyAke0NNQUtFX0JJTkFSWV9ESVJ9L2Jpbi9kYnVzLWVudi5iYXQpCitlbmRpZigpCisKK2FkZF9kZWZpbml0aW9ucygtREhBVkVfQ09ORklHX0g9MSkKKworIyMjIyMjIyMjIyMgc3ViZGlycyAjIyMjIyMjIyMjIyMjIyMKKworYWRkX3N1YmRpcmVjdG9yeSggZGJ1cyApCithZGRfc3ViZGlyZWN0b3J5KCBidXMgKQoraWYgKERCVVNfQlVJTERfVEVTVFMpCisJYWRkX3N1YmRpcmVjdG9yeSggdGVzdCApCitlbmRpZiAoREJVU19CVUlMRF9URVNUUykKK2FkZF9zdWJkaXJlY3RvcnkoIHRvb2xzICkKK2FkZF9zdWJkaXJlY3RvcnkoIGRvYyApCisKKworT1BUSU9OKERCVVNfSU5TVEFMTF9TWVNURU1fTElCUyAiaW5zdGFsbCByZXF1aXJlZCBzeXN0ZW0gbGlicmFyaWVzIiBPRkYpCitNRVNTQUdFKCIgIikKK01FU1NBR0UoInNldCAtRERCVVNfSU5TVEFMTF9TWVNURU1fTElCUz0xIHRvIGluc3RhbGwgcnVudGltZSBsaWJyYXJpZXMgdG9vIikKK01FU1NBR0UoInNldCBEQlVTRElSIChlbnZpcm9ubWVudCBvciBjbWFrZSBvcHRpb24pIHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdCBpbnN0YWxsIGRpcmVjdG9yeSAiKQorTUVTU0FHRSgiICIpCitNRVNTQUdFKCIgIikKK0dFVF9GSUxFTkFNRV9DT01QT05FTlQoQ19DT01QSUxFUiAke0NNQUtFX0NfQ09NUElMRVJ9IE5BTUUpCitHRVRfRklMRU5BTUVfQ09NUE9ORU5UKENYWF9DT01QSUxFUiAke0NNQUtFX0NYWF9DT01QSUxFUn0gTkFNRSkKKworbWVzc2FnZSgiICAgICAgICAgICAgICAgICAgRC1CVVMgJHtEQlVTX1ZFUlNJT059ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgICAgICAgICAgICA9PT09PT09PT09PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBpbnN0YWxsIHByZWZpeDogICAgICAgICAgICR7cHJlZml4fSAgICAgICAgICAgICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIGluc3RhbGwgZXhlY19wcmVmaXg6ICAgICAgJHtleGVjX3ByZWZpeH0gICAgICAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgaW5zdGFsbCBsaWJkaXI6ICAgICAgICAgICAke0VYUEFOREVEX0xJQkRJUn0gICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBpbnN0YWxsIGJpbmRpcjogICAgICAgICAgICR7RVhQQU5ERURfQklORElSfSAgICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIGluc3RhbGwgc3lzY29uZmRpcjogICAgICAgJHtFWFBBTkRFRF9TWVNDT05GRElSfSAgICAgICAgICAgICAgIikKKyNtZXNzYWdlKCIgICAgICAgIGluc3RhbGwgbG9jYWxzdGF0ZWRpcjogICAgJHtFWFBBTkRFRF9MT0NBTFNUQVRFRElSfSAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgaW5zdGFsbCBkYXRhZGlyOiAgICAgICAgICAke0VYUEFOREVEX0RBVEFESVJ9ICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBzb3VyY2UgY29kZSBsb2NhdGlvbjogICAgICR7REJVU19TT1VSQ0VfRElSfSAgICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIGJ1aWxkIGRpcjogICAgICAgICAgICAgICAgJHtDTUFLRV9CSU5BUllfRElSfSAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgYyBjb21waWxlcjogICAgICAgICAgICAgICAke0NfQ09NUElMRVJ9ICAgICAgICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBjZmxhZ3M6ICAgICAgICAgICAgICAgICAgICR7Q01BS0VfQ19GTEFHU30gICAgICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIGNmbGFncyBkZWJ1ZzogICAgICAgICAgICAgJHtDTUFLRV9DX0ZMQUdTX0RFQlVHfSAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgY2ZsYWdzIHJlbGVhc2U6ICAgICAgICAgICAke0NNQUtFX0NfRkxBR1NfUkVMRUFTRX0gICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBjeHggY29tcGlsZXI6ICAgICAgICAgICAgICR7Q1hYX0NPTVBJTEVSfSAgICAgICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIGN4eGZsYWdzOiAgICAgICAgICAgICAgICAgJHtDTUFLRV9DWFhfRkxBR1N9ICAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgY3h4ZmxhZ3MgZGVidWc6ICAgICAgICAgICAke0NNQUtFX0NYWF9GTEFHU19ERUJVR30gICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBjeHhmbGFncyByZWxlYXNlOiAgICAgICAgICR7Q01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0V9ICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIDY0LWJpdCBpbnQ6ICAgICAgICAgICAgICAgJHtEQlVTX0lOVDY0X1RZUEV9ICAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgMzItYml0IGludDogICAgICAgICAgICAgICAke0RCVVNfSU5UMzJfVFlQRX0gICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICAxNi1iaXQgaW50OiAgICAgICAgICAgICAgICR7REJVU19JTlQxNl9UWVBFfSAgICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIERveHlnZW46ICAgICAgICAgICAgICAgICAgJHtET1hZR0VOfSAgICAgICAgICAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgRG9jYm9vayBHZW5lcmF0b3I6ICAgICAgICAke0RPQ0JPT0tfR0VORVJBVE9SX05BTUV9ICAgICAgICAgICAiKQorCisKKyNtZXNzYWdlKCIgICAgICAgIE1haW50YWluZXIgbW9kZTogICAgICAgICAgJHtVU0VfTUFJTlRBSU5FUl9NT0RFfSAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgZ2NjIGNvdmVyYWdlIHByb2ZpbGluZzogICAke0RCVVNfR0NPVl9FTkFCTEVEfSAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBCdWlsZGluZyB1bml0IHRlc3RzOiAgICAgICR7REJVU19CVUlMRF9URVNUU30gICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIEJ1aWxkaW5nIHZlcmJvc2UgbW9kZTogICAgJHtEQlVTX0VOQUJMRV9WRVJCT1NFX01PREV9ICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgQnVpbGRpbmcgdy9vIGFzc2VydGlvbnM6ICAke0RCVVNfRElTQUJMRV9BU1NFUlRTfSAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBCdWlsZGluZyB3L28gY2hlY2tzOiAgICAgICR7REJVU19ESVNBQkxFX0NIRUNLU30gICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIEJ1aWxkaW5nIGJ1cyBzdGF0cyBBUEk6ICAgJHtEQlVTX0VOQUJMRV9TVEFUU30gICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgaW5zdGFsbGluZyBzeXN0ZW0gbGliczogICAke0RCVVNfSU5TVEFMTF9TWVNURU1fTElCU30gICAgICAgICAiKQorI21lc3NhZ2UoIiAgICAgICAgQnVpbGRpbmcgU0VMaW51eCBzdXBwb3J0OiAke2hhdmVfc2VsaW51eH0gICAgICAgICAgICAgICAgICAgICAiKQorI21lc3NhZ2UoIiAgICAgICAgQnVpbGRpbmcgZG5vdGlmeSBzdXBwb3J0OiAke2hhdmVfZG5vdGlmeX0gICAgICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBCdWlsZGluZyBEb3h5Z2VuIGRvY3M6ICAgICR7REJVU19FTkFCTEVfRE9YWUdFTl9ET0NTfSAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIEJ1aWxkaW5nIFhNTCBkb2NzOiAgICAgICAgJHtEQlVTX0VOQUJMRV9YTUxfRE9DU30gICAgICAgICAgICAgIikKKyNtZXNzYWdlKCIgICAgICAgIEdldHRleHQgbGlicyAoZW1wdHkgT0spOiAgJHtJTlRMTElCU30gICAgICAgICAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgVXNpbmcgWE1MIHBhcnNlcjogICAgICAgICAke1hNTF9MSUJ9ICAgICAgICAgICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBEYWVtb24gZXhlY3V0YWJsZSBuYW1lOiAgICR7REJVU19EQUVNT05fTkFNRX0iKQoraWYgKFdJTjMyKQorbWVzc2FnZSgiICAgICAgICBTeXN0ZW0gYnVzIGFkZHJlc3M6ICAgICAgICR7REJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTU30gICIpCittZXNzYWdlKCIgICAgICAgIFNlc3Npb24gYnVzIGFkZHJlc3M6ICAgICAgJHtEQlVTX1NFU1NJT05fQlVTX0RFRkFVTFRfQUREUkVTU30gIikKK2Vsc2UgKFdJTjMyKQorI21lc3NhZ2UoIiAgICAgICAgSW5pdCBzY3JpcHRzIHN0eWxlOiAgICAgICAke3dpdGhfaW5pdF9zY3JpcHRzfSAgICAgICAgICAgICAgICAiKQorI21lc3NhZ2UoIiAgICAgICAgQWJzdHJhY3Qgc29ja2V0IG5hbWVzOiAgICAke2hhdmVfYWJzdHJhY3Rfc29ja2V0c30gICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBTeXN0ZW0gYnVzIHNvY2tldDogICAgICAgICR7REJVU19TWVNURU1fU09DS0VUfSAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIFN5c3RlbSBidXMgYWRkcmVzczogICAgICAgJHtEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTfSAgIikKK21lc3NhZ2UoIiAgICAgICAgU3lzdGVtIGJ1cyBQSUQgZmlsZTogICAgICAke0RCVVNfU1lTVEVNX1BJRF9GSUxFfSAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBTZXNzaW9uIGJ1cyBzb2NrZXQgZGlyOiAgICR7REJVU19TRVNTSU9OX1NPQ0tFVF9ESVJ9ICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIENvbnNvbGUgYXV0aCBkaXI6ICAgICAgICAgJHtEQlVTX0NPTlNPTEVfQVVUSF9ESVJ9ICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgU3lzdGVtIGJ1cyB1c2VyOiAgICAgICAgICAke0RCVVNfVVNFUn0gICAgICAgICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICAnbWFrZSBjaGVjaycgc29ja2V0IGRpcjogICR7VEVTVF9TT0NLRVRfRElSfSAgICAgICAgICAgICAgICAgICIpCitlbmRpZiAoV0lOMzIpCittZXNzYWdlKCIgICAgICAgIFRlc3QgbGlzdGVuIGFkZHJlc3M6ICAgICAgJHtURVNUX0xJU1RFTn0gICAgICAgICAgICAgICAgICAgICAgIikKK2lmIChNU1ZDKQorbWVzc2FnZSgiICAgICAgICBidWlsZCB0aW1lc3RhbXA6ICAgICAgICAgICR7REJVU19CVUlMRF9USU1FU1RBTVB9ICAgICAgICAgICAgICIpCitlbmRpZiAoTVNWQykKKworTUVTU0FHRSgiICIpCitpZiAoREJVU19CVUlMRF9URVNUUykKKyAgICBtZXNzYWdlKCJOT1RFOiBidWlsZGluZyB3aXRoIHVuaXQgdGVzdHMgaW5jcmVhc2VzIHRoZSBzaXplIG9mIHRoZSBpbnN0YWxsZWQgbGlicmFyeSBhbmQgcmVuZGVycyBpdCBpbnNlY3VyZS4iKQorZW5kaWYoREJVU19CVUlMRF9URVNUUykKKworaWYgKERCVVNfQlVJTERfVEVTVFMgQU5EIERCVVNfRElTQUJMRV9BU1NFUlRTKQorICAgIG1lc3NhZ2UoIk5PVEU6IGJ1aWxkaW5nIHdpdGggdW5pdCB0ZXN0cyBidXQgd2l0aG91dCBhc3NlcnRpb25zIG1lYW5zIHRlc3RzIG1heSBub3QgcHJvcGVybHkgcmVwb3J0IGZhaWx1cmVzICh0aGlzIGNvbmZpZ3VyYXRpb24gaXMgb25seSB1c2VmdWwgd2hlbiBkb2luZyBzb21ldGhpbmcgbGlrZSBwcm9maWxpbmcgdGhlIHRlc3RzKSIpCitlbmRpZihEQlVTX0JVSUxEX1RFU1RTIEFORCBEQlVTX0RJU0FCTEVfQVNTRVJUUykKKworaWYgKERCVVNfR0NPVl9FTkFCTEVEKQorICAgIG1lc3NhZ2UoIk5PVEU6IGJ1aWxkaW5nIHdpdGggY292ZXJhZ2UgcHJvZmlsaW5nIGlzIGRlZmluaXRlbHkgZm9yIGRldmVsb3BlcnMgb25seS4iKQorZW5kaWYoREJVU19HQ09WX0VOQUJMRUQpCisKK2lmIChEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUpCisgICAgbWVzc2FnZSgiTk9URTogYnVpbGRpbmcgd2l0aCB2ZXJib3NlIG1vZGUgaW5jcmVhc2VzIGxpYnJhcnkgc2l6ZSwgbWF5IHNsaWdodGx5IGluY3JlYXNlIHNlY3VyaXR5IHJpc2ssIGFuZCBkZWNyZWFzZXMgcGVyZm9ybWFuY2UuIikKK2VuZGlmKERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERSkKKworaWYoTk9UIERCVVNfRElTQUJMRV9BU1NFUlRTKQorICAgIG1lc3NhZ2UoIk5PVEU6IGJ1aWxkaW5nIHdpdGggYXNzZXJ0aW9ucyBpbmNyZWFzZXMgbGlicmFyeSBzaXplIGFuZCBkZWNyZWFzZXMgcGVyZm9ybWFuY2UuIikKK2VuZGlmKE5PVCBEQlVTX0RJU0FCTEVfQVNTRVJUUykKKworaWYgKERCVVNfRElTQUJMRV9DSEVDS1MpCisgICAgbWVzc2FnZSgiTk9URTogYnVpbGRpbmcgd2l0aG91dCBjaGVja3MgZm9yIGFyZ3VtZW50cyBwYXNzZWQgdG8gcHVibGljIEFQSSBtYWtlcyBpdCBoYXJkZXIgdG8gZGVidWcgYXBwcyB1c2luZyBELUJVUywgYnV0IHdpbGwgc2xpZ2h0bHkgZGVjcmVhc2UgRC1CVVMgbGlicmFyeSBzaXplIGFuZCBfdmVyeV8gc2xpZ2h0bHkgaW1wcm92ZSBwZXJmb3JtYW5jZS4iKQorZW5kaWYoREJVU19ESVNBQkxFX0NIRUNLUykKK01FU1NBR0UoIiAiKQorCitJTkNMVURFKG1vZHVsZXMvQ1BhY2tJbnN0YWxsQ29uZmlnLmNtYWtlKQorCithZGRfY3VzdG9tX3RhcmdldChoZWxwLW9wdGlvbnMKKyAgICBjbWFrZSAtTEggCisgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9CSU5BUllfRElSfQorKQpkaWZmIC0tZ2l0IGEvZGJ1cy9jbWFrZS9Db25maWd1cmVDaGVja3MuY21ha2UgYi9kYnVzL2NtYWtlL0NvbmZpZ3VyZUNoZWNrcy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2E5Y2VlCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9jbWFrZS9Db25maWd1cmVDaGVja3MuY21ha2UKQEAgLTAsMCArMSwxNjAgQEAKK2luY2x1ZGUoQ2hlY2tJbmNsdWRlRmlsZSkKK2luY2x1ZGUoQ2hlY2tTeW1ib2xFeGlzdHMpCitpbmNsdWRlKENoZWNrU3RydWN0TWVtYmVyKQoraW5jbHVkZShDaGVja1R5cGVTaXplKQorCitjaGVja19pbmNsdWRlX2ZpbGUoZGlyZW50LmggICAgIEhBVkVfRElSRU5UX0gpICAjIGRidXMtc3lzZGVwcy11dGlsLmMKK2NoZWNrX2luY2x1ZGVfZmlsZShpby5oICAgICAgICAgSEFWRV9JT19IKSAgICAgICMgaW50ZXJuYWwKK2NoZWNrX2luY2x1ZGVfZmlsZShncnAuaCAgICAgICAgSEFWRV9HUlBfSCkgICAgICMgZGJ1cy1zeXNkZXBzLXV0aWwtd2luLmMKK2NoZWNrX2luY2x1ZGVfZmlsZShzeXMvcG9sbC5oICAgSEFWRV9QT0xMKSAgICAgICMgZGJ1cy1zeXNkZXBzLmMsIGRidXMtc3lzZGVwcy13aW4uYworY2hlY2tfaW5jbHVkZV9maWxlKHN5cy90aW1lLmggICBIQVZFX1NZU19USU1FX0gpIyBkYnVzLXN5c2RlcHMtd2luLmMKK2NoZWNrX2luY2x1ZGVfZmlsZShzeXMvd2FpdC5oICAgSEFWRV9TWVNfV0FJVF9IKSMgZGJ1cy1zeXNkZXBzLXdpbi5jCitjaGVja19pbmNsdWRlX2ZpbGUodGltZS5oICAgICAgIEhBVkVfVElNRV9IKSAgICAjIGRidXMtc3lzZGVwcy13aW4uYworY2hlY2tfaW5jbHVkZV9maWxlKHdzMnRjcGlwLmggICBIQVZFX1dTMlRDUElQX0gpIyBkYnVzLXN5c2RlcHMtd2luLmMKK2NoZWNrX2luY2x1ZGVfZmlsZSh3c3BpYXBpLmggICAgSEFWRV9XU1BJQVBJX0gpICMgZGJ1cy1zeXNkZXBzLXdpbi5jCitjaGVja19pbmNsdWRlX2ZpbGUodW5pc3RkLmggICAgIEhBVkVfVU5JU1REX0gpICAjIGRidXMtc3lzZGVwcy11dGlsLXdpbi5jCitjaGVja19pbmNsdWRlX2ZpbGUoc3RkaW8uaCAgICAgIEhBVkVfU1RESU9fSCkgICAjIGRidXMtc3lzZGVwcy5oCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3N5c2xpbWl0cy5oICAgIEhBVkVfU1lTX1NZU0xJTUlUU19IKSAgICMgZGJ1cy1zeXNkZXBzLXVuaXguYworY2hlY2tfaW5jbHVkZV9maWxlKGVycm5vLmggICAgIEhBVkVfRVJSTk9fSCkgICAgIyBkYnVzLXN5c2RlcHMuYworY2hlY2tfaW5jbHVkZV9maWxlKHNpZ25hbC5oICAgICBIQVZFX1NJR05BTF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKGxvY2FsZS5oICAgICBIQVZFX0xPQ0FMRV9IKQorY2hlY2tfaW5jbHVkZV9maWxlKGludHR5cGVzLmggICAgIEhBVkVfSU5UVFlQRVNfSCkgICAjIGRidXMtcGlwZS5oCitjaGVja19pbmNsdWRlX2ZpbGUoc3RkaW50LmggICAgIEhBVkVfU1RESU5UX0gpICAgIyBkYnVzLXBpcGUuaAorCitjaGVja19zeW1ib2xfZXhpc3RzKGJhY2t0cmFjZSAgICAiZXhlY2luZm8uaCIgICAgICAgSEFWRV9CQUNLVFJBQ0UpICAgICAgICAgICMgIGRidXMtc3lzZGVwcy5jLCBkYnVzLXN5c2RlcHMtd2luLmMKK2NoZWNrX3N5bWJvbF9leGlzdHMoZ2V0Z3JvdXBsaXN0ICJncnAuaCIgICAgICAgICAgICBIQVZFX0dFVEdST1VQTElTVCkgICAgICAgIyAgZGJ1cy1zeXNkZXBzLmMKK2NoZWNrX3N5bWJvbF9leGlzdHMoZ2V0cGVlcnVjcmVkICJ1Y3JlZC5oIiAgICAgICAgICBIQVZFX0dFVFBFRVJVQ1JFRCkgICAgICAgIyAgZGJ1cy1zeXNkZXBzLmMsIGRidXMtc3lzZGVwcy13aW4uYworY2hlY2tfc3ltYm9sX2V4aXN0cyhuYW5vc2xlZXAgICAgInRpbWUuaCIgICAgICAgICAgIEhBVkVfTkFOT1NMRUVQKSAgICAgICAgICAjICBkYnVzLXN5c2RlcHMuYworY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRwd25hbV9yICAgImVycm5vLmggcHdkLmgiICAgIEhBVkVfUE9TSVhfR0VUUFdOQU1fUikgICAjICBkYnVzLXN5c2RlcHMtdXRpbC11bml4LmMKK2NoZWNrX3N5bWJvbF9leGlzdHMoc2V0ZW52ICAgICAgICJzdGRsaWIuaCIgICAgICAgICBIQVZFX1NFVEVOVikgICAgICAgICAgICAgIyAgZGJ1cy1zeXNkZXBzLmMKK2NoZWNrX3N5bWJvbF9leGlzdHModW5zZXRlbnYgICAgICJzdGRsaWIuaCIgICAgICAgICBIQVZFX1VOU0VURU5WKSAgICAgICAgICAgIyAgZGJ1cy1zeXNkZXBzLmMKK2NoZWNrX3N5bWJvbF9leGlzdHMoY2xlYXJlbnYgICAgICJzdGRsaWIuaCIgICAgICAgICBIQVZFX0NMRUFSRU5WKSAgICAgICAgICAgIyAgZGJ1cy1zeXNkZXBzLmMKK2NoZWNrX3N5bWJvbF9leGlzdHMod3JpdGV2ICAgICAgICJzeXMvdWlvLmgiICAgICAgICBIQVZFX1dSSVRFVikgICAgICAgICAgICAgIyAgZGJ1cy1zeXNkZXBzLmMsIGRidXMtc3lzZGVwcy13aW4uYworY2hlY2tfc3ltYm9sX2V4aXN0cyhzZXRybGltaXQgICAgInN5cy9yZXNvdXJjZS5oIiAgIEhBVkVfU0VUUkxJTUlUKSAgICAgICAgICAjICBkYnVzLXN5c2RlcHMuYywgZGJ1cy1zeXNkZXBzLXdpbi5jLCB0ZXN0L3Rlc3Qtc2VnZmF1bHQuYworY2hlY2tfc3ltYm9sX2V4aXN0cyhzb2NrZXRwYWlyICAgInN5cy9zb2NrZXQuaCIgICAgIEhBVkVfU09DS0VUUEFJUikgICAgICAgICAjICBkYnVzLXN5c2RlcHMuYworY2hlY2tfc3ltYm9sX2V4aXN0cyhzb2NrbGVuX3QgICAgInN5cy9zb2NrZXQuaCIgICAgIEhBVkVfU09DS0xFTl9UKSAgICAgICAgICAjICBkYnVzLXN5c2RlcHMtdW5peC5jCitjaGVja19zeW1ib2xfZXhpc3RzKHNldGxvY2FsZSAgICAibG9jYWxlLmgiICAgICAgICAgSEFWRV9TRVRMT0NBTEUpICAgICAgICAgICMgIGRidXMtdGVzdC1tYWluLmMKK2NoZWNrX3N5bWJvbF9leGlzdHMobG9jYWxlY29udiAgICJsb2NhbGUuaCIgICAgICAgICBIQVZFX0xPQ0FMRUNPTlYpICAgICAgICAgIyAgZGJ1cy1zeXNkZXBzLmMKK2NoZWNrX3N5bWJvbF9leGlzdHMoc3RydG9sbCAgICAgICJzdGRsaWIuaCIgICAgICAgICBIQVZFX1NUUlRPTEwpICAgICAgICAgICAgIyAgZGJ1cy1zZW5kLmMKK2NoZWNrX3N5bWJvbF9leGlzdHMoc3RydG91bGwgICAgICJzdGRsaWIuaCIgICAgICAgICBIQVZFX1NUUlRPVUxMKSAgICAgICAgICAgIyAgZGJ1cy1zZW5kLmMKKworY2hlY2tfc3RydWN0X21lbWJlcihjbXNnY3JlZCBjbWNyZWRfcGlkICJzeXMvdHlwZXMuaCBzeXMvc29ja2V0LmgiIEhBVkVfQ01TR0NSRUQpICAgIyAgZGJ1cy1zeXNkZXBzLmMKKworIyBtaXNzaW5nOgorIyBIQVZFX0FCU1RSQUNUX1NPQ0tFVFMKKyMgREJVU19IQVZFX0dDQzMzX0dDT1YKKworY2hlY2tfdHlwZV9zaXplKCJzaG9ydCIgICAgIFNJWkVPRl9TSE9SVCkKK2NoZWNrX3R5cGVfc2l6ZSgiaW50IiAgICAgICBTSVpFT0ZfSU5UKQorY2hlY2tfdHlwZV9zaXplKCJsb25nIiAgICAgIFNJWkVPRl9MT05HKQorY2hlY2tfdHlwZV9zaXplKCJsb25nIGxvbmciIFNJWkVPRl9MT05HX0xPTkcpCitjaGVja190eXBlX3NpemUoIl9faW50NjQiICAgU0laRU9GX19fSU5UNjQpCisKKyMgREJVU19JTlQ2NF9UWVBFCitpZihTSVpFT0ZfSU5UIEVRVUFMIDgpCisgICAgc2V0IChEQlVTX0hBVkVfSU5UNjQgMSkKKyAgICBzZXQgKERCVVNfSU5UNjRfVFlQRSAiaW50IikKKyAgICBzZXQgKERCVVNfSU5UNjRfQ09OU1RBTlQgICIodmFsKSIpCisgICAgc2V0IChEQlVTX1VJTlQ2NF9DT05TVEFOVCAiKHZhbCMjVSkiKQorZWxzZWlmKFNJWkVPRl9MT05HIEVRVUFMIDgpCisgICAgc2V0IChEQlVTX0hBVkVfSU5UNjQgMSkKKyAgICBzZXQgKERCVVNfSU5UNjRfVFlQRSAibG9uZyIpCisgICAgc2V0IChEQlVTX0lOVDY0X0NPTlNUQU5UICAiKHZhbCMjTCkiKQorICAgIHNldCAoREJVU19VSU5UNjRfQ09OU1RBTlQgIih2YWwjI1VMKSIpCitlbHNlaWYoU0laRU9GX0xPTkdfTE9ORyBFUVVBTCA4KQorICAgIHNldCAoREJVU19IQVZFX0lOVDY0IDEpCisgICAgc2V0IChEQlVTX0lOVDY0X1RZUEUgImxvbmcgbG9uZyIpCisgICAgc2V0IChEQlVTX0lOVDY0X0NPTlNUQU5UICAiKHZhbCMjTEwpIikKKyAgICBzZXQgKERCVVNfVUlOVDY0X0NPTlNUQU5UICIodmFsIyNVTEwpIikKK2Vsc2VpZihTSVpFT0ZfX19JTlQ2NCBFUVVBTCA4KQorICAgIHNldCAoREJVU19IQVZFX0lOVDY0IDEpCisgICAgc2V0IChEQlVTX0lOVDY0X1RZUEUgIl9faW50NjQiKQorICAgIHNldCAoREJVU19JTlQ2NF9DT05TVEFOVCAgIih2YWwjI2k2NCkiKQorICAgIHNldCAoREJVU19VSU5UNjRfQ09OU1RBTlQgIih2YWwjI3VpNjQpIikKK2VuZGlmKFNJWkVPRl9JTlQgRVFVQUwgOCkKKworIyBEQlVTX0lOVDMyX1RZUEUKK2lmKFNJWkVPRl9JTlQgRVFVQUwgNCkKKyAgICBzZXQgKERCVVNfSU5UMzJfVFlQRSAiaW50IikKK2Vsc2VpZihTSVpFT0ZfTE9ORyBFUVVBTCA0KQorICAgIHNldCAoREJVU19JTlQzMl9UWVBFICJsb25nIikKK2Vsc2VpZihTSVpFT0ZfTE9OR19MT05HIEVRVUFMIDQpCisgICAgc2V0IChEQlVTX0lOVDMyX1RZUEUgImxvbmcgbG9uZyIpCitlbmRpZihTSVpFT0ZfSU5UIEVRVUFMIDQpCisKKyMgREJVU19JTlQxNl9UWVBFCitpZihTSVpFT0ZfSU5UIEVRVUFMIDIpCisgICAgc2V0IChEQlVTX0lOVDE2X1RZUEUgImludCIpCitlbHNlaWYoU0laRU9GX1NIT1JUIEVRVUFMIDIpCisgICAgc2V0IChEQlVTX0lOVDE2X1RZUEUgInNob3J0IikKK2VuZGlmKFNJWkVPRl9JTlQgRVFVQUwgMikKKworZmluZF9wcm9ncmFtKERPWFlHRU4gZG94eWdlbikKK2ZpbmRfcHJvZ3JhbShYTUxUTyB4bWx0bykKKworaWYoTVNWQykKKyAgIFNFVChEQlVTX1ZBX0NPUFlfRlVOQyAiX0RCVVNfVkFfQ09QWV9BU1NJR04iOykKK2Vsc2UoTVNWQykKK3dyaXRlX2ZpbGUoIiR7Q01BS0VfQklOQVJZX0RJUn0ke0NNQUtFX0ZJTEVTX0RJUkVDVE9SWX0vQ01ha2VUbXAvY21ha2VfdHJ5X2NvbXBpbGUuYyIgIiNpbmNsdWRlIDxzdGRhcmcuaD4KKwkjaW5jbHVkZSA8c3RkbGliLmg+CisgICAgICAgIHN0YXRpYyB2b2lkIGYgKGludCBpLCAuLi4pIHsKKwl2YV9saXN0IGFyZ3MxLCBhcmdzMjsKKwl2YV9zdGFydCAoYXJnczEsIGkpOworCXZhX2NvcHkgKGFyZ3MyLCBhcmdzMSk7CisJaWYgKHZhX2FyZyAoYXJnczIsIGludCkgIT0gNDIgfHwgdmFfYXJnIChhcmdzMSwgaW50KSAhPSA0MikKKwkgIGV4aXQgKDEpOworCXZhX2VuZCAoYXJnczEpOyB2YV9lbmQgKGFyZ3MyKTsKKwl9CisJaW50IG1haW4oKSB7CisJICBmICgwLCA0Mik7CisJICByZXR1cm4gMDsKKwl9CisiKQordHJ5X2NvbXBpbGUoREJVU19IQVZFX1ZBX0NPUFkKKyAgICAgICAgICAgICR7Q01BS0VfQklOQVJZX0RJUn0KKyAgICAgICAgICAgICR7Q01BS0VfQklOQVJZX0RJUn0ke0NNQUtFX0ZJTEVTX0RJUkVDVE9SWX0vQ01ha2VUbXAvY21ha2VfdHJ5X2NvbXBpbGUuYykKKworaWYoREJVU19IQVZFX1ZBX0NPUFkpCisgIFNFVChEQlVTX1ZBX0NPUFlfRlVOQyB2YV9jb3B5IENBQ0hFIFNUUklORyAidmFfY29weSBmdW5jdGlvbiIpCitlbHNlKERCVVNfSEFWRV9WQV9DT1BZKQorICB3cml0ZV9maWxlKCIke0NNQUtFX0JJTkFSWV9ESVJ9JHtDTUFLRV9GSUxFU19ESVJFQ1RPUll9L0NNYWtlVG1wL2NtYWtlX3RyeV9jb21waWxlLmMiICIjaW5jbHVkZSA8c3RkYXJnLmg+CisgICAgICAgICAgI2luY2x1ZGUgPHN0ZGxpYi5oPgorCSAgc3RhdGljIHZvaWQgZiAoaW50IGksIC4uLikgeworCSAgdmFfbGlzdCBhcmdzMSwgYXJnczI7CisJICB2YV9zdGFydCAoYXJnczEsIGkpOworCSAgX192YV9jb3B5IChhcmdzMiwgYXJnczEpOworCSAgaWYgKHZhX2FyZyAoYXJnczIsIGludCkgIT0gNDIgfHwgdmFfYXJnIChhcmdzMSwgaW50KSAhPSA0MikKKwkgICAgZXhpdCAoMSk7CisJICB2YV9lbmQgKGFyZ3MxKTsgdmFfZW5kIChhcmdzMik7CisJICB9CisJICBpbnQgbWFpbigpIHsKKwkgICAgZiAoMCwgNDIpOworCSAgICByZXR1cm4gMDsKKwkgIH0KKyAgIikKKyAgdHJ5X2NvbXBpbGUoREJVU19IQVZFX19fVkFfQ09QWQorICAgICAgICAgICAgICAke0NNQUtFX0JJTkFSWV9ESVJ9CisgICAgICAgICAgICAgICR7Q01BS0VfQklOQVJZX0RJUn0ke0NNQUtFX0ZJTEVTX0RJUkVDVE9SWX0vQ01ha2VUbXAvY21ha2VfdHJ5X2NvbXBpbGUuYykKKyAgaWYoREJVU19IQVZFX19fVkFfQ09QWSkKKyAgICBTRVQoREJVU19WQV9DT1BZX0ZVTkMgX192YV9jb3B5IENBQ0hFIFNUUklORyAidmFfY29weSBmdW5jdGlvbiIpCisgIGVsc2UoREJVU19IQVZFX19fVkFfQ09QWSkKKyAgICBTRVQoREJVU19WQV9DT1BZX0FTX0FSUkFZICIxIiBDQUNIRSBTVFJJTkcgIid2YV9saXN0cycgY2Fubm90IGJlIGNvcGllcyBhcyB2YWx1ZXMiKQorICBlbmRpZihEQlVTX0hBVkVfX19WQV9DT1BZKQorZW5kaWYoREJVU19IQVZFX1ZBX0NPUFkpCitlbmRpZihNU1ZDKSAjIF9ub3RfIE1TVkMKKyMjIyMgQWJzdHJhY3Qgc29ja2V0cworCitpZiAoREJVU19FTkFCTEVfQUJTVFJBQ1RfU09DS0VUUykKKworICB0cnlfY29tcGlsZShIQVZFX0FCU1RSQUNUX1NPQ0tFVFMKKyAgICAgICAgICAgICAgJHtDTUFLRV9CSU5BUllfRElSfQorICAgICAgICAgICAgICAke0NNQUtFX1NPVVJDRV9ESVJ9L21vZHVsZXMvQ2hlY2tGb3JBYnN0cmFjdFNvY2tldHMuYykKKworZW5kaWYoREJVU19FTkFCTEVfQUJTVFJBQ1RfU09DS0VUUykKKworaWYoSEFWRV9BQlNUUkFDVF9TT0NLRVRTKQorICBzZXQoREJVU19QQVRIX09SX0FCU1RSQUNUX1ZBTFVFIGFic3RyYWN0KQorZWxzZShIQVZFX0FCU1RSQUNUX1NPQ0tFVFMpCisgIHNldChEQlVTX1BBVEhfT1JfQUJTVFJBQ1RfVkFMVUUgcGF0aCkKK2VuZGlmKEhBVkVfQUJTVFJBQ1RfU09DS0VUUykKKwpkaWZmIC0tZ2l0IGEvZGJ1cy9jbWFrZS9Eb3h5ZmlsZS5jbWFrZSBiL2RidXMvY21ha2UvRG94eWZpbGUuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAwOTg0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvY21ha2UvRG94eWZpbGUuY21ha2UKQEAgLTAsMCArMSwxODIgQEAKKyMgRG94eWZpbGUgMC4xCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgR2VuZXJhbCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BST0pFQ1RfTkFNRSAgICAgICAgICAgPSBELUJ1cworUFJPSkVDVF9OVU1CRVIgICAgICAgICA9IEBWRVJTSU9OQAorT1VUUFVUX0RJUkVDVE9SWSAgICAgICA9IGFwaQorT1VUUFVUX0xBTkdVQUdFICAgICAgICA9IEVuZ2xpc2gKK0VYVFJBQ1RfQUxMICAgICAgICAgICAgPSBOTworRVhUUkFDVF9QUklWQVRFICAgICAgICA9IE5PCitFWFRSQUNUX1NUQVRJQyAgICAgICAgID0gTk8KK0hJREVfVU5ET0NfTUVNQkVSUyAgICAgPSBOTworSElERV9VTkRPQ19DTEFTU0VTICAgICA9IE5PCitCUklFRl9NRU1CRVJfREVTQyAgICAgID0gWUVTCitSRVBFQVRfQlJJRUYgICAgICAgICAgID0gWUVTCitBTFdBWVNfREVUQUlMRURfU0VDICAgID0gTk8KK0ZVTExfUEFUSF9OQU1FUyAgICAgICAgPSBOTworU1RSSVBfRlJPTV9QQVRIICAgICAgICA9IAorSU5URVJOQUxfRE9DUyAgICAgICAgICA9IE5PCitTVFJJUF9DT0RFX0NPTU1FTlRTICAgID0gWUVTCitDQVNFX1NFTlNFX05BTUVTICAgICAgID0gWUVTCitTSE9SVF9OQU1FUyAgICAgICAgICAgID0gTk8KK0hJREVfU0NPUEVfTkFNRVMgICAgICAgPSBOTworVkVSQkFUSU1fSEVBREVSUyAgICAgICA9IFlFUworU0hPV19JTkNMVURFX0ZJTEVTICAgICA9IFlFUworSkFWQURPQ19BVVRPQlJJRUYgICAgICA9IFlFUworSU5IRVJJVF9ET0NTICAgICAgICAgICA9IFlFUworSU5MSU5FX0lORk8gICAgICAgICAgICA9IFlFUworU09SVF9NRU1CRVJfRE9DUyAgICAgICA9IFlFUworRElTVFJJQlVURV9HUk9VUF9ET0MgICA9IE5PCitUQUJfU0laRSAgICAgICAgICAgICAgID0gOAorR0VORVJBVEVfVE9ET0xJU1QgICAgICA9IFlFUworR0VORVJBVEVfVEVTVExJU1QgICAgICA9IFlFUworR0VORVJBVEVfQlVHTElTVCAgICAgICA9IFlFUworQUxJQVNFUyAgICAgICAgICAgICAgICA9IAorRU5BQkxFRF9TRUNUSU9OUyAgICAgICA9IAorTUFYX0lOSVRJQUxJWkVSX0xJTkVTICA9IDMwCitPUFRJTUlaRV9PVVRQVVRfRk9SX0MgID0gWUVTCitTSE9XX1VTRURfRklMRVMgICAgICAgID0gWUVTCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHdhcm5pbmcgYW5kIHByb2dyZXNzIG1lc3NhZ2VzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitRVUlFVCAgICAgICAgICAgICAgICAgID0gWUVTCitXQVJOSU5HUyAgICAgICAgICAgICAgID0gWUVTCitXQVJOX0lGX1VORE9DVU1FTlRFRCAgID0gWUVTCitXQVJOX0ZPUk1BVCAgICAgICAgICAgID0gCitXQVJOX0xPR0ZJTEUgICAgICAgICAgID0gCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBpbnB1dCBmaWxlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSU5QVVQgICAgICAgICAgICAgICAgICA9IEB0b3Bfc3JjZGlyQC9kYnVzCitGSUxFX1BBVFRFUk5TICAgICAgICAgID0gKi5jICouaAorUkVDVVJTSVZFICAgICAgICAgICAgICA9IFlFUworI0VYQ0xVREUgICAgICAgICAgICAgICAgPSB0ZXN0CisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZSAKKyMgRVhDTFVERV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJucyB0byBleGNsdWRlIAorIyBjZXJ0YWluIGZpbGVzIGZyb20gdGhvc2UgZGlyZWN0b3JpZXMuCisKK0VYQ0xVREVfUEFUVEVSTlMgICAgICAgPSBNYWtlZmlsZS4qIENoYW5nZUxvZyBDSEFOR0VTIENIQU5HRVMuKiBSRUFETUUgXAorICAgICAgICAgICAgICAgICAgICAgICAgIFJFQURNRS4qICoucG5nIEFVVEhPUlMgREVTSUdOIERFU0lHTi4qICouZGVza3RvcCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgREVTS1RPUCogQ09NTUVOVFMgSE9XVE8gbWFnaWMgTk9URVMgVE9ETyBUSEFOS1MKKworIyBUaGUgRVhBTVBMRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yIAorIyBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4gZXhhbXBsZSBjb2RlIGZyYWdtZW50cyB0aGF0IGFyZSBpbmNsdWRlZCAoc2VlIAorIyB0aGUgXGluY2x1ZGUgY29tbWFuZCkuCisKK0VYQU1QTEVfUEFUSCAgICAgICAgICAgPSAKK0VYQU1QTEVfUEFUVEVSTlMgICAgICAgPSAKK0VYQU1QTEVfUkVDVVJTSVZFICAgICAgPSBOTworSU1BR0VfUEFUSCAgICAgICAgICAgICA9IAorSU5QVVRfRklMVEVSICAgICAgICAgICA9IAorRklMVEVSX1NPVVJDRV9GSUxFUyAgICA9IE5PCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHNvdXJjZSBicm93c2luZworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU09VUkNFX0JST1dTRVIgICAgICAgICA9IFlFUworSU5MSU5FX1NPVVJDRVMgICAgICAgICA9IE5PCitSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OID0gWUVTCitSRUZFUkVOQ0VTX1JFTEFUSU9OICAgID0gWUVTCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBhbHBoYWJldGljYWwgY2xhc3MgaW5kZXgKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FMUEhBQkVUSUNBTF9JTkRFWCAgICAgPSBOTworQ09MU19JTl9BTFBIQV9JTkRFWCAgICA9IDUKK0lHTk9SRV9QUkVGSVggICAgICAgICAgPSAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIEhUTUwgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHRU5FUkFURV9IVE1MICAgICAgICAgID0gWUVTCitIVE1MX09VVFBVVCAgICAgICAgICAgID0gCitIVE1MX0hFQURFUiAgICAgICAgICAgID0gCitIVE1MX0ZPT1RFUiAgICAgICAgICAgID0gCitIVE1MX1NUWUxFU0hFRVQgICAgICAgID0gCitIVE1MX0FMSUdOX01FTUJFUlMgICAgID0gWUVTCitHRU5FUkFURV9IVE1MSEVMUCAgICAgID0gTk8KK0dFTkVSQVRFX0NISSAgICAgICAgICAgPSBOTworQklOQVJZX1RPQyAgICAgICAgICAgICA9IE5PCitUT0NfRVhQQU5EICAgICAgICAgICAgID0gTk8KK0RJU0FCTEVfSU5ERVggICAgICAgICAgPSBOTworRU5VTV9WQUxVRVNfUEVSX0xJTkUgICA9IDQKK0dFTkVSQVRFX1RSRUVWSUVXICAgICAgPSBOTworVFJFRVZJRVdfV0lEVEggICAgICAgICA9IDI1MAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgTGFUZVggb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHRU5FUkFURV9MQVRFWCAgICAgICAgID0gTk8KK0xBVEVYX09VVFBVVCAgICAgICAgICAgPSAKK0NPTVBBQ1RfTEFURVggICAgICAgICAgPSBOTworUEFQRVJfVFlQRSAgICAgICAgICAgICA9IGE0d2lkZQorRVhUUkFfUEFDS0FHRVMgICAgICAgICA9IAorTEFURVhfSEVBREVSICAgICAgICAgICA9IAorUERGX0hZUEVSTElOS1MgICAgICAgICA9IE5PCitVU0VfUERGTEFURVggICAgICAgICAgID0gTk8KK0xBVEVYX0JBVENITU9ERSAgICAgICAgPSBOTworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUlRGIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR0VORVJBVEVfUlRGICAgICAgICAgICA9IE5PCitSVEZfT1VUUFVUICAgICAgICAgICAgID0gCitDT01QQUNUX1JURiAgICAgICAgICAgID0gTk8KK1JURl9IWVBFUkxJTktTICAgICAgICAgPSBOTworUlRGX1NUWUxFU0hFRVRfRklMRSAgICA9IAorUlRGX0VYVEVOU0lPTlNfRklMRSAgICA9IAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgbWFuIHBhZ2Ugb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHRU5FUkFURV9NQU4gICAgICAgICAgID0gWUVTCitNQU5fT1VUUFVUICAgICAgICAgICAgID0gbWFuCitNQU5fRVhURU5TSU9OICAgICAgICAgID0gLjNkYnVzCitNQU5fTElOS1MgICAgICAgICAgICAgID0gWUVTCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBYTUwgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHRU5FUkFURV9YTUwgICAgICAgICAgID0gTk8KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIHByZXByb2Nlc3NvciAgIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRU5BQkxFX1BSRVBST0NFU1NJTkcgICA9IFlFUworTUFDUk9fRVhQQU5TSU9OICAgICAgICA9IFlFUworRVhQQU5EX09OTFlfUFJFREVGICAgICA9IFlFUworU0VBUkNIX0lOQ0xVREVTICAgICAgICA9IFlFUworSU5DTFVERV9QQVRIICAgICAgICAgICA9IAorSU5DTFVERV9GSUxFX1BBVFRFUk5TICA9IAorUFJFREVGSU5FRCAgICAgICAgICAgICA9ICJEQlVTX0JFR0lOX0RFQ0xTPSIgCQkJXAorCQkJICJEQlVTX0VORF9ERUNMUz0iIAkJCVwKKwkJCSAiRE9YWUdFTl9TSE9VTERfU0tJUF9USElTIiAJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiREJVU19HTlVDX0RFUFJFQ0FURUQ9IiAgICAgICAgICAgICAgICBcCisJCQkgIl9EQlVTX0RFRklORV9HTE9CQUxfTE9DSyhuYW1lKT0iCVwKKwkJCSAiX0RCVVNfR05VQ19QUklOVEYoZnJvbSx0byk9IiBcCisJCQkgIkRCVVNfRVhQT1JUPSIKK1NLSVBfRlVOQ1RJT05fTUFDUk9TICAgPSBZRVMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbjo6YWRkdGlvbnMgcmVsYXRlZCB0byBleHRlcm5hbCByZWZlcmVuY2VzICAgCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUQUdGSUxFUyAgICAgICAgICAgICAgID0gCitHRU5FUkFURV9UQUdGSUxFICAgICAgID0gCitBTExFWFRFUk5BTFMgICAgICAgICAgID0gTk8KK1BFUkxfUEFUSCAgICAgICAgICAgICAgPSAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGRvdCB0b29sICAgCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDTEFTU19ESUFHUkFNUyAgICAgICAgID0gWUVTCitIQVZFX0RPVCAgICAgICAgICAgICAgID0gTk8KK0NMQVNTX0dSQVBIICAgICAgICAgICAgPSBZRVMKK0NPTExBQk9SQVRJT05fR1JBUEggICAgPSBZRVMKK1RFTVBMQVRFX1JFTEFUSU9OUyAgICAgPSBZRVMKK0hJREVfVU5ET0NfUkVMQVRJT05TICAgPSBZRVMKK0lOQ0xVREVfR1JBUEggICAgICAgICAgPSBZRVMKK0lOQ0xVREVEX0JZX0dSQVBIICAgICAgPSBZRVMKK0dSQVBISUNBTF9ISUVSQVJDSFkgICAgPSBZRVMKK0RPVF9QQVRIICAgICAgICAgICAgICAgPSAKK0RPVEZJTEVfRElSUyAgICAgICAgICAgPSAKK01BWF9ET1RfR1JBUEhfV0lEVEggICAgPSA2NDAKK01BWF9ET1RfR1JBUEhfSEVJR0hUICAgPSAxMDI0CitHRU5FUkFURV9MRUdFTkQgICAgICAgID0gWUVTCitET1RfQ0xFQU5VUCAgICAgICAgICAgID0gWUVTCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb246OmFkZHRpb25zIHJlbGF0ZWQgdG8gdGhlIHNlYXJjaCBlbmdpbmUgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NFQVJDSEVOR0lORSAgICAgICAgICAgPSBOTwpkaWZmIC0tZ2l0IGEvZGJ1cy9jbWFrZS9idXMtdGVzdC5iYXQuY21ha2UgYi9kYnVzL2NtYWtlL2J1cy10ZXN0LmJhdC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTY4ODcxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9jbWFrZS9idXMtdGVzdC5iYXQuY21ha2UKQEAgLTAsMCArMSwxNCBAQAorOjogYnVzLXRlc3Qgd3JhcHBlcgorQGVjaG8gb2ZmCisKKzo6IHNlc3Npb24gYnVzIGFkZHJlc3MKK3NldCBEQlVTX1NUQVJURVJfQlVTPXRjcDpob3N0PWxvY2FsaG9zdCxwb3J0PTEyMzQKKworaWYgTk9UICIlMSIgPT0gIiIgKAorCVNFVCBEQVRBRElSPSUxCispIGVsc2UgKAorCVNFVCBEQVRBRElSPXRlc3RcZGF0YQorKQorCitiaW5cYnVzLXRlc3QuZXhlIHRlc3RcZGF0YQorCmRpZmYgLS1naXQgYS9kYnVzL2NtYWtlL2J1cy9DTWFrZUxpc3RzLnR4dCBiL2RidXMvY21ha2UvYnVzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZjlhOGUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2NtYWtlL2J1cy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE4NyBAQAorcHJvamVjdChidXMpCisKK2FkZF9kZWZpbml0aW9ucygtRERCVVNfQ09NUElMQVRJT04pCisKK1NFVChFRkVOQ0UgIiIpCitTRVQoQlVTX0RJUiAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL2J1cykKKworc2V0IChjb25maWdfREFUQQorCXNlc3Npb24uY29uZgkJCQkKKwlzeXN0ZW0uY29uZgorKQorCisjIGNvbmZpZyBmaWxlcyBmb3IgaW5zdGFsbGF0aW9uIAorQ09ORklHVVJFX0ZJTEUoICIke0JVU19ESVJ9L3Nlc3Npb24uY29uZi5pbiIgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zZXNzaW9uLmNvbmYiIElNTUVESUFURSBAT05MWSkKK0NPTkZJR1VSRV9GSUxFKCAic3lzdGVtLmNvbmYuY21ha2UiICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vc3lzdGVtLmNvbmYiIElNTUVESUFURSBAT05MWSkKKworIyBjb3B5IHNlcnZpY2VzIGZvciBsb2NhbCBkYWVtb24gc3RhcnQgdG8gbG9jYWwgc2VydmljZSBkaXIgZGF0YS9kYnVzLTEvc2VydmljZXMKK1NFVCAoU0VSVklDRV9GSUxFUyB0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcykKK0ZJTEUoR0xPQiBGSUxFUyAiJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi8ke1NFUlZJQ0VfRklMRVN9Lyouc2VydmljZS5pbiIgKQorRk9SRUFDSChGSUxFICR7RklMRVN9KQkKKwlHRVRfRklMRU5BTUVfQ09NUE9ORU5UKEZJTEVOQU1FICR7RklMRX0gTkFNRV9XRSkKKwlTRVQgKFRBUkdFVCAke0NNQUtFX0JJTkFSWV9ESVJ9L2RhdGEvZGJ1cy0xL3NlcnZpY2VzLyR7RklMRU5BTUV9LnNlcnZpY2UpCisJSUYgKENPTkZJR19WRVJCT1NFKQorCQlNRVNTQUdFKCJGUk9NOiAke0ZJTEV9XG5UTzogJHtUQVJHRVR9XG4iKQorCUVORElGIChDT05GSUdfVkVSQk9TRSkKKwljb25maWd1cmVfZmlsZSgke0ZJTEV9ICR7VEFSR0VUfSApCitFTkRGT1JFQUNIKEZJTEUpCisKK2lmKERCVVNfVVNFX0VYUEFUKQorICAgIFNFVCAoWE1MX1NPVVJDRVMgJHtCVVNfRElSfS9jb25maWctbG9hZGVyLWV4cGF0LmMpCitlbHNlKERCVVNfVVNFX0VYUEFUKQorICAgIFNFVCAoWE1MX1NPVVJDRVMgJHtCVVNfRElSfS9jb25maWctbG9hZGVyLWxpYnhtbC5jKQorZW5kaWYgKERCVVNfVVNFX0VYUEFUKQorCisjIGFmdGVyIG5leHQgY3ZzIHVwZGF0ZQorI3NldCAoRElSX1dBVENIX1NPVVJDRSAke0JVU19ESVJ9L2Rpci13YXRjaC1kZWZhdWx0LmMpCitzZXQgKERJUl9XQVRDSF9TT1VSQ0UgKQorCitzZXQgKEJVU19TT1VSQ0VTIAorCSR7QlVTX0RJUn0vYWN0aXZhdGlvbi5jCQkJCQorCSR7QlVTX0RJUn0vYWN0aXZhdGlvbi5oCQkJCQorCSR7QlVTX0RJUn0vYnVzLmMJCQkJCQorCSR7QlVTX0RJUn0vYnVzLmgJCQkJCQorCSR7QlVTX0RJUn0vY29uZmlnLXBhcnNlci5jCQkJCQorCSR7QlVTX0RJUn0vY29uZmlnLXBhcnNlci5oCisgICAgJHtCVVNfRElSfS9jb25maWctcGFyc2VyLWNvbW1vbi5jCisgICAgJHtCVVNfRElSfS9jb25maWctcGFyc2VyLWNvbW1vbi5oCisjICAgICR7QlVTX0RJUn0vY29uZmlnLXBhcnNlci10cml2aWFsLmMKKwkke0JVU19ESVJ9L2Nvbm5lY3Rpb24uYworCSR7QlVTX0RJUn0vY29ubmVjdGlvbi5oCQkJCQorCSR7QlVTX0RJUn0vZGVza3RvcC1maWxlLmMJCQkJCisJJHtCVVNfRElSfS9kZXNrdG9wLWZpbGUuaAkJCQkKKwkke0JVU19ESVJ9L2Rpci13YXRjaC1kZWZhdWx0LmMJCQkJCisJJHtCVVNfRElSfS9kaXItd2F0Y2guaAkJCQkKKwkke0JVU19ESVJ9L2Rpc3BhdGNoLmMJCQkJCisJJHtCVVNfRElSfS9kaXNwYXRjaC5oCQkJCQorCSR7QlVTX0RJUn0vZHJpdmVyLmMJCQkJCisJJHtCVVNfRElSfS9kcml2ZXIuaAkJCQkKKwkke0JVU19ESVJ9L2V4cGlyZWxpc3QuYwkJCQkKKwkke0JVU19ESVJ9L2V4cGlyZWxpc3QuaAkJCQkKKwkke0JVU19ESVJ9L3BvbGljeS5jCQkJCQorCSR7QlVTX0RJUn0vcG9saWN5LmgJCQkJCisJJHtCVVNfRElSfS9zZWxpbnV4LmgJCQkJCisJJHtCVVNfRElSfS9zZWxpbnV4LmMJCQkJCisJJHtCVVNfRElSfS9zZXJ2aWNlcy5jCQkJCQorCSR7QlVTX0RJUn0vc2VydmljZXMuaAkJCQkKKwkke0JVU19ESVJ9L3NpZ25hbHMuYwkJCQkKKwkke0JVU19ESVJ9L3NpZ25hbHMuaAkJCQkKKwkke0JVU19ESVJ9L3Rlc3QuYwkJCQkJCisJJHtCVVNfRElSfS90ZXN0LmgJCQkJCQorCSR7QlVTX0RJUn0vdXRpbHMuYwkJCQkJCisJJHtCVVNfRElSfS91dGlscy5oCQkJCQkKKwkke1hNTF9TT1VSQ0VTfQorCSR7RElSX1dBVENIX1NPVVJDRX0KKykKK2lmKERCVVNfRU5BQkxFX1NUQVRTKQorCWxpc3QoQVBQRU5EIEJVU19TT1VSQ0VTCisJCSR7QlVTX0RJUn0vc3RhdHMuYworCQkke0JVU19ESVJ9L3N0YXRzLmgKKwkpCitlbmRpZigpCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtYTUxfSU5DTFVERV9ESVJ9KQorCithZGRfZXhlY3V0YWJsZShkYnVzLWRhZW1vbiAke0JVU19TT1VSQ0VTfSAke0JVU19ESVJ9L21haW4uYykKK3RhcmdldF9saW5rX2xpYnJhcmllcyhkYnVzLWRhZW1vbiAke0RCVVNfSU5URVJOQUxfTElCUkFSSUVTfSAke1hNTF9MSUJSQVJZfSkKK3NldF90YXJnZXRfcHJvcGVydGllcyhkYnVzLWRhZW1vbiBQUk9QRVJUSUVTIE9VVFBVVF9OQU1FICR7REJVU19EQUVNT05fTkFNRX0pCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoZGJ1cy1kYWVtb24gUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICR7REJVU19JTlRFUk5BTF9DTElFTlRfREVGSU5JVElPTlN9KQorCitpbnN0YWxsX3RhcmdldHMoL2JpbiBkYnVzLWRhZW1vbikKK2luc3RhbGxfZmlsZXMoL2V0Yy9kYnVzLTEgRklMRVMgJHtjb25maWdfREFUQX0pCitpbnN0YWxsKERJUkVDVE9SWSAuICBERVNUSU5BVElPTiBldGMvZGJ1cy0xL3Nlc3Npb24uZCAgRklMRVNfTUFUQ0hJTkcgUEFUVEVSTiAiKi5jb25mIikKKworaWYgKERCVVNfU0VSVklDRSkKKwlzZXQgKGRidXNfc2VydmljZV9TT1VSQ0VTIAorCQkke0JVU19ESVJ9L2J1cy1zZXJ2aWNlLXdpbi5jCisJIyBUT0RPOiBhZGQgYWRkaXRpb25hbCBmaWxlcworCSMJJHtCVVNfRElSfS9zZXJ2aWNlLW1haW4uYworCSMJJHtCVVNfU09VUkNFU30gCisJKQorCisJYWRkX2V4ZWN1dGFibGUoZGJ1cy1zZXJ2aWNlICR7ZGJ1c19zZXJ2aWNlX1NPVVJDRVN9ICkKKwl0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy1zZXJ2aWNlICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9ICR7WE1MX0xJQlJBUll9KQorCXNldF90YXJnZXRfcHJvcGVydGllcyhkYnVzLXNlcnZpY2UgUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICR7REJVU19JTlRFUk5BTF9DTElFTlRfREVGSU5JVElPTlN9KQorCWluc3RhbGxfdGFyZ2V0cygvYmluIGRidXMtc2VydmljZSApCitlbmRpZiAoREJVU19TRVJWSUNFKQorCitpZiAoREJVU19CVUlMRF9URVNUUykJCisJYWRkX2V4ZWN1dGFibGUoYnVzLXRlc3QgJHtCVVNfU09VUkNFU30gJHtCVVNfRElSfS90ZXN0LW1haW4uYykKKwl0YXJnZXRfbGlua19saWJyYXJpZXMoYnVzLXRlc3QgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30gJHtYTUxfTElCUkFSWX0pCisJc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGJ1cy10ZXN0IFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAke0RCVVNfSU5URVJOQUxfQ0xJRU5UX0RFRklOSVRJT05TfSkKKwlhZGRfdGVzdChidXMtdGVzdCAke0VYRUNVVEFCTEVfT1VUUFVUX1BBVEh9L2J1cy10ZXN0ICR7Q01BS0VfQklOQVJZX0RJUn0vdGVzdC9kYXRhKQorZW5kaWYgKERCVVNfQlVJTERfVEVTVFMpCisKK2lmKE1TVkMpCisJcHJvamVjdF9zb3VyY2VfZ3JvdXAoJHtHUk9VUF9DT0RFfSBidXNfdGVzdF9TT1VSQ0VTIGR1bW15KQorZW5kaWYoTVNWQykKKworIyMgbW9wIHVwIHRoZSBnY292IGZpbGVzCisjY2xlYW4tbG9jYWw6CisjCS9iaW4vcm0gKi5iYiAqLmJiZyAqLmRhICouZ2NvdiB8fCB0cnVlCisKKyNpbnN0YWxsLWRhdGEtaG9vazoKKyMJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpLyQobG9jYWxzdGF0ZWRpcikvcnVuL2RidXMKKyMJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpLyQoY29uZmlnZGlyKS9zeXN0ZW0uZAorIwkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikvJChkYXRhZGlyKS9kYnVzLTEvc2VydmljZXMKKworIyNpbnN0YWxsX2ZpbGUoJHtjb25maWdkaXJ9L3N5c3RlbS5kIEZJTEUKKworCitzZXQoTEFVTkNIX0hFTFBFUl9TT1VSQ0VTICR7WE1MX1NPVVJDRVN9CisgICAgJHtCVVNfRElSfS9jb25maWctcGFyc2VyLWNvbW1vbi5jCisgICAgJHtCVVNfRElSfS9jb25maWctcGFyc2VyLXRyaXZpYWwuYworICAgICR7QlVTX0RJUn0vZGVza3RvcC1maWxlLmMKKyAgICAke0JVU19ESVJ9L3V0aWxzLmMKKyAgICAke0JVU19ESVJ9L2FjdGl2YXRpb24taGVscGVyLmMKKworKQorCitpZihOT1QgV0lOMzIpCisjIFRPRE8gUEVORElORyhrZGFiKSBmaXggYnVpbGQgb24gd2luZG93cyAoYWN0aXZhdGlvbi1oZWxwZXIuYykKKyAgIGFkZF9leGVjdXRhYmxlKGRidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXIgJHtMQVVOQ0hfSEVMUEVSX1NPVVJDRVN9ICR7QlVTX0RJUn0vYWN0aXZhdGlvbi1oZWxwZXItYmluLmMgKQorICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGRidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXIgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30gJHtYTUxfTElCUkFSWX0gKQorICAgCisgICBhZGRfZXhlY3V0YWJsZShkYnVzLWRhZW1vbi1sYXVuY2gtaGVscGVyLXRlc3QgJHtMQVVOQ0hfSEVMUEVSX1NPVVJDRVN9ICAgICAke0JVU19ESVJ9L2FjdGl2YXRpb24taGVscGVyLWJpbi5jKQorICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGRidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXItdGVzdCBQUk9QRVJUSUVTIENPTVBJTEVfRkxBR1MgIi1EQUNUSVZBVElPTl9MQVVOQ0hFUl9URVNUIikKKyAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhkYnVzLWRhZW1vbi1sYXVuY2gtaGVscGVyLXRlc3QgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30gJHtYTUxfTElCUkFSWX0gKQorICAgCisgICBhZGRfZXhlY3V0YWJsZShidXMtdGVzdC1sYXVuY2gtaGVscGVyICR7TEFVTkNIX0hFTFBFUl9TT1VSQ0VTfSAgJHtCVVNfRElSfS90ZXN0LWxhdW5jaC1oZWxwZXIuYykKKyAgIHNldF90YXJnZXRfcHJvcGVydGllcyhidXMtdGVzdC1sYXVuY2gtaGVscGVyIFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiLURBQ1RJVkFUSU9OX0xBVU5DSEVSX1RFU1QgLURBQ1RJVkFUSU9OX0xBVU5DSEVSX0RPX09PTSIpCisgICB0YXJnZXRfbGlua19saWJyYXJpZXMoYnVzLXRlc3QtbGF1bmNoLWhlbHBlciAke0RCVVNfSU5URVJOQUxfTElCUkFSSUVTfSAke1hNTF9MSUJSQVJZfSApCisgICBhZGRfdGVzdChidXMtdGVzdC1sYXVuY2gtaGVscGVyICR7RVhFQ1VUQUJMRV9PVVRQVVRfUEFUSH0vYnVzLXRlc3QtbGF1bmNoLWhlbHBlciApCisKK2VuZGlmKE5PVCBXSU4zMikKKworIyMjIyBJbml0IHNjcmlwdHMgZnVuCisjU0NSSVBUX0lOX0ZJTEVTPW1lc3NhZ2VidXMuaW4KKyMJCXJjLm1lc3NhZ2VidXMuaW4KKworIyMgUmVkIEhhdCBzdGFydAorI2lmIERCVVNfSU5JVF9TQ1JJUFRTX1JFRF9IQVQKKworI2luaXRkZGlyPSQoc3lzY29uZmRpcikvcmMuZC9pbml0LmQKKworI2luaXRkX1NDUklQVFM9IAkKKyMJbWVzc2FnZWJ1cworCisjZW5kaWYKKyMgIyMgUmVkIEhhdCBlbmQKKworIyMgU2xhY2t3YXJlIHN0YXJ0CisjaWYgREJVU19JTklUX1NDUklQVFNfU0xBQ0tXQVJFCisKKyNpbml0ZGRpcj0kKHN5c2NvbmZkaXIpL3JjLmQvCisKKyNpbml0ZF9TQ1JJUFRTPSAJCisjCXJjLm1lc3NhZ2VidXMKKworI2VuZGlmCisjIyBTbGFja3dhcmUgZW5kCisKKyNNQU5fSU5fRklMRVM9ZGJ1cy1kYWVtb24uMS5pbgorI21hbl9NQU5TID0gZGJ1cy1kYWVtb24uMQorCisjIyMjIEV4dHJhIGRpc3QgCisKKyNFWFRSQV9ESVNUPSQoQ09ORklHX0lOX0ZJTEVTKSAkKFNDUklQVF9JTl9GSUxFUykgJChtYW5fTUFOUykgJChNQU5fSU5fRklMRVMpCmRpZmYgLS1naXQgYS9kYnVzL2NtYWtlL2J1cy9kYnVzLWRhZW1vbi54bWwgYi9kYnVzL2NtYWtlL2J1cy9kYnVzLWRhZW1vbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMzMTY5OQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvY21ha2UvYnVzL2RidXMtZGFlbW9uLnhtbApAQCAtMCwwICsxLDc1MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPCFET0NUWVBFIHJlZmVudHJ5IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC4xLjIvL0VOIgorICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuMS4yL2RvY2Jvb2t4LmR0ZCI+Cis8IS0tIGxpZnRlZCBmcm9tIHRyb2ZmK21hbiBieSBkb2NsaWZ0ZXIgLS0+Cis8cmVmZW50cnkgaWQ9J2RidXMtZGFlbW9uJz4KKzwhLS0gICAtLT4KKzwhLS0gIGRidXNcLWRhZW1vbiBtYW51YWwgcGFnZS4gLS0+Cis8IS0tICBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLiAtLT4KKworPHJlZm1ldGE+Cis8cmVmZW50cnl0aXRsZT5kYnVzLWRhZW1vbjwvcmVmZW50cnl0aXRsZT4KKzxtYW52b2xudW0+MTwvbWFudm9sbnVtPgorPC9yZWZtZXRhPgorPHJlZm5hbWVkaXYgaWQ9J25hbWUnPgorPHJlZm5hbWU+ZGJ1cy1kYWVtb248L3JlZm5hbWU+Cis8cmVmcHVycG9zZT5NZXNzYWdlIGJ1cyBkYWVtb248L3JlZnB1cnBvc2U+Cis8L3JlZm5hbWVkaXY+Cis8IS0tIGJvZHkgYmVnaW5zIGhlcmUgLS0+Cis8cmVmc3lub3BzaXNkaXYgaWQ9J3N5bm9wc2lzJz4KKzxjbWRzeW5vcHNpcz4KKyAgPGNvbW1hbmQ+ZGJ1cy1kYWVtb248L2NvbW1hbmQ+PC9jbWRzeW5vcHNpcz4KKzxjbWRzeW5vcHNpcz4KKyAgPGNvbW1hbmQ+ZGJ1cy1kYWVtb248L2NvbW1hbmQ+ICAgIDxhcmcgY2hvaWNlPSdvcHQnPi0tdmVyc2lvbiA8L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLXNlc3Npb24gPC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+LS1zeXN0ZW0gPC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+LS1jb25maWctZmlsZT08cmVwbGFjZWFibGU+RklMRTwvcmVwbGFjZWFibGU+PC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+PGFyZyBjaG9pY2U9J3BsYWluJz4tLXByaW50LWFkZHJlc3MgPC9hcmc+PGFyZyBjaG9pY2U9J29wdCc+PHJlcGxhY2VhYmxlPj1ERVNDUklQVE9SPC9yZXBsYWNlYWJsZT48L2FyZz48L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz48YXJnIGNob2ljZT0ncGxhaW4nPi0tcHJpbnQtcGlkIDwvYXJnPjxhcmcgY2hvaWNlPSdvcHQnPjxyZXBsYWNlYWJsZT49REVTQ1JJUFRPUjwvcmVwbGFjZWFibGU+PC9hcmc+PC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+LS1mb3JrIDwvYXJnPgorICAgIDxzYnIvPgorPC9jbWRzeW5vcHNpcz4KKzwvcmVmc3lub3BzaXNkaXY+CisKKworPHJlZnNlY3QxIGlkPSdkZXNjcmlwdGlvbic+PHRpdGxlPkRFU0NSSVBUSU9OPC90aXRsZT4KKzxwYXJhPjxjb21tYW5kPmRidXMtZGFlbW9uPC9jb21tYW5kPiBpcyB0aGUgRC1CdXMgbWVzc2FnZSBidXMgZGFlbW9uLiBTZWUKKzx1bGluayB1cmw9J2h0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvJz5odHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLzwvdWxpbms+IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0Cit0aGUgYmlnIHBpY3R1cmUuIEQtQnVzIGlzIGZpcnN0IGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG9uZS10by1vbmUKK2NvbW11bmljYXRpb24gYmV0d2VlbiBhbnkgdHdvIGFwcGxpY2F0aW9uczsgPGNvbW1hbmQ+ZGJ1cy1kYWVtb248L2NvbW1hbmQ+IGlzIGFuCithcHBsaWNhdGlvbiB0aGF0IHVzZXMgdGhpcyBsaWJyYXJ5IHRvIGltcGxlbWVudCBhIG1lc3NhZ2UgYnVzCitkYWVtb24uIE11bHRpcGxlIHByb2dyYW1zIGNvbm5lY3QgdG8gdGhlIG1lc3NhZ2UgYnVzIGRhZW1vbiBhbmQgY2FuCitleGNoYW5nZSBtZXNzYWdlcyB3aXRoIG9uZSBhbm90aGVyLjwvcGFyYT4KKworCis8cGFyYT5UaGVyZSBhcmUgdHdvIHN0YW5kYXJkIG1lc3NhZ2UgYnVzIGluc3RhbmNlczogdGhlIHN5c3RlbXdpZGUgbWVzc2FnZSBidXMgCisoaW5zdGFsbGVkIG9uIG1hbnkgc3lzdGVtcyBhcyB0aGUgIm1lc3NhZ2VidXMiIGluaXQgc2VydmljZSkgYW5kIHRoZSAKK3Blci11c2VyLWxvZ2luLXNlc3Npb24gbWVzc2FnZSBidXMgKHN0YXJ0ZWQgZWFjaCB0aW1lIGEgdXNlciBsb2dzIGluKS4KKzxjb21tYW5kPmRidXMtZGFlbW9uPC9jb21tYW5kPiBpcyB1c2VkIGZvciBib3RoIG9mIHRoZXNlIGluc3RhbmNlcywgYnV0IHdpdGggCithIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIGZpbGUuPC9wYXJhPgorCisKKzxwYXJhPlRoZSAtLXNlc3Npb24gb3B0aW9uIGlzIGVxdWl2YWxlbnQgdG8KKyItLWNvbmZpZy1maWxlPS9ldGMvZGJ1cy0xL3Nlc3Npb24uY29uZiIgYW5kIHRoZSAtLXN5c3RlbQorb3B0aW9uIGlzIGVxdWl2YWxlbnQgdG8KKyItLWNvbmZpZy1maWxlPS9ldGMvZGJ1cy0xL3N5c3RlbS5jb25mIi4gQnkgY3JlYXRpbmcgCithZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gZmlsZXMgYW5kIHVzaW5nIHRoZSAtLWNvbmZpZy1maWxlIG9wdGlvbiwKK2FkZGl0aW9uYWwgc3BlY2lhbC1wdXJwb3NlIG1lc3NhZ2UgYnVzIGRhZW1vbnMgY291bGQgYmUgY3JlYXRlZC48L3BhcmE+CisKKworPHBhcmE+VGhlIHN5c3RlbXdpZGUgZGFlbW9uIGlzIG5vcm1hbGx5IGxhdW5jaGVkIGJ5IGFuIGluaXQgc2NyaXB0LCAKK3N0YW5kYXJkbHkgY2FsbGVkIHNpbXBseSAibWVzc2FnZWJ1cyIuPC9wYXJhPiAKKworCis8cGFyYT5UaGUgc3lzdGVtd2lkZSBkYWVtb24gaXMgbGFyZ2VseSB1c2VkIGZvciBicm9hZGNhc3Rpbmcgc3lzdGVtIGV2ZW50cywgCitzdWNoIGFzIGNoYW5nZXMgdG8gdGhlIHByaW50ZXIgcXVldWUsIG9yIGFkZGluZy9yZW1vdmluZyBkZXZpY2VzLjwvcGFyYT4KKworCis8cGFyYT5UaGUgcGVyLXNlc3Npb24gZGFlbW9uIGlzIHVzZWQgZm9yIHZhcmlvdXMgaW50ZXJwcm9jZXNzIGNvbW11bmljYXRpb24gCithbW9uZyBkZXNrdG9wIGFwcGxpY2F0aW9ucyAoaG93ZXZlciwgaXQgaXMgbm90IHRpZWQgdG8gWCBvciB0aGUgR1VJIAoraW4gYW55IHdheSkuPC9wYXJhPgorCisKKzxwYXJhPlNJR0hVUCB3aWxsIGNhdXNlIHRoZSBELUJ1cyBkYWVtb24gdG8gUEFSVElBTExZIHJlbG9hZCBpdHMKK2NvbmZpZ3VyYXRpb24gZmlsZSBhbmQgdG8gZmx1c2ggaXRzIHVzZXIvZ3JvdXAgaW5mb3JtYXRpb24gY2FjaGVzLiBTb21lCitjb25maWd1cmF0aW9uIGNoYW5nZXMgd291bGQgcmVxdWlyZSBraWNraW5nIGFsbCBhcHBzIG9mZiB0aGUgYnVzOyBzbyB0aGV5IHdpbGwKK29ubHkgdGFrZSBlZmZlY3QgaWYgeW91IHJlc3RhcnQgdGhlIGRhZW1vbi4gUG9saWN5IGNoYW5nZXMgc2hvdWxkIHRha2UgZWZmZWN0Cit3aXRoIFNJR0hVUC48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nb3B0aW9ucyc+PHRpdGxlPk9QVElPTlM8L3RpdGxlPgorPHBhcmE+VGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBzdXBwb3J0ZWQ6PC9wYXJhPgorPHZhcmlhYmxlbGlzdCByZW1hcD0nVFAnPgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tY29uZmlnLWZpbGU9RklMRTwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+VXNlIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGZpbGUuPC9wYXJhPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLWZvcms8L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPkZvcmNlIHRoZSBtZXNzYWdlIGJ1cyB0byBmb3JrIGFuZCBiZWNvbWUgYSBkYWVtb24sIGV2ZW4gaWYgCit0aGUgY29uZmlndXJhdGlvbiBmaWxlIGRvZXMgbm90IHNwZWNpZnkgdGhhdCBpdCBzaG91bGQuCitJbiBtb3N0IGNvbnRleHRzIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgYWxyZWFkeSBnZXRzIHRoaXMKK3JpZ2h0LCB0aG91Z2guPC9wYXJhPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLXByaW50LWFkZHJlc3NbPURFU0NSSVBUT1JdPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5QcmludCB0aGUgYWRkcmVzcyBvZiB0aGUgbWVzc2FnZSBidXMgdG8gc3RhbmRhcmQgb3V0cHV0LCBvciAKK3RvIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IuIFRoaXMgaXMgdXNlZCBieSBwcm9ncmFtcyB0aGF0IAorbGF1bmNoIHRoZSBtZXNzYWdlIGJ1cy48L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tcHJpbnQtcGlkWz1ERVNDUklQVE9SXTwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+UHJpbnQgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIG1lc3NhZ2UgYnVzIHRvIHN0YW5kYXJkIG91dHB1dCwgb3IgCit0byB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yLiBUaGlzIGlzIHVzZWQgYnkgcHJvZ3JhbXMgdGhhdCAKK2xhdW5jaCB0aGUgbWVzc2FnZSBidXMuPC9wYXJhPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLXNlc3Npb248L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlVzZSB0aGUgc3RhbmRhcmQgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgcGVyLWxvZ2luLXNlc3Npb24gbWVzc2FnZQorYnVzLjwvcGFyYT4KKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1zeXN0ZW08L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlVzZSB0aGUgc3RhbmRhcmQgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgc3lzdGVtd2lkZSBtZXNzYWdlIGJ1cy48L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tdmVyc2lvbjwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+UHJpbnQgdGhlIHZlcnNpb24gb2YgdGhlIGRhZW1vbi48L3BhcmE+CisKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+Cis8L3ZhcmlhYmxlbGlzdD4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nY29uZmlndXJhdGlvbl9maWxlJz48dGl0bGU+Q09ORklHVVJBVElPTiBGSUxFPC90aXRsZT4KKzxwYXJhPkEgbWVzc2FnZSBidXMgZGFlbW9uIGhhcyBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0aGF0IHNwZWNpYWxpemVzIGl0Citmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uLiBGb3IgZXhhbXBsZSwgb25lIGNvbmZpZ3VyYXRpb24gCitmaWxlIG1pZ2h0IHNldCB1cCB0aGUgbWVzc2FnZSBidXMgdG8gYmUgYSBzeXN0ZW13aWRlIG1lc3NhZ2UgYnVzLCAKK3doaWxlIGFub3RoZXIgbWlnaHQgc2V0IGl0IHVwIHRvIGJlIGEgcGVyLXVzZXItbG9naW4tc2Vzc2lvbiBidXMuPC9wYXJhPgorCisKKzxwYXJhPlRoZSBjb25maWd1cmF0aW9uIGZpbGUgYWxzbyBlc3RhYmxpc2hlcyByZXNvdXJjZSBsaW1pdHMsIHNlY3VyaXR5CitwYXJhbWV0ZXJzLCBhbmQgc28gZm9ydGguPC9wYXJhPgorCisKKzxwYXJhPlRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgbm90IHBhcnQgb2YgYW55IGludGVyb3BlcmFiaWxpdHkKK3NwZWNpZmljYXRpb24gYW5kIGl0cyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGlzIG5vdCBndWFyYW50ZWVkOyB0aGlzCitkb2N1bWVudCBpcyBkb2N1bWVudGF0aW9uLCBub3Qgc3BlY2lmaWNhdGlvbi48L3BhcmE+CisKKworPHBhcmE+VGhlIHN0YW5kYXJkIHN5c3RlbXdpZGUgYW5kIHBlci1zZXNzaW9uIG1lc3NhZ2UgYnVzIHNldHVwcyBhcmUKK2NvbmZpZ3VyZWQgaW4gdGhlIGZpbGVzICIvZXRjL2RidXMtMS9zeXN0ZW0uY29uZiIgYW5kCisiL2V0Yy9kYnVzLTEvc2Vzc2lvbi5jb25mIi4gIFRoZXNlIGZpbGVzIG5vcm1hbGx5CismbHQ7aW5jbHVkZSZndDsgYSBzeXN0ZW0tbG9jYWwuY29uZiBvciBzZXNzaW9uLWxvY2FsLmNvbmY7IHlvdSBjYW4gcHV0IGxvY2FsCitvdmVycmlkZXMgaW4gdGhvc2UgZmlsZXMgdG8gYXZvaWQgbW9kaWZ5aW5nIHRoZSBwcmltYXJ5IGNvbmZpZ3VyYXRpb24KK2ZpbGVzLjwvcGFyYT4KKworCis8cGFyYT5UaGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIGFuIFhNTCBkb2N1bWVudC4gSXQgbXVzdCBoYXZlIHRoZSBmb2xsb3dpbmcKK2RvY3R5cGUgZGVjbGFyYXRpb246PC9wYXJhPgorPGxpdGVyYWxsYXlvdXQgcmVtYXA9Jy5uZic+CisKKyAgICZsdDshRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQnVzIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgICAgIjx1bGluayB1cmw9J2h0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkJz5odHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZDwvdWxpbms+IiZndDsKKworPC9saXRlcmFsbGF5b3V0PiA8IS0tIC5maSAtLT4KKworCis8cGFyYT5UaGUgZm9sbG93aW5nIGVsZW1lbnRzIG1heSBiZSBwcmVzZW50IGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuPC9wYXJhPgorCis8dmFyaWFibGVsaXN0IHJlbWFwPSdUUCc+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxlbXBoYXNpcyByZW1hcD0nSSc+Jmx0O2J1c2NvbmZpZyZndDs8L2VtcGhhc2lzPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+PC9wYXJhPiAKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+Cis8L3ZhcmlhYmxlbGlzdD4KKworPHBhcmE+Um9vdCBlbGVtZW50LjwvcGFyYT4KKworPHZhcmlhYmxlbGlzdCByZW1hcD0nVFAnPgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48ZW1waGFzaXMgcmVtYXA9J0knPiZsdDt0eXBlJmd0OzwvZW1waGFzaXM+PC90ZXJtPgorICA8bGlzdGl0ZW0+CisKKzxwYXJhPjwvcGFyYT4gPCEtLSBGSVhNRTogYmxhbmsgbGlzdCBpdGVtIC0tPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKzwvdmFyaWFibGVsaXN0PgorCis8cGFyYT5UaGUgd2VsbC1rbm93biB0eXBlIG9mIHRoZSBtZXNzYWdlIGJ1cy4gQ3VycmVudGx5IGtub3duIHZhbHVlcyBhcmUKKyJzeXN0ZW0iIGFuZCAic2Vzc2lvbiI7IGlmIG90aGVyIHZhbHVlcyBhcmUgc2V0LCB0aGV5IHNob3VsZCBiZQorZWl0aGVyIGFkZGVkIHRvIHRoZSBELUJ1cyBzcGVjaWZpY2F0aW9uLCBvciBuYW1lc3BhY2VkLiAgVGhlIGxhc3QKKyZsdDt0eXBlJmd0OyBlbGVtZW50ICJ3aW5zIiAocHJldmlvdXMgdmFsdWVzIGFyZSBpZ25vcmVkKS48L3BhcmE+CisKKworPHBhcmE+RXhhbXBsZTogJmx0O3R5cGUmZ3Q7c2Vzc2lvbiZsdDsvdHlwZSZndDs8L3BhcmE+CisKKzx2YXJpYWJsZWxpc3QgcmVtYXA9J1RQJz4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PGVtcGhhc2lzIHJlbWFwPSdJJz4mbHQ7aW5jbHVkZSZndDs8L2VtcGhhc2lzPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+PC9wYXJhPiAKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+Cis8L3ZhcmlhYmxlbGlzdD4KKworPHBhcmE+SW5jbHVkZSBhIGZpbGUgJmx0O2luY2x1ZGUmZ3Q7ZmlsZW5hbWUuY29uZiZsdDsvaW5jbHVkZSZndDsgYXQgdGhpcyBwb2ludC4gIElmIHRoZQorZmlsZW5hbWUgaXMgcmVsYXRpdmUsIGl0IGlzIGxvY2F0ZWQgcmVsYXRpdmUgdG8gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQorZG9pbmcgdGhlIGluY2x1ZGluZy48L3BhcmE+CisKKworPHBhcmE+Jmx0O2luY2x1ZGUmZ3Q7IGhhcyBhbiBvcHRpb25hbCBhdHRyaWJ1dGUgImlnbm9yZV9taXNzaW5nPSh5ZXN8bm8pIgord2hpY2ggZGVmYXVsdHMgdG8gIm5vIiBpZiBub3QgcHJvdmlkZWQuIFRoaXMgYXR0cmlidXRlIAorY29udHJvbHMgd2hldGhlciBpdCdzIGEgZmF0YWwgZXJyb3IgZm9yIHRoZSBpbmNsdWRlZCBmaWxlIAordG8gYmUgYWJzZW50LjwvcGFyYT4KKworPHZhcmlhYmxlbGlzdCByZW1hcD0nVFAnPgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48ZW1waGFzaXMgcmVtYXA9J0knPiZsdDtpbmNsdWRlZGlyJmd0OzwvZW1waGFzaXM+PC90ZXJtPgorICA8bGlzdGl0ZW0+CisKKzxwYXJhPjwvcGFyYT4gPCEtLSBGSVhNRTogYmxhbmsgbGlzdCBpdGVtIC0tPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKzwvdmFyaWFibGVsaXN0PgorCis8cGFyYT5JbmNsdWRlIGFsbCBmaWxlcyBpbiAmbHQ7aW5jbHVkZWRpciZndDtmb28uZCZsdDsvaW5jbHVkZWRpciZndDsgYXQgdGhpcworcG9pbnQuIEZpbGVzIGluIHRoZSBkaXJlY3RvcnkgYXJlIGluY2x1ZGVkIGluIHVuZGVmaW5lZCBvcmRlci4KK09ubHkgZmlsZXMgZW5kaW5nIGluICIuY29uZiIgYXJlIGluY2x1ZGVkLjwvcGFyYT4KKworCis8cGFyYT5UaGlzIGlzIGludGVuZGVkIHRvIGFsbG93IGV4dGVuc2lvbiBvZiB0aGUgc3lzdGVtIGJ1cyBieSBwYXJ0aWN1bGFyCitwYWNrYWdlcy4gRm9yIGV4YW1wbGUsIGlmIENVUFMgd2FudHMgdG8gYmUgYWJsZSB0byBzZW5kIG91dAorbm90aWZpY2F0aW9uIG9mIHByaW50ZXIgcXVldWUgY2hhbmdlcywgaXQgY291bGQgaW5zdGFsbCBhIGZpbGUgdG8KKy9ldGMvZGJ1cy0xL3N5c3RlbS5kIHRoYXQgYWxsb3dlZCBhbGwgYXBwcyB0byByZWNlaXZlCit0aGlzIG1lc3NhZ2UgYW5kIGFsbG93ZWQgdGhlIHByaW50ZXIgZGFlbW9uIHVzZXIgdG8gc2VuZCBpdC48L3BhcmE+CisKKzx2YXJpYWJsZWxpc3QgcmVtYXA9J1RQJz4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PGVtcGhhc2lzIHJlbWFwPSdJJz4mbHQ7dXNlciZndDs8L2VtcGhhc2lzPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorCis8cGFyYT48L3BhcmE+IDwhLS0gRklYTUU6IGJsYW5rIGxpc3QgaXRlbSAtLT4KKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+Cis8L3ZhcmlhYmxlbGlzdD4KKworPHBhcmE+VGhlIHVzZXIgYWNjb3VudCB0aGUgZGFlbW9uIHNob3VsZCBydW4gYXMsIGFzIGVpdGhlciBhIHVzZXJuYW1lIG9yIGEKK1VJRC4gSWYgdGhlIGRhZW1vbiBjYW5ub3QgY2hhbmdlIHRvIHRoaXMgVUlEIG9uIHN0YXJ0dXAsIGl0IHdpbGwgZXhpdC4KK0lmIHRoaXMgZWxlbWVudCBpcyBub3QgcHJlc2VudCwgdGhlIGRhZW1vbiB3aWxsIG5vdCBjaGFuZ2Ugb3IgY2FyZQorYWJvdXQgaXRzIFVJRC48L3BhcmE+CisKKworPHBhcmE+VGhlIGxhc3QgJmx0O3VzZXImZ3Q7IGVudHJ5IGluIHRoZSBmaWxlICJ3aW5zIiwgdGhlIG90aGVycyBhcmUgaWdub3JlZC48L3BhcmE+CisKKworPHBhcmE+VGhlIHVzZXIgaXMgY2hhbmdlZCBhZnRlciB0aGUgYnVzIGhhcyBjb21wbGV0ZWQgaW5pdGlhbGl6YXRpb24uICBTbworc29ja2V0cyBldGMuIHdpbGwgYmUgY3JlYXRlZCBiZWZvcmUgY2hhbmdpbmcgdXNlciwgYnV0IG5vIGRhdGEgd2lsbCBiZQorcmVhZCBmcm9tIGNsaWVudHMgYmVmb3JlIGNoYW5naW5nIHVzZXIuIFRoaXMgbWVhbnMgdGhhdCBzb2NrZXRzIAorYW5kIFBJRCBmaWxlcyBjYW4gYmUgY3JlYXRlZCBpbiBhIGxvY2F0aW9uIHRoYXQgcmVxdWlyZXMgcm9vdCAKK3ByaXZpbGVnZXMgZm9yIHdyaXRpbmcuPC9wYXJhPgorCis8dmFyaWFibGVsaXN0IHJlbWFwPSdUUCc+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxlbXBoYXNpcyByZW1hcD0nSSc+Jmx0O2ZvcmsmZ3Q7PC9lbXBoYXNpcz48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPjwvcGFyYT4gICAgCisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorPC92YXJpYWJsZWxpc3Q+CisKKzxwYXJhPklmIHByZXNlbnQsIHRoZSBidXMgZGFlbW9uIGJlY29tZXMgYSByZWFsIGRhZW1vbiAoZm9ya3MgCitpbnRvIHRoZSBiYWNrZ3JvdW5kLCBldGMuKS4gVGhpcyBpcyBnZW5lcmFsbHkgdXNlZCAKK3JhdGhlciB0aGFuIHRoZSAtLWZvcmsgY29tbWFuZCBsaW5lIG9wdGlvbi48L3BhcmE+CisKKzx2YXJpYWJsZWxpc3QgcmVtYXA9J1RQJz4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PGVtcGhhc2lzIHJlbWFwPSdJJz4mbHQ7bGlzdGVuJmd0OzwvZW1waGFzaXM+PC90ZXJtPgorICA8bGlzdGl0ZW0+CisKKzxwYXJhPjwvcGFyYT4gPCEtLSBGSVhNRTogYmxhbmsgbGlzdCBpdGVtIC0tPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKzwvdmFyaWFibGVsaXN0PgorCis8cGFyYT5BZGQgYW4gYWRkcmVzcyB0aGF0IHRoZSBidXMgc2hvdWxkIGxpc3RlbiBvbi4gVGhlIAorYWRkcmVzcyBpcyBpbiB0aGUgc3RhbmRhcmQgRC1CdXMgZm9ybWF0IHRoYXQgY29udGFpbnMgCithIHRyYW5zcG9ydCBuYW1lIHBsdXMgcG9zc2libGUgcGFyYW1ldGVycy9vcHRpb25zLjwvcGFyYT4KKworCis8cGFyYT5FeGFtcGxlOiAmbHQ7bGlzdGVuJmd0O3VuaXg6cGF0aD0vdG1wL2ZvbyZsdDsvbGlzdGVuJmd0OzwvcGFyYT4KKworCis8cGFyYT5JZiB0aGVyZSBhcmUgbXVsdGlwbGUgJmx0O2xpc3RlbiZndDsgZWxlbWVudHMsIHRoZW4gdGhlIGJ1cyBsaXN0ZW5zIAorb24gbXVsdGlwbGUgYWRkcmVzc2VzLiBUaGUgYnVzIHdpbGwgcGFzcyBpdHMgYWRkcmVzcyB0byAKK3N0YXJ0ZWQgc2VydmljZXMgb3Igb3RoZXIgaW50ZXJlc3RlZCBwYXJ0aWVzIHdpdGggCit0aGUgbGFzdCBhZGRyZXNzIGdpdmVuIGluICZsdDtsaXN0ZW4mZ3Q7IGZpcnN0LiBUaGF0IGlzLCAKK2FwcHMgd2lsbCB0cnkgdG8gY29ubmVjdCB0byB0aGUgbGFzdCAmbHQ7bGlzdGVuJmd0OyBhZGRyZXNzIGZpcnN0LjwvcGFyYT4KKworPHZhcmlhYmxlbGlzdCByZW1hcD0nVFAnPgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48ZW1waGFzaXMgcmVtYXA9J0knPiZsdDthdXRoJmd0OzwvZW1waGFzaXM+PC90ZXJtPgorICA8bGlzdGl0ZW0+CisKKzxwYXJhPjwvcGFyYT4gPCEtLSBGSVhNRTogYmxhbmsgbGlzdCBpdGVtIC0tPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKzwvdmFyaWFibGVsaXN0PgorCis8cGFyYT5MaXN0cyBwZXJtaXR0ZWQgYXV0aG9yaXphdGlvbiBtZWNoYW5pc21zLiBJZiB0aGlzIGVsZW1lbnQgZG9lc24ndAorZXhpc3QsIHRoZW4gYWxsIGtub3duIG1lY2hhbmlzbXMgYXJlIGFsbG93ZWQuICBJZiB0aGVyZSBhcmUgbXVsdGlwbGUKKyZsdDthdXRoJmd0OyBlbGVtZW50cywgYWxsIHRoZSBsaXN0ZWQgbWVjaGFuaXNtcyBhcmUgYWxsb3dlZC4gIFRoZSBvcmRlciBpbgord2hpY2ggbWVjaGFuaXNtcyBhcmUgbGlzdGVkIGlzIG5vdCBtZWFuaW5nZnVsLjwvcGFyYT4KKyAgICAKKworPHBhcmE+RXhhbXBsZTogJmx0O2F1dGgmZ3Q7RVhURVJOQUwmbHQ7L2F1dGgmZ3Q7PC9wYXJhPgorCisKKzxwYXJhPkV4YW1wbGU6ICZsdDthdXRoJmd0O0RCVVNfQ09PS0lFX1NIQTEmbHQ7L2F1dGgmZ3Q7PC9wYXJhPgorCis8dmFyaWFibGVsaXN0IHJlbWFwPSdUUCc+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxlbXBoYXNpcyByZW1hcD0nSSc+Jmx0O3NlcnZpY2VkaXImZ3Q7PC9lbXBoYXNpcz48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKworPHBhcmE+PC9wYXJhPiA8IS0tIEZJWE1FOiBibGFuayBsaXN0IGl0ZW0gLS0+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorPC92YXJpYWJsZWxpc3Q+CisKKzxwYXJhPkFkZHMgYSBkaXJlY3RvcnkgdG8gc2NhbiBmb3IgLnNlcnZpY2UgZmlsZXMuIERpcmVjdG9yaWVzIGFyZQorc2Nhbm5lZCBzdGFydGluZyB3aXRoIHRoZSBsYXN0IHRvIGFwcGVhciBpbiB0aGUgY29uZmlnIGZpbGUgCisodGhlIGZpcnN0IC5zZXJ2aWNlIGZpbGUgZm91bmQgdGhhdCBwcm92aWRlcyBhIHBhcnRpY3VsYXIgCitzZXJ2aWNlIHdpbGwgYmUgdXNlZCkuPC9wYXJhPgorCisKKzxwYXJhPlNlcnZpY2UgZmlsZXMgdGVsbCB0aGUgYnVzIGhvdyB0byBhdXRvbWF0aWNhbGx5IHN0YXJ0IGEgcHJvZ3JhbS4KK1RoZXkgYXJlIHByaW1hcmlseSB1c2VkIHdpdGggdGhlIHBlci11c2VyLXNlc3Npb24gYnVzLCAKK25vdCB0aGUgc3lzdGVtd2lkZSBidXMuPC9wYXJhPgorCis8dmFyaWFibGVsaXN0IHJlbWFwPSdUUCc+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxlbXBoYXNpcyByZW1hcD0nSSc+Jmx0O3N0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMvJmd0OzwvZW1waGFzaXM+PC90ZXJtPgorICA8bGlzdGl0ZW0+CisKKzxwYXJhPjwvcGFyYT4gPCEtLSBGSVhNRTogYmxhbmsgbGlzdCBpdGVtIC0tPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKzwvdmFyaWFibGVsaXN0PgorCis8cGFyYT4mbHQ7c3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycy8mZ3Q7IGlzIGVxdWl2YWxlbnQgdG8gc3BlY2lmeWluZyBhIHNlcmllcworb2YgJmx0O3NlcnZpY2VkaXIvJmd0OyBlbGVtZW50cyBmb3IgZWFjaCBvZiB0aGUgZGF0YSBkaXJlY3RvcmllcyBpbiB0aGUgIlhERworQmFzZSBEaXJlY3RvcnkgU3BlY2lmaWNhdGlvbiIgd2l0aCB0aGUgc3ViZGlyZWN0b3J5ICJkYnVzLTEvc2VydmljZXMiLAorc28gZm9yIGV4YW1wbGUgIi91c3Ivc2hhcmUvZGJ1cy0xL3NlcnZpY2VzIiB3b3VsZCBiZSBhbW9uZyB0aGUKK2RpcmVjdG9yaWVzIHNlYXJjaGVkLjwvcGFyYT4KKworCis8cGFyYT5UaGUgIlhERyBCYXNlIERpcmVjdG9yeSBTcGVjaWZpY2F0aW9uIiBjYW4gYmUgZm91bmQgYXQKKzx1bGluayB1cmw9J2h0dHA6Ly9mcmVlZGVza3RvcC5vcmcvd2lraS9TdGFuZGFyZHMvYmFzZWRpci1zcGVjJz5odHRwOi8vZnJlZWRlc2t0b3Aub3JnL3dpa2kvU3RhbmRhcmRzL2Jhc2VkaXItc3BlYzwvdWxpbms+IGlmIGl0IGhhc24ndCBtb3ZlZCwKK290aGVyd2lzZSB0cnkgeW91ciBmYXZvcml0ZSBzZWFyY2ggZW5naW5lLjwvcGFyYT4KKworCis8cGFyYT5UaGUgJmx0O3N0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMvJmd0OyBvcHRpb24gaXMgb25seSByZWxldmFudCB0byB0aGUKK3Blci11c2VyLXNlc3Npb24gYnVzIGRhZW1vbiBkZWZpbmVkIGluCisvZXRjL2RidXMtMS9zZXNzaW9uLmNvbmYuIFB1dHRpbmcgaXQgaW4gYW55IG90aGVyCitjb25maWd1cmF0aW9uIGZpbGUgd291bGQgcHJvYmFibHkgYmUgbm9uc2Vuc2UuPC9wYXJhPgorCis8dmFyaWFibGVsaXN0IHJlbWFwPSdUUCc+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxlbXBoYXNpcyByZW1hcD0nSSc+Jmx0O2xpbWl0Jmd0OzwvZW1waGFzaXM+PC90ZXJtPgorICA8bGlzdGl0ZW0+CisKKzxwYXJhPjwvcGFyYT4gPCEtLSBGSVhNRTogYmxhbmsgbGlzdCBpdGVtIC0tPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKzwvdmFyaWFibGVsaXN0PgorCis8cGFyYT4mbHQ7bGltaXQmZ3Q7IGVzdGFibGlzaGVzIGEgcmVzb3VyY2UgbGltaXQuIEZvciBleGFtcGxlOjwvcGFyYT4KKzxsaXRlcmFsbGF5b3V0IHJlbWFwPScubmYnPgorICAmbHQ7bGltaXQgbmFtZT0ibWF4X21lc3NhZ2Vfc2l6ZSImZ3Q7NjQmbHQ7L2xpbWl0Jmd0OworICAmbHQ7bGltaXQgbmFtZT0ibWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyImZ3Q7NTEyJmx0Oy9saW1pdCZndDsKKzwvbGl0ZXJhbGxheW91dD4gPCEtLSAuZmkgLS0+CisKKworPHBhcmE+VGhlIG5hbWUgYXR0cmlidXRlIGlzIG1hbmRhdG9yeS4KK0F2YWlsYWJsZSBsaW1pdCBuYW1lcyBhcmU6PC9wYXJhPgorPGxpdGVyYWxsYXlvdXQgcmVtYXA9Jy5uZic+CisgICAgICAibWF4X2luY29taW5nX2J5dGVzIiAgICAgICAgIDogdG90YWwgc2l6ZSBpbiBieXRlcyBvZiBtZXNzYWdlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29taW5nIGZyb20gYSBzaW5nbGUgY29ubmVjdGlvbgorICAgICAgIm1heF9vdXRnb2luZ19ieXRlcyIgICAgICAgICA6IHRvdGFsIHNpemUgaW4gYnl0ZXMgb2YgbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZWQgdXAgZm9yIGEgc2luZ2xlIGNvbm5lY3Rpb24KKyAgICAgICJtYXhfbWVzc2FnZV9zaXplIiAgICAgICAgICAgOiBtYXggc2l6ZSBvZiBhIHNpbmdsZSBtZXNzYWdlIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMKKyAgICAgICJzZXJ2aWNlX3N0YXJ0X3RpbWVvdXQiICAgICAgOiBtaWxsaXNlY29uZHMgKHRob3VzYW5kdGhzKSB1bnRpbCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHN0YXJ0ZWQgc2VydmljZSBoYXMgdG8gY29ubmVjdAorICAgICAgImF1dGhfdGltZW91dCIgICAgICAgICAgICAgICA6IG1pbGxpc2Vjb25kcyAodGhvdXNhbmR0aHMpIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIGlzIGdpdmVuIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRlCisgICAgICAibWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyIgIDogbWF4IG51bWJlciBvZiBhdXRoZW50aWNhdGVkIGNvbm5lY3Rpb25zICAKKyAgICAgICJtYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyIgOiBtYXggbnVtYmVyIG9mIHVuYXV0aGVudGljYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zCisgICAgICAibWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyIiAgIDogbWF4IG51bWJlciBvZiBjb21wbGV0ZWQgY29ubmVjdGlvbnMgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzYW1lIHVzZXIKKyAgICAgICJtYXhfcGVuZGluZ19zZXJ2aWNlX3N0YXJ0cyIgOiBtYXggbnVtYmVyIG9mIHNlcnZpY2UgbGF1bmNoZXMgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcyBhdCB0aGUgc2FtZSB0aW1lCisgICAgICAibWF4X25hbWVzX3Blcl9jb25uZWN0aW9uIiAgIDogbWF4IG51bWJlciBvZiBuYW1lcyBhIHNpbmdsZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIGNhbiBvd24KKyAgICAgICJtYXhfbWF0Y2hfcnVsZXNfcGVyX2Nvbm5lY3Rpb24iOiBtYXggbnVtYmVyIG9mIG1hdGNoIHJ1bGVzIGZvciBhIHNpbmdsZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uCisgICAgICAibWF4X3JlcGxpZXNfcGVyX2Nvbm5lY3Rpb24iIDogbWF4IG51bWJlciBvZiBwZW5kaW5nIG1ldGhvZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsaWVzIHBlciBjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bWJlciBvZiBjYWxscy1pbi1wcm9ncmVzcykKKyAgICAgICJyZXBseV90aW1lb3V0IiAgICAgICAgICAgICAgOiBtaWxsaXNlY29uZHMgKHRob3VzYW5kdGhzKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnRpbCBhIG1ldGhvZCBjYWxsIHRpbWVzIG91dCAgIAorPC9saXRlcmFsbGF5b3V0PiA8IS0tIC5maSAtLT4KKworCis8cGFyYT5UaGUgbWF4IGluY29taW5nL291dGdvaW5nIHF1ZXVlIHNpemVzIGFsbG93IGEgbmV3IG1lc3NhZ2UgdG8gYmUgcXVldWVkCitpZiBvbmUgYnl0ZSByZW1haW5zIGJlbG93IHRoZSBtYXguIFNvIHlvdSBjYW4gaW4gZmFjdCBleGNlZWQgdGhlIG1heAorYnkgbWF4X21lc3NhZ2Vfc2l6ZS48L3BhcmE+CisKKworPHBhcmE+bWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyBkaXZpZGVkIGJ5IG1heF9jb25uZWN0aW9uc19wZXJfdXNlciBpcyB0aGUKK251bWJlciBvZiB1c2VycyB0aGF0IGNhbiB3b3JrIHRvZ2V0aGVyIHRvIGRlbmlhbC1vZi1zZXJ2aWNlIGFsbCBvdGhlciB1c2VycyBieSB1c2luZwordXAgYWxsIGNvbm5lY3Rpb25zIG9uIHRoZSBzeXN0ZW13aWRlIGJ1cy48L3BhcmE+CisKKworPHBhcmE+TGltaXRzIGFyZSBub3JtYWxseSBvbmx5IG9mIGludGVyZXN0IG9uIHRoZSBzeXN0ZW13aWRlIGJ1cywgbm90IHRoZSB1c2VyIHNlc3Npb24gCitidXNlcy48L3BhcmE+CisKKzx2YXJpYWJsZWxpc3QgcmVtYXA9J1RQJz4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PGVtcGhhc2lzIHJlbWFwPSdJJz4mbHQ7cG9saWN5Jmd0OzwvZW1waGFzaXM+PC90ZXJtPgorICA8bGlzdGl0ZW0+CisKKzxwYXJhPjwvcGFyYT4gPCEtLSBGSVhNRTogYmxhbmsgbGlzdCBpdGVtIC0tPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKzwvdmFyaWFibGVsaXN0PgorCis8cGFyYT5UaGUgJmx0O3BvbGljeSZndDsgZWxlbWVudCBkZWZpbmVzIGEgc2VjdXJpdHkgcG9saWN5IHRvIGJlIGFwcGxpZWQgdG8gYSBwYXJ0aWN1bGFyCitzZXQgb2YgY29ubmVjdGlvbnMgdG8gdGhlIGJ1cy4gQSBwb2xpY3kgaXMgbWFkZSB1cCBvZgorJmx0O2FsbG93Jmd0OyBhbmQgJmx0O2RlbnkmZ3Q7IGVsZW1lbnRzLiBQb2xpY2llcyBhcmUgbm9ybWFsbHkgdXNlZCB3aXRoIHRoZSBzeXN0ZW13aWRlIGJ1czsKK3RoZXkgYXJlIGFuYWxvZ291cyB0byBhIGZpcmV3YWxsIGluIHRoYXQgdGhleSBhbGxvdyBleHBlY3RlZCB0cmFmZmljIAorYW5kIHByZXZlbnQgdW5leHBlY3RlZCB0cmFmZmljLjwvcGFyYT4KKworCis8cGFyYT5UaGUgJmx0O3BvbGljeSZndDsgZWxlbWVudCBoYXMgb25lIG9mIHRocmVlIGF0dHJpYnV0ZXM6PC9wYXJhPgorPGxpdGVyYWxsYXlvdXQgcmVtYXA9Jy5uZic+CisgIGNvbnRleHQ9IihkZWZhdWx0fG1hbmRhdG9yeSkiCisgIHVzZXI9InVzZXJuYW1lIG9yIHVzZXJpZCIKKyAgZ3JvdXA9Imdyb3VwIG5hbWUgb3IgZ2lkIgorPC9saXRlcmFsbGF5b3V0PiA8IS0tIC5maSAtLT4KKworCis8cGFyYT4gCitQb2xpY2llcyBhcmUgYXBwbGllZCB0byBhIGNvbm5lY3Rpb24gYXMgZm9sbG93czo8L3BhcmE+Cis8bGl0ZXJhbGxheW91dCByZW1hcD0nLm5mJz4KKyAgIC0gYWxsIGNvbnRleHQ9ImRlZmF1bHQiIHBvbGljaWVzIGFyZSBhcHBsaWVkCisgICAtIGFsbCBncm91cD0iY29ubmVjdGlvbidzIHVzZXIncyBncm91cCIgcG9saWNpZXMgYXJlIGFwcGxpZWQKKyAgICAgaW4gdW5kZWZpbmVkIG9yZGVyCisgICAtIGFsbCB1c2VyPSJjb25uZWN0aW9uJ3MgYXV0aCB1c2VyIiBwb2xpY2llcyBhcmUgYXBwbGllZAorICAgICBpbiB1bmRlZmluZWQgb3JkZXIKKyAgIC0gYWxsIGNvbnRleHQ9Im1hbmRhdG9yeSIgcG9saWNpZXMgYXJlIGFwcGxpZWQKKzwvbGl0ZXJhbGxheW91dD4gPCEtLSAuZmkgLS0+CisKKworPHBhcmE+UG9saWNpZXMgYXBwbGllZCBsYXRlciB3aWxsIG92ZXJyaWRlIHRob3NlIGFwcGxpZWQgZWFybGllciwgCit3aGVuIHRoZSBwb2xpY2llcyBvdmVybGFwLiBNdWx0aXBsZSBwb2xpY2llcyB3aXRoIHRoZSBzYW1lIAordXNlci9ncm91cC9jb250ZXh0IGFyZSBhcHBsaWVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciAKK2luIHRoZSBjb25maWcgZmlsZS48L3BhcmE+CisKKzx2YXJpYWJsZWxpc3QgcmVtYXA9J1RQJz4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PGVtcGhhc2lzIHJlbWFwPSdJJz4mbHQ7ZGVueSZndDs8L2VtcGhhc2lzPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+PGVtcGhhc2lzIHJlbWFwPSdJJz4mbHQ7YWxsb3cmZ3Q7PC9lbXBoYXNpcz48L3BhcmE+CisKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+Cis8L3ZhcmlhYmxlbGlzdD4KKworPHBhcmE+QSAmbHQ7ZGVueSZndDsgZWxlbWVudCBhcHBlYXJzIGJlbG93IGEgJmx0O3BvbGljeSZndDsgZWxlbWVudCBhbmQgcHJvaGliaXRzIHNvbWUKK2FjdGlvbi4gVGhlICZsdDthbGxvdyZndDsgZWxlbWVudCBtYWtlcyBhbiBleGNlcHRpb24gdG8gcHJldmlvdXMgJmx0O2RlbnkmZ3Q7CitzdGF0ZW1lbnRzLCBhbmQgd29ya3MganVzdCBsaWtlICZsdDtkZW55Jmd0OyBidXQgd2l0aCB0aGUgaW52ZXJzZSBtZWFuaW5nLjwvcGFyYT4KKworCis8cGFyYT5UaGUgcG9zc2libGUgYXR0cmlidXRlcyBvZiB0aGVzZSBlbGVtZW50cyBhcmU6PC9wYXJhPgorPGxpdGVyYWxsYXlvdXQgcmVtYXA9Jy5uZic+CisgICBzZW5kX2ludGVyZmFjZT0iaW50ZXJmYWNlX25hbWUiCisgICBzZW5kX21lbWJlcj0ibWV0aG9kX29yX3NpZ25hbF9uYW1lIiAKKyAgIHNlbmRfZXJyb3I9ImVycm9yX25hbWUiIAorICAgc2VuZF9kZXN0aW5hdGlvbj0ibmFtZSIgCisgICBzZW5kX3R5cGU9Im1ldGhvZF9jYWxsIiB8ICJtZXRob2RfcmV0dXJuIiB8ICJzaWduYWwiIHwgImVycm9yIiAKKyAgIHNlbmRfcGF0aD0iL3BhdGgvbmFtZSIKKworICAgcmVjZWl2ZV9pbnRlcmZhY2U9ImludGVyZmFjZV9uYW1lIgorICAgcmVjZWl2ZV9tZW1iZXI9Im1ldGhvZF9vcl9zaWduYWxfbmFtZSIgCisgICByZWNlaXZlX2Vycm9yPSJlcnJvcl9uYW1lIiAKKyAgIHJlY2VpdmVfc2VuZGVyPSJuYW1lIiAKKyAgIHJlY2VpdmVfdHlwZT0ibWV0aG9kX2NhbGwiIHwgIm1ldGhvZF9yZXR1cm4iIHwgInNpZ25hbCIgfCAiZXJyb3IiCisgICByZWNlaXZlX3BhdGg9Ii9wYXRoL25hbWUiCisKKyAgIHNlbmRfcmVxdWVzdGVkX3JlcGx5PSJ0cnVlIiB8ICJmYWxzZSIKKyAgIHJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5PSJ0cnVlIiB8ICJmYWxzZSIKKworICAgZWF2ZXNkcm9wPSJ0cnVlIiB8ICJmYWxzZSIKKworICAgb3duPSJuYW1lIgorICAgb3duX3ByZWZpeD0ibmFtZSIKKyAgIHVzZXI9InVzZXJuYW1lIgorICAgZ3JvdXA9Imdyb3VwbmFtZSIKKzwvbGl0ZXJhbGxheW91dD4gPCEtLSAuZmkgLS0+CisKKworPHBhcmE+RXhhbXBsZXM6PC9wYXJhPgorPGxpdGVyYWxsYXlvdXQgcmVtYXA9Jy5uZic+CisgICAmbHQ7ZGVueSBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLlN5c3RlbSIgc2VuZF9tZW1iZXI9IlJlYm9vdCIvJmd0OyAKKyAgICZsdDtkZW55IHJlY2VpdmVfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuU3lzdGVtIiByZWNlaXZlX21lbWJlcj0iUmVib290Ii8mZ3Q7CisgICAmbHQ7ZGVueSBvd249Im9yZy5mcmVlZGVza3RvcC5TeXN0ZW0iLyZndDsKKyAgICZsdDtkZW55IHNlbmRfZGVzdGluYXRpb249Im9yZy5mcmVlZGVza3RvcC5TeXN0ZW0iLyZndDsKKyAgICZsdDtkZW55IHJlY2VpdmVfc2VuZGVyPSJvcmcuZnJlZWRlc2t0b3AuU3lzdGVtIi8mZ3Q7CisgICAmbHQ7ZGVueSB1c2VyPSJqb2huIi8mZ3Q7CisgICAmbHQ7ZGVueSBncm91cD0iZW5lbWllcyIvJmd0OworPC9saXRlcmFsbGF5b3V0PiA8IS0tIC5maSAtLT4KKworCis8cGFyYT5UaGUgJmx0O2RlbnkmZ3Q7IGVsZW1lbnQncyBhdHRyaWJ1dGVzIGRldGVybWluZSB3aGV0aGVyIHRoZSBkZW55ICJtYXRjaGVzIiBhCitwYXJ0aWN1bGFyIGFjdGlvbi4gSWYgaXQgbWF0Y2hlcywgdGhlIGFjdGlvbiBpcyBkZW5pZWQgKHVubGVzcyBsYXRlcgorcnVsZXMgaW4gdGhlIGNvbmZpZyBmaWxlIGFsbG93IGl0KS48L3BhcmE+CisKKworPHBhcmE+c2VuZF9kZXN0aW5hdGlvbiBhbmQgcmVjZWl2ZV9zZW5kZXIgcnVsZXMgbWVhbiB0aGF0IG1lc3NhZ2VzIG1heSBub3QgYmUKK3NlbnQgdG8gb3IgcmVjZWl2ZWQgZnJvbSB0aGUgKm93bmVyKiBvZiB0aGUgZ2l2ZW4gbmFtZSwgbm90IHRoYXQKK3RoZXkgbWF5IG5vdCBiZSBzZW50ICp0byB0aGF0IG5hbWUqLiBUaGF0IGlzLCBpZiBhIGNvbm5lY3Rpb24KK293bnMgc2VydmljZXMgQSwgQiwgQywgYW5kIHNlbmRpbmcgdG8gQSBpcyBkZW5pZWQsIHNlbmRpbmcgdG8gQiBvciBDCit3aWxsIG5vdCB3b3JrIGVpdGhlci48L3BhcmE+CisKKworPHBhcmE+VGhlIG90aGVyIHNlbmRfKiBhbmQgcmVjZWl2ZV8qIGF0dHJpYnV0ZXMgYXJlIHB1cmVseSB0ZXh0dWFsL2J5LXZhbHVlCittYXRjaGVzIGFnYWluc3QgdGhlIGdpdmVuIGZpZWxkIGluIHRoZSBtZXNzYWdlIGhlYWRlci48L3BhcmE+CisKKworPHBhcmE+IkVhdmVzZHJvcHBpbmciIG9jY3VycyB3aGVuIGFuIGFwcGxpY2F0aW9uIHJlY2VpdmVzIGEgbWVzc2FnZSB0aGF0Cit3YXMgZXhwbGljaXRseSBhZGRyZXNzZWQgdG8gYSBuYW1lIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBvd24uCitFYXZlc2Ryb3BwaW5nIHRodXMgb25seSBhcHBsaWVzIHRvIG1lc3NhZ2VzIHRoYXQgYXJlIGFkZHJlc3NlZCB0bworc2VydmljZXMgKGkuZS4gaXQgZG9lcyBub3QgYXBwbHkgdG8gc2lnbmFscykuPC9wYXJhPgorCisKKzxwYXJhPkZvciAmbHQ7YWxsb3cmZ3Q7LCBlYXZlc2Ryb3A9InRydWUiIGluZGljYXRlcyB0aGF0IHRoZSBydWxlIG1hdGNoZXMgZXZlbiAKK3doZW4gZWF2ZXNkcm9wcGluZy4gZWF2ZXNkcm9wPSJmYWxzZSIgaXMgdGhlIGRlZmF1bHQgYW5kIG1lYW5zIHRoYXQgCit0aGUgcnVsZSBvbmx5IGFsbG93cyBtZXNzYWdlcyB0byBnbyB0byB0aGVpciBzcGVjaWZpZWQgcmVjaXBpZW50LgorRm9yICZsdDtkZW55Jmd0OywgZWF2ZXNkcm9wPSJ0cnVlIiBpbmRpY2F0ZXMgdGhhdCB0aGUgcnVsZSBtYXRjaGVzIAorb25seSB3aGVuIGVhdmVzZHJvcHBpbmcuIGVhdmVzZHJvcD0iZmFsc2UiIGlzIHRoZSBkZWZhdWx0IGZvciAmbHQ7ZGVueSZndDsKK2Fsc28sIGJ1dCBoZXJlIGl0IG1lYW5zIHRoYXQgdGhlIHJ1bGUgYXBwbGllcyBhbHdheXMsIGV2ZW4gd2hlbiAKK25vdCBlYXZlc2Ryb3BwaW5nLiBUaGUgZWF2ZXNkcm9wIGF0dHJpYnV0ZSBjYW4gb25seSBiZSBjb21iaW5lZCB3aXRoCityZWNlaXZlIHJ1bGVzICh3aXRoIHJlY2VpdmVfKiBhdHRyaWJ1dGVzKS48L3BhcmE+CisKKworCis8cGFyYT5UaGUgW3NlbmR8cmVjZWl2ZV1fcmVxdWVzdGVkX3JlcGx5IGF0dHJpYnV0ZSB3b3JrcyBzaW1pbGFybHkgdG8gdGhlIGVhdmVzZHJvcAorYXR0cmlidXRlLiBJdCBjb250cm9scyB3aGV0aGVyIHRoZSAmbHQ7ZGVueSZndDsgb3IgJmx0O2FsbG93Jmd0OyBtYXRjaGVzIGEgcmVwbHkKK3RoYXQgaXMgZXhwZWN0ZWQgKGNvcnJlc3BvbmRzIHRvIGEgcHJldmlvdXMgbWV0aG9kIGNhbGwgbWVzc2FnZSkuCitUaGlzIGF0dHJpYnV0ZSBvbmx5IG1ha2VzIHNlbnNlIGZvciByZXBseSBtZXNzYWdlcyAoZXJyb3JzIGFuZCBtZXRob2QKK3JldHVybnMpLCBhbmQgaXMgaWdub3JlZCBmb3Igb3RoZXIgbWVzc2FnZSB0eXBlcy48L3BhcmE+CisKKworPHBhcmE+Rm9yICZsdDthbGxvdyZndDssIFtzZW5kfHJlY2VpdmVdX3JlcXVlc3RlZF9yZXBseT0idHJ1ZSIgaXMgdGhlIGRlZmF1bHQgYW5kIGluZGljYXRlcyB0aGF0Citvbmx5IHJlcXVlc3RlZCByZXBsaWVzIGFyZSBhbGxvd2VkIGJ5IHRoZQorcnVsZS4gW3NlbmR8cmVjZWl2ZV1fcmVxdWVzdGVkX3JlcGx5PSJmYWxzZSIgbWVhbnMgdGhhdCB0aGUgcnVsZSBhbGxvd3MgYW55IHJlcGx5CitldmVuIGlmIHVuZXhwZWN0ZWQuPC9wYXJhPgorCisKKzxwYXJhPkZvciAmbHQ7ZGVueSZndDssIFtzZW5kfHJlY2VpdmVdX3JlcXVlc3RlZF9yZXBseT0iZmFsc2UiIGlzIHRoZSBkZWZhdWx0IGJ1dCBpbmRpY2F0ZXMgdGhhdAordGhlIHJ1bGUgbWF0Y2hlcyBvbmx5IHdoZW4gdGhlIHJlcGx5IHdhcyBub3QKK3JlcXVlc3RlZC4gW3NlbmR8cmVjZWl2ZV1fcmVxdWVzdGVkX3JlcGx5PSJ0cnVlIiBpbmRpY2F0ZXMgdGhhdCB0aGUgcnVsZSBhcHBsaWVzCithbHdheXMsIHJlZ2FyZGxlc3Mgb2YgcGVuZGluZyByZXBseSBzdGF0ZS48L3BhcmE+CisKKworPHBhcmE+dXNlciBhbmQgZ3JvdXAgZGVuaWFscyBtZWFuIHRoYXQgdGhlIGdpdmVuIHVzZXIgb3IgZ3JvdXAgbWF5IAorbm90IGNvbm5lY3QgdG8gdGhlIG1lc3NhZ2UgYnVzLjwvcGFyYT4KKworCis8cGFyYT5Gb3IgIm5hbWUiLCAidXNlcm5hbWUiLCAiZ3JvdXBuYW1lIiwgZXRjLgordGhlIGNoYXJhY3RlciAiKiIgY2FuIGJlIHN1YnN0aXR1dGVkLCBtZWFuaW5nICJhbnkuIiBDb21wbGV4IGdsb2JzCitsaWtlICJmb28uYmFyLioiIGFyZW4ndCBhbGxvd2VkIGZvciBub3cgYmVjYXVzZSB0aGV5J2QgYmUgd29yayB0bworaW1wbGVtZW50IGFuZCBtYXliZSBlbmNvdXJhZ2Ugc2xvcHB5IHNlY3VyaXR5IGFueXdheS48L3BhcmE+CisKKzxwYXJhPiZsdDthbGxvdyBvd25fcHJlZml4PSJhLmIiLyZndDsgYWxsb3dzIHlvdSB0byBvd24gdGhlIG5hbWUgImEuYiIgb3IgYW55CituYW1lIHdob3NlIGZpcnN0IGRvdC1zZXBhcmF0ZWQgZWxlbWVudHMgYXJlICJhLmIiOiBpbiBwYXJ0aWN1bGFyLAoreW91IGNhbiBvd24gImEuYi5jIiBvciAiYS5iLmMuZCIsIGJ1dCBub3QgImEuYmMiIG9yICJhLmMiLgorVGhpcyBpcyB1c2VmdWwgd2hlbiBzZXJ2aWNlcyBsaWtlIFRlbGVwYXRoeSBhbmQgUmVzZXJ2ZURldmljZQorZGVmaW5lIGEgbWVhbmluZyBmb3Igc3VidHJlZXMgb2Ygd2VsbC1rbm93biBuYW1lcywgc3VjaCBhcworb3JnLmZyZWVkZXNrdG9wLlRlbGVwYXRoeS5Db25uZWN0aW9uTWFuYWdlci4oYW55dGhpbmcpCithbmQgb3JnLmZyZWVkZXNrdG9wLlJlc2VydmVEZXZpY2UxLihhbnl0aGluZykuPC9wYXJhPgorCis8cGFyYT5JdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIGRlbnkgYSB1c2VyIG9yIGdyb3VwIGluc2lkZSBhICZsdDtwb2xpY3kmZ3Q7Citmb3IgYSB1c2VyIG9yIGdyb3VwOyB1c2VyL2dyb3VwIGRlbmlhbHMgY2FuIG9ubHkgYmUgaW5zaWRlCitjb250ZXh0PSJkZWZhdWx0IiBvciBjb250ZXh0PSJtYW5kYXRvcnkiIHBvbGljaWVzLjwvcGFyYT4KKworCis8cGFyYT5BIHNpbmdsZSAmbHQ7ZGVueSZndDsgcnVsZSBtYXkgc3BlY2lmeSBjb21iaW5hdGlvbnMgb2YgYXR0cmlidXRlcyBzdWNoIGFzCitzZW5kX2Rlc3RpbmF0aW9uIGFuZCBzZW5kX2ludGVyZmFjZSBhbmQgc2VuZF90eXBlLiBJbiB0aGlzIGNhc2UsIHRoZQorZGVuaWFsIGFwcGxpZXMgb25seSBpZiBib3RoIGF0dHJpYnV0ZXMgbWF0Y2ggdGhlIG1lc3NhZ2UgYmVpbmcgZGVuaWVkLgorZS5nLiAmbHQ7ZGVueSBzZW5kX2ludGVyZmFjZT0iZm9vLmJhciIgc2VuZF9kZXN0aW5hdGlvbj0iZm9vLmJsYWgiLyZndDsgd291bGQKK2RlbnkgbWVzc2FnZXMgd2l0aCB0aGUgZ2l2ZW4gaW50ZXJmYWNlIEFORCB0aGUgZ2l2ZW4gYnVzIG5hbWUuCitUbyBnZXQgYW4gT1IgZWZmZWN0IHlvdSBzcGVjaWZ5IG11bHRpcGxlICZsdDtkZW55Jmd0OyBydWxlcy48L3BhcmE+CisKKworPHBhcmE+WW91IGNhbid0IGluY2x1ZGUgYm90aCBzZW5kXyBhbmQgcmVjZWl2ZV8gYXR0cmlidXRlcyBvbiB0aGUgc2FtZQorcnVsZSwgc2luY2UgIndoZXRoZXIgdGhlIG1lc3NhZ2UgY2FuIGJlIHNlbnQiIGFuZCAid2hldGhlciBpdCBjYW4gYmUKK3JlY2VpdmVkIiBhcmUgZXZhbHVhdGVkIHNlcGFyYXRlbHkuPC9wYXJhPgorCisKKzxwYXJhPkJlIGNhcmVmdWwgd2l0aCBzZW5kX2ludGVyZmFjZS9yZWNlaXZlX2ludGVyZmFjZSwgYmVjYXVzZSB0aGUgCitpbnRlcmZhY2UgZmllbGQgaW4gbWVzc2FnZXMgaXMgb3B0aW9uYWwuPC9wYXJhPgorCis8dmFyaWFibGVsaXN0IHJlbWFwPSdUUCc+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxlbXBoYXNpcyByZW1hcD0nSSc+Jmx0O3NlbGludXgmZ3Q7PC9lbXBoYXNpcz48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKworPHBhcmE+PC9wYXJhPiA8IS0tIEZJWE1FOiBibGFuayBsaXN0IGl0ZW0gLS0+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorPC92YXJpYWJsZWxpc3Q+CisKKzxwYXJhPlRoZSAmbHQ7c2VsaW51eCZndDsgZWxlbWVudCBjb250YWlucyBzZXR0aW5ncyByZWxhdGVkIHRvIFNlY3VyaXR5IEVuaGFuY2VkIExpbnV4LgorTW9yZSBkZXRhaWxzIGJlbG93LjwvcGFyYT4KKworPHZhcmlhYmxlbGlzdCByZW1hcD0nVFAnPgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48ZW1waGFzaXMgcmVtYXA9J0knPiZsdDthc3NvY2lhdGUmZ3Q7PC9lbXBoYXNpcz48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKworPHBhcmE+PC9wYXJhPiA8IS0tIEZJWE1FOiBibGFuayBsaXN0IGl0ZW0gLS0+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorPC92YXJpYWJsZWxpc3Q+CisKKzxwYXJhPkFuICZsdDthc3NvY2lhdGUmZ3Q7IGVsZW1lbnQgYXBwZWFycyBiZWxvdyBhbiAmbHQ7c2VsaW51eCZndDsgZWxlbWVudCBhbmQKK2NyZWF0ZXMgYSBtYXBwaW5nLiBSaWdodCBub3cgb25seSBvbmUga2luZCBvZiBhc3NvY2lhdGlvbiBpcyBwb3NzaWJsZTo8L3BhcmE+Cis8bGl0ZXJhbGxheW91dCByZW1hcD0nLm5mJz4KKyAgICZsdDthc3NvY2lhdGUgb3duPSJvcmcuZnJlZWRlc2t0b3AuRm9vYmFyIiBjb250ZXh0PSJmb29fdCIvJmd0OyAKKzwvbGl0ZXJhbGxheW91dD4gPCEtLSAuZmkgLS0+CisKKworPHBhcmE+VGhpcyBtZWFucyB0aGF0IGlmIGEgY29ubmVjdGlvbiBhc2tzIHRvIG93biB0aGUgbmFtZQorIm9yZy5mcmVlZGVza3RvcC5Gb29iYXIiIHRoZW4gdGhlIHNvdXJjZSBjb250ZXh0IHdpbGwgYmUgdGhlIGNvbnRleHQKK29mIHRoZSBjb25uZWN0aW9uIGFuZCB0aGUgdGFyZ2V0IGNvbnRleHQgd2lsbCBiZSAiZm9vX3QiIC0gc2VlIHRoZSAKK3Nob3J0IGRpc2N1c3Npb24gb2YgU0VMaW51eCBiZWxvdy48L3BhcmE+CisKKworPHBhcmE+Tm90ZSwgdGhlIGNvbnRleHQgaGVyZSBpcyB0aGUgdGFyZ2V0IGNvbnRleHQgd2hlbiByZXF1ZXN0aW5nIGEgbmFtZSwKK05PVCB0aGUgY29udGV4dCBvZiB0aGUgY29ubmVjdGlvbiBvd25pbmcgdGhlIG5hbWUuPC9wYXJhPgorCisKKzxwYXJhPlRoZXJlJ3MgY3VycmVudGx5IG5vIHdheSB0byBzZXQgYSBkZWZhdWx0IGZvciBvd25pbmcgYW55IG5hbWUsIGlmCit3ZSBhZGQgdGhpcyBzeW50YXggaXQgd2lsbCBsb29rIGxpa2U6PC9wYXJhPgorPGxpdGVyYWxsYXlvdXQgcmVtYXA9Jy5uZic+CisgICAmbHQ7YXNzb2NpYXRlIG93bj0iKiIgY29udGV4dD0iZm9vX3QiLyZndDsgCis8L2xpdGVyYWxsYXlvdXQ+IDwhLS0gLmZpIC0tPgorPHBhcmE+SWYgeW91IGZpbmQgYSByZWFzb24gdGhpcyBpcyB1c2VmdWwsIGxldCB0aGUgZGV2ZWxvcGVycyBrbm93LgorUmlnaHQgbm93IHRoZSBkZWZhdWx0IHdpbGwgYmUgdGhlIHNlY3VyaXR5IGNvbnRleHQgb2YgdGhlIGJ1cyBpdHNlbGYuPC9wYXJhPgorCisKKzxwYXJhPklmIHR3byAmbHQ7YXNzb2NpYXRlJmd0OyBlbGVtZW50cyBzcGVjaWZ5IHRoZSBzYW1lIG5hbWUsIHRoZSBlbGVtZW50CithcHBlYXJpbmcgbGF0ZXIgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB3aWxsIGJlIHVzZWQuPC9wYXJhPgorCis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDEgaWQ9J3NlbGludXgnPjx0aXRsZT5TRUxpbnV4PC90aXRsZT4KKzxwYXJhPlNlZSA8dWxpbmsgdXJsPSdodHRwOi8vd3d3Lm5zYS5nb3Yvc2VsaW51eC8nPmh0dHA6Ly93d3cubnNhLmdvdi9zZWxpbnV4LzwvdWxpbms+IGZvciBmdWxsIGRldGFpbHMgb24gU0VMaW51eC4gU29tZSB1c2VmdWwgZXhjZXJwdHM6PC9wYXJhPgorCisKKzxwYXJhPkV2ZXJ5IHN1YmplY3QgKHByb2Nlc3MpIGFuZCBvYmplY3QgKGUuZy4gZmlsZSwgc29ja2V0LCBJUEMgb2JqZWN0LAorZXRjKSBpbiB0aGUgc3lzdGVtIGlzIGFzc2lnbmVkIGEgY29sbGVjdGlvbiBvZiBzZWN1cml0eSBhdHRyaWJ1dGVzLAora25vd24gYXMgYSBzZWN1cml0eSBjb250ZXh0LiBBIHNlY3VyaXR5IGNvbnRleHQgY29udGFpbnMgYWxsIG9mIHRoZQorc2VjdXJpdHkgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIHN1YmplY3Qgb3Igb2JqZWN0Cit0aGF0IGFyZSByZWxldmFudCB0byB0aGUgc2VjdXJpdHkgcG9saWN5LjwvcGFyYT4KKworCis8cGFyYT5JbiBvcmRlciB0byBiZXR0ZXIgZW5jYXBzdWxhdGUgc2VjdXJpdHkgY29udGV4dHMgYW5kIHRvIHByb3ZpZGUKK2dyZWF0ZXIgZWZmaWNpZW5jeSwgdGhlIHBvbGljeSBlbmZvcmNlbWVudCBjb2RlIG9mIFNFTGludXggdHlwaWNhbGx5CitoYW5kbGVzIHNlY3VyaXR5IGlkZW50aWZpZXJzIChTSURzKSByYXRoZXIgdGhhbiBzZWN1cml0eSBjb250ZXh0cy4gQQorU0lEIGlzIGFuIGludGVnZXIgdGhhdCBpcyBtYXBwZWQgYnkgdGhlIHNlY3VyaXR5IHNlcnZlciB0byBhIHNlY3VyaXR5Citjb250ZXh0IGF0IHJ1bnRpbWUuPC9wYXJhPgorCisKKzxwYXJhPldoZW4gYSBzZWN1cml0eSBkZWNpc2lvbiBpcyByZXF1aXJlZCwgdGhlIHBvbGljeSBlbmZvcmNlbWVudCBjb2RlCitwYXNzZXMgYSBwYWlyIG9mIFNJRHMgKHR5cGljYWxseSB0aGUgU0lEIG9mIGEgc3ViamVjdCBhbmQgdGhlIFNJRCBvZgorYW4gb2JqZWN0LCBidXQgc29tZXRpbWVzIGEgcGFpciBvZiBzdWJqZWN0IFNJRHMgb3IgYSBwYWlyIG9mIG9iamVjdAorU0lEcyksIGFuZCBhbiBvYmplY3Qgc2VjdXJpdHkgY2xhc3MgdG8gdGhlIHNlY3VyaXR5IHNlcnZlci4gVGhlIG9iamVjdAorc2VjdXJpdHkgY2xhc3MgaW5kaWNhdGVzIHRoZSBraW5kIG9mIG9iamVjdCwgZS5nLiBhIHByb2Nlc3MsIGEgcmVndWxhcgorZmlsZSwgYSBkaXJlY3RvcnksIGEgVENQIHNvY2tldCwgZXRjLjwvcGFyYT4KKworCis8cGFyYT5BY2Nlc3MgZGVjaXNpb25zIHNwZWNpZnkgd2hldGhlciBvciBub3QgYSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgZm9yIGEKK2dpdmVuIHBhaXIgb2YgU0lEcyBhbmQgY2xhc3MuIEVhY2ggb2JqZWN0IGNsYXNzIGhhcyBhIHNldCBvZgorYXNzb2NpYXRlZCBwZXJtaXNzaW9ucyBkZWZpbmVkIHRvIGNvbnRyb2wgb3BlcmF0aW9ucyBvbiBvYmplY3RzIHdpdGgKK3RoYXQgY2xhc3MuPC9wYXJhPgorCisKKzxwYXJhPkQtQnVzIHBlcmZvcm1zIFNFTGludXggc2VjdXJpdHkgY2hlY2tzIGluIHR3byBwbGFjZXMuPC9wYXJhPgorCisKKzxwYXJhPkZpcnN0LCBhbnkgdGltZSBhIG1lc3NhZ2UgaXMgcm91dGVkIGZyb20gb25lIGNvbm5lY3Rpb24gdG8gYW5vdGhlcgorY29ubmVjdGlvbiwgdGhlIGJ1cyBkYWVtb24gd2lsbCBjaGVjayBwZXJtaXNzaW9ucyB3aXRoIHRoZSBzZWN1cml0eSBjb250ZXh0IG9mCit0aGUgZmlyc3QgY29ubmVjdGlvbiBhcyBzb3VyY2UsIHNlY3VyaXR5IGNvbnRleHQgb2YgdGhlIHNlY29uZCBjb25uZWN0aW9uCithcyB0YXJnZXQsIG9iamVjdCBjbGFzcyAiZGJ1cyIgYW5kIHJlcXVlc3RlZCBwZXJtaXNzaW9uICJzZW5kX21zZyIuPC9wYXJhPgorCisKKzxwYXJhPklmIGEgc2VjdXJpdHkgY29udGV4dCBpcyBub3QgYXZhaWxhYmxlIGZvciBhIGNvbm5lY3Rpb24gCisoaW1wb3NzaWJsZSB3aGVuIHVzaW5nIFVOSVggZG9tYWluIHNvY2tldHMpLCB0aGVuIHRoZSB0YXJnZXQgCitjb250ZXh0IHVzZWQgaXMgdGhlIGNvbnRleHQgb2YgdGhlIGJ1cyBkYWVtb24gaXRzZWxmLgorVGhlcmUgaXMgY3VycmVudGx5IG5vIHdheSB0byBjaGFuZ2UgdGhpcyBkZWZhdWx0LCBiZWNhdXNlIHdlJ3JlIAorYXNzdW1pbmcgdGhhdCBvbmx5IFVOSVggZG9tYWluIHNvY2tldHMgd2lsbCBiZSB1c2VkIHRvIAorY29ubmVjdCB0byB0aGUgc3lzdGVtd2lkZSBidXMuIElmIHRoaXMgY2hhbmdlcywgd2UnbGwgCitwcm9iYWJseSBhZGQgYSB3YXkgdG8gc2V0IHRoZSBkZWZhdWx0IGNvbm5lY3Rpb24gY29udGV4dC48L3BhcmE+CisKKworPHBhcmE+U2Vjb25kLCBhbnkgdGltZSBhIGNvbm5lY3Rpb24gYXNrcyB0byBvd24gYSBuYW1lLCAKK3RoZSBidXMgZGFlbW9uIHdpbGwgY2hlY2sgcGVybWlzc2lvbnMgd2l0aCB0aGUgc2VjdXJpdHkgCitjb250ZXh0IG9mIHRoZSBjb25uZWN0aW9uIGFzIHNvdXJjZSwgdGhlIHNlY3VyaXR5IGNvbnRleHQgc3BlY2lmaWVkCitmb3IgdGhlIG5hbWUgaW4gdGhlIGNvbmZpZyBmaWxlIGFzIHRhcmdldCwgb2JqZWN0IAorY2xhc3MgImRidXMiIGFuZCByZXF1ZXN0ZWQgcGVybWlzc2lvbiAiYWNxdWlyZV9zdmMiLjwvcGFyYT4KKworCis8cGFyYT5UaGUgc2VjdXJpdHkgY29udGV4dCBmb3IgYSBidXMgbmFtZSBpcyBzcGVjaWZpZWQgd2l0aCB0aGUgCismbHQ7YXNzb2NpYXRlJmd0OyBlbGVtZW50IGRlc2NyaWJlZCBlYXJsaWVyIGluIHRoaXMgZG9jdW1lbnQuCitJZiBhIG5hbWUgaGFzIG5vIHNlY3VyaXR5IGNvbnRleHQgYXNzb2NpYXRlZCBpbiB0aGUgCitjb25maWd1cmF0aW9uIGZpbGUsIHRoZSBzZWN1cml0eSBjb250ZXh0IG9mIHRoZSBidXMgZGFlbW9uIAoraXRzZWxmIHdpbGwgYmUgdXNlZC48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nYXV0aG9yJz48dGl0bGU+QVVUSE9SPC90aXRsZT4KKzxwYXJhPlNlZSA8dWxpbmsgdXJsPSdodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzL2RvYy9BVVRIT1JTJz5odHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzL2RvYy9BVVRIT1JTPC91bGluaz48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nYnVncyc+PHRpdGxlPkJVR1M8L3RpdGxlPgorPHBhcmE+UGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgdG8gdGhlIEQtQnVzIG1haWxpbmcgbGlzdCBvciBidWcgdHJhY2tlciwKK3NlZSA8dWxpbmsgdXJsPSdodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyc+aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy88L3VsaW5rPjwvcGFyYT4KKzwvcmVmc2VjdDE+Cis8L3JlZmVudHJ5PgorCmRpZmYgLS1naXQgYS9kYnVzL2NtYWtlL2J1cy9zZXJ2aWNlLmNtYWtlIGIvZGJ1cy9jbWFrZS9idXMvc2VydmljZS5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWQxN2ZmCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9jbWFrZS9idXMvc2VydmljZS5jbWFrZQpAQCAtMCwwICsxLDMgQEAKK1tELUJVUyBTZXJ2aWNlXQorTmFtZT1vcmcuZnJlZWRla3RvcC5EQnVzLlNlcnZpY2VOYW1lCitFeGVjPW5vdGVwYWQKZGlmZiAtLWdpdCBhL2RidXMvY21ha2UvYnVzL3N5c3RlbS5jb25mLmNtYWtlIGIvZGJ1cy9jbWFrZS9idXMvc3lzdGVtLmNvbmYuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU4NWVjYwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvY21ha2UvYnVzL3N5c3RlbS5jb25mLmNtYWtlCkBAIC0wLDAgKzEsNjIgQEAKKzwhLS0gVGhpcyBjb25maWd1cmF0aW9uIGZpbGUgY29udHJvbHMgdGhlIHN5c3RlbXdpZGUgbWVzc2FnZSBidXMuCisgICAgIEFkZCBhIHN5c3RlbS1sb2NhbC5jb25mIGFuZCBlZGl0IHRoYXQgcmF0aGVyIHRoYW4gY2hhbmdpbmcgdGhpcyAKKyAgICAgZmlsZSBkaXJlY3RseS4gLS0+CisKKzwhLS0gTm90ZSB0aGF0IHRoZXJlIGFyZSBhbnkgbnVtYmVyIG9mIHdheXMgeW91IGNhbiBob3NlIHlvdXJzZWxmCisgICAgIHNlY3VyaXR5LXdpc2UgYnkgc2NyZXdpbmcgdXAgdGhpcyBmaWxlOyBpbiBwYXJ0aWN1bGFyLCB5b3UKKyAgICAgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBsaXN0ZW4gb24gYW55IG1vcmUgYWRkcmVzc2VzLCBhZGQgYW55IG1vcmUKKyAgICAgYXV0aCBtZWNoYW5pc21zLCBydW4gYXMgYSBkaWZmZXJlbnQgdXNlciwgZXRjLiAtLT4KKworPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKworICA8IS0tIE91ciB3ZWxsLWtub3duIGJ1cyB0eXBlLCBkbyBub3QgY2hhbmdlIHRoaXMgLS0+CisgIDx0eXBlPnN5c3RlbTwvdHlwZT4KKworICA8IS0tIFJ1biBhcyBzcGVjaWFsIHVzZXIgLS0+CisgIDx1c2VyPkBEQlVTX1VTRVJAPC91c2VyPgorCisgIDwhLS0gRm9yayBpbnRvIGRhZW1vbiBtb2RlIC0tPgorICA8Zm9yay8+CisKKyAgPCEtLSBXcml0ZSBhIHBpZCBmaWxlIC0tPgorICA8cGlkZmlsZT5AREJVU19TWVNURU1fUElEX0ZJTEVAPC9waWRmaWxlPgorCisgIDwhLS0gT25seSBhbGxvdyBzb2NrZXQtY3JlZGVudGlhbHMtYmFzZWQgYXV0aGVudGljYXRpb24gLS0+CisgIDxhdXRoPkVYVEVSTkFMPC9hdXRoPgorCisgIDwhLS0gT25seSBsaXN0ZW4gb24gYSBsb2NhbCBzb2NrZXQuIChhYnN0cmFjdD0vcGF0aC90by9zb2NrZXQgCisgICAgICAgbWVhbnMgdXNlIGFic3RyYWN0IG5hbWVzcGFjZSwgZG9uJ3QgcmVhbGx5IGNyZWF0ZSBmaWxlc3lzdGVtIAorICAgICAgIGZpbGU7IG9ubHkgTGludXggc3VwcG9ydHMgdGhpcy4gVXNlIHBhdGg9L3doYXRldmVyIG9uIG90aGVyIAorICAgICAgIHN5c3RlbXMuKSAtLT4KKyAgPGxpc3Rlbj5AREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTU0A8L2xpc3Rlbj4KKworICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDwhLS0gRGVueSBldmVyeXRoaW5nIHRoZW4gcHVuY2ggaG9sZXMgLS0+CisgICAgPGRlbnkgc2VuZF9pbnRlcmZhY2U9IioiLz4KKyAgICA8ZGVueSByZWNlaXZlX2ludGVyZmFjZT0iKiIvPgorICAgIDxkZW55IG93bj0iKiIvPgorICAgIDwhLS0gQnV0IGFsbG93IGFsbCB1c2VycyB0byBjb25uZWN0IC0tPgorICAgIDxhbGxvdyB1c2VyPSIqIi8+CisgICAgPCEtLSBBbGxvdyBhbnlvbmUgdG8gdGFsayB0byB0aGUgbWVzc2FnZSBidXMgLS0+CisgICAgPCEtLSBGSVhNRSBJIHRoaW5rIGN1cnJlbnRseSB0aGVzZSBhbGxvdyBydWxlcyBhcmUgYWx3YXlzIGltcGxpY2l0IAorICAgICAgICAgZXZlbiBpZiB0aGV5IGFyZW4ndCBpbiBoZXJlIC0tPgorICAgIDxhbGxvdyBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuREJ1cyIvPgorICAgIDxhbGxvdyByZWNlaXZlX3NlbmRlcj0ib3JnLmZyZWVkZXNrdG9wLkRCdXMiLz4KKyAgICA8IS0tIHZhbGlkIHJlcGxpZXMgYXJlIGFsd2F5cyBhbGxvd2VkIC0tPgorICAgIDxhbGxvdyBzZW5kX3JlcXVlc3RlZF9yZXBseT0idHJ1ZSIvPgorICAgIDxhbGxvdyByZWNlaXZlX3JlcXVlc3RlZF9yZXBseT0idHJ1ZSIvPgorICA8L3BvbGljeT4KKworICA8IS0tIENvbmZpZyBmaWxlcyBhcmUgcGxhY2VkIGhlcmUgdGhhdCBhbW9uZyBvdGhlciB0aGluZ3MsIHB1bmNoIAorICAgICAgIGhvbGVzIGluIHRoZSBhYm92ZSBwb2xpY3kgZm9yIHNwZWNpZmljIHNlcnZpY2VzLiAtLT4KKyAgPGluY2x1ZGVkaXI+c3lzdGVtLmQ8L2luY2x1ZGVkaXI+CisKKyAgPCEtLSBUaGlzIGlzIGluY2x1ZGVkIGxhc3Qgc28gbG9jYWwgY29uZmlndXJhdGlvbiBjYW4gb3ZlcnJpZGUgd2hhdCdzIAorICAgICAgIGluIHRoaXMgc3RhbmRhcmQgZmlsZSAtLT4KKyAgPGluY2x1ZGUgaWdub3JlX21pc3Npbmc9InllcyI+c3lzdGVtLWxvY2FsLmNvbmY8L2luY2x1ZGU+CisKKyAgPGluY2x1ZGUgaWZfc2VsaW51eF9lbmFibGVkPSJ5ZXMiIHNlbGludXhfcm9vdF9yZWxhdGl2ZT0ieWVzIj5jb250ZXh0cy9kYnVzX2NvbnRleHRzPC9pbmNsdWRlPgorCis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL2RidXMvY21ha2UvY29uZmlnLmguY21ha2UgYi9kYnVzL2NtYWtlL2NvbmZpZy5oLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMjFjMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2NtYWtlL2NvbmZpZy5oLmNtYWtlCkBAIC0wLDAgKzEsMjUyIEBACisvKiBjb25maWcuaC4gR2VuZXJhdGVkIGJ5IGNtYWtlIGZyb20gY29uZmlnLmguY21ha2UgKi8KKworI2lmbmRlZiBfREJVU19DT05GSUdfSAorI2RlZmluZSBfREJVU19DT05GSUdfSAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBpbmRpY2F0ZSB0aGF0IHdlIGFyZSBidWlsZGluZyB3aXRoIGNtYWtlICovCisjZGVmaW5lIERCVVNfQ01BS0UgMQorCisjY21ha2VkZWZpbmUgSEFWRV9HTlVDX1ZBUkFSR1MgMQorCisjY21ha2VkZWZpbmUgREJVU19DT05TT0xFX0FVVEhfRElSICJAREJVU19DT05TT0xFX0FVVEhfRElSQCIKKyNjbWFrZWRlZmluZSBEQlVTX0RBVEFESVIgICJAREJVU19EQVRBRElSQCIKKyNjbWFrZWRlZmluZSBEQlVTX0JJTkRJUiAgICJAREJVU19CSU5ESVJAIgorI2NtYWtlZGVmaW5lIERCVVNfU1lTVEVNX0NPTkZJR19GSUxFICAiQERCVVNfU1lTVEVNX0NPTkZJR19GSUxFQCIKKyNjbWFrZWRlZmluZSBEQlVTX1NFU1NJT05fQ09ORklHX0ZJTEUgIkBEQlVTX1NFU1NJT05fQ09ORklHX0ZJTEVAIgorI2NtYWtlZGVmaW5lIERCVVNfREFFTU9OX05BTUUgIkBEQlVTX0RBRU1PTl9OQU1FQCIKKyNjbWFrZWRlZmluZSBEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTICAiQERCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1NAIgorI2NtYWtlZGVmaW5lIERCVVNfTUFDSElORV9VVUlEX0ZJTEUgIkBEQlVTX01BQ0hJTkVfVVVJRF9GSUxFQCIKKyNjbWFrZWRlZmluZSBEQlVTX1NFU1NJT05fQlVTX0RFRkFVTFRfQUREUkVTUyAiQERCVVNfU0VTU0lPTl9CVVNfREVGQVVMVF9BRERSRVNTQCIKKyNjbWFrZWRlZmluZSBEQlVTX0RBRU1PTkRJUiAiQERCVVNfREFFTU9ORElSQCIKKyNjbWFrZWRlZmluZSBQQUNLQUdFICJAUEFDS0FHRUAiCisvKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCisjY21ha2VkZWZpbmUgREJVU19NQUpPUl9WRVJTSU9OIEBEQlVTX01BSk9SX1ZFUlNJT05ACisjY21ha2VkZWZpbmUgREJVU19NSU5PUl9WRVJTSU9OIEBEQlVTX01JTk9SX1ZFUlNJT05ACisjY21ha2VkZWZpbmUgREJVU19NSUNST19WRVJTSU9OIEBEQlVTX01JQ1JPX1ZFUlNJT05ACisjY21ha2VkZWZpbmUgREJVU19WRVJTSU9OICgoQERCVVNfTUFKT1JfVkVSU0lPTkAgPDwgMTYpIHwgKEBEQlVTX01JTk9SX1ZFUlNJT05AIDw8IDgpIHwgKEBEQlVTX01JQ1JPX1ZFUlNJT05AKSkKKyNjbWFrZWRlZmluZSBEQlVTX1ZFUlNJT05fU1RSSU5HICJAREJVU19WRVJTSU9OX1NUUklOR0AiCisjY21ha2VkZWZpbmUgREJVU19FTkFCTEVfU1RBVFMKKworI2RlZmluZSBWRVJTSU9OIERCVVNfVkVSU0lPTl9TVFJJTkcKKworI2RlZmluZSBURVNUX0xJU1RFTiAgICAgICAiQFRFU1RfTElTVEVOQCIKKworLy8gdGVzdCBiaW5hcmllcworI2RlZmluZSBEQlVTX1RFU1RfRVhFQyAiQERCVVNfVEVTVF9FWEVDQCIKKyNkZWZpbmUgREJVU19FWEVFWFQgIkBFWEVFWFRAIgorCisvKiBGdWxsIHBhdGggdG8gdGVzdCBmaWxlIHRlc3QvdGVzdC1leGl0IGluIGJ1aWxkZGlyICovCisjZGVmaW5lIFRFU1RfQlVTX0JJTkFSWSAgICAgICAgICAiQFRFU1RfQlVTX0JJTkFSWUAiCisKKy8qIFNvbWUgZGJ1cyBmZWF0dXJlcyAqLworI2NtYWtlZGVmaW5lIERCVVNfQlVJTERfVEVTVFMgMQorI2NtYWtlZGVmaW5lIERCVVNfRU5BQkxFX0FOU0kgMQorI2NtYWtlZGVmaW5lIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERSAxCisjY21ha2VkZWZpbmUgREJVU19ESVNBQkxFX0FTU0VSVFMgMQorI2NtYWtlZGVmaW5lIERCVVNfRElTQUJMRV9DSEVDS1MgMQorLyogeG1sZG9jcyAqLworLyogZG94eWdlbiAqLworI2NtYWtlZGVmaW5lIERCVVNfR0NPVl9FTkFCTEVEIDEKKworLyogYWJzdHJhY3Qtc29ja2V0cyAqLworCisjY21ha2VkZWZpbmUgSEFWRV9BQlNUUkFDVF9TT0NLRVRTIDEKKworI2NtYWtlZGVmaW5lIERCVVNfUEFUSF9PUl9BQlNUUkFDVF9WQUxVRSAxCisKKyNpZiAoZGVmaW5lZCBEQlVTX1BBVEhfT1JfQUJTVFJBQ1RfVkFMVUUpCisjZGVmaW5lIERCVVNfUEFUSF9PUl9BQlNUUkFDVCBAREJVU19QQVRIX09SX0FCU1RSQUNUX1ZBTFVFQAorI2VuZGlmCisKKyNpZmRlZiBEQlVTX1BBVEhfT1JfQUJTVFJBQ1RfVkFMVUUKKyN1bmRlZiBEQlVTX1BBVEhfT1JfQUJTVFJBQ1RfVkFMVUUKKyNlbmRpZgorCisvKiBzZWxpbnV4ICovCisjY21ha2VkZWZpbmUgREJVU19CVVNfRU5BQkxFX0ROT1RJRllfT05fTElOVVggMQorLyoga3F1ZXVlICovCisjY21ha2VkZWZpbmUgSEFWRV9DT05TT0xFX09XTkVSX0ZJTEUgMQorI2RlZmluZSBEQlVTX0NPTlNPTEVfT1dORVJfRklMRSAiQERCVVNfQ09OU09MRV9PV05FUl9GSUxFQCIKKworI2NtYWtlZGVmaW5lIERCVVNfSEFWRV9BVE9NSUNfSU5UIDEKKyNjbWFrZWRlZmluZSBEQlVTX1VTRV9BVE9NSUNfSU5UXzQ4NiAxCisjaWYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykpCisjIGRlZmluZSBEQlVTX0hBVkVfQVRPTUlDX0lOVCAxCisjIGRlZmluZSBEQlVTX1VTRV9BVE9NSUNfSU5UXzQ4NiAxCisjZW5kaWYKKworI2NtYWtlZGVmaW5lIERCVVNfQlVJTERfWDExIDEKKy8qIEZvciB0aGUgbW9tZW50LCB0aGUgY21ha2UgYnVpbGQgc3lzdGVtIGRvZXNuJ3QgaGF2ZSBhbiBlcXVpdmFsZW50IG9mCisgKiB0aGUgYXV0b2NvbmYgYnVpbGQgc3lzdGVtJ3MgLS1kaXNhYmxlLXgxMS1hdXRvbGF1bmNoICovCisjaWZkZWYgREJVU19CVUlMRF9YMTEKKyMgZGVmaW5lIERCVVNfRU5BQkxFX1gxMV9BVVRPTEFVTkNIIDEKKyNlbmRpZgorCisjZGVmaW5lIF9EQlVTX1ZBX0NPUFlfQVNTSUdOKGExLGEyKSB7IGExID0gYTI7IH0KKworI2NtYWtlZGVmaW5lIERCVVNfVkFfQ09QWV9GVU5DCisjaWYgKGRlZmluZWQgREJVU19WQV9DT1BZX0ZVTkMpCisjIGRlZmluZSBEQlVTX1ZBX0NPUFkgQERCVVNfVkFfQ09QWV9GVU5DQAorI2VuZGlmCisKKyNpZmRlZiBEQlVTX1ZBX0NPUFlfRlVOQworI3VuZGVmIERCVVNfVkFfQ09QWV9GVU5DCisjZW5kaWYKKworI2NtYWtlZGVmaW5lIERCVVNfVkFfQ09QWV9BU19BUlJBWSBAREJVU19WQV9DT1BZX0FTX0FSUkFZQAorCisvLyBoZWFkZXJzCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBkaXJlbnQuaCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9ESVJFTlRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIGlvLmggKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfSU9fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIGdycC5oICovCisjY21ha2VkZWZpbmUgICBIQVZFX0dSUF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgc3lzL3BvbGwuaCAqLworI2NtYWtlZGVmaW5lICAgIEhBVkVfUE9MTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHN5cy90aW1lLmggKi8KKyNjbWFrZWRlZmluZSAgICBIQVZFX1NZU19USU1FIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgc3lzL3dhaXQuaCAqLworI2NtYWtlZGVmaW5lICAgIEhBVkVfU1lTX1dBSVQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aW1lLmggKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfVElNRV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgd3MydGNwaXAuaCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9XUzJUQ1BJUF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHdzcGlhcGkuaCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9XU1BJQVBJX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB1bmlzdGQuaCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9VTklTVERfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHN0ZGlvLmggKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfU1RESU9fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHN5cy9zeXNsaW1pdHMuaCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9TWVNfU1lTTElNSVRTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBlcnJuby5oICovCisjY21ha2VkZWZpbmUgICBIQVZFX0VSUk5PX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBzaWduYWwuaCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9TSUdOQUxfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIGxvY2FsZS5oICovCisjY21ha2VkZWZpbmUgICBIQVZFX0xPQ0FMRV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgaW50dHlwZXMuaCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9JTlRUWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgc3RkaW50LmggKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfU1RESU5UX0ggMQorCisvLyBzeW1ib2xzCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBiYWNrdHJhY2UgKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfQkFDS1RSQUNFIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgZ2V0Z3JvdXBsaXN0ICovCisjY21ha2VkZWZpbmUgICBIQVZFX0dFVEdST1VQTElTVCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIGdldHBlZXJ1Y3JlZCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9HRVRQRUVSVUNSRUQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBuYW5vc2xlZXAgKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfTkFOT1NMRUVQIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgZ2V0cHduYW1fciAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9QT1NJWF9HRVRQV05BTV9SIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgc29ja2V0cGFpciAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9TT0NLRVRQQUlSIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgc2V0ZW52ICovCisjY21ha2VkZWZpbmUgICBIQVZFX1NFVEVOViAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHVuc2V0ZW52ICovCisjY21ha2VkZWZpbmUgICBIQVZFX1VOU0VURU5WIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgY2xlYXJlbnYgKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfQ0xFQVJFTlYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB3cml0ZXYgKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfV1JJVEVWIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgc29ja2xlbl90ICovCisjY21ha2VkZWZpbmUgICBIQVZFX1NPQ0tMRU5fVCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHNldGxvY2FsZSAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9TRVRMT0NBTEUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBsb2NhbGVjb252ICovCisjY21ha2VkZWZpbmUgICBIQVZFX0xPQ0FMRUNPTlYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBzdHJ0b2xsICovCisjY21ha2VkZWZpbmUgICBIQVZFX1NUUlRPTEwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBzdHJ0b3VsbCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9TVFJUT1VMTCAxCisKKy8vIHN0cnVjdHMKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHN0cnVjdCBjbXNncmVkICovCisjY21ha2VkZWZpbmUgICAgSEFWRV9DTVNHQ1JFRCAxCisKKy8vIHN5c3RlbSB0eXBlIGRlZmluZXMKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpIHx8IGRlZmluZWQgKF9XSU4zMl9XQ0UpCisjIGRlZmluZSBEQlVTX1dJTgorIyBkZWZpbmUgREJVU19XSU5fRklYTUUgMQorIyBpZmRlZiBfV0lOMzJfV0NFCisjICBkZWZpbmUgREJVU19XSU5DRQorIyBlbHNlCisjICBkZWZpbmUgREJVU19XSU4zMgorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIERCVVNfVU5JWAorI2VuZGlmIAorCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KQorLy8gbWluZ3cgbW9kZV90CisjIGlmZGVmIEhBVkVfU1RESU9fSAorIyAgaW5jbHVkZSA8c3RkaW8uaD4KKyMgZW5kaWYKKyMgaWZuZGVmIF9NU0NfVkVSCisjICBkZWZpbmUgdWlkX3QgaW50CisjICBkZWZpbmUgZ2lkX3QgaW50CisjIGVsc2UKKyMgIGRlZmluZSBzbnByaW50ZiBfc25wcmludGYKKyAgIHR5cGVkZWYgaW50IG1vZGVfdDsKKyMgIGlmICFkZWZpbmVkKF9XSU4zMl9XQ0UpCisjICAgIGRlZmluZSBzdHJ0b2xsIF9zdHJ0b2k2NAorIyAgICBkZWZpbmUgc3RydG91bGwgX3N0cnRvdWk2NAorIyAgICBkZWZpbmUgSEFWRV9TVFJUT0xMIDEKKyMgICAgZGVmaW5lIEhBVkVfU1RSVE9VTEwgMQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgkvLyBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCisKKyNpZmRlZiBpbnRlcmZhY2UKKyN1bmRlZiBpbnRlcmZhY2UKKyNlbmRpZgorCisjaWZuZGVmIFNJR0hVUAorI2RlZmluZSBTSUdIVVAJMQorI2VuZGlmCisKKyNjbWFrZWRlZmluZSBEQlVTX1ZFUkJPU0VfQ19TIDEKKyNpZmRlZiBEQlVTX1ZFUkJPU0VfQ19TCisjZGVmaW5lIF9kYnVzX3ZlcmJvc2VfQ19TIHByaW50ZgorI2Vsc2UKKyNkZWZpbmUgX2RidXNfdmVyYm9zZV9DX1MgX2RidXNfdmVyYm9zZQorI2VuZGlmIAorCisjIGlmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKGlubGluZSkKKyNkZWZpbmUgaW5saW5lIF9faW5saW5lCisjZW5kaWYKKworI2VuZGlmICAvLyBfREJVU19DT05GSUdfSApkaWZmIC0tZ2l0IGEvZGJ1cy9jbWFrZS9jcm9zcy1jb21waWxlLnNoIGIvZGJ1cy9jbWFrZS9jcm9zcy1jb21waWxlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ5ZTY2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2NtYWtlL2Nyb3NzLWNvbXBpbGUuc2gKQEAgLTAsMCArMSwxMTAgQEAKKyMhL2Jpbi9zaAorIworIyAgY3Jvc3MgY29tcGlsZSBzY3JpcHQgZm9yIGNtYWtlCisjIAorIyBpbml0aWFsIHdyaXR0ZW4gYnkgRnJpZHJpY2ggU3RyYmEKKyMgcmVmYWN0b3JlZCB0byBkZWJpYW4vbGVubnkgYnkgUmFsZiBIYWJhY2tlcgorIworIyAgcmVwb3J0ZWQgdG8gd29yayBhdCBsZWFzdCBvbiBkZWJpYW4vbGVubnkgCisjIAorCitpZiB0ZXN0IC1mIC91c3IvYmluL2k2ODYtcGMtbWluZ3czMi1nY2M7IHRoZW4KKyAgICBjcm9zc19jYz1pNjg2LXBjLW1pbmd3MzIKK2VsaWYgdGVzdCAtZiAvdXNyL2Jpbi9pNTg2LW1pbmd3MzJtc3ZjLWdjYzsgdGhlbgorICAgIGNyb3NzX2NjPWk1ODYtbWluZ3czMm1zdmMKK2Vsc2UKKyAgICBlY2hvICJjb3VsZCBub3QgZGV0ZXJtaW5lIG1pbmd3IGNyb3NzIGNvbXBpbGVyIgorICAgIGV4aXQgMQorZmkKKworaWYgdGVzdCAtZCB+LyRjcm9zc19jYzsgdGhlbgorICAgIGNyb3NzX3Jvb3Q9fi8kY3Jvc3NfY2MKK2VsaWYgdGVzdCAtZCAvdXNyLyRjcm9zc19jYy9zeXMtcm9vdC9taW5ndzsgdGhlbgorICAgIGNyb3NzX3Jvb3Q9L3Vzci8kY3Jvc3NfY2Mvc3lzLXJvb3QvbWluZ3cKK2VsaWYgdGVzdCAtZCAvdXNyLyRjcm9zc19jYy9saWI7IHRoZW4KKyAgICBjcm9zc19yb290PS91c3IvJGNyb3NzX2NjCitlbHNlCisgICAgZWNobyAiY291bGQgbm90IGRldGVybWluZSBtaW5ndyBjcm9zcyBjb21waWxlciBzZGsiCisgICAgZXhpdCAxCitmaQorCitpZiAhIFRFTVA9YG1rdGVtcCAtLXRtcGRpciAtZCBkYnVzLWNyb3NzLWNvbXBpbGUuWFhYWFhYYDsgdGhlbgorICAgIGVjaG8gIm1rdGVtcCBmYWlsZWQsIHRyeSB3aXRoIGNvcmV1dGlscyA2LjEwIG9yIGxhdGVyPyIgPiYyCisgICAgZXhpdCAxCitmaQorCisjIG1ha2UgY21ha2UgaGFwcHkgCitleHBvcnQgVEVNUAorCitIT1NUX0NDPWdjYzsgZXhwb3J0IEhPU1RfQ0M7CisKK2lmIHRlc3QgLWQgJGNyb3NzX3Jvb3QvbGliL3BrZ2NvbmZpZzsgdGhlbiAKKyAgICBQS0dfQ09ORklHX1BBVEg9IiRjcm9zc19yb290L2xpYi9wa2djb25maWc6JGNyb3NzX3Jvb3Qvc2hhcmUvcGtnY29uZmlnIjsgZXhwb3J0IFBLR19DT05GSUdfUEFUSDsKK2ZpIAorCitpZiB0ZXN0IC1kICIkTUlOR1czMl9DTEFTU1BBVEgiIHx8ICB0ZXN0IC1mICIkY3Jvc3Nfcm9vdC9zaGFyZS9qYXZhL2xpYmdjai5qYXIiOyAgdGhlbiAKKyAgICBDTEFTU1BBVEg9IiRDTEFTU1BBVEg6JHtNSU5HVzMyX0NMQVNTUEFUSDotJGNyb3NzX3Jvb3Qvc2hhcmUvamF2YS9saWJnY2ouamFyOiRjcm9zc19yb290L3NoYXJlL2phdmEvbGliZ2NqLXRvb2xzLmphcn0iOyBleHBvcnQgQ0xBU1NQQVRIOworZmkKKworX1BSRUZJWD0iL3Vzci9iaW4vJGNyb3NzX2NjLSI7Citmb3IgaSBpbiBgbHMgLTEgJHtfUFJFRklYfSogfCBncmVwIC12ICdnY2MtJ2A7IGRvCisgICAgeD1gZWNobyAkaXxzZWQgInMsJHtfUFJFRklYfSwsInxzZWQgInMsXC5hd2sqLCwifHRyICJhLXorLSIgIkEtWlhfImA7CisgICAgZGVjbGFyZSAteCAkeD0iJGkiIDsgZXhwb3J0ICR4OworZG9uZTsKK3Vuc2V0IF9QUkVGSVg7CisKK0NDPSIke01JTkdXMzJfQ0M6LSRjcm9zc19jYy1nY2N9IjsgZXhwb3J0IENDOworQ0ZMQUdTPSIke01JTkdXMzJfQ0ZMQUdTOi0tTzIgLWcgLXBpcGUgLVdhbGwgLWZleGNlcHRpb25zIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAtLXBhcmFtPXNzcC1idWZmZXItc2l6ZT00IC1tbXMtYml0ZmllbGRzfSI7IGV4cG9ydCBDRkxBR1M7CitMREZMQUdTPSIke01JTkdXMzJfTERGTEFHUzotLVdsLC0tZXhjbHVkZS1saWJzPWxpYmludGwuYSAtV2wsLS1leGNsdWRlLWxpYnM9bGliaWNvbnYuYX0iOyBleHBvcnQgTERGTEFHUzsKKworaWYgWyAteCAiL3Vzci9iaW4vJGNyb3NzX2NjLWcrKyIgXTsgdGhlbgorICAgIENYWD0iJHtNSU5HVzMyX0NYWDotJGNyb3NzX2NjLWcrK30iOyBleHBvcnQgQ1hYOworICAgIENYWEZMQUdTPSIke01JTkdXMzJfQ1hYRkxBR1M6LS1PMiAtZyAtcGlwZSAtV2FsbCAtZmV4Y2VwdGlvbnMgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzIC0tcGFyYW09c3NwLWJ1ZmZlci1zaXplPTQgLW1tcy1iaXRmaWVsZHN9IjsgZXhwb3J0IENYWEZMQUdTOworZWxzZQorICAgIENYWD07IGV4cG9ydCBDWFg7CisgICAgYWNfY3ZfcHJvZ19DWFg9bm87IGV4cG9ydCBhY19jdl9wcm9nX0NYWDsKKyAgICBDWFhGTEFHUz07IGV4cG9ydCBDWFhGTEFHUzsKK2ZpOworZm9yIGkgaW4gYGxzICRjcm9zc19yb290L2Jpbi8qfGdyZXAgLS0gIi1jb25maWckImAgOyBkbworICAgIHg9YGJhc2VuYW1lICRpfHRyICJhLXorLSIgIkEtWlhfInxzZWQgInMsXC4sLCJgOworICAgIGRlY2xhcmUgLXggJHg9IiRpIiA7IGV4cG9ydCAkeDsKK2RvbmU7Cit1bnNldCB4IGkgOworCitpZiAhIHRlc3QgLWYgIiRjcm9zc19yb290L2xpYi9saWJleHBhdC5kbGwuYSI7IHRoZW4KKyAgICAoY2QgJFRFTVAgJiYgd2dldCBodHRwOi8vd3d3LndpbmtkZS5vcmcvcHViL2tkZS9wb3J0cy93aW4zMi9yZXBvc2l0b3J5L3dpbjMybGlicy9leHBhdC0yLjAuMS1iaW4uemlwKQorICAgIChjZCAkVEVNUCAmJiB3Z2V0IGh0dHA6Ly93d3cud2lua2RlLm9yZy9wdWIva2RlL3BvcnRzL3dpbjMyL3JlcG9zaXRvcnkvd2luMzJsaWJzL2V4cGF0LTIuMC4xLWxpYi56aXApCisgICAgKGNkICRjcm9zc19yb290ICYmIHVuemlwIC14ICRUTVAvZXhwYXQtMi4wLjEtYmluLnppcCkKKyAgICAoY2QgJGNyb3NzX3Jvb3QgJiYgdW56aXAgLXggJFRNUC9leHBhdC0yLjAuMS1saWIuemlwKQorZmkgCisKK2lmIHRlc3QgLWYgIiRjcm9zc19yb290L2xpYi9saWJleHBhdC5kbGwuYSI7IHRoZW4KKyAgICB4bWxfbGlicmFyeT0tRERCVVNfVVNFX0VYUEFUPU9uIC1ETElCRVhQQVRfSU5DTFVERV9ESVI6UEFUSD0kY3Jvc3Nfcm9vdC9pbmNsdWRlIC1ETElCRVhQQVRfTElCUkFSSUVTOlBBVEg9JGNyb3NzX3Jvb3QvbGliL2xpYmV4cGF0LmRsbC5hIAorZWxzZQorICAgIGVjaG8gImNvdWxkIG5vdCBmaW5kIGEgY3Jvc3MgY29tcGlsZSB4bWwgbGlicmFyYXkiCisgICAgZXhpdCAxCitmaQorCitjbWFrZSBcCisgICAgLURDTUFLRV9TWVNURU1fTkFNRT0iV2luZG93cyIgXAorICAgIC1EQ01BS0VfVkVSQk9TRV9NQUtFRklMRT1PTiBcCisgICAgLURDTUFLRV9JTlNUQUxMX1BSRUZJWDpQQVRIPSRjcm9zc19yb290IFwKKyAgICAtRENNQUtFX0lOU1RBTExfTElCRElSOlBBVEg9JGNyb3NzX3Jvb3QvbGliIFwKKyAgICAtRElOQ0xVREVfSU5TVEFMTF9ESVI6UEFUSD0kY3Jvc3Nfcm9vdC9pbmNsdWRlIFwKKyAgICAtRExJQl9JTlNUQUxMX0RJUjpQQVRIPSRjcm9zc19yb290L2xpYiBcCisgICAgLURTWVNDT05GX0lOU1RBTExfRElSOlBBVEg9JGNyb3NzX3Jvb3QvZXRjIFwKKyAgICAtRFNIQVJFX0lOU1RBTExfUFJFRklYOlBBVEg9JGNyb3NzX3Jvb3Qvc2hhcmUgXAorICAgIC1EQlVJTERfU0hBUkVEX0xJQlM6Qk9PTD1PTiBcCisgICAgLURDTUFLRV9DX0NPTVBJTEVSPSIvdXNyL2Jpbi8kY3Jvc3NfY2MtZ2NjIiBcCisgICAgLURDTUFLRV9DWFhfQ09NUElMRVI9Ii91c3IvYmluLyRjcm9zc19jYy1nKysiIFwKKyAgICAtRENNQUtFX0ZJTkRfUk9PVF9QQVRIPSIkY3Jvc3Nfcm9vdCIgXAorICAgIC1EQ01BS0VfRklORF9ST09UX1BBVEhfTU9ERV9MSUJSQVJZPU9OTFkgXAorICAgIC1EQ01BS0VfRklORF9ST09UX1BBVEhfTU9ERV9JTkNMVURFPU9OTFkgXAorICAgIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPSIvdXNyL2Jpbi8kY3Jvc3NfY2MtZysrIiBcCisgICAgLURDTUFLRV9GSU5EX1JPT1RfUEFUSD0iJGNyb3NzX3Jvb3QiIFwKKyAgICAtRENNQUtFX0ZJTkRfUk9PVF9QQVRIX01PREVfTElCUkFSWT1PTkxZIFwKKyAgICAtRENNQUtFX0ZJTkRfUk9PVF9QQVRIX01PREVfSU5DTFVERT1PTkxZIFwKKyAgICAkeG1sX2xpYnJhcnkgXAorICAgIC1EQ01BS0VfRklORF9ST09UX1BBVEhfTU9ERV9QUk9HUkFNPU5FVkVSIFwKKyAgICAkKgorCmRpZmYgLS1naXQgYS9kYnVzL2NtYWtlL2RidXMtZW52LmJhdC5jbWFrZSBiL2RidXMvY21ha2UvZGJ1cy1lbnYuYmF0LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZjcwMDUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2NtYWtlL2RidXMtZW52LmJhdC5jbWFrZQpAQCAtMCwwICsxLDggQEAKKzo6IGVudmlyb25tZW50IHNldHRpbmcgZm9yIGRidXMgY2xpZW50cworQGVjaG8gb2ZmCisKKzo6IHNlc3Npb24gYnVzIGFkZHJlc3MKK3NldCBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1M9QERCVVNfU0VTU0lPTl9CVVNfREVGQVVMVF9BRERSRVNTQAorCis6OiBzeXN0ZW0gYnVzIGFkZHJlc3MKK3NldCBEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTPUBEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTQCAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kYnVzL2NtYWtlL2RidXMvQ01ha2VMaXN0cy50eHQgYi9kYnVzL2NtYWtlL2RidXMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA5ZTYzZAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvY21ha2UvZGJ1cy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDMxMyBAQAorcHJvamVjdChkYnVzLWxpYikKKworU0VUKERCVVNfRElSICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vZGJ1cykKKworY29uZmlndXJlX2ZpbGUoJHtEQlVTX0RJUn0vZGJ1cy1hcmNoLWRlcHMuaC5pbiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZGJ1cy1hcmNoLWRlcHMuaCApCisKK2FkZF9kZWZpbml0aW9ucygtRERCVVNfQ09NUElMQVRJT04pCisKK3NldCAoZGJ1c2luY2x1ZGVfSEVBREVSUworCSR7REJVU19ESVJ9L2RidXMuaAorCSR7REJVU19ESVJ9L2RidXMtYWRkcmVzcy5oCisJJHtEQlVTX0RJUn0vZGJ1cy1idXMuaAorCSR7REJVU19ESVJ9L2RidXMtY29ubmVjdGlvbi5oCisJJHtEQlVTX0RJUn0vZGJ1cy1lcnJvcnMuaAorCSR7REJVU19ESVJ9L2RidXMtbWFjcm9zLmgKKwkke0RCVVNfRElSfS9kYnVzLW1lbW9yeS5oCisJJHtEQlVTX0RJUn0vZGJ1cy1tZXNzYWdlLmgKKwkke0RCVVNfRElSfS9kYnVzLW1pc2MuaAorCSR7REJVU19ESVJ9L2RidXMtcGVuZGluZy1jYWxsLmgKKwkke0RCVVNfRElSfS9kYnVzLXByb3RvY29sLmgKKwkke0RCVVNfRElSfS9kYnVzLXNlcnZlci5oCisJJHtEQlVTX0RJUn0vZGJ1cy1zaGFyZWQuaAorCSR7REJVU19ESVJ9L2RidXMtc2lnbmF0dXJlLmgKKwkke0RCVVNfRElSfS9kYnVzLXN5bnRheC5oCisJJHtEQlVTX0RJUn0vZGJ1cy10aHJlYWRzLmgKKwkke0RCVVNfRElSfS9kYnVzLXR5cGVzLmgKKwlkYnVzLWFyY2gtZGVwcy5oCispCisKKyMjIyBzb3VyY2UgY29kZSB0aGF0IGdvZXMgaW4gdGhlIGluc3RhbGxlZCBjbGllbnQgbGlicmFyeQorIyMjIGFuZCBpcyBzcGVjaWZpYyB0byBsaWJyYXJ5IGZ1bmN0aW9uYWxpdHkKK3NldCAoREJVU19MSUJfU09VUkNFUworCSR7REJVU19ESVJ9L2RidXMtYWRkcmVzcy5jCisJJHtEQlVTX0RJUn0vZGJ1cy1hdXRoLmMKKwkke0RCVVNfRElSfS9kYnVzLWJ1cy5jCisJJHtEQlVTX0RJUn0vZGJ1cy1jb25uZWN0aW9uLmMKKwkke0RCVVNfRElSfS9kYnVzLWNyZWRlbnRpYWxzLmMKKwkke0RCVVNfRElSfS9kYnVzLWVycm9ycy5jCisJJHtEQlVTX0RJUn0vZGJ1cy1rZXlyaW5nLmMKKwkke0RCVVNfRElSfS9kYnVzLW1hcnNoYWwtaGVhZGVyLmMKKwkke0RCVVNfRElSfS9kYnVzLW1hcnNoYWwtYnl0ZXN3YXAuYworCSR7REJVU19ESVJ9L2RidXMtbWFyc2hhbC1yZWN1cnNpdmUuYworCSR7REJVU19ESVJ9L2RidXMtbWFyc2hhbC12YWxpZGF0ZS5jCisJJHtEQlVTX0RJUn0vZGJ1cy1tZXNzYWdlLmMKKwkke0RCVVNfRElSfS9kYnVzLW1pc2MuYworCSR7REJVU19ESVJ9L2RidXMtbm9uY2UuYworCSR7REJVU19ESVJ9L2RidXMtb2JqZWN0LXRyZWUuYworCSR7REJVU19ESVJ9L2RidXMtcGVuZGluZy1jYWxsLmMKKwkke0RCVVNfRElSfS9kYnVzLXJlc291cmNlcy5jCisJJHtEQlVTX0RJUn0vZGJ1cy1zZXJ2ZXIuYworCSR7REJVU19ESVJ9L2RidXMtc2VydmVyLXNvY2tldC5jCisJJHtEQlVTX0RJUn0vZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5jCisJJHtEQlVTX0RJUn0vZGJ1cy1zaGEuYworCSR7REJVU19ESVJ9L2RidXMtc2lnbmF0dXJlLmMKKwkke0RCVVNfRElSfS9kYnVzLXN5bnRheC5jCisJJHtEQlVTX0RJUn0vZGJ1cy10aW1lb3V0LmMKKwkke0RCVVNfRElSfS9kYnVzLXRocmVhZHMuYworCSR7REJVU19ESVJ9L2RidXMtdHJhbnNwb3J0LmMKKwkke0RCVVNfRElSfS9kYnVzLXRyYW5zcG9ydC1zb2NrZXQuYworCSR7REJVU19ESVJ9L2RidXMtd2F0Y2guYworKQorCisKK2lmKFVOSVgpCisJc2V0IChEQlVTX0xJQl9TT1VSQ0VTICR7REJVU19MSUJfU09VUkNFU30gCisJCSR7REJVU19ESVJ9L2RidXMtdHJhbnNwb3J0LXVuaXguYworCQkke0RCVVNfRElSfS9kYnVzLXNlcnZlci11bml4LmMKKwkpCitlbHNlKFVOSVgpCisJc2V0IChEQlVTX0xJQl9TT1VSQ0VTICR7REJVU19MSUJfU09VUkNFU30gCisJCSR7REJVU19ESVJ9L2RidXMtdHJhbnNwb3J0LXdpbi5jCisJCSR7REJVU19ESVJ9L2RidXMtc2VydmVyLXdpbi5jCisJKQorZW5kaWYoVU5JWCkKKworc2V0IChEQlVTX0xJQl9IRUFERVJTCisJJHtEQlVTX0RJUn0vZGJ1cy1hdXRoLmgKKwkke0RCVVNfRElSfS9kYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaAorCSR7REJVU19ESVJ9L2RidXMtY3JlZGVudGlhbHMuaAorCSR7REJVU19ESVJ9L2RidXMta2V5cmluZy5oCisJJHtEQlVTX0RJUn0vZGJ1cy1tYXJzaGFsLWhlYWRlci5oCisJJHtEQlVTX0RJUn0vZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmgKKwkke0RCVVNfRElSfS9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmgKKwkke0RCVVNfRElSfS9kYnVzLW1hcnNoYWwtdmFsaWRhdGUuaAorCSR7REJVU19ESVJ9L2RidXMtbWVzc2FnZS1pbnRlcm5hbC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1tZXNzYWdlLXByaXZhdGUuaAorCSR7REJVU19ESVJ9L2RidXMtbWlzYy5oCisJJHtEQlVTX0RJUn0vZGJ1cy1vYmplY3QtdHJlZS5oCisJJHtEQlVTX0RJUn0vZGJ1cy1wcm90b2NvbC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1yZXNvdXJjZXMuaAorCSR7REJVU19ESVJ9L2RidXMtc2VydmVyLWRlYnVnLXBpcGUuaAorCSR7REJVU19ESVJ9L2RidXMtc2VydmVyLXByb3RlY3RlZC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1zZXJ2ZXItdW5peC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1zaGEuaAorCSR7REJVU19ESVJ9L2RidXMtdGltZW91dC5oCisJJHtEQlVTX0RJUn0vZGJ1cy10aHJlYWRzLmgKKwkke0RCVVNfRElSfS9kYnVzLXRocmVhZHMtaW50ZXJuYWwuaAorCSR7REJVU19ESVJ9L2RidXMtdHJhbnNwb3J0LmgKKwkke0RCVVNfRElSfS9kYnVzLXRyYW5zcG9ydC1wcm90ZWN0ZWQuaAorCSR7REJVU19ESVJ9L2RidXMtd2F0Y2guaAorCSR7Q01BS0VfQklOQVJZX0RJUn0vY29uZmlnLmgKKykKK2lmKFVOSVgpCisJc2V0IChEQlVTX0xJQl9IRUFERVJTICR7REJVU19MSUJfSEVBREVSU30gCisJCSR7REJVU19ESVJ9L2RidXMtdHJhbnNwb3J0LXVuaXguaAorCSkKK2Vsc2UoVU5JWCkKKwlzZXQgKERCVVNfTElCX0hFQURFUlMgJHtEQlVTX0xJQl9IRUFERVJTfSAKKwkJJHtEQlVTX0RJUn0vZGJ1cy10cmFuc3BvcnQtd2luLmgKKwkpCitlbmRpZihVTklYKQorCisKKyMjIyBzb3VyY2UgY29kZSB0aGF0IGdvZXMgaW4gdGhlIGluc3RhbGxlZCBjbGllbnQgbGlicmFyeQorIyMjIEFORCBpcyBnZW5lcmljIHV0aWxpdHkgZnVuY3Rpb25hbGl0eSB1c2VkIGJ5IHRoZSAKKyMjIyBkYWVtb24gb3IgdGVzdCBwcm9ncmFtcyAoYWxsIHN5bWJvbHMgaW4gaGVyZSBzaG91bGQgCisjIyMgYmUgdW5kZXJzY29yZS1wcmVmaXhlZCkKK3NldCAoREJVU19TSEFSRURfU09VUkNFUworCSR7REJVU19ESVJ9L2RidXMtZGF0YXNsb3QuYworCSR7REJVU19ESVJ9L2RidXMtZmlsZS5jCisJJHtEQlVTX0RJUn0vZGJ1cy1oYXNoLmMKKwkke0RCVVNfRElSfS9kYnVzLWludGVybmFscy5jCisJJHtEQlVTX0RJUn0vZGJ1cy1saXN0LmMKKwkke0RCVVNfRElSfS9kYnVzLW1hcnNoYWwtYmFzaWMuYworCSR7REJVU19ESVJ9L2RidXMtbWVtb3J5LmMKKwkke0RCVVNfRElSfS9kYnVzLW1lbXBvb2wuYworCSR7REJVU19ESVJ9L2RidXMtc3RyaW5nLmMKKwkke0RCVVNfRElSfS9kYnVzLXN5c2RlcHMuYworCSR7REJVU19ESVJ9L2RidXMtcGlwZS5jCispCisKK3NldCAoREJVU19TSEFSRURfSEVBREVSUworCSR7REJVU19ESVJ9L2RidXMtZGF0YXNsb3QuaAorCSR7REJVU19ESVJ9L2RidXMtZmlsZS5oCisJJHtEQlVTX0RJUn0vZGJ1cy1oYXNoLmgKKwkke0RCVVNfRElSfS9kYnVzLWludGVybmFscy5oCisJJHtEQlVTX0RJUn0vZGJ1cy1saXN0LmgKKwkke0RCVVNfRElSfS9kYnVzLW1hcnNoYWwtYmFzaWMuaAorCSR7REJVU19ESVJ9L2RidXMtbWVtcG9vbC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1zdHJpbmcuaAorCSR7REJVU19ESVJ9L2RidXMtc3RyaW5nLXByaXZhdGUuaAorCSR7REJVU19ESVJ9L2RidXMtcGlwZS5oCisJJHtEQlVTX0RJUn0vZGJ1cy1zeXNkZXBzLmgKKykKKworIyMjIHNvdXJjZSBjb2RlIHRoYXQgaXMgZ2VuZXJpYyB1dGlsaXR5IGZ1bmN0aW9uYWxpdHkgdXNlZAorIyMjIGJ5IHRoZSBidXMgZGFlbW9uIG9yIHRlc3QgYXBwcywgYnV0IGlzIE5PVCBpbmNsdWRlZAorIyMjIGluIHRoZSBELUJVUyBjbGllbnQgbGlicmFyeSAoYWxsIHN5bWJvbHMgaW4gaGVyZSAKKyMjIyBzaG91bGQgYmUgdW5kZXJzY29yZS1wcmVmaXhlZCBidXQgZG9uJ3QgcmVhbGx5IG5lZWQgCisjIyMgdG8gYmUgdW5sZXNzIHRoZXkgbW92ZSB0byBEQlVTX1NIQVJFRF9TT1VSQ0VTIGxhdGVyKQorc2V0IChEQlVTX1VUSUxfU09VUkNFUworCSR7REJVU19ESVJ9L2RidXMtYXV0aC1zY3JpcHQuYworCSR7REJVU19ESVJ9L2RidXMtYXV0aC11dGlsLmMKKwkke0RCVVNfRElSfS9kYnVzLWNyZWRlbnRpYWxzLXV0aWwuYworCSR7REJVU19ESVJ9L2RidXMtbWFpbmxvb3AuYworCSR7REJVU19ESVJ9L2RidXMtbWFyc2hhbC1ieXRlc3dhcC11dGlsLmMKKwkke0RCVVNfRElSfS9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLXV0aWwuYworCSR7REJVU19ESVJ9L2RidXMtbWFyc2hhbC12YWxpZGF0ZS11dGlsLmMKKwkke0RCVVNfRElSfS9kYnVzLW1lc3NhZ2UtZmFjdG9yeS5jCisJJHtEQlVTX0RJUn0vZGJ1cy1tZXNzYWdlLXV0aWwuYworCSR7REJVU19ESVJ9L2RidXMtc2hlbGwuYworCSR7REJVU19ESVJ9L2RidXMtc29ja2V0LXNldC5jCisJJHtEQlVTX0RJUn0vZGJ1cy1zb2NrZXQtc2V0LXBvbGwuYworCSR7REJVU19ESVJ9L2RidXMtc3RyaW5nLXV0aWwuYworCSR7REJVU19ESVJ9L2RidXMtc3lzZGVwcy11dGlsLmMKKykKKworaWYgKERCVVNfQlVJTERfVEVTVFMpCisJc2V0IChEQlVTX1VUSUxfU09VUkNFUyAKKwkJJHtEQlVTX1VUSUxfU09VUkNFU30KKwkJJHtEQlVTX0RJUn0vZGJ1cy10ZXN0LmMKKwkpCitlbmRpZiAoREJVU19CVUlMRF9URVNUUykKKworc2V0IChEQlVTX1VUSUxfSEVBREVSUworCSR7REJVU19ESVJ9L2RidXMtYXV0aC1zY3JpcHQuaAorCSR7REJVU19ESVJ9L2RidXMtbWFpbmxvb3AuaAorCSR7REJVU19ESVJ9L2RidXMtbWVzc2FnZS1mYWN0b3J5LmgKKwkke0RCVVNfRElSfS9kYnVzLXNoZWxsLmgKKwkke0RCVVNfRElSfS9kYnVzLXNvY2tldC1zZXQuaAorCSR7REJVU19ESVJ9L2RidXMtc3Bhd24uaAorCSR7REJVU19ESVJ9L2RidXMtdGVzdC5oCispCisKKyMjIyBwbGF0Zm9ybSBzcGVjaWZpYyBzZXR0aW5ncworaWYgKFdJTjMyKQorCXNldCAoREJVU19TSEFSRURfU09VUkNFUyAke0RCVVNfU0hBUkVEX1NPVVJDRVN9IAorCQkke0RCVVNfRElSfS9kYnVzLWZpbGUtd2luLmMKKwkJJHtEQlVTX0RJUn0vZGJ1cy1zeXNkZXBzLXdpbi5jCisJCSR7REJVU19ESVJ9L2RidXMtcGlwZS13aW4uYworCQkke0RCVVNfRElSfS9kYnVzLXN5c2RlcHMtdGhyZWFkLXdpbi5jCisJKQorCXNldCAoREJVU19TSEFSRURfSEVBREVSUyAke0RCVVNfU0hBUkVEX0hFQURFUlN9IAorCQkke0RCVVNfRElSfS9kYnVzLXNvY2tldHMtd2luLmgKKwkJJHtEQlVTX0RJUn0vZGJ1cy1zeXNkZXBzLXdpbi5oCisJKQorCXNldCAoREJVU19VVElMX1NPVVJDRVMgJHtEQlVTX1VUSUxfU09VUkNFU30KKwkJJHtEQlVTX0RJUn0vZGJ1cy1zcGF3bi13aW4uYworCQkke0RCVVNfRElSfS9kYnVzLXN5c2RlcHMtdXRpbC13aW4uYworCSkKKwlpZihXSU5DRSkKKwlzZXQgKERCVVNfU0hBUkVEX1NPVVJDRVMgJHtEQlVTX1NIQVJFRF9TT1VSQ0VTfQorCQkke0RCVVNfRElSfS9kYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5jCisJKQorCXNldCAoREJVU19TSEFSRURfSEVBREVSUyAke0RCVVNfU0hBUkVEX0hFQURFUlN9CisJCSR7REJVU19ESVJ9L2RidXMtc3lzZGVwcy13aW5jZS1nbHVlLmgKKwkpCisJZW5kaWYoV0lOQ0UpCitlbHNlIChXSU4zMikKKwlzZXQgKERCVVNfU0hBUkVEX1NPVVJDRVMgJHtEQlVTX1NIQVJFRF9TT1VSQ0VTfSAKKwkJJHtEQlVTX0RJUn0vZGJ1cy1maWxlLXVuaXguYworCQkke0RCVVNfRElSfS9kYnVzLXBpcGUtdW5peC5jCisJCSR7REJVU19ESVJ9L2RidXMtc3lzZGVwcy11bml4LmMKKwkJJHtEQlVTX0RJUn0vZGJ1cy1zeXNkZXBzLXB0aHJlYWQuYworCQkke0RCVVNfRElSfS9kYnVzLXVzZXJkYi5jCisgICAgICAgICR7REJVU19ESVJ9L3NkLWRhZW1vbi5jCisJKQorCXNldCAoREJVU19TSEFSRURfSEVBREVSUyAke0RCVVNfU0hBUkVEX0hFQURFUlN9IAorCQkke0RCVVNfRElSfS9kYnVzLXNlcnZlci11bml4LmgKKwkJJHtEQlVTX0RJUn0vZGJ1cy10cmFuc3BvcnQtdW5peC5oCisJCSR7REJVU19ESVJ9L2RidXMtc3lzZGVwcy11bml4LmgKKwkJJHtEQlVTX0RJUn0vZGJ1cy11c2VyZGIuaAorICAgICAgICAke0RCVVNfRElSfS9zZC1kYWVtb24uaAorCSkKKwlzZXQgKERCVVNfVVRJTF9TT1VSQ0VTICR7REJVU19VVElMX1NPVVJDRVN9CisJCSR7REJVU19ESVJ9L2RidXMtc3Bhd24uYworCQkke0RCVVNfRElSfS9kYnVzLXVzZXJkYi11dGlsLmMKKwkJJHtEQlVTX0RJUn0vZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jCisJKQorZW5kaWYgKFdJTjMyKQorCitzZXQobGliZGJ1c19TT1VSQ0VTCisJJHtEQlVTX0xJQl9TT1VSQ0VTfQorCSR7REJVU19TSEFSRURfU09VUkNFU30KKykKKworc2V0KGxpYmRidXNfSEVBREVSUyAKKwkke0RCVVNfTElCX0hFQURFUlN9CisJJHtEQlVTX1NIQVJFRF9IRUFERVJTfQorKQoraWYgKE1TVkMpCisgICAgc2V0IChCVUlMRF9GSUxFVkVSU0lPTiAke0RCVVNfTUFKT1JfVkVSU0lPTn0sJHtEQlVTX01JTk9SX1ZFUlNJT059LCR7REJVU19NSUNST19WRVJTSU9OfSwke0RCVVNfUEFUQ0hfVkVSU0lPTn0pCisgICAgc2V0IChCVUlMRF9USU1FU1RBTVAgJHtEQlVTX0JVSUxEX1RJTUVTVEFNUH0pCisgICAgCisgICAgY29uZmlndXJlX2ZpbGUoJHtEQlVTX0RJUn0vdmVyc2lvbmluZm8ucmMuaW4gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3ZlcnNpb25pbmZvLnJjKQorICAgIGZpbGUoV1JJVEUgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2FmeHJlcy5oICIiKQorICAgIGxpc3QoQVBQRU5EIGxpYmRidXNfU09VUkNFUyB2ZXJzaW9uaW5mby5yYykKKyAgICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXModmVyc2lvbmluZm8ucmMgQ09NUElMRV9GTEFHUyAiLURfX0xJTkVfXz0xIikKK2VuZGlmIChNU1ZDKQorCitpZihNU1ZDX0lERSkKKwlwcm9qZWN0X3NvdXJjZV9ncm91cCgke0dST1VQX0NPREV9IERCVVNfTElCX1NPVVJDRVMgREJVU19MSUJfSEVBREVSUykKKwlwcm9qZWN0X3NvdXJjZV9ncm91cCgke0dST1VQX0NPREV9IERCVVNfU0hBUkVEX1NPVVJDRVMgREJVU19TSEFSRURfSEVBREVSUykKKwlwcm9qZWN0X3NvdXJjZV9ncm91cCgke0dST1VQX0NPREV9IERCVVNfVVRJTF9TT1VSQ0VTIERCVVNfVVRJTF9TT1VSQ0VTKQorZW5kaWYoTVNWQ19JREUpCisKKyMjIyBDbGllbnQgbGlicmFyeQorCithZGRfbGlicmFyeShkYnVzLTEgU0hBUkVECisJCQkke2xpYmRidXNfU09VUkNFU30KKwkJCSR7bGliZGJ1c19IRUFERVJTfQorKQoraWYoV0lOMzIpCisgICAgaWYoV0lOQ0UpCisgICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhkYnVzLTEgd3MyKQorICAgIGVsc2UoV0lOQ0UpCisgICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhkYnVzLTEgd3MyXzMyIGFkdmFwaTMyIG5ldGFwaTMyKQorICAgIGVuZGlmKFdJTkNFKQorZWxzZShXSU4zMikKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy0xICR7Q01BS0VfVEhSRUFEX0xJQlNfSU5JVH0pCitlbmRpZihXSU4zMikKKworaW5zdGFsbF90YXJnZXRzKC9saWIgZGJ1cy0xICkKK2luc3RhbGxfZmlsZXMoL2luY2x1ZGUvZGJ1cyBGSUxFUyAke2RidXNpbmNsdWRlX0hFQURFUlN9KQorCisjIyMgSW50ZXJuYWwgbGlicmFyeSwgdXNlZCBmb3IgdGhlIGRhZW1vbiwgdG9vbHMgYW5kIHRlc3RzLCBjb21waWxlZCBzdGF0aWNhbGx5LgorCithZGRfbGlicmFyeShkYnVzLWludGVybmFsICR7REJVU19JTlRFUk5BTF9BRERfTElCUkFSWV9PUFRJT05TfQorCQkJJHtEQlVTX0xJQl9TT1VSQ0VTfQorCQkJJHtEQlVTX0xJQl9IRUFERVJTfQorCQkJJHtEQlVTX1NIQVJFRF9TT1VSQ0VTfQorCQkJJHtEQlVTX1NIQVJFRF9IRUFERVJTfQorCQkJJHtEQlVTX1VUSUxfU09VUkNFU30KKwkJCSR7REJVU19VVElMX0hFQURFUlN9CispCit0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy1pbnRlcm5hbCkKK3NldF90YXJnZXRfcHJvcGVydGllcyhkYnVzLWludGVybmFsIFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAke0RCVVNfSU5URVJOQUxfTElCUkFSWV9ERUZJTklUSU9OU30pCitpZihXSU4zMikKKyAgICBpZihXSU5DRSkKKyAgICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGRidXMtaW50ZXJuYWwgd3MyKQorICAgIGVsc2UoV0lOQ0UpCisgICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhkYnVzLWludGVybmFsIHdzMl8zMiBhZHZhcGkzMiBuZXRhcGkzMikKKyAgICBlbmRpZihXSU5DRSkKK2Vsc2UoV0lOMzIpCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGRidXMtaW50ZXJuYWwgJHtDTUFLRV9USFJFQURfTElCU19JTklUfSkKK2VuZGlmKFdJTjMyKQorCitpZiAoREJVU19CVUlMRF9URVNUUykKKwlzZXQgKFRFU1RTX0VOVklST05NRU5UICJEQlVTX1RFU1RfREFUQT0ke0NNQUtFX1NPVVJDRV9ESVJ9L3Rlc3QvZGF0YSBEQlVTX1RFU1RfSE9NRURJUj0ke0NNQUtFX0JVSUxEX0RJUn0vZGJ1cyIpCisJQUREX0VYRUNVVEFCTEUoZGJ1cy10ZXN0ICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vZGJ1cy9kYnVzLXRlc3QtbWFpbi5jKQorCXRhcmdldF9saW5rX2xpYnJhcmllcyhkYnVzLXRlc3QgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30pCisJYWRkX3Rlc3QoZGJ1cy10ZXN0ICR7RVhFQ1VUQUJMRV9PVVRQVVRfUEFUSH0vZGJ1cy10ZXN0ICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC9kYXRhKQorCXNldF90YXJnZXRfcHJvcGVydGllcyhkYnVzLXRlc3QgUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICR7REJVU19JTlRFUk5BTF9DTElFTlRfREVGSU5JVElPTlN9KQorRU5ESUYgKERCVVNfQlVJTERfVEVTVFMpCisKK2lmIChVTklYKQorIyBzZXQgdmVyc2lvbiBpbmZvCitFTkRJRiAoVU5JWCkKKworCisjIyBtb3AgdXAgdGhlIGdjb3YgZmlsZXMKKyNjbGVhbi1sb2NhbDoKKyMvYmluL3JtICouYmIgKi5iYmcgKi5kYSAqLmdjb3YgLmxpYnMvKi5kYSAubGlicy8qLmJiZyB8fCB0cnVlCmRpZmYgLS1naXQgYS9kYnVzL2NtYWtlL2RvYy9DTWFrZUxpc3RzLnR4dCBiL2RidXMvY21ha2UvZG9jL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNmI1ODcKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2NtYWtlL2RvYy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDEyMCBAQAorZmluZF9wYWNrYWdlKERveHlnZW4pCisKK2lmKERPWFlHRU5fRVhFQ1VUQUJMRSkKKyAgT1BUSU9OKERCVVNfRU5BQkxFX0RPWFlHRU5fRE9DUyAiYnVpbGQgRE9YWUdFTiBkb2N1bWVudGF0aW9uIChyZXF1aXJlcyBEb3h5Z2VuKSIgT04pCitlbmRpZihET1hZR0VOX0VYRUNVVEFCTEUpCisKK2lmIChEQlVTX0VOQUJMRV9ET1hZR0VOX0RPQ1MpCisgICAgc2V0ICh0b3Bfc3JjZGlyICR7Q01BS0VfU09VUkNFX0RJUn0vLi4pCisgICAgY29uZmlndXJlX2ZpbGUoJHtDTUFLRV9TT1VSQ0VfRElSfS9Eb3h5ZmlsZS5jbWFrZSAke0NNQUtFX0JJTkFSWV9ESVJ9L0RveHlmaWxlICkKKyAgICBhZGRfY3VzdG9tX3RhcmdldChkb2MgCisgICAgICAgIENPTU1BTkQgJHtET1hZR0VOX0VYRUNVVEFCTEV9ICR7Q01BS0VfQklOQVJZX0RJUn0vRG94eWZpbGUKKyAgICApCitlbmRpZiAoREJVU19FTkFCTEVfRE9YWUdFTl9ET0NTKQorCisjCisjIGZpbmQgZG9jYm9vayBnZW5lcmF0b3IKKyMgCitmaW5kX3Byb2dyYW0oTUVJTlBST0M0X0VYRUNVVEFCTEUgbWVpbnByb2M0KQorCitmaW5kX3Byb2dyYW0oWE1MVE9fRVhFQ1VUQUJMRSB4bWx0bykKKworaWYgKE1FSU5QUk9DNF9FWEVDVVRBQkxFIE9SIFhNTFRPX0VYRUNVVEFCTEUpCisgIE9QVElPTihEQlVTX0VOQUJMRV9YTUxfRE9DUyAiYnVpbGQgWE1MICBkb2N1bWVudGF0aW9uIChyZXF1aXJlcyB4bWx0byBvciBtZWlucHJvYzQpIiBPTikKK2VuZGlmIChNRUlOUFJPQzRfRVhFQ1VUQUJMRSBPUiBYTUxUT19FWEVDVVRBQkxFKQorCitpZiAoTUVJTlBST0M0X0VYRUNVVEFCTEUpCisJc2V0KERPQ0JPT0tfR0VORVJBVE9SX05BTUUgIm1laW5wcm9jNCIgUEFSRU5UX1NDT1BFKQorCXNldChEQlVTX1hNTF9ET0NTX0VOQUJMRUQgMSkKKwlpZihXSU4zMikKKwkJZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChfYSAke01FSU5QUk9DNF9FWEVDVVRBQkxFfSBQQVRIKQorCQlnZXRfZmlsZW5hbWVfY29tcG9uZW50KF9tZWlucHJvY19pbnN0YWxsX3BhdGggJHtfYX0gUEFUSCkKKwllbHNlKFdJTjMyKQorCQlzZXQoX21laW5wcm9jX2luc3RhbGxfcGF0aCAke0NNQUtFX0lOU1RBTExfUFJFRklYfSkKKwllbmRpZihXSU4zMikKKwlzZXQoU1RZTEVTSEVFVCAiJHtfbWVpbnByb2NfaW5zdGFsbF9wYXRofS9zaGFyZS9hcHBzL2tzZ21sdG9vbHMyL2RvY2Jvb2sveHNsL2h0bWwvZG9jYm9vay54c2wiKQorZW5kaWYgKE1FSU5QUk9DNF9FWEVDVVRBQkxFKQorICAKKyAKK2lmIChYTUxUT19FWEVDVVRBQkxFKQorCXNldCAoRE9DQk9PS19HRU5FUkFUT1JfTkFNRSAieG1sdG8iIFBBUkVOVF9TQ09QRSkKKwlzZXQoREJVU19YTUxfRE9DU19FTkFCTEVEIDEpCisJTUVTU0FHRShTVEFUVVMgInhtbHRvIGRvY2Jvb2sgZ2VuZXJhdG9yIGZvdW5kIikKK2VuZGlmIChYTUxUT19FWEVDVVRBQkxFKQorCitpZiAoREJVU19FTkFCTEVfWE1MX0RPQ1MpCisKK21hY3JvIChET0NCT09LIF9zb3VyY2VzIF9vcHRpb25zKQorICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KF9pbmZpbGUgJHtfc291cmNlc30gQUJTT0xVVEUpCisgIGdldF9maWxlbmFtZV9jb21wb25lbnQoX2Jhc2VuYW1lICR7X2luZmlsZX0gTkFNRV9XRSkKKyAgc2V0KF9vdXRmaWxlICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8ke19iYXNlbmFtZX0uaHRtbCkKKworICBpZiAoRVhJU1RTICR7X3NvdXJjZXN9KQorCSAgaWYgKE1FSU5QUk9DNF9FWEVDVVRBQkxFKQorCQkgIEFERF9DVVNUT01fVEFSR0VUKCR7X2Jhc2VuYW1lfS5odG1sIEFMTAorCQkJJHtNRUlOUFJPQzRfRVhFQ1VUQUJMRX0gLS1zdHlsZXNoZWV0ICR7U1RZTEVTSEVFVH0gLW8gJHtfb3V0ZmlsZX0gJHtfaW5maWxlfSAKKwkJCURFUEVORFMgJHtfaW5maWxlfSAKKwkJCVdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfQorCQkpCisJICBlbmRpZiAoKQorCSAgaWYgKFhNTFRPX0VYRUNVVEFCTEUpCisJCSAgQUREX0NVU1RPTV9UQVJHRVQoJHtfYmFzZW5hbWV9Lmh0bWwgQUxMCisJCQkke1hNTFRPX0VYRUNVVEFCTEV9IC12diAke19vcHRpb25zfSAke19pbmZpbGV9IAorCQkJREVQRU5EUyAke19pbmZpbGV9IAorCQkJV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9CisJCSkKKwkgIGVuZGlmICgpCisJICBpbnN0YWxsKEZJTEVTICR7X291dGZpbGV9IERFU1RJTkFUSU9OIHNoYXJlL2RvYy9kYnVzKQorICBlbHNlICgpCisJICBNRVNTQUdFKFNUQVRVUyAic2tpcHBpbmcgeG1sIGRvYyBnZW5lcmF0aW5nIGZvciAke19pbmZpbGV9LCBmaWxlIG5vdCBmb3VuZCIpCisgIGVuZGlmICgpCisJICAKK2VuZG1hY3JvIChET0NCT09LKQorCisjIyMgY29weSB0ZXN0cyB0byBidWlsZGRpciBzbyB0aGF0IGdlbmVyYXRlZCB0ZXN0cyBhbmQgc3RhdGljIHRlc3RzIAorIyMjIGFyZSBhbGwgaW4gb25lIHBsYWNlLgorIyMjIHRvZG8gaG93IHRvIGFkZCBtb3JlIGZpbGV0eXBlcyAKK01BQ1JPIChDT1BZRElSIF9zcmMgX3R5cGUpCisgICAgRk9SRUFDSChGSUxFX1RZUEUgJHtfdHlwZX0pCisgICAgCUZPUkVBQ0goRElSICR7X3NyY30pCisgICAgCQlGSUxFKEdMT0IgRklMRVMgIiR7Q01BS0VfU09VUkNFX0RJUn0vLi4vJHtESVJ9LyR7RklMRV9UWVBFfSIgKQorICAgIAkJRklMRShNQUtFX0RJUkVDVE9SWSAke0NNQUtFX0JJTkFSWV9ESVJ9LyR7RElSfSkKKyAgICAJCUZPUkVBQ0goRklMRSAke0ZJTEVTfSkKKyAgICAJCQlHRVRfRklMRU5BTUVfQ09NUE9ORU5UKEZJTEVOQU1FICR7RklMRX0gTkFNRSkKKyAgICAJCQlTRVQgKFRBUkdFVCAke0NNQUtFX0JJTkFSWV9ESVJ9LyR7RElSfS8ke0ZJTEVOQU1FfSkKKyAgICAJCQljb25maWd1cmVfZmlsZSgke0ZJTEV9ICR7VEFSR0VUfSBDT1BZT05MWSkKKyAgICAJCQlJRiAoQ09ORklHX1ZFUkJPU0UpCisgICAgCQkJCU1FU1NBR0UoIkZST006ICR7RklMRX1cblRPOiAke1RBUkdFVH1cbiIpCisgICAgCQkJRU5ESUYgKENPTkZJR19WRVJCT1NFKQorICAgIAkJRU5ERk9SRUFDSChGSUxFKQorICAgIAlFTkRGT1JFQUNIKERJUikKKyAgICBFTkRGT1JFQUNIKEZJTEVfVFlQRSkKK0VORE1BQ1JPIChDT1BZRElSKQorCitDT1BZRElSKGRvYyAqLnBuZykKK0NPUFlESVIoZG9jICouc3ZnKQorCitET0NCT09LKCR7Q01BS0VfU09VUkNFX0RJUn0vLi4vZG9jL2RidXMtdGVzdC1wbGFuLnhtbCBodG1sLW5vY2h1bmtzKQorRE9DQk9PSygke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL2RvYy9kYnVzLXR1dG9yaWFsLnhtbCBodG1sLW5vY2h1bmtzKQorRE9DQk9PSygke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL2RvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sIGh0bWwtbm9jaHVua3MpCitET0NCT09LKCR7Q01BS0VfU09VUkNFX0RJUn0vLi4vZG9jL2RidXMtZmFxLnhtbCBodG1sLW5vY2h1bmtzKQorRE9DQk9PSygke0NNQUtFX1NPVVJDRV9ESVJ9L2J1cy9kYnVzLWRhZW1vbi54bWwgaHRtbC1ub2NodW5rcykKK0RPQ0JPT0soJHtDTUFLRV9TT1VSQ0VfRElSfS90b29scy9kYnVzLW1vbml0b3IueG1sIGh0bWwtbm9jaHVua3MpCitET0NCT09LKCR7Q01BS0VfU09VUkNFX0RJUn0vdG9vbHMvZGJ1cy1zZW5kLnhtbCBodG1sLW5vY2h1bmtzKQorRE9DQk9PSygke0NNQUtFX1NPVVJDRV9ESVJ9L3Rvb2xzL2RidXMtbGF1bmNoLnhtbCBodG1sLW5vY2h1bmtzKQorCisjCisjIGhhbmRsZSBodG1sIGluZGV4IGZpbGUKKyMKK2NvbmZpZ3VyZV9maWxlKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9pbmRleC5odG1sLmNtYWtlICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9pbmRleC5odG1sICkKK2luc3RhbGwoRklMRVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2luZGV4Lmh0bWwgREVTVElOQVRJT04gc2hhcmUvZG9jL2RidXMpCisKK3NldCAoRVhUUkFfRElTVCAJCisJJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi9kb2MvYnVzY29uZmlnLmR0ZAkJCQorCSR7Q01BS0VfU09VUkNFX0RJUn0vLi4vZG9jL2ludHJvc3BlY3QuZHRkCQkJCisJJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi9kb2MvaW50cm9zcGVjdC54c2wKKykKKworaW5zdGFsbChGSUxFUyAke0VYVFJBX0RJU1R9IERFU1RJTkFUSU9OIHNoYXJlL2RvYy9kYnVzKQorCitlbmRpZihEQlVTX0VOQUJMRV9YTUxfRE9DUykKZGlmZiAtLWdpdCBhL2RidXMvY21ha2UvZG9jL2luZGV4Lmh0bWwuY21ha2UgYi9kYnVzL2NtYWtlL2RvYy9pbmRleC5odG1sLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZGQ2NjEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2NtYWtlL2RvYy9pbmRleC5odG1sLmNtYWtlCkBAIC0wLDAgKzEsNTUgQEAKKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+RC1CdXMgRG9jdW1lbnRhdGlvbiBJbmRleDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5ELUJ1cyBEb2N1bWVudGF0aW9uIEluZGV4PC9oMT4KKzxwPlZlcnNpb24gQERCVVNfVkVSU0lPTl9TVFJJTkdAPC9wPgorCis8dGFibGU+CisgPHRyPgorICA8dGggd2lkdGg9MTAlPgorICA8L3RoPgorICA8dGggd2lkdGg9MzAlIGFsaWduPWxlZnQ+CisgICBnZW5lcmljIGRvY3VtZW50YXRpb24KKyAgPC90aD4KKyAgPHRoIHdpZHRoPTMwJSBhbGlnbj1sZWZ0PgorYXBwbGljYXRpb24gbWFudWFscworICA8L3RoPgorIDwvdHI+CisgPHRyPgorICA8dGQgdmFsaWduPXRvcD4KKyAgPC90ZD4KKyAgPHRkIHZhbGlnbj10b3A+Cis8YSBocmVmPSJodHRwOi8vZGJ1cy5mcmVlZGVza3RvcC5vcmciPkQtQnVzIFdlYnNpdGU8L2E+CisgIDxicj4KKyAgPGJyPgorPGEgaHJlZj0iZGJ1cy10dXRvcmlhbC5odG1sIj5ELUJ1cyBUdXRvcmlhbDwvYT4KKyAgPGJyPgorICA8YnI+Cis8YSBocmVmPSJkYnVzLXNwZWNpZmljYXRpb24uaHRtbCI+RC1CdXMgU3BlY2lmaWNhdGlvbjwvYT4KKyAgIDxicj4KKyAgIDxicj4KKzxhIGhyZWY9ImRidXMtZmFxLmh0bWwiPkQtQnVzIEZBUTwvYT4KKyAgIDxicj4KKyAgIDxicj4KKzxhIGhyZWY9ImRidXMtdGVzdC1wbGFuLmh0bWwiPkQtQnVzIFRlc3QgUGxhbjwvYT4KKyAgIDxicj4KKyAgIDxicj4KKyAgPC90ZD4KKyAgPHRkICB2YWxpZ249dG9wPgorPGEgaHJlZj0iZGJ1cy1kYWVtb24uaHRtbCI+RC1CdXMgRGFlbW9uIG1hbnVhbDwvYT4KKyAgIDxicj4KKyAgIDxicj4KKzxhIGhyZWY9ImRidXMtbGF1bmNoLmh0bWwiPkQtQnVzIGxhdW5jaCBtYW51YWw8L2E+CisgICA8YnI+CisgICA8YnI+Cis8YSBocmVmPSJkYnVzLXNlbmQuaHRtbCI+RC1CdXMgc2VuZCB0b29sIG1hbnVhbDwvYT4KKyAgIDxicj4KKyAgIDxicj4KKzxhIGhyZWY9ImRidXMtbW9uaXRvci5odG1sIj5ELUJ1cyBtb25pdG9yIG1hbnVhbDwvYT4KKyAgPC90ZD4KKyA8L3RyPgorPC90YWJsZT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2RidXMvY21ha2UvbW9kdWxlcy9DUGFja0luc3RhbGxDb25maWcuY21ha2UgYi9kYnVzL2NtYWtlL21vZHVsZXMvQ1BhY2tJbnN0YWxsQ29uZmlnLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MDczYTIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2NtYWtlL21vZHVsZXMvQ1BhY2tJbnN0YWxsQ29uZmlnLmNtYWtlCkBAIC0wLDAgKzEsNDQgQEAKKworaWYgKERCVVNfSU5TVEFMTF9TWVNURU1fTElCUykKKwlpZiAoTUlOR1cpCisJCWlmIChEQlVTX1VTRV9FWFBBVCkKKwkJCSMgZXhwYXQKKwkJCWluc3RhbGxfZmlsZXMoL2JpbiBGSUxFUyAke0xJQkVYUEFUX0xJQlJBUklFU30pCQorCQllbHNlIChEQlVTX1VTRV9FWFBBVCkKKwkJCSMgeG1sMgorCQkJaW5zdGFsbF9maWxlcygvYmluIEZJTEVTICR7TElCWE1MMl9MSUJSQVJJRVN9KQkKKwkJCWluc3RhbGxfZmlsZXMoL2JpbiBGSUxFUyAke0xJQklDT05WX0xJQlJBUklFU30pCQorCQllbmRpZiAoREJVU19VU0VfRVhQQVQpCisJZWxzZSAoTUlOR1cpCisJCUlOQ0xVREUoSW5zdGFsbFJlcXVpcmVkU3lzdGVtTGlicmFyaWVzKQorCWVuZGlmIChNSU5HVykKK2VuZGlmIChEQlVTX0lOU1RBTExfU1lTVEVNX0xJQlMpCisKK1NFVChDUEFDS19QQUNLQUdFX0RFU0NSSVBUSU9OX1NVTU1BUlkgIkQtQlVTIEZvciBXaW5kb3dzIikKK1NFVChDUEFDS19QQUNLQUdFX1ZFTkRPUiAiRC1CVVMgV2luZG93cyBUZWFtIikKK1NFVChDUEFDS19QQUNLQUdFX0RFU0NSSVBUSU9OX0ZJTEUgIiR7Q01BS0VfU09VUkNFX0RJUn0vLi4vUkVBRE1FIikKK1NFVChDUEFDS19SRVNPVVJDRV9GSUxFX0xJQ0VOU0UgIiR7Q01BS0VfU09VUkNFX0RJUn0vLi4vQ09QWUlORyIpCisjIGR1cGxpY2F0ZWQgZnJvbSBWRVJTSU9OCitTRVQoQ1BBQ0tfUEFDS0FHRV9WRVJTSU9OX01BSk9SICR7VkVSU0lPTl9NQUpPUn0pCitTRVQoQ1BBQ0tfUEFDS0FHRV9WRVJTSU9OX01JTk9SICR7VkVSU0lPTl9NSU5PUn0pCitTRVQoQ1BBQ0tfUEFDS0FHRV9WRVJTSU9OX1BBVENIICR7VkVSU0lPTl9QQVRDSH0pCisjU0VUKENQQUNLX1BBQ0tBR0VfSU5TVEFMTF9ESVJFQ1RPUlkgImRidXMgJHtDTWFrZV9WRVJTSU9OX01BSk9SfS4ke0NNYWtlX1ZFUlNJT05fTUlOT1J9IikKK1NFVChDUEFDS19QQUNLQUdFX0lOU1RBTExfRElSRUNUT1JZICJkYnVzIikKK0lGKFdJTjMyIEFORCBOT1QgVU5JWCkKKyAgU0VUKENQQUNLX0dFTkVSQVRPUiBOU0lTIFpJUCkgICAgICMgY2FuIGJlIE5TSVMsIFNUR1osIFRCWjIsIFRHWiwgVFogYW5kIFpJUAorICBTRVQoQ1BBQ0tfTlNJU19DT01QUkVTU09SICIvU09MSUQgbHptYSIpCisgICMgVGhlcmUgaXMgYSBidWcgaW4gTlNJIHRoYXQgZG9lcyBub3QgaGFuZGxlIGZ1bGwgdW5peCBwYXRocyBwcm9wZXJseS4gTWFrZQorICAjIHN1cmUgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHNldCBvZiBmb3VyICg0KSBiYWNrbGFzc2hlcy4KKyMgU0VUKENQQUNLX1BBQ0tBR0VfSUNPTiAiJHtDTWFrZV9TT1VSQ0VfRElSfS9VdGlsaXRpZXMvUmVsZWFzZVxcXFxJbnN0YWxsSWNvbi5ibXAiKQorICBTRVQoQ1BBQ0tfTlNJU19JTlNUQUxMRURfSUNPTl9OQU1FICJiaW5cXFxcZGJ1cy1sYXVuY2guYmF0IikKKyAgU0VUKENQQUNLX05TSVNfRElTUExBWV9OQU1FICJELUJ1cyBmb3IgV2luZG93cyIpCisgIFNFVChDUEFDS19OU0lTX0hFTFBfTElOSyAiaHR0cDpcXFxcXFxcXHNvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy93aW5kYnVzIikKKyAgU0VUKENQQUNLX05TSVNfVVJMX0lORk9fQUJPVVQgImh0dHA6XFxcXFxcXFxzb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvd2luZGJ1cyIpCisgIFNFVChDUEFDS19OU0lTX0NPTlRBQ1QgIm1lQG15LXBlcnNvbmFsLWhvbWUtcGFnZS5jb20iKQorICBTRVQoQ1BBQ0tfTlNJU19NT0RJRllfUEFUSCBPTikKK0VMU0UoV0lOMzIgQU5EIE5PVCBVTklYKQorICBTRVQoQ1BBQ0tfU1RSSVBfRklMRVMgImJpbi9NeUV4ZWN1dGFibGUiKQorICBTRVQoQ1BBQ0tfU09VUkNFX1NUUklQX0ZJTEVTICIiKQorRU5ESUYoV0lOMzIgQU5EIE5PVCBVTklYKQorU0VUKENQQUNLX1BBQ0tBR0VfRVhFQ1VUQUJMRVMgImRidXMtbGF1bmNoIiAiRC1CdXMgRGFlbW9uIikKK0lOQ0xVREUoQ1BhY2spCmRpZmYgLS1naXQgYS9kYnVzL2NtYWtlL21vZHVsZXMvQ2hlY2tGb3JBYnN0cmFjdFNvY2tldHMuYyBiL2RidXMvY21ha2UvbW9kdWxlcy9DaGVja0ZvckFic3RyYWN0U29ja2V0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MmI4NDYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2NtYWtlL21vZHVsZXMvQ2hlY2tGb3JBYnN0cmFjdFNvY2tldHMuYwpAQCAtMCwwICsxLDMzIEBACisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworaW50IG1haW4oKSB7CisgIGludCBsaXN0ZW5fZmQ7CisgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyOworCisgIGxpc3Rlbl9mZCA9IHNvY2tldCAoUEZfVU5JWCwgU09DS19TVFJFQU0sIDApOworCisgIGlmIChsaXN0ZW5fZmQgPCAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgInNvY2tldCgpIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIG1lbXNldCAoJmFkZHIsICdcMCcsIHNpemVvZiAoYWRkcikpOworICBhZGRyLnN1bl9mYW1pbHkgPSBBRl9VTklYOworICBzdHJjcHkgKGFkZHIuc3VuX3BhdGgsICJYL3RtcC9kYnVzLWZha2Utc29ja2V0LXBhdGgtdXNlZC1pbi1jb25maWd1cmUtdGVzdCIpOworICBhZGRyLnN1bl9wYXRoWzBdID0gJ1wwJzsgLyogdGhpcyBpcyB3aGF0IG1ha2VzIGl0IGFic3RyYWN0ICovCisKKyAgaWYgKGJpbmQgKGxpc3Rlbl9mZCwgKHN0cnVjdCBzb2NrYWRkciopICZhZGRyLCBTVU5fTEVOICgmYWRkcikpIDwgMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJBYnN0cmFjdCBzb2NrZXQgbmFtZXNwYWNlIGJpbmQoKSBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICBlbHNlCisgICAgZXhpdCAoMCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGJ1cy9jbWFrZS9tb2R1bGVzL0NoZWNrUHJvdG90eXBlRXhpc3RzLmNtYWtlIGIvZGJ1cy9jbWFrZS9tb2R1bGVzL0NoZWNrUHJvdG90eXBlRXhpc3RzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMzE5ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2NtYWtlL21vZHVsZXMvQ2hlY2tQcm90b3R5cGVFeGlzdHMuY21ha2UKQEAgLTAsMCArMSwzNSBAQAorIyAtIENoZWNrIGlmIHRoZSBwcm90b3R5cGUgZm9yIGEgZnVuY3Rpb24gZXhpc3RzLgorIyBDSEVDS19QUk9UT1RZUEVfRVhJU1RTIChGVU5DVElPTiBIRUFERVIgVkFSSUFCTEUpCisjCisjICBGVU5DVElPTiAtIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB5b3UgYXJlIGxvb2tpbmcgZm9yCisjICBIRUFERVIgLSB0aGUgaGVhZGVyKHMpIHdoZXJlIHRoZSBwcm90b3R5cGUgc2hvdWxkIGJlIGRlY2xhcmVkCisjICBWQVJJQUJMRSAtIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSByZXN1bHQKKyMKKyMgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbWF5IGJlIHNldCBiZWZvcmUgY2FsbGluZyB0aGlzIG1hY3JvIHRvCisjIG1vZGlmeSB0aGUgd2F5IHRoZSBjaGVjayBpcyBydW46CisjCisjICBDTUFLRV9SRVFVSVJFRF9GTEFHUyA9IHN0cmluZyBvZiBjb21waWxlIGNvbW1hbmQgbGluZSBmbGFncworIyAgQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgPSBsaXN0IG9mIG1hY3JvcyB0byBkZWZpbmUgKC1ERk9PPWJhcikKKyMgIENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTID0gbGlzdCBvZiBpbmNsdWRlIGRpcmVjdG9yaWVzCisKK0lOQ0xVREUoQ2hlY2tDWFhTb3VyY2VDb21waWxlcykKKworTUFDUk8gKENIRUNLX1BST1RPVFlQRV9FWElTVFMgX1NZTUJPTCBfSEVBREVSIF9SRVNVTFQpCisgICBTRVQoX0lOQ0xVREVfRklMRVMpCisgICBGT1JFQUNIIChpdCAke19IRUFERVJ9KQorICAgICAgU0VUKF9JTkNMVURFX0ZJTEVTICIke19JTkNMVURFX0ZJTEVTfSNpbmNsdWRlIDwke2l0fT5cbiIpCisgICBFTkRGT1JFQUNIIChpdCkKKworICAgU0VUKF9DSEVDS19QUk9UT19FWElTVFNfU09VUkNFX0NPREUgIgorJHtfSU5DTFVERV9GSUxFU30KK2ludCBtYWluKCkKK3sKKyNpZm5kZWYgJHtfU1lNQk9MfQorICAgaW50IGkgPSBzaXplb2YoJiR7X1NZTUJPTH0pOworI2VuZGlmCisgIHJldHVybiAwOworfQorIikKKyAgIENIRUNLX0NYWF9TT1VSQ0VfQ09NUElMRVMoIiR7X0NIRUNLX1BST1RPX0VYSVNUU19TT1VSQ0VfQ09ERX0iICR7X1JFU1VMVH0pCitFTkRNQUNSTyAoQ0hFQ0tfUFJPVE9UWVBFX0VYSVNUUyBfU1lNQk9MIF9IRUFERVIgX1JFU1VMVCkKKwpkaWZmIC0tZ2l0IGEvZGJ1cy9jbWFrZS9tb2R1bGVzL0NoZWNrU3RydWN0TWVtYmVyLmNtYWtlIGIvZGJ1cy9jbWFrZS9tb2R1bGVzL0NoZWNrU3RydWN0TWVtYmVyLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNWQzNDYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2NtYWtlL21vZHVsZXMvQ2hlY2tTdHJ1Y3RNZW1iZXIuY21ha2UKQEAgLTAsMCArMSwzNiBAQAorIyAtIENoZWNrIGlmIHRoZSBnaXZlbiBzdHJ1Y3Qgb3IgY2xhc3MgaGFzIHRoZSBzcGVjaWZpZWQgbWVtYmVyIHZhcmlhYmxlCisjIENIRUNLX1NUUlVDVF9NRU1CRVIgKFNUUlVDVCBNRU1CRVIgSEVBREVSIFZBUklBQkxFKQorIworIyAgU1RSVUNUIC0gdGhlIG5hbWUgb2YgdGhlIHN0cnVjdCBvciBjbGFzcyB5b3UgYXJlIGludGVyZXN0ZWQgaW4KKyMgIE1FTUJFUiAtIHRoZSBtZW1iZXIgd2hpY2ggZXhpc3RlbmNlIHlvdSB3YW50IHRvIGNoZWNrCisjICBIRUFERVIgLSB0aGUgaGVhZGVyKHMpIHdoZXJlIHRoZSBwcm90b3R5cGUgc2hvdWxkIGJlIGRlY2xhcmVkCisjICBWQVJJQUJMRSAtIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSByZXN1bHQKKyMKKyMgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbWF5IGJlIHNldCBiZWZvcmUgY2FsbGluZyB0aGlzIG1hY3JvIHRvCisjIG1vZGlmeSB0aGUgd2F5IHRoZSBjaGVjayBpcyBydW46CisjCisjICBDTUFLRV9SRVFVSVJFRF9GTEFHUyA9IHN0cmluZyBvZiBjb21waWxlIGNvbW1hbmQgbGluZSBmbGFncworIyAgQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgPSBsaXN0IG9mIG1hY3JvcyB0byBkZWZpbmUgKC1ERk9PPWJhcikKKyMgIENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTID0gbGlzdCBvZiBpbmNsdWRlIGRpcmVjdG9yaWVzCisKK0lOQ0xVREUoQ2hlY2tDWFhTb3VyY2VDb21waWxlcykKKworTUFDUk8gKENIRUNLX1NUUlVDVF9NRU1CRVIgX1NUUlVDVCBfTUVNQkVSIF9IRUFERVIgX1JFU1VMVCkKKyAgIFNFVChfSU5DTFVERV9GSUxFUykKKyAgIEZPUkVBQ0ggKGl0ICR7X0hFQURFUn0pCisgICAgICBTRVQoX0lOQ0xVREVfRklMRVMgIiR7X0lOQ0xVREVfRklMRVN9I2luY2x1ZGUgPCR7aXR9PlxuIikKKyAgIEVOREZPUkVBQ0ggKGl0KQorCisgICBTRVQoX0NIRUNLX1NUUlVDVF9NRU1CRVJfU09VUkNFX0NPREUgIgorJHtfSU5DTFVERV9GSUxFU30KK2ludCBtYWluKCkKK3sKKyAgICR7X1NUUlVDVH0qIHRtcDsKKyAgIHRtcC0+JHtfTUVNQkVSfTsKKyAgcmV0dXJuIDA7Cit9CisiKQorICAgQ0hFQ0tfQ1hYX1NPVVJDRV9DT01QSUxFUygiJHtfQ0hFQ0tfU1RSVUNUX01FTUJFUl9TT1VSQ0VfQ09ERX0iICR7X1JFU1VMVH0pCisKK0VORE1BQ1JPIChDSEVDS19TVFJVQ1RfTUVNQkVSKQorCmRpZmYgLS1naXQgYS9kYnVzL2NtYWtlL21vZHVsZXMvRmluZERveHlnZW4uY21ha2UgYi9kYnVzL2NtYWtlL21vZHVsZXMvRmluZERveHlnZW4uY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc2NzkwMQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvY21ha2UvbW9kdWxlcy9GaW5kRG94eWdlbi5jbWFrZQpAQCAtMCwwICsxLDMgQEAKKworZmluZF9wcm9ncmFtKERPWFlHRU5fRVhFQ1VUQUJMRSBOQU1FUyBkb3h5Z2VuIERPQyAiZG94eWdlbiBleGVjdXRhYmxlIikKK21hcmtfYXNfYWR2YW5jZWQoRE9YWUdFTl9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvZGJ1cy9jbWFrZS9tb2R1bGVzL0ZpbmRHTElCLmNtYWtlIGIvZGJ1cy9jbWFrZS9tb2R1bGVzL0ZpbmRHTElCLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZGFlZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2NtYWtlL21vZHVsZXMvRmluZEdMSUIuY21ha2UKQEAgLTAsMCArMSw0MiBAQAorIyAtIFRyeSB0byBmaW5kIHRoZSBHTElCIGxpYnJhcnkKKyMgT25jZSBkb25lIHRoaXMgd2lsbCBkZWZpbmUKKyMKKyMgIEdMSUJfRk9VTkQgLSBzeXN0ZW0gaGFzIEdMSUIKKyMgIEdMSUJfSU5DTFVERVMgLSB0aGUgR0xJQiBpbmNsdWRlIGRpcmVjdG9yaWVzCisjICBHTElCX0xJQlJBUklFUyAtIFRoZSBsaWJyYXJpZXMgbmVlZGVkIHRvIHVzZSBHTElCCisKK2lmIChXSU4zMikKKworSU5DTFVERShNYWNyb0dldGVudldpblBhdGgpCisKK01BQ1JPX0dFVEVOVl9XSU5fUEFUSChfcHJvZ3JhbV9GSUxFU19ESVIgUFJPR1JBTUZJTEVTKQorCitGSU5EX1BBVEgoR0xJQl9JTkNMVURFX0RJUiBnbGliLmgKKyAgICR7X3Byb2dyYW1fRklMRVNfRElSfS9nbGliL2luY2x1ZGUvZ2xpYi0yLjAKKykKKworCisjIHNlYXJjaCBmb3IgR0xJQiBpbiB0aGUgZGVmYXVsdCBpbnN0YWxsIGRpcmVjdG9yeSBmb3IgYXBwbGljYXRpb25zIChkZWZhdWx0IG9mIChuKW1ha2UgaW5zdGFsbCkKK0ZJTkRfTElCUkFSWShHTElCX0xJQlJBUlkgTkFNRVMgZ2xpYi0yLjAKKyAgIFBBVEhTCisgICAke19wcm9ncmFtX0ZJTEVTX0RJUn0vZ2xpYi9saWIKKykKKworaWYgKEdMSUJfTElCUkFSWSBBTkQgR0xJQl9JTkNMVURFX0RJUikKKyAgIHNldChHTElCX0ZPVU5EIFRSVUUpCisgICBzZXQoQ01BS0VfSU5DTFVERV9QQVRIICR7Q01BS0VfSU5DTFVERV9QQVRIfSAke0dMSUJfSU5DTFVERVN9KQorICAgc2V0KENNQUtFX0xJQlJBUllfUEFUSCAke0NNQUtFX0xJQlJBUllfUEFUSH0gJHtHTElCX0xJQlJBUklFU30pCisgICAKK2VuZGlmIChHTElCX0xJQlJBUlkgQU5EIEdMSUJfSU5DTFVERV9ESVIpCisKK2lmIChHTElCX0ZPVU5EKQorICAgaWYgKE5PVCBHTElCX0ZJTkRfUVVJRVRMWSkKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJGb3VuZCBHTElCOiAke0dMSUJfTElCUkFSWX0iKQorICAgZW5kaWYgKE5PVCBHTElCX0ZJTkRfUVVJRVRMWSkKK2Vsc2UgKEdMSUJfRk9VTkQpCisgICBpZiAoR0xJQl9GSU5EX1JFUVVJUkVEKQorICAgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiQ291bGQgTk9UIGZpbmQgR0xJQiBsaWJyYXJ5IikKKyAgIGVuZGlmIChHTElCX0ZJTkRfUkVRVUlSRUQpCitlbmRpZiAoR0xJQl9GT1VORCkKKworZW5kaWYgKFdJTjMyKQpkaWZmIC0tZ2l0IGEvZGJ1cy9jbWFrZS9tb2R1bGVzL0ZpbmRMaWJFeHBhdC5jbWFrZSBiL2RidXMvY21ha2UvbW9kdWxlcy9GaW5kTGliRXhwYXQuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA3YzhkZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvY21ha2UvbW9kdWxlcy9GaW5kTGliRXhwYXQuY21ha2UKQEAgLTAsMCArMSw2MSBAQAorIyAtIFRyeSB0byBmaW5kIExJQkVYUEFUCisjIE9uY2UgZG9uZSB0aGlzIHdpbGwgZGVmaW5lCisjCisjICBMSUJFWFBBVF9GT1VORCAtIHN5c3RlbSBoYXMgTElCRVhQQVQKKyMgIExJQkVYUEFUX0lOQ0xVREVfRElSIC0gdGhlIExJQkVYUEFUIGluY2x1ZGUgZGlyZWN0b3J5CisjICBMSUJFWFBBVF9MSUJSQVJJRVMgLSB0aGUgbGlicmFyaWVzIG5lZWRlZCB0byB1c2UgTElCRVhQQVQKKyMgIExJQkVYUEFUX0RFRklOSVRJT05TIC0gQ29tcGlsZXIgc3dpdGNoZXMgcmVxdWlyZWQgZm9yIHVzaW5nIExJQkVYUEFUCisKK2lmIChMSUJFWFBBVF9JTkNMVURFX0RJUiBBTkQgTElCRVhQQVRfTElCUkFSSUVTKQorCisgICAgIyBpbiBjYWNoZSBhbHJlYWR5CisgICAgU0VUKExJQkVYUEFUX0ZPVU5EIFRSVUUpCisKK2Vsc2UgKExJQkVYUEFUX0lOQ0xVREVfRElSIEFORCBMSUJFWFBBVF9MSUJSQVJJRVMpCisKKyAgICBJRiAoV0lOMzIpCisJCWZpbGUoVE9fQ01BS0VfUEFUSCAiJEVOVntQUk9HUkFNRklMRVN9IiBfcHJvZ0ZpbGVzKQorCQlmaW5kX0ZJTEUoTElCRVhQQVRfRElSIGV4cGF0IFNvdXJjZS9saWIvZXhwYXQuaAorICAgCQkJUEFUSFMKKyAgIAkJCSIke19wcm9nRmlsZXN9IgorCQkpCisgICAgICAgIGlmIChMSUJFWFBBVF9ESVIpCisgICAgICAgICAgICBzZXQgKF9MSUJFWFBBVEluY0RpciAgJHtMSUJFWFBBVF9ESVJ9L1NvdXJjZS9saWIpCisgICAgICAgICAgICBzZXQgKF9MSUJFWFBBVExpbmtEaXIgJHtMSUJFWFBBVF9ESVJ9L2xpYnMpCisgICAgICAgIGVuZGlmIChMSUJFWFBBVF9ESVIpCisgICAgRUxTRSAoV0lOMzIpCisgICAgICAgICMgdXNlIHBrZy1jb25maWcgdG8gZ2V0IHRoZSBkaXJlY3RvcmllcyBhbmQgdGhlbiB1c2UgdGhlc2UgdmFsdWVzCisgICAgICAgICMgaW4gdGhlIEZJTkRfUEFUSCgpIGFuZCBGSU5EX0xJQlJBUlkoKSBjYWxscworICAgICAgICBJTkNMVURFKFVzZVBrZ0NvbmZpZykKKyAgICAgICAgUEtHQ09ORklHKExJQkVYUEFULTIuMCBfTElCRVhQQVRJbmNEaXIgX0xJQkVYUEFUTGlua0RpciBfTElCRVhQQVRMaW5rRmxhZ3MgX0xpSWNvbnZDZmxhZ3MpCisgICAgICAgIFNFVChMSUJFWFBBVF9ERUZJTklUSU9OUyAke19MSUJFWFBBVENmbGFnc30pCisgICAgRU5ESUYgKFdJTjMyKQorCisgICAgRklORF9QQVRIKExJQkVYUEFUX0lOQ0xVREVfRElSIGV4cGF0LmgKKyAgICAgIFBBVEhTCisgICAgICR7X0xJQkVYUEFUSW5jRGlyfQorICAgICAgUEFUSF9TVUZGSVhFUyBMSUJFWFBBVAorICAgICkKKworICAgIEZJTkRfTElCUkFSWShMSUJFWFBBVF9MSUJSQVJJRVMgTkFNRVMgZXhwYXQgbGliZXhwYXQKKyAgICAgIFBBVEhTCisgICAgICAke19MSUJFWFBBVExpbmtEaXJ9CisgICAgKQorCisgICAgaWYgKExJQkVYUEFUX0lOQ0xVREVfRElSIEFORCBMSUJFWFBBVF9MSUJSQVJJRVMpCisgICAgICAgc2V0KExJQkVYUEFUX0ZPVU5EIFRSVUUpCisgICAgZW5kaWYgKExJQkVYUEFUX0lOQ0xVREVfRElSIEFORCBMSUJFWFBBVF9MSUJSQVJJRVMpCisKKyAgICBpZiAoTElCRVhQQVRfRk9VTkQpCisgICAgICBpZiAoTk9UIExJQkVYUEFUX0ZJTkRfUVVJRVRMWSkKKyAgICAgICAgbWVzc2FnZShTVEFUVVMgIkZvdW5kIGxpYmV4cGF0OiAke0xJQkVYUEFUX0xJQlJBUklFU30iKQorICAgICAgZW5kaWYgKE5PVCBMSUJFWFBBVF9GSU5EX1FVSUVUTFkpCisgICAgZWxzZSAoTElCRVhQQVRfRk9VTkQpCisgICAgICBpZiAoTElCRVhQQVRfRklORF9SRVFVSVJFRCkKKyAgICAgICAgbWVzc2FnZShTRU5EX0VSUk9SICJDb3VsZCBOT1QgZmluZCBsaWJleHBhdCIpCisgICAgICBlbmRpZiAoTElCRVhQQVRfRklORF9SRVFVSVJFRCkKKyAgICBlbmRpZiAoTElCRVhQQVRfRk9VTkQpCisKKyAgICBNQVJLX0FTX0FEVkFOQ0VEKExJQkVYUEFUX0lOQ0xVREVfRElSIExJQkVYUEFUX0xJQlJBUklFUykKKworZW5kaWYgKExJQkVYUEFUX0lOQ0xVREVfRElSIEFORCBMSUJFWFBBVF9MSUJSQVJJRVMpCmRpZmYgLS1naXQgYS9kYnVzL2NtYWtlL21vZHVsZXMvRmluZExpYkljb252LmNtYWtlIGIvZGJ1cy9jbWFrZS9tb2R1bGVzL0ZpbmRMaWJJY29udi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWM2MzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9jbWFrZS9tb2R1bGVzL0ZpbmRMaWJJY29udi5jbWFrZQpAQCAtMCwwICsxLDUyIEBACisjIC0gVHJ5IHRvIGZpbmQgTGliSWNvbnYKKyMgT25jZSBkb25lIHRoaXMgd2lsbCBkZWZpbmUKKyMKKyMgIExJQklDT05WX0ZPVU5EIC0gc3lzdGVtIGhhcyBMaWJJY29udgorIyAgTElCSUNPTlZfSU5DTFVERV9ESVIgLSB0aGUgTGliSWNvbnYgaW5jbHVkZSBkaXJlY3RvcnkKKyMgIExJQklDT05WX0xJQlJBUklFUyAtIHRoZSBsaWJyYXJpZXMgbmVlZGVkIHRvIHVzZSBMaWJJY29udgorIyAgTElCSUNPTlZfREVGSU5JVElPTlMgLSBDb21waWxlciBzd2l0Y2hlcyByZXF1aXJlZCBmb3IgdXNpbmcgTGliSWNvbnYKKworaWYgKExJQklDT05WX0lOQ0xVREVfRElSIEFORCBMSUJJQ09OVl9MSUJSQVJJRVMpCisKKyAgICAjIGluIGNhY2hlIGFscmVhZHkKKyAgICBTRVQoTElCSUNPTlZfRk9VTkQgVFJVRSkKKworZWxzZSAoTElCSUNPTlZfSU5DTFVERV9ESVIgQU5EIExJQklDT05WX0xJQlJBUklFUykKKworICAgIElGIChOT1QgV0lOMzIpCisgICAgICAgIE1FU1NBR0UoRkFUQUxfRVJST1IgIlBsZWFzZSBzZXQgdGhpcyB0byB0aGUgY29ycmVjdCB2YWx1ZXMhIikKKyAgICAgICAgIyB1c2UgcGtnLWNvbmZpZyB0byBnZXQgdGhlIGRpcmVjdG9yaWVzIGFuZCB0aGVuIHVzZSB0aGVzZSB2YWx1ZXMKKyAgICAgICAgIyBpbiB0aGUgRklORF9QQVRIKCkgYW5kIEZJTkRfTElCUkFSWSgpIGNhbGxzCisgICAgICAgIElOQ0xVREUoVXNlUGtnQ29uZmlnKQorICAgICAgICBQS0dDT05GSUcobGliaWNvbnYtMS45IF9MaWJJY29udkluY0RpciBfTGliSWNvbnZMaW5rRGlyIF9MaWJJY29udkxpbmtGbGFncyBfTGlJY29udkNmbGFncykKKyAgICAgICAgU0VUKExJQklDT05WX0RFRklOSVRJT05TICR7X0xpYkljb252Q2ZsYWdzfSkKKyAgICBFTkRJRiAoTk9UIFdJTjMyKQorCisgICAgRklORF9QQVRIKExJQklDT05WX0lOQ0xVREVfRElSIGljb252LmgKKyAgICAgIFBBVEhTCisgICAgICR7X0xpYkljb252SW5jRGlyfQorICAgICAgUEFUSF9TVUZGSVhFUyBsaWJpY29udgorICAgICkKKworICAgIEZJTkRfTElCUkFSWShMSUJJQ09OVl9MSUJSQVJJRVMgTkFNRVMgaWNvbnYgbGliaWNvbnYKKyAgICAgIFBBVEhTCisgICAgICAke19MaWJJY29udkxpbmtEaXJ9CisgICAgKQorCisgICAgaWYgKExJQklDT05WX0lOQ0xVREVfRElSIEFORCBMSUJJQ09OVl9MSUJSQVJJRVMpCisgICAgICAgc2V0KExJQklDT05WX0ZPVU5EIFRSVUUpCisgICAgZW5kaWYgKExJQklDT05WX0lOQ0xVREVfRElSIEFORCBMSUJJQ09OVl9MSUJSQVJJRVMpCisKKyAgICBpZiAoTElCSUNPTlZfRk9VTkQpCisgICAgICBpZiAoTk9UIExpYkljb252X0ZJTkRfUVVJRVRMWSkKKyAgICAgICAgbWVzc2FnZShTVEFUVVMgIkZvdW5kIExpYkljb252OiAke0xJQklDT05WX0xJQlJBUklFU30iKQorICAgICAgZW5kaWYgKE5PVCBMaWJJY29udl9GSU5EX1FVSUVUTFkpCisgICAgZWxzZSAoTElCSUNPTlZfRk9VTkQpCisgICAgICBpZiAoTGliSWNvbnZfRklORF9SRVFVSVJFRCkKKyAgICAgICAgbWVzc2FnZShTRU5EX0VSUk9SICJDb3VsZCBOT1QgZmluZCBMaWJJY29udiIpCisgICAgICBlbmRpZiAoTGliSWNvbnZfRklORF9SRVFVSVJFRCkKKyAgICBlbmRpZiAoTElCSUNPTlZfRk9VTkQpCisKKyAgICBNQVJLX0FTX0FEVkFOQ0VEKExJQklDT05WX0lOQ0xVREVfRElSIExJQklDT05WX0xJQlJBUklFUykKKworZW5kaWYgKExJQklDT05WX0lOQ0xVREVfRElSIEFORCBMSUJJQ09OVl9MSUJSQVJJRVMpCmRpZmYgLS1naXQgYS9kYnVzL2NtYWtlL21vZHVsZXMvTWFjcm9HZXRlbnZXaW5QYXRoLmNtYWtlIGIvZGJ1cy9jbWFrZS9tb2R1bGVzL01hY3JvR2V0ZW52V2luUGF0aC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMThmN2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9jbWFrZS9tb2R1bGVzL01hY3JvR2V0ZW52V2luUGF0aC5jbWFrZQpAQCAtMCwwICsxLDUgQEAKKworTUFDUk8gKE1BQ1JPX0dFVEVOVl9XSU5fUEFUSCB2YXIgbmFtZSkKKyAgIHNldCgke3Zhcn0gJEVOVnske25hbWV9fSkKKyAgIFNUUklORyhSRUdFWCBSRVBMQUNFICJcXFxcIiAiLyIgJHt2YXJ9ICIkeyR7dmFyfX0iKQorRU5ETUFDUk8gKE1BQ1JPX0dFVEVOVl9XSU5fUEFUSCB2YXIgbmFtZSkKZGlmZiAtLWdpdCBhL2RidXMvY21ha2UvbW9kdWxlcy9NYWNyb0xpYnJhcnkuY21ha2UgYi9kYnVzL2NtYWtlL21vZHVsZXMvTWFjcm9MaWJyYXJ5LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MjM1MzAKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2NtYWtlL21vZHVsZXMvTWFjcm9MaWJyYXJ5LmNtYWtlCkBAIC0wLDAgKzEsOSBAQAorIyAtIGluY2x1ZGUgTWFjcm9MaWJyYXJ5IG9mZmVycyBhIGNvbGxlY3Rpb24gb2YgbWFjcm9zIHdoaWNoIGV4dGVuZCB0aGUgYnVpbHQtaW4gY21ha2UgY29tbWFuZHMKKyMgT1BUSU9OQUxfRklORF9QQUNLQUdFKCA8bmFtZT4gW1FVSVRdICkKKworSU5DTFVERShNYWNyb09wdGlvbmFsRmluZFBhY2thZ2UpCisjSU5DTFVERShNYWNyb0FkZGl0aW9uYWxDbGVhbkZpbGVzKQorI0lOQ0xVREUoTWFjcm9BZGRGaWxlRGVwZW5kZW5jaWVzKQorI0lOQ0xVREUoTWFjcm9HZXRlbnZXaW5QYXRoKQorI0lOQ0xVREUoTWFjcm9FbnN1cmVPdXRPZlNvdXJjZUJ1aWxkKQorCmRpZmYgLS1naXQgYS9kYnVzL2NtYWtlL21vZHVsZXMvTWFjcm9PcHRpb25hbEZpbmRQYWNrYWdlLmNtYWtlIGIvZGJ1cy9jbWFrZS9tb2R1bGVzL01hY3JvT3B0aW9uYWxGaW5kUGFja2FnZS5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDY4MTMxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9jbWFrZS9tb2R1bGVzL01hY3JvT3B0aW9uYWxGaW5kUGFja2FnZS5jbWFrZQpAQCAtMCwwICsxLDIyIEBACisjIC0gTUFDUk9fT1BUSU9OQUxfRklORF9QQUNLQUdFKCkgY29tYmluZXMgRklORF9QQUNLQUdFKCkgd2l0aCBhbiBPUFRJT04oKQorIyBNQUNST19PUFRJT05BTF9GSU5EX1BBQ0tBR0UoIDxuYW1lPiBbUVVJVF0gKQorIyBUaGlzIG1hY3JvIGlzIGEgY29tYmluYXRpb24gb2YgT1BUSU9OKCkgYW5kIEZJTkRfUEFDS0FHRSgpLCBpdAorIyB3b3JrcyBsaWtlIEZJTkRfUEFDS0FHRSgpLCBidXQgYWRkaXRpb25hbGx5IGl0IGF1dG9tYXRpY2FsbHkgY3JlYXRlcworIyBhbiBvcHRpb24gbmFtZSBXSVRIXzxuYW1lPiwgd2hpY2ggY2FuIGJlIGRpc2FibGVkIHZpYSB0aGUgY21ha2UgR1VJLgorIyBvciB2aWEgLURXSVRIXzxuYW1lPj1PRkYKKyMgVGhlIHN0YW5kYXJkIDxuYW1lPl9GT1VORCB2YXJpYWJsZXMgY2FuIGJlIHVzZWQgaW4gdGhlIHNhbWUgd2F5CisjIGFzIHdoZW4gdXNpbmcgdGhlIG5vcm1hbCBGSU5EX1BBQ0tBR0UoKQorCitNQUNSTyAoTUFDUk9fT1BUSU9OQUxfRklORF9QQUNLQUdFIF9uYW1lICkKKyAgIE9QVElPTihXSVRIXyR7X25hbWV9ICJTZWFyY2ggZm9yICR7X25hbWV9IHBhY2thZ2UiIE9OKQorICAgaWYgKFdJVEhfJHtfbmFtZX0pCisgICAgICBGSU5EX1BBQ0tBR0UoJHtfbmFtZX0gJHtBUkdOfSkKKyAgIGVsc2UgKFdJVEhfJHtfbmFtZX0pCisgICAgICBzZXQoJHtfbmFtZX1fRk9VTkQpCisgICAgICBzZXQoJHtfbmFtZX1fSU5DTFVERV9ESVIpCisgICAgICBzZXQoJHtfbmFtZX1fSU5DTFVERVMpCisgICAgICBzZXQoJHtfbmFtZX1fTElCUkFSWSkKKyAgICAgIHNldCgke19uYW1lfV9MSUJSQVJJRVMpCisgICBlbmRpZiAoV0lUSF8ke19uYW1lfSkKK0VORE1BQ1JPIChNQUNST19PUFRJT05BTF9GSU5EX1BBQ0tBR0UpCisKZGlmZiAtLWdpdCBhL2RidXMvY21ha2UvbW9kdWxlcy9NYWNyb3MuY21ha2UgYi9kYnVzL2NtYWtlL21vZHVsZXMvTWFjcm9zLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MzcxNTYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2NtYWtlL21vZHVsZXMvTWFjcm9zLmNtYWtlCkBAIC0wLDAgKzEsMTUgQEAKKworTUFDUk8oVElNRVNUQU1QIFJFU1VMVCkKKyAgICBJRihXSU4zMikKKyAgICAgICAgRVhFQ1VURV9QUk9DRVNTKENPTU1BTkQgImNtZCIgIiAvQyBkYXRlIC9UIiBPVVRQVVRfVkFSSUFCTEUgREFURSkKKyAgICAgICAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIiguLilbLy5dKC4uKVsvLl0oLi4uLikuKiIgIlxcM1xcMlxcMSIgREFURSAke0RBVEV9KQorICAgICAgICBFWEVDVVRFX1BST0NFU1MoQ09NTUFORCAiY21kIiAiIC9DIHRpbWUgL1QiIE9VVFBVVF9WQVJJQUJMRSBUSU1FKQorICAgICAgICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiKC4uKTooLi4pIiAiXFwxXFwyIiBUSU1FICR7VElNRX0pCisgICAgICAgIHNldCAoJHtSRVNVTFR9ICIke0RBVEV9JHtUSU1FfSIpCisgICAgRUxTRUlGKFVOSVgpCisgICAgICAgIEVYRUNVVEVfUFJPQ0VTUyhDT01NQU5EICJkYXRlIiAiKyVZJW0lZCVIJU0iIE9VVFBVVF9WQVJJQUJMRSAke1JFU1VMVH0pCisgICAgRUxTRSgpCisgICAgICAgIE1FU1NBR0UoU0VORF9FUlJPUiAiZGF0ZSBub3QgaW1wbGVtZW50ZWQiKQorICAgICAgICBTRVQoJHtSRVNVTFR9IDAwMDAwMDAwMDAwMCkKKyAgICBFTkRJRigpCitFTkRNQUNSTygpCmRpZmYgLS1naXQgYS9kYnVzL2NtYWtlL21vZHVsZXMvTWFjcm9zQXV0b3Rvb2xzLmNtYWtlIGIvZGJ1cy9jbWFrZS9tb2R1bGVzL01hY3Jvc0F1dG90b29scy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjMwZWFmCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9jbWFrZS9tb2R1bGVzL01hY3Jvc0F1dG90b29scy5jbWFrZQpAQCAtMCwwICsxLDQwIEBACisjCisjIEBBdXRob3IgUmFsZiBIYWJhY2tlcgorIyAKKyMgZXh0cmFjdHMgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIGF1dG9jb25mIGNvbmZpZyBmaWxlCisjIGFuZCBzZXQgcmVsYXRlZCBjbWFrZSB2YXJpYWJsZXMKKyMgCisjIHJldHVybnMgIAorIyAgICR7cHJlZml4fV9WRVJTSU9OCisjICAgJHtwcmVmaXh9X1ZFUlNJT05fU1RSSU5HCisjICAgJHtwcmVmaXh9X01BSk9SX1ZFUlNJT04KKyMgICAke3ByZWZpeH1fTUlOT1JfVkVSU0lPTgorIyAgICR7cHJlZml4fV9NSUNST19WRVJTSU9OCisjIAorbWFjcm8oYXV0b3ZlcnNpb24gY29uZmlnIHByZWZpeCkKKwlmaWxlIChSRUFEICR7Y29uZmlnfSBfY29uZmlndXJlX2FjKQorCXN0cmluZyhUT1VQUEVSICR7cHJlZml4fSBwcmVmaXhfdXBwZXIpCisJc3RyaW5nIChSRUdFWCBSRVBMQUNFICIuKiR7cHJlZml4fV9tYWpvcl92ZXJzaW9uXSwgLihbMC05XSspLioiICJcXDEiICR7cHJlZml4X3VwcGVyfV9NQUpPUl9WRVJTSU9OICR7X2NvbmZpZ3VyZV9hY30pCisJc3RyaW5nIChSRUdFWCBSRVBMQUNFICIuKiR7cHJlZml4fV9taW5vcl92ZXJzaW9uXSwgLihbMC05XSspLioiICJcXDEiICR7cHJlZml4X3VwcGVyfV9NSU5PUl9WRVJTSU9OICR7X2NvbmZpZ3VyZV9hY30pCisJc3RyaW5nIChSRUdFWCBSRVBMQUNFICIuKiR7cHJlZml4fV9taWNyb192ZXJzaW9uXSwgLihbMC05XSspLioiICJcXDEiICR7cHJlZml4X3VwcGVyfV9NSUNST19WRVJTSU9OICR7X2NvbmZpZ3VyZV9hY30pCisJc2V0ICgke3ByZWZpeF91cHBlcn1fVkVSU0lPTiAkeyR7cHJlZml4X3VwcGVyfV9NQUpPUl9WRVJTSU9OfS4keyR7cHJlZml4X3VwcGVyfV9NSU5PUl9WRVJTSU9OfS4keyR7cHJlZml4X3VwcGVyfV9NSUNST19WRVJTSU9OfSkKKwlzZXQgKCR7cHJlZml4X3VwcGVyfV9WRVJTSU9OX1NUUklORyAiJHske3ByZWZpeF91cHBlcn1fVkVSU0lPTn0iKQorCitlbmRtYWNybygpCisKKyMKKyMgcGFyc2VzIGNvbmZpZy5oIHRlbXBsYXRlIGFuZCBjcmVhdGUgY21ha2UgZXF1aXZhbGVudCAKKyMgbm90IGltcGxlbWVudGVkIHlldAorIyAKK21hY3JvKGF1dG9jb25maWcgdGVtcGxhdGUgb3V0cHV0KQorCWZpbGUoUkVBRCAke3RlbXBsYXRlfSBjb250ZW50cykKKwkjIENvbnZlcnQgZmlsZSBjb250ZW50cyBpbnRvIGEgQ01ha2UgbGlzdCAod2hlcmUgZWFjaCBlbGVtZW50IGluIHRoZSBsaXN0CisJIyBpcyBvbmUgbGluZSBvZiB0aGUgZmlsZSkKKwlTVFJJTkcoUkVHRVggUkVQTEFDRSAiOyIgIlxcXFw7IiBjb250ZW50cyAiJHtjb250ZW50c30iKQorCVNUUklORyhSRUdFWCBSRVBMQUNFICJcbiIgIjsiIGNvbnRlbnRzICIke2NvbnRlbnRzfSIpCisJZm9yZWFjaChsaW5lIGNvbnRlbnRzKQorCQltZXNzYWdlKFNUQVRVUyAke2xpbmV9KQorCQkjIGZpbmQgI3VuZGVmIGxpbmVzCisJCSMgYXBwZW5kIHRvIGNvbmZpZy5oICNkZWZpbmUgPHZhcmlhYmxlLW5hbWU+IDx2YXJpYWJsZS1jb250ZW50PgorCWVuZGZvcmVhY2goKQorZW5kbWFjcm8oKQpkaWZmIC0tZ2l0IGEvZGJ1cy9jbWFrZS9tb2R1bGVzL1Byb2plY3RTb3VyY2VHcm91cC5jbWFrZSBiL2RidXMvY21ha2UvbW9kdWxlcy9Qcm9qZWN0U291cmNlR3JvdXAuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzYTY3YQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvY21ha2UvbW9kdWxlcy9Qcm9qZWN0U291cmNlR3JvdXAuY21ha2UKQEAgLTAsMCArMSwxOCBAQAorIyBmb2xkZXJzIGluIHRoZSBtc3ZjIHByb2plY3RzCisjIG1vZGU9PWZsYXQgIDogaGVhZGVycyBhbmQgb3Vyc2VzIGluIG5vIGZvbGRlcnMKKyMgbW9kZT09c3BsaXQgOiBzdGFuZGFyZCBiZWhhdmlvciBvZiBjbWFrZSwgc3BsaXQgaGVhZGVycyBhbmQgc291cmNlcworIyBtb2RlPT0gPG90aGVyIHZhbHVlcyIgOiBjb2RlIGlzIGluIHRoaXMgZm9sZGVyCittYWNybyhwcm9qZWN0X3NvdXJjZV9ncm91cCBtb2RlIHNvdXJjZXMgaGVhZGVycykKKwkjbWVzc2FnZShTVEFUVVMgJHttb2RlfSkKKwkjbWVzc2FnZShTVEFUVVMgJHtzb3VyY2VzfSAke2hlYWRlcnN9KQorCWlmKCR7bW9kZX0gTUFUQ0hFUyAiZmxhdCIpCisJCXNvdXJjZV9ncm91cCgiU291cmNlIEZpbGVzIiBGaWxlcykKKwkJc291cmNlX2dyb3VwKCJIZWFkZXIgRmlsZXMiIEZpbGVzKQorCQlzb3VyY2VfZ3JvdXAoImNtYWtlIiBGSUxFUyBDTWFrZUxpc3RzLnR4dCkKKwllbHNlKCR7bW9kZX0gTUFUQ0hFUyAiZmxhdCIpCisJCWlmKE5PVCAke21vZGV9IE1BVENIRVMgInNwbGl0IikKKwkJCXNvdXJjZV9ncm91cCgiJHttb2RlfSIgRklMRVMgJHske3NvdXJjZXN9fSAkeyR7aGVhZGVyc319KQorCQllbmRpZihOT1QgJHttb2RlfSBNQVRDSEVTICJzcGxpdCIpCisJZW5kaWYoJHttb2RlfSBNQVRDSEVTICJmbGF0IikKK2VuZG1hY3JvKHByb2plY3Rfc291cmNlX2dyb3VwIG1vZGUgc291cmNlcyBoZWFkZXJzKQorCmRpZmYgLS1naXQgYS9kYnVzL2NtYWtlL21vZHVsZXMvV2luMzJNYWNyb3MuY21ha2UgYi9kYnVzL2NtYWtlL21vZHVsZXMvV2luMzJNYWNyb3MuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4NWNjOQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvY21ha2UvbW9kdWxlcy9XaW4zMk1hY3Jvcy5jbWFrZQpAQCAtMCwwICsxLDQ0IEBACisjCisjIHdpbjMyIG1hY3JvcyAKKyMgCisjIENvcHlyaWdodCAoYykgMjAwNi0yMDA3LCBSYWxmIEhhYmFja2VyCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaXMgYWxsb3dlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBCU0QgbGljZW5zZS4KKyMKKworaWYgKFdJTjMyKQorICAgICMKKyAgICAjIGFkZEV4cGxvcmVyV3JhcHBlciBjcmVhdGVzIGJhdGNoIGZpbGVzIGZvciBmYXN0IGFjY2VzcyAKKyAgICAjIHRvIHRoZSBidWlsZCBlbnZpcm9ubWVudCBmcm9tIHRoZSB3aW4zMiBleHBsb3Jlci4gCisgICAgIyAKKyAgICAjIEZvciBtaW5ndyBhbmQgbm1ha2UgcHJvamVjdHMgaXQncyBvcGVucyBhIGNvbW1hbmQgc2hlbGwsCisgICAgIyBmb3IgVmlzdWFsIFN0dWRpbyBJREUncyAoYXQgbGVhc3QgdGVzdGVkIHdpdGggVlMgOCAyMDA1KSBpdAorICAgICMgb3BlbnMgdGhlIHJlbGF0ZWQgLnNsbiBmaWxlIHdpdGggcGF0aHMgc2V0dGluZyBzcGVjaWZpZWQgYXQgCisgICAgIyBjb25maWd1cmUgdGltZS4gCisgICAgIworICAgIE1BQ1JPIChhZGRFeHBsb3JlcldyYXBwZXIgX3Byb2plY3RuYW1lKQorICAgICAgICAjIHdyaXRlIGV4cGxvcmVyIHdyYXBwZXJzCisgICAgICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQoQ01BS0VfQklOX1BBVEggJHtDTUFLRV9DT01NQU5EfSBQQVRIKQorICAgICAgICBzZXQgKEFERF9QQVRIICIke0NNQUtFX0JJTl9QQVRIfSIpCisKKyAgICAgICAgaWYgKFFUX1FNQUtFX0VYRUNVVEFCTEUpCisgICAgICAgICAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KFFUX0JJTl9QQVRIICR7UVRfUU1BS0VfRVhFQ1VUQUJMRX0gUEFUSCkKKyAgICAgICAgICAgIHNldCAoQUREX1BBVEggIiR7QUREX1BBVEh9OyR7UVRfQklOX1BBVEh9IikKKyAgICAgICAgZW5kaWYgKFFUX1FNQUtFX0VYRUNVVEFCTEUpCisgICAgICAgIAorICAgICAgICAjIGFkZCBoZXJlIG1vcmUgcGF0aGVzIAorICAgICAgICAKKyAgICAgICAgaWYgKE1JTkdXKQorICAgICAgICAgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChNSU5HV19CSU5fUEFUSCAke0NNQUtFX0NYWF9DT01QSUxFUn0gUEFUSCkKKyAgICAgICAgICAgIHNldCAoQUREX1BBVEggIiR7QUREX1BBVEh9OyR7TUlOR1dfQklOX1BBVEh9IikKKyAgICAgICAgICAgIHdyaXRlX2ZpbGUgKCR7Q01BS0VfQklOQVJZX0RJUn0vJHtfcHJvamVjdG5hbWV9LXNoZWxsLmJhdCAic2V0IFBBVEg9JHtBRERfUEFUSH07JVBBVEglXG5jbWQuZXhlIikKKyAgICAgICAgZWxzZSAoTUlOR1cpCisgICAgICAgICAgICBpZiAoQ01BS0VfQlVJTERfVE9PTCBTVFJFUVVBTCAgIm5tYWtlIikKKyAgICAgICAgICAgICAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KFZDX0JJTl9QQVRIICR7Q01BS0VfQ1hYX0NPTVBJTEVSfSBQQVRIKQorICAgICAgICAgICAgICAgIHdyaXRlX2ZpbGUgKCR7Q01BS0VfQklOQVJZX0RJUn0vJHtfcHJvamVjdG5hbWV9LXNoZWxsLmJhdCAic2V0IFBBVEg9JHtBRERfUEFUSH07JVBBVEglXG5jYWxsIFwiJHtWQ19CSU5fUEFUSH1cXHZjdmFyczMyLmJhdFwiXG5jbWQuZXhlIikKKyAgICAgICAgICAgIGVsc2UgKENNQUtFX0JVSUxEX1RPT0wgU1RSRVFVQUwgICJubWFrZSIpCisgICAgICAgICAgICAgICAgd3JpdGVfZmlsZSAoJHtDTUFLRV9CSU5BUllfRElSfS8ke19wcm9qZWN0bmFtZX0tc2xuLmJhdCAic2V0IFBBVEg9JHtBRERfUEFUSH07JVBBVEglXG5zdGFydCAke19wcm9qZWN0bmFtZX0uc2xuIikKKyAgICAgICAgICAgIGVuZGlmIChDTUFLRV9CVUlMRF9UT09MIFNUUkVRVUFMICAibm1ha2UiKQorICAgICAgICBlbmRpZiAoTUlOR1cpCisgICAgRU5ETUFDUk8gKGFkZEV4cGxvcmVyV3JhcHBlcikKK2VuZGlmKFdJTjMyKQpkaWZmIC0tZ2l0IGEvZGJ1cy9jbWFrZS90ZXN0L0NNYWtlTGlzdHMudHh0IGIvZGJ1cy9jbWFrZS90ZXN0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NTdlNGMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2NtYWtlL3Rlc3QvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNTUgQEAKK3Byb2plY3QodGVzdCkKKworYWRkX2RlZmluaXRpb25zKCR7REJVU19JTlRFUk5BTF9DTElFTlRfREVGSU5JVElPTlN9KQorCithZGRfbGlicmFyeShkYnVzLXRlc3R1dGlscyBTVEFUSUMKKyAgICAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvdGVzdC11dGlscy5oCisgICAgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi90ZXN0L3Rlc3QtdXRpbHMuYworKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGRidXMtdGVzdHV0aWxzICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9KQorCithZGRfc3ViZGlyZWN0b3J5KCBuYW1lLXRlc3QgKQorCitzZXQgKHRlc3Qtc2VydmljZV9TT1VSQ0VTCisgICAgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi90ZXN0L3Rlc3Qtc2VydmljZS5jCispCisKK3NldCAodGVzdC1uYW1lc19TT1VSQ0VTCisgICAgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi90ZXN0L3Rlc3QtbmFtZXMuYworKQorCitzZXQgKGJyZWFrX2xvYWRlcl9TT1VSQ0VTCisgICAgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi90ZXN0L2JyZWFrLWxvYWRlci5jCispCisKK3NldCAodGVzdC1zaGVsbC1zZXJ2aWNlX1NPVVJDRVMKKyAgICAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvdGVzdC1zaGVsbC1zZXJ2aWNlLmMKKykKKworc2V0IChzaGVsbC10ZXN0X1NPVVJDRVMKKyAgICAgICAgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi90ZXN0L3NoZWxsLXRlc3QuYworKQorCitzZXQgKHNwYXduLXRlc3RfU09VUkNFUworICAgICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC9zcGF3bi10ZXN0LmMKKykKKworc2V0ICh0ZXN0LWV4aXRfU09VUkNFUworICAgICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC90ZXN0LWV4aXQuYworKQorCitzZXQgKHRlc3Qtc2VnZmF1bHRfU09VUkNFUworICAgICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC90ZXN0LXNlZ2ZhdWx0LmMKKykKKworc2V0ICh0ZXN0LXNsZWVwLWZvcmV2ZXJfU09VUkNFUworICAgICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC90ZXN0LXNsZWVwLWZvcmV2ZXIuYworKQorCithZGRfZXhlY3V0YWJsZSh0ZXN0LXNlcnZpY2UgJHt0ZXN0LXNlcnZpY2VfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXModGVzdC1zZXJ2aWNlIGRidXMtdGVzdHV0aWxzKQorCithZGRfZXhlY3V0YWJsZSh0ZXN0LW5hbWVzICR7dGVzdC1uYW1lc19TT1VSQ0VTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0LW5hbWVzIGRidXMtdGVzdHV0aWxzKQorCithZGRfZXhlY3V0YWJsZShzaGVsbC10ZXN0ICR7c2hlbGwtdGVzdF9TT1VSQ0VTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhzaGVsbC10ZXN0ICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9KQorQUREX1RFU1Qoc2hlbGwtdGVzdCAke0VYRUNVVEFCTEVfT1VUUFVUX1BBVEh9L3NoZWxsLXRlc3Qke0VYRUVYVH0pCisKK2FkZF9leGVjdXRhYmxlKHRlc3Qtc2hlbGwtc2VydmljZSAke3Rlc3Qtc2hlbGwtc2VydmljZV9TT1VSQ0VTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0LXNoZWxsLXNlcnZpY2UgZGJ1cy10ZXN0dXRpbHMpCisKK2FkZF9leGVjdXRhYmxlKHNwYXduLXRlc3QgJHtzcGF3bi10ZXN0X1NPVVJDRVN9KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHNwYXduLXRlc3QgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30pCisKK2FkZF9leGVjdXRhYmxlKHRlc3QtZXhpdCAke3Rlc3QtZXhpdF9TT1VSQ0VTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0LWV4aXQgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30pCisKK2FkZF9leGVjdXRhYmxlKHRlc3Qtc2VnZmF1bHQgJHt0ZXN0LXNlZ2ZhdWx0X1NPVVJDRVN9KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3Qtc2VnZmF1bHQgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30pCisKK2FkZF9leGVjdXRhYmxlKHRlc3Qtc2xlZXAtZm9yZXZlciAke3Rlc3Qtc2xlZXAtZm9yZXZlcl9TT1VSQ0VTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0LXNsZWVwLWZvcmV2ZXIgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30pCisKKyMjIyBrZWVwIHRoZXNlIGluIGNyZWF0aW9uIG9yZGVyLCBpLmUuIHVwcGVybW9zdCBkaXJzIGZpcnN0IAorc2V0IChURVNURElSUworICAgIHRlc3QvZGF0YQorICAgIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcworICAgIHRlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzCisgICAgdGVzdC9kYXRhL2luY29tcGxldGUtbWVzc2FnZXMKKyAgICB0ZXN0L2RhdGEvYXV0aAorICAgIHRlc3QvZGF0YS9zaGEtMQorICAgIHRlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMKKyAgICB0ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2Jhc2ljLmQKKyAgICB0ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL3N5c3RlbS5kCisgICAgdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0KKyAgICB0ZXN0L2RhdGEvdmFsaWQtaW50cm9zcGVjdGlvbi1maWxlcworICAgIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcworICAgIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzCisgICAgdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtCisgICAgdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzCisgICAgdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbQorICAgIHRlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzCisgICAgdGVzdC9kYXRhL2ludmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0KKyAgICB0ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzCisgICAgdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9iYXNpYworICAgIHRlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvYmFzaWMvYmFzaWMuZAorICAgIHRlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvZW50aXRpZXMKKyAgICB0ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2VudGl0aWVzL2Jhc2ljLmQKKykKK3NldCAoQ09ORklHX1ZFUkJPU0UgMCkKKworIyMjIGNvcHkgdGVzdHMgdG8gYnVpbGRkaXIgc28gdGhhdCBnZW5lcmF0ZWQgdGVzdHMgYW5kIHN0YXRpYyB0ZXN0cyAKKyMjIyBhcmUgYWxsIGluIG9uZSBwbGFjZS4KK01FU1NBR0UoU1RBVFVTICJDb3B5aW5nIHRlc3QgZmlsZXMgdG8gdGVzdCBkaXJlY3RvcnkiKQorRk9SRUFDSChGSUxFX1RZUEUgKi5tZXNzYWdlICoubWVzc2FnZS1yYXcgKi5hdXRoLXNjcmlwdCAqLnNoYTEgKi50eHQgKi5jb25mICouc2VydmljZSkKKyAgICBGT1JFQUNIKERJUiAke1RFU1RESVJTfSkKKyAgICAgICAgRklMRShHTE9CIEZJTEVTICIke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uLyR7RElSfS8ke0ZJTEVfVFlQRX0iICkKKyAgICAgICAgRklMRShNQUtFX0RJUkVDVE9SWSAke0NNQUtFX0JJTkFSWV9ESVJ9LyR7RElSfSkKKyAgICAgICAgRk9SRUFDSChGSUxFICR7RklMRVN9KQorICAgICAgICAgICAgR0VUX0ZJTEVOQU1FX0NPTVBPTkVOVChGSUxFTkFNRSAke0ZJTEV9IE5BTUUpCisgICAgICAgICAgICBTRVQgKFRBUkdFVCAke0NNQUtFX0JJTkFSWV9ESVJ9LyR7RElSfS8ke0ZJTEVOQU1FfSkKKyAgICAgICAgICAgIGNvbmZpZ3VyZV9maWxlKCR7RklMRX0gJHtUQVJHRVR9IENPUFlPTkxZKQorICAgICAgICAgICAgSUYgKENPTkZJR19WRVJCT1NFKQorICAgICAgICAgICAgICAgIE1FU1NBR0UoIiR7RklMRX0iKQorICAgICAgICAgICAgRU5ESUYgKENPTkZJR19WRVJCT1NFKQorICAgICAgICBFTkRGT1JFQUNIKEZJTEUpCisgICAgRU5ERk9SRUFDSChESVIpCitFTkRGT1JFQUNIKEZJTEVfVFlQRSkKKworIyMjIGdlbmVyYXRlIHRlc3QgZmlsZXMKK01FU1NBR0UoU1RBVFVTICJHZW5lcmF0aW5nIHRlc3QgZmlsZXMgZnJvbSB0ZW1wbGF0ZXMgaW50byB0ZXN0IGRpcmVjdG9yeSIpCisKK0ZPUkVBQ0goRklMRV9UWVBFICouY29uZi5pbiAqLnNlcnZpY2UuaW4pCisgIEZPUkVBQ0goRElSICR7VEVTVERJUlN9KQorICAgIEZJTEUoR0xPQiBGSUxFUyAiJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi8ke0RJUn0vJHtGSUxFX1RZUEV9IiApCisgICAgRklMRShNQUtFX0RJUkVDVE9SWSAke0NNQUtFX0JJTkFSWV9ESVJ9LyR7RElSfSkKKyAgICBGT1JFQUNIKEZJTEUgJHtGSUxFU30pCisgICAgICBHRVRfRklMRU5BTUVfQ09NUE9ORU5UKEZJTEVOQU1FICR7RklMRX0gTkFNRSkKKyAgICAgIFNUUklORyhSRUdFWCBSRVBMQUNFICJcXC5pbiQiICIiIEZJTEVOQU1FICR7RklMRU5BTUV9KQorICAgICAgU0VUIChUQVJHRVQgJHtDTUFLRV9CSU5BUllfRElSfS8ke0RJUn0vJHtGSUxFTkFNRX0pCisgICAgICBjb25maWd1cmVfZmlsZSgke0ZJTEV9ICR7VEFSR0VUfSBAT05MWSBJTU1FRElBVEUpCisgICAgICBJRiAoQ09ORklHX1ZFUkJPU0UpCisgICAgICAgIE1FU1NBR0UoIiR7RklMRX0iKQorICAgICAgRU5ESUYgKENPTkZJR19WRVJCT1NFKQorICAgIEVOREZPUkVBQ0goRklMRSkKKyAgRU5ERk9SRUFDSChESVIpCitFTkRGT1JFQUNIKEZJTEVfVFlQRSkKKworTUVTU0FHRShTVEFUVVMgIkNvcHlpbmcgZ2VuZXJhdGVkIGJ1cyBjb25maWcgZmlsZXMgdG8gdGVzdCBkaXJlY3RvcnkiKQorc2V0IChPVVRESVIgJHtDTUFLRV9CSU5BUllfRElSfS90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzKQorCitGSUxFKEdMT0IgRklMRVMgIiR7Q01BS0VfQklOQVJZX0RJUn0vYnVzLyouY29uZiIgKQorRklMRShNQUtFX0RJUkVDVE9SWSAke09VVERJUn0pCitGT1JFQUNIKEZJTEUgJHtGSUxFU30pCisgICAgR0VUX0ZJTEVOQU1FX0NPTVBPTkVOVChGSUxFTkFNRSAke0ZJTEV9IE5BTUUpCisgICAgU0VUIChUQVJHRVQgJHtPVVRESVJ9LyR7RklMRU5BTUV9KQorICAgIGNvbmZpZ3VyZV9maWxlKCR7RklMRX0gJHtUQVJHRVR9IENPUFlPTkxZKQorICAgIElGIChDT05GSUdfVkVSQk9TRSkKKyAgICAgICAgTUVTU0FHRSgiRlJPTTogJHtGSUxFfVxuVE86ICR7VEFSR0VUfVxuIikKKyAgICBFTkRJRiAoQ09ORklHX1ZFUkJPU0UpCitFTkRGT1JFQUNIKEZJTEUpCisKKyMgdG9kbzogZm9yIGluc3RhbGxhdGlvbiB0aGUgVEVTVF8uLi5fQklOQVJZIHZhcmlhYmxlcyBtdXN0IHJlZmxlY3QgdGhlIAorIyAgICAgICBpbnN0YWxsYXRpb24gZGlyIG9yIGhhcyB0byBiZSBkZWZpbmVkIHJlbGF0aXZlCisjCmRpZmYgLS1naXQgYS9kYnVzL2NtYWtlL3Rlc3QvbmFtZS10ZXN0L0NNYWtlTGlzdHMudHh0IGIvZGJ1cy9jbWFrZS90ZXN0L25hbWUtdGVzdC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGI5OTA4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9jbWFrZS90ZXN0L25hbWUtdGVzdC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDM5IEBACitpZiAoREJVU19CVUlMRF9URVNUUykKKworc2V0IChOQU1FdGVzdC1ESVIgLi4vLi4vLi4vdGVzdC9uYW1lLXRlc3QpCisKK2FkZF9kZWZpbml0aW9ucygtRERCVVNfQ09NUElMQVRJT04pCisKK2FkZF9leGVjdXRhYmxlKHRlc3QtcGVuZGluZy1jYWxsLWRpc3BhdGNoICR7TkFNRXRlc3QtRElSfS90ZXN0LXBlbmRpbmctY2FsbC1kaXNwYXRjaC5jKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3QtcGVuZGluZy1jYWxsLWRpc3BhdGNoICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9KQorQUREX1RFU1QodGVzdC1wZW5kaW5nLWNhbGwtZGlzcGF0Y2ggJHtFWEVDVVRBQkxFX09VVFBVVF9QQVRIfS90ZXN0LXBlbmRpbmctY2FsbC1kaXNwYXRjaCkKKworYWRkX2V4ZWN1dGFibGUodGVzdC1wZW5kaW5nLWNhbGwtdGltZW91dCAke05BTUV0ZXN0LURJUn0vdGVzdC1wZW5kaW5nLWNhbGwtdGltZW91dC5jKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3QtcGVuZGluZy1jYWxsLXRpbWVvdXQgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30pCitBRERfVEVTVCh0ZXN0LXBlbmRpbmctY2FsbC10aW1lb3V0ICR7RVhFQ1VUQUJMRV9PVVRQVVRfUEFUSH0vdGVzdC1wZW5kaW5nLWNhbGwtdGltZW91dCkKKworYWRkX2V4ZWN1dGFibGUodGVzdC10aHJlYWQtaW5pdCAke05BTUV0ZXN0LURJUn0vdGVzdC10aHJlYWRzLWluaXQuYykKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0LXRocmVhZC1pbml0ICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9KQorQUREX1RFU1QodGVzdC10aHJlYWQtaW5pdCAke0VYRUNVVEFCTEVfT1VUUFVUX1BBVEh9L3Rlc3QtdGhyZWFkLWluaXQpCisKK2FkZF9leGVjdXRhYmxlKHRlc3QtaWRzICR7TkFNRXRlc3QtRElSfS90ZXN0LWlkcy5jKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3QtaWRzICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9KQorQUREX1RFU1QodGVzdC1pZHMgJHtFWEVDVVRBQkxFX09VVFBVVF9QQVRIfS90ZXN0LWlkcykKKworYWRkX2V4ZWN1dGFibGUodGVzdC1zaHV0ZG93biAke05BTUV0ZXN0LURJUn0vdGVzdC1zaHV0ZG93bi5jKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3Qtc2h1dGRvd24gZGJ1cy10ZXN0dXRpbHMpCitBRERfVEVTVCh0ZXN0LXNodXRkb3duICR7RVhFQ1VUQUJMRV9PVVRQVVRfUEFUSH0vdGVzdC1zaHV0ZG93bikKKworYWRkX2V4ZWN1dGFibGUodGVzdC1wcml2c2VydmVyICR7TkFNRXRlc3QtRElSfS90ZXN0LXByaXZzZXJ2ZXIuYykKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0LXByaXZzZXJ2ZXIgZGJ1cy10ZXN0dXRpbHMpCitBRERfVEVTVCh0ZXN0LXByaXZzZXJ2ZXIgJHtFWEVDVVRBQkxFX09VVFBVVF9QQVRIfS90ZXN0LXByaXZzZXJ2ZXIpCisKK2FkZF9leGVjdXRhYmxlKHRlc3QtcHJpdnNlcnZlci1jbGllbnQgJHtOQU1FdGVzdC1ESVJ9L3Rlc3QtcHJpdnNlcnZlci1jbGllbnQuYykKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0LXByaXZzZXJ2ZXItY2xpZW50IGRidXMtdGVzdHV0aWxzKQorQUREX1RFU1QodGVzdC1wcml2c2VydmVyLWNsaWVudCAke0VYRUNVVEFCTEVfT1VUUFVUX1BBVEh9L3Rlc3QtcHJpdnNlcnZlci1jbGllbnQpCisKK2FkZF9leGVjdXRhYmxlKHRlc3QtYXV0b2xhdW5jaCAke05BTUV0ZXN0LURJUn0vdGVzdC1hdXRvbGF1bmNoLmMpCit0YXJnZXRfbGlua19saWJyYXJpZXModGVzdC1hdXRvbGF1bmNoIGRidXMtdGVzdHV0aWxzKQorQUREX1RFU1QodGVzdC1hdXRvbGF1bmNoICR7RVhFQ1VUQUJMRV9PVVRQVVRfUEFUSH0vdGVzdC1hdXRvbGF1bmNoKQorCitlbmRpZiAoREJVU19CVUlMRF9URVNUUykKZGlmZiAtLWdpdCBhL2RidXMvY21ha2UvdG9vbHMvQ01ha2VMaXN0cy50eHQgYi9kYnVzL2NtYWtlL3Rvb2xzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMWM3ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2NtYWtlL3Rvb2xzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNDkgQEAKK3Byb2plY3QodG9vbHMpCisKK3NldCAoZGJ1c19zZW5kX1NPVVJDRVMKKwkuLi8uLi90b29scy9kYnVzLXByaW50LW1lc3NhZ2UuYwkJCQorCS4uLy4uL3Rvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5oCQkJCisJLi4vLi4vdG9vbHMvZGJ1cy1zZW5kLmMKKykKKworc2V0IChkYnVzX21vbml0b3JfU09VUkNFUworCS4uLy4uL3Rvb2xzL2RidXMtbW9uaXRvci5jCQkJCQorCS4uLy4uL3Rvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5jCQkJCisJLi4vLi4vdG9vbHMvZGJ1cy1wcmludC1tZXNzYWdlLmgKKykKKworaWYgKFdJTjMyKQorc2V0IChkYnVzX2xhdW5jaF9TT1VSQ0VTCisJLi4vLi4vdG9vbHMvZGJ1cy1sYXVuY2gtd2luLmMKKykKK2Vsc2UgKFdJTjMyKQorc2V0IChkYnVzX2xhdW5jaF9TT1VSQ0VTCisJLi4vLi4vdG9vbHMvZGJ1cy1sYXVuY2guYworKQorZW5kaWYgKFdJTjMyKQorCitpZiAoREJVU19CVUlMRF9YMTEpCitzZXQgKGRidXNfbGF1bmNoX1NPVVJDRVMKKyAgICAgJHtkYnVzX2xhdW5jaF9TT1VSQ0VTfQorICAgICAuLi8uLi90b29scy9kYnVzLWxhdW5jaC14MTEuYworKQorZW5kaWYoREJVU19CVUlMRF9YMTEpCisKK3NldCAoZGJ1c19jbGVhbnVwX3NvY2tldHNfU09VUkNFUworCS4uLy4uL3Rvb2xzL2RidXMtY2xlYW51cC1zb2NrZXRzLmMKKykKKworYWRkX2V4ZWN1dGFibGUoZGJ1cy1zZW5kICR7ZGJ1c19zZW5kX1NPVVJDRVN9KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGRidXMtc2VuZCAke0RCVVNfTElCUkFSSUVTfSkKK2luc3RhbGxfdGFyZ2V0cygvYmluIGRidXMtc2VuZCApCisKK2FkZF9leGVjdXRhYmxlKGRidXMtbGF1bmNoICR7ZGJ1c19sYXVuY2hfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy1sYXVuY2ggKQoraWYgKERCVVNfQlVJTERfWDExKQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy1sYXVuY2ggJHtYMTFfTElCUkFSSUVTfSApCitlbmRpZiAoREJVU19CVUlMRF9YMTEpCitpbnN0YWxsX3RhcmdldHMoL2JpbiBkYnVzLWxhdW5jaCApCisKK2FkZF9leGVjdXRhYmxlKGRidXMtbW9uaXRvciAke2RidXNfbW9uaXRvcl9TT1VSQ0VTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhkYnVzLW1vbml0b3IgJHtEQlVTX0xJQlJBUklFU30pCitpbnN0YWxsX3RhcmdldHMoL2JpbiBkYnVzLW1vbml0b3IgKQpkaWZmIC0tZ2l0IGEvZGJ1cy9jbWFrZS90b29scy9kYnVzLWxhdW5jaC54bWwgYi9kYnVzL2NtYWtlL3Rvb2xzL2RidXMtbGF1bmNoLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzM0ODk4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9jbWFrZS90b29scy9kYnVzLWxhdW5jaC54bWwKQEAgLTAsMCArMSwyNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzwhRE9DVFlQRSByZWZlbnRyeSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMS4yLy9FTiIKKyAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjEuMi9kb2Nib29reC5kdGQiPgorPCEtLSBsaWZ0ZWQgZnJvbSB0cm9mZittYW4gYnkgZG9jbGlmdGVyIC0tPgorPHJlZmVudHJ5IGlkPSdkYnVzbGF1bmNoMSc+Cis8IS0tICAgLS0+Cis8IS0tICBkYnVzXC1sYXVuY2ggbWFudWFsIHBhZ2UuIC0tPgorPCEtLSAgQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4gLS0+CisKKzxyZWZtZXRhPgorPHJlZmVudHJ5dGl0bGU+ZGJ1cy1sYXVuY2g8L3JlZmVudHJ5dGl0bGU+Cis8bWFudm9sbnVtPjE8L21hbnZvbG51bT4KKzwvcmVmbWV0YT4KKzxyZWZuYW1lZGl2IGlkPSduYW1lJz4KKzxyZWZuYW1lPmRidXMtbGF1bmNoPC9yZWZuYW1lPgorPHJlZnB1cnBvc2U+VXRpbGl0eSB0byBzdGFydCBhIG1lc3NhZ2UgYnVzIGZyb20gYSBzaGVsbCBzY3JpcHQ8L3JlZnB1cnBvc2U+Cis8L3JlZm5hbWVkaXY+Cis8IS0tIGJvZHkgYmVnaW5zIGhlcmUgLS0+Cis8cmVmc3lub3BzaXNkaXYgaWQ9J3N5bm9wc2lzJz4KKzxjbWRzeW5vcHNpcz4KKyAgPGNvbW1hbmQ+ZGJ1cy1sYXVuY2g8L2NvbW1hbmQ+ICAgIDxhcmcgY2hvaWNlPSdvcHQnPi0tdmVyc2lvbiA8L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLXNoLXN5bnRheCA8L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLWNzaC1zeW50YXggPC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+LS1hdXRvLXN5bnRheCA8L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLWV4aXQtd2l0aC1zZXNzaW9uIDwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdvcHQnPi0tYXV0b2xhdW5jaD08cmVwbGFjZWFibGU+TUFDSElORUlEPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLWNvbmZpZy1maWxlPTxyZXBsYWNlYWJsZT5GSUxFTkFNRTwvcmVwbGFjZWFibGU+PC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+PHJlcGxhY2VhYmxlPlBST0dSQU08L3JlcGxhY2VhYmxlPjwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdvcHQnIHJlcD0ncmVwZWF0Jz48cmVwbGFjZWFibGU+QVJHUzwvcmVwbGFjZWFibGU+PC9hcmc+CisgICAgPHNici8+Cis8L2NtZHN5bm9wc2lzPgorPC9yZWZzeW5vcHNpc2Rpdj4KKworCis8cmVmc2VjdDEgaWQ9J2Rlc2NyaXB0aW9uJz48dGl0bGU+REVTQ1JJUFRJT048L3RpdGxlPgorPHBhcmE+VGhlIDxjb21tYW5kPmRidXMtbGF1bmNoPC9jb21tYW5kPiBjb21tYW5kIGlzIHVzZWQgdG8gc3RhcnQgYSBzZXNzaW9uIGJ1cyAKK2luc3RhbmNlIG9mIDxlbXBoYXNpcyByZW1hcD0nSSc+ZGJ1cy1kYWVtb248L2VtcGhhc2lzPiBmcm9tIGEgc2hlbGwgc2NyaXB0LgorSXQgd291bGQgbm9ybWFsbHkgYmUgY2FsbGVkIGZyb20gYSB1c2VyJ3MgbG9naW4KK3NjcmlwdHMuIFVubGlrZSB0aGUgZGFlbW9uIGl0c2VsZiwgPGNvbW1hbmQ+ZGJ1cy1sYXVuY2g8L2NvbW1hbmQ+IGV4aXRzLCBzbworYmFja3RpY2tzIG9yIHRoZSAkKCkgY29uc3RydWN0IGNhbiBiZSB1c2VkIHRvIHJlYWQgaW5mb3JtYXRpb24gZnJvbQorPGNvbW1hbmQ+ZGJ1cy1sYXVuY2g8L2NvbW1hbmQ+LjwvcGFyYT4KKworPHBhcmE+V2l0aCBubyBhcmd1bWVudHMsIDxjb21tYW5kPmRidXMtbGF1bmNoPC9jb21tYW5kPiB3aWxsIGxhdW5jaCBhIHNlc3Npb24gYnVzCitpbnN0YW5jZSBhbmQgcHJpbnQgdGhlIGFkZHJlc3MgYW5kIHBpZCBvZiB0aGF0IGluc3RhbmNlIHRvIHN0YW5kYXJkCitvdXRwdXQuPC9wYXJhPgorCis8cGFyYT5Zb3UgbWF5IHNwZWNpZnkgYSBwcm9ncmFtIHRvIGJlIHJ1bjsgaW4gdGhpcyBjYXNlLCA8Y29tbWFuZD5kYnVzLWxhdW5jaDwvY29tbWFuZD4KK3dpbGwgbGF1bmNoIGEgc2Vzc2lvbiBidXMgaW5zdGFuY2UsIHNldCB0aGUgYXBwcm9wcmlhdGUgZW52aXJvbm1lbnQKK3ZhcmlhYmxlcyBzbyB0aGUgc3BlY2lmaWVkIHByb2dyYW0gY2FuIGZpbmQgdGhlIGJ1cywgYW5kIHRoZW4gZXhlY3V0ZSB0aGUKK3NwZWNpZmllZCBwcm9ncmFtLCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzLiAgU2VlIGJlbG93IGZvcgorZXhhbXBsZXMuPC9wYXJhPgorCis8cGFyYT5JZiB5b3UgbGF1bmNoIGEgcHJvZ3JhbSwgPGNvbW1hbmQ+ZGJ1cy1sYXVuY2g8L2NvbW1hbmQ+IHdpbGwgbm90IHByaW50IHRoZQoraW5mb3JtYXRpb24gYWJvdXQgdGhlIG5ldyBidXMgdG8gc3RhbmRhcmQgb3V0cHV0LjwvcGFyYT4KKworPHBhcmE+V2hlbiA8Y29tbWFuZD5kYnVzLWxhdW5jaDwvY29tbWFuZD4gcHJpbnRzIGJ1cyBpbmZvcm1hdGlvbiB0byBzdGFuZGFyZCBvdXRwdXQsIGJ5CitkZWZhdWx0IGl0IGlzIGluIGEgc2ltcGxlIGtleS12YWx1ZSBwYWlycyBmb3JtYXQuIEhvd2V2ZXIsIHlvdSBtYXkgCityZXF1ZXN0IHNldmVyYWwgYWx0ZXJuYXRlIHN5bnRheGVzIHVzaW5nIHRoZSAtLXNoLXN5bnRheCwgLS1jc2gtc3ludGF4LAorLS1iaW5hcnktc3ludGF4LCBvcgorLS1hdXRvLXN5bnRheCBvcHRpb25zLiBTZXZlcmFsIG9mIHRoZXNlIGNhdXNlIDxjb21tYW5kPmRidXMtbGF1bmNoPC9jb21tYW5kPiB0byBlbWl0IHNoZWxsIGNvZGUKK3RvIHNldCB1cCB0aGUgZW52aXJvbm1lbnQuPC9wYXJhPgorCis8cGFyYT5XaXRoIHRoZSAtLWF1dG8tc3ludGF4IG9wdGlvbiwgPGNvbW1hbmQ+ZGJ1cy1sYXVuY2g8L2NvbW1hbmQ+IGxvb2tzIGF0IHRoZSB2YWx1ZQorb2YgdGhlIFNIRUxMIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGRldGVybWluZSB3aGljaCBzaGVsbCBzeW50YXgKK3Nob3VsZCBiZSB1c2VkLiAgSWYgU0hFTEwgZW5kcyBpbiAiY3NoIiwgdGhlbiBjc2gtY29tcGF0aWJsZSBjb2RlIGlzCitlbWl0dGVkOyBvdGhlcndpc2UgQm91cm5lIHNoZWxsIGNvZGUgaXMgZW1pdHRlZC4gIEluc3RlYWQgb2YgcGFzc2luZworLS1hdXRvLXN5bnRheCwgeW91IG1heSBleHBsaWNpdHkgc3BlY2lmeSBhIHBhcnRpY3VsYXIgb25lIGJ5IHVzaW5nCistLXNoLXN5bnRheCBmb3IgQm91cm5lIHN5bnRheCwgb3IgLS1jc2gtc3ludGF4IGZvciBjc2ggc3ludGF4LgorSW4gc2NyaXB0cywgaXQncyBtb3JlIHJvYnVzdCB0byBhdm9pZCAtLWF1dG8tc3ludGF4IGFuZCB5b3UgaG9wZWZ1bGx5Citrbm93IHdoaWNoIHNoZWxsIHlvdXIgc2NyaXB0IGlzIHdyaXR0ZW4gaW4uPC9wYXJhPgorCisKKzxwYXJhPlNlZSA8dWxpbmsgdXJsPSdodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyc+aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy88L3VsaW5rPiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorYWJvdXQgRC1CdXMuIFNlZSBhbHNvIHRoZSBtYW4gcGFnZSBmb3IgPGVtcGhhc2lzIHJlbWFwPSdJJz5kYnVzLWRhZW1vbjwvZW1waGFzaXM+LjwvcGFyYT4KKworCis8cGFyYT5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSA8Y29tbWFuZD5kYnVzLWxhdW5jaDwvY29tbWFuZD4gd2l0aCBhbiAKK3NoLWNvbXBhdGlibGUgc2hlbGwgdG8gc3RhcnQgdGhlIHBlci1zZXNzaW9uIGJ1cyBkYWVtb246PC9wYXJhPgorPGxpdGVyYWxsYXlvdXQgcmVtYXA9Jy5uZic+CisKKyAgIyMgdGVzdCBmb3IgYW4gZXhpc3RpbmcgYnVzIGRhZW1vbiwganVzdCB0byBiZSBzYWZlCisgIGlmIHRlc3QgLXogIiREQlVTX1NFU1NJT05fQlVTX0FERFJFU1MiIDsgdGhlbgorICAgICAgIyMgaWYgbm90IGZvdW5kLCBsYXVuY2ggYSBuZXcgb25lCisgICAgICBldmFsIGBkYnVzLWxhdW5jaCAtLXNoLXN5bnRheCAtLWV4aXQtd2l0aC1zZXNzaW9uYAorICAgICAgZWNobyAiRC1CdXMgcGVyLXNlc3Npb24gZGFlbW9uIGFkZHJlc3MgaXM6ICREQlVTX1NFU1NJT05fQlVTX0FERFJFU1MiCisgIGZpCisKKzwvbGl0ZXJhbGxheW91dD4gPCEtLSAuZmkgLS0+Cis8cGFyYT5Zb3UgbWlnaHQgcnVuIHNvbWV0aGluZyBsaWtlIHRoYXQgaW4geW91ciBsb2dpbiBzY3JpcHRzLjwvcGFyYT4KKworCis8cGFyYT5Bbm90aGVyIHdheSB0byB1c2UgPGNvbW1hbmQ+ZGJ1cy1sYXVuY2g8L2NvbW1hbmQ+IGlzIHRvIHJ1biB5b3VyIG1haW4gc2Vzc2lvbgorcHJvZ3JhbSwgbGlrZSBzbzo8L3BhcmE+Cis8bGl0ZXJhbGxheW91dCByZW1hcD0nLm5mJz4KKworZGJ1cy1sYXVuY2ggZ25vbWUtc2Vzc2lvbgorCis8L2xpdGVyYWxsYXlvdXQ+IDwhLS0gLmZpIC0tPgorPHBhcmE+VGhlIGFib3ZlIHdvdWxkIGxpa2VseSBiZSBhcHByb3ByaWF0ZSBmb3Igfi8ueHNlc3Npb24gb3Igfi8uWGNsaWVudHMuPC9wYXJhPgorCis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDEgaWQ9J2F1dG9tYXRpY19sYXVuY2hpbmcnPjx0aXRsZT5BVVRPTUFUSUMgTEFVTkNISU5HPC90aXRsZT4KKzxwYXJhPklmIERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyBpcyBub3Qgc2V0IGZvciBhIHByb2Nlc3MgdGhhdCB0cmllcyB0byB1c2UKK0QtQnVzLCBieSBkZWZhdWx0IHRoZSBwcm9jZXNzIHdpbGwgYXR0ZW1wdCB0byBpbnZva2UgZGJ1cy1sYXVuY2ggd2l0aAordGhlIC0tYXV0b2xhdW5jaCBvcHRpb24gdG8gc3RhcnQgdXAgYSBuZXcgc2Vzc2lvbiBidXMgb3IgZmluZCB0aGUgCitleGlzdGluZyBidXMgYWRkcmVzcyBvbiB0aGUgWCBkaXNwbGF5IG9yIGluIGEgZmlsZSBpbgorfi8uZGJ1cy9zZXNzaW9uLWJ1cy88L3BhcmE+CisKKworPHBhcmE+V2hlbmV2ZXIgYW4gYXV0b2xhdW5jaCBvY2N1cnMsIHRoZSBhcHBsaWNhdGlvbiB0aGF0IGhhZCB0bworc3RhcnQgYSBuZXcgYnVzIHdpbGwgYmUgaW4gaXRzIG93biBsaXR0bGUgd29ybGQ7IGl0IGNhbiBlZmZlY3RpdmVseQorZW5kIHVwIHN0YXJ0aW5nIGEgd2hvbGUgbmV3IHNlc3Npb24gaWYgaXQgdHJpZXMgdG8gdXNlIGEgbG90IG9mIAorYnVzIHNlcnZpY2VzLiBUaGlzIGNhbiBiZSBzdWJvcHRpbWFsIG9yIGV2ZW4gdG90YWxseSBicm9rZW4sIGRlcGVuZGluZworb24gdGhlIGFwcCBhbmQgd2hhdCBpdCB0cmllcyB0byBkby48L3BhcmE+CisKKworPHBhcmE+VGhlcmUgYXJlIHR3byBjb21tb24gcmVhc29ucyBmb3IgYXV0b2xhdW5jaC4gT25lIGlzIHNzaCB0byBhIHJlbW90ZQorbWFjaGluZS4gVGhlIGlkZWFsIGZpeCBmb3IgdGhhdCB3b3VsZCBiZSBmb3J3YXJkaW5nIG9mCitEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MgaW4gdGhlIHNhbWUgd2F5IHRoYXQgRElTUExBWSBpcyBmb3J3YXJkZWQuCitJbiB0aGUgbWVhbnRpbWUsIHlvdSBjYW4gZWRpdCB0aGUgc2Vzc2lvbi5jb25mIGNvbmZpZyBmaWxlIHRvIAoraGF2ZSB5b3VyIHNlc3Npb24gYnVzIGxpc3RlbiBvbiBUQ1AsIGFuZCBtYW51YWxseSBzZXQKK0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUywgaWYgeW91IGxpa2UuPC9wYXJhPgorCisKKzxwYXJhPlRoZSBzZWNvbmQgY29tbW9uIHJlYXNvbiBmb3IgYXV0b2xhdW5jaCBpcyBhbiBzdSB0byBhbm90aGVyIHVzZXIsIGFuZAorZGlzcGxheSBvZiBYIGFwcGxpY2F0aW9ucyBydW5uaW5nIGFzIHRoZSBzZWNvbmQgdXNlciBvbiB0aGUgZGlzcGxheQorYmVsb25naW5nIHRvIHRoZSBmaXJzdCB1c2VyLiBQZXJoYXBzIHRoZSBpZGVhbCBmaXggaW4gdGhpcyBjYXNlCit3b3VsZCBiZSB0byBhbGxvdyB0aGUgc2Vjb25kIHVzZXIgdG8gY29ubmVjdCB0byB0aGUgc2Vzc2lvbiBidXMgb2YgdGhlCitmaXJzdCB1c2VyLCBqdXN0IGFzIHRoZXkgY2FuIGNvbm5lY3QgdG8gdGhlIGZpcnN0IHVzZXIncyBkaXNwbGF5LgorSG93ZXZlciwgYSBtZWNoYW5pc20gZm9yIHRoYXQgaGFzIG5vdCBiZWVuIGNvZGVkLjwvcGFyYT4KKworCis8cGFyYT5Zb3UgY2FuIGFsd2F5cyBhdm9pZCBhdXRvbGF1bmNoIGJ5IG1hbnVhbGx5IHNldHRpbmcKK0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUy4gQXV0b2xhdW5jaCBoYXBwZW5zIGJlY2F1c2UgdGhlIGRlZmF1bHQKK2FkZHJlc3MgaWYgbm9uZSBpcyBzZXQgaXMgImF1dG9sYXVuY2g6Iiwgc28gaWYgYW55IG90aGVyIGFkZHJlc3MgaXMKK3NldCB0aGVyZSB3aWxsIGJlIG5vIGF1dG9sYXVuY2guIFlvdSBjYW4gaG93ZXZlciBpbmNsdWRlIGF1dG9sYXVuY2ggaW4KK2FuIGV4cGxpY2l0IHNlc3Npb24gYnVzIGFkZHJlc3MgYXMgYSBmYWxsYmFjaywgZm9yIGV4YW1wbGUKK0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUz0ic29tZXRoaW5nOixhdXRvbGF1bmNoOiIgLSBpbiB0aGF0IGNhc2UgaWYKK3RoZSBmaXJzdCBhZGRyZXNzIGRvZXNuJ3Qgd29yaywgcHJvY2Vzc2VzIHdpbGwgYXV0b2xhdW5jaC4gKFRoZSBidXMKK2FkZHJlc3MgdmFyaWFibGUgY29udGFpbnMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBhZGRyZXNzZXMgdG8gdHJ5Lik8L3BhcmE+CisKKworPHBhcmE+VGhlIC0tYXV0b2xhdW5jaCBvcHRpb24gaXMgY29uc2lkZXJlZCBhbiBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbgorZGV0YWlsIG9mIGxpYmRidXMsIGFuZCBpbiBmYWN0IHRoZXJlIGFyZSBwbGFucyB0byBjaGFuZ2UgaXQuIFRoZXJlJ3MKK25vIHJlYWwgcmVhc29uIHRvIHVzZSBpdCBvdXRzaWRlIG9mIHRoZSBsaWJkYnVzIGltcGxlbWVudGF0aW9uIGFueWhvdy48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nb3B0aW9ucyc+PHRpdGxlPk9QVElPTlM8L3RpdGxlPgorPHBhcmE+VGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBzdXBwb3J0ZWQ6PC9wYXJhPgorPHZhcmlhYmxlbGlzdCByZW1hcD0nVFAnPgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tYXV0by1zeW50YXg8L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPkNob29zZSAtLWNzaC1zeW50YXggb3IgLS1zaC1zeW50YXggYmFzZWQgb24gdGhlIFNIRUxMIGVudmlyb25tZW50IHZhcmlhYmxlLjwvcGFyYT4KKworPHBhcmE+PG9wdGlvbj4tLWJpbmFyeS1zeW50YXg8L29wdGlvbj4KK1dyaXRlIHRvIHN0ZG91dCBhIG51bC10ZXJtaW5hdGVkIGJ1cyBhZGRyZXNzLCB0aGVuIHRoZSBidXMgUElEIGFzIGEKK2JpbmFyeSBpbnRlZ2VyIG9mIHNpemUgc2l6ZW9mKHBpZF90KSwgdGhlbiB0aGUgYnVzIFggd2luZG93IElEIGFzIGEKK2JpbmFyeSBpbnRlZ2VyIG9mIHNpemUgc2l6ZW9mKGxvbmcpLiBJbnRlZ2VycyBhcmUgaW4gdGhlIG1hY2hpbmUncworYnl0ZSBvcmRlciwgbm90IG5ldHdvcmsgYnl0ZSBvcmRlciBvciBhbnkgb3RoZXIgY2Fub25pY2FsIGJ5dGUgb3JkZXIuPC9wYXJhPgorCisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tY2xvc2Utc3RkZXJyPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5DbG9zZSB0aGUgc3RhbmRhcmQgZXJyb3Igb3V0cHV0IHN0cmVhbSBiZWZvcmUgc3RhcnRpbmcgdGhlIEQtQnVzCitkYWVtb24uIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGNhcHR1cmUgZGJ1cy1sYXVuY2ggZXJyb3IKK21lc3NhZ2VzIGJ1dCB5b3UgZG9uJ3Qgd2FudCBkYnVzLWRhZW1vbiB0byBrZWVwIHRoZSBzdHJlYW0gb3BlbiB0bworeW91ciBhcHBsaWNhdGlvbi48L3BhcmE+CisKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1jb25maWctZmlsZT1GSUxFTkFNRTwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+UGFzcyAtLWNvbmZpZy1maWxlPUZJTEVOQU1FIHRvIHRoZSBidXMgZGFlbW9uLCBpbnN0ZWFkIG9mIHBhc3NpbmcgaXQgCit0aGUgLS1zZXNzaW9uIGFyZ3VtZW50LiBTZWUgdGhlIG1hbiBwYWdlIGZvciBkYnVzLWRhZW1vbjwvcGFyYT4KKworICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLWNzaC1zeW50YXg8L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPkVtaXQgY3NoIGNvbXBhdGlibGUgY29kZSB0byBzZXQgdXAgZW52aXJvbm1lbnQgdmFyaWFibGVzLjwvcGFyYT4KKworICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLWV4aXQtd2l0aC1zZXNzaW9uPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5JZiB0aGlzIG9wdGlvbiBpcyBwcm92aWRlZCwgYSBwZXJzaXN0ZW50ICJiYWJ5c2l0dGVyIiBwcm9jZXNzIHdpbGwgYmUgCitjcmVhdGVkIHRoYXQgd2F0Y2hlcyBzdGRpbiBmb3IgSFVQIGFuZCB0cmllcyB0byBjb25uZWN0IHRvIHRoZSBYCitzZXJ2ZXIuIElmIHRoaXMgcHJvY2VzcyBnZXRzIGEgSFVQIG9uIHN0ZGluIG9yIGxvc2VzIGl0cyBYIGNvbm5lY3Rpb24sCitpdCBraWxscyB0aGUgbWVzc2FnZSBidXMgZGFlbW9uLjwvcGFyYT4KKworICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLWF1dG9sYXVuY2g9TUFDSElORUlEPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5UaGlzIG9wdGlvbiBpbXBsaWVzIHRoYXQgPGNvbW1hbmQ+ZGJ1cy1sYXVuY2g8L2NvbW1hbmQ+IHNob3VsZCBzY2FuIGZvciBhCitwcmV2aW91c2x5LXN0YXJ0ZWQgc2Vzc2lvbiBhbmQgcmV1c2UgdGhlIHZhbHVlcyBmb3VuZCB0aGVyZS4gSWYgbm8KK3Nlc3Npb24gaXMgZm91bmQsIGl0IHdpbGwgc3RhcnQgYSBuZXcgc2Vzc2lvbi4gVGhlCistLWV4aXQtd2l0aC1zZXNzaW9uIG9wdGlvbiBpcyBpbXBsaWVkIGlmIC0tYXV0b2xhdW5jaCBpcyBnaXZlbi4KK1RoaXMgb3B0aW9uIGlzIGZvciB0aGUgZXhjbHVzaXZlIHVzZSBvZiBsaWJkYnVzLCB5b3UgZG8gbm90IHdhbnQgdG8KK3VzZSBpdCBtYW51YWxseS4gSXQgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLjwvcGFyYT4KKworICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLXNoLXN5bnRheDwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+RW1pdCBCb3VybmUtc2hlbGwgY29tcGF0aWJsZSBjb2RlIHRvIHNldCB1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuPC9wYXJhPgorCisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tdmVyc2lvbjwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+UHJpbnQgdGhlIHZlcnNpb24gb2YgZGJ1cy1sYXVuY2g8L3BhcmE+CisKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+Cis8L3ZhcmlhYmxlbGlzdD4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nYXV0aG9yJz48dGl0bGU+QVVUSE9SPC90aXRsZT4KKzxwYXJhPlNlZSA8dWxpbmsgdXJsPSdodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzL2RvYy9BVVRIT1JTJz5odHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzL2RvYy9BVVRIT1JTPC91bGluaz48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nYnVncyc+PHRpdGxlPkJVR1M8L3RpdGxlPgorPHBhcmE+UGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgdG8gdGhlIEQtQnVzIG1haWxpbmcgbGlzdCBvciBidWcgdHJhY2tlciwKK3NlZSA8dWxpbmsgdXJsPSdodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyc+aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy88L3VsaW5rPjwvcGFyYT4KKzwvcmVmc2VjdDE+Cis8L3JlZmVudHJ5PgorCmRpZmYgLS1naXQgYS9kYnVzL2NtYWtlL3Rvb2xzL2RidXMtbW9uaXRvci54bWwgYi9kYnVzL2NtYWtlL3Rvb2xzL2RidXMtbW9uaXRvci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQxY2FjZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvY21ha2UvdG9vbHMvZGJ1cy1tb25pdG9yLnhtbApAQCAtMCwwICsxLDEyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPCFET0NUWVBFIHJlZmVudHJ5IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC4xLjIvL0VOIgorICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuMS4yL2RvY2Jvb2t4LmR0ZCI+Cis8IS0tIGxpZnRlZCBmcm9tIHRyb2ZmK21hbiBieSBkb2NsaWZ0ZXIgLS0+Cis8cmVmZW50cnkgaWQ9J2RidXNtb25pdG9yMSc+Cis8IS0tICAgLS0+Cis8IS0tICBkYnVzXC1tb25pdG9yIG1hbnVhbCBwYWdlLiAtLT4KKzwhLS0gIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuIC0tPgorCis8cmVmbWV0YT4KKzxyZWZlbnRyeXRpdGxlPmRidXMtbW9uaXRvcjwvcmVmZW50cnl0aXRsZT4KKzxtYW52b2xudW0+MTwvbWFudm9sbnVtPgorPC9yZWZtZXRhPgorPHJlZm5hbWVkaXYgaWQ9J25hbWUnPgorPHJlZm5hbWU+ZGJ1cy1tb25pdG9yPC9yZWZuYW1lPgorPHJlZnB1cnBvc2U+ZGVidWcgcHJvYmUgdG8gcHJpbnQgbWVzc2FnZSBidXMgbWVzc2FnZXM8L3JlZnB1cnBvc2U+Cis8L3JlZm5hbWVkaXY+Cis8IS0tIGJvZHkgYmVnaW5zIGhlcmUgLS0+Cis8cmVmc3lub3BzaXNkaXYgaWQ9J3N5bm9wc2lzJz4KKzxjbWRzeW5vcHNpcz4KKyAgPGNvbW1hbmQ+ZGJ1cy1tb25pdG9yPC9jb21tYW5kPiAgICAKKyAgICA8Z3JvdXAgY2hvaWNlPSdvcHQnPjxhcmcgY2hvaWNlPSdwbGFpbic+LS1zeXN0ZW0gPC9hcmc+PGFyZyBjaG9pY2U9J3BsYWluJz4tLXNlc3Npb24gPC9hcmc+PGFyZyBjaG9pY2U9J3BsYWluJz4tLWFkZHJlc3MgPHJlcGxhY2VhYmxlPkFERFJFU1M8L3JlcGxhY2VhYmxlPjwvYXJnPjwvZ3JvdXA+CisgICAgPGdyb3VwIGNob2ljZT0nb3B0Jz48YXJnIGNob2ljZT0ncGxhaW4nPi0tcHJvZmlsZSA8L2FyZz48YXJnIGNob2ljZT0ncGxhaW4nPi0tbW9uaXRvciA8L2FyZz48L2dyb3VwPgorICAgIDxhcmcgY2hvaWNlPSdvcHQnPjxhcmcgY2hvaWNlPSdwbGFpbic+PHJlcGxhY2VhYmxlPndhdGNoPC9yZXBsYWNlYWJsZT48L2FyZz48YXJnIGNob2ljZT0ncGxhaW4nPjxyZXBsYWNlYWJsZT5leHByZXNzaW9uczwvcmVwbGFjZWFibGU+PC9hcmc+PC9hcmc+CisgICAgPHNici8+Cis8L2NtZHN5bm9wc2lzPgorPC9yZWZzeW5vcHNpc2Rpdj4KKworCis8cmVmc2VjdDEgaWQ9J2Rlc2NyaXB0aW9uJz48dGl0bGU+REVTQ1JJUFRJT048L3RpdGxlPgorPHBhcmE+VGhlIDxjb21tYW5kPmRidXMtbW9uaXRvcjwvY29tbWFuZD4gY29tbWFuZCBpcyB1c2VkIHRvIG1vbml0b3IgbWVzc2FnZXMgZ29pbmcKK3Rocm91Z2ggYSBELUJ1cyBtZXNzYWdlIGJ1cy4gIFNlZQorPHVsaW5rIHVybD0naHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8nPmh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvPC91bGluaz4gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQKK3RoZSBiaWcgcGljdHVyZS48L3BhcmE+CisKKworPHBhcmE+VGhlcmUgYXJlIHR3byB3ZWxsLWtub3duIG1lc3NhZ2UgYnVzZXM6IHRoZSBzeXN0ZW13aWRlIG1lc3NhZ2UgYnVzCisoaW5zdGFsbGVkIG9uIG1hbnkgc3lzdGVtcyBhcyB0aGUgIm1lc3NhZ2VidXMiIHNlcnZpY2UpIGFuZCB0aGUKK3Blci11c2VyLWxvZ2luLXNlc3Npb24gbWVzc2FnZSBidXMgKHN0YXJ0ZWQgZWFjaCB0aW1lIGEgdXNlciBsb2dzIGluKS4KK1RoZSAtLXN5c3RlbSBhbmQgLS1zZXNzaW9uIG9wdGlvbnMgZGlyZWN0IDxjb21tYW5kPmRidXMtbW9uaXRvcjwvY29tbWFuZD4gdG8KK21vbml0b3IgdGhlIHN5c3RlbSBvciBzZXNzaW9uIGJ1c2VzIHJlc3BlY3RpdmVseS4gIElmIG5laXRoZXIgaXMKK3NwZWNpZmllZCwgPGNvbW1hbmQ+ZGJ1cy1tb25pdG9yPC9jb21tYW5kPiBtb25pdG9ycyB0aGUgc2Vzc2lvbiBidXMuPC9wYXJhPgorCisKKzxwYXJhPjxjb21tYW5kPmRidXMtbW9uaXRvcjwvY29tbWFuZD4gaGFzIHR3byBkaWZmZXJlbnQgb3V0cHV0IG1vZGVzLCB0aGUgJ2NsYXNzaWMnLXN0eWxlCittb25pdG9yaW5nIG1vZGUgYW5kIHByb2ZpbGluZyBtb2RlLiBUaGUgcHJvZmlsaW5nIGZvcm1hdCBpcyBhIGNvbXBhY3QKK2Zvcm1hdCB3aXRoIGEgc2luZ2xlIGxpbmUgcGVyIG1lc3NhZ2UgYW5kIG1pY3Jvc2Vjb25kLXJlc29sdXRpb24gdGltaW5nCitpbmZvcm1hdGlvbi4gVGhlIC0tcHJvZmlsZSBhbmQgLS1tb25pdG9yIG9wdGlvbnMgc2VsZWN0IHRoZSBwcm9maWxpbmcKK2FuZCBtb25pdG9yaW5nIG91dHB1dCBmb3JtYXQgcmVzcGVjdGl2ZWx5LiBJZiBuZWl0aGVyIGlzIHNwZWNpZmllZCwKKzxjb21tYW5kPmRidXMtbW9uaXRvcjwvY29tbWFuZD4gdXNlcyB0aGUgbW9uaXRvcmluZyBvdXRwdXQgZm9ybWF0LjwvcGFyYT4KKworCis8cGFyYT5JbiBvcmRlciB0byBnZXQgPGNvbW1hbmQ+ZGJ1cy1tb25pdG9yPC9jb21tYW5kPiB0byBzZWUgdGhlIG1lc3NhZ2VzIHlvdSBhcmUgaW50ZXJlc3RlZAoraW4sIHlvdSBzaG91bGQgc3BlY2lmeSBhIHNldCBvZiB3YXRjaCBleHByZXNzaW9ucyBhcyB5b3Ugd291bGQgZXhwZWN0IHRvCitiZSBwYXNzZWQgdG8gdGhlIDxlbXBoYXNpcyByZW1hcD0nSSc+ZGJ1c19idXNfYWRkX21hdGNoPC9lbXBoYXNpcz4gZnVuY3Rpb24uPC9wYXJhPgorCisKKzxwYXJhPlRoZSBtZXNzYWdlIGJ1cyBjb25maWd1cmF0aW9uIG1heSBrZWVwIDxjb21tYW5kPmRidXMtbW9uaXRvcjwvY29tbWFuZD4gZnJvbSBzZWVpbmcKK2FsbCBtZXNzYWdlcywgZXNwZWNpYWxseSBpZiB5b3UgcnVuIHRoZSBtb25pdG9yIGFzIGEgbm9uLXJvb3QgdXNlci48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nb3B0aW9ucyc+PHRpdGxlPk9QVElPTlM8L3RpdGxlPgorPHZhcmlhYmxlbGlzdCByZW1hcD0nVFAnPgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tc3lzdGVtPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5Nb25pdG9yIHRoZSBzeXN0ZW0gbWVzc2FnZSBidXMuPC9wYXJhPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLXNlc3Npb248L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPk1vbml0b3IgdGhlIHNlc3Npb24gbWVzc2FnZSBidXMuICAoVGhpcyBpcyB0aGUgZGVmYXVsdC4pPC9wYXJhPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLWFkZHJlc3MgQUREUkVTUzwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+TW9uaXRvciBhbiBhcmJpdHJhcnkgbWVzc2FnZSBidXMgZ2l2ZW4gYXQgQUREUkVTUy48L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tcHJvZmlsZTwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+VXNlIHRoZSBwcm9maWxpbmcgb3V0cHV0IGZvcm1hdC48L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tbW9uaXRvcjwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+VXNlIHRoZSBtb25pdG9yaW5nIG91dHB1dCBmb3JtYXQuICAoVGhpcyBpcyB0aGUgZGVmYXVsdC4pPC9wYXJhPgorCisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorPC92YXJpYWJsZWxpc3Q+Cis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDEgaWQ9J2V4YW1wbGUnPjx0aXRsZT5FWEFNUExFPC90aXRsZT4KKzxwYXJhPkhlcmUgaXMgYW4gZXhhbXBsZSBvZiB1c2luZyBkYnVzLW1vbml0b3IgdG8gd2F0Y2ggZm9yIHRoZSBnbm9tZSB0eXBpbmcKK21vbml0b3IgdG8gc2F5IHRoaW5nczwvcGFyYT4KKzxsaXRlcmFsbGF5b3V0IHJlbWFwPScubmYnPgorCisgIGRidXMtbW9uaXRvciAidHlwZT0nc2lnbmFsJyxzZW5kZXI9J29yZy5nbm9tZS5UeXBpbmdNb25pdG9yJyxpbnRlcmZhY2U9J29yZy5nbm9tZS5UeXBpbmdNb25pdG9yJyIKKworPC9saXRlcmFsbGF5b3V0PiA8IS0tIC5maSAtLT4KKworPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxIGlkPSdhdXRob3InPjx0aXRsZT5BVVRIT1I8L3RpdGxlPgorPHBhcmE+ZGJ1cy1tb25pdG9yIHdhcyB3cml0dGVuIGJ5IFBoaWxpcCBCbHVuZGVsbC4KK1RoZSBwcm9maWxpbmcgb3V0cHV0IG1vZGUgd2FzIGFkZGVkIGJ5IE9sbGkgU2FsbGkuPC9wYXJhPgorCis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDEgaWQ9J2J1Z3MnPjx0aXRsZT5CVUdTPC90aXRsZT4KKzxwYXJhPlBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIHRvIHRoZSBELUJ1cyBtYWlsaW5nIGxpc3Qgb3IgYnVnIHRyYWNrZXIsCitzZWUgPHVsaW5rIHVybD0naHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8nPmh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvPC91bGluaz48L3BhcmE+Cis8L3JlZnNlY3QxPgorPC9yZWZlbnRyeT4KKwpkaWZmIC0tZ2l0IGEvZGJ1cy9jbWFrZS90b29scy9kYnVzLXNlbmQueG1sIGIvZGJ1cy9jbWFrZS90b29scy9kYnVzLXNlbmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZWZjMDMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2NtYWtlL3Rvb2xzL2RidXMtc2VuZC54bWwKQEAgLTAsMCArMSwxNDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzwhRE9DVFlQRSByZWZlbnRyeSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMS4yLy9FTiIKKyAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjEuMi9kb2Nib29reC5kdGQiPgorPCEtLSBsaWZ0ZWQgZnJvbSB0cm9mZittYW4gYnkgZG9jbGlmdGVyIC0tPgorPHJlZmVudHJ5IGlkPSdkYnVzc2VuZDEnPgorPCEtLSAgIC0tPgorPCEtLSAgZGJ1c1wtc2VuZCBtYW51YWwgcGFnZS4gLS0+Cis8IS0tICBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLiAtLT4KKworPHJlZm1ldGE+Cis8cmVmZW50cnl0aXRsZT5kYnVzLXNlbmQ8L3JlZmVudHJ5dGl0bGU+Cis8bWFudm9sbnVtPjE8L21hbnZvbG51bT4KKzwvcmVmbWV0YT4KKzxyZWZuYW1lZGl2IGlkPSduYW1lJz4KKzxyZWZuYW1lPmRidXMtc2VuZDwvcmVmbmFtZT4KKzxyZWZwdXJwb3NlPlNlbmQgYSBtZXNzYWdlIHRvIGEgbWVzc2FnZSBidXM8L3JlZnB1cnBvc2U+Cis8L3JlZm5hbWVkaXY+Cis8IS0tIGJvZHkgYmVnaW5zIGhlcmUgLS0+Cis8cmVmc3lub3BzaXNkaXYgaWQ9J3N5bm9wc2lzJz4KKzxjbWRzeW5vcHNpcz4KKyAgPGNvbW1hbmQ+ZGJ1cy1zZW5kPC9jb21tYW5kPiAgICAKKyAgICA8Z3JvdXAgY2hvaWNlPSdvcHQnPjxhcmcgY2hvaWNlPSdwbGFpbic+LS1zeXN0ZW0gPC9hcmc+PGFyZyBjaG9pY2U9J3BsYWluJz4tLXNlc3Npb24gPC9hcmc+PC9ncm91cD4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLWRlc3Q9PHJlcGxhY2VhYmxlPk5BTUU8L3JlcGxhY2VhYmxlPjwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdvcHQnPi0tcHJpbnQtcmVwbHkgPC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+LS10eXBlPTxyZXBsYWNlYWJsZT5UWVBFPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICA8YXJnIGNob2ljZT0ncGxhaW4nPjxyZXBsYWNlYWJsZT4mbHQ7ZGVzdGluYXRpb248L3JlcGxhY2VhYmxlPjwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdwbGFpbic+PHJlcGxhY2VhYmxlPm9iamVjdDwvcmVwbGFjZWFibGU+PC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J3BsYWluJz48cmVwbGFjZWFibGU+cGF0aCZndDs8L3JlcGxhY2VhYmxlPjwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdwbGFpbic+PHJlcGxhY2VhYmxlPiZsdDttZXNzYWdlPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICA8YXJnIGNob2ljZT0ncGxhaW4nPjxyZXBsYWNlYWJsZT5uYW1lJmd0OzwvcmVwbGFjZWFibGU+PC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCcgcmVwPSdyZXBlYXQnPjxyZXBsYWNlYWJsZT5jb250ZW50czwvcmVwbGFjZWFibGU+PC9hcmc+CisgICAgPHNici8+Cis8L2NtZHN5bm9wc2lzPgorPC9yZWZzeW5vcHNpc2Rpdj4KKworCis8cmVmc2VjdDEgaWQ9J2Rlc2NyaXB0aW9uJz48dGl0bGU+REVTQ1JJUFRJT048L3RpdGxlPgorPHBhcmE+VGhlIDxjb21tYW5kPmRidXMtc2VuZDwvY29tbWFuZD4gY29tbWFuZCBpcyB1c2VkIHRvIHNlbmQgYSBtZXNzYWdlIHRvIGEgRC1CdXMgbWVzc2FnZQorYnVzLiBTZWUgPHVsaW5rIHVybD0naHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8nPmh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvPC91bGluaz4gZm9yIG1vcmUgCitpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmlnIHBpY3R1cmUuPC9wYXJhPgorCisKKzxwYXJhPlRoZXJlIGFyZSB0d28gd2VsbC1rbm93biBtZXNzYWdlIGJ1c2VzOiB0aGUgc3lzdGVtd2lkZSBtZXNzYWdlIGJ1cyAKKyhpbnN0YWxsZWQgb24gbWFueSBzeXN0ZW1zIGFzIHRoZSAibWVzc2FnZWJ1cyIgc2VydmljZSkgYW5kIHRoZSAKK3Blci11c2VyLWxvZ2luLXNlc3Npb24gbWVzc2FnZSBidXMgKHN0YXJ0ZWQgZWFjaCB0aW1lIGEgdXNlciBsb2dzIGluKS4KK1RoZSAtLXN5c3RlbSBhbmQgLS1zZXNzaW9uIG9wdGlvbnMgZGlyZWN0IDxjb21tYW5kPmRidXMtc2VuZDwvY29tbWFuZD4gdG8gc2VuZAorbWVzc2FnZXMgdG8gdGhlIHN5c3RlbSBvciBzZXNzaW9uIGJ1c2VzIHJlc3BlY3RpdmVseS4gIElmIG5laXRoZXIgaXMKK3NwZWNpZmllZCwgPGNvbW1hbmQ+ZGJ1cy1zZW5kPC9jb21tYW5kPiBzZW5kcyB0byB0aGUgc2Vzc2lvbiBidXMuPC9wYXJhPgorCisKKzxwYXJhPk5lYXJseSBhbGwgdXNlcyBvZiA8Y29tbWFuZD5kYnVzLXNlbmQ8L2NvbW1hbmQ+IG11c3QgcHJvdmlkZSB0aGUgLS1kZXN0IGFyZ3VtZW50Cit3aGljaCBpcyB0aGUgbmFtZSBvZiBhIGNvbm5lY3Rpb24gb24gdGhlIGJ1cyB0byBzZW5kIHRoZSBtZXNzYWdlIHRvLiBJZgorLS1kZXN0IGlzIG9taXR0ZWQsIG5vIGRlc3RpbmF0aW9uIGlzIHNldC48L3BhcmE+CisKKworPHBhcmE+VGhlIG9iamVjdCBwYXRoIGFuZCB0aGUgbmFtZSBvZiB0aGUgbWVzc2FnZSB0byBzZW5kIG11c3QgYWx3YXlzIGJlCitzcGVjaWZpZWQuIEZvbGxvd2luZyBhcmd1bWVudHMsIGlmIGFueSwgYXJlIHRoZSBtZXNzYWdlIGNvbnRlbnRzCisobWVzc2FnZSBhcmd1bWVudHMpLiAgVGhlc2UgYXJlIGdpdmVuIGFzIHR5cGUtc3BlY2lmaWVkIHZhbHVlcyBhbmQgCittYXkgaW5jbHVkZSBjb250YWluZXJzIChhcnJheXMsIGRpY3RzLCBhbmQgdmFyaWFudHMpIGFzIGRlc2NyaWJlZCBiZWxvdy48L3BhcmE+CisKKzxsaXRlcmFsbGF5b3V0IHJlbWFwPScubmYnPgorJmx0O2NvbnRlbnRzJmd0OyAgIDo6PSAmbHQ7aXRlbSZndDsgfCAmbHQ7Y29udGFpbmVyJmd0OyBbICZsdDtpdGVtJmd0OyB8ICZsdDtjb250YWluZXImZ3Q7Li4uXQorJmx0O2l0ZW0mZ3Q7ICAgICAgIDo6PSAmbHQ7dHlwZSZndDs6Jmx0O3ZhbHVlJmd0OworJmx0O2NvbnRhaW5lciZndDsgIDo6PSAmbHQ7YXJyYXkmZ3Q7IHwgJmx0O2RpY3QmZ3Q7IHwgJmx0O3ZhcmlhbnQmZ3Q7CismbHQ7YXJyYXkmZ3Q7ICAgICAgOjo9IGFycmF5OiZsdDt0eXBlJmd0OzombHQ7dmFsdWUmZ3Q7WywmbHQ7dmFsdWUmZ3Q7Li4uXSAKKyZsdDtkaWN0Jmd0OyAgICAgICA6Oj0gZGljdDombHQ7dHlwZSZndDs6Jmx0O3R5cGUmZ3Q7OiZsdDtrZXkmZ3Q7LCZsdDt2YWx1ZSZndDtbLCZsdDtrZXkmZ3Q7LCZsdDt2YWx1ZSZndDsuLi5dCismbHQ7dmFyaWFudCZndDsgICAgOjo9IHZhcmlhbnQ6Jmx0O3R5cGUmZ3Q7OiZsdDt2YWx1ZSZndDsKKyZsdDt0eXBlJmd0OyAgICAgICA6Oj0gc3RyaW5nIHwgaW50MTYgfCB1aW50IDE2IHwgaW50MzIgfCB1aW50MzIgfCBpbnQ2NCB8IHVpbnQ2NCB8IGRvdWJsZSB8IGJ5dGUgfCBib29sZWFuIHwgb2JqcGF0aAorPC9saXRlcmFsbGF5b3V0PiA8IS0tIC5maSAtLT4KKworPHBhcmE+RC1CdXMgc3VwcG9ydHMgbW9yZSB0eXBlcyB0aGFuIHRoZXNlLCBidXQgPGNvbW1hbmQ+ZGJ1cy1zZW5kPC9jb21tYW5kPiBjdXJyZW50bHkKK2RvZXMgbm90LiAgQWxzbywgPGNvbW1hbmQ+ZGJ1cy1zZW5kPC9jb21tYW5kPiBkb2VzIG5vdCBwZXJtaXQgZW1wdHkgY29udGFpbmVycworb3IgbmVzdGVkIGNvbnRhaW5lcnMgKGUuZy4gYXJyYXlzIG9mIHZhcmlhbnRzKS48L3BhcmE+CisKKworPHBhcmE+SGVyZSBpcyBhbiBleGFtcGxlIGludm9jYXRpb246PC9wYXJhPgorPGxpdGVyYWxsYXlvdXQgcmVtYXA9Jy5uZic+CisKKyAgZGJ1cy1zZW5kIC0tZGVzdD1vcmcuZnJlZWRlc2t0b3AuRXhhbXBsZU5hbWUgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAvb3JnL2ZyZWVkZXNrdG9wL3NhbXBsZS9vYmplY3QvbmFtZSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgb3JnLmZyZWVkZXNrdG9wLkV4YW1wbGVJbnRlcmZhY2UuRXhhbXBsZU1ldGhvZCAgIFwKKyAgICAgICAgICAgIGludDMyOjQ3IHN0cmluZzonaGVsbG8gd29ybGQnIGRvdWJsZTo2NS4zMiAgICAgICBcCisgICAgICAgICAgICBhcnJheTpzdHJpbmc6IjFzdCBpdGVtIiwibmV4dCBpdGVtIiwibGFzdCBpdGVtIiAgXAorICAgICAgICAgICAgZGljdDpzdHJpbmc6aW50MzI6Im9uZSIsMSwidHdvIiwyLCJ0aHJlZSIsMyAgICAgIFwKKyAgICAgICAgICAgIHZhcmlhbnQ6aW50MzI6LTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvYmpwYXRoOi9vcmcvZnJlZWRlc2t0b3Avc2FtcGxlL29iamVjdC9uYW1lIAorCis8L2xpdGVyYWxsYXlvdXQ+IDwhLS0gLmZpIC0tPgorCis8cGFyYT5Ob3RlIHRoYXQgdGhlIGludGVyZmFjZSBpcyBzZXBhcmF0ZWQgZnJvbSBhIG1ldGhvZCBvciBzaWduYWwgCituYW1lIGJ5IGEgZG90LCB0aG91Z2ggaW4gdGhlIGFjdHVhbCBwcm90b2NvbCB0aGUgaW50ZXJmYWNlCithbmQgdGhlIGludGVyZmFjZSBtZW1iZXIgYXJlIHNlcGFyYXRlIGZpZWxkcy48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nb3B0aW9ucyc+PHRpdGxlPk9QVElPTlM8L3RpdGxlPgorPHBhcmE+VGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBzdXBwb3J0ZWQ6PC9wYXJhPgorPHZhcmlhYmxlbGlzdCByZW1hcD0nVFAnPgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tZGVzdD1OQU1FPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5TcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBjb25uZWN0aW9uIHRvIHJlY2VpdmUgdGhlIG1lc3NhZ2UuPC9wYXJhPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLXByaW50LXJlcGx5PC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5CbG9jayBmb3IgYSByZXBseSB0byB0aGUgbWVzc2FnZSBzZW50LCBhbmQgcHJpbnQgYW55IHJlcGx5IHJlY2VpdmVkLjwvcGFyYT4KKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1zeXN0ZW08L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlNlbmQgdG8gdGhlIHN5c3RlbSBtZXNzYWdlIGJ1cy48L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tc2Vzc2lvbjwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+U2VuZCB0byB0aGUgc2Vzc2lvbiBtZXNzYWdlIGJ1cy4gIChUaGlzIGlzIHRoZSBkZWZhdWx0Lik8L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tdHlwZT1UWVBFPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5TcGVjaWZ5ICJtZXRob2RfY2FsbCIgb3IgInNpZ25hbCIgKGRlZmF1bHRzIHRvICJzaWduYWwiKS48L3BhcmE+CisKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+Cis8L3ZhcmlhYmxlbGlzdD4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nYXV0aG9yJz48dGl0bGU+QVVUSE9SPC90aXRsZT4KKzxwYXJhPmRidXMtc2VuZCB3YXMgd3JpdHRlbiBieSBQaGlsaXAgQmx1bmRlbGwuPC9wYXJhPgorCis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDEgaWQ9J2J1Z3MnPjx0aXRsZT5CVUdTPC90aXRsZT4KKzxwYXJhPlBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIHRvIHRoZSBELUJ1cyBtYWlsaW5nIGxpc3Qgb3IgYnVnIHRyYWNrZXIsCitzZWUgPHVsaW5rIHVybD0naHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8nPmh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvPC91bGluaz48L3BhcmE+Cis8L3JlZnNlY3QxPgorPC9yZWZlbnRyeT4KKwpkaWZmIC0tZ2l0IGEvZGJ1cy9jb25maWcuaCBiL2RidXMvY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY3MDdlMgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvY29uZmlnLmgKQEAgLTAsMCArMSwzMDMgQEAKKy8qIGNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLworI2luY2x1ZGUgPGN1dGlscy9zb2NrZXRzLmg+CisKKy8qIERpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyB0aGUgYmluYXJpZXMgKi8KKyNkZWZpbmUgREJVU19CSU5ESVIgIi9zeXN0ZW0vYmluIgorCisvKiBCdWlsZCB0ZXN0IGNvZGUgKi8KKyN1bmRlZiBEQlVTX0JVSUxEX1RFU1RTCisKKy8qIEJ1aWxkIFgxMS1kZXBlbmRlbnQgY29kZSAqLworI3VuZGVmIERCVVNfQlVJTERfWDExCisKKy8qIHdoZXRoZXIgLWV4cG9ydC1keW5hbWljIHdhcyBwYXNzZWQgdG8gbGlidG9vbCAqLworI3VuZGVmIERCVVNfQlVJTFRfUl9EWU5BTUlDCisKKy8qIFVzZSBkbm90aWZ5IG9uIExpbnV4ICovCisjdW5kZWYgREJVU19CVVNfRU5BQkxFX0ROT1RJRllfT05fTElOVVgKKworLyogVXNlIGtxdWV1ZSAqLworI3VuZGVmIERCVVNfQlVTX0VOQUJMRV9LUVVFVUUKKworLyogRGlyZWN0b3J5IHRvIGNoZWNrIGZvciBjb25zb2xlIG93bmVyaGlwICovCisjZGVmaW5lIERCVVNfQ09OU09MRV9BVVRIX0RJUiAiL2V0YyIKKworLyogRmlsZSB0byBjaGVjayBmb3IgY29uc29sZSBvd25lcmhpcCAqLworI3VuZGVmIERCVVNfQ09OU09MRV9PV05FUl9GSUxFCisKKy8qIERpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyB0aGUgREJVUyBkYWVtb24gKi8KKyNkZWZpbmUgREJVU19EQUVNT05ESVIgIi9zeXN0ZW0vYmluIgorCisvKiBEaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgREJVUyBkYXRhIGZpbGVzICovCisjZGVmaW5lIERCVVNfREFUQURJUiAiL2RhdGEiCisKKy8qIERpc2FibGUgYXNzZXJ0aW9uIGNoZWNraW5nICovCisjdW5kZWYgREJVU19ESVNBQkxFX0FTU0VSVAorCisvKiBEaXNhYmxlIHB1YmxpYyBBUEkgc2FuaXR5IGNoZWNraW5nICovCisjdW5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworCisvKiBTdXBwb3J0IGEgdmVyYm9zZSBtb2RlICovCisjdW5kZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisKKy8qIERlZmluZWQgaWYgZ2NvdiBpcyBlbmFibGVkIHRvIGZvcmNlIGEgcmVidWlsZCBkdWUgdG8gY29uZmlnLmggY2hhbmdpbmcgKi8KKyN1bmRlZiBEQlVTX0dDT1ZfRU5BQkxFRAorCisvKiBTb21lIGF0b21pYyBpbnRlZ2VyIGltcGxlbWVudGF0aW9uIHByZXNlbnQgKi8KKyN1bmRlZiBEQlVTX0hBVkVfQVRPTUlDX0lOVAorCisKKyAgICAgICAgI2lmIChkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pKQorICAgICAgICAjIGRlZmluZSBEQlVTX0hBVkVfQVRPTUlDX0lOVCAxCisgICAgICAgICNlbmRpZgorICAgICAgCisKKy8qIERlZmluZWQgaWYgd2UgaGF2ZSBnY2MgMy4zIGFuZCB0aHVzIHRoZSBuZXcgZ2NvdiBmb3JtYXQgKi8KKyN1bmRlZiBEQlVTX0hBVkVfR0NDMzNfR0NPVgorCisvKiBXaGVyZSBwZXItc2Vzc2lvbiBidXMgcHV0cyBpdHMgc29ja2V0cyAqLworI2RlZmluZSBEQlVTX1NFU1NJT05fU09DS0VUX0RJUiAiL2RhdGEiCisKKy8qIFRoZSBkZWZhdWx0IEQtQnVzIGFkZHJlc3Mgb2YgdGhlIHN5c3RlbSBidXMgKi8KKyNkZWZpbmUgREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTUyAidW5peDpwYXRoPSJEQlVTX1NZU1RFTV9TT0NLRVQKKworLyogVGhlIG5hbWUgb2YgdGhlIHNvY2tldCB0aGUgc3lzdGVtIGJ1cyBsaXN0ZW5zIG9uIGJ5IGRlZmF1bHQgKi8KKyNkZWZpbmUgREJVU19TWVNURU1fU09DS0VUIEFORFJPSURfU09DS0VUX0RJUiIvZGJ1cyIKKworLyogV2hlcmUgdG8gcHV0IHRlc3Qgc29ja2V0cyAqLworI2RlZmluZSBEQlVTX1RFU1RfU09DS0VUX0RJUiAiL2RhdGEiCisKKy8qIFVzZXIgZm9yIHJ1bm5pbmcgdGhlIHN5c3RlbSBCVVMgZGFlbW9uICovCisjdW5kZWYgREJVU19VU0VSCisKKy8qIFVzZSBhdG9taWMgaW50ZWdlciBpbXBsZW1lbnRhdGlvbiBmb3IgNDg2ICovCisjdW5kZWYgREJVU19VU0VfQVRPTUlDX0lOVF80ODYKKworCisgICAgICAgICAgICAgICNpZiAoZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSkKKyAgICAgICAgICAgICAgIyBkZWZpbmUgREJVU19VU0VfQVRPTUlDX0lOVF80ODYgMQorICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIAorCisvKiBBICd2YV9jb3B5JyBzdHlsZSBmdW5jdGlvbiAqLworI2RlZmluZSBEQlVTX1ZBX0NPUFkgdmFfY29weQorCisvKiAndmFfbGlzdHMnIGNhbm5vdCBiZSBjb3BpZXMgYXMgdmFsdWVzICovCisjdW5kZWYgREJVU19WQV9DT1BZX0FTX0FSUkFZCisKKy8qIFRoZSBuYW1lIG9mIHRoZSBnZXR0ZXh0IGRvbWFpbiAqLworI3VuZGVmIEdFVFRFWFRfUEFDS0FHRQorCisvKiBEaXNhYmxlIEdMaWIgYXNzZXJ0aW9uIG1hY3JvcyAqLworI3VuZGVmIEdfRElTQUJMRV9BU1NFUlQgCisKKy8qIERpc2FibGUgR0xpYiBwdWJsaWMgQVBJIHNhbml0eSBjaGVja2luZyAqLworI3VuZGVmIEdfRElTQUJMRV9DSEVDS1MKKworLyogSGF2ZSBhYnN0cmFjdCBzb2NrZXQgbmFtZXNwYWNlICovCisjdW5kZWYgSEFWRV9BQlNUUkFDVF9TT0NLRVRTCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYmFja3RyYWNlJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0JBQ0tUUkFDRQorCisvKiBIYXZlIGNtc2djcmVkIHN0cnVjdHVyZSAqLworI3VuZGVmIEhBVkVfQ01TR0NSRUQKKworLyogSGF2ZSBjb25zb2xlIG93bmVyIGZpbGUgKi8KKyN1bmRlZiBIQVZFX0NPTlNPTEVfT1dORVJfRklMRQorCisvKiBIYXZlIHRoZSBkZGZkIG1lbWJlciBvZiBESVIgKi8KKyN1bmRlZiBIQVZFX0RERkQKKworLyogSGF2ZSBkaXJmZCBmdW5jdGlvbiAqLworI3VuZGVmIEhBVkVfRElSRkQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkbGZjbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9ETEZDTl9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9FUlJOT19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxleGVjaW5mby5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9FWEVDSU5GT19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxleHBhdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9FWFBBVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmcGF0aGNvbmYnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfRlBBVEhDT05GCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0Z3JvdXBsaXN0JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9HRVRHUk9VUExJU1QgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHBlZXJlaWQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUUEVFUkVJRAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHBlZXJ1Y3JlZCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9HRVRQRUVSVUNSRUQKKworLyogSGF2ZSBHTlUtc3R5bGUgdmFyYXJncyBtYWNyb3MgKi8KKyN1bmRlZiBIQVZFX0dOVUNfVkFSQVJHUworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX0lOVFRZUEVTX0ggMQorCisvKiBIYXZlIElTTyBDOTkgdmFyYXJncyBtYWNyb3MgKi8KKyNkZWZpbmUgSEFWRV9JU09fVkFSQVJHUyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbnNsJyBsaWJyYXJ5ICgtbG5zbCkuICovCisjdW5kZWYgSEFWRV9MSUJOU0wKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzb2NrZXQnIGxpYnJhcnkgKC1sc29ja2V0KS4gKi8KKyN1bmRlZiBIQVZFX0xJQlNPQ0tFVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9NRU1PUllfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbmFub3NsZWVwJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9OQU5PU0xFRVAgMQorCisvKiBIYXZlIG5vbi1QT1NJWCBmdW5jdGlvbiBnZXRwd25hbV9yICovCisjdW5kZWYgSEFWRV9OT05QT1NJWF9HRVRQV05BTV9SCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcG9sbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfUE9MTCAxCisKKy8qIEhhdmUgUE9TSVggZnVuY3Rpb24gZ2V0cHduYW1fciAqLworI3VuZGVmIEhBVkVfUE9TSVhfR0VUUFdOQU1fUgorCisvKiBTRUxpbnV4IHN1cHBvcnQgKi8KKyN1bmRlZiBIQVZFX1NFTElOVVgKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRlbnYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NFVEVOViAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc29ja2V0cGFpcicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU09DS0VUUEFJUiAxCisKKy8qIEhhdmUgc29ja2xlbl90IHR5cGUgKi8KKyNkZWZpbmUgSEFWRV9TT0NLTEVOX1QgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NURExJQl9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NUUklOR19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3lzbGltaXRzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1NZU0xJTUlUU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19UWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdWlvLmg+IGhlYWRlciBmaWxlLiAqLworLyogYWN0dWFsbHkgZGVmaW5lZCBieSBBbmRyb2lkQ29uZmlnLmgsIGNvbW1lbnRlZCB0byBnZXQgcmlkIG9mIGNvbXBpbGVyIHdhcm5pbmdzICNkZWZpbmUgSEFWRV9TWVNfVUlPX0ggMSAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9VTklTVERfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdW5zZXRlbnYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1VOU0VURU5WIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB1c2xlZXAnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1VTTEVFUCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdmFzcHJpbnRmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9WQVNQUklOVEYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHZzbnByaW50ZicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfVlNOUFJJTlRGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB3cml0ZXYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1dSSVRFViAxCisKKy8qIE5hbWUgb2YgcGFja2FnZSAqLworI2RlZmluZSBQQUNLQUdFICJkYnVzIgorCisvKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KKyN1bmRlZiBQQUNLQUdFX0JVR1JFUE9SVAorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiZGJ1cyIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1NUUklORyAiZGJ1cy0wLjk1IgorCisvKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9UQVJOQU1FCisKKy8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiMC45NSIKKworLyogVGhlIHNpemUgb2YgYSBgY2hhcicsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyNkZWZpbmUgU0laRU9GX0NIQVIgc2l6ZW9mKGNoYXIpCisKKy8qIFRoZSBzaXplIG9mIGEgYGludCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyNkZWZpbmUgU0laRU9GX0lOVCBzaXplb2YoaW50KQorCisvKiBUaGUgc2l6ZSBvZiBhIGBsb25nJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI2RlZmluZSBTSVpFT0ZfTE9ORyBzaXplb2YobG9uZykKKworLyogVGhlIHNpemUgb2YgYSBgbG9uZyBsb25nJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI2RlZmluZSBTSVpFT0ZfTE9OR19MT05HIHNpemVvZihsb25nIGxvbmcpCisKKy8qIFRoZSBzaXplIG9mIGEgYHNob3J0JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI2RlZmluZSBTSVpFT0ZfU0hPUlQgc2l6ZW9mKHNob3J0KQorCisvKiBUaGUgc2l6ZSBvZiBhIGB2b2lkIConLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9WT0lEX1Agc2l6ZW9mKHZvaWQgKikKKworLyogVGhlIHNpemUgb2YgYSBgX19pbnQ2NCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyNkZWZpbmUgU0laRU9GX19fSU5UNjQgc2l6ZW9mKGxvbmcgbG9uZykKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCisjZGVmaW5lIFNURENfSEVBREVSUyAxCisKKy8qIEZ1bGwgcGF0aCB0byB0aGUgZGFlbW9uIGluIHRoZSBidWlsZGRpciAqLworI2RlZmluZSBURVNUX0JVU19CSU5BUlkgIi9zeXN0ZW0vYmluL2RidXMtdGVzdCIKKworLyogRnVsbCBwYXRoIHRvIHRlc3QgZmlsZSB0ZXN0L3Rlc3QtZXhpdCBpbiBidWlsZGRpciAqLworI2RlZmluZSBURVNUX0VYSVRfQklOQVJZICIvc3lzdGVtL2Jpbi9kYnVzLXRlc3QtZXhpdCIKKworLyogRnVsbCBwYXRoIHRvIHRlc3QgZmlsZSB0ZXN0L3Rlc3Qtc2VnZmF1bHQgaW4gYnVpbGRkaXIgKi8KKyNkZWZpbmUgVEVTVF9TRUdGQVVMVF9CSU5BUlkgIi9zeXN0ZW0vYmluL2RidXMtdGVzdC1zZWdmYXVsdCIKKworLyogRnVsbCBwYXRoIHRvIHRlc3QgZmlsZSB0ZXN0L3Rlc3Qtc2VydmljZSBpbiBidWlsZGRpciAqLworI2RlZmluZSBURVNUX1NFUlZJQ0VfQklOQVJZICIvc3lzdGVtL2Jpbi9kYnVzLXRlc3Qtc2VydmljZSIKKworLyogRnVsbCBwYXRoIHRvIHRlc3QgZmlsZSB0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcyBpbiBidWlsZGRpciAqLworI2RlZmluZSBURVNUX1NFUlZJQ0VfRElSICIvZXRjL2RidXMtdGVzdC1kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMiCisKKy8qIEZ1bGwgcGF0aCB0byB0ZXN0IGZpbGUgdGVzdC90ZXN0LXNoZWxsLXNlcnZpY2UgaW4gYnVpbGRkaXIgKi8KKyNkZWZpbmUgVEVTVF9TSEVMTF9TRVJWSUNFX0JJTkFSWSAiL3N5c3RlbS9iaW4vZGJ1cy1zaGVsbC1zZXJ2aWNlIgorCisvKiBGdWxsIHBhdGggdG8gdGVzdCBmaWxlIHRlc3QvdGVzdC1zbGVlcC1mb3JldmVyIGluIGJ1aWxkZGlyICovCisjZGVmaW5lIFRFU1RfU0xFRVBfRk9SRVZFUl9CSU5BUlkgIi9zeXN0ZW0vYmluL2RidXMtc2xlZXAtZm9yZXZlciIKKworLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLworI2RlZmluZSBWRVJTSU9OICIwLjk1IgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3VyIHByb2Nlc3NvciBzdG9yZXMgd29yZHMgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlCisgICBmaXJzdCAobGlrZSBNb3Rvcm9sYSBhbmQgU1BBUkMsIHVubGlrZSBJbnRlbCBhbmQgVkFYKS4gKi8KKyN1bmRlZiBXT1JEU19CSUdFTkRJQU4KKworCisJCQkvKiBVc2UgdGhlIGNvbXBpbGVyLXByb3ZpZGVkIGVuZGlhbm5lc3MgZGVmaW5lcyB0byBhbGxvdyB1bml2ZXJzYWwgY29tcGlsaW5nLiAqLworCQkJI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOX18pCisJCQkjZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCisJCQkjZW5kaWYKKwkJCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSBYIFdpbmRvdyBTeXN0ZW0gaXMgbWlzc2luZyBvciBub3QgYmVpbmcgdXNlZC4gKi8KKyNkZWZpbmUgWF9ESVNQTEFZX01JU1NJTkcgMQorCisjZGVmaW5lIEhBVkVfVU5JWF9GRF9QQVNTSU5HIDEKZGlmZiAtLWdpdCBhL2RidXMvY29uZmlndXJlLmFjIGIvZGJ1cy9jb25maWd1cmUuYWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRmY2M5ZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvY29uZmlndXJlLmFjCkBAIC0wLDAgKzEsMTg0MSBAQAorZG5sIC0qLSBtb2RlOiBtNCAtKi0KK0FDX1BSRVJFUShbMi42M10pCisKK200X2RlZmluZShbZGJ1c19tYWpvcl92ZXJzaW9uXSwgWzFdKQorbTRfZGVmaW5lKFtkYnVzX21pbm9yX3ZlcnNpb25dLCBbNl0pCittNF9kZWZpbmUoW2RidXNfbWljcm9fdmVyc2lvbl0sIFs4XSkKK200X2RlZmluZShbZGJ1c192ZXJzaW9uXSwKKyAgICAgICAgICBbZGJ1c19tYWpvcl92ZXJzaW9uLmRidXNfbWlub3JfdmVyc2lvbi5kYnVzX21pY3JvX3ZlcnNpb25dKQorQUNfSU5JVChbZGJ1c10sW2RidXNfdmVyc2lvbl0sW2h0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvZW50ZXJfYnVnLmNnaT9wcm9kdWN0PWRidXNdLFtkYnVzXSkKKworQUNfQ0FOT05JQ0FMX0hPU1QKKworQUNfQ09ORklHX0hFQURFUlMoW2NvbmZpZy5oXSkKK0FDX0NPTkZJR19NQUNST19ESVIoW200XSkKKworQU1fSU5JVF9BVVRPTUFLRShbMS4xMCB0YXItdXN0YXIgLVduby1wb3J0YWJpbGl0eV0pCisKK0dFVFRFWFRfUEFDS0FHRT1kYnVzLTEKK0FDX1NVQlNUKEdFVFRFWFRfUEFDS0FHRSkKK0FDX0RFRklORV9VTlFVT1RFRChHRVRURVhUX1BBQ0tBR0UsIiRHRVRURVhUX1BBQ0tBR0UiLFtUaGUgbmFtZSBvZiB0aGUgZ2V0dGV4dCBkb21haW5dKQorCisjIEJ5IGRlZmF1bHQsIHJlYnVpbGQgYXV0b3Rvb2xzIGZpbGVzIG9uIGRlbWFuZDsgb25seSB1c2UgLi9taXNzaW5nIGlmIHRoZQorIyB1c2VyIHNheXMgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSAoc29tZSBkaXN0cmlidXRpb25zIGxpa2UgdG8gZG8gdGhpcykKK0FNX01BSU5UQUlORVJfTU9ERShbZW5hYmxlXSkKKworbTRfaWZkZWYoW0FNX1NJTEVOVF9SVUxFU10sW0FNX1NJTEVOVF9SVUxFUyhbeWVzXSldKQorCitBQ19ERUZJTkVfVU5RVU9URUQoREJVU19EQUVNT05fTkFNRSwiZGJ1cy1kYWVtb24iLFtOYW1lIG9mIGV4ZWN1dGFibGVdKQorCisjIGxpYnRvb2wgdmVyc2lvbmluZyAtIHRoaXMgYXBwbGllcyB0byBsaWJkYnVzCisjCisjIFNlZSBodHRwOi8vc291cmNlcy5yZWRoYXQuY29tL2F1dG9ib29rL2F1dG9ib29rL2F1dG9ib29rXzkxLmh0bWwjU0VDOTEgZm9yIGRldGFpbHMKKyMKKworIyMgaW5jcmVtZW50IGlmIHRoZSBpbnRlcmZhY2UgaGFzIGFkZGl0aW9ucywgY2hhbmdlcywgcmVtb3ZhbHMuCitMVF9DVVJSRU5UPTEwCisKKyMjIGluY3JlbWVudCBhbnkgdGltZSB0aGUgc291cmNlIGNoYW5nZXM7IHNldCB0bworIyMgIDAgaWYgeW91IGluY3JlbWVudCBDVVJSRU5UCitMVF9SRVZJU0lPTj0yCisKKyMjIGluY3JlbWVudCBpZiBhbnkgaW50ZXJmYWNlcyBoYXZlIGJlZW4gYWRkZWQ7IHNldCB0byAwCisjIyBpZiBhbnkgaW50ZXJmYWNlcyBoYXZlIGJlZW4gY2hhbmdlZCBvciByZW1vdmVkLiByZW1vdmFsIGhhcworIyMgcHJlY2VkZW5jZSBvdmVyIGFkZGluZywgc28gc2V0IHRvIDAgaWYgYm90aCBoYXBwZW5lZC4KK0xUX0FHRT03CisKK0FDX1NVQlNUKExUX0NVUlJFTlQpCitBQ19TVUJTVChMVF9SRVZJU0lPTikKK0FDX1NVQlNUKExUX0FHRSkKKworREJVU19NQUpPUl9WRVJTSU9OPWRidXNfbWFqb3JfdmVyc2lvbgorREJVU19NSU5PUl9WRVJTSU9OPWRidXNfbWlub3JfdmVyc2lvbgorREJVU19NSUNST19WRVJTSU9OPWRidXNfbWljcm9fdmVyc2lvbgorREJVU19WRVJTSU9OPWRidXNfbWFqb3JfdmVyc2lvbi5kYnVzX21pbm9yX3ZlcnNpb24uZGJ1c19taWNyb192ZXJzaW9uCisKK0FDX1NVQlNUKERCVVNfTUFKT1JfVkVSU0lPTikKK0FDX1NVQlNUKERCVVNfTUlOT1JfVkVSU0lPTikKK0FDX1NVQlNUKERCVVNfTUlDUk9fVkVSU0lPTikKK0FDX1NVQlNUKERCVVNfVkVSU0lPTikKKworQUNfUFJPR19DQworQU1fUFJPR19DQ19DX08KK0FDX1BST0dfQ1hYCitBQ19VU0VfU1lTVEVNX0VYVEVOU0lPTlMKK0FDX0lTQ19QT1NJWAorQUNfSEVBREVSX1NUREMKK0FDX0NfSU5MSU5FCitBTV9QUk9HX0xJQlRPT0wKK0FDX1BST0dfTUtESVJfUAorQ09NUElMRVJfQ09WRVJBR0UKK0NPTVBJTEVSX09QVElNSVNBVElPTlMKK1BLR19QUk9HX1BLR19DT05GSUcKKworIyBJbml0aWFsaXplIGxpYnRvb2wKK0xUX0lOSVQoW3dpbjMyLWRsbF0pCitMVF9MQU5HKFtXaW5kb3dzIFJlc291cmNlXSkKKworIyBTZXQgc29tZSBpbnRlcm5hbCB2YXJpYWJsZXMgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSBmb3IgbGF0ZXIgdXNlLgorZGJ1c193aW49bm8KK2RidXNfY3lnd2luPW5vCitkYnVzX3VuaXg9bm8KK2Nhc2UgIiR7aG9zdH0iIGluCisgICAgKi1taW5ndzMyY2UqKQorICAgICAgICBkYnVzX3dpbj15ZXMKKyAgICAgICAgZGJ1c193aW5jZT15ZXMKKyAgICAgICAgOzsKKyAgICAqLW1pbmd3MzIqKQorICAgICAgICBkYnVzX3dpbj15ZXMKKyAgICAgICAgOzsKKyAgICAqLWN5Z3dpbiopCisgICAgICAgIGRidXNfY3lnd2luPXllcworICAgICAgICBkYnVzX3VuaXg9eWVzCisgICAgICAgIDs7CisgICAgKikKKyAgICAgICAgZGJ1c191bml4PXllcworICAgICAgIDs7Citlc2FjCisKKyMgU3BlY2lhbCBkZWZpbmVzIGZvciBjZXJ0YWluIHBsYXRmb3JtcworaWYgdGVzdCAiJGRidXNfd2luIiA9IHllczsgdGhlbgorICAgIEFDX0RFRklORShEQlVTX1dJTiwxLFtEZWZpbmVkIGlmIHdlIHJ1biBvbiBhIFczMiBBUEkgYmFzZWQgc3lzdGVtXSkKKyAgICBCVUlMRF9USU1FU1RBTVA9YGRhdGUgLS1pc28tODYwMT1taW51dGVzYAorICAgIEFDX1NVQlNUKEJVSUxEX1RJTUVTVEFNUCkKKyAgICAjIEFzc3VtZSBEQlVTX1ZFUlNJT04gaXMgYWx3YXlzIHRocmVlIG51bWJlcnMKKyAgICBCVUlMRF9GSUxFVkVSU0lPTj1gZWNobyAiJERCVVNfVkVSU0lPTiIgfCBzZWQgLWUgJ3MvXC4vLC9nJ2AsMAorICAgIEFDX1NVQlNUKEJVSUxEX0ZJTEVWRVJTSU9OKQorICAgIEFDX0NIRUNLX1RPT0woV0lORFJFUywgd2luZHJlcywgbm8pCisgICAgaWYgdGVzdCAiJFdJTkRSRVMiID0gbm87IHRoZW4KKyAgICAgIEFDX01TR19FUlJPUihbKioqIENvdWxkIG5vdCBmaW5kIGFuIGltcGxlbWVudGF0aW9uIG9mIHdpbmRyZXMgaW4geW91ciBQQVRILl0pCisgICAgZmkKKyAgICBpZiB0ZXN0ICIkZGJ1c193aW5jZSIgPSB5ZXM7IHRoZW4KKyAgICAgIEFDX0RFRklORShEQlVTX1dJTkNFLDEsW0RlZmluZWQgaWYgd2UgcnVuIG9uIGEgVzMyIENFIEFQSSBiYXNlZCBzeXN0ZW1dKQorICAgICAgQUNfREVGSU5FKF9XSU4zMl9XQ0UsIDB4MDUwMiwgW0RlZmluZWQgdG8gZ2V0IG5ld2VyIFczMiBDRSBBUElzXSkKKyAgICBmaQorZWxzZQorICAgIEFDX0RFRklORShEQlVTX1VOSVgsMSxbRGVmaW5lZCBpZiB3ZSBydW4gb24gYSBVbml4LWJhc2VkIHN5c3RlbV0pCitmaQoraWYgdGVzdCAiJGRidXNfY3lnd2luIiA9IHllczsgdGhlbgorICAgIEFDX0RFRklORShEQlVTX0NZR1dJTiwxLFtEZWZpbmVkIGlmIHdlIHJ1biBvbiBhIGN5Z3dpbiBBUEkgYmFzZWQgc3lzdGVtXSkKK2ZpCisKK0FNX0NPTkRJVElPTkFMKERCVVNfV0lOLCB0ZXN0ICIkZGJ1c193aW4iID0geWVzKQorQU1fQ09ORElUSU9OQUwoREJVU19XSU5DRSwgdGVzdCAiJGRidXNfd2luY2UiID0geWVzKQorQU1fQ09ORElUSU9OQUwoREJVU19VTklYLCB0ZXN0ICIkZGJ1c191bml4IiA9IHllcykKK0FNX0NPTkRJVElPTkFMKERCVVNfQ1lHV0lOLCB0ZXN0ICIkZGJ1c19jeWd3aW4iID0geWVzKQorCisjIHRoaXMgbXVzdCBjb21lIGZpcnN0OiBvdGhlciBvcHRpb25zIHVzZSB0aGlzIHRvIHNldCB0aGVpciBkZWZhdWx0cworQUNfQVJHX0VOQUJMRShbZGV2ZWxvcGVyXSwKKyAgW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1kZXZlbG9wZXJdLAorICAgIFtzZXQgZGVmYXVsdHMgdG8gYmUgYXBwcm9wcmlhdGUgZm9yIGEgRC1CdXMgZGV2ZWxvcGVyIGluc3RlYWQgb2YgYSBkaXN0cmlidXRpb24vZW5kLXVzZXJdKV0sCisgIFtdLAorICBbZW5hYmxlX2RldmVsb3Blcj1ub10pCisKK0RCVVNfU1RBVElDX0JVSUxEX0NQUEZMQUdTPQoraWYgdGVzdCAieCRlbmFibGVfc2hhcmVkIiA9IHhubzsgdGhlbgorICAgICMgT24gV2luZG93cywgbGlua2luZyBhZ2FpbnN0IHRoZSBzdGF0aWMgbGlicmFyeSByZXF1aXJlcyBzcGVjaWFsIGVmZm9ydAorICAgICMgdG8gdHVybiBvZmYgRExMIGltcG9ydC9leHBvcnQgcHJvY2Vzc2luZy4gV2Ugbm9ybWFsbHkgbGluayBzb21lIHRoaW5ncworICAgICMgYWdhaW5zdCB0aGUgZHluYW1pYyBsaWJyYXJ5LCBidXQgaWYgd2UncmUgbm90IGJ1aWxkaW5nIHRoYXQsIHdlJ2xsCisgICAgIyBoYXZlIHRvIGxpbmsgZXZlcnl0aGluZyBzdGF0aWNhbGx5LgorICAgIERCVVNfU1RBVElDX0JVSUxEX0NQUEZMQUdTPS1EREJVU19TVEFUSUNfQlVJTEQKK2ZpCitBQ19TVUJTVChbREJVU19TVEFUSUNfQlVJTERfQ1BQRkxBR1NdKQorCitBQ19BUkdfRU5BQkxFKGFuc2ksIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1hbnNpXSxbZW5hYmxlIC1hbnNpIC1wZWRhbnRpYyBnY2MgZmxhZ3NdKSxlbmFibGVfYW5zaT0kZW5hYmxldmFsLGVuYWJsZV9hbnNpPW5vKQorQUNfQVJHX0VOQUJMRSh2ZXJib3NlLW1vZGUsIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS12ZXJib3NlLW1vZGVdLFtzdXBwb3J0IHZlcmJvc2UgZGVidWcgbW9kZV0pLGVuYWJsZV92ZXJib3NlX21vZGU9JGVuYWJsZXZhbCxlbmFibGVfdmVyYm9zZV9tb2RlPSRlbmFibGVfZGV2ZWxvcGVyKQorQUNfQVJHX0VOQUJMRShhc3NlcnRzLCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtYXNzZXJ0c10sW2luY2x1ZGUgYXNzZXJ0aW9uIGNoZWNrc10pLGVuYWJsZV9hc3NlcnRzPSRlbmFibGV2YWwsZW5hYmxlX2Fzc2VydHM9JGVuYWJsZV9kZXZlbG9wZXIpCitBQ19BUkdfRU5BQkxFKGNoZWNrcywgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWNoZWNrc10sW2luY2x1ZGUgc2FuaXR5IGNoZWNrcyBvbiBwdWJsaWMgQVBJXSksZW5hYmxlX2NoZWNrcz0kZW5hYmxldmFsLGVuYWJsZV9jaGVja3M9eWVzKQorQUNfQVJHX0VOQUJMRSh4bWwtZG9jcywgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXhtbC1kb2NzXSxbYnVpbGQgWE1MIGRvY3VtZW50YXRpb24gKHJlcXVpcmVzIHhtbHRvKV0pLGVuYWJsZV94bWxfZG9jcz0kZW5hYmxldmFsLGVuYWJsZV94bWxfZG9jcz1hdXRvKQorQUNfQVJHX0VOQUJMRShkb3h5Z2VuLWRvY3MsIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1kb3h5Z2VuLWRvY3NdLFtidWlsZCBET1hZR0VOIGRvY3VtZW50YXRpb24gKHJlcXVpcmVzIERveHlnZW4pXSksZW5hYmxlX2RveHlnZW5fZG9jcz0kZW5hYmxldmFsLGVuYWJsZV9kb3h5Z2VuX2RvY3M9YXV0bykKK0FDX0FSR19FTkFCTEUoYWJzdHJhY3Qtc29ja2V0cywgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWFic3RyYWN0LXNvY2tldHNdLFt1c2UgYWJzdHJhY3Qgc29ja2V0IG5hbWVzcGFjZSAobGludXggb25seSldKSxlbmFibGVfYWJzdHJhY3Rfc29ja2V0cz0kZW5hYmxldmFsLGVuYWJsZV9hYnN0cmFjdF9zb2NrZXRzPWF1dG8pCitBQ19BUkdfRU5BQkxFKHNlbGludXgsIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1zZWxpbnV4XSxbYnVpbGQgd2l0aCBTRUxpbnV4IHN1cHBvcnRdKSxlbmFibGVfc2VsaW51eD0kZW5hYmxldmFsLGVuYWJsZV9zZWxpbnV4PWF1dG8pCitBQ19BUkdfRU5BQkxFKGxpYmF1ZGl0LEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1saWJhdWRpdF0sW2J1aWxkIGF1ZGl0IGRhZW1vbiBzdXBwb3J0IGZvciBTRUxpbnV4XSksZW5hYmxlX2xpYmF1ZGl0PSRlbmFibGV2YWwsZW5hYmxlX2xpYmF1ZGl0PWF1dG8pCitBQ19BUkdfRU5BQkxFKGRub3RpZnksIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1kbm90aWZ5XSxbYnVpbGQgd2l0aCBkbm90aWZ5IHN1cHBvcnQgKGxpbnV4IG9ubHkpXSksZW5hYmxlX2Rub3RpZnk9JGVuYWJsZXZhbCxlbmFibGVfZG5vdGlmeT1hdXRvKQorQUNfQVJHX0VOQUJMRShpbm90aWZ5LCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtaW5vdGlmeV0sW2J1aWxkIHdpdGggaW5vdGlmeSBzdXBwb3J0IChsaW51eCBvbmx5KV0pLGVuYWJsZV9pbm90aWZ5PSRlbmFibGV2YWwsZW5hYmxlX2lub3RpZnk9YXV0bykKK0FDX0FSR19FTkFCTEUoa3F1ZXVlLCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUta3F1ZXVlXSxbYnVpbGQgd2l0aCBrcXVldWUgc3VwcG9ydF0pLGVuYWJsZV9rcXVldWU9JGVuYWJsZXZhbCxlbmFibGVfa3F1ZXVlPWF1dG8pCitBQ19BUkdfRU5BQkxFKGNvbnNvbGUtb3duZXItZmlsZSwgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWNvbnNvbGUtb3duZXItZmlsZV0sW2VuYWJsZSBjb25zb2xlIG93bmVyIGZpbGVdKSxlbmFibGVfY29uc29sZV9vd25lcl9maWxlPSRlbmFibGV2YWwsZW5hYmxlX2NvbnNvbGVfb3duZXJfZmlsZT1hdXRvKQorQUNfQVJHX0VOQUJMRSh1c2VyZGItY2FjaGUsIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS11c2VyZGItY2FjaGVdLFtidWlsZCB3aXRoIHVzZXJkYi1jYWNoZSBzdXBwb3J0XSksZW5hYmxlX3VzZXJkYl9jYWNoZT0kZW5hYmxldmFsLGVuYWJsZV91c2VyZGJfY2FjaGU9eWVzKQorQUNfQVJHX0VOQUJMRShsYXVuY2hkLCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtbGF1bmNoZF0sW2J1aWxkIHdpdGggbGF1bmNoZCBhdXRvLWxhdW5jaCBzdXBwb3J0XSksZW5hYmxlX2xhdW5jaGQ9JGVuYWJsZXZhbCxlbmFibGVfbGF1bmNoZD1hdXRvKQorQUNfQVJHX0VOQUJMRShzeXN0ZW1kLCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtc3lzdGVtZF0sW2J1aWxkIHdpdGggc3lzdGVtZCBhdF9jb25zb2xlIHN1cHBvcnRdKSxlbmFibGVfc3lzdGVtZD0kZW5hYmxldmFsLGVuYWJsZV9zeXN0ZW1kPWF1dG8pCisKK0FDX0FSR19XSVRIKHhtbCwgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC14bWw9W2xpYnhtbC9leHBhdF1dLFtYTUwgbGlicmFyeSB0byB1c2UgKGxpYnhtbCBtYXkgYmUgbmFtZWQgbGlieG1sMiBvbiBzb21lIHN5c3RlbXMpXSkpCitBQ19BUkdfV0lUSChpbml0LXNjcmlwdHMsIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtaW5pdC1zY3JpcHRzPVtyZWRoYXRdXSxbU3R5bGUgb2YgaW5pdCBzY3JpcHRzIHRvIGluc3RhbGxdKSkKK0FDX0FSR19XSVRIKHNlc3Npb24tc29ja2V0LWRpciwgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1zZXNzaW9uLXNvY2tldC1kaXI9W2Rpcm5hbWVdXSxbV2hlcmUgdG8gcHV0IHNvY2tldHMgZm9yIHRoZSBwZXItbG9naW4tc2Vzc2lvbiBtZXNzYWdlIGJ1c10pKQorQUNfQVJHX1dJVEgodGVzdC1zb2NrZXQtZGlyLCBBU19IRUxQX1NUUklORyhbLS13aXRoLXRlc3Qtc29ja2V0LWRpcj1bZGlybmFtZV1dLFtXaGVyZSB0byBwdXQgc29ja2V0cyBmb3IgbWFrZSBjaGVja10pKQorQUNfQVJHX1dJVEgoc3lzdGVtLXBpZC1maWxlLCBBU19IRUxQX1NUUklORyhbLS13aXRoLXN5c3RlbS1waWQtZmlsZT1bcGlkZmlsZV1dLFtQSUQgZmlsZSBmb3Igc3lzdGVtd2lkZSBkYWVtb25dKSkKK0FDX0FSR19XSVRIKHN5c3RlbS1zb2NrZXQsIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtc3lzdGVtLXNvY2tldD1bZmlsZW5hbWVdXSxbVU5JWCBkb21haW4gc29ja2V0IGZvciBzeXN0ZW13aWRlIGRhZW1vbl0pKQorQUNfQVJHX1dJVEgoY29uc29sZS1hdXRoLWRpciwgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1jb25zb2xlLWF1dGgtZGlyPVtkaXJuYW1lXV0sW2RpcmVjdG9yeSB0byBjaGVjayBmb3IgY29uc29sZSBvd25lcmhpcF0pKQorQUNfQVJHX1dJVEgoY29uc29sZS1vd25lci1maWxlLCBBU19IRUxQX1NUUklORyhbLS13aXRoLWNvbnNvbGUtb3duZXItZmlsZT1bZmlsZW5hbWVdXSxbZmlsZSB3aG9zZSBvd25lciBkZXRlcm1pbmVzIGN1cnJlbnQgY29uc29sZSBvd25lcl0pKQorQUNfQVJHX1dJVEgobGF1bmNoZC1hZ2VudC1kaXIsIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtbGF1bmNoZC1hZ2VudC1kaXI9W2Rpcm5hbWVdXSxbZGlyZWN0b3J5IHRvIHB1dCB0aGUgbGF1bmNoZCBhZ2VudCAoZGVmYXVsdDogL0xpYnJhcnkvTGF1bmNoQWdlbnRzKV0pKQorQUNfQVJHX1dJVEgoZGJ1c191c2VyLCBBU19IRUxQX1NUUklORyhbLS13aXRoLWRidXMtdXNlcj08dXNlcj5dLFtVc2VyIGZvciBydW5uaW5nIHRoZSBEQlVTIGRhZW1vbiAobWVzc2FnZWJ1cyldKSkKK0FDX0FSR19XSVRIKGRidXNfZGFlbW9uZGlyLCBBU19IRUxQX1NUUklORyhbLS13aXRoLWRidXMtZGFlbW9uZGlyPVtkaXJuYW1lXV0sW0RpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyB0aGUgREJVUyBkYWVtb25dKSkKK0FDX0FSR19XSVRIKGRidXNfc2Vzc2lvbl9idXNfZGVmYXVsdF9hZGRyZXNzLCBBU19IRUxQX1NUUklORyhbLS13aXRoLWRidXMtc2Vzc2lvbi1idXMtZGVmYXVsdC1hZGRyZXNzPVtub25jZS10Y3A6L2F1dG9sYXVuY2g6L3RjcDpob3N0OnBvcnRdXSxbVHJhbnNwb3J0IFR5cGUgdG8gYmUgdXNlZCAoZGVmYXVsdDogbm9uY2UtdGNwOildKSx3aXRoX2RidXNfc2Vzc2lvbl9idXNfZGVmYXVsdF9hZGRyZXNzPSR3aXRodmFsLHdpdGhfZGJ1c19zZXNzaW9uX2J1c19kZWZhdWx0X2FkZHJlc3M9bm9uY2UtdGNwOikKKworQUNfQVJHX0VOQUJMRShbZW1iZWRkZWQtdGVzdHNdLAorICBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtZW1iZWRkZWQtdGVzdHNdLAorICAgIFtlbmFibGUgdW5pdCB0ZXN0IGNvZGUgaW4gdGhlIGxpYnJhcnkgYW5kIGJpbmFyaWVzXSksCisgIFtdLCBbZW5hYmxlX2VtYmVkZGVkX3Rlc3RzPSRlbmFibGVfZGV2ZWxvcGVyXSkKK0FDX0FSR19FTkFCTEUoW21vZHVsYXItdGVzdHNdLAorICBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtbW9kdWxhci10ZXN0c10sCisgICAgW2VuYWJsZSBtb2R1bGFyIHJlZ3Jlc3Npb24gdGVzdHMgKHJlcXVpcmVzIEdMaWIpXSksCisgIFtdLCBbZW5hYmxlX21vZHVsYXJfdGVzdHM9YXV0b10pCisjIC0tZW5hYmxlLXRlc3RzIG92ZXJyaWRlcyBib3RoIC0tZW5hYmxlLWVtYmVkZGVkLXRlc3RzIGFuZAorIyAtLWVuYWJsZS1tb2R1bGFyLXRlc3RzCitBQ19BUkdfRU5BQkxFKFt0ZXN0c10sCisgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS10ZXN0c10sCisgICAgW2VuYWJsZS9kaXNhYmxlIGFsbCB0ZXN0cywgb3ZlcnJpZGluZyBlbWJlZGRlZC10ZXN0cy9tb2R1bGFyLXRlc3RzXSksCisgIFsKKyAgaWYgdGVzdCAieCRlbmFibGV2YWwiID0geHllczsgdGhlbgorICAgIEFDX01TR19OT1RJQ0UoW0Z1bGwgdGVzdCBjb3ZlcmFnZSB3YXMgcmVxdWVzdGVkIHdpdGggLS1lbmFibGUtdGVzdHM9eWVzXSkKKyAgICBBQ19NU0dfTk9USUNFKFtUaGlzIGhhcyBtYW55IGRlcGVuZGVuY2llcyAoR0xpYiwgZGJ1cy1nbGliLCBQeXRob24pXSkKKyAgZmkKKyAgZW5hYmxlX2VtYmVkZGVkX3Rlc3RzPSRlbmFibGV2YWwKKyAgZW5hYmxlX21vZHVsYXJfdGVzdHM9JGVuYWJsZXZhbAorICBdLAorICBbXSkKKworIyBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUyBjb250cm9scyB1bml0IHRlc3RzIGJ1aWx0IGluIHRvIC5jIGZpbGVzCisjIGFuZCBhbHNvIHNvbWUgc3R1ZmYgaW4gdGhlIHRlc3QvIHN1YmRpci4gREJVU19CVUlMRF9URVNUUyB3YXMgYW4gb2xkZXIKKyMgbmFtZSBmb3IgdGhpcy4KK0FNX0NPTkRJVElPTkFMKFtEQlVTX0JVSUxEX1RFU1RTXSwgW3Rlc3QgIngkZW5hYmxlX2VtYmVkZGVkX3Rlc3RzIiA9IHh5ZXNdKQorQU1fQ09ORElUSU9OQUwoW0RCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTXSwKKyAgW3Rlc3QgIngkZW5hYmxlX2VtYmVkZGVkX3Rlc3RzIiA9IHh5ZXNdKQoraWYgdGVzdCAieCRlbmFibGVfZW1iZWRkZWRfdGVzdHMiID0geHllczsgdGhlbgorICAgIEFDX0RFRklORShbREJVU19FTkFCTEVfRU1CRURERURfVEVTVFNdLCBbMV0sCisgICAgICBbRGVmaW5lIHRvIGJ1aWxkIHRlc3QgY29kZSBpbnRvIHRoZSBsaWJyYXJ5IGFuZCBiaW5hcmllc10pCisgICAgQUNfREVGSU5FKFtEQlVTX0JVSUxEX1RFU1RTXSwgWzFdLAorICAgICAgW0RlZmluZSB0byBidWlsZCB0ZXN0IGNvZGUgaW50byB0aGUgbGlicmFyeSBhbmQgYmluYXJpZXNdKQorZmkKKworIyBEQlVTX0VOQUJMRV9NT0RVTEFSX1RFU1RTIGNvbnRyb2xzIHRlc3RzIHRoYXQgd29yayBiYXNlZCBvbiBwdWJsaWMgQVBJLgorIyBUaGVzZSB1c2UgR1Rlc3QsIGZyb20gR0xpYiwgYmVjYXVzZSBsaWZlJ3MgdG9vIHNob3J0LiBUaGV5J3JlIGVuYWJsZWQgYnkKKyMgZGVmYXVsdCAodW5sZXNzIHlvdSBkb24ndCBoYXZlIEdMaWIpLCBiZWNhdXNlIHRoZXkgZG9uJ3QgYmxvYXQgdGhlIGxpYnJhcnkKKyMgb3IgYmluYXJpZXMuCisKK3dpdGhfZ2xpYj15ZXMKKworaWYgdGVzdCAieCRlbmFibGVfbW9kdWxhcl90ZXN0cyIgIT0geG5vOyB0aGVuCisgIFBLR19DSEVDS19NT0RVTEVTKFtHTElCXSwgW2dsaWItMi4wID49IDIuMjQsIGdpby0yLjAgPj0gMi4yNF0sCisgICAgW10sCisgICAgW2lmIHRlc3QgIngkZW5hYmxlX21vZHVsYXJfdGVzdHMiID0geHllczsgdGhlbgorICAgICAgQUNfTVNHX05PVElDRShbRnVsbCB0ZXN0IGNvdmVyYWdlICgtLWVuYWJsZS1tb2R1bGFyLXRlc3RzPXllcyBvciAtLWVuYWJsZS10ZXN0cz15ZXMpIHJlcXVpcmVzIEdMaWJdKQorICAgICAgQUNfTVNHX0VSUk9SKFskR0xJQl9FUlJPUlNdKQorICAgIGVsc2UgIyBhc3N1bWVkIHRvIGJlICJhdXRvIgorICAgICAgd2l0aF9nbGliPW5vCisgICAgZmldKQorICAjIElmIGRidXMtZ21haW4uW2NoXSByZXR1cm5lZCB0byBsaWJkYnVzIHRoZW4gd2Ugd291bGRuJ3QgbmVlZCB0aGlzCisgIFBLR19DSEVDS19NT0RVTEVTKFtEQlVTX0dMSUJdLCBbZGJ1cy1nbGliLTFdLAorICAgIFtdLAorICAgIFtpZiB0ZXN0ICJ4JGVuYWJsZV9tb2R1bGFyX3Rlc3RzIiA9IHh5ZXM7IHRoZW4KKyAgICAgIEFDX01TR19OT1RJQ0UoW0Z1bGwgdGVzdCBjb3ZlcmFnZSAoLS1lbmFibGUtbW9kdWxhci10ZXN0cz15ZXMgb3IgLS1lbmFibGUtdGVzdHM9eWVzKSByZXF1aXJlcyBkYnVzLWdsaWJdKQorICAgICAgQUNfTVNHX0VSUk9SKFskREJVU19HTElCX0VSUk9SU10pCisgICAgZWxzZSAjIGFzc3VtZWQgdG8gYmUgImF1dG8iCisgICAgICB3aXRoX2dsaWI9bm8KKyAgICBmaV0pCitmaQoraWYgdGVzdCAieCRlbmFibGVfbW9kdWxhcl90ZXN0cyIgIT0geG5vOyB0aGVuCisgIEFDX0RFRklORShbREJVU19FTkFCTEVfTU9EVUxBUl9URVNUU10sIFsxXSwKKyAgICBbRGVmaW5lIHRvIGJ1aWxkIGluZGVwZW5kZW50IHRlc3QgYmluYXJpZXNdKQorZmkKK0FNX0NPTkRJVElPTkFMKFtEQlVTX0VOQUJMRV9NT0RVTEFSX1RFU1RTXSwKKyAgW3Rlc3QgIngkZW5hYmxlX21vZHVsYXJfdGVzdHMiICE9IHhub10pCisKK2lmIHRlc3QgIngkd2l0aF9nbGliIiAhPSB4bm87IHRoZW4KKyAgQUNfREVGSU5FKFtEQlVTX1dJVEhfR0xJQl0sIFsxXSwKKyAgICBbRGVmaW5lIGlmIEdMaWIsIEdPYmplY3QsIEdJTyBhcmUgYXZhaWxhYmxlXSkKK2ZpCitBTV9DT05ESVRJT05BTChbREJVU19XSVRIX0dMSUJdLCBbdGVzdCAieCR3aXRoX2dsaWIiICE9IHhub10pCisKK0FDX0FSR19FTkFCTEUoW2luc3RhbGxlZC10ZXN0c10sCisgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1pbnN0YWxsZWQtdGVzdHNdLAorICAgIFtlbmFibGUgdW5pdCB0ZXN0IGNvZGUgaW4gdGhlIGxpYnJhcnkgYW5kIGJpbmFyaWVzXSksCisgIFtdLCBbZW5hYmxlX2luc3RhbGxlZF90ZXN0cz1ub10pCitBTV9DT05ESVRJT05BTChbREJVU19FTkFCTEVfSU5TVEFMTEVEX1RFU1RTXSwKKyAgW3Rlc3QgIngkZW5hYmxlX2luc3RhbGxlZF90ZXN0cyIgPSB4eWVzXSkKKworaWYgdGVzdCAieCRlbmFibGVfdGVzdHMiID0geHllczsgdGhlbgorICAjIGZ1bGwgdGVzdCBjb3ZlcmFnZSBpcyByZXF1aXJlZCwgUHl0aG9uIGlzIGEgaGFyZCBkZXBlbmRlbmN5CisgIEFDX01TR19OT1RJQ0UoW0Z1bGwgdGVzdCBjb3ZlcmFnZSAoLS1lbmFibGUtdGVzdHM9eWVzKSByZXF1aXJlcyBQeXRob24sIGRidXMtcHl0aG9uLCBweWdvYmplY3RdKQorICBBTV9QQVRIX1BZVEhPTihbMi42XSkKKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgUHl0aG9uIG1vZHVsZXMgZm9yIGZ1bGwgdGVzdCBjb3ZlcmFnZV0pCisgIGlmICIkUFlUSE9OIiAtYyAiaW1wb3J0IGRidXMsIGdvYmplY3QsIGRidXMubWFpbmxvb3AuZ2xpYiI7IHRoZW4KKyAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICBlbHNlCisgICAgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgIEFDX01TR19FUlJPUihbY2Fubm90IGltcG9ydCBkYnVzLCBnb2JqZWN0LCBkYnVzLm1haW5sb29wLmdsaWIgUHl0aG9uIG1vZHVsZXNdKQorICBmaQorZWxzZQorICAjIC0tZW5hYmxlLXRlc3RzIG5vdCBnaXZlbjogZG8gbm90IGFib3J0IGlmIFB5dGhvbiBpcyBtaXNzaW5nCisgIEFNX1BBVEhfUFlUSE9OKFsyLjZdLCBbXSwgWzpdKQorZmkKKworaWYgdGVzdCB4JGVuYWJsZV92ZXJib3NlX21vZGUgPSB4eWVzOyB0aGVuCisgICAgQUNfREVGSU5FKERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERSwxLFtTdXBwb3J0IGEgdmVyYm9zZSBtb2RlXSkKK2ZpCisKK2lmIHRlc3QgeCRlbmFibGVfYXNzZXJ0cyA9IHhubzsgdGhlbgorICAgIEFDX0RFRklORShEQlVTX0RJU0FCTEVfQVNTRVJULDEsW0Rpc2FibGUgYXNzZXJ0aW9uIGNoZWNraW5nXSkKKyAgICBESVNBQkxFX1VOVVNFRF9XQVJOSU5HUz0idW51c2VkLWxhYmVsIgorICAgIFJfRFlOQU1JQ19MREZMQUc9IiIKK2Vsc2UKKyAgICAjIC1yZHluYW1pYyBpcyBuZWVkZWQgZm9yIGdsaWJjJ3MgYmFja3RyYWNlX3N5bWJvbHMgdG8gd29yay4KKyAgICAjIE5vIGNsdWUgaG93IG11Y2ggb3ZlcmhlYWQgdGhpcyBhZGRzLCBidXQgaXQncyB1c2VmdWwKKyAgICAjIHRvIGRvIHRoaXMgb24gYW55IGFzc2VydGlvbiBmYWlsdXJlLAorICAgICMgc28gZm9yIG5vdyBpdCdzIGVuYWJsZWQgYW55dGltZSBhc3NlcnRzIGFyZSAoY3VycmVudGx5IG5vdAorICAgICMgaW4gcHJvZHVjdGlvbiBidWlsZHMpLgorCisgICAgIyBUbyBnZXQgLXJkeW5hbWljIHlvdSBwYXNzIC1leHBvcnQtZHluYW1pYyB0byBsaWJ0b29sLgorICAgIEFDX0RFRklORShEQlVTX0JVSUxUX1JfRFlOQU1JQywxLFt3aGV0aGVyIC1leHBvcnQtZHluYW1pYyB3YXMgcGFzc2VkIHRvIGxpYnRvb2xdKQorICAgIFJfRFlOQU1JQ19MREZMQUc9LWV4cG9ydC1keW5hbWljCitmaQorQUNfU1VCU1QoUl9EWU5BTUlDX0xERkxBRykKKworaWYgdGVzdCB4JGVuYWJsZV9jaGVja3MgPSB4bm87IHRoZW4KKyAgICBBQ19ERUZJTkUoREJVU19ESVNBQkxFX0NIRUNLUywxLFtEaXNhYmxlIHB1YmxpYyBBUEkgc2FuaXR5IGNoZWNraW5nXSkKKyAgICBBQ19ERUZJTkUoR19ESVNBQkxFX0NIRUNLUywxLFtEaXNhYmxlIEdMaWIgcHVibGljIEFQSSBzYW5pdHkgY2hlY2tpbmddKQorICAgIERJU0FCTEVfVU5VU0VEX1dBUk5JTkdTPSJ1bnVzZWQtbGFiZWwiCitmaQorCitpZiB0ZXN0IHgkZW5hYmxlX3VzZXJkYl9jYWNoZSA9IHh5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoREJVU19FTkFCTEVfVVNFUkRCX0NBQ0hFLDEsW0J1aWxkIHdpdGggY2FjaGluZyBvZiB1c2VyIGRhdGFdKQorZmkKKworaWYgdGVzdCB4JGVuYWJsZV9jb21waWxlcl9jb3ZlcmFnZSA9IHh5ZXM7IHRoZW4KKyAgICAgIyMgc28gdGhhdCBjb25maWcuaCBjaGFuZ2VzIHdoZW4geW91IHRvZ2dsZSBnY292IHN1cHBvcnQKKyAgICAgQUNfREVGSU5FX1VOUVVPVEVEKERCVVNfR0NPVl9FTkFCTEVELCAxLCBbRGVmaW5lZCBpZiBnY292IGlzIGVuYWJsZWQgdG8gZm9yY2UgYSByZWJ1aWxkIGR1ZSB0byBjb25maWcuaCBjaGFuZ2luZ10pCitmaQorCisjIGdsaWJjMjEubTQgc2VyaWFsIDMKK2RubCBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMiwgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZG5sIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCitkbmwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRlc3QgZm9yIHRoZSBHTlUgQyBMaWJyYXJ5LCB2ZXJzaW9uIDIuMSBvciBuZXdlci4KKyMgRnJvbSBCcnVubyBIYWlibGUuCisKK0FDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBMaWJyYXJ5IDIuMSBvciBuZXdlciwKKyAgYWNfY3ZfZ251X2xpYnJhcnlfMl8xLAorICBbQUNfRUdSRVBfQ1BQKFtMdWNreSBHTlUgdXNlcl0sCisgICAgWworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaWZkZWYgX19HTlVfTElCUkFSWV9fCisgI2lmIChfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPj0gMSkgfHwgKF9fR0xJQkNfXyA+IDIpCisgIEx1Y2t5IEdOVSB1c2VyCisgI2VuZGlmCisjZW5kaWYKKyAgICBdLAorICAgIGFjX2N2X2dudV9saWJyYXJ5XzJfMT15ZXMsCisgICAgYWNfY3ZfZ251X2xpYnJhcnlfMl8xPW5vKQorICBdCispCisKKyMjIyMgSW50ZWdlciBzaXplcworCitBQ19DSEVDS19TSVpFT0YoY2hhcikKK0FDX0NIRUNLX1NJWkVPRihzaG9ydCkKK0FDX0NIRUNLX1NJWkVPRihsb25nKQorQUNfQ0hFQ0tfU0laRU9GKGludCkKK0FDX0NIRUNLX1NJWkVPRih2b2lkICopCitBQ19DSEVDS19TSVpFT0YobG9uZyBsb25nKQorQUNfQ0hFQ0tfU0laRU9GKF9faW50NjQpCisKK0FDX0FSR19XSVRIKFs2NC1iaXRdLAorICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aG91dC02NC1iaXRdLAorICAgIFtJZiB5b3UgaGF2ZSB0byB1c2UgdGhpcyBvcHRpb24sIHBsZWFzZSByZXBvcnQgaXQgYXMgYSBidWddKV0sCisgIFtdLAorICBbd2l0aF82NF9iaXQ9eWVzXSkKKworIyMjIFNlZSB3aGF0IG91ciA2NCBiaXQgdHlwZSBpcyBjYWxsZWQKK0FDX01TR19DSEVDS0lORyhbNjQtYml0IGludGVnZXIgdHlwZV0pCisKK2Nhc2UgOCBpbgorJGFjX2N2X3NpemVvZl9pbnQpCisgIGRidXNpbnQ2ND1pbnQKKyAgZGJ1c2ludDY0X2NvbnN0YW50PScodmFsKScKKyAgZGJ1c3VpbnQ2NF9jb25zdGFudD0nKHZhbCknCisgIGRidXNpbnQ2NF9wcmludGZfbW9kaWZpZXI9JyIiJworICA7OworJGFjX2N2X3NpemVvZl9sb25nKQorICBkYnVzaW50NjQ9bG9uZworICBkYnVzaW50NjRfY29uc3RhbnQ9Jyh2YWwjI0wpJworICBkYnVzdWludDY0X2NvbnN0YW50PScodmFsIyNVTCknCisgIGRidXNpbnQ2NF9wcmludGZfbW9kaWZpZXI9JyJsIicKKyAgOzsKKyRhY19jdl9zaXplb2ZfbG9uZ19sb25nKQorICBkYnVzaW50NjQ9J2xvbmcgbG9uZycKKyAgZGJ1c2ludDY0X2NvbnN0YW50PScodmFsIyNMTCknCisgIGRidXN1aW50NjRfY29uc3RhbnQ9Jyh2YWwjI1VMTCknCisgICMgSWRlYWxseSB3ZSBkaXNjb3ZlciB3aGF0IHRoZSBmb3JtYXQgaXMsIGJ1dCB0aGlzIGlzCisgICMgb25seSB1c2VkIGluIHZlcmJvc2UgbW9kZSwgc28gZWguLi4KKyAgaWYgdGVzdCB4IiRhY19jdl9nbnVfbGlicmFyeV8yXzEiID0geHllczsgdGhlbgorICAgIGRidXNpbnQ2NF9wcmludGZfbW9kaWZpZXI9JyJsbCInCisgIGZpCisgIDs7CiskYWNfY3Zfc2l6ZW9mX19faW50NjQpCisgIGRidXNpbnQ2ND1fX2ludDY0CisgIGRidXNpbnQ2NF9jb25zdGFudD0nKHZhbCMjaTY0KScKKyAgZGJ1c3VpbnQ2NF9jb25zdGFudD0nKHZhbCMjdWk2NCknCisgICMgU2VlIGFib3ZlIGNhc2UKKyAgaWYgdGVzdCB4IiRhY19jdl9nbnVfbGlicmFyeV8yXzEiID0geHllczsgdGhlbgorICAgIGRidXNpbnQ2NF9wcmludGZfbW9kaWZpZXI9JyJsbCInCisgIGZpCisgIDs7Citlc2FjCisKK0FTX0lGKAorICBbdGVzdCAieCR3aXRoXzY0X2JpdCIgPSB4bm9dLAorICBbCisgICAgICAgIERCVVNfSU5UNjRfVFlQRT0ibm9faW50NjRfdHlwZV9kZXRlY3RlZCIKKyAgICAgICAgREJVU19IQVZFX0lOVDY0PTAKKyAgICAgICAgREJVU19JTlQ2NF9DT05TVEFOVD0KKyAgICAgICAgREJVU19VSU5UNjRfQ09OU1RBTlQ9CisgICAgICAgIEFDX01TR19SRVNVTFQoW2Rpc2FibGVkIHZpYSAtLXdpdGhvdXQtNjQtYml0XSkKKyAgXSwKKyAgZG5sIGVsc2UgaWYKKyAgW3Rlc3QgLXogIiRkYnVzaW50NjQiXSwKKyAgW0FDX01TR19SRVNVTFQoW25vdCBmb3VuZF0pCisgIEFDX01TR19FUlJPUihbQ291bGQgbm90IGZpbmQgYSA2NC1iaXQgaW50ZWdlciB0eXBlLgorCitQbGVhc2UgcmVwb3J0IGEgYnVnIGhlcmUgd2l0aCBkZXRhaWxzIG9mIHlvdXIgcGxhdGZvcm0gYW5kIGNvbXBpbGVyOgorCisgICAgaHR0cDovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL2VudGVyX2J1Zy5jZ2k/cHJvZHVjdD1EQnVzJmNvbXBvbmVudD1jb3JlCisKK1RvIGNvbXBpbGUgRC1CdXMgd2l0aCBhbGwgNjQtYml0IGludGVnZXIgdHlwZXMgcmVtb3ZlZCAobm90IHJlY29tbWVuZGVkKSwgdXNlCit0aGUgb3B0aW9uICItLXdpdGhvdXQtNjQtYml0Ii4KKworVGhpcyBvcHRpb24gaXMgbGlrZWx5IHRvIGJlIHJlbW92ZWQgaW4gZnV0dXJlLCB1bmxlc3MgeW91IHJlcG9ydCB0aGF0IHlvdXIKK3BsYXRmb3JtIG5lZWRzIGl0Ll0pCisgIF0sCisgIGRubCBlbHNlCisgIFsKKyAgICAgICAgREJVU19JTlQ2NF9UWVBFPSIkZGJ1c2ludDY0IgorICAgICAgICBEQlVTX0hBVkVfSU5UNjQ9MQorICAgICAgICBEQlVTX0lOVDY0X0NPTlNUQU5UPSIkZGJ1c2ludDY0X2NvbnN0YW50IgorICAgICAgICBEQlVTX1VJTlQ2NF9DT05TVEFOVD0iJGRidXN1aW50NjRfY29uc3RhbnQiCisJaWYgdGVzdCB4IiRkYnVzaW50NjRfcHJpbnRmX21vZGlmaWVyIiAhPSB4OyB0aGVuCisJCUFDX0RFRklORV9VTlFVT1RFRChEQlVTX0lOVDY0X1BSSU5URl9NT0RJRklFUiwgWyRkYnVzaW50NjRfcHJpbnRmX21vZGlmaWVyXSwgW0RlZmluZSB0byBwcmludGYgbW9kaWZpZXIgZm9yIDY0IGJpdCBpbnRlZ2VyIHR5cGVdKQorCWZpCisgICAgICAgIEFDX01TR19SRVNVTFQoJERCVVNfSU5UNjRfVFlQRSkKKyAgXSkKKworQUNfU1VCU1QoREJVU19JTlQ2NF9UWVBFKQorQUNfU1VCU1QoREJVU19JTlQ2NF9DT05TVEFOVCkKK0FDX1NVQlNUKERCVVNfVUlOVDY0X0NPTlNUQU5UKQorQUNfU1VCU1QoREJVU19IQVZFX0lOVDY0KQorCisjIyMgc2VlIHdoYXQgMzItYml0IGludCBpcyBjYWxsZWQKK0FDX01TR19DSEVDS0lORyhbMzItYml0IGludGVnZXIgdHlwZV0pCisKK2Nhc2UgNCBpbgorJGFjX2N2X3NpemVvZl9zaG9ydCkKKyAgZGJ1c2ludDMyPXNob3J0CisgIDs7CiskYWNfY3Zfc2l6ZW9mX2ludCkKKyAgZGJ1c2ludDMyPWludAorICA7OworJGFjX2N2X3NpemVvZl9sb25nKQorICBkYnVzaW50MzI9bG9uZworICA7OworZXNhYworCitpZiB0ZXN0IC16ICIkZGJ1c2ludDMyIiA7IHRoZW4KKyAgICAgICAgREJVU19JTlQzMl9UWVBFPSJub19pbnQzMl90eXBlX2RldGVjdGVkIgorICAgICAgICBBQ19NU0dfRVJST1IoW05vIDMyLWJpdCBpbnRlZ2VyIHR5cGUgZm91bmRdKQorZWxzZQorICAgICAgICBEQlVTX0lOVDMyX1RZUEU9IiRkYnVzaW50MzIiCisgICAgICAgIEFDX01TR19SRVNVTFQoJERCVVNfSU5UMzJfVFlQRSkKK2ZpCisKK0FDX1NVQlNUKERCVVNfSU5UMzJfVFlQRSkKKworIyMjIHNlZSB3aGF0IDE2LWJpdCBpbnQgaXMgY2FsbGVkCitBQ19NU0dfQ0hFQ0tJTkcoWzE2LWJpdCBpbnRlZ2VyIHR5cGVdKQorCitjYXNlIDIgaW4KKyRhY19jdl9zaXplb2Zfc2hvcnQpCisgIGRidXNpbnQxNj1zaG9ydAorICA7OworJGFjX2N2X3NpemVvZl9pbnQpCisgIGRidXNpbnQxNj1pbnQKKyAgOzsKK2VzYWMKKworaWYgdGVzdCAteiAiJGRidXNpbnQxNiIgOyB0aGVuCisgICAgICAgIERCVVNfSU5UMTZfVFlQRT0ibm9faW50MTZfdHlwZV9kZXRlY3RlZCIKKyAgICAgICAgQUNfTVNHX0VSUk9SKFtObyAxNi1iaXQgaW50ZWdlciB0eXBlIGZvdW5kXSkKK2Vsc2UKKyAgICAgICAgREJVU19JTlQxNl9UWVBFPSIkZGJ1c2ludDE2IgorICAgICAgICBBQ19NU0dfUkVTVUxUKCREQlVTX0lOVDE2X1RZUEUpCitmaQorCitBQ19TVUJTVChEQlVTX0lOVDE2X1RZUEUpCisKKyMjIGJ5dGUgb3JkZXIKK2Nhc2UgJGhvc3Rfb3MgaW4KKwlkYXJ3aW4qKQorCQkjIGNoZWNrIGF0IGNvbXBpbGUtdGltZSwgc28gdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBidWlsZCB1bml2ZXJzYWwKKwkJIyAod2l0aCBtdWx0aXBsZSBhcmNoaXRlY3R1cmVzIGF0IG9uY2Ugb24gdGhlIGNvbXBpbGUgbGluZSkKKwkJQUhfVkVSQkFUSU0oW1dPUkRTX0JJR0VORElBTl9EQVJXSU5dLCBbCisJCQkvKiBVc2UgdGhlIGNvbXBpbGVyLXByb3ZpZGVkIGVuZGlhbm5lc3MgZGVmaW5lcyB0byBhbGxvdyB1bml2ZXJzYWwgY29tcGlsaW5nLiAqLworCQkJI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOX18pCisJCQkjZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCisJCQkjZW5kaWYKKwkJXSkKKwkJOzsKKwkqKQorCQlBQ19DX0JJR0VORElBTgorCQk7OworZXNhYworCitkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorZG5sICoqKiB2YV9jb3B5IGNoZWNrcyAoZnJvbSBHTGliKSAqKioKK2RubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitkbmwgd2UgY3VycmVudGx5IGNoZWNrIGZvciBhbGwgdGhyZWUgdmFfY29weSBwb3NzaWJpbGl0aWVzLCBzbyB3ZSBnZXQKK2RubCBhbGwgcmVzdWx0cyBpbiBjb25maWcubG9nIGZvciBidWcgcmVwb3J0cy4KK0FDX0NBQ0hFX0NIRUNLKFtmb3IgYW4gaW1wbGVtZW50YXRpb24gb2YgdmFfY29weSgpXSxkYnVzX2N2X3ZhX2NvcHksWworCUFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCXN0YXRpYyB2b2lkIGYgKGludCBpLCAuLi4pIHsKKwl2YV9saXN0IGFyZ3MxLCBhcmdzMjsKKwl2YV9zdGFydCAoYXJnczEsIGkpOworCXZhX2NvcHkgKGFyZ3MyLCBhcmdzMSk7CisJaWYgKHZhX2FyZyAoYXJnczIsIGludCkgIT0gNDIgfHwgdmFfYXJnIChhcmdzMSwgaW50KSAhPSA0MikKKwkgIGV4aXQgKDEpOworCXZhX2VuZCAoYXJnczEpOyB2YV9lbmQgKGFyZ3MyKTsKKwl9CisJaW50IG1haW4oKSB7CisJICBmICgwLCA0Mik7CisJICByZXR1cm4gMDsKKwl9XSldLAorCVtkYnVzX2N2X3ZhX2NvcHk9eWVzXSwKKwlbZGJ1c19jdl92YV9jb3B5PW5vXSkKK10pCitBQ19DQUNIRV9DSEVDSyhbZm9yIGFuIGltcGxlbWVudGF0aW9uIG9mIF9fdmFfY29weSgpXSxkYnVzX2N2X19fdmFfY29weSxbCisJQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFsjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisJc3RhdGljIHZvaWQgZiAoaW50IGksIC4uLikgeworCXZhX2xpc3QgYXJnczEsIGFyZ3MyOworCXZhX3N0YXJ0IChhcmdzMSwgaSk7CisJX192YV9jb3B5IChhcmdzMiwgYXJnczEpOworCWlmICh2YV9hcmcgKGFyZ3MyLCBpbnQpICE9IDQyIHx8IHZhX2FyZyAoYXJnczEsIGludCkgIT0gNDIpCisJICBleGl0ICgxKTsKKwl2YV9lbmQgKGFyZ3MxKTsgdmFfZW5kIChhcmdzMik7CisJfQorCWludCBtYWluKCkgeworCSAgZiAoMCwgNDIpOworCSAgcmV0dXJuIDA7CisJfV0pXSwKKwlbZGJ1c19jdl9fX3ZhX2NvcHk9eWVzXSwKKwlbZGJ1c19jdl9fX3ZhX2NvcHk9bm9dKQorXSkKKworaWYgdGVzdCAieCRkYnVzX2N2X3ZhX2NvcHkiID0gInh5ZXMiOyB0aGVuCisgIGRidXNfdmFfY29weV9mdW5jPXZhX2NvcHkKK2Vsc2UgaWYgdGVzdCAieCRkYnVzX2N2X19fdmFfY29weSIgPSAieHllcyI7IHRoZW4KKyAgZGJ1c192YV9jb3B5X2Z1bmM9X192YV9jb3B5CitmaQorZmkKKworaWYgdGVzdCAtbiAiJGRidXNfdmFfY29weV9mdW5jIjsgdGhlbgorICBBQ19ERUZJTkVfVU5RVU9URUQoREJVU19WQV9DT1BZLCRkYnVzX3ZhX2NvcHlfZnVuYyxbQSAndmFfY29weScgc3R5bGUgZnVuY3Rpb25dKQorZmkKKworQUNfTEFOR19QVVNIKEMpCitBQ19DQUNIRV9DSEVDSyhbd2hldGhlciB2YV9saXN0cyBjYW4gYmUgY29waWVkIGJ5IHZhbHVlXSwKKwlkYnVzX2N2X3ZhX3ZhbF9jb3B5LAorCVtBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oCitbWworCSNpbmNsdWRlIDxzdGRhcmcuaD4KKwkjaW5jbHVkZSA8c3RkbGliLmg+CitdXSwKK1tbCisJc3RhdGljIHZvaWQgZiAoaW50IGksIC4uLikgeworCXZhX2xpc3QgYXJnczEsIGFyZ3MyOworCXZhX3N0YXJ0IChhcmdzMSwgaSk7CisJYXJnczIgPSBhcmdzMTsKKwlpZiAodmFfYXJnIChhcmdzMiwgaW50KSAhPSA0MiB8fCB2YV9hcmcgKGFyZ3MxLCBpbnQpICE9IDQyKQorCSAgZXhpdCAoMSk7CisJdmFfZW5kIChhcmdzMSk7IHZhX2VuZCAoYXJnczIpOworCX0KKwlpbnQgbWFpbigpIHsKKwkgIGYgKDAsIDQyKTsKKwkgIHJldHVybiAwOworCX0KK11dKV0sCisJW2RidXNfY3ZfdmFfdmFsX2NvcHk9eWVzXSwKKwlbZGJ1c19jdl92YV92YWxfY29weT1ub10sCisJW2RidXNfY3ZfdmFfdmFsX2NvcHk9eWVzXSkKK10pCitBQ19MQU5HX1BPUChDKQorCitpZiB0ZXN0ICJ4JGRidXNfY3ZfdmFfdmFsX2NvcHkiID0gInhubyI7IHRoZW4KKyAgQUNfREVGSU5FKERCVVNfVkFfQ09QWV9BU19BUlJBWSwxLCBbJ3ZhX2xpc3RzJyBjYW5ub3QgYmUgY29waWVzIGFzIHZhbHVlc10pCitmaQorCisKKyMjIyMgQXRvbWljIGludGVnZXJzCisKK0FDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyICRDQyBrbm93cyBfX3N5bmNfc3ViX2FuZF9mZXRjaCgpXSwKKyAgZGJ1c19jdl9zeW5jX3N1Yl9hbmRfZmV0Y2gsCisgIFtBQ19MSU5LX0lGRUxTRShbCisgICAgIEFDX0xBTkdfUFJPR1JBTShbW11dLCBbW2ludCBhID0gNDsgaW50IGIgPSBfX3N5bmNfc3ViX2FuZF9mZXRjaCgmYSwgNCk7IGV4aXQoYik7IF1dKV0sCisgICAgIFtkYnVzX2N2X3N5bmNfc3ViX2FuZF9mZXRjaD15ZXNdLAorICAgICBbZGJ1c19jdl9zeW5jX3N1Yl9hbmRfZmV0Y2g9bm9dKQorICBdKQorCitpZiB0ZXN0ICJ4JGRidXNfY3Zfc3luY19zdWJfYW5kX2ZldGNoIiA9ICJ4eWVzIiA7IHRoZW4KKyAgIGhhdmVfc3luYz0xCitlbHNlCisgICBoYXZlX3N5bmM9MAorZmkKKworQUNfREVGSU5FX1VOUVVPVEVEKFtEQlVTX1VTRV9TWU5DXSwgWyRoYXZlX3N5bmNdLCBbVXNlIHRoZSBnY2MgX19zeW5jIGV4dGVuc2lvbl0pCisKKyMjIyMgVmFyaW91cyBmdW5jdGlvbnMKK0FDX1NFQVJDSF9MSUJTKHNvY2tldCxbc29ja2V0IG5ldHdvcmtdKQorQUNfQ0hFQ0tfRlVOQyhnZXRob3N0YnluYW1lLCxbQUNfQ0hFQ0tfTElCKG5zbCxnZXRob3N0YnluYW1lKV0pCisKK0FDX0NIRUNLX0ZVTkNTKHZzbnByaW50ZiB2YXNwcmludGYgbmFub3NsZWVwIHVzbGVlcCBzZXRlbnYgY2xlYXJlbnYgdW5zZXRlbnYgc29ja2V0cGFpciBnZXRncm91cGxpc3QgZnBhdGhjb25mIHNldHJsaW1pdCBwb2xsIHNldGxvY2FsZSBsb2NhbGVjb252IHN0cnRvbGwgc3RydG91bGwgaXNzZXR1Z2lkIGdldHJlc3VpZCkKKworQUNfQ0hFQ0tfSEVBREVSUyhbc3lzbG9nLmhdKQoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfc3lzbG9nX2giID0gInh5ZXMiOyB0aGVuCisgIEFDX0NIRUNLX0RFQ0xTKFtMT0dfUEVSUk9SXSwgW10sIFtdLCBbWyNpbmNsdWRlIDxzeXNsb2cuaD5dXSkKK2ZpCisKKyMjIyMgQ2hlY2sgZm9yIGJyb2tlbiBwb2xsOyB0YWtlbiBmcm9tIEdsaWIncyBjb25maWd1cmUKKworQUNfTVNHX0NIRUNLSU5HKFtmb3IgYnJva2VuIHBvbGxdKQorQUNfUlVOX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW1sKKyAgICAjaW5jbHVkZSA8c3RkbGliLmg+CisgICAgI2luY2x1ZGUgPGZjbnRsLmg+CisgICAgI2luY2x1ZGUgPHBvbGwuaD4KKyAgICAjaWZkZWYgSEFWRV9TWVNfUE9MTF9ICisgICAgI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisgICAgI2VuZGlmCisgICAgaW50IG1haW4odm9pZCkgeworICAgICAgc3RydWN0IHBvbGxmZCBmZHNbMV07CisgICAgICBpbnQgZmQ7CisgICAgICBmZCA9IG9wZW4oIi9kZXYvbnVsbCIsIDEpOworICAgICAgZmRzWzBdLmZkID0gZmQ7CisgICAgICBmZHNbMF0uZXZlbnRzID0gUE9MTElOOworICAgICAgZmRzWzBdLnJldmVudHMgPSAwOworICAgICAgaWYgKHBvbGwoZmRzLCAxLCAwKSA8IDAgfHwgKGZkc1swXS5yZXZlbnRzICYgUE9MTE5WQUwpICE9IDApIHsKKyAgICAgICAgICAgIGV4aXQoMSk7ICAvKiBEb2VzIG5vdCB3b3JrIGZvciBkZXZpY2VzIC0tIGZhaWwgKi8KKyAgICAgIH0KKyAgICAgIGV4aXQoMCk7CisgICAgfV1dKV0sCisgIFticm9rZW5fcG9sbD1ub10sCisgIFticm9rZW5fcG9sbD15ZXMKKyAgIEFDX0RFRklORShCUk9LRU5fUE9MTCwxLFtwb2xsIGRvZXNuJ3Qgd29yayBvbiBkZXZpY2VzXSldLAorICBbYnJva2VuX3BvbGw9Im5vIChjcm9zcyBjb21waWxpbmcpIl0pCitBQ19NU0dfUkVTVUxUKCRicm9rZW5fcG9sbCkKKworQUNfTVNHX0NIRUNLSU5HKGZvciBkaXJmZCkKK0FDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KK11dLCBbWworRElSICpkaXJwOworZGlycCA9IG9wZW5kaXIoIi4iKTsKK2RpcmZkKGRpcnApOworY2xvc2VkaXIoZGlycCk7CitdXSldLAorW2RidXNfaGF2ZV9kaXJmZD15ZXNdLAorW2RidXNfaGF2ZV9kaXJmZD1ub10pCitBQ19NU0dfUkVTVUxUKCRkYnVzX2hhdmVfZGlyZmQpCitpZiB0ZXN0ICIkZGJ1c19oYXZlX2RpcmZkIiA9IHllczsgdGhlbgorCUFDX0RFRklORShIQVZFX0RJUkZELDEsW0hhdmUgZGlyZmQgZnVuY3Rpb25dKQorZWxzZQorCUFDX01TR19DSEVDS0lORyhmb3IgRElSICpkaXJwLT5kZF9mZCkKKwlBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisJXV0sIFtbCitESVIgKmRpcnA7CitpbnQgZmQ7CitkaXJwID0gb3BlbmRpcigiLiIpOworZmQgPSBkaXJwLT5kZF9mZDsKK2Nsb3NlZGlyKGRpcnApOworICAgICAgICBdXSldLAorICAgICAgICBbZGJ1c19oYXZlX2RkZmQ9eWVzXSwKKyAgICAgICAgW2RidXNfaGF2ZV9kZGZkPW5vXSkKKwlBQ19NU0dfUkVTVUxUKCRkYnVzX2hhdmVfZGRmZCkKKwlpZiB0ZXN0ICIkZGJ1c19oYXZlX2RkZmQiID0geWVzOyB0aGVuCisJCUFDX0RFRklORShIQVZFX0RERkQsMSxbSGF2ZSB0aGUgZGRmZCBtZW1iZXIgb2YgRElSXSkKKwlmaQorZmkKKworQUNfQ0hFQ0tfSEVBREVSUyhzeXMvcmVzb3VyY2UuaCkKKworQUNfQ0hFQ0tfSEVBREVSUyhkaXJlbnQuaCkKKworQUNfQ0hFQ0tfSEVBREVSUyhleGVjaW5mby5oLCBbQUNfQ0hFQ0tfRlVOQ1MoYmFja3RyYWNlKV0pCisKK0FDX0NIRUNLX0hFQURFUlMoZXJybm8uaCkKKworQUNfQ0hFQ0tfSEVBREVSUyhzaWduYWwuaCkKKworQUNfQ0hFQ0tfSEVBREVSUyhsb2NhbGUuaCkKKworQUNfQ0hFQ0tfSEVBREVSUyhieXRlc3dhcC5oKQorCitBQ19DSEVDS19IRUFERVJTKHVuaXN0ZC5oKQorCitBQ19DSEVDS19IRUFERVJTKHdzMnRjcGlwLmgpCisKK0FDX0NIRUNLX0hFQURFUlMod3NwaWFwaS5oKQorCisjIEFkZCAtRF9QT1NJWF9QVEhSRUFEX1NFTUFOVElDUyBpZiBvbiBTb2xhcmlzCisjCitjYXNlICRob3N0X29zIGluCisgICAgc29sYXJpcyopCisgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1EX1BPU0lYX1BUSFJFQURfU0VNQU5USUNTIiA7OworZXNhYworCisjIGNoZWNraW5nIGZvciBhIHBvc2l4IHZlcnNpb24gb2YgZ2V0cHduYW1fcgorIyBpZiB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nIGFuZCBjYW4gbm90IHJ1biB0aGUgdGVzdAorIyBhc3N1bWUgZ2V0cHduYW1fciBpcyB0aGUgcG9zaXggdmVyc2lvbgorIyBpdCBpcyB1cCB0byB0aGUgcGVyc29uIGNyb3NzIGNvbXBpbGluZyB0byBjaGFuZ2UKKyMgdGhpcyBiZWhhdmlvciBpZiBkZXNpcmVkCitBQ19MQU5HX1BVU0goQykKK0FDX0NBQ0hFX0NIRUNLKFtmb3IgcG9zaXggZ2V0cHduYW1fcl0sCisJCWFjX2N2X2Z1bmNfcG9zaXhfZ2V0cHduYW1fciwKKwkJW0FDX1JVTl9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTSgKK1tbCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxwd2QuaD4KK11dLAorW1sKKyAgICBjaGFyIGJ1ZmZlclsxMDAwMF07CisgICAgc3RydWN0IHBhc3N3ZCBwd2QsICpwd3B0ciA9ICZwd2Q7CisgICAgaW50IGVycm9yOworICAgIGVycm5vID0gMDsKKyAgICBlcnJvciA9IGdldHB3bmFtX3IgKCIiLCAmcHdkLCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKGJ1ZmZlciksICZwd3B0cik7CisgICByZXR1cm4gKGVycm9yIDwgMCAmJiBlcnJubyA9PSBFTk9TWVMpCisJICAgfHwgZXJyb3IgPT0gRU5PU1lTOworXV0pXSwKKwlbYWNfY3ZfZnVuY19wb3NpeF9nZXRwd25hbV9yPXllc10sCisJW2FjX2N2X2Z1bmNfcG9zaXhfZ2V0cHduYW1fcj1ub10sCisgICAgICAgIFthY19jdl9mdW5jX3Bvc2l4X2dldHB3bmFtX3I9eWVzXQorKV0pCitBQ19MQU5HX1BPUChDKQorCitpZiB0ZXN0ICIkYWNfY3ZfZnVuY19wb3NpeF9nZXRwd25hbV9yIiA9IHllczsgdGhlbgorICAgICAgICBBQ19ERUZJTkUoSEFWRV9QT1NJWF9HRVRQV05BTV9SLDEsCisgICAgICAgICAgICAgICAgW0hhdmUgUE9TSVggZnVuY3Rpb24gZ2V0cHduYW1fcl0pCitlbHNlCisgICAgICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3Igbm9ucG9zaXggZ2V0cHduYW1fcl0sCisgICAgICAgICAgICAgICAgYWNfY3ZfZnVuY19ub25wb3NpeF9nZXRwd25hbV9yLAorICAgICAgICAgICAgICAgIFtBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbI2luY2x1ZGUgPHB3ZC5oPl1dLCBbW2NoYXIgYnVmZmVyWzEwMDAwXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwYXNzd2QgcHdkOworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0cHduYW1fciAoIiIsICZwd2QsIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKGJ1ZmZlcikpO11dKV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbYWNfY3ZfZnVuY19ub25wb3NpeF9nZXRwd25hbV9yPXllc10sCisgICAgICAgICAgICAgICAgICAgICAgICBbYWNfY3ZfZnVuY19ub25wb3NpeF9nZXRwd25hbV9yPW5vXSldKQorICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRhY19jdl9mdW5jX25vbnBvc2l4X2dldHB3bmFtX3IiID0geWVzOyB0aGVuCisgICAgICAgICAgICAgICAgQUNfREVGSU5FKEhBVkVfTk9OUE9TSVhfR0VUUFdOQU1fUiwxLAorICAgICAgICAgICAgICAgICAgICAgICAgW0hhdmUgbm9uLVBPU0lYIGZ1bmN0aW9uIGdldHB3bmFtX3JdKQorICAgICAgICBmaQorZmkKKworZG5sIGNoZWNrIGZvciBzb2NrbGVuX3QKK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIHNvY2tsZW5fdCBpcyBkZWZpbmVkKQorQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorXV0sIFtbCitzb2NrbGVuX3QgZm9vOworZm9vID0gMTsKK11dKV0sCitbZGJ1c19oYXZlX3NvY2tsZW5fdD15ZXNdLAorW2RidXNfaGF2ZV9zb2NrbGVuX3Q9bm9dKQorQUNfTVNHX1JFU1VMVCgkZGJ1c19oYXZlX3NvY2tsZW5fdCkKKworaWYgdGVzdCAieCRkYnVzX2hhdmVfc29ja2xlbl90IiA9ICJ4eWVzIjsgdGhlbgorICAgIEFDX0RFRklORShIQVZFX1NPQ0tMRU5fVCwxLFtIYXZlIHNvY2tsZW5fdCB0eXBlXSkKK2ZpCisKK2RubCBjaGVjayBmb3Igd3JpdGV2IGhlYWRlciBhbmQgd3JpdGV2IGZ1bmN0aW9uIHNvIHdlJ3JlCitkbmwgZ29vZCB0byBnbyBpZiBIQVZFX1dSSVRFViBnZXRzIGRlZmluZWQuCitBQ19DSEVDS19IRUFERVJTKHN5cy91aW8uaCwgW0FDX0NIRUNLX0ZVTkNTKHdyaXRldildKQorCitkbmwgbmVlZGVkIG9uIGRhcndpbiBmb3IgTkFNRV9NQVgKK0FDX0NIRUNLX0hFQURFUlMoc3lzL3N5c2xpbWl0cy5oKQorCitkbmwgTWFrZSBpdCBlYXN5IHRvIGNoZWNrIGlmIHdlIGhhdmUgTVNHX05PU0lHTkFMIHdpdGhvdXQgYWN0dWFsbHkgaGF2aW5nIHRvIGluY2x1ZGUgc3lzL3NvY2tldC5oCitBQ19DSEVDS19ERUNMUyhbTVNHX05PU0lHTkFMXSwgW10sIFtdLCBbWyAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPiBdXSkKKworZG5sIGNoZWNrIGZvciBmbGF2b3VycyBvZiB2YXJhcmdzIG1hY3JvcyAodGVzdCBmcm9tIEdMaWIpCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIElTTyBDOTkgdmFyYXJncyBtYWNyb3MgaW4gQykKK0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1tdXSwgW1sKK2ludCBhKGludCBwMSwgaW50IHAyLCBpbnQgcDMpOworI2RlZmluZSBjYWxsX2EoLi4uKSBhKDEsX19WQV9BUkdTX18pCitjYWxsX2EoMiwzKTsKK11dKV0sCitbZGJ1c19oYXZlX2lzb19jX3ZhcmFyZ3M9eWVzXSwKK1tkYnVzX2hhdmVfaXNvX2NfdmFyYXJncz1ub10pCitBQ19NU0dfUkVTVUxUKCRkYnVzX2hhdmVfaXNvX2NfdmFyYXJncykKKworQUNfTVNHX0NIRUNLSU5HKGZvciBHTlVDIHZhcmFyZ3MgbWFjcm9zKQorQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbW11dLCBbWworaW50IGEoaW50IHAxLCBpbnQgcDIsIGludCBwMyk7CisjZGVmaW5lIGNhbGxfYShwYXJhbXMuLi4pIGEoMSxwYXJhbXMpCitjYWxsX2EoMiwzKTsKK11dKV0sCitbZGJ1c19oYXZlX2dudWNfdmFyYXJncz15ZXNdLAorW2RidXNfaGF2ZV9nbnVjX3ZhcmFyZ3M9bm9dKQorQUNfTVNHX1JFU1VMVCgkZGJ1c19oYXZlX2dudWNfdmFyYXJncykKKworZG5sIE91dHB1dCB2YXJhcmdzIHRlc3RzCitpZiB0ZXN0IHgkZGJ1c19oYXZlX2lzb19jX3ZhcmFyZ3MgPSB4eWVzOyB0aGVuCisgICAgQUNfREVGSU5FKEhBVkVfSVNPX1ZBUkFSR1MsMSxbSGF2ZSBJU08gQzk5IHZhcmFyZ3MgbWFjcm9zXSkKK2ZpCitpZiB0ZXN0IHgkZGJ1c19oYXZlX2dudWNfdmFyYXJncyA9IHh5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoSEFWRV9HTlVDX1ZBUkFSR1MsMSxbSGF2ZSBHTlUtc3R5bGUgdmFyYXJncyBtYWNyb3NdKQorZmkKKworZG5sIENoZWNrIGZvciB2YXJpb3VzIGNyZWRlbnRpYWxzLgorQUNfTVNHX0NIRUNLSU5HKGZvciBzdHJ1Y3QgY21zZ2NyZWQpCitBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorXV0sIFtbCitzdHJ1Y3QgY21zZ2NyZWQgY3JlZDsKKworY3JlZC5jbWNyZWRfcGlkID0gMDsKK11dKV0sCitbZGJ1c19oYXZlX3N0cnVjdF9jbXNnY3JlZD15ZXNdLAorW2RidXNfaGF2ZV9zdHJ1Y3RfY21zZ2NyZWQ9bm9dKQorQUNfTVNHX1JFU1VMVCgkZGJ1c19oYXZlX3N0cnVjdF9jbXNnY3JlZCkKKworaWYgdGVzdCB4JGRidXNfaGF2ZV9zdHJ1Y3RfY21zZ2NyZWQgPSB4eWVzOyB0aGVuCisgICAgQUNfREVGSU5FKEhBVkVfQ01TR0NSRUQsMSxbSGF2ZSBjbXNnY3JlZCBzdHJ1Y3R1cmVdKQorZmkKKworQUNfQ0hFQ0tfRlVOQ1MoZ2V0cGVlcnVjcmVkIGdldHBlZXJlaWQpCisKK0FDX0NIRUNLX0ZVTkNTKHBpcGUyIGFjY2VwdDQpCisKKyMjIyMgQWJzdHJhY3Qgc29ja2V0cworCitpZiB0ZXN0IHgkZW5hYmxlX2Fic3RyYWN0X3NvY2tldHMgPSB4YXV0bzsgdGhlbgorQUNfTEFOR19QVVNIKEMpCit3YXJuX29uX3hjb21waWxlPW5vCitBQ19DQUNIRV9DSEVDSyhbYWJzdHJhY3Qgc29ja2V0IG5hbWVzcGFjZV0sCisJCWFjX2N2X2hhdmVfYWJzdHJhY3Rfc29ja2V0cywKKwkJW0FDX1JVTl9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTSgKK1tbCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KK11dLAorW1sKKyAgc2l6ZV90IHNsZW47CisgIGludCBsaXN0ZW5fZmQ7CisgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyOworCisgIGxpc3Rlbl9mZCA9IHNvY2tldCAoUEZfVU5JWCwgU09DS19TVFJFQU0sIDApOworCisgIGlmIChsaXN0ZW5fZmQgPCAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgInNvY2tldCgpIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIG1lbXNldCAoJmFkZHIsICdcMCcsIHNpemVvZiAoYWRkcikpOworICBhZGRyLnN1bl9mYW1pbHkgPSBBRl9VTklYOworICBzdHJjcHkgKGFkZHIuc3VuX3BhdGgsICJYL3RtcC9kYnVzLWZha2Utc29ja2V0LXBhdGgtdXNlZC1pbi1jb25maWd1cmUtdGVzdCIpOworICAvKiBTVU5fTEVOIHVzZXMgc3RybGVuKCkgc28gbmVlZCB0byBjYWxjdWxhdGUgaXQgYmVmb3JlIGFkZGluZyBcMCBhdCB0aGUKKyAgICogYmVnaW5uaW5nLgorICAgKi8KKyAgc2xlbiA9IFNVTl9MRU4oJmFkZHIpOworICBhZGRyLnN1bl9wYXRoWzBdID0gJ1wwJzsgLyogdGhpcyBpcyB3aGF0IG1ha2VzIGl0IGFic3RyYWN0ICovCisKKyAgaWYgKGJpbmQgKGxpc3Rlbl9mZCwgKHN0cnVjdCBzb2NrYWRkciopICZhZGRyLCBzbGVuKSA8IDApCisgICAgeworICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkFic3RyYWN0IHNvY2tldCBuYW1lc3BhY2UgYmluZCgpIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgZXhpdCAoMSk7CisgICAgfQorICBlbHNlCisgICAgZXhpdCAoMCk7CitdXSldLAorICAgICAgICAgICAgICBbYWNfY3ZfaGF2ZV9hYnN0cmFjdF9zb2NrZXRzPXllc10sCisgICAgICAgICAgICAgIFthY19jdl9oYXZlX2Fic3RyYWN0X3NvY2tldHM9bm9dLAorICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgYWNfY3ZfaGF2ZV9hYnN0cmFjdF9zb2NrZXRzPW5vCisgICAgICAgICAgICAgICAgd2Fybl9vbl94Y29tcGlsZT15ZXMKKyAgICAgICAgICAgICAgXQorKV0pCitpZiB0ZXN0IHgkd2Fybl9vbl94Y29tcGlsZSA9IHh5ZXMgOyB0aGVuCisgIEFDX01TR19XQVJOKFtDYW5ub3QgY2hlY2sgZm9yIGFic3RyYWN0IHNvY2tldHMgd2hlbiBjcm9zcy1jb21waWxpbmcsIHBsZWFzZSB1c2UgLS1lbmFibGUtYWJzdHJhY3Qtc29ja2V0c10pCitmaQorQUNfTEFOR19QT1AoQykKK2ZpCisKK2lmIHRlc3QgeCRlbmFibGVfYWJzdHJhY3Rfc29ja2V0cyA9IHh5ZXM7IHRoZW4KKyAgICBpZiB0ZXN0IHgkYWNfY3ZfaGF2ZV9hYnN0cmFjdF9zb2NrZXRzID0geG5vOyB0aGVuCisJQUNfTVNHX0VSUk9SKFtBYnN0cmFjdCBzb2NrZXRzIGV4cGxpY2l0bHkgcmVxdWlyZWQsIGFuZCBzdXBwb3J0IG5vdCBkZXRlY3RlZC5dKQorICAgIGZpCitmaQorCitpZiB0ZXN0IHgkZW5hYmxlX2Fic3RyYWN0X3NvY2tldHMgPSB4bm87IHRoZW4KKyAgIGFjX2N2X2hhdmVfYWJzdHJhY3Rfc29ja2V0cz1ubzsKK2ZpCisKK2lmIHRlc3QgeCRhY19jdl9oYXZlX2Fic3RyYWN0X3NvY2tldHMgPSB4eWVzIDsgdGhlbgorICAgREJVU19QQVRIX09SX0FCU1RSQUNUPWFic3RyYWN0CisgICBBQ19ERUZJTkUoSEFWRV9BQlNUUkFDVF9TT0NLRVRTLDEsW0hhdmUgYWJzdHJhY3Qgc29ja2V0IG5hbWVzcGFjZV0pCitlbHNlCisgICBEQlVTX1BBVEhfT1JfQUJTVFJBQ1Q9cGF0aAorZmkKKworIyB0aGlzIGlzIHVzZWQgaW4gYWRkcmVzc2VzIHRvIHByZWZlciBhYnN0cmFjdCwgZS5nLgorIyB1bml4OnBhdGg9L2ZvbyBvciB1bml4OmFic3RyYWN0PS9mb28KK0FDX1NVQlNUKERCVVNfUEFUSF9PUl9BQlNUUkFDVCkKKworUEtHX1BST0dfUEtHX0NPTkZJRworCisjIyMjIFNvcnQgb3V0IFhNTCBsaWJyYXJ5CisKKyMgc2VlIHdoYXQgd2UgaGF2ZQorQUNfQ0hFQ0tfTElCKGV4cGF0LCBYTUxfUGFyc2VyQ3JlYXRlX01NLAorICAgICAgICAgICAgIFsgQUNfQ0hFQ0tfSEVBREVSUyhleHBhdC5oLCBoYXZlX2V4cGF0PXRydWUsIGhhdmVfZXhwYXQ9ZmFsc2UpIF0sCisgICAgICAgICAgICAgaGF2ZV9leHBhdD1mYWxzZSkKKworIyBzZWUgd2hhdCB3ZSB3YW50IHRvIHVzZQorZGJ1c191c2VfbGlieG1sPWZhbHNlCitkYnVzX3VzZV9leHBhdD1mYWxzZQoraWYgdGVzdCB4JHdpdGhfeG1sID0geGV4cGF0OyB0aGVuCisgICAgICAgIGlmICEgJGhhdmVfZXhwYXQgOyB0aGVuCisgICAgICAgICAgIEFDX01TR19FUlJPUihbRXhwbGljaXRseSByZXF1ZXN0ZWQgZXhwYXQgYnV0IGV4cGF0IG5vdCBmb3VuZF0pCisgICAgICAgIGZpCisgICAgICAgIGRidXNfdXNlX2V4cGF0PXRydWUKK2VsaWYgdGVzdCB4JHdpdGhfeG1sID0geGxpYnhtbDsgdGhlbgorICAgICAgICBQS0dfQ0hFQ0tfTU9EVUxFUyhMSUJYTUwsIGxpYnhtbC0yLjAgPj0gMi42LjAsIGhhdmVfbGlieG1sPXRydWUsIGhhdmVfbGlieG1sPWZhbHNlKQorICAgICAgICBpZiAhICRoYXZlX2xpYnhtbCA7IHRoZW4KKyAgICAgICAgICAgQUNfTVNHX0VSUk9SKFtFeHBsaWNpdGx5IHJlcXVlc3RlZCBsaWJ4bWwgYnV0IGxpYnhtbCBub3QgZm91bmRdKQorICAgICAgICBmaQorICAgICAgICBkYnVzX3VzZV9saWJ4bWw9dHJ1ZQorZWxzZQorICAgICAgICAjIyMgZXhwYXQgaXMgdGhlIGRlZmF1bHQgYmVjYXVzZSBsaWJ4bWwgY2FuJ3QgY3VycmVudGx5IHN1cnZpdmUKKyAgICAgICAgIyMjIG91ciBicnV0YWwgT09NLWhhbmRsaW5nIHVuaXQgdGVzdCBzZXR1cC4KKyAgICAgICAgIyMjIGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTEwOTM2OAorICAgICAgICBpZiB0ZXN0IHgkaGF2ZV9leHBhdCA9IHhmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIEFDX01TR19FUlJPUihbQ291bGQgbm90IGZpbmQgZXhwYXQuaCwgY2hlY2sgY29uZmlnLmxvZyBmb3IgZmFpbGVkIGF0dGVtcHRzXSkKKyAgICAgICAgZmkKKwkjIyMgQnkgZGVmYXVsdCwgb25seSB1c2UgRXhwYXQgc2luY2UgaXQncyB0ZXN0ZWQgYW5kIGtub3duIHRvIHdvcmsuICBJZiB5b3UncmUgYQorCSMjIyBnZW5lcmFsLXB1cnBvc2UgT1MgdmVuZG9yLCBwbGVhc2UgZG9uJ3QgZW5hYmxlIGxpYnhtbC4gIEZvciBlbWJlZGRlZCB1c2UKKwkjIyMgaWYgeW91ciBPUyBpcyBidWlsdCBhcm91bmQgbGlieG1sLCB0aGF0J3MgYW5vdGhlciBjYXNlLgorCWRidXNfdXNlX2V4cGF0PXRydWUKK2ZpCisKK0FNX0NPTkRJVElPTkFMKERCVVNfVVNFX0VYUEFULCAkZGJ1c191c2VfZXhwYXQpCitBTV9DT05ESVRJT05BTChEQlVTX1VTRV9MSUJYTUwsICRkYnVzX3VzZV9saWJ4bWwpCisKK2lmICRkYnVzX3VzZV9leHBhdDsgdGhlbgorICAgWE1MX0xJQlM9LWxleHBhdAorICAgWE1MX0NGTEFHUz0KK2ZpCitpZiAkZGJ1c191c2VfbGlieG1sOyB0aGVuCisgICBYTUxfTElCUz0kTElCWE1MX0xJQlMKKyAgIFhNTF9DRkxBR1M9JExJQlhNTF9DRkxBR1MKK2ZpCitBQ19TVUJTVChbWE1MX0NGTEFHU10pCitBQ19TVUJTVChbWE1MX0xJQlNdKQorCisjIFRocmVhZCBsaWIgZGV0ZWN0aW9uCitBQ19DSEVDS19GVU5DKHB0aHJlYWRfY29uZF90aW1lZHdhaXQsW0FDX0NIRUNLX0xJQihwdGhyZWFkLHB0aHJlYWRfY29uZF90aW1lZHdhaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1RIUkVBRF9MSUJTPSItbHB0aHJlYWQiXSldKQorc2F2ZV9saWJzPSIkTElCUyIKK0xJQlM9IiRMSUJTICRUSFJFQURfTElCUyIKK0FDX0NIRUNLX0ZVTkMocHRocmVhZF9jb25kYXR0cl9zZXRjbG9jayxoYXZlX3B0aHJlYWRfY29uZGF0dHJfc2V0Y2xvY2s9dHJ1ZSxoYXZlX3B0aHJlYWRfY29uZGF0dHJfc2V0Y2xvY2s9ZmFsc2UpCitpZiB0ZXN0IHgkaGF2ZV9wdGhyZWFkX2NvbmRhdHRyX3NldGNsb2NrID0geHRydWU7IHRoZW4KKyAgICBBQ19TRUFSQ0hfTElCUyhbY2xvY2tfZ2V0cmVzXSxbcnRdLFtUSFJFQURfTElCUz0iJFRIUkVBRF9MSUJTIC1scnQiXSkKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBDTE9DS19NT05PVE9OSUNdKQorICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KK11dLCBbWworc3RydWN0IHRpbWVzcGVjIG1vbm90b25pY190aW1lcjsKK3B0aHJlYWRfY29uZGF0dHJfdCBhdHRyOworcHRocmVhZF9jb25kYXR0cl9pbml0ICgmYXR0cik7CitwdGhyZWFkX2NvbmRhdHRyX3NldGNsb2NrICgmYXR0ciwgQ0xPQ0tfTU9OT1RPTklDKTsKK2Nsb2NrX2dldHJlcyAoQ0xPQ0tfTU9OT1RPTklDLCZtb25vdG9uaWNfdGltZXIpOworXV0pXSwKK1toYXZlX2Nsb2NrX21vbm90b25pYz10cnVlXSwKK1toYXZlX2Nsb2NrX21vbm90b25pYz1mYWxzZV0pCitpZiB0ZXN0IHgkaGF2ZV9jbG9ja19tb25vdG9uaWMgPSB4dHJ1ZTsgdGhlbgorICAgIEFDX01TR19SRVNVTFQoW2ZvdW5kXSkKKyAgICBBQ19ERUZJTkUoSEFWRV9NT05PVE9OSUNfQ0xPQ0ssIDEsIFtEZWZpbmUgaWYgd2UgaGF2ZSBDTE9DS19NT05PVE9OSUNdKQorZWxzZQorICAgIEFDX01TR19SRVNVTFQoW25vdCBmb3VuZF0pCitmaQorZmkKK0xJQlM9IiRzYXZlX2xpYnMiCisKK0FDX1NVQlNUKFtUSFJFQURfTElCU10pCisKKyMgU0VMaW51eCBkZXRlY3Rpb24KK2lmIHRlc3QgeCRlbmFibGVfc2VsaW51eCA9IHhubyA7IHRoZW4KKyAgICBoYXZlX3NlbGludXg9bm87CitlbHNlCisgICAgIyBTZWUgaWYgd2UgaGF2ZSBTRUxpbnV4IGxpYnJhcnkKKyAgICBBQ19DSEVDS19MSUIoc2VsaW51eCwgaXNfc2VsaW51eF9lbmFibGVkLAorICAgICAgICAgICAgICAgICBoYXZlX3NlbGludXg9eWVzLCBoYXZlX3NlbGludXg9bm8pCisKKyAgICAjIHNlZSBpZiB3ZSBoYXZlIHRoZSBTRUxpbnV4IGhlYWRlciB3aXRoIHRoZSBuZXcgRC1CdXMgc3R1ZmYgaW4gaXQKKyAgICBpZiB0ZXN0IHgkaGF2ZV9zZWxpbnV4ID0geHllcyA7IHRoZW4KKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgREJVUyBGbGFzayBwZXJtaXNzaW9ucyBpbiBzZWxpbnV4L2F2X3Blcm1pc3Npb25zLmhdKQorICAgICAgICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbI2luY2x1ZGUgPHNlbGludXgvYXZfcGVybWlzc2lvbnMuaD5dXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1sjaWZkZWYgREJVU19fQUNRVUlSRV9TVkMgcmV0dXJuIDA7CisJCQkgICAgI2Vsc2UKKwkJCSAgICAjZXJyb3IgREJVU19fQUNRVUlSRV9TVkMgbm90IGRlZmluZWQKKwkJCSAgICAjZW5kaWZdXSldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbaGF2ZV9zZWxpbnV4PXllc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtoYXZlX3NlbGludXg9bm9dKQorCUFDX01TR19SRVNVTFQoJGhhdmVfc2VsaW51eCkKKyAgICBmaQorCisgICAgaWYgdGVzdCB4JGVuYWJsZV9zZWxpbnV4ID0geGF1dG8gOyB0aGVuCisgICAgICAgIGlmIHRlc3QgeCRoYXZlX3NlbGludXggPSB4bm8gOyB0aGVuCisgICAgICAgICAgICAgICAgQUNfTVNHX1dBUk4oW1N1ZmZpY2llbnRseSBuZXcgU0VMaW51eCBsaWJyYXJ5IG5vdCBmb3VuZF0pCisgICAgICAgIGZpCisgICAgZWxzZQorICAgICAgICBpZiB0ZXN0IHgkaGF2ZV9zZWxpbnV4ID0geG5vIDsgdGhlbgorICAgICAgICAgICAgICAgIEFDX01TR19FUlJPUihbU0VsaW51eCBleHBsaWNpdGx5IHJlcXVpcmVkLCBhbmQgU0VMaW51eCBsaWJyYXJ5IG5vdCBmb3VuZF0pCisgICAgICAgIGZpCisgICAgZmkKK2ZpCisKK0FNX0NPTkRJVElPTkFMKEhBVkVfU0VMSU5VWCwgdGVzdCB4JGhhdmVfc2VsaW51eCA9IHh5ZXMpCisKK2lmIHRlc3QgeCRoYXZlX3NlbGludXggPSB4eWVzIDsgdGhlbgorICAgICMgdGhlIHNlbGludXggY29kZSBjcmVhdGVzIHRocmVhZHMKKyAgICAjIHdoaWNoIHJlcXVpcmVzIGxpYnB0aHJlYWQgZXZlbiBvbiBsaW51eAorICAgIEFDX0NIRUNLX0ZVTkMocHRocmVhZF9jcmVhdGUsLFtBQ19DSEVDS19MSUIocHRocmVhZCxwdGhyZWFkX2NyZWF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRUxJTlVYX1RIUkVBRF9MSUJTPSItbHB0aHJlYWQiXSldKQorCisgICAgU0VMSU5VWF9MSUJTPSItbHNlbGludXggJFNFTElOVVhfVEhSRUFEX0xJQlMiCisgICAgQUNfREVGSU5FKEhBVkVfU0VMSU5VWCwxLFtTRUxpbnV4IHN1cHBvcnRdKQorZWxzZQorICAgIFNFTElOVVhfTElCUz0KK2ZpCisKKyMgaW5vdGlmeSBjaGVja3MKK2lmIHRlc3QgeCRlbmFibGVfaW5vdGlmeSA9IHhubyA7IHRoZW4KKyAgICBoYXZlX2lub3RpZnk9bm87CitlbHNlCisgICAgQUNfQ0hFQ0tfSEVBREVSUyhzeXMvaW5vdGlmeS5oLCBoYXZlX2lub3RpZnk9eWVzLCBoYXZlX2lub3RpZnk9bm8pCitmaQorCitkbmwgY2hlY2sgaWYgaW5vdGlmeSBiYWNrZW5kIGlzIGVuYWJsZWQKK2lmIHRlc3QgeCRoYXZlX2lub3RpZnkgPSB4eWVzOyB0aGVuCisgICBBQ19ERUZJTkUoREJVU19CVVNfRU5BQkxFX0lOT1RJRlksMSxbVXNlIGlub3RpZnldKQorICAgQUNfQ0hFQ0tfRlVOQ1MoaW5vdGlmeV9pbml0MSkKK2ZpCisKK0FNX0NPTkRJVElPTkFMKERCVVNfQlVTX0VOQUJMRV9JTk9USUZZLCB0ZXN0IHgkaGF2ZV9pbm90aWZ5ID0geHllcykKKworIyBkbm90aWZ5IGNoZWNrcworaWYgdGVzdCB4JGVuYWJsZV9kbm90aWZ5ID0geG5vIDsgdGhlbgorICAgIGhhdmVfZG5vdGlmeT1ubzsKK2Vsc2UKKyAgICBpZiB0ZXN0IHgkaGF2ZV9pbm90aWZ5ID0geG5vIC1hIHgkaG9zdF9vcyA9IHhsaW51eC1nbnUgLW8geCRob3N0X29zID0geGxpbnV4OyB0aGVuCisgICAgICAgIGhhdmVfZG5vdGlmeT15ZXM7CisgICAgZWxzZQorICAgICAgICBoYXZlX2Rub3RpZnk9bm87CisgICAgZmkKK2ZpCisKK2RubCBjaGVjayBpZiBkbm90aWZ5IGJhY2tlbmQgaXMgZW5hYmxlZAoraWYgdGVzdCB4JGhhdmVfZG5vdGlmeSA9IHh5ZXM7IHRoZW4KKyAgIEFDX0RFRklORShEQlVTX0JVU19FTkFCTEVfRE5PVElGWV9PTl9MSU5VWCwxLFtVc2UgZG5vdGlmeSBvbiBMaW51eF0pCitmaQorCitBTV9DT05ESVRJT05BTChEQlVTX0JVU19FTkFCTEVfRE5PVElGWV9PTl9MSU5VWCwgdGVzdCB4JGhhdmVfZG5vdGlmeSA9IHh5ZXMpCisKKyMgRm9yIHNpbXBsaWNpdHksIHdlIHJlcXVpcmUgdGhlIHVzZXJsYW5kIEFQSSBmb3IgZXBvbGxfY3JlYXRlMSBhdAorIyBjb21waWxlLXRpbWUgKGdsaWJjIDIuOSksIGJ1dCB3ZSdsbCBydW4gb24ga2VybmVscyB0aGF0IHR1cm4gb3V0CisjIG5vdCB0byBoYXZlIGl0IGF0IHJ1bnRpbWUuCitBQ19BUkdfRU5BQkxFKFtlcG9sbF0sCisgICAgICAgICAgICAgIFtBU19IRUxQX1NUUklORyhbLS1lbmFibGUtZXBvbGxdLFt1c2UgZXBvbGwoNCkgb24gTGludXhdKV0sCisgICAgICAgICAgICAgIFtlbmFibGVfZXBvbGw9JGVuYWJsZXZhbF0sIFtlbmFibGVfZXBvbGw9YXV0b10pCitpZiB0ZXN0IHgkZW5hYmxlX2Vwb2xsID0geG5vOyB0aGVuCisgICAgaGF2ZV9saW51eF9lcG9sbD1ubworZWxzZQorICAgIEFDX01TR19DSEVDS0lORyhbZm9yIExpbnV4IGVwb2xsKDQpXSkKKyAgICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKAorICAgICAgICBbCisgICAgICAgICNpZm5kZWYgX19saW51eF9fCisgICAgICAgICNlcnJvciBUaGlzIGlzIG5vdCBMaW51eAorICAgICAgICAjZW5kaWYKKyAgICAgICAgI2luY2x1ZGUgPHN5cy9lcG9sbC5oPgorICAgICAgICBdLAorICAgICAgICBbZXBvbGxfY3JlYXRlMSAoRVBPTExfQ0xPRVhFQyk7XSldLAorICAgICAgICBbaGF2ZV9saW51eF9lcG9sbD15ZXNdLAorICAgICAgICBbaGF2ZV9saW51eF9lcG9sbD1ub10pCisgICAgQUNfTVNHX1JFU1VMVChbJGhhdmVfbGludXhfZXBvbGxdKQorZmkKK2lmIHRlc3QgeCRlbmFibGVfZXBvbGwsJGhhdmVfbGludXhfZXBvbGwgPSB4eWVzLG5vOyB0aGVuCisgICAgQUNfTVNHX0VSUk9SKFtlcG9sbCBzdXBwb3J0IGV4cGxpY2l0bHkgZW5hYmxlZCBidXQgbm90IGF2YWlsYWJsZV0pCitmaQoraWYgdGVzdCB4JGhhdmVfbGludXhfZXBvbGwgPSB4eWVzOyB0aGVuCisgIEFDX0RFRklORShbREJVU19IQVZFX0xJTlVYX0VQT0xMXSwgMSwgW0RlZmluZSB0byB1c2UgZXBvbGwoNCkgb24gTGludXhdKQorZmkKK0FNX0NPTkRJVElPTkFMKFtIQVZFX0xJTlVYX0VQT0xMXSwgW3Rlc3QgeCRoYXZlX2xpbnV4X2Vwb2xsID0geHllc10pCisKKyMga3F1ZXVlIGNoZWNrcworaWYgdGVzdCB4JGVuYWJsZV9rcXVldWUgPSB4bm8gOyB0aGVuCisgICAgaGF2ZV9rcXVldWU9bm8KK2Vsc2UKKyAgICBoYXZlX2txdWV1ZT15ZXMKKyAgICBBQ19DSEVDS19IRUFERVIoc3lzL2V2ZW50LmgsICwgaGF2ZV9rcXVldWU9bm8pCisgICAgQUNfQ0hFQ0tfRlVOQyhrcXVldWUsICwgaGF2ZV9rcXVldWU9bm8pCisKKyAgICBpZiB0ZXN0IHgkZW5hYmxlX2txdWV1ZSA9IHh5ZXMgLWEgeCRoYXZlX2txdWV1ZSA9IHhubzsgdGhlbgorICAgICAgICBBQ19NU0dfRVJST1Ioa3F1ZXVlIHN1cHBvcnQgZXhwbGljaXRseSBlbmFibGVkIGJ1dCBub3QgYXZhaWxhYmxlKQorICAgIGZpCitmaQorCitkbmwgY2hlY2sgaWYga3F1ZXVlIGJhY2tlbmQgaXMgZW5hYmxlZAoraWYgdGVzdCB4JGhhdmVfa3F1ZXVlID0geHllczsgdGhlbgorICAgQUNfREVGSU5FKERCVVNfQlVTX0VOQUJMRV9LUVVFVUUsMSxbVXNlIGtxdWV1ZV0pCitmaQorCitBTV9DT05ESVRJT05BTChEQlVTX0JVU19FTkFCTEVfS1FVRVVFLCB0ZXN0IHgkaGF2ZV9rcXVldWUgPSB4eWVzKQorCisjIGxhdW5jaGQgY2hlY2tzCitpZiB0ZXN0IHgkZW5hYmxlX2xhdW5jaGQgPSB4bm8gOyB0aGVuCisgICAgaGF2ZV9sYXVuY2hkPW5vCitlbHNlCisgICAgaGF2ZV9sYXVuY2hkPXllcworICAgIEFDX0NIRUNLX0hFQURFUihbbGF1bmNoLmhdLCAsIGhhdmVfbGF1bmNoZD1ubykKKyAgICBBQ19QQVRIX1BST0coW0xBVU5DSENUTF0sIFtsYXVuY2hjdGxdKQorICAgIGlmIHRlc3QgIngkTEFVTkNIQ1RMIiA9ICJ4IjsgdGhlbgorICAgICAgICBoYXZlX2xhdW5jaGQ9bm8KKyAgICBmaQorCisgICAgaWYgdGVzdCB4JGVuYWJsZV9sYXVuY2hkID0geHllcyAmJiB0ZXN0IHgkaGF2ZV9sYXVuY2hkID0geG5vIDsgdGhlbgorICAgICAgICBBQ19NU0dfRVJST1IoW2xhdW5jaGQgc3VwcG9ydCBleHBsaWNpdGx5IGVuYWJsZWQgYnV0IG5vdCBhdmFpbGFibGVdKQorICAgIGZpCitmaQorCitkbmwgY2hlY2sgaWYgbGF1bmNoZCBpcyBlbmFibGVkCitpZiB0ZXN0IHgkaGF2ZV9sYXVuY2hkID0geHllczsgdGhlbgorICAgIEFDX0RFRklORShEQlVTX0VOQUJMRV9MQVVOQ0hELDEsW1VzZSBsYXVuY2hkIGF1dG9sYXVuY2hdKQorZmkKKworQU1fQ09ORElUSU9OQUwoREJVU19FTkFCTEVfTEFVTkNIRCwgdGVzdCB4JGhhdmVfbGF1bmNoZCA9IHh5ZXMpCisKKyMjIyMgRGlyZWN0b3J5IHRvIHBsYWNlIGxhdW5jaGQgYWdlbnQgZmlsZQoraWYgdGVzdCAieCR3aXRoX2xhdW5jaGRfYWdlbnRfZGlyIiA9ICJ4IjsgdGhlbgorICAgTEFVTkNIRF9BR0VOVF9ESVI9Ii9MaWJyYXJ5L0xhdW5jaEFnZW50cyIKK2Vsc2UKKyAgIExBVU5DSERfQUdFTlRfRElSPSIkd2l0aF9sYXVuY2hkX2FnZW50X2RpciIKK2ZpCisKK0FDX1NVQlNUKExBVU5DSERfQUdFTlRfRElSKQorCitkbmwgY29uc29sZSBvd25lciBmaWxlCitpZiB0ZXN0IHgkZW5hYmxlX2NvbnNvbGVfb3duZXJfZmlsZSA9IHhubyA7IHRoZW4KKyAgICBoYXZlX2NvbnNvbGVfb3duZXJfZmlsZT1ubzsKK2Vsc2UKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgc29sYXJpcyopCisgICAgICAgIGhhdmVfY29uc29sZV9vd25lcl9maWxlPXllczsKKyAgICAgICAgQUNfREVGSU5FKEhBVkVfQ09OU09MRV9PV05FUl9GSUxFLDEsW0hhdmUgY29uc29sZSBvd25lciBmaWxlXSkKKyAgICAgICAgOzsKKyAgICAqKQorICAgICAgICBoYXZlX2NvbnNvbGVfb3duZXJfZmlsZT1ubzs7CisgICAgZXNhYworZmkKKworQU1fQ09ORElUSU9OQUwoSEFWRV9DT05TT0xFX09XTkVSX0ZJTEUsIHRlc3QgeCRoYXZlX2NvbnNvbGVfb3duZXJfZmlsZSA9IHh5ZXMpCisKK2RubCBzeXN0ZW1kIGRldGVjdGlvbgoraWYgdGVzdCB4JGVuYWJsZV9zeXN0ZW1kID0geG5vIDsgdGhlbgorICAgIGhhdmVfc3lzdGVtZD1ubzsKK2Vsc2UKKyAgICBQS0dfQ0hFQ0tfTU9EVUxFUyhTWVNURU1ELAorICAgICAgICBbbGlic3lzdGVtZC1sb2dpbiA+PSAzMiwgbGlic3lzdGVtZC1kYWVtb24gPj0gMzJdLAorICAgICAgICBoYXZlX3N5c3RlbWQ9eWVzLAorICAgICAgICBoYXZlX3N5c3RlbWQ9bm8pCitmaQorCitpZiB0ZXN0IHgkaGF2ZV9zeXN0ZW1kID0geHllczsgdGhlbgorICAgIEFDX0RFRklORShIQVZFX1NZU1RFTUQsMSxbSGF2ZSBzeXN0ZW1kXSkKK2ZpCisKK2lmIHRlc3QgeCRlbmFibGVfc3lzdGVtZCA9IHh5ZXMgLWEgeCRoYXZlX3N5c3RlbWQgIT0geHllcyA7IHRoZW4KKyAgICBBQ19NU0dfRVJST1IoW0V4cGxpY2l0bHkgcmVxdWVzdGVkIHN5c3RlbWQgc3VwcG9ydCwgYnV0IHN5c3RlbWQgbm90IGZvdW5kXSkKK2ZpCisKKyMgbGliYXVkaXQgZGV0ZWN0aW9uCitpZiB0ZXN0IHgkZW5hYmxlX2xpYmF1ZGl0ID0geG5vIDsgdGhlbgorICAgIGhhdmVfbGliYXVkaXQ9bm87CitlbHNlCisgICAgIyBTZWUgaWYgd2UgaGF2ZSBhdWRpdCBkYWVtb24gJiBjYXBhYmlsaXRpZXMgbGlicmFyeQorICAgIEFDX0NIRUNLX0xJQihhdWRpdCwgYXVkaXRfbG9nX3VzZXJfYXZjX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgIGhhdmVfbGliYXVkaXQ9eWVzLCBoYXZlX2xpYmF1ZGl0PW5vKQorICAgIGlmIHRlc3QgeCRoYXZlX2xpYmF1ZGl0ID0geHllcyA7IHRoZW4KKyAgICAgICAgQUNfQ0hFQ0tfTElCKGNhcC1uZywgY2FwbmdfY2xlYXIsCisgICAgICAgICAgICAgICAgIGhhdmVfbGliYXVkaXQ9eWVzLCBoYXZlX2xpYmF1ZGl0PW5vKQorICAgIGZpCitmaQorCitBTV9DT05ESVRJT05BTChIQVZFX0xJQkFVRElULCB0ZXN0IHgkaGF2ZV9saWJhdWRpdCA9IHh5ZXMpCisKK2lmIHRlc3QgeCRoYXZlX2xpYmF1ZGl0ID0geHllcyA7IHRoZW4KKyAgICBTRUxJTlVYX0xJQlM9IiRTRUxJTlVYX0xJQlMgLWxhdWRpdCAtbGNhcC1uZyIKKyAgICBBQ19ERUZJTkUoSEFWRV9MSUJBVURJVCwxLFthdWRpdCBkYWVtb24gU0VMaW51eCBzdXBwb3J0XSkKK2ZpCisKK0FDX1NVQlNUKFtTRUxJTlVYX0xJQlNdKQorCisjIENoZWNrIGZvciBBRFQgQVBJIChTb2xhcmlzIEJhc2ljIFNlY3VyaXR5IE1vZGUgYXVkaXRpbmcpCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIEFEVCBBUEkpCitBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisjaW5jbHVkZSA8YnNtL2FkdC5oPgorYWR0X3VzZXJfY29udGV4dCA9IEFEVF9VU0VSOworXV0sIFtbXV0pXSwgWyBjaGVja19hZHRfYXVkaXQ9eWVzIF0sIFsgY2hlY2tfYWR0X2F1ZGl0PW5vIF0pCisKK2lmIHRlc3QgJHtjaGVja19hZHRfYXVkaXR9ID0geWVzCit0aGVuCisgICBBQ19ERUZJTkUoW0hBVkVfQURUXSwgW10sIFtBZHQgYXVkaXQgQVBJXSkKKyAgIEFEVF9MSUJTPSItbGJzbSIKKyAgIExJQlM9Ii1sYnNtICRMSUJTIgorICAgQUNfTVNHX1JFU1VMVCh5ZXMpCitlbHNlCisgICBBQ19NU0dfUkVTVUxUKG5vKQorZmkKK0FDX1NVQlNUKFtBRFRfTElCU10pCisKKyMgQ2hlY2sgZm9yIFNDTV9SSUdIVFMKK0FDX01TR19DSEVDS0lORyhbZm9yIFNDTV9SSUdIVFNdKQorQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdW4uaD4KK3N0YXRpYyBpbnQgeCA9IFNDTV9SSUdIVFM7CitdXSwgW1tdXSldLAorWyBBQ19NU0dfUkVTVUxUKFtzdXBwb3J0ZWRdKQorICBBQ19ERUZJTkUoW0hBVkVfVU5JWF9GRF9QQVNTSU5HXSwgWzFdLCBbU3VwcG9ydHMgc2VuZGluZyBVTklYIGZpbGUgZGVzY3JpcHRvcnNdKSBdLAorWyBBQ19NU0dfUkVTVUxUKFtub3Qgc3VwcG9ydGVkXSkgXSkKKworTkVUV09SS19saWJzPQoraWYgdGVzdCB4JGRidXNfd2luID0geHllcyA7IHRoZW4KKyAgaWYgdGVzdCB4JGRidXNfd2luY2UgPSB4eWVzIDsgdGhlbgorICAgIE5FVFdPUktfbGlicz0iLWx3czIiCisgIGVsc2UKKyAgICBORVRXT1JLX2xpYnM9Ii1sd3MyXzMyIgorICBmaQorZmkKKworQUNfU1VCU1QoW05FVFdPUktfbGlic10pCisKK0FDX0FSR19XSVRIKFt2YWxncmluZF0sCisgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLXZhbGdyaW5kXSwKKyAgICAgW0FkZCBpbnN0cnVtZW50YXRpb24gdG8gaGVscCB2YWxncmluZCB0byB1bmRlcnN0YW5kIG91ciBhbGxvY2F0b3JdKV0sCisgIFtdLAorICBbd2l0aF92YWxncmluZD1ub10pCisKK2lmIHRlc3QgeCR3aXRoX3ZhbGdyaW5kICE9IHhubzsgdGhlbgorICBQS0dfQ0hFQ0tfTU9EVUxFUyhbVkFMR1JJTkRdLCBbdmFsZ3JpbmQgPj0gMy42XSkKKyAgQUNfREVGSU5FKFtXSVRIX1ZBTEdSSU5EXSwgWzFdLCBbRGVmaW5lIHRvIGFkZCBWYWxncmluZCBpbnN0cnVtZW50YXRpb25dKQorZmkKKworIyMjIyBTZXQgdXAgZmluYWwgZmxhZ3MKK0xJQkRCVVNfTElCUz0iJFRIUkVBRF9MSUJTICRORVRXT1JLX2xpYnMiCitBQ19TVUJTVChbTElCREJVU19MSUJTXSkKKworIyMjIFgxMSBkZXRlY3Rpb24KK0RCVVNfWF9MSUJTPQorREJVU19YX0NGTEFHUz0KKworQUNfQVJHX0VOQUJMRShbeDExLWF1dG9sYXVuY2hdLAorICBBU19IRUxQX1NUUklORyhbLS1lbmFibGUteDExLWF1dG9sYXVuY2hdLCBbYnVpbGQgd2l0aCBYMTEgYXV0by1sYXVuY2ggc3VwcG9ydF0pLAorICBbXSwgW2VuYWJsZV94MTFfYXV0b2xhdW5jaD1hdXRvXSkKKworaWYgdGVzdCAieCRkYnVzX3dpbiIgPSB4eWVzOyB0aGVuCisgICAgaWYgdGVzdCAieCRlbmFibGVfeDExX2F1dG9sYXVuY2giID0geHllczsgdGhlbgorICAgICAgICBBQ19NU0dfRVJST1IoW1gxMSBhdXRvLWxhdW5jaCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3NdKQorICAgIGZpCisKKyAgICBlbmFibGVfeDExX2F1dG9sYXVuY2g9bm8KKyAgICBoYXZlX3gxMT1ubworZWxzZQorICAgIEFDX1BBVEhfWFRSQQorCisgICAgaWYgdGVzdCAieCRub194IiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgaGF2ZV94MTE9bm8KKyAgICBlbHNlCisgICAgICAgIGhhdmVfeDExPXllcworICAgICAgICBEQlVTX1hfTElCUz0iJFhfTElCUyAkWF9QUkVfTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTIgorICAgICAgICBEQlVTX1hfQ0ZMQUdTPSIkWF9DRkxBR1MiCisgICAgZmkKK2ZpCisKK2lmIHRlc3QgIngkZW5hYmxlX3gxMV9hdXRvbGF1bmNoLCRoYXZlX3gxMSIgPSB4eWVzLG5vOyB0aGVuCisgICAgQUNfTVNHX0VSUk9SKFtYMTEgYXV0by1sYXVuY2ggcmVxdWlyZXMgWCBoZWFkZXJzL2xpYnJhcmllc10pCitlbHNlCisgICAgIyBtb3ZlIGZyb20gImF1dG8iIHRvICJ5ZXMiIG9yICJubyIgaWYgbmVjZXNzYXJ5CisgICAgaWYgdGVzdCAieCRlbmFibGVfeDExX2F1dG9sYXVuY2giICE9IHhubzsgdGhlbgorICAgICAgICBlbmFibGVfeDExX2F1dG9sYXVuY2g9IiRoYXZlX3gxMSIKKyAgICBmaQorZmkKKworaWYgdGVzdCAieCRoYXZlX3gxMSIgPSB4eWVzIDsgdGhlbgorICAgQUNfREVGSU5FKFtEQlVTX0JVSUxEX1gxMV0sIFsxXSwgW0RlZmluZSB0byBidWlsZCBYMTEgZnVuY3Rpb25hbGl0eV0pCitmaQorCitpZiB0ZXN0ICJ4JGVuYWJsZV94MTFfYXV0b2xhdW5jaCIgPSB4eWVzIDsgdGhlbgorICAgQUNfREVGSU5FKFtEQlVTX0VOQUJMRV9YMTFfQVVUT0xBVU5DSF0sIFsxXSwgW0RlZmluZSB0byBlbmFibGUgWDExIGF1dG8tbGF1bmNoXSkKK2ZpCisKK0FDX1NVQlNUKFtEQlVTX1hfQ0ZMQUdTXSkKK0FDX1NVQlNUKFtEQlVTX1hfTElCU10pCisKKyMjIyMgZ2NjIHdhcm5pbmcgZmxhZ3MKKworY2Nfc3VwcG9ydHNfZmxhZygpIHsKKyAgQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgJENDIHN1cHBvcnRzICIkKiIpCisgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBDRkxBR1M9IiQqIgorICBBQ19UUllfQ09NUElMRShbXSwgW10sIFtyYz15ZXNdLCBbcmM9bm9dKQorICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKyAgQUNfTVNHX1JFU1VMVChbJHJjXSkKKyAgdGVzdCAieCRyYyIgPSB4eWVzCit9CisKK1RQX0NPTVBJTEVSX1dBUk5JTkdTKFtXQVJOSU5HX0NGTEFHU10sCisgIGRubCBVc2UgLVdlcnJvciBieSBkZWZhdWx0IGlmOgorICBkbmwgLSB3ZSdyZSBub3Qgb24gV2luZG93cyAodG9vIG1hbnkgd2FybmluZ3MpLCBhbmQKKyAgZG5sIC0gd2UncmUgaW4gZGV2ZWxvcGVyIG1vZGUgKGEgRC1CdXMgZGV2ZWxvcGVyLCBub3QgYSBkaXN0cm8gb3IgZW5kLXVzZXIpCisgIGRubCBPdmVycmlkZSB3aXRoIC0tZW5hYmxlLVdlcnJvciBvciAtLWRpc2FibGUtV2Vycm9yCisgIFt0ZXN0IHgkZGJ1c193aW4gIT0geHllcyAtYSB4JGRidXNfY3lnd2luICE9IHh5ZXMgLWEgeCRlbmFibGVfZGV2ZWxvcGVyID0geHllc10sCisKKyAgZG5sIEVuYWJsZSB0aGVzZSB3YXJuaW5ncyBpZiBwb3NzaWJsZToKKyAgW2FsbCBcCisgICBleHRyYSBcCisgICBjaGFyLXN1YnNjcmlwdHMgXAorICAgbWlzc2luZy1kZWNsYXJhdGlvbnMgXAorICAgbWlzc2luZy1wcm90b3R5cGVzIFwKKyAgIG5lc3RlZC1leHRlcm5zIFwKKyAgIHBvaW50ZXItYXJpdGggXAorICAgY2FzdC1hbGlnbiBcCisgICBuby1hZGRyZXNzIFwKKyAgIGZsb2F0LWVxdWFsIFwKKyAgIGRlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCBcCisgIF0sCisKKyAgZG5sIERpc2FibGUgdGhlc2Ugd2FybmluZ3MgaWYgcG9zc2libGUsIG1ha2UgdGhlbSBub24tZmF0YWwgaWYgcG9zc2libGUsCisgIGRubCBhbmQgZG9uJ3QgZW5hYmxlIC1XZXJyb3IgdW5sZXNzIHdlIHN1Y2NlZWRlZC4KKyAgZG5sCisgIGRubCBJbnRlbnRpb25hbDoKKyAgZG5sIC0gJERJU0FCTEVfVU5VU0VEX1dBUk5JTkdTIGRpc2FibGVzIHVudXNlZC1sYWJlbCB3YXJuaW5ncyBpZiBub3QKKyAgZG5sICAgY2hlY2tpbmcgb3Igbm90IGFzc2VydGluZworICBkbmwgLSBtaXNzaW5nIGZpZWxkIGluaXRpYWxpemVycyBiZWluZyAwIGlzIGEgQyBmZWF0dXJlLCBub3QgYSBidWcKKyAgZG5sIC0gdW51c2VkLXBhcmFtZXRlciBpcyB0byBtYWtlIHdyaXRpbmcgY2FsbGJhY2tzIGxlc3MgYW5ub3lpbmcKKyAgZG5sCisgIGRubCBUbyBiZSBmaXhlZCBvbmUgZGF5OgorICBkbmwgLSBzaWduLWNvbXBhcmUgYW5kIHBvaW50ZXItc2lnbiBhcmUgd29ya2Fyb3VuZHMgZm9yIGZkLm8gIzE3NDMzCisgIGRubCAtIHR5cGUtbGltaXRzIGlzIHByb2JhYmx5IGEgYnVnIHRvbywgYnV0IGhhdmluZyB0aGUgcmVzdCBvZiAtV2V4dHJhCisgIGRubCAgIGlzIGJldHRlciB0aGFuIG5vdGhpbmcKKyAgWyRESVNBQkxFX1VOVVNFRF9XQVJOSU5HUyBcCisgICBtaXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyBcCisgICB1bnVzZWQtcGFyYW1ldGVyIFwKKyAgIHNpZ24tY29tcGFyZSBcCisgICBwb2ludGVyLXNpZ24gXAorICAgdHlwZS1saW1pdHMgXAorICBdKQorCitpZiB0ZXN0ICJ4JEdDQyIgPSAieHllcyI7IHRoZW4KKyAgIyBXZSdyZSB0cmVhdGluZyAtZm5vLWNvbW1vbiBsaWtlIGEgd2FybmluZzogaXQgbWFrZXMgdGhlIGxpbmtlciBtb3JlCisgICMgc3RyaWN0LCBiZWNhdXNlIG9uIHNvbWUgc3lzdGVtcyB0aGUgbGlua2VyIGlzICphbHdheXMqIHRoaXMgc3RyaWN0CisgIFRQX0FERF9DT01QSUxFUl9GTEFHKFtXQVJOSU5HX0NGTEFHU10sIFstZm5vLWNvbW1vbl0pCisKKyAgIyBodHRwOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTEwNTk5CisgIFRQX0FERF9DT01QSUxFUl9GTEFHKFtXQVJOSU5HX0NGTEFHU10sIFstZm5vLXN0cmljdC1hbGlhc2luZ10pCisKKyAgaWYgdGVzdCAieCRlbmFibGVfYW5zaSIgPSAieHllcyI7IHRoZW4KKyAgICBUUF9BRERfQ09NUElMRVJfRkxBRyhbV0FSTklOR19DRkxBR1NdLAorICAgICAgWy1hbnNpIC1EX1BPU0lYX0NfU09VUkNFPTE5OTMwOUwgLURfQlNEX1NPVVJDRSAtcGVkYW50aWNdKQorICBmaQorZmkKKworZG5sIEluIHByaW5jaXBsZSB3ZSBzaG91bGQgcHV0IFdBUk5JTkdfQ0ZMQUdTIGluIGVhY2ggTWFrZWZpbGUuYW0gbGlrZQorZG5sIHRlbGVwYXRoeS1nbGliIGRvZXMsIHNpbmNlIENGTEFHUyBpcyBtZWFudCB0byBiZSByZXNlcnZlZCBmb3IgdGhlIHVzZXIuLi4KK2RubCBidXQgcHJlcGVuZGluZyB0byBDRkxBR1MgKHNvIHRoZSB1c2VyIGNhbiBvdmVycmlkZSBpdCB3aXRoIGxhdGVyIENGTEFHUykKK2RubCBpcyB0aGUgbmV4dCBiZXN0IHRoaW5nCitDRkxBR1M9IiRXQVJOSU5HX0NGTEFHUyAkQ0ZMQUdTIgorCitjYXNlICRob3N0X29zIGluCisgICAgc29sYXJpcyopCisgICAgICAgICMgU29sYXJpcycgQyBsaWJyYXJ5IGFwcGFyZW50bHkgbmVlZHMgdGhlc2UgcnVuZXMgdG8gYmUgdGhyZWFkc2FmZS4uLgorICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLURfUE9TSVhfUFRIUkVBRF9TRU1BTlRJQ1MgLURfUkVFTlRSQU5UIgorICAgICAgICAjIC4uLiB0aGlzIG9wdC1pbiB0byBnZXQgc29ja2FkZHJfaW42IGFuZCBzb2NrYWRkcl9zdG9yYWdlLi4uCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAtRF9fRVhURU5TSU9OU19fIgorICAgICAgICAjIC4uLiBhbmQgdGhpcyBvcHQtaW4gdG8gZ2V0IGZpbGUgZGVzY3JpcHRvciBwYXNzaW5nIHN1cHBvcnQKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1EX1hPUEVOX1NPVVJDRT01MDAiCisgICAgICAgIDs7Citlc2FjCisKKyMjIyBEb3h5Z2VuIERvY3VtZW50YXRpb24KKworQUNfUEFUSF9QUk9HKERPWFlHRU4sIGRveHlnZW4sIG5vKQorCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgRG94eWdlbiBkb2N1bWVudGF0aW9uXSkKKworaWYgdGVzdCB4JERPWFlHRU4gPSB4bm8gOyB0aGVuCisgICAgaGF2ZV9kb3h5Z2VuPW5vCitlbHNlCisgICAgaGF2ZV9kb3h5Z2VuPXllcworZmkKKworaWYgdGVzdCB4JGVuYWJsZV9kb3h5Z2VuX2RvY3MgPSB4YXV0byA7IHRoZW4KKyAgICBpZiB0ZXN0IHgkaGF2ZV9kb3h5Z2VuID0geG5vIDsgdGhlbgorICAgICAgICBlbmFibGVfZG94eWdlbl9kb2NzPW5vCisgICAgZWxzZQorICAgICAgICBlbmFibGVfZG94eWdlbl9kb2NzPXllcworICAgIGZpCitmaQorCitpZiB0ZXN0IHgkZW5hYmxlX2RveHlnZW5fZG9jcyA9IHh5ZXM7IHRoZW4KKyAgICBpZiB0ZXN0IHgkaGF2ZV9kb3h5Z2VuID0geG5vOyB0aGVuCisJQUNfTVNHX0VSUk9SKFtCdWlsZGluZyBEb3h5Z2VuIGRvY3MgZXhwbGljaXRseSByZXF1aXJlZCwgYnV0IERveHlnZW4gbm90IGZvdW5kXSkKKyAgICBmaQorZmkKKworQU1fQ09ORElUSU9OQUwoREJVU19ET1hZR0VOX0RPQ1NfRU5BQkxFRCwgdGVzdCB4JGVuYWJsZV9kb3h5Z2VuX2RvY3MgPSB4eWVzKQorQUNfTVNHX1JFU1VMVCgkZW5hYmxlX2RveHlnZW5fZG9jcykKKworQUNfQ0hFQ0tfUFJPR1MoW1hTTFRQUk9DXSwgW3hzbHRwcm9jXSkKK0FNX0NPTkRJVElPTkFMKFtEQlVTX0hBVkVfWFNMVFBST0NdLCBbdGVzdCAieCRYU0xUUFJPQyIgIT0gIngiXSkKKworIyMjIFhNTCBEb2N1bWVudGF0aW9uCisKK0FDX1BBVEhfUFJPRyhYTUxUTywgeG1sdG8sIG5vKQorCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgWE1MIGRvY3VtZW50YXRpb25dKQorCitpZiB0ZXN0IHgkWE1MVE8gPSB4bm8gOyB0aGVuCisgICAgaGF2ZV94bWx0bz1ubworZWxzZQorICAgIGhhdmVfeG1sdG89eWVzCitmaQorCitpZiB0ZXN0IHgkZW5hYmxlX3htbF9kb2NzID0geGF1dG8gOyB0aGVuCisgICAgaWYgdGVzdCB4JGhhdmVfeG1sdG8gPSB4bm8gOyB0aGVuCisgICAgICAgIGVuYWJsZV94bWxfZG9jcz1ubworICAgIGVsc2UKKyAgICAgICAgZW5hYmxlX3htbF9kb2NzPXllcworICAgIGZpCitmaQorCitpZiB0ZXN0IHgkZW5hYmxlX3htbF9kb2NzID0geHllczsgdGhlbgorICAgIGlmIHRlc3QgeCRoYXZlX3htbHRvID0geG5vOyB0aGVuCisJQUNfTVNHX0VSUk9SKFtCdWlsZGluZyBYTUwgZG9jcyBleHBsaWNpdGx5IHJlcXVpcmVkLCBidXQgeG1sdG8gbm90IGZvdW5kXSkKKyAgICBmaQorZmkKKworQU1fQ09ORElUSU9OQUwoREJVU19YTUxfRE9DU19FTkFCTEVELCB0ZXN0IHgkZW5hYmxlX3htbF9kb2NzID0geHllcykKK0FDX01TR19SRVNVTFQoJGVuYWJsZV94bWxfZG9jcykKKworQUNfUEFUSF9QUk9HKFtNQU4ySFRNTF0sIFttYW4yaHRtbF0pCitBQ19BUkdfVkFSKFtNQU4ySFRNTF0sIFtQYXRoIHRvIG1hbjJodG1sIChvcHRpb25hbCldKQorQU1fQ09ORElUSU9OQUwoREJVU19IQVZFX01BTjJIVE1MLCB0ZXN0IHgkTUFOMkhUTUwgIT0geCkKKworQU1fQ09ORElUSU9OQUwoREJVU19DQU5fVVBMT0FEX0RPQ1MsCisgICAgdGVzdCB4JGVuYWJsZV9kb3h5Z2VuX2RvY3MgPSB4eWVzIC1hIHgkZW5hYmxlX3htbF9kb2NzID0geHllcyAtYSBcCisgICAgICAgICB4JE1BTjJIVE1MICE9IHgpCisKKyMjIyMgSGF2ZSB0byBnbyAkbG9jYWxzdGF0ZWRpci0+JHByZWZpeC92YXItPi91c3IvbG9jYWwvdmFyCisKKyMjIyMgZmluZCB0aGUgYWN0dWFsIHZhbHVlIGZvciAkcHJlZml4IHRoYXQgd2UnbGwgZW5kIHVwIHdpdGgKKyMjICAgKEkga25vdyB0aGlzIGlzIGJyb2tlbiBhbmQgc2hvdWxkIGJlIGRvbmUgaW4gdGhlIE1ha2VmaWxlLCBidXQKKyMjICAgIHRoYXQncyBhIG1ham9yIHBhaW4gYW5kIGFsbW9zdCBub2JvZHkgYWN0dWFsbHkgc2VlbXMgdG8gY2FyZSkKK0FTX0FDX0VYUEFORChFWFBBTkRFRF9QUkVGSVgsICIkcHJlZml4IikKK0FTX0FDX0VYUEFORChFWFBBTkRFRF9MT0NBTFNUQVRFRElSLCAiJGxvY2Fsc3RhdGVkaXIiKQorQVNfQUNfRVhQQU5EKEVYUEFOREVEX1NZU0NPTkZESVIsICIkc3lzY29uZmRpciIpCitBU19BQ19FWFBBTkQoRVhQQU5ERURfQklORElSLCAiJGJpbmRpciIpCitBU19BQ19FWFBBTkQoRVhQQU5ERURfTElCRElSLCAiJGxpYmRpciIpCitBU19BQ19FWFBBTkQoRVhQQU5ERURfTElCRVhFQ0RJUiwgIiRsaWJleGVjZGlyIikKK0FTX0FDX0VYUEFORChFWFBBTkRFRF9EQVRBRElSLCAiJGRhdGFkaXIiKQorCisjIyMjIENoZWNrIG91ciBvcGVyYXRpbmcgc3lzdGVtCitvcGVyYXRpbmdfc3lzdGVtPXVua25vd24KK2lmIHRlc3QgLWYgL2V0Yy9yZWRoYXQtcmVsZWFzZSB8fCB0ZXN0IC1mICRFWFBBTkRFRF9TWVNDT05GRElSL3JlZGhhdC1yZWxlYXNlIDsgdGhlbgorICAgb3BlcmF0aW5nX3N5c3RlbT1yZWRoYXQKK2ZpCisKK2lmIHRlc3QgLWYgL2V0Yy9zbGFja3dhcmUtdmVyc2lvbiB8fCB0ZXN0IC1mICRFWFBBTkRFRF9TWVNDT05GRElSL3NsYWNrd2FyZS12ZXJzaW9uIDsgdGhlbgorICAgb3BlcmF0aW5nX3N5c3RlbT1zbGFja3dhcmUKK2ZpCisKK2lmIHRlc3QgLWYgL3Vzci9iaW4vY3lnd2luMS5kbGwgfHwgdGVzdCAtZiAkRVhQQU5ERURfQklORElSL2N5Z3dpbjEuZGxsIDsgdGhlbgorICAgb3BlcmF0aW5nX3N5c3RlbT1jeWd3aW4KK2ZpCisKKyMjIyMgU29ydCBvdXQgaW5pdCBzY3JpcHRzCisKK2lmIHRlc3QgeCR3aXRoX2luaXRfc2NyaXB0cyA9IHg7IHRoZW4KKyAgICBjYXNlIHgkb3BlcmF0aW5nX3N5c3RlbSBpbgorICAgICAgICB4cmVkaGF0KQl3aXRoX2luaXRfc2NyaXB0cz1yZWRoYXQgOzsKKyAgICAgICAgeHNsYWNrd2FyZSkJd2l0aF9pbml0X3NjcmlwdHM9c2xhY2t3YXJlIDs7CisgICAgICAgIHhjeWd3aW4pCXdpdGhfaW5pdF9zY3JpcHRzPWN5Z3dpbiA7OworICAgICAgICAqKQkJCXdpdGhfaW5pdF9zY3JpcHRzPW5vbmUgOzsKKyAgICBlc2FjCitmaQorCitBTV9DT05ESVRJT05BTChEQlVTX0lOSVRfU0NSSVBUU19SRURfSEFULCB0ZXN0IHgkd2l0aF9pbml0X3NjcmlwdHMgPSB4cmVkaGF0KQorQU1fQ09ORElUSU9OQUwoREJVU19JTklUX1NDUklQVFNfU0xBQ0tXQVJFLCB0ZXN0IHgkd2l0aF9pbml0X3NjcmlwdHMgPSB4c2xhY2t3YXJlKQorQU1fQ09ORElUSU9OQUwoREJVU19JTklUX1NDUklQVFNfQ1lHV0lOLCB0ZXN0IHgkd2l0aF9pbml0X3NjcmlwdHMgPSB4Y3lnd2luKQorCisjIyMjIyBzeXN0ZW1kIHVuaXQgZmlsZXMKK0FDX0FSR19XSVRIKFtzeXN0ZW1kc3lzdGVtdW5pdGRpcl0sCitBU19IRUxQX1NUUklORyhbLS13aXRoLXN5c3RlbWRzeXN0ZW11bml0ZGlyPURJUl0sIFtEaXJlY3RvcnkgZm9yIHN5c3RlbWQgc2VydmljZSBmaWxlc10pLAorICAgIFtdLAorICAgIFsKKyAgICBQS0dfQ0hFQ0tfRVhJU1RTKFtzeXN0ZW1kXSwKKyAgICAgIFt3aXRoX3N5c3RlbWRzeXN0ZW11bml0ZGlyPSQoJFBLR19DT05GSUcgLS12YXJpYWJsZT1zeXN0ZW1kc3lzdGVtdW5pdGRpciBzeXN0ZW1kKV0sCisgICAgICBbd2l0aF9zeXN0ZW1kc3lzdGVtdW5pdGRpcj1ub10pCisgICAgXSkKK2lmIHRlc3QgIngkd2l0aF9zeXN0ZW1kc3lzdGVtdW5pdGRpciIgIT0geG5vOyB0aGVuCisgICBBQ19TVUJTVChbc3lzdGVtZHN5c3RlbXVuaXRkaXJdLCBbJHdpdGhfc3lzdGVtZHN5c3RlbXVuaXRkaXJdKQorZmkKK0FNX0NPTkRJVElPTkFMKEhBVkVfU1lTVEVNRCwgW3Rlc3QgLW4gIiR3aXRoX3N5c3RlbWRzeXN0ZW11bml0ZGlyIiAtYSAieCR3aXRoX3N5c3RlbWRzeXN0ZW11bml0ZGlyIiAhPSB4bm8gXSkKKworIyMjIyMgU2V0IHVwIGxvY2F0aW9uIGZvciBzeXN0ZW0gYnVzIHNvY2tldAoraWYgISB0ZXN0IC16ICIkd2l0aF9zeXN0ZW1fc29ja2V0IjsgdGhlbgorICAgREJVU19TWVNURU1fU09DS0VUPSR3aXRoX3N5c3RlbV9zb2NrZXQKK2Vsc2UKKyAgIERCVVNfU1lTVEVNX1NPQ0tFVD0ke0VYUEFOREVEX0xPQ0FMU1RBVEVESVJ9L3J1bi9kYnVzL3N5c3RlbV9idXNfc29ja2V0CitmaQorCitBQ19TVUJTVChEQlVTX1NZU1RFTV9TT0NLRVQpCitBQ19ERUZJTkVfVU5RVU9URUQoREJVU19TWVNURU1fU09DS0VULCIkREJVU19TWVNURU1fU09DS0VUIixbVGhlIG5hbWUgb2YgdGhlIHNvY2tldCB0aGUgc3lzdGVtIGJ1cyBsaXN0ZW5zIG9uIGJ5IGRlZmF1bHRdKQorCisjIyBzeXN0ZW0gYnVzIG9ubHkgbGlzdGVucyBvbiBsb2NhbCBkb21haW4gc29ja2V0cywgYW5kIG5ldmVyCisjIyBvbiBhbiBhYnN0cmFjdCBzb2NrZXQgKHNvIG9ubHkgcm9vdCBjYW4gY3JlYXRlIHRoZSBzb2NrZXQpCitEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTPSJ1bml4OnBhdGg9JERCVVNfU1lTVEVNX1NPQ0tFVCIKK0FDX1NVQlNUKERCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1MpCitBQ19ERUZJTkVfVU5RVU9URUQoREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTUywgIiREQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTIixbVGhlIGRlZmF1bHQgRC1CdXMgYWRkcmVzcyBvZiB0aGUgc3lzdGVtIGJ1c10pCisKKyMjIyMgU2V0IHVwIHRoZSBwaWQgZmlsZQoraWYgISB0ZXN0IC16ICIkd2l0aF9zeXN0ZW1fcGlkX2ZpbGUiOyB0aGVuCisgICBEQlVTX1NZU1RFTV9QSURfRklMRT0kd2l0aF9zeXN0ZW1fcGlkX2ZpbGUKK2VsaWYgdGVzdCB4JHdpdGhfaW5pdF9zY3JpcHRzID0geHJlZGhhdCA7IHRoZW4KKyAgIERCVVNfU1lTVEVNX1BJRF9GSUxFPSR7RVhQQU5ERURfTE9DQUxTVEFURURJUn0vcnVuL21lc3NhZ2VidXMucGlkCitlbHNlCisgICBEQlVTX1NZU1RFTV9QSURfRklMRT0ke0VYUEFOREVEX0xPQ0FMU1RBVEVESVJ9L3J1bi9kYnVzL3BpZAorZmkKKworQUNfU1VCU1QoREJVU19TWVNURU1fUElEX0ZJTEUpCisKKyMjIyMgRGlyZWN0b3J5IHRvIGNoZWNrIGZvciBjb25zb2xlIG93bmVyc2hpcAoraWYgISB0ZXN0IC16ICIkd2l0aF9jb25zb2xlX2F1dGhfZGlyIjsgdGhlbgorICAgREJVU19DT05TT0xFX0FVVEhfRElSPSR3aXRoX2NvbnNvbGVfYXV0aF9kaXIKK2Vsc2UKKyAgIERCVVNfQ09OU09MRV9BVVRIX0RJUj0vdmFyL3J1bi9jb25zb2xlLworZmkKKworQUNfU1VCU1QoREJVU19DT05TT0xFX0FVVEhfRElSKQorQUNfREVGSU5FX1VOUVVPVEVEKERCVVNfQ09OU09MRV9BVVRIX0RJUiwgIiREQlVTX0NPTlNPTEVfQVVUSF9ESVIiLCBbRGlyZWN0b3J5IHRvIGNoZWNrIGZvciBjb25zb2xlIG93bmVyaGlwXSkKKworIyMjIyBGaWxlIHRvIGNoZWNrIGZvciBjb25zb2xlIG93bmVyc2hpcAoraWYgdGVzdCB4JGhhdmVfY29uc29sZV9vd25lcl9maWxlID0geHllczsgdGhlbgorICAgaWYgISB0ZXN0IC16ICIkd2l0aF9jb25zb2xlX293bmVyX2ZpbGUiOyB0aGVuCisgICAgICBEQlVTX0NPTlNPTEVfT1dORVJfRklMRT0kd2l0aF9jb25zb2xlX293bmVyX2ZpbGUKKyAgIGVsc2UKKyAgICAgIERCVVNfQ09OU09MRV9PV05FUl9GSUxFPS9kZXYvY29uc29sZQorICAgZmkKK2Vsc2UKKyAgREJVU19DT05TT0xFX09XTkVSX0ZJTEU9CitmaQorCitBQ19TVUJTVChEQlVTX0NPTlNPTEVfT1dORVJfRklMRSkKK0FDX0RFRklORV9VTlFVT1RFRChEQlVTX0NPTlNPTEVfT1dORVJfRklMRSwgIiREQlVTX0NPTlNPTEVfT1dORVJfRklMRSIsIFtGaWxlIHRvIGNoZWNrIGZvciBjb25zb2xlIG93bmVyaGlwXSkKKworIyMjIyBVc2VyIHRvIHN0YXJ0IHRoZSBzeXN0ZW0gYnVzIGFzCitpZiB0ZXN0IC16ICIkd2l0aF9kYnVzX3VzZXIiIDsgdGhlbgorICAgIERCVVNfVVNFUj1tZXNzYWdlYnVzCitlbHNlCisgICAgREJVU19VU0VSPSR3aXRoX2RidXNfdXNlcgorZmkKK0FDX1NVQlNUKERCVVNfVVNFUikKK0FDX0RFRklORV9VTlFVT1RFRChEQlVTX1VTRVIsIiREQlVTX1VTRVIiLCBbVXNlciBmb3IgcnVubmluZyB0aGUgc3lzdGVtIEJVUyBkYWVtb25dKQorCisjIyMjIFByZWZpeCB0byBpbnN0YWxsIGludG8KK0RCVVNfUFJFRklYPSRFWFBBTkRFRF9QUkVGSVgKK0FDX1NVQlNUKERCVVNfUFJFRklYKQorQUNfREVGSU5FX1VOUVVPVEVEKERCVVNfUFJFRklYLCIkREJVU19QUkVGSVgiLCBbUHJlZml4IGZvciBpbnN0YWxsaW5nIERCVVNdKQorCisjIyMjIERpcmVjb3RyeSB0byBpbnN0YWxsIGRhdGEgZmlsZXMgaW50bworREJVU19EQVRBRElSPSRFWFBBTkRFRF9EQVRBRElSCitBQ19TVUJTVChEQlVTX0RBVEFESVIpCitBQ19ERUZJTkVfVU5RVU9URUQoREJVU19EQVRBRElSLCIkREJVU19EQVRBRElSIiwgW0RpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBEQlVTIGRhdGEgZmlsZXNdKQorCisjIyMjIERpcmVjdG9yeSB0byBpbnN0YWxsIGRidXMtZGFlbW9uCitpZiB0ZXN0IC16ICIkd2l0aF9kYnVzX2RhZW1vbmRpciIgOyB0aGVuCisgICAgREJVU19EQUVNT05ESVI9JEVYUEFOREVEX0JJTkRJUgorZWxzZQorICAgIERCVVNfREFFTU9ORElSPSR3aXRoX2RidXNfZGFlbW9uZGlyCitmaQorQUNfU1VCU1QoREJVU19EQUVNT05ESVIpCitBQ19ERUZJTkVfVU5RVU9URUQoREJVU19EQUVNT05ESVIsIiREQlVTX0RBRU1PTkRJUiIsIFtEaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgdGhlIERCVVMgZGFlbW9uXSkKKworIyMjIyBEaXJlY3RvcnkgdG8gaW5zdGFsbCB0aGUgb3RoZXIgYmluYXJpZXMKK0RCVVNfQklORElSPSIkRVhQQU5ERURfQklORElSIgorQUNfU1VCU1QoREJVU19CSU5ESVIpCitBQ19ERUZJTkVfVU5RVU9URUQoREJVU19CSU5ESVIsIiREQlVTX0JJTkRJUiIsIFtEaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgdGhlIGJpbmFyaWVzXSkKKworIyMjIyBEaXJlY3RvcnkgdG8gaW5zdGFsbCB0aGUgbGliZXhlYyBiaW5hcmllcworREJVU19MSUJFWEVDRElSPSIkRVhQQU5ERURfTElCRVhFQ0RJUiIKK0FDX1NVQlNUKERCVVNfTElCRVhFQ0RJUikKK0FDX0RFRklORV9VTlFVT1RFRChEQlVTX0xJQkVYRUNESVIsIiREQlVTX0xJQkVYRUNESVIiLCBbRGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHRoZSBsaWJleGVjIGJpbmFyaWVzXSkKKworIyMjIyBUZWxsIHRlc3RzIHdoZXJlIHRvIGZpbmQgY2VydGFpbiBzdHVmZiBpbiBidWlsZGRpcgorCitEQlVTX1BXRD1gcHdkYAorIyBVc2VmdWwgaW4gYSBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudCwgd2hlcmUgdGhlIHRlc3RzIGFyZSBydW4gb24gdGhlIGhvc3Qgc3lzdGVtLgorQUNfQVJHX1dJVEgoZGJ1cy10ZXN0LWRpciwgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1kYnVzLXRlc3QtZGlyPVtkaXJuYW1lXV0sW3BhdGggd2hlcmUgdGhlIHRlc3RzIHRvb2xzIGFyZSBhdmFpbGFibGVdKSwKKwkJCSAgIERCVVNfUFdEPSR3aXRodmFsKQorCitEQlVTX1RFU1RfRVhFQz0iJERCVVNfUFdEL3Rlc3QiCitEQlVTX1RFU1RfREFUQT0iJERCVVNfUFdEL3Rlc3QvZGF0YSIKKworQUNfU1VCU1QoW0RCVVNfVEVTVF9EQVRBXSkKK0FDX1NVQlNUKFtEQlVTX1RFU1RfRVhFQ10pCisKK0FDX0RFRklORV9VTlFVT1RFRChbREJVU19URVNUX0VYRUNdLCBbIiREQlVTX1RFU1RfRVhFQyJdLAorICAgICAgICAgICAgICAgICAgIFtGdWxsIHBhdGggdG8gdGhlIGRhZW1vbiBpbiB0aGUgYnVpbGRkaXJdKQorQUNfREVGSU5FX1VOUVVPVEVEKFtEQlVTX0VYRUVYVF0sIFsiJEVYRUVYVCJdLAorICAgICAgICAgICAgICAgICAgIFtFeHRlbnNpb24gZm9yIGV4ZWN1dGFibGVzLCB0eXBpY2FsbHkgZW1wdHkgb3IgLmV4ZV0pCisKK0FDX0RFRklORV9VTlFVT1RFRChURVNUX0JVU19CSU5BUlksIFsiJERCVVNfUFdEL2J1cy9kYnVzLWRhZW1vbiRFWEVFWFQiXSwKKyAgICAgICAgICAgICAgICAgICBbRnVsbCBwYXRoIHRvIHRoZSBkYWVtb24gaW4gdGhlIGJ1aWxkZGlyXSkKK0FDX1NVQlNUKFRFU1RfQlVTX0JJTkFSWSkKKworIyMgRXhwb3J0IHRoZSBub24tc2V0dWlkIGV4dGVybmFsIGhlbHBlcgorVEVTVF9MQVVOQ0hfSEVMUEVSX0JJTkFSWT0iJERCVVNfUFdEL2J1cy9kYnVzLWRhZW1vbi1sYXVuY2gtaGVscGVyLXRlc3QkRVhFRVhUIgorQUNfU1VCU1QoVEVTVF9MQVVOQ0hfSEVMUEVSX0JJTkFSWSkKK0FDX0RFRklORV9VTlFVT1RFRChEQlVTX1RFU1RfTEFVTkNIX0hFTFBFUl9CSU5BUlksICIkVEVTVF9MQVVOQ0hfSEVMUEVSX0JJTkFSWSIsCisgICAgICAgICAgICAgICAgICAgW0Z1bGwgcGF0aCB0byB0aGUgbGF1bmNoIGhlbHBlciB0ZXN0IHByb2dyYW0gaW4gdGhlIGJ1aWxkZGlyXSkKKworIyMjIyBGaW5kIHNvY2tldCBkaXJlY3RvcmllcworaWYgISB0ZXN0IC16ICIkVE1QRElSIiA7IHRoZW4KKyAgIERFRkFVTFRfU09DS0VUX0RJUj0kVE1QRElSCitlbGlmICEgdGVzdCAteiAiJFRFTVAiIDsgdGhlbgorICAgREVGQVVMVF9TT0NLRVRfRElSPSRURU1QCitlbGlmICEgdGVzdCAteiAiJFRNUCIgOyB0aGVuCisgICBERUZBVUxUX1NPQ0tFVF9ESVI9JFRNUAorZWxzZQorICAgREVGQVVMVF9TT0NLRVRfRElSPS90bXAKK2ZpCisKK0RFRkFVTFRfU09DS0VUX0RJUj1gZWNobyAkREVGQVVMVF9TT0NLRVRfRElSIHwgc2VkICdzLysvJTJCL2cnYAorCitpZiAhIHRlc3QgLXogIiR3aXRoX3Rlc3Rfc29ja2V0X2RpciIgOyB0aGVuCisgICBURVNUX1NPQ0tFVF9ESVI9IiR3aXRoX3Rlc3Rfc29ja2V0X2RpciIKK2Vsc2UKKyAgIFRFU1RfU09DS0VUX0RJUj0kREVGQVVMVF9TT0NLRVRfRElSCitmaQorQUNfU1VCU1QoVEVTVF9TT0NLRVRfRElSKQorQUNfREVGSU5FX1VOUVVPVEVEKERCVVNfVEVTVF9TT0NLRVRfRElSLCAiJFRFU1RfU09DS0VUX0RJUiIsIFtXaGVyZSB0byBwdXQgdGVzdCBzb2NrZXRzXSkKKworaWYgdGVzdCAieCRkYnVzX3VuaXgiID0geHllczsgdGhlbgorICBURVNUX0xJU1RFTj0idW5peDp0bXBkaXI9JFRFU1RfU09DS0VUX0RJUiIKK2Vsc2UKKyAgVEVTVF9MSVNURU49InRjcDpob3N0PWxvY2FsaG9zdCIKK2ZpCitBQ19TVUJTVChbVEVTVF9MSVNURU5dKQorQUNfREVGSU5FX1VOUVVPVEVEKFtURVNUX0xJU1RFTl0sIFsiJFRFU1RfTElTVEVOIl0sCisgIFtMaXN0ZW5pbmcgYWRkcmVzcyBmb3IgcmVncmVzc2lvbiB0ZXN0c10pCisKK2lmICEgdGVzdCAteiAiJHdpdGhfc2Vzc2lvbl9zb2NrZXRfZGlyIiA7IHRoZW4KKyAgIERCVVNfU0VTU0lPTl9TT0NLRVRfRElSPSIkd2l0aF9zZXNzaW9uX3NvY2tldF9kaXIiCitlbHNlCisgICBEQlVTX1NFU1NJT05fU09DS0VUX0RJUj0kREVGQVVMVF9TT0NLRVRfRElSCitmaQorQUNfREVGSU5FX1VOUVVPVEVEKERCVVNfU0VTU0lPTl9TT0NLRVRfRElSLCAiJERCVVNfU0VTU0lPTl9TT0NLRVRfRElSIiwgW1doZXJlIHBlci1zZXNzaW9uIGJ1cyBwdXRzIGl0cyBzb2NrZXRzXSkKK0FDX1NVQlNUKERCVVNfU0VTU0lPTl9TT0NLRVRfRElSKQorCitpZiB0ZXN0IHgkZGJ1c193aW4gPSB4eWVzOyB0aGVuCisgICAgICAgIERCVVNfU0VTU0lPTl9CVVNfREVGQVVMVF9BRERSRVNTPSIkd2l0aF9kYnVzX3Nlc3Npb25fYnVzX2RlZmF1bHRfYWRkcmVzcyIKK2VsaWYgdGVzdCB4JGhhdmVfbGF1bmNoZCA9IHh5ZXM7IHRoZW4KKyAgICAgICAgREJVU19TRVNTSU9OX0JVU19ERUZBVUxUX0FERFJFU1M9ImxhdW5jaGQ6ZW52PURCVVNfTEFVTkNIRF9TRVNTSU9OX0JVU19TT0NLRVQiCitlbHNlCisgICAgICAgIERCVVNfU0VTU0lPTl9CVVNfREVGQVVMVF9BRERSRVNTPSJ1bml4OnRtcGRpcj0kREJVU19TRVNTSU9OX1NPQ0tFVF9ESVIiCitmaQorQUNfU1VCU1QoREJVU19TRVNTSU9OX0JVU19ERUZBVUxUX0FERFJFU1MpCisKKyMgZGFyd2luIG5lZWRzIHRoaXMgdG8gaW5pdGlhbGl6ZSB0aGUgZW52aXJvbm1lbnQKK0FDX0NIRUNLX0hFQURFUlMoY3J0X2V4dGVybnMuaCkKK0FDX0NIRUNLX0ZVTkMoX05TR2V0RW52aXJvbiwgW0FDX0RFRklORShIQVZFX05TR0VURU5WSVJPTiwgMSwgW0RlZmluZSBpZiB5b3VyIHN5c3RlbSBuZWVkcyBfTlNHZXRFbnZpcm9uIHRvIHNldCB1cCB0aGUgZW52aXJvbm1lbnRdKV0pCitBSF9WRVJCQVRJTShfREFSV0lOX0VOVklST04sCitbCisjaWYgZGVmaW5lZChIQVZFX05TR0VURU5WSVJPTikgJiYgZGVmaW5lZChIQVZFX0NSVF9FWFRFUk5TX0gpCisjIGluY2x1ZGUgPHN5cy90aW1lLmg+CisjIGluY2x1ZGUgPGNydF9leHRlcm5zLmg+CisjIGRlZmluZSBlbnZpcm9uICgqX05TR2V0RW52aXJvbigpKQorI2VuZGlmCitdKQorCitBQ19BUkdfRU5BQkxFKFtzdGF0c10sCisgIFtBU19IRUxQX1NUUklORyhbLS1lbmFibGUtc3RhdHNdLAorICAgIFtlbmFibGUgYnVzIGRhZW1vbiB1c2FnZSBzdGF0aXN0aWNzXSldLAorICBbXSwgW2VuYWJsZV9zdGF0cz1ub10pCitpZiB0ZXN0ICJ4JGVuYWJsZV9zdGF0cyIgPSB4eWVzOyB0aGVuCisgIEFDX0RFRklORShbREJVU19FTkFCTEVfU1RBVFNdLCBbMV0sCisgICAgW0RlZmluZSB0byBlbmFibGUgYnVzIGRhZW1vbiB1c2FnZSBzdGF0aXN0aWNzXSkKK2ZpCisKK0FDX0NPTkZJR19GSUxFUyhbCitEb3h5ZmlsZQorZGJ1cy92ZXJzaW9uaW5mby5yYworZGJ1cy9kYnVzLWFyY2gtZGVwcy5oCitidXMvc3lzdGVtLmNvbmYKK2J1cy9zZXNzaW9uLmNvbmYKK2J1cy9tZXNzYWdlYnVzCitidXMvbWVzc2FnZWJ1cy1jb25maWcKK2J1cy9vcmcuZnJlZWRlc2t0b3AuZGJ1cy1zZXNzaW9uLnBsaXN0CitidXMvcmMubWVzc2FnZWJ1cworYnVzL2RidXMuc2VydmljZQorYnVzL2RidXMuc29ja2V0CitNYWtlZmlsZQorZGJ1cy9NYWtlZmlsZQorYnVzL01ha2VmaWxlCit0b29scy9NYWtlZmlsZQordGVzdC9NYWtlZmlsZQordGVzdC9uYW1lLXRlc3QvTWFrZWZpbGUKK2RvYy9NYWtlZmlsZQorZG9jL2RidXMtZGFlbW9uLjEKK2RidXMtMS5wYworZGJ1cy0xLXVuaW5zdGFsbGVkLnBjCit0ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2RlYnVnLWFsbG93LWFsbC5jb25mCit0ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2RlYnVnLWFsbG93LWFsbC1zaGExLmNvbmYKK3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtL2RlYnVnLWFsbG93LWFsbC1wYXNzLmNvbmYKK3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtL2RlYnVnLWFsbG93LWFsbC1mYWlsLmNvbmYKK3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZS5Qcml2U2VydmVyLnNlcnZpY2UKK3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlLnNlcnZpY2UKK3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUZvcmtpbmdFY2hvU2VydmljZS5zZXJ2aWNlCit0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTZWdmYXVsdFNlcnZpY2Uuc2VydmljZQordGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZVN1Y2Nlc3Muc2VydmljZQordGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZUZhaWwuc2VydmljZQordGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlLnNlcnZpY2UKK3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTZWdmYXVsdFNlcnZpY2Uuc2VydmljZQordGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VTdWNjZXNzLnNlcnZpY2UKK3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlRmFpbC5zZXJ2aWNlCit0ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb0V4ZWMuc2VydmljZQordGVzdC9kYXRhL2ludmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlTm9Vc2VyLnNlcnZpY2UKK3Rlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vU2VydmljZS5zZXJ2aWNlCitdKQorQUNfT1VUUFVUCisKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZWNobyAiCisgICAgICAgICAgICAgICAgICAgIEQtQnVzICRWRVJTSU9OCisgICAgICAgICAgICAgICAgICA9PT09PT09PT09PT09PQorCisJcHJlZml4OiAgICAgICAgICAgICAgICAgICAke0VYUEFOREVEX1BSRUZJWH0KKwlleGVjX3ByZWZpeDogICAgICAgICAgICAgICR7ZXhlY19wcmVmaXh9CisgICAgICAgIGxpYmRpcjogICAgICAgICAgICAgICAgICAgJHtFWFBBTkRFRF9MSUJESVJ9CisgICAgICAgIGxpYmV4ZWNkaXI6ICAgICAgICAgICAgICAgJHtFWFBBTkRFRF9MSUJFWEVDRElSfQorICAgICAgICBiaW5kaXI6ICAgICAgICAgICAgICAgICAgICR7RVhQQU5ERURfQklORElSfQorICAgICAgICBzeXNjb25mZGlyOiAgICAgICAgICAgICAgICR7RVhQQU5ERURfU1lTQ09ORkRJUn0KKyAgICAgICAgbG9jYWxzdGF0ZWRpcjogICAgICAgICAgICAke0VYUEFOREVEX0xPQ0FMU1RBVEVESVJ9CisJZGF0YWRpcjogICAgICAgICAgICAgICAgICAke0VYUEFOREVEX0RBVEFESVJ9CisJc291cmNlIGNvZGUgbG9jYXRpb246CSAgJHtzcmNkaXJ9CisJY29tcGlsZXI6CQkgICR7Q0N9CisJY2ZsYWdzOgkJICAgICAgICAgICR7Q0ZMQUdTfQorCWNwcGZsYWdzOgkJICAke0NQUEZMQUdTfQorCWN4eGZsYWdzOgkJICAke0NYWEZMQUdTfQorCTY0LWJpdCBpbnQ6CQkgICR7REJVU19JTlQ2NF9UWVBFfQorCTMyLWJpdCBpbnQ6CQkgICR7REJVU19JTlQzMl9UWVBFfQorCTE2LWJpdCBpbnQ6CQkgICR7REJVU19JTlQxNl9UWVBFfQorICAgICAgICBEb3h5Z2VuOiAgICAgICAgICAgICAgICAgICR7RE9YWUdFTjotbm90IGZvdW5kfQorICAgICAgICB4bWx0bzogICAgICAgICAgICAgICAgICAgICR7WE1MVE86LW5vdCBmb3VuZH0KKyAgICAgICAgbWFuMmh0bWw6ICAgICAgICAgICAgICAgICAke01BTjJIVE1MOi1ub3QgZm91bmR9IgorCitlY2hvICIKKyAgICAgICAgUmVidWlsZGluZyBnZW5lcmF0ZWQgZmlsZXM6ICR7VVNFX01BSU5UQUlORVJfTU9ERX0KKyAgICAgICAgZ2NjIGNvdmVyYWdlIHByb2ZpbGluZzogICAke2VuYWJsZV9jb21waWxlcl9jb3ZlcmFnZX0KKyAgICAgICAgQnVpbGRpbmcgZW1iZWRkZWQgdGVzdHM6ICAke2VuYWJsZV9lbWJlZGRlZF90ZXN0c30KKyAgICAgICAgQnVpbGRpbmcgbW9kdWxhciB0ZXN0czogICAke2VuYWJsZV9tb2R1bGFyX3Rlc3RzfQorICAgICAgICAgICAgLSB3aXRoIEdMaWI6ICAgICAgICAgICR7d2l0aF9nbGlifQorICAgICAgICBCdWlsZGluZyB2ZXJib3NlIG1vZGU6ICAgICR7ZW5hYmxlX3ZlcmJvc2VfbW9kZX0KKyAgICAgICAgQnVpbGRpbmcgYXNzZXJ0aW9uczogICAgICAke2VuYWJsZV9hc3NlcnRzfQorICAgICAgICBCdWlsZGluZyBjaGVja3M6ICAgICAgICAgICR7ZW5hYmxlX2NoZWNrc30KKyAgICAgICAgQnVpbGRpbmcgYnVzIHN0YXRzIEFQSTogICAke2VuYWJsZV9zdGF0c30KKyAgICAgICAgQnVpbGRpbmcgU0VMaW51eCBzdXBwb3J0OiAke2hhdmVfc2VsaW51eH0KKyAgICAgICAgQnVpbGRpbmcgaW5vdGlmeSBzdXBwb3J0OiAke2hhdmVfaW5vdGlmeX0KKyAgICAgICAgQnVpbGRpbmcgZG5vdGlmeSBzdXBwb3J0OiAke2hhdmVfZG5vdGlmeX0KKyAgICAgICAgQnVpbGRpbmcga3F1ZXVlIHN1cHBvcnQ6ICAke2hhdmVfa3F1ZXVlfQorICAgICAgICBCdWlsZGluZyBzeXN0ZW1kIHN1cHBvcnQ6ICR7aGF2ZV9zeXN0ZW1kfQorICAgICAgICBCdWlsZGluZyBYMTEgY29kZTogICAgICAgICR7ZW5hYmxlX3gxMX0KKyAgICAgICAgQnVpbGRpbmcgRG94eWdlbiBkb2NzOiAgICAke2VuYWJsZV9kb3h5Z2VuX2RvY3N9CisgICAgICAgIEJ1aWxkaW5nIFhNTCBkb2NzOiAgICAgICAgJHtlbmFibGVfeG1sX2RvY3N9CisgICAgICAgIEJ1aWxkaW5nIGNhY2hlIHN1cHBvcnQ6ICAgJHtlbmFibGVfdXNlcmRiX2NhY2hlfQorICAgICAgICBCdWlsZGluZyBsYXVuY2hkIHN1cHBvcnQ6ICR7aGF2ZV9sYXVuY2hkfQorICAgICAgICBVc2luZyBYTUwgcGFyc2VyOiAgICAgICAgICR7d2l0aF94bWx9CisgICAgICAgIEluaXQgc2NyaXB0cyBzdHlsZTogICAgICAgJHt3aXRoX2luaXRfc2NyaXB0c30KKyAgICAgICAgQWJzdHJhY3Qgc29ja2V0IG5hbWVzOiAgICAke2FjX2N2X2hhdmVfYWJzdHJhY3Rfc29ja2V0c30KKyAgICAgICAgU3lzdGVtIGJ1cyBzb2NrZXQ6ICAgICAgICAke0RCVVNfU1lTVEVNX1NPQ0tFVH0KKyAgICAgICAgU3lzdGVtIGJ1cyBhZGRyZXNzOiAgICAgICAke0RCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1N9CisgICAgICAgIFN5c3RlbSBidXMgUElEIGZpbGU6ICAgICAgJHtEQlVTX1NZU1RFTV9QSURfRklMRX0KKyAgICAgICAgU2Vzc2lvbiBidXMgYWRkcmVzczogICAgICAke0RCVVNfU0VTU0lPTl9CVVNfREVGQVVMVF9BRERSRVNTfQorICAgICAgICBDb25zb2xlIGF1dGggZGlyOiAgICAgICAgICR7REJVU19DT05TT0xFX0FVVEhfRElSfQorICAgICAgICBDb25zb2xlIG93bmVyIGZpbGU6ICAgICAgICR7aGF2ZV9jb25zb2xlX293bmVyX2ZpbGV9CisgICAgICAgIENvbnNvbGUgb3duZXIgZmlsZSBwYXRoOiAgJHtEQlVTX0NPTlNPTEVfT1dORVJfRklMRX0KKwlTeXN0ZW0gYnVzIHVzZXI6ICAgICAgICAgICR7REJVU19VU0VSfQorCVNlc3Npb24gYnVzIHNlcnZpY2VzIGRpcjogJHtFWFBBTkRFRF9EQVRBRElSfS9kYnVzLTEvc2VydmljZXMKKyAgICAgICAgJ21ha2UgY2hlY2snIHNvY2tldCBkaXI6ICAke1RFU1RfU09DS0VUX0RJUn0KKyIKK2lmIHRlc3QgeCRoYXZlX2xhdW5jaGQgPSB4eWVzOyB0aGVuCisgICAgICAgIGVjaG8gIiAgICAgICAgbGF1bmNoZCBhZ2VudCBkaXI6ICAgICAgICAke0xBVU5DSERfQUdFTlRfRElSfSIKK2ZpCitlY2hvCisKK2lmIHRlc3QgeCRlbmFibGVfZW1iZWRkZWRfdGVzdHMgPSB4eWVzOyB0aGVuCisgICAgICAgIGVjaG8gIk5PVEU6IGJ1aWxkaW5nIHdpdGggdW5pdCB0ZXN0cyBpbmNyZWFzZXMgdGhlIHNpemUgb2YgdGhlIGluc3RhbGxlZCBsaWJyYXJ5IGFuZCByZW5kZXJzIGl0IGluc2VjdXJlLiIKK2ZpCitpZiB0ZXN0IHgkZW5hYmxlX2VtYmVkZGVkX3Rlc3RzID0geHllcyAtYSB4JGVuYWJsZV9hc3NlcnRzID0geG5vOyB0aGVuCisgICAgICAgIGVjaG8gIk5PVEU6IGJ1aWxkaW5nIHdpdGggZW1iZWRkZWQgdGVzdHMgYnV0IHdpdGhvdXQgYXNzZXJ0aW9ucyBtZWFucyB0ZXN0cyBtYXkgbm90IHByb3Blcmx5IHJlcG9ydCBmYWlsdXJlcyAodGhpcyBjb25maWd1cmF0aW9uIGlzIG9ubHkgdXNlZnVsIHdoZW4gZG9pbmcgc29tZXRoaW5nIGxpa2UgcHJvZmlsaW5nIHRoZSB0ZXN0cykiCitmaQoraWYgdGVzdCB4JGVuYWJsZV9jb21waWxlcl9jb3ZlcmFnZSA9IHh5ZXM7IHRoZW4KKyAgICAgICAgZWNobyAiTk9URTogYnVpbGRpbmcgd2l0aCBjb3ZlcmFnZSBwcm9maWxpbmcgaXMgZGVmaW5pdGVseSBmb3IgZGV2ZWxvcGVycyBvbmx5LiIKK2ZpCitpZiB0ZXN0IHgkZW5hYmxlX3ZlcmJvc2VfbW9kZSA9IHh5ZXM7IHRoZW4KKyAgICAgICAgZWNobyAiTk9URTogYnVpbGRpbmcgd2l0aCB2ZXJib3NlIG1vZGUgaW5jcmVhc2VzIGxpYnJhcnkgc2l6ZSwgbWF5IHNsaWdodGx5IGluY3JlYXNlIHNlY3VyaXR5IHJpc2ssIGFuZCBkZWNyZWFzZXMgcGVyZm9ybWFuY2UuIgorZmkKK2lmIHRlc3QgeCRlbmFibGVfYXNzZXJ0cyA9IHh5ZXM7IHRoZW4KKyAgICAgICAgZWNobyAiTk9URTogYnVpbGRpbmcgd2l0aCBhc3NlcnRpb25zIGluY3JlYXNlcyBsaWJyYXJ5IHNpemUgYW5kIGRlY3JlYXNlcyBwZXJmb3JtYW5jZS4iCitmaQoraWYgdGVzdCB4JGVuYWJsZV9jaGVja3MgPSB4bm87IHRoZW4KKyAgICAgICAgZWNobyAiTk9URTogYnVpbGRpbmcgd2l0aG91dCBjaGVja3MgZm9yIGFyZ3VtZW50cyBwYXNzZWQgdG8gcHVibGljIEFQSSBtYWtlcyBpdCBoYXJkZXIgdG8gZGVidWcgYXBwcyB1c2luZyBELUJ1cywgYnV0IHdpbGwgc2xpZ2h0bHkgZGVjcmVhc2UgRC1CdXMgbGlicmFyeSBzaXplIGFuZCBfdmVyeV8gc2xpZ2h0bHkgaW1wcm92ZSBwZXJmb3JtYW5jZS4iCitmaQoraWYgdGVzdCB4JGRidXNfdXNlX2xpYnhtbCA9IHh0cnVlOyB0aGVuCisgICAgICAgIGVjaG8KKwllY2hvICJXQVJOSU5HOiBZb3UgaGF2ZSBjaG9zZW4gdG8gdXNlIGxpYnhtbCBhcyB5b3VyIHhtbCBwYXJzZXIgaG93ZXZlciB0aGlzIGNvZGUgcGF0aCBpcyBub3QgbWFpbnRhaW5lZCBieSB0aGUgRC1CdXMgZGV2ZWxvcGVycyBhbmQgaWYgaXQgYnJlYWtzIHlvdSBnZXQgdG8ga2VlcCB0aGUgcGllY2VzLiAgSWYgeW91IGhhdmUgc2VsZWN0ZWQgdGhpcyBvcHRpb24gaW4gZXJyIHBsZWFzZSByZWNvbmZpZ3VyZSB3aXRoIGV4cGF0IChlLmcuIC0td2l0aC14bWw9ZXhwYXQpLiIKK2ZpCisKK2lmIHRlc3QgIngkREJVU19IQVZFX0lOVDY0IiA9IHgwOyB0aGVuCisgIEFDX01TR19XQVJOKFtZb3UgaGF2ZSBkaXNhYmxlZCA2NC1iaXQgaW50ZWdlcnMgdmlhIC0td2l0aG91dC02NC1iaXQuCisKKyAgVGhpcyByZW1vdmVzIHBhcnRzIG9mIHRoZSBzdGFuZGFyZCBELUJ1cyBBUEkgYW5kIEFCSSAodGhlICd0JyBhbmQgJ3gnCisgIHR5cGVjb2RlcywgdGhlIGRidXNfaW50NjRfdCBhbmQgZGJ1c191aW50NjRfdCB0eXBlcywgZXRjLikgYW5kIHNob3VsZCBvbmx5IGJlCisgIHVzZWQgaWYgeW91ciBjb21waWxlciBsYWNrcyBzdXBwb3J0IGZvciA2NC1iaXQgaW50ZWdlcnMuIFBsZWFzZSByZXBvcnQgYSBidWcKKyAgd2l0aCBkZXRhaWxzIG9mIHlvdXIgcGxhdGZvcm0gYW5kIGNvbXBpbGVyLgorCisgIFRoaXMgb3B0aW9uIGlzIGxpa2VseSB0byBiZSByZW1vdmVkIGluIGZ1dHVyZSwgdW5sZXNzIHRoZSBELUJ1cyBkZXZlbG9wZXJzCisgIHJlY2VpdmUgcmVwb3J0cyB0aGF0IGl0IGlzIHN0aWxsIG5lZWRlZC4KKyAgXSkKK2ZpCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtMS11bmluc3RhbGxlZC5wYy5pbiBiL2RidXMvZGJ1cy0xLXVuaW5zdGFsbGVkLnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOGM4M2UKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtMS11bmluc3RhbGxlZC5wYy5pbgpAQCAtMCwwICsxLDE3IEBACithYnNfdG9wX2J1aWxkZGlyPUBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXI9QGFic190b3Bfc3JjZGlyQAorcHJlZml4PQorZXhlY19wcmVmaXg9CitzeXN0ZW1fYnVzX2RlZmF1bHRfYWRkcmVzcz1AREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTU0AKK3N5c2NvbmZkaXI9QEVYUEFOREVEX1NZU0NPTkZESVJACitzZXNzaW9uX2J1c19zZXJ2aWNlc19kaXI9QEVYUEFOREVEX0RBVEFESVJAL2RidXMtMS9zZXJ2aWNlcworc3lzdGVtX2J1c19zZXJ2aWNlc19kaXI9QEVYUEFOREVEX0RBVEFESVJAL2RidXMtMS9zeXN0ZW0tc2VydmljZXMKK2ludGVyZmFjZXNfZGlyPUBFWFBBTkRFRF9EQVRBRElSQC9kYnVzLTEvaW50ZXJmYWNlcworZGFlbW9uZGlyPUBEQlVTX0RBRU1PTkRJUkAKKworTmFtZTogZGJ1cworRGVzY3JpcHRpb246IEZyZWUgZGVza3RvcCBtZXNzYWdlIGJ1cyAodW5pbnN0YWxsZWQgY29weSkKK1ZlcnNpb246IEBWRVJTSU9OQAorTGliczogJHthYnNfdG9wX2J1aWxkZGlyfS9kYnVzL2xpYmRidXMtMS5sYQorTGlicy5wcml2YXRlOiBATElCREJVU19MSUJTQAorQ2ZsYWdzOiAtSSR7YWJzX3RvcF9zcmNkaXJ9IEBEQlVTX1NUQVRJQ19CVUlMRF9DUFBGTEFHU0AKZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy0xLnBjLmluIGIvZGJ1cy9kYnVzLTEucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVmOGJjZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy0xLnBjLmluCkBAIC0wLDAgKzEsMTcgQEAKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorbGliZGlyPUBsaWJkaXJACitpbmNsdWRlZGlyPUBpbmNsdWRlZGlyQAorc3lzdGVtX2J1c19kZWZhdWx0X2FkZHJlc3M9QERCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1NACitzeXNjb25mZGlyPUBFWFBBTkRFRF9TWVNDT05GRElSQAorc2Vzc2lvbl9idXNfc2VydmljZXNfZGlyPUBFWFBBTkRFRF9EQVRBRElSQC9kYnVzLTEvc2VydmljZXMKK3N5c3RlbV9idXNfc2VydmljZXNfZGlyPUBFWFBBTkRFRF9EQVRBRElSQC9kYnVzLTEvc3lzdGVtLXNlcnZpY2VzCitpbnRlcmZhY2VzX2Rpcj1ARVhQQU5ERURfREFUQURJUkAvZGJ1cy0xL2ludGVyZmFjZXMKK2RhZW1vbmRpcj1AREJVU19EQUVNT05ESVJACisKK05hbWU6IGRidXMKK0Rlc2NyaXB0aW9uOiBGcmVlIGRlc2t0b3AgbWVzc2FnZSBidXMKK1ZlcnNpb246IEBWRVJTSU9OQAorTGliczogLUwke2xpYmRpcn0gLWxkYnVzLTEKK0xpYnMucHJpdmF0ZTogQExJQkRCVVNfTElCU0AKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9L2RidXMtMS4wIC1JJHtsaWJkaXJ9L2RidXMtMS4wL2luY2x1ZGUgQERCVVNfU1RBVElDX0JVSUxEX0NQUEZMQUdTQApkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL0FuZHJvaWQuYnAgYi9kYnVzL2RidXMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDEyMzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw4NiBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJkYnVzIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImRidXMtYWRkcmVzcy5jIiwKKyAgICAgICAgImRidXMtYXV0aC5jIiwKKyAgICAgICAgImRidXMtYnVzLmMiLAorICAgICAgICAiZGJ1cy1jb25uZWN0aW9uLmMiLAorICAgICAgICAiZGJ1cy1jcmVkZW50aWFscy5jIiwKKyAgICAgICAgImRidXMtZGF0YXNsb3QuYyIsCisgICAgICAgICJkYnVzLWVycm9ycy5jIiwKKyAgICAgICAgImRidXMtZmlsZS5jIiwKKyAgICAgICAgImRidXMtZmlsZS11bml4LmMiLAorICAgICAgICAiZGJ1cy1oYXNoLmMiLAorICAgICAgICAiZGJ1cy1pbnRlcm5hbHMuYyIsCisgICAgICAgICJkYnVzLWtleXJpbmcuYyIsCisgICAgICAgICJkYnVzLWxpc3QuYyIsCisgICAgICAgICJkYnVzLW1haW5sb29wLmMiLAorICAgICAgICAiZGJ1cy1tYXJzaGFsLWJhc2ljLmMiLAorICAgICAgICAiZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmMiLAorICAgICAgICAiZGJ1cy1tYXJzaGFsLWhlYWRlci5jIiwKKyAgICAgICAgImRidXMtbWFyc2hhbC1yZWN1cnNpdmUuYyIsCisgICAgICAgICJkYnVzLW1hcnNoYWwtdmFsaWRhdGUuYyIsCisgICAgICAgICJkYnVzLW1lbXBvb2wuYyIsCisgICAgICAgICJkYnVzLW1lbW9yeS5jIiwKKyAgICAgICAgImRidXMtbWVzc2FnZS5jIiwKKyAgICAgICAgImRidXMtbWlzYy5jIiwKKyAgICAgICAgImRidXMtbm9uY2UuYyIsCisgICAgICAgICJkYnVzLXBlbmRpbmctY2FsbC5jIiwKKyAgICAgICAgImRidXMtcGlwZS5jIiwKKyAgICAgICAgImRidXMtcGlwZS11bml4LmMiLAorICAgICAgICAiZGJ1cy1yZXNvdXJjZXMuYyIsCisgICAgICAgICJkYnVzLXNlcnZlci5jIiwKKyAgICAgICAgImRidXMtc2VydmVyLXNvY2tldC5jIiwKKyAgICAgICAgImRidXMtc2VydmVyLXVuaXguYyIsCisgICAgICAgICJkYnVzLXNoYS5jIiwKKyAgICAgICAgImRidXMtc2hlbGwuYyIsCisgICAgICAgICJkYnVzLXNpZ25hdHVyZS5jIiwKKyAgICAgICAgImRidXMtc29ja2V0LXNldC5jIiwKKyAgICAgICAgImRidXMtc29ja2V0LXNldC1wb2xsLmMiLAorICAgICAgICAiZGJ1cy1zcGF3bi5jIiwKKyAgICAgICAgImRidXMtc3RyaW5nLmMiLAorICAgICAgICAiZGJ1cy1zdHJpbmctdXRpbC5jIiwKKyAgICAgICAgImRidXMtc3lzZGVwcy5jIiwKKyAgICAgICAgImRidXMtc3lzZGVwcy1wdGhyZWFkLmMiLAorICAgICAgICAiZGJ1cy1zeXNkZXBzLXVuaXguYyIsCisgICAgICAgICJkYnVzLXN5c2RlcHMtdXRpbC5jIiwKKyAgICAgICAgImRidXMtc3lzZGVwcy11dGlsLXVuaXguYyIsCisgICAgICAgICJkYnVzLXRpbWVvdXQuYyIsCisgICAgICAgICJkYnVzLXRocmVhZHMuYyIsCisgICAgICAgICJkYnVzLXRyYW5zcG9ydC5jIiwKKyAgICAgICAgImRidXMtdHJhbnNwb3J0LXNvY2tldC5jIiwKKyAgICAgICAgImRidXMtdHJhbnNwb3J0LXVuaXguYyIsCisgICAgICAgICJkYnVzLW9iamVjdC10cmVlLmMiLAorICAgICAgICAiZGJ1cy11c2VyZGIuYyIsCisgICAgICAgICJkYnVzLXVzZXJkYi11dGlsLmMiLAorICAgICAgICAiZGJ1cy13YXRjaC5jIiwKKyAgICAgICAgInNkLWRhZW1vbi5jIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRERCVVNfQU5EUk9JRF9MT0ciLAorICAgICAgICAiLUREQlVTX0NPTVBJTEFUSU9OIiwKKyAgICAgICAgIi1EQU5EUk9JRF9NQU5BR0VEX1NPQ0tFVCIsCisgICAgICAgICItREhBVkVfTU9OT1RPTklDX0NMT0NLIiwKKyAgICAgICAgIi1EREJVU19NQUNISU5FX1VVSURfRklMRT1cXFwiL2V0Yy9tYWNoaW5lLWlkXFxcIiIsCisgICAgICAgICItRERCVVNfU1lTVEVNX0NPTkZJR19GSUxFPVxcXCIvc3lzdGVtL2V0Yy9kYnVzLmNvbmZcXFwiIiwKKyAgICAgICAgIi1EREJVU19TRVNTSU9OX0NPTkZJR19GSUxFPVxcXCIvc3lzdGVtL2V0Yy9zZXNzaW9uLmNvbmZcXFwiIiwKKyAgICAgICAgIi1Xbm8tZW1wdHktYm9keSIsCisgICAgICAgICItV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIiwKKyAgICAgICAgIi1Xbm8tcG9pbnRlci1zaWduIiwKKyAgICAgICAgIi1Xbm8tc2lnbi1jb21wYXJlIiwKKyAgICAgICAgIi1Xbm8tdGF1dG9sb2dpY2FsLWNvbXBhcmUiLAorICAgICAgICAiLVduby10eXBlLWxpbWl0cyIsCisgICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAorICAgIF0sCisgICAgY2xhbmc6IHRydWUsCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJkYnVzLWhlYWRlcnMiXSwKKyAgICBleHBvcnRfc3RhdGljX2xpYl9oZWFkZXJzOiBbImxpYmRidXMtaGVhZGVycyJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9kYnVzL2RidXMvTWFrZWZpbGUuYW0gYi9kYnVzL2RidXMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI1Y2NjYQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDMxMiBAQAorCitjb25maWdkaXI9JChzeXNjb25mZGlyKS9kYnVzLTEKKworQU1fQ1BQRkxBR1MgPSBcCisJLUkkKHRvcF9idWlsZGRpcikgXAorCS1JJCh0b3Bfc3JjZGlyKSBcCisJJChTWVNURU1EX0NGTEFHUykgXAorCSQoVkFMR1JJTkRfQ0ZMQUdTKSBcCisJLUREQlVTX0NPTVBJTEFUSU9OIFwKKwktRERCVVNfTUFDSElORV9VVUlEX0ZJTEU9XCIiJChsb2NhbHN0YXRlZGlyKS9saWIvZGJ1cy9tYWNoaW5lLWlkIlwiIFwKKwktRERCVVNfU1lTVEVNX0NPTkZJR19GSUxFPVwiIiQoY29uZmlnZGlyKS9zeXN0ZW0uY29uZiJcIiBcCisJLUREQlVTX1NFU1NJT05fQ09ORklHX0ZJTEU9XCIiJChjb25maWdkaXIpL3Nlc3Npb24uY29uZiJcIiBcCisJJChOVUxMKQorCisjIGlmIGFzc2VydGlvbnMgYXJlIGVuYWJsZWQsIGltcHJvdmUgYmFja3RyYWNlcworQU1fTERGTEFHUyA9IEBSX0RZTkFNSUNfTERGTEFHQAorCitkYnVzaW5jbHVkZWRpcj0kKGluY2x1ZGVkaXIpL2RidXMtMS4wL2RidXMKK2RidXNhcmNoaW5jbHVkZWRpcj0kKGxpYmRpcikvZGJ1cy0xLjAvaW5jbHVkZS9kYnVzCisKK2xpYl9MVExJQlJBUklFUz1saWJkYnVzLTEubGEKKworIworIyBEZWFsIHdpdGggVzMyIC5kZWYgYW5kIHZlcnNpb24taW5mby5yYyBzdHVmZgorIworaWYgREJVU19XSU4KKworU1VGRklYRVMgPSByYworCisucmMubzoKKwkkKFdJTkRSRVMpICQ8IC1vICRACisKK2RidXNfcmVzID0gdmVyc2lvbmluZm8ubworZGJ1c19yZXNfbGRmbGFnID0gLVdsLCQoZGJ1c19yZXMpCitub191bmRlZmluZWQgPSAtbm8tdW5kZWZpbmVkCitleHBvcnRfc3ltYm9scyA9CisKK2xpYmRidXNfMV9sYV9ERVBFTkRFTkNJRVMgPSAkKGRidXNfcmVzKQoraW50bGxpYnMgPQorCitlbHNlCitkYnVzX3JlcyA9CitkYnVzX3Jlc19sZGZsYWcgPQorbm9fdW5kZWZpbmVkID0KKyMjIGRvbid0IGV4cG9ydCBzeW1ib2xzIHRoYXQgc3RhcnQgd2l0aCAiXyIgKHdlIHVzZSB0aGlzCisjIyBjb252ZW50aW9uIGZvciBpbnRlcm5hbCBzeW1ib2xzKQorZXhwb3J0X3N5bWJvbHMgPSAtZXhwb3J0LXN5bWJvbHMtcmVnZXggIl5bXl9dLioiCisKK2ludGxsaWJzID0gQExUTElCSU5UTEAKKworZW5kaWYKKworCisjCisjIFBsYXRmb3JtLWRlcGVuZGVudCBzb3VyY2VzOgorIworaWYgREJVU19XSU4KK0RCVVNfTElCX2FyY2hfc291cmNlcyA9IAkJCVwKKwlkYnVzLXNlcnZlci13aW4uYyAJCQlcCisJZGJ1cy1zZXJ2ZXItd2luLmgKKworaWYgREJVU19XSU5DRQord2luY2Vfc291cmNlID0gZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUuaCBkYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5jCitlbHNlCit3aW5jZV9zb3VyY2UgPQorZW5kaWYKKworREJVU19TSEFSRURfYXJjaF9zb3VyY2VzID0gCQkJXAorCSQod2luY2Vfc291cmNlKQkJCQlcCisJZGJ1cy1maWxlLXdpbi5jIAkJCVwKKwlkYnVzLXBpcGUtd2luLmMgCQkJXAorCWRidXMtc29ja2V0cy13aW4uaAkJCVwKKwlkYnVzLXN5c2RlcHMtd2luLmMgCQkJXAorCWRidXMtc3lzZGVwcy13aW4uaAkJCVwKKwlkYnVzLXN5c2RlcHMtdGhyZWFkLXdpbi5jCQlcCisJZGJ1cy10cmFuc3BvcnQtd2luLmMJCQlcCisJZGJ1cy10cmFuc3BvcnQtd2luLmgKKworREJVU19VVElMX2FyY2hfc291cmNlcyA9CQkJXAorCWRidXMtc3lzZGVwcy11dGlsLXdpbi5jCQkJXAorCWRidXMtc3Bhd24td2luLmMKK2Vsc2UKKworaWYgREJVU19FTkFCTEVfTEFVTkNIRAorbGF1bmNoZF9zb3VyY2UgPSBkYnVzLXNlcnZlci1sYXVuY2hkLmggZGJ1cy1zZXJ2ZXItbGF1bmNoZC5jCitlbHNlCitsYXVuY2hkX3NvdXJjZSA9CitlbmRpZgorCitEQlVTX0xJQl9hcmNoX3NvdXJjZXMgPSAJCQlcCisJZGJ1cy11dWlkZ2VuLmMJCQkJXAorCWRidXMtdXVpZGdlbi5oCQkJCVwKKwlkYnVzLXNlcnZlci11bml4LmMgCQkJXAorCWRidXMtc2VydmVyLXVuaXguaAorCitEQlVTX1NIQVJFRF9hcmNoX3NvdXJjZXMgPSAJCQlcCisJJChsYXVuY2hkX3NvdXJjZSkJCQlcCisJZGJ1cy1maWxlLXVuaXguYyAJCQlcCisJZGJ1cy1waXBlLXVuaXguYyAJCQlcCisJZGJ1cy1zeXNkZXBzLXVuaXguYyAJCQlcCisJZGJ1cy1zeXNkZXBzLXVuaXguaAkJCVwKKwlkYnVzLXN5c2RlcHMtcHRocmVhZC5jCQkJXAorCWRidXMtdHJhbnNwb3J0LXVuaXguYwkJCVwKKwlkYnVzLXRyYW5zcG9ydC11bml4LmgJCQlcCisJZGJ1cy11c2VyZGIuYwkJCQlcCisJZGJ1cy11c2VyZGIuaCAJCQkJXAorCXNkLWRhZW1vbi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJc2QtZGFlbW9uLmgKKworREJVU19VVElMX2FyY2hfc291cmNlcyA9IAkJCVwKKwlkYnVzLXN5c2RlcHMtdXRpbC11bml4LmMJCVwKKwlkYnVzLXVzZXJkYi11dGlsLmMJCQlcCisJZGJ1cy1zcGF3bi5jCitlbmRpZgorCitpZiBIQVZFX0xJTlVYX0VQT0xMCitEQlVTX1VUSUxfYXJjaF9zb3VyY2VzICs9IGRidXMtc29ja2V0LXNldC1lcG9sbC5jCitlbmRpZgorCitkYnVzaW5jbHVkZV9IRUFERVJTPQkJCQlcCisJZGJ1cy5oCQkJCQlcCisJZGJ1cy1hZGRyZXNzLmgJCQkJXAorCWRidXMtYnVzLmgJCQkJXAorCWRidXMtY29ubmVjdGlvbi5oCQkJXAorCWRidXMtZXJyb3JzLmgJCQkJXAorCWRidXMtbWFjcm9zLmgJCQkJXAorCWRidXMtbWVtb3J5LmgJCQkJXAorCWRidXMtbWVzc2FnZS5oCQkJCVwKKwlkYnVzLW1pc2MuaAkJCQlcCisJZGJ1cy1wZW5kaW5nLWNhbGwuaAkJCVwKKwlkYnVzLXByb3RvY29sLmgJCQkJXAorCWRidXMtc2VydmVyLmgJCQkJXAorCWRidXMtc2hhcmVkLmgJCQkJXAorCWRidXMtc2lnbmF0dXJlLmgJCQlcCisJZGJ1cy1zeW50YXguaAkJCQlcCisJZGJ1cy10aHJlYWRzLmgJCQkJXAorCWRidXMtdHlwZXMuaAorCisKK25vZGlzdF9kYnVzYXJjaGluY2x1ZGVfSEVBREVSUz0JCQlcCisJZGJ1cy1hcmNoLWRlcHMuaAorCisjIyMgc291cmNlIGNvZGUgdGhhdCBnb2VzIGluIHRoZSBpbnN0YWxsZWQgY2xpZW50IGxpYnJhcnkKKyMjIyBhbmQgaXMgc3BlY2lmaWMgdG8gbGlicmFyeSBmdW5jdGlvbmFsaXR5CitEQlVTX0xJQl9TT1VSQ0VTPQkJCQlcCisJZGJ1cy1hZGRyZXNzLmMJCQkJXAorCWRidXMtYXV0aC5jCQkJCVwKKwlkYnVzLWF1dGguaAkJCQlcCisJZGJ1cy1idXMuYwkJCQlcCisJZGJ1cy1jb25uZWN0aW9uLmMJCQlcCisJZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmgJCVwKKwlkYnVzLWNyZWRlbnRpYWxzLmMJCQlcCisJZGJ1cy1jcmVkZW50aWFscy5oCQkJXAorCWRidXMtZXJyb3JzLmMJCQkJXAorCWRidXMta2V5cmluZy5jCQkJCVwKKwlkYnVzLWtleXJpbmcuaAkJCQlcCisJZGJ1cy1tYXJzaGFsLWhlYWRlci5jCQkJXAorCWRidXMtbWFyc2hhbC1oZWFkZXIuaAkJCVwKKwlkYnVzLW1hcnNoYWwtYnl0ZXN3YXAuYwkJCVwKKwlkYnVzLW1hcnNoYWwtYnl0ZXN3YXAuaAkJCVwKKwlkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmMJCVwKKwlkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmgJCVwKKwlkYnVzLW1hcnNoYWwtdmFsaWRhdGUuYwkJCVwKKwlkYnVzLW1hcnNoYWwtdmFsaWRhdGUuaAkJCVwKKwlkYnVzLW1lc3NhZ2UuYwkJCQlcCisJZGJ1cy1tZXNzYWdlLWludGVybmFsLmgJCQlcCisJZGJ1cy1tZXNzYWdlLXByaXZhdGUuaAkJCVwKKwlkYnVzLW1pc2MuYwkJCQlcCisJZGJ1cy1ub25jZS5oCQkJCVwKKwlkYnVzLW5vbmNlLmMJCQkJXAorCWRidXMtb2JqZWN0LXRyZWUuYwkJCVwKKwlkYnVzLW9iamVjdC10cmVlLmgJCQlcCisJZGJ1cy1wZW5kaW5nLWNhbGwuYwkJCVwKKwlkYnVzLXBlbmRpbmctY2FsbC1pbnRlcm5hbC5oCQlcCisJZGJ1cy1yZXNvdXJjZXMuYwkJCVwKKwlkYnVzLXJlc291cmNlcy5oCQkJXAorCWRidXMtc2VydmVyLmMJCQkJXAorCWRidXMtc2VydmVyLWRlYnVnLXBpcGUuYwkJXAorCWRidXMtc2VydmVyLWRlYnVnLXBpcGUuaAkJXAorCWRidXMtc2VydmVyLXByb3RlY3RlZC5oCQkJXAorCWRidXMtc2VydmVyLXNvY2tldC5jCQkJXAorCWRidXMtc2VydmVyLXNvY2tldC5oCQkJXAorCSQoREJVU19MSUJfYXJjaF9zb3VyY2VzKQkJXAorCWRidXMtc2hhLmMJCQkJXAorCWRidXMtc2hhLmgJCQkJXAorCWRidXMtc2lnbmF0dXJlLmMJCQlcCisJZGJ1cy1zeW50YXguYwkJCQlcCisJZGJ1cy10aW1lb3V0LmMJCQkJXAorCWRidXMtdGltZW91dC5oCQkJCVwKKwlkYnVzLXRocmVhZHMtaW50ZXJuYWwuaAkJCVwKKwlkYnVzLXRocmVhZHMuYwkJCQlcCisJZGJ1cy10cmFuc3BvcnQuYwkJCVwKKwlkYnVzLXRyYW5zcG9ydC5oCQkJXAorCWRidXMtdHJhbnNwb3J0LXByb3RlY3RlZC5oCQlcCisJZGJ1cy10cmFuc3BvcnQtc29ja2V0LmMJCQlcCisJZGJ1cy10cmFuc3BvcnQtc29ja2V0LmgJCQlcCisJZGJ1cy13YXRjaC5jCQkJCVwKKwlkYnVzLXdhdGNoLmgKKworIyMjIHNvdXJjZSBjb2RlIHRoYXQgZ29lcyBpbiB0aGUgaW5zdGFsbGVkIGNsaWVudCBsaWJyYXJ5CisjIyMgQU5EIGlzIGdlbmVyaWMgdXRpbGl0eSBmdW5jdGlvbmFsaXR5IHVzZWQgYnkgdGhlCisjIyMgZGFlbW9uIG9yIHRlc3QgcHJvZ3JhbXMgKGFsbCBzeW1ib2xzIGluIGhlcmUgc2hvdWxkCisjIyMgYmUgdW5kZXJzY29yZS1wcmVmaXhlZCkKK0RCVVNfU0hBUkVEX1NPVVJDRVM9CQkJCVwKKwlkYnVzLWRhdGFzbG90LmMJCQkJXAorCWRidXMtZGF0YXNsb3QuaAkJCQlcCisJZGJ1cy1maWxlLmMgICAgICAgICAgICAgICAgIFwKKwlkYnVzLWZpbGUuaCAgICAgICAgICAgICAgICAgXAorCWRidXMtaGFzaC5jCQkJCVwKKwlkYnVzLWhhc2guaAkJCQlcCisJZGJ1cy1pbnRlcm5hbHMuYwkJCVwKKwlkYnVzLWludGVybmFscy5oCQkJXAorCWRidXMtbGlzdC5jCQkJCVwKKwlkYnVzLWxpc3QuaAkJCQlcCisJZGJ1cy1tYXJzaGFsLWJhc2ljLmMJCQlcCisJZGJ1cy1tYXJzaGFsLWJhc2ljLmgJCQlcCisJZGJ1cy1tZW1vcnkuYwkJCQlcCisJZGJ1cy1tZW1wb29sLmMJCQkJXAorCWRidXMtbWVtcG9vbC5oCQkJCVwKKwlkYnVzLXBpcGUuYyAgICAgICAgICAgICAgICAgXAorCWRidXMtcGlwZS5oICAgICAgICAgICAgICAgICBcCisJZGJ1cy1zdHJpbmcuYwkJCQlcCisJZGJ1cy1zdHJpbmcuaAkJCQlcCisJZGJ1cy1zdHJpbmctcHJpdmF0ZS5oCQkJXAorCSQoREJVU19TSEFSRURfYXJjaF9zb3VyY2VzKQkJXAorCWRidXMtc3lzZGVwcy5jCQkJCVwKKwlkYnVzLXN5c2RlcHMuaAkJCQlcCisJZGJ1cy12YWxncmluZC1pbnRlcm5hbC5oCisKKyMjIyBzb3VyY2UgY29kZSB0aGF0IGlzIGdlbmVyaWMgdXRpbGl0eSBmdW5jdGlvbmFsaXR5IHVzZWQKKyMjIyBieSB0aGUgYnVzIGRhZW1vbiBvciB0ZXN0IGFwcHMsIGJ1dCBpcyBOT1QgaW5jbHVkZWQKKyMjIyBpbiB0aGUgRC1CdXMgY2xpZW50IGxpYnJhcnkgKGFsbCBzeW1ib2xzIGluIGhlcmUKKyMjIyBzaG91bGQgYmUgdW5kZXJzY29yZS1wcmVmaXhlZCBidXQgZG9uJ3QgcmVhbGx5IG5lZWQKKyMjIyB0byBiZSB1bmxlc3MgdGhleSBtb3ZlIHRvIERCVVNfU0hBUkVEX1NPVVJDRVMgbGF0ZXIpCitEQlVTX1VUSUxfU09VUkNFUz0JCQkJXAorCWRidXMtYXV0aC1zY3JpcHQuYwkJCVwKKwlkYnVzLWF1dGgtc2NyaXB0LmgJCQlcCisJZGJ1cy1hdXRoLXV0aWwuYwkJCVwKKwlkYnVzLWNyZWRlbnRpYWxzLXV0aWwuYwkJCVwKKwlkYnVzLW1haW5sb29wLmMJCQkJXAorCWRidXMtbWFpbmxvb3AuaAkJCQlcCisJZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLXV0aWwuYwkJXAorCWRidXMtbWFyc2hhbC1yZWN1cnNpdmUtdXRpbC5jCQlcCisJZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLXV0aWwuYwkJXAorCWRidXMtbWVzc2FnZS1mYWN0b3J5LmMJCQlcCisJZGJ1cy1tZXNzYWdlLWZhY3RvcnkuaAkJCVwKKwlkYnVzLW1lc3NhZ2UtdXRpbC5jCQkJXAorCWRidXMtc2hlbGwuYwkJCQlcCisJZGJ1cy1zaGVsbC5oCQkJCVwKKwkkKERCVVNfVVRJTF9hcmNoX3NvdXJjZXMpCQlcCisJZGJ1cy1zb2NrZXQtc2V0LmgJCQlcCisJZGJ1cy1zb2NrZXQtc2V0LmMJCQlcCisJZGJ1cy1zb2NrZXQtc2V0LXBvbGwuYwkJCVwKKwlkYnVzLXNwYXduLmgJCQkJXAorCWRidXMtc3RyaW5nLXV0aWwuYwkJCVwKKwlkYnVzLXN5c2RlcHMtdXRpbC5jCQkJXAorCWRidXMtdGVzdC5jCQkJCVwKKwlkYnVzLXRlc3QuaAorCitsaWJkYnVzXzFfbGFfU09VUkNFUz0JCQkJXAorCSQoREJVU19MSUJfU09VUkNFUykJCQlcCisJJChEQlVTX1NIQVJFRF9TT1VSQ0VTKQorCitsaWJkYnVzX2ludGVybmFsX2xhX1NPVVJDRVM9CQkJXAorCSQoREJVU19MSUJfU09VUkNFUykJCQlcCisJJChEQlVTX1NIQVJFRF9TT1VSQ0VTKQkJCVwKKwkkKERCVVNfVVRJTF9TT1VSQ0VTKQorCitCVUlMVF9TT1VSQ0VTPSQobm9kaXN0X2RidXNhcmNoaW5jbHVkZV9IRUFERVJTKQorRVhUUkFfRElTVD1kYnVzLWFyY2gtZGVwcy5oLmluCisKKyMjIHRoaXMgbGlicmFyeSBpcyB0aGUgc2FtZSBhcyBsaWJkYnVzLCBidXQgZXhwb3J0cyBhbGwgdGhlIHN5bWJvbHMKKyMjIGFuZCBpcyBvbmx5IHVzZWQgZm9yIHN0YXRpYyBsaW5raW5nIHdpdGhpbiB0aGUgZGJ1cyBwYWNrYWdlLgorbm9pbnN0X0xUTElCUkFSSUVTPWxpYmRidXMtaW50ZXJuYWwubGEKKworbGliZGJ1c18xX2xhX0NQUEZMQUdTID0gXAorCSQoQU1fQ1BQRkxBR1MpIFwKKwktRGRidXNfMV9FWFBPUlRTIFwKKwkkKE5VTEwpCitsaWJkYnVzXzFfbGFfTElCQUREPSAkKExJQkRCVVNfTElCUykKK2xpYmRidXNfMV9sYV9MREZMQUdTID0gXAorCSQoQU1fTERGTEFHUykgXAorCSQoZXhwb3J0X3N5bWJvbHMpIFwKKwktdmVyc2lvbi1pbmZvICQoTFRfQ1VSUkVOVCk6JChMVF9SRVZJU0lPTik6JChMVF9BR0UpIFwKKwktbm8tdW5kZWZpbmVkIFwKKwkkKE5VTEwpCisKK2xpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MgPSBcCisJJChBTV9DUFBGTEFHUykgXAorCS1EREJVU19TVEFUSUNfQlVJTEQgXAorCSQoTlVMTCkKK2xpYmRidXNfaW50ZXJuYWxfbGFfTElCQUREPSQoTElCREJVU19MSUJTKSAkKFNZU1RFTURfTElCUykKKworbm9pbnN0X1BST0dSQU1TID0KKworaWYgREJVU19CVUlMRF9URVNUUworIyBXZSBjYW4ndCBhY3R1YWxseSBydW4gdGhpcyB0aWwgd2UndmUgcmVhY2hlZCB0ZXN0Lworbm9pbnN0X1BST0dSQU1TICs9IGRidXMtdGVzdAorZW5kaWYKKworZGJ1c190ZXN0X1NPVVJDRVM9CQkJCVwKKwlkYnVzLXRlc3QtbWFpbi5jCisKK2RidXNfdGVzdF9MREFERCA9IGxpYmRidXMtaW50ZXJuYWwubGEKKworIyMgbW9wIHVwIHRoZSBnY292IGZpbGVzCitjbGVhbi1sb2NhbDoKKwkvYmluL3JtICouYmIgKi5iYmcgKi5kYSAqLmdjb3YgLmxpYnMvKi5kYSAubGlicy8qLmJiZyB8fCB0cnVlCisKK3VwZGF0ZS1zeXN0ZW1kOgorCWN1cmwgaHR0cDovL2NnaXQuZnJlZWRlc2t0b3Aub3JnL3N5c3RlbWQvcGxhaW4vc3JjL3NkLWRhZW1vbi5jID4gc2QtZGFlbW9uLmMKKwljdXJsIGh0dHA6Ly9jZ2l0LmZyZWVkZXNrdG9wLm9yZy9zeXN0ZW1kL3BsYWluL3NyYy9zZC1kYWVtb24uaCA+IHNkLWRhZW1vbi5oCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvTk9USUNFIGIvZGJ1cy9kYnVzL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTFjYTFkCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL05PVElDRQpAQCAtMCwwICsxLDU1MSBAQAorRC1CdXMgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHlvdXIgY2hvaWNlIG9mIHRoZSBBY2FkZW1pYyBGcmVlCitMaWNlbnNlIHZlcnNpb24gMi4xLCBvciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgorQm90aCBsaWNlbnNlcyBhcmUgaW5jbHVkZWQgaGVyZS4gU29tZSBvZiB0aGUgc3RhbmRhbG9uZSBiaW5hcmllcyBhcmUKK3VuZGVyIHRoZSBHUEwgb25seTsgaW4gcGFydGljdWxhciwgYnV0IG5vdCBsaW1pdGVkIHRvLAordG9vbHMvZGJ1cy1jbGVhbnVwLXNvY2tldHMuYyBhbmQgdGVzdC9kZWNvZGUtZ2Nvdi5jLiBFYWNoIHNvdXJjZSBjb2RlCitmaWxlIGlzIG1hcmtlZCB3aXRoIHRoZSBwcm9wZXIgY29weXJpZ2h0IGluZm9ybWF0aW9uIC0gaWYgeW91IGZpbmQgYQorZmlsZSB0aGF0IGlzbid0IG1hcmtlZCBwbGVhc2UgYnJpbmcgaXQgdG8gb3VyIGF0dGVudGlvbi4KKworCitUaGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlCit2LiAyLjEKKworVGhpcyBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgKHRoZSAiTGljZW5zZSIpIGFwcGxpZXMgdG8gYW55IG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcCAodGhlICJPcmlnaW5hbCBXb3JrIikgd2hvc2Ugb3duZXIgKHRoZSAiTGljZW5zb3IiKSBoYXMgcGxhY2VkIHRoZSBmb2xsb3dpbmcgbm90aWNlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgdGhlIE9yaWdpbmFsIFdvcms6CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKworMSkgR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIExpY2Vuc29yIGhlcmVieSBncmFudHMgWW91IGEKK3dvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSwgcGVycGV0dWFsLCBzdWJsaWNlbnNlYWJsZQorbGljZW5zZSB0byBkbyB0aGUgZm9sbG93aW5nOgorCithKSB0byByZXByb2R1Y2UgdGhlIE9yaWdpbmFsIFdvcmsgaW4gY29waWVzOworCitiKSB0byBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3MgKCJEZXJpdmF0aXZlIFdvcmtzIikgYmFzZWQgdXBvbiB0aGUgT3JpZ2luYWwgV29yazsKKworYykgdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIE9yaWdpbmFsIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdG8gdGhlIHB1YmxpYzsKKworZCkgdG8gcGVyZm9ybSB0aGUgT3JpZ2luYWwgV29yayBwdWJsaWNseTsgYW5kCisKK2UpIHRvIGRpc3BsYXkgdGhlIE9yaWdpbmFsIFdvcmsgcHVibGljbHkuCisKKzIpIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBMaWNlbnNvciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsCityb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUsIHBlcnBldHVhbCwgc3VibGljZW5zZWFibGUgbGljZW5zZSwgdW5kZXIKK3BhdGVudCBjbGFpbXMgb3duZWQgb3IgY29udHJvbGxlZCBieSB0aGUgTGljZW5zb3IgdGhhdCBhcmUgZW1ib2RpZWQgaW4KK3RoZSBPcmlnaW5hbCBXb3JrIGFzIGZ1cm5pc2hlZCBieSB0aGUgTGljZW5zb3IsIHRvIG1ha2UsIHVzZSwgc2VsbCBhbmQKK29mZmVyIGZvciBzYWxlIHRoZSBPcmlnaW5hbCBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzLgorCiszKSBHcmFudCBvZiBTb3VyY2UgQ29kZSBMaWNlbnNlLiBUaGUgdGVybSAiU291cmNlIENvZGUiIG1lYW5zIHRoZQorcHJlZmVycmVkIGZvcm0gb2YgdGhlIE9yaWdpbmFsIFdvcmsgZm9yIG1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0IGFuZAorYWxsIGF2YWlsYWJsZSBkb2N1bWVudGF0aW9uIGRlc2NyaWJpbmcgaG93IHRvIG1vZGlmeSB0aGUgT3JpZ2luYWwKK1dvcmsuIExpY2Vuc29yIGhlcmVieSBhZ3JlZXMgdG8gcHJvdmlkZSBhIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUKK1NvdXJjZSBDb2RlIG9mIHRoZSBPcmlnaW5hbCBXb3JrIGFsb25nIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBPcmlnaW5hbAorV29yayB0aGF0IExpY2Vuc29yIGRpc3RyaWJ1dGVzLiBMaWNlbnNvciByZXNlcnZlcyB0aGUgcmlnaHQgdG8gc2F0aXNmeQordGhpcyBvYmxpZ2F0aW9uIGJ5IHBsYWNpbmcgYSBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIFNvdXJjZSBDb2RlCitpbiBhbiBpbmZvcm1hdGlvbiByZXBvc2l0b3J5IHJlYXNvbmFibHkgY2FsY3VsYXRlZCB0byBwZXJtaXQKK2luZXhwZW5zaXZlIGFuZCBjb252ZW5pZW50IGFjY2VzcyBieSBZb3UgZm9yIGFzIGxvbmcgYXMgTGljZW5zb3IKK2NvbnRpbnVlcyB0byBkaXN0cmlidXRlIHRoZSBPcmlnaW5hbCBXb3JrLCBhbmQgYnkgcHVibGlzaGluZyB0aGUKK2FkZHJlc3Mgb2YgdGhhdCBpbmZvcm1hdGlvbiByZXBvc2l0b3J5IGluIGEgbm90aWNlIGltbWVkaWF0ZWx5Citmb2xsb3dpbmcgdGhlIGNvcHlyaWdodCBub3RpY2UgdGhhdCBhcHBsaWVzIHRvIHRoZSBPcmlnaW5hbCBXb3JrLgorCis0KSBFeGNsdXNpb25zIEZyb20gTGljZW5zZSBHcmFudC4gTmVpdGhlciB0aGUgbmFtZXMgb2YgTGljZW5zb3IsIG5vcgordGhlIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgdG8gdGhlIE9yaWdpbmFsIFdvcmssIG5vciBhbnkgb2YgdGhlaXIKK3RyYWRlbWFya3Mgb3Igc2VydmljZSBtYXJrcywgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCitwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBPcmlnaW5hbCBXb3JrIHdpdGhvdXQgZXhwcmVzcyBwcmlvciB3cml0dGVuCitwZXJtaXNzaW9uIG9mIHRoZSBMaWNlbnNvci4gTm90aGluZyBpbiB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgZGVlbWVkIHRvCitncmFudCBhbnkgcmlnaHRzIHRvIHRyYWRlbWFya3MsIGNvcHlyaWdodHMsIHBhdGVudHMsIHRyYWRlIHNlY3JldHMgb3IKK2FueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgTGljZW5zb3IgZXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKK2hlcmVpbi4gTm8gcGF0ZW50IGxpY2Vuc2UgaXMgZ3JhbnRlZCB0byBtYWtlLCB1c2UsIHNlbGwgb3Igb2ZmZXIgdG8KK3NlbGwgZW1ib2RpbWVudHMgb2YgYW55IHBhdGVudCBjbGFpbXMgb3RoZXIgdGhhbiB0aGUgbGljZW5zZWQgY2xhaW1zCitkZWZpbmVkIGluIFNlY3Rpb24gMi4gTm8gcmlnaHQgaXMgZ3JhbnRlZCB0byB0aGUgdHJhZGVtYXJrcyBvZgorTGljZW5zb3IgZXZlbiBpZiBzdWNoIG1hcmtzIGFyZSBpbmNsdWRlZCBpbiB0aGUgT3JpZ2luYWwgV29yay4gTm90aGluZworaW4gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIGludGVycHJldGVkIHRvIHByb2hpYml0IExpY2Vuc29yIGZyb20KK2xpY2Vuc2luZyB1bmRlciBkaWZmZXJlbnQgdGVybXMgZnJvbSB0aGlzIExpY2Vuc2UgYW55IE9yaWdpbmFsIFdvcmsKK3RoYXQgTGljZW5zb3Igb3RoZXJ3aXNlIHdvdWxkIGhhdmUgYSByaWdodCB0byBsaWNlbnNlLgorCis1KSBUaGlzIHNlY3Rpb24gaW50ZW50aW9uYWxseSBvbWl0dGVkLgorCis2KSBBdHRyaWJ1dGlvbiBSaWdodHMuIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBDb2RlIG9mIGFueQorRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBjcmVhdGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCBvciB0cmFkZW1hcmsKK25vdGljZXMgZnJvbSB0aGUgU291cmNlIENvZGUgb2YgdGhlIE9yaWdpbmFsIFdvcmssIGFzIHdlbGwgYXMgYW55Citub3RpY2VzIG9mIGxpY2Vuc2luZyBhbmQgYW55IGRlc2NyaXB0aXZlIHRleHQgaWRlbnRpZmllZCB0aGVyZWluIGFzIGFuCisiQXR0cmlidXRpb24gTm90aWNlLiIgWW91IG11c3QgY2F1c2UgdGhlIFNvdXJjZSBDb2RlIGZvciBhbnkKK0Rlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgY3JlYXRlIHRvIGNhcnJ5IGEgcHJvbWluZW50IEF0dHJpYnV0aW9uCitOb3RpY2UgcmVhc29uYWJseSBjYWxjdWxhdGVkIHRvIGluZm9ybSByZWNpcGllbnRzIHRoYXQgWW91IGhhdmUKK21vZGlmaWVkIHRoZSBPcmlnaW5hbCBXb3JrLgorCis3KSBXYXJyYW50eSBvZiBQcm92ZW5hbmNlIGFuZCBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBMaWNlbnNvcgord2FycmFudHMgdGhhdCB0aGUgY29weXJpZ2h0IGluIGFuZCB0byB0aGUgT3JpZ2luYWwgV29yayBhbmQgdGhlIHBhdGVudAorcmlnaHRzIGdyYW50ZWQgaGVyZWluIGJ5IExpY2Vuc29yIGFyZSBvd25lZCBieSB0aGUgTGljZW5zb3Igb3IgYXJlCitzdWJsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSB3aXRoIHRoZSBwZXJtaXNzaW9uCitvZiB0aGUgY29udHJpYnV0b3Iocykgb2YgdGhvc2UgY29weXJpZ2h0cyBhbmQgcGF0ZW50IHJpZ2h0cy4gRXhjZXB0IGFzCitleHByZXNzbHkgc3RhdGVkIGluIHRoZSBpbW1lZGlhdGVseSBwcm9jZWVkaW5nIHNlbnRlbmNlLCB0aGUgT3JpZ2luYWwKK1dvcmsgaXMgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlIG9uIGFuICJBUyBJUyIgQkFTSVMgYW5kIFdJVEhPVVQKK1dBUlJBTlRZLCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwKK3RoZSB3YXJyYW50aWVzIG9mIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBPRiBUSEUgT1JJR0lOQUwKK1dPUksgSVMgV0lUSCBZT1UuIFRoaXMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBjb25zdGl0dXRlcyBhbiBlc3NlbnRpYWwKK3BhcnQgb2YgdGhpcyBMaWNlbnNlLiBObyBsaWNlbnNlIHRvIE9yaWdpbmFsIFdvcmsgaXMgZ3JhbnRlZCBoZXJldW5kZXIKK2V4Y2VwdCB1bmRlciB0aGlzIGRpc2NsYWltZXIuCisKKzgpIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIGFuZCB1bmRlciBubyBsZWdhbAordGhlb3J5LCB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yCitvdGhlcndpc2UsIHNoYWxsIHRoZSBMaWNlbnNvciBiZSBsaWFibGUgdG8gYW55IHBlcnNvbiBmb3IgYW55IGRpcmVjdCwKK2luZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55CitjaGFyYWN0ZXIgYXJpc2luZyBhcyBhIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3IgdGhlIHVzZSBvZiB0aGUKK09yaWdpbmFsIFdvcmsgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGRhbWFnZXMgZm9yIGxvc3Mgb2YKK2dvb2R3aWxsLCB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kCithbGwgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3Nlcy4gVGhpcyBsaW1pdGF0aW9uIG9mIGxpYWJpbGl0eQorc2hhbGwgbm90IGFwcGx5IHRvIGxpYWJpbGl0eSBmb3IgZGVhdGggb3IgcGVyc29uYWwgaW5qdXJ5IHJlc3VsdGluZworZnJvbSBMaWNlbnNvcidzIG5lZ2xpZ2VuY2UgdG8gdGhlIGV4dGVudCBhcHBsaWNhYmxlIGxhdyBwcm9oaWJpdHMgc3VjaAorbGltaXRhdGlvbi4gU29tZSBqdXJpc2RpY3Rpb25zIGRvIG5vdCBhbGxvdyB0aGUgZXhjbHVzaW9uIG9yCitsaW1pdGF0aW9uIG9mIGluY2lkZW50YWwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzbyB0aGlzIGV4Y2x1c2lvbgorYW5kIGxpbWl0YXRpb24gbWF5IG5vdCBhcHBseSB0byBZb3UuCisKKzkpIEFjY2VwdGFuY2UgYW5kIFRlcm1pbmF0aW9uLiBJZiBZb3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCitPcmlnaW5hbCBXb3JrIG9yIGEgRGVyaXZhdGl2ZSBXb3JrLCBZb3UgbXVzdCBtYWtlIGEgcmVhc29uYWJsZSBlZmZvcnQKK3VuZGVyIHRoZSBjaXJjdW1zdGFuY2VzIHRvIG9idGFpbiB0aGUgZXhwcmVzcyBhc3NlbnQgb2YgcmVjaXBpZW50cyB0bwordGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gTm90aGluZyBlbHNlIGJ1dCB0aGlzIExpY2Vuc2UgKG9yIGFub3RoZXIKK3dyaXR0ZW4gYWdyZWVtZW50IGJldHdlZW4gTGljZW5zb3IgYW5kIFlvdSkgZ3JhbnRzIFlvdSBwZXJtaXNzaW9uIHRvCitjcmVhdGUgRGVyaXZhdGl2ZSBXb3JrcyBiYXNlZCB1cG9uIHRoZSBPcmlnaW5hbCBXb3JrIG9yIHRvIGV4ZXJjaXNlCithbnkgb2YgdGhlIHJpZ2h0cyBncmFudGVkIGluIFNlY3Rpb24gMSBoZXJlaW4sIGFuZCBhbnkgYXR0ZW1wdCB0byBkbworc28gZXhjZXB0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgKG9yIGFub3RoZXIgd3JpdHRlbgorYWdyZWVtZW50IGJldHdlZW4gTGljZW5zb3IgYW5kIFlvdSkgaXMgZXhwcmVzc2x5IHByb2hpYml0ZWQgYnkKK1UuUy4gY29weXJpZ2h0IGxhdywgdGhlIGVxdWl2YWxlbnQgbGF3cyBvZiBvdGhlciBjb3VudHJpZXMsIGFuZCBieQoraW50ZXJuYXRpb25hbCB0cmVhdHkuIFRoZXJlZm9yZSwgYnkgZXhlcmNpc2luZyBhbnkgb2YgdGhlIHJpZ2h0cworZ3JhbnRlZCB0byBZb3UgaW4gU2VjdGlvbiAxIGhlcmVpbiwgWW91IGluZGljYXRlIFlvdXIgYWNjZXB0YW5jZSBvZgordGhpcyBMaWNlbnNlIGFuZCBhbGwgb2YgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zLgorCisxMCkgVGVybWluYXRpb24gZm9yIFBhdGVudCBBY3Rpb24uIFRoaXMgTGljZW5zZSBzaGFsbCB0ZXJtaW5hdGUKK2F1dG9tYXRpY2FsbHkgYW5kIFlvdSBtYXkgbm8gbG9uZ2VyIGV4ZXJjaXNlIGFueSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQKK3RvIFlvdSBieSB0aGlzIExpY2Vuc2UgYXMgb2YgdGhlIGRhdGUgWW91IGNvbW1lbmNlIGFuIGFjdGlvbiwKK2luY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSwgYWdhaW5zdCBMaWNlbnNvciBvciBhbnkKK2xpY2Vuc2VlIGFsbGVnaW5nIHRoYXQgdGhlIE9yaWdpbmFsIFdvcmsgaW5mcmluZ2VzIGEgcGF0ZW50LiBUaGlzCit0ZXJtaW5hdGlvbiBwcm92aXNpb24gc2hhbGwgbm90IGFwcGx5IGZvciBhbiBhY3Rpb24gYWxsZWdpbmcgcGF0ZW50CitpbmZyaW5nZW1lbnQgYnkgY29tYmluYXRpb25zIG9mIHRoZSBPcmlnaW5hbCBXb3JrIHdpdGggb3RoZXIgc29mdHdhcmUKK29yIGhhcmR3YXJlLgorCisxMSkgSnVyaXNkaWN0aW9uLCBWZW51ZSBhbmQgR292ZXJuaW5nIExhdy4gQW55IGFjdGlvbiBvciBzdWl0IHJlbGF0aW5nCit0byB0aGlzIExpY2Vuc2UgbWF5IGJlIGJyb3VnaHQgb25seSBpbiB0aGUgY291cnRzIG9mIGEganVyaXNkaWN0aW9uCit3aGVyZWluIHRoZSBMaWNlbnNvciByZXNpZGVzIG9yIGluIHdoaWNoIExpY2Vuc29yIGNvbmR1Y3RzIGl0cyBwcmltYXJ5CitidXNpbmVzcywgYW5kIHVuZGVyIHRoZSBsYXdzIG9mIHRoYXQganVyaXNkaWN0aW9uIGV4Y2x1ZGluZyBpdHMKK2NvbmZsaWN0LW9mLWxhdyBwcm92aXNpb25zLiBUaGUgYXBwbGljYXRpb24gb2YgdGhlIFVuaXRlZCBOYXRpb25zCitDb252ZW50aW9uIG9uIENvbnRyYWN0cyBmb3IgdGhlIEludGVybmF0aW9uYWwgU2FsZSBvZiBHb29kcyBpcworZXhwcmVzc2x5IGV4Y2x1ZGVkLiBBbnkgdXNlIG9mIHRoZSBPcmlnaW5hbCBXb3JrIG91dHNpZGUgdGhlIHNjb3BlIG9mCit0aGlzIExpY2Vuc2Ugb3IgYWZ0ZXIgaXRzIHRlcm1pbmF0aW9uIHNoYWxsIGJlIHN1YmplY3QgdG8gdGhlCityZXF1aXJlbWVudHMgYW5kIHBlbmFsdGllcyBvZiB0aGUgVS5TLiBDb3B5cmlnaHQgQWN0LCAxNyBVLlMuQy4gw4LCpyAxMDEKK2V0IHNlcS4sIHRoZSBlcXVpdmFsZW50IGxhd3Mgb2Ygb3RoZXIgY291bnRyaWVzLCBhbmQgaW50ZXJuYXRpb25hbAordHJlYXR5LiBUaGlzIHNlY3Rpb24gc2hhbGwgc3Vydml2ZSB0aGUgdGVybWluYXRpb24gb2YgdGhpcyBMaWNlbnNlLgorCisxMikgQXR0b3JuZXlzIEZlZXMuIEluIGFueSBhY3Rpb24gdG8gZW5mb3JjZSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlCitvciBzZWVraW5nIGRhbWFnZXMgcmVsYXRpbmcgdGhlcmV0bywgdGhlIHByZXZhaWxpbmcgcGFydHkgc2hhbGwgYmUKK2VudGl0bGVkIHRvIHJlY292ZXIgaXRzIGNvc3RzIGFuZCBleHBlbnNlcywgaW5jbHVkaW5nLCB3aXRob3V0CitsaW1pdGF0aW9uLCByZWFzb25hYmxlIGF0dG9ybmV5cycgZmVlcyBhbmQgY29zdHMgaW5jdXJyZWQgaW4KK2Nvbm5lY3Rpb24gd2l0aCBzdWNoIGFjdGlvbiwgaW5jbHVkaW5nIGFueSBhcHBlYWwgb2Ygc3VjaCBhY3Rpb24uIFRoaXMKK3NlY3Rpb24gc2hhbGwgc3Vydml2ZSB0aGUgdGVybWluYXRpb24gb2YgdGhpcyBMaWNlbnNlLgorCisxMykgTWlzY2VsbGFuZW91cy4gVGhpcyBMaWNlbnNlIHJlcHJlc2VudHMgdGhlIGNvbXBsZXRlIGFncmVlbWVudAorY29uY2VybmluZyB0aGUgc3ViamVjdCBtYXR0ZXIgaGVyZW9mLiBJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZQoraXMgaGVsZCB0byBiZSB1bmVuZm9yY2VhYmxlLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCBvbmx5IHRvCit0aGUgZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIGl0IGVuZm9yY2VhYmxlLgorCisxNCkgRGVmaW5pdGlvbiBvZiAiWW91IiBpbiBUaGlzIExpY2Vuc2UuICJZb3UiIHRocm91Z2hvdXQgdGhpcworTGljZW5zZSwgd2hldGhlciBpbiB1cHBlciBvciBsb3dlciBjYXNlLCBtZWFucyBhbiBpbmRpdmlkdWFsIG9yIGEKK2xlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciwgYW5kIGNvbXBseWluZyB3aXRoIGFsbCBvZiB0aGUKK3Rlcm1zIG9mLCB0aGlzIExpY2Vuc2UuIEZvciBsZWdhbCBlbnRpdGllcywgIllvdSIgaW5jbHVkZXMgYW55IGVudGl0eQordGhhdCBjb250cm9scywgaXMgY29udHJvbGxlZCBieSwgb3IgaXMgdW5kZXIgY29tbW9uIGNvbnRyb2wgd2l0aAoreW91LiBGb3IgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwKK2RpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2gKK2VudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5CitwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbAorb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisxNSkgUmlnaHQgdG8gVXNlLiBZb3UgbWF5IHVzZSB0aGUgT3JpZ2luYWwgV29yayBpbiBhbGwgd2F5cyBub3QKK290aGVyd2lzZSByZXN0cmljdGVkIG9yIGNvbmRpdGlvbmVkIGJ5IHRoaXMgTGljZW5zZSBvciBieSBsYXcsIGFuZAorTGljZW5zb3IgcHJvbWlzZXMgbm90IHRvIGludGVyZmVyZSB3aXRoIG9yIGJlIHJlc3BvbnNpYmxlIGZvciBzdWNoCit1c2VzIGJ5IFlvdS4KKworVGhpcyBsaWNlbnNlIGlzIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IExhd3JlbmNlIEUuIFJvc2VuLiBBbGwgcmlnaHRzCityZXNlcnZlZC4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoaXMKK2xpY2Vuc2Ugd2l0aG91dCBtb2RpZmljYXRpb24uIFRoaXMgbGljZW5zZSBtYXkgbm90IGJlIG1vZGlmaWVkIHdpdGhvdXQKK3RoZSBleHByZXNzIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBpdHMgY29weXJpZ2h0IG93bmVyLgorCisKKy0tIAorRU5EIE9GIEFDQURFTUlDIEZSRUUgTElDRU5TRS4gVGhlIGZvbGxvd2luZyBpcyBpbnRlbmRlZCB0byBkZXNjcmliZSB0aGUgZXNzZW50aWFsIAorZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIChBRkwpIHZlcnNpb24gMS4wIGFuZCBvdGhlciAKK29wZW4gc291cmNlIGxpY2Vuc2VzOgorCitUaGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIGlzIHNpbWlsYXIgdG8gdGhlIEJTRCwgTUlULCBVb0kvTkNTQSBhbmQgQXBhY2hlIAorbGljZW5zZXMgaW4gbWFueSByZXNwZWN0cyBidXQgaXQgaXMgaW50ZW5kZWQgdG8gc29sdmUgYSBmZXcgcHJvYmxlbXMgd2l0aCAKK3Rob3NlIGxpY2Vuc2VzLgorICAgIAorKiBUaGUgQUZMIGlzIHdyaXR0ZW4gc28gYXMgdG8gbWFrZSBpdCBjbGVhciB3aGF0IHNvZnR3YXJlIGlzIGJlaW5nIAorbGljZW5zZWQgKGJ5IHRoZSBpbmNsdXNpb24gb2YgYSBzdGF0ZW1lbnQgZm9sbG93aW5nIHRoZSBjb3B5cmlnaHQgbm90aWNlIAoraW4gdGhlIHNvZnR3YXJlKS4gVGhpcyB3YXksIHRoZSBsaWNlbnNlIGZ1bmN0aW9ucyBiZXR0ZXIgdGhhbiBhIHRlbXBsYXRlIAorbGljZW5zZS4gVGhlIEJTRCwgTUlUIGFuZCBVb0kvTkNTQSBsaWNlbnNlcyBhcHBseSB0byB1bmlkZW50aWZpZWQgc29mdHdhcmUuCisgICAgCisqIFRoZSBBRkwgY29udGFpbnMgYSBjb21wbGV0ZSBjb3B5cmlnaHQgZ3JhbnQgdG8gdGhlIHNvZnR3YXJlLiBUaGUgQlNEIAorYW5kIEFwYWNoZSBsaWNlbnNlcyBhcmUgdmFndWUgYW5kIGluY29tcGxldGUgaW4gdGhhdCByZXNwZWN0LgorICAgIAorKiBUaGUgQUZMIGNvbnRhaW5zIGEgY29tcGxldGUgcGF0ZW50IGdyYW50IHRvIHRoZSBzb2Z0d2FyZS4gVGhlIEJTRCwgTUlULCAKK1VvSS9OQ1NBIGFuZCBBcGFjaGUgbGljZW5zZXMgcmVseSBvbiBhbiBpbXBsaWVkIHBhdGVudCBsaWNlbnNlIGFuZCBjb250YWluIAorbm8gZXhwbGljaXQgcGF0ZW50IGdyYW50LgorICAgIAorKiBUaGUgQUZMIG1ha2VzIGl0IGNsZWFyIHRoYXQgbm8gdHJhZGVtYXJrIHJpZ2h0cyBhcmUgZ3JhbnRlZCB0byB0aGUgCitsaWNlbnNvcidzIHRyYWRlbWFya3MuIFRoZSBBcGFjaGUgbGljZW5zZSBjb250YWlucyBzdWNoIGEgcHJvdmlzaW9uLCBidXQgdGhlIAorQlNELCBNSVQgYW5kIFVvSS9OQ1NBIGxpY2Vuc2VzIGRvIG5vdC4KKyAgICAKKyogVGhlIEFGTCBpbmNsdWRlcyB0aGUgd2FycmFudHkgYnkgdGhlIGxpY2Vuc29yIHRoYXQgaXQgZWl0aGVyIG93bnMgdGhlIAorY29weXJpZ2h0IG9yIHRoYXQgaXQgaXMgZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSB1bmRlciBhIGxpY2Vuc2UuIE5vbmUgb2YgCit0aGUgb3RoZXIgbGljZW5zZXMgY29udGFpbiB0aGF0IHdhcnJhbnR5LiBBbGwgb3RoZXIgd2FycmFudGllcyBhcmUgZGlzY2xhaW1lZCwgCithcyBpcyB0aGUgY2FzZSBmb3IgdGhlIG90aGVyIGxpY2Vuc2VzLgorCisqIFRoZSBBRkwgaXMgaXRzZWxmIGNvcHlyaWdodGVkICh3aXRoIHRoZSByaWdodCBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgCit3aXRob3V0IG1vZGlmaWNhdGlvbikuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBvd25lciBvZiB0aGUgY29weXJpZ2h0IHRvIHRoZSAKK2xpY2Vuc2Ugd2lsbCBjb250cm9sIGNoYW5nZXMuIFRoZSBBcGFjaGUgbGljZW5zZSBjb250YWlucyBhIGNvcHlyaWdodCBub3RpY2UsIAorYnV0IHRoZSBCU0QsIE1JVCBhbmQgVW9JL05DU0EgbGljZW5zZXMgZG8gbm90LiAKKy0tCitTVEFSVCBPRiBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorLS0KKworCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKKyBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKKwkJCSAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCitzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcworR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KK3VzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKK3RoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAoraWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCithbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCitUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQorZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKK2dyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoreW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKK3NvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKK3JpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCisoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAorZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KKworICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgordGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKK3NvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KK3RoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCithdXRob3JzJyByZXB1dGF0aW9ucy4KKworICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQorcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQorcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQorcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55CitwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LgorDAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKK2Egbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCit1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCityZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKK21lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Cit0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAorZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKK2xhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KK3RoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCitBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQoraXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCitXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KKworICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKK3NvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQorY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQorY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQorbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OworYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCit5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KKyAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKKyAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAorICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKKyAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCisgICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgorICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQorICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQorICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKKyAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcworICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0CisgICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgorICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQorDAorVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQord2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKK3VuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgorU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQorICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucworICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKKyAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgorICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKKyAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KKyAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgorICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCisgICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKKyAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCisgICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCisKK1RoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCitjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQorYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCitjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCitzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKK2FueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Citmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQorb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKK2l0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KKworSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZworYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAorYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCitkaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisMCisgIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAorb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCit2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCitIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgordGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKK3BhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCit0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KK3RoaXMgTGljZW5zZS4KKworICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCithbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCithcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgorY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisMCisgIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKK21heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwordGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZworY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCit0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucworb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCitiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQorbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKK3RoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24uCisKKyAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgordG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKK21ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCitvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCitvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCitGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KK09USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKK1BST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECitPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUworVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQorUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCitSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCitSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAorSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCitPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECitUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKK1lPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCitQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorCSAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0CitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KKworICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAordG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKK3RoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyIG5hbWUgb2YgYXV0aG9yCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQorYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCisgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1hZGRyZXNzLmMgYi9kYnVzL2RidXMvZGJ1cy1hZGRyZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA0ODRkYwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLWFkZHJlc3MuYwpAQCAtMCwwICsxLDgyNiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWFkZHJlc3MuYyAgU2VydmVyIGFkZHJlc3MgcGFyc2VyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqIENvcHlyaWdodCAoQykgMjAwNCwyMDA1ICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWFkZHJlc3MuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtbGlzdC5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzQWRkcmVzc0ludGVybmFscyBBZGRyZXNzIHBhcnNpbmcKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgcGFyc2luZyBhZGRyZXNzZXMgb2YgRC1CdXMgc2VydmVycy4KKyAqCisgKiBAeworICovCisKKy8qKgorICogSW50ZXJuYWxzIG9mIERCdXNBZGRyZXNzRW50cnkgCisgKi8KK3N0cnVjdCBEQnVzQWRkcmVzc0VudHJ5Cit7CisgIERCdXNTdHJpbmcgbWV0aG9kOyAvKio8IFRoZSBhZGRyZXNzIHR5cGUgKHVuaXgsIHRjcCwgZXRjLikgKi8KKworICBEQnVzTGlzdCAqa2V5czsgICAgLyoqPCBMaXN0IG9mIGtleXMgKi8KKyAgREJ1c0xpc3QgKnZhbHVlczsgIC8qKjwgTGlzdCBvZiB2YWx1ZXMgKi8KK307CisKKworLyoqCisgKgorICogU2V0cyAjREJVU19FUlJPUl9CQURfQUREUkVTUy4KKyAqIElmIGFkZHJlc3NfcHJvYmxlbV90eXBlIGFuZCBhZGRyZXNzX3Byb2JsZW1fZmllbGQgYXJlIG5vdCAjTlVMTCwKKyAqIHNldHMgYW4gZXJyb3IgbWVzc2FnZSBhYm91dCBob3cgdGhlIGZpZWxkIGlzIG5vIGdvb2QuIE90aGVyd2lzZSwgc2V0cworICogYWRkcmVzc19wcm9ibGVtX290aGVyIGFzIHRoZSBlcnJvciBtZXNzYWdlLgorICogCisgKiBAcGFyYW0gZXJyb3IgdGhlIGVycm9yIHRvIHNldAorICogQHBhcmFtIGFkZHJlc3NfcHJvYmxlbV90eXBlIHRoZSBhZGRyZXNzIHR5cGUgb2YgdGhlIGJhZCBhZGRyZXNzIG9yICNOVUxMCisgKiBAcGFyYW0gYWRkcmVzc19wcm9ibGVtX2ZpZWxkIHRoZSBtaXNzaW5nIGZpZWxkIG9mIHRoZSBiYWQgYWRkcmVzcyBvciAjTlVMTAorICogQHBhcmFtIGFkZHJlc3NfcHJvYmxlbV9vdGhlciBhbnkgb3RoZXIgZXJyb3IgbWVzc2FnZSBvciAjTlVMTAorICovCit2b2lkCitfZGJ1c19zZXRfYmFkX2FkZHJlc3MgKERCdXNFcnJvciAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzX3Byb2JsZW1fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzc19wcm9ibGVtX2ZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzX3Byb2JsZW1fb3RoZXIpCit7CisgIGlmIChhZGRyZXNzX3Byb2JsZW1fdHlwZSAhPSBOVUxMKQorICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgIlNlcnZlciBhZGRyZXNzIG9mIHR5cGUgJXMgd2FzIG1pc3NpbmcgYXJndW1lbnQgJXMiLAorICAgICAgICAgICAgICAgICAgICBhZGRyZXNzX3Byb2JsZW1fdHlwZSwgYWRkcmVzc19wcm9ibGVtX2ZpZWxkKTsKKyAgZWxzZQorICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBwYXJzZSBzZXJ2ZXIgYWRkcmVzczogJXMiLAorICAgICAgICAgICAgICAgICAgICBhZGRyZXNzX3Byb2JsZW1fb3RoZXIpOworfQorCisvKioKKyAqICNUUlVFIGlmIHRoZSBieXRlIG5lZWQgbm90IGJlIGVzY2FwZWQgd2hlbiBmb3VuZCBpbiBhIGRidXMgYWRkcmVzcy4KKyAqIEFsbCBvdGhlciBieXRlcyBhcmUgcmVxdWlyZWQgdG8gYmUgZXNjYXBlZCBpbiBhIHZhbGlkIGFkZHJlc3MuCisgKi8KKyNkZWZpbmUgX0RCVVNfQUREUkVTU19PUFRJT05BTExZX0VTQ0FQRURfQllURShiKSAgICAgICAgXAorICAgICAgICAgKCgoYikgPj0gJ2EnICYmIChiKSA8PSAneicpIHx8ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKChiKSA+PSAnQScgJiYgKGIpIDw9ICdaJykgfHwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoKGIpID49ICcwJyAmJiAoYikgPD0gJzknKSB8fCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChiKSA9PSAnLScgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKGIpID09ICdfJyB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoYikgPT0gJy8nIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChiKSA9PSAnXFwnIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKGIpID09ICcqJyB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChiKSA9PSAnLicpCisKKy8qKgorICogQXBwZW5kcyBhbiBlc2NhcGVkIHZlcnNpb24gb2Ygb25lIHN0cmluZyB0byBhbm90aGVyIHN0cmluZywKKyAqIHVzaW5nIHRoZSBELUJ1cyBhZGRyZXNzIGVzY2FwaW5nIG1lY2hhbmlzbQorICoKKyAqIEBwYXJhbSBlc2NhcGVkIHRoZSBzdHJpbmcgdG8gYXBwZW5kIHRvCisgKiBAcGFyYW0gdW5lc2NhcGVkIHRoZSBzdHJpbmcgdG8gZXNjYXBlCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hZGRyZXNzX2FwcGVuZF9lc2NhcGVkIChEQnVzU3RyaW5nICAgICAgICplc2NhcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqdW5lc2NhcGVkKQoreworICBjb25zdCBjaGFyICpwOworICBjb25zdCBjaGFyICplbmQ7CisgIGRidXNfYm9vbF90IHJldDsKKyAgaW50IG9yaWdfbGVuOworCisgIHJldCA9IEZBTFNFOworCisgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGVzY2FwZWQpOworICBwID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICh1bmVzY2FwZWQpOworICBlbmQgPSBwICsgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHVuZXNjYXBlZCk7CisgIHdoaWxlIChwICE9IGVuZCkKKyAgICB7CisgICAgICBpZiAoX0RCVVNfQUREUkVTU19PUFRJT05BTExZX0VTQ0FQRURfQllURSAoKnApKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKGVzY2FwZWQsICpwKSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoZXNjYXBlZCwgJyUnKSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlX2FzX2hleCAoZXNjYXBlZCwgKnApKQorICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgKytwOworICAgIH0KKworICByZXQgPSBUUlVFOworICAKKyBvdXQ6CisgIGlmICghcmV0KQorICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChlc2NhcGVkLCBvcmlnX2xlbik7CisgIHJldHVybiByZXQ7Cit9CisKKy8qKiBAfSAqLyAvKiBFbmQgb2YgaW50ZXJuYWxzICovCisKK3N0YXRpYyB2b2lkCitkYnVzX2FkZHJlc3NfZW50cnlfZnJlZSAoREJ1c0FkZHJlc3NFbnRyeSAqZW50cnkpCit7CisgIERCdXNMaXN0ICpsaW5rOworICAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZlbnRyeS0+bWV0aG9kKTsKKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmVudHJ5LT5rZXlzKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAobGluay0+ZGF0YSk7CisgICAgICBkYnVzX2ZyZWUgKGxpbmstPmRhdGEpOworICAgICAgCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmZW50cnktPmtleXMsIGxpbmspOworICAgIH0KKyAgX2RidXNfbGlzdF9jbGVhciAoJmVudHJ5LT5rZXlzKTsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmZW50cnktPnZhbHVlcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKGxpbmstPmRhdGEpOworICAgICAgZGJ1c19mcmVlIChsaW5rLT5kYXRhKTsKKyAgICAgIAorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmVudHJ5LT52YWx1ZXMsIGxpbmspOworICAgIH0KKyAgX2RidXNfbGlzdF9jbGVhciAoJmVudHJ5LT52YWx1ZXMpOworICAKKyAgZGJ1c19mcmVlIChlbnRyeSk7Cit9CisKKy8qKgorICogQGRlZmdyb3VwIERCdXNBZGRyZXNzIEFkZHJlc3MgcGFyc2luZworICogQGluZ3JvdXAgIERCdXMKKyAqIEBicmllZiBQYXJzaW5nIGFkZHJlc3NlcyBvZiBELUJ1cyBzZXJ2ZXJzLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBGcmVlcyBhICNOVUxMLXRlcm1pbmF0ZWQgYXJyYXkgb2YgYWRkcmVzcyBlbnRyaWVzLgorICoKKyAqIEBwYXJhbSBlbnRyaWVzIHRoZSBhcnJheS4KKyAqLwordm9pZAorZGJ1c19hZGRyZXNzX2VudHJpZXNfZnJlZSAoREJ1c0FkZHJlc3NFbnRyeSAqKmVudHJpZXMpCit7CisgIGludCBpOworICAKKyAgZm9yIChpID0gMDsgZW50cmllc1tpXSAhPSBOVUxMOyBpKyspCisgICAgZGJ1c19hZGRyZXNzX2VudHJ5X2ZyZWUgKGVudHJpZXNbaV0pOworICBkYnVzX2ZyZWUgKGVudHJpZXMpOworfQorCitzdGF0aWMgREJ1c0FkZHJlc3NFbnRyeSAqCitjcmVhdGVfZW50cnkgKHZvaWQpCit7CisgIERCdXNBZGRyZXNzRW50cnkgKmVudHJ5OworCisgIGVudHJ5ID0gZGJ1c19uZXcwIChEQnVzQWRkcmVzc0VudHJ5LCAxKTsKKworICBpZiAoZW50cnkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZW50cnktPm1ldGhvZCkpCisgICAgeworICAgICAgZGJ1c19mcmVlIChlbnRyeSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIGVudHJ5OworfQorCisvKioKKyAqIFJldHVybnMgdGhlIG1ldGhvZCBzdHJpbmcgb2YgYW4gYWRkcmVzcyBlbnRyeS4gIEZvciBleGFtcGxlLCBnaXZlbgorICogdGhlIGFkZHJlc3MgZW50cnkgInRjcDpob3N0PWV4YW1wbGUuY29tIiBpdCB3b3VsZCByZXR1cm4gdGhlIHN0cmluZworICogInRjcCIKKyAqCisgKiBAcGFyYW0gZW50cnkgdGhlIGVudHJ5LgorICogQHJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgbWV0aG9kLiBUaGlzIHN0cmluZworICogbXVzdCBub3QgYmUgZnJlZWQuCisgKi8KK2NvbnN0IGNoYXIgKgorZGJ1c19hZGRyZXNzX2VudHJ5X2dldF9tZXRob2QgKERCdXNBZGRyZXNzRW50cnkgKmVudHJ5KQoreworICByZXR1cm4gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZW50cnktPm1ldGhvZCk7Cit9CisKKy8qKgorICogUmV0dXJucyBhIHZhbHVlIGZyb20gYSBrZXkgb2YgYW4gZW50cnkuIEZvciBleGFtcGxlLAorICogZ2l2ZW4gdGhlIGFkZHJlc3MgInRjcDpob3N0PWV4YW1wbGUuY29tLHBvcnQ9ODA3MyIgaWYgeW91IGFza2VkCisgKiBmb3IgdGhlIGtleSAiaG9zdCIgeW91IHdvdWxkIGdldCB0aGUgdmFsdWUgImV4YW1wbGUuY29tIgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhbHJlYWR5IHVuZXNjYXBlZC4KKyAqIAorICogQHBhcmFtIGVudHJ5IHRoZSBlbnRyeS4KKyAqIEBwYXJhbSBrZXkgdGhlIGtleS4KKyAqIEByZXR1cm5zIHRoZSBrZXkgdmFsdWUuIFRoaXMgc3RyaW5nIG11c3Qgbm90IGJlIGZyZWVkLgorICovCitjb25zdCBjaGFyICoKK2RidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKERCdXNBZGRyZXNzRW50cnkgKmVudHJ5LAorCQkJICAgICAgY29uc3QgY2hhciAgICAgICAqa2V5KQoreworICBEQnVzTGlzdCAqdmFsdWVzLCAqa2V5czsKKworICBrZXlzID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmVudHJ5LT5rZXlzKTsKKyAgdmFsdWVzID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmVudHJ5LT52YWx1ZXMpOworCisgIHdoaWxlIChrZXlzICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0ICh2YWx1ZXMgIT0gTlVMTCk7CisKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKGtleXMtPmRhdGEsIGtleSkpCisgICAgICAgIHJldHVybiBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHZhbHVlcy0+ZGF0YSk7CisKKyAgICAgIGtleXMgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZlbnRyeS0+a2V5cywga2V5cyk7CisgICAgICB2YWx1ZXMgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZlbnRyeS0+dmFsdWVzLCB2YWx1ZXMpOworICAgIH0KKyAgCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FwcGVuZF91bmVzY2FwZWRfdmFsdWUgKERCdXNTdHJpbmcgICAgICAgKnVuZXNjYXBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmVzY2FwZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBlc2NhcGVkX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgZXNjYXBlZF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqcDsKKyAgY29uc3QgY2hhciAqZW5kOworICBkYnVzX2Jvb2xfdCByZXQ7CisgIAorICByZXQgPSBGQUxTRTsKKworICBwID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChlc2NhcGVkKSArIGVzY2FwZWRfc3RhcnQ7CisgIGVuZCA9IHAgKyBlc2NhcGVkX2xlbjsKKyAgd2hpbGUgKHAgIT0gZW5kKQorICAgIHsKKyAgICAgIGlmIChfREJVU19BRERSRVNTX09QVElPTkFMTFlfRVNDQVBFRF9CWVRFICgqcCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAodW5lc2NhcGVkLCAqcCkpCisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoKnAgPT0gJyUnKQorICAgICAgICB7CisgICAgICAgICAgLyogRWZmaWNpZW5jeSBpcyBraW5nICovCisgICAgICAgICAgY2hhciBidWZbM107CisgICAgICAgICAgREJ1c1N0cmluZyBoZXg7CisgICAgICAgICAgaW50IGhleF9lbmQ7CisgICAgICAgICAgCisgICAgICAgICAgKytwOworCisgICAgICAgICAgaWYgKChwICsgMikgPiBlbmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbiBELUJ1cyBhZGRyZXNzLCBwZXJjZW50IGNoYXJhY3RlciB3YXMgbm90IGZvbGxvd2VkIGJ5IHR3byBoZXggZGlnaXRzIik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgYnVmWzBdID0gKnA7CisgICAgICAgICAgKytwOworICAgICAgICAgIGJ1ZlsxXSA9ICpwOworICAgICAgICAgIGJ1ZlsyXSA9ICdcMCc7CisKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmhleCwgYnVmKTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2hleF9kZWNvZGUgKCZoZXgsIDAsICZoZXhfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZXNjYXBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAodW5lc2NhcGVkKSkpCisgICAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICAgIGlmIChoZXhfZW5kICE9IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbiBELUJ1cyBhZGRyZXNzLCBwZXJjZW50IGNoYXJhY3RlciB3YXMgZm9sbG93ZWQgYnkgY2hhcmFjdGVycyBvdGhlciB0aGFuIGhleCBkaWdpdHMiKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIEVycm9yLCBzaG91bGQgaGF2ZSBiZWVuIGVzY2FwZWQgKi8KKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQkFEX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJJbiBELUJ1cyBhZGRyZXNzLCBjaGFyYWN0ZXIgJyVjJyBzaG91bGQgaGF2ZSBiZWVuIGVzY2FwZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICpwKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgCisgICAgICArK3A7CisgICAgfQorCisgIHJldCA9IFRSVUU7CisgIAorIG91dDoKKyAgaWYgKCFyZXQgJiYgZXJyb3IgJiYgIWRidXNfZXJyb3JfaXNfc2V0IChlcnJvcikpCisgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworCisgIF9kYnVzX2Fzc2VydCAocmV0IHx8IGVycm9yID09IE5VTEwgfHwgZGJ1c19lcnJvcl9pc19zZXQgKGVycm9yKSk7CisgIAorICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIFBhcnNlcyBhbiBhZGRyZXNzIHN0cmluZyBvZiB0aGUgZm9ybToKKyAqCisgKiBtZXRob2Q6a2V5PXZhbHVlLGtleT12YWx1ZTttZXRob2Q6a2V5PXZhbHVlCisgKgorICogU2VlIHRoZSBELUJ1cyBzcGVjaWZpY2F0aW9uIGZvciBjb21wbGV0ZSBkb2NzIG9uIHRoZSBmb3JtYXQuCisgKgorICogV2hlbiBjb25uZWN0aW5nIHRvIGFuIGFkZHJlc3MsIHRoZSBmaXJzdCBhZGRyZXNzIGVudHJpZXMKKyAqIGluIHRoZSBzZW1pY29sb24tc2VwYXJhdGVkIGxpc3Qgc2hvdWxkIGJlIHRyaWVkIGZpcnN0LgorICogCisgKiBAcGFyYW0gYWRkcmVzcyB0aGUgYWRkcmVzcy4KKyAqIEBwYXJhbSBlbnRyeSByZXR1cm4gbG9jYXRpb24gdG8gYW4gYXJyYXkgb2YgZW50cmllcy4KKyAqIEBwYXJhbSBhcnJheV9sZW4gcmV0dXJuIGxvY2F0aW9uIGZvciBhcnJheSBsZW5ndGguCisgKiBAcGFyYW0gZXJyb3IgYWRkcmVzcyB3aGVyZSBhbiBlcnJvciBjYW4gYmUgcmV0dXJuZWQuCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0Ugb3RoZXJ3aXNlLgorICovCitkYnVzX2Jvb2xfdAorZGJ1c19wYXJzZV9hZGRyZXNzIChjb25zdCBjaGFyICAgICAgICAgKmFkZHJlc3MsCisJCSAgICBEQnVzQWRkcmVzc0VudHJ5ICoqKmVudHJ5LAorCQkgICAgaW50ICAgICAgICAgICAgICAgICphcnJheV9sZW4sCisgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgc3RyOworICBpbnQgcG9zLCBlbmRfcG9zLCBsZW4sIGk7CisgIERCdXNMaXN0ICplbnRyaWVzLCAqbGluazsKKyAgREJ1c0FkZHJlc3NFbnRyeSAqKmVudHJ5X2FycmF5OworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIGFkZHJlc3MpOworCisgIGVudHJpZXMgPSBOVUxMOworICBwb3MgPSAwOworICBsZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cik7CisKKyAgaWYgKGxlbiA9PSAwKQorICB7CisgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0JBRF9BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAiRW1wdHkgYWRkcmVzcyAnJXMnIiwgYWRkcmVzcyk7CisgICAgZ290byBlcnJvcjsKKyAgfQorICAKKyAgd2hpbGUgKHBvcyA8IGxlbikKKyAgICB7CisgICAgICBEQnVzQWRkcmVzc0VudHJ5ICplbnRyeTsKKworICAgICAgaW50IGZvdW5kX3BvczsKKworICAgICAgZW50cnkgPSBjcmVhdGVfZW50cnkgKCk7CisgICAgICBpZiAoIWVudHJ5KQorCXsKKwkgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworCisJICBnb3RvIGVycm9yOworCX0KKyAgICAgIAorICAgICAgLyogQXBwZW5kIHRoZSBlbnRyeSAqLworICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmVudHJpZXMsIGVudHJ5KSkKKwl7CisJICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKwkgIGRidXNfYWRkcmVzc19lbnRyeV9mcmVlIChlbnRyeSk7CisJICBnb3RvIGVycm9yOworCX0KKyAgICAgIAorICAgICAgLyogTG9vayBmb3IgYSBzZW1pLWNvbG9uICovCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19maW5kICgmc3RyLCBwb3MsICI7IiwgJmVuZF9wb3MpKQorCWVuZF9wb3MgPSBsZW47CisgICAgICAKKyAgICAgIC8qIExvb2sgZm9yIHRoZSBjb2xvbiA6ICovCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19maW5kX3RvICgmc3RyLCBwb3MsIGVuZF9wb3MsICI6IiwgJmZvdW5kX3BvcykpCisJeworCSAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0JBRF9BRERSRVNTLCAiQWRkcmVzcyBkb2VzIG5vdCBjb250YWluIGEgY29sb24iKTsKKwkgIGdvdG8gZXJyb3I7CisJfQorCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoJnN0ciwgcG9zLCBmb3VuZF9wb3MgLSBwb3MsICZlbnRyeS0+bWV0aG9kLCAwKSkKKwl7CisJICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKwkgIGdvdG8gZXJyb3I7CisJfQorCSAgCisgICAgICBwb3MgPSBmb3VuZF9wb3MgKyAxOworCisgICAgICB3aGlsZSAocG9zIDwgZW5kX3BvcykKKwl7CisJICBpbnQgY29tbWFfcG9zLCBlcXVhbHNfcG9zOworCisJICBpZiAoIV9kYnVzX3N0cmluZ19maW5kX3RvICgmc3RyLCBwb3MsIGVuZF9wb3MsICIsIiwgJmNvbW1hX3BvcykpCisJICAgIGNvbW1hX3BvcyA9IGVuZF9wb3M7CisJICAKKwkgIGlmICghX2RidXNfc3RyaW5nX2ZpbmRfdG8gKCZzdHIsIHBvcywgY29tbWFfcG9zLCAiPSIsICZlcXVhbHNfcG9zKSB8fAorCSAgICAgIGVxdWFsc19wb3MgPT0gcG9zIHx8IGVxdWFsc19wb3MgKyAxID09IGNvbW1hX3BvcykKKwkgICAgeworCSAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInPScgY2hhcmFjdGVyIG5vdCBmb3VuZCBvciBoYXMgbm8gdmFsdWUgZm9sbG93aW5nIGl0Iik7CisgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIERCdXNTdHJpbmcgKmtleTsKKwkgICAgICBEQnVzU3RyaW5nICp2YWx1ZTsKKworCSAgICAgIGtleSA9IGRidXNfbmV3MCAoREJ1c1N0cmluZywgMSk7CisKKwkgICAgICBpZiAoIWtleSkKKwkJeworCQkgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOwkJICAKKwkJICBnb3RvIGVycm9yOworCQl9CisKKwkgICAgICB2YWx1ZSA9IGRidXNfbmV3MCAoREJ1c1N0cmluZywgMSk7CisJICAgICAgaWYgKCF2YWx1ZSkKKwkJeworCQkgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworCQkgIGRidXNfZnJlZSAoa2V5KTsKKwkJICBnb3RvIGVycm9yOworCQl9CisJICAgICAgCisJICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoa2V5KSkKKwkJeworCQkgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworCQkgIGRidXNfZnJlZSAoa2V5KTsKKwkJICBkYnVzX2ZyZWUgKHZhbHVlKTsKKwkJICAKKwkJICBnb3RvIGVycm9yOworCQl9CisJICAgICAgCisJICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAodmFsdWUpKQorCQl7CisJCSAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisJCSAgX2RidXNfc3RyaW5nX2ZyZWUgKGtleSk7CisKKwkJICBkYnVzX2ZyZWUgKGtleSk7CisJCSAgZGJ1c19mcmVlICh2YWx1ZSk7CQkgIAorCQkgIGdvdG8gZXJyb3I7CisJCX0KKworCSAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuICgmc3RyLCBwb3MsIGVxdWFsc19wb3MgLSBwb3MsIGtleSwgMCkpCisJCXsKKwkJICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKwkJICBfZGJ1c19zdHJpbmdfZnJlZSAoa2V5KTsKKwkJICBfZGJ1c19zdHJpbmdfZnJlZSAodmFsdWUpOworCisJCSAgZGJ1c19mcmVlIChrZXkpOworCQkgIGRidXNfZnJlZSAodmFsdWUpOwkJICAKKwkJICBnb3RvIGVycm9yOworCQl9CisKKwkgICAgICBpZiAoIWFwcGVuZF91bmVzY2FwZWRfdmFsdWUgKHZhbHVlLCAmc3RyLCBlcXVhbHNfcG9zICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYV9wb3MgLSBlcXVhbHNfcG9zIC0gMSwgZXJyb3IpKQorCQl7CisgICAgICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKGVycm9yID09IE5VTEwgfHwgZGJ1c19lcnJvcl9pc19zZXQgKGVycm9yKSk7CisJCSAgX2RidXNfc3RyaW5nX2ZyZWUgKGtleSk7CisJCSAgX2RidXNfc3RyaW5nX2ZyZWUgKHZhbHVlKTsKKworCQkgIGRidXNfZnJlZSAoa2V5KTsKKwkJICBkYnVzX2ZyZWUgKHZhbHVlKTsJCSAgCisJCSAgZ290byBlcnJvcjsKKwkJfQorCisJICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmVudHJ5LT5rZXlzLCBrZXkpKQorCQl7CisJCSAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CQkgIAorCQkgIF9kYnVzX3N0cmluZ19mcmVlIChrZXkpOworCQkgIF9kYnVzX3N0cmluZ19mcmVlICh2YWx1ZSk7CisKKwkJICBkYnVzX2ZyZWUgKGtleSk7CisJCSAgZGJ1c19mcmVlICh2YWx1ZSk7CQkgIAorCQkgIGdvdG8gZXJyb3I7CisJCX0KKworCSAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZlbnRyeS0+dmFsdWVzLCB2YWx1ZSkpCisJCXsKKwkJICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsJCSAgCisJCSAgX2RidXNfc3RyaW5nX2ZyZWUgKHZhbHVlKTsKKworCQkgIGRidXNfZnJlZSAodmFsdWUpOworCQkgIGdvdG8gZXJyb3I7CQkgIAorCQl9CisJICAgIH0KKworCSAgcG9zID0gY29tbWFfcG9zICsgMTsKKwl9CisKKyAgICAgIHBvcyA9IGVuZF9wb3MgKyAxOworICAgIH0KKworICAqYXJyYXlfbGVuID0gX2RidXNfbGlzdF9nZXRfbGVuZ3RoICgmZW50cmllcyk7CisgIAorICBlbnRyeV9hcnJheSA9IGRidXNfbmV3IChEQnVzQWRkcmVzc0VudHJ5ICosICphcnJheV9sZW4gKyAxKTsKKworICBpZiAoIWVudHJ5X2FycmF5KQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgCisgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgCisgIGVudHJ5X2FycmF5IFsqYXJyYXlfbGVuXSA9IE5VTEw7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZlbnRyaWVzKTsKKyAgaSA9IDA7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgZW50cnlfYXJyYXlbaV0gPSBsaW5rLT5kYXRhOworICAgICAgaSsrOworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmVudHJpZXMsIGxpbmspOworICAgIH0KKworICBfZGJ1c19saXN0X2NsZWFyICgmZW50cmllcyk7CisgICplbnRyeSA9IGVudHJ5X2FycmF5OworCisgIHJldHVybiBUUlVFOworCisgZXJyb3I6CisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmVudHJpZXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfYWRkcmVzc19lbnRyeV9mcmVlIChsaW5rLT5kYXRhKTsKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZlbnRyaWVzLCBsaW5rKTsKKyAgICB9CisKKyAgX2RidXNfbGlzdF9jbGVhciAoJmVudHJpZXMpOworICAKKyAgcmV0dXJuIEZBTFNFOworICAKK30KKworLyoqCisgKiBFc2NhcGVzIHRoZSBnaXZlbiBzdHJpbmcgYXMgYSB2YWx1ZSBpbiBhIGtleT12YWx1ZSBwYWlyCisgKiBmb3IgYSBELUJ1cyBhZGRyZXNzLgorICoKKyAqIEBwYXJhbSB2YWx1ZSB0aGUgdW5lc2NhcGVkIHZhbHVlCisgKiBAcmV0dXJucyBuZXdseS1hbGxvY2F0ZWQgZXNjYXBlZCB2YWx1ZSBvciAjTlVMTCBpZiBubyBtZW1vcnkKKyAqLworY2hhcioKK2RidXNfYWRkcmVzc19lc2NhcGVfdmFsdWUgKGNvbnN0IGNoYXIgKnZhbHVlKQoreworICBEQnVzU3RyaW5nIGVzY2FwZWQ7CisgIERCdXNTdHJpbmcgdW5lc2NhcGVkOworICBjaGFyICpyZXQ7CisKKyAgcmV0ID0gTlVMTDsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnVuZXNjYXBlZCwgdmFsdWUpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmVzY2FwZWQpKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghX2RidXNfYWRkcmVzc19hcHBlbmRfZXNjYXBlZCAoJmVzY2FwZWQsICZ1bmVzY2FwZWQpKQorICAgIGdvdG8gb3V0OworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJmVzY2FwZWQsICZyZXQpKQorICAgIGdvdG8gb3V0OworCisgb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmVzY2FwZWQpOworICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIFVuZXNjYXBlcyB0aGUgZ2l2ZW4gc3RyaW5nIGFzIGEgdmFsdWUgaW4gYSBrZXk9dmFsdWUgcGFpcgorICogZm9yIGEgRC1CdXMgYWRkcmVzcy4gTm90ZSB0aGF0IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUoKQorICogcmV0dXJucyBhbiBhbHJlYWR5LXVuZXNjYXBlZCB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gdmFsdWUgdGhlIGVzY2FwZWQgdmFsdWUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciB0byBzZXQgaWYgdGhlIHVuZXNjYXBpbmcgZmFpbHMKKyAqIEByZXR1cm5zIG5ld2x5LWFsbG9jYXRlZCB1bmVzY2FwZWQgdmFsdWUgb3IgI05VTEwgaWYgbm8gbWVtb3J5CisgKi8KK2NoYXIqCitkYnVzX2FkZHJlc3NfdW5lc2NhcGVfdmFsdWUgKGNvbnN0IGNoYXIgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyB1bmVzY2FwZWQ7CisgIERCdXNTdHJpbmcgZXNjYXBlZDsKKyAgY2hhciAqcmV0OworICAKKyAgcmV0ID0gTlVMTDsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmVzY2FwZWQsIHZhbHVlKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ1bmVzY2FwZWQpKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghYXBwZW5kX3VuZXNjYXBlZF92YWx1ZSAoJnVuZXNjYXBlZCwgJmVzY2FwZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZlc2NhcGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgZ290byBvdXQ7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgmdW5lc2NhcGVkLCAmcmV0KSkKKyAgICBnb3RvIG91dDsKKworIG91dDoKKyAgaWYgKHJldCA9PSBOVUxMICYmIGVycm9yICYmICFkYnVzX2Vycm9yX2lzX3NldCAoZXJyb3IpKQorICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKworICBfZGJ1c19hc3NlcnQgKHJldCAhPSBOVUxMIHx8IGVycm9yID09IE5VTEwgfHwgZGJ1c19lcnJvcl9pc19zZXQgKGVycm9yKSk7CisgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnVuZXNjYXBlZCk7CisgIHJldHVybiByZXQ7Cit9CisKKy8qKiBAfSAqLyAvKiBFbmQgb2YgcHVibGljIEFQSSAqLworCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworCisjaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUworCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbnN0IGNoYXIgKmVzY2FwZWQ7CisgIGNvbnN0IGNoYXIgKnVuZXNjYXBlZDsKK30gRXNjYXBlVGVzdDsKKworc3RhdGljIGNvbnN0IEVzY2FwZVRlc3QgZXNjYXBlX3Rlc3RzW10gPSB7CisgIHsgImFiY2RlIiwgImFiY2RlIiB9LAorICB7ICIiLCAiIiB9LAorICB7ICIlMjAlMjAiLCAiICAiIH0sCisgIHsgIiUyNCIsICIkIiB9LAorICB7ICIlMjUiLCAiJSIgfSwKKyAgeyAiYWJjJTI0IiwgImFiYyQiIH0sCisgIHsgIiUyNGFiYyIsICIkYWJjIiB9LAorICB7ICJhYmMlMjRhYmMiLCAiYWJjJGFiYyIgfSwKKyAgeyAiLyIsICIvIiB9LAorICB7ICItIiwgIi0iIH0sCisgIHsgIl8iLCAiXyIgfSwKKyAgeyAiQSIsICJBIiB9LAorICB7ICJJIiwgIkkiIH0sCisgIHsgIloiLCAiWiIgfSwKKyAgeyAiYSIsICJhIiB9LAorICB7ICJpIiwgImkiIH0sCisgIHsgInoiLCAieiIgfQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIGludmFsaWRfZXNjYXBlZF92YWx1ZXNbXSA9IHsKKyAgIiVhIiwKKyAgIiVxIiwKKyAgIiVheiIsCisgICIlJSIsCisgICIlJCQiLAorICAiYWJjJWEiLAorICAiJWF4eXoiLAorICAiJSIsCisgICIkIiwKKyAgIiAiLAorfTsKKworZGJ1c19ib29sX3QKK19kYnVzX2FkZHJlc3NfdGVzdCAodm9pZCkKK3sKKyAgREJ1c0FkZHJlc3NFbnRyeSAqKmVudHJpZXM7CisgIGludCBsZW47CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgaW50IGk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgX0RCVVNfTl9FTEVNRU5UUyAoZXNjYXBlX3Rlc3RzKSkKKyAgICB7CisgICAgICBjb25zdCBFc2NhcGVUZXN0ICp0ZXN0ID0gJmVzY2FwZV90ZXN0c1tpXTsKKyAgICAgIGNoYXIgKmVzY2FwZWQ7CisgICAgICBjaGFyICp1bmVzY2FwZWQ7CisKKyAgICAgIGVzY2FwZWQgPSBkYnVzX2FkZHJlc3NfZXNjYXBlX3ZhbHVlICh0ZXN0LT51bmVzY2FwZWQpOworICAgICAgaWYgKGVzY2FwZWQgPT0gTlVMTCkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgICAgIGlmIChzdHJjbXAgKGVzY2FwZWQsIHRlc3QtPmVzY2FwZWQpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiRXNjYXBlZCAnJXMnIGFzICclcycgc2hvdWxkIGhhdmUgYmVlbiAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHRlc3QtPnVuZXNjYXBlZCwgZXNjYXBlZCwgdGVzdC0+ZXNjYXBlZCk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKyAgICAgIGRidXNfZnJlZSAoZXNjYXBlZCk7CisKKyAgICAgIHVuZXNjYXBlZCA9IGRidXNfYWRkcmVzc191bmVzY2FwZV92YWx1ZSAodGVzdC0+ZXNjYXBlZCwgJmVycm9yKTsKKyAgICAgIGlmICh1bmVzY2FwZWQgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gdW5lc2NhcGUgJyVzJzogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgdGVzdC0+ZXNjYXBlZCwgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisKKyAgICAgIGlmIChzdHJjbXAgKHVuZXNjYXBlZCwgdGVzdC0+dW5lc2NhcGVkKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIlVuZXNjYXBlZCAnJXMnIGFzICclcycgc2hvdWxkIGhhdmUgYmVlbiAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHRlc3QtPmVzY2FwZWQsIHVuZXNjYXBlZCwgdGVzdC0+dW5lc2NhcGVkKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorICAgICAgZGJ1c19mcmVlICh1bmVzY2FwZWQpOworICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIGkgPSAwOworICB3aGlsZSAoaSA8IF9EQlVTX05fRUxFTUVOVFMgKGludmFsaWRfZXNjYXBlZF92YWx1ZXMpKQorICAgIHsKKyAgICAgIGNoYXIgKnVuZXNjYXBlZDsKKworICAgICAgdW5lc2NhcGVkID0gZGJ1c19hZGRyZXNzX3VuZXNjYXBlX3ZhbHVlIChpbnZhbGlkX2VzY2FwZWRfdmFsdWVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpOworICAgICAgaWYgKHVuZXNjYXBlZCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIlNob3VsZCBub3QgaGF2ZSBzdWNjZXNzZnVsbHkgdW5lc2NhcGVkICclcycgdG8gJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkX2VzY2FwZWRfdmFsdWVzW2ldLCB1bmVzY2FwZWQpOworICAgICAgICAgIGRidXNfZnJlZSAodW5lc2NhcGVkKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c19hc3NlcnQgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICAgICAgKytpOworICAgIH0KKyAgCisgIGlmICghZGJ1c19wYXJzZV9hZGRyZXNzICgidW5peDpwYXRoPS90bXAvZm9vO2RlYnVnOm5hbWU9dGVzdCxzbGlmZj1zbG9mZjsiLAorCQkJICAgJmVudHJpZXMsICZsZW4sICZlcnJvcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IHBhcnNlIGFkZHJlc3MiKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPT0gMik7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyaWVzWzBdLCAicGF0aCIpLCAiL3RtcC9mb28iKSA9PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJpZXNbMV0sICJuYW1lIiksICJ0ZXN0IikgPT0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyaWVzWzFdLCAic2xpZmYiKSwgInNsb2ZmIikgPT0gMCk7CisgIAorICBkYnVzX2FkZHJlc3NfZW50cmllc19mcmVlIChlbnRyaWVzKTsKKworICAvKiBEaWZmZXJlbnQgcG9zc2libGUgZXJyb3JzICovCisgIGlmIChkYnVzX3BhcnNlX2FkZHJlc3MgKCIiLCAmZW50cmllcywgJmxlbiwgJmVycm9yKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJQYXJzZWQgaW5jb3JyZWN0IGFkZHJlc3MuIik7CisgIGVsc2UKKyAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgaWYgKGRidXNfcGFyc2VfYWRkcmVzcyAoImZvbyIsICZlbnRyaWVzLCAmbGVuLCAmZXJyb3IpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlBhcnNlZCBpbmNvcnJlY3QgYWRkcmVzcy4iKTsKKyAgZWxzZQorICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgCisgIGlmIChkYnVzX3BhcnNlX2FkZHJlc3MgKCJmb286YmFyIiwgJmVudHJpZXMsICZsZW4sICZlcnJvcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiUGFyc2VkIGluY29ycmVjdCBhZGRyZXNzLiIpOworICBlbHNlCisgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAKKyAgaWYgKGRidXNfcGFyc2VfYWRkcmVzcyAoImZvbzpiYXIsYmF6IiwgJmVudHJpZXMsICZsZW4sICZlcnJvcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiUGFyc2VkIGluY29ycmVjdCBhZGRyZXNzLiIpOworICBlbHNlCisgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAKKyAgaWYgKGRidXNfcGFyc2VfYWRkcmVzcyAoImZvbzpiYXI9Zm9vLGJheiIsICZlbnRyaWVzLCAmbGVuLCAmZXJyb3IpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlBhcnNlZCBpbmNvcnJlY3QgYWRkcmVzcy4iKTsKKyAgZWxzZQorICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgCisgIGlmIChkYnVzX3BhcnNlX2FkZHJlc3MgKCJmb286YmFyPWZvbztiYXoiLCAmZW50cmllcywgJmxlbiwgJmVycm9yKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJQYXJzZWQgaW5jb3JyZWN0IGFkZHJlc3MuIik7CisgIGVsc2UKKyAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgIAorICBpZiAoZGJ1c19wYXJzZV9hZGRyZXNzICgiZm9vOj1mb28iLCAmZW50cmllcywgJmxlbiwgJmVycm9yKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJQYXJzZWQgaW5jb3JyZWN0IGFkZHJlc3MuIik7CisgIGVsc2UKKyAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgIAorICBpZiAoZGJ1c19wYXJzZV9hZGRyZXNzICgiZm9vOmZvbz0iLCAmZW50cmllcywgJmxlbiwgJmVycm9yKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJQYXJzZWQgaW5jb3JyZWN0IGFkZHJlc3MuIik7CisgIGVsc2UKKyAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgaWYgKGRidXNfcGFyc2VfYWRkcmVzcyAoImZvbzpmb28sYmFyPWJheiIsICZlbnRyaWVzLCAmbGVuLCAmZXJyb3IpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlBhcnNlZCBpbmNvcnJlY3QgYWRkcmVzcy4iKTsKKyAgZWxzZQorICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qICFET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1hZGRyZXNzLmggYi9kYnVzL2RidXMvZGJ1cy1hZGRyZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUxZWYwYQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLWFkZHJlc3MuaApAQCAtMCwwICsxLDY3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtYWRkcmVzcy5oICBTZXJ2ZXIgYWRkcmVzcyBwYXJzZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmICFkZWZpbmVkIChEQlVTX0lOU0lERV9EQlVTX0gpICYmICFkZWZpbmVkIChEQlVTX0NPTVBJTEFUSU9OKQorI2Vycm9yICJPbmx5IDxkYnVzL2RidXMuaD4gY2FuIGJlIGluY2x1ZGVkIGRpcmVjdGx5LCB0aGlzIGZpbGUgbWF5IGRpc2FwcGVhciBvciBjaGFuZ2UgY29udGVudHMuIgorI2VuZGlmCisKKyNpZm5kZWYgREJVU19BRERSRVNTX0gKKyNkZWZpbmUgREJVU19BRERSRVNTX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKworREJVU19CRUdJTl9ERUNMUworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNBZGRyZXNzCisgKiBAeworICovCisKKy8qKiBPcGFxdWUgdHlwZSByZXByZXNlbnRpbmcgb25lIG9mIHRoZSBzZW1pY29sb24tc2VwYXJhdGVkIGl0ZW1zIGluIGFuIGFkZHJlc3MgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNBZGRyZXNzRW50cnkgREJ1c0FkZHJlc3NFbnRyeTsKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfcGFyc2VfYWRkcmVzcyAgICAgICAgICAgIChjb25zdCBjaGFyICAgICAgICAgKmFkZHJlc3MsCisJCQkJCSAgIERCdXNBZGRyZXNzRW50cnkgKioqZW50cnksCisJCQkJCSAgIGludCAgICAgICAgICAgICAgICAqYXJyYXlfbGVuLAorCQkJCQkgICBEQnVzRXJyb3IgICAgICAgICAgKmVycm9yKTsKK0RCVVNfRVhQT1JUCitjb25zdCBjaGFyICpkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlICAoREJ1c0FkZHJlc3NFbnRyeSAgICplbnRyeSwKKwkJCQkJICAgY29uc3QgY2hhciAgICAgICAgICprZXkpOworREJVU19FWFBPUlQKK2NvbnN0IGNoYXIgKmRidXNfYWRkcmVzc19lbnRyeV9nZXRfbWV0aG9kIChEQnVzQWRkcmVzc0VudHJ5ICAgKmVudHJ5KTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX2FkZHJlc3NfZW50cmllc19mcmVlICAgICAoREJ1c0FkZHJlc3NFbnRyeSAgKiplbnRyaWVzKTsKKworREJVU19FWFBPUlQKK2NoYXIqIGRidXNfYWRkcmVzc19lc2NhcGVfdmFsdWUgICAoY29uc3QgY2hhciAqdmFsdWUpOworREJVU19FWFBPUlQKK2NoYXIqIGRidXNfYWRkcmVzc191bmVzY2FwZV92YWx1ZSAoY29uc3QgY2hhciAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKTsKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX0FERFJFU1NfSCAqLworCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1hcmNoLWRlcHMuaCBiL2RidXMvZGJ1cy9kYnVzLWFyY2gtZGVwcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MzU5YzgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1hcmNoLWRlcHMuaApAQCAtMCwwICsxLDY3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IiAtKi0gKi8KKy8qIGRidXMtYXJjaC1kZXBzLmggSGVhZGVyIHdpdGggYXJjaGl0ZWN0dXJlL2NvbXBpbGVyIHNwZWNpZmljIGluZm9ybWF0aW9uLCBpbnN0YWxsZWQgdG8gbGliZGlyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4wCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZiAhZGVmaW5lZCAoREJVU19JTlNJREVfREJVU19IKSAmJiAhZGVmaW5lZCAoREJVU19DT01QSUxBVElPTikKKyNlcnJvciAiT25seSA8ZGJ1cy9kYnVzLmg+IGNhbiBiZSBpbmNsdWRlZCBkaXJlY3RseSwgdGhpcyBmaWxlIG1heSBkaXNhcHBlYXIgb3IgY2hhbmdlIGNvbnRlbnRzLiIKKyNlbmRpZgorCisjaWZuZGVmIERCVVNfQVJDSF9ERVBTX0gKKyNkZWZpbmUgREJVU19BUkNIX0RFUFNfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKyNpZiAxCisjZGVmaW5lIERCVVNfSEFWRV9JTlQ2NCAxCitfREJVU19HTlVDX0VYVEVOU0lPTiB0eXBlZGVmIGxvbmcgbG9uZyBkYnVzX2ludDY0X3Q7CitfREJVU19HTlVDX0VYVEVOU0lPTiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBkYnVzX3VpbnQ2NF90OworCisjZGVmaW5lIERCVVNfSU5UNjRfQ09OU1RBTlQodmFsKSAgKF9EQlVTX0dOVUNfRVhURU5TSU9OICh2YWwjI0xMKSkKKyNkZWZpbmUgREJVU19VSU5UNjRfQ09OU1RBTlQodmFsKSAoX0RCVVNfR05VQ19FWFRFTlNJT04gKHZhbCMjVUxMKSkKKworI2Vsc2UKKyN1bmRlZiBEQlVTX0hBVkVfSU5UNjQKKyN1bmRlZiBEQlVTX0lOVDY0X0NPTlNUQU5UCisjdW5kZWYgREJVU19VSU5UNjRfQ09OU1RBTlQKKyNlbmRpZgorCit0eXBlZGVmIGludCBkYnVzX2ludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBkYnVzX3VpbnQzMl90OworCit0eXBlZGVmIHNob3J0IGRidXNfaW50MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgZGJ1c191aW50MTZfdDsKKworLyogVGhpcyBpcyBub3QgcmVhbGx5IGFyY2gtZGVwZW5kZW50LCBidXQgaXQncyBub3Qgd29ydGgKKyAqIGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgZ2VuZXJhdGVkIGhlYWRlciBqdXN0IGZvciB0aGlzCisgKi8KKyNkZWZpbmUgREJVU19NQUpPUl9WRVJTSU9OIDEKKyNkZWZpbmUgREJVU19NSU5PUl9WRVJTSU9OIDQKKyNkZWZpbmUgREJVU19NSUNST19WRVJTSU9OIDAKKworI2RlZmluZSBEQlVTX1ZFUlNJT05fU1RSSU5HICIxLjQuMCIKKworI2RlZmluZSBEQlVTX1ZFUlNJT04gKCgxIDw8IDE2KSB8ICg0IDw8IDgpIHwgKDApKSAKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfQVJDSF9ERVBTX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLWFyY2gtZGVwcy5oLmluIGIvZGJ1cy9kYnVzL2RidXMtYXJjaC1kZXBzLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU5NTJjZgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLWFyY2gtZGVwcy5oLmluCkBAIC0wLDAgKzEsNjcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiIC0qLSAqLworLyogZGJ1cy1hcmNoLWRlcHMuaCBIZWFkZXIgd2l0aCBhcmNoaXRlY3R1cmUvY29tcGlsZXIgc3BlY2lmaWMgaW5mb3JtYXRpb24sIGluc3RhbGxlZCB0byBsaWJkaXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjAKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmICFkZWZpbmVkIChEQlVTX0lOU0lERV9EQlVTX0gpICYmICFkZWZpbmVkIChEQlVTX0NPTVBJTEFUSU9OKQorI2Vycm9yICJPbmx5IDxkYnVzL2RidXMuaD4gY2FuIGJlIGluY2x1ZGVkIGRpcmVjdGx5LCB0aGlzIGZpbGUgbWF5IGRpc2FwcGVhciBvciBjaGFuZ2UgY29udGVudHMuIgorI2VuZGlmCisKKyNpZm5kZWYgREJVU19BUkNIX0RFUFNfSAorI2RlZmluZSBEQlVTX0FSQ0hfREVQU19ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFjcm9zLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworI2lmIEBEQlVTX0hBVkVfSU5UNjRACisjZGVmaW5lIERCVVNfSEFWRV9JTlQ2NCAxCitfREJVU19HTlVDX0VYVEVOU0lPTiB0eXBlZGVmIEBEQlVTX0lOVDY0X1RZUEVAIGRidXNfaW50NjRfdDsKK19EQlVTX0dOVUNfRVhURU5TSU9OIHR5cGVkZWYgdW5zaWduZWQgQERCVVNfSU5UNjRfVFlQRUAgZGJ1c191aW50NjRfdDsKKworI2RlZmluZSBEQlVTX0lOVDY0X0NPTlNUQU5UKHZhbCkgIChfREJVU19HTlVDX0VYVEVOU0lPTiBAREJVU19JTlQ2NF9DT05TVEFOVEApCisjZGVmaW5lIERCVVNfVUlOVDY0X0NPTlNUQU5UKHZhbCkgKF9EQlVTX0dOVUNfRVhURU5TSU9OIEBEQlVTX1VJTlQ2NF9DT05TVEFOVEApCisKKyNlbHNlCisjdW5kZWYgREJVU19IQVZFX0lOVDY0CisjdW5kZWYgREJVU19JTlQ2NF9DT05TVEFOVAorI3VuZGVmIERCVVNfVUlOVDY0X0NPTlNUQU5UCisjZW5kaWYKKwordHlwZWRlZiBAREJVU19JTlQzMl9UWVBFQCBkYnVzX2ludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIEBEQlVTX0lOVDMyX1RZUEVAIGRidXNfdWludDMyX3Q7CisKK3R5cGVkZWYgQERCVVNfSU5UMTZfVFlQRUAgZGJ1c19pbnQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBAREJVU19JTlQxNl9UWVBFQCBkYnVzX3VpbnQxNl90OworCisvKiBUaGlzIGlzIG5vdCByZWFsbHkgYXJjaC1kZXBlbmRlbnQsIGJ1dCBpdCdzIG5vdCB3b3J0aAorICogY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBnZW5lcmF0ZWQgaGVhZGVyIGp1c3QgZm9yIHRoaXMKKyAqLworI2RlZmluZSBEQlVTX01BSk9SX1ZFUlNJT04gQERCVVNfTUFKT1JfVkVSU0lPTkAKKyNkZWZpbmUgREJVU19NSU5PUl9WRVJTSU9OIEBEQlVTX01JTk9SX1ZFUlNJT05ACisjZGVmaW5lIERCVVNfTUlDUk9fVkVSU0lPTiBAREJVU19NSUNST19WRVJTSU9OQAorCisjZGVmaW5lIERCVVNfVkVSU0lPTl9TVFJJTkcgIkBEQlVTX1ZFUlNJT05AIgorCisjZGVmaW5lIERCVVNfVkVSU0lPTiAoKEBEQlVTX01BSk9SX1ZFUlNJT05AIDw8IDE2KSB8IChAREJVU19NSU5PUl9WRVJTSU9OQCA8PCA4KSB8IChAREJVU19NSUNST19WRVJTSU9OQCkpIAorCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19BUkNIX0RFUFNfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtYXV0aC1zY3JpcHQuYyBiL2RidXMvZGJ1cy9kYnVzLWF1dGgtc2NyaXB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI4NWUzYgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLWF1dGgtc2NyaXB0LmMKQEAgLTAsMCArMSw4MDMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1hdXRoLXNjcmlwdC5jIFRlc3QgREJ1c0F1dGggdXNpbmcgYSBzcGVjaWFsIHNjcmlwdCBmaWxlIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKworI2luY2x1ZGUgImRidXMtYXV0aC1zY3JpcHQuaCIKKyNpbmNsdWRlICJkYnVzLWF1dGguaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorI2luY2x1ZGUgImRidXMtaGFzaC5oIgorI2luY2x1ZGUgImRidXMtY3JlZGVudGlhbHMuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzQXV0aFNjcmlwdCBjb2RlIGZvciBydW5uaW5nIHVuaXQgdGVzdCBzY3JpcHRzIGZvciBEQnVzQXV0aAorICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBEQnVzQXV0aCB1bml0IHRlc3Qgc2NyaXB0aW5nCisgKgorICogVGhlIGNvZGUgaW4gaGVyZSBpcyB1c2VkIGZvciB1bml0IHRlc3RpbmcsIGl0IGxvYWRzCisgKiB1cCBhIHNjcmlwdCB0aGF0IHRlc3RzIERCdXNBdXRoLgorICoKKyAqIEB7CisgKi8KKworLyogdGhpcyBpcyBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSB0aGUgb3RoZXIgYXBwZW5kX3F1b3RlZF9zdHJpbmcKKyAqIGluIGRidXMtbWVzc2FnZS1idWlsZGVyLmMKKyAqLworc3RhdGljIGRidXNfYm9vbF90CithcHBlbmRfcXVvdGVkX3N0cmluZyAoREJ1c1N0cmluZyAgICAgICAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpxdW90ZWQpCit7CisgIGRidXNfYm9vbF90IGluX3F1b3RlcyA9IEZBTFNFOworICBkYnVzX2Jvb2xfdCBpbl9iYWNrc2xhc2ggPSBGQUxTRTsKKyAgaW50IGk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHF1b3RlZCkpCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciBiOworCisgICAgICBiID0gX2RidXNfc3RyaW5nX2dldF9ieXRlIChxdW90ZWQsIGkpOworCisgICAgICBpZiAoaW5fYmFja3NsYXNoKQorICAgICAgICB7CisgICAgICAgICAgdW5zaWduZWQgY2hhciBhOworICAgICAgICAgIAorICAgICAgICAgIGlmIChiID09ICdyJykKKyAgICAgICAgICAgIGEgPSAnXHInOworICAgICAgICAgIGVsc2UgaWYgKGIgPT0gJ24nKQorICAgICAgICAgICAgYSA9ICdcbic7CisgICAgICAgICAgZWxzZSBpZiAoYiA9PSAnXFwnKQorICAgICAgICAgICAgYSA9ICdcXCc7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiYmFkIGJhY2tzbGFzaGVkIGJ5dGUgJWNcbiIsIGIpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoZGVzdCwgYSkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgCisgICAgICAgICAgaW5fYmFja3NsYXNoID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGIgPT0gJ1xcJykKKyAgICAgICAgeworICAgICAgICAgIGluX2JhY2tzbGFzaCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGluX3F1b3RlcykKKyAgICAgICAgeworICAgICAgICAgIGlmIChiID09ICdcJycpCisgICAgICAgICAgICBpbl9xdW90ZXMgPSBGQUxTRTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChkZXN0LCBiKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmIChiID09ICdcJycpCisgICAgICAgICAgICBpbl9xdW90ZXMgPSBUUlVFOworICAgICAgICAgIGVsc2UgaWYgKGIgPT0gJyAnIHx8IGIgPT0gJ1xuJyB8fCBiID09ICdcdCcpCisgICAgICAgICAgICBicmVhazsgLyogZW5kIG9uIHdoaXRlc3BhY2UgaWYgbm90IHF1b3RlZCAqLworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKGRlc3QsIGIpKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NhbWVfZmlyc3Rfd29yZCAoY29uc3QgREJ1c1N0cmluZyAqYSwKKyAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYikKK3sKKyAgaW50IGZpcnN0X2FfYmxhbmssIGZpcnN0X2JfYmxhbms7CisKKyAgX2RidXNfc3RyaW5nX2ZpbmRfYmxhbmsgKGEsIDAsICZmaXJzdF9hX2JsYW5rKTsKKyAgX2RidXNfc3RyaW5nX2ZpbmRfYmxhbmsgKGIsIDAsICZmaXJzdF9iX2JsYW5rKTsKKworICBpZiAoZmlyc3RfYV9ibGFuayAhPSBmaXJzdF9iX2JsYW5rKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gX2RidXNfc3RyaW5nX2VxdWFsX2xlbiAoYSwgYiwgZmlyc3RfYV9ibGFuayk7Cit9CisKK3N0YXRpYyBEQnVzQXV0aFN0YXRlCithdXRoX3N0YXRlX2Zyb21fc3RyaW5nIChjb25zdCBEQnVzU3RyaW5nICpzdHIpCit7IAorICBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyIChzdHIsICJXQUlUSU5HX0ZPUl9JTlBVVCIpKQorICAgIHJldHVybiBEQlVTX0FVVEhfU1RBVEVfV0FJVElOR19GT1JfSU5QVVQ7CisgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoc3RyLCAiV0FJVElOR19GT1JfTUVNT1JZIikpCisgICAgcmV0dXJuIERCVVNfQVVUSF9TVEFURV9XQUlUSU5HX0ZPUl9NRU1PUlk7CisgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoc3RyLCAiSEFWRV9CWVRFU19UT19TRU5EIikpCisgICAgcmV0dXJuIERCVVNfQVVUSF9TVEFURV9IQVZFX0JZVEVTX1RPX1NFTkQ7CisgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoc3RyLCAiTkVFRF9ESVNDT05ORUNUIikpCisgICAgcmV0dXJuIERCVVNfQVVUSF9TVEFURV9ORUVEX0RJU0NPTk5FQ1Q7CisgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoc3RyLCAiQVVUSEVOVElDQVRFRCIpKQorICAgIHJldHVybiBEQlVTX0FVVEhfU1RBVEVfQVVUSEVOVElDQVRFRDsKKyAgZWxzZQorICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqCithdXRoX3N0YXRlX3RvX3N0cmluZyAoREJ1c0F1dGhTdGF0ZSBzdGF0ZSkKK3sKKyAgc3dpdGNoIChzdGF0ZSkKKyAgICB7CisgICAgY2FzZSBEQlVTX0FVVEhfU1RBVEVfV0FJVElOR19GT1JfSU5QVVQ6CisgICAgICByZXR1cm4gIldBSVRJTkdfRk9SX0lOUFVUIjsKKyAgICBjYXNlIERCVVNfQVVUSF9TVEFURV9XQUlUSU5HX0ZPUl9NRU1PUlk6CisgICAgICByZXR1cm4gIldBSVRJTkdfRk9SX01FTU9SWSI7CisgICAgY2FzZSBEQlVTX0FVVEhfU1RBVEVfSEFWRV9CWVRFU19UT19TRU5EOgorICAgICAgcmV0dXJuICJIQVZFX0JZVEVTX1RPX1NFTkQiOworICAgIGNhc2UgREJVU19BVVRIX1NUQVRFX05FRURfRElTQ09OTkVDVDoKKyAgICAgIHJldHVybiAiTkVFRF9ESVNDT05ORUNUIjsKKyAgICBjYXNlIERCVVNfQVVUSF9TVEFURV9BVVRIRU5USUNBVEVEOgorICAgICAgcmV0dXJuICJBVVRIRU5USUNBVEVEIjsKKyAgICB9CisKKyAgcmV0dXJuICJ1bmtub3duIjsKK30KKworc3RhdGljIGNoYXIgKioKK3NwbGl0X3N0cmluZyAoREJ1c1N0cmluZyAqc3RyKQoreworICBpbnQgaSwgaiwgaywgY291bnQsIGVuZDsKKyAgY2hhciAqKmFycmF5OworCisgIGVuZCA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworCisgIGkgPSAwOworICBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAoc3RyLCBpLCAmaSk7CisgIGZvciAoY291bnQgPSAwOyBpIDwgZW5kOyBjb3VudCsrKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19maW5kX2JsYW5rIChzdHIsIGksICZpKTsKKyAgICAgIF9kYnVzX3N0cmluZ19za2lwX2JsYW5rIChzdHIsIGksICZpKTsKKyAgICB9CisKKyAgYXJyYXkgPSBkYnVzX25ldzAgKGNoYXIgKiwgY291bnQgKyAxKTsKKyAgaWYgKGFycmF5ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaSA9IDA7CisgIF9kYnVzX3N0cmluZ19za2lwX2JsYW5rIChzdHIsIGksICZpKTsKKyAgZm9yIChrID0gMDsgayA8IGNvdW50OyBrKyspCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZpbmRfYmxhbmsgKHN0ciwgaSwgJmopOworCisgICAgICBhcnJheVtrXSA9IGRidXNfbWFsbG9jIChqIC0gaSArIDEpOworICAgICAgaWYgKGFycmF5W2tdID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChhcnJheSk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgIG1lbWNweSAoYXJyYXlba10sCisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHN0ciwgaSwgaiAtIGkpLCBqIC0gaSk7CisgICAgICBhcnJheVtrXVtqIC0gaV0gPSAnXDAnOworCisgICAgICBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAoc3RyLCBqLCAmaSk7CisgICAgfQorICBhcnJheVtrXSA9IE5VTEw7CisKKyAgcmV0dXJuIGFycmF5OworfQorCitzdGF0aWMgdm9pZAorYXV0aF9zZXRfdW5peF9jcmVkZW50aWFscyhEQnVzQXV0aCAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3BpZF90IHBpZCkKK3sKKyAgREJ1c0NyZWRlbnRpYWxzICpjcmVkZW50aWFsczsKKworICBjcmVkZW50aWFscyA9IF9kYnVzX2NyZWRlbnRpYWxzX25ldyAoKTsKKyAgaWYgKGNyZWRlbnRpYWxzID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgaWYgKHVpZCAhPSBEQlVTX1VJRF9VTlNFVCkKKyAgICBfZGJ1c19jcmVkZW50aWFsc19hZGRfdW5peF91aWQgKGNyZWRlbnRpYWxzLCB1aWQpOworICBpZiAocGlkICE9IERCVVNfUElEX1VOU0VUKQorICAgIF9kYnVzX2NyZWRlbnRpYWxzX2FkZF91bml4X3BpZCAoY3JlZGVudGlhbHMsIHBpZCk7CisKKyAgX2RidXNfYXV0aF9zZXRfY3JlZGVudGlhbHMgKGF1dGgsIGNyZWRlbnRpYWxzKTsKKworICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZGVudGlhbHMpOworfQorCisvKioKKyAqIFJ1bnMgYW4gImF1dGggc2NyaXB0IiB3aGljaCBpcyBhIHNjcmlwdCBmb3IgdGVzdGluZyB0aGUKKyAqIGF1dGhlbnRpY2F0aW9uIHByb3RvY29sLiBTY3JpcHRzIHNlbmQgYW5kIHJlY2VpdmUgZGF0YSwgYW5kIHRoZW4KKyAqIGluY2x1ZGUgYXNzZXJ0aW9ucyBhYm91dCB0aGUgc3RhdGUgb2YgYm90aCBlbmRzIG9mIHRoZSBjb25uZWN0aW9uCisgKiBhZnRlciBwcm9jZXNzaW5nIHRoZSBkYXRhLiBBIHNjcmlwdCBzdWNjZWVkcyBpZiB0aGVzZSBhc3NlcnRpb25zCisgKiBob2xkLgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBzY3JpcHQgdG8gcnVuCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgc2NyaXB0IHN1Y2NlZWRzLCAjRkFMU0Ugb3RoZXJ3aXNlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hdXRoX3NjcmlwdF9ydW4gKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lKQoreworICBEQnVzU3RyaW5nIGZpbGU7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgREJ1c1N0cmluZyBsaW5lOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGludCBsaW5lX25vOworICBEQnVzQXV0aCAqYXV0aDsKKyAgREJ1c1N0cmluZyBmcm9tX2F1dGg7CisgIERCdXNBdXRoU3RhdGUgc3RhdGU7CisgIERCdXNTdHJpbmcgY29udGV4dDsKKyAgREJ1c1N0cmluZyBndWlkOworICAKKyAgcmV0dmFsID0gRkFMU0U7CisgIGF1dGggPSBOVUxMOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZ3VpZCwgIjVmYTAxZjQyMDJjZDgzNzcwOWEzMjc0Y2EwZGY5ZDAwIik7CisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmY29udGV4dCwgIm9yZ19mcmVlZGVza3RvcF90ZXN0Iik7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZmlsZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZsaW5lKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZnJvbV9hdXRoKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGUpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZsaW5lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19maWxlX2dldF9jb250ZW50cyAoJmZpbGUsIGZpbGVuYW1lLCAmZXJyb3IpKSAgICB7CisgICAgICBfZGJ1c193YXJuICgiR2V0dGluZyBjb250ZW50cyBvZiAlcyBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSksIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHN0YXRlID0gREJVU19BVVRIX1NUQVRFX05FRURfRElTQ09OTkVDVDsKKyAgbGluZV9ubyA9IDA7CisKKyBuZXh0X2l0ZXJhdGlvbjoKKyAgd2hpbGUgKF9kYnVzX3N0cmluZ19wb3BfbGluZSAoJmZpbGUsICZsaW5lKSkKKyAgICB7ICAgICAgCisgICAgICBsaW5lX25vICs9IDE7CisKKyAgICAgIC8qIF9kYnVzX3dhcm4gKCIlc1xuIiwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmbGluZSkpOyAqLworICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfZGVsZXRlX2xlYWRpbmdfYmxhbmtzICgmbGluZSk7CisKKyAgICAgIGlmIChhdXRoICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICB3aGlsZSAoKHN0YXRlID0gX2RidXNfYXV0aF9kb193b3JrIChhdXRoKSkgPT0KKyAgICAgICAgICAgICAgICAgREJVU19BVVRIX1NUQVRFX0hBVkVfQllURVNfVE9fU0VORCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqdG1wOworICAgICAgICAgICAgICBpZiAoX2RidXNfYXV0aF9nZXRfYnl0ZXNfdG9fc2VuZCAoYXV0aCwgJnRtcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHRtcCk7CisKKyAgICAgICAgICAgICAgICAgIGlmIChfZGJ1c19zdHJpbmdfY29weSAodG1wLCAwLCAmZnJvbV9hdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmZyb21fYXV0aCkpKQorICAgICAgICAgICAgICAgICAgICBfZGJ1c19hdXRoX2J5dGVzX3NlbnQgKGF1dGgsIGNvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbGluZSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIC8qIGVtcHR5IGxpbmUgKi8KKyAgICAgICAgICBnb3RvIG5leHRfaXRlcmF0aW9uOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIyIpKQorICAgICAgICB7CisgICAgICAgICAgLyogSWdub3JlIHRoaXMgY29tbWVudCAqLworICAgICAgICAgIGdvdG8gbmV4dF9pdGVyYXRpb247CisgICAgICAgIH0KKyNpZmRlZiBEQlVTX1dJTgorICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldJTl9PTkxZIikpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBJZ25vcmUgdGhpcyBsaW5lICovCisgICAgICAgICAgZ290byBuZXh0X2l0ZXJhdGlvbjsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVOSVhfT05MWSIpKQorICAgICAgICB7CisgICAgICAgICAgLyogc2tpcCB0aGlzIGZpbGUgKi8KKyAgICAgICAgICBfZGJ1c193YXJuICgic2tpcHBpbmcgdW5peCBvbmx5IGF1dGggc2NyaXB0XG4iKTsKKyAgICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisjZW5kaWYKKyNpZmRlZiBEQlVTX1VOSVgKKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVTklYX09OTFkiKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIElnbm9yZSB0aGlzIGxpbmUgKi8KKyAgICAgICAgICBnb3RvIG5leHRfaXRlcmF0aW9uOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0lOX09OTFkiKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIHNraXAgdGhpcyBmaWxlICovCisgICAgICAgICAgX2RidXNfd2FybiAoInNraXBwaW5nIHdpbmRvd3Mgb25seSBhdXRoIHNjcmlwdFxuIik7CisgICAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0xJRU5UIikpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgKmNyZWRzOworICAgICAgICAgIAorICAgICAgICAgIGlmIChhdXRoICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJhbHJlYWR5IGNyZWF0ZWQgYSBEQnVzQXV0aCAoQ0xJRU5UIG9yIFNFUlZFUiBnaXZlbiB0d2ljZSlcbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGF1dGggPSBfZGJ1c19hdXRoX2NsaWVudF9uZXcgKCk7CisgICAgICAgICAgaWYgKGF1dGggPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm5vIG1lbW9yeSB0byBjcmVhdGUgREJ1c0F1dGhcbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8qIHRlc3QgcmVmL3VucmVmICovCisgICAgICAgICAgX2RidXNfYXV0aF9yZWYgKGF1dGgpOworICAgICAgICAgIF9kYnVzX2F1dGhfdW5yZWYgKGF1dGgpOworCisgICAgICAgICAgY3JlZHMgPSBfZGJ1c19jcmVkZW50aWFsc19uZXdfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKCk7CisgICAgICAgICAgaWYgKGNyZWRzID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJubyBtZW1vcnkgZm9yIGNyZWRlbnRpYWxzXG4iKTsKKyAgICAgICAgICAgICAgX2RidXNfYXV0aF91bnJlZiAoYXV0aCk7CisgICAgICAgICAgICAgIGF1dGggPSBOVUxMOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgCisgICAgICAgICAgaWYgKCFfZGJ1c19hdXRoX3NldF9jcmVkZW50aWFscyAoYXV0aCwgY3JlZHMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgibm8gbWVtb3J5IGZvciBzZXR0aW5nIGNyZWRlbnRpYWxzXG4iKTsKKyAgICAgICAgICAgICAgX2RidXNfYXV0aF91bnJlZiAoYXV0aCk7CisgICAgICAgICAgICAgIGF1dGggPSBOVUxMOworICAgICAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZHMpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZHMpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VSVkVSIikpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgKmNyZWRzOworICAgICAgICAgIAorICAgICAgICAgIGlmIChhdXRoICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJhbHJlYWR5IGNyZWF0ZWQgYSBEQnVzQXV0aCAoQ0xJRU5UIG9yIFNFUlZFUiBnaXZlbiB0d2ljZSlcbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGF1dGggPSBfZGJ1c19hdXRoX3NlcnZlcl9uZXcgKCZndWlkKTsKKyAgICAgICAgICBpZiAoYXV0aCA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgibm8gbWVtb3J5IHRvIGNyZWF0ZSBEQnVzQXV0aFxuIik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgLyogdGVzdCByZWYvdW5yZWYgKi8KKyAgICAgICAgICBfZGJ1c19hdXRoX3JlZiAoYXV0aCk7CisgICAgICAgICAgX2RidXNfYXV0aF91bnJlZiAoYXV0aCk7CisKKyAgICAgICAgICBjcmVkcyA9IF9kYnVzX2NyZWRlbnRpYWxzX25ld19mcm9tX2N1cnJlbnRfcHJvY2VzcyAoKTsKKyAgICAgICAgICBpZiAoY3JlZHMgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm5vIG1lbW9yeSBmb3IgY3JlZGVudGlhbHNcbiIpOworICAgICAgICAgICAgICBfZGJ1c19hdXRoX3VucmVmIChhdXRoKTsKKyAgICAgICAgICAgICAgYXV0aCA9IE5VTEw7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgICAKKyAgICAgICAgICBpZiAoIV9kYnVzX2F1dGhfc2V0X2NyZWRlbnRpYWxzIChhdXRoLCBjcmVkcykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJubyBtZW1vcnkgZm9yIHNldHRpbmcgY3JlZGVudGlhbHNcbiIpOworICAgICAgICAgICAgICBfZGJ1c19hdXRoX3VucmVmIChhdXRoKTsKKyAgICAgICAgICAgICAgYXV0aCA9IE5VTEw7CisgICAgICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkcyk7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkcyk7CisKKyAgICAgICAgICBfZGJ1c19hdXRoX3NldF9jb250ZXh0IChhdXRoLCAmY29udGV4dCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGF1dGggPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJtdXN0IHNwZWNpZnkgQ0xJRU5UIG9yIFNFUlZFUlxuIik7CisgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5PX0NSRURFTlRJQUxTIikpCisgICAgICAgIHsKKyAgICAgICAgICBhdXRoX3NldF91bml4X2NyZWRlbnRpYWxzIChhdXRoLCBEQlVTX1VJRF9VTlNFVCwgREJVU19QSURfVU5TRVQpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUk9PVF9DUkVERU5USUFMUyIpKQorICAgICAgICB7CisgICAgICAgICAgYXV0aF9zZXRfdW5peF9jcmVkZW50aWFscyAoYXV0aCwgMCwgREJVU19QSURfVU5TRVQpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0lMTFlfQ1JFREVOVElBTFMiKSkKKyAgICAgICAgeworICAgICAgICAgIGF1dGhfc2V0X3VuaXhfY3JlZGVudGlhbHMgKGF1dGgsIDQzMTIsIERCVVNfUElEX1VOU0VUKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFMTE9XRURfTUVDSFMiKSkKKyAgICAgICAgeworICAgICAgICAgIGNoYXIgKiptZWNoczsKKworICAgICAgICAgIF9kYnVzX3N0cmluZ19kZWxldGVfZmlyc3Rfd29yZCAoJmxpbmUpOworICAgICAgICAgIG1lY2hzID0gc3BsaXRfc3RyaW5nICgmbGluZSk7CisgICAgICAgICAgX2RidXNfYXV0aF9zZXRfbWVjaGFuaXNtcyAoYXV0aCwgKGNvbnN0IGNoYXIgKiopIG1lY2hzKTsKKyAgICAgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChtZWNocyk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTRU5EIikpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzU3RyaW5nIHRvX3NlbmQ7CisgICAgICAgICAgCisgICAgICAgICAgX2RidXNfc3RyaW5nX2RlbGV0ZV9maXJzdF93b3JkICgmbGluZSk7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdG9fc2VuZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJubyBtZW1vcnkgdG8gYWxsb2NhdGUgc3RyaW5nXG4iKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIWFwcGVuZF9xdW90ZWRfc3RyaW5nICgmdG9fc2VuZCwgJmxpbmUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiZmFpbGVkIHRvIGFwcGVuZCBxdW90ZWQgc3RyaW5nIGxpbmUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbm8pOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRvX3NlbmQpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTZW5kaW5nICclcydcbiIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnRvX3NlbmQpKTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZ0b19zZW5kLCAiXHJcbiIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiZmFpbGVkIHRvIGFwcGVuZCBcclxuIGZyb20gbGluZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9ubyk7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdG9fc2VuZCk7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgLyogUmVwbGFjZSBVU0VSSURfSEVYIHdpdGggb3VyIHVzZXJuYW1lIGluIGhleCAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgIGludCB3aGVyZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKF9kYnVzX3N0cmluZ19maW5kICgmdG9fc2VuZCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVTRVJJRF9IRVgiLCAmd2hlcmUpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJ1c1N0cmluZyB1c2VybmFtZTsKKworICAgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ1c2VybmFtZSkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJubyBtZW1vcnkgZm9yIHVzZXJpZFxuIik7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdG9fc2VuZCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFfZGJ1c19hcHBlbmRfdXNlcl9mcm9tX2N1cnJlbnRfcHJvY2VzcyAoJnVzZXJuYW1lKSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm5vIG1lbW9yeSBmb3IgdXNlcmlkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ1c2VybmFtZSk7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdG9fc2VuZCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2RlbGV0ZSAoJnRvX3NlbmQsIHdoZXJlLCBzdHJsZW4gKCJVU0VSSURfSEVYIikpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2hleF9lbmNvZGUgKCZ1c2VybmFtZSwgMCwKKwkJCQkJICAgICAgJnRvX3NlbmQsIHdoZXJlKSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm5vIG1lbW9yeSB0byBzdWJzdCBVU0VSSURfSEVYXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ1c2VybmFtZSk7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdG9fc2VuZCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ1c2VybmFtZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19maW5kICgmdG9fc2VuZCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVNFUk5BTUVfSEVYIiwgJndoZXJlKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgdXNlcm5hbWU7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnVzZXJuYW1lKSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm5vIG1lbW9yeSBmb3IgdXNlcm5hbWVcbiIpOworICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRvX3NlbmQpOworICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghX2RidXNfYXBwZW5kX3VzZXJfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKCZ1c2VybmFtZSkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJubyBtZW1vcnkgZm9yIHVzZXJuYW1lXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ1c2VybmFtZSk7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdG9fc2VuZCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2RlbGV0ZSAoJnRvX3NlbmQsIHdoZXJlLCBzdHJsZW4gKCJVU0VSTkFNRV9IRVgiKSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAoJnVzZXJuYW1lLCAwLAorCQkJCQkgICAgICAmdG9fc2VuZCwgd2hlcmUpKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZGJ1c193YXJuICgibm8gbWVtb3J5IHRvIHN1YnN0IFVTRVJOQU1FX0hFWFxuIik7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdXNlcm5hbWUpOworICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRvX3NlbmQpOworICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdXNlcm5hbWUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgeworICAgICAgICAgICAgREJ1c1N0cmluZyAqYnVmZmVyOworCisgICAgICAgICAgICBfZGJ1c19hdXRoX2dldF9idWZmZXIgKGF1dGgsICZidWZmZXIpOworICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJnRvX3NlbmQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChidWZmZXIpKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJub3QgZW5vdWdoIG1lbW9yeSB0byBjYWxsIGJ5dGVzX3JlY2VpdmVkLCBvciBjYW4ndCBhZGQgYnl0ZXMgdG8gYXV0aCBvYmplY3QgYWxyZWFkeSBpbiBlbmQgc3RhdGVcbiIpOworICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdG9fc2VuZCk7CisgICAgICAgICAgICAgICAgX2RidXNfYXV0aF9yZXR1cm5fYnVmZmVyIChhdXRoLCBidWZmZXIsIDApOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9kYnVzX2F1dGhfcmV0dXJuX2J1ZmZlciAoYXV0aCwgYnVmZmVyLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnRvX3NlbmQpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0b19zZW5kKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVYUEVDVF9TVEFURSIpKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0F1dGhTdGF0ZSBleHBlY3RlZDsKKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZGVsZXRlX2ZpcnN0X3dvcmQgKCZsaW5lKTsKKworICAgICAgICAgIGV4cGVjdGVkID0gYXV0aF9zdGF0ZV9mcm9tX3N0cmluZyAoJmxpbmUpOworICAgICAgICAgIGlmIChleHBlY3RlZCA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJiYWQgYXV0aCBzdGF0ZSBnaXZlbiB0byBFWFBFQ1RfU1RBVEVcbiIpOworICAgICAgICAgICAgICBnb3RvIHBhcnNlX2ZhaWxlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChleHBlY3RlZCAhPSBzdGF0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoImV4cGVjdGVkIGF1dGggc3RhdGUgJXMgYnV0IGdvdCAlcyBvbiBsaW5lICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoX3N0YXRlX3RvX3N0cmluZyAoZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoX3N0YXRlX3RvX3N0cmluZyAoc3RhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX25vKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFWFBFQ1RfQ09NTUFORCIpKQorICAgICAgICB7CisgICAgICAgICAgREJ1c1N0cmluZyByZWNlaXZlZDsKKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZGVsZXRlX2ZpcnN0X3dvcmQgKCZsaW5lKTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZyZWNlaXZlZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJubyBtZW0gdG8gYWxsb2NhdGUgc3RyaW5nIHJlY2VpdmVkXG4iKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19wb3BfbGluZSAoJmZyb21fYXV0aCwgJnJlY2VpdmVkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm5vIGxpbmUgcG9wcGVkIGZyb20gdGhlIERCdXNBdXRoIGJlaW5nIHRlc3RlZCwgZXhwZWN0ZWQgY29tbWFuZCAlcyBvbiBsaW5lICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZsaW5lKSwgbGluZV9ubyk7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcmVjZWl2ZWQpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghc2FtZV9maXJzdF93b3JkICgmcmVjZWl2ZWQsICZsaW5lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoImxpbmUgJWQgZXhwZWN0ZWQgY29tbWFuZCAnJXMnIGFuZCBnb3QgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9ubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmbGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnJlY2VpdmVkKSk7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcmVjZWl2ZWQpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnJlY2VpdmVkKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVYUEVDVF9VTlVTRUQiKSkKKyAgICAgICAgeworICAgICAgICAgIERCdXNTdHJpbmcgZXhwZWN0ZWQ7CisgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqdW51c2VkOworICAgICAgICAgIAorICAgICAgICAgIF9kYnVzX3N0cmluZ19kZWxldGVfZmlyc3Rfd29yZCAoJmxpbmUpOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmV4cGVjdGVkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm5vIG1lbSB0byBhbGxvY2F0ZSBzdHJpbmcgZXhwZWN0ZWRcbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghYXBwZW5kX3F1b3RlZF9zdHJpbmcgKCZleHBlY3RlZCwgJmxpbmUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiZmFpbGVkIHRvIGFwcGVuZCBxdW90ZWQgc3RyaW5nIGxpbmUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbm8pOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBfZGJ1c19hdXRoX2dldF91bnVzZWRfYnl0ZXMgKGF1dGgsICZ1bnVzZWQpOworICAgICAgICAgIAorICAgICAgICAgIGlmIChfZGJ1c19zdHJpbmdfZXF1YWwgKCZleHBlY3RlZCwgdW51c2VkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfYXV0aF9kZWxldGVfdW51c2VkX2J5dGVzIChhdXRoKTsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZleHBlY3RlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRXhwZWN0ZWQgdW51c2VkIGJ5dGVzICclcycgYW5kIGhhdmUgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHVudXNlZCkpOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFWFBFQ1RfSEFWRV9OT19DUkVERU5USUFMUyIpKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICphdXRob3JpemVkX2lkZW50aXR5OworICAgICAgICAgIAorICAgICAgICAgIGF1dGhvcml6ZWRfaWRlbnRpdHkgPSBfZGJ1c19hdXRoX2dldF9pZGVudGl0eSAoYXV0aCk7CisgICAgICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hcmVfYW5vbnltb3VzIChhdXRob3JpemVkX2lkZW50aXR5KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIkV4cGVjdGVkIGFub255bW91cyBsb2dpbiBvciBmYWlsZWQgbG9naW4sIGJ1dCBzb21lIGNyZWRlbnRpYWxzIHdlcmUgYXV0aG9yaXplZFxuIik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRVhQRUNUX0hBVkVfU09NRV9DUkVERU5USUFMUyIpKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICphdXRob3JpemVkX2lkZW50aXR5OworICAgICAgICAgIAorICAgICAgICAgIGF1dGhvcml6ZWRfaWRlbnRpdHkgPSBfZGJ1c19hdXRoX2dldF9pZGVudGl0eSAoYXV0aCk7CisgICAgICAgICAgaWYgKF9kYnVzX2NyZWRlbnRpYWxzX2FyZV9hbm9ueW1vdXMgKGF1dGhvcml6ZWRfaWRlbnRpdHkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRXhwZWN0ZWQgdG8gaGF2ZSBzb21lIGNyZWRlbnRpYWxzLCBidXQgd2UgZG9uJ3RcbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVYUEVDVCIpKQorICAgICAgICB7CisgICAgICAgICAgREJ1c1N0cmluZyBleHBlY3RlZDsKKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZGVsZXRlX2ZpcnN0X3dvcmQgKCZsaW5lKTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZleHBlY3RlZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJubyBtZW0gdG8gYWxsb2NhdGUgc3RyaW5nIGV4cGVjdGVkXG4iKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIWFwcGVuZF9xdW90ZWRfc3RyaW5nICgmZXhwZWN0ZWQsICZsaW5lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoImZhaWxlZCB0byBhcHBlbmQgcXVvdGVkIHN0cmluZyBsaW5lICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX25vKTsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZleHBlY3RlZCk7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKF9kYnVzX3N0cmluZ19lcXVhbF9sZW4gKCZleHBlY3RlZCwgJmZyb21fYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZleHBlY3RlZCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZGVsZXRlICgmZnJvbV9hdXRoLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmV4cGVjdGVkKSk7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZXhwZWN0ZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIkV4cGVjdGVkIGV4YWN0IHN0cmluZyAnJXMnIGFuZCBoYXZlICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmV4cGVjdGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZnJvbV9hdXRoKSk7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZXhwZWN0ZWQpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBnb3RvIHBhcnNlX2ZhaWxlZDsKKworICAgICAgZ290byBuZXh0X2l0ZXJhdGlvbjsgLyogc2tpcCBwYXJzZV9mYWlsZWQgKi8KKyAgICAgIAorICAgIHBhcnNlX2ZhaWxlZDoKKyAgICAgIHsKKyAgICAgICAgX2RidXNfd2FybiAoImNvdWxkbid0IHByb2Nlc3MgbGluZSAlZCBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgIGxpbmVfbm8sIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmxpbmUpKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgICB9CisgICAgfQorCisgIGlmIChhdXRoID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkF1dGggc2NyaXB0IGlzIGJvZ3VzLCBkaWQgbm90IGV2ZW4gaGF2ZSBDTElFTlQgb3IgU0VSVkVSXG4iKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgZWxzZSBpZiAoc3RhdGUgPT0gREJVU19BVVRIX1NUQVRFX0FVVEhFTlRJQ0FURUQpCisgICAgeworICAgICAgY29uc3QgREJ1c1N0cmluZyAqdW51c2VkOworCisgICAgICBfZGJ1c19hdXRoX2dldF91bnVzZWRfYnl0ZXMgKGF1dGgsICZ1bnVzZWQpOworCisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHVudXNlZCkgPiAwKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoImRpZCBub3QgZXhwZWN0IHVudXNlZCBieXRlcyAoc2NyaXB0cyBtdXN0IHNwZWNpZnkgZXhwbGljaXRseSBpZiB0aGV5IGFyZSBleHBlY3RlZClcbiIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmZyb21fYXV0aCkgPiAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJzY3JpcHQgZGlkIG5vdCBoYXZlIEVYUEVDVF8gc3RhdGVtZW50cyBmb3IgYWxsIHRoZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIERCdXNBdXRoXG4iKTsKKyAgICAgIF9kYnVzX3dhcm4gKCJMZWZ0b3ZlciBkYXRhOiAlc1xuIiwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZnJvbV9hdXRoKSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIAorICByZXR2YWwgPSBUUlVFOworICAKKyBvdXQ6CisgIGlmIChhdXRoKQorICAgIF9kYnVzX2F1dGhfdW5yZWYgKGF1dGgpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmbGluZSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZnJvbV9hdXRoKTsKKyAgCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKiBAfSAqLworI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLWF1dGgtc2NyaXB0LmggYi9kYnVzL2RidXMvZGJ1cy1hdXRoLXNjcmlwdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZTZjN2MKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1hdXRoLXNjcmlwdC5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1hdXRoLXNjcmlwdC5oIFRlc3QgREJ1c0F1dGggdXNpbmcgYSBzcGVjaWFsIHNjcmlwdCBmaWxlIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX0FVVEhfU0NSSVBUX0gKKyNkZWZpbmUgREJVU19BVVRIX1NDUklQVF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVtb3J5Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXR5cGVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK2RidXNfYm9vbF90IF9kYnVzX2F1dGhfc2NyaXB0X3J1biAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUpOworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19BVVRIX1NDUklQVF9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1hdXRoLXV0aWwuYyBiL2RidXMvZGJ1cy9kYnVzLWF1dGgtdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NmU4ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1hdXRoLXV0aWwuYwpAQCAtMCwwICsxLDE3MCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWF1dGgtdXRpbC5jIFdvdWxkIGJlIGluIGRidXMtYXV0aC5jLCBidXQgb25seSB1c2VkIGZvciB0ZXN0cy9idXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgImRidXMtYXV0aC5oIgorCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNBdXRoCisgKiBAeworICovCisKKy8qKiBAfSAqLworCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgImRidXMtYXV0aC1zY3JpcHQuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgZGJ1c19ib29sX3QKK3Byb2Nlc3NfdGVzdF9zdWJkaXIgKGNvbnN0IERCdXNTdHJpbmcgICAgICAgICAgKnRlc3RfYmFzZV9kaXIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICpzdWJkaXIpCit7CisgIERCdXNTdHJpbmcgdGVzdF9kaXJlY3Rvcnk7CisgIERCdXNTdHJpbmcgZmlsZW5hbWU7CisgIERCdXNEaXJJdGVyICpkaXI7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworCisgIHJldHZhbCA9IEZBTFNFOworICBkaXIgPSBOVUxMOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnRlc3RfZGlyZWN0b3J5KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgYWxsb2NhdGUgdGVzdF9kaXJlY3RvcnlcbiIpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZW5hbWUsIHN1YmRpcik7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICh0ZXN0X2Jhc2VfZGlyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVzdF9kaXJlY3RvcnksIDApKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGNvcHkgdGVzdF9iYXNlX2RpciB0byB0ZXN0X2RpcmVjdG9yeSIpOworICAKKyAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmdGVzdF9kaXJlY3RvcnksICZmaWxlbmFtZSkpICAgIAorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGFsbG9jYXRlIGZ1bGwgcGF0aCIpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZmlsZW5hbWUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBhbGxvY2F0ZSBmaWxlbmFtZSBzdHJpbmdcbiIpOworCisgIGRpciA9IF9kYnVzX2RpcmVjdG9yeV9vcGVuICgmdGVzdF9kaXJlY3RvcnksICZlcnJvcik7CisgIGlmIChkaXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiQ291bGQgbm90IG9wZW4gJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmdGVzdF9kaXJlY3RvcnkpLAorICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgcHJpbnRmICgiVGVzdGluZyAlczpcbiIsIHN1YmRpcik7CisgIAorIG5leHQ6CisgIHdoaWxlIChfZGJ1c19kaXJlY3RvcnlfZ2V0X25leHRfZmlsZSAoZGlyLCAmZmlsZW5hbWUsICZlcnJvcikpCisgICAgeworICAgICAgREJ1c1N0cmluZyBmdWxsX3BhdGg7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsX3BhdGgpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBpbml0IHN0cmluZyIpOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmdGVzdF9kaXJlY3RvcnksIDAsICZmdWxsX3BhdGgsIDApKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBjb3B5IGRpciB0byBmdWxsX3BhdGgiKTsKKworICAgICAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmZnVsbF9wYXRoLCAmZmlsZW5hbWUpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBjb25jYXQgZmlsZSB0byBkaXIiKTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfZW5kc193aXRoX2Nfc3RyICgmZmlsZW5hbWUsICIuYXV0aC1zY3JpcHQiKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTa2lwcGluZyBub24tLmF1dGgtc2NyaXB0IGZpbGUgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZmlsZW5hbWUpKTsKKwkgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgICAgICBnb3RvIG5leHQ7CisgICAgICAgIH0KKworICAgICAgcHJpbnRmICgiICAgICVzXG4iLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmaWxlbmFtZSkpOworICAgICAgCisgICAgICBpZiAoIV9kYnVzX2F1dGhfc2NyaXB0X3J1biAoJmZ1bGxfcGF0aCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgIH0KKworICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkNvdWxkIG5vdCBnZXQgbmV4dCBmaWxlIGluICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnRlc3RfZGlyZWN0b3J5KSwgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgICAgCisgIHJldHZhbCA9IFRSVUU7CisgIAorIGZhaWxlZDoKKworICBpZiAoZGlyKQorICAgIF9kYnVzX2RpcmVjdG9yeV9jbG9zZSAoZGlyKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0ZXN0X2RpcmVjdG9yeSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcHJvY2Vzc190ZXN0X2RpcnMgKGNvbnN0IGNoYXIgKnRlc3RfZGF0YV9kaXIpCit7CisgIERCdXNTdHJpbmcgdGVzdF9kaXJlY3Rvcnk7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdGVzdF9kaXJlY3RvcnksIHRlc3RfZGF0YV9kaXIpOworCisgIGlmICghcHJvY2Vzc190ZXN0X3N1YmRpciAoJnRlc3RfZGlyZWN0b3J5LCAiYXV0aCIpKQorICAgIGdvdG8gZmFpbGVkOworCisgIHJldHZhbCA9IFRSVUU7CisgIAorIGZhaWxlZDoKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRlc3RfZGlyZWN0b3J5KTsKKyAgCisgIHJldHVybiByZXR2YWw7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19hdXRoX3Rlc3QgKGNvbnN0IGNoYXIgKnRlc3RfZGF0YV9kaXIpCit7CisgIAorICBpZiAodGVzdF9kYXRhX2RpciA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworICAKKyAgaWYgKCFwcm9jZXNzX3Rlc3RfZGlycyAodGVzdF9kYXRhX2RpcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtYXV0aC5jIGIvZGJ1cy9kYnVzL2RidXMtYXV0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYzM3YTcKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1hdXRoLmMKQEAgLTAsMCArMSwyODEwIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtYXV0aC5jIEF1dGhlbnRpY2F0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0IFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1hdXRoLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKyNpbmNsdWRlICJkYnVzLWxpc3QuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMta2V5cmluZy5oIgorI2luY2x1ZGUgImRidXMtc2hhLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgImRidXMtY3JlZGVudGlhbHMuaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0F1dGggQXV0aGVudGljYXRpb24KKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgREJ1c0F1dGggb2JqZWN0CisgKgorICogREJ1c0F1dGggbWFuYWdlcyB0aGUgYXV0aGVudGljYXRpb24gbmVnb3RpYXRpb24gd2hlbiBhIGNvbm5lY3Rpb24KKyAqIGlzIGZpcnN0IGVzdGFibGlzaGVkLCBhbmQgYWxzbyBtYW5hZ2UgYW55IGVuY3J5cHRpb24gdXNlZCBvdmVyIGEKKyAqIGNvbm5lY3Rpb24uCisgKgorICogQHRvZG8gc29tZSBTQVNMIHByb2ZpbGVzIHJlcXVpcmUgc2VuZGluZyB0aGUgZW1wdHkgc3RyaW5nIGFzIGEKKyAqIGNoYWxsZW5nZS9yZXNwb25zZSwgYnV0IHdlIGRvbid0IGN1cnJlbnRseSBhbGxvdyB0aGF0IGluIG91cgorICogcHJvdG9jb2wuCisgKgorICogQHRvZG8gcmlnaHQgbm93IHNvbWV0aW1lcyBib3RoIGVuZHMgd2lsbCBibG9jayB3YWl0aW5nIGZvciBpbnB1dAorICogZnJvbSB0aGUgb3RoZXIgZW5kLCBlLmcuIGlmIHRoZXJlJ3MgYW4gZXJyb3IgZHVyaW5nCisgKiBEQlVTX0NPT0tJRV9TSEExLgorICoKKyAqIEB0b2RvIHRoZSBjb29raWUga2V5cmluZyBuZWVkcyB0byBiZSBjYWNoZWQgZ2xvYmFsbHkgbm90IGp1c3QKKyAqIHBlci1hdXRoICh3aGljaCByYWlzZXMgdGhyZWFkc2FmZXR5IGlzc3VlcyB0b28pCisgKiAKKyAqIEB0b2RvIGdyZXAgRklYTUUgaW4gZGJ1cy1hdXRoLmMKKyAqLworCisvKioKKyAqIEBkZWZncm91cCBEQnVzQXV0aEludGVybmFscyBBdXRoZW50aWNhdGlvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNBdXRoIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqCisgKiBQcml2YXRlIGRldGFpbHMgb2YgYXV0aGVudGljYXRpb24gY29kZS4KKyAqCisgKiBAeworICovCisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBhcHBlbmRzIGFuIGluaXRpYWwgY2xpZW50IHJlc3BvbnNlIHRvIHRoZSBnaXZlbiBzdHJpbmcKKyAqLwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzSW5pdGlhbFJlc3BvbnNlRnVuY3Rpb24pICAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKnJlc3BvbnNlKTsKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyBhIGJsb2NrIG9mIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgcGVlci4KKyAqIGkuZS4gaGFuZGxlcyBhIERBVEEgY29tbWFuZC4KKyAqLwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzQXV0aERhdGFGdW5jdGlvbikgICAgIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpkYXRhKTsKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGVuY29kZXMgYSBibG9jayBvZiBkYXRhIGZyb20gdGhlIHBlZXIuCisgKi8KK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogREJ1c0F1dGhFbmNvZGVGdW5jdGlvbikgICAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZW5jb2RlZCk7CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBkZWNvZGVzIGEgYmxvY2sgb2YgZGF0YSBmcm9tIHRoZSBwZWVyLgorICovCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNBdXRoRGVjb2RlRnVuY3Rpb24pICAgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmRlY29kZWQpOworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIG1lY2hhbmlzbSBpcyBhYmFuZG9uZWQuCisgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c0F1dGhTaHV0ZG93bkZ1bmN0aW9uKSAoREJ1c0F1dGggICAgICAgKmF1dGgpOworCisvKioKKyAqIFZpcnR1YWwgdGFibGUgcmVwcmVzZW50aW5nIGEgcGFydGljdWxhciBhdXRoIG1lY2hhbmlzbS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgY2hhciAqbWVjaGFuaXNtOyAvKio8IE5hbWUgb2YgdGhlIG1lY2hhbmlzbSAqLworICBEQnVzQXV0aERhdGFGdW5jdGlvbiBzZXJ2ZXJfZGF0YV9mdW5jOyAvKio8IEZ1bmN0aW9uIG9uIHNlcnZlciBzaWRlIGZvciBEQVRBICovCisgIERCdXNBdXRoRW5jb2RlRnVuY3Rpb24gc2VydmVyX2VuY29kZV9mdW5jOyAvKio8IEZ1bmN0aW9uIG9uIHNlcnZlciBzaWRlIHRvIGVuY29kZSAqLworICBEQnVzQXV0aERlY29kZUZ1bmN0aW9uIHNlcnZlcl9kZWNvZGVfZnVuYzsgLyoqPCBGdW5jdGlvbiBvbiBzZXJ2ZXIgc2lkZSB0byBkZWNvZGUgKi8KKyAgREJ1c0F1dGhTaHV0ZG93bkZ1bmN0aW9uIHNlcnZlcl9zaHV0ZG93bl9mdW5jOyAvKio8IEZ1bmN0aW9uIG9uIHNlcnZlciBzaWRlIHRvIHNodXQgZG93biAqLworICBEQnVzSW5pdGlhbFJlc3BvbnNlRnVuY3Rpb24gY2xpZW50X2luaXRpYWxfcmVzcG9uc2VfZnVuYzsgLyoqPCBGdW5jdGlvbiBvbiBjbGllbnQgc2lkZSB0byBoYW5kbGUgaW5pdGlhbCByZXNwb25zZSAqLworICBEQnVzQXV0aERhdGFGdW5jdGlvbiBjbGllbnRfZGF0YV9mdW5jOyAvKio8IEZ1bmN0aW9uIG9uIGNsaWVudCBzaWRlIGZvciBEQVRBICovCisgIERCdXNBdXRoRW5jb2RlRnVuY3Rpb24gY2xpZW50X2VuY29kZV9mdW5jOyAvKio8IEZ1bmN0aW9uIG9uIGNsaWVudCBzaWRlIGZvciBlbmNvZGUgKi8KKyAgREJ1c0F1dGhEZWNvZGVGdW5jdGlvbiBjbGllbnRfZGVjb2RlX2Z1bmM7IC8qKjwgRnVuY3Rpb24gb24gY2xpZW50IHNpZGUgZm9yIGRlY29kZSAqLworICBEQnVzQXV0aFNodXRkb3duRnVuY3Rpb24gY2xpZW50X3NodXRkb3duX2Z1bmM7IC8qKjwgRnVuY3Rpb24gb24gY2xpZW50IHNpZGUgZm9yIHNodXRkb3duICovCit9IERCdXNBdXRoTWVjaGFuaXNtSGFuZGxlcjsKKworLyoqCisgKiBFbnVtZXJhdGlvbiBmb3IgdGhlIGtub3duIGF1dGhlbnRpY2F0aW9uIGNvbW1hbmRzLgorICovCit0eXBlZGVmIGVudW0geworICBEQlVTX0FVVEhfQ09NTUFORF9BVVRILAorICBEQlVTX0FVVEhfQ09NTUFORF9DQU5DRUwsCisgIERCVVNfQVVUSF9DT01NQU5EX0RBVEEsCisgIERCVVNfQVVUSF9DT01NQU5EX0JFR0lOLAorICBEQlVTX0FVVEhfQ09NTUFORF9SRUpFQ1RFRCwKKyAgREJVU19BVVRIX0NPTU1BTkRfT0ssCisgIERCVVNfQVVUSF9DT01NQU5EX0VSUk9SLAorICBEQlVTX0FVVEhfQ09NTUFORF9VTktOT1dOLAorICBEQlVTX0FVVEhfQ09NTUFORF9ORUdPVElBVEVfVU5JWF9GRCwKKyAgREJVU19BVVRIX0NPTU1BTkRfQUdSRUVfVU5JWF9GRAorfSBEQnVzQXV0aENvbW1hbmQ7CisKKy8qKgorICogQXV0aCBzdGF0ZSBmdW5jdGlvbiwgZGV0ZXJtaW5lcyB0aGUgcmVhY3Rpb24gdG8gaW5jb21pbmcgZXZlbnRzIGZvcgorICogYSBwYXJ0aWN1bGFyIHN0YXRlLiBSZXR1cm5zIHdoZXRoZXIgd2UgaGFkIGVub3VnaCBtZW1vcnkgdG8KKyAqIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24uCisgKi8KK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogREJ1c0F1dGhTdGF0ZUZ1bmN0aW9uKSAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0F1dGhDb21tYW5kICAgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYXJncyk7CisKKy8qKgorICogSW5mb3JtYXRpb24gYWJvdXQgYSBhdXRoIHN0YXRlLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgICAgIC8qKjwgTmFtZSBvZiB0aGUgc3RhdGUgKi8KKyAgREJ1c0F1dGhTdGF0ZUZ1bmN0aW9uIGhhbmRsZXI7ICAvKio8IFN0YXRlIGZ1bmN0aW9uIGZvciB0aGlzIHN0YXRlICovCit9IERCdXNBdXRoU3RhdGVEYXRhOworCisvKioKKyAqIEludGVybmFsIG1lbWJlcnMgb2YgREJ1c0F1dGguCisgKi8KK3N0cnVjdCBEQnVzQXV0aAoreworICBpbnQgcmVmY291bnQ7ICAgICAgICAgICAvKio8IHJlZmVyZW5jZSBjb3VudCAqLworICBjb25zdCBjaGFyICpzaWRlOyAgICAgICAvKio8IENsaWVudCBvciBzZXJ2ZXIgKi8KKworICBEQnVzU3RyaW5nIGluY29taW5nOyAgICAvKio8IEluY29taW5nIGRhdGEgYnVmZmVyICovCisgIERCdXNTdHJpbmcgb3V0Z29pbmc7ICAgIC8qKjwgT3V0Z29pbmcgZGF0YSBidWZmZXIgKi8KKyAgCisgIGNvbnN0IERCdXNBdXRoU3RhdGVEYXRhICpzdGF0ZTsgICAgICAgICAvKio8IEN1cnJlbnQgcHJvdG9jb2wgc3RhdGUgKi8KKworICBjb25zdCBEQnVzQXV0aE1lY2hhbmlzbUhhbmRsZXIgKm1lY2g7ICAgLyoqPCBDdXJyZW50IGF1dGggbWVjaGFuaXNtICovCisKKyAgREJ1c1N0cmluZyBpZGVudGl0eTsgICAgICAgICAgICAgICAgICAgLyoqPCBDdXJyZW50IGlkZW50aXR5IHdlJ3JlIGF1dGhvcml6aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgYXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAKKyAgREJ1c0NyZWRlbnRpYWxzICpjcmVkZW50aWFsczsgICAgICAgICAgLyoqPCBDcmVkZW50aWFscyByZWFkIGZyb20gc29ja2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIERCdXNDcmVkZW50aWFscyAqYXV0aG9yaXplZF9pZGVudGl0eTsgLyoqPCBDcmVkZW50aWFscyB0aGF0IGFyZSBhdXRob3JpemVkICovCisKKyAgREJ1c0NyZWRlbnRpYWxzICpkZXNpcmVkX2lkZW50aXR5OyAgICAvKio8IElkZW50aXR5IGNsaWVudCBoYXMgcmVxdWVzdGVkICovCisgIAorICBEQnVzU3RyaW5nIGNvbnRleHQ7ICAgICAgICAgICAgICAgLyoqPCBDb29raWUgc2NvcGUgKi8KKyAgREJ1c0tleXJpbmcgKmtleXJpbmc7ICAgICAgICAgICAgIC8qKjwgS2V5cmluZyBmb3IgY29va2llIG1lY2hhbmlzbS4gKi8KKyAgaW50IGNvb2tpZV9pZDsgICAgICAgICAgICAgICAgICAgIC8qKjwgSUQgb2YgY29va2llIHRvIHVzZSAqLworICBEQnVzU3RyaW5nIGNoYWxsZW5nZTsgICAgICAgICAgICAgLyoqPCBDaGFsbGVuZ2Ugc2VudCB0byBjbGllbnQgKi8KKworICBjaGFyICoqYWxsb3dlZF9tZWNoczsgICAgICAgICAgICAgLyoqPCBNZWNoYW5pc21zIHdlJ3JlIGFsbG93ZWQgdG8gdXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb3IgI05VTEwgaWYgd2UgY2FuIHVzZSBhbnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAKKyAgdW5zaWduZWQgaW50IG5lZWRlZF9tZW1vcnkgOiAxOyAgIC8qKjwgV2UgbmVlZGVkIG1lbW9yeSB0byBjb250aW51ZSBzaW5jZSBsYXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdWNjZXNzZnVsIGdldHRpbmcgc29tZXRoaW5nIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB1bnNpZ25lZCBpbnQgYWxyZWFkeV9nb3RfbWVjaGFuaXNtcyA6IDE7ICAgICAgIC8qKjwgQ2xpZW50IGFscmVhZHkgZ290IG1lY2ggbGlzdCAqLworICB1bnNpZ25lZCBpbnQgYWxyZWFkeV9hc2tlZF9mb3JfaW5pdGlhbF9yZXNwb25zZSA6IDE7IC8qKjwgQWxyZWFkeSBzZW50IGEgYmxhbmsgY2hhbGxlbmdlIHRvIGdldCBhbiBpbml0aWFsIHJlc3BvbnNlICovCisgIHVuc2lnbmVkIGludCBidWZmZXJfb3V0c3RhbmRpbmcgOiAxOyAvKio8IEJ1ZmZlciBpcyAiY2hlY2tlZCBvdXQiIGZvciByZWFkaW5nIGRhdGEgaW50byAqLworCisgIHVuc2lnbmVkIGludCB1bml4X2ZkX3Bvc3NpYmxlIDogMTsgIC8qKjwgVGhpcyBzaWRlIGNvdWxkIGRvIHVuaXggZmQgcGFzc2luZyAqLworICB1bnNpZ25lZCBpbnQgdW5peF9mZF9uZWdvdGlhdGVkIDogMTsgLyoqPCBVbml4IGZkIHdhcyBzdWNjZXNzZnVsbHkgbmVnb3RpYXRlZCAqLworfTsKKworLyoqCisgKiAiU3ViY2xhc3MiIG9mIERCdXNBdXRoIGZvciBjbGllbnQgc2lkZQorICovCit0eXBlZGVmIHN0cnVjdAoreworICBEQnVzQXV0aCBiYXNlOyAgICAvKio8IFBhcmVudCBjbGFzcyAqLworCisgIERCdXNMaXN0ICptZWNoc190b190cnk7IC8qKjwgTWVjaGFuaXNtcyB3ZSBnb3QgZnJvbSB0aGUgc2VydmVyIHRoYXQgd2UncmUgZ29pbmcgdG8gdHJ5IHVzaW5nICovCisKKyAgREJ1c1N0cmluZyBndWlkX2Zyb21fc2VydmVyOyAvKio8IEdVSUQgcmVjZWl2ZWQgZnJvbSBzZXJ2ZXIgKi8KKyAgCit9IERCdXNBdXRoQ2xpZW50OworCisvKioKKyAqICJTdWJjbGFzcyIgb2YgREJ1c0F1dGggZm9yIHNlcnZlciBzaWRlLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICBEQnVzQXV0aCBiYXNlOyAgICAvKio8IFBhcmVudCBjbGFzcyAqLworCisgIGludCBmYWlsdXJlczsgICAgIC8qKjwgTnVtYmVyIG9mIHRpbWVzIGNsaWVudCBoYXMgYmVlbiByZWplY3RlZCAqLworICBpbnQgbWF4X2ZhaWx1cmVzOyAvKio8IE51bWJlciBvZiB0aW1lcyB3ZSByZWplY3QgYmVmb3JlIGRpc2Nvbm5lY3QgKi8KKworICBEQnVzU3RyaW5nIGd1aWQ7ICAvKio8IE91ciBnbG9iYWxseSB1bmlxdWUgSUQgaW4gaGV4IGVuY29kaW5nICovCisgIAorfSBEQnVzQXV0aFNlcnZlcjsKKworc3RhdGljIHZvaWQgICAgICAgIGdvdG9fc3RhdGUgICAgICAgICAgICAgICAgKERCdXNBdXRoICAgICAgICAgICAgICAgICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzQXV0aFN0YXRlRGF0YSAgICAgICAgKm5ld19zdGF0ZSk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc2VuZF9hdXRoICAgICAgICAgICAgICAgICAoREJ1c0F1dGggKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c0F1dGhNZWNoYW5pc21IYW5kbGVyICptZWNoKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBzZW5kX2RhdGEgICAgICAgICAgICAgICAgIChEQnVzQXV0aCAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICpkYXRhKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBzZW5kX3JlamVjdGVkICAgICAgICAgICAgIChEQnVzQXV0aCAqYXV0aCk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc2VuZF9lcnJvciAgICAgICAgICAgICAgICAoREJ1c0F1dGggKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWVzc2FnZSk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc2VuZF9vayAgICAgICAgICAgICAgICAgICAoREJ1c0F1dGggKmF1dGgpOworc3RhdGljIGRidXNfYm9vbF90IHNlbmRfYmVnaW4gICAgICAgICAgICAgICAgKERCdXNBdXRoICphdXRoKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBzZW5kX2NhbmNlbCAgICAgICAgICAgICAgIChEQnVzQXV0aCAqYXV0aCk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc2VuZF9uZWdvdGlhdGVfdW5peF9mZCAgICAoREJ1c0F1dGggKmF1dGgpOworc3RhdGljIGRidXNfYm9vbF90IHNlbmRfYWdyZWVfdW5peF9mZCAgICAgICAgKERCdXNBdXRoICphdXRoKTsKKworLyoqCisgKiBDbGllbnQgc3RhdGVzCisgKi8KKyAKK3N0YXRpYyBkYnVzX2Jvb2xfdCBoYW5kbGVfc2VydmVyX3N0YXRlX3dhaXRpbmdfZm9yX2F1dGggIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBdXRoQ29tbWFuZCAgIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYXJncyk7CitzdGF0aWMgZGJ1c19ib29sX3QgaGFuZGxlX3NlcnZlcl9zdGF0ZV93YWl0aW5nX2Zvcl9kYXRhICAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQXV0aENvbW1hbmQgICBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3MpOworc3RhdGljIGRidXNfYm9vbF90IGhhbmRsZV9zZXJ2ZXJfc3RhdGVfd2FpdGluZ19mb3JfYmVnaW4gKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0F1dGhDb21tYW5kICAgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphcmdzKTsKKyAgCitzdGF0aWMgY29uc3QgREJ1c0F1dGhTdGF0ZURhdGEgc2VydmVyX3N0YXRlX3dhaXRpbmdfZm9yX2F1dGggPSB7CisgICJXYWl0aW5nRm9yQXV0aCIsIGhhbmRsZV9zZXJ2ZXJfc3RhdGVfd2FpdGluZ19mb3JfYXV0aAorfTsKK3N0YXRpYyBjb25zdCBEQnVzQXV0aFN0YXRlRGF0YSBzZXJ2ZXJfc3RhdGVfd2FpdGluZ19mb3JfZGF0YSA9IHsKKyAgIldhaXRpbmdGb3JEYXRhIiwgaGFuZGxlX3NlcnZlcl9zdGF0ZV93YWl0aW5nX2Zvcl9kYXRhCit9Oworc3RhdGljIGNvbnN0IERCdXNBdXRoU3RhdGVEYXRhIHNlcnZlcl9zdGF0ZV93YWl0aW5nX2Zvcl9iZWdpbiA9IHsKKyAgIldhaXRpbmdGb3JCZWdpbiIsIGhhbmRsZV9zZXJ2ZXJfc3RhdGVfd2FpdGluZ19mb3JfYmVnaW4KK307CisgIAorLyoqCisgKiBDbGllbnQgc3RhdGVzCisgKi8KKyAKK3N0YXRpYyBkYnVzX2Jvb2xfdCBoYW5kbGVfY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX2RhdGEgICAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0F1dGhDb21tYW5kICAgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYXJncyk7CitzdGF0aWMgZGJ1c19ib29sX3QgaGFuZGxlX2NsaWVudF9zdGF0ZV93YWl0aW5nX2Zvcl9vayAgICAgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBdXRoQ29tbWFuZCAgIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3MpOworc3RhdGljIGRidXNfYm9vbF90IGhhbmRsZV9jbGllbnRfc3RhdGVfd2FpdGluZ19mb3JfcmVqZWN0IChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQXV0aENvbW1hbmQgICBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphcmdzKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBoYW5kbGVfY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX2FncmVlX3VuaXhfZmQgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBdXRoQ29tbWFuZCAgIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3MpOworCitzdGF0aWMgY29uc3QgREJ1c0F1dGhTdGF0ZURhdGEgY2xpZW50X3N0YXRlX25lZWRfc2VuZF9hdXRoID0geworICAiTmVlZFNlbmRBdXRoIiwgTlVMTAorfTsKK3N0YXRpYyBjb25zdCBEQnVzQXV0aFN0YXRlRGF0YSBjbGllbnRfc3RhdGVfd2FpdGluZ19mb3JfZGF0YSA9IHsKKyAgIldhaXRpbmdGb3JEYXRhIiwgaGFuZGxlX2NsaWVudF9zdGF0ZV93YWl0aW5nX2Zvcl9kYXRhCit9Oworc3RhdGljIGNvbnN0IERCdXNBdXRoU3RhdGVEYXRhIGNsaWVudF9zdGF0ZV93YWl0aW5nX2Zvcl9vayA9IHsKKyAgIldhaXRpbmdGb3JPSyIsIGhhbmRsZV9jbGllbnRfc3RhdGVfd2FpdGluZ19mb3Jfb2sKK307CitzdGF0aWMgY29uc3QgREJ1c0F1dGhTdGF0ZURhdGEgY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX3JlamVjdCA9IHsKKyAgIldhaXRpbmdGb3JSZWplY3QiLCBoYW5kbGVfY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX3JlamVjdAorfTsKK3N0YXRpYyBjb25zdCBEQnVzQXV0aFN0YXRlRGF0YSBjbGllbnRfc3RhdGVfd2FpdGluZ19mb3JfYWdyZWVfdW5peF9mZCA9IHsKKyAgIldhaXRpbmdGb3JBZ3JlZVVuaXhGRCIsIGhhbmRsZV9jbGllbnRfc3RhdGVfd2FpdGluZ19mb3JfYWdyZWVfdW5peF9mZAorfTsKKworLyoqCisgKiBDb21tb24gdGVybWluYWwgc3RhdGVzLiAgVGVybWluYWwgc3RhdGVzIGhhdmUgaGFuZGxlciA9PSBOVUxMLgorICovCisKK3N0YXRpYyBjb25zdCBEQnVzQXV0aFN0YXRlRGF0YSBjb21tb25fc3RhdGVfYXV0aGVudGljYXRlZCA9IHsKKyAgIkF1dGhlbnRpY2F0ZWQiLCAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IERCdXNBdXRoU3RhdGVEYXRhIGNvbW1vbl9zdGF0ZV9uZWVkX2Rpc2Nvbm5lY3QgPSB7CisgICJOZWVkRGlzY29ubmVjdCIsICBOVUxMCit9OworCitzdGF0aWMgY29uc3QgY2hhciBhdXRoX3NpZGVfY2xpZW50W10gPSAiY2xpZW50IjsKK3N0YXRpYyBjb25zdCBjaGFyIGF1dGhfc2lkZV9zZXJ2ZXJbXSA9ICJzZXJ2ZXIiOworLyoqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBjb252ZXJzYXRpb24gaXMgdGhlIHNlcnZlciBzaWRlCisgKi8KKyNkZWZpbmUgREJVU19BVVRIX0lTX1NFUlZFUihhdXRoKSAoKGF1dGgpLT5zaWRlID09IGF1dGhfc2lkZV9zZXJ2ZXIpCisvKioKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGNvbnZlcnNhdGlvbiBpcyB0aGUgY2xpZW50IHNpZGUKKyAqLworI2RlZmluZSBEQlVTX0FVVEhfSVNfQ0xJRU5UKGF1dGgpICgoYXV0aCktPnNpZGUgPT0gYXV0aF9zaWRlX2NsaWVudCkKKy8qKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKiBAcmV0dXJucyBhdXRoIGNhc3QgdG8gREJ1c0F1dGhDbGllbnQKKyAqLworI2RlZmluZSBEQlVTX0FVVEhfQ0xJRU5UKGF1dGgpICAgICgoREJ1c0F1dGhDbGllbnQqKShhdXRoKSkKKy8qKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKiBAcmV0dXJucyBhdXRoIGNhc3QgdG8gREJ1c0F1dGhTZXJ2ZXIKKyAqLworI2RlZmluZSBEQlVTX0FVVEhfU0VSVkVSKGF1dGgpICAgICgoREJ1c0F1dGhTZXJ2ZXIqKShhdXRoKSkKKworLyoqCisgKiBUaGUgbmFtZSBvZiB0aGUgYXV0aCAoImNsaWVudCIgb3IgInNlcnZlciIpCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEByZXR1cm5zIGEgc3RyaW5nCisgKi8KKyNkZWZpbmUgREJVU19BVVRIX05BTUUoYXV0aCkgICAgICAoKGF1dGgpLT5zaWRlKQorCitzdGF0aWMgREJ1c0F1dGgqCitfZGJ1c19hdXRoX25ldyAoaW50IHNpemUpCit7CisgIERCdXNBdXRoICphdXRoOworICAKKyAgYXV0aCA9IGRidXNfbWFsbG9jMCAoc2l6ZSk7CisgIGlmIChhdXRoID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBhdXRoLT5yZWZjb3VudCA9IDE7CisgIAorICBhdXRoLT5rZXlyaW5nID0gTlVMTDsKKyAgYXV0aC0+Y29va2llX2lkID0gLTE7CisgIAorICAvKiBub3RlIHRoYXQgd2UgZG9uJ3QgdXNlIHRoZSBtYXggc3RyaW5nIGxlbmd0aCBmZWF0dXJlLAorICAgKiBiZWNhdXNlIHlvdSBjYW4ndCB1c2UgdGhhdCBmZWF0dXJlIGlmIHlvdSdyZSBnb2luZyB0bworICAgKiB0cnkgdG8gcmVjb3ZlciBmcm9tIG91dC1vZi1tZW1vcnkgKGl0IGNyZWF0ZXMKKyAgICogd2hhdCBsb29rcyBsaWtlIHVucmVjb3ZlcmFibGUgaW5hYmlsaXR5IHRvIGFsbG9jCisgICAqIG1vcmUgc3BhY2UgaW4gdGhlIHN0cmluZykuIEJ1dCB3ZSBkbyBoYW5kbGUKKyAgICogb3ZlcmxvbmcgYnVmZmVycyBpbiBfZGJ1c19hdXRoX2RvX3dvcmsoKS4KKyAgICovCisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYXV0aC0+aW5jb21pbmcpKQorICAgIGdvdG8gZW5vbWVtXzA7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmF1dGgtPm91dGdvaW5nKSkKKyAgICBnb3RvIGVub21lbV8xOworICAgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYXV0aC0+aWRlbnRpdHkpKQorICAgIGdvdG8gZW5vbWVtXzI7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmF1dGgtPmNvbnRleHQpKQorICAgIGdvdG8gZW5vbWVtXzM7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmF1dGgtPmNoYWxsZW5nZSkpCisgICAgZ290byBlbm9tZW1fNDsKKworICAvKiBkZWZhdWx0IGNvbnRleHQgaWYgbm9uZSBpcyBzcGVjaWZpZWQgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV0aC0+Y29udGV4dCwgIm9yZ19mcmVlZGVza3RvcF9nZW5lcmFsIikpCisgICAgZ290byBlbm9tZW1fNTsKKworICBhdXRoLT5jcmVkZW50aWFscyA9IF9kYnVzX2NyZWRlbnRpYWxzX25ldyAoKTsKKyAgaWYgKGF1dGgtPmNyZWRlbnRpYWxzID09IE5VTEwpCisgICAgZ290byBlbm9tZW1fNjsKKyAgCisgIGF1dGgtPmF1dGhvcml6ZWRfaWRlbnRpdHkgPSBfZGJ1c19jcmVkZW50aWFsc19uZXcgKCk7CisgIGlmIChhdXRoLT5hdXRob3JpemVkX2lkZW50aXR5ID09IE5VTEwpCisgICAgZ290byBlbm9tZW1fNzsKKworICBhdXRoLT5kZXNpcmVkX2lkZW50aXR5ID0gX2RidXNfY3JlZGVudGlhbHNfbmV3ICgpOworICBpZiAoYXV0aC0+ZGVzaXJlZF9pZGVudGl0eSA9PSBOVUxMKQorICAgIGdvdG8gZW5vbWVtXzg7CisgIAorICByZXR1cm4gYXV0aDsKKworI2lmIDAKKyBlbm9tZW1fOToKKyAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGF1dGgtPmRlc2lyZWRfaWRlbnRpdHkpOworI2VuZGlmCisgZW5vbWVtXzg6CisgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChhdXRoLT5hdXRob3JpemVkX2lkZW50aXR5KTsKKyBlbm9tZW1fNzoKKyAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGF1dGgtPmNyZWRlbnRpYWxzKTsKKyBlbm9tZW1fNjoKKyAvKiBsYXN0IGFsbG9jIHdhcyBhbiBhcHBlbmQgdG8gY29udGV4dCwgd2hpY2ggaXMgZnJlZWQgYWxyZWFkeSBiZWxvdyAqLyA7CisgZW5vbWVtXzU6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV0aC0+Y2hhbGxlbmdlKTsKKyBlbm9tZW1fNDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXRoLT5jb250ZXh0KTsKKyBlbm9tZW1fMzoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXRoLT5pZGVudGl0eSk7CisgZW5vbWVtXzI6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV0aC0+b3V0Z29pbmcpOworIGVub21lbV8xOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmF1dGgtPmluY29taW5nKTsKKyBlbm9tZW1fMDoKKyAgZGJ1c19mcmVlIChhdXRoKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitzaHV0ZG93bl9tZWNoIChEQnVzQXV0aCAqYXV0aCkKK3sKKyAgLyogQ2FuY2VsIGFueSBhdXRoICovCisgIGF1dGgtPmFscmVhZHlfYXNrZWRfZm9yX2luaXRpYWxfcmVzcG9uc2UgPSBGQUxTRTsKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZhdXRoLT5pZGVudGl0eSwgMCk7CisKKyAgX2RidXNfY3JlZGVudGlhbHNfY2xlYXIgKGF1dGgtPmF1dGhvcml6ZWRfaWRlbnRpdHkpOworICBfZGJ1c19jcmVkZW50aWFsc19jbGVhciAoYXV0aC0+ZGVzaXJlZF9pZGVudGl0eSk7CisgIAorICBpZiAoYXV0aC0+bWVjaCAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogU2h1dHRpbmcgZG93biBtZWNoYW5pc20gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCksIGF1dGgtPm1lY2gtPm1lY2hhbmlzbSk7CisgICAgICAKKyAgICAgIGlmIChEQlVTX0FVVEhfSVNfQ0xJRU5UIChhdXRoKSkKKyAgICAgICAgKCogYXV0aC0+bWVjaC0+Y2xpZW50X3NodXRkb3duX2Z1bmMpIChhdXRoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgKCogYXV0aC0+bWVjaC0+c2VydmVyX3NodXRkb3duX2Z1bmMpIChhdXRoKTsKKyAgICAgIAorICAgICAgYXV0aC0+bWVjaCA9IE5VTEw7CisgICAgfQorfQorCisvKgorICogREJVU19DT09LSUVfU0hBMSBtZWNoYW5pc20KKyAqLworCisvKiBSZXR1cm5zIFRSVUUgYnV0IHdpdGggYW4gZW1wdHkgc3RyaW5nIGhhc2ggaWYgdGhlCisgKiBjb29raWVfaWQgaXNuJ3Qga25vd24uIEFzIHdpdGggYWxsIHRoaXMgY29kZQorICogVFJVRSBqdXN0IG1lYW5zIHdlIGhhZCBlbm91Z2ggbWVtb3J5LgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK3NoYTFfY29tcHV0ZV9oYXNoIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvb2tpZV9pZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpzZXJ2ZXJfY2hhbGxlbmdlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmNsaWVudF9jaGFsbGVuZ2UsCisgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqaGFzaCkKK3sKKyAgREJ1c1N0cmluZyBjb29raWU7CisgIERCdXNTdHJpbmcgdG9faGFzaDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICAKKyAgX2RidXNfYXNzZXJ0IChhdXRoLT5rZXlyaW5nICE9IE5VTEwpOworCisgIHJldHZhbCA9IEZBTFNFOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNvb2tpZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfa2V5cmluZ19nZXRfaGV4X2tleSAoYXV0aC0+a2V5cmluZywgY29va2llX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb29raWUpKQorICAgIGdvdG8gb3V0XzA7CisKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmY29va2llKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICBnb3RvIG91dF8wOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdG9faGFzaCkpCisgICAgZ290byBvdXRfMDsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKHNlcnZlcl9jaGFsbGVuZ2UsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b19oYXNoLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnRvX2hhc2gpKSkKKyAgICBnb3RvIG91dF8xOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnRvX2hhc2gsICI6IikpCisgICAgZ290byBvdXRfMTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKGNsaWVudF9jaGFsbGVuZ2UsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b19oYXNoLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnRvX2hhc2gpKSkKKyAgICBnb3RvIG91dF8xOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnRvX2hhc2gsICI6IikpCisgICAgZ290byBvdXRfMTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmY29va2llLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9faGFzaCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZ0b19oYXNoKSkpCisgICAgZ290byBvdXRfMTsKKworICBpZiAoIV9kYnVzX3NoYV9jb21wdXRlICgmdG9faGFzaCwgaGFzaCkpCisgICAgZ290byBvdXRfMTsKKyAgCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXRfMToKKyAgX2RidXNfc3RyaW5nX3plcm8gKCZ0b19oYXNoKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0b19oYXNoKTsKKyBvdXRfMDoKKyAgX2RidXNfc3RyaW5nX3plcm8gKCZjb29raWUpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvb2tpZSk7CisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKiBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyODMxLnR4dCBzdWdnZXN0cyBhdCBsZWFzdCA2NCBiaXRzIG9mCisgKiBlbnRyb3B5LCB3ZSB1c2UgMTI4LiBUaGlzIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHJhbmRvbQorICogY2hhbGxlbmdlLgorICovCisjZGVmaW5lIE5fQ0hBTExFTkdFX0JZVEVTICgxMjgvOCkKKworc3RhdGljIGRidXNfYm9vbF90CitzaGExX2hhbmRsZV9maXJzdF9jbGllbnRfcmVzcG9uc2UgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmRhdGEpCit7CisgIC8qIFdlIGhhdmVuJ3Qgc2VudCBhIGNoYWxsZW5nZSB5ZXQsIHdlJ3JlIGV4cGVjdGluZyBhIGRlc2lyZWQKKyAgICogdXNlcm5hbWUgZnJvbSB0aGUgY2xpZW50LgorICAgKi8KKyAgREJ1c1N0cmluZyB0bXA7CisgIERCdXNTdHJpbmcgdG1wMjsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzRXJyb3IgZXJyb3I7CisgIAorICByZXR2YWwgPSBGQUxTRTsKKworICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmF1dGgtPmNoYWxsZW5nZSwgMCk7CisgIAorICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpID4gMCkKKyAgICB7CisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZhdXRoLT5pZGVudGl0eSkgPiAwKQorICAgICAgICB7CisgICAgICAgICAgLyogVHJpZWQgdG8gc2VuZCB0d28gYXV0aCBpZGVudGl0aWVzLCB3dGYgKi8KKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IGNsaWVudCB0cmllZCB0byBzZW5kIGF1dGggaWRlbnRpdHksIGJ1dCB3ZSBhbHJlYWR5IGhhdmUgb25lXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgICAgICAgICAgcmV0dXJuIHNlbmRfcmVqZWN0ZWQgKGF1dGgpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiB0aGlzIGlzIG91ciBhdXRoIGlkZW50aXR5ICovCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoZGF0YSwgMCwgJmF1dGgtPmlkZW50aXR5LCAwKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgICAgIAorICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9mcm9tX3VzZXIgKGF1dGgtPmRlc2lyZWRfaWRlbnRpdHksIGRhdGEpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogRGlkIG5vdCBnZXQgYSB2YWxpZCB1c2VybmFtZSBmcm9tIGNsaWVudFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgICAgICByZXR1cm4gc2VuZF9yZWplY3RlZCAoYXV0aCk7CisgICAgfQorICAgICAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ0bXApKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdG1wMikpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0bXApOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiB3ZSBjYWNoZSB0aGUga2V5cmluZyBmb3Igc3BlZWQsIHNvIGhlcmUgd2UgZHJvcCBpdCBpZiBpdCdzIHRoZQorICAgKiB3cm9uZyBvbmUuIEZJWE1FIGNhY2hpbmcgdGhlIGtleXJpbmcgaGVyZSBpcyB1c2VsZXNzIHNpbmNlIHdlIHVzZQorICAgKiBhIGRpZmZlcmVudCBEQnVzQXV0aCBmb3IgZXZlcnkgY29ubmVjdGlvbi4KKyAgICovCisgIGlmIChhdXRoLT5rZXlyaW5nICYmCisgICAgICAhX2RidXNfa2V5cmluZ19pc19mb3JfY3JlZGVudGlhbHMgKGF1dGgtPmtleXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGgtPmRlc2lyZWRfaWRlbnRpdHkpKQorICAgIHsKKyAgICAgIF9kYnVzX2tleXJpbmdfdW5yZWYgKGF1dGgtPmtleXJpbmcpOworICAgICAgYXV0aC0+a2V5cmluZyA9IE5VTEw7CisgICAgfQorICAKKyAgaWYgKGF1dGgtPmtleXJpbmcgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgICAgICBhdXRoLT5rZXlyaW5nID0gX2RidXNfa2V5cmluZ19uZXdfZm9yX2NyZWRlbnRpYWxzIChhdXRoLT5kZXNpcmVkX2lkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1dGgtPmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpOworCisgICAgICBpZiAoYXV0aC0+a2V5cmluZyA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJmVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBFcnJvciBsb2FkaW5nIGtleXJpbmc6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCksIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgICAgICBpZiAoc2VuZF9yZWplY3RlZCAoYXV0aCkpCisgICAgICAgICAgICAgICAgcmV0dmFsID0gVFJVRTsgLyogcmV0dmFsIGlzIG9ubHkgYWJvdXQgbWVtICovCisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoIWRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKTsKKyAgICAgICAgfQorICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGF1dGgtPmtleXJpbmcgIT0gTlVMTCk7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBhdXRoLT5jb29raWVfaWQgPSBfZGJ1c19rZXlyaW5nX2dldF9iZXN0X2tleSAoYXV0aC0+a2V5cmluZywgJmVycm9yKTsKKyAgaWYgKGF1dGgtPmNvb2tpZV9pZCA8IDApCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJmVycm9yKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogQ291bGQgbm90IGdldCBhIGNvb2tpZSBJRCB0byBzZW5kIHRvIGNsaWVudDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCksIGVycm9yLm1lc3NhZ2UpOworICAgICAgaWYgKHNlbmRfcmVqZWN0ZWQgKGF1dGgpKQorICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0ICghZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmYXV0aC0+Y29udGV4dCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcDIsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmdG1wMikpKQorICAgIGdvdG8gb3V0OworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnRtcDIsICIgIikpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2ludCAoJnRtcDIsIGF1dGgtPmNvb2tpZV9pZCkpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmdG1wMiwgIiAiKSkKKyAgICBnb3RvIG91dDsgIAorICAKKyAgaWYgKCFfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYnl0ZXMgKCZ0bXAsIE5fQ0hBTExFTkdFX0JZVEVTKSkKKyAgICBnb3RvIG91dDsKKworICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmF1dGgtPmNoYWxsZW5nZSwgMCk7CisgIGlmICghX2RidXNfc3RyaW5nX2hleF9lbmNvZGUgKCZ0bXAsIDAsICZhdXRoLT5jaGFsbGVuZ2UsIDApKQorICAgIGdvdG8gb3V0OworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAoJnRtcCwgMCwgJnRtcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmdG1wMikpKQorICAgIGdvdG8gb3V0OworCisgIGlmICghc2VuZF9kYXRhIChhdXRoLCAmdG1wMikpCisgICAgZ290byBvdXQ7CisgICAgICAKKyAgZ290b19zdGF0ZSAoYXV0aCwgJnNlcnZlcl9zdGF0ZV93YWl0aW5nX2Zvcl9kYXRhKTsKKyAgcmV0dmFsID0gVFJVRTsKKyAgCisgb3V0OgorICBfZGJ1c19zdHJpbmdfemVybyAoJnRtcCk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmdG1wKTsKKyAgX2RidXNfc3RyaW5nX3plcm8gKCZ0bXAyKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0bXAyKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NoYTFfaGFuZGxlX3NlY29uZF9jbGllbnRfcmVzcG9uc2UgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpkYXRhKQoreworICAvKiBXZSBhcmUgZXhwZWN0aW5nIGEgcmVzcG9uc2Ugd2hpY2ggaXMgdGhlIGhleC1lbmNvZGVkIGNsaWVudAorICAgKiBjaGFsbGVuZ2UsIHNwYWNlLCB0aGVuIFNIQS0xIGhhc2ggb2YgdGhlIGNvbmNhdGVuYXRpb24gb2Ygb3VyCisgICAqIGNoYWxsZW5nZSwgIjoiLCBjbGllbnQgY2hhbGxlbmdlLCAiOiIsIHNlY3JldCBrZXksIGFsbAorICAgKiBoZXgtZW5jb2RlZC4KKyAgICovCisgIGludCBpOworICBEQnVzU3RyaW5nIGNsaWVudF9jaGFsbGVuZ2U7CisgIERCdXNTdHJpbmcgY2xpZW50X2hhc2g7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c1N0cmluZyBjb3JyZWN0X2hhc2g7CisgIAorICByZXR2YWwgPSBGQUxTRTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmRfYmxhbmsgKGRhdGEsIDAsICZpKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IG5vIHNwYWNlIHNlcGFyYXRvciBpbiBjbGllbnQgcmVzcG9uc2VcbiIsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCkpOworICAgICAgcmV0dXJuIHNlbmRfcmVqZWN0ZWQgKGF1dGgpOworICAgIH0KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjbGllbnRfY2hhbGxlbmdlKSkKKyAgICBnb3RvIG91dF8wOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjbGllbnRfaGFzaCkpCisgICAgZ290byBvdXRfMTsgIAorCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuIChkYXRhLCAwLCBpLCAmY2xpZW50X2NoYWxsZW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKQorICAgIGdvdG8gb3V0XzI7CisKKyAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgKGRhdGEsIGksICZpKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuIChkYXRhLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpIC0gaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGllbnRfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKQorICAgIGdvdG8gb3V0XzI7CisKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmY2xpZW50X2NoYWxsZW5nZSkgPT0gMCB8fAorICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZjbGllbnRfaGFzaCkgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IHplcm8tbGVuZ3RoIGNsaWVudCBjaGFsbGVuZ2Ugb3IgaGFzaFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgICAgICBpZiAoc2VuZF9yZWplY3RlZCAoYXV0aCkpCisgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICBnb3RvIG91dF8yOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmY29ycmVjdF9oYXNoKSkKKyAgICBnb3RvIG91dF8yOworCisgIGlmICghc2hhMV9jb21wdXRlX2hhc2ggKGF1dGgsIGF1dGgtPmNvb2tpZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1dGgtPmNoYWxsZW5nZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGllbnRfY2hhbGxlbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29ycmVjdF9oYXNoKSkKKyAgICBnb3RvIG91dF8zOworCisgIC8qIGlmIGNvb2tpZV9pZCB3YXMgaW52YWxpZCwgdGhlbiB3ZSBnZXQgYW4gZW1wdHkgaGFzaCAqLworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZjb3JyZWN0X2hhc2gpID09IDApCisgICAgeworICAgICAgaWYgKHNlbmRfcmVqZWN0ZWQgKGF1dGgpKQorICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgZ290byBvdXRfMzsKKyAgICB9CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbCAoJmNsaWVudF9oYXNoLCAmY29ycmVjdF9oYXNoKSkKKyAgICB7CisgICAgICBpZiAoc2VuZF9yZWplY3RlZCAoYXV0aCkpCisgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICBnb3RvIG91dF8zOworICAgIH0KKworICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9jcmVkZW50aWFscyAoYXV0aC0+YXV0aG9yaXplZF9pZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGgtPmRlc2lyZWRfaWRlbnRpdHkpKQorICAgIGdvdG8gb3V0XzM7CisKKyAgLyogQ29weSBwcm9jZXNzIElEIGZyb20gdGhlIHNvY2tldCBjcmVkZW50aWFscyBpZiBpdCdzIHRoZXJlCisgICAqLworICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9jcmVkZW50aWFsIChhdXRoLT5hdXRob3JpemVkX2lkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NSRURFTlRJQUxfVU5JWF9QUk9DRVNTX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoLT5jcmVkZW50aWFscykpCisgICAgZ290byBvdXRfMzsKKyAgCisgIGlmICghc2VuZF9vayAoYXV0aCkpCisgICAgZ290byBvdXRfMzsKKworICBfZGJ1c192ZXJib3NlICgiJXM6IGF1dGhlbnRpY2F0ZWQgY2xpZW50IHVzaW5nIERCVVNfQ09PS0lFX1NIQTFcbiIsCisgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgIAorICByZXR2YWwgPSBUUlVFOworICAKKyBvdXRfMzoKKyAgX2RidXNfc3RyaW5nX3plcm8gKCZjb3JyZWN0X2hhc2gpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvcnJlY3RfaGFzaCk7Cisgb3V0XzI6CisgIF9kYnVzX3N0cmluZ196ZXJvICgmY2xpZW50X2hhc2gpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNsaWVudF9oYXNoKTsKKyBvdXRfMToKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjbGllbnRfY2hhbGxlbmdlKTsKKyBvdXRfMDoKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfc2VydmVyX2RhdGFfY29va2llX3NoYTFfbWVjaCAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpkYXRhKQoreworICBpZiAoYXV0aC0+Y29va2llX2lkIDwgMCkKKyAgICByZXR1cm4gc2hhMV9oYW5kbGVfZmlyc3RfY2xpZW50X3Jlc3BvbnNlIChhdXRoLCBkYXRhKTsKKyAgZWxzZQorICAgIHJldHVybiBzaGExX2hhbmRsZV9zZWNvbmRfY2xpZW50X3Jlc3BvbnNlIChhdXRoLCBkYXRhKTsKK30KKworc3RhdGljIHZvaWQKK2hhbmRsZV9zZXJ2ZXJfc2h1dGRvd25fY29va2llX3NoYTFfbWVjaCAoREJ1c0F1dGggKmF1dGgpCit7CisgIGF1dGgtPmNvb2tpZV9pZCA9IC0xOyAgCisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmYXV0aC0+Y2hhbGxlbmdlLCAwKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfY2xpZW50X2luaXRpYWxfcmVzcG9uc2VfY29va2llX3NoYTFfbWVjaCAoREJ1c0F1dGggICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICpyZXNwb25zZSkKK3sKKyAgREJ1c1N0cmluZyB1c2VybmFtZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ1c2VybmFtZSkpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgaWYgKCFfZGJ1c19hcHBlbmRfdXNlcl9mcm9tX2N1cnJlbnRfcHJvY2VzcyAoJnVzZXJuYW1lKSkKKyAgICBnb3RvIG91dF8wOworCisgIGlmICghX2RidXNfc3RyaW5nX2hleF9lbmNvZGUgKCZ1c2VybmFtZSwgMCwKKwkJCQlyZXNwb25zZSwKKwkJCQlfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocmVzcG9uc2UpKSkKKyAgICBnb3RvIG91dF8wOworCisgIHJldHZhbCA9IFRSVUU7CisgIAorIG91dF8wOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnVzZXJuYW1lKTsKKyAgCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraGFuZGxlX2NsaWVudF9kYXRhX2Nvb2tpZV9zaGExX21lY2ggKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZGF0YSkKK3sKKyAgLyogVGhlIGRhdGEgd2UgZ2V0IGZyb20gdGhlIHNlcnZlciBzaG91bGQgYmUgdGhlIGNvb2tpZSBjb250ZXh0CisgICAqIG5hbWUsIHRoZSBjb29raWUgSUQsIGFuZCB0aGUgc2VydmVyIGNoYWxsZW5nZSwgc2VwYXJhdGVkIGJ5CisgICAqIHNwYWNlcy4gV2Ugc2VuZCBiYWNrIG91ciBjaGFsbGVuZ2Ugc3RyaW5nIGFuZCB0aGUgY29ycmVjdCBoYXNoLgorICAgKi8KKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzU3RyaW5nIGNvbnRleHQ7CisgIERCdXNTdHJpbmcgY29va2llX2lkX3N0cjsKKyAgREJ1c1N0cmluZyBzZXJ2ZXJfY2hhbGxlbmdlOworICBEQnVzU3RyaW5nIGNsaWVudF9jaGFsbGVuZ2U7CisgIERCdXNTdHJpbmcgY29ycmVjdF9oYXNoOworICBEQnVzU3RyaW5nIHRtcDsKKyAgaW50IGksIGo7CisgIGxvbmcgdmFsOworICAKKyAgcmV0dmFsID0gRkFMU0U7ICAgICAgICAgICAgICAgICAKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmRfYmxhbmsgKGRhdGEsIDAsICZpKSkKKyAgICB7CisgICAgICBpZiAoc2VuZF9lcnJvciAoYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAiU2VydmVyIGRpZCBub3Qgc2VuZCBjb250ZXh0L0lEL2NoYWxsZW5nZSBwcm9wZXJseSIpKQorICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgZ290byBvdXRfMDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNvbnRleHQpKQorICAgIGdvdG8gb3V0XzA7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9sZW4gKGRhdGEsIDAsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dCwgMCkpCisgICAgZ290byBvdXRfMTsKKyAgCisgIF9kYnVzX3N0cmluZ19za2lwX2JsYW5rIChkYXRhLCBpLCAmaSk7CisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmRfYmxhbmsgKGRhdGEsIGksICZqKSkKKyAgICB7CisgICAgICBpZiAoc2VuZF9lcnJvciAoYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAiU2VydmVyIGRpZCBub3Qgc2VuZCBjb250ZXh0L0lEL2NoYWxsZW5nZSBwcm9wZXJseSIpKQorICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgZ290byBvdXRfMTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNvb2tpZV9pZF9zdHIpKQorICAgIGdvdG8gb3V0XzE7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoZGF0YSwgaSwgaiAtIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29va2llX2lkX3N0ciwgMCkpCisgICAgZ290byBvdXRfMjsgIAorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzZXJ2ZXJfY2hhbGxlbmdlKSkKKyAgICBnb3RvIG91dF8yOworCisgIGkgPSBqOworICBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAoZGF0YSwgaSwgJmkpOworICBqID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuIChkYXRhLCBpLCBqIC0gaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2ZXJfY2hhbGxlbmdlLCAwKSkKKyAgICBnb3RvIG91dF8zOworCisgIGlmICghX2RidXNfa2V5cmluZ192YWxpZGF0ZV9jb250ZXh0ICgmY29udGV4dCkpCisgICAgeworICAgICAgaWYgKHNlbmRfZXJyb3IgKGF1dGgsICJTZXJ2ZXIgc2VudCBpbnZhbGlkIGNvb2tpZSBjb250ZXh0IikpCisgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICBnb3RvIG91dF8zOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19wYXJzZV9pbnQgKCZjb29raWVfaWRfc3RyLCAwLCAmdmFsLCBOVUxMKSkKKyAgICB7CisgICAgICBpZiAoc2VuZF9lcnJvciAoYXV0aCwgIkNvdWxkIG5vdCBwYXJzZSBjb29raWUgSUQgYXMgYW4gaW50ZWdlciIpKQorICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgZ290byBvdXRfMzsKKyAgICB9CisKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc2VydmVyX2NoYWxsZW5nZSkgPT0gMCkKKyAgICB7CisgICAgICBpZiAoc2VuZF9lcnJvciAoYXV0aCwgIkVtcHR5IHNlcnZlciBjaGFsbGVuZ2Ugc3RyaW5nIikpCisgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICBnb3RvIG91dF8zOworICAgIH0KKworICBpZiAoYXV0aC0+a2V5cmluZyA9PSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNFcnJvciBlcnJvcjsKKworICAgICAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICAgICAgYXV0aC0+a2V5cmluZyA9IF9kYnVzX2tleXJpbmdfbmV3X2Zvcl9jcmVkZW50aWFscyAoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKTsKKworICAgICAgaWYgKGF1dGgtPmtleXJpbmcgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgICAgICBnb3RvIG91dF8zOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJmVycm9yKTsKKworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IEVycm9yIGxvYWRpbmcga2V5cmluZzogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSwgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoc2VuZF9lcnJvciAoYXV0aCwgIkNvdWxkIG5vdCBsb2FkIGNvb2tpZSBmaWxlIikpCisgICAgICAgICAgICAgICAgcmV0dmFsID0gVFJVRTsgLyogcmV0dmFsIGlzIG9ubHkgYWJvdXQgbWVtICovCisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gb3V0XzM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoIWRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIF9kYnVzX2Fzc2VydCAoYXV0aC0+a2V5cmluZyAhPSBOVUxMKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ0bXApKQorICAgIGdvdG8gb3V0XzM7CisgIAorICBpZiAoIV9kYnVzX2dlbmVyYXRlX3JhbmRvbV9ieXRlcyAoJnRtcCwgTl9DSEFMTEVOR0VfQllURVMpKQorICAgIGdvdG8gb3V0XzQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNsaWVudF9jaGFsbGVuZ2UpKQorICAgIGdvdG8gb3V0XzQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAoJnRtcCwgMCwgJmNsaWVudF9jaGFsbGVuZ2UsIDApKQorICAgIGdvdG8gb3V0XzU7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNvcnJlY3RfaGFzaCkpCisgICAgZ290byBvdXRfNTsKKyAgCisgIGlmICghc2hhMV9jb21wdXRlX2hhc2ggKGF1dGgsIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcnZlcl9jaGFsbGVuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGllbnRfY2hhbGxlbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29ycmVjdF9oYXNoKSkKKyAgICBnb3RvIG91dF82OworCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmNvcnJlY3RfaGFzaCkgPT0gMCkKKyAgICB7CisgICAgICAvKiBjb3VsZG4ndCBmaW5kIHRoZSBjb29raWUgSUQgb3Igc29tZXRoaW5nICovCisgICAgICBpZiAoc2VuZF9lcnJvciAoYXV0aCwgIkRvbid0IGhhdmUgdGhlIHJlcXVlc3RlZCBjb29raWUgSUQiKSkKKyAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgIGdvdG8gb3V0XzY7CisgICAgfQorICAKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZ0bXAsIDApOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmNsaWVudF9jaGFsbGVuZ2UsIDAsICZ0bXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmdG1wKSkpCisgICAgZ290byBvdXRfNjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZ0bXAsICIgIikpCisgICAgZ290byBvdXRfNjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmY29ycmVjdF9oYXNoLCAwLCAmdG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnRtcCkpKQorICAgIGdvdG8gb3V0XzY7CisKKyAgaWYgKCFzZW5kX2RhdGEgKGF1dGgsICZ0bXApKQorICAgIGdvdG8gb3V0XzY7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dF82OgorICBfZGJ1c19zdHJpbmdfemVybyAoJmNvcnJlY3RfaGFzaCk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29ycmVjdF9oYXNoKTsKKyBvdXRfNToKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjbGllbnRfY2hhbGxlbmdlKTsKKyBvdXRfNDoKKyAgX2RidXNfc3RyaW5nX3plcm8gKCZ0bXApOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRtcCk7Cisgb3V0XzM6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmc2VydmVyX2NoYWxsZW5nZSk7Cisgb3V0XzI6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29va2llX2lkX3N0cik7Cisgb3V0XzE6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29udGV4dCk7Cisgb3V0XzA6CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfY2xpZW50X3NodXRkb3duX2Nvb2tpZV9zaGExX21lY2ggKERCdXNBdXRoICphdXRoKQoreworICBhdXRoLT5jb29raWVfaWQgPSAtMTsgIAorICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmF1dGgtPmNoYWxsZW5nZSwgMCk7Cit9CisKKy8qCisgKiBFWFRFUk5BTCBtZWNoYW5pc20KKyAqLworCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV9zZXJ2ZXJfZGF0YV9leHRlcm5hbF9tZWNoIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmRhdGEpCit7CisgIGlmIChfZGJ1c19jcmVkZW50aWFsc19hcmVfYW5vbnltb3VzIChhdXRoLT5jcmVkZW50aWFscykpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBubyBjcmVkZW50aWFscywgbWVjaGFuaXNtIEVYVEVSTkFMIGNhbid0IGF1dGhlbnRpY2F0ZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgICAgICByZXR1cm4gc2VuZF9yZWplY3RlZCAoYXV0aCk7CisgICAgfQorICAKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSA+IDApCisgICAgeworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYXV0aC0+aWRlbnRpdHkpID4gMCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFRyaWVkIHRvIHNlbmQgdHdvIGF1dGggaWRlbnRpdGllcywgd3RmICovCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBjbGllbnQgdHJpZWQgdG8gc2VuZCBhdXRoIGlkZW50aXR5LCBidXQgd2UgYWxyZWFkeSBoYXZlIG9uZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCkpOworICAgICAgICAgIHJldHVybiBzZW5kX3JlamVjdGVkIChhdXRoKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogdGhpcyBpcyBvdXIgYXV0aCBpZGVudGl0eSAqLworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKGRhdGEsIDAsICZhdXRoLT5pZGVudGl0eSwgMCkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogUG9rZSBjbGllbnQgZm9yIGFuIGF1dGggaWRlbnRpdHksIGlmIG5vbmUgZ2l2ZW4gKi8KKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYXV0aC0+aWRlbnRpdHkpID09IDAgJiYKKyAgICAgICFhdXRoLT5hbHJlYWR5X2Fza2VkX2Zvcl9pbml0aWFsX3Jlc3BvbnNlKQorICAgIHsKKyAgICAgIGlmIChzZW5kX2RhdGEgKGF1dGgsIE5VTEwpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBzZW5kaW5nIGVtcHR5IGNoYWxsZW5nZSBhc2tpbmcgY2xpZW50IGZvciBhdXRoIGlkZW50aXR5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgICAgICAgICAgYXV0aC0+YWxyZWFkeV9hc2tlZF9mb3JfaW5pdGlhbF9yZXNwb25zZSA9IFRSVUU7CisgICAgICAgICAgZ290b19zdGF0ZSAoYXV0aCwgJnNlcnZlcl9zdGF0ZV93YWl0aW5nX2Zvcl9kYXRhKTsKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX2NyZWRlbnRpYWxzX2NsZWFyIChhdXRoLT5kZXNpcmVkX2lkZW50aXR5KTsKKyAgCisgIC8qIElmIGF1dGgtPmlkZW50aXR5IGlzIHN0aWxsIGVtcHR5IGhlcmUsIHRoZW4gY2xpZW50CisgICAqIHJlc3BvbmRlZCB3aXRoIGFuIGVtcHR5IHN0cmluZyBhZnRlciB3ZSBwb2tlZCBpdCBmb3IKKyAgICogYW4gaW5pdGlhbCByZXNwb25zZS4gVGhpcyBtZWFucyB0byB0cnkgdG8gYXV0aCB0aGUKKyAgICogaWRlbnRpdHkgcHJvdmlkZWQgaW4gdGhlIGNyZWRlbnRpYWxzLgorICAgKi8KKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYXV0aC0+aWRlbnRpdHkpID09IDApCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbHMgKGF1dGgtPmRlc2lyZWRfaWRlbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aC0+Y3JlZGVudGlhbHMpKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOyAvKiBPT00gKi8KKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX2Zyb21fdXNlciAoYXV0aC0+ZGVzaXJlZF9pZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1dGgtPmlkZW50aXR5KSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogY291bGQgbm90IGdldCBjcmVkZW50aWFscyBmcm9tIHVpZCBzdHJpbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpKTsKKyAgICAgICAgICByZXR1cm4gc2VuZF9yZWplY3RlZCAoYXV0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKF9kYnVzX2NyZWRlbnRpYWxzX2FyZV9hbm9ueW1vdXMgKGF1dGgtPmRlc2lyZWRfaWRlbnRpdHkpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogZGVzaXJlZCB1c2VyICVzIGlzIG5vIGdvb2RcbiIsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCksCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZhdXRoLT5pZGVudGl0eSkpOworICAgICAgcmV0dXJuIHNlbmRfcmVqZWN0ZWQgKGF1dGgpOworICAgIH0KKyAgCisgIGlmIChfZGJ1c19jcmVkZW50aWFsc19hcmVfc3VwZXJzZXQgKGF1dGgtPmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoLT5kZXNpcmVkX2lkZW50aXR5KSkKKyAgICB7CisgICAgICAvKiBjbGllbnQgaGFzIGF1dGhlbnRpY2F0ZWQgKi8KKyAgICAgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX2NyZWRlbnRpYWxzIChhdXRoLT5hdXRob3JpemVkX2lkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGgtPmRlc2lyZWRfaWRlbnRpdHkpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIC8qIGFsc28gY29weSBwcm9jZXNzIElEIGZyb20gdGhlIHNvY2tldCBjcmVkZW50aWFscworICAgICAgICovCisgICAgICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9jcmVkZW50aWFsIChhdXRoLT5hdXRob3JpemVkX2lkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19DUkVERU5USUFMX1VOSVhfUFJPQ0VTU19JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGgtPmNyZWRlbnRpYWxzKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAvKiBhbHNvIGNvcHkgYXVkaXQgZGF0YSBmcm9tIHRoZSBzb2NrZXQgY3JlZGVudGlhbHMKKyAgICAgICAqLworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbCAoYXV0aC0+YXV0aG9yaXplZF9pZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQ1JFREVOVElBTF9BRFRfQVVESVRfREFUQV9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGgtPmNyZWRlbnRpYWxzKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBpZiAoIXNlbmRfb2sgKGF1dGgpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogYXV0aGVudGljYXRlZCBjbGllbnQgYmFzZWQgb24gc29ja2V0IGNyZWRlbnRpYWxzXG4iLAorICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpKTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBkZXNpcmVkIGlkZW50aXR5IG5vdCBmb3VuZCBpbiBzb2NrZXQgY3JlZGVudGlhbHNcbiIsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCkpOworICAgICAgcmV0dXJuIHNlbmRfcmVqZWN0ZWQgKGF1dGgpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2hhbmRsZV9zZXJ2ZXJfc2h1dGRvd25fZXh0ZXJuYWxfbWVjaCAoREJ1c0F1dGggKmF1dGgpCit7CisKK30KKworc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfY2xpZW50X2luaXRpYWxfcmVzcG9uc2VfZXh0ZXJuYWxfbWVjaCAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpyZXNwb25zZSkKK3sKKyAgLyogV2UgYWx3YXlzIGFwcGVuZCBvdXIgVUlEIGFzIGFuIGluaXRpYWwgcmVzcG9uc2UsIHNvIHRoZSBzZXJ2ZXIKKyAgICogZG9lc24ndCBoYXZlIHRvIHNlbmQgYmFjayBhbiBlbXB0eSBjaGFsbGVuZ2UgdG8gY2hlY2sgd2hldGhlciB3ZQorICAgKiB3YW50IHRvIHNwZWNpZnkgYW4gaWRlbnRpdHkuIGkuZS4gdGhpcyBhdm9pZHMgYSByb3VuZCB0cmlwIHRoYXQKKyAgICogdGhlIHNwZWMgZm9yIHRoZSBFWFRFUk5BTCBtZWNoYW5pc20gb3RoZXJ3aXNlIHJlcXVpcmVzLgorICAgKi8KKyAgREJ1c1N0cmluZyBwbGFpbnRleHQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnBsYWludGV4dCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfYXBwZW5kX3VzZXJfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKCZwbGFpbnRleHQpKQorICAgIGdvdG8gZmFpbGVkOworCisgIGlmICghX2RidXNfc3RyaW5nX2hleF9lbmNvZGUgKCZwbGFpbnRleHQsIDAsCisJCQkJcmVzcG9uc2UsCisJCQkJX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHJlc3BvbnNlKSkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwbGFpbnRleHQpOworICAKKyAgcmV0dXJuIFRSVUU7CisKKyBmYWlsZWQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcGxhaW50ZXh0KTsKKyAgcmV0dXJuIEZBTFNFOyAgCit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraGFuZGxlX2NsaWVudF9kYXRhX2V4dGVybmFsX21lY2ggKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZGF0YSkKK3sKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX2NsaWVudF9zaHV0ZG93bl9leHRlcm5hbF9tZWNoIChEQnVzQXV0aCAqYXV0aCkKK3sKKworfQorCisvKgorICogQU5PTllNT1VTIG1lY2hhbmlzbQorICovCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraGFuZGxlX3NlcnZlcl9kYXRhX2Fub255bW91c19tZWNoIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpkYXRhKQoreyAgCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGF0YSkgPiAwKQorICAgIHsKKyAgICAgIC8qIENsaWVudCBpcyBhbGxvd2VkIHRvIHNlbmQgInRyYWNlIiBkYXRhLCB0aGUgb25seSBkZWZpbmVkCisgICAgICAgKiBtZWFuaW5nIGlzIHRoYXQgaWYgaXQgY29udGFpbnMgJ0AnIGl0IGlzIGFuIGVtYWlsIGFkZHJlc3MsCisgICAgICAgKiBhbmQgb3RoZXJ3aXNlIGl0IGlzIGFueXRoaW5nIGVsc2UsIGFuZCBpdCdzIHN1cHBvc2VkIHRvIGJlCisgICAgICAgKiBVVEYtOAorICAgICAgICovCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ192YWxpZGF0ZV91dGY4IChkYXRhLCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGF0YSkpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBSZWNlaXZlZCBpbnZhbGlkIFVURi04IHRyYWNlIGRhdGEgZnJvbSBBTk9OWU1PVVMgY2xpZW50XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgICAgICAgICAgcmV0dXJuIHNlbmRfcmVqZWN0ZWQgKGF1dGgpOworICAgICAgICB9CisgICAgICAKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogQU5PTllNT1VTIGNsaWVudCBzZW50IHRyYWNlIHN0cmluZzogJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZGF0YSkpOworICAgIH0KKworICAvKiBXZSB3YW50IHRvIGJlIGFub255bW91cyAoY2xlYXIgaW4gY2FzZSBzb21lIG90aGVyIHByb3RvY29sIGdvdCBtaWR3YXkgdGhyb3VnaCBJIGd1ZXNzKSAqLworICBfZGJ1c19jcmVkZW50aWFsc19jbGVhciAoYXV0aC0+ZGVzaXJlZF9pZGVudGl0eSk7CisKKyAgLyogQ29weSBwcm9jZXNzIElEIGZyb20gdGhlIHNvY2tldCBjcmVkZW50aWFscworICAgKi8KKyAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbCAoYXV0aC0+YXV0aG9yaXplZF9pZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19DUkVERU5USUFMX1VOSVhfUFJPQ0VTU19JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aC0+Y3JlZGVudGlhbHMpKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIC8qIEFub255bW91cyBpcyBhbHdheXMgYWxsb3dlZCAqLworICBpZiAoIXNlbmRfb2sgKGF1dGgpKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c192ZXJib3NlICgiJXM6IGF1dGhlbnRpY2F0ZWQgY2xpZW50IGFzIGFub255bW91c1xuIiwKKyAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2hhbmRsZV9zZXJ2ZXJfc2h1dGRvd25fYW5vbnltb3VzX21lY2ggKERCdXNBdXRoICphdXRoKQoreworICAKK30KKworc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfY2xpZW50X2luaXRpYWxfcmVzcG9uc2VfYW5vbnltb3VzX21lY2ggKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKnJlc3BvbnNlKQoreworICAvKiBPdXIgaW5pdGlhbCByZXNwb25zZSBpcyBhICJ0cmFjZSIgc3RyaW5nIHdoaWNoIG11c3QgYmUgdmFsaWQgVVRGLTgKKyAgICogYW5kIG11c3QgYmUgYW4gZW1haWwgYWRkcmVzcyBpZiBpdCBjb250YWlucyAnQCcuCisgICAqIFdlIGp1c3Qgc2VuZCB0aGUgZGJ1cyBpbXBsZW1lbnRhdGlvbiBpbmZvLCBsaWtlIGEgdXNlci1hZ2VudCBvcgorICAgKiBzb21ldGhpbmcsIGJlY2F1c2UuLi4gd2h5IG5vdC4gVGhlcmUncyBub3RoaW5nIGd1YXJhbnRlZWQgaGVyZQorICAgKiB0aG91Z2gsIHdlIGNvdWxkIGNoYW5nZSBpdCBsYXRlci4KKyAgICovCisgIERCdXNTdHJpbmcgcGxhaW50ZXh0OworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZwbGFpbnRleHQpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZwbGFpbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpYmRidXMgIiBEQlVTX1ZFUlNJT05fU1RSSU5HKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19oZXhfZW5jb2RlICgmcGxhaW50ZXh0LCAwLAorCQkJCXJlc3BvbnNlLAorCQkJCV9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChyZXNwb25zZSkpKQorICAgIGdvdG8gZmFpbGVkOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmcGxhaW50ZXh0KTsKKyAgCisgIHJldHVybiBUUlVFOworCisgZmFpbGVkOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBsYWludGV4dCk7CisgIHJldHVybiBGQUxTRTsgIAorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV9jbGllbnRfZGF0YV9hbm9ueW1vdXNfbWVjaCAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpkYXRhKQoreworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfY2xpZW50X3NodXRkb3duX2Fub255bW91c19tZWNoIChEQnVzQXV0aCAqYXV0aCkKK3sKKyAgCit9CisKKy8qIFB1dCBtZWNoYW5pc21zIGhlcmUgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZS4KKyAqIFJpZ2h0IG5vdyB3ZSBoYXZlOgorICoKKyAqIC0gRVhURVJOQUwgY2hlY2tzIHNvY2tldCBjcmVkZW50aWFscyAob3IgaW4gdGhlIGZ1dHVyZSwgb3RoZXIgaW5mbyBmcm9tIHRoZSBPUykKKyAqIC0gREJVU19DT09LSUVfU0hBMSB1c2VzIGEgY29va2llIGluIHRoZSBob21lIGRpcmVjdG9yeSwgbGlrZSB4YXV0aCBvciBJQ0UKKyAqIC0gQU5PTllNT1VTIGNoZWNrcyBub3RoaW5nIGJ1dCBkb2Vzbid0IGF1dGggdGhlIHBlcnNvbiBhcyBhIHVzZXIKKyAqCisgKiBXZSBtaWdodCBpZGVhbGx5IGFkZCBhIG1lY2hhbmlzbSB0byBjaGFpbiB0byBDeXJ1cyBTQVNMIHNvIHdlIGNhbgorICogdXNlIGl0cyBtZWNoYW5pc21zIGFzIHdlbGwuCisgKiAKKyAqLworc3RhdGljIGNvbnN0IERCdXNBdXRoTWVjaGFuaXNtSGFuZGxlcgorYWxsX21lY2hhbmlzbXNbXSA9IHsKKyAgeyAiRVhURVJOQUwiLAorICAgIGhhbmRsZV9zZXJ2ZXJfZGF0YV9leHRlcm5hbF9tZWNoLAorICAgIE5VTEwsIE5VTEwsCisgICAgaGFuZGxlX3NlcnZlcl9zaHV0ZG93bl9leHRlcm5hbF9tZWNoLAorICAgIGhhbmRsZV9jbGllbnRfaW5pdGlhbF9yZXNwb25zZV9leHRlcm5hbF9tZWNoLAorICAgIGhhbmRsZV9jbGllbnRfZGF0YV9leHRlcm5hbF9tZWNoLAorICAgIE5VTEwsIE5VTEwsCisgICAgaGFuZGxlX2NsaWVudF9zaHV0ZG93bl9leHRlcm5hbF9tZWNoIH0sCisgIHsgIkRCVVNfQ09PS0lFX1NIQTEiLAorICAgIGhhbmRsZV9zZXJ2ZXJfZGF0YV9jb29raWVfc2hhMV9tZWNoLAorICAgIE5VTEwsIE5VTEwsCisgICAgaGFuZGxlX3NlcnZlcl9zaHV0ZG93bl9jb29raWVfc2hhMV9tZWNoLAorICAgIGhhbmRsZV9jbGllbnRfaW5pdGlhbF9yZXNwb25zZV9jb29raWVfc2hhMV9tZWNoLAorICAgIGhhbmRsZV9jbGllbnRfZGF0YV9jb29raWVfc2hhMV9tZWNoLAorICAgIE5VTEwsIE5VTEwsCisgICAgaGFuZGxlX2NsaWVudF9zaHV0ZG93bl9jb29raWVfc2hhMV9tZWNoIH0sCisgIHsgIkFOT05ZTU9VUyIsCisgICAgaGFuZGxlX3NlcnZlcl9kYXRhX2Fub255bW91c19tZWNoLAorICAgIE5VTEwsIE5VTEwsCisgICAgaGFuZGxlX3NlcnZlcl9zaHV0ZG93bl9hbm9ueW1vdXNfbWVjaCwKKyAgICBoYW5kbGVfY2xpZW50X2luaXRpYWxfcmVzcG9uc2VfYW5vbnltb3VzX21lY2gsCisgICAgaGFuZGxlX2NsaWVudF9kYXRhX2Fub255bW91c19tZWNoLAorICAgIE5VTEwsIE5VTEwsCisgICAgaGFuZGxlX2NsaWVudF9zaHV0ZG93bl9hbm9ueW1vdXNfbWVjaCB9LCAgCisgIHsgTlVMTCwgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgREJ1c0F1dGhNZWNoYW5pc21IYW5kbGVyKgorZmluZF9tZWNoIChjb25zdCBEQnVzU3RyaW5nICAqbmFtZSwKKyAgICAgICAgICAgY2hhciAgICAgICAgICAgICAqKmFsbG93ZWRfbWVjaHMpCit7CisgIGludCBpOworICAKKyAgaWYgKGFsbG93ZWRfbWVjaHMgIT0gTlVMTCAmJgorICAgICAgIV9kYnVzX3N0cmluZ19hcnJheV9jb250YWlucyAoKGNvbnN0IGNoYXIqKikgYWxsb3dlZF9tZWNocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAobmFtZSkpKQorICAgIHJldHVybiBOVUxMOworICAKKyAgaSA9IDA7CisgIHdoaWxlIChhbGxfbWVjaGFuaXNtc1tpXS5tZWNoYW5pc20gIT0gTlVMTCkKKyAgICB7ICAgICAgCisgICAgICBpZiAoX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyIChuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX21lY2hhbmlzbXNbaV0ubWVjaGFuaXNtKSkKKworICAgICAgICByZXR1cm4gJmFsbF9tZWNoYW5pc21zW2ldOworICAgICAgCisgICAgICArK2k7CisgICAgfQorICAKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2VuZF9hdXRoIChEQnVzQXV0aCAqYXV0aCwgY29uc3QgREJ1c0F1dGhNZWNoYW5pc21IYW5kbGVyICptZWNoKQoreworICBEQnVzU3RyaW5nIGF1dGhfY29tbWFuZDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYXV0aF9jb21tYW5kKSkKKyAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV0aF9jb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBVVRIICIpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV0aF9jb21tYW5kKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9ICAKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1dGhfY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWNoLT5tZWNoYW5pc20pKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV0aF9jb21tYW5kKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKG1lY2gtPmNsaWVudF9pbml0aWFsX3Jlc3BvbnNlX2Z1bmMgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXRoX2NvbW1hbmQsICIgIikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmF1dGhfY29tbWFuZCk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAKKyAgICAgIGlmICghKCogbWVjaC0+Y2xpZW50X2luaXRpYWxfcmVzcG9uc2VfZnVuYykgKGF1dGgsICZhdXRoX2NvbW1hbmQpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXRoX2NvbW1hbmQpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1dGhfY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHJcbiIpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV0aF9jb21tYW5kKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmF1dGhfY29tbWFuZCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1dGgtPm91dGdvaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmF1dGgtPm91dGdvaW5nKSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXRoX2NvbW1hbmQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmF1dGhfY29tbWFuZCk7CisgIHNodXRkb3duX21lY2ggKGF1dGgpOworICBhdXRoLT5tZWNoID0gbWVjaDsgICAgICAKKyAgZ290b19zdGF0ZSAoYXV0aCwgJmNsaWVudF9zdGF0ZV93YWl0aW5nX2Zvcl9kYXRhKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZW5kX2RhdGEgKERCdXNBdXRoICphdXRoLCBEQnVzU3RyaW5nICpkYXRhKQoreworICBpbnQgb2xkX2xlbjsKKworICBpZiAoZGF0YSA9PSBOVUxMIHx8IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSA9PSAwKQorICAgIHJldHVybiBfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV0aC0+b3V0Z29pbmcsICJEQVRBXHJcbiIpOworICBlbHNlCisgICAgeworICAgICAgb2xkX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYXV0aC0+b3V0Z29pbmcpOworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV0aC0+b3V0Z29pbmcsICJEQVRBICIpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAoZGF0YSwgMCwgJmF1dGgtPm91dGdvaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZhdXRoLT5vdXRnb2luZykpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV0aC0+b3V0Z29pbmcsICJcclxuIikpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICByZXR1cm4gVFJVRTsKKworICAgIG91dDoKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmYXV0aC0+b3V0Z29pbmcsIG9sZF9sZW4pOworCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NlbmRfcmVqZWN0ZWQgKERCdXNBdXRoICphdXRoKQoreworICBEQnVzU3RyaW5nIGNvbW1hbmQ7CisgIERCdXNBdXRoU2VydmVyICpzZXJ2ZXJfYXV0aDsKKyAgaW50IGk7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmY29tbWFuZCkpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVKRUNURUQiKSkKKyAgICBnb3RvIG5vbWVtOworCisgIGkgPSAwOworICB3aGlsZSAoYWxsX21lY2hhbmlzbXNbaV0ubWVjaGFuaXNtICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAiKSkKKyAgICAgICAgZ290byBub21lbTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX21lY2hhbmlzbXNbaV0ubWVjaGFuaXNtKSkKKyAgICAgICAgZ290byBub21lbTsKKyAgICAgIAorICAgICAgKytpOworICAgIH0KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmNvbW1hbmQsICJcclxuIikpCisgICAgZ290byBub21lbTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmY29tbWFuZCwgMCwgJmF1dGgtPm91dGdvaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmF1dGgtPm91dGdvaW5nKSkpCisgICAgZ290byBub21lbTsKKworICBzaHV0ZG93bl9tZWNoIChhdXRoKTsKKyAgCisgIF9kYnVzX2Fzc2VydCAoREJVU19BVVRIX0lTX1NFUlZFUiAoYXV0aCkpOworICBzZXJ2ZXJfYXV0aCA9IERCVVNfQVVUSF9TRVJWRVIgKGF1dGgpOworICBzZXJ2ZXJfYXV0aC0+ZmFpbHVyZXMgKz0gMTsKKworICBpZiAoc2VydmVyX2F1dGgtPmZhaWx1cmVzID49IHNlcnZlcl9hdXRoLT5tYXhfZmFpbHVyZXMpCisgICAgZ290b19zdGF0ZSAoYXV0aCwgJmNvbW1vbl9zdGF0ZV9uZWVkX2Rpc2Nvbm5lY3QpOworICBlbHNlCisgICAgZ290b19zdGF0ZSAoYXV0aCwgJnNlcnZlcl9zdGF0ZV93YWl0aW5nX2Zvcl9hdXRoKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbW1hbmQpOworICAKKyAgcmV0dXJuIFRSVUU7CisKKyBub21lbToKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb21tYW5kKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NlbmRfZXJyb3IgKERCdXNBdXRoICphdXRoLCBjb25zdCBjaGFyICptZXNzYWdlKQoreworICByZXR1cm4gX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKCZhdXRoLT5vdXRnb2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRVJST1IgXCIlc1wiXHJcbiIsIG1lc3NhZ2UpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NlbmRfb2sgKERCdXNBdXRoICphdXRoKQoreworICBpbnQgb3JpZ19sZW47CisKKyAgb3JpZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmF1dGgtPm91dGdvaW5nKTsKKyAgCisgIGlmIChfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV0aC0+b3V0Z29pbmcsICJPSyAiKSAmJgorICAgICAgX2RidXNfc3RyaW5nX2NvcHkgKCYgREJVU19BVVRIX1NFUlZFUiAoYXV0aCktPmd1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmYXV0aC0+b3V0Z29pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZhdXRoLT5vdXRnb2luZykpICYmCisgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV0aC0+b3V0Z29pbmcsICJcclxuIikpCisgICAgeworICAgICAgZ290b19zdGF0ZSAoYXV0aCwgJnNlcnZlcl9zdGF0ZV93YWl0aW5nX2Zvcl9iZWdpbik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmF1dGgtPm91dGdvaW5nLCBvcmlnX2xlbik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NlbmRfYmVnaW4gKERCdXNBdXRoICAgICAgICAgKmF1dGgpCit7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV0aC0+b3V0Z29pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJFR0lOXHJcbiIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBnb3RvX3N0YXRlIChhdXRoLCAmY29tbW9uX3N0YXRlX2F1dGhlbnRpY2F0ZWQpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citwcm9jZXNzX29rKERCdXNBdXRoICphdXRoLAorICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3NfZnJvbV9vaykgeworCisgIGludCBlbmRfb2ZfaGV4OworICAKKyAgLyogImFyZ3NfZnJvbV9vayIgc2hvdWxkIGJlIHRoZSBHVUlELCB3aGl0ZXNwYWNlIGFscmVhZHkgcHVsbGVkIG9mZiB0aGUgZnJvbnQgKi8KKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJiBEQlVTX0FVVEhfQ0xJRU5UIChhdXRoKS0+Z3VpZF9mcm9tX3NlcnZlcikgPT0gMCk7CisKKyAgLyogV2UgZGVjb2RlIHRoZSBoZXggc3RyaW5nIHRvIGJpbmFyeSwgdXNpbmcgZ3VpZF9mcm9tX3NlcnZlciBhcyBzY3JhdGNoLi4uICovCisgIAorICBlbmRfb2ZfaGV4ID0gMDsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2RlY29kZSAoYXJnc19mcm9tX29rLCAwLCAmZW5kX29mX2hleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBEQlVTX0FVVEhfQ0xJRU5UIChhdXRoKS0+Z3VpZF9mcm9tX3NlcnZlciwgMCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIG5vdyBjbGVhciBvdXQgdGhlIHNjcmF0Y2ggKi8KKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCYgREJVU19BVVRIX0NMSUVOVCAoYXV0aCktPmd1aWRfZnJvbV9zZXJ2ZXIsIDApOworICAKKyAgaWYgKGVuZF9vZl9oZXggIT0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGFyZ3NfZnJvbV9vaykgfHwKKyAgICAgIGVuZF9vZl9oZXggPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiQmFkIEdVSUQgZnJvbSBzZXJ2ZXIsIHBhcnNlZCAlZCBieXRlcyBhbmQgaGFkICVkIGJ5dGVzIGZyb20gc2VydmVyXG4iLAorICAgICAgICAgICAgICAgICAgICAgZW5kX29mX2hleCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGFyZ3NfZnJvbV9vaykpOworICAgICAgZ290b19zdGF0ZSAoYXV0aCwgJmNvbW1vbl9zdGF0ZV9uZWVkX2Rpc2Nvbm5lY3QpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKGFyZ3NfZnJvbV9vaywgMCwgJkRCVVNfQVVUSF9DTElFTlQgKGF1dGgpLT5ndWlkX2Zyb21fc2VydmVyLCAwKSkgeworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCYgREJVU19BVVRIX0NMSUVOVCAoYXV0aCktPmd1aWRfZnJvbV9zZXJ2ZXIsIDApOworICAgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIkdvdCBHVUlEICclcycgZnJvbSB0aGUgc2VydmVyXG4iLAorICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCYgREJVU19BVVRIX0NMSUVOVCAoYXV0aCktPmd1aWRfZnJvbV9zZXJ2ZXIpKTsKKworICBpZiAoYXV0aC0+dW5peF9mZF9wb3NzaWJsZSkKKyAgICByZXR1cm4gc2VuZF9uZWdvdGlhdGVfdW5peF9mZChhdXRoKTsKKworICBfZGJ1c192ZXJib3NlKCJOb3QgbmVnb3RpYXRpbmcgdW5peCBmZCBwYXNzaW5nLCBzaW5jZSBub3QgcG9zc2libGVcbiIpOworICByZXR1cm4gc2VuZF9iZWdpbiAoYXV0aCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2VuZF9jYW5jZWwgKERCdXNBdXRoICphdXRoKQoreworICBpZiAoX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1dGgtPm91dGdvaW5nLCAiQ0FOQ0VMXHJcbiIpKQorICAgIHsKKyAgICAgIGdvdG9fc3RhdGUgKGF1dGgsICZjbGllbnRfc3RhdGVfd2FpdGluZ19mb3JfcmVqZWN0KTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citwcm9jZXNzX2RhdGEgKERCdXNBdXRoICAgICAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAqYXJncywKKyAgICAgICAgICAgICAgREJ1c0F1dGhEYXRhRnVuY3Rpb24gIGRhdGFfZnVuYykKK3sKKyAgaW50IGVuZDsKKyAgREJ1c1N0cmluZyBkZWNvZGVkOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZkZWNvZGVkKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2RlY29kZSAoYXJncywgMCwgJmVuZCwgJmRlY29kZWQsIDApKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZGVjb2RlZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYXJncykgIT0gZW5kKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZGVjb2RlZCk7CisgICAgICBpZiAoIXNlbmRfZXJyb3IgKGF1dGgsICJJbnZhbGlkIGhleCBlbmNvZGluZyIpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICBpZiAoX2RidXNfc3RyaW5nX3ZhbGlkYXRlX2FzY2lpICgmZGVjb2RlZCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZkZWNvZGVkKSkpCisgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBkYXRhOiAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSwKKyAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZkZWNvZGVkKSk7CisjZW5kaWYKKyAgICAgIAorICBpZiAoISgqIGRhdGFfZnVuYykgKGF1dGgsICZkZWNvZGVkKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRlY29kZWQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRlY29kZWQpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZW5kX25lZ290aWF0ZV91bml4X2ZkIChEQnVzQXV0aCAqYXV0aCkKK3sKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV0aC0+b3V0Z29pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5FR09USUFURV9VTklYX0ZEXHJcbiIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBnb3RvX3N0YXRlIChhdXRoLCAmY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX2FncmVlX3VuaXhfZmQpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZW5kX2FncmVlX3VuaXhfZmQgKERCdXNBdXRoICphdXRoKQoreworICBfZGJ1c19hc3NlcnQoYXV0aC0+dW5peF9mZF9wb3NzaWJsZSk7CisKKyAgYXV0aC0+dW5peF9mZF9uZWdvdGlhdGVkID0gVFJVRTsKKyAgX2RidXNfdmVyYm9zZSgiQWdyZWVkIHRvIFVOSVggRkQgcGFzc2luZ1xuIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV0aC0+b3V0Z29pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFHUkVFX1VOSVhfRkRcclxuIikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGdvdG9fc3RhdGUgKGF1dGgsICZzZXJ2ZXJfc3RhdGVfd2FpdGluZ19mb3JfYmVnaW4pOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfYXV0aCAoREJ1c0F1dGggKmF1dGgsIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3MpCit7CisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYXJncykgPT0gMCkKKyAgICB7CisgICAgICAvKiBObyBhcmdzIHRvIHRoZSBhdXRoLCBzZW5kIG1lY2hhbmlzbXMgKi8KKyAgICAgIGlmICghc2VuZF9yZWplY3RlZCAoYXV0aCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW50IGk7CisgICAgICBEQnVzU3RyaW5nIG1lY2g7CisgICAgICBEQnVzU3RyaW5nIGhleF9yZXNwb25zZTsKKyAgICAgIAorICAgICAgX2RidXNfc3RyaW5nX2ZpbmRfYmxhbmsgKGFyZ3MsIDAsICZpKTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJm1lY2gpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZoZXhfcmVzcG9uc2UpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZtZWNoKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9sZW4gKGFyZ3MsIDAsIGksICZtZWNoLCAwKSkKKyAgICAgICAgZ290byBmYWlsZWQ7CisKKyAgICAgIF9kYnVzX3N0cmluZ19za2lwX2JsYW5rIChhcmdzLCBpLCAmaSk7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5IChhcmdzLCBpLCAmaGV4X3Jlc3BvbnNlLCAwKSkKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgIAorICAgICAgYXV0aC0+bWVjaCA9IGZpbmRfbWVjaCAoJm1lY2gsIGF1dGgtPmFsbG93ZWRfbWVjaHMpOworICAgICAgaWYgKGF1dGgtPm1lY2ggIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogVHJ5aW5nIG1lY2hhbmlzbSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aC0+bWVjaC0+bWVjaGFuaXNtKTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoIXByb2Nlc3NfZGF0YSAoYXV0aCwgJmhleF9yZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aC0+bWVjaC0+c2VydmVyX2RhdGFfZnVuYykpCisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogVW5zdXBwb3J0ZWQgbWVjaGFuaXNtICovCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBVbnN1cHBvcnRlZCBtZWNoYW5pc20gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJm1lY2gpKTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoIXNlbmRfcmVqZWN0ZWQgKGF1dGgpKQorICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZtZWNoKTsgICAgICAKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmaGV4X3Jlc3BvbnNlKTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAKKyAgICBmYWlsZWQ6CisgICAgICBhdXRoLT5tZWNoID0gTlVMTDsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbWVjaCk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmhleF9yZXNwb25zZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV9zZXJ2ZXJfc3RhdGVfd2FpdGluZ19mb3JfYXV0aCAgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQXV0aENvbW1hbmQgICBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYXJncykKK3sKKyAgc3dpdGNoIChjb21tYW5kKQorICAgIHsKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0FVVEg6CisgICAgICByZXR1cm4gaGFuZGxlX2F1dGggKGF1dGgsIGFyZ3MpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9DQU5DRUw6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9EQVRBOgorICAgICAgcmV0dXJuIHNlbmRfZXJyb3IgKGF1dGgsICJOb3QgY3VycmVudGx5IGluIGFuIGF1dGggY29udmVyc2F0aW9uIik7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0JFR0lOOgorICAgICAgZ290b19zdGF0ZSAoYXV0aCwgJmNvbW1vbl9zdGF0ZV9uZWVkX2Rpc2Nvbm5lY3QpOworICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0VSUk9SOgorICAgICAgcmV0dXJuIHNlbmRfcmVqZWN0ZWQgKGF1dGgpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9ORUdPVElBVEVfVU5JWF9GRDoKKyAgICAgIHJldHVybiBzZW5kX2Vycm9yIChhdXRoLCAiTmVlZCB0byBhdXRoZW50aWNhdGUgZmlyc3QiKTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfUkVKRUNURUQ6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9PSzoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX1VOS05PV046CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9BR1JFRV9VTklYX0ZEOgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gc2VuZF9lcnJvciAoYXV0aCwgIlVua25vd24gY29tbWFuZCIpOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfc2VydmVyX3N0YXRlX3dhaXRpbmdfZm9yX2RhdGEgIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0F1dGhDb21tYW5kICAgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3MpCit7CisgIHN3aXRjaCAoY29tbWFuZCkKKyAgICB7CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9BVVRIOgorICAgICAgcmV0dXJuIHNlbmRfZXJyb3IgKGF1dGgsICJTZW50IEFVVEggd2hpbGUgYW5vdGhlciBBVVRIIGluIHByb2dyZXNzIik7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0NBTkNFTDoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0VSUk9SOgorICAgICAgcmV0dXJuIHNlbmRfcmVqZWN0ZWQgKGF1dGgpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9EQVRBOgorICAgICAgcmV0dXJuIHByb2Nlc3NfZGF0YSAoYXV0aCwgYXJncywgYXV0aC0+bWVjaC0+c2VydmVyX2RhdGFfZnVuYyk7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0JFR0lOOgorICAgICAgZ290b19zdGF0ZSAoYXV0aCwgJmNvbW1vbl9zdGF0ZV9uZWVkX2Rpc2Nvbm5lY3QpOworICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX05FR09USUFURV9VTklYX0ZEOgorICAgICAgcmV0dXJuIHNlbmRfZXJyb3IgKGF1dGgsICJOZWVkIHRvIGF1dGhlbnRpY2F0ZSBmaXJzdCIpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9SRUpFQ1RFRDoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX09LOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfVU5LTk9XTjoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0FHUkVFX1VOSVhfRkQ6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBzZW5kX2Vycm9yIChhdXRoLCAiVW5rbm93biBjb21tYW5kIik7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV9zZXJ2ZXJfc3RhdGVfd2FpdGluZ19mb3JfYmVnaW4gKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQXV0aENvbW1hbmQgICBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYXJncykKK3sKKyAgc3dpdGNoIChjb21tYW5kKQorICAgIHsKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0FVVEg6CisgICAgICByZXR1cm4gc2VuZF9lcnJvciAoYXV0aCwgIlNlbnQgQVVUSCB3aGlsZSBleHBlY3RpbmcgQkVHSU4iKTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfREFUQToKKyAgICAgIHJldHVybiBzZW5kX2Vycm9yIChhdXRoLCAiU2VudCBEQVRBIHdoaWxlIGV4cGVjdGluZyBCRUdJTiIpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9CRUdJTjoKKyAgICAgIGdvdG9fc3RhdGUgKGF1dGgsICZjb21tb25fc3RhdGVfYXV0aGVudGljYXRlZCk7CisgICAgICByZXR1cm4gVFJVRTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfTkVHT1RJQVRFX1VOSVhfRkQ6CisgICAgICBpZiAoYXV0aC0+dW5peF9mZF9wb3NzaWJsZSkKKyAgICAgICAgcmV0dXJuIHNlbmRfYWdyZWVfdW5peF9mZChhdXRoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHNlbmRfZXJyb3IoYXV0aCwgIlVuaXggRkQgcGFzc2luZyBub3Qgc3VwcG9ydGVkLCBub3QgYXV0aGVudGljYXRlZCBvciBvdGhlcndpc2Ugbm90IHBvc3NpYmxlIik7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX1JFSkVDVEVEOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfT0s6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9VTktOT1dOOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQUdSRUVfVU5JWF9GRDoKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHNlbmRfZXJyb3IgKGF1dGgsICJVbmtub3duIGNvbW1hbmQiKTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQ0FOQ0VMOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfRVJST1I6CisgICAgICByZXR1cm4gc2VuZF9yZWplY3RlZCAoYXV0aCk7CisgICAgfQorfQorCisvKiByZXR1cm4gRkFMU0UgaWYgbm8gbWVtb3J5LCBUUlVFIGlmIGFsbCBPSyAqLworc3RhdGljIGRidXNfYm9vbF90CitnZXRfd29yZCAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgIGludCAgICAgICAgICAgICAgKnN0YXJ0LAorICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKndvcmQpCit7CisgIGludCBpOworCisgIF9kYnVzX3N0cmluZ19za2lwX2JsYW5rIChzdHIsICpzdGFydCwgc3RhcnQpOworICBfZGJ1c19zdHJpbmdfZmluZF9ibGFuayAoc3RyLCAqc3RhcnQsICZpKTsKKyAgCisgIGlmIChpID4gKnN0YXJ0KQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuIChzdHIsICpzdGFydCwgaSAtICpzdGFydCwgd29yZCwgMCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgKnN0YXJ0ID0gaTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcmVjb3JkX21lY2hhbmlzbXMgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYXJncykKK3sKKyAgaW50IG5leHQ7CisgIGludCBsZW47CisKKyAgaWYgKGF1dGgtPmFscmVhZHlfZ290X21lY2hhbmlzbXMpCisgICAgcmV0dXJuIFRSVUU7CisgIAorICBsZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYXJncyk7CisgIAorICBuZXh0ID0gMDsKKyAgd2hpbGUgKG5leHQgPCBsZW4pCisgICAgeworICAgICAgREJ1c1N0cmluZyBtOworICAgICAgY29uc3QgREJ1c0F1dGhNZWNoYW5pc21IYW5kbGVyICptZWNoOworICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmbSkpCisgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAKKyAgICAgIGlmICghZ2V0X3dvcmQgKGFyZ3MsICZuZXh0LCAmbSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJm0pOworICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIH0KKworICAgICAgbWVjaCA9IGZpbmRfbWVjaCAoJm0sIGF1dGgtPmFsbG93ZWRfbWVjaHMpOworCisgICAgICBpZiAobWVjaCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgLyogRklYTUUgcmlnaHQgbm93IHdlIHRyeSBtZWNoYW5pc21zIGluIHRoZSBvcmRlcgorICAgICAgICAgICAqIHRoZSBzZXJ2ZXIgbGlzdHMgdGhlbTsgc2hvdWxkIHdlIGRvIHRoZW0gaW4KKyAgICAgICAgICAgKiBzb21lIG1vcmUgZGV0ZXJtaW5pc3RpYyBvcmRlcj8KKyAgICAgICAgICAgKgorICAgICAgICAgICAqIFByb2JhYmx5IGluIGFsbF9tZWNoYW5pc21zIG9yZGVyLCBvdXIgb3JkZXIgb2YKKyAgICAgICAgICAgKiBwcmVmZXJlbmNlLiBPZiBjb3Vyc2Ugd2hlbiB0aGUgc2VydmVyIGlzIHVzLAorICAgICAgICAgICAqIGl0IGxpc3RzIHRoaW5ncyBpbiB0aGF0IG9yZGVyIGFueWhvdy4KKyAgICAgICAgICAgKi8KKworICAgICAgICAgIGlmIChtZWNoICE9ICZhbGxfbWVjaGFuaXNtc1swXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBBZGRpbmcgbWVjaGFuaXNtICVzIHRvIGxpc3Qgd2Ugd2lsbCB0cnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSwgbWVjaC0+bWVjaGFuaXNtKTsKKyAgICAgICAgICAKKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJiBEQlVTX0FVVEhfQ0xJRU5UIChhdXRoKS0+bWVjaHNfdG9fdHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopIG1lY2gpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbSk7CisgICAgICAgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogQWxyZWFkeSB0cmllZCBtZWNoYW5pc20gJXM7IG5vdCBhZGRpbmcgdG8gbGlzdCB3ZSB3aWxsIHRyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpLCBtZWNoLT5tZWNoYW5pc20pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IFNlcnZlciBvZmZlcmVkIG1lY2hhbmlzbSBcIiVzXCIgdGhhdCB3ZSBkb24ndCBrbm93IGhvdyB0byB1c2VcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJm0pKTsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJm0pOworICAgIH0KKyAgCisgIGF1dGgtPmFscmVhZHlfZ290X21lY2hhbmlzbXMgPSBUUlVFOworICAKKyAgcmV0dXJuIFRSVUU7CisKKyBub21lbToKKyAgX2RidXNfbGlzdF9jbGVhciAoJiBEQlVTX0FVVEhfQ0xJRU5UIChhdXRoKS0+bWVjaHNfdG9fdHJ5KTsKKyAgCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citwcm9jZXNzX3JlamVjdGVkIChEQnVzQXV0aCAqYXV0aCwgY29uc3QgREJ1c1N0cmluZyAqYXJncykKK3sKKyAgY29uc3QgREJ1c0F1dGhNZWNoYW5pc21IYW5kbGVyICptZWNoOworICBEQnVzQXV0aENsaWVudCAqY2xpZW50OworCisgIGNsaWVudCA9IERCVVNfQVVUSF9DTElFTlQgKGF1dGgpOworCisgIGlmICghYXV0aC0+YWxyZWFkeV9nb3RfbWVjaGFuaXNtcykKKyAgICB7CisgICAgICBpZiAoIXJlY29yZF9tZWNoYW5pc21zIChhdXRoLCBhcmdzKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmIChEQlVTX0FVVEhfQ0xJRU5UIChhdXRoKS0+bWVjaHNfdG9fdHJ5ICE9IE5VTEwpCisgICAgeworICAgICAgbWVjaCA9IGNsaWVudC0+bWVjaHNfdG9fdHJ5LT5kYXRhOworCisgICAgICBpZiAoIXNlbmRfYXV0aCAoYXV0aCwgbWVjaCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgX2RidXNfbGlzdF9wb3BfZmlyc3QgKCZjbGllbnQtPm1lY2hzX3RvX3RyeSk7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogVHJ5aW5nIG1lY2hhbmlzbSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSwKKyAgICAgICAgICAgICAgICAgICAgIG1lY2gtPm1lY2hhbmlzbSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogR2l2ZSB1cCAqLworICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBEaXNjb25uZWN0aW5nIGJlY2F1c2Ugd2UgYXJlIG91dCBvZiBtZWNoYW5pc21zIHRvIHRyeSB1c2luZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgICAgICBnb3RvX3N0YXRlIChhdXRoLCAmY29tbW9uX3N0YXRlX25lZWRfZGlzY29ubmVjdCk7CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX2RhdGEgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBdXRoQ29tbWFuZCAgIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3MpCit7CisgIF9kYnVzX2Fzc2VydCAoYXV0aC0+bWVjaCAhPSBOVUxMKTsKKyAKKyAgc3dpdGNoIChjb21tYW5kKQorICAgIHsKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0RBVEE6CisgICAgICByZXR1cm4gcHJvY2Vzc19kYXRhIChhdXRoLCBhcmdzLCBhdXRoLT5tZWNoLT5jbGllbnRfZGF0YV9mdW5jKTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfUkVKRUNURUQ6CisgICAgICByZXR1cm4gcHJvY2Vzc19yZWplY3RlZCAoYXV0aCwgYXJncyk7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX09LOgorICAgICAgcmV0dXJuIHByb2Nlc3Nfb2soYXV0aCwgYXJncyk7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0VSUk9SOgorICAgICAgcmV0dXJuIHNlbmRfY2FuY2VsIChhdXRoKTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQVVUSDoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0NBTkNFTDoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0JFR0lOOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfVU5LTk9XTjoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX05FR09USUFURV9VTklYX0ZEOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQUdSRUVfVU5JWF9GRDoKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHNlbmRfZXJyb3IgKGF1dGgsICJVbmtub3duIGNvbW1hbmQiKTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraGFuZGxlX2NsaWVudF9zdGF0ZV93YWl0aW5nX2Zvcl9vayAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBdXRoQ29tbWFuZCAgIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphcmdzKQoreworICBzd2l0Y2ggKGNvbW1hbmQpCisgICAgeworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfUkVKRUNURUQ6CisgICAgICByZXR1cm4gcHJvY2Vzc19yZWplY3RlZCAoYXV0aCwgYXJncyk7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX09LOgorICAgICAgcmV0dXJuIHByb2Nlc3Nfb2soYXV0aCwgYXJncyk7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0RBVEE6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9FUlJPUjoKKyAgICAgIHJldHVybiBzZW5kX2NhbmNlbCAoYXV0aCk7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0FVVEg6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9DQU5DRUw6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9CRUdJTjoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX1VOS05PV046CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9ORUdPVElBVEVfVU5JWF9GRDoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0FHUkVFX1VOSVhfRkQ6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBzZW5kX2Vycm9yIChhdXRoLCAiVW5rbm93biBjb21tYW5kIik7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV9jbGllbnRfc3RhdGVfd2FpdGluZ19mb3JfcmVqZWN0IChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBdXRoQ29tbWFuZCAgIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYXJncykKK3sKKyAgc3dpdGNoIChjb21tYW5kKQorICAgIHsKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX1JFSkVDVEVEOgorICAgICAgcmV0dXJuIHByb2Nlc3NfcmVqZWN0ZWQgKGF1dGgsIGFyZ3MpOworICAgICAgCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9BVVRIOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQ0FOQ0VMOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfREFUQToKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0JFR0lOOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfT0s6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9FUlJPUjoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX1VOS05PV046CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9ORUdPVElBVEVfVU5JWF9GRDoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0FHUkVFX1VOSVhfRkQ6CisgICAgZGVmYXVsdDoKKyAgICAgIGdvdG9fc3RhdGUgKGF1dGgsICZjb21tb25fc3RhdGVfbmVlZF9kaXNjb25uZWN0KTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX2FncmVlX3VuaXhfZmQoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQXV0aENvbW1hbmQgICBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3MpCit7CisgIHN3aXRjaCAoY29tbWFuZCkKKyAgICB7CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9BR1JFRV9VTklYX0ZEOgorICAgICAgX2RidXNfYXNzZXJ0KGF1dGgtPnVuaXhfZmRfcG9zc2libGUpOworICAgICAgYXV0aC0+dW5peF9mZF9uZWdvdGlhdGVkID0gVFJVRTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UoIlN1Y2Nlc3NmdWxseSBuZWdvdGlhdGVkIFVOSVggRkQgcGFzc2luZ1xuIik7CisgICAgICByZXR1cm4gc2VuZF9iZWdpbiAoYXV0aCk7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0VSUk9SOgorICAgICAgX2RidXNfYXNzZXJ0KGF1dGgtPnVuaXhfZmRfcG9zc2libGUpOworICAgICAgYXV0aC0+dW5peF9mZF9uZWdvdGlhdGVkID0gRkFMU0U7CisgICAgICBfZGJ1c192ZXJib3NlKCJGYWlsZWQgdG8gbmVnb3RpYXRlIFVOSVggRkQgcGFzc2luZ1xuIik7CisgICAgICByZXR1cm4gc2VuZF9iZWdpbiAoYXV0aCk7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX09LOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfREFUQToKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX1JFSkVDVEVEOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQVVUSDoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0NBTkNFTDoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0JFR0lOOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfVU5LTk9XTjoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX05FR09USUFURV9VTklYX0ZEOgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gc2VuZF9lcnJvciAoYXV0aCwgIlVua25vd24gY29tbWFuZCIpOworICAgIH0KK30KKworLyoqCisgKiBNYXBwaW5nIGZyb20gY29tbWFuZCBuYW1lIHRvIGVudW0KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgLyoqPCBOYW1lIG9mIHRoZSBjb21tYW5kICovCisgIERCdXNBdXRoQ29tbWFuZCBjb21tYW5kOyAvKio8IENvcnJlc3BvbmRpbmcgZW51bSAqLworfSBEQnVzQXV0aENvbW1hbmROYW1lOworCitzdGF0aWMgY29uc3QgREJ1c0F1dGhDb21tYW5kTmFtZSBhdXRoX2NvbW1hbmRfbmFtZXNbXSA9IHsKKyAgeyAiQVVUSCIsICAgICAgICAgICAgICBEQlVTX0FVVEhfQ09NTUFORF9BVVRIIH0sCisgIHsgIkNBTkNFTCIsICAgICAgICAgICAgREJVU19BVVRIX0NPTU1BTkRfQ0FOQ0VMIH0sCisgIHsgIkRBVEEiLCAgICAgICAgICAgICAgREJVU19BVVRIX0NPTU1BTkRfREFUQSB9LAorICB7ICJCRUdJTiIsICAgICAgICAgICAgIERCVVNfQVVUSF9DT01NQU5EX0JFR0lOIH0sCisgIHsgIlJFSkVDVEVEIiwgICAgICAgICAgREJVU19BVVRIX0NPTU1BTkRfUkVKRUNURUQgfSwKKyAgeyAiT0siLCAgICAgICAgICAgICAgICBEQlVTX0FVVEhfQ09NTUFORF9PSyB9LAorICB7ICJFUlJPUiIsICAgICAgICAgICAgIERCVVNfQVVUSF9DT01NQU5EX0VSUk9SIH0sCisgIHsgIk5FR09USUFURV9VTklYX0ZEIiwgREJVU19BVVRIX0NPTU1BTkRfTkVHT1RJQVRFX1VOSVhfRkQgfSwKKyAgeyAiQUdSRUVfVU5JWF9GRCIsICAgICBEQlVTX0FVVEhfQ09NTUFORF9BR1JFRV9VTklYX0ZEIH0KK307CisKK3N0YXRpYyBEQnVzQXV0aENvbW1hbmQKK2xvb2t1cF9jb21tYW5kX2Zyb21fbmFtZSAoREJ1c1N0cmluZyAqY29tbWFuZCkKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IF9EQlVTX05fRUxFTUVOVFMgKGF1dGhfY29tbWFuZF9uYW1lcyk7IGkrKykKKyAgICB7CisgICAgICBpZiAoX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyIChjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aF9jb21tYW5kX25hbWVzW2ldLm5hbWUpKQorICAgICAgICByZXR1cm4gYXV0aF9jb21tYW5kX25hbWVzW2ldLmNvbW1hbmQ7CisgICAgfQorCisgIHJldHVybiBEQlVTX0FVVEhfQ09NTUFORF9VTktOT1dOOworfQorCitzdGF0aWMgdm9pZAorZ290b19zdGF0ZSAoREJ1c0F1dGggKmF1dGgsCisgICAgICAgICAgICBjb25zdCBEQnVzQXV0aFN0YXRlRGF0YSAqc3RhdGUpCit7CisgIF9kYnVzX3ZlcmJvc2UgKCIlczogZ29pbmcgZnJvbSBzdGF0ZSAlcyB0byBzdGF0ZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpLAorICAgICAgICAgICAgICAgICBhdXRoLT5zdGF0ZS0+bmFtZSwKKyAgICAgICAgICAgICAgICAgc3RhdGUtPm5hbWUpOworCisgIGF1dGgtPnN0YXRlID0gc3RhdGU7Cit9CisKKy8qIHJldHVybnMgd2hldGhlciB0byBjYWxsIGl0IGFnYWluIHJpZ2h0IGF3YXkgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorcHJvY2Vzc19jb21tYW5kIChEQnVzQXV0aCAqYXV0aCkKK3sKKyAgREJ1c0F1dGhDb21tYW5kIGNvbW1hbmQ7CisgIERCdXNTdHJpbmcgbGluZTsKKyAgREJ1c1N0cmluZyBhcmdzOworICBpbnQgZW9sOworICBpbnQgaSwgajsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIC8qIF9kYnVzX3ZlcmJvc2UgKCIlczogICB0cnlpbmcgcHJvY2Vzc19jb21tYW5kKClcbiIpOyAqLworICAKKyAgcmV0dmFsID0gRkFMU0U7CisgIAorICBlb2wgPSAwOworICBpZiAoIV9kYnVzX3N0cmluZ19maW5kICgmYXV0aC0+aW5jb21pbmcsIDAsICJcclxuIiwgJmVvbCkpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmxpbmUpKQorICAgIHsKKyAgICAgIGF1dGgtPm5lZWRlZF9tZW1vcnkgPSBUUlVFOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYXJncykpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZsaW5lKTsKKyAgICAgIGF1dGgtPm5lZWRlZF9tZW1vcnkgPSBUUlVFOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuICgmYXV0aC0+aW5jb21pbmcsIDAsIGVvbCwgJmxpbmUsIDApKQorICAgIGdvdG8gb3V0OworCisgIGlmICghX2RidXNfc3RyaW5nX3ZhbGlkYXRlX2FzY2lpICgmbGluZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbGluZSkpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogQ29tbWFuZCBjb250YWluZWQgbm9uLUFTQ0lJIGNoYXJzIG9yIGVtYmVkZGVkIG51bFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgICAgICBpZiAoIXNlbmRfZXJyb3IgKGF1dGgsICJDb21tYW5kIGNvbnRhaW5lZCBub24tQVNDSUkiKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICBlbHNlCisgICAgICAgIGdvdG8gbmV4dF9jb21tYW5kOworICAgIH0KKyAgCisgIF9kYnVzX3ZlcmJvc2UgKCIlczogZ290IGNvbW1hbmQgXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCksCisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmxpbmUpKTsKKyAgCisgIF9kYnVzX3N0cmluZ19maW5kX2JsYW5rICgmbGluZSwgMCwgJmkpOworICBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAoJmxpbmUsIGksICZqKTsKKworICBpZiAoaiA+IGkpCisgICAgX2RidXNfc3RyaW5nX2RlbGV0ZSAoJmxpbmUsIGksIGogLSBpKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX21vdmUgKCZsaW5lLCBpLCAmYXJncywgMCkpCisgICAgZ290byBvdXQ7CisKKyAgLyogRklYTUUgMS4wIHdlIHNob3VsZCBwcm9iYWJseSB2YWxpZGF0ZSB0aGF0IG9ubHkgdGhlIGFsbG93ZWQKKyAgICogY2hhcnMgYXJlIGluIHRoZSBjb21tYW5kIG5hbWUKKyAgICovCisgIAorICBjb21tYW5kID0gbG9va3VwX2NvbW1hbmRfZnJvbV9uYW1lICgmbGluZSk7CisgIGlmICghKCogYXV0aC0+c3RhdGUtPmhhbmRsZXIpIChhdXRoLCBjb21tYW5kLCAmYXJncykpCisgICAgZ290byBvdXQ7CisKKyBuZXh0X2NvbW1hbmQ6CisgIAorICAvKiBXZSd2ZSBzdWNjZWVkZWQgaW4gcHJvY2Vzc2luZyB0aGUgd2hvbGUgY29tbWFuZCBzbyBkcm9wIGl0IG91dAorICAgKiBvZiB0aGUgaW5jb21pbmcgYnVmZmVyIGFuZCByZXR1cm4gVFJVRSB0byB0cnkgYW5vdGhlciBjb21tYW5kLgorICAgKi8KKworICBfZGJ1c19zdHJpbmdfZGVsZXRlICgmYXV0aC0+aW5jb21pbmcsIDAsIGVvbCk7CisgIAorICAvKiBraWxsIHRoZSBcclxuICovCisgIF9kYnVzX3N0cmluZ19kZWxldGUgKCZhdXRoLT5pbmNvbWluZywgMCwgMik7CisKKyAgcmV0dmFsID0gVFJVRTsKKyAgCisgb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFyZ3MpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmxpbmUpOworCisgIGlmICghcmV0dmFsKQorICAgIGF1dGgtPm5lZWRlZF9tZW1vcnkgPSBUUlVFOworICBlbHNlCisgICAgYXV0aC0+bmVlZGVkX21lbW9yeSA9IEZBTFNFOworICAKKyAgcmV0dXJuIHJldHZhbDsKK30KKworCisvKiogQH0gKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzQXV0aAorICogQHsKKyAqLworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgYXV0aCBjb252ZXJzYXRpb24gb2JqZWN0IGZvciB0aGUgc2VydmVyIHNpZGUuCisgKiBTZWUgZG9jL2RidXMtc2FzbC1wcm9maWxlLnR4dCBmb3IgZnVsbCBkZXRhaWxzIG9uIHdoYXQKKyAqIHRoaXMgb2JqZWN0IGRvZXMuCisgKgorICogQHJldHVybnMgdGhlIG5ldyBvYmplY3Qgb3IgI05VTEwgaWYgbm8gbWVtb3J5CisgKi8KK0RCdXNBdXRoKgorX2RidXNfYXV0aF9zZXJ2ZXJfbmV3IChjb25zdCBEQnVzU3RyaW5nICpndWlkKQoreworICBEQnVzQXV0aCAqYXV0aDsKKyAgREJ1c0F1dGhTZXJ2ZXIgKnNlcnZlcl9hdXRoOworICBEQnVzU3RyaW5nIGd1aWRfY29weTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZ3VpZF9jb3B5KSkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5IChndWlkLCAwLCAmZ3VpZF9jb3B5LCAwKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmd1aWRfY29weSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgYXV0aCA9IF9kYnVzX2F1dGhfbmV3IChzaXplb2YgKERCdXNBdXRoU2VydmVyKSk7CisgIGlmIChhdXRoID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZndWlkX2NvcHkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgYXV0aC0+c2lkZSA9IGF1dGhfc2lkZV9zZXJ2ZXI7CisgIGF1dGgtPnN0YXRlID0gJnNlcnZlcl9zdGF0ZV93YWl0aW5nX2Zvcl9hdXRoOworCisgIHNlcnZlcl9hdXRoID0gREJVU19BVVRIX1NFUlZFUiAoYXV0aCk7CisKKyAgc2VydmVyX2F1dGgtPmd1aWQgPSBndWlkX2NvcHk7CisgIAorICAvKiBwZXJoYXBzIHRoaXMgc2hvdWxkIGJlIHBlci1tZWNoYW5pc20gd2l0aCBhIGxvd2VyCisgICAqIG1heAorICAgKi8KKyAgc2VydmVyX2F1dGgtPmZhaWx1cmVzID0gMDsKKyAgc2VydmVyX2F1dGgtPm1heF9mYWlsdXJlcyA9IDY7CisgIAorICByZXR1cm4gYXV0aDsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IGF1dGggY29udmVyc2F0aW9uIG9iamVjdCBmb3IgdGhlIGNsaWVudCBzaWRlLgorICogU2VlIGRvYy9kYnVzLXNhc2wtcHJvZmlsZS50eHQgZm9yIGZ1bGwgZGV0YWlscyBvbiB3aGF0CisgKiB0aGlzIG9iamVjdCBkb2VzLgorICoKKyAqIEByZXR1cm5zIHRoZSBuZXcgb2JqZWN0IG9yICNOVUxMIGlmIG5vIG1lbW9yeQorICovCitEQnVzQXV0aCoKK19kYnVzX2F1dGhfY2xpZW50X25ldyAodm9pZCkKK3sKKyAgREJ1c0F1dGggKmF1dGg7CisgIERCdXNTdHJpbmcgZ3VpZF9zdHI7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmd1aWRfc3RyKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBhdXRoID0gX2RidXNfYXV0aF9uZXcgKHNpemVvZiAoREJ1c0F1dGhDbGllbnQpKTsKKyAgaWYgKGF1dGggPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmd1aWRfc3RyKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBEQlVTX0FVVEhfQ0xJRU5UIChhdXRoKS0+Z3VpZF9mcm9tX3NlcnZlciA9IGd1aWRfc3RyOworCisgIGF1dGgtPnNpZGUgPSBhdXRoX3NpZGVfY2xpZW50OworICBhdXRoLT5zdGF0ZSA9ICZjbGllbnRfc3RhdGVfbmVlZF9zZW5kX2F1dGg7CisKKyAgLyogU3RhcnQgdGhlIGF1dGggY29udmVyc2F0aW9uIGJ5IHNlbmRpbmcgQVVUSCBmb3Igb3VyIGRlZmF1bHQKKyAgICogbWVjaGFuaXNtICovCisgIGlmICghc2VuZF9hdXRoIChhdXRoLCAmYWxsX21lY2hhbmlzbXNbMF0pKQorICAgIHsKKyAgICAgIF9kYnVzX2F1dGhfdW5yZWYgKGF1dGgpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgcmV0dXJuIGF1dGg7Cit9CisKKy8qKgorICogSW5jcmVtZW50cyB0aGUgcmVmY291bnQgb2YgYW4gYXV0aCBvYmplY3QuCisgKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKiBAcmV0dXJucyB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqLworREJ1c0F1dGggKgorX2RidXNfYXV0aF9yZWYgKERCdXNBdXRoICphdXRoKQoreworICBfZGJ1c19hc3NlcnQgKGF1dGggIT0gTlVMTCk7CisgIAorICBhdXRoLT5yZWZjb3VudCArPSAxOworICAKKyAgcmV0dXJuIGF1dGg7Cit9CisKKy8qKgorICogRGVjcmVtZW50cyB0aGUgcmVmY291bnQgb2YgYW4gYXV0aCBvYmplY3QuCisgKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKi8KK3ZvaWQKK19kYnVzX2F1dGhfdW5yZWYgKERCdXNBdXRoICphdXRoKQoreworICBfZGJ1c19hc3NlcnQgKGF1dGggIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoYXV0aC0+cmVmY291bnQgPiAwKTsKKworICBhdXRoLT5yZWZjb3VudCAtPSAxOworICBpZiAoYXV0aC0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBzaHV0ZG93bl9tZWNoIChhdXRoKTsKKworICAgICAgaWYgKERCVVNfQVVUSF9JU19DTElFTlQgKGF1dGgpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCYgREJVU19BVVRIX0NMSUVOVCAoYXV0aCktPmd1aWRfZnJvbV9zZXJ2ZXIpOworICAgICAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCYgREJVU19BVVRIX0NMSUVOVCAoYXV0aCktPm1lY2hzX3RvX3RyeSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoREJVU19BVVRIX0lTX1NFUlZFUiAoYXV0aCkpOworCisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCYgREJVU19BVVRIX1NFUlZFUiAoYXV0aCktPmd1aWQpOworICAgICAgICB9CisKKyAgICAgIGlmIChhdXRoLT5rZXlyaW5nKQorICAgICAgICBfZGJ1c19rZXlyaW5nX3VucmVmIChhdXRoLT5rZXlyaW5nKTsKKworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXRoLT5jb250ZXh0KTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV0aC0+Y2hhbGxlbmdlKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV0aC0+aWRlbnRpdHkpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXRoLT5pbmNvbWluZyk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmF1dGgtPm91dGdvaW5nKTsKKworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoYXV0aC0+YWxsb3dlZF9tZWNocyk7CisKKyAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChhdXRoLT5jcmVkZW50aWFscyk7CisgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoYXV0aC0+YXV0aG9yaXplZF9pZGVudGl0eSk7CisgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoYXV0aC0+ZGVzaXJlZF9pZGVudGl0eSk7CisgICAgICAKKyAgICAgIGRidXNfZnJlZSAoYXV0aCk7CisgICAgfQorfQorCisvKioKKyAqIFNldHMgYW4gYXJyYXkgb2YgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtIG5hbWVzCisgKiB0aGF0IHdlIGFyZSB3aWxsaW5nIHRvIHVzZS4KKyAqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEBwYXJhbSBtZWNoYW5pc21zICNOVUxMLXRlcm1pbmF0ZWQgYXJyYXkgb2YgbWVjaGFuaXNtIG5hbWVzCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hdXRoX3NldF9tZWNoYW5pc21zIChEQnVzQXV0aCAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiptZWNoYW5pc21zKQoreworICBjaGFyICoqY29weTsKKworICBpZiAobWVjaGFuaXNtcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNvcHkgPSBfZGJ1c19kdXBfc3RyaW5nX2FycmF5IChtZWNoYW5pc21zKTsKKyAgICAgIGlmIChjb3B5ID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICBjb3B5ID0gTlVMTDsKKyAgCisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGF1dGgtPmFsbG93ZWRfbWVjaHMpOworCisgIGF1dGgtPmFsbG93ZWRfbWVjaHMgPSBjb3B5OworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbiBvYmplY3QKKyAqIEByZXR1cm5zICNUUlVFIGlmIHdlJ3JlIGluIGEgZmluYWwgc3RhdGUKKyAqLworI2RlZmluZSBEQlVTX0FVVEhfSU5fRU5EX1NUQVRFKGF1dGgpICgoYXV0aCktPnN0YXRlLT5oYW5kbGVyID09IE5VTEwpCisKKy8qKgorICogQW5hbHl6ZXMgYnVmZmVyZWQgaW5wdXQgYW5kIG1vdmVzIHRoZSBhdXRoIGNvbnZlcnNhdGlvbiBmb3J3YXJkLAorICogcmV0dXJuaW5nIHRoZSBuZXcgc3RhdGUgb2YgdGhlIGF1dGggY29udmVyc2F0aW9uLgorICoKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHJldHVybnMgdGhlIG5ldyBzdGF0ZQorICovCitEQnVzQXV0aFN0YXRlCitfZGJ1c19hdXRoX2RvX3dvcmsgKERCdXNBdXRoICphdXRoKQoreworICBhdXRoLT5uZWVkZWRfbWVtb3J5ID0gRkFMU0U7CisKKyAgLyogTWF4IGFtb3VudCB3ZSdsbCBidWZmZXIgdXAgYmVmb3JlIGRlY2lkaW5nIHNvbWVvbmUncyBvbiBjcmFjayAqLworI2RlZmluZSBNQVhfQlVGRkVSICgxNiAqIF9EQlVTX09ORV9LSUxPQllURSkKKworICBkbworICAgIHsKKyAgICAgIGlmIChEQlVTX0FVVEhfSU5fRU5EX1NUQVRFIChhdXRoKSkKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmF1dGgtPmluY29taW5nKSA+IE1BWF9CVUZGRVIgfHwKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmF1dGgtPm91dGdvaW5nKSA+IE1BWF9CVUZGRVIpCisgICAgICAgIHsKKyAgICAgICAgICBnb3RvX3N0YXRlIChhdXRoLCAmY29tbW9uX3N0YXRlX25lZWRfZGlzY29ubmVjdCk7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBEaXNjb25uZWN0aW5nIGR1ZSB0byBleGNlc3NpdmUgZGF0YSBidWZmZXJlZCBpbiBhdXRoIHBoYXNlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgIHdoaWxlIChwcm9jZXNzX2NvbW1hbmQgKGF1dGgpKTsKKworICBpZiAoYXV0aC0+bmVlZGVkX21lbW9yeSkKKyAgICByZXR1cm4gREJVU19BVVRIX1NUQVRFX1dBSVRJTkdfRk9SX01FTU9SWTsKKyAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZhdXRoLT5vdXRnb2luZykgPiAwKQorICAgIHJldHVybiBEQlVTX0FVVEhfU1RBVEVfSEFWRV9CWVRFU19UT19TRU5EOworICBlbHNlIGlmIChhdXRoLT5zdGF0ZSA9PSAmY29tbW9uX3N0YXRlX25lZWRfZGlzY29ubmVjdCkKKyAgICByZXR1cm4gREJVU19BVVRIX1NUQVRFX05FRURfRElTQ09OTkVDVDsKKyAgZWxzZSBpZiAoYXV0aC0+c3RhdGUgPT0gJmNvbW1vbl9zdGF0ZV9hdXRoZW50aWNhdGVkKQorICAgIHJldHVybiBEQlVTX0FVVEhfU1RBVEVfQVVUSEVOVElDQVRFRDsKKyAgZWxzZSByZXR1cm4gREJVU19BVVRIX1NUQVRFX1dBSVRJTkdfRk9SX0lOUFVUOworfQorCisvKioKKyAqIEdldHMgYnl0ZXMgdGhhdCBuZWVkIHRvIGJlIHNlbnQgdG8gdGhlIHBlZXIgd2UncmUgY29udmVyc2luZyB3aXRoLgorICogQWZ0ZXIgd3JpdGluZyBzb21lIGJ5dGVzLCBfZGJ1c19hdXRoX2J5dGVzX3NlbnQoKSBtdXN0IGJlIGNhbGxlZAorICogdG8gbm90aWZ5IHRoZSBhdXRoIG9iamVjdCB0aGF0IHRoZXkgd2VyZSB3cml0dGVuLgorICoKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHBhcmFtIHN0ciByZXR1cm4gbG9jYXRpb24gZm9yIGEgcmVmIHRvIHRoZSBidWZmZXIgdG8gc2VuZAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdGhpbmcgdG8gc2VuZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXV0aF9nZXRfYnl0ZXNfdG9fc2VuZCAoREJ1c0F1dGggICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICoqc3RyKQoreworICBfZGJ1c19hc3NlcnQgKGF1dGggIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoc3RyICE9IE5VTEwpOworCisgICpzdHIgPSBOVUxMOworICAKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYXV0aC0+b3V0Z29pbmcpID09IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgICpzdHIgPSAmYXV0aC0+b3V0Z29pbmc7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogTm90aWZpZXMgdGhlIGF1dGggY29udmVyc2F0aW9uIG9iamVjdCB0aGF0CisgKiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIG9mIHRoZSBvdXRnb2luZyBidWZmZXIKKyAqIGhhdmUgYmVlbiB3cml0dGVuIG91dC4KKyAqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEBwYXJhbSBieXRlc19zZW50IG51bWJlciBvZiBieXRlcyB3cml0dGVuIG91dAorICovCit2b2lkCitfZGJ1c19hdXRoX2J5dGVzX3NlbnQgKERCdXNBdXRoICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgYnl0ZXNfc2VudCkKK3sKKyAgX2RidXNfdmVyYm9zZSAoIiVzOiBTZW50ICVkIGJ5dGVzIG9mOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpLAorICAgICAgICAgICAgICAgICBieXRlc19zZW50LAorICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZhdXRoLT5vdXRnb2luZykpOworICAKKyAgX2RidXNfc3RyaW5nX2RlbGV0ZSAoJmF1dGgtPm91dGdvaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAwLCBieXRlc19zZW50KTsKK30KKworLyoqCisgKiBHZXQgYSBidWZmZXIgdG8gYmUgdXNlZCBmb3IgcmVhZGluZyBieXRlcyBmcm9tIHRoZSBwZWVyIHdlJ3JlIGNvbnZlcnNpbmcKKyAqIHdpdGguIEJ5dGVzIHNob3VsZCBiZSBhcHBlbmRlZCB0byB0aGlzIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEBwYXJhbSBidWZmZXIgcmV0dXJuIGxvY2F0aW9uIGZvciBidWZmZXIgdG8gYXBwZW5kIGJ5dGVzIHRvCisgKi8KK3ZvaWQKK19kYnVzX2F1dGhfZ2V0X2J1ZmZlciAoREJ1c0F1dGggICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICoqYnVmZmVyKQoreworICBfZGJ1c19hc3NlcnQgKGF1dGggIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoIWF1dGgtPmJ1ZmZlcl9vdXRzdGFuZGluZyk7CisgIAorICAqYnVmZmVyID0gJmF1dGgtPmluY29taW5nOworCisgIGF1dGgtPmJ1ZmZlcl9vdXRzdGFuZGluZyA9IFRSVUU7Cit9CisKKy8qKgorICogUmV0dXJucyBhIGJ1ZmZlciB3aXRoIG5ldyBkYXRhIHJlYWQgaW50byBpdC4KKyAqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEBwYXJhbSBidWZmZXIgdGhlIGJ1ZmZlciBiZWluZyByZXR1cm5lZAorICogQHBhcmFtIGJ5dGVzX3JlYWQgbnVtYmVyIG9mIG5ldyBieXRlcyBhZGRlZAorICovCit2b2lkCitfZGJ1c19hdXRoX3JldHVybl9idWZmZXIgKERCdXNBdXRoICAgICAgICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAgICAgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfcmVhZCkKK3sKKyAgX2RidXNfYXNzZXJ0IChidWZmZXIgPT0gJmF1dGgtPmluY29taW5nKTsKKyAgX2RidXNfYXNzZXJ0IChhdXRoLT5idWZmZXJfb3V0c3RhbmRpbmcpOworCisgIGF1dGgtPmJ1ZmZlcl9vdXRzdGFuZGluZyA9IEZBTFNFOworfQorCisvKioKKyAqIFJldHVybnMgbGVmdG92ZXIgYnl0ZXMgdGhhdCB3ZXJlIG5vdCB1c2VkIGFzIHBhcnQgb2YgdGhlIGF1dGgKKyAqIGNvbnZlcnNhdGlvbi4gIFRoZXNlIGJ5dGVzIHdpbGwgYmUgcGFydCBvZiB0aGUgbWVzc2FnZSBzdHJlYW0KKyAqIGluc3RlYWQuIFRoaXMgZnVuY3Rpb24gbWF5IG5vdCBiZSBjYWxsZWQgdW50aWwgYXV0aGVudGljYXRpb24gaGFzCisgKiBzdWNjZWVkZWQuCisgKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKiBAcGFyYW0gc3RyIHJldHVybiBsb2NhdGlvbiBmb3IgcG9pbnRlciB0byBzdHJpbmcgb2YgdW51c2VkIGJ5dGVzCisgKi8KK3ZvaWQKK19kYnVzX2F1dGhfZ2V0X3VudXNlZF9ieXRlcyAoREJ1c0F1dGggICAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICoqc3RyKQoreworICBpZiAoIURCVVNfQVVUSF9JTl9FTkRfU1RBVEUgKGF1dGgpKQorICAgIHJldHVybjsKKworICAqc3RyID0gJmF1dGgtPmluY29taW5nOworfQorCisKKy8qKgorICogR2V0cyByaWQgb2YgdW51c2VkIGJ5dGVzIHJldHVybmVkIGJ5IF9kYnVzX2F1dGhfZ2V0X3VudXNlZF9ieXRlcygpCisgKiBhZnRlciB3ZSd2ZSBnb3R0ZW4gdGhlbSBhbmQgc3VjY2Vzc2Z1bGx5IG1vdmVkIHRoZW0gZWxzZXdoZXJlLgorICoKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICovCit2b2lkCitfZGJ1c19hdXRoX2RlbGV0ZV91bnVzZWRfYnl0ZXMgKERCdXNBdXRoICphdXRoKQoreworICBpZiAoIURCVVNfQVVUSF9JTl9FTkRfU1RBVEUgKGF1dGgpKQorICAgIHJldHVybjsKKworICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmF1dGgtPmluY29taW5nLCAwKTsKK30KKworLyoqCisgKiBDYWxsZWQgcG9zdC1hdXRoZW50aWNhdGlvbiwgaW5kaWNhdGVzIHdoZXRoZXIgd2UgbmVlZCB0byBlbmNvZGUKKyAqIHRoZSBtZXNzYWdlIHN0cmVhbSB3aXRoIF9kYnVzX2F1dGhfZW5jb2RlX2RhdGEoKSBwcmlvciB0bworICogc2VuZGluZyBpdCB0byB0aGUgcGVlci4KKyAqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEByZXR1cm5zICNUUlVFIGlmIHdlIG5lZWQgdG8gZW5jb2RlIHRoZSBzdHJlYW0KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2F1dGhfbmVlZHNfZW5jb2RpbmcgKERCdXNBdXRoICphdXRoKQoreworICBpZiAoYXV0aC0+c3RhdGUgIT0gJmNvbW1vbl9zdGF0ZV9hdXRoZW50aWNhdGVkKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGlmIChhdXRoLT5tZWNoICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKERCVVNfQVVUSF9JU19DTElFTlQgKGF1dGgpKQorICAgICAgICByZXR1cm4gYXV0aC0+bWVjaC0+Y2xpZW50X2VuY29kZV9mdW5jICE9IE5VTEw7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBhdXRoLT5tZWNoLT5zZXJ2ZXJfZW5jb2RlX2Z1bmMgIT0gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogQ2FsbGVkIHBvc3QtYXV0aGVudGljYXRpb24sIGVuY29kZXMgYSBibG9jayBvZiBieXRlcyBmb3Igc2VuZGluZyB0bworICogdGhlIHBlZXIuIElmIG5vIGVuY29kaW5nIHdhcyBuZWdvdGlhdGVkLCBqdXN0IGNvcGllcyB0aGUgYnl0ZXMKKyAqICh5b3UgY2FuIGF2b2lkIHRoaXMgYnkgY2hlY2tpbmcgX2RidXNfYXV0aF9uZWVkc19lbmNvZGluZygpKS4KKyAqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEBwYXJhbSBwbGFpbnRleHQgdGhlIHBsYWluIHRleHQgZGF0YQorICogQHBhcmFtIGVuY29kZWQgaW5pdGlhbGl6ZWQgc3RyaW5nIHRvIHdoZXJlIGVuY29kZWQgZGF0YSBpcyBhcHBlbmRlZAorICogQHJldHVybnMgI1RSVUUgaWYgd2UgaGFkIGVub3VnaCBtZW1vcnkgYW5kIHN1Y2Nlc3NmdWxseSBlbmNvZGVkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hdXRoX2VuY29kZV9kYXRhIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqcGxhaW50ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZW5jb2RlZCkKK3sKKyAgX2RidXNfYXNzZXJ0IChwbGFpbnRleHQgIT0gZW5jb2RlZCk7CisgIAorICBpZiAoYXV0aC0+c3RhdGUgIT0gJmNvbW1vbl9zdGF0ZV9hdXRoZW50aWNhdGVkKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGlmIChfZGJ1c19hdXRoX25lZWRzX2VuY29kaW5nIChhdXRoKSkKKyAgICB7CisgICAgICBpZiAoREJVU19BVVRIX0lTX0NMSUVOVCAoYXV0aCkpCisgICAgICAgIHJldHVybiAoKiBhdXRoLT5tZWNoLT5jbGllbnRfZW5jb2RlX2Z1bmMpIChhdXRoLCBwbGFpbnRleHQsIGVuY29kZWQpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gKCogYXV0aC0+bWVjaC0+c2VydmVyX2VuY29kZV9mdW5jKSAoYXV0aCwgcGxhaW50ZXh0LCBlbmNvZGVkKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXR1cm4gX2RidXNfc3RyaW5nX2NvcHkgKHBsYWludGV4dCwgMCwgZW5jb2RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGVuY29kZWQpKTsKKyAgICB9Cit9CisKKy8qKgorICogQ2FsbGVkIHBvc3QtYXV0aGVudGljYXRpb24sIGluZGljYXRlcyB3aGV0aGVyIHdlIG5lZWQgdG8gZGVjb2RlCisgKiB0aGUgbWVzc2FnZSBzdHJlYW0gd2l0aCBfZGJ1c19hdXRoX2RlY29kZV9kYXRhKCkgYWZ0ZXIKKyAqIHJlY2VpdmluZyBpdCBmcm9tIHRoZSBwZWVyLgorICoKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHJldHVybnMgI1RSVUUgaWYgd2UgbmVlZCB0byBlbmNvZGUgdGhlIHN0cmVhbQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXV0aF9uZWVkc19kZWNvZGluZyAoREJ1c0F1dGggKmF1dGgpCit7CisgIGlmIChhdXRoLT5zdGF0ZSAhPSAmY29tbW9uX3N0YXRlX2F1dGhlbnRpY2F0ZWQpCisgICAgcmV0dXJuIEZBTFNFOworICAgIAorICBpZiAoYXV0aC0+bWVjaCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChEQlVTX0FVVEhfSVNfQ0xJRU5UIChhdXRoKSkKKyAgICAgICAgcmV0dXJuIGF1dGgtPm1lY2gtPmNsaWVudF9kZWNvZGVfZnVuYyAhPSBOVUxMOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gYXV0aC0+bWVjaC0+c2VydmVyX2RlY29kZV9mdW5jICE9IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisKKy8qKgorICogQ2FsbGVkIHBvc3QtYXV0aGVudGljYXRpb24sIGRlY29kZXMgYSBibG9jayBvZiBieXRlcyByZWNlaXZlZCBmcm9tCisgKiB0aGUgcGVlci4gSWYgbm8gZW5jb2Rpbmcgd2FzIG5lZ290aWF0ZWQsIGp1c3QgY29waWVzIHRoZSBieXRlcyAoeW91CisgKiBjYW4gYXZvaWQgdGhpcyBieSBjaGVja2luZyBfZGJ1c19hdXRoX25lZWRzX2RlY29kaW5nKCkpLgorICoKKyAqIEB0b2RvIDEuMD8gV2UgbmVlZCB0byBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoICJvdXQgb2YgbWVtb3J5IiBlcnJvcgorICogZnJvbSAidGhlIGRhdGEgaXMgaG9zZWQiIGVycm9yLgorICoKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHBhcmFtIGVuY29kZWQgdGhlIGVuY29kZWQgZGF0YQorICogQHBhcmFtIHBsYWludGV4dCBpbml0aWFsaXplZCBzdHJpbmcgd2hlcmUgZGVjb2RlZCBkYXRhIGlzIGFwcGVuZGVkCisgKiBAcmV0dXJucyAjVFJVRSBpZiB3ZSBoYWQgZW5vdWdoIG1lbW9yeSBhbmQgc3VjY2Vzc2Z1bGx5IGRlY29kZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2F1dGhfZGVjb2RlX2RhdGEgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICplbmNvZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqcGxhaW50ZXh0KQoreworICBfZGJ1c19hc3NlcnQgKHBsYWludGV4dCAhPSBlbmNvZGVkKTsKKyAgCisgIGlmIChhdXRoLT5zdGF0ZSAhPSAmY29tbW9uX3N0YXRlX2F1dGhlbnRpY2F0ZWQpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgaWYgKF9kYnVzX2F1dGhfbmVlZHNfZGVjb2RpbmcgKGF1dGgpKQorICAgIHsKKyAgICAgIGlmIChEQlVTX0FVVEhfSVNfQ0xJRU5UIChhdXRoKSkKKyAgICAgICAgcmV0dXJuICgqIGF1dGgtPm1lY2gtPmNsaWVudF9kZWNvZGVfZnVuYykgKGF1dGgsIGVuY29kZWQsIHBsYWludGV4dCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiAoKiBhdXRoLT5tZWNoLT5zZXJ2ZXJfZGVjb2RlX2Z1bmMpIChhdXRoLCBlbmNvZGVkLCBwbGFpbnRleHQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiBfZGJ1c19zdHJpbmdfY29weSAoZW5jb2RlZCwgMCwgcGxhaW50ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocGxhaW50ZXh0KSk7CisgICAgfQorfQorCisvKioKKyAqIFNldHMgY3JlZGVudGlhbHMgcmVjZWl2ZWQgdmlhIHJlbGlhYmxlIG1lYW5zIGZyb20gdGhlIG9wZXJhdGluZworICogc3lzdGVtLgorICoKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBjcmVkZW50aWFscyByZWNlaXZlZAorICogQHJldHVybnMgI0ZBTFNFIG9uIE9PTQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXV0aF9zZXRfY3JlZGVudGlhbHMgKERCdXNBdXRoICAgICAgICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICAgICAgICAqY3JlZGVudGlhbHMpCit7CisgIF9kYnVzX2NyZWRlbnRpYWxzX2NsZWFyIChhdXRoLT5jcmVkZW50aWFscyk7CisgIHJldHVybiBfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbHMgKGF1dGgtPmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFscyk7Cit9CisKKy8qKgorICogR2V0cyB0aGUgaWRlbnRpdHkgd2UgYXV0aG9yaXplZCB0aGUgY2xpZW50IGFzLiAgQXBwcyBtYXkgaGF2ZQorICogZGlmZmVyZW50IHBvbGljaWVzIGFzIHRvIHdoYXQgaWRlbnRpdGllcyB0aGV5IGFsbG93LgorICoKKyAqIFJldHVybmVkIGNyZWRlbnRpYWxzIGFyZSBub3QgYSBjb3B5IGFuZCBzaG91bGQgbm90IGJlIG1vZGlmaWVkCisgKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKiBAcmV0dXJucyB0aGUgY3JlZGVudGlhbHMgd2UndmUgYXV0aG9yaXplZCBCWSBSRUZFUkVOQ0UgZG8gbm90IG1vZGlmeQorICovCitEQnVzQ3JlZGVudGlhbHMqCitfZGJ1c19hdXRoX2dldF9pZGVudGl0eSAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCkKK3sKKyAgaWYgKGF1dGgtPnN0YXRlID09ICZjb21tb25fc3RhdGVfYXV0aGVudGljYXRlZCkKKyAgICB7CisgICAgICByZXR1cm4gYXV0aC0+YXV0aG9yaXplZF9pZGVudGl0eTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBGSVhNRSBpbnN0ZWFkIG9mIHRoaXMsIGtlZXAgYW4gZW1wdHkgY3JlZGVudGlhbCBhcm91bmQgdGhhdAorICAgICAgICogZG9lc24ndCByZXF1aXJlIGFsbG9jYXRpb24gb3Igc29tZXRoaW5nCisgICAgICAgKi8KKyAgICAgIC8qIHJldHVybiBlbXB0eSBjcmVkZW50aWFscyAqLworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19hcmVfZW1wdHkgKGF1dGgtPmF1dGhvcml6ZWRfaWRlbnRpdHkpKTsKKyAgICAgIHJldHVybiBhdXRoLT5hdXRob3JpemVkX2lkZW50aXR5OworICAgIH0KK30KKworLyoqCisgKiBHZXRzIHRoZSBHVUlEIGZyb20gdGhlIHNlcnZlciBpZiB3ZSd2ZSBhdXRoZW50aWNhdGVkOyBnZXRzCisgKiAjTlVMTCBvdGhlcndpc2UuCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBvYmplY3QKKyAqIEByZXR1cm5zIHRoZSBHVUlEIGluIEFTQ0lJIGhleCBmb3JtYXQKKyAqLworY29uc3QgY2hhcioKK19kYnVzX2F1dGhfZ2V0X2d1aWRfZnJvbV9zZXJ2ZXIgKERCdXNBdXRoICphdXRoKQoreworICBfZGJ1c19hc3NlcnQgKERCVVNfQVVUSF9JU19DTElFTlQgKGF1dGgpKTsKKyAgCisgIGlmIChhdXRoLT5zdGF0ZSA9PSAmY29tbW9uX3N0YXRlX2F1dGhlbnRpY2F0ZWQpCisgICAgcmV0dXJuIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJiBEQlVTX0FVVEhfQ0xJRU5UIChhdXRoKS0+Z3VpZF9mcm9tX3NlcnZlcik7CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBTZXRzIHRoZSAiYXV0aGVudGljYXRpb24gY29udGV4dCIgd2hpY2ggc2NvcGVzIGNvb2tpZXMKKyAqIHdpdGggdGhlIERCVVNfQ09PS0lFX1NIQTEgYXV0aCBtZWNoYW5pc20gZm9yIGV4YW1wbGUuCisgKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXV0aF9zZXRfY29udGV4dCAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAgKmNvbnRleHQpCit7CisgIHJldHVybiBfZGJ1c19zdHJpbmdfcmVwbGFjZV9sZW4gKGNvbnRleHQsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChjb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1dGgtPmNvbnRleHQsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChjb250ZXh0KSk7Cit9CisKKy8qKgorICogU2V0cyB3aGV0aGVyIHVuaXggZmQgcGFzc2luZyBpcyBwb3RlbnRpYWxseSBvbiB0aGUgdHJhbnNwb3J0IGFuZAorICogaGVuY2Ugc2hhbGwgYmUgbmVnb3RpYXRlZC4KKyAqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEBwYXJhbSBiIFRSVUUgd2hlbiB1bml4IGZkIHBhc3Npbmcgc2hhbGwgYmUgbmVnb3RpYXRlZCwgb3RoZXJ3aXNlIEZBTFNFCisgKi8KK3ZvaWQKK19kYnVzX2F1dGhfc2V0X3VuaXhfZmRfcG9zc2libGUoREJ1c0F1dGggKmF1dGgsIGRidXNfYm9vbF90IGIpCit7CisgIGF1dGgtPnVuaXhfZmRfcG9zc2libGUgPSBiOworfQorCisvKioKKyAqIFF1ZXJpZXMgd2hldGhlciB1bml4IGZkIHBhc3Npbmcgd2FzIHN1Y2Nlc3NmdWxseSBuZWdvdGlhdGVkLgorICoKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNpb24KKyAqIEByZXR1cm5zICNUUlVFIHdoZW4gdW5peCBmZCBwYXNzaW5nIHdhcyBuZWdvdGlhdGVkLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXV0aF9nZXRfdW5peF9mZF9uZWdvdGlhdGVkKERCdXNBdXRoICphdXRoKQoreworICByZXR1cm4gYXV0aC0+dW5peF9mZF9uZWdvdGlhdGVkOworfQorCisvKiogQH0gKi8KKworLyogdGVzdHMgaW4gZGJ1cy1hdXRoLXV0aWwuYyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtYXV0aC5oIGIvZGJ1cy9kYnVzL2RidXMtYXV0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlM2YzNjQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1hdXRoLmgKQEAgLTAsMCArMSw4MyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWF1dGguaCBBdXRoZW50aWNhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfQVVUSF9ICisjZGVmaW5lIERCVVNfQVVUSF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFjcm9zLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IERCdXNBdXRoIERCdXNBdXRoOworCit0eXBlZGVmIGVudW0KK3sKKyAgREJVU19BVVRIX1NUQVRFX1dBSVRJTkdfRk9SX0lOUFVULAorICBEQlVTX0FVVEhfU1RBVEVfV0FJVElOR19GT1JfTUVNT1JZLAorICBEQlVTX0FVVEhfU1RBVEVfSEFWRV9CWVRFU19UT19TRU5ELAorICBEQlVTX0FVVEhfU1RBVEVfTkVFRF9ESVNDT05ORUNULAorICBEQlVTX0FVVEhfU1RBVEVfQVVUSEVOVElDQVRFRAorfSBEQnVzQXV0aFN0YXRlOworCitEQnVzQXV0aCogICAgIF9kYnVzX2F1dGhfc2VydmVyX25ldyAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgICAgICAqZ3VpZCk7CitEQnVzQXV0aCogICAgIF9kYnVzX2F1dGhfY2xpZW50X25ldyAgICAgICAgICAodm9pZCk7CitEQnVzQXV0aCogICAgIF9kYnVzX2F1dGhfcmVmICAgICAgICAgICAgICAgICAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCk7Cit2b2lkICAgICAgICAgIF9kYnVzX2F1dGhfdW5yZWYgICAgICAgICAgICAgICAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX2F1dGhfc2V0X21lY2hhbmlzbXMgICAgICAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgKiptZWNoYW5pc21zKTsKK0RCdXNBdXRoU3RhdGUgX2RidXNfYXV0aF9kb193b3JrICAgICAgICAgICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoKTsKK2RidXNfYm9vbF90ICAgX2RidXNfYXV0aF9nZXRfYnl0ZXNfdG9fc2VuZCAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAqKnN0cik7Cit2b2lkICAgICAgICAgIF9kYnVzX2F1dGhfYnl0ZXNfc2VudCAgICAgICAgICAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBieXRlc19zZW50KTsKK3ZvaWQgICAgICAgICAgX2RidXNfYXV0aF9nZXRfYnVmZmVyICAgICAgICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAgICAqKmJ1ZmZlcik7Cit2b2lkICAgICAgICAgIF9kYnVzX2F1dGhfcmV0dXJuX2J1ZmZlciAgICAgICAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICAgICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfcmVhZCk7Cit2b2lkICAgICAgICAgIF9kYnVzX2F1dGhfZ2V0X3VudXNlZF9ieXRlcyAgICAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgKipzdHIpOwordm9pZCAgICAgICAgICBfZGJ1c19hdXRoX2RlbGV0ZV91bnVzZWRfYnl0ZXMgKERCdXNBdXRoICAgICAgICAgICAgICAgKmF1dGgpOworZGJ1c19ib29sX3QgICBfZGJ1c19hdXRoX25lZWRzX2VuY29kaW5nICAgICAgKERCdXNBdXRoICAgICAgICAgICAgICAgKmF1dGgpOworZGJ1c19ib29sX3QgICBfZGJ1c19hdXRoX2VuY29kZV9kYXRhICAgICAgICAgKERCdXNBdXRoICAgICAgICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgICAqcGxhaW50ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAgICAgKmVuY29kZWQpOworZGJ1c19ib29sX3QgICBfZGJ1c19hdXRoX25lZWRzX2RlY29kaW5nICAgICAgKERCdXNBdXRoICAgICAgICAgICAgICAgKmF1dGgpOworZGJ1c19ib29sX3QgICBfZGJ1c19hdXRoX2RlY29kZV9kYXRhICAgICAgICAgKERCdXNBdXRoICAgICAgICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgICAqZW5jb2RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICAgICpwbGFpbnRleHQpOworZGJ1c19ib29sX3QgICBfZGJ1c19hdXRoX3NldF9jcmVkZW50aWFscyAgICAgKERCdXNBdXRoICAgICAgICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICAgICAgICAqY3JlZGVudGlhbHMpOworREJ1c0NyZWRlbnRpYWxzKiBfZGJ1c19hdXRoX2dldF9pZGVudGl0eSAgICAgKERCdXNBdXRoICAgICAgICAgICAgICAgKmF1dGgpOworZGJ1c19ib29sX3QgICBfZGJ1c19hdXRoX3NldF9jb250ZXh0ICAgICAgICAgKERCdXNBdXRoICAgICAgICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgICAqY29udGV4dCk7Citjb25zdCBjaGFyKiAgIF9kYnVzX2F1dGhfZ2V0X2d1aWRfZnJvbV9zZXJ2ZXIoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCk7CisKK3ZvaWQgICAgICAgICAgX2RidXNfYXV0aF9zZXRfdW5peF9mZF9wb3NzaWJsZShEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoLCBkYnVzX2Jvb2xfdCBiKTsKK2RidXNfYm9vbF90ICAgX2RidXNfYXV0aF9nZXRfdW5peF9mZF9uZWdvdGlhdGVkKERCdXNBdXRoICAgICAgICAgICAgICphdXRoKTsKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfQVVUSF9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1idXMuYyBiL2RidXMvZGJ1cy9kYnVzLWJ1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZGMzYTgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1idXMuYwpAQCAtMCwwICsxLDE1OTAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1idXMuYyAgQ29udmVuaWVuY2UgZnVuY3Rpb25zIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIGJ1cy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIENvZGVGYWN0b3J5IEFCCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtYnVzLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1tZXNzYWdlLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmgiCisjaW5jbHVkZSAiZGJ1cy10aHJlYWRzLWludGVybmFsLmgiCisjaW5jbHVkZSAiZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0J1cyBNZXNzYWdlIGJ1cyBBUElzCisgKiBAaW5ncm91cCBEQnVzCisgKiBAYnJpZWYgRnVuY3Rpb25zIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIG1lc3NhZ2UgYnVzCisgKgorICogZGJ1c19idXNfZ2V0KCkgYWxsb3dzIGFsbCBtb2R1bGVzIGFuZCBsaWJyYXJpZXMgaW4gYSBnaXZlbgorICogcHJvY2VzcyB0byBzaGFyZSB0aGUgc2FtZSBjb25uZWN0aW9uIHRvIHRoZSBidXMgZGFlbW9uIGJ5IHN0b3JpbmcKKyAqIHRoZSBjb25uZWN0aW9uIGdsb2JhbGx5LgorICoKKyAqIEFsbCBvdGhlciBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUgYXJlIGp1c3QgY29udmVuaWVuY2UgZnVuY3Rpb25zOworICogbW9zdCBvZiB0aGVtIGludm9rZSBtZXRob2RzIG9uIHRoZSBidXMgZGFlbW9uLCBieSBzZW5kaW5nIG1ldGhvZAorICogY2FsbCBtZXNzYWdlcyB0byAjREJVU19TRVJWSUNFX0RCVVMuIFRoZXNlIGNvbnZlbmllbmNlIGZ1bmN0aW9ucworICogb2Z0ZW4gbWFrZSBibG9ja2luZyBtZXRob2QgY2FsbHMuIElmIHlvdSBkb24ndCB3YW50IHRvIGJsb2NrLAorICogeW91IGNhbiBzZW5kIHRoZSBtZXRob2QgY2FsbCBtZXNzYWdlcyBtYW51YWxseSBpbiB0aGUgc2FtZSB3YXkKKyAqIHlvdSB3b3VsZCBhbnkgb3RoZXIgbWV0aG9kIGNhbGwgbWVzc2FnZS4KKyAqCisgKiBUaGlzIG1vZHVsZSBpcyB0aGUgb25seSBvbmUgaW4gbGliZGJ1cyB0aGF0J3Mgc3BlY2lmaWMgdG8KKyAqIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgbWVzc2FnZSBidXMgZGFlbW9uLiBUaGUgcmVzdCBvZiB0aGUgQVBJIGNhbgorICogYWxzbyBiZSB1c2VkIGZvciBjb25uZWN0aW5nIHRvIGFub3RoZXIgYXBwbGljYXRpb24gZGlyZWN0bHkuCisgKiAKKyAqIEB0b2RvIHJpZ2h0IG5vdyB0aGUgZGVmYXVsdCBhZGRyZXNzIG9mIHRoZSBzeXN0ZW0gYnVzIGlzIGhhcmRjb2RlZCwKKyAqIHNvIGlmIHlvdSBjaGFuZ2UgaXQgaW4gdGhlIGdsb2JhbCBjb25maWcgZmlsZSBzdWRkZW5seSB5b3UgaGF2ZSB0bworICogc2V0IERCVVNfU1lTVEVNX0JVU19BRERSRVNTIGVudiB2YXJpYWJsZS4gIE1pZ2h0IGJlIG5pY2UgaWYgdGhlCisgKiBjbGllbnQgbGliIHNvbWVob3cgcmVhZCB0aGUgY29uZmlnIGZpbGUsIG9yIGlmIHRoZSBidXMgb24gc3RhcnR1cAorICogc29tZWhvdyB3cm90ZSBvdXQgaXRzIGFkZHJlc3MgdG8gYSB3ZWxsLWtub3duIHNwb3QsIGJ1dCBtaWdodCBhbHNvCisgKiBub3QgYmUgd29ydGggaXQuCisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0J1c0ludGVybmFscyBNZXNzYWdlIGJ1cyBBUElzIGludGVybmFscworICogQGluZ3JvdXAgREJ1c0ludGVybmFscworICogQGJyaWVmIEludGVybmFscyBvZiBmdW5jdGlvbnMgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgbWVzc2FnZSBidXMKKyAqCisgKiBAeworICovCisKKy8qKgorICogQmxvY2sgb2YgbWVzc2FnZS1idXMtcmVsYXRlZCBkYXRhIHdlIGF0dGFjaCB0byBlYWNoCisgKiAjREJ1c0Nvbm5lY3Rpb24gdXNlZCB3aXRoIHRoZXNlIGNvbnZlbmllbmNlIGZ1bmN0aW9ucy4KKyAqCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOyAvKio8IENvbm5lY3Rpb24gd2UncmUgYXNzb2NpYXRlZCB3aXRoICovCisgIGNoYXIgKnVuaXF1ZV9uYW1lOyAvKio8IFVuaXF1ZSBuYW1lIG9mIHRoaXMgY29ubmVjdGlvbiAqLworCisgIHVuc2lnbmVkIGludCBpc193ZWxsX2tub3duIDogMTsgLyoqPCBJcyBvbmUgb2YgdGhlIHdlbGwta25vd24gY29ubmVjdGlvbnMgaW4gb3VyIGdsb2JhbCBhcnJheSAqLworfSBCdXNEYXRhOworCisvKiogVGhlIHNsb3Qgd2UgaGF2ZSByZXNlcnZlZCB0byBzdG9yZSBCdXNEYXRhLgorICovCitzdGF0aWMgZGJ1c19pbnQzMl90IGJ1c19kYXRhX3Nsb3QgPSAtMTsKKworLyoqIE51bWJlciBvZiBidXMgdHlwZXMgKi8KKyNkZWZpbmUgTl9CVVNfVFlQRVMgMworCitzdGF0aWMgREJ1c0Nvbm5lY3Rpb24gKmJ1c19jb25uZWN0aW9uc1tOX0JVU19UWVBFU107CitzdGF0aWMgY2hhciAqYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW05fQlVTX1RZUEVTXSA9IHsgTlVMTCwgTlVMTCwgTlVMTCB9OworCitzdGF0aWMgREJ1c0J1c1R5cGUgYWN0aXZhdGlvbl9idXNfdHlwZSA9IERCVVNfQlVTX1NUQVJURVI7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdCBpbml0aWFsaXplZCA9IEZBTFNFOworCisvKioKKyAqIExvY2sgZm9yIGdsb2JhbHMgaW4gdGhpcyBmaWxlCisgKi8KK19EQlVTX0RFRklORV9HTE9CQUxfTE9DSyAoYnVzKTsKKworLyoqCisgKiBHbG9iYWwgbG9jayBjb3ZlcmluZyBhbGwgQnVzRGF0YSBvbiBhbnkgY29ubmVjdGlvbi4gVGhlIGJldCBpcworICogdGhhdCBzb21lIGxvY2sgY29udGVudGlvbiBpcyBiZXR0ZXIgdGhhbiBtb3JlIG1lbW9yeQorICogZm9yIGEgcGVyLWNvbm5lY3Rpb24gbG9jaywgYnV0IGl0J3MgdG91Z2ggdG8gaW1hZ2luZSBpdCBtYXR0ZXJpbmcKKyAqIGVpdGhlciB3YXkuCisgKi8KK19EQlVTX0RFRklORV9HTE9CQUxfTE9DSyAoYnVzX2RhdGFzKTsKKworc3RhdGljIHZvaWQKK2FkZHJlc3Nlc19zaHV0ZG93bl9mdW5jICh2b2lkICpkYXRhKQoreworICBpbnQgaTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBOX0JVU19UWVBFUykKKyAgICB7CisgICAgICBpZiAoYnVzX2Nvbm5lY3Rpb25zW2ldICE9IE5VTEwpCisgICAgICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkICgiZGJ1c19zaHV0ZG93bigpIGNhbGxlZCBidXQgY29ubmVjdGlvbnMgd2VyZSBzdGlsbCBsaXZlLiBUaGlzIHByb2JhYmx5IG1lYW5zIHRoZSBhcHBsaWNhdGlvbiBkaWQgbm90IGRyb3AgYWxsIGl0cyByZWZlcmVuY2VzIHRvIGJ1cyBjb25uZWN0aW9ucy5cbiIpOworICAgICAgCisgICAgICBkYnVzX2ZyZWUgKGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tpXSk7CisgICAgICBidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbaV0gPSBOVUxMOworICAgICAgKytpOworICAgIH0KKworICBhY3RpdmF0aW9uX2J1c190eXBlID0gREJVU19CVVNfU1RBUlRFUjsKKworICBpbml0aWFsaXplZCA9IEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2dldF9mcm9tX2VudiAoY2hhciAgICAgICAgICAgKipjb25uZWN0aW9uX3AsCisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqZW52X3ZhcikKK3sKKyAgY29uc3QgY2hhciAqczsKKyAgCisgIF9kYnVzX2Fzc2VydCAoKmNvbm5lY3Rpb25fcCA9PSBOVUxMKTsKKyAgCisgIHMgPSBfZGJ1c19nZXRlbnYgKGVudl92YXIpOworICBpZiAocyA9PSBOVUxMIHx8ICpzID09ICdcMCcpCisgICAgcmV0dXJuIFRSVUU7IC8qIHN1Y2Nlc3NmdWxseSBkaWRuJ3QgdXNlIHRoZSBlbnYgdmFyICovCisgIGVsc2UKKyAgICB7CisgICAgICAqY29ubmVjdGlvbl9wID0gX2RidXNfc3RyZHVwIChzKTsKKyAgICAgIHJldHVybiAqY29ubmVjdGlvbl9wICE9IE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2luaXRfc2Vzc2lvbl9hZGRyZXNzICh2b2lkKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgCisgIHJldHZhbCA9IEZBTFNFOworCisgIC8qIEZpcnN0LCBsb29rIGluIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaXMgdGhlIG5vcm1hbCBjYXNlIG9uIAorICAgKiBmcmVlZGVza3RvcC5vcmcvVW5peCBzeXN0ZW1zLiAqLworICBnZXRfZnJvbV9lbnYgKCZidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU0VTU0lPTl0sCisgICAgICAgICAgICAgICAgICAgICAiREJVU19TRVNTSU9OX0JVU19BRERSRVNTIik7CisgIGlmIChidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU0VTU0lPTl0gPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2Jvb2xfdCBzdXBwb3J0ZWQ7CisgICAgICBEQnVzU3RyaW5nIGFkZHI7CisgICAgICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhZGRyKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBzdXBwb3J0ZWQgPSBGQUxTRTsKKyAgICAgIC8qIFNvIGl0J3Mgbm90IGluIHRoZSBlbnZpcm9ubWVudCAtIGxldCdzIHRyeSBhIHBsYXRmb3JtLXNwZWNpZmljIG1ldGhvZC4KKyAgICAgICAqIE9uIE1hY09TLCB0aGlzIGludm9sdmVzIGFza2luZyBsYXVuY2hkLiAgT24gV2luZG93cyAobm90IHNwZWNpZmllZCB5ZXQpCisgICAgICAgKiB3ZSBtaWdodCBkbyBhIENPTSBsb29rdXAuCisgICAgICAgKiBJZ25vcmUgZXJyb3JzIC0gaWYgd2UgZmFpbGVkLCBmYWxsIGJhY2sgdG8gYXV0b2xhdW5jaC4gKi8KKyAgICAgIHJldHZhbCA9IF9kYnVzX2xvb2t1cF9zZXNzaW9uX2FkZHJlc3MgKCZzdXBwb3J0ZWQsICZhZGRyLCAmZXJyb3IpOworICAgICAgaWYgKHN1cHBvcnRlZCAmJiByZXR2YWwpCisgICAgICAgIHsKKyAgICAgICAgICByZXR2YWwgPV9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgmYWRkciwgJmJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TRVNTSU9OXSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN1cHBvcnRlZCAmJiAhcmV0dmFsKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KCZlcnJvcikpCisgICAgICAgICAgICBfZGJ1c193YXJuICgiRHluYW1pYyBzZXNzaW9uIGxvb2t1cCBzdXBwb3J0ZWQgYnV0IGZhaWxlZDogJXNcbiIsIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJEeW5hbWljIHNlc3Npb24gbG9va3VwIHN1cHBvcnRlZCBidXQgZmFpbGVkIHNpbGVudGx5XG4iKTsKKyAgICAgICAgfQorICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhZGRyKTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR2YWwgPSBUUlVFOworCisgIGlmICghcmV0dmFsKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBUaGUgREJVU19TRVNTSU9OX0JVU19ERUZBVUxUX0FERFJFU1Mgc2hvdWxkIGhhdmUgcmVhbGx5IGJlZW4gbmFtZWQKKyAgICogREJVU19TRVNTSU9OX0JVU19GQUxMQkFDS19BRERSRVNTLiAKKyAgICovCisgIGlmIChidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU0VTU0lPTl0gPT0gTlVMTCkKKyAgICBidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU0VTU0lPTl0gPQorICAgICAgX2RidXNfc3RyZHVwIChEQlVTX1NFU1NJT05fQlVTX0RFRkFVTFRfQUREUkVTUyk7CisgIGlmIChidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU0VTU0lPTl0gPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraW5pdF9jb25uZWN0aW9uc191bmxvY2tlZCAodm9pZCkKK3sKKyAgaWYgKCFpbml0aWFsaXplZCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpzOworICAgICAgaW50IGk7CisKKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKGkgPCBOX0JVU19UWVBFUykKKyAgICAgICAgeworICAgICAgICAgIGJ1c19jb25uZWN0aW9uc1tpXSA9IE5VTEw7CisgICAgICAgICAgKytpOworICAgICAgICB9CisKKyAgICAgIC8qIERvbid0IGluaXQgdGhlc2UgdHdpY2UsIHdlIG1heSBydW4gdGhpcyBjb2RlIHR3aWNlIGlmCisgICAgICAgKiBpbml0X2Nvbm5lY3Rpb25zX3VubG9ja2VkKCkgZmFpbHMgbWlkd2F5IHRocm91Z2guCisgICAgICAgKiBJbiBwcmFjdGljZSwgZWFjaCBibG9jayBiZWxvdyBzaG91bGQgY29udGFpbiBvbmx5IG9uZQorICAgICAgICogInJldHVybiBGQUxTRSIgb3IgcnVubmluZyB0aHJvdWdoIHR3aWNlIG1heSBub3QKKyAgICAgICAqIHdvcmsgcmlnaHQuCisgICAgICAgKi8KKyAgICAgIAorICAgICAgIGlmIChidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU1lTVEVNXSA9PSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmlsbGluZyBpbiBzeXN0ZW0gYnVzIGFkZHJlc3MuLi5cbiIpOworICAgICAgICAgICAKKyAgICAgICAgICAgaWYgKCFnZXRfZnJvbV9lbnYgKCZidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU1lTVEVNXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEQlVTX1NZU1RFTV9CVVNfQUREUkVTUyIpKQorICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgCisgICAgICAgaWYgKGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TWVNURU1dID09IE5VTEwpCisgICAgICAgICB7CisgICAgICAgICAgIC8qIFVzZSBkZWZhdWx0IHN5c3RlbSBidXMgYWRkcmVzcyBpZiBub25lIHNldCBpbiBlbnZpcm9ubWVudCAqLworICAgICAgICAgICBidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU1lTVEVNXSA9CisgICAgICAgICAgICAgX2RidXNfc3RyZHVwIChEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTKTsKKworICAgICAgICAgICBpZiAoYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NZU1RFTV0gPT0gTlVMTCkKKyAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgIAorICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICB1c2VkIGRlZmF1bHQgc3lzdGVtIGJ1cyBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TWVNURU1dKTsKKyAgICAgICAgIH0KKyAgICAgICBlbHNlCisgICAgICAgICBfZGJ1c192ZXJib3NlICgiICB1c2VkIGVudiB2YXIgc3lzdGVtIGJ1cyBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU1lTVEVNXSk7CisgICAgICAgICAgCisgICAgICBpZiAoYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NFU1NJT05dID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmlsbGluZyBpbiBzZXNzaW9uIGJ1cyBhZGRyZXNzLi4uXG4iKTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoIWluaXRfc2Vzc2lvbl9hZGRyZXNzICgpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgXCIlc1wiXG4iLCBidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU0VTU0lPTl0gPworICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TRVNTSU9OXSA6ICJub25lIHNldCIpOworICAgICAgICB9CisKKyAgICAgIGlmIChidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU1RBUlRFUl0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGaWxsaW5nIGluIGFjdGl2YXRpb24gYnVzIGFkZHJlc3MuLi5cbiIpOworICAgICAgICAgIAorICAgICAgICAgIGlmICghZ2V0X2Zyb21fZW52ICgmYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NUQVJURVJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiREJVU19TVEFSVEVSX0FERFJFU1MiKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICBcIiVzXCJcbiIsIGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TVEFSVEVSXSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NUQVJURVJdIDogIm5vbmUgc2V0Iik7CisgICAgICAgIH0KKworCisgICAgICBpZiAoYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NUQVJURVJdICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBzID0gX2RidXNfZ2V0ZW52ICgiREJVU19TVEFSVEVSX0JVU19UWVBFIik7CisgICAgICAgICAgICAgIAorICAgICAgICAgIGlmIChzICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJCdXMgYWN0aXZhdGlvbiB0eXBlIHdhcyBzZXQgdG8gXCIlc1wiXG4iLCBzKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoc3RyY21wIChzLCAic3lzdGVtIikgPT0gMCkKKyAgICAgICAgICAgICAgICBhY3RpdmF0aW9uX2J1c190eXBlID0gREJVU19CVVNfU1lTVEVNOworICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKHMsICJzZXNzaW9uIikgPT0gMCkKKyAgICAgICAgICAgICAgICBhY3RpdmF0aW9uX2J1c190eXBlID0gREJVU19CVVNfU0VTU0lPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogRGVmYXVsdCB0byB0aGUgc2Vzc2lvbiBidXMgaW5zdGVhZCBpZiBhdmFpbGFibGUgKi8KKyAgICAgICAgICBpZiAoYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NFU1NJT05dICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TVEFSVEVSXSA9CisgICAgICAgICAgICAgICAgX2RidXNfc3RyZHVwIChidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU0VTU0lPTl0pOworICAgICAgICAgICAgICBpZiAoYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NUQVJURVJdID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAKKyAgICAgIC8qIElmIHdlIHJldHVybiBGQUxTRSB3ZSBoYXZlIHRvIGJlIHN1cmUgdGhhdCByZXN0YXJ0aW5nCisgICAgICAgKiB0aGUgYWJvdmUgY29kZSB3aWxsIHdvcmsgcmlnaHQKKyAgICAgICAqLworICAgICAgCisgICAgICBpZiAoIV9kYnVzX3NldGVudiAoIkRCVVNfQUNUSVZBVElPTl9BRERSRVNTIiwgTlVMTCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKCFfZGJ1c19zZXRlbnYgKCJEQlVTX0FDVElWQVRJT05fQlVTX1RZUEUiLCBOVUxMKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBpZiAoIV9kYnVzX3JlZ2lzdGVyX3NodXRkb3duX2Z1bmMgKGFkZHJlc3Nlc19zaHV0ZG93bl9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBpbml0aWFsaXplZCA9IFRSVUU7CisgICAgfQorCisgIHJldHVybiBpbml0aWFsaXplZDsKK30KKworc3RhdGljIHZvaWQKK2J1c19kYXRhX2ZyZWUgKHZvaWQgKmRhdGEpCit7CisgIEJ1c0RhdGEgKmJkID0gZGF0YTsKKyAgCisgIGlmIChiZC0+aXNfd2VsbF9rbm93bikKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIF9EQlVTX0xPQ0sgKGJ1cyk7CisgICAgICAvKiBXZSBtYXkgYmUgc3RvcmVkIGluIG1vcmUgdGhhbiBvbmUgc2xvdCAqLworICAgICAgLyogVGhpcyBzaG91bGQgbm93IGJlIGltcG9zc2libGUgLSB0aGVzZSBzbG90cyBhcmUgc3VwcG9zZWQgdG8KKyAgICAgICAqIGJlIGNsZWFyZWQgb24gZGlzY29ubmVjdCwgc28gc2hvdWxkIG5vdCBuZWVkIHRvIGJlIGNsZWFyZWQgb24KKyAgICAgICAqIGZpbmFsaXplCisgICAgICAgKi8KKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKGkgPCBOX0JVU19UWVBFUykKKyAgICAgICAgeworICAgICAgICAgIGlmIChidXNfY29ubmVjdGlvbnNbaV0gPT0gYmQtPmNvbm5lY3Rpb24pCisgICAgICAgICAgICBidXNfY29ubmVjdGlvbnNbaV0gPSBOVUxMOworICAgICAgICAgIAorICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgICAgX0RCVVNfVU5MT0NLIChidXMpOworICAgIH0KKyAgCisgIGRidXNfZnJlZSAoYmQtPnVuaXF1ZV9uYW1lKTsKKyAgZGJ1c19mcmVlIChiZCk7CisKKyAgZGJ1c19jb25uZWN0aW9uX2ZyZWVfZGF0YV9zbG90ICgmYnVzX2RhdGFfc2xvdCk7Cit9CisKK3N0YXRpYyBCdXNEYXRhKgorZW5zdXJlX2J1c19kYXRhIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQnVzRGF0YSAqYmQ7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fYWxsb2NhdGVfZGF0YV9zbG90ICgmYnVzX2RhdGFfc2xvdCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgYmQgPSBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2RhdGEgKGNvbm5lY3Rpb24sIGJ1c19kYXRhX3Nsb3QpOworICBpZiAoYmQgPT0gTlVMTCkKKyAgICB7ICAgICAgCisgICAgICBiZCA9IGRidXNfbmV3MCAoQnVzRGF0YSwgMSk7CisgICAgICBpZiAoYmQgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9mcmVlX2RhdGFfc2xvdCAoJmJ1c19kYXRhX3Nsb3QpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgIGJkLT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgICAgIAorICAgICAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2V0X2RhdGEgKGNvbm5lY3Rpb24sIGJ1c19kYXRhX3Nsb3QsIGJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19kYXRhX2ZyZWUpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19mcmVlIChiZCk7CisgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX2ZyZWVfZGF0YV9zbG90ICgmYnVzX2RhdGFfc2xvdCk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgLyogRGF0YSBzbG90IHJlZmNvdW50IG5vdyBoZWxkIGJ5IHRoZSBCdXNEYXRhICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX2ZyZWVfZGF0YV9zbG90ICgmYnVzX2RhdGFfc2xvdCk7CisgICAgfQorCisgIHJldHVybiBiZDsKK30KKworLyoqCisgKiBJbnRlcm5hbCBmdW5jdGlvbiB0aGF0IGNoZWNrcyB0byBzZWUgaWYgdGhpcworICogaXMgYSBzaGFyZWQgY29ubmVjdGlvbiBvd25lZCBieSB0aGUgYnVzIGFuZCBpZiBpdCBpcyB1bnJlZiBpdC4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiBhIGNvbm5lY3Rpb24gdGhhdCBoYXMgYmVlbiBkaXNjb25uZWN0ZWQuCisgKi8KK3ZvaWQKK19kYnVzX2J1c19ub3RpZnlfc2hhcmVkX2Nvbm5lY3Rpb25fZGlzY29ubmVjdGVkX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgaW50IGk7CisgIAorICBfREJVU19MT0NLIChidXMpOworCisgIC8qIFdlIGFyZSBleHBlY3RpbmcgdG8gaGF2ZSB0aGUgY29ubmVjdGlvbiBzYXZlZCBpbiBvbmx5IG9uZSBvZiB0aGVzZQorICAgKiBzbG90cywgYnV0IHNvbWVvbmUgY291bGQgaW4gYSBwYXRob2xvZ2ljYWwgY2FzZSBzZXQgc3lzdGVtIGFuZCBzZXNzaW9uCisgICAqIGJ1cyB0byB0aGUgc2FtZSBidXMgb3Igc29tZXRoaW5nLiBPciBzZXQgb25lIG9mIHRoZW0gdG8gdGhlIHN0YXJ0ZXIKKyAgICogYnVzIHdpdGhvdXQgc2V0dGluZyB0aGUgc3RhcnRlciBidXMgdHlwZSBpbiB0aGUgZW52IHZhcmlhYmxlLgorICAgKiBTbyB3ZSBkb24ndCBicmVhayB0aGUgbG9vcCBhcyBzb29uIGFzIHdlIGZpbmQgYSBtYXRjaC4KKyAgICovCisgIGZvciAoaSA9IDA7IGkgPCBOX0JVU19UWVBFUzsgKytpKQorICAgIHsKKyAgICAgIGlmIChidXNfY29ubmVjdGlvbnNbaV0gPT0gY29ubmVjdGlvbikKKyAgICAgICAgeworICAgICAgICAgIGJ1c19jb25uZWN0aW9uc1tpXSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgX0RCVVNfVU5MT0NLIChidXMpOworfQorCitzdGF0aWMgREJ1c0Nvbm5lY3Rpb24gKgoraW50ZXJuYWxfYnVzX2dldCAoREJ1c0J1c1R5cGUgIHR5cGUsCisgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgcHJpdmF0ZSwKKyAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqYWRkcmVzczsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIEJ1c0RhdGEgKmJkOworICBEQnVzQnVzVHlwZSBhZGRyZXNzX3R5cGU7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICh0eXBlID49IDAgJiYgdHlwZSA8IE5fQlVTX1RZUEVTLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9lcnJvcl9pc19zZXQgKGVycm9yLCBOVUxMKTsKKworICBjb25uZWN0aW9uID0gTlVMTDsKKworICBfREJVU19MT0NLIChidXMpOworCisgIGlmICghaW5pdF9jb25uZWN0aW9uc191bmxvY2tlZCAoKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgLyogV2Ugd2FudCB0byB1c2UgdGhlIGFjdGl2YXRpb24gYWRkcmVzcyBldmVuIGlmIHRoZQorICAgKiBhY3RpdmF0aW5nIGJ1cyBpcyB0aGUgc2Vzc2lvbiBvciBzeXN0ZW0gYnVzLAorICAgKiBwZXIgdGhlIHNwZWMuCisgICAqLworICBhZGRyZXNzX3R5cGUgPSB0eXBlOworICAKKyAgLyogVXNlIHRoZSByZWFsIHR5cGUgb2YgdGhlIGFjdGl2YXRpb24gYnVzIGZvciBnZXR0aW5nIGl0cworICAgKiBjb25uZWN0aW9uLCBidXQgb25seSBpZiB0aGUgcmVhbCB0eXBlJ3MgYWRkcmVzcyBpcyBhdmFpbGFibGUuIChJZgorICAgKiB0aGUgYWN0aXZhdGluZyBidXMgaXNuJ3QgYSB3ZWxsLWtub3duIGJ1cyB0aGVuCisgICAqIGFjdGl2YXRpb25fYnVzX3R5cGUgPT0gREJVU19CVVNfU1RBUlRFUikKKyAgICovCisgIGlmICh0eXBlID09IERCVVNfQlVTX1NUQVJURVIgJiYKKyAgICAgIGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1thY3RpdmF0aW9uX2J1c190eXBlXSAhPSBOVUxMKQorICAgIHR5cGUgPSBhY3RpdmF0aW9uX2J1c190eXBlOworICAKKyAgaWYgKCFwcml2YXRlICYmIGJ1c19jb25uZWN0aW9uc1t0eXBlXSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNvbm5lY3Rpb24gPSBidXNfY29ubmVjdGlvbnNbdHlwZV07CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmVmIChjb25uZWN0aW9uKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBhZGRyZXNzID0gYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW2FkZHJlc3NfdHlwZV07CisgIGlmIChhZGRyZXNzID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGRldGVybWluZSB0aGUgYWRkcmVzcyBvZiB0aGUgbWVzc2FnZSBidXMgKHRyeSAnbWFuIGRidXMtbGF1bmNoJyBhbmQgJ21hbiBkYnVzLWRhZW1vbicgZm9yIGhlbHApIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKHByaXZhdGUpCisgICAgY29ubmVjdGlvbiA9IGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKGFkZHJlc3MsIGVycm9yKTsKKyAgZWxzZQorICAgIGNvbm5lY3Rpb24gPSBkYnVzX2Nvbm5lY3Rpb25fb3BlbiAoYWRkcmVzcywgZXJyb3IpOworICAKKyAgaWYgKCFjb25uZWN0aW9uKQorICAgIHsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIWRidXNfYnVzX3JlZ2lzdGVyIChjb25uZWN0aW9uLCBlcnJvcikpCisgICAgeworICAgICAgX2RidXNfY29ubmVjdGlvbl9jbG9zZV9wb3NzaWJseV9zaGFyZWQgKGNvbm5lY3Rpb24pOworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKyAgICAgIGNvbm5lY3Rpb24gPSBOVUxMOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmICghcHJpdmF0ZSkKKyAgICB7CisgICAgICAvKiBzdG9yZSBhIHdlYWsgcmVmIHRvIHRoZSBjb25uZWN0aW9uIChkYnVzLWNvbm5lY3Rpb24uYyBpcworICAgICAgICogc3VwcG9zZWQgdG8gaGF2ZSBhIHN0cm9uZyByZWYgdGhhdCBpdCBkcm9wcyBvbiBkaXNjb25uZWN0LAorICAgICAgICogc2luY2UgdGhpcyBpcyBhIHNoYXJlZCBjb25uZWN0aW9uKQorICAgICAgICovCisgICAgICBidXNfY29ubmVjdGlvbnNbdHlwZV0gPSBjb25uZWN0aW9uOworICAgIH0KKworICAvKiBCeSBkZWZhdWx0IHdlJ3JlIGJvdW5kIHRvIHRoZSBsaWZlY3ljbGUgb2YKKyAgICogdGhlIG1lc3NhZ2UgYnVzLgorICAgKi8KKyAgZGJ1c19jb25uZWN0aW9uX3NldF9leGl0X29uX2Rpc2Nvbm5lY3QgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKTsKKyAKKyAgX0RCVVNfTE9DSyAoYnVzX2RhdGFzKTsKKyAgYmQgPSBlbnN1cmVfYnVzX2RhdGEgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKGJkICE9IE5VTEwpOyAvKiBpdCBzaG91bGQgaGF2ZSBiZWVuIGNyZWF0ZWQgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIsIHNvIE9PTSBub3QgcG9zc2libGUgKi8KKyAgYmQtPmlzX3dlbGxfa25vd24gPSBUUlVFOworICBfREJVU19VTkxPQ0sgKGJ1c19kYXRhcyk7CisKK291dDoKKyAgLyogUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBjYWxsZXIsIG9yIE5VTEwgd2l0aCBlcnJvciBzZXQuICovCisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworCisgIF9EQlVTX1VOTE9DSyAoYnVzKTsKKyAgcmV0dXJuIGNvbm5lY3Rpb247Cit9CisKKworLyoqIEB9ICovIC8qIGVuZCBvZiBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGRvY3MgKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzQnVzCisgKiBAeworICovCisKKy8qKgorICogQ29ubmVjdHMgdG8gYSBidXMgZGFlbW9uIGFuZCByZWdpc3RlcnMgdGhlIGNsaWVudCB3aXRoIGl0LiAgSWYgYQorICogY29ubmVjdGlvbiB0byB0aGUgYnVzIGFscmVhZHkgZXhpc3RzLCB0aGVuIHRoYXQgY29ubmVjdGlvbiBpcworICogcmV0dXJuZWQuICBUaGUgY2FsbGVyIG9mIHRoaXMgZnVuY3Rpb24gb3ducyBhIHJlZmVyZW5jZSB0byB0aGUgYnVzLgorICoKKyAqIFRoZSBjYWxsZXIgbWF5IE5PVCBjYWxsIGRidXNfY29ubmVjdGlvbl9jbG9zZSgpIG9uIHRoaXMgY29ubmVjdGlvbjsKKyAqIHNlZSBkYnVzX2Nvbm5lY3Rpb25fb3BlbigpIGFuZCBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UoKSBmb3IgZGV0YWlscworICogb24gdGhhdC4KKyAqCisgKiBJZiB0aGlzIGZ1bmN0aW9uIG9idGFpbnMgYSBuZXcgY29ubmVjdGlvbiBvYmplY3QgbmV2ZXIgYmVmb3JlCisgKiByZXR1cm5lZCBmcm9tIGRidXNfYnVzX2dldCgpLCBpdCB3aWxsIGNhbGwKKyAqIGRidXNfY29ubmVjdGlvbl9zZXRfZXhpdF9vbl9kaXNjb25uZWN0KCksIHNvIHRoZSBhcHBsaWNhdGlvbgorICogd2lsbCBleGl0IGlmIHRoZSBjb25uZWN0aW9uIGNsb3Nlcy4gWW91IGNhbiB1bmRvIHRoaXMKKyAqIGJ5IGNhbGxpbmcgZGJ1c19jb25uZWN0aW9uX3NldF9leGl0X29uX2Rpc2Nvbm5lY3QoKSB5b3Vyc2VsZgorICogYWZ0ZXIgeW91IGdldCB0aGUgY29ubmVjdGlvbi4KKyAqCisgKiBkYnVzX2J1c19nZXQoKSBjYWxscyBkYnVzX2J1c19yZWdpc3RlcigpIGZvciB5b3UuCisgKiAKKyAqIElmIHJldHVybmluZyBhIG5ld2x5LWNyZWF0ZWQgY29ubmVjdGlvbiwgdGhpcyBmdW5jdGlvbiB3aWxsIGJsb2NrCisgKiB1bnRpbCBhdXRoZW50aWNhdGlvbiBhbmQgYnVzIHJlZ2lzdHJhdGlvbiBhcmUgY29tcGxldGUuCisgKiAKKyAqIEBwYXJhbSB0eXBlIGJ1cyB0eXBlCisgKiBAcGFyYW0gZXJyb3IgYWRkcmVzcyB3aGVyZSBhbiBlcnJvciBjYW4gYmUgcmV0dXJuZWQuCisgKiBAcmV0dXJucyBhICNEQnVzQ29ubmVjdGlvbiB3aXRoIG5ldyByZWYKKyAqLworREJ1c0Nvbm5lY3Rpb24gKgorZGJ1c19idXNfZ2V0IChEQnVzQnVzVHlwZSAgdHlwZSwKKwkgICAgICBEQnVzRXJyb3IgICAqZXJyb3IpCit7CisgIHJldHVybiBpbnRlcm5hbF9idXNfZ2V0ICh0eXBlLCBGQUxTRSwgZXJyb3IpOworfQorCisvKioKKyAqIENvbm5lY3RzIHRvIGEgYnVzIGRhZW1vbiBhbmQgcmVnaXN0ZXJzIHRoZSBjbGllbnQgd2l0aCBpdCBhcyB3aXRoCisgKiBkYnVzX2J1c19yZWdpc3RlcigpLiAgVW5saWtlIGRidXNfYnVzX2dldCgpLCBhbHdheXMgY3JlYXRlcyBhIG5ldworICogY29ubmVjdGlvbi4gVGhpcyBjb25uZWN0aW9uIHdpbGwgbm90IGJlIHNhdmVkIG9yIHJlY3ljbGVkIGJ5CisgKiBsaWJkYnVzLiBDYWxsZXIgb3ducyBhIHJlZmVyZW5jZSB0byB0aGUgYnVzIGFuZCBtdXN0IGVpdGhlciBjbG9zZQorICogaXQgb3Iga25vdyBpdCB0byBiZSBjbG9zZWQgcHJpb3IgdG8gcmVsZWFzaW5nIHRoaXMgcmVmZXJlbmNlLgorICoKKyAqIFNlZSBkYnVzX2Nvbm5lY3Rpb25fb3Blbl9wcml2YXRlKCkgZm9yIG1vcmUgZGV0YWlscyBvbiB3aGVuIHRvCisgKiBjbG9zZSBhbmQgdW5yZWYgdGhpcyBjb25uZWN0aW9uLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsbHMKKyAqIGRidXNfY29ubmVjdGlvbl9zZXRfZXhpdF9vbl9kaXNjb25uZWN0KCkgb24gdGhlIG5ldyBjb25uZWN0aW9uLCBzbyB0aGUgYXBwbGljYXRpb24KKyAqIHdpbGwgZXhpdCBpZiB0aGUgY29ubmVjdGlvbiBjbG9zZXMuIFlvdSBjYW4gdW5kbyB0aGlzCisgKiBieSBjYWxsaW5nIGRidXNfY29ubmVjdGlvbl9zZXRfZXhpdF9vbl9kaXNjb25uZWN0KCkgeW91cnNlbGYKKyAqIGFmdGVyIHlvdSBnZXQgdGhlIGNvbm5lY3Rpb24uCisgKgorICogZGJ1c19idXNfZ2V0X3ByaXZhdGUoKSBjYWxscyBkYnVzX2J1c19yZWdpc3RlcigpIGZvciB5b3UuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGJsb2NrIHVudGlsIGF1dGhlbnRpY2F0aW9uIGFuZCBidXMgcmVnaXN0cmF0aW9uCisgKiBhcmUgY29tcGxldGUuCisgKgorICogQHBhcmFtIHR5cGUgYnVzIHR5cGUKKyAqIEBwYXJhbSBlcnJvciBhZGRyZXNzIHdoZXJlIGFuIGVycm9yIGNhbiBiZSByZXR1cm5lZC4KKyAqIEByZXR1cm5zIGEgREJ1c0Nvbm5lY3Rpb24gd2l0aCBuZXcgcmVmCisgKi8KK0RCdXNDb25uZWN0aW9uICoKK2RidXNfYnVzX2dldF9wcml2YXRlIChEQnVzQnVzVHlwZSAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAqZXJyb3IpCit7CisgIHJldHVybiBpbnRlcm5hbF9idXNfZ2V0ICh0eXBlLCBUUlVFLCBlcnJvcik7Cit9CisKKy8qKgorICogUmVnaXN0ZXJzIGEgY29ubmVjdGlvbiB3aXRoIHRoZSBidXMuIFRoaXMgbXVzdCBiZSB0aGUgZmlyc3QKKyAqIHRoaW5nIGFuIGFwcGxpY2F0aW9uIGRvZXMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBtZXNzYWdlIGJ1cy4KKyAqIElmIHJlZ2lzdHJhdGlvbiBzdWNjZWVkcywgdGhlIHVuaXF1ZSBuYW1lIHdpbGwgYmUgc2V0LAorICogYW5kIGNhbiBiZSBvYnRhaW5lZCB1c2luZyBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUoKS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmxvY2sgdW50aWwgcmVnaXN0cmF0aW9uIGlzIGNvbXBsZXRlLgorICoKKyAqIElmIHRoZSBjb25uZWN0aW9uIGhhcyBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCB0aGUgYnVzCisgKiAoZGV0ZXJtaW5lZCBieSBjaGVja2luZyB3aGV0aGVyIGRidXNfYnVzX2dldF91bmlxdWVfbmFtZSgpCisgKiByZXR1cm5zIGEgbm9uLSNOVUxMIHZhbHVlKSwgdGhlbiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZy4KKyAqCisgKiBJZiB5b3UgdXNlIGRidXNfYnVzX2dldCgpIG9yIGRidXNfYnVzX2dldF9wcml2YXRlKCkgdGhpcworICogZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgZm9yIHlvdS4KKyAqIAorICogQG5vdGUgSnVzdCB1c2UgZGJ1c19idXNfZ2V0KCkgb3IgZGJ1c19idXNfZ2V0X3ByaXZhdGUoKSBpbnN0ZWFkIG9mCisgKiBkYnVzX2J1c19yZWdpc3RlcigpIGFuZCBzYXZlIHlvdXJzZWxmIHNvbWUgcGFpbi4gVXNpbmcKKyAqIGRidXNfYnVzX3JlZ2lzdGVyKCkgbWFudWFsbHkgaXMgb25seSB1c2VmdWwgaWYgeW91IGhhdmUgeW91cgorICogb3duIGN1c3RvbSBtZXNzYWdlIGJ1cyBub3QgZm91bmQgaW4gI0RCdXNCdXNUeXBlLgorICoKKyAqIElmIHlvdSBvcGVuIGEgYnVzIGNvbm5lY3Rpb24gd2l0aCBkYnVzX2Nvbm5lY3Rpb25fb3BlbigpIG9yCisgKiBkYnVzX2Nvbm5lY3Rpb25fb3Blbl9wcml2YXRlKCkgeW91IHdpbGwgaGF2ZSB0byBkYnVzX2J1c19yZWdpc3RlcigpCisgKiB5b3Vyc2VsZiwgb3IgbWFrZSB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0cmF0aW9uIG1ldGhvZCBjYWxscworICogeW91cnNlbGYuIElmIHlvdSBzZW5kIHRoZSBtZXRob2QgY2FsbHMgeW91cnNlbGYsIGNhbGwKKyAqIGRidXNfYnVzX3NldF91bmlxdWVfbmFtZSgpIHdpdGggdGhlIHVuaXF1ZSBidXMgbmFtZSB5b3UgZ2V0IGZyb20KKyAqIHRoZSBidXMuCisgKgorICogRm9yIHNoYXJlZCBjb25uZWN0aW9ucyAoY3JlYXRlZCB3aXRoIGRidXNfY29ubmVjdGlvbl9vcGVuKCkpIGluIGEKKyAqIG11bHRpdGhyZWFkZWQgYXBwbGljYXRpb24sIHlvdSBjYW4ndCByZWFsbHkgbWFrZSB0aGUgcmVnaXN0cmF0aW9uCisgKiBjYWxscyB5b3Vyc2VsZiwgYmVjYXVzZSB5b3UgZG9uJ3Qga25vdyB3aGV0aGVyIHNvbWUgb3RoZXIgdGhyZWFkIGlzCisgKiBhbHNvIHJlZ2lzdGVyaW5nLCBhbmQgdGhlIGJ1cyB3aWxsIGtpY2sgeW91IG9mZiBpZiB5b3Ugc2VuZCB0d28KKyAqIHJlZ2lzdHJhdGlvbiBtZXNzYWdlcy4KKyAqCisgKiBJZiB5b3UgdXNlIGRidXNfYnVzX3JlZ2lzdGVyKCkgaG93ZXZlciwgdGhlcmUgaXMgYSBsb2NrIHRoYXQKKyAqIGtlZXBzIGJvdGggYXBwcyBmcm9tIHJlZ2lzdGVyaW5nIGF0IHRoZSBzYW1lIHRpbWUuCisgKgorICogVGhlIHJ1bGUgaW4gYSBtdWx0aXRocmVhZGVkIGFwcCwgdGhlbiwgaXMgdGhhdCBkYnVzX2J1c19yZWdpc3RlcigpCisgKiBtdXN0IGJlIHVzZWQgdG8gcmVnaXN0ZXIsIG9yIHlvdSBuZWVkIHRvIGhhdmUgeW91ciBvd24gbG9ja3MgdGhhdAorICogYWxsIHRocmVhZHMgaW4gdGhlIGFwcCB3aWxsIHJlc3BlY3QuCisgKgorICogSW4gYSBzaW5nbGUtdGhyZWFkZWQgYXBwbGljYXRpb24geW91IGNhbiByZWdpc3RlciBieSBoYW5kIGluc3RlYWQKKyAqIG9mIHVzaW5nIGRidXNfYnVzX3JlZ2lzdGVyKCksIGFzIGxvbmcgYXMgeW91IGNoZWNrCisgKiBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUoKSB0byBzZWUgaWYgYSB1bmlxdWUgbmFtZSBoYXMgYWxyZWFkeSBiZWVuCisgKiBzdG9yZWQgYnkgYW5vdGhlciB0aHJlYWQgYmVmb3JlIHlvdSBzZW5kIHRoZSByZWdpc3RyYXRpb24gbWVzc2FnZXMuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gZXJyb3IgcGxhY2UgdG8gc3RvcmUgZXJyb3JzCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2J1c19yZWdpc3RlciAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZSwgKnJlcGx5OworICBjaGFyICpuYW1lOworICBCdXNEYXRhICpiZDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZXJyb3JfaXNfc2V0IChlcnJvciwgRkFMU0UpOworCisgIHJldHZhbCA9IEZBTFNFOworICBtZXNzYWdlID0gTlVMTDsKKyAgcmVwbHkgPSBOVUxMOworCisgIF9EQlVTX0xPQ0sgKGJ1c19kYXRhcyk7CisKKyAgYmQgPSBlbnN1cmVfYnVzX2RhdGEgKGNvbm5lY3Rpb24pOworICBpZiAoYmQgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKGJkLT51bmlxdWVfbmFtZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlZ2lzdGVyIHRoZSBzYW1lIERCdXNDb25uZWN0aW9uICVzIHdpdGggdGhlIG1lc3NhZ2UgYnVzIGEgc2Vjb25kIHRpbWUuXG4iLAorICAgICAgICAgICAgICAgICAgICAgYmQtPnVuaXF1ZV9uYW1lKTsKKyAgICAgIC8qIFN1Y2Nlc3MhICovCisgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgZ290byBvdXQ7CisgICAgfQorICAKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbGxvIik7IAorCisgIGlmICghbWVzc2FnZSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIAorICByZXBseSA9IGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrIChjb25uZWN0aW9uLCBtZXNzYWdlLCAtMSwgZXJyb3IpOworCisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworICBlbHNlIGlmIChkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgKGVycm9yLCByZXBseSkpCisgICAgZ290byBvdXQ7CisgIGVsc2UgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKHJlcGx5LCBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICBnb3RvIG91dDsKKyAgCisgIGJkLT51bmlxdWVfbmFtZSA9IF9kYnVzX3N0cmR1cCAobmFtZSk7CisgIGlmIChiZC0+dW5pcXVlX25hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIAorICByZXR2YWwgPSBUUlVFOworICAKKyBvdXQ6CisgIF9EQlVTX1VOTE9DSyAoYnVzX2RhdGFzKTsKKworICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIGlmIChyZXBseSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICBpZiAoIXJldHZhbCkKKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworCisvKioKKyAqIFNldHMgdGhlIHVuaXF1ZSBuYW1lIG9mIHRoZSBjb25uZWN0aW9uLCBhcyBhc3NpZ25lZCBieSB0aGUgbWVzc2FnZQorICogYnVzLiAgQ2FuIG9ubHkgYmUgdXNlZCBpZiB5b3UgcmVnaXN0ZXJlZCB3aXRoIHRoZSBidXMgbWFudWFsbHkKKyAqIChpLmUuIGlmIHlvdSBkaWQgbm90IGNhbGwgZGJ1c19idXNfcmVnaXN0ZXIoKSkuIENhbiBvbmx5IGJlIGNhbGxlZAorICogb25jZSBwZXIgY29ubmVjdGlvbi4gIEFmdGVyIHRoZSB1bmlxdWUgbmFtZSBpcyBzZXQsIHlvdSBjYW4gZ2V0IGl0CisgKiB3aXRoIGRidXNfYnVzX2dldF91bmlxdWVfbmFtZSgpLgorICoKKyAqIFRoZSBvbmx5IHJlYXNvbiB0byB1c2UgdGhpcyBmdW5jdGlvbiBpcyB0byByZS1pbXBsZW1lbnQgdGhlCisgKiBlcXVpdmFsZW50IG9mIGRidXNfYnVzX3JlZ2lzdGVyKCkgeW91cnNlbGYuIE9uZSAocHJvYmFibHkgdW51c3VhbCkKKyAqIHJlYXNvbiB0byBkbyB0aGF0IG1pZ2h0IGJlIHRvIGRvIHRoZSBidXMgcmVnaXN0cmF0aW9uIGNhbGwKKyAqIGFzeW5jaHJvbm91c2x5IGluc3RlYWQgb2Ygc3luY2hyb25vdXNseS4KKyAqCisgKiBAbm90ZSBKdXN0IHVzZSBkYnVzX2J1c19nZXQoKSBvciBkYnVzX2J1c19nZXRfcHJpdmF0ZSgpLCBvciB3b3JzdAorICogY2FzZSBkYnVzX2J1c19yZWdpc3RlcigpLCBpbnN0ZWFkIG9mIG1lc3Npbmcgd2l0aCB0aGlzCisgKiBmdW5jdGlvbi4gVGhlcmUncyByZWFsbHkgbm8gcG9pbnQgY3JlYXRpbmcgcGFpbiBmb3IgeW91cnNlbGYgYnkKKyAqIGRvaW5nIHRoaW5ncyBtYW51YWxseS4KKyAqCisgKiBJdCdzIGhhcmQgdG8gdXNlIHRoaXMgZnVuY3Rpb24gc2FmZWx5IG9uIHNoYXJlZCBjb25uZWN0aW9ucworICogKGNyZWF0ZWQgYnkgZGJ1c19jb25uZWN0aW9uX29wZW4oKSkgaW4gYSBtdWx0aXRocmVhZGVkIGFwcGxpY2F0aW9uLAorICogYmVjYXVzZSBvbmx5IG9uZSByZWdpc3RyYXRpb24gYXR0ZW1wdCBjYW4gYmUgc2VudCB0byB0aGUgYnVzLiBJZgorICogdHdvIHRocmVhZHMgYXJlIGJvdGggc2VuZGluZyB0aGUgcmVnaXN0cmF0aW9uIG1lc3NhZ2UsIHRoZXJlIGlzIG5vCisgKiBtZWNoYW5pc20gaW4gbGliZGJ1cyBpdHNlbGYgdG8gYXZvaWQgc2VuZGluZyBpdCB0d2ljZS4KKyAqCisgKiBUaHVzLCB5b3UgbmVlZCBhIHdheSB0byBjb29yZGluYXRlIHdoaWNoIHRocmVhZCBzZW5kcyB0aGUKKyAqIHJlZ2lzdHJhdGlvbiBhdHRlbXB0OyB3aGljaCBhbHNvIG1lYW5zIHlvdSBrbm93IHdoaWNoIHRocmVhZAorICogd2lsbCBjYWxsIGRidXNfYnVzX3NldF91bmlxdWVfbmFtZSgpLiBJZiB5b3UgZG9uJ3Qga25vdworICogYWJvdXQgYWxsIHRocmVhZHMgaW4gdGhlIGFwcCAoZm9yIGV4YW1wbGUsIGlmIHNvbWUgbGlicmFyaWVzCisgKiB5b3UncmUgdXNpbmcgbWlnaHQgc3RhcnQgbGliZGJ1cy11c2luZyB0aHJlYWRzKSwgdGhlbiB5b3UKKyAqIG5lZWQgdG8gYXZvaWQgdXNpbmcgdGhpcyBmdW5jdGlvbiBvbiBzaGFyZWQgY29ubmVjdGlvbnMuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSB1bmlxdWVfbmFtZSB0aGUgdW5pcXVlIG5hbWUKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19idXNfc2V0X3VuaXF1ZV9uYW1lIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnVuaXF1ZV9uYW1lKQoreworICBCdXNEYXRhICpiZDsKKyAgZGJ1c19ib29sX3Qgc3VjY2VzcyA9IEZBTFNFOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAodW5pcXVlX25hbWUgIT0gTlVMTCwgRkFMU0UpOworCisgIF9EQlVTX0xPQ0sgKGJ1c19kYXRhcyk7CisgIAorICBiZCA9IGVuc3VyZV9idXNfZGF0YSAoY29ubmVjdGlvbik7CisgIGlmIChiZCA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworCisgIF9kYnVzX2Fzc2VydCAoYmQtPnVuaXF1ZV9uYW1lID09IE5VTEwpOworICAKKyAgYmQtPnVuaXF1ZV9uYW1lID0gX2RidXNfc3RyZHVwICh1bmlxdWVfbmFtZSk7CisgIHN1Y2Nlc3MgPSBiZC0+dW5pcXVlX25hbWUgIT0gTlVMTDsKKworb3V0OgorICBfREJVU19VTkxPQ0sgKGJ1c19kYXRhcyk7CisgIAorICByZXR1cm4gc3VjY2VzczsKK30KKworLyoqCisgKiBHZXRzIHRoZSB1bmlxdWUgbmFtZSBvZiB0aGUgY29ubmVjdGlvbiBhcyBhc3NpZ25lZCBieSB0aGUgbWVzc2FnZQorICogYnVzLiBPbmx5IHBvc3NpYmxlIGFmdGVyIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aAorICogdGhlIG1lc3NhZ2UgYnVzLiBBbGwgY29ubmVjdGlvbnMgcmV0dXJuZWQgYnkgZGJ1c19idXNfZ2V0KCkgb3IKKyAqIGRidXNfYnVzX2dldF9wcml2YXRlKCkgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkLgorICoKKyAqIFRoZSBuYW1lIHJlbWFpbnMgdmFsaWQgdW50aWwgdGhlIGNvbm5lY3Rpb24gaXMgZnJlZWQsIGFuZAorICogc2hvdWxkIG5vdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICoKKyAqIE90aGVyIHRoYW4gZGJ1c19idXNfZ2V0KCksIHRoZXJlIGFyZSB0d28gd2F5cyB0byBzZXQgdGhlIHVuaXF1ZQorICogbmFtZTsgb25lIGlzIGRidXNfYnVzX3JlZ2lzdGVyKCksIHRoZSBvdGhlciBpcworICogZGJ1c19idXNfc2V0X3VuaXF1ZV9uYW1lKCkuICBZb3UgYXJlIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nCisgKiBkYnVzX2J1c19zZXRfdW5pcXVlX25hbWUoKSBpZiB5b3UgcmVnaXN0ZXIgYnkgaGFuZCBpbnN0ZWFkIG9mIHVzaW5nCisgKiBkYnVzX2J1c19yZWdpc3RlcigpLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHJldHVybnMgdGhlIHVuaXF1ZSBuYW1lIG9yICNOVUxMIG9uIGVycm9yCisgKi8KK2NvbnN0IGNoYXIqCitkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBCdXNEYXRhICpiZDsKKyAgY29uc3QgY2hhciAqdW5pcXVlX25hbWUgPSBOVUxMOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBOVUxMKTsKKworICBfREJVU19MT0NLIChidXNfZGF0YXMpOworICAKKyAgYmQgPSBlbnN1cmVfYnVzX2RhdGEgKGNvbm5lY3Rpb24pOworICBpZiAoYmQgPT0gTlVMTCkKKyAgICBnb3RvIG91dDsKKworICB1bmlxdWVfbmFtZSA9IGJkLT51bmlxdWVfbmFtZTsKKworb3V0OgorICBfREJVU19VTkxPQ0sgKGJ1c19kYXRhcyk7CisKKyAgcmV0dXJuIHVuaXF1ZV9uYW1lOworfQorCisvKioKKyAqIEFza3MgdGhlIGJ1cyB0byByZXR1cm4gdGhlIFVJRCB0aGUgbmFtZWQgY29ubmVjdGlvbiBhdXRoZW50aWNhdGVkCisgKiBhcywgaWYgYW55LiAgT25seSB3b3JrcyBvbiBVTklYOyBvbmx5IHdvcmtzIGZvciBjb25uZWN0aW9ucyBvbiB0aGUKKyAqIHNhbWUgbWFjaGluZSBhcyB0aGUgYnVzLiBJZiB5b3UgYXJlIG5vdCBvbiB0aGUgc2FtZSBtYWNoaW5lIGFzIHRoZQorICogYnVzLCB0aGVuIGNhbGxpbmcgdGhpcyBpcyBwcm9iYWJseSBhIGJhZCBpZGVhLCBzaW5jZSB0aGUgVUlEIHdpbGwKKyAqIG1lYW4gbGl0dGxlIHRvIHlvdXIgYXBwbGljYXRpb24uCisgKgorICogRm9yIHRoZSBzeXN0ZW0gbWVzc2FnZSBidXMgeW91J3JlIGd1YXJhbnRlZWQgdG8gYmUgb24gdGhlIHNhbWUKKyAqIG1hY2hpbmUgc2luY2UgaXQgb25seSBsaXN0ZW5zIG9uIGEgVU5JWCBkb21haW4gc29ja2V0IChhdCBsZWFzdCwKKyAqIGFzIHNoaXBwZWQgYnkgZGVmYXVsdCkuCisgKgorICogVGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzIGZvciBjb25uZWN0aW9ucyB0aGF0IGF1dGhlbnRpY2F0ZWQgYXMKKyAqIGEgVU5JWCB1c2VyLCByaWdodCBub3cgdGhhdCBpbmNsdWRlcyBhbGwgYnVzIGNvbm5lY3Rpb25zLCBidXQKKyAqIGl0J3MgdmVyeSBwb3NzaWJsZSB0byBoYXZlIGNvbm5lY3Rpb25zIHdpdGggbm8gYXNzb2NpYXRlZCBVSUQuCisgKiBTbyBjaGVjayBmb3IgZXJyb3JzIGFuZCBkbyBzb21ldGhpbmcgc2Vuc2libGUgaWYgdGhleSBoYXBwZW4uCisgKiAKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHdheXMgcmV0dXJuIGFuIGVycm9yIG9uIFdpbmRvd3MuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gbmFtZSBhIG5hbWUgb3duZWQgYnkgdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSB0aGUgZXJyb3IKKyAqIEByZXR1cm5zIHRoZSB1bml4IHVzZXIgaWQsIG9yICgodW5zaWduZWQpLTEpIGlmIGVycm9yIGlzIHNldAorICovIAordW5zaWduZWQgbG9uZworZGJ1c19idXNfZ2V0X3VuaXhfdXNlciAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UsICpyZXBseTsKKyAgZGJ1c191aW50MzJfdCB1aWQ7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIERCVVNfVUlEX1VOU0VUKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChuYW1lICE9IE5VTEwsIERCVVNfVUlEX1VOU0VUKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19jaGVja19pc192YWxpZF9idXNfbmFtZSAobmFtZSksIERCVVNfVUlEX1VOU0VUKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9lcnJvcl9pc19zZXQgKGVycm9yLCBEQlVTX1VJRF9VTlNFVCk7CisgIAorICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2V0Q29ubmVjdGlvblVuaXhVc2VyIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gREJVU19VSURfVU5TRVQ7CisgICAgfQorIAorICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKwkJCQkgREJVU19UWVBFX1NUUklORywgJm5hbWUsCisJCQkJIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIERCVVNfVUlEX1VOU0VUOworICAgIH0KKyAgCisgIHJlcGx5ID0gZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2sgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgIAorICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgcmV0dXJuIERCVVNfVUlEX1VOU0VUOworICAgIH0gIAorCisgIGlmIChkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgKGVycm9yLCByZXBseSkpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXR1cm4gREJVU19VSURfVU5TRVQ7CisgICAgfQorICAKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKHJlcGx5LCBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXR1cm4gREJVU19VSURfVU5TRVQ7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAKKyAgcmV0dXJuICh1bnNpZ25lZCBsb25nKSB1aWQ7Cit9CisKKy8qKgorICogQXNrcyB0aGUgYnVzIHRvIHJldHVybiBpdHMgZ2xvYmFsbHkgdW5pcXVlIElELCBhcyBkZXNjcmliZWQgaW4gdGhlCisgKiBELUJ1cyBzcGVjaWZpY2F0aW9uLiBGb3IgdGhlIHNlc3Npb24gYnVzLCB0aGlzIGlzIHVzZWZ1bCBhcyBhIHdheQorICogdG8gdW5pcXVlbHkgaWRlbnRpZnkgZWFjaCB1c2VyIHNlc3Npb24uIEZvciB0aGUgc3lzdGVtIGJ1cywKKyAqIHByb2JhYmx5IHRoZSBidXMgSUQgaXMgbm90IHVzZWZ1bDsgaW5zdGVhZCwgdXNlIHRoZSBtYWNoaW5lIElECisgKiBzaW5jZSBpdCdzIGFjY2Vzc2libGUgd2l0aG91dCBuZWNlc3NhcmlseSBjb25uZWN0aW5nIHRvIHRoZSBidXMgYW5kCisgKiBtYXkgYmUgcGVyc2lzdGVudCBiZXlvbmQgYSBzaW5nbGUgYnVzIGluc3RhbmNlIChhY3Jvc3MgcmVib290cyBmb3IKKyAqIGV4YW1wbGUpLiBTZWUgZGJ1c19nZXRfbG9jYWxfbWFjaGluZV9pZCgpLgorICoKKyAqIEluIGFkZGl0aW9uIHRvIGFuIElEIGZvciBlYWNoIGJ1cyBhbmQgYW4gSUQgZm9yIGVhY2ggbWFjaGluZSwgdGhlcmUgaXMKKyAqIGFuIElEIGZvciBlYWNoIGFkZHJlc3MgdGhhdCB0aGUgYnVzIGlzIGxpc3RlbmluZyBvbjsgdGhhdCBjYW4KKyAqIGJlIHJldHJpZXZlZCB3aXRoIGRidXNfY29ubmVjdGlvbl9nZXRfc2VydmVyX2lkKCksIHRob3VnaCBpdCBpcworICogcHJvYmFibHkgbm90IHZlcnkgdXNlZnVsLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBlcnJvcgorICogQHJldHVybnMgdGhlIGJ1cyBJRCBvciAjTlVMTCBpZiBlcnJvciBpcyBzZXQKKyAqLyAKK2NoYXIqCitkYnVzX2J1c19nZXRfaWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlLCAqcmVwbHk7CisgIGNoYXIgKmlkOworICBjb25zdCBjaGFyICp2X1NUUklORzsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZXJyb3JfaXNfc2V0IChlcnJvciwgTlVMTCk7CisgIAorICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2V0SWQiKTsKKyAgCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgcmVwbHkgPSBkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jayAoY29ubmVjdGlvbiwgbWVzc2FnZSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKyAgCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIAorICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9ICAKKworICBpZiAoZGJ1c19zZXRfZXJyb3JfZnJvbV9tZXNzYWdlIChlcnJvciwgcmVwbHkpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHZfU1RSSU5HID0gTlVMTDsKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKHJlcGx5LCBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZ2X1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZCA9IF9kYnVzX3N0cmR1cCAodl9TVFJJTkcpOyAvKiBtYXkgYmUgTlVMTCAqLworICAKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisKKyAgaWYgKGlkID09IE5VTEwpCisgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworCisgIC8qIEZJWE1FIGl0IG1pZ2h0IGJlIG5pY2UgdG8gY2FjaGUgdGhlIElEIGxvY2FsbHkgKi8KKyAgCisgIHJldHVybiBpZDsKK30KKworLyoqCisgKiBBc2tzIHRoZSBidXMgdG8gYXNzaWduIHRoZSBnaXZlbiBuYW1lIHRvIHRoaXMgY29ubmVjdGlvbiBieSBpbnZva2luZworICogdGhlIFJlcXVlc3ROYW1lIG1ldGhvZCBvbiB0aGUgYnVzLiBUaGlzIG1ldGhvZCBpcyBmdWxseSBkb2N1bWVudGVkCisgKiBpbiB0aGUgRC1CdXMgc3BlY2lmaWNhdGlvbi4gRm9yIHF1aWNrIHJlZmVyZW5jZSwgdGhlIGZsYWdzIGFuZAorICogcmVzdWx0IGNvZGVzIGFyZSBkaXNjdXNzZWQgaGVyZSwgYnV0IHRoZSBzcGVjaWZpY2F0aW9uIGlzIHRoZQorICogY2Fub25pY2FsIHZlcnNpb24gb2YgdGhpcyBpbmZvcm1hdGlvbi4KKyAqCisgKiBGaXJzdCB5b3Ugc2hvdWxkIGtub3cgdGhhdCBmb3IgZWFjaCBidXMgbmFtZSwgdGhlIGJ1cyBzdG9yZXMKKyAqIGEgcXVldWUgb2YgY29ubmVjdGlvbnMgdGhhdCB3b3VsZCBsaWtlIHRvIG93biBpdC4gT25seQorICogb25lIG93bnMgaXQgYXQgYSB0aW1lIC0gY2FsbGVkIHRoZSBwcmltYXJ5IG93bmVyLiBJZiB0aGUgcHJpbWFyeQorICogb3duZXIgcmVsZWFzZXMgdGhlIG5hbWUgb3IgZGlzY29ubmVjdHMsIHRoZW4gdGhlIG5leHQgb3duZXIgaW4gdGhlCisgKiBxdWV1ZSBhdG9taWNhbGx5IHRha2VzIG92ZXIuCisgKgorICogU28gZm9yIGV4YW1wbGUgaWYgeW91IGhhdmUgYW4gYXBwbGljYXRpb24gb3JnLmZyZWVkZXNrdG9wLlRleHRFZGl0b3IKKyAqIGFuZCBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgaXQgY2FuIGJlIHJ1biwgeW91IGNhbiBoYXZlIGFsbCBvZiB0aGVtCisgKiBzaXR0aW5nIGluIHRoZSBxdWV1ZS4gVGhlIGZpcnN0IG9uZSB0byBzdGFydCB1cCB3aWxsIHJlY2VpdmUgbWVzc2FnZXMKKyAqIHNlbnQgdG8gb3JnLmZyZWVkZXNrdG9wLlRleHRFZGl0b3IsIGJ1dCBpZiB0aGF0IG9uZSBleGl0cyBhbm90aGVyCisgKiB3aWxsIGJlY29tZSB0aGUgcHJpbWFyeSBvd25lciBhbmQgcmVjZWl2ZSBtZXNzYWdlcy4KKyAqCisgKiBUaGUgcXVldWUgbWVhbnMgeW91IGRvbid0IG5lZWQgdG8gbWFudWFsbHkgd2F0Y2ggZm9yIHRoZSBjdXJyZW50IG93bmVyIHRvCisgKiBkaXNhcHBlYXIgYW5kIHRoZW4gcmVxdWVzdCB0aGUgbmFtZSBhZ2Fpbi4KKyAqCisgKiBXaGVuIHJlcXVlc3RpbmcgYSBuYW1lLCB5b3UgY2FuIHNwZWNpZnkgc2V2ZXJhbCBmbGFncy4KKyAqIAorICogI0RCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UIGFuZCAjREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFCisgKiBhcmUgcHJvcGVydGllcyBzdG9yZWQgYnkgdGhlIGJ1cyBmb3IgdGhpcyBjb25uZWN0aW9uIHdpdGggcmVzcGVjdCB0bworICogZWFjaCByZXF1ZXN0ZWQgYnVzIG5hbWUuIFRoZXNlIHByb3BlcnRpZXMgYXJlIHN0b3JlZCBldmVuIGlmIHRoZQorICogY29ubmVjdGlvbiBpcyBxdWV1ZWQgYW5kIGRvZXMgbm90IGJlY29tZSB0aGUgcHJpbWFyeSBvd25lci4KKyAqIFlvdSBjYW4gdXBkYXRlIHRoZXNlIGZsYWdzIGJ5IGNhbGxpbmcgUmVxdWVzdE5hbWUgYWdhaW4gKGV2ZW4gaWYKKyAqIHlvdSBhbHJlYWR5IG93biB0aGUgbmFtZSkuCisgKgorICogI0RCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UIG1lYW5zIHRoYXQgYW5vdGhlciByZXF1ZXN0b3Igb2YgdGhlCisgKiBuYW1lIGNhbiB0YWtlIGl0IGF3YXkgZnJvbSB5b3UgYnkgc3BlY2lmeWluZyAjREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORy4KKyAqCisgKiAjREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFIG1lYW5zIHRoYXQgaWYgeW91IGFyZW4ndCB0aGUgcHJpbWFyeSBvd25lciwKKyAqIHlvdSBkb24ndCB3YW50IHRvIGJlIHF1ZXVlZCB1cCAtIHlvdSBvbmx5IGNhcmUgYWJvdXQgYmVpbmcgdGhlCisgKiBwcmltYXJ5IG93bmVyLgorICoKKyAqIFVubGlrZSB0aGUgb3RoZXIgdHdvIGZsYWdzLCAjREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORyBpcyBhIHByb3BlcnR5CisgKiBvZiB0aGUgaW5kaXZpZHVhbCBSZXF1ZXN0TmFtZSBjYWxsLCBpLmUuIHRoZSBidXMgZG9lcyBub3QgcGVyc2lzdGVudGx5CisgKiBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgY29ubmVjdGlvbi1uYW1lIHBhaXIuIElmIGEgUmVxdWVzdE5hbWUgY2FsbCBpbmNsdWRlcworICogdGhlICNEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HIGZsYWcsIGFuZCB0aGUgY3VycmVudCBwcmltYXJ5CisgKiBvd25lciBoYXMgI0RCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UIHNldCwgdGhlbiB0aGUgY3VycmVudCBwcmltYXJ5CisgKiBvd25lciB3aWxsIGJlIGtpY2tlZCBvZmYuCisgKgorICogSWYgbm8gZmxhZ3MgYXJlIGdpdmVuLCBhbiBhcHBsaWNhdGlvbiB3aWxsIHJlY2VpdmUgdGhlIHJlcXVlc3RlZAorICogbmFtZSBvbmx5IGlmIHRoZSBuYW1lIGlzIGN1cnJlbnRseSB1bm93bmVkOyBhbmQgaXQgd2lsbCBOT1QgZ2l2ZQorICogdXAgdGhlIG5hbWUgaWYgYW5vdGhlciBhcHBsaWNhdGlvbiBhc2tzIHRvIHRha2UgaXQgb3ZlciB1c2luZworICogI0RCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcuCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcmVzdWx0IGNvZGUuIFRoZSBwb3NzaWJsZSByZXN1bHQgY29kZXMKKyAqIGFyZSBhcyBmb2xsb3dzLgorICogCisgKiAjREJVU19SRVFVRVNUX05BTUVfUkVQTFlfUFJJTUFSWV9PV05FUiBtZWFucyB0aGF0IHRoZSBuYW1lIGhhZCBubworICogZXhpc3Rpbmcgb3duZXIsIGFuZCB0aGUgY2FsbGVyIGlzIG5vdyB0aGUgcHJpbWFyeSBvd25lcjsgb3IgdGhhdAorICogdGhlIG5hbWUgaGFkIGFuIG93bmVyLCBhbmQgdGhlIGNhbGxlciBzcGVjaWZpZWQKKyAqICNEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HLCBhbmQgdGhlIGN1cnJlbnQgb3duZXIKKyAqIHNwZWNpZmllZCAjREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQuCisgKgorICogI0RCVVNfUkVRVUVTVF9OQU1FX1JFUExZX0lOX1FVRVVFIGhhcHBlbnMgb25seSBpZiB0aGUgY2FsbGVyIGRvZXMgTk9UCisgKiBzcGVjaWZ5ICNEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUgYW5kIGVpdGhlciB0aGUgY3VycmVudCBvd25lcgorICogZGlkIE5PVCBzcGVjaWZ5ICNEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVCBvciB0aGUgY2FsbGVyIGRpZCBOT1QKKyAqIHNwZWNpZnkgI0RCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcuIEluIHRoaXMgY2FzZSB0aGUgY2FsbGVyIGVuZHMgdXAgCisgKiBpbiBhIHF1ZXVlIHRvIG93biB0aGUgbmFtZSBhZnRlciB0aGUgY3VycmVudCBvd25lciBnaXZlcyBpdCB1cC4KKyAqCisgKiAjREJVU19SRVFVRVNUX05BTUVfUkVQTFlfRVhJU1RTIGhhcHBlbnMgaWYgdGhlIG5hbWUgaGFzIGFuIG93bmVyCisgKiBhbHJlYWR5IGFuZCB0aGUgY2FsbGVyIHNwZWNpZmllcyAjREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFCisgKiBhbmQgZWl0aGVyIHRoZSBjdXJyZW50IG93bmVyIGhhcyBOT1Qgc3BlY2lmaWVkIAorICogI0RCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UIG9yIHRoZSBjYWxsZXIgZGlkIE5PVCBzcGVjaWZ5IAorICogI0RCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcuCisgKgorICogI0RCVVNfUkVRVUVTVF9OQU1FX1JFUExZX0FMUkVBRFlfT1dORVIgaGFwcGVucyBpZiBhbiBhcHBsaWNhdGlvbgorICogcmVxdWVzdHMgYSBuYW1lIGl0IGFscmVhZHkgb3ducy4gKFJlLXJlcXVlc3RpbmcgYSBuYW1lIGlzIHVzZWZ1bCBpZgorICogeW91IHdhbnQgdG8gY2hhbmdlIHRoZSAjREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgb3IKKyAqICNEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUgc2V0dGluZ3MuKQorICoKKyAqIFdoZW4gYSBzZXJ2aWNlIHJlcHJlc2VudHMgYW4gYXBwbGljYXRpb24sIHNheSAidGV4dCBlZGl0b3IsIiB0aGVuCisgKiBpdCBzaG91bGQgc3BlY2lmeSAjREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgaWYgaXQgd2FudHMKKyAqIHRoZSBsYXN0IGVkaXRvciBzdGFydGVkIHRvIGJlIHRoZSB1c2VyJ3MgZWRpdG9yIHZzLiB0aGUgZmlyc3Qgb25lCisgKiBzdGFydGVkLiAgVGhlbiBhbnkgZWRpdG9yIHRoYXQgY2FuIGJlIHRoZSB1c2VyJ3MgZWRpdG9yIHNob3VsZAorICogc3BlY2lmeSAjREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORyB0byBlaXRoZXIgdGFrZSBvdmVyCisgKiAobGFzdC1zdGFydGVkLXdpbnMpIG9yIGJlIHF1ZXVlZCB1cCAoZmlyc3Qtc3RhcnRlZC13aW5zKSBhY2NvcmRpbmcKKyAqIHRvIHdoZXRoZXIgI0RCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UIHdhcyBnaXZlbi4KKyAqCisgKiBDb252ZW50aW9uYWxseSwgc2luZ2xlLWluc3RhbmNlIGFwcGxpY2F0aW9ucyBvZnRlbiBvZmZlciBhIGNvbW1hbmQKKyAqIGxpbmUgb3B0aW9uIGNhbGxlZCAtLXJlcGxhY2Ugd2hpY2ggbWVhbnMgdG8gcmVwbGFjZSB0aGUgY3VycmVudAorICogaW5zdGFuY2UuICBUbyBpbXBsZW1lbnQgdGhpcywgYWx3YXlzIHNldAorICogI0RCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UIHdoZW4geW91IHJlcXVlc3QgeW91cgorICogYXBwbGljYXRpb24ncyBidXMgbmFtZS4gIFdoZW4geW91IGxvc2Ugb3duZXJzaGlwIG9mIHlvdXIgYnVzIG5hbWUsCisgKiB5b3UgbmVlZCB0byBleGl0LiAgTG9vayBmb3IgdGhlIHNpZ25hbCAiTmFtZUxvc3QiIGZyb20KKyAqICNEQlVTX1NFUlZJQ0VfREJVUyBhbmQgI0RCVVNfSU5URVJGQUNFX0RCVVMgKHRoZSBzaWduYWwncyBmaXJzdAorICogYXJndW1lbnQgaXMgdGhlIGJ1cyBuYW1lIHRoYXQgd2FzIGxvc3QpLiAgSWYgc3RhcnRpbmcgdXAgd2l0aG91dAorICogLS1yZXBsYWNlLCBkbyBub3Qgc3BlY2lmeSAjREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORywgYW5kCisgKiBleGl0IGlmIHlvdSBmYWlsIHRvIGJlY29tZSB0aGUgYnVzIG5hbWUgb3duZXIuIElmIC0tcmVwbGFjZSBpcworICogZ2l2ZW4sIGFzayB0byByZXBsYWNlIHRoZSBvbGQgb3duZXIuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIHJlcXVlc3QKKyAqIEBwYXJhbSBmbGFncyBmbGFncworICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBlcnJvcgorICogQHJldHVybnMgYSByZXN1bHQgY29kZSwgLTEgaWYgZXJyb3IgaXMgc2V0CisgKi8gCitpbnQKK2RidXNfYnVzX3JlcXVlc3RfbmFtZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UsICpyZXBseTsKKyAgZGJ1c191aW50MzJfdCByZXN1bHQ7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIDApOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG5hbWUgIT0gTlVMTCwgMCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfY2hlY2tfaXNfdmFsaWRfYnVzX25hbWUgKG5hbWUpLCAwKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9lcnJvcl9pc19zZXQgKGVycm9yLCAwKTsKKyAgCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXF1ZXN0TmFtZSIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisJCQkJIERCVVNfVFlQRV9TVFJJTkcsICZuYW1lLAorCQkJCSBEQlVTX1RZUEVfVUlOVDMyLCAmZmxhZ3MsCisJCQkJIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgCisgIHJlcGx5ID0gZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2sgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgIAorICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgcmV0dXJuIC0xOworICAgIH0gIAorCisgIGlmIChkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgKGVycm9yLCByZXBseSkpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKHJlcGx5LCBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKioKKyAqIEFza3MgdGhlIGJ1cyB0byB1bmFzc2lnbiB0aGUgZ2l2ZW4gbmFtZSBmcm9tIHRoaXMgY29ubmVjdGlvbiBieQorICogaW52b2tpbmcgdGhlIFJlbGVhc2VOYW1lIG1ldGhvZCBvbiB0aGUgYnVzLiBUaGUgIlJlbGVhc2VOYW1lIgorICogbWV0aG9kIGlzIGNhbm9uaWNhbGx5IGRvY3VtZW50ZWQgaW4gdGhlIEQtQnVzIHNwZWNpZmljYXRpb24uCisgKgorICogUG9zc2libGUgcmVzdWx0cyBhcmU6ICNEQlVTX1JFTEVBU0VfTkFNRV9SRVBMWV9SRUxFQVNFRAorICogd2hpY2ggbWVhbnMgeW91IG93bmVkIHRoZSBuYW1lIG9yIHdlcmUgaW4gdGhlIHF1ZXVlIHRvIG93biBpdCwKKyAqIGFuZCBhbmQgbm93IHlvdSBkb24ndCBvd24gaXQgYW5kIGFyZW4ndCBpbiB0aGUgcXVldWUuCisgKiAjREJVU19SRUxFQVNFX05BTUVfUkVQTFlfTk9UX09XTkVSIHdoaWNoIG1lYW5zIHNvbWVvbmUgZWxzZQorICogb3ducyB0aGUgbmFtZSBzbyB5b3UgY2FuJ3QgcmVsZWFzZSBpdC4KKyAqICNEQlVTX1JFTEVBU0VfTkFNRV9SRVBMWV9OT05fRVhJU1RFTlQKKyAqIHdoaWNoIG1lYW5zIG5vYm9keSBvd25lZCB0aGUgbmFtZS4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIHJlbW92ZSAKKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSB0aGUgZXJyb3IKKyAqIEByZXR1cm5zIGEgcmVzdWx0IGNvZGUsIC0xIGlmIGVycm9yIGlzIHNldAorICovIAoraW50CitkYnVzX2J1c19yZWxlYXNlX25hbWUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZSwgKnJlcGx5OworICBkYnVzX3VpbnQzMl90IHJlc3VsdDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgMCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobmFtZSAhPSBOVUxMLCAwKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19jaGVja19pc192YWxpZF9idXNfbmFtZSAobmFtZSksIDApOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2Vycm9yX2lzX3NldCAoZXJyb3IsIDApOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWxlYXNlTmFtZSIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJlcGx5ID0gZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2sgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGlmIChkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgKGVycm9yLCByZXBseSkpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChyZXBseSwgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEFza3MgdGhlIGJ1cyB3aGV0aGVyIGEgY2VydGFpbiBuYW1lIGhhcyBhbiBvd25lci4KKyAqCisgKiBVc2luZyB0aGlzIGNhbiBlYXNpbHkgcmVzdWx0IGluIGEgcmFjZSBjb25kaXRpb24sCisgKiBzaW5jZSBhbiBvd25lciBjYW4gYXBwZWFyIG9yIGRpc2FwcGVhciBhZnRlciB5b3UKKyAqIGNhbGwgdGhpcy4KKyAqCisgKiBJZiB5b3Ugd2FudCB0byByZXF1ZXN0IGEgbmFtZSwganVzdCByZXF1ZXN0IGl0OworICogaWYgeW91IHdhbnQgdG8gYXZvaWQgcmVwbGFjaW5nIGEgY3VycmVudCBvd25lciwKKyAqIGRvbid0IHNwZWNpZnkgI0RCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcgYW5kCisgKiB5b3Ugd2lsbCBnZXQgYW4gZXJyb3IgaWYgdGhlcmUncyBhbHJlYWR5IGFuIG93bmVyLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIG5hbWUgdGhlIG5hbWUKKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSBhbnkgZXJyb3JzCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgbmFtZSBleGlzdHMsICNGQUxTRSBpZiBub3Qgb3Igb24gZXJyb3IKKyAqLworZGJ1c19ib29sX3QKK2RidXNfYnVzX25hbWVfaGFzX293bmVyIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCSBjb25zdCBjaGFyICAgICAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlLCAqcmVwbHk7CisgIGRidXNfYm9vbF90IGV4aXN0czsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG5hbWUgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2J1c19uYW1lIChuYW1lKSwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2Vycm9yX2lzX3NldCAoZXJyb3IsIEZBTFNFKTsKKyAgCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lSGFzT3duZXIiKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisJCQkJIERCVVNfVFlQRV9TVFJJTkcsICZuYW1lLAorCQkJCSBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICByZXBseSA9IGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrIChjb25uZWN0aW9uLCBtZXNzYWdlLCAtMSwgZXJyb3IpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKHJlcGx5LCBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9CT09MRUFOLCAmZXhpc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICByZXR1cm4gZXhpc3RzOworfQorCisvKioKKyAqIFN0YXJ0cyBhIHNlcnZpY2UgdGhhdCB3aWxsIHJlcXVlc3Qgb3duZXJzaGlwIG9mIHRoZSBnaXZlbiBuYW1lLgorICogVGhlIHJldHVybmVkIHJlc3VsdCB3aWxsIGJlIG9uZSBvZiBiZSBvbmUgb2YKKyAqICNEQlVTX1NUQVJUX1JFUExZX1NVQ0NFU1Mgb3IgI0RCVVNfU1RBUlRfUkVQTFlfQUxSRUFEWV9SVU5OSU5HIGlmCisgKiBzdWNjZXNzZnVsLiAgUGFzcyAjTlVMTCBpZiB5b3UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgcmVzdWx0LgorICogCisgKiBUaGUgZmxhZ3MgcGFyYW1ldGVyIGlzIGZvciBmdXR1cmUgZXhwYW5zaW9uLCBjdXJyZW50bHkgeW91IHNob3VsZAorICogc3BlY2lmeSAwLgorICoKKyAqIEl0J3Mgb2Z0ZW4gZWFzaWVyIHRvIGF2b2lkIGV4cGxpY2l0bHkgc3RhcnRpbmcgc2VydmljZXMsIGFuZAorICoganVzdCBzZW5kIGEgbWV0aG9kIGNhbGwgdG8gdGhlIHNlcnZpY2UncyBidXMgbmFtZSBpbnN0ZWFkLgorICogTWV0aG9kIGNhbGxzIHN0YXJ0IGEgc2VydmljZSB0byBoYW5kbGUgdGhlbSBieSBkZWZhdWx0CisgKiB1bmxlc3MgeW91IGNhbGwgZGJ1c19tZXNzYWdlX3NldF9hdXRvX3N0YXJ0KCkgdG8gZGlzYWJsZSB0aGlzCisgKiBiZWhhdmlvci4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHdlIHdhbnQgdGhlIG5ldyBzZXJ2aWNlIHRvIHJlcXVlc3QKKyAqIEBwYXJhbSBmbGFncyB0aGUgZmxhZ3MgKHNob3VsZCBhbHdheXMgYmUgMCBmb3Igbm93KQorICogQHBhcmFtIHJlc3VsdCBhIHBsYWNlIHRvIHN0b3JlIHRoZSByZXN1bHQgb3IgI05VTEwKKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSBhbnkgZXJyb3JzCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgYWN0aXZhdGlvbiBzdWNjZWVkZWQsICNGQUxTRSBpZiBub3QKKyAqLworZGJ1c19ib29sX3QKK2RidXNfYnVzX3N0YXJ0X3NlcnZpY2VfYnlfbmFtZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICpyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKm1zZzsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfY2hlY2tfaXNfdmFsaWRfYnVzX25hbWUgKG5hbWUpLCBGQUxTRSk7CisgIAorICBtc2cgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdGFydFNlcnZpY2VCeU5hbWUiKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobXNnLCBEQlVTX1RZUEVfU1RSSU5HLCAmbmFtZSwKKwkJCSAgCSBEQlVTX1RZUEVfVUlOVDMyLCAmZmxhZ3MsIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1zZyk7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJlcGx5ID0gZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2sgKGNvbm5lY3Rpb24sIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIGVycm9yKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtc2cpOworCisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAoZXJyb3IsIHJlcGx5KSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKHJlc3VsdCAhPSBOVUxMICYmCisgICAgICAhZGJ1c19tZXNzYWdlX2dldF9hcmdzIChyZXBseSwgZXJyb3IsIERCVVNfVFlQRV9VSU5UMzIsCisJICAgICAgCQkgICAgICByZXN1bHQsIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitzZW5kX25vX3JldHVybl92YWx1ZXMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIGlmIChlcnJvcikKKyAgICB7CisgICAgICAvKiBCbG9jayB0byBjaGVjayBzdWNjZXNzIGNvZGVwYXRoICovCisgICAgICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgICAgICAKKyAgICAgIHJlcGx5ID0gZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2sgKGNvbm5lY3Rpb24sIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCBlcnJvcik7CisgICAgICAKKyAgICAgIGlmIChyZXBseSA9PSBOVUxMKQorICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBlbHNlCisgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFNpbGVudGx5LWZhaWwgbm9uYmxvY2tpbmcgY29kZXBhdGggKi8KKyAgICAgIGRidXNfbWVzc2FnZV9zZXRfbm9fcmVwbHkgKG1zZywgVFJVRSk7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbXNnLCBOVUxMKTsKKyAgICB9Cit9CisKKy8qKgorICogQWRkcyBhIG1hdGNoIHJ1bGUgdG8gbWF0Y2ggbWVzc2FnZXMgZ29pbmcgdGhyb3VnaCB0aGUgbWVzc2FnZSBidXMuCisgKiBUaGUgInJ1bGUiIGFyZ3VtZW50IGlzIHRoZSBzdHJpbmcgZm9ybSBvZiBhIG1hdGNoIHJ1bGUuCisgKgorICogSWYgeW91IHBhc3MgI05VTEwgZm9yIHRoZSBlcnJvciwgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdAorICogYmxvY2s7IHRoZSBtYXRjaCB0aHVzIHdvbid0IGJlIGFkZGVkIHVudGlsIHlvdSBmbHVzaCB0aGUKKyAqIGNvbm5lY3Rpb24sIGFuZCBpZiB0aGVyZSdzIGFuIGVycm9yIGFkZGluZyB0aGUgbWF0Y2gKKyAqIHlvdSB3b24ndCBmaW5kIG91dCBhYm91dCBpdC4gVGhpcyBpcyBnZW5lcmFsbHkgYWNjZXB0YWJsZSwgc2luY2UgdGhlCisgKiBwb3NzaWJsZSBlcnJvcnMgKGluY2x1ZGluZyBhIGxhY2sgb2YgcmVzb3VyY2VzIGluIHRoZSBidXMsIHRoZSBjb25uZWN0aW9uCisgKiBoYXZpbmcgZXhjZWVkZWQgaXRzIHF1b3RhIG9mIGFjdGl2ZSBtYXRjaCBydWxlcywgb3IgdGhlIG1hdGNoIHJ1bGUgYmVpbmcKKyAqIHVucGFyc2VhYmxlKSBhcmUgZ2VuZXJhbGx5IHVucmVjb3ZlcmFibGUuCisgKgorICogSWYgeW91IHBhc3Mgbm9uLSNOVUxMIGZvciB0aGUgZXJyb3IgdGhpcyBmdW5jdGlvbiB3aWxsCisgKiBibG9jayB1bnRpbCBpdCBnZXRzIGEgcmVwbHkuIFRoaXMgbWF5IGJlIHVzZWZ1bCB3aGVuIHVzaW5nIG1hdGNoIHJ1bGUga2V5cworICogaW50cm9kdWNlZCBpbiByZWNlbnQgdmVyc2lvbnMgb2YgRC1CdXMsIGxpa2UgJ2FyZzBuYW1lc3BhY2UnLCB0byBhbGxvdyB0aGUKKyAqIGFwcGxpY2F0aW9uIHRvIGZhbGwgYmFjayB0byBsZXNzIGVmZmljaWVudCBtYXRjaCBydWxlcyBzdXBwb3J0ZWQgYnkgb2xkZXIKKyAqIHZlcnNpb25zIG9mIHRoZSBkYWVtb24gaWYgdGhlIHJ1bm5pbmcgdmVyc2lvbiBpcyBub3QgbmV3IGVub3VnaDsgb3Igd2hlbgorICogdXNpbmcgdXNlci1zdXBwbGllZCBydWxlcyByYXRoZXIgdGhhbiBydWxlcyBoYXJkLWNvZGVkIGF0IGNvbXBpbGUgdGltZS4KKyAqCisgKiBOb3JtYWwgQVBJIGNvbnZlbnRpb25zIHdvdWxkIGhhdmUgdGhlIGZ1bmN0aW9uIHJldHVybgorICogYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgZXJyb3Igd2FzIHNldCwKKyAqIGJ1dCB0aGF0IHdvdWxkIHJlcXVpcmUgYmxvY2tpbmcgYWx3YXlzIHRvIGRldGVybWluZQorICogdGhlIHJldHVybiB2YWx1ZS4KKyAqCisgKiBUaGUgQWRkTWF0Y2ggbWV0aG9kIGlzIGZ1bGx5IGRvY3VtZW50ZWQgaW4gdGhlIEQtQnVzIAorICogc3BlY2lmaWNhdGlvbi4gRm9yIHF1aWNrIHJlZmVyZW5jZSwgdGhlIGZvcm1hdCBvZiB0aGUgCisgKiBtYXRjaCBydWxlcyBpcyBkaXNjdXNzZWQgaGVyZSwgYnV0IHRoZSBzcGVjaWZpY2F0aW9uIAorICogaXMgdGhlIGNhbm9uaWNhbCB2ZXJzaW9uIG9mIHRoaXMgaW5mb3JtYXRpb24uCisgKgorICogUnVsZXMgYXJlIHNwZWNpZmllZCBhcyBhIHN0cmluZyBvZiBjb21tYSBzZXBhcmF0ZWQgCisgKiBrZXkvdmFsdWUgcGFpcnMuIEFuIGV4YW1wbGUgaXMgCisgKiAidHlwZT0nc2lnbmFsJyxzZW5kZXI9J29yZy5mcmVlZGVza3RvcC5EQnVzJywKKyAqIGludGVyZmFjZT0nb3JnLmZyZWVkZXNrdG9wLkRCdXMnLG1lbWJlcj0nRm9vJywKKyAqIHBhdGg9Jy9iYXIvZm9vJyxkZXN0aW5hdGlvbj0nOjQ1MjM0NS4zNCciCisgKgorICogUG9zc2libGUga2V5cyB5b3UgY2FuIG1hdGNoIG9uIGFyZSB0eXBlLCBzZW5kZXIsIAorICogaW50ZXJmYWNlLCBtZW1iZXIsIHBhdGgsIGRlc3RpbmF0aW9uIGFuZCBudW1iZXJlZAorICoga2V5cyB0byBtYXRjaCBtZXNzYWdlIGFyZ3MgKGtleXMgYXJlICdhcmcwJywgJ2FyZzEnLCBldGMuKS4KKyAqIE9taXR0aW5nIGEga2V5IGZyb20gdGhlIHJ1bGUgaW5kaWNhdGVzIAorICogYSB3aWxkY2FyZCBtYXRjaC4gIEZvciBpbnN0YW5jZSBvbWl0dGluZworICogdGhlIG1lbWJlciBmcm9tIGEgbWF0Y2ggcnVsZSBidXQgYWRkaW5nIGEgc2VuZGVyIHdvdWxkCisgKiBsZXQgYWxsIG1lc3NhZ2VzIGZyb20gdGhhdCBzZW5kZXIgdGhyb3VnaCByZWdhcmRsZXNzIG9mCisgKiB0aGUgbWVtYmVyLgorICoKKyAqIE1hdGNoZXMgYXJlIGluY2x1c2l2ZSBub3QgZXhjbHVzaXZlIHNvIGFzIGxvbmcgYXMgb25lIAorICogcnVsZSBtYXRjaGVzIHRoZSBtZXNzYWdlIHdpbGwgZ2V0IHRocm91Z2guICBJdCBpcyBpbXBvcnRhbnQKKyAqIHRvIG5vdGUgdGhpcyBiZWNhdXNlIGV2ZXJ5IHRpbWUgYSBtZXNzYWdlIGlzIHJlY2VpdmVkIHRoZSAKKyAqIGFwcGxpY2F0aW9uIHdpbGwgYmUgcGFnZWQgaW50byBtZW1vcnkgdG8gcHJvY2VzcyBpdC4gIFRoaXMKKyAqIGNhbiBjYXVzZSBwZXJmb3JtYW5jZSBwcm9ibGVtcyBzdWNoIGFzIGRyYWluaW5nIGJhdHRlcmllcworICogb24gZW1iZWRkZWQgcGxhdGZvcm1zLgorICoKKyAqIElmIHlvdSBtYXRjaCBtZXNzYWdlIGFyZ3MgKCdhcmcwJywgJ2FyZzEnLCBhbmQgc28gZm9ydGgpCisgKiBvbmx5IHN0cmluZyBhcmd1bWVudHMgd2lsbCBtYXRjaC4gVGhhdCBpcywgYXJnMD0nNScgbWVhbnMKKyAqIG1hdGNoIHRoZSBzdHJpbmcgIjUiIG5vdCB0aGUgaW50ZWdlciA1LgorICoKKyAqIEN1cnJlbnRseSB0aGVyZSBpcyBubyB3YXkgdG8gbWF0Y2ggYWdhaW5zdCBub24tc3RyaW5nIGFyZ3VtZW50cy4KKyAqCisgKiBBIHNwZWNpYWxpc2VkIGZvcm0gb2Ygd2lsZGNhcmQgbWF0Y2hpbmcgb24gYXJndW1lbnRzIGlzCisgKiBzdXBwb3J0ZWQgZm9yIHBhdGgtbGlrZSBuYW1lc3BhY2VzLiAgSWYgeW91ciBhcmd1bWVudCBtYXRjaCBoYXMKKyAqIGEgJ3BhdGgnIHN1ZmZpeCAoZWc6ICJhcmcwcGF0aD0nL3NvbWUvcGF0aC8nIikgdGhlbiBpdCBpcworICogY29uc2lkZXJlZCBhIG1hdGNoIGlmIHRoZSBhcmd1bWVudCBleGFjdGx5IG1hdGNoZXMgdGhlIGdpdmVuCisgKiBzdHJpbmcgb3IgaWYgb25lIG9mIHRoZW0gZW5kcyBpbiBhICcvJyBhbmQgaXMgYSBwcmVmaXggb2YgdGhlCisgKiBvdGhlci4KKyAqCisgKiBNYXRjaGluZyBvbiBpbnRlcmZhY2UgaXMgdHJpY2t5IGJlY2F1c2UgbWV0aG9kIGNhbGwKKyAqIG1lc3NhZ2VzIG9ubHkgb3B0aW9uYWxseSBzcGVjaWZ5IHRoZSBpbnRlcmZhY2UuCisgKiBJZiBhIG1lc3NhZ2Ugb21pdHMgdGhlIGludGVyZmFjZSwgdGhlbiBpdCB3aWxsIE5PVCBtYXRjaAorICogaWYgdGhlIHJ1bGUgc3BlY2lmaWVzIGFuIGludGVyZmFjZSBuYW1lLiBUaGlzIG1lYW5zIG1hdGNoCisgKiBydWxlcyBvbiBtZXRob2QgY2FsbHMgc2hvdWxkIG5vdCB1c3VhbGx5IGdpdmUgYW4gaW50ZXJmYWNlLgorICoKKyAqIEhvd2V2ZXIsIHNpZ25hbCBtZXNzYWdlcyBhcmUgcmVxdWlyZWQgdG8gaW5jbHVkZSB0aGUgaW50ZXJmYWNlCisgKiBzbyB3aGVuIG1hdGNoaW5nIHNpZ25hbHMgdXN1YWxseSB5b3Ugc2hvdWxkIHNwZWNpZnkgdGhlIGludGVyZmFjZQorICogaW4gdGhlIG1hdGNoIHJ1bGUuCisgKiAKKyAqIEZvciBzZWN1cml0eSByZWFzb25zLCB5b3UgY2FuIG1hdGNoIGFyZ3VtZW50cyBvbmx5IHVwIHRvCisgKiAjREJVU19NQVhJTVVNX01BVENIX1JVTEVfQVJHX05VTUJFUi4KKyAqCisgKiBNYXRjaCBydWxlcyBoYXZlIGEgbWF4aW11bSBsZW5ndGggb2YgI0RCVVNfTUFYSU1VTV9NQVRDSF9SVUxFX0xFTkdUSAorICogYnl0ZXMuCisgKgorICogQm90aCBvZiB0aGVzZSBtYXhpbXVtcyBhcmUgbXVjaCBoaWdoZXIgdGhhbiB5b3UncmUgbGlrZWx5IHRvIG5lZWQsCisgKiB0aGV5IG9ubHkgZXhpc3QgYmVjYXVzZSB0aGUgRC1CdXMgYnVzIGRhZW1vbiBoYXMgZml4ZWQgbGltaXRzIG9uCisgKiBhbGwgcmVzb3VyY2UgdXNhZ2UuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gY29ubmVjdGlvbiB0byB0aGUgbWVzc2FnZSBidXMKKyAqIEBwYXJhbSBydWxlIHRleHR1YWwgZm9ybSBvZiBtYXRjaCBydWxlCisgKiBAcGFyYW0gZXJyb3IgbG9jYXRpb24gdG8gc3RvcmUgYW55IGVycm9ycworICovCit2b2lkCitkYnVzX2J1c19hZGRfbWF0Y2ggKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqbXNnOworCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChydWxlICE9IE5VTEwpOworCisgIG1zZyA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFkZE1hdGNoIik7CisKKyAgaWYgKG1zZyA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1zZywgREJVU19UWVBFX1NUUklORywgJnJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtc2cpOworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBzZW5kX25vX3JldHVybl92YWx1ZXMgKGNvbm5lY3Rpb24sIG1zZywgZXJyb3IpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobXNnKTsKK30KKworLyoqCisgKiBSZW1vdmVzIGEgcHJldmlvdXNseS1hZGRlZCBtYXRjaCBydWxlICJieSB2YWx1ZSIgKHRoZSBtb3N0CisgKiByZWNlbnRseS1hZGRlZCBpZGVudGljYWwgcnVsZSBnZXRzIHJlbW92ZWQpLiAgVGhlICJydWxlIiBhcmd1bWVudAorICogaXMgdGhlIHN0cmluZyBmb3JtIG9mIGEgbWF0Y2ggcnVsZS4KKyAqCisgKiBUaGUgYnVzIGNvbXBhcmVzIG1hdGNoIHJ1bGVzIHNlbWFudGljYWxseSwgbm90IHRleHR1YWxseSwgc28KKyAqIHdoaXRlc3BhY2UgYW5kIG9yZGVyaW5nIGRvbid0IGhhdmUgdG8gYmUgaWRlbnRpY2FsIHRvCisgKiB0aGUgcnVsZSB5b3UgcGFzc2VkIHRvIGRidXNfYnVzX2FkZF9tYXRjaCgpLgorICogCisgKiBJZiB5b3UgcGFzcyAjTlVMTCBmb3IgdGhlIGVycm9yLCB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90CisgKiBibG9jazsgb3RoZXJ3aXNlIGl0IHdpbGwuIFNlZSBkZXRhaWxlZCBleHBsYW5hdGlvbiBpbgorICogZG9jcyBmb3IgZGJ1c19idXNfYWRkX21hdGNoKCkuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIGNvbm5lY3Rpb24gdG8gdGhlIG1lc3NhZ2UgYnVzCisgKiBAcGFyYW0gcnVsZSB0ZXh0dWFsIGZvcm0gb2YgbWF0Y2ggcnVsZQorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIGFueSBlcnJvcnMKKyAqLwordm9pZAorZGJ1c19idXNfcmVtb3ZlX21hdGNoIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKm1zZzsKKworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAocnVsZSAhPSBOVUxMKTsKKyAgCisgIG1zZyA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlbW92ZU1hdGNoIik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1zZywgREJVU19UWVBFX1NUUklORywgJnJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtc2cpOworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBzZW5kX25vX3JldHVybl92YWx1ZXMgKGNvbm5lY3Rpb24sIG1zZywgZXJyb3IpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobXNnKTsKK30KKworLyoqIEB9ICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1idXMuaCBiL2RidXMvZGJ1cy9kYnVzLWJ1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYTk1NzEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1idXMuaApAQCAtMCwwICsxLDk1IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtYnVzLmggIENvbnZlbmllbmNlIGZ1bmN0aW9ucyBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBidXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmICFkZWZpbmVkIChEQlVTX0lOU0lERV9EQlVTX0gpICYmICFkZWZpbmVkIChEQlVTX0NPTVBJTEFUSU9OKQorI2Vycm9yICJPbmx5IDxkYnVzL2RidXMuaD4gY2FuIGJlIGluY2x1ZGVkIGRpcmVjdGx5LCB0aGlzIGZpbGUgbWF5IGRpc2FwcGVhciBvciBjaGFuZ2UgY29udGVudHMuIgorI2VuZGlmCisKKyNpZm5kZWYgREJVU19CVVNfSAorI2RlZmluZSBEQlVTX0JVU19ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtY29ubmVjdGlvbi5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0J1cworICogQHsKKyAqLworCitEQlVTX0VYUE9SVAorREJ1c0Nvbm5lY3Rpb24gKmRidXNfYnVzX2dldCAgICAgICAgICAgICAgKERCdXNCdXNUeXBlICAgICB0eXBlLAorCQkJCQkgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworREJVU19FWFBPUlQKK0RCdXNDb25uZWN0aW9uICpkYnVzX2J1c19nZXRfcHJpdmF0ZSAgICAgIChEQnVzQnVzVHlwZSAgICAgdHlwZSwKKwkJCQkJICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICBkYnVzX2J1c19yZWdpc3RlciAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgZGJ1c19idXNfc2V0X3VuaXF1ZV9uYW1lICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCSAgIGNvbnN0IGNoYXIgICAgICp1bmlxdWVfbmFtZSk7CitEQlVTX0VYUE9SVAorY29uc3QgY2hhciogICAgIGRidXNfYnVzX2dldF91bmlxdWVfbmFtZSAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCit1bnNpZ25lZCBsb25nICAgZGJ1c19idXNfZ2V0X3VuaXhfdXNlciAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKK0RCVVNfRVhQT1JUCitjaGFyKiAgICAgICAgICAgZGJ1c19idXNfZ2V0X2lkICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKK0RCVVNfRVhQT1JUCitpbnQgICAgICAgICAgICAgZGJ1c19idXNfcmVxdWVzdF9uYW1lICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCSAgIGNvbnN0IGNoYXIgICAgICpuYW1lLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgICAgZmxhZ3MsCisJCQkJCSAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitEQlVTX0VYUE9SVAoraW50ICAgICAgICAgICAgIGRidXNfYnVzX3JlbGVhc2VfbmFtZSAgICAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCQkgICBjb25zdCBjaGFyICAgICAqbmFtZSwKKwkJCQkJICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgZGJ1c19idXNfbmFtZV9oYXNfb3duZXIgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCSAgIGNvbnN0IGNoYXIgICAgICpuYW1lLAorCQkJCQkgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgIGRidXNfYnVzX3N0YXJ0X3NlcnZpY2VfYnlfbmFtZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICpyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CisKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgICAgZGJ1c19idXNfYWRkX21hdGNoICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgICAgZGJ1c19idXNfcmVtb3ZlX21hdGNoICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX0JVU19IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmggYi9kYnVzL2RidXMvZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzN2YxOAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaApAQCAtMCwwICsxLDEzNiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaCBEQnVzQ29ubmVjdGlvbiBpbnRlcm5hbCBpbnRlcmZhY2VzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZm5kZWYgREJVU19DT05ORUNUSU9OX0lOVEVSTkFMX0gKKyNkZWZpbmUgREJVU19DT05ORUNUSU9OX0lOVEVSTkFMX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtY29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tZXNzYWdlLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1yZXNvdXJjZXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10aW1lb3V0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWRhdGFzbG90Lmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKwordHlwZWRlZiBlbnVtCit7CisgIERCVVNfSVRFUkFUSU9OX0RPX1dSSVRJTkcgPSAxIDw8IDAsIC8qKjwgV3JpdGUgbWVzc2FnZXMgb3V0LiAqLworICBEQlVTX0lURVJBVElPTl9ET19SRUFESU5HID0gMSA8PCAxLCAvKio8IFJlYWQgbWVzc2FnZXMgaW4uICovCisgIERCVVNfSVRFUkFUSU9OX0JMT0NLICAgICAgPSAxIDw8IDIgIC8qKjwgQmxvY2sgaWYgbm90aGluZyB0byBkby4gKi8KK30gREJ1c0l0ZXJhdGlvbkZsYWdzOworCisvKiogZGVmYXVsdCB0aW1lb3V0IHZhbHVlIHdoZW4gd2FpdGluZyBmb3IgYSBtZXNzYWdlIHJlcGx5LCAyNSBzZWNvbmRzICovCisjZGVmaW5lIF9EQlVTX0RFRkFVTFRfVElNRU9VVF9WQUxVRSAoMjUgKiAxMDAwKQorCit2b2lkICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uKTsKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrICAgICAgICAgICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24pOworREJ1c0Nvbm5lY3Rpb24gKiAgX2RidXNfY29ubmVjdGlvbl9yZWZfdW5sb2NrZWQgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbik7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3VucmVmX3VubG9ja2VkICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uKTsKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcXVldWVfcmVjZWl2ZWRfbWVzc2FnZV9saW5rIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgICAgICpsaW5rKTsKK2RidXNfYm9vbF90ICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25faGFzX21lc3NhZ2VzX3RvX3NlbmRfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbik7CitEQnVzTWVzc2FnZSogICAgICBfZGJ1c19jb25uZWN0aW9uX2dldF9tZXNzYWdlX3RvX3NlbmQgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uKTsKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fbWVzc2FnZV9zZW50X3VubG9ja2VkICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlKTsKK2RidXNfYm9vbF90ICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fYWRkX3dhdGNoX3VubG9ja2VkICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAgICAgICp3YXRjaCk7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlbW92ZV93YXRjaF91bmxvY2tlZCAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICAgICAqd2F0Y2gpOwordm9pZCAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl90b2dnbGVfd2F0Y2hfdW5sb2NrZWQgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgZW5hYmxlZCk7CitkYnVzX2Jvb2xfdCAgICAgICBfZGJ1c19jb25uZWN0aW9uX2hhbmRsZV93YXRjaCAgICAgICAgICAgICAgICAoREJ1c1dhdGNoICAgICAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgIGNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKmRhdGEpOworZGJ1c19ib29sX3QgICAgICAgX2RidXNfY29ubmVjdGlvbl9hZGRfdGltZW91dF91bmxvY2tlZCAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dCAgICAgICAgKnRpbWVvdXQpOwordm9pZCAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9yZW1vdmVfdGltZW91dF91bmxvY2tlZCAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dCAgICAgICAgKnRpbWVvdXQpOwordm9pZCAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl90b2dnbGVfdGltZW91dF91bmxvY2tlZCAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dCAgICAgICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICBlbmFibGVkKTsKK0RCdXNDb25uZWN0aW9uKiAgIF9kYnVzX2Nvbm5lY3Rpb25fbmV3X2Zvcl90cmFuc3BvcnQgICAgICAgICAgIChEQnVzVHJhbnNwb3J0ICAgICAgKnRyYW5zcG9ydCk7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2RvX2l0ZXJhdGlvbl91bmxvY2tlZCAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpOwordm9pZCAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9jbG9zZV9wb3NzaWJseV9zaGFyZWQgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbik7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2Nsb3NlX2lmX29ubHlfb25lX3JlZiAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uKTsKKworREJ1c1BlbmRpbmdDYWxsKiAgX2RidXNfcGVuZGluZ19jYWxsX25ldyAgICAgICAgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0SGFuZGxlciAgdGltZW91dF9oYW5kbGVyKTsKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9ub3RpZnkgICAgICAgICAgICAgICAgICAgIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcpOwordm9pZCAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9yZW1vdmVfcGVuZGluZ19jYWxsICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcpOwordm9pZCAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9ibG9ja19wZW5kaW5nX2NhbGwgICAgICAgICAgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZyk7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c19wZW5kaW5nX2NhbGxfY29tcGxldGVfYW5kX3VubG9jayAgICAgICAoREJ1c1BlbmRpbmdDYWxsICAgICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqbWVzc2FnZSk7CitkYnVzX2Jvb2xfdCAgICAgICBfZGJ1c19jb25uZWN0aW9uX3NlbmRfYW5kX3VubG9jayAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICAgKmNsaWVudF9zZXJpYWwpOworCit2b2lkICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3F1ZXVlX3N5bnRoZXNpemVkX21lc3NhZ2VfbGluayAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCQkgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgKmxpbmspOwordm9pZCAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl90ZXN0X2dldF9sb2NrcyAgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICpjb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNdXRleCAqKm11dGV4X2xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTXV0ZXggKipkaXNwYXRjaF9tdXRleF9sb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c011dGV4ICoqaW9fcGF0aF9tdXRleF9sb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NvbmRWYXIgKipkaXNwYXRjaF9jb25kX2xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29uZFZhciAqKmlvX3BhdGhfY29uZF9sb2MpOworCisvKiBpZiBEQlVTX0VOQUJMRV9TVEFUUyAqLwordm9pZCBfZGJ1c19jb25uZWN0aW9uX2dldF9zdGF0cyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAqaW5fbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAqaW5fYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAqaW5fZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKmluX3BlYWtfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAqaW5fcGVha19mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAqb3V0X21lc3NhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKm91dF9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICpvdXRfZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKm91dF9wZWFrX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKm91dF9wZWFrX2Zkcyk7CisKKworLyogaWYgREJVU19CVUlMRF9URVNUUyAqLworY29uc3QgY2hhciogX2RidXNfY29ubmVjdGlvbl9nZXRfYWRkcmVzcyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCisvKiBUaGlzIF9kYnVzX2J1c18qIHN0dWZmIGRvZXNuJ3QgcmVhbGx5IGJlbG9uZyBoZXJlLCBidXQgZGJ1cy1idXMtaW50ZXJuYWwuaCBzZWVtcworICogc2lsbHkgZm9yIG9uZSBmdW5jdGlvbgorICovCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNCdXNJbnRlcm5hbHMKKyAqIEB7CisgKi8KKwordm9pZCAgICAgICAgICAgX2RidXNfYnVzX25vdGlmeV9zaGFyZWRfY29ubmVjdGlvbl9kaXNjb25uZWN0ZWRfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKKworLyoqIEB9ICovCisKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfQ09OTkVDVElPTl9JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1jb25uZWN0aW9uLmMgYi9kYnVzL2RidXMvZGJ1cy1jb25uZWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM2MjI4OAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYwpAQCAtMCwwICsxLDYyODEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1jb25uZWN0aW9uLmMgREJ1c0Nvbm5lY3Rpb24gb2JqZWN0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDYgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSAiZGJ1cy1zaGFyZWQuaCIKKyNpbmNsdWRlICJkYnVzLWNvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJkYnVzLWxpc3QuaCIKKyNpbmNsdWRlICJkYnVzLXRpbWVvdXQuaCIKKyNpbmNsdWRlICJkYnVzLXRyYW5zcG9ydC5oIgorI2luY2x1ZGUgImRidXMtd2F0Y2guaCIKKyNpbmNsdWRlICJkYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkYnVzLXBlbmRpbmctY2FsbC1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImRidXMtbGlzdC5oIgorI2luY2x1ZGUgImRidXMtaGFzaC5oIgorI2luY2x1ZGUgImRidXMtbWVzc2FnZS1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImRidXMtbWVzc2FnZS1wcml2YXRlLmgiCisjaW5jbHVkZSAiZGJ1cy10aHJlYWRzLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgImRidXMtZGF0YXNsb3QuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorI2luY2x1ZGUgImRidXMtc2lnbmF0dXJlLmgiCisjaW5jbHVkZSAiZGJ1cy1wZW5kaW5nLWNhbGwuaCIKKyNpbmNsdWRlICJkYnVzLW9iamVjdC10cmVlLmgiCisjaW5jbHVkZSAiZGJ1cy10aHJlYWRzLWludGVybmFsLmgiCisjaW5jbHVkZSAiZGJ1cy1idXMuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtYmFzaWMuaCIKKworI2lmZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyNkZWZpbmUgVE9PS19MT0NLX0NIRUNLKGNvbm5lY3Rpb24pCisjZGVmaW5lIFJFTEVBU0lOR19MT0NLX0NIRUNLKGNvbm5lY3Rpb24pCisjZGVmaW5lIEhBVkVfTE9DS19DSEVDSyhjb25uZWN0aW9uKQorI2Vsc2UKKyNkZWZpbmUgVE9PS19MT0NLX0NIRUNLKGNvbm5lY3Rpb24pIGRvIHsgICAgICAgICAgICAgICAgXAorICAgIF9kYnVzX2Fzc2VydCAoIShjb25uZWN0aW9uKS0+aGF2ZV9jb25uZWN0aW9uX2xvY2spOyBcCisgICAgKGNvbm5lY3Rpb24pLT5oYXZlX2Nvbm5lY3Rpb25fbG9jayA9IFRSVUU7ICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgUkVMRUFTSU5HX0xPQ0tfQ0hFQ0soY29ubmVjdGlvbikgZG8geyAgICAgICAgICAgIFwKKyAgICBfZGJ1c19hc3NlcnQgKChjb25uZWN0aW9uKS0+aGF2ZV9jb25uZWN0aW9uX2xvY2spOyAgIFwKKyAgICAoY29ubmVjdGlvbiktPmhhdmVfY29ubmVjdGlvbl9sb2NrID0gRkFMU0U7ICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgSEFWRV9MT0NLX0NIRUNLKGNvbm5lY3Rpb24pICAgICAgICBfZGJ1c19hc3NlcnQgKChjb25uZWN0aW9uKS0+aGF2ZV9jb25uZWN0aW9uX2xvY2spCisvKiBBICJET19OT1RfSEFWRV9MT0NLX0NIRUNLIiBpcyBpbXBvc3NpYmxlIHNpbmNlIHdlIG5lZWQgdGhlIGxvY2sgdG8gY2hlY2sgdGhlIGZsYWcgKi8KKyNlbmRpZgorCisjZGVmaW5lIFRSQUNFX0xPQ0tTIDAKKworI2RlZmluZSBDT05ORUNUSU9OX0xPQ0soY29ubmVjdGlvbikgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKFRSQUNFX0xPQ0tTKSB7IF9kYnVzX3ZlcmJvc2UgKCJMT0NLXG4iKTsgfSAgIFwKKyAgICBfZGJ1c19ybXV0ZXhfbG9jayAoKGNvbm5lY3Rpb24pLT5tdXRleCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRPT0tfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgQ09OTkVDVElPTl9VTkxPQ0soY29ubmVjdGlvbikgX2RidXNfY29ubmVjdGlvbl91bmxvY2sgKGNvbm5lY3Rpb24pCisKKyNkZWZpbmUgU0xPVFNfTE9DSyhjb25uZWN0aW9uKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9kYnVzX3JtdXRleF9sb2NrICgoY29ubmVjdGlvbiktPnNsb3RfbXV0ZXgpOyAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgU0xPVFNfVU5MT0NLKGNvbm5lY3Rpb24pIGRvIHsgICAgICAgICAgICAgICAgICAgXAorICAgIF9kYnVzX3JtdXRleF91bmxvY2sgKChjb25uZWN0aW9uKS0+c2xvdF9tdXRleCk7ICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgRElTUEFUQ0hfU1RBVFVTX05BTUUocykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICgocykgPT0gREJVU19ESVNQQVRDSF9DT01QTEVURSA/ICJjb21wbGV0ZSIgOiAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAocykgPT0gREJVU19ESVNQQVRDSF9EQVRBX1JFTUFJTlMgPyAiZGF0YSByZW1haW5zIiA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAocykgPT0gREJVU19ESVNQQVRDSF9ORUVEX01FTU9SWSA/ICJuZWVkIG1lbW9yeSIgOiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAiPz8/IikKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0Nvbm5lY3Rpb24gREJ1c0Nvbm5lY3Rpb24KKyAqIEBpbmdyb3VwICBEQnVzCisgKiBAYnJpZWYgQ29ubmVjdGlvbiB0byBhbm90aGVyIGFwcGxpY2F0aW9uCisgKgorICogQSBEQnVzQ29ubmVjdGlvbiByZXByZXNlbnRzIGEgY29ubmVjdGlvbiB0byBhbm90aGVyCisgKiBhcHBsaWNhdGlvbi4gTWVzc2FnZXMgY2FuIGJlIHNlbnQgYW5kIHJlY2VpdmVkIHZpYSB0aGlzIGNvbm5lY3Rpb24uCisgKiBUaGUgb3RoZXIgYXBwbGljYXRpb24gbWF5IGJlIGEgbWVzc2FnZSBidXM7IGZvciBjb252ZW5pZW5jZSwgdGhlCisgKiBmdW5jdGlvbiBkYnVzX2J1c19nZXQoKSBpcyBwcm92aWRlZCB0byBhdXRvbWF0aWNhbGx5IG9wZW4gYQorICogY29ubmVjdGlvbiB0byB0aGUgd2VsbC1rbm93biBtZXNzYWdlIGJ1c2VzLgorICogCisgKiBJbiBicmllZiBhIERCdXNDb25uZWN0aW9uIGlzIGEgbWVzc2FnZSBxdWV1ZSBhc3NvY2lhdGVkIHdpdGggc29tZQorICogbWVzc2FnZSB0cmFuc3BvcnQgbWVjaGFuaXNtIHN1Y2ggYXMgYSBzb2NrZXQuICBUaGUgY29ubmVjdGlvbgorICogbWFpbnRhaW5zIGEgcXVldWUgb2YgaW5jb21pbmcgbWVzc2FnZXMgYW5kIGEgcXVldWUgb2Ygb3V0Z29pbmcKKyAqIG1lc3NhZ2VzLgorICoKKyAqIFNldmVyYWwgZnVuY3Rpb25zIHVzZSB0aGUgZm9sbG93aW5nIHRlcm1zOgorICogPHVsPgorICogPGxpPjxiPnJlYWQ8L2I+IG1lYW5zIHRvIGZpbGwgdGhlIGluY29taW5nIG1lc3NhZ2UgcXVldWUgYnkgcmVhZGluZyBmcm9tIHRoZSBzb2NrZXQ8L2xpPgorICogPGxpPjxiPndyaXRlPC9iPiBtZWFucyB0byBkcmFpbiB0aGUgb3V0Z29pbmcgcXVldWUgYnkgd3JpdGluZyB0byB0aGUgc29ja2V0PC9saT4KKyAqIDxsaT48Yj5kaXNwYXRjaDwvYj4gbWVhbnMgdG8gZHJhaW4gdGhlIGluY29taW5nIHF1ZXVlIGJ5IGludm9raW5nIGFwcGxpY2F0aW9uLXByb3ZpZGVkIG1lc3NhZ2UgaGFuZGxlcnM8L2xpPgorICogPC91bD4KKyAqCisgKiBUaGUgZnVuY3Rpb24gZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGVfZGlzcGF0Y2goKSBmb3IgZXhhbXBsZSBkb2VzIGFsbAorICogdGhyZWUgb2YgdGhlc2UgdGhpbmdzLCBvZmZlcmluZyBhIHNpbXBsZSBhbHRlcm5hdGl2ZSB0byBhIG1haW4gbG9vcC4KKyAqCisgKiBJbiBhbiBhcHBsaWNhdGlvbiB3aXRoIGEgbWFpbiBsb29wLCB0aGUgcmVhZC93cml0ZS9kaXNwYXRjaAorICogb3BlcmF0aW9ucyBhcmUgdXN1YWxseSBzZXBhcmF0ZS4KKyAqCisgKiBUaGUgY29ubmVjdGlvbiBwcm92aWRlcyAjREJ1c1dhdGNoIGFuZCAjREJ1c1RpbWVvdXQgb2JqZWN0cyB0bworICogdGhlIG1haW4gbG9vcC4gVGhlc2UgYXJlIHVzZWQgdG8ga25vdyB3aGVuIHJlYWRpbmcsIHdyaXRpbmcsIG9yCisgKiBkaXNwYXRjaGluZyBzaG91bGQgYmUgcGVyZm9ybWVkLgorICogCisgKiBJbmNvbWluZyBtZXNzYWdlcyBhcmUgcHJvY2Vzc2VkCisgKiBieSBjYWxsaW5nIGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCgpLiBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2goKQorICogcnVucyBhbnkgaGFuZGxlcnMgcmVnaXN0ZXJlZCBmb3IgdGhlIHRvcG1vc3QgbWVzc2FnZSBpbiB0aGUgbWVzc2FnZQorICogcXVldWUsIHRoZW4gZGlzY2FyZHMgdGhlIG1lc3NhZ2UsIHRoZW4gcmV0dXJucy4KKyAqIAorICogZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXMoKSBpbmRpY2F0ZXMgd2hldGhlcgorICogbWVzc2FnZXMgYXJlIGN1cnJlbnRseSBpbiB0aGUgcXVldWUgdGhhdCBuZWVkIGRpc3BhdGNoaW5nLgorICogZGJ1c19jb25uZWN0aW9uX3NldF9kaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24oKSBhbGxvd3MKKyAqIHlvdSB0byBzZXQgYSBmdW5jdGlvbiB0byBiZSB1c2VkIHRvIG1vbml0b3IgdGhlIGRpc3BhdGNoIHN0YXR1cy4KKyAqIAorICogSWYgeW91J3JlIHVzaW5nIEdMaWIgb3IgUXQgYWRkLW9uIGxpYnJhcmllcyBmb3IgRC1CdXMsIHRoZXJlIGFyZQorICogc3BlY2lhbCBjb252ZW5pZW5jZSBBUElzIGluIHRob3NlIGxpYnJhcmllcyB0aGF0IGhpZGUKKyAqIGFsbCB0aGUgZGV0YWlscyBvZiBkaXNwYXRjaCBhbmQgd2F0Y2gvdGltZW91dCBtb25pdG9yaW5nLgorICogRm9yIGV4YW1wbGUsIGRidXNfY29ubmVjdGlvbl9zZXR1cF93aXRoX2dfbWFpbigpLgorICoKKyAqIElmIHlvdSBhcmVuJ3QgdXNpbmcgdGhlc2UgYWRkLW9uIGxpYnJhcmllcywgYnV0IHdhbnQgdG8gcHJvY2VzcworICogbWVzc2FnZXMgYXN5bmNocm9ub3VzbHksIHlvdSBtdXN0IG1hbnVhbGx5IGNhbGwKKyAqIGRidXNfY29ubmVjdGlvbl9zZXRfZGlzcGF0Y2hfc3RhdHVzX2Z1bmN0aW9uKCksCisgKiBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dhdGNoX2Z1bmN0aW9ucygpLAorICogZGJ1c19jb25uZWN0aW9uX3NldF90aW1lb3V0X2Z1bmN0aW9ucygpIHByb3ZpZGluZyBhcHByb3ByaWF0ZQorICogZnVuY3Rpb25zIHRvIGludGVncmF0ZSB0aGUgY29ubmVjdGlvbiB3aXRoIHlvdXIgYXBwbGljYXRpb24ncyBtYWluCisgKiBsb29wLiBUaGlzIGNhbiBiZSB0cmlja3kgdG8gZ2V0IHJpZ2h0OyBtYWluIGxvb3BzIGFyZSBub3Qgc2ltcGxlLgorICoKKyAqIElmIHlvdSBkb24ndCBuZWVkIHRvIGJlIGFzeW5jaHJvbm91cywgeW91IGNhbiBpZ25vcmUgI0RCdXNXYXRjaCwKKyAqICNEQnVzVGltZW91dCwgYW5kIGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCgpLiAgSW5zdGVhZCwKKyAqIGRidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlX2Rpc3BhdGNoKCkgY2FuIGJlIHVzZWQuCisgKgorICogT3IsIGluIDxlbT52ZXJ5PC9lbT4gc2ltcGxlIGFwcGxpY2F0aW9ucywKKyAqIGRidXNfY29ubmVjdGlvbl9wb3BfbWVzc2FnZSgpIG1heSBiZSBhbGwgeW91IG5lZWQsIGFsbG93aW5nIHlvdSB0bworICogYXZvaWQgc2V0dGluZyB1cCBhbnkgaGFuZGxlciBmdW5jdGlvbnMgKHNlZQorICogZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIoKSwKKyAqIGRidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9vYmplY3RfcGF0aCgpIGZvciBtb3JlIG9uIGhhbmRsZXJzKS4KKyAqIAorICogV2hlbiB5b3UgdXNlIGRidXNfY29ubmVjdGlvbl9zZW5kKCkgb3Igb25lIG9mIGl0cyB2YXJpYW50cyB0byBzZW5kCisgKiBhIG1lc3NhZ2UsIHRoZSBtZXNzYWdlIGlzIGFkZGVkIHRvIHRoZSBvdXRnb2luZyBxdWV1ZS4gIEl0J3MKKyAqIGFjdHVhbGx5IHdyaXR0ZW4gdG8gdGhlIG5ldHdvcmsgbGF0ZXI7IGVpdGhlciBpbgorICogZGJ1c193YXRjaF9oYW5kbGUoKSBpbnZva2VkIGJ5IHlvdXIgbWFpbiBsb29wLCBvciBpbgorICogZGJ1c19jb25uZWN0aW9uX2ZsdXNoKCkgd2hpY2ggYmxvY2tzIHVudGlsIGl0IGNhbiB3cml0ZSBvdXQgdGhlCisgKiBlbnRpcmUgb3V0Z29pbmcgcXVldWUuIFRoZSBHTGliL1F0IGFkZC1vbiBsaWJyYXJpZXMgYWdhaW4KKyAqIGhhbmRsZSB0aGUgZGV0YWlscyBoZXJlIGZvciB5b3UgYnkgc2V0dGluZyB1cCB3YXRjaCBmdW5jdGlvbnMuCisgKgorICogV2hlbiBhIGNvbm5lY3Rpb24gaXMgZGlzY29ubmVjdGVkLCB5b3UgYXJlIGd1YXJhbnRlZWQgdG8gZ2V0IGEKKyAqIHNpZ25hbCAiRGlzY29ubmVjdGVkIiBmcm9tIHRoZSBpbnRlcmZhY2UKKyAqICNEQlVTX0lOVEVSRkFDRV9MT0NBTCwgcGF0aAorICogI0RCVVNfUEFUSF9MT0NBTC4KKyAqCisgKiBZb3UgbWF5IG5vdCBkcm9wIHRoZSBsYXN0IHJlZmVyZW5jZSB0byBhICNEQnVzQ29ubmVjdGlvbgorICogdW50aWwgdGhhdCBjb25uZWN0aW9uIGhhcyBiZWVuIGRpc2Nvbm5lY3RlZC4KKyAqCisgKiBZb3UgbWF5IGRpc3BhdGNoIHRoZSB1bnByb2Nlc3NlZCBpbmNvbWluZyBtZXNzYWdlIHF1ZXVlIGV2ZW4gaWYgdGhlCisgKiBjb25uZWN0aW9uIGlzIGRpc2Nvbm5lY3RlZC4gSG93ZXZlciwgIkRpc2Nvbm5lY3RlZCIgd2lsbCBhbHdheXMgYmUKKyAqIHRoZSBsYXN0IG1lc3NhZ2UgaW4gdGhlIHF1ZXVlIChvYnZpb3VzbHkgbm8gbWVzc2FnZXMgYXJlIHJlY2VpdmVkCisgKiBhZnRlciBkaXNjb25uZWN0aW9uKS4KKyAqCisgKiBBZnRlciBjYWxsaW5nIGRidXNfdGhyZWFkc19pbml0KCksICNEQnVzQ29ubmVjdGlvbiBoYXMgdGhyZWFkCisgKiBsb2NrcyBhbmQgZHJvcHMgdGhlbSB3aGVuIGludm9raW5nIHVzZXIgY2FsbGJhY2tzLCBzbyBpbiBnZW5lcmFsIGlzCisgKiB0cmFuc3BhcmVudGx5IHRocmVhZHNhZmUuIEhvd2V2ZXIsICNEQnVzTWVzc2FnZSBkb2VzIE5PVCBoYXZlCisgKiB0aHJlYWQgbG9ja3M7IHlvdSBtdXN0IG5vdCBzZW5kIHRoZSBzYW1lIG1lc3NhZ2UgdG8gbXVsdGlwbGUKKyAqICNEQnVzQ29ubmVjdGlvbiBpZiB0aG9zZSBjb25uZWN0aW9ucyB3aWxsIGJlIHVzZWQgZnJvbSBkaWZmZXJlbnQgdGhyZWFkcywKKyAqIGZvciBleGFtcGxlLgorICoKKyAqIEFsc28sIGlmIHlvdSBkaXNwYXRjaCBvciBwb3AgbWVzc2FnZXMgZnJvbSBtdWx0aXBsZSB0aHJlYWRzLCBpdAorICogbWF5IHdvcmsgaW4gdGhlIHNlbnNlIHRoYXQgaXQgd29uJ3QgY3Jhc2gsIGJ1dCBpdCdzIHRvdWdoIHRvIGltYWdpbmUKKyAqIHNhbmUgcmVzdWx0czsgaXQgd2lsbCBiZSBjb21wbGV0ZWx5IHVucHJlZGljdGFibGUgd2hpY2ggbWVzc2FnZXMKKyAqIGdvIHRvIHdoaWNoIHRocmVhZHMuCisgKgorICogSXQncyByZWNvbW1lbmRlZCB0byBkaXNwYXRjaCBmcm9tIGEgc2luZ2xlIHRocmVhZC4KKyAqCisgKiBUaGUgbW9zdCB1c2VmdWwgZnVuY3Rpb24gdG8gY2FsbCBmcm9tIG11bHRpcGxlIHRocmVhZHMgYXQgb25jZQorICogaXMgZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2soKS4gVGhhdCBpcywKKyAqIG11bHRpcGxlIHRocmVhZHMgY2FuIG1ha2UgbWV0aG9kIGNhbGxzIGF0IHRoZSBzYW1lIHRpbWUuCisgKgorICogSWYgeW91IGFyZW4ndCB1c2luZyB0aHJlYWRzLCB5b3UgY2FuIHVzZSBhIG1haW4gbG9vcCBhbmQKKyAqIGRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkoKSB0byBhY2hpZXZlIGEgc2ltaWxhciByZXN1bHQuCisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0Nvbm5lY3Rpb25JbnRlcm5hbHMgREJ1c0Nvbm5lY3Rpb24gaW1wbGVtZW50YXRpb24gZGV0YWlscworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIERCdXNDb25uZWN0aW9uCisgKgorICogQHsKKyAqLworCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCitzdGF0aWMgdm9pZAorX2RidXNfY29ubmVjdGlvbl90cmFjZV9yZWYgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgIGludCBvbGRfcmVmY291bnQsCisgICAgaW50IG5ld19yZWZjb3VudCwKKyAgICBjb25zdCBjaGFyICp3aHkpCit7CisgIHN0YXRpYyBpbnQgZW5hYmxlZCA9IC0xOworCisgIF9kYnVzX3RyYWNlX3JlZiAoIkRCdXNDb25uZWN0aW9uIiwgY29ubmVjdGlvbiwgb2xkX3JlZmNvdW50LCBuZXdfcmVmY291bnQsCisgICAgICB3aHksICJEQlVTX0NPTk5FQ1RJT05fVFJBQ0UiLCAmZW5hYmxlZCk7Cit9CisjZWxzZQorI2RlZmluZSBfZGJ1c19jb25uZWN0aW9uX3RyYWNlX3JlZihjLG8sbix3KSBcCisgIGRvIFwKKyAge1wKKyAgICAodm9pZCkgKG8pOyBcCisgICAgKHZvaWQpIChuKTsgXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qKgorICogSW50ZXJuYWwgc3RydWN0IHJlcHJlc2VudGluZyBhIG1lc3NhZ2UgZmlsdGVyIGZ1bmN0aW9uIAorICovCit0eXBlZGVmIHN0cnVjdCBEQnVzTWVzc2FnZUZpbHRlciBEQnVzTWVzc2FnZUZpbHRlcjsKKworLyoqCisgKiBJbnRlcm5hbCBzdHJ1Y3QgcmVwcmVzZW50aW5nIGEgbWVzc2FnZSBmaWx0ZXIgZnVuY3Rpb24gCisgKi8KK3N0cnVjdCBEQnVzTWVzc2FnZUZpbHRlcgoreworICBEQnVzQXRvbWljIHJlZmNvdW50OyAvKio8IFJlZmVyZW5jZSBjb3VudCAqLworICBEQnVzSGFuZGxlTWVzc2FnZUZ1bmN0aW9uIGZ1bmN0aW9uOyAvKio8IEZ1bmN0aW9uIHRvIGNhbGwgdG8gZmlsdGVyICovCisgIHZvaWQgKnVzZXJfZGF0YTsgLyoqPCBVc2VyIGRhdGEgZm9yIHRoZSBmdW5jdGlvbiAqLworICBEQnVzRnJlZUZ1bmN0aW9uIGZyZWVfdXNlcl9kYXRhX2Z1bmN0aW9uOyAvKio8IEZ1bmN0aW9uIHRvIGZyZWUgdGhlIHVzZXIgZGF0YSAqLworfTsKKworCisvKioKKyAqIEludGVybmFscyBvZiBEQnVzUHJlYWxsb2NhdGVkU2VuZAorICovCitzdHJ1Y3QgREJ1c1ByZWFsbG9jYXRlZFNlbmQKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247IC8qKjwgQ29ubmVjdGlvbiB3ZSdkIHNlbmQgdGhlIG1lc3NhZ2UgdG8gKi8KKyAgREJ1c0xpc3QgKnF1ZXVlX2xpbms7ICAgICAgIC8qKjwgUHJlYWxsb2NhdGVkIGxpbmsgaW4gdGhlIHF1ZXVlICovCisgIERCdXNMaXN0ICpjb3VudGVyX2xpbms7ICAgICAvKio8IFByZWFsbG9jYXRlZCBsaW5rIGluIHRoZSByZXNvdXJjZSBjb3VudGVyICovCit9OworCisjaWYgSEFWRV9ERUNMX01TR19OT1NJR05BTAorc3RhdGljIGRidXNfYm9vbF90IF9kYnVzX21vZGlmeV9zaWdwaXBlID0gRkFMU0U7CisjZWxzZQorc3RhdGljIGRidXNfYm9vbF90IF9kYnVzX21vZGlmeV9zaWdwaXBlID0gVFJVRTsKKyNlbmRpZgorCisvKioKKyAqIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgREJ1c0Nvbm5lY3Rpb24uIEFsbCBmaWVsZHMgYXJlIHByaXZhdGUuCisgKi8KK3N0cnVjdCBEQnVzQ29ubmVjdGlvbgoreworICBEQnVzQXRvbWljIHJlZmNvdW50OyAvKio8IFJlZmVyZW5jZSBjb3VudC4gKi8KKworICBEQnVzUk11dGV4ICptdXRleDsgLyoqPCBMb2NrIG9uIHRoZSBlbnRpcmUgREJ1c0Nvbm5lY3Rpb24gKi8KKworICBEQnVzQ011dGV4ICpkaXNwYXRjaF9tdXRleDsgICAgIC8qKjwgUHJvdGVjdHMgZGlzcGF0Y2hfYWNxdWlyZWQgKi8KKyAgREJ1c0NvbmRWYXIgKmRpc3BhdGNoX2NvbmQ7ICAgIC8qKjwgTm90aWZ5IHdoZW4gZGlzcGF0Y2hfYWNxdWlyZWQgaXMgYXZhaWxhYmxlICovCisgIERCdXNDTXV0ZXggKmlvX3BhdGhfbXV0ZXg7ICAgICAgLyoqPCBQcm90ZWN0cyBpb19wYXRoX2FjcXVpcmVkICovCisgIERCdXNDb25kVmFyICppb19wYXRoX2NvbmQ7ICAgICAvKio8IE5vdGlmeSB3aGVuIGlvX3BhdGhfYWNxdWlyZWQgaXMgYXZhaWxhYmxlICovCisgIAorICBEQnVzTGlzdCAqb3V0Z29pbmdfbWVzc2FnZXM7IC8qKjwgUXVldWUgb2YgbWVzc2FnZXMgd2UgbmVlZCB0byBzZW5kLCBzZW5kIHRoZSBlbmQgb2YgdGhlIGxpc3QgZmlyc3QuICovCisgIERCdXNMaXN0ICppbmNvbWluZ19tZXNzYWdlczsgLyoqPCBRdWV1ZSBvZiBtZXNzYWdlcyB3ZSBoYXZlIHJlY2VpdmVkLCBlbmQgb2YgdGhlIGxpc3QgcmVjZWl2ZWQgbW9zdCByZWNlbnRseS4gKi8KKyAgREJ1c0xpc3QgKmV4cGlyZWRfbWVzc2FnZXM7ICAvKio8IE1lc3NhZ2VzIHRoYXQgd2lsbCBiZSByZWxlYXNlZCB3aGVuIHdlIG5leHQgdW5sb2NrLiAqLworCisgIERCdXNNZXNzYWdlICptZXNzYWdlX2JvcnJvd2VkOyAvKio8IEZpbGxlZCBpbiBpZiB0aGUgZmlyc3QgaW5jb21pbmcgbWVzc2FnZSBoYXMgYmVlbiBib3Jyb3dlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgZGlzcGF0Y2hfYWNxdWlyZWQgd2lsbCBiZSBzZXQgYnkgdGhlIGJvcnJvd2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgCisgIGludCBuX291dGdvaW5nOyAgICAgICAgICAgICAgLyoqPCBMZW5ndGggb2Ygb3V0Z29pbmcgcXVldWUuICovCisgIGludCBuX2luY29taW5nOyAgICAgICAgICAgICAgLyoqPCBMZW5ndGggb2YgaW5jb21pbmcgcXVldWUuICovCisKKyAgREJ1c0NvdW50ZXIgKm91dGdvaW5nX2NvdW50ZXI7IC8qKjwgQ291bnRzIHNpemUgb2Ygb3V0Z29pbmcgbWVzc2FnZXMuICovCisgIAorICBEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQ7ICAgIC8qKjwgT2JqZWN0IHRoYXQgc2VuZHMvcmVjZWl2ZXMgbWVzc2FnZXMgb3ZlciBuZXR3b3JrLiAqLworICBEQnVzV2F0Y2hMaXN0ICp3YXRjaGVzOyAgICAgIC8qKjwgU3RvcmVzIGFjdGl2ZSB3YXRjaGVzLiAqLworICBEQnVzVGltZW91dExpc3QgKnRpbWVvdXRzOyAgIC8qKjwgU3RvcmVzIGFjdGl2ZSB0aW1lb3V0cy4gKi8KKyAgCisgIERCdXNMaXN0ICpmaWx0ZXJfbGlzdDsgICAgICAgIC8qKjwgTGlzdCBvZiBmaWx0ZXJzLiAqLworCisgIERCdXNSTXV0ZXggKnNsb3RfbXV0ZXg7ICAgICAgICAvKio8IExvY2sgb24gc2xvdF9saXN0IHNvIG92ZXJhbGwgY29ubmVjdGlvbiBsb2NrIG5lZWQgbm90IGJlIHRha2VuICovCisgIERCdXNEYXRhU2xvdExpc3Qgc2xvdF9saXN0OyAgIC8qKjwgRGF0YSBzdG9yZWQgYnkgYWxsb2NhdGVkIGludGVnZXIgSUQgKi8KKworICBEQnVzSGFzaFRhYmxlICpwZW5kaW5nX3JlcGxpZXM7ICAvKio8IEhhc2ggb2YgbWVzc2FnZSBzZXJpYWxzIHRvICNEQnVzUGVuZGluZ0NhbGwuICovICAKKyAgCisgIGRidXNfdWludDMyX3QgY2xpZW50X3NlcmlhbDsgICAgICAgLyoqPCBDbGllbnQgc2VyaWFsLiBJbmNyZW1lbnRzIGVhY2ggdGltZSBhIG1lc3NhZ2UgaXMgc2VudCAgKi8KKyAgREJ1c0xpc3QgKmRpc2Nvbm5lY3RfbWVzc2FnZV9saW5rOyAvKio8IFByZWFsbG9jYXRlZCBsaXN0IG5vZGUgZm9yIHF1ZXVlaW5nIHRoZSBkaXNjb25uZWN0aW9uIG1lc3NhZ2UgKi8KKworICBEQnVzV2FrZXVwTWFpbkZ1bmN0aW9uIHdha2V1cF9tYWluX2Z1bmN0aW9uOyAvKio8IEZ1bmN0aW9uIHRvIHdha2UgdXAgdGhlIG1haW5sb29wICAqLworICB2b2lkICp3YWtldXBfbWFpbl9kYXRhOyAvKio8IEFwcGxpY2F0aW9uIGRhdGEgZm9yIHdha2V1cF9tYWluX2Z1bmN0aW9uICovCisgIERCdXNGcmVlRnVuY3Rpb24gZnJlZV93YWtldXBfbWFpbl9kYXRhOyAvKio8IGZyZWUgd2FrZXVwX21haW5fZGF0YSAqLworCisgIERCdXNEaXNwYXRjaFN0YXR1c0Z1bmN0aW9uIGRpc3BhdGNoX3N0YXR1c19mdW5jdGlvbjsgLyoqPCBGdW5jdGlvbiBvbiBkaXNwYXRjaCBzdGF0dXMgY2hhbmdlcyAgKi8KKyAgdm9pZCAqZGlzcGF0Y2hfc3RhdHVzX2RhdGE7IC8qKjwgQXBwbGljYXRpb24gZGF0YSBmb3IgZGlzcGF0Y2hfc3RhdHVzX2Z1bmN0aW9uICovCisgIERCdXNGcmVlRnVuY3Rpb24gZnJlZV9kaXNwYXRjaF9zdGF0dXNfZGF0YTsgLyoqPCBmcmVlIGRpc3BhdGNoX3N0YXR1c19kYXRhICovCisKKyAgREJ1c0Rpc3BhdGNoU3RhdHVzIGxhc3RfZGlzcGF0Y2hfc3RhdHVzOyAvKio8IFRoZSBsYXN0IGRpc3BhdGNoIHN0YXR1cyB3ZSByZXBvcnRlZCB0byB0aGUgYXBwbGljYXRpb24uICovCisKKyAgREJ1c09iamVjdFRyZWUgKm9iamVjdHM7IC8qKjwgT2JqZWN0IHBhdGggaGFuZGxlcnMgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgY29ubmVjdGlvbiAqLworCisgIGNoYXIgKnNlcnZlcl9ndWlkOyAvKio8IEdVSUQgb2Ygc2VydmVyIGlmIHdlIGFyZSBpbiBzaGFyZWRfY29ubmVjdGlvbnMsICNOVUxMIGlmIHNlcnZlciBHVUlEIGlzIHVua25vd24gb3IgY29ubmVjdGlvbiBpcyBwcml2YXRlICovCisKKyAgLyogVGhlc2UgdHdvIE1VU1QgYmUgYm9vbHMgYW5kIG5vdCBiaXRmaWVsZHMsIGJlY2F1c2UgdGhleSBhcmUgcHJvdGVjdGVkIGJ5IGEgc2VwYXJhdGUgbG9jaworICAgKiBmcm9tIGNvbm5lY3Rpb24tPm11dGV4IGFuZCBhbGwgYml0ZmllbGRzIGluIGEgd29yZCBoYXZlIHRvIGJlIHJlYWQvd3JpdHRlbiB0b2dldGhlci4KKyAgICogU28geW91IGNhbid0IGhhdmUgYSBkaWZmZXJlbnQgbG9jayBmb3IgZGlmZmVyZW50IGJpdGZpZWxkcyBpbiB0aGUgc2FtZSB3b3JkLgorICAgKi8KKyAgZGJ1c19ib29sX3QgZGlzcGF0Y2hfYWNxdWlyZWQ7IC8qKjwgU29tZW9uZSBoYXMgZGlzcGF0Y2ggcGF0aCAoY2FuIGRyYWluIGluY29taW5nIHF1ZXVlKSAqLworICBkYnVzX2Jvb2xfdCBpb19wYXRoX2FjcXVpcmVkOyAgLyoqPCBTb21lb25lIGhhcyB0cmFuc3BvcnQgaW8gcGF0aCAoY2FuIHVzZSB0aGUgdHJhbnNwb3J0IHRvIHJlYWQvd3JpdGUgbWVzc2FnZXMpICovCisgIAorICB1bnNpZ25lZCBpbnQgc2hhcmVhYmxlIDogMTsgLyoqPCAjVFJVRSBpZiBsaWJkYnVzIG93bnMgYSByZWZlcmVuY2UgdG8gdGhlIGNvbm5lY3Rpb24gYW5kIGNhbiByZXR1cm4gaXQgZnJvbSBkYnVzX2Nvbm5lY3Rpb25fb3BlbigpIG1vcmUgdGhhbiBvbmNlICovCisgIAorICB1bnNpZ25lZCBpbnQgZXhpdF9vbl9kaXNjb25uZWN0IDogMTsgLyoqPCBJZiAjVFJVRSwgZXhpdCBhZnRlciBoYW5kbGluZyBkaXNjb25uZWN0IHNpZ25hbCAqLworCisgIHVuc2lnbmVkIGludCByb3V0ZV9wZWVyX21lc3NhZ2VzIDogMTsgLyoqPCBJZiAjVFJVRSwgaWYgb3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlciBtZXNzYWdlcyBoYXZlIGEgYnVzIG5hbWUsIGRvbid0IGhhbmRsZSB0aGVtIGF1dG9tYXRpY2FsbHkgKi8KKworICB1bnNpZ25lZCBpbnQgZGlzY29ubmVjdGVkX21lc3NhZ2VfYXJyaXZlZCA6IDE7ICAgLyoqPCBXZSBwb3BwZWQgb3IgYXJlIGRpc3BhdGNoaW5nIHRoZSBkaXNjb25uZWN0ZWQgbWVzc2FnZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGlmIHRoZSBkaXNjb25uZWN0X21lc3NhZ2VfbGluayBpcyBOVUxMIHRoZW4gd2UgcXVldWVkIGl0LCBidXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoaXMgZmxhZyBpcyB3aGV0aGVyIGl0IGdvdCB0byB0aGUgaGVhZCBvZiB0aGUgcXVldWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdW5zaWduZWQgaW50IGRpc2Nvbm5lY3RlZF9tZXNzYWdlX3Byb2Nlc3NlZCA6IDE7IC8qKjwgV2UgZGlkIG91ciBkZWZhdWx0IGhhbmRsaW5nIG9mIHRoZSBkaXNjb25uZWN0ZWQgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHN1Y2ggYXMgY2xvc2luZyB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICB1bnNpZ25lZCBpbnQgaGF2ZV9jb25uZWN0aW9uX2xvY2sgOiAxOyAvKio8IFVzZWQgdG8gY2hlY2sgbG9ja2luZyAqLworI2VuZGlmCisgIAorI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIGludCBnZW5lcmF0aW9uOyAvKio8IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbiB0aGF0IHNob3VsZCBjb3JyZXNwb25kIHRvIHRoaXMgY29ubmVjdGlvbiAqLworI2VuZGlmIAorfTsKKworc3RhdGljIERCdXNEaXNwYXRjaFN0YXR1cyBfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl91cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2sgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNEaXNwYXRjaFN0YXR1cyAgbmV3X3N0YXR1cyk7CitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fbGFzdF91bnJlZiAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24pOworc3RhdGljIHZvaWQgICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2FjcXVpcmVfZGlzcGF0Y2ggICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9yZWxlYXNlX2Rpc3BhdGNoICAgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbik7CitzdGF0aWMgREJ1c0Rpc3BhdGNoU3RhdHVzIF9kYnVzX2Nvbm5lY3Rpb25fZmx1c2hfdW5sb2NrZWQgICAgICAgICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24pOworc3RhdGljIHZvaWQgICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2Nsb3NlX3Bvc3NpYmx5X3NoYXJlZF9hbmRfdW5sb2NrICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCAgICAgICAgX2RidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkX3VubG9ja2VkICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbik7CitzdGF0aWMgZGJ1c19ib29sX3QgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcGVla19mb3JfcmVwbHlfdW5sb2NrZWQgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICAgIGNsaWVudF9zZXJpYWwpOworCitzdGF0aWMgREJ1c01lc3NhZ2VGaWx0ZXIgKgorX2RidXNfbWVzc2FnZV9maWx0ZXJfcmVmIChEQnVzTWVzc2FnZUZpbHRlciAqZmlsdGVyKQoreworI2lmZGVmIERCVVNfRElTQUJMRV9BU1NFUlQKKyAgX2RidXNfYXRvbWljX2luYyAoJmZpbHRlci0+cmVmY291bnQpOworI2Vsc2UKKyAgZGJ1c19pbnQzMl90IG9sZF92YWx1ZTsKKworICBvbGRfdmFsdWUgPSBfZGJ1c19hdG9taWNfaW5jICgmZmlsdGVyLT5yZWZjb3VudCk7CisgIF9kYnVzX2Fzc2VydCAob2xkX3ZhbHVlID4gMCk7CisjZW5kaWYKKworICByZXR1cm4gZmlsdGVyOworfQorCitzdGF0aWMgdm9pZAorX2RidXNfbWVzc2FnZV9maWx0ZXJfdW5yZWYgKERCdXNNZXNzYWdlRmlsdGVyICpmaWx0ZXIpCit7CisgIGRidXNfaW50MzJfdCBvbGRfdmFsdWU7CisKKyAgb2xkX3ZhbHVlID0gX2RidXNfYXRvbWljX2RlYyAoJmZpbHRlci0+cmVmY291bnQpOworICBfZGJ1c19hc3NlcnQgKG9sZF92YWx1ZSA+IDApOworCisgIGlmIChvbGRfdmFsdWUgPT0gMSkKKyAgICB7CisgICAgICBpZiAoZmlsdGVyLT5mcmVlX3VzZXJfZGF0YV9mdW5jdGlvbikKKyAgICAgICAgKCogZmlsdGVyLT5mcmVlX3VzZXJfZGF0YV9mdW5jdGlvbikgKGZpbHRlci0+dXNlcl9kYXRhKTsKKyAgICAgIAorICAgICAgZGJ1c19mcmVlIChmaWx0ZXIpOworICAgIH0KK30KKworLyoqCisgKiBBY3F1aXJlcyB0aGUgY29ubmVjdGlvbiBsb2NrLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICovCit2b2lkCitfZGJ1c19jb25uZWN0aW9uX2xvY2sgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworfQorCisvKioKKyAqIFJlbGVhc2VzIHRoZSBjb25uZWN0aW9uIGxvY2suCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKi8KK3ZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c0xpc3QgKmV4cGlyZWRfbWVzc2FnZXM7CisgIERCdXNMaXN0ICppdGVyOworCisgIGlmIChUUkFDRV9MT0NLUykKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiVU5MT0NLXG4iKTsKKyAgICB9CisKKyAgLyogSWYgd2UgaGFkIG1lc3NhZ2VzIHRoYXQgZXhwaXJlZCAoZmVsbCBvZmYgdGhlIGluY29taW5nIG9yIG91dGdvaW5nCisgICAqIHF1ZXVlcykgd2hpbGUgd2Ugd2VyZSBsb2NrZWQsIGFjdHVhbGx5IHJlbGVhc2UgdGhlbSBub3cgKi8KKyAgZXhwaXJlZF9tZXNzYWdlcyA9IGNvbm5lY3Rpb24tPmV4cGlyZWRfbWVzc2FnZXM7CisgIGNvbm5lY3Rpb24tPmV4cGlyZWRfbWVzc2FnZXMgPSBOVUxMOworCisgIFJFTEVBU0lOR19MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgX2RidXNfcm11dGV4X3VubG9jayAoY29ubmVjdGlvbi0+bXV0ZXgpOworCisgIGZvciAoaXRlciA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0X2xpbmsgKCZleHBpcmVkX21lc3NhZ2VzKTsKKyAgICAgIGl0ZXIgIT0gTlVMTDsKKyAgICAgIGl0ZXIgPSBfZGJ1c19saXN0X3BvcF9maXJzdF9saW5rICgmZXhwaXJlZF9tZXNzYWdlcykpCisgICAgeworICAgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UgPSBpdGVyLT5kYXRhOworCisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGl0ZXIpOworICAgIH0KK30KKworLyoqCisgKiBXYWtlcyB1cCB0aGUgbWFpbiBsb29wIGlmIGl0IGlzIHNsZWVwaW5nCisgKiBOZWVkZWQgaWYgd2UncmUgZS5nLiBxdWV1ZWluZyBvdXRnb2luZyBtZXNzYWdlcworICogb24gYSB0aHJlYWQgd2hpbGUgdGhlIG1haW5sb29wIHNsZWVwcy4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fd2FrZXVwX21haW5sb29wIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgaWYgKGNvbm5lY3Rpb24tPndha2V1cF9tYWluX2Z1bmN0aW9uKQorICAgICgqY29ubmVjdGlvbi0+d2FrZXVwX21haW5fZnVuY3Rpb24pIChjb25uZWN0aW9uLT53YWtldXBfbWFpbl9kYXRhKTsKK30KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKy8qKgorICogR2V0cyB0aGUgbG9ja3Mgc28gd2UgY2FuIGV4YW1pbmUgdGhlbQorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHBhcmFtIG11dGV4X2xvYyByZXR1cm4gZm9yIHRoZSBsb2NhdGlvbiBvZiB0aGUgbWFpbiBtdXRleCBwb2ludGVyCisgKiBAcGFyYW0gZGlzcGF0Y2hfbXV0ZXhfbG9jIHJldHVybiBsb2NhdGlvbiBvZiB0aGUgZGlzcGF0Y2ggbXV0ZXggcG9pbnRlcgorICogQHBhcmFtIGlvX3BhdGhfbXV0ZXhfbG9jIHJldHVybiBsb2NhdGlvbiBvZiB0aGUgaW9fcGF0aCBtdXRleCBwb2ludGVyCisgKiBAcGFyYW0gZGlzcGF0Y2hfY29uZF9sb2MgcmV0dXJuIGxvY2F0aW9uIG9mIHRoZSBkaXNwYXRjaCBjb25kaXRpb25hbCAKKyAqICAgICAgICB2YXJpYWJsZSBwb2ludGVyCisgKiBAcGFyYW0gaW9fcGF0aF9jb25kX2xvYyByZXR1cm4gbG9jYXRpb24gb2YgdGhlIGlvX3BhdGggY29uZGl0aW9uYWwgCisgKiAgICAgICAgdmFyaWFibGUgcG9pbnRlcgorICovIAordm9pZCAKK19kYnVzX2Nvbm5lY3Rpb25fdGVzdF9nZXRfbG9ja3MgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c011dGV4ICAgICAqKm11dGV4X2xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNdXRleCAgICAgKipkaXNwYXRjaF9tdXRleF9sb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTXV0ZXggICAgICoqaW9fcGF0aF9tdXRleF9sb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29uZFZhciAgICoqZGlzcGF0Y2hfY29uZF9sb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29uZFZhciAgICoqaW9fcGF0aF9jb25kX2xvYykKK3sKKyAgKm11dGV4X2xvYyA9IChEQnVzTXV0ZXggKikgY29ubmVjdGlvbi0+bXV0ZXg7CisgICpkaXNwYXRjaF9tdXRleF9sb2MgPSAoREJ1c011dGV4ICopIGNvbm5lY3Rpb24tPmRpc3BhdGNoX211dGV4OworICAqaW9fcGF0aF9tdXRleF9sb2MgPSAoREJ1c011dGV4ICopIGNvbm5lY3Rpb24tPmlvX3BhdGhfbXV0ZXg7CisgICpkaXNwYXRjaF9jb25kX2xvYyA9IGNvbm5lY3Rpb24tPmRpc3BhdGNoX2NvbmQ7CisgICppb19wYXRoX2NvbmRfbG9jID0gY29ubmVjdGlvbi0+aW9fcGF0aF9jb25kOworfQorI2VuZGlmCisKKy8qKgorICogQWRkcyBhIG1lc3NhZ2UtY29udGFpbmluZyBsaXN0IGxpbmsgdG8gdGhlIGluY29taW5nIG1lc3NhZ2UgcXVldWUsCisgKiB0YWtpbmcgb3duZXJzaGlwIG9mIHRoZSBsaW5rIGFuZCB0aGUgbWVzc2FnZSdzIGN1cnJlbnQgcmVmY291bnQuCisgKiBDYW5ub3QgZmFpbCBkdWUgdG8gbGFjayBvZiBtZW1vcnkuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcGFyYW0gbGluayB0aGUgbWVzc2FnZSBsaW5rIHRvIHF1ZXVlLgorICovCit2b2lkCitfZGJ1c19jb25uZWN0aW9uX3F1ZXVlX3JlY2VpdmVkX21lc3NhZ2VfbGluayAoREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgICAqbGluaykKK3sKKyAgREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nOworICBkYnVzX3VpbnQzMl90IHJlcGx5X3NlcmlhbDsKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIAorICBfZGJ1c19hc3NlcnQgKF9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfYXV0aGVudGljYXRlZCAoY29ubmVjdGlvbi0+dHJhbnNwb3J0KSk7CisgIAorICBfZGJ1c19saXN0X2FwcGVuZF9saW5rICgmY29ubmVjdGlvbi0+aW5jb21pbmdfbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmspOworICBtZXNzYWdlID0gbGluay0+ZGF0YTsKKworICAvKiBJZiB0aGlzIGlzIGEgcmVwbHkgd2UncmUgd2FpdGluZyBvbiwgcmVtb3ZlIHRpbWVvdXQgZm9yIGl0ICovCisgIHJlcGx5X3NlcmlhbCA9IGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5X3NlcmlhbCAhPSAwKQorICAgIHsKKyAgICAgIHBlbmRpbmcgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9pbnQgKGNvbm5lY3Rpb24tPnBlbmRpbmdfcmVwbGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5X3NlcmlhbCk7CisgICAgICBpZiAocGVuZGluZyAhPSBOVUxMKQorCXsKKwkgIGlmIChfZGJ1c19wZW5kaW5nX2NhbGxfaXNfdGltZW91dF9hZGRlZF91bmxvY2tlZCAocGVuZGluZykpCisgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlbW92ZV90aW1lb3V0X3VubG9ja2VkIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX2dldF90aW1lb3V0X3VubG9ja2VkIChwZW5kaW5nKSk7CisKKwkgIF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfdGltZW91dF9hZGRlZF91bmxvY2tlZCAocGVuZGluZywgRkFMU0UpOworCX0KKyAgICB9CisgIAorICAKKworICBjb25uZWN0aW9uLT5uX2luY29taW5nICs9IDE7CisKKyAgX2RidXNfY29ubmVjdGlvbl93YWtldXBfbWFpbmxvb3AgKGNvbm5lY3Rpb24pOworICAKKyAgX2RidXNfdmVyYm9zZSAoIk1lc3NhZ2UgJXAgKCVzICVzICVzICVzICclcycgcmVwbHkgdG8gJXUpIGFkZGVkIHRvIGluY29taW5nIHF1ZXVlICVwLCAlZCBpbmNvbWluZ1xuIiwKKyAgICAgICAgICAgICAgICAgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpKSwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobWVzc2FnZSkgOgorICAgICAgICAgICAgICAgICAibm8gcGF0aCIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBpbnRlcmZhY2UiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgOgorICAgICAgICAgICAgICAgICAibm8gbWVtYmVyIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24tPm5faW5jb21pbmcpOworCisgIF9kYnVzX21lc3NhZ2VfdHJhY2VfcmVmIChtZXNzYWdlLCAtMSwgLTEsCisgICAgICAiX2RidXNfY29uZWN0aW9uX3F1ZXVlX3JlY2VpdmVkX21lc3NhZ2VfbGluayIpOworfQorCisvKioKKyAqIEFkZHMgYSBsaW5rICsgbWVzc2FnZSB0byB0aGUgaW5jb21pbmcgbWVzc2FnZSBxdWV1ZS4KKyAqIENhbid0IGZhaWwuIFRha2VzIG93bmVyc2hpcCBvZiBib3RoIGxpbmsgYW5kIG1lc3NhZ2UuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcGFyYW0gbGluayB0aGUgbGlzdCBub2RlIGFuZCBtZXNzYWdlIHRvIHF1ZXVlLgorICoKKyAqLwordm9pZAorX2RidXNfY29ubmVjdGlvbl9xdWV1ZV9zeW50aGVzaXplZF9tZXNzYWdlX2xpbmsgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCQkJIERCdXNMaXN0ICpsaW5rKQoreworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgX2RidXNfbGlzdF9hcHBlbmRfbGluayAoJmNvbm5lY3Rpb24tPmluY29taW5nX21lc3NhZ2VzLCBsaW5rKTsKKworICBjb25uZWN0aW9uLT5uX2luY29taW5nICs9IDE7CisKKyAgX2RidXNfY29ubmVjdGlvbl93YWtldXBfbWFpbmxvb3AgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX21lc3NhZ2VfdHJhY2VfcmVmIChsaW5rLT5kYXRhLCAtMSwgLTEsCisgICAgICAiX2RidXNfY29ubmVjdGlvbl9xdWV1ZV9zeW50aGVzaXplZF9tZXNzYWdlX2xpbmsiKTsKKworICBfZGJ1c192ZXJib3NlICgiU3ludGhlc2l6ZWQgbWVzc2FnZSAlcCBhZGRlZCB0byBpbmNvbWluZyBxdWV1ZSAlcCwgJWQgaW5jb21pbmdcbiIsCisgICAgICAgICAgICAgICAgIGxpbmstPmRhdGEsIGNvbm5lY3Rpb24sIGNvbm5lY3Rpb24tPm5faW5jb21pbmcpOworfQorCisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlcmUgYXJlIG1lc3NhZ2VzIGluIHRoZSBvdXRnb2luZyBtZXNzYWdlIHF1ZXVlLgorICogQ2FsbGVkIHdpdGggY29ubmVjdGlvbiBsb2NrIGhlbGQuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgb3V0Z29pbmcgcXVldWUgaXMgbm9uLWVtcHR5LgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY29ubmVjdGlvbl9oYXNfbWVzc2FnZXNfdG9fc2VuZF91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIHJldHVybiBjb25uZWN0aW9uLT5vdXRnb2luZ19tZXNzYWdlcyAhPSBOVUxMOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIHRoZXJlIGFyZSBtZXNzYWdlcyBpbiB0aGUgb3V0Z29pbmcgbWVzc2FnZSBxdWV1ZS4KKyAqIFVzZSBkYnVzX2Nvbm5lY3Rpb25fZmx1c2goKSB0byBibG9jayB1bnRpbCBhbGwgb3V0Z29pbmcKKyAqIG1lc3NhZ2VzIGhhdmUgYmVlbiB3cml0dGVuIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICogKHN1Y2ggYXMgYSBzb2NrZXQpLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBvdXRnb2luZyBxdWV1ZSBpcyBub24tZW1wdHkuCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25faGFzX21lc3NhZ2VzX3RvX3NlbmQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBkYnVzX2Jvb2xfdCB2OworICAKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICB2ID0gX2RidXNfY29ubmVjdGlvbl9oYXNfbWVzc2FnZXNfdG9fc2VuZF91bmxvY2tlZCAoY29ubmVjdGlvbik7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworICByZXR1cm4gdjsKK30KKworLyoqCisgKiBHZXRzIHRoZSBuZXh0IG91dGdvaW5nIG1lc3NhZ2UuIFRoZSBtZXNzYWdlIHJlbWFpbnMgaW4gdGhlCisgKiBxdWV1ZSwgYW5kIHRoZSBjYWxsZXIgZG9lcyBub3Qgb3duIGEgcmVmZXJlbmNlIHRvIGl0LgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHJldHVybnMgdGhlIG1lc3NhZ2UgdG8gYmUgc2VudC4KKyAqLyAKK0RCdXNNZXNzYWdlKgorX2RidXNfY29ubmVjdGlvbl9nZXRfbWVzc2FnZV90b19zZW5kIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisgIHJldHVybiBfZGJ1c19saXN0X2dldF9sYXN0ICgmY29ubmVjdGlvbi0+b3V0Z29pbmdfbWVzc2FnZXMpOworfQorCisvKioKKyAqIE5vdGlmaWVzIHRoZSBjb25uZWN0aW9uIHRoYXQgYSBtZXNzYWdlIGhhcyBiZWVuIHNlbnQsIHNvIHRoZQorICogbWVzc2FnZSBjYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBvdXRnb2luZyBxdWV1ZS4KKyAqIENhbGxlZCB3aXRoIHRoZSBjb25uZWN0aW9uIGxvY2sgaGVsZC4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRoYXQgd2FzIHNlbnQuCisgKi8KK3ZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fbWVzc2FnZV9zZW50X3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisgIC8qIFRoaXMgY2FuIGJlIGNhbGxlZCBiZWZvcmUgd2UgZXZlbiBjb21wbGV0ZSBhdXRoZW50aWNhdGlvbiwgc2luY2UKKyAgICogaXQncyBjYWxsZWQgb24gZGlzY29ubmVjdCB0byBjbGVhbiB1cCB0aGUgb3V0Z29pbmcgcXVldWUuCisgICAqIEl0J3MgYWxzbyBjYWxsZWQgYXMgd2Ugc3VjY2Vzc2Z1bGx5IHNlbmQgZWFjaCBtZXNzYWdlLgorICAgKi8KKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9sYXN0X2xpbmsgKCZjb25uZWN0aW9uLT5vdXRnb2luZ19tZXNzYWdlcyk7CisgIF9kYnVzX2Fzc2VydCAobGluayAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChsaW5rLT5kYXRhID09IG1lc3NhZ2UpOworCisgIF9kYnVzX2xpc3RfdW5saW5rICgmY29ubmVjdGlvbi0+b3V0Z29pbmdfbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICBsaW5rKTsKKyAgX2RidXNfbGlzdF9wcmVwZW5kX2xpbmsgKCZjb25uZWN0aW9uLT5leHBpcmVkX21lc3NhZ2VzLCBsaW5rKTsKKworICBjb25uZWN0aW9uLT5uX291dGdvaW5nIC09IDE7CisKKyAgX2RidXNfdmVyYm9zZSAoIk1lc3NhZ2UgJXAgKCVzICVzICVzICVzICclcycpIHJlbW92ZWQgZnJvbSBvdXRnb2luZyBxdWV1ZSAlcCwgJWQgbGVmdCB0byBzZW5kXG4iLAorICAgICAgICAgICAgICAgICBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkpLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBwYXRoIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpIDoKKyAgICAgICAgICAgICAgICAgIm5vIGludGVyZmFjZSIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBtZW1iZXIiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sIGNvbm5lY3Rpb24tPm5fb3V0Z29pbmcpOworCisgIC8qIEl0J3MgT0sgdGhhdCBpbiBwcmluY2lwbGUgd2UgY2FsbCB0aGUgbm90aWZ5IGZ1bmN0aW9uLCBiZWNhdXNlIGZvciB0aGUKKyAgICogb3V0Z29pbmcgbGltaXQsIHRoZXJlIGlzbid0IG9uZSAqLworICBfZGJ1c19tZXNzYWdlX3JlbW92ZV9jb3VudGVyIChtZXNzYWdlLCBjb25uZWN0aW9uLT5vdXRnb2luZ19jb3VudGVyKTsKKworICAvKiBUaGUgbWVzc2FnZSB3aWxsIGFjdHVhbGx5IGJlIHVucmVmZmVkIHdoZW4gd2UgdW5sb2NrICovCit9CisKKy8qKiBGdW5jdGlvbiB0byBiZSBjYWxsZWQgaW4gcHJvdGVjdGVkX2NoYW5nZV93YXRjaCgpIHdpdGggcmVmY291bnQgaGVsZCAqLwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzV2F0Y2hBZGRGdW5jdGlvbikgICAgIChEQnVzV2F0Y2hMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICp3YXRjaCk7CisvKiogRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGluIHByb3RlY3RlZF9jaGFuZ2Vfd2F0Y2goKSB3aXRoIHJlZmNvdW50IGhlbGQgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c1dhdGNoUmVtb3ZlRnVuY3Rpb24pICAoREJ1c1dhdGNoTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAqd2F0Y2gpOworLyoqIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBpbiBwcm90ZWN0ZWRfY2hhbmdlX3dhdGNoKCkgd2l0aCByZWZjb3VudCBoZWxkICovCit0eXBlZGVmIHZvaWQgICAgICAgICgqIERCdXNXYXRjaFRvZ2dsZUZ1bmN0aW9uKSAgKERCdXNXYXRjaExpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICBlbmFibGVkKTsKKworc3RhdGljIGRidXNfYm9vbF90Citwcm90ZWN0ZWRfY2hhbmdlX3dhdGNoIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAgICAgICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2hBZGRGdW5jdGlvbiAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2hSZW1vdmVGdW5jdGlvbiByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2hUb2dnbGVGdW5jdGlvbiB0b2dnbGVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICBlbmFibGVkKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKworICAvKiBUaGUgb3JpZ2luYWwgcHVycG9zZSBvZiBwcm90ZWN0ZWRfY2hhbmdlX3dhdGNoKCkgd2FzIHRvIGhvbGQgYQorICAgKiByZWYgb24gdGhlIGNvbm5lY3Rpb24gd2hpbGUgZHJvcHBpbmcgdGhlIGNvbm5lY3Rpb24gbG9jaywgdGhlbgorICAgKiBjYWxsaW5nIG91dCB0byB0aGUgYXBwLiAgVGhpcyB3YXMgYSBicm9rZW4gaGFjayB0aGF0IGRpZCBub3QKKyAgICogd29yaywgc2luY2UgdGhlIGNvbm5lY3Rpb24gd2FzIGluIGEgaG9zZWQgc3RhdGUgKG5vIFdhdGNoTGlzdAorICAgKiBmaWVsZCkgd2hpbGUgY2FsbGluZyBvdXQuCisgICAqCisgICAqIFNvIGZvciBub3cgd2UnbGwganVzdCBrZWVwIHRoZSBsb2NrIHdoaWxlIGNhbGxpbmcgb3V0LiBUaGlzIG1lYW5zCisgICAqIGFwcHMgYXJlIG5vdCBhbGxvd2VkIHRvIGNhbGwgREJ1c0Nvbm5lY3Rpb24gbWV0aG9kcyBpbnNpZGUgYQorICAgKiB3YXRjaCBmdW5jdGlvbiBvciB0aGV5IHdpbGwgZGVhZGxvY2suCisgICAqCisgICAqIFRoZSAicmVhbCBmaXgiIGlzIHRvIHVzZSB0aGUgX2FuZF91bmxvY2soKSBwYXR0ZXJuIGZvdW5kCisgICAqIGVsc2V3aGVyZSBpbiB0aGUgY29kZSwgdG8gZGVmZXIgY2FsbGluZyBvdXQgdG8gdGhlIGFwcCB1bnRpbAorICAgKiB3ZSdyZSBhYm91dCB0byBkcm9wIGxvY2tzIGFuZCByZXR1cm4gZmxvdyBvZiBjb250cm9sIHRvIHRoZSBhcHAKKyAgICogYW55d2F5LgorICAgKgorICAgKiBTZWUgaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9hcmNoaXZlcy9kYnVzLzIwMDctSnVseS90aHJlYWQuaHRtbCM4MTQ0CisgICAqLworCisgIGlmIChjb25uZWN0aW9uLT53YXRjaGVzKQorICAgIHsKKyAgICAgIGlmIChhZGRfZnVuY3Rpb24pCisgICAgICAgIHJldHZhbCA9ICgqIGFkZF9mdW5jdGlvbikgKGNvbm5lY3Rpb24tPndhdGNoZXMsIHdhdGNoKTsKKyAgICAgIGVsc2UgaWYgKHJlbW92ZV9mdW5jdGlvbikKKyAgICAgICAgeworICAgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICAgICAgKCogcmVtb3ZlX2Z1bmN0aW9uKSAoY29ubmVjdGlvbi0+d2F0Y2hlcywgd2F0Y2gpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgICAgICgqIHRvZ2dsZV9mdW5jdGlvbikgKGNvbm5lY3Rpb24tPndhdGNoZXMsIHdhdGNoLCBlbmFibGVkKTsKKyAgICAgICAgfQorICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisgICAgIAorCisvKioKKyAqIEFkZHMgYSB3YXRjaCB1c2luZyB0aGUgY29ubmVjdGlvbidzIERCdXNBZGRXYXRjaEZ1bmN0aW9uIGlmCisgKiBhdmFpbGFibGUuIE90aGVyd2lzZSByZWNvcmRzIHRoZSB3YXRjaCB0byBiZSBhZGRlZCB3aGVuIHNhaWQKKyAqIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZS4gQWxzbyByZS1hZGRzIHRoZSB3YXRjaCBpZiB0aGUKKyAqIERCdXNBZGRXYXRjaEZ1bmN0aW9uIGNoYW5nZXMuIE1heSBmYWlsIGR1ZSB0byBsYWNrIG9mIG1lbW9yeS4KKyAqIENvbm5lY3Rpb24gbG9jayBzaG91bGQgYmUgaGVsZCB3aGVuIGNhbGxpbmcgdGhpcy4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSB3YXRjaCB0aGUgd2F0Y2ggdG8gYWRkLgorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2Nvbm5lY3Rpb25fYWRkX3dhdGNoX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAqd2F0Y2gpCit7CisgIHJldHVybiBwcm90ZWN0ZWRfY2hhbmdlX3dhdGNoIChjb25uZWN0aW9uLCB3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3dhdGNoX2xpc3RfYWRkX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgRkFMU0UpOworfQorCisvKioKKyAqIFJlbW92ZXMgYSB3YXRjaCB1c2luZyB0aGUgY29ubmVjdGlvbidzIERCdXNSZW1vdmVXYXRjaEZ1bmN0aW9uCisgKiBpZiBhdmFpbGFibGUuIEl0J3MgYW4gZXJyb3IgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIG9uIGEgd2F0Y2gKKyAqIHRoYXQgd2FzIG5vdCBwcmV2aW91c2x5IGFkZGVkLgorICogQ29ubmVjdGlvbiBsb2NrIHNob3VsZCBiZSBoZWxkIHdoZW4gY2FsbGluZyB0aGlzLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHBhcmFtIHdhdGNoIHRoZSB3YXRjaCB0byByZW1vdmUuCisgKi8KK3ZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3dhdGNoX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAqd2F0Y2gpCit7CisgIHByb3RlY3RlZF9jaGFuZ2Vfd2F0Y2ggKGNvbm5lY3Rpb24sIHdhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c193YXRjaF9saXN0X3JlbW92ZV93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgRkFMU0UpOworfQorCisvKioKKyAqIFRvZ2dsZXMgYSB3YXRjaCBhbmQgbm90aWZpZXMgYXBwIHZpYSBjb25uZWN0aW9uJ3MKKyAqIERCdXNXYXRjaFRvZ2dsZWRGdW5jdGlvbiBpZiBhdmFpbGFibGUuIEl0J3MgYW4gZXJyb3IgdG8gY2FsbCB0aGlzCisgKiBmdW5jdGlvbiBvbiBhIHdhdGNoIHRoYXQgd2FzIG5vdCBwcmV2aW91c2x5IGFkZGVkLgorICogQ29ubmVjdGlvbiBsb2NrIHNob3VsZCBiZSBoZWxkIHdoZW4gY2FsbGluZyB0aGlzLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHBhcmFtIHdhdGNoIHRoZSB3YXRjaCB0byB0b2dnbGUuCisgKiBAcGFyYW0gZW5hYmxlZCB3aGV0aGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlCisgKi8KK3ZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fdG9nZ2xlX3dhdGNoX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgIGVuYWJsZWQpCit7CisgIF9kYnVzX2Fzc2VydCAod2F0Y2ggIT0gTlVMTCk7CisKKyAgcHJvdGVjdGVkX2NoYW5nZV93YXRjaCAoY29ubmVjdGlvbiwgd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3dhdGNoX2xpc3RfdG9nZ2xlX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkKTsKK30KKworLyoqIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBpbiBwcm90ZWN0ZWRfY2hhbmdlX3RpbWVvdXQoKSB3aXRoIHJlZmNvdW50IGhlbGQgKi8KK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogREJ1c1RpbWVvdXRBZGRGdW5jdGlvbikgICAgKERCdXNUaW1lb3V0TGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAqdGltZW91dCk7CisvKiogRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGluIHByb3RlY3RlZF9jaGFuZ2VfdGltZW91dCgpIHdpdGggcmVmY291bnQgaGVsZCAqLwordHlwZWRlZiB2b2lkICAgICAgICAoKiBEQnVzVGltZW91dFJlbW92ZUZ1bmN0aW9uKSAoREJ1c1RpbWVvdXRMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgICp0aW1lb3V0KTsKKy8qKiBGdW5jdGlvbiB0byBiZSBjYWxsZWQgaW4gcHJvdGVjdGVkX2NoYW5nZV90aW1lb3V0KCkgd2l0aCByZWZjb3VudCBoZWxkICovCit0eXBlZGVmIHZvaWQgICAgICAgICgqIERCdXNUaW1lb3V0VG9nZ2xlRnVuY3Rpb24pIChEQnVzVGltZW91dExpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dCAgICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgIGVuYWJsZWQpOworCitzdGF0aWMgZGJ1c19ib29sX3QKK3Byb3RlY3RlZF9jaGFuZ2VfdGltZW91dCAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dCAgICAgICAgICAgICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0QWRkRnVuY3Rpb24gICAgYWRkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dFJlbW92ZUZ1bmN0aW9uIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXRUb2dnbGVGdW5jdGlvbiB0b2dnbGVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgICAgZW5hYmxlZCkKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisKKyAgLyogVGhlIG9yaWdpbmFsIHB1cnBvc2Ugb2YgcHJvdGVjdGVkX2NoYW5nZV90aW1lb3V0KCkgd2FzIHRvIGhvbGQgYQorICAgKiByZWYgb24gdGhlIGNvbm5lY3Rpb24gd2hpbGUgZHJvcHBpbmcgdGhlIGNvbm5lY3Rpb24gbG9jaywgdGhlbgorICAgKiBjYWxsaW5nIG91dCB0byB0aGUgYXBwLiAgVGhpcyB3YXMgYSBicm9rZW4gaGFjayB0aGF0IGRpZCBub3QKKyAgICogd29yaywgc2luY2UgdGhlIGNvbm5lY3Rpb24gd2FzIGluIGEgaG9zZWQgc3RhdGUgKG5vIFRpbWVvdXRMaXN0CisgICAqIGZpZWxkKSB3aGlsZSBjYWxsaW5nIG91dC4KKyAgICoKKyAgICogU28gZm9yIG5vdyB3ZSdsbCBqdXN0IGtlZXAgdGhlIGxvY2sgd2hpbGUgY2FsbGluZyBvdXQuIFRoaXMgbWVhbnMKKyAgICogYXBwcyBhcmUgbm90IGFsbG93ZWQgdG8gY2FsbCBEQnVzQ29ubmVjdGlvbiBtZXRob2RzIGluc2lkZSBhCisgICAqIHRpbWVvdXQgZnVuY3Rpb24gb3IgdGhleSB3aWxsIGRlYWRsb2NrLgorICAgKgorICAgKiBUaGUgInJlYWwgZml4IiBpcyB0byB1c2UgdGhlIF9hbmRfdW5sb2NrKCkgcGF0dGVybiBmb3VuZAorICAgKiBlbHNld2hlcmUgaW4gdGhlIGNvZGUsIHRvIGRlZmVyIGNhbGxpbmcgb3V0IHRvIHRoZSBhcHAgdW50aWwKKyAgICogd2UncmUgYWJvdXQgdG8gZHJvcCBsb2NrcyBhbmQgcmV0dXJuIGZsb3cgb2YgY29udHJvbCB0byB0aGUgYXBwCisgICAqIGFueXdheS4KKyAgICoKKyAgICogU2VlIGh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvYXJjaGl2ZXMvZGJ1cy8yMDA3LUp1bHkvdGhyZWFkLmh0bWwjODE0NAorICAgKi8KKworICBpZiAoY29ubmVjdGlvbi0+dGltZW91dHMpCisgICAgeworICAgICAgaWYgKGFkZF9mdW5jdGlvbikKKyAgICAgICAgcmV0dmFsID0gKCogYWRkX2Z1bmN0aW9uKSAoY29ubmVjdGlvbi0+dGltZW91dHMsIHRpbWVvdXQpOworICAgICAgZWxzZSBpZiAocmVtb3ZlX2Z1bmN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgICAgICAoKiByZW1vdmVfZnVuY3Rpb24pIChjb25uZWN0aW9uLT50aW1lb3V0cywgdGltZW91dCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICAgICAgKCogdG9nZ2xlX2Z1bmN0aW9uKSAoY29ubmVjdGlvbi0+dGltZW91dHMsIHRpbWVvdXQsIGVuYWJsZWQpOworICAgICAgICB9CisgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBBZGRzIGEgdGltZW91dCB1c2luZyB0aGUgY29ubmVjdGlvbidzIERCdXNBZGRUaW1lb3V0RnVuY3Rpb24gaWYKKyAqIGF2YWlsYWJsZS4gT3RoZXJ3aXNlIHJlY29yZHMgdGhlIHRpbWVvdXQgdG8gYmUgYWRkZWQgd2hlbiBzYWlkCisgKiBmdW5jdGlvbiBpcyBhdmFpbGFibGUuIEFsc28gcmUtYWRkcyB0aGUgdGltZW91dCBpZiB0aGUKKyAqIERCdXNBZGRUaW1lb3V0RnVuY3Rpb24gY2hhbmdlcy4gTWF5IGZhaWwgZHVlIHRvIGxhY2sgb2YgbWVtb3J5LgorICogVGhlIHRpbWVvdXQgd2lsbCBmaXJlIHJlcGVhdGVkbHkgdW50aWwgcmVtb3ZlZC4KKyAqIENvbm5lY3Rpb24gbG9jayBzaG91bGQgYmUgaGVsZCB3aGVuIGNhbGxpbmcgdGhpcy4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0IHRvIGFkZC4KKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jb25uZWN0aW9uX2FkZF90aW1lb3V0X3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICp0aW1lb3V0KQoreworICByZXR1cm4gcHJvdGVjdGVkX2NoYW5nZV90aW1lb3V0IChjb25uZWN0aW9uLCB0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c190aW1lb3V0X2xpc3RfYWRkX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIEZBTFNFKTsKK30KKworLyoqCisgKiBSZW1vdmVzIGEgdGltZW91dCB1c2luZyB0aGUgY29ubmVjdGlvbidzIERCdXNSZW1vdmVUaW1lb3V0RnVuY3Rpb24KKyAqIGlmIGF2YWlsYWJsZS4gSXQncyBhbiBlcnJvciB0byBjYWxsIHRoaXMgZnVuY3Rpb24gb24gYSB0aW1lb3V0CisgKiB0aGF0IHdhcyBub3QgcHJldmlvdXNseSBhZGRlZC4KKyAqIENvbm5lY3Rpb24gbG9jayBzaG91bGQgYmUgaGVsZCB3aGVuIGNhbGxpbmcgdGhpcy4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0IHRvIHJlbW92ZS4KKyAqLwordm9pZAorX2RidXNfY29ubmVjdGlvbl9yZW1vdmVfdGltZW91dF91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dCAgICAqdGltZW91dCkKK3sKKyAgcHJvdGVjdGVkX2NoYW5nZV90aW1lb3V0IChjb25uZWN0aW9uLCB0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdGltZW91dF9saXN0X3JlbW92ZV90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIEZBTFNFKTsKK30KKworLyoqCisgKiBUb2dnbGVzIGEgdGltZW91dCBhbmQgbm90aWZpZXMgYXBwIHZpYSBjb25uZWN0aW9uJ3MKKyAqIERCdXNUaW1lb3V0VG9nZ2xlZEZ1bmN0aW9uIGlmIGF2YWlsYWJsZS4gSXQncyBhbiBlcnJvciB0byBjYWxsIHRoaXMKKyAqIGZ1bmN0aW9uIG9uIGEgdGltZW91dCB0aGF0IHdhcyBub3QgcHJldmlvdXNseSBhZGRlZC4KKyAqIENvbm5lY3Rpb24gbG9jayBzaG91bGQgYmUgaGVsZCB3aGVuIGNhbGxpbmcgdGhpcy4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0IHRvIHRvZ2dsZS4KKyAqIEBwYXJhbSBlbmFibGVkIHdoZXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUKKyAqLwordm9pZAorX2RidXNfY29ubmVjdGlvbl90b2dnbGVfdGltZW91dF91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBlbmFibGVkKQoreworICBwcm90ZWN0ZWRfY2hhbmdlX3RpbWVvdXQgKGNvbm5lY3Rpb24sIHRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c190aW1lb3V0X2xpc3RfdG9nZ2xlX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfY29ubmVjdGlvbl9hdHRhY2hfcGVuZGluZ19jYWxsX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZykKK3sKKyAgZGJ1c191aW50MzJfdCByZXBseV9zZXJpYWw7CisgIERCdXNUaW1lb3V0ICp0aW1lb3V0OworCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisKKyAgcmVwbHlfc2VyaWFsID0gX2RidXNfcGVuZGluZ19jYWxsX2dldF9yZXBseV9zZXJpYWxfdW5sb2NrZWQgKHBlbmRpbmcpOworCisgIF9kYnVzX2Fzc2VydCAocmVwbHlfc2VyaWFsICE9IDApOworCisgIHRpbWVvdXQgPSBfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X3RpbWVvdXRfdW5sb2NrZWQgKHBlbmRpbmcpOworCisgIGlmICh0aW1lb3V0KQorICAgIHsKKyAgICAgIGlmICghX2RidXNfY29ubmVjdGlvbl9hZGRfdGltZW91dF91bmxvY2tlZCAoY29ubmVjdGlvbiwgdGltZW91dCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9pbnQgKGNvbm5lY3Rpb24tPnBlbmRpbmdfcmVwbGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseV9zZXJpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZykpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlbW92ZV90aW1lb3V0X3VubG9ja2VkIChjb25uZWN0aW9uLCB0aW1lb3V0KTsKKworICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfdGltZW91dF9hZGRlZF91bmxvY2tlZCAocGVuZGluZywgRkFMU0UpOworICAgICAgICAgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAKKyAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfdGltZW91dF9hZGRlZF91bmxvY2tlZCAocGVuZGluZywgVFJVRSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9pbnQgKGNvbm5lY3Rpb24tPnBlbmRpbmdfcmVwbGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseV9zZXJpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZykpCisgICAgICAgIHsKKyAgICAgICAgICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICBfZGJ1c19wZW5kaW5nX2NhbGxfcmVmX3VubG9ja2VkIChwZW5kaW5nKTsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX3BlbmRpbmdfY2FsbF9vbl9oYXNoX3JlbW92YWwgKHZvaWQgKmRhdGEpCit7CisgIERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZzsKKyAgREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uOworICAKKyAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgcGVuZGluZyA9IGRhdGE7CisKKyAgY29ubmVjdGlvbiA9IF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29ubmVjdGlvbl91bmxvY2tlZCAocGVuZGluZyk7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisgIGlmIChfZGJ1c19wZW5kaW5nX2NhbGxfaXNfdGltZW91dF9hZGRlZF91bmxvY2tlZCAocGVuZGluZykpCisgICAgeworICAgICAgX2RidXNfY29ubmVjdGlvbl9yZW1vdmVfdGltZW91dF91bmxvY2tlZCAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfdGltZW91dF91bmxvY2tlZCAocGVuZGluZykpOworICAgICAgCisgICAgICBfZGJ1c19wZW5kaW5nX2NhbGxfc2V0X3RpbWVvdXRfYWRkZWRfdW5sb2NrZWQgKHBlbmRpbmcsIEZBTFNFKTsKKyAgICB9CisKKyAgLyogRklYTUUgMS4wPyB0aGlzIGlzIHNvcnQgb2YgZGFuZ2Vyb3VzIGFuZCB1bmRlc2lyYWJsZSB0byBkcm9wIHRoZSBsb2NrIAorICAgKiBoZXJlLCBidXQgdGhlIHBlbmRpbmcgY2FsbCBmaW5hbGl6ZXIgY291bGQgaW4gcHJpbmNpcGxlIGNhbGwgb3V0IHRvIAorICAgKiBhcHBsaWNhdGlvbiBjb2RlIHNvIHdlIHByZXR0eSBtdWNoIGhhdmUgdG8uLi4gc29tZSBsYXJnZXIgY29kZSByZW9yZyAKKyAgICogbWlnaHQgYmUgbmVlZGVkLgorICAgKi8KKyAgX2RidXNfY29ubmVjdGlvbl9yZWZfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworICBfZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWZfYW5kX3VubG9jayAocGVuZGluZyk7CisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Nvbm5lY3Rpb25fdW5yZWZfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworfQorCitzdGF0aWMgdm9pZAorX2RidXNfY29ubmVjdGlvbl9kZXRhY2hfcGVuZGluZ19jYWxsX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZykKK3sKKyAgLyogVGhpcyBlbmRzIHVwIHVubG9ja2luZyB0byBjYWxsIHRoZSBwZW5kaW5nIGNhbGwgZmluYWxpemVyLCB3aGljaCBpcyB1bmV4cGVjdGVkIHRvCisgICAqIHNheSB0aGUgbGVhc3QuCisgICAqLworICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9pbnQgKGNvbm5lY3Rpb24tPnBlbmRpbmdfcmVwbGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X3JlcGx5X3NlcmlhbF91bmxvY2tlZCAocGVuZGluZykpOworfQorCitzdGF0aWMgdm9pZAorX2RidXNfY29ubmVjdGlvbl9kZXRhY2hfcGVuZGluZ19jYWxsX2FuZF91bmxvY2sgKERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcpCit7CisgIC8qIFRoZSBpZGVhIGhlcmUgaXMgdG8gYXZvaWQgZmluYWxpemluZyB0aGUgcGVuZGluZyBjYWxsCisgICAqIHdpdGggdGhlIGxvY2sgaGVsZCwgc2luY2UgdGhlcmUncyBhIGRlc3Ryb3kgbm90aWZpZXIKKyAgICogaW4gcGVuZGluZyBjYWxsIHRoYXQgZ29lcyBvdXQgdG8gYXBwbGljYXRpb24gY29kZS4KKyAgICoKKyAgICogVGhlcmUncyBhbiBleHRyYSB1bmxvY2sgaW5zaWRlIHRoZSBoYXNoIHRhYmxlCisgICAqICJmcmVlIHBlbmRpbmcgY2FsbCIgZnVuY3Rpb24gRklYTUUuLi4KKyAgICovCisgIF9kYnVzX3BlbmRpbmdfY2FsbF9yZWZfdW5sb2NrZWQgKHBlbmRpbmcpOworICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9pbnQgKGNvbm5lY3Rpb24tPnBlbmRpbmdfcmVwbGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X3JlcGx5X3NlcmlhbF91bmxvY2tlZCAocGVuZGluZykpOworCisgIGlmIChfZGJ1c19wZW5kaW5nX2NhbGxfaXNfdGltZW91dF9hZGRlZF91bmxvY2tlZCAocGVuZGluZykpCisgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlbW92ZV90aW1lb3V0X3VubG9ja2VkIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICBfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X3RpbWVvdXRfdW5sb2NrZWQgKHBlbmRpbmcpKTsKKworICBfZGJ1c19wZW5kaW5nX2NhbGxfc2V0X3RpbWVvdXRfYWRkZWRfdW5sb2NrZWQgKHBlbmRpbmcsIEZBTFNFKTsKKworICBfZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWZfYW5kX3VubG9jayAocGVuZGluZyk7Cit9CisKKy8qKgorICogUmVtb3ZlcyBhIHBlbmRpbmcgY2FsbCBmcm9tIHRoZSBjb25uZWN0aW9uLCBzdWNoIHRoYXQKKyAqIHRoZSBwZW5kaW5nIHJlcGx5IHdpbGwgYmUgaWdub3JlZC4gTWF5IGRyb3AgdGhlIGxhc3QKKyAqIHJlZmVyZW5jZSB0byB0aGUgcGVuZGluZyBjYWxsLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZyBjYWxsCisgKi8KK3ZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3BlbmRpbmdfY2FsbCAoREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcpCit7CisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Nvbm5lY3Rpb25fZGV0YWNoX3BlbmRpbmdfY2FsbF9hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBwZW5kaW5nKTsKK30KKworLyoqCisgKiBBY3F1aXJlIHRoZSB0cmFuc3BvcnRlciBJL08gcGF0aC4gVGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlCisgKiBkb2luZyBhbnkgSS9PIGluIHRoZSB0cmFuc3BvcnRlci4gTWF5IHNsZWVwIGFuZCBkcm9wIHRoZQorICogSU8gcGF0aCBtdXRleCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgSS9PIHBhdGguCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcGFyYW0gdGltZW91dF9taWxsaXNlY29uZHMgbWF4aW11bSBibG9ja2luZyB0aW1lLCBvciAtMSBmb3Igbm8gbGltaXQuCisgKiBAcmV0dXJucyBUUlVFIGlmIHRoZSBJL08gcGF0aCB3YXMgYWNxdWlyZWQuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfY29ubmVjdGlvbl9hY3F1aXJlX2lvX3BhdGggKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCSAgaW50ICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKQoreworICBkYnVzX2Jvb2xfdCB3ZV9hY3F1aXJlZDsKKyAgCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisKKyAgLyogV2UgZG9uJ3Qgd2FudCB0aGUgY29ubmVjdGlvbiB0byB2YW5pc2ggKi8KKyAgX2RidXNfY29ubmVjdGlvbl9yZWZfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgIC8qIFdlIHdpbGwgb25seSB0b3VjaCBpb19wYXRoX2FjcXVpcmVkIHdoaWNoIGlzIHByb3RlY3RlZCBieSBvdXIgbXV0ZXggKi8KKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgX2RidXNfdmVyYm9zZSAoImxvY2tpbmcgaW9fcGF0aF9tdXRleFxuIik7CisgIF9kYnVzX2NtdXRleF9sb2NrIChjb25uZWN0aW9uLT5pb19wYXRoX211dGV4KTsKKworICBfZGJ1c192ZXJib3NlICgic3RhcnQgY29ubmVjdGlvbi0+aW9fcGF0aF9hY3F1aXJlZCA9ICVkIHRpbWVvdXQgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi0+aW9fcGF0aF9hY3F1aXJlZCwgdGltZW91dF9taWxsaXNlY29uZHMpOworCisgIHdlX2FjcXVpcmVkID0gRkFMU0U7CisgIAorICBpZiAoY29ubmVjdGlvbi0+aW9fcGF0aF9hY3F1aXJlZCkKKyAgICB7CisgICAgICBpZiAodGltZW91dF9taWxsaXNlY29uZHMgIT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgid2FpdGluZyAlZCBmb3IgSU8gcGF0aCB0byBiZSBhY3F1aXJhYmxlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKKworICAgICAgICAgIGlmICghX2RidXNfY29uZHZhcl93YWl0X3RpbWVvdXQgKGNvbm5lY3Rpb24tPmlvX3BhdGhfY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLT5pb19wYXRoX211dGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogV2UgdGltZWQgb3V0IGJlZm9yZSBhbnlvbmUgc2lnbmFsZWQuICovCisgICAgICAgICAgICAgIC8qICh3cml0aW5nIHRoZSBsb29wIHRvIGhhbmRsZSB0aGUgIXRpbWVkb3V0IGNhc2UgYnkKKyAgICAgICAgICAgICAgICogd2FpdGluZyBsb25nZXIgaWYgbmVlZGVkIGlzIGEgcGFpbiBzaW5jZSBkYnVzCisgICAgICAgICAgICAgICAqIHdyYXBzIHB0aHJlYWRfY29uZF90aW1lZHdhaXQgdG8gdGFrZSBhIHJlbGF0aXZlCisgICAgICAgICAgICAgICAqIHRpbWUgaW5zdGVhZCBvZiBhYnNvbHV0ZSwgc29tZXRoaW5nIGtpbmQgb2Ygc3R1cGlkCisgICAgICAgICAgICAgICAqIG9uIG91ciBwYXJ0LiBmb3Igbm93IGl0IGRvZXNuJ3QgbWF0dGVyLCB3ZSB3aWxsIGp1c3QKKyAgICAgICAgICAgICAgICogZW5kIHVwIGJhY2sgaGVyZSBldmVudHVhbGx5LikKKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHdoaWxlIChjb25uZWN0aW9uLT5pb19wYXRoX2FjcXVpcmVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgid2FpdGluZyBmb3IgSU8gcGF0aCB0byBiZSBhY3F1aXJhYmxlXG4iKTsKKyAgICAgICAgICAgICAgX2RidXNfY29uZHZhcl93YWl0IChjb25uZWN0aW9uLT5pb19wYXRoX2NvbmQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24tPmlvX3BhdGhfbXV0ZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAKKyAgaWYgKCFjb25uZWN0aW9uLT5pb19wYXRoX2FjcXVpcmVkKQorICAgIHsKKyAgICAgIHdlX2FjcXVpcmVkID0gVFJVRTsKKyAgICAgIGNvbm5lY3Rpb24tPmlvX3BhdGhfYWNxdWlyZWQgPSBUUlVFOworICAgIH0KKyAgCisgIF9kYnVzX3ZlcmJvc2UgKCJlbmQgY29ubmVjdGlvbi0+aW9fcGF0aF9hY3F1aXJlZCA9ICVkIHdlX2FjcXVpcmVkID0gJWRcbiIsCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24tPmlvX3BhdGhfYWNxdWlyZWQsIHdlX2FjcXVpcmVkKTsKKworICBfZGJ1c192ZXJib3NlICgidW5sb2NraW5nIGlvX3BhdGhfbXV0ZXhcbiIpOworICBfZGJ1c19jbXV0ZXhfdW5sb2NrIChjb25uZWN0aW9uLT5pb19wYXRoX211dGV4KTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKworICBfZGJ1c19jb25uZWN0aW9uX3VucmVmX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKyAgCisgIHJldHVybiB3ZV9hY3F1aXJlZDsKK30KKworLyoqCisgKiBSZWxlYXNlIHRoZSBJL08gcGF0aCB3aGVuIHlvdSdyZSBkb25lIHdpdGggaXQuIE9ubHkgY2FsbAorICogYWZ0ZXIgeW91J3ZlIGFjcXVpcmVkIHRoZSBJL08uIFdha2VzIHVwIGF0IG1vc3Qgb25lIHRocmVhZAorICogY3VycmVudGx5IHdhaXRpbmcgdG8gYWNxdWlyZSB0aGUgSS9PIHBhdGguCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkCitfZGJ1c19jb25uZWN0aW9uX3JlbGVhc2VfaW9fcGF0aCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIAorICBfZGJ1c192ZXJib3NlICgibG9ja2luZyBpb19wYXRoX211dGV4XG4iKTsKKyAgX2RidXNfY211dGV4X2xvY2sgKGNvbm5lY3Rpb24tPmlvX3BhdGhfbXV0ZXgpOworICAKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uLT5pb19wYXRoX2FjcXVpcmVkKTsKKworICBfZGJ1c192ZXJib3NlICgic3RhcnQgY29ubmVjdGlvbi0+aW9fcGF0aF9hY3F1aXJlZCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLT5pb19wYXRoX2FjcXVpcmVkKTsKKyAgCisgIGNvbm5lY3Rpb24tPmlvX3BhdGhfYWNxdWlyZWQgPSBGQUxTRTsKKyAgX2RidXNfY29uZHZhcl93YWtlX29uZSAoY29ubmVjdGlvbi0+aW9fcGF0aF9jb25kKTsKKworICBfZGJ1c192ZXJib3NlICgidW5sb2NraW5nIGlvX3BhdGhfbXV0ZXhcbiIpOworICBfZGJ1c19jbXV0ZXhfdW5sb2NrIChjb25uZWN0aW9uLT5pb19wYXRoX211dGV4KTsKK30KKworLyoqCisgKiBRdWV1ZXMgaW5jb21pbmcgbWVzc2FnZXMgYW5kIHNlbmRzIG91dGdvaW5nIG1lc3NhZ2VzIGZvciB0aGlzCisgKiBjb25uZWN0aW9uLCBvcHRpb25hbGx5IGJsb2NraW5nIGluIHRoZSBwcm9jZXNzLiBFYWNoIGNhbGwgdG8KKyAqIF9kYnVzX2Nvbm5lY3Rpb25fZG9faXRlcmF0aW9uX3VubG9ja2VkKCkgd2lsbCBjYWxsIHNlbGVjdCgpIG9yIHBvbGwoKSBvbmUKKyAqIHRpbWUgYW5kIHRoZW4gcmVhZCBvciB3cml0ZSBkYXRhIGlmIHBvc3NpYmxlLgorICoKKyAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gYmUgYWJsZSB0byBmbHVzaCBvdXRnb2luZworICogbWVzc2FnZXMgb3IgcXVldWUgdXAgaW5jb21pbmcgbWVzc2FnZXMgd2l0aG91dCByZXR1cm5pbmcKKyAqIGNvbnRyb2wgdG8gdGhlIGFwcGxpY2F0aW9uIGFuZCBjYXVzaW5nIHJlZW50cmFuY3kgd2VpcmRuZXNzLgorICoKKyAqIFRoZSBmbGFncyBwYXJhbWV0ZXIgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHdoZXRoZXIgdG8KKyAqIHJlYWQgaW5jb21pbmcgbWVzc2FnZXMsIHdyaXRlIG91dGdvaW5nIG1lc3NhZ2VzLCBvciBib3RoLAorICogYW5kIHdoZXRoZXIgdG8gYmxvY2sgaWYgbm8gaW1tZWRpYXRlIGFjdGlvbiBpcyBwb3NzaWJsZS4KKyAqCisgKiBUaGUgdGltZW91dF9taWxsaXNlY29uZHMgcGFyYW1ldGVyIGRvZXMgbm90aGluZyB1bmxlc3MgdGhlCisgKiBpdGVyYXRpb24gaXMgYmxvY2tpbmcuCisgKgorICogSWYgdGhlcmUgYXJlIG5vIG91dGdvaW5nIG1lc3NhZ2VzIGFuZCBEQlVTX0lURVJBVElPTl9ET19SRUFESU5HCisgKiB3YXNuJ3Qgc3BlY2lmaWVkLCB0aGVuIGl0J3MgaW1wb3NzaWJsZSB0byBibG9jaywgZXZlbiBpZgorICogeW91IHNwZWNpZnkgREJVU19JVEVSQVRJT05fQkxPQ0s7IGluIHRoYXQgY2FzZSB0aGUgZnVuY3Rpb24KKyAqIHJldHVybnMgaW1tZWRpYXRlbHkuCisgKgorICogSWYgcGVuZGluZyBpcyBub3QgTlVMTCB0aGVuIGEgY2hlY2sgaXMgbWFkZSBpZiB0aGUgcGVuZGluZyBjYWxsCisgKiBpcyBjb21wbGV0ZWQgYWZ0ZXIgdGhlIGlvIHBhdGggaGFzIGJlZW4gcmVxdWlyZWQuIElmIHRoZSBjYWxsCisgKiBoYXMgYmVlbiBjb21wbGV0ZWQgbm90aGluZyBpcyBkb25lLiBUaGlzIG11c3QgYmUgZG9uZSBzaW5jZQorICogdGhlIF9kYnVzX2Nvbm5lY3Rpb25fYWNxdWlyZV9pb19wYXRoIHJlbGVhc2VzIHRoZSBjb25uZWN0aW9uCisgKiBsb2NrIGZvciBhIHdoaWxlLgorICoKKyAqIENhbGxlZCB3aXRoIGNvbm5lY3Rpb24gbG9jayBoZWxkLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwgdGhhdCBzaG91bGQgYmUgY2hlY2tlZCBvciBOVUxMCisgKiBAcGFyYW0gZmxhZ3MgaXRlcmF0aW9uIGZsYWdzLgorICogQHBhcmFtIHRpbWVvdXRfbWlsbGlzZWNvbmRzIG1heGltdW0gYmxvY2tpbmcgdGltZSwgb3IgLTEgZm9yIG5vIGxpbWl0LgorICovCit2b2lkCitfZGJ1c19jb25uZWN0aW9uX2RvX2l0ZXJhdGlvbl91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpCit7CisgIF9kYnVzX3ZlcmJvc2UgKCJzdGFydFxuIik7CisgIAorICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgaWYgKGNvbm5lY3Rpb24tPm5fb3V0Z29pbmcgPT0gMCkKKyAgICBmbGFncyAmPSB+REJVU19JVEVSQVRJT05fRE9fV1JJVElORzsKKworICBpZiAoX2RidXNfY29ubmVjdGlvbl9hY3F1aXJlX2lvX3BhdGggKGNvbm5lY3Rpb24sCisJCQkJCShmbGFncyAmIERCVVNfSVRFUkFUSU9OX0JMT0NLKSA/IHRpbWVvdXRfbWlsbGlzZWNvbmRzIDogMCkpCisgICAgeworICAgICAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgICAgIAorICAgICAgaWYgKCAocGVuZGluZyAhPSBOVUxMKSAmJiBfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZF91bmxvY2tlZChwZW5kaW5nKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJwZW5kaW5nIGNhbGwgY29tcGxldGVkIHdoaWxlIGFjcXVpcmluZyBJL08gcGF0aCIpOworICAgICAgICB9CisgICAgICBlbHNlIGlmICggKHBlbmRpbmcgIT0gTlVMTCkgJiYKKyAgICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3BlZWtfZm9yX3JlcGx5X3VubG9ja2VkIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfcmVwbHlfc2VyaWFsX3VubG9ja2VkIChwZW5kaW5nKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgicGVuZGluZyBjYWxsIGNvbXBsZXRlZCB3aGlsZSBhY3F1aXJpbmcgSS9PIHBhdGggKHJlcGx5IGZvdW5kIGluIHF1ZXVlKSIpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c190cmFuc3BvcnRfZG9faXRlcmF0aW9uIChjb25uZWN0aW9uLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlbGVhc2VfaW9fcGF0aCAoY29ubmVjdGlvbik7CisgICAgfQorCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfdmVyYm9zZSAoImVuZFxuIik7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBjb25uZWN0aW9uIGZvciB0aGUgZ2l2ZW4gdHJhbnNwb3J0LiAgQSB0cmFuc3BvcnQKKyAqIHJlcHJlc2VudHMgYSBtZXNzYWdlIHN0cmVhbSB0aGF0IHVzZXMgc29tZSBjb25jcmV0ZSBtZWNoYW5pc20sIHN1Y2gKKyAqIGFzIFVOSVggZG9tYWluIHNvY2tldHMuIE1heSByZXR1cm4gI05VTEwgaWYgaW5zdWZmaWNpZW50CisgKiBtZW1vcnkgZXhpc3RzIHRvIGNyZWF0ZSB0aGUgY29ubmVjdGlvbi4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQuCisgKiBAcmV0dXJucyB0aGUgbmV3IGNvbm5lY3Rpb24sIG9yICNOVUxMIG9uIGZhaWx1cmUuCisgKi8KK0RCdXNDb25uZWN0aW9uKgorX2RidXNfY29ubmVjdGlvbl9uZXdfZm9yX3RyYW5zcG9ydCAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgREJ1c1dhdGNoTGlzdCAqd2F0Y2hfbGlzdDsKKyAgREJ1c1RpbWVvdXRMaXN0ICp0aW1lb3V0X2xpc3Q7CisgIERCdXNIYXNoVGFibGUgKnBlbmRpbmdfcmVwbGllczsKKyAgREJ1c0xpc3QgKmRpc2Nvbm5lY3RfbGluazsKKyAgREJ1c01lc3NhZ2UgKmRpc2Nvbm5lY3RfbWVzc2FnZTsKKyAgREJ1c0NvdW50ZXIgKm91dGdvaW5nX2NvdW50ZXI7CisgIERCdXNPYmplY3RUcmVlICpvYmplY3RzOworICAKKyAgd2F0Y2hfbGlzdCA9IE5VTEw7CisgIGNvbm5lY3Rpb24gPSBOVUxMOworICBwZW5kaW5nX3JlcGxpZXMgPSBOVUxMOworICB0aW1lb3V0X2xpc3QgPSBOVUxMOworICBkaXNjb25uZWN0X2xpbmsgPSBOVUxMOworICBkaXNjb25uZWN0X21lc3NhZ2UgPSBOVUxMOworICBvdXRnb2luZ19jb3VudGVyID0gTlVMTDsKKyAgb2JqZWN0cyA9IE5VTEw7CisgIAorICB3YXRjaF9saXN0ID0gX2RidXNfd2F0Y2hfbGlzdF9uZXcgKCk7CisgIGlmICh3YXRjaF9saXN0ID09IE5VTEwpCisgICAgZ290byBlcnJvcjsKKworICB0aW1lb3V0X2xpc3QgPSBfZGJ1c190aW1lb3V0X2xpc3RfbmV3ICgpOworICBpZiAodGltZW91dF9saXN0ID09IE5VTEwpCisgICAgZ290byBlcnJvcjsgIAorCisgIHBlbmRpbmdfcmVwbGllcyA9CisgICAgX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9JTlQsCisJCQkgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzRnJlZUZ1bmN0aW9uKWZyZWVfcGVuZGluZ19jYWxsX29uX2hhc2hfcmVtb3ZhbCk7CisgIGlmIChwZW5kaW5nX3JlcGxpZXMgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yOworICAKKyAgY29ubmVjdGlvbiA9IGRidXNfbmV3MCAoREJ1c0Nvbm5lY3Rpb24sIDEpOworICBpZiAoY29ubmVjdGlvbiA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3I7CisKKyAgX2RidXNfcm11dGV4X25ld19hdF9sb2NhdGlvbiAoJmNvbm5lY3Rpb24tPm11dGV4KTsKKyAgaWYgKGNvbm5lY3Rpb24tPm11dGV4ID09IE5VTEwpCisgICAgZ290byBlcnJvcjsKKworICBfZGJ1c19jbXV0ZXhfbmV3X2F0X2xvY2F0aW9uICgmY29ubmVjdGlvbi0+aW9fcGF0aF9tdXRleCk7CisgIGlmIChjb25uZWN0aW9uLT5pb19wYXRoX211dGV4ID09IE5VTEwpCisgICAgZ290byBlcnJvcjsKKworICBfZGJ1c19jbXV0ZXhfbmV3X2F0X2xvY2F0aW9uICgmY29ubmVjdGlvbi0+ZGlzcGF0Y2hfbXV0ZXgpOworICBpZiAoY29ubmVjdGlvbi0+ZGlzcGF0Y2hfbXV0ZXggPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yOworICAKKyAgX2RidXNfY29uZHZhcl9uZXdfYXRfbG9jYXRpb24gKCZjb25uZWN0aW9uLT5kaXNwYXRjaF9jb25kKTsKKyAgaWYgKGNvbm5lY3Rpb24tPmRpc3BhdGNoX2NvbmQgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yOworICAKKyAgX2RidXNfY29uZHZhcl9uZXdfYXRfbG9jYXRpb24gKCZjb25uZWN0aW9uLT5pb19wYXRoX2NvbmQpOworICBpZiAoY29ubmVjdGlvbi0+aW9fcGF0aF9jb25kID09IE5VTEwpCisgICAgZ290byBlcnJvcjsKKworICBfZGJ1c19ybXV0ZXhfbmV3X2F0X2xvY2F0aW9uICgmY29ubmVjdGlvbi0+c2xvdF9tdXRleCk7CisgIGlmIChjb25uZWN0aW9uLT5zbG90X211dGV4ID09IE5VTEwpCisgICAgZ290byBlcnJvcjsKKworICBkaXNjb25uZWN0X21lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoREJVU19QQVRIX0xPQ0FMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfTE9DQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlzY29ubmVjdGVkIik7CisgIAorICBpZiAoZGlzY29ubmVjdF9tZXNzYWdlID09IE5VTEwpCisgICAgZ290byBlcnJvcjsKKworICBkaXNjb25uZWN0X2xpbmsgPSBfZGJ1c19saXN0X2FsbG9jX2xpbmsgKGRpc2Nvbm5lY3RfbWVzc2FnZSk7CisgIGlmIChkaXNjb25uZWN0X2xpbmsgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yOworCisgIG91dGdvaW5nX2NvdW50ZXIgPSBfZGJ1c19jb3VudGVyX25ldyAoKTsKKyAgaWYgKG91dGdvaW5nX2NvdW50ZXIgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yOworCisgIG9iamVjdHMgPSBfZGJ1c19vYmplY3RfdHJlZV9uZXcgKGNvbm5lY3Rpb24pOworICBpZiAob2JqZWN0cyA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3I7CisgIAorICBpZiAoX2RidXNfbW9kaWZ5X3NpZ3BpcGUpCisgICAgX2RidXNfZGlzYWJsZV9zaWdwaXBlICgpOworCisgIC8qIGluaXRpYWxpemVkIHRvIDA6IHVzZSBhdG9taWMgb3AgdG8gYXZvaWQgbWl4aW5nIGF0b21pYyBhbmQgbm9uLWF0b21pYyAqLworICBfZGJ1c19hdG9taWNfaW5jICgmY29ubmVjdGlvbi0+cmVmY291bnQpOworICBjb25uZWN0aW9uLT50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisgIGNvbm5lY3Rpb24tPndhdGNoZXMgPSB3YXRjaF9saXN0OworICBjb25uZWN0aW9uLT50aW1lb3V0cyA9IHRpbWVvdXRfbGlzdDsKKyAgY29ubmVjdGlvbi0+cGVuZGluZ19yZXBsaWVzID0gcGVuZGluZ19yZXBsaWVzOworICBjb25uZWN0aW9uLT5vdXRnb2luZ19jb3VudGVyID0gb3V0Z29pbmdfY291bnRlcjsKKyAgY29ubmVjdGlvbi0+ZmlsdGVyX2xpc3QgPSBOVUxMOworICBjb25uZWN0aW9uLT5sYXN0X2Rpc3BhdGNoX3N0YXR1cyA9IERCVVNfRElTUEFUQ0hfQ09NUExFVEU7IC8qIHNvIHdlJ3JlIG5vdGlmaWVkIGZpcnN0IHRpbWUgdGhlcmUncyBkYXRhICovCisgIGNvbm5lY3Rpb24tPm9iamVjdHMgPSBvYmplY3RzOworICBjb25uZWN0aW9uLT5leGl0X29uX2Rpc2Nvbm5lY3QgPSBGQUxTRTsKKyAgY29ubmVjdGlvbi0+c2hhcmVhYmxlID0gRkFMU0U7CisgIGNvbm5lY3Rpb24tPnJvdXRlX3BlZXJfbWVzc2FnZXMgPSBGQUxTRTsKKyAgY29ubmVjdGlvbi0+ZGlzY29ubmVjdGVkX21lc3NhZ2VfYXJyaXZlZCA9IEZBTFNFOworICBjb25uZWN0aW9uLT5kaXNjb25uZWN0ZWRfbWVzc2FnZV9wcm9jZXNzZWQgPSBGQUxTRTsKKyAgCisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgY29ubmVjdGlvbi0+Z2VuZXJhdGlvbiA9IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbjsKKyNlbmRpZgorICAKKyAgX2RidXNfZGF0YV9zbG90X2xpc3RfaW5pdCAoJmNvbm5lY3Rpb24tPnNsb3RfbGlzdCk7CisKKyAgY29ubmVjdGlvbi0+Y2xpZW50X3NlcmlhbCA9IDE7CisKKyAgY29ubmVjdGlvbi0+ZGlzY29ubmVjdF9tZXNzYWdlX2xpbmsgPSBkaXNjb25uZWN0X2xpbms7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgCisgIGlmICghX2RidXNfdHJhbnNwb3J0X3NldF9jb25uZWN0aW9uICh0cmFuc3BvcnQsIGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgX2RidXNfdHJhbnNwb3J0X3JlZiAodHJhbnNwb3J0KTsKKworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfY29ubmVjdGlvbl90cmFjZV9yZWYgKGNvbm5lY3Rpb24sIDAsIDEsICJuZXdfZm9yX3RyYW5zcG9ydCIpOworICByZXR1cm4gY29ubmVjdGlvbjsKKyAgCisgZXJyb3I6CisgIGlmIChkaXNjb25uZWN0X21lc3NhZ2UgIT0gTlVMTCkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKGRpc2Nvbm5lY3RfbWVzc2FnZSk7CisgIAorICBpZiAoZGlzY29ubmVjdF9saW5rICE9IE5VTEwpCisgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGRpc2Nvbm5lY3RfbGluayk7CisgIAorICBpZiAoY29ubmVjdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2NvbmR2YXJfZnJlZV9hdF9sb2NhdGlvbiAoJmNvbm5lY3Rpb24tPmlvX3BhdGhfY29uZCk7CisgICAgICBfZGJ1c19jb25kdmFyX2ZyZWVfYXRfbG9jYXRpb24gKCZjb25uZWN0aW9uLT5kaXNwYXRjaF9jb25kKTsKKyAgICAgIF9kYnVzX3JtdXRleF9mcmVlX2F0X2xvY2F0aW9uICgmY29ubmVjdGlvbi0+bXV0ZXgpOworICAgICAgX2RidXNfY211dGV4X2ZyZWVfYXRfbG9jYXRpb24gKCZjb25uZWN0aW9uLT5pb19wYXRoX211dGV4KTsKKyAgICAgIF9kYnVzX2NtdXRleF9mcmVlX2F0X2xvY2F0aW9uICgmY29ubmVjdGlvbi0+ZGlzcGF0Y2hfbXV0ZXgpOworICAgICAgX2RidXNfcm11dGV4X2ZyZWVfYXRfbG9jYXRpb24gKCZjb25uZWN0aW9uLT5zbG90X211dGV4KTsKKyAgICAgIGRidXNfZnJlZSAoY29ubmVjdGlvbik7CisgICAgfQorICBpZiAocGVuZGluZ19yZXBsaWVzKQorICAgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHBlbmRpbmdfcmVwbGllcyk7CisgIAorICBpZiAod2F0Y2hfbGlzdCkKKyAgICBfZGJ1c193YXRjaF9saXN0X2ZyZWUgKHdhdGNoX2xpc3QpOworCisgIGlmICh0aW1lb3V0X2xpc3QpCisgICAgX2RidXNfdGltZW91dF9saXN0X2ZyZWUgKHRpbWVvdXRfbGlzdCk7CisKKyAgaWYgKG91dGdvaW5nX2NvdW50ZXIpCisgICAgX2RidXNfY291bnRlcl91bnJlZiAob3V0Z29pbmdfY291bnRlcik7CisKKyAgaWYgKG9iamVjdHMpCisgICAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWYgKG9iamVjdHMpOworICAKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogSW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGEgREJ1c0Nvbm5lY3Rpb24uCisgKiBSZXF1aXJlcyB0aGF0IHRoZSBjYWxsZXIgYWxyZWFkeSBob2xkcyB0aGUgY29ubmVjdGlvbiBsb2NrLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHJldHVybnMgdGhlIGNvbm5lY3Rpb24uCisgKi8KK0RCdXNDb25uZWN0aW9uICoKK19kYnVzX2Nvbm5lY3Rpb25fcmVmX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgZGJ1c19pbnQzMl90IG9sZF9yZWZjb3VudDsKKworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbi0+Z2VuZXJhdGlvbiA9PSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24pOworCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisKKyAgb2xkX3JlZmNvdW50ID0gX2RidXNfYXRvbWljX2luYyAoJmNvbm5lY3Rpb24tPnJlZmNvdW50KTsKKyAgX2RidXNfY29ubmVjdGlvbl90cmFjZV9yZWYgKGNvbm5lY3Rpb24sIG9sZF9yZWZjb3VudCwgb2xkX3JlZmNvdW50ICsgMSwKKyAgICAgICJyZWZfdW5sb2NrZWQiKTsKKworICByZXR1cm4gY29ubmVjdGlvbjsKK30KKworLyoqCisgKiBEZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgYSBEQnVzQ29ubmVjdGlvbi4KKyAqIFJlcXVpcmVzIHRoYXQgdGhlIGNhbGxlciBhbHJlYWR5IGhvbGRzIHRoZSBjb25uZWN0aW9uIGxvY2suCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKi8KK3ZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fdW5yZWZfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBkYnVzX2ludDMyX3Qgb2xkX3JlZmNvdW50OworCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uICE9IE5VTEwpOworCisgIG9sZF9yZWZjb3VudCA9IF9kYnVzX2F0b21pY19kZWMgKCZjb25uZWN0aW9uLT5yZWZjb3VudCk7CisKKyAgX2RidXNfY29ubmVjdGlvbl90cmFjZV9yZWYgKGNvbm5lY3Rpb24sIG9sZF9yZWZjb3VudCwgb2xkX3JlZmNvdW50IC0gMSwKKyAgICAgICJ1bnJlZl91bmxvY2tlZCIpOworCisgIGlmIChvbGRfcmVmY291bnQgPT0gMSkKKyAgICBfZGJ1c19jb25uZWN0aW9uX2xhc3RfdW5yZWYgKGNvbm5lY3Rpb24pOworfQorCitzdGF0aWMgZGJ1c191aW50MzJfdAorX2RidXNfY29ubmVjdGlvbl9nZXRfbmV4dF9jbGllbnRfc2VyaWFsIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisKKyAgc2VyaWFsID0gY29ubmVjdGlvbi0+Y2xpZW50X3NlcmlhbCsrOworCisgIGlmIChjb25uZWN0aW9uLT5jbGllbnRfc2VyaWFsID09IDApCisgICAgY29ubmVjdGlvbi0+Y2xpZW50X3NlcmlhbCA9IDE7CisKKyAgcmV0dXJuIHNlcmlhbDsKK30KKworLyoqCisgKiBBIGNhbGxiYWNrIGZvciB1c2Ugd2l0aCBkYnVzX3dhdGNoX25ldygpIHRvIGNyZWF0ZSBhIERCdXNXYXRjaC4KKyAqIAorICogQHRvZG8gVGhpcyBpcyBiYXNpY2FsbHkgYSBoYWNrIC0gd2UgY291bGQgZGVsZXRlIF9kYnVzX3RyYW5zcG9ydF9oYW5kbGVfd2F0Y2goKQorICogYW5kIHRoZSB2aXJ0dWFsIGhhbmRsZV93YXRjaCBpbiBEQnVzVHJhbnNwb3J0IGlmIHdlIGdvdCByaWQgb2YgaXQuCisgKiBUaGUgcmVhc29uIHRoaXMgaXMgc29tZSB3b3JrIGlzIHRocmVhZGluZywgc2VlIHRoZSBfZGJ1c19jb25uZWN0aW9uX2hhbmRsZV93YXRjaCgpCisgKiBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAcGFyYW0gd2F0Y2ggdGhlIHdhdGNoLgorICogQHBhcmFtIGNvbmRpdGlvbiB0aGUgY3VycmVudCBjb25kaXRpb24gb2YgdGhlIGZpbGUgZGVzY3JpcHRvcnMgYmVpbmcgd2F0Y2hlZC4KKyAqIEBwYXJhbSBkYXRhIG11c3QgYmUgYSBwb2ludGVyIHRvIGEgI0RCdXNDb25uZWN0aW9uCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlIElPIGNvbmRpdGlvbiBtYXkgbm90IGhhdmUgYmVlbiBmdWxseSBoYW5kbGVkIGR1ZSB0byBsYWNrIG9mIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY29ubmVjdGlvbl9oYW5kbGVfd2F0Y2ggKERCdXNXYXRjaCAgICAgICAgICAgICAgICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICBjb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzRGlzcGF0Y2hTdGF0dXMgc3RhdHVzOworCisgIGNvbm5lY3Rpb24gPSBkYXRhOworCisgIF9kYnVzX3ZlcmJvc2UgKCJzdGFydFxuIik7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgIGlmICghX2RidXNfY29ubmVjdGlvbl9hY3F1aXJlX2lvX3BhdGggKGNvbm5lY3Rpb24sIDEpKQorICAgIHsKKyAgICAgIC8qIGFub3RoZXIgdGhyZWFkIGlzIGhhbmRsaW5nIHRoZSBtZXNzYWdlICovCisgICAgICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgcmV0dmFsID0gX2RidXNfdHJhbnNwb3J0X2hhbmRsZV93YXRjaCAoY29ubmVjdGlvbi0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRjaCwgY29uZGl0aW9uKTsKKworICBfZGJ1c19jb25uZWN0aW9uX3JlbGVhc2VfaW9fcGF0aCAoY29ubmVjdGlvbik7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKworICBfZGJ1c192ZXJib3NlICgibWlkZGxlXG4iKTsKKyAgCisgIHN0YXR1cyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgLyogdGhpcyBjYWxscyBvdXQgdG8gdXNlciBjb2RlICovCisgIF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBzdGF0dXMpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJlbmRcbiIpOworICAKKyAgcmV0dXJuIHJldHZhbDsKK30KKworX0RCVVNfREVGSU5FX0dMT0JBTF9MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpOworc3RhdGljIERCdXNIYXNoVGFibGUgKnNoYXJlZF9jb25uZWN0aW9ucyA9IE5VTEw7CitzdGF0aWMgREJ1c0xpc3QgKnNoYXJlZF9jb25uZWN0aW9uc19ub19ndWlkID0gTlVMTDsKKworc3RhdGljIHZvaWQKK2Nsb3NlX2Nvbm5lY3Rpb25fb25fc2h1dGRvd24gKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKworICBkYnVzX2Nvbm5lY3Rpb25fcmVmIChjb25uZWN0aW9uKTsKKyAgX2RidXNfY29ubmVjdGlvbl9jbG9zZV9wb3NzaWJseV9zaGFyZWQgKGNvbm5lY3Rpb24pOworCisgIC8qIENodXJuIHRocm91Z2ggdG8gdGhlIERpc2Nvbm5lY3RlZCBtZXNzYWdlICovCisgIHdoaWxlICgobWVzc2FnZSA9IGRidXNfY29ubmVjdGlvbl9wb3BfbWVzc2FnZSAoY29ubmVjdGlvbikpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgfQorICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworfQorCitzdGF0aWMgdm9pZAorc2hhcmVkX2Nvbm5lY3Rpb25zX3NodXRkb3duICh2b2lkICpkYXRhKQoreworICBpbnQgbl9lbnRyaWVzOworICAKKyAgX0RCVVNfTE9DSyAoc2hhcmVkX2Nvbm5lY3Rpb25zKTsKKyAgCisgIC8qIFRoaXMgaXMgYSBsaXR0bGUgYml0IHVucGxlYXNhbnQuLi4gYmV0dGVyIGlkZWFzPyAqLworICB3aGlsZSAoKG5fZW50cmllcyA9IF9kYnVzX2hhc2hfdGFibGVfZ2V0X25fZW50cmllcyAoc2hhcmVkX2Nvbm5lY3Rpb25zKSkgPiAwKQorICAgIHsKKyAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICAgICAgREJ1c0hhc2hJdGVyIGl0ZXI7CisgICAgICAKKyAgICAgIF9kYnVzX2hhc2hfaXRlcl9pbml0IChzaGFyZWRfY29ubmVjdGlvbnMsICZpdGVyKTsKKyAgICAgIF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcik7CisgICAgICAgCisgICAgICBjb25uZWN0aW9uID0gX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpOworCisgICAgICBfREJVU19VTkxPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucyk7CisgICAgICBjbG9zZV9jb25uZWN0aW9uX29uX3NodXRkb3duIChjb25uZWN0aW9uKTsKKyAgICAgIF9EQlVTX0xPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucyk7CisKKyAgICAgIC8qIFRoZSBjb25uZWN0aW9uIHNob3VsZCBub3cgYmUgZGVhZCBhbmQgbm90IGluIG91ciBoYXNoIC4uLiAqLworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19oYXNoX3RhYmxlX2dldF9uX2VudHJpZXMgKHNoYXJlZF9jb25uZWN0aW9ucykgPCBuX2VudHJpZXMpOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2hhc2hfdGFibGVfZ2V0X25fZW50cmllcyAoc2hhcmVkX2Nvbm5lY3Rpb25zKSA9PSAwKTsKKyAgCisgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHNoYXJlZF9jb25uZWN0aW9ucyk7CisgIHNoYXJlZF9jb25uZWN0aW9ucyA9IE5VTEw7CisKKyAgaWYgKHNoYXJlZF9jb25uZWN0aW9uc19ub19ndWlkICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgICAgICBjb25uZWN0aW9uID0gX2RidXNfbGlzdF9wb3BfZmlyc3QgKCZzaGFyZWRfY29ubmVjdGlvbnNfbm9fZ3VpZCk7CisgICAgICB3aGlsZSAoY29ubmVjdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfVU5MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpOworICAgICAgICAgIGNsb3NlX2Nvbm5lY3Rpb25fb25fc2h1dGRvd24gKGNvbm5lY3Rpb24pOworICAgICAgICAgIF9EQlVTX0xPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucyk7CisgICAgICAgICAgY29ubmVjdGlvbiA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0ICgmc2hhcmVkX2Nvbm5lY3Rpb25zX25vX2d1aWQpOworICAgICAgICB9CisgICAgfQorCisgIHNoYXJlZF9jb25uZWN0aW9uc19ub19ndWlkID0gTlVMTDsKKyAgCisgIF9EQlVTX1VOTE9DSyAoc2hhcmVkX2Nvbm5lY3Rpb25zKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citjb25uZWN0aW9uX2xvb2t1cF9zaGFyZWQgKERCdXNBZGRyZXNzRW50cnkgICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAqKnJlc3VsdCkKK3sKKyAgX2RidXNfdmVyYm9zZSAoImNoZWNraW5nIGZvciBleGlzdGluZyBjb25uZWN0aW9uXG4iKTsKKyAgCisgICpyZXN1bHQgPSBOVUxMOworICAKKyAgX0RCVVNfTE9DSyAoc2hhcmVkX2Nvbm5lY3Rpb25zKTsKKworICBpZiAoc2hhcmVkX2Nvbm5lY3Rpb25zID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNyZWF0aW5nIHNoYXJlZF9jb25uZWN0aW9ucyBoYXNoIHRhYmxlXG4iKTsKKyAgICAgIAorICAgICAgc2hhcmVkX2Nvbm5lY3Rpb25zID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19mcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgaWYgKHNoYXJlZF9jb25uZWN0aW9ucyA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfVU5MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3JlZ2lzdGVyX3NodXRkb3duX2Z1bmMgKHNoYXJlZF9jb25uZWN0aW9uc19zaHV0ZG93biwgTlVMTCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChzaGFyZWRfY29ubmVjdGlvbnMpOworICAgICAgICAgIHNoYXJlZF9jb25uZWN0aW9ucyA9IE5VTEw7CisgICAgICAgICAgX0RCVVNfVU5MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c192ZXJib3NlICgiICBzdWNjZXNzZnVsbHkgY3JlYXRlZCBzaGFyZWRfY29ubmVjdGlvbnNcbiIpOworICAgICAgCisgICAgICBfREJVU19VTkxPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucyk7CisgICAgICByZXR1cm4gVFJVRTsgLyogbm8gcG9pbnQgbG9va2luZyB1cCBpbiB0aGUgaGFzaCB3ZSBqdXN0IG1hZGUgKi8KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpndWlkOworCisgICAgICBndWlkID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJndWlkIik7CisgICAgICAKKyAgICAgIGlmIChndWlkICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgICAgICAgICAKKyAgICAgICAgICBjb25uZWN0aW9uID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChzaGFyZWRfY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZCk7CisKKyAgICAgICAgICBpZiAoY29ubmVjdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogVGhlIERCdXNDb25uZWN0aW9uIGNhbid0IGJlIGZpbmFsaXplZCB3aXRob3V0IHRha2luZworICAgICAgICAgICAgICAgKiB0aGUgc2hhcmVkX2Nvbm5lY3Rpb25zIGxvY2sgdG8gcmVtb3ZlIGl0IGZyb20gdGhlCisgICAgICAgICAgICAgICAqIGhhc2guICBTbyBpdCdzIHNhZmUgdG8gcmVmIHRoZSBjb25uZWN0aW9uIGhlcmUuCisgICAgICAgICAgICAgICAqIEhvd2V2ZXIsIGl0IG1heSBiZSBkaXNjb25uZWN0ZWQgaWYgdGhlIERpc2Nvbm5lY3RlZAorICAgICAgICAgICAgICAgKiBtZXNzYWdlIGhhc24ndCBiZWVuIHByb2Nlc3NlZCB5ZXQsIGluIHdoaWNoIGNhc2Ugd2UKKyAgICAgICAgICAgICAgICogd2FudCB0byBwcmV0ZW5kIGl0IGlzbid0IGluIHRoZSBoYXNoIGFuZCBhdm9pZAorICAgICAgICAgICAgICAgKiByZXR1cm5pbmcgaXQuCisgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAqIFRoZSBpZGVhIGlzIHRvIGF2b2lkIGV2ZXIgcmV0dXJuaW5nIGEgZGlzY29ubmVjdGVkIGNvbm5lY3Rpb24KKyAgICAgICAgICAgICAgICogZnJvbSBkYnVzX2Nvbm5lY3Rpb25fb3BlbigpLiBXZSBjb3VsZCBqdXN0IHN5bmNocm9ub3VzbHkKKyAgICAgICAgICAgICAgICogZHJvcCBvdXIgc2hhcmVkIHJlZiB0byB0aGUgY29ubmVjdGlvbiBvbiBjb25uZWN0aW9uIGRpc2Nvbm5lY3QsCisgICAgICAgICAgICAgICAqIGFuZCB0aGVuIGFzc2VydCBoZXJlIHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMgY29ubmVjdGVkLCBidXQKKyAgICAgICAgICAgICAgICogdGhhdCBjYXVzZXMgcmVlbnRyYW5jeSBoZWFkYWNoZXMuCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICAgICAgICAgICAgICBpZiAoX2RidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkX3VubG9ja2VkIChjb25uZWN0aW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCAoY29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAqcmVzdWx0ID0gY29ubmVjdGlvbjsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJsb29rZWQgdXAgZXhpc3RpbmcgY29ubmVjdGlvbiB0byBzZXJ2ZXIgZ3VpZCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJsb29rZWQgdXAgZXhpc3RpbmcgY29ubmVjdGlvbiB0byBzZXJ2ZXIgZ3VpZCAlcyBidXQgaXQgd2FzIGRpc2Nvbm5lY3RlZCBzbyBpZ25vcmluZyBpdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAKKyAgICAgIF9EQlVTX1VOTE9DSyAoc2hhcmVkX2Nvbm5lY3Rpb25zKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90Citjb25uZWN0aW9uX3JlY29yZF9zaGFyZWRfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZ3VpZCkKK3sKKyAgY2hhciAqZ3VpZF9rZXk7CisgIGNoYXIgKmd1aWRfaW5fY29ubmVjdGlvbjsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24tPnNlcnZlcl9ndWlkID09IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24tPnNoYXJlYWJsZSk7CisKKyAgLyogZ2V0IGEgaGFyZCByZWYgb24gdGhpcyBjb25uZWN0aW9uLCBldmVuIGlmCisgICAqIHdlIHdvbid0IGluIGZhY3Qgc3RvcmUgaXQgaW4gdGhlIGhhc2gsIHdlIHN0aWxsCisgICAqIG5lZWQgdG8gaG9sZCBhIHJlZiBvbiBpdCB1bnRpbCBpdCdzIGRpc2Nvbm5lY3RlZC4KKyAgICovCisgIF9kYnVzX2Nvbm5lY3Rpb25fcmVmX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKworICBpZiAoZ3VpZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX0xPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucyk7CisKKyAgICAgIGlmICghX2RidXNfbGlzdF9wcmVwZW5kICgmc2hhcmVkX2Nvbm5lY3Rpb25zX25vX2d1aWQsIGNvbm5lY3Rpb24pKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfVU5MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBfREJVU19VTkxPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucyk7CisgICAgICByZXR1cm4gVFJVRTsgLyogZG9uJ3Qgc3RvcmUgaW4gdGhlIGhhc2ggKi8KKyAgICB9CisgIAorICAvKiBBIHNlcGFyYXRlIGNvcHkgb2YgdGhlIGtleSBpcyByZXF1aXJlZCBpbiB0aGUgaGFzaCB0YWJsZSwgYmVjYXVzZQorICAgKiB3ZSBkb24ndCBoYXZlIGEgbG9jayBvbiB0aGUgY29ubmVjdGlvbiB3aGVuIHdlIGFyZSBkb2luZyBhIGhhc2gKKyAgICogbG9va3VwLgorICAgKi8KKyAgCisgIGd1aWRfa2V5ID0gX2RidXNfc3RyZHVwIChndWlkKTsKKyAgaWYgKGd1aWRfa2V5ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGd1aWRfaW5fY29ubmVjdGlvbiA9IF9kYnVzX3N0cmR1cCAoZ3VpZCk7CisgIGlmIChndWlkX2luX2Nvbm5lY3Rpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKGd1aWRfa2V5KTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBfREJVU19MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpOworICBfZGJ1c19hc3NlcnQgKHNoYXJlZF9jb25uZWN0aW9ucyAhPSBOVUxMKTsKKyAgCisgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nIChzaGFyZWRfY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkX2tleSwgY29ubmVjdGlvbikpCisgICAgeworICAgICAgZGJ1c19mcmVlIChndWlkX2tleSk7CisgICAgICBkYnVzX2ZyZWUgKGd1aWRfaW5fY29ubmVjdGlvbik7CisgICAgICBfREJVU19VTkxPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGNvbm5lY3Rpb24tPnNlcnZlcl9ndWlkID0gZ3VpZF9pbl9jb25uZWN0aW9uOworCisgIF9kYnVzX3ZlcmJvc2UgKCJzdG9yZWQgY29ubmVjdGlvbiB0byAlcyB0byBiZSBzaGFyZWRcbiIsCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24tPnNlcnZlcl9ndWlkKTsKKyAgCisgIF9EQlVTX1VOTE9DSyAoc2hhcmVkX2Nvbm5lY3Rpb25zKTsKKworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24tPnNlcnZlcl9ndWlkICE9IE5VTEwpOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitjb25uZWN0aW9uX2ZvcmdldF9zaGFyZWRfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworCisgIGlmICghY29ubmVjdGlvbi0+c2hhcmVhYmxlKQorICAgIHJldHVybjsKKyAgCisgIF9EQlVTX0xPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucyk7CisgICAgICAKKyAgaWYgKGNvbm5lY3Rpb24tPnNlcnZlcl9ndWlkICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImRyb3BwaW5nIGNvbm5lY3Rpb24gdG8gJXMgb3V0IG9mIHRoZSBzaGFyZWQgdGFibGVcbiIsCisgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLT5zZXJ2ZXJfZ3VpZCk7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfc3RyaW5nIChzaGFyZWRfY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi0+c2VydmVyX2d1aWQpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb25uZWN0aW9uIHdhcyBub3QgaW4gdGhlIHNoYXJlZCB0YWJsZSIpOworICAgICAgCisgICAgICBkYnVzX2ZyZWUgKGNvbm5lY3Rpb24tPnNlcnZlcl9ndWlkKTsKKyAgICAgIGNvbm5lY3Rpb24tPnNlcnZlcl9ndWlkID0gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19saXN0X3JlbW92ZSAoJnNoYXJlZF9jb25uZWN0aW9uc19ub19ndWlkLCBjb25uZWN0aW9uKTsKKyAgICB9CisKKyAgX0RCVVNfVU5MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpOworICAKKyAgLyogcmVtb3ZlIG91ciByZWZlcmVuY2UgaGVsZCBvbiBhbGwgc2hhcmVhYmxlIGNvbm5lY3Rpb25zICovCisgIF9kYnVzX2Nvbm5lY3Rpb25fdW5yZWZfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworfQorCitzdGF0aWMgREJ1c0Nvbm5lY3Rpb24qCitjb25uZWN0aW9uX3RyeV9mcm9tX2FkZHJlc3NfZW50cnkgKERCdXNBZGRyZXNzRW50cnkgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0OworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworICB0cmFuc3BvcnQgPSBfZGJ1c190cmFuc3BvcnRfb3BlbiAoZW50cnksIGVycm9yKTsKKworICBpZiAodHJhbnNwb3J0ID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGNvbm5lY3Rpb24gPSBfZGJ1c19jb25uZWN0aW9uX25ld19mb3JfdHJhbnNwb3J0ICh0cmFuc3BvcnQpOworCisgIF9kYnVzX3RyYW5zcG9ydF91bnJlZiAodHJhbnNwb3J0KTsKKyAgCisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgX2RidXNfYXNzZXJ0ICghY29ubmVjdGlvbi0+aGF2ZV9jb25uZWN0aW9uX2xvY2spOworI2VuZGlmCisgIHJldHVybiBjb25uZWN0aW9uOworfQorCisvKgorICogSWYgdGhlIHNoYXJlZCBwYXJhbWV0ZXIgaXMgdHJ1ZSwgdGhlbiBhbnkgZXhpc3RpbmcgY29ubmVjdGlvbiB3aWxsCisgKiBiZSB1c2VkIChhbmQgaWYgYSBuZXcgY29ubmVjdGlvbiBpcyBjcmVhdGVkLCBpdCB3aWxsIGJlIGF2YWlsYWJsZQorICogZm9yIHVzZSBieSBvdGhlcnMpLiBJZiB0aGUgc2hhcmVkIHBhcmFtZXRlciBpcyBmYWxzZSwgYSBuZXcKKyAqIGNvbm5lY3Rpb24gd2lsbCBhbHdheXMgYmUgY3JlYXRlZCwgYW5kIHRoZSBuZXcgY29ubmVjdGlvbiB3aWxsCisgKiBuZXZlciBiZSByZXR1cm5lZCB0byBvdGhlciBjYWxsZXJzLgorICoKKyAqIEBwYXJhbSBhZGRyZXNzIHRoZSBhZGRyZXNzCisgKiBAcGFyYW0gc2hhcmVkIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gaXMgc2hhcmVkIG9yIHByaXZhdGUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciByZXR1cm4KKyAqIEByZXR1cm5zIHRoZSBjb25uZWN0aW9uIG9yICNOVUxMIG9uIGVycm9yCisgKi8KK3N0YXRpYyBEQnVzQ29ubmVjdGlvbioKK19kYnVzX2Nvbm5lY3Rpb25fb3Blbl9pbnRlcm5hbCAoY29uc3QgY2hhciAgICAgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICBzaGFyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIERCdXNBZGRyZXNzRW50cnkgKiplbnRyaWVzOworICBEQnVzRXJyb3IgdG1wX2Vycm9yID0gREJVU19FUlJPUl9JTklUOworICBEQnVzRXJyb3IgZmlyc3RfZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgIGludCBsZW4sIGk7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgX2RidXNfdmVyYm9zZSAoIm9wZW5pbmcgJXMgY29ubmVjdGlvbiB0bzogJXNcbiIsCisgICAgICAgICAgICAgICAgIHNoYXJlZCA/ICJzaGFyZWQiIDogInByaXZhdGUiLCBhZGRyZXNzKTsKKyAgCisgIGlmICghZGJ1c19wYXJzZV9hZGRyZXNzIChhZGRyZXNzLCAmZW50cmllcywgJmxlbiwgZXJyb3IpKQorICAgIHJldHVybiBOVUxMOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAgY29ubmVjdGlvbiA9IE5VTEw7CisKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgIHsKKyAgICAgIGlmIChzaGFyZWQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIWNvbm5lY3Rpb25fbG9va3VwX3NoYXJlZCAoZW50cmllc1tpXSwgJmNvbm5lY3Rpb24pKQorICAgICAgICAgICAgX0RCVVNfU0VUX09PTSAoJnRtcF9lcnJvcik7CisgICAgICAgIH0KKworICAgICAgaWYgKGNvbm5lY3Rpb24gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uX3RyeV9mcm9tX2FkZHJlc3NfZW50cnkgKGVudHJpZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcF9lcnJvcik7CisKKyAgICAgICAgICBpZiAoY29ubmVjdGlvbiAhPSBOVUxMICYmIHNoYXJlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAqZ3VpZDsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBjb25uZWN0aW9uLT5zaGFyZWFibGUgPSBUUlVFOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIC8qIGd1aWQgbWF5IGJlIE5VTEwgKi8KKyAgICAgICAgICAgICAgZ3VpZCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJpZXNbaV0sICJndWlkIik7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgICAgICAgICAKKyAgICAgICAgICAgICAgaWYgKCFjb25uZWN0aW9uX3JlY29yZF9zaGFyZWRfdW5sb2NrZWQgKGNvbm5lY3Rpb24sIGd1aWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9EQlVTX1NFVF9PT00gKCZ0bXBfZXJyb3IpOworICAgICAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9jbG9zZV9wb3NzaWJseV9zaGFyZWRfYW5kX3VubG9jayAoY29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAKKyAgICAgIGlmIChjb25uZWN0aW9uKQorICAgICAgICBicmVhazsKKworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJnRtcF9lcnJvcik7CisgICAgICAKKyAgICAgIGlmIChpID09IDApCisgICAgICAgIGRidXNfbW92ZV9lcnJvciAoJnRtcF9lcnJvciwgJmZpcnN0X2Vycm9yKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmdG1wX2Vycm9yKTsKKyAgICB9CisgIAorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSICgmdG1wX2Vycm9yKTsKKyAgCisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJmZpcnN0X2Vycm9yKTsKKyAgICAgIGRidXNfbW92ZV9lcnJvciAoJmZpcnN0X2Vycm9yLCBlcnJvcik7CisgICAgfQorICBlbHNlCisgICAgZGJ1c19lcnJvcl9mcmVlICgmZmlyc3RfZXJyb3IpOworICAKKyAgZGJ1c19hZGRyZXNzX2VudHJpZXNfZnJlZSAoZW50cmllcyk7CisgIHJldHVybiBjb25uZWN0aW9uOworfQorCisvKioKKyAqIENsb3NlcyBhIHNoYXJlZCBPUiBwcml2YXRlIGNvbm5lY3Rpb24sIHdoaWxlIGRidXNfY29ubmVjdGlvbl9jbG9zZSgpIGNhbgorICogb25seSBiZSB1c2VkIG9uIHByaXZhdGUgY29ubmVjdGlvbnMuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSB0aGUKKyAqIGRidXMgY29kZSB0aGF0IG93bnMgdGhlIGNvbm5lY3Rpb24gLSBhbiBvd25lciBtdXN0IGJlIGtub3duLAorICogdGhlIG9wZW4vY2xvc2Ugc3RhdGUgaXMgbGlrZSBtYWxsb2MvZnJlZSwgbm90IGxpa2UgcmVmL3VucmVmLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICovCit2b2lkCitfZGJ1c19jb25uZWN0aW9uX2Nsb3NlX3Bvc3NpYmx5X3NoYXJlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uLT5nZW5lcmF0aW9uID09IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbik7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgX2RidXNfY29ubmVjdGlvbl9jbG9zZV9wb3NzaWJseV9zaGFyZWRfYW5kX3VubG9jayAoY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyBEQnVzUHJlYWxsb2NhdGVkU2VuZCoKK19kYnVzX2Nvbm5lY3Rpb25fcHJlYWxsb2NhdGVfc2VuZF91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNQcmVhbGxvY2F0ZWRTZW5kICpwcmVhbGxvY2F0ZWQ7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgCisgIHByZWFsbG9jYXRlZCA9IGRidXNfbmV3IChEQnVzUHJlYWxsb2NhdGVkU2VuZCwgMSk7CisgIGlmIChwcmVhbGxvY2F0ZWQgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBwcmVhbGxvY2F0ZWQtPnF1ZXVlX2xpbmsgPSBfZGJ1c19saXN0X2FsbG9jX2xpbmsgKE5VTEwpOworICBpZiAocHJlYWxsb2NhdGVkLT5xdWV1ZV9saW5rID09IE5VTEwpCisgICAgZ290byBmYWlsZWRfMDsKKworICBwcmVhbGxvY2F0ZWQtPmNvdW50ZXJfbGluayA9IF9kYnVzX2xpc3RfYWxsb2NfbGluayAoY29ubmVjdGlvbi0+b3V0Z29pbmdfY291bnRlcik7CisgIGlmIChwcmVhbGxvY2F0ZWQtPmNvdW50ZXJfbGluayA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkXzE7CisKKyAgX2RidXNfY291bnRlcl9yZWYgKHByZWFsbG9jYXRlZC0+Y291bnRlcl9saW5rLT5kYXRhKTsKKworICBwcmVhbGxvY2F0ZWQtPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAKKyAgcmV0dXJuIHByZWFsbG9jYXRlZDsKKyAgCisgZmFpbGVkXzE6CisgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChwcmVhbGxvY2F0ZWQtPnF1ZXVlX2xpbmspOworIGZhaWxlZF8wOgorICBkYnVzX2ZyZWUgKHByZWFsbG9jYXRlZCk7CisgIAorICByZXR1cm4gTlVMTDsKK30KKworLyogQ2FsbGVkIHdpdGggbG9jayBoZWxkLCBkb2VzIG5vdCB1cGRhdGUgZGlzcGF0Y2ggc3RhdHVzICovCitzdGF0aWMgdm9pZAorX2RidXNfY29ubmVjdGlvbl9zZW5kX3ByZWFsbG9jYXRlZF91bmxvY2tlZF9ub191cGRhdGUgKERCdXNDb25uZWN0aW9uICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQcmVhbGxvY2F0ZWRTZW5kICpwcmVhbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgICAgKmNsaWVudF9zZXJpYWwpCit7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworCisgIHByZWFsbG9jYXRlZC0+cXVldWVfbGluay0+ZGF0YSA9IG1lc3NhZ2U7CisgIF9kYnVzX2xpc3RfcHJlcGVuZF9saW5rICgmY29ubmVjdGlvbi0+b3V0Z29pbmdfbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVhbGxvY2F0ZWQtPnF1ZXVlX2xpbmspOworCisgIC8qIEl0J3MgT0sgdGhhdCB3ZSdsbCBuZXZlciBjYWxsIHRoZSBub3RpZnkgZnVuY3Rpb24sIGJlY2F1c2UgZm9yIHRoZQorICAgKiBvdXRnb2luZyBsaW1pdCwgdGhlcmUgaXNuJ3Qgb25lICovCisgIF9kYnVzX21lc3NhZ2VfYWRkX2NvdW50ZXJfbGluayAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVhbGxvY2F0ZWQtPmNvdW50ZXJfbGluayk7CisKKyAgZGJ1c19mcmVlIChwcmVhbGxvY2F0ZWQpOworICBwcmVhbGxvY2F0ZWQgPSBOVUxMOworICAKKyAgZGJ1c19tZXNzYWdlX3JlZiAobWVzc2FnZSk7CisgIAorICBjb25uZWN0aW9uLT5uX291dGdvaW5nICs9IDE7CisKKyAgX2RidXNfdmVyYm9zZSAoIk1lc3NhZ2UgJXAgKCVzICVzICVzICVzICclcycpIGZvciAlcyBhZGRlZCB0byBvdXRnb2luZyBxdWV1ZSAlcCwgJWQgcGVuZGluZyB0byBzZW5kXG4iLAorICAgICAgICAgICAgICAgICBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkpLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBwYXRoIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpIDoKKyAgICAgICAgICAgICAgICAgIm5vIGludGVyZmFjZSIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBtZW1iZXIiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSkgOgorICAgICAgICAgICAgICAgICAibnVsbCIsCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24tPm5fb3V0Z29pbmcpOworCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAobWVzc2FnZSkgPT0gMCkKKyAgICB7CisgICAgICBzZXJpYWwgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9uZXh0X2NsaWVudF9zZXJpYWwgKGNvbm5lY3Rpb24pOworICAgICAgZGJ1c19tZXNzYWdlX3NldF9zZXJpYWwgKG1lc3NhZ2UsIHNlcmlhbCk7CisgICAgICBpZiAoY2xpZW50X3NlcmlhbCkKKyAgICAgICAgKmNsaWVudF9zZXJpYWwgPSBzZXJpYWw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGNsaWVudF9zZXJpYWwpCisgICAgICAgICpjbGllbnRfc2VyaWFsID0gZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKG1lc3NhZ2UpOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiTWVzc2FnZSAlcCBzZXJpYWwgaXMgJXVcbiIsCisgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsIChtZXNzYWdlKSk7CisgIAorICBkYnVzX21lc3NhZ2VfbG9jayAobWVzc2FnZSk7CisKKyAgLyogTm93IHdlIG5lZWQgdG8gcnVuIGFuIGl0ZXJhdGlvbiB0byBob3BlZnVsbHkganVzdCB3cml0ZSB0aGUgbWVzc2FnZXMKKyAgICogb3V0IGltbWVkaWF0ZWx5LCBhbmQgb3RoZXJ3aXNlIGdldCB0aGVtIHF1ZXVlZCB1cAorICAgKi8KKyAgX2RidXNfY29ubmVjdGlvbl9kb19pdGVyYXRpb25fdW5sb2NrZWQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JVEVSQVRJT05fRE9fV1JJVElORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xKTsKKworICAvKiBJZiBzdHVmZiBpcyBzdGlsbCBxdWV1ZWQgdXAsIGJlIHN1cmUgd2Ugd2FrZSB1cCB0aGUgbWFpbiBsb29wICovCisgIGlmIChjb25uZWN0aW9uLT5uX291dGdvaW5nID4gMCkKKyAgICBfZGJ1c19jb25uZWN0aW9uX3dha2V1cF9tYWlubG9vcCAoY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkCitfZGJ1c19jb25uZWN0aW9uX3NlbmRfcHJlYWxsb2NhdGVkX2FuZF91bmxvY2sgKERCdXNDb25uZWN0aW9uICAgICAgICpjb25uZWN0aW9uLAorCQkJCQkgICAgICAgREJ1c1ByZWFsbG9jYXRlZFNlbmQgKnByZWFsbG9jYXRlZCwKKwkJCQkJICAgICAgIERCdXNNZXNzYWdlICAgICAgICAgICptZXNzYWdlLAorCQkJCQkgICAgICAgZGJ1c191aW50MzJfdCAgICAgICAgKmNsaWVudF9zZXJpYWwpCit7CisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisgIF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF9wcmVhbGxvY2F0ZWRfdW5sb2NrZWRfbm9fdXBkYXRlIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgY2xpZW50X3NlcmlhbCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIm1pZGRsZVxuIik7CisgIHN0YXR1cyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgLyogdGhpcyBjYWxscyBvdXQgdG8gdXNlciBjb2RlICovCisgIF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBzdGF0dXMpOworfQorCisvKioKKyAqIExpa2UgZGJ1c19jb25uZWN0aW9uX3NlbmQoKSwgYnV0IGFzc3VtZXMgdGhlIGNvbm5lY3Rpb24KKyAqIGlzIGFscmVhZHkgbG9ja2VkIG9uIGZ1bmN0aW9uIGVudHJ5LCBhbmQgdW5sb2NrcyBiZWZvcmUgcmV0dXJuaW5nLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBzZW5kCisgKiBAcGFyYW0gY2xpZW50X3NlcmlhbCByZXR1cm4gbG9jYXRpb24gZm9yIGNsaWVudCBzZXJpYWwgb2Ygc2VudCBtZXNzYWdlCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gb3V0LW9mLW1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY29ubmVjdGlvbl9zZW5kX2FuZF91bmxvY2sgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCSAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisJCQkJICBkYnVzX3VpbnQzMl90ICAqY2xpZW50X3NlcmlhbCkKK3sKKyAgREJ1c1ByZWFsbG9jYXRlZFNlbmQgKnByZWFsbG9jYXRlZDsKKworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZSAhPSBOVUxMKTsKKyAgCisgIHByZWFsbG9jYXRlZCA9IF9kYnVzX2Nvbm5lY3Rpb25fcHJlYWxsb2NhdGVfc2VuZF91bmxvY2tlZCAoY29ubmVjdGlvbik7CisgIGlmIChwcmVhbGxvY2F0ZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF9wcmVhbGxvY2F0ZWRfYW5kX3VubG9jayAoY29ubmVjdGlvbiwKKwkJCQkJCSBwcmVhbGxvY2F0ZWQsCisJCQkJCQkgbWVzc2FnZSwKKwkJCQkJCSBjbGllbnRfc2VyaWFsKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogVXNlZCBpbnRlcm5hbGx5IHRvIGhhbmRsZSB0aGUgc2VtYW50aWNzIG9mIGRidXNfc2VydmVyX3NldF9uZXdfY29ubmVjdGlvbl9mdW5jdGlvbigpLgorICogSWYgdGhlIG5ldyBjb25uZWN0aW9uIGZ1bmN0aW9uIGRvZXMgbm90IHJlZiB0aGUgY29ubmVjdGlvbiwgd2Ugd2FudCB0byBjbG9zZSBpdC4KKyAqCisgKiBBIGJpdCBvZiBhIGhhY2ssIHByb2JhYmx5IHRoZSBuZXcgY29ubmVjdGlvbiBmdW5jdGlvbiBzaG91bGQgaGF2ZSByZXR1cm5lZCBhIHZhbHVlCisgKiBmb3Igd2hldGhlciB0byBjbG9zZSwgb3Igc2hvdWxkIGhhdmUgaGFkIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uIGl0c2VsZiBpZiBpdAorICogZGlkbid0IHdhbnQgaXQuCisgKgorICogQnV0LCB0aGlzIHdvcmtzIE9LIGFzIGxvbmcgYXMgdGhlIG5ldyBjb25uZWN0aW9uIGZ1bmN0aW9uIGRvZXNuJ3QgZG8gYW55dGhpbmcKKyAqIGNyYXp5IGxpa2Uga2VlcCB0aGUgY29ubmVjdGlvbiBhcm91bmQgd2l0aG91dCByZWYnaW5nIGl0LgorICoKKyAqIFdlIGhhdmUgdG8gbG9jayB0aGUgY29ubmVjdGlvbiBhY3Jvc3MgcmVmY291bnQgY2hlY2sgYW5kIGNsb3NlIGluIGNhc2UKKyAqIHRoZSBuZXcgY29ubmVjdGlvbiBmdW5jdGlvbiBzcGF3bnMgYSB0aHJlYWQgdGhhdCBjbG9zZXMgYW5kIHVucmVmcy4KKyAqIEluIHRoYXQgY2FzZSwgaWYgdGhlIGFwcCB0aHJlYWQKKyAqIGNsb3NlcyBhbmQgdW5yZWZzIGZpcnN0LCB3ZSdsbCBoYXJtbGVzc2x5IGNsb3NlIGFnYWluOyBpZiB0aGUgYXBwIHRocmVhZAorICogc3RpbGwgaGFzIHRoZSByZWYsIHdlJ2xsIGNsb3NlIGFuZCB0aGVuIHRoZSBhcHAgd2lsbCBjbG9zZSBoYXJtbGVzc2x5LgorICogSWYgdGhlIGFwcCB1bnJlZnMgd2l0aG91dCBjbG9zaW5nLCB0aGUgYXBwIGlzIGJyb2tlbiBzaW5jZSBpZiB0aGUKKyAqIGFwcCByZWZzIGZyb20gdGhlIG5ldyBjb25uZWN0aW9uIGZ1bmN0aW9uIGl0IGlzIHN1cHBvc2VkIHRvIGFsc28gY2xvc2UuCisgKgorICogSWYgd2UgZGlkbid0IGF0b21pY2FsbHkgY2hlY2sgdGhlIHJlZmNvdW50IGFuZCBjbG9zZSB3aXRoIHRoZSBsb2NrIGhlbGQKKyAqIHRob3VnaCwgd2UgY291bGQgc2NyZXcgdGhpcyB1cC4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqLwordm9pZAorX2RidXNfY29ubmVjdGlvbl9jbG9zZV9pZl9vbmx5X29uZV9yZWYgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBkYnVzX2ludDMyX3QgcmVmY291bnQ7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICByZWZjb3VudCA9IF9kYnVzX2F0b21pY19nZXQgKCZjb25uZWN0aW9uLT5yZWZjb3VudCk7CisgIC8qIFRoZSBjYWxsZXIgc2hvdWxkIGhhdmUgYXQgbGVhc3Qgb25lIHJlZiAqLworICBfZGJ1c19hc3NlcnQgKHJlZmNvdW50ID49IDEpOworCisgIGlmIChyZWZjb3VudCA9PSAxKQorICAgIF9kYnVzX2Nvbm5lY3Rpb25fY2xvc2VfcG9zc2libHlfc2hhcmVkX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24pOworICBlbHNlCisgICAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworfQorCisKKy8qKgorICogV2hlbiBhIGZ1bmN0aW9uIHRoYXQgYmxvY2tzIGhhcyBiZWVuIGNhbGxlZCB3aXRoIGEgdGltZW91dCwgYW5kIHdlCisgKiBydW4gb3V0IG9mIG1lbW9yeSwgdGhlIHRpbWUgdG8gd2FpdCBmb3IgbWVtb3J5IGlzIGJhc2VkIG9uIHRoZQorICogdGltZW91dC4gSWYgdGhlIGNhbGxlciB3YXMgd2lsbGluZyB0byBibG9jayBhIGxvbmcgdGltZSB3ZSB3YWl0IGEKKyAqIHJlbGF0aXZlbHkgbG9uZyB0aW1lIGZvciBtZW1vcnksIGlmIHRoZXkgd2VyZSBvbmx5IHdpbGxpbmcgdG8gYmxvY2sKKyAqIGJyaWVmbHkgdGhlbiB3ZSByZXRyeSBmb3IgbWVtb3J5IGF0IGEgcmFwaWQgcmF0ZS4KKyAqCisgKiBAdGltZW91dF9taWxsaXNlY29uZHMgdGhlIHRpbWVvdXQgcmVxdWVzdGVkIGZvciBibG9ja2luZworICovCitzdGF0aWMgdm9pZAorX2RidXNfbWVtb3J5X3BhdXNlX2Jhc2VkX29uX3RpbWVvdXQgKGludCB0aW1lb3V0X21pbGxpc2Vjb25kcykKK3sKKyAgaWYgKHRpbWVvdXRfbWlsbGlzZWNvbmRzID09IC0xKQorICAgIF9kYnVzX3NsZWVwX21pbGxpc2Vjb25kcyAoMTAwMCk7CisgIGVsc2UgaWYgKHRpbWVvdXRfbWlsbGlzZWNvbmRzIDwgMTAwKQorICAgIDsgLyoganVzdCBidXN5IGxvb3AgKi8KKyAgZWxzZSBpZiAodGltZW91dF9taWxsaXNlY29uZHMgPD0gMTAwMCkKKyAgICBfZGJ1c19zbGVlcF9taWxsaXNlY29uZHMgKHRpbWVvdXRfbWlsbGlzZWNvbmRzIC8gMyk7CisgIGVsc2UKKyAgICBfZGJ1c19zbGVlcF9taWxsaXNlY29uZHMgKDEwMDApOworfQorCitzdGF0aWMgREJ1c01lc3NhZ2UgKgorZ2VuZXJhdGVfbG9jYWxfZXJyb3JfbWVzc2FnZSAoZGJ1c191aW50MzJfdCBzZXJpYWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZXJyb3JfbmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICplcnJvcl9tc2cpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ldyAoREJVU19NRVNTQUdFX1RZUEVfRVJST1IpOworICBpZiAoIW1lc3NhZ2UpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UsIGVycm9yX25hbWUpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICBtZXNzYWdlID0gTlVMTDsKKyAgICAgIGdvdG8gb3V0OyAKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3NldF9ub19yZXBseSAobWVzc2FnZSwgVFJVRSk7IAorCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIG1lc3NhZ2UgPSBOVUxMOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmIChlcnJvcl9tc2cgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjsKKworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQgKG1lc3NhZ2UsICZpdGVyKTsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcl9tc2cpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgICBtZXNzYWdlID0gTlVMTDsKKwkgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCisgb3V0OgorICByZXR1cm4gbWVzc2FnZTsKK30KKworLyoKKyAqIFBlZWsgdGhlIGluY29taW5nIHF1ZXVlIHRvIHNlZSBpZiB3ZSBnb3QgcmVwbHkgZm9yIGEgc3BlY2lmaWMgc2VyaWFsCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfY29ubmVjdGlvbl9wZWVrX2Zvcl9yZXBseV91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgY2xpZW50X3NlcmlhbCkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZjb25uZWN0aW9uLT5pbmNvbWluZ19tZXNzYWdlcyk7CisKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTWVzc2FnZSAqcmVwbHkgPSBsaW5rLT5kYXRhOworCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKHJlcGx5KSA9PSBjbGllbnRfc2VyaWFsKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzIHJlcGx5IHRvICVkIGZvdW5kIGluIHF1ZXVlXG4iLCBfREJVU19GVU5DVElPTl9OQU1FLCBjbGllbnRfc2VyaWFsKTsKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmNvbm5lY3Rpb24tPmluY29taW5nX21lc3NhZ2VzLCBsaW5rKTsKKyAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiBUaGlzIGlzIHNsaWdodGx5IHN0cmFuZ2Ugc2luY2Ugd2UgY2FuIHBvcCBhIG1lc3NhZ2UgaGVyZSB3aXRob3V0CisgKiB0aGUgZGlzcGF0Y2ggbG9jay4KKyAqLworc3RhdGljIERCdXNNZXNzYWdlKgorY2hlY2tfZm9yX3JlcGx5X3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgIGNsaWVudF9zZXJpYWwpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNvbm5lY3Rpb24tPmluY29taW5nX21lc3NhZ2VzKTsKKworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNNZXNzYWdlICpyZXBseSA9IGxpbmstPmRhdGE7CisKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAocmVwbHkpID09IGNsaWVudF9zZXJpYWwpCisJeworCSAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAoJmNvbm5lY3Rpb24tPmluY29taW5nX21lc3NhZ2VzLCBsaW5rKTsKKwkgIGNvbm5lY3Rpb24tPm5faW5jb21pbmcgIC09IDE7CisJICByZXR1cm4gcmVwbHk7CisJfQorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmNvbm5lY3Rpb24tPmluY29taW5nX21lc3NhZ2VzLCBsaW5rKTsKKyAgICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitjb25uZWN0aW9uX3RpbWVvdXRfYW5kX2NvbXBsZXRlX2FsbF9wZW5kaW5nX2NhbGxzX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgIC8qIFdlIGNhbid0IGl0ZXJhdGUgb3ZlciB0aGUgaGFzaCBpbiB0aGUgbm9ybWFsIHdheSBzaW5jZSB3ZSdsbCBiZQorICAgICogZHJvcHBpbmcgdGhlIGxvY2sgZm9yIGVhY2ggaXRlbS4gU28gd2UgcmVzdGFydCB0aGUKKyAgICAqIGl0ZXIgZWFjaCB0aW1lIGFzIHdlIGRyYWluIHRoZSBoYXNoIHRhYmxlLgorICAgICovCisgICAKKyAgIHdoaWxlIChfZGJ1c19oYXNoX3RhYmxlX2dldF9uX2VudHJpZXMgKGNvbm5lY3Rpb24tPnBlbmRpbmdfcmVwbGllcykgPiAwKQorICAgIHsKKyAgICAgIERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZzsKKyAgICAgIERCdXNIYXNoSXRlciBpdGVyOworICAgICAgCisgICAgICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAoY29ubmVjdGlvbi0+cGVuZGluZ19yZXBsaWVzLCAmaXRlcik7CisgICAgICBfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpOworICAgICAgIAorICAgICAgcGVuZGluZyA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKTsKKyAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9yZWZfdW5sb2NrZWQgKHBlbmRpbmcpOworICAgICAgIAorICAgICAgX2RidXNfcGVuZGluZ19jYWxsX3F1ZXVlX3RpbWVvdXRfZXJyb3JfdW5sb2NrZWQgKHBlbmRpbmcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24pOworCisgICAgICBpZiAoX2RidXNfcGVuZGluZ19jYWxsX2lzX3RpbWVvdXRfYWRkZWRfdW5sb2NrZWQgKHBlbmRpbmcpKQorICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3RpbWVvdXRfdW5sb2NrZWQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX2dldF90aW1lb3V0X3VubG9ja2VkIChwZW5kaW5nKSk7CisgICAgICBfZGJ1c19wZW5kaW5nX2NhbGxfc2V0X3RpbWVvdXRfYWRkZWRfdW5sb2NrZWQgKHBlbmRpbmcsIEZBTFNFKTsgICAgICAgCisgICAgICBfZGJ1c19oYXNoX2l0ZXJfcmVtb3ZlX2VudHJ5ICgmaXRlcik7CisKKyAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF91bnJlZl9hbmRfdW5sb2NrIChwZW5kaW5nKTsKKyAgICAgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgICAgfQorICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworfQorCitzdGF0aWMgdm9pZAorY29tcGxldGVfcGVuZGluZ19jYWxsX2FuZF91bmxvY2sgKERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICptZXNzYWdlKQoreworICBfZGJ1c19wZW5kaW5nX2NhbGxfc2V0X3JlcGx5X3VubG9ja2VkIChwZW5kaW5nLCBtZXNzYWdlKTsKKyAgX2RidXNfcGVuZGluZ19jYWxsX3JlZl91bmxvY2tlZCAocGVuZGluZyk7IC8qIGluIGNhc2UgdGhlcmUncyBubyBhcHAgd2l0aCBhIHJlZiBoZWxkICovCisgIF9kYnVzX2Nvbm5lY3Rpb25fZGV0YWNoX3BlbmRpbmdfY2FsbF9hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBwZW5kaW5nKTsKKyAKKyAgLyogTXVzdCBiZSBjYWxsZWQgdW5sb2NrZWQgc2luY2UgaXQgaW52b2tlcyBhcHAgY2FsbGJhY2sgKi8KKyAgX2RidXNfcGVuZGluZ19jYWxsX2NvbXBsZXRlIChwZW5kaW5nKTsKKyAgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYgKHBlbmRpbmcpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2Zvcl9yZXBseV9hbmRfdXBkYXRlX2Rpc3BhdGNoX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nKQoreworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisKKyAgcmVwbHkgPSBjaGVja19mb3JfcmVwbHlfdW5sb2NrZWQgKGNvbm5lY3Rpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX2dldF9yZXBseV9zZXJpYWxfdW5sb2NrZWQgKHBlbmRpbmcpKTsKKyAgaWYgKHJlcGx5ICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNoZWNrZWQgZm9yIHJlcGx5XG4iKTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoImRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKCk6IGdvdCByZXBseVxuIik7CisKKyAgICAgIGNvbXBsZXRlX3BlbmRpbmdfY2FsbF9hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBwZW5kaW5nLCByZXBseSk7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICAgICAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgICAgIHN0YXR1cyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCAoY29ubmVjdGlvbik7CisgICAgICBfZGJ1c19jb25uZWN0aW9uX3VwZGF0ZV9kaXNwYXRjaF9zdGF0dXNfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgc3RhdHVzKTsKKyAgICAgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChwZW5kaW5nKTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBCbG9ja3MgdW50aWwgYSBwZW5kaW5nIGNhbGwgdGltZXMgb3V0IG9yIGdldHMgYSByZXBseS4KKyAqCisgKiBEb2VzIG5vdCByZS1lbnRlciB0aGUgbWFpbiBsb29wIG9yIHJ1biBmaWx0ZXIvcGF0aC1yZWdpc3RlcmVkCisgKiBjYWxsYmFja3MuIFRoZSByZXBseSB0byB0aGUgbWVzc2FnZSB3aWxsIG5vdCBiZSBzZWVuIGJ5CisgKiBmaWx0ZXIgY2FsbGJhY2tzLgorICoKKyAqIFJldHVybnMgaW1tZWRpYXRlbHkgaWYgcGVuZGluZyBjYWxsIGFscmVhZHkgZ290IGEgcmVwbHkuCisgKiAKKyAqIEB0b2RvIGNvdWxkIHVzZSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgKGl0IGtlZXBzIHNjYW5uaW5nCisgKiB0aGUgd2hvbGUgbWVzc2FnZSBxdWV1ZSBmb3IgZXhhbXBsZSkKKyAqCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZyBjYWxsIHdlIGJsb2NrIGZvciBhIHJlcGx5IG9uCisgKi8KK3ZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fYmxvY2tfcGVuZGluZ19jYWxsIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcpCit7CisgIGxvbmcgc3RhcnRfdHZfc2VjLCBzdGFydF90dl91c2VjOworICBsb25nIHR2X3NlYywgdHZfdXNlYzsKKyAgREJ1c0Rpc3BhdGNoU3RhdHVzIHN0YXR1czsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIGRidXNfdWludDMyX3QgY2xpZW50X3NlcmlhbDsKKyAgREJ1c1RpbWVvdXQgKnRpbWVvdXQ7CisgIGludCB0aW1lb3V0X21pbGxpc2Vjb25kcywgZWxhcHNlZF9taWxsaXNlY29uZHM7CisKKyAgX2RidXNfYXNzZXJ0IChwZW5kaW5nICE9IE5VTEwpOworCisgIGlmIChkYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29tcGxldGVkIChwZW5kaW5nKSkKKyAgICByZXR1cm47CisKKyAgZGJ1c19wZW5kaW5nX2NhbGxfcmVmIChwZW5kaW5nKTsgLyogbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGNhbGwgY291bGQgYmUgY2FuY2VsZWQgKi8KKworICBjb25uZWN0aW9uID0gX2RidXNfcGVuZGluZ19jYWxsX2dldF9jb25uZWN0aW9uX2FuZF9sb2NrIChwZW5kaW5nKTsKKyAgCisgIC8qIEZsdXNoIG1lc3NhZ2UgcXVldWUgLSBub3RlLCBjYW4gYWZmZWN0IGRpc3BhdGNoIHN0YXR1cyAqLworICBfZGJ1c19jb25uZWN0aW9uX2ZsdXNoX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKworICBjbGllbnRfc2VyaWFsID0gX2RidXNfcGVuZGluZ19jYWxsX2dldF9yZXBseV9zZXJpYWxfdW5sb2NrZWQgKHBlbmRpbmcpOworCisgIC8qIG5vdGUgdGhhdCB0aW1lb3V0X21pbGxpc2Vjb25kcyBpcyBsaW1pdGVkIHRvIGEgc21hbGxpc2ggdmFsdWUKKyAgICogaW4gX2RidXNfcGVuZGluZ19jYWxsX25ldygpIHNvIG92ZXJmbG93cyBhcmVuJ3QgcG9zc2libGUKKyAgICogYmVsb3cKKyAgICovCisgIHRpbWVvdXQgPSBfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X3RpbWVvdXRfdW5sb2NrZWQgKHBlbmRpbmcpOworICBfZGJ1c19nZXRfbW9ub3RvbmljX3RpbWUgKCZzdGFydF90dl9zZWMsICZzdGFydF90dl91c2VjKTsKKyAgaWYgKHRpbWVvdXQpCisgICAgeworICAgICAgdGltZW91dF9taWxsaXNlY29uZHMgPSBkYnVzX3RpbWVvdXRfZ2V0X2ludGVydmFsICh0aW1lb3V0KTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoImRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKCk6IHdpbGwgYmxvY2sgJWQgbWlsbGlzZWNvbmRzIGZvciByZXBseSBzZXJpYWwgJXUgZnJvbSAlbGQgc2VjICVsZCB1c2VjXG4iLAorICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICBjbGllbnRfc2VyaWFsLAorICAgICAgICAgICAgICAgICAgICAgc3RhcnRfdHZfc2VjLCBzdGFydF90dl91c2VjKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcyA9IC0xOworCisgICAgICBfZGJ1c192ZXJib3NlICgiZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2soKTogd2lsbCBibG9jayBmb3IgcmVwbHkgc2VyaWFsICV1XG4iLCBjbGllbnRfc2VyaWFsKTsKKyAgICB9CisKKyAgLyogY2hlY2sgdG8gc2VlIGlmIHdlIGFscmVhZHkgZ290IHRoZSBkYXRhIG9mZiB0aGUgc29ja2V0ICovCisgIC8qIGZyb20gYW5vdGhlciBibG9ja2VkIHBlbmRpbmcgY2FsbCAqLworICBpZiAoY2hlY2tfZm9yX3JlcGx5X2FuZF91cGRhdGVfZGlzcGF0Y2hfdW5sb2NrZWQgKGNvbm5lY3Rpb24sIHBlbmRpbmcpKQorICAgIHJldHVybjsKKworICAvKiBOb3cgd2Ugd2FpdC4uLiAqLworICAvKiBhbHdheXMgYmxvY2sgYXQgbGVhc3Qgb25jZSBhcyB3ZSBrbm93IHdlIGRvbid0IGhhdmUgdGhlIHJlcGx5IHlldCAqLworICBfZGJ1c19jb25uZWN0aW9uX2RvX2l0ZXJhdGlvbl91bmxvY2tlZCAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lURVJBVElPTl9ET19SRUFESU5HIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSVRFUkFUSU9OX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpOworCisgcmVjaGVja19zdGF0dXM6CisKKyAgX2RidXNfdmVyYm9zZSAoInRvcCBvZiByZWNoZWNrXG4iKTsKKyAgCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIAorICAvKiBxdWV1ZSBtZXNzYWdlcyBhbmQgZ2V0IHN0YXR1cyAqLworCisgIHN0YXR1cyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgLyogdGhlIGdldF9jb21wbGV0ZWQoKSBpcyBpbiBjYXNlIGEgZGlzcGF0Y2goKSB3aGlsZSB3ZSB3ZXJlIGJsb2NraW5nCisgICAqIGdvdCB0aGUgcmVwbHkgaW5zdGVhZCBvZiB1cy4KKyAgICovCisgIGlmIChfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZF91bmxvY2tlZCAocGVuZGluZykpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIlBlbmRpbmcgY2FsbCBjb21wbGV0ZWQgYnkgZGlzcGF0Y2hcbiIpOworICAgICAgX2RidXNfY29ubmVjdGlvbl91cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sIHN0YXR1cyk7CisgICAgICBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiAocGVuZGluZyk7CisgICAgICByZXR1cm47CisgICAgfQorICAKKyAgaWYgKHN0YXR1cyA9PSBEQlVTX0RJU1BBVENIX0RBVEFfUkVNQUlOUykKKyAgICB7CisgICAgICBpZiAoY2hlY2tfZm9yX3JlcGx5X2FuZF91cGRhdGVfZGlzcGF0Y2hfdW5sb2NrZWQgKGNvbm5lY3Rpb24sIHBlbmRpbmcpKQorICAgICAgICByZXR1cm47CisgICAgfQorICAKKyAgX2RidXNfZ2V0X21vbm90b25pY190aW1lICgmdHZfc2VjLCAmdHZfdXNlYyk7CisgIGVsYXBzZWRfbWlsbGlzZWNvbmRzID0gKHR2X3NlYyAtIHN0YXJ0X3R2X3NlYykgKiAxMDAwICsKKwkgICh0dl91c2VjIC0gc3RhcnRfdHZfdXNlYykgLyAxMDAwOworICAKKyAgaWYgKCFfZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWRfdW5sb2NrZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIERCdXNNZXNzYWdlICplcnJvcl9tc2c7CisKKyAgICAgIGVycm9yX21zZyA9IGdlbmVyYXRlX2xvY2FsX2Vycm9yX21lc3NhZ2UgKGNsaWVudF9zZXJpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX0RJU0NPTk5FQ1RFRCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29ubmVjdGlvbiB3YXMgZGlzY29ubmVjdGVkIGJlZm9yZSBhIHJlcGx5IHdhcyByZWNlaXZlZCIpOyAKKworICAgICAgLyogb24gT09NIGVycm9yX21zZyBpcyBzZXQgdG8gTlVMTCAqLworICAgICAgY29tcGxldGVfcGVuZGluZ19jYWxsX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sIHBlbmRpbmcsIGVycm9yX21zZyk7CisgICAgICBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiAocGVuZGluZyk7CisgICAgICByZXR1cm47CisgICAgfQorICBlbHNlIGlmIChjb25uZWN0aW9uLT5kaXNjb25uZWN0X21lc3NhZ2VfbGluayA9PSBOVUxMKQorICAgIF9kYnVzX3ZlcmJvc2UgKCJkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jaygpOiBkaXNjb25uZWN0ZWRcbiIpOworICBlbHNlIGlmICh0aW1lb3V0ID09IE5VTEwpCisgICAgeworICAgICAgIGlmIChzdGF0dXMgPT0gREJVU19ESVNQQVRDSF9ORUVEX01FTU9SWSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFRyeSBzbGVlcGluZyBhIGJpdCwgYXMgd2UgYXJlbid0IHN1cmUgd2UgbmVlZCB0byBibG9jayBmb3IgcmVhZGluZywKKyAgICAgICAgICAgKiB3ZSBtYXkgYWxyZWFkeSBoYXZlIGEgcmVwbHkgaW4gdGhlIGJ1ZmZlciBhbmQganVzdCBjYW4ndCBwcm9jZXNzCisgICAgICAgICAgICogaXQuCisgICAgICAgICAgICovCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoImRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKCkgd2FpdGluZyBmb3IgbW9yZSBtZW1vcnlcbiIpOworCisgICAgICAgICAgX2RidXNfbWVtb3J5X3BhdXNlX2Jhc2VkX29uX3RpbWVvdXQgKHRpbWVvdXRfbWlsbGlzZWNvbmRzIC0gZWxhcHNlZF9taWxsaXNlY29uZHMpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsgICAgICAgICAgCisgICAgICAgICAgLyogYmxvY2sgYWdhaW4sIHdlIGRvbid0IGhhdmUgdGhlIHJlcGx5IGJ1ZmZlcmVkIHlldC4gKi8KKyAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2RvX2l0ZXJhdGlvbl91bmxvY2tlZCAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JVEVSQVRJT05fRE9fUkVBRElORyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSVRFUkFUSU9OX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcyAtIGVsYXBzZWRfbWlsbGlzZWNvbmRzKTsKKyAgICAgICAgfQorCisgICAgICBnb3RvIHJlY2hlY2tfc3RhdHVzOworICAgIH0KKyAgZWxzZSBpZiAodHZfc2VjIDwgc3RhcnRfdHZfc2VjKQorICAgIF9kYnVzX3ZlcmJvc2UgKCJkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jaygpOiBjbG9jayBzZXQgYmFja3dhcmRcbiIpOworICBlbHNlIGlmIChlbGFwc2VkX21pbGxpc2Vjb25kcyA8IHRpbWVvdXRfbWlsbGlzZWNvbmRzKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jaygpOiAlZCBtaWxsaXNlY29uZHMgcmVtYWluXG4iLCB0aW1lb3V0X21pbGxpc2Vjb25kcyAtIGVsYXBzZWRfbWlsbGlzZWNvbmRzKTsKKyAgICAgIAorICAgICAgaWYgKHN0YXR1cyA9PSBEQlVTX0RJU1BBVENIX05FRURfTUVNT1JZKQorICAgICAgICB7CisgICAgICAgICAgLyogVHJ5IHNsZWVwaW5nIGEgYml0LCBhcyB3ZSBhcmVuJ3Qgc3VyZSB3ZSBuZWVkIHRvIGJsb2NrIGZvciByZWFkaW5nLAorICAgICAgICAgICAqIHdlIG1heSBhbHJlYWR5IGhhdmUgYSByZXBseSBpbiB0aGUgYnVmZmVyIGFuZCBqdXN0IGNhbid0IHByb2Nlc3MKKyAgICAgICAgICAgKiBpdC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2soKSB3YWl0aW5nIGZvciBtb3JlIG1lbW9yeVxuIik7CisKKyAgICAgICAgICBfZGJ1c19tZW1vcnlfcGF1c2VfYmFzZWRfb25fdGltZW91dCAodGltZW91dF9taWxsaXNlY29uZHMgLSBlbGFwc2VkX21pbGxpc2Vjb25kcyk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeyAgICAgICAgICAKKyAgICAgICAgICAvKiBibG9jayBhZ2Fpbiwgd2UgZG9uJ3QgaGF2ZSB0aGUgcmVwbHkgYnVmZmVyZWQgeWV0LiAqLworICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fZG9faXRlcmF0aW9uX3VubG9ja2VkIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lURVJBVElPTl9ET19SRUFESU5HIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JVEVSQVRJT05fQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzIC0gZWxhcHNlZF9taWxsaXNlY29uZHMpOworICAgICAgICB9CisKKyAgICAgIGdvdG8gcmVjaGVja19zdGF0dXM7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jaygpOiBXYWl0ZWQgJWQgbWlsbGlzZWNvbmRzIGFuZCBnb3Qgbm8gcmVwbHlcbiIsCisgICAgICAgICAgICAgICAgIGVsYXBzZWRfbWlsbGlzZWNvbmRzKTsKKworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZF91bmxvY2tlZCAocGVuZGluZykpOworICAKKyAgLyogdW5sb2NrIGFuZCBjYWxsIHVzZXIgY29kZSAqLworICBjb21wbGV0ZV9wZW5kaW5nX2NhbGxfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgcGVuZGluZywgTlVMTCk7CisKKyAgLyogdXBkYXRlIHVzZXIgY29kZSBvbiBkaXNwYXRjaCBzdGF0dXMgKi8KKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgc3RhdHVzID0gX2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKyAgX2RidXNfY29ubmVjdGlvbl91cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sIHN0YXR1cyk7CisgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChwZW5kaW5nKTsKK30KKworLyoqIEB9ICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0Nvbm5lY3Rpb24KKyAqCisgKiBAeworICovCisKKy8qKgorICogR2V0cyBhIGNvbm5lY3Rpb24gdG8gYSByZW1vdGUgYWRkcmVzcy4gSWYgYSBjb25uZWN0aW9uIHRvIHRoZSBnaXZlbgorICogYWRkcmVzcyBhbHJlYWR5IGV4aXN0cywgcmV0dXJucyB0aGUgZXhpc3RpbmcgY29ubmVjdGlvbiB3aXRoIGl0cworICogcmVmZXJlbmNlIGNvdW50IGluY3JlbWVudGVkLiAgT3RoZXJ3aXNlLCByZXR1cm5zIGEgbmV3IGNvbm5lY3Rpb24KKyAqIGFuZCBzYXZlcyB0aGUgbmV3IGNvbm5lY3Rpb24gZm9yIHBvc3NpYmxlIHJlLXVzZSBpZiBhIGZ1dHVyZSBjYWxsCisgKiB0byBkYnVzX2Nvbm5lY3Rpb25fb3BlbigpIGFza3MgdG8gY29ubmVjdCB0byB0aGUgc2FtZSBzZXJ2ZXIuCisgKgorICogVXNlIGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUoKSB0byBnZXQgYSBkZWRpY2F0ZWQgY29ubmVjdGlvbgorICogbm90IHNoYXJlZCB3aXRoIG90aGVyIGNhbGxlcnMgb2YgZGJ1c19jb25uZWN0aW9uX29wZW4oKS4KKyAqCisgKiBJZiB0aGUgb3BlbiBmYWlscywgdGhlIGZ1bmN0aW9uIHJldHVybnMgI05VTEwsIGFuZCBwcm92aWRlcyBhCisgKiByZWFzb24gZm9yIHRoZSBmYWlsdXJlIGluIHRoZSBlcnJvciBwYXJhbWV0ZXIuIFBhc3MgI05VTEwgZm9yIHRoZQorICogZXJyb3IgcGFyYW1ldGVyIGlmIHlvdSBhcmVuJ3QgaW50ZXJlc3RlZCBpbiB0aGUgcmVhc29uIGZvcgorICogZmFpbHVyZS4KKyAqCisgKiBCZWNhdXNlIHRoaXMgY29ubmVjdGlvbiBpcyBzaGFyZWQsIG5vIHVzZXIgb2YgdGhlIGNvbm5lY3Rpb24KKyAqIG1heSBjYWxsIGRidXNfY29ubmVjdGlvbl9jbG9zZSgpLiBIb3dldmVyLCB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoZQorICogY29ubmVjdGlvbiB5b3Ugc2hvdWxkIGNhbGwgZGJ1c19jb25uZWN0aW9uX3VucmVmKCkuCisgKgorICogQG5vdGUgUHJlZmVyIGRidXNfY29ubmVjdGlvbl9vcGVuKCkgdG8gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSgpCisgKiB1bmxlc3MgeW91IGhhdmUgZ29vZCByZWFzb247IGNvbm5lY3Rpb25zIGFyZSBleHBlbnNpdmUgZW5vdWdoCisgKiB0aGF0IGl0J3Mgd2FzdGVmdWwgdG8gY3JlYXRlIGxvdHMgb2YgY29ubmVjdGlvbnMgdG8gdGhlIHNhbWUKKyAqIHNlcnZlci4KKyAqIAorICogQHBhcmFtIGFkZHJlc3MgdGhlIGFkZHJlc3MuCisgKiBAcGFyYW0gZXJyb3IgYWRkcmVzcyB3aGVyZSBhbiBlcnJvciBjYW4gYmUgcmV0dXJuZWQuCisgKiBAcmV0dXJucyBuZXcgY29ubmVjdGlvbiwgb3IgI05VTEwgb24gZmFpbHVyZS4KKyAqLworREJ1c0Nvbm5lY3Rpb24qCitkYnVzX2Nvbm5lY3Rpb25fb3BlbiAoY29uc3QgY2hhciAgICAgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGFkZHJlc3MgIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZXJyb3JfaXNfc2V0IChlcnJvciwgTlVMTCk7CisKKyAgY29ubmVjdGlvbiA9IF9kYnVzX2Nvbm5lY3Rpb25fb3Blbl9pbnRlcm5hbCAoYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworCisgIHJldHVybiBjb25uZWN0aW9uOworfQorCisvKioKKyAqIE9wZW5zIGEgbmV3LCBkZWRpY2F0ZWQgY29ubmVjdGlvbiB0byBhIHJlbW90ZSBhZGRyZXNzLiBVbmxpa2UKKyAqIGRidXNfY29ubmVjdGlvbl9vcGVuKCksIGFsd2F5cyBjcmVhdGVzIGEgbmV3IGNvbm5lY3Rpb24uCisgKiBUaGlzIGNvbm5lY3Rpb24gd2lsbCBub3QgYmUgc2F2ZWQgb3IgcmVjeWNsZWQgYnkgbGliZGJ1cy4KKyAqCisgKiBJZiB0aGUgb3BlbiBmYWlscywgdGhlIGZ1bmN0aW9uIHJldHVybnMgI05VTEwsIGFuZCBwcm92aWRlcyBhCisgKiByZWFzb24gZm9yIHRoZSBmYWlsdXJlIGluIHRoZSBlcnJvciBwYXJhbWV0ZXIuIFBhc3MgI05VTEwgZm9yIHRoZQorICogZXJyb3IgcGFyYW1ldGVyIGlmIHlvdSBhcmVuJ3QgaW50ZXJlc3RlZCBpbiB0aGUgcmVhc29uIGZvcgorICogZmFpbHVyZS4KKyAqCisgKiBXaGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoaXMgY29ubmVjdGlvbiwgeW91IG11c3QKKyAqIGRidXNfY29ubmVjdGlvbl9jbG9zZSgpIHRvIGRpc2Nvbm5lY3QgaXQsCisgKiBhbmQgZGJ1c19jb25uZWN0aW9uX3VucmVmKCkgdG8gZnJlZSB0aGUgY29ubmVjdGlvbiBvYmplY3QuCisgKiAKKyAqIChUaGUgZGJ1c19jb25uZWN0aW9uX2Nsb3NlKCkgY2FuIGJlIHNraXBwZWQgaWYgdGhlCisgKiBjb25uZWN0aW9uIGlzIGFscmVhZHkga25vd24gdG8gYmUgZGlzY29ubmVjdGVkLCBmb3IgZXhhbXBsZQorICogaWYgeW91IGFyZSBpbnNpZGUgYSBoYW5kbGVyIGZvciB0aGUgRGlzY29ubmVjdGVkIHNpZ25hbC4pCisgKgorICogQG5vdGUgUHJlZmVyIGRidXNfY29ubmVjdGlvbl9vcGVuKCkgdG8gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSgpCisgKiB1bmxlc3MgeW91IGhhdmUgZ29vZCByZWFzb247IGNvbm5lY3Rpb25zIGFyZSBleHBlbnNpdmUgZW5vdWdoCisgKiB0aGF0IGl0J3Mgd2FzdGVmdWwgdG8gY3JlYXRlIGxvdHMgb2YgY29ubmVjdGlvbnMgdG8gdGhlIHNhbWUKKyAqIHNlcnZlci4KKyAqCisgKiBAcGFyYW0gYWRkcmVzcyB0aGUgYWRkcmVzcy4KKyAqIEBwYXJhbSBlcnJvciBhZGRyZXNzIHdoZXJlIGFuIGVycm9yIGNhbiBiZSByZXR1cm5lZC4KKyAqIEByZXR1cm5zIG5ldyBjb25uZWN0aW9uLCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICovCitEQnVzQ29ubmVjdGlvbioKK2RidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKGNvbnN0IGNoYXIgICAgICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGFkZHJlc3MgIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZXJyb3JfaXNfc2V0IChlcnJvciwgTlVMTCk7CisKKyAgY29ubmVjdGlvbiA9IF9kYnVzX2Nvbm5lY3Rpb25fb3Blbl9pbnRlcm5hbCAoYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKworICByZXR1cm4gY29ubmVjdGlvbjsKK30KKworLyoqCisgKiBJbmNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgYSBEQnVzQ29ubmVjdGlvbi4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEByZXR1cm5zIHRoZSBjb25uZWN0aW9uLgorICovCitEQnVzQ29ubmVjdGlvbiAqCitkYnVzX2Nvbm5lY3Rpb25fcmVmIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgZGJ1c19pbnQzMl90IG9sZF9yZWZjb3VudDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbi0+Z2VuZXJhdGlvbiA9PSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24sIE5VTEwpOworICBvbGRfcmVmY291bnQgPSBfZGJ1c19hdG9taWNfaW5jICgmY29ubmVjdGlvbi0+cmVmY291bnQpOworICBfZGJ1c19jb25uZWN0aW9uX3RyYWNlX3JlZiAoY29ubmVjdGlvbiwgb2xkX3JlZmNvdW50LCBvbGRfcmVmY291bnQgKyAxLAorICAgICAgInJlZiIpOworCisgIHJldHVybiBjb25uZWN0aW9uOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9vdXRnb2luZ19tZXNzYWdlICh2b2lkICplbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZSA9IGVsZW1lbnQ7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uID0gZGF0YTsKKworICBfZGJ1c19tZXNzYWdlX3JlbW92ZV9jb3VudGVyIChtZXNzYWdlLCBjb25uZWN0aW9uLT5vdXRnb2luZ19jb3VudGVyKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKK30KKworLyogVGhpcyBpcyBydW4gd2l0aG91dCB0aGUgbXV0ZXggaGVsZCwgYnV0IGFmdGVyIHRoZSBsYXN0IHJlZmVyZW5jZQorICogdG8gdGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gZHJvcHBlZCB3ZSBzaG91bGQgaGF2ZSBubyB0aHJlYWQtcmVsYXRlZAorICogcHJvYmxlbXMKKyAqLworc3RhdGljIHZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fbGFzdF91bnJlZiAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIF9kYnVzX3ZlcmJvc2UgKCJGaW5hbGl6aW5nIGNvbm5lY3Rpb24gJXBcbiIsIGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfYXRvbWljX2dldCAoJmNvbm5lY3Rpb24tPnJlZmNvdW50KSA9PSAwKTsKKworICAvKiBZb3UgaGF2ZSB0byBkaXNjb25uZWN0IHRoZSBjb25uZWN0aW9uIGJlZm9yZSB1bnJlZjppbmcgaXQuIE90aGVyd2lzZQorICAgKiB5b3Ugd29uJ3QgZ2V0IHRoZSBkaXNjb25uZWN0ZWQgbWVzc2FnZS4KKyAgICovCisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uLT50cmFuc3BvcnQpKTsKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uLT5zZXJ2ZXJfZ3VpZCA9PSBOVUxMKTsKKyAgCisgIC8qIC0tLS0gV2UncmUgZ29pbmcgdG8gY2FsbCB2YXJpb3VzIGFwcGxpY2F0aW9uIGNhbGxiYWNrcyBoZXJlLCBob3BlIGl0IGRvZXNuJ3QgYnJlYWsgYW55dGhpbmcuLi4gKi8KKyAgX2RidXNfb2JqZWN0X3RyZWVfZnJlZV9hbGxfdW5sb2NrZWQgKGNvbm5lY3Rpb24tPm9iamVjdHMpOworICAKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9kaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24gKGNvbm5lY3Rpb24sIE5VTEwsIE5VTEwsIE5VTEwpOworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dha2V1cF9tYWluX2Z1bmN0aW9uIChjb25uZWN0aW9uLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NldF91bml4X3VzZXJfZnVuY3Rpb24gKGNvbm5lY3Rpb24sIE5VTEwsIE5VTEwsIE5VTEwpOworICAKKyAgX2RidXNfd2F0Y2hfbGlzdF9mcmVlIChjb25uZWN0aW9uLT53YXRjaGVzKTsKKyAgY29ubmVjdGlvbi0+d2F0Y2hlcyA9IE5VTEw7CisgIAorICBfZGJ1c190aW1lb3V0X2xpc3RfZnJlZSAoY29ubmVjdGlvbi0+dGltZW91dHMpOworICBjb25uZWN0aW9uLT50aW1lb3V0cyA9IE5VTEw7CisKKyAgX2RidXNfZGF0YV9zbG90X2xpc3RfZnJlZSAoJmNvbm5lY3Rpb24tPnNsb3RfbGlzdCk7CisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNvbm5lY3Rpb24tPmZpbHRlcl9saXN0KTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTWVzc2FnZUZpbHRlciAqZmlsdGVyID0gbGluay0+ZGF0YTsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmY29ubmVjdGlvbi0+ZmlsdGVyX2xpc3QsIGxpbmspOworCisgICAgICBmaWx0ZXItPmZ1bmN0aW9uID0gTlVMTDsKKyAgICAgIF9kYnVzX21lc3NhZ2VfZmlsdGVyX3VucmVmIChmaWx0ZXIpOyAvKiBjYWxscyBhcHAgY2FsbGJhY2sgKi8KKyAgICAgIGxpbmstPmRhdGEgPSBOVUxMOworICAgICAgCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZjb25uZWN0aW9uLT5maWx0ZXJfbGlzdCk7CisgIAorICAvKiAtLS0tIERvbmUgd2l0aCBzdHVmZiB0aGF0IGludm9rZXMgYXBwbGljYXRpb24gY2FsbGJhY2tzICovCisKKyAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWYgKGNvbm5lY3Rpb24tPm9iamVjdHMpOyAgCisKKyAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAoY29ubmVjdGlvbi0+cGVuZGluZ19yZXBsaWVzKTsKKyAgY29ubmVjdGlvbi0+cGVuZGluZ19yZXBsaWVzID0gTlVMTDsKKyAgCisgIF9kYnVzX2xpc3RfY2xlYXIgKCZjb25uZWN0aW9uLT5maWx0ZXJfbGlzdCk7CisgIAorICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZjb25uZWN0aW9uLT5vdXRnb2luZ19tZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICBmcmVlX291dGdvaW5nX21lc3NhZ2UsCisJCSAgICAgIGNvbm5lY3Rpb24pOworICBfZGJ1c19saXN0X2NsZWFyICgmY29ubmVjdGlvbi0+b3V0Z29pbmdfbWVzc2FnZXMpOworICAKKyAgX2RidXNfbGlzdF9mb3JlYWNoICgmY29ubmVjdGlvbi0+aW5jb21pbmdfbWVzc2FnZXMsCisJCSAgICAgIChEQnVzRm9yZWFjaEZ1bmN0aW9uKSBkYnVzX21lc3NhZ2VfdW5yZWYsCisJCSAgICAgIE5VTEwpOworICBfZGJ1c19saXN0X2NsZWFyICgmY29ubmVjdGlvbi0+aW5jb21pbmdfbWVzc2FnZXMpOworCisgIF9kYnVzX2NvdW50ZXJfdW5yZWYgKGNvbm5lY3Rpb24tPm91dGdvaW5nX2NvdW50ZXIpOworCisgIF9kYnVzX3RyYW5zcG9ydF91bnJlZiAoY29ubmVjdGlvbi0+dHJhbnNwb3J0KTsKKworICBpZiAoY29ubmVjdGlvbi0+ZGlzY29ubmVjdF9tZXNzYWdlX2xpbmspCisgICAgeworICAgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UgPSBjb25uZWN0aW9uLT5kaXNjb25uZWN0X21lc3NhZ2VfbGluay0+ZGF0YTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAoY29ubmVjdGlvbi0+ZGlzY29ubmVjdF9tZXNzYWdlX2xpbmspOworICAgIH0KKworICBfZGJ1c19jb25kdmFyX2ZyZWVfYXRfbG9jYXRpb24gKCZjb25uZWN0aW9uLT5kaXNwYXRjaF9jb25kKTsKKyAgX2RidXNfY29uZHZhcl9mcmVlX2F0X2xvY2F0aW9uICgmY29ubmVjdGlvbi0+aW9fcGF0aF9jb25kKTsKKworICBfZGJ1c19jbXV0ZXhfZnJlZV9hdF9sb2NhdGlvbiAoJmNvbm5lY3Rpb24tPmlvX3BhdGhfbXV0ZXgpOworICBfZGJ1c19jbXV0ZXhfZnJlZV9hdF9sb2NhdGlvbiAoJmNvbm5lY3Rpb24tPmRpc3BhdGNoX211dGV4KTsKKworICBfZGJ1c19ybXV0ZXhfZnJlZV9hdF9sb2NhdGlvbiAoJmNvbm5lY3Rpb24tPnNsb3RfbXV0ZXgpOworCisgIF9kYnVzX3JtdXRleF9mcmVlX2F0X2xvY2F0aW9uICgmY29ubmVjdGlvbi0+bXV0ZXgpOworICAKKyAgZGJ1c19mcmVlIChjb25uZWN0aW9uKTsKK30KKworLyoqCisgKiBEZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgYSBEQnVzQ29ubmVjdGlvbiwgYW5kIGZpbmFsaXplcworICogaXQgaWYgdGhlIGNvdW50IHJlYWNoZXMgemVyby4KKyAqCisgKiBOb3RlOiBpdCBpcyBhIGJ1ZyB0byBkcm9wIHRoZSBsYXN0IHJlZmVyZW5jZSB0byBhIGNvbm5lY3Rpb24gdGhhdAorICogaXMgc3RpbGwgY29ubmVjdGVkLgorICoKKyAqIEZvciBzaGFyZWQgY29ubmVjdGlvbnMsIGxpYmRidXMgd2lsbCBvd24gYSByZWZlcmVuY2UKKyAqIGFzIGxvbmcgYXMgdGhlIGNvbm5lY3Rpb24gaXMgY29ubmVjdGVkLCBzbyB5b3UgY2FuIGtub3cgdGhhdCBlaXRoZXIKKyAqIHlvdSBkb24ndCBoYXZlIHRoZSBsYXN0IHJlZmVyZW5jZSwgb3IgaXQncyBPSyB0byBkcm9wIHRoZSBsYXN0IHJlZmVyZW5jZS4KKyAqIE1vc3QgY29ubmVjdGlvbnMgYXJlIHNoYXJlZC4gZGJ1c19jb25uZWN0aW9uX29wZW4oKSBhbmQgZGJ1c19idXNfZ2V0KCkKKyAqIHJldHVybiBzaGFyZWQgY29ubmVjdGlvbnMuCisgKgorICogRm9yIHByaXZhdGUgY29ubmVjdGlvbnMsIHRoZSBjcmVhdG9yIG9mIHRoZSBjb25uZWN0aW9uIG11c3QgYXJyYW5nZSBmb3IKKyAqIGRidXNfY29ubmVjdGlvbl9jbG9zZSgpIHRvIGJlIGNhbGxlZCBwcmlvciB0byBkcm9wcGluZyB0aGUgbGFzdCByZWZlcmVuY2UuCisgKiBQcml2YXRlIGNvbm5lY3Rpb25zIGNvbWUgZnJvbSBkYnVzX2Nvbm5lY3Rpb25fb3Blbl9wcml2YXRlKCkgb3IgZGJ1c19idXNfZ2V0X3ByaXZhdGUoKS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqLwordm9pZAorZGJ1c19jb25uZWN0aW9uX3VucmVmIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgZGJ1c19pbnQzMl90IG9sZF9yZWZjb3VudDsKKworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24tPmdlbmVyYXRpb24gPT0gX2RidXNfY3VycmVudF9nZW5lcmF0aW9uKTsKKworICBvbGRfcmVmY291bnQgPSBfZGJ1c19hdG9taWNfZGVjICgmY29ubmVjdGlvbi0+cmVmY291bnQpOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fdHJhY2VfcmVmIChjb25uZWN0aW9uLCBvbGRfcmVmY291bnQsIG9sZF9yZWZjb3VudCAtIDEsCisgICAgICAidW5yZWYiKTsKKworICBpZiAob2xkX3JlZmNvdW50ID09IDEpCisgICAgeworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgICAgICBpZiAoX2RidXNfdHJhbnNwb3J0X2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoIlRoZSBsYXN0IHJlZmVyZW5jZSBvbiBhIGNvbm5lY3Rpb24gd2FzIGRyb3BwZWQgd2l0aG91dCBjbG9zaW5nIHRoZSBjb25uZWN0aW9uLiBUaGlzIGlzIGEgYnVnIGluIGFuIGFwcGxpY2F0aW9uLiBTZWUgZGJ1c19jb25uZWN0aW9uX3VucmVmKCkgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy5cbiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi0+c2hhcmVhYmxlID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vc3QgbGlrZWx5LCB0aGUgYXBwbGljYXRpb24gY2FsbGVkIHVucmVmKCkgdG9vIG1hbnkgdGltZXMgYW5kIHJlbW92ZWQgYSByZWZlcmVuY2UgYmVsb25naW5nIHRvIGxpYmRidXMsIHNpbmNlIHRoaXMgaXMgYSBzaGFyZWQgY29ubmVjdGlvbi5cbiIgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNb3N0IGxpa2VseSwgdGhlIGFwcGxpY2F0aW9uIHdhcyBzdXBwb3NlZCB0byBjYWxsIGRidXNfY29ubmVjdGlvbl9jbG9zZSgpLCBzaW5jZSB0aGlzIGlzIGEgcHJpdmF0ZSBjb25uZWN0aW9uLlxuIik7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisjZW5kaWYKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fbGFzdF91bnJlZiAoY29ubmVjdGlvbik7CisgICAgfQorfQorCisvKgorICogTm90ZSB0aGF0IHRoZSB0cmFuc3BvcnQgY2FuIGRpc2Nvbm5lY3QgaXRzZWxmIChvdGhlciBlbmQgZHJvcHMgdXMpCisgKiBhbmQgaW4gdGhhdCBjYXNlIHRoaXMgZnVuY3Rpb24gbmV2ZXIgcnVucy4gU28gdGhpcyBmdW5jdGlvbiBtdXN0CisgKiBub3QgZG8gYW55dGhpbmcgbW9yZSB0aGFuIGRpc2Nvbm5lY3QgdGhlIHRyYW5zcG9ydCBhbmQgdXBkYXRlIHRoZQorICogZGlzcGF0Y2ggc3RhdHVzLgorICogCisgKiBJZiB0aGUgdHJhbnNwb3J0IHNlbGYtZGlzY29ubmVjdHMsIHRoZW4gd2UgYXNzdW1lIHNvbWVvbmUgd2lsbAorICogZGlzcGF0Y2ggdGhlIGNvbm5lY3Rpb24gdG8gY2F1c2UgdGhlIGRpc3BhdGNoIHN0YXR1cyB1cGRhdGUuCisgKi8KK3N0YXRpYyB2b2lkCitfZGJ1c19jb25uZWN0aW9uX2Nsb3NlX3Bvc3NpYmx5X3NoYXJlZF9hbmRfdW5sb2NrIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c0Rpc3BhdGNoU3RhdHVzIHN0YXR1czsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgX2RidXNfdmVyYm9zZSAoIkRpc2Nvbm5lY3RpbmcgJXBcbiIsIGNvbm5lY3Rpb24pOworCisgIC8qIFdlIG5lZWQgdG8gcmVmIGJlY2F1c2UgdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIHdpbGwgdW5yZWYKKyAgICogdGhlIGNvbm5lY3Rpb24gaWYgaXQgd2FzIHNoYXJlZCBhbmQgbGliZGJ1cyB3YXMgdGhlIG9ubHkgcmVtYWluaW5nCisgICAqIHJlZmNvdW50IGhvbGRlci4KKyAgICovCisgIF9kYnVzX2Nvbm5lY3Rpb25fcmVmX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKyAgCisgIF9kYnVzX3RyYW5zcG9ydF9kaXNjb25uZWN0IChjb25uZWN0aW9uLT50cmFuc3BvcnQpOworCisgIC8qIFRoaXMgaGFzIHRoZSBzaWRlIGVmZmVjdCBvZiBxdWV1aW5nIHRoZSBkaXNjb25uZWN0IG1lc3NhZ2UgbGluaworICAgKiAodW5sZXNzIHdlIGRvbid0IGhhdmUgZW5vdWdoIG1lbW9yeSwgcG9zc2libHksIHNvIGRvbid0IGFzc2VydCBpdCkuCisgICAqIEFmdGVyIHRoZSBkaXNjb25uZWN0IG1lc3NhZ2UgbGluayBpcyBxdWV1ZWQsIGRidXNfYnVzX2dldC9kYnVzX2Nvbm5lY3Rpb25fb3BlbgorICAgKiBzaG91bGQgbmV2ZXIgYWdhaW4gcmV0dXJuIHRoZSBuZXdseS1kaXNjb25uZWN0ZWQgY29ubmVjdGlvbi4KKyAgICoKKyAgICogSG93ZXZlciwgd2Ugb25seSB1bnJlZiB0aGUgc2hhcmVkIGNvbm5lY3Rpb24gYW5kIGV4aXRfb25fZGlzY29ubmVjdCB3aGVuCisgICAqIHRoZSBkaXNjb25uZWN0IG1lc3NhZ2UgcmVhY2hlcyB0aGUgaGVhZCBvZiB0aGUgbWVzc2FnZSBxdWV1ZSwKKyAgICogTk9UIHdoZW4gaXQncyBmaXJzdCBxdWV1ZWQuCisgICAqLworICBzdGF0dXMgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgIC8qIFRoaXMgY2FsbHMgb3V0IHRvIHVzZXIgY29kZSAqLworICBfZGJ1c19jb25uZWN0aW9uX3VwZGF0ZV9kaXNwYXRjaF9zdGF0dXNfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgc3RhdHVzKTsKKworICAvKiBDb3VsZCBhbHNvIGNhbGwgb3V0IHRvIHVzZXIgY29kZSAqLworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworfQorCisvKioKKyAqIENsb3NlcyBhIHByaXZhdGUgY29ubmVjdGlvbiwgc28gbm8gZnVydGhlciBkYXRhIGNhbiBiZSBzZW50IG9yIHJlY2VpdmVkLgorICogVGhpcyBkaXNjb25uZWN0cyB0aGUgdHJhbnNwb3J0IChzdWNoIGFzIGEgc29ja2V0KSB1bmRlcmx5aW5nIHRoZQorICogY29ubmVjdGlvbi4KKyAqCisgKiBBdHRlbXB0cyB0byBzZW5kIG1lc3NhZ2VzIGFmdGVyIGNsb3NpbmcgYSBjb25uZWN0aW9uIGFyZSBzYWZlLCBidXQgd2lsbCByZXN1bHQgaW4KKyAqIGVycm9yIHJlcGxpZXMgZ2VuZXJhdGVkIGxvY2FsbHkgaW4gbGliZGJ1cy4KKyAqIAorICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhZmZlY3QgdGhlIGNvbm5lY3Rpb24ncyByZWZlcmVuY2UgY291bnQuICBJdCdzCisgKiBzYWZlIHRvIGNsb3NlIGEgY29ubmVjdGlvbiBtb3JlIHRoYW4gb25jZTsgYWxsIGNhbGxzIGFmdGVyIHRoZQorICogZmlyc3QgZG8gbm90aGluZy4gSXQncyBpbXBvc3NpYmxlIHRvICJyZW9wZW4iIGEgY29ubmVjdGlvbiwgYQorICogbmV3IGNvbm5lY3Rpb24gbXVzdCBiZSBjcmVhdGVkLiBUaGlzIGZ1bmN0aW9uIG1heSByZXN1bHQgaW4gYSBjYWxsCisgKiB0byB0aGUgREJ1c0Rpc3BhdGNoU3RhdHVzRnVuY3Rpb24gc2V0IHdpdGgKKyAqIGRidXNfY29ubmVjdGlvbl9zZXRfZGlzcGF0Y2hfc3RhdHVzX2Z1bmN0aW9uKCksIGFzIHRoZSBkaXNjb25uZWN0CisgKiBtZXNzYWdlIGl0IGdlbmVyYXRlcyBuZWVkcyB0byBiZSBkaXNwYXRjaGVkLgorICoKKyAqIElmIGEgY29ubmVjdGlvbiBpcyBkcm9wcGVkIGJ5IHRoZSByZW1vdGUgYXBwbGljYXRpb24sIGl0IHdpbGwKKyAqIGNsb3NlIGl0c2VsZi4gCisgKiAKKyAqIFlvdSBtdXN0IGNsb3NlIGEgY29ubmVjdGlvbiBwcmlvciB0byByZWxlYXNpbmcgdGhlIGxhc3QgcmVmZXJlbmNlIHRvCisgKiB0aGUgY29ubmVjdGlvbi4gSWYgeW91IGRidXNfY29ubmVjdGlvbl91bnJlZigpIGZvciB0aGUgbGFzdCB0aW1lCisgKiB3aXRob3V0IGNsb3NpbmcgdGhlIGNvbm5lY3Rpb24sIHRoZSByZXN1bHRzIGFyZSB1bmRlZmluZWQ7IGl0CisgKiBpcyBhIGJ1ZyBpbiB5b3VyIHByb2dyYW0gYW5kIGxpYmRidXMgd2lsbCB0cnkgdG8gcHJpbnQgYSB3YXJuaW5nLgorICoKKyAqIFlvdSBtYXkgbm90IGNsb3NlIGEgc2hhcmVkIGNvbm5lY3Rpb24uIENvbm5lY3Rpb25zIGNyZWF0ZWQgd2l0aAorICogZGJ1c19jb25uZWN0aW9uX29wZW4oKSBvciBkYnVzX2J1c19nZXQoKSBhcmUgc2hhcmVkLgorICogVGhlc2UgY29ubmVjdGlvbnMgYXJlIG93bmVkIGJ5IGxpYmRidXMsIGFuZCBhcHBsaWNhdGlvbnMgc2hvdWxkCisgKiBvbmx5IHVucmVmIHRoZW0sIG5ldmVyIGNsb3NlIHRoZW0uIEFwcGxpY2F0aW9ucyBjYW4ga25vdyBpdCBpcworICogc2FmZSB0byB1bnJlZiB0aGVzZSBjb25uZWN0aW9ucyBiZWNhdXNlIGxpYmRidXMgd2lsbCBiZSBob2xkaW5nIGEKKyAqIHJlZmVyZW5jZSBhcyBsb25nIGFzIHRoZSBjb25uZWN0aW9uIGlzIG9wZW4uIFRodXMsIGVpdGhlciB0aGUKKyAqIGNvbm5lY3Rpb24gaXMgY2xvc2VkIGFuZCBpdCBpcyBPSyB0byBkcm9wIHRoZSBsYXN0IHJlZmVyZW5jZSwKKyAqIG9yIHRoZSBjb25uZWN0aW9uIGlzIG9wZW4gYW5kIHRoZSBhcHAga25vd3MgaXQgZG9lcyBub3QgaGF2ZSB0aGUKKyAqIGxhc3QgcmVmZXJlbmNlLgorICoKKyAqIENvbm5lY3Rpb25zIGNyZWF0ZWQgd2l0aCBkYnVzX2Nvbm5lY3Rpb25fb3Blbl9wcml2YXRlKCkgb3IKKyAqIGRidXNfYnVzX2dldF9wcml2YXRlKCkgYXJlIG5vdCBrZXB0IHRyYWNrIG9mIG9yIHJlZmVyZW5jZWQgYnkKKyAqIGxpYmRidXMuIFRoZSBjcmVhdG9yIG9mIHRoZXNlIGNvbm5lY3Rpb25zIGlzIHJlc3BvbnNpYmxlIGZvcgorICogY2FsbGluZyBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UoKSBwcmlvciB0byByZWxlYXNpbmcgdGhlIGxhc3QKKyAqIHJlZmVyZW5jZSwgaWYgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGFscmVhZHkgZGlzY29ubmVjdGVkLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBwcml2YXRlICh1bnNoYXJlZCkgY29ubmVjdGlvbiB0byBjbG9zZQorICovCit2b2lkCitkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24tPmdlbmVyYXRpb24gPT0gX2RidXNfY3VycmVudF9nZW5lcmF0aW9uKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgaWYgKGNvbm5lY3Rpb24tPnNoYXJlYWJsZSkKKyAgICB7CisgICAgICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkICgiQXBwbGljYXRpb25zIG11c3Qgbm90IGNsb3NlIHNoYXJlZCBjb25uZWN0aW9ucyAtIHNlZSBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UoKSBkb2NzLiBUaGlzIGlzIGEgYnVnIGluIHRoZSBhcHBsaWNhdGlvbi5cbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorICAKKyAgX2RidXNfY29ubmVjdGlvbl9jbG9zZV9wb3NzaWJseV9zaGFyZWRfYW5kX3VubG9jayAoY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgcmV0dXJuIF9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uLT50cmFuc3BvcnQpOworfQorCisvKioKKyAqIEdldHMgd2hldGhlciB0aGUgY29ubmVjdGlvbiBpcyBjdXJyZW50bHkgb3Blbi4gIEEgY29ubmVjdGlvbiBtYXkKKyAqIGJlY29tZSBkaXNjb25uZWN0ZWQgd2hlbiB0aGUgcmVtb3RlIGFwcGxpY2F0aW9uIGNsb3NlcyBpdHMgZW5kLCBvcgorICogZXhpdHM7IGEgY29ubmVjdGlvbiBtYXkgYWxzbyBiZSBkaXNjb25uZWN0ZWQgd2l0aAorICogZGJ1c19jb25uZWN0aW9uX2Nsb3NlKCkuCisgKiAKKyAqIFRoZXJlIGFyZSBub3Qgc2VwYXJhdGUgc3RhdGVzIGZvciAiY2xvc2VkIiBhbmQgImRpc2Nvbm5lY3RlZCwiIHRoZSB0d28KKyAqIHRlcm1zIGFyZSBzeW5vbnltb3VzLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZWFsbHkgYmUgY2FsbGVkCisgKiBnZXRfaXNfb3BlbigpIGJ1dCBmb3IgaGlzdG9yaWNhbCByZWFzb25zIGlzIG5vdC4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBjb25uZWN0aW9uIGlzIHN0aWxsIGFsaXZlLgorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBkYnVzX2Jvb2xfdCByZXM7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIHJlcyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZF91bmxvY2tlZCAoY29ubmVjdGlvbik7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgCisgIHJldHVybiByZXM7Cit9CisKKy8qKgorICogR2V0cyB3aGV0aGVyIHRoZSBjb25uZWN0aW9uIHdhcyBhdXRoZW50aWNhdGVkLiAoTm90ZSB0aGF0CisgKiBpZiB0aGUgY29ubmVjdGlvbiB3YXMgYXV0aGVudGljYXRlZCB0aGVuIGRpc2Nvbm5lY3RlZCwKKyAqIHRoaXMgZnVuY3Rpb24gc3RpbGwgcmV0dXJucyAjVFJVRSkKKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGNvbm5lY3Rpb24gd2FzIGV2ZXIgYXV0aGVudGljYXRlZAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX2dldF9pc19hdXRoZW50aWNhdGVkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgZGJ1c19ib29sX3QgcmVzOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICByZXMgPSBfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2F1dGhlbnRpY2F0ZWQgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCk7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgCisgIHJldHVybiByZXM7Cit9CisKKy8qKgorICogR2V0cyB3aGV0aGVyIHRoZSBjb25uZWN0aW9uIGlzIG5vdCBhdXRoZW50aWNhdGVkIGFzIGEgc3BlY2lmaWMKKyAqIHVzZXIuICBJZiB0aGUgY29ubmVjdGlvbiBpcyBub3QgYXV0aGVudGljYXRlZCwgdGhpcyBmdW5jdGlvbgorICogcmV0dXJucyAjVFJVRSwgYW5kIGlmIGl0IGlzIGF1dGhlbnRpY2F0ZWQgYnV0IGFzIGFuIGFub255bW91cyB1c2VyLAorICogaXQgcmV0dXJucyAjVFJVRS4gIElmIGl0IGlzIGF1dGhlbnRpY2F0ZWQgYXMgYSBzcGVjaWZpYyB1c2VyLCB0aGVuCisgKiB0aGlzIHJldHVybnMgI0ZBTFNFLiAoTm90ZSB0aGF0IGlmIHRoZSBjb25uZWN0aW9uIHdhcyBhdXRoZW50aWNhdGVkCisgKiBhcyBhbm9ueW1vdXMgdGhlbiBkaXNjb25uZWN0ZWQsIHRoaXMgZnVuY3Rpb24gc3RpbGwgcmV0dXJucyAjVFJVRS4pCisgKgorICogSWYgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGFub255bW91cywgeW91IGNhbiB1c2UKKyAqIGRidXNfY29ubmVjdGlvbl9nZXRfdW5peF91c2VyKCkgYW5kCisgKiBkYnVzX2Nvbm5lY3Rpb25fZ2V0X3dpbmRvd3NfdXNlcigpIHRvIHNlZSB3aG8gaXQncyBhdXRob3JpemVkIGFzLgorICoKKyAqIElmIHlvdSB3YW50IHRvIHByZXZlbnQgbm9uLWFub255bW91cyBhdXRob3JpemF0aW9uLCB1c2UKKyAqIGRidXNfc2VydmVyX3NldF9hdXRoX21lY2hhbmlzbXMoKSB0byByZW1vdmUgdGhlIG1lY2hhbmlzbXMgdGhhdAorICogYWxsb3cgcHJvdmluZyB1c2VyIGlkZW50aXR5IChpLmUuIG9ubHkgYWxsb3cgdGhlIEFOT05ZTU9VUworICogbWVjaGFuaXNtKS4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm5zICNUUlVFIGlmIG5vdCBhdXRoZW50aWNhdGVkIG9yIGF1dGhlbnRpY2F0ZWQgYXMgYW5vbnltb3VzIAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX2dldF9pc19hbm9ueW1vdXMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBkYnVzX2Jvb2xfdCByZXM7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIHJlcyA9IF9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfYW5vbnltb3VzIChjb25uZWN0aW9uLT50cmFuc3BvcnQpOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgIAorICByZXR1cm4gcmVzOworfQorCisvKioKKyAqIEdldHMgdGhlIElEIG9mIHRoZSBzZXJ2ZXIgYWRkcmVzcyB3ZSBhcmUgYXV0aGVudGljYXRlZCB0bywgaWYgdGhpcworICogY29ubmVjdGlvbiBpcyBvbiB0aGUgY2xpZW50IHNpZGUuIElmIHRoZSBjb25uZWN0aW9uIGlzIG9uIHRoZQorICogc2VydmVyIHNpZGUsIHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuICNOVUxMIC0gdXNlIGRidXNfc2VydmVyX2dldF9pZCgpCisgKiB0byBnZXQgdGhlIElEIG9mIHlvdXIgb3duIHNlcnZlciwgaWYgeW91IGFyZSB0aGUgc2VydmVyIHNpZGUuCisgKiAKKyAqIElmIGEgY2xpZW50LXNpZGUgY29ubmVjdGlvbiBpcyBub3QgYXV0aGVudGljYXRlZCB5ZXQsIHRoZSBJRCBtYXkgYmUKKyAqIGF2YWlsYWJsZSBpZiBpdCB3YXMgaW5jbHVkZWQgaW4gdGhlIHNlcnZlciBhZGRyZXNzLCBidXQgbWF5IG5vdCBiZQorICogYXZhaWxhYmxlLiBUaGUgb25seSB3YXkgdG8gYmUgc3VyZSB0aGUgc2VydmVyIElEIGlzIGF2YWlsYWJsZQorICogaXMgdG8gd2FpdCBmb3IgYXV0aGVudGljYXRpb24gdG8gY29tcGxldGUuCisgKgorICogSW4gZ2VuZXJhbCwgZWFjaCBtb2RlIG9mIGNvbm5lY3RpbmcgdG8gYSBnaXZlbiBzZXJ2ZXIgd2lsbCBoYXZlCisgKiBpdHMgb3duIElELiBTbyBmb3IgZXhhbXBsZSwgaWYgdGhlIHNlc3Npb24gYnVzIGRhZW1vbiBpcyBsaXN0ZW5pbmcKKyAqIG9uIFVOSVggZG9tYWluIHNvY2tldHMgYW5kIG9uIFRDUCwgdGhlbiBlYWNoIG9mIHRob3NlIG1vZGFsaXRpZXMKKyAqIHdpbGwgaGF2ZSBpdHMgb3duIHNlcnZlciBJRC4KKyAqCisgKiBJZiB5b3Ugd2FudCBhbiBJRCB0aGF0IGlkZW50aWZpZXMgYW4gZW50aXJlIHNlc3Npb24gYnVzLCBsb29rIGF0CisgKiBkYnVzX2J1c19nZXRfaWQoKSBpbnN0ZWFkICh3aGljaCBpcyBqdXN0IGEgY29udmVuaWVuY2Ugd3JhcHBlcgorICogYXJvdW5kIHRoZSBvcmcuZnJlZWRlc2t0b3AuREJ1cy5HZXRJZCBtZXRob2QgaW52b2tlZCBvbiB0aGUgYnVzKS4KKyAqCisgKiBZb3UgY2FuIGFsc28gZ2V0IGEgbWFjaGluZSBJRDsgc2VlIGRidXNfZ2V0X2xvY2FsX21hY2hpbmVfaWQoKSB0bworICogZ2V0IHRoZSBtYWNoaW5lIHlvdSBhcmUgb24uICBUaGVyZSBpc24ndCBhIGNvbnZlbmllbmNlIHdyYXBwZXIsIGJ1dAorICogeW91IGNhbiBpbnZva2Ugb3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlci5HZXRNYWNoaW5lSWQgb24gYW55IHBlZXIKKyAqIHRvIGdldCB0aGUgbWFjaGluZSBJRCBvbiB0aGUgb3RoZXIgZW5kLgorICogCisgKiBUaGUgRC1CdXMgc3BlY2lmaWNhdGlvbiBkZXNjcmliZXMgdGhlIHNlcnZlciBJRCBhbmQgb3RoZXIgSURzIGluIGEKKyAqIGJpdCBtb3JlIGRldGFpbC4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHJldHVybnMgdGhlIHNlcnZlciBJRCBvciAjTlVMTCBpZiBubyBtZW1vcnkgb3IgdGhlIGNvbm5lY3Rpb24gaXMgc2VydmVyLXNpZGUKKyAqLworY2hhcioKK2RidXNfY29ubmVjdGlvbl9nZXRfc2VydmVyX2lkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgY2hhciAqaWQ7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIE5VTEwpOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIGlkID0gX2RidXNfc3RyZHVwIChfZGJ1c190cmFuc3BvcnRfZ2V0X3NlcnZlcl9pZCAoY29ubmVjdGlvbi0+dHJhbnNwb3J0KSk7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworICByZXR1cm4gaWQ7Cit9CisKKy8qKgorICogVGVzdHMgd2hldGhlciBhIGNlcnRhaW4gdHlwZSBjYW4gYmUgc2VuZCB2aWEgdGhlIGNvbm5lY3Rpb24uIFRoaXMKKyAqIHdpbGwgYWx3YXlzIHJldHVybiBUUlVFIGZvciBhbGwgdHlwZXMsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZgorICogREJVU19UWVBFX1VOSVhfRkQuIFRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBUUlVFIGZvcgorICogREJVU19UWVBFX1VOSVhfRkQgb25seSBvbiBzeXN0ZW1zIHRoYXQga25vdyBVbml4IGZpbGUgZGVzY3JpcHRvcnMKKyAqIGFuZCBjYW4gc2VuZCB0aGVtIHZpYSB0aGUgY2hvc2VuIHRyYW5zcG9ydCBhbmQgd2hlbiB0aGUgcmVtb3RlIHNpZGUKKyAqIHN1cHBvcnRzIHRoaXMuCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBkbyBydW50aW1lIGNoZWNraW5nIGZvciB0eXBlcyB0aGF0CisgKiBtaWdodCBiZSB1bmtub3duIHRvIHRoZSBzcGVjaWZpYyBELUJ1cyBjbGllbnQgaW1wbGVtZW50YXRpb24KKyAqIHZlcnNpb24sIGkuZS4gaXQgd2lsbCByZXR1cm4gRkFMU0UgZm9yIGFsbCB0eXBlcyB0aGlzCisgKiBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBrbm93LCBpbmNsdWRpbmcgaW52YWxpZCBvciByZXNlcnZlZCB0eXBlcy4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgdG8gY2hlY2sKKyAqIEByZXR1cm5zIFRSVUUgaWYgdGhlIHR5cGUgbWF5IGJlIHNlbmQgdmlhIHRoZSBjb25uZWN0aW9uCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fY2FuX3NlbmRfdHlwZShEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSkKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKworICBpZiAoIWRidXNfdHlwZV9pc192YWxpZCAodHlwZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICh0eXBlICE9IERCVVNfVFlQRV9VTklYX0ZEKQorICAgIHJldHVybiBUUlVFOworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgeworICAgIGRidXNfYm9vbF90IGI7CisKKyAgICBDT05ORUNUSU9OX0xPQ0soY29ubmVjdGlvbik7CisgICAgYiA9IF9kYnVzX3RyYW5zcG9ydF9jYW5fcGFzc191bml4X2ZkKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCk7CisgICAgQ09OTkVDVElPTl9VTkxPQ0soY29ubmVjdGlvbik7CisKKyAgICByZXR1cm4gYjsKKyAgfQorI2VuZGlmCisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIFNldCB3aGV0aGVyIF9leGl0KCkgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBjb25uZWN0aW9uIHJlY2VpdmVzIGEKKyAqIGRpc2Nvbm5lY3Qgc2lnbmFsLiBUaGUgY2FsbCB0byBfZXhpdCgpIGNvbWVzIGFmdGVyIGFueSBoYW5kbGVycyBmb3IKKyAqIHRoZSBkaXNjb25uZWN0IHNpZ25hbCBydW47IGhhbmRsZXJzIGNhbiBjYW5jZWwgdGhlIGV4aXQgYnkgY2FsbGluZworICogdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBCeSBkZWZhdWx0LCBleGl0X29uX2Rpc2Nvbm5lY3QgaXMgI0ZBTFNFOyBidXQgZm9yIG1lc3NhZ2UgYnVzCisgKiBjb25uZWN0aW9ucyByZXR1cm5lZCBmcm9tIGRidXNfYnVzX2dldCgpIGl0IHdpbGwgYmUgdG9nZ2xlZCBvbgorICogYnkgZGVmYXVsdC4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIGV4aXRfb25fZGlzY29ubmVjdCAjVFJVRSBpZiBfZXhpdCgpIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYSBkaXNjb25uZWN0IHNpZ25hbAorICovCit2b2lkCitkYnVzX2Nvbm5lY3Rpb25fc2V0X2V4aXRfb25fZGlzY29ubmVjdCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgIGV4aXRfb25fZGlzY29ubmVjdCkKK3sKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgY29ubmVjdGlvbi0+ZXhpdF9vbl9kaXNjb25uZWN0ID0gZXhpdF9vbl9kaXNjb25uZWN0ICE9IEZBTFNFOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7Cit9CisKKy8qKgorICogUHJlYWxsb2NhdGVzIHJlc291cmNlcyBuZWVkZWQgdG8gc2VuZCBhIG1lc3NhZ2UsIGFsbG93aW5nIHRoZSBtZXNzYWdlIAorICogdG8gYmUgc2VudCB3aXRob3V0IHRoZSBwb3NzaWJpbGl0eSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLgorICogQWxsb3dzIGFwcHMgdG8gY3JlYXRlIGEgZnV0dXJlIGd1YXJhbnRlZSB0aGF0IHRoZXkgY2FuIHNlbmQKKyAqIGEgbWVzc2FnZSByZWdhcmRsZXNzIG9mIG1lbW9yeSBzaG9ydGFnZXMuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24gd2UncmUgcHJlYWxsb2NhdGluZyBmb3IuCisgKiBAcmV0dXJucyB0aGUgcHJlYWxsb2NhdGVkIHJlc291cmNlcywgb3IgI05VTEwKKyAqLworREJ1c1ByZWFsbG9jYXRlZFNlbmQqCitkYnVzX2Nvbm5lY3Rpb25fcHJlYWxsb2NhdGVfc2VuZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNQcmVhbGxvY2F0ZWRTZW5kICpwcmVhbGxvY2F0ZWQ7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIE5VTEwpOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIAorICBwcmVhbGxvY2F0ZWQgPQorICAgIF9kYnVzX2Nvbm5lY3Rpb25fcHJlYWxsb2NhdGVfc2VuZF91bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiBwcmVhbGxvY2F0ZWQ7Cit9CisKKy8qKgorICogRnJlZXMgcHJlYWxsb2NhdGVkIG1lc3NhZ2Utc2VuZGluZyByZXNvdXJjZXMgZnJvbQorICogZGJ1c19jb25uZWN0aW9uX3ByZWFsbG9jYXRlX3NlbmQoKS4gU2hvdWxkIG9ubHkKKyAqIGJlIGNhbGxlZCBpZiB0aGUgcHJlYWxsb2NhdGVkIHJlc291cmNlcyBhcmUgbm90IHVzZWQKKyAqIHRvIHNlbmQgYSBtZXNzYWdlLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gcHJlYWxsb2NhdGVkIHRoZSByZXNvdXJjZXMKKyAqLwordm9pZAorZGJ1c19jb25uZWN0aW9uX2ZyZWVfcHJlYWxsb2NhdGVkX3NlbmQgKERCdXNDb25uZWN0aW9uICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQcmVhbGxvY2F0ZWRTZW5kICpwcmVhbGxvY2F0ZWQpCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAocHJlYWxsb2NhdGVkICE9IE5VTEwpOyAgCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uID09IHByZWFsbG9jYXRlZC0+Y29ubmVjdGlvbik7CisKKyAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKHByZWFsbG9jYXRlZC0+cXVldWVfbGluayk7CisgIF9kYnVzX2NvdW50ZXJfdW5yZWYgKHByZWFsbG9jYXRlZC0+Y291bnRlcl9saW5rLT5kYXRhKTsKKyAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKHByZWFsbG9jYXRlZC0+Y291bnRlcl9saW5rKTsKKyAgZGJ1c19mcmVlIChwcmVhbGxvY2F0ZWQpOworfQorCisvKioKKyAqIFNlbmRzIGEgbWVzc2FnZSB1c2luZyBwcmVhbGxvY2F0ZWQgcmVzb3VyY2VzLiBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBmYWlsLgorICogSXQgd29ya3MgaWRlbnRpY2FsbHkgdG8gZGJ1c19jb25uZWN0aW9uX3NlbmQoKSBpbiBvdGhlciByZXNwZWN0cy4KKyAqIFByZWFsbG9jYXRlZCByZXNvdXJjZXMgY29tZXMgZnJvbSBkYnVzX2Nvbm5lY3Rpb25fcHJlYWxsb2NhdGVfc2VuZCgpLgorICogVGhpcyBmdW5jdGlvbiAiY29uc3VtZXMiIHRoZSBwcmVhbGxvY2F0ZWQgcmVzb3VyY2VzLCB0aGV5IG5lZWQgbm90CisgKiBiZSBmcmVlZCBzZXBhcmF0ZWx5LgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gcHJlYWxsb2NhdGVkIHRoZSBwcmVhbGxvY2F0ZWQgcmVzb3VyY2VzCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBzZW5kCisgKiBAcGFyYW0gY2xpZW50X3NlcmlhbCByZXR1cm4gbG9jYXRpb24gZm9yIGNsaWVudCBzZXJpYWwgYXNzaWduZWQgdG8gdGhlIG1lc3NhZ2UKKyAqLwordm9pZAorZGJ1c19jb25uZWN0aW9uX3NlbmRfcHJlYWxsb2NhdGVkIChEQnVzQ29ubmVjdGlvbiAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ByZWFsbG9jYXRlZFNlbmQgKnByZWFsbG9jYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgICAgICpjbGllbnRfc2VyaWFsKQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKHByZWFsbG9jYXRlZCAhPSBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChwcmVhbGxvY2F0ZWQtPmNvbm5lY3Rpb24gPT0gY29ubmVjdGlvbik7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpICE9IERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgIT0gTlVMTCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpICE9IERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpICE9IE5VTEwpKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKworICBpZiAoIV9kYnVzX3RyYW5zcG9ydF9jYW5fcGFzc191bml4X2ZkKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCkgJiYKKyAgICAgIG1lc3NhZ2UtPm5fdW5peF9mZHMgPiAwKQorICAgIHsKKyAgICAgIC8qIFJlZnVzZSB0byBzZW5kIGZkcyBvbiBhIGNvbm5lY3Rpb24gdGhhdCBjYW5ub3QgaGFuZGxlCisgICAgICAgICB0aGVtLiBVbmZvcnR1bmF0ZWx5IHdlIGNhbm5vdCByZXR1cm4gYSBwcm9wZXIgZXJyb3IgaGVyZSwgc28KKyAgICAgICAgIHRoZSBiZXN0IHdlIGNhbiBpcyBqdXN0IHJldHVybi4gKi8KKyAgICAgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyNlbmRpZgorCisgIF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF9wcmVhbGxvY2F0ZWRfYW5kX3VubG9jayAoY29ubmVjdGlvbiwKKwkJCQkJCSBwcmVhbGxvY2F0ZWQsCisJCQkJCQkgbWVzc2FnZSwgY2xpZW50X3NlcmlhbCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfY29ubmVjdGlvbl9zZW5kX3VubG9ja2VkX25vX3VwZGF0ZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICpjbGllbnRfc2VyaWFsKQoreworICBEQnVzUHJlYWxsb2NhdGVkU2VuZCAqcHJlYWxsb2NhdGVkOworCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlICE9IE5VTEwpOworICAKKyAgcHJlYWxsb2NhdGVkID0gX2RidXNfY29ubmVjdGlvbl9wcmVhbGxvY2F0ZV9zZW5kX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKyAgaWYgKHByZWFsbG9jYXRlZCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19jb25uZWN0aW9uX3NlbmRfcHJlYWxsb2NhdGVkX3VubG9ja2VkX25vX3VwZGF0ZSAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWFsbG9jYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRfc2VyaWFsKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQWRkcyBhIG1lc3NhZ2UgdG8gdGhlIG91dGdvaW5nIG1lc3NhZ2UgcXVldWUuIERvZXMgbm90IGJsb2NrIHRvCisgKiB3cml0ZSB0aGUgbWVzc2FnZSB0byB0aGUgbmV0d29yazsgdGhhdCBoYXBwZW5zIGFzeW5jaHJvbm91c2x5LiBUbworICogZm9yY2UgdGhlIG1lc3NhZ2UgdG8gYmUgd3JpdHRlbiwgY2FsbCBkYnVzX2Nvbm5lY3Rpb25fZmx1c2goKSBob3dldmVyCisgKiBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNhbGwgZGJ1c19jb25uZWN0aW9uX2ZsdXNoKCkgYnkgaGFuZDsgdGhlIAorICogbWVzc2FnZSB3aWxsIGJlIHNlbnQgdGhlIG5leHQgdGltZSB0aGUgbWFpbiBsb29wIGlzIHJ1bi4gCisgKiBkYnVzX2Nvbm5lY3Rpb25fZmx1c2goKSBzaG91bGQgb25seSBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgaWYKKyAqIHRoZSBhcHBsaWNhdGlvbiB3YXMgZXhwZWN0ZWQgdG8gZXhpdCBiZWZvcmUgcnVubmluZyB0aGUgbWFpbiBsb29wLgorICoKKyAqIEJlY2F1c2UgdGhpcyBvbmx5IHF1ZXVlcyB0aGUgbWVzc2FnZSwgdGhlIG9ubHkgcmVhc29uIGl0IGNhbgorICogZmFpbCBpcyBsYWNrIG9mIG1lbW9yeS4gRXZlbiBpZiB0aGUgY29ubmVjdGlvbiBpcyBkaXNjb25uZWN0ZWQsCisgKiBubyBlcnJvciB3aWxsIGJlIHJldHVybmVkLiBJZiB0aGUgZnVuY3Rpb24gZmFpbHMgZHVlIHRvIGxhY2sgb2YgbWVtb3J5LCAKKyAqIGl0IHJldHVybnMgI0ZBTFNFLiBUaGUgZnVuY3Rpb24gd2lsbCBuZXZlciBmYWlsIGZvciBvdGhlciByZWFzb25zOyBldmVuIAorICogaWYgdGhlIGNvbm5lY3Rpb24gaXMgZGlzY29ubmVjdGVkLCB5b3UgY2FuIHF1ZXVlIGFuIG91dGdvaW5nIG1lc3NhZ2UsCisgKiB0aG91Z2ggb2J2aW91c2x5IGl0IHdvbid0IGJlIHNlbnQuCisgKgorICogVGhlIG1lc3NhZ2Ugc2VyaWFsIGlzIHVzZWQgYnkgdGhlIHJlbW90ZSBhcHBsaWNhdGlvbiB0byBzZW5kIGEKKyAqIHJlcGx5OyBzZWUgZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwoKSBvciB0aGUgRC1CdXMgc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBkYnVzX21lc3NhZ2VfdW5yZWYoKSBjYW4gYmUgY2FsbGVkIGFzIHNvb24gYXMgdGhpcyBtZXRob2QgcmV0dXJucworICogYXMgdGhlIG1lc3NhZ2UgcXVldWUgd2lsbCBob2xkIGl0cyBvd24gcmVmIHVudGlsIHRoZSBtZXNzYWdlIGlzIHNlbnQuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gd3JpdGUuCisgKiBAcGFyYW0gc2VyaWFsIHJldHVybiBsb2NhdGlvbiBmb3IgbWVzc2FnZSBzZXJpYWwsIG9yICNOVUxMIGlmIHlvdSBkb24ndCBjYXJlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX3NlbmQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICpzZXJpYWwpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisKKyAgaWYgKCFfZGJ1c190cmFuc3BvcnRfY2FuX3Bhc3NfdW5peF9mZChjb25uZWN0aW9uLT50cmFuc3BvcnQpICYmCisgICAgICBtZXNzYWdlLT5uX3VuaXhfZmRzID4gMCkKKyAgICB7CisgICAgICAvKiBSZWZ1c2UgdG8gc2VuZCBmZHMgb24gYSBjb25uZWN0aW9uIHRoYXQgY2Fubm90IGhhbmRsZQorICAgICAgICAgdGhlbS4gVW5mb3J0dW5hdGVseSB3ZSBjYW5ub3QgcmV0dXJuIGEgcHJvcGVyIGVycm9yIGhlcmUsIHNvCisgICAgICAgICB0aGUgYmVzdCB3ZSBjYW4gaXMganVzdCByZXR1cm4uICovCisgICAgICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisjZW5kaWYKKworICByZXR1cm4gX2RidXNfY29ubmVjdGlvbl9zZW5kX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sCisJCQkJCSAgIG1lc3NhZ2UsCisJCQkJCSAgIHNlcmlhbCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcmVwbHlfaGFuZGxlcl90aW1lb3V0ICh2b2lkICpkYXRhKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgREJ1c0Rpc3BhdGNoU3RhdHVzIHN0YXR1czsKKyAgREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nID0gZGF0YTsKKworICBjb25uZWN0aW9uID0gX2RidXNfcGVuZGluZ19jYWxsX2dldF9jb25uZWN0aW9uX2FuZF9sb2NrIChwZW5kaW5nKTsKKyAgX2RidXNfY29ubmVjdGlvbl9yZWZfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX3BlbmRpbmdfY2FsbF9xdWV1ZV90aW1lb3V0X2Vycm9yX3VubG9ja2VkIChwZW5kaW5nLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24pOworICBfZGJ1c19jb25uZWN0aW9uX3JlbW92ZV90aW1lb3V0X3VubG9ja2VkIChjb25uZWN0aW9uLAorCQkJCSAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfdGltZW91dF91bmxvY2tlZCAocGVuZGluZykpOworICBfZGJ1c19wZW5kaW5nX2NhbGxfc2V0X3RpbWVvdXRfYWRkZWRfdW5sb2NrZWQgKHBlbmRpbmcsIEZBTFNFKTsKKworICBfZGJ1c192ZXJib3NlICgibWlkZGxlXG4iKTsKKyAgc3RhdHVzID0gX2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKworICAvKiBVbmxvY2tzLCBhbmQgY2FsbHMgb3V0IHRvIHVzZXIgY29kZSAqLworICBfZGJ1c19jb25uZWN0aW9uX3VwZGF0ZV9kaXNwYXRjaF9zdGF0dXNfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgc3RhdHVzKTsKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFF1ZXVlcyBhIG1lc3NhZ2UgdG8gc2VuZCwgYXMgd2l0aCBkYnVzX2Nvbm5lY3Rpb25fc2VuZCgpLAorICogYnV0IGFsc28gcmV0dXJucyBhICNEQnVzUGVuZGluZ0NhbGwgdXNlZCB0byByZWNlaXZlIGEgcmVwbHkgdG8gdGhlCisgKiBtZXNzYWdlLiBJZiBubyByZXBseSBpcyByZWNlaXZlZCBpbiB0aGUgZ2l2ZW4gdGltZW91dF9taWxsaXNlY29uZHMsCisgKiB0aGlzIGZ1bmN0aW9uIGV4cGlyZXMgdGhlIHBlbmRpbmcgcmVwbHkgYW5kIGdlbmVyYXRlcyBhIHN5bnRoZXRpYworICogZXJyb3IgcmVwbHkgKGdlbmVyYXRlZCBpbi1wcm9jZXNzLCBub3QgYnkgdGhlIHJlbW90ZSBhcHBsaWNhdGlvbikKKyAqIGluZGljYXRpbmcgdGhhdCBhIHRpbWVvdXQgb2NjdXJyZWQuCisgKgorICogQSAjREJ1c1BlbmRpbmdDYWxsIHdpbGwgc2VlIGEgcmVwbHkgbWVzc2FnZSBiZWZvcmUgYW55IGZpbHRlcnMgb3IKKyAqIHJlZ2lzdGVyZWQgb2JqZWN0IHBhdGggaGFuZGxlcnMuIFNlZSBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2goKSBmb3IKKyAqIGRldGFpbHMgb24gd2hlbiBoYW5kbGVycyBhcmUgcnVuLgorICoKKyAqIEEgI0RCdXNQZW5kaW5nQ2FsbCB3aWxsIGFsd2F5cyBzZWUgZXhhY3RseSBvbmUgcmVwbHkgbWVzc2FnZSwKKyAqIHVubGVzcyBpdCdzIGNhbmNlbGxlZCB3aXRoIGRidXNfcGVuZGluZ19jYWxsX2NhbmNlbCgpLgorICogCisgKiBJZiAjTlVMTCBpcyBwYXNzZWQgZm9yIHRoZSBwZW5kaW5nX3JldHVybiwgdGhlICNEQnVzUGVuZGluZ0NhbGwKKyAqIHdpbGwgc3RpbGwgYmUgZ2VuZXJhdGVkIGludGVybmFsbHksIGFuZCB1c2VkIHRvIHRyYWNrCisgKiB0aGUgbWVzc2FnZSByZXBseSB0aW1lb3V0LiBUaGlzIG1lYW5zIGEgdGltZW91dCBlcnJvciB3aWxsCisgKiBvY2N1ciBpZiBubyByZXBseSBhcnJpdmVzLCB1bmxpa2Ugd2l0aCBkYnVzX2Nvbm5lY3Rpb25fc2VuZCgpLgorICoKKyAqIElmIC0xIGlzIHBhc3NlZCBmb3IgdGhlIHRpbWVvdXQsIGEgc2FuZSBkZWZhdWx0IHRpbWVvdXQgaXMgdXNlZC4gLTEKKyAqIGlzIHR5cGljYWxseSB0aGUgYmVzdCB2YWx1ZSBmb3IgdGhlIHRpbWVvdXQgZm9yIHRoaXMgcmVhc29uLCB1bmxlc3MKKyAqIHlvdSB3YW50IGEgdmVyeSBzaG9ydCBvciB2ZXJ5IGxvbmcgdGltZW91dC4gIElmICNEQlVTX1RJTUVPVVRfSU5GSU5JVEUgaXMKKyAqIHBhc3NlZCBmb3IgdGhlIHRpbWVvdXQsIG5vIHRpbWVvdXQgd2lsbCBiZSBzZXQgYW5kIHRoZSBjYWxsIHdpbGwgYmxvY2sKKyAqIGZvcmV2ZXIuCisgKgorICogQHdhcm5pbmcgaWYgdGhlIGNvbm5lY3Rpb24gaXMgZGlzY29ubmVjdGVkIG9yIHlvdSB0cnkgdG8gc2VuZCBVbml4CisgKiBmaWxlIGRlc2NyaXB0b3JzIG9uIGEgY29ubmVjdGlvbiB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhlbSwgdGhlCisgKiAjREJ1c1BlbmRpbmdDYWxsIHdpbGwgYmUgc2V0IHRvICNOVUxMLCBzbyBiZSBjYXJlZnVsIHdpdGggdGhpcy4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gc2VuZAorICogQHBhcmFtIHBlbmRpbmdfcmV0dXJuIHJldHVybiBsb2NhdGlvbiBmb3IgYSAjREJ1c1BlbmRpbmdDYWxsCisgKiBvYmplY3QsIG9yICNOVUxMIGlmIGNvbm5lY3Rpb24gaXMgZGlzY29ubmVjdGVkIG9yIHdoZW4geW91IHRyeSB0bworICogc2VuZCBVbml4IGZpbGUgZGVzY3JpcHRvcnMgb24gYSBjb25uZWN0aW9uIHRoYXQgZG9lcyBub3Qgc3VwcG9ydAorICogdGhlbS4KKyAqIEBwYXJhbSB0aW1lb3V0X21pbGxpc2Vjb25kcyB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgLTEgKG9yCisgKiAgI0RCVVNfVElNRU9VVF9VU0VfREVGQVVMVCkgZm9yIGRlZmF1bHQgb3IgI0RCVVNfVElNRU9VVF9JTkZJTklURSBmb3Igbm8KKyAqICB0aW1lb3V0CisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5LCAjVFJVRSBvdGhlcndpc2UuCisgKgorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BlbmRpbmdDYWxsICAgKipwZW5kaW5nX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpCit7CisgIERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZzsKKyAgZGJ1c19pbnQzMl90IHNlcmlhbCA9IC0xOworICBEQnVzRGlzcGF0Y2hTdGF0dXMgc3RhdHVzOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAodGltZW91dF9taWxsaXNlY29uZHMgPj0gMCB8fCB0aW1lb3V0X21pbGxpc2Vjb25kcyA9PSAtMSwgRkFMU0UpOworCisgIGlmIChwZW5kaW5nX3JldHVybikKKyAgICAqcGVuZGluZ19yZXR1cm4gPSBOVUxMOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworCisgIGlmICghX2RidXNfdHJhbnNwb3J0X2Nhbl9wYXNzX3VuaXhfZmQoY29ubmVjdGlvbi0+dHJhbnNwb3J0KSAmJgorICAgICAgbWVzc2FnZS0+bl91bml4X2ZkcyA+IDApCisgICAgeworICAgICAgLyogUmVmdXNlIHRvIHNlbmQgZmRzIG9uIGEgY29ubmVjdGlvbiB0aGF0IGNhbm5vdCBoYW5kbGUKKyAgICAgICAgIHRoZW0uIFVuZm9ydHVuYXRlbHkgd2UgY2Fubm90IHJldHVybiBhIHByb3BlciBlcnJvciBoZXJlLCBzbworICAgICAgICAgdGhlIGJlc3Qgd2UgY2FuIGRvIGlzIHJldHVybiBUUlVFIGJ1dCBsZWF2ZSAqcGVuZGluZ19yZXR1cm4KKyAgICAgICAgIGFzIE5VTEwuICovCisgICAgICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyNlbmRpZgorCisgICBpZiAoIV9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZF91bmxvY2tlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcGVuZGluZyA9IF9kYnVzX3BlbmRpbmdfY2FsbF9uZXdfdW5sb2NrZWQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5X2hhbmRsZXJfdGltZW91dCk7CisKKyAgaWYgKHBlbmRpbmcgPT0gTlVMTCkKKyAgICB7CisgICAgICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIEFzc2lnbiBhIHNlcmlhbCB0byB0aGUgbWVzc2FnZSAqLworICBzZXJpYWwgPSBkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAobWVzc2FnZSk7CisgIGlmIChzZXJpYWwgPT0gMCkKKyAgICB7CisgICAgICBzZXJpYWwgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9uZXh0X2NsaWVudF9zZXJpYWwgKGNvbm5lY3Rpb24pOworICAgICAgZGJ1c19tZXNzYWdlX3NldF9zZXJpYWwgKG1lc3NhZ2UsIHNlcmlhbCk7CisgICAgfQorCisgIGlmICghX2RidXNfcGVuZGluZ19jYWxsX3NldF90aW1lb3V0X2Vycm9yX3VubG9ja2VkIChwZW5kaW5nLCBtZXNzYWdlLCBzZXJpYWwpKQorICAgIGdvdG8gZXJyb3I7CisgICAgCisgIC8qIEluc2VydCB0aGUgc2VyaWFsIGluIHRoZSBwZW5kaW5nIHJlcGxpZXMgaGFzaDsKKyAgICogaGFzaCB0YWtlcyBhIHJlZmNvdW50IG9uIERCdXNQZW5kaW5nQ2FsbC4KKyAgICogQWxzbywgYWRkIHRoZSB0aW1lb3V0LgorICAgKi8KKyAgaWYgKCFfZGJ1c19jb25uZWN0aW9uX2F0dGFjaF9wZW5kaW5nX2NhbGxfdW5sb2NrZWQgKGNvbm5lY3Rpb24sCisJCQkJCQkgICAgICBwZW5kaW5nKSkKKyAgICBnb3RvIGVycm9yOworIAorICBpZiAoIV9kYnVzX2Nvbm5lY3Rpb25fc2VuZF91bmxvY2tlZF9ub191cGRhdGUgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsIE5VTEwpKQorICAgIHsKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fZGV0YWNoX3BlbmRpbmdfY2FsbF9hbmRfdW5sb2NrIChjb25uZWN0aW9uLAorCQkJCQkJICAgICAgIHBlbmRpbmcpOworICAgICAgZ290byBlcnJvcl91bmxvY2tlZDsKKyAgICB9CisKKyAgaWYgKHBlbmRpbmdfcmV0dXJuKQorICAgICpwZW5kaW5nX3JldHVybiA9IHBlbmRpbmc7IC8qIGhhbmQgb2ZmIHJlZmNvdW50ICovCisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19jb25uZWN0aW9uX2RldGFjaF9wZW5kaW5nX2NhbGxfdW5sb2NrZWQgKGNvbm5lY3Rpb24sIHBlbmRpbmcpOworICAgICAgLyogd2Ugc3RpbGwgaGF2ZSBhIHJlZiB0byB0aGUgcGVuZGluZyBjYWxsIGluIHRoaXMgY2FzZSwgd2UgdW5yZWYKKyAgICAgICAqIGFmdGVyIHVubG9ja2luZywgYmVsb3cKKyAgICAgICAqLworICAgIH0KKworICBzdGF0dXMgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgIC8qIHRoaXMgY2FsbHMgb3V0IHRvIHVzZXIgY29kZSAqLworICBfZGJ1c19jb25uZWN0aW9uX3VwZGF0ZV9kaXNwYXRjaF9zdGF0dXNfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgc3RhdHVzKTsKKworICBpZiAocGVuZGluZ19yZXR1cm4gPT0gTlVMTCkKKyAgICBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiAocGVuZGluZyk7CisgIAorICByZXR1cm4gVFJVRTsKKworIGVycm9yOgorICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgZXJyb3JfdW5sb2NrZWQ6CisgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChwZW5kaW5nKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIFNlbmRzIGEgbWVzc2FnZSBhbmQgYmxvY2tzIGEgY2VydGFpbiB0aW1lIHBlcmlvZCB3aGlsZSB3YWl0aW5nIGZvcgorICogYSByZXBseS4gIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmVlbnRlciB0aGUgbWFpbiBsb29wLAorICogaS5lLiBtZXNzYWdlcyBvdGhlciB0aGFuIHRoZSByZXBseSBhcmUgcXVldWVkIHVwIGJ1dCBub3QKKyAqIHByb2Nlc3NlZC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGludm9rZSBtZXRob2QgY2FsbHMgb24gYQorICogcmVtb3RlIG9iamVjdC4KKyAqIAorICogSWYgYSBub3JtYWwgcmVwbHkgaXMgcmVjZWl2ZWQsIGl0IGlzIHJldHVybmVkLCBhbmQgcmVtb3ZlZCBmcm9tIHRoZQorICogaW5jb21pbmcgbWVzc2FnZSBxdWV1ZS4gSWYgaXQgaXMgbm90IHJlY2VpdmVkLCAjTlVMTCBpcyByZXR1cm5lZAorICogYW5kIHRoZSBlcnJvciBpcyBzZXQgdG8gI0RCVVNfRVJST1JfTk9fUkVQTFkuICBJZiBhbiBlcnJvciByZXBseSBpcworICogcmVjZWl2ZWQsIGl0IGlzIGNvbnZlcnRlZCB0byBhICNEQnVzRXJyb3IgYW5kIHJldHVybmVkIGFzIGFuIGVycm9yLAorICogdGhlbiB0aGUgcmVwbHkgbWVzc2FnZSBpcyBkZWxldGVkIGFuZCAjTlVMTCBpcyByZXR1cm5lZC4gSWYKKyAqIHNvbWV0aGluZyBlbHNlIGdvZXMgd3JvbmcsIHJlc3VsdCBpcyBzZXQgdG8gd2hhdGV2ZXIgaXMKKyAqIGFwcHJvcHJpYXRlLCBzdWNoIGFzICNEQlVTX0VSUk9SX05PX01FTU9SWSBvcgorICogI0RCVVNfRVJST1JfRElTQ09OTkVDVEVELgorICoKKyAqIEB3YXJuaW5nIFdoaWxlIHRoaXMgZnVuY3Rpb24gYmxvY2tzIHRoZSBjYWxsaW5nIHRocmVhZCB3aWxsIG5vdCBiZQorICogcHJvY2Vzc2luZyB0aGUgaW5jb21pbmcgbWVzc2FnZSBxdWV1ZS4gVGhpcyBtZWFucyB5b3UgY2FuIGVuZCB1cAorICogZGVhZGxvY2tlZCBpZiB0aGUgYXBwbGljYXRpb24geW91J3JlIHRhbGtpbmcgdG8gbmVlZHMgeW91IHRvIHJlcGx5CisgKiB0byBhIG1ldGhvZC4gVG8gc29sdmUgdGhpcywgZWl0aGVyIGF2b2lkIHRoZSBzaXR1YXRpb24sIGJsb2NrIGluIGEKKyAqIHNlcGFyYXRlIHRocmVhZCBmcm9tIHRoZSBtYWluIGNvbm5lY3Rpb24tZGlzcGF0Y2hpbmcgdGhyZWFkLCBvciB1c2UKKyAqIGRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkoKSB0byBhdm9pZCBibG9ja2luZy4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gc2VuZAorICogQHBhcmFtIHRpbWVvdXRfbWlsbGlzZWNvbmRzIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCAtMSAob3IKKyAqICAjREJVU19USU1FT1VUX1VTRV9ERUZBVUxUKSBmb3IgZGVmYXVsdCBvciAjREJVU19USU1FT1VUX0lORklOSVRFIGZvciBubworICogIHRpbWVvdXQKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9yIG1lc3NhZ2UKKyAqIEByZXR1cm5zIHRoZSBtZXNzYWdlIHRoYXQgaXMgdGhlIHJlcGx5IG9yICNOVUxMIHdpdGggYW4gZXJyb3IgY29kZSBpZiB0aGUKKyAqIGZ1bmN0aW9uIGZhaWxzLgorICovCitEQnVzTWVzc2FnZSoKK2RidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmc7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAodGltZW91dF9taWxsaXNlY29uZHMgPj0gMCB8fCB0aW1lb3V0X21pbGxpc2Vjb25kcyA9PSAtMSwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZXJyb3JfaXNfc2V0IChlcnJvciwgTlVMTCk7CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIGlmICghX2RidXNfdHJhbnNwb3J0X2Nhbl9wYXNzX3VuaXhfZmQoY29ubmVjdGlvbi0+dHJhbnNwb3J0KSAmJgorICAgICAgbWVzc2FnZS0+bl91bml4X2ZkcyA+IDApCisgICAgeworICAgICAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICAgICAgZGJ1c19zZXRfZXJyb3IoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELCAiQ2Fubm90IHNlbmQgZmlsZSBkZXNjcmlwdG9ycyBvbiB0aGlzIGNvbm5lY3Rpb24uIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworI2VuZGlmCisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5IChjb25uZWN0aW9uLCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwZW5kaW5nLCB0aW1lb3V0X21pbGxpc2Vjb25kcykpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmIChwZW5kaW5nID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0RJU0NPTk5FQ1RFRCwgIkNvbm5lY3Rpb24gaXMgY2xvc2VkIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICBkYnVzX3BlbmRpbmdfY2FsbF9ibG9jayAocGVuZGluZyk7CisKKyAgcmVwbHkgPSBkYnVzX3BlbmRpbmdfY2FsbF9zdGVhbF9yZXBseSAocGVuZGluZyk7CisgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChwZW5kaW5nKTsKKworICAvKiBjYWxsX2NvbXBsZXRlX2FuZF91bmxvY2soKSBjYWxsZWQgZnJvbSBwZW5kaW5nX2NhbGxfYmxvY2soKSBzaG91bGQKKyAgICogYWx3YXlzIGZpbGwgdGhpcyBpbi4KKyAgICovCisgIF9kYnVzX2Fzc2VydCAocmVwbHkgIT0gTlVMTCk7CisgIAorICAgaWYgKGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAoZXJyb3IsIHJlcGx5KSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiByZXBseTsKK30KKworLyoqCisgKiBCbG9ja3MgdW50aWwgdGhlIG91dGdvaW5nIG1lc3NhZ2UgcXVldWUgaXMgZW1wdHkuCisgKiBBc3N1bWVzIGNvbm5lY3Rpb24gbG9jayBhbHJlYWR5IGhlbGQuCisgKgorICogSWYgeW91IGNhbGwgdGhpcywgeW91IE1VU1QgY2FsbCB1cGRhdGVfZGlzcGF0Y2hfc3RhdHVzIGFmdGVyd29yZC4uLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqLworc3RhdGljIERCdXNEaXNwYXRjaFN0YXR1cworX2RidXNfY29ubmVjdGlvbl9mbHVzaF91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIC8qIFdlIGhhdmUgdG8gc3BlY2lmeSBEQlVTX0lURVJBVElPTl9ET19SRUFESU5HIGhlcmUgYmVjYXVzZQorICAgKiBvdGhlcndpc2Ugd2UgY291bGQgaGF2ZSB0d28gYXBwcyBkZWFkbG9jayBpZiB0aGV5IGFyZSBib3RoIGRvaW5nCisgICAqIGEgZmx1c2goKSwgYW5kIHRoZSBrZXJuZWwgYnVmZmVycyBmaWxsIHVwLiBUaGlzIGNvdWxkIGNoYW5nZSB0aGUKKyAgICogZGlzcGF0Y2ggc3RhdHVzLgorICAgKi8KKyAgREJ1c0Rpc3BhdGNoU3RhdHVzIHN0YXR1czsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgd2hpbGUgKGNvbm5lY3Rpb24tPm5fb3V0Z29pbmcgPiAwICYmCisgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWRfdW5sb2NrZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJkb2luZyBpdGVyYXRpb24gaW5cbiIpOworICAgICAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fZG9faXRlcmF0aW9uX3VubG9ja2VkIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JVEVSQVRJT05fRE9fUkVBRElORyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JVEVSQVRJT05fRE9fV1JJVElORyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JVEVSQVRJT05fQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEpOworICAgIH0KKworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICBfZGJ1c192ZXJib3NlICgibWlkZGxlXG4iKTsKKyAgc3RhdHVzID0gX2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEJsb2NrcyB1bnRpbCB0aGUgb3V0Z29pbmcgbWVzc2FnZSBxdWV1ZSBpcyBlbXB0eS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqLwordm9pZAorZGJ1c19jb25uZWN0aW9uX2ZsdXNoIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgLyogV2UgaGF2ZSB0byBzcGVjaWZ5IERCVVNfSVRFUkFUSU9OX0RPX1JFQURJTkcgaGVyZSBiZWNhdXNlCisgICAqIG90aGVyd2lzZSB3ZSBjb3VsZCBoYXZlIHR3byBhcHBzIGRlYWRsb2NrIGlmIHRoZXkgYXJlIGJvdGggZG9pbmcKKyAgICogYSBmbHVzaCgpLCBhbmQgdGhlIGtlcm5lbCBidWZmZXJzIGZpbGwgdXAuIFRoaXMgY291bGQgY2hhbmdlIHRoZQorICAgKiBkaXNwYXRjaCBzdGF0dXMuCisgICAqLworICBEQnVzRGlzcGF0Y2hTdGF0dXMgc3RhdHVzOworCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICBzdGF0dXMgPSBfZGJ1c19jb25uZWN0aW9uX2ZsdXNoX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKyAgCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIC8qIFVubG9ja3MgYW5kIGNhbGxzIG91dCB0byB1c2VyIGNvZGUgKi8KKyAgX2RidXNfY29ubmVjdGlvbl91cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sIHN0YXR1cyk7CisKKyAgX2RidXNfdmVyYm9zZSAoImVuZFxuIik7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIGRidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlX2Rpc3BhdGNoKCkgYW5kCisgKiBkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZSgpICh0aGV5IHBhc3MgYSBkaWZmZXJlbnQgdmFsdWUgZm9yIHRoZQorICogZGlzcGF0Y2ggcGFyYW1ldGVyKS4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSB0aW1lb3V0X21pbGxpc2Vjb25kcyBtYXggdGltZSB0byBibG9jayBvciAtMSBmb3IgaW5maW5pdGUKKyAqIEBwYXJhbSBkaXNwYXRjaCBkaXNwYXRjaCBuZXcgbWVzc2FnZXMgb3IgbGVhdmUgdGhlbSBvbiB0aGUgaW5jb21pbmcgcXVldWUKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBkaXNjb25uZWN0IG1lc3NhZ2UgaGFzIG5vdCBiZWVuIHByb2Nlc3NlZAorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZV9kaXNwYXRjaCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgZGlzcGF0Y2gpCit7CisgIERCdXNEaXNwYXRjaFN0YXR1cyBkc3RhdHVzOworICBkYnVzX2Jvb2xfdCBwcm9ncmVzc19wb3NzaWJsZTsKKworICAvKiBOZWVkIHRvIGdyYWIgYSByZWYgaGVyZSBpbiBjYXNlIHdlJ3JlIGEgcHJpdmF0ZSBjb25uZWN0aW9uIGFuZAorICAgKiB0aGUgdXNlciBkcm9wcyB0aGUgbGFzdCByZWYgaW4gYSBoYW5kbGVyIHdlIGNhbGw7IHNlZSBidWcgCisgICAqIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTE1NjM1CisgICAqLworICBkYnVzX2Nvbm5lY3Rpb25fcmVmIChjb25uZWN0aW9uKTsKKyAgZHN0YXR1cyA9IGRidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzIChjb25uZWN0aW9uKTsKKworICBpZiAoZGlzcGF0Y2ggJiYgZHN0YXR1cyA9PSBEQlVTX0RJU1BBVENIX0RBVEFfUkVNQUlOUykKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiZG9pbmcgZGlzcGF0Y2hcbiIpOworICAgICAgZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoIChjb25uZWN0aW9uKTsKKyAgICAgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgICAgfQorICBlbHNlIGlmIChkc3RhdHVzID09IERCVVNfRElTUEFUQ0hfTkVFRF9NRU1PUlkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoInBhdXNpbmcgZm9yIG1lbW9yeVxuIik7CisgICAgICBfZGJ1c19tZW1vcnlfcGF1c2VfYmFzZWRfb25fdGltZW91dCAodGltZW91dF9taWxsaXNlY29uZHMpOworICAgICAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICAgICAgaWYgKF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZF91bmxvY2tlZCAoY29ubmVjdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiZG9pbmcgaXRlcmF0aW9uXG4iKTsKKyAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2RvX2l0ZXJhdGlvbl91bmxvY2tlZCAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JVEVSQVRJT05fRE9fUkVBRElORyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSVRFUkFUSU9OX0RPX1dSSVRJTkcgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lURVJBVElPTl9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpOworICAgICAgICB9CisgICAgfQorICAKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgLyogSWYgd2UgY2FuIGRpc3BhdGNoLCB3ZSBjYW4gbWFrZSBwcm9ncmVzcyB1bnRpbCB0aGUgRGlzY29ubmVjdGVkIG1lc3NhZ2UKKyAgICogaGFzIGJlZW4gcHJvY2Vzc2VkOyBpZiB3ZSBjYW4gb25seSByZWFkL3dyaXRlLCB3ZSBjYW4gbWFrZSBwcm9ncmVzcworICAgKiBhcyBsb25nIGFzIHRoZSB0cmFuc3BvcnQgaXMgb3Blbi4KKyAgICovCisgIGlmIChkaXNwYXRjaCkKKyAgICBwcm9ncmVzc19wb3NzaWJsZSA9IGNvbm5lY3Rpb24tPm5faW5jb21pbmcgIT0gMCB8fAorICAgICAgY29ubmVjdGlvbi0+ZGlzY29ubmVjdF9tZXNzYWdlX2xpbmsgIT0gTlVMTDsKKyAgZWxzZQorICAgIHByb2dyZXNzX3Bvc3NpYmxlID0gX2RidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKworICByZXR1cm4gcHJvZ3Jlc3NfcG9zc2libGU7IC8qIFRSVUUgaWYgd2UgY2FuIG1ha2UgbW9yZSBwcm9ncmVzcyAqLworfQorCisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYXBwbGljYXRpb25zIHRoYXQgZG9uJ3Qgd2FudAorICogdG8gd3JpdGUgYSBtYWluIGxvb3AgYW5kIGRlYWwgd2l0aCAjREJ1c1dhdGNoIGFuZCAjREJ1c1RpbWVvdXQuIEFuCisgKiBleGFtcGxlIHVzYWdlIHdvdWxkIGJlOgorICogCisgKiBAY29kZQorICogICB3aGlsZSAoZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGVfZGlzcGF0Y2ggKGNvbm5lY3Rpb24sIC0xKSkKKyAqICAgICA7IC8vIGVtcHR5IGxvb3AgYm9keQorICogQGVuZGNvZGUKKyAqIAorICogSW4gdGhpcyB1c2FnZSB5b3Ugd291bGQgbm9ybWFsbHkgaGF2ZSBzZXQgdXAgYSBmaWx0ZXIgZnVuY3Rpb24gdG8gbG9vaworICogYXQgZWFjaCBtZXNzYWdlIGFzIGl0IGlzIGRpc3BhdGNoZWQuIFRoZSBsb29wIHRlcm1pbmF0ZXMgd2hlbiB0aGUgbGFzdAorICogbWVzc2FnZSBmcm9tIHRoZSBjb25uZWN0aW9uICh0aGUgZGlzY29ubmVjdGVkIHNpZ25hbCkgaXMgcHJvY2Vzc2VkLgorICogCisgKiBJZiB0aGVyZSBhcmUgbWVzc2FnZXMgdG8gZGlzcGF0Y2gsIHRoaXMgZnVuY3Rpb24gd2lsbAorICogZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkgb25jZSwgYW5kIHJldHVybi4gSWYgdGhlcmUgYXJlIG5vCisgKiBtZXNzYWdlcyB0byBkaXNwYXRjaCwgdGhpcyBmdW5jdGlvbiB3aWxsIGJsb2NrIHVudGlsIGl0IGNhbiByZWFkIG9yCisgKiB3cml0ZSwgdGhlbiByZWFkIG9yIHdyaXRlLCB0aGVuIHJldHVybi4KKyAqCisgKiBUaGUgd2F5IHRvIHRoaW5rIG9mIHRoaXMgZnVuY3Rpb24gaXMgdGhhdCBpdCBlaXRoZXIgbWFrZXMgc29tZSBzb3J0CisgKiBvZiBwcm9ncmVzcywgb3IgaXQgYmxvY2tzLiBOb3RlIHRoYXQsIHdoaWxlIGl0IGlzIGJsb2NrZWQgb24gSS9PLCBpdAorICogY2Fubm90IGJlIGludGVycnVwdGVkIChldmVuIGJ5IG90aGVyIHRocmVhZHMpLCB3aGljaCBtYWtlcyB0aGlzIGZ1bmN0aW9uCisgKiB1bnN1aXRhYmxlIGZvciBhcHBsaWNhdGlvbnMgdGhhdCBkbyBtb3JlIHRoYW4ganVzdCByZWFjdCB0byByZWNlaXZlZAorICogbWVzc2FnZXMuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZGlzY29ubmVjdCBtZXNzYWdlIGhhcyBiZWVuCisgKiBwcm9jZXNzZWQsIE5PVCB3aGV0aGVyIHRoZSBjb25uZWN0aW9uIGlzIGNvbm5lY3RlZC4gVGhpcyBpcworICogaW1wb3J0YW50IGJlY2F1c2UgZXZlbiBhZnRlciBkaXNjb25uZWN0aW5nLCB5b3Ugd2FudCB0byBwcm9jZXNzIGFueQorICogbWVzc2FnZXMgeW91IHJlY2VpdmVkIHByaW9yIHRvIHRoZSBkaXNjb25uZWN0LgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gdGltZW91dF9taWxsaXNlY29uZHMgbWF4IHRpbWUgdG8gYmxvY2sgb3IgLTEgZm9yIGluZmluaXRlCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgZGlzY29ubmVjdCBtZXNzYWdlIGhhcyBub3QgYmVlbiBwcm9jZXNzZWQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlX2Rpc3BhdGNoIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAodGltZW91dF9taWxsaXNlY29uZHMgPj0gMCB8fCB0aW1lb3V0X21pbGxpc2Vjb25kcyA9PSAtMSwgRkFMU0UpOworICAgcmV0dXJuIF9kYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZV9kaXNwYXRjaChjb25uZWN0aW9uLCB0aW1lb3V0X21pbGxpc2Vjb25kcywgVFJVRSk7Cit9CisKKy8qKiAKKyAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGFwcGxpY2F0aW9ucyB0aGF0IGRvbid0IHdhbnQgdG8KKyAqIHdyaXRlIGEgbWFpbiBsb29wIGFuZCBkZWFsIHdpdGggI0RCdXNXYXRjaCBhbmQgI0RCdXNUaW1lb3V0LiBTZWUgYWxzbworICogZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGVfZGlzcGF0Y2goKS4KKyAqIAorICogQXMgbG9uZyBhcyB0aGUgY29ubmVjdGlvbiBpcyBvcGVuLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmxvY2sgdW50aWwgaXQgY2FuCisgKiByZWFkIG9yIHdyaXRlLCB0aGVuIHJlYWQgb3Igd3JpdGUsIHRoZW4gcmV0dXJuICNUUlVFLgorICoKKyAqIElmIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgI0ZBTFNFLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgcmVhZGluZyBvciB3cml0aW5nIGlzIHN0aWxsCisgKiBwb3NzaWJsZSwgaS5lLiB3aGV0aGVyIHRoZSBjb25uZWN0aW9uIGlzIGNvbm5lY3RlZC4KKyAqCisgKiBOb3RlIHRoYXQgZXZlbiBhZnRlciBkaXNjb25uZWN0aW9uLCBtZXNzYWdlcyBtYXkgcmVtYWluIGluIHRoZQorICogaW5jb21pbmcgcXVldWUgdGhhdCBuZWVkIHRvIGJlCisgKiBwcm9jZXNzZWQuIGRidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlX2Rpc3BhdGNoKCkgZGlzcGF0Y2hlcworICogaW5jb21pbmcgbWVzc2FnZXMgZm9yIHlvdTsgd2l0aCBkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZSgpIHlvdQorICogaGF2ZSB0byBhcnJhbmdlIHRvIGRyYWluIHRoZSBpbmNvbWluZyBxdWV1ZSB5b3Vyc2VsZi4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24gCisgKiBAcGFyYW0gdGltZW91dF9taWxsaXNlY29uZHMgbWF4IHRpbWUgdG8gYmxvY2sgb3IgLTEgZm9yIGluZmluaXRlIAorICogQHJldHVybnMgI1RSVUUgaWYgc3RpbGwgY29ubmVjdGVkCisgKi8KK2RidXNfYm9vbF90IAorZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpIAoreyAKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICh0aW1lb3V0X21pbGxpc2Vjb25kcyA+PSAwIHx8IHRpbWVvdXRfbWlsbGlzZWNvbmRzID09IC0xLCBGQUxTRSk7CisgICByZXR1cm4gX2RidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlX2Rpc3BhdGNoKGNvbm5lY3Rpb24sIHRpbWVvdXRfbWlsbGlzZWNvbmRzLCBGQUxTRSk7Cit9CisKKy8qIFdlIG5lZWQgdG8gY2FsbCB0aGlzIGFueXRpbWUgd2UgcG9wIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSwgYW5kIHRoZW4KKyAqIHVwZGF0ZV9kaXNwYXRjaF9zdGF0dXNfYW5kX3VubG9jayBuZWVkcyB0byBiZSBjYWxsZWQgYWZ0ZXJ3YXJkCisgKiB3aGljaCB3aWxsICJwcm9jZXNzIiB0aGUgZGlzY29ubmVjdGVkIG1lc3NhZ2UgYW5kIHNldAorICogZGlzY29ubmVjdGVkX21lc3NhZ2VfcHJvY2Vzc2VkLgorICovCitzdGF0aWMgdm9pZAorY2hlY2tfZGlzY29ubmVjdGVkX21lc3NhZ2VfYXJyaXZlZF91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqaGVhZF9vZl9xdWV1ZSkKK3sKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKworICAvKiBjaGVja2luZyB0aGF0IHRoZSBsaW5rIGlzIE5VTEwgaXMgYW4gb3B0aW1pemF0aW9uIHRvIGF2b2lkIHRoZSBpc19zaWduYWwgY2FsbCAqLworICBpZiAoY29ubmVjdGlvbi0+ZGlzY29ubmVjdF9tZXNzYWdlX2xpbmsgPT0gTlVMTCAmJgorICAgICAgZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAoaGVhZF9vZl9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0xPQ0FMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpc2Nvbm5lY3RlZCIpKQorICAgIHsKKyAgICAgIGNvbm5lY3Rpb24tPmRpc2Nvbm5lY3RlZF9tZXNzYWdlX2Fycml2ZWQgPSBUUlVFOworICAgIH0KK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBmaXJzdC1yZWNlaXZlZCBtZXNzYWdlIGZyb20gdGhlIGluY29taW5nIG1lc3NhZ2UgcXVldWUsCisgKiBsZWF2aW5nIGl0IGluIHRoZSBxdWV1ZS4gSWYgdGhlIHF1ZXVlIGlzIGVtcHR5LCByZXR1cm5zICNOVUxMLgorICogCisgKiBUaGUgY2FsbGVyIGRvZXMgbm90IG93biBhIHJlZmVyZW5jZSB0byB0aGUgcmV0dXJuZWQgbWVzc2FnZSwgYW5kCisgKiBtdXN0IGVpdGhlciByZXR1cm4gaXQgdXNpbmcgZGJ1c19jb25uZWN0aW9uX3JldHVybl9tZXNzYWdlKCkgb3IKKyAqIGtlZXAgaXQgYWZ0ZXIgY2FsbGluZyBkYnVzX2Nvbm5lY3Rpb25fc3RlYWxfYm9ycm93ZWRfbWVzc2FnZSgpLiBObworICogb25lIGNhbiBnZXQgYXQgdGhlIG1lc3NhZ2Ugd2hpbGUgaXRzIGJvcnJvd2VkLCBzbyByZXR1cm4gaXQgYXMKKyAqIHF1aWNrbHkgYXMgcG9zc2libGUgYW5kIGRvbid0IGtlZXAgYSByZWZlcmVuY2UgdG8gaXQgYWZ0ZXIKKyAqIHJldHVybmluZyBpdC4gSWYgeW91IG5lZWQgdG8ga2VlcCB0aGUgbWVzc2FnZSwgbWFrZSBhIGNvcHkgb2YgaXQuCisgKgorICogZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkgd2lsbCBibG9jayBpZiBjYWxsZWQgd2hpbGUgYSBib3Jyb3dlZAorICogbWVzc2FnZSBpcyBvdXRzdGFuZGluZzsgb25seSBvbmUgcGllY2Ugb2YgY29kZSBjYW4gYmUgcGxheWluZyB3aXRoCisgKiB0aGUgaW5jb21pbmcgcXVldWUgYXQgYSB0aW1lLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmxvY2sgaWYgY2FsbGVkCisgKiBkdXJpbmcgYSBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2goKS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEByZXR1cm5zIG5leHQgbWVzc2FnZSBpbiB0aGUgaW5jb21pbmcgcXVldWUuCisgKi8KK0RCdXNNZXNzYWdlKgorZGJ1c19jb25uZWN0aW9uX2JvcnJvd19tZXNzYWdlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c0Rpc3BhdGNoU3RhdHVzIHN0YXR1czsKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIE5VTEwpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJzdGFydFxuIik7CisgIAorICAvKiB0aGlzIGlzIGNhbGxlZCBmb3IgdGhlIHNpZGUgZWZmZWN0IHRoYXQgaXQgcXVldWVzCisgICAqIHVwIGFueSBtZXNzYWdlcyBmcm9tIHRoZSB0cmFuc3BvcnQKKyAgICovCisgIHN0YXR1cyA9IGRidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzIChjb25uZWN0aW9uKTsKKyAgaWYgKHN0YXR1cyAhPSBEQlVTX0RJU1BBVENIX0RBVEFfUkVNQUlOUykKKyAgICByZXR1cm4gTlVMTDsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfY29ubmVjdGlvbl9hY3F1aXJlX2Rpc3BhdGNoIChjb25uZWN0aW9uKTsKKworICAvKiBXaGlsZSBhIG1lc3NhZ2UgaXMgb3V0c3RhbmRpbmcsIHRoZSBkaXNwYXRjaCBsb2NrIGlzIGhlbGQgKi8KKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uLT5tZXNzYWdlX2JvcnJvd2VkID09IE5VTEwpOworCisgIGNvbm5lY3Rpb24tPm1lc3NhZ2VfYm9ycm93ZWQgPSBfZGJ1c19saXN0X2dldF9maXJzdCAoJmNvbm5lY3Rpb24tPmluY29taW5nX21lc3NhZ2VzKTsKKyAgCisgIG1lc3NhZ2UgPSBjb25uZWN0aW9uLT5tZXNzYWdlX2JvcnJvd2VkOworCisgIGNoZWNrX2Rpc2Nvbm5lY3RlZF9tZXNzYWdlX2Fycml2ZWRfdW5sb2NrZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICAKKyAgLyogTm90ZSB0aGF0IHdlIEtFRVAgdGhlIGRpc3BhdGNoIGxvY2sgdW50aWwgdGhlIG1lc3NhZ2UgaXMgcmV0dXJuZWQgKi8KKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICBfZGJ1c19jb25uZWN0aW9uX3JlbGVhc2VfZGlzcGF0Y2ggKGNvbm5lY3Rpb24pOworCisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworICBfZGJ1c19tZXNzYWdlX3RyYWNlX3JlZiAobWVzc2FnZSwgLTEsIC0xLCAiZGJ1c19jb25uZWN0aW9uX2JvcnJvd19tZXNzYWdlIik7CisKKyAgLyogV2UgZG9uJ3QgdXBkYXRlIGRpc3BhdGNoIHN0YXR1cyB1bnRpbCBpdCdzIHJldHVybmVkIG9yIHN0b2xlbiAqLworICAKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKKy8qKgorICogVXNlZCB0byByZXR1cm4gYSBtZXNzYWdlIGFmdGVyIHBlZWtpbmcgYXQgaXQgdXNpbmcKKyAqIGRidXNfY29ubmVjdGlvbl9ib3Jyb3dfbWVzc2FnZSgpLiBPbmx5IGNhbGxlZCBpZgorICogbWVzc2FnZSBmcm9tIGRidXNfY29ubmVjdGlvbl9ib3Jyb3dfbWVzc2FnZSgpIHdhcyBub24tI05VTEwuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIGZyb20gZGJ1c19jb25uZWN0aW9uX2JvcnJvd19tZXNzYWdlKCkKKyAqLwordm9pZAorZGJ1c19jb25uZWN0aW9uX3JldHVybl9tZXNzYWdlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQlEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSkKK3sKKyAgREJ1c0Rpc3BhdGNoU3RhdHVzIHN0YXR1czsKKyAgCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKG1lc3NhZ2UgPT0gY29ubmVjdGlvbi0+bWVzc2FnZV9ib3Jyb3dlZCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uLT5kaXNwYXRjaF9hY3F1aXJlZCk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlID09IGNvbm5lY3Rpb24tPm1lc3NhZ2VfYm9ycm93ZWQpOworICAKKyAgY29ubmVjdGlvbi0+bWVzc2FnZV9ib3Jyb3dlZCA9IE5VTEw7CisKKyAgX2RidXNfY29ubmVjdGlvbl9yZWxlYXNlX2Rpc3BhdGNoIChjb25uZWN0aW9uKTsgCisKKyAgc3RhdHVzID0gX2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKyAgX2RidXNfY29ubmVjdGlvbl91cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sIHN0YXR1cyk7CisKKyAgX2RidXNfbWVzc2FnZV90cmFjZV9yZWYgKG1lc3NhZ2UsIC0xLCAtMSwgImRidXNfY29ubmVjdGlvbl9yZXR1cm5fbWVzc2FnZSIpOworfQorCisvKioKKyAqIFVzZWQgdG8ga2VlcCBhIG1lc3NhZ2UgYWZ0ZXIgcGVla2luZyBhdCBpdCB1c2luZworICogZGJ1c19jb25uZWN0aW9uX2JvcnJvd19tZXNzYWdlKCkuIEJlZm9yZSB1c2luZyB0aGlzIGZ1bmN0aW9uLCBzZWUKKyAqIHRoZSBjYXZlYXRzL3dhcm5pbmdzIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvcgorICogZGJ1c19jb25uZWN0aW9uX3BvcF9tZXNzYWdlKCkuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIGZyb20gZGJ1c19jb25uZWN0aW9uX2JvcnJvd19tZXNzYWdlKCkKKyAqLwordm9pZAorZGJ1c19jb25uZWN0aW9uX3N0ZWFsX2JvcnJvd2VkX21lc3NhZ2UgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCQlEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSkKK3sKKyAgREJ1c01lc3NhZ2UgKnBvcF9tZXNzYWdlOworICBEQnVzRGlzcGF0Y2hTdGF0dXMgc3RhdHVzOworCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKG1lc3NhZ2UgPT0gY29ubmVjdGlvbi0+bWVzc2FnZV9ib3Jyb3dlZCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uLT5kaXNwYXRjaF9hY3F1aXJlZCk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworIAorICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UgPT0gY29ubmVjdGlvbi0+bWVzc2FnZV9ib3Jyb3dlZCk7CisKKyAgcG9wX21lc3NhZ2UgPSBfZGJ1c19saXN0X3BvcF9maXJzdCAoJmNvbm5lY3Rpb24tPmluY29taW5nX21lc3NhZ2VzKTsKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlID09IHBvcF9tZXNzYWdlKTsKKyAgKHZvaWQpIHBvcF9tZXNzYWdlOyAvKiB1bnVzZWQgdW5sZXNzIGFzc2VydGluZyAqLworCisgIGNvbm5lY3Rpb24tPm5faW5jb21pbmcgLT0gMTsKKyAKKyAgX2RidXNfdmVyYm9zZSAoIkluY29taW5nIG1lc3NhZ2UgJXAgc3RvbGVuIGZyb20gcXVldWUsICVkIGluY29taW5nXG4iLAorCQkgbWVzc2FnZSwgY29ubmVjdGlvbi0+bl9pbmNvbWluZyk7CisgCisgIGNvbm5lY3Rpb24tPm1lc3NhZ2VfYm9ycm93ZWQgPSBOVUxMOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fcmVsZWFzZV9kaXNwYXRjaCAoY29ubmVjdGlvbik7CisKKyAgc3RhdHVzID0gX2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKyAgX2RidXNfY29ubmVjdGlvbl91cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sIHN0YXR1cyk7CisgIF9kYnVzX21lc3NhZ2VfdHJhY2VfcmVmIChtZXNzYWdlLCAtMSwgLTEsCisgICAgICAiZGJ1c19jb25uZWN0aW9uX3N0ZWFsX2JvcnJvd2VkX21lc3NhZ2UiKTsKK30KKworLyogU2VlIGRidXNfY29ubmVjdGlvbl9wb3BfbWVzc2FnZSwgYnV0IHJlcXVpcmVzIHRoZSBjYWxsZXIgdG8gb3duCisgKiB0aGUgbG9jayBiZWZvcmUgY2FsbGluZy4gTWF5IGRyb3AgdGhlIGxvY2sgd2hpbGUgcnVubmluZy4KKyAqLworc3RhdGljIERCdXNMaXN0KgorX2RidXNfY29ubmVjdGlvbl9wb3BfbWVzc2FnZV9saW5rX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbi0+bWVzc2FnZV9ib3Jyb3dlZCA9PSBOVUxMKTsKKyAgCisgIGlmIChjb25uZWN0aW9uLT5uX2luY29taW5nID4gMCkKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbGluazsKKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0X2xpbmsgKCZjb25uZWN0aW9uLT5pbmNvbWluZ19tZXNzYWdlcyk7CisgICAgICBjb25uZWN0aW9uLT5uX2luY29taW5nIC09IDE7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJNZXNzYWdlICVwICglcyAlcyAlcyAlcyAnJXMnKSByZW1vdmVkIGZyb20gaW5jb21pbmcgcXVldWUgJXAsICVkIGluY29taW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgbGluay0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChsaW5rLT5kYXRhKSksCisgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKGxpbmstPmRhdGEpID8KKyAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobGluay0+ZGF0YSkgOgorICAgICAgICAgICAgICAgICAgICAgIm5vIHBhdGgiLAorICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKGxpbmstPmRhdGEpID8KKyAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChsaW5rLT5kYXRhKSA6CisgICAgICAgICAgICAgICAgICAgICAibm8gaW50ZXJmYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChsaW5rLT5kYXRhKSA/CisgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobGluay0+ZGF0YSkgOgorICAgICAgICAgICAgICAgICAgICAgIm5vIG1lbWJlciIsCisgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobGluay0+ZGF0YSksCisgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLCBjb25uZWN0aW9uLT5uX2luY29taW5nKTsKKworICAgICAgX2RidXNfbWVzc2FnZV90cmFjZV9yZWYgKGxpbmstPmRhdGEsIC0xLCAtMSwKKyAgICAgICAgICAiX2RidXNfY29ubmVjdGlvbl9wb3BfbWVzc2FnZV9saW5rX3VubG9ja2VkIik7CisKKyAgICAgIGNoZWNrX2Rpc2Nvbm5lY3RlZF9tZXNzYWdlX2Fycml2ZWRfdW5sb2NrZWQgKGNvbm5lY3Rpb24sIGxpbmstPmRhdGEpOworICAgICAgCisgICAgICByZXR1cm4gbGluazsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogU2VlIGRidXNfY29ubmVjdGlvbl9wb3BfbWVzc2FnZSwgYnV0IHJlcXVpcmVzIHRoZSBjYWxsZXIgdG8gb3duCisgKiB0aGUgbG9jayBiZWZvcmUgY2FsbGluZy4gTWF5IGRyb3AgdGhlIGxvY2sgd2hpbGUgcnVubmluZy4KKyAqLworc3RhdGljIERCdXNNZXNzYWdlKgorX2RidXNfY29ubmVjdGlvbl9wb3BfbWVzc2FnZV91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIAorICBsaW5rID0gX2RidXNfY29ubmVjdGlvbl9wb3BfbWVzc2FnZV9saW5rX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKworICBpZiAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNNZXNzYWdlICptZXNzYWdlOworICAgICAgCisgICAgICBtZXNzYWdlID0gbGluay0+ZGF0YTsKKyAgICAgIAorICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmspOworICAgICAgCisgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fcHV0YmFja19tZXNzYWdlX2xpbmtfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgKm1lc3NhZ2VfbGluaykKK3sKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZV9saW5rICE9IE5VTEwpOworICAvKiBZb3UgY2FuJ3QgYm9ycm93IGEgbWVzc2FnZSB3aGlsZSBhIGxpbmsgaXMgb3V0c3RhbmRpbmcgKi8KKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uLT5tZXNzYWdlX2JvcnJvd2VkID09IE5VTEwpOworICAvKiBXZSBoYWQgdG8gaGF2ZSB0aGUgZGlzcGF0Y2ggbG9jayBhY3Jvc3MgdGhlIHBvcC9wdXRiYWNrICovCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbi0+ZGlzcGF0Y2hfYWNxdWlyZWQpOworCisgIF9kYnVzX2xpc3RfcHJlcGVuZF9saW5rICgmY29ubmVjdGlvbi0+aW5jb21pbmdfbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2xpbmspOworICBjb25uZWN0aW9uLT5uX2luY29taW5nICs9IDE7CisKKyAgX2RidXNfdmVyYm9zZSAoIk1lc3NhZ2UgJXAgKCVzICVzICVzICclcycpIHB1dCBiYWNrIGludG8gcXVldWUgJXAsICVkIGluY29taW5nXG4iLAorICAgICAgICAgICAgICAgICBtZXNzYWdlX2xpbmstPmRhdGEsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlX2xpbmstPmRhdGEpKSwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2VfbGluay0+ZGF0YSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZV9saW5rLT5kYXRhKSA6CisgICAgICAgICAgICAgICAgICJubyBpbnRlcmZhY2UiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZV9saW5rLT5kYXRhKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlX2xpbmstPmRhdGEpIDoKKyAgICAgICAgICAgICAgICAgIm5vIG1lbWJlciIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtZXNzYWdlX2xpbmstPmRhdGEpLAorICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLCBjb25uZWN0aW9uLT5uX2luY29taW5nKTsKKworICBfZGJ1c19tZXNzYWdlX3RyYWNlX3JlZiAobWVzc2FnZV9saW5rLT5kYXRhLCAtMSwgLTEsCisgICAgICAiX2RidXNfY29ubmVjdGlvbl9wdXRiYWNrX21lc3NhZ2VfbGlua191bmxvY2tlZCIpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIGZpcnN0LXJlY2VpdmVkIG1lc3NhZ2UgZnJvbSB0aGUgaW5jb21pbmcgbWVzc2FnZSBxdWV1ZSwKKyAqIHJlbW92aW5nIGl0IGZyb20gdGhlIHF1ZXVlLiBUaGUgY2FsbGVyIG93bnMgYSByZWZlcmVuY2UgdG8gdGhlCisgKiByZXR1cm5lZCBtZXNzYWdlLiBJZiB0aGUgcXVldWUgaXMgZW1wdHksIHJldHVybnMgI05VTEwuCisgKgorICogVGhpcyBmdW5jdGlvbiBieXBhc3NlcyBhbnkgbWVzc2FnZSBoYW5kbGVycyB0aGF0IGFyZSByZWdpc3RlcmVkLAorICogYW5kIHNvIHVzaW5nIGl0IGlzIHVzdWFsbHkgd3JvbmcuIEluc3RlYWQsIGxldCB0aGUgbWFpbiBsb29wIGludm9rZQorICogZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkuIFBvcHBpbmcgbWVzc2FnZXMgbWFudWFsbHkgaXMgb25seQorICogdXNlZnVsIGluIHZlcnkgc2ltcGxlIHByb2dyYW1zIHRoYXQgZG9uJ3Qgc2hhcmUgYSAjREJ1c0Nvbm5lY3Rpb24KKyAqIHdpdGggYW55IGxpYnJhcmllcyBvciBvdGhlciBtb2R1bGVzLgorICoKKyAqIFRoZXJlIGlzIGEgbG9jayB0aGF0IGNvdmVycyBhbGwgd2F5cyBvZiBhY2Nlc3NpbmcgdGhlIGluY29taW5nIG1lc3NhZ2UKKyAqIHF1ZXVlLCBzbyBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2goKSwgZGJ1c19jb25uZWN0aW9uX3BvcF9tZXNzYWdlKCksCisgKiBkYnVzX2Nvbm5lY3Rpb25fYm9ycm93X21lc3NhZ2UoKSwgZXRjLiB3aWxsIGFsbCBibG9jayB3aGlsZSBvbmUgb2YgdGhlIG90aGVycworICogaW4gdGhlIGdyb3VwIGlzIHJ1bm5pbmcuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHJldHVybnMgbmV4dCBtZXNzYWdlIGluIHRoZSBpbmNvbWluZyBxdWV1ZS4KKyAqLworREJ1c01lc3NhZ2UqCitkYnVzX2Nvbm5lY3Rpb25fcG9wX21lc3NhZ2UgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgREJ1c0Rpc3BhdGNoU3RhdHVzIHN0YXR1czsKKworICBfZGJ1c192ZXJib3NlICgic3RhcnRcbiIpOworICAKKyAgLyogdGhpcyBpcyBjYWxsZWQgZm9yIHRoZSBzaWRlIGVmZmVjdCB0aGF0IGl0IHF1ZXVlcworICAgKiB1cCBhbnkgbWVzc2FnZXMgZnJvbSB0aGUgdHJhbnNwb3J0CisgICAqLworICBzdGF0dXMgPSBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cyAoY29ubmVjdGlvbik7CisgIGlmIChzdGF0dXMgIT0gREJVU19ESVNQQVRDSF9EQVRBX1JFTUFJTlMpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICBfZGJ1c19jb25uZWN0aW9uX2FjcXVpcmVfZGlzcGF0Y2ggKGNvbm5lY3Rpb24pOworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgbWVzc2FnZSA9IF9kYnVzX2Nvbm5lY3Rpb25fcG9wX21lc3NhZ2VfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX3ZlcmJvc2UgKCJSZXR1cm5pbmcgcG9wcGVkIG1lc3NhZ2UgJXBcbiIsIG1lc3NhZ2UpOyAgICAKKworICBfZGJ1c19jb25uZWN0aW9uX3JlbGVhc2VfZGlzcGF0Y2ggKGNvbm5lY3Rpb24pOworCisgIHN0YXR1cyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBzdGF0dXMpOworICAKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKKy8qKgorICogQWNxdWlyZSB0aGUgZGlzcGF0Y2hlci4gVGhpcyBpcyBhIHNlcGFyYXRlIGxvY2sgc28gdGhlIG1haW4KKyAqIGNvbm5lY3Rpb24gbG9jayBjYW4gYmUgZHJvcHBlZCB0byBjYWxsIG91dCB0byBhcHBsaWNhdGlvbiBkaXNwYXRjaAorICogaGFuZGxlcnMuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkCitfZGJ1c19jb25uZWN0aW9uX2FjcXVpcmVfZGlzcGF0Y2ggKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fcmVmX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgX2RidXNfdmVyYm9zZSAoImxvY2tpbmcgZGlzcGF0Y2hfbXV0ZXhcbiIpOworICBfZGJ1c19jbXV0ZXhfbG9jayAoY29ubmVjdGlvbi0+ZGlzcGF0Y2hfbXV0ZXgpOworCisgIHdoaWxlIChjb25uZWN0aW9uLT5kaXNwYXRjaF9hY3F1aXJlZCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgid2FpdGluZyBmb3IgZGlzcGF0Y2ggdG8gYmUgYWNxdWlyYWJsZVxuIik7CisgICAgICBfZGJ1c19jb25kdmFyX3dhaXQgKGNvbm5lY3Rpb24tPmRpc3BhdGNoX2NvbmQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLT5kaXNwYXRjaF9tdXRleCk7CisgICAgfQorICAKKyAgX2RidXNfYXNzZXJ0ICghY29ubmVjdGlvbi0+ZGlzcGF0Y2hfYWNxdWlyZWQpOworCisgIGNvbm5lY3Rpb24tPmRpc3BhdGNoX2FjcXVpcmVkID0gVFJVRTsKKworICBfZGJ1c192ZXJib3NlICgidW5sb2NraW5nIGRpc3BhdGNoX211dGV4XG4iKTsKKyAgX2RidXNfY211dGV4X3VubG9jayAoY29ubmVjdGlvbi0+ZGlzcGF0Y2hfbXV0ZXgpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgX2RidXNfY29ubmVjdGlvbl91bnJlZl91bmxvY2tlZCAoY29ubmVjdGlvbik7Cit9CisKKy8qKgorICogUmVsZWFzZSB0aGUgZGlzcGF0Y2hlciB3aGVuIHlvdSdyZSBkb25lIHdpdGggaXQuIE9ubHkgY2FsbAorICogYWZ0ZXIgeW91J3ZlIGFjcXVpcmVkIHRoZSBkaXNwYXRjaGVyLiBXYWtlcyB1cCBhdCBtb3N0IG9uZQorICogdGhyZWFkIGN1cnJlbnRseSB3YWl0aW5nIHRvIGFjcXVpcmUgdGhlIGRpc3BhdGNoZXIuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkCitfZGJ1c19jb25uZWN0aW9uX3JlbGVhc2VfZGlzcGF0Y2ggKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgX2RidXNfdmVyYm9zZSAoImxvY2tpbmcgZGlzcGF0Y2hfbXV0ZXhcbiIpOworICBfZGJ1c19jbXV0ZXhfbG9jayAoY29ubmVjdGlvbi0+ZGlzcGF0Y2hfbXV0ZXgpOworICAKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uLT5kaXNwYXRjaF9hY3F1aXJlZCk7CisKKyAgY29ubmVjdGlvbi0+ZGlzcGF0Y2hfYWNxdWlyZWQgPSBGQUxTRTsKKyAgX2RidXNfY29uZHZhcl93YWtlX29uZSAoY29ubmVjdGlvbi0+ZGlzcGF0Y2hfY29uZCk7CisKKyAgX2RidXNfdmVyYm9zZSAoInVubG9ja2luZyBkaXNwYXRjaF9tdXRleFxuIik7CisgIF9kYnVzX2NtdXRleF91bmxvY2sgKGNvbm5lY3Rpb24tPmRpc3BhdGNoX211dGV4KTsKK30KKworc3RhdGljIHZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fZmFpbGVkX3BvcCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkgICAgIERCdXNMaXN0ICAgICAgICptZXNzYWdlX2xpbmspCit7CisgIF9kYnVzX2xpc3RfcHJlcGVuZF9saW5rICgmY29ubmVjdGlvbi0+aW5jb21pbmdfbWVzc2FnZXMsCisJCQkgICBtZXNzYWdlX2xpbmspOworICBjb25uZWN0aW9uLT5uX2luY29taW5nICs9IDE7Cit9CisKKy8qIE5vdGUgdGhpcyBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHNpbmNlIHdlIGRvbid0IHRyYWNrIHdoZXRoZXIgd2UgYWxyZWFkeSBkaWQgaXQgKi8KK3N0YXRpYyB2b2lkCitub3RpZnlfZGlzY29ubmVjdGVkX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKworICAvKiBTZXQgdGhlIHdlYWtyZWYgaW4gZGJ1cy1idXMuYyB0byBOVUxMLCBzbyBub2JvZHkgd2lsbCBnZXQgYSBkaXNjb25uZWN0ZWQKKyAgICogY29ubmVjdGlvbiBmcm9tIGRidXNfYnVzX2dldCgpLiBXZSBtYWtlIHRoZSBzYW1lIGd1YXJhbnRlZSBmb3IKKyAgICogZGJ1c19jb25uZWN0aW9uX29wZW4oKSBidXQgaW4gYSBkaWZmZXJlbnQgd2F5IHNpbmNlIHdlIGRvbid0IHdhbnQgdG8KKyAgICogdW5yZWYgcmlnaHQgaGVyZTsgd2UgaW5zdGVhZCBjaGVjayBmb3IgY29ubmVjdGVkbmVzcyBiZWZvcmUgcmV0dXJuaW5nCisgICAqIHRoZSBjb25uZWN0aW9uIGZyb20gdGhlIGhhc2guCisgICAqLworICBfZGJ1c19idXNfbm90aWZ5X3NoYXJlZF9jb25uZWN0aW9uX2Rpc2Nvbm5lY3RlZF91bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgLyogRHVtcCB0aGUgb3V0Z29pbmcgcXVldWUsIHdlIGFyZW4ndCBnb2luZyB0byBiZSBhYmxlIHRvCisgICAqIHNlbmQgaXQgbm93LCBhbmQgd2UnZCBsaWtlIGFjY2Vzc29ycyBsaWtlCisgICAqIGRidXNfY29ubmVjdGlvbl9nZXRfb3V0Z29pbmdfc2l6ZSgpIHRvIGJlIGFjY3VyYXRlLgorICAgKi8KKyAgaWYgKGNvbm5lY3Rpb24tPm5fb3V0Z29pbmcgPiAwKQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpsaW5rOworICAgICAgCisgICAgICBfZGJ1c192ZXJib3NlICgiRHJvcHBpbmcgJWQgb3V0Z29pbmcgbWVzc2FnZXMgc2luY2Ugd2UncmUgZGlzY29ubmVjdGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi0+bl9vdXRnb2luZyk7CisgICAgICAKKyAgICAgIHdoaWxlICgobGluayA9IF9kYnVzX2xpc3RfZ2V0X2xhc3RfbGluayAoJmNvbm5lY3Rpb24tPm91dGdvaW5nX21lc3NhZ2VzKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX21lc3NhZ2Vfc2VudF91bmxvY2tlZCAoY29ubmVjdGlvbiwgbGluay0+ZGF0YSk7CisgICAgICAgIH0KKyAgICB9IAorfQorCisvKiBOb3RlIHRoaXMgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBzaW5jZSB3ZSBkb24ndCB0cmFjayB3aGV0aGVyIHdlIGFscmVhZHkgZGlkIGl0ICovCitzdGF0aWMgREJ1c0Rpc3BhdGNoU3RhdHVzCitub3RpZnlfZGlzY29ubmVjdGVkX2FuZF9kaXNwYXRjaF9jb21wbGV0ZV91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIAorICBpZiAoY29ubmVjdGlvbi0+ZGlzY29ubmVjdF9tZXNzYWdlX2xpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiU2VuZGluZyBkaXNjb25uZWN0IG1lc3NhZ2VcbiIpOworICAgICAgCisgICAgICAvKiBJZiB3ZSBoYXZlIHBlbmRpbmcgY2FsbHMsIHF1ZXVlIHRoZWlyIHRpbWVvdXRzIC0gd2Ugd2FudCB0aGUgRGlzY29ubmVjdGVkCisgICAgICAgKiB0byBiZSB0aGUgbGFzdCBtZXNzYWdlLCBhZnRlciB0aGVzZSB0aW1lb3V0cy4KKyAgICAgICAqLworICAgICAgY29ubmVjdGlvbl90aW1lb3V0X2FuZF9jb21wbGV0ZV9hbGxfcGVuZGluZ19jYWxsc191bmxvY2tlZCAoY29ubmVjdGlvbik7CisgICAgICAKKyAgICAgIC8qIFdlIGhhdmVuJ3Qgc2VudCB0aGUgZGlzY29ubmVjdCBtZXNzYWdlIGFscmVhZHksCisgICAgICAgKiBhbmQgYWxsIHJlYWwgbWVzc2FnZXMgaGF2ZSBiZWVuIHF1ZXVlZCB1cC4KKyAgICAgICAqLworICAgICAgX2RidXNfY29ubmVjdGlvbl9xdWV1ZV9zeW50aGVzaXplZF9tZXNzYWdlX2xpbmsgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi0+ZGlzY29ubmVjdF9tZXNzYWdlX2xpbmspOworICAgICAgY29ubmVjdGlvbi0+ZGlzY29ubmVjdF9tZXNzYWdlX2xpbmsgPSBOVUxMOworCisgICAgICByZXR1cm4gREJVU19ESVNQQVRDSF9EQVRBX1JFTUFJTlM7CisgICAgfQorCisgIHJldHVybiBEQlVTX0RJU1BBVENIX0NPTVBMRVRFOworfQorCitzdGF0aWMgREJ1c0Rpc3BhdGNoU3RhdHVzCitfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgaWYgKGNvbm5lY3Rpb24tPm5faW5jb21pbmcgPiAwKQorICAgIHJldHVybiBEQlVTX0RJU1BBVENIX0RBVEFfUkVNQUlOUzsKKyAgZWxzZSBpZiAoIV9kYnVzX3RyYW5zcG9ydF9xdWV1ZV9tZXNzYWdlcyAoY29ubmVjdGlvbi0+dHJhbnNwb3J0KSkKKyAgICByZXR1cm4gREJVU19ESVNQQVRDSF9ORUVEX01FTU9SWTsKKyAgZWxzZQorICAgIHsKKyAgICAgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisgICAgICBkYnVzX2Jvb2xfdCBpc19jb25uZWN0ZWQ7CisgICAgICAKKyAgICAgIHN0YXR1cyA9IF9kYnVzX3RyYW5zcG9ydF9nZXRfZGlzcGF0Y2hfc3RhdHVzIChjb25uZWN0aW9uLT50cmFuc3BvcnQpOworICAgICAgaXNfY29ubmVjdGVkID0gX2RidXNfdHJhbnNwb3J0X2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCk7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJkaXNwYXRjaCBzdGF0dXMgPSAlcyBpc19jb25uZWN0ZWQgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIERJU1BBVENIX1NUQVRVU19OQU1FIChzdGF0dXMpLCBpc19jb25uZWN0ZWQpOworICAgICAgCisgICAgICBpZiAoIWlzX2Nvbm5lY3RlZCkKKyAgICAgICAgeworICAgICAgICAgIC8qIEl0J3MgcG9zc2libGUgdGhpcyB3b3VsZCBiZSBiZXR0ZXIgZG9uZSBieSBoYXZpbmcgYW4gZXhwbGljaXQKKyAgICAgICAgICAgKiBub3RpZmljYXRpb24gZnJvbSBfZGJ1c190cmFuc3BvcnRfZGlzY29ubmVjdCgpIHRoYXQgd291bGQKKyAgICAgICAgICAgKiBzeW5jaHJvbm91c2x5IGRvIHRoaXMsIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgdGhlIG5leHQgZGlzcGF0Y2gKKyAgICAgICAgICAgKiBzdGF0dXMgY2hlY2suIEhvd2V2ZXIsIHByb2JhYmx5IG5vdCBnb29kIHRvIGNoYW5nZSB1bnRpbCBpdCBjYXVzZXMKKyAgICAgICAgICAgKiBhIHByb2JsZW0uCisgICAgICAgICAgICovCisgICAgICAgICAgbm90aWZ5X2Rpc2Nvbm5lY3RlZF91bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgICAgICAgICAvKiBJJ20gbm90IHN1cmUgdGhpcyBpcyBuZWVkZWQ7IHRoZSBpZGVhIGlzIHRoYXQgd2Ugd2FudCB0bworICAgICAgICAgICAqIHF1ZXVlIHRoZSBEaXNjb25uZWN0ZWQgb25seSBhZnRlciB3ZSd2ZSByZWFkIGFsbCB0aGUKKyAgICAgICAgICAgKiBtZXNzYWdlcywgYnV0IGlmIHdlJ3JlIGRpc2Nvbm5lY3RlZCBtYXliZSB3ZSBhcmUgZ3VhcmFudGVlZAorICAgICAgICAgICAqIHRvIGhhdmUgcmVhZCB0aGVtIGFsbCA/CisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKHN0YXR1cyA9PSBEQlVTX0RJU1BBVENIX0NPTVBMRVRFKQorICAgICAgICAgICAgc3RhdHVzID0gbm90aWZ5X2Rpc2Nvbm5lY3RlZF9hbmRfZGlzcGF0Y2hfY29tcGxldGVfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworICAgICAgICB9CisgICAgICAKKyAgICAgIGlmIChzdGF0dXMgIT0gREJVU19ESVNQQVRDSF9DT01QTEVURSkKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgIGVsc2UgaWYgKGNvbm5lY3Rpb24tPm5faW5jb21pbmcgPiAwKQorICAgICAgICByZXR1cm4gREJVU19ESVNQQVRDSF9EQVRBX1JFTUFJTlM7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBEQlVTX0RJU1BBVENIX0NPTVBMRVRFOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChEQnVzQ29ubmVjdGlvbiAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRGlzcGF0Y2hTdGF0dXMgbmV3X3N0YXR1cykKK3sKKyAgZGJ1c19ib29sX3QgY2hhbmdlZDsKKyAgREJ1c0Rpc3BhdGNoU3RhdHVzRnVuY3Rpb24gZnVuY3Rpb247CisgIHZvaWQgKmRhdGE7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKworICBfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgY2hhbmdlZCA9IG5ld19zdGF0dXMgIT0gY29ubmVjdGlvbi0+bGFzdF9kaXNwYXRjaF9zdGF0dXM7CisKKyAgY29ubmVjdGlvbi0+bGFzdF9kaXNwYXRjaF9zdGF0dXMgPSBuZXdfc3RhdHVzOworCisgIGZ1bmN0aW9uID0gY29ubmVjdGlvbi0+ZGlzcGF0Y2hfc3RhdHVzX2Z1bmN0aW9uOworICBkYXRhID0gY29ubmVjdGlvbi0+ZGlzcGF0Y2hfc3RhdHVzX2RhdGE7CisKKyAgaWYgKGNvbm5lY3Rpb24tPmRpc2Nvbm5lY3RlZF9tZXNzYWdlX2Fycml2ZWQgJiYKKyAgICAgICFjb25uZWN0aW9uLT5kaXNjb25uZWN0ZWRfbWVzc2FnZV9wcm9jZXNzZWQpCisgICAgeworICAgICAgY29ubmVjdGlvbi0+ZGlzY29ubmVjdGVkX21lc3NhZ2VfcHJvY2Vzc2VkID0gVFJVRTsKKyAgICAgIAorICAgICAgLyogdGhpcyBkb2VzIGFuIHVucmVmLCBidXQgd2UgaGF2ZSBhIHJlZgorICAgICAgICogc28gd2Ugc2hvdWxkIG5vdCBydW4gdGhlIGZpbmFsaXplciBoZXJlCisgICAgICAgKiBpbnNpZGUgdGhlIGxvY2suCisgICAgICAgKi8KKyAgICAgIGNvbm5lY3Rpb25fZm9yZ2V0X3NoYXJlZF91bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgICAgIGlmIChjb25uZWN0aW9uLT5leGl0X29uX2Rpc2Nvbm5lY3QpCisgICAgICAgIHsKKyAgICAgICAgICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7ICAgICAgICAgICAgCisgICAgICAgICAgCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkV4aXRpbmcgb24gRGlzY29ubmVjdGVkIHNpZ25hbFxuIik7CisgICAgICAgICAgaWYgKHJhaXNlIChTSUdURVJNKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIHJhaXNlIGEgU0lHVEVSTSBzaWduYWwuIEV4aXRpbmdcbiIpOworICAgICAgICAgICAgICBfZGJ1c19leGl0ICgxKTsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiQ2FsbCB0byBleGl0KCkgcmV0dXJuZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgIAorICAvKiBXZSBkcm9wIHRoZSBsb2NrICovCisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgCisgIGlmIChjaGFuZ2VkICYmIGZ1bmN0aW9uKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJOb3RpZnlpbmcgb2YgY2hhbmdlIHRvIGRpc3BhdGNoIHN0YXR1cyBvZiAlcCBub3cgJWQgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sIG5ld19zdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICBESVNQQVRDSF9TVEFUVVNfTkFNRSAobmV3X3N0YXR1cykpOworICAgICAgKCogZnVuY3Rpb24pIChjb25uZWN0aW9uLCBuZXdfc3RhdHVzLCBkYXRhKTsgICAgICAKKyAgICB9CisgIAorICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworfQorCisvKioKKyAqIEdldHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGluY29taW5nIG1lc3NhZ2UgcXVldWUuCisgKiAjREJVU19ESVNQQVRDSF9EQVRBX1JFTUFJTlMgaW5kaWNhdGVzIHRoYXQgdGhlIG1lc3NhZ2UgcXVldWUKKyAqIG1heSBjb250YWluIG1lc3NhZ2VzLiAjREJVU19ESVNQQVRDSF9DT01QTEVURSBpbmRpY2F0ZXMgdGhhdCB0aGUKKyAqIGluY29taW5nIHF1ZXVlIGlzIGVtcHR5LiAjREJVU19ESVNQQVRDSF9ORUVEX01FTU9SWSBpbmRpY2F0ZXMgdGhhdAorICogdGhlcmUgY291bGQgYmUgZGF0YSwgYnV0IHdlIGNhbid0IGtub3cgZm9yIHN1cmUgd2l0aG91dCBtb3JlCisgKiBtZW1vcnkuCisgKgorICogVG8gcHJvY2VzcyB0aGUgaW5jb21pbmcgbWVzc2FnZSBxdWV1ZSwgdXNlIGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCgpCisgKiBvciAoaW4gcmFyZSBjYXNlcykgZGJ1c19jb25uZWN0aW9uX3BvcF9tZXNzYWdlKCkuCisgKgorICogTm90ZSwgI0RCVVNfRElTUEFUQ0hfREFUQV9SRU1BSU5TIHJlYWxseSBtZWFucyB0aGF0IGVpdGhlciB3ZQorICogaGF2ZSBtZXNzYWdlcyBpbiB0aGUgcXVldWUsIG9yIHdlIGhhdmUgcmF3IGJ5dGVzIGJ1ZmZlcmVkIHVwCisgKiB0aGF0IG5lZWQgdG8gYmUgcGFyc2VkLiBXaGVuIHRoZXNlIGJ5dGVzIGFyZSBwYXJzZWQsIHRoZXkKKyAqIG1heSBub3QgYWRkIHVwIHRvIGFuIGVudGlyZSBtZXNzYWdlLiBUaHVzLCBpdCdzIHBvc3NpYmxlCisgKiB0byBzZWUgYSBzdGF0dXMgb2YgI0RCVVNfRElTUEFUQ0hfREFUQV9SRU1BSU5TIGJ1dCBub3QKKyAqIGhhdmUgYSBtZXNzYWdlIHlldC4KKyAqCisgKiBJbiBwYXJ0aWN1bGFyIHRoaXMgaGFwcGVucyBvbiBpbml0aWFsIGNvbm5lY3Rpb24sIGJlY2F1c2UgYWxsIHNvcnRzCisgKiBvZiBhdXRoZW50aWNhdGlvbiBwcm90b2NvbCBzdHVmZiBoYXMgdG8gYmUgcGFyc2VkIGJlZm9yZSB0aGUKKyAqIGZpcnN0IG1lc3NhZ2UgYXJyaXZlcy4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcmV0dXJucyBjdXJyZW50IGRpc3BhdGNoIHN0YXR1cworICovCitEQnVzRGlzcGF0Y2hTdGF0dXMKK2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c0Rpc3BhdGNoU3RhdHVzIHN0YXR1czsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgREJVU19ESVNQQVRDSF9DT01QTEVURSk7CisKKyAgX2RidXNfdmVyYm9zZSAoInN0YXJ0XG4iKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyAgc3RhdHVzID0gX2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKyAgCisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEZpbHRlciBmdW50aW9uIGZvciBoYW5kbGluZyB0aGUgUGVlciBzdGFuZGFyZCBpbnRlcmZhY2UuCisgKi8KK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorX2RidXNfY29ubmVjdGlvbl9wZWVyX2ZpbHRlcl91bmxvY2tlZF9ub191cGRhdGUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlKQoreworICBkYnVzX2Jvb2xfdCBzZW50ID0gRkFMU0U7CisgIERCdXNNZXNzYWdlICpyZXQgPSBOVUxMOworICBEQnVzTGlzdCAqZXhwaXJlX2xpbms7CisKKyAgaWYgKGNvbm5lY3Rpb24tPnJvdXRlX3BlZXJfbWVzc2FnZXMgJiYgZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSkgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBUaGlzIG1lYW5zIHdlJ3JlIGxldHRpbmcgdGhlIGJ1cyByb3V0ZSB0aGlzIG1lc3NhZ2UgKi8KKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX2ludGVyZmFjZSAobWVzc2FnZSwgREJVU19JTlRFUkZBQ0VfUEVFUikpCisgICAgeworICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworICAgIH0KKworICAvKiBQcmVhbGxvY2F0ZSBhIGxpbmtlZC1saXN0IGxpbmssIHNvIHRoYXQgaWYgd2UgbmVlZCB0byBkaXNwb3NlIG9mIGEKKyAgICogbWVzc2FnZSwgd2UgY2FuIGF0dGFjaCBpdCB0byB0aGUgZXhwaXJlZCBsaXN0ICovCisgIGV4cGlyZV9saW5rID0gX2RidXNfbGlzdF9hbGxvY19saW5rIChOVUxMKTsKKworICBpZiAoIWV4cGlyZV9saW5rKQorICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX1BFRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQaW5nIikpCisgICAgeworICAgICAgcmV0ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgICAgIGlmIChyZXQgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIHNlbnQgPSBfZGJ1c19jb25uZWN0aW9uX3NlbmRfdW5sb2NrZWRfbm9fdXBkYXRlIChjb25uZWN0aW9uLCByZXQsIE5VTEwpOworICAgIH0KKyAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX21ldGhvZF9jYWxsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX1BFRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdldE1hY2hpbmVJZCIpKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgdXVpZDsKKyAgICAgIAorICAgICAgcmV0ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgICAgIGlmIChyZXQgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0ICgmdXVpZCk7CisgICAgICBpZiAoX2RidXNfZ2V0X2xvY2FsX21hY2hpbmVfdXVpZF9lbmNvZGVkICgmdXVpZCkpCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBjaGFyICp2X1NUUklORyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnV1aWQpOworICAgICAgICAgIGlmIChkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdl9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBzZW50ID0gX2RidXNfY29ubmVjdGlvbl9zZW5kX3VubG9ja2VkX25vX3VwZGF0ZSAoY29ubmVjdGlvbiwgcmV0LCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ1dWlkKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBXZSBuZWVkIHRvIGJvdW5jZSBhbnl0aGluZyBlbHNlIHdpdGggdGhpcyBpbnRlcmZhY2UsIG90aGVyd2lzZSBhcHBzCisgICAgICAgKiBjb3VsZCBzdGFydCBleHRlbmRpbmcgdGhlIGludGVyZmFjZSBhbmQgd2hlbiB3ZSBhZGRlZCBleHRlbnNpb25zCisgICAgICAgKiBoZXJlIHRvIERCdXNDb25uZWN0aW9uIHdlJ2QgYnJlYWsgdGhvc2UgYXBwcy4KKyAgICAgICAqLworICAgICAgcmV0ID0gZGJ1c19tZXNzYWdlX25ld19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfVU5LTk9XTl9NRVRIT0QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBtZXRob2QgaW52b2tlZCBvbiBvcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyIGludGVyZmFjZSIpOworICAgICAgaWYgKHJldCA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgc2VudCA9IF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF91bmxvY2tlZF9ub191cGRhdGUgKGNvbm5lY3Rpb24sIHJldCwgTlVMTCk7CisgICAgfQorCitvdXQ6CisgIGlmIChyZXQgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAoZXhwaXJlX2xpbmspOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEl0J2xsIGJlIHNhZmUgdG8gdW5yZWYgdGhlIHJlcGx5IHdoZW4gd2UgdW5sb2NrICovCisgICAgICBleHBpcmVfbGluay0+ZGF0YSA9IHJldDsKKyAgICAgIF9kYnVzX2xpc3RfcHJlcGVuZF9saW5rICgmY29ubmVjdGlvbi0+ZXhwaXJlZF9tZXNzYWdlcywgZXhwaXJlX2xpbmspOworICAgIH0KKworICBpZiAoIXNlbnQpCisgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTkVFRF9NRU1PUlk7CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKK30KKworLyoqCisqIFByb2Nlc3NlcyBhbGwgYnVpbHRpbiBmaWx0ZXIgZnVuY3Rpb25zCisqCisqIElmIHRoZSBzcGVjIHNwZWNpZmllcyBhIHN0YW5kYXJkIGludGVyZmFjZQorKiB0aGV5IHNob3VsZCBiZSBwcm9jZXNzZWQgZnJvbSB0aGlzIG1ldGhvZAorKiovCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK19kYnVzX2Nvbm5lY3Rpb25fcnVuX2J1aWx0aW5fZmlsdGVyc191bmxvY2tlZF9ub191cGRhdGUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSkKK3sKKyAgLyogV2UganVzdCBydW4gb25lIGZpbHRlciBmb3Igbm93IGJ1dCBoYXZlIHRoZSBvcHRpb24gdG8gcnVuIG1vcmUKKyAgICAgaWYgdGhlIHNwZWMgY2FsbHMgZm9yIGl0IGluIHRoZSBmdXR1cmUgKi8KKworICByZXR1cm4gX2RidXNfY29ubmVjdGlvbl9wZWVyX2ZpbHRlcl91bmxvY2tlZF9ub191cGRhdGUgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworfQorCisvKioKKyAqIFByb2Nlc3NlcyBhbnkgaW5jb21pbmcgZGF0YS4KKyAqCisgKiBJZiB0aGVyZSdzIGluY29taW5nIHJhdyBkYXRhIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBwYXJzZWQsIGl0IGlzCisgKiBwYXJzZWQsIHdoaWNoIG1heSBvciBtYXkgbm90IHJlc3VsdCBpbiBhZGRpbmcgbWVzc2FnZXMgdG8gdGhlCisgKiBpbmNvbWluZyBxdWV1ZS4KKyAqCisgKiBUaGUgaW5jb21pbmcgZGF0YSBidWZmZXIgaXMgZmlsbGVkIHdoZW4gdGhlIGNvbm5lY3Rpb24gcmVhZHMgZnJvbQorICogaXRzIHVuZGVybHlpbmcgdHJhbnNwb3J0IChzdWNoIGFzIGEgc29ja2V0KS4gIFJlYWRpbmcgdXN1YWxseQorICogaGFwcGVucyBpbiBkYnVzX3dhdGNoX2hhbmRsZSgpIG9yIGRidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlKCkuCisgKiAKKyAqIElmIHRoZXJlIGFyZSBjb21wbGV0ZSBtZXNzYWdlcyBpbiB0aGUgaW5jb21pbmcgcXVldWUsCisgKiBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2goKSByZW1vdmVzIG9uZSBtZXNzYWdlIGZyb20gdGhlIHF1ZXVlIGFuZAorICogcHJvY2Vzc2VzIGl0LiBQcm9jZXNzaW5nIGhhcyB0aHJlZSBzdGVwcy4KKyAqCisgKiBGaXJzdCwgYW55IG1ldGhvZCByZXBsaWVzIGFyZSBwYXNzZWQgdG8gI0RCdXNQZW5kaW5nQ2FsbCBvcgorICogZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2soKSBpbiBvcmRlciB0bworICogY29tcGxldGUgdGhlIHBlbmRpbmcgbWV0aG9kIGNhbGwuCisgKiAKKyAqIFNlY29uZCwgYW55IGZpbHRlcnMgcmVnaXN0ZXJlZCB3aXRoIGRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyKCkKKyAqIGFyZSBydW4uIElmIGFueSBmaWx0ZXIgcmV0dXJucyAjREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVECisgKiB0aGVuIHByb2Nlc3Npbmcgc3RvcHMgYWZ0ZXIgdGhhdCBmaWx0ZXIuCisgKgorICogVGhpcmQsIGlmIHRoZSBtZXNzYWdlIGlzIGEgbWV0aG9kIGNhbGwgaXQgaXMgZm9yd2FyZGVkIHRvCisgKiBhbnkgcmVnaXN0ZXJlZCBvYmplY3QgcGF0aCBoYW5kbGVycyBhZGRlZCB3aXRoCisgKiBkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfb2JqZWN0X3BhdGgoKSBvcgorICogZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX2ZhbGxiYWNrKCkuCisgKgorICogQSBzaW5nbGUgY2FsbCB0byBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2goKSB3aWxsIHByb2Nlc3MgYXQgbW9zdAorICogb25lIG1lc3NhZ2U7IGl0IHdpbGwgbm90IGNsZWFyIHRoZSBlbnRpcmUgbWVzc2FnZSBxdWV1ZS4KKyAqCisgKiBCZSBjYXJlZnVsIGFib3V0IGNhbGxpbmcgZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkgZnJvbSBpbnNpZGUgYQorICogbWVzc2FnZSBoYW5kbGVyLCBpLmUuIGNhbGxpbmcgZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkKKyAqIHJlY3Vyc2l2ZWx5LiAgSWYgdGhyZWFkcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBhIHJlY3Vyc2l2ZQorICogbXV0ZXggZnVuY3Rpb24sIHRoZW4gdGhpcyB3aWxsIG5vdCBkZWFkbG9jazsgaG93ZXZlciwgaXQgY2FuCisgKiBjZXJ0YWlubHkgY29uZnVzZSB5b3VyIGFwcGxpY2F0aW9uLgorICogCisgKiBAdG9kbyBzb21lIEZJWE1FIGluIGhlcmUgYWJvdXQgaGFuZGxpbmcgREJVU19IQU5ETEVSX1JFU1VMVF9ORUVEX01FTU9SWQorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHJldHVybnMgZGlzcGF0Y2ggc3RhdHVzLCBzZWUgZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXMoKQorICovCitEQnVzRGlzcGF0Y2hTdGF0dXMKK2RidXNfY29ubmVjdGlvbl9kaXNwYXRjaCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBEQnVzTGlzdCAqbGluaywgKmZpbHRlcl9saXN0X2NvcHksICptZXNzYWdlX2xpbms7CisgIERCdXNIYW5kbGVyUmVzdWx0IHJlc3VsdDsKKyAgREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nOworICBkYnVzX2ludDMyX3QgcmVwbHlfc2VyaWFsOworICBEQnVzRGlzcGF0Y2hTdGF0dXMgc3RhdHVzOworICBkYnVzX2Jvb2xfdCBmb3VuZF9vYmplY3Q7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIERCVVNfRElTUEFUQ0hfQ09NUExFVEUpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJcbiIpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgc3RhdHVzID0gX2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKyAgaWYgKHN0YXR1cyAhPSBEQlVTX0RJU1BBVENIX0RBVEFfUkVNQUlOUykKKyAgICB7CisgICAgICAvKiB1bmxvY2tzIGFuZCBjYWxscyBvdXQgdG8gdXNlciBjb2RlICovCisgICAgICBfZGJ1c19jb25uZWN0aW9uX3VwZGF0ZV9kaXNwYXRjaF9zdGF0dXNfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgc3RhdHVzKTsKKyAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAKKyAgLyogV2UgbmVlZCB0byByZWYgdGhlIGNvbm5lY3Rpb24gc2luY2UgdGhlIGNhbGxiYWNrIGNvdWxkIHBvdGVudGlhbGx5CisgICAqIGRyb3AgdGhlIGxhc3QgcmVmIHRvIGl0CisgICAqLworICBfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfY29ubmVjdGlvbl9hY3F1aXJlX2Rpc3BhdGNoIChjb25uZWN0aW9uKTsKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKworICBtZXNzYWdlX2xpbmsgPSBfZGJ1c19jb25uZWN0aW9uX3BvcF9tZXNzYWdlX2xpbmtfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZV9saW5rID09IE5VTEwpCisgICAgeworICAgICAgLyogYW5vdGhlciB0aHJlYWQgZGlzcGF0Y2hlZCBvdXIgc3R1ZmYgKi8KKworICAgICAgX2RidXNfdmVyYm9zZSAoImFub3RoZXIgdGhyZWFkIGRpc3BhdGNoZWQgbWVzc2FnZSAoZHVyaW5nIGFjcXVpcmVfZGlzcGF0Y2ggYWJvdmUpXG4iKTsKKyAgICAgIAorICAgICAgX2RidXNfY29ubmVjdGlvbl9yZWxlYXNlX2Rpc3BhdGNoIChjb25uZWN0aW9uKTsKKworICAgICAgc3RhdHVzID0gX2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKworICAgICAgX2RidXNfY29ubmVjdGlvbl91cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sIHN0YXR1cyk7CisgICAgICAKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisgICAgICAKKyAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgIG1lc3NhZ2UgPSBtZXNzYWdlX2xpbmstPmRhdGE7CisKKyAgX2RidXNfdmVyYm9zZSAoIiBkaXNwYXRjaGluZyBtZXNzYWdlICVwICglcyAlcyAlcyAnJXMnKVxuIiwKKyAgICAgICAgICAgICAgICAgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpKSwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpIDoKKyAgICAgICAgICAgICAgICAgIm5vIGludGVyZmFjZSIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBtZW1iZXIiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSkpOworCisgIHJlc3VsdCA9IERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworICAKKyAgLyogUGVuZGluZyBjYWxsIGhhbmRsaW5nIG11c3QgYmUgZmlyc3QsIGJlY2F1c2UgaWYgeW91IGRvCisgICAqIGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKCkgb3IKKyAgICogZGJ1c19wZW5kaW5nX2NhbGxfYmxvY2soKSB0aGVuIG5vIGhhbmRsZXJzL2ZpbHRlcnMgd2lsbCBiZSBydW4gb24KKyAgICogdGhlIHJlcGx5LiBXZSB3YW50IGNvbnNpc3RlbnQgc2VtYW50aWNzIGluIHRoZSBjYXNlIHdoZXJlIHdlCisgICAqIGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCgpIHRoZSByZXBseS4KKyAgICovCisgIAorICByZXBseV9zZXJpYWwgPSBkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSk7CisgIHBlbmRpbmcgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9pbnQgKGNvbm5lY3Rpb24tPnBlbmRpbmdfcmVwbGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlfc2VyaWFsKTsKKyAgaWYgKHBlbmRpbmcpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkRpc3BhdGNoaW5nIGEgcGVuZGluZyByZXBseVxuIik7CisgICAgICBjb21wbGV0ZV9wZW5kaW5nX2NhbGxfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgcGVuZGluZywgbWVzc2FnZSk7CisgICAgICBwZW5kaW5nID0gTlVMTDsgLyogaXQncyBwcm9iYWJseSB1bnJlZidkICovCisgICAgICAKKyAgICAgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgICAgICBfZGJ1c192ZXJib3NlICgicGVuZGluZyBjYWxsIGNvbXBsZXRlZCBpbiBkaXNwYXRjaFxuIik7CisgICAgICByZXN1bHQgPSBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmVzdWx0ID0gX2RidXNfY29ubmVjdGlvbl9ydW5fYnVpbHRpbl9maWx0ZXJzX3VubG9ja2VkX25vX3VwZGF0ZSAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisgIGlmIChyZXN1bHQgIT0gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQpCisgICAgZ290byBvdXQ7CisgCisgIGlmICghX2RidXNfbGlzdF9jb3B5ICgmY29ubmVjdGlvbi0+ZmlsdGVyX2xpc3QsICZmaWx0ZXJfbGlzdF9jb3B5KSkKKyAgICB7CisgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlbGVhc2VfZGlzcGF0Y2ggKGNvbm5lY3Rpb24pOworICAgICAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgICAgIAorICAgICAgX2RidXNfY29ubmVjdGlvbl9mYWlsZWRfcG9wIChjb25uZWN0aW9uLCBtZXNzYWdlX2xpbmspOworCisgICAgICAvKiB1bmxvY2tzIGFuZCBjYWxscyB1c2VyIGNvZGUgKi8KKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRElTUEFUQ0hfTkVFRF9NRU1PUlkpOworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKyAgICAgIAorICAgICAgcmV0dXJuIERCVVNfRElTUEFUQ0hfTkVFRF9NRU1PUlk7CisgICAgfQorICAKKyAgX2RidXNfbGlzdF9mb3JlYWNoICgmZmlsdGVyX2xpc3RfY29weSwKKwkJICAgICAgKERCdXNGb3JlYWNoRnVuY3Rpb24pX2RidXNfbWVzc2FnZV9maWx0ZXJfcmVmLAorCQkgICAgICBOVUxMKTsKKworICAvKiBXZSdyZSBzdGlsbCBwcm90ZWN0ZWQgZnJvbSBkaXNwYXRjaCgpIHJlZW50cmFuY3kgaGVyZQorICAgKiBzaW5jZSB3ZSBhY3F1aXJlZCB0aGUgZGlzcGF0Y2hlcgorICAgKi8KKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZmaWx0ZXJfbGlzdF9jb3B5KTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTWVzc2FnZUZpbHRlciAqZmlsdGVyID0gbGluay0+ZGF0YTsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmZmlsdGVyX2xpc3RfY29weSwgbGluayk7CisKKyAgICAgIGlmIChmaWx0ZXItPmZ1bmN0aW9uID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICBmaWx0ZXIgd2FzIHJlbW92ZWQgaW4gYSBjYWxsYmFjayBmdW5jdGlvblxuIik7CisgICAgICAgICAgbGluayA9IG5leHQ7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgX2RidXNfdmVyYm9zZSAoIiAgcnVubmluZyBmaWx0ZXIgb24gbWVzc2FnZSAlcFxuIiwgbWVzc2FnZSk7CisgICAgICByZXN1bHQgPSAoKiBmaWx0ZXItPmZ1bmN0aW9uKSAoY29ubmVjdGlvbiwgbWVzc2FnZSwgZmlsdGVyLT51c2VyX2RhdGEpOworCisgICAgICBpZiAocmVzdWx0ICE9IERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEKQorCWJyZWFrOworCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisKKyAgX2RidXNfbGlzdF9mb3JlYWNoICgmZmlsdGVyX2xpc3RfY29weSwKKwkJICAgICAgKERCdXNGb3JlYWNoRnVuY3Rpb24pX2RidXNfbWVzc2FnZV9maWx0ZXJfdW5yZWYsCisJCSAgICAgIE5VTEwpOworICBfZGJ1c19saXN0X2NsZWFyICgmZmlsdGVyX2xpc3RfY29weSk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgIGlmIChyZXN1bHQgPT0gREJVU19IQU5ETEVSX1JFU1VMVF9ORUVEX01FTU9SWSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiTm8gbWVtb3J5XG4iKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgZWxzZSBpZiAocmVzdWx0ID09IERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiZmlsdGVyIGhhbmRsZWQgbWVzc2FnZSBpbiBkaXNwYXRjaFxuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgLyogV2UncmUgc3RpbGwgcHJvdGVjdGVkIGZyb20gZGlzcGF0Y2goKSByZWVudHJhbmN5IGhlcmUKKyAgICogc2luY2Ugd2UgYWNxdWlyZWQgdGhlIGRpc3BhdGNoZXIKKyAgICovCisgIF9kYnVzX3ZlcmJvc2UgKCIgIHJ1bm5pbmcgb2JqZWN0IHBhdGggZGlzcGF0Y2ggb24gbWVzc2FnZSAlcCAoJXMgJXMgJXMgJyVzJylcbiIsCisgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSksCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBpbnRlcmZhY2UiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgOgorICAgICAgICAgICAgICAgICAibm8gbWVtYmVyIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG1lc3NhZ2UpKTsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICByZXN1bHQgPSBfZGJ1c19vYmplY3RfdHJlZV9kaXNwYXRjaF9hbmRfdW5sb2NrIChjb25uZWN0aW9uLT5vYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm91bmRfb2JqZWN0KTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyAgaWYgKHJlc3VsdCAhPSBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgib2JqZWN0IHRyZWUgaGFuZGxlZCBtZXNzYWdlIGluIGRpc3BhdGNoXG4iKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCkKKyAgICB7CisgICAgICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgICAgICBEQnVzU3RyaW5nIHN0cjsKKyAgICAgIERCdXNQcmVhbGxvY2F0ZWRTZW5kICpwcmVhbGxvY2F0ZWQ7CisgICAgICBEQnVzTGlzdCAqZXhwaXJlX2xpbms7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIHNlbmRpbmcgZXJyb3IgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1VOS05PV05fTUVUSE9EKTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgICAgIHsKKyAgICAgICAgICByZXN1bHQgPSBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJubyBtZW1vcnkgZm9yIGVycm9yIHN0cmluZyBpbiBkaXNwYXRjaFxuIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1ldGhvZCBcIiVzXCIgd2l0aCBzaWduYXR1cmUgXCIlc1wiIG9uIGludGVyZmFjZSBcIiVzXCIgZG9lc24ndCBleGlzdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgICAgICAgICAgcmVzdWx0ID0gREJVU19IQU5ETEVSX1JFU1VMVF9ORUVEX01FTU9SWTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgibm8gbWVtb3J5IGZvciBlcnJvciBzdHJpbmcgaW4gZGlzcGF0Y2hcbiIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAKKyAgICAgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfb2JqZWN0ID8gREJVU19FUlJPUl9VTktOT1dOX01FVEhPRCA6IERCVVNfRVJST1JfVU5LTk9XTl9PQkpFQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworCisgICAgICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIHJlc3VsdCA9IERCVVNfSEFORExFUl9SRVNVTFRfTkVFRF9NRU1PUlk7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIm5vIG1lbW9yeSBmb3IgZXJyb3IgcmVwbHkgaW4gZGlzcGF0Y2hcbiIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGV4cGlyZV9saW5rID0gX2RidXNfbGlzdF9hbGxvY19saW5rIChyZXBseSk7CisKKyAgICAgIGlmIChleHBpcmVfbGluayA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICAgICAgcmVzdWx0ID0gREJVU19IQU5ETEVSX1JFU1VMVF9ORUVEX01FTU9SWTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgibm8gbWVtb3J5IGZvciBlcnJvciBzZW5kIGluIGRpc3BhdGNoXG4iKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBwcmVhbGxvY2F0ZWQgPSBfZGJ1c19jb25uZWN0aW9uX3ByZWFsbG9jYXRlX3NlbmRfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgICAgICBpZiAocHJlYWxsb2NhdGVkID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAoZXhwaXJlX2xpbmspOworICAgICAgICAgIC8qIEl0J3MgT0sgdGhhdCB0aGlzIGlzIGZpbmFsaXplZCwgYmVjYXVzZSBpdCBoYXNuJ3QgYmVlbiBzZWVuIGJ5CisgICAgICAgICAgICogYW55dGhpbmcgdGhhdCBjb3VsZCBhdHRhY2ggdXNlciBjYWxsYmFja3MgKi8KKyAgICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgICAgICByZXN1bHQgPSBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJubyBtZW1vcnkgZm9yIGVycm9yIHNlbmQgaW4gZGlzcGF0Y2hcbiIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF9wcmVhbGxvY2F0ZWRfdW5sb2NrZWRfbm9fdXBkYXRlIChjb25uZWN0aW9uLCBwcmVhbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHksIE5VTEwpOworICAgICAgLyogcmVwbHkgd2lsbCBiZSBmcmVlZCB3aGVuIHdlIHJlbGVhc2UgdGhlIGxvY2sgKi8KKyAgICAgIF9kYnVzX2xpc3RfcHJlcGVuZF9saW5rICgmY29ubmVjdGlvbi0+ZXhwaXJlZF9tZXNzYWdlcywgZXhwaXJlX2xpbmspOworCisgICAgICByZXN1bHQgPSBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisgICAgfQorICAKKyAgX2RidXNfdmVyYm9zZSAoIiAgZG9uZSBkaXNwYXRjaGluZyAlcCAoJXMgJXMgJXMgJyVzJykgb24gY29ubmVjdGlvbiAlcFxuIiwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpKSwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpIDoKKyAgICAgICAgICAgICAgICAgIm5vIGludGVyZmFjZSIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBtZW1iZXIiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24pOworICAKKyBvdXQ6CisgIGlmIChyZXN1bHQgPT0gREJVU19IQU5ETEVSX1JFU1VMVF9ORUVEX01FTU9SWSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgib3V0IG9mIG1lbW9yeVxuIik7CisgICAgICAKKyAgICAgIC8qIFB1dCBtZXNzYWdlIGJhY2ssIGFuZCB3ZSdsbCBzdGFydCBvdmVyLgorICAgICAgICogWWVzIHRoaXMgbWVhbnMgaGFuZGxlcnMgbXVzdCBiZSBpZGVtcG90ZW50IGlmIHRoZXkKKyAgICAgICAqIGRvbid0IHJldHVybiBIQU5ETEVEOyBjJ2VzdCBsYSB2aWUuCisgICAgICAgKi8KKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcHV0YmFja19tZXNzYWdlX2xpbmtfdW5sb2NrZWQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2xpbmspOworICAgICAgLyogbm93IHdlIGRvbid0IHdhbnQgdG8gZnJlZSB0aGVtICovCisgICAgICBtZXNzYWdlX2xpbmsgPSBOVUxMOworICAgICAgbWVzc2FnZSA9IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIiAuLi4gZG9uZSBkaXNwYXRjaGluZ1xuIik7CisgICAgfQorCisgIF9kYnVzX2Nvbm5lY3Rpb25fcmVsZWFzZV9kaXNwYXRjaCAoY29ubmVjdGlvbik7CisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisKKyAgaWYgKG1lc3NhZ2UgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBXZSBkb24ndCB3YW50IHRoaXMgbWVzc2FnZSB0byBjb3VudCBpbiBtYXhpbXVtIG1lc3NhZ2UgbGltaXRzIHdoZW4KKyAgICAgICAqIGNvbXB1dGluZyB0aGUgZGlzcGF0Y2ggc3RhdHVzLCBiZWxvdy4gV2UgaGF2ZSB0byBkcm9wIHRoZSBsb2NrCisgICAgICAgKiB0ZW1wb3JhcmlseSwgYmVjYXVzZSBmaW5hbGl6aW5nIGEgbWVzc2FnZSBjYW4gdHJpZ2dlciBjYWxsYmFja3MuCisgICAgICAgKgorICAgICAgICogV2UgaGF2ZSBhIHJlZmVyZW5jZSB0byB0aGUgY29ubmVjdGlvbiwgYW5kIHdlIGRvbid0IHVzZSBhbnkgY2FjaGVkCisgICAgICAgKiBwb2ludGVycyB0byB0aGUgY29ubmVjdGlvbidzIGludGVybmFscyBiZWxvdyB0aGlzIHBvaW50LCBzbyBpdCBzaG91bGQKKyAgICAgICAqIGJlIHNhZmUgdG8gZHJvcCB0aGUgbG9jayBhbmQgdGFrZSBpdCBiYWNrLiAqLworICAgICAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgICAgfQorCisgIGlmIChtZXNzYWdlX2xpbmsgIT0gTlVMTCkKKyAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAobWVzc2FnZV9saW5rKTsKKworICBfZGJ1c192ZXJib3NlICgiYmVmb3JlIGZpbmFsIHN0YXR1cyB1cGRhdGVcbiIpOworICBzdGF0dXMgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgIC8qIHVubG9ja3MgYW5kIGNhbGxzIHVzZXIgY29kZSAqLworICBfZGJ1c19jb25uZWN0aW9uX3VwZGF0ZV9kaXNwYXRjaF9zdGF0dXNfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgc3RhdHVzKTsKKyAgCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisgIAorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIFNldHMgdGhlIHdhdGNoIGZ1bmN0aW9ucyBmb3IgdGhlIGNvbm5lY3Rpb24uIFRoZXNlIGZ1bmN0aW9ucyBhcmUKKyAqIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgdGhlIGFwcGxpY2F0aW9uJ3MgbWFpbiBsb29wIGF3YXJlIG9mIGZpbGUKKyAqIGRlc2NyaXB0b3JzIHRoYXQgbmVlZCB0byBiZSBtb25pdG9yZWQgZm9yIGV2ZW50cywgdXNpbmcgc2VsZWN0KCkgb3IKKyAqIHBvbGwoKS4gV2hlbiB1c2luZyBRdCwgdHlwaWNhbGx5IHRoZSBEQnVzQWRkV2F0Y2hGdW5jdGlvbiB3b3VsZAorICogY3JlYXRlIGEgUVNvY2tldE5vdGlmaWVyLiBXaGVuIHVzaW5nIEdMaWIsIHRoZSBEQnVzQWRkV2F0Y2hGdW5jdGlvbgorICogY291bGQgY2FsbCBnX2lvX2FkZF93YXRjaCgpLCBvciBjb3VsZCBiZSB1c2VkIGFzIHBhcnQgb2YgYSBtb3JlCisgKiBlbGFib3JhdGUgR1NvdXJjZS4gTm90ZSB0aGF0IHdoZW4gYSB3YXRjaCBpcyBhZGRlZCwgaXQgbWF5CisgKiBub3QgYmUgZW5hYmxlZC4KKyAqCisgKiBUaGUgREJ1c1dhdGNoVG9nZ2xlZEZ1bmN0aW9uIG5vdGlmaWVzIHRoZSBhcHBsaWNhdGlvbiB0aGF0IHRoZQorICogd2F0Y2ggaGFzIGJlZW4gZW5hYmxlZCBvciBkaXNhYmxlZC4gQ2FsbCBkYnVzX3dhdGNoX2dldF9lbmFibGVkKCkKKyAqIHRvIGNoZWNrIHRoaXMuIEEgZGlzYWJsZWQgd2F0Y2ggc2hvdWxkIGhhdmUgbm8gZWZmZWN0LCBhbmQgZW5hYmxlZAorICogd2F0Y2ggc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBtYWluIGxvb3AuIFRoaXMgZmVhdHVyZSBpcyB1c2VkCisgKiBpbnN0ZWFkIG9mIHNpbXBseSBhZGRpbmcvcmVtb3ZpbmcgdGhlIHdhdGNoIGJlY2F1c2UKKyAqIGVuYWJsaW5nL2Rpc2FibGluZyBjYW4gYmUgZG9uZSB3aXRob3V0IG1lbW9yeSBhbGxvY2F0aW9uLiAgVGhlCisgKiB0b2dnbGVkIGZ1bmN0aW9uIG1heSBiZSBOVUxMIGlmIGEgbWFpbiBsb29wIHJlLXF1ZXJpZXMKKyAqIGRidXNfd2F0Y2hfZ2V0X2VuYWJsZWQoKSBldmVyeSB0aW1lIGFueXdheS4KKyAqIAorICogVGhlIERCdXNXYXRjaCBjYW4gYmUgcXVlcmllZCBmb3IgdGhlIGZpbGUgZGVzY3JpcHRvciB0byB3YXRjaCB1c2luZworICogZGJ1c193YXRjaF9nZXRfdW5peF9mZCgpIG9yIGRidXNfd2F0Y2hfZ2V0X3NvY2tldCgpLCBhbmQgZm9yIHRoZQorICogZXZlbnRzIHRvIHdhdGNoIGZvciB1c2luZyBkYnVzX3dhdGNoX2dldF9mbGFncygpLiBUaGUgZmxhZ3MKKyAqIHJldHVybmVkIGJ5IGRidXNfd2F0Y2hfZ2V0X2ZsYWdzKCkgd2lsbCBvbmx5IGNvbnRhaW4KKyAqIERCVVNfV0FUQ0hfUkVBREFCTEUgYW5kIERCVVNfV0FUQ0hfV1JJVEFCTEUsIG5ldmVyCisgKiBEQlVTX1dBVENIX0hBTkdVUCBvciBEQlVTX1dBVENIX0VSUk9SOyBhbGwgd2F0Y2hlcyBpbXBsaWNpdGx5CisgKiBpbmNsdWRlIGEgd2F0Y2ggZm9yIGhhbmd1cHMsIGVycm9ycywgYW5kIG90aGVyIGV4Y2VwdGlvbmFsCisgKiBjb25kaXRpb25zLgorICoKKyAqIE9uY2UgYSBmaWxlIGRlc2NyaXB0b3IgYmVjb21lcyByZWFkYWJsZSBvciB3cml0YWJsZSwgb3IgYW4gZXhjZXB0aW9uCisgKiBvY2N1cnMsIGRidXNfd2F0Y2hfaGFuZGxlKCkgc2hvdWxkIGJlIGNhbGxlZCB0bworICogbm90aWZ5IHRoZSBjb25uZWN0aW9uIG9mIHRoZSBmaWxlIGRlc2NyaXB0b3IncyBjb25kaXRpb24uCisgKgorICogZGJ1c193YXRjaF9oYW5kbGUoKSBjYW5ub3QgYmUgY2FsbGVkIGR1cmluZyB0aGUKKyAqIERCdXNBZGRXYXRjaEZ1bmN0aW9uLCBhcyB0aGUgY29ubmVjdGlvbiB3aWxsIG5vdCBiZSByZWFkeSB0byBoYW5kbGUKKyAqIHRoYXQgd2F0Y2ggeWV0LgorICogCisgKiBJdCBpcyBub3QgYWxsb3dlZCB0byByZWZlcmVuY2UgYSBEQnVzV2F0Y2ggYWZ0ZXIgaXQgaGFzIGJlZW4gcGFzc2VkCisgKiB0byByZW1vdmVfZnVuY3Rpb24uCisgKgorICogSWYgI0ZBTFNFIGlzIHJldHVybmVkIGR1ZSB0byBsYWNrIG9mIG1lbW9yeSwgdGhlIGZhaWx1cmUgbWF5IGJlIGR1ZQorICogdG8gYSAjRkFMU0UgcmV0dXJuIGZyb20gdGhlIG5ldyBhZGRfZnVuY3Rpb24uIElmIHNvLCB0aGUKKyAqIGFkZF9mdW5jdGlvbiBtYXkgaGF2ZSBiZWVuIGNhbGxlZCBzdWNjZXNzZnVsbHkgb25lIG9yIG1vcmUgdGltZXMsCisgKiBidXQgdGhlIHJlbW92ZV9mdW5jdGlvbiB3aWxsIGFsc28gaGF2ZSBiZWVuIGNhbGxlZCB0byByZW1vdmUgYW55CisgKiBzdWNjZXNzZnVsIGFkZHMuIGkuZS4gaWYgI0ZBTFNFIGlzIHJldHVybmVkIHRoZSBuZXQgcmVzdWx0CisgKiBzaG91bGQgYmUgdGhhdCBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dhdGNoX2Z1bmN0aW9ucygpIGhhcyBubyBlZmZlY3QsCisgKiBidXQgdGhlIGFkZF9mdW5jdGlvbiBhbmQgcmVtb3ZlX2Z1bmN0aW9uIG1heSBoYXZlIGJlZW4gY2FsbGVkLgorICoKKyAqIEBub3RlIFRoZSB0aHJlYWQgbG9jayBvbiBEQnVzQ29ubmVjdGlvbiBpcyBoZWxkIHdoaWxlCisgKiB3YXRjaCBmdW5jdGlvbnMgYXJlIGludm9rZWQsIHNvIGluc2lkZSB0aGVzZSBmdW5jdGlvbnMgeW91CisgKiBtYXkgbm90IGludm9rZSBhbnkgbWV0aG9kcyBvbiBEQnVzQ29ubmVjdGlvbiBvciBpdCB3aWxsIGRlYWRsb2NrLgorICogU2VlIHRoZSBjb21tZW50cyBpbiB0aGUgY29kZSBvciBodHRwOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL2FyY2hpdmVzL2RidXMvMjAwNy1KdWx5L3RyZWFkLmh0bWwjODE0NAorICogaWYgeW91IGVuY291bnRlciB0aGlzIGlzc3VlIGFuZCB3YW50IHRvIGF0dGVtcHQgd3JpdGluZyBhIHBhdGNoLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSBhZGRfZnVuY3Rpb24gZnVuY3Rpb24gdG8gYmVnaW4gbW9uaXRvcmluZyBhIG5ldyBkZXNjcmlwdG9yLgorICogQHBhcmFtIHJlbW92ZV9mdW5jdGlvbiBmdW5jdGlvbiB0byBzdG9wIG1vbml0b3JpbmcgYSBkZXNjcmlwdG9yLgorICogQHBhcmFtIHRvZ2dsZWRfZnVuY3Rpb24gZnVuY3Rpb24gdG8gbm90aWZ5IG9mIGVuYWJsZS9kaXNhYmxlCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHBhc3MgdG8gYWRkX2Z1bmN0aW9uIGFuZCByZW1vdmVfZnVuY3Rpb24uCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byBmcmVlIHRoZSBkYXRhLgorICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUgKG5vIG1lbW9yeSkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9zZXRfd2F0Y2hfZnVuY3Rpb25zIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0FkZFdhdGNoRnVuY3Rpb24gICAgICAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1JlbW92ZVdhdGNoRnVuY3Rpb24gICAgICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoVG9nZ2xlZEZ1bmN0aW9uICAgICB0b2dnbGVkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHZhbCA9IF9kYnVzX3dhdGNoX2xpc3Rfc2V0X2Z1bmN0aW9ucyAoY29ubmVjdGlvbi0+d2F0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfZnVuY3Rpb24sIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIGZyZWVfZGF0YV9mdW5jdGlvbik7CisKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogU2V0cyB0aGUgdGltZW91dCBmdW5jdGlvbnMgZm9yIHRoZSBjb25uZWN0aW9uLiBUaGVzZSBmdW5jdGlvbnMgYXJlCisgKiByZXNwb25zaWJsZSBmb3IgbWFraW5nIHRoZSBhcHBsaWNhdGlvbidzIG1haW4gbG9vcCBhd2FyZSBvZiB0aW1lb3V0cy4KKyAqIFdoZW4gdXNpbmcgUXQsIHR5cGljYWxseSB0aGUgREJ1c0FkZFRpbWVvdXRGdW5jdGlvbiB3b3VsZCBjcmVhdGUgYQorICogUVRpbWVyLiBXaGVuIHVzaW5nIEdMaWIsIHRoZSBEQnVzQWRkVGltZW91dEZ1bmN0aW9uIHdvdWxkIGNhbGwKKyAqIGdfdGltZW91dF9hZGQuCisgKiAKKyAqIFRoZSBEQnVzVGltZW91dFRvZ2dsZWRGdW5jdGlvbiBub3RpZmllcyB0aGUgYXBwbGljYXRpb24gdGhhdCB0aGUKKyAqIHRpbWVvdXQgaGFzIGJlZW4gZW5hYmxlZCBvciBkaXNhYmxlZC4gQ2FsbAorICogZGJ1c190aW1lb3V0X2dldF9lbmFibGVkKCkgdG8gY2hlY2sgdGhpcy4gQSBkaXNhYmxlZCB0aW1lb3V0IHNob3VsZAorICogaGF2ZSBubyBlZmZlY3QsIGFuZCBlbmFibGVkIHRpbWVvdXQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBtYWluCisgKiBsb29wLiBUaGlzIGZlYXR1cmUgaXMgdXNlZCBpbnN0ZWFkIG9mIHNpbXBseSBhZGRpbmcvcmVtb3ZpbmcgdGhlCisgKiB0aW1lb3V0IGJlY2F1c2UgZW5hYmxpbmcvZGlzYWJsaW5nIGNhbiBiZSBkb25lIHdpdGhvdXQgbWVtb3J5CisgKiBhbGxvY2F0aW9uLiBXaXRoIFF0LCBRVGltZXI6OnN0YXJ0KCkgYW5kIFFUaW1lcjo6c3RvcCgpIGNhbiBiZSB1c2VkCisgKiB0byBlbmFibGUgYW5kIGRpc2FibGUuIFRoZSB0b2dnbGVkIGZ1bmN0aW9uIG1heSBiZSBOVUxMIGlmIGEgbWFpbgorICogbG9vcCByZS1xdWVyaWVzIGRidXNfdGltZW91dF9nZXRfZW5hYmxlZCgpIGV2ZXJ5IHRpbWUgYW55d2F5LgorICogV2hlbmV2ZXIgYSB0aW1lb3V0IGlzIHRvZ2dsZWQsIGl0cyBpbnRlcnZhbCBtYXkgY2hhbmdlLgorICoKKyAqIFRoZSBEQnVzVGltZW91dCBjYW4gYmUgcXVlcmllZCBmb3IgdGhlIHRpbWVyIGludGVydmFsIHVzaW5nCisgKiBkYnVzX3RpbWVvdXRfZ2V0X2ludGVydmFsKCkuIGRidXNfdGltZW91dF9oYW5kbGUoKSBzaG91bGQgYmUgY2FsbGVkCisgKiByZXBlYXRlZGx5LCBlYWNoIHRpbWUgdGhlIGludGVydmFsIGVsYXBzZXMsIHN0YXJ0aW5nIGFmdGVyIGl0IGhhcworICogZWxhcHNlZCBvbmNlLiBUaGUgdGltZW91dCBzdG9wcyBmaXJpbmcgd2hlbiBpdCBpcyByZW1vdmVkIHdpdGggdGhlCisgKiBnaXZlbiByZW1vdmVfZnVuY3Rpb24uICBUaGUgdGltZXIgaW50ZXJ2YWwgbWF5IGNoYW5nZSB3aGVuZXZlciB0aGUKKyAqIHRpbWVvdXQgaXMgYWRkZWQsIHJlbW92ZWQsIG9yIHRvZ2dsZWQuCisgKgorICogQG5vdGUgVGhlIHRocmVhZCBsb2NrIG9uIERCdXNDb25uZWN0aW9uIGlzIGhlbGQgd2hpbGUKKyAqIHRpbWVvdXQgZnVuY3Rpb25zIGFyZSBpbnZva2VkLCBzbyBpbnNpZGUgdGhlc2UgZnVuY3Rpb25zIHlvdQorICogbWF5IG5vdCBpbnZva2UgYW55IG1ldGhvZHMgb24gREJ1c0Nvbm5lY3Rpb24gb3IgaXQgd2lsbCBkZWFkbG9jay4KKyAqIFNlZSB0aGUgY29tbWVudHMgaW4gdGhlIGNvZGUgb3IgaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9hcmNoaXZlcy9kYnVzLzIwMDctSnVseS90aHJlYWQuaHRtbCM4MTQ0CisgKiBpZiB5b3UgZW5jb3VudGVyIHRoaXMgaXNzdWUgYW5kIHdhbnQgdG8gYXR0ZW1wdCB3cml0aW5nIGEgcGF0Y2guCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcGFyYW0gYWRkX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGFkZCBhIHRpbWVvdXQuCisgKiBAcGFyYW0gcmVtb3ZlX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIHJlbW92ZSBhIHRpbWVvdXQuCisgKiBAcGFyYW0gdG9nZ2xlZF9mdW5jdGlvbiBmdW5jdGlvbiB0byBub3RpZnkgb2YgZW5hYmxlL2Rpc2FibGUKKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gcGFzcyB0byBhZGRfZnVuY3Rpb24gYW5kIHJlbW92ZV9mdW5jdGlvbi4KKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuY3Rpb24gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHRvIGZyZWUgdGhlIGRhdGEuCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZSAobm8gbWVtb3J5KQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX3NldF90aW1lb3V0X2Z1bmN0aW9ucyAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICpjb25uZWN0aW9uLAorCQkJCQkgREJ1c0FkZFRpbWVvdXRGdW5jdGlvbiAgICAgYWRkX2Z1bmN0aW9uLAorCQkJCQkgREJ1c1JlbW92ZVRpbWVvdXRGdW5jdGlvbiAgcmVtb3ZlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dFRvZ2dsZWRGdW5jdGlvbiB0b2dnbGVkX2Z1bmN0aW9uLAorCQkJCQkgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKwkJCQkJIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHZhbCA9IF9kYnVzX3RpbWVvdXRfbGlzdF9zZXRfZnVuY3Rpb25zIChjb25uZWN0aW9uLT50aW1lb3V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9mdW5jdGlvbiwgcmVtb3ZlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIGZyZWVfZGF0YV9mdW5jdGlvbik7CisKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogU2V0cyB0aGUgbWFpbmxvb3Agd2FrZXVwIGZ1bmN0aW9uIGZvciB0aGUgY29ubmVjdGlvbi4gVGhpcyBmdW5jdGlvbgorICogaXMgcmVzcG9uc2libGUgZm9yIHdha2luZyB1cCB0aGUgbWFpbiBsb29wIChpZiBpdHMgc2xlZXBpbmcgaW4KKyAqIGFub3RoZXIgdGhyZWFkKSB3aGVuIHNvbWUgc29tZSBjaGFuZ2UgaGFzIGhhcHBlbmVkIHRvIHRoZQorICogY29ubmVjdGlvbiB0aGF0IHRoZSBtYWlubG9vcCBuZWVkcyB0byByZWNvbnNpZGVyIChlLmcuIGEgbWVzc2FnZQorICogaGFzIGJlZW4gcXVldWVkIGZvciB3cml0aW5nKS4gIFdoZW4gdXNpbmcgUXQsIHRoaXMgdHlwaWNhbGx5CisgKiByZXN1bHRzIGluIGEgY2FsbCB0byBRRXZlbnRMb29wOjp3YWtlVXAoKS4gIFdoZW4gdXNpbmcgR0xpYiwgaXQKKyAqIHdvdWxkIGNhbGwgZ19tYWluX2NvbnRleHRfd2FrZXVwKCkuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcGFyYW0gd2FrZXVwX21haW5fZnVuY3Rpb24gZnVuY3Rpb24gdG8gd2FrZSB1cCB0aGUgbWFpbmxvb3AKKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gcGFzcyB3YWtldXBfbWFpbl9mdW5jdGlvbgorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jdGlvbiBmdW5jdGlvbiB0byBiZSBjYWxsZWQgdG8gZnJlZSB0aGUgZGF0YS4KKyAqLwordm9pZAorZGJ1c19jb25uZWN0aW9uX3NldF93YWtldXBfbWFpbl9mdW5jdGlvbiAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAqY29ubmVjdGlvbiwKKwkJCQkJICBEQnVzV2FrZXVwTWFpbkZ1bmN0aW9uICAgICB3YWtldXBfbWFpbl9mdW5jdGlvbiwKKwkJCQkJICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorCQkJCQkgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgdm9pZCAqb2xkX2RhdGE7CisgIERCdXNGcmVlRnVuY3Rpb24gb2xkX2ZyZWVfZGF0YTsKKworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIG9sZF9kYXRhID0gY29ubmVjdGlvbi0+d2FrZXVwX21haW5fZGF0YTsKKyAgb2xkX2ZyZWVfZGF0YSA9IGNvbm5lY3Rpb24tPmZyZWVfd2FrZXVwX21haW5fZGF0YTsKKworICBjb25uZWN0aW9uLT53YWtldXBfbWFpbl9mdW5jdGlvbiA9IHdha2V1cF9tYWluX2Z1bmN0aW9uOworICBjb25uZWN0aW9uLT53YWtldXBfbWFpbl9kYXRhID0gZGF0YTsKKyAgY29ubmVjdGlvbi0+ZnJlZV93YWtldXBfbWFpbl9kYXRhID0gZnJlZV9kYXRhX2Z1bmN0aW9uOworICAKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIC8qIENhbGxiYWNrIG91dHNpZGUgdGhlIGxvY2sgKi8KKyAgaWYgKG9sZF9mcmVlX2RhdGEpCisgICAgKCpvbGRfZnJlZV9kYXRhKSAob2xkX2RhdGEpOworfQorCisvKioKKyAqIFNldCBhIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgZGlzcGF0Y2ggc3RhdHVzIGNoYW5nZXMuCisgKiBJZiB0aGUgZGlzcGF0Y2ggc3RhdHVzIGlzICNEQlVTX0RJU1BBVENIX0RBVEFfUkVNQUlOUywgdGhlbgorICogZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkgbmVlZHMgdG8gYmUgY2FsbGVkIHRvIHByb2Nlc3MgaW5jb21pbmcKKyAqIG1lc3NhZ2VzLiBIb3dldmVyLCBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2goKSBNVVNUIE5PVCBCRSBDQUxMRUQKKyAqIGZyb20gaW5zaWRlIHRoZSBEQnVzRGlzcGF0Y2hTdGF0dXNGdW5jdGlvbi4gSW5kZWVkLCBhbG1vc3QKKyAqIGFueSByZWVudHJhbmN5IGluIHRoaXMgZnVuY3Rpb24gaXMgYSBiYWQgaWRlYS4gSW5zdGVhZCwKKyAqIHRoZSBEQnVzRGlzcGF0Y2hTdGF0dXNGdW5jdGlvbiBzaG91bGQgc2ltcGx5IHNhdmUgYW4gaW5kaWNhdGlvbgorICogdGhhdCBtZXNzYWdlcyBzaG91bGQgYmUgZGlzcGF0Y2hlZCBsYXRlciwgd2hlbiB0aGUgbWFpbiBsb29wCisgKiBpcyByZS1lbnRlcmVkLgorICoKKyAqIElmIHlvdSBkb24ndCBzZXQgYSBkaXNwYXRjaCBzdGF0dXMgZnVuY3Rpb24sIHlvdSBoYXZlIHRvIGJlIHN1cmUgdG8KKyAqIGRpc3BhdGNoIG9uIGV2ZXJ5IGl0ZXJhdGlvbiBvZiB5b3VyIG1haW4gbG9vcCwgZXNwZWNpYWxseSBpZgorICogZGJ1c193YXRjaF9oYW5kbGUoKSBvciBkYnVzX3RpbWVvdXRfaGFuZGxlKCkgd2VyZSBjYWxsZWQuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBmdW5jdGlvbiBmdW5jdGlvbiB0byBjYWxsIG9uIGRpc3BhdGNoIHN0YXR1cyBjaGFuZ2VzCisgKiBAcGFyYW0gZGF0YSBkYXRhIGZvciBmdW5jdGlvbgorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jdGlvbiBmcmVlIHRoZSBmdW5jdGlvbiBkYXRhCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9zZXRfZGlzcGF0Y2hfc3RhdHVzX2Z1bmN0aW9uIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRGlzcGF0Y2hTdGF0dXNGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgdm9pZCAqb2xkX2RhdGE7CisgIERCdXNGcmVlRnVuY3Rpb24gb2xkX2ZyZWVfZGF0YTsKKworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIG9sZF9kYXRhID0gY29ubmVjdGlvbi0+ZGlzcGF0Y2hfc3RhdHVzX2RhdGE7CisgIG9sZF9mcmVlX2RhdGEgPSBjb25uZWN0aW9uLT5mcmVlX2Rpc3BhdGNoX3N0YXR1c19kYXRhOworCisgIGNvbm5lY3Rpb24tPmRpc3BhdGNoX3N0YXR1c19mdW5jdGlvbiA9IGZ1bmN0aW9uOworICBjb25uZWN0aW9uLT5kaXNwYXRjaF9zdGF0dXNfZGF0YSA9IGRhdGE7CisgIGNvbm5lY3Rpb24tPmZyZWVfZGlzcGF0Y2hfc3RhdHVzX2RhdGEgPSBmcmVlX2RhdGFfZnVuY3Rpb247CisgIAorICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgLyogQ2FsbGJhY2sgb3V0c2lkZSB0aGUgbG9jayAqLworICBpZiAob2xkX2ZyZWVfZGF0YSkKKyAgICAoKm9sZF9mcmVlX2RhdGEpIChvbGRfZGF0YSk7Cit9CisKKy8qKgorICogR2V0IHRoZSBVTklYIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgY29ubmVjdGlvbiwgaWYgYW55LiAgVGhpcyBjYW4KKyAqIGJlIHVzZWQgZm9yIFNFTGludXggYWNjZXNzIGNvbnRyb2wgY2hlY2tzIHdpdGggZ2V0cGVlcmNvbigpIGZvcgorICogZXhhbXBsZS4gRE8gTk9UIHJlYWQgb3Igd3JpdGUgdG8gdGhlIGZpbGUgZGVzY3JpcHRvciwgb3IgdHJ5IHRvCisgKiBzZWxlY3QoKSBvbiBpdDsgdXNlIERCdXNXYXRjaCBmb3IgbWFpbiBsb29wIGludGVncmF0aW9uLiBOb3QgYWxsCisgKiBjb25uZWN0aW9ucyB3aWxsIGhhdmUgYSBmaWxlIGRlc2NyaXB0b3IuIFNvIGZvciBhZGRpbmcgZGVzY3JpcHRvcnMKKyAqIHRvIHRoZSBtYWluIGxvb3AsIHVzZSBkYnVzX3dhdGNoX2dldF91bml4X2ZkKCkgYW5kIHNvIGZvcnRoLgorICoKKyAqIElmIHRoZSBjb25uZWN0aW9uIGlzIHNvY2tldC1iYXNlZCwgeW91IGNhbiBhbHNvIHVzZQorICogZGJ1c19jb25uZWN0aW9uX2dldF9zb2NrZXQoKSwgd2hpY2ggd2lsbCB3b3JrIG9uIFdpbmRvd3MgdG9vLgorICogVGhpcyBmdW5jdGlvbiBhbHdheXMgZmFpbHMgb24gV2luZG93cy4KKyAqCisgKiBSaWdodCBub3cgdGhlIHJldHVybmVkIGRlc2NyaXB0b3IgaXMgYWx3YXlzIGEgc29ja2V0LCBidXQKKyAqIHRoYXQgaXMgbm90IGd1YXJhbnRlZWQuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gZmQgcmV0dXJuIGxvY2F0aW9uIGZvciB0aGUgZmlsZSBkZXNjcmlwdG9yLgorICogQHJldHVybnMgI1RSVUUgaWYgZmQgaXMgc3VjY2Vzc2Z1bGx5IG9idGFpbmVkLgorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX2dldF91bml4X2ZkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgKmZkKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCAhPSBOVUxMLCBGQUxTRSk7CisKKyNpZmRlZiBEQlVTX1dJTgorICAvKiBGSVhNRSBkbyB0aGlzIG9uIGEgbG93ZXIgbGV2ZWwgKi8KKyAgcmV0dXJuIEZBTFNFOworI2VuZGlmCisgIAorICByZXR1cm4gZGJ1c19jb25uZWN0aW9uX2dldF9zb2NrZXQoY29ubmVjdGlvbiwgZmQpOworfQorCisvKioKKyAqIEdldHMgdGhlIHVuZGVybHlpbmcgV2luZG93cyBvciBVTklYIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IKKyAqIG9mIHRoZSBjb25uZWN0aW9uLCBpZiBhbnkuIERPIE5PVCByZWFkIG9yIHdyaXRlIHRvIHRoZSBmaWxlIGRlc2NyaXB0b3IsIG9yIHRyeSB0bworICogc2VsZWN0KCkgb24gaXQ7IHVzZSBEQnVzV2F0Y2ggZm9yIG1haW4gbG9vcCBpbnRlZ3JhdGlvbi4gTm90IGFsbAorICogY29ubmVjdGlvbnMgd2lsbCBoYXZlIGEgc29ja2V0LiBTbyBmb3IgYWRkaW5nIGRlc2NyaXB0b3JzCisgKiB0byB0aGUgbWFpbiBsb29wLCB1c2UgZGJ1c193YXRjaF9nZXRfc29ja2V0KCkgYW5kIHNvIGZvcnRoLgorICoKKyAqIElmIHRoZSBjb25uZWN0aW9uIGlzIG5vdCBzb2NrZXQtYmFzZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gRkFMU0UsCisgKiBldmVuIGlmIHRoZSBjb25uZWN0aW9uIGRvZXMgaGF2ZSBhIGZpbGUgZGVzY3JpcHRvciBvZiBzb21lIGtpbmQuCisgKiBpLmUuIHRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgc3BlY2lmaWNhbGx5IGEgc29ja2V0IGZpbGUgZGVzY3JpcHRvci4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBmZCByZXR1cm4gbG9jYXRpb24gZm9yIHRoZSBmaWxlIGRlc2NyaXB0b3IuCisgKiBAcmV0dXJucyAjVFJVRSBpZiBmZCBpcyBzdWNjZXNzZnVsbHkgb2J0YWluZWQuCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fZ2V0X3NvY2tldChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgKmZkKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uLT50cmFuc3BvcnQgIT0gTlVMTCwgRkFMU0UpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgCisgIHJldHZhbCA9IF9kYnVzX3RyYW5zcG9ydF9nZXRfc29ja2V0X2ZkIChjb25uZWN0aW9uLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZCk7CisKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKworLyoqCisgKiBHZXRzIHRoZSBVTklYIHVzZXIgSUQgb2YgdGhlIGNvbm5lY3Rpb24gaWYga25vd24uICBSZXR1cm5zICNUUlVFIGlmCisgKiB0aGUgdWlkIGlzIGZpbGxlZCBpbi4gIEFsd2F5cyByZXR1cm5zICNGQUxTRSBvbiBub24tVU5JWCBwbGF0Zm9ybXMKKyAqIGZvciBub3csIHRob3VnaCBpbiB0aGVvcnkgc29tZW9uZSBjb3VsZCBob29rIFdpbmRvd3MgdG8gTklTIG9yCisgKiBzb21ldGhpbmcuICBBbHdheXMgcmV0dXJucyAjRkFMU0UgcHJpb3IgdG8gYXV0aGVudGljYXRpbmcgdGhlCisgKiBjb25uZWN0aW9uLgorICoKKyAqIFRoZSBVSUQgaXMgb25seSByZWFkIGJ5IHNlcnZlcnMgZnJvbSBjbGllbnRzOyBjbGllbnRzIGNhbid0IHVzdWFsbHkKKyAqIGdldCB0aGUgVUlEIG9mIHNlcnZlcnMsIGJlY2F1c2Ugc2VydmVycyBkbyBub3QgYXV0aGVudGljYXRlIHRvCisgKiBjbGllbnRzLiAgVGhlIHJldHVybmVkIFVJRCBpcyB0aGUgVUlEIHRoZSBjb25uZWN0aW9uIGF1dGhlbnRpY2F0ZWQKKyAqIGFzLgorICoKKyAqIFRoZSBtZXNzYWdlIGJ1cyBpcyBhIHNlcnZlciBhbmQgdGhlIGFwcHMgY29ubmVjdGluZyB0byB0aGUgYnVzCisgKiBhcmUgY2xpZW50cy4KKyAqCisgKiBZb3UgY2FuIGFzayB0aGUgYnVzIHRvIHRlbGwgeW91IHRoZSBVSUQgb2YgYW5vdGhlciBjb25uZWN0aW9uIHRob3VnaAorICogaWYgeW91IGxpa2U7IHRoaXMgaXMgZG9uZSB3aXRoIGRidXNfYnVzX2dldF91bml4X3VzZXIoKS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHVpZCByZXR1cm4gbG9jYXRpb24gZm9yIHRoZSB1c2VyIElECisgKiBAcmV0dXJucyAjVFJVRSBpZiB1aWQgaXMgZmlsbGVkIGluIHdpdGggYSB2YWxpZCB1c2VyIElECisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfdXNlciAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgKnVpZCkKK3sKKyAgZGJ1c19ib29sX3QgcmVzdWx0OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAodWlkICE9IE5VTEwsIEZBTFNFKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyAgaWYgKCFfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2F1dGhlbnRpY2F0ZWQgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCkpCisgICAgcmVzdWx0ID0gRkFMU0U7CisgIGVsc2UKKyAgICByZXN1bHQgPSBfZGJ1c190cmFuc3BvcnRfZ2V0X3VuaXhfdXNlciAoY29ubmVjdGlvbi0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQpOworCisjaWZkZWYgREJVU19XSU4KKyAgX2RidXNfYXNzZXJ0ICghcmVzdWx0KTsKKyNlbmRpZgorICAKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogR2V0cyB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgY29ubmVjdGlvbiBpZiBhbnkuCisgKiBSZXR1cm5zICNUUlVFIGlmIHRoZSBwaWQgaXMgZmlsbGVkIGluLgorICogQWx3YXlzIHJldHVybnMgI0ZBTFNFIHByaW9yIHRvIGF1dGhlbnRpY2F0aW5nIHRoZQorICogY29ubmVjdGlvbi4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHBpZCByZXR1cm4gbG9jYXRpb24gZm9yIHRoZSBwcm9jZXNzIElECisgKiBAcmV0dXJucyAjVFJVRSBpZiB1aWQgaXMgZmlsbGVkIGluIHdpdGggYSB2YWxpZCBwcm9jZXNzIElECisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfcHJvY2Vzc19pZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICAgICB1bnNpZ25lZCBsb25nICAqcGlkKQoreworICBkYnVzX2Jvb2xfdCByZXN1bHQ7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwaWQgIT0gTlVMTCwgRkFMU0UpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICBpZiAoIV9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfYXV0aGVudGljYXRlZCAoY29ubmVjdGlvbi0+dHJhbnNwb3J0KSkKKyAgICByZXN1bHQgPSBGQUxTRTsKKyAgZWxzZQorICAgIHJlc3VsdCA9IF9kYnVzX3RyYW5zcG9ydF9nZXRfdW5peF9wcm9jZXNzX2lkIChjb25uZWN0aW9uLT50cmFuc3BvcnQsCisJCQkJCQkgIHBpZCk7CisKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogR2V0cyB0aGUgQURUIGF1ZGl0IGRhdGEgb2YgdGhlIGNvbm5lY3Rpb24gaWYgYW55LgorICogUmV0dXJucyAjVFJVRSBpZiB0aGUgc3RydWN0dXJlIHBvaW50ZXIgaXMgcmV0dXJuZWQuCisgKiBBbHdheXMgcmV0dXJucyAjRkFMU0UgcHJpb3IgdG8gYXV0aGVudGljYXRpbmcgdGhlCisgKiBjb25uZWN0aW9uLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gZGF0YSByZXR1cm4gbG9jYXRpb24gZm9yIGF1ZGl0IGRhdGEgCisgKiBAcmV0dXJucyAjVFJVRSBpZiBhdWRpdCBkYXRhIGlzIGZpbGxlZCBpbiB3aXRoIGEgdmFsaWQgdWNyZWQgcG9pbnRlcgorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX2dldF9hZHRfYXVkaXRfc2Vzc2lvbl9kYXRhIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJICAgIHZvaWQgICAgICAgICAgKipkYXRhLAorCQkJCQkgICAgZGJ1c19pbnQzMl90ICAgKmRhdGFfc2l6ZSkKK3sKKyAgZGJ1c19ib29sX3QgcmVzdWx0OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoZGF0YSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoZGF0YV9zaXplICE9IE5VTEwsIEZBTFNFKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyAgaWYgKCFfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2F1dGhlbnRpY2F0ZWQgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCkpCisgICAgcmVzdWx0ID0gRkFMU0U7CisgIGVsc2UKKyAgICByZXN1bHQgPSBfZGJ1c190cmFuc3BvcnRfZ2V0X2FkdF9hdWRpdF9zZXNzaW9uX2RhdGEgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCwKKwkJCQkJICAgIAkgICAgICAgICBkYXRhLAorCQkJICAJCQkgICAgICAgICBkYXRhX3NpemUpOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBTZXRzIGEgcHJlZGljYXRlIGZ1bmN0aW9uIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBnaXZlbiB1c2VyIElECisgKiBpcyBhbGxvd2VkIHRvIGNvbm5lY3QuIFdoZW4gYW4gaW5jb21pbmcgY29ubmVjdGlvbiBoYXMKKyAqIGF1dGhlbnRpY2F0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgdXNlciBJRCwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQ7CisgKiBpZiBpdCByZXR1cm5zICNUUlVFLCB0aGUgY29ubmVjdGlvbiBpcyBhbGxvd2VkIHRvIHByb2NlZWQsCisgKiBvdGhlcndpc2UgdGhlIGNvbm5lY3Rpb24gaXMgZGlzY29ubmVjdGVkLgorICoKKyAqIElmIHRoZSBmdW5jdGlvbiBpcyBzZXQgdG8gI05VTEwgKGFzIGl0IGlzIGJ5IGRlZmF1bHQpLCB0aGVuCisgKiBvbmx5IHRoZSBzYW1lIFVJRCBhcyB0aGUgc2VydmVyIHByb2Nlc3Mgd2lsbCBiZSBhbGxvd2VkIHRvCisgKiBjb25uZWN0LiBBbHNvLCByb290IGlzIGFsd2F5cyBhbGxvd2VkIHRvIGNvbm5lY3QuCisgKgorICogT24gV2luZG93cywgdGhlIGZ1bmN0aW9uIHdpbGwgYmUgc2V0IGFuZCBpdHMgZnJlZV9kYXRhX2Z1bmN0aW9uIHdpbGwKKyAqIGJlIGludm9rZWQgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBmcmVlZCBvciBhIG5ldyBmdW5jdGlvbiBpcyBzZXQuCisgKiBIb3dldmVyLCB0aGUgZnVuY3Rpb24gd2lsbCBuZXZlciBiZSBjYWxsZWQsIGJlY2F1c2UgdGhlcmUgYXJlCisgKiBubyBVTklYIHVzZXIgaWRzIHRvIHBhc3MgdG8gaXQsIG9yIGF0IGxlYXN0IG5vbmUgb2YgdGhlIGV4aXN0aW5nCisgKiBhdXRoIHByb3RvY29scyB3b3VsZCBhbGxvdyBhdXRoZW50aWNhdGluZyBhcyBhIFVOSVggdXNlciBvbiBXaW5kb3dzLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIGZ1bmN0aW9uIHRoZSBwcmVkaWNhdGUKKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gcGFzcyB0byB0aGUgcHJlZGljYXRlCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGZyZWUgdGhlIGRhdGEKKyAqLwordm9pZAorZGJ1c19jb25uZWN0aW9uX3NldF91bml4X3VzZXJfZnVuY3Rpb24gKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBbGxvd1VuaXhVc2VyRnVuY3Rpb24gICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKQoreworICB2b2lkICpvbGRfZGF0YSA9IE5VTEw7CisgIERCdXNGcmVlRnVuY3Rpb24gb2xkX2ZyZWVfZnVuY3Rpb24gPSBOVUxMOworCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgX2RidXNfdHJhbnNwb3J0X3NldF91bml4X3VzZXJfZnVuY3Rpb24gKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLCBkYXRhLCBmcmVlX2RhdGFfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2xkX2RhdGEsICZvbGRfZnJlZV9mdW5jdGlvbik7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworICBpZiAob2xkX2ZyZWVfZnVuY3Rpb24gIT0gTlVMTCkKKyAgICAoKiBvbGRfZnJlZV9mdW5jdGlvbikgKG9sZF9kYXRhKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBXaW5kb3dzIHVzZXIgU0lEIG9mIHRoZSBjb25uZWN0aW9uIGlmIGtub3duLiAgUmV0dXJucworICogI1RSVUUgaWYgdGhlIElEIGlzIGZpbGxlZCBpbi4gIEFsd2F5cyByZXR1cm5zICNGQUxTRSBvbiBub24tV2luZG93cworICogcGxhdGZvcm1zIGZvciBub3csIHRob3VnaCBpbiB0aGVvcnkgc29tZW9uZSBjb3VsZCBob29rIFVOSVggdG8KKyAqIEFjdGl2ZSBEaXJlY3Rvcnkgb3Igc29tZXRoaW5nLiAgQWx3YXlzIHJldHVybnMgI0ZBTFNFIHByaW9yIHRvCisgKiBhdXRoZW50aWNhdGluZyB0aGUgY29ubmVjdGlvbi4KKyAqCisgKiBUaGUgdXNlciBpcyBvbmx5IHJlYWQgYnkgc2VydmVycyBmcm9tIGNsaWVudHM7IGNsaWVudHMgY2FuJ3QgdXN1YWxseQorICogZ2V0IHRoZSB1c2VyIG9mIHNlcnZlcnMsIGJlY2F1c2Ugc2VydmVycyBkbyBub3QgYXV0aGVudGljYXRlIHRvCisgKiBjbGllbnRzLiBUaGUgcmV0dXJuZWQgdXNlciBpcyB0aGUgdXNlciB0aGUgY29ubmVjdGlvbiBhdXRoZW50aWNhdGVkCisgKiBhcy4KKyAqCisgKiBUaGUgbWVzc2FnZSBidXMgaXMgYSBzZXJ2ZXIgYW5kIHRoZSBhcHBzIGNvbm5lY3RpbmcgdG8gdGhlIGJ1cworICogYXJlIGNsaWVudHMuCisgKgorICogVGhlIHJldHVybmVkIHVzZXIgc3RyaW5nIGhhcyB0byBiZSBmcmVlZCB3aXRoIGRidXNfZnJlZSgpLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHVzZXIgU0lEIGlzIGF2YWlsYWJsZTsKKyAqIGlmIGl0J3MgYXZhaWxhYmxlIGJ1dCB3ZSBkb24ndCBoYXZlIHRoZSBtZW1vcnkgdG8gY29weSBpdCwKKyAqIHRoZW4gdGhlIHJldHVybiB2YWx1ZSBpcyAjVFJVRSBhbmQgI05VTEwgaXMgZ2l2ZW4gYXMgdGhlIFNJRC4KKyAqIAorICogQHRvZG8gV2Ugd291bGQgbGlrZSB0byBiZSBhYmxlIHRvIHNheSAiWW91IGNhbiBhc2sgdGhlIGJ1cyB0byB0ZWxsCisgKiB5b3UgdGhlIHVzZXIgb2YgYW5vdGhlciBjb25uZWN0aW9uIHRob3VnaCBpZiB5b3UgbGlrZTsgdGhpcyBpcyBkb25lCisgKiB3aXRoIGRidXNfYnVzX2dldF93aW5kb3dzX3VzZXIoKS4iIEJ1dCB0aGlzIGhhcyB0byBiZSBpbXBsZW1lbnRlZAorICogaW4gYnVzL2RyaXZlci5jIGFuZCBkYnVzL2RidXMtYnVzLmMsIGFuZCBpcyBwb2ludGxlc3MgYW55d2F5CisgKiBzaW5jZSBvbiBXaW5kb3dzIHdlIG9ubHkgdXNlIHRoZSBzZXNzaW9uIGJ1cyBmb3Igbm93LgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gd2luZG93c19zaWRfcCByZXR1cm4gbG9jYXRpb24gZm9yIGFuIGFsbG9jYXRlZCBjb3B5IG9mIHRoZSB1c2VyIElELCBvciAjTlVMTCBpZiBubyBtZW1vcnkKKyAqIEByZXR1cm5zICNUUlVFIGlmIHVzZXIgaXMgYXZhaWxhYmxlIChyZXR1cm5lZCB2YWx1ZSBtYXkgYmUgI05VTEwgYW55d2F5IGlmIG5vIG1lbW9yeSkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9nZXRfd2luZG93c191c2VyIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICoqd2luZG93c19zaWRfcCkKK3sKKyAgZGJ1c19ib29sX3QgcmVzdWx0OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAod2luZG93c19zaWRfcCAhPSBOVUxMLCBGQUxTRSk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgIGlmICghX2RidXNfdHJhbnNwb3J0X2dldF9pc19hdXRoZW50aWNhdGVkIChjb25uZWN0aW9uLT50cmFuc3BvcnQpKQorICAgIHJlc3VsdCA9IEZBTFNFOworICBlbHNlCisgICAgcmVzdWx0ID0gX2RidXNfdHJhbnNwb3J0X2dldF93aW5kb3dzX3VzZXIgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93c19zaWRfcCk7CisKKyNpZmRlZiBEQlVTX1VOSVgKKyAgX2RidXNfYXNzZXJ0ICghcmVzdWx0KTsKKyNlbmRpZgorICAKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogU2V0cyBhIHByZWRpY2F0ZSBmdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGEgZ2l2ZW4gdXNlciBJRAorICogaXMgYWxsb3dlZCB0byBjb25uZWN0LiBXaGVuIGFuIGluY29taW5nIGNvbm5lY3Rpb24gaGFzCisgKiBhdXRoZW50aWNhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIHVzZXIgSUQsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkOworICogaWYgaXQgcmV0dXJucyAjVFJVRSwgdGhlIGNvbm5lY3Rpb24gaXMgYWxsb3dlZCB0byBwcm9jZWVkLAorICogb3RoZXJ3aXNlIHRoZSBjb25uZWN0aW9uIGlzIGRpc2Nvbm5lY3RlZC4KKyAqCisgKiBJZiB0aGUgZnVuY3Rpb24gaXMgc2V0IHRvICNOVUxMIChhcyBpdCBpcyBieSBkZWZhdWx0KSwgdGhlbgorICogb25seSB0aGUgc2FtZSB1c2VyIG93bmluZyB0aGUgc2VydmVyIHByb2Nlc3Mgd2lsbCBiZSBhbGxvd2VkIHRvCisgKiBjb25uZWN0LgorICoKKyAqIE9uIFVOSVgsIHRoZSBmdW5jdGlvbiB3aWxsIGJlIHNldCBhbmQgaXRzIGZyZWVfZGF0YV9mdW5jdGlvbiB3aWxsCisgKiBiZSBpbnZva2VkIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgZnJlZWQgb3IgYSBuZXcgZnVuY3Rpb24gaXMgc2V0LgorICogSG93ZXZlciwgdGhlIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgYmUgY2FsbGVkLCBiZWNhdXNlIHRoZXJlIGlzIG5vCisgKiB3YXkgcmlnaHQgbm93IHRvIGF1dGhlbnRpY2F0ZSBhcyBhIFdpbmRvd3MgdXNlciBvbiBVTklYLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIGZ1bmN0aW9uIHRoZSBwcmVkaWNhdGUKKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gcGFzcyB0byB0aGUgcHJlZGljYXRlCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGZyZWUgdGhlIGRhdGEKKyAqLwordm9pZAorZGJ1c19jb25uZWN0aW9uX3NldF93aW5kb3dzX3VzZXJfZnVuY3Rpb24gKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQWxsb3dXaW5kb3dzVXNlckZ1bmN0aW9uIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgdm9pZCAqb2xkX2RhdGEgPSBOVUxMOworICBEQnVzRnJlZUZ1bmN0aW9uIG9sZF9mcmVlX2Z1bmN0aW9uID0gTlVMTDsKKworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIF9kYnVzX3RyYW5zcG9ydF9zZXRfd2luZG93c191c2VyX2Z1bmN0aW9uIChjb25uZWN0aW9uLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwgZGF0YSwgZnJlZV9kYXRhX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9sZF9kYXRhLCAmb2xkX2ZyZWVfZnVuY3Rpb24pOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgaWYgKG9sZF9mcmVlX2Z1bmN0aW9uICE9IE5VTEwpCisgICAgKCogb2xkX2ZyZWVfZnVuY3Rpb24pIChvbGRfZGF0YSk7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbiB0aGUgc2VydmVyIHNpZGUgb2YgYSBjb25uZWN0aW9uIHdoZW4gdGhlCisgKiBjb25uZWN0aW9uIGlzIGZpcnN0IHNlZW4gaW4gdGhlICNEQnVzTmV3Q29ubmVjdGlvbkZ1bmN0aW9uLiBJZiBzZXQgdG8KKyAqICNUUlVFICh0aGUgZGVmYXVsdCBpcyAjRkFMU0UpLCB0aGVuIHRoZSBjb25uZWN0aW9uIGNhbiBwcm9jZWVkIGV2ZW4gaWYKKyAqIHRoZSBjbGllbnQgZG9lcyBub3QgYXV0aGVudGljYXRlIGFzIHNvbWUgdXNlciBpZGVudGl0eSwgaS5lLiBjbGllbnRzCisgKiBjYW4gY29ubmVjdCBhbm9ueW1vdXNseS4KKyAqIAorICogVGhpcyBzZXR0aW5nIGludGVyYWN0cyB3aXRoIHRoZSBhdmFpbGFibGUgYXV0aG9yaXphdGlvbiBtZWNoYW5pc21zCisgKiAoc2VlIGRidXNfc2VydmVyX3NldF9hdXRoX21lY2hhbmlzbXMoKSkuIE5hbWVseSwgYW4gYXV0aCBtZWNoYW5pc20KKyAqIHN1Y2ggYXMgQU5PTllNT1VTIHRoYXQgc3VwcG9ydHMgYW5vbnltb3VzIGF1dGggbXVzdCBiZSBpbmNsdWRlZCBpbgorICogdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIG1lY2hhbmlzbXMgZm9yIGFub255bW91cyBsb2dpbiB0byB3b3JrLgorICoKKyAqIFRoaXMgc2V0dGluZyBhbHNvIGNoYW5nZXMgdGhlIGRlZmF1bHQgcnVsZSBmb3IgY29ubmVjdGlvbnMKKyAqIGF1dGhvcml6ZWQgYXMgYSB1c2VyOyBub3JtYWxseSwgaWYgYSBjb25uZWN0aW9uIGF1dGhvcml6ZXMgYXMKKyAqIGEgdXNlciBpZGVudGl0eSwgaXQgaXMgcGVybWl0dGVkIGlmIHRoZSB1c2VyIGlkZW50aXR5IGlzCisgKiByb290IG9yIHRoZSB1c2VyIGlkZW50aXR5IG1hdGNoZXMgdGhlIHVzZXIgaWRlbnRpdHkgb2YgdGhlIHNlcnZlcgorICogcHJvY2Vzcy4gSWYgYW5vbnltb3VzIGNvbm5lY3Rpb25zIGFyZSBhbGxvd2VkLCBob3dldmVyLAorICogdGhlbiBhbnkgdXNlciBpZGVudGl0eSBpcyBhbGxvd2VkLgorICoKKyAqIFlvdSBjYW4gb3ZlcnJpZGUgdGhlIHJ1bGVzIGZvciBjb25uZWN0aW9ucyBhdXRob3JpemVkIGFzIGEKKyAqIHVzZXIgaWRlbnRpdHkgd2l0aCBkYnVzX2Nvbm5lY3Rpb25fc2V0X3VuaXhfdXNlcl9mdW5jdGlvbigpCisgKiBhbmQgZGJ1c19jb25uZWN0aW9uX3NldF93aW5kb3dzX3VzZXJfZnVuY3Rpb24oKS4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSB2YWx1ZSB3aGV0aGVyIHRvIGFsbG93IGF1dGhlbnRpY2F0aW9uIGFzIGFuIGFub255bW91cyB1c2VyCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9zZXRfYWxsb3dfYW5vbnltb3VzIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgICAgdmFsdWUpCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgX2RidXNfdHJhbnNwb3J0X3NldF9hbGxvd19hbm9ueW1vdXMgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCwgdmFsdWUpOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7Cit9CisKKy8qKgorICoKKyAqIE5vcm1hbGx5ICNEQnVzQ29ubmVjdGlvbiBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgYWxsIG1lc3NhZ2VzIHRvIHRoZQorICogb3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlciBpbnRlcmZhY2UuIEhvd2V2ZXIsIHRoZSBtZXNzYWdlIGJ1cyB3YW50cworICogdG8gYmUgYWJsZSB0byByb3V0ZSBtZXRob2RzIG9uIHRoYXQgaW50ZXJmYWNlIHRocm91Z2ggdGhlIGJ1cyBhbmQKKyAqIHRvIG90aGVyIGFwcGxpY2F0aW9ucy4gSWYgcm91dGluZyBwZWVyIG1lc3NhZ2VzIGlzIGVuYWJsZWQsIHRoZW4KKyAqIG1lc3NhZ2VzIHdpdGggdGhlIG9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIgaW50ZXJmYWNlIHRoYXQgYWxzbworICogaGF2ZSBhIGJ1cyBkZXN0aW5hdGlvbiBuYW1lIHNldCB3aWxsIG5vdCBiZSBhdXRvbWF0aWNhbGx5CisgKiBoYW5kbGVkIGJ5IHRoZSAjREJ1c0Nvbm5lY3Rpb24gYW5kIGluc3RlYWQgd2lsbCBiZSBkaXNwYXRjaGVkCisgKiBub3JtYWxseSB0byB0aGUgYXBwbGljYXRpb24uCisgKgorICogSWYgYSBub3JtYWwgYXBwbGljYXRpb24gc2V0cyB0aGlzIGZsYWcsIGl0IGNhbiBicmVhayB0aGluZ3MgYmFkbHkuCisgKiBTbyBkb24ndCBzZXQgdGhpcyB1bmxlc3MgeW91IGFyZSB0aGUgbWVzc2FnZSBidXMuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSB2YWx1ZSAjVFJVRSB0byBwYXNzIHRocm91Z2ggb3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlciBtZXNzYWdlcyB3aXRoIGEgYnVzIG5hbWUgc2V0CisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9zZXRfcm91dGVfcGVlcl9tZXNzYWdlcyAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgICAgICB2YWx1ZSkKK3sKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICBjb25uZWN0aW9uLT5yb3V0ZV9wZWVyX21lc3NhZ2VzID0gVFJVRTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworfQorCisvKioKKyAqIEFkZHMgYSBtZXNzYWdlIGZpbHRlci4gRmlsdGVycyBhcmUgaGFuZGxlcnMgdGhhdCBhcmUgcnVuIG9uIGFsbAorICogaW5jb21pbmcgbWVzc2FnZXMsIHByaW9yIHRvIHRoZSBvYmplY3RzIHJlZ2lzdGVyZWQgd2l0aAorICogZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX29iamVjdF9wYXRoKCkuICBGaWx0ZXJzIGFyZSBydW4gaW4gdGhlCisgKiBvcmRlciB0aGF0IHRoZXkgd2VyZSBhZGRlZC4gIFRoZSBzYW1lIGhhbmRsZXIgY2FuIGJlIGFkZGVkIGFzIGEKKyAqIGZpbHRlciBtb3JlIHRoYW4gb25jZSwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIGJlIHJ1biBtb3JlIHRoYW4gb25jZS4KKyAqIEZpbHRlcnMgYWRkZWQgZHVyaW5nIGEgZmlsdGVyIGNhbGxiYWNrIHdvbid0IGJlIHJ1biBvbiB0aGUgbWVzc2FnZQorICogYmVpbmcgcHJvY2Vzc2VkLgorICoKKyAqIEB0b2RvIHdlIGRvbid0IHJ1biBmaWx0ZXJzIG9uIG1lc3NhZ2VzIHdoaWxlIGJsb2NraW5nIHdpdGhvdXQKKyAqIGVudGVyaW5nIHRoZSBtYWluIGxvb3AsIHNpbmNlIGZpbHRlcnMgYXJlIHJ1biBhcyBwYXJ0IG9mCisgKiBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2goKS4gVGhpcyBpcyBwcm9iYWJseSBhIGZlYXR1cmUsIGFzIGZpbHRlcnMKKyAqIGNvdWxkIGNyZWF0ZSBhcmJpdHJhcnkgcmVlbnRyYW5jeS4gQnV0IGtpbmQgb2Ygc3Vja3MgaWYgeW91J3JlCisgKiB0cnlpbmcgdG8gZmlsdGVyIE1FVEhPRF9SRVRVUk4gZm9yIHNvbWUgcmVhc29uLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gZnVuY3Rpb24gZnVuY3Rpb24gdG8gaGFuZGxlIG1lc3NhZ2VzCisgKiBAcGFyYW0gdXNlcl9kYXRhIHVzZXIgZGF0YSB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbgorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jdGlvbiBmdW5jdGlvbiB0byB1c2UgZm9yIGZyZWVpbmcgdXNlciBkYXRhCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkuCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlciAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzSGFuZGxlTWVzc2FnZUZ1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKQoreworICBEQnVzTWVzc2FnZUZpbHRlciAqZmlsdGVyOworICAKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChmdW5jdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisKKyAgZmlsdGVyID0gZGJ1c19uZXcwIChEQnVzTWVzc2FnZUZpbHRlciwgMSk7CisgIGlmIChmaWx0ZXIgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfYXRvbWljX2luYyAoJmZpbHRlci0+cmVmY291bnQpOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmNvbm5lY3Rpb24tPmZpbHRlcl9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIpKQorICAgIHsKKyAgICAgIF9kYnVzX21lc3NhZ2VfZmlsdGVyX3VucmVmIChmaWx0ZXIpOworICAgICAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBGaWxsIGluIGZpbHRlciBhZnRlciBhbGwgbWVtb3J5IGFsbG9jYXRlZCwKKyAgICogc28gd2UgZG9uJ3QgcnVuIHRoZSBmcmVlX3VzZXJfZGF0YV9mdW5jdGlvbgorICAgKiBpZiB0aGUgYWRkX2ZpbHRlcigpIGZhaWxzCisgICAqLworICAKKyAgZmlsdGVyLT5mdW5jdGlvbiA9IGZ1bmN0aW9uOworICBmaWx0ZXItPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKyAgZmlsdGVyLT5mcmVlX3VzZXJfZGF0YV9mdW5jdGlvbiA9IGZyZWVfZGF0YV9mdW5jdGlvbjsKKyAgICAgICAgCisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogUmVtb3ZlcyBhIHByZXZpb3VzbHktYWRkZWQgbWVzc2FnZSBmaWx0ZXIuIEl0IGlzIGEgcHJvZ3JhbW1pbmcKKyAqIGVycm9yIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3IgYSBoYW5kbGVyIHRoYXQgaGFzIG5vdCBiZWVuIGFkZGVkCisgKiBhcyBhIGZpbHRlci4gSWYgdGhlIGdpdmVuIGhhbmRsZXIgd2FzIGFkZGVkIG1vcmUgdGhhbiBvbmNlLCBvbmx5CisgKiBvbmUgaW5zdGFuY2Ugb2YgaXQgd2lsbCBiZSByZW1vdmVkICh0aGUgbW9zdCByZWNlbnRseS1hZGRlZAorICogaW5zdGFuY2UpLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gZnVuY3Rpb24gdGhlIGhhbmRsZXIgdG8gcmVtb3ZlCisgKiBAcGFyYW0gdXNlcl9kYXRhIHVzZXIgZGF0YSBmb3IgdGhlIGhhbmRsZXIgdG8gcmVtb3ZlCisgKgorICovCit2b2lkCitkYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX2ZpbHRlciAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzSGFuZGxlTWVzc2FnZUZ1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIERCdXNMaXN0ICpsaW5rOworICBEQnVzTWVzc2FnZUZpbHRlciAqZmlsdGVyOworICAKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChmdW5jdGlvbiAhPSBOVUxMKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyAgZmlsdGVyID0gTlVMTDsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9sYXN0X2xpbmsgKCZjb25uZWN0aW9uLT5maWx0ZXJfbGlzdCk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgZmlsdGVyID0gbGluay0+ZGF0YTsKKworICAgICAgaWYgKGZpbHRlci0+ZnVuY3Rpb24gPT0gZnVuY3Rpb24gJiYKKyAgICAgICAgICBmaWx0ZXItPnVzZXJfZGF0YSA9PSB1c2VyX2RhdGEpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19saXN0X3JlbW92ZV9saW5rICgmY29ubmVjdGlvbi0+ZmlsdGVyX2xpc3QsIGxpbmspOworICAgICAgICAgIGZpbHRlci0+ZnVuY3Rpb24gPSBOVUxMOworICAgICAgICAgIAorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIAorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X3ByZXZfbGluayAoJmNvbm5lY3Rpb24tPmZpbHRlcl9saXN0LCBsaW5rKTsKKyAgICAgIGZpbHRlciA9IE5VTEw7CisgICAgfQorICAKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgaWYgKGZpbHRlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkICgiQXR0ZW1wdCB0byByZW1vdmUgZmlsdGVyIGZ1bmN0aW9uICVwIHVzZXIgZGF0YSAlcCwgYnV0IG5vIHN1Y2ggZmlsdGVyIGhhcyBiZWVuIGFkZGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLCB1c2VyX2RhdGEpOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorICAKKyAgLyogQ2FsbCBhcHBsaWNhdGlvbiBjb2RlICovCisgIGlmIChmaWx0ZXItPmZyZWVfdXNlcl9kYXRhX2Z1bmN0aW9uKQorICAgICgqIGZpbHRlci0+ZnJlZV91c2VyX2RhdGFfZnVuY3Rpb24pIChmaWx0ZXItPnVzZXJfZGF0YSk7CisKKyAgZmlsdGVyLT5mcmVlX3VzZXJfZGF0YV9mdW5jdGlvbiA9IE5VTEw7CisgIGZpbHRlci0+dXNlcl9kYXRhID0gTlVMTDsKKyAgCisgIF9kYnVzX21lc3NhZ2VfZmlsdGVyX3VucmVmIChmaWx0ZXIpOworfQorCisvKioKKyAqIFJlZ2lzdGVycyBhIGhhbmRsZXIgZm9yIGEgZ2l2ZW4gcGF0aCBvciBzdWJzZWN0aW9uIGluIHRoZSBvYmplY3QKKyAqIGhpZXJhcmNoeS4gVGhlIGdpdmVuIHZ0YWJsZSBoYW5kbGVzIG1lc3NhZ2VzIHNlbnQgdG8gZXhhY3RseSB0aGUKKyAqIGdpdmVuIHBhdGggb3IgYWxzbyBmb3IgcGF0aHMgYmVsbG93IHRoYXQsIGRlcGVuZGluZyBvbiBmYWxsYmFjaworICogcGFyYW1ldGVyLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gZmFsbGJhY2sgd2hldGhlciB0byBoYW5kbGUgbWVzc2FnZXMgYWxzbyBmb3IgInN1YmRpcmVjdG9yeSIKKyAqIEBwYXJhbSBwYXRoIGEgJy8nIGRlbGltaXRlZCBzdHJpbmcgb2YgcGF0aCBlbGVtZW50cworICogQHBhcmFtIHZ0YWJsZSB0aGUgdmlydHVhbCB0YWJsZQorICogQHBhcmFtIHVzZXJfZGF0YSBkYXRhIHRvIHBhc3MgdG8gZnVuY3Rpb25zIGluIHRoZSB2dGFibGUKKyAqIEBwYXJhbSBlcnJvciBhZGRyZXNzIHdoZXJlIGFuIGVycm9yIGNhbiBiZSByZXR1cm5lZAorICogQHJldHVybnMgI0ZBTFNFIGlmIGFuIGVycm9yICgjREJVU19FUlJPUl9OT19NRU1PUlkgb3IKKyAqICAgICNEQlVTX0VSUk9SX09CSkVDVF9QQVRIX0lOX1VTRSkgaXMgcmVwb3J0ZWQKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX29iamVjdF9wYXRoIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgICAgIGZhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c09iamVjdFBhdGhWVGFibGUgICp2dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICAqZXJyb3IpCit7CisgIGNoYXIgKipkZWNvbXBvc2VkX3BhdGg7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBpZiAoIV9kYnVzX2RlY29tcG9zZV9wYXRoIChwYXRoLCBzdHJsZW4gKHBhdGgpLCAmZGVjb21wb3NlZF9wYXRoLCBOVUxMKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICByZXR2YWwgPSBfZGJ1c19vYmplY3RfdHJlZV9yZWdpc3RlciAoY29ubmVjdGlvbi0+b2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKiopIGRlY29tcG9zZWRfcGF0aCwgdnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9kYXRhLCBlcnJvcik7CisKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGRlY29tcG9zZWRfcGF0aCk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBSZWdpc3RlcnMgYSBoYW5kbGVyIGZvciBhIGdpdmVuIHBhdGggaW4gdGhlIG9iamVjdCBoaWVyYXJjaHkuCisgKiBUaGUgZ2l2ZW4gdnRhYmxlIGhhbmRsZXMgbWVzc2FnZXMgc2VudCB0byBleGFjdGx5IHRoZSBnaXZlbiBwYXRoLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gcGF0aCBhICcvJyBkZWxpbWl0ZWQgc3RyaW5nIG9mIHBhdGggZWxlbWVudHMKKyAqIEBwYXJhbSB2dGFibGUgdGhlIHZpcnR1YWwgdGFibGUKKyAqIEBwYXJhbSB1c2VyX2RhdGEgZGF0YSB0byBwYXNzIHRvIGZ1bmN0aW9ucyBpbiB0aGUgdnRhYmxlCisgKiBAcGFyYW0gZXJyb3IgYWRkcmVzcyB3aGVyZSBhbiBlcnJvciBjYW4gYmUgcmV0dXJuZWQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBhbiBlcnJvciAoI0RCVVNfRVJST1JfTk9fTUVNT1JZIG9yCisgKiAgICAjREJVU19FUlJPUl9PQkpFQ1RfUEFUSF9JTl9VU0UpIGlzIHJlcG9ydGVkCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fdHJ5X3JlZ2lzdGVyX29iamVjdF9wYXRoIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzT2JqZWN0UGF0aFZUYWJsZSAgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAgICplcnJvcikKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwYXRoICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwYXRoWzBdID09ICcvJywgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHZ0YWJsZSAhPSBOVUxMLCBGQUxTRSk7CisKKyAgcmV0dXJuIF9kYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfb2JqZWN0X3BhdGggKGNvbm5lY3Rpb24sIEZBTFNFLCBwYXRoLCB2dGFibGUsIHVzZXJfZGF0YSwgZXJyb3IpOworfQorCisvKioKKyAqIFJlZ2lzdGVycyBhIGhhbmRsZXIgZm9yIGEgZ2l2ZW4gcGF0aCBpbiB0aGUgb2JqZWN0IGhpZXJhcmNoeS4KKyAqIFRoZSBnaXZlbiB2dGFibGUgaGFuZGxlcyBtZXNzYWdlcyBzZW50IHRvIGV4YWN0bHkgdGhlIGdpdmVuIHBhdGguCisgKgorICogSXQgaXMgYSBidWcgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGZvciBvYmplY3QgcGF0aHMgd2hpY2ggYWxyZWFkeQorICogaGF2ZSBhIGhhbmRsZXIuIFVzZSBkYnVzX2Nvbm5lY3Rpb25fdHJ5X3JlZ2lzdGVyX29iamVjdF9wYXRoKCkgaWYgdGhpcworICogbWlnaHQgYmUgdGhlIGNhc2UuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBwYXRoIGEgJy8nIGRlbGltaXRlZCBzdHJpbmcgb2YgcGF0aCBlbGVtZW50cworICogQHBhcmFtIHZ0YWJsZSB0aGUgdmlydHVhbCB0YWJsZQorICogQHBhcmFtIHVzZXJfZGF0YSBkYXRhIHRvIHBhc3MgdG8gZnVuY3Rpb25zIGluIHRoZSB2dGFibGUKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBhbiBlcnJvciAoI0RCVVNfRVJST1JfTk9fTUVNT1JZIG9yCisgKiAgICAjREJVU19FUlJPUl9PQkpFQ1RfUEFUSF9JTl9VU0UpIG9jdXJyZWQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9vYmplY3RfcGF0aCAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNPYmplY3RQYXRoVlRhYmxlICAqdnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwYXRoICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwYXRoWzBdID09ICcvJywgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHZ0YWJsZSAhPSBOVUxMLCBGQUxTRSk7CisKKyAgcmV0dmFsID0gX2RidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9vYmplY3RfcGF0aCAoY29ubmVjdGlvbiwgRkFMU0UsIHBhdGgsIHZ0YWJsZSwgdXNlcl9kYXRhLCAmZXJyb3IpOworCisgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfT0JKRUNUX1BBVEhfSU5fVVNFKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiJXNcbiIsIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFJlZ2lzdGVycyBhIGZhbGxiYWNrIGhhbmRsZXIgZm9yIGEgZ2l2ZW4gc3Vic2VjdGlvbiBvZiB0aGUgb2JqZWN0CisgKiBoaWVyYXJjaHkuICBUaGUgZ2l2ZW4gdnRhYmxlIGhhbmRsZXMgbWVzc2FnZXMgYXQgb3IgYmVsb3cgdGhlIGdpdmVuCisgKiBwYXRoLiBZb3UgY2FuIHVzZSB0aGlzIHRvIGVzdGFibGlzaCBhIGRlZmF1bHQgbWVzc2FnZSBoYW5kbGluZworICogcG9saWN5IGZvciBhIHdob2xlICJzdWJkaXJlY3RvcnkuIgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gcGF0aCBhICcvJyBkZWxpbWl0ZWQgc3RyaW5nIG9mIHBhdGggZWxlbWVudHMKKyAqIEBwYXJhbSB2dGFibGUgdGhlIHZpcnR1YWwgdGFibGUKKyAqIEBwYXJhbSB1c2VyX2RhdGEgZGF0YSB0byBwYXNzIHRvIGZ1bmN0aW9ucyBpbiB0aGUgdnRhYmxlCisgKiBAcGFyYW0gZXJyb3IgYWRkcmVzcyB3aGVyZSBhbiBlcnJvciBjYW4gYmUgcmV0dXJuZWQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBhbiBlcnJvciAoI0RCVVNfRVJST1JfTk9fTUVNT1JZIG9yCisgKiAgICAjREJVU19FUlJPUl9PQkpFQ1RfUEFUSF9JTl9VU0UpIGlzIHJlcG9ydGVkCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fdHJ5X3JlZ2lzdGVyX2ZhbGxiYWNrIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzT2JqZWN0UGF0aFZUYWJsZSAgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAgICplcnJvcikKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwYXRoICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwYXRoWzBdID09ICcvJywgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHZ0YWJsZSAhPSBOVUxMLCBGQUxTRSk7CisKKyAgcmV0dXJuIF9kYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfb2JqZWN0X3BhdGggKGNvbm5lY3Rpb24sIFRSVUUsIHBhdGgsIHZ0YWJsZSwgdXNlcl9kYXRhLCBlcnJvcik7Cit9CisKKy8qKgorICogUmVnaXN0ZXJzIGEgZmFsbGJhY2sgaGFuZGxlciBmb3IgYSBnaXZlbiBzdWJzZWN0aW9uIG9mIHRoZSBvYmplY3QKKyAqIGhpZXJhcmNoeS4gIFRoZSBnaXZlbiB2dGFibGUgaGFuZGxlcyBtZXNzYWdlcyBhdCBvciBiZWxvdyB0aGUgZ2l2ZW4KKyAqIHBhdGguIFlvdSBjYW4gdXNlIHRoaXMgdG8gZXN0YWJsaXNoIGEgZGVmYXVsdCBtZXNzYWdlIGhhbmRsaW5nCisgKiBwb2xpY3kgZm9yIGEgd2hvbGUgInN1YmRpcmVjdG9yeS4iCisgKgorICogSXQgaXMgYSBidWcgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGZvciBvYmplY3QgcGF0aHMgd2hpY2ggYWxyZWFkeQorICogaGF2ZSBhIGhhbmRsZXIuIFVzZSBkYnVzX2Nvbm5lY3Rpb25fdHJ5X3JlZ2lzdGVyX2ZhbGxiYWNrKCkgaWYgdGhpcworICogbWlnaHQgYmUgdGhlIGNhc2UuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBwYXRoIGEgJy8nIGRlbGltaXRlZCBzdHJpbmcgb2YgcGF0aCBlbGVtZW50cworICogQHBhcmFtIHZ0YWJsZSB0aGUgdmlydHVhbCB0YWJsZQorICogQHBhcmFtIHVzZXJfZGF0YSBkYXRhIHRvIHBhc3MgdG8gZnVuY3Rpb25zIGluIHRoZSB2dGFibGUKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBhbiBlcnJvciAoI0RCVVNfRVJST1JfTk9fTUVNT1JZIG9yCisgKiAgICAjREJVU19FUlJPUl9PQkpFQ1RfUEFUSF9JTl9VU0UpIG9jY3VyZWQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9mYWxsYmFjayAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNPYmplY3RQYXRoVlRhYmxlICAqdnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwYXRoICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwYXRoWzBdID09ICcvJywgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHZ0YWJsZSAhPSBOVUxMLCBGQUxTRSk7CisKKyAgcmV0dmFsID0gX2RidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9vYmplY3RfcGF0aCAoY29ubmVjdGlvbiwgVFJVRSwgcGF0aCwgdnRhYmxlLCB1c2VyX2RhdGEsICZlcnJvcik7CisKKyAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9PQkpFQ1RfUEFUSF9JTl9VU0UpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCIlc1xuIiwgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogVW5yZWdpc3RlcnMgdGhlIGhhbmRsZXIgcmVnaXN0ZXJlZCB3aXRoIGV4YWN0bHkgdGhlIGdpdmVuIHBhdGguCisgKiBJdCdzIGEgYnVnIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3IgYSBwYXRoIHRoYXQgaXNuJ3QgcmVnaXN0ZXJlZC4KKyAqIENhbiB1bnJlZ2lzdGVyIGJvdGggZmFsbGJhY2sgcGF0aHMgYW5kIG9iamVjdCBwYXRocy4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHBhdGggYSAnLycgZGVsaW1pdGVkIHN0cmluZyBvZiBwYXRoIGVsZW1lbnRzCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl91bnJlZ2lzdGVyX29iamVjdF9wYXRoIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICpwYXRoKQoreworICBjaGFyICoqZGVjb21wb3NlZF9wYXRoOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGF0aCAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGF0aFswXSA9PSAnLycsIEZBTFNFKTsKKworICBpZiAoIV9kYnVzX2RlY29tcG9zZV9wYXRoIChwYXRoLCBzdHJsZW4gKHBhdGgpLCAmZGVjb21wb3NlZF9wYXRoLCBOVUxMKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAoY29ubmVjdGlvbi0+b2JqZWN0cywgKGNvbnN0IGNoYXIgKiopIGRlY29tcG9zZWRfcGF0aCk7CisKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoZGVjb21wb3NlZF9wYXRoKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBHZXRzIHRoZSB1c2VyIGRhdGEgcGFzc2VkIHRvIGRidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9vYmplY3RfcGF0aCgpCisgKiBvciBkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfZmFsbGJhY2soKS4gSWYgbm90aGluZyB3YXMgcmVnaXN0ZXJlZAorICogYXQgdGhpcyBwYXRoLCB0aGUgZGF0YSBpcyBmaWxsZWQgaW4gd2l0aCAjTlVMTC4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHBhdGggdGhlIHBhdGggeW91IHJlZ2lzdGVyZWQgd2l0aAorICogQHBhcmFtIGRhdGFfcCBsb2NhdGlvbiB0byBzdG9yZSB0aGUgdXNlciBkYXRhLCBvciAjTlVMTAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fZ2V0X29iamVjdF9wYXRoX2RhdGEgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqKmRhdGFfcCkKK3sKKyAgY2hhciAqKmRlY29tcG9zZWRfcGF0aDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHBhdGggIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGRhdGFfcCAhPSBOVUxMLCBGQUxTRSk7CisKKyAgKmRhdGFfcCA9IE5VTEw7CisgIAorICBpZiAoIV9kYnVzX2RlY29tcG9zZV9wYXRoIChwYXRoLCBzdHJsZW4gKHBhdGgpLCAmZGVjb21wb3NlZF9wYXRoLCBOVUxMKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgICpkYXRhX3AgPSBfZGJ1c19vYmplY3RfdHJlZV9nZXRfdXNlcl9kYXRhX3VubG9ja2VkIChjb25uZWN0aW9uLT5vYmplY3RzLCAoY29uc3QgY2hhcioqKSBkZWNvbXBvc2VkX3BhdGgpOworCisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChkZWNvbXBvc2VkX3BhdGgpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIExpc3RzIHRoZSByZWdpc3RlcmVkIGZhbGxiYWNrIGhhbmRsZXJzIGFuZCBvYmplY3QgcGF0aCBoYW5kbGVycyBhdAorICogdGhlIGdpdmVuIHBhcmVudF9wYXRoLiBUaGUgcmV0dXJuZWQgYXJyYXkgc2hvdWxkIGJlIGZyZWVkIHdpdGgKKyAqIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkoKS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHBhcmVudF9wYXRoIHRoZSBwYXRoIHRvIGxpc3QgdGhlIGNoaWxkIGhhbmRsZXJzIG9mCisgKiBAcGFyYW0gY2hpbGRfZW50cmllcyByZXR1cm5zICNOVUxMLXRlcm1pbmF0ZWQgYXJyYXkgb2YgY2hpbGRyZW4KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIGNoaWxkIGVudHJpZXMKKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9saXN0X3JlZ2lzdGVyZWQgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAqcGFyZW50X3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICoqKmNoaWxkX2VudHJpZXMpCit7CisgIGNoYXIgKipkZWNvbXBvc2VkX3BhdGg7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwYXJlbnRfcGF0aCAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGFyZW50X3BhdGhbMF0gPT0gJy8nLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY2hpbGRfZW50cmllcyAhPSBOVUxMLCBGQUxTRSk7CisKKyAgaWYgKCFfZGJ1c19kZWNvbXBvc2VfcGF0aCAocGFyZW50X3BhdGgsIHN0cmxlbiAocGFyZW50X3BhdGgpLCAmZGVjb21wb3NlZF9wYXRoLCBOVUxMKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICByZXR2YWwgPSBfZGJ1c19vYmplY3RfdHJlZV9saXN0X3JlZ2lzdGVyZWRfYW5kX3VubG9jayAoY29ubmVjdGlvbi0+b2JqZWN0cywKKwkJCQkJCQkgKGNvbnN0IGNoYXIgKiopIGRlY29tcG9zZWRfcGF0aCwKKwkJCQkJCQkgY2hpbGRfZW50cmllcyk7CisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGRlY29tcG9zZWRfcGF0aCk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIERCdXNEYXRhU2xvdEFsbG9jYXRvciBzbG90X2FsbG9jYXRvcjsKK19EQlVTX0RFRklORV9HTE9CQUxfTE9DSyAoY29ubmVjdGlvbl9zbG90cyk7CisKKy8qKgorICogQWxsb2NhdGVzIGFuIGludGVnZXIgSUQgdG8gYmUgdXNlZCBmb3Igc3RvcmluZyBhcHBsaWNhdGlvbi1zcGVjaWZpYworICogZGF0YSBvbiBhbnkgREJ1c0Nvbm5lY3Rpb24uIFRoZSBhbGxvY2F0ZWQgSUQgbWF5IHRoZW4gYmUgdXNlZAorICogd2l0aCBkYnVzX2Nvbm5lY3Rpb25fc2V0X2RhdGEoKSBhbmQgZGJ1c19jb25uZWN0aW9uX2dldF9kYXRhKCkuCisgKiBUaGUgcGFzc2VkLWluIHNsb3QgbXVzdCBiZSBpbml0aWFsaXplZCB0byAtMSwgYW5kIGlzIGZpbGxlZCBpbgorICogd2l0aCB0aGUgc2xvdCBJRC4gSWYgdGhlIHBhc3NlZC1pbiBzbG90IGlzIG5vdCAtMSwgaXQncyBhc3N1bWVkCisgKiB0byBiZSBhbHJlYWR5IGFsbG9jYXRlZCwgYW5kIGl0cyByZWZjb3VudCBpcyBpbmNyZW1lbnRlZC4KKyAqIAorICogVGhlIGFsbG9jYXRlZCBzbG90IGlzIGdsb2JhbCwgaS5lLiBhbGwgREJ1c0Nvbm5lY3Rpb24gb2JqZWN0cyB3aWxsCisgKiBoYXZlIGEgc2xvdCB3aXRoIHRoZSBnaXZlbiBpbnRlZ2VyIElEIHJlc2VydmVkLgorICoKKyAqIEBwYXJhbSBzbG90X3AgYWRkcmVzcyBvZiBhIGdsb2JhbCB2YXJpYWJsZSBzdG9yaW5nIHRoZSBzbG90CisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZSAobm8gbWVtb3J5KQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX2FsbG9jYXRlX2RhdGFfc2xvdCAoZGJ1c19pbnQzMl90ICpzbG90X3ApCit7CisgIHJldHVybiBfZGJ1c19kYXRhX3Nsb3RfYWxsb2NhdG9yX2FsbG9jICgmc2xvdF9hbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX0RCVVNfTE9DS19OQU1FIChjb25uZWN0aW9uX3Nsb3RzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RfcCk7Cit9CisKKy8qKgorICogRGVhbGxvY2F0ZXMgYSBnbG9iYWwgSUQgZm9yIGNvbm5lY3Rpb24gZGF0YSBzbG90cy4KKyAqIGRidXNfY29ubmVjdGlvbl9nZXRfZGF0YSgpIGFuZCBkYnVzX2Nvbm5lY3Rpb25fc2V0X2RhdGEoKSBtYXkgbm8KKyAqIGxvbmdlciBiZSB1c2VkIHdpdGggdGhpcyBzbG90LiAgRXhpc3RpbmcgZGF0YSBzdG9yZWQgb24gZXhpc3RpbmcKKyAqIERCdXNDb25uZWN0aW9uIG9iamVjdHMgd2lsbCBiZSBmcmVlZCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzCisgKiBmaW5hbGl6ZWQsIGJ1dCBtYXkgbm90IGJlIHJldHJpZXZlZCAoYW5kIG1heSBvbmx5IGJlIHJlcGxhY2VkIGlmCisgKiBzb21lb25lIGVsc2UgcmVhbGxvY2F0ZXMgdGhlIHNsb3QpLiAgV2hlbiB0aGUgcmVmY291bnQgb24gdGhlCisgKiBwYXNzZWQtaW4gc2xvdCByZWFjaGVzIDAsIGl0IGlzIHNldCB0byAtMS4KKyAqCisgKiBAcGFyYW0gc2xvdF9wIGFkZHJlc3Mgc3RvcmluZyB0aGUgc2xvdCB0byBkZWFsbG9jYXRlCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9mcmVlX2RhdGFfc2xvdCAoZGJ1c19pbnQzMl90ICpzbG90X3ApCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsICgqc2xvdF9wID49IDApOworICAKKyAgX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9mcmVlICgmc2xvdF9hbGxvY2F0b3IsIHNsb3RfcCk7Cit9CisKKy8qKgorICogU3RvcmVzIGEgcG9pbnRlciBvbiBhIERCdXNDb25uZWN0aW9uLCBhbG9uZworICogd2l0aCBhbiBvcHRpb25hbCBmdW5jdGlvbiB0byBiZSB1c2VkIGZvciBmcmVlaW5nCisgKiB0aGUgZGF0YSB3aGVuIHRoZSBkYXRhIGlzIHNldCBhZ2Fpbiwgb3Igd2hlbgorICogdGhlIGNvbm5lY3Rpb24gaXMgZmluYWxpemVkLiBUaGUgc2xvdCBudW1iZXIKKyAqIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aXRoIGRidXNfY29ubmVjdGlvbl9hbGxvY2F0ZV9kYXRhX3Nsb3QoKS4KKyAqCisgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHRha2UgdGhlCisgKiBtYWluIHRocmVhZCBsb2NrIG9uIERCdXNDb25uZWN0aW9uLCB3aGljaCBhbGxvd3MgaXQgdG8gYmUKKyAqIHVzZWQgZnJvbSBpbnNpZGUgd2F0Y2ggYW5kIHRpbWVvdXQgZnVuY3Rpb25zLiAoU2VlIHRoZQorICogbm90ZSBpbiBkb2NzIGZvciBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dhdGNoX2Z1bmN0aW9ucygpLikKKyAqIEEgc2lkZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IHlvdSBuZWVkIHRvIGtub3cgdGhlcmUncworICogYSByZWZlcmVuY2UgaGVsZCBvbiB0aGUgY29ubmVjdGlvbiB3aGlsZSBpbnZva2luZworICogZGJ1c19jb25uZWN0aW9uX3NldF9kYXRhKCksIG9yIHRoZSBjb25uZWN0aW9uIGNvdWxkIGJlCisgKiBmaW5hbGl6ZWQgZHVyaW5nIGRidXNfY29ubmVjdGlvbl9zZXRfZGF0YSgpLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gc2xvdCB0aGUgc2xvdCBudW1iZXIKKyAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIHRvIHN0b3JlCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmMgZmluYWxpemVyIGZ1bmN0aW9uIGZvciB0aGUgZGF0YQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlcmUgd2FzIGVub3VnaCBtZW1vcnkgdG8gc3RvcmUgdGhlIGRhdGEKKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9zZXRfZGF0YSAoREJ1c0Nvbm5lY3Rpb24gICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgZnJlZV9kYXRhX2Z1bmMpCit7CisgIERCdXNGcmVlRnVuY3Rpb24gb2xkX2ZyZWVfZnVuYzsKKyAgdm9pZCAqb2xkX2RhdGE7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNsb3QgPj0gMCwgRkFMU0UpOworICAKKyAgU0xPVFNfTE9DSyAoY29ubmVjdGlvbik7CisKKyAgcmV0dmFsID0gX2RidXNfZGF0YV9zbG90X2xpc3Rfc2V0ICgmc2xvdF9hbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbm5lY3Rpb24tPnNsb3RfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LCBkYXRhLCBmcmVlX2RhdGFfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2xkX2ZyZWVfZnVuYywgJm9sZF9kYXRhKTsKKyAgCisgIFNMT1RTX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgaWYgKHJldHZhbCkKKyAgICB7CisgICAgICAvKiBEbyB0aGUgYWN0dWFsIGZyZWUgb3V0c2lkZSB0aGUgY29ubmVjdGlvbiBsb2NrICovCisgICAgICBpZiAob2xkX2ZyZWVfZnVuYykKKyAgICAgICAgKCogb2xkX2ZyZWVfZnVuYykgKG9sZF9kYXRhKTsKKyAgICB9CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBSZXRyaWV2ZXMgZGF0YSBwcmV2aW91c2x5IHNldCB3aXRoIGRidXNfY29ubmVjdGlvbl9zZXRfZGF0YSgpLgorICogVGhlIHNsb3QgbXVzdCBzdGlsbCBiZSBhbGxvY2F0ZWQgKG11c3Qgbm90IGhhdmUgYmVlbiBmcmVlZCkuCisgKgorICogQG5vdGUgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB0YWtlIHRoZQorICogbWFpbiB0aHJlYWQgbG9jayBvbiBEQnVzQ29ubmVjdGlvbiwgd2hpY2ggYWxsb3dzIGl0IHRvIGJlCisgKiB1c2VkIGZyb20gaW5zaWRlIHdhdGNoIGFuZCB0aW1lb3V0IGZ1bmN0aW9ucy4gKFNlZSB0aGUKKyAqIG5vdGUgaW4gZG9jcyBmb3IgZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMoKS4pCisgKiBBIHNpZGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB5b3UgbmVlZCB0byBrbm93IHRoZXJlJ3MKKyAqIGEgcmVmZXJlbmNlIGhlbGQgb24gdGhlIGNvbm5lY3Rpb24gd2hpbGUgaW52b2tpbmcKKyAqIGRidXNfY29ubmVjdGlvbl9nZXRfZGF0YSgpLCBvciB0aGUgY29ubmVjdGlvbiBjb3VsZCBiZQorICogZmluYWxpemVkIGR1cmluZyBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2RhdGEoKS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHNsb3QgdGhlIHNsb3QgdG8gZ2V0IGRhdGEgZnJvbQorICogQHJldHVybnMgdGhlIGRhdGEsIG9yICNOVUxMIGlmIG5vdCBmb3VuZAorICovCit2b2lkKgorZGJ1c19jb25uZWN0aW9uX2dldF9kYXRhIChEQnVzQ29ubmVjdGlvbiAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICBzbG90KQoreworICB2b2lkICpyZXM7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIE5VTEwpOworICAKKyAgU0xPVFNfTE9DSyAoY29ubmVjdGlvbik7CisKKyAgcmVzID0gX2RidXNfZGF0YV9zbG90X2xpc3RfZ2V0ICgmc2xvdF9hbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbm5lY3Rpb24tPnNsb3RfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90KTsKKyAgCisgIFNMT1RTX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgYSBnbG9iYWwgZmxhZyBmb3Igd2hldGhlciBkYnVzX2Nvbm5lY3Rpb25fbmV3KCkKKyAqIHdpbGwgc2V0IFNJR1BJUEUgYmVoYXZpb3IgdG8gU0lHX0lHTi4KKyAqCisgKiBAcGFyYW0gd2lsbF9tb2RpZnlfc2lncGlwZSAjVFJVRSB0byBhbGxvdyBzaWdwaXBlIHRvIGJlIHNldCB0byBTSUdfSUdOCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9zZXRfY2hhbmdlX3NpZ3BpcGUgKGRidXNfYm9vbF90IHdpbGxfbW9kaWZ5X3NpZ3BpcGUpCit7ICAKKyAgX2RidXNfbW9kaWZ5X3NpZ3BpcGUgPSB3aWxsX21vZGlmeV9zaWdwaXBlICE9IEZBTFNFOworfQorCisvKioKKyAqIFNwZWNpZmllcyB0aGUgbWF4aW11bSBzaXplIG1lc3NhZ2UgdGhpcyBjb25uZWN0aW9uIGlzIGFsbG93ZWQgdG8KKyAqIHJlY2VpdmUuIExhcmdlciBtZXNzYWdlcyB3aWxsIHJlc3VsdCBpbiBkaXNjb25uZWN0aW5nIHRoZQorICogY29ubmVjdGlvbi4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gYSAjREJ1c0Nvbm5lY3Rpb24KKyAqIEBwYXJhbSBzaXplIG1heGltdW0gbWVzc2FnZSBzaXplIHRoZSBjb25uZWN0aW9uIGNhbiByZWNlaXZlLCBpbiBieXRlcworICovCit2b2lkCitkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9tZXNzYWdlX3NpemUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgc2l6ZSkKK3sKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICBfZGJ1c190cmFuc3BvcnRfc2V0X21heF9tZXNzYWdlX3NpemUgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworfQorCisvKioKKyAqIEdldHMgdGhlIHZhbHVlIHNldCBieSBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9tZXNzYWdlX3NpemUoKS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHJldHVybnMgdGhlIG1heCBzaXplIG9mIGEgc2luZ2xlIG1lc3NhZ2UKKyAqLworbG9uZworZGJ1c19jb25uZWN0aW9uX2dldF9tYXhfbWVzc2FnZV9zaXplIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgbG9uZyByZXM7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIDApOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgcmVzID0gX2RidXNfdHJhbnNwb3J0X2dldF9tYXhfbWVzc2FnZV9zaXplIChjb25uZWN0aW9uLT50cmFuc3BvcnQpOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgIHJldHVybiByZXM7Cit9CisKKy8qKgorICogU3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB1bml4IGZkcyBhIG1lc3NhZ2Ugb24gdGhpcworICogY29ubmVjdGlvbiBpcyBhbGxvd2VkIHRvIHJlY2VpdmUuIE1lc3NhZ2VzIHdpdGggbW9yZSB1bml4IGZkcyB3aWxsCisgKiByZXN1bHQgaW4gZGlzY29ubmVjdGluZyB0aGUgY29ubmVjdGlvbi4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiBhICNEQnVzQ29ubmVjdGlvbgorICogQHBhcmFtIHNpemUgbWF4aW11bSBtZXNzYWdlIHVuaXggZmRzIHRoZSBjb25uZWN0aW9uIGNhbiByZWNlaXZlCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9zZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgIG4pCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwpOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIF9kYnVzX3RyYW5zcG9ydF9zZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbik7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSB2YWx1ZSBzZXQgYnkgZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfbWVzc2FnZV91bml4X2ZkcygpLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJucyB0aGUgbWF4IG51bWVyIG9mIHVuaXggZmRzIG9mIGEgc2luZ2xlIG1lc3NhZ2UKKyAqLworbG9uZworZGJ1c19jb25uZWN0aW9uX2dldF9tYXhfbWVzc2FnZV91bml4X2ZkcyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGxvbmcgcmVzOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCAwKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICByZXMgPSBfZGJ1c190cmFuc3BvcnRfZ2V0X21heF9tZXNzYWdlX3VuaXhfZmRzIChjb25uZWN0aW9uLT50cmFuc3BvcnQpOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgIHJldHVybiByZXM7Cit9CisKKy8qKgorICogU2V0cyB0aGUgbWF4aW11bSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgdXNlZCBmb3IgYWxsIG1lc3NhZ2VzCisgKiByZWNlaXZlZCBvbiB0aGlzIGNvbm5lY3Rpb24uIE1lc3NhZ2VzIGNvdW50IHRvd2FyZCB0aGUgbWF4aW11bSB1bnRpbAorICogdGhleSBhcmUgZmluYWxpemVkLiBXaGVuIHRoZSBtYXhpbXVtIGlzIHJlYWNoZWQsIHRoZSBjb25uZWN0aW9uIHdpbGwKKyAqIG5vdCByZWFkIG1vcmUgZGF0YSB1bnRpbCBzb21lIG1lc3NhZ2VzIGFyZSBmaW5hbGl6ZWQuCisgKgorICogVGhlIHNlbWFudGljcyBvZiB0aGUgbWF4aW11bSBhcmU6IGlmIG91dHN0YW5kaW5nIG1lc3NhZ2VzIGFyZQorICogYWxyZWFkeSBhYm92ZSB0aGUgbWF4aW11bSwgYWRkaXRpb25hbCBtZXNzYWdlcyB3aWxsIG5vdCBiZSByZWFkLgorICogVGhlIHNlbWFudGljcyBhcmUgbm90OiBpZiB0aGUgbmV4dCBtZXNzYWdlIHdvdWxkIGNhdXNlIHVzIHRvIGV4Y2VlZAorICogdGhlIG1heGltdW0sIHdlIGRvbid0IHJlYWQgaXQuIFRoZSByZWFzb24gaXMgdGhhdCB3ZSBkb24ndCBrbm93IHRoZQorICogc2l6ZSBvZiBhIG1lc3NhZ2UgdW50aWwgYWZ0ZXIgd2UgcmVhZCBpdC4KKyAqCisgKiBUaHVzLCB0aGUgbWF4IGxpdmUgbWVzc2FnZXMgc2l6ZSBjYW4gYWN0dWFsbHkgYmUgZXhjZWVkZWQKKyAqIGJ5IHVwIHRvIHRoZSBtYXhpbXVtIHNpemUgb2YgYSBzaW5nbGUgbWVzc2FnZS4KKyAqIAorICogQWxzbywgaWYgd2UgcmVhZCBzYXkgMTAyNCBieXRlcyBvZmYgdGhlIHdpcmUgaW4gYSBzaW5nbGUgcmVhZCgpLAorICogYW5kIHRoYXQgY29udGFpbnMgYSBoYWxmLWRvemVuIHNtYWxsIG1lc3NhZ2VzLCB3ZSBtYXkgZXhjZWVkIHRoZQorICogc2l6ZSBtYXggYnkgdGhhdCBhbW91bnQuIEJ1dCB0aGlzIHNob3VsZCBiZSBpbmNvbnNlcXVlbnRpYWwuCisgKgorICogVGhpcyBkb2VzIGltcGx5IHRoYXQgd2UgY2FuJ3QgY2FsbCByZWFkKCkgd2l0aCBhIGJ1ZmZlciBsYXJnZXIKKyAqIHRoYW4gd2UncmUgd2lsbGluZyB0byBleGNlZWQgdGhpcyBsaW1pdCBieS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHNpemUgdGhlIG1heGltdW0gc2l6ZSBpbiBieXRlcyBvZiBhbGwgb3V0c3RhbmRpbmcgbWVzc2FnZXMKKyAqLwordm9pZAorZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfcmVjZWl2ZWRfc2l6ZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgc2l6ZSkKK3sKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICBfZGJ1c190cmFuc3BvcnRfc2V0X21heF9yZWNlaXZlZF9zaXplIChjb25uZWN0aW9uLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7Cit9CisKKy8qKgorICogR2V0cyB0aGUgdmFsdWUgc2V0IGJ5IGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X3JlY2VpdmVkX3NpemUoKS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHJldHVybnMgdGhlIG1heCBzaXplIG9mIGFsbCBsaXZlIG1lc3NhZ2VzCisgKi8KK2xvbmcKK2RidXNfY29ubmVjdGlvbl9nZXRfbWF4X3JlY2VpdmVkX3NpemUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBsb25nIHJlczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgMCk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICByZXMgPSBfZGJ1c190cmFuc3BvcnRfZ2V0X21heF9yZWNlaXZlZF9zaXplIChjb25uZWN0aW9uLT50cmFuc3BvcnQpOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgIHJldHVybiByZXM7Cit9CisKKy8qKgorICogU2V0cyB0aGUgbWF4aW11bSB0b3RhbCBudW1iZXIgb2YgdW5peCBmZHMgdGhhdCBjYW4gYmUgdXNlZCBmb3IgYWxsIG1lc3NhZ2VzCisgKiByZWNlaXZlZCBvbiB0aGlzIGNvbm5lY3Rpb24uIE1lc3NhZ2VzIGNvdW50IHRvd2FyZCB0aGUgbWF4aW11bSB1bnRpbAorICogdGhleSBhcmUgZmluYWxpemVkLiBXaGVuIHRoZSBtYXhpbXVtIGlzIHJlYWNoZWQsIHRoZSBjb25uZWN0aW9uIHdpbGwKKyAqIG5vdCByZWFkIG1vcmUgZGF0YSB1bnRpbCBzb21lIG1lc3NhZ2VzIGFyZSBmaW5hbGl6ZWQuCisgKgorICogVGhlIHNlbWFudGljcyBhcmUgYW5hbG9nb3VzIHRvIHRob3NlIG9mIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X3JlY2VpdmVkX3NpemUoKS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHNpemUgdGhlIG1heGltdW0gc2l6ZSBpbiBieXRlcyBvZiBhbGwgb3V0c3RhbmRpbmcgbWVzc2FnZXMKKyAqLwordm9pZAorZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfcmVjZWl2ZWRfdW5peF9mZHMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICBuKQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICBfZGJ1c190cmFuc3BvcnRfc2V0X21heF9yZWNlaXZlZF91bml4X2ZkcyAoY29ubmVjdGlvbi0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbik7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSB2YWx1ZSBzZXQgYnkgZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfcmVjZWl2ZWRfdW5peF9mZHMoKS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHJldHVybnMgdGhlIG1heCB1bml4IGZkcyBvZiBhbGwgbGl2ZSBtZXNzYWdlcworICovCitsb25nCitkYnVzX2Nvbm5lY3Rpb25fZ2V0X21heF9yZWNlaXZlZF91bml4X2ZkcyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGxvbmcgcmVzOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCAwKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICByZXMgPSBfZGJ1c190cmFuc3BvcnRfZ2V0X21heF9yZWNlaXZlZF91bml4X2ZkcyAoY29ubmVjdGlvbi0+dHJhbnNwb3J0KTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICByZXR1cm4gcmVzOworfQorCisvKioKKyAqIEdldHMgdGhlIGFwcHJveGltYXRlIHNpemUgaW4gYnl0ZXMgb2YgYWxsIG1lc3NhZ2VzIGluIHRoZSBvdXRnb2luZworICogbWVzc2FnZSBxdWV1ZS4gVGhlIHNpemUgaXMgYXBwcm94aW1hdGUgaW4gdGhhdCB5b3Ugc2hvdWxkbid0IHVzZQorICogaXQgdG8gZGVjaWRlIGhvdyBtYW55IGJ5dGVzIHRvIHJlYWQgb2ZmIHRoZSBuZXR3b3JrIG9yIGFueXRoaW5nCisgKiBvZiB0aGF0IG5hdHVyZSwgYXMgb3B0aW1pemF0aW9ucyBtYXkgY2hvb3NlIHRvIHRlbGwgc21hbGwgd2hpdGUgbGllcworICogdG8gYXZvaWQgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gcXVldWVkIHVwIGJ1dCBub3Qgc2VudAorICovCitsb25nCitkYnVzX2Nvbm5lY3Rpb25fZ2V0X291dGdvaW5nX3NpemUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBsb25nIHJlczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgMCk7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgcmVzID0gX2RidXNfY291bnRlcl9nZXRfc2l6ZV92YWx1ZSAoY29ubmVjdGlvbi0+b3V0Z29pbmdfY291bnRlcik7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgcmV0dXJuIHJlczsKK30KKworI2lmZGVmIERCVVNfRU5BQkxFX1NUQVRTCit2b2lkCitfZGJ1c19jb25uZWN0aW9uX2dldF9zdGF0cyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKmluX21lc3NhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICppbl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAqaW5fZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICppbl9wZWFrX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICppbl9wZWFrX2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAqb3V0X21lc3NhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICpvdXRfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKm91dF9mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKm91dF9wZWFrX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICpvdXRfcGVha19mZHMpCit7CisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyAgaWYgKGluX21lc3NhZ2VzICE9IE5VTEwpCisgICAgKmluX21lc3NhZ2VzID0gY29ubmVjdGlvbi0+bl9pbmNvbWluZzsKKworICBfZGJ1c190cmFuc3BvcnRfZ2V0X3N0YXRzIChjb25uZWN0aW9uLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2J5dGVzLCBpbl9mZHMsIGluX3BlYWtfYnl0ZXMsIGluX3BlYWtfZmRzKTsKKworICBpZiAob3V0X21lc3NhZ2VzICE9IE5VTEwpCisgICAgKm91dF9tZXNzYWdlcyA9IGNvbm5lY3Rpb24tPm5fb3V0Z29pbmc7CisKKyAgaWYgKG91dF9ieXRlcyAhPSBOVUxMKQorICAgICpvdXRfYnl0ZXMgPSBfZGJ1c19jb3VudGVyX2dldF9zaXplX3ZhbHVlIChjb25uZWN0aW9uLT5vdXRnb2luZ19jb3VudGVyKTsKKworICBpZiAob3V0X2ZkcyAhPSBOVUxMKQorICAgICpvdXRfZmRzID0gX2RidXNfY291bnRlcl9nZXRfdW5peF9mZF92YWx1ZSAoY29ubmVjdGlvbi0+b3V0Z29pbmdfY291bnRlcik7CisKKyAgaWYgKG91dF9wZWFrX2J5dGVzICE9IE5VTEwpCisgICAgKm91dF9wZWFrX2J5dGVzID0gX2RidXNfY291bnRlcl9nZXRfcGVha19zaXplX3ZhbHVlIChjb25uZWN0aW9uLT5vdXRnb2luZ19jb3VudGVyKTsKKworICBpZiAob3V0X3BlYWtfZmRzICE9IE5VTEwpCisgICAgKm91dF9wZWFrX2ZkcyA9IF9kYnVzX2NvdW50ZXJfZ2V0X3BlYWtfdW5peF9mZF92YWx1ZSAoY29ubmVjdGlvbi0+b3V0Z29pbmdfY291bnRlcik7CisKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworfQorI2VuZGlmIC8qIERCVVNfRU5BQkxFX1NUQVRTICovCisKKy8qKgorICogR2V0cyB0aGUgYXBwcm94aW1hdGUgbnVtYmVyIG9mIHVuaSBmZHMgb2YgYWxsIG1lc3NhZ2VzIGluIHRoZQorICogb3V0Z29pbmcgbWVzc2FnZSBxdWV1ZS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHJldHVybnMgdGhlIG51bWJlciBvZiB1bml4IGZkcyB0aGF0IGhhdmUgYmVlbiBxdWV1ZWQgdXAgYnV0IG5vdCBzZW50CisgKi8KK2xvbmcKK2RidXNfY29ubmVjdGlvbl9nZXRfb3V0Z29pbmdfdW5peF9mZHMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBsb25nIHJlczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgMCk7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgcmVzID0gX2RidXNfY291bnRlcl9nZXRfdW5peF9mZF92YWx1ZSAoY29ubmVjdGlvbi0+b3V0Z29pbmdfY291bnRlcik7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgcmV0dXJuIHJlczsKK30KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKy8qKgorICogUmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgdHJhbnNwb3J0IG9iamVjdCBvZiB0aGlzIGNvbm5lY3Rpb24KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHJldHVybnMgdGhlIGFkZHJlc3Mgc3RyaW5nCisgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c19jb25uZWN0aW9uX2dldF9hZGRyZXNzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgcmV0dXJuIF9kYnVzX3RyYW5zcG9ydF9nZXRfYWRkcmVzcyAoY29ubmVjdGlvbi0+dHJhbnNwb3J0KTsKK30KKyNlbmRpZgorCisvKiogQH0gKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLWNvbm5lY3Rpb24uaCBiL2RidXMvZGJ1cy9kYnVzLWNvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTRkMDRlCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtY29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsNDk2IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtY29ubmVjdGlvbi5oIERCdXNDb25uZWN0aW9uIG9iamVjdAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWYgIWRlZmluZWQgKERCVVNfSU5TSURFX0RCVVNfSCkgJiYgIWRlZmluZWQgKERCVVNfQ09NUElMQVRJT04pCisjZXJyb3IgIk9ubHkgPGRidXMvZGJ1cy5oPiBjYW4gYmUgaW5jbHVkZWQgZGlyZWN0bHksIHRoaXMgZmlsZSBtYXkgZGlzYXBwZWFyIG9yIGNoYW5nZSBjb250ZW50cy4iCisjZW5kaWYKKworI2lmbmRlZiBEQlVTX0NPTk5FQ1RJT05fSAorI2RlZmluZSBEQlVTX0NPTk5FQ1RJT05fSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tZW1vcnkuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVzc2FnZS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zaGFyZWQuaD4KKworREJVU19CRUdJTl9ERUNMUworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNDb25uZWN0aW9uCisgKiBAeworICovCisKKy8qIGRvY3VtZW50ZWQgaW4gZGJ1cy13YXRjaC5jICovCit0eXBlZGVmIHN0cnVjdCBEQnVzV2F0Y2ggREJ1c1dhdGNoOworLyogZG9jdW1lbnRlZCBpbiBkYnVzLXRpbWVvdXQuYyAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c1RpbWVvdXQgREJ1c1RpbWVvdXQ7CisvKiogT3BhcXVlIHR5cGUgcmVwcmVzZW50aW5nIHByZWFsbG9jYXRlZCByZXNvdXJjZXMgc28gYSBtZXNzYWdlIGNhbiBiZSBzZW50IHdpdGhvdXQgZnVydGhlciBtZW1vcnkgYWxsb2NhdGlvbi4gKi8KK3R5cGVkZWYgc3RydWN0IERCdXNQcmVhbGxvY2F0ZWRTZW5kIERCdXNQcmVhbGxvY2F0ZWRTZW5kOworLyoqIE9wYXF1ZSB0eXBlIHJlcHJlc2VudGluZyBhIG1ldGhvZCBjYWxsIHRoYXQgaGFzIG5vdCB5ZXQgcmVjZWl2ZWQgYSByZXBseS4gKi8KK3R5cGVkZWYgc3RydWN0IERCdXNQZW5kaW5nQ2FsbCBEQnVzUGVuZGluZ0NhbGw7CisvKiogT3BhcXVlIHR5cGUgcmVwcmVzZW50aW5nIGEgY29ubmVjdGlvbiB0byBhIHJlbW90ZSBhcHBsaWNhdGlvbiBhbmQgYXNzb2NpYXRlZCBpbmNvbWluZy9vdXRnb2luZyBtZXNzYWdlIHF1ZXVlcy4gKi8KK3R5cGVkZWYgc3RydWN0IERCdXNDb25uZWN0aW9uIERCdXNDb25uZWN0aW9uOworLyoqIFNldCBvZiBmdW5jdGlvbnMgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGhhbmRsZSBtZXNzYWdlcyBzZW50IHRvIGEgcGFydGljdWxhciBvYmplY3QgcGF0aC4gKi8KK3R5cGVkZWYgc3RydWN0IERCdXNPYmplY3RQYXRoVlRhYmxlIERCdXNPYmplY3RQYXRoVlRhYmxlOworCisvKioKKyAqIEluZGljYXRlcyB0aGUgc3RhdHVzIG9mIGEgI0RCdXNXYXRjaC4KKyAqLwordHlwZWRlZiBlbnVtCit7CisgIERCVVNfV0FUQ0hfUkVBREFCTEUgPSAxIDw8IDAsIC8qKjwgQXMgaW4gUE9MTElOICovCisgIERCVVNfV0FUQ0hfV1JJVEFCTEUgPSAxIDw8IDEsIC8qKjwgQXMgaW4gUE9MTE9VVCAqLworICBEQlVTX1dBVENIX0VSUk9SICAgID0gMSA8PCAyLCAvKio8IEFzIGluIFBPTExFUlIgKGNhbid0IHdhdGNoIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRoaXMsIGJ1dCBjYW4gYmUgcHJlc2VudCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGN1cnJlbnQgc3RhdGUgcGFzc2VkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgZGJ1c193YXRjaF9oYW5kbGUoKSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBEQlVTX1dBVENIX0hBTkdVUCAgID0gMSA8PCAzICAvKio8IEFzIGluIFBPTExIVVAgKGNhbid0IHdhdGNoIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGl0LCBidXQgY2FuIGJlIHByZXNlbnQgaW4gY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHN0YXRlIHBhc3NlZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGRidXNfd2F0Y2hfaGFuZGxlKCkpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSW50ZXJuYWwgdG8gbGliZGJ1cywgdGhlcmUgaXMgYWxzbyBfREJVU19XQVRDSF9OVkFMIGluIGRidXMtd2F0Y2guaCAqLworfSBEQnVzV2F0Y2hGbGFnczsKKworLyoqCisgKiBJbmRpY2F0ZXMgdGhlIHN0YXR1cyBvZiBpbmNvbWluZyBkYXRhIG9uIGEgI0RCdXNDb25uZWN0aW9uLiBUaGlzIGRldGVybWluZXMgd2hldGhlcgorICogZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkgbmVlZHMgdG8gYmUgY2FsbGVkLgorICovCit0eXBlZGVmIGVudW0KK3sKKyAgREJVU19ESVNQQVRDSF9EQVRBX1JFTUFJTlMsICAvKio8IFRoZXJlIGlzIG1vcmUgZGF0YSB0byBwb3RlbnRpYWxseSBjb252ZXJ0IHRvIG1lc3NhZ2VzLiAqLworICBEQlVTX0RJU1BBVENIX0NPTVBMRVRFLCAgICAgIC8qKjwgQWxsIGN1cnJlbnRseSBhdmFpbGFibGUgZGF0YSBoYXMgYmVlbiBwcm9jZXNzZWQuICovCisgIERCVVNfRElTUEFUQ0hfTkVFRF9NRU1PUlkgICAgLyoqPCBNb3JlIG1lbW9yeSBpcyBuZWVkZWQgdG8gY29udGludWUuICovCit9IERCdXNEaXNwYXRjaFN0YXR1czsKKworLyoqIENhbGxlZCB3aGVuIGxpYmRidXMgbmVlZHMgYSBuZXcgd2F0Y2ggdG8gYmUgbW9uaXRvcmVkIGJ5IHRoZSBtYWluCisgKiBsb29wLiBSZXR1cm5zICNGQUxTRSBpZiBpdCBsYWNrcyBlbm91Z2ggbWVtb3J5IHRvIGFkZCB0aGUKKyAqIHdhdGNoLiBTZXQgYnkgZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMoKSBvcgorICogZGJ1c19zZXJ2ZXJfc2V0X3dhdGNoX2Z1bmN0aW9ucygpLgorICovCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNBZGRXYXRjaEZ1bmN0aW9uKSAgICAgICAoREJ1c1dhdGNoICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKTsKKy8qKiBDYWxsZWQgd2hlbiBkYnVzX3dhdGNoX2dldF9lbmFibGVkKCkgbWF5IHJldHVybiBhIGRpZmZlcmVudCB2YWx1ZQorICogIHRoYW4gaXQgZGlkIGJlZm9yZS4gIFNldCBieSBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dhdGNoX2Z1bmN0aW9ucygpCisgKiAgb3IgZGJ1c19zZXJ2ZXJfc2V0X3dhdGNoX2Z1bmN0aW9ucygpLgorICovCit0eXBlZGVmIHZvaWQgICAgICAgICgqIERCdXNXYXRjaFRvZ2dsZWRGdW5jdGlvbikgICAoREJ1c1dhdGNoICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKTsKKy8qKiBDYWxsZWQgd2hlbiBsaWJkYnVzIG5vIGxvbmdlciBuZWVkcyBhIHdhdGNoIHRvIGJlIG1vbml0b3JlZCBieSB0aGUKKyAqIG1haW4gbG9vcC4gU2V0IGJ5IGRidXNfY29ubmVjdGlvbl9zZXRfd2F0Y2hfZnVuY3Rpb25zKCkgb3IKKyAqIGRidXNfc2VydmVyX3NldF93YXRjaF9mdW5jdGlvbnMoKS4KKyAqLwordHlwZWRlZiB2b2lkICAgICAgICAoKiBEQnVzUmVtb3ZlV2F0Y2hGdW5jdGlvbikgICAgKERCdXNXYXRjaCAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSk7CisvKiogQ2FsbGVkIHdoZW4gbGliZGJ1cyBuZWVkcyBhIG5ldyB0aW1lb3V0IHRvIGJlIG1vbml0b3JlZCBieSB0aGUgbWFpbgorICogbG9vcC4gUmV0dXJucyAjRkFMU0UgaWYgaXQgbGFja3MgZW5vdWdoIG1lbW9yeSB0byBhZGQgdGhlCisgKiB3YXRjaC4gU2V0IGJ5IGRidXNfY29ubmVjdGlvbl9zZXRfdGltZW91dF9mdW5jdGlvbnMoKSBvcgorICogZGJ1c19zZXJ2ZXJfc2V0X3RpbWVvdXRfZnVuY3Rpb25zKCkuCisgKi8KK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogREJ1c0FkZFRpbWVvdXRGdW5jdGlvbikgICAgIChEQnVzVGltZW91dCAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSk7CisvKiogQ2FsbGVkIHdoZW4gZGJ1c190aW1lb3V0X2dldF9lbmFibGVkKCkgbWF5IHJldHVybiBhIGRpZmZlcmVudAorICogdmFsdWUgdGhhbiBpdCBkaWQgYmVmb3JlLgorICogU2V0IGJ5IGRidXNfY29ubmVjdGlvbl9zZXRfdGltZW91dF9mdW5jdGlvbnMoKSBvcgorICogZGJ1c19zZXJ2ZXJfc2V0X3RpbWVvdXRfZnVuY3Rpb25zKCkuCisgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c1RpbWVvdXRUb2dnbGVkRnVuY3Rpb24pIChEQnVzVGltZW91dCAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSk7CisvKiogQ2FsbGVkIHdoZW4gbGliZGJ1cyBubyBsb25nZXIgbmVlZHMgYSB0aW1lb3V0IHRvIGJlIG1vbml0b3JlZCBieSB0aGUKKyAqIG1haW4gbG9vcC4gU2V0IGJ5IGRidXNfY29ubmVjdGlvbl9zZXRfdGltZW91dF9mdW5jdGlvbnMoKSBvcgorICogZGJ1c19zZXJ2ZXJfc2V0X3RpbWVvdXRfZnVuY3Rpb25zKCkuCisgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c1JlbW92ZVRpbWVvdXRGdW5jdGlvbikgIChEQnVzVGltZW91dCAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSk7CisvKiogQ2FsbGVkIHdoZW4gdGhlIHJldHVybiB2YWx1ZSBvZiBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cygpCisgKiBtYXkgaGF2ZSBjaGFuZ2VkLiBTZXQgd2l0aCBkYnVzX2Nvbm5lY3Rpb25fc2V0X2Rpc3BhdGNoX3N0YXR1c19mdW5jdGlvbigpLgorICovCit0eXBlZGVmIHZvaWQgICAgICAgICgqIERCdXNEaXNwYXRjaFN0YXR1c0Z1bmN0aW9uKSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Rpc3BhdGNoU3RhdHVzIG5ld19zdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpOworLyoqCisgKiBDYWxsZWQgd2hlbiB0aGUgbWFpbiBsb29wJ3MgdGhyZWFkIHNob3VsZCBiZSBub3RpZmllZCB0aGF0IHRoZXJlJ3Mgbm93IHdvcmsKKyAqIHRvIGRvLiBTZXQgd2l0aCBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dha2V1cF9tYWluX2Z1bmN0aW9uKCkuCisgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c1dha2V1cE1haW5GdW5jdGlvbikgICAgICh2b2lkICAgICAgICAgICAqZGF0YSk7CisKKy8qKgorICogQ2FsbGVkIGR1cmluZyBhdXRoZW50aWNhdGlvbiB0byBjaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBVTklYIHVzZXIKKyAqIElEIGlzIGFsbG93ZWQgdG8gY29ubmVjdCwgaWYgdGhlIGNsaWVudCB0cmllZCB0byBhdXRoIGFzIGEgVU5JWAorICogdXNlciBJRC4gTm9ybWFsbHkgb24gV2luZG93cyB0aGlzIHdvdWxkIG5ldmVyIGhhcHBlbi4gU2V0IHdpdGgKKyAqIGRidXNfY29ubmVjdGlvbl9zZXRfdW5peF91c2VyX2Z1bmN0aW9uKCkuCisgKi8gCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNBbGxvd1VuaXhVc2VyRnVuY3Rpb24pICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSk7CisKKy8qKgorICogQ2FsbGVkIGR1cmluZyBhdXRoZW50aWNhdGlvbiB0byBjaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBXaW5kb3dzIHVzZXIKKyAqIElEIGlzIGFsbG93ZWQgdG8gY29ubmVjdCwgaWYgdGhlIGNsaWVudCB0cmllZCB0byBhdXRoIGFzIGEgV2luZG93cworICogdXNlciBJRC4gTm9ybWFsbHkgb24gVU5JWCB0aGlzIHdvdWxkIG5ldmVyIGhhcHBlbi4gU2V0IHdpdGgKKyAqIGRidXNfY29ubmVjdGlvbl9zZXRfd2luZG93c191c2VyX2Z1bmN0aW9uKCkuCisgKi8gCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNBbGxvd1dpbmRvd3NVc2VyRnVuY3Rpb24pICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnVzZXJfc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKTsKKworCisvKioKKyAqIENhbGxlZCB3aGVuIGEgcGVuZGluZyBjYWxsIG5vdyBoYXMgYSByZXBseSBhdmFpbGFibGUuIFNldCB3aXRoCisgKiBkYnVzX3BlbmRpbmdfY2FsbF9zZXRfbm90aWZ5KCkuCisgKi8KK3R5cGVkZWYgdm9pZCAoKiBEQnVzUGVuZGluZ0NhbGxOb3RpZnlGdW5jdGlvbikgKERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqdXNlcl9kYXRhKTsKKworLyoqCisgKiBDYWxsZWQgd2hlbiBhIG1lc3NhZ2UgbmVlZHMgdG8gYmUgaGFuZGxlZC4gVGhlIHJlc3VsdCBpbmRpY2F0ZXMgd2hldGhlciBvcgorICogbm90IG1vcmUgaGFuZGxlcnMgc2hvdWxkIGJlIHJ1bi4gU2V0IHdpdGggZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIoKS4KKyAqLwordHlwZWRlZiBEQnVzSGFuZGxlclJlc3VsdCAoKiBEQnVzSGFuZGxlTWVzc2FnZUZ1bmN0aW9uKSAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICp1c2VyX2RhdGEpOworREJVU19FWFBPUlQKK0RCdXNDb25uZWN0aW9uKiAgICBkYnVzX2Nvbm5lY3Rpb25fb3BlbiAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAgICAgICAgICAgICAgICAgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICplcnJvcik7CitEQlVTX0VYUE9SVAorREJ1c0Nvbm5lY3Rpb24qICAgIGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICAgICAgICAgICAgICAgICAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAgKmVycm9yKTsKK0RCVVNfRVhQT1JUCitEQnVzQ29ubmVjdGlvbiogICAgZGJ1c19jb25uZWN0aW9uX3JlZiAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgICAgZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgICAgZGJ1c19jb25uZWN0aW9uX2dldF9pc19hdXRoZW50aWNhdGVkICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgICAgZGJ1c19jb25uZWN0aW9uX2dldF9pc19hbm9ueW1vdXMgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCitjaGFyKiAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX2dldF9zZXJ2ZXJfaWQgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgICAgZGJ1c19jb25uZWN0aW9uX2Nhbl9zZW5kX3R5cGUgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSk7CisKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF9leGl0X29uX2Rpc2Nvbm5lY3QgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgICAgZXhpdF9vbl9kaXNjb25uZWN0KTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX2ZsdXNoICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgICAgZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGVfZGlzcGF0Y2ggICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZSAgICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcyk7CitEQlVTX0VYUE9SVAorREJ1c01lc3NhZ2UqICAgICAgIGRidXNfY29ubmVjdGlvbl9ib3Jyb3dfbWVzc2FnZSAgICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbik7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9yZXR1cm5fbWVzc2FnZSAgICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgICAgICAgKm1lc3NhZ2UpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fc3RlYWxfYm9ycm93ZWRfbWVzc2FnZSAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAgICAgICAgICptZXNzYWdlKTsKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSogICAgICAgZGJ1c19jb25uZWN0aW9uX3BvcF9tZXNzYWdlICAgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCitEQnVzRGlzcGF0Y2hTdGF0dXMgZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXMgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCitEQnVzRGlzcGF0Y2hTdGF0dXMgZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoICAgICAgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgICAgZGJ1c19jb25uZWN0aW9uX2hhc19tZXNzYWdlc190b19zZW5kICAgICAgICAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgICAgZGJ1c19jb25uZWN0aW9uX3NlbmQgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgICAgICAgICAgKmNsaWVudF9zZXJpYWwpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5ICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUGVuZGluZ0NhbGwgICAgICAgICAgICoqcGVuZGluZ19yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcyk7CitEQlVTX0VYUE9SVAorREJ1c01lc3NhZ2UgKiAgICAgIGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAgKmVycm9yKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQWRkV2F0Y2hGdW5jdGlvbiAgICAgICAgYWRkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUmVtb3ZlV2F0Y2hGdW5jdGlvbiAgICAgcmVtb3ZlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2hUb2dnbGVkRnVuY3Rpb24gICAgdG9nZ2xlZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3RpbWVvdXRfZnVuY3Rpb25zICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBZGRUaW1lb3V0RnVuY3Rpb24gICAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNSZW1vdmVUaW1lb3V0RnVuY3Rpb24gICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0VG9nZ2xlZEZ1bmN0aW9uICB0b2dnbGVkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbik7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfd2FrZXVwX21haW5fZnVuY3Rpb24gICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dha2V1cE1haW5GdW5jdGlvbiAgICAgIHdha2V1cF9tYWluX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbik7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfZGlzcGF0Y2hfc3RhdHVzX2Z1bmN0aW9uIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Rpc3BhdGNoU3RhdHVzRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbik7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgICAgIGRidXNfY29ubmVjdGlvbl9nZXRfdW5peF91c2VyICAgICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgKnVpZCk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgICAgIGRidXNfY29ubmVjdGlvbl9nZXRfdW5peF9wcm9jZXNzX2lkICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgKnBpZCk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgICAgIGRidXNfY29ubmVjdGlvbl9nZXRfYWR0X2F1ZGl0X3Nlc3Npb25fZGF0YSAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCAgICAgICAgICAgICAgICpkYXRhX3NpemUpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3VuaXhfdXNlcl9mdW5jdGlvbiAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBbGxvd1VuaXhVc2VyRnVuY3Rpb24gICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fZ2V0X3dpbmRvd3NfdXNlciAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgKip3aW5kb3dzX3NpZF9wKTsgCitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfd2luZG93c191c2VyX2Z1bmN0aW9uICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0FsbG93V2luZG93c1VzZXJGdW5jdGlvbiBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X2FsbG93X2Fub255bW91cyAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgICAgICB2YWx1ZSk7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfcm91dGVfcGVlcl9tZXNzYWdlcyAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgICAgIHZhbHVlKTsKKworCisvKiBGaWx0ZXJzICovCisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlciAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzSGFuZGxlTWVzc2FnZUZ1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX2ZpbHRlciAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzSGFuZGxlTWVzc2FnZUZ1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEpOworCisKKy8qIE90aGVyICovCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19jb25uZWN0aW9uX2FsbG9jYXRlX2RhdGFfc2xvdCAoZGJ1c19pbnQzMl90ICAgICAqc2xvdF9wKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fZnJlZV9kYXRhX3Nsb3QgICAgIChkYnVzX2ludDMyX3QgICAgICpzbG90X3ApOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfY29ubmVjdGlvbl9zZXRfZGF0YSAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gIGZyZWVfZGF0YV9mdW5jKTsKK0RCVVNfRVhQT1JUCit2b2lkKiAgICAgICBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2RhdGEgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICAgc2xvdCk7CisKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X2NoYW5nZV9zaWdwaXBlIChkYnVzX2Jvb2xfdCAgICAgICB3aWxsX21vZGlmeV9zaWdwaXBlKTsgCisKK0RCVVNfRVhQT1JUCit2b2lkIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X21lc3NhZ2Vfc2l6ZSAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgc2l6ZSk7CitEQlVTX0VYUE9SVAorbG9uZyBkYnVzX2Nvbm5lY3Rpb25fZ2V0X21heF9tZXNzYWdlX3NpemUgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitEQlVTX0VYUE9SVAordm9pZCBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9yZWNlaXZlZF9zaXplIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgIHNpemUpOworREJVU19FWFBPUlQKK2xvbmcgZGJ1c19jb25uZWN0aW9uX2dldF9tYXhfcmVjZWl2ZWRfc2l6ZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCitEQlVTX0VYUE9SVAordm9pZCBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9tZXNzYWdlX3VuaXhfZmRzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgIG4pOworREJVU19FWFBPUlQKK2xvbmcgZGJ1c19jb25uZWN0aW9uX2dldF9tYXhfbWVzc2FnZV91bml4X2ZkcyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK3ZvaWQgZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfcmVjZWl2ZWRfdW5peF9mZHMoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICBuKTsKK0RCVVNfRVhQT1JUCitsb25nIGRidXNfY29ubmVjdGlvbl9nZXRfbWF4X3JlY2VpdmVkX3VuaXhfZmRzKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKKworREJVU19FWFBPUlQKK2xvbmcgZGJ1c19jb25uZWN0aW9uX2dldF9vdXRnb2luZ19zaXplICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK2xvbmcgZGJ1c19jb25uZWN0aW9uX2dldF9vdXRnb2luZ191bml4X2ZkcyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCitEQlVTX0VYUE9SVAorREJ1c1ByZWFsbG9jYXRlZFNlbmQqIGRidXNfY29ubmVjdGlvbl9wcmVhbGxvY2F0ZV9zZW5kICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAqY29ubmVjdGlvbik7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9mcmVlX3ByZWFsbG9jYXRlZF9zZW5kIChEQnVzQ29ubmVjdGlvbiAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ByZWFsbG9jYXRlZFNlbmQgKnByZWFsbG9jYXRlZCk7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9zZW5kX3ByZWFsbG9jYXRlZCAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ByZWFsbG9jYXRlZFNlbmQgKnByZWFsbG9jYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgICAgICpjbGllbnRfc2VyaWFsKTsKKworCisvKiBPYmplY3QgdHJlZSBmdW5jdGlvbmFsaXR5ICovCisKKy8qKgorICogQ2FsbGVkIHdoZW4gYSAjREJ1c09iamVjdFBhdGhWVGFibGUgaXMgdW5yZWdpc3RlcmVkIChvciBpdHMgY29ubmVjdGlvbiBpcyBmcmVlZCkuCisgKiBGb3VuZCBpbiAjREJ1c09iamVjdFBhdGhWVGFibGUuCisgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgICAgICAgKCogREJ1c09iamVjdFBhdGhVbnJlZ2lzdGVyRnVuY3Rpb24pIChEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICp1c2VyX2RhdGEpOworLyoqCisgKiBDYWxsZWQgd2hlbiBhIG1lc3NhZ2UgaXMgc2VudCB0byBhIHJlZ2lzdGVyZWQgb2JqZWN0IHBhdGguIEZvdW5kIGluCisgKiAjREJ1c09iamVjdFBhdGhWVGFibGUgd2hpY2ggaXMgcmVnaXN0ZXJlZCB3aXRoIGRidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9vYmplY3RfcGF0aCgpCisgKiBvciBkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfZmFsbGJhY2soKS4KKyAqLwordHlwZWRlZiBEQnVzSGFuZGxlclJlc3VsdCAoKiBEQnVzT2JqZWN0UGF0aE1lc3NhZ2VGdW5jdGlvbikgICAgKERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICp1c2VyX2RhdGEpOworCisvKioKKyAqIFZpcnR1YWwgdGFibGUgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGhhbmRsZSBhIHBvcnRpb24gb2YgdGhlCisgKiBvYmplY3QgcGF0aCBoaWVyYXJjaHkuIEF0dGFjaCB0aGUgdnRhYmxlIHRvIGEgcGFydGljdWxhciBwYXRoIHVzaW5nCisgKiBkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfb2JqZWN0X3BhdGgoKSBvcgorICogZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX2ZhbGxiYWNrKCkuCisgKi8KK3N0cnVjdCBEQnVzT2JqZWN0UGF0aFZUYWJsZQoreworICBEQnVzT2JqZWN0UGF0aFVucmVnaXN0ZXJGdW5jdGlvbiAgIHVucmVnaXN0ZXJfZnVuY3Rpb247IC8qKjwgRnVuY3Rpb24gdG8gdW5yZWdpc3RlciB0aGlzIGhhbmRsZXIgKi8KKyAgREJ1c09iamVjdFBhdGhNZXNzYWdlRnVuY3Rpb24gICAgICBtZXNzYWdlX2Z1bmN0aW9uOyAvKio8IEZ1bmN0aW9uIHRvIGhhbmRsZSBtZXNzYWdlcyAqLworICAKKyAgdm9pZCAoKiBkYnVzX2ludGVybmFsX3BhZDEpICh2b2lkICopOyAvKio8IFJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCisgIHZvaWQgKCogZGJ1c19pbnRlcm5hbF9wYWQyKSAodm9pZCAqKTsgLyoqPCBSZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworICB2b2lkICgqIGRidXNfaW50ZXJuYWxfcGFkMykgKHZvaWQgKik7IC8qKjwgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKyAgdm9pZCAoKiBkYnVzX2ludGVybmFsX3BhZDQpICh2b2lkICopOyAvKio8IFJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCit9OworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19jb25uZWN0aW9uX3RyeV9yZWdpc3Rlcl9vYmplY3RfcGF0aCAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c09iamVjdFBhdGhWVGFibGUgICp2dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICAqZXJyb3IpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX29iamVjdF9wYXRoICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c09iamVjdFBhdGhWVGFibGUgICp2dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19jb25uZWN0aW9uX3RyeV9yZWdpc3Rlcl9mYWxsYmFjayAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c09iamVjdFBhdGhWVGFibGUgICp2dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICAqZXJyb3IpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX2ZhbGxiYWNrICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c09iamVjdFBhdGhWVGFibGUgICp2dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfY29ubmVjdGlvbl91bnJlZ2lzdGVyX29iamVjdF9wYXRoIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICpwYXRoKTsKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfY29ubmVjdGlvbl9nZXRfb2JqZWN0X3BhdGhfZGF0YSAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICoqZGF0YV9wKTsKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfY29ubmVjdGlvbl9saXN0X3JlZ2lzdGVyZWQgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICpwYXJlbnRfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICoqKmNoaWxkX2VudHJpZXMpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19jb25uZWN0aW9uX2dldF91bml4X2ZkICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgKmZkKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX2Nvbm5lY3Rpb25fZ2V0X3NvY2tldCAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAqZmQpOworCisvKiogQH0gKi8KKworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNXYXRjaAorICogQHsKKyAqLworCisjaWZuZGVmIERCVVNfRElTQUJMRV9ERVBSRUNBVEVECitEQlVTX0VYUE9SVAorREJVU19ERVBSRUNBVEVEIGludCBkYnVzX3dhdGNoX2dldF9mZCAgICAgIChEQnVzV2F0Y2ggICAgICAgICp3YXRjaCk7CisjZW5kaWYKKworREJVU19FWFBPUlQKK2ludCAgICAgICAgICBkYnVzX3dhdGNoX2dldF91bml4X2ZkIChEQnVzV2F0Y2ggICAgICAgICp3YXRjaCk7CitEQlVTX0VYUE9SVAoraW50ICAgICAgICAgIGRidXNfd2F0Y2hfZ2V0X3NvY2tldCAgKERCdXNXYXRjaCAgICAgICAgKndhdGNoKTsKK0RCVVNfRVhQT1JUCit1bnNpZ25lZCBpbnQgZGJ1c193YXRjaF9nZXRfZmxhZ3MgICAoREJ1c1dhdGNoICAgICAgICAqd2F0Y2gpOworREJVU19FWFBPUlQKK3ZvaWQqICAgICAgICBkYnVzX3dhdGNoX2dldF9kYXRhICAgIChEQnVzV2F0Y2ggICAgICAgICp3YXRjaCk7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgIGRidXNfd2F0Y2hfc2V0X2RhdGEgICAgKERCdXNXYXRjaCAgICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgZGJ1c193YXRjaF9oYW5kbGUgICAgICAoREJ1c1dhdGNoICAgICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgZmxhZ3MpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICBkYnVzX3dhdGNoX2dldF9lbmFibGVkIChEQnVzV2F0Y2ggICAgICAgICp3YXRjaCk7CisKKy8qKiBAfSAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNUaW1lb3V0CisgKiBAeworICovCisKK0RCVVNfRVhQT1JUCitpbnQgICAgICAgICBkYnVzX3RpbWVvdXRfZ2V0X2ludGVydmFsIChEQnVzVGltZW91dCAgICAgICp0aW1lb3V0KTsKK0RCVVNfRVhQT1JUCit2b2lkKiAgICAgICBkYnVzX3RpbWVvdXRfZ2V0X2RhdGEgICAgIChEQnVzVGltZW91dCAgICAgICp0aW1lb3V0KTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX3RpbWVvdXRfc2V0X2RhdGEgICAgIChEQnVzVGltZW91dCAgICAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gIGZyZWVfZGF0YV9mdW5jdGlvbik7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c190aW1lb3V0X2hhbmRsZSAgICAgICAoREJ1c1RpbWVvdXQgICAgICAqdGltZW91dCk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c190aW1lb3V0X2dldF9lbmFibGVkICAoREJ1c1RpbWVvdXQgICAgICAqdGltZW91dCk7CisKKy8qKiBAfSAqLworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19DT05ORUNUSU9OX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLWNyZWRlbnRpYWxzLXV0aWwuYyBiL2RidXMvZGJ1cy9kYnVzLWNyZWRlbnRpYWxzLXV0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjc3MTk2Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtY3JlZGVudGlhbHMtdXRpbC5jCkBAIC0wLDAgKzEsMjA2IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtY3JlZGVudGlhbHMtdXRpbC5jIFdvdWxkIGJlIGluIGRidXMtY3JlZGVudGlhbHMuYywgYnV0IG9ubHkgdXNlZCBmb3IgdGVzdHMvYnVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKyNpbmNsdWRlICJkYnVzLWNyZWRlbnRpYWxzLmgiCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0NyZWRlbnRpYWxzCisgKiBAeworICovCisKKy8qKiBAfSAqLworCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0YXRpYyBEQnVzQ3JlZGVudGlhbHMqCittYWtlX2NyZWRlbnRpYWxzKGRidXNfdWlkX3QgIHVuaXhfdWlkLAorICAgICAgICAgICAgICAgICBkYnVzX3BpZF90ICB1bml4X3BpZCwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqd2luZG93c19zaWQpCit7CisgIERCdXNDcmVkZW50aWFscyAqY3JlZGVudGlhbHM7CisKKyAgY3JlZGVudGlhbHMgPSBfZGJ1c19jcmVkZW50aWFsc19uZXcgKCk7CisKKyAgaWYgKHVuaXhfdWlkICE9IERCVVNfVUlEX1VOU0VUKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX3VuaXhfdWlkIChjcmVkZW50aWFscywgdW5peF91aWQpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRlbnRpYWxzKTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAodW5peF9waWQgIT0gREJVU19QSURfVU5TRVQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfdW5peF9waWQgKGNyZWRlbnRpYWxzLCB1bml4X3BpZCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZGVudGlhbHMpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgIGlmICh3aW5kb3dzX3NpZCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX3dpbmRvd3Nfc2lkIChjcmVkZW50aWFscywgd2luZG93c19zaWQpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRlbnRpYWxzKTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gY3JlZGVudGlhbHM7Cit9CisKKyNkZWZpbmUgU0FNUExFX1NJRCAid2hhdGV2ZXIgYSB3aW5kb3dzIHNpZCBsb29rcyBsaWtlIgorI2RlZmluZSBPVEhFUl9TQU1QTEVfU0lEICJ3aGF0ZXZlciBlbHNlIgorCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlZGVudGlhbHNfdGVzdCAoY29uc3QgY2hhciAqdGVzdF9kYXRhX2RpcikKK3sKKyAgREJ1c0NyZWRlbnRpYWxzICpjcmVkczsKKyAgREJ1c0NyZWRlbnRpYWxzICpjcmVkczI7CisgIAorICBpZiAodGVzdF9kYXRhX2RpciA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGNyZWRzID0gbWFrZV9jcmVkZW50aWFscyAoMTIsIDUxMSwgU0FNUExFX1NJRCk7CisgIGlmIChjcmVkcyA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIC8qIHRlc3QgcmVmY291bnRpbmcgKi8KKyAgX2RidXNfY3JlZGVudGlhbHNfcmVmIChjcmVkcyk7CisgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkcyk7CisgIAorICBfZGJ1c19hc3NlcnQgKF9kYnVzX2NyZWRlbnRpYWxzX2luY2x1ZGUgKGNyZWRzLCBEQlVTX0NSRURFTlRJQUxfVU5JWF9VU0VSX0lEKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfaW5jbHVkZSAoY3JlZHMsIERCVVNfQ1JFREVOVElBTF9VTklYX1BST0NFU1NfSUQpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlIChjcmVkcywgREJVU19DUkVERU5USUFMX1dJTkRPV1NfU0lEKSk7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19nZXRfdW5peF91aWQgKGNyZWRzKSA9PSAxMik7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfZ2V0X3VuaXhfcGlkIChjcmVkcykgPT0gNTExKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKF9kYnVzX2NyZWRlbnRpYWxzX2dldF93aW5kb3dzX3NpZCAoY3JlZHMpLCBTQU1QTEVfU0lEKSA9PSAwKTsKKworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19jcmVkZW50aWFsc19hcmVfZW1wdHkgKGNyZWRzKSk7CisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2NyZWRlbnRpYWxzX2FyZV9hbm9ueW1vdXMgKGNyZWRzKSk7CisKKyAgLyogVGVzdCBjb3B5ICovCisgIGNyZWRzMiA9IF9kYnVzX2NyZWRlbnRpYWxzX2NvcHkgKGNyZWRzKTsKKyAgaWYgKGNyZWRzMiA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfaW5jbHVkZSAoY3JlZHMyLCBEQlVTX0NSRURFTlRJQUxfVU5JWF9VU0VSX0lEKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfaW5jbHVkZSAoY3JlZHMyLCBEQlVTX0NSRURFTlRJQUxfVU5JWF9QUk9DRVNTX0lEKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfaW5jbHVkZSAoY3JlZHMyLCBEQlVTX0NSRURFTlRJQUxfV0lORE9XU19TSUQpKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2NyZWRlbnRpYWxzX2dldF91bml4X3VpZCAoY3JlZHMyKSA9PSAxMik7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfZ2V0X3VuaXhfcGlkIChjcmVkczIpID09IDUxMSk7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChfZGJ1c19jcmVkZW50aWFsc19nZXRfd2luZG93c19zaWQgKGNyZWRzMiksIFNBTVBMRV9TSUQpID09IDApOyAgCisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19hcmVfc3VwZXJzZXQgKGNyZWRzLCBjcmVkczIpKTsKKyAgCisgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkczIpOworICAKKyAgLyogU2FtZSB1c2VyIGlmIGJvdGggdW5peCBhbmQgd2luZG93cyBhcmUgdGhlIHNhbWUgKi8KKyAgY3JlZHMyID0gbWFrZV9jcmVkZW50aWFscyAoMTIsIERCVVNfUElEX1VOU0VULCBTQU1QTEVfU0lEKTsKKyAgaWYgKGNyZWRzMiA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfc2FtZV91c2VyIChjcmVkcywgY3JlZHMyKSk7CisKKyAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRzMik7CisKKyAgLyogTm90IHRoZSBzYW1lIHVzZXIgaWYgV2luZG93cyBpcyBtaXNzaW5nICovCisgIGNyZWRzMiA9IG1ha2VfY3JlZGVudGlhbHMgKDEyLCBEQlVTX1BJRF9VTlNFVCwgTlVMTCk7CisgIGlmIChjcmVkczIgPT0gTlVMTCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19jcmVkZW50aWFsc19zYW1lX3VzZXIgKGNyZWRzLCBjcmVkczIpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19hcmVfc3VwZXJzZXQgKGNyZWRzLCBjcmVkczIpKTsKKyAgCisgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkczIpOworCisgIC8qIE5vdCB0aGUgc2FtZSB1c2VyIGlmIFdpbmRvd3MgaXMgZGlmZmVyZW50ICovCisgIGNyZWRzMiA9IG1ha2VfY3JlZGVudGlhbHMgKDEyLCBEQlVTX1BJRF9VTlNFVCwgT1RIRVJfU0FNUExFX1NJRCk7CisgIGlmIChjcmVkczIgPT0gTlVMTCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19jcmVkZW50aWFsc19zYW1lX3VzZXIgKGNyZWRzLCBjcmVkczIpKTsKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfY3JlZGVudGlhbHNfYXJlX3N1cGVyc2V0IChjcmVkcywgY3JlZHMyKSk7CisgIAorICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZHMyKTsKKworICAvKiBOb3QgdGhlIHNhbWUgdXNlciBpZiBVbml4IGlzIG1pc3NpbmcgKi8KKyAgY3JlZHMyID0gbWFrZV9jcmVkZW50aWFscyAoREJVU19VSURfVU5TRVQsIERCVVNfUElEX1VOU0VULCBTQU1QTEVfU0lEKTsKKyAgaWYgKGNyZWRzMiA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2NyZWRlbnRpYWxzX3NhbWVfdXNlciAoY3JlZHMsIGNyZWRzMikpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2NyZWRlbnRpYWxzX2FyZV9zdXBlcnNldCAoY3JlZHMsIGNyZWRzMikpOworICAKKyAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRzMik7CisKKyAgLyogTm90IHRoZSBzYW1lIHVzZXIgaWYgVW5peCBpcyBkaWZmZXJlbnQgKi8KKyAgY3JlZHMyID0gbWFrZV9jcmVkZW50aWFscyAoMTUsIERCVVNfUElEX1VOU0VULCBTQU1QTEVfU0lEKTsKKyAgaWYgKGNyZWRzMiA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2NyZWRlbnRpYWxzX3NhbWVfdXNlciAoY3JlZHMsIGNyZWRzMikpOworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19jcmVkZW50aWFsc19hcmVfc3VwZXJzZXQgKGNyZWRzLCBjcmVkczIpKTsKKyAgCisgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkczIpOworCisgIC8qIE5vdCB0aGUgc2FtZSB1c2VyIGlmIGJvdGggYXJlIG1pc3NpbmcgKi8KKyAgY3JlZHMyID0gbWFrZV9jcmVkZW50aWFscyAoREJVU19VSURfVU5TRVQsIERCVVNfUElEX1VOU0VULCBOVUxMKTsKKyAgaWYgKGNyZWRzMiA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2NyZWRlbnRpYWxzX3NhbWVfdXNlciAoY3JlZHMsIGNyZWRzMikpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2NyZWRlbnRpYWxzX2FyZV9zdXBlcnNldCAoY3JlZHMsIGNyZWRzMikpOworICAKKyAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRzMik7CisKKyAgLyogQ2xlYXJpbmcgY3JlZGVudGlhbHMgd29ya3MgKi8KKyAgX2RidXNfY3JlZGVudGlhbHNfY2xlYXIgKGNyZWRzKTsKKworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlIChjcmVkcywgREJVU19DUkVERU5USUFMX1VOSVhfVVNFUl9JRCkpOworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlIChjcmVkcywgREJVU19DUkVERU5USUFMX1VOSVhfUFJPQ0VTU19JRCkpOworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlIChjcmVkcywgREJVU19DUkVERU5USUFMX1dJTkRPV1NfU0lEKSk7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19nZXRfdW5peF91aWQgKGNyZWRzKSA9PSBEQlVTX1VJRF9VTlNFVCk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfZ2V0X3VuaXhfcGlkIChjcmVkcykgPT0gREJVU19QSURfVU5TRVQpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2NyZWRlbnRpYWxzX2dldF93aW5kb3dzX3NpZCAoY3JlZHMpID09IE5VTEwpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfYXJlX2VtcHR5IChjcmVkcykpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2NyZWRlbnRpYWxzX2FyZV9hbm9ueW1vdXMgKGNyZWRzKSk7CisKKyAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRzKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtY3JlZGVudGlhbHMuYyBiL2RidXMvZGJ1cy9kYnVzLWNyZWRlbnRpYWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY2OWYzYgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLWNyZWRlbnRpYWxzLmMKQEAgLTAsMCArMSw1NTAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1jcmVkZW50aWFscy5jIENyZWRlbnRpYWxzIHByb3ZhYmxlIHRocm91Z2ggYXV0aGVudGljYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZGJ1cy1jcmVkZW50aWFscy5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNDcmVkZW50aWFscyBDcmVkZW50aWFscyBwcm92YWJsZSB0aHJvdWdoIGF1dGhlbnRpY2F0aW9uCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNDcmVkZW50aWFscyBvYmplY3QKKyAqCisgKiBDcmVkZW50aWFscyBhcmUgd2hhdCB5b3UgaGF2ZSB0byBwcm92ZSB5b3UgaGF2ZSBpbiBvcmRlciB0bworICogYXV0aGVudGljYXRlLiAgVGhlIG1haW4gY3JlZGVudGlhbHMgcmlnaHQgbm93IGFyZSBhIHVuaXggdXNlcgorICogYWNjb3VudCwgYSBXaW5kb3dzIHVzZXIgYWNjb3VudCwgb3IgYSBVTklYIHByb2Nlc3MgSUQuCisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0NyZWRlbnRpYWxzSW50ZXJuYWxzIENyZWRlbnRpYWxzIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgREJ1c0NyZWRlbnRpYWxzIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqCisgKiBQcml2YXRlIGRldGFpbHMgb2YgY3JlZGVudGlhbHMgY29kZS4KKyAqCisgKiBAeworICovCisKK3N0cnVjdCBEQnVzQ3JlZGVudGlhbHMgeworICBpbnQgcmVmY291bnQ7CisgIGRidXNfdWlkX3QgdW5peF91aWQ7CisgIGRidXNfcGlkX3QgdW5peF9waWQ7CisgIGNoYXIgKndpbmRvd3Nfc2lkOworICB2b2lkICphZHRfYXVkaXRfZGF0YTsKKyAgZGJ1c19pbnQzMl90IGFkdF9hdWRpdF9kYXRhX3NpemU7Cit9OworCisvKiogQH0gKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzQ3JlZGVudGlhbHMKKyAqIEB7CisgKi8KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IGNyZWRlbnRpYWxzIG9iamVjdC4KKyAqCisgKiBAcmV0dXJucyB0aGUgbmV3IG9iamVjdCBvciAjTlVMTCBpZiBubyBtZW1vcnkKKyAqLworREJ1c0NyZWRlbnRpYWxzKgorX2RidXNfY3JlZGVudGlhbHNfbmV3ICh2b2lkKQoreworICBEQnVzQ3JlZGVudGlhbHMgKmNyZWRzOworCisgIGNyZWRzID0gZGJ1c19uZXcgKERCdXNDcmVkZW50aWFscywgMSk7CisgIGlmIChjcmVkcyA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICAKKyAgY3JlZHMtPnJlZmNvdW50ID0gMTsKKyAgY3JlZHMtPnVuaXhfdWlkID0gREJVU19VSURfVU5TRVQ7CisgIGNyZWRzLT51bml4X3BpZCA9IERCVVNfUElEX1VOU0VUOworICBjcmVkcy0+d2luZG93c19zaWQgPSBOVUxMOworICBjcmVkcy0+YWR0X2F1ZGl0X2RhdGEgPSBOVUxMOworICBjcmVkcy0+YWR0X2F1ZGl0X2RhdGFfc2l6ZSA9IDA7CisKKyAgcmV0dXJuIGNyZWRzOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHdpdGggY3JlZGVudGlhbHMgKHVzZXIgSUQgYW5kIHByb2Nlc3MgSUQpIGZyb20gdGhlIGN1cnJlbnQgcHJvY2Vzcy4KKyAqIEByZXR1cm5zIHRoZSBuZXcgb2JqZWN0IG9yICNOVUxMIGlmIG5vIG1lbW9yeQorICovCitEQnVzQ3JlZGVudGlhbHMqCitfZGJ1c19jcmVkZW50aWFsc19uZXdfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKHZvaWQpCit7CisgIERCdXNDcmVkZW50aWFscyAqY3JlZHM7CisKKyAgY3JlZHMgPSBfZGJ1c19jcmVkZW50aWFsc19uZXcgKCk7CisgIGlmIChjcmVkcyA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX2Zyb21fY3VycmVudF9wcm9jZXNzIChjcmVkcykpCisgICAgeworICAgICAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRzKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgCisgIHJldHVybiBjcmVkczsKK30KKworLyoqCisgKiBJbmNyZW1lbnQgcmVmY291bnQgb24gY3JlZGVudGlhbHMuCisgKgorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBvYmplY3QKKyAqLwordm9pZAorX2RidXNfY3JlZGVudGlhbHNfcmVmIChEQnVzQ3JlZGVudGlhbHMgKmNyZWRlbnRpYWxzKQoreworICBfZGJ1c19hc3NlcnQgKGNyZWRlbnRpYWxzLT5yZWZjb3VudCA+IDApOworICBjcmVkZW50aWFscy0+cmVmY291bnQgKz0gMTsKK30KKworLyoqCisgKiBEZWNyZW1lbnQgcmVmY291bnQgb24gY3JlZGVudGlhbHMuCisgKgorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBvYmplY3QKKyAqLwordm9pZAorX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMpCit7CisgIF9kYnVzX2Fzc2VydCAoY3JlZGVudGlhbHMtPnJlZmNvdW50ID4gMCk7CisKKyAgY3JlZGVudGlhbHMtPnJlZmNvdW50IC09IDE7CisgIGlmIChjcmVkZW50aWFscy0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKGNyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCk7CisgICAgICBkYnVzX2ZyZWUgKGNyZWRlbnRpYWxzLT5hZHRfYXVkaXRfZGF0YSk7CisgICAgICBkYnVzX2ZyZWUgKGNyZWRlbnRpYWxzKTsKKyAgICB9Cit9CisKKy8qKgorICogQWRkIGEgVU5JWCBwcm9jZXNzIElEIHRvIHRoZSBjcmVkZW50aWFscy4KKyAqCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICogQHBhcmFtIHBpZCB0aGUgcHJvY2VzcyBJRAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlZGVudGlhbHNfYWRkX3VuaXhfcGlkIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3BpZF90ICAgICAgICAgIHBpZCkKK3sKKyAgY3JlZGVudGlhbHMtPnVuaXhfcGlkID0gcGlkOworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBBZGQgYSBVTklYIHVzZXIgSUQgdG8gdGhlIGNyZWRlbnRpYWxzLgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcGFyYW0gdWlkIHRoZSB1c2VyIElECisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc19hZGRfdW5peF91aWQoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICAgIHVpZCkKK3sKKyAgY3JlZGVudGlhbHMtPnVuaXhfdWlkID0gdWlkOworICByZXR1cm4gVFJVRTsKKworfQorCisvKioKKyAqIEFkZCBhIFdpbmRvd3MgdXNlciBTSUQgdG8gdGhlIGNyZWRlbnRpYWxzLgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcGFyYW0gd2luZG93c19zaWQgdGhlIHVzZXIgU0lECisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc19hZGRfd2luZG93c19zaWQgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAqd2luZG93c19zaWQpCit7CisgIGNoYXIgKmNvcHk7CisKKyAgY29weSA9IF9kYnVzX3N0cmR1cCAod2luZG93c19zaWQpOworICBpZiAoY29weSA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBkYnVzX2ZyZWUgKGNyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCk7CisgIGNyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCA9IGNvcHk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQWRkIEFEVCBhdWRpdCBkYXRhIHRvIHRoZSBjcmVkZW50aWFscy4KKyAqCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICogQHBhcmFtIGF1ZGl0X2RhdGEgdGhlIGF1ZGl0IGRhdGEKKyAqIEBwYXJhbSBzaXplIHRoZSBsZW5ndGggb2YgYXVkaXQgZGF0YQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlZGVudGlhbHNfYWRkX2FkdF9hdWRpdF9kYXRhIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKmF1ZGl0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCAgICAgICAgc2l6ZSkKK3sKKyAgdm9pZCAqY29weTsKKyAgY29weSA9IF9kYnVzX21lbWR1cCAoYXVkaXRfZGF0YSwgc2l6ZSk7CisgIGlmIChjb3B5ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGRidXNfZnJlZSAoY3JlZGVudGlhbHMtPmFkdF9hdWRpdF9kYXRhKTsKKyAgY3JlZGVudGlhbHMtPmFkdF9hdWRpdF9kYXRhID0gY29weTsKKyAgY3JlZGVudGlhbHMtPmFkdF9hdWRpdF9kYXRhX3NpemUgPSBzaXplOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBjcmVkZW50aWFsIGlzIHByZXNlbnQuCisgKgorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBvYmplY3QKKyAqIEBwYXJhbSB0eXBlIHRoZSBjcmVkZW50aWFsIHRvIGNoZWNrIGZvcgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGNyZWRlbnRpYWwgaXMgcHJlc2VudAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlZGVudGlhbHNfaW5jbHVkZSAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFsVHlwZSAgdHlwZSkKK3sKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIERCVVNfQ1JFREVOVElBTF9VTklYX1BST0NFU1NfSUQ6CisgICAgICByZXR1cm4gY3JlZGVudGlhbHMtPnVuaXhfcGlkICE9IERCVVNfUElEX1VOU0VUOworICAgIGNhc2UgREJVU19DUkVERU5USUFMX1VOSVhfVVNFUl9JRDoKKyAgICAgIHJldHVybiBjcmVkZW50aWFscy0+dW5peF91aWQgIT0gREJVU19VSURfVU5TRVQ7CisgICAgY2FzZSBEQlVTX0NSRURFTlRJQUxfV0lORE9XU19TSUQ6CisgICAgICByZXR1cm4gY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkICE9IE5VTEw7CisgICAgY2FzZSBEQlVTX0NSRURFTlRJQUxfQURUX0FVRElUX0RBVEFfSUQ6CisgICAgICByZXR1cm4gY3JlZGVudGlhbHMtPmFkdF9hdWRpdF9kYXRhICE9IE5VTEw7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlVua25vd24gY3JlZGVudGlhbCBlbnVtIHZhbHVlIik7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBVTklYIHByb2Nlc3MgSUQgaW4gdGhlIGNyZWRlbnRpYWxzLCBvciAjREJVU19QSURfVU5TRVQgaWYKKyAqIHRoZSBjcmVkZW50aWFscyBvYmplY3QgZG9lc24ndCBjb250YWluIGEgcHJvY2VzcyBJRC4KKyAqCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICogQHJldHVybnMgVU5JWCBwcm9jZXNzIElECisgKi8KK2RidXNfcGlkX3QKK19kYnVzX2NyZWRlbnRpYWxzX2dldF91bml4X3BpZCAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscykKK3sKKyAgcmV0dXJuIGNyZWRlbnRpYWxzLT51bml4X3BpZDsKK30KKworLyoqCisgKiBHZXRzIHRoZSBVTklYIHVzZXIgSUQgaW4gdGhlIGNyZWRlbnRpYWxzLCBvciAjREJVU19VSURfVU5TRVQgaWYKKyAqIHRoZSBjcmVkZW50aWFscyBvYmplY3QgZG9lc24ndCBjb250YWluIGEgdXNlciBJRC4KKyAqCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICogQHJldHVybnMgVU5JWCB1c2VyIElECisgKi8KK2RidXNfdWlkX3QKK19kYnVzX2NyZWRlbnRpYWxzX2dldF91bml4X3VpZCAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscykKK3sKKyAgcmV0dXJuIGNyZWRlbnRpYWxzLT51bml4X3VpZDsKK30KKworLyoqCisgKiBHZXRzIHRoZSBXaW5kb3dzIHVzZXIgU0lEIGluIHRoZSBjcmVkZW50aWFscywgb3IgI05VTEwgaWYKKyAqIHRoZSBjcmVkZW50aWFscyBvYmplY3QgZG9lc24ndCBjb250YWluIGEgV2luZG93cyB1c2VyIFNJRC4KKyAqCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICogQHJldHVybnMgV2luZG93cyB1c2VyIFNJRAorICovCitjb25zdCBjaGFyKgorX2RidXNfY3JlZGVudGlhbHNfZ2V0X3dpbmRvd3Nfc2lkIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKQoreworICByZXR1cm4gY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkOworfQorCisvKioKKyAqIEdldHMgdGhlIEFEVCBhdWRpdCBkYXRhIGluIHRoZSBjcmVkZW50aWFscywgb3IgI05VTEwgaWYKKyAqIHRoZSBjcmVkZW50aWFscyBvYmplY3QgZG9lc24ndCBjb250YWluIEFEVCBhdWRpdCBkYXRhLgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcmV0dXJucyBTb2xhcmlzIEFEVCBhdWRpdCBkYXRhIAorICovCit2b2lkICoKK19kYnVzX2NyZWRlbnRpYWxzX2dldF9hZHRfYXVkaXRfZGF0YSAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscykKK3sKKyAgcmV0dXJuIGNyZWRlbnRpYWxzLT5hZHRfYXVkaXRfZGF0YTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBBRFQgYXVkaXQgZGF0YSBzaXplIGluIHRoZSBjcmVkZW50aWFscywgb3IgMCBpZgorICogdGhlIGNyZWRlbnRpYWxzIG9iamVjdCBkb2Vzbid0IGNvbnRhaW4gQURUIGF1ZGl0IGRhdGEuCisgKgorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBvYmplY3QKKyAqIEByZXR1cm5zIFNvbGFyaXMgQURUIGF1ZGl0IGRhdGEgc2l6ZQorICovCitkYnVzX2ludDMyX3QgCitfZGJ1c19jcmVkZW50aWFsc19nZXRfYWR0X2F1ZGl0X2RhdGFfc2l6ZSAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscykKK3sKKyAgcmV0dXJuIGNyZWRlbnRpYWxzLT5hZHRfYXVkaXRfZGF0YV9zaXplOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBmaXJzdCBjcmVkZW50aWFscyBvYmplY3QgY29udGFpbnMKKyAqIGFsbCB0aGUgY3JlZGVudGlhbHMgZm91bmQgaW4gdGhlIHNlY29uZCBjcmVkZW50aWFscyBvYmplY3QuCisgKgorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBvYmplY3QKKyAqIEBwYXJhbSBwb3NzaWJsZV9zdWJzZXQgc2VlIGlmIGNyZWRlbnRpYWxzIGluIGhlcmUgYXJlIGFsc28gaW4gdGhlIGZpcnN0IGFyZworICogQHJldHVybnMgI1RSVUUgaWYgc2Vjb25kIGFyZyBpcyBjb250YWluZWQgaW4gZmlyc3QKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NyZWRlbnRpYWxzX2FyZV9zdXBlcnNldCAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICAgICpwb3NzaWJsZV9zdWJzZXQpCit7CisgIHJldHVybgorICAgIChwb3NzaWJsZV9zdWJzZXQtPnVuaXhfcGlkID09IERCVVNfUElEX1VOU0VUIHx8CisgICAgIHBvc3NpYmxlX3N1YnNldC0+dW5peF9waWQgPT0gY3JlZGVudGlhbHMtPnVuaXhfcGlkKSAmJgorICAgIChwb3NzaWJsZV9zdWJzZXQtPnVuaXhfdWlkID09IERCVVNfVUlEX1VOU0VUIHx8CisgICAgIHBvc3NpYmxlX3N1YnNldC0+dW5peF91aWQgPT0gY3JlZGVudGlhbHMtPnVuaXhfdWlkKSAmJgorICAgIChwb3NzaWJsZV9zdWJzZXQtPndpbmRvd3Nfc2lkID09IE5VTEwgfHwKKyAgICAgKGNyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCAmJiBzdHJjbXAgKHBvc3NpYmxlX3N1YnNldC0+d2luZG93c19zaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFscy0+d2luZG93c19zaWQpID09IDApKSAmJgorICAgIChwb3NzaWJsZV9zdWJzZXQtPmFkdF9hdWRpdF9kYXRhID09IE5VTEwgfHwKKyAgICAgKGNyZWRlbnRpYWxzLT5hZHRfYXVkaXRfZGF0YSAmJiBtZW1jbXAgKHBvc3NpYmxlX3N1YnNldC0+YWR0X2F1ZGl0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFscy0+YWR0X2F1ZGl0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFscy0+YWR0X2F1ZGl0X2RhdGFfc2l6ZSkgPT0gMCkpOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIGEgY3JlZGVudGlhbHMgb2JqZWN0IGNvbnRhaW5zIGFueXRoaW5nLgorICogCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICogQHJldHVybnMgI1RSVUUgaWYgdGhlcmUgYXJlIG5vIGNyZWRlbnRpYWxzIGluIHRoZSBvYmplY3QKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NyZWRlbnRpYWxzX2FyZV9lbXB0eSAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscykKK3sKKyAgcmV0dXJuCisgICAgY3JlZGVudGlhbHMtPnVuaXhfcGlkID09IERCVVNfUElEX1VOU0VUICYmCisgICAgY3JlZGVudGlhbHMtPnVuaXhfdWlkID09IERCVVNfVUlEX1VOU0VUICYmCisgICAgY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkID09IE5VTEwgJiYKKyAgICBjcmVkZW50aWFscy0+YWR0X2F1ZGl0X2RhdGEgPT0gTlVMTDsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciBhIGNyZWRlbnRpYWxzIG9iamVjdCBjb250YWlucyBhIHVzZXIgaWRlbnRpdHkuCisgKiAKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGVyZSBhcmUgbm8gdXNlciBpZGVudGl0aWVzIGluIHRoZSBvYmplY3QKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NyZWRlbnRpYWxzX2FyZV9hbm9ueW1vdXMgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMpCit7CisgIHJldHVybgorICAgIGNyZWRlbnRpYWxzLT51bml4X3VpZCA9PSBEQlVTX1VJRF9VTlNFVCAmJgorICAgIGNyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCA9PSBOVUxMOworfQorCisvKioKKyAqIE1lcmdlIGFsbCBjcmVkZW50aWFscyBmb3VuZCBpbiB0aGUgc2Vjb25kIG9iamVjdCBpbnRvIHRoZSBmaXJzdCBvYmplY3QsCisgKiBvdmVyd3JpdGluZyB0aGUgZmlyc3Qgb2JqZWN0IGlmIHRoZXJlIGFyZSBhbnkgb3ZlcmxhcHMuCisgKiAKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcGFyYW0gb3RoZXJfY3JlZGVudGlhbHMgY3JlZGVudGlhbHMgdG8gbWVyZ2UKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NyZWRlbnRpYWxzX2FkZF9jcmVkZW50aWFscyAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICAgICpvdGhlcl9jcmVkZW50aWFscykKK3sKKyAgcmV0dXJuCisgICAgX2RidXNfY3JlZGVudGlhbHNfYWRkX2NyZWRlbnRpYWwgKGNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NSRURFTlRJQUxfVU5JWF9QUk9DRVNTX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9jcmVkZW50aWFscykgJiYKKyAgICBfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbCAoY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQ1JFREVOVElBTF9VTklYX1VTRVJfSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2NyZWRlbnRpYWxzKSAmJgorICAgIF9kYnVzX2NyZWRlbnRpYWxzX2FkZF9jcmVkZW50aWFsIChjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19DUkVERU5USUFMX0FEVF9BVURJVF9EQVRBX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9jcmVkZW50aWFscykgJiYKKyAgICBfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbCAoY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQ1JFREVOVElBTF9XSU5ET1dTX1NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfY3JlZGVudGlhbHMpOworfQorCisvKioKKyAqIE1lcmdlIHRoZSBnaXZlbiBjcmVkZW50aWFsIGZvdW5kIGluIHRoZSBzZWNvbmQgb2JqZWN0IGludG8gdGhlIGZpcnN0IG9iamVjdCwKKyAqIG92ZXJ3cml0aW5nIHRoZSBmaXJzdCBvYmplY3QncyB2YWx1ZSBmb3IgdGhhdCBjcmVkZW50aWFsLgorICoKKyAqIERvZXMgbm90aGluZyBpZiB0aGUgc2Vjb25kIG9iamVjdCBkb2VzIG5vdCBjb250YWluIHRoZSBzcGVjaWZpZWQgY3JlZGVudGlhbC4KKyAqIGkuZS4sIHdpbGwgbmV2ZXIgZGVsZXRlIGEgY3JlZGVudGlhbCBmcm9tIHRoZSBmaXJzdCBvYmplY3QuCisgKiAKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcGFyYW0gd2hpY2ggdGhlIGNyZWRlbnRpYWwgdG8gb3ZlcndyaXRlCisgKiBAcGFyYW0gb3RoZXJfY3JlZGVudGlhbHMgY3JlZGVudGlhbHMgdG8gbWVyZ2UKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NyZWRlbnRpYWxzX2FkZF9jcmVkZW50aWFsIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFsVHlwZSAgd2hpY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICAgICpvdGhlcl9jcmVkZW50aWFscykKK3sKKyAgaWYgKHdoaWNoID09IERCVVNfQ1JFREVOVElBTF9VTklYX1BST0NFU1NfSUQgJiYKKyAgICAgIG90aGVyX2NyZWRlbnRpYWxzLT51bml4X3BpZCAhPSBEQlVTX1BJRF9VTlNFVCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF91bml4X3BpZCAoY3JlZGVudGlhbHMsIG90aGVyX2NyZWRlbnRpYWxzLT51bml4X3BpZCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UgaWYgKHdoaWNoID09IERCVVNfQ1JFREVOVElBTF9VTklYX1VTRVJfSUQgJiYKKyAgICAgICAgICAgb3RoZXJfY3JlZGVudGlhbHMtPnVuaXhfdWlkICE9IERCVVNfVUlEX1VOU0VUKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX3VuaXhfdWlkIChjcmVkZW50aWFscywgb3RoZXJfY3JlZGVudGlhbHMtPnVuaXhfdWlkKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZSBpZiAod2hpY2ggPT0gREJVU19DUkVERU5USUFMX1dJTkRPV1NfU0lEICYmCisgICAgICAgICAgIG90aGVyX2NyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX3dpbmRvd3Nfc2lkIChjcmVkZW50aWFscywgb3RoZXJfY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0gCisgIGVsc2UgaWYgKHdoaWNoID09IERCVVNfQ1JFREVOVElBTF9BRFRfQVVESVRfREFUQV9JRCAmJgorICAgICAgICAgICBvdGhlcl9jcmVkZW50aWFscy0+YWR0X2F1ZGl0X2RhdGEgIT0gTlVMTCkgCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfYWR0X2F1ZGl0X2RhdGEgKGNyZWRlbnRpYWxzLCBvdGhlcl9jcmVkZW50aWFscy0+YWR0X2F1ZGl0X2RhdGEsIG90aGVyX2NyZWRlbnRpYWxzLT5hZHRfYXVkaXRfZGF0YV9zaXplKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDbGVhciBhbGwgY3JlZGVudGlhbHMgaW4gdGhlIG9iamVjdC4KKyAqIAorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBvYmplY3QKKyAqLwordm9pZAorX2RidXNfY3JlZGVudGlhbHNfY2xlYXIgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMpCit7CisgIGNyZWRlbnRpYWxzLT51bml4X3BpZCA9IERCVVNfUElEX1VOU0VUOworICBjcmVkZW50aWFscy0+dW5peF91aWQgPSBEQlVTX1VJRF9VTlNFVDsKKyAgZGJ1c19mcmVlIChjcmVkZW50aWFscy0+d2luZG93c19zaWQpOworICBjcmVkZW50aWFscy0+d2luZG93c19zaWQgPSBOVUxMOworICBkYnVzX2ZyZWUgKGNyZWRlbnRpYWxzLT5hZHRfYXVkaXRfZGF0YSk7CisgIGNyZWRlbnRpYWxzLT5hZHRfYXVkaXRfZGF0YSA9IE5VTEw7CisgIGNyZWRlbnRpYWxzLT5hZHRfYXVkaXRfZGF0YV9zaXplID0gMDsKK30KKworLyoqCisgKiBDb3B5IGEgY3JlZGVudGlhbHMgb2JqZWN0LgorICogCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICogQHJldHVybnMgdGhlIGNvcHkgb3IgI05VTEwKKyAqLworREJ1c0NyZWRlbnRpYWxzKgorX2RidXNfY3JlZGVudGlhbHNfY29weSAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscykKK3sKKyAgREJ1c0NyZWRlbnRpYWxzICpjb3B5OworCisgIGNvcHkgPSBfZGJ1c19jcmVkZW50aWFsc19uZXcgKCk7CisgIGlmIChjb3B5ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbHMgKGNvcHksIGNyZWRlbnRpYWxzKSkKKyAgICB7CisgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY29weSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIGNvcHk7Cit9CisKKy8qKgorICogQ2hlY2sgd2hldGhlciB0aGUgdXNlci1pZGVudGlmeWluZyBjcmVkZW50aWFscyBpbiB0d28gY3JlZGVudGlhbHMKKyAqIG9iamVjdHMgYXJlIGlkZW50aWNhbC4gQ3JlZGVudGlhbHMgdGhhdCBhcmUgbm90IHJlbGF0ZWQgdG8gdGhlCisgKiB1c2VyIGFyZSBpZ25vcmVkLCBidXQgYW55IGtpbmQgb2YgdXNlciBJRCBjcmVkZW50aWFscyBtdXN0IGJlIHRoZQorICogc2FtZSAoVU5JWCB1c2VyIElELCBXaW5kb3dzIHVzZXIgU0lELCBldGMuKSBhbmQgcHJlc2VudCBpbiBib3RoCisgKiBvYmplY3RzIGZvciB0aGUgZnVuY3Rpb24gdG8gcmV0dXJuICNUUlVFLgorICogCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICogQHBhcmFtIG90aGVyX2NyZWRlbnRpYWxzIGNyZWRlbnRpYWxzIHRvIGNvbXBhcmUKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSB0d28gY3JlZGVudGlhbHMgcmVmZXIgdG8gdGhlIHNhbWUgdXNlcgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlZGVudGlhbHNfc2FtZV91c2VyIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgICAgKm90aGVyX2NyZWRlbnRpYWxzKQoreworICAvKiBib3RoIHdpbmRvd3MgYW5kIHVuaXggdXNlciBtdXN0IGJlIHRoZSBzYW1lICh0aG91Z2ggcHJldHR5IG11Y2gKKyAgICogaW4gYWxsIGNvbmNlaXZhYmxlIGNhc2VzLCBvbmUgd2lsbCBiZSB1bnNldCkKKyAgICovCisgIHJldHVybiBjcmVkZW50aWFscy0+dW5peF91aWQgPT0gb3RoZXJfY3JlZGVudGlhbHMtPnVuaXhfdWlkICYmCisgICAgKCghKGNyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCB8fCBvdGhlcl9jcmVkZW50aWFscy0+d2luZG93c19zaWQpKSB8fAorICAgICAoY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkICYmIG90aGVyX2NyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCAmJgorICAgICAgc3RyY21wIChjcmVkZW50aWFscy0+d2luZG93c19zaWQsIG90aGVyX2NyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCkgPT0gMCkpOworfQorCisvKioKKyAqIENvbnZlcnQgdGhlIGNyZWRlbnRpYWxzIGluIHRoaXMgb2JqZWN0IHRvIGEgaHVtYW4tcmVhZGFibGUKKyAqIHN0cmluZyBmb3JtYXQsIGFuZCBhcHBlbmQgdG8gdGhlIGdpdmVuIHN0cmluZy4KKyAqCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICogQHBhcmFtIHN0cmluZyBhcHBlbmQgdG8gdGhpcyBzdHJpbmcKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NyZWRlbnRpYWxzX3RvX3N0cmluZ19hcHBlbmQgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgKnN0cmluZykKK3sKKyAgZGJ1c19ib29sX3Qgam9pbjsKKworICBqb2luID0gRkFMU0U7CisgIGlmIChjcmVkZW50aWFscy0+dW5peF91aWQgIT0gREJVU19VSURfVU5TRVQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoc3RyaW5nLCAidWlkPSIgREJVU19VSURfRk9STUFULCBjcmVkZW50aWFscy0+dW5peF91aWQpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICAgIGpvaW4gPSBUUlVFOworICAgIH0KKyAgaWYgKGNyZWRlbnRpYWxzLT51bml4X3BpZCAhPSBEQlVTX1BJRF9VTlNFVCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmIChzdHJpbmcsICIlc3BpZD0iIERCVVNfUElEX0ZPUk1BVCwgam9pbiA/ICIgIiA6ICIiLCBjcmVkZW50aWFscy0+dW5peF9waWQpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICAgIGpvaW4gPSBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIGpvaW4gPSBGQUxTRTsKKyAgaWYgKGNyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKHN0cmluZywgIiVzc2lkPSVzIiwgam9pbiA/ICIgIiA6ICIiLCBjcmVkZW50aWFscy0+d2luZG93c19zaWQpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICAgIGpvaW4gPSBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIGpvaW4gPSBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK29vbToKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiogQH0gKi8KKworLyogdGVzdHMgaW4gZGJ1cy1jcmVkZW50aWFscy11dGlsLmMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLWNyZWRlbnRpYWxzLmggYi9kYnVzL2RidXMvZGJ1cy1jcmVkZW50aWFscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNjEyNGYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1jcmVkZW50aWFscy5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1jcmVkZW50aWFscy5oIENyZWRlbnRpYWxzIHByb3ZhYmxlIHRocm91Z2ggYXV0aGVudGljYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfQ1JFREVOVElBTFNfSAorI2RlZmluZSBEQlVTX0NSRURFTlRJQUxTX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWNyb3MuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZXJyb3JzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKwordHlwZWRlZiBlbnVtIHsKKyAgREJVU19DUkVERU5USUFMX1VOSVhfUFJPQ0VTU19JRCwKKyAgREJVU19DUkVERU5USUFMX1VOSVhfVVNFUl9JRCwKKyAgREJVU19DUkVERU5USUFMX0FEVF9BVURJVF9EQVRBX0lELAorICBEQlVTX0NSRURFTlRJQUxfV0lORE9XU19TSUQKK30gREJ1c0NyZWRlbnRpYWxUeXBlOworCitEQnVzQ3JlZGVudGlhbHMqIF9kYnVzX2NyZWRlbnRpYWxzX25ld19mcm9tX2N1cnJlbnRfcHJvY2VzcyAodm9pZCk7CitEQnVzQ3JlZGVudGlhbHMqIF9kYnVzX2NyZWRlbnRpYWxzX25ldyAgICAgICAgICAgICAgICAgICAgICAodm9pZCk7Cit2b2lkICAgICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3JlZiAgICAgICAgICAgICAgICAgICAgICAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscyk7Cit2b2lkICAgICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmICAgICAgICAgICAgICAgICAgICAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscyk7CitkYnVzX2Jvb2xfdCAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2FkZF91bml4X3BpZCAgICAgICAgICAgICAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3BpZF90ICAgICAgICAgIHBpZCk7CitkYnVzX2Jvb2xfdCAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2FkZF91bml4X3VpZCAgICAgICAgICAgICAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICAgIHVpZCk7CitkYnVzX2Jvb2xfdCAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2FkZF93aW5kb3dzX3NpZCAgICAgICAgICAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgKndpbmRvd3Nfc2lkKTsKK2RidXNfYm9vbF90ICAgICAgX2RidXNfY3JlZGVudGlhbHNfYWRkX2FkdF9hdWRpdF9kYXRhICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAqYXVkaXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICAgIHNpemUpOworZGJ1c19ib29sX3QgICAgICBfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlICAgICAgICAgICAgICAgICAgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxUeXBlICB0eXBlKTsKK2RidXNfcGlkX3QgICAgICAgX2RidXNfY3JlZGVudGlhbHNfZ2V0X3VuaXhfcGlkICAgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKTsKK2RidXNfdWlkX3QgICAgICAgX2RidXNfY3JlZGVudGlhbHNfZ2V0X3VuaXhfdWlkICAgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKTsKK2NvbnN0IGNoYXIqICAgICAgX2RidXNfY3JlZGVudGlhbHNfZ2V0X3dpbmRvd3Nfc2lkICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKTsKK3ZvaWQgKiAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfZ2V0X2FkdF9hdWRpdF9kYXRhICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKTsKK2RidXNfaW50MzJfdCAgICAgX2RidXNfY3JlZGVudGlhbHNfZ2V0X2FkdF9hdWRpdF9kYXRhX3NpemUgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKTsKK2RidXNfYm9vbF90ICAgICAgX2RidXNfY3JlZGVudGlhbHNfYXJlX3N1cGVyc2V0ICAgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFscyAgICAqcG9zc2libGVfc3Vic2V0KTsKK2RidXNfYm9vbF90ICAgICAgX2RidXNfY3JlZGVudGlhbHNfYXJlX2VtcHR5ICAgICAgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKTsKK2RidXNfYm9vbF90ICAgICAgX2RidXNfY3JlZGVudGlhbHNfYXJlX2Fub255bW91cyAgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKTsKK2RidXNfYm9vbF90ICAgICAgX2RidXNfY3JlZGVudGlhbHNfYWRkX2NyZWRlbnRpYWxzICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFscyAgICAqb3RoZXJfY3JlZGVudGlhbHMpOworLyogbXVzdCBzaWxlbnRseSBhbGxvdyAnd2hpY2gnIHRvIG5vdCBleGlzdCAqLworZGJ1c19ib29sX3QgICAgICBfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbCAgICAgICAgICAgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxUeXBlICB3aGljaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgICAgKm90aGVyX2NyZWRlbnRpYWxzKTsKK3ZvaWQgICAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfY2xlYXIgICAgICAgICAgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKTsKK0RCdXNDcmVkZW50aWFscyogX2RidXNfY3JlZGVudGlhbHNfY29weSAgICAgICAgICAgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKTsKK2RidXNfYm9vbF90ICAgICAgX2RidXNfY3JlZGVudGlhbHNfc2FtZV91c2VyICAgICAgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFscyAgICAqb3RoZXJfY3JlZGVudGlhbHMpOworZGJ1c19ib29sX3QgICAgICBfZGJ1c19jcmVkZW50aWFsc190b19zdHJpbmdfYXBwZW5kICAgICAgICAgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICpzdHJpbmcpOworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19DUkVERU5USUFMU19IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1kYXRhc2xvdC5jIGIvZGJ1cy9kYnVzL2RidXMtZGF0YXNsb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzY5NjEyCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtZGF0YXNsb3QuYwpAQCAtMCwwICsxLDQ3OSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWRhdGFzbG90LmMgIHN0b3JpbmcgZGF0YSBvbiBvYmplY3RzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtZGF0YXNsb3QuaCIKKyNpbmNsdWRlICJkYnVzLXRocmVhZHMtaW50ZXJuYWwuaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0RhdGFTbG90IERhdGEgc2xvdHMKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgU3RvcmluZyBkYXRhIGJ5IElECisgKgorICogVHlwZXMgYW5kIGZ1bmN0aW9ucyByZWxhdGVkIHRvIHN0b3JpbmcgZGF0YSBieSBhbgorICogYWxsb2NhdGVkIElELiBUaGlzIGlzIHVzZWQgZm9yIGRidXNfY29ubmVjdGlvbl9zZXRfZGF0YSgpLAorICogZGJ1c19zZXJ2ZXJfc2V0X2RhdGEoKSwgZXRjLiAKKyAqIEB7CisgKi8KKworLyoqCisgKiBJbml0aWFsaXplcyBhIGRhdGEgc2xvdCBhbGxvY2F0b3Igb2JqZWN0LCB1c2VkIHRvIGFzc2lnbgorICogaW50ZWdlciBJRHMgZm9yIGRhdGEgc2xvdHMuCisgKgorICogQHBhcmFtIGFsbG9jYXRvciB0aGUgYWxsb2NhdG9yIHRvIGluaXRpYWxpemUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfaW5pdCAoREJ1c0RhdGFTbG90QWxsb2NhdG9yICphbGxvY2F0b3IpCit7CisgIGFsbG9jYXRvci0+YWxsb2NhdGVkX3Nsb3RzID0gTlVMTDsKKyAgYWxsb2NhdG9yLT5uX2FsbG9jYXRlZF9zbG90cyA9IDA7CisgIGFsbG9jYXRvci0+bl91c2VkX3Nsb3RzID0gMDsKKyAgYWxsb2NhdG9yLT5sb2NrX2xvYyA9IE5VTEw7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBBbGxvY2F0ZXMgYW4gaW50ZWdlciBJRCB0byBiZSB1c2VkIGZvciBzdG9yaW5nIGRhdGEKKyAqIGluIGEgI0RCdXNEYXRhU2xvdExpc3QuIElmIHRoZSB2YWx1ZSBhdCAqc2xvdF9pZF9wIGlzCisgKiBub3QgLTEsIHRoaXMgZnVuY3Rpb24ganVzdCBpbmNyZW1lbnRzIHRoZSByZWZjb3VudCBmb3IKKyAqIHRoZSBleGlzdGluZyBzbG90IElELiBJZiB0aGUgdmFsdWUgaXMgLTEsIGEgbmV3IHNsb3QgSUQKKyAqIGlzIGFsbG9jYXRlZCBhbmQgc3RvcmVkIGF0ICpzbG90X2lkX3AuCisgKiAKKyAqIEBwYXJhbSBhbGxvY2F0b3IgdGhlIGFsbG9jYXRvcgorICogQHBhcmFtIG11dGV4X2xvYyB0aGUgbG9jYXRpb24gbG9jayBmb3IgdGhpcyBhbGxvY2F0b3IKKyAqIEBwYXJhbSBzbG90X2lkX3AgYWRkcmVzcyB0byBmaWxsIHdpdGggdGhlIHNsb3QgSUQKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfYWxsb2MgKERCdXNEYXRhU2xvdEFsbG9jYXRvciAqYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1JNdXRleCAgICAgICAgICAgICoqbXV0ZXhfbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICAgICAgICpzbG90X2lkX3ApCit7CisgIGRidXNfaW50MzJfdCBzbG90OworCisgIF9kYnVzX3JtdXRleF9sb2NrICgqbXV0ZXhfbG9jKTsKKworICBpZiAoYWxsb2NhdG9yLT5uX2FsbG9jYXRlZF9zbG90cyA9PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoYWxsb2NhdG9yLT5sb2NrX2xvYyA9PSBOVUxMKTsKKyAgICAgIGFsbG9jYXRvci0+bG9ja19sb2MgPSBtdXRleF9sb2M7CisgICAgfQorICBlbHNlIGlmIChhbGxvY2F0b3ItPmxvY2tfbG9jICE9IG11dGV4X2xvYykKKyAgICB7CisgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoIkQtQnVzIHRocmVhZHMgd2VyZSBpbml0aWFsaXplZCBhZnRlciBmaXJzdCB1c2luZyB0aGUgRC1CdXMgbGlicmFyeS4gSWYgeW91ciBhcHBsaWNhdGlvbiBkb2VzIG5vdCBkaXJlY3RseSBpbml0aWFsaXplIHRocmVhZHMgb3IgdXNlIEQtQnVzLCBrZWVwIGluIG1pbmQgdGhhdCBzb21lIGxpYnJhcnkgb3IgcGx1Z2luIG1heSBoYXZlIHVzZWQgRC1CdXMgb3IgaW5pdGlhbGl6ZWQgdGhyZWFkcyBiZWhpbmQgeW91ciBiYWNrLiBZb3UgY2FuIG9mdGVuIGZpeCB0aGlzIHByb2JsZW0gYnkgY2FsbGluZyBkYnVzX2luaXRfdGhyZWFkcygpIG9yIGRidXNfZ190aHJlYWRzX2luaXQoKSBlYXJseSBpbiB5b3VyIG1haW4oKSBtZXRob2QsIGJlZm9yZSBELUJ1cyBpcyB1c2VkLlxuIik7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJleGl0aW5nIik7CisgICAgfQorCisgIGlmICgqc2xvdF9pZF9wID49IDApCisgICAgeworICAgICAgc2xvdCA9ICpzbG90X2lkX3A7CisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAoc2xvdCA8IGFsbG9jYXRvci0+bl9hbGxvY2F0ZWRfc2xvdHMpOworICAgICAgX2RidXNfYXNzZXJ0IChhbGxvY2F0b3ItPmFsbG9jYXRlZF9zbG90c1tzbG90XS5zbG90X2lkID09IHNsb3QpOworICAgICAgCisgICAgICBhbGxvY2F0b3ItPmFsbG9jYXRlZF9zbG90c1tzbG90XS5yZWZjb3VudCArPSAxOworCisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0ICgqc2xvdF9pZF9wIDwgMCk7CisgIAorICBpZiAoYWxsb2NhdG9yLT5uX3VzZWRfc2xvdHMgPCBhbGxvY2F0b3ItPm5fYWxsb2NhdGVkX3Nsb3RzKQorICAgIHsKKyAgICAgIHNsb3QgPSAwOworICAgICAgd2hpbGUgKHNsb3QgPCBhbGxvY2F0b3ItPm5fYWxsb2NhdGVkX3Nsb3RzKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGFsbG9jYXRvci0+YWxsb2NhdGVkX3Nsb3RzW3Nsb3RdLnNsb3RfaWQgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBhbGxvY2F0b3ItPmFsbG9jYXRlZF9zbG90c1tzbG90XS5zbG90X2lkID0gc2xvdDsKKyAgICAgICAgICAgICAgYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHNbc2xvdF0ucmVmY291bnQgPSAxOworICAgICAgICAgICAgICBhbGxvY2F0b3ItPm5fdXNlZF9zbG90cyArPSAxOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICArK3Nsb3Q7CisgICAgICAgIH0KKworICAgICAgX2RidXNfYXNzZXJ0IChzbG90IDwgYWxsb2NhdG9yLT5uX2FsbG9jYXRlZF9zbG90cyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgREJ1c0FsbG9jYXRlZFNsb3QgKnRtcDsKKyAgICAgIAorICAgICAgc2xvdCA9IC0xOworICAgICAgdG1wID0gZGJ1c19yZWFsbG9jIChhbGxvY2F0b3ItPmFsbG9jYXRlZF9zbG90cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChEQnVzQWxsb2NhdGVkU2xvdCkgKiAoYWxsb2NhdG9yLT5uX2FsbG9jYXRlZF9zbG90cyArIDEpKTsKKyAgICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGFsbG9jYXRvci0+YWxsb2NhdGVkX3Nsb3RzID0gdG1wOworICAgICAgc2xvdCA9IGFsbG9jYXRvci0+bl9hbGxvY2F0ZWRfc2xvdHM7CisgICAgICBhbGxvY2F0b3ItPm5fYWxsb2NhdGVkX3Nsb3RzICs9IDE7CisgICAgICBhbGxvY2F0b3ItPm5fdXNlZF9zbG90cyArPSAxOworICAgICAgYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHNbc2xvdF0uc2xvdF9pZCA9IHNsb3Q7CisgICAgICBhbGxvY2F0b3ItPmFsbG9jYXRlZF9zbG90c1tzbG90XS5yZWZjb3VudCA9IDE7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoc2xvdCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzbG90IDwgYWxsb2NhdG9yLT5uX2FsbG9jYXRlZF9zbG90cyk7CisgIF9kYnVzX2Fzc2VydCAoKnNsb3RfaWRfcCA8IDApOworICBfZGJ1c19hc3NlcnQgKGFsbG9jYXRvci0+YWxsb2NhdGVkX3Nsb3RzW3Nsb3RdLnNsb3RfaWQgPT0gc2xvdCk7CisgIF9kYnVzX2Fzc2VydCAoYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHNbc2xvdF0ucmVmY291bnQgPT0gMSk7CisgIAorICAqc2xvdF9pZF9wID0gc2xvdDsKKyAgCisgIF9kYnVzX3ZlcmJvc2UgKCJBbGxvY2F0ZWQgc2xvdCAlZCBvbiBhbGxvY2F0b3IgJXAgdG90YWwgJWQgc2xvdHMgYWxsb2NhdGVkICVkIHVzZWRcbiIsCisgICAgICAgICAgICAgICAgIHNsb3QsIGFsbG9jYXRvciwgYWxsb2NhdG9yLT5uX2FsbG9jYXRlZF9zbG90cywgYWxsb2NhdG9yLT5uX3VzZWRfc2xvdHMpOworICAKKyBvdXQ6CisgIF9kYnVzX3JtdXRleF91bmxvY2sgKCooYWxsb2NhdG9yLT5sb2NrX2xvYykpOworICByZXR1cm4gc2xvdCA+PSAwOworfQorCisvKioKKyAqIERlYWxsb2NhdGVzIGFuIElEIHByZXZpb3VzbHkgYWxsb2NhdGVkIHdpdGgKKyAqIF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfYWxsb2MoKS4gIEV4aXN0aW5nIGRhdGEgc3RvcmVkIG9uCisgKiBleGlzdGluZyAjREJ1c0RhdGFTbG90TGlzdCBvYmplY3RzIHdpdGggdGhpcyBJRCB3aWxsIGJlIGZyZWVkIHdoZW4gdGhlCisgKiBkYXRhIGxpc3QgaXMgZmluYWxpemVkLCBidXQgbWF5IG5vdCBiZSByZXRyaWV2ZWQgKGFuZCBtYXkgb25seSBiZQorICogcmVwbGFjZWQgaWYgc29tZW9uZSBlbHNlIHJlYWxsb2NhdGVzIHRoZSBzbG90KS4KKyAqIFRoZSBzbG90IHZhbHVlIGlzIHJlc2V0IHRvIC0xIGlmIHRoaXMgaXMgdGhlIGxhc3QgdW5yZWYuCisgKgorICogQHBhcmFtIGFsbG9jYXRvciB0aGUgYWxsb2NhdG9yCisgKiBAcGFyYW0gc2xvdF9pZF9wIGFkZHJlc3Mgd2hlcmUgd2Ugc3RvcmUgdGhlIHNsb3QKKyAqLwordm9pZAorX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9mcmVlIChEQnVzRGF0YVNsb3RBbGxvY2F0b3IgKmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICAgICAgICpzbG90X2lkX3ApCit7CisgIF9kYnVzX3JtdXRleF9sb2NrICgqKGFsbG9jYXRvci0+bG9ja19sb2MpKTsKKyAgCisgIF9kYnVzX2Fzc2VydCAoKnNsb3RfaWRfcCA8IGFsbG9jYXRvci0+bl9hbGxvY2F0ZWRfc2xvdHMpOworICBfZGJ1c19hc3NlcnQgKGFsbG9jYXRvci0+YWxsb2NhdGVkX3Nsb3RzWypzbG90X2lkX3BdLnNsb3RfaWQgPT0gKnNsb3RfaWRfcCk7CisgIF9kYnVzX2Fzc2VydCAoYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHNbKnNsb3RfaWRfcF0ucmVmY291bnQgPiAwKTsKKworICBhbGxvY2F0b3ItPmFsbG9jYXRlZF9zbG90c1sqc2xvdF9pZF9wXS5yZWZjb3VudCAtPSAxOworCisgIGlmIChhbGxvY2F0b3ItPmFsbG9jYXRlZF9zbG90c1sqc2xvdF9pZF9wXS5yZWZjb3VudCA+IDApCisgICAgeworICAgICAgX2RidXNfcm11dGV4X3VubG9jayAoKihhbGxvY2F0b3ItPmxvY2tfbG9jKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIHJlZmNvdW50IGlzIDAsIGZyZWUgdGhlIHNsb3QgKi8KKyAgX2RidXNfdmVyYm9zZSAoIkZyZWVpbmcgc2xvdCAlZCBvbiBhbGxvY2F0b3IgJXAgdG90YWwgJWQgYWxsb2NhdGVkICVkIHVzZWRcbiIsCisgICAgICAgICAgICAgICAgICpzbG90X2lkX3AsIGFsbG9jYXRvciwgYWxsb2NhdG9yLT5uX2FsbG9jYXRlZF9zbG90cywgYWxsb2NhdG9yLT5uX3VzZWRfc2xvdHMpOworICAKKyAgYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHNbKnNsb3RfaWRfcF0uc2xvdF9pZCA9IC0xOworICAqc2xvdF9pZF9wID0gLTE7CisgIAorICBhbGxvY2F0b3ItPm5fdXNlZF9zbG90cyAtPSAxOworICAKKyAgaWYgKGFsbG9jYXRvci0+bl91c2VkX3Nsb3RzID09IDApCisgICAgeworICAgICAgREJ1c1JNdXRleCAqKm11dGV4X2xvYyA9IGFsbG9jYXRvci0+bG9ja19sb2M7CisgICAgICAKKyAgICAgIGRidXNfZnJlZSAoYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHMpOworICAgICAgYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHMgPSBOVUxMOworICAgICAgYWxsb2NhdG9yLT5uX2FsbG9jYXRlZF9zbG90cyA9IDA7CisgICAgICBhbGxvY2F0b3ItPmxvY2tfbG9jID0gTlVMTDsKKworICAgICAgX2RidXNfcm11dGV4X3VubG9jayAoKm11dGV4X2xvYyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfcm11dGV4X3VubG9jayAoKihhbGxvY2F0b3ItPmxvY2tfbG9jKSk7CisgICAgfQorfQorCisvKioKKyAqIEluaXRpYWxpemVzIGEgc2xvdCBsaXN0LgorICogQHBhcmFtIGxpc3QgdGhlIGxpc3QgdG8gaW5pdGlhbGl6ZS4KKyAqLwordm9pZAorX2RidXNfZGF0YV9zbG90X2xpc3RfaW5pdCAoREJ1c0RhdGFTbG90TGlzdCAqbGlzdCkKK3sKKyAgbGlzdC0+c2xvdHMgPSBOVUxMOworICBsaXN0LT5uX3Nsb3RzID0gMDsKK30KKworLyoqCisgKiBTdG9yZXMgYSBwb2ludGVyIGluIHRoZSBkYXRhIHNsb3QgbGlzdCwgYWxvbmcgd2l0aCBhbiBvcHRpb25hbAorICogZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgZnJlZWluZyB0aGUgZGF0YSB3aGVuIHRoZSBkYXRhIGlzIHNldAorICogYWdhaW4sIG9yIHdoZW4gdGhlIHNsb3QgbGlzdCBpcyBmaW5hbGl6ZWQuIFRoZSBzbG90IG51bWJlciBtdXN0CisgKiBoYXZlIGJlZW4gYWxsb2NhdGVkIHdpdGggX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9hbGxvYygpIGZvciB0aGUKKyAqIHNhbWUgYWxsb2NhdG9yIHBhc3NlZCBpbiBoZXJlLiBUaGUgc2FtZSBhbGxvY2F0b3IgaGFzIHRvIGJlIHVzZWQKKyAqIHdpdGggdGhlIHNsb3QgbGlzdCBldmVyeSB0aW1lLgorICoKKyAqIEBwYXJhbSBhbGxvY2F0b3IgdGhlIGFsbG9jYXRvciB0byB1c2UKKyAqIEBwYXJhbSBsaXN0IHRoZSBkYXRhIHNsb3QgbGlzdAorICogQHBhcmFtIHNsb3QgdGhlIHNsb3QgbnVtYmVyCisgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSB0byBzdG9yZQorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jIGZpbmFsaXplciBmdW5jdGlvbiBmb3IgdGhlIGRhdGEKKyAqIEBwYXJhbSBvbGRfZnJlZV9mdW5jIGZyZWUgZnVuY3Rpb24gZm9yIGFueSBwcmV2aW91c2x5LWV4aXN0aW5nIGRhdGEKKyAqIEBwYXJhbSBvbGRfZGF0YSBwcmV2aW91c2x5LWV4aXN0aW5nIGRhdGEsIHNob3VsZCBiZSBmcmVlZCB3aXRoIG9sZF9mcmVlX2Z1bmMKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZXJlIHdhcyBlbm91Z2ggbWVtb3J5IHRvIHN0b3JlIHRoZSBkYXRhCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19kYXRhX3Nsb3RfbGlzdF9zZXQgIChEQnVzRGF0YVNsb3RBbGxvY2F0b3IgKmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNEYXRhU2xvdExpc3QgICAgICAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgZnJlZV9kYXRhX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgKm9sZF9mcmVlX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAqKm9sZF9kYXRhKQoreworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisgIC8qIFdlIG5lZWQgdG8gdGFrZSB0aGUgYWxsb2NhdG9yIGxvY2sgaGVyZSwgYmVjYXVzZSB0aGUgYWxsb2NhdG9yIGNvdWxkCisgICAqIGJlIGUuZy4gcmVhbGxvYygpaW5nIGFsbG9jYXRlZF9zbG90cy4gV2UgYXZvaWQgZG9pbmcgdGhpcyBpZiBhc3NlcnRzCisgICAqIGFyZSBkaXNhYmxlZCwgc2luY2UgdGhlbiB0aGUgYXNzZXJ0cyBhcmUgZW1wdHkuCisgICAqLworICBfZGJ1c19ybXV0ZXhfbG9jayAoKihhbGxvY2F0b3ItPmxvY2tfbG9jKSk7CisgIF9kYnVzX2Fzc2VydCAoc2xvdCA8IGFsbG9jYXRvci0+bl9hbGxvY2F0ZWRfc2xvdHMpOworICBfZGJ1c19hc3NlcnQgKGFsbG9jYXRvci0+YWxsb2NhdGVkX3Nsb3RzW3Nsb3RdLnNsb3RfaWQgPT0gc2xvdCk7CisgIF9kYnVzX3JtdXRleF91bmxvY2sgKCooYWxsb2NhdG9yLT5sb2NrX2xvYykpOworI2VuZGlmCisgIAorICBpZiAoc2xvdCA+PSBsaXN0LT5uX3Nsb3RzKQorICAgIHsKKyAgICAgIERCdXNEYXRhU2xvdCAqdG1wOworICAgICAgaW50IGk7CisgICAgICAKKyAgICAgIHRtcCA9IGRidXNfcmVhbGxvYyAobGlzdC0+c2xvdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoREJ1c0RhdGFTbG90KSAqIChzbG90ICsgMSkpOworICAgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgIGxpc3QtPnNsb3RzID0gdG1wOworICAgICAgaSA9IGxpc3QtPm5fc2xvdHM7CisgICAgICBsaXN0LT5uX3Nsb3RzID0gc2xvdCArIDE7CisgICAgICB3aGlsZSAoaSA8IGxpc3QtPm5fc2xvdHMpCisgICAgICAgIHsKKyAgICAgICAgICBsaXN0LT5zbG90c1tpXS5kYXRhID0gTlVMTDsKKyAgICAgICAgICBsaXN0LT5zbG90c1tpXS5mcmVlX2RhdGFfZnVuYyA9IE5VTEw7CisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoc2xvdCA8IGxpc3QtPm5fc2xvdHMpOworCisgICpvbGRfZGF0YSA9IGxpc3QtPnNsb3RzW3Nsb3RdLmRhdGE7CisgICpvbGRfZnJlZV9mdW5jID0gbGlzdC0+c2xvdHNbc2xvdF0uZnJlZV9kYXRhX2Z1bmM7CisKKyAgbGlzdC0+c2xvdHNbc2xvdF0uZGF0YSA9IGRhdGE7CisgIGxpc3QtPnNsb3RzW3Nsb3RdLmZyZWVfZGF0YV9mdW5jID0gZnJlZV9kYXRhX2Z1bmM7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogUmV0cmlldmVzIGRhdGEgcHJldmlvdXNseSBzZXQgd2l0aCBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9zZXRfZGF0YSgpLgorICogVGhlIHNsb3QgbXVzdCBzdGlsbCBiZSBhbGxvY2F0ZWQgKG11c3Qgbm90IGhhdmUgYmVlbiBmcmVlZCkuCisgKgorICogQHBhcmFtIGFsbG9jYXRvciB0aGUgYWxsb2NhdG9yIHNsb3Qgd2FzIGFsbG9jYXRlZCBmcm9tCisgKiBAcGFyYW0gbGlzdCB0aGUgZGF0YSBzbG90IGxpc3QKKyAqIEBwYXJhbSBzbG90IHRoZSBzbG90IHRvIGdldCBkYXRhIGZyb20KKyAqIEByZXR1cm5zIHRoZSBkYXRhLCBvciAjTlVMTCBpZiBub3QgZm91bmQKKyAqLwordm9pZCoKK19kYnVzX2RhdGFfc2xvdF9saXN0X2dldCAgKERCdXNEYXRhU2xvdEFsbG9jYXRvciAqYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0RhdGFTbG90TGlzdCAgICAgICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICBzbG90KQoreworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisgIC8qIFdlIG5lZWQgdG8gdGFrZSB0aGUgYWxsb2NhdG9yIGxvY2sgaGVyZSwgYmVjYXVzZSB0aGUgYWxsb2NhdG9yIGNvdWxkCisgICAqIGJlIGUuZy4gcmVhbGxvYygpaW5nIGFsbG9jYXRlZF9zbG90cy4gV2UgYXZvaWQgZG9pbmcgdGhpcyBpZiBhc3NlcnRzCisgICAqIGFyZSBkaXNhYmxlZCwgc2luY2UgdGhlbiB0aGUgYXNzZXJ0cyBhcmUgZW1wdHkuCisgICAqLworICBfZGJ1c19ybXV0ZXhfbG9jayAoKihhbGxvY2F0b3ItPmxvY2tfbG9jKSk7CisgIF9kYnVzX2Fzc2VydCAoc2xvdCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzbG90IDwgYWxsb2NhdG9yLT5uX2FsbG9jYXRlZF9zbG90cyk7CisgIF9kYnVzX2Fzc2VydCAoYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHNbc2xvdF0uc2xvdF9pZCA9PSBzbG90KTsKKyAgX2RidXNfcm11dGV4X3VubG9jayAoKihhbGxvY2F0b3ItPmxvY2tfbG9jKSk7CisjZW5kaWYKKworICBpZiAoc2xvdCA+PSBsaXN0LT5uX3Nsb3RzKQorICAgIHJldHVybiBOVUxMOworICBlbHNlCisgICAgcmV0dXJuIGxpc3QtPnNsb3RzW3Nsb3RdLmRhdGE7Cit9CisKKy8qKgorICogRnJlZXMgYWxsIGRhdGEgc2xvdHMgY29udGFpbmVkIGluIHRoZSBsaXN0LCBjYWxsaW5nCisgKiBhcHBsaWNhdGlvbi1wcm92aWRlZCBmcmVlIGZ1bmN0aW9ucyBpZiB0aGV5IGV4aXN0LgorICoKKyAqIEBwYXJhbSBsaXN0IHRoZSBsaXN0IHRvIGNsZWFyCisgKi8KK3ZvaWQKK19kYnVzX2RhdGFfc2xvdF9saXN0X2NsZWFyIChEQnVzRGF0YVNsb3RMaXN0ICpsaXN0KQoreworICBpbnQgaTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBsaXN0LT5uX3Nsb3RzKQorICAgIHsKKyAgICAgIGlmIChsaXN0LT5zbG90c1tpXS5mcmVlX2RhdGFfZnVuYykKKyAgICAgICAgKCogbGlzdC0+c2xvdHNbaV0uZnJlZV9kYXRhX2Z1bmMpIChsaXN0LT5zbG90c1tpXS5kYXRhKTsKKyAgICAgIGxpc3QtPnNsb3RzW2ldLmRhdGEgPSBOVUxMOworICAgICAgbGlzdC0+c2xvdHNbaV0uZnJlZV9kYXRhX2Z1bmMgPSBOVUxMOworICAgICAgKytpOworICAgIH0KK30KKworLyoqCisgKiBGcmVlcyB0aGUgZGF0YSBzbG90IGxpc3QgYW5kIGFsbCBkYXRhIHNsb3RzIGNvbnRhaW5lZAorICogaW4gaXQsIGNhbGxpbmcgYXBwbGljYXRpb24tcHJvdmlkZWQgZnJlZSBmdW5jdGlvbnMKKyAqIGlmIHRoZXkgZXhpc3QuCisgKgorICogQHBhcmFtIGxpc3QgdGhlIGxpc3QgdG8gZnJlZQorICovCit2b2lkCitfZGJ1c19kYXRhX3Nsb3RfbGlzdF9mcmVlIChEQnVzRGF0YVNsb3RMaXN0ICpsaXN0KQoreworICBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9jbGVhciAobGlzdCk7CisgIAorICBkYnVzX2ZyZWUgKGxpc3QtPnNsb3RzKTsKKyAgbGlzdC0+c2xvdHMgPSBOVUxMOworICBsaXN0LT5uX3Nsb3RzID0gMDsKK30KKworLyoqIEB9ICovCisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIGludCBmcmVlX2NvdW50ZXI7CisKK3N0YXRpYyB2b2lkCit0ZXN0X2ZyZWVfc2xvdF9kYXRhX2Z1bmMgKHZvaWQgKmRhdGEpCit7CisgIGludCBpID0gX0RCVVNfUE9JTlRFUl9UT19JTlQgKGRhdGEpOworCisgIF9kYnVzX2Fzc2VydCAoZnJlZV9jb3VudGVyID09IGkpOworICArK2ZyZWVfY291bnRlcjsKK30KKworLyoqCisgKiBUZXN0IGZ1bmN0aW9uIGZvciBkYXRhIHNsb3RzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19kYXRhX3Nsb3RfdGVzdCAodm9pZCkKK3sKKyAgREJ1c0RhdGFTbG90QWxsb2NhdG9yIGFsbG9jYXRvcjsKKyAgREJ1c0RhdGFTbG90TGlzdCBsaXN0OworICBpbnQgaTsKKyAgREJ1c0ZyZWVGdW5jdGlvbiBvbGRfZnJlZV9mdW5jOworICB2b2lkICpvbGRfZGF0YTsKKyAgREJ1c1JNdXRleCAqbXV0ZXg7CisgIAorICBpZiAoIV9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfaW5pdCAoJmFsbG9jYXRvcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5IGZvciBhbGxvY2F0b3IiKTsKKworICBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9pbml0ICgmbGlzdCk7CisKKyAgX2RidXNfcm11dGV4X25ld19hdF9sb2NhdGlvbiAoJm11dGV4KTsKKyAgaWYgKG11dGV4ID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGFsbG9jIG11dGV4Iik7CisgIAorI2RlZmluZSBOX1NMT1RTIDEwMAorCisgIGkgPSAwOworICB3aGlsZSAoaSA8IE5fU0xPVFMpCisgICAgeworICAgICAgLyogd2UgZG9uJ3QgcmVhbGx5IHdhbnQgYXBwcyB0byByZWx5IG9uIHRoaXMgb3JkZXJlZAorICAgICAgICogYWxsb2NhdGlvbiwgYnV0IGl0IHNpbXBsaWZpZXMgdGhpbmdzIHRvIHJlbHkgb24gaXQKKyAgICAgICAqIGhlcmUuCisgICAgICAgKi8KKyAgICAgIGRidXNfaW50MzJfdCB0bXAgPSAtMTsKKyAgICAgIAorICAgICAgX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9hbGxvYyAoJmFsbG9jYXRvciwgJm11dGV4LCAmdG1wKTsKKworICAgICAgaWYgKHRtcCAhPSBpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWQgbm90IGFsbG9jYXRlIHNsb3RzIGluIG51bWVyaWMgb3JkZXJcbiIpOworCisgICAgICArK2k7CisgICAgfQorCisgIGkgPSAwOworICB3aGlsZSAoaSA8IE5fU0xPVFMpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19kYXRhX3Nsb3RfbGlzdF9zZXQgKCZhbGxvY2F0b3IsICZsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2ZyZWVfc2xvdF9kYXRhX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9sZF9mcmVlX2Z1bmMsICZvbGRfZGF0YSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSB0byBzZXQgZGF0YSIpOworCisgICAgICBfZGJ1c19hc3NlcnQgKG9sZF9mcmVlX2Z1bmMgPT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKG9sZF9kYXRhID09IE5VTEwpOworCisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX2RhdGFfc2xvdF9saXN0X2dldCAoJmFsbG9jYXRvciwgJmxpc3QsIGkpID09CisgICAgICAgICAgICAgICAgICAgIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSk7CisgICAgICAKKyAgICAgICsraTsKKyAgICB9CisKKyAgZnJlZV9jb3VudGVyID0gMDsKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgTl9TTE9UUykKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2RhdGFfc2xvdF9saXN0X3NldCAoJmFsbG9jYXRvciwgJmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfZnJlZV9zbG90X2RhdGFfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2xkX2ZyZWVfZnVuYywgJm9sZF9kYXRhKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5IHRvIHNldCBkYXRhIik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAob2xkX2ZyZWVfZnVuYyA9PSB0ZXN0X2ZyZWVfc2xvdF9kYXRhX2Z1bmMpOworICAgICAgX2RidXNfYXNzZXJ0IChfREJVU19QT0lOVEVSX1RPX0lOVCAob2xkX2RhdGEpID09IGkpOworCisgICAgICAoKiBvbGRfZnJlZV9mdW5jKSAob2xkX2RhdGEpOworICAgICAgX2RidXNfYXNzZXJ0IChpID09IChmcmVlX2NvdW50ZXIgLSAxKSk7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfZGF0YV9zbG90X2xpc3RfZ2V0ICgmYWxsb2NhdG9yLCAmbGlzdCwgaSkgPT0KKyAgICAgICAgICAgICAgICAgICAgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKTsKKyAgICAgIAorICAgICAgKytpOworICAgIH0KKworICBmcmVlX2NvdW50ZXIgPSAwOworICBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9mcmVlICgmbGlzdCk7CisKKyAgX2RidXNfYXNzZXJ0IChOX1NMT1RTID09IGZyZWVfY291bnRlcik7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgTl9TTE9UUykKKyAgICB7CisgICAgICBkYnVzX2ludDMyX3QgdG1wID0gaTsKKyAgICAgIAorICAgICAgX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9mcmVlICgmYWxsb2NhdG9yLCAmdG1wKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAodG1wID09IC0xKTsKKyAgICAgICsraTsKKyAgICB9CisKKyAgX2RidXNfcm11dGV4X2ZyZWVfYXRfbG9jYXRpb24gKCZtdXRleCk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLWRhdGFzbG90LmggYi9kYnVzL2RidXMvZGJ1cy1kYXRhc2xvdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOWQ1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1kYXRhc2xvdC5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1kYXRhc2xvdC5oICBzdG9yaW5nIGRhdGEgb24gb2JqZWN0cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfREFUQVNMT1RfSAorI2RlZmluZSBEQlVTX0RBVEFTTE9UX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKworREJVU19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBEQnVzRGF0YVNsb3RBbGxvY2F0b3IgREJ1c0RhdGFTbG90QWxsb2NhdG9yOwordHlwZWRlZiBzdHJ1Y3QgREJ1c0RhdGFTbG90TGlzdCBEQnVzRGF0YVNsb3RMaXN0OworCisvKiogT3BhcXVlIHR5cGVkZWYgZm9yIERCdXNEYXRhU2xvdCAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c0RhdGFTbG90IERCdXNEYXRhU2xvdDsKKy8qKiBEQnVzRGF0YVNsb3QgaXMgdXNlZCB0byBzdG9yZSBhcHBsaWNhdGlvbiBkYXRhIG9uIHRoZSBjb25uZWN0aW9uICovCitzdHJ1Y3QgREJ1c0RhdGFTbG90Cit7CisgIHZvaWQgKmRhdGE7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIGFwcGxpY2F0aW9uIGRhdGEgKi8KKyAgREJ1c0ZyZWVGdW5jdGlvbiBmcmVlX2RhdGFfZnVuYzsgLyoqPCBGcmVlIHRoZSBhcHBsaWNhdGlvbiBkYXRhICovCit9OworCit0eXBlZGVmIHN0cnVjdCBEQnVzQWxsb2NhdGVkU2xvdCBEQnVzQWxsb2NhdGVkU2xvdDsKKworLyoqIEFuIGFsbG9jYXRlZCBzbG90IGZvciBzdG9yaW5nIGRhdGEKKyAqLworc3RydWN0IERCdXNBbGxvY2F0ZWRTbG90Cit7CisgIGRidXNfaW50MzJfdCBzbG90X2lkOyAgLyoqPCBJRCBvZiB0aGlzIHNsb3QgKi8KKyAgaW50ICAgICAgICAgIHJlZmNvdW50OyAvKio8IE51bWJlciBvZiB1c2VzIG9mIHRoZSBzbG90ICovCit9OworCisvKioKKyAqIEFuIGFsbG9jYXRvciB0aGF0IHRyYWNrcyBhIHNldCBvZiBzbG90IElEcy4KKyAqLworc3RydWN0IERCdXNEYXRhU2xvdEFsbG9jYXRvcgoreworICBEQnVzQWxsb2NhdGVkU2xvdCAqYWxsb2NhdGVkX3Nsb3RzOyAvKio8IEFsbG9jYXRlZCBzbG90cyAqLworICBpbnQgIG5fYWxsb2NhdGVkX3Nsb3RzOyAvKio8IG51bWJlciBvZiBzbG90cyBtYWxsb2MnZCAqLworICBpbnQgIG5fdXNlZF9zbG90czsgICAgICAvKio8IG51bWJlciBvZiBzbG90cyB1c2VkICovCisgIERCdXNSTXV0ZXggKipsb2NrX2xvYzsgIC8qKjwgbG9jYXRpb24gb2YgdGhyZWFkIGxvY2sgKi8KK307CisKKy8qKgorICogRGF0YSBzdHJ1Y3R1cmUgdGhhdCBzdG9yZXMgdGhlIGFjdHVhbCB1c2VyIGRhdGEgc2V0IGF0IGEgZ2l2ZW4KKyAqIHNsb3QuCisgKi8KK3N0cnVjdCBEQnVzRGF0YVNsb3RMaXN0Cit7CisgIERCdXNEYXRhU2xvdCAqc2xvdHM7ICAgLyoqPCBEYXRhIHNsb3RzICovCisgIGludCAgICAgICAgICAgbl9zbG90czsgLyoqPCBTbG90cyB3ZSBoYXZlIHN0b3JhZ2UgZm9yIGluIGRhdGFfc2xvdHMgKi8KK307CisKK2RidXNfYm9vbF90IF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfaW5pdCAgKERCdXNEYXRhU2xvdEFsbG9jYXRvciAgKmFsbG9jYXRvcik7CitkYnVzX2Jvb2xfdCBfZGJ1c19kYXRhX3Nsb3RfYWxsb2NhdG9yX2FsbG9jIChEQnVzRGF0YVNsb3RBbGxvY2F0b3IgICphbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUk11dGV4ICAgICAgICAgICAgICoqbXV0ZXhfbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAqc2xvdF9pZF9wKTsKK3ZvaWQgICAgICAgIF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfZnJlZSAgKERCdXNEYXRhU2xvdEFsbG9jYXRvciAgKmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgKnNsb3RfaWRfcCk7Cit2b2lkICAgICAgICBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9pbml0ICAgICAgIChEQnVzRGF0YVNsb3RMaXN0ICAgICAgICpsaXN0KTsKK2RidXNfYm9vbF90IF9kYnVzX2RhdGFfc2xvdF9saXN0X3NldCAgICAgICAgKERCdXNEYXRhU2xvdEFsbG9jYXRvciAgKmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNEYXRhU2xvdExpc3QgICAgICAgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgIGZyZWVfZGF0YV9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAqb2xkX2ZyZWVfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAqKm9sZF9kYXRhKTsKK3ZvaWQqICAgICAgIF9kYnVzX2RhdGFfc2xvdF9saXN0X2dldCAgICAgICAgKERCdXNEYXRhU2xvdEFsbG9jYXRvciAgKmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNEYXRhU2xvdExpc3QgICAgICAgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBzbG90KTsKK3ZvaWQgICAgICAgIF9kYnVzX2RhdGFfc2xvdF9saXN0X2NsZWFyICAgICAgKERCdXNEYXRhU2xvdExpc3QgICAgICAgKmxpc3QpOwordm9pZCAgICAgICAgX2RidXNfZGF0YV9zbG90X2xpc3RfZnJlZSAgICAgICAoREJ1c0RhdGFTbG90TGlzdCAgICAgICAqbGlzdCk7CisKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfREFUQVNMT1RfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtZXJyb3JzLmMgYi9kYnVzL2RidXMvZGJ1cy1lcnJvcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjMzMDViCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtZXJyb3JzLmMKQEAgLTAsMCArMSw0MjIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1lcnJvcnMuYyBFcnJvciByZXBvcnRpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDQgIFJlZCBIYXQgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1lcnJvcnMuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzRXJyb3JJbnRlcm5hbHMgRXJyb3IgcmVwb3J0aW5nIGludGVybmFscworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBFcnJvciByZXBvcnRpbmcgaW50ZXJuYWxzCisgKiBAeworICovCisKKy8qKgorICogQGRlZiBEQlVTX0VSUk9SX0lOSVQKKyAqCisgKiBFeHBhbmRzIHRvIGEgc3VpdGFibGUgaW5pdGlhbGl6ZXIgZm9yIGEgREJ1c0Vycm9yIG9uIHRoZSBzdGFjay4KKyAqIERlY2xhcmluZyBhIERCdXNFcnJvciB3aXRoOgorICoKKyAqIEBjb2RlCisgKiBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgKgorICogZG9fdGhpbmdzX3dpdGggKCZlcnJvcik7CisgKiBAZW5kY29kZQorICoKKyAqIGlzIGEgbW9yZSBjb25jaXNlIGZvcm0gb2Y6CisgKgorICogQGNvZGUKKyAqIERCdXNFcnJvciBlcnJvcjsKKyAqCisgKiBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgKiBkb190aGluZ3Nfd2l0aCAoJmVycm9yKTsKKyAqIEBlbmRjb2RlCisgKi8KKworLyoqCisgKiBJbnRlcm5hbHMgb2YgREJ1c0Vycm9yCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIGNoYXIgKm5hbWU7IC8qKjwgZXJyb3IgbmFtZSAqLworICBjaGFyICptZXNzYWdlOyAvKio8IGVycm9yIG1lc3NhZ2UgKi8KKworICB1bnNpZ25lZCBpbnQgY29uc3RfbWVzc2FnZSA6IDE7IC8qKjwgTWVzc2FnZSBpcyBub3Qgb3duZWQgYnkgREJ1c0Vycm9yICovCisKKyAgdW5zaWduZWQgaW50IGR1bW15MiA6IDE7IC8qKjwgcGxhY2Vob2xkZXIgKi8KKyAgdW5zaWduZWQgaW50IGR1bW15MyA6IDE7IC8qKjwgcGxhY2Vob2xkZXIgKi8KKyAgdW5zaWduZWQgaW50IGR1bW15NCA6IDE7IC8qKjwgcGxhY2Vob2xkZXIgKi8KKyAgdW5zaWduZWQgaW50IGR1bW15NSA6IDE7IC8qKjwgcGxhY2Vob2xkZXIgKi8KKworICB2b2lkICpwYWRkaW5nMTsgLyoqPCBwbGFjZWhvbGRlciAqLworICAKK30gREJ1c1JlYWxFcnJvcjsKKworX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChEQnVzUmVhbEVycm9yKSA9PSBzaXplb2YgKERCdXNFcnJvcikpOworCisvKioKKyAqIFJldHVybnMgYSBsb25nZXIgbWVzc2FnZSBkZXNjcmliaW5nIGFuIGVycm9yIG5hbWUuCisgKiBJZiB0aGUgZXJyb3IgbmFtZSBpcyB1bmtub3duLCByZXR1cm5zIHRoZSBuYW1lCisgKiBpdHNlbGYuCisgKgorICogQHBhcmFtIGVycm9yIHRoZSBlcnJvciB0byBkZXNjcmliZQorICogQHJldHVybnMgYSBjb25zdGFudCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyKgorbWVzc2FnZV9mcm9tX2Vycm9yIChjb25zdCBjaGFyICplcnJvcikKK3sKKyAgaWYgKHN0cmNtcCAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVEKSA9PSAwKQorICAgIHJldHVybiAiVW5rbm93biBlcnJvciI7CisgIGVsc2UgaWYgKHN0cmNtcCAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSA9PSAwKQorICAgIHJldHVybiAiTm90IGVub3VnaCBtZW1vcnkgYXZhaWxhYmxlIjsKKyAgZWxzZSBpZiAoc3RyY21wIChlcnJvciwgREJVU19FUlJPUl9JT19FUlJPUikgPT0gMCkKKyAgICByZXR1cm4gIkVycm9yIHJlYWRpbmcgb3Igd3JpdGluZyBkYXRhIjsKKyAgZWxzZSBpZiAoc3RyY21wIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUykgPT0gMCkKKyAgICByZXR1cm4gIkNvdWxkIG5vdCBwYXJzZSBhZGRyZXNzIjsKKyAgZWxzZSBpZiAoc3RyY21wIChlcnJvciwgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVEKSA9PSAwKQorICAgIHJldHVybiAiRmVhdHVyZSBub3Qgc3VwcG9ydGVkIjsKKyAgZWxzZSBpZiAoc3RyY21wIChlcnJvciwgREJVU19FUlJPUl9MSU1JVFNfRVhDRUVERUQpID09IDApCisgICAgcmV0dXJuICJSZXNvdXJjZSBsaW1pdHMgZXhjZWVkZWQiOworICBlbHNlIGlmIChzdHJjbXAgKGVycm9yLCBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQpID09IDApCisgICAgcmV0dXJuICJQZXJtaXNzaW9uIGRlbmllZCI7CisgIGVsc2UgaWYgKHN0cmNtcCAoZXJyb3IsIERCVVNfRVJST1JfQVVUSF9GQUlMRUQpID09IDApCisgICAgcmV0dXJuICJDb3VsZCBub3QgYXV0aGVudGljYXRlIHRvIHNlcnZlciI7CisgIGVsc2UgaWYgKHN0cmNtcCAoZXJyb3IsIERCVVNfRVJST1JfTk9fU0VSVkVSKSA9PSAwKQorICAgIHJldHVybiAiTm8gc2VydmVyIGF2YWlsYWJsZSBhdCBhZGRyZXNzIjsKKyAgZWxzZSBpZiAoc3RyY21wIChlcnJvciwgREJVU19FUlJPUl9USU1FT1VUKSA9PSAwKQorICAgIHJldHVybiAiQ29ubmVjdGlvbiB0aW1lZCBvdXQiOworICBlbHNlIGlmIChzdHJjbXAgKGVycm9yLCBEQlVTX0VSUk9SX05PX05FVFdPUkspID09IDApCisgICAgcmV0dXJuICJOZXR3b3JrIHVuYXZhaWxhYmxlIjsKKyAgZWxzZSBpZiAoc3RyY21wIChlcnJvciwgREJVU19FUlJPUl9BRERSRVNTX0lOX1VTRSkgPT0gMCkKKyAgICByZXR1cm4gIkFkZHJlc3MgYWxyZWFkeSBpbiB1c2UiOworICBlbHNlIGlmIChzdHJjbXAgKGVycm9yLCBEQlVTX0VSUk9SX0RJU0NPTk5FQ1RFRCkgPT0gMCkKKyAgICByZXR1cm4gIkRpc2Nvbm5lY3RlZC4iOworICBlbHNlIGlmIChzdHJjbXAgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUykgPT0gMCkKKyAgICByZXR1cm4gIkludmFsaWQgYXJndW1lbnRzLiI7CisgIGVsc2UgaWYgKHN0cmNtcCAoZXJyb3IsIERCVVNfRVJST1JfTk9fUkVQTFkpID09IDApCisgICAgcmV0dXJuICJEaWQgbm90IGdldCBhIHJlcGx5IG1lc3NhZ2UuIjsKKyAgZWxzZSBpZiAoc3RyY21wIChlcnJvciwgREJVU19FUlJPUl9GSUxFX05PVF9GT1VORCkgPT0gMCkKKyAgICByZXR1cm4gIkZpbGUgZG9lc24ndCBleGlzdC4iOworICBlbHNlIGlmIChzdHJjbXAgKGVycm9yLCBEQlVTX0VSUk9SX09CSkVDVF9QQVRIX0lOX1VTRSkgPT0gMCkKKyAgICByZXR1cm4gIk9iamVjdCBwYXRoIGFscmVhZHkgaW4gdXNlIjsKKyAgZWxzZQorICAgIHJldHVybiBlcnJvcjsKK30KKworLyoqIEB9ICovIC8qIEVuZCBvZiBpbnRlcm5hbHMgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0Vycm9ycyBFcnJvciByZXBvcnRpbmcKKyAqIEBpbmdyb3VwICBEQnVzCisgKiBAYnJpZWYgRXJyb3IgcmVwb3J0aW5nCisgKgorICogVHlwZXMgYW5kIGZ1bmN0aW9ucyByZWxhdGVkIHRvIHJlcG9ydGluZyBlcnJvcnMuCisgKgorICoKKyAqIEluIGVzc2VuY2UgRC1CdXMgZXJyb3IgcmVwb3J0aW5nIHdvcmtzIGFzIGZvbGxvd3M6CisgKgorICogQGNvZGUKKyAqIERCdXNFcnJvciBlcnJvcjsKKyAqIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAqIGRidXNfc29tZV9mdW5jdGlvbiAoYXJnMSwgYXJnMiwgJmVycm9yKTsKKyAqIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAqICAgeworICogICAgIGZwcmludGYgKHN0ZGVyciwgImFuIGVycm9yIG9jY3VycmVkOiAlc1xuIiwgZXJyb3IubWVzc2FnZSk7CisgKiAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICogICB9CisgKiBAZW5kY29kZQorICoKKyAqIEJ5IGNvbnZlbnRpb24sIGFsbCBmdW5jdGlvbnMgYWxsb3cgI05VTEwgaW5zdGVhZCBvZiBhIERCdXNFcnJvciosCisgKiBzbyBjYWxsZXJzIHdobyBkb24ndCBjYXJlIGFib3V0IHRoZSBlcnJvciBjYW4gaWdub3JlIGl0LgorICogCisgKiBUaGVyZSBhcmUgc29tZSBydWxlcy4gQW4gZXJyb3IgcGFzc2VkIHRvIGEgRC1CdXMgZnVuY3Rpb24gbXVzdAorICogYWx3YXlzIGJlIHVuc2V0OyB5b3UgY2FuJ3QgcGFzcyBpbiBhbiBlcnJvciB0aGF0J3MgYWxyZWFkeSBzZXQuICBJZgorICogYSBmdW5jdGlvbiBoYXMgYSByZXR1cm4gY29kZSBpbmRpY2F0aW5nIHdoZXRoZXIgYW4gZXJyb3Igb2NjdXJyZWQsCisgKiBhbmQgYWxzbyBhICNEQnVzRXJyb3IgcGFyYW1ldGVyLCB0aGVuIHRoZSBlcnJvciB3aWxsIGFsd2F5cyBiZSBzZXQKKyAqIGlmIGFuZCBvbmx5IGlmIHRoZSByZXR1cm4gY29kZSBpbmRpY2F0ZXMgYW4gZXJyb3Igb2NjdXJyZWQuIGkuZS4KKyAqIHRoZSByZXR1cm4gY29kZSBhbmQgdGhlIGVycm9yIGFyZSBuZXZlciBnb2luZyB0byBkaXNhZ3JlZS4KKyAqCisgKiBBbiBlcnJvciBvbmx5IG5lZWRzIHRvIGJlIGZyZWVkIGlmIGl0J3MgYmVlbiBzZXQsIG5vdCBpZgorICogaXQncyBtZXJlbHkgYmVlbiBpbml0aWFsaXplZC4KKyAqCisgKiBZb3UgY2FuIGNoZWNrIHRoZSBzcGVjaWZpYyBlcnJvciB0aGF0IG9jY3VycmVkIHVzaW5nCisgKiBkYnVzX2Vycm9yX2hhc19uYW1lKCkuCisgKiAKKyAqIEVycm9ycyB3aWxsIG5vdCBiZSBzZXQgZm9yIHByb2dyYW1taW5nIGVycm9ycywgc3VjaCBhcyBwYXNzaW5nCisgKiBpbnZhbGlkIGFyZ3VtZW50cyB0byB0aGUgbGliZGJ1cyBBUEkuIEluc3RlYWQsIGxpYmRidXMgd2lsbCBwcmludAorICogd2FybmluZ3MsIGV4aXQgb24gYSBmYWlsZWQgYXNzZXJ0aW9uLCBvciBldmVuIGNyYXNoIGluIHRob3NlIGNhc2VzCisgKiAoaW4gb3RoZXIgd29yZHMsIGluY29ycmVjdCB1c2Ugb2YgdGhlIEFQSSByZXN1bHRzIGluIHVuZGVmaW5lZAorICogYmVoYXZpb3IsIHBvc3NpYmx5IGFjY29tcGFuaWVkIGJ5IGhlbHBmdWwgZGVidWdnaW5nIG91dHB1dCBpZgorICogeW91J3JlIGx1Y2t5KS4KKyAqIAorICogQHsKKyAqLworCisvKioKKyAqIEluaXRpYWxpemVzIGEgREJ1c0Vycm9yIHN0cnVjdHVyZS4gRG9lcyBub3QgYWxsb2NhdGUgYW55IG1lbW9yeTsKKyAqIHRoZSBlcnJvciBvbmx5IG5lZWRzIHRvIGJlIGZyZWVkIGlmIGl0IGlzIHNldCBhdCBzb21lIHBvaW50LgorICoKKyAqIEBwYXJhbSBlcnJvciB0aGUgREJ1c0Vycm9yLgorICovCit2b2lkCitkYnVzX2Vycm9yX2luaXQgKERCdXNFcnJvciAqZXJyb3IpCit7CisgIERCdXNSZWFsRXJyb3IgKnJlYWw7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGVycm9yICE9IE5VTEwpOworCisgIF9kYnVzX2Fzc2VydCAoc2l6ZW9mIChEQnVzRXJyb3IpID09IHNpemVvZiAoREJ1c1JlYWxFcnJvcikpOworCisgIHJlYWwgPSAoREJ1c1JlYWxFcnJvciAqKWVycm9yOworICAKKyAgcmVhbC0+bmFtZSA9IE5VTEw7ICAKKyAgcmVhbC0+bWVzc2FnZSA9IE5VTEw7CisKKyAgcmVhbC0+Y29uc3RfbWVzc2FnZSA9IFRSVUU7Cit9CisKKy8qKgorICogRnJlZXMgYW4gZXJyb3IgdGhhdCdzIGJlZW4gc2V0IChvciBqdXN0IGluaXRpYWxpemVkKSwKKyAqIHRoZW4gcmVpbml0aWFsaXplcyB0aGUgZXJyb3IgYXMgaW4gZGJ1c19lcnJvcl9pbml0KCkuCisgKgorICogQHBhcmFtIGVycm9yIG1lbW9yeSB3aGVyZSB0aGUgZXJyb3IgaXMgc3RvcmVkLgorICovCit2b2lkCitkYnVzX2Vycm9yX2ZyZWUgKERCdXNFcnJvciAqZXJyb3IpCit7CisgIERCdXNSZWFsRXJyb3IgKnJlYWw7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGVycm9yICE9IE5VTEwpOworICAKKyAgcmVhbCA9IChEQnVzUmVhbEVycm9yICopZXJyb3I7CisKKyAgaWYgKCFyZWFsLT5jb25zdF9tZXNzYWdlKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAocmVhbC0+bmFtZSk7CisgICAgICBkYnVzX2ZyZWUgKHJlYWwtPm1lc3NhZ2UpOworICAgIH0KKworICBkYnVzX2Vycm9yX2luaXQgKGVycm9yKTsKK30KKworLyoqCisgKiBBc3NpZ25zIGFuIGVycm9yIG5hbWUgYW5kIG1lc3NhZ2UgdG8gYSBEQnVzRXJyb3IuICBEb2VzIG5vdGhpbmcgaWYKKyAqIGVycm9yIGlzICNOVUxMLiBUaGUgbWVzc2FnZSBtYXkgYmUgI05VTEwsIHdoaWNoIG1lYW5zIGEgZGVmYXVsdAorICogbWVzc2FnZSB3aWxsIGJlIGRlZHVjZWQgZnJvbSB0aGUgbmFtZS4gVGhlIGRlZmF1bHQgbWVzc2FnZSB3aWxsIGJlCisgKiB0b3RhbGx5IHVzZWxlc3MsIHRob3VnaCwgc28gdXNpbmcgYSAjTlVMTCBtZXNzYWdlIGlzIG5vdCByZWNvbW1lbmRlZC4KKyAqCisgKiBCZWNhdXNlIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgY29weSB0aGUgZXJyb3IgbmFtZSBvciBtZXNzYWdlLCB5b3UKKyAqIG11c3QgZW5zdXJlIHRoZSBuYW1lIGFuZCBtZXNzYWdlIGFyZSBnbG9iYWwgZGF0YSB0aGF0IHdvbid0IGJlCisgKiBmcmVlZC4gWW91IHByb2JhYmx5IHdhbnQgZGJ1c19zZXRfZXJyb3IoKSBpbnN0ZWFkLCBpbiBtb3N0IGNhc2VzLgorICogCisgKiBAcGFyYW0gZXJyb3IgdGhlIGVycm9yLm9yICNOVUxMCisgKiBAcGFyYW0gbmFtZSB0aGUgZXJyb3IgbmFtZSAobm90IGNvcGllZCEhISkKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlIChub3QgY29waWVkISEhKQorICovCit2b2lkCitkYnVzX3NldF9lcnJvcl9jb25zdCAoREJ1c0Vycm9yICAqZXJyb3IsCisJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisgIERCdXNSZWFsRXJyb3IgKnJlYWw7CisKKyAgX2RidXNfcmV0dXJuX2lmX2Vycm9yX2lzX3NldCAoZXJyb3IpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAobmFtZSAhPSBOVUxMKTsKKyAgCisgIGlmIChlcnJvciA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBfZGJ1c19hc3NlcnQgKGVycm9yLT5uYW1lID09IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGVycm9yLT5tZXNzYWdlID09IE5VTEwpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgbWVzc2FnZSA9IG1lc3NhZ2VfZnJvbV9lcnJvciAobmFtZSk7CisgIAorICByZWFsID0gKERCdXNSZWFsRXJyb3IgKillcnJvcjsKKyAgCisgIHJlYWwtPm5hbWUgPSAoY2hhciopIG5hbWU7CisgIHJlYWwtPm1lc3NhZ2UgPSAoY2hhciAqKW1lc3NhZ2U7CisgIHJlYWwtPmNvbnN0X21lc3NhZ2UgPSBUUlVFOworfQorCisvKioKKyAqIE1vdmVzIGFuIGVycm9yIHNyYyBpbnRvIGRlc3QsIGZyZWVpbmcgc3JjIGFuZAorICogb3ZlcndyaXRpbmcgZGVzdC4gQm90aCBzcmMgYW5kIGRlc3QgbXVzdCBiZSBpbml0aWFsaXplZC4KKyAqIHNyYyBpcyByZWluaXRpYWxpemVkIHRvIGFuIGVtcHR5IGVycm9yLiBkZXN0IG1heSBub3QKKyAqIGNvbnRhaW4gYW4gZXhpc3RpbmcgZXJyb3IuIElmIHRoZSBkZXN0aW5hdGlvbiBpcworICogI05VTEwsIGp1c3QgZnJlZXMgYW5kIHJlaW5pdHMgdGhlIHNvdXJjZSBlcnJvci4KKyAqIAorICogQHBhcmFtIHNyYyB0aGUgc291cmNlIGVycm9yCisgKiBAcGFyYW0gZGVzdCB0aGUgZGVzdGluYXRpb24gZXJyb3Igb3IgI05VTEwKKyAqLwordm9pZAorZGJ1c19tb3ZlX2Vycm9yIChEQnVzRXJyb3IgKnNyYywKKyAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICpkZXN0KQoreworICBfZGJ1c19yZXR1cm5faWZfZXJyb3JfaXNfc2V0IChkZXN0KTsKKworICBpZiAoZGVzdCkKKyAgICB7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKGRlc3QpOworICAgICAgKmRlc3QgPSAqc3JjOworICAgICAgZGJ1c19lcnJvcl9pbml0IChzcmMpOworICAgIH0KKyAgZWxzZQorICAgIGRidXNfZXJyb3JfZnJlZSAoc3JjKTsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciB0aGUgZXJyb3IgaXMgc2V0IGFuZCBoYXMgdGhlIGdpdmVuCisgKiBuYW1lLgorICogQHBhcmFtIGVycm9yIHRoZSBlcnJvcgorICogQHBhcmFtIG5hbWUgdGhlIG5hbWUKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBnaXZlbiBuYW1lZCBlcnJvciBvY2N1cnJlZAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19lcnJvcl9oYXNfbmFtZSAoY29uc3QgREJ1c0Vycm9yICplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqbmFtZSkKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChlcnJvciAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobmFtZSAhPSBOVUxMLCBGQUxTRSk7CisKKyAgX2RidXNfYXNzZXJ0ICgoZXJyb3ItPm5hbWUgIT0gTlVMTCAmJiBlcnJvci0+bWVzc2FnZSAhPSBOVUxMKSB8fAorICAgICAgICAgICAgICAgIChlcnJvci0+bmFtZSA9PSBOVUxMICYmIGVycm9yLT5tZXNzYWdlID09IE5VTEwpKTsKKyAgCisgIGlmIChlcnJvci0+bmFtZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgc3RyMSwgc3RyMjsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyMSwgZXJyb3ItPm5hbWUpOworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIyLCBuYW1lKTsKKyAgICAgIHJldHVybiBfZGJ1c19zdHJpbmdfZXF1YWwgKCZzdHIxLCAmc3RyMik7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIGFuIGVycm9yIG9jY3VycmVkICh0aGUgZXJyb3IgaXMgc2V0KS4KKyAqCisgKiBAcGFyYW0gZXJyb3IgdGhlIGVycm9yIG9iamVjdAorICogQHJldHVybnMgI1RSVUUgaWYgYW4gZXJyb3Igb2NjdXJyZWQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfZXJyb3JfaXNfc2V0IChjb25zdCBEQnVzRXJyb3IgKmVycm9yKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGVycm9yICE9IE5VTEwsIEZBTFNFKTsgIAorICBfZGJ1c19hc3NlcnQgKChlcnJvci0+bmFtZSAhPSBOVUxMICYmIGVycm9yLT5tZXNzYWdlICE9IE5VTEwpIHx8CisgICAgICAgICAgICAgICAgKGVycm9yLT5uYW1lID09IE5VTEwgJiYgZXJyb3ItPm1lc3NhZ2UgPT0gTlVMTCkpOworICByZXR1cm4gZXJyb3ItPm5hbWUgIT0gTlVMTDsKK30KKworLyoqCisgKiBBc3NpZ25zIGFuIGVycm9yIG5hbWUgYW5kIG1lc3NhZ2UgdG8gYSBEQnVzRXJyb3IuCisgKiBEb2VzIG5vdGhpbmcgaWYgZXJyb3IgaXMgI05VTEwuCisgKgorICogVGhlIGZvcm1hdCBtYXkgYmUgI05VTEwsIHdoaWNoIG1lYW5zIGEgKHByZXR0eSBtdWNoIHVzZWxlc3MpCisgKiBkZWZhdWx0IG1lc3NhZ2Ugd2lsbCBiZSBkZWR1Y2VkIGZyb20gdGhlIG5hbWUuIFRoaXMgaXMgbm90IGEgZ29vZAorICogaWRlYSwganVzdCBnbyBhaGVhZCBhbmQgcHJvdmlkZSBhIHVzZWZ1bCBlcnJvciBtZXNzYWdlLiBJdCB3b24ndAorICogaHVydCB5b3UuCisgKgorICogSWYgbm8gbWVtb3J5IGNhbiBiZSBhbGxvY2F0ZWQgZm9yIHRoZSBlcnJvciBtZXNzYWdlLCAKKyAqIGFuIG91dC1vZi1tZW1vcnkgZXJyb3IgbWVzc2FnZSB3aWxsIGJlIHNldCBpbnN0ZWFkLgorICoKKyAqIEBwYXJhbSBlcnJvciB0aGUgZXJyb3Iub3IgI05VTEwKKyAqIEBwYXJhbSBuYW1lIHRoZSBlcnJvciBuYW1lCisgKiBAcGFyYW0gZm9ybWF0IHByaW50Zi1zdHlsZSBmb3JtYXQgc3RyaW5nLgorICovCit2b2lkCitkYnVzX3NldF9lcnJvciAoREJ1c0Vycm9yICAqZXJyb3IsCisJCWNvbnN0IGNoYXIgKm5hbWUsCisJCWNvbnN0IGNoYXIgKmZvcm1hdCwKKwkJLi4uKQoreworICBEQnVzUmVhbEVycm9yICpyZWFsOworICBEQnVzU3RyaW5nIHN0cjsKKyAgdmFfbGlzdCBhcmdzOworICAKKyAgaWYgKGVycm9yID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIC8qIGl0J3MgYSBidWcgdG8gcGlsZSB1cCBlcnJvcnMgKi8KKyAgX2RidXNfcmV0dXJuX2lmX2Vycm9yX2lzX3NldCAoZXJyb3IpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAobmFtZSAhPSBOVUxMKTsKKyAgCisgIF9kYnVzX2Fzc2VydCAoZXJyb3ItPm5hbWUgPT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoZXJyb3ItPm1lc3NhZ2UgPT0gTlVMTCk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgZ290byBub21lbTsKKyAgCisgIGlmIChmb3JtYXQgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfZnJvbV9lcnJvciAobmFtZSkpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICAgICAgICAgIHZhX2VuZCAoYXJncyk7CisgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50Zl92YWxpc3QgKCZzdHIsIGZvcm1hdCwgYXJncykpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgICAgICAgICAgdmFfZW5kIChhcmdzKTsKKyAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICB9CisgICAgICB2YV9lbmQgKGFyZ3MpOworICAgIH0KKworICByZWFsID0gKERCdXNSZWFsRXJyb3IgKillcnJvcjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgmc3RyLCAmcmVhbC0+bWVzc2FnZSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICAgICAgZ290byBub21lbTsKKyAgICB9CisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgCisgIHJlYWwtPm5hbWUgPSBfZGJ1c19zdHJkdXAgKG5hbWUpOworICBpZiAocmVhbC0+bmFtZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAocmVhbC0+bWVzc2FnZSk7CisgICAgICByZWFsLT5tZXNzYWdlID0gTlVMTDsKKyAgICAgIGdvdG8gbm9tZW07CisgICAgfQorICByZWFsLT5jb25zdF9tZXNzYWdlID0gRkFMU0U7CisKKyAgcmV0dXJuOworICAKKyBub21lbToKKyAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworfQorCisvKiogQH0gKi8gLyogRW5kIHB1YmxpYyBBUEkgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLWVycm9ycy5oIGIvZGJ1cy9kYnVzL2RidXMtZXJyb3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYzMTM5YQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLWVycm9ycy5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1lcnJvcnMuaCBFcnJvciByZXBvcnRpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFJlZCBIYXQgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmICFkZWZpbmVkIChEQlVTX0lOU0lERV9EQlVTX0gpICYmICFkZWZpbmVkIChEQlVTX0NPTVBJTEFUSU9OKQorI2Vycm9yICJPbmx5IDxkYnVzL2RidXMuaD4gY2FuIGJlIGluY2x1ZGVkIGRpcmVjdGx5LCB0aGlzIGZpbGUgbWF5IGRpc2FwcGVhciBvciBjaGFuZ2UgY29udGVudHMuIgorI2VuZGlmCisKKyNpZm5kZWYgREJVU19FUlJPUl9ICisjZGVmaW5lIERCVVNfRVJST1JfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1wcm90b2NvbC5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0Vycm9ycworICogQHsKKyAqLworCisvKiogTW9zdGx5LW9wYXF1ZSB0eXBlIHJlcHJlc2VudGluZyBhbiBlcnJvciB0aGF0IG9jY3VycmVkICovCit0eXBlZGVmIHN0cnVjdCBEQnVzRXJyb3IgREJ1c0Vycm9yOworCisvKioKKyAqIE9iamVjdCByZXByZXNlbnRpbmcgYW4gZXhjZXB0aW9uLgorICovCitzdHJ1Y3QgREJ1c0Vycm9yCit7CisgIGNvbnN0IGNoYXIgKm5hbWU7ICAgIC8qKjwgcHVibGljIGVycm9yIG5hbWUgZmllbGQgKi8KKyAgY29uc3QgY2hhciAqbWVzc2FnZTsgLyoqPCBwdWJsaWMgZXJyb3IgbWVzc2FnZSBmaWVsZCAqLworCisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAxOyAvKio8IHBsYWNlaG9sZGVyICovCisgIHVuc2lnbmVkIGludCBkdW1teTIgOiAxOyAvKio8IHBsYWNlaG9sZGVyICovCisgIHVuc2lnbmVkIGludCBkdW1teTMgOiAxOyAvKio8IHBsYWNlaG9sZGVyICovCisgIHVuc2lnbmVkIGludCBkdW1teTQgOiAxOyAvKio8IHBsYWNlaG9sZGVyICovCisgIHVuc2lnbmVkIGludCBkdW1teTUgOiAxOyAvKio8IHBsYWNlaG9sZGVyICovCisKKyAgdm9pZCAqcGFkZGluZzE7IC8qKjwgcGxhY2Vob2xkZXIgKi8KK307CisKKyNkZWZpbmUgREJVU19FUlJPUl9JTklUIHsgTlVMTCwgTlVMTCwgVFJVRSwgMCwgMCwgMCwgMCwgTlVMTCB9CisKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX2Vycm9yX2luaXQgICAgICAoREJ1c0Vycm9yICAgICAgICplcnJvcik7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19lcnJvcl9mcmVlICAgICAgKERCdXNFcnJvciAgICAgICAqZXJyb3IpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfc2V0X2Vycm9yICAgICAgIChEQnVzRXJyb3IgICAgICAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX3NldF9lcnJvcl9jb25zdCAoREJ1c0Vycm9yICAgICAgICplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICptZXNzYWdlKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX21vdmVfZXJyb3IgICAgICAoREJ1c0Vycm9yICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICpkZXN0KTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX2Vycm9yX2hhc19uYW1lICAoY29uc3QgREJ1c0Vycm9yICplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgKm5hbWUpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfZXJyb3JfaXNfc2V0ICAgIChjb25zdCBEQnVzRXJyb3IgKmVycm9yKTsKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX0VSUk9SX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLWZpbGUtdW5peC5jIGIvZGJ1cy9kYnVzL2RidXMtZmlsZS11bml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk3NTkzMwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLWZpbGUtdW5peC5jCkBAIC0wLDAgKzEsNDE3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtZmlsZS11bml4LmMgdW5peCByZWxhdGVkIGZpbGUgaW1wbGVtZW50YXRpb24gKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDYgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSAiZGJ1cy1lcnJvcnMuaCIKKyNpbmNsdWRlICJkYnVzLWZpbGUuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy11bml4LmgiCisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaWZuZGVmIE9fQklOQVJZCisjZGVmaW5lIE9fQklOQVJZIDAKKyNlbmRpZgorCisvKioKKyAqIEFwcGVuZHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBmaWxlIHRvIHRoZSBzdHJpbmcsCisgKiByZXR1cm5pbmcgZXJyb3IgY29kZS4gQXQgdGhlIG1vbWVudCwgd29uJ3Qgb3BlbiBhIGZpbGUKKyAqIG1vcmUgdGhhbiBhIG1lZ2FieXRlIGluIHNpemUuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIGFwcGVuZCB0bworICogQHBhcmFtIGZpbGVuYW1lIGZpbGVuYW1lIHRvIGxvYWQKKyAqIEBwYXJhbSBlcnJvciBwbGFjZSB0byBzZXQgYW4gZXJyb3IKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciB3YXMgc2V0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19maWxlX2dldF9jb250ZW50cyAoREJ1c1N0cmluZyAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBpbnQgZmQ7CisgIHN0cnVjdCBzdGF0IHNiOworICBpbnQgb3JpZ19sZW47CisgIGludCB0b3RhbDsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWVfYzsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIGZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKyAgCisgIC8qIE9fQklOQVJZIHVzZWZ1bCBvbiBDeWd3aW4gKi8KKyAgZmQgPSBvcGVuIChmaWxlbmFtZV9jLCBPX1JET05MWSB8IE9fQklOQVJZKTsKKyAgaWYgKGZkIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIG9wZW4gXCIlc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfYywKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoImZpbGUgZmQgJWQgb3BlbmVkXG4iLCBmZCk7CisgIAorICBpZiAoZnN0YXQgKGZkLCAmc2IpIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHN0YXQgXCIlc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfYywKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoImZzdGF0KCkgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIAorICAgICAgX2RidXNfY2xvc2UgKGZkLCBOVUxMKTsKKyAgICAgIAorICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoc2Iuc3Rfc2l6ZSA+IF9EQlVTX09ORV9NRUdBQllURSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJGaWxlIHNpemUgJWx1IG9mIFwiJXNcIiBpcyB0b28gbGFyZ2UuIiwKKyAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgc2Iuc3Rfc2l6ZSwgZmlsZW5hbWVfYyk7CisgICAgICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIHRvdGFsID0gMDsKKyAgb3JpZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKyAgaWYgKHNiLnN0X3NpemUgPiAwICYmIFNfSVNSRUcgKHNiLnN0X21vZGUpKQorICAgIHsKKyAgICAgIGludCBieXRlc19yZWFkOworCisgICAgICB3aGlsZSAodG90YWwgPCAoaW50KSBzYi5zdF9zaXplKQorICAgICAgICB7CisgICAgICAgICAgYnl0ZXNfcmVhZCA9IF9kYnVzX3JlYWQgKGZkLCBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLnN0X3NpemUgLSB0b3RhbCk7CisgICAgICAgICAgaWYgKGJ5dGVzX3JlYWQgPD0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgcmVhZGluZyBcIiVzXCI6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgicmVhZCgpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChzdHIsIG9yaWdfbGVuKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRvdGFsICs9IGJ5dGVzX3JlYWQ7CisgICAgICAgIH0KKworICAgICAgX2RidXNfY2xvc2UgKGZkLCBOVUxMKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZSBpZiAoc2Iuc3Rfc2l6ZSAhPSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDYW4gb25seSBvcGVuIHJlZ3VsYXIgZmlsZXMgYXQgdGhlIG1vbWVudC5cbiIpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiXCIlc1wiIGlzIG5vdCBhIHJlZ3VsYXIgZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfYyk7CisgICAgICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9Cit9CisKKy8qKgorICogV3JpdGVzIGEgc3RyaW5nIG91dCB0byBhIGZpbGUuIElmIHRoZSBmaWxlIGV4aXN0cywKKyAqIGl0IHdpbGwgYmUgYXRvbWljYWxseSBvdmVyd3JpdHRlbiBieSB0aGUgbmV3IGRhdGEuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIHdyaXRlIG91dAorICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlIHRvIHNhdmUgc3RyaW5nIHRvCisgKiBAcGFyYW0gd29ybGRfcmVhZGFibGUgSWYgc2V0LCBlbnN1cmUgdGhlIGZpbGUgaXMgd29ybGQgcmVhZGFibGUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciB0byBiZSBmaWxsZWQgaW4gb24gZmFpbHVyZQorICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19zYXZlX3RvX2ZpbGUgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICB3b3JsZF9yZWFkYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBpbnQgZmQ7CisgIGludCBieXRlc190b193cml0ZTsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWVfYzsKKyAgREJ1c1N0cmluZyB0bXBfZmlsZW5hbWU7CisgIGNvbnN0IGNoYXIgKnRtcF9maWxlbmFtZV9jOworICBpbnQgdG90YWw7CisgIGRidXNfYm9vbF90IG5lZWRfdW5saW5rOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICBmZCA9IC0xOworICByZXR2YWwgPSBGQUxTRTsKKyAgbmVlZF91bmxpbmsgPSBGQUxTRTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ0bXBfZmlsZW5hbWUpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5IChmaWxlbmFtZSwgMCwgJnRtcF9maWxlbmFtZSwgMCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRtcF9maWxlbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmdG1wX2ZpbGVuYW1lLCAiLiIpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0bXBfZmlsZW5hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworI2RlZmluZSBOX1RNUF9GSUxFTkFNRV9SQU5ET01fQllURVMgOAorICBpZiAoIV9kYnVzX2dlbmVyYXRlX3JhbmRvbV9hc2NpaSAoJnRtcF9maWxlbmFtZSwgTl9UTVBfRklMRU5BTUVfUkFORE9NX0JZVEVTKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdG1wX2ZpbGVuYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgCisgIGZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKyAgdG1wX2ZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ0bXBfZmlsZW5hbWUpOworCisgIGZkID0gb3BlbiAodG1wX2ZpbGVuYW1lX2MsIE9fV1JPTkxZIHwgT19CSU5BUlkgfCBPX0VYQ0wgfCBPX0NSRUFULAorICAgICAgICAgICAgIHdvcmxkX3JlYWRhYmxlID8gMDY0NCA6IDA2MDApOworICBpZiAoZmQgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY3JlYXRlICVzOiAlcyIsIHRtcF9maWxlbmFtZV9jLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgZ290byBvdXQ7CisgICAgfQorICBpZiAod29ybGRfcmVhZGFibGUpCisgICAgeworICAgICAgLyogRW5zdXJlIHRoZSBmaWxlIGlzIHdvcmxkIHJlYWRhYmxlIGV2ZW4gaW4gdGhlIHByZXNlbmNlIG9mCisgICAgICAgKiBwb3NzaWJseSByZXN0cmljdGl2ZSB1bWFza3M7CisgICAgICAgKiBzZWUgaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9hcmNoaXZlcy9kYnVzLzIwMTAtU2VwdGVtYmVyLzAxMzM2Ny5odG1sCisgICAgICAgKi8KKyAgICAgIGlmIChmY2htb2QgKGZkLCAwNjQ0KSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjaG1vZCAlczogJXMiLCB0bXBfZmlsZW5hbWVfYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoInRtcCBmaWxlIGZkICVkIG9wZW5lZFxuIiwgZmQpOworICAKKyAgbmVlZF91bmxpbmsgPSBUUlVFOworICAKKyAgdG90YWwgPSAwOworICBieXRlc190b193cml0ZSA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworCisgIHdoaWxlICh0b3RhbCA8IGJ5dGVzX3RvX3dyaXRlKQorICAgIHsKKyAgICAgIGludCBieXRlc193cml0dGVuOworCisgICAgICBieXRlc193cml0dGVuID0gX2RidXNfd3JpdGUgKGZkLCBzdHIsIHRvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc190b193cml0ZSAtIHRvdGFsKTsKKworICAgICAgaWYgKGJ5dGVzX3dyaXR0ZW4gPD0gMCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHdyaXRlIHRvICVzOiAlcyIsIHRtcF9maWxlbmFtZV9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICAKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICB0b3RhbCArPSBieXRlc193cml0dGVuOworICAgIH0KKworICBpZiAoZnN5bmMoZmQpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc3luY2hyb25pemUgZmlsZSAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHRtcF9maWxlbmFtZV9jLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKworICAgICAgZ290byBvdXQ7CisgIH0KKworICBpZiAoIV9kYnVzX2Nsb3NlIChmZCwgTlVMTCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjbG9zZSBmaWxlICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgdG1wX2ZpbGVuYW1lX2MsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworCisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgZmQgPSAtMTsKKyAgCisgIGlmIChyZW5hbWUgKHRtcF9maWxlbmFtZV9jLCBmaWxlbmFtZV9jKSA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCByZW5hbWUgJXMgdG8gJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICB0bXBfZmlsZW5hbWVfYywgZmlsZW5hbWVfYywKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIG5lZWRfdW5saW5rID0gRkFMU0U7CisgIAorICByZXR2YWwgPSBUUlVFOworICAKKyBvdXQ6CisgIC8qIGNsb3NlIGZpcnN0LCB0aGVuIHVubGluaywgdG8gcHJldmVudCAiLm5mczM0MjM0MjM1IiBnYXJiYWdlCisgICAqIGZpbGVzCisgICAqLworCisgIGlmIChmZCA+PSAwKQorICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgICAgIAorICBpZiAobmVlZF91bmxpbmsgJiYgdW5saW5rICh0bXBfZmlsZW5hbWVfYykgPCAwKQorICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gdW5saW5rIHRlbXAgZmlsZSAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgdG1wX2ZpbGVuYW1lX2MsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmdG1wX2ZpbGVuYW1lKTsKKworICBpZiAoIXJldHZhbCkKKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIAorICByZXR1cm4gcmV0dmFsOworfQorCisvKiogTWFrZXMgdGhlIGZpbGUgcmVhZGFibGUgYnkgZXZlcnkgdXNlciBpbiB0aGUgc3lzdGVtLgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciBsb2NhdGlvbgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGZpbGUncyBwZXJtaXNzaW9ucyBjb3VsZCBiZSBjaGFuZ2VkLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbWFrZV9maWxlX3dvcmxkX3JlYWRhYmxlKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgZmlsZW5hbWVfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworICBpZiAoY2htb2QgKGZpbGVuYW1lX2MsIDA2NDQpID09IC0xKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNoYW5nZSBwZXJtaXNzaW9ucyBvZiBmaWxlICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9jLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKiBDcmVhdGVzIHRoZSBnaXZlbiBmaWxlLCBmYWlsaW5nIGlmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciBsb2NhdGlvbgorICogQHJldHVybnMgI1RSVUUgaWYgd2UgY3JlYXRlZCB0aGUgZmlsZSBhbmQgaXQgZGlkbid0IGV4aXN0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVhdGVfZmlsZV9leGNsdXNpdmVseSAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGludCBmZDsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWVfYzsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIGZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKyAgCisgIGZkID0gb3BlbiAoZmlsZW5hbWVfYywgT19XUk9OTFkgfCBPX0JJTkFSWSB8IE9fRVhDTCB8IE9fQ1JFQVQsCisgICAgICAgICAgICAgMDYwMCk7CisgIGlmIChmZCA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY3JlYXRlIGZpbGUgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJleGNsdXNpdmUgZmlsZSBmZCAlZCBvcGVuZWRcbiIsIGZkKTsKKyAgCisgIGlmICghX2RidXNfY2xvc2UgKGZkLCBOVUxMKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjbG9zZSBmaWxlICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9jLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIERlbGV0ZXMgdGhlIGdpdmVuIGZpbGUuCisgKgorICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlbmFtZQorICogQHBhcmFtIGVycm9yIGVycm9yIGxvY2F0aW9uCisgKiAKKyAqIEByZXR1cm5zICNUUlVFIGlmIHVubGluaygpIHN1Y2NlZWRlZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZGVsZXRlX2ZpbGUgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpmaWxlbmFtZV9jOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAgZmlsZW5hbWVfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworCisgIGlmICh1bmxpbmsgKGZpbGVuYW1lX2MpIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZGVsZXRlIGZpbGUgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtZmlsZS13aW4uYyBiL2RidXMvZGJ1cy9kYnVzLWZpbGUtd2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZhOGVhMQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLWZpbGUtd2luLmMKQEAgLTAsMCArMSw0MDcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1maWxlLXdpbi5jIHdpbmRvd3MgcmVsYXRlZCBmaWxlIGltcGxlbWVudGF0aW9uIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA2ICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLXdpbi5oIgorI2luY2x1ZGUgImRidXMtcGlwZS5oIgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisKKy8qKgorICogVGhpbiB3cmFwcGVyIGFyb3VuZCB0aGUgcmVhZCgpIHN5c3RlbSBjYWxsIHRoYXQgYXBwZW5kcworICogdGhlIGRhdGEgaXQgcmVhZHMgdG8gdGhlIERCdXNTdHJpbmcgYnVmZmVyLiBJdCBhcHBlbmRzCisgKiB1cCB0byB0aGUgZ2l2ZW4gY291bnQuCisgKiAKKyAqIEBwYXJhbSBobmQgdGhlIEhBTkRMRSB0byByZWFkIGZyb20KKyAqIEBwYXJhbSBidWZmZXIgdGhlIGJ1ZmZlciB0byBhcHBlbmQgZGF0YSB0bworICogQHBhcmFtIGNvdW50IHRoZSBhbW91bnQgb2YgZGF0YSB0byByZWFkCisgKiBAcGFyYW0gZXJyb3IgcGxhY2UgdG8gc2V0IGFuIGVycm9yCisgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgLTEKKyAqLworc3RhdGljIGludAorX2RidXNfZmlsZV9yZWFkIChIQU5ETEUgICAgICAgICAgICBobmQsCisgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgY291bnQsCisgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBCT09MIHJlc3VsdDsKKyAgRFdPUkQgYnl0ZXNfcmVhZDsKKyAgaW50IHN0YXJ0OworICBjaGFyICpkYXRhOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIF9kYnVzX2Fzc2VydCAoY291bnQgPj0gMCk7CisKKyAgc3RhcnQgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYnVmZmVyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19sZW5ndGhlbiAoYnVmZmVyLCBjb3VudCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGRhdGEgPSBfZGJ1c19zdHJpbmdfZ2V0X2RhdGFfbGVuIChidWZmZXIsIHN0YXJ0LCBjb3VudCk7CisKKyAgcmVzdWx0ID0gUmVhZEZpbGUgKGhuZCwgZGF0YSwgY291bnQsICZieXRlc19yZWFkLCBOVUxMKTsKKyAgaWYgKHJlc3VsdCA9PSAwKQorICAgIHsKKyAgICAgIGNoYXIgKmVtc2cgPSBfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChHZXRMYXN0RXJyb3IgKCkpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c193aW5fZXJyb3JfZnJvbV9sYXN0X2Vycm9yICgpLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVhZCBmcm9tIDB4JXg6ICVzIiwgaG5kLCBlbXNnKTsKKyAgICAgIF9kYnVzX3dpbl9mcmVlX2Vycm9yX3N0cmluZyAoZW1zZyk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGlmIChieXRlc19yZWFkKQorICAgIHsKKyAgICAgIC8qIHB1dCBsZW5ndGggYmFjayAoZG9lc24ndCBhY3R1YWxseSByZWFsbG9jKSAqLworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKGJ1ZmZlciwgc3RhcnQgKyBieXRlc19yZWFkKTsKKworI2lmIDAKKyAgICAgIGlmIChieXRlc19yZWFkID4gMCkKKyAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKGJ1ZmZlciwgc3RhcnQsIGJ5dGVzX3JlYWQpOworI2VuZGlmCisgICAgfQorCisgIHJldHVybiBieXRlc19yZWFkOworfQorCisKKy8qKgorICogQXBwZW5kcyB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIGZpbGUgdG8gdGhlIHN0cmluZywKKyAqIHJldHVybmluZyBlcnJvciBjb2RlLiBBdCB0aGUgbW9tZW50LCB3b24ndCBvcGVuIGEgZmlsZQorICogbW9yZSB0aGFuIGEgbWVnYWJ5dGUgaW4gc2l6ZS4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gYXBwZW5kIHRvCisgKiBAcGFyYW0gZmlsZW5hbWUgZmlsZW5hbWUgdG8gbG9hZAorICogQHBhcmFtIGVycm9yIHBsYWNlIHRvIHNldCBhbiBlcnJvcgorICogQHJldHVybnMgI0ZBTFNFIGlmIGVycm9yIHdhcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2ZpbGVfZ2V0X2NvbnRlbnRzIChEQnVzU3RyaW5nICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIEhBTkRMRSBobmQ7CisgIERXT1JEIGZzaXplOworICBEV09SRCBmc2l6ZV9oaTsKKyAgaW50IG9yaWdfbGVuOworICB1bnNpZ25lZCBpbnQgdG90YWw7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgZmlsZW5hbWVfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworCisgIGhuZCA9IENyZWF0ZUZpbGVBIChmaWxlbmFtZV9jLCBHRU5FUklDX1JFQUQsCisgICAgICAgICAgICAgICAgICAgIEZJTEVfU0hBUkVfUkVBRCB8IEZJTEVfU0hBUkVfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgIE5VTEwsIE9QRU5fRVhJU1RJTkcsIEZJTEVfQVRUUklCVVRFX05PUk1BTCwgTlVMTCk7CisgIGlmIChobmQgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgeworICAgICAgY2hhciAqZW1zZyA9IF9kYnVzX3dpbl9lcnJvcl9zdHJpbmcgKEdldExhc3RFcnJvciAoKSk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX3dpbl9lcnJvcl9mcm9tX2xhc3RfZXJyb3IgKCksCisgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gb3BlbiBcIiVzXCI6ICVzIiwgZmlsZW5hbWVfYywgZW1zZyk7CisgICAgICBfZGJ1c193aW5fZnJlZV9lcnJvcl9zdHJpbmcgKGVtc2cpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiZmlsZSAlcyBobmQgJXAgb3BlbmVkXG4iLCBmaWxlbmFtZV9jLCBobmQpOworICAKKyAgZnNpemUgPSBHZXRGaWxlU2l6ZSAoaG5kLCAmZnNpemVfaGkpOworICBpZiAoZnNpemUgPT0gMHhGRkZGRkZGRiAmJiBHZXRMYXN0RXJyb3IoKSAhPSBOT19FUlJPUikKKyAgICB7IAorICAgICAgY2hhciAqZW1zZyA9IF9kYnVzX3dpbl9lcnJvcl9zdHJpbmcgKEdldExhc3RFcnJvciAoKSk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX3dpbl9lcnJvcl9mcm9tX2xhc3RfZXJyb3IgKCksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgZmlsZSBzaXplIGZvciBcIiVzXCI6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9jLCBlbXNnKTsKKyAgICAgIF9kYnVzX3dpbl9mcmVlX2Vycm9yX3N0cmluZyAoZW1zZyk7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJHZXRGaWxlU2l6ZSgpIGZhaWxlZDogJXMiLCBlbXNnKTsKKworICAgICAgQ2xvc2VIYW5kbGUgKGhuZCk7CisKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKGZzaXplX2hpICE9IDAgfHwgZnNpemUgPiBfREJVU19PTkVfTUVHQUJZVEUpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiRmlsZSBzaXplICVsdS8lbHUgb2YgXCIlc1wiIGlzIHRvbyBsYXJnZS4iLAorICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBmc2l6ZV9oaSwKKyAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgZnNpemUsIGZpbGVuYW1lX2MpOworICAgICAgQ2xvc2VIYW5kbGUgKGhuZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHRvdGFsID0gMDsKKyAgb3JpZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKyAgaWYgKGZzaXplID4gMCkKKyAgICB7CisgICAgICBpbnQgYnl0ZXNfcmVhZDsKKworICAgICAgd2hpbGUgKHRvdGFsIDwgZnNpemUpCisgICAgICAgIHsKKyAgICAgICAgICBieXRlc19yZWFkID0gX2RidXNfZmlsZV9yZWFkIChobmQsIHN0ciwgZnNpemUgLSB0b3RhbCwgZXJyb3IpOworICAgICAgICAgIGlmIChieXRlc19yZWFkIDw9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChieXRlc19yZWFkID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJlbWF0dXJlIEVPRiByZWFkaW5nIFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworCisgICAgICAgICAgICAgIENsb3NlSGFuZGxlIChobmQpOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoc3RyLCBvcmlnX2xlbik7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB0b3RhbCArPSBieXRlc19yZWFkOworICAgICAgICB9CisKKyAgICAgIENsb3NlSGFuZGxlIChobmQpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgQ2xvc2VIYW5kbGUgKGhuZCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9Cit9CisKKworLyoqCisgKiBXcml0ZXMgYSBzdHJpbmcgb3V0IHRvIGEgZmlsZS4gSWYgdGhlIGZpbGUgZXhpc3RzLAorICogaXQgd2lsbCBiZSBhdG9taWNhbGx5IG92ZXJ3cml0dGVuIGJ5IHRoZSBuZXcgZGF0YS4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gd3JpdGUgb3V0CisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGUgdG8gc2F2ZSBzdHJpbmcgdG8KKyAqIEBwYXJhbSB3b3JsZF9yZWFkYWJsZSBpZiB0cnVlLCBlbnN1cmUgZmlsZSBpcyB3b3JsZCByZWFkYWJsZQorICogQHBhcmFtIGVycm9yIGVycm9yIHRvIGJlIGZpbGxlZCBpbiBvbiBmYWlsdXJlCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX3NhdmVfdG9fZmlsZSAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICB3b3JsZF9yZWFkYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBIQU5ETEUgaG5kOworICBpbnQgYnl0ZXNfdG9fd3JpdGU7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisgIERCdXNTdHJpbmcgdG1wX2ZpbGVuYW1lOworICBjb25zdCBjaGFyICp0bXBfZmlsZW5hbWVfYzsKKyAgaW50IHRvdGFsOworICBjb25zdCBjaGFyICpzdHJfYzsKKyAgZGJ1c19ib29sX3QgbmVlZF91bmxpbms7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBobmQgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgcmV0dmFsID0gRkFMU0U7CisgIG5lZWRfdW5saW5rID0gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnRtcF9maWxlbmFtZSkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKGZpbGVuYW1lLCAwLCAmdG1wX2ZpbGVuYW1lLCAwKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdG1wX2ZpbGVuYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmdG1wX2ZpbGVuYW1lLCAiLiIpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0bXBfZmlsZW5hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworI2RlZmluZSBOX1RNUF9GSUxFTkFNRV9SQU5ET01fQllURVMgOAorICBpZiAoIV9kYnVzX2dlbmVyYXRlX3JhbmRvbV9hc2NpaSAoJnRtcF9maWxlbmFtZSwgTl9UTVBfRklMRU5BTUVfUkFORE9NX0JZVEVTKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdG1wX2ZpbGVuYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgZmlsZW5hbWVfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworICB0bXBfZmlsZW5hbWVfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnRtcF9maWxlbmFtZSk7CisKKyAgLyogVE9ETyAtIHN1cHBvcnQgd29ybGQtcmVhZGFibGUgaW4gYW4gYXRvbWljIGZhc2hpb24gKi8KKyAgaG5kID0gQ3JlYXRlRmlsZUEgKHRtcF9maWxlbmFtZV9jLCBHRU5FUklDX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgRklMRV9TSEFSRV9SRUFEIHwgRklMRV9TSEFSRV9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgIE5VTEwsIENSRUFURV9ORVcsIEZJTEVfQVRUUklCVVRFX05PUk1BTCwKKyAgICAgICAgICAgICAgICAgICAgIElOVkFMSURfSEFORExFX1ZBTFVFKTsKKyAgaWYgKGhuZCA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICB7CisgICAgICBjaGFyICplbXNnID0gX2RidXNfd2luX2Vycm9yX3N0cmluZyAoR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfd2luX2Vycm9yX2Zyb21fbGFzdF9lcnJvciAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjcmVhdGUgXCIlc1wiOiAlcyIsIGZpbGVuYW1lX2MsIGVtc2cpOworICAgICAgX2RidXNfd2luX2ZyZWVfZXJyb3Jfc3RyaW5nIChlbXNnKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgaWYgKHdvcmxkX3JlYWRhYmxlKQorICAgIHsKKyAgICAgIGlmICghIF9kYnVzX21ha2VfZmlsZV93b3JsZF9yZWFkYWJsZSAoJnRtcF9maWxlbmFtZSwgZXJyb3IpKQorICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoInRtcCBmaWxlICVzIGhuZCAlcCBvcGVuZWRcbiIsIHRtcF9maWxlbmFtZV9jLCBobmQpOworCisgIG5lZWRfdW5saW5rID0gVFJVRTsKKworICB0b3RhbCA9IDA7CisgIGJ5dGVzX3RvX3dyaXRlID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisgIHN0cl9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzdHIpOworCisgIHdoaWxlICh0b3RhbCA8IGJ5dGVzX3RvX3dyaXRlKQorICAgIHsKKyAgICAgIERXT1JEIGJ5dGVzX3dyaXR0ZW47CisgICAgICBCT09MIHJlczsKKworICAgICAgcmVzID0gV3JpdGVGaWxlIChobmQsIHN0cl9jICsgdG90YWwsIGJ5dGVzX3RvX3dyaXRlIC0gdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICZieXRlc193cml0dGVuLCBOVUxMKTsKKworICAgICAgaWYgKHJlcyA9PSAwIHx8IGJ5dGVzX3dyaXR0ZW4gPD0gMCkKKyAgICAgICAgeworICAgICAgICAgIGNoYXIgKmVtc2cgPSBfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChHZXRMYXN0RXJyb3IgKCkpOworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfd2luX2Vycm9yX2Zyb21fbGFzdF9lcnJvciAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgd3JpdGUgdG8gJXM6ICVzIiwgdG1wX2ZpbGVuYW1lX2MsIGVtc2cpOworICAgICAgICAgIF9kYnVzX3dpbl9mcmVlX2Vycm9yX3N0cmluZyAoZW1zZyk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgdG90YWwgKz0gYnl0ZXNfd3JpdHRlbjsKKyAgICB9CisKKyAgaWYgKENsb3NlSGFuZGxlIChobmQpID09IDApCisgICAgeworICAgICAgY2hhciAqZW1zZyA9IF9kYnVzX3dpbl9lcnJvcl9zdHJpbmcgKEdldExhc3RFcnJvciAoKSk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX3dpbl9lcnJvcl9mcm9tX2xhc3RfZXJyb3IgKCksCisgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY2xvc2UgZmlsZSAlczogJXMiLCB0bXBfZmlsZW5hbWVfYywgZW1zZyk7CisgICAgICBfZGJ1c193aW5fZnJlZV9lcnJvcl9zdHJpbmcgKGVtc2cpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGhuZCA9IElOVkFMSURfSEFORExFX1ZBTFVFOworCisgIC8qIFVubGlrZSByZW5hbWUoKSwgTW92ZUZpbGVFeCgpIGNhbiByZXBsYWNlIGV4aXN0aW5nIGZpbGVzICovCisgIGlmICghTW92ZUZpbGVFeEEgKHRtcF9maWxlbmFtZV9jLCBmaWxlbmFtZV9jLCBNT1ZFRklMRV9SRVBMQUNFX0VYSVNUSU5HKSkKKyAgICB7CisgICAgICBjaGFyICplbXNnID0gX2RidXNfd2luX2Vycm9yX3N0cmluZyAoR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfd2luX2Vycm9yX2Zyb21fbGFzdF9lcnJvciAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCByZW5hbWUgJXMgdG8gJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdG1wX2ZpbGVuYW1lX2MsIGZpbGVuYW1lX2MsIGVtc2cpOworICAgICAgX2RidXNfd2luX2ZyZWVfZXJyb3Jfc3RyaW5nIChlbXNnKTsKKworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIG5lZWRfdW5saW5rID0gRkFMU0U7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgLyogY2xvc2UgZmlyc3QsIHRoZW4gdW5saW5rICovCisKKyAgaWYgKGhuZCAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICBDbG9zZUhhbmRsZSAoaG5kKTsKKworICBpZiAobmVlZF91bmxpbmsgJiYgRGVsZXRlRmlsZUEgKHRtcF9maWxlbmFtZV9jKSA9PSAwKQorICAgIHsKKyAgICAgIGNoYXIgKmVtc2cgPSBfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChHZXRMYXN0RXJyb3IgKCkpOworICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byB1bmxpbmsgdGVtcCBmaWxlICVzOiAlcyIsIHRtcF9maWxlbmFtZV9jLAorICAgICAgICAgICAgICAgICAgICAgZW1zZyk7CisgICAgICBfZGJ1c193aW5fZnJlZV9lcnJvcl9zdHJpbmcgKGVtc2cpOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRtcF9maWxlbmFtZSk7CisKKyAgaWYgKCFyZXR2YWwpCisgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKworLyoqIENyZWF0ZXMgdGhlIGdpdmVuIGZpbGUsIGZhaWxpbmcgaWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMuCisgKgorICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlbmFtZQorICogQHBhcmFtIGVycm9yIGVycm9yIGxvY2F0aW9uCisgKiBAcmV0dXJucyAjVFJVRSBpZiB3ZSBjcmVhdGVkIHRoZSBmaWxlIGFuZCBpdCBkaWRuJ3QgZXhpc3QKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NyZWF0ZV9maWxlX2V4Y2x1c2l2ZWx5IChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgSEFORExFIGhuZDsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWVfYzsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBmaWxlbmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSk7CisKKyAgaG5kID0gQ3JlYXRlRmlsZUEgKGZpbGVuYW1lX2MsIEdFTkVSSUNfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICBGSUxFX1NIQVJFX1JFQUQgfCBGSUxFX1NIQVJFX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgTlVMTCwgQ1JFQVRFX05FVywgRklMRV9BVFRSSUJVVEVfTk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgSU5WQUxJRF9IQU5ETEVfVkFMVUUpOworICBpZiAoaG5kID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgIHsKKyAgICAgIGNoYXIgKmVtc2cgPSBfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChHZXRMYXN0RXJyb3IgKCkpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c193aW5fZXJyb3JfZnJvbV9sYXN0X2Vycm9yICgpLAorICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSBmaWxlICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MsIGVtc2cpOworICAgICAgX2RidXNfd2luX2ZyZWVfZXJyb3Jfc3RyaW5nIChlbXNnKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoImV4Y2x1c2l2ZSBmaWxlICVzIGhuZCAlcCBvcGVuZWRcbiIsIGZpbGVuYW1lX2MsIGhuZCk7CisKKyAgaWYgKENsb3NlSGFuZGxlIChobmQpID09IDApCisgICAgeworICAgICAgY2hhciAqZW1zZyA9IF9kYnVzX3dpbl9lcnJvcl9zdHJpbmcgKEdldExhc3RFcnJvciAoKSk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX3dpbl9lcnJvcl9mcm9tX2xhc3RfZXJyb3IgKCksCisgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY2xvc2UgZmlsZSAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9jLCBlbXNnKTsKKyAgICAgIF9kYnVzX3dpbl9mcmVlX2Vycm9yX3N0cmluZyAoZW1zZyk7CisKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLWZpbGUuYyBiL2RidXMvZGJ1cy9kYnVzLWZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTBmYmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtZmlsZS5jCkBAIC0wLDAgKzEsMjggQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zeXNkZXBzLXVuaXguYyBXcmFwcGVycyBhcm91bmQgVU5JWCBzeXN0ZW0vbGliYyBmZWF0dXJlcyAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNiAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgImRidXMtZmlsZS5oIgorCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1maWxlLmggYi9kYnVzL2RidXMvZGJ1cy1maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ4MzdmNAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLWZpbGUuaApAQCAtMCwwICsxLDYzIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtZmlsZS5oIGRidXMgZmlsZSByZWxhdGVkIHN0dWZmIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX0ZJTEVfSAorI2RlZmluZSBEQlVTX0ZJTEVfSAorCisvLyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0ZpbGUKKyAqIEB7CisgKi8KKworLyoqCisgKiBGaWxlIGludGVyZmFjZQorICovCitkYnVzX2Jvb2xfdCBfZGJ1c19maWxlX2V4aXN0cyAgICAgICAgIChjb25zdCBjaGFyICAgICAgICpmaWxlKTsKK2RidXNfYm9vbF90IF9kYnVzX2ZpbGVfZ2V0X2NvbnRlbnRzICAgKERCdXNTdHJpbmcgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgX2RidXNfc3RyaW5nX3NhdmVfdG9fZmlsZSAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICB3b3JsZF9yZWFkYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKKworZGJ1c19ib29sX3QgX2RidXNfbWFrZV9maWxlX3dvcmxkX3JlYWRhYmxlICAgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpOworCitkYnVzX2Jvb2xfdCAgICBfZGJ1c19jcmVhdGVfZmlsZV9leGNsdXNpdmVseSAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgX2RidXNfZGVsZXRlX2ZpbGUgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qKiBAfSAqLworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLWhhc2guYyBiL2RidXMvZGJ1cy9kYnVzLWhhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGM2ZjkzCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtaGFzaC5jCkBAIC0wLDAgKzEsMTgzMSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWhhc2guYyBHZW5lcmljIGhhc2ggdGFibGUgdXRpbGl0eSAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTMgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIENvcHlyaWdodCAoYykgMTk5NCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKiAKKyAqIEhhc2ggdGFibGUgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gZ2VuZXJpYy90Y2xIYXNoLmMgZnJvbSB0aGUgVGNsCisgKiBzb3VyY2UgY29kZS4gVGhlIG9yaWdpbmFsIFRjbCBsaWNlbnNlIGFwcGxpZXMgdG8gcG9ydGlvbnMgb2YgdGhlCisgKiBjb2RlIGZyb20gdGNsSGFzaC5jOyB0aGUgVGNsIGxpY2Vuc2UgZm9sbG93cyB0aGlzIHN0YW5kYWQgRC1CdXMgCisgKiBsaWNlbnNlIGluZm9ybWF0aW9uLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworLyogCisgKiBUaGUgZm9sbG93aW5nIGNvcHlyaWdodCBhcHBsaWVzIHRvIGNvZGUgZnJvbSB0aGUgVGNsIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEtMTk5MyBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQ29weXJpZ2h0IChjKSAxOTk0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mCisgKiBDYWxpZm9ybmlhLCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCBTY3JpcHRpY3MgQ29ycG9yYXRpb24sIGFuZAorICogb3RoZXIgcGFydGllcy4gIFRoZSBmb2xsb3dpbmcgdGVybXMgYXBwbHkgdG8gYWxsIGZpbGVzIGFzc29jaWF0ZWQKKyAqIHdpdGggdGhlIHNvZnR3YXJlIHVubGVzcyBleHBsaWNpdGx5IGRpc2NsYWltZWQgaW4gaW5kaXZpZHVhbCBmaWxlcy4KKyAqIAorICogVGhlIGF1dGhvcnMgaGVyZWJ5IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksCisgKiBkaXN0cmlidXRlLCBhbmQgbGljZW5zZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55CisgKiBwdXJwb3NlLCBwcm92aWRlZCB0aGF0IGV4aXN0aW5nIGNvcHlyaWdodCBub3RpY2VzIGFyZSByZXRhaW5lZCBpbgorICogYWxsIGNvcGllcyBhbmQgdGhhdCB0aGlzIG5vdGljZSBpcyBpbmNsdWRlZCB2ZXJiYXRpbSBpbiBhbnkKKyAqIGRpc3RyaWJ1dGlvbnMuIE5vIHdyaXR0ZW4gYWdyZWVtZW50LCBsaWNlbnNlLCBvciByb3lhbHR5IGZlZSBpcworICogcmVxdWlyZWQgZm9yIGFueSBvZiB0aGUgYXV0aG9yaXplZCB1c2VzLiAgTW9kaWZpY2F0aW9ucyB0byB0aGlzCisgKiBzb2Z0d2FyZSBtYXkgYmUgY29weXJpZ2h0ZWQgYnkgdGhlaXIgYXV0aG9ycyBhbmQgbmVlZCBub3QgZm9sbG93CisgKiB0aGUgbGljZW5zaW5nIHRlcm1zIGRlc2NyaWJlZCBoZXJlLCBwcm92aWRlZCB0aGF0IHRoZSBuZXcgdGVybXMgYXJlCisgKiBjbGVhcmx5IGluZGljYXRlZCBvbiB0aGUgZmlyc3QgcGFnZSBvZiBlYWNoIGZpbGUgd2hlcmUgdGhleSBhcHBseS4KKyAqIAorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgRElTVFJJQlVUT1JTIEJFIExJQUJMRSBUTyBBTlkKKyAqIFBBUlRZIEZPUiBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgSVRTIERPQ1VNRU5UQVRJT04sCisgKiBPUiBBTlkgREVSSVZBVElWRVMgVEhFUkVPRiwgRVZFTiBJRiBUSEUgQVVUSE9SUyBIQVZFIEJFRU4gQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogCisgKiBUSEUgQVVUSE9SUyBBTkQgRElTVFJJQlVUT1JTIFNQRUNJRklDQUxMWSBESVNDTEFJTSBBTlkgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBBTkQKKyAqIE5PTi1JTkZSSU5HRU1FTlQuICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsCisgKiBBTkQgVEhFIEFVVEhPUlMgQU5EIERJU1RSSUJVVE9SUyBIQVZFIE5PIE9CTElHQVRJT04gVE8gUFJPVklERQorICogTUFJTlRFTkFOQ0UsIFNVUFBPUlQsIFVQREFURVMsIEVOSEFOQ0VNRU5UUywgT1IgTU9ESUZJQ0FUSU9OUy4KKyAqIAorICogR09WRVJOTUVOVCBVU0U6IElmIHlvdSBhcmUgYWNxdWlyaW5nIHRoaXMgc29mdHdhcmUgb24gYmVoYWxmIG9mIHRoZQorICogVS5TLiBnb3Zlcm5tZW50LCB0aGUgR292ZXJubWVudCBzaGFsbCBoYXZlIG9ubHkgIlJlc3RyaWN0ZWQgUmlnaHRzIgorICogaW4gdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24gYXMgZGVmaW5lZCBpbiB0aGUgRmVkZXJhbAorICogQWNxdWlzaXRpb24gUmVndWxhdGlvbnMgKEZBUnMpIGluIENsYXVzZSA1Mi4yMjcuMTkgKGMpICgyKS4gIElmIHlvdQorICogYXJlIGFjcXVpcmluZyB0aGUgc29mdHdhcmUgb24gYmVoYWxmIG9mIHRoZSBEZXBhcnRtZW50IG9mIERlZmVuc2UsCisgKiB0aGUgc29mdHdhcmUgc2hhbGwgYmUgY2xhc3NpZmllZCBhcyAiQ29tbWVyY2lhbCBDb21wdXRlciBTb2Z0d2FyZSIKKyAqIGFuZCB0aGUgR292ZXJubWVudCBzaGFsbCBoYXZlIG9ubHkgIlJlc3RyaWN0ZWQgUmlnaHRzIiBhcyBkZWZpbmVkCisgKiBpbiBDbGF1c2UgMjUyLjIyNy03MDEzIChjKSAoMSkgb2YgREZBUnMuICBOb3R3aXRoc3RhbmRpbmcgdGhlCisgKiBmb3JlZ29pbmcsIHRoZSBhdXRob3JzIGdyYW50IHRoZSBVLlMuIEdvdmVybm1lbnQgYW5kIG90aGVycyBhY3RpbmcKKyAqIGluIGl0cyBiZWhhbGYgcGVybWlzc2lvbiB0byB1c2UgYW5kIGRpc3RyaWJ1dGUgdGhlIHNvZnR3YXJlIGluCisgKiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIHNwZWNpZmllZCBpbiB0aGlzIGxpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaGFzaC5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1tZW1wb29sLmgiCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNIYXNoVGFibGUgSGFzaCB0YWJsZQorICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBEQnVzSGFzaFRhYmxlIGRhdGEgc3RydWN0dXJlCisgKgorICogVHlwZXMgYW5kIGZ1bmN0aW9ucyByZWxhdGVkIHRvIERCdXNIYXNoVGFibGUuCisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0hhc2hUYWJsZUludGVybmFscyBIYXNoIHRhYmxlIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgREJ1c0hhc2hUYWJsZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKgorICogVGhlIGd1dHMgb2YgREJ1c0hhc2hUYWJsZS4KKyAqCisgKiBAeworICovCisKKy8qKgorICogV2hlbiB0aGVyZSBhcmUgdGhpcyBtYW55IGVudHJpZXMgcGVyIGJ1Y2tldCwgb24gYXZlcmFnZSwgcmVidWlsZAorICogdGhlIGhhc2ggdGFibGUgdG8gbWFrZSBpdCBsYXJnZXIuCisgKi8KKyNkZWZpbmUgUkVCVUlMRF9NVUxUSVBMSUVSICAzCisKKy8qKgorICogVGFrZXMgYSBwcmVsaW1pbmFyeSBpbnRlZ2VyIGhhc2ggdmFsdWUgYW5kIHByb2R1Y2VzIGFuIGluZGV4IGludG8gYQorICogaGFzaCB0YWJsZXMgYnVja2V0IGxpc3QuICBUaGUgaWRlYSBpcyB0byBtYWtlIGl0IHNvIHRoYXQKKyAqIHByZWxpbWluYXJ5IHZhbHVlcyB0aGF0IGFyZSBhcmJpdHJhcmlseSBzaW1pbGFyIHdpbGwgZW5kIHVwIGluCisgKiBkaWZmZXJlbnQgYnVja2V0cy4gIFRoZSBoYXNoIGZ1bmN0aW9uIHdhcyB0YWtlbiBmcm9tIGEKKyAqIHJhbmRvbS1udW1iZXIgZ2VuZXJhdG9yLiAoVGhpcyBpcyB1c2VkIHRvIGhhc2ggaW50ZWdlcnMuKQorICoKKyAqIFRoZSBkb3duX3NoaWZ0IGRyb3BzIG9mZiB0aGUgaGlnaCBiaXRzIG9mIHRoZSBoYXNoIGluZGV4LCBhbmQKKyAqIGRlY3JlYXNlcyBhcyB3ZSBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIGhhc2ggYnVja2V0cyAodG8ga2VlcCBtb3JlCisgKiByYW5nZSBpbiB0aGUgaGFzaCBpbmRleCkuIFRoZSBtYXNrIGFsc28gc3RyaXBzIGhpZ2ggYml0cyBhbmQgc3RyaXBzCisgKiBmZXdlciBoaWdoIGJpdHMgYXMgdGhlIG51bWJlciBvZiBoYXNoIGJ1Y2tldHMgaW5jcmVhc2VzLgorICogSSBkb24ndCB1bmRlcnN0YW5kIHR3byB0aGluZ3M6IHdoeSBpcyB0aGUgaW5pdGlhbCBkb3duc2hpZnQgMjgKKyAqIHRvIGtlZXAgNCBiaXRzIHdoZW4gdGhlIGluaXRpYWwgbWFzayBpcyAwMTEgdG8ga2VlcCAyIGJpdHMsCisgKiBhbmQgd2h5IGRvIHdlIGhhdmUgYm90aCBhIG1hc2sgYW5kIGEgZG93bnNoaWZ0PworICogCisgKi8KKyNkZWZpbmUgUkFORE9NX0lOREVYKHRhYmxlLCBpKSBcCisgICAgKCgoKChpbnRwdHJfdCkgKGkpKSoxMTAzNTE1MjQ1KSA+PiAodGFibGUpLT5kb3duX3NoaWZ0KSAmICh0YWJsZSktPm1hc2spCisKKy8qKgorICogSW5pdGlhbCBudW1iZXIgb2YgYnVja2V0cyBpbiBoYXNoIHRhYmxlIChoYXNoIHRhYmxlIHN0YXRpY2FsbHkKKyAqIGFsbG9jYXRlcyBpdHMgYnVja2V0cyBmb3IgdGhpcyBzaXplIGFuZCBiZWxvdykuCisgKiBUaGUgaW5pdGlhbCBtYXNrIGhhcyB0byBiZSBzeW5jZWQgdG8gdGhpcy4KKyAqLworI2RlZmluZSBEQlVTX1NNQUxMX0hBU0hfVEFCTEUgNAorCisvKioKKyAqIFR5cGVkZWYgZm9yIERCdXNIYXNoRW50cnkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c0hhc2hFbnRyeSBEQnVzSGFzaEVudHJ5OworCisvKioKKyAqIEBicmllZiBJbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBhIGhhc2ggZW50cnkuCisgKiAKKyAqIEEgc2luZ2xlIGVudHJ5IChrZXktdmFsdWUgcGFpcikgaW4gdGhlIGhhc2ggdGFibGUuCisgKiBJbnRlcm5hbCB0byBoYXNoIHRhYmxlIGltcGxlbWVudGF0aW9uLgorICovCitzdHJ1Y3QgREJ1c0hhc2hFbnRyeQoreworICBEQnVzSGFzaEVudHJ5ICpuZXh0OyAgICAvKio8IFBvaW50ZXIgdG8gbmV4dCBlbnRyeSBpbiB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGhhc2ggYnVja2V0LCBvciAjTlVMTCBmb3IgZW5kIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNoYWluLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAqa2V5OyAgICAgICAgICAgICAgLyoqPCBIYXNoIGtleSAqLworICB2b2lkICp2YWx1ZTsgICAgICAgICAgICAvKio8IEhhc2ggdmFsdWUgKi8KK307CisKKy8qKgorICogRnVuY3Rpb24gdXNlZCB0byBmaW5kIGFuZCBvcHRpb25hbGx5IGNyZWF0ZSBhIGhhc2ggZW50cnkuCisgKi8KK3R5cGVkZWYgREJ1c0hhc2hFbnRyeSogKCogREJ1c0ZpbmRFbnRyeUZ1bmN0aW9uKSAoREJ1c0hhc2hUYWJsZSAgICAgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgY3JlYXRlX2lmX25vdF9mb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAgICAgICoqKmJ1Y2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ByZWFsbG9jYXRlZEhhc2ggKnByZWFsbG9jYXRlZCk7CisKKy8qKgorICogQGJyaWVmIEludGVybmFscyBvZiBEQnVzSGFzaFRhYmxlLgorICogCisgKiBIYXNoIHRhYmxlIGludGVybmFscy4gSGFzaCB0YWJsZXMgYXJlIG9wYXF1ZSBvYmplY3RzLCB0aGV5IG11c3QgYmUKKyAqIHVzZWQgdmlhIGFjY2Vzc29yIGZ1bmN0aW9ucy4KKyAqLworc3RydWN0IERCdXNIYXNoVGFibGUgeworICBpbnQgcmVmY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJlZmVyZW5jZSBjb3VudCAqLworICAKKyAgREJ1c0hhc2hFbnRyeSAqKmJ1Y2tldHM7ICAgICAgICAgICAgLyoqPCBQb2ludGVyIHRvIGJ1Y2tldCBhcnJheS4gIEVhY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZWxlbWVudCBwb2ludHMgdG8gZmlyc3QgZW50cnkgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYnVja2V0J3MgaGFzaCBjaGFpbiwgb3IgI05VTEwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBEQnVzSGFzaEVudHJ5ICpzdGF0aWNfYnVja2V0c1tEQlVTX1NNQUxMX0hBU0hfVEFCTEVdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCdWNrZXQgYXJyYXkgdXNlZCBmb3Igc21hbGwgdGFibGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAodG8gYXZvaWQgbWFsbG9jcyBhbmQgZnJlZXMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGludCBuX2J1Y2tldHM7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRvdGFsIG51bWJlciBvZiBidWNrZXRzIGFsbG9jYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYXQgKipidWNrZXRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGludCBuX2VudHJpZXM7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRvdGFsIG51bWJlciBvZiBlbnRyaWVzIHByZXNlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGluIHRhYmxlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGludCBoaV9yZWJ1aWxkX3NpemU7ICAgICAgICAgICAgICAgICAvKio8IEVubGFyZ2UgdGFibGUgd2hlbiBuX2VudHJpZXMgZ2V0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdG8gYmUgdGhpcyBsYXJnZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgbG9fcmVidWlsZF9zaXplOyAgICAgICAgICAgICAgICAgLyoqPCBTaHJpbmsgdGFibGUgd2hlbiBuX2VudHJpZXMgZ2V0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmVsb3cgdGhpcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgZG93bl9zaGlmdDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTaGlmdCBjb3VudCB1c2VkIGluIGhhc2hpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZ1bmN0aW9uLiAgRGVzaWduZWQgdG8gdXNlIGhpZ2gtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvcmRlciBiaXRzIG9mIHJhbmRvbWl6ZWQga2V5cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgbWFzazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNYXNrIHZhbHVlIHVzZWQgaW4gaGFzaGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZnVuY3Rpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgREJ1c0hhc2hUeXBlIGtleV90eXBlOyAgICAgICAgICAgICAgIC8qKjwgVHlwZSBvZiBrZXlzIHVzZWQgaW4gdGhpcyB0YWJsZSAqLworCisKKyAgREJ1c0ZpbmRFbnRyeUZ1bmN0aW9uIGZpbmRfZnVuY3Rpb247IC8qKjwgRnVuY3Rpb24gZm9yIGZpbmRpbmcgZW50cmllcyAqLworCisgIERCdXNGcmVlRnVuY3Rpb24gZnJlZV9rZXlfZnVuY3Rpb247ICAgLyoqPCBGdW5jdGlvbiB0byBmcmVlIGtleXMgKi8KKyAgREJ1c0ZyZWVGdW5jdGlvbiBmcmVlX3ZhbHVlX2Z1bmN0aW9uOyAvKio8IEZ1bmN0aW9uIHRvIGZyZWUgdmFsdWVzICovCisKKyAgREJ1c01lbVBvb2wgKmVudHJ5X3Bvb2w7ICAgICAgICAgICAgICAvKio8IE1lbW9yeSBwb29sIGZvciBoYXNoIGVudHJpZXMgKi8KK307CisKKy8qKiAKKyAqIEBicmllZiBJbnRlcm5hbHMgb2YgREJ1c0hhc2hJdGVyLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICBEQnVzSGFzaFRhYmxlICp0YWJsZTsgICAgIC8qKjwgUG9pbnRlciB0byB0YWJsZSBjb250YWluaW5nIGVudHJ5LiAqLworICBEQnVzSGFzaEVudHJ5ICoqYnVja2V0OyAgIC8qKjwgUG9pbnRlciB0byBidWNrZXQgdGhhdCBwb2ludHMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmaXJzdCBlbnRyeSBpbiB0aGlzIGVudHJ5J3MgY2hhaW46CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdXNlZCBmb3IgZGVsZXRpbmcgdGhlIGVudHJ5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBEQnVzSGFzaEVudHJ5ICplbnRyeTsgICAgICAvKio8IEN1cnJlbnQgaGFzaCBlbnRyeSAqLworICBEQnVzSGFzaEVudHJ5ICpuZXh0X2VudHJ5OyAvKio8IE5leHQgZW50cnkgdG8gYmUgaXRlcmF0ZWQgb250byBpbiBjdXJyZW50IGJ1Y2tldCAqLworICBpbnQgbmV4dF9idWNrZXQ7ICAgICAgICAgICAvKio8IGluZGV4IG9mIG5leHQgYnVja2V0ICovCisgIGludCBuX2VudHJpZXNfb25faW5pdDsgICAgIC8qKjwgdXNlZCB0byBkZXRlY3QgdGFibGUgcmVzaXplIHNpbmNlIGluaXRpYWxpemF0aW9uICovCit9IERCdXNSZWFsSGFzaEl0ZXI7CisKK19EQlVTX1NUQVRJQ19BU1NFUlQgKHNpemVvZiAoREJ1c1JlYWxIYXNoSXRlcikgPT0gc2l6ZW9mIChEQnVzSGFzaEl0ZXIpKTsKKworc3RhdGljIERCdXNIYXNoRW50cnkqIGZpbmRfZGlyZWN0X2Z1bmN0aW9uICAgICAgKERCdXNIYXNoVGFibGUgICAgICAgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICBjcmVhdGVfaWZfbm90X2ZvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNIYXNoRW50cnkgICAgICAgICoqKmJ1Y2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUHJlYWxsb2NhdGVkSGFzaCAgICpwcmVhbGxvY2F0ZWQpOworc3RhdGljIERCdXNIYXNoRW50cnkqIGZpbmRfc3RyaW5nX2Z1bmN0aW9uICAgICAgKERCdXNIYXNoVGFibGUgICAgICAgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICBjcmVhdGVfaWZfbm90X2ZvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNIYXNoRW50cnkgICAgICAgICoqKmJ1Y2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUHJlYWxsb2NhdGVkSGFzaCAgICpwcmVhbGxvY2F0ZWQpOworc3RhdGljIHVuc2lnbmVkIGludCAgIHN0cmluZ19oYXNoICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgICAgICAgICAgICAgKnN0cik7CitzdGF0aWMgdm9pZCAgICAgICAgICAgcmVidWlsZF90YWJsZSAgICAgICAgICAgICAoREJ1c0hhc2hUYWJsZSAgICAgICAgICAqdGFibGUpOworc3RhdGljIERCdXNIYXNoRW50cnkqIGFsbG9jX2VudHJ5ICAgICAgICAgICAgICAgKERCdXNIYXNoVGFibGUgICAgICAgICAgKnRhYmxlKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICByZW1vdmVfZW50cnkgICAgICAgICAgICAgIChEQnVzSGFzaFRhYmxlICAgICAgICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzSGFzaEVudHJ5ICAgICAgICAgKipidWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAgICAgICAgICAqZW50cnkpOworc3RhdGljIHZvaWQgICAgICAgICAgIGZyZWVfZW50cnkgICAgICAgICAgICAgICAgKERCdXNIYXNoVGFibGUgICAgICAgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNIYXNoRW50cnkgICAgICAgICAgKmVudHJ5KTsKK3N0YXRpYyB2b2lkICAgICAgICAgICBmcmVlX2VudHJ5X2RhdGEgICAgICAgICAgIChEQnVzSGFzaFRhYmxlICAgICAgICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzSGFzaEVudHJ5ICAgICAgICAgICplbnRyeSk7CisKKworLyoqIEB9ICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0hhc2hUYWJsZQorICogQHsKKyAqLworCisvKioKKyAqIEB0eXBlZGVmIERCdXNIYXNoSXRlcgorICoKKyAqIFB1YmxpYyBvcGFxdWUgaGFzaCB0YWJsZSBpdGVyYXRvciBvYmplY3QuCisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBEQnVzSGFzaFRhYmxlCisgKgorICogUHVibGljIG9wYXF1ZSBoYXNoIHRhYmxlIG9iamVjdC4KKyAqLworCisvKioKKyAqIEB0eXBlZGVmIERCdXNIYXNoVHlwZQorICoKKyAqIEluZGljYXRlcyB0aGUgdHlwZSBvZiBhIGtleSBpbiB0aGUgaGFzaCB0YWJsZS4KKyAqLworCisvKioKKyAqIENvbnN0cnVjdHMgYSBuZXcgaGFzaCB0YWJsZS4gU2hvdWxkIGJlIGZyZWVkIHdpdGgKKyAqIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYoKS4gSWYgbWVtb3J5IGNhbm5vdCBiZQorICogYWxsb2NhdGVkIGZvciB0aGUgaGFzaCB0YWJsZSwgcmV0dXJucyAjTlVMTC4KKyAqCisgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiBoYXNoIGtleSB0byB1c2UuCisgKiBAcGFyYW0ga2V5X2ZyZWVfZnVuY3Rpb24gZnVuY3Rpb24gdG8gZnJlZSBoYXNoIGtleXMuCisgKiBAcGFyYW0gdmFsdWVfZnJlZV9mdW5jdGlvbiBmdW5jdGlvbiB0byBmcmVlIGhhc2ggdmFsdWVzLgorICogQHJldHVybnMgYSBuZXcgREJ1c0hhc2hUYWJsZSBvciAjTlVMTCBpZiBubyBtZW1vcnkuCisgKi8KK0RCdXNIYXNoVGFibGUqCitfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJ1c0hhc2hUeXBlICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24ga2V5X2ZyZWVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiB2YWx1ZV9mcmVlX2Z1bmN0aW9uKQoreworICBEQnVzSGFzaFRhYmxlICp0YWJsZTsKKyAgREJ1c01lbVBvb2wgKmVudHJ5X3Bvb2w7CisgIAorICB0YWJsZSA9IGRidXNfbmV3MCAoREJ1c0hhc2hUYWJsZSwgMSk7CisgIGlmICh0YWJsZSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGVudHJ5X3Bvb2wgPSBfZGJ1c19tZW1fcG9vbF9uZXcgKHNpemVvZiAoREJ1c0hhc2hFbnRyeSksIFRSVUUpOworICBpZiAoZW50cnlfcG9vbCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAodGFibGUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgdGFibGUtPnJlZmNvdW50ID0gMTsKKyAgdGFibGUtPmVudHJ5X3Bvb2wgPSBlbnRyeV9wb29sOworICAKKyAgX2RidXNfYXNzZXJ0IChEQlVTX1NNQUxMX0hBU0hfVEFCTEUgPT0gX0RCVVNfTl9FTEVNRU5UUyAodGFibGUtPnN0YXRpY19idWNrZXRzKSk7CisgIAorICB0YWJsZS0+YnVja2V0cyA9IHRhYmxlLT5zdGF0aWNfYnVja2V0czsgIAorICB0YWJsZS0+bl9idWNrZXRzID0gREJVU19TTUFMTF9IQVNIX1RBQkxFOworICB0YWJsZS0+bl9lbnRyaWVzID0gMDsKKyAgdGFibGUtPmhpX3JlYnVpbGRfc2l6ZSA9IERCVVNfU01BTExfSEFTSF9UQUJMRSAqIFJFQlVJTERfTVVMVElQTElFUjsKKyAgdGFibGUtPmxvX3JlYnVpbGRfc2l6ZSA9IDA7CisgIHRhYmxlLT5kb3duX3NoaWZ0ID0gMjg7CisgIHRhYmxlLT5tYXNrID0gMzsKKyAgdGFibGUtPmtleV90eXBlID0gdHlwZTsKKworICBfZGJ1c19hc3NlcnQgKHRhYmxlLT5tYXNrIDwgdGFibGUtPm5fYnVja2V0cyk7CisgIAorICBzd2l0Y2ggKHRhYmxlLT5rZXlfdHlwZSkKKyAgICB7CisgICAgY2FzZSBEQlVTX0hBU0hfSU5UOgorICAgIGNhc2UgREJVU19IQVNIX1VJTlRQVFI6CisgICAgICB0YWJsZS0+ZmluZF9mdW5jdGlvbiA9IGZpbmRfZGlyZWN0X2Z1bmN0aW9uOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX0hBU0hfU1RSSU5HOgorICAgICAgdGFibGUtPmZpbmRfZnVuY3Rpb24gPSBmaW5kX3N0cmluZ19mdW5jdGlvbjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJVbmtub3duIGhhc2ggdGFibGUgdHlwZSIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHRhYmxlLT5mcmVlX2tleV9mdW5jdGlvbiA9IGtleV9mcmVlX2Z1bmN0aW9uOworICB0YWJsZS0+ZnJlZV92YWx1ZV9mdW5jdGlvbiA9IHZhbHVlX2ZyZWVfZnVuY3Rpb247CisKKyAgcmV0dXJuIHRhYmxlOworfQorCisKKy8qKgorICogSW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IGZvciBhIGhhc2ggdGFibGUuCisgKgorICogQHBhcmFtIHRhYmxlIHRoZSBoYXNoIHRhYmxlIHRvIGFkZCBhIHJlZmVyZW5jZSB0by4KKyAqIEByZXR1cm5zIHRoZSBoYXNoIHRhYmxlLgorICovCitEQnVzSGFzaFRhYmxlICoKK19kYnVzX2hhc2hfdGFibGVfcmVmIChEQnVzSGFzaFRhYmxlICp0YWJsZSkKK3sKKyAgdGFibGUtPnJlZmNvdW50ICs9IDE7CisgIAorICByZXR1cm4gdGFibGU7Cit9CisKKy8qKgorICogRGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IGZvciBhIGhhc2ggdGFibGUsCisgKiBmcmVlaW5nIHRoZSBoYXNoIHRhYmxlIGlmIHRoZSBjb3VudCByZWFjaGVzIHplcm8uCisgKgorICogQHBhcmFtIHRhYmxlIHRoZSBoYXNoIHRhYmxlIHRvIHJlbW92ZSBhIHJlZmVyZW5jZSBmcm9tLgorICovCit2b2lkCitfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChEQnVzSGFzaFRhYmxlICp0YWJsZSkKK3sKKyAgdGFibGUtPnJlZmNvdW50IC09IDE7CisKKyAgaWYgKHRhYmxlLT5yZWZjb3VudCA9PSAwKQorICAgIHsKKyNpZiAwCisgICAgICBEQnVzSGFzaEVudHJ5ICplbnRyeTsKKyAgICAgIERCdXNIYXNoRW50cnkgKm5leHQ7CisgICAgICBpbnQgaTsKKworICAgICAgLyogRnJlZSB0aGUgZW50cmllcyBpbiB0aGUgdGFibGUuICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgdGFibGUtPm5fYnVja2V0czsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgZW50cnkgPSB0YWJsZS0+YnVja2V0c1tpXTsKKyAgICAgICAgICB3aGlsZSAoZW50cnkgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbmV4dCA9IGVudHJ5LT5uZXh0OworCisgICAgICAgICAgICAgIGZyZWVfZW50cnkgKHRhYmxlLCBlbnRyeSk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBlbnRyeSA9IG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbHNlCisgICAgICBEQnVzSGFzaEVudHJ5ICplbnRyeTsKKyAgICAgIGludCBpOworCisgICAgICAvKiBGcmVlIHRoZSBlbnRyaWVzIGluIHRoZSB0YWJsZS4gKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCB0YWJsZS0+bl9idWNrZXRzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBlbnRyeSA9IHRhYmxlLT5idWNrZXRzW2ldOworICAgICAgICAgIHdoaWxlIChlbnRyeSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcmVlX2VudHJ5X2RhdGEgKHRhYmxlLCBlbnRyeSk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBlbnRyeSA9IGVudHJ5LT5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAvKiBXZSBjYW4gZG8gdGhpcyB2ZXJ5IHF1aWNrbHkgd2l0aCBtZW1vcnkgcG9vbHMgOy0pICovCisgICAgICBfZGJ1c19tZW1fcG9vbF9mcmVlICh0YWJsZS0+ZW50cnlfcG9vbCk7CisjZW5kaWYKKyAgICAgIAorICAgICAgLyogRnJlZSB0aGUgYnVja2V0IGFycmF5LCBpZiBpdCB3YXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkLiAqLworICAgICAgaWYgKHRhYmxlLT5idWNrZXRzICE9IHRhYmxlLT5zdGF0aWNfYnVja2V0cykKKyAgICAgICAgZGJ1c19mcmVlICh0YWJsZS0+YnVja2V0cyk7CisKKyAgICAgIGRidXNfZnJlZSAodGFibGUpOworICAgIH0KK30KKworLyoqCisgKiBSZW1vdmVkIGFsbCBlbnRyaWVzIGZyb20gYSBoYXNoIHRhYmxlLgorICoKKyAqIEBwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZSB0byByZW1vdmUgYWxsIGVudHJpZXMgZnJvbS4KKyAqLwordm9pZAorX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfYWxsIChEQnVzSGFzaFRhYmxlICp0YWJsZSkKK3sKKyAgREJ1c0hhc2hJdGVyIGl0ZXI7CisgIF9kYnVzX2hhc2hfaXRlcl9pbml0ICh0YWJsZSwgJml0ZXIpOworICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICB7CisgICAgICBfZGJ1c19oYXNoX2l0ZXJfcmVtb3ZlX2VudHJ5KCZpdGVyKTsKKyAgICB9Cit9CisKK3N0YXRpYyBEQnVzSGFzaEVudHJ5KgorYWxsb2NfZW50cnkgKERCdXNIYXNoVGFibGUgKnRhYmxlKQoreworICBEQnVzSGFzaEVudHJ5ICplbnRyeTsKKworICBlbnRyeSA9IF9kYnVzX21lbV9wb29sX2FsbG9jICh0YWJsZS0+ZW50cnlfcG9vbCk7CisgIAorICByZXR1cm4gZW50cnk7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX2VudHJ5X2RhdGEgKERCdXNIYXNoVGFibGUgICp0YWJsZSwKKwkJIERCdXNIYXNoRW50cnkgICplbnRyeSkKK3sKKyAgaWYgKHRhYmxlLT5mcmVlX2tleV9mdW5jdGlvbikKKyAgICAoKiB0YWJsZS0+ZnJlZV9rZXlfZnVuY3Rpb24pIChlbnRyeS0+a2V5KTsKKyAgaWYgKHRhYmxlLT5mcmVlX3ZhbHVlX2Z1bmN0aW9uKQorICAgICgqIHRhYmxlLT5mcmVlX3ZhbHVlX2Z1bmN0aW9uKSAoZW50cnktPnZhbHVlKTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfZW50cnkgKERCdXNIYXNoVGFibGUgICp0YWJsZSwKKyAgICAgICAgICAgIERCdXNIYXNoRW50cnkgICplbnRyeSkKK3sKKyAgZnJlZV9lbnRyeV9kYXRhICh0YWJsZSwgZW50cnkpOworICBfZGJ1c19tZW1fcG9vbF9kZWFsbG9jICh0YWJsZS0+ZW50cnlfcG9vbCwgZW50cnkpOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX2VudHJ5IChEQnVzSGFzaFRhYmxlICAqdGFibGUsCisgICAgICAgICAgICAgIERCdXNIYXNoRW50cnkgKipidWNrZXQsCisgICAgICAgICAgICAgIERCdXNIYXNoRW50cnkgICplbnRyeSkKK3sKKyAgX2RidXNfYXNzZXJ0ICh0YWJsZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChidWNrZXQgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoKmJ1Y2tldCAhPSBOVUxMKTsgIAorICBfZGJ1c19hc3NlcnQgKGVudHJ5ICE9IE5VTEwpOworICAKKyAgaWYgKCpidWNrZXQgPT0gZW50cnkpCisgICAgKmJ1Y2tldCA9IGVudHJ5LT5uZXh0OworICBlbHNlCisgICAgeworICAgICAgREJ1c0hhc2hFbnRyeSAqcHJldjsKKyAgICAgIHByZXYgPSAqYnVja2V0OworCisgICAgICB3aGlsZSAocHJldi0+bmV4dCAhPSBlbnRyeSkKKyAgICAgICAgcHJldiA9IHByZXYtPm5leHQ7ICAgICAgCisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAocHJldiAhPSBOVUxMKTsKKworICAgICAgcHJldi0+bmV4dCA9IGVudHJ5LT5uZXh0OworICAgIH0KKyAgCisgIHRhYmxlLT5uX2VudHJpZXMgLT0gMTsKKyAgZnJlZV9lbnRyeSAodGFibGUsIGVudHJ5KTsKK30KKworLyoqCisgKiBJbml0aWFsaXplcyBhIGhhc2ggdGFibGUgaXRlcmF0b3IuIFRvIGl0ZXJhdGUgb3ZlciBhbGwgZW50cmllcyBpbiBhCisgKiBoYXNoIHRhYmxlLCB1c2UgdGhlIGZvbGxvd2luZyBjb2RlICh0aGUgcHJpbnRmIGFzc3VtZXMgYSBoYXNoCisgKiBmcm9tIHN0cmluZ3MgdG8gc3RyaW5ncyBvYnZpb3VzbHkpOgorICoKKyAqIEBjb2RlCisgKiBEQnVzSGFzaEl0ZXIgaXRlcjsKKyAqCisgKiBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAodGFibGUsICZpdGVyKTsKKyAqIHdoaWxlIChfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpKQorICogICB7CisgKiAgICAgIHByaW50ZiAoIlRoZSBmaXJzdCBrZXkgaXMgJXMgYW5kIHZhbHVlIGlzICVzXG4iLAorICogICAgICAgICAgICAgIF9kYnVzX2hhc2hfaXRlcl9nZXRfc3RyaW5nX2tleSAoJml0ZXIpLAorICogICAgICAgICAgICAgIF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKSk7CisgKiAgIH0KKyAqIAorICogCisgKiBAZW5kY29kZQorICoKKyAqIFRoZSBpdGVyYXRvciBpcyBpbml0aWFsaXplZCBwb2ludGluZyAib25lIGJlZm9yZSIgdGhlIGZpcnN0IGhhc2gKKyAqIGVudHJ5LiBUaGUgZmlyc3QgY2FsbCB0byBfZGJ1c19oYXNoX2l0ZXJfbmV4dCgpIG1vdmVzIGl0IG9udG8KKyAqIHRoZSBmaXJzdCB2YWxpZCBlbnRyeSBvciByZXR1cm5zICNGQUxTRSBpZiB0aGUgaGFzaCB0YWJsZSBpcworICogZW1wdHkuIFN1YnNlcXVlbnQgY2FsbHMgbW92ZSB0byB0aGUgbmV4dCB2YWxpZCBlbnRyeSBvciByZXR1cm4KKyAqICNGQUxTRSBpZiB0aGVyZSBhcmUgbm8gbW9yZSBlbnRyaWVzLgorICoKKyAqIE5vdGUgdGhhdCBpdCBpcyBndWFyYW50ZWVkIHRvIGJlIHNhZmUgdG8gcmVtb3ZlIGEgaGFzaCBlbnRyeSBkdXJpbmcKKyAqIGl0ZXJhdGlvbiwgYnV0IGl0IGlzIG5vdCBzYWZlIHRvIGFkZCBhIGhhc2ggZW50cnkuCisgKiAKKyAqIEBwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZSB0byBpdGVyYXRlIG92ZXIuCisgKiBAcGFyYW0gaXRlciB0aGUgaXRlcmF0b3IgdG8gaW5pdGlhbGl6ZS4KKyAqLwordm9pZAorX2RidXNfaGFzaF9pdGVyX2luaXQgKERCdXNIYXNoVGFibGUgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNIYXNoSXRlciAgKml0ZXIpCit7CisgIERCdXNSZWFsSGFzaEl0ZXIgKnJlYWw7CisgIAorICBfZGJ1c19hc3NlcnQgKHNpemVvZiAoREJ1c0hhc2hJdGVyKSA9PSBzaXplb2YgKERCdXNSZWFsSGFzaEl0ZXIpKTsKKyAgCisgIHJlYWwgPSAoREJ1c1JlYWxIYXNoSXRlciopIGl0ZXI7CisKKyAgcmVhbC0+dGFibGUgPSB0YWJsZTsKKyAgcmVhbC0+YnVja2V0ID0gTlVMTDsKKyAgcmVhbC0+ZW50cnkgPSBOVUxMOworICByZWFsLT5uZXh0X2VudHJ5ID0gTlVMTDsKKyAgcmVhbC0+bmV4dF9idWNrZXQgPSAwOworICByZWFsLT5uX2VudHJpZXNfb25faW5pdCA9IHRhYmxlLT5uX2VudHJpZXM7Cit9CisKKy8qKgorICogTW92ZSB0aGUgaGFzaCBpdGVyYXRvciBmb3J3YXJkIG9uZSBzdGVwLCB0byB0aGUgbmV4dCBoYXNoIGVudHJ5LgorICogVGhlIGRvY3VtZW50YXRpb24gZm9yIF9kYnVzX2hhc2hfaXRlcl9pbml0KCkgZXhwbGFpbnMgaW4gbW9yZQorICogZGV0YWlsLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBpdGVyYXRvciB0byBtb3ZlIGZvcndhcmQuCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlcmUgYXJlIG5vIG1vcmUgZW50cmllcyB0byBtb3ZlIHRvLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGFzaF9pdGVyX25leHQgKERCdXNIYXNoSXRlciAgKml0ZXIpCit7CisgIERCdXNSZWFsSGFzaEl0ZXIgKnJlYWw7CisgIAorICBfZGJ1c19hc3NlcnQgKHNpemVvZiAoREJ1c0hhc2hJdGVyKSA9PSBzaXplb2YgKERCdXNSZWFsSGFzaEl0ZXIpKTsKKyAgCisgIHJlYWwgPSAoREJ1c1JlYWxIYXNoSXRlciopIGl0ZXI7CisKKyAgLyogaWYgdGhpcyBhc3NlcnRpb24gZmFpbGVkIHNvbWVvbmUgcHJvYmFibHkgYWRkZWQgaGFzaCBlbnRyaWVzCisgICAqIGR1cmluZyBpdGVyYXRpb24sIHdoaWNoIGlzIGJhZC4KKyAgICovCisgIF9kYnVzX2Fzc2VydCAocmVhbC0+bl9lbnRyaWVzX29uX2luaXQgPj0gcmVhbC0+dGFibGUtPm5fZW50cmllcyk7CisgIAorICAvKiBSZW1lbWJlciB0aGF0IHJlYWwtPmVudHJ5IG1heSBoYXZlIGJlZW4gZGVsZXRlZCAqLworICAKKyAgd2hpbGUgKHJlYWwtPm5leHRfZW50cnkgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAocmVhbC0+bmV4dF9idWNrZXQgPj0gcmVhbC0+dGFibGUtPm5fYnVja2V0cykKKyAgICAgICAgeworICAgICAgICAgIC8qIGludmFsaWRhdGUgaXRlciBhbmQgcmV0dXJuIGZhbHNlICovCisgICAgICAgICAgcmVhbC0+ZW50cnkgPSBOVUxMOworICAgICAgICAgIHJlYWwtPnRhYmxlID0gTlVMTDsKKyAgICAgICAgICByZWFsLT5idWNrZXQgPSBOVUxMOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICByZWFsLT5idWNrZXQgPSAmKHJlYWwtPnRhYmxlLT5idWNrZXRzW3JlYWwtPm5leHRfYnVja2V0XSk7CisgICAgICByZWFsLT5uZXh0X2VudHJ5ID0gKihyZWFsLT5idWNrZXQpOworICAgICAgcmVhbC0+bmV4dF9idWNrZXQgKz0gMTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT5uZXh0X2VudHJ5ICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHJlYWwtPmJ1Y2tldCAhPSBOVUxMKTsKKyAgCisgIHJlYWwtPmVudHJ5ID0gcmVhbC0+bmV4dF9lbnRyeTsKKyAgcmVhbC0+bmV4dF9lbnRyeSA9IHJlYWwtPmVudHJ5LT5uZXh0OworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogUmVtb3ZlcyB0aGUgY3VycmVudCBlbnRyeSBmcm9tIHRoZSBoYXNoIHRhYmxlLgorICogSWYgYSBrZXlfZnJlZV9mdW5jdGlvbiBvciB2YWx1ZV9mcmVlX2Z1bmN0aW9uCisgKiB3YXMgcHJvdmlkZWQgdG8gX2RidXNfaGFzaF90YWJsZV9uZXcoKSwKKyAqIGZyZWVzIHRoZSBrZXkgYW5kL29yIHZhbHVlIGZvciB0aGlzIGVudHJ5LgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBoYXNoIHRhYmxlIGl0ZXJhdG9yLgorICovCit2b2lkCitfZGJ1c19oYXNoX2l0ZXJfcmVtb3ZlX2VudHJ5IChEQnVzSGFzaEl0ZXIgKml0ZXIpCit7CisgIERCdXNSZWFsSGFzaEl0ZXIgKnJlYWw7CisKKyAgcmVhbCA9IChEQnVzUmVhbEhhc2hJdGVyKikgaXRlcjsKKworICBfZGJ1c19hc3NlcnQgKHJlYWwtPnRhYmxlICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHJlYWwtPmVudHJ5ICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHJlYWwtPmJ1Y2tldCAhPSBOVUxMKTsKKyAgCisgIHJlbW92ZV9lbnRyeSAocmVhbC0+dGFibGUsIHJlYWwtPmJ1Y2tldCwgcmVhbC0+ZW50cnkpOworCisgIHJlYWwtPmVudHJ5ID0gTlVMTDsgLyogbWFrZSBpdCBjcmFzaCBpZiB5b3UgdHJ5IHRvIHVzZSB0aGlzIGVudHJ5ICovCit9CisKKy8qKgorICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgZW50cnkuCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIGhhc2ggdGFibGUgaXRlcmF0b3IuCisgKi8KK3ZvaWQqCitfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlIChEQnVzSGFzaEl0ZXIgKml0ZXIpCit7CisgIERCdXNSZWFsSGFzaEl0ZXIgKnJlYWw7CisKKyAgcmVhbCA9IChEQnVzUmVhbEhhc2hJdGVyKikgaXRlcjsKKworICBfZGJ1c19hc3NlcnQgKHJlYWwtPnRhYmxlICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHJlYWwtPmVudHJ5ICE9IE5VTEwpOworCisgIHJldHVybiByZWFsLT5lbnRyeS0+dmFsdWU7Cit9CisKKy8qKgorICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgZW50cnkuCisgKiBJZiB0aGUgaGFzaCB0YWJsZSBoYXMgYSB2YWx1ZV9mcmVlX2Z1bmN0aW9uCisgKiBpdCB3aWxsIGJlIHVzZWQgdG8gZnJlZSB0aGUgcHJldmlvdXMgdmFsdWUuCisgKiBUaGUgaGFzaCB0YWJsZSB3aWxsIG93biB0aGUgcGFzc2VkLWluIHZhbHVlCisgKiAoaXQgd2lsbCBub3QgYmUgY29waWVkKS4KKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgaGFzaCB0YWJsZSBpdGVyYXRvci4KKyAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlLgorICovCit2b2lkCitfZGJ1c19oYXNoX2l0ZXJfc2V0X3ZhbHVlIChEQnVzSGFzaEl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgKnZhbHVlKQoreworICBEQnVzUmVhbEhhc2hJdGVyICpyZWFsOworCisgIHJlYWwgPSAoREJ1c1JlYWxIYXNoSXRlciopIGl0ZXI7CisKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT50YWJsZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT5lbnRyeSAhPSBOVUxMKTsKKworICBpZiAocmVhbC0+dGFibGUtPmZyZWVfdmFsdWVfZnVuY3Rpb24gJiYgdmFsdWUgIT0gcmVhbC0+ZW50cnktPnZhbHVlKSAgICAKKyAgICAoKiByZWFsLT50YWJsZS0+ZnJlZV92YWx1ZV9mdW5jdGlvbikgKHJlYWwtPmVudHJ5LT52YWx1ZSk7CisgIAorICByZWFsLT5lbnRyeS0+dmFsdWUgPSB2YWx1ZTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBrZXkgZm9yIHRoZSBjdXJyZW50IGVudHJ5LgorICogT25seSB3b3JrcyBmb3IgaGFzaCB0YWJsZXMgb2YgdHlwZSAjREJVU19IQVNIX0lOVC4KKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgaGFzaCB0YWJsZSBpdGVyYXRvci4KKyAqLworaW50CitfZGJ1c19oYXNoX2l0ZXJfZ2V0X2ludF9rZXkgKERCdXNIYXNoSXRlciAqaXRlcikKK3sKKyAgREJ1c1JlYWxIYXNoSXRlciAqcmVhbDsKKworICByZWFsID0gKERCdXNSZWFsSGFzaEl0ZXIqKSBpdGVyOworCisgIF9kYnVzX2Fzc2VydCAocmVhbC0+dGFibGUgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocmVhbC0+ZW50cnkgIT0gTlVMTCk7CisKKyAgcmV0dXJuIF9EQlVTX1BPSU5URVJfVE9fSU5UIChyZWFsLT5lbnRyeS0+a2V5KTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBrZXkgZm9yIHRoZSBjdXJyZW50IGVudHJ5LgorICogT25seSB3b3JrcyBmb3IgaGFzaCB0YWJsZXMgb2YgdHlwZSAjREJVU19IQVNIX1VJTlRQVFIuCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIGhhc2ggdGFibGUgaXRlcmF0b3IuCisgKi8KK3VpbnRwdHJfdAorX2RidXNfaGFzaF9pdGVyX2dldF91aW50cHRyX2tleSAoREJ1c0hhc2hJdGVyICppdGVyKQoreworICBEQnVzUmVhbEhhc2hJdGVyICpyZWFsOworCisgIHJlYWwgPSAoREJ1c1JlYWxIYXNoSXRlciopIGl0ZXI7CisKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT50YWJsZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT5lbnRyeSAhPSBOVUxMKTsKKworICByZXR1cm4gKHVpbnRwdHJfdCkgcmVhbC0+ZW50cnktPmtleTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBrZXkgZm9yIHRoZSBjdXJyZW50IGVudHJ5LgorICogT25seSB3b3JrcyBmb3IgaGFzaCB0YWJsZXMgb2YgdHlwZSAjREJVU19IQVNIX1NUUklORworICogQHBhcmFtIGl0ZXIgdGhlIGhhc2ggdGFibGUgaXRlcmF0b3IuCisgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c19oYXNoX2l0ZXJfZ2V0X3N0cmluZ19rZXkgKERCdXNIYXNoSXRlciAqaXRlcikKK3sKKyAgREJ1c1JlYWxIYXNoSXRlciAqcmVhbDsKKworICByZWFsID0gKERCdXNSZWFsSGFzaEl0ZXIqKSBpdGVyOworCisgIF9kYnVzX2Fzc2VydCAocmVhbC0+dGFibGUgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocmVhbC0+ZW50cnkgIT0gTlVMTCk7CisKKyAgcmV0dXJuIHJlYWwtPmVudHJ5LT5rZXk7Cit9CisKKy8qKgorICogQSBsb3ctbGV2ZWwgYnV0IGVmZmljaWVudCBpbnRlcmZhY2UgZm9yIG1hbmlwdWxhdGluZyB0aGUgaGFzaAorICogdGFibGUuICBJdCdzIGVmZmljaWVudCBiZWNhdXNlIHlvdSBjYW4gZ2V0LCBzZXQsIGFuZCBvcHRpb25hbGx5CisgKiBjcmVhdGUgdGhlIGhhc2ggZW50cnkgd2hpbGUgb25seSBydW5uaW5nIHRoZSBoYXNoIGZ1bmN0aW9uIG9uZQorICogdGltZS4KKyAqCisgKiBOb3RlIHRoYXQgd2hpbGUgY2FsbGluZyBfZGJ1c19oYXNoX2l0ZXJfbmV4dCgpIG9uIHRoZSBpdGVyYXRvcgorICogZmlsbGVkIGluIGJ5IHRoaXMgZnVuY3Rpb24gbWF5IHdvcmssIGl0J3MgY29tcGxldGVseQorICogdW5kZWZpbmVkIHdoaWNoIGVudHJpZXMgYXJlIGFmdGVyIHRoaXMgaXRlciBhbmQgd2hpY2gKKyAqIGFyZSBiZWZvcmUgaXQuIFNvIGl0IHdvdWxkIGJlIHNpbGx5IHRvIGl0ZXJhdGUgdXNpbmcgdGhpcworICogaXRlcmF0b3IuCisgKgorICogSWYgdGhlIGhhc2ggZW50cnkgaXMgY3JlYXRlZCwgaXRzIHZhbHVlIHdpbGwgYmUgaW5pdGlhbGl6ZWQKKyAqIHRvIGFsbCBiaXRzIHplcm8uCisgKgorICogI0ZBTFNFIG1heSBiZSByZXR1cm5lZCBkdWUgdG8gbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSwgb3IKKyAqIGJlY2F1c2UgY3JlYXRlX2lmX25vdF9mb3VuZCB3YXMgI0ZBTFNFIGFuZCB0aGUgZW50cnkKKyAqIGRpZCBub3QgZXhpc3QuCisgKgorICogSWYgY3JlYXRlX2lmX25vdF9mb3VuZCBpcyAjVFJVRSBhbmQgdGhlIGVudHJ5IGlzIGNyZWF0ZWQsIHRoZSBoYXNoCisgKiB0YWJsZSB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIGtleSB0aGF0J3MgcGFzc2VkIGluLgorICoKKyAqIEZvciBhIGhhc2ggdGFibGUgb2YgdHlwZSAjREJVU19IQVNIX0lOVCwgY2FzdCB0aGUgaW50CisgKiBrZXkgdG8gdGhlIGtleSBwYXJhbWV0ZXIgdXNpbmcgI19EQlVTX0lOVF9UT19QT0lOVEVSKCkuCisgKiAKKyAqIEBwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZS4KKyAqIEBwYXJhbSBrZXkgdGhlIGhhc2gga2V5LgorICogQHBhcmFtIGNyZWF0ZV9pZl9ub3RfZm91bmQgaWYgI1RSVUUsIGNyZWF0ZSB0aGUgZW50cnkgaWYgaXQgZGlkbid0IGV4aXN0LgorICogQHBhcmFtIGl0ZXIgdGhlIGl0ZXJhdG9yIHRvIGluaXRpYWxpemUuCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgaGFzaCBlbnRyeSBub3cgZXhpc3RzIChhbmQgdGhlIGl0ZXJhdG9yIGlzIHRodXMgdmFsaWQpLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGFzaF9pdGVyX2xvb2t1cCAoREJ1c0hhc2hUYWJsZSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICBjcmVhdGVfaWZfbm90X2ZvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hJdGVyICAqaXRlcikKK3sKKyAgREJ1c1JlYWxIYXNoSXRlciAqcmVhbDsKKyAgREJ1c0hhc2hFbnRyeSAqZW50cnk7CisgIERCdXNIYXNoRW50cnkgKipidWNrZXQ7CisgIAorICBfZGJ1c19hc3NlcnQgKHNpemVvZiAoREJ1c0hhc2hJdGVyKSA9PSBzaXplb2YgKERCdXNSZWFsSGFzaEl0ZXIpKTsKKyAgCisgIHJlYWwgPSAoREJ1c1JlYWxIYXNoSXRlciopIGl0ZXI7CisKKyAgZW50cnkgPSAoKiB0YWJsZS0+ZmluZF9mdW5jdGlvbikgKHRhYmxlLCBrZXksIGNyZWF0ZV9pZl9ub3RfZm91bmQsICZidWNrZXQsIE5VTEwpOworCisgIGlmIChlbnRyeSA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIHJlYWwtPnRhYmxlID0gdGFibGU7CisgIHJlYWwtPmJ1Y2tldCA9IGJ1Y2tldDsKKyAgcmVhbC0+ZW50cnkgPSBlbnRyeTsKKyAgcmVhbC0+bmV4dF9lbnRyeSA9IGVudHJ5LT5uZXh0OworICByZWFsLT5uZXh0X2J1Y2tldCA9IChidWNrZXQgLSB0YWJsZS0+YnVja2V0cykgKyAxOworICByZWFsLT5uX2VudHJpZXNfb25faW5pdCA9IHRhYmxlLT5uX2VudHJpZXM7IAorCisgIF9kYnVzX2Fzc2VydCAoJih0YWJsZS0+YnVja2V0c1tyZWFsLT5uZXh0X2J1Y2tldC0xXSkgPT0gcmVhbC0+YnVja2V0KTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorYWRkX2FsbG9jYXRlZF9lbnRyeSAoREJ1c0hhc2hUYWJsZSAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNIYXNoRW50cnkgICAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgIGlkeCwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAqKipidWNrZXQpCit7CisgIERCdXNIYXNoRW50cnkgKipiOyAgCisgIAorICBlbnRyeS0+a2V5ID0ga2V5OworICAKKyAgYiA9ICYodGFibGUtPmJ1Y2tldHNbaWR4XSk7CisgIGVudHJ5LT5uZXh0ID0gKmI7CisgICpiID0gZW50cnk7CisKKyAgaWYgKGJ1Y2tldCkKKyAgICAqYnVja2V0ID0gYjsKKyAgCisgIHRhYmxlLT5uX2VudHJpZXMgKz0gMTsKKworICAvKiBub3RlIHdlIE9OTFkgcmVidWlsZCB3aGVuIEFERElORyAtIGJlY2F1c2UgeW91IGNhbiBpdGVyYXRlIG92ZXIgYQorICAgKiB0YWJsZSBhbmQgcmVtb3ZlIGVudHJpZXMgc2FmZWx5LgorICAgKi8KKyAgaWYgKHRhYmxlLT5uX2VudHJpZXMgPj0gdGFibGUtPmhpX3JlYnVpbGRfc2l6ZSB8fAorICAgICAgdGFibGUtPm5fZW50cmllcyA8IHRhYmxlLT5sb19yZWJ1aWxkX3NpemUpCisgICAgcmVidWlsZF90YWJsZSAodGFibGUpOworfQorCitzdGF0aWMgREJ1c0hhc2hFbnRyeSoKK2FkZF9lbnRyeSAoREJ1c0hhc2hUYWJsZSAgICAgICAgKnRhYmxlLCAKKyAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgIGlkeCwKKyAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgKmtleSwKKyAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAgICAgICoqKmJ1Y2tldCwKKyAgICAgICAgICAgREJ1c1ByZWFsbG9jYXRlZEhhc2ggKnByZWFsbG9jYXRlZCkKK3sKKyAgREJ1c0hhc2hFbnRyeSAgKmVudHJ5OworCisgIGlmIChwcmVhbGxvY2F0ZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICBlbnRyeSA9IGFsbG9jX2VudHJ5ICh0YWJsZSk7CisgICAgICBpZiAoZW50cnkgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChidWNrZXQpCisgICAgICAgICAgICAqYnVja2V0ID0gTlVMTDsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGVudHJ5ID0gKERCdXNIYXNoRW50cnkqKSBwcmVhbGxvY2F0ZWQ7CisgICAgfQorCisgIGFkZF9hbGxvY2F0ZWRfZW50cnkgKHRhYmxlLCBlbnRyeSwgaWR4LCBrZXksIGJ1Y2tldCk7CisKKyAgcmV0dXJuIGVudHJ5OworfQorCisvKiBUaGlzIGlzIGdfc3RyX2hhc2ggZnJvbSBHTGliIHdoaWNoIHdhcworICogZXh0ZW5zaXZlbHkgZGlzY3Vzc2VkL3Rlc3RlZC9wcm9maWxlZAorICovCitzdGF0aWMgdW5zaWduZWQgaW50CitzdHJpbmdfaGFzaCAoY29uc3QgY2hhciAqc3RyKQoreworICBjb25zdCBjaGFyICpwID0gc3RyOworICB1bnNpZ25lZCBpbnQgaCA9ICpwOworCisgIGlmIChoKQorICAgIGZvciAocCArPSAxOyAqcCAhPSAnXDAnOyBwKyspCisgICAgICBoID0gKGggPDwgNSkgLSBoICsgKnA7CisKKyAgcmV0dXJuIGg7Cit9CisKKy8qKiBLZXkgY29tcGFyaXNvbiBmdW5jdGlvbiAqLwordHlwZWRlZiBpbnQgKCogS2V5Q29tcGFyZUZ1bmMpIChjb25zdCB2b2lkICprZXlfYSwgY29uc3Qgdm9pZCAqa2V5X2IpOworCitzdGF0aWMgREJ1c0hhc2hFbnRyeSoKK2ZpbmRfZ2VuZXJpY19mdW5jdGlvbiAoREJ1c0hhc2hUYWJsZSAgICAgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgaWR4LAorICAgICAgICAgICAgICAgICAgICAgICBLZXlDb21wYXJlRnVuYyAgICAgICAgY29tcGFyZV9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgY3JlYXRlX2lmX25vdF9mb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAgICAgICoqKmJ1Y2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ByZWFsbG9jYXRlZEhhc2ggKnByZWFsbG9jYXRlZCkKK3sKKyAgREJ1c0hhc2hFbnRyeSAqZW50cnk7CisKKyAgaWYgKGJ1Y2tldCkKKyAgICAqYnVja2V0ID0gTlVMTDsKKworICAvKiBTZWFyY2ggYWxsIG9mIHRoZSBlbnRyaWVzIGluIHRoaXMgYnVja2V0LiAqLworICBlbnRyeSA9IHRhYmxlLT5idWNrZXRzW2lkeF07CisgIHdoaWxlIChlbnRyeSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICgoY29tcGFyZV9mdW5jID09IE5VTEwgJiYga2V5ID09IGVudHJ5LT5rZXkpIHx8CisgICAgICAgICAgKGNvbXBhcmVfZnVuYyAhPSBOVUxMICYmICgqIGNvbXBhcmVfZnVuYykgKGtleSwgZW50cnktPmtleSkgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoYnVja2V0KQorICAgICAgICAgICAgKmJ1Y2tldCA9ICYodGFibGUtPmJ1Y2tldHNbaWR4XSk7CisKKyAgICAgICAgICBpZiAocHJlYWxsb2NhdGVkKQorICAgICAgICAgICAgX2RidXNfaGFzaF90YWJsZV9mcmVlX3ByZWFsbG9jYXRlZF9lbnRyeSAodGFibGUsIHByZWFsbG9jYXRlZCk7CisgICAgICAgICAgCisgICAgICAgICAgcmV0dXJuIGVudHJ5OworICAgICAgICB9CisgICAgICAKKyAgICAgIGVudHJ5ID0gZW50cnktPm5leHQ7CisgICAgfQorCisgIGlmIChjcmVhdGVfaWZfbm90X2ZvdW5kKQorICAgIGVudHJ5ID0gYWRkX2VudHJ5ICh0YWJsZSwgaWR4LCBrZXksIGJ1Y2tldCwgcHJlYWxsb2NhdGVkKTsKKyAgZWxzZSBpZiAocHJlYWxsb2NhdGVkKQorICAgIF9kYnVzX2hhc2hfdGFibGVfZnJlZV9wcmVhbGxvY2F0ZWRfZW50cnkgKHRhYmxlLCBwcmVhbGxvY2F0ZWQpOworICAKKyAgcmV0dXJuIGVudHJ5OworfQorCitzdGF0aWMgREJ1c0hhc2hFbnRyeSoKK2ZpbmRfc3RyaW5nX2Z1bmN0aW9uIChEQnVzSGFzaFRhYmxlICAgICAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgY3JlYXRlX2lmX25vdF9mb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzSGFzaEVudHJ5ICAgICAgKioqYnVja2V0LAorICAgICAgICAgICAgICAgICAgICAgIERCdXNQcmVhbGxvY2F0ZWRIYXNoICpwcmVhbGxvY2F0ZWQpCit7CisgIHVuc2lnbmVkIGludCBpZHg7CisgIAorICBpZHggPSBzdHJpbmdfaGFzaCAoa2V5KSAmIHRhYmxlLT5tYXNrOworCisgIHJldHVybiBmaW5kX2dlbmVyaWNfZnVuY3Rpb24gKHRhYmxlLCBrZXksIGlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEtleUNvbXBhcmVGdW5jKSBzdHJjbXAsIGNyZWF0ZV9pZl9ub3RfZm91bmQsIGJ1Y2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlYWxsb2NhdGVkKTsKK30KKworc3RhdGljIERCdXNIYXNoRW50cnkqCitmaW5kX2RpcmVjdF9mdW5jdGlvbiAoREJ1c0hhc2hUYWJsZSAgICAgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgIGNyZWF0ZV9pZl9ub3RfZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAgICAgICoqKmJ1Y2tldCwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzUHJlYWxsb2NhdGVkSGFzaCAqcHJlYWxsb2NhdGVkKQoreworICB1bnNpZ25lZCBpbnQgaWR4OworICAKKyAgaWR4ID0gUkFORE9NX0lOREVYICh0YWJsZSwga2V5KSAmIHRhYmxlLT5tYXNrOworCisKKyAgcmV0dXJuIGZpbmRfZ2VuZXJpY19mdW5jdGlvbiAodGFibGUsIGtleSwgaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBjcmVhdGVfaWZfbm90X2ZvdW5kLCBidWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWFsbG9jYXRlZCk7Cit9CisKK3N0YXRpYyB2b2lkCityZWJ1aWxkX3RhYmxlIChEQnVzSGFzaFRhYmxlICp0YWJsZSkKK3sKKyAgaW50IG9sZF9zaXplOworICBpbnQgbmV3X2J1Y2tldHM7CisgIERCdXNIYXNoRW50cnkgKipvbGRfYnVja2V0czsKKyAgREJ1c0hhc2hFbnRyeSAqKm9sZF9jaGFpbjsKKyAgREJ1c0hhc2hFbnRyeSAqZW50cnk7CisgIGRidXNfYm9vbF90IGdyb3dpbmc7CisgIAorICAvKgorICAgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgbmV3IGJ1Y2tldCBhcnJheSwgYW5kIHNldCB1cAorICAgKiBoYXNoaW5nIGNvbnN0YW50cyBmb3IgbmV3IGFycmF5IHNpemUuCisgICAqLworCisgIGdyb3dpbmcgPSB0YWJsZS0+bl9lbnRyaWVzID49IHRhYmxlLT5oaV9yZWJ1aWxkX3NpemU7CisgIAorICBvbGRfc2l6ZSA9IHRhYmxlLT5uX2J1Y2tldHM7CisgIG9sZF9idWNrZXRzID0gdGFibGUtPmJ1Y2tldHM7CisKKyAgaWYgKGdyb3dpbmcpCisgICAgeworICAgICAgLyogb3ZlcmZsb3cgcGFyYW5vaWEgKi8KKyAgICAgIGlmICh0YWJsZS0+bl9idWNrZXRzIDwgX0RCVVNfSU5UX01BWCAvIDQgJiYKKyAgICAgICAgICB0YWJsZS0+ZG93bl9zaGlmdCA+PSAwKQorICAgICAgICBuZXdfYnVja2V0cyA9IHRhYmxlLT5uX2J1Y2tldHMgKiA0OworICAgICAgZWxzZQorICAgICAgICByZXR1cm47IC8qIGNhbid0IGdyb3cgYW55bW9yZSAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG5ld19idWNrZXRzID0gdGFibGUtPm5fYnVja2V0cyAvIDQ7CisgICAgICBpZiAobmV3X2J1Y2tldHMgPCBEQlVTX1NNQUxMX0hBU0hfVEFCTEUpCisgICAgICAgIHJldHVybjsgLyogZG9uJ3QgYm90aGVyIHNocmlua2luZyB0aGlzIGZhciAqLworICAgIH0KKworICB0YWJsZS0+YnVja2V0cyA9IGRidXNfbmV3MCAoREJ1c0hhc2hFbnRyeSosIG5ld19idWNrZXRzKTsKKyAgaWYgKHRhYmxlLT5idWNrZXRzID09IE5VTEwpCisgICAgeworICAgICAgLyogb3V0IG9mIG1lbW9yeSwgeWF5IC0ganVzdCBkb24ndCByZWFsbG9jYXRlLCB0aGUgdGFibGUgd2lsbAorICAgICAgICogc3RpbGwgd29yaywgYWxiZWl0IG1vcmUgc2xvd2x5LgorICAgICAgICovCisgICAgICB0YWJsZS0+YnVja2V0cyA9IG9sZF9idWNrZXRzOworICAgICAgcmV0dXJuOworICAgIH0KKworICB0YWJsZS0+bl9idWNrZXRzID0gbmV3X2J1Y2tldHM7CisgIAorICBpZiAoZ3Jvd2luZykKKyAgICB7CisgICAgICB0YWJsZS0+bG9fcmVidWlsZF9zaXplID0gdGFibGUtPmhpX3JlYnVpbGRfc2l6ZTsKKyAgICAgIHRhYmxlLT5oaV9yZWJ1aWxkX3NpemUgKj0gNDsKKyAgICAgIAorICAgICAgdGFibGUtPmRvd25fc2hpZnQgLT0gMjsgICAgICAgICAgICAgICAvKiBrZWVwIDIgbW9yZSBoaWdoIGJpdHMgKi8KKyAgICAgIHRhYmxlLT5tYXNrID0gKHRhYmxlLT5tYXNrIDw8IDIpICsgMzsgLyoga2VlcCAyIG1vcmUgaGlnaCBiaXRzICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdGFibGUtPmhpX3JlYnVpbGRfc2l6ZSA9IHRhYmxlLT5sb19yZWJ1aWxkX3NpemU7CisgICAgICB0YWJsZS0+bG9fcmVidWlsZF9zaXplIC89IDQ7CisKKyAgICAgIHRhYmxlLT5kb3duX3NoaWZ0ICs9IDI7ICAgICAgICAgLyoga2VlcCAyIGZld2VyIGhpZ2ggYml0cyAqLworICAgICAgdGFibGUtPm1hc2sgPSB0YWJsZS0+bWFzayA+PiAyOyAvKiBrZWVwIDIgZmV3ZXIgaGlnaCBiaXRzICovCisgICAgfQorCisjaWYgMAorICBwcmludGYgKCIlcyB0YWJsZSB0byBsbyA9ICVkIGhpID0gJWQgZG93bnNoaWZ0ID0gJWQgbWFzayA9IDB4JXhcbiIsCisgICAgICAgICAgZ3Jvd2luZyA/ICJHUk9XIiA6ICJTSFJJTksiLAorICAgICAgICAgIHRhYmxlLT5sb19yZWJ1aWxkX3NpemUsCisgICAgICAgICAgdGFibGUtPmhpX3JlYnVpbGRfc2l6ZSwKKyAgICAgICAgICB0YWJsZS0+ZG93bl9zaGlmdCwKKyAgICAgICAgICB0YWJsZS0+bWFzayk7CisjZW5kaWYKKyAgCisgIF9kYnVzX2Fzc2VydCAodGFibGUtPmxvX3JlYnVpbGRfc2l6ZSA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0ICh0YWJsZS0+aGlfcmVidWlsZF9zaXplID4gdGFibGUtPmxvX3JlYnVpbGRfc2l6ZSk7CisgIF9kYnVzX2Fzc2VydCAodGFibGUtPm1hc2sgIT0gMCk7CisgIC8qIHRoZSBtYXNrIGlzIGVzc2VudGlhbGx5IHRoZSBtYXggaW5kZXggKi8KKyAgX2RidXNfYXNzZXJ0ICh0YWJsZS0+bWFzayA8IHRhYmxlLT5uX2J1Y2tldHMpOworICAKKyAgLyoKKyAgICogUmVoYXNoIGFsbCBvZiB0aGUgZXhpc3RpbmcgZW50cmllcyBpbnRvIHRoZSBuZXcgYnVja2V0IGFycmF5LgorICAgKi8KKworICBmb3IgKG9sZF9jaGFpbiA9IG9sZF9idWNrZXRzOyBvbGRfc2l6ZSA+IDA7IG9sZF9zaXplLS0sIG9sZF9jaGFpbisrKQorICAgIHsKKyAgICAgIGZvciAoZW50cnkgPSAqb2xkX2NoYWluOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9ICpvbGRfY2hhaW4pCisgICAgICAgIHsKKyAgICAgICAgICB1bnNpZ25lZCBpbnQgaWR4OworICAgICAgICAgIERCdXNIYXNoRW50cnkgKipidWNrZXQ7CisgICAgICAgICAgCisgICAgICAgICAgKm9sZF9jaGFpbiA9IGVudHJ5LT5uZXh0OworICAgICAgICAgIHN3aXRjaCAodGFibGUtPmtleV90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBEQlVTX0hBU0hfU1RSSU5HOgorICAgICAgICAgICAgICBpZHggPSBzdHJpbmdfaGFzaCAoZW50cnktPmtleSkgJiB0YWJsZS0+bWFzazsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERCVVNfSEFTSF9JTlQ6CisgICAgICAgICAgICBjYXNlIERCVVNfSEFTSF9VSU5UUFRSOgorICAgICAgICAgICAgICBpZHggPSBSQU5ET01fSU5ERVggKHRhYmxlLCBlbnRyeS0+a2V5KTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBpZHggPSAwOworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJVbmtub3duIGhhc2ggdGFibGUgdHlwZSIpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBidWNrZXQgPSAmKHRhYmxlLT5idWNrZXRzW2lkeF0pOworICAgICAgICAgIGVudHJ5LT5uZXh0ID0gKmJ1Y2tldDsKKyAgICAgICAgICAqYnVja2V0ID0gZW50cnk7CisgICAgICAgIH0KKyAgICB9CisgIAorICAvKiBGcmVlIHRoZSBvbGQgYnVja2V0IGFycmF5LCBpZiBpdCB3YXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkLiAqLworCisgIGlmIChvbGRfYnVja2V0cyAhPSB0YWJsZS0+c3RhdGljX2J1Y2tldHMpCisgICAgZGJ1c19mcmVlIChvbGRfYnVja2V0cyk7Cit9CisKKy8qKgorICogTG9va3MgdXAgdGhlIHZhbHVlIGZvciBhIGdpdmVuIHN0cmluZyBpbiBhIGhhc2ggdGFibGUKKyAqIG9mIHR5cGUgI0RCVVNfSEFTSF9TVFJJTkcuIFJldHVybnMgJU5VTEwgaWYgdGhlIHZhbHVlCisgKiBpcyBub3QgcHJlc2VudC4gKEEgbm90LXByZXNlbnQgZW50cnkgaXMgaW5kaXN0aW5ndWlzaGFibGUKKyAqIGZyb20gYW4gZW50cnkgd2l0aCBhIHZhbHVlIG9mICVOVUxMLikKKyAqIEBwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZS4KKyAqIEBwYXJhbSBrZXkgdGhlIHN0cmluZyB0byBsb29rIHVwLgorICogQHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBoYXNoIGVudHJ5LgorICovCit2b2lkKgorX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChEQnVzSGFzaFRhYmxlICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqa2V5KQoreworICBEQnVzSGFzaEVudHJ5ICplbnRyeTsKKworICBfZGJ1c19hc3NlcnQgKHRhYmxlLT5rZXlfdHlwZSA9PSBEQlVTX0hBU0hfU1RSSU5HKTsKKyAgCisgIGVudHJ5ID0gKCogdGFibGUtPmZpbmRfZnVuY3Rpb24pICh0YWJsZSwgKGNoYXIqKSBrZXksIEZBTFNFLCBOVUxMLCBOVUxMKTsKKworICBpZiAoZW50cnkpCisgICAgcmV0dXJuIGVudHJ5LT52YWx1ZTsKKyAgZWxzZQorICAgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIExvb2tzIHVwIHRoZSB2YWx1ZSBmb3IgYSBnaXZlbiBpbnRlZ2VyIGluIGEgaGFzaCB0YWJsZQorICogb2YgdHlwZSAjREJVU19IQVNIX0lOVC4gUmV0dXJucyAlTlVMTCBpZiB0aGUgdmFsdWUKKyAqIGlzIG5vdCBwcmVzZW50LiAoQSBub3QtcHJlc2VudCBlbnRyeSBpcyBpbmRpc3Rpbmd1aXNoYWJsZQorICogZnJvbSBhbiBlbnRyeSB3aXRoIGEgdmFsdWUgb2YgJU5VTEwuKQorICogQHBhcmFtIHRhYmxlIHRoZSBoYXNoIHRhYmxlLgorICogQHBhcmFtIGtleSB0aGUgaW50ZWdlciB0byBsb29rIHVwLgorICogQHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBoYXNoIGVudHJ5LgorICovCit2b2lkKgorX2RidXNfaGFzaF90YWJsZV9sb29rdXBfaW50IChEQnVzSGFzaFRhYmxlICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAga2V5KQoreworICBEQnVzSGFzaEVudHJ5ICplbnRyeTsKKworICBfZGJ1c19hc3NlcnQgKHRhYmxlLT5rZXlfdHlwZSA9PSBEQlVTX0hBU0hfSU5UKTsKKyAgCisgIGVudHJ5ID0gKCogdGFibGUtPmZpbmRfZnVuY3Rpb24pICh0YWJsZSwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGtleSksIEZBTFNFLCBOVUxMLCBOVUxMKTsKKworICBpZiAoZW50cnkpCisgICAgcmV0dXJuIGVudHJ5LT52YWx1ZTsKKyAgZWxzZQorICAgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIExvb2tzIHVwIHRoZSB2YWx1ZSBmb3IgYSBnaXZlbiBpbnRlZ2VyIGluIGEgaGFzaCB0YWJsZQorICogb2YgdHlwZSAjREJVU19IQVNIX1VJTlRQVFIuIFJldHVybnMgJU5VTEwgaWYgdGhlIHZhbHVlCisgKiBpcyBub3QgcHJlc2VudC4gKEEgbm90LXByZXNlbnQgZW50cnkgaXMgaW5kaXN0aW5ndWlzaGFibGUKKyAqIGZyb20gYW4gZW50cnkgd2l0aCBhIHZhbHVlIG9mICVOVUxMLikKKyAqIEBwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZS4KKyAqIEBwYXJhbSBrZXkgdGhlIGludGVnZXIgdG8gbG9vayB1cC4KKyAqIEByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgaGFzaCBlbnRyeS4KKyAqLwordm9pZCoKK19kYnVzX2hhc2hfdGFibGVfbG9va3VwX3VpbnRwdHIgKERCdXNIYXNoVGFibGUgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90ICAgICAga2V5KQoreworICBEQnVzSGFzaEVudHJ5ICplbnRyeTsKKworICBfZGJ1c19hc3NlcnQgKHRhYmxlLT5rZXlfdHlwZSA9PSBEQlVTX0hBU0hfVUlOVFBUUik7CisgIAorICBlbnRyeSA9ICgqIHRhYmxlLT5maW5kX2Z1bmN0aW9uKSAodGFibGUsICh2b2lkKikga2V5LCBGQUxTRSwgTlVMTCwgTlVMTCk7CisKKyAgaWYgKGVudHJ5KQorICAgIHJldHVybiBlbnRyeS0+dmFsdWU7CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBSZW1vdmVzIHRoZSBoYXNoIGVudHJ5IGZvciB0aGUgZ2l2ZW4ga2V5LiBJZiBubyBoYXNoIGVudHJ5CisgKiBmb3IgdGhlIGtleSBleGlzdHMsIGRvZXMgbm90aGluZy4KKyAqCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUuCisgKiBAcGFyYW0ga2V5IHRoZSBoYXNoIGtleS4KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBlbnRyeSBleGlzdGVkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcgKERCdXNIYXNoVGFibGUgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICprZXkpCit7CisgIERCdXNIYXNoRW50cnkgKmVudHJ5OworICBEQnVzSGFzaEVudHJ5ICoqYnVja2V0OworICAKKyAgX2RidXNfYXNzZXJ0ICh0YWJsZS0+a2V5X3R5cGUgPT0gREJVU19IQVNIX1NUUklORyk7CisgIAorICBlbnRyeSA9ICgqIHRhYmxlLT5maW5kX2Z1bmN0aW9uKSAodGFibGUsIChjaGFyKikga2V5LCBGQUxTRSwgJmJ1Y2tldCwgTlVMTCk7CisKKyAgaWYgKGVudHJ5KQorICAgIHsKKyAgICAgIHJlbW92ZV9lbnRyeSAodGFibGUsIGJ1Y2tldCwgZW50cnkpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIFJlbW92ZXMgdGhlIGhhc2ggZW50cnkgZm9yIHRoZSBnaXZlbiBrZXkuIElmIG5vIGhhc2ggZW50cnkKKyAqIGZvciB0aGUga2V5IGV4aXN0cywgZG9lcyBub3RoaW5nLgorICoKKyAqIEBwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZS4KKyAqIEBwYXJhbSBrZXkgdGhlIGhhc2gga2V5LgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGVudHJ5IGV4aXN0ZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX2ludCAoREJ1c0hhc2hUYWJsZSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGtleSkKK3sKKyAgREJ1c0hhc2hFbnRyeSAqZW50cnk7CisgIERCdXNIYXNoRW50cnkgKipidWNrZXQ7CisgIAorICBfZGJ1c19hc3NlcnQgKHRhYmxlLT5rZXlfdHlwZSA9PSBEQlVTX0hBU0hfSU5UKTsKKyAgCisgIGVudHJ5ID0gKCogdGFibGUtPmZpbmRfZnVuY3Rpb24pICh0YWJsZSwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGtleSksIEZBTFNFLCAmYnVja2V0LCBOVUxMKTsKKyAgCisgIGlmIChlbnRyeSkKKyAgICB7CisgICAgICByZW1vdmVfZW50cnkgKHRhYmxlLCBidWNrZXQsIGVudHJ5KTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBSZW1vdmVzIHRoZSBoYXNoIGVudHJ5IGZvciB0aGUgZ2l2ZW4ga2V5LiBJZiBubyBoYXNoIGVudHJ5CisgKiBmb3IgdGhlIGtleSBleGlzdHMsIGRvZXMgbm90aGluZy4KKyAqCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUuCisgKiBAcGFyYW0ga2V5IHRoZSBoYXNoIGtleS4KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBlbnRyeSBleGlzdGVkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV91aW50cHRyIChEQnVzSGFzaFRhYmxlICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCAgICAgIGtleSkKK3sKKyAgREJ1c0hhc2hFbnRyeSAqZW50cnk7CisgIERCdXNIYXNoRW50cnkgKipidWNrZXQ7CisgIAorICBfZGJ1c19hc3NlcnQgKHRhYmxlLT5rZXlfdHlwZSA9PSBEQlVTX0hBU0hfVUlOVFBUUik7CisgIAorICBlbnRyeSA9ICgqIHRhYmxlLT5maW5kX2Z1bmN0aW9uKSAodGFibGUsICh2b2lkKikga2V5LCBGQUxTRSwgJmJ1Y2tldCwgTlVMTCk7CisgIAorICBpZiAoZW50cnkpCisgICAgeworICAgICAgcmVtb3ZlX2VudHJ5ICh0YWJsZSwgYnVja2V0LCBlbnRyeSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIGhhc2ggZW50cnkgd2l0aCB0aGUgZ2l2ZW4ga2V5IGFuZCB2YWx1ZS4KKyAqIFRoZSBrZXkgYW5kIHZhbHVlIGFyZSBub3QgY29waWVkOyB0aGV5IGFyZSBzdG9yZWQKKyAqIGluIHRoZSBoYXNoIHRhYmxlIGJ5IHJlZmVyZW5jZS4gSWYgYW4gZW50cnkgd2l0aCB0aGUKKyAqIGdpdmVuIGtleSBhbHJlYWR5IGV4aXN0cywgdGhlIHByZXZpb3VzIGtleSBhbmQgdmFsdWUKKyAqIGFyZSBvdmVyd3JpdHRlbiAoYW5kIGZyZWVkIGlmIHRoZSBoYXNoIHRhYmxlIGhhcworICogYSBrZXlfZnJlZV9mdW5jdGlvbiBhbmQvb3IgdmFsdWVfZnJlZV9mdW5jdGlvbikuCisgKgorICogUmV0dXJucyAjRkFMU0UgaWYgbWVtb3J5IGZvciB0aGUgbmV3IGhhc2ggZW50cnkKKyAqIGNhbid0IGJlIGFsbG9jYXRlZC4KKyAqIAorICogQHBhcmFtIHRhYmxlIHRoZSBoYXNoIHRhYmxlLgorICogQHBhcmFtIGtleSB0aGUgaGFzaCBlbnRyeSBrZXkuCisgKiBAcGFyYW0gdmFsdWUgdGhlIGhhc2ggZW50cnkgdmFsdWUuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKERCdXNIYXNoVGFibGUgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnZhbHVlKQoreworICBEQnVzUHJlYWxsb2NhdGVkSGFzaCAqcHJlYWxsb2NhdGVkOworCisgIF9kYnVzX2Fzc2VydCAodGFibGUtPmtleV90eXBlID09IERCVVNfSEFTSF9TVFJJTkcpOworCisgIHByZWFsbG9jYXRlZCA9IF9kYnVzX2hhc2hfdGFibGVfcHJlYWxsb2NhdGVfZW50cnkgKHRhYmxlKTsKKyAgaWYgKHByZWFsbG9jYXRlZCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmdfcHJlYWxsb2NhdGVkICh0YWJsZSwgcHJlYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksIHZhbHVlKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBoYXNoIGVudHJ5IHdpdGggdGhlIGdpdmVuIGtleSBhbmQgdmFsdWUuCisgKiBUaGUga2V5IGFuZCB2YWx1ZSBhcmUgbm90IGNvcGllZDsgdGhleSBhcmUgc3RvcmVkCisgKiBpbiB0aGUgaGFzaCB0YWJsZSBieSByZWZlcmVuY2UuIElmIGFuIGVudHJ5IHdpdGggdGhlCisgKiBnaXZlbiBrZXkgYWxyZWFkeSBleGlzdHMsIHRoZSBwcmV2aW91cyBrZXkgYW5kIHZhbHVlCisgKiBhcmUgb3ZlcndyaXR0ZW4gKGFuZCBmcmVlZCBpZiB0aGUgaGFzaCB0YWJsZSBoYXMKKyAqIGEga2V5X2ZyZWVfZnVuY3Rpb24gYW5kL29yIHZhbHVlX2ZyZWVfZnVuY3Rpb24pLgorICoKKyAqIFJldHVybnMgI0ZBTFNFIGlmIG1lbW9yeSBmb3IgdGhlIG5ldyBoYXNoIGVudHJ5CisgKiBjYW4ndCBiZSBhbGxvY2F0ZWQuCisgKiAKKyAqIEBwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZS4KKyAqIEBwYXJhbSBrZXkgdGhlIGhhc2ggZW50cnkga2V5LgorICogQHBhcmFtIHZhbHVlIHRoZSBoYXNoIGVudHJ5IHZhbHVlLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfaW50IChEQnVzSGFzaFRhYmxlICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICp2YWx1ZSkKK3sKKyAgREJ1c0hhc2hFbnRyeSAqZW50cnk7CisKKyAgX2RidXNfYXNzZXJ0ICh0YWJsZS0+a2V5X3R5cGUgPT0gREJVU19IQVNIX0lOVCk7CisgIAorICBlbnRyeSA9ICgqIHRhYmxlLT5maW5kX2Z1bmN0aW9uKSAodGFibGUsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChrZXkpLCBUUlVFLCBOVUxMLCBOVUxMKTsKKworICBpZiAoZW50cnkgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7IC8qIG5vIG1lbW9yeSAqLworCisgIGlmICh0YWJsZS0+ZnJlZV9rZXlfZnVuY3Rpb24gJiYgZW50cnktPmtleSAhPSBfREJVU19JTlRfVE9fUE9JTlRFUiAoa2V5KSkKKyAgICAoKiB0YWJsZS0+ZnJlZV9rZXlfZnVuY3Rpb24pIChlbnRyeS0+a2V5KTsKKyAgCisgIGlmICh0YWJsZS0+ZnJlZV92YWx1ZV9mdW5jdGlvbiAmJiBlbnRyeS0+dmFsdWUgIT0gdmFsdWUpCisgICAgKCogdGFibGUtPmZyZWVfdmFsdWVfZnVuY3Rpb24pIChlbnRyeS0+dmFsdWUpOworICAKKyAgZW50cnktPmtleSA9IF9EQlVTX0lOVF9UT19QT0lOVEVSIChrZXkpOworICBlbnRyeS0+dmFsdWUgPSB2YWx1ZTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgaGFzaCBlbnRyeSB3aXRoIHRoZSBnaXZlbiBrZXkgYW5kIHZhbHVlLgorICogVGhlIGtleSBhbmQgdmFsdWUgYXJlIG5vdCBjb3BpZWQ7IHRoZXkgYXJlIHN0b3JlZAorICogaW4gdGhlIGhhc2ggdGFibGUgYnkgcmVmZXJlbmNlLiBJZiBhbiBlbnRyeSB3aXRoIHRoZQorICogZ2l2ZW4ga2V5IGFscmVhZHkgZXhpc3RzLCB0aGUgcHJldmlvdXMga2V5IGFuZCB2YWx1ZQorICogYXJlIG92ZXJ3cml0dGVuIChhbmQgZnJlZWQgaWYgdGhlIGhhc2ggdGFibGUgaGFzCisgKiBhIGtleV9mcmVlX2Z1bmN0aW9uIGFuZC9vciB2YWx1ZV9mcmVlX2Z1bmN0aW9uKS4KKyAqCisgKiBSZXR1cm5zICNGQUxTRSBpZiBtZW1vcnkgZm9yIHRoZSBuZXcgaGFzaCBlbnRyeQorICogY2FuJ3QgYmUgYWxsb2NhdGVkLgorICogCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUuCisgKiBAcGFyYW0ga2V5IHRoZSBoYXNoIGVudHJ5IGtleS4KKyAqIEBwYXJhbSB2YWx1ZSB0aGUgaGFzaCBlbnRyeSB2YWx1ZS4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3VpbnRwdHIgKERCdXNIYXNoVGFibGUgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90ICAgICAga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqdmFsdWUpCit7CisgIERCdXNIYXNoRW50cnkgKmVudHJ5OworCisgIF9kYnVzX2Fzc2VydCAodGFibGUtPmtleV90eXBlID09IERCVVNfSEFTSF9VSU5UUFRSKTsKKyAgCisgIGVudHJ5ID0gKCogdGFibGUtPmZpbmRfZnVuY3Rpb24pICh0YWJsZSwgKHZvaWQqKSBrZXksIFRSVUUsIE5VTEwsIE5VTEwpOworCisgIGlmIChlbnRyeSA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsgLyogbm8gbWVtb3J5ICovCisKKyAgaWYgKHRhYmxlLT5mcmVlX2tleV9mdW5jdGlvbiAmJiBlbnRyeS0+a2V5ICE9ICh2b2lkKikga2V5KQorICAgICgqIHRhYmxlLT5mcmVlX2tleV9mdW5jdGlvbikgKGVudHJ5LT5rZXkpOworICAKKyAgaWYgKHRhYmxlLT5mcmVlX3ZhbHVlX2Z1bmN0aW9uICYmIGVudHJ5LT52YWx1ZSAhPSB2YWx1ZSkKKyAgICAoKiB0YWJsZS0+ZnJlZV92YWx1ZV9mdW5jdGlvbikgKGVudHJ5LT52YWx1ZSk7CisgIAorICBlbnRyeS0+a2V5ID0gKHZvaWQqKSBrZXk7CisgIGVudHJ5LT52YWx1ZSA9IHZhbHVlOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFByZWFsbG9jYXRlIGFuIG9wYXF1ZSBkYXRhIGJsb2IgdGhhdCBhbGxvd3MgdXMgdG8gaW5zZXJ0IGludG8gdGhlCisgKiBoYXNoIHRhYmxlIGF0IGEgbGF0ZXIgdGltZSB3aXRob3V0IGFsbG9jYXRpbmcgYW55IG1lbW9yeS4KKyAqCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUKKyAqIEByZXR1cm5zIHRoZSBwcmVhbGxvY2F0ZWQgZGF0YSwgb3IgI05VTEwgaWYgbm8gbWVtb3J5CisgKi8KK0RCdXNQcmVhbGxvY2F0ZWRIYXNoKgorX2RidXNfaGFzaF90YWJsZV9wcmVhbGxvY2F0ZV9lbnRyeSAoREJ1c0hhc2hUYWJsZSAqdGFibGUpCit7CisgIERCdXNIYXNoRW50cnkgKmVudHJ5OworICAKKyAgZW50cnkgPSBhbGxvY19lbnRyeSAodGFibGUpOworCisgIHJldHVybiAoREJ1c1ByZWFsbG9jYXRlZEhhc2gqKSBlbnRyeTsKK30KKworLyoqCisgKiBGcmVlcyBhbiBvcGFxdWUgREJ1c1ByZWFsbG9jYXRlZEhhc2ggdGhhdCB3YXMgKm5vdCogdXNlZAorICogaW4gb3JkZXIgdG8gaW5zZXJ0IGludG8gdGhlIGhhc2ggdGFibGUuCisgKgorICogQHBhcmFtIHRhYmxlIHRoZSBoYXNoIHRhYmxlCisgKiBAcGFyYW0gcHJlYWxsb2NhdGVkIHRoZSBwcmVhbGxvY2F0ZWQgZGF0YQorICovCit2b2lkCitfZGJ1c19oYXNoX3RhYmxlX2ZyZWVfcHJlYWxsb2NhdGVkX2VudHJ5IChEQnVzSGFzaFRhYmxlICAgICAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUHJlYWxsb2NhdGVkSGFzaCAqcHJlYWxsb2NhdGVkKQoreworICBEQnVzSGFzaEVudHJ5ICplbnRyeTsKKworICBfZGJ1c19hc3NlcnQgKHByZWFsbG9jYXRlZCAhPSBOVUxMKTsKKyAgCisgIGVudHJ5ID0gKERCdXNIYXNoRW50cnkqKSBwcmVhbGxvY2F0ZWQ7CisgIAorICAvKiBEb24ndCB1c2UgZnJlZV9lbnRyeSgpLCBzaW5jZSB0aGlzIGVudHJ5IGhhcyBubyBrZXkvZGF0YSAqLworICBfZGJ1c19tZW1fcG9vbF9kZWFsbG9jICh0YWJsZS0+ZW50cnlfcG9vbCwgZW50cnkpOworfQorCisvKioKKyAqIEluc2VydHMgYSBzdHJpbmcta2V5ZWQgZW50cnkgaW50byB0aGUgaGFzaCB0YWJsZSwgdXNpbmcgYQorICogcHJlYWxsb2NhdGVkIGRhdGEgYmxvY2sgZnJvbQorICogX2RidXNfaGFzaF90YWJsZV9wcmVhbGxvY2F0ZV9lbnRyeSgpLiBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBmYWlsIGR1ZQorICogdG8gbGFjayBvZiBtZW1vcnkuIFRoZSBEQnVzUHJlYWxsb2NhdGVkSGFzaCBvYmplY3QgaXMgY29uc3VtZWQgYW5kCisgKiBzaG91bGQgbm90IGJlIHJldXNlZCBvciBmcmVlZC4gT3RoZXJ3aXNlIHRoaXMgZnVuY3Rpb24gd29ya3MKKyAqIGp1c3QgbGlrZSBfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcoKS4KKyAqCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUKKyAqIEBwYXJhbSBwcmVhbGxvY2F0ZWQgdGhlIHByZWFsbG9jYXRlZCBkYXRhCisgKiBAcGFyYW0ga2V5IHRoZSBoYXNoIGtleQorICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSAKKyAqLwordm9pZAorX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nX3ByZWFsbG9jYXRlZCAoREJ1c0hhc2hUYWJsZSAgICAgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ByZWFsbG9jYXRlZEhhc2ggKnByZWFsbG9jYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAqdmFsdWUpCit7CisgIERCdXNIYXNoRW50cnkgKmVudHJ5OworCisgIF9kYnVzX2Fzc2VydCAodGFibGUtPmtleV90eXBlID09IERCVVNfSEFTSF9TVFJJTkcpOworICBfZGJ1c19hc3NlcnQgKHByZWFsbG9jYXRlZCAhPSBOVUxMKTsKKyAgCisgIGVudHJ5ID0gKCogdGFibGUtPmZpbmRfZnVuY3Rpb24pICh0YWJsZSwga2V5LCBUUlVFLCBOVUxMLCBwcmVhbGxvY2F0ZWQpOworCisgIF9kYnVzX2Fzc2VydCAoZW50cnkgIT0gTlVMTCk7CisgIAorICBpZiAodGFibGUtPmZyZWVfa2V5X2Z1bmN0aW9uICYmIGVudHJ5LT5rZXkgIT0ga2V5KQorICAgICgqIHRhYmxlLT5mcmVlX2tleV9mdW5jdGlvbikgKGVudHJ5LT5rZXkpOworCisgIGlmICh0YWJsZS0+ZnJlZV92YWx1ZV9mdW5jdGlvbiAmJiBlbnRyeS0+dmFsdWUgIT0gdmFsdWUpCisgICAgKCogdGFibGUtPmZyZWVfdmFsdWVfZnVuY3Rpb24pIChlbnRyeS0+dmFsdWUpOworICAgICAgCisgIGVudHJ5LT5rZXkgPSBrZXk7CisgIGVudHJ5LT52YWx1ZSA9IHZhbHVlOworfQorCisvKioKKyAqIEdldHMgdGhlIG51bWJlciBvZiBoYXNoIGVudHJpZXMgaW4gYSBoYXNoIHRhYmxlLgorICoKKyAqIEBwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZS4KKyAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgdGFibGUuCisgKi8KK2ludAorX2RidXNfaGFzaF90YWJsZV9nZXRfbl9lbnRyaWVzIChEQnVzSGFzaFRhYmxlICp0YWJsZSkKK3sKKyAgcmV0dXJuIHRhYmxlLT5uX2VudHJpZXM7Cit9CisKKy8qKiBAfSAqLworCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qIElmIHlvdSdyZSB3b25kZXJpbmcgd2h5IHRoZSBoYXNoIHRhYmxlIHRlc3QgdGFrZXMKKyAqIGZvcmV2ZXIgdG8gcnVuLCBpdCdzIGJlY2F1c2Ugd2UgY2FsbCB0aGlzIGZ1bmN0aW9uCisgKiBpbiBpbm5lciBsb29wcyB0aHVzIG1ha2luZyB0aGluZ3MgcXVhZHJhdGljLgorICovCitzdGF0aWMgaW50Citjb3VudF9lbnRyaWVzIChEQnVzSGFzaFRhYmxlICp0YWJsZSkKK3sKKyAgREJ1c0hhc2hJdGVyIGl0ZXI7CisgIGludCBjb3VudDsKKworICBjb3VudCA9IDA7CisgIF9kYnVzX2hhc2hfaXRlcl9pbml0ICh0YWJsZSwgJml0ZXIpOworICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICArK2NvdW50OworCisgIF9kYnVzX2Fzc2VydCAoY291bnQgPT0gX2RidXNfaGFzaF90YWJsZV9nZXRfbl9lbnRyaWVzICh0YWJsZSkpOworICAKKyAgcmV0dXJuIGNvdW50OworfQorCisvKioKKyAqIEBpbmdyb3VwIERCdXNIYXNoVGFibGVJbnRlcm5hbHMKKyAqIFVuaXQgdGVzdCBmb3IgREJ1c0hhc2hUYWJsZQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2hhc2hfdGVzdCAodm9pZCkKK3sKKyAgaW50IGk7CisgIERCdXNIYXNoVGFibGUgKnRhYmxlMTsKKyAgREJ1c0hhc2hUYWJsZSAqdGFibGUyOworICBEQnVzSGFzaFRhYmxlICp0YWJsZTM7CisgIERCdXNIYXNoSXRlciBpdGVyOworI2RlZmluZSBOX0hBU0hfS0VZUyA1MDAwCisgIGNoYXIgKiprZXlzOworICBkYnVzX2Jvb2xfdCByZXQgPSBGQUxTRTsKKworICBrZXlzID0gZGJ1c19uZXcgKGNoYXIgKiwgTl9IQVNIX0tFWVMpOworICBpZiAoa2V5cyA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGZvciAoaSA9IDA7IGkgPCBOX0hBU0hfS0VZUzsgaSsrKQorICAgIHsKKyAgICAgIGtleXNbaV0gPSBkYnVzX21hbGxvYyAoMTI4KTsKKworICAgICAgaWYgKGtleXNbaV0gPT0gTlVMTCkKKwlfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgICB9CisKKyAgcHJpbnRmICgiQ29tcHV0aW5nIHRlc3QgaGFzaCBrZXlzLi4uXG4iKTsKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgTl9IQVNIX0tFWVMpCisgICAgeworICAgICAgaW50IGxlbjsKKworICAgICAgbGVuID0gc3ByaW50ZiAoa2V5c1tpXSwgIkhhc2gga2V5ICVkIiwgaSk7CisgICAgICBfZGJ1c19hc3NlcnQgKCooa2V5c1tpXSArIGxlbikgPT0gJ1wwJyk7CisgICAgICArK2k7CisgICAgfQorICBwcmludGYgKCIuLi4gZG9uZS5cbiIpOworICAKKyAgdGFibGUxID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ZyZWUsIGRidXNfZnJlZSk7CisgIGlmICh0YWJsZTEgPT0gTlVMTCkKKyAgICBnb3RvIG91dDsKKworICB0YWJsZTIgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX0lOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGRidXNfZnJlZSk7CisgIGlmICh0YWJsZTIgPT0gTlVMTCkKKyAgICBnb3RvIG91dDsKKworICB0YWJsZTMgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1VJTlRQVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBkYnVzX2ZyZWUpOworICBpZiAodGFibGUzID09IE5VTEwpCisgICAgZ290byBvdXQ7CisKKyAgLyogSW5zZXJ0IGFuZCByZW1vdmUgYSBidW5jaCBvZiBzdHVmZiwgY291bnRpbmcgdGhlIHRhYmxlIGluIGJldHdlZW4KKyAgICogdG8gYmUgc3VyZSBpdCdzIG5vdCBicm9rZW4gYW5kIHRoYXQgaXRlcmF0aW9uIHdvcmtzCisgICAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAzMDAwKQorICAgIHsKKyAgICAgIHZvaWQgKnZhbHVlOworICAgICAgY2hhciAqa2V5OworCisgICAgICBrZXkgPSBfZGJ1c19zdHJkdXAgKGtleXNbaV0pOworICAgICAgaWYgKGtleSA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIHZhbHVlID0gX2RidXNfc3RyZHVwICgiVmFsdWUhIik7CisgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nICh0YWJsZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LCB2YWx1ZSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICB2YWx1ZSA9IF9kYnVzX3N0cmR1cCAoa2V5c1tpXSk7CisgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfaW50ICh0YWJsZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgdmFsdWUpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgdmFsdWUgPSBfZGJ1c19zdHJkdXAgKGtleXNbaV0pOworICAgICAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgICAgIGdvdG8gb3V0OworICAgICAgCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3VpbnRwdHIgKHRhYmxlMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHZhbHVlKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoY291bnRfZW50cmllcyAodGFibGUxKSA9PSBpICsgMSk7CisgICAgICBfZGJ1c19hc3NlcnQgKGNvdW50X2VudHJpZXMgKHRhYmxlMikgPT0gaSArIDEpOworICAgICAgX2RidXNfYXNzZXJ0IChjb3VudF9lbnRyaWVzICh0YWJsZTMpID09IGkgKyAxKTsKKworICAgICAgdmFsdWUgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKHRhYmxlMSwga2V5c1tpXSk7CisgICAgICBfZGJ1c19hc3NlcnQgKHZhbHVlICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHZhbHVlLCAiVmFsdWUhIikgPT0gMCk7CisKKyAgICAgIHZhbHVlID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfaW50ICh0YWJsZTIsIGkpOworICAgICAgX2RidXNfYXNzZXJ0ICh2YWx1ZSAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wICh2YWx1ZSwga2V5c1tpXSkgPT0gMCk7CisKKyAgICAgIHZhbHVlID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfdWludHB0ciAodGFibGUzLCBpKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAodmFsdWUgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAodmFsdWUsIGtleXNbaV0pID09IDApOworCisgICAgICArK2k7CisgICAgfQorCisgIC0taTsKKyAgd2hpbGUgKGkgPj0gMCkKKyAgICB7CisgICAgICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcgKHRhYmxlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c1tpXSk7CisKKyAgICAgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX2ludCAodGFibGUyLCBpKTsKKworICAgICAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfdWludHB0ciAodGFibGUzLCBpKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChjb3VudF9lbnRyaWVzICh0YWJsZTEpID09IGkpOworICAgICAgX2RidXNfYXNzZXJ0IChjb3VudF9lbnRyaWVzICh0YWJsZTIpID09IGkpOworICAgICAgX2RidXNfYXNzZXJ0IChjb3VudF9lbnRyaWVzICh0YWJsZTMpID09IGkpOworCisgICAgICAtLWk7CisgICAgfQorCisgIF9kYnVzX2hhc2hfdGFibGVfcmVmICh0YWJsZTEpOworICBfZGJ1c19oYXNoX3RhYmxlX3JlZiAodGFibGUyKTsKKyAgX2RidXNfaGFzaF90YWJsZV9yZWYgKHRhYmxlMyk7CisgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHRhYmxlMSk7CisgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHRhYmxlMik7CisgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHRhYmxlMyk7CisgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHRhYmxlMSk7CisgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHRhYmxlMik7CisgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHRhYmxlMyk7CisgIHRhYmxlMyA9IE5VTEw7CisKKyAgLyogSW5zZXJ0IGEgYnVuY2ggb2Ygc3R1ZmYgdGhlbiBjaGVjaworICAgKiB0aGF0IGl0ZXJhdGlvbiB3b3JrcyBjb3JyZWN0bHkgKGZpbmRzIHRoZSByaWdodAorICAgKiB2YWx1ZXMsIGl0ZXJfc2V0X3ZhbHVlIHdvcmtzLCBldGMuKQorICAgKi8KKyAgdGFibGUxID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ZyZWUsIGRidXNfZnJlZSk7CisgIGlmICh0YWJsZTEgPT0gTlVMTCkKKyAgICBnb3RvIG91dDsKKyAgCisgIHRhYmxlMiA9IF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfSU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgZGJ1c19mcmVlKTsKKyAgaWYgKHRhYmxlMiA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworICAKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgNTAwMCkKKyAgICB7CisgICAgICBjaGFyICprZXk7CisgICAgICB2b2lkICp2YWx1ZTsgICAgICAKKyAgICAgIAorICAgICAga2V5ID0gX2RidXNfc3RyZHVwIChrZXlzW2ldKTsKKyAgICAgIGlmIChrZXkgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICB2YWx1ZSA9IF9kYnVzX3N0cmR1cCAoIlZhbHVlISIpOworICAgICAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgICAgIGdvdG8gb3V0OworICAgICAgCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZyAodGFibGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSwgdmFsdWUpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgdmFsdWUgPSBfZGJ1c19zdHJkdXAgKGtleXNbaV0pOworICAgICAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgICAgIGdvdG8gb3V0OworICAgICAgCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X2ludCAodGFibGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHZhbHVlKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAoY291bnRfZW50cmllcyAodGFibGUxKSA9PSBpICsgMSk7CisgICAgICBfZGJ1c19hc3NlcnQgKGNvdW50X2VudHJpZXMgKHRhYmxlMikgPT0gaSArIDEpOworICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIF9kYnVzX2hhc2hfaXRlcl9pbml0ICh0YWJsZTEsICZpdGVyKTsKKyAgd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgeworICAgICAgY29uc3QgY2hhciAqa2V5OworICAgICAgdm9pZCAqdmFsdWU7CisKKyAgICAgIGtleSA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfc3RyaW5nX2tleSAoJml0ZXIpOworICAgICAgdmFsdWUgPSBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlICgmaXRlcik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nICh0YWJsZTEsIGtleSkgPT0gdmFsdWUpOworCisgICAgICB2YWx1ZSA9IF9kYnVzX3N0cmR1cCAoIkRpZmZlcmVudCB2YWx1ZSEiKTsKKyAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIAorICAgICAgX2RidXNfaGFzaF9pdGVyX3NldF92YWx1ZSAoJml0ZXIsIHZhbHVlKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKHRhYmxlMSwga2V5KSA9PSB2YWx1ZSk7CisgICAgfQorICAKKyAgX2RidXNfaGFzaF9pdGVyX2luaXQgKHRhYmxlMSwgJml0ZXIpOworICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICB7CisgICAgICBfZGJ1c19oYXNoX2l0ZXJfcmVtb3ZlX2VudHJ5ICgmaXRlcik7CisgICAgICBfZGJ1c19hc3NlcnQgKGNvdW50X2VudHJpZXMgKHRhYmxlMSkgPT0gaSAtIDEpOworICAgICAgLS1pOworICAgIH0KKworICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAodGFibGUyLCAmaXRlcik7CisgIHdoaWxlIChfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgIHsKKyAgICAgIGludCBrZXk7CisgICAgICB2b2lkICp2YWx1ZTsKKworICAgICAga2V5ID0gX2RidXNfaGFzaF9pdGVyX2dldF9pbnRfa2V5ICgmaXRlcik7CisgICAgICB2YWx1ZSA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9pbnQgKHRhYmxlMiwga2V5KSA9PSB2YWx1ZSk7CisKKyAgICAgIHZhbHVlID0gX2RidXNfc3RyZHVwICgiRGlmZmVyZW50IHZhbHVlISIpOworICAgICAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgICAgIGdvdG8gb3V0OworICAgICAgCisgICAgICBfZGJ1c19oYXNoX2l0ZXJfc2V0X3ZhbHVlICgmaXRlciwgdmFsdWUpOworCisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX2ludCAodGFibGUyLCBrZXkpID09IHZhbHVlKTsKKyAgICB9CisKKyAgaSA9IGNvdW50X2VudHJpZXMgKHRhYmxlMik7CisgIF9kYnVzX2hhc2hfaXRlcl9pbml0ICh0YWJsZTIsICZpdGVyKTsKKyAgd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgeworICAgICAgX2RidXNfaGFzaF9pdGVyX3JlbW92ZV9lbnRyeSAoJml0ZXIpOworICAgICAgX2RidXNfYXNzZXJ0IChjb3VudF9lbnRyaWVzICh0YWJsZTIpICsgMSA9PSBpKTsKKyAgICAgIC0taTsKKyAgICB9CisKKyAgLyogYWRkL3JlbW92ZSBpbnRlcmxlYXZlZCwgdG8gY2hlY2sgdGhhdCB3ZSBncm93L3NocmluayB0aGUgdGFibGUKKyAgICogYXBwcm9wcmlhdGVseQorICAgKi8KKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgMTAwMCkKKyAgICB7CisgICAgICBjaGFyICprZXk7CisgICAgICB2b2lkICp2YWx1ZTsKKyAgICAgICAgICAgIAorICAgICAga2V5ID0gX2RidXNfc3RyZHVwIChrZXlzW2ldKTsKKyAgICAgIGlmIChrZXkgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIHZhbHVlID0gX2RidXNfc3RyZHVwICgiVmFsdWUhIik7CisgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nICh0YWJsZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LCB2YWx1ZSkpCisgICAgICAgIGdvdG8gb3V0OworICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIC0taTsKKyAgd2hpbGUgKGkgPj0gMCkKKyAgICB7CisgICAgICBjaGFyICprZXk7CisgICAgICB2b2lkICp2YWx1ZTsgICAgICAKKyAgICAgIAorICAgICAga2V5ID0gX2RidXNfc3RyZHVwIChrZXlzW2ldKTsKKyAgICAgIGlmIChrZXkgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICB2YWx1ZSA9IF9kYnVzX3N0cmR1cCAoIlZhbHVlISIpOworICAgICAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3N0cmluZyAodGFibGUxLCBrZXlzW2ldKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nICh0YWJsZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LCB2YWx1ZSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3N0cmluZyAodGFibGUxLCBrZXlzW2ldKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfaGFzaF90YWJsZV9nZXRfbl9lbnRyaWVzICh0YWJsZTEpID09IGkpOworICAgICAgCisgICAgICAtLWk7CisgICAgfQorCisgIC8qIG51a2UgdGhlc2UgdGFibGVzICovCisgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHRhYmxlMSk7CisgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHRhYmxlMik7CisKKworICAvKiBOb3cgZG8gYSBidW5jaCBvZiB0aGluZ3MgYWdhaW4gdXNpbmcgX2RidXNfaGFzaF9pdGVyX2xvb2t1cCgpIHRvCisgICAqIGJlIHN1cmUgdGhhdCBpbnRlcmZhY2Ugd29ya3MuCisgICAqLworICB0YWJsZTEgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZnJlZSwgZGJ1c19mcmVlKTsKKyAgaWYgKHRhYmxlMSA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworICAKKyAgdGFibGUyID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9JTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBkYnVzX2ZyZWUpOworICBpZiAodGFibGUyID09IE5VTEwpCisgICAgZ290byBvdXQ7CisgIAorICBpID0gMDsKKyAgd2hpbGUgKGkgPCAzMDAwKQorICAgIHsKKyAgICAgIHZvaWQgKnZhbHVlOworICAgICAgY2hhciAqa2V5OworCisgICAgICBrZXkgPSBfZGJ1c19zdHJkdXAgKGtleXNbaV0pOworICAgICAgaWYgKGtleSA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIHZhbHVlID0gX2RidXNfc3RyZHVwICgiVmFsdWUhIik7CisgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfaGFzaF9pdGVyX2xvb2t1cCAodGFibGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksIFRSVUUsICZpdGVyKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKSA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2hhc2hfaXRlcl9zZXRfdmFsdWUgKCZpdGVyLCB2YWx1ZSk7CisKKyAgICAgIHZhbHVlID0gX2RidXNfc3RyZHVwIChrZXlzW2ldKTsKKyAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaWYgKCFfZGJ1c19oYXNoX2l0ZXJfbG9va3VwICh0YWJsZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSwgVFJVRSwgJml0ZXIpKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpID09IE5VTEwpOworICAgICAgX2RidXNfaGFzaF9pdGVyX3NldF92YWx1ZSAoJml0ZXIsIHZhbHVlKTsgCisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAoY291bnRfZW50cmllcyAodGFibGUxKSA9PSBpICsgMSk7CisgICAgICBfZGJ1c19hc3NlcnQgKGNvdW50X2VudHJpZXMgKHRhYmxlMikgPT0gaSArIDEpOworCisgICAgICBpZiAoIV9kYnVzX2hhc2hfaXRlcl9sb29rdXAgKHRhYmxlMSwga2V5c1tpXSwgRkFMU0UsICZpdGVyKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICAKKyAgICAgIHZhbHVlID0gX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpOworICAgICAgX2RidXNfYXNzZXJ0ICh2YWx1ZSAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wICh2YWx1ZSwgIlZhbHVlISIpID09IDApOworCisgICAgICAvKiBJdGVyYXRlIGp1c3QgdG8gYmUgc3VyZSBpdCB3b3JrcywgdGhvdWdoCisgICAgICAgKiBpdCdzIGEgc3R1cGlkIHRoaW5nIHRvIGRvCisgICAgICAgKi8KKyAgICAgIHdoaWxlIChfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgICAgICA7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfaGFzaF9pdGVyX2xvb2t1cCAodGFibGUyLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSksIEZBTFNFLCAmaXRlcikpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICB2YWx1ZSA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAodmFsdWUgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAodmFsdWUsIGtleXNbaV0pID09IDApOworCisgICAgICAvKiBJdGVyYXRlIGp1c3QgdG8gYmUgc3VyZSBpdCB3b3JrcywgdGhvdWdoCisgICAgICAgKiBpdCdzIGEgc3R1cGlkIHRoaW5nIHRvIGRvCisgICAgICAgKi8KKyAgICAgIHdoaWxlIChfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgICAgICA7CisgICAgICAKKyAgICAgICsraTsKKyAgICB9CisKKyAgLS1pOworICB3aGlsZSAoaSA+PSAwKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfaGFzaF9pdGVyX2xvb2t1cCAodGFibGUxLCBrZXlzW2ldLCBGQUxTRSwgJml0ZXIpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJoYXNoIGVudHJ5IHNob3VsZCBoYXZlIGV4aXN0ZWQiKTsKKyAgICAgIF9kYnVzX2hhc2hfaXRlcl9yZW1vdmVfZW50cnkgKCZpdGVyKTsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19oYXNoX2l0ZXJfbG9va3VwICh0YWJsZTIsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSwgRkFMU0UsICZpdGVyKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaGFzaCBlbnRyeSBzaG91bGQgaGF2ZSBleGlzdGVkIik7CisgICAgICBfZGJ1c19oYXNoX2l0ZXJfcmVtb3ZlX2VudHJ5ICgmaXRlcik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoY291bnRfZW50cmllcyAodGFibGUxKSA9PSBpKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoY291bnRfZW50cmllcyAodGFibGUyKSA9PSBpKTsKKworICAgICAgLS1pOworICAgIH0KKworICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmICh0YWJsZTEpOworICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmICh0YWJsZTIpOworCisgIHJldCA9IFRSVUU7CisKKyBvdXQ6CisgIGZvciAoaSA9IDA7IGkgPCBOX0hBU0hfS0VZUzsgaSsrKQorICAgIGRidXNfZnJlZSAoa2V5c1tpXSk7CisKKyAgZGJ1c19mcmVlIChrZXlzKTsKKyAgCisgIHJldHVybiByZXQ7Cit9CisKKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1oYXNoLmggYi9kYnVzL2RidXMvZGJ1cy1oYXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFhMTgzYwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLWhhc2guaApAQCAtMCwwICsxLDEzNCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWhhc2guaCBHZW5lcmljIGhhc2ggdGFibGUgdXRpbGl0eSAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfSEFTSF9ICisjZGVmaW5lIERCVVNfSEFTSF9ICisKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tZW1vcnkuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0hhc2hUYWJsZQorICogQHsKKyAqLworCisvKiogSGFzaCBpdGVyYXRvciBvYmplY3QuIFRoZSBpdGVyYXRvciBpcyBvbiB0aGUgc3RhY2ssIGJ1dCBpdHMgcmVhbAorICogZmllbGRzIGFyZSBoaWRkZW4gcHJpdmF0ZWx5LgorICovCitzdHJ1Y3QgREJ1c0hhc2hJdGVyCit7CisgIHZvaWQgKmR1bW15MTsgLyoqPCBEbyBub3QgdXNlLiAqLworICB2b2lkICpkdW1teTI7IC8qKjwgRG8gbm90IHVzZS4gKi8KKyAgdm9pZCAqZHVtbXkzOyAvKio8IERvIG5vdCB1c2UuICovCisgIHZvaWQgKmR1bW15NDsgLyoqPCBEbyBub3QgdXNlLiAqLworICBpbnQgICBkdW1teTU7IC8qKjwgRG8gbm90IHVzZS4gKi8KKyAgaW50ICAgZHVtbXk2OyAvKio8IERvIG5vdCB1c2UuICovCit9OworCit0eXBlZGVmIHN0cnVjdCBEQnVzSGFzaFRhYmxlIERCdXNIYXNoVGFibGU7Cit0eXBlZGVmIHN0cnVjdCBEQnVzSGFzaEl0ZXIgIERCdXNIYXNoSXRlcjsKKworLyogQWxsb3dpbmcgYW4gYXJiaXRyYXJ5IGZ1bmN0aW9uIGFzIHdpdGggR0xpYgorICogd291bGQgYmUgbmljZXIgZm9yIGEgcHVibGljIEFQSSwgYnV0IGZvcgorICogYW4gaW50ZXJuYWwgQVBJIHRoaXMgc2F2ZXMgdHlwaW5nLCB3ZSBjYW4gYWRkCisgKiBtb3JlIHdoZW5ldmVyIHdlIGZlZWwgbGlrZSBpdC4KKyAqLwordHlwZWRlZiBlbnVtCit7CisgIERCVVNfSEFTSF9TVFJJTkcsICAgICAgICAvKio8IEhhc2gga2V5cyBhcmUgc3RyaW5ncy4gKi8KKyAgREJVU19IQVNIX0lOVCwgICAgICAgICAgIC8qKjwgSGFzaCBrZXlzIGFyZSBpbnRlZ2Vycy4gKi8KKyAgREJVU19IQVNIX1VJTlRQVFIgICAgICAgIC8qKjwgSGFzaCBrZXlzIGFyZSBpbnRlZ2VyIGNhcGFibGUgdG8gaG9sZCBhIHBvaW50ZXIuICovCit9IERCdXNIYXNoVHlwZTsKKworREJ1c0hhc2hUYWJsZSogX2RidXNfaGFzaF90YWJsZV9uZXcgICAgICAgICAgICAgICAgKERCdXNIYXNoVHlwZSAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAga2V5X2ZyZWVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgdmFsdWVfZnJlZV9mdW5jdGlvbik7CitEQnVzSGFzaFRhYmxlKiBfZGJ1c19oYXNoX3RhYmxlX3JlZiAgICAgICAgICAgICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUpOwordm9pZCAgICAgICAgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAgICAgICAgICAgICAgKERCdXNIYXNoVGFibGUgICAgKnRhYmxlKTsKK3ZvaWQgICAgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX2FsbCAgICAgICAgIChEQnVzSGFzaFRhYmxlICAgICp0YWJsZSk7Cit2b2lkICAgICAgICAgICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAgICAgICAgICAgICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hJdGVyICAgICAqaXRlcik7CitkYnVzX2Jvb2xfdCAgICBfZGJ1c19oYXNoX2l0ZXJfbmV4dCAgICAgICAgICAgICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlcik7Cit2b2lkICAgICAgICAgICBfZGJ1c19oYXNoX2l0ZXJfcmVtb3ZlX2VudHJ5ICAgICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlcik7Cit2b2lkKiAgICAgICAgICBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlICAgICAgICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlcik7Cit2b2lkICAgICAgICAgICBfZGJ1c19oYXNoX2l0ZXJfc2V0X3ZhbHVlICAgICAgICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICp2YWx1ZSk7CitpbnQgICAgICAgICAgICBfZGJ1c19oYXNoX2l0ZXJfZ2V0X2ludF9rZXkgICAgICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlcik7Citjb25zdCBjaGFyKiAgICBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3N0cmluZ19rZXkgICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlcik7Cit1aW50cHRyX3QgICAgICBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3VpbnRwdHJfa2V5ICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlcik7CitkYnVzX2Jvb2xfdCAgICBfZGJ1c19oYXNoX2l0ZXJfbG9va3VwICAgICAgICAgICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGNyZWF0ZV9pZl9ub3RfZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hJdGVyICAgICAqaXRlcik7Cit2b2lkKiAgICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqa2V5KTsKK3ZvaWQqICAgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX2ludCAgICAgICAgIChEQnVzSGFzaFRhYmxlICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBrZXkpOwordm9pZCogICAgICAgICAgX2RidXNfaGFzaF90YWJsZV9sb29rdXBfdWludHB0ciAgICAgKERCdXNIYXNoVGFibGUgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCAgICAgICAgIGtleSk7CitkYnVzX2Jvb2xfdCAgICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcgICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqa2V5KTsKK2RidXNfYm9vbF90ICAgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX2ludCAgICAgICAgIChEQnVzSGFzaFRhYmxlICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBrZXkpOworZGJ1c19ib29sX3QgICAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfdWludHB0ciAgICAgKERCdXNIYXNoVGFibGUgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCAgICAgICAgIGtleSk7CitkYnVzX2Jvb2xfdCAgICBfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKnZhbHVlKTsKK2RidXNfYm9vbF90ICAgIF9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X2ludCAgICAgICAgIChEQnVzSGFzaFRhYmxlICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqdmFsdWUpOworZGJ1c19ib29sX3QgICAgX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfdWludHB0ciAgICAgKERCdXNIYXNoVGFibGUgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCAgICAgICAgIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICp2YWx1ZSk7CitpbnQgICAgICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX2dldF9uX2VudHJpZXMgICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUpOworCisvKiBQcmVhbGxvY2F0aW9uICovCisKKy8qKiBBIHByZWFsbG9jYXRlZCBoYXNoIGVudHJ5ICovCit0eXBlZGVmIHN0cnVjdCBEQnVzUHJlYWxsb2NhdGVkSGFzaCBEQnVzUHJlYWxsb2NhdGVkSGFzaDsKKworREJ1c1ByZWFsbG9jYXRlZEhhc2ggKl9kYnVzX2hhc2hfdGFibGVfcHJlYWxsb2NhdGVfZW50cnkgICAgICAgICAgKERCdXNIYXNoVGFibGUgICAgICAgICp0YWJsZSk7Cit2b2lkICAgICAgICAgICAgICAgICAgX2RidXNfaGFzaF90YWJsZV9mcmVlX3ByZWFsbG9jYXRlZF9lbnRyeSAgICAoREJ1c0hhc2hUYWJsZSAgICAgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQcmVhbGxvY2F0ZWRIYXNoICpwcmVhbGxvY2F0ZWQpOwordm9pZCAgICAgICAgICAgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZ19wcmVhbGxvY2F0ZWQgKERCdXNIYXNoVGFibGUgICAgICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUHJlYWxsb2NhdGVkSGFzaCAqcHJlYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgKnZhbHVlKTsKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX0hBU0hfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtaW50ZXJuYWxzLmMgYi9kYnVzL2RidXMvZGJ1cy1pbnRlcm5hbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWM0OTgwCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtaW50ZXJuYWxzLmMKQEAgLTAsMCArMSwxMDc2IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtaW50ZXJuYWxzLmMgIHJhbmRvbSB1dGlsaXR5IHN0dWZmIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1iYXNpYy5oIgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgImRidXMtdmFsZ3JpbmQtaW50ZXJuYWwuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lmZGVmIERCVVNfVVNFX09VVFBVVF9ERUJVR19TVFJJTkcKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8bWJzdHJpbmcuaD4KKyNlbmRpZgorCisjaWZkZWYgREJVU19BTkRST0lEX0xPRworI2RlZmluZSBMT0dfVEFHICJsaWJkYnVzIgorI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNlbmRpZiAvKiBEQlVTX0FORFJPSURfTE9HICovCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNJbnRlcm5hbHMgRC1CdXMgc2VjcmV0IGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqIEBicmllZiBEb2N1bWVudGF0aW9uIHVzZWZ1bCB3aGVuIGRldmVsb3Bpbmcgb3IgZGVidWdnaW5nIEQtQnVzIGl0c2VsZi4KKyAqIAorICovCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNJbnRlcm5hbHNVdGlscyBVdGlsaXRpZXMgYW5kIHBvcnRhYmlsaXR5CisgKiBAaW5ncm91cCBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgVXRpbGl0eSBmdW5jdGlvbnMgKF9kYnVzX2Fzc2VydCgpLCBfZGJ1c193YXJuKCksIGV0Yy4pCisgKiBAeworICovCisKKy8qKgorICogQGRlZiBfZGJ1c19hc3NlcnQKKyAqCisgKiBBYm9ydHMgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIHRoZSBjb25kaXRpb24gaXMgZmFsc2UuCisgKiAKKyAqIEBwYXJhbSBjb25kaXRpb24gY29uZGl0aW9uIHdoaWNoIG11c3QgYmUgdHJ1ZS4KKyAqLworCisvKioKKyAqIEBkZWYgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkCisgKgorICogQWJvcnRzIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBjYWxsZWQuCisgKiBUaGUgZ2l2ZW4gZXhwbGFuYXRpb24gd2lsbCBiZSBwcmludGVkLgorICogCisgKiBAcGFyYW0gZXhwbGFuYXRpb24gZXhwbGFuYXRpb24gb2Ygd2hhdCBoYXBwZW5lZCBpZiB0aGUgY29kZSB3YXMgcmVhY2hlZC4KKyAqLworCisvKioKKyAqIEBkZWYgX0RCVVNfTl9FTEVNRU5UUworICoKKyAqIENvbXB1dGVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSBmaXhlZC1zaXplIGFycmF5IHVzaW5nCisgKiBzaXplb2YoKS4KKyAqCisgKiBAcGFyYW0gYXJyYXkgdGhlIGFycmF5IHRvIGNvdW50IGVsZW1lbnRzIGluLgorICovCisKKy8qKgorICogQGRlZiBfREJVU19QT0lOVEVSX1RPX0lOVAorICoKKyAqIFNhZmVseSBjYXN0cyBhIHZvaWQqIHRvIGFuIGludGVnZXI7IHNob3VsZCBvbmx5IGJlIHVzZWQgb24gdm9pZCoKKyAqIHRoYXQgYWN0dWFsbHkgY29udGFpbiBpbnRlZ2VycywgZm9yIGV4YW1wbGUgb25lIGNyZWF0ZWQgd2l0aAorICogX0RCVVNfSU5UX1RPX1BPSU5URVIuICBPbmx5IGd1YXJhbnRlZWQgdG8gcHJlc2VydmUgMzIgYml0cy4KKyAqIChpLmUuIGl0J3MgdXNlZCB0byBzdG9yZSAzMi1iaXQgaW50cyBpbiBwb2ludGVycywgYnV0CisgKiBjYW4ndCBiZSB1c2VkIHRvIHN0b3JlIDY0LWJpdCBwb2ludGVycyBpbiBpbnRzLikKKyAqCisgKiBAcGFyYW0gcG9pbnRlciBwb2ludGVyIHRvIGV4dHJhY3QgYW4gaW50ZWdlciBmcm9tLgorICovCisvKioKKyAqIEBkZWYgX0RCVVNfSU5UX1RPX1BPSU5URVIKKyAqCisgKiBTYWZlbHkgc3R1ZmZzIGFuIGludGVnZXIgaW50byBhIHBvaW50ZXIsIHRvIGJlIGV4dHJhY3RlZCBsYXRlciB3aXRoCisgKiBfREJVU19QT0lOVEVSX1RPX0lOVC4gT25seSBndWFyYW50ZWVkIHRvIHByZXNlcnZlIDMyIGJpdHMuCisgKgorICogQHBhcmFtIGludGVnZXIgdGhlIGludGVnZXIgdG8gc3R1ZmYgaW50byBhIHBvaW50ZXIuCisgKi8KKy8qKgorICogQGRlZiBfREJVU19aRVJPCisgKgorICogU2V0cyBhbGwgYml0cyBpbiBhbiBvYmplY3QgdG8gemVyby4KKyAqCisgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdG8gYmUgemVyb2VkLgorICovCisvKioKKyAqIEBkZWYgX0RCVVNfSU5UMTZfTUlOCisgKgorICogTWluaW11bSB2YWx1ZSBvZiB0eXBlICJpbnQxNiIKKyAqLworLyoqCisgKiBAZGVmIF9EQlVTX0lOVDE2X01BWAorICoKKyAqIE1heGltdW0gdmFsdWUgb2YgdHlwZSAiaW50MTYiCisgKi8KKy8qKgorICogQGRlZiBfREJVU19VSU5UMTZfTUFYCisgKgorICogTWF4aW11bSB2YWx1ZSBvZiB0eXBlICJ1aW50MTYiCisgKi8KKworLyoqCisgKiBAZGVmIF9EQlVTX0lOVDMyX01JTgorICoKKyAqIE1pbmltdW0gdmFsdWUgb2YgdHlwZSAiaW50MzIiCisgKi8KKy8qKgorICogQGRlZiBfREJVU19JTlQzMl9NQVgKKyAqCisgKiBNYXhpbXVtIHZhbHVlIG9mIHR5cGUgImludDMyIgorICovCisvKioKKyAqIEBkZWYgX0RCVVNfVUlOVDMyX01BWAorICoKKyAqIE1heGltdW0gdmFsdWUgb2YgdHlwZSAidWludDMyIgorICovCisKKy8qKgorICogQGRlZiBfREJVU19JTlRfTUlOCisgKgorICogTWluaW11bSB2YWx1ZSBvZiB0eXBlICJpbnQiCisgKi8KKy8qKgorICogQGRlZiBfREJVU19JTlRfTUFYCisgKgorICogTWF4aW11bSB2YWx1ZSBvZiB0eXBlICJpbnQiCisgKi8KKy8qKgorICogQGRlZiBfREJVU19VSU5UX01BWAorICoKKyAqIE1heGltdW0gdmFsdWUgb2YgdHlwZSAidWludCIKKyAqLworCisvKioKKyAqIEB0eXBlZGVmIERCdXNGb3JlYWNoRnVuY3Rpb24KKyAqIAorICogVXNlZCB0byBpdGVyYXRlIG92ZXIgZWFjaCBpdGVtIGluIGEgY29sbGVjdGlvbiwgc3VjaCBhcworICogYSBEQnVzTGlzdC4KKyAqLworCisvKioKKyAqIEBkZWYgX0RCVVNfTE9DS19OQU1FCisgKgorICogRXhwYW5kcyB0byBuYW1lIG9mIGEgZ2xvYmFsIGxvY2sgdmFyaWFibGUuCisgKi8KKworLyoqCisgKiBAZGVmIF9EQlVTX0RFRklORV9HTE9CQUxfTE9DSworICoKKyAqIERlZmluZXMgYSBnbG9iYWwgbG9jayB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICogVGhlIGxvY2sgbXVzdCBiZSBhZGRlZCB0byB0aGUgbGlzdCB0byBpbml0aWFsaXplCisgKiBpbiBkYnVzX3RocmVhZHNfaW5pdCgpLgorICovCisKKy8qKgorICogQGRlZiBfREJVU19ERUNMQVJFX0dMT0JBTF9MT0NLCisgKgorICogRXhwYW5kcyB0byBkZWNsYXJhdGlvbiBvZiBhIGdsb2JhbCBsb2NrIGRlZmluZWQKKyAqIHdpdGggX0RCVVNfREVGSU5FX0dMT0JBTF9MT0NLLgorICogVGhlIGxvY2sgbXVzdCBiZSBhZGRlZCB0byB0aGUgbGlzdCB0byBpbml0aWFsaXplCisgKiBpbiBkYnVzX3RocmVhZHNfaW5pdCgpLgorICovCisKKy8qKgorICogQGRlZiBfREJVU19MT0NLCisgKgorICogTG9ja3MgYSBnbG9iYWwgbG9jaworICovCisKKy8qKgorICogQGRlZiBfREJVU19VTkxPQ0sKKyAqCisgKiBVbmxvY2tzIGEgZ2xvYmFsIGxvY2sKKyAqLworCisvKioKKyAqIEZpeGVkICJvdXQgb2YgbWVtb3J5IiBlcnJvciBtZXNzYWdlLCBqdXN0IHRvIGF2b2lkCisgKiBtYWtpbmcgdXAgYSBkaWZmZXJlbnQgc3RyaW5nIGV2ZXJ5IHRpbWUgYW5kIHdhc3RpbmcKKyAqIHNwYWNlLgorICovCitjb25zdCBjaGFyICpfZGJ1c19ub19tZW1vcnlfbWVzc2FnZSA9ICJOb3QgZW5vdWdoIG1lbW9yeSI7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdCB3YXJuX2luaXR0ZWQgPSBGQUxTRTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBmYXRhbF93YXJuaW5ncyA9IEZBTFNFOworc3RhdGljIGRidXNfYm9vbF90IGZhdGFsX3dhcm5pbmdzX29uX2NoZWNrX2ZhaWxlZCA9IFRSVUU7CisKK3N0YXRpYyB2b2lkCitpbml0X3dhcm5pbmdzKHZvaWQpCit7CisgIGlmICghd2Fybl9pbml0dGVkKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnM7CisgICAgICBzID0gX2RidXNfZ2V0ZW52ICgiREJVU19GQVRBTF9XQVJOSU5HUyIpOworICAgICAgaWYgKHMgJiYgKnMpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKnMgPT0gJzAnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmYXRhbF93YXJuaW5ncyA9IEZBTFNFOworICAgICAgICAgICAgICBmYXRhbF93YXJuaW5nc19vbl9jaGVja19mYWlsZWQgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmICgqcyA9PSAnMScpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZhdGFsX3dhcm5pbmdzID0gVFJVRTsKKyAgICAgICAgICAgICAgZmF0YWxfd2FybmluZ3Nfb25fY2hlY2tfZmFpbGVkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiREJVU19GQVRBTF9XQVJOSU5HUyBzaG91bGQgYmUgc2V0IHRvIDAgb3IgMSBpZiBzZXQsIG5vdCAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICBzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICB3YXJuX2luaXR0ZWQgPSBUUlVFOworICAgIH0KK30KKworLyoqCisgKiBQcmludHMgYSB3YXJuaW5nIG1lc3NhZ2UgdG8gc3RkZXJyLiBDYW4gb3B0aW9uYWxseSBiZSBtYWRlIHRvIGV4aXQKKyAqIGZhdGFsbHkgYnkgc2V0dGluZyBEQlVTX0ZBVEFMX1dBUk5JTkdTLCBidXQgdGhpcyBpcyByYXJlbHkKKyAqIHVzZWQuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNvbnNpZGVyZWQgcHJldHR5IG11Y2ggZXF1aXZhbGVudCB0bworICogZnByaW50ZihzdGRlcnIpLiBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCgpIG9uIHRoZSBvdGhlciBoYW5kIGlzCisgKiBzdWl0YWJsZSBmb3IgdXNlIHdoZW4gYSBwcm9ncmFtbWluZyBtaXN0YWtlIGhhcyBiZWVuIG1hZGUuCisgKgorICogQHBhcmFtIGZvcm1hdCBwcmludGYtc3R5bGUgZm9ybWF0IHN0cmluZy4KKyAqLwordm9pZAorX2RidXNfd2FybiAoY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgICAgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisKKyAgaWYgKCF3YXJuX2luaXR0ZWQpCisgICAgaW5pdF93YXJuaW5ncyAoKTsKKyAgCisgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOworI2lmZGVmIERCVVNfQU5EUk9JRF9MT0cKKyAgTE9HX1BSSV9WQShBTkRST0lEX0xPR19XQVJOLCBMT0dfVEFHLCBmb3JtYXQsIGFyZ3MpOworI2Vsc2UKKyAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdzKTsKKyNlbmRpZiAvKiBEQlVTX0FORFJPSURfTE9HICovCisgIHZhX2VuZCAoYXJncyk7CisKKyAgaWYgKGZhdGFsX3dhcm5pbmdzKQorICAgIHsKKyAgICAgIGZmbHVzaCAoc3RkZXJyKTsKKyAgICAgIF9kYnVzX2Fib3J0ICgpOworICAgIH0KK30KKworLyoqCisgKiBQcmludHMgYSAiY3JpdGljYWwiIHdhcm5pbmcgdG8gc3RkZXJyIHdoZW4gYW4gYXNzZXJ0aW9uIGZhaWxzOworICogZGlmZmVycyBmcm9tIF9kYnVzX3dhcm4gcHJpbWFyaWx5IGluIHRoYXQgaXQgcHJlZml4ZXMgdGhlIHBpZCBhbmQKKyAqIGRlZmF1bHRzIHRvIGZhdGFsLiBUaGlzIHNob3VsZCBiZSB1c2VkIG9ubHkgd2hlbiBhIHByb2dyYW1taW5nCisgKiBlcnJvciBoYXMgYmVlbiBkZXRlY3RlZC4gKE5PVCBmb3IgdW5hdm9pZGFibGUgZXJyb3JzIHRoYXQgYW4gYXBwCisgKiBtaWdodCBoYW5kbGUgLSB0aG9zZSBzaG91bGQgYmUgcmV0dXJuZWQgYXMgREJ1c0Vycm9yLikgQ2FsbGluZyB0aGlzCisgKiBtZWFucyAidGhlcmUgaXMgYSBidWciCisgKi8KK3ZvaWQKK19kYnVzX3dhcm5fY2hlY2tfZmFpbGVkKGNvbnN0IGNoYXIgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworICAKKyAgaWYgKCF3YXJuX2luaXR0ZWQpCisgICAgaW5pdF93YXJuaW5ncyAoKTsKKworICBmcHJpbnRmIChzdGRlcnIsICJwcm9jZXNzICVsdTogIiwgX2RidXNfcGlkX2Zvcl9sb2cgKCkpOworICAKKyAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisjaWZkZWYgREJVU19BTkRST0lEX0xPRworICBMT0dfUFJJX1ZBKEFORFJPSURfTE9HX0VSUk9SLCBMT0dfVEFHLCBmb3JtYXQsIGFyZ3MpOworI2Vsc2UKKyAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdzKTsKKyNlbmRpZiAvKiBEQlVTX0FORFJPSURfTE9HICovCisgIHZhX2VuZCAoYXJncyk7CisKKyAgaWYgKGZhdGFsX3dhcm5pbmdzX29uX2NoZWNrX2ZhaWxlZCkKKyAgICB7CisgICAgICBmZmx1c2ggKHN0ZGVycik7CisgICAgICBfZGJ1c19hYm9ydCAoKTsKKyAgICB9Cit9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKworc3RhdGljIGRidXNfYm9vbF90IHZlcmJvc2VfaW5pdHRlZCA9IEZBTFNFOworc3RhdGljIGRidXNfYm9vbF90IHZlcmJvc2UgPSBUUlVFOworCisvKiogV2hldGhlciB0byBzaG93IHRoZSBjdXJyZW50IHRocmVhZCBpbiB2ZXJib3NlIG1lc3NhZ2VzICovCisjZGVmaW5lIFBUSFJFQURfSU5fVkVSQk9TRSAwCisjaWYgUFRIUkVBRF9JTl9WRVJCT1NFCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2VuZGlmCisKKyNpZmRlZiBEQlVTX1VTRV9PVVRQVVRfREVCVUdfU1RSSU5HCitzdGF0aWMgY2hhciBtb2R1bGVfbmFtZVsxMDI0XTsKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQKK19kYnVzX3ZlcmJvc2VfaW5pdCAodm9pZCkKK3sKKyAgaWYgKCF2ZXJib3NlX2luaXR0ZWQpCisgICAgeworI2lmZGVmIERCVVNfQU5EUk9JRF9MT0cKKyAgICAgIC8qIERvbid0IGJvdGhlciBjaGVja2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZSAtIGp1c3QgcHJpbnQgdGhlCisgICAgICAgICB2ZXJib3NlIGxvZ3MgKGNhbiBzdGlsbCBiZSBkaXNhYmxlZCB3aXRoIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERSkgKi8KKyAgICAgIHZlcmJvc2UgPSBUUlVFOworI2Vsc2UKKyAgICAgIGNvbnN0IGNoYXIgKnAgPSBfZGJ1c19nZXRlbnYgKCJEQlVTX1ZFUkJPU0UiKTsgCisgICAgICB2ZXJib3NlID0gcCAhPSBOVUxMICYmICpwID09ICcxJzsKKyNlbmRpZgorICAgICAgdmVyYm9zZV9pbml0dGVkID0gVFJVRTsKKyNpZmRlZiBEQlVTX1VTRV9PVVRQVVRfREVCVUdfU1RSSU5HCisgICAgICB7CisgICAgICAgIGNoYXIgKmxhc3RfcGVyaW9kLCAqbGFzdF9zbGFzaDsKKyAgICAgICAgR2V0TW9kdWxlRmlsZU5hbWUoMCxtb2R1bGVfbmFtZSxzaXplb2YobW9kdWxlX25hbWUpLTEpOworICAgICAgICBsYXN0X3BlcmlvZCA9IF9tYnNyY2hyKG1vZHVsZV9uYW1lLCcuJyk7CisgICAgICAgIGlmIChsYXN0X3BlcmlvZCkKKyAgICAgICAgICAqbGFzdF9wZXJpb2QgPSdcMCc7CisgICAgICAgIGxhc3Rfc2xhc2ggPSBfbWJzcmNocihtb2R1bGVfbmFtZSwnXFwnKTsKKyAgICAgICAgaWYgKGxhc3Rfc2xhc2gpCisgICAgICAgICAgc3RyY3B5KG1vZHVsZV9uYW1lLGxhc3Rfc2xhc2grMSk7CisgICAgICAgIHN0cmNhdChtb2R1bGVfbmFtZSwiOiAiKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KK30KKworLyoqIEBkZWYgREJVU19JU19ESVJfU0VQQVJBVE9SKGMpCisgKiBtYWNybyBmb3IgY2hlY2tpbmcgaWYgY2hhcmFjdGVyIGMgaXMgYSBwYXRjaCBzZXBhcmF0b3IKKyAqIAorICogQHRvZG8gbW92ZSB0byBhIGhlYWRlciBmaWxlIHNvIHRoYXQgb3RoZXJzIGNhbiB1c2UgdGhpcyB0b28KKyAqLworI2lmZGVmIERCVVNfV0lOIAorI2RlZmluZSBEQlVTX0lTX0RJUl9TRVBBUkFUT1IoYykgKGMgPT0gJ1xcJyB8fCBjID09ICcvJykKKyNlbHNlCisjZGVmaW5lIERCVVNfSVNfRElSX1NFUEFSQVRPUihjKSAoYyA9PSAnLycpCisjZW5kaWYKKworLyoqIAorIHJlbW92ZSBzb3VyY2Ugcm9vdCBmcm9tIGZpbGUgcGF0aCAKKyB0aGUgc291cmNlIHJvb3QgaXMgZGV0ZXJtaW5lZCBieSAKKyovIAorc3RhdGljIGNoYXIgKl9kYnVzX2ZpbGVfcGF0aF9leHRyYWN0X2VsZW1lbnRzX2Zyb21fdGFpbChjb25zdCBjaGFyICpmaWxlLGludCBsZXZlbCkKK3sKKyAgc3RhdGljIGludCBwcmVmaXggPSAtMTsKKworICBpZiAocHJlZml4ID09IC0xKSAKKyAgICB7CisgICAgICBjaGFyICpwID0gKGNoYXIgKilmaWxlICsgc3RybGVuKGZpbGUpOworICAgICAgaW50IGkgPSAwOworICAgICAgcHJlZml4ID0gMDsKKyAgICAgIGZvciAoO3AgPj0gZmlsZTtwLS0pCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoREJVU19JU19ESVJfU0VQQVJBVE9SKCpwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCsraSA+PSBsZXZlbCkgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcC1maWxlKzE7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgcmV0dXJuIChjaGFyICopZmlsZStwcmVmaXg7Cit9CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgZGJ1c19pc192ZXJib3NlKCkgbWFjcm8gaWYgYnVpbHQgd2l0aCB2ZXJib3NlIGxvZ2dpbmcKKyAqIGVuYWJsZWQuCisgKiBAcmV0dXJucyB3aGV0aGVyIHZlcmJvc2UgbG9nZ2luZyBpcyBhY3RpdmUuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19pc192ZXJib3NlX3JlYWwgKHZvaWQpCit7CisgIF9kYnVzX3ZlcmJvc2VfaW5pdCAoKTsKKyAgcmV0dXJuIHZlcmJvc2U7Cit9CisKKy8qKgorICogUHJpbnRzIGEgd2FybmluZyBtZXNzYWdlIHRvIHN0ZGVycgorICogaWYgdGhlIHVzZXIgaGFzIGVuYWJsZWQgdmVyYm9zZSBtb2RlLgorICogVGhpcyBpcyB0aGUgcmVhbCBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbiwKKyAqIHVzZSBfZGJ1c192ZXJib3NlKCkgbWFjcm8gaW4gY29kZS4KKyAqCisgKiBAcGFyYW0gZm9ybWF0IHByaW50Zi1zdHlsZSBmb3JtYXQgc3RyaW5nLgorICovCit2b2lkCitfZGJ1c192ZXJib3NlX3JlYWwgKAorI2lmZGVmIERCVVNfQ1BQX1NVUFBPUlRTX1ZBUklBQkxFX01BQ1JPX0FSR1VNRU5UUworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbGluZSwgCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCAKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworICBzdGF0aWMgZGJ1c19ib29sX3QgbmVlZF9waWQgPSBUUlVFOworICBpbnQgbGVuOworICAKKyAgLyogdGhpbmdzIGFyZSB3cml0dGVuIGEgYml0IG9kZGx5IGhlcmUgc28gdGhhdAorICAgKiBpbiB0aGUgbm9uLXZlcmJvc2UgY2FzZSB3ZSBqdXN0IGhhdmUgdGhlIG9uZQorICAgKiBjb25kaXRpb25hbCBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5LgorICAgKi8KKyAgaWYgKCFfZGJ1c19pc192ZXJib3NlX3JlYWwoKSkKKyAgICByZXR1cm47CisKKyNpZm5kZWYgREJVU19VU0VfT1VUUFVUX0RFQlVHX1NUUklORworICAvKiBQcmludCBvdXQgcGlkIGJlZm9yZSB0aGUgbGluZSAqLworICBpZiAobmVlZF9waWQpCisgICAgeworI2lmIFBUSFJFQURfSU5fVkVSQk9TRQorICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJWx1OiAweCVseDogIiwgX2RidXNfcGlkX2Zvcl9sb2cgKCksIHB0aHJlYWRfc2VsZiAoKSk7CisjZWxzZQorICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJWx1OiAiLCBfZGJ1c19waWRfZm9yX2xvZyAoKSk7CisjZW5kaWYKKyAgICB9CisjZW5kaWYKKworICAvKiBPbmx5IHByaW50IHBpZCBhZ2FpbiBpZiB0aGUgbmV4dCBsaW5lIGlzIGEgbmV3IGxpbmUgKi8KKyAgbGVuID0gc3RybGVuIChmb3JtYXQpOworICBpZiAoZm9ybWF0W2xlbi0xXSA9PSAnXG4nKQorICAgIG5lZWRfcGlkID0gVFJVRTsKKyAgZWxzZQorICAgIG5lZWRfcGlkID0gRkFMU0U7CisKKyAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisjaWZkZWYgREJVU19VU0VfT1VUUFVUX0RFQlVHX1NUUklORworICB7CisgIGNoYXIgYnVmWzEwMjRdOworICBzdHJjcHkoYnVmLG1vZHVsZV9uYW1lKTsKKyNpZmRlZiBEQlVTX0NQUF9TVVBQT1JUU19WQVJJQUJMRV9NQUNST19BUkdVTUVOVFMKKyAgc3ByaW50ZiAoYnVmK3N0cmxlbihidWYpLCAiWyVzKCVkKTolc10gIixfZGJ1c19maWxlX3BhdGhfZXh0cmFjdF9lbGVtZW50c19mcm9tX3RhaWwoZmlsZSwyKSxsaW5lLGZ1bmN0aW9uKTsKKyNlbmRpZgorICB2c3ByaW50ZiAoYnVmK3N0cmxlbihidWYpLGZvcm1hdCwgYXJncyk7CisgIHZhX2VuZCAoYXJncyk7CisgIE91dHB1dERlYnVnU3RyaW5nQShidWYpOworICB9CisjZWxzZQorI2lmZGVmIERCVVNfQ1BQX1NVUFBPUlRTX1ZBUklBQkxFX01BQ1JPX0FSR1VNRU5UUworICBmcHJpbnRmIChzdGRlcnIsICJbJXMoJWQpOiVzXSAiLF9kYnVzX2ZpbGVfcGF0aF9leHRyYWN0X2VsZW1lbnRzX2Zyb21fdGFpbChmaWxlLDIpLGxpbmUsZnVuY3Rpb24pOworI2VuZGlmCisKKyNpZmRlZiBEQlVTX0FORFJPSURfTE9HCisgIExPR19QUklfVkEoQU5EUk9JRF9MT0dfREVCVUcsIExPR19UQUcsIGZvcm1hdCwgYXJncyk7CisjZWxzZQorICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ3MpOworI2VuZGlmIC8qIERCVVNfQU5EUk9JRF9MT0cgKi8KKyAgdmFfZW5kIChhcmdzKTsKKworICBmZmx1c2ggKHN0ZGVycik7CisjZW5kaWYKK30KKworLyoqCisgKiBSZWluaXRpYWxpemVzIHRoZSB2ZXJib3NlIGxvZ2dpbmcgY29kZSwgdXNlZAorICogYXMgYSBoYWNrIGluIGRidXMtc3Bhd24uYyBzbyB0aGF0IGEgY2hpbGQKKyAqIHByb2Nlc3MgcmUtcmVhZHMgaXRzIHBpZAorICoKKyAqLwordm9pZAorX2RidXNfdmVyYm9zZV9yZXNldF9yZWFsICh2b2lkKQoreworICB2ZXJib3NlX2luaXR0ZWQgPSBGQUxTRTsKK30KKwordm9pZAorX2RidXNfdHJhY2VfcmVmIChjb25zdCBjaGFyICpvYmpfbmFtZSwKKyAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAqb2JqLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBvbGRfcmVmY291bnQsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgIG5ld19yZWZjb3VudCwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqd2h5LAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbnZfdmFyLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICplbmFibGVkKQoreworICBfZGJ1c19hc3NlcnQgKG9ial9uYW1lICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKG9iaiAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChvbGRfcmVmY291bnQgPj0gLTEpOworICBfZGJ1c19hc3NlcnQgKG5ld19yZWZjb3VudCA+PSAtMSk7CisKKyAgaWYgKG9sZF9yZWZjb3VudCA9PSAtMSkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKG5ld19yZWZjb3VudCA9PSAtMSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChuZXdfcmVmY291bnQgPj0gMCk7CisgICAgICBfZGJ1c19hc3NlcnQgKG9sZF9yZWZjb3VudCA+PSAwKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAob2xkX3JlZmNvdW50ID4gMCB8fCBuZXdfcmVmY291bnQgPiAwKTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0ICh3aHkgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoZW52X3ZhciAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChlbmFibGVkICE9IE5VTEwpOworCisgIGlmICgqZW5hYmxlZCA8IDApCisgICAgeworICAgICAgY29uc3QgY2hhciAqcyA9IF9kYnVzX2dldGVudiAoZW52X3Zhcik7CisKKyAgICAgICplbmFibGVkID0gRkFMU0U7CisKKyAgICAgIGlmIChzICYmICpzKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCpzID09ICcwJykKKyAgICAgICAgICAgICplbmFibGVkID0gRkFMU0U7CisgICAgICAgICAgZWxzZSBpZiAoKnMgPT0gJzEnKQorICAgICAgICAgICAgKmVuYWJsZWQgPSBUUlVFOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9kYnVzX3dhcm4gKCIlcyBzaG91bGQgYmUgMCBvciAxIGlmIHNldCwgbm90ICclcyciLCBlbnZfdmFyLCBzKTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoKmVuYWJsZWQpCisgICAgeworICAgICAgaWYgKG9sZF9yZWZjb3VudCA9PSAtMSkKKyAgICAgICAgeworICAgICAgICAgIFZBTEdSSU5EX1BSSU5URl9CQUNLVFJBQ0UgKCIlcyAlcCByZWYgc3RvbGVuICglcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ial9uYW1lLCBvYmosIHdoeSk7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzICVwIHJlZiBzdG9sZW4gKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb2JqX25hbWUsIG9iaiwgd2h5KTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgVkFMR1JJTkRfUFJJTlRGX0JBQ0tUUkFDRSAoIiVzICVwICVkIC0+ICVkIHJlZnMgKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqX25hbWUsIG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfcmVmY291bnQsIG5ld19yZWZjb3VudCwgd2h5KTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiJXMgJXAgJWQgLT4gJWQgcmVmcyAoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvYmpfbmFtZSwgb2JqLCBvbGRfcmVmY291bnQsIG5ld19yZWZjb3VudCwgd2h5KTsKKyAgICAgICAgfQorICAgIH0KK30KKworI2VuZGlmIC8qIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERSAqLworCisvKioKKyAqIER1cGxpY2F0ZXMgYSBzdHJpbmcuIFJlc3VsdCBtdXN0IGJlIGZyZWVkIHdpdGgKKyAqIGRidXNfZnJlZSgpLiBSZXR1cm5zICNOVUxMIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICogSWYgdGhlIHN0cmluZyB0byBiZSBkdXBsaWNhdGVkIGlzICNOVUxMLCByZXR1cm5zICNOVUxMLgorICogCisgKiBAcGFyYW0gc3RyIHN0cmluZyB0byBkdXBsaWNhdGUuCisgKiBAcmV0dXJucyBuZXdseS1hbGxvY2F0ZWQgY29weS4KKyAqLworY2hhcioKK19kYnVzX3N0cmR1cCAoY29uc3QgY2hhciAqc3RyKQoreworICBzaXplX3QgbGVuOworICBjaGFyICpjb3B5OworICAKKyAgaWYgKHN0ciA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICAKKyAgbGVuID0gc3RybGVuIChzdHIpOworCisgIGNvcHkgPSBkYnVzX21hbGxvYyAobGVuICsgMSk7CisgIGlmIChjb3B5ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbWVtY3B5IChjb3B5LCBzdHIsIGxlbiArIDEpOworICAKKyAgcmV0dXJuIGNvcHk7Cit9CisKKy8qKgorICogRHVwbGljYXRlcyBhIGJsb2NrIG9mIG1lbW9yeS4gUmV0dXJucworICogI05VTEwgb24gZmFpbHVyZS4KKyAqCisgKiBAcGFyYW0gbWVtIG1lbW9yeSB0byBjb3B5CisgKiBAcGFyYW0gbl9ieXRlcyBudW1iZXIgb2YgYnl0ZXMgdG8gY29weQorICogQHJldHVybnMgdGhlIGNvcHkKKyAqLwordm9pZCoKK19kYnVzX21lbWR1cCAoY29uc3Qgdm9pZCAgKm1lbSwKKyAgICAgICAgICAgICAgc2l6ZV90ICAgICAgIG5fYnl0ZXMpCit7CisgIHZvaWQgKmNvcHk7CisKKyAgY29weSA9IGRidXNfbWFsbG9jIChuX2J5dGVzKTsKKyAgaWYgKGNvcHkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBtZW1jcHkgKGNvcHksIG1lbSwgbl9ieXRlcyk7CisgIAorICByZXR1cm4gY29weTsKK30KKworLyoqCisgKiBEdXBsaWNhdGVzIGEgc3RyaW5nIGFycmF5LiBSZXN1bHQgbWF5IGJlIGZyZWVkIHdpdGgKKyAqIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkoKS4gUmV0dXJucyAjTlVMTCBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAqIElmIHRoZSBhcnJheSB0byBiZSBkdXBsaWNhdGVkIGlzICNOVUxMLCByZXR1cm5zICNOVUxMLgorICogCisgKiBAcGFyYW0gYXJyYXkgYXJyYXkgdG8gZHVwbGljYXRlLgorICogQHJldHVybnMgbmV3bHktYWxsb2NhdGVkIGNvcHkuCisgKi8KK2NoYXIqKgorX2RidXNfZHVwX3N0cmluZ19hcnJheSAoY29uc3QgY2hhciAqKmFycmF5KQoreworICBpbnQgbGVuOworICBpbnQgaTsKKyAgY2hhciAqKmNvcHk7CisgIAorICBpZiAoYXJyYXkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBmb3IgKGxlbiA9IDA7IGFycmF5W2xlbl0gIT0gTlVMTDsgKytsZW4pCisgICAgOworCisgIGNvcHkgPSBkYnVzX25ldzAgKGNoYXIqLCBsZW4gKyAxKTsKKyAgaWYgKGNvcHkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBsZW4pCisgICAgeworICAgICAgY29weVtpXSA9IF9kYnVzX3N0cmR1cCAoYXJyYXlbaV0pOworICAgICAgaWYgKGNvcHlbaV0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGNvcHkpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgcmV0dXJuIGNvcHk7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgYSBzdHJpbmcgYXJyYXkgY29udGFpbnMgdGhlIGdpdmVuIHN0cmluZy4KKyAqIAorICogQHBhcmFtIGFycmF5IGFycmF5IHRvIHNlYXJjaC4KKyAqIEBwYXJhbSBzdHIgc3RyaW5nIHRvIGxvb2sgZm9yCisgKiBAcmV0dXJucyAjVFJVRSBpZiBhcnJheSBjb250YWlucyBzdHJpbmcKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19hcnJheV9jb250YWlucyAoY29uc3QgY2hhciAqKmFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqc3RyKQoreworICBpbnQgaTsKKworICBpID0gMDsKKyAgd2hpbGUgKGFycmF5W2ldICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKHN0cmNtcCAoYXJyYXlbaV0sIHN0cikgPT0gMCkKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICArK2k7CisgICAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBuZXcgVVVJRC4gSWYgeW91IGNoYW5nZSBob3cgdGhpcyBpcyBkb25lLAorICogdGhlcmUncyBzb21lIHRleHQgYWJvdXQgaXQgaW4gdGhlIHNwZWMgdGhhdCBzaG91bGQgYWxzbyBjaGFuZ2UuCisgKgorICogQHBhcmFtIHV1aWQgdGhlIHV1aWQgdG8gaW5pdGlhbGl6ZQorICovCit2b2lkCitfZGJ1c19nZW5lcmF0ZV91dWlkIChEQnVzR1VJRCAqdXVpZCkKK3sKKyAgbG9uZyBub3c7CisKKyAgLyogZG9uJ3QgdXNlIG1vbm90b25pYyB0aW1lIGJlY2F1c2UgdGhlIFVVSUQgbWF5IGJlIHNhdmVkIHRvIGRpc2ssIGUuZy4KKyAgICogaXQgbWF5IHBlcnNpc3QgYWNyb3NzIHJlYm9vdHMKKyAgICovCisgIF9kYnVzX2dldF9yZWFsX3RpbWUgKCZub3csIE5VTEwpOworCisgIHV1aWQtPmFzX3VpbnQzMnNbREJVU19VVUlEX0xFTkdUSF9XT1JEUyAtIDFdID0gREJVU19VSU5UMzJfVE9fQkUgKG5vdyk7CisgIAorICBfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYnl0ZXNfYnVmZmVyICh1dWlkLT5hc19ieXRlcywgREJVU19VVUlEX0xFTkdUSF9CWVRFUyAtIDQpOworfQorCisvKioKKyAqIEhleC1lbmNvZGUgYSBVVUlELgorICoKKyAqIEBwYXJhbSB1dWlkIHRoZSB1dWlkCisgKiBAcGFyYW0gZW5jb2RlZCBzdHJpbmcgdG8gYXBwZW5kIGhleCB1dWlkIHRvCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c191dWlkX2VuY29kZSAoY29uc3QgREJ1c0dVSUQgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgKmVuY29kZWQpCit7CisgIERCdXNTdHJpbmcgYmluYXJ5OworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4gKCZiaW5hcnksIHV1aWQtPmFzX2J5dGVzLCBEQlVTX1VVSURfTEVOR1RIX0JZVEVTKTsKKyAgcmV0dXJuIF9kYnVzX3N0cmluZ19oZXhfZW5jb2RlICgmYmluYXJ5LCAwLCBlbmNvZGVkLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZW5jb2RlZCkpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX3JlYWRfdXVpZF9maWxlX3dpdGhvdXRfY3JlYXRpbmcgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0dVSUQgICAgICAgICAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIGNvbnRlbnRzOworICBEQnVzU3RyaW5nIGRlY29kZWQ7CisgIGludCBlbmQ7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmY29udGVudHMpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmRlY29kZWQpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmY29udGVudHMpOworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmICghX2RidXNfZmlsZV9nZXRfY29udGVudHMgKCZjb250ZW50cywgZmlsZW5hbWUsIGVycm9yKSkKKyAgICBnb3RvIGVycm9yOworCisgIF9kYnVzX3N0cmluZ19jaG9wX3doaXRlICgmY29udGVudHMpOworCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmNvbnRlbnRzKSAhPSBEQlVTX1VVSURfTEVOR1RIX0hFWCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9GSUxFX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgICAgICAgIlVVSUQgZmlsZSAnJXMnIHNob3VsZCBjb250YWluIGEgaGV4IHN0cmluZyBvZiBsZW5ndGggJWQsIG5vdCBsZW5ndGggJWQsIHdpdGggbm8gb3RoZXIgdGV4dCIsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgREJVU19VVUlEX0xFTkdUSF9IRVgsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZjb250ZW50cykpOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2RlY29kZSAoJmNvbnRlbnRzLCAwLCAmZW5kLCAmZGVjb2RlZCwgMCkpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgaWYgKGVuZCA9PSAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0ZJTEVfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAiVVVJRCBmaWxlICclcycgY29udGFpbnMgaW52YWxpZCBoZXggZGF0YSIsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSkpOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmZGVjb2RlZCkgIT0gREJVU19VVUlEX0xFTkdUSF9CWVRFUykKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9GSUxFX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgICAgICAgIlVVSUQgZmlsZSAnJXMnIGNvbnRhaW5zICVkIGJ5dGVzIG9mIGhleC1lbmNvZGVkIGRhdGEgaW5zdGVhZCBvZiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZkZWNvZGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICBEQlVTX1VVSURfTEVOR1RIX0JZVEVTKTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19jb3B5X3RvX2J1ZmZlciAoJmRlY29kZWQsIHV1aWQtPmFzX2J5dGVzLCBEQlVTX1VVSURfTEVOR1RIX0JZVEVTKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRlY29kZWQpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbnRlbnRzKTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICByZXR1cm4gVFJVRTsKKyAgCisgZXJyb3I6CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb250ZW50cyk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZGVjb2RlZCk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19jcmVhdGVfdXVpZF9maWxlX2V4Y2x1c2l2ZWx5IChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNHVUlEICAgICAgICAgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBlbmNvZGVkOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZlbmNvZGVkKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX2dlbmVyYXRlX3V1aWQgKHV1aWQpOworICAKKyAgaWYgKCFfZGJ1c191dWlkX2VuY29kZSAodXVpZCwgJmVuY29kZWQpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZlbmNvZGVkLCAnXG4nKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX3NhdmVfdG9fZmlsZSAoJmVuY29kZWQsIGZpbGVuYW1lLCBUUlVFLCBlcnJvcikpCisgICAgZ290byBlcnJvcjsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmVuY29kZWQpOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKKyAgCisgZXJyb3I6CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZlbmNvZGVkKTsKKyAgcmV0dXJuIEZBTFNFOyAgICAgICAgCit9CisKKy8qKgorICogUmVhZHMgKGFuZCBvcHRpb25hbGx5IHdyaXRlcykgYSB1dWlkIHRvIGEgZmlsZS4gSW5pdGlhbGl6ZXMgdGhlIHV1aWQKKyAqIHVubGVzcyBhbiBlcnJvciBpcyByZXR1cm5lZC4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUKKyAqIEBwYXJhbSB1dWlkIHV1aWQgdG8gYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgbG9hZGVkIHV1aWQKKyAqIEBwYXJhbSBjcmVhdGVfaWZfbm90X2ZvdW5kICNUUlVFIHRvIGNyZWF0ZSBhIG5ldyB1dWlkIGFuZCBzYXZlIGl0IGlmIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QKKyAqIEBwYXJhbSBlcnJvciB0aGUgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlIGVycm9yIGlzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfcmVhZF91dWlkX2ZpbGUgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNHVUlEICAgICAgICAgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgY3JlYXRlX2lmX25vdF9mb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgREJ1c0Vycm9yIHJlYWRfZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgaWYgKF9kYnVzX3JlYWRfdXVpZF9maWxlX3dpdGhvdXRfY3JlYXRpbmcgKGZpbGVuYW1lLCB1dWlkLCAmcmVhZF9lcnJvcikpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKCFjcmVhdGVfaWZfbm90X2ZvdW5kKQorICAgIHsKKyAgICAgIGRidXNfbW92ZV9lcnJvciAoJnJlYWRfZXJyb3IsIGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogSWYgdGhlIGZpbGUgZXhpc3RzIGFuZCBjb250YWlucyBqdW5rLCB3ZSB3YW50IHRvIGtlZXAgdGhhdCBlcnJvcgorICAgKiBtZXNzYWdlIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcgaXQgd2l0aCBhICJmaWxlIGV4aXN0cyIgZXJyb3IKKyAgICogbWVzc2FnZSB3aGVuIHdlIHRyeSB0byB3cml0ZQorICAgKi8KKyAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZyZWFkX2Vycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfRklMRV9DT05URU5UKSkKKyAgICB7CisgICAgICBkYnVzX21vdmVfZXJyb3IgKCZyZWFkX2Vycm9yLCBlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmcmVhZF9lcnJvcik7CisgICAgICByZXR1cm4gX2RidXNfY3JlYXRlX3V1aWRfZmlsZV9leGNsdXNpdmVseSAoZmlsZW5hbWUsIHV1aWQsIGVycm9yKTsKKyAgICB9Cit9CisKK19EQlVTX0RFRklORV9HTE9CQUxfTE9DSyAobWFjaGluZV91dWlkKTsKK3N0YXRpYyBpbnQgbWFjaGluZV91dWlkX2luaXRpYWxpemVkX2dlbmVyYXRpb24gPSAwOworc3RhdGljIERCdXNHVUlEIG1hY2hpbmVfdXVpZDsKKworLyoqCisgKiBHZXRzIHRoZSBoZXgtZW5jb2RlZCBVVUlEIG9mIHRoZSBtYWNoaW5lIHRoaXMgZnVuY3Rpb24gaXMKKyAqIGV4ZWN1dGVkIG9uLiBUaGlzIFVVSUQgaXMgZ3VhcmFudGVlZCB0byBiZSB0aGUgc2FtZSBmb3IgYSBnaXZlbgorICogbWFjaGluZSBhdCBsZWFzdCB1bnRpbCBpdCBuZXh0IHJlYm9vdHMsIHRob3VnaCBpdCBhbHNvCisgKiBtYWtlcyBzb21lIGVmZm9ydCB0byBiZSB0aGUgc2FtZSBmb3JldmVyLCBpdCBtYXkgY2hhbmdlIGlmIHRoZQorICogbWFjaGluZSBpcyByZWNvbmZpZ3VyZWQgb3IgaXRzIGhhcmR3YXJlIGlzIG1vZGlmaWVkLgorICogCisgKiBAcGFyYW0gdXVpZF9zdHIgc3RyaW5nIHRvIGFwcGVuZCBoZXgtZW5jb2RlZCBtYWNoaW5lIHV1aWQgdG8KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dldF9sb2NhbF9tYWNoaW5lX3V1aWRfZW5jb2RlZCAoREJ1c1N0cmluZyAqdXVpZF9zdHIpCit7CisgIGRidXNfYm9vbF90IG9rOworICAKKyAgX0RCVVNfTE9DSyAobWFjaGluZV91dWlkKTsKKyAgaWYgKG1hY2hpbmVfdXVpZF9pbml0aWFsaXplZF9nZW5lcmF0aW9uICE9IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbikKKyAgICB7CisgICAgICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgICAgIGlmICghX2RidXNfcmVhZF9sb2NhbF9tYWNoaW5lX3V1aWQgKCZtYWNoaW5lX3V1aWQsIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkKKyAgICAgICAgeyAgICAgICAgICAKKyNpZm5kZWYgREJVU19CVUlMRF9URVNUUworICAgICAgICAgIC8qIEZvciB0aGUgdGVzdCBzdWl0ZSwgd2UgbWF5IG5vdCBiZSBpbnN0YWxsZWQgc28ganVzdCBjb250aW51ZSBzaWxlbnRseQorICAgICAgICAgICAqIGhlcmUuIEJ1dCBpbiBhIHByb2R1Y3Rpb24gYnVpbGQsIHdlIHdhbnQgdG8gYmUgbmljZSBhbmQgbG91ZCBhYm91dAorICAgICAgICAgICAqIHRoaXMuCisgICAgICAgICAgICovCisgICAgICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJELUJ1cyBsaWJyYXJ5IGFwcGVhcnMgdG8gYmUgaW5jb3JyZWN0bHkgc2V0IHVwOyBmYWlsZWQgdG8gcmVhZCBtYWNoaW5lIHV1aWQ6ICVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZWUgdGhlIG1hbnVhbCBwYWdlIGZvciBkYnVzLXV1aWRnZW4gdG8gY29ycmVjdCB0aGlzIGlzc3VlLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisjZW5kaWYKKyAgICAgICAgICAKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgCisgICAgICAgICAgX2RidXNfZ2VuZXJhdGVfdXVpZCAoJm1hY2hpbmVfdXVpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgb2sgPSBfZGJ1c191dWlkX2VuY29kZSAoJm1hY2hpbmVfdXVpZCwgdXVpZF9zdHIpOworCisgIF9EQlVTX1VOTE9DSyAobWFjaGluZV91dWlkKTsKKworICByZXR1cm4gb2s7Cit9CisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworLyoqIFN0cmluZyB1c2VkIGluIF9kYnVzX3JldHVybl9pZl9mYWlsIG1hY3JvICovCitjb25zdCBjaGFyICpfZGJ1c19yZXR1cm5faWZfZmFpbF93YXJuaW5nX2Zvcm1hdCA9CisiYXJndW1lbnRzIHRvICVzKCkgd2VyZSBpbmNvcnJlY3QsIGFzc2VydGlvbiBcIiVzXCIgZmFpbGVkIGluIGZpbGUgJXMgbGluZSAlZC5cbiIKKyJUaGlzIGlzIG5vcm1hbGx5IGEgYnVnIGluIHNvbWUgYXBwbGljYXRpb24gdXNpbmcgdGhlIEQtQnVzIGxpYnJhcnkuXG4iOworI2VuZGlmCisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0FTU0VSVAorLyoqCisgKiBJbnRlcm5hbHMgb2YgX2RidXNfYXNzZXJ0KCk7IGl0J3MgYSBmdW5jdGlvbgorICogcmF0aGVyIHRoYW4gYSBtYWNybyB3aXRoIHRoZSBpbmxpbmUgY29kZSBzbworICogdGhhdCB0aGUgYXNzZXJ0aW9uIGZhaWx1cmUgYmxvY2tzIGRvbid0IHNob3cgdXAKKyAqIGluIHRlc3Qgc3VpdGUgY292ZXJhZ2UsIGFuZCB0byBzaHJpbmsgY29kZSBzaXplLgorICoKKyAqIEBwYXJhbSBjb25kaXRpb24gVFJVRSBpZiBhc3NlcnRpb24gc3VjY2VlZGVkCisgKiBAcGFyYW0gY29uZGl0aW9uX3RleHQgY29uZGl0aW9uIGFzIGEgc3RyaW5nCisgKiBAcGFyYW0gZmlsZSBmaWxlIHRoZSBhc3NlcnRpb24gaXMgaW4KKyAqIEBwYXJhbSBsaW5lIGxpbmUgdGhlIGFzc2VydGlvbiBpcyBpbgorICogQHBhcmFtIGZ1bmMgZnVuY3Rpb24gdGhlIGFzc2VydGlvbiBpcyBpbgorICovCit2b2lkCitfZGJ1c19yZWFsX2Fzc2VydCAoZGJ1c19ib29sX3QgIGNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqY29uZGl0aW9uX3RleHQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIGxpbmUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmZ1bmMpCit7CisgIGlmIChfREJVU19VTkxJS0VMWSAoIWNvbmRpdGlvbikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIiVsdTogYXNzZXJ0aW9uIGZhaWxlZCBcIiVzXCIgZmlsZSBcIiVzXCIgbGluZSAlZCBmdW5jdGlvbiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3BpZF9mb3JfbG9nICgpLCBjb25kaXRpb25fdGV4dCwgZmlsZSwgbGluZSwgZnVuYyk7CisgICAgICBfZGJ1c19hYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qKgorICogSW50ZXJuYWxzIG9mIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgpOyBpdCdzIGEgZnVuY3Rpb24KKyAqIHJhdGhlciB0aGFuIGEgbWFjcm8gd2l0aCB0aGUgaW5saW5lIGNvZGUgc28KKyAqIHRoYXQgdGhlIGFzc2VydGlvbiBmYWlsdXJlIGJsb2NrcyBkb24ndCBzaG93IHVwCisgKiBpbiB0ZXN0IHN1aXRlIGNvdmVyYWdlLCBhbmQgdG8gc2hyaW5rIGNvZGUgc2l6ZS4KKyAqCisgKiBAcGFyYW0gZXhwbGFuYXRpb24gd2hhdCB3YXMgcmVhY2hlZCB0aGF0IHNob3VsZG4ndCBoYXZlIGJlZW4KKyAqIEBwYXJhbSBmaWxlIGZpbGUgdGhlIGFzc2VydGlvbiBpcyBpbgorICogQHBhcmFtIGxpbmUgbGluZSB0aGUgYXNzZXJ0aW9uIGlzIGluCisgKi8KK3ZvaWQKK19kYnVzX3JlYWxfYXNzZXJ0X25vdF9yZWFjaGVkIChjb25zdCBjaGFyICpleHBsYW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGxpbmUpCit7CisgIF9kYnVzX3dhcm4gKCJGaWxlIFwiJXNcIiBsaW5lICVkIHByb2Nlc3MgJWx1IHNob3VsZCBub3QgaGF2ZSBiZWVuIHJlYWNoZWQ6ICVzXG4iLAorICAgICAgICAgICAgICBmaWxlLCBsaW5lLCBfZGJ1c19waWRfZm9yX2xvZyAoKSwgZXhwbGFuYXRpb24pOworICBfZGJ1c19hYm9ydCAoKTsKK30KKyNlbmRpZiAvKiBEQlVTX0RJU0FCTEVfQVNTRVJUICovCisgIAorI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcnVuX2ZhaWxpbmdfZWFjaF9tYWxsb2MgKGludCAgICAgICAgICAgICAgICAgICAgbl9tYWxsb2NzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAqZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1Rlc3RNZW1vcnlGdW5jdGlvbiBmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAqZGF0YSkKK3sKKyAgbl9tYWxsb2NzICs9IDEwOyAvKiBmdWRnZSBmYWN0b3IgdG8gZW5zdXJlIHJlYWxsb2NzIGV0Yy4gYXJlIGNvdmVyZWQgKi8KKyAgCisgIHdoaWxlIChuX21hbGxvY3MgPj0gMCkKKyAgICB7ICAgICAgCisgICAgICBfZGJ1c19zZXRfZmFpbF9hbGxvY19jb3VudGVyIChuX21hbGxvY3MpOworCisgICAgICBfZGJ1c192ZXJib3NlICgiXG49PT1cbiVzOiAod2lsbCBmYWlsIG1hbGxvYyAlZCB3aXRoICVkIGZhaWx1cmVzKVxuPT09XG4iLAorICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sIG5fbWFsbG9jcywKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2dldF9mYWlsX2FsbG9jX2ZhaWx1cmVzICgpKTsKKworICAgICAgaWYgKCEoKiBmdW5jKSAoZGF0YSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgbl9tYWxsb2NzIC09IDE7CisgICAgfQorCisgIF9kYnVzX3NldF9mYWlsX2FsbG9jX2NvdW50ZXIgKF9EQlVTX0lOVF9NQVgpOworCisgIHJldHVybiBUUlVFOworfSAgICAgICAgICAgICAgICAgICAgICAgIAorCisvKioKKyAqIFRlc3RzIGhvdyB3ZWxsIHRoZSBnaXZlbiBmdW5jdGlvbiByZXNwb25kcyB0byBvdXQtb2YtbWVtb3J5CisgKiBzaXR1YXRpb25zLiBDYWxscyB0aGUgZnVuY3Rpb24gcmVwZWF0ZWRseSwgZmFpbGluZyBhIGRpZmZlcmVudAorICogY2FsbCB0byBtYWxsb2MoKSBlYWNoIHRpbWUuIElmIHRoZSBmdW5jdGlvbiBldmVyIHJldHVybnMgI0ZBTFNFLAorICogdGhlIHRlc3QgZmFpbHMuIFRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuICNUUlVFIHdoZW5ldmVyIHNvbWV0aGluZworICogdmFsaWQgKHN1Y2ggYXMgcmV0dXJuaW5nIGFuIGVycm9yLCBvciBzdWNjZWVkaW5nKSBvY2N1cnMsIGFuZCAjRkFMU0UKKyAqIGlmIGl0IGdldHMgY29uZnVzZWQgaW4gc29tZSB3YXkuCisgKgorICogQHBhcmFtIGRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uIG9mIHRoZSB0ZXN0IHVzZWQgaW4gdmVyYm9zZSBvdXRwdXQKKyAqIEBwYXJhbSBmdW5jIGZ1bmN0aW9uIHRvIGNhbGwKKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gcGFzcyB0byBmdW5jdGlvbgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGZ1bmN0aW9uIG5ldmVyIHJldHVybnMgRkFMU0UKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nIChjb25zdCBjaGFyICAgICAgICAgICAgICpkZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGVzdE1lbW9yeUZ1bmN0aW9uICBmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgKmRhdGEpCit7CisgIGludCBhcHByb3hfbWFsbG9jczsKKyAgY29uc3QgY2hhciAqc2V0dGluZzsKKyAgaW50IG1heF9mYWlsdXJlc190b190cnk7CisgIGludCBpOworCisgIC8qIFJ1biBvbmNlIHRvIHNlZSBhYm91dCBob3cgbWFueSBtYWxsb2NzIGFyZSBpbnZvbHZlZCAqLworICAKKyAgX2RidXNfc2V0X2ZhaWxfYWxsb2NfY291bnRlciAoX0RCVVNfSU5UX01BWCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIlJ1bm5pbmcgb25jZSB0byBjb3VudCBtYWxsb2NzXG4iKTsKKyAgCisgIGlmICghKCogZnVuYykgKGRhdGEpKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGFwcHJveF9tYWxsb2NzID0gX0RCVVNfSU5UX01BWCAtIF9kYnVzX2dldF9mYWlsX2FsbG9jX2NvdW50ZXIgKCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIlxuPT09PT09PT09PT09PT09PT1cbiVzOiBhYm91dCAlZCBtYWxsb2NzIHRvdGFsXG49PT09PT09PT09PT09PT09PVxuIiwKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sIGFwcHJveF9tYWxsb2NzKTsKKworICBzZXR0aW5nID0gX2RidXNfZ2V0ZW52ICgiREJVU19URVNUX01BTExPQ19GQUlMVVJFUyIpOworICBpZiAoc2V0dGluZyAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgc3RyOworICAgICAgbG9uZyB2OworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIHNldHRpbmcpOworICAgICAgdiA9IDQ7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19wYXJzZV9pbnQgKCZzdHIsIDAsICZ2LCBOVUxMKSkKKyAgICAgICAgX2RidXNfd2FybiAoImNvdWxkbid0IHBhcnNlICclcycgYXMgaW50ZWdlclxuIiwgc2V0dGluZyk7CisgICAgICBtYXhfZmFpbHVyZXNfdG9fdHJ5ID0gdjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtYXhfZmFpbHVyZXNfdG9fdHJ5ID0gNDsKKyAgICB9CisKKyAgaSA9IHNldHRpbmcgPyBtYXhfZmFpbHVyZXNfdG9fdHJ5IC0gMSA6IDE7CisgIHdoaWxlIChpIDwgbWF4X2ZhaWx1cmVzX3RvX3RyeSkKKyAgICB7CisgICAgICBfZGJ1c19zZXRfZmFpbF9hbGxvY19mYWlsdXJlcyAoaSk7CisgICAgICBpZiAoIXJ1bl9mYWlsaW5nX2VhY2hfbWFsbG9jIChhcHByb3hfbWFsbG9jcywgZGVzY3JpcHRpb24sIGZ1bmMsIGRhdGEpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICArK2k7CisgICAgfQorICAKKyAgX2RidXNfdmVyYm9zZSAoIlxuPT09PT09PT09PT09PT09PT1cbiVzOiBhbGwgaXRlcmF0aW9ucyBwYXNzZWRcbj09PT09PT09PT09PT09PT09XG4iLAorICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLworCisvKiogQH0gKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLWludGVybmFscy5oIGIvZGJ1cy9kYnVzL2RidXMtaW50ZXJuYWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAzNmEyYgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLWludGVybmFscy5oCkBAIC0wLDAgKzEsMzc5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtaW50ZXJuYWxzLmggIHJhbmRvbSB1dGlsaXR5IHN0dWZmIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZmRlZiBEQlVTX0lOU0lERV9EQlVTX0gKKyNlcnJvciAiWW91IGNhbid0IGluY2x1ZGUgZGJ1cy1pbnRlcm5hbHMuaCBpbiB0aGUgcHVibGljIGhlYWRlciBkYnVzLmgiCisjZW5kaWYKKworI2lmbmRlZiBEQlVTX0lOVEVSTkFMU19ICisjZGVmaW5lIERCVVNfSU5URVJOQUxTX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tZW1vcnkuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZXJyb3JzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdGhyZWFkcy1pbnRlcm5hbC5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKyNpZm5kZWYgREJVU19TRVNTSU9OX0JVU19ERUZBVUxUX0FERFJFU1MKKyNkZWZpbmUgREJVU19TRVNTSU9OX0JVU19ERUZBVUxUX0FERFJFU1MJImF1dG9sYXVuY2g6IgorI2VuZGlmCisKK3ZvaWQgX2RidXNfd2FybiAgICAgICAgICAgICAgIChjb25zdCBjaGFyICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKSBfREJVU19HTlVDX1BSSU5URiAoMSwgMik7CisKK3ZvaWQgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgIChjb25zdCBjaGFyICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKSBfREJVU19HTlVDX1BSSU5URiAoMSwgMik7CisKKworI2lmIGRlZmluZWQgKF9fU1REQ19WRVJTSU9OX18pICYmIChfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwpCisjZGVmaW5lIF9EQlVTX0ZVTkNUSU9OX05BTUUgX19mdW5jX18KKyNlbGlmIGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX01TQ19WRVIpCisjZGVmaW5lIF9EQlVTX0ZVTkNUSU9OX05BTUUgX19GVU5DVElPTl9fCisjZWxzZQorI2RlZmluZSBfREJVU19GVU5DVElPTl9OQU1FICJ1bmtub3duIGZ1bmN0aW9uIgorI2VuZGlmCisKKy8qCisgKiAoY29kZSBmcm9tIEdMaWIpCisgKiAKKyAqIFRoZSBfREJVU19MSUtFTFkgYW5kIF9EQlVTX1VOTElLRUxZIG1hY3JvcyBsZXQgdGhlIHByb2dyYW1tZXIgZ2l2ZSBoaW50cyB0byAKKyAqIHRoZSBjb21waWxlciBhYm91dCB0aGUgZXhwZWN0ZWQgcmVzdWx0IG9mIGFuIGV4cHJlc3Npb24uIFNvbWUgY29tcGlsZXJzCisgKiBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gZm9yIG9wdGltaXphdGlvbnMuCisgKgorICogVGhlIF9EQlVTX0JPT0xFQU5fRVhQUiBtYWNybyBpcyBpbnRlbmRlZCB0byB0cmlnZ2VyIGEgZ2NjIHdhcm5pbmcgd2hlbgorICogcHV0dGluZyBhc3NpZ25tZW50cyBpbiB0aGUgbWFjcm8gYXJnCisgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPiAyKSAmJiBkZWZpbmVkKF9fT1BUSU1JWkVfXykKKyNkZWZpbmUgX0RCVVNfQk9PTEVBTl9FWFBSKGV4cHIpICAgICAgICAgICAgICAgIFwKKyBfX2V4dGVuc2lvbl9fICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIGludCBfZGJ1c19ib29sZWFuX3Zhcl87ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIGlmIChleHByKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9kYnVzX2Jvb2xlYW5fdmFyXyA9IDE7ICAgICAgICAgICAgICAgICAgIFwKKyAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9kYnVzX2Jvb2xlYW5fdmFyXyA9IDA7ICAgICAgICAgICAgICAgICAgIFwKKyAgIF9kYnVzX2Jvb2xlYW5fdmFyXzsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisjZGVmaW5lIF9EQlVTX0xJS0VMWShleHByKSAoX19idWlsdGluX2V4cGVjdCAoX0RCVVNfQk9PTEVBTl9FWFBSKGV4cHIpLCAxKSkKKyNkZWZpbmUgX0RCVVNfVU5MSUtFTFkoZXhwcikgKF9fYnVpbHRpbl9leHBlY3QgKF9EQlVTX0JPT0xFQU5fRVhQUihleHByKSwgMCkpCisjZWxzZQorI2RlZmluZSBfREJVU19MSUtFTFkoZXhwcikgKGV4cHIpCisjZGVmaW5lIF9EQlVTX1VOTElLRUxZKGV4cHIpIChleHByKQorI2VuZGlmCisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKworLyoKKyBhdCBsZWFzdCBnbnUgY2MgYW5kIG1zdmMgY29tcGlsZXIgYXJlIGtub3duIHRvIAorIGhhdmUgc3VwcG9ydCBmb3IgdmFyaWFibGUgbWFjcm8gYXJndW1lbnQgbGlzdHMKKyBhZGQgb3RoZXIgY29tcGlsZXJzIGlzIHJlcXVpcmVkCisqLworI2lmIGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX01TQ19WRVIpIAorI2RlZmluZSBEQlVTX0NQUF9TVVBQT1JUU19WQVJJQUJMRV9NQUNST19BUkdVTUVOVFMKKyNlbmRpZgorCisjaWZkZWYgREJVU19DUFBfU1VQUE9SVFNfVkFSSUFCTEVfTUFDUk9fQVJHVU1FTlRTCit2b2lkIF9kYnVzX3ZlcmJvc2VfcmVhbCAgICAgICAoY29uc3QgY2hhciAqZmlsZSwgY29uc3QgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsLi4uKSBfREJVU19HTlVDX1BSSU5URiAoNCwgNSk7CisjICBkZWZpbmUgX2RidXNfdmVyYm9zZShmbXQsLi4uKSBfZGJ1c192ZXJib3NlX3JlYWwoIF9fRklMRV9fLF9fTElORV9fLF9fRlVOQ1RJT05fXyxmbXQsICMjIF9fVkFfQVJHU19fKQorI2Vsc2UKK3ZvaWQgX2RidXNfdmVyYm9zZV9yZWFsICAgICAgIChjb25zdCBjaGFyICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKSBfREJVU19HTlVDX1BSSU5URiAoMSwgMik7CisjICBkZWZpbmUgX2RidXNfdmVyYm9zZSBfZGJ1c192ZXJib3NlX3JlYWwKKyNlbmRpZgordm9pZCBfZGJ1c192ZXJib3NlX3Jlc2V0X3JlYWwgKHZvaWQpOworZGJ1c19ib29sX3QgX2RidXNfaXNfdmVyYm9zZV9yZWFsICh2b2lkKTsKKworIyAgZGVmaW5lIF9kYnVzX3ZlcmJvc2VfcmVzZXQgX2RidXNfdmVyYm9zZV9yZXNldF9yZWFsCisjICBkZWZpbmUgX2RidXNfaXNfdmVyYm9zZSBfZGJ1c19pc192ZXJib3NlX3JlYWwKKyNlbHNlCisjICBpZmRlZiBIQVZFX0lTT19WQVJBUkdTCisjICAgIGRlZmluZSBfZGJ1c192ZXJib3NlKC4uLikgZG8geyB9IHdoaWxlICgwKQorIyAgZWxpZiBkZWZpbmVkIChIQVZFX0dOVUNfVkFSQVJHUykKKyMgICAgZGVmaW5lIF9kYnVzX3ZlcmJvc2UoZm9ybWF0Li4uKSBkbyB7IH0gd2hpbGUgKDApCisjICBlbHNlCitzdGF0aWMgdm9pZCBfZGJ1c192ZXJib3NlKGNvbnN0IGNoYXIgKiB4LC4uLikgezt9CisjICBlbmRpZgorIyAgZGVmaW5lIF9kYnVzX3ZlcmJvc2VfcmVzZXQoKSBkbyB7IH0gd2hpbGUgKDApCisjICBkZWZpbmUgX2RidXNfaXNfdmVyYm9zZSgpIEZBTFNFIAorI2VuZGlmIC8qICFEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUgKi8KKwordm9pZCBfZGJ1c190cmFjZV9yZWYgKGNvbnN0IGNoYXIgKm9ial9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgKm9iaiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBvbGRfcmVmY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbmV3X3JlZmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKndoeSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbnZfdmFyLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgKmVuYWJsZWQpOworCitjb25zdCBjaGFyKiBfZGJ1c19zdHJlcnJvciAoaW50IGVycm9yX251bWJlcik7CisKKyNpZmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisjZGVmaW5lIF9kYnVzX2Fzc2VydChjb25kaXRpb24pIGRvIHsgfSB3aGlsZSAoMCkKKyNlbHNlCit2b2lkIF9kYnVzX3JlYWxfYXNzZXJ0IChkYnVzX2Jvb2xfdCAgY29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmNvbmRpdGlvbl90ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpmdW5jKTsKKyNkZWZpbmUgX2RidXNfYXNzZXJ0KGNvbmRpdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX2RidXNfcmVhbF9hc3NlcnQgKChjb25kaXRpb24pICE9IDAsICNjb25kaXRpb24sIF9fRklMRV9fLCBfX0xJTkVfXywgX0RCVVNfRlVOQ1RJT05fTkFNRSkKKyNlbmRpZiAvKiAhREJVU19ESVNBQkxFX0FTU0VSVCAqLworCisjaWZkZWYgREJVU19ESVNBQkxFX0FTU0VSVAorI2RlZmluZSBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoZXhwbGFuYXRpb24pIGRvIHsgfSB3aGlsZSAoMCkKKyNlbHNlCit2b2lkIF9kYnVzX3JlYWxfYXNzZXJ0X25vdF9yZWFjaGVkIChjb25zdCBjaGFyICpleHBsYW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBsaW5lKSBfREJVU19HTlVDX05PUkVUVVJOOworI2RlZmluZSBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoZXhwbGFuYXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9kYnVzX3JlYWxfYXNzZXJ0X25vdF9yZWFjaGVkIChleHBsYW5hdGlvbiwgX19GSUxFX18sIF9fTElORV9fKQorI2VuZGlmIC8qICFEQlVTX0RJU0FCTEVfQVNTRVJUICovCisKKyNpZmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisjZGVmaW5lIF9kYnVzX3JldHVybl9pZl9mYWlsKGNvbmRpdGlvbikKKyNkZWZpbmUgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsKGNvbmRpdGlvbiwgdmFsKQorI2Vsc2UKKworZXh0ZXJuIGNvbnN0IGNoYXIgKl9kYnVzX3JldHVybl9pZl9mYWlsX3dhcm5pbmdfZm9ybWF0OworCisjZGVmaW5lIF9kYnVzX3JldHVybl9pZl9mYWlsKGNvbmRpdGlvbikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIF9kYnVzX2Fzc2VydCAoKCooY29uc3QgY2hhciopX0RCVVNfRlVOQ1RJT05fTkFNRSkgIT0gJ18nKTsgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoIShjb25kaXRpb24pKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKF9kYnVzX3JldHVybl9pZl9mYWlsX3dhcm5pbmdfZm9ybWF0LCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfRlVOQ1RJT05fTkFNRSwgI2NvbmRpdGlvbiwgX19GSUxFX18sIF9fTElORV9fKTsgXAorICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gfSB3aGlsZSAoMCkKKworI2RlZmluZSBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwoY29uZGl0aW9uLCB2YWwpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIF9kYnVzX2Fzc2VydCAoKCooY29uc3QgY2hhciopX0RCVVNfRlVOQ1RJT05fTkFNRSkgIT0gJ18nKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICghKGNvbmRpdGlvbikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkIChfZGJ1c19yZXR1cm5faWZfZmFpbF93YXJuaW5nX2Zvcm1hdCwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfRlVOQ1RJT05fTkFNRSwgI2NvbmRpdGlvbiwgX19GSUxFX18sIF9fTElORV9fKTsgICAgICBcCisgICAgcmV0dXJuICh2YWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IH0gd2hpbGUgKDApCisKKyNlbmRpZiAvKiAhREJVU19ESVNBQkxFX0FTU0VSVCAqLworCisjZGVmaW5lIF9EQlVTX05fRUxFTUVOVFMoYXJyYXkpICgoaW50KSAoc2l6ZW9mICgoYXJyYXkpKSAvIHNpemVvZiAoKGFycmF5KVswXSkpKQorCisjZGVmaW5lIF9EQlVTX1BPSU5URVJfVE9fSU5UKHBvaW50ZXIpICgoaW50cHRyX3QpKHBvaW50ZXIpKQorI2RlZmluZSBfREJVU19JTlRfVE9fUE9JTlRFUihpbnRlZ2VyKSAoKHZvaWQqKSgoaW50cHRyX3QpKGludGVnZXIpKSkKKworI2RlZmluZSBfREJVU19aRVJPKG9iamVjdCkgKG1lbXNldCAoJihvYmplY3QpLCAnXDAnLCBzaXplb2YgKChvYmplY3QpKSkpCisKKyNkZWZpbmUgX0RCVVNfU1RSVUNUX09GRlNFVChzdHJ1Y3RfdHlwZSwgbWVtYmVyKQlcCisgICAgKChpbnRwdHJfdCkgKCh1bnNpZ25lZCBjaGFyKikgJigoc3RydWN0X3R5cGUqKSAwKS0+bWVtYmVyKSkKKworI2lmZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKy8qIHRoaXMgaXMgYW4gYXNzZXJ0IGFuZCBub3QgYW4gZXJyb3IsIGJ1dCBpbiB0aGUgdHlwaWNhbCAtLWRpc2FibGUtY2hlY2tzIGNhc2UgKHlvdSdyZSB0cnlpbmcKKyAqIHRvIHJlYWxseSBtaW5pbWl6ZSBjb2RlIHNpemUpLCBkaXNhYmxpbmcgdGhlc2UgYXNzZXJ0aW9ucyBtYWtlcyBzZW5zZS4KKyAqLworI2RlZmluZSBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUKGVycm9yKSBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcikgZG8geyB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcikgICBfZGJ1c19hc3NlcnQgKChlcnJvcikgPT0gTlVMTCB8fCBkYnVzX2Vycm9yX2lzX3NldCAoKGVycm9yKSkpCisjZGVmaW5lIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcikgX2RidXNfYXNzZXJ0ICgoZXJyb3IpID09IE5VTEwgfHwgIWRidXNfZXJyb3JfaXNfc2V0ICgoZXJyb3IpKSkKKyNlbmRpZgorCisjZGVmaW5lIF9kYnVzX3JldHVybl9pZl9lcnJvcl9pc19zZXQoZXJyb3IpIF9kYnVzX3JldHVybl9pZl9mYWlsICgoZXJyb3IpID09IE5VTEwgfHwgIWRidXNfZXJyb3JfaXNfc2V0ICgoZXJyb3IpKSkKKyNkZWZpbmUgX2RidXNfcmV0dXJuX3ZhbF9pZl9lcnJvcl9pc19zZXQoZXJyb3IsIHZhbCkgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICgoZXJyb3IpID09IE5VTEwgfHwgIWRidXNfZXJyb3JfaXNfc2V0ICgoZXJyb3IpKSwgKHZhbCkpCisKKy8qIFRoaXMgYWxpZ25tZW50IHRoaW5nIGlzIGZyb20gT1JCaXQyICovCisvKiBBbGlnbiBhIHZhbHVlIHVwd2FyZCB0byBhIGJvdW5kYXJ5LCBleHByZXNzZWQgYXMgYSBudW1iZXIgb2YgYnl0ZXMuCisgKiBFLmcuIGFsaWduIHRvIGFuIDgtYnl0ZSBib3VuZGFyeSB3aXRoIGFyZ3VtZW50IG9mIDguCisgKi8KKworLyoKKyAqICAgKHRoaXMgKyBib3VuZGFyeSAtIDEpCisgKiAgICAgICAgICAmCisgKiAgICB+KGJvdW5kYXJ5IC0gMSkKKyAqLworCisjZGVmaW5lIF9EQlVTX0FMSUdOX1ZBTFVFKHRoaXMsIGJvdW5kYXJ5KSBcCisgICgoICgodWludHB0cl90KSh0aGlzKSkgKyAoKCh1aW50cHRyX3QpKGJvdW5kYXJ5KSkgLTEpKSAmICh+KCgodWludHB0cl90KShib3VuZGFyeSkpLTEpKSkKKworI2RlZmluZSBfREJVU19BTElHTl9BRERSRVNTKHRoaXMsIGJvdW5kYXJ5KSBcCisgICgodm9pZCopX0RCVVNfQUxJR05fVkFMVUUodGhpcywgYm91bmRhcnkpKQorCisKK2NoYXIqICAgICAgIF9kYnVzX3N0cmR1cCAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAgKnN0cik7Cit2b2lkKiAgICAgICBfZGJ1c19tZW1kdXAgICAgICAgICAgICAgICAgKGNvbnN0IHZvaWQgICptZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICBuX2J5dGVzKTsKK2RidXNfYm9vbF90IF9kYnVzX3N0cmluZ19hcnJheV9jb250YWlucyAoY29uc3QgY2hhciAqKmFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqc3RyKTsKK2NoYXIqKiAgICAgIF9kYnVzX2R1cF9zdHJpbmdfYXJyYXkgICAgICAoY29uc3QgY2hhciAqKmFycmF5KTsKKworI2RlZmluZSBfREJVU19JTlQxNl9NSU4JICgoZGJ1c19pbnQxNl90KSAweDgwMDApCisjZGVmaW5lIF9EQlVTX0lOVDE2X01BWAkgKChkYnVzX2ludDE2X3QpIDB4N2ZmZikKKyNkZWZpbmUgX0RCVVNfVUlOVDE2X01BWCAoKGRidXNfdWludDE2X3QpMHhmZmZmKQorI2RlZmluZSBfREJVU19JTlQzMl9NSU4JICgoZGJ1c19pbnQzMl90KSAweDgwMDAwMDAwKQorI2RlZmluZSBfREJVU19JTlQzMl9NQVgJICgoZGJ1c19pbnQzMl90KSAweDdmZmZmZmZmKQorI2RlZmluZSBfREJVU19VSU5UMzJfTUFYICgoZGJ1c191aW50MzJfdCkweGZmZmZmZmZmKQorLyogdXNpbmcgMzItYml0IGhlcmUgaXMgc29ydCBvZiBib2d1cyAqLworI2RlZmluZSBfREJVU19JTlRfTUlOCSBfREJVU19JTlQzMl9NSU4KKyNkZWZpbmUgX0RCVVNfSU5UX01BWAkgX0RCVVNfSU5UMzJfTUFYCisjZGVmaW5lIF9EQlVTX1VJTlRfTUFYCSBfREJVU19VSU5UMzJfTUFYCisjaWZkZWYgREJVU19IQVZFX0lOVDY0CisjZGVmaW5lIF9EQlVTX0lOVDY0X01BWAkgREJVU19JTlQ2NF9DT05TVEFOVCAgKDB4N2ZmZmZmZmZmZmZmZmZmZikKKyNkZWZpbmUgX0RCVVNfVUlOVDY0X01BWCBEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHhmZmZmZmZmZmZmZmZmZmZmKQorI2VuZGlmCisjZGVmaW5lIF9EQlVTX09ORV9LSUxPQllURSAxMDI0CisjZGVmaW5lIF9EQlVTX09ORV9NRUdBQllURSAxMDI0ICogX0RCVVNfT05FX0tJTE9CWVRFCisjZGVmaW5lIF9EQlVTX09ORV9IT1VSX0lOX01JTExJU0VDT05EUyAoMTAwMCAqIDYwICogNjApCisjZGVmaW5lIF9EQlVTX1VTRUNfUEVSX1NFQ09ORCAgICAgICAgICAoMTAwMDAwMCkKKworI3VuZGVmCU1BWAorI2RlZmluZSBNQVgoYSwgYikgICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKKworI3VuZGVmCU1JTgorI2RlZmluZSBNSU4oYSwgYikgICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKworI3VuZGVmCUFCUworI2RlZmluZSBBQlMoYSkJICAgKCgoYSkgPCAwKSA/IC0oYSkgOiAoYSkpCisKKyNkZWZpbmUgX0RCVVNfSVNBU0NJSShjKSAoKGMpICE9ICdcMCcgJiYgKCgoYykgJiB+MHg3ZikgPT0gMCkpCisKK3R5cGVkZWYgdm9pZCAoKiBEQnVzRm9yZWFjaEZ1bmN0aW9uKSAodm9pZCAqZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSk7CisKK2RidXNfYm9vbF90IF9kYnVzX3NldF9mZF9ub25ibG9ja2luZyAoaW50ICAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworCit2b2lkIF9kYnVzX3ZlcmJvc2VfYnl0ZXMgICAgICAgICAgIChjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKK3ZvaWQgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKGNvbnN0IERCdXNTdHJpbmcgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgbGVuKTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKl9kYnVzX25vX21lbW9yeV9tZXNzYWdlOworI2RlZmluZSBfREJVU19TRVRfT09NKGVycm9yKSBkYnVzX3NldF9lcnJvcl9jb25zdCAoKGVycm9yKSwgREJVU19FUlJPUl9OT19NRU1PUlksIF9kYnVzX25vX21lbW9yeV9tZXNzYWdlKQorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworLyogTWVtb3J5IGRlYnVnZ2luZyAqLwordm9pZCAgICAgICAgX2RidXNfc2V0X2ZhaWxfYWxsb2NfY291bnRlciAgICAgICAgKGludCAgdW50aWxfbmV4dF9mYWlsKTsKK2ludCAgICAgICAgIF9kYnVzX2dldF9mYWlsX2FsbG9jX2NvdW50ZXIgICAgICAgICh2b2lkKTsKK3ZvaWQgICAgICAgIF9kYnVzX3NldF9mYWlsX2FsbG9jX2ZhaWx1cmVzICAgICAgIChpbnQgIGZhaWx1cmVzX3Blcl9mYWlsdXJlKTsKK2ludCAgICAgICAgIF9kYnVzX2dldF9mYWlsX2FsbG9jX2ZhaWx1cmVzICAgICAgICh2b2lkKTsKK2RidXNfYm9vbF90IF9kYnVzX2RlY3JlbWVudF9mYWlsX2FsbG9jX2NvdW50ZXIgICh2b2lkKTsKK2RidXNfYm9vbF90IF9kYnVzX2Rpc2FibGVfbWVtX3Bvb2xzICAgICAgICAgICAgICh2b2lkKTsKK2ludCAgICAgICAgIF9kYnVzX2dldF9tYWxsb2NfYmxvY2tzX291dHN0YW5kaW5nICh2b2lkKTsKKwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzVGVzdE1lbW9yeUZ1bmN0aW9uKSAgKHZvaWQgKmRhdGEpOworZGJ1c19ib29sX3QgX2RidXNfdGVzdF9vb21faGFuZGxpbmcgKGNvbnN0IGNoYXIgICAgICAgICAgICAgKmRlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUZXN0TWVtb3J5RnVuY3Rpb24gIGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAqZGF0YSk7CisjZWxzZQorI2RlZmluZSBfZGJ1c19zZXRfZmFpbF9hbGxvY19jb3VudGVyKG4pCisjZGVmaW5lIF9kYnVzX2dldF9mYWlsX2FsbG9jX2NvdW50ZXIgX0RCVVNfSU5UX01BWAorCisvKiBUaGVzZSBhcmUgY29uc3RhbnQgZXhwcmVzc2lvbnMgc28gdGhhdCBibG9ja3MKKyAqIHRoZXkgcHJvdGVjdCBzaG91bGQgYmUgb3B0aW1pemVkIGF3YXkKKyAqLworI2RlZmluZSBfZGJ1c19kZWNyZW1lbnRfZmFpbF9hbGxvY19jb3VudGVyKCkgKEZBTFNFKQorI2RlZmluZSBfZGJ1c19kaXNhYmxlX21lbV9wb29scygpICAgICAgICAgICAgKEZBTFNFKQorI2RlZmluZSBfZGJ1c19nZXRfbWFsbG9jX2Jsb2Nrc19vdXRzdGFuZGluZyAgKDApCisjZW5kaWYgLyogIURCVVNfQlVJTERfVEVTVFMgKi8KKwordHlwZWRlZiB2b2lkICgqIERCdXNTaHV0ZG93bkZ1bmN0aW9uKSAodm9pZCAqZGF0YSk7CitkYnVzX2Jvb2xfdCBfZGJ1c19yZWdpc3Rlcl9zaHV0ZG93bl9mdW5jIChEQnVzU2h1dGRvd25GdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAqZGF0YSk7CisKK2V4dGVybiBpbnQgX2RidXNfY3VycmVudF9nZW5lcmF0aW9uOworCisvKiBUaHJlYWQgaW5pdGlhbGl6ZXJzICovCisjZGVmaW5lIF9EQlVTX0xPQ0tfTkFNRShuYW1lKSAgICAgICAgICAgX2RidXNfbG9ja18jI25hbWUKKyNkZWZpbmUgX0RCVVNfREVDTEFSRV9HTE9CQUxfTE9DSyhuYW1lKSBleHRlcm4gREJ1c1JNdXRleCAqX2RidXNfbG9ja18jI25hbWUKKyNkZWZpbmUgX0RCVVNfREVGSU5FX0dMT0JBTF9MT0NLKG5hbWUpICBEQnVzUk11dGV4ICAgICAgICAqX2RidXNfbG9ja18jI25hbWUKKyNkZWZpbmUgX0RCVVNfTE9DSyhuYW1lKSAgICAgICAgICAgICAgICBfZGJ1c19ybXV0ZXhfbG9jayAgIChfZGJ1c19sb2NrXyMjbmFtZSkKKyNkZWZpbmUgX0RCVVNfVU5MT0NLKG5hbWUpICAgICAgICAgICAgICBfZGJ1c19ybXV0ZXhfdW5sb2NrIChfZGJ1c19sb2NrXyMjbmFtZSkKKworLyogMS01ICovCitfREJVU19ERUNMQVJFX0dMT0JBTF9MT0NLIChsaXN0KTsKK19EQlVTX0RFQ0xBUkVfR0xPQkFMX0xPQ0sgKGNvbm5lY3Rpb25fc2xvdHMpOworX0RCVVNfREVDTEFSRV9HTE9CQUxfTE9DSyAocGVuZGluZ19jYWxsX3Nsb3RzKTsKK19EQlVTX0RFQ0xBUkVfR0xPQkFMX0xPQ0sgKHNlcnZlcl9zbG90cyk7CitfREJVU19ERUNMQVJFX0dMT0JBTF9MT0NLIChtZXNzYWdlX3Nsb3RzKTsKKy8qIDUtMTAgKi8KK19EQlVTX0RFQ0xBUkVfR0xPQkFMX0xPQ0sgKGJ1cyk7CitfREJVU19ERUNMQVJFX0dMT0JBTF9MT0NLIChidXNfZGF0YXMpOworX0RCVVNfREVDTEFSRV9HTE9CQUxfTE9DSyAoc2h1dGRvd25fZnVuY3MpOworX0RCVVNfREVDTEFSRV9HTE9CQUxfTE9DSyAoc3lzdGVtX3VzZXJzKTsKK19EQlVTX0RFQ0xBUkVfR0xPQkFMX0xPQ0sgKG1lc3NhZ2VfY2FjaGUpOworLyogMTAtMTQgKi8KK19EQlVTX0RFQ0xBUkVfR0xPQkFMX0xPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucyk7CitfREJVU19ERUNMQVJFX0dMT0JBTF9MT0NLICh3aW5fZmRzKTsKK19EQlVTX0RFQ0xBUkVfR0xPQkFMX0xPQ0sgKHNpZF9hdG9tX2NhY2hlKTsKK19EQlVTX0RFQ0xBUkVfR0xPQkFMX0xPQ0sgKG1hY2hpbmVfdXVpZCk7CisKKyNpZiAhREJVU19VU0VfU1lOQworX0RCVVNfREVDTEFSRV9HTE9CQUxfTE9DSyAoYXRvbWljKTsKKyNkZWZpbmUgX0RCVVNfTl9HTE9CQUxfTE9DS1MgKDE1KQorI2Vsc2UKKyNkZWZpbmUgX0RCVVNfTl9HTE9CQUxfTE9DS1MgKDE0KQorI2VuZGlmCisKK2RidXNfYm9vbF90IF9kYnVzX3RocmVhZHNfaW5pdF9kZWJ1ZyAodm9pZCk7CisKK2RidXNfYm9vbF90ICAgX2RidXNfYWRkcmVzc19hcHBlbmRfZXNjYXBlZCAoREJ1c1N0cmluZyAgICAgICAqZXNjYXBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqdW5lc2NhcGVkKTsKKwordm9pZCAgICAgICAgICBfZGJ1c19zZXRfYmFkX2FkZHJlc3MgICAgICAgIChEQnVzRXJyb3IgICAgICAgICAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICphZGRyZXNzX3Byb2JsZW1fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmFkZHJlc3NfcHJvYmxlbV9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmFkZHJlc3NfcHJvYmxlbV9vdGhlcik7CisKKyNkZWZpbmUgREJVU19VVUlEX0xFTkdUSF9CWVRFUyAxNgorI2RlZmluZSBEQlVTX1VVSURfTEVOR1RIX1dPUkRTIChEQlVTX1VVSURfTEVOR1RIX0JZVEVTIC8gNCkKKyNkZWZpbmUgREJVU19VVUlEX0xFTkdUSF9IRVggICAoREJVU19VVUlEX0xFTkdUSF9CWVRFUyAqIDIpCisKKy8qKgorICogQSBnbG9iYWxseSB1bmlxdWUgSUQgOyB3ZSBoYXZlIG9uZSBmb3IgZWFjaCBEQnVzU2VydmVyLCBhbmQgYWxzbyBvbmUgZm9yIGVhY2gKKyAqIG1hY2hpbmUgd2l0aCBsaWJkYnVzIGluc3RhbGxlZCBvbiBpdC4KKyAqLwordW5pb24gREJ1c0dVSUQKK3sKKyAgZGJ1c191aW50MzJfdCBhc191aW50MzJzW0RCVVNfVVVJRF9MRU5HVEhfV09SRFNdOyAgICAgLyoqPCBndWlkIGFzIGZvdXIgdWludDMyIHZhbHVlcyAqLworICBjaGFyIGFzX2J5dGVzW0RCVVNfVVVJRF9MRU5HVEhfQllURVNdOyAgICAgICAgICAgICAgICAvKio8IGd1aWQgYXMgMTYgc2luZ2xlLWJ5dGUgdmFsdWVzICovCit9OworCit2b2lkICAgICAgICBfZGJ1c19nZW5lcmF0ZV91dWlkICAoREJ1c0dVSUQgICAgICAgICAqdXVpZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c191dWlkX2VuY29kZSAgICAoY29uc3QgREJ1c0dVSUQgICAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICplbmNvZGVkKTsKK2RidXNfYm9vbF90IF9kYnVzX3JlYWRfdXVpZF9maWxlIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzR1VJRCAgICAgICAgICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGNyZWF0ZV9pZl9ub3RfZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19nZXRfbG9jYWxfbWFjaGluZV91dWlkX2VuY29kZWQgKERCdXNTdHJpbmcgKnV1aWRfc3RyKTsKKworI2RlZmluZSBfREJVU19QQVNURTIoYSwgYikgYSAjIyBiCisjZGVmaW5lIF9EQlVTX1BBU1RFKGEsIGIpIF9EQlVTX1BBU1RFMiAoYSwgYikKKyNkZWZpbmUgX0RCVVNfU1RBVElDX0FTU0VSVChleHByKSBcCisgIHR5cGVkZWYgc3RydWN0IHsgY2hhciBfYXNzZXJ0aW9uWyhleHByKSA/IDEgOiAtMV07IH0gXAorICBfREJVU19QQVNURSAoX0RCVVNfU1RBVElDX0FTU0VSVF8sIF9fTElORV9fKQorCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19JTlRFUk5BTFNfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMta2V5cmluZy5jIGIvZGJ1cy9kYnVzL2RidXMta2V5cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiOWNlMzEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1rZXlyaW5nLmMKQEAgLTAsMCArMSwxMTYwIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMta2V5cmluZy5jIFN0b3JlIHNlY3JldCBjb29raWVzIGluIHlvdXIgaG9tZWRpcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWtleXJpbmcuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0tleXJpbmcga2V5cmluZyBjbGFzcworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBEQnVzS2V5cmluZyBkYXRhIHN0cnVjdHVyZQorICoKKyAqIFR5cGVzIGFuZCBmdW5jdGlvbnMgcmVsYXRlZCB0byBEQnVzS2V5cmluZy4gREJ1c0tleXJpbmcgaXMgaW50ZW5kZWQKKyAqIHRvIG1hbmFnZSBjb29raWVzIHVzZWQgdG8gYXV0aGVudGljYXRlIGNsaWVudHMgdG8gc2VydmVycy4gIFRoaXMgaXMKKyAqIGVzc2VudGlhbGx5IHRoZSAidmVyaWZ5IHRoYXQgY2xpZW50IGNhbiByZWFkIHRoZSB1c2VyJ3MgaG9tZWRpciIKKyAqIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbS4gIEJvdGggY2xpZW50IGFuZCBzZXJ2ZXIgbXVzdCBoYXZlIGFjY2VzcworICogdG8gdGhlIGhvbWVkaXIuCisgKgorICogVGhlIHNlY3JldCBrZXlzIGFyZSBub3Qga2VwdCBpbiBsb2NrZWQgbWVtb3J5LCBhbmQgYXJlIHdyaXR0ZW4gdG8gYQorICogZmlsZSBpbiB0aGUgdXNlcidzIGhvbWVkaXIuIEhvd2V2ZXIgdGhleSBhcmUgdHJhbnNpZW50IChvbmx5IHVzZWQKKyAqIGJ5IGEgc2luZ2xlIHNlcnZlciBpbnN0YW5jZSBmb3IgYSBmaXhlZCBwZXJpb2Qgb2YgdGltZSwgdGhlbgorICogZGlzY2FyZGVkKS4gQWxzbywgdGhlIGtleXMgYXJlIG5vdCBzZW50IG92ZXIgdGhlIHdpcmUuCisgKgorICogQHRvZG8gdGhlcmUncyBhIG1lbW9yeSBsZWFrIG9uIHNvbWUgY29kZXBhdGggaW4gaGVyZSwgSSBzYXcgaXQgb25jZQorICogd2hlbiBydW5uaW5nIG1ha2UgY2hlY2sgLSBwcm9iYWJseSBzb21lIHNwZWNpZmljIGluaXRpYWwgY29va2llcworICogcHJlc2VudCBpbiB0aGUgY29va2llIGZpbGUsIHRoZW4gZGVwZW5kaW5nIG9uIHdoYXQgd2UgZG8gd2l0aCB0aGVtLgorICovCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNLZXlyaW5nSW50ZXJuYWxzIERCdXNLZXlyaW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgREJ1c0tleXJpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscworICoKKyAqIFRoZSBndXRzIG9mIERCdXNLZXlyaW5nLgorICoKKyAqIEB7CisgKi8KKworLyoqIFRoZSBtYXhpbXVtIGFnZSBvZiBhIGtleSBiZWZvcmUgd2UgY3JlYXRlIGEgbmV3IGtleSB0byB1c2UgaW4KKyAqIGNoYWxsZW5nZXMuICBUaGlzIGlzbid0IHN1cGVyLXJlbGlhYmx5IGVuZm9yY2VkLCBzaW5jZSBzeXN0ZW0KKyAqIGNsb2NrcyBjYW4gY2hhbmdlIG9yIGJlIHdyb25nLCBidXQgd2UgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIG9ubHkKKyAqIHVzZSBrZXlzIGZvciBhIHNob3J0IHRpbWUuCisgKi8KKyNkZWZpbmUgTkVXX0tFWV9USU1FT1VUX1NFQ09ORFMgICAgICg2MCo1KQorLyoqCisgKiBUaGUgdGltZSBhZnRlciB3aGljaCB3ZSBkcm9wIGEga2V5IGZyb20gdGhlIHNlY3JldHMgZmlsZS4KKyAqIFRoZSBFWFBJUkVfS0VZU19USU1FT1VUX1NFQ09ORFMgLSBORVdfS0VZX1RJTUVPVVRfU0VDT05EUyBpcyB0aGUgbWluaW11bQorICogdGltZSB3aW5kb3cgYSBjbGllbnQgaGFzIHRvIGNvbXBsZXRlIGF1dGhlbnRpY2F0aW9uLgorICovCisjZGVmaW5lIEVYUElSRV9LRVlTX1RJTUVPVVRfU0VDT05EUyAoTkVXX0tFWV9USU1FT1VUX1NFQ09ORFMgKyAoNjAqMikpCisvKioKKyAqIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIGEga2V5IGNhbiBiZSBpbiB0aGUgZnV0dXJlLgorICovCisjZGVmaW5lIE1BWF9USU1FX1RSQVZFTF9TRUNPTkRTICg2MCo1KQorCisvKioKKyAqIE1heGltdW0gbnVtYmVyIG9mIGtleXMgaW4gdGhlIGtleXJpbmcgYmVmb3JlCisgKiB3ZSBqdXN0IGlnbm9yZSB0aGUgcmVzdAorICovCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworI2RlZmluZSBNQVhfS0VZU19JTl9GSUxFIDEwCisjZWxzZQorI2RlZmluZSBNQVhfS0VZU19JTl9GSUxFIDI1NgorI2VuZGlmCisKKy8qKgorICogQSBzaW5nbGUga2V5IGZyb20gdGhlIGNvb2tpZSBmaWxlCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIGRidXNfaW50MzJfdCBpZDsgLyoqPCBpZGVudGlmaWVyIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGtleSAqLworCisgIGxvbmcgY3JlYXRpb25fdGltZTsgLyoqPCB3aGVuIHRoZSBrZXkgd2FzIGdlbmVyYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgKiAgIGFzIHVuaXggdGltZXN0YW1wLiBzaWduZWQgbG9uZworICAgICAgICAgICAgICAgICAgICAgICAqICAgbWF0Y2hlcyBzdHJ1Y3QgdGltZXZhbC4KKyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgCisgIERCdXNTdHJpbmcgc2VjcmV0OyAvKio8IHRoZSBhY3R1YWwga2V5ICovCisKK30gREJ1c0tleTsKKworLyoqCisgKiBAYnJpZWYgSW50ZXJuYWxzIG9mIERCdXNLZXlyaW5nLgorICogCisgKiBEQnVzS2V5cmluZyBpbnRlcm5hbHMuIERCdXNLZXlyaW5nIGlzIGFuIG9wYXF1ZSBvYmplY3QsIGl0IG11c3QgYmUKKyAqIHVzZWQgdmlhIGFjY2Vzc29yIGZ1bmN0aW9ucy4KKyAqLworc3RydWN0IERCdXNLZXlyaW5nCit7CisgIGludCByZWZjb3VudDsgICAgICAgICAgICAgLyoqPCBSZWZlcmVuY2UgY291bnQgKi8KKyAgREJ1c1N0cmluZyBkaXJlY3Rvcnk7ICAgICAvKio8IERpcmVjdG9yeSB0aGUgYmVsb3cgdHdvIGl0ZW1zIGFyZSBpbnNpZGUgKi8KKyAgREJ1c1N0cmluZyBmaWxlbmFtZTsgICAgICAvKio8IEtleXJpbmcgZmlsZW5hbWUgKi8KKyAgREJ1c1N0cmluZyBmaWxlbmFtZV9sb2NrOyAvKio8IE5hbWUgb2YgbG9ja2ZpbGUgKi8KKyAgREJ1c0tleSAqa2V5czsgLyoqPCBLZXlzIGxvYWRlZCBmcm9tIHRoZSBmaWxlICovCisgIGludCBuX2tleXM7ICAgIC8qKjwgTnVtYmVyIG9mIGtleXMgKi8KKyAgREJ1c0NyZWRlbnRpYWxzICpjcmVkZW50aWFsczsgLyoqPCBDcmVkZW50aWFscyBjb250YWluaW5nIHVzZXIgdGhlIGtleXJpbmcgaXMgZm9yICovCit9OworCitzdGF0aWMgREJ1c0tleXJpbmcqCitfZGJ1c19rZXlyaW5nX25ldyAodm9pZCkKK3sKKyAgREJ1c0tleXJpbmcgKmtleXJpbmc7CisKKyAga2V5cmluZyA9IGRidXNfbmV3MCAoREJ1c0tleXJpbmcsIDEpOworICBpZiAoa2V5cmluZyA9PSBOVUxMKQorICAgIGdvdG8gb3V0XzA7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgma2V5cmluZy0+ZGlyZWN0b3J5KSkKKyAgICBnb3RvIG91dF8xOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZrZXlyaW5nLT5maWxlbmFtZSkpCisgICAgZ290byBvdXRfMjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgma2V5cmluZy0+ZmlsZW5hbWVfbG9jaykpCisgICAgZ290byBvdXRfMzsKKyAgCisgIGtleXJpbmctPnJlZmNvdW50ID0gMTsKKyAga2V5cmluZy0+a2V5cyA9IE5VTEw7CisgIGtleXJpbmctPm5fa2V5cyA9IDA7CisKKyAgcmV0dXJuIGtleXJpbmc7CisKKyBvdXRfMzoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZrZXlyaW5nLT5maWxlbmFtZSk7Cisgb3V0XzI6CisgIF9kYnVzX3N0cmluZ19mcmVlICgma2V5cmluZy0+ZGlyZWN0b3J5KTsKKyBvdXRfMToKKyAgZGJ1c19mcmVlIChrZXlyaW5nKTsKKyBvdXRfMDoKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX2tleXMgKERCdXNLZXkgKmtleXMsCisgICAgICAgICAgIGludCAgICAgIG5fa2V5cykKK3sKKyAgaW50IGk7CisKKyAgLyogc2hvdWxkIGJlIHNhZmUgZm9yIGFyZ3MgTlVMTCwgMCAqLworICAKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbl9rZXlzKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgma2V5c1tpXS5zZWNyZXQpOworICAgICAgKytpOworICAgIH0KKworICBkYnVzX2ZyZWUgKGtleXMpOworfQorCisvKiBPdXIgbG9ja2luZyBzY2hlbWUgaXMgaGlnaGx5IHVucmVsaWFibGUuICBIb3dldmVyLCB0aGVyZSBpcworICogdW5mb3J0dW5hdGVseSBubyByZWxpYWJsZSBsb2NraW5nIHNjaGVtZSBpbiB1c2VyIGhvbWUgZGlyZWN0b3JpZXM7CisgKiBiZXR3ZWVuIGJ1Z3MgaW4gTGludXggTkZTLCBwZW9wbGUgdXNpbmcgVHJ1NjQgb3Igb3RoZXIgdG90YWwgY3JhcAorICogTkZTLCBBRlMsIHJhbmRvbS1maWxlLXN5c3RlbS1vZi10aGUtd2VlaywgYW5kIHNvIGZvcnRoLCBmY250bCgpIGluCisgKiBob21lZGlycyBzaW1wbHkgZ2VuZXJhdGVzIHRvbnMgb2YgYnVnIHJlcG9ydHMuIFRoaXMgaGFzIGJlZW4KKyAqIGxlYXJuZWQgdGhyb3VnaCBoYXJkIGV4cGVyaWVuY2Ugd2l0aCBHQ29uZiwgdW5mb3J0dW5hdGVseS4KKyAqCisgKiBUaGlzIGJhZCBoYWNrIG1pZ2h0IHdvcmsgYmV0dGVyIGZvciB0aGUga2luZCBvZiBsb2NrIHdlIGhhdmUgaGVyZSwKKyAqIHdoaWNoIHdlIGRvbid0IGV4cGVjdCB0byBob2xkIGZvciBhbnkgbGVuZ3RoIG9mIHRpbWUuICBDcmFzaGluZworICogd2hpbGUgd2UgaG9sZCBpdCBzaG91bGQgYmUgdW5saWtlbHksIGFuZCB0aW1pbmcgb3V0IHN1Y2ggdGhhdCB3ZQorICogZGVsZXRlIGEgc3RhbGUgbG9jayBzaG91bGQgYWxzbyBiZSB1bmxpa2VseSBleGNlcHQgd2hlbiB0aGUKKyAqIGZpbGVzeXN0ZW0gaXMgcnVubmluZyByZWFsbHkgc2xvd2x5LiAgU3R1ZmYgbWlnaHQgYnJlYWsgaW4gY29ybmVyCisgKiBjYXNlcyBidXQgYXMgbG9uZyBhcyBpdCdzIG5vdCBhIHNlY3VyaXR5LWxldmVsIGJyZWFrYWdlIGl0IHNob3VsZAorICogYmUgT0suCisgKi8KKworLyoqIE1heGltdW0gbnVtYmVyIG9mIHRpbWVvdXRzIHdhaXRpbmcgZm9yIGxvY2sgYmVmb3JlIHdlIGRlY2lkZSBpdCdzIHN0YWxlICovCisjZGVmaW5lIE1BWF9MT0NLX1RJTUVPVVRTIDMyCisvKiogTGVuZ3RoIG9mIGVhY2ggdGltZW91dCB3aGlsZSB3YWl0aW5nIGZvciBhIGxvY2sgKi8KKyNkZWZpbmUgTE9DS19USU1FT1VUX01JTExJU0VDT05EUyAyNTAKKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19rZXlyaW5nX2xvY2sgKERCdXNLZXlyaW5nICprZXlyaW5nKQoreworICBpbnQgbl90aW1lb3V0czsKKyAgCisgIG5fdGltZW91dHMgPSAwOworICB3aGlsZSAobl90aW1lb3V0cyA8IE1BWF9MT0NLX1RJTUVPVVRTKQorICAgIHsKKyAgICAgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKworICAgICAgaWYgKF9kYnVzX2NyZWF0ZV9maWxlX2V4Y2x1c2l2ZWx5ICgma2V5cmluZy0+ZmlsZW5hbWVfbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJEaWQgbm90IGdldCBsb2NrIGZpbGUsIHNsZWVwaW5nICVkIG1pbGxpc2Vjb25kcyAoJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICAgTE9DS19USU1FT1VUX01JTExJU0VDT05EUywgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgICAgIF9kYnVzX3NsZWVwX21pbGxpc2Vjb25kcyAoTE9DS19USU1FT1VUX01JTExJU0VDT05EUyk7CisgICAgICAKKyAgICAgICsrbl90aW1lb3V0czsKKyAgICB9CisKKyAgaWYgKG5fdGltZW91dHMgPT0gTUFYX0xPQ0tfVElNRU9VVFMpCisgICAgeworICAgICAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworCisgICAgICBfZGJ1c192ZXJib3NlICgiTG9jayBmaWxlIHRpbWVkIG91dCAlZCB0aW1lcywgYXNzdW1pbmcgc3RhbGVcbiIsCisgICAgICAgICAgICAgICAgICAgICBuX3RpbWVvdXRzKTsKKworICAgICAgaWYgKCFfZGJ1c19kZWxldGVfZmlsZSAoJmtleXJpbmctPmZpbGVuYW1lX2xvY2ssICZlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiQ291bGRuJ3QgZGVsZXRlIG9sZCBsb2NrIGZpbGU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19jcmVhdGVfZmlsZV9leGNsdXNpdmVseSAoJmtleXJpbmctPmZpbGVuYW1lX2xvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkNvdWxkbid0IGNyZWF0ZSBsb2NrIGZpbGUgYWZ0ZXIgZGVsZXRpbmcgc3RhbGUgb25lOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitfZGJ1c19rZXlyaW5nX3VubG9jayAoREJ1c0tleXJpbmcgKmtleXJpbmcpCit7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKworICBpZiAoIV9kYnVzX2RlbGV0ZV9maWxlICgma2V5cmluZy0+ZmlsZW5hbWVfbG9jaywgJmVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIGRlbGV0ZSBsb2NrIGZpbGU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgfQorfQorCitzdGF0aWMgREJ1c0tleSoKK2ZpbmRfa2V5X2J5X2lkIChEQnVzS2V5ICprZXlzLAorICAgICAgICAgICAgICAgIGludCAgICAgIG5fa2V5cywKKyAgICAgICAgICAgICAgICBpbnQgICAgICBpZCkKK3sKKyAgaW50IGk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbl9rZXlzKQorICAgIHsKKyAgICAgIGlmIChrZXlzW2ldLmlkID09IGlkKQorICAgICAgICByZXR1cm4gJmtleXNbaV07CisgICAgICAKKyAgICAgICsraTsKKyAgICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWRkX25ld19rZXkgKERCdXNLZXkgICoqa2V5c19wLAorICAgICAgICAgICAgIGludCAgICAgICAqbl9rZXlzX3AsCisgICAgICAgICAgICAgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgREJ1c0tleSAqbmV3OworICBEQnVzU3RyaW5nIGJ5dGVzOworICBpbnQgaWQ7CisgIGxvbmcgdGltZXN0YW1wOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpzOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNLZXkgKmtleXM7CisgIGludCBuX2tleXM7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYnl0ZXMpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBrZXlzID0gKmtleXNfcDsKKyAgbl9rZXlzID0gKm5fa2V5c19wOworICByZXR2YWwgPSBGQUxTRTsKKyAgICAgIAorICAvKiBHZW5lcmF0ZSBhbiBpbnRlZ2VyIElEIGFuZCB0aGVuIHRoZSBhY3R1YWwga2V5LiAqLworIHJldHJ5OgorICAgICAgCisgIGlmICghX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2J5dGVzICgmYnl0ZXMsIDQpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHMgPSAoY29uc3QgdW5zaWduZWQgY2hhciopIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmJ5dGVzKTsKKyAgICAgIAorICBpZCA9IHNbMF0gfCAoc1sxXSA8PCA4KSB8IChzWzJdIDw8IDE2KSB8IChzWzNdIDw8IDI0KTsKKyAgaWYgKGlkIDwgMCkKKyAgICBpZCA9IC0gaWQ7CisgIF9kYnVzX2Fzc2VydCAoaWQgPj0gMCk7CisKKyAgaWYgKGZpbmRfa2V5X2J5X2lkIChrZXlzLCBuX2tleXMsIGlkKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmYnl0ZXMsIDApOworICAgICAgX2RidXNfdmVyYm9zZSAoIktleSBJRCAlZCBhbHJlYWR5IGV4aXN0ZWQsIHRyeWluZyBhbm90aGVyIG9uZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGlkKTsKKyAgICAgIGdvdG8gcmV0cnk7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJDcmVhdGluZyBrZXkgd2l0aCBJRCAlZFxuIiwgaWQpOworICAgICAgCisjZGVmaW5lIEtFWV9MRU5HVEhfQllURVMgMjQKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZieXRlcywgMCk7CisgIGlmICghX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2J5dGVzICgmYnl0ZXMsIEtFWV9MRU5HVEhfQllURVMpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIG5ldyA9IGRidXNfcmVhbGxvYyAoa2V5cywgc2l6ZW9mIChEQnVzS2V5KSAqIChuX2tleXMgKyAxKSk7CisgIGlmIChuZXcgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBrZXlzID0gbmV3OworICAqa2V5c19wID0ga2V5czsgLyogb3RoZXJ3aXNlICprZXlzX3AgZW5kcyB1cCBpbnZhbGlkICovCisgIG5fa2V5cyArPSAxOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZrZXlzW25fa2V5cy0xXS5zZWNyZXQpKQorICAgIHsKKyAgICAgIG5fa2V5cyAtPSAxOyAvKiB3ZSBkb24ndCB3YW50IHRvIGZyZWUgdGhlIG9uZSB3ZSBkaWRuJ3QgaW5pdCAqLworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgX2RidXNfZ2V0X3JlYWxfdGltZSAoJnRpbWVzdGFtcCwgTlVMTCk7CisgICAgICAKKyAga2V5c1tuX2tleXMtMV0uaWQgPSBpZDsKKyAga2V5c1tuX2tleXMtMV0uY3JlYXRpb25fdGltZSA9IHRpbWVzdGFtcDsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbW92ZSAoJmJ5dGVzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5c1tuX2tleXMtMV0uc2VjcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAwKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgma2V5c1tuX2tleXMtMV0uc2VjcmV0KTsKKyAgICAgIG5fa2V5cyAtPSAxOworICAgICAgZ290byBvdXQ7CisgICAgfQorICAKKyAgcmV0dmFsID0gVFJVRTsKKyAgCisgb3V0OgorICAqbl9rZXlzX3AgPSBuX2tleXM7CisgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmJ5dGVzKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBSZWxvYWRzIHRoZSBrZXlyaW5nIGZpbGUsIG9wdGlvbmFsbHkgYWRkcyBvbmUgbmV3IGtleSB0byB0aGUgZmlsZSwKKyAqIHJlbW92ZXMgYWxsIGV4cGlyZWQga2V5cyBmcm9tIHRoZSBmaWxlIGlmZiBhIGtleSB3YXMgYWRkZWQsIHRoZW4KKyAqIHJlc2F2ZXMgdGhlIGZpbGUuICBTdG9yZXMgdGhlIGtleXMgZnJvbSB0aGUgZmlsZSBpbiBrZXlyaW5nLT5rZXlzLgorICogTm90ZSB0aGF0IHRoZSBmaWxlIGlzIG9ubHkgcmVzYXZlZCAod3JpdHRlbiB0bykgaWYgYSBrZXkgaXMgYWRkZWQsCisgKiB0aGlzIG1lYW5zIHRoYXQgb25seSBzZXJ2ZXJzIGV2ZXIgd3JpdGUgdG8gdGhlIGZpbGUgYW5kIG5lZWQgdG8KKyAqIGxvY2sgaXQsIHdoaWNoIGF2b2lkcyBhIGxvdCBvZiBsb2NrIGNvbnRlbnRpb24gYXQgbG9naW4gdGltZSBhbmQKKyAqIHN1Y2guCisgKgorICogQHBhcmFtIGtleXJpbmcgdGhlIGtleXJpbmcKKyAqIEBwYXJhbSBhZGRfbmV3ICNUUlVFIHRvIGFkZCBhIG5ldyBrZXkgdG8gdGhlIGZpbGUsIGV4cGlyZSBrZXlzLCBhbmQgcmVzYXZlCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvcnMKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfa2V5cmluZ19yZWxvYWQgKERCdXNLZXlyaW5nICprZXlyaW5nLAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICBhZGRfbmV3LAorICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBjb250ZW50czsKKyAgREJ1c1N0cmluZyBsaW5lOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGRidXNfYm9vbF90IGhhdmVfbG9jazsKKyAgREJ1c0tleSAqa2V5czsKKyAgaW50IG5fa2V5czsKKyAgaW50IGk7CisgIGxvbmcgbm93OworICBEQnVzRXJyb3IgdG1wX2Vycm9yOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAgaWYgKCFfZGJ1c19jaGVja19kaXJfaXNfcHJpdmF0ZV90b191c2VyICgma2V5cmluZy0+ZGlyZWN0b3J5LCBlcnJvcikpCisgICAgcmV0dXJuIEZBTFNFOworICAgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmY29udGVudHMpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmbGluZSkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbnRlbnRzKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAKKyAga2V5cyA9IE5VTEw7CisgIG5fa2V5cyA9IDA7CisgIHJldHZhbCA9IEZBTFNFOworICBoYXZlX2xvY2sgPSBGQUxTRTsKKworICBfZGJ1c19nZXRfcmVhbF90aW1lICgmbm93LCBOVUxMKTsKKyAgCisgIGlmIChhZGRfbmV3KQorICAgIHsKKyAgICAgIGlmICghX2RidXNfa2V5cmluZ19sb2NrIChrZXlyaW5nKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgbG9jayBrZXlyaW5nIGZpbGUgdG8gYWRkIHRvIGl0Iik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaGF2ZV9sb2NrID0gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmdG1wX2Vycm9yKTsKKyAgaWYgKCFfZGJ1c19maWxlX2dldF9jb250ZW50cyAoJmNvbnRlbnRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleXJpbmctPmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wX2Vycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGxvYWQga2V5cmluZyBmaWxlOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHRtcF9lcnJvci5tZXNzYWdlKTsKKyAgICAgIC8qIGNvbnRpbnVlIHdpdGggZW1wdHkga2V5cmluZyBmaWxlLCBzbyB3ZSByZWNyZWF0ZSBpdCAqLworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmdG1wX2Vycm9yKTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfdmFsaWRhdGVfYXNjaWkgKCZjb250ZW50cywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmY29udGVudHMpKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiU2VjcmV0IGtleXJpbmcgZmlsZSBjb250YWlucyBub24tQVNDSUkhIElnbm9yaW5nIGV4aXN0aW5nIGNvbnRlbnRzXG4iKTsKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmY29udGVudHMsIDApOworICAgIH0KKworICAvKiBGSVhNRSB0aGlzIGlzIGJhZGx5IGluZWZmaWNpZW50IGZvciBsYXJnZSBrZXlyaW5nIGZpbGVzCisgICAqIChub3QgdGhhdCBsYXJnZSBrZXlyaW5nIGZpbGVzIGV4aXN0IG91dHNpZGUgb2YgdGVzdCBzdWl0ZXMpCisgICAqLworICB3aGlsZSAoX2RidXNfc3RyaW5nX3BvcF9saW5lICgmY29udGVudHMsICZsaW5lKSkKKyAgICB7CisgICAgICBpbnQgbmV4dDsKKyAgICAgIGxvbmcgdmFsOworICAgICAgaW50IGlkOworICAgICAgbG9uZyB0aW1lc3RhbXA7CisgICAgICBpbnQgbGVuOworICAgICAgaW50IGVuZDsKKyAgICAgIERCdXNLZXkgKm5ldzsKKworICAgICAgLyogRG9uJ3QgbG9hZCBtb3JlIHRoYW4gdGhlIG1heC4gKi8KKyAgICAgIGlmIChuX2tleXMgPj0gKGFkZF9uZXcgPyBNQVhfS0VZU19JTl9GSUxFIC0gMSA6IE1BWF9LRVlTX0lOX0ZJTEUpKQorICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgbmV4dCA9IDA7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19wYXJzZV9pbnQgKCZsaW5lLCAwLCAmdmFsLCAmbmV4dCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiY291bGQgbm90IHBhcnNlIHNlY3JldCBrZXkgSUQgYXQgc3RhcnQgb2YgbGluZVxuIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgaWYgKHZhbCA+IF9EQlVTX0lOVDMyX01BWCB8fCB2YWwgPCAwKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoImludmFsaWQgc2VjcmV0IGtleSBJRCBhdCBzdGFydCBvZiBsaW5lXG4iKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBpZCA9IHZhbDsKKworICAgICAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgKCZsaW5lLCBuZXh0LCAmbmV4dCk7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX3BhcnNlX2ludCAoJmxpbmUsIG5leHQsICZ0aW1lc3RhbXAsICZuZXh0KSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb3VsZCBub3QgcGFyc2Ugc2VjcmV0IGtleSB0aW1lc3RhbXBcbiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIGlmICh0aW1lc3RhbXAgPCAwIHx8CisgICAgICAgICAgKG5vdyArIE1BWF9USU1FX1RSQVZFTF9TRUNPTkRTKSA8IHRpbWVzdGFtcCB8fAorICAgICAgICAgIChub3cgLSBFWFBJUkVfS0VZU19USU1FT1VUX1NFQ09ORFMpID4gdGltZXN0YW1wKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoImRyb3BwaW5nL2lnbm9yaW5nICVsZC1zZWNvbmRzIG9sZCBrZXkgd2l0aCB0aW1lc3RhbXAgJWxkIGFzIGN1cnJlbnQgdGltZSBpcyAlbGRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbm93IC0gdGltZXN0YW1wLCB0aW1lc3RhbXAsIG5vdyk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgKCZsaW5lLCBuZXh0LCAmbmV4dCk7CisKKyAgICAgIGxlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbGluZSk7CisKKyAgICAgIGlmICgobGVuIC0gbmV4dCkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJubyBzZWNyZXQga2V5IGFmdGVyIElEIGFuZCB0aW1lc3RhbXBcbiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAKKyAgICAgIC8qIFdlIGhhdmUgYWxsIHRocmVlIHBhcnRzICovCisgICAgICBuZXcgPSBkYnVzX3JlYWxsb2MgKGtleXMsIHNpemVvZiAoREJ1c0tleSkgKiAobl9rZXlzICsgMSkpOworICAgICAgaWYgKG5ldyA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAga2V5cyA9IG5ldzsKKyAgICAgIG5fa2V5cyArPSAxOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgma2V5c1tuX2tleXMtMV0uc2VjcmV0KSkKKyAgICAgICAgeworICAgICAgICAgIG5fa2V5cyAtPSAxOyAvKiB3ZSBkb24ndCB3YW50IHRvIGZyZWUgdGhlIG9uZSB3ZSBkaWRuJ3QgaW5pdCAqLworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAKKyAgICAgIGtleXNbbl9rZXlzLTFdLmlkID0gaWQ7CisgICAgICBrZXlzW25fa2V5cy0xXS5jcmVhdGlvbl90aW1lID0gdGltZXN0YW1wOworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2RlY29kZSAoJmxpbmUsIG5leHQsICZlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5c1tuX2tleXMtMV0uc2VjcmV0LCAwKSkKKwl7CisJICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbGluZSkgIT0gZW5kKQorCXsKKwkgIF9kYnVzX3ZlcmJvc2UgKCJpbnZhbGlkIGhleCBlbmNvZGluZyBpbiBrZXlyaW5nIGZpbGVcbiIpOworCSAgX2RidXNfc3RyaW5nX2ZyZWUgKCZrZXlzW25fa2V5cyAtIDFdLnNlY3JldCk7CisJICBuX2tleXMgLT0gMTsKKwkgIGNvbnRpbnVlOworCX0KKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIlN1Y2Nlc3NmdWxseSBsb2FkZWQgJWQgZXhpc3Rpbmcga2V5c1xuIiwKKyAgICAgICAgICAgICAgICAgbl9rZXlzKTsKKworICBpZiAoYWRkX25ldykKKyAgICB7CisgICAgICBpZiAoIWFkZF9uZXdfa2V5ICgma2V5cywgJm5fa2V5cywgZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBnZW5lcmF0ZSBuZXcga2V5OiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA/IGVycm9yLT5tZXNzYWdlIDogIih1bmtub3duKSIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmY29udGVudHMsIDApOworCisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChpIDwgbl9rZXlzKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2ludCAoJmNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXNbaV0uaWQpKQorICAgICAgICAgICAgZ290byBub21lbTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmY29udGVudHMsICcgJykpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2ludCAoJmNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXNbaV0uY3JlYXRpb25fdGltZSkpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZjb250ZW50cywgJyAnKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19oZXhfZW5jb2RlICgma2V5c1tpXS5zZWNyZXQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmY29udGVudHMpKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJmNvbnRlbnRzLCAnXG4nKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07ICAgICAgICAgIAorICAgICAgICAgIAorICAgICAgICAgICsraTsKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBub21lbToKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19zYXZlX3RvX2ZpbGUgKCZjb250ZW50cywgJmtleXJpbmctPmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgZXJyb3IpKQorICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKGtleXJpbmctPmtleXMpCisgICAgZnJlZV9rZXlzIChrZXlyaW5nLT5rZXlzLCBrZXlyaW5nLT5uX2tleXMpOworICBrZXlyaW5nLT5rZXlzID0ga2V5czsKKyAga2V5cmluZy0+bl9rZXlzID0gbl9rZXlzOworICBrZXlzID0gTlVMTDsKKyAgbl9rZXlzID0gMDsKKyAgCisgIHJldHZhbCA9IFRSVUU7ICAKKyAgCisgb3V0OgorICBpZiAoaGF2ZV9sb2NrKQorICAgIF9kYnVzX2tleXJpbmdfdW5sb2NrIChrZXlyaW5nKTsKKyAgCisgIGlmICghICgocmV0dmFsID09IFRSVUUgJiYgKGVycm9yID09IE5VTEwgfHwgZXJyb3ItPm5hbWUgPT0gTlVMTCkpIHx8CisgICAgICAgICAocmV0dmFsID09IEZBTFNFICYmIChlcnJvciA9PSBOVUxMIHx8IGVycm9yLT5uYW1lICE9IE5VTEwpKSkpCisgICAgeworICAgICAgaWYgKGVycm9yICYmIGVycm9yLT5uYW1lKQorICAgICAgICBfZGJ1c192ZXJib3NlICgiZXJyb3IgaXMgJXM6ICVzXG4iLCBlcnJvci0+bmFtZSwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgX2RidXNfd2FybiAoInJldHVybmluZyAlZCBidXQgZXJyb3IgcG9pbnRlciAlcCBuYW1lICVzXG4iLAorICAgICAgICAgICAgICAgICAgcmV0dmFsLCBlcnJvciwgZXJyb3ItPm5hbWUgPyBlcnJvci0+bmFtZSA6ICIobm9uZSkiKTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBoYW5kbGUgZXJyb3JzIHByb3Blcmx5Iik7CisgICAgfQorICAKKyAgaWYgKGtleXMgIT0gTlVMTCkKKyAgICB7CisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChpIDwgbl9rZXlzKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX3plcm8gKCZrZXlzW2ldLnNlY3JldCk7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZrZXlzW2ldLnNlY3JldCk7CisgICAgICAgICAgKytpOworICAgICAgICB9CisKKyAgICAgIGRidXNfZnJlZSAoa2V5cyk7CisgICAgfQorICAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb250ZW50cyk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmbGluZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqIEB9ICovIC8qIGVuZCBvZiBpbnRlcm5hbHMgKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzS2V5cmluZworICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBJbmNyZW1lbnRzIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUga2V5cmluZworICoKKyAqIEBwYXJhbSBrZXlyaW5nIHRoZSBrZXlyaW5nCisgKiBAcmV0dXJucyB0aGUga2V5cmluZworICovCitEQnVzS2V5cmluZyAqCitfZGJ1c19rZXlyaW5nX3JlZiAoREJ1c0tleXJpbmcgKmtleXJpbmcpCit7CisgIGtleXJpbmctPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIGtleXJpbmc7Cit9CisKKy8qKgorICogRGVjcmVtZW50cyByZWZjb3VudCBhbmQgZmluYWxpemVzIGlmIGl0IHJlYWNoZXMKKyAqIHplcm8uCisgKgorICogQHBhcmFtIGtleXJpbmcgdGhlIGtleXJpbmcKKyAqLwordm9pZAorX2RidXNfa2V5cmluZ191bnJlZiAoREJ1c0tleXJpbmcgKmtleXJpbmcpCit7CisgIGtleXJpbmctPnJlZmNvdW50IC09IDE7CisKKyAgaWYgKGtleXJpbmctPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgaWYgKGtleXJpbmctPmNyZWRlbnRpYWxzKQorICAgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoa2V5cmluZy0+Y3JlZGVudGlhbHMpOworCisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmtleXJpbmctPmZpbGVuYW1lKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgma2V5cmluZy0+ZmlsZW5hbWVfbG9jayk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmtleXJpbmctPmRpcmVjdG9yeSk7CisgICAgICBmcmVlX2tleXMgKGtleXJpbmctPmtleXMsIGtleXJpbmctPm5fa2V5cyk7CisgICAgICBkYnVzX2ZyZWUgKGtleXJpbmcpOyAgICAgIAorICAgIH0KK30KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IGtleXJpbmcgdGhhdCBsaXZlcyBpbiB0aGUgfi8uZGJ1cy1rZXlyaW5ncyBkaXJlY3RvcnkKKyAqIG9mIHRoZSBnaXZlbiB1c2VyIGNyZWRlbnRpYWxzLiBJZiB0aGUgY3JlZGVudGlhbHMgYXJlICNOVUxMIG9yCisgKiBlbXB0eSwgdXNlcyB0aG9zZSBvZiB0aGUgY3VycmVudCBwcm9jZXNzLgorICoKKyAqIEBwYXJhbSB1c2VybmFtZSB1c2VybmFtZSB0byBnZXQga2V5cmluZyBmb3IsIG9yICNOVUxMCisgKiBAcGFyYW0gY29udGV4dCB3aGljaCBrZXlyaW5nIHRvIGdldAorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3JzCisgKiBAcmV0dXJucyB0aGUga2V5cmluZyBvciAjTlVMTCBvbiBlcnJvcgorICovCitEQnVzS2V5cmluZyoKK19kYnVzX2tleXJpbmdfbmV3X2Zvcl9jcmVkZW50aWFscyAoREJ1c0NyZWRlbnRpYWxzICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIHJpbmdkaXI7CisgIERCdXNLZXlyaW5nICprZXlyaW5nOworICBkYnVzX2Jvb2xfdCBlcnJvcl9zZXQ7CisgIERCdXNFcnJvciB0bXBfZXJyb3I7CisgIERCdXNDcmVkZW50aWFscyAqb3VyX2NyZWRlbnRpYWxzOworICAKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKF9kYnVzX2NoZWNrX3NldHVpZCAoKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvcl9jb25zdCAoZXJyb3IsIERCVVNfRVJST1JfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGNyZWF0ZSBEQnVzIGtleXJpbmcgd2hlbiBzZXR1aWQiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgCisgIGtleXJpbmcgPSBOVUxMOworICBlcnJvcl9zZXQgPSBGQUxTRTsKKyAgb3VyX2NyZWRlbnRpYWxzID0gTlVMTDsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZyaW5nZGlyKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoY3JlZGVudGlhbHMgIT0gTlVMTCkKKyAgICB7CisgICAgICBvdXJfY3JlZGVudGlhbHMgPSBfZGJ1c19jcmVkZW50aWFsc19jb3B5IChjcmVkZW50aWFscyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgb3VyX2NyZWRlbnRpYWxzID0gX2RidXNfY3JlZGVudGlhbHNfbmV3X2Zyb21fY3VycmVudF9wcm9jZXNzICgpOworICAgIH0KKyAgCisgIGlmIChvdXJfY3JlZGVudGlhbHMgPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZDsKKworICBpZiAoX2RidXNfY3JlZGVudGlhbHNfYXJlX2Fub255bW91cyAob3VyX2NyZWRlbnRpYWxzKSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9mcm9tX2N1cnJlbnRfcHJvY2VzcyAob3VyX2NyZWRlbnRpYWxzKSkKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19hcHBlbmRfa2V5cmluZ19kaXJlY3RvcnlfZm9yX2NyZWRlbnRpYWxzICgmcmluZ2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXJfY3JlZGVudGlhbHMpKQorICAgIGdvdG8gZmFpbGVkOworICAKKyAga2V5cmluZyA9IF9kYnVzX2tleXJpbmdfbmV3ICgpOworICBpZiAoa2V5cmluZyA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkOworCisgIF9kYnVzX2Fzc2VydCAoa2V5cmluZy0+Y3JlZGVudGlhbHMgPT0gTlVMTCk7CisgIGtleXJpbmctPmNyZWRlbnRpYWxzID0gb3VyX2NyZWRlbnRpYWxzOworICBvdXJfY3JlZGVudGlhbHMgPSBOVUxMOyAvKiBzbyB3ZSBkb24ndCB1bnJlZiBpdCBhZ2FpbiBsYXRlciAqLworICAKKyAgLyogc2hvdWxkIGhhdmUgYmVlbiB2YWxpZGF0ZWQgYWxyZWFkeSwgYnV0IHBhcmFub2lhIGNoZWNrIGhlcmUgKi8KKyAgaWYgKCFfZGJ1c19rZXlyaW5nX3ZhbGlkYXRlX2NvbnRleHQgKGNvbnRleHQpKQorICAgIHsKKyAgICAgIGVycm9yX3NldCA9IFRSVUU7CisgICAgICBkYnVzX3NldF9lcnJvcl9jb25zdCAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgY29udGV4dCBpbiBrZXlyaW5nIGNyZWF0aW9uIik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgLyogU2F2ZSBrZXlyaW5nIGRpciBpbiB0aGUga2V5cmluZyBvYmplY3QgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJnJpbmdkaXIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlyaW5nLT5kaXJlY3RvcnksIDApKQorICAgIGdvdG8gZmFpbGVkOyAgCisKKyAgLyogQ3JlYXRlIGtleXJpbmctPmZpbGVuYW1lIGJhc2VkIG9uIGtleXJpbmcgZGlyIGFuZCBjb250ZXh0ICovCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZrZXlyaW5nLT5kaXJlY3RvcnksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlyaW5nLT5maWxlbmFtZSwgMCkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgma2V5cmluZy0+ZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgLyogQ3JlYXRlIGxvY2tmaWxlIG5hbWUgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmtleXJpbmctPmZpbGVuYW1lLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5cmluZy0+ZmlsZW5hbWVfbG9jaywgMCkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgma2V5cmluZy0+ZmlsZW5hbWVfbG9jaywgIi5sb2NrIikpCisgICAgZ290byBmYWlsZWQ7CisKKyAgLyogUmVsb2FkIGtleXJpbmcgKi8KKyAgZGJ1c19lcnJvcl9pbml0ICgmdG1wX2Vycm9yKTsKKyAgaWYgKCFfZGJ1c19rZXlyaW5nX3JlbG9hZCAoa2V5cmluZywgRkFMU0UsICZ0bXBfZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJkaWRuJ3QgbG9hZCBhbiBleGlzdGluZyBrZXlyaW5nOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHRtcF9lcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJnRtcF9lcnJvcik7CisgICAgfQorICAKKyAgLyogV2UgZG9uJ3QgZmFpbCBmYXRhbGx5IGlmIHdlIGNhbid0IGNyZWF0ZSB0aGUgZGlyZWN0b3J5LAorICAgKiBidXQgdGhlIGtleXJpbmcgd2lsbCBwcm9iYWJseSBhbHdheXMgYmUgZW1wdHkKKyAgICogdW5sZXNzIHNvbWVvbmUgZWxzZSBtYW5hZ2VzIHRvIGNyZWF0ZSBpdAorICAgKi8KKyAgZGJ1c19lcnJvcl9pbml0ICgmdG1wX2Vycm9yKTsKKyAgaWYgKCFfZGJ1c19jcmVhdGVfZGlyZWN0b3J5ICgma2V5cmluZy0+ZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBfZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDcmVhdGluZyBrZXlyaW5nIGRpcmVjdG9yeTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICB0bXBfZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZ0bXBfZXJyb3IpOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnJpbmdkaXIpOworICAKKyAgcmV0dXJuIGtleXJpbmc7CisgIAorIGZhaWxlZDoKKyAgaWYgKCFlcnJvcl9zZXQpCisgICAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05PX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGlmIChvdXJfY3JlZGVudGlhbHMpCisgICAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKG91cl9jcmVkZW50aWFscyk7CisgIGlmIChrZXlyaW5nKQorICAgIF9kYnVzX2tleXJpbmdfdW5yZWYgKGtleXJpbmcpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnJpbmdkaXIpOworICByZXR1cm4gTlVMTDsKKworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBjb250ZXh0IGlzIGEgdmFsaWQgY29udGV4dC4KKyAqIENvbnRleHRzIHRoYXQgbWlnaHQgY2F1c2UgY29uZnVzaW9uIHdoZW4gdXNlZAorICogaW4gZmlsZW5hbWVzIGFyZSBub3QgYWxsb3dlZCAoY29udGV4dHMgY2FuJ3QKKyAqIHN0YXJ0IHdpdGggYSBkb3Qgb3IgY29udGFpbiBkaXIgc2VwYXJhdG9ycykuCisgKgorICogQHRvZG8gdGhpcyBpcyB0aGUgbW9zdCBpbmVmZmljaWVudCBpbXBsZW1lbnRhdGlvbgorICogaW1hZ2luYWJsZS4KKyAqCisgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dAorICogQHJldHVybnMgI1RSVUUgaWYgdmFsaWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2tleXJpbmdfdmFsaWRhdGVfY29udGV4dCAoY29uc3QgREJ1c1N0cmluZyAqY29udGV4dCkKK3sKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChjb250ZXh0KSA9PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb250ZXh0IGlzIHplcm8tbGVuZ3RoXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfdmFsaWRhdGVfYXNjaWkgKGNvbnRleHQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoY29udGV4dCkpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb250ZXh0IG5vdCB2YWxpZCBhc2NpaVxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgLyogbm8gZGlyZWN0b3J5IHNlcGFyYXRvcnMgKi8gIAorICBpZiAoX2RidXNfc3RyaW5nX2ZpbmQgKGNvbnRleHQsIDAsICIvIiwgTlVMTCkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbnRleHQgY29udGFpbnMgYSBzbGFzaFxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChfZGJ1c19zdHJpbmdfZmluZCAoY29udGV4dCwgMCwgIlxcIiwgTlVMTCkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbnRleHQgY29udGFpbnMgYSBiYWNrc2xhc2hcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBwcmV2ZW50IGF0dGVtcHRzIHRvIHVzZSBkb3RmaWxlcyBvciAiLi4iIG9yICIubG9jayIKKyAgICogYWxsIG9mIHdoaWNoIG1pZ2h0IGFsbG93IHNvbWUga2luZCBvZiBhdHRhY2sKKyAgICovCisgIGlmIChfZGJ1c19zdHJpbmdfZmluZCAoY29udGV4dCwgMCwgIi4iLCBOVUxMKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29udGV4dCBjb250YWlucyBhIGRvdFxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIG5vIHNwYWNlcy90YWJzLCB0aG9zZSBhcmUgdXNlZCBmb3Igc2VwYXJhdG9ycyBpbiB0aGUgcHJvdG9jb2wgKi8KKyAgaWYgKF9kYnVzX3N0cmluZ19maW5kX2JsYW5rIChjb250ZXh0LCAwLCBOVUxMKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29udGV4dCBjb250YWlucyBhIGJsYW5rXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKF9kYnVzX3N0cmluZ19maW5kIChjb250ZXh0LCAwLCAiXG4iLCBOVUxMKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29udGV4dCBjb250YWlucyBhIG5ld2xpbmVcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoX2RidXNfc3RyaW5nX2ZpbmQgKGNvbnRleHQsIDAsICJcciIsIE5VTEwpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb250ZXh0IGNvbnRhaW5zIGEgY2FycmlhZ2UgcmV0dXJuXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIERCdXNLZXkqCitmaW5kX3JlY2VudF9rZXkgKERCdXNLZXlyaW5nICprZXlyaW5nKQoreworICBpbnQgaTsKKyAgbG9uZyB0dl9zZWMsIHR2X3VzZWM7CisKKyAgX2RidXNfZ2V0X3JlYWxfdGltZSAoJnR2X3NlYywgJnR2X3VzZWMpOworICAKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwga2V5cmluZy0+bl9rZXlzKQorICAgIHsKKyAgICAgIERCdXNLZXkgKmtleSA9ICZrZXlyaW5nLT5rZXlzW2ldOworCisgICAgICBfZGJ1c192ZXJib3NlICgiS2V5ICVkIGlzICVsZCBzZWNvbmRzIG9sZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGksIHR2X3NlYyAtIGtleS0+Y3JlYXRpb25fdGltZSk7CisgICAgICAKKyAgICAgIGlmICgodHZfc2VjIC0gTkVXX0tFWV9USU1FT1VUX1NFQ09ORFMpIDwga2V5LT5jcmVhdGlvbl90aW1lKQorICAgICAgICByZXR1cm4ga2V5OworICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIEdldHMgYSByZWNlbnQga2V5IHRvIHVzZSBmb3IgYXV0aGVudGljYXRpb24uCisgKiBJZiBubyByZWNlbnQga2V5IGV4aXN0cywgY3JlYXRlcyBvbmUuIFJldHVybnMKKyAqIHRoZSBrZXkgSUQuIElmIGEga2V5IGNhbid0IGJlIHdyaXR0ZW4gdG8gdGhlIGtleXJpbmcKKyAqIGZpbGUgc28gbm8gcmVjZW50IGtleSBjYW4gYmUgY3JlYXRlZCwgcmV0dXJucyAtMS4KKyAqIEFsbCB2YWxpZCBrZXlzIGFyZSA+IDAuCisgKgorICogQHBhcmFtIGtleXJpbmcgdGhlIGtleXJpbmcKKyAqIEBwYXJhbSBlcnJvciBlcnJvciBvbiBmYWlsdXJlCisgKiBAcmV0dXJucyBrZXkgSUQgdG8gdXNlIGZvciBhdXRoLCBvciAtMSBvbiBmYWlsdXJlCisgKi8KK2ludAorX2RidXNfa2V5cmluZ19nZXRfYmVzdF9rZXkgKERCdXNLZXlyaW5nICAqa2V5cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgKmVycm9yKQoreworICBEQnVzS2V5ICprZXk7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICBrZXkgPSBmaW5kX3JlY2VudF9rZXkgKGtleXJpbmcpOworICBpZiAoa2V5KQorICAgIHJldHVybiBrZXktPmlkOworCisgIC8qIEFsbCBvdXIga2V5cyBhcmUgdG9vIG9sZCwgb3Igd2UndmUgbmV2ZXIgbG9hZGVkIHRoZQorICAgKiBrZXlyaW5nLiBDcmVhdGUgYSBuZXcgb25lLgorICAgKi8KKyAgaWYgKCFfZGJ1c19rZXlyaW5nX3JlbG9hZCAoa2V5cmluZywgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgIHJldHVybiAtMTsKKworICBrZXkgPSBmaW5kX3JlY2VudF9rZXkgKGtleXJpbmcpOworICBpZiAoa2V5KQorICAgIHJldHVybiBrZXktPmlkOworICBlbHNlCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyByZWNlbnQtZW5vdWdoIGtleSBmb3VuZCBpbiBrZXlyaW5nLCBhbmQgdW5hYmxlIHRvIGNyZWF0ZSBhIG5ldyBrZXkiKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIGtleXJpbmcgaXMgZm9yIHRoZSBzYW1lIHVzZXIgYXMgdGhlIGdpdmVuIGNyZWRlbnRpYWxzLgorICoKKyAqIEBwYXJhbSBrZXlyaW5nIHRoZSBrZXlyaW5nCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIGNyZWRlbnRpYWxzIHRvIGNoZWNrCisgKgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGtleXJpbmcgYmVsb25ncyB0byB0aGUgZ2l2ZW4gdXNlcgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfa2V5cmluZ19pc19mb3JfY3JlZGVudGlhbHMgKERCdXNLZXlyaW5nICAgICAgICAgICAqa2V5cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgICAgICAgKmNyZWRlbnRpYWxzKQoreworICByZXR1cm4gX2RidXNfY3JlZGVudGlhbHNfc2FtZV91c2VyIChrZXlyaW5nLT5jcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlZGVudGlhbHMpOworfQorCisvKioKKyAqIEdldHMgdGhlIGhleC1lbmNvZGVkIHNlY3JldCBrZXkgZm9yIHRoZSBnaXZlbiBJRC4KKyAqIFJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5LiBSZXR1cm5zICNUUlVFCisgKiBidXQgZW1wdHkga2V5IG9uIGFueSBvdGhlciBlcnJvciBzdWNoIGFzIHVua25vd24KKyAqIGtleSBJRC4KKyAqCisgKiBAcGFyYW0ga2V5cmluZyB0aGUga2V5cmluZworICogQHBhcmFtIGtleV9pZCB0aGUga2V5IElECisgKiBAcGFyYW0gaGV4X2tleSBzdHJpbmcgdG8gYXBwZW5kIGhleC1lbmNvZGVkIGtleSB0bworICogQHJldHVybnMgI1RSVUUgaWYgd2UgaGFkIGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2tleXJpbmdfZ2V0X2hleF9rZXkgKERCdXNLZXlyaW5nICAgICAgICprZXlyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGtleV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICpoZXhfa2V5KQoreworICBEQnVzS2V5ICprZXk7CisKKyAga2V5ID0gZmluZF9rZXlfYnlfaWQgKGtleXJpbmctPmtleXMsCisgICAgICAgICAgICAgICAgICAgICAgICBrZXlyaW5nLT5uX2tleXMsCisgICAgICAgICAgICAgICAgICAgICAgICBrZXlfaWQpOworICBpZiAoa2V5ID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7IC8qIGhhZCBlbm91Z2ggbWVtb3J5LCBzbyBUUlVFICovCisKKyAgcmV0dXJuIF9kYnVzX3N0cmluZ19oZXhfZW5jb2RlICgma2V5LT5zZWNyZXQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGV4X2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoaGV4X2tleSkpOworfQorCisvKiogQH0gKi8gLyogZW5kIG9mIGV4cG9zZWQgQVBJICovCisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworZGJ1c19ib29sX3QKK19kYnVzX2tleXJpbmdfdGVzdCAodm9pZCkKK3sKKyAgREJ1c1N0cmluZyBjb250ZXh0OworICBEQnVzS2V5cmluZyAqcmluZzE7CisgIERCdXNLZXlyaW5nICpyaW5nMjsKKyAgaW50IGlkOworICBEQnVzRXJyb3IgZXJyb3I7CisgIGludCBpOworCisgIHJpbmcxID0gTlVMTDsKKyAgcmluZzIgPSBOVUxMOworICAKKyAgLyogQ29udGV4dCB2YWxpZGF0aW9uICovCisgIAorICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmNvbnRleHQsICJmb28iKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19rZXlyaW5nX3ZhbGlkYXRlX2NvbnRleHQgKCZjb250ZXh0KSk7CisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmY29udGV4dCwgIm9yZ19mcmVlZGVza3RvcF9ibGFoIik7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfa2V5cmluZ192YWxpZGF0ZV9jb250ZXh0ICgmY29udGV4dCkpOworICAKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZjb250ZXh0LCAiIik7CisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2tleXJpbmdfdmFsaWRhdGVfY29udGV4dCAoJmNvbnRleHQpKTsKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZjb250ZXh0LCAiLmZvbyIpOworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19rZXlyaW5nX3ZhbGlkYXRlX2NvbnRleHQgKCZjb250ZXh0KSk7CisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmY29udGV4dCwgImJhci5mb28iKTsKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfa2V5cmluZ192YWxpZGF0ZV9jb250ZXh0ICgmY29udGV4dCkpOworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmNvbnRleHQsICJiYXIvZm9vIik7CisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2tleXJpbmdfdmFsaWRhdGVfY29udGV4dCAoJmNvbnRleHQpKTsKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZjb250ZXh0LCAiYmFyXFxmb28iKTsKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfa2V5cmluZ192YWxpZGF0ZV9jb250ZXh0ICgmY29udGV4dCkpOworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmNvbnRleHQsICJmb29ceGZhXHhmMCIpOworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19rZXlyaW5nX3ZhbGlkYXRlX2NvbnRleHQgKCZjb250ZXh0KSk7CisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmY29udGV4dCwgImZvb1x4ODAiKTsKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfa2V5cmluZ192YWxpZGF0ZV9jb250ZXh0ICgmY29udGV4dCkpOworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmNvbnRleHQsICJmb29ceDdmIik7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfa2V5cmluZ192YWxpZGF0ZV9jb250ZXh0ICgmY29udGV4dCkpOworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmNvbnRleHQsICJmb28gYmFyIik7CisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2tleXJpbmdfdmFsaWRhdGVfY29udGV4dCAoJmNvbnRleHQpKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb250ZXh0KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZjb250ZXh0LCAnXDAnKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfa2V5cmluZ192YWxpZGF0ZV9jb250ZXh0ICgmY29udGV4dCkpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbnRleHQpOworCisgIC8qIE5vdyB2ZXJpZnkgdGhhdCBpZiB3ZSBjcmVhdGUgYSBrZXkgaW4ga2V5cmluZyAxLAorICAgKiBpdCBpcyBwcm9wZXJseSBsb2FkZWQgaW4ga2V5cmluZyAyCisgICAqLworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmY29udGV4dCwgIm9yZ19mcmVlZGVza3RvcF9kYnVzX3Rlc3RzdWl0ZSIpOworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIHJpbmcxID0gX2RidXNfa2V5cmluZ19uZXdfZm9yX2NyZWRlbnRpYWxzIChOVUxMLCAmY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcik7CisgIF9kYnVzX2Fzc2VydCAocmluZzEgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoZXJyb3IubmFtZSA9PSBOVUxMKTsKKworICBpZCA9IF9kYnVzX2tleXJpbmdfZ2V0X2Jlc3Rfa2V5IChyaW5nMSwgJmVycm9yKTsKKyAgaWYgKGlkIDwgMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJDb3VsZCBub3QgbG9hZCBrZXlyaW5nOiAlc1xuIiwgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBnb3RvIGZhaWx1cmU7CisgICAgfQorCisgIHJpbmcyID0gX2RidXNfa2V5cmluZ19uZXdfZm9yX2NyZWRlbnRpYWxzIChOVUxMLCAmY29udGV4dCwgJmVycm9yKTsKKyAgX2RidXNfYXNzZXJ0IChyaW5nMiAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChlcnJvci5uYW1lID09IE5VTEwpOworICAKKyAgaWYgKHJpbmcxLT5uX2tleXMgIT0gcmluZzItPm5fa2V5cykKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJEaWZmZXJlbnQgbnVtYmVyIG9mIGtleXMgaW4ga2V5cmluZ3NcbiIpOworICAgICAgZ290byBmYWlsdXJlOworICAgIH0KKworICAvKiBXZSBndWFyYW50ZWUgd2UgbG9hZCBhbmQgc2F2ZSBrZWVwaW5nIGtleXMgaW4gYSBmaXhlZAorICAgKiBvcmRlcgorICAgKi8KKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgcmluZzEtPm5fa2V5cykKKyAgICB7CisgICAgICBpZiAocmluZzEtPmtleXNbaV0uaWQgIT0gcmluZzItPmtleXNbaV0uaWQpCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJLZXlyaW5nIDEgaGFzIGZpcnN0IGtleSBJRCAlZCBhbmQga2V5cmluZyAyIGhhcyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICByaW5nMS0+a2V5c1tpXS5pZCwgcmluZzItPmtleXNbaV0uaWQpOworICAgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICAgICAgfSAgICAgIAorCisgICAgICBpZiAocmluZzEtPmtleXNbaV0uY3JlYXRpb25fdGltZSAhPSByaW5nMi0+a2V5c1tpXS5jcmVhdGlvbl90aW1lKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiS2V5cmluZyAxIGhhcyBmaXJzdCBrZXkgdGltZSAlbGQgYW5kIGtleXJpbmcgMiBoYXMgJWxkXG4iLAorICAgICAgICAgICAgICAgICAgIHJpbmcxLT5rZXlzW2ldLmNyZWF0aW9uX3RpbWUsIHJpbmcyLT5rZXlzW2ldLmNyZWF0aW9uX3RpbWUpOworICAgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbCAoJnJpbmcxLT5rZXlzW2ldLnNlY3JldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmluZzItPmtleXNbaV0uc2VjcmV0KSkKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIktleXJpbmdzIDEgYW5kIDIgaGF2ZSBkaWZmZXJlbnQgc2VjcmV0cyBmb3Igc2FtZSBJRC90aW1lc3RhbXBcbiIpOworICAgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICAgICAgfQorICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIHByaW50ZiAoIiAlZCBrZXlzIGluIHRlc3RcbiIsIHJpbmcxLT5uX2tleXMpOworCisgIC8qIFRlc3QgcmVmL3VucmVmICovCisgIF9kYnVzX2tleXJpbmdfcmVmIChyaW5nMSk7CisgIF9kYnVzX2tleXJpbmdfcmVmIChyaW5nMik7CisgIF9kYnVzX2tleXJpbmdfdW5yZWYgKHJpbmcxKTsKKyAgX2RidXNfa2V5cmluZ191bnJlZiAocmluZzIpOworCisKKyAgLyogcmVhbGx5IHVucmVmICovCisgIF9kYnVzX2tleXJpbmdfdW5yZWYgKHJpbmcxKTsKKyAgX2RidXNfa2V5cmluZ191bnJlZiAocmluZzIpOworICAKKyAgcmV0dXJuIFRSVUU7CisKKyBmYWlsdXJlOgorICBpZiAocmluZzEpCisgICAgX2RidXNfa2V5cmluZ191bnJlZiAocmluZzEpOworICBpZiAocmluZzIpCisgICAgX2RidXNfa2V5cmluZ191bnJlZiAocmluZzIpOworCisgIHJldHVybiBGQUxTRTsKK30KKworI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KKyAgICAgCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1rZXlyaW5nLmggYi9kYnVzL2RidXMvZGJ1cy1rZXlyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAwZTMxYgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLWtleXJpbmcuaApAQCAtMCwwICsxLDUyIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMta2V5cmluZy5oIFN0b3JlIHNlY3JldCBjb29raWVzIGluIHlvdXIgaG9tZWRpcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfS0VZUklOR19ICisjZGVmaW5lIERCVVNfS0VZUklOR19ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFjcm9zLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtY3JlZGVudGlhbHMuaD4KKworREJVU19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBEQnVzS2V5cmluZyBEQnVzS2V5cmluZzsKKworREJ1c0tleXJpbmcqIF9kYnVzX2tleXJpbmdfbmV3X2Zvcl9jcmVkZW50aWFscyAoREJ1c0NyZWRlbnRpYWxzICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworREJ1c0tleXJpbmcqIF9kYnVzX2tleXJpbmdfcmVmICAgICAgICAgICAgICAgICAoREJ1c0tleXJpbmcgICAgICAqa2V5cmluZyk7Cit2b2lkICAgICAgICAgX2RidXNfa2V5cmluZ191bnJlZiAgICAgICAgICAgICAgIChEQnVzS2V5cmluZyAgICAgICprZXlyaW5nKTsKK2RidXNfYm9vbF90ICBfZGJ1c19rZXlyaW5nX3ZhbGlkYXRlX2NvbnRleHQgICAgKGNvbnN0IERCdXNTdHJpbmcgKmNvbnRleHQpOworaW50ICAgICAgICAgIF9kYnVzX2tleXJpbmdfZ2V0X2Jlc3Rfa2V5ICAgICAgICAoREJ1c0tleXJpbmcgICAgICAqa2V5cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90ICBfZGJ1c19rZXlyaW5nX2lzX2Zvcl9jcmVkZW50aWFscyAgKERCdXNLZXlyaW5nICAgICAgKmtleXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgICpjcmVkZW50aWFscyk7CitkYnVzX2Jvb2xfdCAgX2RidXNfa2V5cmluZ19nZXRfaGV4X2tleSAgICAgICAgIChEQnVzS2V5cmluZyAgICAgICprZXlyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAga2V5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqaGV4X2tleSk7CisKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfS0VZUklOR19IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1saXN0LmMgYi9kYnVzL2RidXMvZGJ1cy1saXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UxMWNjOAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLWxpc3QuYwpAQCAtMCwwICsxLDEzMzkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1saXN0LmMgR2VuZXJpYyBsaW5rZWQgbGlzdCB1dGlsaXR5IChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtbGlzdC5oIgorI2luY2x1ZGUgImRidXMtbWVtcG9vbC5oIgorI2luY2x1ZGUgImRidXMtdGhyZWFkcy1pbnRlcm5hbC5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzTGlzdCBMaW5rZWQgbGlzdAorICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBEQnVzTGlzdCBkYXRhIHN0cnVjdHVyZQorICoKKyAqIFR5cGVzIGFuZCBmdW5jdGlvbnMgcmVsYXRlZCB0byBEQnVzTGlzdC4KKyAqLworCitzdGF0aWMgREJ1c01lbVBvb2wgKmxpc3RfcG9vbDsKK19EQlVTX0RFRklORV9HTE9CQUxfTE9DSyAobGlzdCk7CisKKy8qKgorICogQGRlZmdyb3VwIERCdXNMaXN0SW50ZXJuYWxzIExpbmtlZCBsaXN0IGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgREJ1c0xpc3QgaW1wbGVtZW50YXRpb24gZGV0YWlscworICoKKyAqIFRoZSBndXRzIG9mIERCdXNMaXN0LgorICoKKyAqIEB7CisgKi8KKworLyogdGhlIG1lbSBwb29sIGlzIHByb2JhYmx5IGEgc3BlZWQgaGl0LCB3aXRoIHRoZSB0aHJlYWQKKyAqIGxvY2ssIHRob3VnaCBpdCBkb2VzIHN0aWxsIHNhdmUgbWVtb3J5IC0gdW5rbm93bi4KKyAqLworc3RhdGljIERCdXNMaXN0KgorYWxsb2NfbGluayAodm9pZCAqZGF0YSkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgX0RCVVNfTE9DSyAobGlzdCk7CisKKyAgaWYgKGxpc3RfcG9vbCA9PSBOVUxMKQorICAgIHsgICAgICAKKyAgICAgIGxpc3RfcG9vbCA9IF9kYnVzX21lbV9wb29sX25ldyAoc2l6ZW9mIChEQnVzTGlzdCksIFRSVUUpOworCisgICAgICBpZiAobGlzdF9wb29sID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19VTkxPQ0sgKGxpc3QpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgIGxpbmsgPSBfZGJ1c19tZW1fcG9vbF9hbGxvYyAobGlzdF9wb29sKTsKKyAgICAgIGlmIChsaW5rID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19tZW1fcG9vbF9mcmVlIChsaXN0X3Bvb2wpOworICAgICAgICAgIGxpc3RfcG9vbCA9IE5VTEw7CisgICAgICAgICAgX0RCVVNfVU5MT0NLIChsaXN0KTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGxpbmsgPSBfZGJ1c19tZW1fcG9vbF9hbGxvYyAobGlzdF9wb29sKTsKKyAgICB9CisKKyAgaWYgKGxpbmspCisgICAgbGluay0+ZGF0YSA9IGRhdGE7CisgIAorICBfREJVU19VTkxPQ0sgKGxpc3QpOworCisgIHJldHVybiBsaW5rOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9saW5rIChEQnVzTGlzdCAqbGluaykKK3sgIAorICBfREJVU19MT0NLIChsaXN0KTsKKyAgaWYgKF9kYnVzX21lbV9wb29sX2RlYWxsb2MgKGxpc3RfcG9vbCwgbGluaykpCisgICAgeworICAgICAgX2RidXNfbWVtX3Bvb2xfZnJlZSAobGlzdF9wb29sKTsKKyAgICAgIGxpc3RfcG9vbCA9IE5VTEw7CisgICAgfQorICAKKyAgX0RCVVNfVU5MT0NLIChsaXN0KTsKK30KKworc3RhdGljIHZvaWQKK2xpbmtfYmVmb3JlIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgREJ1c0xpc3QgICpiZWZvcmVfdGhpc19saW5rLAorICAgICAgICAgICAgIERCdXNMaXN0ICAqbGluaykKK3sKKyAgaWYgKCpsaXN0ID09IE5VTEwpCisgICAgeworICAgICAgbGluay0+cHJldiA9IGxpbms7CisgICAgICBsaW5rLT5uZXh0ID0gbGluazsKKyAgICAgICpsaXN0ID0gbGluazsKKyAgICB9CisgIGVsc2UKKyAgICB7ICAgICAgCisgICAgICBsaW5rLT5uZXh0ID0gYmVmb3JlX3RoaXNfbGluazsKKyAgICAgIGxpbmstPnByZXYgPSBiZWZvcmVfdGhpc19saW5rLT5wcmV2OworICAgICAgYmVmb3JlX3RoaXNfbGluay0+cHJldiA9IGxpbms7CisgICAgICBsaW5rLT5wcmV2LT5uZXh0ID0gbGluazsKKyAgICAgIAorICAgICAgaWYgKGJlZm9yZV90aGlzX2xpbmsgPT0gKmxpc3QpCisgICAgICAgICpsaXN0ID0gbGluazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitsaW5rX2FmdGVyIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICBEQnVzTGlzdCAgKmFmdGVyX3RoaXNfbGluaywKKyAgICAgICAgICAgIERCdXNMaXN0ICAqbGluaykKK3sKKyAgaWYgKCpsaXN0ID09IE5VTEwpCisgICAgeworICAgICAgbGluay0+cHJldiA9IGxpbms7CisgICAgICBsaW5rLT5uZXh0ID0gbGluazsKKyAgICAgICpsaXN0ID0gbGluazsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBsaW5rLT5wcmV2ID0gYWZ0ZXJfdGhpc19saW5rOworICAgICAgbGluay0+bmV4dCA9IGFmdGVyX3RoaXNfbGluay0+bmV4dDsKKyAgICAgIGFmdGVyX3RoaXNfbGluay0+bmV4dCA9IGxpbms7CisgICAgICBsaW5rLT5uZXh0LT5wcmV2ID0gbGluazsKKyAgICB9Cit9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9TVEFUUwordm9pZAorX2RidXNfbGlzdF9nZXRfc3RhdHMgICAgIChkYnVzX3VpbnQzMl90ICppbl91c2VfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAqaW5fZnJlZV9saXN0X3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgKmFsbG9jYXRlZF9wKQoreworICBfREJVU19MT0NLIChsaXN0KTsKKyAgX2RidXNfbWVtX3Bvb2xfZ2V0X3N0YXRzIChsaXN0X3Bvb2wsIGluX3VzZV9wLCBpbl9mcmVlX2xpc3RfcCwgYWxsb2NhdGVkX3ApOworICBfREJVU19VTkxPQ0sgKGxpc3QpOworfQorI2VuZGlmCisKKy8qKiBAfSAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNMaXN0CisgKiBAeworICovCisKKy8qKgorICogQHN0cnVjdCBEQnVzTGlzdAorICoKKyAqIEEgbm9kZSBpbiBhIGxpbmtlZCBsaXN0LgorICoKKyAqIERCdXNMaXN0IGlzIGEgY2lyY3VsYXIgbGlzdDsgdGhhdCBpcywgdGhlIHRhaWwgb2YgdGhlIGxpc3QKKyAqIHBvaW50cyBiYWNrIHRvIHRoZSBoZWFkIG9mIHRoZSBsaXN0LiBUaGUgZW1wdHkgbGlzdCBpcworICogcmVwcmVzZW50ZWQgYnkgYSAjTlVMTCBwb2ludGVyLgorICovCisKKy8qKgorICogQGRlZiBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsKKyAqCisgKiBHZXRzIHRoZSBuZXh0IGxpbmsgaW4gdGhlIGxpc3QsIG9yICNOVUxMIGlmCisgKiB0aGVyZSBhcmUgbm8gbW9yZSBsaW5rcy4gVXNlZCBmb3IgaXRlcmF0aW9uLgorICoKKyAqIEBjb2RlCisgKiBEQnVzTGlzdCAqbGluazsKKyAqIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmbGlzdCk7CisgKiB3aGlsZSAobGluayAhPSBOVUxMKQorICogICB7CisgKiAgICAgcHJpbnRmICgidmFsdWUgaXMgJXBcbiIsIGxpbmstPmRhdGEpOworICogICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZsaW5rKTsKKyAqICAgfQorICogQGVuZGNvZGUKKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcGFyYW0gbGluayBjdXJyZW50IGxpbmsuCisgKiBAcmV0dXJucyB0aGUgbmV4dCBsaW5rLCBvciAlTlVMTCBpZiBub25lLgorICogCisgKi8KKworLyoqCisgKiBAZGVmIF9kYnVzX2xpc3RfZ2V0X3ByZXZfbGluaworICoKKyAqIEdldHMgdGhlIHByZXZpb3VzIGxpbmsgaW4gdGhlIGxpc3QsIG9yICNOVUxMIGlmCisgKiB0aGVyZSBhcmUgbm8gbW9yZSBsaW5rcy4gVXNlZCBmb3IgaXRlcmF0aW9uLgorICoKKyAqIEBjb2RlCisgKiBEQnVzTGlzdCAqbGluazsKKyAqIGxpbmsgPSBfZGJ1c19saXN0X2dldF9sYXN0X2xpbmsgKCZsaXN0KTsKKyAqIHdoaWxlIChsaW5rICE9IE5VTEwpCisgKiAgIHsKKyAqICAgICBwcmludGYgKCJ2YWx1ZSBpcyAlcFxuIiwgbGluay0+ZGF0YSk7CisgKiAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X3ByZXZfbGluayAoJmxpbmspOworICogICB9CisgKiBAZW5kY29kZQorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEBwYXJhbSBsaW5rIGN1cnJlbnQgbGluay4KKyAqIEByZXR1cm5zIHRoZSBwcmV2aW91cyBsaW5rLCBvciAlTlVMTCBpZiBub25lLgorICogCisgKi8KKworLyoqCisgKiBBbGxvY2F0ZXMgYSBsaW5rZWQgbGlzdCBub2RlLiBVc2VmdWwgZm9yIHByZWFsbG9jYXRpbmcKKyAqIG5vZGVzIGFuZCB1c2luZyBfZGJ1c19saXN0X2FwcGVuZF9saW5rKCkgdG8gYXZvaWQKKyAqIGFsbG9jYXRpb25zLgorICogCisgKiBAcGFyYW0gZGF0YSB0aGUgdmFsdWUgdG8gc3RvcmUgaW4gdGhlIGxpbmsuCisgKiBAcmV0dXJucyBhIG5ld2x5IGFsbG9jYXRlZCBsaW5rLgorICovCitEQnVzTGlzdCoKK19kYnVzX2xpc3RfYWxsb2NfbGluayAodm9pZCAqZGF0YSkKK3sKKyAgcmV0dXJuIGFsbG9jX2xpbmsgKGRhdGEpOworfQorCisvKioKKyAqIEZyZWVzIGEgbGlua2VkIGxpc3Qgbm9kZSBhbGxvY2F0ZWQgd2l0aCBfZGJ1c19saXN0X2FsbG9jX2xpbmsuCisgKiBEb2VzIG5vdCBmcmVlIHRoZSBkYXRhIGluIHRoZSBub2RlLgorICoKKyAqIEBwYXJhbSBsaW5rIHRoZSBsaXN0IG5vZGUKKyAqLwordm9pZAorX2RidXNfbGlzdF9mcmVlX2xpbmsgKERCdXNMaXN0ICpsaW5rKQoreworICBmcmVlX2xpbmsgKGxpbmspOworfQorCisKKy8qKgorICogQXBwZW5kcyBhIHZhbHVlIHRvIHRoZSBsaXN0LiBNYXkgcmV0dXJuICNGQUxTRQorICogaWYgaW5zdWZmaWNpZW50IG1lbW9yeSBleGlzdHMgdG8gYWRkIGEgbGlzdCBsaW5rLgorICogVGhpcyBpcyBhIGNvbnN0YW50LXRpbWUgb3BlcmF0aW9uLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEBwYXJhbSBkYXRhIHRoZSB2YWx1ZSB0byBhcHBlbmQuCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbGlzdF9hcHBlbmQgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGEpCit7CisgIGlmICghX2RidXNfbGlzdF9wcmVwZW5kIChsaXN0LCBkYXRhKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogTm93IGN5Y2xlIHRoZSBsaXN0IGZvcndhcmQgb25lIHNvIHRoZSBwcmVwZW5kZWQgbm9kZSBpcyB0aGUgdGFpbCAqLworICAqbGlzdCA9ICgqbGlzdCktPm5leHQ7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogUHJlcGVuZHMgYSB2YWx1ZSB0byB0aGUgbGlzdC4gTWF5IHJldHVybiAjRkFMU0UKKyAqIGlmIGluc3VmZmljaWVudCBtZW1vcnkgZXhpc3RzIHRvIGFkZCBhIGxpc3QgbGluay4KKyAqIFRoaXMgaXMgYSBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcGFyYW0gZGF0YSB0aGUgdmFsdWUgdG8gcHJlcGVuZC4KKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19saXN0X3ByZXBlbmQgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICpkYXRhKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBsaW5rID0gYWxsb2NfbGluayAoZGF0YSk7CisgIGlmIChsaW5rID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGxpbmtfYmVmb3JlIChsaXN0LCAqbGlzdCwgbGluayk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQXBwZW5kcyBhIGxpbmsgdG8gdGhlIGxpc3QuCisgKiBDYW5ub3QgZmFpbCBkdWUgdG8gb3V0IG9mIG1lbW9yeS4KKyAqIFRoaXMgaXMgYSBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcGFyYW0gbGluayB0aGUgbGluayB0byBhcHBlbmQuCisgKi8KK3ZvaWQKK19kYnVzX2xpc3RfYXBwZW5kX2xpbmsgKERCdXNMaXN0ICoqbGlzdCwKKwkJCURCdXNMaXN0ICpsaW5rKQoreworICBfZGJ1c19saXN0X3ByZXBlbmRfbGluayAobGlzdCwgbGluayk7CisKKyAgLyogTm93IGN5Y2xlIHRoZSBsaXN0IGZvcndhcmQgb25lIHNvIHRoZSBwcmVwZW5kZWQgbm9kZSBpcyB0aGUgdGFpbCAqLworICAqbGlzdCA9ICgqbGlzdCktPm5leHQ7Cit9CisKKy8qKgorICogUHJlcGVuZHMgYSBsaW5rIHRvIHRoZSBsaXN0LiAKKyAqIENhbm5vdCBmYWlsIGR1ZSB0byBvdXQgb2YgbWVtb3J5LgorICogVGhpcyBpcyBhIGNvbnN0YW50LXRpbWUgb3BlcmF0aW9uLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEBwYXJhbSBsaW5rIHRoZSBsaW5rIHRvIHByZXBlbmQuCisgKi8KK3ZvaWQKK19kYnVzX2xpc3RfcHJlcGVuZF9saW5rIChEQnVzTGlzdCAqKmxpc3QsCisJCQkgREJ1c0xpc3QgKmxpbmspCit7CisgIGxpbmtfYmVmb3JlIChsaXN0LCAqbGlzdCwgbGluayk7Cit9CisKKy8qKgorICogSW5zZXJ0cyBkYXRhIGludG8gdGhlIGxpc3QgYWZ0ZXIgdGhlIGdpdmVuIGV4aXN0aW5nIGxpbmsuCisgKiAKKyAqIEBwYXJhbSBsaXN0IHRoZSBsaXN0IHRvIG1vZGlmeQorICogQHBhcmFtIGFmdGVyX3RoaXNfbGluayBleGlzdGluZyBsaW5rIHRvIGluc2VydCBhZnRlciwgb3IgI05VTEwgdG8gcHJlcGVuZAorICogQHBhcmFtIGRhdGEgdGhlIHZhbHVlIHRvIGluc2VydAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19saXN0X2luc2VydF9hZnRlciAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqYWZ0ZXJfdGhpc19saW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqZGF0YSkKK3sKKyAgREJ1c0xpc3QgKmxpbms7ICAKKworICBpZiAoYWZ0ZXJfdGhpc19saW5rID09IE5VTEwpCisgICAgcmV0dXJuIF9kYnVzX2xpc3RfcHJlcGVuZCAobGlzdCwgZGF0YSk7CisgIGVsc2UKKyAgICB7CisgICAgICBsaW5rID0gYWxsb2NfbGluayAoZGF0YSk7CisgICAgICBpZiAobGluayA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgIAorICAgICAgbGlua19hZnRlciAobGlzdCwgYWZ0ZXJfdGhpc19saW5rLCBsaW5rKTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBJbnNlcnRzIGEgbGluayBpbnRvIHRoZSBsaXN0IGJlZm9yZSB0aGUgZ2l2ZW4gZXhpc3RpbmcgbGluay4KKyAqIAorICogQHBhcmFtIGxpc3QgdGhlIGxpc3QgdG8gbW9kaWZ5CisgKiBAcGFyYW0gYmVmb3JlX3RoaXNfbGluayBleGlzdGluZyBsaW5rIHRvIGluc2VydCBiZWZvcmUsIG9yICNOVUxMIHRvIGFwcGVuZAorICogQHBhcmFtIGxpbmsgdGhlIGxpbmsgdG8gaW5zZXJ0CisgKi8KK3ZvaWQKK19kYnVzX2xpc3RfaW5zZXJ0X2JlZm9yZV9saW5rIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICpiZWZvcmVfdGhpc19saW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqbGluaykKK3sKKyAgaWYgKGJlZm9yZV90aGlzX2xpbmsgPT0gTlVMTCkKKyAgICBfZGJ1c19saXN0X2FwcGVuZF9saW5rIChsaXN0LCBsaW5rKTsKKyAgZWxzZQorICAgIGxpbmtfYmVmb3JlIChsaXN0LCBiZWZvcmVfdGhpc19saW5rLCBsaW5rKTsKK30KKworLyoqCisgKiBJbnNlcnRzIGEgbGluayBpbnRvIHRoZSBsaXN0IGFmdGVyIHRoZSBnaXZlbiBleGlzdGluZyBsaW5rLgorICogCisgKiBAcGFyYW0gbGlzdCB0aGUgbGlzdCB0byBtb2RpZnkKKyAqIEBwYXJhbSBhZnRlcl90aGlzX2xpbmsgZXhpc3RpbmcgbGluayB0byBpbnNlcnQgYWZ0ZXIsIG9yICNOVUxMIHRvIHByZXBlbmQKKyAqIEBwYXJhbSBsaW5rIHRoZSBsaW5rIHRvIGluc2VydAorICovCit2b2lkCitfZGJ1c19saXN0X2luc2VydF9hZnRlcl9saW5rIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgKmFmdGVyX3RoaXNfbGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqbGluaykKK3sKKyAgaWYgKGFmdGVyX3RoaXNfbGluayA9PSBOVUxMKQorICAgIF9kYnVzX2xpc3RfcHJlcGVuZF9saW5rIChsaXN0LCBsaW5rKTsKKyAgZWxzZSAgCisgICAgbGlua19hZnRlciAobGlzdCwgYWZ0ZXJfdGhpc19saW5rLCBsaW5rKTsKK30KKworLyoqCisgKiBSZW1vdmVzIGEgdmFsdWUgZnJvbSB0aGUgbGlzdC4gT25seSByZW1vdmVzIHRoZQorICogZmlyc3QgdmFsdWUgZXF1YWwgdG8gdGhlIGdpdmVuIGRhdGEgcG9pbnRlciwKKyAqIGV2ZW4gaWYgbXVsdGlwbGUgdmFsdWVzIGV4aXN0IHdoaWNoIG1hdGNoLgorICogVGhpcyBpcyBhIGxpbmVhci10aW1lIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcGFyYW0gZGF0YSB0aGUgdmFsdWUgdG8gcmVtb3ZlLgorICogQHJldHVybnMgI1RSVUUgaWYgYSB2YWx1ZSB3YXMgZm91bmQgdG8gcmVtb3ZlLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbGlzdF9yZW1vdmUgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGEpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSAqbGlzdDsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAobGluay0+ZGF0YSA9PSBkYXRhKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAobGlzdCwgbGluayk7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAobGlzdCwgbGluayk7CisgICAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBSZW1vdmVzIGEgdmFsdWUgZnJvbSB0aGUgbGlzdC4gT25seSByZW1vdmVzIHRoZQorICogbGFzdCB2YWx1ZSBlcXVhbCB0byB0aGUgZ2l2ZW4gZGF0YSBwb2ludGVyLAorICogZXZlbiBpZiBtdWx0aXBsZSB2YWx1ZXMgZXhpc3Qgd2hpY2ggbWF0Y2guCisgKiBUaGlzIGlzIGEgbGluZWFyLXRpbWUgb3BlcmF0aW9uLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEBwYXJhbSBkYXRhIHRoZSB2YWx1ZSB0byByZW1vdmUuCisgKiBAcmV0dXJucyAjVFJVRSBpZiBhIHZhbHVlIHdhcyBmb3VuZCB0byByZW1vdmUuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19saXN0X3JlbW92ZV9sYXN0IChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGEpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2ZpbmRfbGFzdCAobGlzdCwgZGF0YSk7CisgIGlmIChsaW5rKQorICAgIHsKKyAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKGxpc3QsIGxpbmspOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEZpbmRzIGEgdmFsdWUgaW4gdGhlIGxpc3QuIFJldHVybnMgdGhlIGxhc3QgbGluaworICogd2l0aCB2YWx1ZSBlcXVhbCB0byB0aGUgZ2l2ZW4gZGF0YSBwb2ludGVyLgorICogVGhpcyBpcyBhIGxpbmVhci10aW1lIG9wZXJhdGlvbi4KKyAqIFJldHVybnMgI05VTEwgaWYgbm8gdmFsdWUgZm91bmQgdGhhdCBtYXRjaGVzLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEBwYXJhbSBkYXRhIHRoZSB2YWx1ZSB0byBmaW5kLgorICogQHJldHVybnMgdGhlIGxpbmsgaWYgZm91bmQKKyAqLworREJ1c0xpc3QqCitfZGJ1c19saXN0X2ZpbmRfbGFzdCAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqZGF0YSkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2xhc3RfbGluayAobGlzdCk7CisKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAobGluay0+ZGF0YSA9PSBkYXRhKQorICAgICAgICByZXR1cm4gbGluazsKKyAgICAgIAorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X3ByZXZfbGluayAobGlzdCwgbGluayk7CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIFJlbW92ZXMgdGhlIGdpdmVuIGxpbmsgZnJvbSB0aGUgbGlzdCwgYnV0IGRvZXNuJ3QKKyAqIGZyZWUgaXQuIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsoKSBib3RoIHJlbW92ZXMgdGhlCisgKiBsaW5rIGFuZCBhbHNvIGZyZWVzIGl0LgorICoKKyAqIEBwYXJhbSBsaXN0IHRoZSBsaXN0CisgKiBAcGFyYW0gbGluayB0aGUgbGluayBpbiB0aGUgbGlzdAorICovCit2b2lkCitfZGJ1c19saXN0X3VubGluayAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqbGluaykKK3sKKyAgaWYgKGxpbmstPm5leHQgPT0gbGluaykKKyAgICB7CisgICAgICAvKiBvbmUtZWxlbWVudCBsaXN0ICovCisgICAgICAqbGlzdCA9IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeyAgICAgIAorICAgICAgbGluay0+cHJldi0+bmV4dCA9IGxpbmstPm5leHQ7CisgICAgICBsaW5rLT5uZXh0LT5wcmV2ID0gbGluay0+cHJldjsKKyAgICAgIAorICAgICAgaWYgKCpsaXN0ID09IGxpbmspCisgICAgICAgICpsaXN0ID0gbGluay0+bmV4dDsKKyAgICB9CisKKyAgbGluay0+bmV4dCA9IE5VTEw7CisgIGxpbmstPnByZXYgPSBOVUxMOworfQorCisvKioKKyAqIFJlbW92ZXMgYSBsaW5rIGZyb20gdGhlIGxpc3QuIFRoaXMgaXMgYSBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcGFyYW0gbGluayB0aGUgbGlzdCBsaW5rIHRvIHJlbW92ZS4KKyAqLwordm9pZAorX2RidXNfbGlzdF9yZW1vdmVfbGluayAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICpsaW5rKQoreworICBfZGJ1c19saXN0X3VubGluayAobGlzdCwgbGluayk7CisgIGZyZWVfbGluayAobGluayk7Cit9CisKKy8qKgorICogRnJlZXMgYWxsIGxpbmtzIGluIHRoZSBsaXN0IGFuZCBzZXRzIHRoZSBsaXN0IGhlYWQgdG8gI05VTEwuIERvZXMKKyAqIG5vdCBmcmVlIHRoZSBkYXRhIGluIGVhY2ggbGluaywgZm9yIG9idmlvdXMgcmVhc29ucy4gVGhpcyBpcyBhCisgKiBsaW5lYXItdGltZSBvcGVyYXRpb24uCisgKgorICogQHBhcmFtIGxpc3QgYWRkcmVzcyBvZiB0aGUgbGlzdCBoZWFkLgorICovCit2b2lkCitfZGJ1c19saXN0X2NsZWFyIChEQnVzTGlzdCAqKmxpc3QpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSAqbGlzdDsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAobGlzdCwgbGluayk7CisgICAgICAKKyAgICAgIGZyZWVfbGluayAobGluayk7CisgICAgICAKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KKworICAqbGlzdCA9IE5VTEw7Cit9CisKKy8qKgorICogR2V0cyB0aGUgZmlyc3QgbGluayBpbiB0aGUgbGlzdC4KKyAqIFRoaXMgaXMgYSBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcmV0dXJucyB0aGUgZmlyc3QgbGluaywgb3IgI05VTEwgZm9yIGFuIGVtcHR5IGxpc3QuCisgKi8KK0RCdXNMaXN0KgorX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoREJ1c0xpc3QgKipsaXN0KQoreworICByZXR1cm4gKmxpc3Q7Cit9CisKKy8qKgorICogR2V0cyB0aGUgbGFzdCBsaW5rIGluIHRoZSBsaXN0LgorICogVGhpcyBpcyBhIGNvbnN0YW50LXRpbWUgb3BlcmF0aW9uLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEByZXR1cm5zIHRoZSBsYXN0IGxpbmssIG9yICNOVUxMIGZvciBhbiBlbXB0eSBsaXN0LgorICovCitEQnVzTGlzdCoKK19kYnVzX2xpc3RfZ2V0X2xhc3RfbGluayAoREJ1c0xpc3QgKipsaXN0KQoreworICBpZiAoKmxpc3QgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgZWxzZQorICAgIHJldHVybiAoKmxpc3QpLT5wcmV2OworfQorCisvKioKKyAqIEdldHMgdGhlIGxhc3QgZGF0YSBpbiB0aGUgbGlzdC4KKyAqIFRoaXMgaXMgYSBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcmV0dXJucyB0aGUgbGFzdCBkYXRhIGluIHRoZSBsaXN0LCBvciAjTlVMTCBmb3IgYW4gZW1wdHkgbGlzdC4KKyAqLwordm9pZCoKK19kYnVzX2xpc3RfZ2V0X2xhc3QgKERCdXNMaXN0ICoqbGlzdCkKK3sKKyAgaWYgKCpsaXN0ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIGVsc2UKKyAgICByZXR1cm4gKCpsaXN0KS0+cHJldi0+ZGF0YTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBmaXJzdCBkYXRhIGluIHRoZSBsaXN0LgorICogVGhpcyBpcyBhIGNvbnN0YW50LXRpbWUgb3BlcmF0aW9uLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEByZXR1cm5zIHRoZSBmaXJzdCBkYXRhIGluIHRoZSBsaXN0LCBvciAjTlVMTCBmb3IgYW4gZW1wdHkgbGlzdC4KKyAqLwordm9pZCoKK19kYnVzX2xpc3RfZ2V0X2ZpcnN0IChEQnVzTGlzdCAqKmxpc3QpCit7CisgIGlmICgqbGlzdCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICBlbHNlCisgICAgcmV0dXJuICgqbGlzdCktPmRhdGE7Cit9CisKKy8qKgorICogUmVtb3ZlcyB0aGUgZmlyc3QgbGluayBpbiB0aGUgbGlzdCBhbmQgcmV0dXJucyBpdC4gIFRoaXMgaXMgYQorICogY29uc3RhbnQtdGltZSBvcGVyYXRpb24uCisgKgorICogQHBhcmFtIGxpc3QgYWRkcmVzcyBvZiB0aGUgbGlzdCBoZWFkLgorICogQHJldHVybnMgdGhlIGZpcnN0IGxpbmsgaW4gdGhlIGxpc3QsIG9yICNOVUxMIGZvciBhbiBlbXB0eSBsaXN0LgorICovCitEQnVzTGlzdCoKK19kYnVzX2xpc3RfcG9wX2ZpcnN0X2xpbmsgKERCdXNMaXN0ICoqbGlzdCkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAobGlzdCk7CisgIGlmIChsaW5rID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgX2RidXNfbGlzdF91bmxpbmsgKGxpc3QsIGxpbmspOworCisgIHJldHVybiBsaW5rOworfQorCisvKioKKyAqIFJlbW92ZXMgdGhlIGZpcnN0IHZhbHVlIGluIHRoZSBsaXN0IGFuZCByZXR1cm5zIGl0LiAgVGhpcyBpcyBhCisgKiBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcmV0dXJucyB0aGUgZmlyc3QgZGF0YSBpbiB0aGUgbGlzdCwgb3IgI05VTEwgZm9yIGFuIGVtcHR5IGxpc3QuCisgKi8KK3ZvaWQqCitfZGJ1c19saXN0X3BvcF9maXJzdCAoREJ1c0xpc3QgKipsaXN0KQoreworICBEQnVzTGlzdCAqbGluazsKKyAgdm9pZCAqZGF0YTsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChsaXN0KTsKKyAgaWYgKGxpbmsgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgCisgIGRhdGEgPSBsaW5rLT5kYXRhOworICBfZGJ1c19saXN0X3JlbW92ZV9saW5rIChsaXN0LCBsaW5rKTsKKworICByZXR1cm4gZGF0YTsKK30KKworLyoqCisgKiBSZW1vdmVzIHRoZSBsYXN0IHZhbHVlIGluIHRoZSBsaXN0IGFuZCByZXR1cm5zIGl0LiAgVGhpcyBpcyBhCisgKiBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcmV0dXJucyB0aGUgbGFzdCBkYXRhIGluIHRoZSBsaXN0LCBvciAjTlVMTCBmb3IgYW4gZW1wdHkgbGlzdC4KKyAqLwordm9pZCoKK19kYnVzX2xpc3RfcG9wX2xhc3QgKERCdXNMaXN0ICoqbGlzdCkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIHZvaWQgKmRhdGE7CisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbGFzdF9saW5rIChsaXN0KTsKKyAgaWYgKGxpbmsgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgCisgIGRhdGEgPSBsaW5rLT5kYXRhOworICBfZGJ1c19saXN0X3JlbW92ZV9saW5rIChsaXN0LCBsaW5rKTsKKworICByZXR1cm4gZGF0YTsKK30KKworLyoqCisgKiBDb3BpZXMgYSBsaXN0LiBUaGlzIGlzIGEgbGluZWFyLXRpbWUgb3BlcmF0aW9uLiAgSWYgdGhlcmUgaXNuJ3QKKyAqIGVub3VnaCBtZW1vcnkgdG8gY29weSB0aGUgZW50aXJlIGxpc3QsIHRoZSBkZXN0aW5hdGlvbiBsaXN0IHdpbGwgYmUKKyAqIHNldCB0byAjTlVMTC4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBoZWFkIG9mIHRoZSBsaXN0IHRvIGNvcHkuCisgKiBAcGFyYW0gZGVzdCBhZGRyZXNzIHdoZXJlIHRoZSBjb3BpZWQgbGlzdCBzaG91bGQgYmUgcGxhY2VkLgorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5LgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbGlzdF9jb3B5IChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgIERCdXNMaXN0ICoqZGVzdCkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgX2RidXNfYXNzZXJ0IChsaXN0ICE9IGRlc3QpOworCisgICpkZXN0ID0gTlVMTDsKKyAgCisgIGxpbmsgPSAqbGlzdDsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kIChkZXN0LCBsaW5rLT5kYXRhKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIGZyZWUgd2hhdCB3ZSBoYXZlIHNvIGZhciAqLworICAgICAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKGRlc3QpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChsaXN0LCBsaW5rKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogR2V0cyB0aGUgbGVuZ3RoIG9mIGEgbGlzdC4gVGhpcyBpcyBhIGxpbmVhci10aW1lCisgKiBvcGVyYXRpb24uCisgKgorICogQHBhcmFtIGxpc3QgYWRkcmVzcyBvZiB0aGUgaGVhZCBvZiB0aGUgbGlzdAorICogQHJldHVybnMgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0LgorICovCitpbnQKK19kYnVzX2xpc3RfZ2V0X2xlbmd0aCAoREJ1c0xpc3QgKipsaXN0KQoreworICBEQnVzTGlzdCAqbGluazsKKyAgaW50IGxlbmd0aDsKKworICBsZW5ndGggPSAwOworICAKKyAgbGluayA9ICpsaXN0OworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgICsrbGVuZ3RoOworICAgICAgCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChsaXN0LCBsaW5rKTsKKyAgICB9CisKKyAgcmV0dXJuIGxlbmd0aDsKK30KKworLyoqCisgKiBDYWxscyB0aGUgZ2l2ZW4gZnVuY3Rpb24gZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgbGlzdC4gIFRoZQorICogZnVuY3Rpb24gaXMgcGFzc2VkIHRoZSBsaXN0IGVsZW1lbnQgYXMgaXRzIGZpcnN0IGFyZ3VtZW50LCBhbmQgdGhlCisgKiBnaXZlbiBkYXRhIGFzIGl0cyBzZWNvbmQgYXJndW1lbnQuCisgKgorICogQHBhcmFtIGxpc3QgYWRkcmVzcyBvZiB0aGUgaGVhZCBvZiB0aGUgbGlzdC4KKyAqIEBwYXJhbSBmdW5jdGlvbiBmdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGVsZW1lbnQuCisgKiBAcGFyYW0gZGF0YSBleHRyYSBkYXRhIGZvciB0aGUgZnVuY3Rpb24uCisgKiAKKyAqLwordm9pZAorX2RidXNfbGlzdF9mb3JlYWNoIChEQnVzTGlzdCAgICAgICAgICAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgIERCdXNGb3JlYWNoRnVuY3Rpb24gZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgbGluayA9ICpsaXN0OworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChsaXN0LCBsaW5rKTsKKyAgICAgIAorICAgICAgKCogZnVuY3Rpb24pIChsaW5rLT5kYXRhLCBkYXRhKTsKKyAgICAgIAorICAgICAgbGluayA9IG5leHQ7CisgICAgfQorfQorCisvKioKKyAqIENoZWNrIHdoZXRoZXIgbGVuZ3RoIGlzIGV4YWN0bHkgb25lLgorICoKKyAqIEBwYXJhbSBsaXN0IHRoZSBsaXN0CisgKiBAcmV0dXJucyAjVFJVRSBpZiBsZW5ndGggaXMgZXhhY3RseSBvbmUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2xpc3RfbGVuZ3RoX2lzX29uZSAoREJ1c0xpc3QgKipsaXN0KQoreworICByZXR1cm4gKCpsaXN0ICE9IE5VTEwgJiYKKyAgICAgICAgICAoKmxpc3QpLT5uZXh0ID09ICpsaXN0KTsKK30KKworLyoqIEB9ICovCisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIHZvaWQKK3ZlcmlmeV9saXN0IChEQnVzTGlzdCAqKmxpc3QpCit7CisgIERCdXNMaXN0ICpsaW5rOworICBpbnQgbGVuZ3RoOworICAKKyAgbGluayA9ICpsaXN0OworCisgIGlmIChsaW5rID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGlmIChsaW5rLT5uZXh0ID09IGxpbmspCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChsaW5rLT5wcmV2ID09IGxpbmspOworICAgICAgX2RidXNfYXNzZXJ0ICgqbGlzdCA9PSBsaW5rKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbGVuZ3RoID0gMDsKKyAgZG8KKyAgICB7CisgICAgICBsZW5ndGggKz0gMTsKKyAgICAgIF9kYnVzX2Fzc2VydCAobGluay0+cHJldi0+bmV4dCA9PSBsaW5rKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAobGluay0+bmV4dC0+cHJldiA9PSBsaW5rKTsKKyAgICAgIGxpbmsgPSBsaW5rLT5uZXh0OworICAgIH0KKyAgd2hpbGUgKGxpbmsgIT0gKmxpc3QpOworCisgIF9kYnVzX2Fzc2VydCAobGVuZ3RoID09IF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAobGlzdCkpOworCisgIGlmIChsZW5ndGggPT0gMSkKKyAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX2xpc3RfbGVuZ3RoX2lzX29uZSAobGlzdCkpOworICBlbHNlCisgICAgX2RidXNfYXNzZXJ0ICghX2RidXNfbGlzdF9sZW5ndGhfaXNfb25lIChsaXN0KSk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraXNfYXNjZW5kaW5nX3NlcXVlbmNlIChEQnVzTGlzdCAqKmxpc3QpCit7CisgIERCdXNMaXN0ICpsaW5rOworICBpbnQgcHJldjsKKworICBwcmV2ID0gX0RCVVNfSU5UX01JTjsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChsaXN0KTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBpbnQgdiA9IF9EQlVTX1BPSU5URVJfVE9fSU5UIChsaW5rLT5kYXRhKTsKKyAgICAgIAorICAgICAgaWYgKHYgPD0gcHJldikKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBwcmV2ID0gdjsKKyAgICAgIAorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAobGlzdCwgbGluayk7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2lzX2Rlc2NlbmRpbmdfc2VxdWVuY2UgKERCdXNMaXN0ICoqbGlzdCkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIGludCBwcmV2OworCisgIHByZXYgPSBfREJVU19JTlRfTUFYOworICAKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKGxpc3QpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIGludCB2ID0gX0RCVVNfUE9JTlRFUl9UT19JTlQgKGxpbmstPmRhdGEpOworCisgICAgICBpZiAodiA+PSBwcmV2KQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIHByZXYgPSB2OworICAgICAgCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChsaXN0LCBsaW5rKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWxsX2V2ZW5fdmFsdWVzIChEQnVzTGlzdCAqKmxpc3QpCit7CisgIERCdXNMaXN0ICpsaW5rOworICAKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKGxpc3QpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIGludCB2ID0gX0RCVVNfUE9JTlRFUl9UT19JTlQgKGxpbmstPmRhdGEpOworCisgICAgICBpZiAoKHYgJSAyKSAhPSAwKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGxpc3QsIGxpbmspOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithbGxfb2RkX3ZhbHVlcyAoREJ1c0xpc3QgKipsaXN0KQoreworICBEQnVzTGlzdCAqbGluazsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChsaXN0KTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBpbnQgdiA9IF9EQlVTX1BPSU5URVJfVE9fSU5UIChsaW5rLT5kYXRhKTsKKworICAgICAgaWYgKCh2ICUgMikgPT0gMCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChsaXN0LCBsaW5rKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbGlzdHNfZXF1YWwgKERCdXNMaXN0ICoqbGlzdDEsCisgICAgICAgICAgICAgREJ1c0xpc3QgKipsaXN0MikKK3sKKyAgREJ1c0xpc3QgKmxpbmsxOworICBEQnVzTGlzdCAqbGluazI7CisgIAorICBsaW5rMSA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKGxpc3QxKTsKKyAgbGluazIgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChsaXN0Mik7CisgIHdoaWxlIChsaW5rMSAmJiBsaW5rMikKKyAgICB7CisgICAgICBpZiAobGluazEtPmRhdGEgIT0gbGluazItPmRhdGEpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgbGluazEgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGxpc3QxLCBsaW5rMSk7CisgICAgICBsaW5rMiA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAobGlzdDIsIGxpbmsyKTsKKyAgICB9CisKKyAgaWYgKGxpbmsxIHx8IGxpbmsyKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBAaW5ncm91cCBEQnVzTGlzdEludGVybmFscworICogVW5pdCB0ZXN0IGZvciBEQnVzTGlzdAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2xpc3RfdGVzdCAodm9pZCkKK3sKKyAgREJ1c0xpc3QgKmxpc3QxOworICBEQnVzTGlzdCAqbGlzdDI7CisgIERCdXNMaXN0ICpsaW5rMTsKKyAgREJ1c0xpc3QgKmxpbmsyOworICBEQnVzTGlzdCAqY29weTE7CisgIERCdXNMaXN0ICpjb3B5MjsKKyAgaW50IGk7CisgIAorICBsaXN0MSA9IE5VTEw7CisgIGxpc3QyID0gTlVMTDsKKworICAvKiBUZXN0IGFwcGVuZCBhbmQgcHJlcGVuZCAqLworICAKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgMTApCisgICAgeworICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmxpc3QxLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgYWxsb2NhdGUgZm9yIGFwcGVuZCIpOworICAgICAgCisgICAgICBpZiAoIV9kYnVzX2xpc3RfcHJlcGVuZCAoJmxpc3QyLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VudCBub3QgYWxsb2NhdGUgZm9yIHByZXBlbmQiKTsKKyAgICAgICsraTsKKworICAgICAgdmVyaWZ5X2xpc3QgKCZsaXN0MSk7CisgICAgICB2ZXJpZnlfbGlzdCAoJmxpc3QyKTsKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19saXN0X2dldF9sZW5ndGggKCZsaXN0MSkgPT0gaSk7CisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAoJmxpc3QyKSA9PSBpKTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChpc19hc2NlbmRpbmdfc2VxdWVuY2UgKCZsaXN0MSkpOworICBfZGJ1c19hc3NlcnQgKGlzX2Rlc2NlbmRpbmdfc2VxdWVuY2UgKCZsaXN0MikpOworCisgIC8qIFRlc3QgbGlzdCBjbGVhciAqLworICBfZGJ1c19saXN0X2NsZWFyICgmbGlzdDEpOworICBfZGJ1c19saXN0X2NsZWFyICgmbGlzdDIpOworCisgIHZlcmlmeV9saXN0ICgmbGlzdDEpOworICB2ZXJpZnlfbGlzdCAoJmxpc3QyKTsKKworICAvKiBUZXN0IGdldF9maXJzdCwgZ2V0X2xhc3QsIHBvcF9maXJzdCwgcG9wX2xhc3QgKi8KKyAgCisgIGkgPSAwOworICB3aGlsZSAoaSA8IDEwKQorICAgIHsKKyAgICAgIF9kYnVzX2xpc3RfYXBwZW5kICgmbGlzdDEsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSk7CisgICAgICBfZGJ1c19saXN0X3ByZXBlbmQgKCZsaXN0MiwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKTsKKyAgICAgICsraTsKKyAgICB9CisKKyAgLS1pOworICB3aGlsZSAoaSA+PSAwKQorICAgIHsKKyAgICAgIHZvaWQgKmdvdF9kYXRhMTsKKyAgICAgIHZvaWQgKmdvdF9kYXRhMjsKKyAgICAgIAorICAgICAgdm9pZCAqZGF0YTE7CisgICAgICB2b2lkICpkYXRhMjsKKworICAgICAgZ290X2RhdGExID0gX2RidXNfbGlzdF9nZXRfbGFzdCAoJmxpc3QxKTsKKyAgICAgIGdvdF9kYXRhMiA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0ICgmbGlzdDIpOworICAgICAgCisgICAgICBkYXRhMSA9IF9kYnVzX2xpc3RfcG9wX2xhc3QgKCZsaXN0MSk7CisgICAgICBkYXRhMiA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0ICgmbGlzdDIpOworCisgICAgICBfZGJ1c19hc3NlcnQgKGdvdF9kYXRhMSA9PSBkYXRhMSk7CisgICAgICBfZGJ1c19hc3NlcnQgKGdvdF9kYXRhMiA9PSBkYXRhMik7CisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAoX0RCVVNfUE9JTlRFUl9UT19JTlQgKGRhdGExKSA9PSBpKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoX0RCVVNfUE9JTlRFUl9UT19JTlQgKGRhdGEyKSA9PSBpKTsKKworICAgICAgdmVyaWZ5X2xpc3QgKCZsaXN0MSk7CisgICAgICB2ZXJpZnlfbGlzdCAoJmxpc3QyKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChpc19hc2NlbmRpbmdfc2VxdWVuY2UgKCZsaXN0MSkpOworICAgICAgX2RidXNfYXNzZXJ0IChpc19kZXNjZW5kaW5nX3NlcXVlbmNlICgmbGlzdDIpKTsKKyAgICAgIAorICAgICAgLS1pOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGxpc3QxID09IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGxpc3QyID09IE5VTEwpOworCisgIC8qIFRlc3QgZ2V0X2ZpcnN0X2xpbmssIGdldF9sYXN0X2xpbmssIHBvcF9maXJzdF9saW5rLCBwb3BfbGFzdF9saW5rICovCisgIAorICBpID0gMDsKKyAgd2hpbGUgKGkgPCAxMCkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X2FwcGVuZCAoJmxpc3QxLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpOworICAgICAgX2RidXNfbGlzdF9wcmVwZW5kICgmbGlzdDIsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSk7CisgICAgICArK2k7CisgICAgfQorCisgIC0taTsKKyAgd2hpbGUgKGkgPj0gMCkKKyAgICB7CisgICAgICBEQnVzTGlzdCAqZ290X2xpbmsxOworICAgICAgREJ1c0xpc3QgKmdvdF9saW5rMjsKKworICAgICAgREJ1c0xpc3QgKmxpbmsyOworICAgICAgCisgICAgICB2b2lkICpkYXRhMV9pbmRpcmVjdDsKKyAgICAgIHZvaWQgKmRhdGExOworICAgICAgdm9pZCAqZGF0YTI7CisgICAgICAKKyAgICAgIGdvdF9saW5rMSA9IF9kYnVzX2xpc3RfZ2V0X2xhc3RfbGluayAoJmxpc3QxKTsKKyAgICAgIGdvdF9saW5rMiA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZsaXN0Mik7CisKKyAgICAgIGxpbmsyID0gX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayAoJmxpc3QyKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChnb3RfbGluazIgPT0gbGluazIpOworCisgICAgICBkYXRhMV9pbmRpcmVjdCA9IGdvdF9saW5rMS0+ZGF0YTsKKyAgICAgIC8qIHRoaXMgY2FsbCBtYWtlcyBnb3RfbGluazEgaW52YWxpZCAqLworICAgICAgZGF0YTEgPSBfZGJ1c19saXN0X3BvcF9sYXN0ICgmbGlzdDEpOworICAgICAgX2RidXNfYXNzZXJ0IChkYXRhMSA9PSBkYXRhMV9pbmRpcmVjdCk7CisgICAgICBkYXRhMiA9IGxpbmsyLT5kYXRhOworCisgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAobGluazIpOworICAgICAgCisgICAgICBfZGJ1c19hc3NlcnQgKF9EQlVTX1BPSU5URVJfVE9fSU5UIChkYXRhMSkgPT0gaSk7CisgICAgICBfZGJ1c19hc3NlcnQgKF9EQlVTX1BPSU5URVJfVE9fSU5UIChkYXRhMikgPT0gaSk7CisKKyAgICAgIHZlcmlmeV9saXN0ICgmbGlzdDEpOworICAgICAgdmVyaWZ5X2xpc3QgKCZsaXN0Mik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoaXNfYXNjZW5kaW5nX3NlcXVlbmNlICgmbGlzdDEpKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoaXNfZGVzY2VuZGluZ19zZXF1ZW5jZSAoJmxpc3QyKSk7CisgICAgICAKKyAgICAgIC0taTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChsaXN0MSA9PSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChsaXN0MiA9PSBOVUxMKTsKKyAgCisgIC8qIFRlc3QgaXRlcmF0aW9uICovCisgIAorICBpID0gMDsKKyAgd2hpbGUgKGkgPCAxMCkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X2FwcGVuZCAoJmxpc3QxLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpOworICAgICAgX2RidXNfbGlzdF9wcmVwZW5kICgmbGlzdDIsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSk7CisgICAgICArK2k7CisKKyAgICAgIHZlcmlmeV9saXN0ICgmbGlzdDEpOworICAgICAgdmVyaWZ5X2xpc3QgKCZsaXN0Mik7CisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfbGlzdF9nZXRfbGVuZ3RoICgmbGlzdDEpID09IGkpOworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19saXN0X2dldF9sZW5ndGggKCZsaXN0MikgPT0gaSk7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoaXNfYXNjZW5kaW5nX3NlcXVlbmNlICgmbGlzdDEpKTsKKyAgX2RidXNfYXNzZXJ0IChpc19kZXNjZW5kaW5nX3NlcXVlbmNlICgmbGlzdDIpKTsKKworICAtLWk7CisgIGxpbmsyID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmxpc3QyKTsKKyAgd2hpbGUgKGxpbmsyICE9IE5VTEwpCisgICAgeworICAgICAgdmVyaWZ5X2xpc3QgKCZsaW5rMik7IC8qIHByZXRlbmQgdGhpcyBsaW5rIGlzIHRoZSBoZWFkICovCisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAoX0RCVVNfUE9JTlRFUl9UT19JTlQgKGxpbmsyLT5kYXRhKSA9PSBpKTsKKyAgICAgIAorICAgICAgbGluazIgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZsaXN0MiwgbGluazIpOworICAgICAgLS1pOworICAgIH0KKworICBpID0gMDsKKyAgbGluazEgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmbGlzdDEpOworICB3aGlsZSAobGluazEgIT0gTlVMTCkKKyAgICB7CisgICAgICB2ZXJpZnlfbGlzdCAoJmxpbmsxKTsgLyogcHJldGVuZCB0aGlzIGxpbmsgaXMgdGhlIGhlYWQgKi8KKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChfREJVU19QT0lOVEVSX1RPX0lOVCAobGluazEtPmRhdGEpID09IGkpOworICAgICAgCisgICAgICBsaW5rMSA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmxpc3QxLCBsaW5rMSk7CisgICAgICArK2k7CisgICAgfQorCisgIC0taTsKKyAgbGluazEgPSBfZGJ1c19saXN0X2dldF9sYXN0X2xpbmsgKCZsaXN0MSk7CisgIHdoaWxlIChsaW5rMSAhPSBOVUxMKQorICAgIHsKKyAgICAgIHZlcmlmeV9saXN0ICgmbGluazEpOyAvKiBwcmV0ZW5kIHRoaXMgbGluayBpcyB0aGUgaGVhZCAqLworCisgICAgICBfZGJ1c19hc3NlcnQgKF9EQlVTX1BPSU5URVJfVE9fSU5UIChsaW5rMS0+ZGF0YSkgPT0gaSk7CisgICAgICAKKyAgICAgIGxpbmsxID0gX2RidXNfbGlzdF9nZXRfcHJldl9saW5rICgmbGlzdDEsIGxpbmsxKTsKKyAgICAgIC0taTsKKyAgICB9CisKKyAgX2RidXNfbGlzdF9jbGVhciAoJmxpc3QxKTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJmxpc3QyKTsKKworICAvKiBUZXN0IHJlbW92ZSAqLworICAKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgMTApCisgICAgeworICAgICAgX2RidXNfbGlzdF9hcHBlbmQgKCZsaXN0MSwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKTsKKyAgICAgIF9kYnVzX2xpc3RfcHJlcGVuZCAoJmxpc3QyLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpOworICAgICAgKytpOworICAgIH0KKworICAtLWk7CisgIHdoaWxlIChpID49IDApCisgICAgeworICAgICAgaWYgKChpICUgMikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfbGlzdF9yZW1vdmUgKCZsaXN0MSwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKSkKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImVsZW1lbnQgc2hvdWxkIGhhdmUgYmVlbiBpbiBsaXN0Iik7CisgICAgICAgICAgaWYgKCFfZGJ1c19saXN0X3JlbW92ZSAoJmxpc3QyLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpKQorICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZWxlbWVudCBzaG91bGQgaGF2ZSBiZWVuIGluIGxpc3QiKTsKKworICAgICAgICAgIHZlcmlmeV9saXN0ICgmbGlzdDEpOworICAgICAgICAgIHZlcmlmeV9saXN0ICgmbGlzdDIpOworICAgICAgICB9CisgICAgICAtLWk7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoYWxsX29kZF92YWx1ZXMgKCZsaXN0MSkpOworICBfZGJ1c19hc3NlcnQgKGFsbF9vZGRfdmFsdWVzICgmbGlzdDIpKTsKKworICBfZGJ1c19saXN0X2NsZWFyICgmbGlzdDEpOworICBfZGJ1c19saXN0X2NsZWFyICgmbGlzdDIpOworCisgIC8qIHRlc3QgcmVtb3ZpbmcgdGhlIG90aGVyIGhhbGYgb2YgdGhlIGVsZW1lbnRzICovCisgIAorICBpID0gMDsKKyAgd2hpbGUgKGkgPCAxMCkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X2FwcGVuZCAoJmxpc3QxLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpOworICAgICAgX2RidXNfbGlzdF9wcmVwZW5kICgmbGlzdDIsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSk7CisgICAgICArK2k7CisgICAgfQorCisgIC0taTsKKyAgd2hpbGUgKGkgPj0gMCkKKyAgICB7CisgICAgICBpZiAoKGkgJSAyKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19saXN0X3JlbW92ZSAoJmxpc3QxLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpKQorICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZWxlbWVudCBzaG91bGQgaGF2ZSBiZWVuIGluIGxpc3QiKTsKKyAgICAgICAgICBpZiAoIV9kYnVzX2xpc3RfcmVtb3ZlICgmbGlzdDIsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSkpCisgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJlbGVtZW50IHNob3VsZCBoYXZlIGJlZW4gaW4gbGlzdCIpOworCisgICAgICAgICAgdmVyaWZ5X2xpc3QgKCZsaXN0MSk7CisgICAgICAgICAgdmVyaWZ5X2xpc3QgKCZsaXN0Mik7CisgICAgICAgIH0KKyAgICAgIC0taTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChhbGxfZXZlbl92YWx1ZXMgKCZsaXN0MSkpOworICBfZGJ1c19hc3NlcnQgKGFsbF9ldmVuX3ZhbHVlcyAoJmxpc3QyKSk7CisKKyAgLyogY2xlYXIgbGlzdCB1c2luZyByZW1vdmVfbGluayAqLworICB3aGlsZSAobGlzdDEgIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X3JlbW92ZV9saW5rICgmbGlzdDEsIGxpc3QxKTsKKyAgICAgIHZlcmlmeV9saXN0ICgmbGlzdDEpOworICAgIH0KKyAgd2hpbGUgKGxpc3QyICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAoJmxpc3QyLCBsaXN0Mik7CisgICAgICB2ZXJpZnlfbGlzdCAoJmxpc3QyKTsKKyAgICB9CisKKyAgLyogVGVzdCByZW1vdmUgbGluayBtb3JlIGdlbmVyYWxseSAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAxMCkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X2FwcGVuZCAoJmxpc3QxLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpOworICAgICAgX2RidXNfbGlzdF9wcmVwZW5kICgmbGlzdDIsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSk7CisgICAgICArK2k7CisgICAgfQorCisgIC0taTsKKyAgbGluazIgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmbGlzdDIpOworICB3aGlsZSAobGluazIgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmxpc3QyLCBsaW5rMik7CisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAoX0RCVVNfUE9JTlRFUl9UT19JTlQgKGxpbmsyLT5kYXRhKSA9PSBpKTsKKworICAgICAgaWYgKChpICUgMikgPT0gMCkKKyAgICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAoJmxpc3QyLCBsaW5rMik7CisKKyAgICAgIHZlcmlmeV9saXN0ICgmbGlzdDIpOworICAgICAgCisgICAgICBsaW5rMiA9IG5leHQ7CisgICAgICAtLWk7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoYWxsX29kZF92YWx1ZXMgKCZsaXN0MikpOyAgCisgIF9kYnVzX2xpc3RfY2xlYXIgKCZsaXN0Mik7CisgIAorICBpID0gMDsKKyAgbGluazEgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmbGlzdDEpOworICB3aGlsZSAobGluazEgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmxpc3QxLCBsaW5rMSk7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoX0RCVVNfUE9JTlRFUl9UT19JTlQgKGxpbmsxLT5kYXRhKSA9PSBpKTsKKworICAgICAgaWYgKChpICUgMikgIT0gMCkKKyAgICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAoJmxpc3QxLCBsaW5rMSk7CisKKyAgICAgIHZlcmlmeV9saXN0ICgmbGlzdDEpOworICAgICAgCisgICAgICBsaW5rMSA9IG5leHQ7CisgICAgICArK2k7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoYWxsX2V2ZW5fdmFsdWVzICgmbGlzdDEpKTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJmxpc3QxKTsKKworICAvKiBUZXN0IGNvcHlpbmcgYSBsaXN0ICovCisgIGkgPSAwOworICB3aGlsZSAoaSA8IDEwKQorICAgIHsKKyAgICAgIF9kYnVzX2xpc3RfYXBwZW5kICgmbGlzdDEsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSk7CisgICAgICBfZGJ1c19saXN0X3ByZXBlbmQgKCZsaXN0MiwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKTsKKyAgICAgICsraTsKKyAgICB9CisKKyAgLyogYmFkIHBvaW50ZXJzLCBiZWNhdXNlIHRoZXkgYXJlIGFsbG93ZWQgaW4gdGhlIGNvcHkgZGVzdCAqLworICBjb3B5MSA9IF9EQlVTX0lOVF9UT19QT0lOVEVSICgweDM0MjIzNCk7CisgIGNvcHkyID0gX0RCVVNfSU5UX1RPX1BPSU5URVIgKDIzKTsKKyAgCisgIF9kYnVzX2xpc3RfY29weSAoJmxpc3QxLCAmY29weTEpOworICB2ZXJpZnlfbGlzdCAoJmxpc3QxKTsKKyAgdmVyaWZ5X2xpc3QgKCZjb3B5MSk7CisgIF9kYnVzX2Fzc2VydCAobGlzdHNfZXF1YWwgKCZsaXN0MSwgJmNvcHkxKSk7CisgIAorICBfZGJ1c19saXN0X2NvcHkgKCZsaXN0MiwgJmNvcHkyKTsKKyAgdmVyaWZ5X2xpc3QgKCZsaXN0Mik7CisgIHZlcmlmeV9saXN0ICgmY29weTIpOworICBfZGJ1c19hc3NlcnQgKGxpc3RzX2VxdWFsICgmbGlzdDIsICZjb3B5MikpOworCisgIC8qIE5vdyB0ZXN0IGNvcHlpbmcgZW1wdHkgbGlzdHMgKi8KKyAgX2RidXNfbGlzdF9jbGVhciAoJmxpc3QxKTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJmxpc3QyKTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJmNvcHkxKTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJmNvcHkyKTsKKyAgCisgIC8qIGJhZCBwb2ludGVycywgYmVjYXVzZSB0aGV5IGFyZSBhbGxvd2VkIGluIHRoZSBjb3B5IGRlc3QgKi8KKyAgY29weTEgPSBfREJVU19JTlRfVE9fUE9JTlRFUiAoMHgzNDIyMzQpOworICBjb3B5MiA9IF9EQlVTX0lOVF9UT19QT0lOVEVSICgyMyk7CisgIAorICBfZGJ1c19saXN0X2NvcHkgKCZsaXN0MSwgJmNvcHkxKTsKKyAgdmVyaWZ5X2xpc3QgKCZsaXN0MSk7CisgIHZlcmlmeV9saXN0ICgmY29weTEpOworICBfZGJ1c19hc3NlcnQgKGxpc3RzX2VxdWFsICgmbGlzdDEsICZjb3B5MSkpOworICAKKyAgX2RidXNfbGlzdF9jb3B5ICgmbGlzdDIsICZjb3B5Mik7CisgIHZlcmlmeV9saXN0ICgmbGlzdDIpOworICB2ZXJpZnlfbGlzdCAoJmNvcHkyKTsKKyAgX2RidXNfYXNzZXJ0IChsaXN0c19lcXVhbCAoJmxpc3QyLCAmY29weTIpKTsKKworICBfZGJ1c19saXN0X2NsZWFyICgmbGlzdDEpOworICBfZGJ1c19saXN0X2NsZWFyICgmbGlzdDIpOworCisgIC8qIGluc2VydF9hZnRlciBvbiBlbXB0eSBsaXN0ICovCisgIF9kYnVzX2xpc3RfaW5zZXJ0X2FmdGVyICgmbGlzdDEsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19JTlRfVE9fUE9JTlRFUiAoMCkpOworICB2ZXJpZnlfbGlzdCAoJmxpc3QxKTsKKworICAvKiBpbnNlcnRpbmcgYWZ0ZXIgZmlyc3QgZWxlbWVudCAqLworICBfZGJ1c19saXN0X2luc2VydF9hZnRlciAoJmxpc3QxLCBsaXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX0lOVF9UT19QT0lOVEVSICgxKSk7CisgIHZlcmlmeV9saXN0ICgmbGlzdDEpOworICBfZGJ1c19hc3NlcnQgKGlzX2FzY2VuZGluZ19zZXF1ZW5jZSAoJmxpc3QxKSk7CisKKyAgLyogaW5zZXJ0aW5nIGF0IHRoZSBlbmQgKi8KKyAgX2RidXNfbGlzdF9pbnNlcnRfYWZ0ZXIgKCZsaXN0MSwgbGlzdDEtPm5leHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19JTlRfVE9fUE9JTlRFUiAoMikpOworICB2ZXJpZnlfbGlzdCAoJmxpc3QxKTsKKyAgX2RidXNfYXNzZXJ0IChpc19hc2NlbmRpbmdfc2VxdWVuY2UgKCZsaXN0MSkpOworCisgIC8qIHVzaW5nIGluc2VydF9hZnRlciB0byBwcmVwZW5kICovCisgIF9kYnVzX2xpc3RfaW5zZXJ0X2FmdGVyICgmbGlzdDEsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19JTlRfVE9fUE9JTlRFUiAoLTEpKTsKKyAgdmVyaWZ5X2xpc3QgKCZsaXN0MSk7CisgIF9kYnVzX2Fzc2VydCAoaXNfYXNjZW5kaW5nX3NlcXVlbmNlICgmbGlzdDEpKTsKKyAgCisgIF9kYnVzX2xpc3RfY2xlYXIgKCZsaXN0MSk7CisKKyAgLyogdXNpbmcgcmVtb3ZlX2xhc3QgKi8KKyAgX2RidXNfbGlzdF9hcHBlbmQgKCZsaXN0MSwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKDIpKTsKKyAgX2RidXNfbGlzdF9hcHBlbmQgKCZsaXN0MSwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKDEpKTsKKyAgX2RidXNfbGlzdF9hcHBlbmQgKCZsaXN0MSwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKDMpKTsKKworICBfZGJ1c19saXN0X3JlbW92ZV9sYXN0ICgmbGlzdDEsIF9EQlVTX0lOVF9UT19QT0lOVEVSICgyKSk7CisgIAorICB2ZXJpZnlfbGlzdCAoJmxpc3QxKTsKKyAgX2RidXNfYXNzZXJ0IChpc19hc2NlbmRpbmdfc2VxdWVuY2UgKCZsaXN0MSkpOworICAKKyAgX2RidXNfbGlzdF9jbGVhciAoJmxpc3QxKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLWxpc3QuaCBiL2RidXMvZGJ1cy9kYnVzLWxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTBkNzM4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtbGlzdC5oCkBAIC0wLDAgKzEsMTAwIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbGlzdC5oIEdlbmVyaWMgbGlua2VkIGxpc3QgdXRpbGl0eSAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19MSVNUX0gKKyNkZWZpbmUgREJVU19MSVNUX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVtb3J5Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXR5cGVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKworREJVU19CRUdJTl9ERUNMUworCitzdHJ1Y3QgREJ1c0xpc3QKK3sKKyAgREJ1c0xpc3QgKnByZXY7IC8qKjwgUHJldmlvdXMgbGlzdCBub2RlLiAqLworICBEQnVzTGlzdCAqbmV4dDsgLyoqPCBOZXh0IGxpc3Qgbm9kZS4gKi8KKyAgdm9pZCAgICAgKmRhdGE7IC8qKjwgRGF0YSBzdG9yZWQgYXQgdGhpcyBlbGVtZW50LiAqLworfTsKK2RidXNfYm9vbF90IF9kYnVzX2xpc3RfYXBwZW5kICAgICAgICAgICAgIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICpkYXRhKTsKK2RidXNfYm9vbF90IF9kYnVzX2xpc3RfcHJlcGVuZCAgICAgICAgICAgIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICpkYXRhKTsKK2RidXNfYm9vbF90IF9kYnVzX2xpc3RfaW5zZXJ0X2JlZm9yZSAgICAgIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICpiZWZvcmVfdGhpc19saW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqZGF0YSk7CitkYnVzX2Jvb2xfdCBfZGJ1c19saXN0X2luc2VydF9hZnRlciAgICAgICAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqYWZ0ZXJfdGhpc19saW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqZGF0YSk7Cit2b2lkICAgICAgICBfZGJ1c19saXN0X2luc2VydF9iZWZvcmVfbGluayAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqYmVmb3JlX3RoaXNfbGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgKmxpbmspOwordm9pZCAgICAgICAgX2RidXNfbGlzdF9pbnNlcnRfYWZ0ZXJfbGluayAgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgKmFmdGVyX3RoaXNfbGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgKmxpbmspOworZGJ1c19ib29sX3QgX2RidXNfbGlzdF9yZW1vdmUgICAgICAgICAgICAgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGEpOworZGJ1c19ib29sX3QgX2RidXNfbGlzdF9yZW1vdmVfbGFzdCAgICAgICAgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGEpOwordm9pZCAgICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAgICAgICAgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgKmxpbmspOworREJ1c0xpc3QqICAgX2RidXNfbGlzdF9maW5kX2xhc3QgICAgICAgICAgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGEpOwordm9pZCAgICAgICAgX2RidXNfbGlzdF9jbGVhciAgICAgICAgICAgICAgKERCdXNMaXN0ICoqbGlzdCk7CitEQnVzTGlzdCogICBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICAgICAoREJ1c0xpc3QgKipsaXN0KTsKK0RCdXNMaXN0KiAgIF9kYnVzX2xpc3RfZ2V0X2xhc3RfbGluayAgICAgIChEQnVzTGlzdCAqKmxpc3QpOwordm9pZCogICAgICAgX2RidXNfbGlzdF9nZXRfbGFzdCAgICAgICAgICAgKERCdXNMaXN0ICoqbGlzdCk7Cit2b2lkKiAgICAgICBfZGJ1c19saXN0X2dldF9maXJzdCAgICAgICAgICAoREJ1c0xpc3QgKipsaXN0KTsKK3ZvaWQqICAgICAgIF9kYnVzX2xpc3RfcG9wX2ZpcnN0ICAgICAgICAgIChEQnVzTGlzdCAqKmxpc3QpOwordm9pZCogICAgICAgX2RidXNfbGlzdF9wb3BfbGFzdCAgICAgICAgICAgKERCdXNMaXN0ICoqbGlzdCk7CitEQnVzTGlzdCogICBfZGJ1c19saXN0X3BvcF9maXJzdF9saW5rICAgICAoREJ1c0xpc3QgKipsaXN0KTsKK2RidXNfYm9vbF90IF9kYnVzX2xpc3RfY29weSAgICAgICAgICAgICAgIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgKipkZXN0KTsKK2ludCAgICAgICAgIF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAgICAgICAgIChEQnVzTGlzdCAqKmxpc3QpOworREJ1c0xpc3QqICAgX2RidXNfbGlzdF9hbGxvY19saW5rICAgICAgICAgKHZvaWQgICAgICAqZGF0YSk7Cit2b2lkICAgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAgICAgICAgICAoREJ1c0xpc3QgICpsaW5rKTsKK3ZvaWQgICAgICAgIF9kYnVzX2xpc3RfdW5saW5rICAgICAgICAgICAgIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICpsaW5rKTsKK3ZvaWQgICAgICAgIF9kYnVzX2xpc3RfYXBwZW5kX2xpbmsgICAgICAgIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICpsaW5rKTsKK3ZvaWQgICAgICAgIF9kYnVzX2xpc3RfcHJlcGVuZF9saW5rICAgICAgIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICpsaW5rKTsKK2RidXNfYm9vbF90IF9kYnVzX2xpc3RfbGVuZ3RoX2lzX29uZSAgICAgIChEQnVzTGlzdCAqKmxpc3QpOworCisKK3ZvaWQgX2RidXNfbGlzdF9mb3JlYWNoIChEQnVzTGlzdCAgICAgICAgICAgICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRm9yZWFjaEZ1bmN0aW9uICAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgKmRhdGEpOworCisjZGVmaW5lIF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayhsaXN0LCBsaW5rKSAoKGxpbmspLT5uZXh0ID09ICoobGlzdCkgPyBOVUxMIDogKGxpbmspLT5uZXh0KQorI2RlZmluZSBfZGJ1c19saXN0X2dldF9wcmV2X2xpbmsobGlzdCwgbGluaykgKChsaW5rKSA9PSAqKGxpc3QpID8gTlVMTCA6IChsaW5rKS0+cHJldikKKworLyogaWYgREJVU19FTkFCTEVfU1RBVFMgKi8KK3ZvaWQgICAgICAgIF9kYnVzX2xpc3RfZ2V0X3N0YXRzICAgICAgICAgIChkYnVzX3VpbnQzMl90ICppbl91c2VfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICppbl9mcmVlX2xpc3RfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICphbGxvY2F0ZWRfcCk7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX0xJU1RfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtbWFjcm9zLmggYi9kYnVzL2RidXMvZGJ1cy1tYWNyb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2QzZWViCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtbWFjcm9zLmgKQEAgLTAsMCArMSwxODggQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tYWNyb3MuaCAgZ2VuZXJpYyBtYWNyb3MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmICFkZWZpbmVkIChEQlVTX0lOU0lERV9EQlVTX0gpICYmICFkZWZpbmVkIChEQlVTX0NPTVBJTEFUSU9OKQorI2Vycm9yICJPbmx5IDxkYnVzL2RidXMuaD4gY2FuIGJlIGluY2x1ZGVkIGRpcmVjdGx5LCB0aGlzIGZpbGUgbWF5IGRpc2FwcGVhciBvciBjaGFuZ2UgY29udGVudHMuIgorI2VuZGlmCisKKyNpZm5kZWYgREJVU19NQUNST1NfSAorI2RlZmluZSBEQlVTX01BQ1JPU19ICisKKyNpZmRlZiAgX19jcGx1c3BsdXMKKyMgIGRlZmluZSBEQlVTX0JFR0lOX0RFQ0xTICBleHRlcm4gIkMiIHsKKyMgIGRlZmluZSBEQlVTX0VORF9ERUNMUyAgICB9CisjZWxzZQorIyAgZGVmaW5lIERCVVNfQkVHSU5fREVDTFMKKyMgIGRlZmluZSBEQlVTX0VORF9ERUNMUworI2VuZGlmCisKKyNpZm5kZWYgVFJVRQorIyAgZGVmaW5lIFRSVUUgMQorI2VuZGlmCisjaWZuZGVmIEZBTFNFCisjICBkZWZpbmUgRkFMU0UgMAorI2VuZGlmCisKKyNpZm5kZWYgTlVMTAorIyAgaWZkZWYgX19jcGx1c3BsdXMKKyMgICAgZGVmaW5lIE5VTEwgICAgICAgICgwTCkKKyMgIGVsc2UgLyogIV9fY3BsdXNwbHVzICovCisjICAgIGRlZmluZSBOVUxMICAgICAgICAoKHZvaWQqKSAwKQorIyAgZW5kaWYgLyogIV9fY3BsdXNwbHVzICovCisjZW5kaWYKKworI2lmICBfX0dOVUNfXyA+IDMgfHwgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPj0gMSkKKyMgIGRlZmluZSBEQlVTX0RFUFJFQ0FURUQgX19hdHRyaWJ1dGVfXyAoKF9fZGVwcmVjYXRlZF9fKSkKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMzAwKQorIyAgZGVmaW5lIERCVVNfREVQUkVDQVRFRCBfX2RlY2xzcGVjKGRlcHJlY2F0ZWQpCisjZWxzZQorIyAgZGVmaW5lIERCVVNfREVQUkVDQVRFRAorI2VuZGlmCisKKyNpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gOCkKKyMgIGRlZmluZSBfREJVU19HTlVDX0VYVEVOU0lPTiBfX2V4dGVuc2lvbl9fCisjZWxzZQorIyAgZGVmaW5lIF9EQlVTX0dOVUNfRVhURU5TSU9OCisjZW5kaWYKKworI2lmICAgICBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPiA0KQorI2RlZmluZSBfREJVU19HTlVDX1BSSU5URiggZm9ybWF0X2lkeCwgYXJnX2lkeCApICAgIFwKKyAgX19hdHRyaWJ1dGVfXygoX19mb3JtYXRfXyAoX19wcmludGZfXywgZm9ybWF0X2lkeCwgYXJnX2lkeCkpKQorI2RlZmluZSBfREJVU19HTlVDX05PUkVUVVJOICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSkKKyNlbHNlICAgLyogIV9fR05VQ19fICovCisjZGVmaW5lIF9EQlVTX0dOVUNfUFJJTlRGKCBmb3JtYXRfaWR4LCBhcmdfaWR4ICkKKyNkZWZpbmUgX0RCVVNfR05VQ19OT1JFVFVSTgorI2VuZGlmICAvKiAhX19HTlVDX18gKi8KKworI2lmICAgIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NikKKyNkZWZpbmUgREJVU19NQUxMT0MgICAgIF9fYXR0cmlidXRlX18oKF9fbWFsbG9jX18pKQorI2Vsc2UKKyNkZWZpbmUgREJVU19NQUxMT0MKKyNlbmRpZgorCisjaWYgICAgIChfX0dOVUNfXyA+IDQpIHx8IChfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDMpCisjZGVmaW5lIERCVVNfQUxMT0NfU0laRSh4KSBfX2F0dHJpYnV0ZV9fKChfX2FsbG9jX3NpemVfXyh4KSkpCisjZGVmaW5lIERCVVNfQUxMT0NfU0laRTIoeCx5KSBfX2F0dHJpYnV0ZV9fKChfX2FsbG9jX3NpemVfXyh4LHkpKSkKKyNlbHNlCisjZGVmaW5lIERCVVNfQUxMT0NfU0laRSh4KQorI2RlZmluZSBEQlVTX0FMTE9DX1NJWkUyKHgseSkKKyNlbmRpZgorCisvKiogQGRlZiBfREJVU19HTlVDX1BSSU5URgorICogdXNlZCB0byB0ZWxsIGdjYyBhYm91dCBwcmludGYgZm9ybWF0IHN0cmluZ3MKKyAqLworLyoqIEBkZWYgX0RCVVNfR05VQ19OT1JFVFVSTgorICogdXNlZCB0byB0ZWxsIGdjYyBhYm91dCBmdW5jdGlvbnMgdGhhdCBuZXZlciByZXR1cm4sIHN1Y2ggYXMgX2RidXNfYWJvcnQoKQorICovCisKKworLyogTm9ybWFsbHkgZG9jcyBhcmUgaW4gLmMgZmlsZXMsIGJ1dCB0aGVyZSBpc24ndCBhIC5jIGZpbGUgZm9yIHRoaXMuICovCisvKioKKyAqIEBkZWZncm91cCBEQnVzTWFjcm9zIFV0aWxpdHkgbWFjcm9zCisgKiBAaW5ncm91cCAgREJ1cworICogQGJyaWVmICNUUlVFLCAjRkFMU0UsICNOVUxMLCBhbmQgc28gb24KKyAqCisgKiBVdGlsaXR5IG1hY3Jvcy4KKyAqCisgKiBAeworICovCisKKy8qKgorICogQGRlZiBEQlVTX0JFR0lOX0RFQ0xTCisgKgorICogTWFjcm8gdXNlZCBwcmlvciB0byBkZWNsYXJpbmcgZnVuY3Rpb25zIGluIHRoZSBELUJ1cyBoZWFkZXIKKyAqIGZpbGVzLiBFeHBhbmRzIHRvICJleHRlcm4gIkMiIiB3aGVuIHVzaW5nIGEgQysrIGNvbXBpbGVyLAorICogYW5kIGV4cGFuZHMgdG8gbm90aGluZyB3aGVuIHVzaW5nIGEgQyBjb21waWxlci4KKyAqCisgKiBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgaW4geW91ciBvd24gY29kZSwgY29uc2lkZXIgaXQKKyAqIEQtQnVzIGludGVybmFsLgorICovCisvKioKKyAqIEBkZWYgREJVU19FTkRfREVDTFMKKyAqCisgKiBNYWNybyB1c2VkIGFmdGVyIGRlY2xhcmluZyBmdW5jdGlvbnMgaW4gdGhlIEQtQnVzIGhlYWRlcgorICogZmlsZXMuIEV4cGFuZHMgdG8gIn0iIHdoZW4gdXNpbmcgYSBDKysgY29tcGlsZXIsCisgKiBhbmQgZXhwYW5kcyB0byBub3RoaW5nIHdoZW4gdXNpbmcgYSBDIGNvbXBpbGVyLgorICoKKyAqIFBsZWFzZSBkb24ndCB1c2UgdGhpcyBpbiB5b3VyIG93biBjb2RlLCBjb25zaWRlciBpdAorICogRC1CdXMgaW50ZXJuYWwuCisgKi8KKy8qKgorICogQGRlZiBUUlVFCisgKgorICogRXhwYW5kcyB0byAiMSIKKyAqLworLyoqCisgKiBAZGVmIEZBTFNFCisgKgorICogRXhwYW5kcyB0byAiMCIKKyAqLworLyoqCisgKiBAZGVmIE5VTEwKKyAqCisgKiBBIG51bGwgcG9pbnRlciwgZGVmaW5lZCBhcHByb3ByaWF0ZWx5IGZvciBDIG9yIEMrKy4KKyAqLworLyoqCisgKiBAZGVmIERCVVNfREVQUkVDQVRFRAorICoKKyAqIFRlbGxzIHRoZSBjb21waWxlciB0byB3YXJuIGFib3V0IGEgZnVuY3Rpb24gb3IgdHlwZSBpZiBpdCdzIHVzZWQuCisgKiBDb2RlIG1hcmtlZCBpbiB0aGlzIHdheSBzaG91bGQgYWxzbyBiZSBlbmNsb3NlZCBpbgorICogQGNvZGUKKyAqICNpZm5kZWYgREJVU19ESVNBQkxFX0RFUFJFQ0FURUQKKyAqICBkZXByZWNhdGVkIHN0dWZmIGhlcmUKKyAqICNlbmRpZgorICogQGVuZGNvZGUKKyAqCisgKiBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgaW4geW91ciBvd24gY29kZSwgY29uc2lkZXIgaXQKKyAqIEQtQnVzIGludGVybmFsLgorICovCisvKioKKyAqIEBkZWYgX0RCVVNfR05VQ19FWFRFTlNJT04KKyAqCisgKiBUZWxscyBnY2Mgbm90IHRvIHdhcm4gYWJvdXQgZXh0ZW5zaW9ucyB0byB0aGUgQyBzdGFuZGFyZCBpbiB0aGUKKyAqIGZvbGxvd2luZyBleHByZXNzaW9uLCBldmVuIGlmIGNvbXBpbGluZyB3aXRoIC1wZWRhbnRpYy4gRG8gbm90IHVzZQorICogdGhpcyBtYWNybyBpbiB5b3VyIG93biBjb2RlOyBwbGVhc2UgY29uc2lkZXIgaXQgdG8gYmUgaW50ZXJuYWwgdG8gbGliZGJ1cy4KKyAqLworCisvKgorICogQGRlZiBEQlVTX0VYUE9SVAorICoKKyAqIERlY2xhcmUgdGhlIGZvbGxvd2luZyBzeW1ib2wgYXMgcHVibGljLiAgVGhpcyBpcyBjdXJyZW50bHkgYSBub29wIG9uCisgKiBwbGF0Zm9ybXMgb3RoZXIgdGhhbiBXaW5kb3dzLgorICovCisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKyMgIGlmIGRlZmluZWQoREJVU19TVEFUSUNfQlVJTEQpCisjICBkZWZpbmUgREJVU19FWFBPUlQKKyMgIGVsaWYgZGVmaW5lZChkYnVzXzFfRVhQT1JUUykKKyMgIGRlZmluZSBEQlVTX0VYUE9SVCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgIGVsc2UKKyMgIGRlZmluZSBEQlVTX0VYUE9SVCBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgIGVuZGlmCisjZWxzZQorI2RlZmluZSBEQlVTX0VYUE9SVAorI2VuZGlmCisKKy8qKiBAfSAqLworCisjZW5kaWYgLyogREJVU19NQUNST1NfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtbWFpbmxvb3AuYyBiL2RidXMvZGJ1cy9kYnVzLW1haW5sb29wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VmNjc2YQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLW1haW5sb29wLmMKQEAgLTAsMCArMSw5NDAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tYWlubG9vcC5jICBNYWluIGxvb3AgdXRpbGl0eQorICoKKyAqIENvcHlyaWdodCDCqSAyMDAzLCAyMDA0ICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgwqkgMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1tYWlubG9vcC5oIgorCisjaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUworCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWhhc2guaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zb2NrZXQtc2V0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXdhdGNoLmg+CisKKyNkZWZpbmUgTUFJTkxPT1BfU1BFVyAwCisKKyNpZiBNQUlOTE9PUF9TUEVXCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCitzdGF0aWMgY29uc3QgY2hhcioKK3dhdGNoX2ZsYWdzX3RvX3N0cmluZyAoaW50IGZsYWdzKQoreworICBjb25zdCBjaGFyICp3YXRjaF90eXBlOworCisgIGlmICgoZmxhZ3MgJiBEQlVTX1dBVENIX1JFQURBQkxFKSAmJgorICAgICAgKGZsYWdzICYgREJVU19XQVRDSF9XUklUQUJMRSkpCisgICAgd2F0Y2hfdHlwZSA9ICJyZWFkd3JpdGUiOworICBlbHNlIGlmIChmbGFncyAmIERCVVNfV0FUQ0hfUkVBREFCTEUpCisgICAgd2F0Y2hfdHlwZSA9ICJyZWFkIjsKKyAgZWxzZSBpZiAoZmxhZ3MgJiBEQlVTX1dBVENIX1dSSVRBQkxFKQorICAgIHdhdGNoX3R5cGUgPSAid3JpdGUiOworICBlbHNlCisgICAgd2F0Y2hfdHlwZSA9ICJub3QgcmVhZCBvciB3cml0ZSI7CisgIHJldHVybiB3YXRjaF90eXBlOworfQorI2VuZGlmIC8qIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERSAqLworI2VuZGlmIC8qIE1BSU5MT09QX1NQRVcgKi8KKworc3RydWN0IERCdXNMb29wCit7CisgIGludCByZWZjb3VudDsKKyAgLyoqIGZkID0+IGRidXNfbWFsbG9jJ2QgREJ1c0xpc3QgKiogb2YgcmVmZXJlbmNlcyB0byBEQnVzV2F0Y2ggKi8KKyAgREJ1c0hhc2hUYWJsZSAqd2F0Y2hlczsKKyAgREJ1c1NvY2tldFNldCAqc29ja2V0X3NldDsKKyAgREJ1c0xpc3QgKnRpbWVvdXRzOworICBpbnQgY2FsbGJhY2tfbGlzdF9zZXJpYWw7CisgIGludCB3YXRjaF9jb3VudDsKKyAgaW50IHRpbWVvdXRfY291bnQ7CisgIGludCBkZXB0aDsgLyoqPCBudW1iZXIgb2YgcmVjdXJzaXZlIHJ1bnMgKi8KKyAgREJ1c0xpc3QgKm5lZWRfZGlzcGF0Y2g7CisgIC8qKiBUUlVFIGlmIHdlIHdpbGwgc2tpcCBhIHdhdGNoIG5leHQgdGltZSBiZWNhdXNlIGl0IHdhcyBPT007IGJlY29tZXMKKyAgICogRkFMU0UgYmV0d2VlbiBwb2xsaW5nLCBhbmQgZGVhbGluZyB3aXRoIHRoZSByZXN1bHRzIG9mIHRoZSBwb2xsICovCisgIHVuc2lnbmVkIG9vbV93YXRjaF9wZW5kaW5nIDogMTsKK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIERCdXNUaW1lb3V0ICp0aW1lb3V0OworICB1bnNpZ25lZCBsb25nIGxhc3RfdHZfc2VjOworICB1bnNpZ25lZCBsb25nIGxhc3RfdHZfdXNlYzsKK30gVGltZW91dENhbGxiYWNrOworCisjZGVmaW5lIFRJTUVPVVRfQ0FMTEJBQ0soY2FsbGJhY2spICgoVGltZW91dENhbGxiYWNrKiljYWxsYmFjaykKKworc3RhdGljIFRpbWVvdXRDYWxsYmFjayoKK3RpbWVvdXRfY2FsbGJhY2tfbmV3IChEQnVzVGltZW91dCAgICAgICAgICp0aW1lb3V0KQoreworICBUaW1lb3V0Q2FsbGJhY2sgKmNiOworCisgIGNiID0gZGJ1c19uZXcgKFRpbWVvdXRDYWxsYmFjaywgMSk7CisgIGlmIChjYiA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGNiLT50aW1lb3V0ID0gdGltZW91dDsKKyAgX2RidXNfZ2V0X21vbm90b25pY190aW1lICgmY2ItPmxhc3RfdHZfc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYi0+bGFzdF90dl91c2VjKTsKKyAgcmV0dXJuIGNiOworfQorCitzdGF0aWMgdm9pZAordGltZW91dF9jYWxsYmFja19mcmVlIChUaW1lb3V0Q2FsbGJhY2sgKmNiKQoreworICBkYnVzX2ZyZWUgKGNiKTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfd2F0Y2hfdGFibGVfZW50cnkgKHZvaWQgKmRhdGEpCit7CisgIERCdXNMaXN0ICoqd2F0Y2hlcyA9IGRhdGE7CisgIERCdXNXYXRjaCAqd2F0Y2g7CisKKyAgLyogREJ1c0hhc2hUYWJsZSBzb21ldGltZXMgY2FsbHMgZnJlZV9mdW5jdGlvbihOVUxMKSBldmVuIGlmIHlvdSBuZXZlcgorICAgKiBoYXZlIE5VTEwgYXMgYSB2YWx1ZSAqLworICBpZiAod2F0Y2hlcyA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBmb3IgKHdhdGNoID0gX2RidXNfbGlzdF9wb3BfZmlyc3QgKHdhdGNoZXMpOworICAgICAgd2F0Y2ggIT0gTlVMTDsKKyAgICAgIHdhdGNoID0gX2RidXNfbGlzdF9wb3BfZmlyc3QgKHdhdGNoZXMpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhdGNoX3VucmVmICh3YXRjaCk7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoKndhdGNoZXMgPT0gTlVMTCk7CisgIGRidXNfZnJlZSAod2F0Y2hlcyk7Cit9CisKK0RCdXNMb29wKgorX2RidXNfbG9vcF9uZXcgKHZvaWQpCit7CisgIERCdXNMb29wICpsb29wOworCisgIGxvb3AgPSBkYnVzX25ldzAgKERCdXNMb29wLCAxKTsKKyAgaWYgKGxvb3AgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBsb29wLT53YXRjaGVzID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9JTlQsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV93YXRjaF90YWJsZV9lbnRyeSk7CisKKyAgbG9vcC0+c29ja2V0X3NldCA9IF9kYnVzX3NvY2tldF9zZXRfbmV3ICgwKTsKKworICBpZiAobG9vcC0+d2F0Y2hlcyA9PSBOVUxMIHx8IGxvb3AtPnNvY2tldF9zZXQgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAobG9vcC0+d2F0Y2hlcyAhPSBOVUxMKQorICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChsb29wLT53YXRjaGVzKTsKKworICAgICAgaWYgKGxvb3AtPnNvY2tldF9zZXQgIT0gTlVMTCkKKyAgICAgICAgX2RidXNfc29ja2V0X3NldF9mcmVlIChsb29wLT5zb2NrZXRfc2V0KTsKKworICAgICAgZGJ1c19mcmVlIChsb29wKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBsb29wLT5yZWZjb3VudCA9IDE7CisKKyAgcmV0dXJuIGxvb3A7Cit9CisKK0RCdXNMb29wICoKK19kYnVzX2xvb3BfcmVmIChEQnVzTG9vcCAqbG9vcCkKK3sKKyAgX2RidXNfYXNzZXJ0IChsb29wICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGxvb3AtPnJlZmNvdW50ID4gMCk7CisKKyAgbG9vcC0+cmVmY291bnQgKz0gMTsKKworICByZXR1cm4gbG9vcDsKK30KKwordm9pZAorX2RidXNfbG9vcF91bnJlZiAoREJ1c0xvb3AgKmxvb3ApCit7CisgIF9kYnVzX2Fzc2VydCAobG9vcCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChsb29wLT5yZWZjb3VudCA+IDApOworCisgIGxvb3AtPnJlZmNvdW50IC09IDE7CisgIGlmIChsb29wLT5yZWZjb3VudCA9PSAwKQorICAgIHsKKyAgICAgIHdoaWxlIChsb29wLT5uZWVkX2Rpc3BhdGNoKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBfZGJ1c19saXN0X3BvcF9maXJzdCAoJmxvb3AtPm5lZWRfZGlzcGF0Y2gpOworCisgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChsb29wLT53YXRjaGVzKTsKKyAgICAgIF9kYnVzX3NvY2tldF9zZXRfZnJlZSAobG9vcC0+c29ja2V0X3NldCk7CisgICAgICBkYnVzX2ZyZWUgKGxvb3ApOworICAgIH0KK30KKworc3RhdGljIERCdXNMaXN0ICoqCitlbnN1cmVfd2F0Y2hfdGFibGVfZW50cnkgKERCdXNMb29wICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgZmQpCit7CisgIERCdXNMaXN0ICoqd2F0Y2hlczsKKworICB3YXRjaGVzID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfaW50IChsb29wLT53YXRjaGVzLCBmZCk7CisKKyAgaWYgKHdhdGNoZXMgPT0gTlVMTCkKKyAgICB7CisgICAgICB3YXRjaGVzID0gZGJ1c19uZXcwIChEQnVzTGlzdCAqLCAxKTsKKworICAgICAgaWYgKHdhdGNoZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIHdhdGNoZXM7CisKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfaW50IChsb29wLT53YXRjaGVzLCBmZCwgd2F0Y2hlcykpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHdhdGNoZXMpOworICAgICAgICAgIHdhdGNoZXMgPSBOVUxMOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiB3YXRjaGVzOworfQorCitzdGF0aWMgdm9pZAorY3VsbF93YXRjaGVzX2Zvcl9pbnZhbGlkX2ZkIChEQnVzTG9vcCAgKmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgZmQpCit7CisgIERCdXNMaXN0ICpsaW5rOworICBEQnVzTGlzdCAqKndhdGNoZXM7CisKKyAgX2RidXNfd2FybiAoImludmFsaWQgcmVxdWVzdCwgc29ja2V0IGZkICVkIG5vdCBvcGVuXG4iLCBmZCk7CisgIHdhdGNoZXMgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9pbnQgKGxvb3AtPndhdGNoZXMsIGZkKTsKKworICBpZiAod2F0Y2hlcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZvciAobGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKHdhdGNoZXMpOworICAgICAgICAgIGxpbmsgIT0gTlVMTDsKKyAgICAgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICh3YXRjaGVzLCBsaW5rKSkKKyAgICAgICAgX2RidXNfd2F0Y2hfaW52YWxpZGF0ZSAobGluay0+ZGF0YSk7CisgICAgfQorCisgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX2ludCAobG9vcC0+d2F0Y2hlcywgZmQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2djX3dhdGNoX3RhYmxlX2VudHJ5IChEQnVzTG9vcCAgKmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgKip3YXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgZmQpCit7CisgIC8qIElmIHdhdGNoZXMgaXMgYWxyZWFkeSBOVUxMIHdlIGhhdmUgbm90aGluZyB0byBkbyAqLworICBpZiAod2F0Y2hlcyA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBXZSBjYW4ndCBHQyBoYXNoIHRhYmxlIGVudHJpZXMgaWYgdGhleSdyZSBub24tZW1wdHkgbGlzdHMgKi8KKyAgaWYgKCp3YXRjaGVzICE9IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX2ludCAobG9vcC0+d2F0Y2hlcywgZmQpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3JlZnJlc2hfd2F0Y2hlc19mb3JfZmQgKERCdXNMb29wICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICoqd2F0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgZmQpCit7CisgIERCdXNMaXN0ICpsaW5rOworICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwOworICBkYnVzX2Jvb2xfdCBpbnRlcmVzdGVkID0gRkFMU0U7CisKKyAgX2RidXNfYXNzZXJ0IChmZCAhPSAtMSk7CisKKyAgaWYgKHdhdGNoZXMgPT0gTlVMTCkKKyAgICB3YXRjaGVzID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfaW50IChsb29wLT53YXRjaGVzLCBmZCk7CisKKyAgLyogd2UgYWxsb2NhdGVkIHRoaXMgaW4gdGhlIGZpcnN0IF9kYnVzX2xvb3BfYWRkX3dhdGNoIGZvciB0aGUgZmQsIGFuZCBrZWVwCisgICAqIGl0IHVudGlsIHRoZXJlIGFyZSBub25lIGxlZnQgKi8KKyAgX2RidXNfYXNzZXJ0ICh3YXRjaGVzICE9IE5VTEwpOworCisgIGZvciAobGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKHdhdGNoZXMpOworICAgICAgbGluayAhPSBOVUxMOworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAod2F0Y2hlcywgbGluaykpCisgICAgeworICAgICAgaWYgKGRidXNfd2F0Y2hfZ2V0X2VuYWJsZWQgKGxpbmstPmRhdGEpICYmCisgICAgICAgICAgIV9kYnVzX3dhdGNoX2dldF9vb21fbGFzdF90aW1lIChsaW5rLT5kYXRhKSkKKyAgICAgICAgeworICAgICAgICAgIGZsYWdzIHw9IGRidXNfd2F0Y2hfZ2V0X2ZsYWdzIChsaW5rLT5kYXRhKTsKKyAgICAgICAgICBpbnRlcmVzdGVkID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoaW50ZXJlc3RlZCkKKyAgICBfZGJ1c19zb2NrZXRfc2V0X2VuYWJsZSAobG9vcC0+c29ja2V0X3NldCwgZmQsIGZsYWdzKTsKKyAgZWxzZQorICAgIF9kYnVzX3NvY2tldF9zZXRfZGlzYWJsZSAobG9vcC0+c29ja2V0X3NldCwgZmQpOworfQorCitkYnVzX2Jvb2xfdAorX2RidXNfbG9vcF9hZGRfd2F0Y2ggKERCdXNMb29wICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggKndhdGNoKQoreworICBpbnQgZmQ7CisgIERCdXNMaXN0ICoqd2F0Y2hlczsKKworICBmZCA9IGRidXNfd2F0Y2hfZ2V0X3NvY2tldCAod2F0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZkICE9IC0xKTsKKworICB3YXRjaGVzID0gZW5zdXJlX3dhdGNoX3RhYmxlX2VudHJ5IChsb29wLCBmZCk7CisKKyAgaWYgKHdhdGNoZXMgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAod2F0Y2hlcywgX2RidXNfd2F0Y2hfcmVmICh3YXRjaCkpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhdGNoX3VucmVmICh3YXRjaCk7CisgICAgICBnY193YXRjaF90YWJsZV9lbnRyeSAobG9vcCwgd2F0Y2hlcywgZmQpOworCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChfZGJ1c19saXN0X2xlbmd0aF9pc19vbmUgKHdhdGNoZXMpKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc29ja2V0X3NldF9hZGQgKGxvb3AtPnNvY2tldF9zZXQsIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c193YXRjaF9nZXRfZmxhZ3MgKHdhdGNoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfd2F0Y2hfZ2V0X2VuYWJsZWQgKHdhdGNoKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9pbnQgKGxvb3AtPndhdGNoZXMsIGZkKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiB3ZSdyZSBtb2RpZnlpbmcsIG5vdCBhZGRpbmcsIHdoaWNoIGNhbid0IGZhaWwgd2l0aCBPT00gKi8KKyAgICAgIHJlZnJlc2hfd2F0Y2hlc19mb3JfZmQgKGxvb3AsIHdhdGNoZXMsIGZkKTsKKyAgICB9CisKKyAgbG9vcC0+Y2FsbGJhY2tfbGlzdF9zZXJpYWwgKz0gMTsKKyAgbG9vcC0+d2F0Y2hfY291bnQgKz0gMTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQKK19kYnVzX2xvb3BfdG9nZ2xlX3dhdGNoIChEQnVzTG9vcCAgICAgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICAqd2F0Y2gpCit7CisgIHJlZnJlc2hfd2F0Y2hlc19mb3JfZmQgKGxvb3AsIE5VTEwsIGRidXNfd2F0Y2hfZ2V0X3NvY2tldCAod2F0Y2gpKTsKK30KKwordm9pZAorX2RidXNfbG9vcF9yZW1vdmVfd2F0Y2ggKERCdXNMb29wICAgICAgICAgKmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAgICAqd2F0Y2gpCit7CisgIERCdXNMaXN0ICoqd2F0Y2hlczsKKyAgREJ1c0xpc3QgKmxpbms7CisgIGludCBmZDsKKworICAvKiBUaGlzIHJlbGllcyBvbiBwZW9wbGUgcmVtb3Zpbmcgd2F0Y2hlcyBiZWZvcmUgdGhleSBpbnZhbGlkYXRlIHRoZW0sCisgICAqIHdoaWNoIGhhcyBiZWVuIHNhZmUgc2luY2UgZmQubyAjMzMzMzYgd2FzIGZpeGVkLiBBc3NlcnQgYWJvdXQgaXQKKyAgICogc28gd2UgZG9uJ3QgcmVncmVzcy4gKi8KKyAgZmQgPSBkYnVzX3dhdGNoX2dldF9zb2NrZXQgKHdhdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmZCAhPSAtMSk7CisKKyAgd2F0Y2hlcyA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX2ludCAobG9vcC0+d2F0Y2hlcywgZmQpOworCisgIGlmICh3YXRjaGVzICE9IE5VTEwpCisgICAgeworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKHdhdGNoZXMpOworICAgICAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICh3YXRjaGVzLCBsaW5rKTsKKyAgICAgICAgICBEQnVzV2F0Y2ggKnRoaXMgPSBsaW5rLT5kYXRhOworCisgICAgICAgICAgaWYgKHRoaXMgPT0gd2F0Y2gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKHdhdGNoZXMsIGxpbmspOworICAgICAgICAgICAgICBsb29wLT5jYWxsYmFja19saXN0X3NlcmlhbCArPSAxOworICAgICAgICAgICAgICBsb29wLT53YXRjaF9jb3VudCAtPSAxOworICAgICAgICAgICAgICBfZGJ1c193YXRjaF91bnJlZiAodGhpcyk7CisKKyAgICAgICAgICAgICAgLyogaWYgdGhhdCB3YXMgdGhlIGxhc3Qgd2F0Y2ggZm9yIHRoYXQgZmQsIGRyb3AgdGhlIGhhc2ggdGFibGUKKyAgICAgICAgICAgICAgICogZW50cnksIGFuZCBzdG9wIHJlc2VydmluZyBzcGFjZSBmb3IgaXQgaW4gdGhlIHNvY2tldCBzZXQgKi8KKyAgICAgICAgICAgICAgaWYgKGdjX3dhdGNoX3RhYmxlX2VudHJ5IChsb29wLCB3YXRjaGVzLCBmZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2RidXNfc29ja2V0X3NldF9yZW1vdmUgKGxvb3AtPnNvY2tldF9zZXQsIGZkKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgbGluayA9IG5leHQ7CisgICAgICAgICB9CisgICAgIH0KKworICBfZGJ1c193YXJuICgiY291bGQgbm90IGZpbmQgd2F0Y2ggJXAgdG8gcmVtb3ZlXG4iLCB3YXRjaCk7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19sb29wX2FkZF90aW1lb3V0IChEQnVzTG9vcCAgICAgICAgICAgKmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dCAgICAgICAgKnRpbWVvdXQpCit7CisgIFRpbWVvdXRDYWxsYmFjayAqdGNiOworCisgIHRjYiA9IHRpbWVvdXRfY2FsbGJhY2tfbmV3ICh0aW1lb3V0KTsKKyAgaWYgKHRjYiA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoX2RidXNfbGlzdF9hcHBlbmQgKCZsb29wLT50aW1lb3V0cywgdGNiKSkKKyAgICB7CisgICAgICBsb29wLT5jYWxsYmFja19saXN0X3NlcmlhbCArPSAxOworICAgICAgbG9vcC0+dGltZW91dF9jb3VudCArPSAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHRpbWVvdXRfY2FsbGJhY2tfZnJlZSAodGNiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKwordm9pZAorX2RidXNfbG9vcF9yZW1vdmVfdGltZW91dCAoREJ1c0xvb3AgICAgICAgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgICAgICp0aW1lb3V0KQoreworICBEQnVzTGlzdCAqbGluazsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmbG9vcC0+dGltZW91dHMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmbG9vcC0+dGltZW91dHMsIGxpbmspOworICAgICAgVGltZW91dENhbGxiYWNrICp0aGlzID0gbGluay0+ZGF0YTsKKworICAgICAgaWYgKHRoaXMtPnRpbWVvdXQgPT0gdGltZW91dCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKCZsb29wLT50aW1lb3V0cywgbGluayk7CisgICAgICAgICAgbG9vcC0+Y2FsbGJhY2tfbGlzdF9zZXJpYWwgKz0gMTsKKyAgICAgICAgICBsb29wLT50aW1lb3V0X2NvdW50IC09IDE7CisgICAgICAgICAgdGltZW91dF9jYWxsYmFja19mcmVlICh0aGlzKTsKKworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisKKyAgX2RidXNfd2FybiAoImNvdWxkIG5vdCBmaW5kIHRpbWVvdXQgJXAgdG8gcmVtb3ZlXG4iLCB0aW1lb3V0KTsKK30KKworLyogQ29udm9sdXRpb25zIGZyb20gR0xpYiwgdGhlcmUgcmVhbGx5IG11c3QgYmUgYSBiZXR0ZXIgd2F5CisgKiB0byBkbyB0aGlzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3RpbWVvdXQgKHVuc2lnbmVkIGxvbmcgICAgdHZfc2VjLAorICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICB0dl91c2VjLAorICAgICAgICAgICAgICAgVGltZW91dENhbGxiYWNrICp0Y2IsCisgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgKnRpbWVvdXQpCit7CisgIGxvbmcgc2VjX3JlbWFpbmluZzsKKyAgbG9uZyBtc2VjX3JlbWFpbmluZzsKKyAgdW5zaWduZWQgbG9uZyBleHBpcmF0aW9uX3R2X3NlYzsKKyAgdW5zaWduZWQgbG9uZyBleHBpcmF0aW9uX3R2X3VzZWM7CisgIGxvbmcgaW50ZXJ2YWxfc2Vjb25kczsKKyAgbG9uZyBpbnRlcnZhbF9taWxsaXNlY29uZHM7CisgIGludCBpbnRlcnZhbDsKKworICAvKiBJJ20gcHJldHR5IHN1cmUgdGhpcyBmdW5jdGlvbiBjb3VsZCBzdWNrIChhIGxvdCkgbGVzcyAqLworICAKKyAgaW50ZXJ2YWwgPSBkYnVzX3RpbWVvdXRfZ2V0X2ludGVydmFsICh0Y2ItPnRpbWVvdXQpOworICAKKyAgaW50ZXJ2YWxfc2Vjb25kcyA9IGludGVydmFsIC8gMTAwMEw7CisgIGludGVydmFsX21pbGxpc2Vjb25kcyA9IGludGVydmFsICUgMTAwMEw7CisgIAorICBleHBpcmF0aW9uX3R2X3NlYyA9IHRjYi0+bGFzdF90dl9zZWMgKyBpbnRlcnZhbF9zZWNvbmRzOworICBleHBpcmF0aW9uX3R2X3VzZWMgPSB0Y2ItPmxhc3RfdHZfdXNlYyArIGludGVydmFsX21pbGxpc2Vjb25kcyAqIDEwMDA7CisgIGlmIChleHBpcmF0aW9uX3R2X3VzZWMgPj0gMTAwMDAwMCkKKyAgICB7CisgICAgICBleHBpcmF0aW9uX3R2X3VzZWMgLT0gMTAwMDAwMDsKKyAgICAgIGV4cGlyYXRpb25fdHZfc2VjICs9IDE7CisgICAgfQorICAKKyAgc2VjX3JlbWFpbmluZyA9IGV4cGlyYXRpb25fdHZfc2VjIC0gdHZfc2VjOworICAvKiBuZWVkIHRvIGZvcmNlIHRoaXMgdG8gYmUgc2lnbmVkLCBhcyBpdCBpcyBpbnRlbmRlZCB0byBzb21ldGltZXMKKyAgICogcHJvZHVjZSBhIG5lZ2F0aXZlIHJlc3VsdAorICAgKi8KKyAgbXNlY19yZW1haW5pbmcgPSAoKGxvbmcpIGV4cGlyYXRpb25fdHZfdXNlYyAtIChsb25nKSB0dl91c2VjKSAvIDEwMDBMOworCisjaWYgTUFJTkxPT1BfU1BFVworICBfZGJ1c192ZXJib3NlICgiSW50ZXJ2YWwgaXMgJWxkIHNlY29uZHMgJWxkIG1zZWNzXG4iLAorICAgICAgICAgICAgICAgICBpbnRlcnZhbF9zZWNvbmRzLAorICAgICAgICAgICAgICAgICBpbnRlcnZhbF9taWxsaXNlY29uZHMpOworICBfZGJ1c192ZXJib3NlICgiTm93IGlzICAlbHUgc2Vjb25kcyAlbHUgdXNlY3NcbiIsCisgICAgICAgICAgICAgICAgIHR2X3NlYywgdHZfdXNlYyk7CisgIF9kYnVzX3ZlcmJvc2UgKCJMYXN0IGlzICVsdSBzZWNvbmRzICVsdSB1c2Vjc1xuIiwKKyAgICAgICAgICAgICAgICAgdGNiLT5sYXN0X3R2X3NlYywgdGNiLT5sYXN0X3R2X3VzZWMpOworICBfZGJ1c192ZXJib3NlICgiRXhwIGlzICAlbHUgc2Vjb25kcyAlbHUgdXNlY3NcbiIsCisgICAgICAgICAgICAgICAgIGV4cGlyYXRpb25fdHZfc2VjLCBleHBpcmF0aW9uX3R2X3VzZWMpOworICBfZGJ1c192ZXJib3NlICgiUHJlLWNvcnJlY3Rpb24sIHNlY19yZW1haW5pbmcgJWxkIG1zZWNfcmVtYWluaW5nICVsZFxuIiwKKyAgICAgICAgICAgICAgICAgc2VjX3JlbWFpbmluZywgbXNlY19yZW1haW5pbmcpOworI2VuZGlmCisgIAorICAvKiBXZSBkbyB0aGUgZm9sbG93aW5nIGluIGEgcmF0aGVyIGNvbnZvbHV0ZWQgZmFzaGlvbiB0byBkZWFsIHdpdGgKKyAgICogdGhlIGZhY3QgdGhhdCB3ZSBkb24ndCBoYXZlIGFuIGludGVncmFsIHR5cGUgYmlnIGVub3VnaCB0byBob2xkCisgICAqIHRoZSBkaWZmZXJlbmNlIG9mIHR3byB0aW1ldmFscyBpbiBtaWxsaXNlY29uZHMuCisgICAqLworICBpZiAoc2VjX3JlbWFpbmluZyA8IDAgfHwgKHNlY19yZW1haW5pbmcgPT0gMCAmJiBtc2VjX3JlbWFpbmluZyA8IDApKQorICAgIHsKKyAgICAgICp0aW1lb3V0ID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAobXNlY19yZW1haW5pbmcgPCAwKQorCXsKKwkgIG1zZWNfcmVtYWluaW5nICs9IDEwMDA7CisJICBzZWNfcmVtYWluaW5nIC09IDE7CisJfQorCisgICAgICBpZiAoc2VjX3JlbWFpbmluZyA+IChfREJVU19JTlRfTUFYIC8gMTAwMCkgfHwKKyAgICAgICAgICBtc2VjX3JlbWFpbmluZyA+IF9EQlVTX0lOVF9NQVgpCisgICAgICAgICp0aW1lb3V0ID0gX0RCVVNfSU5UX01BWDsKKyAgICAgIGVsc2UKKyAgICAgICAgKnRpbWVvdXQgPSBzZWNfcmVtYWluaW5nICogMTAwMCArIG1zZWNfcmVtYWluaW5nOyAgICAgICAgCisgICAgfQorCisgIGlmICgqdGltZW91dCA+IGludGVydmFsKQorICAgIHsKKyAgICAgIC8qIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHN5c3RlbSBjbG9jayBwcm9iYWJseSBtb3ZlZCBiYWNrd2FyZCAqLworICAgICAgX2RidXNfdmVyYm9zZSAoIlN5c3RlbSBjbG9jayBzZXQgYmFja3dhcmQhIFJlc2V0dGluZyB0aW1lb3V0LlxuIik7CisgICAgICAKKyAgICAgIHRjYi0+bGFzdF90dl9zZWMgPSB0dl9zZWM7CisgICAgICB0Y2ItPmxhc3RfdHZfdXNlYyA9IHR2X3VzZWM7CisKKyAgICAgICp0aW1lb3V0ID0gaW50ZXJ2YWw7CisgICAgfQorICAKKyNpZiBNQUlOTE9PUF9TUEVXCisgIF9kYnVzX3ZlcmJvc2UgKCIgIHRpbWVvdXQgZXhwaXJlcyBpbiAlZCBtaWxsaXNlY29uZHNcbiIsICp0aW1lb3V0KTsKKyNlbmRpZgorICAKKyAgcmV0dXJuICp0aW1lb3V0ID09IDA7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19sb29wX2Rpc3BhdGNoIChEQnVzTG9vcCAqbG9vcCkKK3sKKworI2lmIE1BSU5MT09QX1NQRVcKKyAgX2RidXNfdmVyYm9zZSAoIiAgJWQgY29ubmVjdGlvbnMgdG8gZGlzcGF0Y2hcbiIsIF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAoJmxvb3AtPm5lZWRfZGlzcGF0Y2gpKTsKKyNlbmRpZgorICAKKyAgaWYgKGxvb3AtPm5lZWRfZGlzcGF0Y2ggPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorIG5leHQ6CisgIHdoaWxlIChsb29wLT5uZWVkX2Rpc3BhdGNoICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBfZGJ1c19saXN0X3BvcF9maXJzdCAoJmxvb3AtPm5lZWRfZGlzcGF0Y2gpOworICAgICAgCisgICAgICB3aGlsZSAoVFJVRSkKKyAgICAgICAgeworICAgICAgICAgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisgICAgICAgICAgCisgICAgICAgICAgc3RhdHVzID0gZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoIChjb25uZWN0aW9uKTsKKworICAgICAgICAgIGlmIChzdGF0dXMgPT0gREJVU19ESVNQQVRDSF9DT01QTEVURSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKyAgICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBEQlVTX0RJU1BBVENIX05FRURfTUVNT1JZKQorICAgICAgICAgICAgICAgIF9kYnVzX3dhaXRfZm9yX21lbW9yeSAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX2xvb3BfcXVldWVfZGlzcGF0Y2ggKERCdXNMb29wICAgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGlmIChfZGJ1c19saXN0X2FwcGVuZCAoJmxvb3AtPm5lZWRfZGlzcGF0Y2gsIGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNvbm5lY3Rpb24pOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKiBSZXR1cm5zIFRSVUUgaWYgd2UgaW52b2tlZCBhbnkgdGltZW91dHMgb3IgaGF2ZSByZWFkeSBmaWxlCisgKiBkZXNjcmlwdG9ycywgd2hpY2ggaXMganVzdCB1c2VkIGluIHRlc3QgY29kZSBhcyBhIGRlYnVnIGhhY2sKKyAqLworCitkYnVzX2Jvb2xfdAorX2RidXNfbG9vcF9pdGVyYXRlIChEQnVzTG9vcCAgICAgKmxvb3AsCisgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgYmxvY2spCit7ICAKKyNkZWZpbmUgTl9TVEFDS19ERVNDUklQVE9SUyA2NAorICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNTb2NrZXRFdmVudCByZWFkeV9mZHNbTl9TVEFDS19ERVNDUklQVE9SU107CisgIGludCBpOworICBEQnVzTGlzdCAqbGluazsKKyAgaW50IG5fcmVhZHk7CisgIGludCBpbml0aWFsX3NlcmlhbDsKKyAgbG9uZyB0aW1lb3V0OworICBpbnQgb3JpZ19kZXB0aDsKKworICByZXR2YWwgPSBGQUxTRTsgICAgICAKKworICBvcmlnX2RlcHRoID0gbG9vcC0+ZGVwdGg7CisgIAorI2lmIE1BSU5MT09QX1NQRVcKKyAgX2RidXNfdmVyYm9zZSAoIkl0ZXJhdGlvbiBibG9jaz0lZCBkZXB0aD0lZCB0aW1lb3V0X2NvdW50PSVkIHdhdGNoX2NvdW50PSVkXG4iLAorICAgICAgICAgICAgICAgICBibG9jaywgbG9vcC0+ZGVwdGgsIGxvb3AtPnRpbWVvdXRfY291bnQsIGxvb3AtPndhdGNoX2NvdW50KTsKKyNlbmRpZgorCisgIGlmIChfZGJ1c19oYXNoX3RhYmxlX2dldF9uX2VudHJpZXMgKGxvb3AtPndhdGNoZXMpID09IDAgJiYKKyAgICAgIGxvb3AtPnRpbWVvdXRzID09IE5VTEwpCisgICAgZ290byBuZXh0X2l0ZXJhdGlvbjsKKworICB0aW1lb3V0ID0gLTE7CisgIGlmIChsb29wLT50aW1lb3V0X2NvdW50ID4gMCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIHR2X3NlYzsKKyAgICAgIHVuc2lnbmVkIGxvbmcgdHZfdXNlYzsKKyAgICAgIAorICAgICAgX2RidXNfZ2V0X21vbm90b25pY190aW1lICgmdHZfc2VjLCAmdHZfdXNlYyk7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmbG9vcC0+dGltZW91dHMpOworICAgICAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmbG9vcC0+dGltZW91dHMsIGxpbmspOworICAgICAgICAgIFRpbWVvdXRDYWxsYmFjayAqdGNiID0gbGluay0+ZGF0YTsKKworICAgICAgICAgIGlmIChkYnVzX3RpbWVvdXRfZ2V0X2VuYWJsZWQgKHRjYi0+dGltZW91dCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGludCBtc2Vjc19yZW1haW5pbmc7CisKKyAgICAgICAgICAgICAgY2hlY2tfdGltZW91dCAodHZfc2VjLCB0dl91c2VjLCB0Y2IsICZtc2Vjc19yZW1haW5pbmcpOworCisgICAgICAgICAgICAgIGlmICh0aW1lb3V0IDwgMCkKKyAgICAgICAgICAgICAgICB0aW1lb3V0ID0gbXNlY3NfcmVtYWluaW5nOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGltZW91dCA9IE1JTiAobXNlY3NfcmVtYWluaW5nLCB0aW1lb3V0KTsKKworI2lmIE1BSU5MT09QX1NQRVcKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgdGltZW91dCBhZGRlZCwgJWQgcmVtYWluaW5nLCBhZ2dyZWdhdGUgdGltZW91dCAlbGRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZWNzX3JlbWFpbmluZywgdGltZW91dCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAodGltZW91dCA+PSAwKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAodGltZW91dCA9PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBpdCdzIG5vdCBnb2luZyB0byBnZXQgc2hvcnRlci4uLiAqLworICAgICAgICAgICAgfQorI2lmIE1BSU5MT09QX1NQRVcKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIHNraXBwaW5nIGRpc2FibGVkIHRpbWVvdXRcbiIpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgCisgICAgICAgICAgbGluayA9IG5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogTmV2ZXIgYmxvY2sgaWYgd2UgaGF2ZSBzdHVmZiB0byBkaXNwYXRjaCAqLworICBpZiAoIWJsb2NrIHx8IGxvb3AtPm5lZWRfZGlzcGF0Y2ggIT0gTlVMTCkKKyAgICB7CisgICAgICB0aW1lb3V0ID0gMDsKKyNpZiBNQUlOTE9PUF9TUEVXCisgICAgICBfZGJ1c192ZXJib3NlICgiICB0aW1lb3V0IGlzIDAgYXMgd2UgYXJlbid0IGJsb2NraW5nXG4iKTsKKyNlbmRpZgorICAgIH0KKworICAvKiBpZiBhIHdhdGNoIHdhcyBPT00gbGFzdCB0aW1lLCBkb24ndCB3YWl0IGxvbmdlciB0aGFuIHRoZSBPT00KKyAgICogd2FpdCB0byByZS1lbmFibGUgaXQKKyAgICovCisgIGlmIChsb29wLT5vb21fd2F0Y2hfcGVuZGluZykKKyAgICB0aW1lb3V0ID0gTUlOICh0aW1lb3V0LCBfZGJ1c19nZXRfb29tX3dhaXQgKCkpOworCisjaWYgTUFJTkxPT1BfU1BFVworICBfZGJ1c192ZXJib3NlICgiICBwb2xsaW5nIG9uICVkIGRlc2NyaXB0b3JzIHRpbWVvdXQgJWxkXG4iLCBuX2ZkcywgdGltZW91dCk7CisjZW5kaWYKKworICBuX3JlYWR5ID0gX2RidXNfc29ja2V0X3NldF9wb2xsIChsb29wLT5zb2NrZXRfc2V0LCByZWFkeV9mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX05fRUxFTUVOVFMgKHJlYWR5X2ZkcyksIHRpbWVvdXQpOworCisgIC8qIHJlLWVuYWJsZSBhbnkgd2F0Y2hlcyB3ZSBza2lwcGVkIHRoaXMgdGltZSAqLworICBpZiAobG9vcC0+b29tX3dhdGNoX3BlbmRpbmcpCisgICAgeworICAgICAgREJ1c0hhc2hJdGVyIGhhc2hfaXRlcjsKKworICAgICAgbG9vcC0+b29tX3dhdGNoX3BlbmRpbmcgPSBGQUxTRTsKKworICAgICAgX2RidXNfaGFzaF9pdGVyX2luaXQgKGxvb3AtPndhdGNoZXMsICZoYXNoX2l0ZXIpOworCisgICAgICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZoYXNoX2l0ZXIpKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0xpc3QgKip3YXRjaGVzOworICAgICAgICAgIGludCBmZDsKKyAgICAgICAgICBkYnVzX2Jvb2xfdCBjaGFuZ2VkOworCisgICAgICAgICAgY2hhbmdlZCA9IEZBTFNFOworICAgICAgICAgIGZkID0gX2RidXNfaGFzaF9pdGVyX2dldF9pbnRfa2V5ICgmaGFzaF9pdGVyKTsKKyAgICAgICAgICB3YXRjaGVzID0gX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJmhhc2hfaXRlcik7CisKKyAgICAgICAgICBmb3IgKGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICh3YXRjaGVzKTsKKyAgICAgICAgICAgICAgbGluayAhPSBOVUxMOworICAgICAgICAgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICh3YXRjaGVzLCBsaW5rKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgREJ1c1dhdGNoICp3YXRjaCA9IGxpbmstPmRhdGE7CisKKyAgICAgICAgICAgICAgaWYgKF9kYnVzX3dhdGNoX2dldF9vb21fbGFzdF90aW1lICh3YXRjaCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2RidXNfd2F0Y2hfc2V0X29vbV9sYXN0X3RpbWUgKHdhdGNoLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoY2hhbmdlZCkKKyAgICAgICAgICAgIHJlZnJlc2hfd2F0Y2hlc19mb3JfZmQgKGxvb3AsIHdhdGNoZXMsIGZkKTsKKyAgICAgICAgfQorCisgICAgICByZXR2YWwgPSBUUlVFOyAvKiByZXR1cm4gVFJVRSBoZXJlIHRvIGtlZXAgdGhlIGxvb3AgZ29pbmcsCisgICAgICAgICAgICAgICAgICAgICAgKiBzaW5jZSB3ZSBkb24ndCBrbm93IHRoZSB3YXRjaCB3YXMgaW5hY3RpdmUgKi8KKyAgICB9CisKKyAgaW5pdGlhbF9zZXJpYWwgPSBsb29wLT5jYWxsYmFja19saXN0X3NlcmlhbDsKKworICBpZiAobG9vcC0+dGltZW91dF9jb3VudCA+IDApCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyB0dl9zZWM7CisgICAgICB1bnNpZ25lZCBsb25nIHR2X3VzZWM7CisKKyAgICAgIF9kYnVzX2dldF9tb25vdG9uaWNfdGltZSAoJnR2X3NlYywgJnR2X3VzZWMpOworCisgICAgICAvKiBJdCdkIGJlIG5pY2UgdG8gYXZvaWQgdGhpcyBPKG4pIHRoaW5neSBoZXJlICovCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmxvb3AtPnRpbWVvdXRzKTsKKyAgICAgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmxvb3AtPnRpbWVvdXRzLCBsaW5rKTsKKyAgICAgICAgICBUaW1lb3V0Q2FsbGJhY2sgKnRjYiA9IGxpbmstPmRhdGE7CisKKyAgICAgICAgICBpZiAoaW5pdGlhbF9zZXJpYWwgIT0gbG9vcC0+Y2FsbGJhY2tfbGlzdF9zZXJpYWwpCisgICAgICAgICAgICBnb3RvIG5leHRfaXRlcmF0aW9uOworCisgICAgICAgICAgaWYgKGxvb3AtPmRlcHRoICE9IG9yaWdfZGVwdGgpCisgICAgICAgICAgICBnb3RvIG5leHRfaXRlcmF0aW9uOworCisgICAgICAgICAgaWYgKGRidXNfdGltZW91dF9nZXRfZW5hYmxlZCAodGNiLT50aW1lb3V0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaW50IG1zZWNzX3JlbWFpbmluZzsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmIChjaGVja190aW1lb3V0ICh0dl9zZWMsIHR2X3VzZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2IsICZtc2Vjc19yZW1haW5pbmcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIFNhdmUgbGFzdCBjYWxsYmFjayB0aW1lIGFuZCBmaXJlIHRoaXMgdGltZW91dCAqLworICAgICAgICAgICAgICAgICAgdGNiLT5sYXN0X3R2X3NlYyA9IHR2X3NlYzsKKyAgICAgICAgICAgICAgICAgIHRjYi0+bGFzdF90dl91c2VjID0gdHZfdXNlYzsKKworI2lmIE1BSU5MT09QX1NQRVcKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIGludm9raW5nIHRpbWVvdXRcbiIpOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgIC8qIGNhbiB0aGVvcmV0aWNhbGx5IHJldHVybiBGQUxTRSBvbiBPT00sIGJ1dCB3ZSBqdXN0CisgICAgICAgICAgICAgICAgICAgKiBsZXQgaXQgZmlyZSBhZ2FpbiBsYXRlciAtIGluIHByYWN0aWNlIHRoYXQncyB3aGF0CisgICAgICAgICAgICAgICAgICAgKiBldmVyeSB3cmFwcGVyIGNhbGxiYWNrIGluIGRidXMtZGFlbW9uIHVzZWQgdG8gZG8gKi8KKyAgICAgICAgICAgICAgICAgIGRidXNfdGltZW91dF9oYW5kbGUgKHRjYi0+dGltZW91dCk7CisKKyAgICAgICAgICAgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworI2lmIE1BSU5MT09QX1NQRVcKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIHRpbWVvdXQgaGFzIG5vdCBleHBpcmVkXG4iKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNpZiBNQUlOTE9PUF9TUEVXCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICBza2lwcGluZyBpbnZvY2F0aW9uIG9mIGRpc2FibGVkIHRpbWVvdXRcbiIpOworICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICBsaW5rID0gbmV4dDsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAobl9yZWFkeSA+IDApCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IG5fcmVhZHk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIERCdXNMaXN0ICoqd2F0Y2hlczsKKyAgICAgICAgICBEQnVzTGlzdCAqbmV4dDsKKyAgICAgICAgICB1bnNpZ25lZCBpbnQgY29uZGl0aW9uOworICAgICAgICAgIGRidXNfYm9vbF90IGFueV9vb207CisKKyAgICAgICAgICAvKiBGSVhNRSBJIHRoaW5rIHRoaXMgInJlc3RhcnQgaWYgd2UgY2hhbmdlIHRoZSB3YXRjaGVzIgorICAgICAgICAgICAqIGFwcHJvYWNoIGNvdWxkIHJlc3VsdCBpbiBzdGFydmluZyB3YXRjaGVzCisgICAgICAgICAgICogdG93YXJkIHRoZSBlbmQgb2YgdGhlIGxpc3QuCisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKGluaXRpYWxfc2VyaWFsICE9IGxvb3AtPmNhbGxiYWNrX2xpc3Rfc2VyaWFsKQorICAgICAgICAgICAgZ290byBuZXh0X2l0ZXJhdGlvbjsKKworICAgICAgICAgIGlmIChsb29wLT5kZXB0aCAhPSBvcmlnX2RlcHRoKQorICAgICAgICAgICAgZ290byBuZXh0X2l0ZXJhdGlvbjsKKworICAgICAgICAgIF9kYnVzX2Fzc2VydCAocmVhZHlfZmRzW2ldLmZsYWdzICE9IDApOworCisgICAgICAgICAgaWYgKF9EQlVTX1VOTElLRUxZIChyZWFkeV9mZHNbaV0uZmxhZ3MgJiBfREJVU19XQVRDSF9OVkFMKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY3VsbF93YXRjaGVzX2Zvcl9pbnZhbGlkX2ZkIChsb29wLCByZWFkeV9mZHNbaV0uZmQpOworICAgICAgICAgICAgICBnb3RvIG5leHRfaXRlcmF0aW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgY29uZGl0aW9uID0gcmVhZHlfZmRzW2ldLmZsYWdzOworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoKGNvbmRpdGlvbiAmIF9EQlVTX1dBVENIX05WQUwpID09IDApOworCisgICAgICAgICAgLyogY29uZGl0aW9uIG1heSBzdGlsbCBiZSAwIGlmIHdlIGdvdCBzb21lCisgICAgICAgICAgICogd2VpcmQgUE9MTEZPTyB0aGluZyBsaWtlIFBPTExXUkJBTkQKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoY29uZGl0aW9uID09IDApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIHdhdGNoZXMgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9pbnQgKGxvb3AtPndhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHlfZmRzW2ldLmZkKTsKKworICAgICAgICAgIGlmICh3YXRjaGVzID09IE5VTEwpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIGFueV9vb20gPSBGQUxTRTsKKworICAgICAgICAgIGZvciAobGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKHdhdGNoZXMpOworICAgICAgICAgICAgICBsaW5rICE9IE5VTEw7CisgICAgICAgICAgICAgIGxpbmsgPSBuZXh0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBEQnVzV2F0Y2ggKndhdGNoID0gbGluay0+ZGF0YTsKKworICAgICAgICAgICAgICBuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICh3YXRjaGVzLCBsaW5rKTsKKworICAgICAgICAgICAgICBpZiAoZGJ1c193YXRjaF9nZXRfZW5hYmxlZCAod2F0Y2gpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90IG9vbTsKKworICAgICAgICAgICAgICAgICAgb29tID0gIWRidXNfd2F0Y2hfaGFuZGxlICh3YXRjaCwgY29uZGl0aW9uKTsKKworICAgICAgICAgICAgICAgICAgaWYgKG9vbSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3dhdGNoX3NldF9vb21fbGFzdF90aW1lICh3YXRjaCwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgICAgbG9vcC0+b29tX3dhdGNoX3BlbmRpbmcgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgIGFueV9vb20gPSBUUlVFOworICAgICAgICAgICAgICAgICAgICB9CisKKyNpZiBNQUlOTE9PUF9TUEVXCisgICAgICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICBJbnZva2VkIHdhdGNoLCBvb20gPSAlZFxuIiwgb29tKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgcmV0dmFsID0gVFJVRTsKKworICAgICAgICAgICAgICAgICAgLyogV2UgcmUtY2hlY2sgdGhpcyBldmVyeSB0aW1lLCBpbiBjYXNlIHRoZSBjYWxsYmFjaworICAgICAgICAgICAgICAgICAgICogYWRkZWQvcmVtb3ZlZCB3YXRjaGVzLCB3aGljaCBtaWdodCBtYWtlIG91ciBwb3NpdGlvbiBpbgorICAgICAgICAgICAgICAgICAgICogdGhlIGxpbmtlZCBsaXN0IGludmFsaWQuIFNlZSB0aGUgRklYTUUgYWJvdmUuICovCisgICAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbF9zZXJpYWwgIT0gbG9vcC0+Y2FsbGJhY2tfbGlzdF9zZXJpYWwgfHwKKyAgICAgICAgICAgICAgICAgICAgICBsb29wLT5kZXB0aCAhPSBvcmlnX2RlcHRoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKGFueV9vb20pCisgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoX3dhdGNoZXNfZm9yX2ZkIChsb29wLCBOVUxMLCByZWFkeV9mZHNbaV0uZmQpOworCisgICAgICAgICAgICAgICAgICAgICAgZ290byBuZXh0X2l0ZXJhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChhbnlfb29tKQorICAgICAgICAgICAgcmVmcmVzaF93YXRjaGVzX2Zvcl9mZCAobG9vcCwgd2F0Y2hlcywgcmVhZHlfZmRzW2ldLmZkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAgIAorIG5leHRfaXRlcmF0aW9uOgorI2lmIE1BSU5MT09QX1NQRVcKKyAgX2RidXNfdmVyYm9zZSAoIiAgbW92aW5nIHRvIG5leHQgaXRlcmF0aW9uXG4iKTsKKyNlbmRpZgorCisgIGlmIChfZGJ1c19sb29wX2Rpc3BhdGNoIChsb29wKSkKKyAgICByZXR2YWwgPSBUUlVFOworICAKKyNpZiBNQUlOTE9PUF9TUEVXCisgIF9kYnVzX3ZlcmJvc2UgKCJSZXR1cm5pbmcgJWRcbiIsIHJldHZhbCk7CisjZW5kaWYKKyAgCisgIHJldHVybiByZXR2YWw7Cit9CisKK3ZvaWQKK19kYnVzX2xvb3BfcnVuIChEQnVzTG9vcCAqbG9vcCkKK3sKKyAgaW50IG91cl9leGl0X2RlcHRoOworCisgIF9kYnVzX2Fzc2VydCAobG9vcC0+ZGVwdGggPj0gMCk7CisgIAorICBfZGJ1c19sb29wX3JlZiAobG9vcCk7CisgIAorICBvdXJfZXhpdF9kZXB0aCA9IGxvb3AtPmRlcHRoOworICBsb29wLT5kZXB0aCArPSAxOworCisgIF9kYnVzX3ZlcmJvc2UgKCJSdW5uaW5nIG1haW4gbG9vcCwgZGVwdGggJWQgLT4gJWRcbiIsCisgICAgICAgICAgICAgICAgIGxvb3AtPmRlcHRoIC0gMSwgbG9vcC0+ZGVwdGgpOworICAKKyAgd2hpbGUgKGxvb3AtPmRlcHRoICE9IG91cl9leGl0X2RlcHRoKQorICAgIF9kYnVzX2xvb3BfaXRlcmF0ZSAobG9vcCwgVFJVRSk7CisKKyAgX2RidXNfbG9vcF91bnJlZiAobG9vcCk7Cit9CisKK3ZvaWQKK19kYnVzX2xvb3BfcXVpdCAoREJ1c0xvb3AgKmxvb3ApCit7CisgIF9kYnVzX2Fzc2VydCAobG9vcC0+ZGVwdGggPiAwKTsgIAorICAKKyAgbG9vcC0+ZGVwdGggLT0gMTsKKworICBfZGJ1c192ZXJib3NlICgiUXVpdCBtYWluIGxvb3AsIGRlcHRoICVkIC0+ICVkXG4iLAorICAgICAgICAgICAgICAgICBsb29wLT5kZXB0aCArIDEsIGxvb3AtPmRlcHRoKTsKK30KKworaW50CitfZGJ1c19nZXRfb29tX3dhaXQgKHZvaWQpCit7CisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICAvKiBtYWtlIHRlc3RzIGdvIGZhc3QgKi8KKyAgcmV0dXJuIDA7CisjZWxzZQorICByZXR1cm4gNTAwOworI2VuZGlmCit9CisKK3ZvaWQKK19kYnVzX3dhaXRfZm9yX21lbW9yeSAodm9pZCkKK3sKKyAgX2RidXNfdmVyYm9zZSAoIldhaXRpbmcgZm9yIG1vcmUgbWVtb3J5XG4iKTsKKyAgX2RidXNfc2xlZXBfbWlsbGlzZWNvbmRzIChfZGJ1c19nZXRfb29tX3dhaXQgKCkpOworfQorCisjZW5kaWYgLyogIURPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtbWFpbmxvb3AuaCBiL2RidXMvZGJ1cy9kYnVzLW1haW5sb29wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc2Y2I2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLW1haW5sb29wLmgKQEAgLTAsMCArMSw2NiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1haW5sb29wLmggIE1haW4gbG9vcCB1dGlsaXR5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19NQUlOTE9PUF9ICisjZGVmaW5lIERCVVNfTUFJTkxPT1BfSAorCisjaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUworCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisKK3R5cGVkZWYgc3RydWN0IERCdXNMb29wIERCdXNMb29wOworCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNXYXRjaEZ1bmN0aW9uKSAgIChEQnVzV2F0Y2ggICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgIGNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKmRhdGEpOworCitEQnVzTG9vcCogICBfZGJ1c19sb29wX25ldyAgICAgICAgICAgICh2b2lkKTsKK0RCdXNMb29wKiAgIF9kYnVzX2xvb3BfcmVmICAgICAgICAgICAgKERCdXNMb29wICAgICAgICAgICAgKmxvb3ApOwordm9pZCAgICAgICAgX2RidXNfbG9vcF91bnJlZiAgICAgICAgICAoREJ1c0xvb3AgICAgICAgICAgICAqbG9vcCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19sb29wX2FkZF93YXRjaCAgICAgIChEQnVzTG9vcCAgICAgICAgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAgICAgICAqd2F0Y2gpOwordm9pZCAgICAgICAgX2RidXNfbG9vcF9yZW1vdmVfd2F0Y2ggICAoREJ1c0xvb3AgICAgICAgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICAgICAgKndhdGNoKTsKK3ZvaWQgICAgICAgIF9kYnVzX2xvb3BfdG9nZ2xlX3dhdGNoICAgKERCdXNMb29wICAgICAgICAgICAgKmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICAgICp3YXRjaCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19sb29wX2FkZF90aW1lb3V0ICAgIChEQnVzTG9vcCAgICAgICAgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgICAgICAqdGltZW91dCk7Cit2b2lkICAgICAgICBfZGJ1c19sb29wX3JlbW92ZV90aW1lb3V0IChEQnVzTG9vcCAgICAgICAgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgICAgICAqdGltZW91dCk7CisKK2RidXNfYm9vbF90IF9kYnVzX2xvb3BfcXVldWVfZGlzcGF0Y2ggKERCdXNMb29wICAgICAgICAgICAgKmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAgICpjb25uZWN0aW9uKTsKKwordm9pZCAgICAgICAgX2RidXNfbG9vcF9ydW4gICAgICAgICAgICAoREJ1c0xvb3AgICAgICAgICAgICAqbG9vcCk7Cit2b2lkICAgICAgICBfZGJ1c19sb29wX3F1aXQgICAgICAgICAgIChEQnVzTG9vcCAgICAgICAgICAgICpsb29wKTsKK2RidXNfYm9vbF90IF9kYnVzX2xvb3BfaXRlcmF0ZSAgICAgICAgKERCdXNMb29wICAgICAgICAgICAgKmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICBibG9jayk7CitkYnVzX2Jvb2xfdCBfZGJ1c19sb29wX2Rpc3BhdGNoICAgICAgIChEQnVzTG9vcCAgICAgICAgICAgICpsb29wKTsKKworaW50ICBfZGJ1c19nZXRfb29tX3dhaXQgICAgKHZvaWQpOwordm9pZCBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKHZvaWQpOworCisjZW5kaWYgLyogIURPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUyAqLworCisjZW5kaWYgLyogREJVU19NQUlOTE9PUF9IICovCisKZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLW1hcnNoYWwtYmFzaWMuYyBiL2RidXMvZGJ1cy9kYnVzLW1hcnNoYWwtYmFzaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGIxOWYzCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5jCkBAIC0wLDAgKzEsMTk5NSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1hcnNoYWwtYmFzaWMuYyAgTWFyc2hhbGxpbmcgcm91dGluZXMgZm9yIGJhc2ljIChwcmltaXRpdmUpIHR5cGVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIENvZGVGYWN0b3J5IEFCCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLWJhc2ljLmgiCisjaW5jbHVkZSAiZGJ1cy1zaWduYXR1cmUuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fID49IDQpCisjIGRlZmluZSBfREJVU19BU1NFUlRfQUxJR05NRU5UKHR5cGUsIG9wLCB2YWwpIFwKKyAgX0RCVVNfU1RBVElDX0FTU0VSVCAoX19leHRlbnNpb25fXyBfX2FsaWdub2ZfXyAodHlwZSkgb3AgdmFsKQorI2Vsc2UKKyAgLyogbm90IGdjYywgc28gcHJvYmFibHkgbm8gYWxpZ25vZiBvcGVyYXRvcjoganVzdCB1c2UgYSBuby1vcCBzdGF0ZW1lbnQKKyAgICogdGhhdCdzIHZhbGlkIGluIHRoZSBzYW1lIGNvbnRleHRzICovCisjIGRlZmluZSBfREJVU19BU1NFUlRfQUxJR05NRU5UKHR5cGUsIG9wLCB2YWwpIFwKKyAgX0RCVVNfU1RBVElDX0FTU0VSVCAoVFJVRSkKKyNlbmRpZgorCisvKiBUcnVlIGJ5IGRlZmluaXRpb24sIGJ1dCBqdXN0IGZvciBjb21wbGV0ZW5lc3MuLi4gKi8KK19EQlVTX1NUQVRJQ19BU1NFUlQgKHNpemVvZiAoY2hhcikgPT0gMSk7CitfREJVU19BU1NFUlRfQUxJR05NRU5UIChjaGFyLCA9PSwgMSk7CisKK19EQlVTX1NUQVRJQ19BU1NFUlQgKHNpemVvZiAoZGJ1c19pbnQxNl90KSA9PSAyKTsKK19EQlVTX0FTU0VSVF9BTElHTk1FTlQgKGRidXNfaW50MTZfdCwgPD0sIDIpOworX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChkYnVzX3VpbnQxNl90KSA9PSAyKTsKK19EQlVTX0FTU0VSVF9BTElHTk1FTlQgKGRidXNfdWludDE2X3QsIDw9LCAyKTsKKworX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChkYnVzX2ludDMyX3QpID09IDQpOworX0RCVVNfQVNTRVJUX0FMSUdOTUVOVCAoZGJ1c19pbnQzMl90LCA8PSwgNCk7CitfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKGRidXNfdWludDMyX3QpID09IDQpOworX0RCVVNfQVNTRVJUX0FMSUdOTUVOVCAoZGJ1c191aW50MzJfdCwgPD0sIDQpOworX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChkYnVzX2Jvb2xfdCkgPT0gNCk7CitfREJVU19BU1NFUlRfQUxJR05NRU5UIChkYnVzX2Jvb2xfdCwgPD0sIDQpOworCitfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKGRvdWJsZSkgPT0gOCk7CitfREJVU19BU1NFUlRfQUxJR05NRU5UIChkb3VibGUsIDw9LCA4KTsKKworI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChkYnVzX2ludDY0X3QpID09IDgpOworX0RCVVNfQVNTRVJUX0FMSUdOTUVOVCAoZGJ1c19pbnQ2NF90LCA8PSwgOCk7CitfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKGRidXNfdWludDY0X3QpID09IDgpOworX0RCVVNfQVNTRVJUX0FMSUdOTUVOVCAoZGJ1c191aW50NjRfdCwgPD0sIDgpOworI2VuZGlmCisKK19EQlVTX1NUQVRJQ19BU1NFUlQgKHNpemVvZiAoREJ1c0Jhc2ljVmFsdWUpID49IDgpOworLyogVGhlIGFsaWdubWVudCBvZiBhIERCdXNCYXNpY1ZhbHVlIG1pZ2h0IGNvbmNlaXZhYmx5IGJlID4gOCBiZWNhdXNlIG9mIHRoZQorICogcG9pbnRlciwgc28gd2UgZG9uJ3QgYXNzZXJ0IGFib3V0IGl0ICovCisKK19EQlVTX1NUQVRJQ19BU1NFUlQgKHNpemVvZiAoREJ1czhCeXRlU3RydWN0KSA9PSA4KTsKK19EQlVTX0FTU0VSVF9BTElHTk1FTlQgKERCdXM4Qnl0ZVN0cnVjdCwgPD0sIDgpOworCisvKioKKyAqIEBkZWZncm91cCBEQnVzTWFyc2hhbCBtYXJzaGFsaW5nIGFuZCB1bm1hcnNoYWxpbmcKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgZnVuY3Rpb25zIHRvIG1hcnNoYWwvdW5tYXJzaGFsIGRhdGEgZnJvbSB0aGUgd2lyZQorICoKKyAqIFR5cGVzIGFuZCBmdW5jdGlvbnMgcmVsYXRlZCB0byBjb252ZXJ0aW5nIHByaW1pdGl2ZSBkYXRhIHR5cGVzIGZyb20KKyAqIHdpcmUgZm9ybWF0IHRvIG5hdGl2ZSBtYWNoaW5lIGZvcm1hdCwgYW5kIHZpY2UgdmVyc2EuCisgKgorICogQSBzaWduYXR1cmUgaXMganVzdCBhIHN0cmluZyB3aXRoIG11bHRpcGxlIHR5cGVzIG9uZSBhZnRlciB0aGUgb3RoZXIuCisgKiBmb3IgZXhhbXBsZSBhIHR5cGUgaXMgImkiIG9yICIoaWkpIiwgYSBzaWduYXR1cmUgaXMgImkoaWkpIgorICogd2hlcmUgaSBpcyBpbnQgYW5kIChpaSkgaXMgc3RydWN0IHsgaW50OyBpbnQ7IH0KKyAqCisgKiBAeworICovCisKK3N0YXRpYyB2b2lkCitwYWNrXzJfb2N0ZXRzIChkYnVzX3VpbnQxNl90ICAgdmFsdWUsCisgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICpkYXRhKQoreworICBfZGJ1c19hc3NlcnQgKF9EQlVTX0FMSUdOX0FERFJFU1MgKGRhdGEsIDIpID09IGRhdGEpOworCisgIGlmICgoYnl0ZV9vcmRlcikgPT0gREJVU19MSVRUTEVfRU5ESUFOKQorICAgICooKGRidXNfdWludDE2X3QqKShkYXRhKSkgPSBEQlVTX1VJTlQxNl9UT19MRSAodmFsdWUpOworICBlbHNlCisgICAgKigoZGJ1c191aW50MTZfdCopKGRhdGEpKSA9IERCVVNfVUlOVDE2X1RPX0JFICh2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitwYWNrXzRfb2N0ZXRzIChkYnVzX3VpbnQzMl90ICAgdmFsdWUsCisgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICpkYXRhKQoreworICBfZGJ1c19hc3NlcnQgKF9EQlVTX0FMSUdOX0FERFJFU1MgKGRhdGEsIDQpID09IGRhdGEpOworCisgIGlmICgoYnl0ZV9vcmRlcikgPT0gREJVU19MSVRUTEVfRU5ESUFOKQorICAgICooKGRidXNfdWludDMyX3QqKShkYXRhKSkgPSBEQlVTX1VJTlQzMl9UT19MRSAodmFsdWUpOworICBlbHNlCisgICAgKigoZGJ1c191aW50MzJfdCopKGRhdGEpKSA9IERCVVNfVUlOVDMyX1RPX0JFICh2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitwYWNrXzhfb2N0ZXRzIChEQnVzQmFzaWNWYWx1ZSAgICAgdmFsdWUsCisgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICpkYXRhKQoreworICBfZGJ1c19hc3NlcnQgKF9EQlVTX0FMSUdOX0FERFJFU1MgKGRhdGEsIDgpID09IGRhdGEpOworCisjaWZkZWYgREJVU19IQVZFX0lOVDY0CisgIGlmICgoYnl0ZV9vcmRlcikgPT0gREJVU19MSVRUTEVfRU5ESUFOKQorICAgICooKGRidXNfdWludDY0X3QqKShkYXRhKSkgPSBEQlVTX1VJTlQ2NF9UT19MRSAodmFsdWUudTY0KTsKKyAgZWxzZQorICAgICooKGRidXNfdWludDY0X3QqKShkYXRhKSkgPSBEQlVTX1VJTlQ2NF9UT19CRSAodmFsdWUudTY0KTsKKyNlbHNlCisgICooREJ1czhCeXRlU3RydWN0KilkYXRhID0gdmFsdWUuZWlnaHQ7CisgIHN3YXBfOF9vY3RldHMgKChEQnVzQmFzaWNWYWx1ZSopZGF0YSwgYnl0ZV9vcmRlcik7CisjZW5kaWYKK30KKworLyoqCisgKiBQYWNrcyBhIDMyIGJpdCB1bnNpZ25lZCBpbnRlZ2VyIGludG8gYSBkYXRhIHBvaW50ZXIuCisgKgorICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQorICogQHBhcmFtIGJ5dGVfb3JkZXIgdGhlIGJ5dGUgb3JkZXIgdG8gdXNlCisgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSBwb2ludGVyCisgKi8KK3ZvaWQKK19kYnVzX3BhY2tfdWludDMyIChkYnVzX3VpbnQzMl90ICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgKmRhdGEpCit7CisgIHBhY2tfNF9vY3RldHMgKHZhbHVlLCBieXRlX29yZGVyLCBkYXRhKTsKK30KKworI2lmbmRlZiBEQlVTX0hBVkVfSU5UNjQKKy8qIGZyb20gT1JCaXQgKi8KK3N0YXRpYyB2b2lkCitzd2FwX2J5dGVzICh1bnNpZ25lZCBjaGFyICpkYXRhLAorICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgbGVuKQoreworICB1bnNpZ25lZCBjaGFyICpwMSA9IGRhdGE7CisgIHVuc2lnbmVkIGNoYXIgKnAyID0gZGF0YSArIGxlbiAtIDE7CisKKyAgd2hpbGUgKHAxIDwgcDIpCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciB0bXAgPSAqcDE7CisgICAgICAqcDEgPSAqcDI7CisgICAgICAqcDIgPSB0bXA7CisKKyAgICAgIC0tcDI7CisgICAgICArK3AxOworICAgIH0KK30KKyNlbmRpZiAvKiAhREJVU19IQVZFX0lOVDY0ICovCisKK3N0YXRpYyB2b2lkCitzd2FwXzhfb2N0ZXRzIChEQnVzQmFzaWNWYWx1ZSAgICAqdmFsdWUsCisgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYnl0ZV9vcmRlcikKK3sKKyAgaWYgKGJ5dGVfb3JkZXIgIT0gREJVU19DT01QSUxFUl9CWVRFX09SREVSKQorICAgIHsKKyNpZmRlZiBEQlVTX0hBVkVfSU5UNjQKKyAgICAgIHZhbHVlLT51NjQgPSBEQlVTX1VJTlQ2NF9TV0FQX0xFX0JFICh2YWx1ZS0+dTY0KTsKKyNlbHNlCisgICAgICBzd2FwX2J5dGVzICgmdmFsdWUtPmJ5dGVzLCA4KTsKKyNlbmRpZgorICAgIH0KK30KKworI2lmIDAKK3N0YXRpYyBEQnVzQmFzaWNWYWx1ZQordW5wYWNrXzhfb2N0ZXRzIChpbnQgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhKQoreworICBEQnVzQmFzaWNWYWx1ZSByOworCisgIF9kYnVzX2Fzc2VydCAoX0RCVVNfQUxJR05fQUREUkVTUyAoZGF0YSwgOCkgPT0gZGF0YSk7CisgIF9kYnVzX2Fzc2VydCAoc2l6ZW9mIChyKSA9PSA4KTsKKworI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorICBpZiAoYnl0ZV9vcmRlciA9PSBEQlVTX0xJVFRMRV9FTkRJQU4pCisgICAgci51NjQgPSBEQlVTX1VJTlQ2NF9GUk9NX0xFICgqKGRidXNfdWludDY0X3QqKWRhdGEpOworICBlbHNlCisgICAgci51NjQgPSBEQlVTX1VJTlQ2NF9GUk9NX0JFICgqKGRidXNfdWludDY0X3QqKWRhdGEpOworI2Vsc2UKKyAgci5laWdodCA9ICooREJ1czhCeXRlU3RydWN0KilkYXRhOworICBzd2FwXzhfb2N0ZXRzICgmciwgYnl0ZV9vcmRlcik7CisjZW5kaWYKKworICByZXR1cm4gcjsKK30KKyNlbmRpZgorCisjaWZuZGVmIF9kYnVzX3VucGFja191aW50MTYKKy8qKgorICogVW5wYWNrcyBhIDE2IGJpdCB1bnNpZ25lZCBpbnRlZ2VyIGZyb20gYSBkYXRhIHBvaW50ZXIKKyAqCisgKiBAcGFyYW0gYnl0ZV9vcmRlciBUaGUgYnl0ZSBvcmRlciB0byB1c2UKKyAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIHBvaW50ZXIKKyAqIEByZXR1cm5zIHRoZSBpbnRlZ2VyCisgKi8KK2RidXNfdWludDE2X3QKK19kYnVzX3VucGFja191aW50MTYgKGludCAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhKQoreworICBfZGJ1c19hc3NlcnQgKF9EQlVTX0FMSUdOX0FERFJFU1MgKGRhdGEsIDIpID09IGRhdGEpOworCisgIGlmIChieXRlX29yZGVyID09IERCVVNfTElUVExFX0VORElBTikKKyAgICByZXR1cm4gREJVU19VSU5UMTZfRlJPTV9MRSAoKihkYnVzX3VpbnQxNl90KilkYXRhKTsKKyAgZWxzZQorICAgIHJldHVybiBEQlVTX1VJTlQxNl9GUk9NX0JFICgqKGRidXNfdWludDE2X3QqKWRhdGEpOworfQorI2VuZGlmIC8qIF9kYnVzX3VucGFja191aW50MTYgKi8KKworI2lmbmRlZiBfZGJ1c191bnBhY2tfdWludDMyCisvKioKKyAqIFVucGFja3MgYSAzMiBiaXQgdW5zaWduZWQgaW50ZWdlciBmcm9tIGEgZGF0YSBwb2ludGVyCisgKgorICogQHBhcmFtIGJ5dGVfb3JkZXIgVGhlIGJ5dGUgb3JkZXIgdG8gdXNlCisgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSBwb2ludGVyCisgKiBAcmV0dXJucyB0aGUgaW50ZWdlcgorICovCitkYnVzX3VpbnQzMl90CitfZGJ1c191bnBhY2tfdWludDMyIChpbnQgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSkKK3sKKyAgX2RidXNfYXNzZXJ0IChfREJVU19BTElHTl9BRERSRVNTIChkYXRhLCA0KSA9PSBkYXRhKTsKKworICBpZiAoYnl0ZV9vcmRlciA9PSBEQlVTX0xJVFRMRV9FTkRJQU4pCisgICAgcmV0dXJuIERCVVNfVUlOVDMyX0ZST01fTEUgKCooZGJ1c191aW50MzJfdCopZGF0YSk7CisgIGVsc2UKKyAgICByZXR1cm4gREJVU19VSU5UMzJfRlJPTV9CRSAoKihkYnVzX3VpbnQzMl90KilkYXRhKTsKK30KKyNlbmRpZiAvKiBfZGJ1c191bnBhY2tfdWludDMyICovCisKK3N0YXRpYyB2b2lkCitzZXRfMl9vY3RldHMgKERCdXNTdHJpbmcgICAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICBkYnVzX3VpbnQxNl90ICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlcikKK3sKKyAgY2hhciAqZGF0YTsKKworICBfZGJ1c19hc3NlcnQgKGJ5dGVfb3JkZXIgPT0gREJVU19MSVRUTEVfRU5ESUFOIHx8CisgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciA9PSBEQlVTX0JJR19FTkRJQU4pOworCisgIGRhdGEgPSBfZGJ1c19zdHJpbmdfZ2V0X2RhdGFfbGVuIChzdHIsIG9mZnNldCwgMik7CisKKyAgcGFja18yX29jdGV0cyAodmFsdWUsIGJ5dGVfb3JkZXIsIGRhdGEpOworfQorCitzdGF0aWMgdm9pZAorc2V0XzRfb2N0ZXRzIChEQnVzU3RyaW5nICAgICAgICAgICpzdHIsCisgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIpCit7CisgIGNoYXIgKmRhdGE7CisKKyAgX2RidXNfYXNzZXJ0IChieXRlX29yZGVyID09IERCVVNfTElUVExFX0VORElBTiB8fAorICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIgPT0gREJVU19CSUdfRU5ESUFOKTsKKworICBkYXRhID0gX2RidXNfc3RyaW5nX2dldF9kYXRhX2xlbiAoc3RyLCBvZmZzZXQsIDQpOworCisgIHBhY2tfNF9vY3RldHMgKHZhbHVlLCBieXRlX29yZGVyLCBkYXRhKTsKK30KKworc3RhdGljIHZvaWQKK3NldF84X29jdGV0cyAoREJ1c1N0cmluZyAgICAgICAgICAqc3RyLAorICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgIERCdXNCYXNpY1ZhbHVlICAgICAgIHZhbHVlLAorICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBieXRlX29yZGVyKQoreworICBjaGFyICpkYXRhOworCisgIF9kYnVzX2Fzc2VydCAoYnl0ZV9vcmRlciA9PSBEQlVTX0xJVFRMRV9FTkRJQU4gfHwKKyAgICAgICAgICAgICAgICBieXRlX29yZGVyID09IERCVVNfQklHX0VORElBTik7CisKKyAgZGF0YSA9IF9kYnVzX3N0cmluZ19nZXRfZGF0YV9sZW4gKHN0ciwgb2Zmc2V0LCA4KTsKKworICBwYWNrXzhfb2N0ZXRzICh2YWx1ZSwgYnl0ZV9vcmRlciwgZGF0YSk7Cit9CisKKy8qKgorICogU2V0cyB0aGUgNCBieXRlcyBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHRvIGEgbWFyc2hhbGVkIHVuc2lnbmVkCisgKiBpbnRlZ2VyLCByZXBsYWNpbmcgYW55dGhpbmcgZm91bmQgdGhlcmUgcHJldmlvdXNseS4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gd3JpdGUgdGhlIG1hcnNoYWxsZWQgaW50IHRvCisgKiBAcGFyYW0gcG9zIHRoZSBieXRlIG9mZnNldCB3aGVyZSBpbnQgc2hvdWxkIGJlIHdyaXR0ZW4KKyAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKKyAqIEBwYXJhbSBieXRlX29yZGVyIHRoZSBieXRlIG9yZGVyIHRvIHVzZQorICoKKyAqLwordm9pZAorX2RidXNfbWFyc2hhbF9zZXRfdWludDMyIChEQnVzU3RyaW5nICAgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIpCit7CisgIHNldF80X29jdGV0cyAoc3RyLCBwb3MsIHZhbHVlLCBieXRlX29yZGVyKTsKK30KKworLyoqCisgKiBTZXRzIHRoZSBleGlzdGluZyBtYXJzaGFsZWQgc3RyaW5nIGF0IHRoZSBnaXZlbiBvZmZzZXQgd2l0aAorICogYSBuZXcgbWFyc2hhbGVkIHN0cmluZy4gVGhlIGdpdmVuIG9mZnNldCBtdXN0IHBvaW50IHRvCisgKiBhbiBleGlzdGluZyBzdHJpbmcgb3IgdGhlIHdyb25nIGxlbmd0aCB3aWxsIGJlIGRlbGV0ZWQKKyAqIGFuZCByZXBsYWNlZCB3aXRoIHRoZSBuZXcgc3RyaW5nLgorICoKKyAqIE5vdGU6IG5vIGF0dGVtcHQgaXMgbWFkZSBieSB0aGlzIGZ1bmN0aW9uIHRvIHJlLWFsaWduCisgKiBhbnkgZGF0YSB3aGljaCBoYXMgYmVlbiBhbHJlYWR5IG1hcnNoYWxsZWQgYWZ0ZXIgdGhpcworICogc3RyaW5nLiBVc2Ugd2l0aCBjYXV0aW9uLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byB3cml0ZSB0aGUgbWFyc2hhbGxlZCBzdHJpbmcgdG8KKyAqIEBwYXJhbSBwb3MgdGhlIHBvc2l0aW9uIG9mIHRoZSBtYXJzaGFsZWQgc3RyaW5nIGxlbmd0aAorICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQorICogQHBhcmFtIGJ5dGVfb3JkZXIgdGhlIGJ5dGUgb3JkZXIgdG8gdXNlCisgKiBAcGFyYW0gb2xkX2VuZF9wb3MgcGxhY2UgdG8gc3RvcmUgYnl0ZSBhZnRlciB0aGUgbnVsIGJ5dGUgb2YgdGhlIG9sZCB2YWx1ZQorICogQHBhcmFtIG5ld19lbmRfcG9zIHBsYWNlIHRvIHN0b3JlIGJ5dGUgYWZ0ZXIgdGhlIG51bCBieXRlIG9mIHRoZSBuZXcgdmFsdWUKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2V0X3N0cmluZyAoREJ1c1N0cmluZyAgICAgICAgICAqc3RyLAorICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgcG9zLAorICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAqb2xkX2VuZF9wb3MsCisgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICpuZXdfZW5kX3BvcykKK3sKKyAgaW50IG9sZF9sZW4sIG5ld19sZW47CisgIERCdXNTdHJpbmcgZHN0cjsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmRzdHIsIHZhbHVlKTsKKworICBfZGJ1c19hc3NlcnQgKF9EQlVTX0FMSUdOX1ZBTFVFIChwb3MsIDQpID09ICh1bnNpZ25lZCkgcG9zKTsKKyAgb2xkX2xlbiA9IF9kYnVzX3VucGFja191aW50MzIgKGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChzdHIsIHBvcywgNCkpOworCisgIG5ld19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmRzdHIpOworCisgIGlmICghX2RidXNfc3RyaW5nX3JlcGxhY2VfbGVuICgmZHN0ciwgMCwgbmV3X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciwgcG9zICsgNCwgb2xkX2xlbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX21hcnNoYWxfc2V0X3VpbnQzMiAoc3RyLCBwb3MsIG5ld19sZW4sIGJ5dGVfb3JkZXIpOworCisgIGlmIChvbGRfZW5kX3BvcykKKyAgICAqb2xkX2VuZF9wb3MgPSBwb3MgKyA0ICsgb2xkX2xlbiArIDE7CisgIGlmIChuZXdfZW5kX3BvcykKKyAgICAqbmV3X2VuZF9wb3MgPSBwb3MgKyA0ICsgbmV3X2xlbiArIDE7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogU2V0cyB0aGUgZXhpc3RpbmcgbWFyc2hhbGVkIHNpZ25hdHVyZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHRvIGEgbmV3CisgKiBtYXJzaGFsZWQgc2lnbmF0dXJlLiBTYW1lIGJhc2ljIGlkZWFzIGFzIHNldF9zdHJpbmcoKS4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gd3JpdGUgdGhlIG1hcnNoYWxsZWQgc2lnbmF0dXJlIHRvCisgKiBAcGFyYW0gcG9zIHRoZSBwb3NpdGlvbiBvZiB0aGUgbWFyc2hhbGVkIHNpZ25hdHVyZSBsZW5ndGgKKyAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKKyAqIEBwYXJhbSBieXRlX29yZGVyIHRoZSBieXRlIG9yZGVyIHRvIHVzZQorICogQHBhcmFtIG9sZF9lbmRfcG9zIHBsYWNlIHRvIHN0b3JlIGJ5dGUgYWZ0ZXIgdGhlIG51bCBieXRlIG9mIHRoZSBvbGQgdmFsdWUKKyAqIEBwYXJhbSBuZXdfZW5kX3BvcyBwbGFjZSB0byBzdG9yZSBieXRlIGFmdGVyIHRoZSBudWwgYnl0ZSBvZiB0aGUgbmV3IHZhbHVlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK3NldF9zaWduYXR1cmUgKERCdXNTdHJpbmcgICAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIHBvcywKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgKm9sZF9lbmRfcG9zLAorICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAqbmV3X2VuZF9wb3MpCit7CisgIGludCBvbGRfbGVuLCBuZXdfbGVuOworICBEQnVzU3RyaW5nIGRzdHI7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZkc3RyLCB2YWx1ZSk7CisKKyAgb2xkX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoc3RyLCBwb3MpOworICBuZXdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZkc3RyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19yZXBsYWNlX2xlbiAoJmRzdHIsIDAsIG5ld19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIsIHBvcyArIDEsIG9sZF9sZW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKHN0ciwgcG9zLCBuZXdfbGVuKTsKKworICBpZiAob2xkX2VuZF9wb3MpCisgICAgKm9sZF9lbmRfcG9zID0gcG9zICsgMSArIG9sZF9sZW4gKyAxOworICBpZiAobmV3X2VuZF9wb3MpCisgICAgKm5ld19lbmRfcG9zID0gcG9zICsgMSArIG5ld19sZW4gKyAxOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFNldHMgYW4gZXhpc3RpbmcgYmFzaWMgdHlwZSB2YWx1ZSB0byBhIG5ldyB2YWx1ZS4KKyAqIEFyZ3VtZW50cyB3b3JrIHRoZSBzYW1lIHdheSBhcyBfZGJ1c19tYXJzaGFsX2Jhc2ljX3R5cGUoKS4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBwb3MgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgdmFsdWUKKyAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IGFuZCBuZXcgdmFsdWVzCisgKiBAcGFyYW0gdmFsdWUgdGhlIGFkZHJlc3Mgb2YgdGhlIG5ldyB2YWx1ZQorICogQHBhcmFtIGJ5dGVfb3JkZXIgYnl0ZSBvcmRlciBmb3IgbWFyc2hhbGluZworICogQHBhcmFtIG9sZF9lbmRfcG9zIGxvY2F0aW9uIHRvIHN0b3JlIGVuZCBwb3NpdGlvbiBvZiB0aGUgb2xkIHZhbHVlLCBvciAjTlVMTAorICogQHBhcmFtIG5ld19lbmRfcG9zIGxvY2F0aW9uIHRvIHN0b3JlIGVuZCBwb3NpdGlvbiBvZiB0aGUgbmV3IHZhbHVlLCBvciAjTlVMTAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbWFyc2hhbF9zZXRfYmFzaWMgKERCdXNTdHJpbmcgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKm9sZF9lbmRfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKm5ld19lbmRfcG9zKQoreworICBjb25zdCBEQnVzQmFzaWNWYWx1ZSAqdnA7CisKKyAgdnAgPSB2YWx1ZTsKKworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgREJVU19UWVBFX0JZVEU6CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKHN0ciwgcG9zLCB2cC0+Ynl0KTsKKyAgICAgIGlmIChvbGRfZW5kX3BvcykKKyAgICAgICAgKm9sZF9lbmRfcG9zID0gcG9zICsgMTsKKyAgICAgIGlmIChuZXdfZW5kX3BvcykKKyAgICAgICAgKm5ld19lbmRfcG9zID0gcG9zICsgMTsKKyAgICAgIHJldHVybiBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgICAgcG9zID0gX0RCVVNfQUxJR05fVkFMVUUgKHBvcywgMik7CisgICAgICBzZXRfMl9vY3RldHMgKHN0ciwgcG9zLCB2cC0+dTE2LCBieXRlX29yZGVyKTsKKyAgICAgIGlmIChvbGRfZW5kX3BvcykKKyAgICAgICAgKm9sZF9lbmRfcG9zID0gcG9zICsgMjsKKyAgICAgIGlmIChuZXdfZW5kX3BvcykKKyAgICAgICAgKm5ld19lbmRfcG9zID0gcG9zICsgMjsKKyAgICAgIHJldHVybiBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfQk9PTEVBTjoKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQzMjoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UMzI6CisgICAgY2FzZSBEQlVTX1RZUEVfVU5JWF9GRDoKKyAgICAgIHBvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChwb3MsIDQpOworICAgICAgc2V0XzRfb2N0ZXRzIChzdHIsIHBvcywgdnAtPnUzMiwgYnl0ZV9vcmRlcik7CisgICAgICBpZiAob2xkX2VuZF9wb3MpCisgICAgICAgICpvbGRfZW5kX3BvcyA9IHBvcyArIDQ7CisgICAgICBpZiAobmV3X2VuZF9wb3MpCisgICAgICAgICpuZXdfZW5kX3BvcyA9IHBvcyArIDQ7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX0lOVDY0OgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9ET1VCTEU6CisgICAgICBwb3MgPSBfREJVU19BTElHTl9WQUxVRSAocG9zLCA4KTsKKyAgICAgIHNldF84X29jdGV0cyAoc3RyLCBwb3MsICp2cCwgYnl0ZV9vcmRlcik7CisgICAgICBpZiAob2xkX2VuZF9wb3MpCisgICAgICAgICpvbGRfZW5kX3BvcyA9IHBvcyArIDg7CisgICAgICBpZiAobmV3X2VuZF9wb3MpCisgICAgICAgICpuZXdfZW5kX3BvcyA9IHBvcyArIDg7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX1NUUklORzoKKyAgICBjYXNlIERCVVNfVFlQRV9PQkpFQ1RfUEFUSDoKKyAgICAgIHBvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChwb3MsIDQpOworICAgICAgX2RidXNfYXNzZXJ0ICh2cC0+c3RyICE9IE5VTEwpOworICAgICAgcmV0dXJuIHNldF9zdHJpbmcgKHN0ciwgcG9zLCB2cC0+c3RyLCBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9lbmRfcG9zLCBuZXdfZW5kX3Bvcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9TSUdOQVRVUkU6CisgICAgICBfZGJ1c19hc3NlcnQgKHZwLT5zdHIgIT0gTlVMTCk7CisgICAgICByZXR1cm4gc2V0X3NpZ25hdHVyZSAoc3RyLCBwb3MsIHZwLT5zdHIsIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX2VuZF9wb3MsIG5ld19lbmRfcG9zKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJub3QgYSBiYXNpYyB0eXBlIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qKgorICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gZGVtYXJzaGFsIGEgMzIgYml0IHVuc2lnbmVkIGludGVnZXIuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGRhdGEKKyAqIEBwYXJhbSBieXRlX29yZGVyIHRoZSBieXRlIG9yZGVyCisgKiBAcGFyYW0gcG9zIHRoZSBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nCisgKiBAcGFyYW0gbmV3X3BvcyB0aGUgbmV3IHBvc2l0aW9uIG9mIHRoZSBzdHJpbmcKKyAqIEByZXR1cm5zIHRoZSBkZW1hcnNoYWxlZCBpbnRlZ2VyLgorICovCitkYnVzX3VpbnQzMl90CitfZGJ1c19tYXJzaGFsX3JlYWRfdWludDMyICAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKm5ld19wb3MpCit7CisgIHBvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChwb3MsIDQpOworCisgIGlmIChuZXdfcG9zKQorICAgICpuZXdfcG9zID0gcG9zICsgNDsKKworICBfZGJ1c19hc3NlcnQgKHBvcyArIDQgPD0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikpOworICAKKyAgcmV0dXJuIF9kYnVzX3VucGFja191aW50MzIgKGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHN0cikgKyBwb3MpOworfQorCisvKioKKyAqIERlbWFyc2hhbHMgYSBiYXNpYy10eXBlZCB2YWx1ZS4gVGhlICJ2YWx1ZSIgcG9pbnRlciBpcyBhbHdheXMKKyAqIHRoZSBhZGRyZXNzIG9mIGEgdmFyaWFibGUgb2YgdGhlIGJhc2ljIHR5cGUuIFNvIGUuZy4KKyAqIGlmIHRoZSBiYXNpYyB0eXBlIGlzICJkb3VibGUiIHRoZW4gdGhlIHBvaW50ZXIgaXMKKyAqIGEgZG91YmxlKiwgYW5kIGlmIGl0J3MgImNoYXIqIiB0aGVuIHRoZSBwb2ludGVyIGlzCisgKiBhICJjaGFyKioiLgorICoKKyAqIEEgdmFsdWUgb2YgdHlwZSAjREJ1c0Jhc2ljVmFsdWUgaXMgZ3VhcmFudGVlZCB0byBiZSBsYXJnZSBlbm91Z2ggdG8KKyAqIGhvbGQgYW55IG9mIHRoZSB0eXBlcyB0aGF0IG1heSBiZSByZXR1cm5lZCwgd2hpY2ggaXMgaGFuZHkgaWYgeW91CisgKiBhcmUgdHJ5aW5nIHRvIGRvIHRoaW5ncyBnZW5lcmljYWxseS4gRm9yIGV4YW1wbGUgeW91IGNhbiBwYXNzCisgKiBhIERCdXNCYXNpY1ZhbHVlKiBpbiB0byB0aGlzIGZ1bmN0aW9uLCBhbmQgdGhlbiBwYXNzIHRoZSBzYW1lCisgKiBEQnVzQmFzaWNWYWx1ZSogaW4gdG8gX2RidXNfbWFyc2hhbF9iYXNpY190eXBlKCkgaW4gb3JkZXIgdG8KKyAqIG1vdmUgYSB2YWx1ZSBmcm9tIG9uZSBwbGFjZSB0byBhbm90aGVyLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBkYXRhCisgKiBAcGFyYW0gcG9zIHBvc2l0aW9uIGluIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSB0eXBlIHR5cGUgb2YgdmFsdWUgdG8gZGVtYXJzaGFsCisgKiBAcGFyYW0gdmFsdWUgcG9pbnRlciB0byByZXR1cm4gdmFsdWUgZGF0YQorICogQHBhcmFtIGJ5dGVfb3JkZXIgdGhlIGJ5dGUgb3JkZXIKKyAqIEBwYXJhbSBuZXdfcG9zIHBvaW50ZXIgdG8gdXBkYXRlIHdpdGggbmV3IHBvc2l0aW9uLCBvciAjTlVMTAorICoqLwordm9pZAorX2RidXNfbWFyc2hhbF9yZWFkX2Jhc2ljIChjb25zdCBEQnVzU3RyaW5nICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgKm5ld19wb3MpCit7CisgIGNvbnN0IGNoYXIgKnN0cl9kYXRhOworCisgIF9kYnVzX2Fzc2VydCAoZGJ1c190eXBlX2lzX2Jhc2ljICh0eXBlKSk7CisKKyAgc3RyX2RhdGEgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHN0cik7CisKKyAgLyogQmVsb3cgd2Ugdm9sYXRpbGUgdHlwZXMgdG8gYXZvaWQgYWxpYXNpbmcgaXNzdWVzOworICAgKiBzZWUgaHR0cDovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDEzNworICAgKi8KKyAgCisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSBEQlVTX1RZUEVfQllURToKKyAgICAgIHsKKyAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnZwID0gdmFsdWU7CisgICAgICAqdnAgPSAodW5zaWduZWQgY2hhcikgX2RidXNfc3RyaW5nX2dldF9ieXRlIChzdHIsIHBvcyk7CisgICAgICAocG9zKSsrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgICAgeworICAgICAgdm9sYXRpbGUgZGJ1c191aW50MTZfdCAqdnAgPSB2YWx1ZTsKKyAgICAgIHBvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChwb3MsIDIpOworICAgICAgKnZwID0gKihkYnVzX3VpbnQxNl90ICopKHN0cl9kYXRhICsgcG9zKTsKKyAgICAgIGlmIChieXRlX29yZGVyICE9IERCVVNfQ09NUElMRVJfQllURV9PUkRFUikKKwkqdnAgPSBEQlVTX1VJTlQxNl9TV0FQX0xFX0JFICgqdnApOworICAgICAgcG9zICs9IDI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQzMjoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UMzI6CisgICAgY2FzZSBEQlVTX1RZUEVfQk9PTEVBTjoKKyAgICBjYXNlIERCVVNfVFlQRV9VTklYX0ZEOgorICAgICAgeworICAgICAgdm9sYXRpbGUgZGJ1c191aW50MzJfdCAqdnAgPSB2YWx1ZTsKKyAgICAgIHBvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChwb3MsIDQpOworICAgICAgKnZwID0gKihkYnVzX3VpbnQzMl90ICopKHN0cl9kYXRhICsgcG9zKTsKKyAgICAgIGlmIChieXRlX29yZGVyICE9IERCVVNfQ09NUElMRVJfQllURV9PUkRFUikKKwkqdnAgPSBEQlVTX1VJTlQzMl9TV0FQX0xFX0JFICgqdnApOworICAgICAgcG9zICs9IDQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UNjQ6CisgICAgY2FzZSBEQlVTX1RZUEVfRE9VQkxFOgorICAgICAgeworICAgICAgdm9sYXRpbGUgZGJ1c191aW50NjRfdCAqdnAgPSB2YWx1ZTsKKyAgICAgIHBvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChwb3MsIDgpOworI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorICAgICAgaWYgKGJ5dGVfb3JkZXIgIT0gREJVU19DT01QSUxFUl9CWVRFX09SREVSKQorICAgICAgICAqdnAgPSBEQlVTX1VJTlQ2NF9TV0FQX0xFX0JFICgqKGRidXNfdWludDY0X3QqKShzdHJfZGF0YSArIHBvcykpOworICAgICAgZWxzZQorICAgICAgICAqdnAgPSAqKGRidXNfdWludDY0X3QqKShzdHJfZGF0YSArIHBvcyk7CisjZWxzZQorICAgICAgKnZwID0gKihEQnVzOEJ5dGVTdHJ1Y3QqKSAoc3RyX2RhdGEgKyBwb3MpOworICAgICAgc3dhcF84X29jdGV0cyAodnAsIGJ5dGVfb3JkZXIpOworI2VuZGlmCisgICAgICBwb3MgKz0gODsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX1NUUklORzoKKyAgICBjYXNlIERCVVNfVFlQRV9PQkpFQ1RfUEFUSDoKKyAgICAgIHsKKyAgICAgICAgaW50IGxlbjsKKyAgICAgICAgdm9sYXRpbGUgY2hhciAqKnZwID0gdmFsdWU7CisKKyAgICAgICAgbGVuID0gX2RidXNfbWFyc2hhbF9yZWFkX3VpbnQzMiAoc3RyLCBwb3MsIGJ5dGVfb3JkZXIsICZwb3MpOworCisgICAgICAgICp2cCA9IChjaGFyKikgc3RyX2RhdGEgKyBwb3M7CisKKyAgICAgICAgcG9zICs9IGxlbiArIDE7IC8qIGxlbmd0aCBwbHVzIG51bCAqLworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfU0lHTkFUVVJFOgorICAgICAgeworICAgICAgICBpbnQgbGVuOworICAgICAgICB2b2xhdGlsZSBjaGFyICoqdnAgPSB2YWx1ZTsKKworICAgICAgICBsZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHN0ciwgcG9zKTsKKyAgICAgICAgcG9zICs9IDE7CisKKyAgICAgICAgKnZwID0gKGNoYXIqKSBzdHJfZGF0YSArIHBvczsKKworICAgICAgICBwb3MgKz0gbGVuICsgMTsgLyogbGVuZ3RoIHBsdXMgbnVsICovCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJ0eXBlICVzICVkIG5vdCBhIGJhc2ljIHR5cGVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHR5cGUpLCB0eXBlKTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vdCBhIGJhc2ljIHR5cGUiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBpZiAobmV3X3BvcykKKyAgICAqbmV3X3BvcyA9IHBvczsKK30KKworc3RhdGljIGRidXNfYm9vbF90CittYXJzaGFsXzJfb2N0ZXRzIChEQnVzU3RyaW5nICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgZGJ1c191aW50MTZfdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAqcG9zX2FmdGVyKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGludCBvcmlnX2xlbjsKKworICBfZGJ1c19hc3NlcnQgKHNpemVvZiAodmFsdWUpID09IDIpOworCisgIGlmIChieXRlX29yZGVyICE9IERCVVNfQ09NUElMRVJfQllURV9PUkRFUikKKyAgICB2YWx1ZSA9IERCVVNfVUlOVDE2X1NXQVBfTEVfQkUgKHZhbHVlKTsKKworICBvcmlnX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworCisgIHJldHZhbCA9IF9kYnVzX3N0cmluZ19pbnNlcnRfMl9hbGlnbmVkIChzdHIsIGluc2VydF9hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1bnNpZ25lZCBjaGFyICopJnZhbHVlKTsKKworICBpZiAocG9zX2FmdGVyKQorICAgIHsKKyAgICAgICpwb3NfYWZ0ZXIgPSBpbnNlcnRfYXQgKyAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikgLSBvcmlnX2xlbik7CisgICAgICBfZGJ1c19hc3NlcnQgKCpwb3NfYWZ0ZXIgPD0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikpOworICAgIH0KKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK21hcnNoYWxfNF9vY3RldHMgKERCdXNTdHJpbmcgICAqc3RyLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICpwb3NfYWZ0ZXIpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgaW50IG9yaWdfbGVuOworCisgIF9kYnVzX2Fzc2VydCAoc2l6ZW9mICh2YWx1ZSkgPT0gNCk7CisKKyAgaWYgKGJ5dGVfb3JkZXIgIT0gREJVU19DT01QSUxFUl9CWVRFX09SREVSKQorICAgIHZhbHVlID0gREJVU19VSU5UMzJfU1dBUF9MRV9CRSAodmFsdWUpOworCisgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisKKyAgcmV0dmFsID0gX2RidXNfc3RyaW5nX2luc2VydF80X2FsaWduZWQgKHN0ciwgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikmdmFsdWUpOworCisgIGlmIChwb3NfYWZ0ZXIpCisgICAgeworICAgICAgKnBvc19hZnRlciA9IGluc2VydF9hdCArIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSAtIG9yaWdfbGVuKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoKnBvc19hZnRlciA8PSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSk7CisgICAgfQorCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbWFyc2hhbF84X29jdGV0cyAoREJ1c1N0cmluZyAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgREJ1c0Jhc2ljVmFsdWUgdmFsdWUsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAqcG9zX2FmdGVyKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGludCBvcmlnX2xlbjsKKworICBfZGJ1c19hc3NlcnQgKHNpemVvZiAodmFsdWUpID09IDgpOworCisgIHN3YXBfOF9vY3RldHMgKCZ2YWx1ZSwgYnl0ZV9vcmRlcik7CisKKyAgb3JpZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKworICByZXR2YWwgPSBfZGJ1c19zdHJpbmdfaW5zZXJ0XzhfYWxpZ25lZCAoc3RyLCBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciAqKSZ2YWx1ZSk7CisKKyAgaWYgKHBvc19hZnRlcikKKyAgICAqcG9zX2FmdGVyID0gaW5zZXJ0X2F0ICsgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikgLSBvcmlnX2xlbjsKKworICByZXR1cm4gcmV0dmFsOworfQorCitlbnVtCisgIHsKKyAgICBNQVJTSEFMX0FTX1NUUklORywKKyAgICBNQVJTSEFMX0FTX1NJR05BVFVSRSwKKyAgICBNQVJTSEFMX0FTX0JZVEVfQVJSQVkKKyAgfTsKKworc3RhdGljIGRidXNfYm9vbF90CittYXJzaGFsX2xlbl9mb2xsb3dlZF9ieV9ieXRlcyAoaW50ICAgICAgICAgICAgICAgICAgbWFyc2hhbF9hcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGRhdGFfbGVuLCAvKiBkb2Vzbid0IGluY2x1ZGUgbnVsIGlmIGFueSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAqcG9zX2FmdGVyKQoreworICBpbnQgcG9zOworICBEQnVzU3RyaW5nIHZhbHVlX3N0cjsKKyAgaW50IHZhbHVlX2xlbjsKKworICBfZGJ1c19hc3NlcnQgKGJ5dGVfb3JkZXIgPT0gREJVU19MSVRUTEVfRU5ESUFOIHx8IGJ5dGVfb3JkZXIgPT0gREJVU19CSUdfRU5ESUFOKTsKKyAgaWYgKGluc2VydF9hdCA+IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpKQorICAgIF9kYnVzX3dhcm4gKCJpbnNlcnRfYXQgPSAlZCBzdHJpbmcgbGVuID0gJWQgZGF0YV9sZW4gPSAlZFxuIiwKKyAgICAgICAgICAgICAgICBpbnNlcnRfYXQsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpLCBkYXRhX2xlbik7CisgIAorICBpZiAobWFyc2hhbF9hcyA9PSBNQVJTSEFMX0FTX0JZVEVfQVJSQVkpCisgICAgdmFsdWVfbGVuID0gZGF0YV9sZW47CisgIGVsc2UKKyAgICB2YWx1ZV9sZW4gPSBkYXRhX2xlbiArIDE7IC8qIHZhbHVlIGhhcyBhIG51bCAqLworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbiAoJnZhbHVlX3N0ciwgdmFsdWUsIHZhbHVlX2xlbik7CisKKyAgcG9zID0gaW5zZXJ0X2F0OworCisgIGlmIChtYXJzaGFsX2FzID09IE1BUlNIQUxfQVNfU0lHTkFUVVJFKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoZGF0YV9sZW4gPD0gREJVU19NQVhJTVVNX1NJR05BVFVSRV9MRU5HVEgpOworICAgICAgX2RidXNfYXNzZXJ0IChkYXRhX2xlbiA8PSAyNTUpOyAvKiBzYW1lIGFzIG1heCBzaWcgbGVuIHJpZ2h0IG5vdyAqLworICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZSAoc3RyLCBwb3MsIGRhdGFfbGVuKSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIHBvcyArPSAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghbWFyc2hhbF80X29jdGV0cyAoc3RyLCBwb3MsIGRhdGFfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLCAmcG9zKSkKKyAgICAgICAgZ290byBvb207CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuICgmdmFsdWVfc3RyLCAwLCB2YWx1ZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIsIHBvcykpCisgICAgZ290byBvb207CisKKyNpZiAwCisgIC8qIHRvbyBleHBlbnNpdmUgKi8KKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmdmFsdWVfc3RyLCAwLCB2YWx1ZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLCBwb3MpKTsKKyAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKHN0ciwgcG9zLCB2YWx1ZV9sZW4pOworI2VuZGlmCisKKyAgcG9zICs9IHZhbHVlX2xlbjsKKworICBpZiAocG9zX2FmdGVyKQorICAgICpwb3NfYWZ0ZXIgPSBwb3M7CisKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIC8qIERlbGV0ZSB3aGF0IHdlJ3ZlIGluc2VydGVkICovCisgIF9kYnVzX3N0cmluZ19kZWxldGUgKHN0ciwgaW5zZXJ0X2F0LCBwb3MgLSBpbnNlcnRfYXQpOworCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CittYXJzaGFsX3N0cmluZyAoREJ1c1N0cmluZyAgICAqc3RyLAorICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGluc2VydF9hdCwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgKnBvc19hZnRlcikKK3sKKyAgcmV0dXJuIG1hcnNoYWxfbGVuX2ZvbGxvd2VkX2J5X2J5dGVzIChNQVJTSEFMX0FTX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIsIGluc2VydF9hdCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuICh2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwgcG9zX2FmdGVyKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CittYXJzaGFsX3NpZ25hdHVyZSAoREJ1c1N0cmluZyAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGluc2VydF9hdCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICpwb3NfYWZ0ZXIpCit7CisgIHJldHVybiBtYXJzaGFsX2xlbl9mb2xsb3dlZF9ieV9ieXRlcyAoTUFSU0hBTF9BU19TSUdOQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLCBpbnNlcnRfYXQsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbiAodmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQ09NUElMRVJfQllURV9PUkRFUiwgLyogaXJyZWxldmFudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc19hZnRlcik7Cit9CisKKy8qKgorICogTWFyc2hhbHMgYSBiYXNpYy10eXBlZCB2YWx1ZS4gVGhlICJ2YWx1ZSIgcG9pbnRlciBpcyBhbHdheXMgdGhlCisgKiBhZGRyZXNzIG9mIGEgdmFyaWFibGUgY29udGFpbmluZyB0aGUgYmFzaWMgdHlwZSB2YWx1ZS4KKyAqIFNvIGZvciBleGFtcGxlIGZvciBpbnQzMiBpdCB3aWxsIGJlIGRidXNfaW50MzJfdCosIGFuZAorICogZm9yIHN0cmluZyBpdCB3aWxsIGJlIGNvbnN0IGNoYXIqKi4gVGhpcyBpcyBmb3Igc3ltbWV0cnkKKyAqIHdpdGggX2RidXNfbWFyc2hhbF9yZWFkX2Jhc2ljKCkgYW5kIHRvIGhhdmUgYSBzaW1wbGUKKyAqIGNvbnNpc3RlbnQgcnVsZS4KKyAqCisgKiBAcGFyYW0gc3RyIHN0cmluZyB0byBtYXJzaGFsIHRvCisgKiBAcGFyYW0gaW5zZXJ0X2F0IHdoZXJlIHRvIGluc2VydCB0aGUgdmFsdWUKKyAqIEBwYXJhbSB0eXBlIHR5cGUgb2YgdmFsdWUKKyAqIEBwYXJhbSB2YWx1ZSBwb2ludGVyIHRvIGEgdmFyaWFibGUgY29udGFpbmluZyB0aGUgdmFsdWUKKyAqIEBwYXJhbSBieXRlX29yZGVyIGJ5dGUgb3JkZXIKKyAqIEBwYXJhbSBwb3NfYWZ0ZXIgI05VTEwgb3IgdGhlIHBvc2l0aW9uIGFmdGVyIHRoZSB0eXBlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKiovCitkYnVzX2Jvb2xfdAorX2RidXNfbWFyc2hhbF93cml0ZV9iYXNpYyAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgKnBvc19hZnRlcikKK3sKKyAgY29uc3QgREJ1c0Jhc2ljVmFsdWUgKnZwOworCisgIF9kYnVzX2Fzc2VydCAoZGJ1c190eXBlX2lzX2Jhc2ljICh0eXBlKSk7CisKKyAgdnAgPSB2YWx1ZTsKKworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgREJVU19UWVBFX0JZVEU6CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZSAoc3RyLCBpbnNlcnRfYXQsIHZwLT5ieXQpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBpZiAocG9zX2FmdGVyKQorICAgICAgICAqcG9zX2FmdGVyID0gaW5zZXJ0X2F0ICsgMTsKKyAgICAgIHJldHVybiBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgICAgcmV0dXJuIG1hcnNoYWxfMl9vY3RldHMgKHN0ciwgaW5zZXJ0X2F0LCB2cC0+dTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsIHBvc19hZnRlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9CT09MRUFOOgorICAgICAgcmV0dXJuIG1hcnNoYWxfNF9vY3RldHMgKHN0ciwgaW5zZXJ0X2F0LCB2cC0+dTMyICE9IEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsIHBvc19hZnRlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQzMjoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UMzI6CisgICAgY2FzZSBEQlVTX1RZUEVfVU5JWF9GRDoKKyAgICAgIHJldHVybiBtYXJzaGFsXzRfb2N0ZXRzIChzdHIsIGluc2VydF9hdCwgdnAtPnUzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLCBwb3NfYWZ0ZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UNjQ6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDY0OgorICAgIGNhc2UgREJVU19UWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiBtYXJzaGFsXzhfb2N0ZXRzIChzdHIsIGluc2VydF9hdCwgKnZwLCBieXRlX29yZGVyLCBwb3NfYWZ0ZXIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfVFlQRV9TVFJJTkc6CisgICAgY2FzZSBEQlVTX1RZUEVfT0JKRUNUX1BBVEg6CisgICAgICBfZGJ1c19hc3NlcnQgKHZwLT5zdHIgIT0gTlVMTCk7CisgICAgICByZXR1cm4gbWFyc2hhbF9zdHJpbmcgKHN0ciwgaW5zZXJ0X2F0LCB2cC0+c3RyLCBieXRlX29yZGVyLCBwb3NfYWZ0ZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfU0lHTkFUVVJFOgorICAgICAgX2RidXNfYXNzZXJ0ICh2cC0+c3RyICE9IE5VTEwpOworICAgICAgcmV0dXJuIG1hcnNoYWxfc2lnbmF0dXJlIChzdHIsIGluc2VydF9hdCwgdnAtPnN0ciwgcG9zX2FmdGVyKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJub3QgYSBiYXNpYyB0eXBlIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbWFyc2hhbF8xX29jdGV0c19hcnJheSAoREJ1c1N0cmluZyAgICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBuX2VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgKnBvc19hZnRlcikKK3sKKyAgaW50IHBvczsKKyAgREJ1c1N0cmluZyB2YWx1ZV9zdHI7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3RfbGVuICgmdmFsdWVfc3RyLCB2YWx1ZSwgbl9lbGVtZW50cyk7CisKKyAgcG9zID0gaW5zZXJ0X2F0OworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuICgmdmFsdWVfc3RyLCAwLCBuX2VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLCBwb3MpKQorICAgIHJldHVybiBGQUxTRTsKKworICBwb3MgKz0gbl9lbGVtZW50czsKKworICBpZiAocG9zX2FmdGVyKQorICAgICpwb3NfYWZ0ZXIgPSBwb3M7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogU3dhcHMgdGhlIGVsZW1lbnRzIG9mIGFuIGFycmF5IHRvIHRoZSBvcHBvc2l0ZSBieXRlIG9yZGVyCisgKgorICogQHBhcmFtIGRhdGEgc3RhcnQgb2YgYXJyYXkKKyAqIEBwYXJhbSBuX2VsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cworICogQHBhcmFtIGFsaWdubWVudCBzaXplIG9mIGVhY2ggZWxlbWVudAorICovCit2b2lkCitfZGJ1c19zd2FwX2FycmF5ICh1bnNpZ25lZCBjaGFyICpkYXRhLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgbl9lbGVtZW50cywKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGFsaWdubWVudCkKK3sKKyAgdW5zaWduZWQgY2hhciAqZDsKKyAgdW5zaWduZWQgY2hhciAqZW5kOworCisgIF9kYnVzX2Fzc2VydCAoX0RCVVNfQUxJR05fQUREUkVTUyAoZGF0YSwgYWxpZ25tZW50KSA9PSBkYXRhKTsKKworICAvKiB3ZSB1c2UgY29uc3RfZGF0YSBhbmQgY2FzdCBpdCBvZmYgc28gREJ1c1N0cmluZyBjYW4gYmUgYSBjb25zdCBzdHJpbmcKKyAgICogZm9yIHRoZSB1bml0IHRlc3RzLiBkb24ndCBhc2suCisgICAqLworICBkID0gZGF0YTsKKyAgZW5kID0gZCArIChuX2VsZW1lbnRzICogYWxpZ25tZW50KTsKKyAgCisgIGlmIChhbGlnbm1lbnQgPT0gOCkKKyAgICB7CisgICAgICB3aGlsZSAoZCAhPSBlbmQpCisgICAgICAgIHsKKyNpZmRlZiBEQlVTX0hBVkVfSU5UNjQKKyAgICAgICAgICAqKChkYnVzX3VpbnQ2NF90KilkKSA9IERCVVNfVUlOVDY0X1NXQVBfTEVfQkUgKCooKGRidXNfdWludDY0X3QqKWQpKTsKKyNlbHNlCisgICAgICAgICAgc3dhcF84X2J5dGVzICgoREJ1c0Jhc2ljVmFsdWUqKSBkKTsKKyNlbmRpZgorICAgICAgICAgIGQgKz0gODsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZSBpZiAoYWxpZ25tZW50ID09IDQpCisgICAgeworICAgICAgd2hpbGUgKGQgIT0gZW5kKQorICAgICAgICB7CisgICAgICAgICAgKigoZGJ1c191aW50MzJfdCopZCkgPSBEQlVTX1VJTlQzMl9TV0FQX0xFX0JFICgqKChkYnVzX3VpbnQzMl90KilkKSk7CisgICAgICAgICAgZCArPSA0OworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChhbGlnbm1lbnQgPT0gMik7CisgICAgICAKKyAgICAgIHdoaWxlIChkICE9IGVuZCkKKyAgICAgICAgeworICAgICAgICAgICooKGRidXNfdWludDE2X3QqKWQpID0gREJVU19VSU5UMTZfU1dBUF9MRV9CRSAoKigoZGJ1c191aW50MTZfdCopZCkpOworICAgICAgICAgIGQgKz0gMjsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK3N3YXBfYXJyYXkgKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgIGludCAgICAgICAgIGFycmF5X3N0YXJ0LAorICAgICAgICAgICAgaW50ICAgICAgICAgbl9lbGVtZW50cywKKyAgICAgICAgICAgIGludCAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICBpbnQgICAgICAgICBhbGlnbm1lbnQpCit7CisgIF9kYnVzX2Fzc2VydCAoX0RCVVNfQUxJR05fVkFMVUUgKGFycmF5X3N0YXJ0LCBhbGlnbm1lbnQpID09ICh1bnNpZ25lZCkgYXJyYXlfc3RhcnQpOworCisgIGlmIChieXRlX29yZGVyICE9IERCVVNfQ09NUElMRVJfQllURV9PUkRFUikKKyAgICB7CisgICAgICAvKiB3ZSB1c2UgY29uc3RfZGF0YSBhbmQgY2FzdCBpdCBvZmYgc28gREJ1c1N0cmluZyBjYW4gYmUgYSBjb25zdCBzdHJpbmcKKyAgICAgICAqIGZvciB0aGUgdW5pdCB0ZXN0cy4gZG9uJ3QgYXNrLgorICAgICAgICovCisgICAgICBfZGJ1c19zd2FwX2FycmF5ICgodW5zaWduZWQgY2hhciopIChfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHN0cikgKyBhcnJheV9zdGFydCksCisgICAgICAgICAgICAgICAgICAgICAgICBuX2VsZW1lbnRzLCBhbGlnbm1lbnQpOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CittYXJzaGFsX2ZpeGVkX211bHRpIChEQnVzU3RyaW5nICAgICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIGluc2VydF9hdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNCYXNpY1ZhbHVlICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBuX2VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgKnBvc19hZnRlcikKK3sKKyAgaW50IG9sZF9zdHJpbmdfbGVuOworICBpbnQgYXJyYXlfc3RhcnQ7CisgIERCdXNTdHJpbmcgdDsKKyAgaW50IGxlbl9pbl9ieXRlczsKKworICBfZGJ1c19hc3NlcnQgKG5fZWxlbWVudHMgPD0gREJVU19NQVhJTVVNX0FSUkFZX0xFTkdUSCAvIGFsaWdubWVudCk7CisgIAorICBvbGRfc3RyaW5nX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworCisgIGxlbl9pbl9ieXRlcyA9IG5fZWxlbWVudHMgKiBhbGlnbm1lbnQ7CisgIGFycmF5X3N0YXJ0ID0gaW5zZXJ0X2F0OworICAKKyAgLyogTm90ZSB0aGF0IHdlIGRvIGFsaWdubWVudCBwYWRkaW5nIHVuY29uZGl0aW9uYWxseQorICAgKiBldmVuIGlmIHRoZSBhcnJheSBpcyBlbXB0eTsgdGhpcyBtZWFucyB0aGF0CisgICAqIHBhZGRpbmcgKyBsZW4gaXMgYWx3YXlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAgICogaW4gdGhlIGFycmF5LgorICAgKi8KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYWxpZ25tZW50IChzdHIsICZhcnJheV9zdGFydCwgYWxpZ25tZW50KSkKKyAgICBnb3RvIGVycm9yOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbiAoJnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5faW5fYnl0ZXMpOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZ0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIsIGFycmF5X3N0YXJ0KSkKKyAgICBnb3RvIGVycm9yOworCisgIHN3YXBfYXJyYXkgKHN0ciwgYXJyYXlfc3RhcnQsIG5fZWxlbWVudHMsIGJ5dGVfb3JkZXIsIGFsaWdubWVudCk7CisKKyAgaWYgKHBvc19hZnRlcikKKyAgICAqcG9zX2FmdGVyID0gYXJyYXlfc3RhcnQgKyBsZW5faW5fYnl0ZXM7CisgIAorICByZXR1cm4gVFJVRTsKKworIGVycm9yOgorICBfZGJ1c19zdHJpbmdfZGVsZXRlIChzdHIsIGluc2VydF9hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikgLSBvbGRfc3RyaW5nX2xlbik7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIE1hcnNoYWxzIGEgYmxvY2sgb2YgdmFsdWVzIG9mIGZpeGVkLWxlbmd0aCB0eXBlIGFsbCBhdCBvbmNlLCBhcyBhbgorICogb3B0aW1pemF0aW9uLiAgZGJ1c190eXBlX2lzX2ZpeGVkKCkgcmV0dXJucyAjVFJVRSBmb3IgZml4ZWQtbGVuZ3RoCisgKiB0eXBlcywgd2hpY2ggYXJlIHRoZSBiYXNpYyB0eXBlcyBtaW51cyB0aGUgc3RyaW5nLWxpa2UgdHlwZXMuCisgKgorICogVGhlIHZhbHVlIGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgYWRkZHJlc3Mgb2YgYW4KKyAqIGFycmF5LCBzbyBlLmcuICJjb25zdCBkYnVzX3VpbnQzMl90KioiCisgKgorICogQHBhcmFtIHN0ciBzdHJpbmcgdG8gbWFyc2hhbCB0bworICogQHBhcmFtIGluc2VydF9hdCB3aGVyZSB0byBpbnNlcnQgdGhlIHZhbHVlCisgKiBAcGFyYW0gZWxlbWVudF90eXBlIHR5cGUgb2YgYXJyYXkgZWxlbWVudHMKKyAqIEBwYXJhbSB2YWx1ZSBhZGRyZXNzIG9mIGFuIGFycmF5IHRvIG1hcnNoYWwKKyAqIEBwYXJhbSBuX2VsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkKKyAqIEBwYXJhbSBieXRlX29yZGVyIGJ5dGUgb3JkZXIKKyAqIEBwYXJhbSBwb3NfYWZ0ZXIgI05VTEwgb3IgdGhlIHBvc2l0aW9uIGFmdGVyIHRoZSB0eXBlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKiovCitkYnVzX2Jvb2xfdAorX2RidXNfbWFyc2hhbF93cml0ZV9maXhlZF9tdWx0aSAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBuX2VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgKnBvc19hZnRlcikKK3sKKyAgY29uc3Qgdm9pZCogdnAgPSAqKGNvbnN0IERCdXNCYXNpY1ZhbHVlKiopdmFsdWU7CisgIAorICBfZGJ1c19hc3NlcnQgKGRidXNfdHlwZV9pc19maXhlZCAoZWxlbWVudF90eXBlKSk7CisgIF9kYnVzX2Fzc2VydCAobl9lbGVtZW50cyA+PSAwKTsKKworI2lmIDAKKyAgX2RidXNfdmVyYm9zZSAoIndyaXRpbmcgJWQgZWxlbWVudHMgb2YgJXNcbiIsCisgICAgICAgICAgICAgICAgIG5fZWxlbWVudHMsIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChlbGVtZW50X3R5cGUpKTsKKyNlbmRpZgorICAKKyAgc3dpdGNoIChlbGVtZW50X3R5cGUpCisgICAgeworICAgIGNhc2UgREJVU19UWVBFX0JZVEU6CisgICAgICByZXR1cm4gbWFyc2hhbF8xX29jdGV0c19hcnJheSAoc3RyLCBpbnNlcnRfYXQsIHZwLCBuX2VsZW1lbnRzLCBieXRlX29yZGVyLCBwb3NfYWZ0ZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgICAgcmV0dXJuIG1hcnNoYWxfZml4ZWRfbXVsdGkgKHN0ciwgaW5zZXJ0X2F0LCB2cCwgbl9lbGVtZW50cywgYnl0ZV9vcmRlciwgMiwgcG9zX2FmdGVyKTsKKyAgICBjYXNlIERCVVNfVFlQRV9CT09MRUFOOgorICAgIGNhc2UgREJVU19UWVBFX0lOVDMyOgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQzMjoKKyAgICBjYXNlIERCVVNfVFlQRV9VTklYX0ZEOgorICAgICAgcmV0dXJuIG1hcnNoYWxfZml4ZWRfbXVsdGkgKHN0ciwgaW5zZXJ0X2F0LCB2cCwgbl9lbGVtZW50cywgYnl0ZV9vcmRlciwgNCwgcG9zX2FmdGVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX0lOVDY0OgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gbWFyc2hhbF9maXhlZF9tdWx0aSAoc3RyLCBpbnNlcnRfYXQsIHZwLCBuX2VsZW1lbnRzLCBieXRlX29yZGVyLCA4LCBwb3NfYWZ0ZXIpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm9uIGZpeGVkIHR5cGUgaW4gYXJyYXkgd3JpdGUiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKKworLyoqCisgKiBTa2lwcyBvdmVyIGEgYmFzaWMtdHlwZWQgdmFsdWUsIHJlcG9ydGluZyB0aGUgZm9sbG93aW5nIHBvc2l0aW9uLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBkYXRhCisgKiBAcGFyYW0gdHlwZSB0eXBlIG9mIHZhbHVlIHRvIHJlYWQKKyAqIEBwYXJhbSBieXRlX29yZGVyIHRoZSBieXRlIG9yZGVyCisgKiBAcGFyYW0gcG9zIHBvaW50ZXIgdG8gcG9zaXRpb24gaW4gdGhlIHN0cmluZywKKyAqICAgICAgICAgICAgdXBkYXRlZCBvbiByZXR1cm4gdG8gbmV3IHBvc2l0aW9uCisgKiovCit2b2lkCitfZGJ1c19tYXJzaGFsX3NraXBfYmFzaWMgKGNvbnN0IERCdXNTdHJpbmcgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICpwb3MpCit7CisgIF9kYnVzX2Fzc2VydCAoYnl0ZV9vcmRlciA9PSBEQlVTX0xJVFRMRV9FTkRJQU4gfHwKKyAgICAgICAgICAgICAgICBieXRlX29yZGVyID09IERCVVNfQklHX0VORElBTik7CisgIAorICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgREJVU19UWVBFX0JZVEU6CisgICAgICAoKnBvcykrKzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX0lOVDE2OgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQxNjoKKyAgICAgICpwb3MgPSBfREJVU19BTElHTl9WQUxVRSAoKnBvcywgMik7CisgICAgICAqcG9zICs9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9CT09MRUFOOgorICAgIGNhc2UgREJVU19UWVBFX0lOVDMyOgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQzMjoKKyAgICBjYXNlIERCVVNfVFlQRV9VTklYX0ZEOgorICAgICAgKnBvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFICgqcG9zLCA0KTsKKyAgICAgICpwb3MgKz0gNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX0lOVDY0OgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9ET1VCTEU6CisgICAgICAqcG9zID0gX0RCVVNfQUxJR05fVkFMVUUgKCpwb3MsIDgpOworICAgICAgKnBvcyArPSA4OworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfU1RSSU5HOgorICAgIGNhc2UgREJVU19UWVBFX09CSkVDVF9QQVRIOgorICAgICAgeworICAgICAgICBpbnQgbGVuOworCisgICAgICAgIGxlbiA9IF9kYnVzX21hcnNoYWxfcmVhZF91aW50MzIgKHN0ciwgKnBvcywgYnl0ZV9vcmRlciwgcG9zKTsKKyAgICAgICAgCisgICAgICAgICpwb3MgKz0gbGVuICsgMTsgLyogbGVuZ3RoIHBsdXMgbnVsICovCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9TSUdOQVRVUkU6CisgICAgICB7CisgICAgICAgIGludCBsZW47CisKKyAgICAgICAgbGVuID0gX2RidXNfc3RyaW5nX2dldF9ieXRlIChzdHIsICpwb3MpOworCisgICAgICAgICpwb3MgKz0gbGVuICsgMjsgLyogbGVuZ3RoIGJ5dGUgcGx1cyBsZW5ndGggcGx1cyBudWwgKi8KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBfZGJ1c193YXJuICgidHlwZSAlcyBub3QgYSBiYXNpYyB0eXBlXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHR5cGUpKTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vdCBhIGJhc2ljIHR5cGUiKTsKKyAgICAgIGJyZWFrOworICAgIH0KK30KKworLyoqCisgKiBTa2lwcyBhbiBhcnJheSwgcmV0dXJuaW5nIHRoZSBuZXh0IHBvc2l0aW9uLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBkYXRhCisgKiBAcGFyYW0gZWxlbWVudF90eXBlIHRoZSB0eXBlIG9mIGFycmF5IGVsZW1lbnRzCisgKiBAcGFyYW0gYnl0ZV9vcmRlciB0aGUgYnl0ZSBvcmRlcgorICogQHBhcmFtIHBvcyBwb2ludGVyIHRvIHBvc2l0aW9uIGluIHRoZSBzdHJpbmcsCisgKiAgICAgICAgICAgIHVwZGF0ZWQgb24gcmV0dXJuIHRvIG5ldyBwb3NpdGlvbgorICovCit2b2lkCitfZGJ1c19tYXJzaGFsX3NraXBfYXJyYXkgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqcG9zKQoreworICBkYnVzX3VpbnQzMl90IGFycmF5X2xlbjsKKyAgaW50IGk7CisgIGludCBhbGlnbm1lbnQ7CisKKyAgaSA9IF9EQlVTX0FMSUdOX1ZBTFVFICgqcG9zLCA0KTsKKworICBhcnJheV9sZW4gPSBfZGJ1c19tYXJzaGFsX3JlYWRfdWludDMyIChzdHIsIGksIGJ5dGVfb3JkZXIsICZpKTsKKworICBhbGlnbm1lbnQgPSBfZGJ1c190eXBlX2dldF9hbGlnbm1lbnQgKGVsZW1lbnRfdHlwZSk7CisKKyAgaSA9IF9EQlVTX0FMSUdOX1ZBTFVFIChpLCBhbGlnbm1lbnQpOworCisgICpwb3MgPSBpICsgYXJyYXlfbGVuOworfQorCisvKioKKyAqIEdldHMgdGhlIGFsaWdubWVudCByZXF1aXJlbWVudCBmb3IgdGhlIGdpdmVuIHR5cGU7CisgKiB3aWxsIGJlIDEsIDQsIG9yIDguCisgKgorICogQHBhcmFtIHR5cGVjb2RlIHRoZSB0eXBlCisgKiBAcmV0dXJucyBhbGlnbm1lbnQgb2YgMSwgNCwgb3IgOAorICovCitpbnQKK19kYnVzX3R5cGVfZ2V0X2FsaWdubWVudCAoaW50IHR5cGVjb2RlKQoreworICBzd2l0Y2ggKHR5cGVjb2RlKQorICAgIHsKKyAgICBjYXNlIERCVVNfVFlQRV9CWVRFOgorICAgIGNhc2UgREJVU19UWVBFX1ZBUklBTlQ6CisgICAgY2FzZSBEQlVTX1RZUEVfU0lHTkFUVVJFOgorICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgICAgcmV0dXJuIDI7CisgICAgY2FzZSBEQlVTX1RZUEVfQk9PTEVBTjoKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQzMjoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UMzI6CisgICAgY2FzZSBEQlVTX1RZUEVfVU5JWF9GRDoKKyAgICAgIC8qIHRoaXMgc3R1ZmYgaXMgNCBzaW5jZSBpdCBzdGFydHMgd2l0aCBhIGxlbmd0aCAqLworICAgIGNhc2UgREJVU19UWVBFX1NUUklORzoKKyAgICBjYXNlIERCVVNfVFlQRV9PQkpFQ1RfUEFUSDoKKyAgICBjYXNlIERCVVNfVFlQRV9BUlJBWToKKyAgICAgIHJldHVybiA0OworICAgIGNhc2UgREJVU19UWVBFX0lOVDY0OgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9ET1VCTEU6CisgICAgICAvKiBzdHJ1Y3QgaXMgOCBzaW5jZSBpdCBjb3VsZCBjb250YWluIGFuIDgtYWxpZ25lZCBpdGVtCisgICAgICAgKiBhbmQgaXQncyBzaW1wbGVyIHRvIGp1c3QgYWx3YXlzIGFsaWduIHN0cnVjdHMgdG8gODsKKyAgICAgICAqIHdlIHdhbnQgdGhlIGFtb3VudCBvZiBwYWRkaW5nIGluIGEgc3RydWN0IG9mIGEgZ2l2ZW4KKyAgICAgICAqIHR5cGUgdG8gYmUgcHJlZGljdGFibGUsIG5vdCBsb2NhdGlvbi1kZXBlbmRlbnQuCisgICAgICAgKiBESUNUX0VOVFJZIGlzIGFsd2F5cyB0aGUgc2FtZSBhcyBzdHJ1Y3QuCisgICAgICAgKi8KKyAgICBjYXNlIERCVVNfVFlQRV9TVFJVQ1Q6CisgICAgY2FzZSBEQlVTX1RZUEVfRElDVF9FTlRSWToKKyAgICAgIHJldHVybiA4OworCisgICAgZGVmYXVsdDoKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInVua25vd24gdHlwZWNvZGUgaW4gX2RidXNfdHlwZV9nZXRfYWxpZ25tZW50KCkiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLyoqCisgKiBSZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGdpdmVuIHR5cGUuCisgKgorICogQHBhcmFtIHR5cGVjb2RlIHRoZSB0eXBlIHRvIGRlc2NyaWJlCisgKiBAcmV0dXJucyBhIGNvbnN0YW50IHN0cmluZyBkZXNjcmliaW5nIHRoZSB0eXBlCisgKi8KK2NvbnN0IGNoYXIgKgorX2RidXNfdHlwZV90b19zdHJpbmcgKGludCB0eXBlY29kZSkKK3sKKyAgc3dpdGNoICh0eXBlY29kZSkKKyAgICB7CisgICAgY2FzZSBEQlVTX1RZUEVfSU5WQUxJRDoKKyAgICAgIHJldHVybiAiaW52YWxpZCI7CisgICAgY2FzZSBEQlVTX1RZUEVfQk9PTEVBTjoKKyAgICAgIHJldHVybiAiYm9vbGVhbiI7CisgICAgY2FzZSBEQlVTX1RZUEVfQllURToKKyAgICAgIHJldHVybiAiYnl0ZSI7CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgICByZXR1cm4gImludDE2IjsKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UMTY6CisgICAgICByZXR1cm4gInVpbnQxNiI7CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMzI6CisgICAgICByZXR1cm4gImludDMyIjsKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UMzI6CisgICAgICByZXR1cm4gInVpbnQzMiI7CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UNjQ6CisgICAgICByZXR1cm4gImludDY0IjsKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UNjQ6CisgICAgICByZXR1cm4gInVpbnQ2NCI7ICAgICAgCisgICAgY2FzZSBEQlVTX1RZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJkb3VibGUiOworICAgIGNhc2UgREJVU19UWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAic3RyaW5nIjsKKyAgICBjYXNlIERCVVNfVFlQRV9PQkpFQ1RfUEFUSDoKKyAgICAgIHJldHVybiAib2JqZWN0X3BhdGgiOworICAgIGNhc2UgREJVU19UWVBFX1NJR05BVFVSRToKKyAgICAgIHJldHVybiAic2lnbmF0dXJlIjsKKyAgICBjYXNlIERCVVNfVFlQRV9TVFJVQ1Q6CisgICAgICByZXR1cm4gInN0cnVjdCI7CisgICAgY2FzZSBEQlVTX1RZUEVfRElDVF9FTlRSWToKKyAgICAgIHJldHVybiAiZGljdF9lbnRyeSI7CisgICAgY2FzZSBEQlVTX1RZUEVfQVJSQVk6CisgICAgICByZXR1cm4gImFycmF5IjsKKyAgICBjYXNlIERCVVNfVFlQRV9WQVJJQU5UOgorICAgICAgcmV0dXJuICJ2YXJpYW50IjsKKyAgICBjYXNlIERCVVNfU1RSVUNUX0JFR0lOX0NIQVI6CisgICAgICByZXR1cm4gImJlZ2luX3N0cnVjdCI7CisgICAgY2FzZSBEQlVTX1NUUlVDVF9FTkRfQ0hBUjoKKyAgICAgIHJldHVybiAiZW5kX3N0cnVjdCI7CisgICAgY2FzZSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUjoKKyAgICAgIHJldHVybiAiYmVnaW5fZGljdF9lbnRyeSI7CisgICAgY2FzZSBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVI6CisgICAgICByZXR1cm4gImVuZF9kaWN0X2VudHJ5IjsKKyAgICBjYXNlIERCVVNfVFlQRV9VTklYX0ZEOgorICAgICAgcmV0dXJuICJ1bml4X2ZkIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICJ1bmtub3duIjsKKyAgICB9Cit9CisKKy8qKgorICogSWYgaW4gdmVyYm9zZSBtb2RlLCBwcmludCBhIGJsb2NrIG9mIGJpbmFyeSBkYXRhLgorICoKKyAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhCisgKiBAcGFyYW0gbGVuIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEKKyAqIEBwYXJhbSBvZmZzZXQgd2hlcmUgdG8gc3RhcnQgY291bnRpbmcgZm9yIGJ5dGUgaW5kZXhlcworICovCit2b2lkCitfZGJ1c192ZXJib3NlX2J5dGVzIChjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgb2Zmc2V0KQoreworICBpbnQgaTsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYWxpZ25lZDsKKworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKworICBpZiAoIV9kYnVzX2lzX3ZlcmJvc2UoKSkKKyAgICByZXR1cm47CisKKyAgLyogUHJpbnQgYmxhbmtzIG9uIGZpcnN0IHJvdyBpZiBhcHByb3ByaWF0ZSAqLworICBhbGlnbmVkID0gX0RCVVNfQUxJR05fQUREUkVTUyAoZGF0YSwgNCk7CisgIGlmIChhbGlnbmVkID4gZGF0YSkKKyAgICBhbGlnbmVkIC09IDQ7CisgIF9kYnVzX2Fzc2VydCAoYWxpZ25lZCA8PSBkYXRhKTsKKworICBpZiAoYWxpZ25lZCAhPSBkYXRhKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlNGxkXHQlcDogIiwgLSAobG9uZykoZGF0YSAtIGFsaWduZWQpLCBhbGlnbmVkKTsKKyAgICAgIHdoaWxlIChhbGlnbmVkICE9IGRhdGEpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAgICIpOworICAgICAgICAgICsrYWxpZ25lZDsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBub3cgcHJpbnQgdGhlIGJ5dGVzICovCisgIGkgPSAwOworICB3aGlsZSAoaSA8IGxlbikKKyAgICB7CisgICAgICBpZiAoX0RCVVNfQUxJR05fQUREUkVTUyAoJmRhdGFbaV0sIDQpID09ICZkYXRhW2ldKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiU0ZFx0JXA6ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsgaSwgJmRhdGFbaV0pOworICAgICAgICB9CisKKyAgICAgIGlmIChkYXRhW2ldID49IDMyICYmCisgICAgICAgICAgZGF0YVtpXSA8PSAxMjYpCisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgJyVjJyAiLCBkYXRhW2ldKTsKKyAgICAgIGVsc2UKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIjB4JXMleCAiLAorICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2ldIDw9IDB4ZiA/ICIwIiA6ICIiLCBkYXRhW2ldKTsKKworICAgICAgKytpOworCisgICAgICBpZiAoX0RCVVNfQUxJR05fQUREUkVTUyAoJmRhdGFbaV0sIDQpID09ICZkYXRhW2ldKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGkgPiAzKQorICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkJFOiAlZCBMRTogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdW5wYWNrX3VpbnQzMiAoREJVU19CSUdfRU5ESUFOLCAmZGF0YVtpLTRdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3VucGFja191aW50MzIgKERCVVNfTElUVExFX0VORElBTiwgJmRhdGFbaS00XSkpOworCisgICAgICAgICAgaWYgKGkgPiA3ICYmCisgICAgICAgICAgICAgIF9EQlVTX0FMSUdOX0FERFJFU1MgKCZkYXRhW2ldLCA4KSA9PSAmZGF0YVtpXSkKKyAgICAgICAgICAgIHsKKyNpZmRlZiBEQlVTX0lOVDY0X1BSSU5URl9NT0RJRklFUgorICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiIHU2NDogMHglIiBEQlVTX0lOVDY0X1BSSU5URl9NT0RJRklFUiAieCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooZGJ1c191aW50NjRfdCopJmRhdGFbaS04XSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiBkYmw6ICVnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihkb3VibGUqKSZkYXRhW2ktOF0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIlxuIik7Cit9CisKKy8qKgorICogRHVtcCB0aGUgZ2l2ZW4gcGFydCBvZiB0aGUgc3RyaW5nIHRvIHZlcmJvc2UgbG9nLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiByYW5nZSB0byBkdW1wCisgKiBAcGFyYW0gbGVuIGxlbmd0aCBvZiByYW5nZQorICovCit2b2lkCitfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoY29uc3QgREJ1c1N0cmluZyAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGxlbikKK3sKKyAgY29uc3QgY2hhciAqZDsKKyAgaW50IHJlYWxfbGVuOworCisgIHJlYWxfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKworICBpZiAoc3RhcnQgPiByZWFsX2xlbikKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiICBbJWQsJWQpIGlzIG5vdCBpbnNpZGUgc3RyaW5nIG9mIGxlbmd0aCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBsZW4sIHJlYWxfbGVuKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKChzdGFydCArIGxlbikgPiByZWFsX2xlbikKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiICBbJWQsJWQpIGV4dGVuZHMgb3V0c2lkZSBzdHJpbmcgb2YgbGVuZ3RoICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGxlbiwgcmVhbF9sZW4pOworICAgICAgbGVuID0gcmVhbF9sZW4gLSBzdGFydDsKKyAgICB9CisKKyAgZCA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHN0ciwgc3RhcnQsIGxlbik7CisKKyAgX2RidXNfdmVyYm9zZV9ieXRlcyAoZCwgbGVuLCBzdGFydCk7Cit9CisKK3N0YXRpYyBpbnQKK21hcF90eXBlX2NoYXJfdG9fdHlwZSAoaW50IHQpCit7CisgIGlmICh0ID09IERCVVNfU1RSVUNUX0JFR0lOX0NIQVIpCisgICAgcmV0dXJuIERCVVNfVFlQRV9TVFJVQ1Q7CisgIGVsc2UgaWYgKHQgPT0gREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVIpCisgICAgcmV0dXJuIERCVVNfVFlQRV9ESUNUX0VOVFJZOworICBlbHNlCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0ICh0ICE9IERCVVNfU1RSVUNUX0VORF9DSEFSKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAodCAhPSBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVIpOworICAgICAgcmV0dXJuIHQ7CisgICAgfQorfQorCisvKioKKyAqIEdldCB0aGUgZmlyc3QgdHlwZSBpbiB0aGUgc2lnbmF0dXJlLiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMKKyAqIGFuZCBqdXN0IGdldHRpbmcgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHNpZ25hdHVyZSBpcyB0aGF0IHlvdSB3b24ndAorICogZ2V0IERCVVNfU1RSVUNUX0JFR0lOX0NIQVIsIHlvdSdsbCBnZXQgREJVU19UWVBFX1NUUlVDVAorICogaW5zdGVhZC4KKyAqCisgKiBAcGFyYW0gc3RyIHN0cmluZyBjb250YWluaW5nIHNpZ25hdHVyZQorICogQHBhcmFtIHBvcyB3aGVyZSB0aGUgc2lnbmF0dXJlIHN0YXJ0cworICogQHJldHVybnMgdGhlIGZpcnN0IHR5cGUgaW4gdGhlIHNpZ25hdHVyZQorICovCitpbnQKK19kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgcG9zKQoreworICByZXR1cm4gbWFwX3R5cGVfY2hhcl90b190eXBlIChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHN0ciwgcG9zKSk7Cit9CisKKy8qKgorICogU2ltaWxhciB0byAjX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmUsIGJ1dCBvcGVyYXRlcworICogb24gYSBDIHN0cmluZyBidWZmZXIuCisgKgorICogQHBhcmFtIHN0ciBhIEMgc3RyaW5nIGJ1ZmZlcgorICogQHBhcmFtIHBvcyB3aGVyZSB0aGUgc2lnbmF0dXJlIHN0YXJ0cworICogQHJldHVybnMgdGhlIGZpcnN0IHR5cGUgaW4gdGhlIHNpZ25hdHVyZQorICovCitpbnQKK19kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlX2Nfc3RyIChjb25zdCBjaGFyICAgICAgICpzdHIsCisJCQkJICAgICBpbnQgICAgICAgICAgICAgICBwb3MpCit7CisgIHJldHVybiBtYXBfdHlwZV9jaGFyX3RvX3R5cGUgKHN0cltwb3NdKTsKK30KKworLyoqIEB9ICovCisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyoqCisgKiBSZWFkcyBhIGJsb2NrIG9mIGZpeGVkLWxlbmd0aCBiYXNpYyB2YWx1ZXMsIGFzIGFuIG9wdGltaXphdGlvbgorICogdnMuIHJlYWRpbmcgZWFjaCBvbmUgaW5kaXZpZHVhbGx5IGludG8gYSBuZXcgYnVmZmVyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZGF0YSBpbi1wbGFjZTsgaXQgZG9lcyBub3QgbWFrZSBhIGNvcHksCisgKiBhbmQgaXQgZG9lcyBub3Qgc3dhcCB0aGUgYnl0ZXMuCisgKgorICogSWYgeW91IGFzayBmb3IgI0RCVVNfVFlQRV9ET1VCTEUgeW91IHdpbGwgZ2V0IGEgImNvbnN0IGRvdWJsZSoiIGJhY2sKKyAqIGFuZCB0aGUgInZhbHVlIiBhcmd1bWVudCBzaG91bGQgYmUgYSAiY29uc3QgZG91YmxlKioiIGFuZCBzbyBvbi4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gcmVhZCBmcm9tCisgKiBAcGFyYW0gcG9zIHBvc2l0aW9uIHRvIHJlYWQgZnJvbQorICogQHBhcmFtIGVsZW1lbnRfdHlwZSB0eXBlIG9mIGFycmF5IGVsZW1lbnRzCisgKiBAcGFyYW0gdmFsdWUgcGxhY2UgdG8gcmV0dXJuIHRoZSBhcnJheQorICogQHBhcmFtIG5fZWxlbWVudHMgbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIHRvIHJlYWQKKyAqIEBwYXJhbSBieXRlX29yZGVyIHRoZSBieXRlIG9yZGVyLCB1c2VkIHRvIHJlYWQgdGhlIGFycmF5IGxlbmd0aAorICogQHBhcmFtIG5ld19wb3MgI05VTEwgb3IgbG9jYXRpb24gdG8gc3RvcmUgYSBwb3NpdGlvbiBhZnRlciB0aGUgZWxlbWVudHMKKyAqLwordm9pZAorX2RidXNfbWFyc2hhbF9yZWFkX2ZpeGVkX211bHRpICAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBuX2VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKm5ld19wb3MpCit7CisgIGludCBhcnJheV9sZW47CisgIGludCBhbGlnbm1lbnQ7CisKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3R5cGVfaXNfZml4ZWQgKGVsZW1lbnRfdHlwZSkpOworICBfZGJ1c19hc3NlcnQgKGRidXNfdHlwZV9pc19iYXNpYyAoZWxlbWVudF90eXBlKSk7CisKKyNpZiAwCisgIF9kYnVzX3ZlcmJvc2UgKCJyZWFkaW5nICVkIGVsZW1lbnRzIG9mICVzXG4iLAorICAgICAgICAgICAgICAgICBuX2VsZW1lbnRzLCBfZGJ1c190eXBlX3RvX3N0cmluZyAoZWxlbWVudF90eXBlKSk7CisjZW5kaWYKKyAgCisgIGFsaWdubWVudCA9IF9kYnVzX3R5cGVfZ2V0X2FsaWdubWVudCAoZWxlbWVudF90eXBlKTsKKworICBwb3MgPSBfREJVU19BTElHTl9WQUxVRSAocG9zLCBhbGlnbm1lbnQpOworICAKKyAgYXJyYXlfbGVuID0gbl9lbGVtZW50cyAqIGFsaWdubWVudDsKKworICAqKGNvbnN0IERCdXNCYXNpY1ZhbHVlKiopIHZhbHVlID0gKHZvaWQqKSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChzdHIsIHBvcywgYXJyYXlfbGVuKTsKKyAgaWYgKG5ld19wb3MpCisgICAgKm5ld19wb3MgPSBwb3MgKyBhcnJheV9sZW47Cit9CisKK3N0YXRpYyB2b2lkCitzd2FwX3Rlc3RfYXJyYXkgKHZvaWQgKmFycmF5LAorICAgICAgICAgICAgICAgICBpbnQgICBsZW5fYnl0ZXMsCisgICAgICAgICAgICAgICAgIGludCAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgIGludCAgIGFsaWdubWVudCkKK3sKKyAgREJ1c1N0cmluZyB0OworCisgIGlmIChhbGlnbm1lbnQgPT0gMSkKKyAgICByZXR1cm47CisgIAorICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4gKCZ0LCBhcnJheSwgbGVuX2J5dGVzKTsKKyAgc3dhcF9hcnJheSAoJnQsIDAsIGxlbl9ieXRlcyAvIGFsaWdubWVudCwgYnl0ZV9vcmRlciwgYWxpZ25tZW50KTsKK30KKworI2RlZmluZSBNQVJTSEFMX0JBU0lDKHR5cGVuYW1lLCBieXRlX29yZGVyLCBsaXRlcmFsKSAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB2XyMjdHlwZW5hbWUgPSBsaXRlcmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpZiAoIV9kYnVzX21hcnNoYWxfd3JpdGVfYmFzaWMgKCZzdHIsIHBvcywgREJVU19UWVBFXyMjdHlwZW5hbWUsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfIyN0eXBlbmFtZSwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwgTlVMTCkpICAgICAgICAgICAgICAgICAgXAorICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBERU1BUlNIQUxfQkFTSUModHlwZW5hbWUsIGJ5dGVfb3JkZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfZGJ1c19tYXJzaGFsX3JlYWRfYmFzaWMgKCZzdHIsIHBvcywgREJVU19UWVBFXyMjdHlwZW5hbWUsICZ2XyMjdHlwZW5hbWUsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwgJnBvcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgREVNQVJTSEFMX0JBU0lDX0FORF9DSEVDSyh0eXBlbmFtZSwgYnl0ZV9vcmRlciwgbGl0ZXJhbCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIERFTUFSU0hBTF9CQVNJQyAodHlwZW5hbWUsIGJ5dGVfb3JkZXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobGl0ZXJhbCAhPSB2XyMjdHlwZW5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJnN0ciwgZHVtcF9wb3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgLSBkdW1wX3Bvcyk7ICAgICAgICBcCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRlbWFyc2hhbGVkIHdyb25nIHZhbHVlIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBNQVJTSEFMX1RFU1QodHlwZW5hbWUsIGJ5dGVfb3JkZXIsIGxpdGVyYWwpICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUFSU0hBTF9CQVNJQyAodHlwZW5hbWUsIGJ5dGVfb3JkZXIsIGxpdGVyYWwpOyAgICAgICAgICAgICAgXAorICAgIGR1bXBfcG9zID0gcG9zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBERU1BUlNIQUxfQkFTSUNfQU5EX0NIRUNLICh0eXBlbmFtZSwgYnl0ZV9vcmRlciwgbGl0ZXJhbCk7ICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgTUFSU0hBTF9URVNUX1NUUkNNUCh0eXBlbmFtZSwgYnl0ZV9vcmRlciwgbGl0ZXJhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1BUlNIQUxfQkFTSUMgKHR5cGVuYW1lLCBieXRlX29yZGVyLCBsaXRlcmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkdW1wX3BvcyA9IHBvczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgREVNQVJTSEFMX0JBU0lDICh0eXBlbmFtZSwgYnl0ZV9vcmRlcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChzdHJjbXAgKGxpdGVyYWwsIHZfIyN0eXBlbmFtZSkgIT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmc3RyLCBkdW1wX3BvcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpIC0gZHVtcF9wb3MpOyAgICAgIFwKKyAgICAgICAgX2RidXNfd2FybiAoImxpdGVyYWwgJyVzJ1xudmFsdWUgICclcydcbiIsIGxpdGVyYWwsIHZfIyN0eXBlbmFtZSk7ICAgICAgICAgICAgICBcCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRlbWFyc2hhbGVkIHdyb25nIHZhbHVlIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBNQVJTSEFMX0ZJWEVEX0FSUkFZKHR5cGVuYW1lLCBieXRlX29yZGVyLCBsaXRlcmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpbnQgbmV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB2X1VJTlQzMiA9IHNpemVvZihsaXRlcmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpZiAoIV9kYnVzX21hcnNoYWxfd3JpdGVfYmFzaWMgKCZzdHIsIHBvcywgREJVU19UWVBFX1VJTlQzMiwgJnZfVUlOVDMyLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsICZuZXh0KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB2X0FSUkFZXyMjdHlwZW5hbWUgPSBsaXRlcmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpZiAoIV9kYnVzX21hcnNoYWxfd3JpdGVfZml4ZWRfbXVsdGkgKCZzdHIsIG5leHQsIERCVVNfVFlQRV8jI3R5cGVuYW1lLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X0FSUkFZXyMjdHlwZW5hbWUsIF9EQlVTX05fRUxFTUVOVFMobGl0ZXJhbCksICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsIE5VTEwpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBERU1BUlNIQUxfRklYRURfQVJSQVkodHlwZW5hbWUsIGJ5dGVfb3JkZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBuZXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFsaWdubWVudCA9IF9kYnVzX3R5cGVfZ2V0X2FsaWdubWVudCAoREJVU19UWVBFXyMjdHlwZW5hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZfVUlOVDMyID0gX2RidXNfbWFyc2hhbF9yZWFkX3VpbnQzMiAoJnN0ciwgZHVtcF9wb3MsIGJ5dGVfb3JkZXIsICZuZXh0KTsgICAgICAgICAgICAgICAgICAgXAorICAgIF9kYnVzX21hcnNoYWxfcmVhZF9maXhlZF9tdWx0aSAoJnN0ciwgbmV4dCwgREJVU19UWVBFXyMjdHlwZW5hbWUsICZ2X0FSUkFZXyMjdHlwZW5hbWUsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VSU5UMzIvYWxpZ25tZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwgTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN3YXBfdGVzdF9hcnJheSAodl9BUlJBWV8jI3R5cGVuYW1lLCB2X1VJTlQzMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwgYWxpZ25tZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIERFTUFSU0hBTF9GSVhFRF9BUlJBWV9BTkRfQ0hFQ0sodHlwZW5hbWUsIGJ5dGVfb3JkZXIsIGxpdGVyYWwpICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBERU1BUlNIQUxfRklYRURfQVJSQVkgKHR5cGVuYW1lLCBieXRlX29yZGVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKG1lbWNtcCAobGl0ZXJhbCwgdl9BUlJBWV8jI3R5cGVuYW1lLCBzaXplb2YgKGxpdGVyYWwpICE9IDApKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIk1BUlNIQUxFRCBEQVRBXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmc3RyLCBkdW1wX3BvcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgLSBkdW1wX3Bvcyk7ICAgICAgIFwKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIkxJVEVSQUwgREFUQVxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXMgKChjaGFyKilsaXRlcmFsLCBzaXplb2YgKGxpdGVyYWwpLCAwKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfZGJ1c192ZXJib3NlICgiUkVBRCBEQVRBXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlcyAoKGNoYXIqKXZfQVJSQVlfIyN0eXBlbmFtZSwgc2l6ZW9mIChsaXRlcmFsKSwgMCk7ICAgICAgICAgICBcCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRlbWFyc2hhbGVkIHdyb25nIGZpeGVkIGFycmF5IHZhbHVlIik7ICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBNQVJTSEFMX1RFU1RfRklYRURfQVJSQVkodHlwZW5hbWUsIGJ5dGVfb3JkZXIsIGxpdGVyYWwpICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1BUlNIQUxfRklYRURfQVJSQVkgKHR5cGVuYW1lLCBieXRlX29yZGVyLCBsaXRlcmFsKTsgICAgICAgICAgICAgICAgXAorICAgIGR1bXBfcG9zID0gcG9zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIERFTUFSU0hBTF9GSVhFRF9BUlJBWV9BTkRfQ0hFQ0sgKHR5cGVuYW1lLCBieXRlX29yZGVyLCBsaXRlcmFsKTsgICAgXAorICB9IHdoaWxlICgwKQorCitkYnVzX2Jvb2xfdAorX2RidXNfbWFyc2hhbF90ZXN0ICh2b2lkKQoreworICBpbnQgYWxpZ25tZW50OworICBEQnVzU3RyaW5nIHN0cjsKKyAgaW50IHBvcywgZHVtcF9wb3M7CisgIHVuc2lnbmVkIGNoYXIgYXJyYXkxWzVdID0geyAzLCA0LCAwLCAxLCA5IH07CisgIGRidXNfaW50MTZfdCBhcnJheTJbM10gPSB7IDEyNCwgNDU3LCA3ODAgfTsKKyAgZGJ1c19pbnQzMl90IGFycmF5NFszXSA9IHsgMTIzLCA0NTYsIDc4OSB9OworI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorICBkYnVzX2ludDY0X3QgYXJyYXk4WzNdID0geyBEQlVTX0lOVDY0X0NPTlNUQU5UICgweDEyM2ZmZmZmZmZmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlQ2NF9DT05TVEFOVCAoMHg0NTZmZmZmZmZmZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5UNjRfQ09OU1RBTlQgKDB4Nzg5ZmZmZmZmZmYpIH07CisgIGRidXNfaW50NjRfdCAqdl9BUlJBWV9JTlQ2NDsKKyNlbmRpZgorICB1bnNpZ25lZCBjaGFyICp2X0FSUkFZX0JZVEU7CisgIGRidXNfaW50MTZfdCAqdl9BUlJBWV9JTlQxNjsKKyAgZGJ1c191aW50MTZfdCAqdl9BUlJBWV9VSU5UMTY7CisgIGRidXNfaW50MzJfdCAqdl9BUlJBWV9JTlQzMjsKKyAgZGJ1c191aW50MzJfdCAqdl9BUlJBWV9VSU5UMzI7CisgIERCdXNTdHJpbmcgdDsKKyAgZG91YmxlIHZfRE9VQkxFOworICBkb3VibGUgdF9ET1VCTEU7CisgIGRidXNfaW50MTZfdCB2X0lOVDE2OworICBkYnVzX3VpbnQxNl90IHZfVUlOVDE2OworICBkYnVzX2ludDMyX3Qgdl9JTlQzMjsKKyAgZGJ1c191aW50MzJfdCB2X1VJTlQzMjsKKyAgZGJ1c19pbnQ2NF90IHZfSU5UNjQ7CisgIGRidXNfdWludDY0X3Qgdl9VSU5UNjQ7CisgIHVuc2lnbmVkIGNoYXIgdl9CWVRFOworICBkYnVzX2Jvb2xfdCB2X0JPT0xFQU47CisgIGNvbnN0IGNoYXIgKnZfU1RSSU5HOworICBjb25zdCBjaGFyICp2X1NJR05BVFVSRTsKKyAgY29uc3QgY2hhciAqdl9PQkpFQ1RfUEFUSDsKKyAgaW50IGJ5dGVfb3JkZXI7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGluaXQgc3RyaW5nIik7CisKKyAgcG9zID0gMDsKKworICAvKiBNYXJzaGFsIGRvdWJsZXMgKi8KKyAgTUFSU0hBTF9CQVNJQyAoRE9VQkxFLCBEQlVTX0JJR19FTkRJQU4sIDMuMTQpOworICBERU1BUlNIQUxfQkFTSUMgKERPVUJMRSwgREJVU19CSUdfRU5ESUFOKTsKKyAgdF9ET1VCTEUgPSAzLjE0OworICBpZiAoIV9EQlVTX0RPVUJMRVNfQklUV0lTRV9FUVVBTCAodF9ET1VCTEUsIHZfRE9VQkxFKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJnb3Qgd3JvbmcgZG91YmxlIHZhbHVlIik7CisKKyAgTUFSU0hBTF9CQVNJQyAoRE9VQkxFLCBEQlVTX0xJVFRMRV9FTkRJQU4sIDMuMTQpOworICBERU1BUlNIQUxfQkFTSUMgKERPVUJMRSwgREJVU19MSVRUTEVfRU5ESUFOKTsKKyAgdF9ET1VCTEUgPSAzLjE0OworICBpZiAoIV9EQlVTX0RPVUJMRVNfQklUV0lTRV9FUVVBTCAodF9ET1VCTEUsIHZfRE9VQkxFKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJnb3Qgd3JvbmcgZG91YmxlIHZhbHVlIik7CisKKyAgLyogTWFyc2hhbCBzaWduZWQgMTYgaW50ZWdlcnMgKi8KKyAgTUFSU0hBTF9URVNUIChJTlQxNiwgREJVU19CSUdfRU5ESUFOLCAtMTIzNDUpOworICBNQVJTSEFMX1RFU1QgKElOVDE2LCBEQlVTX0xJVFRMRV9FTkRJQU4sIC0xMjM0NSk7CisKKyAgLyogTWFyc2hhbCB1bnNpZ25lZCAxNiBpbnRlZ2VycyAqLworICBNQVJTSEFMX1RFU1QgKFVJTlQxNiwgREJVU19CSUdfRU5ESUFOLCAweDEyMzQpOworICBNQVJTSEFMX1RFU1QgKFVJTlQxNiwgREJVU19MSVRUTEVfRU5ESUFOLCAweDEyMzQpOworICAKKyAgLyogTWFyc2hhbCBzaWduZWQgaW50ZWdlcnMgKi8KKyAgTUFSU0hBTF9URVNUIChJTlQzMiwgREJVU19CSUdfRU5ESUFOLCAtMTIzNDU2NzgpOworICBNQVJTSEFMX1RFU1QgKElOVDMyLCBEQlVTX0xJVFRMRV9FTkRJQU4sIC0xMjM0NTY3OCk7CisKKyAgLyogTWFyc2hhbCB1bnNpZ25lZCBpbnRlZ2VycyAqLworICBNQVJTSEFMX1RFU1QgKFVJTlQzMiwgREJVU19CSUdfRU5ESUFOLCAweDEyMzQ1Njc4KTsKKyAgTUFSU0hBTF9URVNUIChVSU5UMzIsIERCVVNfTElUVExFX0VORElBTiwgMHgxMjM0NTY3OCk7CisKKyNpZmRlZiBEQlVTX0hBVkVfSU5UNjQKKyAgLyogTWFyc2hhbCBzaWduZWQgaW50ZWdlcnMgKi8KKyAgTUFSU0hBTF9URVNUIChJTlQ2NCwgREJVU19CSUdfRU5ESUFOLCBEQlVTX0lOVDY0X0NPTlNUQU5UICgtMHgxMjM0NTY3ODlhYmM3KSk7CisgIE1BUlNIQUxfVEVTVCAoSU5UNjQsIERCVVNfTElUVExFX0VORElBTiwgREJVU19JTlQ2NF9DT05TVEFOVCAoLTB4MTIzNDU2Nzg5YWJjNykpOworCisgIC8qIE1hcnNoYWwgdW5zaWduZWQgaW50ZWdlcnMgKi8KKyAgTUFSU0hBTF9URVNUIChVSU5UNjQsIERCVVNfQklHX0VORElBTiwgREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MTIzNDU2Nzg5YWJjNykpOworICBNQVJTSEFMX1RFU1QgKFVJTlQ2NCwgREJVU19MSVRUTEVfRU5ESUFOLCBEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHgxMjM0NTY3ODlhYmM3KSk7CisjZW5kaWYgLyogREJVU19IQVZFX0lOVDY0ICovCisKKyAgLyogTWFyc2hhbCBieXRlICovCisgIE1BUlNIQUxfVEVTVCAoQllURSwgREJVU19CSUdfRU5ESUFOLCA1KTsKKyAgTUFSU0hBTF9URVNUIChCWVRFLCBEQlVTX0xJVFRMRV9FTkRJQU4sIDUpOworCisgIC8qIE1hcnNoYWwgYWxsIHBvc3NpYmxlIGJvb2xzISAqLworICBNQVJTSEFMX1RFU1QgKEJPT0xFQU4sIERCVVNfQklHX0VORElBTiwgRkFMU0UpOworICBNQVJTSEFMX1RFU1QgKEJPT0xFQU4sIERCVVNfTElUVExFX0VORElBTiwgRkFMU0UpOworICBNQVJTSEFMX1RFU1QgKEJPT0xFQU4sIERCVVNfQklHX0VORElBTiwgVFJVRSk7CisgIE1BUlNIQUxfVEVTVCAoQk9PTEVBTiwgREJVU19MSVRUTEVfRU5ESUFOLCBUUlVFKTsKKworICAvKiBNYXJzaGFsIHN0cmluZ3MgKi8KKyAgTUFSU0hBTF9URVNUX1NUUkNNUCAoU1RSSU5HLCBEQlVTX0JJR19FTkRJQU4sICIiKTsKKyAgTUFSU0hBTF9URVNUX1NUUkNNUCAoU1RSSU5HLCBEQlVTX0xJVFRMRV9FTkRJQU4sICIiKTsKKyAgTUFSU0hBTF9URVNUX1NUUkNNUCAoU1RSSU5HLCBEQlVTX0JJR19FTkRJQU4sICJUaGlzIGlzIHRoZSBkYnVzIHRlc3Qgc3RyaW5nIik7CisgIE1BUlNIQUxfVEVTVF9TVFJDTVAgKFNUUklORywgREJVU19MSVRUTEVfRU5ESUFOLCAiVGhpcyBpcyB0aGUgZGJ1cyB0ZXN0IHN0cmluZyIpOworCisgIC8qIG9iamVjdCBwYXRocyAqLworICBNQVJTSEFMX1RFU1RfU1RSQ01QIChPQkpFQ1RfUEFUSCwgREJVU19CSUdfRU5ESUFOLCAiL2EvYi9jIik7CisgIE1BUlNIQUxfVEVTVF9TVFJDTVAgKE9CSkVDVF9QQVRILCBEQlVTX0xJVFRMRV9FTkRJQU4sICIvYS9iL2MiKTsKKworICAvKiBzaWduYXR1cmVzICovCisgIE1BUlNIQUxfVEVTVF9TVFJDTVAgKFNJR05BVFVSRSwgREJVU19CSUdfRU5ESUFOLCAiIik7CisgIE1BUlNIQUxfVEVTVF9TVFJDTVAgKFNJR05BVFVSRSwgREJVU19MSVRUTEVfRU5ESUFOLCAiIik7CisgIE1BUlNIQUxfVEVTVF9TVFJDTVAgKFNJR05BVFVSRSwgREJVU19CSUdfRU5ESUFOLCAiYShpaSkiKTsKKyAgTUFSU0hBTF9URVNUX1NUUkNNUCAoU0lHTkFUVVJFLCBEQlVTX0xJVFRMRV9FTkRJQU4sICJhKGlpKSIpOworCisgIC8qIEFycmF5cyAqLworICBNQVJTSEFMX1RFU1RfRklYRURfQVJSQVkgKElOVDE2LCBEQlVTX0JJR19FTkRJQU4sIGFycmF5Mik7CisgIE1BUlNIQUxfVEVTVF9GSVhFRF9BUlJBWSAoSU5UMTYsIERCVVNfTElUVExFX0VORElBTiwgYXJyYXkyKTsKKyAgTUFSU0hBTF9URVNUX0ZJWEVEX0FSUkFZIChVSU5UMTYsIERCVVNfQklHX0VORElBTiwgYXJyYXkyKTsKKyAgTUFSU0hBTF9URVNUX0ZJWEVEX0FSUkFZIChVSU5UMTYsIERCVVNfTElUVExFX0VORElBTiwgYXJyYXkyKTsKKyAgCisgIE1BUlNIQUxfVEVTVF9GSVhFRF9BUlJBWSAoSU5UMzIsIERCVVNfQklHX0VORElBTiwgYXJyYXk0KTsKKyAgTUFSU0hBTF9URVNUX0ZJWEVEX0FSUkFZIChJTlQzMiwgREJVU19MSVRUTEVfRU5ESUFOLCBhcnJheTQpOworICBNQVJTSEFMX1RFU1RfRklYRURfQVJSQVkgKFVJTlQzMiwgREJVU19CSUdfRU5ESUFOLCBhcnJheTQpOworICBNQVJTSEFMX1RFU1RfRklYRURfQVJSQVkgKFVJTlQzMiwgREJVU19MSVRUTEVfRU5ESUFOLCBhcnJheTQpOworCisgIE1BUlNIQUxfVEVTVF9GSVhFRF9BUlJBWSAoQllURSwgREJVU19CSUdfRU5ESUFOLCBhcnJheTEpOworICBNQVJTSEFMX1RFU1RfRklYRURfQVJSQVkgKEJZVEUsIERCVVNfTElUVExFX0VORElBTiwgYXJyYXkxKTsKKyAgCisjaWZkZWYgREJVU19IQVZFX0lOVDY0CisgIE1BUlNIQUxfVEVTVF9GSVhFRF9BUlJBWSAoSU5UNjQsIERCVVNfQklHX0VORElBTiwgYXJyYXk4KTsKKyAgTUFSU0hBTF9URVNUX0ZJWEVEX0FSUkFZIChJTlQ2NCwgREJVU19MSVRUTEVfRU5ESUFOLCBhcnJheTgpOworI2VuZGlmCisKKyNpZiAwCisKKyAgLyoKKyAgICogRklYTUUgcmVzdG9yZSB0aGUgc2V0L3BhY2sgdGVzdHMKKyAgICovCisKKyNpZmRlZiBEQlVTX0hBVkVfSU5UNjQKKyAgLyogc2V0L3BhY2sgNjQtYml0IGludGVnZXJzICovCisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmc3RyLCA4KTsKKworICAvKiBzaWduZWQgbGl0dGxlICovCisgIF9kYnVzX21hcnNoYWxfc2V0X2ludDY0ICgmc3RyLCBEQlVTX0xJVFRMRV9FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBEQlVTX0lOVDY0X0NPTlNUQU5UICgtMHgxMjM0NTY3ODlhYmM3KSk7CisKKyAgX2RidXNfYXNzZXJ0IChEQlVTX0lOVDY0X0NPTlNUQU5UICgtMHgxMjM0NTY3ODlhYmM3KSA9PQorICAgICAgICAgICAgICAgIF9kYnVzX3VucGFja19pbnQ2NCAoREJVU19MSVRUTEVfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc3RyKSkpOworCisgIC8qIHNpZ25lZCBiaWcgKi8KKyAgX2RidXNfbWFyc2hhbF9zZXRfaW50NjQgKCZzdHIsIERCVVNfQklHX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIERCVVNfSU5UNjRfQ09OU1RBTlQgKC0weDEyMzQ1Njc4OWFiYzcpKTsKKworICBfZGJ1c19hc3NlcnQgKERCVVNfSU5UNjRfQ09OU1RBTlQgKC0weDEyMzQ1Njc4OWFiYzcpID09CisgICAgICAgICAgICAgICAgX2RidXNfdW5wYWNrX2ludDY0IChEQlVTX0JJR19FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZzdHIpKSk7CisKKyAgLyogc2lnbmVkIGxpdHRsZSBwYWNrICovCisgIF9kYnVzX3BhY2tfaW50NjQgKERCVVNfSU5UNjRfQ09OU1RBTlQgKC0weDEyMzQ1Njc4OWFiYzcpLAorICAgICAgICAgICAgICAgICAgICBEQlVTX0xJVFRMRV9FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfZGF0YSAoJnN0cikpOworCisgIF9kYnVzX2Fzc2VydCAoREJVU19JTlQ2NF9DT05TVEFOVCAoLTB4MTIzNDU2Nzg5YWJjNykgPT0KKyAgICAgICAgICAgICAgICBfZGJ1c191bnBhY2tfaW50NjQgKERCVVNfTElUVExFX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpKTsKKworICAvKiBzaWduZWQgYmlnIHBhY2sgKi8KKyAgX2RidXNfcGFja19pbnQ2NCAoREJVU19JTlQ2NF9DT05TVEFOVCAoLTB4MTIzNDU2Nzg5YWJjNyksCisgICAgICAgICAgICAgICAgICAgIERCVVNfQklHX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9kYXRhICgmc3RyKSk7CisKKyAgX2RidXNfYXNzZXJ0IChEQlVTX0lOVDY0X0NPTlNUQU5UICgtMHgxMjM0NTY3ODlhYmM3KSA9PQorICAgICAgICAgICAgICAgIF9kYnVzX3VucGFja19pbnQ2NCAoREJVU19CSUdfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc3RyKSkpOworCisgIC8qIHVuc2lnbmVkIGxpdHRsZSAqLworICBfZGJ1c19tYXJzaGFsX3NldF91aW50NjQgKCZzdHIsIERCVVNfTElUVExFX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHgxMjM0NTY3ODlhYmM3KSk7CisKKyAgX2RidXNfYXNzZXJ0IChEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHgxMjM0NTY3ODlhYmM3KSA9PQorICAgICAgICAgICAgICAgIF9kYnVzX3VucGFja191aW50NjQgKERCVVNfTElUVExFX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZzdHIpKSk7CisKKyAgLyogdW5zaWduZWQgYmlnICovCisgIF9kYnVzX21hcnNoYWxfc2V0X3VpbnQ2NCAoJnN0ciwgREJVU19CSUdfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIERCVVNfVUlOVDY0X0NPTlNUQU5UICgweDEyMzQ1Njc4OWFiYzcpKTsKKworICBfZGJ1c19hc3NlcnQgKERCVVNfVUlOVDY0X0NPTlNUQU5UICgweDEyMzQ1Njc4OWFiYzcpID09CisgICAgICAgICAgICAgICAgX2RidXNfdW5wYWNrX3VpbnQ2NCAoREJVU19CSUdfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpKTsKKworICAvKiB1bnNpZ25lZCBsaXR0bGUgcGFjayAqLworICBfZGJ1c19wYWNrX3VpbnQ2NCAoREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MTIzNDU2Nzg5YWJjNyksCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0xJVFRMRV9FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKCZzdHIpKTsKKworICBfZGJ1c19hc3NlcnQgKERCVVNfVUlOVDY0X0NPTlNUQU5UICgweDEyMzQ1Njc4OWFiYzcpID09CisgICAgICAgICAgICAgICAgX2RidXNfdW5wYWNrX3VpbnQ2NCAoREJVU19MSVRUTEVfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpKTsKKworICAvKiB1bnNpZ25lZCBiaWcgcGFjayAqLworICBfZGJ1c19wYWNrX3VpbnQ2NCAoREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MTIzNDU2Nzg5YWJjNyksCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0JJR19FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKCZzdHIpKTsKKworICBfZGJ1c19hc3NlcnQgKERCVVNfVUlOVDY0X0NPTlNUQU5UICgweDEyMzQ1Njc4OWFiYzcpID09CisgICAgICAgICAgICAgICAgX2RidXNfdW5wYWNrX3VpbnQ2NCAoREJVU19CSUdfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpKTsKKyNlbmRpZiAvKiBEQlVTX0hBVkVfSU5UNjQgKi8KKworICAvKiBzZXQvcGFjayAzMi1iaXQgaW50ZWdlcnMgKi8KKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZzdHIsIDQpOworCisgIC8qIHNpZ25lZCBsaXR0bGUgKi8KKyAgX2RidXNfbWFyc2hhbF9zZXRfaW50MzIgKCZzdHIsIERCVVNfTElUVExFX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC0weDEyMzQ1Nik7CisKKyAgX2RidXNfYXNzZXJ0ICgtMHgxMjM0NTYgPT0KKyAgICAgICAgICAgICAgICBfZGJ1c191bnBhY2tfaW50MzIgKERCVVNfTElUVExFX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpKTsKKworICAvKiBzaWduZWQgYmlnICovCisgIF9kYnVzX21hcnNoYWxfc2V0X2ludDMyICgmc3RyLCBEQlVTX0JJR19FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAtMHgxMjM0NTYpOworCisgIF9kYnVzX2Fzc2VydCAoLTB4MTIzNDU2ID09CisgICAgICAgICAgICAgICAgX2RidXNfdW5wYWNrX2ludDMyIChEQlVTX0JJR19FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZzdHIpKSk7CisKKyAgLyogc2lnbmVkIGxpdHRsZSBwYWNrICovCisgIF9kYnVzX3BhY2tfaW50MzIgKC0weDEyMzQ1NiwKKyAgICAgICAgICAgICAgICAgICAgREJVU19MSVRUTEVfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKCZzdHIpKTsKKworICBfZGJ1c19hc3NlcnQgKC0weDEyMzQ1NiA9PQorICAgICAgICAgICAgICAgIF9kYnVzX3VucGFja19pbnQzMiAoREJVU19MSVRUTEVfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc3RyKSkpOworCisgIC8qIHNpZ25lZCBiaWcgcGFjayAqLworICBfZGJ1c19wYWNrX2ludDMyICgtMHgxMjM0NTYsCisgICAgICAgICAgICAgICAgICAgIERCVVNfQklHX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9kYXRhICgmc3RyKSk7CisKKyAgX2RidXNfYXNzZXJ0ICgtMHgxMjM0NTYgPT0KKyAgICAgICAgICAgICAgICBfZGJ1c191bnBhY2tfaW50MzIgKERCVVNfQklHX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpKTsKKworICAvKiB1bnNpZ25lZCBsaXR0bGUgKi8KKyAgX2RidXNfbWFyc2hhbF9zZXRfdWludDMyICgmc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDB4MTIzNDU2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfTElUVExFX0VORElBTik7CisKKyAgX2RidXNfYXNzZXJ0ICgweDEyMzQ1NiA9PQorICAgICAgICAgICAgICAgIF9kYnVzX3VucGFja191aW50MzIgKERCVVNfTElUVExFX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZzdHIpKSk7CisKKyAgLyogdW5zaWduZWQgYmlnICovCisgIF9kYnVzX21hcnNoYWxfc2V0X3VpbnQzMiAoJnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAweDEyMzQ1NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0JJR19FTkRJQU4pOworCisgIF9kYnVzX2Fzc2VydCAoMHgxMjM0NTYgPT0KKyAgICAgICAgICAgICAgICBfZGJ1c191bnBhY2tfdWludDMyIChEQlVTX0JJR19FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc3RyKSkpOworCisgIC8qIHVuc2lnbmVkIGxpdHRsZSBwYWNrICovCisgIF9kYnVzX3BhY2tfdWludDMyICgweDEyMzQ1NiwKKyAgICAgICAgICAgICAgICAgICAgIERCVVNfTElUVExFX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfZGF0YSAoJnN0cikpOworCisgIF9kYnVzX2Fzc2VydCAoMHgxMjM0NTYgPT0KKyAgICAgICAgICAgICAgICBfZGJ1c191bnBhY2tfdWludDMyIChEQlVTX0xJVFRMRV9FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc3RyKSkpOworCisgIC8qIHVuc2lnbmVkIGJpZyBwYWNrICovCisgIF9kYnVzX3BhY2tfdWludDMyICgweDEyMzQ1NiwKKyAgICAgICAgICAgICAgICAgICAgIERCVVNfQklHX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfZGF0YSAoJnN0cikpOworCisgIF9kYnVzX2Fzc2VydCAoMHgxMjM0NTYgPT0KKyAgICAgICAgICAgICAgICBfZGJ1c191bnBhY2tfdWludDMyIChEQlVTX0JJR19FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc3RyKSkpOworCisjZW5kaWYgLyogc2V0L3BhY2sgdGVzdHMgZm9yIGludGVnZXJzICovCisKKyAgLyogU3RyaW5ncyBpbi1wbGFjZSBzZXQgKi8KKyAgYnl0ZV9vcmRlciA9IERCVVNfTElUVExFX0VORElBTjsKKyAgd2hpbGUgKFRSVUUpCisgICAgeworICAgICAgLyogSW5pdCBhIHN0cmluZyAqLworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZzdHIsIDApOworCisgICAgICAvKiByZXNldCBwb3MgZm9yIHRoZSBtYWNyb3MgKi8KKyAgICAgIHBvcyA9IDA7CisKKyAgICAgIE1BUlNIQUxfVEVTVF9TVFJDTVAgKFNUUklORywgYnl0ZV9vcmRlciwgIkhlbGxvIHdvcmxkIik7CisKKyAgICAgIC8qIFNldCBpdCB0byBzb21ldGhpbmcgbG9uZ2VyICovCisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnQsICJIZWxsbyB3b3JsZCBmb28iKTsKKworICAgICAgdl9TVFJJTkcgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ0KTsKKyAgICAgIF9kYnVzX21hcnNoYWxfc2V0X2Jhc2ljICgmc3RyLCAwLCBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X1NUUklORywgYnl0ZV9vcmRlciwgTlVMTCwgTlVMTCk7CisKKyAgICAgIF9kYnVzX21hcnNoYWxfcmVhZF9iYXNpYyAoJnN0ciwgMCwgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfU1RSSU5HLCBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wICh2X1NUUklORywgIkhlbGxvIHdvcmxkIGZvbyIpID09IDApOworCisgICAgICAvKiBTZXQgaXQgdG8gc29tZXRoaW5nIHNob3J0ZXIgKi8KKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdCwgIkhlbGxvIik7CisKKyAgICAgIHZfU1RSSU5HID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmdCk7CisgICAgICBfZGJ1c19tYXJzaGFsX3NldF9iYXNpYyAoJnN0ciwgMCwgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9TVFJJTkcsIGJ5dGVfb3JkZXIsIE5VTEwsIE5VTEwpOworICAgICAgX2RidXNfbWFyc2hhbF9yZWFkX2Jhc2ljICgmc3RyLCAwLCBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9TVFJJTkcsIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHZfU1RSSU5HLCAiSGVsbG8iKSA9PSAwKTsKKworICAgICAgLyogRG8gdGhlIG90aGVyIGJ5dGUgb3JkZXIgKi8KKyAgICAgIGlmIChieXRlX29yZGVyID09IERCVVNfTElUVExFX0VORElBTikKKyAgICAgICAgYnl0ZV9vcmRlciA9IERCVVNfQklHX0VORElBTjsKKyAgICAgIGVsc2UKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgIC8qIENsZWFuIHVwICovCisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKworICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLW1hcnNoYWwtYmFzaWMuaCBiL2RidXMvZGJ1cy9kYnVzLW1hcnNoYWwtYmFzaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzRmZGFiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5oCkBAIC0wLDAgKzEsMjM3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWFyc2hhbC1iYXNpYy5oICBNYXJzaGFsbGluZyByb3V0aW5lcyBmb3IgYmFzaWMgKHByaW1pdGl2ZSkgdHlwZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIENvZGVGYWN0b3J5IEFCCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19NQVJTSEFMX0JBU0lDX0gKKyNkZWZpbmUgREJVU19NQVJTSEFMX0JBU0lDX0gKKworI2lmZGVmIEhBVkVfQllURVNXQVBfSAorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1wcm90b2NvbC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1hcmNoLWRlcHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyNkZWZpbmUgREJVU19DT01QSUxFUl9CWVRFX09SREVSIERCVVNfQklHX0VORElBTgorI2Vsc2UKKyNkZWZpbmUgREJVU19DT01QSUxFUl9CWVRFX09SREVSIERCVVNfTElUVExFX0VORElBTgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0JZVEVTV0FQX0gKKyNkZWZpbmUgREJVU19VSU5UMTZfU1dBUF9MRV9CRV9DT05TVEFOVCh2YWwpIGJzd2FwXzE2KHZhbCkKKyNkZWZpbmUgREJVU19VSU5UMzJfU1dBUF9MRV9CRV9DT05TVEFOVCh2YWwpIGJzd2FwXzMyKHZhbCkKKyNlbHNlIC8qIEhBVkVfQllURVNXQVBfSCAqLworCisjZGVmaW5lIERCVVNfVUlOVDE2X1NXQVBfTEVfQkVfQ09OU1RBTlQodmFsKQkoKGRidXNfdWludDE2X3QpICggICAgICBcCisgICAgKGRidXNfdWludDE2X3QpICgoZGJ1c191aW50MTZfdCkgKHZhbCkgPj4gOCkgfCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGRidXNfdWludDE2X3QpICgoZGJ1c191aW50MTZfdCkgKHZhbCkgPDwgOCkpKQorCisjZGVmaW5lIERCVVNfVUlOVDMyX1NXQVBfTEVfQkVfQ09OU1RBTlQodmFsKQkoKGRidXNfdWludDMyX3QpICggICAgICBcCisgICAgKCgoZGJ1c191aW50MzJfdCkgKHZhbCkgJiAoZGJ1c191aW50MzJfdCkgMHgwMDAwMDBmZlUpIDw8IDI0KSB8ICAgICBcCisgICAgKCgoZGJ1c191aW50MzJfdCkgKHZhbCkgJiAoZGJ1c191aW50MzJfdCkgMHgwMDAwZmYwMFUpIDw8ICA4KSB8ICAgICBcCisgICAgKCgoZGJ1c191aW50MzJfdCkgKHZhbCkgJiAoZGJ1c191aW50MzJfdCkgMHgwMGZmMDAwMFUpID4+ICA4KSB8ICAgICBcCisgICAgKCgoZGJ1c191aW50MzJfdCkgKHZhbCkgJiAoZGJ1c191aW50MzJfdCkgMHhmZjAwMDAwMFUpID4+IDI0KSkpCisKKyNlbmRpZiAvKiBIQVZFX0JZVEVTV0FQX0ggKi8KKworI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorCisjaWZkZWYgSEFWRV9CWVRFU1dBUF9ICisjZGVmaW5lIERCVVNfVUlOVDY0X1NXQVBfTEVfQkVfQ09OU1RBTlQodmFsKSBic3dhcF82NCh2YWwpCisjZWxzZSAvKiBIQVZFX0JZVEVTV0FQX0ggKi8KKworI2RlZmluZSBEQlVTX1VJTlQ2NF9TV0FQX0xFX0JFX0NPTlNUQU5UKHZhbCkJKChkYnVzX3VpbnQ2NF90KSAoICAgICAgICAgICAgICBcCisgICAgICAoKChkYnVzX3VpbnQ2NF90KSAodmFsKSAmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoZGJ1c191aW50NjRfdCkgREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MDAwMDAwMDAwMDAwMDBmZikpIDw8IDU2KSB8ICAgIFwKKyAgICAgICgoKGRidXNfdWludDY0X3QpICh2YWwpICYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShkYnVzX3VpbnQ2NF90KSBEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHgwMDAwMDAwMDAwMDBmZjAwKSkgPDwgNDApIHwgICAgXAorICAgICAgKCgoZGJ1c191aW50NjRfdCkgKHZhbCkgJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKGRidXNfdWludDY0X3QpIERCVVNfVUlOVDY0X0NPTlNUQU5UICgweDAwMDAwMDAwMDBmZjAwMDApKSA8PCAyNCkgfCAgICBcCisgICAgICAoKChkYnVzX3VpbnQ2NF90KSAodmFsKSAmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoZGJ1c191aW50NjRfdCkgREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MDAwMDAwMDBmZjAwMDAwMCkpIDw8ICA4KSB8ICAgIFwKKyAgICAgICgoKGRidXNfdWludDY0X3QpICh2YWwpICYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShkYnVzX3VpbnQ2NF90KSBEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHgwMDAwMDBmZjAwMDAwMDAwKSkgPj4gIDgpIHwgICAgXAorICAgICAgKCgoZGJ1c191aW50NjRfdCkgKHZhbCkgJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKGRidXNfdWludDY0X3QpIERCVVNfVUlOVDY0X0NPTlNUQU5UICgweDAwMDBmZjAwMDAwMDAwMDApKSA+PiAyNCkgfCAgICBcCisgICAgICAoKChkYnVzX3VpbnQ2NF90KSAodmFsKSAmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoZGJ1c191aW50NjRfdCkgREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MDBmZjAwMDAwMDAwMDAwMCkpID4+IDQwKSB8ICAgIFwKKyAgICAgICgoKGRidXNfdWludDY0X3QpICh2YWwpICYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShkYnVzX3VpbnQ2NF90KSBEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHhmZjAwMDAwMDAwMDAwMDAwKSkgPj4gNTYpKSkKKyNlbmRpZiAvKiBEQlVTX0hBVkVfSU5UNjQgKi8KKworI2VuZGlmIC8qIEhBVkVfQllURVNXQVBfSCAqLworCisjZGVmaW5lIERCVVNfVUlOVDE2X1NXQVBfTEVfQkUodmFsKSAoREJVU19VSU5UMTZfU1dBUF9MRV9CRV9DT05TVEFOVCAodmFsKSkKKyNkZWZpbmUgREJVU19JTlQxNl9TV0FQX0xFX0JFKHZhbCkgICgoZGJ1c19pbnQxNl90KURCVVNfVUlOVDE2X1NXQVBfTEVfQkVfQ09OU1RBTlQgKHZhbCkpCisKKyNkZWZpbmUgREJVU19VSU5UMzJfU1dBUF9MRV9CRSh2YWwpIChEQlVTX1VJTlQzMl9TV0FQX0xFX0JFX0NPTlNUQU5UICh2YWwpKQorI2RlZmluZSBEQlVTX0lOVDMyX1NXQVBfTEVfQkUodmFsKSAgKChkYnVzX2ludDMyX3QpREJVU19VSU5UMzJfU1dBUF9MRV9CRV9DT05TVEFOVCAodmFsKSkKKworI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorIyAgZGVmaW5lIERCVVNfVUlOVDY0X1NXQVBfTEVfQkUodmFsKSAoREJVU19VSU5UNjRfU1dBUF9MRV9CRV9DT05TVEFOVCAodmFsKSkKKyMgIGRlZmluZSBEQlVTX0lOVDY0X1NXQVBfTEVfQkUodmFsKSAgKChkYnVzX2ludDY0X3QpREJVU19VSU5UNjRfU1dBUF9MRV9CRV9DT05TVEFOVCAodmFsKSkKKyNlbmRpZiAvKiBEQlVTX0hBVkVfSU5UNjQgKi8KKworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorCisjICBkZWZpbmUgREJVU19JTlQxNl9UT19CRSh2YWwpCSgoZGJ1c19pbnQxNl90KSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX1VJTlQxNl9UT19CRSh2YWwpCSgoZGJ1c191aW50MTZfdCkgKHZhbCkpCisjICBkZWZpbmUgREJVU19JTlQxNl9UT19MRSh2YWwpCShEQlVTX0lOVDE2X1NXQVBfTEVfQkUgKHZhbCkpCisjICBkZWZpbmUgREJVU19VSU5UMTZfVE9fTEUodmFsKQkoREJVU19VSU5UMTZfU1dBUF9MRV9CRSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX0lOVDMyX1RPX0JFKHZhbCkJKChkYnVzX2ludDMyX3QpICh2YWwpKQorIyAgZGVmaW5lIERCVVNfVUlOVDMyX1RPX0JFKHZhbCkJKChkYnVzX3VpbnQzMl90KSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX0lOVDMyX1RPX0xFKHZhbCkJKERCVVNfSU5UMzJfU1dBUF9MRV9CRSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX1VJTlQzMl9UT19MRSh2YWwpCShEQlVTX1VJTlQzMl9TV0FQX0xFX0JFICh2YWwpKQorIyAgaWZkZWYgREJVU19IQVZFX0lOVDY0CisjICAgIGRlZmluZSBEQlVTX0lOVDY0X1RPX0JFKHZhbCkJKChkYnVzX2ludDY0X3QpICh2YWwpKQorIyAgICBkZWZpbmUgREJVU19VSU5UNjRfVE9fQkUodmFsKQkoKGRidXNfdWludDY0X3QpICh2YWwpKQorIyAgICBkZWZpbmUgREJVU19JTlQ2NF9UT19MRSh2YWwpCShEQlVTX0lOVDY0X1NXQVBfTEVfQkUgKHZhbCkpCisjICAgIGRlZmluZSBEQlVTX1VJTlQ2NF9UT19MRSh2YWwpCShEQlVTX1VJTlQ2NF9TV0FQX0xFX0JFICh2YWwpKQorIyAgZW5kaWYgLyogREJVU19IQVZFX0lOVDY0ICovCisKKyNlbHNlIC8qIFdPUkRTX0JJR0VORElBTiAqLworCisjICBkZWZpbmUgREJVU19JTlQxNl9UT19MRSh2YWwpCSgoZGJ1c19pbnQxNl90KSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX1VJTlQxNl9UT19MRSh2YWwpCSgoZGJ1c191aW50MTZfdCkgKHZhbCkpCisjICBkZWZpbmUgREJVU19JTlQxNl9UT19CRSh2YWwpCSgoZGJ1c19pbnQxNl90KSBEQlVTX1VJTlQxNl9TV0FQX0xFX0JFICh2YWwpKQorIyAgZGVmaW5lIERCVVNfVUlOVDE2X1RPX0JFKHZhbCkJKERCVVNfVUlOVDE2X1NXQVBfTEVfQkUgKHZhbCkpCisjICBkZWZpbmUgREJVU19JTlQzMl9UT19MRSh2YWwpCSgoZGJ1c19pbnQzMl90KSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX1VJTlQzMl9UT19MRSh2YWwpCSgoZGJ1c191aW50MzJfdCkgKHZhbCkpCisjICBkZWZpbmUgREJVU19JTlQzMl9UT19CRSh2YWwpCSgoZGJ1c19pbnQzMl90KSBEQlVTX1VJTlQzMl9TV0FQX0xFX0JFICh2YWwpKQorIyAgZGVmaW5lIERCVVNfVUlOVDMyX1RPX0JFKHZhbCkJKERCVVNfVUlOVDMyX1NXQVBfTEVfQkUgKHZhbCkpCisjICBpZmRlZiBEQlVTX0hBVkVfSU5UNjQKKyMgICAgZGVmaW5lIERCVVNfSU5UNjRfVE9fTEUodmFsKQkoKGRidXNfaW50NjRfdCkgKHZhbCkpCisjICAgIGRlZmluZSBEQlVTX1VJTlQ2NF9UT19MRSh2YWwpCSgoZGJ1c191aW50NjRfdCkgKHZhbCkpCisjICAgIGRlZmluZSBEQlVTX0lOVDY0X1RPX0JFKHZhbCkJKChkYnVzX2ludDY0X3QpIERCVVNfVUlOVDY0X1NXQVBfTEVfQkUgKHZhbCkpCisjICAgIGRlZmluZSBEQlVTX1VJTlQ2NF9UT19CRSh2YWwpCShEQlVTX1VJTlQ2NF9TV0FQX0xFX0JFICh2YWwpKQorIyAgZW5kaWYgLyogREJVU19IQVZFX0lOVDY0ICovCisjZW5kaWYKKworLyogVGhlIHRyYW5zZm9ybWF0aW9uIGlzIHN5bW1ldHJpYywgc28gdGhlIEZST00ganVzdCBtYXBzIHRvIHRoZSBUTy4gKi8KKyNkZWZpbmUgREJVU19JTlQxNl9GUk9NX0xFKHZhbCkJIChEQlVTX0lOVDE2X1RPX0xFICh2YWwpKQorI2RlZmluZSBEQlVTX1VJTlQxNl9GUk9NX0xFKHZhbCkgKERCVVNfVUlOVDE2X1RPX0xFICh2YWwpKQorI2RlZmluZSBEQlVTX0lOVDE2X0ZST01fQkUodmFsKQkgKERCVVNfSU5UMTZfVE9fQkUgKHZhbCkpCisjZGVmaW5lIERCVVNfVUlOVDE2X0ZST01fQkUodmFsKSAoREJVU19VSU5UMTZfVE9fQkUgKHZhbCkpCisjZGVmaW5lIERCVVNfSU5UMzJfRlJPTV9MRSh2YWwpCSAoREJVU19JTlQzMl9UT19MRSAodmFsKSkKKyNkZWZpbmUgREJVU19VSU5UMzJfRlJPTV9MRSh2YWwpIChEQlVTX1VJTlQzMl9UT19MRSAodmFsKSkKKyNkZWZpbmUgREJVU19JTlQzMl9GUk9NX0JFKHZhbCkJIChEQlVTX0lOVDMyX1RPX0JFICh2YWwpKQorI2RlZmluZSBEQlVTX1VJTlQzMl9GUk9NX0JFKHZhbCkgKERCVVNfVUlOVDMyX1RPX0JFICh2YWwpKQorI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorIyAgZGVmaW5lIERCVVNfSU5UNjRfRlJPTV9MRSh2YWwpCSAoREJVU19JTlQ2NF9UT19MRSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX1VJTlQ2NF9GUk9NX0xFKHZhbCkgKERCVVNfVUlOVDY0X1RPX0xFICh2YWwpKQorIyAgZGVmaW5lIERCVVNfSU5UNjRfRlJPTV9CRSh2YWwpCSAoREJVU19JTlQ2NF9UT19CRSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX1VJTlQ2NF9GUk9NX0JFKHZhbCkgKERCVVNfVUlOVDY0X1RPX0JFICh2YWwpKQorI2VuZGlmIC8qIERCVVNfSEFWRV9JTlQ2NCAqLworCisjaWZkZWYgREJVU19ESVNBQkxFX0FTU0VSVAorI2RlZmluZSBfZGJ1c191bnBhY2tfdWludDE2KGJ5dGVfb3JkZXIsIGRhdGEpICAgICAgICAgICBcCisgICAoKChieXRlX29yZGVyKSA9PSBEQlVTX0xJVFRMRV9FTkRJQU4pID8gICAgICAgICAgICAgIFwKKyAgICAgREJVU19VSU5UMTZfRlJPTV9MRSAoKihkYnVzX3VpbnQxNl90KikoZGF0YSkpIDogICAgXAorICAgICBEQlVTX1VJTlQxNl9GUk9NX0JFICgqKGRidXNfdWludDE2X3QqKShkYXRhKSkpCisKKyNkZWZpbmUgX2RidXNfdW5wYWNrX3VpbnQzMihieXRlX29yZGVyLCBkYXRhKSAgICAgICAgICAgXAorICAgKCgoYnl0ZV9vcmRlcikgPT0gREJVU19MSVRUTEVfRU5ESUFOKSA/ICAgICAgICAgICAgICBcCisgICAgIERCVVNfVUlOVDMyX0ZST01fTEUgKCooZGJ1c191aW50MzJfdCopKGRhdGEpKSA6ICAgIFwKKyAgICAgREJVU19VSU5UMzJfRlJPTV9CRSAoKihkYnVzX3VpbnQzMl90KikoZGF0YSkpKQorI2VuZGlmCisKKyNpZm5kZWYgX2RidXNfdW5wYWNrX3VpbnQxNgorZGJ1c191aW50MTZfdCBfZGJ1c191bnBhY2tfdWludDE2IChpbnQgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhKTsKKyNlbmRpZgorCit2b2lkICAgICAgICAgIF9kYnVzX3BhY2tfdWludDMyICAgKGRidXNfdWludDMyX3QgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgICpkYXRhKTsKKyNpZm5kZWYgX2RidXNfdW5wYWNrX3VpbnQzMgorZGJ1c191aW50MzJfdCBfZGJ1c191bnBhY2tfdWludDMyIChpbnQgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhKTsKKyNlbmRpZgorCitkYnVzX2Jvb2xfdCAgIF9kYnVzX21hcnNoYWxfc2V0X2Jhc2ljICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqb2xkX2VuZF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKm5ld19lbmRfcG9zKTsKK2RidXNfYm9vbF90ICAgX2RidXNfbWFyc2hhbF93cml0ZV9iYXNpYyAgICAgICAoREJ1c1N0cmluZyAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpwb3NfYWZ0ZXIpOworZGJ1c19ib29sX3QgICBfZGJ1c19tYXJzaGFsX3dyaXRlX2ZpeGVkX211bHRpIChEQnVzU3RyaW5nICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGluc2VydF9hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbl9lbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqcG9zX2FmdGVyKTsKK3ZvaWQgICAgICAgICAgX2RidXNfbWFyc2hhbF9yZWFkX2Jhc2ljICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpuZXdfcG9zKTsKK3ZvaWQgICAgICAgICAgX2RidXNfbWFyc2hhbF9yZWFkX2ZpeGVkX211bHRpICAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIG5fZWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKm5ld19wb3MpOwordm9pZCAgICAgICAgICBfZGJ1c19tYXJzaGFsX3NraXBfYmFzaWMgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKnBvcyk7Cit2b2lkICAgICAgICAgIF9kYnVzX21hcnNoYWxfc2tpcF9hcnJheSAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpwb3MpOwordm9pZCAgICAgICAgICBfZGJ1c19tYXJzaGFsX3NldF91aW50MzIgICAgICAgIChEQnVzU3RyaW5nICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIpOworZGJ1c191aW50MzJfdCBfZGJ1c19tYXJzaGFsX3JlYWRfdWludDMyICAgICAgIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqbmV3X3Bvcyk7CitpbnQgICAgICAgICAgIF9kYnVzX3R5cGVfZ2V0X2FsaWdubWVudCAgICAgICAgKGludCAgICAgICAgICAgICAgIHR5cGVjb2RlKTsKK2ludCAgICAgICAgICAgX2RidXNfdHlwZV9nZXRfYWxpZ25tZW50ICAgICAgICAoaW50ICAgICAgICAgICAgICAgdHlwZWNvZGUpOworY29uc3QgY2hhciogICBfZGJ1c190eXBlX3RvX3N0cmluZyAgICAgICAgICAgIChpbnQgICAgICAgICAgICAgICB0eXBlY29kZSk7CisKK2ludCAgICAgICAgICAgX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmUgICAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBwb3MpOworCitpbnQgICAgICAgICAgIF9kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlX2Nfc3RyICAgKGNvbnN0IGNoYXIgICAgICAgKnN0ciwKKwkJCQkJCSAgICAgaW50ICAgICAgICAgICAgICAgcG9zKTsKKwordm9pZCBfZGJ1c19zd2FwX2FycmF5ICh1bnNpZ25lZCBjaGFyICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBuX2VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBhbGlnbm1lbnQpOworCisjZW5kaWYgLyogREJVU19NQVJTSEFMX0JBU0lDX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLW1hcnNoYWwtYnl0ZXN3YXAtdXRpbC5jIGIvZGJ1cy9kYnVzL2RidXMtbWFyc2hhbC1ieXRlc3dhcC11dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRiNzRjYQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLW1hcnNoYWwtYnl0ZXN3YXAtdXRpbC5jCkBAIC0wLDAgKzEsMTA1IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWFyc2hhbC1ieXRlc3dhcC11dGlsLmMgIFdvdWxkIGJlIGluIGRidXMtbWFyc2hhbC1ieXRlc3dhcC5jIGJ1dCB0ZXN0cy9idXMgb25seQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTIAorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1ieXRlc3dhcC5oIgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3N0YXRpYyB2b2lkCitkb19ieXRlc3dhcF90ZXN0IChpbnQgYnl0ZV9vcmRlcikKK3sKKyAgaW50IHNlcXVlbmNlOworICBEQnVzU3RyaW5nIHNpZ25hdHVyZTsKKyAgREJ1c1N0cmluZyBib2R5OworICBpbnQgb3Bwb3NpdGVfb3JkZXI7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnNpZ25hdHVyZSkgfHwgIV9kYnVzX3N0cmluZ19pbml0ICgmYm9keSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgb3Bwb3NpdGVfb3JkZXIgPSBieXRlX29yZGVyID09IERCVVNfTElUVExFX0VORElBTiA/IERCVVNfQklHX0VORElBTiA6IERCVVNfTElUVExFX0VORElBTjsKKyAgCisgIHNlcXVlbmNlID0gMDsKKyAgd2hpbGUgKGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9nZW5lcmF0ZV9ib2RpZXMgKHNlcXVlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWduYXR1cmUsICZib2R5KSkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIGNvcHk7CisgICAgICBEQnVzVHlwZVJlYWRlciBib2R5X3JlYWRlcjsKKyAgICAgIERCdXNUeXBlUmVhZGVyIGNvcHlfcmVhZGVyOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmY29weSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmYm9keSwgMCwgJmNvcHksIDApKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICAgICAgX2RidXNfbWFyc2hhbF9ieXRlc3dhcCAoJnNpZ25hdHVyZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHBvc2l0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3B5LCAwKTsKKworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfaW5pdCAoJmJvZHlfcmVhZGVyLCBieXRlX29yZGVyLCAmc2lnbmF0dXJlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvZHksIDApOworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfaW5pdCAoJmNvcHlfcmVhZGVyLCBvcHBvc2l0ZV9vcmRlciwgJnNpZ25hdHVyZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3B5LCAwKTsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c190eXBlX3JlYWRlcl9lcXVhbF92YWx1ZXMgKCZib2R5X3JlYWRlciwgJmNvcHlfcmVhZGVyKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmc2lnbmF0dXJlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnNpZ25hdHVyZSkpOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmYm9keSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZib2R5KSk7CisgICAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZjb3B5LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmNvcHkpKTsKKworICAgICAgICAgIF9kYnVzX3dhcm4gKCJCeXRlLXN3YXBwZWQgZGF0YSBkaWQgbm90IGhhdmUgc2FtZSB2YWx1ZXMgYXMgb3JpZ2luYWwgZGF0YVxuIik7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidGVzdCBmYWlsZWQiKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvcHkpOworICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJnNpZ25hdHVyZSwgMCk7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmJvZHksIDApOworICAgICAgKytzZXF1ZW5jZTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzaWduYXR1cmUpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmJvZHkpOworCisgIHByaW50ZiAoIiAgJWQgYmxvY2tzIHN3YXBwZWQgZnJvbSBvcmRlciAnJWMnIHRvICclYydcbiIsCisgICAgICAgICAgc2VxdWVuY2UsIGJ5dGVfb3JkZXIsIG9wcG9zaXRlX29yZGVyKTsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX21hcnNoYWxfYnl0ZXN3YXBfdGVzdCAodm9pZCkKK3sKKyAgZG9fYnl0ZXN3YXBfdGVzdCAoREJVU19MSVRUTEVfRU5ESUFOKTsKKyAgZG9fYnl0ZXN3YXBfdGVzdCAoREJVU19CSUdfRU5ESUFOKTsKKworICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLW1hcnNoYWwtYnl0ZXN3YXAuYyBiL2RidXMvZGJ1cy9kYnVzLW1hcnNoYWwtYnl0ZXN3YXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmQ3ZTIyCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtbWFyc2hhbC1ieXRlc3dhcC5jCkBAIC0wLDAgKzEsMjUyIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWFyc2hhbC1ieXRlc3dhcC5jICBTd2FwIGEgYmxvY2sgb2YgbWFyc2hhbGVkIGRhdGEKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1ieXRlc3dhcC5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1iYXNpYy5oIgorI2luY2x1ZGUgImRidXMtc2lnbmF0dXJlLmgiCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c01hcnNoYWwKKyAqIEB7CisgKi8KKworc3RhdGljIHZvaWQKK2J5dGVzd2FwX2JvZHlfaGVscGVyIChEQnVzVHlwZVJlYWRlciAgICAgICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICB3YWxrX3JlYWRlcl90b19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIG9sZF9ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBuZXdfYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgICAqcCwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgICoqbmV3X3ApCit7CisgIGludCBjdXJyZW50X3R5cGU7CisKKyAgd2hpbGUgKChjdXJyZW50X3R5cGUgPSBfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlIChyZWFkZXIpKSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICB7CisgICAgICBzd2l0Y2ggKGN1cnJlbnRfdHlwZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIERCVVNfVFlQRV9CWVRFOgorICAgICAgICAgICsrcDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERCVVNfVFlQRV9JTlQxNjoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHAgPSBfREJVU19BTElHTl9BRERSRVNTIChwLCAyKTsKKyAgICAgICAgICAgICooKGRidXNfdWludDE2X3QqKXApID0gREJVU19VSU5UMTZfU1dBUF9MRV9CRSAoKigoZGJ1c191aW50MTZfdCopcCkpOworICAgICAgICAgICAgcCArPSAyOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICAKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfQk9PTEVBTjoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfSU5UMzI6CisgICAgICAgIGNhc2UgREJVU19UWVBFX1VJTlQzMjoKKyAgICAgICAgICB7CisgICAgICAgICAgICBwID0gX0RCVVNfQUxJR05fQUREUkVTUyAocCwgNCk7CisgICAgICAgICAgICAqKChkYnVzX3VpbnQzMl90KilwKSA9IERCVVNfVUlOVDMyX1NXQVBfTEVfQkUgKCooKGRidXNfdWludDMyX3QqKXApKTsKKyAgICAgICAgICAgIHAgKz0gNDsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgCisgICAgICAgIGNhc2UgREJVU19UWVBFX0lOVDY0OgorICAgICAgICBjYXNlIERCVVNfVFlQRV9VSU5UNjQ6CisgICAgICAgIGNhc2UgREJVU19UWVBFX0RPVUJMRToKKyAgICAgICAgICB7CisgICAgICAgICAgICBwID0gX0RCVVNfQUxJR05fQUREUkVTUyAocCwgOCk7CisjaWZkZWYgREJVU19IQVZFX0lOVDY0CisgICAgICAgICAgICAqKChkYnVzX3VpbnQ2NF90KilwKSA9IERCVVNfVUlOVDY0X1NXQVBfTEVfQkUgKCooKGRidXNfdWludDY0X3QqKXApKTsKKyNlbHNlCisgICAgICAgICAgICBfZGJ1c19zd2FwX2FycmF5IChwLCAxLCA4KTsKKyNlbmRpZgorICAgICAgICAgICAgcCArPSA4OworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERCVVNfVFlQRV9BUlJBWToKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfU1RSSU5HOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9PQkpFQ1RfUEFUSDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX3VpbnQzMl90IGFycmF5X2xlbjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcCA9IF9EQlVTX0FMSUdOX0FERFJFU1MgKHAsIDQpOworCisgICAgICAgICAgICBhcnJheV9sZW4gPSBfZGJ1c191bnBhY2tfdWludDMyIChvbGRfYnl0ZV9vcmRlciwgcCk7CisKKyAgICAgICAgICAgICooKGRidXNfdWludDMyX3QqKXApID0gREJVU19VSU5UMzJfU1dBUF9MRV9CRSAoKigoZGJ1c191aW50MzJfdCopcCkpOworICAgICAgICAgICAgcCArPSA0OworCisgICAgICAgICAgICBpZiAoY3VycmVudF90eXBlID09IERCVVNfVFlQRV9BUlJBWSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBlbGVtX3R5cGU7CisgICAgICAgICAgICAgICAgaW50IGFsaWdubWVudDsKKworICAgICAgICAgICAgICAgIGVsZW1fdHlwZSA9IF9kYnVzX3R5cGVfcmVhZGVyX2dldF9lbGVtZW50X3R5cGUgKHJlYWRlcik7CisgICAgICAgICAgICAgICAgYWxpZ25tZW50ID0gX2RidXNfdHlwZV9nZXRfYWxpZ25tZW50IChlbGVtX3R5cGUpOworCisJCV9kYnVzX2Fzc2VydCAoKGFycmF5X2xlbiAvIGFsaWdubWVudCkgPCBEQlVTX01BWElNVU1fQVJSQVlfTEVOR1RIKTsKKworICAgICAgICAgICAgICAgIHAgPSBfREJVU19BTElHTl9BRERSRVNTIChwLCBhbGlnbm1lbnQpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChkYnVzX3R5cGVfaXNfZml4ZWQgKGVsZW1fdHlwZSkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbGlnbm1lbnQgPiAxKQorCQkgICAgICBfZGJ1c19zd2FwX2FycmF5IChwLCBhcnJheV9sZW4gLyBhbGlnbm1lbnQsIGFsaWdubWVudCk7CisJCSAgICBwICs9IGFycmF5X2xlbjsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyIHN1YjsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYXJyYXlfZW5kOworCisgICAgICAgICAgICAgICAgICAgIGFycmF5X2VuZCA9IHAgKyBhcnJheV9sZW47CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlIChyZWFkZXIsICZzdWIpOworCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwIDwgYXJyYXlfZW5kKQorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzd2FwX2JvZHlfaGVscGVyICgmc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAsICZwKTsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoY3VycmVudF90eXBlID09IERCVVNfVFlQRV9TVFJJTkcgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdHlwZSA9PSBEQlVTX1RZUEVfT0JKRUNUX1BBVEgpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHAgKz0gKGFycmF5X2xlbiArIDEpOyAvKiArIDEgZm9yIG51bCAqLworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgREJVU19UWVBFX1NJR05BVFVSRToKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX3VpbnQzMl90IHNpZ19sZW47CisKKyAgICAgICAgICAgIHNpZ19sZW4gPSAqcDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcCArPSAoc2lnX2xlbiArIDIpOyAvKiArMiBmb3IgbGVuIGFuZCBudWwgKi8KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfVkFSSUFOVDoKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiAxIGJ5dGUgc2lnIGxlbiwgc2lnIHR5cGVjb2RlcywgYWxpZ24gdG8KKyAgICAgICAgICAgICAqIGNvbnRhaW5lZC10eXBlLWJvdW5kYXJ5LCB2YWx1ZXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGRidXNfdWludDMyX3Qgc2lnX2xlbjsKKyAgICAgICAgICAgIERCdXNTdHJpbmcgc2lnOworICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgc3ViOworICAgICAgICAgICAgaW50IGNvbnRhaW5lZF9hbGlnbm1lbnQ7CisKKyAgICAgICAgICAgIHNpZ19sZW4gPSAqcDsKKyAgICAgICAgICAgICsrcDsKKworICAgICAgICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3RfbGVuICgmc2lnLCBwLCBzaWdfbGVuKTsKKworICAgICAgICAgICAgcCArPSAoc2lnX2xlbiArIDEpOyAvKiAxIGZvciBudWwgKi8KKworICAgICAgICAgICAgY29udGFpbmVkX2FsaWdubWVudCA9IF9kYnVzX3R5cGVfZ2V0X2FsaWdubWVudCAoX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmUgKCZzaWcsIDApKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcCA9IF9EQlVTX0FMSUdOX0FERFJFU1MgKHAsIGNvbnRhaW5lZF9hbGlnbm1lbnQpOworCisgICAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9pbml0X3R5cGVzX29ubHkgKCZzdWIsICZzaWcsIDApOworCisgICAgICAgICAgICBieXRlc3dhcF9ib2R5X2hlbHBlciAoJnN1YiwgRkFMU0UsIG9sZF9ieXRlX29yZGVyLCBuZXdfYnl0ZV9vcmRlciwgcCwgJnApOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERCVVNfVFlQRV9TVFJVQ1Q6CisgICAgICAgIGNhc2UgREJVU19UWVBFX0RJQ1RfRU5UUlk6CisgICAgICAgICAgeworICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgc3ViOworCisgICAgICAgICAgICBwID0gX0RCVVNfQUxJR05fQUREUkVTUyAocCwgOCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKHJlYWRlciwgJnN1Yik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGJ5dGVzd2FwX2JvZHlfaGVscGVyICgmc3ViLCBUUlVFLCBvbGRfYnl0ZV9vcmRlciwgbmV3X2J5dGVfb3JkZXIsIHAsICZwKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfVU5JWF9GRDoKKyAgICAgICAgICAvKiBmZHMgY2FuIG9ubHkgYmUgcGFzc2VkIG9uIGEgbG9jYWwgbWFjaGluZSwgc28gYnl0ZSBvcmRlciBtdXN0IGFsd2F5cyBtYXRjaCAqLworICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiYXR0ZW1wdGVkIHRvIGJ5dGVzd2FwIHVuaXggZmRzIHdoaWNoIG1ha2VzIG5vIHNlbnNlIik7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnZhbGlkIHR5cGVjb2RlIGluIHN1cHBvc2VkbHktdmFsaWRhdGVkIHNpZ25hdHVyZSIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgIGlmICh3YWxrX3JlYWRlcl90b19lbmQpCisgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKHJlYWRlcik7CisgICAgICBlbHNlCisgICAgICAgIGJyZWFrOworICAgIH0KKworICBpZiAobmV3X3ApCisgICAgKm5ld19wID0gcDsKK30KKworLyoqCisgKiBCeXRlc3dhcHMgdGhlIG1hcnNoYWxlZCBkYXRhIGluIHRoZSBnaXZlbiB2YWx1ZV9zdHIuCisgKgorICogQHBhcmFtIHNpZ25hdHVyZSB0aGUgdHlwZXMgaW4gdGhlIHZhbHVlX3N0cgorICogQHBhcmFtIHNpZ25hdHVyZV9zdGFydCB3aGVyZSBpbiBzaWduYXR1cmUgaXMgdGhlIHNpZ25hdHVyZQorICogQHBhcmFtIG9sZF9ieXRlX29yZGVyIHRoZSBvbGQgYnl0ZSBvcmRlcgorICogQHBhcmFtIG5ld19ieXRlX29yZGVyIHRoZSBuZXcgYnl0ZSBvcmRlcgorICogQHBhcmFtIHZhbHVlX3N0ciB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGJvZHkKKyAqIEBwYXJhbSB2YWx1ZV9wb3Mgd2hlcmUgdGhlIHZhbHVlcyBzdGFydAorICovCit2b2lkCitfZGJ1c19tYXJzaGFsX2J5dGVzd2FwIChjb25zdCBEQnVzU3RyaW5nICpzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzaWduYXR1cmVfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBvbGRfYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIG5ld19ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqdmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgdmFsdWVfcG9zKQoreworICBEQnVzVHlwZVJlYWRlciByZWFkZXI7CisKKyAgX2RidXNfYXNzZXJ0ICh2YWx1ZV9wb3MgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAodmFsdWVfcG9zIDw9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh2YWx1ZV9zdHIpKTsKKworICBpZiAob2xkX2J5dGVfb3JkZXIgPT0gbmV3X2J5dGVfb3JkZXIpCisgICAgcmV0dXJuOworICAKKyAgX2RidXNfdHlwZV9yZWFkZXJfaW5pdF90eXBlc19vbmx5ICgmcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSwgc2lnbmF0dXJlX3N0YXJ0KTsKKworICBieXRlc3dhcF9ib2R5X2hlbHBlciAoJnJlYWRlciwgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9ieXRlX29yZGVyLCBuZXdfYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfZGF0YV9sZW4gKHZhbHVlX3N0ciwgdmFsdWVfcG9zLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworfQorCisvKiogQH0gKi8KKworLyogVGVzdHMgaW4gZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLXV0aWwuYyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtbWFyc2hhbC1ieXRlc3dhcC5oIGIvZGJ1cy9kYnVzL2RidXMtbWFyc2hhbC1ieXRlc3dhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMmRkNzUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmgKQEAgLTAsMCArMSwzNyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1hcnNoYWwtYnl0ZXN3YXAuaCAgU3dhcCBhIGJsb2NrIG9mIG1hcnNoYWxlZCBkYXRhCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19NQVJTSEFMX0JZVEVTV0FQX0gKKyNkZWZpbmUgREJVU19NQVJTSEFMX0JZVEVTV0FQX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1wcm90b2NvbC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oPgorCit2b2lkIF9kYnVzX21hcnNoYWxfYnl0ZXN3YXAgKGNvbnN0IERCdXNTdHJpbmcgKnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc2lnbmF0dXJlX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBvbGRfYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbmV3X2J5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgdmFsdWVfcG9zKTsKKworI2VuZGlmIC8qIERCVVNfTUFSU0hBTF9CWVRFU1dBUF9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1tYXJzaGFsLWhlYWRlci5jIGIvZGJ1cy9kYnVzL2RidXMtbWFyc2hhbC1oZWFkZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODg4N2E4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtbWFyc2hhbC1oZWFkZXIuYwpAQCAtMCwwICsxLDE1MTIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tYXJzaGFsLWhlYWRlci5jICBNYW5hZ2luZyBtYXJzaGFsaW5nL2RlbWFyc2hhbGluZyBvZiBtZXNzYWdlIGhlYWRlcnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzL2RidXMtc2hhcmVkLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLWhlYWRlci5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1yZWN1cnNpdmUuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtYnl0ZXN3YXAuaCIKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzTWFyc2hhbAorICoKKyAqIEB7CisgKi8KKworCisvKiBOb3QgdGhyZWFkIGxvY2tlZCwgYnV0IHN0cmljdGx5IGNvbnN0L3JlYWQtb25seSBzbyBzaG91bGQgYmUgT0sKKyAqLworLyoqIFN0YXRpYyAjREJ1c1N0cmluZyBjb250YWluaW5nIHRoZSBzaWduYXR1cmUgb2YgYSBtZXNzYWdlIGhlYWRlciAqLworX0RCVVNfU1RSSU5HX0RFRklORV9TVEFUSUMoX2RidXNfaGVhZGVyX3NpZ25hdHVyZV9zdHIsIERCVVNfSEVBREVSX1NJR05BVFVSRSk7CisvKiogU3RhdGljICNEQnVzU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGxvY2FsIGludGVyZmFjZSAqLworX0RCVVNfU1RSSU5HX0RFRklORV9TVEFUSUMoX2RidXNfbG9jYWxfaW50ZXJmYWNlX3N0ciwgIERCVVNfSU5URVJGQUNFX0xPQ0FMKTsKKy8qKiBTdGF0aWMgI0RCdXNTdHJpbmcgY29udGFpbmluZyB0aGUgbG9jYWwgcGF0aCAqLworX0RCVVNfU1RSSU5HX0RFRklORV9TVEFUSUMoX2RidXNfbG9jYWxfcGF0aF9zdHIsICAgICAgIERCVVNfUEFUSF9MT0NBTCk7CisKKy8qKiBPZmZzZXQgZnJvbSBzdGFydCBvZiBfZGJ1c19oZWFkZXJfc2lnbmF0dXJlX3N0ciB0byB0aGUgc2lnbmF0dXJlIG9mIHRoZSBmaWVsZHMgYXJyYXkgKi8KKyNkZWZpbmUgRklFTERTX0FSUkFZX1NJR05BVFVSRV9PRkZTRVQgNgorLyoqIE9mZnNldCBmcm9tIHN0YXJ0IG9mIF9kYnVzX2hlYWRlcl9zaWduYXR1cmVfc3RyIHRvIHRoZSBzaWduYXR1cmUgb2YgYW4gZWxlbWVudCBvZiB0aGUgZmllbGRzIGFycmF5ICovCisjZGVmaW5lIEZJRUxEU19BUlJBWV9FTEVNRU5UX1NJR05BVFVSRV9PRkZTRVQgNworCisKKy8qKiBPZmZzZXQgdG8gYnl0ZSBvcmRlciBmcm9tIHN0YXJ0IG9mIGhlYWRlciAqLworI2RlZmluZSBCWVRFX09SREVSX09GRlNFVCAgICAwCisvKiogT2Zmc2V0IHRvIHR5cGUgZnJvbSBzdGFydCBvZiBoZWFkZXIgKi8KKyNkZWZpbmUgVFlQRV9PRkZTRVQgICAgICAgICAgMQorLyoqIE9mZnNldCB0byBmbGFncyBmcm9tIHN0YXJ0IG9mIGhlYWRlciAqLworI2RlZmluZSBGTEFHU19PRkZTRVQgICAgICAgICAyCisvKiogT2Zmc2V0IHRvIHZlcnNpb24gZnJvbSBzdGFydCBvZiBoZWFkZXIgKi8KKyNkZWZpbmUgVkVSU0lPTl9PRkZTRVQgICAgICAgMworLyoqIE9mZnNldCB0byBib2R5IGxlbmd0aCBmcm9tIHN0YXJ0IG9mIGhlYWRlciAqLworI2RlZmluZSBCT0RZX0xFTkdUSF9PRkZTRVQgNAorLyoqIE9mZnNldCB0byBjbGllbnQgc2VyaWFsIGZyb20gc3RhcnQgb2YgaGVhZGVyICovCisjZGVmaW5lIFNFUklBTF9PRkZTRVQgOAorLyoqIE9mZnNldCB0byBmaWVsZHMgYXJyYXkgbGVuZ3RoIGZyb20gc3RhcnQgb2YgaGVhZGVyICovCisjZGVmaW5lIEZJRUxEU19BUlJBWV9MRU5HVEhfT0ZGU0VUIDEyCisvKiogT2Zmc2V0IHRvIGZpcnN0IGZpZWxkIGluIGhlYWRlciAqLworI2RlZmluZSBGSVJTVF9GSUVMRF9PRkZTRVQgMTYKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdW5zaWduZWQgY2hhciBjb2RlOyAvKio8IHRoZSBmaWVsZCBjb2RlICovCisgIHVuc2lnbmVkIGNoYXIgdHlwZTsgLyoqPCB0aGUgdmFsdWUgdHlwZSAqLworfSBIZWFkZXJGaWVsZFR5cGU7CisKK3N0YXRpYyBjb25zdCBIZWFkZXJGaWVsZFR5cGUKK19kYnVzX2hlYWRlcl9maWVsZF90eXBlc1tEQlVTX0hFQURFUl9GSUVMRF9MQVNUKzFdID0geworICB7IERCVVNfSEVBREVSX0ZJRUxEX0lOVkFMSUQsIERCVVNfVFlQRV9JTlZBTElEIH0sCisgIHsgREJVU19IRUFERVJfRklFTERfUEFUSCwgREJVU19UWVBFX09CSkVDVF9QQVRIIH0sCisgIHsgREJVU19IRUFERVJfRklFTERfSU5URVJGQUNFLCBEQlVTX1RZUEVfU1RSSU5HIH0sCisgIHsgREJVU19IRUFERVJfRklFTERfTUVNQkVSLCBEQlVTX1RZUEVfU1RSSU5HIH0sCisgIHsgREJVU19IRUFERVJfRklFTERfRVJST1JfTkFNRSwgREJVU19UWVBFX1NUUklORyB9LAorICB7IERCVVNfSEVBREVSX0ZJRUxEX1JFUExZX1NFUklBTCwgREJVU19UWVBFX1VJTlQzMiB9LAorICB7IERCVVNfSEVBREVSX0ZJRUxEX0RFU1RJTkFUSU9OLCBEQlVTX1RZUEVfU1RSSU5HIH0sCisgIHsgREJVU19IRUFERVJfRklFTERfU0VOREVSLCBEQlVTX1RZUEVfU1RSSU5HIH0sCisgIHsgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLCBEQlVTX1RZUEVfU0lHTkFUVVJFIH0sCisgIHsgREJVU19IRUFERVJfRklFTERfVU5JWF9GRFMsIERCVVNfVFlQRV9VSU5UMzIgfQorfTsKKworLyoqIE1hY3JvIHRvIGxvb2sgdXAgdGhlIGNvcnJlY3QgdHlwZSBmb3IgYSBmaWVsZCAqLworI2RlZmluZSBFWFBFQ1RFRF9UWVBFX09GX0ZJRUxEKGZpZWxkKSAoX2RidXNfaGVhZGVyX2ZpZWxkX3R5cGVzW2ZpZWxkXS50eXBlKQorCisvKiogVGhlIG1vc3QgcGFkZGluZyB3ZSBjb3VsZCBldmVyIG5lZWQgZm9yIGEgaGVhZGVyICovCisjZGVmaW5lIE1BWF9QT1NTSUJMRV9IRUFERVJfUEFERElORyA3CitzdGF0aWMgZGJ1c19ib29sX3QKK3Jlc2VydmVfaGVhZGVyX3BhZGRpbmcgKERCdXNIZWFkZXIgKmhlYWRlcikKK3sKKyAgX2RidXNfYXNzZXJ0IChoZWFkZXItPnBhZGRpbmcgPD0gTUFYX1BPU1NJQkxFX0hFQURFUl9QQURESU5HKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19sZW5ndGhlbiAoJmhlYWRlci0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9QT1NTSUJMRV9IRUFERVJfUEFERElORyAtIGhlYWRlci0+cGFkZGluZykpCisgICAgcmV0dXJuIEZBTFNFOworICBoZWFkZXItPnBhZGRpbmcgPSBNQVhfUE9TU0lCTEVfSEVBREVSX1BBRERJTkc7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorY29ycmVjdF9oZWFkZXJfcGFkZGluZyAoREJ1c0hlYWRlciAqaGVhZGVyKQoreworICBpbnQgdW5wYWRkZWRfbGVuOworCisgIF9kYnVzX2Fzc2VydCAoaGVhZGVyLT5wYWRkaW5nID09IDcpOworCisgIF9kYnVzX3N0cmluZ19zaG9ydGVuICgmaGVhZGVyLT5kYXRhLCBoZWFkZXItPnBhZGRpbmcpOworICB1bnBhZGRlZF9sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmhlYWRlci0+ZGF0YSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYWxpZ25fbGVuZ3RoICgmaGVhZGVyLT5kYXRhLCA4KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBwYWQgaGVhZGVyIHRob3VnaCBlbm91Z2ggcGFkZGluZyB3YXMgcHJlYWxsb2NhdGVkIik7CisKKyAgaGVhZGVyLT5wYWRkaW5nID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZoZWFkZXItPmRhdGEpIC0gdW5wYWRkZWRfbGVuOworfQorCisvKiogQ29tcHV0ZSB0aGUgZW5kIG9mIHRoZSBoZWFkZXIsIGlnbm9yaW5nIHBhZGRpbmcgKi8KKyNkZWZpbmUgSEVBREVSX0VORF9CRUZPUkVfUEFERElORyhoZWFkZXIpIFwKKyAgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmKGhlYWRlciktPmRhdGEpIC0gKGhlYWRlciktPnBhZGRpbmcpCisKKy8qKgorICogSW52YWxpZGF0ZXMgYWxsIGZpZWxkcyBpbiB0aGUgY2FjaGUuIFRoaXMgbWF5IGJlIHVzZWQgd2hlbiB0aGUKKyAqIGNhY2hlIGlzIHRvdGFsbHkgdW5pbml0aWFsaXplZCAoY29udGFpbnMganVuaykgc28gc2hvdWxkIG5vdAorICogbG9vayBhdCB3aGF0J3MgaW4gdGhlcmUgbm93LgorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlcgorICovCitzdGF0aWMgdm9pZAorX2RidXNfaGVhZGVyX2NhY2hlX2ludmFsaWRhdGVfYWxsIChEQnVzSGVhZGVyICpoZWFkZXIpCit7CisgIGludCBpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8PSBEQlVTX0hFQURFUl9GSUVMRF9MQVNUKQorICAgIHsKKyAgICAgIGhlYWRlci0+ZmllbGRzW2ldLnZhbHVlX3BvcyA9IF9EQlVTX0hFQURFUl9GSUVMRF9WQUxVRV9VTktOT1dOOworICAgICAgKytpOworICAgIH0KK30KKworLyoqCisgKiBDYWNoZXMgb25lIGZpZWxkCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyCisgKiBAcGFyYW0gZmllbGRfY29kZSB0aGUgZmllbGQKKyAqIEBwYXJhbSB2YXJpYW50X3JlYWRlciB0aGUgcmVhZGVyIGZvciB0aGUgdmFyaWFudCBpbiB0aGUgZmllbGQKKyAqLworc3RhdGljIHZvaWQKK19kYnVzX2hlYWRlcl9jYWNoZV9vbmUgKERCdXNIZWFkZXIgICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgZmllbGRfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICp2YXJpYW50X3JlYWRlcikKK3sKKyAgaGVhZGVyLT5maWVsZHNbZmllbGRfY29kZV0udmFsdWVfcG9zID0KKyAgICBfZGJ1c190eXBlX3JlYWRlcl9nZXRfdmFsdWVfcG9zICh2YXJpYW50X3JlYWRlcik7CisKKyNpZiAwCisgIF9kYnVzX3ZlcmJvc2UgKCJjYWNoZWQgdmFsdWVfcG9zICVkIGZvciBmaWVsZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgaGVhZGVyLT5maWVsZHNbZmllbGRfY29kZV0udmFsdWVfcG9zLCBmaWVsZF9jb2RlKQorI2VuZGlmCit9CisKKy8qKgorICogUmV0dXJucyB0aGUgaGVhZGVyJ3MgYnl0ZSBvcmRlci4KKyAqCisgKiBAcGFyYW0gaGVhZGVyIHRoZSBoZWFkZXIKKyAqIEByZXR1cm5zIHRoZSBieXRlIG9yZGVyCisgKi8KK2NoYXIKK19kYnVzX2hlYWRlcl9nZXRfYnl0ZV9vcmRlciAoY29uc3QgREJ1c0hlYWRlciAqaGVhZGVyKQoreworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmaGVhZGVyLT5kYXRhKSA+IEJZVEVfT1JERVJfT0ZGU0VUKTsKKworICByZXR1cm4gKGNoYXIpIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJmhlYWRlci0+ZGF0YSwgQllURV9PUkRFUl9PRkZTRVQpOworfQorCisvKioKKyAqIFJldmFsaWRhdGVzIHRoZSBmaWVsZHMgY2FjaGUKKyAqCisgKiBAcGFyYW0gaGVhZGVyIHRoZSBoZWFkZXIKKyAqLworc3RhdGljIHZvaWQKK19kYnVzX2hlYWRlcl9jYWNoZV9yZXZhbGlkYXRlIChEQnVzSGVhZGVyICpoZWFkZXIpCit7CisgIERCdXNUeXBlUmVhZGVyIGFycmF5OworICBEQnVzVHlwZVJlYWRlciByZWFkZXI7CisgIGludCBpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8PSBEQlVTX0hFQURFUl9GSUVMRF9MQVNUKQorICAgIHsKKyAgICAgIGhlYWRlci0+ZmllbGRzW2ldLnZhbHVlX3BvcyA9IF9EQlVTX0hFQURFUl9GSUVMRF9WQUxVRV9OT05FWElTVEVOVDsKKyAgICAgICsraTsKKyAgICB9CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfaW5pdCAoJnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfaGVhZGVyX2dldF9ieXRlX29yZGVyIChoZWFkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmX2RidXNfaGVhZGVyX3NpZ25hdHVyZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJRUxEU19BUlJBWV9TSUdOQVRVUkVfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVhZGVyLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSUVMRFNfQVJSQVlfTEVOR1RIX09GRlNFVCk7CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAoJnJlYWRlciwgJmFycmF5KTsKKworICB3aGlsZSAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJmFycmF5KSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICB7CisgICAgICBEQnVzVHlwZVJlYWRlciBzdWI7CisgICAgICBEQnVzVHlwZVJlYWRlciB2YXJpYW50OworICAgICAgdW5zaWduZWQgY2hhciBmaWVsZF9jb2RlOworCisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlICgmYXJyYXksICZzdWIpOworCisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZzdWIpID09IERCVVNfVFlQRV9CWVRFKTsKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKCZzdWIsICZmaWVsZF9jb2RlKTsKKworICAgICAgLyogVW5rbm93biBmaWVsZHMgc2hvdWxkIGJlIGlnbm9yZWQgKi8KKyAgICAgIGlmIChmaWVsZF9jb2RlID4gREJVU19IRUFERVJfRklFTERfTEFTVCkKKyAgICAgICAgZ290byBuZXh0X2ZpZWxkOworCisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmc3ViKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmc3ViKSA9PSBEQlVTX1RZUEVfVkFSSUFOVCk7CisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlICgmc3ViLCAmdmFyaWFudCk7CisKKyAgICAgIF9kYnVzX2hlYWRlcl9jYWNoZV9vbmUgKGhlYWRlciwgZmllbGRfY29kZSwgJnZhcmlhbnQpOworCisgICAgbmV4dF9maWVsZDoKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZhcnJheSk7CisgICAgfQorfQorCisvKioKKyAqIENoZWNrcyBmb3IgYSBmaWVsZCwgdXBkYXRpbmcgdGhlIGNhY2hlIGlmIHJlcXVpcmVkLgorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlcgorICogQHBhcmFtIGZpZWxkIHRoZSBmaWVsZCB0byBjaGVjaworICogQHJldHVybnMgI0ZBTFNFIGlmIHRoZSBmaWVsZCBkb2Vzbid0IGV4aXN0CisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfaGVhZGVyX2NhY2hlX2NoZWNrIChEQnVzSGVhZGVyICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGZpZWxkKQoreworICBfZGJ1c19hc3NlcnQgKGZpZWxkIDw9IERCVVNfSEVBREVSX0ZJRUxEX0xBU1QpOworCisgIGlmIChoZWFkZXItPmZpZWxkc1tmaWVsZF0udmFsdWVfcG9zID09IF9EQlVTX0hFQURFUl9GSUVMRF9WQUxVRV9VTktOT1dOKQorICAgIF9kYnVzX2hlYWRlcl9jYWNoZV9yZXZhbGlkYXRlIChoZWFkZXIpOworCisgIGlmIChoZWFkZXItPmZpZWxkc1tmaWVsZF0udmFsdWVfcG9zID09IF9EQlVTX0hFQURFUl9GSUVMRF9WQUxVRV9OT05FWElTVEVOVCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgYSBmaWVsZCBpcyBrbm93biBub3QgdG8gZXhpc3QuIEl0IG1heSBleGlzdAorICogZXZlbiBpZiBpdCdzIG5vdCBrbm93biB0byBleGlzdC4KKyAqCisgKiBAcGFyYW0gaGVhZGVyIHRoZSBoZWFkZXIKKyAqIEBwYXJhbSBmaWVsZCB0aGUgZmllbGQgdG8gY2hlY2sKKyAqIEByZXR1cm5zICNGQUxTRSBpZiB0aGUgZmllbGQgZGVmaW5pdGVseSBkb2Vzbid0IGV4aXN0CisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfaGVhZGVyX2NhY2hlX2tub3duX25vbmV4aXN0ZW50IChEQnVzSGVhZGVyICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGZpZWxkKQoreworICBfZGJ1c19hc3NlcnQgKGZpZWxkIDw9IERCVVNfSEVBREVSX0ZJRUxEX0xBU1QpOworCisgIHJldHVybiAoaGVhZGVyLT5maWVsZHNbZmllbGRdLnZhbHVlX3BvcyA9PSBfREJVU19IRUFERVJfRklFTERfVkFMVUVfTk9ORVhJU1RFTlQpOworfQorCisvKioKKyAqIFdyaXRlcyBhIHN0cnVjdCBvZiB7IGJ5dGUsIHZhcmlhbnQgfSB3aXRoIHRoZSBnaXZlbiBiYXNpYyB0eXBlLgorICoKKyAqIEBwYXJhbSB3cml0ZXIgdGhlIHdyaXRlciAoc2hvdWxkIGJlIHJlYWR5IHRvIHdyaXRlIGEgc3RydWN0KQorICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIHZhbHVlCisgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIGFzIGZvciBfZGJ1c19tYXJzaGFsX3NldF9iYXNpYygpCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAord3JpdGVfYmFzaWNfZmllbGQgKERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGZpZWxkLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICp2YWx1ZSkKK3sKKyAgREJ1c1R5cGVXcml0ZXIgc3ViOworICBEQnVzVHlwZVdyaXRlciB2YXJpYW50OworICBpbnQgc3RhcnQ7CisgIGludCBwYWRkaW5nOworICB1bnNpZ25lZCBjaGFyIGZpZWxkX2J5dGU7CisgIERCdXNTdHJpbmcgY29udGFpbmVkX3R5cGU7CisgIGNoYXIgYnVmWzJdOworCisgIHN0YXJ0ID0gd3JpdGVyLT52YWx1ZV9wb3M7CisgIHBhZGRpbmcgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAod3JpdGVyLT52YWx1ZV9zdHIpIC0gc3RhcnQ7CisKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl9yZWN1cnNlICh3cml0ZXIsIERCVVNfVFlQRV9TVFJVQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgJnN1YikpCisgICAgZ290byBhcHBlbmRfZmFpbGVkOworCisgIGZpZWxkX2J5dGUgPSBmaWVsZDsKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAoJnN1YiwgREJVU19UWVBFX0JZVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9ieXRlKSkKKyAgICBnb3RvIGFwcGVuZF9mYWlsZWQ7CisKKyAgYnVmWzBdID0gdHlwZTsKKyAgYnVmWzFdID0gJ1wwJzsKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3RfbGVuICgmY29udGFpbmVkX3R5cGUsIGJ1ZiwgMSk7CisKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl9yZWN1cnNlICgmc3ViLCBEQlVTX1RZUEVfVkFSSUFOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVkX3R5cGUsIDAsICZ2YXJpYW50KSkKKyAgICBnb3RvIGFwcGVuZF9mYWlsZWQ7CisKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAoJnZhcmlhbnQsIHR5cGUsIHZhbHVlKSkKKyAgICBnb3RvIGFwcGVuZF9mYWlsZWQ7CisKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl91bnJlY3Vyc2UgKCZzdWIsICZ2YXJpYW50KSkKKyAgICBnb3RvIGFwcGVuZF9mYWlsZWQ7CisKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl91bnJlY3Vyc2UgKHdyaXRlciwgJnN1YikpCisgICAgZ290byBhcHBlbmRfZmFpbGVkOworCisgIHJldHVybiBUUlVFOworCisgYXBwZW5kX2ZhaWxlZDoKKyAgX2RidXNfc3RyaW5nX2RlbGV0ZSAod3JpdGVyLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAod3JpdGVyLT52YWx1ZV9zdHIpIC0gc3RhcnQgLSBwYWRkaW5nKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIFNldHMgYSBzdHJ1Y3Qgb2YgeyBieXRlLCB2YXJpYW50IH0gd2l0aCB0aGUgZ2l2ZW4gYmFzaWMgdHlwZS4KKyAqCisgKiBAcGFyYW0gcmVhZGVyIHRoZSByZWFkZXIgKHNob3VsZCBiZSBpdGVyYXRpbmcgb3ZlciB0aGUgYXJyYXkgcG9pbnRpbmcgYXQgdGhlIGZpZWxkIHRvIHNldCkKKyAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZQorICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBhcyBmb3IgX2RidXNfbWFyc2hhbF9zZXRfYmFzaWMoKQorICogQHBhcmFtIHJlYWxpZ25fcm9vdCB3aGVyZSB0byByZWFsaWduIGZyb20KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitzZXRfYmFzaWNfZmllbGQgKERCdXNUeXBlUmVhZGVyICAgICAgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBmaWVsZCwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCkKK3sKKyAgREJ1c1R5cGVSZWFkZXIgc3ViOworICBEQnVzVHlwZVJlYWRlciB2YXJpYW50OworCisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKHJlYWRlciwgJnN1Yik7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmc3ViKSA9PSBEQlVTX1RZUEVfQllURSk7CisjaWZuZGVmIERCVVNfRElTQUJMRV9BU1NFUlQKKyB7CisgICB1bnNpZ25lZCBjaGFyIHZfQllURTsKKyAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKCZzdWIsICZ2X0JZVEUpOworICAgX2RidXNfYXNzZXJ0ICgoKGludCkgdl9CWVRFKSA9PSBmaWVsZCk7CisgfQorI2VuZGlmCisKKyAgaWYgKCFfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmc3ViKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyB2YXJpYW50IGZpZWxkPyIpOworCisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKCZzdWIsICZ2YXJpYW50KTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmdmFyaWFudCkgPT0gdHlwZSk7CisKKyAgaWYgKCFfZGJ1c190eXBlX3JlYWRlcl9zZXRfYmFzaWMgKCZ2YXJpYW50LCB2YWx1ZSwgcmVhbGlnbl9yb290KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogR2V0cyB0aGUgdHlwZSBvZiB0aGUgbWVzc2FnZS4KKyAqCisgKiBAcGFyYW0gaGVhZGVyIHRoZSBoZWFkZXIKKyAqIEByZXR1cm5zIHRoZSB0eXBlCisgKi8KK2ludAorX2RidXNfaGVhZGVyX2dldF9tZXNzYWdlX3R5cGUgKERCdXNIZWFkZXIgKmhlYWRlcikKK3sKKyAgaW50IHR5cGU7CisKKyAgdHlwZSA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJmhlYWRlci0+ZGF0YSwgVFlQRV9PRkZTRVQpOworICBfZGJ1c19hc3NlcnQgKHR5cGUgIT0gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCk7CisKKyAgcmV0dXJuIHR5cGU7Cit9CisKKy8qKgorICogU2V0cyB0aGUgc2VyaWFsIG51bWJlciBvZiBhIGhlYWRlci4gIFRoaXMgY2FuIG9ubHkgYmUgZG9uZSBvbmNlIG9uCisgKiBhIGhlYWRlci4KKyAqCisgKiBAcGFyYW0gaGVhZGVyIHRoZSBoZWFkZXIKKyAqIEBwYXJhbSBzZXJpYWwgdGhlIHNlcmlhbAorICovCit2b2lkCitfZGJ1c19oZWFkZXJfc2V0X3NlcmlhbCAoREJ1c0hlYWRlciAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgIHNlcmlhbCkKK3sKKyAgLyogd2UgdXNlIHRoaXMgZnVuY3Rpb24gdG8gc2V0IHRoZSBzZXJpYWwgb24gb3V0Z29pbmcKKyAgICogbWVzc2FnZXMsIGFuZCB0byByZXNldCB0aGUgc2VyaWFsIGluIGRidXNfbWVzc2FnZV9jb3B5OworICAgKiB0aGlzIGFzc2VydGlvbiBzaG91bGQgY2F0Y2ggYSBkb3VibGUtc2V0IG9uIG91dGdvaW5nLgorICAgKi8KKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19oZWFkZXJfZ2V0X3NlcmlhbCAoaGVhZGVyKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgc2VyaWFsID09IDApOworCisgIF9kYnVzX21hcnNoYWxfc2V0X3VpbnQzMiAoJmhlYWRlci0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVJJQUxfT0ZGU0VULAorCQkJICAgIHNlcmlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19oZWFkZXJfZ2V0X2J5dGVfb3JkZXIgKGhlYWRlcikpOworfQorCisvKioKKyAqIFNlZSBkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCgpCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyCisgKiBAcmV0dXJucyB0aGUgY2xpZW50IHNlcmlhbAorICovCitkYnVzX3VpbnQzMl90CitfZGJ1c19oZWFkZXJfZ2V0X3NlcmlhbCAoREJ1c0hlYWRlciAqaGVhZGVyKQoreworICByZXR1cm4gX2RidXNfbWFyc2hhbF9yZWFkX3VpbnQzMiAoJmhlYWRlci0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFUklBTF9PRkZTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19oZWFkZXJfZ2V0X2J5dGVfb3JkZXIgKGhlYWRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKK30KKworLyoqCisgKiBSZS1pbml0aWFsaXplcyBhIGhlYWRlciB0aGF0IHdhcyBwcmV2aW91c2x5IGluaXRpYWxpemVkIGFuZCBuZXZlcgorICogZnJlZWQuICBBZnRlciB0aGlzLCB0byBtYWtlIHRoZSBoZWFkZXIgdmFsaWQgeW91IGhhdmUgdG8gY2FsbAorICogX2RidXNfaGVhZGVyX2NyZWF0ZSgpLgorICoKKyAqIEBwYXJhbSBoZWFkZXIgaGVhZGVyIHRvIHJlLWluaXRpYWxpemUKKyAqLwordm9pZAorX2RidXNfaGVhZGVyX3JlaW5pdCAoREJ1c0hlYWRlciAqaGVhZGVyKQoreworICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmhlYWRlci0+ZGF0YSwgMCk7CisKKyAgaGVhZGVyLT5wYWRkaW5nID0gMDsKKworICBfZGJ1c19oZWFkZXJfY2FjaGVfaW52YWxpZGF0ZV9hbGwgKGhlYWRlcik7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBoZWFkZXIsIGJ1dCBkb2Vzbid0IHByZXBhcmUgaXQgZm9yIHVzZTsKKyAqIHRvIG1ha2UgdGhlIGhlYWRlciB2YWxpZCwgeW91IGhhdmUgdG8gY2FsbCBfZGJ1c19oZWFkZXJfY3JlYXRlKCkuCisgKgorICogQHBhcmFtIGhlYWRlciBoZWFkZXIgdG8gaW5pdGlhbGl6ZQorICogQHBhcmFtIGJ5dGVfb3JkZXIgYnl0ZSBvcmRlciBvZiB0aGUgaGVhZGVyCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2hlYWRlcl9pbml0IChEQnVzSGVhZGVyICpoZWFkZXIpCit7CisgIGlmICghX2RidXNfc3RyaW5nX2luaXRfcHJlYWxsb2NhdGVkICgmaGVhZGVyLT5kYXRhLCAzMikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX2hlYWRlcl9yZWluaXQgKGhlYWRlcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogRnJlZXMgYSBoZWFkZXIuCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyCisgKi8KK3ZvaWQKK19kYnVzX2hlYWRlcl9mcmVlIChEQnVzSGVhZGVyICpoZWFkZXIpCit7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmaGVhZGVyLT5kYXRhKTsKK30KKworLyoqCisgKiBJbml0aWFsaXplcyBkZXN0IHdpdGggYSBjb3B5IG9mIHRoZSBnaXZlbiBoZWFkZXIuCisgKiBSZXNldHMgdGhlIG1lc3NhZ2Ugc2VyaWFsIHRvIDAgb24gdGhlIGNvcHkuCisgKgorICogQHBhcmFtIGhlYWRlciBoZWFkZXIgdG8gY29weQorICogQHBhcmFtIGRlc3QgZGVzdGluYXRpb24gZm9yIGNvcHkKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGVhZGVyX2NvcHkgKGNvbnN0IERCdXNIZWFkZXIgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICBEQnVzSGVhZGVyICAgICAgICpkZXN0KQoreworICAqZGVzdCA9ICpoZWFkZXI7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdF9wcmVhbGxvY2F0ZWQgKCZkZXN0LT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZoZWFkZXItPmRhdGEpKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmhlYWRlci0+ZGF0YSwgMCwgJmRlc3QtPmRhdGEsIDApKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZGVzdC0+ZGF0YSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIFJlc2V0IHRoZSBzZXJpYWwgKi8KKyAgX2RidXNfaGVhZGVyX3NldF9zZXJpYWwgKGRlc3QsIDApOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEZpbGxzIGluIHRoZSBwcmltYXJ5IGZpZWxkcyBvZiB0aGUgaGVhZGVyLCBzbyB0aGUgaGVhZGVyIGlzIHJlYWR5CisgKiBmb3IgdXNlLiAjTlVMTCBtYXkgYmUgc3BlY2lmaWVkIGZvciBzb21lIG9yIGFsbCBvZiB0aGUgZmllbGRzIHRvCisgKiBhdm9pZCBhZGRpbmcgdGhvc2UgZmllbGRzLiBTb21lIGNvbWJpbmF0aW9ucyBvZiBmaWVsZHMgZG9uJ3QgbWFrZQorICogc2Vuc2UsIGFuZCBwYXNzaW5nIHRoZW0gaW4gd2lsbCB0cmlnZ2VyIGFuIGFzc2VydGlvbiBmYWlsdXJlLgorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlcgorICogQHBhcmFtIG1lc3NhZ2VfdHlwZSB0aGUgbWVzc2FnZSB0eXBlCisgKiBAcGFyYW0gZGVzdGluYXRpb24gZGVzdGluYXRpb24gZmllbGQgb3IgI05VTEwKKyAqIEBwYXJhbSBwYXRoIHBhdGggZmllbGQgb3IgI05VTEwKKyAqIEBwYXJhbSBpbnRlcmZhY2UgaW50ZXJmYWNlIGZpZWxkIG9yICNOVUxMCisgKiBAcGFyYW0gbWVtYmVyIG1lbWJlciBmaWVsZCBvciAjTlVMTAorICogQHBhcmFtIGVycm9yX25hbWUgZXJyb3IgbmFtZSBvciAjTlVMTAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oZWFkZXJfY3JlYXRlIChEQnVzSGVhZGVyICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmRlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKm1lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICplcnJvcl9uYW1lKQoreworICB1bnNpZ25lZCBjaGFyIHZfQllURTsKKyAgZGJ1c191aW50MzJfdCB2X1VJTlQzMjsKKyAgREJ1c1R5cGVXcml0ZXIgd3JpdGVyOworICBEQnVzVHlwZVdyaXRlciBhcnJheTsKKworICBfZGJ1c19hc3NlcnQgKGJ5dGVfb3JkZXIgPT0gREJVU19MSVRUTEVfRU5ESUFOIHx8CisgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciA9PSBEQlVTX0JJR19FTkRJQU4pOworICBfZGJ1c19hc3NlcnQgKCgoaW50ZXJmYWNlIHx8IG1lc3NhZ2VfdHlwZSAhPSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpICYmIG1lbWJlcikgfHwKKyAgICAgICAgICAgICAgICAoZXJyb3JfbmFtZSkgfHwKKyAgICAgICAgICAgICAgICAhKGludGVyZmFjZSB8fCBtZW1iZXIgfHwgZXJyb3JfbmFtZSkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmaGVhZGVyLT5kYXRhKSA9PSAwKTsKKworICBpZiAoIXJlc2VydmVfaGVhZGVyX3BhZGRpbmcgKGhlYWRlcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX3R5cGVfd3JpdGVyX2luaXRfdmFsdWVzX29ubHkgKCZ3cml0ZXIsIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfZGJ1c19oZWFkZXJfc2lnbmF0dXJlX3N0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlYWRlci0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVBREVSX0VORF9CRUZPUkVfUEFERElORyAoaGVhZGVyKSk7CisKKyAgdl9CWVRFID0gYnl0ZV9vcmRlcjsKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAoJndyaXRlciwgREJVU19UWVBFX0JZVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X0JZVEUpKQorICAgIGdvdG8gb29tOworCisgIHZfQllURSA9IG1lc3NhZ2VfdHlwZTsKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAoJndyaXRlciwgREJVU19UWVBFX0JZVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X0JZVEUpKQorICAgIGdvdG8gb29tOworCisgIHZfQllURSA9IDA7IC8qIGZsYWdzICovCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKCZ3cml0ZXIsIERCVVNfVFlQRV9CWVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9CWVRFKSkKKyAgICBnb3RvIG9vbTsKKworICB2X0JZVEUgPSBEQlVTX01BSk9SX1BST1RPQ09MX1ZFUlNJT047CisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKCZ3cml0ZXIsIERCVVNfVFlQRV9CWVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9CWVRFKSkKKyAgICBnb3RvIG9vbTsKKworICB2X1VJTlQzMiA9IDA7IC8qIGJvZHkgbGVuZ3RoICovCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKCZ3cml0ZXIsIERCVVNfVFlQRV9VSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X1VJTlQzMikpCisgICAgZ290byBvb207CisKKyAgdl9VSU5UMzIgPSAwOyAvKiBzZXJpYWwgKi8KKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAoJndyaXRlciwgREJVU19UWVBFX1VJTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfVUlOVDMyKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3JlY3Vyc2UgKCZ3cml0ZXIsIERCVVNfVFlQRV9BUlJBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX2RidXNfaGVhZGVyX3NpZ25hdHVyZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklFTERTX0FSUkFZX1NJR05BVFVSRV9PRkZTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFycmF5KSkKKyAgICBnb3RvIG9vbTsKKworICAvKiBNYXJzaGFsIGFsbCB0aGUgZmllbGRzIChNYXJzaGFsbCBGaWVsZHM/KSAqLworCisgIGlmIChwYXRoICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCF3cml0ZV9iYXNpY19maWVsZCAoJmFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfUEFUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9PQkpFQ1RfUEFUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRoKSkKKyAgICAgICAgZ290byBvb207CisgICAgfQorCisgIGlmIChkZXN0aW5hdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghd3JpdGVfYmFzaWNfZmllbGQgKCZhcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX0RFU1RJTkFUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXN0aW5hdGlvbikpCisgICAgICAgIGdvdG8gb29tOworICAgIH0KKworICBpZiAoaW50ZXJmYWNlICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCF3cml0ZV9iYXNpY19maWVsZCAoJmFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfSU5URVJGQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmZhY2UpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgaWYgKG1lbWJlciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghd3JpdGVfYmFzaWNfZmllbGQgKCZhcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX01FTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVtYmVyKSkKKyAgICAgICAgZ290byBvb207CisgICAgfQorCisgIGlmIChlcnJvcl9uYW1lICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCF3cml0ZV9iYXNpY19maWVsZCAoJmFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfRVJST1JfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3JfbmFtZSkpCisgICAgICAgIGdvdG8gb29tOworICAgIH0KKworICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3VucmVjdXJzZSAoJndyaXRlciwgJmFycmF5KSkKKyAgICBnb3RvIG9vbTsKKworICBjb3JyZWN0X2hlYWRlcl9wYWRkaW5nIChoZWFkZXIpOworCisgIHJldHVybiBUUlVFOworCisgb29tOgorICBfZGJ1c19zdHJpbmdfZGVsZXRlICgmaGVhZGVyLT5kYXRhLCAwLAorICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmhlYWRlci0+ZGF0YSkgLSBoZWFkZXItPnBhZGRpbmcpOworICBjb3JyZWN0X2hlYWRlcl9wYWRkaW5nIChoZWFkZXIpOworCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBHaXZlbiBkYXRhIGxvbmcgZW5vdWdoIHRvIGNvbnRhaW4gdGhlIGxlbmd0aCBvZiB0aGUgbWVzc2FnZSBib2R5CisgKiBhbmQgdGhlIGZpZWxkcyBhcnJheSwgY2hlY2sgd2hldGhlciB0aGUgZGF0YSBpcyBsb25nIGVub3VnaCB0bworICogY29udGFpbiB0aGUgZW50aXJlIG1lc3NhZ2UgKGFzc3VtaW5nIHRoZSBjbGFpbWVkIGxlbmd0aHMgYXJlCisgKiBhY2N1cmF0ZSkuIEFsc28gY2hlY2tzIHRoYXQgdGhlIGxlbmd0aHMgYXJlIGluIHNhbml0eSBwYXJhbWV0ZXJzLgorICoKKyAqIEBwYXJhbSBtYXhfbWVzc2FnZV9sZW5ndGggbWF4aW11bSBsZW5ndGggb2YgYSB2YWxpZCBtZXNzYWdlCisgKiBAcGFyYW0gdmFsaWRpdHkgcmV0dXJuIGxvY2F0aW9uIGZvciB3aHkgdGhlIGRhdGEgaXMgaW52YWxpZCBpZiBpdCBpcworICogQHBhcmFtIGJ5dGVfb3JkZXIgcmV0dXJuIGxvY2F0aW9uIGZvciBieXRlIG9yZGVyCisgKiBAcGFyYW0gZmllbGRzX2FycmF5X2xlbiByZXR1cm4gbG9jYXRpb24gZm9yIGNsYWltZWQgZmllbGRzIGFycmF5IGxlbmd0aAorICogQHBhcmFtIGhlYWRlcl9sZW4gcmV0dXJuIGxvY2F0aW9uIGZvciBjbGFpbWVkIGhlYWRlciBsZW5ndGgKKyAqIEBwYXJhbSBib2R5X2xlbiByZXR1cm4gbG9jYXRpb24gZm9yIGNsYWltZWQgYm9keSBsZW5ndGgKKyAqIEBwYXJhbSBzdHIgdGhlIGRhdGEKKyAqIEBwYXJhbSBzdGFydCBzdGFydCBvZiBkYXRhLCA4LWFsaWduZWQKKyAqIEBwYXJhbSBsZW4gbGVuZ3RoIG9mIGRhdGEKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBkYXRhIGlzIGxvbmcgZW5vdWdoIGZvciB0aGUgY2xhaW1lZCBsZW5ndGgsIGFuZCB0aGUgbGVuZ3RocyB3ZXJlIHZhbGlkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oZWFkZXJfaGF2ZV9tZXNzYWdlX3VudHJ1c3RlZCAoaW50ICAgICAgICAgICAgICAgIG1heF9tZXNzYWdlX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAqdmFsaWRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKmZpZWxkc19hcnJheV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKmhlYWRlcl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKmJvZHlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pCisKK3sKKyAgZGJ1c191aW50MzJfdCBoZWFkZXJfbGVuX3Vuc2lnbmVkOworICBkYnVzX3VpbnQzMl90IGZpZWxkc19hcnJheV9sZW5fdW5zaWduZWQ7CisgIGRidXNfdWludDMyX3QgYm9keV9sZW5fdW5zaWduZWQ7CisKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8IF9EQlVTX0lOVDMyX01BWCAvIDIpOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ID09IChpbnQpIF9EQlVTX0FMSUdOX1ZBTFVFIChzdGFydCwgOCkpOworCisgICpieXRlX29yZGVyID0gX2RidXNfc3RyaW5nX2dldF9ieXRlIChzdHIsIHN0YXJ0ICsgQllURV9PUkRFUl9PRkZTRVQpOworCisgIGlmICgqYnl0ZV9vcmRlciAhPSBEQlVTX0xJVFRMRV9FTkRJQU4gJiYgKmJ5dGVfb3JkZXIgIT0gREJVU19CSUdfRU5ESUFOKQorICAgIHsKKyAgICAgICp2YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9CQURfQllURV9PUkRFUjsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChGSUVMRFNfQVJSQVlfTEVOR1RIX09GRlNFVCArIDQgPD0gbGVuKTsKKyAgZmllbGRzX2FycmF5X2xlbl91bnNpZ25lZCA9IF9kYnVzX21hcnNoYWxfcmVhZF91aW50MzIgKHN0ciwgc3RhcnQgKyBGSUVMRFNfQVJSQVlfTEVOR1RIX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX29yZGVyLCBOVUxMKTsKKworICBpZiAoZmllbGRzX2FycmF5X2xlbl91bnNpZ25lZCA+ICh1bnNpZ25lZCkgbWF4X21lc3NhZ2VfbGVuZ3RoKQorICAgIHsKKyAgICAgICp2YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9JTlNBTkVfRklFTERTX0FSUkFZX0xFTkdUSDsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChCT0RZX0xFTkdUSF9PRkZTRVQgKyA0IDwgbGVuKTsKKyAgYm9keV9sZW5fdW5zaWduZWQgPSBfZGJ1c19tYXJzaGFsX3JlYWRfdWludDMyIChzdHIsIHN0YXJ0ICsgQk9EWV9MRU5HVEhfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX29yZGVyLCBOVUxMKTsKKworICBpZiAoYm9keV9sZW5fdW5zaWduZWQgPiAodW5zaWduZWQpIG1heF9tZXNzYWdlX2xlbmd0aCkKKyAgICB7CisgICAgICAqdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfSU5TQU5FX0JPRFlfTEVOR1RIOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBoZWFkZXJfbGVuX3Vuc2lnbmVkID0gRklSU1RfRklFTERfT0ZGU0VUICsgZmllbGRzX2FycmF5X2xlbl91bnNpZ25lZDsKKyAgaGVhZGVyX2xlbl91bnNpZ25lZCA9IF9EQlVTX0FMSUdOX1ZBTFVFIChoZWFkZXJfbGVuX3Vuc2lnbmVkLCA4KTsKKworICAvKiBvdmVyZmxvdyBzaG91bGQgYmUgaW1wb3NzaWJsZSBzaW5jZSB0aGUgbGVuZ3RocyBhcmVuJ3QgYWxsb3dlZCB0bworICAgKiBiZSBodWdlLgorICAgKi8KKyAgX2RidXNfYXNzZXJ0IChtYXhfbWVzc2FnZV9sZW5ndGggPCBfREJVU19JTlQzMl9NQVggLyAyKTsKKyAgaWYgKGJvZHlfbGVuX3Vuc2lnbmVkICsgaGVhZGVyX2xlbl91bnNpZ25lZCA+ICh1bnNpZ25lZCkgbWF4X21lc3NhZ2VfbGVuZ3RoKQorICAgIHsKKyAgICAgICp2YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9NRVNTQUdFX1RPT19MT05HOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGJvZHlfbGVuX3Vuc2lnbmVkIDwgKHVuc2lnbmVkKSBfREJVU19JTlQzMl9NQVgpOworICBfZGJ1c19hc3NlcnQgKGZpZWxkc19hcnJheV9sZW5fdW5zaWduZWQgPCAodW5zaWduZWQpIF9EQlVTX0lOVDMyX01BWCk7CisgIF9kYnVzX2Fzc2VydCAoaGVhZGVyX2xlbl91bnNpZ25lZCA8ICh1bnNpZ25lZCkgX0RCVVNfSU5UMzJfTUFYKTsKKworICAqYm9keV9sZW4gPSBib2R5X2xlbl91bnNpZ25lZDsKKyAgKmZpZWxkc19hcnJheV9sZW4gPSBmaWVsZHNfYXJyYXlfbGVuX3Vuc2lnbmVkOworICAqaGVhZGVyX2xlbiA9IGhlYWRlcl9sZW5fdW5zaWduZWQ7CisKKyAgKnZhbGlkaXR5ID0gREJVU19WQUxJRDsKKworICBfZGJ1c192ZXJib3NlICgiaGF2ZSAlZCBieXRlcywgbmVlZCBib2R5ICV1ICsgaGVhZGVyICV1ID0gJXVcbiIsCisgICAgICAgICAgICAgICAgIGxlbiwgYm9keV9sZW5fdW5zaWduZWQsIGhlYWRlcl9sZW5fdW5zaWduZWQsCisgICAgICAgICAgICAgICAgIGJvZHlfbGVuX3Vuc2lnbmVkICsgaGVhZGVyX2xlbl91bnNpZ25lZCk7CisKKyAgcmV0dXJuIChib2R5X2xlbl91bnNpZ25lZCArIGhlYWRlcl9sZW5fdW5zaWduZWQpIDw9ICh1bnNpZ25lZCkgbGVuOworfQorCitzdGF0aWMgREJ1c1ZhbGlkaXR5CitjaGVja19tYW5kYXRvcnlfZmllbGRzIChEQnVzSGVhZGVyICpoZWFkZXIpCit7CisjZGVmaW5lIFJFUVVJUkVfRklFTEQobmFtZSkgZG8geyBpZiAoaGVhZGVyLT5maWVsZHNbREJVU19IRUFERVJfRklFTERfIyNuYW1lXS52YWx1ZV9wb3MgPCAwKSByZXR1cm4gREJVU19JTlZBTElEX01JU1NJTkdfIyNuYW1lOyB9IHdoaWxlICgwKQorCisgIHN3aXRjaCAoX2RidXNfaGVhZGVyX2dldF9tZXNzYWdlX3R5cGUgKGhlYWRlcikpCisgICAgeworICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMOgorICAgICAgUkVRVUlSRV9GSUVMRCAoSU5URVJGQUNFKTsKKyAgICAgIC8qIEZBTEwgVEhSVSAtIHNpZ25hbHMgYWxzbyByZXF1aXJlIHRoZSBwYXRoIGFuZCBtZW1iZXIgKi8KKyAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMOgorICAgICAgUkVRVUlSRV9GSUVMRCAoUEFUSCk7CisgICAgICBSRVFVSVJFX0ZJRUxEIChNRU1CRVIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUjoKKyAgICAgIFJFUVVJUkVfRklFTEQgKEVSUk9SX05BTUUpOworICAgICAgUkVRVUlSRV9GSUVMRCAoUkVQTFlfU0VSSUFMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTjoKKyAgICAgIFJFUVVJUkVfRklFTEQgKFJFUExZX1NFUklBTCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogb3RoZXIgbWVzc2FnZSB0eXBlcyBhbGxvd2VkIGJ1dCBpZ25vcmVkICovCisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIERCVVNfVkFMSUQ7Cit9CisKK3N0YXRpYyBEQnVzVmFsaWRpdHkKK2xvYWRfYW5kX3ZhbGlkYXRlX2ZpZWxkIChEQnVzSGVhZGVyICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqdmFyaWFudF9yZWFkZXIpCit7CisgIGludCB0eXBlOworICBpbnQgZXhwZWN0ZWRfdHlwZTsKKyAgY29uc3QgREJ1c1N0cmluZyAqdmFsdWVfc3RyOworICBpbnQgdmFsdWVfcG9zOworICBpbnQgc3RyX2RhdGFfcG9zOworICBkYnVzX3VpbnQzMl90IHZfVUlOVDMyOworICBpbnQgYmFkX3N0cmluZ19jb2RlOworICBkYnVzX2Jvb2xfdCAoKiBzdHJpbmdfdmFsaWRhdGlvbl9mdW5jKSAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgbGVuKTsKKworICAvKiBTdXBwb3NlZCB0byBoYXZlIGJlZW4gY2hlY2tlZCBhbHJlYWR5ICovCisgIF9kYnVzX2Fzc2VydCAoZmllbGQgPD0gREJVU19IRUFERVJfRklFTERfTEFTVCk7CisgIF9kYnVzX2Fzc2VydCAoZmllbGQgIT0gREJVU19IRUFERVJfRklFTERfSU5WQUxJRCk7CisKKyAgLyogQmVmb3JlIHdlIGNhbiBjYWNoZSBhIGZpZWxkLCB3ZSBuZWVkIHRvIGtub3cgaXQgaGFzIHRoZSByaWdodCB0eXBlICovCisgIHR5cGUgPSBfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICh2YXJpYW50X3JlYWRlcik7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19oZWFkZXJfZmllbGRfdHlwZXNbZmllbGRdLmNvZGUgPT0gZmllbGQpOworCisgIGV4cGVjdGVkX3R5cGUgPSBFWFBFQ1RFRF9UWVBFX09GX0ZJRUxEIChmaWVsZCk7CisgIGlmICh0eXBlICE9IGV4cGVjdGVkX3R5cGUpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkZpZWxkICVkIHNob3VsZCBoYXZlIHR5cGUgJWQgYnV0IGhhcyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGZpZWxkLCBleHBlY3RlZF90eXBlLCB0eXBlKTsKKyAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfSEVBREVSX0ZJRUxEX0hBU19XUk9OR19UWVBFOworICAgIH0KKworICAvKiBJZiB0aGUgZmllbGQgd2FzIHByb3ZpZGVkIHR3aWNlLCB3ZSBhcmVuJ3QgaGFwcHkgKi8KKyAgaWYgKGhlYWRlci0+ZmllbGRzW2ZpZWxkXS52YWx1ZV9wb3MgPj0gMCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiSGVhZGVyIGZpZWxkICVkIHNlZW4gYSBzZWNvbmQgdGltZVxuIiwgZmllbGQpOworICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9IRUFERVJfRklFTERfQVBQRUFSU19UV0lDRTsKKyAgICB9CisKKyAgLyogTm93IHdlIGNhbiBjYWNoZSBhbmQgbG9vayBhdCB0aGUgZmllbGQgY29udGVudCAqLworICBfZGJ1c192ZXJib3NlICgiaW5pdGlhbGx5IGNhY2hpbmcgZmllbGQgJWRcbiIsIGZpZWxkKTsKKyAgX2RidXNfaGVhZGVyX2NhY2hlX29uZSAoaGVhZGVyLCBmaWVsZCwgdmFyaWFudF9yZWFkZXIpOworCisgIHN0cmluZ192YWxpZGF0aW9uX2Z1bmMgPSBOVUxMOworCisgIC8qIG1ha2UgY29tcGlsZXIgaGFwcHkgdGhhdCBhbGwgdGhpcyBpcyBpbml0aWFsaXplZCAqLworICB2X1VJTlQzMiA9IDA7CisgIHZhbHVlX3N0ciA9IE5VTEw7CisgIHZhbHVlX3BvcyA9IC0xOworICBzdHJfZGF0YV9wb3MgPSAtMTsKKyAgYmFkX3N0cmluZ19jb2RlID0gREJVU19WQUxJRDsKKworICBpZiAoZXhwZWN0ZWRfdHlwZSA9PSBEQlVTX1RZUEVfVUlOVDMyKQorICAgIHsKKyAgICAgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfYmFzaWMgKGhlYWRlciwgZmllbGQsIGV4cGVjdGVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9VSU5UMzIpOworICAgIH0KKyAgZWxzZSBpZiAoZXhwZWN0ZWRfdHlwZSA9PSBEQlVTX1RZUEVfU1RSSU5HIHx8CisgICAgICAgICAgIGV4cGVjdGVkX3R5cGUgPT0gREJVU19UWVBFX09CSkVDVF9QQVRIIHx8CisgICAgICAgICAgIGV4cGVjdGVkX3R5cGUgPT0gREJVU19UWVBFX1NJR05BVFVSRSkKKyAgICB7CisgICAgICBfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX3JhdyAoaGVhZGVyLCBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfc3RyLCAmdmFsdWVfcG9zKTsKKyAgICAgIHN0cl9kYXRhX3BvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFICh2YWx1ZV9wb3MsIDQpICsgNDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJub25lIG9mIHRoZSBrbm93biBmaWVsZHMgc2hvdWxkIGhhdmUgdGhpcyB0eXBlIik7CisgICAgfQorCisgIHN3aXRjaCAoZmllbGQpCisgICAgeworICAgIGNhc2UgREJVU19IRUFERVJfRklFTERfREVTVElOQVRJT046CisgICAgICBzdHJpbmdfdmFsaWRhdGlvbl9mdW5jID0gX2RidXNfdmFsaWRhdGVfYnVzX25hbWU7CisgICAgICBiYWRfc3RyaW5nX2NvZGUgPSBEQlVTX0lOVkFMSURfQkFEX0RFU1RJTkFUSU9OOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX0hFQURFUl9GSUVMRF9JTlRFUkZBQ0U6CisgICAgICBzdHJpbmdfdmFsaWRhdGlvbl9mdW5jID0gX2RidXNfdmFsaWRhdGVfaW50ZXJmYWNlOworICAgICAgYmFkX3N0cmluZ19jb2RlID0gREJVU19JTlZBTElEX0JBRF9JTlRFUkZBQ0U7CisKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmX2RidXNfbG9jYWxfaW50ZXJmYWNlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmX2RidXNfbG9jYWxfaW50ZXJmYWNlX3N0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfc3RyLCBzdHJfZGF0YV9wb3MpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIk1lc3NhZ2UgaXMgb24gdGhlIGxvY2FsIGludGVyZmFjZVxuIik7CisgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9VU0VTX0xPQ0FMX0lOVEVSRkFDRTsKKyAgICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfSEVBREVSX0ZJRUxEX01FTUJFUjoKKyAgICAgIHN0cmluZ192YWxpZGF0aW9uX2Z1bmMgPSBfZGJ1c192YWxpZGF0ZV9tZW1iZXI7CisgICAgICBiYWRfc3RyaW5nX2NvZGUgPSBEQlVTX0lOVkFMSURfQkFEX01FTUJFUjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX0hFQURFUl9GSUVMRF9FUlJPUl9OQU1FOgorICAgICAgc3RyaW5nX3ZhbGlkYXRpb25fZnVuYyA9IF9kYnVzX3ZhbGlkYXRlX2Vycm9yX25hbWU7CisgICAgICBiYWRfc3RyaW5nX2NvZGUgPSBEQlVTX0lOVkFMSURfQkFEX0VSUk9SX05BTUU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgREJVU19IRUFERVJfRklFTERfU0VOREVSOgorICAgICAgc3RyaW5nX3ZhbGlkYXRpb25fZnVuYyA9IF9kYnVzX3ZhbGlkYXRlX2J1c19uYW1lOworICAgICAgYmFkX3N0cmluZ19jb2RlID0gREJVU19JTlZBTElEX0JBRF9TRU5ERVI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgREJVU19IRUFERVJfRklFTERfUEFUSDoKKyAgICAgIC8qIE9CSkVDVF9QQVRIIHdhcyB2YWxpZGF0ZWQgZ2VuZXJpY2FsbHkgZHVlIHRvIGl0cyB0eXBlICovCisgICAgICBzdHJpbmdfdmFsaWRhdGlvbl9mdW5jID0gTlVMTDsKKworICAgICAgaWYgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZfZGJ1c19sb2NhbF9wYXRoX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmX2RidXNfbG9jYWxfcGF0aF9zdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3N0ciwgc3RyX2RhdGFfcG9zKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJNZXNzYWdlIGlzIGZyb20gdGhlIGxvY2FsIHBhdGhcbiIpOworICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfVVNFU19MT0NBTF9QQVRIOworICAgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgREJVU19IRUFERVJfRklFTERfUkVQTFlfU0VSSUFMOgorICAgICAgLyogQ2FuJ3QgYmUgMCAqLworICAgICAgaWYgKHZfVUlOVDMyID09IDApCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX0JBRF9TRVJJQUw7CisgICAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX0hFQURFUl9GSUVMRF9VTklYX0ZEUzoKKyAgICAgIC8qIEV2ZXJ5IHZhbHVlIG1ha2VzIHNlbnNlICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFOgorICAgICAgLyogU0lHTkFUVVJFIHZhbGlkYXRlZCBnZW5lcmljYWxseSBkdWUgdG8gaXRzIHR5cGUgKi8KKyAgICAgIHN0cmluZ192YWxpZGF0aW9uX2Z1bmMgPSBOVUxMOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidW5rbm93biBmaWVsZCBzaG91bGRuJ3QgYmUgc2VlbiBoZXJlIik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgaWYgKHN0cmluZ192YWxpZGF0aW9uX2Z1bmMpCisgICAgeworICAgICAgZGJ1c191aW50MzJfdCBsZW47CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoYmFkX3N0cmluZ19jb2RlICE9IERCVVNfVkFMSUQpOworCisgICAgICBsZW4gPSBfZGJ1c19tYXJzaGFsX3JlYWRfdWludDMyICh2YWx1ZV9zdHIsIHZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2hlYWRlcl9nZXRfYnl0ZV9vcmRlciAoaGVhZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisjaWYgMAorICAgICAgX2RidXNfdmVyYm9zZSAoIlZhbGlkYXRpbmcgc3RyaW5nIGhlYWRlciBmaWVsZDsgY29kZSAlZCBpZiBmYWlsc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIGJhZF9zdHJpbmdfY29kZSk7CisjZW5kaWYKKyAgICAgIGlmICghKCpzdHJpbmdfdmFsaWRhdGlvbl9mdW5jKSAodmFsdWVfc3RyLCBzdHJfZGF0YV9wb3MsIGxlbikpCisgICAgICAgIHJldHVybiBiYWRfc3RyaW5nX2NvZGU7CisgICAgfQorCisgIHJldHVybiBEQlVTX1ZBTElEOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBtZXNzYWdlIGhlYWRlciBmcm9tIHBvdGVudGlhbGx5LXVudHJ1c3RlZCBkYXRhLiBUaGUKKyAqIHJldHVybiB2YWx1ZSBpcyAjVFJVRSBpZiB0aGVyZSB3YXMgZW5vdWdoIG1lbW9yeSBhbmQgdGhlIGRhdGEgd2FzCisgKiB2YWxpZC4gSWYgaXQgcmV0dXJucyAjVFJVRSwgdGhlIGhlYWRlciB3aWxsIGJlIGNyZWF0ZWQuIElmIGl0CisgKiByZXR1cm5zICNGQUxTRSBhbmQgKnZhbGlkaXR5ID09ICNEQlVTX1ZBTElESVRZX1VOS05PV05fT09NX0VSUk9SLCAKKyAqIHRoZW4gdGhlcmUgd2Fzbid0IGVub3VnaCBtZW1vcnkuICBJZiBpdCByZXR1cm5zICNGQUxTRSAKKyAqIGFuZCAqdmFsaWRpdHkgIT0gI0RCVVNfVkFMSURJVFlfVU5LTk9XTl9PT01fRVJST1IgdGhlbiB0aGUgZGF0YSB3YXMgCisgKiBpbnZhbGlkLgorICoKKyAqIFRoZSBieXRlX29yZGVyLCBmaWVsZHNfYXJyYXlfbGVuLCBhbmQgYm9keV9sZW4gYXJncyBzaG91bGQgYmUgZnJvbQorICogX2RidXNfaGVhZGVyX2hhdmVfbWVzc2FnZV91bnRydXN0ZWQoKS4gVmFsaWRhdGlvbiBwZXJmb3JtZWQgaW4KKyAqIF9kYnVzX2hlYWRlcl9oYXZlX21lc3NhZ2VfdW50cnVzdGVkKCkgaXMgYXNzdW1lZCB0byBoYXZlIGJlZW4KKyAqIGFscmVhZHkgZG9uZS4KKyAqCisgKiBAcGFyYW0gaGVhZGVyIHRoZSBoZWFkZXIgKG11c3QgYmUgaW5pdGlhbGl6ZWQpCisgKiBAcGFyYW0gbW9kZSB3aGV0aGVyIHRvIGRvIHZhbGlkYXRpb24KKyAqIEBwYXJhbSB2YWxpZGl0eSByZXR1cm4gbG9jYXRpb24gZm9yIGludmFsaWRpdHkgcmVhc29uCisgKiBAcGFyYW0gYnl0ZV9vcmRlciBieXRlIG9yZGVyIGZyb20gaGVhZGVyCisgKiBAcGFyYW0gZmllbGRzX2FycmF5X2xlbiBjbGFpbWVkIGxlbmd0aCBvZiBmaWVsZHMgYXJyYXkKKyAqIEBwYXJhbSBib2R5X2xlbiBjbGFpbWVkIGxlbmd0aCBvZiBib2R5CisgKiBAcGFyYW0gaGVhZGVyX2xlbiBjbGFpbWVkIGxlbmd0aCBvZiBoZWFkZXIKKyAqIEBwYXJhbSBzdHIgYSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCBzdGFydCBvZiBoZWFkZXIsIDgtYWxpZ25lZAorICogQHBhcmFtIGxlbiBsZW5ndGggb2Ygc3RyaW5nIHRvIGxvb2sgYXQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkgb3IgZGF0YSB3YXMgaW52YWxpZCwgI1RSVUUgb3RoZXJ3aXNlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oZWFkZXJfbG9hZCAoREJ1c0hlYWRlciAgICAgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRhdGlvbk1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAqdmFsaWRpdHksCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGZpZWxkc19hcnJheV9sZW4sCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGhlYWRlcl9sZW4sCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGJvZHlfbGVuLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pCit7CisgIGludCBsZWZ0b3ZlcjsKKyAgREJ1c1ZhbGlkaXR5IHY7CisgIERCdXNUeXBlUmVhZGVyIHJlYWRlcjsKKyAgREJ1c1R5cGVSZWFkZXIgYXJyYXlfcmVhZGVyOworICB1bnNpZ25lZCBjaGFyIHZfYnl0ZTsKKyAgZGJ1c191aW50MzJfdCB2X3VpbnQzMjsKKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisgIGludCBwYWRkaW5nX3N0YXJ0OworICBpbnQgcGFkZGluZ19sZW47CisgIGludCBpOworCisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPT0gKGludCkgX0RCVVNfQUxJR05fVkFMVUUgKHN0YXJ0LCA4KSk7CisgIF9kYnVzX2Fzc2VydCAoaGVhZGVyX2xlbiA8PSBsZW4pOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmaGVhZGVyLT5kYXRhKSA9PSAwKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoc3RyLCBzdGFydCwgaGVhZGVyX2xlbiwgJmhlYWRlci0+ZGF0YSwgMCkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBjb3B5IGJ1ZmZlciBpbnRvIG5ldyBoZWFkZXJcbiIpOworICAgICAgKnZhbGlkaXR5ID0gREJVU19WQUxJRElUWV9VTktOT1dOX09PTV9FUlJPUjsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKG1vZGUgPT0gREJVU19WQUxJREFUSU9OX01PREVfV0VfVFJVU1RfVEhJU19EQVRBX0FCU09MVVRFTFkpCisgICAgeworICAgICAgbGVmdG92ZXIgPSBsZW4gLSBoZWFkZXJfbGVuIC0gYm9keV9sZW4gLSBzdGFydDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB2ID0gX2RidXNfdmFsaWRhdGVfYm9keV93aXRoX3JlYXNvbiAoJl9kYnVzX2hlYWRlcl9zaWduYXR1cmVfc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlZnRvdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciwgc3RhcnQsIGxlbik7CisgICAgICAKKyAgICAgIGlmICh2ICE9IERCVVNfVkFMSUQpCisgICAgICAgIHsKKyAgICAgICAgICAqdmFsaWRpdHkgPSB2OworICAgICAgICAgIGdvdG8gaW52YWxpZDsKKyAgICAgICAgfQorICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGxlZnRvdmVyIDwgbGVuKTsKKworICBwYWRkaW5nX2xlbiA9IGhlYWRlcl9sZW4gLSAoRklSU1RfRklFTERfT0ZGU0VUICsgZmllbGRzX2FycmF5X2xlbik7CisgIHBhZGRpbmdfc3RhcnQgPSBzdGFydCArIEZJUlNUX0ZJRUxEX09GRlNFVCArIGZpZWxkc19hcnJheV9sZW47CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgKyBoZWFkZXJfbGVuID09IChpbnQpIF9EQlVTX0FMSUdOX1ZBTFVFIChwYWRkaW5nX3N0YXJ0LCA4KSk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgKyBoZWFkZXJfbGVuID09IHBhZGRpbmdfc3RhcnQgKyBwYWRkaW5nX2xlbik7CisKKyAgaWYgKG1vZGUgIT0gREJVU19WQUxJREFUSU9OX01PREVfV0VfVFJVU1RfVEhJU19EQVRBX0FCU09MVVRFTFkpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfdmFsaWRhdGVfbnVsIChzdHIsIHBhZGRpbmdfc3RhcnQsIHBhZGRpbmdfbGVuKSkKKyAgICAgICAgeworICAgICAgICAgICp2YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9BTElHTk1FTlRfUEFERElOR19OT1RfTlVMOworICAgICAgICAgIGdvdG8gaW52YWxpZDsKKyAgICAgICAgfQorICAgIH0KKworICBoZWFkZXItPnBhZGRpbmcgPSBwYWRkaW5nX2xlbjsKKworICBpZiAobW9kZSA9PSBEQlVTX1ZBTElEQVRJT05fTU9ERV9XRV9UUlVTVF9USElTX0RBVEFfQUJTT0xVVEVMWSkKKyAgICB7CisgICAgICAqdmFsaWRpdHkgPSBEQlVTX1ZBTElEOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIC8qIFdlIG5vdyBrbm93IHRoZSBkYXRhIGlzIHdlbGwtZm9ybWVkLCBidXQgd2UgaGF2ZSB0byBjaGVjayB0aGF0CisgICAqIGl0J3MgdmFsaWQuCisgICAqLworCisgIF9kYnVzX3R5cGVfcmVhZGVyX2luaXQgKCZyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZfZGJ1c19oZWFkZXJfc2lnbmF0dXJlX3N0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLCBzdGFydCk7CisKKyAgLyogQllURSBPUkRFUiAqLworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZyZWFkZXIpID09IERCVVNfVFlQRV9CWVRFKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfdmFsdWVfcG9zICgmcmVhZGVyKSA9PSBCWVRFX09SREVSX09GRlNFVCk7CisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKCZyZWFkZXIsICZ2X2J5dGUpOworICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmcmVhZGVyKTsKKworICBfZGJ1c19hc3NlcnQgKHZfYnl0ZSA9PSBieXRlX29yZGVyKTsKKworICAvKiBNRVNTQUdFIFRZUEUgKi8KKyAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmcmVhZGVyKSA9PSBEQlVTX1RZUEVfQllURSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X3ZhbHVlX3BvcyAoJnJlYWRlcikgPT0gVFlQRV9PRkZTRVQpOworICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljICgmcmVhZGVyLCAmdl9ieXRlKTsKKyAgX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoJnJlYWRlcik7CisKKyAgLyogdW5rbm93biBtZXNzYWdlIHR5cGVzIGFyZSBzdXBwb3NlZCB0byBiZSBpZ25vcmVkLCBzbyBvbmx5IHZhbGlkYXRpb24gaGVyZSBpcworICAgKiB0aGF0IGl0IGlzbid0IGludmFsaWQKKyAgICovCisgIGlmICh2X2J5dGUgPT0gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCkKKyAgICB7CisgICAgICAqdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfQkFEX01FU1NBR0VfVFlQRTsKKyAgICAgIGdvdG8gaW52YWxpZDsKKyAgICB9CisKKyAgLyogRkxBR1MgKi8KKyAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmcmVhZGVyKSA9PSBEQlVTX1RZUEVfQllURSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X3ZhbHVlX3BvcyAoJnJlYWRlcikgPT0gRkxBR1NfT0ZGU0VUKTsKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAoJnJlYWRlciwgJnZfYnl0ZSk7CisgIF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZyZWFkZXIpOworCisgIC8qIHVua25vd24gZmxhZ3Mgc2hvdWxkIGJlIGlnbm9yZWQgKi8KKworICAvKiBQUk9UT0NPTCBWRVJTSU9OICovCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnJlYWRlcikgPT0gREJVU19UWVBFX0JZVEUpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF92YWx1ZV9wb3MgKCZyZWFkZXIpID09IFZFUlNJT05fT0ZGU0VUKTsKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAoJnJlYWRlciwgJnZfYnl0ZSk7CisgIF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZyZWFkZXIpOworCisgIGlmICh2X2J5dGUgIT0gREJVU19NQUpPUl9QUk9UT0NPTF9WRVJTSU9OKQorICAgIHsKKyAgICAgICp2YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9CQURfUFJPVE9DT0xfVkVSU0lPTjsKKyAgICAgIGdvdG8gaW52YWxpZDsKKyAgICB9CisKKyAgLyogQk9EWSBMRU5HVEggKi8KKyAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmcmVhZGVyKSA9PSBEQlVTX1RZUEVfVUlOVDMyKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfdmFsdWVfcG9zICgmcmVhZGVyKSA9PSBCT0RZX0xFTkdUSF9PRkZTRVQpOworICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljICgmcmVhZGVyLCAmdl91aW50MzIpOworICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmcmVhZGVyKTsKKworICBfZGJ1c19hc3NlcnQgKGJvZHlfbGVuID09IChzaWduZWQpIHZfdWludDMyKTsKKworICAvKiBTRVJJQUwgKi8KKyAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmcmVhZGVyKSA9PSBEQlVTX1RZUEVfVUlOVDMyKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfdmFsdWVfcG9zICgmcmVhZGVyKSA9PSBTRVJJQUxfT0ZGU0VUKTsKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAoJnJlYWRlciwgJnNlcmlhbCk7CisgIF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZyZWFkZXIpOworCisgIGlmIChzZXJpYWwgPT0gMCkKKyAgICB7CisgICAgICAqdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfQkFEX1NFUklBTDsKKyAgICAgIGdvdG8gaW52YWxpZDsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmcmVhZGVyKSA9PSBEQlVTX1RZUEVfQVJSQVkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF92YWx1ZV9wb3MgKCZyZWFkZXIpID09IEZJRUxEU19BUlJBWV9MRU5HVEhfT0ZGU0VUKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlICgmcmVhZGVyLCAmYXJyYXlfcmVhZGVyKTsKKyAgd2hpbGUgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZhcnJheV9yZWFkZXIpICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgIHsKKyAgICAgIERCdXNUeXBlUmVhZGVyIHN0cnVjdF9yZWFkZXI7CisgICAgICBEQnVzVHlwZVJlYWRlciB2YXJpYW50X3JlYWRlcjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgZmllbGRfY29kZTsKKworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmYXJyYXlfcmVhZGVyKSA9PSBEQlVTX1RZUEVfU1RSVUNUKTsKKworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAoJmFycmF5X3JlYWRlciwgJnN0cnVjdF9yZWFkZXIpOworCisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZzdHJ1Y3RfcmVhZGVyKSA9PSBEQlVTX1RZUEVfQllURSk7CisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljICgmc3RydWN0X3JlYWRlciwgJmZpZWxkX2NvZGUpOworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoJnN0cnVjdF9yZWFkZXIpOworCisgICAgICBpZiAoZmllbGRfY29kZSA9PSBEQlVTX0hFQURFUl9GSUVMRF9JTlZBTElEKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoImludmFsaWQgaGVhZGVyIGZpZWxkIGNvZGVcbiIpOworICAgICAgICAgICp2YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9IRUFERVJfRklFTERfQ09ERTsKKyAgICAgICAgICBnb3RvIGludmFsaWQ7CisgICAgICAgIH0KKworICAgICAgaWYgKGZpZWxkX2NvZGUgPiBEQlVTX0hFQURFUl9GSUVMRF9MQVNUKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInVua25vd24gaGVhZGVyIGZpZWxkIGNvZGUgJWQsIHNraXBwaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2NvZGUpOworICAgICAgICAgIGdvdG8gbmV4dF9maWVsZDsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZzdHJ1Y3RfcmVhZGVyKSA9PSBEQlVTX1RZUEVfVkFSSUFOVCk7CisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlICgmc3RydWN0X3JlYWRlciwgJnZhcmlhbnRfcmVhZGVyKTsKKworICAgICAgdiA9IGxvYWRfYW5kX3ZhbGlkYXRlX2ZpZWxkIChoZWFkZXIsIGZpZWxkX2NvZGUsICZ2YXJpYW50X3JlYWRlcik7CisgICAgICBpZiAodiAhPSBEQlVTX1ZBTElEKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZpZWxkICVkIHdhcyBpbnZhbGlkXG4iLCBmaWVsZF9jb2RlKTsKKyAgICAgICAgICAqdmFsaWRpdHkgPSB2OworICAgICAgICAgIGdvdG8gaW52YWxpZDsKKyAgICAgICAgfQorCisgICAgbmV4dF9maWVsZDoKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZhcnJheV9yZWFkZXIpOworICAgIH0KKworICAvKiBBbnl0aGluZyB3ZSBkaWRuJ3QgZmlsbCBpbiBpcyBub3cga25vd24gbm90IHRvIGV4aXN0ICovCisgIGkgPSAwOworICB3aGlsZSAoaSA8PSBEQlVTX0hFQURFUl9GSUVMRF9MQVNUKQorICAgIHsKKyAgICAgIGlmIChoZWFkZXItPmZpZWxkc1tpXS52YWx1ZV9wb3MgPT0gX0RCVVNfSEVBREVSX0ZJRUxEX1ZBTFVFX1VOS05PV04pCisgICAgICAgIGhlYWRlci0+ZmllbGRzW2ldLnZhbHVlX3BvcyA9IF9EQlVTX0hFQURFUl9GSUVMRF9WQUxVRV9OT05FWElTVEVOVDsKKyAgICAgICsraTsKKyAgICB9CisKKyAgdiA9IGNoZWNrX21hbmRhdG9yeV9maWVsZHMgKGhlYWRlcik7CisgIGlmICh2ICE9IERCVVNfVkFMSUQpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIk1hbmRhdG9yeSBmaWVsZHMgd2VyZSBtaXNzaW5nLCBjb2RlICVkXG4iLCB2KTsKKyAgICAgICp2YWxpZGl0eSA9IHY7CisgICAgICBnb3RvIGludmFsaWQ7CisgICAgfQorCisgICp2YWxpZGl0eSA9IERCVVNfVkFMSUQ7CisgIHJldHVybiBUUlVFOworCisgaW52YWxpZDoKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZoZWFkZXItPmRhdGEsIDApOworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogRmlsbHMgaW4gdGhlIGNvcnJlY3QgYm9keSBsZW5ndGguCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyCisgKiBAcGFyYW0gYm9keV9sZW4gdGhlIGxlbmd0aCBvZiB0aGUgYm9keQorICovCit2b2lkCitfZGJ1c19oZWFkZXJfdXBkYXRlX2xlbmd0aHMgKERCdXNIZWFkZXIgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgYm9keV9sZW4pCit7CisgIF9kYnVzX21hcnNoYWxfc2V0X3VpbnQzMiAoJmhlYWRlci0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX0xFTkdUSF9PRkZTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfaGVhZGVyX2dldF9ieXRlX29yZGVyIChoZWFkZXIpKTsKK30KKworLyoqCisgKiBUcnkgdG8gZmluZCB0aGUgZ2l2ZW4gZmllbGQuCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyCisgKiBAcGFyYW0gZmllbGQgdGhlIGZpZWxkIGNvZGUKKyAqIEBwYXJhbSByZWFkZXIgYSB0eXBlIHJlYWRlcjsgb24gc3VjY2VzcyB0aGlzIGlzIGxlZnQgcG9pbnRpbmcgYXQgdGhlIHN0cnVjdAorICogICh1dikgZm9yIHRoZSBmaWVsZCwgd2hpbGUgb24gZmFpbHVyZSBpdCBpcyBsZWZ0IHBvaW50aW5nIGludG8gZW1wdHkgc3BhY2UKKyAqICBhdCB0aGUgZW5kIG9mIHRoZSBoZWFkZXIgZmllbGRzCisgKiBAcGFyYW0gcmVhbGlnbl9yb290IGFub3RoZXIgdHlwZSByZWFkZXI7IG9uIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBpdCBpcyBsZWZ0CisgKiAgcG9pbnRpbmcgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkgb2YgZmllbGRzIChpLmUuIHRoZSB0aGluZyB0aGF0IG1pZ2h0CisgKiAgbmVlZCByZWFsaWduaW5nKQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2ZpbmRfZmllbGRfZm9yX21vZGlmaWNhdGlvbiAoREJ1c0hlYWRlciAgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290KQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfaW5pdCAocmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19oZWFkZXJfZ2V0X2J5dGVfb3JkZXIgKGhlYWRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZfZGJ1c19oZWFkZXJfc2lnbmF0dXJlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklFTERTX0FSUkFZX1NJR05BVFVSRV9PRkZTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWFkZXItPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJRUxEU19BUlJBWV9MRU5HVEhfT0ZGU0VUKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlIChyZWFsaWduX3Jvb3QsIHJlYWRlcik7CisKKyAgd2hpbGUgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKHJlYWRlcikgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgeworICAgICAgREJ1c1R5cGVSZWFkZXIgc3ViOworICAgICAgdW5zaWduZWQgY2hhciBmaWVsZF9jb2RlOworCisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlIChyZWFkZXIsICZzdWIpOworCisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZzdWIpID09IERCVVNfVFlQRV9CWVRFKTsKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKCZzdWIsICZmaWVsZF9jb2RlKTsKKworICAgICAgaWYgKGZpZWxkX2NvZGUgPT0gKHVuc2lnbmVkKSBmaWVsZCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAocmVhZGVyKSA9PSBEQlVTX1RZUEVfU1RSVUNUKTsKKyAgICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0IChyZWFkZXIpOworICAgIH0KKworIGRvbmU6CisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogU2V0cyB0aGUgdmFsdWUgb2YgYSBmaWVsZCB3aXRoIGJhc2ljIHR5cGUuIElmIHRoZSB2YWx1ZSBpcyBhIHN0cmluZworICogdmFsdWUsIGl0IGlzbid0IGFsbG93ZWQgdG8gYmUgI05VTEwuIElmIHRoZSBmaWVsZCBkb2Vzbid0IGV4aXN0LAorICogaXQgd2lsbCBiZSBjcmVhdGVkLgorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlcgorICogQHBhcmFtIGZpZWxkIHRoZSBmaWVsZCB0byBzZXQKKyAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZQorICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBhcyBmb3IgX2RidXNfbWFyc2hhbF9zZXRfYmFzaWMoKQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGVhZGVyX3NldF9maWVsZF9iYXNpYyAoREJ1c0hlYWRlciAgICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAgICAgICAqdmFsdWUpCit7CisgIF9kYnVzX2Fzc2VydCAoZmllbGQgPD0gREJVU19IRUFERVJfRklFTERfTEFTVCk7CisKKyAgaWYgKCFyZXNlcnZlX2hlYWRlcl9wYWRkaW5nIChoZWFkZXIpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBJZiB0aGUgZmllbGQgZXhpc3RzIHdlIHNldCwgb3RoZXJ3aXNlIHdlIGFwcGVuZCAqLworICBpZiAoX2RidXNfaGVhZGVyX2NhY2hlX2NoZWNrIChoZWFkZXIsIGZpZWxkKSkKKyAgICB7CisgICAgICBEQnVzVHlwZVJlYWRlciByZWFkZXI7CisgICAgICBEQnVzVHlwZVJlYWRlciByZWFsaWduX3Jvb3Q7CisKKyAgICAgIGlmICghZmluZF9maWVsZF9mb3JfbW9kaWZpY2F0aW9uIChoZWFkZXIsIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFkZXIsICZyZWFsaWduX3Jvb3QpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmaWVsZCB3YXMgbWFya2VkIHByZXNlbnQgaW4gY2FjaGUgYnV0IHdhc24ndCBmb3VuZCIpOworCisgICAgICBpZiAoIXNldF9iYXNpY19maWVsZCAoJnJlYWRlciwgZmllbGQsIHR5cGUsIHZhbHVlLCAmcmVhbGlnbl9yb290KSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIERCdXNUeXBlV3JpdGVyIHdyaXRlcjsKKyAgICAgIERCdXNUeXBlV3JpdGVyIGFycmF5OworCisgICAgICBfZGJ1c190eXBlX3dyaXRlcl9pbml0X3ZhbHVlc19vbmx5ICgmd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfaGVhZGVyX2dldF9ieXRlX29yZGVyIChoZWFkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9kYnVzX2hlYWRlcl9zaWduYXR1cmVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklFTERTX0FSUkFZX1NJR05BVFVSRV9PRkZTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVhZGVyLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklFTERTX0FSUkFZX0xFTkdUSF9PRkZTRVQpOworCisgICAgICAvKiByZWN1cnNlIGludG8gYXJyYXkgd2l0aG91dCBjcmVhdGluZyBhIG5ldyBsZW5ndGgsIGFuZCBqdW1wIHRvCisgICAgICAgKiBlbmQgb2YgYXJyYXkuCisgICAgICAgKi8KKyAgICAgIGlmICghX2RidXNfdHlwZV93cml0ZXJfYXBwZW5kX2FycmF5ICgmd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfZGJ1c19oZWFkZXJfc2lnbmF0dXJlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUVMRFNfQVJSQVlfRUxFTUVOVF9TSUdOQVRVUkVfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhcnJheSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInJlY3Vyc2UgaW50byBBUlJBWSBzaG91bGQgbm90IGhhdmUgdXNlZCBtZW1vcnkiKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChhcnJheS51LmFycmF5Lmxlbl9wb3MgPT0gRklFTERTX0FSUkFZX0xFTkdUSF9PRkZTRVQpOworICAgICAgX2RidXNfYXNzZXJ0IChhcnJheS51LmFycmF5LnN0YXJ0X3BvcyA9PSBGSVJTVF9GSUVMRF9PRkZTRVQpOworICAgICAgX2RidXNfYXNzZXJ0IChhcnJheS52YWx1ZV9wb3MgPT0gSEVBREVSX0VORF9CRUZPUkVfUEFERElORyAoaGVhZGVyKSk7CisKKyAgICAgIGlmICghd3JpdGVfYmFzaWNfZmllbGQgKCZhcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLCB0eXBlLCB2YWx1ZSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl91bnJlY3Vyc2UgKCZ3cml0ZXIsICZhcnJheSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInVucmVjdXJzZSBmcm9tIEFSUkFZIHNob3VsZCBub3QgaGF2ZSB1c2VkIG1lbW9yeSIpOworICAgIH0KKworICBjb3JyZWN0X2hlYWRlcl9wYWRkaW5nIChoZWFkZXIpOworCisgIC8qIFdlIGNvdWxkIGJlIHNtYXJ0ZXIgYWJvdXQgdGhpcyAob25seSBpbnZhbGlkYXRlIGZpZWxkcyBhZnRlciB0aGUKKyAgICogb25lIHdlIG1vZGlmaWVkLCBvciBldmVuIG9ubHkgaWYgdGhlIG9uZSB3ZSBtb2RpZmllZCBjaGFuZ2VkCisgICAqIGxlbmd0aCkuIEJ1dCB0aGlzIGhhY2sgaXMgYSBzdGFydC4KKyAgICovCisgIF9kYnVzX2hlYWRlcl9jYWNoZV9pbnZhbGlkYXRlX2FsbCAoaGVhZGVyKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGZpZWxkIHdpdGggYmFzaWMgdHlwZS4gSWYgdGhlIGZpZWxkCisgKiBkb2Vzbid0IGV4aXN0LCByZXR1cm5zICNGQUxTRSwgb3RoZXJ3aXNlIHJldHVybnMgI1RSVUUuCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyCisgKiBAcGFyYW0gZmllbGQgdGhlIGZpZWxkIHRvIGdldAorICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIHZhbHVlCisgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIGFzIGZvciBfZGJ1c19tYXJzaGFsX3JlYWRfYmFzaWMoKQorICogQHJldHVybnMgI0ZBTFNFIGlmIHRoZSBmaWVsZCBkb2Vzbid0IGV4aXN0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX2Jhc2ljIChEQnVzSGVhZGVyICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICp2YWx1ZSkKK3sKKyAgX2RidXNfYXNzZXJ0IChmaWVsZCAhPSBEQlVTX0hFQURFUl9GSUVMRF9JTlZBTElEKTsKKyAgX2RidXNfYXNzZXJ0IChmaWVsZCA8PSBEQlVTX0hFQURFUl9GSUVMRF9MQVNUKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19oZWFkZXJfZmllbGRfdHlwZXNbZmllbGRdLmNvZGUgPT0gZmllbGQpOworICAvKiBpbiBsaWdodCBvZiB0aGlzIHlvdSBtaWdodCBhc2sgd2h5IHRoZSB0eXBlIGlzIHBhc3NlZCBpbjsKKyAgICogdGhlIG9ubHkgcmF0aW9uYWxlIEkgY2FuIHRoaW5rIG9mIGlzIHNvIHRoZSBjYWxsZXIgaGFzCisgICAqIHRvIHNwZWNpZnkgaXRzIGV4cGVjdGF0aW9uIGFuZCBicmVha3MgaWYgd2UgY2hhbmdlIGl0CisgICAqLworICBfZGJ1c19hc3NlcnQgKHR5cGUgPT0gRVhQRUNURURfVFlQRV9PRl9GSUVMRCAoZmllbGQpKTsKKworICBpZiAoIV9kYnVzX2hlYWRlcl9jYWNoZV9jaGVjayAoaGVhZGVyLCBmaWVsZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX2Fzc2VydCAoaGVhZGVyLT5maWVsZHNbZmllbGRdLnZhbHVlX3BvcyA+PSAwKTsKKworICBfZGJ1c19tYXJzaGFsX3JlYWRfYmFzaWMgKCZoZWFkZXItPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLT5maWVsZHNbZmllbGRdLnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCB2YWx1ZSwgX2RidXNfaGVhZGVyX2dldF9ieXRlX29yZGVyIChoZWFkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEdldHMgdGhlIHJhdyBtYXJzaGFsZWQgZGF0YSBmb3IgYSBmaWVsZC4gSWYgdGhlIGZpZWxkIGRvZXNuJ3QKKyAqIGV4aXN0LCByZXR1cm5zICNGQUxTRSwgb3RoZXJ3aXNlIHJldHVybnMgI1RSVUUuICBSZXR1cm5zIHRoZSBzdGFydAorICogb2YgdGhlIG1hcnNoYWxlZCBkYXRhLCBpLmUuIHVzdWFsbHkgdGhlIGJ5dGUgd2hlcmUgdGhlIGxlbmd0aAorICogc3RhcnRzIChmb3Igc3RyaW5ncyBhbmQgYXJyYXlzKSBvciBmb3IgYmFzaWMgdHlwZXMganVzdCB0aGUgdmFsdWUKKyAqIGl0c2VsZi4KKyAqCisgKiBAcGFyYW0gaGVhZGVyIHRoZSBoZWFkZXIKKyAqIEBwYXJhbSBmaWVsZCB0aGUgZmllbGQgdG8gZ2V0CisgKiBAcGFyYW0gc3RyIHJldHVybiBsb2NhdGlvbiBmb3IgdGhlIGRhdGEgc3RyaW5nCisgKiBAcGFyYW0gcG9zIHJldHVybiBsb2NhdGlvbiBmb3Igc3RhcnQgb2YgZmllbGQgdmFsdWUKKyAqIEByZXR1cm5zICNGQUxTRSBpZiB0aGUgZmllbGQgZG9lc24ndCBleGlzdAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGVhZGVyX2dldF9maWVsZF9yYXcgKERCdXNIZWFkZXIgICAgICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKipzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKnBvcykKK3sKKyAgaWYgKCFfZGJ1c19oZWFkZXJfY2FjaGVfY2hlY2sgKGhlYWRlciwgZmllbGQpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoc3RyKQorICAgICpzdHIgPSAmaGVhZGVyLT5kYXRhOworICBpZiAocG9zKQorICAgICpwb3MgPSBoZWFkZXItPmZpZWxkc1tmaWVsZF0udmFsdWVfcG9zOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIERlbGV0ZXMgYSBmaWVsZCwgaWYgaXQgZXhpc3RzLgorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlcgorICogQHBhcmFtIGZpZWxkIHRoZSBmaWVsZCB0byBkZWxldGUKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2hlYWRlcl9kZWxldGVfZmllbGQgKERCdXNIZWFkZXIgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGZpZWxkKQoreworICBEQnVzVHlwZVJlYWRlciByZWFkZXI7CisgIERCdXNUeXBlUmVhZGVyIHJlYWxpZ25fcm9vdDsKKworICBpZiAoX2RidXNfaGVhZGVyX2NhY2hlX2tub3duX25vbmV4aXN0ZW50IChoZWFkZXIsIGZpZWxkKSkKKyAgICByZXR1cm4gVFJVRTsgLyogbm90aGluZyB0byBkbyAqLworCisgIC8qIFNjYW4gdG8gdGhlIGZpZWxkIHdlIHdhbnQsIGRlbGV0ZSBhbmQgcmVhbGlnbiwgcmVhcHBlbmQKKyAgICogcGFkZGluZy4gRmllbGQgbWF5IHR1cm4gb3V0IG5vdCB0byBleGlzdC4KKyAgICovCisgIGlmICghZmluZF9maWVsZF9mb3JfbW9kaWZpY2F0aW9uIChoZWFkZXIsIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWRlciwgJnJlYWxpZ25fcm9vdCkpCisgICAgcmV0dXJuIFRSVUU7IC8qIG5vdGhpbmcgdG8gZG8gKi8KKworICBpZiAoIXJlc2VydmVfaGVhZGVyX3BhZGRpbmcgKGhlYWRlcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfdHlwZV9yZWFkZXJfZGVsZXRlICgmcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWxpZ25fcm9vdCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGNvcnJlY3RfaGVhZGVyX3BhZGRpbmcgKGhlYWRlcik7CisKKyAgX2RidXNfaGVhZGVyX2NhY2hlX2ludmFsaWRhdGVfYWxsIChoZWFkZXIpOworCisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2hlYWRlcl9jYWNoZV9jaGVjayAoaGVhZGVyLCBmaWVsZCkpOyAvKiBFeHBlbnNpdmUgYXNzZXJ0aW9uIC4uLiAqLworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFRvZ2dsZXMgYSBtZXNzYWdlIGZsYWcgYml0LCB0dXJuaW5nIG9uIHRoZSBiaXQgaWYgdmFsdWUgPSBUUlVFIGFuZAorICogZmxpcHBpbmcgaXQgb2ZmIGlmIHZhbHVlID0gRkFMU0UuCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyCisgKiBAcGFyYW0gZmxhZyB0aGUgbWVzc2FnZSBmbGFnIHRvIHRvZ2dsZQorICogQHBhcmFtIHZhbHVlIHRvZ2dsZSBvbiBvciBvZmYKKyAqLwordm9pZAorX2RidXNfaGVhZGVyX3RvZ2dsZV9mbGFnIChEQnVzSGVhZGVyICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCBmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgIHZhbHVlKQoreworICB1bnNpZ25lZCBjaGFyICpmbGFnc19wOworCisgIGZsYWdzX3AgPSBfZGJ1c19zdHJpbmdfZ2V0X2RhdGFfbGVuICgmaGVhZGVyLT5kYXRhLCBGTEFHU19PRkZTRVQsIDEpOworCisgIGlmICh2YWx1ZSkKKyAgICAqZmxhZ3NfcCB8PSBmbGFnOworICBlbHNlCisgICAgKmZsYWdzX3AgJj0gfmZsYWc7Cit9CisKKy8qKgorICogR2V0cyBhIG1lc3NhZ2UgZmxhZyBiaXQsIHJldHVybmluZyBUUlVFIGlmIHRoZSBiaXQgaXMgc2V0LgorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlcgorICogQHBhcmFtIGZsYWcgdGhlIG1lc3NhZ2UgZmxhZyB0byBnZXQKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBmbGFnIGlzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGVhZGVyX2dldF9mbGFnIChEQnVzSGVhZGVyICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCBmbGFnKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpmbGFnc19wOworCisgIGZsYWdzX3AgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuICgmaGVhZGVyLT5kYXRhLCBGTEFHU19PRkZTRVQsIDEpOworCisgIHJldHVybiAoKmZsYWdzX3AgJiBmbGFnKSAhPSAwOworfQorCisvKioKKyAqIFN3YXBzIHRoZSBoZWFkZXIgaW50byB0aGUgZ2l2ZW4gb3JkZXIgaWYgcmVxdWlyZWQuCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyCisgKiBAcGFyYW0gbmV3X29yZGVyIHRoZSBuZXcgYnl0ZSBvcmRlcgorICovCit2b2lkCitfZGJ1c19oZWFkZXJfYnl0ZXN3YXAgKERCdXNIZWFkZXIgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbmV3X29yZGVyKQoreworICBjaGFyIGJ5dGVfb3JkZXI7CisKKyAgYnl0ZV9vcmRlciA9IF9kYnVzX2hlYWRlcl9nZXRfYnl0ZV9vcmRlciAoaGVhZGVyKTsKKworICBpZiAoYnl0ZV9vcmRlciA9PSBuZXdfb3JkZXIpCisgICAgcmV0dXJuOworCisgIF9kYnVzX21hcnNoYWxfYnl0ZXN3YXAgKCZfZGJ1c19oZWFkZXJfc2lnbmF0dXJlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVhZGVyLT5kYXRhLCAwKTsKKworICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKCZoZWFkZXItPmRhdGEsIEJZVEVfT1JERVJfT0ZGU0VULCBuZXdfb3JkZXIpOworfQorCisvKiogQH0gKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLW1hcnNoYWwtaGVhZGVyLmggYi9kYnVzL2RidXMvZGJ1cy1tYXJzaGFsLWhlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MGZlNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1tYXJzaGFsLWhlYWRlci5oCkBAIC0wLDAgKzEsMTI4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWFyc2hhbC1oZWFkZXIuaCAgTWFuYWdpbmcgbWFyc2hhbGluZy9kZW1hcnNoYWxpbmcgb2YgbWVzc2FnZSBoZWFkZXJzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1ICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfTUFSU0hBTF9IRUFERVJfSAorI2RlZmluZSBEQlVTX01BUlNIQUxfSEVBREVSX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tYXJzaGFsLWJhc2ljLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hcnNoYWwtdmFsaWRhdGUuaD4KKwordHlwZWRlZiBzdHJ1Y3QgREJ1c0hlYWRlciAgICAgIERCdXNIZWFkZXI7Cit0eXBlZGVmIHN0cnVjdCBEQnVzSGVhZGVyRmllbGQgREJ1c0hlYWRlckZpZWxkOworCisjZGVmaW5lIF9EQlVTX0hFQURFUl9GSUVMRF9WQUxVRV9VTktOT1dOIC0xCisjZGVmaW5lIF9EQlVTX0hFQURFUl9GSUVMRF9WQUxVRV9OT05FWElTVEVOVCAtMgorCisvKioKKyAqIENhY2hlZCBpbmZvcm1hdGlvbiBhYm91dCBhIGhlYWRlciBmaWVsZCBpbiB0aGUgbWVzc2FnZQorICovCitzdHJ1Y3QgREJ1c0hlYWRlckZpZWxkCit7CisgIGludCAgICAgICAgICAgIHZhbHVlX3BvczsgLyoqPCBQb3NpdGlvbiBvZiBmaWVsZCB2YWx1ZSwgb3IgLTEvLTIgKi8KK307CisKKy8qKgorICogTWVzc2FnZSBoZWFkZXIgZGF0YSBhbmQgc29tZSBjYWNoZWQgZGV0YWlscyBvZiBpdC4KKyAqLworc3RydWN0IERCdXNIZWFkZXIKK3sKKyAgREJ1c1N0cmluZyBkYXRhOyAvKio8IEhlYWRlciBuZXR3b3JrIGRhdGEsIHN0b3JlZAorICAgICAgICAgICAgICAgICAgICAqIHNlcGFyYXRlbHkgZnJvbSBib2R5IHNvIHdlIGNhbgorICAgICAgICAgICAgICAgICAgICAqIGluZGVwZW5kZW50bHkgcmVhbGxvYyBpdC4KKyAgICAgICAgICAgICAgICAgICAgKi8KKworICBEQnVzSGVhZGVyRmllbGQgZmllbGRzW0RCVVNfSEVBREVSX0ZJRUxEX0xBU1QgKyAxXTsgLyoqPCBUcmFjayB0aGUgbG9jYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9mIGVhY2ggZmllbGQgaW4gaGVhZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBkYnVzX3VpbnQzMl90IHBhZGRpbmcgOiAzOyAgICAgICAgLyoqPCBieXRlcyBvZiBhbGlnbm1lbnQgaW4gaGVhZGVyICovCisgIGRidXNfdWludDMyX3QgYnl0ZV9vcmRlciA6IDg7ICAgICAvKio8IGJ5dGUgb3JkZXIgb2YgaGVhZGVyICovCit9OworCitkYnVzX2Jvb2xfdCAgIF9kYnVzX2hlYWRlcl9pbml0ICAgICAgICAgICAgICAgICAgIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyKTsKK3ZvaWQgICAgICAgICAgX2RidXNfaGVhZGVyX2ZyZWUgICAgICAgICAgICAgICAgICAgKERCdXNIZWFkZXIgICAgICAgICpoZWFkZXIpOwordm9pZCAgICAgICAgICBfZGJ1c19oZWFkZXJfcmVpbml0ICAgICAgICAgICAgICAgICAoREJ1c0hlYWRlciAgICAgICAgKmhlYWRlcik7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX2hlYWRlcl9jcmVhdGUgICAgICAgICAgICAgICAgIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICpkZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICptZW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZXJyb3JfbmFtZSk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX2hlYWRlcl9jb3B5ICAgICAgICAgICAgICAgICAgIChjb25zdCBEQnVzSGVhZGVyICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hlYWRlciAgICAgICAgKmRlc3QpOworaW50ICAgICAgICAgICBfZGJ1c19oZWFkZXJfZ2V0X21lc3NhZ2VfdHlwZSAgICAgICAoREJ1c0hlYWRlciAgICAgICAgKmhlYWRlcik7Cit2b2lkICAgICAgICAgIF9kYnVzX2hlYWRlcl9zZXRfc2VyaWFsICAgICAgICAgICAgIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgIHNlcmlhbCk7CitkYnVzX3VpbnQzMl90IF9kYnVzX2hlYWRlcl9nZXRfc2VyaWFsICAgICAgICAgICAgIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyKTsKK3ZvaWQgICAgICAgICAgX2RidXNfaGVhZGVyX3VwZGF0ZV9sZW5ndGhzICAgICAgICAgKERCdXNIZWFkZXIgICAgICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYm9keV9sZW4pOworZGJ1c19ib29sX3QgICBfZGJ1c19oZWFkZXJfc2V0X2ZpZWxkX2Jhc2ljICAgICAgICAoREJ1c0hlYWRlciAgICAgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAgICAgICAgKnZhbHVlKTsKK2RidXNfYm9vbF90ICAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9iYXNpYyAgICAgICAgKERCdXNIZWFkZXIgICAgICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICp2YWx1ZSk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfcmF3ICAgICAgICAgIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICpwb3MpOworZGJ1c19ib29sX3QgICBfZGJ1c19oZWFkZXJfZGVsZXRlX2ZpZWxkICAgICAgICAgICAoREJ1c0hlYWRlciAgICAgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBmaWVsZCk7Cit2b2lkICAgICAgICAgIF9kYnVzX2hlYWRlcl90b2dnbGVfZmxhZyAgICAgICAgICAgIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgIGZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgdmFsdWUpOworZGJ1c19ib29sX3QgICBfZGJ1c19oZWFkZXJfZ2V0X2ZsYWcgICAgICAgICAgICAgICAoREJ1c0hlYWRlciAgICAgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgICBmbGFnKTsKK2RidXNfYm9vbF90ICAgX2RidXNfaGVhZGVyX2Vuc3VyZV9zaWduYXR1cmUgICAgICAgKERCdXNIZWFkZXIgICAgICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICoqdHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqdHlwZV9wb3MpOworZGJ1c19ib29sX3QgICBfZGJ1c19oZWFkZXJfaGF2ZV9tZXNzYWdlX3VudHJ1c3RlZCAoaW50ICAgICAgICAgICAgICAgIG1heF9tZXNzYWdlX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICp2YWxpZGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICpieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKmZpZWxkc19hcnJheV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqaGVhZGVyX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICpib2R5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKTsKK2RidXNfYm9vbF90ICAgX2RidXNfaGVhZGVyX2xvYWQgICAgICAgICAgICAgICAgICAgKERCdXNIZWFkZXIgICAgICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRhdGlvbk1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICp2YWxpZGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGZpZWxkc19hcnJheV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgaGVhZGVyX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBib2R5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKTsKK3ZvaWQgICAgICAgICAgX2RidXNfaGVhZGVyX2J5dGVzd2FwICAgICAgICAgICAgICAgKERCdXNIZWFkZXIgICAgICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbmV3X29yZGVyKTsKK2NoYXIgICAgICAgICAgX2RidXNfaGVhZGVyX2dldF9ieXRlX29yZGVyICAgICAgICAgKGNvbnN0IERCdXNIZWFkZXIgICpoZWFkZXIpOworCisKKworI2VuZGlmIC8qIERCVVNfTUFSU0hBTF9IRUFERVJfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUtdXRpbC5jIGIvZGJ1cy9kYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUtdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MTI0MTQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS11dGlsLmMKQEAgLTAsMCArMSwzNTc3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWFyc2hhbC1yZWN1cnNpdmUtdXRpbC5jICBXb3VsZCBiZSBpbiBkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmMsIGJ1dCBvbmx5IHVzZWQgaW4gYnVzL3Rlc3RzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKworI2luY2x1ZGUgImRidXMtbWFyc2hhbC1yZWN1cnNpdmUuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtYmFzaWMuaCIKKyNpbmNsdWRlICJkYnVzLXNpZ25hdHVyZS5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0YXRpYyB2b2lkCitiYXNpY192YWx1ZV96ZXJvIChEQnVzQmFzaWNWYWx1ZSAqdmFsdWUpCit7CisKKyNpZmRlZiBEQlVTX0hBVkVfSU5UNjQKKyAgdmFsdWUtPnU2NCA9IDA7CisjZWxzZQorICB2YWx1ZS0+ZWlnaHQuZmlyc3QzMiA9IDA7CisgIHZhbHVlLT5laWdodC5zZWNvbmQzMiA9IDA7CisjZW5kaWYKK30KKworc3RhdGljIGRidXNfYm9vbF90CitiYXNpY192YWx1ZV9lcXVhbCAoaW50ICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgREJ1c0Jhc2ljVmFsdWUgKmxocywKKyAgICAgICAgICAgICAgICAgICBEQnVzQmFzaWNWYWx1ZSAqcmhzKQoreworICBpZiAodHlwZSA9PSBEQlVTX1RZUEVfU1RSSU5HIHx8CisgICAgICB0eXBlID09IERCVVNfVFlQRV9TSUdOQVRVUkUgfHwKKyAgICAgIHR5cGUgPT0gREJVU19UWVBFX09CSkVDVF9QQVRIKQorICAgIHsKKyAgICAgIHJldHVybiBzdHJjbXAgKGxocy0+c3RyLCByaHMtPnN0cikgPT0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisjaWZkZWYgREJVU19IQVZFX0lOVDY0CisgICAgICByZXR1cm4gbGhzLT51NjQgPT0gcmhzLT51NjQ7CisjZWxzZQorICAgICAgcmV0dXJuIGxocy0+ZWlnaHQuZmlyc3QzMiA9PSByaHMtPmVpZ2h0LmZpcnN0MzIgJiYKKyAgICAgICAgbGhzLT5laWdodC5zZWNvbmQzMiA9PSByaHMtPmVpZ2h0LnNlY29uZDMyOworI2VuZGlmCisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2VxdWFsX3ZhbHVlc19oZWxwZXIgKERCdXNUeXBlUmVhZGVyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmhzKQoreworICBpbnQgbGhzX3R5cGU7CisgIGludCByaHNfdHlwZTsKKworICBsaHNfdHlwZSA9IF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKGxocyk7CisgIHJoc190eXBlID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAocmhzKTsKKworICBpZiAobGhzX3R5cGUgIT0gcmhzX3R5cGUpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChsaHNfdHlwZSA9PSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoZGJ1c190eXBlX2lzX2Jhc2ljIChsaHNfdHlwZSkpCisgICAgeworICAgICAgREJ1c0Jhc2ljVmFsdWUgbGhzX3ZhbHVlOworICAgICAgREJ1c0Jhc2ljVmFsdWUgcmhzX3ZhbHVlOworCisgICAgICBiYXNpY192YWx1ZV96ZXJvICgmbGhzX3ZhbHVlKTsKKyAgICAgIGJhc2ljX3ZhbHVlX3plcm8gKCZyaHNfdmFsdWUpOworICAgICAgCisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljIChsaHMsICZsaHNfdmFsdWUpOworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAocmhzLCAmcmhzX3ZhbHVlKTsKKworICAgICAgcmV0dXJuIGJhc2ljX3ZhbHVlX2VxdWFsIChsaHNfdHlwZSwgJmxoc192YWx1ZSwgJnJoc192YWx1ZSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgREJ1c1R5cGVSZWFkZXIgbGhzX3N1YjsKKyAgICAgIERCdXNUeXBlUmVhZGVyIHJoc19zdWI7CisKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKGxocywgJmxoc19zdWIpOworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAocmhzLCAmcmhzX3N1Yik7CisKKyAgICAgIHJldHVybiBlcXVhbF92YWx1ZXNfaGVscGVyICgmbGhzX3N1YiwgJnJoc19zdWIpOworICAgIH0KK30KKworLyoqCisgKiBTZWUgd2hldGhlciB0aGUgdHdvIHJlYWRlcnMgcG9pbnQgdG8gaWRlbnRpY2FsIGRhdGEgYmxvY2tzLgorICoKKyAqIEBwYXJhbSBsaHMgcmVhZGVyIDEKKyAqIEBwYXJhbSByaHMgcmVhZGVyIDIKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBkYXRhIGJsb2NrcyBoYXZlIHRoZSBzYW1lIHZhbHVlcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHlwZV9yZWFkZXJfZXF1YWxfdmFsdWVzIChjb25zdCBEQnVzVHlwZVJlYWRlciAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzVHlwZVJlYWRlciAqcmhzKQoreworICBEQnVzVHlwZVJlYWRlciBjb3B5X2xocyA9ICpsaHM7CisgIERCdXNUeXBlUmVhZGVyIGNvcHlfcmhzID0gKnJoczsKKworICByZXR1cm4gZXF1YWxfdmFsdWVzX2hlbHBlciAoJmNvcHlfbGhzLCAmY29weV9yaHMpOworfQorCisvKiBURVNUUyAqLworCisjaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUworCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSAiZGJ1cy1saXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyogV2hldGhlciB0byBkbyB0aGUgT09NIHN0dWZmIChvbmx5IHdpdGggb3RoZXIgZXhwZW5zaXZlIHRlc3RzKSAqLworI2RlZmluZSBURVNUX09PTV9IQU5ETElORyAwCisvKiBXZSBkbyBzdGFydCBvZmZzZXQgMCB0aHJvdWdoIDksIHRvIGdldCB2YXJpb3VzIGFsaWdubWVudCBjYXNlcy4gU3RpbGwgdGhpcworICogb2J2aW91c2x5IG1ha2VzIHRoZSB0ZXN0IHN1aXRlIHJ1biAxMHggYXMgc2xvdy4KKyAqLworI2RlZmluZSBNQVhfSU5JVElBTF9PRkZTRVQgOQorCisvKiBMYXJnZXN0IGl0ZXJhdGlvbiBjb3VudCB0byB0ZXN0IGNvcHlpbmcsIHJlYWxpZ25tZW50LAorICogZXRjLiB3aXRoLiBpLmUuIHdlIG9ubHkgdGVzdCB0aGlzIHN0dWZmIHdpdGggc29tZSBvZiB0aGUgc21hbGxlcgorICogZGF0YSBzZXRzLgorICovCisjZGVmaW5lIE1BWF9JVEVSQVRJT05TX0ZPUl9FWFBFTlNJVkVfVEVTVFMgMTAwMAorCit0eXBlZGVmIHN0cnVjdAoreworICBpbnQgYnl0ZV9vcmRlcjsKKyAgaW50IGluaXRpYWxfb2Zmc2V0OworICBEQnVzU3RyaW5nIHNpZ25hdHVyZTsKKyAgREJ1c1N0cmluZyBib2R5OworfSBEYXRhQmxvY2s7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGludCBzYXZlZF9zaWdfbGVuOworICBpbnQgc2F2ZWRfYm9keV9sZW47Cit9IERhdGFCbG9ja1N0YXRlOworCisjZGVmaW5lIE5fRkVOQ0VfQllURVMgNQorI2RlZmluZSBGRU5DRV9CWVRFU19TVFIgImFiY2RlIgorI2RlZmluZSBJTklUSUFMX1BBRERJTkdfQllURSAnXDAnCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZGF0YV9ibG9ja19pbml0IChEYXRhQmxvY2sgKmJsb2NrLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgaW5pdGlhbF9vZmZzZXQpCit7CisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZibG9jay0+c2lnbmF0dXJlKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmJsb2NrLT5ib2R5KSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmJsb2NrLT5zaWduYXR1cmUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZXMgKCZibG9jay0+c2lnbmF0dXJlLCAwLCBpbml0aWFsX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTklUSUFMX1BBRERJTkdfQllURSkgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGVzICgmYmxvY2stPmJvZHksIDAsIGluaXRpYWxfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOSVRJQUxfUEFERElOR19CWVRFKSB8fAorICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZibG9jay0+c2lnbmF0dXJlLCBGRU5DRV9CWVRFU19TVFIpIHx8CisgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJmJsb2NrLT5ib2R5LCBGRU5DRV9CWVRFU19TVFIpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYmxvY2stPnNpZ25hdHVyZSk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmJsb2NrLT5ib2R5KTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgYmxvY2stPmJ5dGVfb3JkZXIgPSBieXRlX29yZGVyOworICBibG9jay0+aW5pdGlhbF9vZmZzZXQgPSBpbml0aWFsX29mZnNldDsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2RhdGFfYmxvY2tfc2F2ZSAoRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICBEYXRhQmxvY2tTdGF0ZSAqc3RhdGUpCit7CisgIHN0YXRlLT5zYXZlZF9zaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay0+c2lnbmF0dXJlKSAtIE5fRkVOQ0VfQllURVM7CisgIHN0YXRlLT5zYXZlZF9ib2R5X2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYmxvY2stPmJvZHkpIC0gTl9GRU5DRV9CWVRFUzsKK30KKworc3RhdGljIHZvaWQKK2RhdGFfYmxvY2tfcmVzdG9yZSAoRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2tTdGF0ZSAqc3RhdGUpCit7CisgIF9kYnVzX3N0cmluZ19kZWxldGUgKCZibG9jay0+c2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+c2F2ZWRfc2lnX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay0+c2lnbmF0dXJlKSAtIHN0YXRlLT5zYXZlZF9zaWdfbGVuIC0gTl9GRU5DRV9CWVRFUyk7CisgIF9kYnVzX3N0cmluZ19kZWxldGUgKCZibG9jay0+Ym9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPnNhdmVkX2JvZHlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJsb2NrLT5ib2R5KSAtIHN0YXRlLT5zYXZlZF9ib2R5X2xlbiAtIE5fRkVOQ0VfQllURVMpOworfQorCitzdGF0aWMgdm9pZAorZGF0YV9ibG9ja192ZXJpZnkgKERhdGFCbG9jayAqYmxvY2spCit7CisgIGlmICghX2RidXNfc3RyaW5nX2VuZHNfd2l0aF9jX3N0ciAoJmJsb2NrLT5zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkVOQ0VfQllURVNfU1RSKSkKKyAgICB7CisgICAgICBpbnQgb2Zmc2V0OworCisgICAgICBvZmZzZXQgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJsb2NrLT5zaWduYXR1cmUpIC0gTl9GRU5DRV9CWVRFUyAtIDg7CisgICAgICBpZiAob2Zmc2V0IDwgMCkKKyAgICAgICAgb2Zmc2V0ID0gMDsKKworICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZibG9jay0+c2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJsb2NrLT5zaWduYXR1cmUpIC0gb2Zmc2V0KTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImJsb2NrIGRpZCBub3QgdmVyaWZ5OiBiYWQgYnl0ZXMgYXQgZW5kIG9mIHNpZ25hdHVyZSIpOworICAgIH0KKyAgaWYgKCFfZGJ1c19zdHJpbmdfZW5kc193aXRoX2Nfc3RyICgmYmxvY2stPmJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkVOQ0VfQllURVNfU1RSKSkKKyAgICB7CisgICAgICBpbnQgb2Zmc2V0OworCisgICAgICBvZmZzZXQgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJsb2NrLT5ib2R5KSAtIE5fRkVOQ0VfQllURVMgLSA4OworICAgICAgaWYgKG9mZnNldCA8IDApCisgICAgICAgIG9mZnNldCA9IDA7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmYmxvY2stPmJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYmxvY2stPmJvZHkpIC0gb2Zmc2V0KTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImJsb2NrIGRpZCBub3QgdmVyaWZ5OiBiYWQgYnl0ZXMgYXQgZW5kIG9mIGJvZHkiKTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfdmFsaWRhdGVfbnVsICgmYmxvY2stPnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBibG9jay0+aW5pdGlhbF9vZmZzZXQpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfdmFsaWRhdGVfbnVsICgmYmxvY2stPmJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgYmxvY2stPmluaXRpYWxfb2Zmc2V0KSk7Cit9CisKK3N0YXRpYyB2b2lkCitkYXRhX2Jsb2NrX2ZyZWUgKERhdGFCbG9jayAqYmxvY2spCit7CisgIGRhdGFfYmxvY2tfdmVyaWZ5IChibG9jayk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZibG9jay0+c2lnbmF0dXJlKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZibG9jay0+Ym9keSk7Cit9CisKK3N0YXRpYyB2b2lkCitkYXRhX2Jsb2NrX3Jlc2V0IChEYXRhQmxvY2sgKmJsb2NrKQoreworICBkYXRhX2Jsb2NrX3ZlcmlmeSAoYmxvY2spOworCisgIF9kYnVzX3N0cmluZ19kZWxldGUgKCZibG9jay0+c2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICBibG9jay0+aW5pdGlhbF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYmxvY2stPnNpZ25hdHVyZSkgLSBOX0ZFTkNFX0JZVEVTIC0gYmxvY2stPmluaXRpYWxfb2Zmc2V0KTsKKyAgX2RidXNfc3RyaW5nX2RlbGV0ZSAoJmJsb2NrLT5ib2R5LAorICAgICAgICAgICAgICAgICAgICAgICBibG9jay0+aW5pdGlhbF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYmxvY2stPmJvZHkpIC0gTl9GRU5DRV9CWVRFUyAtIGJsb2NrLT5pbml0aWFsX29mZnNldCk7CisKKyAgZGF0YV9ibG9ja192ZXJpZnkgKGJsb2NrKTsKK30KKworc3RhdGljIHZvaWQKK2RhdGFfYmxvY2tfaW5pdF9yZWFkZXJfd3JpdGVyIChEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyKQoreworICBpZiAocmVhZGVyKQorICAgIF9kYnVzX3R5cGVfcmVhZGVyX2luaXQgKHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2stPnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay0+aW5pdGlhbF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsb2NrLT5ib2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLT5pbml0aWFsX29mZnNldCk7CisKKyAgaWYgKHdyaXRlcikKKyAgICBfZGJ1c190eXBlX3dyaXRlcl9pbml0ICh3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2stPmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsb2NrLT5zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay0+c2lnbmF0dXJlKSAtIE5fRkVOQ0VfQllURVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsb2NrLT5ib2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYmxvY2stPmJvZHkpIC0gTl9GRU5DRV9CWVRFUyk7Cit9CisKK3N0YXRpYyB2b2lkCityZWFsX2NoZWNrX2V4cGVjdGVkX3R5cGUgKERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmZ1bmNuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgbGluZSkKK3sKKyAgaW50IHQ7CisKKyAgdCA9IF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKHJlYWRlcik7CisKKyAgaWYgKHQgIT0gZXhwZWN0ZWQpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIlJlYWQgdHlwZSAlcyB3aGlsZSBleHBlY3RpbmcgJXMgYXQgJXMgbGluZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nICh0KSwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChleHBlY3RlZCksCisgICAgICAgICAgICAgICAgICBmdW5jbmFtZSwgbGluZSk7CisKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInJlYWQgd3JvbmcgdHlwZSIpOworICAgIH0KK30KKworI2RlZmluZSBjaGVja19leHBlY3RlZF90eXBlKHJlYWRlciwgZXhwZWN0ZWQpIHJlYWxfY2hlY2tfZXhwZWN0ZWRfdHlwZSAocmVhZGVyLCBleHBlY3RlZCwgX0RCVVNfRlVOQ1RJT05fTkFNRSwgX19MSU5FX18pCisKKyNkZWZpbmUgTkVYVF9FWFBFQ1RJTkdfVFJVRShyZWFkZXIpICBkbyB7IGlmICghX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAocmVhZGVyKSkgICAgICAgICBcCisgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9kYnVzX3dhcm4gKCJfZGJ1c190eXBlX3JlYWRlcl9uZXh0KCkgc2hvdWxkIGhhdmUgcmV0dXJuZWQgVFJVRSBhdCAlcyAlZFxuIiwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX0ZVTkNUSU9OX05BTUUsIF9fTElORV9fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidGVzdCBmYWlsZWQiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTkVYVF9FWFBFQ1RJTkdfRkFMU0UocmVhZGVyKSBkbyB7IGlmIChfZGJ1c190eXBlX3JlYWRlcl9uZXh0IChyZWFkZXIpKSAgICAgICAgICBcCisgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9kYnVzX3dhcm4gKCJfZGJ1c190eXBlX3JlYWRlcl9uZXh0KCkgc2hvdWxkIGhhdmUgcmV0dXJuZWQgRkFMU0UgYXQgJXMgJWRcbiIsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX0ZVTkNUSU9OX05BTUUsIF9fTElORV9fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidGVzdCBmYWlsZWQiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyBjaGVja19leHBlY3RlZF90eXBlIChyZWFkZXIsIERCVVNfVFlQRV9JTlZBTElEKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCit0eXBlZGVmIHN0cnVjdCBUZXN0VHlwZU5vZGUgICAgICAgICAgICAgICBUZXN0VHlwZU5vZGU7Cit0eXBlZGVmIHN0cnVjdCBUZXN0VHlwZU5vZGVDbGFzcyAgICAgICAgICBUZXN0VHlwZU5vZGVDbGFzczsKK3R5cGVkZWYgc3RydWN0IFRlc3RUeXBlTm9kZUNvbnRhaW5lciAgICAgIFRlc3RUeXBlTm9kZUNvbnRhaW5lcjsKK3R5cGVkZWYgc3RydWN0IFRlc3RUeXBlTm9kZUNvbnRhaW5lckNsYXNzIFRlc3RUeXBlTm9kZUNvbnRhaW5lckNsYXNzOworCitzdHJ1Y3QgVGVzdFR5cGVOb2RlCit7CisgIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzICprbGFzczsKK307CisKK3N0cnVjdCBUZXN0VHlwZU5vZGVDb250YWluZXIKK3sKKyAgVGVzdFR5cGVOb2RlIGJhc2U7CisgIERCdXNMaXN0ICAgICpjaGlsZHJlbjsKK307CisKK3N0cnVjdCBUZXN0VHlwZU5vZGVDbGFzcworeworICBpbnQgdHlwZWNvZGU7CisKKyAgaW50IGluc3RhbmNlX3NpemU7CisKKyAgaW50IHN1YmNsYXNzX2RldGFpbDsgLyogYSBiYWQgaGFjayB0byBhdm9pZCBhIGJ1bmNoIG9mIHN1YmNsYXNzIGNhc3RpbmcgKi8KKworICBkYnVzX2Jvb2xfdCAgICgqIGNvbnN0cnVjdCkgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSk7CisgIHZvaWQgICAgICAgICAgKCogZGVzdHJveSkgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlKTsKKworICBkYnVzX2Jvb2xfdCAoKiB3cml0ZV92YWx1ZSkgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CisgIGRidXNfYm9vbF90ICgqIHJlYWRfdmFsdWUpICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CisgIGRidXNfYm9vbF90ICgqIHNldF92YWx1ZSkgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CisgIGRidXNfYm9vbF90ICgqIGJ1aWxkX3NpZ25hdHVyZSkgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAqc3RyKTsKKyAgZGJ1c19ib29sX3QgKCogd3JpdGVfbXVsdGkpICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjb3VudCk7CisgIGRidXNfYm9vbF90ICgqIHJlYWRfbXVsdGkpICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGNvdW50KTsKK307CisKK3N0cnVjdCBUZXN0VHlwZU5vZGVDb250YWluZXJDbGFzcworeworICBUZXN0VHlwZU5vZGVDbGFzcyBiYXNlOworfTsKKworLyogRklYTUUgdGhpcyBjb3VsZCBiZSBjaGlsbGVkIG91dCBzdWJzdGFudGlhbGx5IGJ5IHVuaWZ5aW5nCisgKiB0aGUgYmFzaWMgdHlwZXMgaW50byBiYXNpY193cml0ZV92YWx1ZS9iYXNpY19yZWFkX3ZhbHVlCisgKiBhbmQgYnkgbWVyZ2luZyByZWFkX3ZhbHVlIGFuZCBzZXRfdmFsdWUgaW50byBvbmUgZnVuY3Rpb24KKyAqIHRha2luZyBhIGZsYWcgYXJndW1lbnQuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdCBpbnQxNl93cml0ZV92YWx1ZSAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGludDE2X3JlYWRfdmFsdWUgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGludDE2X3NldF92YWx1ZSAgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGludDE2X3dyaXRlX211bHRpICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGNvdW50KTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBpbnQxNl9yZWFkX211bHRpICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgY291bnQpOworc3RhdGljIGRidXNfYm9vbF90IGludDMyX3dyaXRlX3ZhbHVlICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgaW50MzJfcmVhZF92YWx1ZSAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgaW50MzJfc2V0X3ZhbHVlICAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgaW50MzJfd3JpdGVfbXVsdGkgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgY291bnQpOworc3RhdGljIGRidXNfYm9vbF90IGludDMyX3JlYWRfbXVsdGkgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjb3VudCk7CitzdGF0aWMgZGJ1c19ib29sX3QgaW50NjRfd3JpdGVfdmFsdWUgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBpbnQ2NF9yZWFkX3ZhbHVlICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBpbnQ2NF9zZXRfdmFsdWUgICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBzdHJpbmdfd3JpdGVfdmFsdWUgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IHN0cmluZ19yZWFkX3ZhbHVlICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IHN0cmluZ19zZXRfdmFsdWUgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGJvb2xfd3JpdGVfdmFsdWUgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgYm9vbF9yZWFkX3ZhbHVlICAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgYm9vbF9zZXRfdmFsdWUgICAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgYnl0ZV93cml0ZV92YWx1ZSAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBieXRlX3JlYWRfdmFsdWUgICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBieXRlX3NldF92YWx1ZSAgICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBkb3VibGVfd3JpdGVfdmFsdWUgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGRvdWJsZV9yZWFkX3ZhbHVlICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGRvdWJsZV9zZXRfdmFsdWUgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IG9iamVjdF9wYXRoX3dyaXRlX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3Qgb2JqZWN0X3BhdGhfcmVhZF92YWx1ZSAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3Qgb2JqZWN0X3BhdGhfc2V0X3ZhbHVlICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc2lnbmF0dXJlX3dyaXRlX3ZhbHVlICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBzaWduYXR1cmVfcmVhZF92YWx1ZSAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBzaWduYXR1cmVfc2V0X3ZhbHVlICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBzdHJ1Y3Rfd3JpdGVfdmFsdWUgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IHN0cnVjdF9yZWFkX3ZhbHVlICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IHN0cnVjdF9zZXRfdmFsdWUgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IHN0cnVjdF9idWlsZF9zaWduYXR1cmUgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgKnN0cik7CitzdGF0aWMgZGJ1c19ib29sX3QgZGljdF93cml0ZV92YWx1ZSAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBkaWN0X3JlYWRfdmFsdWUgICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBkaWN0X3NldF92YWx1ZSAgICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBkaWN0X2J1aWxkX3NpZ25hdHVyZSAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICpzdHIpOworc3RhdGljIGRidXNfYm9vbF90IGFycmF5X3dyaXRlX3ZhbHVlICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgYXJyYXlfcmVhZF92YWx1ZSAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgYXJyYXlfc2V0X3ZhbHVlICAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgYXJyYXlfYnVpbGRfc2lnbmF0dXJlICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAqc3RyKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCB2YXJpYW50X3dyaXRlX3ZhbHVlICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IHZhcmlhbnRfcmVhZF92YWx1ZSAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IHZhcmlhbnRfc2V0X3ZhbHVlICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIHZvaWQgICAgICAgIGNvbnRhaW5lcl9kZXN0cm95ICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSk7CisKKworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgaW50MTZfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9JTlQxNiwKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGUpLAorICAwLAorICBOVUxMLAorICBOVUxMLAorICBpbnQxNl93cml0ZV92YWx1ZSwKKyAgaW50MTZfcmVhZF92YWx1ZSwKKyAgaW50MTZfc2V0X3ZhbHVlLAorICBOVUxMLAorICBpbnQxNl93cml0ZV9tdWx0aSwKKyAgaW50MTZfcmVhZF9tdWx0aQorfTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIHVpbnQxNl9jbGFzcyA9IHsKKyAgREJVU19UWVBFX1VJTlQxNiwKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGUpLAorICAwLAorICBOVUxMLAorICBOVUxMLAorICBpbnQxNl93cml0ZV92YWx1ZSwgLyogcmVjeWNsZSBmcm9tIGludDE2ICovCisgIGludDE2X3JlYWRfdmFsdWUsICAvKiByZWN5Y2xlIGZyb20gaW50MTYgKi8KKyAgaW50MTZfc2V0X3ZhbHVlLCAgIC8qIHJlY3ljbGUgZnJvbSBpbnQxNiAqLworICBOVUxMLAorICBpbnQxNl93cml0ZV9tdWx0aSwgLyogcmVjeWNsZSBmcm9tIGludDE2ICovCisgIGludDE2X3JlYWRfbXVsdGkgICAvKiByZWN5Y2xlIGZyb20gaW50MTYgKi8KK307CisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyBpbnQzMl9jbGFzcyA9IHsKKyAgREJVU19UWVBFX0lOVDMyLAorICBzaXplb2YgKFRlc3RUeXBlTm9kZSksCisgIDAsCisgIE5VTEwsCisgIE5VTEwsCisgIGludDMyX3dyaXRlX3ZhbHVlLAorICBpbnQzMl9yZWFkX3ZhbHVlLAorICBpbnQzMl9zZXRfdmFsdWUsCisgIE5VTEwsCisgIGludDMyX3dyaXRlX211bHRpLAorICBpbnQzMl9yZWFkX211bHRpCit9OworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgdWludDMyX2NsYXNzID0geworICBEQlVTX1RZUEVfVUlOVDMyLAorICBzaXplb2YgKFRlc3RUeXBlTm9kZSksCisgIDAsCisgIE5VTEwsCisgIE5VTEwsCisgIGludDMyX3dyaXRlX3ZhbHVlLCAvKiByZWN5Y2xlIGZyb20gaW50MzIgKi8KKyAgaW50MzJfcmVhZF92YWx1ZSwgIC8qIHJlY3ljbGUgZnJvbSBpbnQzMiAqLworICBpbnQzMl9zZXRfdmFsdWUsICAgLyogcmVjeWNsZSBmcm9tIGludDMyICovCisgIE5VTEwsCisgIGludDMyX3dyaXRlX211bHRpLCAvKiByZWN5Y2xlIGZyb20gaW50MzIgKi8KKyAgaW50MzJfcmVhZF9tdWx0aSAgIC8qIHJlY3ljbGUgZnJvbSBpbnQzMiAqLworfTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIGludDY0X2NsYXNzID0geworICBEQlVTX1RZUEVfSU5UNjQsCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlKSwKKyAgMCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgaW50NjRfd3JpdGVfdmFsdWUsCisgIGludDY0X3JlYWRfdmFsdWUsCisgIGludDY0X3NldF92YWx1ZSwKKyAgTlVMTCwKKyAgTlVMTCwgLyogRklYTUUgKi8KKyAgTlVMTCAgLyogRklYTUUgKi8KK307CisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyB1aW50NjRfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9VSU5UNjQsCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlKSwKKyAgMCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgaW50NjRfd3JpdGVfdmFsdWUsIC8qIHJlY3ljbGUgZnJvbSBpbnQ2NCAqLworICBpbnQ2NF9yZWFkX3ZhbHVlLCAgLyogcmVjeWNsZSBmcm9tIGludDY0ICovCisgIGludDY0X3NldF92YWx1ZSwgICAvKiByZWN5Y2xlIGZyb20gaW50NjQgKi8KKyAgTlVMTCwKKyAgTlVMTCwgLyogRklYTUUgKi8KKyAgTlVMTCAgLyogRklYTUUgKi8KK307CisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyBzdHJpbmdfMF9jbGFzcyA9IHsKKyAgREJVU19UWVBFX1NUUklORywKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGUpLAorICAwLCAvKiBzdHJpbmcgbGVuZ3RoICovCisgIE5VTEwsCisgIE5VTEwsCisgIHN0cmluZ193cml0ZV92YWx1ZSwKKyAgc3RyaW5nX3JlYWRfdmFsdWUsCisgIHN0cmluZ19zZXRfdmFsdWUsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyBzdHJpbmdfMV9jbGFzcyA9IHsKKyAgREJVU19UWVBFX1NUUklORywKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGUpLAorICAxLCAvKiBzdHJpbmcgbGVuZ3RoICovCisgIE5VTEwsCisgIE5VTEwsCisgIHN0cmluZ193cml0ZV92YWx1ZSwKKyAgc3RyaW5nX3JlYWRfdmFsdWUsCisgIHN0cmluZ19zZXRfdmFsdWUsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwKK307CisKKy8qIHdpdGggbnVsLCBhIGxlbiAzIHN0cmluZyBzaG91bGQgZmlsbCA0IGJ5dGVzIGFuZCB0aHVzIGlzICJzcGVjaWFsIiAqLworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIHN0cmluZ18zX2NsYXNzID0geworICBEQlVTX1RZUEVfU1RSSU5HLAorICBzaXplb2YgKFRlc3RUeXBlTm9kZSksCisgIDMsIC8qIHN0cmluZyBsZW5ndGggKi8KKyAgTlVMTCwKKyAgTlVMTCwKKyAgc3RyaW5nX3dyaXRlX3ZhbHVlLAorICBzdHJpbmdfcmVhZF92YWx1ZSwKKyAgc3RyaW5nX3NldF92YWx1ZSwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTAorfTsKKworLyogd2l0aCBudWwsIGEgbGVuIDggc3RyaW5nIHNob3VsZCBmaWxsIDkgYnl0ZXMgYW5kIHRodXMgaXMgInNwZWNpYWwiIChmYXItZmV0Y2hlZCBJIHN1cHBvc2UpICovCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3Mgc3RyaW5nXzhfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9TVFJJTkcsCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlKSwKKyAgOCwgLyogc3RyaW5nIGxlbmd0aCAqLworICBOVUxMLAorICBOVUxMLAorICBzdHJpbmdfd3JpdGVfdmFsdWUsCisgIHN0cmluZ19yZWFkX3ZhbHVlLAorICBzdHJpbmdfc2V0X3ZhbHVlLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMCit9OworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgYm9vbF9jbGFzcyA9IHsKKyAgREJVU19UWVBFX0JPT0xFQU4sCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlKSwKKyAgMCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgYm9vbF93cml0ZV92YWx1ZSwKKyAgYm9vbF9yZWFkX3ZhbHVlLAorICBib29sX3NldF92YWx1ZSwKKyAgTlVMTCwKKyAgTlVMTCwgLyogRklYTUUgKi8KKyAgTlVMTCAgLyogRklYTUUgKi8KK307CisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyBieXRlX2NsYXNzID0geworICBEQlVTX1RZUEVfQllURSwKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGUpLAorICAwLAorICBOVUxMLAorICBOVUxMLAorICBieXRlX3dyaXRlX3ZhbHVlLAorICBieXRlX3JlYWRfdmFsdWUsCisgIGJ5dGVfc2V0X3ZhbHVlLAorICBOVUxMLAorICBOVUxMLCAvKiBGSVhNRSAqLworICBOVUxMICAvKiBGSVhNRSAqLworfTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIGRvdWJsZV9jbGFzcyA9IHsKKyAgREJVU19UWVBFX0RPVUJMRSwKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGUpLAorICAwLAorICBOVUxMLAorICBOVUxMLAorICBkb3VibGVfd3JpdGVfdmFsdWUsCisgIGRvdWJsZV9yZWFkX3ZhbHVlLAorICBkb3VibGVfc2V0X3ZhbHVlLAorICBOVUxMLAorICBOVUxMLCAvKiBGSVhNRSAqLworICBOVUxMICAvKiBGSVhNRSAqLworfTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIG9iamVjdF9wYXRoX2NsYXNzID0geworICBEQlVTX1RZUEVfT0JKRUNUX1BBVEgsCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlKSwKKyAgMCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgb2JqZWN0X3BhdGhfd3JpdGVfdmFsdWUsCisgIG9iamVjdF9wYXRoX3JlYWRfdmFsdWUsCisgIG9iamVjdF9wYXRoX3NldF92YWx1ZSwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIHNpZ25hdHVyZV9jbGFzcyA9IHsKKyAgREJVU19UWVBFX1NJR05BVFVSRSwKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGUpLAorICAwLAorICBOVUxMLAorICBOVUxMLAorICBzaWduYXR1cmVfd3JpdGVfdmFsdWUsCisgIHNpZ25hdHVyZV9yZWFkX3ZhbHVlLAorICBzaWduYXR1cmVfc2V0X3ZhbHVlLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMCit9OworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3Mgc3RydWN0XzFfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9TVFJVQ1QsCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKSwKKyAgMSwgLyogbnVtYmVyIG9mIHRpbWVzIGNoaWxkcmVuIGFwcGVhciBhcyBmaWVsZHMgKi8KKyAgTlVMTCwKKyAgY29udGFpbmVyX2Rlc3Ryb3ksCisgIHN0cnVjdF93cml0ZV92YWx1ZSwKKyAgc3RydWN0X3JlYWRfdmFsdWUsCisgIHN0cnVjdF9zZXRfdmFsdWUsCisgIHN0cnVjdF9idWlsZF9zaWduYXR1cmUsCisgIE5VTEwsCisgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyBzdHJ1Y3RfMl9jbGFzcyA9IHsKKyAgREJVU19UWVBFX1NUUlVDVCwKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGVDb250YWluZXIpLAorICAyLCAvKiBudW1iZXIgb2YgdGltZXMgY2hpbGRyZW4gYXBwZWFyIGFzIGZpZWxkcyAqLworICBOVUxMLAorICBjb250YWluZXJfZGVzdHJveSwKKyAgc3RydWN0X3dyaXRlX3ZhbHVlLAorICBzdHJ1Y3RfcmVhZF92YWx1ZSwKKyAgc3RydWN0X3NldF92YWx1ZSwKKyAgc3RydWN0X2J1aWxkX3NpZ25hdHVyZSwKKyAgTlVMTCwKKyAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIGRpY3RfMV9jbGFzcyA9IHsKKyAgREJVU19UWVBFX0FSUkFZLCAvKiB0aGlzIGlzIGNvcnJlY3QsIGEgZGljdCBpcyBhbiBhcnJheSBvZiBkaWN0IGVudHJ5ICovCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKSwKKyAgMSwgLyogbnVtYmVyIG9mIGVudHJpZXMgKi8KKyAgTlVMTCwKKyAgY29udGFpbmVyX2Rlc3Ryb3ksCisgIGRpY3Rfd3JpdGVfdmFsdWUsCisgIGRpY3RfcmVhZF92YWx1ZSwKKyAgZGljdF9zZXRfdmFsdWUsCisgIGRpY3RfYnVpbGRfc2lnbmF0dXJlLAorICBOVUxMLAorICBOVUxMCit9OworCitzdGF0aWMgZGJ1c19ib29sX3QgYXJyYXlzX3dyaXRlX2ZpeGVkX2luX2Jsb2NrcyA9IEZBTFNFOworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgYXJyYXlfMF9jbGFzcyA9IHsKKyAgREJVU19UWVBFX0FSUkFZLAorICBzaXplb2YgKFRlc3RUeXBlTm9kZUNvbnRhaW5lciksCisgIDAsIC8qIG51bWJlciBvZiBhcnJheSBlbGVtZW50cyAqLworICBOVUxMLAorICBjb250YWluZXJfZGVzdHJveSwKKyAgYXJyYXlfd3JpdGVfdmFsdWUsCisgIGFycmF5X3JlYWRfdmFsdWUsCisgIGFycmF5X3NldF92YWx1ZSwKKyAgYXJyYXlfYnVpbGRfc2lnbmF0dXJlLAorICBOVUxMLAorICBOVUxMCit9OworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgYXJyYXlfMV9jbGFzcyA9IHsKKyAgREJVU19UWVBFX0FSUkFZLAorICBzaXplb2YgKFRlc3RUeXBlTm9kZUNvbnRhaW5lciksCisgIDEsIC8qIG51bWJlciBvZiBhcnJheSBlbGVtZW50cyAqLworICBOVUxMLAorICBjb250YWluZXJfZGVzdHJveSwKKyAgYXJyYXlfd3JpdGVfdmFsdWUsCisgIGFycmF5X3JlYWRfdmFsdWUsCisgIGFycmF5X3NldF92YWx1ZSwKKyAgYXJyYXlfYnVpbGRfc2lnbmF0dXJlLAorICBOVUxMLAorICBOVUxMCit9OworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgYXJyYXlfMl9jbGFzcyA9IHsKKyAgREJVU19UWVBFX0FSUkFZLAorICBzaXplb2YgKFRlc3RUeXBlTm9kZUNvbnRhaW5lciksCisgIDIsIC8qIG51bWJlciBvZiBhcnJheSBlbGVtZW50cyAqLworICBOVUxMLAorICBjb250YWluZXJfZGVzdHJveSwKKyAgYXJyYXlfd3JpdGVfdmFsdWUsCisgIGFycmF5X3JlYWRfdmFsdWUsCisgIGFycmF5X3NldF92YWx1ZSwKKyAgYXJyYXlfYnVpbGRfc2lnbmF0dXJlLAorICBOVUxMLAorICBOVUxMCit9OworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgYXJyYXlfOV9jbGFzcyA9IHsKKyAgREJVU19UWVBFX0FSUkFZLAorICBzaXplb2YgKFRlc3RUeXBlTm9kZUNvbnRhaW5lciksCisgIDksIC8qIG51bWJlciBvZiBhcnJheSBlbGVtZW50cyAqLworICBOVUxMLAorICBjb250YWluZXJfZGVzdHJveSwKKyAgYXJyYXlfd3JpdGVfdmFsdWUsCisgIGFycmF5X3JlYWRfdmFsdWUsCisgIGFycmF5X3NldF92YWx1ZSwKKyAgYXJyYXlfYnVpbGRfc2lnbmF0dXJlLAorICBOVUxMLAorICBOVUxMCit9OworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgdmFyaWFudF9jbGFzcyA9IHsKKyAgREJVU19UWVBFX1ZBUklBTlQsCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKSwKKyAgMCwKKyAgTlVMTCwKKyAgY29udGFpbmVyX2Rlc3Ryb3ksCisgIHZhcmlhbnRfd3JpdGVfdmFsdWUsCisgIHZhcmlhbnRfcmVhZF92YWx1ZSwKKyAgdmFyaWFudF9zZXRfdmFsdWUsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyogY29uc3QKK2Jhc2ljX25vZGVzW10gPSB7CisgICZpbnQxNl9jbGFzcywKKyAgJnVpbnQxNl9jbGFzcywKKyAgJmludDMyX2NsYXNzLAorICAmdWludDMyX2NsYXNzLAorICAmaW50NjRfY2xhc3MsCisgICZ1aW50NjRfY2xhc3MsCisgICZib29sX2NsYXNzLAorICAmYnl0ZV9jbGFzcywKKyAgJmRvdWJsZV9jbGFzcywKKyAgJnN0cmluZ18wX2NsYXNzLAorICAmc3RyaW5nXzFfY2xhc3MsCisgICZzdHJpbmdfM19jbGFzcywKKyAgJnN0cmluZ184X2NsYXNzLAorICAmb2JqZWN0X3BhdGhfY2xhc3MsCisgICZzaWduYXR1cmVfY2xhc3MKK307CisjZGVmaW5lIE5fQkFTSUNTIChfREJVU19OX0VMRU1FTlRTIChiYXNpY19ub2RlcykpCisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyogY29uc3QKK2NvbnRhaW5lcl9ub2Rlc1tdID0geworICAmc3RydWN0XzFfY2xhc3MsCisgICZhcnJheV8xX2NsYXNzLAorICAmc3RydWN0XzJfY2xhc3MsCisgICZhcnJheV8wX2NsYXNzLAorICAmYXJyYXlfMl9jbGFzcywKKyAgJnZhcmlhbnRfY2xhc3MsCisgICZkaWN0XzFfY2xhc3MgLyogbGFzdCBzaW5jZSB3ZSB3YW50IHN0cnVjdCBhbmQgYXJyYXkgYmVmb3JlIGl0ICovCisgIC8qIGFycmF5XzlfY2xhc3MgaXMgb21pdHRlZCBvbiBwdXJwb3NlLCBpdCdzIHRvbyBzbG93OworICAgKiB3ZSBvbmx5IHVzZSBpdCBpbiBvbmUgaGFyZGNvZGVkIHRlc3QgYmVsb3cKKyAgICovCit9OworI2RlZmluZSBOX0NPTlRBSU5FUlMgKF9EQlVTX05fRUxFTUVOVFMgKGNvbnRhaW5lcl9ub2RlcykpCisKK3N0YXRpYyBUZXN0VHlwZU5vZGUqCitub2RlX25ldyAoY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgKmtsYXNzKQoreworICBUZXN0VHlwZU5vZGUgKm5vZGU7CisKKyAgbm9kZSA9IGRidXNfbWFsbG9jMCAoa2xhc3MtPmluc3RhbmNlX3NpemUpOworICBpZiAobm9kZSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIG5vZGUtPmtsYXNzID0ga2xhc3M7CisKKyAgaWYgKGtsYXNzLT5jb25zdHJ1Y3QpCisgICAgeworICAgICAgaWYgKCEoKiBrbGFzcy0+Y29uc3RydWN0KSAobm9kZSkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2ZyZWUgKG5vZGUpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBub2RlOworfQorCitzdGF0aWMgdm9pZAorbm9kZV9kZXN0cm95IChUZXN0VHlwZU5vZGUgKm5vZGUpCit7CisgIGlmIChub2RlLT5rbGFzcy0+ZGVzdHJveSkKKyAgICAoKiBub2RlLT5rbGFzcy0+ZGVzdHJveSkgKG5vZGUpOworICBkYnVzX2ZyZWUgKG5vZGUpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK25vZGVfd3JpdGVfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgcmV0dmFsID0gKCogbm9kZS0+a2xhc3MtPndyaXRlX3ZhbHVlKSAobm9kZSwgYmxvY2ssIHdyaXRlciwgc2VlZCk7CisKKyNpZiAwCisgIC8qIEhhbmR5IHRvIHNlZSB3aGVyZSB0aGluZ3MgYnJlYWssIGJ1dCB0b28gZXhwZW5zaXZlIHRvIGRvIGFsbCB0aGUgdGltZSAqLworICBkYXRhX2Jsb2NrX3ZlcmlmeSAoYmxvY2spOworI2VuZGlmCisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citub2RlX3JlYWRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgLyogREJ1c1R5cGVSZWFkZXIgcmVzdG9yZWQ7ICovCisKKyAgaWYgKCEoKiBub2RlLT5rbGFzcy0+cmVhZF92YWx1ZSkgKG5vZGUsIHJlYWRlciwgc2VlZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisvKiBXYXJuaW5nOiBpZiB0aGlzIG9uZSBmYWlscyBkdWUgdG8gT09NLCBpdCBoYXMgc2lkZSBlZmZlY3RzIChjYW4KKyAqIG1vZGlmeSBvbmx5IHNvbWUgb2YgdGhlIHN1Yi12YWx1ZXMpLiBPSyBpbiBhIHRlc3Qgc3VpdGUsIGJ1dCB3ZQorICogbmV2ZXIgZG8gdGhpcyBpbiByZWFsIGNvZGUuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorbm9kZV9zZXRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgaWYgKCEoKiBub2RlLT5rbGFzcy0+c2V0X3ZhbHVlKSAobm9kZSwgcmVhZGVyLCByZWFsaWduX3Jvb3QsIHNlZWQpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citub2RlX2J1aWxkX3NpZ25hdHVyZSAoVGVzdFR5cGVOb2RlICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAqc3RyKQoreworICBpZiAobm9kZS0+a2xhc3MtPmJ1aWxkX3NpZ25hdHVyZSkKKyAgICByZXR1cm4gKCogbm9kZS0+a2xhc3MtPmJ1aWxkX3NpZ25hdHVyZSkgKG5vZGUsIHN0cik7CisgIGVsc2UKKyAgICByZXR1cm4gX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChzdHIsIG5vZGUtPmtsYXNzLT50eXBlY29kZSk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbm9kZV9hcHBlbmRfY2hpbGQgKFRlc3RUeXBlTm9kZSAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICBUZXN0VHlwZU5vZGUgKmNoaWxkKQoreworICBUZXN0VHlwZU5vZGVDb250YWluZXIgKmNvbnRhaW5lciA9IChUZXN0VHlwZU5vZGVDb250YWluZXIqKSBub2RlOworCisgIF9kYnVzX2Fzc2VydCAobm9kZS0+a2xhc3MtPmluc3RhbmNlX3NpemUgPj0gKGludCkgc2l6ZW9mIChUZXN0VHlwZU5vZGVDb250YWluZXIpKTsKKworICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmY29udGFpbmVyLT5jaGlsZHJlbiwgY2hpbGQpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOyAvKiB3ZSBuZXZlciBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9uIG5vZGVfYXBwZW5kX2NoaWxkIGFueWhvdyAtIGl0J3MgcnVuIGZyb20gb3V0c2lkZSB0aGUgbWFsbG9jLWZhaWx1cmUgdGVzdCBjb2RlICovCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbm9kZV93cml0ZV9tdWx0aSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgbl9jb3BpZXMpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBfZGJ1c19hc3NlcnQgKG5vZGUtPmtsYXNzLT53cml0ZV9tdWx0aSAhPSBOVUxMKTsKKyAgcmV0dmFsID0gKCogbm9kZS0+a2xhc3MtPndyaXRlX211bHRpKSAobm9kZSwgYmxvY2ssIHdyaXRlciwgc2VlZCwgbl9jb3BpZXMpOworCisjaWYgMAorICAvKiBIYW5keSB0byBzZWUgd2hlcmUgdGhpbmdzIGJyZWFrLCBidXQgdG9vIGV4cGVuc2l2ZSB0byBkbyBhbGwgdGhlIHRpbWUgKi8KKyAgZGF0YV9ibG9ja192ZXJpZnkgKGJsb2NrKTsKKyNlbmRpZgorCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbm9kZV9yZWFkX211bHRpIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBuX2NvcGllcykKK3sKKyAgX2RidXNfYXNzZXJ0IChub2RlLT5rbGFzcy0+cmVhZF9tdWx0aSAhPSBOVUxMKTsKKworICBpZiAoISgqIG5vZGUtPmtsYXNzLT5yZWFkX211bHRpKSAobm9kZSwgcmVhZGVyLCBzZWVkLCBuX2NvcGllcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IG5faXRlcmF0aW9uc19jb21wbGV0ZWRfdG90YWwgPSAwOworc3RhdGljIGludCBuX2l0ZXJhdGlvbnNfY29tcGxldGVkX3RoaXNfdGVzdCA9IDA7CitzdGF0aWMgaW50IG5faXRlcmF0aW9uc19leHBlY3RlZF90aGlzX3Rlc3QgPSAwOworCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBEQnVzU3RyaW5nICAgKnNpZ25hdHVyZTsKKyAgRGF0YUJsb2NrICAgICAgICAgICpibG9jazsKKyAgaW50ICAgICAgICAgICAgICAgICB0eXBlX29mZnNldDsKKyAgVGVzdFR5cGVOb2RlICAgICAgKipub2RlczsKKyAgaW50ICAgICAgICAgICAgICAgICBuX25vZGVzOworfSBOb2RlSXRlcmF0aW9uRGF0YTsKKworc3RhdGljIGRidXNfYm9vbF90CitydW5fdGVzdF9jb3B5IChOb2RlSXRlcmF0aW9uRGF0YSAqbmlkKQoreworICBEYXRhQmxvY2sgKnNyYzsKKyAgRGF0YUJsb2NrIGRlc3Q7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c1R5cGVSZWFkZXIgcmVhZGVyOworICBEQnVzVHlwZVdyaXRlciB3cml0ZXI7CisKKyAgX2RidXNfdmVyYm9zZSAoIlxuIik7CisKKyAgc3JjID0gbmlkLT5ibG9jazsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBpZiAoIWRhdGFfYmxvY2tfaW5pdCAoJmRlc3QsIHNyYy0+Ynl0ZV9vcmRlciwgc3JjLT5pbml0aWFsX29mZnNldCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGRhdGFfYmxvY2tfaW5pdF9yZWFkZXJfd3JpdGVyIChzcmMsICZyZWFkZXIsIE5VTEwpOworICBkYXRhX2Jsb2NrX2luaXRfcmVhZGVyX3dyaXRlciAoJmRlc3QsIE5VTEwsICZ3cml0ZXIpOworCisgIC8qIERCdXNUeXBlV3JpdGVyIGFzc3VtZXMgaXQncyB3cml0aW5nIGludG8gYW4gZXhpc3Rpbmcgc2lnbmF0dXJlLAorICAgKiBzbyBkb2Vzbid0IGFkZCBudWwgb24gaXRzIG93bi4gV2UgaGF2ZSB0byBkbyB0aGF0LgorICAgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGUgKCZkZXN0LnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QuaW5pdGlhbF9vZmZzZXQsICdcMCcpKQorICAgIGdvdG8gb3V0OworCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfcmVhZGVyICgmd3JpdGVyLCAmcmVhZGVyKSkKKyAgICBnb3RvIG91dDsKKworICAvKiBEYXRhIGJsb2NrcyBzaG91bGQgbm93IGJlIGlkZW50aWNhbCAqLworICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbCAoJnNyYy0+c2lnbmF0dXJlLCAmZGVzdC5zaWduYXR1cmUpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTT1VSQ0VcbiIpOworICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZzcmMtPnNpZ25hdHVyZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnNyYy0+c2lnbmF0dXJlKSk7CisgICAgICBfZGJ1c192ZXJib3NlICgiREVTVFxuIik7CisgICAgICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJmRlc3Quc2lnbmF0dXJlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmZGVzdC5zaWduYXR1cmUpKTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNpZ25hdHVyZXMgZGlkIG5vdCBtYXRjaCIpOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbCAoJnNyYy0+Ym9keSwgJmRlc3QuYm9keSkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIlNPVVJDRVxuIik7CisgICAgICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJnNyYy0+Ym9keSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnNyYy0+Ym9keSkpOworICAgICAgX2RidXNfdmVyYm9zZSAoIkRFU1RcbiIpOworICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZkZXN0LmJvZHksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZkZXN0LmJvZHkpKTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImJvZGllcyBkaWQgbm90IG1hdGNoIik7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisKKyAgZGF0YV9ibG9ja19mcmVlICgmZGVzdCk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitydW5fdGVzdF92YWx1ZXNfb25seV93cml0ZSAoTm9kZUl0ZXJhdGlvbkRhdGEgKm5pZCkKK3sKKyAgREJ1c1R5cGVSZWFkZXIgcmVhZGVyOworICBEQnVzVHlwZVdyaXRlciB3cml0ZXI7CisgIGludCBpOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGludCBzaWdfbGVuOworCisgIF9kYnVzX3ZlcmJvc2UgKCJcbiIpOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIGRhdGFfYmxvY2tfcmVzZXQgKG5pZC0+YmxvY2spOworCisgIHNpZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAobmlkLT5zaWduYXR1cmUpOworCisgIF9kYnVzX3R5cGVfd3JpdGVyX2luaXRfdmFsdWVzX29ubHkgKCZ3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pZC0+YmxvY2stPmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pZC0+c2lnbmF0dXJlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmlkLT5ibG9jay0+Ym9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZuaWQtPmJsb2NrLT5ib2R5KSAtIE5fRkVOQ0VfQllURVMpOworICBfZGJ1c190eXBlX3JlYWRlcl9pbml0ICgmcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuaWQtPmJsb2NrLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuaWQtPnNpZ25hdHVyZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5pZC0+YmxvY2stPmJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5pZC0+YmxvY2stPmluaXRpYWxfb2Zmc2V0KTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBuaWQtPm5fbm9kZXMpCisgICAgeworICAgICAgaWYgKCFub2RlX3dyaXRlX3ZhbHVlIChuaWQtPm5vZGVzW2ldLCBuaWQtPmJsb2NrLCAmd3JpdGVyLCBpKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgLyogaWYgd2Ugd3JvdGUgYW55IHR5cGVjb2RlcyB0aGVuIHRoaXMgd291bGQgZmFpbCAqLworICBfZGJ1c19hc3NlcnQgKHNpZ19sZW4gPT0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKG5pZC0+c2lnbmF0dXJlKSk7CisKKyAgLyogQnV0IGJlIHN1cmUgd2Ugd3JvdGUgb3V0IHRoZSB2YWx1ZXMgY29ycmVjdGx5ICovCisgIGkgPSAwOworICB3aGlsZSAoaSA8IG5pZC0+bl9ub2RlcykKKyAgICB7CisgICAgICBpZiAoIW5vZGVfcmVhZF92YWx1ZSAobmlkLT5ub2Rlc1tpXSwgJnJlYWRlciwgaSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBpZiAoaSArIDEgPT0gbmlkLT5uX25vZGVzKQorICAgICAgICBORVhUX0VYUEVDVElOR19GQUxTRSAoJnJlYWRlcik7CisgICAgICBlbHNlCisgICAgICAgIE5FWFRfRVhQRUNUSU5HX1RSVUUgKCZyZWFkZXIpOworCisgICAgICArK2k7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGRhdGFfYmxvY2tfcmVzZXQgKG5pZC0+YmxvY2spOworICByZXR1cm4gcmV0dmFsOworfQorCisvKiBvZmZzZXQgdGhlIHNlZWQgZm9yIHNldHRpbmcsIHNvIHdlIHNldCBkaWZmZXJlbnQgbnVtYmVycyB0aGFuCisgKiB3ZSBvcmlnaW5hbGx5IHdyb3RlLiBEb24ndCBvZmZzZXQgYnkgYSBodWdlIG51bWJlciBzaW5jZSBpbgorICogc29tZSBjYXNlcyBpdCdzIHZhbHVlID0gcG9zc2liaWxpdGllc1tzZWVkICUgbl9wb3NzaWJpbGl0aWVzXQorICogYW5kIHdlIGRvbid0IHdhbnQgdG8gd3JhcCBhcm91bmQuIGJvb2xfZnJvbV9zZWVkCisgKiBpcyBqdXN0IHNlZWQgJSAyIGV2ZW4uCisgKi8KKyNkZWZpbmUgU0VUX1NFRUQgMQorc3RhdGljIGRidXNfYm9vbF90CitydW5fdGVzdF9zZXRfdmFsdWVzIChOb2RlSXRlcmF0aW9uRGF0YSAqbmlkKQoreworICBEQnVzVHlwZVJlYWRlciByZWFkZXI7CisgIERCdXNUeXBlUmVhZGVyIHJlYWxpZ25fcm9vdDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBpbnQgaTsKKworICBfZGJ1c192ZXJib3NlICgiXG4iKTsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBkYXRhX2Jsb2NrX2luaXRfcmVhZGVyX3dyaXRlciAobmlkLT5ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFkZXIsIE5VTEwpOworCisgIHJlYWxpZ25fcm9vdCA9IHJlYWRlcjsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBuaWQtPm5fbm9kZXMpCisgICAgeworICAgICAgaWYgKCFub2RlX3NldF92YWx1ZSAobmlkLT5ub2Rlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFkZXIsICZyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpICsgU0VUX1NFRUQpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaWYgKGkgKyAxID09IG5pZC0+bl9ub2RlcykKKyAgICAgICAgTkVYVF9FWFBFQ1RJTkdfRkFMU0UgKCZyZWFkZXIpOworICAgICAgZWxzZQorICAgICAgICBORVhUX0VYUEVDVElOR19UUlVFICgmcmVhZGVyKTsKKworICAgICAgKytpOworICAgIH0KKworICAvKiBDaGVjayB0aGF0IHRoZSBuZXcgdmFsdWVzIHdlcmUgc2V0ICovCisKKyAgcmVhZGVyID0gcmVhbGlnbl9yb290OworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IG5pZC0+bl9ub2RlcykKKyAgICB7CisgICAgICBpZiAoIW5vZGVfcmVhZF92YWx1ZSAobmlkLT5ub2Rlc1tpXSwgJnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICsgU0VUX1NFRUQpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaWYgKGkgKyAxID09IG5pZC0+bl9ub2RlcykKKyAgICAgICAgTkVYVF9FWFBFQ1RJTkdfRkFMU0UgKCZyZWFkZXIpOworICAgICAgZWxzZQorICAgICAgICBORVhUX0VYUEVDVElOR19UUlVFICgmcmVhZGVyKTsKKworICAgICAgKytpOworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3J1bl90ZXN0X2RlbGV0ZV92YWx1ZXMgKE5vZGVJdGVyYXRpb25EYXRhICpuaWQpCit7CisgIERCdXNUeXBlUmVhZGVyIHJlYWRlcjsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBpbnQgdDsKKworICBfZGJ1c192ZXJib3NlICgiXG4iKTsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBkYXRhX2Jsb2NrX2luaXRfcmVhZGVyX3dyaXRlciAobmlkLT5ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFkZXIsIE5VTEwpOworCisgIHdoaWxlICgodCA9IF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZyZWFkZXIpKSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICB7CisgICAgICAvKiBSaWdodCBub3csIGRlbGV0aW5nIG9ubHkgd29ya3Mgb24gYXJyYXkgZWxlbWVudHMuICBXZSBkZWxldGUKKyAgICAgICAqIGFsbCBhcnJheSBlbGVtZW50cywgYW5kIHRoZW4gdmVyaWZ5IHRoYXQgdGhlcmUgYXJlbid0IGFueQorICAgICAgICogbGVmdC4KKyAgICAgICAqLworICAgICAgaWYgKHQgPT0gREJVU19UWVBFX0FSUkFZKQorICAgICAgICB7CisgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgYXJyYXk7CisgICAgICAgICAgaW50IG5fZWxlbWVudHM7CisgICAgICAgICAgaW50IGVsZW1fdHlwZTsKKworICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKCZyZWFkZXIsICZhcnJheSk7CisgICAgICAgICAgbl9lbGVtZW50cyA9IDA7CisgICAgICAgICAgd2hpbGUgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZhcnJheSkgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG5fZWxlbWVudHMgKz0gMTsKKyAgICAgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoJmFycmF5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8qIHJlc2V0IHRvIHN0YXJ0IG9mIGFycmF5ICovCisgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAoJnJlYWRlciwgJmFycmF5KTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgicmVjdXJzaW5nIGludG8gZGVsZXRpb24gbG9vcCByZWFkZXIudmFsdWVfcG9zID0gJWQgYXJyYXkudmFsdWVfcG9zID0gJWQgYXJyYXkudS5zdGFydF9wb3MgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIudmFsdWVfcG9zLCBhcnJheS52YWx1ZV9wb3MsIGFycmF5LnUuYXJyYXkuc3RhcnRfcG9zKTsKKyAgICAgICAgICB3aGlsZSAoKGVsZW1fdHlwZSA9IF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZhcnJheSkpICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBXZSBkb24ndCB3YW50IHRvIGFsd2F5cyBkZWxldGUgZnJvbSB0aGUgc2FtZSBwYXJ0IG9mIHRoZSBhcnJheS4gKi8KKyAgICAgICAgICAgICAgc3RhdGljIGludCBjeWNsZSA9IDA7CisgICAgICAgICAgICAgIGludCBlbGVtOworCisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAobl9lbGVtZW50cyA+IDApOworCisgICAgICAgICAgICAgIGVsZW0gPSBjeWNsZTsKKyAgICAgICAgICAgICAgaWYgKGVsZW0gPT0gMyB8fCBlbGVtID49IG5fZWxlbWVudHMpIC8qIGVuZCBvZiBhcnJheSAqLworICAgICAgICAgICAgICAgIGVsZW0gPSBuX2VsZW1lbnRzIC0gMTsKKworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiZGVsZXRpbmcgYXJyYXkgZWxlbWVudCAlZCBvZiAlZCB0eXBlICVzIGN5Y2xlICVkIHJlYWRlciBwb3MgJWQgZWxlbSBwb3MgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0sIG5fZWxlbWVudHMsIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChlbGVtX3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeWNsZSwgcmVhZGVyLnZhbHVlX3BvcywgYXJyYXkudmFsdWVfcG9zKTsKKyAgICAgICAgICAgICAgd2hpbGUgKGVsZW0gPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICghX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoJmFycmF5KSkKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2hvdWxkIGhhdmUgaGFkIGFub3RoZXIgZWxlbWVudFxuIik7CisgICAgICAgICAgICAgICAgICAtLWVsZW07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmICghX2RidXNfdHlwZV9yZWFkZXJfZGVsZXRlICgmYXJyYXksICZyZWFkZXIpKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworCisgICAgICAgICAgICAgIG5fZWxlbWVudHMgLT0gMTsKKworICAgICAgICAgICAgICAvKiByZXNldCAqLworICAgICAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlICgmcmVhZGVyLCAmYXJyYXkpOworCisgICAgICAgICAgICAgIGlmIChjeWNsZSA+IDIpCisgICAgICAgICAgICAgICAgY3ljbGUgPSAwOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY3ljbGUgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoJnJlYWRlcik7CisgICAgfQorCisgIC8qIENoZWNrIHRoYXQgdGhlcmUgYXJlIG5vIGFycmF5IGVsZW1lbnRzIGxlZnQgKi8KKyAgZGF0YV9ibG9ja19pbml0X3JlYWRlcl93cml0ZXIgKG5pZC0+YmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhZGVyLCBOVUxMKTsKKworICB3aGlsZSAoKHQgPSBfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmcmVhZGVyKSkgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgeworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoJnJlYWRlcik7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcnVuX3Rlc3Rfbm9kZXNfaXRlcmF0aW9uICh2b2lkICpkYXRhKQoreworICBOb2RlSXRlcmF0aW9uRGF0YSAqbmlkID0gZGF0YTsKKyAgREJ1c1R5cGVSZWFkZXIgcmVhZGVyOworICBEQnVzVHlwZVdyaXRlciB3cml0ZXI7CisgIGludCBpOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgLyogU3R1ZmYgdG8gZG86CisgICAqIDEuIHdyaXRlIHRoZSB2YWx1ZQorICAgKiAyLiBzdHJjbXAtY29tcGFyZSB3aXRoIHRoZSBzaWduYXR1cmUgd2UgYnVpbHQKKyAgICogMy4gcmVhZCB0aGUgdmFsdWUKKyAgICogNC4gdHlwZS1pdGVyYXRlIHRoZSBzaWduYXR1cmUgYW5kIHRoZSB2YWx1ZSBhbmQgc2VlIGlmIHRoZXkgYXJlIHRoZSBzYW1lIHR5cGUtd2lzZQorICAgKi8KKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgZGF0YV9ibG9ja19pbml0X3JlYWRlcl93cml0ZXIgKG5pZC0+YmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhZGVyLCAmd3JpdGVyKTsKKworICAvKiBEQnVzVHlwZVdyaXRlciBhc3N1bWVzIGl0J3Mgd3JpdGluZyBpbnRvIGFuIGV4aXN0aW5nIHNpZ25hdHVyZSwKKyAgICogc28gZG9lc24ndCBhZGQgbnVsIG9uIGl0cyBvd24uIFdlIGhhdmUgdG8gZG8gdGhhdC4KKyAgICovCisgIGlmICghX2RidXNfc3RyaW5nX2luc2VydF9ieXRlICgmbmlkLT5ibG9jay0+c2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlkLT50eXBlX29mZnNldCwgJ1wwJykpCisgICAgZ290byBvdXQ7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbmlkLT5uX25vZGVzKQorICAgIHsKKyAgICAgIGlmICghbm9kZV93cml0ZV92YWx1ZSAobmlkLT5ub2Rlc1tpXSwgbmlkLT5ibG9jaywgJndyaXRlciwgaSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICArK2k7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAobmlkLT5zaWduYXR1cmUsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChuaWQtPnNpZ25hdHVyZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5pZC0+YmxvY2stPnNpZ25hdHVyZSwgbmlkLT50eXBlX29mZnNldCkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkV4cGVjdGVkIHNpZ25hdHVyZSAnJXMnIGFuZCBnb3QgJyVzJyB3aXRoIGluaXRpYWwgb2Zmc2V0ICVkXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChuaWQtPnNpZ25hdHVyZSksCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuICgmbmlkLT5ibG9jay0+c2lnbmF0dXJlLCBuaWQtPnR5cGVfb2Zmc2V0LCAwKSwKKyAgICAgICAgICAgICAgICAgIG5pZC0+dHlwZV9vZmZzZXQpOworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgid3Jvbmcgc2lnbmF0dXJlIik7CisgICAgfQorCisgIGkgPSAwOworICB3aGlsZSAoaSA8IG5pZC0+bl9ub2RlcykKKyAgICB7CisgICAgICBpZiAoIW5vZGVfcmVhZF92YWx1ZSAobmlkLT5ub2Rlc1tpXSwgJnJlYWRlciwgaSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBpZiAoaSArIDEgPT0gbmlkLT5uX25vZGVzKQorICAgICAgICBORVhUX0VYUEVDVElOR19GQUxTRSAoJnJlYWRlcik7CisgICAgICBlbHNlCisgICAgICAgIE5FWFRfRVhQRUNUSU5HX1RSVUUgKCZyZWFkZXIpOworCisgICAgICArK2k7CisgICAgfQorCisgIGlmIChuX2l0ZXJhdGlvbnNfZXhwZWN0ZWRfdGhpc190ZXN0IDw9IE1BWF9JVEVSQVRJT05TX0ZPUl9FWFBFTlNJVkVfVEVTVFMpCisgICAgeworICAgICAgLyogdGhpcyBzZXQgdmFsdWVzIHRlc3QgdXNlcyBjb2RlIGZyb20gY29weSBhbmQKKyAgICAgICAqIHZhbHVlc19vbmx5X3dyaXRlIHNvIHdvdWxkIGlkZWFsbHkgYmUgbGFzdCBzbyB5b3UgZ2V0IGEKKyAgICAgICAqIHNpbXBsZXIgdGVzdCBjYXNlIGZvciBwcm9ibGVtcyB3aXRoIGNvcHlpbmcgb3IgdmFsdWVzX29ubHkKKyAgICAgICAqIHdyaXRpbmc7IGJ1dCBpdCBhbHNvIG5lZWRzIGFuIGFscmVhZHktd3JpdHRlbiBEYXRhQmxvY2sgc28gaXQKKyAgICAgICAqIGhhcyB0byBnbyBmaXJzdC4gQ29tbWVudCBpdCBvdXQgaWYgaXQgYnJlYWtzLCBhbmQgc2VlIGlmIHRoZQorICAgICAgICogbGF0ZXIgdGVzdHMgYWxzbyBicmVhayAtIGRlYnVnIHRoZW0gZmlyc3QgaWYgc28uCisgICAgICAgKi8KKyAgICAgIGlmICghcnVuX3Rlc3Rfc2V0X3ZhbHVlcyAobmlkKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGlmICghcnVuX3Rlc3RfZGVsZXRlX3ZhbHVlcyAobmlkKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGlmICghcnVuX3Rlc3RfY29weSAobmlkKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGlmICghcnVuX3Rlc3RfdmFsdWVzX29ubHlfd3JpdGUgKG5pZCkpCisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAvKiBGSVhNRSB0eXBlLWl0ZXJhdGUgYm90aCBzaWduYXR1cmUgYW5kIHZhbHVlIGFuZCBjb21wYXJlIHRoZSByZXN1bHRpbmcKKyAgICogdHJlZSB0byB0aGUgbm9kZSB0cmVlIHBlcmhhcHMKKyAgICovCisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKworICBkYXRhX2Jsb2NrX3Jlc2V0IChuaWQtPmJsb2NrKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZAorcnVuX3Rlc3Rfbm9kZXNfaW5fb25lX2NvbmZpZ3VyYXRpb24gKFRlc3RUeXBlTm9kZSAgICAqKm5vZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIG5fbm9kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgaW5pdGlhbF9vZmZzZXQpCit7CisgIERhdGFCbG9jayBibG9jazsKKyAgTm9kZUl0ZXJhdGlvbkRhdGEgbmlkOworCisgIGlmICghZGF0YV9ibG9ja19pbml0ICgmYmxvY2ssIGJ5dGVfb3JkZXIsIGluaXRpYWxfb2Zmc2V0KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICBuaWQuc2lnbmF0dXJlID0gc2lnbmF0dXJlOworICBuaWQuYmxvY2sgPSAmYmxvY2s7CisgIG5pZC50eXBlX29mZnNldCA9IGluaXRpYWxfb2Zmc2V0OworICBuaWQubm9kZXMgPSBub2RlczsKKyAgbmlkLm5fbm9kZXMgPSBuX25vZGVzOworCisgIGlmIChURVNUX09PTV9IQU5ETElORyAmJgorICAgICAgbl9pdGVyYXRpb25zX2V4cGVjdGVkX3RoaXNfdGVzdCA8PSBNQVhfSVRFUkFUSU9OU19GT1JfRVhQRU5TSVZFX1RFU1RTKQorICAgIHsKKyAgICAgIF9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nICgicnVubmluZyB0ZXN0IG5vZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl90ZXN0X25vZGVzX2l0ZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmlkKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIXJ1bl90ZXN0X25vZGVzX2l0ZXJhdGlvbiAoJm5pZCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworICAgIH0KKworICBkYXRhX2Jsb2NrX2ZyZWUgKCZibG9jayk7Cit9CisKK3N0YXRpYyB2b2lkCitydW5fdGVzdF9ub2RlcyAoVGVzdFR5cGVOb2RlICoqbm9kZXMsCisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgbl9ub2RlcykKK3sKKyAgaW50IGk7CisgIERCdXNTdHJpbmcgc2lnbmF0dXJlOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzaWduYXR1cmUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IG5fbm9kZXMpCisgICAgeworICAgICAgaWYgKCEgbm9kZV9idWlsZF9zaWduYXR1cmUgKG5vZGVzW2ldLCAmc2lnbmF0dXJlKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIj4+PiB0ZXN0IG5vZGVzIHdpdGggc2lnbmF0dXJlICclcydcbiIsCisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnNpZ25hdHVyZSkpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8PSBNQVhfSU5JVElBTF9PRkZTRVQpCisgICAgeworICAgICAgcnVuX3Rlc3Rfbm9kZXNfaW5fb25lX2NvbmZpZ3VyYXRpb24gKG5vZGVzLCBuX25vZGVzLCAmc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfTElUVExFX0VORElBTiwgaSk7CisgICAgICBydW5fdGVzdF9ub2Rlc19pbl9vbmVfY29uZmlndXJhdGlvbiAobm9kZXMsIG5fbm9kZXMsICZzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19CSUdfRU5ESUFOLCBpKTsKKworICAgICAgKytpOworICAgIH0KKworICBuX2l0ZXJhdGlvbnNfY29tcGxldGVkX3RoaXNfdGVzdCArPSAxOworICBuX2l0ZXJhdGlvbnNfY29tcGxldGVkX3RvdGFsICs9IDE7CisKKyAgaWYgKG5faXRlcmF0aW9uc19jb21wbGV0ZWRfdGhpc190ZXN0ID09IG5faXRlcmF0aW9uc19leHBlY3RlZF90aGlzX3Rlc3QpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIDEwMCUlICVkIHRoaXMgdGVzdCAoJWQgY3VtdWxhdGl2ZSlcbiIsCisgICAgICAgICAgICAgICBuX2l0ZXJhdGlvbnNfY29tcGxldGVkX3RoaXNfdGVzdCwKKyAgICAgICAgICAgICAgIG5faXRlcmF0aW9uc19jb21wbGV0ZWRfdG90YWwpOworICAgIH0KKyAgLyogdGhpcyBoYXBwZW5zIHRvIHR1cm4gb3V0IHdlbGwgd2l0aCBtb2QgPT0gMSAqLworICBlbHNlIGlmICgobl9pdGVyYXRpb25zX2NvbXBsZXRlZF90aGlzX3Rlc3QgJQorICAgICAgICAgICAgKGludCkobl9pdGVyYXRpb25zX2V4cGVjdGVkX3RoaXNfdGVzdCAvIDEwLjApKSA9PSAxKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAlZCUlICIsIChpbnQpIChuX2l0ZXJhdGlvbnNfY29tcGxldGVkX3RoaXNfdGVzdCAvIChkb3VibGUpIG5faXRlcmF0aW9uc19leHBlY3RlZF90aGlzX3Rlc3QgKiAxMDApKTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzaWduYXR1cmUpOworfQorCisjZGVmaW5lIE5fVkFMVUVTIChOX0JBU0lDUyAqIE5fQ09OVEFJTkVSUyArIE5fQkFTSUNTKQorCitzdGF0aWMgVGVzdFR5cGVOb2RlKgordmFsdWVfZ2VuZXJhdG9yIChpbnQgKmlwKQoreworICBpbnQgaSA9ICppcDsKKyAgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgKmNoaWxkX2tsYXNzOworICBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyAqY29udGFpbmVyX2tsYXNzOworICBUZXN0VHlwZU5vZGUgKmNoaWxkOworICBUZXN0VHlwZU5vZGUgKm5vZGU7CisKKyAgX2RidXNfYXNzZXJ0IChpIDw9IE5fVkFMVUVTKTsKKworICBpZiAoaSA9PSBOX1ZBTFVFUykKKyAgICB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIGVsc2UgaWYgKGkgPCBOX0JBU0lDUykKKyAgICB7CisgICAgICBub2RlID0gbm9kZV9uZXcgKGJhc2ljX25vZGVzW2ldKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBpbWFnaW5lIGFuIGFycmF5OgorICAgICAgICogY29udGFpbmVyIDAgb2YgYmFzaWMgMAorICAgICAgICogY29udGFpbmVyIDAgb2YgYmFzaWMgMQorICAgICAgICogY29udGFpbmVyIDAgb2YgYmFzaWMgMgorICAgICAgICogY29udGFpbmVyIDEgb2YgYmFzaWMgMAorICAgICAgICogY29udGFpbmVyIDEgb2YgYmFzaWMgMQorICAgICAgICogY29udGFpbmVyIDEgb2YgYmFzaWMgMgorICAgICAgICovCisgICAgICBpIC09IE5fQkFTSUNTOworCisgICAgICBjb250YWluZXJfa2xhc3MgPSBjb250YWluZXJfbm9kZXNbaSAvIE5fQkFTSUNTXTsKKyAgICAgIGNoaWxkX2tsYXNzID0gYmFzaWNfbm9kZXNbaSAlIE5fQkFTSUNTXTsKKworICAgICAgbm9kZSA9IG5vZGVfbmV3IChjb250YWluZXJfa2xhc3MpOworICAgICAgY2hpbGQgPSBub2RlX25ldyAoY2hpbGRfa2xhc3MpOworCisgICAgICBub2RlX2FwcGVuZF9jaGlsZCAobm9kZSwgY2hpbGQpOworICAgIH0KKworICAqaXAgKz0gMTsgLyogaW5jcmVtZW50IHRoZSBnZW5lcmF0b3IgKi8KKworICByZXR1cm4gbm9kZTsKK30KKworc3RhdGljIHZvaWQKK2J1aWxkX2JvZHkgKFRlc3RUeXBlTm9kZSAqKm5vZGVzLAorICAgICAgICAgICAgaW50ICAgICAgICAgICAgbl9ub2RlcywKKyAgICAgICAgICAgIGludCAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICBEQnVzU3RyaW5nICAgICpzaWduYXR1cmUsCisgICAgICAgICAgICBEQnVzU3RyaW5nICAgICpib2R5KQoreworICBpbnQgaTsKKyAgRGF0YUJsb2NrIGJsb2NrOworICBEQnVzVHlwZVJlYWRlciByZWFkZXI7CisgIERCdXNUeXBlV3JpdGVyIHdyaXRlcjsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBuX25vZGVzKQorICAgIHsKKyAgICAgIGlmICghIG5vZGVfYnVpbGRfc2lnbmF0dXJlIChub2Rlc1tpXSwgc2lnbmF0dXJlKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisgICAgICAKKyAgICAgICsraTsKKyAgICB9CisKKyAgaWYgKCFkYXRhX2Jsb2NrX2luaXQgKCZibG9jaywgYnl0ZV9vcmRlciwgMCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisgIAorICBkYXRhX2Jsb2NrX2luaXRfcmVhZGVyX3dyaXRlciAoJmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWRlciwgJndyaXRlcik7CisgIAorICAvKiBEQnVzVHlwZVdyaXRlciBhc3N1bWVzIGl0J3Mgd3JpdGluZyBpbnRvIGFuIGV4aXN0aW5nIHNpZ25hdHVyZSwKKyAgICogc28gZG9lc24ndCBhZGQgbnVsIG9uIGl0cyBvd24uIFdlIGhhdmUgdG8gZG8gdGhhdC4KKyAgICovCisgIGlmICghX2RidXNfc3RyaW5nX2luc2VydF9ieXRlICgmYmxvY2suc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJ1wwJykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbl9ub2RlcykKKyAgICB7CisgICAgICBpZiAoIW5vZGVfd3JpdGVfdmFsdWUgKG5vZGVzW2ldLCAmYmxvY2ssICZ3cml0ZXIsIGkpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICAgICAgKytpOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoJmJsb2NrLmJvZHksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJsb2NrLmJvZHkpIC0gTl9GRU5DRV9CWVRFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksIDApKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIGRhdGFfYmxvY2tfZnJlZSAoJmJsb2NrKTsgIAorfQorCitkYnVzX2Jvb2xfdAorZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX2dlbmVyYXRlX2JvZGllcyAoaW50ICAgICAgICAgICBzZXF1ZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAqc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICpib2R5KQoreworICBUZXN0VHlwZU5vZGUgKm5vZGVzWzFdOworICBpbnQgaTsKKyAgaW50IG5fbm9kZXM7CisKKyAgbm9kZXNbMF0gPSB2YWx1ZV9nZW5lcmF0b3IgKCZzZXF1ZW5jZSk7CisKKyAgaWYgKG5vZGVzWzBdID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIG5fbm9kZXMgPSAxOworICAKKyAgYnVpbGRfYm9keSAobm9kZXMsIG5fbm9kZXMsIGJ5dGVfb3JkZXIsIHNpZ25hdHVyZSwgYm9keSk7CisKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBuX25vZGVzKQorICAgIHsKKyAgICAgIG5vZGVfZGVzdHJveSAobm9kZXNbaV0pOworICAgICAgKytpOworICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorbWFrZV9hbmRfcnVuX3ZhbHVlc19pbnNpZGVfY29udGFpbmVyIChjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyAqY29udGFpbmVyX2tsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgbl9uZXN0ZWQpCit7CisgIFRlc3RUeXBlTm9kZSAqcm9vdDsKKyAgVGVzdFR5cGVOb2RlICpjb250YWluZXI7CisgIFRlc3RUeXBlTm9kZSAqY2hpbGQ7CisgIGludCBpOworCisgIHJvb3QgPSBub2RlX25ldyAoY29udGFpbmVyX2tsYXNzKTsKKyAgY29udGFpbmVyID0gcm9vdDsKKyAgZm9yIChpID0gMTsgaSA8IG5fbmVzdGVkOyBpKyspCisgICAgeworICAgICAgY2hpbGQgPSBub2RlX25ldyAoY29udGFpbmVyX2tsYXNzKTsKKyAgICAgIG5vZGVfYXBwZW5kX2NoaWxkIChjb250YWluZXIsIGNoaWxkKTsKKyAgICAgIGNvbnRhaW5lciA9IGNoaWxkOworICAgIH0KKworICAvKiBjb250YWluZXIgc2hvdWxkIG5vdyBiZSB0aGUgbW9zdC1uZXN0ZWQgY29udGFpbmVyICovCisKKyAgaSA9IDA7CisgIHdoaWxlICgoY2hpbGQgPSB2YWx1ZV9nZW5lcmF0b3IgKCZpKSkpCisgICAgeworICAgICAgbm9kZV9hcHBlbmRfY2hpbGQgKGNvbnRhaW5lciwgY2hpbGQpOworCisgICAgICBydW5fdGVzdF9ub2RlcyAoJnJvb3QsIDEpOworCisgICAgICBfZGJ1c19saXN0X2NsZWFyICgmKChUZXN0VHlwZU5vZGVDb250YWluZXIqKWNvbnRhaW5lciktPmNoaWxkcmVuKTsKKyAgICAgIG5vZGVfZGVzdHJveSAoY2hpbGQpOworICAgIH0KKworICBub2RlX2Rlc3Ryb3kgKHJvb3QpOworfQorCitzdGF0aWMgdm9pZAorc3RhcnRfbmV4dF90ZXN0IChjb25zdCBjaGFyICpmb3JtYXQsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGV4cGVjdGVkKQoreworICBuX2l0ZXJhdGlvbnNfY29tcGxldGVkX3RoaXNfdGVzdCA9IDA7CisgIG5faXRlcmF0aW9uc19leHBlY3RlZF90aGlzX3Rlc3QgPSBleHBlY3RlZDsKKworICBmcHJpbnRmIChzdGRlcnIsICI+Pj4gPj4+ICIpOworICBmcHJpbnRmIChzdGRlcnIsIGZvcm1hdCwKKyAgICAgICAgICAgbl9pdGVyYXRpb25zX2V4cGVjdGVkX3RoaXNfdGVzdCk7Cit9CisKK3N0YXRpYyB2b2lkCittYWtlX2FuZF9ydW5fdGVzdF9ub2RlcyAodm9pZCkKK3sKKyAgaW50IGksIGosIGssIG07CisKKyAgLyogV2UgdHJ5IHRvIGRvIHRoaXMgaW4gb3JkZXIgb2YgImNvbXBsaWNhdGVkbmVzcyIgc28gdGhhdCB0ZXN0CisgICAqIGZhaWx1cmVzIHRlbmQgdG8gc2hvdyB1cCBpbiB0aGUgc2ltcGxlc3QgdGVzdCBjYXNlIHRoYXQKKyAgICogZGVtb25zdHJhdGVzIHRoZSBmYWlsdXJlLiAgVGhlcmUgYXJlIGFsc28gc29tZSB0ZXN0cyB0aGF0IHJ1bgorICAgKiBtb3JlIHRoYW4gb25jZSBmb3IgdGhpcyByZWFzb24sIGZpcnN0IHdoaWxlIGdvaW5nIHRocm91Z2ggc2ltcGxlCisgICAqIGNhc2VzLCBzZWNvbmQgd2hpbGUgZ29pbmcgdGhyb3VnaCBhIGJyb2FkZXIgcmFuZ2Ugb2YgY29tcGxleAorICAgKiBjYXNlcy4KKyAgICovCisgIC8qIEVhY2ggYmFzaWMgbm9kZS4gVGhlIGJhc2ljIG5vZGVzIHNob3VsZCBpbmNsdWRlOgorICAgKgorICAgKiAtIGVhY2ggZml4ZWQtc2l6ZSB0eXBlIChpbiBzdWNoIGEgd2F5IHRoYXQgaXQgaGFzIGRpZmZlcmVudCB2YWx1ZXMgZWFjaCB0aW1lLAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBzbyB3ZSBjYW4gdGVsbCBpZiB3ZSBtaXggdHdvIG9mIHRoZW0gdXApCisgICAqIC0gc3RyaW5ncyBvZiB2YXJpb3VzIGxlbmd0aHMKKyAgICogLSBvYmplY3QgcGF0aAorICAgKiAtIHNpZ25hdHVyZQorICAgKi8KKyAgLyogRWFjaCBjb250YWluZXIgbm9kZS4gVGhlIGNvbnRhaW5lciBub2RlcyBzaG91bGQgaW5jbHVkZToKKyAgICoKKyAgICogIHN0cnVjdCB3aXRoIDEgYW5kIDIgY29waWVzIG9mIHRoZSBjb250YWluZWQgaXRlbQorICAgKiAgYXJyYXkgd2l0aCAwLCAxLCAyIGNvcGllcyBvZiB0aGUgY29udGFpbmVkIGl0ZW0KKyAgICogIHZhcmlhbnQKKyAgICovCisgIC8qICBMZXQgYSAidmFsdWUiIGJlIGEgYmFzaWMgbm9kZSwgb3IgYSBjb250YWluZXIgY29udGFpbmluZyBhIHNpbmdsZSBiYXNpYyBub2RlLgorICAgKiAgTGV0IG5fdmFsdWVzIGJlIHRoZSBudW1iZXIgb2Ygc3VjaCB2YWx1ZXMgaS5lLiAobl9jb250YWluZXIgKiBuX2Jhc2ljICsgbl9iYXNpYykKKyAgICogIFdoZW4gaXRlcmF0aW5nIHRocm91Z2ggYWxsIHZhbHVlcyB0byBtYWtlIGNvbWJpbmF0aW9ucywgZG8gdGhlIGJhc2ljIHR5cGVzCisgICAqICBmaXJzdCBhbmQgdGhlIGNvbnRhaW5lcnMgc2Vjb25kLgorICAgKi8KKyAgLyogRWFjaCBpdGVtIGlzIHNob3duIHdpdGggaXRzIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIGNvbXBsZXRlIHNvCisgICAqIHdlIGNhbiBrZWVwIGEgaGFuZGxlIG9uIHRoaXMgdW5pdCB0ZXN0CisgICAqLworCisgIC8qIEZJWE1FIHRlc3QganVzdCBhbiBlbXB0eSBib2R5LCBubyB0eXBlcyBhdCBhbGwgKi8KKworICBzdGFydF9uZXh0X3Rlc3QgKCJFYWNoIHZhbHVlIGJ5IGl0c2VsZiAlZCBpdGVyYXRpb25zXG4iLCBOX1ZBTFVFUyk7CisgIHsKKyAgICBUZXN0VHlwZU5vZGUgKm5vZGU7CisgICAgaSA9IDA7CisgICAgd2hpbGUgKChub2RlID0gdmFsdWVfZ2VuZXJhdG9yICgmaSkpKQorICAgICAgeworICAgICAgICBydW5fdGVzdF9ub2RlcyAoJm5vZGUsIDEpOworCisgICAgICAgIG5vZGVfZGVzdHJveSAobm9kZSk7CisgICAgICB9CisgIH0KKworICBzdGFydF9uZXh0X3Rlc3QgKCJFYWNoIHZhbHVlIGJ5IGl0c2VsZiB3aXRoIGFycmF5cyBhcyBibG9ja3MgJWQgaXRlcmF0aW9uc1xuIiwgTl9WQUxVRVMpOworICBhcnJheXNfd3JpdGVfZml4ZWRfaW5fYmxvY2tzID0gVFJVRTsKKyAgeworICAgIFRlc3RUeXBlTm9kZSAqbm9kZTsKKyAgICBpID0gMDsKKyAgICB3aGlsZSAoKG5vZGUgPSB2YWx1ZV9nZW5lcmF0b3IgKCZpKSkpCisgICAgICB7CisgICAgICAgIHJ1bl90ZXN0X25vZGVzICgmbm9kZSwgMSk7CisKKyAgICAgICAgbm9kZV9kZXN0cm95IChub2RlKTsKKyAgICAgIH0KKyAgfQorICBhcnJheXNfd3JpdGVfZml4ZWRfaW5fYmxvY2tzID0gRkFMU0U7CisKKyAgc3RhcnRfbmV4dF90ZXN0ICgiQWxsIHZhbHVlcyBpbiBvbmUgYmlnIHRvcGxldmVsICVkIGl0ZXJhdGlvblxuIiwgMSk7CisgIHsKKyAgICBUZXN0VHlwZU5vZGUgKm5vZGVzW05fVkFMVUVTXTsKKworICAgIGkgPSAwOworICAgIHdoaWxlICgobm9kZXNbaV0gPSB2YWx1ZV9nZW5lcmF0b3IgKCZpKSkpCisgICAgICA7CisKKyAgICBydW5fdGVzdF9ub2RlcyAobm9kZXMsIE5fVkFMVUVTKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOX1ZBTFVFUzsgaSsrKQorICAgICAgbm9kZV9kZXN0cm95IChub2Rlc1tpXSk7CisgIH0KKworICBzdGFydF9uZXh0X3Rlc3QgKCJFYWNoIHZhbHVlLHZhbHVlIHBhaXIgY29tYmluYXRpb24gYXMgdG9wbGV2ZWwsIGluIGJvdGggb3JkZXJzICVkIGl0ZXJhdGlvbnNcbiIsCisgICAgICAgICAgICAgICAgICAgTl9WQUxVRVMgKiBOX1ZBTFVFUyk7CisgIHsKKyAgICBUZXN0VHlwZU5vZGUgKm5vZGVzWzJdOworCisgICAgaSA9IDA7CisgICAgd2hpbGUgKChub2Rlc1swXSA9IHZhbHVlX2dlbmVyYXRvciAoJmkpKSkKKyAgICAgIHsKKyAgICAgICAgaiA9IDA7CisgICAgICAgIHdoaWxlICgobm9kZXNbMV0gPSB2YWx1ZV9nZW5lcmF0b3IgKCZqKSkpCisgICAgICAgICAgeworICAgICAgICAgICAgcnVuX3Rlc3Rfbm9kZXMgKG5vZGVzLCAyKTsKKworICAgICAgICAgICAgbm9kZV9kZXN0cm95IChub2Rlc1sxXSk7CisgICAgICAgICAgfQorCisgICAgICAgIG5vZGVfZGVzdHJveSAobm9kZXNbMF0pOworICAgICAgfQorICB9CisKKyAgc3RhcnRfbmV4dF90ZXN0ICgiRWFjaCBjb250YWluZXIgY29udGFpbmluZyBlYWNoIHZhbHVlICVkIGl0ZXJhdGlvbnNcbiIsCisgICAgICAgICAgICAgICAgICAgTl9DT05UQUlORVJTICogTl9WQUxVRVMpOworICBmb3IgKGkgPSAwOyBpIDwgTl9DT05UQUlORVJTOyBpKyspCisgICAgeworICAgICAgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgKmNvbnRhaW5lcl9rbGFzcyA9IGNvbnRhaW5lcl9ub2Rlc1tpXTsKKworICAgICAgbWFrZV9hbmRfcnVuX3ZhbHVlc19pbnNpZGVfY29udGFpbmVyIChjb250YWluZXJfa2xhc3MsIDEpOworICAgIH0KKworICBzdGFydF9uZXh0X3Rlc3QgKCJFYWNoIGNvbnRhaW5lciBjb250YWluaW5nIGVhY2ggdmFsdWUgd2l0aCBhcnJheXMgYXMgYmxvY2tzICVkIGl0ZXJhdGlvbnNcbiIsCisgICAgICAgICAgICAgICAgICAgTl9DT05UQUlORVJTICogTl9WQUxVRVMpOworICBhcnJheXNfd3JpdGVfZml4ZWRfaW5fYmxvY2tzID0gVFJVRTsKKyAgZm9yIChpID0gMDsgaSA8IE5fQ09OVEFJTkVSUzsgaSsrKQorICAgIHsKKyAgICAgIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzICpjb250YWluZXJfa2xhc3MgPSBjb250YWluZXJfbm9kZXNbaV07CisKKyAgICAgIG1ha2VfYW5kX3J1bl92YWx1ZXNfaW5zaWRlX2NvbnRhaW5lciAoY29udGFpbmVyX2tsYXNzLCAxKTsKKyAgICB9CisgIGFycmF5c193cml0ZV9maXhlZF9pbl9ibG9ja3MgPSBGQUxTRTsKKworICBzdGFydF9uZXh0X3Rlc3QgKCJFYWNoIGNvbnRhaW5lciBvZiBzYW1lIGNvbnRhaW5lciBvZiBlYWNoIHZhbHVlICVkIGl0ZXJhdGlvbnNcbiIsCisgICAgICAgICAgICAgICAgICAgTl9DT05UQUlORVJTICogTl9WQUxVRVMpOworICBmb3IgKGkgPSAwOyBpIDwgTl9DT05UQUlORVJTOyBpKyspCisgICAgeworICAgICAgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgKmNvbnRhaW5lcl9rbGFzcyA9IGNvbnRhaW5lcl9ub2Rlc1tpXTsKKworICAgICAgbWFrZV9hbmRfcnVuX3ZhbHVlc19pbnNpZGVfY29udGFpbmVyIChjb250YWluZXJfa2xhc3MsIDIpOworICAgIH0KKworICBzdGFydF9uZXh0X3Rlc3QgKCJFYWNoIGNvbnRhaW5lciBvZiBzYW1lIGNvbnRhaW5lciBvZiBzYW1lIGNvbnRhaW5lciBvZiBlYWNoIHZhbHVlICVkIGl0ZXJhdGlvbnNcbiIsCisgICAgICAgICAgICAgICAgICAgTl9DT05UQUlORVJTICogTl9WQUxVRVMpOworICBmb3IgKGkgPSAwOyBpIDwgTl9DT05UQUlORVJTOyBpKyspCisgICAgeworICAgICAgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgKmNvbnRhaW5lcl9rbGFzcyA9IGNvbnRhaW5lcl9ub2Rlc1tpXTsKKworICAgICAgbWFrZV9hbmRfcnVuX3ZhbHVlc19pbnNpZGVfY29udGFpbmVyIChjb250YWluZXJfa2xhc3MsIDMpOworICAgIH0KKworICBzdGFydF9uZXh0X3Rlc3QgKCJFYWNoIHZhbHVlLHZhbHVlIHBhaXIgaW5zaWRlIGEgc3RydWN0ICVkIGl0ZXJhdGlvbnNcbiIsCisgICAgICAgICAgICAgICAgICAgTl9WQUxVRVMgKiBOX1ZBTFVFUyk7CisgIHsKKyAgICBUZXN0VHlwZU5vZGUgKnZhbDEsICp2YWwyOworICAgIFRlc3RUeXBlTm9kZSAqbm9kZTsKKworICAgIG5vZGUgPSBub2RlX25ldyAoJnN0cnVjdF8xX2NsYXNzKTsKKworICAgIGkgPSAwOworICAgIHdoaWxlICgodmFsMSA9IHZhbHVlX2dlbmVyYXRvciAoJmkpKSkKKyAgICAgIHsKKyAgICAgICAgaiA9IDA7CisgICAgICAgIHdoaWxlICgodmFsMiA9IHZhbHVlX2dlbmVyYXRvciAoJmopKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBUZXN0VHlwZU5vZGVDb250YWluZXIgKmNvbnRhaW5lciA9IChUZXN0VHlwZU5vZGVDb250YWluZXIqKSBub2RlOworCisgICAgICAgICAgICBub2RlX2FwcGVuZF9jaGlsZCAobm9kZSwgdmFsMSk7CisgICAgICAgICAgICBub2RlX2FwcGVuZF9jaGlsZCAobm9kZSwgdmFsMik7CisKKyAgICAgICAgICAgIHJ1bl90ZXN0X25vZGVzICgmbm9kZSwgMSk7CisKKyAgICAgICAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCZjb250YWluZXItPmNoaWxkcmVuKTsKKyAgICAgICAgICAgIG5vZGVfZGVzdHJveSAodmFsMik7CisgICAgICAgICAgfQorICAgICAgICBub2RlX2Rlc3Ryb3kgKHZhbDEpOworICAgICAgfQorICAgIG5vZGVfZGVzdHJveSAobm9kZSk7CisgIH0KKworICBzdGFydF9uZXh0X3Rlc3QgKCJBbGwgdmFsdWVzIGluIG9uZSBiaWcgc3RydWN0ICVkIGl0ZXJhdGlvblxuIiwKKyAgICAgICAgICAgICAgICAgICAxKTsKKyAgeworICAgIFRlc3RUeXBlTm9kZSAqbm9kZTsKKyAgICBUZXN0VHlwZU5vZGUgKmNoaWxkOworCisgICAgbm9kZSA9IG5vZGVfbmV3ICgmc3RydWN0XzFfY2xhc3MpOworCisgICAgaSA9IDA7CisgICAgd2hpbGUgKChjaGlsZCA9IHZhbHVlX2dlbmVyYXRvciAoJmkpKSkKKyAgICAgIG5vZGVfYXBwZW5kX2NoaWxkIChub2RlLCBjaGlsZCk7CisKKyAgICBydW5fdGVzdF9ub2RlcyAoJm5vZGUsIDEpOworCisgICAgbm9kZV9kZXN0cm95IChub2RlKTsKKyAgfQorCisgIHN0YXJ0X25leHRfdGVzdCAoIkVhY2ggdmFsdWUgaW4gYSBsYXJnZSBhcnJheSAlZCBpdGVyYXRpb25zXG4iLAorICAgICAgICAgICAgICAgICAgIE5fVkFMVUVTKTsKKyAgeworICAgIFRlc3RUeXBlTm9kZSAqdmFsOworICAgIFRlc3RUeXBlTm9kZSAqbm9kZTsKKworICAgIG5vZGUgPSBub2RlX25ldyAoJmFycmF5XzlfY2xhc3MpOworCisgICAgaSA9IDA7CisgICAgd2hpbGUgKCh2YWwgPSB2YWx1ZV9nZW5lcmF0b3IgKCZpKSkpCisgICAgICB7CisgICAgICAgIFRlc3RUeXBlTm9kZUNvbnRhaW5lciAqY29udGFpbmVyID0gKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopIG5vZGU7CisKKyAgICAgICAgbm9kZV9hcHBlbmRfY2hpbGQgKG5vZGUsIHZhbCk7CisKKyAgICAgICAgcnVuX3Rlc3Rfbm9kZXMgKCZub2RlLCAxKTsKKworICAgICAgICBfZGJ1c19saXN0X2NsZWFyICgmY29udGFpbmVyLT5jaGlsZHJlbik7CisgICAgICAgIG5vZGVfZGVzdHJveSAodmFsKTsKKyAgICAgIH0KKworICAgIG5vZGVfZGVzdHJveSAobm9kZSk7CisgIH0KKworICBpZiAoX2RidXNfZ2V0ZW52ICgiREJVU19URVNUX1NMT1ciKSA9PSBOVUxMIHx8CisgICAgICBhdG9pIChfZGJ1c19nZXRlbnYgKCJEQlVTX1RFU1RfU0xPVyIpKSA8IDEpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAic2tpcHBpbmcgcmVtYWluaW5nIG1hcnNoYWwtcmVjdXJzaXZlIHRlc3RzLCAiCisgICAgICAgICAgInJ1biB3aXRoIERCVVNfVEVTVF9TTE9XPTEgKG9yIG1vcmUpIHRvIGVuYWJsZVxuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgc3RhcnRfbmV4dF90ZXN0ICgiRWFjaCBjb250YWluZXIgb2YgZWFjaCBjb250YWluZXIgb2YgZWFjaCB2YWx1ZSAlZCBpdGVyYXRpb25zXG4iLAorICAgICAgICAgICAgICAgICAgIE5fQ09OVEFJTkVSUyAqIE5fQ09OVEFJTkVSUyAqIE5fVkFMVUVTKTsKKyAgZm9yIChpID0gMDsgaSA8IE5fQ09OVEFJTkVSUzsgaSsrKQorICAgIHsKKyAgICAgIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzICpvdXRlcl9jb250YWluZXJfa2xhc3MgPSBjb250YWluZXJfbm9kZXNbaV07CisgICAgICBUZXN0VHlwZU5vZGUgKm91dGVyX2NvbnRhaW5lciA9IG5vZGVfbmV3IChvdXRlcl9jb250YWluZXJfa2xhc3MpOworCisgICAgICBmb3IgKGogPSAwOyBqIDwgTl9DT05UQUlORVJTOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICBUZXN0VHlwZU5vZGUgKmNoaWxkOworICAgICAgICAgIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzICppbm5lcl9jb250YWluZXJfa2xhc3MgPSBjb250YWluZXJfbm9kZXNbal07CisgICAgICAgICAgVGVzdFR5cGVOb2RlICppbm5lcl9jb250YWluZXIgPSBub2RlX25ldyAoaW5uZXJfY29udGFpbmVyX2tsYXNzKTsKKworICAgICAgICAgIG5vZGVfYXBwZW5kX2NoaWxkIChvdXRlcl9jb250YWluZXIsIGlubmVyX2NvbnRhaW5lcik7CisKKyAgICAgICAgICBtID0gMDsKKyAgICAgICAgICB3aGlsZSAoKGNoaWxkID0gdmFsdWVfZ2VuZXJhdG9yICgmbSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBub2RlX2FwcGVuZF9jaGlsZCAoaW5uZXJfY29udGFpbmVyLCBjaGlsZCk7CisKKyAgICAgICAgICAgICAgcnVuX3Rlc3Rfbm9kZXMgKCZvdXRlcl9jb250YWluZXIsIDEpOworCisgICAgICAgICAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCYoKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopaW5uZXJfY29udGFpbmVyKS0+Y2hpbGRyZW4pOworICAgICAgICAgICAgICBub2RlX2Rlc3Ryb3kgKGNoaWxkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBfZGJ1c19saXN0X2NsZWFyICgmKChUZXN0VHlwZU5vZGVDb250YWluZXIqKW91dGVyX2NvbnRhaW5lciktPmNoaWxkcmVuKTsKKyAgICAgICAgICBub2RlX2Rlc3Ryb3kgKGlubmVyX2NvbnRhaW5lcik7CisgICAgICAgIH0KKyAgICAgIG5vZGVfZGVzdHJveSAob3V0ZXJfY29udGFpbmVyKTsKKyAgICB9CisKKyAgc3RhcnRfbmV4dF90ZXN0ICgiRWFjaCBjb250YWluZXIgb2YgZWFjaCBjb250YWluZXIgb2YgZWFjaCBjb250YWluZXIgb2YgZWFjaCB2YWx1ZSAlZCBpdGVyYXRpb25zXG4iLAorICAgICAgICAgICAgICAgICAgIE5fQ09OVEFJTkVSUyAqIE5fQ09OVEFJTkVSUyAqIE5fQ09OVEFJTkVSUyAqIE5fVkFMVUVTKTsKKyAgZm9yIChpID0gMDsgaSA8IE5fQ09OVEFJTkVSUzsgaSsrKQorICAgIHsKKyAgICAgIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzICpvdXRlcl9jb250YWluZXJfa2xhc3MgPSBjb250YWluZXJfbm9kZXNbaV07CisgICAgICBUZXN0VHlwZU5vZGUgKm91dGVyX2NvbnRhaW5lciA9IG5vZGVfbmV3IChvdXRlcl9jb250YWluZXJfa2xhc3MpOworCisgICAgICBmb3IgKGogPSAwOyBqIDwgTl9DT05UQUlORVJTOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyAqaW5uZXJfY29udGFpbmVyX2tsYXNzID0gY29udGFpbmVyX25vZGVzW2pdOworICAgICAgICAgIFRlc3RUeXBlTm9kZSAqaW5uZXJfY29udGFpbmVyID0gbm9kZV9uZXcgKGlubmVyX2NvbnRhaW5lcl9rbGFzcyk7CisKKyAgICAgICAgICBub2RlX2FwcGVuZF9jaGlsZCAob3V0ZXJfY29udGFpbmVyLCBpbm5lcl9jb250YWluZXIpOworCisgICAgICAgICAgZm9yIChrID0gMDsgayA8IE5fQ09OVEFJTkVSUzsgaysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBUZXN0VHlwZU5vZGUgKmNoaWxkOworICAgICAgICAgICAgICBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyAqY2VudGVyX2NvbnRhaW5lcl9rbGFzcyA9IGNvbnRhaW5lcl9ub2Rlc1trXTsKKyAgICAgICAgICAgICAgVGVzdFR5cGVOb2RlICpjZW50ZXJfY29udGFpbmVyID0gbm9kZV9uZXcgKGNlbnRlcl9jb250YWluZXJfa2xhc3MpOworCisgICAgICAgICAgICAgIG5vZGVfYXBwZW5kX2NoaWxkIChpbm5lcl9jb250YWluZXIsIGNlbnRlcl9jb250YWluZXIpOworCisgICAgICAgICAgICAgIG0gPSAwOworICAgICAgICAgICAgICB3aGlsZSAoKGNoaWxkID0gdmFsdWVfZ2VuZXJhdG9yICgmbSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIG5vZGVfYXBwZW5kX2NoaWxkIChjZW50ZXJfY29udGFpbmVyLCBjaGlsZCk7CisKKyAgICAgICAgICAgICAgICAgIHJ1bl90ZXN0X25vZGVzICgmb3V0ZXJfY29udGFpbmVyLCAxKTsKKworICAgICAgICAgICAgICAgICAgX2RidXNfbGlzdF9jbGVhciAoJigoVGVzdFR5cGVOb2RlQ29udGFpbmVyKiljZW50ZXJfY29udGFpbmVyKS0+Y2hpbGRyZW4pOworICAgICAgICAgICAgICAgICAgbm9kZV9kZXN0cm95IChjaGlsZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBfZGJ1c19saXN0X2NsZWFyICgmKChUZXN0VHlwZU5vZGVDb250YWluZXIqKWlubmVyX2NvbnRhaW5lciktPmNoaWxkcmVuKTsKKyAgICAgICAgICAgICAgbm9kZV9kZXN0cm95IChjZW50ZXJfY29udGFpbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBfZGJ1c19saXN0X2NsZWFyICgmKChUZXN0VHlwZU5vZGVDb250YWluZXIqKW91dGVyX2NvbnRhaW5lciktPmNoaWxkcmVuKTsKKyAgICAgICAgICBub2RlX2Rlc3Ryb3kgKGlubmVyX2NvbnRhaW5lcik7CisgICAgICAgIH0KKyAgICAgIG5vZGVfZGVzdHJveSAob3V0ZXJfY29udGFpbmVyKTsKKyAgICB9CisKKyAgLyogVGhpcyBvbmUgdGFrZXMgYSByZWFsbHkgbG9uZyB0aW1lICgxMCBtaW51dGVzIG9uIGEgQ29yZTIpLCBzbyBvbmx5IGVuYWJsZQorICAgKiBpdCBpZiB5b3UncmUgcmVhbGx5IHN1cmUgKi8KKyAgaWYgKGF0b2kgKF9kYnVzX2dldGVudiAoIkRCVVNfVEVTVF9TTE9XIikpIDwgMikKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJza2lwcGluZyByZWFsbHkgc2xvdyBtYXJzaGFsLXJlY3Vyc2l2ZSB0ZXN0LCAiCisgICAgICAgICAgInJ1biB3aXRoIERCVVNfVEVTVF9TTE9XPTIgKG9yIG1vcmUpIHRvIGVuYWJsZVxuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgc3RhcnRfbmV4dF90ZXN0ICgiRWFjaCB2YWx1ZSx2YWx1ZSx2YWx1ZSB0cmlwbGV0IGNvbWJpbmF0aW9uIGFzIHRvcGxldmVsLCBpbiBhbGwgb3JkZXJzICVkIGl0ZXJhdGlvbnNcbiIsCisgICAgICAgICAgICAgICAgICAgTl9WQUxVRVMgKiBOX1ZBTFVFUyAqIE5fVkFMVUVTKTsKKyAgeworICAgIFRlc3RUeXBlTm9kZSAqbm9kZXNbM107CisKKyAgICBpID0gMDsKKyAgICB3aGlsZSAoKG5vZGVzWzBdID0gdmFsdWVfZ2VuZXJhdG9yICgmaSkpKQorICAgICAgeworICAgICAgICBqID0gMDsKKyAgICAgICAgd2hpbGUgKChub2Rlc1sxXSA9IHZhbHVlX2dlbmVyYXRvciAoJmopKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBrID0gMDsKKyAgICAgICAgICAgIHdoaWxlICgobm9kZXNbMl0gPSB2YWx1ZV9nZW5lcmF0b3IgKCZrKSkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBydW5fdGVzdF9ub2RlcyAobm9kZXMsIDMpOworCisgICAgICAgICAgICAgICAgbm9kZV9kZXN0cm95IChub2Rlc1syXSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGVfZGVzdHJveSAobm9kZXNbMV0pOworICAgICAgICAgIH0KKyAgICAgICAgbm9kZV9kZXN0cm95IChub2Rlc1swXSk7CisgICAgICB9CisgIH0KKworb3V0OgorICBmcHJpbnRmIChzdGRlcnIsICIlZCB0b3RhbCBpdGVyYXRpb25zIG9mIHJlY3Vyc2l2ZSBtYXJzaGFsaW5nIHRlc3RzXG4iLAorICAgICAgICAgICBuX2l0ZXJhdGlvbnNfY29tcGxldGVkX3RvdGFsKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiZWFjaCBpdGVyYXRpb24gcmFuIGF0IGluaXRpYWwgb2Zmc2V0cyAwIHRocm91Z2ggJWQgaW4gYm90aCBiaWcgYW5kIGxpdHRsZSBlbmRpYW5cbiIsCisgICAgICAgICAgIE1BWF9JTklUSUFMX09GRlNFVCk7CisgIGZwcmludGYgKHN0ZGVyciwgIm91dCBvZiBtZW1vcnkgaGFuZGxpbmcgJXMgdGVzdGVkXG4iLAorICAgICAgICAgICBURVNUX09PTV9IQU5ETElORyA/ICJ3YXMiIDogIndhcyBub3QiKTsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX21hcnNoYWxfcmVjdXJzaXZlX3Rlc3QgKHZvaWQpCit7CisgIG1ha2VfYW5kX3J1bl90ZXN0X25vZGVzICgpOworCisgIHJldHVybiBUUlVFOworfQorCisvKgorICoKKyAqCisgKiAgICAgICAgIEltcGxlbWVudGF0aW9ucyBvZiBlYWNoIHR5cGUgbm9kZSBjbGFzcworICoKKyAqCisgKgorICovCisjZGVmaW5lIE1BWF9NVUxUSV9DT1VOVCA1CisKKyNkZWZpbmUgU0FNUExFX0lOVDE2ICAgICAgICAgICAxMjM0CisjZGVmaW5lIFNBTVBMRV9JTlQxNl9BTFRFUk5BVEUgNjc4NQorc3RhdGljIGRidXNfaW50MTZfdAoraW50MTZfZnJvbV9zZWVkIChpbnQgc2VlZCkKK3sKKyAgLyogR2VuZXJhdGUgYW4gaW50ZWdlciB2YWx1ZSB0aGF0J3MgcHJlZGljdGFibGUgZnJvbSBzZWVkLiAgV2UgY291bGQKKyAgICoganVzdCB1c2Ugc2VlZCBpdHNlbGYsIGJ1dCB0aGF0IHdvdWxkIG9ubHkgZXZlciB0b3VjaCBvbmUgYnl0ZSBvZgorICAgKiB0aGUgaW50IHNvIHdvdWxkIG1pc3Mgc29tZSBraW5kcyBvZiBidWcuCisgICAqLworICBkYnVzX2ludDE2X3QgdjsKKworICB2ID0gNDI7IC8qIGp1c3QgdG8gcXVpZXQgY29tcGlsZXIgYWZhaWsgKi8KKyAgc3dpdGNoIChzZWVkICUgNSkKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgdiA9IFNBTVBMRV9JTlQxNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIHYgPSBTQU1QTEVfSU5UMTZfQUxURVJOQVRFOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgdiA9IC0xOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgdiA9IF9EQlVTX0lOVDE2X01BWDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIHYgPSAxOworICAgICAgYnJlYWs7CisgICAgfQorCisgIGlmIChzZWVkID4gMSkKKyAgICB2ICo9IHNlZWQ7IC8qIHdyYXBzIGFyb3VuZCBldmVudHVhbGx5LCB3aGljaCBpcyBmaW5lICovCisKKyAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraW50MTZfd3JpdGVfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICAvKiBhbHNvIHVzZWQgZm9yIHVpbnQxNiAqLworICBkYnVzX2ludDE2X3QgdjsKKworICB2ID0gaW50MTZfZnJvbV9zZWVkIChzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT5rbGFzcy0+dHlwZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnYpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ludDE2X3JlYWRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICAvKiBhbHNvIHVzZWQgZm9yIHVpbnQxNiAqLworICBkYnVzX2ludDE2X3QgdjsKKworICBjaGVja19leHBlY3RlZF90eXBlIChyZWFkZXIsIG5vZGUtPmtsYXNzLT50eXBlY29kZSk7CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAocmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGJ1c19pbnQxNl90KikgJnYpOworCisgIF9kYnVzX2Fzc2VydCAodiA9PSBpbnQxNl9mcm9tX3NlZWQgKHNlZWQpKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitpbnQxNl9zZXRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgLyogYWxzbyB1c2VkIGZvciB1aW50MTYgKi8KKyAgZGJ1c19pbnQxNl90IHY7CisKKyAgdiA9IGludDE2X2Zyb21fc2VlZCAoc2VlZCk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfcmVhZGVyX3NldF9iYXNpYyAocmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGlnbl9yb290KTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitpbnQxNl93cml0ZV9tdWx0aSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGNvdW50KQoreworICAvKiBhbHNvIHVzZWQgZm9yIHVpbnQxNiAqLworICBkYnVzX2ludDE2X3QgdmFsdWVzW01BWF9NVUxUSV9DT1VOVF07CisgIGRidXNfaW50MTZfdCAqdl9BUlJBWV9JTlQxNiA9IHZhbHVlczsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpCisgICAgdmFsdWVzW2ldID0gaW50MTZfZnJvbV9zZWVkIChzZWVkICsgaSk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2ZpeGVkX211bHRpICh3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS0+a2xhc3MtPnR5cGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X0FSUkFZX0lOVDE2LCBjb3VudCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraW50MTZfcmVhZF9tdWx0aSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgY291bnQpCit7CisgIC8qIGFsc28gdXNlZCBmb3IgdWludDE2ICovCisgIGRidXNfaW50MTZfdCAqdmFsdWVzOworICBpbnQgbl9lbGVtZW50czsKKyAgaW50IGk7CisKKyAgY2hlY2tfZXhwZWN0ZWRfdHlwZSAocmVhZGVyLCBub2RlLT5rbGFzcy0+dHlwZWNvZGUpOworCisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfZml4ZWRfbXVsdGkgKHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5fZWxlbWVudHMpOworCisgIGlmIChuX2VsZW1lbnRzICE9IGNvdW50KQorICAgIF9kYnVzX3dhcm4gKCJnb3QgJWQgZWxlbWVudHMgZXhwZWN0ZWQgJWRcbiIsIG5fZWxlbWVudHMsIGNvdW50KTsKKyAgX2RidXNfYXNzZXJ0IChuX2VsZW1lbnRzID09IGNvdW50KTsKKworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICBfZGJ1c19hc3NlcnQgKCgoZGJ1c19pbnQxNl90KV9kYnVzX3VucGFja191aW50MTYgKHJlYWRlci0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1bnNpZ25lZCBjaGFyKil2YWx1ZXMgKyAoaSAqIDIpKSkgPT0KKyAgICAgICAgICAgICAgICAgIGludDE2X2Zyb21fc2VlZCAoc2VlZCArIGkpKTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisjZGVmaW5lIFNBTVBMRV9JTlQzMiAgICAgICAgICAgMTIzNDU2NzgKKyNkZWZpbmUgU0FNUExFX0lOVDMyX0FMVEVSTkFURSA1Mzc4MTQyOQorc3RhdGljIGRidXNfaW50MzJfdAoraW50MzJfZnJvbV9zZWVkIChpbnQgc2VlZCkKK3sKKyAgLyogR2VuZXJhdGUgYW4gaW50ZWdlciB2YWx1ZSB0aGF0J3MgcHJlZGljdGFibGUgZnJvbSBzZWVkLiAgV2UgY291bGQKKyAgICoganVzdCB1c2Ugc2VlZCBpdHNlbGYsIGJ1dCB0aGF0IHdvdWxkIG9ubHkgZXZlciB0b3VjaCBvbmUgYnl0ZSBvZgorICAgKiB0aGUgaW50IHNvIHdvdWxkIG1pc3Mgc29tZSBraW5kcyBvZiBidWcuCisgICAqLworICBkYnVzX2ludDMyX3QgdjsKKworICB2ID0gNDI7IC8qIGp1c3QgdG8gcXVpZXQgY29tcGlsZXIgYWZhaWsgKi8KKyAgc3dpdGNoIChzZWVkICUgNSkKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgdiA9IFNBTVBMRV9JTlQzMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIHYgPSBTQU1QTEVfSU5UMzJfQUxURVJOQVRFOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgdiA9IC0xOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgdiA9IF9EQlVTX0lOVF9NQVg7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICB2ID0gMTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBpZiAoc2VlZCA+IDEpCisgICAgdiAqPSBzZWVkOyAvKiB3cmFwcyBhcm91bmQgZXZlbnR1YWxseSwgd2hpY2ggaXMgZmluZSAqLworCisgIHJldHVybiB2OworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ludDMyX3dyaXRlX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgLyogYWxzbyB1c2VkIGZvciB1aW50MzIgKi8KKyAgZGJ1c19pbnQzMl90IHY7CisKKyAgdiA9IGludDMyX2Zyb21fc2VlZCAoc2VlZCk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2Jhc2ljICh3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS0+a2xhc3MtPnR5cGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2KTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitpbnQzMl9yZWFkX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgLyogYWxzbyB1c2VkIGZvciB1aW50MzIgKi8KKyAgZGJ1c19pbnQzMl90IHY7CisKKyAgY2hlY2tfZXhwZWN0ZWRfdHlwZSAocmVhZGVyLCBub2RlLT5rbGFzcy0+dHlwZWNvZGUpOworCisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRidXNfaW50MzJfdCopICZ2KTsKKworICBfZGJ1c19hc3NlcnQgKHYgPT0gaW50MzJfZnJvbV9zZWVkIChzZWVkKSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraW50MzJfc2V0X3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIC8qIGFsc28gdXNlZCBmb3IgdWludDMyICovCisgIGRidXNfaW50MzJfdCB2OworCisgIHYgPSBpbnQzMl9mcm9tX3NlZWQgKHNlZWQpOworCisgIHJldHVybiBfZGJ1c190eXBlX3JlYWRlcl9zZXRfYmFzaWMgKHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxpZ25fcm9vdCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraW50MzJfd3JpdGVfbXVsdGkgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjb3VudCkKK3sKKyAgLyogYWxzbyB1c2VkIGZvciB1aW50MzIgKi8KKyAgZGJ1c19pbnQzMl90IHZhbHVlc1tNQVhfTVVMVElfQ09VTlRdOworICBkYnVzX2ludDMyX3QgKnZfQVJSQVlfSU5UMzIgPSB2YWx1ZXM7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKQorICAgIHZhbHVlc1tpXSA9IGludDMyX2Zyb21fc2VlZCAoc2VlZCArIGkpOworCisgIHJldHVybiBfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9maXhlZF9tdWx0aSAod3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmtsYXNzLT50eXBlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9BUlJBWV9JTlQzMiwgY291bnQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ludDMyX3JlYWRfbXVsdGkgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGNvdW50KQoreworICAvKiBhbHNvIHVzZWQgZm9yIHVpbnQzMiAqLworICBkYnVzX2ludDMyX3QgKnZhbHVlczsKKyAgaW50IG5fZWxlbWVudHM7CisgIGludCBpOworCisgIGNoZWNrX2V4cGVjdGVkX3R5cGUgKHJlYWRlciwgbm9kZS0+a2xhc3MtPnR5cGVjb2RlKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2ZpeGVkX211bHRpIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuX2VsZW1lbnRzKTsKKworICBpZiAobl9lbGVtZW50cyAhPSBjb3VudCkKKyAgICBfZGJ1c193YXJuICgiZ290ICVkIGVsZW1lbnRzIGV4cGVjdGVkICVkXG4iLCBuX2VsZW1lbnRzLCBjb3VudCk7CisgIF9kYnVzX2Fzc2VydCAobl9lbGVtZW50cyA9PSBjb3VudCk7CisKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgX2RidXNfYXNzZXJ0ICgoKGludClfZGJ1c191bnBhY2tfdWludDMyIChyZWFkZXItPmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciopdmFsdWVzICsgKGkgKiA0KSkpID09CisgICAgICAgICAgICAgICAgICBpbnQzMl9mcm9tX3NlZWQgKHNlZWQgKyBpKSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBEQlVTX0hBVkVfSU5UNjQKK3N0YXRpYyBkYnVzX2ludDY0X3QKK2ludDY0X2Zyb21fc2VlZCAoaW50IHNlZWQpCit7CisgIGRidXNfaW50MzJfdCB2MzI7CisgIGRidXNfaW50NjRfdCB2OworCisgIHYzMiA9IGludDMyX2Zyb21fc2VlZCAoc2VlZCk7CisKKyAgdiA9IC0gKGRidXNfaW50MzJfdCkgfiB2MzI7CisgIHYgfD0gKCgoZGJ1c19pbnQ2NF90KXYzMikgPDwgMzIpOworCisgIHJldHVybiB2OworfQorI2VuZGlmCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraW50NjRfd3JpdGVfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorICAvKiBhbHNvIHVzZWQgZm9yIHVpbnQ2NCAqLworICBkYnVzX2ludDY0X3QgdjsKKworICB2ID0gaW50NjRfZnJvbV9zZWVkIChzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT5rbGFzcy0+dHlwZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnYpOworI2Vsc2UKKyAgcmV0dXJuIFRSVUU7CisjZW5kaWYKK30KKworc3RhdGljIGRidXNfYm9vbF90CitpbnQ2NF9yZWFkX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyNpZmRlZiBEQlVTX0hBVkVfSU5UNjQKKyAgLyogYWxzbyB1c2VkIGZvciB1aW50NjQgKi8KKyAgZGJ1c19pbnQ2NF90IHY7CisKKyAgY2hlY2tfZXhwZWN0ZWRfdHlwZSAocmVhZGVyLCBub2RlLT5rbGFzcy0+dHlwZWNvZGUpOworCisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRidXNfaW50NjRfdCopICZ2KTsKKworICBfZGJ1c19hc3NlcnQgKHYgPT0gaW50NjRfZnJvbV9zZWVkIChzZWVkKSk7CisKKyAgcmV0dXJuIFRSVUU7CisjZWxzZQorICByZXR1cm4gVFJVRTsKKyNlbmRpZgorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ludDY0X3NldF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorICAvKiBhbHNvIHVzZWQgZm9yIHVpbnQ2NCAqLworICBkYnVzX2ludDY0X3QgdjsKKworICB2ID0gaW50NjRfZnJvbV9zZWVkIChzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfc2V0X2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsaWduX3Jvb3QpOworI2Vsc2UKKyAgcmV0dXJuIFRSVUU7CisjZW5kaWYKK30KKworI2RlZmluZSBNQVhfU0FNUExFX1NUUklOR19MRU4gMTAKK3N0YXRpYyB2b2lkCitzdHJpbmdfZnJvbV9zZWVkIChjaGFyICpidWYsCisgICAgICAgICAgICAgICAgICBpbnQgICBsZW4sCisgICAgICAgICAgICAgICAgICBpbnQgICBzZWVkKQoreworICBpbnQgaTsKKyAgdW5zaWduZWQgY2hhciB2OworCisgIF9kYnVzX2Fzc2VydCAobGVuIDwgTUFYX1NBTVBMRV9TVFJJTkdfTEVOKTsKKworICAvKiB2YXJ5IHRoZSBsZW5ndGggc2xpZ2h0bHksIHRob3VnaCB3ZSBhbHNvIGhhdmUgbXVsdGlwbGUgc3RyaW5nCisgICAqIHZhbHVlIHR5cGVzIGZvciB0aGlzLCB2YXJ5aW5nIGl0IGhlcmUgdGVzdHMgdGhlIHNldF92YWx1ZSBjb2RlCisgICAqLworICBzd2l0Y2ggKHNlZWQgJSAzKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICBsZW4gKz0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIGxlbiAtPSAyOworICAgICAgYnJlYWs7CisgICAgfQorICBpZiAobGVuIDwgMCkKKyAgICBsZW4gPSAwOworCisgIHYgPSAodW5zaWduZWQgY2hhcikgKCdBJyArIHNlZWQpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IGxlbikKKyAgICB7CisgICAgICBpZiAodiA8ICdBJyB8fCB2ID4gJ3onKQorICAgICAgICB2ID0gJ0EnOworCisgICAgICBidWZbaV0gPSB2OworCisgICAgICB2ICs9IDE7CisgICAgICArK2k7CisgICAgfQorCisgIGJ1ZltpXSA9ICdcMCc7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc3RyaW5nX3dyaXRlX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgY2hhciBidWZbTUFYX1NBTVBMRV9TVFJJTkdfTEVOICsgMV09IiI7CisgIGNvbnN0IGNoYXIgKnZfc3RyaW5nID0gYnVmOworCisKKyAgc3RyaW5nX2Zyb21fc2VlZCAoYnVmLCBub2RlLT5rbGFzcy0+c3ViY2xhc3NfZGV0YWlsLAorICAgICAgICAgICAgICAgICAgICBzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT5rbGFzcy0+dHlwZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfc3RyaW5nKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzdHJpbmdfcmVhZF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgY29uc3QgY2hhciAqdjsKKyAgY2hhciBidWZbTUFYX1NBTVBMRV9TVFJJTkdfTEVOICsgMV07CisgIHYgPSBidWY7CisKKyAgY2hlY2tfZXhwZWN0ZWRfdHlwZSAocmVhZGVyLCBub2RlLT5rbGFzcy0+dHlwZWNvZGUpOworCisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKiopICZ2KTsKKworICBzdHJpbmdfZnJvbV9zZWVkIChidWYsIG5vZGUtPmtsYXNzLT5zdWJjbGFzc19kZXRhaWwsCisgICAgICAgICAgICAgICAgICAgIHNlZWQpOworCisgIGlmIChzdHJjbXAgKGJ1ZiwgdikgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgicmVhZCBzdHJpbmcgJyVzJyBleHBlY3RlZCAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgdiwgYnVmKTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInRlc3QgZmFpbGVkIik7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3N0cmluZ19zZXRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgY2hhciBidWZbTUFYX1NBTVBMRV9TVFJJTkdfTEVOICsgMV07CisgIGNvbnN0IGNoYXIgKnZfc3RyaW5nID0gYnVmOworCisgIHN0cmluZ19mcm9tX3NlZWQgKGJ1Ziwgbm9kZS0+a2xhc3MtPnN1YmNsYXNzX2RldGFpbCwKKyAgICAgICAgICAgICAgICAgICAgc2VlZCk7CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorIHsKKyAgIGNvbnN0IGNoYXIgKm9sZDsKKyAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKHJlYWRlciwgJm9sZCk7CisgICBfZGJ1c192ZXJib3NlICgiU0VUVElORyBuZXcgc3RyaW5nICclcycgbGVuICVkIGluIHBsYWNlIG9mICclcycgbGVuICVkXG4iLAorICAgICAgICAgICAgICAgICAgdl9zdHJpbmcsIHN0cmxlbiAodl9zdHJpbmcpLCBvbGQsIHN0cmxlbiAob2xkKSk7CisgfQorI2VuZGlmCisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfcmVhZGVyX3NldF9iYXNpYyAocmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxpZ25fcm9vdCk7Cit9CisKKyNkZWZpbmUgQk9PTF9GUk9NX1NFRUQoc2VlZCkgKChkYnVzX2Jvb2xfdCkoKHNlZWQpICUgMikpCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYm9vbF93cml0ZV92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIGRidXNfYm9vbF90IHY7CisKKyAgdiA9IEJPT0xfRlJPTV9TRUVEIChzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT5rbGFzcy0+dHlwZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnYpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2Jvb2xfcmVhZF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBkYnVzX2Jvb2xfdCB2OworCisgIGNoZWNrX2V4cGVjdGVkX3R5cGUgKHJlYWRlciwgbm9kZS0+a2xhc3MtPnR5cGVjb2RlKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKikgJnYpOworCisgIF9kYnVzX2Fzc2VydCAodiA9PSBCT09MX0ZST01fU0VFRCAoc2VlZCkpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2Jvb2xfc2V0X3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIGRidXNfYm9vbF90IHY7CisKKyAgdiA9IEJPT0xfRlJPTV9TRUVEIChzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfc2V0X2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsaWduX3Jvb3QpOworfQorCisjZGVmaW5lIEJZVEVfRlJPTV9TRUVEKHNlZWQpICgodW5zaWduZWQgY2hhcikgaW50MzJfZnJvbV9zZWVkIChzZWVkKSkKKworc3RhdGljIGRidXNfYm9vbF90CitieXRlX3dyaXRlX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgdW5zaWduZWQgY2hhciB2OworCisgIHYgPSBCWVRFX0ZST01fU0VFRCAoc2VlZCk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2Jhc2ljICh3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS0+a2xhc3MtPnR5cGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2KTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitieXRlX3JlYWRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgdW5zaWduZWQgY2hhciB2OworCisgIGNoZWNrX2V4cGVjdGVkX3R5cGUgKHJlYWRlciwgbm9kZS0+a2xhc3MtPnR5cGVjb2RlKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKikgJnYpOworCisgIF9kYnVzX2Fzc2VydCAodiA9PSBCWVRFX0ZST01fU0VFRCAoc2VlZCkpOworCisgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnl0ZV9zZXRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgdW5zaWduZWQgY2hhciB2OworCisgIHYgPSBCWVRFX0ZST01fU0VFRCAoc2VlZCk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfcmVhZGVyX3NldF9iYXNpYyAocmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGlnbl9yb290KTsKK30KKworc3RhdGljIGRvdWJsZQorZG91YmxlX2Zyb21fc2VlZCAoaW50IHNlZWQpCit7CisgIHJldHVybiBTQU1QTEVfSU5UMzIgKiAoZG91YmxlKSBzZWVkICsgMC4zOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2RvdWJsZV93cml0ZV92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIGRvdWJsZSB2OworCisgIHYgPSBkb3VibGVfZnJvbV9zZWVkIChzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT5rbGFzcy0+dHlwZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnYpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2RvdWJsZV9yZWFkX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBkb3VibGUgdjsKKyAgZG91YmxlIGV4cGVjdGVkOworCisgIGNoZWNrX2V4cGVjdGVkX3R5cGUgKHJlYWRlciwgbm9kZS0+a2xhc3MtPnR5cGVjb2RlKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUqKSAmdik7CisKKyAgZXhwZWN0ZWQgPSBkb3VibGVfZnJvbV9zZWVkIChzZWVkKTsKKworICBpZiAoIV9EQlVTX0RPVUJMRVNfQklUV0lTRV9FUVVBTCAodiwgZXhwZWN0ZWQpKQorICAgIHsKKyNpZmRlZiBEQlVTX0lOVDY0X1BSSU5URl9NT0RJRklFUgorICAgICAgX2RidXNfd2FybiAoIkV4cGVjdGVkIGRvdWJsZSAlZyBnb3QgJWdcbiBiaXRzID0gMHglIiBEQlVTX0lOVDY0X1BSSU5URl9NT0RJRklFUiAieCB2cy5cbiBiaXRzID0gMHglIiBEQlVTX0lOVDY0X1BSSU5URl9NT0RJRklFUiAieClcbiIsCisgICAgICAgICAgICAgICAgICBleHBlY3RlZCwgdiwKKyAgICAgICAgICAgICAgICAgICooZGJ1c191aW50NjRfdCopKGNoYXIqKSZleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICooZGJ1c191aW50NjRfdCopKGNoYXIqKSZ2KTsKKyNlbmRpZgorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidGVzdCBmYWlsZWQiKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZG91YmxlX3NldF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBkb3VibGUgdjsKKworICB2ID0gZG91YmxlX2Zyb21fc2VlZCAoc2VlZCk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfcmVhZGVyX3NldF9iYXNpYyAocmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGlnbl9yb290KTsKK30KKworI2RlZmluZSBNQVhfU0FNUExFX09CSkVDVF9QQVRIX0xFTiAxMAorc3RhdGljIHZvaWQKK29iamVjdF9wYXRoX2Zyb21fc2VlZCAoY2hhciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICBzZWVkKQoreworICBpbnQgaTsKKyAgdW5zaWduZWQgY2hhciB2OworICBpbnQgbGVuOworCisgIGxlbiA9IHNlZWQgJSA5OworICBfZGJ1c19hc3NlcnQgKGxlbiA8IE1BWF9TQU1QTEVfT0JKRUNUX1BBVEhfTEVOKTsKKworICB2ID0gKHVuc2lnbmVkIGNoYXIpICgnQScgKyBzZWVkKTsKKworICBpZiAobGVuIDwgMikKKyAgICB7CisgICAgICBidWZbMF0gPSAnLyc7CisgICAgICBpID0gMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChpICsgMSA8IGxlbikKKyAgICAgICAgeworICAgICAgICAgIGlmICh2IDwgJ0EnIHx8IHYgPiAneicpCisgICAgICAgICAgICB2ID0gJ0EnOworCisgICAgICAgICAgYnVmW2ldID0gJy8nOworICAgICAgICAgICsraTsKKyAgICAgICAgICBidWZbaV0gPSB2OworICAgICAgICAgICsraTsKKyAgICAgICAgICAKKyAgICAgICAgICB2ICs9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgYnVmW2ldID0gJ1wwJzsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitvYmplY3RfcGF0aF93cml0ZV92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIGNoYXIgYnVmW01BWF9TQU1QTEVfT0JKRUNUX1BBVEhfTEVOICsgMV07CisgIGNvbnN0IGNoYXIgKnZfc3RyaW5nID0gYnVmOworCisgIG9iamVjdF9wYXRoX2Zyb21fc2VlZCAoYnVmLCBzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT5rbGFzcy0+dHlwZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfc3RyaW5nKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitvYmplY3RfcGF0aF9yZWFkX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgY29uc3QgY2hhciAqdjsKKyAgY2hhciBidWZbTUFYX1NBTVBMRV9PQkpFQ1RfUEFUSF9MRU4gKyAxXTsKKworICBjaGVja19leHBlY3RlZF90eXBlIChyZWFkZXIsIG5vZGUtPmtsYXNzLT50eXBlY29kZSk7CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAocmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKikgJnYpOworCisgIG9iamVjdF9wYXRoX2Zyb21fc2VlZCAoYnVmLCBzZWVkKTsKKworICBpZiAoc3RyY21wIChidWYsIHYpICE9IDApCisgICAgeworICAgICAgX2RidXNfd2FybiAoInJlYWQgb2JqZWN0IHBhdGggJyVzJyBleHBlY3RlZCAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgdiwgYnVmKTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInRlc3QgZmFpbGVkIik7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK29iamVjdF9wYXRoX3NldF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBjaGFyIGJ1ZltNQVhfU0FNUExFX09CSkVDVF9QQVRIX0xFTiArIDFdOworICBjb25zdCBjaGFyICp2X3N0cmluZyA9IGJ1ZjsKKworICBvYmplY3RfcGF0aF9mcm9tX3NlZWQgKGJ1Ziwgc2VlZCk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfcmVhZGVyX3NldF9iYXNpYyAocmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxpZ25fcm9vdCk7Cit9CisKKyNkZWZpbmUgTUFYX1NBTVBMRV9TSUdOQVRVUkVfTEVOIDEwCitzdGF0aWMgdm9pZAorc2lnbmF0dXJlX2Zyb21fc2VlZCAoY2hhciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgc2VlZCkKK3sKKyAgLyogdHJ5IHRvIGF2b2lkIGFzY2VuZGluZywgZGVzY2VuZGluZywgb3IgYWx0ZXJuYXRpbmcgbGVuZ3RoIHRvIGhlbHAgZmluZCBidWdzICovCisgIGNvbnN0IGNoYXIgKnNhbXBsZV9zaWduYXR1cmVzW10gPSB7CisgICAgImFzYXgiCisgICAgIiIsCisgICAgImFzYXUoeHh4eCkiLAorICAgICJ4IiwKKyAgICAiYWkiLAorICAgICJhKGlpKSIKKyAgfTsKKworICBzdHJjcHkgKGJ1Ziwgc2FtcGxlX3NpZ25hdHVyZXNbc2VlZCAlIF9EQlVTX05fRUxFTUVOVFMoc2FtcGxlX3NpZ25hdHVyZXMpXSk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2lnbmF0dXJlX3dyaXRlX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgY2hhciBidWZbTUFYX1NBTVBMRV9TSUdOQVRVUkVfTEVOICsgMV07CisgIGNvbnN0IGNoYXIgKnZfc3RyaW5nID0gYnVmOworCisgIHNpZ25hdHVyZV9mcm9tX3NlZWQgKGJ1Ziwgc2VlZCk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2Jhc2ljICh3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS0+a2xhc3MtPnR5cGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X3N0cmluZyk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2lnbmF0dXJlX3JlYWRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIGNvbnN0IGNoYXIgKnY7CisgIGNoYXIgYnVmW01BWF9TQU1QTEVfU0lHTkFUVVJFX0xFTiArIDFdOworCisgIGNoZWNrX2V4cGVjdGVkX3R5cGUgKHJlYWRlciwgbm9kZS0+a2xhc3MtPnR5cGVjb2RlKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICoqKSAmdik7CisKKyAgc2lnbmF0dXJlX2Zyb21fc2VlZCAoYnVmLCBzZWVkKTsKKworICBpZiAoc3RyY21wIChidWYsIHYpICE9IDApCisgICAgeworICAgICAgX2RidXNfd2FybiAoInJlYWQgc2lnbmF0dXJlIHZhbHVlICclcycgZXhwZWN0ZWQgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgIHYsIGJ1Zik7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ0ZXN0IGZhaWxlZCIpOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgZGJ1c19ib29sX3QKK3NpZ25hdHVyZV9zZXRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgY2hhciBidWZbTUFYX1NBTVBMRV9TSUdOQVRVUkVfTEVOICsgMV07CisgIGNvbnN0IGNoYXIgKnZfc3RyaW5nID0gYnVmOworCisgIHNpZ25hdHVyZV9mcm9tX3NlZWQgKGJ1Ziwgc2VlZCk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfcmVhZGVyX3NldF9iYXNpYyAocmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxpZ25fcm9vdCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc3RydWN0X3dyaXRlX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgVGVzdFR5cGVOb2RlQ29udGFpbmVyICpjb250YWluZXIgPSAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKikgbm9kZTsKKyAgRGF0YUJsb2NrU3RhdGUgc2F2ZWQ7CisgIERCdXNUeXBlV3JpdGVyIHN1YjsKKyAgaW50IGk7CisgIGludCBuX2NvcGllczsKKworICBuX2NvcGllcyA9IG5vZGUtPmtsYXNzLT5zdWJjbGFzc19kZXRhaWw7CisKKyAgX2RidXNfYXNzZXJ0IChjb250YWluZXItPmNoaWxkcmVuICE9IE5VTEwpOworCisgIGRhdGFfYmxvY2tfc2F2ZSAoYmxvY2ssICZzYXZlZCk7CisKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl9yZWN1cnNlICh3cml0ZXIsIERCVVNfVFlQRV9TVFJVQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ViKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbl9jb3BpZXMpCisgICAgeworICAgICAgREJ1c0xpc3QgKmxpbms7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmY29udGFpbmVyLT5jaGlsZHJlbik7CisgICAgICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgVGVzdFR5cGVOb2RlICpjaGlsZCA9IGxpbmstPmRhdGE7CisgICAgICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZjb250YWluZXItPmNoaWxkcmVuLCBsaW5rKTsKKworICAgICAgICAgIGlmICghbm9kZV93cml0ZV92YWx1ZSAoY2hpbGQsIGJsb2NrLCAmc3ViLCBzZWVkICsgaSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRhdGFfYmxvY2tfcmVzdG9yZSAoYmxvY2ssICZzYXZlZCk7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGxpbmsgPSBuZXh0OworICAgICAgICB9CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl91bnJlY3Vyc2UgKHdyaXRlciwgJnN1YikpCisgICAgeworICAgICAgZGF0YV9ibG9ja19yZXN0b3JlIChibG9jaywgJnNhdmVkKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc3RydWN0X3JlYWRfb3Jfc2V0X3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIFRlc3RUeXBlTm9kZUNvbnRhaW5lciAqY29udGFpbmVyID0gKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopIG5vZGU7CisgIERCdXNUeXBlUmVhZGVyIHN1YjsKKyAgaW50IGk7CisgIGludCBuX2NvcGllczsKKworICBuX2NvcGllcyA9IG5vZGUtPmtsYXNzLT5zdWJjbGFzc19kZXRhaWw7CisKKyAgY2hlY2tfZXhwZWN0ZWRfdHlwZSAocmVhZGVyLCBEQlVTX1RZUEVfU1RSVUNUKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlIChyZWFkZXIsICZzdWIpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IG5fY29waWVzKQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpsaW5rOworCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNvbnRhaW5lci0+Y2hpbGRyZW4pOworICAgICAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIFRlc3RUeXBlTm9kZSAqY2hpbGQgPSBsaW5rLT5kYXRhOworICAgICAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmY29udGFpbmVyLT5jaGlsZHJlbiwgbGluayk7CisKKyAgICAgICAgICBpZiAocmVhbGlnbl9yb290ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghbm9kZV9yZWFkX3ZhbHVlIChjaGlsZCwgJnN1Yiwgc2VlZCArIGkpKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghbm9kZV9zZXRfdmFsdWUgKGNoaWxkLCAmc3ViLCByZWFsaWduX3Jvb3QsIHNlZWQgKyBpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoaSA9PSAobl9jb3BpZXMgLSAxKSAmJiBuZXh0ID09IE5VTEwpCisgICAgICAgICAgICBORVhUX0VYUEVDVElOR19GQUxTRSAoJnN1Yik7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgTkVYVF9FWFBFQ1RJTkdfVFJVRSAoJnN1Yik7CisKKyAgICAgICAgICBsaW5rID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3N0cnVjdF9yZWFkX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICByZXR1cm4gc3RydWN0X3JlYWRfb3Jfc2V0X3ZhbHVlIChub2RlLCByZWFkZXIsIE5VTEwsIHNlZWQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3N0cnVjdF9zZXRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgcmV0dXJuIHN0cnVjdF9yZWFkX29yX3NldF92YWx1ZSAobm9kZSwgcmVhZGVyLCByZWFsaWduX3Jvb3QsIHNlZWQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3N0cnVjdF9idWlsZF9zaWduYXR1cmUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgKnN0cikKK3sKKyAgVGVzdFR5cGVOb2RlQ29udGFpbmVyICpjb250YWluZXIgPSAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKikgbm9kZTsKKyAgaW50IGk7CisgIGludCBvcmlnX2xlbjsKKyAgaW50IG5fY29waWVzOworCisgIG5fY29waWVzID0gbm9kZS0+a2xhc3MtPnN1YmNsYXNzX2RldGFpbDsKKworICBvcmlnX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChzdHIsIERCVVNfU1RSVUNUX0JFR0lOX0NIQVIpKQorICAgIGdvdG8gb29tOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IG5fY29waWVzKQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpsaW5rOworCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNvbnRhaW5lci0+Y2hpbGRyZW4pOworICAgICAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIFRlc3RUeXBlTm9kZSAqY2hpbGQgPSBsaW5rLT5kYXRhOworICAgICAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmY29udGFpbmVyLT5jaGlsZHJlbiwgbGluayk7CisKKyAgICAgICAgICBpZiAoIW5vZGVfYnVpbGRfc2lnbmF0dXJlIChjaGlsZCwgc3RyKSkKKyAgICAgICAgICAgIGdvdG8gb29tOworCisgICAgICAgICAgbGluayA9IG5leHQ7CisgICAgICAgIH0KKworICAgICAgKytpOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoc3RyLCBEQlVTX1NUUlVDVF9FTkRfQ0hBUikpCisgICAgZ290byBvb207CisKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChzdHIsIG9yaWdfbGVuKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FycmF5X3dyaXRlX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgVGVzdFR5cGVOb2RlQ29udGFpbmVyICpjb250YWluZXIgPSAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKikgbm9kZTsKKyAgRGF0YUJsb2NrU3RhdGUgc2F2ZWQ7CisgIERCdXNUeXBlV3JpdGVyIHN1YjsKKyAgREJ1c1N0cmluZyBlbGVtZW50X3NpZ25hdHVyZTsKKyAgaW50IGk7CisgIGludCBuX2NvcGllczsKKyAgaW50IGVsZW1lbnRfdHlwZTsKKyAgVGVzdFR5cGVOb2RlICpjaGlsZDsKKworICBuX2NvcGllcyA9IG5vZGUtPmtsYXNzLT5zdWJjbGFzc19kZXRhaWw7CisKKyAgX2RidXNfYXNzZXJ0IChjb250YWluZXItPmNoaWxkcmVuICE9IE5VTEwpOworCisgIGRhdGFfYmxvY2tfc2F2ZSAoYmxvY2ssICZzYXZlZCk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmVsZW1lbnRfc2lnbmF0dXJlKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgY2hpbGQgPSBfZGJ1c19saXN0X2dldF9maXJzdCAoJmNvbnRhaW5lci0+Y2hpbGRyZW4pOworCisgIGlmICghbm9kZV9idWlsZF9zaWduYXR1cmUgKGNoaWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZWxlbWVudF9zaWduYXR1cmUpKQorICAgIGdvdG8gb29tOworCisgIGVsZW1lbnRfdHlwZSA9IF9kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlICgmZWxlbWVudF9zaWduYXR1cmUsIDApOworCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZSAod3JpdGVyLCBEQlVTX1RZUEVfQVJSQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVsZW1lbnRfc2lnbmF0dXJlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdWIpKQorICAgIGdvdG8gb29tOworCisgIGlmIChhcnJheXNfd3JpdGVfZml4ZWRfaW5fYmxvY2tzICYmCisgICAgICBkYnVzX3R5cGVfaXNfZml4ZWQgKGVsZW1lbnRfdHlwZSkgJiYKKyAgICAgIGNoaWxkLT5rbGFzcy0+d3JpdGVfbXVsdGkpCisgICAgeworICAgICAgaWYgKCFub2RlX3dyaXRlX211bHRpIChjaGlsZCwgYmxvY2ssICZzdWIsIHNlZWQsIG5fY29waWVzKSkKKyAgICAgICAgZ290byBvb207CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAoaSA8IG5fY29waWVzKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0xpc3QgKmxpbms7CisKKyAgICAgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNvbnRhaW5lci0+Y2hpbGRyZW4pOworICAgICAgICAgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIFRlc3RUeXBlTm9kZSAqY2hpbGQgPSBsaW5rLT5kYXRhOworICAgICAgICAgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmNvbnRhaW5lci0+Y2hpbGRyZW4sIGxpbmspOworCisgICAgICAgICAgICAgIGlmICghbm9kZV93cml0ZV92YWx1ZSAoY2hpbGQsIGJsb2NrLCAmc3ViLCBzZWVkICsgaSkpCisgICAgICAgICAgICAgICAgZ290byBvb207CisKKyAgICAgICAgICAgICAgbGluayA9IG5leHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl91bnJlY3Vyc2UgKHdyaXRlciwgJnN1YikpCisgICAgZ290byBvb207CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZlbGVtZW50X3NpZ25hdHVyZSk7CisgIHJldHVybiBUUlVFOworCisgb29tOgorICBkYXRhX2Jsb2NrX3Jlc3RvcmUgKGJsb2NrLCAmc2F2ZWQpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmVsZW1lbnRfc2lnbmF0dXJlKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FycmF5X3JlYWRfb3Jfc2V0X3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIFRlc3RUeXBlTm9kZUNvbnRhaW5lciAqY29udGFpbmVyID0gKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopIG5vZGU7CisgIERCdXNUeXBlUmVhZGVyIHN1YjsKKyAgaW50IGk7CisgIGludCBuX2NvcGllczsKKyAgVGVzdFR5cGVOb2RlICpjaGlsZDsKKworICBuX2NvcGllcyA9IG5vZGUtPmtsYXNzLT5zdWJjbGFzc19kZXRhaWw7CisKKyAgY2hlY2tfZXhwZWN0ZWRfdHlwZSAocmVhZGVyLCBEQlVTX1RZUEVfQVJSQVkpOworCisgIGNoaWxkID0gX2RidXNfbGlzdF9nZXRfZmlyc3QgKCZjb250YWluZXItPmNoaWxkcmVuKTsKKworICBpZiAobl9jb3BpZXMgPiAwKQorICAgIHsKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKHJlYWRlciwgJnN1Yik7CisKKyAgICAgIGlmIChyZWFsaWduX3Jvb3QgPT0gTlVMTCAmJiBhcnJheXNfd3JpdGVfZml4ZWRfaW5fYmxvY2tzICYmCisgICAgICAgICAgZGJ1c190eXBlX2lzX2ZpeGVkIChfZGJ1c190eXBlX3JlYWRlcl9nZXRfZWxlbWVudF90eXBlIChyZWFkZXIpKSAmJgorICAgICAgICAgIGNoaWxkLT5rbGFzcy0+cmVhZF9tdWx0aSkKKyAgICAgICAgeworICAgICAgICAgIGlmICghbm9kZV9yZWFkX211bHRpIChjaGlsZCwgJnN1Yiwgc2VlZCwgbl9jb3BpZXMpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpID0gMDsKKyAgICAgICAgICB3aGlsZSAoaSA8IG5fY29waWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBEQnVzTGlzdCAqbGluazsKKworICAgICAgICAgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNvbnRhaW5lci0+Y2hpbGRyZW4pOworICAgICAgICAgICAgICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIFRlc3RUeXBlTm9kZSAqY2hpbGQgPSBsaW5rLT5kYXRhOworICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZjb250YWluZXItPmNoaWxkcmVuLCBsaW5rKTsKKworICAgICAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChjaGlsZC0+a2xhc3MtPnR5cGVjb2RlID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX2dldF9lbGVtZW50X3R5cGUgKHJlYWRlcikpOworCisgICAgICAgICAgICAgICAgICBpZiAocmVhbGlnbl9yb290ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGVfcmVhZF92YWx1ZSAoY2hpbGQsICZzdWIsIHNlZWQgKyBpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlX3NldF92YWx1ZSAoY2hpbGQsICZzdWIsIHJlYWxpZ25fcm9vdCwgc2VlZCArIGkpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGlmIChpID09IChuX2NvcGllcyAtIDEpICYmIG5leHQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgTkVYVF9FWFBFQ1RJTkdfRkFMU0UgKCZzdWIpOworICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBORVhUX0VYUEVDVElOR19UUlVFICgmc3ViKTsKKworICAgICAgICAgICAgICAgICAgbGluayA9IG5leHQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithcnJheV9yZWFkX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgcmV0dXJuIGFycmF5X3JlYWRfb3Jfc2V0X3ZhbHVlIChub2RlLCByZWFkZXIsIE5VTEwsIHNlZWQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FycmF5X3NldF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICByZXR1cm4gYXJyYXlfcmVhZF9vcl9zZXRfdmFsdWUgKG5vZGUsIHJlYWRlciwgcmVhbGlnbl9yb290LCBzZWVkKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithcnJheV9idWlsZF9zaWduYXR1cmUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAqc3RyKQoreworICBUZXN0VHlwZU5vZGVDb250YWluZXIgKmNvbnRhaW5lciA9IChUZXN0VHlwZU5vZGVDb250YWluZXIqKSBub2RlOworICBpbnQgb3JpZ19sZW47CisKKyAgb3JpZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoc3RyLCBEQlVTX1RZUEVfQVJSQVkpKQorICAgIGdvdG8gb29tOworCisgIGlmICghbm9kZV9idWlsZF9zaWduYXR1cmUgKF9kYnVzX2xpc3RfZ2V0X2ZpcnN0ICgmY29udGFpbmVyLT5jaGlsZHJlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cikpCisgICAgZ290byBvb207CisKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChzdHIsIG9yaWdfbGVuKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisgLyogMTAgaXMgcmFuZG9tIGp1c3QgdG8gYWRkIGFub3RoZXIgc2VlZCB0aGF0IHdlIHVzZSBpbiB0aGUgc3VpdGUgKi8KKyNkZWZpbmUgVkFSSUFOVF9TRUVEIDEwCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAordmFyaWFudF93cml0ZV92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIFRlc3RUeXBlTm9kZUNvbnRhaW5lciAqY29udGFpbmVyID0gKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopIG5vZGU7CisgIERhdGFCbG9ja1N0YXRlIHNhdmVkOworICBEQnVzVHlwZVdyaXRlciBzdWI7CisgIERCdXNTdHJpbmcgY29udGVudF9zaWduYXR1cmU7CisgIFRlc3RUeXBlTm9kZSAqY2hpbGQ7CisKKyAgX2RidXNfYXNzZXJ0IChjb250YWluZXItPmNoaWxkcmVuICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2xpc3RfbGVuZ3RoX2lzX29uZSAoJmNvbnRhaW5lci0+Y2hpbGRyZW4pKTsKKworICBjaGlsZCA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0ICgmY29udGFpbmVyLT5jaGlsZHJlbik7CisKKyAgZGF0YV9ibG9ja19zYXZlIChibG9jaywgJnNhdmVkKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmY29udGVudF9zaWduYXR1cmUpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIW5vZGVfYnVpbGRfc2lnbmF0dXJlIChjaGlsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRlbnRfc2lnbmF0dXJlKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3JlY3Vyc2UgKHdyaXRlciwgREJVU19UWVBFX1ZBUklBTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRlbnRfc2lnbmF0dXJlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdWIpKQorICAgIGdvdG8gb29tOworCisgIGlmICghbm9kZV93cml0ZV92YWx1ZSAoY2hpbGQsIGJsb2NrLCAmc3ViLCBzZWVkICsgVkFSSUFOVF9TRUVEKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3VucmVjdXJzZSAod3JpdGVyLCAmc3ViKSkKKyAgICBnb3RvIG9vbTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbnRlbnRfc2lnbmF0dXJlKTsKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIGRhdGFfYmxvY2tfcmVzdG9yZSAoYmxvY2ssICZzYXZlZCk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29udGVudF9zaWduYXR1cmUpOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAordmFyaWFudF9yZWFkX29yX3NldF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBUZXN0VHlwZU5vZGVDb250YWluZXIgKmNvbnRhaW5lciA9IChUZXN0VHlwZU5vZGVDb250YWluZXIqKSBub2RlOworICBEQnVzVHlwZVJlYWRlciBzdWI7CisgIFRlc3RUeXBlTm9kZSAqY2hpbGQ7CisKKyAgX2RidXNfYXNzZXJ0IChjb250YWluZXItPmNoaWxkcmVuICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2xpc3RfbGVuZ3RoX2lzX29uZSAoJmNvbnRhaW5lci0+Y2hpbGRyZW4pKTsKKworICBjaGlsZCA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0ICgmY29udGFpbmVyLT5jaGlsZHJlbik7CisKKyAgY2hlY2tfZXhwZWN0ZWRfdHlwZSAocmVhZGVyLCBEQlVTX1RZUEVfVkFSSUFOVCk7CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAocmVhZGVyLCAmc3ViKTsKKworICBpZiAocmVhbGlnbl9yb290ID09IE5VTEwpCisgICAgeworICAgICAgaWYgKCFub2RlX3JlYWRfdmFsdWUgKGNoaWxkLCAmc3ViLCBzZWVkICsgVkFSSUFOVF9TRUVEKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghbm9kZV9zZXRfdmFsdWUgKGNoaWxkLCAmc3ViLCByZWFsaWduX3Jvb3QsIHNlZWQgKyBWQVJJQU5UX1NFRUQpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIE5FWFRfRVhQRUNUSU5HX0ZBTFNFICgmc3ViKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Cit2YXJpYW50X3JlYWRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgcmV0dXJuIHZhcmlhbnRfcmVhZF9vcl9zZXRfdmFsdWUgKG5vZGUsIHJlYWRlciwgTlVMTCwgc2VlZCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAordmFyaWFudF9zZXRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgcmV0dXJuIHZhcmlhbnRfcmVhZF9vcl9zZXRfdmFsdWUgKG5vZGUsIHJlYWRlciwgcmVhbGlnbl9yb290LCBzZWVkKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitkaWN0X3dyaXRlX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgVGVzdFR5cGVOb2RlQ29udGFpbmVyICpjb250YWluZXIgPSAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKikgbm9kZTsKKyAgRGF0YUJsb2NrU3RhdGUgc2F2ZWQ7CisgIERCdXNUeXBlV3JpdGVyIHN1YjsKKyAgREJ1c1N0cmluZyBlbnRyeV92YWx1ZV9zaWduYXR1cmU7CisgIERCdXNTdHJpbmcgZGljdF9lbnRyeV9zaWduYXR1cmU7CisgIGludCBpOworICBpbnQgbl9lbnRyaWVzOworICBUZXN0VHlwZU5vZGUgKmNoaWxkOworCisgIG5fZW50cmllcyA9IG5vZGUtPmtsYXNzLT5zdWJjbGFzc19kZXRhaWw7CisKKyAgX2RidXNfYXNzZXJ0IChjb250YWluZXItPmNoaWxkcmVuICE9IE5VTEwpOworCisgIGRhdGFfYmxvY2tfc2F2ZSAoYmxvY2ssICZzYXZlZCk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmVudHJ5X3ZhbHVlX3NpZ25hdHVyZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZkaWN0X2VudHJ5X3NpZ25hdHVyZSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZlbnRyeV92YWx1ZV9zaWduYXR1cmUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGNoaWxkID0gX2RidXNfbGlzdF9nZXRfZmlyc3QgKCZjb250YWluZXItPmNoaWxkcmVuKTsKKworICBpZiAoIW5vZGVfYnVpbGRfc2lnbmF0dXJlIChjaGlsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVudHJ5X3ZhbHVlX3NpZ25hdHVyZSkpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZGljdF9lbnRyeV9zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVJfQVNfU1RSSU5HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyX0FTX1NUUklORykpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmVudHJ5X3ZhbHVlX3NpZ25hdHVyZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpY3RfZW50cnlfc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmRpY3RfZW50cnlfc2lnbmF0dXJlKSkpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZkaWN0X2VudHJ5X3NpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUikpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl9yZWN1cnNlICh3cml0ZXIsIERCVVNfVFlQRV9BUlJBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGljdF9lbnRyeV9zaWduYXR1cmUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1YikpCisgICAgZ290byBvb207CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbl9lbnRyaWVzKQorICAgIHsKKyAgICAgIERCdXNUeXBlV3JpdGVyIGVudHJ5X3N1YjsKKyAgICAgIGRidXNfaW50MzJfdCBrZXk7CisKKyAgICAgIGlmICghX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZSAoJnN1YiwgREJVU19UWVBFX0RJQ1RfRU5UUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnRyeV9zdWIpKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAga2V5ID0gaW50MzJfZnJvbV9zZWVkIChzZWVkICsgaSk7CisKKyAgICAgIGlmICghX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKCZlbnRyeV9zdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5KSkKKyAgICAgICAgZ290byBvb207CisgICAgICAKKyAgICAgIGlmICghbm9kZV93cml0ZV92YWx1ZSAoY2hpbGQsIGJsb2NrLCAmZW50cnlfc3ViLCBzZWVkICsgaSkpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3VucmVjdXJzZSAoJnN1YiwgJmVudHJ5X3N1YikpCisgICAgICAgIGdvdG8gb29tOworICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfdW5yZWN1cnNlICh3cml0ZXIsICZzdWIpKQorICAgIGdvdG8gb29tOworICAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZlbnRyeV92YWx1ZV9zaWduYXR1cmUpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRpY3RfZW50cnlfc2lnbmF0dXJlKTsKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIGRhdGFfYmxvY2tfcmVzdG9yZSAoYmxvY2ssICZzYXZlZCk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZW50cnlfdmFsdWVfc2lnbmF0dXJlKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkaWN0X2VudHJ5X3NpZ25hdHVyZSk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitkaWN0X3JlYWRfb3Jfc2V0X3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIFRlc3RUeXBlTm9kZUNvbnRhaW5lciAqY29udGFpbmVyID0gKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopIG5vZGU7CisgIERCdXNUeXBlUmVhZGVyIHN1YjsKKyAgaW50IGk7CisgIGludCBuX2VudHJpZXM7CisgIFRlc3RUeXBlTm9kZSAqY2hpbGQ7CisKKyAgbl9lbnRyaWVzID0gbm9kZS0+a2xhc3MtPnN1YmNsYXNzX2RldGFpbDsKKworICBjaGVja19leHBlY3RlZF90eXBlIChyZWFkZXIsIERCVVNfVFlQRV9BUlJBWSk7CisKKyAgY2hpbGQgPSBfZGJ1c19saXN0X2dldF9maXJzdCAoJmNvbnRhaW5lci0+Y2hpbGRyZW4pOworCisgIGlmIChuX2VudHJpZXMgPiAwKQorICAgIHsKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKHJlYWRlciwgJnN1Yik7CisKKyAgICAgIGNoZWNrX2V4cGVjdGVkX3R5cGUgKCZzdWIsIERCVVNfVFlQRV9ESUNUX0VOVFJZKTsKKyAgICAgIAorICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAoaSA8IG5fZW50cmllcykKKyAgICAgICAgeworICAgICAgICAgIERCdXNUeXBlUmVhZGVyIGVudHJ5X3N1YjsKKworICAgICAgICAgIGNoZWNrX2V4cGVjdGVkX3R5cGUgKCZzdWIsIERCVVNfVFlQRV9ESUNUX0VOVFJZKTsKKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlICgmc3ViLCAmZW50cnlfc3ViKTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAocmVhbGlnbl9yb290ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfaW50MzJfdCB2OworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgY2hlY2tfZXhwZWN0ZWRfdHlwZSAoJmVudHJ5X3N1YiwgREJVU19UWVBFX0lOVDMyKTsKKworICAgICAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljICgmZW50cnlfc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGJ1c19pbnQzMl90KikgJnYpOworCisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAodiA9PSBpbnQzMl9mcm9tX3NlZWQgKHNlZWQgKyBpKSk7CisKKyAgICAgICAgICAgICAgTkVYVF9FWFBFQ1RJTkdfVFJVRSAoJmVudHJ5X3N1Yik7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoIW5vZGVfcmVhZF92YWx1ZSAoY2hpbGQsICZlbnRyeV9zdWIsIHNlZWQgKyBpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgICAgICAgTkVYVF9FWFBFQ1RJTkdfRkFMU0UgKCZlbnRyeV9zdWIpOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19pbnQzMl90IHY7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICB2ID0gaW50MzJfZnJvbV9zZWVkIChzZWVkICsgaSk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoIV9kYnVzX3R5cGVfcmVhZGVyX3NldF9iYXNpYyAoJmVudHJ5X3N1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGlnbl9yb290KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgICAgICAgTkVYVF9FWFBFQ1RJTkdfVFJVRSAoJmVudHJ5X3N1Yik7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoIW5vZGVfc2V0X3ZhbHVlIChjaGlsZCwgJmVudHJ5X3N1YiwgcmVhbGlnbl9yb290LCBzZWVkICsgaSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgICAgIE5FWFRfRVhQRUNUSU5HX0ZBTFNFICgmZW50cnlfc3ViKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoaSA9PSAobl9lbnRyaWVzIC0gMSkpCisgICAgICAgICAgICBORVhUX0VYUEVDVElOR19GQUxTRSAoJnN1Yik7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgTkVYVF9FWFBFQ1RJTkdfVFJVRSAoJnN1Yik7CisKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZGljdF9yZWFkX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIHJldHVybiBkaWN0X3JlYWRfb3Jfc2V0X3ZhbHVlIChub2RlLCByZWFkZXIsIE5VTEwsIHNlZWQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2RpY3Rfc2V0X3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIHJldHVybiBkaWN0X3JlYWRfb3Jfc2V0X3ZhbHVlIChub2RlLCByZWFkZXIsIHJlYWxpZ25fcm9vdCwgc2VlZCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZGljdF9idWlsZF9zaWduYXR1cmUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICpzdHIpCit7CisgIFRlc3RUeXBlTm9kZUNvbnRhaW5lciAqY29udGFpbmVyID0gKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopIG5vZGU7CisgIGludCBvcmlnX2xlbjsKKworICBvcmlnX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChzdHIsIERCVVNfVFlQRV9BUlJBWSkpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kIChzdHIsIERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSX0FTX1NUUklORyBEQlVTX1RZUEVfSU5UMzJfQVNfU1RSSU5HKSkKKyAgICBnb3RvIG9vbTsKKyAgCisgIGlmICghbm9kZV9idWlsZF9zaWduYXR1cmUgKF9kYnVzX2xpc3RfZ2V0X2ZpcnN0ICgmY29udGFpbmVyLT5jaGlsZHJlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cikpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKHN0ciwgREJVU19ESUNUX0VOVFJZX0VORF9DSEFSKSkKKyAgICBnb3RvIG9vbTsKKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKHN0ciwgb3JpZ19sZW4pOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCitjb250YWluZXJfZGVzdHJveSAoVGVzdFR5cGVOb2RlICpub2RlKQoreworICBUZXN0VHlwZU5vZGVDb250YWluZXIgKmNvbnRhaW5lciA9IChUZXN0VHlwZU5vZGVDb250YWluZXIqKSBub2RlOworICBEQnVzTGlzdCAqbGluazsKKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNvbnRhaW5lci0+Y2hpbGRyZW4pOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIFRlc3RUeXBlTm9kZSAqY2hpbGQgPSBsaW5rLT5kYXRhOworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZjb250YWluZXItPmNoaWxkcmVuLCBsaW5rKTsKKworICAgICAgbm9kZV9kZXN0cm95IChjaGlsZCk7CisKKyAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChsaW5rKTsKKworICAgICAgbGluayA9IG5leHQ7CisgICAgfQorfQorCisjZW5kaWYgLyogIURPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUyAqLworCisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUuYyBiL2RidXMvZGJ1cy9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFkZmQyZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmMKQEAgLTAsMCArMSwyNzUyIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWFyc2hhbC1yZWN1cnNpdmUuYyAgTWFyc2hhbGxpbmcgcm91dGluZXMgZm9yIHJlY3Vyc2l2ZSB0eXBlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1iYXNpYy5oIgorI2luY2x1ZGUgImRidXMtc2lnbmF0dXJlLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzTWFyc2hhbAorICogQHsKKyAqLworCitzdGF0aWMgZGJ1c19ib29sX3QgX2RidXNfdHlwZV9yZWFkZXJfZ3JlYXRlcl90aGFuICAgICAgICAgICAgICAoY29uc3QgREJ1c1R5cGVSZWFkZXIgICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1R5cGVSZWFkZXIgICpyaHMpOworCitzdGF0aWMgdm9pZCAgICAgICBfZGJ1c190eXBlX3dyaXRlcl9zZXRfZW5hYmxlZCAgICAgICAgICAgKERCdXNUeXBlV3JpdGVyICAgICAgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgIGVuYWJsZWQpOworc3RhdGljIGRidXNfYm9vbF90IF9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX3JlYWRlcl9wYXJ0aWFsIChEQnVzVHlwZVdyaXRlciAgICAgICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgICAgICAgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNUeXBlUmVhZGVyICAqc3RhcnRfYWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgc3RhcnRfYWZ0ZXJfbmV3X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICBzdGFydF9hZnRlcl9uZXdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAgICAgICAqKmZpeHVwcyk7CisKKy8qKiB0dXJuIHRoaXMgb24gdG8gZ2V0IGRlbHVnZWQgaW4gVHlwZVJlYWRlciB2ZXJib3NlIHNwYW0gKi8KKyNkZWZpbmUgUkVDVVJTSVZFX01BUlNIQUxfUkVBRF9UUkFDRSAgMAorCisvKiogdHVybiB0aGlzIG9uIHRvIGdldCBkZWx1Z2VkIGluIFR5cGVXcml0ZXIgdmVyYm9zZSBzcGFtICovCisjZGVmaW5lIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFIDAKKworc3RhdGljIHZvaWQKK2ZyZWVfZml4dXBzIChEQnVzTGlzdCAqKmZpeHVwcykKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKGZpeHVwcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0xpc3QgKm5leHQ7CisKKyAgICAgIG5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGZpeHVwcywgbGluayk7CisKKyAgICAgIGRidXNfZnJlZSAobGluay0+ZGF0YSk7CisgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAobGluayk7CisKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KKworICAqZml4dXBzID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2FwcGx5X2FuZF9mcmVlX2ZpeHVwcyAoREJ1c0xpc3QgICAgICAqKmZpeHVwcywKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlcikKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICBpZiAoKmZpeHVwcykKKyAgICBfZGJ1c192ZXJib3NlICgiICVkIEZJWFVQUyB0byBhcHBseVxuIiwKKyAgICAgICAgICAgICAgICAgICBfZGJ1c19saXN0X2dldF9sZW5ndGggKGZpeHVwcykpOworI2VuZGlmCisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKGZpeHVwcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0xpc3QgKm5leHQ7CisKKyAgICAgIG5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGZpeHVwcywgbGluayk7CisKKyAgICAgIGlmIChyZWFkZXIpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzQXJyYXlMZW5GaXh1cCAqZjsKKworICAgICAgICAgIGYgPSBsaW5rLT5kYXRhOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiIGFwcGx5aW5nIEZJWFVQIHRvIHJlYWRlciAlcCBhdCBwb3MgJWQgbmV3X2xlbiA9ICVkIG9sZCBsZW4gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLCBmLT5sZW5fcG9zX2luX3JlYWRlciwgZi0+bmV3X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19tYXJzaGFsX3JlYWRfdWludDMyIChyZWFkZXItPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5sZW5fcG9zX2luX3JlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXItPmJ5dGVfb3JkZXIsIE5VTEwpKTsKKyNlbmRpZgorCisgICAgICAgICAgX2RidXNfbWFyc2hhbF9zZXRfdWludDMyICgoREJ1c1N0cmluZyopIHJlYWRlci0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+bGVuX3Bvc19pbl9yZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5uZXdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT5ieXRlX29yZGVyKTsKKyAgICAgICAgfQorCisgICAgICBkYnVzX2ZyZWUgKGxpbmstPmRhdGEpOworICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmspOworCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisKKyAgKmZpeHVwcyA9IE5VTEw7Cit9CisKKy8qKgorICogVmlydHVhbCB0YWJsZSBmb3IgYSB0eXBlIHJlYWRlci4KKyAqLworc3RydWN0IERCdXNUeXBlUmVhZGVyQ2xhc3MKK3sKKyAgY29uc3QgY2hhciAqbmFtZTsgICAgICAgLyoqPCBuYW1lIGZvciBkZWJ1Z2dpbmcgKi8KKyAgaW50ICAgICAgICAgaWQ7ICAgICAgICAgLyoqPCBpbmRleCBpbiBhbGxfcmVhZGVyX2NsYXNzZXMgKi8KKyAgZGJ1c19ib29sX3QgdHlwZXNfb25seTsgLyoqPCBvbmx5IGl0ZXJhdGVzIG92ZXIgdHlwZXMsIG5vdCB2YWx1ZXMgKi8KKyAgdm9pZCAgICAgICAgKCogcmVjdXJzZSkgICAgICAgICAgKERCdXNUeXBlUmVhZGVyICAgICAgICAqc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgICAgICAgICpwYXJlbnQpOyAvKio8IHJlY3Vyc2Ugd2l0aCB0aGlzIHJlYWRlciBhcyBzdWIgKi8KKyAgZGJ1c19ib29sX3QgKCogY2hlY2tfZmluaXNoZWQpICAgKGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhZGVyKTsgLyoqPCBjaGVjayB3aGV0aGVyIHJlYWRlciBpcyBhdCB0aGUgZW5kICovCisgIHZvaWQgICAgICAgICgqIG5leHQpICAgICAgICAgICAgIChEQnVzVHlwZVJlYWRlciAgICAgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgY3VycmVudF90eXBlKTsgLyoqPCBnbyB0byB0aGUgbmV4dCB2YWx1ZSAqLworfTsKKworc3RhdGljIGludAorZWxlbWVudF90eXBlX2dldF9hbGlnbm1lbnQgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBwb3MpCit7CisgIHJldHVybiBfZGJ1c190eXBlX2dldF9hbGlnbm1lbnQgKF9kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlIChzdHIsIHBvcykpOworfQorCitzdGF0aWMgdm9pZAorcmVhZGVyX2luaXQgKERCdXNUeXBlUmVhZGVyICAgICpyZWFkZXIsCisgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKnR5cGVfc3RyLAorICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICB0eXBlX3BvcywKKyAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqdmFsdWVfc3RyLAorICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICB2YWx1ZV9wb3MpCit7CisgIHJlYWRlci0+Ynl0ZV9vcmRlciA9IGJ5dGVfb3JkZXI7CisgIHJlYWRlci0+ZmluaXNoZWQgPSBGQUxTRTsKKyAgcmVhZGVyLT50eXBlX3N0ciA9IHR5cGVfc3RyOworICByZWFkZXItPnR5cGVfcG9zID0gdHlwZV9wb3M7CisgIHJlYWRlci0+dmFsdWVfc3RyID0gdmFsdWVfc3RyOworICByZWFkZXItPnZhbHVlX3BvcyA9IHZhbHVlX3BvczsKK30KKworc3RhdGljIHZvaWQKK2Jhc2VfcmVhZGVyX3JlY3Vyc2UgKERCdXNUeXBlUmVhZGVyICpzdWIsCisgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcGFyZW50KQoreworICAvKiBwb2ludCBzdWJyZWFkZXIgYXQgdGhlIHNhbWUgcGxhY2UgYXMgcGFyZW50ICovCisgIHJlYWRlcl9pbml0IChzdWIsCisgICAgICAgICAgICAgICBwYXJlbnQtPmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICBwYXJlbnQtPnR5cGVfc3RyLAorICAgICAgICAgICAgICAgcGFyZW50LT50eXBlX3BvcywKKyAgICAgICAgICAgICAgIHBhcmVudC0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgcGFyZW50LT52YWx1ZV9wb3MpOworfQorCitzdGF0aWMgdm9pZAorc3RydWN0X29yX2RpY3RfZW50cnlfdHlwZXNfb25seV9yZWFkZXJfcmVjdXJzZSAoREJ1c1R5cGVSZWFkZXIgKnN1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpwYXJlbnQpCit7CisgIGJhc2VfcmVhZGVyX3JlY3Vyc2UgKHN1YiwgcGFyZW50KTsKKyAgCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChzdWItPnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLT50eXBlX3BvcykgPT0gREJVU19TVFJVQ1RfQkVHSU5fQ0hBUiB8fAorICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoc3ViLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yi0+dHlwZV9wb3MpID09IERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSKTsKKworICBzdWItPnR5cGVfcG9zICs9IDE7Cit9CisKK3N0YXRpYyB2b2lkCitzdHJ1Y3Rfb3JfZGljdF9lbnRyeV9yZWFkZXJfcmVjdXJzZSAoREJ1c1R5cGVSZWFkZXIgKnN1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcGFyZW50KQoreworICBzdHJ1Y3Rfb3JfZGljdF9lbnRyeV90eXBlc19vbmx5X3JlYWRlcl9yZWN1cnNlIChzdWIsIHBhcmVudCk7CisKKyAgLyogc3RydWN0IGFuZCBkaWN0IGVudHJ5IGhhdmUgOCBieXRlIGFsaWdubWVudCAqLworICBzdWItPnZhbHVlX3BvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChzdWItPnZhbHVlX3BvcywgOCk7Cit9CisKK3N0YXRpYyB2b2lkCithcnJheV90eXBlc19vbmx5X3JlYWRlcl9yZWN1cnNlIChEQnVzVHlwZVJlYWRlciAqc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnBhcmVudCkKK3sKKyAgYmFzZV9yZWFkZXJfcmVjdXJzZSAoc3ViLCBwYXJlbnQpOworCisgIC8qIHBvaW50IHR5cGVfcG9zIGF0IHRoZSBhcnJheSBlbGVtZW50IHR5cGUgKi8KKyAgc3ViLT50eXBlX3BvcyArPSAxOworCisgIC8qIEluaXQgd2l0aCB2YWx1ZXMgbGlrZWx5IHRvIGNyYXNoIHRoaW5ncyBpZiBtaXN1c2VkICovCisgIHN1Yi0+dS5hcnJheS5zdGFydF9wb3MgPSBfREJVU19JTlRfTUFYOworICBzdWItPmFycmF5X2xlbl9vZmZzZXQgPSA3OworfQorCisvKiogY29tcHV0ZSBwb3NpdGlvbiBvZiBhcnJheSBsZW5ndGggZ2l2ZW4gYXJyYXlfbGVuX29mZnNldCwgd2hpY2ggaXMKKyAgICB0aGUgb2Zmc2V0IGJhY2sgZnJvbSBzdGFydF9wb3MgdG8gZW5kIG9mIHRoZSBsZW4gKi8KKyNkZWZpbmUgQVJSQVlfUkVBREVSX0xFTl9QT1MocmVhZGVyKSBcCisgICgocmVhZGVyKS0+dS5hcnJheS5zdGFydF9wb3MgLSAoKGludCkocmVhZGVyKS0+YXJyYXlfbGVuX29mZnNldCkgLSA0KQorCitzdGF0aWMgaW50CithcnJheV9yZWFkZXJfZ2V0X2FycmF5X2xlbiAoY29uc3QgREJ1c1R5cGVSZWFkZXIgKnJlYWRlcikKK3sKKyAgZGJ1c191aW50MzJfdCBhcnJheV9sZW47CisgIGludCBsZW5fcG9zOworCisgIGxlbl9wb3MgPSBBUlJBWV9SRUFERVJfTEVOX1BPUyAocmVhZGVyKTsKKworICBfZGJ1c19hc3NlcnQgKF9EQlVTX0FMSUdOX1ZBTFVFIChsZW5fcG9zLCA0KSA9PSAodW5zaWduZWQpIGxlbl9wb3MpOworICBhcnJheV9sZW4gPSBfZGJ1c191bnBhY2tfdWludDMyIChyZWFkZXItPmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHJlYWRlci0+dmFsdWVfc3RyLCBsZW5fcG9zLCA0KSk7CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9SRUFEX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCIgICByZWFkZXIgJXAgbGVuX3BvcyAlZCBhcnJheSBsZW4gJXUgbGVuX29mZnNldCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgcmVhZGVyLCBsZW5fcG9zLCBhcnJheV9sZW4sIHJlYWRlci0+YXJyYXlfbGVuX29mZnNldCk7CisjZW5kaWYKKworICBfZGJ1c19hc3NlcnQgKHJlYWRlci0+dS5hcnJheS5zdGFydF9wb3MgLSBsZW5fcG9zIC0gNCA8IDgpOworCisgIHJldHVybiBhcnJheV9sZW47Cit9CisKK3N0YXRpYyB2b2lkCithcnJheV9yZWFkZXJfcmVjdXJzZSAoREJ1c1R5cGVSZWFkZXIgKnN1YiwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcGFyZW50KQoreworICBpbnQgYWxpZ25tZW50OworICBpbnQgbGVuX3BvczsKKworICBhcnJheV90eXBlc19vbmx5X3JlYWRlcl9yZWN1cnNlIChzdWIsIHBhcmVudCk7CisKKyAgc3ViLT52YWx1ZV9wb3MgPSBfREJVU19BTElHTl9WQUxVRSAoc3ViLT52YWx1ZV9wb3MsIDQpOworCisgIGxlbl9wb3MgPSBzdWItPnZhbHVlX3BvczsKKworICBzdWItPnZhbHVlX3BvcyArPSA0OyAvKiBmb3IgdGhlIGxlbmd0aCAqLworCisgIGFsaWdubWVudCA9IGVsZW1lbnRfdHlwZV9nZXRfYWxpZ25tZW50IChzdWItPnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLT50eXBlX3Bvcyk7CisKKyAgc3ViLT52YWx1ZV9wb3MgPSBfREJVU19BTElHTl9WQUxVRSAoc3ViLT52YWx1ZV9wb3MsIGFsaWdubWVudCk7CisKKyAgc3ViLT51LmFycmF5LnN0YXJ0X3BvcyA9IHN1Yi0+dmFsdWVfcG9zOworICBfZGJ1c19hc3NlcnQgKChzdWItPnUuYXJyYXkuc3RhcnRfcG9zIC0gKGxlbl9wb3MgKyA0KSkgPCA4KTsgLyogb25seSAzIGJpdHMgaW4gYXJyYXlfbGVuX29mZnNldCAqLworICBzdWItPmFycmF5X2xlbl9vZmZzZXQgPSBzdWItPnUuYXJyYXkuc3RhcnRfcG9zIC0gKGxlbl9wb3MgKyA0KTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1JFQURfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgICB0eXBlIHJlYWRlciAlcCBhcnJheSBzdGFydCA9ICVkIGxlbl9vZmZzZXQgPSAlZCBhcnJheSBsZW4gPSAlZCBhcnJheSBlbGVtZW50IHR5cGUgPSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgc3ViLAorICAgICAgICAgICAgICAgICBzdWItPnUuYXJyYXkuc3RhcnRfcG9zLAorICAgICAgICAgICAgICAgICBzdWItPmFycmF5X2xlbl9vZmZzZXQsCisgICAgICAgICAgICAgICAgIGFycmF5X3JlYWRlcl9nZXRfYXJyYXlfbGVuIChzdWIpLAorICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAoX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmUgKHN1Yi0+dHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLT50eXBlX3BvcykpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAordmFyaWFudF9yZWFkZXJfcmVjdXJzZSAoREJ1c1R5cGVSZWFkZXIgKnN1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpwYXJlbnQpCit7CisgIGludCBzaWdfbGVuOworICBpbnQgY29udGFpbmVkX2FsaWdubWVudDsKKworICBiYXNlX3JlYWRlcl9yZWN1cnNlIChzdWIsIHBhcmVudCk7CisKKyAgLyogVmFyaWFudCBpcyAxIGJ5dGUgc2lnIGxlbmd0aCAod2l0aG91dCBudWwpLCBzaWduYXR1cmUgd2l0aCBudWwsCisgICAqIHBhZGRpbmcgdG8gOC1ib3VuZGFyeSwgdGhlbiB2YWx1ZXMKKyAgICovCisKKyAgc2lnX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoc3ViLT52YWx1ZV9zdHIsIHN1Yi0+dmFsdWVfcG9zKTsKKworICBzdWItPnR5cGVfc3RyID0gc3ViLT52YWx1ZV9zdHI7CisgIHN1Yi0+dHlwZV9wb3MgPSBzdWItPnZhbHVlX3BvcyArIDE7CisKKyAgc3ViLT52YWx1ZV9wb3MgPSBzdWItPnR5cGVfcG9zICsgc2lnX2xlbiArIDE7CisKKyAgY29udGFpbmVkX2FsaWdubWVudCA9IF9kYnVzX3R5cGVfZ2V0X2FsaWdubWVudCAoX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmUgKHN1Yi0+dHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWItPnR5cGVfcG9zKSk7CisgIAorICBzdWItPnZhbHVlX3BvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChzdWItPnZhbHVlX3BvcywgY29udGFpbmVkX2FsaWdubWVudCk7CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9SRUFEX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCIgICAgdHlwZSByZWFkZXIgJXAgdmFyaWFudCBjb250YWluaW5nICclcydcbiIsCisgICAgICAgICAgICAgICAgIHN1YiwKKyAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAoc3ViLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLT50eXBlX3BvcywgMCkpOworI2VuZGlmCit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYXJyYXlfcmVhZGVyX2NoZWNrX2ZpbmlzaGVkIChjb25zdCBEQnVzVHlwZVJlYWRlciAqcmVhZGVyKQoreworICBpbnQgZW5kX3BvczsKKworICAvKiByZXR1cm4gdGhlIGFycmF5IGVsZW1lbnQgdHlwZSBpZiBlbGVtZW50cyByZW1haW4sIGFuZAorICAgKiBUWVBFX0lOVkFMSUQgb3RoZXJ3aXNlCisgICAqLworCisgIGVuZF9wb3MgPSByZWFkZXItPnUuYXJyYXkuc3RhcnRfcG9zICsgYXJyYXlfcmVhZGVyX2dldF9hcnJheV9sZW4gKHJlYWRlcik7CisKKyAgX2RidXNfYXNzZXJ0IChyZWFkZXItPnZhbHVlX3BvcyA8PSBlbmRfcG9zKTsKKyAgX2RidXNfYXNzZXJ0IChyZWFkZXItPnZhbHVlX3BvcyA+PSByZWFkZXItPnUuYXJyYXkuc3RhcnRfcG9zKTsKKworICByZXR1cm4gcmVhZGVyLT52YWx1ZV9wb3MgPT0gZW5kX3BvczsKK30KKworc3RhdGljIHZvaWQKK3NraXBfb25lX2NvbXBsZXRlX3R5cGUgKGNvbnN0IERCdXNTdHJpbmcgKnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqdHlwZV9wb3MpCit7CisgIF9kYnVzX3R5cGVfc2lnbmF0dXJlX25leHQgKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAodHlwZV9zdHIpLAorCQkJICAgICB0eXBlX3Bvcyk7Cit9CisKKy8qKgorICogU2tpcHMgdG8gdGhlIG5leHQgImNvbXBsZXRlIiB0eXBlIGluc2lkZSBhIHR5cGUgc2lnbmF0dXJlLgorICogVGhlIHNpZ25hdHVyZSBpcyByZWFkIHN0YXJ0aW5nIGF0IHR5cGVfcG9zLCBhbmQgdGhlIG5leHQKKyAqIHR5cGUgcG9zaXRpb24gaXMgc3RvcmVkIGluIHRoZSBzYW1lIHZhcmlhYmxlLgorICoKKyAqIEBwYXJhbSB0eXBlX3N0ciBhIHR5cGUgc2lnbmF0dXJlIChtdXN0IGJlIHZhbGlkKQorICogQHBhcmFtIHR5cGVfcG9zIGFuIGludGVnZXIgcG9zaXRpb24gaW4gdGhlIHR5cGUgc2lnbmF0dXJlIChpbiBhbmQgb3V0KQorICovCit2b2lkCitfZGJ1c190eXBlX3NpZ25hdHVyZV9uZXh0IChjb25zdCBjaGFyICAgICAgICp0eXBlX3N0ciwKKwkJCSAgIGludCAgICAgICAgICAgICAgKnR5cGVfcG9zKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpzdGFydDsKKworICBfZGJ1c19hc3NlcnQgKHR5cGVfc3RyICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHR5cGVfcG9zICE9IE5VTEwpOworICAKKyAgc3RhcnQgPSB0eXBlX3N0cjsKKyAgcCA9IHN0YXJ0ICsgKnR5cGVfcG9zOworCisgIF9kYnVzX2Fzc2VydCAoKnAgIT0gREJVU19TVFJVQ1RfRU5EX0NIQVIpOworICBfZGJ1c19hc3NlcnQgKCpwICE9IERCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUik7CisgIAorICB3aGlsZSAoKnAgPT0gREJVU19UWVBFX0FSUkFZKQorICAgICsrcDsKKworICBfZGJ1c19hc3NlcnQgKCpwICE9IERCVVNfU1RSVUNUX0VORF9DSEFSKTsKKyAgX2RidXNfYXNzZXJ0ICgqcCAhPSBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVIpOworICAKKyAgaWYgKCpwID09IERCVVNfU1RSVUNUX0JFR0lOX0NIQVIpCisgICAgeworICAgICAgaW50IGRlcHRoOworCisgICAgICBkZXB0aCA9IDE7CisKKyAgICAgIHdoaWxlIChUUlVFKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfYXNzZXJ0ICgqcCAhPSBEQlVTX1RZUEVfSU5WQUxJRCk7CisKKyAgICAgICAgICArK3A7CisKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKCpwICE9IERCVVNfVFlQRV9JTlZBTElEKTsKKworICAgICAgICAgIGlmICgqcCA9PSBEQlVTX1NUUlVDVF9CRUdJTl9DSEFSKQorICAgICAgICAgICAgZGVwdGggKz0gMTsKKyAgICAgICAgICBlbHNlIGlmICgqcCA9PSBEQlVTX1NUUlVDVF9FTkRfQ0hBUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGVwdGggLT0gMTsKKyAgICAgICAgICAgICAgaWYgKGRlcHRoID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgKytwOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICBlbHNlIGlmICgqcCA9PSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUikKKyAgICB7CisgICAgICBpbnQgZGVwdGg7CisKKyAgICAgIGRlcHRoID0gMTsKKworICAgICAgd2hpbGUgKFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKCpwICE9IERCVVNfVFlQRV9JTlZBTElEKTsKKworICAgICAgICAgICsrcDsKKworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoKnAgIT0gREJVU19UWVBFX0lOVkFMSUQpOworCisgICAgICAgICAgaWYgKCpwID09IERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSKQorICAgICAgICAgICAgZGVwdGggKz0gMTsKKyAgICAgICAgICBlbHNlIGlmICgqcCA9PSBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRlcHRoIC09IDE7CisgICAgICAgICAgICAgIGlmIChkZXB0aCA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICsrcDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICsrcDsKKyAgICB9CisKKyAgKnR5cGVfcG9zID0gKGludCkgKHAgLSBzdGFydCk7Cit9CisKK3N0YXRpYyBpbnQKK2ZpbmRfbGVuX29mX2NvbXBsZXRlX3R5cGUgKGNvbnN0IERCdXNTdHJpbmcgKnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgdHlwZV9wb3MpCit7CisgIGludCBlbmQ7CisKKyAgZW5kID0gdHlwZV9wb3M7CisKKyAgc2tpcF9vbmVfY29tcGxldGVfdHlwZSAodHlwZV9zdHIsICZlbmQpOworCisgIHJldHVybiBlbmQgLSB0eXBlX3BvczsKK30KKworc3RhdGljIHZvaWQKK2Jhc2VfcmVhZGVyX25leHQgKERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgY3VycmVudF90eXBlKQoreworICBzd2l0Y2ggKGN1cnJlbnRfdHlwZSkKKyAgICB7CisgICAgY2FzZSBEQlVTX1RZUEVfRElDVF9FTlRSWToKKyAgICBjYXNlIERCVVNfVFlQRV9TVFJVQ1Q6CisgICAgY2FzZSBEQlVTX1RZUEVfVkFSSUFOVDoKKyAgICAgIC8qIFNjYW4gZm9yd2FyZCBvdmVyIHRoZSBlbnRpcmUgY29udGFpbmVyIGNvbnRlbnRzICovCisgICAgICB7CisgICAgICAgIERCdXNUeXBlUmVhZGVyIHN1YjsKKworICAgICAgICBpZiAocmVhZGVyLT5rbGFzcy0+dHlwZXNfb25seSAmJiBjdXJyZW50X3R5cGUgPT0gREJVU19UWVBFX1ZBUklBTlQpCisgICAgICAgICAgOworICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgLyogUmVjdXJzZSBpbnRvIHRoZSBzdHJ1Y3Qgb3IgdmFyaWFudCAqLworICAgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAocmVhZGVyLCAmc3ViKTsKKworICAgICAgICAgICAgLyogU2tpcCBldmVyeXRoaW5nIGluIHRoaXMgc3VicmVhZGVyICovCisgICAgICAgICAgICB3aGlsZSAoX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoJnN1YikpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBub3RoaW5nICovOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICBpZiAoIXJlYWRlci0+a2xhc3MtPnR5cGVzX29ubHkpCisgICAgICAgICAgcmVhZGVyLT52YWx1ZV9wb3MgPSBzdWIudmFsdWVfcG9zOworCisgICAgICAgIC8qIE5vdyB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGlzIGNvbnRhaW5lcjsgZm9yIHZhcmlhbnRzLCB0aGUKKyAgICAgICAgICogc3VicmVhZGVyJ3MgdHlwZV9wb3MgaXMgdG90YWxseSBpbmFwcGxpY2FibGUgKGl0J3MgaW4gdGhlCisgICAgICAgICAqIHZhbHVlIHN0cmluZykgYnV0IHdlIGtub3cgdGhhdCB3ZSBpbmNyZW1lbnQgYnkgb25lIHBhc3QgdGhlCisgICAgICAgICAqIERCVVNfVFlQRV9WQVJJQU5UCisgICAgICAgICAqLworICAgICAgICBpZiAoY3VycmVudF90eXBlID09IERCVVNfVFlQRV9WQVJJQU5UKQorICAgICAgICAgIHJlYWRlci0+dHlwZV9wb3MgKz0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJlYWRlci0+dHlwZV9wb3MgPSBzdWIudHlwZV9wb3M7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgREJVU19UWVBFX0FSUkFZOgorICAgICAgeworICAgICAgICBpZiAoIXJlYWRlci0+a2xhc3MtPnR5cGVzX29ubHkpCisgICAgICAgICAgX2RidXNfbWFyc2hhbF9za2lwX2FycmF5IChyZWFkZXItPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlIChyZWFkZXItPnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+dHlwZV9wb3MgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFkZXItPnZhbHVlX3Bvcyk7CisKKyAgICAgICAgc2tpcF9vbmVfY29tcGxldGVfdHlwZSAocmVhZGVyLT50eXBlX3N0ciwgJnJlYWRlci0+dHlwZV9wb3MpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKCFyZWFkZXItPmtsYXNzLT50eXBlc19vbmx5KQorICAgICAgICBfZGJ1c19tYXJzaGFsX3NraXBfYmFzaWMgKHJlYWRlci0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdHlwZSwgcmVhZGVyLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFkZXItPnZhbHVlX3Bvcyk7CisKKyAgICAgIHJlYWRlci0+dHlwZV9wb3MgKz0gMTsKKyAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3N0cnVjdF9yZWFkZXJfbmV4dCAoREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGN1cnJlbnRfdHlwZSkKK3sKKyAgaW50IHQ7CisKKyAgYmFzZV9yZWFkZXJfbmV4dCAocmVhZGVyLCBjdXJyZW50X3R5cGUpOworCisgIC8qIGZvciBTVFJVQ1QgY29udGFpbmVycyB3ZSByZXR1cm4gRkFMU0UgYXQgdGhlIGVuZCBvZiB0aGUgc3RydWN0LAorICAgKiBmb3IgSU5WQUxJRCB3ZSByZXR1cm4gRkFMU0UgYXQgdGhlIGVuZCBvZiB0aGUgc2lnbmF0dXJlLgorICAgKiBJbiBib3RoIGNhc2VzIHdlIGFycmFuZ2UgZm9yIGdldF9jdXJyZW50X3R5cGUoKSB0byByZXR1cm4gSU5WQUxJRAorICAgKiB3aGljaCBpcyBkZWZpbmVkIHRvIGhhcHBlbiBpZmYgd2UncmUgYXQgdGhlIGVuZCAobm8gbW9yZSBuZXh0KCkpCisgICAqLworICB0ID0gX2RidXNfc3RyaW5nX2dldF9ieXRlIChyZWFkZXItPnR5cGVfc3RyLCByZWFkZXItPnR5cGVfcG9zKTsKKyAgaWYgKHQgPT0gREJVU19TVFJVQ1RfRU5EX0NIQVIpCisgICAgeworICAgICAgcmVhZGVyLT50eXBlX3BvcyArPSAxOworICAgICAgcmVhZGVyLT5maW5pc2hlZCA9IFRSVUU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorZGljdF9lbnRyeV9yZWFkZXJfbmV4dCAoREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjdXJyZW50X3R5cGUpCit7CisgIGludCB0OworCisgIGJhc2VfcmVhZGVyX25leHQgKHJlYWRlciwgY3VycmVudF90eXBlKTsKKworICAvKiBmb3IgU1RSVUNUIGNvbnRhaW5lcnMgd2UgcmV0dXJuIEZBTFNFIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdCwKKyAgICogZm9yIElOVkFMSUQgd2UgcmV0dXJuIEZBTFNFIGF0IHRoZSBlbmQgb2YgdGhlIHNpZ25hdHVyZS4KKyAgICogSW4gYm90aCBjYXNlcyB3ZSBhcnJhbmdlIGZvciBnZXRfY3VycmVudF90eXBlKCkgdG8gcmV0dXJuIElOVkFMSUQKKyAgICogd2hpY2ggaXMgZGVmaW5lZCB0byBoYXBwZW4gaWZmIHdlJ3JlIGF0IHRoZSBlbmQgKG5vIG1vcmUgbmV4dCgpKQorICAgKi8KKyAgdCA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAocmVhZGVyLT50eXBlX3N0ciwgcmVhZGVyLT50eXBlX3Bvcyk7CisgIGlmICh0ID09IERCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUikKKyAgICB7CisgICAgICByZWFkZXItPnR5cGVfcG9zICs9IDE7CisgICAgICByZWFkZXItPmZpbmlzaGVkID0gVFJVRTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCithcnJheV90eXBlc19vbmx5X3JlYWRlcl9uZXh0IChEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGN1cnJlbnRfdHlwZSkKK3sKKyAgLyogV2UgaGF2ZSBvbmUgImVsZW1lbnQiIHRvIGJlIGl0ZXJhdGVkIG92ZXIKKyAgICogaW4gZWFjaCBhcnJheSwgd2hpY2ggaXMgaXRzIGVsZW1lbnQgdHlwZS4KKyAgICogU28gdGhlIGZpbmlzaGVkIGZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgd2UndmUKKyAgICogaXRlcmF0ZWQgb3ZlciBpdCB5ZXQgb3Igbm90LgorICAgKi8KKyAgcmVhZGVyLT5maW5pc2hlZCA9IFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCithcnJheV9yZWFkZXJfbmV4dCAoREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgY3VycmVudF90eXBlKQoreworICAvKiBTa2lwIG9uZSBhcnJheSBlbGVtZW50ICovCisgIGludCBlbmRfcG9zOworCisgIGVuZF9wb3MgPSByZWFkZXItPnUuYXJyYXkuc3RhcnRfcG9zICsgYXJyYXlfcmVhZGVyX2dldF9hcnJheV9sZW4gKHJlYWRlcik7CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9SRUFEX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCIgIHJlYWRlciAlcCBhcnJheSBuZXh0IFNUQVJUIHN0YXJ0X3BvcyA9ICVkIGVuZF9wb3MgPSAlZCB2YWx1ZV9wb3MgPSAlZCBjdXJyZW50X3R5cGUgPSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgcmVhZGVyLAorICAgICAgICAgICAgICAgICByZWFkZXItPnUuYXJyYXkuc3RhcnRfcG9zLAorICAgICAgICAgICAgICAgICBlbmRfcG9zLCByZWFkZXItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKGN1cnJlbnRfdHlwZSkpOworI2VuZGlmCisKKyAgX2RidXNfYXNzZXJ0IChyZWFkZXItPnZhbHVlX3BvcyA8IGVuZF9wb3MpOworICBfZGJ1c19hc3NlcnQgKHJlYWRlci0+dmFsdWVfcG9zID49IHJlYWRlci0+dS5hcnJheS5zdGFydF9wb3MpOworCisgIHN3aXRjaCAoX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmUgKHJlYWRlci0+dHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+dHlwZV9wb3MpKQorICAgIHsKKyAgICBjYXNlIERCVVNfVFlQRV9ESUNUX0VOVFJZOgorICAgIGNhc2UgREJVU19UWVBFX1NUUlVDVDoKKyAgICBjYXNlIERCVVNfVFlQRV9WQVJJQU5UOgorICAgICAgeworICAgICAgICBEQnVzVHlwZVJlYWRlciBzdWI7CisKKyAgICAgICAgLyogUmVjdXJzZSBpbnRvIHRoZSBzdHJ1Y3Qgb3IgdmFyaWFudCAqLworICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlIChyZWFkZXIsICZzdWIpOworCisgICAgICAgIC8qIFNraXAgZXZlcnl0aGluZyBpbiB0aGlzIGVsZW1lbnQgKi8KKyAgICAgICAgd2hpbGUgKF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZzdWIpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIG5vdGhpbmcgKi87CisgICAgICAgICAgfQorCisgICAgICAgIC8qIE5vdyB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGlzIGVsZW1lbnQgKi8KKyAgICAgICAgcmVhZGVyLT52YWx1ZV9wb3MgPSBzdWIudmFsdWVfcG9zOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfVFlQRV9BUlJBWToKKyAgICAgIHsKKyAgICAgICAgX2RidXNfbWFyc2hhbF9za2lwX2FycmF5IChyZWFkZXItPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZSAocmVhZGVyLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT50eXBlX3BvcyArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhZGVyLT52YWx1ZV9wb3MpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgeworICAgICAgICBfZGJ1c19tYXJzaGFsX3NraXBfYmFzaWMgKHJlYWRlci0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdHlwZSwgcmVhZGVyLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFkZXItPnZhbHVlX3Bvcyk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9SRUFEX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCIgIHJlYWRlciAlcCBhcnJheSBuZXh0IEVORCBzdGFydF9wb3MgPSAlZCBlbmRfcG9zID0gJWQgdmFsdWVfcG9zID0gJWQgY3VycmVudF90eXBlID0gJXNcbiIsCisgICAgICAgICAgICAgICAgIHJlYWRlciwKKyAgICAgICAgICAgICAgICAgcmVhZGVyLT51LmFycmF5LnN0YXJ0X3BvcywKKyAgICAgICAgICAgICAgICAgZW5kX3BvcywgcmVhZGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChjdXJyZW50X3R5cGUpKTsKKyNlbmRpZgorCisgIF9kYnVzX2Fzc2VydCAocmVhZGVyLT52YWx1ZV9wb3MgPD0gZW5kX3Bvcyk7CisKKyAgaWYgKHJlYWRlci0+dmFsdWVfcG9zID09IGVuZF9wb3MpCisgICAgeworICAgICAgc2tpcF9vbmVfY29tcGxldGVfdHlwZSAocmVhZGVyLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFkZXItPnR5cGVfcG9zKTsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBEQnVzVHlwZVJlYWRlckNsYXNzIGJvZHlfcmVhZGVyX2NsYXNzID0geworICAiYm9keSIsIDAsCisgIEZBTFNFLAorICBOVUxMLCAvKiBib2R5IGlzIGFsd2F5cyB0b3BsZXZlbCwgc28gZG9lc24ndCBnZXQgcmVjdXJzZWQgaW50byAqLworICBOVUxMLAorICBiYXNlX3JlYWRlcl9uZXh0Cit9OworCitzdGF0aWMgY29uc3QgREJ1c1R5cGVSZWFkZXJDbGFzcyBib2R5X3R5cGVzX29ubHlfcmVhZGVyX2NsYXNzID0geworICAiYm9keSB0eXBlcyIsIDEsCisgIFRSVUUsCisgIE5VTEwsIC8qIGJvZHkgaXMgYWx3YXlzIHRvcGxldmVsLCBzbyBkb2Vzbid0IGdldCByZWN1cnNlZCBpbnRvICovCisgIE5VTEwsCisgIGJhc2VfcmVhZGVyX25leHQKK307CisKK3N0YXRpYyBjb25zdCBEQnVzVHlwZVJlYWRlckNsYXNzIHN0cnVjdF9yZWFkZXJfY2xhc3MgPSB7CisgICJzdHJ1Y3QiLCAyLAorICBGQUxTRSwKKyAgc3RydWN0X29yX2RpY3RfZW50cnlfcmVhZGVyX3JlY3Vyc2UsCisgIE5VTEwsCisgIHN0cnVjdF9yZWFkZXJfbmV4dAorfTsKKworc3RhdGljIGNvbnN0IERCdXNUeXBlUmVhZGVyQ2xhc3Mgc3RydWN0X3R5cGVzX29ubHlfcmVhZGVyX2NsYXNzID0geworICAic3RydWN0IHR5cGVzIiwgMywKKyAgVFJVRSwKKyAgc3RydWN0X29yX2RpY3RfZW50cnlfdHlwZXNfb25seV9yZWFkZXJfcmVjdXJzZSwKKyAgTlVMTCwKKyAgc3RydWN0X3JlYWRlcl9uZXh0Cit9OworCitzdGF0aWMgY29uc3QgREJ1c1R5cGVSZWFkZXJDbGFzcyBkaWN0X2VudHJ5X3JlYWRlcl9jbGFzcyA9IHsKKyAgImRpY3RfZW50cnkiLCA0LAorICBGQUxTRSwKKyAgc3RydWN0X29yX2RpY3RfZW50cnlfcmVhZGVyX3JlY3Vyc2UsCisgIE5VTEwsCisgIGRpY3RfZW50cnlfcmVhZGVyX25leHQKK307CisKK3N0YXRpYyBjb25zdCBEQnVzVHlwZVJlYWRlckNsYXNzIGRpY3RfZW50cnlfdHlwZXNfb25seV9yZWFkZXJfY2xhc3MgPSB7CisgICJkaWN0X2VudHJ5IHR5cGVzIiwgNSwKKyAgVFJVRSwKKyAgc3RydWN0X29yX2RpY3RfZW50cnlfdHlwZXNfb25seV9yZWFkZXJfcmVjdXJzZSwKKyAgTlVMTCwKKyAgZGljdF9lbnRyeV9yZWFkZXJfbmV4dAorfTsKKworc3RhdGljIGNvbnN0IERCdXNUeXBlUmVhZGVyQ2xhc3MgYXJyYXlfcmVhZGVyX2NsYXNzID0geworICAiYXJyYXkiLCA2LAorICBGQUxTRSwKKyAgYXJyYXlfcmVhZGVyX3JlY3Vyc2UsCisgIGFycmF5X3JlYWRlcl9jaGVja19maW5pc2hlZCwKKyAgYXJyYXlfcmVhZGVyX25leHQKK307CisKK3N0YXRpYyBjb25zdCBEQnVzVHlwZVJlYWRlckNsYXNzIGFycmF5X3R5cGVzX29ubHlfcmVhZGVyX2NsYXNzID0geworICAiYXJyYXkgdHlwZXMiLCA3LAorICBUUlVFLAorICBhcnJheV90eXBlc19vbmx5X3JlYWRlcl9yZWN1cnNlLAorICBOVUxMLAorICBhcnJheV90eXBlc19vbmx5X3JlYWRlcl9uZXh0Cit9OworCitzdGF0aWMgY29uc3QgREJ1c1R5cGVSZWFkZXJDbGFzcyB2YXJpYW50X3JlYWRlcl9jbGFzcyA9IHsKKyAgInZhcmlhbnQiLCA4LAorICBGQUxTRSwKKyAgdmFyaWFudF9yZWFkZXJfcmVjdXJzZSwKKyAgTlVMTCwKKyAgYmFzZV9yZWFkZXJfbmV4dAorfTsKKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCitzdGF0aWMgY29uc3QgREJ1c1R5cGVSZWFkZXJDbGFzcyAqIGNvbnN0CithbGxfcmVhZGVyX2NsYXNzZXNbXSA9IHsKKyAgJmJvZHlfcmVhZGVyX2NsYXNzLAorICAmYm9keV90eXBlc19vbmx5X3JlYWRlcl9jbGFzcywKKyAgJnN0cnVjdF9yZWFkZXJfY2xhc3MsCisgICZzdHJ1Y3RfdHlwZXNfb25seV9yZWFkZXJfY2xhc3MsCisgICZkaWN0X2VudHJ5X3JlYWRlcl9jbGFzcywKKyAgJmRpY3RfZW50cnlfdHlwZXNfb25seV9yZWFkZXJfY2xhc3MsCisgICZhcnJheV9yZWFkZXJfY2xhc3MsCisgICZhcnJheV90eXBlc19vbmx5X3JlYWRlcl9jbGFzcywKKyAgJnZhcmlhbnRfcmVhZGVyX2NsYXNzCit9OworI2VuZGlmCisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSB0eXBlIHJlYWRlci4KKyAqCisgKiBAcGFyYW0gcmVhZGVyIHRoZSByZWFkZXIKKyAqIEBwYXJhbSBieXRlX29yZGVyIHRoZSBieXRlIG9yZGVyIG9mIHRoZSBibG9jayB0byByZWFkCisgKiBAcGFyYW0gdHlwZV9zdHIgdGhlIHNpZ25hdHVyZSBvZiB0aGUgYmxvY2sgdG8gcmVhZAorICogQHBhcmFtIHR5cGVfcG9zIGxvY2F0aW9uIG9mIHNpZ25hdHVyZQorICogQHBhcmFtIHZhbHVlX3N0ciB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdmFsdWVzIGJsb2NrCisgKiBAcGFyYW0gdmFsdWVfcG9zIHN0YXJ0IG9mIHZhbHVlcyBibG9jaworICovCit2b2lkCitfZGJ1c190eXBlX3JlYWRlcl9pbml0IChEQnVzVHlwZVJlYWRlciAgICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqdHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgdHlwZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqdmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHZhbHVlX3BvcykKK3sKKyAgcmVhZGVyLT5rbGFzcyA9ICZib2R5X3JlYWRlcl9jbGFzczsKKworICByZWFkZXJfaW5pdCAocmVhZGVyLCBieXRlX29yZGVyLCB0eXBlX3N0ciwgdHlwZV9wb3MsCisgICAgICAgICAgICAgICB2YWx1ZV9zdHIsIHZhbHVlX3Bvcyk7CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9SRUFEX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCIgIHR5cGUgcmVhZGVyICVwIGluaXQgdHlwZV9wb3MgPSAlZCB2YWx1ZV9wb3MgPSAlZCByZW1haW5pbmcgc2lnICclcydcbiIsCisgICAgICAgICAgICAgICAgIHJlYWRlciwgcmVhZGVyLT50eXBlX3BvcywgcmVhZGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHJlYWRlci0+dHlwZV9zdHIsIHJlYWRlci0+dHlwZV9wb3MsIDApKTsKKyNlbmRpZgorfQorCisvKioKKyAqIExpa2UgX2RidXNfdHlwZV9yZWFkZXJfaW5pdCgpIGJ1dCB0aGUgaXRlcmF0aW9uIGlzIG92ZXIgdGhlCisgKiBzaWduYXR1cmUsIG5vdCBvdmVyIHZhbHVlcy4KKyAqCisgKiBAcGFyYW0gcmVhZGVyIHRoZSByZWFkZXIKKyAqIEBwYXJhbSB0eXBlX3N0ciB0aGUgc2lnbmF0dXJlIHN0cmluZworICogQHBhcmFtIHR5cGVfcG9zIGxvY2F0aW9uIGluIHRoZSBzaWduYXR1cmUgc3RyaW5nCisgKi8KK3ZvaWQKK19kYnVzX3R5cGVfcmVhZGVyX2luaXRfdHlwZXNfb25seSAoREJ1c1R5cGVSZWFkZXIgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgdHlwZV9wb3MpCit7CisgIHJlYWRlci0+a2xhc3MgPSAmYm9keV90eXBlc19vbmx5X3JlYWRlcl9jbGFzczsKKworICByZWFkZXJfaW5pdCAocmVhZGVyLCBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIgLyogaXJyZWxldmFudCAqLywKKyAgICAgICAgICAgICAgIHR5cGVfc3RyLCB0eXBlX3BvcywgTlVMTCwgX0RCVVNfSU5UX01BWCAvKiBjcmFzaGVzIGlmIHdlIHNjcmV3IHVwICovKTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1JFQURfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgdHlwZSByZWFkZXIgJXAgaW5pdCB0eXBlcyBvbmx5IHR5cGVfcG9zID0gJWQgcmVtYWluaW5nIHNpZyAnJXMnXG4iLAorICAgICAgICAgICAgICAgICByZWFkZXIsIHJlYWRlci0+dHlwZV9wb3MsCisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHJlYWRlci0+dHlwZV9zdHIsIHJlYWRlci0+dHlwZV9wb3MsIDApKTsKKyNlbmRpZgorfQorCisvKioKKyAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIHZhbHVlIHRoZSByZWFkZXIgaXMgY3VycmVudGx5IHBvaW50aW5nIHRvOworICogb3IgZm9yIGEgdHlwZXMtb25seSByZWFkZXIgZ2V0cyB0aGUgdHlwZSBpdCdzIGN1cnJlbnRseSBwb2ludGluZyB0by4KKyAqIElmIHRoZSByZWFkZXIgaXMgYXQgdGhlIGVuZCBvZiBhIGJsb2NrIG9yIGVuZCBvZiBhIGNvbnRhaW5lciBzdWNoCisgKiBhcyBhbiBhcnJheSwgcmV0dXJucyAjREJVU19UWVBFX0lOVkFMSUQuCisgKgorICogQHBhcmFtIHJlYWRlciB0aGUgcmVhZGVyCisgKi8KK2ludAorX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoY29uc3QgREJ1c1R5cGVSZWFkZXIgKnJlYWRlcikKK3sKKyAgaW50IHQ7CisKKyAgaWYgKHJlYWRlci0+ZmluaXNoZWQgfHwKKyAgICAgIChyZWFkZXItPmtsYXNzLT5jaGVja19maW5pc2hlZCAmJgorICAgICAgICgqIHJlYWRlci0+a2xhc3MtPmNoZWNrX2ZpbmlzaGVkKSAocmVhZGVyKSkpCisgICAgdCA9IERCVVNfVFlQRV9JTlZBTElEOworICBlbHNlCisgICAgdCA9IF9kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlIChyZWFkZXItPnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT50eXBlX3Bvcyk7CisKKyAgX2RidXNfYXNzZXJ0ICh0ICE9IERCVVNfU1RSVUNUX0VORF9DSEFSKTsKKyAgX2RidXNfYXNzZXJ0ICh0ICE9IERCVVNfU1RSVUNUX0JFR0lOX0NIQVIpOworICBfZGJ1c19hc3NlcnQgKHQgIT0gREJVU19ESUNUX0VOVFJZX0VORF9DSEFSKTsKKyAgX2RidXNfYXNzZXJ0ICh0ICE9IERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSKTsKKyAgCisjaWYgMAorICBfZGJ1c192ZXJib3NlICgiICB0eXBlIHJlYWRlciAlcCBjdXJyZW50IHR5cGVfcG9zID0gJWQgdHlwZSA9ICVzXG4iLAorICAgICAgICAgICAgICAgICByZWFkZXIsIHJlYWRlci0+dHlwZV9wb3MsCisgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nICh0KSk7CisjZW5kaWYKKworICByZXR1cm4gdDsKK30KKworLyoqCisgKiBHZXRzIHRoZSB0eXBlIG9mIGFuIGVsZW1lbnQgb2YgdGhlIGFycmF5IHRoZSByZWFkZXIgaXMgY3VycmVudGx5CisgKiBwb2ludGluZyB0by4gSXQncyBhbiBlcnJvciB0byBjYWxsIHRoaXMgaWYKKyAqIF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUoKSBkb2Vzbid0IHJldHVybiAjREJVU19UWVBFX0FSUkFZCisgKiBmb3IgdGhpcyByZWFkZXIuCisgKgorICogQHBhcmFtIHJlYWRlciB0aGUgcmVhZGVyCisgKi8KK2ludAorX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2VsZW1lbnRfdHlwZSAoY29uc3QgREJ1c1R5cGVSZWFkZXIgICpyZWFkZXIpCit7CisgIGludCBlbGVtZW50X3R5cGU7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlIChyZWFkZXIpID09IERCVVNfVFlQRV9BUlJBWSk7CisKKyAgZWxlbWVudF90eXBlID0gX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmUgKHJlYWRlci0+dHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXItPnR5cGVfcG9zICsgMSk7CisKKyAgcmV0dXJuIGVsZW1lbnRfdHlwZTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSB2YWx1ZSBibG9jaworICogQHBhcmFtIHJlYWRlciB0aGUgcmVhZGVyCisgKi8KK2ludAorX2RidXNfdHlwZV9yZWFkZXJfZ2V0X3ZhbHVlX3BvcyAoY29uc3QgREJ1c1R5cGVSZWFkZXIgICpyZWFkZXIpCit7CisgIHJldHVybiByZWFkZXItPnZhbHVlX3BvczsKK30KKworLyoqCisgKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIG1hcnNoYWxlZCB2YWx1ZSBpbiB0aGUgZGF0YSBiZWluZyByZWFkLiAgVGhlCisgKiBhZGRyZXNzIG1heSBub3QgYmUgYWxpZ25lZDsgeW91IGhhdmUgdG8gYWxpZ24gaXQgdG8gdGhlIHR5cGUgb2YgdGhlCisgKiB2YWx1ZSB5b3Ugd2FudCB0byByZWFkLiBNb3N0IG9mIHRoZSBkZW1hcnNoYWwgcm91dGluZXMgZG8gdGhpcyBmb3IKKyAqIHlvdS4KKyAqCisgKiBAcGFyYW0gcmVhZGVyIHRoZSByZWFkZXIKKyAqIEBwYXJhbSB2YWx1ZV9sb2NhdGlvbiB0aGUgYWRkcmVzcyBvZiB0aGUgbWFyc2hhbGVkIHZhbHVlCisgKi8KK3ZvaWQKK19kYnVzX3R5cGVfcmVhZGVyX3JlYWRfcmF3IChjb25zdCBEQnVzVHlwZVJlYWRlciAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqKnZhbHVlX2xvY2F0aW9uKQoreworICBfZGJ1c19hc3NlcnQgKCFyZWFkZXItPmtsYXNzLT50eXBlc19vbmx5KTsKKworICAqdmFsdWVfbG9jYXRpb24gPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChyZWFkZXItPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworfQorCisvKioKKyAqIFJlYWRzIGEgYmFzaWMtdHlwZWQgdmFsdWUsIGFzIHdpdGggX2RidXNfbWFyc2hhbF9yZWFkX2Jhc2ljKCkuCisgKgorICogQHBhcmFtIHJlYWRlciB0aGUgcmVhZGVyCisgKiBAcGFyYW0gdmFsdWUgdGhlIGFkZHJlc3Mgb2YgdGhlIHZhbHVlCisgKi8KK3ZvaWQKK19kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKGNvbnN0IERCdXNUeXBlUmVhZGVyICAgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqdmFsdWUpCit7CisgIGludCB0OworCisgIF9kYnVzX2Fzc2VydCAoIXJlYWRlci0+a2xhc3MtPnR5cGVzX29ubHkpOworCisgIHQgPSBfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlIChyZWFkZXIpOworCisgIF9kYnVzX21hcnNoYWxfcmVhZF9iYXNpYyAocmVhZGVyLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9SRUFEX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCIgIHR5cGUgcmVhZGVyICVwIHJlYWQgYmFzaWMgdHlwZV9wb3MgPSAlZCB2YWx1ZV9wb3MgPSAlZCByZW1haW5pbmcgc2lnICclcydcbiIsCisgICAgICAgICAgICAgICAgIHJlYWRlciwgcmVhZGVyLT50eXBlX3BvcywgcmVhZGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHJlYWRlci0+dHlwZV9zdHIsIHJlYWRlci0+dHlwZV9wb3MsIDApKTsKKyNlbmRpZgorfQorCisvKioKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYXJyYXkuCisgKgorICogQHBhcmFtIHJlYWRlciB0aGUgcmVhZGVyIHRvIHJlYWQgZnJvbQorICogQHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYXJyYXkKKyAqLworaW50CitfZGJ1c190eXBlX3JlYWRlcl9nZXRfYXJyYXlfbGVuZ3RoIChjb25zdCBEQnVzVHlwZVJlYWRlciAgKnJlYWRlcikKK3sKKyAgX2RidXNfYXNzZXJ0ICghcmVhZGVyLT5rbGFzcy0+dHlwZXNfb25seSk7CisgIF9kYnVzX2Fzc2VydCAocmVhZGVyLT5rbGFzcyA9PSAmYXJyYXlfcmVhZGVyX2NsYXNzKTsKKworICByZXR1cm4gYXJyYXlfcmVhZGVyX2dldF9hcnJheV9sZW4gKHJlYWRlcik7Cit9CisKKy8qKgorICogUmVhZHMgYSBibG9jayBvZiBmaXhlZC1sZW5ndGggYmFzaWMgdmFsdWVzLCBmcm9tIHRoZSBjdXJyZW50IHBvaW50CisgKiBpbiBhbiBhcnJheSB0byB0aGUgZW5kIG9mIHRoZSBhcnJheS4gIERvZXMgbm90IHdvcmsgZm9yIGFycmF5cyBvZgorICogc3RyaW5nIG9yIGNvbnRhaW5lciB0eXBlcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGFycmF5IGluLXBsYWNlOyBpdCBkb2VzIG5vdCBtYWtlIGEgY29weSwKKyAqIGFuZCBpdCBkb2VzIG5vdCBzd2FwIHRoZSBieXRlcy4KKyAqCisgKiBJZiB5b3UgYXNrIGZvciAjREJVU19UWVBFX0RPVUJMRSB5b3Ugd2lsbCBnZXQgYSAiY29uc3QgZG91YmxlKiIgYmFjaworICogYW5kIHRoZSAidmFsdWUiIGFyZ3VtZW50IHNob3VsZCBiZSBhICJjb25zdCBkb3VibGUqKiIgYW5kIHNvIG9uLgorICoKKyAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlciB0byByZWFkIGZyb20KKyAqIEBwYXJhbSB2YWx1ZSBwbGFjZSB0byByZXR1cm4gdGhlIGFycmF5IHZhbHVlcworICogQHBhcmFtIG5fZWxlbWVudHMgcGxhY2UgdG8gcmV0dXJuIG51bWJlciBvZiBhcnJheSBlbGVtZW50cworICovCit2b2lkCitfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2ZpeGVkX211bHRpIChjb25zdCBEQnVzVHlwZVJlYWRlciAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgKm5fZWxlbWVudHMpCit7CisgIGludCBlbGVtZW50X3R5cGU7CisgIGludCBlbmRfcG9zOworICBpbnQgcmVtYWluaW5nX2xlbjsKKyAgaW50IGFsaWdubWVudDsKKyAgaW50IHRvdGFsX2xlbjsKKworICBfZGJ1c19hc3NlcnQgKCFyZWFkZXItPmtsYXNzLT50eXBlc19vbmx5KTsKKyAgX2RidXNfYXNzZXJ0IChyZWFkZXItPmtsYXNzID09ICZhcnJheV9yZWFkZXJfY2xhc3MpOworCisgIGVsZW1lbnRfdHlwZSA9IF9kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlIChyZWFkZXItPnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT50eXBlX3Bvcyk7CisKKyAgX2RidXNfYXNzZXJ0IChlbGVtZW50X3R5cGUgIT0gREJVU19UWVBFX0lOVkFMSUQpOyAvKiB3aHkgd2UgZG9uJ3QgdXNlIGdldF9jdXJyZW50X3R5cGUoKSAqLworICBfZGJ1c19hc3NlcnQgKGRidXNfdHlwZV9pc19maXhlZCAoZWxlbWVudF90eXBlKSk7CisKKyAgYWxpZ25tZW50ID0gX2RidXNfdHlwZV9nZXRfYWxpZ25tZW50IChlbGVtZW50X3R5cGUpOworCisgIF9kYnVzX2Fzc2VydCAocmVhZGVyLT52YWx1ZV9wb3MgPj0gcmVhZGVyLT51LmFycmF5LnN0YXJ0X3Bvcyk7CisKKyAgdG90YWxfbGVuID0gYXJyYXlfcmVhZGVyX2dldF9hcnJheV9sZW4gKHJlYWRlcik7CisgIGVuZF9wb3MgPSByZWFkZXItPnUuYXJyYXkuc3RhcnRfcG9zICsgdG90YWxfbGVuOworICByZW1haW5pbmdfbGVuID0gZW5kX3BvcyAtIHJlYWRlci0+dmFsdWVfcG9zOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfUkVBRF9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiZW5kX3BvcyAlZCB0b3RhbF9sZW4gJWQgcmVtYWluaW5nX2xlbiAlZCB2YWx1ZV9wb3MgJWRcbiIsCisgICAgICAgICAgICAgICAgIGVuZF9wb3MsIHRvdGFsX2xlbiwgcmVtYWluaW5nX2xlbiwgcmVhZGVyLT52YWx1ZV9wb3MpOworI2VuZGlmCisKKyAgX2RidXNfYXNzZXJ0IChyZW1haW5pbmdfbGVuIDw9IHRvdGFsX2xlbik7CisKKyAgaWYgKHJlbWFpbmluZ19sZW4gPT0gMCkKKyAgICAqKGNvbnN0IERCdXNCYXNpY1ZhbHVlKiopIHZhbHVlID0gTlVMTDsKKyAgZWxzZQorICAgICooY29uc3QgREJ1c0Jhc2ljVmFsdWUqKikgdmFsdWUgPQorICAgICAgKHZvaWQqKSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChyZWFkZXItPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ19sZW4pOworCisgICpuX2VsZW1lbnRzID0gcmVtYWluaW5nX2xlbiAvIGFsaWdubWVudDsKKyAgX2RidXNfYXNzZXJ0ICgocmVtYWluaW5nX2xlbiAlIGFsaWdubWVudCkgPT0gMCk7CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9SRUFEX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCIgIHR5cGUgcmVhZGVyICVwIHJlYWQgZml4ZWQgYXJyYXkgdHlwZV9wb3MgPSAlZCB2YWx1ZV9wb3MgPSAlZCByZW1haW5pbmcgc2lnICclcydcbiIsCisgICAgICAgICAgICAgICAgIHJlYWRlciwgcmVhZGVyLT50eXBlX3BvcywgcmVhZGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHJlYWRlci0+dHlwZV9zdHIsIHJlYWRlci0+dHlwZV9wb3MsIDApKTsKKyNlbmRpZgorfQorCisvKioKKyAqIEluaXRpYWxpemUgYSBuZXcgcmVhZGVyIHBvaW50aW5nIHRvIHRoZSBmaXJzdCB0eXBlIGFuZAorICogY29ycmVzcG9uZGluZyB2YWx1ZSB0aGF0J3MgYSBjaGlsZCBvZiB0aGUgY3VycmVudCBjb250YWluZXIuIEl0J3MKKyAqIGFuIGVycm9yIHRvIGNhbGwgdGhpcyBpZiB0aGUgY3VycmVudCB0eXBlIGlzIGEgbm9uLWNvbnRhaW5lci4KKyAqCisgKiBOb3RlIHRoYXQgREJ1c1R5cGVSZWFkZXIgdHJhdmVyc2VzIHZhbHVlcywgbm90IHR5cGVzLiBTbyBpZiB5b3UKKyAqIGhhdmUgYW4gZW1wdHkgYXJyYXkgb2YgYXJyYXkgb2YgaW50LCB5b3UgY2FuJ3QgcmVjdXJzZSBpbnRvIGl0LiBZb3UKKyAqIGNhbiBvbmx5IHJlY3Vyc2UgaW50byBlYWNoIGVsZW1lbnQuCisgKgorICogQHBhcmFtIHJlYWRlciB0aGUgcmVhZGVyCisgKiBAcGFyYW0gc3ViIGEgcmVhZGVyIHRvIGluaXQgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGNoaWxkCisgKi8KK3ZvaWQKK19kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqc3ViKQoreworICBpbnQgdDsKKworICB0ID0gX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmUgKHJlYWRlci0+dHlwZV9zdHIsIHJlYWRlci0+dHlwZV9wb3MpOworCisgIHN3aXRjaCAodCkKKyAgICB7CisgICAgY2FzZSBEQlVTX1RZUEVfU1RSVUNUOgorICAgICAgaWYgKHJlYWRlci0+a2xhc3MtPnR5cGVzX29ubHkpCisgICAgICAgIHN1Yi0+a2xhc3MgPSAmc3RydWN0X3R5cGVzX29ubHlfcmVhZGVyX2NsYXNzOworICAgICAgZWxzZQorICAgICAgICBzdWItPmtsYXNzID0gJnN0cnVjdF9yZWFkZXJfY2xhc3M7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9ESUNUX0VOVFJZOgorICAgICAgaWYgKHJlYWRlci0+a2xhc3MtPnR5cGVzX29ubHkpCisgICAgICAgIHN1Yi0+a2xhc3MgPSAmZGljdF9lbnRyeV90eXBlc19vbmx5X3JlYWRlcl9jbGFzczsKKyAgICAgIGVsc2UKKyAgICAgICAgc3ViLT5rbGFzcyA9ICZkaWN0X2VudHJ5X3JlYWRlcl9jbGFzczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX0FSUkFZOgorICAgICAgaWYgKHJlYWRlci0+a2xhc3MtPnR5cGVzX29ubHkpCisgICAgICAgIHN1Yi0+a2xhc3MgPSAmYXJyYXlfdHlwZXNfb25seV9yZWFkZXJfY2xhc3M7CisgICAgICBlbHNlCisgICAgICAgIHN1Yi0+a2xhc3MgPSAmYXJyYXlfcmVhZGVyX2NsYXNzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfVkFSSUFOVDoKKyAgICAgIGlmIChyZWFkZXItPmtsYXNzLT50eXBlc19vbmx5KQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjYW4ndCByZWN1cnNlIGludG8gdmFyaWFudCB0eXBlY29kZSIpOworICAgICAgZWxzZQorICAgICAgICBzdWItPmtsYXNzID0gJnZhcmlhbnRfcmVhZGVyX2NsYXNzOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJyZWN1cnNpbmcgaW50byB0eXBlICVzXG4iLCBfZGJ1c190eXBlX3RvX3N0cmluZyAodCkpOworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgICAgICBpZiAodCA9PSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJZb3UgY2FuJ3QgcmVjdXJzZSBpbnRvIGFuIGVtcHR5IGFycmF5IG9yIG9mZiB0aGUgZW5kIG9mIGEgbWVzc2FnZSBib2R5XG4iKTsKKyNlbmRpZiAvKiBEQlVTX0RJU0FCTEVfQ0hFQ0tTICovCisKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRvbid0IHlldCBoYW5kbGUgcmVjdXJzaW5nIGludG8gdGhpcyB0eXBlIik7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoc3ViLT5rbGFzcyA9PSBhbGxfcmVhZGVyX2NsYXNzZXNbc3ViLT5rbGFzcy0+aWRdKTsKKworICAoKiBzdWItPmtsYXNzLT5yZWN1cnNlKSAoc3ViLCByZWFkZXIpOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfUkVBRF9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiICB0eXBlIHJlYWRlciAlcCBSRUNVUlNFRCB0eXBlX3BvcyA9ICVkIHZhbHVlX3BvcyA9ICVkIHJlbWFpbmluZyBzaWcgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgc3ViLCBzdWItPnR5cGVfcG9zLCBzdWItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAoc3ViLT50eXBlX3N0ciwgc3ViLT50eXBlX3BvcywgMCkpOworI2VuZGlmCit9CisKKy8qKgorICogU2tpcCB0byB0aGUgbmV4dCB2YWx1ZSBvbiB0aGlzICJsZXZlbCIuIGUuZy4gdGhlIG5leHQgZmllbGQgaW4gYQorICogc3RydWN0LCB0aGUgbmV4dCB2YWx1ZSBpbiBhbiBhcnJheS4gUmV0dXJucyBGQUxTRSBhdCB0aGUgZW5kIG9mIHRoZQorICogY3VycmVudCBjb250YWluZXIuCisgKgorICogQHBhcmFtIHJlYWRlciB0aGUgcmVhZGVyCisgKiBAcmV0dXJucyBGQUxTRSBpZiBub3RoaW5nIG1vcmUgdG8gcmVhZCBhdCBvciBiZWxvdyB0aGlzIGxldmVsCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190eXBlX3JlYWRlcl9uZXh0IChEQnVzVHlwZVJlYWRlciAqcmVhZGVyKQoreworICBpbnQgdDsKKworICB0ID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAocmVhZGVyKTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1JFQURfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgdHlwZSByZWFkZXIgJXAgU1RBUlQgbmV4dCgpIHsgdHlwZV9wb3MgPSAlZCB2YWx1ZV9wb3MgPSAlZCByZW1haW5pbmcgc2lnICclcycgY3VycmVudF90eXBlID0gJXNcbiIsCisgICAgICAgICAgICAgICAgIHJlYWRlciwgcmVhZGVyLT50eXBlX3BvcywgcmVhZGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHJlYWRlci0+dHlwZV9zdHIsIHJlYWRlci0+dHlwZV9wb3MsIDApLAorICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAodCkpOworI2VuZGlmCisKKyAgaWYgKHQgPT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgcmV0dXJuIEZBTFNFOworCisgICgqIHJlYWRlci0+a2xhc3MtPm5leHQpIChyZWFkZXIsIHQpOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfUkVBRF9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiICB0eXBlIHJlYWRlciAlcCBFTkQgbmV4dCgpIHR5cGVfcG9zID0gJWQgdmFsdWVfcG9zID0gJWQgcmVtYWluaW5nIHNpZyAnJXMnIGN1cnJlbnRfdHlwZSA9ICVzXG4iLAorICAgICAgICAgICAgICAgICByZWFkZXIsIHJlYWRlci0+dHlwZV9wb3MsIHJlYWRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChyZWFkZXItPnR5cGVfc3RyLCByZWFkZXItPnR5cGVfcG9zLCAwKSwKKyAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKHJlYWRlcikpKTsKKyNlbmRpZgorCisgIHJldHVybiBfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlIChyZWFkZXIpICE9IERCVVNfVFlQRV9JTlZBTElEOworfQorCisvKioKKyAqIENoZWNrIHdoZXRoZXIgdGhlcmUncyBhbm90aGVyIHZhbHVlIG9uIHRoaXMgImxldmVsIi4gZS5nLiB0aGUgbmV4dAorICogZmllbGQgaW4gYSBzdHJ1Y3QsIHRoZSBuZXh0IHZhbHVlIGluIGFuIGFycmF5LiBSZXR1cm5zIEZBTFNFIGF0IHRoZQorICogZW5kIG9mIHRoZSBjdXJyZW50IGNvbnRhaW5lci4KKyAqCisgKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byB1c2UgdGhpczsgaXQgbWFrZXMgZm9yIGFuIGF3a3dhcmQgZm9yL3doaWxlCisgKiBsb29wLiBBIG5pY2VyIG9uZSBpcyAid2hpbGUgKChjdXJyZW50X3R5cGUgPSBnZXRfY3VycmVudF90eXBlKCkpICE9IElOVkFMSUQpIgorICoKKyAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlcgorICogQHJldHVybnMgRkFMU0UgaWYgbm90aGluZyBtb3JlIHRvIHJlYWQgYXQgb3IgYmVsb3cgdGhpcyBsZXZlbAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHlwZV9yZWFkZXJfaGFzX25leHQgKGNvbnN0IERCdXNUeXBlUmVhZGVyICpyZWFkZXIpCit7CisgIC8qIE5vdCBlZmZpY2llbnQgYnV0IHdvcmtzIGZvciBub3cuICovCisgIERCdXNUeXBlUmVhZGVyIGNvcHk7CisKKyAgY29weSA9ICpyZWFkZXI7CisgIHJldHVybiBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmY29weSk7Cit9CisKKy8qKgorICogR2V0cyB0aGUgc3RyaW5nIGFuZCByYW5nZSBvZiBzYWlkIHN0cmluZyBjb250YWluaW5nIHRoZSBzaWduYXR1cmUKKyAqIG9mIHRoZSBjdXJyZW50IHZhbHVlLiBFc3NlbnRpYWxseSBhIG1vcmUgY29tcGxldGUgdmVyc2lvbiBvZgorICogX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSgpIChyZXR1cm5zIHRoZSBmdWxsIHR5cGUKKyAqIHJhdGhlciB0aGFuIG9ubHkgdGhlIG91dHNpZGUgb2YgdGhlIG9uaW9uKS4KKyAqCisgKiBOb3RlIHRob3VnaCB0aGF0IHRoZSBmaXJzdCBieXRlIGluIGEgc3RydWN0IHNpZ25hdHVyZSBpcworICogI0RCVVNfU1RSVUNUX0JFR0lOX0NIQVIgd2hpbGUgdGhlIGN1cnJlbnQgdHlwZSB3aWxsIGJlCisgKiAjREJVU19UWVBFX1NUUlVDVCBzbyBpdCBpc24ndCB0cnVlIHRoYXQgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlCisgKiBzaWduYXR1cmUgaXMgYWx3YXlzIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IHR5cGUuIEFub3RoZXIKKyAqIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGwgc3RpbGwgcmV0dXJuIGEgc2lnbmF0dXJlIHdoZW4KKyAqIGluc2lkZSBhbiBlbXB0eSBhcnJheTsgc2F5IHlvdSByZWN1cnNlIGludG8gZW1wdHkgYXJyYXkgb2YgaW50MzIsCisgKiB0aGUgc2lnbmF0dXJlIGlzICJpIiBidXQgdGhlIGN1cnJlbnQgdHlwZSB3aWxsIGFsd2F5cyBiZQorICogI0RCVVNfVFlQRV9JTlZBTElEIHNpbmNlIHRoZXJlIGFyZSBubyBlbGVtZW50cyB0byBiZSBjdXJyZW50bHkKKyAqIHBvaW50aW5nIHRvLgorICoKKyAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlcgorICogQHBhcmFtIHN0cl9wIHBsYWNlIHRvIHJldHVybiB0aGUgc3RyaW5nIHdpdGggdGhlIHR5cGUgaW4gaXQKKyAqIEBwYXJhbSBzdGFydF9wIHBsYWNlIHRvIHJldHVybiBzdGFydCBvZiB0aGUgdHlwZQorICogQHBhcmFtIGxlbl9wIHBsYWNlIHRvIHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSB0eXBlCisgKi8KK3ZvaWQKK19kYnVzX3R5cGVfcmVhZGVyX2dldF9zaWduYXR1cmUgKGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgKipzdHJfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAqc3RhcnRfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAqbGVuX3ApCit7CisgICpzdHJfcCA9IHJlYWRlci0+dHlwZV9zdHI7CisgICpzdGFydF9wID0gcmVhZGVyLT50eXBlX3BvczsKKyAgKmxlbl9wID0gZmluZF9sZW5fb2ZfY29tcGxldGVfdHlwZSAocmVhZGVyLT50eXBlX3N0ciwgcmVhZGVyLT50eXBlX3Bvcyk7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIERCdXNTdHJpbmcgcmVwbGFjZW1lbnQ7IC8qKjwgTWFyc2hhbGVkIHZhbHVlIGluY2x1ZGluZyBhbGlnbm1lbnQgcGFkZGluZyAqLworICBpbnQgcGFkZGluZzsgICAgICAgICAgICAvKio8IEhvdyBtdWNoIG9mIHRoZSByZXBsYWNlbWVudCBibG9jayBpcyBwYWRkaW5nICovCit9IFJlcGxhY2VtZW50QmxvY2s7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcmVwbGFjZW1lbnRfYmxvY2tfaW5pdCAoUmVwbGFjZW1lbnRCbG9jayAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAgICpyZWFkZXIpCit7CisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZibG9jay0+cmVwbGFjZW1lbnQpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiAlIDggaXMgdGhlIHBhZGRpbmcgdG8gaGF2ZSB0aGUgc2FtZSBhbGlnbiBwcm9wZXJ0aWVzIGluCisgICAqIG91ciByZXBsYWNlbWVudCBzdHJpbmcgYXMgd2UgZG8gYXQgdGhlIHBvc2l0aW9uIGJlaW5nIHJlcGxhY2VkCisgICAqLworICBibG9jay0+cGFkZGluZyA9IHJlYWRlci0+dmFsdWVfcG9zICUgODsKKworICBpZiAoIV9kYnVzX3N0cmluZ19sZW5ndGhlbiAoJmJsb2NrLT5yZXBsYWNlbWVudCwgYmxvY2stPnBhZGRpbmcpKQorICAgIGdvdG8gb29tOworCisgIHJldHVybiBUUlVFOworCisgb29tOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmJsb2NrLT5yZXBsYWNlbWVudCk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CityZXBsYWNlbWVudF9ibG9ja19yZXBsYWNlIChSZXBsYWNlbWVudEJsb2NrICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAgICAgICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCkKK3sKKyAgREJ1c1R5cGVXcml0ZXIgd3JpdGVyOworICBEQnVzVHlwZVJlYWRlciByZWFsaWduX3JlYWRlcjsKKyAgREJ1c0xpc3QgKmZpeHVwczsKKyAgaW50IG9yaWdfbGVuOworCisgIF9kYnVzX2Fzc2VydCAocmVhbGlnbl9yb290ICE9IE5VTEwpOworCisgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay0+cmVwbGFjZW1lbnQpOworCisgIHJlYWxpZ25fcmVhZGVyID0gKnJlYWxpZ25fcm9vdDsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCJJTklUSUFMSVpJTkcgcmVwbGFjZW1lbnQgYmxvY2sgd3JpdGVyICVwIGF0IHZhbHVlX3BvcyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgJndyaXRlciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay0+cmVwbGFjZW1lbnQpKTsKKyNlbmRpZgorICBfZGJ1c190eXBlX3dyaXRlcl9pbml0X3ZhbHVlc19vbmx5ICgmd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsaWduX3JlYWRlci5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsaWduX3JlYWRlci50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGlnbl9yZWFkZXIudHlwZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibG9jay0+cmVwbGFjZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYmxvY2stPnJlcGxhY2VtZW50KSk7CisKKyAgX2RidXNfYXNzZXJ0IChyZWFsaWduX3JlYWRlci52YWx1ZV9wb3MgPD0gcmVhZGVyLT52YWx1ZV9wb3MpOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIkNPUFlJTkcgZnJvbSByZWFkZXIgYXQgdmFsdWVfcG9zICVkIHRvIHdyaXRlciAlcCBzdGFydGluZyBhZnRlciB2YWx1ZV9wb3MgJWRcbiIsCisgICAgICAgICAgICAgICAgIHJlYWxpZ25fcmVhZGVyLnZhbHVlX3BvcywgJndyaXRlciwgcmVhZGVyLT52YWx1ZV9wb3MpOworI2VuZGlmCisgIGZpeHVwcyA9IE5VTEw7CisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfcmVhZGVyX3BhcnRpYWwgKCZ3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFsaWduX3JlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay0+cGFkZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay0+cmVwbGFjZW1lbnQpIC0gYmxvY2stPnBhZGRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaXh1cHMpKQorICAgIGdvdG8gb29tOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIlJFUExBQ0VNRU5UIGF0IHBhZGRpbmcgJWQgbGVuICVkXG4iLCBibG9jay0+cGFkZGluZywKKyAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay0+cmVwbGFjZW1lbnQpIC0gYmxvY2stPnBhZGRpbmcpOworICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJmJsb2NrLT5yZXBsYWNlbWVudCwgYmxvY2stPnBhZGRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJsb2NrLT5yZXBsYWNlbWVudCkgLSBibG9jay0+cGFkZGluZyk7CisgIF9kYnVzX3ZlcmJvc2UgKCJUTyBCRSBSRVBMQUNFRCBhdCB2YWx1ZV9wb3MgPSAlZCAoYWxpZ24gcGFkICVkKSBsZW4gJWQgcmVhbGlnbl9yZWFkZXIudmFsdWVfcG9zICVkXG4iLAorICAgICAgICAgICAgICAgICByZWFkZXItPnZhbHVlX3BvcywgcmVhZGVyLT52YWx1ZV9wb3MgJSA4LAorICAgICAgICAgICAgICAgICByZWFsaWduX3JlYWRlci52YWx1ZV9wb3MgLSByZWFkZXItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgcmVhbGlnbl9yZWFkZXIudmFsdWVfcG9zKTsKKyAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKHJlYWRlci0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsaWduX3JlYWRlci52YWx1ZV9wb3MgLSByZWFkZXItPnZhbHVlX3Bvcyk7CisjZW5kaWYKKworICAvKiBNb3ZlIHRoZSByZXBsYWNlbWVudCBpbnRvIHBvc2l0aW9uCisgICAqIChyZWFsaWduX3JlYWRlciBzaG91bGQgbm93IGJlIGF0IHRoZSBlbmQgb2YgdGhlIGJsb2NrIHRvIGJlIHJlcGxhY2VkKQorICAgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfcmVwbGFjZV9sZW4gKCZibG9jay0+cmVwbGFjZW1lbnQsIGJsb2NrLT5wYWRkaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay0+cmVwbGFjZW1lbnQpIC0gYmxvY2stPnBhZGRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c1N0cmluZyopIHJlYWRlci0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsaWduX3JlYWRlci52YWx1ZV9wb3MgLSByZWFkZXItPnZhbHVlX3BvcykpCisgICAgZ290byBvb207CisKKyAgLyogUHJvY2VzcyBvdXIgZml4dXBzIG5vdyB0aGF0IHdlIGNhbid0IGhhdmUgYW4gT09NIGVycm9yICovCisgIGFwcGx5X2FuZF9mcmVlX2ZpeHVwcyAoJmZpeHVwcywgcmVhZGVyKTsKKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZibG9jay0+cmVwbGFjZW1lbnQsIG9yaWdfbGVuKTsKKyAgZnJlZV9maXh1cHMgKCZmaXh1cHMpOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCityZXBsYWNlbWVudF9ibG9ja19mcmVlIChSZXBsYWNlbWVudEJsb2NrICpibG9jaykKK3sKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZibG9jay0+cmVwbGFjZW1lbnQpOworfQorCisvKiBJbiB0aGUgdmFyaWFibGUtbGVuZ3RoIGNhc2UsIHdlIGhhdmUgdG8gZml4IGFsaWdubWVudCBhZnRlciB3ZSBpbnNlcnQuCisgKiBUaGUgc3RyYXRlZ3kgaXMgYXMgZm9sbG93czoKKyAqCisgKiAgLSBwYWQgYSBuZXcgc3RyaW5nIHRvIGhhdmUgdGhlIHNhbWUgYWxpZ25tZW50IGFzIHRoZQorICogICAgc3RhcnQgb2YgdGhlIGN1cnJlbnQgYmFzaWMgdmFsdWUKKyAqICAtIHdyaXRlIHRoZSBuZXcgYmFzaWMgdmFsdWUKKyAqICAtIGNvcHkgZnJvbSB0aGUgb3JpZ2luYWwgcmVhZGVyIHRvIHRoZSBuZXcgc3RyaW5nLAorICogICAgd2hpY2ggd2lsbCBmaXggdGhlIGFsaWdubWVudCBvZiB0eXBlcyBmb2xsb3dpbmcKKyAqICAgIHRoZSBuZXcgdmFsdWUKKyAqICAgIC0gdGhpcyBjb3B5IGhhcyB0byBzdGFydCBhdCByZWFsaWduX3Jvb3QsCisgKiAgICAgIGJ1dCBub3QgcmVhbGx5IHdyaXRlIGFueXRoaW5nIHVudGlsIGl0CisgKiAgICAgIHBhc3NlcyB0aGUgdmFsdWUgYmVpbmcgc2V0CisgKiAgICAtIGFzIGFuIG9wdGltaXphdGlvbiwgd2UgY2FuIHN0b3AgY29weWluZworICogICAgICB3aGVuIHRoZSBzb3VyY2UgYW5kIGRlc3QgdmFsdWVzIGFyZSBib3RoCisgKiAgICAgIG9uIGFuIDgtYm91bmRhcnksIHNpbmNlIHdlIGtub3cgYWxsIGZvbGxvd2luZworICogICAgICBwYWRkaW5nIGFuZCBhbGlnbm1lbnQgd2lsbCBiZSBpZGVudGljYWwKKyAqICAtIGNvcHkgdGhlIG5ldyBzdHJpbmcgYmFjayB0byB0aGUgb3JpZ2luYWwKKyAqICAgIHN0cmluZywgcmVwbGFjaW5nIHRoZSByZWxldmFudCBwYXJ0IG9mIHRoZQorICogICAgb3JpZ2luYWwgc3RyaW5nCisgKiAgLSBub3cgYW55IGFycmF5cyBpbiB0aGUgb3JpZ2luYWwgc3RyaW5nIHRoYXQKKyAqICAgIGNvbnRhaW5lZCB0aGUgcmVwbGFjZWQgc3RyaW5nIG1heSBoYXZlIHRoZQorICogICAgd3JvbmcgbGVuZ3RoOyBzbyB3ZSBoYXZlIHRvIGZpeCB0aGF0CisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorcmVhZGVyX3NldF9iYXNpY192YXJpYWJsZV9sZW5ndGggKERCdXNUeXBlUmVhZGVyICAgICAgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCkKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBSZXBsYWNlbWVudEJsb2NrIGJsb2NrOworICBEQnVzVHlwZVdyaXRlciB3cml0ZXI7CisKKyAgX2RidXNfYXNzZXJ0IChyZWFsaWduX3Jvb3QgIT0gTlVMTCk7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgaWYgKCFyZXBsYWNlbWVudF9ibG9ja19pbml0ICgmYmxvY2ssIHJlYWRlcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIFdyaXRlIHRoZSBuZXcgYmFzaWMgdmFsdWUgKi8KKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiSU5JVElBTElaSU5HIHdyaXRlciAlcCB0byB3cml0ZSBiYXNpYyB2YWx1ZSBhdCB2YWx1ZV9wb3MgJWQgb2YgcmVwbGFjZW1lbnQgc3RyaW5nXG4iLAorICAgICAgICAgICAgICAgICAmd3JpdGVyLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJsb2NrLnJlcGxhY2VtZW50KSk7CisjZW5kaWYKKyAgX2RidXNfdHlwZV93cml0ZXJfaW5pdF92YWx1ZXNfb25seSAoJndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXItPnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXItPnR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2sucmVwbGFjZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYmxvY2sucmVwbGFjZW1lbnQpKTsKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiV1JJVElORyBiYXNpYyB2YWx1ZSB0byB3cml0ZXIgJXAgKHJlcGxhY2VtZW50IHN0cmluZylcbiIsICZ3cml0ZXIpOworI2VuZGlmCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKCZ3cml0ZXIsIGN1cnJlbnRfdHlwZSwgdmFsdWUpKQorICAgIGdvdG8gb3V0OworCisgIGlmICghcmVwbGFjZW1lbnRfYmxvY2tfcmVwbGFjZSAoJmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsaWduX3Jvb3QpKQorICAgIGdvdG8gb3V0OworCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIHJlcGxhY2VtZW50X2Jsb2NrX2ZyZWUgKCZibG9jayk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkCityZWFkZXJfc2V0X2Jhc2ljX2ZpeGVkX2xlbmd0aCAoREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgY3VycmVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICp2YWx1ZSkKK3sKKyAgX2RidXNfbWFyc2hhbF9zZXRfYmFzaWMgKChEQnVzU3RyaW5nKikgcmVhZGVyLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7Cit9CisKKy8qKgorICogU2V0cyBhIG5ldyB2YWx1ZSBmb3IgdGhlIGJhc2ljIHR5cGUgdmFsdWUgcG9pbnRlZCB0byBieSB0aGUgcmVhZGVyLAorICogbGVhdmluZyB0aGUgcmVhZGVyIHZhbGlkIHRvIGNvbnRpbnVlIHJlYWRpbmcuIEFueSBvdGhlciByZWFkZXJzCisgKiB3aWxsIGJlIGludmFsaWRhdGVkIGlmIHlvdSBzZXQgYSB2YXJpYWJsZS1sZW5ndGggdHlwZSBzdWNoIGFzIGEKKyAqIHN0cmluZy4KKyAqCisgKiBUaGUgcHJvdmlkZWQgcmVhbGlnbl9yb290IGlzIHRoZSByZWFkZXIgdG8gc3RhcnQgZnJvbSB3aGVuCisgKiByZWFsaWduaW5nIHRoZSBkYXRhIHRoYXQgZm9sbG93cyB0aGUgbmV3bHktc2V0IHZhbHVlLiBUaGUgcmVhZGVyCisgKiBwYXJhbWV0ZXIgbXVzdCBwb2ludCB0byBhIHZhbHVlIGJlbG93IHRoZSByZWFsaWduX3Jvb3QgcGFyYW1ldGVyLgorICogSWYgdGhlIHR5cGUgYmVpbmcgc2V0IGlzIGZpeGVkLWxlbmd0aCwgdGhlbiByZWFsaWduX3Jvb3QgbWF5IGJlCisgKiAjTlVMTC4gT25seSB2YWx1ZXMgcmVhY2hhYmxlIGZyb20gcmVhbGlnbl9yb290IHdpbGwgYmUgcmVhbGlnbmVkLAorICogc28gaWYgeW91ciBzdHJpbmcgY29udGFpbnMgb3RoZXIgdmFsdWVzIHlvdSB3aWxsIG5lZWQgdG8gZGVhbCB3aXRoCisgKiB0aG9zZSBzb21laG93IHlvdXJzZWxmLiBJdCBpcyBPSyBpZiByZWFsaWduX3Jvb3QgaXMgdGhlIHNhbWUKKyAqIHJlYWRlciBhcyB0aGUgcmVhZGVyIHBhcmFtZXRlciwgdGhvdWdoIGlmIHlvdSBhcmVuJ3Qgc2V0dGluZyB0aGUKKyAqIHJvb3QgaXQgbWF5IG5vdCBiZSBzdWNoIGEgZ29vZCBpZGVhLgorICoKKyAqIEB0b2RvIERCdXNUeXBlUmVhZGVyIGN1cnJlbnRseSB0YWtlcyAiY29uc3QiIHZlcnNpb25zIG9mIHRoZSB0eXBlCisgKiBhbmQgdmFsdWUgc3RyaW5ncywgYW5kIHRoaXMgZnVuY3Rpb24gbW9kaWZpZXMgdGhvc2Ugc3RyaW5ncyBieQorICogY2FzdGluZyBhd2F5IHRoZSBjb25zdCwgd2hpY2ggaXMgb2YgY291cnNlIGJhZCBpZiB3ZSB3YW50IHRvIGdldAorICogcGlja3kuIChUbyBiZSB0cnVseSBjbGVhbiB5b3UnZCBoYXZlIGFuIG9iamVjdCB3aGljaCBjb250YWluZWQgdGhlCisgKiB0eXBlIGFuZCB2YWx1ZSBzdHJpbmdzIGFuZCBzZXRfYmFzaWMgd291bGQgYmUgYSBtZXRob2Qgb24gdGhhdAorICogb2JqZWN0Li4uIHRoaXMgd291bGQgYWxzbyBtYWtlIERCdXNUeXBlUmVhZGVyIHRoZSBzYW1lIHRoaW5nIGFzCisgKiBEQnVzVHlwZU1hcmsuIEJ1dCBzaW5jZSBEQnVzTWVzc2FnZSBpcyBlZmZlY3RpdmVseSB0aGF0IG9iamVjdCBmb3IKKyAqIEQtQnVzIGl0IGRvZXNuJ3Qgc2VlbSB3b3J0aCBjcmVhdGluZyBzb21lIHJhbmRvbSBvYmplY3QuKQorICoKKyAqIEB0b2RvIG9wdGltaXplIHRoaXMgYnkgb25seSByZXdyaXRpbmcgdW50aWwgdGhlIG9sZCBhbmQgbmV3IHZhbHVlcworICogYXJlIGF0IHRoZSBzYW1lIGFsaWdubWVudC4gRnJlcXVlbnRseSB0aGlzIHNob3VsZCByZXN1bHQgaW4gb25seQorICogcmVwbGFjaW5nIHRoZSB2YWx1ZSB0aGF0J3MgaW1tZWRpYXRlbHkgYXQgaGFuZC4KKyAqCisgKiBAcGFyYW0gcmVhZGVyIHJlYWRlciBpbmRpY2F0aW5nIHdoZXJlIHRvIHNldCBhIG5ldyB2YWx1ZQorICogQHBhcmFtIHZhbHVlIGFkZHJlc3Mgb2YgdGhlIHZhbHVlIHRvIHNldAorICogQHBhcmFtIHJlYWxpZ25fcm9vdCByZWFsaWduIGZyb20gaGVyZQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190eXBlX3JlYWRlcl9zZXRfYmFzaWMgKERCdXNUeXBlUmVhZGVyICAgICAgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCkKK3sKKyAgaW50IGN1cnJlbnRfdHlwZTsKKworICBfZGJ1c19hc3NlcnQgKCFyZWFkZXItPmtsYXNzLT50eXBlc19vbmx5KTsKKyAgX2RidXNfYXNzZXJ0IChyZWFkZXItPnZhbHVlX3N0ciA9PSByZWFsaWduX3Jvb3QtPnZhbHVlX3N0cik7CisgIF9kYnVzX2Fzc2VydCAocmVhZGVyLT52YWx1ZV9wb3MgPj0gcmVhbGlnbl9yb290LT52YWx1ZV9wb3MpOworCisgIGN1cnJlbnRfdHlwZSA9IF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKHJlYWRlcik7CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiICBTRVQgQkFTSUMgdHlwZSByZWFkZXIgJXAgdHlwZV9wb3MgPSAlZCB2YWx1ZV9wb3MgPSAlZCByZW1haW5pbmcgc2lnICclcycgcmVhbGlnbl9yb290ID0gJXAgd2l0aCB2YWx1ZV9wb3MgJWQgY3VycmVudF90eXBlID0gJXNcbiIsCisgICAgICAgICAgICAgICAgIHJlYWRlciwgcmVhZGVyLT50eXBlX3BvcywgcmVhZGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHJlYWRlci0+dHlwZV9zdHIsIHJlYWRlci0+dHlwZV9wb3MsIDApLAorICAgICAgICAgICAgICAgICByZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgIHJlYWxpZ25fcm9vdCA/IHJlYWxpZ25fcm9vdC0+dmFsdWVfcG9zIDogLTEsCisgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChjdXJyZW50X3R5cGUpKTsKKyAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKHJlYWxpZ25fcm9vdC0+dmFsdWVfc3RyLCByZWFsaWduX3Jvb3QtPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChyZWFsaWduX3Jvb3QtPnZhbHVlX3N0cikgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGlnbl9yb290LT52YWx1ZV9wb3MpOworI2VuZGlmCisKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3R5cGVfaXNfYmFzaWMgKGN1cnJlbnRfdHlwZSkpOworCisgIGlmIChkYnVzX3R5cGVfaXNfZml4ZWQgKGN1cnJlbnRfdHlwZSkpCisgICAgeworICAgICAgcmVhZGVyX3NldF9iYXNpY19maXhlZF9sZW5ndGggKHJlYWRlciwgY3VycmVudF90eXBlLCB2YWx1ZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHJlYWxpZ25fcm9vdCAhPSBOVUxMKTsKKyAgICAgIHJldHVybiByZWFkZXJfc2V0X2Jhc2ljX3ZhcmlhYmxlX2xlbmd0aCAocmVhZGVyLCBjdXJyZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCByZWFsaWduX3Jvb3QpOworICAgIH0KK30KKworLyoqCisgKiBSZWN1cnNpdmVseSBkZWxldGVzIGFueSB2YWx1ZSBwb2ludGVkIHRvIGJ5IHRoZSByZWFkZXIsIGxlYXZpbmcgdGhlCisgKiByZWFkZXIgdmFsaWQgdG8gY29udGludWUgcmVhZGluZy4gQW55IG90aGVyIHJlYWRlcnMgd2lsbCBiZQorICogaW52YWxpZGF0ZWQuCisgKgorICogVGhlIHByb3ZpZGVkIHJlYWxpZ25fcm9vdCBpcyB0aGUgcmVhZGVyIHRvIHN0YXJ0IGZyb20gd2hlbgorICogcmVhbGlnbmluZyB0aGUgZGF0YSB0aGF0IGZvbGxvd3MgdGhlIG5ld2x5LXNldCB2YWx1ZS4KKyAqIFNlZSBfZGJ1c190eXBlX3JlYWRlcl9zZXRfYmFzaWMoKSBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZQorICogcmVhbGlnbl9yb290IHBhcmFtdGVyLgorICoKKyAqIEB0b2RvIGZvciBub3cgdGhpcyBkb2VzIG5vdCBkZWxldGUgdGhlIHR5cGVjb2RlcyBhc3NvY2lhdGVkIHdpdGgKKyAqIHRoZSB2YWx1ZSwgc28gdGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIGZvciBhcnJheSBlbGVtZW50cy4KKyAqCisgKiBAcGFyYW0gcmVhZGVyIHJlYWRlciBpbmRpY2F0aW5nIHdoZXJlIHRvIGRlbGV0ZSBhIHZhbHVlCisgKiBAcGFyYW0gcmVhbGlnbl9yb290IHJlYWxpZ24gZnJvbSBoZXJlCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3R5cGVfcmVhZGVyX2RlbGV0ZSAoREJ1c1R5cGVSZWFkZXIgICAgICAgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhbGlnbl9yb290KQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIFJlcGxhY2VtZW50QmxvY2sgYmxvY2s7CisKKyAgX2RidXNfYXNzZXJ0IChyZWFsaWduX3Jvb3QgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocmVhZGVyLT5rbGFzcyA9PSAmYXJyYXlfcmVhZGVyX2NsYXNzKTsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBpZiAoIXJlcGxhY2VtZW50X2Jsb2NrX2luaXQgKCZibG9jaywgcmVhZGVyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFyZXBsYWNlbWVudF9ibG9ja19yZXBsYWNlICgmYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxpZ25fcm9vdCkpCisgICAgZ290byBvdXQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgcmVwbGFjZW1lbnRfYmxvY2tfZnJlZSAoJmJsb2NrKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIENvbXBhcmVzIHR3byByZWFkZXJzLCB3aGljaCBtdXN0IGJlIGl0ZXJhdGluZyBvdmVyIHRoZSBzYW1lIHZhbHVlIGRhdGEuCisgKiBSZXR1cm5zICNUUlVFIGlmIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgZnVydGhlciBhbG9uZyB0aGFuIHRoZSBzZWNvbmQgcGFyYW1ldGVyLgorICoKKyAqIEBwYXJhbSBsaHMgbGVmdC1oYW5kLXNpZGUgKGZpcnN0KSBwYXJhbWV0ZXIKKyAqIEBwYXJhbSByaHMgbGVmdC1oYW5kLXNpZGUgKGZpcnN0KSBwYXJhbWV0ZXIKKyAqIEByZXR1cm5zIHdoZXRoZXIgbGhzIGlzIGdyZWF0ZXIgdGhhbiByaHMKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c190eXBlX3JlYWRlcl9ncmVhdGVyX3RoYW4gKGNvbnN0IERCdXNUeXBlUmVhZGVyICAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzVHlwZVJlYWRlciAgKnJocykKK3sKKyAgX2RidXNfYXNzZXJ0IChsaHMtPnZhbHVlX3N0ciA9PSByaHMtPnZhbHVlX3N0cik7CisKKyAgcmV0dXJuIGxocy0+dmFsdWVfcG9zID4gcmhzLT52YWx1ZV9wb3M7Cit9CisKKy8qCisgKgorICoKKyAqICAgICAgICAgREJ1c1R5cGVXcml0ZXIKKyAqCisgKgorICoKKyAqLworCisvKioKKyAqIEluaXRpYWxpemUgYSB3cml0ZSBpdGVyYXRvciwgd2hpY2ggaXMgdXNlZCB0byB3cml0ZSBvdXQgdmFsdWVzIGluCisgKiBzZXJpYWxpemVkIEQtQnVzIGZvcm1hdC4KKyAqCisgKiBUaGUgdHlwZV9wb3MgcGFzc2VkIGluIGlzIGV4cGVjdGVkIHRvIGJlIGluc2lkZSBhbiBhbHJlYWR5LXZhbGlkLAorICogdGhvdWdoIHBvdGVudGlhbGx5IGVtcHR5LCB0eXBlIHNpZ25hdHVyZS4gVGhpcyBtZWFucyB0aGF0IHRoZSBieXRlCisgKiBhZnRlciB0eXBlX3BvcyBtdXN0IGJlIGVpdGhlciAjREJVU19UWVBFX0lOVkFMSUQgKGFrYSBudWwpIG9yIHNvbWUKKyAqIG90aGVyIHZhbGlkIHR5cGUuICNEQnVzVHlwZVdyaXRlciB3b24ndCBlbmZvcmNlIHRoYXQgdGhlIHNpZ25hdHVyZQorICogaXMgYWxyZWFkeSB2YWxpZCAoeW91IGNhbiBhcHBlbmQgdGhlIG51bCBieXRlIGF0IHRoZSBlbmQgaWYgeW91CisgKiBsaWtlKSwgYnV0IGp1c3QgYmUgYXdhcmUgdGhhdCB5b3UgbmVlZCB0aGUgbnVsIGJ5dGUgZXZlbnR1YWxseSBhbmQKKyAqICNEQnVzVHlwZVdyaXRlciBpc24ndCBnb2luZyB0byB3cml0ZSBpdCBmb3IgeW91LgorICoKKyAqIEBwYXJhbSB3cml0ZXIgdGhlIHdyaXRlciB0byBpbml0CisgKiBAcGFyYW0gYnl0ZV9vcmRlciB0aGUgYnl0ZSBvcmRlciB0byBtYXJzaGFsIGludG8KKyAqIEBwYXJhbSB0eXBlX3N0ciB0aGUgc3RyaW5nIHRvIHdyaXRlIHR5cGVjb2RlcyBpbnRvCisgKiBAcGFyYW0gdHlwZV9wb3Mgd2hlcmUgdG8gaW5zZXJ0IHR5cGVjb2RlcworICogQHBhcmFtIHZhbHVlX3N0ciB0aGUgc3RyaW5nIHRvIHdyaXRlIHZhbHVlcyBpbnRvCisgKiBAcGFyYW0gdmFsdWVfcG9zIHdoZXJlIHRvIGluc2VydCB2YWx1ZXMKKyAqCisgKi8KK3ZvaWQKK19kYnVzX3R5cGVfd3JpdGVyX2luaXQgKERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICp0eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICB0eXBlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICp2YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgdmFsdWVfcG9zKQoreworICB3cml0ZXItPmJ5dGVfb3JkZXIgPSBieXRlX29yZGVyOworICB3cml0ZXItPnR5cGVfc3RyID0gdHlwZV9zdHI7CisgIHdyaXRlci0+dHlwZV9wb3MgPSB0eXBlX3BvczsKKyAgd3JpdGVyLT52YWx1ZV9zdHIgPSB2YWx1ZV9zdHI7CisgIHdyaXRlci0+dmFsdWVfcG9zID0gdmFsdWVfcG9zOworICB3cml0ZXItPmNvbnRhaW5lcl90eXBlID0gREJVU19UWVBFX0lOVkFMSUQ7CisgIHdyaXRlci0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb24gPSBGQUxTRTsKKyAgd3JpdGVyLT5lbmFibGVkID0gVFJVRTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCJ3cml0ZXIgJXAgaW5pdCByZW1haW5pbmcgc2lnICclcydcbiIsIHdyaXRlciwKKyAgICAgICAgICAgICAgICAgd3JpdGVyLT50eXBlX3N0ciA/CisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHdyaXRlci0+dHlwZV9zdHIsIHdyaXRlci0+dHlwZV9wb3MsIDApIDoKKyAgICAgICAgICAgICAgICAgInVua25vd24iKTsKKyNlbmRpZgorfQorCisvKioKKyAqIEluaXRpYWxpemUgYSB3cml0ZSBpdGVyYXRvciwgd2l0aCB0aGUgc2lnbmF0dXJlIHRvIGJlIHByb3ZpZGVkCisgKiBsYXRlci4KKyAqCisgKiBAcGFyYW0gd3JpdGVyIHRoZSB3cml0ZXIgdG8gaW5pdAorICogQHBhcmFtIGJ5dGVfb3JkZXIgdGhlIGJ5dGUgb3JkZXIgdG8gbWFyc2hhbCBpbnRvCisgKiBAcGFyYW0gdmFsdWVfc3RyIHRoZSBzdHJpbmcgdG8gd3JpdGUgdmFsdWVzIGludG8KKyAqIEBwYXJhbSB2YWx1ZV9wb3Mgd2hlcmUgdG8gaW5zZXJ0IHZhbHVlcworICoKKyAqLwordm9pZAorX2RidXNfdHlwZV93cml0ZXJfaW5pdF90eXBlc19kZWxheWVkIChEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgKnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHZhbHVlX3BvcykKK3sKKyAgX2RidXNfdHlwZV93cml0ZXJfaW5pdCAod3JpdGVyLCBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCB2YWx1ZV9zdHIsIHZhbHVlX3Bvcyk7Cit9CisKKy8qKgorICogQWRkcyB0eXBlIHN0cmluZyB0byB0aGUgd3JpdGVyLCBpZiBpdCBoYWQgbm9uZS4KKyAqCisgKiBAcGFyYW0gd3JpdGVyIHRoZSB3cml0ZXIgdG8gaW5pdAorICogQHBhcmFtIHR5cGVfc3RyIHR5cGUgc3RyaW5nIHRvIGFkZAorICogQHBhcmFtIHR5cGVfcG9zIHR5cGUgcG9zaXRpb24KKyAqCisgKi8KK3ZvaWQKK19kYnVzX3R5cGVfd3JpdGVyX2FkZF90eXBlcyAoREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgKnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgdHlwZV9wb3MpCit7CisgIGlmICh3cml0ZXItPnR5cGVfc3RyID09IE5VTEwpIC8qIGtlZXBzIHVzIGZyb20gdXNpbmcgdGhpcyBhcyBzZXR0ZXIgKi8KKyAgICB7CisgICAgICB3cml0ZXItPnR5cGVfc3RyID0gdHlwZV9zdHI7CisgICAgICB3cml0ZXItPnR5cGVfcG9zID0gdHlwZV9wb3M7CisgICAgfQorfQorCisvKioKKyAqIFJlbW92ZXMgdHlwZSBzdHJpbmcgZnJvbSB0aGUgd3JpdGVyLgorICoKKyAqIEBwYXJhbSB3cml0ZXIgdGhlIHdyaXRlciB0byByZW1vdmUgZnJvbQorICovCit2b2lkCitfZGJ1c190eXBlX3dyaXRlcl9yZW1vdmVfdHlwZXMgKERCdXNUeXBlV3JpdGVyICp3cml0ZXIpCit7CisgIHdyaXRlci0+dHlwZV9zdHIgPSBOVUxMOworICB3cml0ZXItPnR5cGVfcG9zID0gLTE7Cit9CisKKy8qKgorICogTGlrZSBfZGJ1c190eXBlX3dyaXRlcl9pbml0KCksIGV4Y2VwdCB0aGUgdHlwZSBzdHJpbmcKKyAqIHBhc3NlZCBpbiBzaG91bGQgY29ycmVzcG9uZCB0byBhbiBleGlzdGluZyBzaWduYXR1cmUgdGhhdAorICogbWF0Y2hlcyB3aGF0IHlvdSdyZSBnb2luZyB0byB3cml0ZSBvdXQuIFRoZSB3cml0ZXIgd2lsbAorICogY2hlY2sgd2hhdCB5b3Ugd3JpdGUgdnMuIHRoaXMgZXhpc3Rpbmcgc2lnbmF0dXJlLgorICoKKyAqIEBwYXJhbSB3cml0ZXIgdGhlIHdyaXRlciB0byBpbml0CisgKiBAcGFyYW0gYnl0ZV9vcmRlciB0aGUgYnl0ZSBvcmRlciB0byBtYXJzaGFsIGludG8KKyAqIEBwYXJhbSB0eXBlX3N0ciB0aGUgc3RyaW5nIHdpdGggc2lnbmF0dXJlCisgKiBAcGFyYW0gdHlwZV9wb3Mgc3RhcnQgb2Ygc2lnbmF0dXJlCisgKiBAcGFyYW0gdmFsdWVfc3RyIHRoZSBzdHJpbmcgdG8gd3JpdGUgdmFsdWVzIGludG8KKyAqIEBwYXJhbSB2YWx1ZV9wb3Mgd2hlcmUgdG8gaW5zZXJ0IHZhbHVlcworICoKKyAqLwordm9pZAorX2RidXNfdHlwZV93cml0ZXJfaW5pdF92YWx1ZXNfb25seSAoREJ1c1R5cGVXcml0ZXIgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgdHlwZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICp2YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICB2YWx1ZV9wb3MpCit7CisgIF9kYnVzX3R5cGVfd3JpdGVyX2luaXQgKHdyaXRlciwgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNTdHJpbmcqKXR5cGVfc3RyLCB0eXBlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfc3RyLCB2YWx1ZV9wb3MpOworCisgIHdyaXRlci0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb24gPSBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2Jhc2ljX25vX3R5cGVjb2RlIChEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICp2YWx1ZSkKK3sKKyAgaWYgKHdyaXRlci0+ZW5hYmxlZCkKKyAgICByZXR1cm4gX2RidXNfbWFyc2hhbF93cml0ZV9iYXNpYyAod3JpdGVyLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd3JpdGVyLT52YWx1ZV9wb3MpOworICBlbHNlCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIElmIG91ciBwYXJlbnQgaXMgYW4gYXJyYXksIHRoaW5ncyBhcmUgYSBsaXR0bGUgYml0IGNvbXBsaWNhdGVkLgorICoKKyAqIFRoZSBwYXJlbnQgbXVzdCBoYXZlIGEgY29tcGxldGUgZWxlbWVudCB0eXBlLCBzdWNoIGFzCisgKiAiaSIgb3IgImFhaSIgb3IgIihpaSkiIG9yICJhKGlpKSIuIFRoZXJlIGNhbid0IGJlCisgKiB1bmNsb3NlZCBwYXJlbnMsIG9yIGFuICJhIiB3aXRoIG5vIGZvbGxvd2luZyB0eXBlLgorICoKKyAqIFRvIHJlY3Vyc2UsIHRoZSBvbmx5IGFsbG93ZWQgb3BlcmF0aW9uIGlzIHRvIHJlY3Vyc2UgaW50byB0aGUKKyAqIGZpcnN0IHR5cGUgaW4gdGhlIGVsZW1lbnQgdHlwZS4gU28gZm9yICJpIiB5b3UgY2FuJ3QgcmVjdXJzZSwgZm9yCisgKiAiYWkiIHlvdSBjYW4gcmVjdXJzZSBpbnRvIHRoZSBhcnJheSwgZm9yICIoaWkpIiB5b3UgY2FuIHJlY3Vyc2UKKyAqIGludG8gdGhlIHN0cnVjdC4KKyAqCisgKiBJZiB5b3UgcmVjdXJzZSBpbnRvIHRoZSBhcnJheSBmb3IgImFpIiwgdGhlbiB5b3UgbXVzdCBzcGVjaWZ5CisgKiAiaSIgZm9yIHRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIGFycmF5IHlvdSByZWN1cnNlIGludG8uCisgKgorICogV2hpbGUgaW5zaWRlIGFuIGFycmF5IGF0IGFueSBsZXZlbCwgd2UgbmVlZCB0byBhdm9pZCB3cml0aW5nIHRvCisgKiB0eXBlX3N0ciwgc2luY2UgdGhlIHR5cGUgb25seSBhcHBlYXJzIG9uY2UgZm9yIHRoZSB3aG9sZSBhcnJheSwKKyAqIGl0IGRvZXMgbm90IGFwcGVhciBmb3IgZWFjaCBhcnJheSBlbGVtZW50LgorICoKKyAqIFdoaWxlIGluc2lkZSBhbiBhcnJheSB0eXBlX3BvcyBwb2ludHMgdG8gdGhlIGV4cGVjdGVkIG5leHQKKyAqIHR5cGVjb2RlLCByYXRoZXIgdGhhbiB0aGUgbmV4dCBwbGFjZSB3ZSBjb3VsZCB3cml0ZSBhIHR5cGVjb2RlLgorICovCitzdGF0aWMgdm9pZAord3JpdGVyX3JlY3Vyc2VfaW5pdF9hbmRfY2hlY2sgKERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGNvbnRhaW5lcl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICpzdWIpCit7CisgIF9kYnVzX3R5cGVfd3JpdGVyX2luaXQgKHN1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXItPnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXItPnR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXItPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT52YWx1ZV9wb3MpOworCisgIHN1Yi0+Y29udGFpbmVyX3R5cGUgPSBjb250YWluZXJfdHlwZTsKKworICBpZiAod3JpdGVyLT50eXBlX3Bvc19pc19leHBlY3RhdGlvbiB8fAorICAgICAgKHN1Yi0+Y29udGFpbmVyX3R5cGUgPT0gREJVU19UWVBFX0FSUkFZIHx8IHN1Yi0+Y29udGFpbmVyX3R5cGUgPT0gREJVU19UWVBFX1ZBUklBTlQpKQorICAgIHN1Yi0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb24gPSBUUlVFOworICBlbHNlCisgICAgc3ViLT50eXBlX3Bvc19pc19leHBlY3RhdGlvbiA9IEZBTFNFOworCisgIHN1Yi0+ZW5hYmxlZCA9IHdyaXRlci0+ZW5hYmxlZDsKKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIGlmICh3cml0ZXItPnR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uICYmIHdyaXRlci0+dHlwZV9zdHIpCisgICAgeworICAgICAgaW50IGV4cGVjdGVkOworCisgICAgICBleHBlY3RlZCA9IF9kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlICh3cml0ZXItPnR5cGVfc3RyLCB3cml0ZXItPnR5cGVfcG9zKTsKKworICAgICAgaWYgKGV4cGVjdGVkICE9IHN1Yi0+Y29udGFpbmVyX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZXhwZWN0ZWQgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgICAgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoIldyaXRpbmcgYW4gZWxlbWVudCBvZiB0eXBlICVzLCBidXQgdGhlIGV4cGVjdGVkIHR5cGUgaGVyZSBpcyAlc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgb3ZlcmFsbCBzaWduYXR1cmUgZXhwZWN0ZWQgaGVyZSB3YXMgJyVzJyBhbmQgd2UgYXJlIG9uIGJ5dGUgJWQgb2YgdGhhdCBzaWduYXR1cmUuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChzdWItPmNvbnRhaW5lcl90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAoZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAod3JpdGVyLT50eXBlX3N0ciksIHdyaXRlci0+dHlwZV9wb3MpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkICgiV3JpdGluZyBhbiBlbGVtZW50IG9mIHR5cGUgJXMsIGJ1dCBubyB2YWx1ZSBpcyBleHBlY3RlZCBoZXJlXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBvdmVyYWxsIHNpZ25hdHVyZSBleHBlY3RlZCBoZXJlIHdhcyAnJXMnIGFuZCB3ZSBhcmUgb24gYnl0ZSAlZCBvZiB0aGF0IHNpZ25hdHVyZS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHN1Yi0+Y29udGFpbmVyX3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAod3JpdGVyLT50eXBlX3N0ciksIHdyaXRlci0+dHlwZV9wb3MpOworICAgICAgICAgIAorICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImJhZCBhcnJheSBlbGVtZW50IG9yIHZhcmlhbnQgY29udGVudCB3cml0dGVuIik7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogREJVU19ESVNBQkxFX0NIRUNLUyAqLworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgdHlwZSB3cml0ZXIgJXAgcmVjdXJzZSBwYXJlbnQgJXMgdHlwZV9wb3MgPSAlZCB2YWx1ZV9wb3MgPSAlZCBpc19leHBlY3RhdGlvbiA9ICVkIHJlbWFpbmluZyBzaWcgJyVzJyBlbmFibGVkID0gJWRcbiIsCisgICAgICAgICAgICAgICAgIHdyaXRlciwKKyAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHdyaXRlci0+Y29udGFpbmVyX3R5cGUpLAorICAgICAgICAgICAgICAgICB3cml0ZXItPnR5cGVfcG9zLCB3cml0ZXItPnZhbHVlX3Bvcywgd3JpdGVyLT50eXBlX3Bvc19pc19leHBlY3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgd3JpdGVyLT50eXBlX3N0ciA/CisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHdyaXRlci0+dHlwZV9zdHIsIHdyaXRlci0+dHlwZV9wb3MsIDApIDoKKyAgICAgICAgICAgICAgICAgInVua25vd24iLAorICAgICAgICAgICAgICAgICB3cml0ZXItPmVuYWJsZWQpOworICBfZGJ1c192ZXJib3NlICgiICB0eXBlIHdyaXRlciAlcCByZWN1cnNlIHN1YiAlcyAgIHR5cGVfcG9zID0gJWQgdmFsdWVfcG9zID0gJWQgaXNfZXhwZWN0YXRpb24gPSAlZCBlbmFibGVkID0gJWRcbiIsCisgICAgICAgICAgICAgICAgIHN1YiwKKyAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHN1Yi0+Y29udGFpbmVyX3R5cGUpLAorICAgICAgICAgICAgICAgICBzdWItPnR5cGVfcG9zLCBzdWItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgc3ViLT50eXBlX3Bvc19pc19leHBlY3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgc3ViLT5lbmFibGVkKTsKKyNlbmRpZgorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3dyaXRlX29yX3ZlcmlmeV90eXBlY29kZSAoREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHR5cGVjb2RlKQoreworICAvKiBBIHN1YndyaXRlciBpbnNpZGUgYW4gYXJyYXkgb3IgdmFyaWFudCB3aWxsIGhhdmUgdHlwZV9wb3MKKyAgICogcG9pbnRpbmcgdG8gdGhlIGV4cGVjdGVkIHR5cGVjb2RlOyBhIHdyaXRlciBub3QgaW5zaWRlIGFuIGFycmF5CisgICAqIG9yIHZhcmlhbnQgaGFzIHR5cGVfcG9zIHBvaW50aW5nIHRvIHRoZSBuZXh0IHBsYWNlIHRvIGluc2VydCBhCisgICAqIHR5cGVjb2RlLgorICAgKi8KKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiICB0eXBlIHdyaXRlciAlcCB3cml0ZV9vcl92ZXJpZnkgc3RhcnQgdHlwZV9wb3MgPSAlZCByZW1haW5pbmcgc2lnICclcycgZW5hYmxlZCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICB3cml0ZXIsIHdyaXRlci0+dHlwZV9wb3MsCisgICAgICAgICAgICAgICAgIHdyaXRlci0+dHlwZV9zdHIgPworICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuICh3cml0ZXItPnR5cGVfc3RyLCB3cml0ZXItPnR5cGVfcG9zLCAwKSA6CisgICAgICAgICAgICAgICAgICJ1bmtub3duIiwKKyAgICAgICAgICAgICAgICAgd3JpdGVyLT5lbmFibGVkKTsKKyNlbmRpZgorCisgIGlmICh3cml0ZXItPnR5cGVfc3RyID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKHdyaXRlci0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb24pCisgICAgeworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgICAgICB7CisgICAgICAgIGludCBleHBlY3RlZDsKKworICAgICAgICBleHBlY3RlZCA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAod3JpdGVyLT50eXBlX3N0ciwgd3JpdGVyLT50eXBlX3Bvcyk7CisKKyAgICAgICAgaWYgKGV4cGVjdGVkICE9IHR5cGVjb2RlKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChleHBlY3RlZCAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJBcnJheSBvciB2YXJpYW50IHR5cGUgcmVxdWlyZXMgdGhhdCB0eXBlICVzIGJlIHdyaXR0ZW4sIGJ1dCAlcyB3YXMgd3JpdHRlbi5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgb3ZlcmFsbCBzaWduYXR1cmUgZXhwZWN0ZWQgaGVyZSB3YXMgJyVzJyBhbmQgd2UgYXJlIG9uIGJ5dGUgJWQgb2YgdGhhdCBzaWduYXR1cmUuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKGV4cGVjdGVkKSwgX2RidXNfdHlwZV90b19zdHJpbmcgKHR5cGVjb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAod3JpdGVyLT50eXBlX3N0ciksIHdyaXRlci0+dHlwZV9wb3MpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoIkFycmF5IG9yIHZhcmlhbnQgdHlwZSB3YXNuJ3QgZXhwZWN0aW5nIGFueSBtb3JlIHZhbHVlcyB0byBiZSB3cml0dGVuIGludG8gaXQsIGJ1dCBhIHZhbHVlICVzIHdhcyB3cml0dGVuLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBvdmVyYWxsIHNpZ25hdHVyZSBleHBlY3RlZCBoZXJlIHdhcyAnJXMnIGFuZCB3ZSBhcmUgb24gYnl0ZSAlZCBvZiB0aGF0IHNpZ25hdHVyZS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAodHlwZWNvZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICh3cml0ZXItPnR5cGVfc3RyKSwgd3JpdGVyLT50eXBlX3Bvcyk7CisgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJiYWQgdHlwZSBpbnNlcnRlZCBzb21ld2hlcmUgaW5zaWRlIGFuIGFycmF5IG9yIHZhcmlhbnQiKTsKKyAgICAgICAgICB9CisgICAgICB9CisjZW5kaWYgLyogREJVU19ESVNBQkxFX0NIRUNLUyAqLworCisgICAgICAvKiBpZiBpbW1lZGlhdGVseSBpbnNpZGUgYW4gYXJyYXkgd2UnZCBhbHdheXMgYmUgYXBwZW5kaW5nIGFuIGVsZW1lbnQsCisgICAgICAgKiBzbyB0aGUgZXhwZWN0ZWQgdHlwZSBkb2Vzbid0IGNoYW5nZTsgaWYgaW5zaWRlIGEgc3RydWN0IG9yIHNvbWV0aGluZworICAgICAgICogYmVsb3cgYW4gYXJyYXksIHdlIG5lZWQgdG8gbW92ZSB0aHJvdWdoIHNhaWQgc3RydWN0IG9yIHNvbWV0aGluZy4KKyAgICAgICAqLworICAgICAgaWYgKHdyaXRlci0+Y29udGFpbmVyX3R5cGUgIT0gREJVU19UWVBFX0FSUkFZKQorICAgICAgICB3cml0ZXItPnR5cGVfcG9zICs9IDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGUgKHdyaXRlci0+dHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT50eXBlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlY29kZSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgd3JpdGVyLT50eXBlX3BvcyArPSAxOworICAgIH0KKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCIgIHR5cGUgd3JpdGVyICVwIHdyaXRlX29yX3ZlcmlmeSBlbmQgdHlwZV9wb3MgPSAlZCByZW1haW5pbmcgc2lnICclcydcbiIsCisgICAgICAgICAgICAgICAgIHdyaXRlciwgd3JpdGVyLT50eXBlX3BvcywKKyAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAod3JpdGVyLT50eXBlX3N0ciwgd3JpdGVyLT50eXBlX3BvcywgMCkpOworI2VuZGlmCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAord3JpdGVyX3JlY3Vyc2Vfc3RydWN0X29yX2RpY3RfZW50cnkgKERCdXNUeXBlV3JpdGVyICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBiZWdpbl9jaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmNvbnRhaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAgICpzdWIpCit7CisgIC8qIEZJWE1FIHJpZ2h0IG5vdyBjb250YWluZWRfdHlwZSBpcyBpZ25vcmVkOyB3ZSBjb3VsZCBwcm9iYWJseQorICAgKiBhbG1vc3QgdHJpdmlhbGx5IGZpeCB0aGUgY29kZSBzbyBpZiBpdCdzIHByZXNlbnQgd2UKKyAgICogd3JpdGUgaXQgb3V0IGFuZCB0aGVuIHNldCB0eXBlX3Bvc19pc19leHBlY3RhdGlvbgorICAgKi8KKworICAvKiBFbnN1cmUgdGhhdCB3ZSdsbCBiZSBhYmxlIHRvIGFkZCBhbGlnbm1lbnQgcGFkZGluZyBhbmQgdGhlIHR5cGVjb2RlICovCisgIGlmICh3cml0ZXItPmVuYWJsZWQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYWxsb2Nfc3BhY2UgKHN1Yi0+dmFsdWVfc3RyLCA4KSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIXdyaXRlX29yX3ZlcmlmeV90eXBlY29kZSAoc3ViLCBiZWdpbl9jaGFyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gaW5zZXJ0IHN0cnVjdCB0eXBlY29kZSBhZnRlciBwcmVhbGxvYyIpOworCisgIGlmICh3cml0ZXItPmVuYWJsZWQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGVzIChzdWItPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX0FMSUdOX1ZBTFVFIChzdWItPnZhbHVlX3BvcywgOCkgLSBzdWItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wwJykpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNob3VsZCBub3QgaGF2ZSBmYWlsZWQgdG8gaW5zZXJ0IGFsaWdubWVudCBwYWRkaW5nIGZvciBzdHJ1Y3QiKTsKKyAgICAgIHN1Yi0+dmFsdWVfcG9zID0gX0RCVVNfQUxJR05fVkFMVUUgKHN1Yi0+dmFsdWVfcG9zLCA4KTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIGRidXNfYm9vbF90Cit3cml0ZXJfcmVjdXJzZV9hcnJheSAoREJ1c1R5cGVXcml0ZXIgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmNvbnRhaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAgICpzdWIsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgaXNfYXJyYXlfYXBwZW5kKQoreworICBkYnVzX3VpbnQzMl90IHZhbHVlID0gMDsKKyAgaW50IGFsaWdubWVudDsKKyAgaW50IGFsaWduZWQ7CisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICBpZiAod3JpdGVyLT5jb250YWluZXJfdHlwZSA9PSBEQlVTX1RZUEVfQVJSQVkgJiYKKyAgICAgIHdyaXRlci0+dHlwZV9zdHIpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nIChjb250YWluZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT51LmFycmF5LmVsZW1lbnRfdHlwZV9wb3MgKyAxKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkICgiV3JpdGluZyBhbiBhcnJheSBvZiAnJXMnIGJ1dCB0aGlzIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBleHBlY3RlZCB0eXBlIG9mIGVsZW1lbnRzIGluIHRoZSBwYXJlbnQgYXJyYXlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKGNvbnRhaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfbGVuKSk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW5jb21wYXRpYmxlIHR5cGUgZm9yIGNoaWxkIGFycmF5Iik7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogREJVU19ESVNBQkxFX0NIRUNLUyAqLworCisgIGlmICh3cml0ZXItPmVuYWJsZWQgJiYgIWlzX2FycmF5X2FwcGVuZCkKKyAgICB7CisgICAgICAvKiAzIHBhZCArIDQgYnl0ZXMgZm9yIHRoZSBhcnJheSBsZW5ndGgsIGFuZCA0IGJ5dGVzIHBvc3NpYmxlIHBhZGRpbmcKKyAgICAgICAqIGJlZm9yZSBhcnJheSB2YWx1ZXMKKyAgICAgICAqLworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYWxsb2Nfc3BhY2UgKHN1Yi0+dmFsdWVfc3RyLCAzICsgNCArIDQpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICh3cml0ZXItPnR5cGVfc3RyICE9IE5VTEwpCisgICAgeworICAgICAgc3ViLT50eXBlX3BvcyArPSAxOyAvKiBtb3ZlIHRvIHBvaW50IHRvIHRoZSBlbGVtZW50IHR5cGUsIHNpbmNlIHR5cGVfcG9zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNob3VsZCBiZSB0aGUgZXhwZWN0ZWQgdHlwZSBmb3IgZnVydGhlciB3cml0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBzdWItPnUuYXJyYXkuZWxlbWVudF90eXBlX3BvcyA9IHN1Yi0+dHlwZV9wb3M7CisgICAgfQorCisgIGlmICghd3JpdGVyLT50eXBlX3Bvc19pc19leHBlY3RhdGlvbikKKyAgICB7CisgICAgICAvKiBzdWIgaXMgYSB0b3BsZXZlbC9vdXRlcm1vc3QgYXJyYXkgc28gd2UgbmVlZCB0byB3cml0ZSB0aGUgdHlwZSBkYXRhICovCisKKyAgICAgIC8qIGFsbG9jIHNwYWNlIGZvciBhcnJheSB0eXBlY29kZSwgZWxlbWVudCBzaWduYXR1cmUgKi8KKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FsbG9jX3NwYWNlICh3cml0ZXItPnR5cGVfc3RyLCAxICsgY29udGFpbmVkX3R5cGVfbGVuKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZSAod3JpdGVyLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXItPnR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBpbnNlcnQgYXJyYXkgdHlwZWNvZGUgYWZ0ZXIgcHJlYWxsb2MiKTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9sZW4gKGNvbnRhaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX3N0YXJ0LCBjb250YWluZWRfdHlwZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWItPnUuYXJyYXkuZWxlbWVudF90eXBlX3BvcykpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNob3VsZCBub3QgaGF2ZSBmYWlsZWQgdG8gaW5zZXJ0IGFycmF5IGVsZW1lbnQgdHlwZWNvZGVzIik7CisgICAgfQorCisgIGlmICh3cml0ZXItPnR5cGVfc3RyICE9IE5VTEwpCisgICAgeworICAgICAgLyogSWYgdGhlIHBhcmVudCBpcyBhbiBhcnJheSwgd2UgaG9sZCB0eXBlX3BvcyBwb2ludGluZyBhdCB0aGUgYXJyYXkgZWxlbWVudCB0eXBlOworICAgICAgICogb3RoZXJ3aXNlIGFkdmFuY2UgaXQgdG8gcmVmbGVjdCB0aGUgYXJyYXkgdmFsdWUgd2UganVzdCByZWN1cnNlZCBpbnRvCisgICAgICAgKi8KKyAgICAgIGlmICh3cml0ZXItPmNvbnRhaW5lcl90eXBlICE9IERCVVNfVFlQRV9BUlJBWSkKKyAgICAgICAgd3JpdGVyLT50eXBlX3BvcyArPSAxICsgY29udGFpbmVkX3R5cGVfbGVuOworICAgICAgZWxzZQorICAgICAgICBfZGJ1c19hc3NlcnQgKHdyaXRlci0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb24pOyAvKiBiZWNhdXNlIGl0J3MgYW4gYXJyYXkgKi8KKyAgICB9CisKKyAgaWYgKHdyaXRlci0+ZW5hYmxlZCkKKyAgICB7CisgICAgICAvKiBXcml0ZSAob3IganVtcCBvdmVyLCBpZiBpc19hcnJheV9hcHBlbmQpIHRoZSBsZW5ndGggKi8KKyAgICAgIHN1Yi0+dS5hcnJheS5sZW5fcG9zID0gX0RCVVNfQUxJR05fVkFMVUUgKHN1Yi0+dmFsdWVfcG9zLCA0KTsKKworICAgICAgaWYgKGlzX2FycmF5X2FwcGVuZCkKKyAgICAgICAgeworICAgICAgICAgIHN1Yi0+dmFsdWVfcG9zICs9IDQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWNfbm9fdHlwZWNvZGUgKHN1YiwgREJVU19UWVBFX1VJTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2hvdWxkIG5vdCBoYXZlIGZhaWxlZCB0byBpbnNlcnQgYXJyYXkgbGVuIik7CisgICAgICAgIH0KKworICAgICAgX2RidXNfYXNzZXJ0IChzdWItPnUuYXJyYXkubGVuX3BvcyA9PSBzdWItPnZhbHVlX3BvcyAtIDQpOworCisgICAgICAvKiBXcml0ZSBhbGlnbm1lbnQgcGFkZGluZyBmb3IgYXJyYXkgZWxlbWVudHMKKyAgICAgICAqIE5vdGUgdGhhdCB3ZSB3cml0ZSB0aGUgcGFkZGluZyAqZXZlbiBmb3IgZW1wdHkgYXJyYXlzKgorICAgICAgICogdG8gYXZvaWQgd29ua3kgc3BlY2lhbCBjYXNlcworICAgICAgICovCisgICAgICBhbGlnbm1lbnQgPSBlbGVtZW50X3R5cGVfZ2V0X2FsaWdubWVudCAoY29udGFpbmVkX3R5cGUsIGNvbnRhaW5lZF90eXBlX3N0YXJ0KTsKKworICAgICAgYWxpZ25lZCA9IF9EQlVTX0FMSUdOX1ZBTFVFIChzdWItPnZhbHVlX3BvcywgYWxpZ25tZW50KTsKKyAgICAgIGlmIChhbGlnbmVkICE9IHN1Yi0+dmFsdWVfcG9zKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFpc19hcnJheV9hcHBlbmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luc2VydF9ieXRlcyAoc3ViLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25lZCAtIHN1Yi0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcMCcpKQorICAgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNob3VsZCBub3QgaGF2ZSBmYWlsZWQgdG8gaW5zZXJ0IGFsaWdubWVudCBwYWRkaW5nIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBzdWItPnZhbHVlX3BvcyA9IGFsaWduZWQ7CisgICAgICAgIH0KKworICAgICAgc3ViLT51LmFycmF5LnN0YXJ0X3BvcyA9IHN1Yi0+dmFsdWVfcG9zOworCisgICAgICBpZiAoaXNfYXJyYXlfYXBwZW5kKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c191aW50MzJfdCBsZW47CisKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKF9EQlVTX0FMSUdOX1ZBTFVFIChzdWItPnUuYXJyYXkubGVuX3BvcywgNCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkgc3ViLT51LmFycmF5Lmxlbl9wb3MpOworICAgICAgICAgIGxlbiA9IF9kYnVzX3VucGFja191aW50MzIgKHN1Yi0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChzdWItPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWItPnUuYXJyYXkubGVuX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0KSk7CisKKyAgICAgICAgICBzdWItPnZhbHVlX3BvcyArPSBsZW47CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBub3QgZW5hYmxlZCwgc28gd2Ugd29uJ3Qgd3JpdGUgdGhlIGxlbl9wb3M7IHNldCBpdCB0byAtMSB0byBzbyBpbmRpY2F0ZSAqLworICAgICAgc3ViLT51LmFycmF5Lmxlbl9wb3MgPSAtMTsKKyAgICAgIHN1Yi0+dS5hcnJheS5zdGFydF9wb3MgPSBzdWItPnZhbHVlX3BvczsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChzdWItPnUuYXJyYXkubGVuX3BvcyA8IHN1Yi0+dS5hcnJheS5zdGFydF9wb3MpOworICBfZGJ1c19hc3NlcnQgKGlzX2FycmF5X2FwcGVuZCB8fCBzdWItPnUuYXJyYXkuc3RhcnRfcG9zID09IHN1Yi0+dmFsdWVfcG9zKTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgICAgICBfZGJ1c192ZXJib3NlICgiICB0eXBlIHdyaXRlciAlcCByZWN1cnNlIGFycmF5IGRvbmUgcmVtYWluaW5nIHNpZyAnJXMnIGFycmF5IHN0YXJ0X3BvcyA9ICVkIGxlbl9wb3MgPSAlZCB2YWx1ZV9wb3MgPSAlZFxuIiwgc3ViLAorICAgICAgICAgICAgICAgICAgICAgc3ViLT50eXBlX3N0ciA/CisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChzdWItPnR5cGVfc3RyLCBzdWItPnR5cGVfcG9zLCAwKSA6CisgICAgICAgICAgICAgICAgICAgICAidW5rbm93biIsCisgICAgICAgICAgICAgICAgICAgICBzdWItPnUuYXJyYXkuc3RhcnRfcG9zLCBzdWItPnUuYXJyYXkubGVuX3Bvcywgc3ViLT52YWx1ZV9wb3MpOworI2VuZGlmCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIFZhcmlhbnQgdmFsdWUgd2lsbCBub3JtYWxseSBoYXZlOgorICogICAxIGJ5dGUgc2lnbmF0dXJlIGxlbmd0aCBub3QgaW5jbHVkaW5nIG51bAorICogICBzaWduYXR1cmUgdHlwZWNvZGVzIChudWwgdGVybWluYXRlZCkKKyAqICAgcGFkZGluZyB0byBhbGlnbm1lbnQgb2YgY29udGFpbmVkIHR5cGUKKyAqICAgYm9keSBhY2NvcmRpbmcgdG8gc2lnbmF0dXJlCisgKgorICogVGhlIHNpZ25hdHVyZSBzdHJpbmcgY2FuIG9ubHkgaGF2ZSBhIHNpbmdsZSB0eXBlCisgKiBpbiBpdCBidXQgdGhhdCB0eXBlIG1heSBiZSBjb21wbGV4L3JlY3Vyc2l2ZS4KKyAqCisgKiBTbyBhIHR5cGljYWwgdmFyaWFudCB0eXBlIHdpdGggdGhlIGludGVnZXIgMyB3aWxsIGhhdmUgdGhlc2UKKyAqIG9jdGV0czoKKyAqICAgMHgxICdpJyAnXDAnIFsxIGJ5dGUgcGFkZGluZyB0byBhbGlnbm1lbnQgYm91bmRhcnldIDB4MCAweDAgMHgwIDB4MworICoKKyAqIFRoZSBtYWluIHdvcmxkIG9mIGh1cnQgZm9yIHdyaXRpbmcgb3V0IGEgdmFyaWFudCBpcyB0aGF0IHRoZSB0eXBlCisgKiBzdHJpbmcgaXMgdGhlIHNhbWUgc3RyaW5nIGFzIHRoZSB2YWx1ZSBzdHJpbmcuIFdoaWNoIG1lYW5zCisgKiBpbnNlcnRpbmcgdG8gdGhlIHR5cGUgc3RyaW5nIHdpbGwgbW92ZSB0aGUgdmFsdWVfcG9zOyBhbmQgaXQgbWVhbnMKKyAqIHRoYXQgaW5zZXJ0aW5nIHRvIHRoZSB0eXBlIHN0cmluZyBjb3VsZCBicmVhayB0eXBlIGFsaWdubWVudC4KKyAqLworc3RhdGljIGRidXNfYm9vbF90Cit3cml0ZXJfcmVjdXJzZV92YXJpYW50IChEQnVzVHlwZVdyaXRlciAgICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpjb250YWluZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgICAqc3ViKQoreworICBpbnQgY29udGFpbmVkX2FsaWdubWVudDsKKyAgCisgIGlmICh3cml0ZXItPmVuYWJsZWQpCisgICAgeworICAgICAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSB3b3JzdCBjYXNlLCB3aGljaCBpcyAxIGJ5dGUgc2lnCisgICAgICAgKiBsZW5ndGgsIG51bCBieXRlIGF0IGVuZCBvZiBzaWcsIGFuZCA3IGJ5dGVzIHBhZGRpbmcgdG8KKyAgICAgICAqIDgtYm91bmRhcnkuCisgICAgICAgKi8KKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FsbG9jX3NwYWNlIChzdWItPnZhbHVlX3N0ciwgY29udGFpbmVkX3R5cGVfbGVuICsgOSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogd3JpdGUgVkFSSUFOVCB0eXBlY29kZSB0byB0aGUgcGFyZW50J3MgdHlwZSBzdHJpbmcgKi8KKyAgaWYgKCF3cml0ZV9vcl92ZXJpZnlfdHlwZWNvZGUgKHdyaXRlciwgREJVU19UWVBFX1ZBUklBTlQpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBJZiBub3QgZW5hYmxlZCwgbWFyayB0aGF0IHdlIGhhdmUgbm8gdHlwZV9zdHIgYW55bW9yZSAuLi4gKi8KKworICBpZiAoIXdyaXRlci0+ZW5hYmxlZCkKKyAgICB7CisgICAgICBzdWItPnR5cGVfc3RyID0gTlVMTDsKKyAgICAgIHN1Yi0+dHlwZV9wb3MgPSAtMTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIC8qIElmIHdlJ3JlIGVuYWJsZWQgdGhlbiBjb250aW51ZSAuLi4gKi8KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZSAoc3ViLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX2xlbikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2hvdWxkIG5vdCBoYXZlIGZhaWxlZCB0byBpbnNlcnQgdmFyaWFudCB0eXBlIHNpZyBsZW4iKTsKKworICBzdWItPnZhbHVlX3BvcyArPSAxOworCisgIC8qIEhlcmUgd2Ugc3dpdGNoIG92ZXIgdG8gdGhlIGV4cGVjdGVkIHR5cGUgc2lnIHdlJ3JlIGFib3V0IHRvIHdyaXRlICovCisgIHN1Yi0+dHlwZV9zdHIgPSBzdWItPnZhbHVlX3N0cjsKKyAgc3ViLT50eXBlX3BvcyA9IHN1Yi0+dmFsdWVfcG9zOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuIChjb250YWluZWRfdHlwZSwgY29udGFpbmVkX3R5cGVfc3RhcnQsIGNvbnRhaW5lZF90eXBlX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yi0+dmFsdWVfc3RyLCBzdWItPnZhbHVlX3BvcykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2hvdWxkIG5vdCBoYXZlIGZhaWxlZCB0byBpbnNlcnQgdmFyaWFudCB0eXBlIHNpZyIpOworCisgIHN1Yi0+dmFsdWVfcG9zICs9IGNvbnRhaW5lZF90eXBlX2xlbjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZSAoc3ViLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzaG91bGQgbm90IGhhdmUgZmFpbGVkIHRvIGluc2VydCB2YXJpYW50IHR5cGUgbnVsIHRlcm1pbmF0aW9uIik7CisKKyAgc3ViLT52YWx1ZV9wb3MgKz0gMTsKKworICBjb250YWluZWRfYWxpZ25tZW50ID0gX2RidXNfdHlwZV9nZXRfYWxpZ25tZW50IChfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZSAoY29udGFpbmVkX3R5cGUsIGNvbnRhaW5lZF90eXBlX3N0YXJ0KSk7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZXMgKHN1Yi0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yi0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX0FMSUdOX1ZBTFVFIChzdWItPnZhbHVlX3BvcywgY29udGFpbmVkX2FsaWdubWVudCkgLSBzdWItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXDAnKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzaG91bGQgbm90IGhhdmUgZmFpbGVkIHRvIGluc2VydCBhbGlnbm1lbnQgcGFkZGluZyBmb3IgdmFyaWFudCBib2R5Iik7CisgIHN1Yi0+dmFsdWVfcG9zID0gX0RCVVNfQUxJR05fVkFMVUUgKHN1Yi0+dmFsdWVfcG9zLCBjb250YWluZWRfYWxpZ25tZW50KTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c190eXBlX3dyaXRlcl9yZWN1cnNlX2NvbnRhaW5lZF9sZW4gKERCdXNUeXBlV3JpdGVyICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgY29udGFpbmVyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmNvbnRhaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAgICpzdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGlzX2FycmF5X2FwcGVuZCkKK3sKKyAgd3JpdGVyX3JlY3Vyc2VfaW5pdF9hbmRfY2hlY2sgKHdyaXRlciwgY29udGFpbmVyX3R5cGUsIHN1Yik7CisKKyAgc3dpdGNoIChjb250YWluZXJfdHlwZSkKKyAgICB7CisgICAgY2FzZSBEQlVTX1RZUEVfU1RSVUNUOgorICAgICAgcmV0dXJuIHdyaXRlcl9yZWN1cnNlX3N0cnVjdF9vcl9kaWN0X2VudHJ5ICh3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU1RSVUNUX0JFR0lOX0NIQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZV9zdGFydCwgY29udGFpbmVkX3R5cGVfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfRElDVF9FTlRSWToKKyAgICAgIHJldHVybiB3cml0ZXJfcmVjdXJzZV9zdHJ1Y3Rfb3JfZGljdF9lbnRyeSAod3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX3N0YXJ0LCBjb250YWluZWRfdHlwZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yik7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9BUlJBWToKKyAgICAgIHJldHVybiB3cml0ZXJfcmVjdXJzZV9hcnJheSAod3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZSwgY29udGFpbmVkX3R5cGVfc3RhcnQsIGNvbnRhaW5lZF90eXBlX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLCBpc19hcnJheV9hcHBlbmQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfVkFSSUFOVDoKKyAgICAgIHJldHVybiB3cml0ZXJfcmVjdXJzZV92YXJpYW50ICh3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGUsIGNvbnRhaW5lZF90eXBlX3N0YXJ0LCBjb250YWluZWRfdHlwZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ0cmllZCB0byByZWN1cnNlIGludG8gdHlwZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCB0aGF0Iik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qKgorICogT3BlbnMgYSBuZXcgY29udGFpbmVyIGFuZCB3cml0ZXMgb3V0IHRoZSBpbml0aWFsIGluZm9ybWF0aW9uIGZvciB0aGF0IGNvbnRhaW5lci4KKyAqCisgKiBAcGFyYW0gd3JpdGVyIHRoZSB3cml0ZXIKKyAqIEBwYXJhbSBjb250YWluZXJfdHlwZSB0aGUgdHlwZSBvZiB0aGUgY29udGFpbmVyIHRvIG9wZW4KKyAqIEBwYXJhbSBjb250YWluZWRfdHlwZSB0aGUgYXJyYXkgZWxlbWVudCB0eXBlIG9yIHZhcmlhbnQgY29udGVudCB0eXBlCisgKiBAcGFyYW0gY29udGFpbmVkX3R5cGVfc3RhcnQgcG9zaXRpb24gdG8gbG9vayBmb3IgdGhlIHR5cGUKKyAqIEBwYXJhbSBzdWIgdGhlIG5ldyBzdWItd3JpdGVyIHRvIHdyaXRlIGNvbnRhaW5lciBjb250ZW50cworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZSAoREJ1c1R5cGVXcml0ZXIgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgY29udGFpbmVyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpjb250YWluZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgICAqc3ViKQoreworICBpbnQgY29udGFpbmVkX3R5cGVfbGVuOworCisgIGlmIChjb250YWluZWRfdHlwZSkKKyAgICBjb250YWluZWRfdHlwZV9sZW4gPSBmaW5kX2xlbl9vZl9jb21wbGV0ZV90eXBlIChjb250YWluZWRfdHlwZSwgY29udGFpbmVkX3R5cGVfc3RhcnQpOworICBlbHNlCisgICAgY29udGFpbmVkX3R5cGVfbGVuID0gMDsKKworICByZXR1cm4gX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZV9jb250YWluZWRfbGVuICh3cml0ZXIsIGNvbnRhaW5lcl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7Cit9CisKKy8qKgorICogQXBwZW5kIHRvIGFuIGV4aXN0aW5nIGFycmF5LiBFc3NlbnRpYWxseSwgdGhlIHdyaXRlciB3aWxsIHJlYWQgYW4KKyAqIGV4aXN0aW5nIGxlbmd0aCBhdCB0aGUgd3JpdGUgbG9jYXRpb247IGp1bXAgb3ZlciB0aGF0IGxlbmd0aDsgYW5kCisgKiB3cml0ZSBuZXcgZmllbGRzLiBPbiB1bnJlY3Vyc2UoKSwgdGhlIGV4aXN0aW5nIGxlbmd0aCB3aWxsIGJlCisgKiB1cGRhdGVkLgorICoKKyAqIEBwYXJhbSB3cml0ZXIgdGhlIHdyaXRlcgorICogQHBhcmFtIGNvbnRhaW5lZF90eXBlIGVsZW1lbnQgdHlwZQorICogQHBhcmFtIGNvbnRhaW5lZF90eXBlX3N0YXJ0IHBvc2l0aW9uIG9mIGVsZW1lbnQgdHlwZQorICogQHBhcmFtIHN1YiB0aGUgc3Vid3JpdGVyIHRvIGluaXQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3R5cGVfd3JpdGVyX2FwcGVuZF9hcnJheSAoREJ1c1R5cGVXcml0ZXIgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpjb250YWluZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICAgKnN1YikKK3sKKyAgaW50IGNvbnRhaW5lZF90eXBlX2xlbjsKKworICBpZiAoY29udGFpbmVkX3R5cGUpCisgICAgY29udGFpbmVkX3R5cGVfbGVuID0gZmluZF9sZW5fb2ZfY29tcGxldGVfdHlwZSAoY29udGFpbmVkX3R5cGUsIGNvbnRhaW5lZF90eXBlX3N0YXJ0KTsKKyAgZWxzZQorICAgIGNvbnRhaW5lZF90eXBlX2xlbiA9IDA7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfd3JpdGVyX3JlY3Vyc2VfY29udGFpbmVkX2xlbiAod3JpdGVyLCBEQlVTX1RZUEVfQVJSQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpOworfQorCitzdGF0aWMgaW50Cit3cml0ZXJfZ2V0X2FycmF5X2xlbiAoREJ1c1R5cGVXcml0ZXIgKndyaXRlcikKK3sKKyAgX2RidXNfYXNzZXJ0ICh3cml0ZXItPmNvbnRhaW5lcl90eXBlID09IERCVVNfVFlQRV9BUlJBWSk7CisgIHJldHVybiB3cml0ZXItPnZhbHVlX3BvcyAtIHdyaXRlci0+dS5hcnJheS5zdGFydF9wb3M7Cit9CisKKy8qKgorICogQ2xvc2VzIGEgY29udGFpbmVyIGNyZWF0ZWQgYnkgX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZSgpCisgKiBhbmQgd3JpdGVzIGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIHRoZSB2YWx1ZXMgYmxvY2suCisgKgorICogQHBhcmFtIHdyaXRlciB0aGUgd3JpdGVyCisgKiBAcGFyYW0gc3ViIHRoZSBzdWItd3JpdGVyIGNyZWF0ZWQgYnkgX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZSgpCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190eXBlX3dyaXRlcl91bnJlY3Vyc2UgKERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICpzdWIpCit7CisgIC8qIHR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uIG5ldmVyIGdldHMgdW5zZXQgb25jZSBzZXQsIG9yIHdlJ2QgZ2V0IGFsbCBob3NlZCAqLworICBfZGJ1c19hc3NlcnQgKCF3cml0ZXItPnR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uIHx8CisgICAgICAgICAgICAgICAgKHdyaXRlci0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb24gJiYgc3ViLT50eXBlX3Bvc19pc19leHBlY3RhdGlvbikpOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgdHlwZSB3cml0ZXIgJXAgdW5yZWN1cnNlIHR5cGVfcG9zID0gJWQgdmFsdWVfcG9zID0gJWQgaXNfZXhwZWN0YXRpb24gPSAlZCBjb250YWluZXJfdHlwZSA9ICVzXG4iLAorICAgICAgICAgICAgICAgICB3cml0ZXIsIHdyaXRlci0+dHlwZV9wb3MsIHdyaXRlci0+dmFsdWVfcG9zLCB3cml0ZXItPnR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uLAorICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAod3JpdGVyLT5jb250YWluZXJfdHlwZSkpOworICBfZGJ1c192ZXJib3NlICgiICB0eXBlIHdyaXRlciAlcCB1bnJlY3Vyc2Ugc3ViIHR5cGVfcG9zID0gJWQgdmFsdWVfcG9zID0gJWQgaXNfZXhwZWN0YXRpb24gPSAlZCBjb250YWluZXJfdHlwZSA9ICVzXG4iLAorICAgICAgICAgICAgICAgICBzdWIsIHN1Yi0+dHlwZV9wb3MsIHN1Yi0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICBzdWItPnR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uLAorICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAoc3ViLT5jb250YWluZXJfdHlwZSkpOworI2VuZGlmCisKKyAgaWYgKHN1Yi0+Y29udGFpbmVyX3R5cGUgPT0gREJVU19UWVBFX1NUUlVDVCkKKyAgICB7CisgICAgICBpZiAoIXdyaXRlX29yX3ZlcmlmeV90eXBlY29kZSAoc3ViLCBEQlVTX1NUUlVDVF9FTkRfQ0hBUikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UgaWYgKHN1Yi0+Y29udGFpbmVyX3R5cGUgPT0gREJVU19UWVBFX0RJQ1RfRU5UUlkpCisgICAgeworICAgICAgaWYgKCF3cml0ZV9vcl92ZXJpZnlfdHlwZWNvZGUgKHN1YiwgREJVU19ESUNUX0VOVFJZX0VORF9DSEFSKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZSBpZiAoc3ViLT5jb250YWluZXJfdHlwZSA9PSBEQlVTX1RZUEVfQVJSQVkpCisgICAgeworICAgICAgaWYgKHN1Yi0+dS5hcnJheS5sZW5fcG9zID49IDApIC8qIGxlbl9wb3MgPT0gLTEgaWYgd2Ugd2VyZW4ndCBlbmFibGVkIHdoZW4gd2UgcGFzc2VkIGl0ICovCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3VpbnQzMl90IGxlbjsKKworICAgICAgICAgIC8qIFNldCB0aGUgYXJyYXkgbGVuZ3RoICovCisgICAgICAgICAgbGVuID0gd3JpdGVyX2dldF9hcnJheV9sZW4gKHN1Yik7CisgICAgICAgICAgX2RidXNfbWFyc2hhbF9zZXRfdWludDMyIChzdWItPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yi0+dS5hcnJheS5sZW5fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLT5ieXRlX29yZGVyKTsKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgICAgZmlsbGVkIGluIHN1YiBhcnJheSBsZW4gdG8gJXUgYXQgbGVuX3BvcyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIHN1Yi0+dS5hcnJheS5sZW5fcG9zKTsKKyNlbmRpZgorICAgICAgICB9CisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgICAgbm90IGZpbGxpbmcgaW4gc3ViIGFycmF5IGxlbiBiZWNhdXNlIHdlIHdlcmUgZGlzYWJsZWQgd2hlbiB3ZSBwYXNzZWQgdGhlIGxlblxuIik7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAvKiBOb3cgZ2V0IHR5cGVfcG9zIHJpZ2h0IGZvciB0aGUgcGFyZW50IHdyaXRlci4gSGVyZSBhcmUgdGhlIGNhc2VzOgorICAgKgorICAgKiBDYXNlcyAhd3JpdGVyLT50eXBlX3Bvc19pc19leHBlY3RhdGlvbjoKKyAgICogICAoaW4gdGhlc2UgY2FzZXMgd2Ugd2FudCB0byB1cGRhdGUgdG8gdGhlIG5ldyBpbnNlcnRpb24gcG9pbnQpCisgICAqCisgICAqIC0gaWYgd2UgcmVjdXJzZWQgaW50byBhIFNUUlVDVCB0aGVuIHdlIGRpZG4ndCBrbm93IGluIGFkdmFuY2UKKyAgICogICB3aGF0IHRoZSB0eXBlcyBpbiB0aGUgc3RydWN0IHdvdWxkIGJlOyBzbyB3ZSBoYXZlIHRvIGZpbGwgaW4KKyAgICogICB0aGF0IGluZm9ybWF0aW9uIG5vdy4KKyAgICogICAgICAgd3JpdGVyLT50eXBlX3BvcyA9IHN1Yi0+dHlwZV9wb3MKKyAgICoKKyAgICogLSBpZiB3ZSByZWN1cnNlZCBpbnRvIGFueXRoaW5nIGVsc2UsIHdlIGtuZXcgdGhlIGZ1bGwgYXJyYXkKKyAgICogICB0eXBlLCBvciBrbmV3IHRoZSBzaW5nbGUgdHlwZWNvZGUgbWFya2luZyBWQVJJQU5ULCBzbworICAgKiAgIHdyaXRlci0+dHlwZV9wb3MgaXMgYWxyZWFkeSBjb3JyZWN0LgorICAgKiAgICAgICB3cml0ZXItPnR5cGVfcG9zIHNob3VsZCByZW1haW4gYXMtaXMKKyAgICoKKyAgICogLSBub3RlIHRoYXQgdGhlIHBhcmVudCBpcyBuZXZlciBhbiBBUlJBWSBvciBWQVJJQU5ULCBpZiBpdCB3ZXJlCisgICAqICAgdGhlbiB0eXBlX3Bvc19pc19leHBlY3RhdGlvbiB3b3VsZCBiZSBUUlVFLiBUaGUgcGFyZW50CisgICAqICAgaXMgdGh1cyBrbm93biB0byBiZSBhIHRvcGxldmVsIG9yIFNUUlVDVC4KKyAgICoKKyAgICogQ2FzZXMgd2hlcmUgd3JpdGVyLT50eXBlX3Bvc19pc19leHBlY3RhdGlvbjoKKyAgICogICAoaW4gdGhlc2UgY2FzZXMgd2Ugd2FudCB0byB1cGRhdGUgdG8gbmV4dCBleHBlY3RlZCB0eXBlIHRvIHdyaXRlKQorICAgKgorICAgKiAtIHdlIHJlY3Vyc2VkIGZyb20gU1RSVUNUIGludG8gU1RSVUNUIGFuZCB3ZSBkaWRuJ3QgaW5jcmVtZW50CisgICAqICAgdHlwZV9wb3MgaW4gdGhlIHBhcmVudCBqdXN0IHRvIHN0YXkgY29uc2lzdGVudCB3aXRoIHRoZQorICAgKiAgICF3cml0ZXItPnR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uIGNhc2UgKHRob3VnaCB3ZSBjb3VsZAorICAgKiAgIHNwZWNpYWwtY2FzZSB0aGlzIGluIHJlY3Vyc2Vfc3RydWN0IGluc3RlYWQgaWYgd2Ugd2FudGVkKQorICAgKiAgICAgICB3cml0ZXItPnR5cGVfcG9zID0gc3ViLT50eXBlX3BvcworICAgKgorICAgKiAtIHdlIHJlY3Vyc2VkIGZyb20gU1RSVUNUIGludG8gQVJSQVkgb3IgVkFSSUFOVCBhbmQgdHlwZV9wb3MKKyAgICogICBmb3IgcGFyZW50IHNob3VsZCBoYXZlIGJlZW4gaW5jcmVtZW50ZWQgYWxyZWFkeQorICAgKiAgICAgICB3cml0ZXItPnR5cGVfcG9zIHNob3VsZCByZW1haW4gYXMtaXMKKyAgICoKKyAgICogLSB3ZSByZWN1cnNlZCBmcm9tIEFSUkFZIGludG8gYSBzdWItZWxlbWVudCwgc28gdHlwZV9wb3MgaW4gdGhlCisgICAqICAgcGFyZW50IGlzIHRoZSBlbGVtZW50IHR5cGUgYW5kIHNob3VsZCByZW1haW4gdGhlIGVsZW1lbnQgdHlwZQorICAgKiAgIGZvciB0aGUgYmVuZWZpdCBvZiB0aGUgbmV4dCBjaGlsZCBlbGVtZW50CisgICAqICAgICAgIHdyaXRlci0+dHlwZV9wb3Mgc2hvdWxkIHJlbWFpbiBhcy1pcworICAgKgorICAgKiAtIHdlIHJlY3Vyc2VkIGZyb20gVkFSSUFOVCBpbnRvIGl0cyB2YWx1ZSwgc28gdHlwZV9wb3MgaW4gdGhlCisgICAqICAgcGFyZW50IG1ha2VzIG5vIGRpZmZlcmVuY2Ugc2luY2UgdGhlcmUncyBvbmx5IG9uZSB2YWx1ZQorICAgKiAgIGFuZCB3ZSBqdXN0IGZpbmlzaGVkIHdyaXRpbmcgaXQgYW5kIHdvbid0IHVzZSB0eXBlX3BvcyBhZ2FpbgorICAgKiAgICAgICB3cml0ZXItPnR5cGVfcG9zIHNob3VsZCByZW1haW4gYXMtaXMKKyAgICoKKyAgICoKKyAgICogRm9yIGFsbCB0aGVzZSwgRElDVF9FTlRSWSBpcyB0aGUgc2FtZSBhcyBTVFJVQ1QKKyAgICovCisgIGlmICh3cml0ZXItPnR5cGVfc3RyICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKChzdWItPmNvbnRhaW5lcl90eXBlID09IERCVVNfVFlQRV9TVFJVQ1QgfHwKKyAgICAgICAgICAgc3ViLT5jb250YWluZXJfdHlwZSA9PSBEQlVTX1RZUEVfRElDVF9FTlRSWSkgJiYKKyAgICAgICAgICAod3JpdGVyLT5jb250YWluZXJfdHlwZSA9PSBEQlVTX1RZUEVfU1RSVUNUIHx8CisgICAgICAgICAgIHdyaXRlci0+Y29udGFpbmVyX3R5cGUgPT0gREJVU19UWVBFX0RJQ1RfRU5UUlkgfHwKKyAgICAgICAgICAgd3JpdGVyLT5jb250YWluZXJfdHlwZSA9PSBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBBZHZhbmNlIHRoZSBwYXJlbnQgdG8gdGhlIG5leHQgc3RydWN0IGZpZWxkICovCisgICAgICAgICAgd3JpdGVyLT50eXBlX3BvcyA9IHN1Yi0+dHlwZV9wb3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgd3JpdGVyLT52YWx1ZV9wb3MgPSBzdWItPnZhbHVlX3BvczsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCIgIHR5cGUgd3JpdGVyICVwIHVucmVjdXJzZWQgdHlwZV9wb3MgPSAlZCB2YWx1ZV9wb3MgPSAlZCByZW1haW5pbmcgc2lnICclcydcbiIsCisgICAgICAgICAgICAgICAgIHdyaXRlciwgd3JpdGVyLT50eXBlX3Bvcywgd3JpdGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgIHdyaXRlci0+dHlwZV9zdHIgPworICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuICh3cml0ZXItPnR5cGVfc3RyLCB3cml0ZXItPnR5cGVfcG9zLCAwKSA6CisgICAgICAgICAgICAgICAgICJ1bmtub3duIik7CisjZW5kaWYKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBXcml0ZXMgb3V0IGEgYmFzaWMgdHlwZS4KKyAqCisgKiBAcGFyYW0gd3JpdGVyIHRoZSB3cml0ZXIKKyAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIHRvIHdyaXRlCisgKiBAcGFyYW0gdmFsdWUgdGhlIGFkZHJlc3Mgb2YgdGhlIHZhbHVlIHRvIHdyaXRlCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAoREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAqdmFsdWUpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICAvKiBGaXJzdCBlbnN1cmUgdGhhdCBvdXIgdHlwZSByZWFsbG9jIHdpbGwgc3VjY2VlZCAqLworICBpZiAoIXdyaXRlci0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb24gJiYgd3JpdGVyLT50eXBlX3N0ciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FsbG9jX3NwYWNlICh3cml0ZXItPnR5cGVfc3RyLCAxKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR2YWwgPSBGQUxTRTsKKworICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2Jhc2ljX25vX3R5cGVjb2RlICh3cml0ZXIsIHR5cGUsIHZhbHVlKSkKKyAgICBnb3RvIG91dDsKKworICBpZiAoIXdyaXRlX29yX3ZlcmlmeV90eXBlY29kZSAod3JpdGVyLCB0eXBlKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gd3JpdGUgdHlwZWNvZGUgYWZ0ZXIgcHJlYWxsb2MiKTsKKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCIgIHR5cGUgd3JpdGVyICVwIGJhc2ljIHR5cGVfcG9zID0gJWQgdmFsdWVfcG9zID0gJWQgaXNfZXhwZWN0YXRpb24gPSAlZCBlbmFibGVkID0gJWRcbiIsCisgICAgICAgICAgICAgICAgIHdyaXRlciwgd3JpdGVyLT50eXBlX3Bvcywgd3JpdGVyLT52YWx1ZV9wb3MsIHdyaXRlci0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb24sCisgICAgICAgICAgICAgICAgIHdyaXRlci0+ZW5hYmxlZCk7CisjZW5kaWYKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFdyaXRlcyBhIGJsb2NrIG9mIGZpeGVkLWxlbmd0aCBiYXNpYyB2YWx1ZXMsIGkuZS4gdGhvc2UgdGhhdCBhcmUKKyAqIGJvdGggZGJ1c190eXBlX2lzX2ZpeGVkKCkgYW5kIF9kYnVzX3R5cGVfaXNfYmFzaWMoKS4gVGhlIGJsb2NrCisgKiBtdXN0IGJlIHdyaXR0ZW4gaW5zaWRlIGFuIGFycmF5LgorICoKKyAqIFRoZSB2YWx1ZSBwYXJhbWV0ZXIgc2hvdWxkIGJlIHRoZSBhZGRyZXNzIG9mIHNhaWQgYXJyYXkgb2YgdmFsdWVzLAorICogc28gZS5nLiBpZiBpdCdzIGFuIGFycmF5IG9mIGRvdWJsZSwgcGFzcyBpbiAiY29uc3QgZG91YmxlKioiCisgKgorICogQHBhcmFtIHdyaXRlciB0aGUgd3JpdGVyCisgKiBAcGFyYW0gZWxlbWVudF90eXBlIHR5cGUgb2Ygc3R1ZmYgaW4gdGhlIGFycmF5CisgKiBAcGFyYW0gdmFsdWUgYWRkcmVzcyBvZiB0aGUgYXJyYXkKKyAqIEBwYXJhbSBuX2VsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2ZpeGVkX211bHRpIChEQnVzVHlwZVdyaXRlciAgICAgICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgbl9lbGVtZW50cykKK3sKKyAgX2RidXNfYXNzZXJ0ICh3cml0ZXItPmNvbnRhaW5lcl90eXBlID09IERCVVNfVFlQRV9BUlJBWSk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c190eXBlX2lzX2ZpeGVkIChlbGVtZW50X3R5cGUpKTsKKyAgX2RidXNfYXNzZXJ0ICh3cml0ZXItPnR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChuX2VsZW1lbnRzID49IDApOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgdHlwZSB3cml0ZXIgJXAgZW50ZXJpbmcgZml4ZWQgbXVsdGkgdHlwZV9wb3MgPSAlZCB2YWx1ZV9wb3MgPSAlZCBuX2VsZW1lbnRzICVkXG4iLAorICAgICAgICAgICAgICAgICB3cml0ZXIsIHdyaXRlci0+dHlwZV9wb3MsIHdyaXRlci0+dmFsdWVfcG9zLCBuX2VsZW1lbnRzKTsKKyNlbmRpZgorCisgIGlmICghd3JpdGVfb3JfdmVyaWZ5X3R5cGVjb2RlICh3cml0ZXIsIGVsZW1lbnRfdHlwZSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiT09NIHNob3VsZCBub3QgaGFwcGVuIGlmIG9ubHkgdmVyaWZ5aW5nIHR5cGVjb2RlIik7CisKKyAgaWYgKHdyaXRlci0+ZW5hYmxlZCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX21hcnNoYWxfd3JpdGVfZml4ZWRfbXVsdGkgKHdyaXRlci0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9lbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd3JpdGVyLT52YWx1ZV9wb3MpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgdHlwZSB3cml0ZXIgJXAgZml4ZWQgbXVsdGkgd3JpdHRlbiBuZXcgdHlwZV9wb3MgPSAlZCBuZXcgdmFsdWVfcG9zID0gJWQgbl9lbGVtZW50cyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgd3JpdGVyLCB3cml0ZXItPnR5cGVfcG9zLCB3cml0ZXItPnZhbHVlX3Bvcywgbl9lbGVtZW50cyk7CisjZW5kaWYKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2VuYWJsZV9pZl9hZnRlciAoREJ1c1R5cGVXcml0ZXIgICAgICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgICAgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1R5cGVSZWFkZXIgKnN0YXJ0X2FmdGVyKQoreworICBpZiAoc3RhcnRfYWZ0ZXIpCisgICAgeworICAgICAgaWYgKCF3cml0ZXItPmVuYWJsZWQgJiYgX2RidXNfdHlwZV9yZWFkZXJfZ3JlYXRlcl90aGFuIChyZWFkZXIsIHN0YXJ0X2FmdGVyKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3R5cGVfd3JpdGVyX3NldF9lbmFibGVkICh3cml0ZXIsIFRSVUUpOworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkVOQUJMSU5HIHdyaXRlciAlcCBhdCAlZCBiZWNhdXNlIHJlYWRlciBhdCB2YWx1ZV9wb3MgJWQgaXMgYWZ0ZXIgcmVhZGVyIGF0IHZhbHVlX3BvcyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIsIHdyaXRlci0+dmFsdWVfcG9zLCByZWFkZXItPnZhbHVlX3Bvcywgc3RhcnRfYWZ0ZXItPnZhbHVlX3Bvcyk7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICBfZGJ1c19hc3NlcnQgKCghd3JpdGVyLT5lbmFibGVkICYmICFfZGJ1c190eXBlX3JlYWRlcl9ncmVhdGVyX3RoYW4gKHJlYWRlciwgc3RhcnRfYWZ0ZXIpKSB8fAorICAgICAgICAgICAgICAgICAgICAod3JpdGVyLT5lbmFibGVkICYmIF9kYnVzX3R5cGVfcmVhZGVyX2dyZWF0ZXJfdGhhbiAocmVhZGVyLCBzdGFydF9hZnRlcikpKTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYXBwZW5kX2ZpeHVwIChEQnVzTGlzdCAgICAgICAgICAgICAgICoqZml4dXBzLAorICAgICAgICAgICAgICBjb25zdCBEQnVzQXJyYXlMZW5GaXh1cCAqZml4dXApCit7CisgIERCdXNBcnJheUxlbkZpeHVwICpmOworCisgIGYgPSBkYnVzX25ldyAoREJ1c0FycmF5TGVuRml4dXAsIDEpOworICBpZiAoZiA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICAqZiA9ICpmaXh1cDsKKworICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kIChmaXh1cHMsIGYpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAoZik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoZi0+bGVuX3Bvc19pbl9yZWFkZXIgPT0gZml4dXAtPmxlbl9wb3NfaW5fcmVhZGVyKTsKKyAgX2RidXNfYXNzZXJ0IChmLT5uZXdfbGVuID09IGZpeHVwLT5uZXdfbGVuKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogVGhpcyBsb29wIGlzIHRyaXZpYWwgaWYgeW91IGlnbm9yZSBhbGwgdGhlIHN0YXJ0X2FmdGVyIG5vbnNlbnNlLAorICogc28gaWYgeW91J3JlIHRyeWluZyB0byBmaWd1cmUgaXQgb3V0LCBzdGFydCBieSBpZ25vcmluZyB0aGF0CisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAord3JpdGVyX3dyaXRlX3JlYWRlcl9oZWxwZXIgKERCdXNUeXBlV3JpdGVyICAgICAgICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgICAgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzVHlwZVJlYWRlciAqc3RhcnRfYWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIHN0YXJ0X2FmdGVyX25ld19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIHN0YXJ0X2FmdGVyX25ld19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgICAgICAqKmZpeHVwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgaW5zaWRlX3N0YXJ0X2FmdGVyKQoreworICBpbnQgY3VycmVudF90eXBlOworCisgIHdoaWxlICgoY3VycmVudF90eXBlID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAocmVhZGVyKSkgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgeworICAgICAgaWYgKGRidXNfdHlwZV9pc19jb250YWluZXIgKGN1cnJlbnRfdHlwZSkpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzVHlwZVJlYWRlciBzdWJyZWFkZXI7CisgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgc3Vid3JpdGVyOworICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnNpZ19zdHI7CisgICAgICAgICAgaW50IHNpZ19zdGFydDsKKyAgICAgICAgICBpbnQgc2lnX2xlbjsKKyAgICAgICAgICBkYnVzX2Jvb2xfdCBlbmFibGVkX2F0X3JlY3Vyc2U7CisgICAgICAgICAgZGJ1c19ib29sX3QgcGFzdF9zdGFydF9hZnRlcjsKKyAgICAgICAgICBpbnQgcmVhZGVyX2FycmF5X2xlbl9wb3M7CisgICAgICAgICAgaW50IHJlYWRlcl9hcnJheV9zdGFydF9wb3M7CisgICAgICAgICAgZGJ1c19ib29sX3QgdGhpc19pc19zdGFydF9hZnRlcjsKKworICAgICAgICAgIC8qIHR5cGVfcG9zIGlzIGNoZWNrZWQgc2luY2UgZS5nLiBpbiBhIHN0cnVjdCB0aGUgc3RydWN0CisgICAgICAgICAgICogYW5kIGl0cyBmaXJzdCBmaWVsZCBoYXZlIHRoZSBzYW1lIHZhbHVlX3Bvcy4KKyAgICAgICAgICAgKiB0eXBlX3N0ciB3aWxsIGRpZmZlciBpbiByZWFkZXIvc3RhcnRfYWZ0ZXIgZm9yIHZhcmlhbnRzCisgICAgICAgICAgICogd2hlcmUgdHlwZV9zdHIgaXMgaW5zaWRlIHRoZSB2YWx1ZV9zdHIKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoIWluc2lkZV9zdGFydF9hZnRlciAmJiBzdGFydF9hZnRlciAmJgorICAgICAgICAgICAgICByZWFkZXItPnZhbHVlX3BvcyA9PSBzdGFydF9hZnRlci0+dmFsdWVfcG9zICYmCisgICAgICAgICAgICAgIHJlYWRlci0+dHlwZV9zdHIgPT0gc3RhcnRfYWZ0ZXItPnR5cGVfc3RyICYmCisgICAgICAgICAgICAgIHJlYWRlci0+dHlwZV9wb3MgPT0gc3RhcnRfYWZ0ZXItPnR5cGVfcG9zKQorICAgICAgICAgICAgdGhpc19pc19zdGFydF9hZnRlciA9IFRSVUU7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhpc19pc19zdGFydF9hZnRlciA9IEZBTFNFOworCisgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAocmVhZGVyLCAmc3VicmVhZGVyKTsKKworICAgICAgICAgIGlmIChjdXJyZW50X3R5cGUgPT0gREJVU19UWVBFX0FSUkFZKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZWFkZXJfYXJyYXlfbGVuX3BvcyA9IEFSUkFZX1JFQURFUl9MRU5fUE9TICgmc3VicmVhZGVyKTsKKyAgICAgICAgICAgICAgcmVhZGVyX2FycmF5X3N0YXJ0X3BvcyA9IHN1YnJlYWRlci51LmFycmF5LnN0YXJ0X3BvczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIHF1aWV0IGdjYyAqLworICAgICAgICAgICAgICByZWFkZXJfYXJyYXlfbGVuX3BvcyA9IC0xOworICAgICAgICAgICAgICByZWFkZXJfYXJyYXlfc3RhcnRfcG9zID0gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9nZXRfc2lnbmF0dXJlICgmc3VicmVhZGVyLCAmc2lnX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2lnX3N0YXJ0LCAmc2lnX2xlbik7CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJhYm91dCB0byByZWN1cnNlIGludG8gJXMgcmVhZGVyIGF0ICVkIHN1YnJlYWRlciBhdCAlZCB3cml0ZXIgYXQgJWQgc3RhcnRfYWZ0ZXIgcmVhZGVyIGF0ICVkIHdyaXRlIHRhcmdldCBsZW4gJWQgaW5zaWRlX3N0YXJ0X2FmdGVyID0gJWQgdGhpc19pc19zdGFydF9hZnRlciA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChjdXJyZW50X3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnJlYWRlci52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfYWZ0ZXIgPyBzdGFydF9hZnRlci0+dmFsdWVfcG9zIDogLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHdyaXRlci0+dmFsdWVfc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGVfc3RhcnRfYWZ0ZXIsIHRoaXNfaXNfc3RhcnRfYWZ0ZXIpOworI2VuZGlmCisKKyAgICAgICAgICBpZiAoIWluc2lkZV9zdGFydF9hZnRlciAmJiAhdGhpc19pc19zdGFydF9hZnRlcikKKyAgICAgICAgICAgIGVuYWJsZV9pZl9hZnRlciAod3JpdGVyLCAmc3VicmVhZGVyLCBzdGFydF9hZnRlcik7CisgICAgICAgICAgZW5hYmxlZF9hdF9yZWN1cnNlID0gd3JpdGVyLT5lbmFibGVkOworICAgICAgICAgIGlmICghX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZV9jb250YWluZWRfbGVuICh3cml0ZXIsIGN1cnJlbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnX3N0ciwgc2lnX3N0YXJ0LCBzaWdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3Vid3JpdGVyLCBGQUxTRSkpCisgICAgICAgICAgICBnb3RvIG9vbTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInJlY3Vyc2VkIGludG8gc3Vid3JpdGVyIGF0ICVkIHdyaXRlIHRhcmdldCBsZW4gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3Vid3JpdGVyLnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3Vid3JpdGVyLnZhbHVlX3N0cikpOworI2VuZGlmCisKKyAgICAgICAgICBpZiAoIXdyaXRlcl93cml0ZV9yZWFkZXJfaGVscGVyICgmc3Vid3JpdGVyLCAmc3VicmVhZGVyLCBzdGFydF9hZnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9hZnRlcl9uZXdfcG9zLCBzdGFydF9hZnRlcl9uZXdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeHVwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGVfc3RhcnRfYWZ0ZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2lzX3N0YXJ0X2FmdGVyKSkKKyAgICAgICAgICAgIGdvdG8gb29tOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiYWJvdXQgdG8gdW5yZWN1cnNlIGZyb20gJXMgc3VicmVhZGVyIGF0ICVkIHdyaXRlciBhdCAlZCBzdWJ3cml0ZXIgYXQgJWQgIHdyaXRlIHRhcmdldCBsZW4gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKGN1cnJlbnRfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3VicmVhZGVyLnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ3cml0ZXIudmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh3cml0ZXItPnZhbHVlX3N0cikpOworI2VuZGlmCisKKyAgICAgICAgICBpZiAoIWluc2lkZV9zdGFydF9hZnRlciAmJiAhdGhpc19pc19zdGFydF9hZnRlcikKKyAgICAgICAgICAgIGVuYWJsZV9pZl9hZnRlciAod3JpdGVyLCAmc3VicmVhZGVyLCBzdGFydF9hZnRlcik7CisgICAgICAgICAgcGFzdF9zdGFydF9hZnRlciA9IHdyaXRlci0+ZW5hYmxlZDsKKyAgICAgICAgICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3VucmVjdXJzZSAod3JpdGVyLCAmc3Vid3JpdGVyKSkKKyAgICAgICAgICAgIGdvdG8gb29tOworCisgICAgICAgICAgLyogSWYgd2Ugd2VyZW4ndCBlbmFibGVkIHdoZW4gd2UgcmVjdXJzZWQsIHdlIGRpZG4ndAorICAgICAgICAgICAqIHdyaXRlIGFuIGFycmF5IGxlbjsgaWYgd2UgcGFzc2VkIHN0YXJ0X2FmdGVyCisgICAgICAgICAgICogc29tZXdoZXJlIGluc2lkZSB0aGUgYXJyYXksIHRoZW4gd2UgbmVlZCB0byBnZW5lcmF0ZQorICAgICAgICAgICAqIGEgZml4dXAuCisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKHN0YXJ0X2FmdGVyICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgIWVuYWJsZWRfYXRfcmVjdXJzZSAmJiBwYXN0X3N0YXJ0X2FmdGVyICYmCisgICAgICAgICAgICAgIGN1cnJlbnRfdHlwZSA9PSBEQlVTX1RZUEVfQVJSQVkgJiYKKyAgICAgICAgICAgICAgZml4dXBzICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIERCdXNBcnJheUxlbkZpeHVwIGZpeHVwOworICAgICAgICAgICAgICBpbnQgYnl0ZXNfd3JpdHRlbl9hZnRlcl9zdGFydF9hZnRlcjsKKyAgICAgICAgICAgICAgaW50IGJ5dGVzX2JlZm9yZV9zdGFydF9hZnRlcjsKKyAgICAgICAgICAgICAgaW50IG9sZF9sZW47CisKKyAgICAgICAgICAgICAgLyogdGhpcyBzdWJ3cml0ZXIgYWNjZXNzIGlzIG1vZGVyYXRlbHkgdW5rb3NoZXIgc2luY2Ugd2UKKyAgICAgICAgICAgICAgICogYWxyZWFkeSB1bnJlY3Vyc2VkLCBidXQgaXQgd29ya3MgYXMgbG9uZyBhcyB1bnJlY3Vyc2UKKyAgICAgICAgICAgICAgICogZG9lc24ndCBicmVhayB1cyBvbiBwdXJwb3NlCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBieXRlc193cml0dGVuX2FmdGVyX3N0YXJ0X2FmdGVyID0gd3JpdGVyX2dldF9hcnJheV9sZW4gKCZzdWJ3cml0ZXIpOworCisgICAgICAgICAgICAgIGJ5dGVzX2JlZm9yZV9zdGFydF9hZnRlciA9CisgICAgICAgICAgICAgICAgc3RhcnRfYWZ0ZXItPnZhbHVlX3BvcyAtIHJlYWRlcl9hcnJheV9zdGFydF9wb3M7CisKKyAgICAgICAgICAgICAgZml4dXAubGVuX3Bvc19pbl9yZWFkZXIgPSByZWFkZXJfYXJyYXlfbGVuX3BvczsKKyAgICAgICAgICAgICAgZml4dXAubmV3X2xlbiA9CisgICAgICAgICAgICAgICAgYnl0ZXNfYmVmb3JlX3N0YXJ0X2FmdGVyICsKKyAgICAgICAgICAgICAgICBzdGFydF9hZnRlcl9uZXdfbGVuICsKKyAgICAgICAgICAgICAgICBieXRlc193cml0dGVuX2FmdGVyX3N0YXJ0X2FmdGVyOworCisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoX0RCVVNfQUxJR05fVkFMVUUgKGZpeHVwLmxlbl9wb3NfaW5fcmVhZGVyLCA0KSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkgZml4dXAubGVuX3Bvc19pbl9yZWFkZXIpOworCisgICAgICAgICAgICAgIG9sZF9sZW4gPSBfZGJ1c191bnBhY2tfdWludDMyIChyZWFkZXItPmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChyZWFkZXItPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeHVwLmxlbl9wb3NfaW5fcmVhZGVyLCA0KSk7CisKKyAgICAgICAgICAgICAgaWYgKG9sZF9sZW4gIT0gZml4dXAubmV3X2xlbiAmJiAhYXBwZW5kX2ZpeHVwIChmaXh1cHMsICZmaXh1cCkpCisgICAgICAgICAgICAgICAgZ290byBvb207CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiR2VuZXJhdGVkIGZpeHVwIGxlbl9wb3NfaW5fcmVhZGVyID0gJWQgbmV3X2xlbiA9ICVkIHJlYWRlcl9hcnJheV9zdGFydF9wb3MgPSAlZCBzdGFydF9hZnRlci0+dmFsdWVfcG9zID0gJWQgYnl0ZXNfYmVmb3JlX3N0YXJ0X2FmdGVyID0gJWQgc3RhcnRfYWZ0ZXJfbmV3X2xlbiA9ICVkIGJ5dGVzX3dyaXR0ZW5fYWZ0ZXJfc3RhcnRfYWZ0ZXIgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4dXAubGVuX3Bvc19pbl9yZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeHVwLm5ld19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlcl9hcnJheV9zdGFydF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2FmdGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX2JlZm9yZV9zdGFydF9hZnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfYWZ0ZXJfbmV3X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfd3JpdHRlbl9hZnRlcl9zdGFydF9hZnRlcik7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgREJ1c0Jhc2ljVmFsdWUgdmFsOworCisgICAgICAgICAgX2RidXNfYXNzZXJ0IChkYnVzX3R5cGVfaXNfYmFzaWMgKGN1cnJlbnRfdHlwZSkpOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiUmVhZGluZyBiYXNpYyB2YWx1ZSAlcyBhdCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAoY3VycmVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXItPnZhbHVlX3Bvcyk7CisjZW5kaWYKKworICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKHJlYWRlciwgJnZhbCk7CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJXcml0aW5nIGJhc2ljIHZhbHVlICVzIGF0ICVkIHdyaXRlIHRhcmdldCBsZW4gJWQgaW5zaWRlX3N0YXJ0X2FmdGVyID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKGN1cnJlbnRfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHdyaXRlci0+dmFsdWVfc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGVfc3RhcnRfYWZ0ZXIpOworI2VuZGlmCisgICAgICAgICAgaWYgKCFpbnNpZGVfc3RhcnRfYWZ0ZXIpCisgICAgICAgICAgICBlbmFibGVfaWZfYWZ0ZXIgKHdyaXRlciwgcmVhZGVyLCBzdGFydF9hZnRlcik7CisgICAgICAgICAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAod3JpdGVyLCBjdXJyZW50X3R5cGUsICZ2YWwpKQorICAgICAgICAgICAgZ290byBvb207CisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiV3JvdGUgYmFzaWMgdmFsdWUgJXMsIG5ldyB2YWx1ZV9wb3MgJWQgd3JpdGUgdGFyZ2V0IGxlbiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAoY3VycmVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAod3JpdGVyLT52YWx1ZV9zdHIpKTsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKHJlYWRlcik7CisgICAgfQorCisgIHJldHVybiBUUlVFOworCisgb29tOgorICBpZiAoZml4dXBzKQorICAgIGFwcGx5X2FuZF9mcmVlX2ZpeHVwcyAoZml4dXBzLCBOVUxMKTsgLyogTlVMTCBmb3IgcmVhZGVyIHRvIGFwcGx5IHRvICovCisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogSXRlcmF0ZSB0aHJvdWdoIGFsbCB2YWx1ZXMgaW4gdGhlIGdpdmVuIHJlYWRlciwgd3JpdGluZyBhIGNvcHkgb2YKKyAqIGVhY2ggdmFsdWUgdG8gdGhlIHdyaXRlci4gIFRoZSByZWFkZXIgd2lsbCBiZSBtb3ZlZCBmb3J3YXJkIHRvIGl0cworICogZW5kIHBvc2l0aW9uLgorICoKKyAqIElmIGEgcmVhZGVyIHN0YXJ0X2FmdGVyIGlzIHByb3ZpZGVkLCBpdCBzaG91bGQgYmUgYSByZWFkZXIgZm9yIHRoZQorICogc2FtZSBkYXRhIGFzIHRoZSByZWFkZXIgdG8gYmUgd3JpdHRlbi4gT25seSB2YWx1ZXMgb2NjdXJyaW5nIGFmdGVyCisgKiB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSBzdGFydF9hZnRlciB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIHdyaXRlci4KKyAqCisgKiBJZiBzdGFydF9hZnRlciBpcyBwcm92aWRlZCwgdGhlbiB0aGUgY29weSBvZiB0aGUgcmVhZGVyIHdpbGwgYmUKKyAqIHBhcnRpYWwuIFRoaXMgbWVhbnMgdGhhdCBhcnJheSBsZW5ndGhzIHdpbGwgbm90IGhhdmUgYmVlbiBjb3BpZWQuCisgKiBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IHlvdSB3cm90ZSBhIG5ldyB2ZXJzaW9uIG9mIHRoZSB2YWx1ZSBhdAorICogc3RhcnRfYWZ0ZXIgdG8gdGhlIHdyaXRlci4gWW91IGhhdmUgdG8gcGFzcyBpbiB0aGUgc3RhcnQgcG9zaXRpb24KKyAqIGFuZCBsZW5ndGggb2YgdGhlIG5ldyB2YWx1ZS4gKElmIHlvdSBhcmUgZGVsZXRpbmcgdGhlIHZhbHVlCisgKiBhdCBzdGFydF9hZnRlciwgcGFzcyBpbiAwIGZvciB0aGUgbGVuZ3RoLikKKyAqCisgKiBJZiB0aGUgZml4dXBzIHBhcmFtZXRlciBpcyBub24tI05VTEwsIHRoZW4gYW55IGFycmF5IGxlbmd0aCB0aGF0CisgKiB3YXMgcmVhZCBidXQgbm90IHdyaXR0ZW4gZHVlIHRvIHN0YXJ0X2FmdGVyIHdpbGwgYmUgcHJvdmlkZWQKKyAqIGFzIGEgI0RCdXNBcnJheUxlbkZpeHVwLiBUaGUgZml4dXAgY29udGFpbnMgdGhlIHBvc2l0aW9uIG9mIHRoZQorICogYXJyYXkgbGVuZ3RoIGluIHRoZSBzb3VyY2UgZGF0YSwgYW5kIHRoZSBjb3JyZWN0IGFycmF5IGxlbmd0aAorICogYXNzdW1pbmcgeW91IGNvbWJpbmUgdGhlIHNvdXJjZSBkYXRhIGJlZm9yZSBzdGFydF9hZnRlciB3aXRoCisgKiB0aGUgd3JpdHRlbiBkYXRhIGF0IHN0YXJ0X2FmdGVyIGFuZCBiZXlvbmQuCisgKgorICogQHBhcmFtIHdyaXRlciB0aGUgd3JpdGVyIHRvIGNvcHkgdG8KKyAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlciB0byBjb3B5IGZyb20KKyAqIEBwYXJhbSBzdGFydF9hZnRlciAjTlVMTCBvciBhIHJlYWRlciBzaG93aW5nIHdoZXJlIHRvIHN0YXJ0CisgKiBAcGFyYW0gc3RhcnRfYWZ0ZXJfbmV3X3BvcyB0aGUgcG9zaXRpb24gb2Ygc3RhcnRfYWZ0ZXIgZXF1aXZhbGVudCBpbiB0aGUgdGFyZ2V0IGRhdGEKKyAqIEBwYXJhbSBzdGFydF9hZnRlcl9uZXdfbGVuIHRoZSBsZW5ndGggb2Ygc3RhcnRfYWZ0ZXIgZXF1aXZhbGVudCBpbiB0aGUgdGFyZ2V0IGRhdGEKKyAqIEBwYXJhbSBmaXh1cHMgbGlzdCB0byBhcHBlbmQgI0RCdXNBcnJheUxlbkZpeHVwIGlmIHRoZSB3cml0ZSB3YXMgcGFydGlhbAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX3JlYWRlcl9wYXJ0aWFsIChEQnVzVHlwZVdyaXRlciAgICAgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICAgICAgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1R5cGVSZWFkZXIgKnN0YXJ0X2FmdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBzdGFydF9hZnRlcl9uZXdfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBzdGFydF9hZnRlcl9uZXdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgICAgICAgKipmaXh1cHMpCit7CisgIERCdXNUeXBlV3JpdGVyIG9yaWc7CisgIGludCBvcmlnX3R5cGVfbGVuOworICBpbnQgb3JpZ192YWx1ZV9sZW47CisgIGludCBuZXdfYnl0ZXM7CisgIGludCBvcmlnX2VuYWJsZWQ7CisKKyAgb3JpZyA9ICp3cml0ZXI7CisgIG9yaWdfdHlwZV9sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAod3JpdGVyLT50eXBlX3N0cik7CisgIG9yaWdfdmFsdWVfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHdyaXRlci0+dmFsdWVfc3RyKTsKKyAgb3JpZ19lbmFibGVkID0gd3JpdGVyLT5lbmFibGVkOworCisgIGlmIChzdGFydF9hZnRlcikKKyAgICBfZGJ1c190eXBlX3dyaXRlcl9zZXRfZW5hYmxlZCAod3JpdGVyLCBGQUxTRSk7CisKKyAgaWYgKCF3cml0ZXJfd3JpdGVfcmVhZGVyX2hlbHBlciAod3JpdGVyLCByZWFkZXIsIHN0YXJ0X2FmdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9hZnRlcl9uZXdfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9hZnRlcl9uZXdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXh1cHMsIEZBTFNFKSkKKyAgICBnb3RvIG9vbTsKKworICBfZGJ1c190eXBlX3dyaXRlcl9zZXRfZW5hYmxlZCAod3JpdGVyLCBvcmlnX2VuYWJsZWQpOworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgaWYgKCF3cml0ZXItPnR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uKQorICAgIHsKKyAgICAgIG5ld19ieXRlcyA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh3cml0ZXItPnR5cGVfc3RyKSAtIG9yaWdfdHlwZV9sZW47CisgICAgICBfZGJ1c19zdHJpbmdfZGVsZXRlICh3cml0ZXItPnR5cGVfc3RyLCBvcmlnLnR5cGVfcG9zLCBuZXdfYnl0ZXMpOworICAgIH0KKyAgbmV3X2J5dGVzID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHdyaXRlci0+dmFsdWVfc3RyKSAtIG9yaWdfdmFsdWVfbGVuOworICBfZGJ1c19zdHJpbmdfZGVsZXRlICh3cml0ZXItPnZhbHVlX3N0ciwgb3JpZy52YWx1ZV9wb3MsIG5ld19ieXRlcyk7CisKKyAgKndyaXRlciA9IG9yaWc7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEl0ZXJhdGUgdGhyb3VnaCBhbGwgdmFsdWVzIGluIHRoZSBnaXZlbiByZWFkZXIsIHdyaXRpbmcgYSBjb3B5IG9mCisgKiBlYWNoIHZhbHVlIHRvIHRoZSB3cml0ZXIuICBUaGUgcmVhZGVyIHdpbGwgYmUgbW92ZWQgZm9yd2FyZCB0byBpdHMKKyAqIGVuZCBwb3NpdGlvbi4KKyAqCisgKiBAcGFyYW0gd3JpdGVyIHRoZSB3cml0ZXIgdG8gY29weSB0bworICogQHBhcmFtIHJlYWRlciB0aGUgcmVhZGVyIHRvIGNvcHkgZnJvbQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfcmVhZGVyIChEQnVzVHlwZVdyaXRlciAgICAgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAgICAgICAqcmVhZGVyKQoreworICByZXR1cm4gX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfcmVhZGVyX3BhcnRpYWwgKHdyaXRlciwgcmVhZGVyLCBOVUxMLCAwLCAwLCBOVUxMKTsKK30KKworLyoKKyAqIElmIGRpc2FibGVkLCBhIHdyaXRlciBjYW4gc3RpbGwgYmUgaXRlcmF0ZWQgZm9yd2FyZCBhbmQgcmVjdXJzZWQvdW5yZWN1cnNlZAorICogYnV0IHdvbid0IHdyaXRlIGFueSB2YWx1ZXMuIFR5cGVzIHdpbGwgc3RpbGwgYmUgd3JpdHRlbiB1bmxlc3MgdGhlCisgKiB3cml0ZXIgaXMgYSAidmFsdWVzIG9ubHkiIHdyaXRlciwgYmVjYXVzZSB0aGUgd3JpdGVyIG5lZWRzIGFjY2VzcyB0bworICogYSB2YWxpZCBzaWduYXR1cmUgdG8gYmUgYWJsZSB0byBpdGVyYXRlLgorICoKKyAqIEBwYXJhbSB3cml0ZXIgdGhlIHR5cGUgd3JpdGVyCisgKiBAcGFyYW0gZW5hYmxlZCAjVFJVRSBpZiB2YWx1ZXMgc2hvdWxkIGJlIHdyaXR0ZW4KKyAqLworc3RhdGljIHZvaWQKK19kYnVzX3R5cGVfd3JpdGVyX3NldF9lbmFibGVkIChEQnVzVHlwZVdyaXRlciAgICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgZW5hYmxlZCkKK3sKKyAgd3JpdGVyLT5lbmFibGVkID0gZW5hYmxlZCAhPSBGQUxTRTsKK30KKworLyoqIEB9ICovIC8qIGVuZCBvZiBEQnVzTWFyc2hhbCBncm91cCAqLworCisvKiB0ZXN0cyBpbiBkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLXV0aWwuYyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUuaCBiL2RidXMvZGJ1cy9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiZmQ3MwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmgKQEAgLTAsMCArMSwxODEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oICBNYXJzaGFsbGluZyByb3V0aW5lcyBmb3IgcmVjdXJzaXZlIHR5cGVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19NQVJTSEFMX1JFQ1VSU0lWRV9ICisjZGVmaW5lIERCVVNfTUFSU0hBTF9SRUNVUlNJVkVfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXByb3RvY29sLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKwordHlwZWRlZiBzdHJ1Y3QgREJ1c1R5cGVSZWFkZXIgICAgICBEQnVzVHlwZVJlYWRlcjsKK3R5cGVkZWYgc3RydWN0IERCdXNUeXBlV3JpdGVyICAgICAgREJ1c1R5cGVXcml0ZXI7Cit0eXBlZGVmIHN0cnVjdCBEQnVzVHlwZVJlYWRlckNsYXNzIERCdXNUeXBlUmVhZGVyQ2xhc3M7Cit0eXBlZGVmIHN0cnVjdCBEQnVzQXJyYXlMZW5GaXh1cCAgIERCdXNBcnJheUxlbkZpeHVwOworCisvKioKKyAqIFRoZSB0eXBlIHJlYWRlciBpcyBhbiBpdGVyYXRvciBmb3IgcmVhZGluZyB2YWx1ZXMgZnJvbSBhIGJsb2NrIG9mCisgKiB2YWx1ZXMuCisgKi8KK3N0cnVjdCBEQnVzVHlwZVJlYWRlcgoreworICBkYnVzX3VpbnQzMl90IGJ5dGVfb3JkZXIgOiA4OyAvKio8IGJ5dGUgb3JkZXIgb2YgdGhlIGJsb2NrICovCisKKyAgZGJ1c191aW50MzJfdCBmaW5pc2hlZCA6IDE7ICAgLyoqPCBtYXJrcyB3ZSdyZSBhdCBlbmQgaXRlcmF0b3IgZm9yIGNhc2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdoZXJlIHdlIGRvbid0IGhhdmUgYW5vdGhlciB3YXkgdG8gdGVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgZGJ1c191aW50MzJfdCBhcnJheV9sZW5fb2Zmc2V0IDogMzsgLyoqPCBieXRlcyBiYWNrIGZyb20gc3RhcnRfcG9zIHRoYXQgbGVuIGVuZHMgKi8KKyAgY29uc3QgREJ1c1N0cmluZyAqdHlwZV9zdHI7ICAgLyoqPCBzdHJpbmcgY29udGFpbmluZyBzaWduYXR1cmUgb2YgYmxvY2sgKi8KKyAgaW50IHR5cGVfcG9zOyAgICAgICAgICAgICAgICAgLyoqPCBjdXJyZW50IHBvc2l0aW9uIGluIHNpZ25hdHVyZSAqLworICBjb25zdCBEQnVzU3RyaW5nICp2YWx1ZV9zdHI7ICAvKio8IHN0cmluZyBjb250YWluaW5nIHZhbHVlcyBvZiBibG9jayAqLworICBpbnQgdmFsdWVfcG9zOyAgICAgICAgICAgICAgICAvKio8IGN1cnJlbnQgcG9zaXRpb24gaW4gdmFsdWVzICovCisKKyAgY29uc3QgREJ1c1R5cGVSZWFkZXJDbGFzcyAqa2xhc3M7IC8qKjwgdGhlIHZ0YWJsZSBmb3IgdGhlIHJlYWRlciAqLworICB1bmlvbgorICB7CisgICAgc3RydWN0IHsKKyAgICAgIGludCBzdGFydF9wb3M7ICAgICAgICAgICAgICAgIC8qKjwgZm9yIGFycmF5IHJlYWRlcnMsIHRoZSBzdGFydCBvZiB0aGUgYXJyYXkgdmFsdWVzICovCisgICAgfSBhcnJheTsKKyAgfSB1OyAvKio8IGNsYXNzLXNwZWNpZmljIGRhdGEgKi8KK307CisKKy8qKgorICogVGhlIHR5cGUgd3JpdGVyIGlzIGFuIGl0ZXJhdG9yIGZvciB3cml0aW5nIHRvIGEgYmxvY2sgb2YgdmFsdWVzLgorICovCitzdHJ1Y3QgREJ1c1R5cGVXcml0ZXIKK3sKKyAgZGJ1c191aW50MzJfdCBieXRlX29yZGVyIDogODsgICAgICAgICAgICAvKio8IGJ5dGUgb3JkZXIgdG8gd3JpdGUgdmFsdWVzIHdpdGggKi8KKworICBkYnVzX3VpbnQzMl90IGNvbnRhaW5lcl90eXBlIDogODsgICAgICAgIC8qKjwgd2hhdCBhcmUgd2UgaW5zaWRlPyAoZS5nLiBzdHJ1Y3QsIHZhcmlhbnQsIGFycmF5KSAqLworCisgIGRidXNfdWludDMyX3QgdHlwZV9wb3NfaXNfZXhwZWN0YXRpb24gOiAxOyAvKio8IHR5cGVfcG9zIGNhbiBiZSBlaXRoZXIgYW4gaW5zZXJ0aW9uIHBvaW50IGZvciBvciBhbiBleHBlY3RlZCBuZXh0IHR5cGUgKi8KKworICBkYnVzX3VpbnQzMl90IGVuYWJsZWQgOiAxOyAvKio8IHdoZXRoZXIgdG8gd3JpdGUgdmFsdWVzICovCisKKyAgREJ1c1N0cmluZyAqdHlwZV9zdHI7IC8qKjwgd2hlcmUgdG8gd3JpdGUgdHlwZWNvZGVzIChvciByZWFkIHR5cGUgZXhwZWN0YXRpb25zKSAqLworICBpbnQgdHlwZV9wb3M7ICAgICAgICAgLyoqPCBjdXJyZW50IHBvcyBpbiB0eXBlX3N0ciAqLworICBEQnVzU3RyaW5nICp2YWx1ZV9zdHI7IC8qKjwgd2hlcmUgdG8gd3JpdGUgdmFsdWVzICovCisgIGludCB2YWx1ZV9wb3M7ICAgICAgICAgLyoqPCBuZXh0IHBvc2l0aW9uIHRvIHdyaXRlICovCisKKyAgdW5pb24KKyAgeworICAgIHN0cnVjdCB7CisgICAgICBpbnQgc3RhcnRfcG9zOyAvKio8IHBvc2l0aW9uIG9mIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGFycmF5ICovCisgICAgICBpbnQgbGVuX3BvczsgICAvKio8IHBvc2l0aW9uIG9mIGxlbmd0aCBvZiB0aGUgYXJyYXkgKi8KKyAgICAgIGludCBlbGVtZW50X3R5cGVfcG9zOyAvKio8IHBvc2l0aW9uIG9mIGFycmF5IGVsZW1lbnQgdHlwZSBpbiB0eXBlX3N0ciAqLworICAgIH0gYXJyYXk7CisgIH0gdTsgLyoqPCBjbGFzcy1zcGVjaWZpYyBkYXRhICovCit9OworCisvKioKKyAqIFdoZW4gbW9kaWZ5aW5nIGFuIGV4aXN0aW5nIGJsb2NrIG9mIHZhbHVlcywgYXJyYXkgbGVuZ3RocyBtYXkgbmVlZAorICogdG8gYmUgYWRqdXN0ZWQ7IHRob3NlIGFkanVzdG1lbnRzIGFyZSBkZXNjcmliZWQgYnkgdGhpcyBzdHJ1Y3QuCisgKi8KK3N0cnVjdCBEQnVzQXJyYXlMZW5GaXh1cAoreworICBpbnQgbGVuX3Bvc19pbl9yZWFkZXI7IC8qKjwgd2hlcmUgdGhlIGxlbmd0aCB3YXMgaW4gdGhlIG9yaWdpbmFsIGJsb2NrICovCisgIGludCBuZXdfbGVuOyAgICAgICAgICAgLyoqPCB0aGUgbmV3IHZhbHVlIG9mIHRoZSBsZW5ndGggaW4gdGhlIHdyaXR0ZW4tb3V0IGJsb2NrICovCit9OworCit2b2lkICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9pbml0ICAgICAgICAgICAgICAgICAgICAgIChEQnVzVHlwZVJlYWRlciAgICAgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAqdHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIHR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgICp2YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Bvcyk7Cit2b2lkICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9pbml0X3R5cGVzX29ubHkgICAgICAgICAgIChEQnVzVHlwZVJlYWRlciAgICAgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAqdHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIHR5cGVfcG9zKTsKK2ludCAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgICAgICAgICAgKGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhZGVyKTsKK2ludCAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX2dldF9lbGVtZW50X3R5cGUgICAgICAgICAgKGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhZGVyKTsKK2ludCAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX2dldF92YWx1ZV9wb3MgICAgICAgICAgICAgKGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhZGVyKTsKK3ZvaWQgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgICAgICAgICAgICAgICAgKGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICp2YWx1ZSk7CitpbnQgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9nZXRfYXJyYXlfbGVuZ3RoICAgICAgICAgIChjb25zdCBEQnVzVHlwZVJlYWRlciAgKnJlYWRlcik7Cit2b2lkICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2ZpeGVkX211bHRpICAgICAgICAgIChjb25zdCBEQnVzVHlwZVJlYWRlciAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgKm5fZWxlbWVudHMpOwordm9pZCAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9yYXcgICAgICAgICAgICAgICAgICAoY29uc3QgREJ1c1R5cGVSZWFkZXIgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqKnZhbHVlX2xvY2F0aW9uKTsKK3ZvaWQgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgICAgICAgICAgICAgICAgICAgKERCdXNUeXBlUmVhZGVyICAgICAgICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgICAgICAgICpzdWJyZWFkZXIpOworZGJ1c19ib29sX3QgX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAgICAgICAgICAgICAgICAgICAgICAoREJ1c1R5cGVSZWFkZXIgICAgICAgICpyZWFkZXIpOworZGJ1c19ib29sX3QgX2RidXNfdHlwZV9yZWFkZXJfaGFzX25leHQgICAgICAgICAgICAgICAgICAoY29uc3QgREJ1c1R5cGVSZWFkZXIgICpyZWFkZXIpOwordm9pZCAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfZ2V0X3NpZ25hdHVyZSAgICAgICAgICAgICAoY29uc3QgREJ1c1R5cGVSZWFkZXIgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAqKnN0cl9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICpzdGFydF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICpsZW5fcCk7CitkYnVzX2Jvb2xfdCBfZGJ1c190eXBlX3JlYWRlcl9zZXRfYmFzaWMgICAgICAgICAgICAgICAgIChEQnVzVHlwZVJlYWRlciAgICAgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzVHlwZVJlYWRlciAgKnJlYWxpZ25fcm9vdCk7CitkYnVzX2Jvb2xfdCBfZGJ1c190eXBlX3JlYWRlcl9kZWxldGUgICAgICAgICAgICAgICAgICAgIChEQnVzVHlwZVJlYWRlciAgICAgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhbGlnbl9yb290KTsKKworZGJ1c19ib29sX3QgX2RidXNfdHlwZV9yZWFkZXJfZXF1YWxfdmFsdWVzICAgICAgICAgICAgICAoY29uc3QgREJ1c1R5cGVSZWFkZXIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNUeXBlUmVhZGVyICpyaHMpOworCit2b2lkICAgICAgICBfZGJ1c190eXBlX3NpZ25hdHVyZV9uZXh0ICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICAgICAgICAgICAgKnNpZ25hdHVyZSwKKwkJCQkJCQkgaW50ICAgICAgICAgICAgICAgICAgICp0eXBlX3Bvcyk7CisKK3ZvaWQgICAgICAgIF9kYnVzX3R5cGVfd3JpdGVyX2luaXQgICAgICAgICAgICAgICAgIChEQnVzVHlwZVdyaXRlciAgICAgICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAgICp0eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIHR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAgICAqdmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgdmFsdWVfcG9zKTsKK3ZvaWQgICAgICAgIF9kYnVzX3R5cGVfd3JpdGVyX2luaXRfdHlwZXNfZGVsYXllZCAgIChEQnVzVHlwZVdyaXRlciAgICAgICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAgICp2YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICB2YWx1ZV9wb3MpOwordm9pZCAgICAgICAgX2RidXNfdHlwZV93cml0ZXJfYWRkX3R5cGVzICAgICAgICAgICAgKERCdXNUeXBlV3JpdGVyICAgICAgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAgICAqdHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICB0eXBlX3Bvcyk7Cit2b2lkICAgICAgICBfZGJ1c190eXBlX3dyaXRlcl9yZW1vdmVfdHlwZXMgICAgICAgICAoREJ1c1R5cGVXcml0ZXIgICAgICAgICp3cml0ZXIpOwordm9pZCAgICAgICAgX2RidXNfdHlwZV93cml0ZXJfaW5pdF92YWx1ZXNfb25seSAgICAgKERCdXNUeXBlV3JpdGVyICAgICAgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgKnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgdHlwZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAgICp2YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICB2YWx1ZV9wb3MpOworZGJ1c19ib29sX3QgX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgICAgICAgICAgKERCdXNUeXBlV3JpdGVyICAgICAgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICAgICAgKnZhbHVlKTsKK2RidXNfYm9vbF90IF9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2ZpeGVkX211bHRpICAgIChEQnVzVHlwZVdyaXRlciAgICAgICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgbl9lbGVtZW50cyk7CitkYnVzX2Jvb2xfdCBfZGJ1c190eXBlX3dyaXRlcl9yZWN1cnNlICAgICAgICAgICAgICAoREJ1c1R5cGVXcml0ZXIgICAgICAgICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgKmNvbnRhaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgICAgICAgICpzdWIpOworZGJ1c19ib29sX3QgX2RidXNfdHlwZV93cml0ZXJfdW5yZWN1cnNlICAgICAgICAgICAgKERCdXNUeXBlV3JpdGVyICAgICAgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICAgICAgICAqc3ViKTsKK2RidXNfYm9vbF90IF9kYnVzX3R5cGVfd3JpdGVyX2FwcGVuZF9hcnJheSAgICAgICAgIChEQnVzVHlwZVdyaXRlciAgICAgICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgKmNvbnRhaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgICAgICAgICpzdWIpOworZGJ1c19ib29sX3QgX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfcmVhZGVyICAgICAgICAgKERCdXNUeXBlV3JpdGVyICAgICAgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICAgICAgICAqcmVhZGVyKTsKKworCisjZW5kaWYgLyogREJVU19NQVJTSEFMX1JFQ1VSU0lWRV9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLXV0aWwuYyBiL2RidXMvZGJ1cy9kYnVzLW1hcnNoYWwtdmFsaWRhdGUtdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMTM1YmMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLXV0aWwuYwpAQCAtMCwwICsxLDU4OCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1hcnNoYWwtdmFsaWRhdGUtdXRpbC5jIFdvdWxkIGJlIGluIGRidXMtbWFyc2hhbC12YWxpZGF0ZS5jLCBidXQgb25seSB1c2VkIGJ5IHRlc3RzL2J1cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaWZkZWYgREJVU19CVUlMRF9URVNUUworCisjaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUworCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtdmFsaWRhdGUuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmgiCisKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBjaGFyICpkYXRhOworICBEQnVzVmFsaWRpdHkgZXhwZWN0ZWQ7Cit9IFZhbGlkaXR5VGVzdDsKKworc3RhdGljIHZvaWQKK3J1bl92YWxpZGl0eV90ZXN0cyAoY29uc3QgVmFsaWRpdHlUZXN0ICp0ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBuX3Rlc3RzLAorICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgKCogZnVuYykgKGNvbnN0IERCdXNTdHJpbmcqLGludCxpbnQpKQoreworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbl90ZXN0czsgaSsrKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgc3RyOworICAgICAgREJ1c1ZhbGlkaXR5IHY7CisKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCB0ZXN0c1tpXS5kYXRhKTsKKworICAgICAgdiA9ICgqZnVuYykgKCZzdHIsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSk7CisKKyAgICAgIGlmICh2ICE9IHRlc3RzW2ldLmV4cGVjdGVkKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkltcHJvcGVyIHZhbGlkYXRpb24gcmVzdWx0ICVkIGZvciAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHYsIHRlc3RzW2ldLmRhdGEpOworICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInRlc3QgZmFpbGVkIik7CisgICAgICAgIH0KKworICAgICAgKytpOworICAgIH0KK30KKworc3RhdGljIGNvbnN0IFZhbGlkaXR5VGVzdCBzaWduYXR1cmVfdGVzdHNbXSA9IHsKKyAgeyAiIiwgREJVU19WQUxJRCB9LAorICB7ICJpIiwgREJVU19WQUxJRCB9LAorICB7ICJhaSIsIERCVVNfVkFMSUQgfSwKKyAgeyAiKGkpIiwgREJVU19WQUxJRCB9LAorICB7ICJ3IiwgREJVU19JTlZBTElEX1VOS05PV05fVFlQRUNPREUgfSwKKyAgeyAiYSIsIERCVVNfSU5WQUxJRF9NSVNTSU5HX0FSUkFZX0VMRU1FTlRfVFlQRSB9LAorICB7ICJhYWFhYWEiLCBEQlVTX0lOVkFMSURfTUlTU0lOR19BUlJBWV9FTEVNRU5UX1RZUEUgfSwKKyAgeyAiaWkoaWkpYSIsIERCVVNfSU5WQUxJRF9NSVNTSU5HX0FSUkFZX0VMRU1FTlRfVFlQRSB9LAorICB7ICJpYSIsIERCVVNfSU5WQUxJRF9NSVNTSU5HX0FSUkFZX0VMRU1FTlRfVFlQRSB9LAorICAvKiBEQlVTX0lOVkFMSURfU0lHTkFUVVJFX1RPT19MT05HLCAqLyAvKiB0b28gaGFyZCB0byB0ZXN0IHRoaXMgd2F5ICovCisgIHsgImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSIsCisgICAgREJVU19JTlZBTElEX0VYQ0VFREVEX01BWElNVU1fQVJSQVlfUkVDVVJTSU9OIH0sCisgIHsgIigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoaWkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSIsCisgICAgREJVU19JTlZBTElEX0VYQ0VFREVEX01BWElNVU1fU1RSVUNUX1JFQ1VSU0lPTiB9LAorICB7ICIpIiwgREJVU19JTlZBTElEX1NUUlVDVF9FTkRFRF9CVVRfTk9UX1NUQVJURUQgfSwKKyAgeyAiaSkiLCBEQlVTX0lOVkFMSURfU1RSVUNUX0VOREVEX0JVVF9OT1RfU1RBUlRFRCB9LAorICB7ICJhKSIsIERCVVNfSU5WQUxJRF9TVFJVQ1RfRU5ERURfQlVUX05PVF9TVEFSVEVEIH0sCisgIHsgIigiLCBEQlVTX0lOVkFMSURfU1RSVUNUX1NUQVJURURfQlVUX05PVF9FTkRFRCB9LAorICB7ICIoaSIsIERCVVNfSU5WQUxJRF9TVFJVQ1RfU1RBUlRFRF9CVVRfTk9UX0VOREVEIH0sCisgIHsgIihpaWlpaSIsIERCVVNfSU5WQUxJRF9TVFJVQ1RfU1RBUlRFRF9CVVRfTk9UX0VOREVEIH0sCisgIHsgIihhaSIsIERCVVNfSU5WQUxJRF9TVFJVQ1RfU1RBUlRFRF9CVVRfTk9UX0VOREVEIH0sCisgIHsgIigpIiwgREJVU19JTlZBTElEX1NUUlVDVF9IQVNfTk9fRklFTERTIH0sCisgIHsgIigoKSkiLCBEQlVTX0lOVkFMSURfU1RSVUNUX0hBU19OT19GSUVMRFMgfSwKKyAgeyAiYSgpIiwgREJVU19JTlZBTElEX1NUUlVDVF9IQVNfTk9fRklFTERTIH0sCisgIHsgImkoKSIsIERCVVNfSU5WQUxJRF9TVFJVQ1RfSEFTX05PX0ZJRUxEUyB9LAorICB7ICIoKWkiLCBEQlVTX0lOVkFMSURfU1RSVUNUX0hBU19OT19GSUVMRFMgfSwKKyAgeyAiKGEpIiwgREJVU19JTlZBTElEX01JU1NJTkdfQVJSQVlfRUxFTUVOVF9UWVBFIH0sCisgIHsgImF7aWF9IiwgREJVU19JTlZBTElEX01JU1NJTkdfQVJSQVlfRUxFTUVOVF9UWVBFIH0sCisgIHsgImF7fSIsIERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX0hBU19OT19GSUVMRFMgfSwKKyAgeyAiYXthaWl9IiwgREJVU19JTlZBTElEX0RJQ1RfS0VZX01VU1RfQkVfQkFTSUNfVFlQRSB9LAorICAvKiB7ICJhe2l9IiwgREJVU19JTlZBTElEX0RJQ1RfRU5UUllfSEFTX09OTFlfT05FX0ZJRUxEIH0sICovCisgIC8qIHsgIntpc30iLCBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9OT1RfSU5TSURFX0FSUkFZIH0sICovCisgIC8qIHsgImF7aXNpfSIsIERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX0hBU19UT09fTUFOWV9GSUVMRFMgfSwgKi8KK307CisKK2RidXNfYm9vbF90CitfZGJ1c19tYXJzaGFsX3ZhbGlkYXRlX3Rlc3QgKHZvaWQpCit7CisgIERCdXNTdHJpbmcgc3RyOworICBpbnQgaTsKKworICBjb25zdCBjaGFyICp2YWxpZF9wYXRoc1tdID0geworICAgICIvIiwKKyAgICAiL2Zvby9iYXIiLAorICAgICIvZm9vIiwKKyAgICAiL2Zvby9iYXIvYmF6IgorICB9OworICBjb25zdCBjaGFyICppbnZhbGlkX3BhdGhzW10gPSB7CisgICAgImJhciIsCisgICAgImJhci9iYXoiLAorICAgICIvZm9vL2Jhci8iLAorICAgICIvZm9vLyIKKyAgICAiZm9vLyIsCisgICAgImJvby8vYmxhaCIsCisgICAgIi8vIiwKKyAgICAiLy8vIiwKKyAgICAiZm9vLy8vYmxhaC8iLAorICAgICJIZWxsbyBXb3JsZCIsCisgICAgIiIsCisgICAgIiAgICIsCisgICAgImZvbyBiYXIiCisgIH07CisKKyAgY29uc3QgY2hhciAqdmFsaWRfaW50ZXJmYWNlc1tdID0geworICAgICJvcmcuZnJlZWRlc2t0b3AuRm9vIiwKKyAgICAiQmFyLkJheiIsCisgICAgIkJsYWguQmxhaC5CbGFoLkJsYWguQmxhaCIsCisgICAgImEuYiIsCisgICAgImEuYi5jLmQuZS5mLmciLAorICAgICJhMC5iMS5jMi5kMy5lNC5mNS5nNiIsCisgICAgImFiYzEyMy5mb28yNyIKKyAgfTsKKyAgY29uc3QgY2hhciAqaW52YWxpZF9pbnRlcmZhY2VzW10gPSB7CisgICAgIi4iLAorICAgICIiLAorICAgICIuLiIsCisgICAgIi5Gb28uQmFyIiwKKyAgICAiLi5Gb28uQmFyIiwKKyAgICAiRm9vLkJhci4iLAorICAgICJGb28uQmFyLi4iLAorICAgICJGb28iLAorICAgICI5Zm9vLmJhci5iYXoiLAorICAgICJmb28uYmFyLi5iYXoiLAorICAgICJmb28uYmFyLi4uYmF6IiwKKyAgICAiZm9vLmJhci5iLi5ibGFoIiwKKyAgICAiOiIsCisgICAgIjowLTEiLAorICAgICIxMCIsCisgICAgIjoxMS4zNDMyNCIsCisgICAgIjAuMC4wIiwKKyAgICAiMC4uMCIsCisgICAgImZvby5CYXIuJSIsCisgICAgImZvby5CYXIhISIsCisgICAgIiFGb28uYmFyLmJ6IiwKKyAgICAiZm9vLiQuYmxhaCIsCisgICAgIiIsCisgICAgIiAgICIsCisgICAgImZvbyBiYXIiCisgIH07CisKKyAgY29uc3QgY2hhciAqdmFsaWRfdW5pcXVlX25hbWVzW10gPSB7CisgICAgIjowIiwKKyAgICAiOmEiLAorICAgICI6IiwKKyAgICAiOi5hIiwKKyAgICAiOi4xIiwKKyAgICAiOjAuMSIsCisgICAgIjowMDAuMjIyMiIsCisgICAgIjouYmxhaCIsCisgICAgIjphYmNlLmZyZWVkZXNrdG9wLmJsYWgiCisgIH07CisgIGNvbnN0IGNoYXIgKmludmFsaWRfdW5pcXVlX25hbWVzW10gPSB7CisgICAgLy8iOi0iLAorICAgICI6ISIsCisgICAgLy8iOjAtMTAiLAorICAgICI6YmxhaC4iLAorICAgICI6YmxhaC4iLAorICAgICI6YmxhaC4ub3JnIiwKKyAgICAiOmJsYWgub3JnLi4iLAorICAgICI6Li5ibGFoLm9yZyIsCisgICAgIiIsCisgICAgIiAgICIsCisgICAgImZvbyBiYXIiCisgIH07CisKKyAgY29uc3QgY2hhciAqdmFsaWRfbWVtYmVyc1tdID0geworICAgICJIZWxsbyIsCisgICAgIkJhciIsCisgICAgImZvb2JhciIsCisgICAgIl9mb29iYXIiLAorICAgICJmb284OSIKKyAgfTsKKworICBjb25zdCBjaGFyICppbnZhbGlkX21lbWJlcnNbXSA9IHsKKyAgICAiOUhlbGxvIiwKKyAgICAiMTAiLAorICAgICIxIiwKKyAgICAiZm9vLWJhciIsCisgICAgImJsYWgub3JnIiwKKyAgICAiLmJsYWgiLAorICAgICJibGFoLiIsCisgICAgIkhlbGxvLiIsCisgICAgIiFmb28iLAorICAgICIiLAorICAgICIgICAiLAorICAgICJmb28gYmFyIgorICB9OworCisgIGNvbnN0IGNoYXIgKnZhbGlkX3NpZ25hdHVyZXNbXSA9IHsKKyAgICAiIiwKKyAgICAic3NzIiwKKyAgICAiaSIsCisgICAgImIiCisgIH07CisKKyAgY29uc3QgY2hhciAqaW52YWxpZF9zaWduYXR1cmVzW10gPSB7CisgICAgIiAiLAorICAgICJub3QgYSB2YWxpZCBzaWduYXR1cmUiLAorICAgICIxMjMiLAorICAgICIuIiwKKyAgICAiKCIsCisgICAgImF7KGlpKWl9IiAvKiBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzgwMyAqLworICB9OworCisgIC8qIFNpZ25hdHVyZSB3aXRoIHJlYXNvbiAqLworCisgIHJ1bl92YWxpZGl0eV90ZXN0cyAoc2lnbmF0dXJlX3Rlc3RzLCBfREJVU19OX0VMRU1FTlRTIChzaWduYXR1cmVfdGVzdHMpLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3ZhbGlkYXRlX3NpZ25hdHVyZV93aXRoX3JlYXNvbik7CisKKyAgLyogUGF0aCB2YWxpZGF0aW9uICovCisgIGkgPSAwOworICB3aGlsZSAoaSA8IChpbnQpIF9EQlVTX05fRUxFTUVOVFMgKHZhbGlkX3BhdGhzKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgdmFsaWRfcGF0aHNbaV0pOworCisgICAgICBpZiAoIV9kYnVzX3ZhbGlkYXRlX3BhdGggKCZzdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiUGF0aCBcIiVzXCIgc2hvdWxkIGhhdmUgYmVlbiB2YWxpZFxuIiwgdmFsaWRfcGF0aHNbaV0pOworICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImludmFsaWQgcGF0aCIpOworICAgICAgICB9CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgKGludCkgX0RCVVNfTl9FTEVNRU5UUyAoaW52YWxpZF9wYXRocykpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIGludmFsaWRfcGF0aHNbaV0pOworCisgICAgICBpZiAoX2RidXNfdmFsaWRhdGVfcGF0aCAoJnN0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIlBhdGggXCIlc1wiIHNob3VsZCBoYXZlIGJlZW4gaW52YWxpZFxuIiwgaW52YWxpZF9wYXRoc1tpXSk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidmFsaWQgcGF0aCIpOworICAgICAgICB9CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgLyogSW50ZXJmYWNlIHZhbGlkYXRpb24gKi8KKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgKGludCkgX0RCVVNfTl9FTEVNRU5UUyAodmFsaWRfaW50ZXJmYWNlcykpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIHZhbGlkX2ludGVyZmFjZXNbaV0pOworCisgICAgICBpZiAoIV9kYnVzX3ZhbGlkYXRlX2ludGVyZmFjZSAoJnN0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkludGVyZmFjZSBcIiVzXCIgc2hvdWxkIGhhdmUgYmVlbiB2YWxpZFxuIiwgdmFsaWRfaW50ZXJmYWNlc1tpXSk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW52YWxpZCBpbnRlcmZhY2UiKTsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIGkgPSAwOworICB3aGlsZSAoaSA8IChpbnQpIF9EQlVTX05fRUxFTUVOVFMgKGludmFsaWRfaW50ZXJmYWNlcykpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIGludmFsaWRfaW50ZXJmYWNlc1tpXSk7CisKKyAgICAgIGlmIChfZGJ1c192YWxpZGF0ZV9pbnRlcmZhY2UgKCZzdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkludGVyZmFjZSBcIiVzXCIgc2hvdWxkIGhhdmUgYmVlbiBpbnZhbGlkXG4iLCBpbnZhbGlkX2ludGVyZmFjZXNbaV0pOworICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInZhbGlkIGludGVyZmFjZSIpOworICAgICAgICB9CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgLyogQnVzIG5hbWUgdmFsaWRhdGlvbiAoY2hlY2sgdGhhdCB2YWxpZCBpbnRlcmZhY2VzIGFyZSB2YWxpZCBidXMgbmFtZXMsCisgICAqIGFuZCBpbnZhbGlkIGludGVyZmFjZXMgYXJlIGludmFsaWQgc2VydmljZXMgZXhjZXB0IGlmIHRoZXkgc3RhcnQgd2l0aCAnOicpCisgICAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAoaW50KSBfREJVU19OX0VMRU1FTlRTICh2YWxpZF9pbnRlcmZhY2VzKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgdmFsaWRfaW50ZXJmYWNlc1tpXSk7CisKKyAgICAgIGlmICghX2RidXNfdmFsaWRhdGVfYnVzX25hbWUgKCZzdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiQnVzIG5hbWUgXCIlc1wiIHNob3VsZCBoYXZlIGJlZW4gdmFsaWRcbiIsIHZhbGlkX2ludGVyZmFjZXNbaV0pOworICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImludmFsaWQgYnVzIG5hbWUiKTsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIGkgPSAwOworICB3aGlsZSAoaSA8IChpbnQpIF9EQlVTX05fRUxFTUVOVFMgKGludmFsaWRfaW50ZXJmYWNlcykpCisgICAgeworICAgICAgaWYgKGludmFsaWRfaW50ZXJmYWNlc1tpXVswXSAhPSAnOicpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgaW52YWxpZF9pbnRlcmZhY2VzW2ldKTsKKworICAgICAgICAgIGlmIChfZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAoJnN0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJCdXMgbmFtZSBcIiVzXCIgc2hvdWxkIGhhdmUgYmVlbiBpbnZhbGlkXG4iLCBpbnZhbGlkX2ludGVyZmFjZXNbaV0pOworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ2YWxpZCBidXMgbmFtZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgLyogdW5pcXVlIG5hbWUgdmFsaWRhdGlvbiAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAoaW50KSBfREJVU19OX0VMRU1FTlRTICh2YWxpZF91bmlxdWVfbmFtZXMpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCB2YWxpZF91bmlxdWVfbmFtZXNbaV0pOworCisgICAgICBpZiAoIV9kYnVzX3ZhbGlkYXRlX2J1c19uYW1lICgmc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJCdXMgbmFtZSBcIiVzXCIgc2hvdWxkIGhhdmUgYmVlbiB2YWxpZFxuIiwgdmFsaWRfdW5pcXVlX25hbWVzW2ldKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnZhbGlkIHVuaXF1ZSBuYW1lIik7CisgICAgICAgIH0KKworICAgICAgKytpOworICAgIH0KKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAoaW50KSBfREJVU19OX0VMRU1FTlRTIChpbnZhbGlkX3VuaXF1ZV9uYW1lcykpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIGludmFsaWRfdW5pcXVlX25hbWVzW2ldKTsKKworICAgICAgaWYgKF9kYnVzX3ZhbGlkYXRlX2J1c19uYW1lICgmc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkJ1cyBuYW1lIFwiJXNcIiBzaG91bGQgaGF2ZSBiZWVuIGludmFsaWRcbiIsIGludmFsaWRfdW5pcXVlX25hbWVzW2ldKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ2YWxpZCB1bmlxdWUgbmFtZSIpOworICAgICAgICB9CisKKyAgICAgICsraTsKKyAgICB9CisKKworICAvKiBFcnJvciBuYW1lIHZhbGlkYXRpb24gKGN1cnJlbnRseSBpZGVudGljYWwgdG8gaW50ZXJmYWNlcykKKyAgICovCisgIGkgPSAwOworICB3aGlsZSAoaSA8IChpbnQpIF9EQlVTX05fRUxFTUVOVFMgKHZhbGlkX2ludGVyZmFjZXMpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCB2YWxpZF9pbnRlcmZhY2VzW2ldKTsKKworICAgICAgaWYgKCFfZGJ1c192YWxpZGF0ZV9lcnJvcl9uYW1lICgmc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkVycm9yIG5hbWUgXCIlc1wiIHNob3VsZCBoYXZlIGJlZW4gdmFsaWRcbiIsIHZhbGlkX2ludGVyZmFjZXNbaV0pOworICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImludmFsaWQgZXJyb3IgbmFtZSIpOworICAgICAgICB9CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgKGludCkgX0RCVVNfTl9FTEVNRU5UUyAoaW52YWxpZF9pbnRlcmZhY2VzKSkKKyAgICB7CisgICAgICBpZiAoaW52YWxpZF9pbnRlcmZhY2VzW2ldWzBdICE9ICc6JykKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBpbnZhbGlkX2ludGVyZmFjZXNbaV0pOworCisgICAgICAgICAgaWYgKF9kYnVzX3ZhbGlkYXRlX2Vycm9yX25hbWUgKCZzdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJFcnJvciBuYW1lIFwiJXNcIiBzaG91bGQgaGF2ZSBiZWVuIGludmFsaWRcbiIsIGludmFsaWRfaW50ZXJmYWNlc1tpXSk7CisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInZhbGlkIGVycm9yIG5hbWUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIC8qIE1lbWJlciB2YWxpZGF0aW9uICovCisgIGkgPSAwOworICB3aGlsZSAoaSA8IChpbnQpIF9EQlVTX05fRUxFTUVOVFMgKHZhbGlkX21lbWJlcnMpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCB2YWxpZF9tZW1iZXJzW2ldKTsKKworICAgICAgaWYgKCFfZGJ1c192YWxpZGF0ZV9tZW1iZXIgKCZzdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJNZW1iZXIgXCIlc1wiIHNob3VsZCBoYXZlIGJlZW4gdmFsaWRcbiIsIHZhbGlkX21lbWJlcnNbaV0pOworICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImludmFsaWQgbWVtYmVyIik7CisgICAgICAgIH0KKworICAgICAgKytpOworICAgIH0KKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAoaW50KSBfREJVU19OX0VMRU1FTlRTIChpbnZhbGlkX21lbWJlcnMpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBpbnZhbGlkX21lbWJlcnNbaV0pOworCisgICAgICBpZiAoX2RidXNfdmFsaWRhdGVfbWVtYmVyICgmc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJNZW1iZXIgXCIlc1wiIHNob3VsZCBoYXZlIGJlZW4gaW52YWxpZFxuIiwgaW52YWxpZF9tZW1iZXJzW2ldKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ2YWxpZCBtZW1iZXIiKTsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIC8qIFNpZ25hdHVyZSB2YWxpZGF0aW9uICovCisgIGkgPSAwOworICB3aGlsZSAoaSA8IChpbnQpIF9EQlVTX05fRUxFTUVOVFMgKHZhbGlkX3NpZ25hdHVyZXMpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCB2YWxpZF9zaWduYXR1cmVzW2ldKTsKKworICAgICAgaWYgKCFfZGJ1c192YWxpZGF0ZV9zaWduYXR1cmUgKCZzdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJTaWduYXR1cmUgXCIlc1wiIHNob3VsZCBoYXZlIGJlZW4gdmFsaWRcbiIsIHZhbGlkX3NpZ25hdHVyZXNbaV0pOworICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImludmFsaWQgc2lnbmF0dXJlIik7CisgICAgICAgIH0KKworICAgICAgKytpOworICAgIH0KKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAoaW50KSBfREJVU19OX0VMRU1FTlRTIChpbnZhbGlkX3NpZ25hdHVyZXMpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBpbnZhbGlkX3NpZ25hdHVyZXNbaV0pOworCisgICAgICBpZiAoX2RidXNfdmFsaWRhdGVfc2lnbmF0dXJlICgmc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJTaWduYXR1cmUgXCIlc1wiIHNob3VsZCBoYXZlIGJlZW4gaW52YWxpZFxuIiwgaW52YWxpZF9zaWduYXR1cmVzW2ldKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ2YWxpZCBzaWduYXR1cmUiKTsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIC8qIFZhbGlkYXRlIGNsYWltZWQgbGVuZ3RoIGxvbmdlciB0aGFuIHJlYWwgbGVuZ3RoICovCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCAiYWJjLmVmZyIpOworICBpZiAoX2RidXNfdmFsaWRhdGVfYnVzX25hbWUgKCZzdHIsIDAsIDgpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInZhbGlkYXRlZCB0b28tbG9uZyBzdHJpbmciKTsKKyAgaWYgKF9kYnVzX3ZhbGlkYXRlX2ludGVyZmFjZSAoJnN0ciwgMCwgOCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidmFsaWRhdGVkIHRvby1sb25nIHN0cmluZyIpOworICBpZiAoX2RidXNfdmFsaWRhdGVfZXJyb3JfbmFtZSAoJnN0ciwgMCwgOCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidmFsaWRhdGVkIHRvby1sb25nIHN0cmluZyIpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCAiYWJjIik7CisgIGlmIChfZGJ1c192YWxpZGF0ZV9tZW1iZXIgKCZzdHIsIDAsIDQpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInZhbGlkYXRlZCB0b28tbG9uZyBzdHJpbmciKTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgInNzcyIpOworICBpZiAoX2RidXNfdmFsaWRhdGVfc2lnbmF0dXJlICgmc3RyLCAwLCA0KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ2YWxpZGF0ZWQgdG9vLWxvbmcgc2lnbmF0dXJlIik7CisKKyAgLyogVmFsaWRhdGUgc3RyaW5nIGV4Y2VlZGluZyBtYXggbmFtZSBsZW5ndGggKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgd2hpbGUgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA8PSBEQlVTX01BWElNVU1fTkFNRV9MRU5HVEgpCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiYWJjLmRlZiIpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgaWYgKF9kYnVzX3ZhbGlkYXRlX2J1c19uYW1lICgmc3RyLCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInZhbGlkYXRlZCBvdmVybWF4IHN0cmluZyIpOworICBpZiAoX2RidXNfdmFsaWRhdGVfaW50ZXJmYWNlICgmc3RyLCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInZhbGlkYXRlZCBvdmVybWF4IHN0cmluZyIpOworICBpZiAoX2RidXNfdmFsaWRhdGVfZXJyb3JfbmFtZSAoJnN0ciwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ2YWxpZGF0ZWQgb3Zlcm1heCBzdHJpbmciKTsKKworICAvKiBvdmVybG9uZyBtZW1iZXIgKi8KKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZzdHIsIDApOworICB3aGlsZSAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpIDw9IERCVVNfTUFYSU1VTV9OQU1FX0xFTkdUSCkKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICJhYmMiKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGlmIChfZGJ1c192YWxpZGF0ZV9tZW1iZXIgKCZzdHIsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidmFsaWRhdGVkIG92ZXJtYXggc3RyaW5nIik7CisKKyAgLyogb3ZlcmxvbmcgdW5pcXVlIG5hbWUgKi8KKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZzdHIsIDApOworICBfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiOiIpOworICB3aGlsZSAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpIDw9IERCVVNfTUFYSU1VTV9OQU1FX0xFTkdUSCkKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICJhYmMiKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGlmIChfZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAoJnN0ciwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ2YWxpZGF0ZWQgb3Zlcm1heCBzdHJpbmciKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisKKyAgLyogQm9keSB2YWxpZGF0aW9uOyB0ZXN0IGJhc2ljIHZhbGlkYXRpb24gb2YgdmFsaWQgYm9kaWVzIGZvciBib3RoIGVuZGlhbiAqLworICAKKyAgeworICAgIGludCBzZXF1ZW5jZTsKKyAgICBEQnVzU3RyaW5nIHNpZ25hdHVyZTsKKyAgICBEQnVzU3RyaW5nIGJvZHk7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc2lnbmF0dXJlKSB8fCAhX2RidXNfc3RyaW5nX2luaXQgKCZib2R5KSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgICAgc2VxdWVuY2UgPSAwOworICAgIHdoaWxlIChkYnVzX2ludGVybmFsX2RvX25vdF91c2VfZ2VuZXJhdGVfYm9kaWVzIChzZXF1ZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19MSVRUTEVfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2lnbmF0dXJlLCAmYm9keSkpCisgICAgICB7CisgICAgICAgIERCdXNWYWxpZGl0eSB2YWxpZGl0eTsKKworICAgICAgICB2YWxpZGl0eSA9IF9kYnVzX3ZhbGlkYXRlX2JvZHlfd2l0aF9yZWFzb24gKCZzaWduYXR1cmUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19MSVRUTEVfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZib2R5LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYm9keSkpOworICAgICAgICBpZiAodmFsaWRpdHkgIT0gREJVU19WQUxJRCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c193YXJuICgiaW52YWxpZCBjb2RlICVkIGV4cGVjdGVkIHZhbGlkIG9uIHNlcXVlbmNlICVkIGxpdHRsZSBlbmRpYW5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGl0eSwgc2VxdWVuY2UpOworICAgICAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZzaWduYXR1cmUsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc2lnbmF0dXJlKSk7CisgICAgICAgICAgICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJmJvZHksIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYm9keSkpOworICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidGVzdCBmYWlsZWQiKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZzaWduYXR1cmUsIDApOworICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmJvZHksIDApOworICAgICAgICArK3NlcXVlbmNlOworICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBzZXF1ZW5jZSA9IDA7CisgICAgd2hpbGUgKGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9nZW5lcmF0ZV9ib2RpZXMgKHNlcXVlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0JJR19FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWduYXR1cmUsICZib2R5KSkKKyAgICAgIHsKKyAgICAgICAgREJ1c1ZhbGlkaXR5IHZhbGlkaXR5OworCisgICAgICAgIHZhbGlkaXR5ID0gX2RidXNfdmFsaWRhdGVfYm9keV93aXRoX3JlYXNvbiAoJnNpZ25hdHVyZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0JJR19FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJmJvZHksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZib2R5KSk7CisgICAgICAgIGlmICh2YWxpZGl0eSAhPSBEQlVTX1ZBTElEKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJpbnZhbGlkIGNvZGUgJWQgZXhwZWN0ZWQgdmFsaWQgb24gc2VxdWVuY2UgJWQgYmlnIGVuZGlhblxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkaXR5LCBzZXF1ZW5jZSk7CisgICAgICAgICAgICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJnNpZ25hdHVyZSwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzaWduYXR1cmUpKTsKKyAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmYm9keSwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZib2R5KSk7CisgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ0ZXN0IGZhaWxlZCIpOworICAgICAgICAgIH0KKworICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJnNpZ25hdHVyZSwgMCk7CisgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmYm9keSwgMCk7CisgICAgICAgICsrc2VxdWVuY2U7CisgICAgICB9CisKKyAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNpZ25hdHVyZSk7CisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZib2R5KTsKKyAgfQorICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiAhRE9YWUdFTl9TSE9VTERfU0tJUF9USElTICovCisKKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmMgYi9kYnVzL2RidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE4N2EzZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLW1hcnNoYWwtdmFsaWRhdGUuYwpAQCAtMCwwICsxLDEyNTkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmMgVmFsaWRhdGlvbiByb3V0aW5lcyBmb3IgbWFyc2hhbGVkIGRhdGEKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1iYXNpYy5oIgorI2luY2x1ZGUgImRidXMtc2lnbmF0dXJlLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzTWFyc2hhbAorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBWZXJpZmllcyB0aGF0IHRoZSByYW5nZSBvZiB0eXBlX3N0ciBmcm9tIHR5cGVfcG9zIHRvIHR5cGVfZW5kIGlzIGEKKyAqIHZhbGlkIHNpZ25hdHVyZS4gIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAjVFJVRSwgaXQgd2lsbCBiZSBzYWZlCisgKiB0byBpdGVyYXRlIG92ZXIgdGhlIHNpZ25hdHVyZSB3aXRoIGEgdHlwZXMtb25seSAjREJ1c1R5cGVSZWFkZXIuCisgKiBUaGUgcmFuZ2UgcGFzc2VkIGluIHNob3VsZCBOT1QgaW5jbHVkZSB0aGUgdGVybWluYXRpbmcKKyAqIG51bC9EQlVTX1RZUEVfSU5WQUxJRC4KKyAqCisgKiBAcGFyYW0gdHlwZV9zdHIgdGhlIHN0cmluZworICogQHBhcmFtIHR5cGVfcG9zIHdoZXJlIHRoZSB0eXBlY29kZXMgc3RhcnQKKyAqIEBwYXJhbSBsZW4gbGVuZ3RoIG9mIHR5cGVjb2RlcworICogQHJldHVybnMgI0RCVVNfVkFMSUQgaWYgdmFsaWQsIHJlYXNvbiB3aHkgaW52YWxpZCBvdGhlcndpc2UKKyAqLworREJ1c1ZhbGlkaXR5CitfZGJ1c192YWxpZGF0ZV9zaWduYXR1cmVfd2l0aF9yZWFzb24gKGNvbnN0IERCdXNTdHJpbmcgKnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICB0eXBlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICplbmQ7CisgIGludCBsYXN0OworICBpbnQgc3RydWN0X2RlcHRoOworICBpbnQgYXJyYXlfZGVwdGg7CisgIGludCBkaWN0X2VudHJ5X2RlcHRoOworICBEQnVzVmFsaWRpdHkgcmVzdWx0OworCisgIGludCBlbGVtZW50X2NvdW50OworICBEQnVzTGlzdCAqZWxlbWVudF9jb3VudF9zdGFjazsKKworICByZXN1bHQgPSBEQlVTX1ZBTElEOworICBlbGVtZW50X2NvdW50X3N0YWNrID0gTlVMTDsKKworICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmZWxlbWVudF9jb3VudF9zdGFjaywgX0RCVVNfSU5UX1RPX1BPSU5URVIgKDApKSkKKyAgICB7CisgICAgICByZXN1bHQgPSBEQlVTX1ZBTElESVRZX1VOS05PV05fT09NX0VSUk9SOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAodHlwZV9zdHIgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAodHlwZV9wb3MgPCBfREJVU19JTlQzMl9NQVggLSBsZW4pOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0ICh0eXBlX3BvcyA+PSAwKTsKKworICBpZiAobGVuID4gREJVU19NQVhJTVVNX1NJR05BVFVSRV9MRU5HVEgpCisgICAgeworICAgICAgcmVzdWx0ID0gREJVU19JTlZBTElEX1NJR05BVFVSRV9UT09fTE9ORzsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBwID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAodHlwZV9zdHIsIHR5cGVfcG9zLCAwKTsKKworICBlbmQgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuICh0eXBlX3N0ciwgdHlwZV9wb3MgKyBsZW4sIDApOworICBzdHJ1Y3RfZGVwdGggPSAwOworICBhcnJheV9kZXB0aCA9IDA7CisgIGRpY3RfZW50cnlfZGVwdGggPSAwOworICBsYXN0ID0gREJVU19UWVBFX0lOVkFMSUQ7CisKKyAgd2hpbGUgKHAgIT0gZW5kKQorICAgIHsKKyAgICAgIHN3aXRjaCAoKnApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfQllURToKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfQk9PTEVBTjoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgICAgIGNhc2UgREJVU19UWVBFX1VJTlQxNjoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfSU5UMzI6CisgICAgICAgIGNhc2UgREJVU19UWVBFX1VJTlQzMjoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfVU5JWF9GRDoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfSU5UNjQ6CisgICAgICAgIGNhc2UgREJVU19UWVBFX1VJTlQ2NDoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfRE9VQkxFOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9TVFJJTkc6CisgICAgICAgIGNhc2UgREJVU19UWVBFX09CSkVDVF9QQVRIOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9TSUdOQVRVUkU6CisgICAgICAgIGNhc2UgREJVU19UWVBFX1ZBUklBTlQ6CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfQVJSQVk6CisgICAgICAgICAgYXJyYXlfZGVwdGggKz0gMTsKKyAgICAgICAgICBpZiAoYXJyYXlfZGVwdGggPiBEQlVTX01BWElNVU1fVFlQRV9SRUNVUlNJT05fREVQVEgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlc3VsdCA9IERCVVNfSU5WQUxJRF9FWENFRURFRF9NQVhJTVVNX0FSUkFZX1JFQ1VSU0lPTjsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEQlVTX1NUUlVDVF9CRUdJTl9DSEFSOgorICAgICAgICAgIHN0cnVjdF9kZXB0aCArPSAxOworCisgICAgICAgICAgaWYgKHN0cnVjdF9kZXB0aCA+IERCVVNfTUFYSU1VTV9UWVBFX1JFQ1VSU0lPTl9ERVBUSCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVzdWx0ID0gREJVU19JTlZBTElEX0VYQ0VFREVEX01BWElNVU1fU1RSVUNUX1JFQ1VSU0lPTjsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmVsZW1lbnRfY291bnRfc3RhY2ssIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19JTlRfVE9fUE9JTlRFUiAoMCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXN1bHQgPSBEQlVTX1ZBTElESVRZX1VOS05PV05fT09NX0VSUk9SOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgREJVU19TVFJVQ1RfRU5EX0NIQVI6CisgICAgICAgICAgaWYgKHN0cnVjdF9kZXB0aCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXN1bHQgPSBEQlVTX0lOVkFMSURfU1RSVUNUX0VOREVEX0JVVF9OT1RfU1RBUlRFRDsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAobGFzdCA9PSBEQlVTX1NUUlVDVF9CRUdJTl9DSEFSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXN1bHQgPSBEQlVTX0lOVkFMSURfU1RSVUNUX0hBU19OT19GSUVMRFM7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgX2RidXNfbGlzdF9wb3BfbGFzdCAoJmVsZW1lbnRfY291bnRfc3RhY2spOworCisgICAgICAgICAgc3RydWN0X2RlcHRoIC09IDE7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUjoKKyAgICAgICAgICBpZiAobGFzdCAhPSBEQlVTX1RZUEVfQVJSQVkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlc3VsdCA9IERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX05PVF9JTlNJREVfQVJSQVk7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgZGljdF9lbnRyeV9kZXB0aCArPSAxOworCisgICAgICAgICAgaWYgKGRpY3RfZW50cnlfZGVwdGggPiBEQlVTX01BWElNVU1fVFlQRV9SRUNVUlNJT05fREVQVEgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlc3VsdCA9IERCVVNfSU5WQUxJRF9FWENFRURFRF9NQVhJTVVNX0RJQ1RfRU5UUllfUkVDVVJTSU9OOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZlbGVtZW50X2NvdW50X3N0YWNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfSU5UX1RPX1BPSU5URVIgKDApKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVzdWx0ID0gREJVU19WQUxJRElUWV9VTktOT1dOX09PTV9FUlJPUjsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUjoKKyAgICAgICAgICBpZiAoZGljdF9lbnRyeV9kZXB0aCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXN1bHQgPSBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9FTkRFRF9CVVRfTk9UX1NUQVJURUQ7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgZGljdF9lbnRyeV9kZXB0aCAtPSAxOworCisgICAgICAgICAgZWxlbWVudF9jb3VudCA9IAorICAgICAgICAgICAgX0RCVVNfUE9JTlRFUl9UT19JTlQgKF9kYnVzX2xpc3RfcG9wX2xhc3QgKCZlbGVtZW50X2NvdW50X3N0YWNrKSk7CisKKyAgICAgICAgICBpZiAoZWxlbWVudF9jb3VudCAhPSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoZWxlbWVudF9jb3VudCA9PSAwKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX0hBU19OT19GSUVMRFM7CisgICAgICAgICAgICAgIGVsc2UgaWYgKGVsZW1lbnRfY291bnQgPT0gMSkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9IQVNfT05MWV9PTkVfRklFTEQ7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9IQVNfVE9PX01BTllfRklFTERTOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgCisgICAgICAgIGNhc2UgREJVU19UWVBFX1NUUlVDVDogICAgIC8qIGRvZXNuJ3QgYXBwZWFyIGluIHNpZ25hdHVyZXMgKi8KKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfRElDVF9FTlRSWTogLyogZGl0dG8gKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXN1bHQgPSBEQlVTX0lOVkFMSURfVU5LTk9XTl9UWVBFQ09ERTsKKwkgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmICgqcCAhPSBEQlVTX1RZUEVfQVJSQVkgJiYgCisgICAgICAgICAgKnAgIT0gREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVIgJiYgCisJICAqcCAhPSBEQlVTX1NUUlVDVF9CRUdJTl9DSEFSKSAKKyAgICAgICAgeworICAgICAgICAgIGVsZW1lbnRfY291bnQgPSAKKyAgICAgICAgICAgIF9EQlVTX1BPSU5URVJfVE9fSU5UIChfZGJ1c19saXN0X3BvcF9sYXN0ICgmZWxlbWVudF9jb3VudF9zdGFjaykpOworCisgICAgICAgICAgKytlbGVtZW50X2NvdW50OworCisgICAgICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmVsZW1lbnRfY291bnRfc3RhY2ssIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19JTlRfVE9fUE9JTlRFUiAoZWxlbWVudF9jb3VudCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXN1bHQgPSBEQlVTX1ZBTElESVRZX1VOS05PV05fT09NX0VSUk9SOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAoYXJyYXlfZGVwdGggPiAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCpwID09IERCVVNfVFlQRV9BUlJBWSAmJiBwICE9IGVuZCkKKyAgICAgICAgICAgIHsKKwkgICAgICAgY29uc3QgY2hhciAqcDE7CisJICAgICAgIHAxID0gcCArIDE7CisgICAgICAgICAgICAgICBpZiAoKnAxID09IERCVVNfU1RSVUNUX0VORF9DSEFSIHx8CisgICAgICAgICAgICAgICAgICAgKnAxID09IERCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUikKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IERCVVNfSU5WQUxJRF9NSVNTSU5HX0FSUkFZX0VMRU1FTlRfVFlQRTsKKyAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKwkgICAgeworICAgICAgICAgICAgICBhcnJheV9kZXB0aCA9IDA7CisJICAgIH0KKyAgICAgICAgfQorCisgICAgICBpZiAobGFzdCA9PSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUikKKyAgICAgICAgeworICAgICAgICAgIGlmICghKGRidXNfdHlwZV9pc192YWxpZCAoKnApICYmIGRidXNfdHlwZV9pc19iYXNpYyAoKnApKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVzdWx0ID0gREJVU19JTlZBTElEX0RJQ1RfS0VZX01VU1RfQkVfQkFTSUNfVFlQRTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgbGFzdCA9ICpwOworICAgICAgKytwOworICAgIH0KKworCisgIGlmIChhcnJheV9kZXB0aCA+IDApCisgICAgeworICAgICAgcmVzdWx0ID0gREJVU19JTlZBTElEX01JU1NJTkdfQVJSQVlfRUxFTUVOVF9UWVBFOworICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIAorICBpZiAoc3RydWN0X2RlcHRoID4gMCkKKyAgICB7CisgICAgICAgcmVzdWx0ID0gREJVU19JTlZBTElEX1NUUlVDVF9TVEFSVEVEX0JVVF9OT1RfRU5ERUQ7CisgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIAorICBpZiAoZGljdF9lbnRyeV9kZXB0aCA+IDApCisgICAgeworICAgICAgcmVzdWx0ID0gIERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX1NUQVJURURfQlVUX05PVF9FTkRFRDsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICAKKyAgX2RidXNfYXNzZXJ0IChsYXN0ICE9IERCVVNfVFlQRV9BUlJBWSk7CisgIF9kYnVzX2Fzc2VydCAobGFzdCAhPSBEQlVTX1NUUlVDVF9CRUdJTl9DSEFSKTsKKyAgX2RidXNfYXNzZXJ0IChsYXN0ICE9IERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSKTsKKworICByZXN1bHQgPSBEQlVTX1ZBTElEOworCitvdXQ6CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZlbGVtZW50X2NvdW50X3N0YWNrKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogbm90ZTogdGhpcyBmdW5jdGlvbiBpcyBhbHNvIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGhlYWRlcidzIHZhbHVlcywKKyAqIHNpbmNlIHRoZSBoZWFkZXIgaXMgYSB2YWxpZCBib2R5IHdpdGggYSBwYXJ0aWN1bGFyIHNpZ25hdHVyZS4KKyAqLworc3RhdGljIERCdXNWYWxpZGl0eQordmFsaWRhdGVfYm9keV9oZWxwZXIgKERCdXNUeXBlUmVhZGVyICAgICAgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgIHdhbGtfcmVhZGVyX3RvX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgdG90YWxfZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAgKnAsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICoqbmV3X3ApCit7CisgIGludCBjdXJyZW50X3R5cGU7CisKKyAgLyogVGhlIHNwZWMgYWxsb3dzIGFycmF5cyBhbmQgc3RydWN0cyB0byBlYWNoIG5lc3QgMzIsIGZvciB0b3RhbAorICAgKiBuZXN0aW5nIG9mIDIqMzIuIFdlIHdhbnQgdG8gaW1wb3NlIHRoZSBzYW1lIGxpbWl0IG9uICJkeW5hbWljIgorICAgKiB2YWx1ZSBuZXN0aW5nIChub3QgdmlzaWJsZSBpbiB0aGUgc2lnbmF0dXJlKSB3aGljaCBpcyBpbnRyb2R1Y2VkCisgICAqIGJ5IERCVVNfVFlQRV9WQVJJQU5ULgorICAgKi8KKyAgaWYgKHRvdGFsX2RlcHRoID4gKERCVVNfTUFYSU1VTV9UWVBFX1JFQ1VSU0lPTl9ERVBUSCAqIDIpKQorICAgIHsKKyAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfTkVTVEVEX1RPT19ERUVQTFk7CisgICAgfQorCisgIHdoaWxlICgoY3VycmVudF90eXBlID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAocmVhZGVyKSkgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgeworICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYTsKKyAgICAgIGludCBhbGlnbm1lbnQ7CisKKyNpZiAwCisgICAgICBfZGJ1c192ZXJib3NlICgiICAgdmFsaWRhdGluZyB2YWx1ZSBvZiB0eXBlICVzIHR5cGUgcmVhZGVyICVwIHR5cGVfcG9zICVkIHAgJXAgZW5kICVwICVkIHJlbWFpblxuIiwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChjdXJyZW50X3R5cGUpLCByZWFkZXIsIHJlYWRlci0+dHlwZV9wb3MsIHAsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgIChpbnQpIChlbmQgLSBwKSk7CisjZW5kaWYKKworICAgICAgLyogR3VhcmFudGVlIHRoYXQgcCBoYXMgb25lIGJ5dGUgdG8gbG9vayBhdCAqLworICAgICAgaWYgKHAgPT0gZW5kKQorICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX05PVF9FTk9VR0hfREFUQTsKKworICAgICAgc3dpdGNoIChjdXJyZW50X3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfQllURToKKyAgICAgICAgICArK3A7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfQk9PTEVBTjoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgICAgIGNhc2UgREJVU19UWVBFX1VJTlQxNjoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfSU5UMzI6CisgICAgICAgIGNhc2UgREJVU19UWVBFX1VJTlQzMjoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfVU5JWF9GRDoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfSU5UNjQ6CisgICAgICAgIGNhc2UgREJVU19UWVBFX1VJTlQ2NDoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfRE9VQkxFOgorICAgICAgICAgIGFsaWdubWVudCA9IF9kYnVzX3R5cGVfZ2V0X2FsaWdubWVudCAoY3VycmVudF90eXBlKTsKKyAgICAgICAgICBhID0gX0RCVVNfQUxJR05fQUREUkVTUyAocCwgYWxpZ25tZW50KTsKKyAgICAgICAgICBpZiAoYSA+PSBlbmQpCisgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX05PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgICB3aGlsZSAocCAhPSBhKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoKnAgIT0gJ1wwJykKKyAgICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX0FMSUdOTUVOVF9QQURESU5HX05PVF9OVUw7CisgICAgICAgICAgICAgICsrcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoY3VycmVudF90eXBlID09IERCVVNfVFlQRV9CT09MRUFOKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90IHYgPSBfZGJ1c191bnBhY2tfdWludDMyIChieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKTsKKyAgICAgICAgICAgICAgaWYgKCEodiA9PSAwIHx8IHYgPT0gMSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9CT09MRUFOX05PVF9aRVJPX09SX09ORTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBwICs9IGFsaWdubWVudDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERCVVNfVFlQRV9BUlJBWToKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfU1RSSU5HOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9PQkpFQ1RfUEFUSDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX3VpbnQzMl90IGNsYWltZWRfbGVuOworCisgICAgICAgICAgICBhID0gX0RCVVNfQUxJR05fQUREUkVTUyAocCwgNCk7CisgICAgICAgICAgICBpZiAoYSArIDQgPiBlbmQpCisgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfTk9UX0VOT1VHSF9EQVRBOworICAgICAgICAgICAgd2hpbGUgKHAgIT0gYSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgqcCAhPSAnXDAnKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9BTElHTk1FTlRfUEFERElOR19OT1RfTlVMOworICAgICAgICAgICAgICAgICsrcDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGFpbWVkX2xlbiA9IF9kYnVzX3VucGFja191aW50MzIgKGJ5dGVfb3JkZXIsIHApOworICAgICAgICAgICAgcCArPSA0OworCisgICAgICAgICAgICAvKiBwIG1heSBub3cgYmUgPT0gZW5kICovCisgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKHAgPD0gZW5kKTsKKworICAgICAgICAgICAgaWYgKGN1cnJlbnRfdHlwZSA9PSBEQlVTX1RZUEVfQVJSQVkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYXJyYXlfZWxlbV90eXBlID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2VsZW1lbnRfdHlwZSAocmVhZGVyKTsKKworICAgICAgICAgICAgICAgIGlmICghZGJ1c190eXBlX2lzX3ZhbGlkIChhcnJheV9lbGVtX3R5cGUpKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX1VOS05PV05fVFlQRUNPREU7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhbGlnbm1lbnQgPSBfZGJ1c190eXBlX2dldF9hbGlnbm1lbnQgKGFycmF5X2VsZW1fdHlwZSk7CisKKyAgICAgICAgICAgICAgICBhID0gX0RCVVNfQUxJR05fQUREUkVTUyAocCwgYWxpZ25tZW50KTsKKworICAgICAgICAgICAgICAgIC8qIGEgbWF5IG5vdyBiZSA9PSBlbmQgKi8KKyAgICAgICAgICAgICAgICBpZiAoYSA+IGVuZCkKKyAgICAgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfTk9UX0VOT1VHSF9EQVRBOworCisgICAgICAgICAgICAgICAgd2hpbGUgKHAgIT0gYSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpwICE9ICdcMCcpCisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9BTElHTk1FTlRfUEFERElOR19OT1RfTlVMOworICAgICAgICAgICAgICAgICAgICArK3A7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNsYWltZWRfbGVuID4gKHVuc2lnbmVkIGxvbmcpIChlbmQgLSBwKSkKKyAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9MRU5HVEhfT1VUX09GX0JPVU5EUzsKKworICAgICAgICAgICAgaWYgKGN1cnJlbnRfdHlwZSA9PSBEQlVTX1RZUEVfT0JKRUNUX1BBVEgpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQnVzU3RyaW5nIHN0cjsKKyAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4gKCZzdHIsIHAsIGNsYWltZWRfbGVuKTsKKyAgICAgICAgICAgICAgICBpZiAoIV9kYnVzX3ZhbGlkYXRlX3BhdGggKCZzdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9CQURfUEFUSDsKKworICAgICAgICAgICAgICAgIHAgKz0gY2xhaW1lZF9sZW47CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRfdHlwZSA9PSBEQlVTX1RZUEVfU1RSSU5HKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJ1c1N0cmluZyBzdHI7CisgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3RfbGVuICgmc3RyLCBwLCBjbGFpbWVkX2xlbik7CisgICAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfdmFsaWRhdGVfdXRmOCAoJnN0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9CQURfVVRGOF9JTl9TVFJJTkc7CisKKyAgICAgICAgICAgICAgICBwICs9IGNsYWltZWRfbGVuOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50X3R5cGUgPT0gREJVU19UWVBFX0FSUkFZICYmIGNsYWltZWRfbGVuID4gMCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyIHN1YjsKKyAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgdmFsaWRpdHk7CisgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYXJyYXlfZW5kOworICAgICAgICAgICAgICAgIGludCBhcnJheV9lbGVtX3R5cGU7CisKKyAgICAgICAgICAgICAgICBpZiAoY2xhaW1lZF9sZW4gPiBEQlVTX01BWElNVU1fQVJSQVlfTEVOR1RIKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9BUlJBWV9MRU5HVEhfRVhDRUVEU19NQVhJTVVNOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8qIFJlbWVtYmVyIHRoYXQgdGhlIHJlYWRlciBpcyB0eXBlcyBvbmx5LCBzbyB3ZSBjYW4ndAorICAgICAgICAgICAgICAgICAqIHVzZSBpdCB0byBpdGVyYXRlIG92ZXIgZWxlbWVudHMuIEl0IHN0YXlzIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgICogZm9yIGFsbCBlbGVtZW50cy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlIChyZWFkZXIsICZzdWIpOworCisgICAgICAgICAgICAgICAgYXJyYXlfZW5kID0gcCArIGNsYWltZWRfbGVuOworCisgICAgICAgICAgICAgICAgYXJyYXlfZWxlbV90eXBlID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2VsZW1lbnRfdHlwZSAocmVhZGVyKTsKKworICAgICAgICAgICAgICAgIC8qIGF2b2lkIHJlY3Vyc2l2ZSBjYWxsIHRvIHZhbGlkYXRlX2JvZHlfaGVscGVyIGlmIHRoaXMgaXMgYW4gYXJyYXkKKyAgICAgICAgICAgICAgICAgKiBvZiBmaXhlZC1zaXplIGVsZW1lbnRzCisgICAgICAgICAgICAgICAgICovIAorICAgICAgICAgICAgICAgIGlmIChkYnVzX3R5cGVfaXNfZml4ZWQgKGFycmF5X2VsZW1fdHlwZSkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIGJvb2xzIG5lZWQgdG8gYmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgYmVjYXVzZSB0aGV5IGNhbgorICAgICAgICAgICAgICAgICAgICAgKiBoYXZlIGFuIGludmFsaWQgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmIChhcnJheV9lbGVtX3R5cGUgPT0gREJVU19UWVBFX0JPT0xFQU4pCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCB2OworICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50ID0gX2RidXNfdHlwZV9nZXRfYWxpZ25tZW50IChhcnJheV9lbGVtX3R5cGUpOworCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocCA8IGFycmF5X2VuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBfZGJ1c191bnBhY2tfdWludDMyIChieXRlX29yZGVyLCBwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHYgPT0gMCB8fCB2ID09IDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9CT09MRUFOX05PVF9aRVJPX09SX09ORTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgKz0gYWxpZ25tZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwID0gYXJyYXlfZW5kOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHAgPCBhcnJheV9lbmQpCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHkgPSB2YWxpZGF0ZV9ib2R5X2hlbHBlciAoJnN1YiwgYnl0ZV9vcmRlciwgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9kZXB0aCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLCBlbmQsICZwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGl0eSAhPSBEQlVTX1ZBTElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRpdHk7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHAgIT0gYXJyYXlfZW5kKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9BUlJBWV9MRU5HVEhfSU5DT1JSRUNUOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGNoZWNrIG51bCB0ZXJtaW5hdGlvbiAqLworICAgICAgICAgICAgaWYgKGN1cnJlbnRfdHlwZSAhPSBEQlVTX1RZUEVfQVJSQVkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocCA9PSBlbmQpCisgICAgICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX05PVF9FTk9VR0hfREFUQTsKKworICAgICAgICAgICAgICAgIGlmICgqcCAhPSAnXDAnKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9TVFJJTkdfTUlTU0lOR19OVUw7CisgICAgICAgICAgICAgICAgKytwOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgREJVU19UWVBFX1NJR05BVFVSRToKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX3VpbnQzMl90IGNsYWltZWRfbGVuOworICAgICAgICAgICAgREJ1c1N0cmluZyBzdHI7CisgICAgICAgICAgICBEQnVzVmFsaWRpdHkgdmFsaWRpdHk7CisKKyAgICAgICAgICAgIGNsYWltZWRfbGVuID0gKnA7CisgICAgICAgICAgICArK3A7CisKKyAgICAgICAgICAgIC8qIDEgaXMgZm9yIG51bCB0ZXJtaW5hdGlvbiAqLworICAgICAgICAgICAgaWYgKGNsYWltZWRfbGVuICsgMSA+ICh1bnNpZ25lZCBsb25nKSAoZW5kIC0gcCkpCisgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfU0lHTkFUVVJFX0xFTkdUSF9PVVRfT0ZfQk9VTkRTOworCisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4gKCZzdHIsIHAsIGNsYWltZWRfbGVuKTsKKyAgICAgICAgICAgIHZhbGlkaXR5ID0KKyAgICAgICAgICAgICAgX2RidXNfdmFsaWRhdGVfc2lnbmF0dXJlX3dpdGhfcmVhc29uICgmc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSk7CisKKyAgICAgICAgICAgIGlmICh2YWxpZGl0eSAhPSBEQlVTX1ZBTElEKQorICAgICAgICAgICAgICByZXR1cm4gdmFsaWRpdHk7CisKKyAgICAgICAgICAgIHAgKz0gY2xhaW1lZF9sZW47CisKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAocCA8IGVuZCk7CisgICAgICAgICAgICBpZiAoKnAgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfU0lHTkFUVVJFX01JU1NJTkdfTlVMOworCisgICAgICAgICAgICArK3A7CisKKyAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJwID0gJXAgZW5kID0gJXAgY2xhaW1lZF9sZW4gJXVcbiIsIHAsIGVuZCwgY2xhaW1lZF9sZW4pOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERCVVNfVFlQRV9WQVJJQU5UOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDEgYnl0ZSBzaWcgbGVuLCBzaWcgdHlwZWNvZGVzLCBhbGlnbiB0bworICAgICAgICAgICAgICogY29udGFpbmVkLXR5cGUtYm91bmRhcnksIHZhbHVlcy4KKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAvKiBJbiBhZGRpdGlvbiB0byBub3JtYWwgc2lnbmF0dXJlIHZhbGlkYXRpb24sIHdlIG5lZWQgdG8gYmUgc3VyZQorICAgICAgICAgICAgICogdGhlIHNpZ25hdHVyZSBjb250YWlucyBvbmx5IGEgc2luZ2xlIChwb3NzaWJseSBjb250YWluZXIpIHR5cGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGRidXNfdWludDMyX3QgY2xhaW1lZF9sZW47CisgICAgICAgICAgICBEQnVzU3RyaW5nIHNpZzsKKyAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyIHN1YjsKKyAgICAgICAgICAgIERCdXNWYWxpZGl0eSB2YWxpZGl0eTsKKyAgICAgICAgICAgIGludCBjb250YWluZWRfYWxpZ25tZW50OworICAgICAgICAgICAgaW50IGNvbnRhaW5lZF90eXBlOworICAgICAgICAgICAgREJ1c1ZhbGlkaXR5IHJlYXNvbjsKKworICAgICAgICAgICAgY2xhaW1lZF9sZW4gPSAqcDsKKyAgICAgICAgICAgICsrcDsKKworICAgICAgICAgICAgLyogKyAxIGZvciBudWwgKi8KKyAgICAgICAgICAgIGlmIChjbGFpbWVkX2xlbiArIDEgPiAodW5zaWduZWQgbG9uZykgKGVuZCAtIHApKQorICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX1ZBUklBTlRfU0lHTkFUVVJFX0xFTkdUSF9PVVRfT0ZfQk9VTkRTOworCisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4gKCZzaWcsIHAsIGNsYWltZWRfbGVuKTsKKyAgICAgICAgICAgIHJlYXNvbiA9IF9kYnVzX3ZhbGlkYXRlX3NpZ25hdHVyZV93aXRoX3JlYXNvbiAoJnNpZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnNpZykpOworICAgICAgICAgICAgaWYgKCEocmVhc29uID09IERCVVNfVkFMSUQpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHJlYXNvbiA9PSBEQlVTX1ZBTElESVRZX1VOS05PV05fT09NX0VSUk9SKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYXNvbjsKKyAgICAgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9WQVJJQU5UX1NJR05BVFVSRV9CQUQ7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcCArPSBjbGFpbWVkX2xlbjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCpwICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX1ZBUklBTlRfU0lHTkFUVVJFX01JU1NJTkdfTlVMOworICAgICAgICAgICAgKytwOworCisgICAgICAgICAgICBjb250YWluZWRfdHlwZSA9IF9kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlICgmc2lnLCAwKTsKKyAgICAgICAgICAgIGlmIChjb250YWluZWRfdHlwZSA9PSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9WQVJJQU5UX1NJR05BVFVSRV9FTVBUWTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY29udGFpbmVkX2FsaWdubWVudCA9IF9kYnVzX3R5cGVfZ2V0X2FsaWdubWVudCAoY29udGFpbmVkX3R5cGUpOworICAgICAgICAgICAgCisgICAgICAgICAgICBhID0gX0RCVVNfQUxJR05fQUREUkVTUyAocCwgY29udGFpbmVkX2FsaWdubWVudCk7CisgICAgICAgICAgICBpZiAoYSA+IGVuZCkKKyAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9OT1RfRU5PVUdIX0RBVEE7CisgICAgICAgICAgICB3aGlsZSAocCAhPSBhKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCpwICE9ICdcMCcpCisgICAgICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX0FMSUdOTUVOVF9QQURESU5HX05PVF9OVUw7CisgICAgICAgICAgICAgICAgKytwOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX2luaXRfdHlwZXNfb25seSAoJnN1YiwgJnNpZywgMCk7CisKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1YikgIT0gREJVU19UWVBFX0lOVkFMSUQpOworCisgICAgICAgICAgICB2YWxpZGl0eSA9IHZhbGlkYXRlX2JvZHlfaGVscGVyICgmc3ViLCBieXRlX29yZGVyLCBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2RlcHRoICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAsIGVuZCwgJnApOworICAgICAgICAgICAgaWYgKHZhbGlkaXR5ICE9IERCVVNfVkFMSUQpCisgICAgICAgICAgICAgIHJldHVybiB2YWxpZGl0eTsKKworICAgICAgICAgICAgaWYgKF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZzdWIpKQorICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX1ZBUklBTlRfU0lHTkFUVVJFX1NQRUNJRklFU19NVUxUSVBMRV9WQUxVRVM7CisKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1YikgPT0gREJVU19UWVBFX0lOVkFMSUQpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERCVVNfVFlQRV9ESUNUX0VOVFJZOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9TVFJVQ1Q6CisgICAgICAgICAgeworICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgc3ViOworICAgICAgICAgICAgREJ1c1ZhbGlkaXR5IHZhbGlkaXR5OworCisgICAgICAgICAgICBhID0gX0RCVVNfQUxJR05fQUREUkVTUyAocCwgOCk7CisgICAgICAgICAgICBpZiAoYSA+IGVuZCkKKyAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9OT1RfRU5PVUdIX0RBVEE7CisgICAgICAgICAgICB3aGlsZSAocCAhPSBhKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCpwICE9ICdcMCcpCisgICAgICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX0FMSUdOTUVOVF9QQURESU5HX05PVF9OVUw7CisgICAgICAgICAgICAgICAgKytwOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKHJlYWRlciwgJnN1Yik7CisKKyAgICAgICAgICAgIHZhbGlkaXR5ID0gdmFsaWRhdGVfYm9keV9oZWxwZXIgKCZzdWIsIGJ5dGVfb3JkZXIsIFRSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9kZXB0aCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLCBlbmQsICZwKTsKKyAgICAgICAgICAgIGlmICh2YWxpZGl0eSAhPSBEQlVTX1ZBTElEKQorICAgICAgICAgICAgICByZXR1cm4gdmFsaWRpdHk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW52YWxpZCB0eXBlY29kZSBpbiBzdXBwb3NlZGx5LXZhbGlkYXRlZCBzaWduYXR1cmUiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisjaWYgMAorICAgICAgX2RidXNfdmVyYm9zZSAoIiAgIHZhbGlkYXRlZCB2YWx1ZSBvZiB0eXBlICVzIHR5cGUgcmVhZGVyICVwIHR5cGVfcG9zICVkIHAgJXAgZW5kICVwICVkIHJlbWFpblxuIiwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChjdXJyZW50X3R5cGUpLCByZWFkZXIsIHJlYWRlci0+dHlwZV9wb3MsIHAsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgIChpbnQpIChlbmQgLSBwKSk7CisjZW5kaWYKKworICAgICAgaWYgKHAgPiBlbmQpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgibm90IGVub3VnaCBkYXRhISEhIHAgPSAlcCBlbmQgPSAlcCBlbmQtcCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHAsIGVuZCwgKGludCkgKGVuZCAtIHApKTsKKyAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX05PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgfQorCisgICAgICBpZiAod2Fsa19yZWFkZXJfdG9fZW5kKQorICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0IChyZWFkZXIpOworICAgICAgZWxzZQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgaWYgKG5ld19wKQorICAgICpuZXdfcCA9IHA7CisKKyAgcmV0dXJuIERCVVNfVkFMSUQ7Cit9CisKKy8qKgorICogVmVyaWZpZXMgdGhhdCB0aGUgcmFuZ2Ugb2YgdmFsdWVfc3RyIGZyb20gdmFsdWVfcG9zIHRvIHZhbHVlX2VuZCBpcworICogYSBsZWdpdGltYXRlIHZhbHVlIG9mIHR5cGUgZXhwZWN0ZWRfc2lnbmF0dXJlLiAgSWYgdGhpcyBmdW5jdGlvbgorICogcmV0dXJucyAjVFJVRSwgaXQgd2lsbCBiZSBzYWZlIHRvIGl0ZXJhdGUgb3ZlciB0aGUgdmFsdWVzIHdpdGgKKyAqICNEQnVzVHlwZVJlYWRlci4gVGhlIHNpZ25hdHVyZSBpcyBhc3N1bWVkIHRvIGJlIGFscmVhZHkgdmFsaWQuCisgKgorICogSWYgYnl0ZXNfcmVtYWluaW5nIGlzIG5vdCAjTlVMTCwgdGhlbiBsZWZ0b3ZlciBieXRlcyB3aWxsIGJlIHN0b3JlZAorICogdGhlcmUgYW5kICNEQlVTX1ZBTElEIHJldHVybmVkLiBJZiBpdCBpcyAjTlVMTCwgdGhlbgorICogI0RCVVNfSU5WQUxJRF9UT09fTVVDSF9EQVRBIHdpbGwgYmUgcmV0dXJuZWQgaWYgYnl0ZXMgYXJlIGxlZnQKKyAqIG92ZXIuCisgKgorICogQHBhcmFtIGV4cGVjdGVkX3NpZ25hdHVyZSB0aGUgZXhwZWN0ZWQgdHlwZXMgaW4gdGhlIHZhbHVlX3N0cgorICogQHBhcmFtIGV4cGVjdGVkX3NpZ25hdHVyZV9zdGFydCB3aGVyZSBpbiBleHBlY3RlZF9zaWduYXR1cmUgaXMgdGhlIHNpZ25hdHVyZQorICogQHBhcmFtIGJ5dGVfb3JkZXIgdGhlIGJ5dGUgb3JkZXIKKyAqIEBwYXJhbSBieXRlc19yZW1haW5pbmcgcGxhY2UgdG8gc3RvcmUgbGVmdG92ZXIgYnl0ZXMKKyAqIEBwYXJhbSB2YWx1ZV9zdHIgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBib2R5CisgKiBAcGFyYW0gdmFsdWVfcG9zIHdoZXJlIHRoZSB2YWx1ZXMgc3RhcnQKKyAqIEBwYXJhbSBsZW4gbGVuZ3RoIG9mIHZhbHVlcyBhZnRlciB2YWx1ZV9wb3MKKyAqIEByZXR1cm5zICNEQlVTX1ZBTElEIGlmIHZhbGlkLCByZWFzb24gd2h5IGludmFsaWQgb3RoZXJ3aXNlCisgKi8KK0RCdXNWYWxpZGl0eQorX2RidXNfdmFsaWRhdGVfYm9keV93aXRoX3JlYXNvbiAoY29uc3QgREJ1c1N0cmluZyAqZXhwZWN0ZWRfc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgZXhwZWN0ZWRfc2lnbmF0dXJlX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKmJ5dGVzX3JlbWFpbmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbikKK3sKKyAgREJ1c1R5cGVSZWFkZXIgcmVhZGVyOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICplbmQ7CisgIERCdXNWYWxpZGl0eSB2YWxpZGl0eTsKKworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0ICh2YWx1ZV9wb3MgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAodmFsdWVfcG9zIDw9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh2YWx1ZV9zdHIpIC0gbGVuKTsKKworICBfZGJ1c192ZXJib3NlICgidmFsaWRhdGluZyBib2R5IGZyb20gcG9zICVkIGxlbiAlZCBzaWcgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgdmFsdWVfcG9zLCBsZW4sIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKGV4cGVjdGVkX3NpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3NpZ25hdHVyZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9pbml0X3R5cGVzX29ubHkgKCZyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfc2lnbmF0dXJlLCBleHBlY3RlZF9zaWduYXR1cmVfc3RhcnQpOworCisgIHAgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuICh2YWx1ZV9zdHIsIHZhbHVlX3BvcywgbGVuKTsKKyAgZW5kID0gcCArIGxlbjsKKworICB2YWxpZGl0eSA9IHZhbGlkYXRlX2JvZHlfaGVscGVyICgmcmVhZGVyLCBieXRlX29yZGVyLCBUUlVFLCAwLCBwLCBlbmQsICZwKTsKKyAgaWYgKHZhbGlkaXR5ICE9IERCVVNfVkFMSUQpCisgICAgcmV0dXJuIHZhbGlkaXR5OworICAKKyAgaWYgKGJ5dGVzX3JlbWFpbmluZykKKyAgICB7CisgICAgICAqYnl0ZXNfcmVtYWluaW5nID0gZW5kIC0gcDsKKyAgICAgIHJldHVybiBEQlVTX1ZBTElEOworICAgIH0KKyAgZWxzZSBpZiAocCA8IGVuZCkKKyAgICByZXR1cm4gREJVU19JTlZBTElEX1RPT19NVUNIX0RBVEE7CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHAgPT0gZW5kKTsKKyAgICAgIHJldHVybiBEQlVTX1ZBTElEOworICAgIH0KK30KKworLyoqCisgKiBEZXRlcm1pbmUgd2V0aGVyIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgdmFsaWQgYXMgdGhlIGZpcnN0IGNoYXJhY3RlcgorICogaW4gYSBuYW1lLgorICovCisjZGVmaW5lIFZBTElEX0lOSVRJQUxfTkFNRV9DSEFSQUNURVIoYykgICAgICAgICBcCisgICggKChjKSA+PSAnQScgJiYgKGMpIDw9ICdaJykgfHwgICAgICAgICAgICAgICBcCisgICAgKChjKSA+PSAnYScgJiYgKGMpIDw9ICd6JykgfHwgICAgICAgICAgICAgICBcCisgICAgKChjKSA9PSAnXycpICkKKworLyoqCisgKiBEZXRlcm1pbmUgd2V0aGVyIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgdmFsaWQgYXMgYSBzZWNvbmQgb3IgbGF0ZXIKKyAqIGNoYXJhY3RlciBpbiBhIG5hbWUKKyAqLworI2RlZmluZSBWQUxJRF9OQU1FX0NIQVJBQ1RFUihjKSAgICAgICAgICAgICAgICAgXAorICAoICgoYykgPj0gJzAnICYmIChjKSA8PSAnOScpIHx8ICAgICAgICAgICAgICAgXAorICAgICgoYykgPj0gJ0EnICYmIChjKSA8PSAnWicpIHx8ICAgICAgICAgICAgICAgXAorICAgICgoYykgPj0gJ2EnICYmIChjKSA8PSAneicpIHx8ICAgICAgICAgICAgICAgXAorICAgICgoYykgPT0gJ18nKSApCisKKy8qKgorICogQ2hlY2tzIHRoYXQgdGhlIGdpdmVuIHJhbmdlIG9mIHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBvYmplY3QgcGF0aAorICogbmFtZSBpbiB0aGUgRC1CdXMgcHJvdG9jb2wuIFBhcnQgb2YgdGhlIHZhbGlkYXRpb24gZW5zdXJlcyB0aGF0CisgKiB0aGUgb2JqZWN0IHBhdGggY29udGFpbnMgb25seSBBU0NJSS4KKyAqCisgKiBAdG9kbyB0aGlzIGlzIGluY29uc2lzdGVudCB3aXRoIG1vc3Qgb2YgREJ1c1N0cmluZyBpbiB0aGF0CisgKiBpdCBhbGxvd3MgYSBzdGFydCxsZW4gcmFuZ2UgdGhhdCBleHRlbmRzIHBhc3QgdGhlIHN0cmluZyBlbmQuCisgKgorICogQHRvZG8gY2hhbmdlIHNwZWMgdG8gZGlzYWxsb3cgbW9yZSB0aGluZ3MsIHN1Y2ggYXMgc3BhY2VzIGluIHRoZQorICogcGF0aCBuYW1lCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgZmlyc3QgYnl0ZSBpbmRleCB0byBjaGVjaworICogQHBhcmFtIGxlbiBudW1iZXIgb2YgYnl0ZXMgdG8gY2hlY2sKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBieXRlIHJhbmdlIGV4aXN0cyBhbmQgaXMgYSB2YWxpZCBuYW1lCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c192YWxpZGF0ZV9wYXRoIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbikKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqczsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpsYXN0X3NsYXNoOworCisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpKTsKKyAgCisgIGlmIChsZW4gPiBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSAtIHN0YXJ0KQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAobGVuID09IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIHMgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHN0cikgKyBzdGFydDsKKyAgZW5kID0gcyArIGxlbjsKKworICBpZiAoKnMgIT0gJy8nKQorICAgIHJldHVybiBGQUxTRTsKKyAgbGFzdF9zbGFzaCA9IHM7CisgICsrczsKKworICB3aGlsZSAocyAhPSBlbmQpCisgICAgeworICAgICAgaWYgKCpzID09ICcvJykKKyAgICAgICAgeworICAgICAgICAgIGlmICgocyAtIGxhc3Rfc2xhc2gpIDwgMikKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsgLyogbm8gZW1wdHkgcGF0aCBjb21wb25lbnRzIGFsbG93ZWQgKi8KKworICAgICAgICAgIGxhc3Rfc2xhc2ggPSBzOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoX0RCVVNfVU5MSUtFTFkgKCFWQUxJRF9OQU1FX0NIQVJBQ1RFUiAoKnMpKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICArK3M7CisgICAgfQorCisgIGlmICgoZW5kIC0gbGFzdF9zbGFzaCkgPCAyICYmCisgICAgICBsZW4gPiAxKQorICAgIHJldHVybiBGQUxTRTsgLyogdHJhaWxpbmcgc2xhc2ggbm90IGFsbG93ZWQgdW5sZXNzIHRoZSBzdHJpbmcgaXMgIi8iICovCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2NvbnN0IGNoYXIgKgorX2RidXNfdmFsaWRpdHlfdG9fZXJyb3JfbWVzc2FnZSAoREJ1c1ZhbGlkaXR5IHZhbGlkaXR5KQoreworICBzd2l0Y2ggKHZhbGlkaXR5KQorICAgIHsKKyAgICBjYXNlIERCVVNfVkFMSURJVFlfVU5LTk9XTl9PT01fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIk91dCBvZiBtZW1vcnkiOworICAgIGNhc2UgREJVU19JTlZBTElEX0ZPUl9VTktOT1dOX1JFQVNPTjogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVW5rbm93biByZWFzb24iOworICAgIGNhc2UgREJVU19WQUxJRF9CVVRfSU5DT01QTEVURTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVmFsaWQgYnV0IGluY29tcGxldGUiOworICAgIGNhc2UgREJVU19WQUxJRElUWV9VTktOT1dOOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVmFsaWRpdHkgdW5rbm93biI7CisgICAgY2FzZSBEQlVTX1ZBTElEOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJWYWxpZCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfVU5LTk9XTl9UWVBFQ09ERTogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIHR5cGVjb2RlIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9NSVNTSU5HX0FSUkFZX0VMRU1FTlRfVFlQRTogICAgICAgICAgICAgICAgICByZXR1cm4gIk1pc3NpbmcgYXJyYXkgZWxlbWVudCB0eXBlIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9TSUdOQVRVUkVfVE9PX0xPTkc6ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlNpZ25hdHVyZSBpcyB0b28gbG9uZyI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfRVhDRUVERURfTUFYSU1VTV9BUlJBWV9SRUNVUlNJT046ICAgICAgICAgICAgcmV0dXJuICJFeGNlZWRlZCBtYXhpbXVtIGFycmF5IHJlY3Vyc2lvbiI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfRVhDRUVERURfTUFYSU1VTV9TVFJVQ1RfUkVDVVJTSU9OOiAgICAgICAgICAgcmV0dXJuICJFeGNlZWRlZCBtYXhpbXVtIHN0cnVjdCByZWN1cnNpb24iOworICAgIGNhc2UgREJVU19JTlZBTElEX1NUUlVDVF9FTkRFRF9CVVRfTk9UX1NUQVJURUQ6ICAgICAgICAgICAgICAgIHJldHVybiAiU3RydWN0IGVuZGVkIGJ1dCBub3Qgc3RhcnRlZCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfU1RSVUNUX1NUQVJURURfQlVUX05PVF9FTkRFRDogICAgICAgICAgICAgICAgcmV0dXJuICJTdHJ1Y3Qgc3RhcnRlZCBidXQgbm90IGVuZGVkIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9TVFJVQ1RfSEFTX05PX0ZJRUxEUzogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlN0cnVjdCBoYXMgbm8gZmllbGRzIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9BTElHTk1FTlRfUEFERElOR19OT1RfTlVMOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIkFsaWdubWVudCBwYWRkaW5nIG5vdCBudWxsIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9CT09MRUFOX05PVF9aRVJPX09SX09ORTogICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkJvb2xlYW4gaXMgbm90IHplcm8gb3Igb25lIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9OT1RfRU5PVUdIX0RBVEE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIk5vdCBlbm91Z2ggZGF0YSI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfVE9PX01VQ0hfREFUQTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJUb28gbXVjaCBkYXRhIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9CQURfQllURV9PUkRFUjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkJhZCBieXRlIG9yZGVyIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9CQURfUFJPVE9DT0xfVkVSU0lPTjogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkJhZCBwcm90b2NvbCB2ZXJzaW9uIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9CQURfTUVTU0FHRV9UWVBFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkJhZCBtZXNzYWdlIHR5cGUiOworICAgIGNhc2UgREJVU19JTlZBTElEX0JBRF9TRVJJQUw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQmFkIHNlcmlhbCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfSU5TQU5FX0ZJRUxEU19BUlJBWV9MRU5HVEg6ICAgICAgICAgICAgICAgICAgcmV0dXJuICJJbnNhbmUgZmllbGRzIGFycmF5IGxlbmd0aCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfSU5TQU5FX0JPRFlfTEVOR1RIOiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJJbnNhbmUgYm9keSBsZW5ndGgiOworICAgIGNhc2UgREJVU19JTlZBTElEX01FU1NBR0VfVE9PX0xPTkc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTWVzc2FnZSB0b28gbG9uZyI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfSEVBREVSX0ZJRUxEX0NPREU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJIZWFkZXIgZmllbGQgY29kZSI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfSEVBREVSX0ZJRUxEX0hBU19XUk9OR19UWVBFOiAgICAgICAgICAgICAgICAgcmV0dXJuICJIZWFkZXIgZmllbGQgaGFzIHdyb25nIHR5cGUiOworICAgIGNhc2UgREJVU19JTlZBTElEX1VTRVNfTE9DQUxfSU5URVJGQUNFOiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVXNlcyBsb2NhbCBpbnRlcmZhY2UiOworICAgIGNhc2UgREJVU19JTlZBTElEX1VTRVNfTE9DQUxfUEFUSDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVXNlcyBsb2NhbCBwYXRoIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9IRUFERVJfRklFTERfQVBQRUFSU19UV0lDRTogICAgICAgICAgICAgICAgICByZXR1cm4gIkhlYWRlciBmaWVsZCBhcHBlYXJzIHR3aWNlIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9CQURfREVTVElOQVRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkJhZCBkZXN0aW5hdGlvbiI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfQkFEX0lOVEVSRkFDRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJCYWQgaW50ZXJmYWNlIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9CQURfTUVNQkVSOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkJhZCBtZW1iZXIiOworICAgIGNhc2UgREJVU19JTlZBTElEX0JBRF9FUlJPUl9OQU1FOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQmFkIGVycm9yIG5hbWUiOworICAgIGNhc2UgREJVU19JTlZBTElEX0JBRF9TRU5ERVI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQmFkIHNlbmRlciI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfTUlTU0lOR19QQVRIOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJNaXNzaW5nIHBhdGgiOworICAgIGNhc2UgREJVU19JTlZBTElEX01JU1NJTkdfSU5URVJGQUNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTWlzc2luZyBpbnRlcmZhY2UiOworICAgIGNhc2UgREJVU19JTlZBTElEX01JU1NJTkdfTUVNQkVSOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTWlzc2luZyBtZW1iZXIiOworICAgIGNhc2UgREJVU19JTlZBTElEX01JU1NJTkdfRVJST1JfTkFNRTogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTWlzc2luZyBlcnJvciBuYW1lIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9NSVNTSU5HX1JFUExZX1NFUklBTDogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIk1pc3NpbmcgcmVwbHkgc2VyaWFsIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9MRU5HVEhfT1VUX09GX0JPVU5EUzogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkxlbmd0aCBvdXQgb2YgYm91bmRzIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9BUlJBWV9MRU5HVEhfRVhDRUVEU19NQVhJTVVNOiAgICAgICAgICAgICAgICByZXR1cm4gIkFycmF5IGxlbmd0aCBleGNlZWRzIG1heGltdW0iOworICAgIGNhc2UgREJVU19JTlZBTElEX0JBRF9QQVRIOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQmFkIHBhdGgiOworICAgIGNhc2UgREJVU19JTlZBTElEX1NJR05BVFVSRV9MRU5HVEhfT1VUX09GX0JPVU5EUzogICAgICAgICAgICAgIHJldHVybiAiU2lnbmF0dXJlIGxlbmd0aCBvdXQgb2YgYm91bmRzIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9CQURfVVRGOF9JTl9TVFJJTkc6ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkJhZCB1dGY4IGluIHN0cmluZyI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfQVJSQVlfTEVOR1RIX0lOQ09SUkVDVDogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJBcnJheSBsZW5ndGggaW5jb3JyZWN0IjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9WQVJJQU5UX1NJR05BVFVSRV9MRU5HVEhfT1VUX09GX0JPVU5EUzogICAgICByZXR1cm4gIlZhcmlhbnQgc2lnbmF0dXJlIGxlbmd0aCBvdXQgb2YgYm91bmRzIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9WQVJJQU5UX1NJR05BVFVSRV9CQUQ6ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlZhcmlhbnQgc2lnbmF0dXJlIGJhZCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfVkFSSUFOVF9TSUdOQVRVUkVfRU1QVFk6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJWYXJpYW50IHNpZ25hdHVyZSBlbXB0eSI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfVkFSSUFOVF9TSUdOQVRVUkVfU1BFQ0lGSUVTX01VTFRJUExFX1ZBTFVFUzogcmV0dXJuICJWYXJpYW50IHNpZ25hdHVyZSBzcGVjaWZpZXMgbXVsdGlwbGUgdmFsdWVzIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9WQVJJQU5UX1NJR05BVFVSRV9NSVNTSU5HX05VTDogICAgICAgICAgICAgICByZXR1cm4gIlZhcmlhbnQgc2lnbmF0dXJlIG1pc3NpbmcgbnVsIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9TVFJJTkdfTUlTU0lOR19OVUw6ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlN0cmluZyBtaXNzaW5nIG51bCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfU0lHTkFUVVJFX01JU1NJTkdfTlVMOiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJTaWduYXR1cmUgbWlzc2luZyBudWwiOworICAgIGNhc2UgREJVU19JTlZBTElEX0VYQ0VFREVEX01BWElNVU1fRElDVF9FTlRSWV9SRUNVUlNJT046ICAgICAgIHJldHVybiAiRXhjZWVkZWQgbWF4aW11bSBkaWN0IGVudHJ5IHJlY3Vyc2lvbiI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9FTkRFRF9CVVRfTk9UX1NUQVJURUQ6ICAgICAgICAgICAgcmV0dXJuICJEaWN0IGVudHJ5IGVuZGVkIGJ1dCBub3Qgc3RhcnRlZCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9TVEFSVEVEX0JVVF9OT1RfRU5ERUQ6ICAgICAgICAgICAgcmV0dXJuICJEaWN0IGVudHJ5IHN0YXJ0ZWQgYnV0IG5vdCBlbmRlZCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9IQVNfTk9fRklFTERTOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEaWN0IGVudHJ5IGhhcyBubyBmaWVsZHMiOworICAgIGNhc2UgREJVU19JTlZBTElEX0RJQ1RfRU5UUllfSEFTX09OTFlfT05FX0ZJRUxEOiAgICAgICAgICAgICAgIHJldHVybiAiRGljdCBlbnRyeSBoYXMgb25seSBvbmUgZmllbGQiOworICAgIGNhc2UgREJVU19JTlZBTElEX0RJQ1RfRU5UUllfSEFTX1RPT19NQU5ZX0ZJRUxEUzogICAgICAgICAgICAgIHJldHVybiAiRGljdCBlbnRyeSBoYXMgdG9vIG1hbnkgZmllbGRzIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX05PVF9JTlNJREVfQVJSQVk6ICAgICAgICAgICAgICAgICByZXR1cm4gIkRpY3QgZW50cnkgbm90IGluc2lkZSBhcnJheSI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfRElDVF9LRVlfTVVTVF9CRV9CQVNJQ19UWVBFOiAgICAgICAgICAgICAgICAgcmV0dXJuICJEaWN0IGtleSBtdXN0IGJlIGJhc2ljIHR5cGUiOworICAgIGNhc2UgREJVU19JTlZBTElEX05FU1RFRF9UT09fREVFUExZOiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVmFyaWFudHMgY2Fubm90IGJlIHVzZWQgdG8gY3JlYXRlIGEgaHVnZWx5IHJlY3Vyc2l2ZSB0cmVlIG9mIHZhbHVlcyI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiSW52YWxpZCI7CisgICAgfQorfQorCisvKioKKyAqIENoZWNrcyB0aGF0IHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgaW50ZXJmYWNlIG5hbWUKKyAqIGluIHRoZSBELUJ1cyBwcm90b2NvbC4gVGhpcyBpbmNsdWRlcyBhIGxlbmd0aCByZXN0cmljdGlvbiBhbmQgYW4KKyAqIEFTQ0lJIHN1YnNldCwgc2VlIHRoZSBzcGVjaWZpY2F0aW9uLgorICoKKyAqIEB0b2RvIHRoaXMgaXMgaW5jb25zaXN0ZW50IHdpdGggbW9zdCBvZiBEQnVzU3RyaW5nIGluIHRoYXQKKyAqIGl0IGFsbG93cyBhIHN0YXJ0LGxlbiByYW5nZSB0aGF0IGV4dGVuZHMgcGFzdCB0aGUgc3RyaW5nIGVuZC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCBmaXJzdCBieXRlIGluZGV4IHRvIGNoZWNrCisgKiBAcGFyYW0gbGVuIG51bWJlciBvZiBieXRlcyB0byBjaGVjaworICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGJ5dGUgcmFuZ2UgZXhpc3RzIGFuZCBpcyBhIHZhbGlkIG5hbWUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3ZhbGlkYXRlX2ludGVyZmFjZSAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpzOworICBjb25zdCB1bnNpZ25lZCBjaGFyICplbmQ7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlmYWNlOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpsYXN0X2RvdDsKKworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ID49IDApOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSk7CisKKyAgaWYgKGxlbiA+IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpIC0gc3RhcnQpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChsZW4gPiBEQlVTX01BWElNVU1fTkFNRV9MRU5HVEgpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChsZW4gPT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbGFzdF9kb3QgPSBOVUxMOworICBpZmFjZSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc3RyKSArIHN0YXJ0OworICBlbmQgPSBpZmFjZSArIGxlbjsKKyAgcyA9IGlmYWNlOworCisgIC8qIGNoZWNrIHNwZWNpYWwgY2FzZXMgb2YgZmlyc3QgY2hhciBzbyBpdCBkb2Vzbid0IGhhdmUgdG8gYmUgZG9uZQorICAgKiBpbiB0aGUgbG9vcC4gTm90ZSB3ZSBrbm93IGxlbiA+IDAKKyAgICovCisgIGlmIChfREJVU19VTkxJS0VMWSAoKnMgPT0gJy4nKSkgLyogZGlzYWxsb3cgc3RhcnRpbmcgd2l0aCBhIC4gKi8KKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UgaWYgKF9EQlVTX1VOTElLRUxZICghVkFMSURfSU5JVElBTF9OQU1FX0NIQVJBQ1RFUiAoKnMpKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UKKyAgICArK3M7CisKKyAgd2hpbGUgKHMgIT0gZW5kKQorICAgIHsKKyAgICAgIGlmICgqcyA9PSAnLicpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoX0RCVVNfVU5MSUtFTFkgKChzICsgMSkgPT0gZW5kKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICBlbHNlIGlmIChfREJVU19VTkxJS0VMWSAoIVZBTElEX0lOSVRJQUxfTkFNRV9DSEFSQUNURVIgKCoocyArIDEpKSkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgbGFzdF9kb3QgPSBzOworICAgICAgICAgICsrczsgLyogd2UganVzdCB2YWxpZGF0ZWQgdGhlIG5leHQgY2hhciwgc28gc2tpcCB0d28gKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX0RCVVNfVU5MSUtFTFkgKCFWQUxJRF9OQU1FX0NIQVJBQ1RFUiAoKnMpKSkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICArK3M7CisgICAgfQorCisgIGlmIChfREJVU19VTkxJS0VMWSAobGFzdF9kb3QgPT0gTlVMTCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENoZWNrcyB0aGF0IHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgbWVtYmVyIG5hbWUKKyAqIGluIHRoZSBELUJ1cyBwcm90b2NvbC4gVGhpcyBpbmNsdWRlcyBhIGxlbmd0aCByZXN0cmljdGlvbiwgZXRjLiwKKyAqIHNlZSB0aGUgc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBAdG9kbyB0aGlzIGlzIGluY29uc2lzdGVudCB3aXRoIG1vc3Qgb2YgREJ1c1N0cmluZyBpbiB0aGF0CisgKiBpdCBhbGxvd3MgYSBzdGFydCxsZW4gcmFuZ2UgdGhhdCBleHRlbmRzIHBhc3QgdGhlIHN0cmluZyBlbmQuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgZmlyc3QgYnl0ZSBpbmRleCB0byBjaGVjaworICogQHBhcmFtIGxlbiBudW1iZXIgb2YgYnl0ZXMgdG8gY2hlY2sKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBieXRlIHJhbmdlIGV4aXN0cyBhbmQgaXMgYSB2YWxpZCBuYW1lCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c192YWxpZGF0ZV9tZW1iZXIgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbikKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqczsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kOworICBjb25zdCB1bnNpZ25lZCBjaGFyICptZW1iZXI7CisKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikpOworCisgIGlmIChsZW4gPiBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSAtIHN0YXJ0KQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAobGVuID4gREJVU19NQVhJTVVNX05BTUVfTEVOR1RIKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAobGVuID09IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIG1lbWJlciA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc3RyKSArIHN0YXJ0OworICBlbmQgPSBtZW1iZXIgKyBsZW47CisgIHMgPSBtZW1iZXI7CisKKyAgLyogY2hlY2sgc3BlY2lhbCBjYXNlcyBvZiBmaXJzdCBjaGFyIHNvIGl0IGRvZXNuJ3QgaGF2ZSB0byBiZSBkb25lCisgICAqIGluIHRoZSBsb29wLiBOb3RlIHdlIGtub3cgbGVuID4gMAorICAgKi8KKworICBpZiAoX0RCVVNfVU5MSUtFTFkgKCFWQUxJRF9JTklUSUFMX05BTUVfQ0hBUkFDVEVSICgqcykpKQorICAgIHJldHVybiBGQUxTRTsKKyAgZWxzZQorICAgICsrczsKKworICB3aGlsZSAocyAhPSBlbmQpCisgICAgeworICAgICAgaWYgKF9EQlVTX1VOTElLRUxZICghVkFMSURfTkFNRV9DSEFSQUNURVIgKCpzKSkpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgKytzOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDaGVja3MgdGhhdCB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIHN0cmluZyBpcyBhIHZhbGlkIGVycm9yIG5hbWUKKyAqIGluIHRoZSBELUJ1cyBwcm90b2NvbC4gVGhpcyBpbmNsdWRlcyBhIGxlbmd0aCByZXN0cmljdGlvbiwgZXRjLiwKKyAqIHNlZSB0aGUgc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBAdG9kbyB0aGlzIGlzIGluY29uc2lzdGVudCB3aXRoIG1vc3Qgb2YgREJ1c1N0cmluZyBpbiB0aGF0CisgKiBpdCBhbGxvd3MgYSBzdGFydCxsZW4gcmFuZ2UgdGhhdCBleHRlbmRzIHBhc3QgdGhlIHN0cmluZyBlbmQuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgZmlyc3QgYnl0ZSBpbmRleCB0byBjaGVjaworICogQHBhcmFtIGxlbiBudW1iZXIgb2YgYnl0ZXMgdG8gY2hlY2sKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBieXRlIHJhbmdlIGV4aXN0cyBhbmQgaXMgYSB2YWxpZCBuYW1lCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c192YWxpZGF0ZV9lcnJvcl9uYW1lIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbikKK3sKKyAgLyogU2FtZSByZXN0cmljdGlvbnMgYXMgaW50ZXJmYWNlIG5hbWUgYXQgdGhlIG1vbWVudCAqLworICByZXR1cm4gX2RidXNfdmFsaWRhdGVfaW50ZXJmYWNlIChzdHIsIHN0YXJ0LCBsZW4pOworfQorCisvKioKKyAqIERldGVybWluZSB3ZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyB2YWxpZCBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyCisgKiBpbiBhIGJ1cyBuYW1lLgorICovCisjZGVmaW5lIFZBTElEX0lOSVRJQUxfQlVTX05BTUVfQ0hBUkFDVEVSKGMpICAgICAgICAgXAorICAoICgoYykgPj0gJ0EnICYmIChjKSA8PSAnWicpIHx8ICAgICAgICAgICAgICAgXAorICAgICgoYykgPj0gJ2EnICYmIChjKSA8PSAneicpIHx8ICAgICAgICAgICAgICAgXAorICAgICgoYykgPT0gJ18nKSB8fCAoKGMpID09ICctJykpCisKKy8qKgorICogRGV0ZXJtaW5lIHdldGhlciB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGlzIHZhbGlkIGFzIGEgc2Vjb25kIG9yIGxhdGVyCisgKiBjaGFyYWN0ZXIgaW4gYSBidXMgbmFtZQorICovCisjZGVmaW5lIFZBTElEX0JVU19OQU1FX0NIQVJBQ1RFUihjKSAgICAgICAgICAgICAgICAgXAorICAoICgoYykgPj0gJzAnICYmIChjKSA8PSAnOScpIHx8ICAgICAgICAgICAgICAgXAorICAgICgoYykgPj0gJ0EnICYmIChjKSA8PSAnWicpIHx8ICAgICAgICAgICAgICAgXAorICAgICgoYykgPj0gJ2EnICYmIChjKSA8PSAneicpIHx8ICAgICAgICAgICAgICAgXAorICAgICgoYykgPT0gJ18nKSB8fCAoKGMpID09ICctJykpCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfdmFsaWRhdGVfYnVzX25hbWVfZnVsbCAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgaXNfbmFtZXNwYWNlKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpzOworICBjb25zdCB1bnNpZ25lZCBjaGFyICplbmQ7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlmYWNlOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpsYXN0X2RvdDsKKworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ID49IDApOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSk7CisKKyAgaWYgKGxlbiA+IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpIC0gc3RhcnQpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChsZW4gPiBEQlVTX01BWElNVU1fTkFNRV9MRU5HVEgpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChsZW4gPT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbGFzdF9kb3QgPSBOVUxMOworICBpZmFjZSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc3RyKSArIHN0YXJ0OworICBlbmQgPSBpZmFjZSArIGxlbjsKKyAgcyA9IGlmYWNlOworCisgIC8qIGNoZWNrIHNwZWNpYWwgY2FzZXMgb2YgZmlyc3QgY2hhciBzbyBpdCBkb2Vzbid0IGhhdmUgdG8gYmUgZG9uZQorICAgKiBpbiB0aGUgbG9vcC4gTm90ZSB3ZSBrbm93IGxlbiA+IDAKKyAgICovCisgIGlmICgqcyA9PSAnOicpCisgIHsKKyAgICAvKiB1bmlxdWUgbmFtZSAqLworICAgICsrczsKKyAgICB3aGlsZSAocyAhPSBlbmQpCisgICAgICB7CisgICAgICAgIGlmICgqcyA9PSAnLicpCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKF9EQlVTX1VOTElLRUxZICgocyArIDEpID09IGVuZCkpCisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIGlmIChfREJVU19VTkxJS0VMWSAoIVZBTElEX0JVU19OQU1FX0NIQVJBQ1RFUiAoKihzICsgMSkpKSkKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgKytzOyAvKiB3ZSBqdXN0IHZhbGlkYXRlZCB0aGUgbmV4dCBjaGFyLCBzbyBza2lwIHR3byAqLworICAgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoX0RCVVNfVU5MSUtFTFkgKCFWQUxJRF9CVVNfTkFNRV9DSEFSQUNURVIgKCpzKSkpCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIH0KKworICAgICAgICArK3M7CisgICAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBlbHNlIGlmIChfREJVU19VTkxJS0VMWSAoKnMgPT0gJy4nKSkgLyogZGlzYWxsb3cgc3RhcnRpbmcgd2l0aCBhIC4gKi8KKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UgaWYgKF9EQlVTX1VOTElLRUxZICghVkFMSURfSU5JVElBTF9CVVNfTkFNRV9DSEFSQUNURVIgKCpzKSkpCisgICAgcmV0dXJuIEZBTFNFOworICBlbHNlCisgICAgKytzOworCisgIHdoaWxlIChzICE9IGVuZCkKKyAgICB7CisgICAgICBpZiAoKnMgPT0gJy4nKQorICAgICAgICB7CisgICAgICAgICAgaWYgKF9EQlVTX1VOTElLRUxZICgocyArIDEpID09IGVuZCkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgZWxzZSBpZiAoX0RCVVNfVU5MSUtFTFkgKCFWQUxJRF9JTklUSUFMX0JVU19OQU1FX0NIQVJBQ1RFUiAoKihzICsgMSkpKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICBsYXN0X2RvdCA9IHM7CisgICAgICAgICAgKytzOyAvKiB3ZSBqdXN0IHZhbGlkYXRlZCB0aGUgbmV4dCBjaGFyLCBzbyBza2lwIHR3byAqLworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfREJVU19VTkxJS0VMWSAoIVZBTElEX0JVU19OQU1FX0NIQVJBQ1RFUiAoKnMpKSkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICArK3M7CisgICAgfQorCisgIGlmICghaXNfbmFtZXNwYWNlICYmIF9EQlVTX1VOTElLRUxZIChsYXN0X2RvdCA9PSBOVUxMKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ2hlY2tzIHRoYXQgdGhlIGdpdmVuIHJhbmdlIG9mIHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBidXMgbmFtZSBpbgorICogdGhlIEQtQnVzIHByb3RvY29sLiBUaGlzIGluY2x1ZGVzIGEgbGVuZ3RoIHJlc3RyaWN0aW9uLCBldGMuLCBzZWUKKyAqIHRoZSBzcGVjaWZpY2F0aW9uLgorICoKKyAqIEB0b2RvIHRoaXMgaXMgaW5jb25zaXN0ZW50IHdpdGggbW9zdCBvZiBEQnVzU3RyaW5nIGluIHRoYXQKKyAqIGl0IGFsbG93cyBhIHN0YXJ0LGxlbiByYW5nZSB0aGF0IGV4dGVuZHMgcGFzdCB0aGUgc3RyaW5nIGVuZC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCBmaXJzdCBieXRlIGluZGV4IHRvIGNoZWNrCisgKiBAcGFyYW0gbGVuIG51bWJlciBvZiBieXRlcyB0byBjaGVjaworICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGJ5dGUgcmFuZ2UgZXhpc3RzIGFuZCBpcyBhIHZhbGlkIG5hbWUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3ZhbGlkYXRlX2J1c19uYW1lIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKQoreworICByZXR1cm4gX2RidXNfdmFsaWRhdGVfYnVzX25hbWVfZnVsbCAoc3RyLCBzdGFydCwgbGVuLCBGQUxTRSk7Cit9CisKKy8qKgorICogQ2hlY2tzIHRoYXQgdGhlIGdpdmVuIHJhbmdlIG9mIHRoZSBzdHJpbmcgaXMgYSBwcmVmaXggb2YgYSB2YWxpZCBidXMgbmFtZSBpbgorICogdGhlIEQtQnVzIHByb3RvY29sLiBVbmxpa2UgX2RidXNfdmFsaWRhdGVfYnVzX25hbWUoKSwgdGhpcyBhY2NlcHRzIHN0cmluZ3MKKyAqIHdpdGggb25seSBvbmUgcGVyaW9kLXNlcGFyYXRlZCBjb21wb25lbnQuCisgKgorICogQHRvZG8gdGhpcyBpcyBpbmNvbnNpc3RlbnQgd2l0aCBtb3N0IG9mIERCdXNTdHJpbmcgaW4gdGhhdAorICogaXQgYWxsb3dzIGEgc3RhcnQsbGVuIHJhbmdlIHRoYXQgZXh0ZW5kcyBwYXN0IHRoZSBzdHJpbmcgZW5kLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IGZpcnN0IGJ5dGUgaW5kZXggdG8gY2hlY2sKKyAqIEBwYXJhbSBsZW4gbnVtYmVyIG9mIGJ5dGVzIHRvIGNoZWNrCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgYnl0ZSByYW5nZSBleGlzdHMgYW5kIGlzIGEgdmFsaWQgbmFtZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdmFsaWRhdGVfYnVzX25hbWVzcGFjZSAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pCit7CisgIHJldHVybiBfZGJ1c192YWxpZGF0ZV9idXNfbmFtZV9mdWxsIChzdHIsIHN0YXJ0LCBsZW4sIFRSVUUpOworfQorCisvKioKKyAqIENoZWNrcyB0aGF0IHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgbWVzc2FnZSB0eXBlCisgKiBzaWduYXR1cmUgaW4gdGhlIEQtQnVzIHByb3RvY29sLgorICoKKyAqIEB0b2RvIHRoaXMgaXMgaW5jb25zaXN0ZW50IHdpdGggbW9zdCBvZiBEQnVzU3RyaW5nIGluIHRoYXQKKyAqIGl0IGFsbG93cyBhIHN0YXJ0LGxlbiByYW5nZSB0aGF0IGV4dGVuZHMgcGFzdCB0aGUgc3RyaW5nIGVuZC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCBmaXJzdCBieXRlIGluZGV4IHRvIGNoZWNrCisgKiBAcGFyYW0gbGVuIG51bWJlciBvZiBieXRlcyB0byBjaGVjaworICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGJ5dGUgcmFuZ2UgZXhpc3RzIGFuZCBpcyBhIHZhbGlkIHNpZ25hdHVyZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdmFsaWRhdGVfc2lnbmF0dXJlIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pCit7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikpOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKworICBpZiAobGVuID4gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikgLSBzdGFydCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIF9kYnVzX3ZhbGlkYXRlX3NpZ25hdHVyZV93aXRoX3JlYXNvbiAoc3RyLCBzdGFydCwgbGVuKSA9PSBEQlVTX1ZBTElEOworfQorCisvKiogZGVmaW5lIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX3BhdGgoKSAqLworREVGSU5FX0RCVVNfTkFNRV9DSEVDSyhwYXRoKQorLyoqIGRlZmluZSBfZGJ1c19jaGVja19pc192YWxpZF9pbnRlcmZhY2UoKSAqLworREVGSU5FX0RCVVNfTkFNRV9DSEVDSyhpbnRlcmZhY2UpCisvKiogZGVmaW5lIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX21lbWJlcigpICovCitERUZJTkVfREJVU19OQU1FX0NIRUNLKG1lbWJlcikKKy8qKiBkZWZpbmUgX2RidXNfY2hlY2tfaXNfdmFsaWRfZXJyb3JfbmFtZSgpICovCitERUZJTkVfREJVU19OQU1FX0NIRUNLKGVycm9yX25hbWUpCisvKiogZGVmaW5lIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2J1c19uYW1lKCkgKi8KK0RFRklORV9EQlVTX05BTUVfQ0hFQ0soYnVzX25hbWUpCisvKiogZGVmaW5lIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX3NpZ25hdHVyZSgpICovCitERUZJTkVfREJVU19OQU1FX0NIRUNLKHNpZ25hdHVyZSkKKy8qKiBkZWZpbmUgX2RidXNfY2hlY2tfaXNfdmFsaWRfdXRmOCgpICovCitERUZJTkVfREJVU19OQU1FX0NIRUNLKHV0ZjgpCisKKy8qKiBAfSAqLworCisvKiB0ZXN0cyBpbiBkYnVzLW1hcnNoYWwtdmFsaWRhdGUtdXRpbC5jICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmggYi9kYnVzL2RidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY0MzQyMAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLW1hcnNoYWwtdmFsaWRhdGUuaApAQCAtMCwwICsxLDIwNiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1hcnNoYWwtdmFsaWRhdGUuaCAgVmFsaWRhdGlvbiByb3V0aW5lcyBmb3IgbWFyc2hhbGVkIGRhdGEKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19NQVJTSEFMX1ZBTElEQVRFX0gKKyNkZWZpbmUgREJVU19NQVJTSEFMX1ZBTElEQVRFX0gKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzTWFyc2hhbAorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBUaGlzIGlzIHVzZWQgcmF0aGVyIHRoYW4gYSBib29sIGZvciBoaWdoIHZpc2liaWxpdHkKKyAqLwordHlwZWRlZiBlbnVtCit7CisgIERCVVNfVkFMSURBVElPTl9NT0RFX1dFX1RSVVNUX1RISVNfREFUQV9BQlNPTFVURUxZLAorICBEQlVTX1ZBTElEQVRJT05fTU9ERV9EQVRBX0lTX1VOVFJVU1RFRAorfSBEQnVzVmFsaWRhdGlvbk1vZGU7CisKKy8qKgorICogVGhpcyBpcyBwcmltYXJpbHkgdXNlZCBpbiB1bml0IHRlc3RpbmcsIHNvIHdlIGNhbiB2ZXJpZnkgdGhhdCBlYWNoCisgKiBpbnZhbGlkIG1lc3NhZ2UgaXMgaW52YWxpZCBmb3IgdGhlIGV4cGVjdGVkIHJlYXNvbnMuIFRodXMgd2UgcmVhbGx5CisgKiB3YW50IGEgZGlzdGluY3QgZW51bSB2YWx1ZSBmb3IgZXZlcnkgY29kZXBhdGggbGVhdmluZyB0aGUgdmFsaWRhdG9yCisgKiBmdW5jdGlvbnMuIEVudW0gdmFsdWVzIGFyZSBzcGVjaWZpZWQgbWFudWFsbHkgZm9yIGVhc2Ugb2YgZGVidWdnaW5nCisgKiAoc28geW91IGNhbiBzZWUgdGhlIGVudW0gdmFsdWUgZ2l2ZW4gYSBwcmludGYpCisgKi8KK3R5cGVkZWYgZW51bQoreworI2RlZmluZSBfREJVU19ORUdBVElWRV9WQUxJRElUWV9DT1VOVCA0CisgIERCVVNfVkFMSURJVFlfVU5LTk9XTl9PT01fRVJST1IgPSAtNCwgLyoqPCBjYW4ndCBkZXRlcm1pbmUgdmFsaWRpdHkgZHVlIHRvIE9PTSAqLworICBEQlVTX0lOVkFMSURfRk9SX1VOS05PV05fUkVBU09OID0gLTMsCisgIERCVVNfVkFMSURfQlVUX0lOQ09NUExFVEUgPSAtMiwKKyAgREJVU19WQUxJRElUWV9VTktOT1dOID0gLTEsCisgIERCVVNfVkFMSUQgPSAwLCAvKio8IHRoZSBkYXRhIGlzIHZhbGlkICovCisgIERCVVNfSU5WQUxJRF9VTktOT1dOX1RZUEVDT0RFID0gMSwKKyAgREJVU19JTlZBTElEX01JU1NJTkdfQVJSQVlfRUxFTUVOVF9UWVBFID0gMiwKKyAgREJVU19JTlZBTElEX1NJR05BVFVSRV9UT09fTE9ORyA9IDMsIC8qIHRoaXMgb25lIGlzIGltcG9zc2libGUgcmlnaHQgbm93IHNpbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB5b3UgY2FuJ3QgcHV0IGEgdG9vLWxvbmcgdmFsdWUgaW4gYSBieXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgREJVU19JTlZBTElEX0VYQ0VFREVEX01BWElNVU1fQVJSQVlfUkVDVVJTSU9OID0gNCwKKyAgREJVU19JTlZBTElEX0VYQ0VFREVEX01BWElNVU1fU1RSVUNUX1JFQ1VSU0lPTiA9IDUsCisgIERCVVNfSU5WQUxJRF9TVFJVQ1RfRU5ERURfQlVUX05PVF9TVEFSVEVEID0gNiwKKyAgREJVU19JTlZBTElEX1NUUlVDVF9TVEFSVEVEX0JVVF9OT1RfRU5ERUQgPSA3LAorICBEQlVTX0lOVkFMSURfU1RSVUNUX0hBU19OT19GSUVMRFMgPSA4LAorICBEQlVTX0lOVkFMSURfQUxJR05NRU5UX1BBRERJTkdfTk9UX05VTCA9IDksCisgIERCVVNfSU5WQUxJRF9CT09MRUFOX05PVF9aRVJPX09SX09ORSA9IDEwLAorICBEQlVTX0lOVkFMSURfTk9UX0VOT1VHSF9EQVRBID0gMTEsCisgIERCVVNfSU5WQUxJRF9UT09fTVVDSF9EQVRBID0gMTIsIC8qKjwgdHJhaWxpbmcganVuayBtYWtlcyBpdCBpbnZhbGlkICovCisgIERCVVNfSU5WQUxJRF9CQURfQllURV9PUkRFUiA9IDEzLAorICBEQlVTX0lOVkFMSURfQkFEX1BST1RPQ09MX1ZFUlNJT04gPSAxNCwKKyAgREJVU19JTlZBTElEX0JBRF9NRVNTQUdFX1RZUEUgPSAxNSwKKyAgREJVU19JTlZBTElEX0JBRF9TRVJJQUwgPSAxNiwKKyAgREJVU19JTlZBTElEX0lOU0FORV9GSUVMRFNfQVJSQVlfTEVOR1RIID0gMTcsCisgIERCVVNfSU5WQUxJRF9JTlNBTkVfQk9EWV9MRU5HVEggPSAxOCwKKyAgREJVU19JTlZBTElEX01FU1NBR0VfVE9PX0xPTkcgPSAxOSwKKyAgREJVU19JTlZBTElEX0hFQURFUl9GSUVMRF9DT0RFID0gMjAsCisgIERCVVNfSU5WQUxJRF9IRUFERVJfRklFTERfSEFTX1dST05HX1RZUEUgPSAyMSwKKyAgREJVU19JTlZBTElEX1VTRVNfTE9DQUxfSU5URVJGQUNFID0gMjIsCisgIERCVVNfSU5WQUxJRF9VU0VTX0xPQ0FMX1BBVEggPSAyMywKKyAgREJVU19JTlZBTElEX0hFQURFUl9GSUVMRF9BUFBFQVJTX1RXSUNFID0gMjQsCisgIERCVVNfSU5WQUxJRF9CQURfREVTVElOQVRJT04gPSAyNSwKKyAgREJVU19JTlZBTElEX0JBRF9JTlRFUkZBQ0UgPSAyNiwKKyAgREJVU19JTlZBTElEX0JBRF9NRU1CRVIgPSAyNywKKyAgREJVU19JTlZBTElEX0JBRF9FUlJPUl9OQU1FID0gMjgsCisgIERCVVNfSU5WQUxJRF9CQURfU0VOREVSID0gMjksCisgIERCVVNfSU5WQUxJRF9NSVNTSU5HX1BBVEggPSAzMCwKKyAgREJVU19JTlZBTElEX01JU1NJTkdfSU5URVJGQUNFID0gMzEsCisgIERCVVNfSU5WQUxJRF9NSVNTSU5HX01FTUJFUiA9IDMyLAorICBEQlVTX0lOVkFMSURfTUlTU0lOR19FUlJPUl9OQU1FID0gMzMsCisgIERCVVNfSU5WQUxJRF9NSVNTSU5HX1JFUExZX1NFUklBTCA9IDM0LAorICBEQlVTX0lOVkFMSURfTEVOR1RIX09VVF9PRl9CT1VORFMgPSAzNSwKKyAgREJVU19JTlZBTElEX0FSUkFZX0xFTkdUSF9FWENFRURTX01BWElNVU0gPSAzNiwKKyAgREJVU19JTlZBTElEX0JBRF9QQVRIID0gMzcsCisgIERCVVNfSU5WQUxJRF9TSUdOQVRVUkVfTEVOR1RIX09VVF9PRl9CT1VORFMgPSAzOCwKKyAgREJVU19JTlZBTElEX0JBRF9VVEY4X0lOX1NUUklORyA9IDM5LAorICBEQlVTX0lOVkFMSURfQVJSQVlfTEVOR1RIX0lOQ09SUkVDVCA9IDQwLAorICBEQlVTX0lOVkFMSURfVkFSSUFOVF9TSUdOQVRVUkVfTEVOR1RIX09VVF9PRl9CT1VORFMgPSA0MSwKKyAgREJVU19JTlZBTElEX1ZBUklBTlRfU0lHTkFUVVJFX0JBRCA9IDQyLAorICBEQlVTX0lOVkFMSURfVkFSSUFOVF9TSUdOQVRVUkVfRU1QVFkgPSA0MywKKyAgREJVU19JTlZBTElEX1ZBUklBTlRfU0lHTkFUVVJFX1NQRUNJRklFU19NVUxUSVBMRV9WQUxVRVMgPSA0NCwKKyAgREJVU19JTlZBTElEX1ZBUklBTlRfU0lHTkFUVVJFX01JU1NJTkdfTlVMID0gNDUsCisgIERCVVNfSU5WQUxJRF9TVFJJTkdfTUlTU0lOR19OVUwgPSA0NiwKKyAgREJVU19JTlZBTElEX1NJR05BVFVSRV9NSVNTSU5HX05VTCA9IDQ3LAorICBEQlVTX0lOVkFMSURfRVhDRUVERURfTUFYSU1VTV9ESUNUX0VOVFJZX1JFQ1VSU0lPTiA9IDQ4LAorICBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9FTkRFRF9CVVRfTk9UX1NUQVJURUQgPSA0OSwKKyAgREJVU19JTlZBTElEX0RJQ1RfRU5UUllfU1RBUlRFRF9CVVRfTk9UX0VOREVEID0gNTAsCisgIERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX0hBU19OT19GSUVMRFMgPSA1MSwKKyAgREJVU19JTlZBTElEX0RJQ1RfRU5UUllfSEFTX09OTFlfT05FX0ZJRUxEID0gNTIsCisgIERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX0hBU19UT09fTUFOWV9GSUVMRFMgPSA1MywKKyAgREJVU19JTlZBTElEX0RJQ1RfRU5UUllfTk9UX0lOU0lERV9BUlJBWSA9IDU0LAorICBEQlVTX0lOVkFMSURfRElDVF9LRVlfTVVTVF9CRV9CQVNJQ19UWVBFID0gNTUsCisgIERCVVNfSU5WQUxJRF9NSVNTSU5HX1VOSVhfRkRTID0gNTYsCisgIERCVVNfSU5WQUxJRF9ORVNURURfVE9PX0RFRVBMWSA9IDU3LAorICBEQlVTX1ZBTElESVRZX0xBU1QKK30gREJ1c1ZhbGlkaXR5OworCitEQnVzVmFsaWRpdHkgX2RidXNfdmFsaWRhdGVfc2lnbmF0dXJlX3dpdGhfcmVhc29uIChjb25zdCBEQnVzU3RyaW5nICp0eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuKTsKK0RCdXNWYWxpZGl0eSBfZGJ1c192YWxpZGF0ZV9ib2R5X3dpdGhfcmVhc29uICAgICAgKGNvbnN0IERCdXNTdHJpbmcgKmV4cGVjdGVkX3NpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGV4cGVjdGVkX3NpZ25hdHVyZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpieXRlc19yZW1haW5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICp2YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICB2YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4pOworCitjb25zdCBjaGFyICpfZGJ1c192YWxpZGl0eV90b19lcnJvcl9tZXNzYWdlIChEQnVzVmFsaWRpdHkgdmFsaWRpdHkpOworCitkYnVzX2Jvb2xfdCBfZGJ1c192YWxpZGF0ZV9wYXRoICAgICAgIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbik7CitkYnVzX2Jvb2xfdCBfZGJ1c192YWxpZGF0ZV9pbnRlcmZhY2UgIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbik7CitkYnVzX2Jvb2xfdCBfZGJ1c192YWxpZGF0ZV9tZW1iZXIgICAgIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbik7CitkYnVzX2Jvb2xfdCBfZGJ1c192YWxpZGF0ZV9lcnJvcl9uYW1lIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbik7CitkYnVzX2Jvb2xfdCBfZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAgIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbik7CitkYnVzX2Jvb2xfdCBfZGJ1c192YWxpZGF0ZV9idXNfbmFtZXNwYWNlIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbik7CitkYnVzX2Jvb2xfdCBfZGJ1c192YWxpZGF0ZV9zaWduYXR1cmUgIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbik7CisvKiBqdXN0IHRvIGhhdmUgYSBuYW1lIGNvbnNpc3RlbnQgd2l0aCB0aGUgYWJvdmU6ICovCisjZGVmaW5lIF9kYnVzX3ZhbGlkYXRlX3V0ZjgocyxiLGUpIF9kYnVzX3N0cmluZ192YWxpZGF0ZV91dGY4IChzLCBiLCBlKQorCisjaWZkZWYgREJVU19ESVNBQkxFX0NIRUNLUworCisvKiBCZSBzdXJlIHRoZXkgZG9uJ3QgZXhpc3QsIHNpbmNlIHdlIGRvbid0IHdhbnQgdG8gdXNlIHRoZW0gb3V0c2lkZSBvZiBjaGVja3MKKyAqIGFuZCBzbyB3ZSB3YW50IHRoZSBjb21waWxlIGZhaWx1cmUuCisgKi8KKyNkZWZpbmUgREVDTEFSRV9EQlVTX05BTUVfQ0hFQ0sod2hhdCkKKyNkZWZpbmUgREVGSU5FX0RCVVNfTkFNRV9DSEVDSyh3aGF0KQorCisjZWxzZSAvKiAhREJVU19ESVNBQkxFX0NIRUNLUyAqLworCisvKiogQSBuYW1lIGNoZWNrIGlzIHVzZWQgaW4gX2RidXNfcmV0dXJuX2lmX2ZhaWwoKSwgaXQncyBub3Qgc3VpdGFibGUKKyAqIGZvciB2YWxpZGF0aW5nIHVudHJ1c3RlZCBkYXRhLiB1c2UgX2RidXNfdmFsaWRhdGVfd2hhdGV2ZXIgZm9yIHRoYXQuCisgKi8KKyNkZWZpbmUgREVDTEFSRV9EQlVTX05BTUVfQ0hFQ0sod2hhdCkgXAorZGJ1c19ib29sX3QgX2RidXNfY2hlY2tfaXNfdmFsaWRfIyN3aGF0IChjb25zdCBjaGFyICpuYW1lKQorCisvKiogRGVmaW5lIGEgbmFtZSBjaGVjayB0byBiZSB1c2VkIGluIF9kYnVzX3JldHVybl9pZl9mYWlsKCkgc3RhdGVtZW50cy4KKyAqLworI2RlZmluZSBERUZJTkVfREJVU19OQU1FX0NIRUNLKHdoYXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZGJ1c19ib29sX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorX2RidXNfY2hlY2tfaXNfdmFsaWRfIyN3aGF0IChjb25zdCBjaGFyICpuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBEQnVzU3RyaW5nIHN0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAobmFtZSA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBGQUxTRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgbmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gX2RidXNfdmFsaWRhdGVfIyN3aGF0ICgmc3RyLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpOyAgICAgICAgXAorfQorI2VuZGlmIC8qICFEQlVTX0RJU0FCTEVfQ0hFQ0tTICovCisKKy8qKiBkZWZpbmVzIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX3BhdGgoKSAqLworREVDTEFSRV9EQlVTX05BTUVfQ0hFQ0socGF0aCk7CisvKiogZGVmaW5lcyBfZGJ1c19jaGVja19pc192YWxpZF9pbnRlcmZhY2UoKSAqLworREVDTEFSRV9EQlVTX05BTUVfQ0hFQ0soaW50ZXJmYWNlKTsKKy8qKiBkZWZpbmVzIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX21lbWJlcigpICovCitERUNMQVJFX0RCVVNfTkFNRV9DSEVDSyhtZW1iZXIpOworLyoqIGRlZmluZXMgX2RidXNfY2hlY2tfaXNfdmFsaWRfZXJyb3JfbmFtZSgpICovCitERUNMQVJFX0RCVVNfTkFNRV9DSEVDSyhlcnJvcl9uYW1lKTsKKy8qKiBkZWZpbmVzIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2J1c19uYW1lKCkgKi8KK0RFQ0xBUkVfREJVU19OQU1FX0NIRUNLKGJ1c19uYW1lKTsKKy8qKiBkZWZpbmVzIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX3NpZ25hdHVyZSgpICovCitERUNMQVJFX0RCVVNfTkFNRV9DSEVDSyhzaWduYXR1cmUpOworLyoqIGRlZmluZXMgX2RidXNfY2hlY2tfaXNfdmFsaWRfdXRmOCgpICovCitERUNMQVJFX0RCVVNfTkFNRV9DSEVDSyh1dGY4KTsKKworLyoqIEB9ICovCisKKyNlbmRpZiAvKiBEQlVTX01BUlNIQUxfVkFMSURBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtbWVtb3J5LmMgYi9kYnVzL2RidXMvZGJ1cy1tZW1vcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDMzYjU0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtbWVtb3J5LmMKQEAgLTAsMCArMSw5MzUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tZW1vcnkuYyAgRC1CdXMgbWVtb3J5IGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtbWVtb3J5LmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMuaCIKKyNpbmNsdWRlICJkYnVzLWxpc3QuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c01lbW9yeSBNZW1vcnkgQWxsb2NhdGlvbgorICogQGluZ3JvdXAgIERCdXMKKyAqIEBicmllZiBkYnVzX21hbGxvYygpLCBkYnVzX2ZyZWUoKSwgZXRjLgorICoKKyAqIEZ1bmN0aW9ucyBhbmQgbWFjcm9zIHJlbGF0ZWQgdG8gYWxsb2NhdGluZyBhbmQgcmVsZWFzaW5nCisgKiBibG9ja3Mgb2YgbWVtb3J5LgorICoKKyAqLworCisvKioKKyAqIEBkZWZncm91cCBEQnVzTWVtb3J5SW50ZXJuYWxzIE1lbW9yeSBhbGxvY2F0aW9uIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgaW50ZXJuYWxzIG9mIGRidXNfbWFsbG9jKCkgZXRjLgorICoKKyAqIEltcGxlbWVudGF0aW9uIGRldGFpbHMgcmVsYXRlZCB0byBhbGxvY2F0aW5nIGFuZCByZWxlYXNpbmcgYmxvY2tzCisgKiBvZiBtZW1vcnkuCisgKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzTWVtb3J5CisgKgorICogQHsKKyAqLworCisvKioKKyAqIEBkZWYgZGJ1c19uZXcKKyAqCisgKiBTYWZlIG1hY3JvIGZvciB1c2luZyBkYnVzX21hbGxvYygpLiBBY2NlcHRzIHRoZSB0eXBlCisgKiB0byBhbGxvY2F0ZSBhbmQgdGhlIG51bWJlciBvZiB0eXBlIGluc3RhbmNlcyB0bworICogYWxsb2NhdGUgYXMgYXJndW1lbnRzLCBhbmQgcmV0dXJucyBhIG1lbW9yeSBibG9jaworICogY2FzdCB0byB0aGUgZGVzaXJlZCB0eXBlLCBpbnN0ZWFkIG9mIGFzIGEgdm9pZCouCisgKgorICogQHBhcmFtIHR5cGUgdHlwZSBuYW1lIHRvIGFsbG9jYXRlCisgKiBAcGFyYW0gY291bnQgbnVtYmVyIG9mIGluc3RhbmNlcyBpbiB0aGUgYWxsb2NhdGVkIGFycmF5CisgKiBAcmV0dXJucyB0aGUgbmV3IG1lbW9yeSBibG9jayBvciAjTlVMTCBvbiBmYWlsdXJlCisgKi8KKworLyoqCisgKiBAZGVmIGRidXNfbmV3MAorICoKKyAqIFNhZmUgbWFjcm8gZm9yIHVzaW5nIGRidXNfbWFsbG9jMCgpLiBBY2NlcHRzIHRoZSB0eXBlCisgKiB0byBhbGxvY2F0ZSBhbmQgdGhlIG51bWJlciBvZiB0eXBlIGluc3RhbmNlcyB0bworICogYWxsb2NhdGUgYXMgYXJndW1lbnRzLCBhbmQgcmV0dXJucyBhIG1lbW9yeSBibG9jaworICogY2FzdCB0byB0aGUgZGVzaXJlZCB0eXBlLCBpbnN0ZWFkIG9mIGFzIGEgdm9pZCouCisgKiBUaGUgYWxsb2NhdGVkIGFycmF5IGlzIGluaXRpYWxpemVkIHRvIGFsbC1iaXRzLXplcm8uCisgKgorICogQHBhcmFtIHR5cGUgdHlwZSBuYW1lIHRvIGFsbG9jYXRlCisgKiBAcGFyYW0gY291bnQgbnVtYmVyIG9mIGluc3RhbmNlcyBpbiB0aGUgYWxsb2NhdGVkIGFycmF5CisgKiBAcmV0dXJucyB0aGUgbmV3IG1lbW9yeSBibG9jayBvciAjTlVMTCBvbiBmYWlsdXJlCisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBEQnVzRnJlZUZ1bmN0aW9uCisgKgorICogVGhlIHR5cGUgb2YgYSBmdW5jdGlvbiB3aGljaCBmcmVlcyBhIGJsb2NrIG9mIG1lbW9yeS4KKyAqCisgKiBAcGFyYW0gbWVtb3J5IHRoZSBtZW1vcnkgdG8gZnJlZQorICovCisKKy8qKiBAfSAqLyAvKiBlbmQgb2YgcHVibGljIEFQSSBkb2NzICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c01lbW9yeUludGVybmFscworICoKKyAqIEB7CisgKi8KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKK3N0YXRpYyBkYnVzX2Jvb2xfdCBkZWJ1Z19pbml0aWFsaXplZCA9IEZBTFNFOworc3RhdGljIGludCBmYWlsX250aCA9IC0xOworc3RhdGljIHNpemVfdCBmYWlsX3NpemUgPSAwOworc3RhdGljIGludCBmYWlsX2FsbG9jX2NvdW50ZXIgPSBfREJVU19JTlRfTUFYOworc3RhdGljIGludCBuX2ZhaWx1cmVzX3Blcl9mYWlsdXJlID0gMTsKK3N0YXRpYyBpbnQgbl9mYWlsdXJlc190aGlzX2ZhaWx1cmUgPSAwOworc3RhdGljIGRidXNfYm9vbF90IGd1YXJkcyA9IEZBTFNFOworc3RhdGljIGRidXNfYm9vbF90IGRpc2FibGVfbWVtX3Bvb2xzID0gRkFMU0U7CitzdGF0aWMgZGJ1c19ib29sX3QgYmFja3RyYWNlX29uX2ZhaWxfYWxsb2MgPSBGQUxTRTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBtYWxsb2NfY2Fubm90X2ZhaWwgPSBGQUxTRTsKK3N0YXRpYyBEQnVzQXRvbWljIG5fYmxvY2tzX291dHN0YW5kaW5nID0gezB9OworCisvKiogdmFsdWUgc3RvcmVkIGluIGd1YXJkIHBhZGRpbmcgZm9yIGRlYnVnZ2luZyBidWZmZXIgb3ZlcnJ1biAqLworI2RlZmluZSBHVUFSRF9WQUxVRSAweGRlYWRiZWVmCisvKiogc2l6ZSBvZiB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJsb2NrIHN0b3JlZCBpbiBndWFyZCBtb2RlICovCisjZGVmaW5lIEdVQVJEX0lORk9fU0laRSA4CisvKiogc2l6ZSBvZiB0aGUgR1VBUkRfVkFMVUUtZmlsbGVkIHBhZGRpbmcgYWZ0ZXIgdGhlIGhlYWRlciBpbmZvICAqLworI2RlZmluZSBHVUFSRF9TVEFSVF9QQUQgMTYKKy8qKiBzaXplIG9mIHRoZSBHVUFSRF9WQUxVRS1maWxsZWQgcGFkZGluZyBhdCB0aGUgZW5kIG9mIHRoZSBibG9jayAqLworI2RlZmluZSBHVUFSRF9FTkRfUEFEIDE2CisvKiogc2l6ZSBvZiBzdHVmZiBhdCBzdGFydCBvZiBibG9jayAqLworI2RlZmluZSBHVUFSRF9TVEFSVF9PRkZTRVQgKEdVQVJEX1NUQVJUX1BBRCArIEdVQVJEX0lORk9fU0laRSkKKy8qKiB0b3RhbCBleHRyYSBzaXplIG92ZXIgdGhlIHJlcXVlc3RlZCBhbGxvY2F0aW9uIGZvciBndWFyZCBzdHVmZiAqLworI2RlZmluZSBHVUFSRF9FWFRSQV9TSVpFIChHVUFSRF9TVEFSVF9PRkZTRVQgKyBHVUFSRF9FTkRfUEFEKQorCitzdGF0aWMgdm9pZAorX2RidXNfaW5pdGlhbGl6ZV9tYWxsb2NfZGVidWcgKHZvaWQpCit7CisgIGlmICghZGVidWdfaW5pdGlhbGl6ZWQpCisgICAgeworICAgICAgZGVidWdfaW5pdGlhbGl6ZWQgPSBUUlVFOworICAgICAgCisgICAgICBpZiAoX2RidXNfZ2V0ZW52ICgiREJVU19NQUxMT0NfRkFJTF9OVEgiKSAhPSBOVUxMKQorCXsKKwkgIGZhaWxfbnRoID0gYXRvaSAoX2RidXNfZ2V0ZW52ICgiREJVU19NQUxMT0NfRkFJTF9OVEgiKSk7CisgICAgICAgICAgZmFpbF9hbGxvY19jb3VudGVyID0gZmFpbF9udGg7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIldpbGwgZmFpbCBkYnVzX21hbGxvYyBldmVyeSAlZCB0aW1lc1xuIiwgZmFpbF9udGgpOworCX0KKyAgICAgIAorICAgICAgaWYgKF9kYnVzX2dldGVudiAoIkRCVVNfTUFMTE9DX0ZBSUxfR1JFQVRFUl9USEFOIikgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGZhaWxfc2l6ZSA9IGF0b2kgKF9kYnVzX2dldGVudiAoIkRCVVNfTUFMTE9DX0ZBSUxfR1JFQVRFUl9USEFOIikpOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJXaWxsIGZhaWwgbWFsbG9jcyBvdmVyICVsZCBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgZmFpbF9zaXplKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoX2RidXNfZ2V0ZW52ICgiREJVU19NQUxMT0NfR1VBUkRTIikgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGd1YXJkcyA9IFRSVUU7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIldpbGwgdXNlIGRidXNfbWFsbG9jIGd1YXJkc1xuIik7CisgICAgICAgIH0KKworICAgICAgaWYgKF9kYnVzX2dldGVudiAoIkRCVVNfRElTQUJMRV9NRU1fUE9PTFMiKSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGlzYWJsZV9tZW1fcG9vbHMgPSBUUlVFOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJXaWxsIGRpc2FibGUgbWVtb3J5IHBvb2xzXG4iKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoX2RidXNfZ2V0ZW52ICgiREJVU19NQUxMT0NfQkFDS1RSQUNFUyIpICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBiYWNrdHJhY2Vfb25fZmFpbF9hbGxvYyA9IFRSVUU7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIldpbGwgYmFja3RyYWNlIG9uIGZhaWxpbmcgYSBkYnVzX21hbGxvY1xuIik7CisgICAgICAgIH0KKworICAgICAgaWYgKF9kYnVzX2dldGVudiAoIkRCVVNfTUFMTE9DX0NBTk5PVF9GQUlMIikgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIG1hbGxvY19jYW5ub3RfZmFpbCA9IFRSVUU7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIldpbGwgYWJvcnQgaWYgc3lzdGVtIG1hbGxvYygpIGFuZCBmcmllbmRzIGZhaWxcbiIpOworICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIFdoZXRoZXIgdG8gdHVybiBvZmYgbWVtIHBvb2xzLCB1c2VmdWwgZm9yIGxlYWsgY2hlY2tpbmcuCisgKgorICogQHJldHVybnMgI1RSVUUgaWYgbWVtcG9vbHMgc2hvdWxkIG5vdCBiZSB1c2VkLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZGlzYWJsZV9tZW1fcG9vbHMgKHZvaWQpCit7CisgIF9kYnVzX2luaXRpYWxpemVfbWFsbG9jX2RlYnVnICgpOworICByZXR1cm4gZGlzYWJsZV9tZW1fcG9vbHM7Cit9CisKKy8qKgorICogU2V0cyB0aGUgbnVtYmVyIG9mIGFsbG9jYXRpb25zIHVudGlsIHdlIHNpbXVsYXRlIGEgZmFpbGVkCisgKiBhbGxvY2F0aW9uLiBJZiBzZXQgdG8gMCwgdGhlIG5leHQgYWxsb2NhdGlvbiB0byBydW4KKyAqIGZhaWxzOyBpZiBzZXQgdG8gMSwgb25lIHN1Y2NlZWRzIHRoZW4gdGhlIG5leHQgZmFpbHM7IGV0Yy4KKyAqIFNldCB0byBfREJVU19JTlRfTUFYIHRvIG5vdCBmYWlsIGFueXRoaW5nLiAKKyAqCisgKiBAcGFyYW0gdW50aWxfbmV4dF9mYWlsIG51bWJlciBvZiBzdWNjZXNzZnVsIGFsbG9jcyBiZWZvcmUgb25lIGZhaWxzCisgKi8KK3ZvaWQKK19kYnVzX3NldF9mYWlsX2FsbG9jX2NvdW50ZXIgKGludCB1bnRpbF9uZXh0X2ZhaWwpCit7CisgIF9kYnVzX2luaXRpYWxpemVfbWFsbG9jX2RlYnVnICgpOworCisgIGZhaWxfYWxsb2NfY291bnRlciA9IHVudGlsX25leHRfZmFpbDsKKworI2lmIDAKKyAgX2RidXNfdmVyYm9zZSAoIlNldCBmYWlsIGFsbG9jIGNvdW50ZXIgPSAlZFxuIiwgZmFpbF9hbGxvY19jb3VudGVyKTsKKyNlbmRpZgorfQorCisvKioKKyAqIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIGFsbG9jcyB1bnRpbCB3ZSdsbCBzaW11bGF0ZQorICogYSBmYWlsZWQgYWxsb2MuCisgKgorICogQHJldHVybnMgY3VycmVudCBjb3VudGVyIHZhbHVlCisgKi8KK2ludAorX2RidXNfZ2V0X2ZhaWxfYWxsb2NfY291bnRlciAodm9pZCkKK3sKKyAgX2RidXNfaW5pdGlhbGl6ZV9tYWxsb2NfZGVidWcgKCk7CisKKyAgcmV0dXJuIGZhaWxfYWxsb2NfY291bnRlcjsKK30KKworLyoqCisgKiBTZXRzIGhvdyBtYW55IG1hbGxvY3MgdG8gZmFpbCB3aGVuIHRoZSBmYWlsIGFsbG9jIGNvdW50ZXIgcmVhY2hlcworICogMC4KKyAqCisgKiBAcGFyYW0gZmFpbHVyZXNfcGVyX2ZhaWx1cmUgbnVtYmVyIHRvIGZhaWwKKyAqLwordm9pZAorX2RidXNfc2V0X2ZhaWxfYWxsb2NfZmFpbHVyZXMgKGludCBmYWlsdXJlc19wZXJfZmFpbHVyZSkKK3sKKyAgbl9mYWlsdXJlc19wZXJfZmFpbHVyZSA9IGZhaWx1cmVzX3Blcl9mYWlsdXJlOworfQorCisvKioKKyAqIEdldHMgdGhlIG51bWJlciBvZiBmYWlsdXJlcyB3ZSdsbCBoYXZlIHdoZW4gdGhlIGZhaWwgbWFsbG9jCisgKiBjb3VudGVyIHJlYWNoZXMgMC4KKyAqCisgKiBAcmV0dXJucyBudW1iZXIgb2YgZmFpbHVyZXMgcGxhbm5lZAorICovCitpbnQKK19kYnVzX2dldF9mYWlsX2FsbG9jX2ZhaWx1cmVzICh2b2lkKQoreworICByZXR1cm4gbl9mYWlsdXJlc19wZXJfZmFpbHVyZTsKK30KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKy8qKgorICogQ2FsbGVkIHdoZW4gYWJvdXQgdG8gYWxsb2Mgc29tZSBtZW1vcnk7IGlmCisgKiBpdCByZXR1cm5zICNUUlVFLCB0aGVuIHRoZSBhbGxvY2F0aW9uIHNob3VsZAorICogZmFpbC4gSWYgaXQgcmV0dXJucyAjRkFMU0UsIHRoZW4gdGhlIGFsbG9jYXRpb24KKyAqIHNob3VsZCBub3QgZmFpbC4KKyAqCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGlzIGFsbG9jIHNob3VsZCBmYWlsCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19kZWNyZW1lbnRfZmFpbF9hbGxvY19jb3VudGVyICh2b2lkKQoreworICBfZGJ1c19pbml0aWFsaXplX21hbGxvY19kZWJ1ZyAoKTsKKyNpZmRlZiBEQlVTX1dJTl9GSVhNRQorICB7CisgICAgc3RhdGljIGRidXNfYm9vbF90IGNhbGxlZCA9IDA7CisKKyAgICBpZiAoIWNhbGxlZCkKKyAgICAgIHsKKyAgICAgICAgX2RidXNfdmVyYm9zZSgiVE9ETzogbWVtb3J5IGFsbG9jYXRpb24gdGVzdGluZyBlcnJvcnMgZGlzYWJsZWQgZm9yIG5vd1xuIik7CisgICAgICAgIGNhbGxlZCA9IDE7CisgICAgICB9CisgICAgcmV0dXJuIEZBTFNFOworICB9CisjZW5kaWYKKworICBpZiAoZmFpbF9hbGxvY19jb3VudGVyIDw9IDApCisgICAgeworICAgICAgaWYgKGJhY2t0cmFjZV9vbl9mYWlsX2FsbG9jKQorICAgICAgICBfZGJ1c19wcmludF9iYWNrdHJhY2UgKCk7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJmYWlsdXJlICVkXG4iLCBuX2ZhaWx1cmVzX3RoaXNfZmFpbHVyZSk7CisgICAgICAKKyAgICAgIG5fZmFpbHVyZXNfdGhpc19mYWlsdXJlICs9IDE7CisgICAgICBpZiAobl9mYWlsdXJlc190aGlzX2ZhaWx1cmUgPj0gbl9mYWlsdXJlc19wZXJfZmFpbHVyZSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChmYWlsX250aCA+PSAwKQorICAgICAgICAgICAgZmFpbF9hbGxvY19jb3VudGVyID0gZmFpbF9udGg7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZmFpbF9hbGxvY19jb3VudGVyID0gX0RCVVNfSU5UX01BWDsKKworICAgICAgICAgIG5fZmFpbHVyZXNfdGhpc19mYWlsdXJlID0gMDsKKworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJyZXNldCBmYWlsIGFsbG9jIGNvdW50ZXIgdG8gJWRcbiIsIGZhaWxfYWxsb2NfY291bnRlcik7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZmFpbF9hbGxvY19jb3VudGVyIC09IDE7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KKworLyoqCisgKiBHZXQgdGhlIG51bWJlciBvZiBvdXRzdGFuZGluZyBtYWxsb2MoKSdkIGJsb2Nrcy4KKyAqCisgKiBAcmV0dXJucyBudW1iZXIgb2YgYmxvY2tzCisgKi8KK2ludAorX2RidXNfZ2V0X21hbGxvY19ibG9ja3Nfb3V0c3RhbmRpbmcgKHZvaWQpCit7CisgIHJldHVybiBfZGJ1c19hdG9taWNfZ2V0ICgmbl9ibG9ja3Nfb3V0c3RhbmRpbmcpOworfQorCisvKioKKyAqIFdoZXJlIHRoZSBibG9jayBjYW1lIGZyb20uCisgKi8KK3R5cGVkZWYgZW51bQoreworICBTT1VSQ0VfVU5LTk9XTiwKKyAgU09VUkNFX01BTExPQywKKyAgU09VUkNFX1JFQUxMT0MsCisgIFNPVVJDRV9NQUxMT0NfWkVSTywKKyAgU09VUkNFX1JFQUxMT0NfTlVMTAorfSBCbG9ja1NvdXJjZTsKKworc3RhdGljIGNvbnN0IGNoYXIqCitzb3VyY2Vfc3RyaW5nIChCbG9ja1NvdXJjZSBzb3VyY2UpCit7CisgIHN3aXRjaCAoc291cmNlKQorICAgIHsKKyAgICBjYXNlIFNPVVJDRV9VTktOT1dOOgorICAgICAgcmV0dXJuICJ1bmtub3duIjsKKyAgICBjYXNlIFNPVVJDRV9NQUxMT0M6CisgICAgICByZXR1cm4gIm1hbGxvYyI7CisgICAgY2FzZSBTT1VSQ0VfUkVBTExPQzoKKyAgICAgIHJldHVybiAicmVhbGxvYyI7CisgICAgY2FzZSBTT1VSQ0VfTUFMTE9DX1pFUk86CisgICAgICByZXR1cm4gIm1hbGxvYzAiOworICAgIGNhc2UgU09VUkNFX1JFQUxMT0NfTlVMTDoKKyAgICAgIHJldHVybiAicmVhbGxvYyhOVUxMKSI7CisgICAgfQorICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJJbnZhbGlkIG1hbGxvYyBibG9jayBzb3VyY2UgSUQiKTsKKyAgcmV0dXJuICJpbnZhbGlkISI7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19ndWFyZHMgKHZvaWQgICAgICAgKmZyZWVfYmxvY2ssCisgICAgICAgICAgICAgIGRidXNfYm9vbF90IG92ZXJ3cml0ZSkKK3sKKyAgaWYgKGZyZWVfYmxvY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyICpibG9jayA9ICgodW5zaWduZWQgY2hhciopZnJlZV9ibG9jaykgLSBHVUFSRF9TVEFSVF9PRkZTRVQ7CisgICAgICBzaXplX3QgcmVxdWVzdGVkX2J5dGVzID0gKihkYnVzX3VpbnQzMl90KilibG9jazsKKyAgICAgIEJsb2NrU291cmNlIHNvdXJjZSA9ICooZGJ1c191aW50MzJfdCopKGJsb2NrICsgNCk7CisgICAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICAgIGRidXNfYm9vbF90IGZhaWxlZDsKKworICAgICAgZmFpbGVkID0gRkFMU0U7CisKKyNpZiAwCisgICAgICBfZGJ1c192ZXJib3NlICgiQ2hlY2tpbmcgJWQgYnl0ZXMgcmVxdWVzdCBmcm9tIHNvdXJjZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9ieXRlcywgc291cmNlX3N0cmluZyAoc291cmNlKSk7CisjZW5kaWYKKyAgICAgIAorICAgICAgaSA9IEdVQVJEX0lORk9fU0laRTsKKyAgICAgIHdoaWxlIChpIDwgR1VBUkRfU1RBUlRfT0ZGU0VUKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c191aW50MzJfdCB2YWx1ZSA9ICooZGJ1c191aW50MzJfdCopICZibG9ja1tpXTsKKyAgICAgICAgICBpZiAodmFsdWUgIT0gR1VBUkRfVkFMVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJCbG9jayBvZiAlbHUgYnl0ZXMgZnJvbSAlcyBoYWQgc3RhcnQgZ3VhcmQgdmFsdWUgMHgldXggYXQgJWQgZXhwZWN0ZWQgMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIHJlcXVlc3RlZF9ieXRlcywgc291cmNlX3N0cmluZyAoc291cmNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIGksIEdVQVJEX1ZBTFVFKTsKKyAgICAgICAgICAgICAgZmFpbGVkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBpICs9IDQ7CisgICAgICAgIH0KKworICAgICAgaSA9IEdVQVJEX1NUQVJUX09GRlNFVCArIHJlcXVlc3RlZF9ieXRlczsKKyAgICAgIHdoaWxlIChpIDwgKEdVQVJEX1NUQVJUX09GRlNFVCArIHJlcXVlc3RlZF9ieXRlcyArIEdVQVJEX0VORF9QQUQpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c191aW50MzJfdCB2YWx1ZSA9ICooZGJ1c191aW50MzJfdCopICZibG9ja1tpXTsKKyAgICAgICAgICBpZiAodmFsdWUgIT0gR1VBUkRfVkFMVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJCbG9jayBvZiAlbHUgYnl0ZXMgZnJvbSAlcyBoYWQgZW5kIGd1YXJkIHZhbHVlIDB4JXV4IGF0ICVkIGV4cGVjdGVkIDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSByZXF1ZXN0ZWRfYnl0ZXMsIHNvdXJjZV9zdHJpbmcgKHNvdXJjZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBpLCBHVUFSRF9WQUxVRSk7CisgICAgICAgICAgICAgIGZhaWxlZCA9IFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgaSArPSA0OworICAgICAgICB9CisKKyAgICAgIC8qIHNldCBtZW1vcnkgdG8gYW55dGhpbmcgYnV0IG51bCBieXRlcyAqLworICAgICAgaWYgKG92ZXJ3cml0ZSkKKyAgICAgICAgbWVtc2V0IChmcmVlX2Jsb2NrLCAnZycsIHJlcXVlc3RlZF9ieXRlcyk7CisgICAgICAKKyAgICAgIGlmIChmYWlsZWQpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImd1YXJkIHZhbHVlIGNvcnJ1cHRpb24iKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkKgorc2V0X2d1YXJkcyAodm9pZCAgICAgICAqcmVhbF9ibG9jaywKKyAgICAgICAgICAgIHNpemVfdCAgICAgIHJlcXVlc3RlZF9ieXRlcywKKyAgICAgICAgICAgIEJsb2NrU291cmNlIHNvdXJjZSkKK3sKKyAgdW5zaWduZWQgY2hhciAqYmxvY2sgPSByZWFsX2Jsb2NrOworICB1bnNpZ25lZCBpbnQgaTsKKyAgCisgIGlmIChibG9jayA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIF9kYnVzX2Fzc2VydCAoR1VBUkRfU1RBUlRfT0ZGU0VUICsgR1VBUkRfRU5EX1BBRCA9PSBHVUFSRF9FWFRSQV9TSVpFKTsKKyAgCisgICooKGRidXNfdWludDMyX3QqKWJsb2NrKSA9IHJlcXVlc3RlZF9ieXRlczsKKyAgKigoZGJ1c191aW50MzJfdCopKGJsb2NrICsgNCkpID0gc291cmNlOworCisgIGkgPSBHVUFSRF9JTkZPX1NJWkU7CisgIHdoaWxlIChpIDwgR1VBUkRfU1RBUlRfT0ZGU0VUKQorICAgIHsKKyAgICAgICgqKGRidXNfdWludDMyX3QqKSAmYmxvY2tbaV0pID0gR1VBUkRfVkFMVUU7CisgICAgICAKKyAgICAgIGkgKz0gNDsKKyAgICB9CisKKyAgaSA9IEdVQVJEX1NUQVJUX09GRlNFVCArIHJlcXVlc3RlZF9ieXRlczsKKyAgd2hpbGUgKGkgPCAoR1VBUkRfU1RBUlRfT0ZGU0VUICsgcmVxdWVzdGVkX2J5dGVzICsgR1VBUkRfRU5EX1BBRCkpCisgICAgeworICAgICAgKCooZGJ1c191aW50MzJfdCopICZibG9ja1tpXSkgPSBHVUFSRF9WQUxVRTsKKyAgICAgIAorICAgICAgaSArPSA0OworICAgIH0KKyAgCisgIGNoZWNrX2d1YXJkcyAoYmxvY2sgKyBHVUFSRF9TVEFSVF9PRkZTRVQsIEZBTFNFKTsKKyAgCisgIHJldHVybiBibG9jayArIEdVQVJEX1NUQVJUX09GRlNFVDsKK30KKworI2VuZGlmCisKKy8qKiBAfSAqLyAvKiBFbmQgb2YgaW50ZXJuYWxzIGRvY3MgKi8KKworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNNZW1vcnkKKyAqCisgKiBAeworICovCisKKy8qKgorICogQWxsb2NhdGVzIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMsIGFzIHdpdGggc3RhbmRhcmQKKyAqIG1hbGxvYygpLiBHdWFyYW50ZWVkIHRvIHJldHVybiAjTlVMTCBpZiBieXRlcyBpcyB6ZXJvCisgKiBvbiBhbGwgcGxhdGZvcm1zLiBSZXR1cm5zICNOVUxMIGlmIHRoZSBhbGxvY2F0aW9uIGZhaWxzLgorICogVGhlIG1lbW9yeSBtdXN0IGJlIHJlbGVhc2VkIHdpdGggZGJ1c19mcmVlKCkuCisgKgorICogZGJ1c19tYWxsb2MoKSBtZW1vcnkgaXMgTk9UIHNhZmUgdG8gZnJlZSB3aXRoIHJlZ3VsYXIgZnJlZSgpIGZyb20KKyAqIHRoZSBDIGxpYnJhcnkuIEZyZWUgaXQgd2l0aCBkYnVzX2ZyZWUoKSBvbmx5LgorICoKKyAqIEBwYXJhbSBieXRlcyBudW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUKKyAqIEByZXR1cm4gYWxsb2NhdGVkIG1lbW9yeSwgb3IgI05VTEwgaWYgdGhlIGFsbG9jYXRpb24gZmFpbHMuCisgKi8KK3ZvaWQqCitkYnVzX21hbGxvYyAoc2l6ZV90IGJ5dGVzKQoreworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgX2RidXNfaW5pdGlhbGl6ZV9tYWxsb2NfZGVidWcgKCk7CisgIAorICBpZiAoX2RidXNfZGVjcmVtZW50X2ZhaWxfYWxsb2NfY291bnRlciAoKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiIEZBSUxJTkcgbWFsbG9jIG9mICVsZCBieXRlc1xuIiwgKGxvbmcpIGJ5dGVzKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyNlbmRpZgorCisgIGlmIChieXRlcyA9PSAwKSAvKiBzb21lIHN5c3RlbSBtYWxsb2NzIGhhbmRsZSB0aGlzLCBzb21lIGRvbid0ICovCisgICAgcmV0dXJuIE5VTEw7CisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICBlbHNlIGlmIChmYWlsX3NpemUgIT0gMCAmJiBieXRlcyA+IGZhaWxfc2l6ZSkKKyAgICByZXR1cm4gTlVMTDsKKyAgZWxzZSBpZiAoZ3VhcmRzKQorICAgIHsKKyAgICAgIHZvaWQgKmJsb2NrOworCisgICAgICBibG9jayA9IG1hbGxvYyAoYnl0ZXMgKyBHVUFSRF9FWFRSQV9TSVpFKTsKKyAgICAgIGlmIChibG9jaykKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2F0b21pY19pbmMgKCZuX2Jsb2Nrc19vdXRzdGFuZGluZyk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKG1hbGxvY19jYW5ub3RfZmFpbCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJvdXQgb2YgbWVtb3J5OiBtYWxsb2MgKCVsZCArICVsZClcbiIsCisgICAgICAgICAgICAgIChsb25nKSBieXRlcywgKGxvbmcpIEdVQVJEX0VYVFJBX1NJWkUpOworICAgICAgICAgIF9kYnVzX2Fib3J0ICgpOworICAgICAgICB9CisgICAgICAKKyAgICAgIHJldHVybiBzZXRfZ3VhcmRzIChibG9jaywgYnl0ZXMsIFNPVVJDRV9NQUxMT0MpOworICAgIH0KKyNlbmRpZgorICBlbHNlCisgICAgeworICAgICAgdm9pZCAqbWVtOworICAgICAgbWVtID0gbWFsbG9jIChieXRlcyk7CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgICAgICBpZiAobWVtKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfYXRvbWljX2luYyAoJm5fYmxvY2tzX291dHN0YW5kaW5nKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAobWFsbG9jX2Nhbm5vdF9mYWlsKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIm91dCBvZiBtZW1vcnk6IG1hbGxvYyAoJWxkKVxuIiwgKGxvbmcpIGJ5dGVzKTsKKyAgICAgICAgICBfZGJ1c19hYm9ydCAoKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgIHJldHVybiBtZW07CisgICAgfQorfQorCisvKioKKyAqIEFsbG9jYXRlcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLCBhcyB3aXRoIHN0YW5kYXJkIG1hbGxvYygpLCBidXQKKyAqIGFsbCBieXRlcyBhcmUgaW5pdGlhbGl6ZWQgdG8gemVybyBhcyB3aXRoIGNhbGxvYygpLiBHdWFyYW50ZWVkIHRvCisgKiByZXR1cm4gI05VTEwgaWYgYnl0ZXMgaXMgemVybyBvbiBhbGwgcGxhdGZvcm1zLiBSZXR1cm5zICNOVUxMIGlmIHRoZQorICogYWxsb2NhdGlvbiBmYWlscy4gIFRoZSBtZW1vcnkgbXVzdCBiZSByZWxlYXNlZCB3aXRoIGRidXNfZnJlZSgpLgorICoKKyAqIGRidXNfbWFsbG9jMCgpIG1lbW9yeSBpcyBOT1Qgc2FmZSB0byBmcmVlIHdpdGggcmVndWxhciBmcmVlKCkgZnJvbQorICogdGhlIEMgbGlicmFyeS4gRnJlZSBpdCB3aXRoIGRidXNfZnJlZSgpIG9ubHkuCisgKgorICogQHBhcmFtIGJ5dGVzIG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZQorICogQHJldHVybiBhbGxvY2F0ZWQgbWVtb3J5LCBvciAjTlVMTCBpZiB0aGUgYWxsb2NhdGlvbiBmYWlscy4KKyAqLwordm9pZCoKK2RidXNfbWFsbG9jMCAoc2l6ZV90IGJ5dGVzKQoreworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgX2RidXNfaW5pdGlhbGl6ZV9tYWxsb2NfZGVidWcgKCk7CisgIAorICBpZiAoX2RidXNfZGVjcmVtZW50X2ZhaWxfYWxsb2NfY291bnRlciAoKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiIEZBSUxJTkcgbWFsbG9jMCBvZiAlbGQgYnl0ZXNcbiIsIChsb25nKSBieXRlcyk7CisgICAgICAKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyNlbmRpZgorICAKKyAgaWYgKGJ5dGVzID09IDApCisgICAgcmV0dXJuIE5VTEw7CisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICBlbHNlIGlmIChmYWlsX3NpemUgIT0gMCAmJiBieXRlcyA+IGZhaWxfc2l6ZSkKKyAgICByZXR1cm4gTlVMTDsKKyAgZWxzZSBpZiAoZ3VhcmRzKQorICAgIHsKKyAgICAgIHZvaWQgKmJsb2NrOworCisgICAgICBibG9jayA9IGNhbGxvYyAoYnl0ZXMgKyBHVUFSRF9FWFRSQV9TSVpFLCAxKTsKKworICAgICAgaWYgKGJsb2NrKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfYXRvbWljX2luYyAoJm5fYmxvY2tzX291dHN0YW5kaW5nKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAobWFsbG9jX2Nhbm5vdF9mYWlsKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIm91dCBvZiBtZW1vcnk6IGNhbGxvYyAoJWxkICsgJWxkLCAxKVxuIiwKKyAgICAgICAgICAgICAgKGxvbmcpIGJ5dGVzLCAobG9uZykgR1VBUkRfRVhUUkFfU0laRSk7CisgICAgICAgICAgX2RidXNfYWJvcnQgKCk7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIHNldF9ndWFyZHMgKGJsb2NrLCBieXRlcywgU09VUkNFX01BTExPQ19aRVJPKTsKKyAgICB9CisjZW5kaWYKKyAgZWxzZQorICAgIHsKKyAgICAgIHZvaWQgKm1lbTsKKyAgICAgIG1lbSA9IGNhbGxvYyAoYnl0ZXMsIDEpOworCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICAgICAgaWYgKG1lbSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2F0b21pY19pbmMgKCZuX2Jsb2Nrc19vdXRzdGFuZGluZyk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKG1hbGxvY19jYW5ub3RfZmFpbCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJvdXQgb2YgbWVtb3J5OiBjYWxsb2MgKCVsZClcbiIsIChsb25nKSBieXRlcyk7CisgICAgICAgICAgX2RidXNfYWJvcnQgKCk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICByZXR1cm4gbWVtOworICAgIH0KK30KKworLyoqCisgKiBSZXNpemVzIGEgYmxvY2sgb2YgbWVtb3J5IHByZXZpb3VzbHkgYWxsb2NhdGVkIGJ5IGRidXNfbWFsbG9jKCkgb3IKKyAqIGRidXNfbWFsbG9jMCgpLiBHdWFyYW50ZWVkIHRvIGZyZWUgdGhlIG1lbW9yeSBhbmQgcmV0dXJuICNOVUxMIGlmIGJ5dGVzCisgKiBpcyB6ZXJvIG9uIGFsbCBwbGF0Zm9ybXMuIFJldHVybnMgI05VTEwgaWYgdGhlIHJlc2l6ZSBmYWlscy4KKyAqIElmIHRoZSByZXNpemUgZmFpbHMsIHRoZSBtZW1vcnkgaXMgbm90IGZyZWVkLgorICoKKyAqIEBwYXJhbSBtZW1vcnkgYmxvY2sgdG8gYmUgcmVzaXplZAorICogQHBhcmFtIGJ5dGVzIG5ldyBzaXplIG9mIHRoZSBtZW1vcnkgYmxvY2sKKyAqIEByZXR1cm4gYWxsb2NhdGVkIG1lbW9yeSwgb3IgI05VTEwgaWYgdGhlIHJlc2l6ZSBmYWlscy4KKyAqLwordm9pZCoKK2RidXNfcmVhbGxvYyAodm9pZCAgKm1lbW9yeSwKKyAgICAgICAgICAgICAgc2l6ZV90IGJ5dGVzKQoreworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgX2RidXNfaW5pdGlhbGl6ZV9tYWxsb2NfZGVidWcgKCk7CisgIAorICBpZiAoX2RidXNfZGVjcmVtZW50X2ZhaWxfYWxsb2NfY291bnRlciAoKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiIEZBSUxJTkcgcmVhbGxvYyBvZiAlbGQgYnl0ZXNcbiIsIChsb25nKSBieXRlcyk7CisgICAgICAKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyNlbmRpZgorICAKKyAgaWYgKGJ5dGVzID09IDApIC8qIGd1YXJhbnRlZSB0aGlzIGlzIHNhZmUgKi8KKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKG1lbW9yeSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICBlbHNlIGlmIChmYWlsX3NpemUgIT0gMCAmJiBieXRlcyA+IGZhaWxfc2l6ZSkKKyAgICByZXR1cm4gTlVMTDsKKyAgZWxzZSBpZiAoZ3VhcmRzKQorICAgIHsKKyAgICAgIGlmIChtZW1vcnkpCisgICAgICAgIHsKKyAgICAgICAgICBzaXplX3Qgb2xkX2J5dGVzOworICAgICAgICAgIHZvaWQgKmJsb2NrOworICAgICAgICAgIAorICAgICAgICAgIGNoZWNrX2d1YXJkcyAobWVtb3J5LCBGQUxTRSk7CisgICAgICAgICAgCisgICAgICAgICAgYmxvY2sgPSByZWFsbG9jICgoKHVuc2lnbmVkIGNoYXIqKW1lbW9yeSkgLSBHVUFSRF9TVEFSVF9PRkZTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcyArIEdVQVJEX0VYVFJBX1NJWkUpOworCisgICAgICAgICAgaWYgKGJsb2NrID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChtYWxsb2NfY2Fubm90X2ZhaWwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm91dCBvZiBtZW1vcnk6IHJlYWxsb2MgKCVwLCAlbGQgKyAlbGQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwgKGxvbmcpIGJ5dGVzLCAobG9uZykgR1VBUkRfRVhUUkFfU0laRSk7CisgICAgICAgICAgICAgICAgICBfZGJ1c19hYm9ydCAoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBvbGRfYnl0ZXMgPSAqKGRidXNfdWludDMyX3QqKWJsb2NrOworICAgICAgICAgIGlmIChieXRlcyA+PSBvbGRfYnl0ZXMpCisgICAgICAgICAgICAvKiBvbGQgZ3VhcmRzIHNob3VsZG4ndCBoYXZlIG1vdmVkICovCisgICAgICAgICAgICBjaGVja19ndWFyZHMgKCgodW5zaWduZWQgY2hhciopYmxvY2spICsgR1VBUkRfU1RBUlRfT0ZGU0VULCBGQUxTRSk7CisgICAgICAgICAgCisgICAgICAgICAgcmV0dXJuIHNldF9ndWFyZHMgKGJsb2NrLCBieXRlcywgU09VUkNFX1JFQUxMT0MpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB2b2lkICpibG9jazsKKyAgICAgICAgICAKKyAgICAgICAgICBibG9jayA9IG1hbGxvYyAoYnl0ZXMgKyBHVUFSRF9FWFRSQV9TSVpFKTsKKworICAgICAgICAgIGlmIChibG9jaykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfYXRvbWljX2luYyAoJm5fYmxvY2tzX291dHN0YW5kaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChtYWxsb2NfY2Fubm90X2ZhaWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJvdXQgb2YgbWVtb3J5OiBtYWxsb2MgKCVsZCArICVsZClcbiIsCisgICAgICAgICAgICAgICAgICAobG9uZykgYnl0ZXMsIChsb25nKSBHVUFSRF9FWFRSQV9TSVpFKTsKKyAgICAgICAgICAgICAgX2RidXNfYWJvcnQgKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gc2V0X2d1YXJkcyAoYmxvY2ssIGJ5dGVzLCBTT1VSQ0VfUkVBTExPQ19OVUxMKTsgICAKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICBlbHNlCisgICAgeworICAgICAgdm9pZCAqbWVtOworICAgICAgbWVtID0gcmVhbGxvYyAobWVtb3J5LCBieXRlcyk7CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgICAgICBpZiAobWVtID09IE5VTEwgJiYgbWFsbG9jX2Nhbm5vdF9mYWlsKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIm91dCBvZiBtZW1vcnk6IG1hbGxvYyAoJWxkKVxuIiwgKGxvbmcpIGJ5dGVzKTsKKyAgICAgICAgICBfZGJ1c19hYm9ydCAoKTsKKyAgICAgICAgfQorCisgICAgICBpZiAobWVtb3J5ID09IE5VTEwgJiYgbWVtICE9IE5VTEwpCisJICAgIF9kYnVzX2F0b21pY19pbmMgKCZuX2Jsb2Nrc19vdXRzdGFuZGluZyk7CisjZW5kaWYKKyAgICAgIHJldHVybiBtZW07CisgICAgfQorfQorCisvKioKKyAqIEZyZWVzIGEgYmxvY2sgb2YgbWVtb3J5IHByZXZpb3VzbHkgYWxsb2NhdGVkIGJ5IGRidXNfbWFsbG9jKCkgb3IKKyAqIGRidXNfbWFsbG9jMCgpLiBJZiBwYXNzZWQgI05VTEwsIGRvZXMgbm90aGluZy4KKyAqIAorICogQHBhcmFtIG1lbW9yeSBibG9jayB0byBiZSBmcmVlZAorICovCit2b2lkCitkYnVzX2ZyZWUgKHZvaWQgICptZW1vcnkpCit7CisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICBpZiAoZ3VhcmRzKQorICAgIHsKKyAgICAgIGNoZWNrX2d1YXJkcyAobWVtb3J5LCBUUlVFKTsKKyAgICAgIGlmIChtZW1vcnkpCisgICAgICAgIHsKKyNpZmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisgICAgICAgICAgX2RidXNfYXRvbWljX2RlYyAoJm5fYmxvY2tzX291dHN0YW5kaW5nKTsKKyNlbHNlCisgICAgICAgICAgZGJ1c19pbnQzMl90IG9sZF92YWx1ZTsKKworICAgICAgICAgIG9sZF92YWx1ZSA9IF9kYnVzX2F0b21pY19kZWMgKCZuX2Jsb2Nrc19vdXRzdGFuZGluZyk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0IChvbGRfdmFsdWUgPj0gMSk7CisjZW5kaWYKKworICAgICAgICAgIGZyZWUgKCgodW5zaWduZWQgY2hhciopbWVtb3J5KSAtIEdVQVJEX1NUQVJUX09GRlNFVCk7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorICAgIAorICBpZiAobWVtb3J5KSAvKiB3ZSBndWFyYW50ZWUgaXQncyBzYWZlIHRvIGZyZWUgKE5VTEwpICovCisgICAgeworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyNpZmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisgICAgICBfZGJ1c19hdG9taWNfZGVjICgmbl9ibG9ja3Nfb3V0c3RhbmRpbmcpOworI2Vsc2UKKyAgICAgIGRidXNfaW50MzJfdCBvbGRfdmFsdWU7CisKKyAgICAgIG9sZF92YWx1ZSA9IF9kYnVzX2F0b21pY19kZWMgKCZuX2Jsb2Nrc19vdXRzdGFuZGluZyk7CisgICAgICBfZGJ1c19hc3NlcnQgKG9sZF92YWx1ZSA+PSAxKTsKKyNlbmRpZgorI2VuZGlmCisKKyAgICAgIGZyZWUgKG1lbW9yeSk7CisgICAgfQorfQorCisvKioKKyAqIEZyZWVzIGEgI05VTEwtdGVybWluYXRlZCBhcnJheSBvZiBzdHJpbmdzLgorICogSWYgcGFzc2VkICNOVUxMLCBkb2VzIG5vdGhpbmcuCisgKgorICogQHBhcmFtIHN0cl9hcnJheSB0aGUgYXJyYXkgdG8gYmUgZnJlZWQKKyAqLwordm9pZAorZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoY2hhciAqKnN0cl9hcnJheSkKK3sKKyAgaWYgKHN0cl9hcnJheSkKKyAgICB7CisgICAgICBpbnQgaTsKKworICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAoc3RyX2FycmF5W2ldKQorCXsKKwkgIGRidXNfZnJlZSAoc3RyX2FycmF5W2ldKTsKKwkgIGkrKzsKKwl9CisKKyAgICAgIGRidXNfZnJlZSAoc3RyX2FycmF5KTsKKyAgICB9Cit9CisKKy8qKiBAfSAqLyAvKiBFbmQgb2YgcHVibGljIEFQSSBkb2NzIGJsb2NrICovCisKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzTWVtb3J5SW50ZXJuYWxzCisgKgorICogQHsKKyAqLworCisvKioKKyAqIF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbiBpcyB1c2VkIHRvIHRyYWNrIGVhY2gKKyAqIHRpbWUgdGhhdCBkYnVzX3NodXRkb3duKCkgaXMgY2FsbGVkLCBzbyB3ZSBjYW4KKyAqIHJlaW5pdCB0aGluZ3MgYWZ0ZXIgaXQncyBiZWVuIGNhbGxlZC4gSXQgaXMgc2ltcGx5CisgKiBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgd2Ugc2h1dCBkb3duLgorICovCitpbnQgX2RidXNfY3VycmVudF9nZW5lcmF0aW9uID0gMTsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIHNodXRkb3duLgorICovCit0eXBlZGVmIHN0cnVjdCBTaHV0ZG93bkNsb3N1cmUgU2h1dGRvd25DbG9zdXJlOworCisvKioKKyAqIFRoaXMgc3RydWN0IHJlcHJlc2VudHMgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gc2h1dGRvd24uCisgKi8KK3N0cnVjdCBTaHV0ZG93bkNsb3N1cmUKK3sKKyAgU2h1dGRvd25DbG9zdXJlICpuZXh0OyAgICAgLyoqPCBOZXh0IFNodXRkb3duQ2xvc3VyZSAqLworICBEQnVzU2h1dGRvd25GdW5jdGlvbiBmdW5jOyAvKio8IEZ1bmN0aW9uIHRvIGNhbGwgKi8KKyAgdm9pZCAqZGF0YTsgICAgICAgICAgICAgICAgLyoqPCBEYXRhIGZvciBmdW5jdGlvbiAqLworfTsKKworX0RCVVNfREVGSU5FX0dMT0JBTF9MT0NLIChzaHV0ZG93bl9mdW5jcyk7CitzdGF0aWMgU2h1dGRvd25DbG9zdXJlICpyZWdpc3RlcmVkX2dsb2JhbHMgPSBOVUxMOworCisvKioKKyAqIFJlZ2lzdGVyIGEgY2xlYW51cCBmdW5jdGlvbiB0byBiZSBjYWxsZWQgZXhhY3RseSBvbmNlCisgKiB0aGUgbmV4dCB0aW1lIGRidXNfc2h1dGRvd24oKSBpcyBjYWxsZWQuCisgKgorICogQHBhcmFtIGZ1bmMgdGhlIGZ1bmN0aW9uCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3JlZ2lzdGVyX3NodXRkb3duX2Z1bmMgKERCdXNTaHV0ZG93bkZ1bmN0aW9uICBmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgKmRhdGEpCit7CisgIFNodXRkb3duQ2xvc3VyZSAqYzsKKworICBjID0gZGJ1c19uZXcgKFNodXRkb3duQ2xvc3VyZSwgMSk7CisKKyAgaWYgKGMgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgYy0+ZnVuYyA9IGZ1bmM7CisgIGMtPmRhdGEgPSBkYXRhOworCisgIF9EQlVTX0xPQ0sgKHNodXRkb3duX2Z1bmNzKTsKKyAgCisgIGMtPm5leHQgPSByZWdpc3RlcmVkX2dsb2JhbHM7CisgIHJlZ2lzdGVyZWRfZ2xvYmFscyA9IGM7CisKKyAgX0RCVVNfVU5MT0NLIChzaHV0ZG93bl9mdW5jcyk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqIEB9ICovIC8qIEVuZCBvZiBwcml2YXRlIEFQSSBkb2NzIGJsb2NrICovCisKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzTWVtb3J5CisgKgorICogQHsKKyAqLworCisvKioKKyAqIEZyZWVzIGFsbCBtZW1vcnkgYWxsb2NhdGVkIGludGVybmFsbHkgYnkgbGliZGJ1cyBhbmQKKyAqIHJldmVyc2VzIHRoZSBlZmZlY3RzIG9mIGRidXNfdGhyZWFkc19pbml0KCkuIGxpYmRidXMga2VlcHMgaW50ZXJuYWwKKyAqIGdsb2JhbCB2YXJpYWJsZXMsIGZvciBleGFtcGxlIGNhY2hlcyBhbmQgdGhyZWFkIGxvY2tzLCBhbmQgaXQKKyAqIGNhbiBiZSB1c2VmdWwgdG8gZnJlZSB0aGVzZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMuCisgKgorICogZGJ1c19zaHV0ZG93bigpIGRvZXMgTk9UIGZyZWUgbWVtb3J5IHRoYXQgd2FzIHJldHVybmVkCisgKiB0byB0aGUgYXBwbGljYXRpb24uIEl0IG9ubHkgcmV0dXJucyBsaWJkYnVzLWludGVybmFsCisgKiBkYXRhIHN0cnVjdHVyZXMuCisgKgorICogWW91IE1VU1QgZnJlZSBhbGwgbWVtb3J5IGFuZCByZWxlYXNlIGFsbCByZWZlcmVuY2UgY291bnRzCisgKiByZXR1cm5lZCB0byB5b3UgYnkgbGliZGJ1cyBwcmlvciB0byBjYWxsaW5nIGRidXNfc2h1dGRvd24oKS4KKyAqCisgKiBZb3UgY2FuJ3QgY29udGludWUgdG8gdXNlIGFueSBELUJ1cyBvYmplY3RzLCBzdWNoIGFzIGNvbm5lY3Rpb25zLAorICogdGhhdCB3ZXJlIGFsbG9jYXRlZCBwcmlvciB0byBkYnVzX3NodXRkb3duKCkuIFlvdSBjYW4sIGhvd2V2ZXIsCisgKiBzdGFydCBvdmVyOyBjYWxsIGRidXNfdGhyZWFkc19pbml0KCkgYWdhaW4sIGNyZWF0ZSBuZXcgY29ubmVjdGlvbnMsCisgKiBhbmQgc28gZm9ydGguCisgKgorICogV0FSTklORzogZGJ1c19zaHV0ZG93bigpIGlzIE5PVCB0aHJlYWQgc2FmZSwgaXQgbXVzdCBiZSBjYWxsZWQKKyAqIHdoaWxlIE5PIG90aGVyIHRocmVhZHMgYXJlIHVzaW5nIEQtQnVzLiAoUmVtZW1iZXIsIHlvdSBoYXZlIHRvIGZyZWUKKyAqIGFsbCBELUJ1cyBvYmplY3RzIGFuZCBtZW1vcnkgYmVmb3JlIHlvdSBjYWxsIGRidXNfc2h1dGRvd24oKSwgc28gbm8KKyAqIHRocmVhZCBjYW4gYmUgdXNpbmcgbGliZGJ1cy4pCisgKgorICogVGhlIHB1cnBvc2Ugb2YgZGJ1c19zaHV0ZG93bigpIGlzIHRvIGFsbG93IGFwcGxpY2F0aW9ucyB0byBnZXQKKyAqIGNsZWFuIG91dHB1dCBmcm9tIG1lbW9yeSBsZWFrIGNoZWNrZXJzLiBkYnVzX3NodXRkb3duKCkgbWF5IGFsc28gYmUKKyAqIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBkbG9wZW4oKSBsaWJkYnVzIGluc3RlYWQgb2YgbGlua2luZyB0byBpdCwKKyAqIGFuZCB3YW50IHRvIGJlIGFibGUgdG8gdW5sb2FkIHRoZSBsaWJyYXJ5IGFnYWluLgorICoKKyAqIFRoZXJlIGlzIGFic29sdXRlbHkgbm8gcmVxdWlyZW1lbnQgdG8gY2FsbCBkYnVzX3NodXRkb3duKCkgLSBpbiBmYWN0LAorICogbW9zdCBhcHBsaWNhdGlvbnMgd29uJ3QgYm90aGVyIGFuZCBzaG91bGQgbm90IGZlZWwgZ3VpbHR5LgorICogCisgKiBZb3UgaGF2ZSB0byBrbm93IHRoYXQgbm9ib2R5IGlzIHVzaW5nIGxpYmRidXMgaW4geW91ciBhcHBsaWNhdGlvbidzCisgKiBwcm9jZXNzIGJlZm9yZSB5b3UgY2FuIGNhbGwgZGJ1c19zaHV0ZG93bigpLiBPbmUgaW1wbGljYXRpb24gb2YgdGhpcworICogaXMgdGhhdCBjYWxsaW5nIGRidXNfc2h1dGRvd24oKSBmcm9tIGEgbGlicmFyeSBpcyBhbG1vc3QgY2VydGFpbmx5CisgKiB3cm9uZywgc2luY2UgeW91IGRvbid0IGtub3cgd2hhdCB0aGUgcmVzdCBvZiB0aGUgYXBwIGlzIHVwIHRvLgorICogCisgKi8KK3ZvaWQKK2RidXNfc2h1dGRvd24gKHZvaWQpCit7CisgIHdoaWxlIChyZWdpc3RlcmVkX2dsb2JhbHMgIT0gTlVMTCkKKyAgICB7CisgICAgICBTaHV0ZG93bkNsb3N1cmUgKmM7CisKKyAgICAgIGMgPSByZWdpc3RlcmVkX2dsb2JhbHM7CisgICAgICByZWdpc3RlcmVkX2dsb2JhbHMgPSBjLT5uZXh0OworICAgICAgCisgICAgICAoKiBjLT5mdW5jKSAoYy0+ZGF0YSk7CisgICAgICAKKyAgICAgIGRidXNfZnJlZSAoYyk7CisgICAgfQorCisgIF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbiArPSAxOworfQorCisvKiogQH0gKi8gLyoqIEVuZCBvZiBwdWJsaWMgQVBJIGRvY3MgYmxvY2sgKi8KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKworLyoqCisgKiBAaW5ncm91cCBEQnVzTWVtb3J5SW50ZXJuYWxzCisgKiBVbml0IHRlc3QgZm9yIERCdXNNZW1vcnkKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19tZW1vcnlfdGVzdCAodm9pZCkKK3sKKyAgZGJ1c19ib29sX3Qgb2xkX2d1YXJkczsKKyAgdm9pZCAqcDsKKyAgc2l6ZV90IHNpemU7CisKKyAgb2xkX2d1YXJkcyA9IGd1YXJkczsKKyAgZ3VhcmRzID0gVFJVRTsKKyAgcCA9IGRidXNfbWFsbG9jICg0KTsKKyAgaWYgKHAgPT0gTlVMTCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgZm9yIChzaXplID0gNDsgc2l6ZSA8IDI1Njsgc2l6ZSArPSA0KQorICAgIHsKKyAgICAgIHAgPSBkYnVzX3JlYWxsb2MgKHAsIHNpemUpOworICAgICAgaWYgKHAgPT0gTlVMTCkKKwlfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgICB9CisgIGZvciAoc2l6ZSA9IDI1Njsgc2l6ZSAhPSAwOyBzaXplIC09IDQpCisgICAgeworICAgICAgcCA9IGRidXNfcmVhbGxvYyAocCwgc2l6ZSk7CisgICAgICBpZiAocCA9PSBOVUxMKQorCV9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworICAgIH0KKyAgZGJ1c19mcmVlIChwKTsKKyAgZ3VhcmRzID0gb2xkX2d1YXJkczsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtbWVtb3J5LmggYi9kYnVzL2RidXMvZGJ1cy1tZW1vcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmQ1NmJkCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtbWVtb3J5LmgKQEAgLTAsMCArMSw3MyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1lbW9yeS5oICBELUJ1cyBtZW1vcnkgaGFuZGxpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmICFkZWZpbmVkIChEQlVTX0lOU0lERV9EQlVTX0gpICYmICFkZWZpbmVkIChEQlVTX0NPTVBJTEFUSU9OKQorI2Vycm9yICJPbmx5IDxkYnVzL2RidXMuaD4gY2FuIGJlIGluY2x1ZGVkIGRpcmVjdGx5LCB0aGlzIGZpbGUgbWF5IGRpc2FwcGVhciBvciBjaGFuZ2UgY29udGVudHMuIgorI2VuZGlmCisKKyNpZm5kZWYgREJVU19NRU1PUllfSAorI2RlZmluZSBEQlVTX01FTU9SWV9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFjcm9zLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzTWVtb3J5CisgKiBAeworICovCisKK0RCVVNfRVhQT1JUCitEQlVTX01BTExPQworREJVU19BTExPQ19TSVpFKDEpCit2b2lkKiBkYnVzX21hbGxvYyAgICAgICAgKHNpemVfdCBieXRlcyk7CisKK0RCVVNfRVhQT1JUCitEQlVTX01BTExPQworREJVU19BTExPQ19TSVpFKDEpCit2b2lkKiBkYnVzX21hbGxvYzAgICAgICAgKHNpemVfdCBieXRlcyk7CisKK0RCVVNfRVhQT1JUCitEQlVTX01BTExPQworREJVU19BTExPQ19TSVpFKDIpCit2b2lkKiBkYnVzX3JlYWxsb2MgICAgICAgKHZvaWQgICptZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBieXRlcyk7CitEQlVTX0VYUE9SVAordm9pZCAgZGJ1c19mcmVlICAgICAgICAgICh2b2lkICAqbWVtb3J5KTsKKworI2RlZmluZSBkYnVzX25ldyh0eXBlLCBjb3VudCkgICgodHlwZSopZGJ1c19tYWxsb2MgKHNpemVvZiAodHlwZSkgKiAoY291bnQpKSkKKyNkZWZpbmUgZGJ1c19uZXcwKHR5cGUsIGNvdW50KSAoKHR5cGUqKWRidXNfbWFsbG9jMCAoc2l6ZW9mICh0eXBlKSAqIChjb3VudCkpKQorCitEQlVTX0VYUE9SVAordm9pZCBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChjaGFyICoqc3RyX2FycmF5KTsKKwordHlwZWRlZiB2b2lkICgqIERCdXNGcmVlRnVuY3Rpb24pICh2b2lkICptZW1vcnkpOworCitEQlVTX0VYUE9SVAordm9pZCBkYnVzX3NodXRkb3duICh2b2lkKTsKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX01FTU9SWV9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1tZW1wb29sLmMgYi9kYnVzL2RidXMvZGJ1cy1tZW1wb29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNhYWJmOQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLW1lbXBvb2wuYwpAQCAtMCwwICsxLDYzNSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1lbXBvb2wuaCBNZW1vcnkgcG9vbHMKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLW1lbXBvb2wuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtdmFsZ3JpbmQtaW50ZXJuYWwuaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c01lbVBvb2wgbWVtb3J5IHBvb2xzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNNZW1Qb29sIG9iamVjdAorICoKKyAqIFR5cGVzIGFuZCBmdW5jdGlvbnMgcmVsYXRlZCB0byBEQnVzTWVtUG9vbC4gIEEgbWVtb3J5IHBvb2wgaXMgdXNlZAorICogdG8gZGVjcmVhc2UgbWVtb3J5IGZyYWdtZW50YXRpb24vb3ZlcmhlYWQgYW5kIGluY3JlYXNlIHNwZWVkIGZvcgorICogYmxvY2tzIG9mIHNtYWxsIHVuaWZvcm1seS1zaXplZCBvYmplY3RzLiBUaGUgbWFpbiBwb2ludCBpcyB0byBhdm9pZAorICogdGhlIG92ZXJoZWFkIG9mIGEgbWFsbG9jIGJsb2NrIGZvciBlYWNoIHNtYWxsIG9iamVjdCwgc3BlZWQgaXMKKyAqIHNlY29uZGFyeS4KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBEQnVzTWVtUG9vbEludGVybmFscyBNZW1vcnkgcG9vbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNNZW1Qb29sIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqCisgKiBUaGUgZ3V0cyBvZiBEQnVzTWVtUG9vbC4KKyAqCisgKiBAeworICovCisKKy8qKgorICogdHlwZWRlZiBzbyBEQnVzRnJlZWRFbGVtZW50IHN0cnVjdCBjYW4gcmVmZXIgdG8gaXRzZWxmLgorICovCit0eXBlZGVmIHN0cnVjdCBEQnVzRnJlZWRFbGVtZW50IERCdXNGcmVlZEVsZW1lbnQ7CisKKy8qKgorICogc3RydWN0IHJlcHJlc2VudGluZyBhbiBlbGVtZW50IG9uIHRoZSBmcmVlIGxpc3QuCisgKiBXZSBqdXN0IGNhc3QgZnJlZWQgZWxlbWVudHMgdG8gdGhpcyBzbyB3ZSBjYW4KKyAqIG1ha2UgYSBsaXN0IG91dCBvZiB0aGVtLgorICovCitzdHJ1Y3QgREJ1c0ZyZWVkRWxlbWVudAoreworICBEQnVzRnJlZWRFbGVtZW50ICpuZXh0OyAvKio8IG5leHQgZWxlbWVudCBvZiB0aGUgZnJlZSBsaXN0ICovCit9OworCisvKioKKyAqIFRoZSBkdW1teSBzaXplIG9mIHRoZSB2YXJpYWJsZS1sZW5ndGggImVsZW1lbnRzIgorICogZmllbGQgaW4gREJ1c01lbUJsb2NrCisgKi8KKyNkZWZpbmUgRUxFTUVOVF9QQURESU5HIDQKKworLyoqCisgKiBUeXBlZGVmIGZvciBEQnVzTWVtQmxvY2sgc28gdGhlIHN0cnVjdCBjYW4gcmVjdXJzaXZlbHkKKyAqIHBvaW50IHRvIGl0c2VsZi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c01lbUJsb2NrIERCdXNNZW1CbG9jazsKKworLyoqCisgKiBEQnVzTWVtQmxvY2sgb2JqZWN0IHJlcHJlc2VudHMgYSBzaW5nbGUgbWFsbG9jKCktcmV0dXJuZWQKKyAqIGJsb2NrIHRoYXQgZ2V0cyBjaHVua2VkIHVwIGludG8gb2JqZWN0cyBpbiB0aGUgbWVtb3J5IHBvb2wuCisgKi8KK3N0cnVjdCBEQnVzTWVtQmxvY2sKK3sKKyAgREJ1c01lbUJsb2NrICpuZXh0OyAgLyoqPCBuZXh0IGJsb2NrIGluIHRoZSBsaXN0LCB3aGljaCBpcyBhbHJlYWR5IHVzZWQgdXA7CisgICAgICAgICAgICAgICAgICAgICAgICAqICAgb25seSBzYXZlZCBzbyB3ZSBjYW4gZnJlZSBhbGwgdGhlIGJsb2NrcworICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHdoZW4gd2UgZnJlZSB0aGUgbWVtIHBvb2wuCisgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIC8qIHRoaXMgaXMgYSBsb25nIHNvIHRoYXQgImVsZW1lbnRzIiBpcyBhbGlnbmVkICovCisgIGxvbmcgdXNlZF9zb19mYXI7ICAgICAvKio8IGJ5dGVzIG9mIHRoaXMgYmxvY2sgYWxyZWFkeSBhbGxvY2F0ZWQgYXMgZWxlbWVudHMuICovCisgIAorICB1bnNpZ25lZCBjaGFyIGVsZW1lbnRzW0VMRU1FTlRfUEFERElOR107IC8qKjwgdGhlIGJsb2NrIGRhdGEsIGFjdHVhbGx5IGFsbG9jYXRlZCB0byByZXF1aXJlZCBzaXplICovCit9OworCisvKioKKyAqIEludGVybmFscyBmaWVsZHMgb2YgREJ1c01lbVBvb2wKKyAqLworc3RydWN0IERCdXNNZW1Qb29sCit7CisgIGludCBlbGVtZW50X3NpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiBhIHNpbmdsZSBvYmplY3QgaW4gdGhlIHBvb2wgKi8KKyAgaW50IGJsb2NrX3NpemU7ICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIG1vc3QgcmVjZW50bHkgYWxsb2NhdGVkIGJsb2NrICovCisgIHVuc2lnbmVkIGludCB6ZXJvX2VsZW1lbnRzIDogMTsgIC8qKjwgd2hldGhlciB0byB6ZXJvLWluaXQgYWxsb2NhdGVkIGVsZW1lbnRzICovCisKKyAgREJ1c0ZyZWVkRWxlbWVudCAqZnJlZV9lbGVtZW50czsgLyoqPCBhIGZyZWUgbGlzdCBvZiBlbGVtZW50cyB0byByZWN5Y2xlICovCisgIERCdXNNZW1CbG9jayAqYmxvY2tzOyAgICAgICAgICAgIC8qKjwgYmxvY2tzIG9mIG1lbW9yeSBmcm9tIG1hbGxvYygpICovCisgIGludCBhbGxvY2F0ZWRfZWxlbWVudHM7ICAgICAgICAgIC8qKjwgQ291bnQgb2Ygb3V0c3RhbmRpbmcgYWxsb2NhdGVkIGVsZW1lbnRzICovCit9OworCisvKiogQH0gKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzTWVtUG9vbAorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBEQnVzTWVtUG9vbAorICoKKyAqIE9wYXF1ZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgbWVtb3J5IHBvb2wuIE1lbW9yeSBwb29scyBhbGxvdworICogYXZvaWRpbmcgcGVyLW1hbGxvYy1ibG9jayBtZW1vcnkgb3ZlcmhlYWQgd2hlbiBhbGxvY2F0aW5nIGEgbG90IG9mCisgKiBzbWFsbCBvYmplY3RzIHRoYXQgYXJlIGFsbCB0aGUgc2FtZSBzaXplLiBUaGV5IGFyZSBzbGlnaHRseQorICogZmFzdGVyIHRoYW4gY2FsbGluZyBtYWxsb2MoKSBhbHNvLgorICovCisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBtZW1vcnkgcG9vbCwgb3IgcmV0dXJucyAjTlVMTCBvbiBmYWlsdXJlLiAgT2JqZWN0cyBpbgorICogdGhlIHBvb2wgbXVzdCBiZSBhdCBsZWFzdCBzaXplb2Yodm9pZCopIGJ5dGVzIGVhY2gsIGR1ZSB0byB0aGUgd2F5CisgKiBtZW1vcnkgcG9vbHMgd29yay4gVG8gYXZvaWQgY3JlYXRpbmcgNjQgYml0IHByb2JsZW1zLCB0aGlzIG1lYW5zIGF0CisgKiBsZWFzdCA4IGJ5dGVzIG9uIGFsbCBwbGF0Zm9ybXMsIHVubGVzcyB5b3UgYXJlIDQgYnl0ZXMgb24gMzItYml0CisgKiBhbmQgOCBieXRlcyBvbiA2NC1iaXQuCisgKgorICogQHBhcmFtIGVsZW1lbnRfc2l6ZSBzaXplIG9mIGFuIGVsZW1lbnQgYWxsb2NhdGVkIGZyb20gdGhlIHBvb2wuCisgKiBAcGFyYW0gemVyb19lbGVtZW50cyB3aGV0aGVyIHRvIHplcm8taW5pdGlhbGl6ZSBlbGVtZW50cworICogQHJldHVybnMgdGhlIG5ldyBwb29sIG9yICNOVUxMCisgKi8KK0RCdXNNZW1Qb29sKgorX2RidXNfbWVtX3Bvb2xfbmV3IChpbnQgZWxlbWVudF9zaXplLAorICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCB6ZXJvX2VsZW1lbnRzKQoreworICBEQnVzTWVtUG9vbCAqcG9vbDsKKworICBwb29sID0gZGJ1c19uZXcwIChEQnVzTWVtUG9vbCwgMSk7CisgIGlmIChwb29sID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogTWFrZSB0aGUgZWxlbWVudCBzaXplIGF0IGxlYXN0IDggYnl0ZXMuICovCisgIGlmIChlbGVtZW50X3NpemUgPCA4KQorICAgIGVsZW1lbnRfc2l6ZSA9IDg7CisgIAorICAvKiB0aGVzZSBhc3NlcnRpb25zIGFyZSBlcXVpdmFsZW50IGJ1dCB0aGUgZmlyc3QgaXMgbW9yZSBjbGVhcgorICAgKiB0byBwcm9ncmFtbWVycyB0aGF0IHNlZSBpdCBmYWlsLgorICAgKi8KKyAgX2RidXNfYXNzZXJ0IChlbGVtZW50X3NpemUgPj0gKGludCkgc2l6ZW9mICh2b2lkKikpOworICBfZGJ1c19hc3NlcnQgKGVsZW1lbnRfc2l6ZSA+PSAoaW50KSBzaXplb2YgKERCdXNGcmVlZEVsZW1lbnQpKTsKKworICAvKiBhbGlnbiB0aGUgZWxlbWVudCBzaXplIHRvIGEgcG9pbnRlciBib3VuZGFyeSBzbyB3ZSB3b24ndCBnZXQgYnVzCisgICAqIGVycm9ycyB1bmRlciBvdGhlciBhcmNoaXRlY3R1cmVzLiAgCisgICAqLworICBwb29sLT5lbGVtZW50X3NpemUgPSBfREJVU19BTElHTl9WQUxVRSAoZWxlbWVudF9zaXplLCBzaXplb2YgKHZvaWQgKikpOworCisgIHBvb2wtPnplcm9fZWxlbWVudHMgPSB6ZXJvX2VsZW1lbnRzICE9IEZBTFNFOworCisgIHBvb2wtPmFsbG9jYXRlZF9lbGVtZW50cyA9IDA7CisgIAorICAvKiBwaWNrIGEgc2l6ZSBmb3IgdGhlIGZpcnN0IGJsb2NrOyBpdCBpbmNyZWFzZXMKKyAgICogZm9yIGVhY2ggYmxvY2sgd2UgbmVlZCB0byBhbGxvY2F0ZS4gVGhpcyBpcworICAgKiBhY3R1YWxseSBoYWxmIHRoZSBpbml0aWFsIGJsb2NrIHNpemUKKyAgICogc2luY2UgX2RidXNfbWVtX3Bvb2xfYWxsb2MoKSB1bmNvbmRpdGlvbmFsbHkKKyAgICogZG91YmxlcyBpdCBwcmlvciB0byBjcmVhdGluZyBhIG5ldyBibG9jay4gICovCisgIHBvb2wtPmJsb2NrX3NpemUgPSBwb29sLT5lbGVtZW50X3NpemUgKiA4OworCisgIF9kYnVzX2Fzc2VydCAoKHBvb2wtPmJsb2NrX3NpemUgJQorICAgICAgICAgICAgICAgICBwb29sLT5lbGVtZW50X3NpemUpID09IDApOworCisgIFZBTEdSSU5EX0NSRUFURV9NRU1QT09MIChwb29sLCAwLCB6ZXJvX2VsZW1lbnRzKQorCisgIHJldHVybiBwb29sOworfQorCisvKioKKyAqIEZyZWVzIGEgbWVtb3J5IHBvb2wgKGFuZCBhbGwgZWxlbWVudHMgYWxsb2NhdGVkIGZyb20gaXQpLgorICoKKyAqIEBwYXJhbSBwb29sIHRoZSBtZW1vcnkgcG9vbC4KKyAqLwordm9pZAorX2RidXNfbWVtX3Bvb2xfZnJlZSAoREJ1c01lbVBvb2wgKnBvb2wpCit7CisgIERCdXNNZW1CbG9jayAqYmxvY2s7CisKKyAgVkFMR1JJTkRfREVTVFJPWV9NRU1QT09MIChwb29sKQorCisgIGJsb2NrID0gcG9vbC0+YmxvY2tzOworICB3aGlsZSAoYmxvY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTWVtQmxvY2sgKm5leHQgPSBibG9jay0+bmV4dDsKKworICAgICAgZGJ1c19mcmVlIChibG9jayk7CisKKyAgICAgIGJsb2NrID0gbmV4dDsKKyAgICB9CisKKyAgZGJ1c19mcmVlIChwb29sKTsKK30KKworLyoqCisgKiBBbGxvY2F0ZXMgYW4gb2JqZWN0IGZyb20gdGhlIG1lbW9yeSBwb29sLgorICogVGhlIG9iamVjdCBtdXN0IGJlIGZyZWVkIHdpdGggX2RidXNfbWVtX3Bvb2xfZGVhbGxvYygpLgorICoKKyAqIEBwYXJhbSBwb29sIHRoZSBtZW1vcnkgcG9vbAorICogQHJldHVybnMgdGhlIGFsbG9jYXRlZCBvYmplY3Qgb3IgI05VTEwgaWYgbm8gbWVtb3J5LgorICovCit2b2lkKgorX2RidXNfbWVtX3Bvb2xfYWxsb2MgKERCdXNNZW1Qb29sICpwb29sKQoreworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgaWYgKF9kYnVzX2Rpc2FibGVfbWVtX3Bvb2xzICgpKQorICAgIHsKKyAgICAgIERCdXNNZW1CbG9jayAqYmxvY2s7CisgICAgICBpbnQgYWxsb2Nfc2l6ZTsKKyAgICAgIAorICAgICAgLyogVGhpcyBpcyBvYnZpb3VzbHkgcmVhbGx5IHNpbGx5LCBidXQgaXQncworICAgICAgICogZGVidWctbW9kZS1vbmx5IGNvZGUgdGhhdCBpcyBjb21waWxlZCBvdXQKKyAgICAgICAqIHdoZW4gdGVzdHMgYXJlIGRpc2FibGVkIChfZGJ1c19kaXNhYmxlX21lbV9wb29scygpCisgICAgICAgKiBpcyBhIGNvbnN0YW50IGV4cHJlc3Npb24gRkFMU0Ugc28gdGhpcyBibG9jaworICAgICAgICogc2hvdWxkIHZhbmlzaCkKKyAgICAgICAqLworICAgICAgCisgICAgICBhbGxvY19zaXplID0gc2l6ZW9mIChEQnVzTWVtQmxvY2spIC0gRUxFTUVOVF9QQURESU5HICsKKyAgICAgICAgcG9vbC0+ZWxlbWVudF9zaXplOworICAgICAgCisgICAgICBpZiAocG9vbC0+emVyb19lbGVtZW50cykKKyAgICAgICAgYmxvY2sgPSBkYnVzX21hbGxvYzAgKGFsbG9jX3NpemUpOworICAgICAgZWxzZQorICAgICAgICBibG9jayA9IGRidXNfbWFsbG9jIChhbGxvY19zaXplKTsKKworICAgICAgaWYgKGJsb2NrICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBibG9jay0+bmV4dCA9IHBvb2wtPmJsb2NrczsKKyAgICAgICAgICBwb29sLT5ibG9ja3MgPSBibG9jazsKKyAgICAgICAgICBwb29sLT5hbGxvY2F0ZWRfZWxlbWVudHMgKz0gMTsKKworICAgICAgICAgIFZBTEdSSU5EX01FTVBPT0xfQUxMT0MgKHBvb2wsICh2b2lkICopICZibG9jay0+ZWxlbWVudHNbMF0sCisgICAgICAgICAgICAgIHBvb2wtPmVsZW1lbnRfc2l6ZSkKKyAgICAgICAgICByZXR1cm4gKHZvaWQqKSAmYmxvY2stPmVsZW1lbnRzWzBdOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgZWxzZQorI2VuZGlmCisgICAgeworICAgICAgaWYgKF9kYnVzX2RlY3JlbWVudF9mYWlsX2FsbG9jX2NvdW50ZXIgKCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiIEZBSUxJTkcgbWVtcG9vbCBhbGxvY1xuIik7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHBvb2wtPmZyZWVfZWxlbWVudHMpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzRnJlZWRFbGVtZW50ICplbGVtZW50ID0gcG9vbC0+ZnJlZV9lbGVtZW50czsKKworICAgICAgICAgIHBvb2wtPmZyZWVfZWxlbWVudHMgPSBwb29sLT5mcmVlX2VsZW1lbnRzLT5uZXh0OworCisgICAgICAgICAgVkFMR1JJTkRfTUVNUE9PTF9BTExPQyAocG9vbCwgZWxlbWVudCwgcG9vbC0+ZWxlbWVudF9zaXplKQorCisgICAgICAgICAgaWYgKHBvb2wtPnplcm9fZWxlbWVudHMpCisgICAgICAgICAgICBtZW1zZXQgKGVsZW1lbnQsICdcMCcsIHBvb2wtPmVsZW1lbnRfc2l6ZSk7CisKKyAgICAgICAgICBwb29sLT5hbGxvY2F0ZWRfZWxlbWVudHMgKz0gMTsKKworICAgICAgICAgIHJldHVybiBlbGVtZW50OworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB2b2lkICplbGVtZW50OworICAgICAgCisgICAgICAgICAgaWYgKHBvb2wtPmJsb2NrcyA9PSBOVUxMIHx8CisgICAgICAgICAgICAgIHBvb2wtPmJsb2Nrcy0+dXNlZF9zb19mYXIgPT0gcG9vbC0+YmxvY2tfc2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogTmVlZCBhIG5ldyBibG9jayAqLworICAgICAgICAgICAgICBEQnVzTWVtQmxvY2sgKmJsb2NrOworICAgICAgICAgICAgICBpbnQgYWxsb2Nfc2l6ZTsKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgICAgICAgICAgICAgIGludCBzYXZlZF9jb3VudGVyOworI2VuZGlmCisgICAgICAgICAgCisgICAgICAgICAgICAgIGlmIChwb29sLT5ibG9ja19zaXplIDw9IF9EQlVTX0lOVF9NQVggLyA0KSAvKiBhdm9pZCBvdmVyZmxvdyAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIHVzZSBhIGxhcmdlciBibG9jayBzaXplIGZvciBvdXIgbmV4dCBibG9jayAqLworICAgICAgICAgICAgICAgICAgcG9vbC0+YmxvY2tfc2l6ZSAqPSAyOworICAgICAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0ICgocG9vbC0+YmxvY2tfc2l6ZSAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sLT5lbGVtZW50X3NpemUpID09IDApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBhbGxvY19zaXplID0gc2l6ZW9mIChEQnVzTWVtQmxvY2spIC0gRUxFTUVOVF9QQURESU5HICsgcG9vbC0+YmxvY2tfc2l6ZTsKKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgICAgICAgICAgICAgLyogV2Ugc2F2ZS9yZXN0b3JlIHRoZSBjb3VudGVyLCBzbyB0aGF0IG1lbW9yeSBwb29scyB3b24ndAorICAgICAgICAgICAgICAgKiBjYXVzZSBhIGdpdmVuIGZ1bmN0aW9uIHRvIGhhdmUgZGlmZmVyZW50IG51bWJlciBvZgorICAgICAgICAgICAgICAgKiBhbGxvY2F0aW9ucyBvbiBkaWZmZXJlbnQgaW52b2NhdGlvbnMuIGkuZS4gIHdoZW4gdGVzdGluZworICAgICAgICAgICAgICAgKiB3ZSB3YW50IGNvbnNpc3RlbnQgYWxsb2MgcGF0dGVybnMuIFNvIHdlIHNraXAgb3VyCisgICAgICAgICAgICAgICAqIG1hbGxvYyBoZXJlIGZvciBwdXJwb3NlcyBvZiBmYWlsZWQgYWxsb2Mgc2ltdWxhdGlvbi4KKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIHNhdmVkX2NvdW50ZXIgPSBfZGJ1c19nZXRfZmFpbF9hbGxvY19jb3VudGVyICgpOworICAgICAgICAgICAgICBfZGJ1c19zZXRfZmFpbF9hbGxvY19jb3VudGVyIChfREJVU19JTlRfTUFYKTsKKyNlbmRpZgorICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAocG9vbC0+emVyb19lbGVtZW50cykKKyAgICAgICAgICAgICAgICBibG9jayA9IGRidXNfbWFsbG9jMCAoYWxsb2Nfc2l6ZSk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBibG9jayA9IGRidXNfbWFsbG9jIChhbGxvY19zaXplKTsKKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgICAgICAgICAgICAgX2RidXNfc2V0X2ZhaWxfYWxsb2NfY291bnRlciAoc2F2ZWRfY291bnRlcik7CisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoc2F2ZWRfY291bnRlciA9PSBfZGJ1c19nZXRfZmFpbF9hbGxvY19jb3VudGVyICgpKTsKKyNlbmRpZgorICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoYmxvY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICAgICAgICBibG9jay0+dXNlZF9zb19mYXIgPSAwOworICAgICAgICAgICAgICBibG9jay0+bmV4dCA9IHBvb2wtPmJsb2NrczsKKyAgICAgICAgICAgICAgcG9vbC0+YmxvY2tzID0gYmxvY2s7ICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgCisgICAgICAgICAgZWxlbWVudCA9ICZwb29sLT5ibG9ja3MtPmVsZW1lbnRzW3Bvb2wtPmJsb2Nrcy0+dXNlZF9zb19mYXJdOworICAgICAgICAgIAorICAgICAgICAgIHBvb2wtPmJsb2Nrcy0+dXNlZF9zb19mYXIgKz0gcG9vbC0+ZWxlbWVudF9zaXplOworCisgICAgICAgICAgcG9vbC0+YWxsb2NhdGVkX2VsZW1lbnRzICs9IDE7CisKKyAgICAgICAgICBWQUxHUklORF9NRU1QT09MX0FMTE9DIChwb29sLCBlbGVtZW50LCBwb29sLT5lbGVtZW50X3NpemUpCisgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogRGVhbGxvY2F0ZXMgYW4gb2JqZWN0IHByZXZpb3VzbHkgY3JlYXRlZCB3aXRoCisgKiBfZGJ1c19tZW1fcG9vbF9hbGxvYygpLiBUaGUgcHJldmlvdXMgb2JqZWN0CisgKiBtdXN0IGhhdmUgY29tZSBmcm9tIHRoaXMgc2FtZSBwb29sLgorICogQHBhcmFtIHBvb2wgdGhlIG1lbW9yeSBwb29sCisgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCBlYXJsaWVyIGFsbG9jYXRlZC4KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZXJlIGFyZSBubyByZW1haW5pbmcgYWxsb2NhdGVkIGVsZW1lbnRzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19tZW1fcG9vbF9kZWFsbG9jIChEQnVzTWVtUG9vbCAqcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICplbGVtZW50KQoreworICBWQUxHUklORF9NRU1QT09MX0ZSRUUgKHBvb2wsIGVsZW1lbnQpCisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgIGlmIChfZGJ1c19kaXNhYmxlX21lbV9wb29scyAoKSkKKyAgICB7CisgICAgICBEQnVzTWVtQmxvY2sgKmJsb2NrOworICAgICAgREJ1c01lbUJsb2NrICpwcmV2OworCisgICAgICAvKiBtbW0sIGZhc3QuIDstKSBkZWJ1Zy1vbmx5IGNvZGUsIHNvIGRvZXNuJ3QgbWF0dGVyLiAqLworICAgICAgCisgICAgICBwcmV2ID0gTlVMTDsKKyAgICAgIGJsb2NrID0gcG9vbC0+YmxvY2tzOworCisgICAgICB3aGlsZSAoYmxvY2sgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChibG9jay0+ZWxlbWVudHMgPT0gKHVuc2lnbmVkIGNoYXIqKSBlbGVtZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAocHJldikKKyAgICAgICAgICAgICAgICBwcmV2LT5uZXh0ID0gYmxvY2stPm5leHQ7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwb29sLT5ibG9ja3MgPSBibG9jay0+bmV4dDsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGRidXNfZnJlZSAoYmxvY2spOworCisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAocG9vbC0+YWxsb2NhdGVkX2VsZW1lbnRzID4gMCk7CisgICAgICAgICAgICAgIHBvb2wtPmFsbG9jYXRlZF9lbGVtZW50cyAtPSAxOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgaWYgKHBvb2wtPmFsbG9jYXRlZF9lbGVtZW50cyA9PSAwKQorICAgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAocG9vbC0+YmxvY2tzID09IE5VTEwpOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgcmV0dXJuIHBvb2wtPmJsb2NrcyA9PSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgIHByZXYgPSBibG9jazsKKyAgICAgICAgICBibG9jayA9IGJsb2NrLT5uZXh0OworICAgICAgICB9CisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZyZWVkIG5vbmV4aXN0ZW50IGJsb2NrIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICBEQnVzRnJlZWRFbGVtZW50ICpmcmVlZDsKKyAgICAgIAorICAgICAgZnJlZWQgPSBlbGVtZW50OworICAgICAgLyogdXNlZCBmb3IgaW50ZXJuYWwgbWVtcG9vbCBhZG1pbmlzdHJhdGlvbiAqLworICAgICAgVkFMR1JJTkRfTUFLRV9NRU1fVU5ERUZJTkVEIChmcmVlZCwgc2l6ZW9mIChmcmVlZCkpOworCisgICAgICBmcmVlZC0+bmV4dCA9IHBvb2wtPmZyZWVfZWxlbWVudHM7CisgICAgICBwb29sLT5mcmVlX2VsZW1lbnRzID0gZnJlZWQ7CisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAocG9vbC0+YWxsb2NhdGVkX2VsZW1lbnRzID4gMCk7CisgICAgICBwb29sLT5hbGxvY2F0ZWRfZWxlbWVudHMgLT0gMTsKKyAgICAgIAorICAgICAgcmV0dXJuIHBvb2wtPmFsbG9jYXRlZF9lbGVtZW50cyA9PSAwOworICAgIH0KK30KKworI2lmZGVmIERCVVNfRU5BQkxFX1NUQVRTCit2b2lkCitfZGJ1c19tZW1fcG9vbF9nZXRfc3RhdHMgKERCdXNNZW1Qb29sICAgKnBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgKmluX3VzZV9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICppbl9mcmVlX2xpc3RfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAqYWxsb2NhdGVkX3ApCit7CisgIERCdXNNZW1CbG9jayAqYmxvY2s7CisgIERCdXNGcmVlZEVsZW1lbnQgKmZyZWVkOworICBkYnVzX3VpbnQzMl90IGluX3VzZSA9IDA7CisgIGRidXNfdWludDMyX3QgaW5fZnJlZV9saXN0ID0gMDsKKyAgZGJ1c191aW50MzJfdCBhbGxvY2F0ZWQgPSAwOworCisgIGlmIChwb29sICE9IE5VTEwpCisgICAgeworICAgICAgaW5fdXNlID0gcG9vbC0+ZWxlbWVudF9zaXplICogcG9vbC0+YWxsb2NhdGVkX2VsZW1lbnRzOworCisgICAgICBmb3IgKGZyZWVkID0gcG9vbC0+ZnJlZV9lbGVtZW50czsgZnJlZWQgIT0gTlVMTDsgZnJlZWQgPSBmcmVlZC0+bmV4dCkKKyAgICAgICAgeworICAgICAgICAgIGluX2ZyZWVfbGlzdCArPSBwb29sLT5lbGVtZW50X3NpemU7CisgICAgICAgIH0KKworICAgICAgZm9yIChibG9jayA9IHBvb2wtPmJsb2NrczsgYmxvY2sgIT0gTlVMTDsgYmxvY2sgPSBibG9jay0+bmV4dCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChibG9jayA9PSBwb29sLT5ibG9ja3MpCisgICAgICAgICAgICBhbGxvY2F0ZWQgKz0gcG9vbC0+YmxvY2tfc2l6ZTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBhbGxvY2F0ZWQgKz0gYmxvY2stPnVzZWRfc29fZmFyOworICAgICAgICB9CisgICAgfQorCisgIGlmIChpbl91c2VfcCAhPSBOVUxMKQorICAgICppbl91c2VfcCA9IGluX3VzZTsKKworICBpZiAoaW5fZnJlZV9saXN0X3AgIT0gTlVMTCkKKyAgICAqaW5fZnJlZV9saXN0X3AgPSBpbl9mcmVlX2xpc3Q7CisKKyAgaWYgKGFsbG9jYXRlZF9wICE9IE5VTEwpCisgICAgKmFsbG9jYXRlZF9wID0gYWxsb2NhdGVkOworfQorI2VuZGlmIC8qIERCVVNfRU5BQkxFX1NUQVRTICovCisKKy8qKiBAfSAqLworCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCitzdGF0aWMgdm9pZAordGltZV9mb3Jfc2l6ZSAoaW50IHNpemUpCit7CisgIGludCBpOworICBpbnQgajsKKyAgY2xvY2tfdCBzdGFydDsKKyAgY2xvY2tfdCBlbmQ7CisjZGVmaW5lIEZSRUVfQVJSQVlfU0laRSA1MTIKKyNkZWZpbmUgTl9JVEVSQVRJT05TIEZSRUVfQVJSQVlfU0laRSAqIDUxMgorICB2b2lkICp0b19mcmVlW0ZSRUVfQVJSQVlfU0laRV07CisgIERCdXNNZW1Qb29sICpwb29sOworCisgIF9kYnVzX3ZlcmJvc2UgKCJUaW1pbmdzIGZvciBzaXplICVkXG4iLCBzaXplKTsKKyAgCisgIF9kYnVzX3ZlcmJvc2UgKCIgbWFsbG9jXG4iKTsKKyAgCisgIHN0YXJ0ID0gY2xvY2sgKCk7CisgIAorICBpID0gMDsKKyAgaiA9IDA7CisgIHdoaWxlIChpIDwgTl9JVEVSQVRJT05TKQorICAgIHsKKyAgICAgIHRvX2ZyZWVbal0gPSBkYnVzX21hbGxvYyAoc2l6ZSk7CisgICAgICBfZGJ1c19hc3NlcnQgKHRvX2ZyZWVbal0gIT0gTlVMTCk7IC8qIGluIGEgcmVhbCBhcHAgb2YgY291cnNlIHRoaXMgaXMgd3JvbmcgKi8KKworICAgICAgKytqOworCisgICAgICBpZiAoaiA9PSBGUkVFX0FSUkFZX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICBqID0gMDsKKyAgICAgICAgICB3aGlsZSAoaiA8IEZSRUVfQVJSQVlfU0laRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19mcmVlICh0b19mcmVlW2pdKTsKKyAgICAgICAgICAgICAgKytqOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaiA9IDA7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgKytpOworICAgIH0KKworICBlbmQgPSBjbG9jayAoKTsKKworICBfZGJ1c192ZXJib3NlICgiICBjcmVhdGVkL2Rlc3Ryb3llZCAlZCBlbGVtZW50cyBpbiAlZyBzZWNvbmRzXG4iLAorICAgICAgICAgICAgICAgICBOX0lURVJBVElPTlMsIChlbmQgLSBzdGFydCkgLyAoZG91YmxlKSBDTE9DS1NfUEVSX1NFQyk7CisKKworCisgIF9kYnVzX3ZlcmJvc2UgKCIgbWVtcG9vbHNcbiIpOworICAKKyAgc3RhcnQgPSBjbG9jayAoKTsKKworICBwb29sID0gX2RidXNfbWVtX3Bvb2xfbmV3IChzaXplLCBGQUxTRSk7CisgIAorICBpID0gMDsKKyAgaiA9IDA7CisgIHdoaWxlIChpIDwgTl9JVEVSQVRJT05TKQorICAgIHsKKyAgICAgIHRvX2ZyZWVbal0gPSBfZGJ1c19tZW1fcG9vbF9hbGxvYyAocG9vbCk7IAorICAgICAgX2RidXNfYXNzZXJ0ICh0b19mcmVlW2pdICE9IE5VTEwpOyAgLyogaW4gYSByZWFsIGFwcCBvZiBjb3Vyc2UgdGhpcyBpcyB3cm9uZyAqLworCisgICAgICArK2o7CisKKyAgICAgIGlmIChqID09IEZSRUVfQVJSQVlfU0laRSkKKyAgICAgICAgeworICAgICAgICAgIGogPSAwOworICAgICAgICAgIHdoaWxlIChqIDwgRlJFRV9BUlJBWV9TSVpFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19tZW1fcG9vbF9kZWFsbG9jIChwb29sLCB0b19mcmVlW2pdKTsKKyAgICAgICAgICAgICAgKytqOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaiA9IDA7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgKytpOworICAgIH0KKworICBfZGJ1c19tZW1fcG9vbF9mcmVlIChwb29sKTsKKyAgCisgIGVuZCA9IGNsb2NrICgpOworCisgIF9kYnVzX3ZlcmJvc2UgKCIgIGNyZWF0ZWQvZGVzdHJveWVkICVkIGVsZW1lbnRzIGluICVnIHNlY29uZHNcbiIsCisgICAgICAgICAgICAgICAgIE5fSVRFUkFUSU9OUywgKGVuZCAtIHN0YXJ0KSAvIChkb3VibGUpIENMT0NLU19QRVJfU0VDKTsKKworICBfZGJ1c192ZXJib3NlICgiIHplcm9lZCBtYWxsb2NcbiIpOworICAgIAorICBzdGFydCA9IGNsb2NrICgpOworICAKKyAgaSA9IDA7CisgIGogPSAwOworICB3aGlsZSAoaSA8IE5fSVRFUkFUSU9OUykKKyAgICB7CisgICAgICB0b19mcmVlW2pdID0gZGJ1c19tYWxsb2MwIChzaXplKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAodG9fZnJlZVtqXSAhPSBOVUxMKTsgLyogaW4gYSByZWFsIGFwcCBvZiBjb3Vyc2UgdGhpcyBpcyB3cm9uZyAqLworCisgICAgICArK2o7CisKKyAgICAgIGlmIChqID09IEZSRUVfQVJSQVlfU0laRSkKKyAgICAgICAgeworICAgICAgICAgIGogPSAwOworICAgICAgICAgIHdoaWxlIChqIDwgRlJFRV9BUlJBWV9TSVpFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2ZyZWUgKHRvX2ZyZWVbal0pOworICAgICAgICAgICAgICArK2o7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBqID0gMDsKKyAgICAgICAgfQorICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIGVuZCA9IGNsb2NrICgpOworCisgIF9kYnVzX3ZlcmJvc2UgKCIgIGNyZWF0ZWQvZGVzdHJveWVkICVkIGVsZW1lbnRzIGluICVnIHNlY29uZHNcbiIsCisgICAgICAgICAgICAgICAgIE5fSVRFUkFUSU9OUywgKGVuZCAtIHN0YXJ0KSAvIChkb3VibGUpIENMT0NLU19QRVJfU0VDKTsKKyAgCisgIF9kYnVzX3ZlcmJvc2UgKCIgemVyb2VkIG1lbXBvb2xzXG4iKTsKKyAgCisgIHN0YXJ0ID0gY2xvY2sgKCk7CisKKyAgcG9vbCA9IF9kYnVzX21lbV9wb29sX25ldyAoc2l6ZSwgVFJVRSk7CisgIAorICBpID0gMDsKKyAgaiA9IDA7CisgIHdoaWxlIChpIDwgTl9JVEVSQVRJT05TKQorICAgIHsKKyAgICAgIHRvX2ZyZWVbal0gPSBfZGJ1c19tZW1fcG9vbF9hbGxvYyAocG9vbCk7IAorICAgICAgX2RidXNfYXNzZXJ0ICh0b19mcmVlW2pdICE9IE5VTEwpOyAgLyogaW4gYSByZWFsIGFwcCBvZiBjb3Vyc2UgdGhpcyBpcyB3cm9uZyAqLworCisgICAgICArK2o7CisKKyAgICAgIGlmIChqID09IEZSRUVfQVJSQVlfU0laRSkKKyAgICAgICAgeworICAgICAgICAgIGogPSAwOworICAgICAgICAgIHdoaWxlIChqIDwgRlJFRV9BUlJBWV9TSVpFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19tZW1fcG9vbF9kZWFsbG9jIChwb29sLCB0b19mcmVlW2pdKTsKKyAgICAgICAgICAgICAgKytqOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaiA9IDA7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgKytpOworICAgIH0KKworICBfZGJ1c19tZW1fcG9vbF9mcmVlIChwb29sKTsKKyAgCisgIGVuZCA9IGNsb2NrICgpOworCisgIF9kYnVzX3ZlcmJvc2UgKCIgIGNyZWF0ZWQvZGVzdHJveWVkICVkIGVsZW1lbnRzIGluICVnIHNlY29uZHNcbiIsCisgICAgICAgICAgICAgICAgIE5fSVRFUkFUSU9OUywgKGVuZCAtIHN0YXJ0KSAvIChkb3VibGUpIENMT0NLU19QRVJfU0VDKTsKK30KKworLyoqCisgKiBAaW5ncm91cCBEQnVzTWVtUG9vbEludGVybmFscworICogVW5pdCB0ZXN0IGZvciBEQnVzTWVtUG9vbAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX21lbV9wb29sX3Rlc3QgKHZvaWQpCit7CisgIGludCBpOworICBpbnQgZWxlbWVudF9zaXplc1tdID0geyA0LCA4LCAxNiwgNTAsIDEyNCB9OworICAKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgX0RCVVNfTl9FTEVNRU5UUyAoZWxlbWVudF9zaXplcykpCisgICAgeworICAgICAgdGltZV9mb3Jfc2l6ZSAoZWxlbWVudF9zaXplc1tpXSk7CisgICAgICArK2k7CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1tZW1wb29sLmggYi9kYnVzL2RidXMvZGJ1cy1tZW1wb29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY5M2VlYgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLW1lbXBvb2wuaApAQCAtMCwwICsxLDUwIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWVtcG9vbC5oIE1lbW9yeSBwb29scworICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX01FTVBPT0xfSAorI2RlZmluZSBEQlVTX01FTVBPT0xfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tZW1vcnkuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKworREJVU19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBEQnVzTWVtUG9vbCBEQnVzTWVtUG9vbDsKKworREJ1c01lbVBvb2wqIF9kYnVzX21lbV9wb29sX25ldyAgICAgKGludCAgICAgICAgICBlbGVtZW50X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgIHplcm9fZWxlbWVudHMpOwordm9pZCAgICAgICAgIF9kYnVzX21lbV9wb29sX2ZyZWUgICAgKERCdXNNZW1Qb29sICpwb29sKTsKK3ZvaWQqICAgICAgICBfZGJ1c19tZW1fcG9vbF9hbGxvYyAgIChEQnVzTWVtUG9vbCAqcG9vbCk7CitkYnVzX2Jvb2xfdCAgX2RidXNfbWVtX3Bvb2xfZGVhbGxvYyAoREJ1c01lbVBvb2wgKnBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgKmVsZW1lbnQpOworCisvKiBpZiBEQlVTX0VOQUJMRV9TVEFUUyAqLwordm9pZCAgICAgICAgIF9kYnVzX21lbV9wb29sX2dldF9zdGF0cyAoREJ1c01lbVBvb2wgICAqcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgKmluX3VzZV9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAqaW5fZnJlZV9saXN0X3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICphbGxvY2F0ZWRfcCk7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX01FTVBPT0xfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtbWVzc2FnZS1mYWN0b3J5LmMgYi9kYnVzL2RidXMvZGJ1cy1tZXNzYWdlLWZhY3RvcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmE0ZTAyCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtbWVzc2FnZS1mYWN0b3J5LmMKQEAgLTAsMCArMSwxMzA1IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWVzc2FnZS1mYWN0b3J5LmMgR2VuZXJhdG9yIG9mIHZhbGlkIGFuZCBpbnZhbGlkIG1lc3NhZ2UgZGF0YSBmb3IgdGVzdCBzdWl0ZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2lmbmRlZiBET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMKKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyNpbmNsdWRlICJkYnVzLW1lc3NhZ2UtZmFjdG9yeS5oIgorI2luY2x1ZGUgImRidXMtbWVzc2FnZS1wcml2YXRlLmgiCisjaW5jbHVkZSAiZGJ1cy1zaWduYXR1cmUuaCIKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCit0eXBlZGVmIGVudW0KKyAgeworICAgIENIQU5HRV9UWVBFX0FESlVTVCwKKyAgICBDSEFOR0VfVFlQRV9BQlNPTFVURQorICB9IENoYW5nZVR5cGU7CisKKyNkZWZpbmUgQllURV9PUkRFUl9PRkZTRVQgIDAKKyNkZWZpbmUgVFlQRV9PRkZTRVQgICAgICAgIDEKKyNkZWZpbmUgQk9EWV9MRU5HVEhfT0ZGU0VUIDQKKyNkZWZpbmUgRklFTERTX0FSUkFZX0xFTkdUSF9PRkZTRVQgMTIKKworc3RhdGljIHZvaWQKK2l0ZXJfcmVjdXJzZSAoREJ1c01lc3NhZ2VEYXRhSXRlciAqaXRlcikKK3sKKyAgaXRlci0+ZGVwdGggKz0gMTsKKyAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA8IF9EQlVTX01FU1NBR0VfREFUQV9NQVhfTkVTVElORyk7CisgIF9kYnVzX2Fzc2VydCAoaXRlci0+c2VxdWVuY2Vfbm9zW2l0ZXItPmRlcHRoXSA+PSAwKTsKK30KKworc3RhdGljIGludAoraXRlcl9nZXRfc2VxdWVuY2UgKERCdXNNZXNzYWdlRGF0YUl0ZXIgKml0ZXIpCit7CisgIF9kYnVzX2Fzc2VydCAoaXRlci0+c2VxdWVuY2Vfbm9zW2l0ZXItPmRlcHRoXSA+PSAwKTsKKyAgcmV0dXJuIGl0ZXItPnNlcXVlbmNlX25vc1tpdGVyLT5kZXB0aF07Cit9CisKK3N0YXRpYyB2b2lkCitpdGVyX3NldF9zZXF1ZW5jZSAoREJ1c01lc3NhZ2VEYXRhSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSkKK3sKKyAgX2RidXNfYXNzZXJ0IChzZXF1ZW5jZSA+PSAwKTsKKyAgaXRlci0+c2VxdWVuY2Vfbm9zW2l0ZXItPmRlcHRoXSA9IHNlcXVlbmNlOworfQorCitzdGF0aWMgdm9pZAoraXRlcl91bnJlY3Vyc2UgKERCdXNNZXNzYWdlRGF0YUl0ZXIgKml0ZXIpCit7CisgIGl0ZXItPmRlcHRoIC09IDE7CisgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPj0gMCk7Cit9CisKK3N0YXRpYyB2b2lkCitpdGVyX25leHQgKERCdXNNZXNzYWdlRGF0YUl0ZXIgKml0ZXIpCit7CisgIGl0ZXItPnNlcXVlbmNlX25vc1tpdGVyLT5kZXB0aF0gKz0gMTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitpdGVyX2ZpcnN0X2luX3NlcmllcyAoREJ1c01lc3NhZ2VEYXRhSXRlciAqaXRlcikKK3sKKyAgaW50IGk7CisKKyAgaSA9IGl0ZXItPmRlcHRoOworICB3aGlsZSAoaSA8IF9EQlVTX01FU1NBR0VfREFUQV9NQVhfTkVTVElORykKKyAgICB7CisgICAgICBpZiAoaXRlci0+c2VxdWVuY2Vfbm9zW2ldICE9IDApCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICsraTsKKyAgICB9CisgIHJldHVybiBUUlVFOworfQorCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNJbm5lckdlbmVyYXRvckZ1bmMpICAgKERCdXNNZXNzYWdlRGF0YUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqKm1lc3NhZ2VfcCk7Cit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNNZXNzYWdlR2VuZXJhdG9yRnVuYykgKERCdXNNZXNzYWdlRGF0YUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5KTsKKworc3RhdGljIHZvaWQKK3NldF9yZXBseV9zZXJpYWwgKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlLCAxMDApKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2dlbmVyYXRlX3RyaXZpYWxfaW5uZXIgKERCdXNNZXNzYWdlRGF0YUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKiptZXNzYWdlX3ApCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworCisgIHN3aXRjaCAoaXRlcl9nZXRfc2VxdWVuY2UgKGl0ZXIpKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoIm9yZy5mcmVlZGVza3RvcC5UZXh0RWRpdG9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL2Zvby9iYXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuRG9jdW1lbnRGYWN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ3JlYXRlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ldyAoREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTik7CisgICAgICBzZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9mb28vYmFyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5Eb2N1bWVudEZhY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ3JlYXRlZCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXcgKERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKTsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0RXJyb3JOYW1lIikpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAgICAgCisgICAgICB7CisgICAgICAgIERCdXNNZXNzYWdlSXRlciBpdGVyOworICAgICAgICBjb25zdCBjaGFyICp2X1NUUklORyA9ICJUaGlzIGlzIGFuIGVycm9yIjsKKyAgICAgICAgCisgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtZXNzYWdlLCAmaXRlcik7CisgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9TVFJJTkcpKQorICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAgICAgfQorICAgICAgCisgICAgICBzZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICAqbWVzc2FnZV9wID0gbWVzc2FnZTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2dlbmVyYXRlX21hbnlfYm9kaWVzX2lubmVyIChEQnVzTWVzc2FnZURhdGFJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqKm1lc3NhZ2VfcCkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIERCdXNTdHJpbmcgc2lnbmF0dXJlOworICBEQnVzU3RyaW5nIGJvZHk7CisgIGNoYXIgYnl0ZV9vcmRlcjsKKworICAvKiBLZWVwaW5nIHRoaXMgc21hbGwgbWFrZXMgdGhpbmdzIGdvIGZhc3RlciAqLworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoIm8uei5GIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvLnouQiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmFoIik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgYnl0ZV9vcmRlciA9IF9kYnVzX2hlYWRlcl9nZXRfYnl0ZV9vcmRlciAoJm1lc3NhZ2UtPmhlYWRlcik7CisKKyAgc2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnNpZ25hdHVyZSkgfHwgIV9kYnVzX3N0cmluZ19pbml0ICgmYm9keSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgIAorICBpZiAoZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX2dlbmVyYXRlX2JvZGllcyAoaXRlcl9nZXRfc2VxdWVuY2UgKGl0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWduYXR1cmUsICZib2R5KSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICp2X1NJR05BVFVSRTsKKworICAgICAgdl9TSUdOQVRVUkUgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZzaWduYXR1cmUpOworICAgICAgaWYgKCFfZGJ1c19oZWFkZXJfc2V0X2ZpZWxkX2Jhc2ljICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9TSUdOQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TSUdOQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X1NJR05BVFVSRSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19tb3ZlICgmYm9keSwgMCwgJm1lc3NhZ2UtPmJvZHksIDApKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICAgICAgX2RidXNfbWFyc2hhbF9zZXRfdWludDMyICgmbWVzc2FnZS0+aGVhZGVyLmRhdGEsIEJPRFlfTEVOR1RIX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZtZXNzYWdlLT5ib2R5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlcik7CisgICAgICAKKyAgICAgICptZXNzYWdlX3AgPSBtZXNzYWdlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICAqbWVzc2FnZV9wID0gTlVMTDsKKyAgICB9CisgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNpZ25hdHVyZSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYm9keSk7CisKKyAgcmV0dXJuICptZXNzYWdlX3AgIT0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2dlbmVyYXRlX2Zyb21fbWVzc2FnZSAoREJ1c1N0cmluZyAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5LAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgICAgKm1lc3NhZ2UpCit7CisgIGRidXNfbWVzc2FnZV9zZXRfc2VyaWFsIChtZXNzYWdlLCAxKTsKKyAgZGJ1c19tZXNzYWdlX2xvY2sgKG1lc3NhZ2UpOworCisgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfVkFMSUQ7CisgIAorICAvKiBtb3ZlIGZvciBlZmZpY2llbmN5LCBzaW5jZSB3ZSdsbCBudWtlIHRoZSBtZXNzYWdlIGFueXdheSAqLworICBpZiAoIV9kYnVzX3N0cmluZ19tb3ZlICgmbWVzc2FnZS0+aGVhZGVyLmRhdGEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIDApKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZtZXNzYWdlLT5ib2R5LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGF0YSkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2dlbmVyYXRlX291dGVyIChEQnVzTWVzc2FnZURhdGFJdGVyICAgKml0ZXIsCisgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHksCisgICAgICAgICAgICAgICAgREJ1c0lubmVyR2VuZXJhdG9yRnVuYyBmdW5jKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKworICBtZXNzYWdlID0gTlVMTDsKKyAgaWYgKCEoKmZ1bmMpKGl0ZXIsICZtZXNzYWdlKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaXRlcl9uZXh0IChpdGVyKTsKKyAgCisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZSAhPSBOVUxMKTsKKworICBnZW5lcmF0ZV9mcm9tX21lc3NhZ2UgKGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5LCBtZXNzYWdlKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2dlbmVyYXRlX3RyaXZpYWwgKERCdXNNZXNzYWdlRGF0YUl0ZXIgICAqaXRlciwKKyAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkpCit7CisgIHJldHVybiBnZW5lcmF0ZV9vdXRlciAoaXRlciwgZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVfdHJpdmlhbF9pbm5lcik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2VuZXJhdGVfbWFueV9ib2RpZXMgKERCdXNNZXNzYWdlRGF0YUl0ZXIgICAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICAgICAgICAgICpleHBlY3RlZF92YWxpZGl0eSkKK3sKKyAgcmV0dXJuIGdlbmVyYXRlX291dGVyIChpdGVyLCBkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZV9tYW55X2JvZGllc19pbm5lcik7Cit9CisKK3N0YXRpYyBEQnVzTWVzc2FnZSoKK3NpbXBsZV9tZXRob2RfY2FsbCAodm9pZCkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIC8qIEtlZXBpbmcgdGhpcyBzbWFsbCBtYWtlcyBzdHVmZiBnbyBmYXN0ZXIgKi8KKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKCJvLmIuUSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL2YvYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiby5iLloiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZybyIpOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICByZXR1cm4gbWVzc2FnZTsKK30KKworc3RhdGljIERCdXNNZXNzYWdlKgorc2ltcGxlX3NpZ25hbCAodm9pZCkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9mL2IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvLmIuWiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZybyIpOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICByZXR1cm4gbWVzc2FnZTsKK30KKworc3RhdGljIERCdXNNZXNzYWdlKgorc2ltcGxlX21ldGhvZF9yZXR1cm4gKHZvaWQpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBtZXNzYWdlID0gIGRidXNfbWVzc2FnZV9uZXcgKERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIHNldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpOworICAKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKK3N0YXRpYyBEQnVzTWVzc2FnZSoKK3NpbXBsZV9lcnJvciAodm9pZCkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIG1lc3NhZ2UgPSAgZGJ1c19tZXNzYWdlX25ldyAoREJVU19NRVNTQUdFX1RZUEVfRVJST1IpOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9lcnJvcl9uYW1lIChtZXNzYWdlLCAiZm9vLmJhciIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAKKyAgc2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSk7CisgIAorICByZXR1cm4gbWVzc2FnZTsKK30KKworc3RhdGljIERCdXNNZXNzYWdlKgorbWVzc2FnZV93aXRoX25lc3RpbmdfbGV2ZWxzIChpbnQgbGV2ZWxzKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c19pbnQzMl90IHZfSU5UMzI7CisgIERCdXNNZXNzYWdlSXRlciAqcGFyZW50czsKKyAgREJ1c01lc3NhZ2VJdGVyICpjaGlsZHJlbjsKKyAgaW50IGk7CisKKyAgLyogSWYgbGV2ZWxzIGlzIGhpZ2hlciBpdCBicmVha3Mgc2lnX3JlZmNvdW50IGluIERCdXNNZXNzYWdlUmVhbEl0ZXIKKyAgICogaW4gZGJ1cy1tZXNzYWdlLmMsIHRoaXMgYXNzZXJ0IGlzIGp1c3QgdG8gaGVscCB5b3Uga25vdyB5b3UgbmVlZAorICAgKiB0byBmaXggdGhhdCBpZiB5b3UgaGl0IGl0CisgICAqLworICBfZGJ1c19hc3NlcnQgKGxldmVscyA8IDI1Nik7CisKKyAgcGFyZW50cyA9IGRidXNfbmV3KERCdXNNZXNzYWdlSXRlciwgbGV2ZWxzICsgMSk7CisgIGNoaWxkcmVuID0gZGJ1c19uZXcoREJ1c01lc3NhZ2VJdGVyLCBsZXZlbHMgKyAxKTsKKworICB2X0lOVDMyID0gNDI7CisgIG1lc3NhZ2UgPSBzaW1wbGVfbWV0aG9kX2NhbGwgKCk7CisKKyAgaSA9IDA7CisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtZXNzYWdlLCAmcGFyZW50c1tpXSk7CisgIHdoaWxlIChpIDwgbGV2ZWxzKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmcGFyZW50c1tpXSwgREJVU19UWVBFX1ZBUklBTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9PSAobGV2ZWxzIC0gMSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMl9BU19TVFJJTkcgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9WQVJJQU5UX0FTX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hpbGRyZW5baV0pOworICAgICAgKytpOworICAgICAgcGFyZW50c1tpXSA9IGNoaWxkcmVuW2ktMV07CisgICAgfQorICAtLWk7CisgIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJmNoaWxkcmVuW2ldLCBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyKTsKKyAgd2hpbGUgKGkgPj0gMCkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZwYXJlbnRzW2ldLCAmY2hpbGRyZW5baV0pOworICAgICAgLS1pOworICAgIH0KKworICBkYnVzX2ZyZWUocGFyZW50cyk7CisgIGRidXNfZnJlZShjaGlsZHJlbik7CisKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2VuZXJhdGVfc3BlY2lhbCAoREJ1c01lc3NhZ2VEYXRhSXRlciAgICppdGVyLAorICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICAgICAgICAgICpleHBlY3RlZF92YWxpZGl0eSkKK3sKKyAgaW50IGl0ZW1fc2VxOworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgaW50IHBvczsKKyAgZGJ1c19pbnQzMl90IHZfSU5UMzI7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGF0YSkgPT0gMCk7CisgIAorICBtZXNzYWdlID0gTlVMTDsKKyAgcG9zID0gLTE7CisgIHZfSU5UMzIgPSA0MjsKKyAgaXRlbV9zZXEgPSBpdGVyX2dldF9zZXF1ZW5jZSAoaXRlcik7CisKKyAgaWYgKGl0ZW1fc2VxID09IDApCisgICAgeworICAgICAgbWVzc2FnZSA9IHNpbXBsZV9tZXRob2RfY2FsbCAoKTsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX3JhdyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9TSUdOQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJnBvcyk7CisgICAgICBnZW5lcmF0ZV9mcm9tX21lc3NhZ2UgKGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5LCBtZXNzYWdlKTsKKyAgICAgIAorICAgICAgLyogc2V0IGFuIGludmFsaWQgdHlwZWNvZGUgKi8KKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAoZGF0YSwgcG9zICsgMSwgJyQnKTsKKworICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX1VOS05PV05fVFlQRUNPREU7CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSAxKQorICAgIHsKKyAgICAgIGNoYXIgbG9uZ19zaWdbREJVU19NQVhJTVVNX1RZUEVfUkVDVVJTSU9OX0RFUFRIKzJdOworICAgICAgY29uc3QgY2hhciAqdl9TVFJJTkc7CisgICAgICBpbnQgaTsKKyAgICAgIAorICAgICAgbWVzc2FnZSA9IHNpbXBsZV9tZXRob2RfY2FsbCAoKTsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKGkgPCAoREJVU19NQVhJTVVNX1RZUEVfUkVDVVJTSU9OX0RFUFRIICsgMSkpCisgICAgICAgIHsKKyAgICAgICAgICBsb25nX3NpZ1tpXSA9IERCVVNfVFlQRV9BUlJBWTsKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICAgIGxvbmdfc2lnW2ldID0gREJVU19UWVBFX0lOVkFMSUQ7CisKKyAgICAgIHZfU1RSSU5HID0gbG9uZ19zaWc7CisgICAgICBpZiAoIV9kYnVzX2hlYWRlcl9zZXRfZmllbGRfYmFzaWMgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfU1RSSU5HKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgICAgICAKKyAgICAgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfcmF3ICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmcG9zKTsKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworICAgICAgCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfRVhDRUVERURfTUFYSU1VTV9BUlJBWV9SRUNVUlNJT047CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSAyKQorICAgIHsKKyAgICAgIGNoYXIgbG9uZ19zaWdbREJVU19NQVhJTVVNX1RZUEVfUkVDVVJTSU9OX0RFUFRIKjIrNF07CisgICAgICBjb25zdCBjaGFyICp2X1NUUklORzsKKyAgICAgIGludCBpOworICAgICAgCisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9jYWxsICgpOworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAoaSA8PSAoREJVU19NQVhJTVVNX1RZUEVfUkVDVVJTSU9OX0RFUFRIICsgMSkpCisgICAgICAgIHsKKyAgICAgICAgICBsb25nX3NpZ1tpXSA9IERCVVNfU1RSVUNUX0JFR0lOX0NIQVI7CisgICAgICAgICAgKytpOworICAgICAgICB9CisKKyAgICAgIGxvbmdfc2lnW2ldID0gREJVU19UWVBFX0lOVDMyOworICAgICAgKytpOworCisgICAgICB3aGlsZSAoaSA8IChEQlVTX01BWElNVU1fVFlQRV9SRUNVUlNJT05fREVQVEgqMiArIDMpKQorICAgICAgICB7CisgICAgICAgICAgbG9uZ19zaWdbaV0gPSBEQlVTX1NUUlVDVF9FTkRfQ0hBUjsKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICAgIGxvbmdfc2lnW2ldID0gREJVU19UWVBFX0lOVkFMSUQ7CisgICAgICAKKyAgICAgIHZfU1RSSU5HID0gbG9uZ19zaWc7CisgICAgICBpZiAoIV9kYnVzX2hlYWRlcl9zZXRfZmllbGRfYmFzaWMgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfU1RSSU5HKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgICAgICAKKyAgICAgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfcmF3ICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmcG9zKTsKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworICAgICAgCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfRVhDRUVERURfTUFYSU1VTV9TVFJVQ1RfUkVDVVJTSU9OOworICAgIH0KKyAgZWxzZSBpZiAoaXRlbV9zZXEgPT0gMykKKyAgICB7CisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9jYWxsICgpOworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfcmF3ICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmcG9zKTsKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKGRhdGEsIHBvcyArIDEsIERCVVNfU1RSVUNUX0JFR0lOX0NIQVIpOworICAgICAgCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfU1RSVUNUX1NUQVJURURfQlVUX05PVF9FTkRFRDsKKyAgICB9CisgIGVsc2UgaWYgKGl0ZW1fc2VxID09IDQpCisgICAgeworICAgICAgbWVzc2FnZSA9IHNpbXBsZV9tZXRob2RfY2FsbCAoKTsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX3JhdyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9TSUdOQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJnBvcyk7CisgICAgICBnZW5lcmF0ZV9mcm9tX21lc3NhZ2UgKGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5LCBtZXNzYWdlKTsKKyAgICAgIAorICAgICAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChkYXRhLCBwb3MgKyAxLCBEQlVTX1NUUlVDVF9FTkRfQ0hBUik7CisgICAgICAKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9TVFJVQ1RfRU5ERURfQlVUX05PVF9TVEFSVEVEOworICAgIH0KKyAgZWxzZSBpZiAoaXRlbV9zZXEgPT0gNSkKKyAgICB7CisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9jYWxsICgpOworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfcmF3ICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmcG9zKTsKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKGRhdGEsIHBvcyArIDEsIERCVVNfU1RSVUNUX0JFR0lOX0NIQVIpOworICAgICAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChkYXRhLCBwb3MgKyAyLCBEQlVTX1NUUlVDVF9FTkRfQ0hBUik7CisgICAgICAKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9TVFJVQ1RfSEFTX05PX0ZJRUxEUzsKKyAgICB9CisgIGVsc2UgaWYgKGl0ZW1fc2VxID09IDYpCisgICAgeworICAgICAgbWVzc2FnZSA9IHNpbXBsZV9tZXRob2RfY2FsbCAoKTsKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKGRhdGEsIFRZUEVfT0ZGU0VULCBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEKTsKKyAgICAgIAorICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX0JBRF9NRVNTQUdFX1RZUEU7CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSA3KQorICAgIHsKKyAgICAgIC8qIE1lc3NhZ2VzIG9mIHVua25vd24gdHlwZSBhcmUgY29uc2lkZXJlZCB2YWxpZCAqLworICAgICAgbWVzc2FnZSA9IHNpbXBsZV9tZXRob2RfY2FsbCAoKTsKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKGRhdGEsIFRZUEVfT0ZGU0VULCAxMDApOworICAgICAgCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX1ZBTElEOworICAgIH0KKyAgZWxzZSBpZiAoaXRlbV9zZXEgPT0gOCkKKyAgICB7CisgICAgICBjaGFyIGJ5dGVfb3JkZXI7CisKKyAgICAgIG1lc3NhZ2UgPSBzaW1wbGVfbWV0aG9kX2NhbGwgKCk7CisgICAgICBieXRlX29yZGVyID0gX2RidXNfaGVhZGVyX2dldF9ieXRlX29yZGVyICgmbWVzc2FnZS0+aGVhZGVyKTsKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworICAgICAgCisgICAgICBfZGJ1c19tYXJzaGFsX3NldF91aW50MzIgKGRhdGEsIEJPRFlfTEVOR1RIX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19NQVhJTVVNX01FU1NBR0VfTEVOR1RIIC8gMiArIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIpOworICAgICAgX2RidXNfbWFyc2hhbF9zZXRfdWludDMyIChkYXRhLCBGSUVMRFNfQVJSQVlfTEVOR1RIX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19NQVhJTVVNX01FU1NBR0VfTEVOR1RIIC8gMiArIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIpOworICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX01FU1NBR0VfVE9PX0xPTkc7CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSA5KQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnZfU1RSSU5HID0gIm5vdCBhIHZhbGlkIGJ1cyBuYW1lIjsKKyAgICAgIG1lc3NhZ2UgPSBzaW1wbGVfbWV0aG9kX2NhbGwgKCk7CisKKyAgICAgIGlmICghX2RidXNfaGVhZGVyX3NldF9maWVsZF9iYXNpYyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0VOREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdl9TVFJJTkcpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgIAorICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9CQURfU0VOREVSOworICAgIH0KKyAgZWxzZSBpZiAoaXRlbV9zZXEgPT0gMTApCisgICAgeworICAgICAgbWVzc2FnZSA9IHNpbXBsZV9tZXRob2RfY2FsbCAoKTsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2ludGVyZmFjZSAobWVzc2FnZSwgREJVU19JTlRFUkZBQ0VfTE9DQUwpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgIAorICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9VU0VTX0xPQ0FMX0lOVEVSRkFDRTsKKyAgICB9CisgIGVsc2UgaWYgKGl0ZW1fc2VxID09IDExKQorICAgIHsKKyAgICAgIG1lc3NhZ2UgPSBzaW1wbGVfbWV0aG9kX2NhbGwgKCk7CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX3NldF9wYXRoIChtZXNzYWdlLCBEQlVTX1BBVEhfTE9DQUwpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgIAorICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9VU0VTX0xPQ0FMX1BBVEg7CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSAxMikKKyAgICB7CisgICAgICAvKiBNZXRob2QgY2FsbHMgZG9uJ3QgaGF2ZSB0byBoYXZlIGludGVyZmFjZSAqLworICAgICAgbWVzc2FnZSA9IHNpbXBsZV9tZXRob2RfY2FsbCAoKTsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2ludGVyZmFjZSAobWVzc2FnZSwgTlVMTCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAgICAgCisgICAgICBnZW5lcmF0ZV9mcm9tX21lc3NhZ2UgKGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5LCBtZXNzYWdlKTsKKyAgICAgIAorICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19WQUxJRDsKKyAgICB9CisgIGVsc2UgaWYgKGl0ZW1fc2VxID09IDEzKQorICAgIHsKKyAgICAgIC8qIFNpZ25hbHMgcmVxdWlyZSBhbiBpbnRlcmZhY2UgKi8KKyAgICAgIG1lc3NhZ2UgPSBzaW1wbGVfc2lnbmFsICgpOworCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfaW50ZXJmYWNlIChtZXNzYWdlLCBOVUxMKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgICAgICAKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworICAgICAgCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfTUlTU0lOR19JTlRFUkZBQ0U7CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSAxNCkKKyAgICB7CisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9yZXR1cm4gKCk7CisKKyAgICAgIGlmICghX2RidXNfaGVhZGVyX2RlbGV0ZV9maWVsZCAoJm1lc3NhZ2UtPmhlYWRlciwgREJVU19IRUFERVJfRklFTERfUkVQTFlfU0VSSUFMKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgICAgICAKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworICAgICAgCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfTUlTU0lOR19SRVBMWV9TRVJJQUw7CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSAxNSkKKyAgICB7CisgICAgICBtZXNzYWdlID0gc2ltcGxlX2Vycm9yICgpOworCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfZXJyb3JfbmFtZSAobWVzc2FnZSwgTlVMTCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAgICAgCisgICAgICBnZW5lcmF0ZV9mcm9tX21lc3NhZ2UgKGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5LCBtZXNzYWdlKTsKKyAgICAgIAorICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX01JU1NJTkdfRVJST1JfTkFNRTsKKyAgICB9CisgIGVsc2UgaWYgKGl0ZW1fc2VxID09IDE2KQorICAgIHsKKyAgICAgIGNoYXIgbG9uZ19zaWdbREJVU19NQVhJTVVNX1RZUEVfUkVDVVJTSU9OX0RFUFRIKjQrMTBdOworICAgICAgY29uc3QgY2hhciAqdl9TVFJJTkc7CisgICAgICBpbnQgaTsKKyAgICAgIGludCBuX2JlZ2luczsKKyAgICAgIAorICAgICAgbWVzc2FnZSA9IHNpbXBsZV9tZXRob2RfY2FsbCAoKTsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKGkgPD0gKERCVVNfTUFYSU1VTV9UWVBFX1JFQ1VSU0lPTl9ERVBUSCozICsgMykpCisgICAgICAgIHsKKyAgICAgICAgICBsb25nX3NpZ1tpXSA9IERCVVNfVFlQRV9BUlJBWTsKKyAgICAgICAgICArK2k7CisgICAgICAgICAgbG9uZ19zaWdbaV0gPSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUjsKKyAgICAgICAgICArK2k7CisgICAgICAgICAgbG9uZ19zaWdbaV0gPSBEQlVTX1RZUEVfSU5UMzI7CisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgICBuX2JlZ2lucyA9IGkgLyAzOworCisgICAgICBsb25nX3NpZ1tpXSA9IERCVVNfVFlQRV9JTlQzMjsKKyAgICAgICsraTsKKyAgICAgIAorICAgICAgd2hpbGUgKG5fYmVnaW5zID4gMCkKKyAgICAgICAgeworICAgICAgICAgIGxvbmdfc2lnW2ldID0gREJVU19ESUNUX0VOVFJZX0VORF9DSEFSOworICAgICAgICAgICsraTsKKyAgICAgICAgICBuX2JlZ2lucyAtPSAxOworICAgICAgICB9CisgICAgICBsb25nX3NpZ1tpXSA9IERCVVNfVFlQRV9JTlZBTElEOworICAgICAgCisgICAgICB2X1NUUklORyA9IGxvbmdfc2lnOworICAgICAgaWYgKCFfZGJ1c19oZWFkZXJfc2V0X2ZpZWxkX2Jhc2ljICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9TSUdOQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TSUdOQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X1NUUklORykpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAgICAgCisgICAgICBfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX3JhdyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9TSUdOQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJnBvcyk7CisgICAgICBnZW5lcmF0ZV9mcm9tX21lc3NhZ2UgKGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5LCBtZXNzYWdlKTsKKyAgICAgIAorICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX0VYQ0VFREVEX01BWElNVU1fRElDVF9FTlRSWV9SRUNVUlNJT047CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSAxNykKKyAgICB7CisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9jYWxsICgpOworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfcmF3ICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmcG9zKTsKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKGRhdGEsIHBvcyArIDEsIERCVVNfVFlQRV9BUlJBWSk7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKGRhdGEsIHBvcyArIDIsIERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSKTsKKyAgICAgIAorICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX0RJQ1RfRU5UUllfU1RBUlRFRF9CVVRfTk9UX0VOREVEOworICAgIH0KKyAgZWxzZSBpZiAoaXRlbV9zZXEgPT0gMTgpCisgICAgeworICAgICAgbWVzc2FnZSA9IHNpbXBsZV9tZXRob2RfY2FsbCAoKTsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX3JhdyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9TSUdOQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJnBvcyk7CisgICAgICBnZW5lcmF0ZV9mcm9tX21lc3NhZ2UgKGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5LCBtZXNzYWdlKTsKKyAgICAgIAorICAgICAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChkYXRhLCBwb3MgKyAxLCBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVIpOworICAgICAgCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9FTkRFRF9CVVRfTk9UX1NUQVJURUQ7CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSAxOSkKKyAgICB7CisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9jYWxsICgpOworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfcmF3ICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmcG9zKTsKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKGRhdGEsIHBvcyArIDEsIERCVVNfVFlQRV9BUlJBWSk7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKGRhdGEsIHBvcyArIDIsIERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSKTsKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAoZGF0YSwgcG9zICsgMywgREJVU19ESUNUX0VOVFJZX0VORF9DSEFSKTsKKyAgICAgIAorICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX0RJQ1RfRU5UUllfSEFTX05PX0ZJRUxEUzsKKyAgICB9CisgIGVsc2UgaWYgKGl0ZW1fc2VxID09IDIwKQorICAgIHsKKyAgICAgIC8qIDY0IGxldmVscyBvZiBuZXN0aW5nIGlzIE9LICovCisgICAgICBtZXNzYWdlID0gbWVzc2FnZV93aXRoX25lc3RpbmdfbGV2ZWxzKDY0KTsKKworICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfVkFMSUQ7CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSAyMSkKKyAgICB7CisgICAgICAvKiA2NSBsZXZlbHMgb2YgbmVzdGluZyBpcyBub3QgT0sgKi8KKyAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlX3dpdGhfbmVzdGluZ19sZXZlbHMoNjUpOworCisgICAgICBnZW5lcmF0ZV9mcm9tX21lc3NhZ2UgKGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5LCBtZXNzYWdlKTsKKworICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX05FU1RFRF9UT09fREVFUExZOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICBpdGVyX25leHQgKGl0ZXIpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitnZW5lcmF0ZV93cm9uZ19sZW5ndGggKERCdXNNZXNzYWdlRGF0YUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5KQoreworICBpbnQgbGVuZ3Roc1tdID0geyAtNDIsIC0xNywgLTE2LCAtMTUsIC05LCAtOCwgLTcsIC02LCAtNSwgLTQsIC0zLCAtMiwgLTEsCisgICAgICAgICAgICAgICAgICAgIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDE1LCAxNiwgMzAgfTsKKyAgaW50IGFkanVzdDsKKyAgaW50IGxlbl9zZXE7CisKKyByZXN0YXJ0OgorICBsZW5fc2VxID0gaXRlcl9nZXRfc2VxdWVuY2UgKGl0ZXIpOworICBpZiAobGVuX3NlcSA9PSBfREJVU19OX0VMRU1FTlRTIChsZW5ndGhzKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfYXNzZXJ0IChsZW5fc2VxIDwgX0RCVVNfTl9FTEVNRU5UUyAobGVuZ3RocykpOworICAKKyAgaXRlcl9yZWN1cnNlIChpdGVyKTsKKyAgaWYgKCFnZW5lcmF0ZV9tYW55X2JvZGllcyAoaXRlciwgZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHkpKQorICAgIHsKKyAgICAgIGl0ZXJfc2V0X3NlcXVlbmNlIChpdGVyLCAwKTsgLyogcmVzZXQgdG8gZmlyc3QgYm9keSAqLworICAgICAgaXRlcl91bnJlY3Vyc2UgKGl0ZXIpOworICAgICAgaXRlcl9uZXh0IChpdGVyKTsgICAgICAgICAgICAvKiBuZXh0IGxlbmd0aCBhZGp1c3RtZW50ICovCisgICAgICBnb3RvIHJlc3RhcnQ7CisgICAgfQorICBpdGVyX3VucmVjdXJzZSAoaXRlcik7CisKKyAgYWRqdXN0ID0gbGVuZ3Roc1tsZW5fc2VxXTsKKworICBpZiAoYWRqdXN0IDwgMCkKKyAgICB7CisgICAgICBpZiAoKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSArIGFkanVzdCkgPCBEQlVTX01JTklNVU1fSEVBREVSX1NJWkUpCisgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChkYXRhLCBEQlVTX01JTklNVU1fSEVBREVSX1NJWkUpOworICAgICAgZWxzZQorICAgICAgICBfZGJ1c19zdHJpbmdfc2hvcnRlbiAoZGF0YSwgLSBhZGp1c3QpOworICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX0ZPUl9VTktOT1dOX1JFQVNPTjsKKyAgICB9CisgIGVsc2UKKyAgICB7ICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19sZW5ndGhlbiAoZGF0YSwgYWRqdXN0KSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfVE9PX01VQ0hfREFUQTsKKyAgICB9CisKKyAgLyogRml4dXAgbGVuZ3RocyAqLworICB7CisgICAgaW50IG9sZF9ib2R5X2xlbjsKKyAgICBpbnQgbmV3X2JvZHlfbGVuOworICAgIGludCBieXRlX29yZGVyOworICAgIAorICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpID49IERCVVNfTUlOSU1VTV9IRUFERVJfU0laRSk7CisgICAgCisgICAgYnl0ZV9vcmRlciA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZGF0YSwgQllURV9PUkRFUl9PRkZTRVQpOworICAgIG9sZF9ib2R5X2xlbiA9IF9kYnVzX21hcnNoYWxfcmVhZF91aW50MzIgKGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9MRU5HVEhfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgX2RidXNfYXNzZXJ0IChvbGRfYm9keV9sZW4gPCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGF0YSkpOworICAgIG5ld19ib2R5X2xlbiA9IG9sZF9ib2R5X2xlbiArIGFkanVzdDsKKyAgICBpZiAobmV3X2JvZHlfbGVuIDwgMCkKKyAgICAgIHsKKyAgICAgICAgbmV3X2JvZHlfbGVuID0gMDsKKyAgICAgICAgLyogd2UganVzdCBtdW5nZWQgdGhlIGhlYWRlciwgYW5kIGFyZW4ndCBzdXJlIGhvdyAqLworICAgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX1ZBTElESVRZX1VOS05PV047CisgICAgICB9CisKKyAgICBfZGJ1c192ZXJib3NlICgiY2hhbmdpbmcgYm9keSBsZW4gZnJvbSAldSB0byAldSBieSBhZGp1c3QgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgb2xkX2JvZHlfbGVuLCBuZXdfYm9keV9sZW4sIGFkanVzdCk7CisgICAgCisgICAgX2RidXNfbWFyc2hhbF9zZXRfdWludDMyIChkYXRhLCBCT0RZX0xFTkdUSF9PRkZTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfYm9keV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2dlbmVyYXRlX2J5dGVfY2hhbmdlZCAoREJ1c01lc3NhZ2VEYXRhSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICAgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkpCit7CisgIGludCBieXRlX3NlcTsKKyAgaW50IHZfQllURTsKKworICAvKiBUaGlzIGlzIGEgbGl0dGxlIGNvbnZvbHV0ZWQgdG8gbWFrZSB0aGUgYm9kaWVzIHRoZQorICAgKiBvdXRlciBsb29wIGFuZCBlYWNoIGJ5dGUgb2YgZWFjaCBib2R5IHRoZSBpbm5lcgorICAgKiBsb29wCisgICAqLworCisgcmVzdGFydDoKKyAgaWYgKCFnZW5lcmF0ZV9tYW55X2JvZGllcyAoaXRlciwgZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHkpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpdGVyX3JlY3Vyc2UgKGl0ZXIpOworICBieXRlX3NlcSA9IGl0ZXJfZ2V0X3NlcXVlbmNlIChpdGVyKTsKKyAgaXRlcl9uZXh0IChpdGVyKTsKKyAgaXRlcl91bnJlY3Vyc2UgKGl0ZXIpOworICAKKyAgaWYgKGJ5dGVfc2VxID09IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoZGF0YSwgMCk7CisgICAgICAvKiByZXNldCBieXRlIGNvdW50ICovCisgICAgICBpdGVyX3JlY3Vyc2UgKGl0ZXIpOworICAgICAgaXRlcl9zZXRfc2VxdWVuY2UgKGl0ZXIsIDApOworICAgICAgaXRlcl91bnJlY3Vyc2UgKGl0ZXIpOworICAgICAgZ290byByZXN0YXJ0OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFVuZG8gdGhlICJuZXh0IiBpbiBnZW5lcmF0ZV9tYW55X2JvZGllcyAqLworICAgICAgaXRlcl9zZXRfc2VxdWVuY2UgKGl0ZXIsIGl0ZXJfZ2V0X3NlcXVlbmNlIChpdGVyKSAtIDEpOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGJ5dGVfc2VxIDwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpKTsKKyAgdl9CWVRFID0gX2RidXNfc3RyaW5nX2dldF9ieXRlIChkYXRhLCBieXRlX3NlcSk7CisgIHZfQllURSArPSBieXRlX3NlcTsgLyogYXJiaXRyYXJ5IGJ1dCBkZXRlcm1pbmlzdGljIGNoYW5nZSB0byB0aGUgYnl0ZSAqLworICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKGRhdGEsIGJ5dGVfc2VxLCB2X0JZVEUpOworICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX1ZBTElESVRZX1VOS05PV047CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNpZiAwCisvKiBUaGlzIGlzIHJlYWxseSBleHBlbnNpdmUgYW5kIGRvZXNuJ3QgYWRkIHRvbyBtdWNoIGNvdmVyYWdlICovCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZmluZF9uZXh0X3R5cGVjb2RlIChEQnVzTWVzc2FnZURhdGFJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgICpleHBlY3RlZF92YWxpZGl0eSkKK3sKKyAgaW50IGJvZHlfc2VxOworICBpbnQgYnl0ZV9zZXE7CisgIGludCBiYXNlX2RlcHRoOworCisgIGJhc2VfZGVwdGggPSBpdGVyLT5kZXB0aDsKKworIHJlc3RhcnQ6CisgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAwKSk7CisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChkYXRhLCAwKTsKKworICBib2R5X3NlcSA9IGl0ZXJfZ2V0X3NlcXVlbmNlIChpdGVyKTsKKyAgCisgIGlmICghZ2VuZXJhdGVfbWFueV9ib2RpZXMgKGl0ZXIsIGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5KSkKKyAgICByZXR1cm4gRkFMU0U7CisgIC8qIFVuZG8gdGhlICJuZXh0IiBpbiBnZW5lcmF0ZV9tYW55X2JvZGllcyAqLworICBpdGVyX3NldF9zZXF1ZW5jZSAoaXRlciwgYm9keV9zZXEpOworICAKKyAgaXRlcl9yZWN1cnNlIChpdGVyKTsKKyAgd2hpbGUgKFRSVUUpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDEpKTsKKyAgICAgIAorICAgICAgYnl0ZV9zZXEgPSBpdGVyX2dldF9zZXF1ZW5jZSAoaXRlcik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoYnl0ZV9zZXEgPD0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpKTsKKyAgICAgIAorICAgICAgaWYgKGJ5dGVfc2VxID09IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIHJlc2V0IGJ5dGUgY291bnQgKi8KKyAgICAgICAgICBpdGVyX3NldF9zZXF1ZW5jZSAoaXRlciwgMCk7CisgICAgICAgICAgaXRlcl91bnJlY3Vyc2UgKGl0ZXIpOworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAwKSk7CisgICAgICAgICAgaXRlcl9uZXh0IChpdGVyKTsgLyogZ28gdG8gdGhlIG5leHQgYm9keSAqLworICAgICAgICAgIGdvdG8gcmVzdGFydDsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c19hc3NlcnQgKGJ5dGVfc2VxIDwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpKTsKKworICAgICAgaWYgKGRidXNfdHlwZV9pc192YWxpZCAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChkYXRhLCBieXRlX3NlcSkpKQorICAgICAgICBicmVhazsKKyAgICAgIGVsc2UKKyAgICAgICAgaXRlcl9uZXh0IChpdGVyKTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChieXRlX3NlcSA9PSBpdGVyX2dldF9zZXF1ZW5jZSAoaXRlcikpOworICBfZGJ1c19hc3NlcnQgKGJ5dGVfc2VxIDwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpKTsKKworICBpdGVyX3VucmVjdXJzZSAoaXRlcik7CisKKyAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDApKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgY29uc3QgaW50IHR5cGVjb2Rlc1tdID0geworICBEQlVTX1RZUEVfSU5WQUxJRCwKKyAgREJVU19UWVBFX0JZVEUsCisgIERCVVNfVFlQRV9CT09MRUFOLAorICBEQlVTX1RZUEVfSU5UMTYsCisgIERCVVNfVFlQRV9VSU5UMTYsCisgIERCVVNfVFlQRV9JTlQzMiwKKyAgREJVU19UWVBFX1VJTlQzMiwKKyAgREJVU19UWVBFX0lOVDY0LAorICBEQlVTX1RZUEVfVUlOVDY0LAorICBEQlVTX1RZUEVfRE9VQkxFLAorICBEQlVTX1RZUEVfU1RSSU5HLAorICBEQlVTX1RZUEVfT0JKRUNUX1BBVEgsCisgIERCVVNfVFlQRV9TSUdOQVRVUkUsCisgIERCVVNfVFlQRV9BUlJBWSwKKyAgREJVU19UWVBFX1ZBUklBTlQsCisgIERCVVNfU1RSVUNUX0JFR0lOX0NIQVIsCisgIERCVVNfU1RSVUNUX0VORF9DSEFSLAorICBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUiwKKyAgREJVU19ESUNUX0VOVFJZX0VORF9DSEFSLAorICBEQlVTX1RZUEVfVU5JWF9GRCwKKyAgMjU1IC8qIHJhbmRvbSBpbnZhbGlkIHR5cGVjb2RlICovCit9OworCitzdGF0aWMgZGJ1c19ib29sX3QKK2dlbmVyYXRlX3R5cGVjb2RlX2NoYW5nZWQgKERCdXNNZXNzYWdlRGF0YUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICAgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkpCit7CisgIGludCBieXRlX3NlcTsKKyAgaW50IHR5cGVjb2RlX3NlcTsKKyAgaW50IGJhc2VfZGVwdGg7CisKKyAgYmFzZV9kZXB0aCA9IGl0ZXItPmRlcHRoOworCisgcmVzdGFydDoKKyAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDApKTsKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKGRhdGEsIDApOworICAKKyAgaWYgKCFmaW5kX25leHRfdHlwZWNvZGUgKGl0ZXIsIGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaXRlcl9yZWN1cnNlIChpdGVyKTsKKyAgYnl0ZV9zZXEgPSBpdGVyX2dldF9zZXF1ZW5jZSAoaXRlcik7CisKKyAgX2RidXNfYXNzZXJ0IChieXRlX3NlcSA8IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSk7CisgIAorICBpdGVyX3JlY3Vyc2UgKGl0ZXIpOworICB0eXBlY29kZV9zZXEgPSBpdGVyX2dldF9zZXF1ZW5jZSAoaXRlcik7CisgIGl0ZXJfbmV4dCAoaXRlcik7CisKKyAgX2RidXNfYXNzZXJ0ICh0eXBlY29kZV9zZXEgPD0gX0RCVVNfTl9FTEVNRU5UUyAodHlwZWNvZGVzKSk7CisgIAorICBpZiAodHlwZWNvZGVfc2VxID09IF9EQlVTX05fRUxFTUVOVFMgKHR5cGVjb2RlcykpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDIpKTsKKyAgICAgIGl0ZXJfc2V0X3NlcXVlbmNlIChpdGVyLCAwKTsgLyogcmVzZXQgdHlwZWNvZGUgc2VxdWVuY2UgKi8KKyAgICAgIGl0ZXJfdW5yZWN1cnNlIChpdGVyKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAxKSk7CisgICAgICBpdGVyX25leHQgKGl0ZXIpOyAvKiBnbyB0byB0aGUgbmV4dCBieXRlX3NlcSAqLworICAgICAgaXRlcl91bnJlY3Vyc2UgKGl0ZXIpOworICAgICAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDApKTsKKyAgICAgIGdvdG8gcmVzdGFydDsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDIpKTsKKyAgaXRlcl91bnJlY3Vyc2UgKGl0ZXIpOworICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoID09IChiYXNlX2RlcHRoICsgMSkpOworICBpdGVyX3VucmVjdXJzZSAoaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAwKSk7CisKKyNpZiAwCisgIHByaW50ZiAoIkNoYW5naW5nIGJ5dGUgJWQgaW4gbWVzc2FnZSAlZCB0byAlY1xuIiwKKyAgICAgICAgICBieXRlX3NlcSwgaXRlcl9nZXRfc2VxdWVuY2UgKGl0ZXIpLCB0eXBlY29kZXNbdHlwZWNvZGVfc2VxXSk7CisjZW5kaWYKKyAgCisgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAoZGF0YSwgYnl0ZV9zZXEsIHR5cGVjb2Rlc1t0eXBlY29kZV9zZXFdKTsKKyAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19WQUxJRElUWV9VTktOT1dOOworICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdAoreworICBDaGFuZ2VUeXBlIHR5cGU7CisgIGRidXNfdWludDMyX3QgdmFsdWU7IC8qIGNhc3QgdG8gc2lnbmVkIGZvciBhZGp1c3RzICovCit9IFVJbnRDaGFuZ2U7CisKK3N0YXRpYyBjb25zdCBVSW50Q2hhbmdlIHVpbnQzMl9jaGFuZ2VzW10gPSB7CisgIHsgQ0hBTkdFX1RZUEVfQURKVVNULCAoZGJ1c191aW50MzJfdCkgLTEgfSwKKyAgeyBDSEFOR0VfVFlQRV9BREpVU1QsIChkYnVzX3VpbnQzMl90KSAtMiB9LAorICB7IENIQU5HRV9UWVBFX0FESlVTVCwgKGRidXNfdWludDMyX3QpIC0zIH0sCisgIHsgQ0hBTkdFX1RZUEVfQURKVVNULCAoZGJ1c191aW50MzJfdCkgMSB9LAorICB7IENIQU5HRV9UWVBFX0FESlVTVCwgKGRidXNfdWludDMyX3QpIDIgfSwKKyAgeyBDSEFOR0VfVFlQRV9BREpVU1QsIChkYnVzX3VpbnQzMl90KSAzIH0sCisgIHsgQ0hBTkdFX1RZUEVfQUJTT0xVVEUsIF9EQlVTX1VJTlQzMl9NQVggfSwKKyAgeyBDSEFOR0VfVFlQRV9BQlNPTFVURSwgMCB9LAorICB7IENIQU5HRV9UWVBFX0FCU09MVVRFLCAxIH0sCisgIHsgQ0hBTkdFX1RZUEVfQUJTT0xVVEUsIF9EQlVTX1VJTlQzMl9NQVggLSAxIH0sCisgIHsgQ0hBTkdFX1RZUEVfQUJTT0xVVEUsIF9EQlVTX1VJTlQzMl9NQVggLSA1IH0KK307CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2VuZXJhdGVfdWludDMyX2NoYW5nZWQgKERCdXNNZXNzYWdlRGF0YUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgICpleHBlY3RlZF92YWxpZGl0eSkKK3sKKyAgaW50IGJvZHlfc2VxOworICBpbnQgYnl0ZV9zZXE7CisgIGludCBjaGFuZ2Vfc2VxOworICBkYnVzX3VpbnQzMl90IHZfVUlOVDMyOworICBpbnQgYnl0ZV9vcmRlcjsKKyAgY29uc3QgVUludENoYW5nZSAqY2hhbmdlOworICBpbnQgYmFzZV9kZXB0aDsKKworICAvKiBPdXRlciBsb29wIGlzIGVhY2ggYm9keSwgbmV4dCBsb29wIGlzIGVhY2ggY2hhbmdlLAorICAgKiBpbm5lciBsb29wIGlzIGVhY2ggY2hhbmdlIGxvY2F0aW9uCisgICAqLworCisgIGJhc2VfZGVwdGggPSBpdGVyLT5kZXB0aDsKKyAgCisgbmV4dF9ib2R5OgorICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoID09IChiYXNlX2RlcHRoICsgMCkpOworICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoZGF0YSwgMCk7CisgIGJvZHlfc2VxID0gaXRlcl9nZXRfc2VxdWVuY2UgKGl0ZXIpOworICAKKyAgaWYgKCFnZW5lcmF0ZV9tYW55X2JvZGllcyAoaXRlciwgZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHkpKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoID09IChiYXNlX2RlcHRoICsgMCkpOworCisgIGl0ZXJfc2V0X3NlcXVlbmNlIChpdGVyLCBib2R5X3NlcSk7IC8qIHVuZG8gdGhlICJuZXh0IiBmcm9tIGdlbmVyYXRlX21hbnlfYm9kaWVzICovCisgIGl0ZXJfcmVjdXJzZSAoaXRlcik7CisgbmV4dF9jaGFuZ2U6CisgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAxKSk7CisgIGNoYW5nZV9zZXEgPSBpdGVyX2dldF9zZXF1ZW5jZSAoaXRlcik7CisgIAorICBpZiAoY2hhbmdlX3NlcSA9PSBfREJVU19OX0VMRU1FTlRTICh1aW50MzJfY2hhbmdlcykpCisgICAgeworICAgICAgLyogUmVzZXQgY2hhbmdlIGNvdW50ICovCisgICAgICBpdGVyX3NldF9zZXF1ZW5jZSAoaXRlciwgMCk7CisgICAgICBpdGVyX3VucmVjdXJzZSAoaXRlcik7CisgICAgICBpdGVyX25leHQgKGl0ZXIpOworICAgICAgZ290byBuZXh0X2JvZHk7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAxKSk7CisgIAorICBpdGVyX3JlY3Vyc2UgKGl0ZXIpOworICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoID09IChiYXNlX2RlcHRoICsgMikpOworICBieXRlX3NlcSA9IGl0ZXJfZ2V0X3NlcXVlbmNlIChpdGVyKTsKKyAgLyogc2tpcCA0IGJ5dGVzIGF0IGEgdGltZSAqLworICBpdGVyX25leHQgKGl0ZXIpOworICBpdGVyX25leHQgKGl0ZXIpOworICBpdGVyX25leHQgKGl0ZXIpOworICBpdGVyX25leHQgKGl0ZXIpOworICBpdGVyX3VucmVjdXJzZSAoaXRlcik7CisKKyAgX2RidXNfYXNzZXJ0IChfREJVU19BTElHTl9WQUxVRSAoYnl0ZV9zZXEsIDQpID09ICh1bnNpZ25lZCkgYnl0ZV9zZXEpOworICBpZiAoYnl0ZV9zZXEgPj0gKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSAtIDQpKQorICAgIHsKKyAgICAgIC8qIHJlc2V0IGJ5dGUgY291bnQgKi8KKyAgICAgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAxKSk7CisgICAgICBpdGVyX3JlY3Vyc2UgKGl0ZXIpOworICAgICAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDIpKTsKKyAgICAgIGl0ZXJfc2V0X3NlcXVlbmNlIChpdGVyLCAwKTsKKyAgICAgIGl0ZXJfdW5yZWN1cnNlIChpdGVyKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAxKSk7CisgICAgICBpdGVyX25leHQgKGl0ZXIpOworICAgICAgZ290byBuZXh0X2NoYW5nZTsKKyAgICB9CisgIAorICBfZGJ1c19hc3NlcnQgKGJ5dGVfc2VxIDw9IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGF0YSkgLSA0KSk7CisKKyAgYnl0ZV9vcmRlciA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZGF0YSwgQllURV9PUkRFUl9PRkZTRVQpOworICAKKyAgdl9VSU5UMzIgPSBfZGJ1c19tYXJzaGFsX3JlYWRfdWludDMyIChkYXRhLCBieXRlX3NlcSwgYnl0ZV9vcmRlciwgTlVMTCk7CisKKyAgY2hhbmdlID0gJnVpbnQzMl9jaGFuZ2VzW2NoYW5nZV9zZXFdOworCisgIGlmIChjaGFuZ2UtPnR5cGUgPT0gQ0hBTkdFX1RZUEVfQURKVVNUKQorICAgIHsKKyAgICAgIHZfVUlOVDMyICs9IChpbnQpIGNoYW5nZS0+dmFsdWU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdl9VSU5UMzIgPSBjaGFuZ2UtPnZhbHVlOworICAgIH0KKworI2lmIDAKKyAgcHJpbnRmICgiYm9keSAlZCBjaGFuZ2UgJWQgcG9zICVkICIsCisgICAgICAgICAgYm9keV9zZXEsIGNoYW5nZV9zZXEsIGJ5dGVfc2VxKTsKKworICBpZiAoY2hhbmdlLT50eXBlID09IENIQU5HRV9UWVBFX0FESlVTVCkKKyAgICBwcmludGYgKCJhZGp1c3QgYnkgJWQiLCAoaW50KSBjaGFuZ2UtPnZhbHVlKTsKKyAgZWxzZQorICAgIHByaW50ZiAoInNldCB0byAldSIsIGNoYW5nZS0+dmFsdWUpOworICAKKyAgcHJpbnRmICgiIFx0JXUgLT4gJXVcbiIsCisgICAgICAgICAgX2RidXNfbWFyc2hhbF9yZWFkX3VpbnQzMiAoZGF0YSwgYnl0ZV9zZXEsIGJ5dGVfb3JkZXIsIE5VTEwpLAorICAgICAgICAgIHZfVUlOVDMyKTsKKyNlbmRpZgorICAKKyAgX2RidXNfbWFyc2hhbF9zZXRfdWludDMyIChkYXRhLCBieXRlX3NlcSwgdl9VSU5UMzIsIGJ5dGVfb3JkZXIpOworICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX1ZBTElESVRZX1VOS05PV047CisKKyAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDEpKTsKKyAgaXRlcl91bnJlY3Vyc2UgKGl0ZXIpOworICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoID09IChiYXNlX2RlcHRoICsgMCkpOworICAgICAgICAgIAorICByZXR1cm4gVFJVRTsKK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgREJ1c01lc3NhZ2VHZW5lcmF0b3JGdW5jIGZ1bmM7ICAKK30gREJ1c01lc3NhZ2VHZW5lcmF0b3I7CisKK3N0YXRpYyBjb25zdCBEQnVzTWVzc2FnZUdlbmVyYXRvciBnZW5lcmF0b3JzW10gPSB7CisgIHsgInRyaXZpYWwgZXhhbXBsZSBvZiBlYWNoIG1lc3NhZ2UgdHlwZSIsIGdlbmVyYXRlX3RyaXZpYWwgfSwKKyAgeyAiYXNzb3J0ZWQgYXJndW1lbnRzIiwgZ2VuZXJhdGVfbWFueV9ib2RpZXMgfSwKKyAgeyAiYXNzb3J0ZWQgc3BlY2lhbCBjYXNlcyIsIGdlbmVyYXRlX3NwZWNpYWwgfSwKKyAgeyAiZWFjaCB1aW50MzIgbW9kaWZpZWQiLCBnZW5lcmF0ZV91aW50MzJfY2hhbmdlZCB9LAorICB7ICJ3cm9uZyBib2R5IGxlbmd0aHMiLCBnZW5lcmF0ZV93cm9uZ19sZW5ndGggfSwKKyAgeyAiZWFjaCBieXRlIG1vZGlmaWVkIiwgZ2VuZXJhdGVfYnl0ZV9jaGFuZ2VkIH0sCisjaWYgMAorICAvKiBUaGlzIGlzIHJlYWxseSBleHBlbnNpdmUgYW5kIGRvZXNuJ3QgYWRkIHRvbyBtdWNoIGNvdmVyYWdlICovCisgIHsgImNoYW5nZSBlYWNoIHR5cGVjb2RlIiwgZ2VuZXJhdGVfdHlwZWNvZGVfY2hhbmdlZCB9CisjZW5kaWYKK307CisKK3ZvaWQKK19kYnVzX21lc3NhZ2VfZGF0YV9mcmVlIChEQnVzTWVzc2FnZURhdGEgKmRhdGEpCit7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZGF0YS0+ZGF0YSk7Cit9CisKK3ZvaWQKK19kYnVzX21lc3NhZ2VfZGF0YV9pdGVyX2luaXQgKERCdXNNZXNzYWdlRGF0YUl0ZXIgKml0ZXIpCit7CisgIGludCBpOworICAKKyAgaXRlci0+ZGVwdGggPSAwOworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBfREJVU19NRVNTQUdFX0RBVEFfTUFYX05FU1RJTkcpCisgICAgeworICAgICAgaXRlci0+c2VxdWVuY2Vfbm9zW2ldID0gMDsKKyAgICAgICsraTsKKyAgICB9CisgIGl0ZXItPmNvdW50ID0gMDsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX21lc3NhZ2VfZGF0YV9pdGVyX2dldF9hbmRfbmV4dCAoREJ1c01lc3NhZ2VEYXRhSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VEYXRhICAgICAqZGF0YSkKK3sKKyAgREJ1c01lc3NhZ2VHZW5lcmF0b3JGdW5jIGZ1bmM7CisgIGludCBnZW5lcmF0b3I7CisKKyByZXN0YXJ0OgorICBnZW5lcmF0b3IgPSBpdGVyX2dldF9zZXF1ZW5jZSAoaXRlcik7CisgIAorICBpZiAoZ2VuZXJhdG9yID09IF9EQlVTX05fRUxFTUVOVFMgKGdlbmVyYXRvcnMpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpdGVyX3JlY3Vyc2UgKGl0ZXIpOworICAKKyAgaWYgKGl0ZXJfZmlyc3RfaW5fc2VyaWVzIChpdGVyKSkKKyAgICB7CisgICAgICBwcmludGYgKCIgdGVzdGluZyBtZXNzYWdlIGxvYWRpbmc6ICVzICIsIGdlbmVyYXRvcnNbZ2VuZXJhdG9yXS5uYW1lKTsKKyAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKKyAgICB9CisgIAorICBmdW5jID0gZ2VuZXJhdG9yc1tnZW5lcmF0b3JdLmZ1bmM7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmRhdGEtPmRhdGEpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAKKyAgaWYgKCgqZnVuYykoaXRlciwgJmRhdGEtPmRhdGEsICZkYXRhLT5leHBlY3RlZF92YWxpZGl0eSkpCisgICAgOworICBlbHNlCisgICAgeworICAgICAgaXRlcl9zZXRfc2VxdWVuY2UgKGl0ZXIsIDApOworICAgICAgaXRlcl91bnJlY3Vyc2UgKGl0ZXIpOworICAgICAgaXRlcl9uZXh0IChpdGVyKTsgLyogbmV4dCBnZW5lcmF0b3IgKi8KKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZGF0YS0+ZGF0YSk7CisgICAgICBwcmludGYgKCIlZCB0ZXN0IGxvYWRzIGN1bXVsYXRpdmVcbiIsIGl0ZXItPmNvdW50KTsKKyAgICAgIGdvdG8gcmVzdGFydDsKKyAgICB9CisgIGl0ZXJfdW5yZWN1cnNlIChpdGVyKTsKKworICBpdGVyLT5jb3VudCArPSAxOworICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qICFET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMgKi8KKworI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLW1lc3NhZ2UtZmFjdG9yeS5oIGIvZGJ1cy9kYnVzL2RidXMtbWVzc2FnZS1mYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA3NDc1MAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLW1lc3NhZ2UtZmFjdG9yeS5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tZXNzYWdlLWZhY3RvcnkuaCBHZW5lcmF0b3Igb2YgdmFsaWQgYW5kIGludmFsaWQgbWVzc2FnZSBkYXRhIGZvciB0ZXN0IHN1aXRlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfTUVTU0FHRV9GQUNUT1JZX0gKKyNkZWZpbmUgREJVU19NRVNTQUdFX0ZBQ1RPUllfSAorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYXJzaGFsLWJhc2ljLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hcnNoYWwtdmFsaWRhdGUuaD4KKworREJVU19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdAoreworICBEQnVzVmFsaWRpdHkgZXhwZWN0ZWRfdmFsaWRpdHk7CisgIAorICBEQnVzU3RyaW5nIGRhdGE7CisKK30gREJ1c01lc3NhZ2VEYXRhOworCisjZGVmaW5lIF9EQlVTX01FU1NBR0VfREFUQV9NQVhfTkVTVElORyAxMAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgaW50IHNlcXVlbmNlX25vc1tfREJVU19NRVNTQUdFX0RBVEFfTUFYX05FU1RJTkddOworICBpbnQgZGVwdGg7CisgIGludCBjb3VudDsKK30gREJ1c01lc3NhZ2VEYXRhSXRlcjsKKwordm9pZCAgICAgICAgX2RidXNfbWVzc2FnZV9kYXRhX2ZyZWUgICAgICAgICAgICAgIChEQnVzTWVzc2FnZURhdGEgICAgICpkYXRhKTsKK3ZvaWQgICAgICAgIF9kYnVzX21lc3NhZ2VfZGF0YV9pdGVyX2luaXQgICAgICAgICAoREJ1c01lc3NhZ2VEYXRhSXRlciAqaXRlcik7CitkYnVzX2Jvb2xfdCBfZGJ1c19tZXNzYWdlX2RhdGFfaXRlcl9nZXRfYW5kX25leHQgKERCdXNNZXNzYWdlRGF0YUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlRGF0YSAgICAgKmRhdGEpOworCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCisKKyNlbmRpZiAvKiBEQlVTX01FU1NBR0VfRkFDVE9SWV9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1tZXNzYWdlLWludGVybmFsLmggYi9kYnVzL2RidXMvZGJ1cy1tZXNzYWdlLWludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE5NDg3MwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLW1lc3NhZ2UtaW50ZXJuYWwuaApAQCAtMCwwICsxLDEwNyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1lc3NhZ2UtaW50ZXJuYWwuaCBEQnVzTWVzc2FnZSBvYmplY3QgaW50ZXJuYWwgaW50ZXJmYWNlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfTUVTU0FHRV9JTlRFUk5BTF9ICisjZGVmaW5lIERCVVNfTUVTU0FHRV9JTlRFUk5BTF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tZXNzYWdlLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXJlc291cmNlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQordm9pZCBfZGJ1c19tZXNzYWdlX3RyYWNlX3JlZiAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgb2xkX3JlZmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIG5ld19yZWZjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICp3aHkpOworI2Vsc2UKKy8qIHRoaXMgYnlwYXNzZXMgYW55ICJ1bnVzZWQiIHdhcm5pbmdzIGZvciB0aGUgb2xkIGFuZCBuZXcgcmVmY291bnQgKi8KKyNkZWZpbmUgX2RidXNfbWVzc2FnZV90cmFjZV9yZWYobSwgbywgbiwgdykgXAorICBkbyBcCisgIHtcCisgICAgKHZvaWQpIChvKTsgXAorICAgICh2b2lkKSAobik7IFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBEQnVzTWVzc2FnZUxvYWRlciBEQnVzTWVzc2FnZUxvYWRlcjsKKwordm9pZCBfZGJ1c19tZXNzYWdlX2dldF9uZXR3b3JrX2RhdGEgIChEQnVzTWVzc2FnZSAgICAgICAqbWVzc2FnZSwKKwkJCQkgICAgICBjb25zdCBEQnVzU3RyaW5nICoqaGVhZGVyLAorCQkJCSAgICAgIGNvbnN0IERCdXNTdHJpbmcgKipib2R5KTsKK3ZvaWQgX2RidXNfbWVzc2FnZV9nZXRfdW5peF9mZHMgICAgICAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqKmZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKm5fZmRzKTsKKwordm9pZCAgICAgICAgX2RidXNfbWVzc2FnZV9sb2NrICAgICAgICAgICAgICAgICAgKERCdXNNZXNzYWdlICAqbWVzc2FnZSk7Cit2b2lkICAgICAgICBfZGJ1c19tZXNzYWdlX3VubG9jayAgICAgICAgICAgICAgICAoREJ1c01lc3NhZ2UgICptZXNzYWdlKTsKK2RidXNfYm9vbF90IF9kYnVzX21lc3NhZ2VfYWRkX2NvdW50ZXIgICAgICAgICAgIChEQnVzTWVzc2FnZSAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NvdW50ZXIgICpjb3VudGVyKTsKK3ZvaWQgICAgICAgIF9kYnVzX21lc3NhZ2VfYWRkX2NvdW50ZXJfbGluayAgICAgIChEQnVzTWVzc2FnZSAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICpsaW5rKTsKK3ZvaWQgICAgICAgIF9kYnVzX21lc3NhZ2VfcmVtb3ZlX2NvdW50ZXIgICAgICAgIChEQnVzTWVzc2FnZSAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NvdW50ZXIgICpjb3VudGVyKTsKKworREJ1c01lc3NhZ2VMb2FkZXIqIF9kYnVzX21lc3NhZ2VfbG9hZGVyX25ldyAgICAgICAgICAgICAgICAgICAodm9pZCk7CitEQnVzTWVzc2FnZUxvYWRlciogX2RidXNfbWVzc2FnZV9sb2FkZXJfcmVmICAgICAgICAgICAgICAgICAgIChEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlcik7Cit2b2lkICAgICAgICAgICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfdW5yZWYgICAgICAgICAgICAgICAgIChEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlcik7CisKK3ZvaWQgICAgICAgICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfYnVmZmVyICAgICAgICAgICAgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgKipidWZmZXIpOwordm9pZCAgICAgICAgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIgICAgICAgICAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgYnl0ZXNfcmVhZCk7CisKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfdW5peF9mZHMgICAgICAgICAgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKipmZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAgICAgICAgICAgKm1heF9uX2Zkcyk7Cit2b2lkICAgICAgICAgICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX3VuaXhfZmRzICAgICAgIChEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAqZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgICAgICAgICAgICBuX2Zkcyk7CisKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9xdWV1ZV9tZXNzYWdlcyAgICAgICAgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyKTsKK0RCdXNNZXNzYWdlKiAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9wZWVrX21lc3NhZ2UgICAgICAgICAgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyKTsKK0RCdXNNZXNzYWdlKiAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9wb3BfbWVzc2FnZSAgICAgICAgICAgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyKTsKK0RCdXNMaXN0KiAgICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9wb3BfbWVzc2FnZV9saW5rICAgICAgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyKTsKK3ZvaWQgICAgICAgICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9wdXRiYWNrX21lc3NhZ2VfbGluayAgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgICAgICpsaW5rKTsKKworZGJ1c19ib29sX3QgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9pc19jb3JydXB0ZWQgICAgICAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIpOworREJ1c1ZhbGlkaXR5ICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9jb3JydXB0aW9uX3JlYXNvbiAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIpOworCit2b2lkICAgICAgICAgICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfc2V0X21heF9tZXNzYWdlX3NpemUgIChEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICAgICAgc2l6ZSk7Citsb25nICAgICAgICAgICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X21heF9tZXNzYWdlX3NpemUgIChEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlcik7CisKK3ZvaWQgICAgICAgICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9zZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICAgICAgbik7Citsb25nICAgICAgICAgICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X21heF9tZXNzYWdlX3VuaXhfZmRzKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyKTsKKwordHlwZWRlZiBzdHJ1Y3QgREJ1c0luaXRpYWxGRHMgREJ1c0luaXRpYWxGRHM7CitEQnVzSW5pdGlhbEZEcyAqX2RidXNfY2hlY2tfZmRsZWFrc19lbnRlciAodm9pZCk7Cit2b2lkICAgICAgICAgICAgX2RidXNfY2hlY2tfZmRsZWFrc19sZWF2ZSAoREJ1c0luaXRpYWxGRHMgKmZkcyk7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX01FU1NBR0VfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtbWVzc2FnZS1wcml2YXRlLmggYi9kYnVzL2RidXMvZGJ1cy1tZXNzYWdlLXByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTU3OGFiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtbWVzc2FnZS1wcml2YXRlLmgKQEAgLTAsMCArMSwxNDMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tZXNzYWdlLXByaXZhdGUuaCBoZWFkZXIgc2hhcmVkIGJldHdlZW4gZGJ1cy1tZXNzYWdlLmMgYW5kIGRidXMtbWVzc2FnZS11dGlsLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX01FU1NBR0VfUFJJVkFURV9ICisjZGVmaW5lIERCVVNfTUVTU0FHRV9QUklWQVRFX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tZXNzYWdlLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1lc3NhZ2UtaW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWRhdGFzbG90Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hcnNoYWwtaGVhZGVyLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzTWVzc2FnZUludGVybmFscworICogQHsKKyAqLworCisvKioKKyAqIEB0eXBlZGVmIERCdXNNZXNzYWdlTG9hZGVyCisgKgorICogVGhlIERCdXNNZXNzYWdlTG9hZGVyIG9iamVjdCBlbmNhcHN1bGF0ZXMgdGhlIHByb2Nlc3Mgb2YgY29udmVydGluZworICogYSBieXRlIHN0cmVhbSBpbnRvIGEgc2VyaWVzIG9mIERCdXNNZXNzYWdlLiBJdCBidWZmZXJzIHRoZSBpbmNvbWluZworICogYnl0ZXMgYXMgZWZmaWNpZW50bHkgYXMgcG9zc2libGUsIGFuZCBnZW5lcmF0ZXMgYSBxdWV1ZSBvZgorICogbWVzc2FnZXMuIERCdXNNZXNzYWdlTG9hZGVyIGlzIHR5cGljYWxseSB1c2VkIGFzIHBhcnQgb2YgYQorICogREJ1c1RyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbi4gVGhlIERCdXNUcmFuc3BvcnQgdGhlbiBoYW5kcyBvZmYKKyAqIHRoZSBsb2FkZWQgbWVzc2FnZXMgdG8gYSBEQnVzQ29ubmVjdGlvbiwgbWFraW5nIHRoZSBtZXNzYWdlcworICogdmlzaWJsZSB0byB0aGUgYXBwbGljYXRpb24uCisgKgorICogQHRvZG8gd3JpdGUgdGVzdHMgZm9yIGJyZWFrLWxvYWRlciB0aGF0IGEpIHJhbmRvbWx5IGRlbGV0ZSBoZWFkZXIKKyAqIGZpZWxkcyBhbmQgYikgc2V0IHN0cmluZyBmaWVsZHMgdG8gemVyby1sZW5ndGggYW5kIG90aGVyIGZ1bmt5CisgKiB2YWx1ZXMuCisgKgorICovCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBEQnVzTWVzc2FnZUxvYWRlci4KKyAqIEFsbCBtZW1iZXJzIGFyZSBwcml2YXRlLgorICovCitzdHJ1Y3QgREJ1c01lc3NhZ2VMb2FkZXIKK3sKKyAgaW50IHJlZmNvdW50OyAgICAgICAgLyoqPCBSZWZlcmVuY2UgY291bnQuICovCisKKyAgREJ1c1N0cmluZyBkYXRhOyAgICAgLyoqPCBCdWZmZXJlZCBkYXRhICovCisKKyAgREJ1c0xpc3QgKm1lc3NhZ2VzOyAgLyoqPCBDb21wbGV0ZSBtZXNzYWdlcy4gKi8KKworICBsb25nIG1heF9tZXNzYWdlX3NpemU7IC8qKjwgTWF4aW11bSBzaXplIG9mIGEgbWVzc2FnZSAqLworICBsb25nIG1heF9tZXNzYWdlX3VuaXhfZmRzOyAvKio8IE1heGltdW0gdW5peCBmZHMgaW4gYSBtZXNzYWdlICovCisKKyAgREJ1c1ZhbGlkaXR5IGNvcnJ1cHRpb25fcmVhc29uOyAvKio8IHdoeSB3ZSB3ZXJlIGNvcnJ1cHRlZCAqLworCisgIHVuc2lnbmVkIGludCBjb3JydXB0ZWQgOiAxOyAvKio8IFdlIGdvdCBicm9rZW4gZGF0YSwgYW5kIGFyZSBubyBsb25nZXIgd29ya2luZyAqLworCisgIHVuc2lnbmVkIGludCBidWZmZXJfb3V0c3RhbmRpbmcgOiAxOyAvKio8IFNvbWVvbmUgaXMgdXNpbmcgdGhlIGJ1ZmZlciB0byByZWFkICovCisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICB1bnNpZ25lZCBpbnQgdW5peF9mZHNfb3V0c3RhbmRpbmcgOiAxOyAvKio8IFNvbWVvbmUgaXMgdXNpbmcgdGhlIHVuaXggZmQgYXJyYXkgdG8gcmVhZCAqLworCisgIGludCAqdW5peF9mZHM7IC8qKjwgRmlsZSBkZXNjcmlwdG9ycyB0aGF0IGhhdmUgYmVlbiByZWFkIGZyb20gdGhlIHRyYW5zcG9ydCBidXQgbm90IHlldCBiZWVuIGhhbmRlZCB0byBhbnkgbWVzc2FnZS4gQXJyYXkgd2lsbCBiZSBhbGxvY2F0ZWQgYXQgZmlyc3QgdXNlLiAqLworICB1bnNpZ25lZCBuX3VuaXhfZmRzX2FsbG9jYXRlZDsgLyoqPCBOdW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyB0aGlzIGFycmF5IGhhcyBzcGFjZSBmb3IgKi8KKyAgdW5zaWduZWQgbl91bml4X2ZkczsgLyoqPCBOdW1iZXIgb2YgdmFsaWQgZmlsZSBkZXNjcmlwdG9ycyBpbiBhcnJheSAqLworI2VuZGlmCit9OworCisKKy8qKiBIb3cgbWFueSBiaXRzIGFyZSBpbiB0aGUgY2hhbmdlZF9zdGFtcCB1c2VkIHRvIHZhbGlkYXRlIGl0ZXJhdG9ycyAqLworI2RlZmluZSBDSEFOR0VEX1NUQU1QX0JJVFMgMjEKKworLyoqCisgKiBAYnJpZWYgSW50ZXJuYWxzIG9mIERCdXNNZXNzYWdlCisgKgorICogT2JqZWN0IHJlcHJlc2VudGluZyBhIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBvciB0byBiZSBzZW50IHRvCisgKiBhbm90aGVyIGFwcGxpY2F0aW9uLiBUaGlzIGlzIGFuIG9wYXF1ZSBvYmplY3QsIGFsbCBtZW1iZXJzCisgKiBhcmUgcHJpdmF0ZS4KKyAqLworc3RydWN0IERCdXNNZXNzYWdlCit7CisgIERCdXNBdG9taWMgcmVmY291bnQ7IC8qKjwgUmVmZXJlbmNlIGNvdW50ICovCisKKyAgREJ1c0hlYWRlciBoZWFkZXI7IC8qKjwgSGVhZGVyIG5ldHdvcmsgZGF0YSBhbmQgYXNzb2NpYXRlZCBjYWNoZSAqLworCisgIERCdXNTdHJpbmcgYm9keTsgICAvKio8IEJvZHkgbmV0d29yayBkYXRhLiAqLworCisgIHVuc2lnbmVkIGludCBsb2NrZWQgOiAxOyAvKio8IE1lc3NhZ2UgYmVpbmcgc2VudCwgbm8gbW9kaWZpY2F0aW9ucyBhbGxvd2VkLiAqLworCisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgdW5zaWduZWQgaW50IGluX2NhY2hlIDogMTsgLyoqPCBIYXMgYmVlbiAiZnJlZWQiIHNpbmNlIGl0J3MgaW4gdGhlIGNhY2hlICh0aGlzIGlzIGEgZGVidWcgZmVhdHVyZSkgKi8KKyNlbmRpZgorCisgIERCdXNMaXN0ICpjb3VudGVyczsgICAvKio8IDAtTiBEQnVzQ291bnRlciB1c2VkIHRvIHRyYWNrIG1lc3NhZ2Ugc2l6ZS91bml4IGZkcy4gKi8KKyAgbG9uZyBzaXplX2NvdW50ZXJfZGVsdGE7ICAgLyoqPCBTaXplIHdlIGluY3JlbWVudGVkIHRoZSBzaXplIGNvdW50ZXJzIGJ5LiAgICovCisKKyAgZGJ1c191aW50MzJfdCBjaGFuZ2VkX3N0YW1wIDogQ0hBTkdFRF9TVEFNUF9CSVRTOyAvKio8IEluY3JlbWVudGVkIHdoZW4gaXRlcmF0b3JzIGFyZSBpbnZhbGlkYXRlZC4gKi8KKworICBEQnVzRGF0YVNsb3RMaXN0IHNsb3RfbGlzdDsgICAvKio8IERhdGEgc3RvcmVkIGJ5IGFsbG9jYXRlZCBpbnRlZ2VyIElEICovCisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICBpbnQgZ2VuZXJhdGlvbjsgLyoqPCBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24gd2hlbiBtZXNzYWdlIHdhcyBjcmVhdGVkICovCisjZW5kaWYKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIGludCAqdW5peF9mZHM7CisgIC8qKjwgVW5peCBmaWxlIGRlc2NyaXB0b3JzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1lc3NhZ2UuIFRoZXNlIGFyZQorICAgICBjbG9zZWQgd2hlbiB0aGUgbWVzc2FnZSBpcyBkZXN0cm95ZWQsIGhlbmNlIG1ha2Ugc3VyZSB0byBkdXAoKQorICAgICB0aGVtIHdoZW4gYWRkaW5nIG9yIHJlbW92aW5nIHRoZW0gaGVyZS4gKi8KKyAgdW5zaWduZWQgbl91bml4X2ZkczsgLyoqPCBOdW1iZXIgb2YgdmFsaWQgZmRzIGluIHRoZSBhcnJheSAqLworICB1bnNpZ25lZCBuX3VuaXhfZmRzX2FsbG9jYXRlZDsgLyoqPCBBbGxvY2F0ZWQgc2l6ZSBvZiB0aGUgYXJyYXkgKi8KKworICBsb25nIHVuaXhfZmRfY291bnRlcl9kZWx0YTsgLyoqPCBTaXplIHdlIGluY3JlbWVudGVkIHRoZSB1bml4IGZkIGNvdW50ZXIgYnkgKi8KKyNlbmRpZgorfTsKKworZGJ1c19ib29sX3QgX2RidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdzX3ZhbGlzdCAoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgZmlyc3RfYXJnX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0ICAgICAgICAgIHZhcl9hcmdzKTsKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX01FU1NBR0VfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtbWVzc2FnZS11dGlsLmMgYi9kYnVzL2RidXMvZGJ1cy1tZXNzYWdlLXV0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzg1OTUyCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtbWVzc2FnZS11dGlsLmMKQEAgLTAsMCArMSwxNTQ1IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWVzc2FnZS11dGlsLmMgV291bGQgYmUgaW4gZGJ1cy1tZXNzYWdlLmMsIGJ1dCBvbmx5IHVzZWQgYnkgYnVzL3Rlc3RzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1ICBSZWQgSGF0IEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgImRidXMtbWVzc2FnZS1wcml2YXRlLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMtdW5peC5oIgorI2VuZGlmCisKKyNpZmRlZiBfX2xpbnV4X18KKy8qIE5lY2Vzc2FyeSBmb3IgdGhlIExpbnV4LXNwZWNpZmljIGZkIGxlYWsgY2hlY2tpbmcgY29kZSBvbmx5ICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNNZXNzYWdlCisgKiBAeworICovCisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisvKioKKyAqIFJlYWRzIGFyZ3VtZW50cyBmcm9tIGEgbWVzc2FnZSBpdGVyYXRvciBnaXZlbiBhIHZhcmlhYmxlIGFyZ3VtZW50CisgKiBsaXN0LiBPbmx5IGFyZ3VtZW50cyBvZiBiYXNpYyB0eXBlIGFuZCBhcnJheXMgb2YgZml4ZWQtbGVuZ3RoCisgKiBiYXNpYyB0eXBlIG1heSBiZSByZWFkIHdpdGggdGhpcyBmdW5jdGlvbi4gU2VlCisgKiBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MoKSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBtZXNzYWdlIGl0ZXJhdG9yCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgdG8gYmUgZmlsbGVkIGluIG9uIGZhaWx1cmUKKyAqIEBwYXJhbSBmaXJzdF9hcmdfdHlwZSB0aGUgZmlyc3QgYXJndW1lbnQgdHlwZQorICogQHBhcmFtIC4uLiBsb2NhdGlvbiBmb3IgZmlyc3QgYXJndW1lbnQgdmFsdWUsIHRoZW4gbGlzdCBvZiB0eXBlLWxvY2F0aW9uIHBhaXJzCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlIGVycm9yIHdhcyBzZXQKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJncyAoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorCQkJICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IsCisJCQkgICAgaW50ICAgICAgICAgICAgICBmaXJzdF9hcmdfdHlwZSwKKwkJCSAgICAuLi4pCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgdmFfbGlzdCB2YXJfYXJnczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGl0ZXIgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2Vycm9yX2lzX3NldCAoZXJyb3IsIEZBTFNFKTsKKworICB2YV9zdGFydCAodmFyX2FyZ3MsIGZpcnN0X2FyZ190eXBlKTsKKyAgcmV0dmFsID0gX2RidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdzX3ZhbGlzdCAoaXRlciwgZXJyb3IsIGZpcnN0X2FyZ190eXBlLCB2YXJfYXJncyk7CisgIHZhX2VuZCAodmFyX2FyZ3MpOworCisgIHJldHVybiByZXR2YWw7Cit9CisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLworCisvKiogQH0gKi8KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKyNpbmNsdWRlICJkYnVzLW1lc3NhZ2UtZmFjdG9yeS5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3N0YXRpYyBpbnQgdmFsaWRpdGllc19zZWVuW0RCVVNfVkFMSURJVFlfTEFTVCArIF9EQlVTX05FR0FUSVZFX1ZBTElESVRZX0NPVU5UXTsKKworc3RhdGljIHZvaWQKK3Jlc2V0X3ZhbGlkaXRpZXNfc2VlbiAodm9pZCkKK3sKKyAgaW50IGk7CisgIGkgPSAwOworICB3aGlsZSAoaSA8IF9EQlVTX05fRUxFTUVOVFMgKHZhbGlkaXRpZXNfc2VlbikpCisgICAgeworICAgICAgdmFsaWRpdGllc19zZWVuW2ldID0gMDsKKyAgICAgICsraTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCityZWNvcmRfdmFsaWRpdHlfc2VlbiAoREJ1c1ZhbGlkaXR5IHZhbGlkaXR5KQoreworICB2YWxpZGl0aWVzX3NlZW5bdmFsaWRpdHkgKyBfREJVU19ORUdBVElWRV9WQUxJRElUWV9DT1VOVF0gKz0gMTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X3ZhbGlkaXRpZXNfc2VlbiAoZGJ1c19ib29sX3Qgbm90X3NlZW4pCit7CisgIGludCBpOworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBfREJVU19OX0VMRU1FTlRTICh2YWxpZGl0aWVzX3NlZW4pKQorICAgIHsKKyAgICAgIGlmICgoaSAtIF9EQlVTX05FR0FUSVZFX1ZBTElESVRZX0NPVU5UKSA9PSBEQlVTX1ZBTElESVRZX1VOS05PV04gfHwKKyAgICAgICAgICAoaSAtIF9EQlVTX05FR0FUSVZFX1ZBTElESVRZX0NPVU5UKSA9PSBEQlVTX0lOVkFMSURfRk9SX1VOS05PV05fUkVBU09OKQorICAgICAgICA7CisgICAgICBlbHNlIGlmICgobm90X3NlZW4gJiYgdmFsaWRpdGllc19zZWVuW2ldID09IDApIHx8CisgICAgICAgICAgICAgICAoIW5vdF9zZWVuICYmIHZhbGlkaXRpZXNfc2VlbltpXSA+IDApKQorICAgICAgICBwcmludGYgKCJ2YWxpZGl0eSAlM2Qgc2VlbiAlZCB0aW1lc1xuIiwKKyAgICAgICAgICAgICAgICBpIC0gX0RCVVNfTkVHQVRJVkVfVkFMSURJVFlfQ09VTlQsCisgICAgICAgICAgICAgICAgdmFsaWRpdGllc19zZWVuW2ldKTsKKyAgICAgICsraTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19tZW1sZWFrcyAodm9pZCkKK3sKKyAgZGJ1c19zaHV0ZG93biAoKTsKKworICBpZiAoX2RidXNfZ2V0X21hbGxvY19ibG9ja3Nfb3V0c3RhbmRpbmcgKCkgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiJWQgZGJ1c19tYWxsb2MgYmxvY2tzIHdlcmUgbm90IGZyZWVkIGluICVzXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfZ2V0X21hbGxvY19ibG9ja3Nfb3V0c3RhbmRpbmcgKCksIF9fRklMRV9fKTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm1lbWxlYWtzIik7CisgICAgfQorfQorCisjaWZkZWYgX19saW51eF9fCitzdHJ1Y3QgREJ1c0luaXRpYWxGRHMgeworICAgIGZkX3NldCBzZXQ7Cit9OworI2VuZGlmCisKK0RCdXNJbml0aWFsRkRzICoKK19kYnVzX2NoZWNrX2ZkbGVha3NfZW50ZXIgKHZvaWQpCit7CisjaWZkZWYgX19saW51eF9fCisgIERJUiAqZDsKKyAgREJ1c0luaXRpYWxGRHMgKmZkczsKKworICAvKiB0aGlzIGlzIHBsYWluIG1hbGxvYyBzbyBpdCB3b24ndCBpbnRlcmZlcmUgd2l0aCBsZWFrIGNoZWNraW5nICovCisgIGZkcyA9IG1hbGxvYyAoc2l6ZW9mIChEQnVzSW5pdGlhbEZEcykpOworICBfZGJ1c19hc3NlcnQgKGZkcyAhPSBOVUxMKTsKKworICAvKiBUaGlzIHdvcmtzIG9uIExpbnV4IG9ubHkgKi8KKworICBpZiAoKGQgPSBvcGVuZGlyICgiL3Byb2Mvc2VsZi9mZCIpKSkKKyAgICB7CisgICAgICBzdHJ1Y3QgZGlyZW50ICpkZTsKKworICAgICAgd2hpbGUgKChkZSA9IHJlYWRkaXIoZCkpKQorICAgICAgICB7CisgICAgICAgICAgbG9uZyBsOworICAgICAgICAgIGNoYXIgKmUgPSBOVUxMOworICAgICAgICAgIGludCBmZDsKKworICAgICAgICAgIGlmIChkZS0+ZF9uYW1lWzBdID09ICcuJykKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgIGwgPSBzdHJ0b2wgKGRlLT5kX25hbWUsICZlLCAxMCk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0IChlcnJubyA9PSAwICYmIGUgJiYgISplKTsKKworICAgICAgICAgIGZkID0gKGludCkgbDsKKworICAgICAgICAgIGlmIChmZCA8IDMpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIGlmIChmZCA9PSBkaXJmZCAoZCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIEZEX1NFVCAoZmQsICZmZHMtPnNldCk7CisgICAgICAgIH0KKworICAgICAgY2xvc2VkaXIgKGQpOworICAgIH0KKworICByZXR1cm4gZmRzOworI2Vsc2UKKyAgcmV0dXJuIE5VTEw7CisjZW5kaWYKK30KKwordm9pZAorX2RidXNfY2hlY2tfZmRsZWFrc19sZWF2ZSAoREJ1c0luaXRpYWxGRHMgKmZkcykKK3sKKyNpZmRlZiBfX2xpbnV4X18KKyAgRElSICpkOworCisgIC8qIFRoaXMgd29ya3Mgb24gTGludXggb25seSAqLworCisgIGlmICgoZCA9IG9wZW5kaXIgKCIvcHJvYy9zZWxmL2ZkIikpKQorICAgIHsKKyAgICAgIHN0cnVjdCBkaXJlbnQgKmRlOworCisgICAgICB3aGlsZSAoKGRlID0gcmVhZGRpcihkKSkpCisgICAgICAgIHsKKyAgICAgICAgICBsb25nIGw7CisgICAgICAgICAgY2hhciAqZSA9IE5VTEw7CisgICAgICAgICAgaW50IGZkOworCisgICAgICAgICAgaWYgKGRlLT5kX25hbWVbMF0gPT0gJy4nKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBlcnJubyA9IDA7CisgICAgICAgICAgbCA9IHN0cnRvbCAoZGUtPmRfbmFtZSwgJmUsIDEwKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKGVycm5vID09IDAgJiYgZSAmJiAhKmUpOworCisgICAgICAgICAgZmQgPSAoaW50KSBsOworCisgICAgICAgICAgaWYgKGZkIDwgMykKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgaWYgKGZkID09IGRpcmZkIChkKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgaWYgKEZEX0lTU0VUIChmZCwgJmZkcy0+c2V0KSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgX2RidXNfd2FybiAoImZpbGUgZGVzY3JpcHRvciAlaSBsZWFrZWQgaW4gJXMuXG4iLCBmZCwgX19GSUxFX18pOworICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZkbGVha3MiKTsKKyAgICAgICAgfQorCisgICAgICBjbG9zZWRpciAoZCk7CisgICAgfQorCisgIGZyZWUgKGZkcyk7CisjZWxzZQorICBfZGJ1c19hc3NlcnQgKGZkcyA9PSBOVUxMKTsKKyNlbmRpZgorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2hhdmVfdmFsaWRfbWVzc2FnZSAoREJ1c01lc3NhZ2VMb2FkZXIgKmxvYWRlcikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBtZXNzYWdlID0gTlVMTDsKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgaWYgKF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9pc19jb3JydXB0ZWQgKGxvYWRlcikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImxvYWRlciBjb3JydXB0ZWQgb24gbWVzc2FnZSB0aGF0IHdhcyBleHBlY3RlZCB0byBiZSB2YWxpZDsgaW52YWxpZCByZWFzb24gJWRcbiIsCisgICAgICAgICAgICAgICAgICBsb2FkZXItPmNvcnJ1cHRpb25fcmVhc29uKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBtZXNzYWdlID0gX2RidXNfbWVzc2FnZV9sb2FkZXJfcG9wX21lc3NhZ2UgKGxvYWRlcik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImRpZG4ndCBsb2FkIG1lc3NhZ2UgdGhhdCB3YXMgZXhwZWN0ZWQgdG8gYmUgdmFsaWQgKG1lc3NhZ2Ugbm90IHBvcHBlZClcbiIpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmxvYWRlci0+ZGF0YSkgPiAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJoYWQgbGVmdG92ZXIgYnl0ZXMgZnJvbSBleHBlY3RlZC10by1iZS12YWxpZCBzaW5nbGUgbWVzc2FnZVxuIik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyNpZiAwCisgIC8qIEZJWE1FICovCisgIC8qIFZlcmlmeSB0aGF0IHdlJ3JlIGFibGUgdG8gcHJvcGVybHkgZGVhbCB3aXRoIHRoZSBtZXNzYWdlLgorICAgKiBGb3IgZXhhbXBsZSwgdGhpcyB3b3VsZCBkZXRlY3QgaW1wcm9wZXIgaGFuZGxpbmcgb2YgbWVzc2FnZXMKKyAgICogaW4gbm9uc3RhbmRhcmQgYnl0ZSBvcmRlci4KKyAgICovCisgIGlmICghY2hlY2tfbWVzc2FnZV9oYW5kbGluZyAobWVzc2FnZSkpCisgICAgZ290byBmYWlsZWQ7CisjZW5kaWYKKworICByZWNvcmRfdmFsaWRpdHlfc2VlbiAoREJVU19WQUxJRCk7CisgIAorICByZXR2YWwgPSBUUlVFOworCisgZmFpbGVkOgorICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfaW52YWxpZF9tZXNzYWdlIChEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgZXhwZWN0ZWRfdmFsaWRpdHkpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBpZiAoIV9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9pc19jb3JydXB0ZWQgKGxvYWRlcikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImxvYWRlciBub3QgY29ycnVwdGVkIG9uIG1lc3NhZ2UgdGhhdCB3YXMgZXhwZWN0ZWQgdG8gYmUgaW52YWxpZFxuIik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgcmVjb3JkX3ZhbGlkaXR5X3NlZW4gKGxvYWRlci0+Y29ycnVwdGlvbl9yZWFzb24pOworICAKKyAgaWYgKGV4cGVjdGVkX3ZhbGlkaXR5ICE9IERCVVNfSU5WQUxJRF9GT1JfVU5LTk9XTl9SRUFTT04gJiYKKyAgICAgIGxvYWRlci0+Y29ycnVwdGlvbl9yZWFzb24gIT0gZXhwZWN0ZWRfdmFsaWRpdHkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImV4cGVjdGVkIG1lc3NhZ2UgdG8gYmUgY29ycnVwdGVkIGZvciByZWFzb24gJWQgYW5kIHdhcyBjb3JydXB0ZWQgZm9yICVkIGluc3RlYWRcbiIsCisgICAgICAgICAgICAgICAgICBleHBlY3RlZF92YWxpZGl0eSwgbG9hZGVyLT5jb3JydXB0aW9uX3JlYXNvbik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIGZhaWxlZDoKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19pbmNvbXBsZXRlX21lc3NhZ2UgKERCdXNNZXNzYWdlTG9hZGVyICpsb2FkZXIpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgbWVzc2FnZSA9IE5VTEw7CisgIHJldHZhbCA9IEZBTFNFOworCisgIGlmIChfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfaXNfY29ycnVwdGVkIChsb2FkZXIpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJsb2FkZXIgY29ycnVwdGVkIG9uIG1lc3NhZ2UgdGhhdCB3YXMgZXhwZWN0ZWQgdG8gYmUgdmFsaWQgKGJ1dCBpbmNvbXBsZXRlKSwgY29ycnVwdGlvbiByZWFzb24gJWRcbiIsCisgICAgICAgICAgICAgICAgICBsb2FkZXItPmNvcnJ1cHRpb25fcmVhc29uKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBtZXNzYWdlID0gX2RidXNfbWVzc2FnZV9sb2FkZXJfcG9wX21lc3NhZ2UgKGxvYWRlcik7CisgIGlmIChtZXNzYWdlICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImxvYWRlZCBtZXNzYWdlIHRoYXQgd2FzIGV4cGVjdGVkIHRvIGJlIGluY29tcGxldGVcbiIpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIHJlY29yZF92YWxpZGl0eV9zZWVuIChEQlVTX1ZBTElEX0JVVF9JTkNPTVBMRVRFKTsKKyAgcmV0dmFsID0gVFJVRTsKKworIGZhaWxlZDoKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19sb2FkZXJfcmVzdWx0cyAoREJ1c01lc3NhZ2VMb2FkZXIgICAgICAqbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICAgICAgIGV4cGVjdGVkX3ZhbGlkaXR5KQoreworICBpZiAoIV9kYnVzX21lc3NhZ2VfbG9hZGVyX3F1ZXVlX21lc3NhZ2VzIChsb2FkZXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSB0byBxdWV1ZSBtZXNzYWdlcyIpOworCisgIGlmIChleHBlY3RlZF92YWxpZGl0eSA9PSBEQlVTX1ZBTElEKQorICAgIHJldHVybiBjaGVja19oYXZlX3ZhbGlkX21lc3NhZ2UgKGxvYWRlcik7CisgIGVsc2UgaWYgKGV4cGVjdGVkX3ZhbGlkaXR5ID09IERCVVNfVkFMSURfQlVUX0lOQ09NUExFVEUpCisgICAgcmV0dXJuIGNoZWNrX2luY29tcGxldGVfbWVzc2FnZSAobG9hZGVyKTsKKyAgZWxzZSBpZiAoZXhwZWN0ZWRfdmFsaWRpdHkgPT0gREJVU19WQUxJRElUWV9VTktOT1dOKQorICAgIHsKKyAgICAgIC8qIGhlcmUgd2UganVzdCBrbm93IHdlIGRpZG4ndCBzZWdmYXVsdCBhbmQgdGhhdCB3YXMgdGhlCisgICAgICAgKiBvbmx5IHRlc3QuIEFsc28sIHdlIHJlY29yZCB0aGF0IHdlIGdvdCBjb3ZlcmFnZQorICAgICAgICogZm9yIHRoZSB2YWxpZGl0eSByZWFzb24uCisgICAgICAgKi8KKyAgICAgIGlmIChfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfaXNfY29ycnVwdGVkIChsb2FkZXIpKQorICAgICAgICByZWNvcmRfdmFsaWRpdHlfc2VlbiAobG9hZGVyLT5jb3JydXB0aW9uX3JlYXNvbik7CisgICAgICAKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBjaGVja19pbnZhbGlkX21lc3NhZ2UgKGxvYWRlciwgZXhwZWN0ZWRfdmFsaWRpdHkpOworfQorCisvKioKKyAqIExvYWRzIHRoZSBtZXNzYWdlIGluIHRoZSBnaXZlbiBtZXNzYWdlIGZpbGUuCisgKgorICogQHBhcmFtIGZpbGVuYW1lIGZpbGVuYW1lIHRvIGxvYWQKKyAqIEBwYXJhbSBkYXRhIHN0cmluZyB0byBsb2FkIG1lc3NhZ2UgaW50bworICogQHJldHVybnMgI1RSVUUgaWYgdGhlIG1lc3NhZ2Ugd2FzIGxvYWRlZAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX2xvYWRfbWVzc2FnZV9maWxlIChjb25zdCBEQnVzU3RyaW5nICAgICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAqZGF0YSkKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgX2RidXNfdmVyYm9zZSAoIkxvYWRpbmcgcmF3ICVzXG4iLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKSk7CisgIGlmICghX2RidXNfZmlsZV9nZXRfY29udGVudHMgKGRhdGEsIGZpbGVuYW1lLCAmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJDb3VsZCBub3QgbG9hZCBtZXNzYWdlIGZpbGUgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSksCisgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgZmFpbGVkOgorCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogVHJpZXMgbG9hZGluZyB0aGUgbWVzc2FnZSBpbiB0aGUgZ2l2ZW4gbWVzc2FnZSBmaWxlCisgKiBhbmQgdmVyaWZpZXMgdGhhdCBEQnVzTWVzc2FnZUxvYWRlciBjYW4gaGFuZGxlIGl0LgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSBmaWxlbmFtZSB0byBsb2FkCisgKiBAcGFyYW0gZXhwZWN0ZWRfdmFsaWRpdHkgd2hhdCB0aGUgbWVzc2FnZSBoYXMgdG8gYmUgbGlrZSB0byByZXR1cm4gI1RSVUUKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBtZXNzYWdlIGhhcyB0aGUgZXhwZWN0ZWQgdmFsaWRpdHkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfaW50ZXJuYWxfZG9fbm90X3VzZV90cnlfbWVzc2FnZV9maWxlIChjb25zdCBEQnVzU3RyaW5nICAgICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgICBleHBlY3RlZF92YWxpZGl0eSkKK3sKKyAgREJ1c1N0cmluZyBkYXRhOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmRhdGEpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhbGxvY2F0ZSBzdHJpbmdcbiIpOworCisgIGlmICghZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX2xvYWRfbWVzc2FnZV9maWxlIChmaWxlbmFtZSwgJmRhdGEpKQorICAgIGdvdG8gZmFpbGVkOworCisgIHJldHZhbCA9IGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV90cnlfbWVzc2FnZV9kYXRhICgmZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHkpOworCisgZmFpbGVkOgorCisgIGlmICghcmV0dmFsKQorICAgIHsKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmRhdGEpID4gMCkKKyAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZkYXRhLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZkYXRhKSk7CisKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgbWVzc2FnZSBsb2FkZXIgdGVzdCBvbiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpKTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkYXRhKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFRyaWVzIGxvYWRpbmcgdGhlIGdpdmVuIG1lc3NhZ2UgZGF0YS4KKyAqCisgKgorICogQHBhcmFtIGRhdGEgdGhlIG1lc3NhZ2UgZGF0YQorICogQHBhcmFtIGV4cGVjdGVkX3ZhbGlkaXR5IHdoYXQgdGhlIG1lc3NhZ2UgaGFzIHRvIGJlIGxpa2UgdG8gcmV0dXJuICNUUlVFCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgbWVzc2FnZSBoYXMgdGhlIGV4cGVjdGVkIHZhbGlkaXR5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX2ludGVybmFsX2RvX25vdF91c2VfdHJ5X21lc3NhZ2VfZGF0YSAoY29uc3QgREJ1c1N0cmluZyAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgICBleHBlY3RlZF92YWxpZGl0eSkKK3sKKyAgREJ1c01lc3NhZ2VMb2FkZXIgKmxvYWRlcjsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBpbnQgbGVuOworICBpbnQgaTsKKworICBsb2FkZXIgPSBOVUxMOworICByZXR2YWwgPSBGQUxTRTsKKworICAvKiBXcml0ZSB0aGUgZGF0YSBvbmUgYnl0ZSBhdCBhIHRpbWUgKi8KKworICBsb2FkZXIgPSBfZGJ1c19tZXNzYWdlX2xvYWRlcl9uZXcgKCk7CisKKyAgLyogY2hlY2sgc29tZSB0cml2aWFsIGxvYWRlciBmdW5jdGlvbnMgKi8KKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcmVmIChsb2FkZXIpOworICBfZGJ1c19tZXNzYWdlX2xvYWRlcl91bnJlZiAobG9hZGVyKTsKKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X21heF9tZXNzYWdlX3NpemUgKGxvYWRlcik7CisKKyAgbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgeworICAgICAgREJ1c1N0cmluZyAqYnVmZmVyOworCisgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfYnVmZmVyIChsb2FkZXIsICZidWZmZXIpOworICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZGF0YSwgaSkpOworICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX2J1ZmZlciAobG9hZGVyLCBidWZmZXIsIDEpOworICAgIH0KKworICBpZiAoIWNoZWNrX2xvYWRlcl9yZXN1bHRzIChsb2FkZXIsIGV4cGVjdGVkX3ZhbGlkaXR5KSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBfZGJ1c19tZXNzYWdlX2xvYWRlcl91bnJlZiAobG9hZGVyKTsKKyAgbG9hZGVyID0gTlVMTDsKKworICAvKiBXcml0ZSB0aGUgZGF0YSBhbGwgYXQgb25jZSAqLworCisgIGxvYWRlciA9IF9kYnVzX21lc3NhZ2VfbG9hZGVyX25ldyAoKTsKKworICB7CisgICAgREJ1c1N0cmluZyAqYnVmZmVyOworCisgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X2J1ZmZlciAobG9hZGVyLCAmYnVmZmVyKTsKKyAgICBfZGJ1c19zdHJpbmdfY29weSAoZGF0YSwgMCwgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYnVmZmVyKSk7CisgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX2J1ZmZlciAobG9hZGVyLCBidWZmZXIsIDEpOworICB9CisKKyAgaWYgKCFjaGVja19sb2FkZXJfcmVzdWx0cyAobG9hZGVyLCBleHBlY3RlZF92YWxpZGl0eSkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfdW5yZWYgKGxvYWRlcik7CisgIGxvYWRlciA9IE5VTEw7CisKKyAgLyogV3JpdGUgdGhlIGRhdGEgMiBieXRlcyBhdCBhIHRpbWUgKi8KKworICBsb2FkZXIgPSBfZGJ1c19tZXNzYWdlX2xvYWRlcl9uZXcgKCk7CisKKyAgbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpCisgICAgeworICAgICAgREJ1c1N0cmluZyAqYnVmZmVyOworCisgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfYnVmZmVyIChsb2FkZXIsICZidWZmZXIpOworICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZGF0YSwgaSkpOworICAgICAgaWYgKChpKzEpIDwgbGVuKQorICAgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGRhdGEsIGkrMSkpOworICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX2J1ZmZlciAobG9hZGVyLCBidWZmZXIsIDEpOworICAgIH0KKworICBpZiAoIWNoZWNrX2xvYWRlcl9yZXN1bHRzIChsb2FkZXIsIGV4cGVjdGVkX3ZhbGlkaXR5KSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBfZGJ1c19tZXNzYWdlX2xvYWRlcl91bnJlZiAobG9hZGVyKTsKKyAgbG9hZGVyID0gTlVMTDsKKworICByZXR2YWwgPSBUUlVFOworCisgZmFpbGVkOgorCisgIGlmIChsb2FkZXIpCisgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfdW5yZWYgKGxvYWRlcik7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citwcm9jZXNzX3Rlc3Rfc3ViZGlyIChjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICp0ZXN0X2Jhc2VfZGlyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAqc3ViZGlyLAorICAgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICAgICAgICAgICAgICAgZXhwZWN0ZWRfdmFsaWRpdHksCisgICAgICAgICAgICAgICAgICAgICBEQnVzRm9yZWFjaE1lc3NhZ2VGaWxlRnVuYyBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgREJ1c1N0cmluZyB0ZXN0X2RpcmVjdG9yeTsKKyAgREJ1c1N0cmluZyBmaWxlbmFtZTsKKyAgREJ1c0Rpckl0ZXIgKmRpcjsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgcmV0dmFsID0gRkFMU0U7CisgIGRpciA9IE5VTEw7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnRlc3RfZGlyZWN0b3J5KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgYWxsb2NhdGUgdGVzdF9kaXJlY3RvcnlcbiIpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZW5hbWUsIHN1YmRpcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAodGVzdF9iYXNlX2RpciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RfZGlyZWN0b3J5LCAwKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBjb3B5IHRlc3RfYmFzZV9kaXIgdG8gdGVzdF9kaXJlY3RvcnkiKTsKKworICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZ0ZXN0X2RpcmVjdG9yeSwgJmZpbGVuYW1lKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBhbGxvY2F0ZSBmdWxsIHBhdGgiKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZpbGVuYW1lKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgYWxsb2NhdGUgZmlsZW5hbWUgc3RyaW5nXG4iKTsKKworICBkaXIgPSBfZGJ1c19kaXJlY3Rvcnlfb3BlbiAoJnRlc3RfZGlyZWN0b3J5LCAmZXJyb3IpOworICBpZiAoZGlyID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkNvdWxkIG5vdCBvcGVuICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnRlc3RfZGlyZWN0b3J5KSwKKyAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIHByaW50ZiAoIlRlc3RpbmcgJXM6XG4iLCBzdWJkaXIpOworCisgbmV4dDoKKyAgd2hpbGUgKF9kYnVzX2RpcmVjdG9yeV9nZXRfbmV4dF9maWxlIChkaXIsICZmaWxlbmFtZSwgJmVycm9yKSkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIGZ1bGxfcGF0aDsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfcGF0aCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGluaXQgc3RyaW5nIik7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZ0ZXN0X2RpcmVjdG9yeSwgMCwgJmZ1bGxfcGF0aCwgMCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGNvcHkgZGlyIHRvIGZ1bGxfcGF0aCIpOworCisgICAgICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZmdWxsX3BhdGgsICZmaWxlbmFtZSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGNvbmNhdCBmaWxlIHRvIGRpciIpOworCisgICAgICBpZiAoX2RidXNfc3RyaW5nX2VuZHNfd2l0aF9jX3N0ciAoJmZpbGVuYW1lLCAiLm1lc3NhZ2UtcmF3IikpCisgICAgICAgIDsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmIChfZGJ1c19zdHJpbmdfZW5kc193aXRoX2Nfc3RyICgmZmlsZW5hbWUsICIubWVzc2FnZSIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwcmludGYgKCJTS0lQOiBDb3VsZCBub3QgbG9hZCAlcywgbWVzc2FnZSBidWlsZGVyIGxhbmd1YWdlIG5vIGxvbmdlciBzdXBwb3J0ZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZmlsZW5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiU2tpcHBpbmcgbm9uLS5tZXNzYWdlIGZpbGUgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZmlsZW5hbWUpKTsKKwkgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgICAgICBnb3RvIG5leHQ7CisgICAgICAgIH0KKworICAgICAgcHJpbnRmICgiICAgICVzXG4iLAorICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmaWxlbmFtZSkpOworCisgICAgICBpZiAoISAoKmZ1bmN0aW9uKSAoJmZ1bGxfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF92YWxpZGl0eSwgdXNlcl9kYXRhKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgfQorCisgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiQ291bGQgbm90IGdldCBuZXh0IGZpbGUgaW4gJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmdGVzdF9kaXJlY3RvcnkpLAorICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIGZhaWxlZDoKKworICBpZiAoZGlyKQorICAgIF9kYnVzX2RpcmVjdG9yeV9jbG9zZSAoZGlyKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0ZXN0X2RpcmVjdG9yeSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogUnVucyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb24gZXZlcnkgbWVzc2FnZSBmaWxlIGluIHRoZSB0ZXN0IHN1aXRlLgorICogVGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gI0ZBTFNFIG9uIHRlc3QgZmFpbHVyZSBvciBmYXRhbCBlcnJvci4KKyAqCisgKiBAcGFyYW0gdGVzdF9kYXRhX2RpciByb290IGRpciBvZiB0aGUgdGVzdCBzdWl0ZSBkYXRhIGZpbGVzICh0b3Bfc3JjZGlyL3Rlc3QvZGF0YSkKKyAqIEBwYXJhbSBmdW5jIHRoZSBmdW5jdGlvbiB0byBydW4KKyAqIEBwYXJhbSB1c2VyX2RhdGEgZGF0YSBmb3IgZnVuY3Rpb24KKyAqIEByZXR1cm5zICNGQUxTRSBpZiB0aGVyZSdzIGEgZmFpbHVyZQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX2ZvcmVhY2hfbWVzc2FnZV9maWxlIChjb25zdCBjaGFyICAgICAgICAgICAgICAgICp0ZXN0X2RhdGFfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRm9yZWFjaE1lc3NhZ2VGaWxlRnVuYyBmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIERCdXNTdHJpbmcgdGVzdF9kaXJlY3Rvcnk7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnRlc3RfZGlyZWN0b3J5LCB0ZXN0X2RhdGFfZGlyKTsKKyAgCisgIGlmICghcHJvY2Vzc190ZXN0X3N1YmRpciAoJnRlc3RfZGlyZWN0b3J5LCAidmFsaWQtbWVzc2FnZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVkFMSUQsIGZ1bmMsIHVzZXJfZGF0YSkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgY2hlY2tfbWVtbGVha3MgKCk7CisgIAorICBpZiAoIXByb2Nlc3NfdGVzdF9zdWJkaXIgKCZ0ZXN0X2RpcmVjdG9yeSwgImludmFsaWQtbWVzc2FnZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5WQUxJRF9GT1JfVU5LTk9XTl9SRUFTT04sIGZ1bmMsIHVzZXJfZGF0YSkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgY2hlY2tfbWVtbGVha3MgKCk7CisgIAorICBpZiAoIXByb2Nlc3NfdGVzdF9zdWJkaXIgKCZ0ZXN0X2RpcmVjdG9yeSwgImluY29tcGxldGUtbWVzc2FnZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVkFMSURfQlVUX0lOQ09NUExFVEUsIGZ1bmMsIHVzZXJfZGF0YSkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgY2hlY2tfbWVtbGVha3MgKCk7CisgIAorICByZXR2YWwgPSBUUlVFOworICAKKyBmYWlsZWQ6CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0ZXN0X2RpcmVjdG9yeSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworI2lmIDAKKyNkZWZpbmUgR0VUX0FORF9DSEVDSyhpdGVyLCB0eXBlbmFtZSwgbGl0ZXJhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJml0ZXIpICE9IERCVVNfVFlQRV8jI3R5cGVuYW1lKSAgICAgICAgIFwKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImdvdCB3cm9uZyBhcmd1bWVudCB0eXBlIGZyb20gbWVzc2FnZSBpdGVyIik7ICAgXAorICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoJml0ZXIsICZ2XyMjdHlwZW5hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHZfIyN0eXBlbmFtZSAhPSBsaXRlcmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImdvdCB3cm9uZyB2YWx1ZSBmcm9tIG1lc3NhZ2UgaXRlciIpOyAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEdFVF9BTkRfQ0hFQ0tfU1RSQ01QKGl0ZXIsIHR5cGVuYW1lLCBsaXRlcmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZpdGVyKSAhPSBEQlVTX1RZUEVfIyN0eXBlbmFtZSkgICAgICAgICBcCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJnb3Qgd3JvbmcgYXJndW1lbnQgdHlwZSBmcm9tIG1lc3NhZ2UgaXRlciIpOyAgIFwKKyAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKCZpdGVyLCAmdl8jI3R5cGVuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChzdHJjbXAgKHZfIyN0eXBlbmFtZSwgbGl0ZXJhbCkgIT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJnb3Qgd3JvbmcgdmFsdWUgZnJvbSBtZXNzYWdlIGl0ZXIiKTsgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBHRVRfQU5EX0NIRUNLX0FORF9ORVhUKGl0ZXIsIHR5cGVuYW1lLCBsaXRlcmFsKSAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR0VUX0FORF9DSEVDSyhpdGVyLCB0eXBlbmFtZSwgbGl0ZXJhbCk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJml0ZXIpKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBtb3ZlIGl0ZXIgdG8gbmV4dCIpOyBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgR0VUX0FORF9DSEVDS19TVFJDTVBfQU5EX05FWFQoaXRlciwgdHlwZW5hbWUsIGxpdGVyYWwpICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdFVF9BTkRfQ0hFQ0tfU1RSQ01QKGl0ZXIsIHR5cGVuYW1lLCBsaXRlcmFsKTsgICAgICAgICAgICAgIFwKKyAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZpdGVyKSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gbW92ZSBpdGVyIHRvIG5leHQiKTsgXAorICB9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZAorbWVzc2FnZV9pdGVyX3Rlc3QgKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBEQnVzTWVzc2FnZUl0ZXIgaXRlciwgYXJyYXksIGFycmF5MjsKKyAgY29uc3QgY2hhciAqdl9TVFJJTkc7CisgIGRvdWJsZSB2X0RPVUJMRTsKKyAgZGJ1c19pbnQxNl90IHZfSU5UMTY7CisgIGRidXNfdWludDE2X3Qgdl9VSU5UMTY7CisgIGRidXNfaW50MzJfdCB2X0lOVDMyOworICBkYnVzX3VpbnQzMl90IHZfVUlOVDMyOworI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorICBkYnVzX2ludDY0X3Qgdl9JTlQ2NDsKKyAgZGJ1c191aW50NjRfdCB2X1VJTlQ2NDsKKyNlbmRpZgorICB1bnNpZ25lZCBjaGFyIHZfQllURTsKKyAgZGJ1c19ib29sX3Qgdl9CT09MRUFOOworCisgIGNvbnN0IGRidXNfaW50MzJfdCAqb3VyX2ludF9hcnJheTsKKyAgaW50IGxlbjsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0IChtZXNzYWdlLCAmaXRlcik7CisKKyAgR0VUX0FORF9DSEVDS19TVFJDTVBfQU5EX05FWFQgKGl0ZXIsIFNUUklORywgIlRlc3Qgc3RyaW5nIik7CisgIEdFVF9BTkRfQ0hFQ0tfQU5EX05FWFQgKGl0ZXIsIElOVDMyLCAtMHgxMjM0NTY3OCk7CisgIEdFVF9BTkRfQ0hFQ0tfQU5EX05FWFQgKGl0ZXIsIFVJTlQzMiwgMHhlZGQxZSk7CisgIEdFVF9BTkRfQ0hFQ0tfQU5EX05FWFQgKGl0ZXIsIERPVUJMRSwgMy4xNDE1OSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJml0ZXIpICE9IERCVVNfVFlQRV9BUlJBWSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJBcmd1bWVudCB0eXBlIG5vdCBhbiBhcnJheSIpOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZWxlbWVudF90eXBlICgmaXRlcikgIT0gREJVU19UWVBFX0RPVUJMRSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJBcnJheSB0eXBlIG5vdCBkb3VibGUiKTsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlICgmaXRlciwgJmFycmF5KTsKKworICBHRVRfQU5EX0NIRUNLX0FORF9ORVhUIChhcnJheSwgRE9VQkxFLCAxLjUpOworICBHRVRfQU5EX0NIRUNLIChhcnJheSwgRE9VQkxFLCAyLjUpOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmYXJyYXkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkRpZG4ndCByZWFjaCBlbmQgb2YgYXJyYXkiKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZpdGVyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJSZWFjaGVkIGVuZCBvZiBhcmd1bWVudHMiKTsKKworICBHRVRfQU5EX0NIRUNLX0FORF9ORVhUIChpdGVyLCBCWVRFLCAweEYwKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmaXRlcikgIT0gREJVU19UWVBFX0FSUkFZKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIGFycmF5Iik7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9lbGVtZW50X3R5cGUgKCZpdGVyKSAhPSBEQlVTX1RZUEVfSU5UMzIpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiQXJyYXkgdHlwZSBub3QgaW50MzIiKTsKKworICAvKiBFbXB0eSBhcnJheSAqLworICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlICgmaXRlciwgJmFycmF5KTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJmFycmF5KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJEaWRuJ3QgcmVhY2ggZW5kIG9mIGFycmF5Iik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiUmVhY2hlZCBlbmQgb2YgYXJndW1lbnRzIik7CisKKyAgR0VUX0FORF9DSEVDSyAoaXRlciwgQllURSwgMHhGMCk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZpdGVyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJEaWRuJ3QgcmVhY2ggZW5kIG9mIGFyZ3VtZW50cyIpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCit2ZXJpZnlfdGVzdF9tZXNzYWdlIChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgREJ1c01lc3NhZ2VJdGVyIGl0ZXI7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgZGJ1c19pbnQxNl90IG91cl9pbnQxNjsKKyAgZGJ1c191aW50MTZfdCBvdXJfdWludDE2OworICBkYnVzX2ludDMyX3Qgb3VyX2ludDsKKyAgZGJ1c191aW50MzJfdCBvdXJfdWludDsKKyAgY29uc3QgY2hhciAqb3VyX3N0cjsKKyAgZG91YmxlIG91cl9kb3VibGU7CisgIGRvdWJsZSB2X0RPVUJMRTsKKyAgZGJ1c19ib29sX3Qgb3VyX2Jvb2w7CisgIHVuc2lnbmVkIGNoYXIgb3VyX2J5dGVfMSwgb3VyX2J5dGVfMjsKKyAgY29uc3QgZGJ1c191aW50MzJfdCAqb3VyX3VpbnQzMl9hcnJheSA9ICh2b2lkKikweGRlYWRiZWVmOworICBpbnQgb3VyX3VpbnQzMl9hcnJheV9sZW47CisgIGRidXNfaW50MzJfdCAqb3VyX2ludDMyX2FycmF5ID0gKHZvaWQqKTB4ZGVhZGJlZWY7CisgIGludCBvdXJfaW50MzJfYXJyYXlfbGVuOworI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorICBkYnVzX2ludDY0X3Qgb3VyX2ludDY0OworICBkYnVzX3VpbnQ2NF90IG91cl91aW50NjQ7CisgIGRidXNfaW50NjRfdCAqb3VyX3VpbnQ2NF9hcnJheSA9ICh2b2lkKikweGRlYWRiZWVmOworICBpbnQgb3VyX3VpbnQ2NF9hcnJheV9sZW47CisgIGNvbnN0IGRidXNfaW50NjRfdCAqb3VyX2ludDY0X2FycmF5ID0gKHZvaWQqKTB4ZGVhZGJlZWY7CisgIGludCBvdXJfaW50NjRfYXJyYXlfbGVuOworI2VuZGlmCisgIGNvbnN0IGRvdWJsZSAqb3VyX2RvdWJsZV9hcnJheSA9ICh2b2lkKikweGRlYWRiZWVmOworICBpbnQgb3VyX2RvdWJsZV9hcnJheV9sZW47CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm91cl9ieXRlX2FycmF5ID0gKHZvaWQqKTB4ZGVhZGJlZWY7CisgIGludCBvdXJfYnl0ZV9hcnJheV9sZW47CisgIGNvbnN0IGRidXNfYm9vbF90ICpvdXJfYm9vbGVhbl9hcnJheSA9ICh2b2lkKikweGRlYWRiZWVmOworICBpbnQgb3VyX2Jvb2xlYW5fYXJyYXlfbGVuOworICBjaGFyICoqb3VyX3N0cmluZ19hcnJheTsKKyAgaW50IG91cl9zdHJpbmdfYXJyYXlfbGVuOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXQgKG1lc3NhZ2UsICZpdGVyKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdzICgmaXRlciwgJmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMTYsICZvdXJfaW50MTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMTYsICZvdXJfdWludDE2LAorCQkJCSAgIERCVVNfVFlQRV9JTlQzMiwgJm91cl9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZvdXJfdWludCwKKyNpZmRlZiBEQlVTX0hBVkVfSU5UNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDY0LCAmb3VyX2ludDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDY0LCAmb3VyX3VpbnQ2NCwKKyNlbmRpZgorCQkJCSAgIERCVVNfVFlQRV9TVFJJTkcsICZvdXJfc3RyLAorCQkJCSAgIERCVVNfVFlQRV9ET1VCTEUsICZvdXJfZG91YmxlLAorCQkJCSAgIERCVVNfVFlQRV9CT09MRUFOLCAmb3VyX2Jvb2wsCisJCQkJICAgREJVU19UWVBFX0JZVEUsICZvdXJfYnl0ZV8xLAorCQkJCSAgIERCVVNfVFlQRV9CWVRFLCAmb3VyX2J5dGVfMiwKKwkJCQkgICBEQlVTX1RZUEVfQVJSQVksIERCVVNfVFlQRV9VSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXJfdWludDMyX2FycmF5LCAmb3VyX3VpbnQzMl9hcnJheV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3VyX2ludDMyX2FycmF5LCAmb3VyX2ludDMyX2FycmF5X2xlbiwKKyNpZmRlZiBEQlVTX0hBVkVfSU5UNjQKKwkJCQkgICBEQlVTX1RZUEVfQVJSQVksIERCVVNfVFlQRV9VSU5UNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXJfdWludDY0X2FycmF5LCAmb3VyX3VpbnQ2NF9hcnJheV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX0lOVDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3VyX2ludDY0X2FycmF5LCAmb3VyX2ludDY0X2FycmF5X2xlbiwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQVJSQVksIERCVVNfVFlQRV9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXJfZG91YmxlX2FycmF5LCAmb3VyX2RvdWJsZV9hcnJheV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX0JZVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXJfYnl0ZV9hcnJheSwgJm91cl9ieXRlX2FycmF5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfQk9PTEVBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91cl9ib29sZWFuX2FycmF5LCAmb3VyX2Jvb2xlYW5fYXJyYXlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQVJSQVksIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXJfc3RyaW5nX2FycmF5LCAmb3VyX3N0cmluZ19hcnJheV9sZW4sCisJCQkJICAgMCkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImVycm9yOiAlcyAtICVzXG4iLCBlcnJvci5uYW1lLAorICAgICAgICAgICAgICAgICAgKGVycm9yLm1lc3NhZ2UgIT0gTlVMTCkgPyBlcnJvci5tZXNzYWdlIDogIm5vIG1lc3NhZ2UiKTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkNvdWxkIG5vdCBnZXQgYXJndW1lbnRzIik7CisgICAgfQorCisgIGlmIChvdXJfaW50MTYgIT0gLTB4MTIzKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIjE2LWJpdCBpbnRlZ2VycyBkaWZmZXIhIik7CisKKyAgaWYgKG91cl91aW50MTYgIT0gMHgxMjMpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiMTYtYml0IHVpbnRzIGRpZmZlciEiKTsKKyAgCisgIGlmIChvdXJfaW50ICE9IC0weDEyMzQ1Njc4KQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImludGVnZXJzIGRpZmZlciEiKTsKKworICBpZiAob3VyX3VpbnQgIT0gMHgxMjMwMDA0MikKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ1aW50cyBkaWZmZXIhIik7CisKKyNpZmRlZiBEQlVTX0hBVkVfSU5UNjQKKyAgaWYgKG91cl9pbnQ2NCAhPSBEQlVTX0lOVDY0X0NPTlNUQU5UICgtMHgxMjM0NTY3ODlhYmNkKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCI2NC1iaXQgaW50ZWdlcnMgZGlmZmVyISIpOworICBpZiAob3VyX3VpbnQ2NCAhPSBEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHgxMjM0NTY3ODlhYmNkKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCI2NC1iaXQgdW5zaWduZWQgaW50ZWdlcnMgZGlmZmVyISIpOworI2VuZGlmCisKKyAgdl9ET1VCTEUgPSAzLjE0MTU5OworICBpZiAoISBfREJVU19ET1VCTEVTX0JJVFdJU0VfRVFVQUwgKG91cl9kb3VibGUsIHZfRE9VQkxFKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkb3VibGVzIGRpZmZlciEiKTsKKworICBpZiAoc3RyY21wIChvdXJfc3RyLCAiVGVzdCBzdHJpbmciKSAhPSAwKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInN0cmluZ3MgZGlmZmVyISIpOworCisgIGlmICghb3VyX2Jvb2wpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiYm9vbGVhbnMgZGlmZmVyIik7CisKKyAgaWYgKG91cl9ieXRlXzEgIT0gNDIpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiYnl0ZXMgZGlmZmVyISIpOworCisgIGlmIChvdXJfYnl0ZV8yICE9IDI0KQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImJ5dGVzIGRpZmZlciEiKTsKKworICBpZiAob3VyX3VpbnQzMl9hcnJheV9sZW4gIT0gNCB8fAorICAgICAgb3VyX3VpbnQzMl9hcnJheVswXSAhPSAweDEyMzQ1Njc4IHx8CisgICAgICBvdXJfdWludDMyX2FycmF5WzFdICE9IDB4MjM0NTY3ODEgfHwKKyAgICAgIG91cl91aW50MzJfYXJyYXlbMl0gIT0gMHgzNDU2NzgxMiB8fAorICAgICAgb3VyX3VpbnQzMl9hcnJheVszXSAhPSAweDQ1Njc4MTIzKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInVpbnQgYXJyYXkgZGlmZmVycyIpOworCisgIGlmIChvdXJfaW50MzJfYXJyYXlfbGVuICE9IDQgfHwKKyAgICAgIG91cl9pbnQzMl9hcnJheVswXSAhPSAweDEyMzQ1Njc4IHx8CisgICAgICBvdXJfaW50MzJfYXJyYXlbMV0gIT0gLTB4MjM0NTY3ODEgfHwKKyAgICAgIG91cl9pbnQzMl9hcnJheVsyXSAhPSAweDM0NTY3ODEyIHx8CisgICAgICBvdXJfaW50MzJfYXJyYXlbM10gIT0gLTB4NDU2NzgxMjMpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW50IGFycmF5IGRpZmZlcnMiKTsKKworI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorICBpZiAob3VyX3VpbnQ2NF9hcnJheV9sZW4gIT0gNCB8fAorICAgICAgb3VyX3VpbnQ2NF9hcnJheVswXSAhPSAweDEyMzQ1Njc4IHx8CisgICAgICBvdXJfdWludDY0X2FycmF5WzFdICE9IDB4MjM0NTY3ODEgfHwKKyAgICAgIG91cl91aW50NjRfYXJyYXlbMl0gIT0gMHgzNDU2NzgxMiB8fAorICAgICAgb3VyX3VpbnQ2NF9hcnJheVszXSAhPSAweDQ1Njc4MTIzKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInVpbnQ2NCBhcnJheSBkaWZmZXJzIik7CisKKyAgaWYgKG91cl9pbnQ2NF9hcnJheV9sZW4gIT0gNCB8fAorICAgICAgb3VyX2ludDY0X2FycmF5WzBdICE9IDB4MTIzNDU2NzggfHwKKyAgICAgIG91cl9pbnQ2NF9hcnJheVsxXSAhPSAtMHgyMzQ1Njc4MSB8fAorICAgICAgb3VyX2ludDY0X2FycmF5WzJdICE9IDB4MzQ1Njc4MTIgfHwKKyAgICAgIG91cl9pbnQ2NF9hcnJheVszXSAhPSAtMHg0NTY3ODEyMykKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnQ2NCBhcnJheSBkaWZmZXJzIik7CisjZW5kaWYgLyogREJVU19IQVZFX0lOVDY0ICovCisKKyAgaWYgKG91cl9kb3VibGVfYXJyYXlfbGVuICE9IDMpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZG91YmxlIGFycmF5IGhhZCB3cm9uZyBsZW5ndGgiKTsKKworICAvKiBPbiBhbGwgSUVFRSBtYWNoaW5lcyAoaS5lLiBldmVyeXRoaW5nIHNhbmUpIGV4YWN0IGVxdWFsaXR5CisgICAqIHNob3VsZCBiZSBwcmVzZXJ2ZWQgb3ZlciB0aGUgd2lyZQorICAgKi8KKyAgdl9ET1VCTEUgPSAwLjEyMzQ7CisgIGlmICghIF9EQlVTX0RPVUJMRVNfQklUV0lTRV9FUVVBTCAob3VyX2RvdWJsZV9hcnJheVswXSwgdl9ET1VCTEUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRvdWJsZSBhcnJheSBoYWQgd3JvbmcgdmFsdWVzIik7CisgIHZfRE9VQkxFID0gOTg3Ni41NDMyMTsKKyAgaWYgKCEgX0RCVVNfRE9VQkxFU19CSVRXSVNFX0VRVUFMIChvdXJfZG91YmxlX2FycmF5WzFdLCB2X0RPVUJMRSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZG91YmxlIGFycmF5IGhhZCB3cm9uZyB2YWx1ZXMiKTsKKyAgdl9ET1VCTEUgPSAtMzAwLjA7CisgIGlmICghIF9EQlVTX0RPVUJMRVNfQklUV0lTRV9FUVVBTCAob3VyX2RvdWJsZV9hcnJheVsyXSwgdl9ET1VCTEUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRvdWJsZSBhcnJheSBoYWQgd3JvbmcgdmFsdWVzIik7CisKKyAgaWYgKG91cl9ieXRlX2FycmF5X2xlbiAhPSA0KQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImJ5dGUgYXJyYXkgaGFkIHdyb25nIGxlbmd0aCIpOworCisgIGlmIChvdXJfYnl0ZV9hcnJheVswXSAhPSAnYScgfHwKKyAgICAgIG91cl9ieXRlX2FycmF5WzFdICE9ICdiJyB8fAorICAgICAgb3VyX2J5dGVfYXJyYXlbMl0gIT0gJ2MnIHx8CisgICAgICBvdXJfYnl0ZV9hcnJheVszXSAhPSAyMzQpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiYnl0ZSBhcnJheSBoYWQgd3JvbmcgdmFsdWVzIik7CisKKyAgaWYgKG91cl9ib29sZWFuX2FycmF5X2xlbiAhPSA1KQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImJvb2wgYXJyYXkgaGFkIHdyb25nIGxlbmd0aCIpOworCisgIGlmIChvdXJfYm9vbGVhbl9hcnJheVswXSAhPSBUUlVFIHx8CisgICAgICBvdXJfYm9vbGVhbl9hcnJheVsxXSAhPSBGQUxTRSB8fAorICAgICAgb3VyX2Jvb2xlYW5fYXJyYXlbMl0gIT0gVFJVRSB8fAorICAgICAgb3VyX2Jvb2xlYW5fYXJyYXlbM10gIT0gVFJVRSB8fAorICAgICAgb3VyX2Jvb2xlYW5fYXJyYXlbNF0gIT0gRkFMU0UpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiYm9vbCBhcnJheSBoYWQgd3JvbmcgdmFsdWVzIik7CisKKyAgaWYgKG91cl9zdHJpbmdfYXJyYXlfbGVuICE9IDQpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic3RyaW5nIGFycmF5IHdhcyB3cm9uZyBsZW5ndGgiKTsKKworICBpZiAoc3RyY21wIChvdXJfc3RyaW5nX2FycmF5WzBdLCAiRm9vIikgIT0gMCB8fAorICAgICAgc3RyY21wIChvdXJfc3RyaW5nX2FycmF5WzFdLCAiYmFyIikgIT0gMCB8fAorICAgICAgc3RyY21wIChvdXJfc3RyaW5nX2FycmF5WzJdLCAiIikgIT0gMCB8fAorICAgICAgc3RyY21wIChvdXJfc3RyaW5nX2FycmF5WzNdLCAid29vIHdvbyB3b28gd29vIikgIT0gMCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzdHJpbmcgYXJyYXkgaGFkIHdyb25nIHZhbHVlcyIpOworCisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKG91cl9zdHJpbmdfYXJyYXkpOworICAKKyAgaWYgKGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZpdGVyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJEaWRuJ3QgcmVhY2ggZW5kIG9mIGFyZ3VtZW50cyIpOworfQorCisvKioKKyAqIEBpbmdyb3VwIERCdXNNZXNzYWdlSW50ZXJuYWxzCisgKiBVbml0IHRlc3QgZm9yIERCdXNNZXNzYWdlLgorICoKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19tZXNzYWdlX3Rlc3QgKGNvbnN0IGNoYXIgKnRlc3RfZGF0YV9kaXIpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlLCAqbWVzc2FnZV93aXRob3V0X3VuaXhfZmRzOworICBEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyOworICBpbnQgaTsKKyAgY29uc3QgY2hhciAqZGF0YTsKKyAgREJ1c01lc3NhZ2UgKmNvcHk7CisgIGNvbnN0IGNoYXIgKm5hbWUxOworICBjb25zdCBjaGFyICpuYW1lMjsKKyAgY29uc3QgZGJ1c191aW50MzJfdCBvdXJfdWludDMyX2FycmF5W10gPQorICAgIHsgMHgxMjM0NTY3OCwgMHgyMzQ1Njc4MSwgMHgzNDU2NzgxMiwgMHg0NTY3ODEyMyB9OworICBjb25zdCBkYnVzX2ludDMyX3Qgb3VyX2ludDMyX2FycmF5W10gPQorICAgIHsgMHgxMjM0NTY3OCwgLTB4MjM0NTY3ODEsIDB4MzQ1Njc4MTIsIC0weDQ1Njc4MTIzIH07CisgIGNvbnN0IGRidXNfdWludDMyX3QgKnZfQVJSQVlfVUlOVDMyID0gb3VyX3VpbnQzMl9hcnJheTsKKyAgY29uc3QgZGJ1c19pbnQzMl90ICp2X0FSUkFZX0lOVDMyID0gb3VyX2ludDMyX2FycmF5OworI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorICBjb25zdCBkYnVzX3VpbnQ2NF90IG91cl91aW50NjRfYXJyYXlbXSA9CisgICAgeyAweDEyMzQ1Njc4LCAweDIzNDU2NzgxLCAweDM0NTY3ODEyLCAweDQ1Njc4MTIzIH07CisgIGNvbnN0IGRidXNfaW50NjRfdCBvdXJfaW50NjRfYXJyYXlbXSA9CisgICAgeyAweDEyMzQ1Njc4LCAtMHgyMzQ1Njc4MSwgMHgzNDU2NzgxMiwgLTB4NDU2NzgxMjMgfTsKKyAgY29uc3QgZGJ1c191aW50NjRfdCAqdl9BUlJBWV9VSU5UNjQgPSBvdXJfdWludDY0X2FycmF5OworICBjb25zdCBkYnVzX2ludDY0X3QgKnZfQVJSQVlfSU5UNjQgPSBvdXJfaW50NjRfYXJyYXk7CisjZW5kaWYKKyAgY29uc3QgY2hhciAqb3VyX3N0cmluZ19hcnJheVtdID0geyAiRm9vIiwgImJhciIsICIiLCAid29vIHdvbyB3b28gd29vIiB9OworICBjb25zdCBjaGFyICoqdl9BUlJBWV9TVFJJTkcgPSBvdXJfc3RyaW5nX2FycmF5OworICBjb25zdCBkb3VibGUgb3VyX2RvdWJsZV9hcnJheVtdID0geyAwLjEyMzQsIDk4NzYuNTQzMjEsIC0zMDAuMCB9OworICBjb25zdCBkb3VibGUgKnZfQVJSQVlfRE9VQkxFID0gb3VyX2RvdWJsZV9hcnJheTsKKyAgY29uc3QgdW5zaWduZWQgY2hhciBvdXJfYnl0ZV9hcnJheVtdID0geyAnYScsICdiJywgJ2MnLCAyMzQgfTsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqdl9BUlJBWV9CWVRFID0gb3VyX2J5dGVfYXJyYXk7CisgIGNvbnN0IGRidXNfYm9vbF90IG91cl9ib29sZWFuX2FycmF5W10gPSB7IFRSVUUsIEZBTFNFLCBUUlVFLCBUUlVFLCBGQUxTRSB9OworICBjb25zdCBkYnVzX2Jvb2xfdCAqdl9BUlJBWV9CT09MRUFOID0gb3VyX2Jvb2xlYW5fYXJyYXk7CisgIGNoYXIgc2lnWzY0XTsKKyAgY29uc3QgY2hhciAqczsKKyAgY29uc3QgY2hhciAqdl9TVFJJTkc7CisgIGRvdWJsZSB2X0RPVUJMRTsKKyAgZGJ1c19pbnQxNl90IHZfSU5UMTY7CisgIGRidXNfdWludDE2X3Qgdl9VSU5UMTY7CisgIGRidXNfaW50MzJfdCB2X0lOVDMyOworICBkYnVzX3VpbnQzMl90IHZfVUlOVDMyOworI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorICBkYnVzX2ludDY0X3Qgdl9JTlQ2NDsKKyAgZGJ1c191aW50NjRfdCB2X1VJTlQ2NDsKKyNlbmRpZgorICB1bnNpZ25lZCBjaGFyIHZfQllURTsKKyAgdW5zaWduZWQgY2hhciB2Ml9CWVRFOworICBkYnVzX2Jvb2xfdCB2X0JPT0xFQU47CisgIERCdXNNZXNzYWdlSXRlciBpdGVyLCBhcnJheV9pdGVyLCBzdHJ1Y3RfaXRlcjsKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICBpbnQgdl9VTklYX0ZEOworI2VuZGlmCisgIGNoYXIgKipkZWNvbXBvc2VkOworICBEQnVzSW5pdGlhbEZEcyAqaW5pdGlhbF9mZHM7CisKKyAgaW5pdGlhbF9mZHMgPSBfZGJ1c19jaGVja19mZGxlYWtzX2VudGVyICgpOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsICgib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFNlcnZpY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFBhdGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvby5UZXN0SW50ZXJmYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZXN0TWV0aG9kIik7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2hhc19kZXN0aW5hdGlvbiAobWVzc2FnZSwgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTZXJ2aWNlIikpOworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9pc19tZXRob2RfY2FsbCAobWVzc2FnZSwgIkZvby5UZXN0SW50ZXJmYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZXN0TWV0aG9kIikpOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL1Rlc3RQYXRoIikgPT0gMCk7CisgIGRidXNfbWVzc2FnZV9zZXRfc2VyaWFsIChtZXNzYWdlLCAxMjM0KTsKKworICAvKiBzdHJpbmcgbGVuZ3RoIGluY2x1ZGluZyBudWwgYnl0ZSBub3QgYSBtdWx0aXBsZSBvZiA0ICovCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9zZW5kZXIgKG1lc3NhZ2UsICJvcmcuZm9vLmJhcjEiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvdXQgb2YgbWVtb3J5Iik7CisKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwgIm9yZy5mb28uYmFyMSIpKTsKKyAgZGJ1c19tZXNzYWdlX3NldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UsIDU2NzgpOworCisgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmbWVzc2FnZS0+aGVhZGVyLmRhdGEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmhlYWRlci5kYXRhKSk7CisgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmbWVzc2FnZS0+Ym9keSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+Ym9keSkpOworCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9zZW5kZXIgKG1lc3NhZ2UsIE5VTEwpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm91dCBvZiBtZW1vcnkiKTsKKworCisgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmbWVzc2FnZS0+aGVhZGVyLmRhdGEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmhlYWRlci5kYXRhKSk7CisgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmbWVzc2FnZS0+Ym9keSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+Ym9keSkpOworCisKKyAgX2RidXNfYXNzZXJ0ICghZGJ1c19tZXNzYWdlX2hhc19zZW5kZXIgKG1lc3NhZ2UsICJvcmcuZm9vLmJhcjEiKSk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKG1lc3NhZ2UpID09IDEyMzQpOworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSA9PSA1Njc4KTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfaGFzX2Rlc3RpbmF0aW9uIChtZXNzYWdlLCAib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFNlcnZpY2UiKSk7CisKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfZ2V0X25vX3JlcGx5IChtZXNzYWdlKSA9PSBGQUxTRSk7CisgIGRidXNfbWVzc2FnZV9zZXRfbm9fcmVwbHkgKG1lc3NhZ2UsIFRSVUUpOworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9nZXRfbm9fcmVwbHkgKG1lc3NhZ2UpID09IFRSVUUpOworICBkYnVzX21lc3NhZ2Vfc2V0X25vX3JlcGx5IChtZXNzYWdlLCBGQUxTRSk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2dldF9ub19yZXBseSAobWVzc2FnZSkgPT0gRkFMU0UpOworCisgIC8qIFNldC9nZXQgc29tZSBoZWFkZXIgZmllbGRzICovCisKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X3BhdGggKG1lc3NhZ2UsICIvZm9vIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib3V0IG9mIG1lbW9yeSIpOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICIvZm9vIikgPT0gMCk7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2ludGVyZmFjZSAobWVzc2FnZSwgIm9yZy5Gb28iKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvdXQgb2YgbWVtb3J5Iik7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLkZvbyIpID09IDApOworCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9tZW1iZXIgKG1lc3NhZ2UsICJCYXIiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvdXQgb2YgbWVtb3J5Iik7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiQmFyIikgPT0gMCk7CisKKyAgLyogU2V0L2dldCB0aGVtIHdpdGggbG9uZ2VyIHZhbHVlcyAqLworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfcGF0aCAobWVzc2FnZSwgIi9mb28vYmFyIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib3V0IG9mIG1lbW9yeSIpOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICIvZm9vL2JhciIpID09IDApOworCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9pbnRlcmZhY2UgKG1lc3NhZ2UsICJvcmcuRm9vLkJhciIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm91dCBvZiBtZW1vcnkiKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuRm9vLkJhciIpID09IDApOworCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9tZW1iZXIgKG1lc3NhZ2UsICJCYXJGb28iKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvdXQgb2YgbWVtb3J5Iik7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiQmFyRm9vIikgPT0gMCk7CisKKyAgLyogUmVhbGxvYyBzaG9ydGVyIGFnYWluICovCisKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X3BhdGggKG1lc3NhZ2UsICIvZm9vIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib3V0IG9mIG1lbW9yeSIpOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICIvZm9vIikgPT0gMCk7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2ludGVyZmFjZSAobWVzc2FnZSwgIm9yZy5Gb28iKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvdXQgb2YgbWVtb3J5Iik7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLkZvbyIpID09IDApOworCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9tZW1iZXIgKG1lc3NhZ2UsICJCYXIiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvdXQgb2YgbWVtb3J5Iik7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiQmFyIikgPT0gMCk7CisKKyAgLyogUGF0aCBkZWNvbXBvc2luZyAqLworICBkYnVzX21lc3NhZ2Vfc2V0X3BhdGggKG1lc3NhZ2UsIE5VTEwpOworICBkYnVzX21lc3NhZ2VfZ2V0X3BhdGhfZGVjb21wb3NlZCAobWVzc2FnZSwgJmRlY29tcG9zZWQpOworICBfZGJ1c19hc3NlcnQgKGRlY29tcG9zZWQgPT0gTlVMTCk7CisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGRlY29tcG9zZWQpOworCisgIGRidXNfbWVzc2FnZV9zZXRfcGF0aCAobWVzc2FnZSwgIi8iKTsKKyAgZGJ1c19tZXNzYWdlX2dldF9wYXRoX2RlY29tcG9zZWQgKG1lc3NhZ2UsICZkZWNvbXBvc2VkKTsKKyAgX2RidXNfYXNzZXJ0IChkZWNvbXBvc2VkICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGRlY29tcG9zZWRbMF0gPT0gTlVMTCk7CisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGRlY29tcG9zZWQpOworCisgIGRidXNfbWVzc2FnZV9zZXRfcGF0aCAobWVzc2FnZSwgIi9hL2IiKTsKKyAgZGJ1c19tZXNzYWdlX2dldF9wYXRoX2RlY29tcG9zZWQgKG1lc3NhZ2UsICZkZWNvbXBvc2VkKTsKKyAgX2RidXNfYXNzZXJ0IChkZWNvbXBvc2VkICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAoZGVjb21wb3NlZFswXSwgImEiKSA9PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKGRlY29tcG9zZWRbMV0sICJiIikgPT0gMCk7CisgIF9kYnVzX2Fzc2VydCAoZGVjb21wb3NlZFsyXSA9PSBOVUxMKTsKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoZGVjb21wb3NlZCk7CisKKyAgZGJ1c19tZXNzYWdlX3NldF9wYXRoIChtZXNzYWdlLCAiL3NwYW0vZWdncyIpOworICBkYnVzX21lc3NhZ2VfZ2V0X3BhdGhfZGVjb21wb3NlZCAobWVzc2FnZSwgJmRlY29tcG9zZWQpOworICBfZGJ1c19hc3NlcnQgKGRlY29tcG9zZWQgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChkZWNvbXBvc2VkWzBdLCAic3BhbSIpID09IDApOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAoZGVjb21wb3NlZFsxXSwgImVnZ3MiKSA9PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChkZWNvbXBvc2VkWzJdID09IE5VTEwpOworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChkZWNvbXBvc2VkKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIC8qIFRlc3QgdGhlIHZhcmFyZyBmdW5jdGlvbnMgKi8KKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKCJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U2VydmljZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL29yZy9mcmVlZGVza3RvcC9UZXN0UGF0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRm9vLlRlc3RJbnRlcmZhY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3RNZXRob2QiKTsKKyAgZGJ1c19tZXNzYWdlX3NldF9zZXJpYWwgKG1lc3NhZ2UsIDEpOworICBkYnVzX21lc3NhZ2Vfc2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSwgNTY3OCk7CisKKyAgdl9JTlQxNiA9IC0weDEyMzsKKyAgdl9VSU5UMTYgPSAweDEyMzsKKyAgdl9JTlQzMiA9IC0weDEyMzQ1Njc4OworICB2X1VJTlQzMiA9IDB4MTIzMDAwNDI7CisjaWZkZWYgREJVU19IQVZFX0lOVDY0CisgIHZfSU5UNjQgPSBEQlVTX0lOVDY0X0NPTlNUQU5UICgtMHgxMjM0NTY3ODlhYmNkKTsKKyAgdl9VSU5UNjQgPSBEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHgxMjM0NTY3ODlhYmNkKTsKKyNlbmRpZgorICB2X1NUUklORyA9ICJUZXN0IHN0cmluZyI7CisgIHZfRE9VQkxFID0gMy4xNDE1OTsKKyAgdl9CT09MRUFOID0gVFJVRTsKKyAgdl9CWVRFID0gNDI7CisgIHYyX0JZVEUgPSAyNDsKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICB2X1VOSVhfRkQgPSAxOworI2VuZGlmCisKKyAgZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQxNiwgJnZfSU5UMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQxNiwgJnZfVUlOVDE2LAorCQkJICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJnZfVUlOVDMyLAorI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQ2NCwgJnZfSU5UNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQ2NCwgJnZfVUlOVDY0LAorI2VuZGlmCisJCQkgICAgREJVU19UWVBFX1NUUklORywgJnZfU1RSSU5HLAorCQkJICAgIERCVVNfVFlQRV9ET1VCTEUsICZ2X0RPVUJMRSwKKwkJCSAgICBEQlVTX1RZUEVfQk9PTEVBTiwgJnZfQk9PTEVBTiwKKwkJCSAgICBEQlVTX1RZUEVfQllURSwgJnZfQllURSwKKwkJCSAgICBEQlVTX1RZUEVfQllURSwgJnYyX0JZVEUsCisJCQkgICAgREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfVUlOVDMyLCAmdl9BUlJBWV9VSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfTl9FTEVNRU5UUyAob3VyX3VpbnQzMl9hcnJheSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfSU5UMzIsICZ2X0FSUkFZX0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX05fRUxFTUVOVFMgKG91cl9pbnQzMl9hcnJheSksCisjaWZkZWYgREJVU19IQVZFX0lOVDY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfVUlOVDY0LCAmdl9BUlJBWV9VSU5UNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfTl9FTEVNRU5UUyAob3VyX3VpbnQ2NF9hcnJheSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfSU5UNjQsICZ2X0FSUkFZX0lOVDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX05fRUxFTUVOVFMgKG91cl9pbnQ2NF9hcnJheSksCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQVJSQVksIERCVVNfVFlQRV9ET1VCTEUsICZ2X0FSUkFZX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19OX0VMRU1FTlRTIChvdXJfZG91YmxlX2FycmF5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQVJSQVksIERCVVNfVFlQRV9CWVRFLCAmdl9BUlJBWV9CWVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX05fRUxFTUVOVFMgKG91cl9ieXRlX2FycmF5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQVJSQVksIERCVVNfVFlQRV9CT09MRUFOLCAmdl9BUlJBWV9CT09MRUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX05fRUxFTUVOVFMgKG91cl9ib29sZWFuX2FycmF5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQVJSQVksIERCVVNfVFlQRV9TVFJJTkcsICZ2X0FSUkFZX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19OX0VMRU1FTlRTIChvdXJfc3RyaW5nX2FycmF5KSwKKworCQkJICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKworICBpID0gMDsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfSU5UMTY7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX1VJTlQxNjsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfSU5UMzI7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX1VJTlQzMjsKKyNpZmRlZiBEQlVTX0hBVkVfSU5UNjQKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfSU5UNjQ7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX1VJTlQ2NDsKKyNlbmRpZgorICBzaWdbaSsrXSA9IERCVVNfVFlQRV9TVFJJTkc7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX0RPVUJMRTsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfQk9PTEVBTjsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfQllURTsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfQllURTsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfQVJSQVk7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX1VJTlQzMjsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfQVJSQVk7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX0lOVDMyOworI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorICBzaWdbaSsrXSA9IERCVVNfVFlQRV9BUlJBWTsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfVUlOVDY0OworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9BUlJBWTsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfSU5UNjQ7CisjZW5kaWYKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfQVJSQVk7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX0RPVUJMRTsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfQVJSQVk7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX0JZVEU7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX0FSUkFZOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9CT09MRUFOOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9BUlJBWTsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfU1RSSU5HOworCisgIG1lc3NhZ2Vfd2l0aG91dF91bml4X2ZkcyA9IGRidXNfbWVzc2FnZV9jb3B5KG1lc3NhZ2UpOworICBfZGJ1c19hc3NlcnQobWVzc2FnZV93aXRob3V0X3VuaXhfZmRzKTsKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICBkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VOSVhfRkQsICZ2X1VOSVhfRkQsCisJCQkgICAgREJVU19UWVBFX0lOVkFMSUQpOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9VTklYX0ZEOworI2VuZGlmCisgIHNpZ1tpKytdID0gREJVU19UWVBFX0lOVkFMSUQ7CisKKyAgX2RidXNfYXNzZXJ0IChpIDwgKGludCkgX0RCVVNfTl9FTEVNRU5UUyAoc2lnKSk7CisKKyAgX2RidXNfdmVyYm9zZSAoIkhFQURFUlxuIik7CisgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmbWVzc2FnZS0+aGVhZGVyLmRhdGEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmhlYWRlci5kYXRhKSk7CisgIF9kYnVzX3ZlcmJvc2UgKCJCT0RZXG4iKTsKKyAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZtZXNzYWdlLT5ib2R5LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZtZXNzYWdlLT5ib2R5KSk7CisKKyAgX2RidXNfdmVyYm9zZSAoIlNpZ25hdHVyZSBleHBlY3RlZCBcIiVzXCIgYWN0dWFsIFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgc2lnLCBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSkpOworCisgIHMgPSBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSk7CisKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfaGFzX3NpZ25hdHVyZSAobWVzc2FnZSwgc2lnKSk7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChzLCBzaWcpID09IDApOworCisgIHZlcmlmeV90ZXN0X21lc3NhZ2UgKG1lc3NhZ2UpOworCisgIGNvcHkgPSBkYnVzX21lc3NhZ2VfY29weSAobWVzc2FnZSk7CisKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSkgPT0KKyAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAoY29weSkpOworICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UtPmhlYWRlci5wYWRkaW5nID09IGNvcHktPmhlYWRlci5wYWRkaW5nKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+aGVhZGVyLmRhdGEpID09CisgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZjb3B5LT5oZWFkZXIuZGF0YSkpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZtZXNzYWdlLT5ib2R5KSA9PQorICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmY29weS0+Ym9keSkpOworCisgIHZlcmlmeV90ZXN0X21lc3NhZ2UgKGNvcHkpOworCisgIG5hbWUxID0gZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpOworICBuYW1lMiA9IGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChjb3B5KTsKKworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAobmFtZTEsIG5hbWUyKSA9PSAwKTsKKworICBuYW1lMSA9IGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKTsKKyAgbmFtZTIgPSBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAoY29weSk7CisKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKG5hbWUxLCBuYW1lMikgPT0gMCk7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChjb3B5KTsKKworICAvKiBNZXNzYWdlIGxvYWRlciB0ZXN0ICovCisgIGRidXNfbWVzc2FnZV9sb2NrIChtZXNzYWdlKTsKKyAgbG9hZGVyID0gX2RidXNfbWVzc2FnZV9sb2FkZXJfbmV3ICgpOworICAKKyAgLyogY2hlY2sgcmVmL3VucmVmICovCisgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JlZiAobG9hZGVyKTsKKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfdW5yZWYgKGxvYWRlcik7CisKKyAgLyogV3JpdGUgdGhlIGhlYWRlciBkYXRhIG9uZSBieXRlIGF0IGEgdGltZSAqLworICBkYXRhID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmbWVzc2FnZS0+aGVhZGVyLmRhdGEpOworICBmb3IgKGkgPSAwOyBpIDwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZtZXNzYWdlLT5oZWFkZXIuZGF0YSk7IGkrKykKKyAgICB7CisgICAgICBEQnVzU3RyaW5nICpidWZmZXI7CisKKyAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9idWZmZXIgKGxvYWRlciwgJmJ1ZmZlcik7CisgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKGJ1ZmZlciwgZGF0YVtpXSk7CisgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyIChsb2FkZXIsIGJ1ZmZlciwgMSk7CisgICAgfQorCisgIC8qIFdyaXRlIHRoZSBib2R5IGRhdGEgb25lIGJ5dGUgYXQgYSB0aW1lICovCisgIGRhdGEgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZtZXNzYWdlLT5ib2R5KTsKKyAgZm9yIChpID0gMDsgaSA8IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+Ym9keSk7IGkrKykKKyAgICB7CisgICAgICBEQnVzU3RyaW5nICpidWZmZXI7CisKKyAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9idWZmZXIgKGxvYWRlciwgJmJ1ZmZlcik7CisgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKGJ1ZmZlciwgZGF0YVtpXSk7CisgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyIChsb2FkZXIsIGJ1ZmZlciwgMSk7CisgICAgfQorCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgeworICAgIGludCAqdW5peF9mZHM7CisgICAgdW5zaWduZWQgbl91bml4X2ZkczsKKyAgICAvKiBXcml0ZSB1bml4IGZkICovCisgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X3VuaXhfZmRzKGxvYWRlciwgJnVuaXhfZmRzLCAmbl91bml4X2Zkcyk7CisgICAgX2RidXNfYXNzZXJ0KG5fdW5peF9mZHMgPiAwKTsKKyAgICBfZGJ1c19hc3NlcnQobWVzc2FnZS0+bl91bml4X2ZkcyA9PSAxKTsKKyAgICB1bml4X2Zkc1swXSA9IF9kYnVzX2R1cChtZXNzYWdlLT51bml4X2Zkc1swXSwgTlVMTCk7CisgICAgX2RidXNfYXNzZXJ0KHVuaXhfZmRzWzBdID49IDApOworICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl91bml4X2Zkcyhsb2FkZXIsIHVuaXhfZmRzLCAxKTsKKyAgfQorI2VuZGlmCisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICAvKiBOb3cgcG9wIGJhY2sgdGhlIG1lc3NhZ2UgKi8KKyAgaWYgKCFfZGJ1c19tZXNzYWdlX2xvYWRlcl9xdWV1ZV9tZXNzYWdlcyAobG9hZGVyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkgdG8gcXVldWUgbWVzc2FnZXMiKTsKKworICBpZiAoX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X2lzX2NvcnJ1cHRlZCAobG9hZGVyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJtZXNzYWdlIGxvYWRlciBjb3JydXB0ZWQiKTsKKworICBtZXNzYWdlID0gX2RidXNfbWVzc2FnZV9sb2FkZXJfcG9wX21lc3NhZ2UgKGxvYWRlcik7CisgIGlmICghbWVzc2FnZSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJyZWNlaXZlZCBhIE5VTEwgbWVzc2FnZSIpOworCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSkgIT0gNTY3OCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJyZXBseSBzZXJpYWwgZmllbGRzIGRpZmZlciIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgLyogb3Z2ZXJpZGUgdGhlIHNlcmlhbCwgc2luY2UgaXQgd2FzIHJlc2V0IGJ5IGRidXNfbWVzc2FnZV9jb3B5KCkgKi8KKyAgZGJ1c19tZXNzYWdlX3NldF9zZXJpYWwobWVzc2FnZV93aXRob3V0X3VuaXhfZmRzLCA4OTAxKTsKKworICBkYnVzX21lc3NhZ2VfbG9jayAobWVzc2FnZV93aXRob3V0X3VuaXhfZmRzKTsKKworICB2ZXJpZnlfdGVzdF9tZXNzYWdlIChtZXNzYWdlX3dpdGhvdXRfdW5peF9mZHMpOworCisgICAgeworICAgICAgLyogTWFyc2hhbCBhbmQgZGVtYXJzaGFsIHRoZSBtZXNzYWdlLiAqLworCisgICAgICBEQnVzTWVzc2FnZSAqbWVzc2FnZTI7CisgICAgICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgICAgICBjaGFyICptYXJzaGFsbGVkID0gTlVMTDsKKyAgICAgIGludCBsZW4gPSAwOworICAgICAgY2hhciBnYXJiYWdlX2hlYWRlcltEQlVTX01JTklNVU1fSEVBREVSX1NJWkVdID0gInh4eCI7CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX21hcnNoYWwgKG1lc3NhZ2Vfd2l0aG91dF91bml4X2ZkcywgJm1hcnNoYWxsZWQsICZsZW4pKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gbWFyc2hhbCBtZXNzYWdlIik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAobGVuICE9IDApOworICAgICAgX2RidXNfYXNzZXJ0IChtYXJzaGFsbGVkICE9IE5VTEwpOworCisgICAgICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9kZW1hcnNoYWxfYnl0ZXNfbmVlZGVkIChtYXJzaGFsbGVkLCBsZW4pID09IGxlbik7CisgICAgICBtZXNzYWdlMiA9IGRidXNfbWVzc2FnZV9kZW1hcnNoYWwgKG1hcnNoYWxsZWQsIGxlbiwgJmVycm9yKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChtZXNzYWdlMiAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoIWRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKTsKKyAgICAgIHZlcmlmeV90ZXN0X21lc3NhZ2UgKG1lc3NhZ2UyKTsKKworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlMik7CisgICAgICBkYnVzX2ZyZWUgKG1hcnNoYWxsZWQpOworCisgICAgICAvKiBEZW1hcnNoYWwgaW52YWxpZCBtZXNzYWdlLiAqLworCisgICAgICBtZXNzYWdlMiA9IGRidXNfbWVzc2FnZV9kZW1hcnNoYWwgKCJpbnZhbGlkIiwgNywgJmVycm9yKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAobWVzc2FnZTIgPT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICAgICAgLyogRGVtYXJzaGFsIGludmFsaWQgKGVtcHR5KSBtZXNzYWdlLiAqLworCisgICAgICBtZXNzYWdlMiA9IGRidXNfbWVzc2FnZV9kZW1hcnNoYWwgKCIiLCAwLCAmZXJyb3IpOworICAgICAgX2RidXNfYXNzZXJ0IChtZXNzYWdlMiA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgICAgICAvKiBCeXRlcyBuZWVkZWQgdG8gZGVtYXJzaGFsIGVtcHR5IG1lc3NhZ2U6IDAgKG1vcmUpICovCisKKyAgICAgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2RlbWFyc2hhbF9ieXRlc19uZWVkZWQgKCIiLCAwKSA9PSAwKTsKKyAgICAgIAorICAgICAgLyogQnl0ZXMgbmVlZGVkIHRvIGRlbWFyc2hhbCBpbnZhbGlkIG1lc3NhZ2U6IC0xIChlcnJvcikuICovCisKKyAgICAgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2RlbWFyc2hhbF9ieXRlc19uZWVkZWQgKGdhcmJhZ2VfaGVhZGVyLCBEQlVTX01JTklNVU1fSEVBREVSX1NJWkUpID09IC0xKTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlX3dpdGhvdXRfdW5peF9mZHMpOworICBfZGJ1c19tZXNzYWdlX2xvYWRlcl91bnJlZiAobG9hZGVyKTsKKworICBjaGVja19tZW1sZWFrcyAoKTsKKyAgX2RidXNfY2hlY2tfZmRsZWFrc19sZWF2ZSAoaW5pdGlhbF9mZHMpOworICBpbml0aWFsX2ZkcyA9IF9kYnVzX2NoZWNrX2ZkbGVha3NfZW50ZXIgKCk7CisKKyAgLyogQ2hlY2sgdGhhdCB3ZSBjYW4gYWJhbmRvbiBhIGNvbnRhaW5lciAqLworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTZXJ2aWNlIiwKKwkJICAJCQkgICIvb3JnL2ZyZWVkZXNrdG9wL1Rlc3RQYXRoIiwKKwkJCQkJICAiRm9vLlRlc3RJbnRlcmZhY2UiLAorCQkJCQkgICJNZXRob2QiKTsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAobWVzc2FnZSwgJml0ZXIpOworCisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZpdGVyLCBEQlVTX1RZUEVfQVJSQVksCisJCQkgIAkJCSAgKERCVVNfU1RSVUNUX0JFR0lOX0NIQVJfQVNfU1RSSU5HCisJCQkJCQkgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORworCQkJCQkJICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcKKwkJCQkJCSAgIERCVVNfU1RSVUNUX0VORF9DSEFSX0FTX1NUUklORyksCisJCQkJCQkgICZhcnJheV9pdGVyKSk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZhcnJheV9pdGVyLCBEQlVTX1RZUEVfU1RSVUNULAorCQkJICAJCQkgIE5VTEwsICZzdHJ1Y3RfaXRlcikpOworCisgIHMgPSAicGVhY2hlcyI7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmc3RydWN0X2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsCisJCQkgIAkJCSZzKSk7CisKKyAgLyogdWgtb2gsIGVycm9yLCB0cnkgYW5kIHVud2luZCAqLworCisgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmYXJyYXlfaXRlciwgJnN0cnVjdF9pdGVyKTsKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZhcnJheV9pdGVyLCAmaXRlcik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICAvKiBMb2FkIGFsbCB0aGUgc2FtcGxlIG1lc3NhZ2VzIGZyb20gdGhlIG1lc3NhZ2UgZmFjdG9yeSAqLworICB7CisgICAgREJ1c01lc3NhZ2VEYXRhSXRlciBkaXRlcjsKKyAgICBEQnVzTWVzc2FnZURhdGEgbWRhdGE7CisgICAgaW50IGNvdW50OworCisgICAgcmVzZXRfdmFsaWRpdGllc19zZWVuICgpOworICAgIAorICAgIGNvdW50ID0gMDsKKyAgICBfZGJ1c19tZXNzYWdlX2RhdGFfaXRlcl9pbml0ICgmZGl0ZXIpOworICAgIAorICAgIHdoaWxlIChfZGJ1c19tZXNzYWdlX2RhdGFfaXRlcl9nZXRfYW5kX25leHQgKCZkaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWRhdGEpKQorICAgICAgeworICAgICAgICBpZiAoIWRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV90cnlfbWVzc2FnZV9kYXRhICgmbWRhdGEuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRhdGEuZXhwZWN0ZWRfdmFsaWRpdHkpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJleHBlY3RlZCB2YWxpZGl0eSAlZCBhbmQgZGlkIG5vdCBnZXQgaXRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtZGF0YS5leHBlY3RlZF92YWxpZGl0eSk7CisgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJtZXNzYWdlIGRhdGEgZmFpbGVkIik7CisgICAgICAgICAgfQorCisgICAgICAgIF9kYnVzX21lc3NhZ2VfZGF0YV9mcmVlICgmbWRhdGEpOworCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgICB9CisKKyAgICBwcmludGYgKCIlZCBzYW1wbGUgbWVzc2FnZXMgdGVzdGVkXG4iLCBjb3VudCk7CisKKyAgICBwcmludF92YWxpZGl0aWVzX3NlZW4gKEZBTFNFKTsKKyAgICBwcmludF92YWxpZGl0aWVzX3NlZW4gKFRSVUUpOworICB9CisKKyAgY2hlY2tfbWVtbGVha3MgKCk7CisgIF9kYnVzX2NoZWNrX2ZkbGVha3NfbGVhdmUgKGluaXRpYWxfZmRzKTsKKworICAvKiBOb3cgbG9hZCBldmVyeSBtZXNzYWdlIGluIHRlc3RfZGF0YV9kaXIgaWYgd2UgaGF2ZSBvbmUgKi8KKyAgaWYgKHRlc3RfZGF0YV9kaXIgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpbml0aWFsX2ZkcyA9IF9kYnVzX2NoZWNrX2ZkbGVha3NfZW50ZXIgKCk7CisKKyAgaWYgKCFkYnVzX2ludGVybmFsX2RvX25vdF91c2VfZm9yZWFjaF9tZXNzYWdlX2ZpbGUgKHRlc3RfZGF0YV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzRm9yZWFjaE1lc3NhZ2VGaWxlRnVuYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX3RyeV9tZXNzYWdlX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZvcmVhY2hfbWVzc2FnZV9maWxlIHRlc3QgZmFpbGVkIik7CisKKyAgX2RidXNfY2hlY2tfZmRsZWFrc19sZWF2ZSAoaW5pdGlhbF9mZHMpOworCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtbWVzc2FnZS5jIGIvZGJ1cy9kYnVzL2RidXMtbWVzc2FnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYmNlZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1tZXNzYWdlLmMKQEAgLTAsMCArMSw0NzY3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWVzc2FnZS5jICBEQnVzTWVzc2FnZSBvYmplY3QKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgIFJlZCBIYXQgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC12YWxpZGF0ZS5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1ieXRlc3dhcC5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1oZWFkZXIuaCIKKyNpbmNsdWRlICJkYnVzLXNpZ25hdHVyZS5oIgorI2luY2x1ZGUgImRidXMtbWVzc2FnZS1wcml2YXRlLmgiCisjaW5jbHVkZSAiZGJ1cy1vYmplY3QtdHJlZS5oIgorI2luY2x1ZGUgImRidXMtbWVtb3J5LmgiCisjaW5jbHVkZSAiZGJ1cy1saXN0LmgiCisjaW5jbHVkZSAiZGJ1cy10aHJlYWRzLWludGVybmFsLmgiCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMtdW5peC5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBfREJVU19UWVBFX0lTX1NUUklOR0xJS0UodHlwZSkgXAorICAodHlwZSA9PSBEQlVTX1RZUEVfU1RSSU5HIHx8IHR5cGUgPT0gREJVU19UWVBFX1NJR05BVFVSRSB8fCBcCisgICB0eXBlID09IERCVVNfVFlQRV9PQkpFQ1RfUEFUSCkKKworc3RhdGljIHZvaWQgZGJ1c19tZXNzYWdlX2ZpbmFsaXplIChEQnVzTWVzc2FnZSAqbWVzc2FnZSk7CisKKy8qKgorICogQGRlZmdyb3VwIERCdXNNZXNzYWdlSW50ZXJuYWxzIERCdXNNZXNzYWdlIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqIEBpbmdyb3VwIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBEQnVzTWVzc2FnZSBwcml2YXRlIGltcGxlbWVudGF0aW9uIGRldGFpbHMuCisgKgorICogVGhlIGd1dHMgb2YgREJ1c01lc3NhZ2UgYW5kIGl0cyBtZXRob2RzLgorICoKKyAqIEB7CisgKi8KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfZW5hYmxlX21lc3NhZ2VfY2FjaGUgKHZvaWQpCit7CisgIHN0YXRpYyBpbnQgZW5hYmxlZCA9IC0xOworCisgIGlmIChlbmFibGVkIDwgMCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpzID0gX2RidXNfZ2V0ZW52ICgiREJVU19NRVNTQUdFX0NBQ0hFIik7CisKKyAgICAgIGVuYWJsZWQgPSBUUlVFOworCisgICAgICBpZiAocyAmJiAqcykKKyAgICAgICAgeworICAgICAgICAgIGlmICgqcyA9PSAnMCcpCisgICAgICAgICAgICBlbmFibGVkID0gRkFMU0U7CisgICAgICAgICAgZWxzZSBpZiAoKnMgPT0gJzEnKQorICAgICAgICAgICAgZW5hYmxlZCA9IFRSVUU7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgX2RidXNfd2FybiAoIkRCVVNfTUVTU0FHRV9DQUNIRSBzaG91bGQgYmUgMCBvciAxIGlmIHNldCwgbm90ICclcyciLAorICAgICAgICAgICAgICAgIHMpOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBlbmFibGVkOworfQorI2Vsc2UKKyAgICAvKiBjb25zdGFudCBleHByZXNzaW9uLCBzaG91bGQgYmUgb3B0aW1pemVkIGF3YXkgKi8KKyMgICBkZWZpbmUgX2RidXNfZW5hYmxlX21lc3NhZ2VfY2FjaGUoKSAoVFJVRSkKKyNlbmRpZgorCisjaWZuZGVmIF9kYnVzX21lc3NhZ2VfdHJhY2VfcmVmCit2b2lkCitfZGJ1c19tZXNzYWdlX3RyYWNlX3JlZiAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIG9sZF9yZWZjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgbmV3X3JlZmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICp3aHkpCit7CisgIHN0YXRpYyBpbnQgZW5hYmxlZCA9IC0xOworCisgIF9kYnVzX3RyYWNlX3JlZiAoIkRCdXNNZXNzYWdlIiwgbWVzc2FnZSwgb2xkX3JlZmNvdW50LCBuZXdfcmVmY291bnQsIHdoeSwKKyAgICAgICJEQlVTX01FU1NBR0VfVFJBQ0UiLCAmZW5hYmxlZCk7Cit9CisjZW5kaWYKKworLyogTm90IHRocmVhZCBsb2NrZWQsIGJ1dCBzdHJpY3RseSBjb25zdC9yZWFkLW9ubHkgc28gc2hvdWxkIGJlIE9LCisgKi8KKy8qKiBBbiBzdGF0aWMgc3RyaW5nIHJlcHJlc2VudGluZyBhbiBlbXB0eSBzaWduYXR1cmUgKi8KK19EQlVTX1NUUklOR19ERUZJTkVfU1RBVElDKF9kYnVzX2VtcHR5X3NpZ25hdHVyZV9zdHIsICAiIik7CisKKy8qIHRoZXNlIGhhdmUgd2Fja3kgdmFsdWVzIHRvIGhlbHAgdHJhcCB1bmluaXRpYWxpemVkIGl0ZXJhdG9yczsKKyAqIGJ1dCBoYXMgdG8gZml0IGluIDMgYml0cworICovCitlbnVtIHsKKyAgREJVU19NRVNTQUdFX0lURVJfVFlQRV9SRUFERVIgPSAzLAorICBEQlVTX01FU1NBR0VfSVRFUl9UWVBFX1dSSVRFUiA9IDcKK307CisKKy8qKiB0eXBlZGVmIGZvciBpbnRlcm5hbHMgb2YgbWVzc2FnZSBpdGVyYXRvciAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c01lc3NhZ2VSZWFsSXRlciBEQnVzTWVzc2FnZVJlYWxJdGVyOworCisvKioKKyAqIEBicmllZiBJbnRlcm5hbHMgb2YgREJ1c01lc3NhZ2VJdGVyCisgKgorICogT2JqZWN0IHJlcHJlc2VudGluZyBhIHBvc2l0aW9uIGluIGEgbWVzc2FnZS4gQWxsIGZpZWxkcyBhcmUgaW50ZXJuYWwuCisgKi8KK3N0cnVjdCBEQnVzTWVzc2FnZVJlYWxJdGVyCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOyAvKio8IE1lc3NhZ2UgdXNlZCAqLworICBkYnVzX3VpbnQzMl90IGNoYW5nZWRfc3RhbXAgOiBDSEFOR0VEX1NUQU1QX0JJVFM7IC8qKjwgc3RhbXAgdG8gZGV0ZWN0IGludmFsaWQgaXRlcnMgKi8KKyAgZGJ1c191aW50MzJfdCBpdGVyX3R5cGUgOiAzOyAgICAgIC8qKjwgd2hldGhlciB0aGlzIGlzIGEgcmVhZGVyIG9yIHdyaXRlciBpdGVyICovCisgIGRidXNfdWludDMyX3Qgc2lnX3JlZmNvdW50IDogODsgICAvKio8IGRlcHRoIG9mIG9wZW5fc2lnbmF0dXJlKCkgKi8KKyAgdW5pb24KKyAgeworICAgIERCdXNUeXBlV3JpdGVyIHdyaXRlcjsgLyoqPCB3cml0ZXIgKi8KKyAgICBEQnVzVHlwZVJlYWRlciByZWFkZXI7IC8qKjwgcmVhZGVyICovCisgIH0gdTsgLyoqPCB0aGUgdHlwZSB3cml0ZXIgb3IgcmVhZGVyIHRoYXQgZG9lcyBhbGwgdGhlIHdvcmsgKi8KK307CisKK3N0YXRpYyB2b2lkCitnZXRfY29uc3Rfc2lnbmF0dXJlIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqKnR5cGVfc3RyX3AsCisgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqdHlwZV9wb3NfcCkKK3sKKyAgaWYgKF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfcmF3IChoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfc3RyX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9wb3NfcCkpCisgICAgeworICAgICAgKnR5cGVfcG9zX3AgKz0gMTsgLyogc2tpcCB0aGUgc2lnbmF0dXJlIGxlbmd0aCB3aGljaCBpcyAxIGJ5dGUgKi8KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAqdHlwZV9zdHJfcCA9ICZfZGJ1c19lbXB0eV9zaWduYXR1cmVfc3RyOworICAgICAgKnR5cGVfcG9zX3AgPSAwOworICAgIH0KK30KKworLyoqCisgKiBTd2FwcyB0aGUgbWVzc2FnZSB0byBjb21waWxlciBieXRlIG9yZGVyIGlmIHJlcXVpcmVkCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqLworc3RhdGljIHZvaWQKK19kYnVzX21lc3NhZ2VfYnl0ZXN3YXAgKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBjb25zdCBEQnVzU3RyaW5nICp0eXBlX3N0cjsKKyAgaW50IHR5cGVfcG9zOworICBjaGFyIGJ5dGVfb3JkZXI7CisKKyAgYnl0ZV9vcmRlciA9IF9kYnVzX2hlYWRlcl9nZXRfYnl0ZV9vcmRlciAoJm1lc3NhZ2UtPmhlYWRlcik7CisKKyAgaWYgKGJ5dGVfb3JkZXIgPT0gREJVU19DT01QSUxFUl9CWVRFX09SREVSKQorICAgIHJldHVybjsKKworICBfZGJ1c192ZXJib3NlICgiU3dhcHBpbmcgbWVzc2FnZSBpbnRvIGNvbXBpbGVyIGJ5dGUgb3JkZXJcbiIpOworICAKKyAgZ2V0X2NvbnN0X3NpZ25hdHVyZSAoJm1lc3NhZ2UtPmhlYWRlciwgJnR5cGVfc3RyLCAmdHlwZV9wb3MpOworICAKKyAgX2RidXNfbWFyc2hhbF9ieXRlc3dhcCAodHlwZV9zdHIsIHR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlLT5ib2R5LCAwKTsKKworICBfZGJ1c19oZWFkZXJfYnl0ZXN3YXAgKCZtZXNzYWdlLT5oZWFkZXIsIERCVVNfQ09NUElMRVJfQllURV9PUkRFUik7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfaGVhZGVyX2dldF9ieXRlX29yZGVyICgmbWVzc2FnZS0+aGVhZGVyKSA9PQorICAgICAgICAgICAgICAgIERCVVNfQ09NUElMRVJfQllURV9PUkRFUik7Cit9CisKKy8qKiBieXRlLXN3YXAgdGhlIG1lc3NhZ2UgaWYgaXQgZG9lc24ndCBtYXRjaCBvdXIgYnl0ZSBvcmRlci4KKyAqICBDYWxsZWQgb25seSB3aGVuIHdlIG5lZWQgdGhlIG1lc3NhZ2UgaW4gb3VyIG93biBieXRlIG9yZGVyLAorICogIG5vcm1hbGx5IHdoZW4gcmVhZGluZyBhcnJheXMgb2YgaW50ZWdlcnMgb3IgZG91Ymxlcy4KKyAqICBPdGhlcndpc2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgc2luY2UgaXQgd291bGQgZG8gbmVlZGxlc3MKKyAqICB3b3JrLgorICovCisjZGVmaW5lIGVuc3VyZV9ieXRlX29yZGVyKG1lc3NhZ2UpIF9kYnVzX21lc3NhZ2VfYnl0ZXN3YXAgKG1lc3NhZ2UpCisKKy8qKgorICogR2V0cyB0aGUgZGF0YSB0byBiZSBzZW50IG92ZXIgdGhlIG5ldHdvcmsgZm9yIHRoaXMgbWVzc2FnZS4KKyAqIFRoZSBoZWFkZXIgYW5kIHRoZW4gdGhlIGJvZHkgc2hvdWxkIGJlIHdyaXR0ZW4gb3V0LgorICogVGhpcyBmdW5jdGlvbiBpcyBndWFyYW50ZWVkIHRvIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUKKyAqIGRhdGEgb25jZSBhIG1lc3NhZ2UgaXMgbG9ja2VkICh3aXRoIGRidXNfbWVzc2FnZV9sb2NrKCkpLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlLgorICogQHBhcmFtIGhlYWRlciByZXR1cm4gbG9jYXRpb24gZm9yIG1lc3NhZ2UgaGVhZGVyIGRhdGEuCisgKiBAcGFyYW0gYm9keSByZXR1cm4gbG9jYXRpb24gZm9yIG1lc3NhZ2UgYm9keSBkYXRhLgorICovCit2b2lkCitfZGJ1c19tZXNzYWdlX2dldF9uZXR3b3JrX2RhdGEgKERCdXNNZXNzYWdlICAgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICoqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICoqYm9keSkKK3sKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlLT5sb2NrZWQpOworCisgICpoZWFkZXIgPSAmbWVzc2FnZS0+aGVhZGVyLmRhdGE7CisgICpib2R5ID0gJm1lc3NhZ2UtPmJvZHk7Cit9CisKKy8qKgorICogR2V0cyB0aGUgdW5peCBmZHMgdG8gYmUgc2VudCBvdmVyIHRoZSBuZXR3b3JrIGZvciB0aGlzIG1lc3NhZ2UuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gYWx3YXlzIHJldHVybiB0aGUgc2FtZSBkYXRhIG9uY2UgYQorICogbWVzc2FnZSBpcyBsb2NrZWQgKHdpdGggZGJ1c19tZXNzYWdlX2xvY2soKSkuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UuCisgKiBAcGFyYW0gZmRzIHJldHVybiBsb2NhdGlvbiBvZiB1bml4IGZkIGFycmF5CisgKiBAcGFyYW0gbl9mZHMgcmV0dXJuIG51bWJlciBvZiBlbnRyaWVzIGluIGFycmF5CisgKi8KK3ZvaWQgX2RidXNfbWVzc2FnZV9nZXRfdW5peF9mZHMoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgKipmZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICAgICpuX2ZkcykKK3sKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlLT5sb2NrZWQpOworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgKmZkcyA9IG1lc3NhZ2UtPnVuaXhfZmRzOworICAqbl9mZHMgPSBtZXNzYWdlLT5uX3VuaXhfZmRzOworI2Vsc2UKKyAgKmZkcyA9IE5VTEw7CisgICpuX2ZkcyA9IDA7CisjZW5kaWYKK30KKworLyoqCisgKiBTZXRzIHRoZSBzZXJpYWwgbnVtYmVyIG9mIGEgbWVzc2FnZS4KKyAqIFRoaXMgY2FuIG9ubHkgYmUgZG9uZSBvbmNlIG9uIGEgbWVzc2FnZS4KKyAqCisgKiBEQnVzQ29ubmVjdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSBzZXJpYWwgdG8gYW4gYXBwcm9wcmlhdGUgdmFsdWUgCisgKiB3aGVuIHRoZSBtZXNzYWdlIGlzIHNlbnQ7IHRoaXMgZnVuY3Rpb24gaXMgb25seSBuZWVkZWQgd2hlbiBlbmNhcHN1bGF0aW5nIAorICogbWVzc2FnZXMgaW4gYW5vdGhlciBwcm90b2NvbCwgb3Igb3RoZXJ3aXNlIGJ5cGFzc2luZyBEQnVzQ29ubmVjdGlvbi4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIHNlcmlhbCB0aGUgc2VyaWFsCisgKi8KK3ZvaWQgCitkYnVzX21lc3NhZ2Vfc2V0X3NlcmlhbCAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICBzZXJpYWwpCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoIW1lc3NhZ2UtPmxvY2tlZCk7CisKKyAgX2RidXNfaGVhZGVyX3NldF9zZXJpYWwgKCZtZXNzYWdlLT5oZWFkZXIsIHNlcmlhbCk7Cit9CisKKy8qKgorICogQWRkcyBhIGNvdW50ZXIgdG8gYmUgaW5jcmVtZW50ZWQgaW1tZWRpYXRlbHkgd2l0aCB0aGUgc2l6ZS91bml4IGZkcworICogb2YgdGhpcyBtZXNzYWdlLCBhbmQgZGVjcmVtZW50ZWQgYnkgdGhlIHNpemUvdW5peCBmZHMgb2YgdGhpcworICogbWVzc2FnZSB3aGVuIHRoaXMgbWVzc2FnZSBpZiBmaW5hbGl6ZWQuICBUaGUgbGluayBjb250YWlucyBhCisgKiBjb3VudGVyIHdpdGggaXRzIHJlZmNvdW50IGFscmVhZHkgaW5jcmVtZW50ZWQsIGJ1dCB0aGUgY291bnRlcgorICogaXRzZWxmIG5vdCBpbmNyZW1lbnRlZC4gIE93bmVyc2hpcCBvZiBsaW5rIGFuZCBjb3VudGVyIHJlZmNvdW50IGlzCisgKiBwYXNzZWQgdG8gdGhlIG1lc3NhZ2UuCisgKgorICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIHdpdGggbG9ja3MgaGVsZC4gQXMgYSByZXN1bHQsIHRoZSBjb3VudGVyJ3MKKyAqIG5vdGlmeSBmdW5jdGlvbiBpcyBub3QgY2FsbGVkOyB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGVpdGhlciBjYWxsCisgKiBfZGJ1c19jb3VudGVyX25vdGlmeSgpIG9uIHRoZSBjb3VudGVyIHdoZW4gdGhleSBhcmUgbm8gbG9uZ2VyIGhvbGRpbmcKKyAqIGxvY2tzLCBvciB0YWtlIHRoZSBzYW1lIGFjdGlvbiB0aGF0IHdvdWxkIGJlIHRha2VuIGJ5IHRoZSBub3RpZnkgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBsaW5rIGxpbmsgd2l0aCBjb3VudGVyIGFzIGRhdGEKKyAqLwordm9pZAorX2RidXNfbWVzc2FnZV9hZGRfY291bnRlcl9saW5rIChEQnVzTWVzc2FnZSAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAqbGluaykKK3sKKyAgLyogcmlnaHQgbm93IHdlIGRvbid0IHJlY29tcHV0ZSB0aGUgZGVsdGEgd2hlbiBtZXNzYWdlCisgICAqIHNpemUgY2hhbmdlcywgYW5kIHRoYXQncyBPSyBmb3IgY3VycmVudCBwdXJwb3NlcworICAgKiBJIHRoaW5rLCBidXQgY291bGQgYmUgaW1wb3J0YW50IHRvIGNoYW5nZSBsYXRlci4KKyAgICogRG8gcmVjb21wdXRlIGl0IHdoZW5ldmVyIHRoZXJlIGFyZSBubyBvdXRzdGFuZGluZyBjb3VudGVycywKKyAgICogc2luY2UgaXQncyBiYXNpY2FsbHkgZnJlZS4KKyAgICovCisgIGlmIChtZXNzYWdlLT5jb3VudGVycyA9PSBOVUxMKQorICAgIHsKKyAgICAgIG1lc3NhZ2UtPnNpemVfY291bnRlcl9kZWx0YSA9CisgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+aGVhZGVyLmRhdGEpICsKKyAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZtZXNzYWdlLT5ib2R5KTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgICAgICBtZXNzYWdlLT51bml4X2ZkX2NvdW50ZXJfZGVsdGEgPSBtZXNzYWdlLT5uX3VuaXhfZmRzOworI2VuZGlmCisKKyNpZiAwCisgICAgICBfZGJ1c192ZXJib3NlICgibWVzc2FnZSBoYXMgc2l6ZSAlbGRcbiIsCisgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLT5zaXplX2NvdW50ZXJfZGVsdGEpOworI2VuZGlmCisgICAgfQorCisgIF9kYnVzX2xpc3RfYXBwZW5kX2xpbmsgKCZtZXNzYWdlLT5jb3VudGVycywgbGluayk7CisKKyAgX2RidXNfY291bnRlcl9hZGp1c3Rfc2l6ZSAobGluay0+ZGF0YSwgbWVzc2FnZS0+c2l6ZV9jb3VudGVyX2RlbHRhKTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIF9kYnVzX2NvdW50ZXJfYWRqdXN0X3VuaXhfZmQgKGxpbmstPmRhdGEsIG1lc3NhZ2UtPnVuaXhfZmRfY291bnRlcl9kZWx0YSk7CisjZW5kaWYKK30KKworLyoqCisgKiBBZGRzIGEgY291bnRlciB0byBiZSBpbmNyZW1lbnRlZCBpbW1lZGlhdGVseSB3aXRoIHRoZSBzaXplL3VuaXggZmRzCisgKiBvZiB0aGlzIG1lc3NhZ2UsIGFuZCBkZWNyZW1lbnRlZCBieSB0aGUgc2l6ZS91bml4IGZkcyBvZiB0aGlzCisgKiBtZXNzYWdlIHdoZW4gdGhpcyBtZXNzYWdlIGlmIGZpbmFsaXplZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgd2l0aCBsb2NrcyBoZWxkLiBBcyBhIHJlc3VsdCwgdGhlIGNvdW50ZXIncworICogbm90aWZ5IGZ1bmN0aW9uIGlzIG5vdCBjYWxsZWQ7IHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gZWl0aGVyIGNhbGwKKyAqIF9kYnVzX2NvdW50ZXJfbm90aWZ5KCkgb24gdGhlIGNvdW50ZXIgd2hlbiB0aGV5IGFyZSBubyBsb25nZXIgaG9sZGluZworICogbG9ja3MsIG9yIHRha2UgdGhlIHNhbWUgYWN0aW9uIHRoYXQgd291bGQgYmUgdGFrZW4gYnkgdGhlIG5vdGlmeSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIGNvdW50ZXIgdGhlIGNvdW50ZXIKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX21lc3NhZ2VfYWRkX2NvdW50ZXIgKERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NvdW50ZXIgKmNvdW50ZXIpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2FsbG9jX2xpbmsgKGNvdW50ZXIpOworICBpZiAobGluayA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19jb3VudGVyX3JlZiAoY291bnRlcik7CisgIF9kYnVzX21lc3NhZ2VfYWRkX2NvdW50ZXJfbGluayAobWVzc2FnZSwgbGluayk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogUmVtb3ZlcyBhIGNvdW50ZXIgdHJhY2tpbmcgdGhlIHNpemUvdW5peCBmZHMgb2YgdGhpcyBtZXNzYWdlLCBhbmQKKyAqIGRlY3JlbWVudHMgdGhlIGNvdW50ZXIgYnkgdGhlIHNpemUvdW5peCBmZHMgb2YgdGhpcyBtZXNzYWdlLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gY291bnRlciB0aGUgY291bnRlcgorICovCit2b2lkCitfZGJ1c19tZXNzYWdlX3JlbW92ZV9jb3VudGVyIChEQnVzTWVzc2FnZSAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ291bnRlciAgKmNvdW50ZXIpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2ZpbmRfbGFzdCAoJm1lc3NhZ2UtPmNvdW50ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXIpOworICBfZGJ1c19hc3NlcnQgKGxpbmsgIT0gTlVMTCk7CisKKyAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAoJm1lc3NhZ2UtPmNvdW50ZXJzLCBsaW5rKTsKKworICBfZGJ1c19jb3VudGVyX2FkanVzdF9zaXplIChjb3VudGVyLCAtIG1lc3NhZ2UtPnNpemVfY291bnRlcl9kZWx0YSk7CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICBfZGJ1c19jb3VudGVyX2FkanVzdF91bml4X2ZkIChjb3VudGVyLCAtIG1lc3NhZ2UtPnVuaXhfZmRfY291bnRlcl9kZWx0YSk7CisjZW5kaWYKKworICBfZGJ1c19jb3VudGVyX25vdGlmeSAoY291bnRlcik7CisgIF9kYnVzX2NvdW50ZXJfdW5yZWYgKGNvdW50ZXIpOworfQorCisvKioKKyAqIExvY2tzIGEgbWVzc2FnZS4gQWxsb3dzIGNoZWNraW5nIHRoYXQgYXBwbGljYXRpb25zIGRvbid0IGtlZXAgYQorICogcmVmZXJlbmNlIHRvIGEgbWVzc2FnZSBpbiB0aGUgb3V0Z29pbmcgcXVldWUgYW5kIGNoYW5nZSBpdAorICogdW5kZXJuZWF0aCB1cy4gTWVzc2FnZXMgYXJlIGxvY2tlZCB3aGVuIHRoZXkgZW50ZXIgdGhlIG91dGdvaW5nCisgKiBxdWV1ZSAoZGJ1c19jb25uZWN0aW9uX3NlbmRfbWVzc2FnZSgpKSwgYW5kIHRoZSBsaWJyYXJ5IGNvbXBsYWlucworICogaWYgdGhlIG1lc3NhZ2UgaXMgbW9kaWZpZWQgd2hpbGUgbG9ja2VkLiBUaGlzIGZ1bmN0aW9uIG1heSBhbHNvIAorICogY2FsbGVkIGV4dGVybmFsbHksIGZvciBhcHBsaWNhdGlvbnMgd3JhcHBpbmcgRC1CdXMgaW4gYW5vdGhlciBwcm90b2NvbC4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBsb2NrLgorICovCit2b2lkCitkYnVzX21lc3NhZ2VfbG9jayAoREJ1c01lc3NhZ2UgICptZXNzYWdlKQoreworICBpZiAoIW1lc3NhZ2UtPmxvY2tlZCkKKyAgICB7CisgICAgICBfZGJ1c19oZWFkZXJfdXBkYXRlX2xlbmd0aHMgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+Ym9keSkpOworCisgICAgICAvKiBtdXN0IGhhdmUgYSBzaWduYXR1cmUgaWYgeW91IGhhdmUgYSBib2R5ICovCisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+Ym9keSkgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSkgIT0gTlVMTCk7CisKKyAgICAgIG1lc3NhZ2UtPmxvY2tlZCA9IFRSVUU7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NldF9vcl9kZWxldGVfc3RyaW5nX2ZpZWxkIChEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHR5cGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICp2YWx1ZSkKK3sKKyAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgcmV0dXJuIF9kYnVzX2hlYWRlcl9kZWxldGVfZmllbGQgKCZtZXNzYWdlLT5oZWFkZXIsIGZpZWxkKTsKKyAgZWxzZQorICAgIHJldHVybiBfZGJ1c19oZWFkZXJfc2V0X2ZpZWxkX2Jhc2ljICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSk7Cit9CisKKyNpZiAwCisvKiBQcm9iYWJseSB3ZSBkb24ndCBuZWVkIHRvIHVzZSB0aGlzICovCisvKioKKyAqIFNldHMgdGhlIHNpZ25hdHVyZSBvZiB0aGUgbWVzc2FnZSwgaS5lLiB0aGUgYXJndW1lbnRzIGluIHRoZQorICogbWVzc2FnZSBwYXlsb2FkLiBUaGUgc2lnbmF0dXJlIGluY2x1ZGVzIG9ubHkgImluIiBhcmd1bWVudHMgZm9yCisgKiAjREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwgYW5kIG9ubHkgIm91dCIgYXJndW1lbnRzIGZvcgorICogI0RCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4sIHNvIGlzIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tCisgKiB3aGF0IHlvdSBtaWdodCBleHBlY3QgKGl0IGRvZXMgbm90IGluY2x1ZGUgdGhlIHNpZ25hdHVyZSBvZiB0aGUKKyAqIGVudGlyZSBDKystc3R5bGUgbWV0aG9kKS4KKyAqCisgKiBUaGUgc2lnbmF0dXJlIGlzIGEgc3RyaW5nIG1hZGUgdXAgb2YgdHlwZSBjb2RlcyBzdWNoIGFzCisgKiAjREJVU19UWVBFX0lOVDMyLiBUaGUgc3RyaW5nIGlzIHRlcm1pbmF0ZWQgd2l0aCBudWwgKG51bCBpcyBhbHNvCisgKiB0aGUgdmFsdWUgb2YgI0RCVVNfVFlQRV9JTlZBTElEKS4gVGhlIG1hY3JvcyBzdWNoIGFzCisgKiAjREJVU19UWVBFX0lOVDMyIGV2YWx1YXRlIHRvIGludGVnZXJzOyB0byBhc3NlbWJsZSBhIHNpZ25hdHVyZSB5b3UKKyAqIG1heSBmaW5kIGl0IHVzZWZ1bCB0byB1c2UgdGhlIHN0cmluZyBmb3Jtcywgc3VjaCBhcworICogI0RCVVNfVFlQRV9JTlQzMl9BU19TVFJJTkcuCisgKgorICogQW4gInVuc2V0IiBvciAjTlVMTCBzaWduYXR1cmUgaXMgY29uc2lkZXJlZCB0aGUgc2FtZSBhcyBhbiBlbXB0eQorICogc2lnbmF0dXJlLiBJbiBmYWN0IGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlKCkgd2lsbCBuZXZlciByZXR1cm4KKyAqICNOVUxMLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gc2lnbmF0dXJlIHRoZSB0eXBlIHNpZ25hdHVyZSBvciAjTlVMTCB0byB1bnNldAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX21lc3NhZ2Vfc2V0X3NpZ25hdHVyZSAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpzaWduYXR1cmUpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoIW1lc3NhZ2UtPmxvY2tlZCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNpZ25hdHVyZSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfY2hlY2tfaXNfdmFsaWRfc2lnbmF0dXJlIChzaWduYXR1cmUpKTsKKyAgLyogY2FuJ3QgZGVsZXRlIHRoZSBzaWduYXR1cmUgaWYgeW91IGhhdmUgYSBtZXNzYWdlIGJvZHkgKi8KKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmJvZHkpID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUgIT0gTlVMTCk7CisKKyAgcmV0dXJuIHNldF9vcl9kZWxldGVfc3RyaW5nX2ZpZWxkIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSk7Cit9CisjZW5kaWYKKworLyogTWVzc2FnZSBDYWNoZQorICoKKyAqIFdlIGNhY2hlIHNvbWUgREJ1c01lc3NhZ2UgdG8gcmVkdWNlIHRoZSBvdmVyaGVhZCBvZiBhbGxvY2F0aW5nCisgKiB0aGVtLiAgSW4gbXkgcHJvZmlsaW5nIHRoaXMgY29uc2lzdGVudGx5IG1hZGUgYWJvdXQgYW4gOCUKKyAqIGRpZmZlcmVuY2UuICBJdCBhdm9pZHMgdGhlIG1hbGxvYyBmb3IgdGhlIG1lc3NhZ2UsIHRoZSBtYWxsb2MgZm9yCisgKiB0aGUgc2xvdCBsaXN0LCB0aGUgbWFsbG9jIGZvciB0aGUgaGVhZGVyIHN0cmluZyBhbmQgYm9keSBzdHJpbmcsCisgKiBhbmQgdGhlIGFzc29jaWF0ZWQgZnJlZSgpIGNhbGxzLiBJdCBkb2VzIGludHJvZHVjZSBhbm90aGVyIGdsb2JhbAorICogbG9jayB3aGljaCBjb3VsZCBiZSBhIHBlcmZvcm1hbmNlIGlzc3VlIGluIGNlcnRhaW4gY2FzZXMuCisgKgorICogRm9yIHRoZSBlY2hvIGNsaWVudC9zZXJ2ZXIgdGhlIHJvdW5kIHRyaXAgdGltZSBnb2VzIGZyb20gYXJvdW5kCisgKiAuMDAwMDc3IHRvIC4wMDAwNjkgd2l0aCB0aGUgbWVzc2FnZSBjYWNoZSBvbiBteSBsYXB0b3AuIFRoZSBzeXNwcm9mCisgKiBjaGFuZ2UgaXMgYXMgZm9sbG93cyAobnVtYmVycyBhcmUgY3VtdWxhdGl2ZSBwZXJjZW50YWdlKToKKyAqCisgKiAgd2l0aCBtZXNzYWdlIGNhY2hlIGltcGxlbWVudGVkIGFzIGFycmF5IGFzIGl0IGlzIG5vdyAoMC4wMDAwNjkgcGVyKToKKyAqICAgIG5ld19lbXB0eV9oZWFkZXIgICAgICAgICAgIDEuNDYKKyAqICAgICAgbXV0ZXhfbG9jayAgICAgICAgICAgICAgIDAuNTYgICAgIyBpLmUuIF9EQlVTX0xPQ0sobWVzc2FnZV9jYWNoZSkKKyAqICAgICAgbXV0ZXhfdW5sb2NrICAgICAgICAgICAgIDAuMjUKKyAqICAgICAgc2VsZiAgICAgICAgICAgICAgICAgICAgIDAuNDEKKyAqICAgIHVucmVmICAgICAgICAgICAgICAgICAgICAgIDIuMjQKKyAqICAgICAgc2VsZiAgICAgICAgICAgICAgICAgICAgIDAuNjgKKyAqICAgICAgbGlzdF9jbGVhciAgICAgICAgICAgICAgIDAuNDMKKyAqICAgICAgbXV0ZXhfbG9jayAgICAgICAgICAgICAgIDAuMzMgICAgIyBpLmUuIF9EQlVTX0xPQ0sobWVzc2FnZV9jYWNoZSkKKyAqICAgICAgbXV0ZXhfdW5sb2NrICAgICAgICAgICAgIDAuMjUKKyAqCisgKiAgd2l0aCBtZXNzYWdlIGNhY2hlIGltcGxlbWVudGVkIGFzIGxpc3QgKDAuMDAwMDcwIHBlciByb3VuZHRyaXApOgorICogICAgbmV3X2VtcHR5X2hlYWRlciAgICAgICAgICAgMi43MgorICogICAgICBsaXN0X3BvcF9maXJzdCAgICAgICAgICAgMS44OAorICogICAgdW5yZWYgICAgICAgICAgICAgICAgICAgICAgMy4zCisgKiAgICAgIGxpc3RfcHJlcGVuZCAgICAgICAgICAgICAxLjYzCisgKgorICogd2l0aG91dCBjYWNoZSAoMC4wMDAwNzcgcGVyIHJvdW5kdHJpcCk6CisgKiAgICBuZXdfZW1wdHlfaGVhZGVyICAgICAgICAgICA2LjcKKyAqICAgICAgc3RyaW5nX2luaXRfcHJlYWxsb2NhdGVkIDMuNDMKKyAqICAgICAgICBkYnVzX21hbGxvYyAgICAgICAgICAgIDIuNDMKKyAqICAgICAgZGJ1c19tYWxsb2MwICAgICAgICAgICAgIDIuNTkKKyAqCisgKiAgICB1bnJlZiAgICAgICAgICAgICAgICAgICAgICA0LjAyCisgKiAgICAgIHN0cmluZ19mcmVlICAgICAgICAgICAgICAxLjgyCisgKiAgICAgICAgZGJ1c19mcmVlICAgICAgICAgICAgICAxLjYzCisgKiAgICAgIGRidXNfZnJlZSAgICAgICAgICAgICAgICAwLjcxCisgKgorICogSWYgeW91IGltcGxlbWVudCB0aGUgbWVzc2FnZV9jYWNoZSB3aXRoIGEgbGlzdCwgdGhlIHByaW1hcnkgcmVhc29uCisgKiBpdCdzIHNsb3dlciBpcyB0aGF0IHlvdSBhZGQgYW5vdGhlciB0aHJlYWQgbG9jayAob24gdGhlIERCdXNMaXN0CisgKiBtZW1wb29sKS4KKyAqLworCisvKiogQXZvaWQgY2FjaGluZyBodWdlIG1lc3NhZ2VzICovCisjZGVmaW5lIE1BWF9NRVNTQUdFX1NJWkVfVE9fQ0FDSEUgMTAgKiBfREJVU19PTkVfS0lMT0JZVEUKKworLyoqIEF2b2lkIGNhY2hpbmcgdG9vIG1hbnkgbWVzc2FnZXMgKi8KKyNkZWZpbmUgTUFYX01FU1NBR0VfQ0FDSEVfU0laRSAgICA1CisKK19EQlVTX0RFRklORV9HTE9CQUxfTE9DSyAobWVzc2FnZV9jYWNoZSk7CitzdGF0aWMgREJ1c01lc3NhZ2UgKm1lc3NhZ2VfY2FjaGVbTUFYX01FU1NBR0VfQ0FDSEVfU0laRV07CitzdGF0aWMgaW50IG1lc3NhZ2VfY2FjaGVfY291bnQgPSAwOworc3RhdGljIGRidXNfYm9vbF90IG1lc3NhZ2VfY2FjaGVfc2h1dGRvd25fcmVnaXN0ZXJlZCA9IEZBTFNFOworCitzdGF0aWMgdm9pZAorZGJ1c19tZXNzYWdlX2NhY2hlX3NodXRkb3duICh2b2lkICpkYXRhKQoreworICBpbnQgaTsKKworICBfREJVU19MT0NLIChtZXNzYWdlX2NhY2hlKTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBNQVhfTUVTU0FHRV9DQUNIRV9TSVpFKQorICAgIHsKKyAgICAgIGlmIChtZXNzYWdlX2NhY2hlW2ldKQorICAgICAgICBkYnVzX21lc3NhZ2VfZmluYWxpemUgKG1lc3NhZ2VfY2FjaGVbaV0pOworCisgICAgICArK2k7CisgICAgfQorCisgIG1lc3NhZ2VfY2FjaGVfY291bnQgPSAwOworICBtZXNzYWdlX2NhY2hlX3NodXRkb3duX3JlZ2lzdGVyZWQgPSBGQUxTRTsKKworICBfREJVU19VTkxPQ0sgKG1lc3NhZ2VfY2FjaGUpOworfQorCisvKioKKyAqIFRyaWVzIHRvIGdldCBhIG1lc3NhZ2UgZnJvbSB0aGUgbWVzc2FnZSBjYWNoZS4gIFRoZSByZXRyaWV2ZWQKKyAqIG1lc3NhZ2Ugd2lsbCBoYXZlIGp1bmsgaW4gaXQsIHNvIGl0IHN0aWxsIG5lZWRzIHRvIGJlIGNsZWFyZWQgb3V0CisgKiBpbiBkYnVzX21lc3NhZ2VfbmV3X2VtcHR5X2hlYWRlcigpCisgKgorICogQHJldHVybnMgdGhlIG1lc3NhZ2UsIG9yICNOVUxMIGlmIG5vbmUgY2FjaGVkCisgKi8KK3N0YXRpYyBEQnVzTWVzc2FnZSoKK2RidXNfbWVzc2FnZV9nZXRfY2FjaGVkICh2b2lkKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgaW50IGk7CisKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgX0RCVVNfTE9DSyAobWVzc2FnZV9jYWNoZSk7CisKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlX2NhY2hlX2NvdW50ID49IDApOworCisgIGlmIChtZXNzYWdlX2NhY2hlX2NvdW50ID09IDApCisgICAgeworICAgICAgX0RCVVNfVU5MT0NLIChtZXNzYWdlX2NhY2hlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBUaGlzIGlzIG5vdCBuZWNlc3NhcmlseSB0cnVlIHVubGVzcyBjb3VudCA+IDAsIGFuZAorICAgKiBtZXNzYWdlX2NhY2hlIGlzIHVuaW5pdGlhbGl6ZWQgdW50aWwgdGhlIHNodXRkb3duIGlzCisgICAqIHJlZ2lzdGVyZWQKKyAgICovCisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZV9jYWNoZV9zaHV0ZG93bl9yZWdpc3RlcmVkKTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBNQVhfTUVTU0FHRV9DQUNIRV9TSVpFKQorICAgIHsKKyAgICAgIGlmIChtZXNzYWdlX2NhY2hlW2ldKQorICAgICAgICB7CisgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VfY2FjaGVbaV07CisgICAgICAgICAgbWVzc2FnZV9jYWNoZVtpXSA9IE5VTEw7CisgICAgICAgICAgbWVzc2FnZV9jYWNoZV9jb3VudCAtPSAxOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICArK2k7CisgICAgfQorICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2VfY2FjaGVfY291bnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoaSA8IE1BWF9NRVNTQUdFX0NBQ0hFX1NJWkUpOworICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UgIT0gTlVMTCk7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19hdG9taWNfZ2V0ICgmbWVzc2FnZS0+cmVmY291bnQpID09IDApOworCisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZS0+Y291bnRlcnMgPT0gTlVMTCk7CisgIAorICBfREJVU19VTkxPQ0sgKG1lc3NhZ2VfY2FjaGUpOworCisgIHJldHVybiBtZXNzYWdlOworfQorCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKK3N0YXRpYyB2b2lkCitjbG9zZV91bml4X2ZkcyhpbnQgKmZkcywgdW5zaWduZWQgKm5fZmRzKQoreworICBEQnVzRXJyb3IgZTsKKyAgaW50IGk7CisKKyAgaWYgKCpuX2ZkcyA8PSAwKQorICAgIHJldHVybjsKKworICBkYnVzX2Vycm9yX2luaXQoJmUpOworCisgIGZvciAoaSA9IDA7IGkgPCAqbl9mZHM7IGkrKykKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2Nsb3NlKGZkc1tpXSwgJmUpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybigiRmFpbGVkIHRvIGNsb3NlIGZpbGUgZGVzY3JpcHRvcjogJXNcbiIsIGUubWVzc2FnZSk7CisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlKCZlKTsKKyAgICAgICAgfQorICAgIH0KKworICAqbl9mZHMgPSAwOworCisgIC8qIFdlIGRvbid0IGZyZWUgdGhlIGFycmF5IGhlcmUsIGluIGNhc2Ugd2UgY2FuIHJlY3ljbGUgaXQgbGF0ZXIgKi8KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorZnJlZV9jb3VudGVyICh2b2lkICplbGVtZW50LAorICAgICAgICAgICAgICB2b2lkICpkYXRhKQoreworICBEQnVzQ291bnRlciAqY291bnRlciA9IGVsZW1lbnQ7CisgIERCdXNNZXNzYWdlICptZXNzYWdlID0gZGF0YTsKKworICBfZGJ1c19jb3VudGVyX2FkanVzdF9zaXplIChjb3VudGVyLCAtIG1lc3NhZ2UtPnNpemVfY291bnRlcl9kZWx0YSk7CisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgX2RidXNfY291bnRlcl9hZGp1c3RfdW5peF9mZCAoY291bnRlciwgLSBtZXNzYWdlLT51bml4X2ZkX2NvdW50ZXJfZGVsdGEpOworI2VuZGlmCisKKyAgX2RidXNfY291bnRlcl9ub3RpZnkgKGNvdW50ZXIpOworICBfZGJ1c19jb3VudGVyX3VucmVmIChjb3VudGVyKTsKK30KKworLyoqCisgKiBUcmllcyB0byBjYWNoZSBhIG1lc3NhZ2UsIG90aGVyd2lzZSBmaW5hbGl6ZSBpdC4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICovCitzdGF0aWMgdm9pZAorZGJ1c19tZXNzYWdlX2NhY2hlX29yX2ZpbmFsaXplIChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgZGJ1c19ib29sX3Qgd2FzX2NhY2hlZDsKKyAgaW50IGk7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19hdG9taWNfZ2V0ICgmbWVzc2FnZS0+cmVmY291bnQpID09IDApOworCisgIC8qIFRoaXMgY2FsbHMgYXBwbGljYXRpb24gY29kZSBhbmQgaGFzIHRvIGJlIGRvbmUgZmlyc3QgdGhpbmcKKyAgICogd2l0aG91dCBob2xkaW5nIHRoZSBsb2NrCisgICAqLworICBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9jbGVhciAoJm1lc3NhZ2UtPnNsb3RfbGlzdCk7CisKKyAgX2RidXNfbGlzdF9mb3JlYWNoICgmbWVzc2FnZS0+Y291bnRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgZnJlZV9jb3VudGVyLCBtZXNzYWdlKTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJm1lc3NhZ2UtPmNvdW50ZXJzKTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIGNsb3NlX3VuaXhfZmRzKG1lc3NhZ2UtPnVuaXhfZmRzLCAmbWVzc2FnZS0+bl91bml4X2Zkcyk7CisjZW5kaWYKKworICB3YXNfY2FjaGVkID0gRkFMU0U7CisKKyAgX0RCVVNfTE9DSyAobWVzc2FnZV9jYWNoZSk7CisKKyAgaWYgKCFtZXNzYWdlX2NhY2hlX3NodXRkb3duX3JlZ2lzdGVyZWQpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChtZXNzYWdlX2NhY2hlX2NvdW50ID09IDApOworCisgICAgICBpZiAoIV9kYnVzX3JlZ2lzdGVyX3NodXRkb3duX2Z1bmMgKGRidXNfbWVzc2FnZV9jYWNoZV9zaHV0ZG93biwgTlVMTCkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChpIDwgTUFYX01FU1NBR0VfQ0FDSEVfU0laRSkKKyAgICAgICAgeworICAgICAgICAgIG1lc3NhZ2VfY2FjaGVbaV0gPSBOVUxMOworICAgICAgICAgICsraTsKKyAgICAgICAgfQorCisgICAgICBtZXNzYWdlX2NhY2hlX3NodXRkb3duX3JlZ2lzdGVyZWQgPSBUUlVFOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2VfY2FjaGVfY291bnQgPj0gMCk7CisKKyAgaWYgKCFfZGJ1c19lbmFibGVfbWVzc2FnZV9jYWNoZSAoKSkKKyAgICBnb3RvIG91dDsKKworICBpZiAoKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+aGVhZGVyLmRhdGEpICsKKyAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmJvZHkpKSA+CisgICAgICBNQVhfTUVTU0FHRV9TSVpFX1RPX0NBQ0hFKQorICAgIGdvdG8gb3V0OworCisgIGlmIChtZXNzYWdlX2NhY2hlX2NvdW50ID49IE1BWF9NRVNTQUdFX0NBQ0hFX1NJWkUpCisgICAgZ290byBvdXQ7CisKKyAgLyogRmluZCBlbXB0eSBzbG90ICovCisgIGkgPSAwOworICB3aGlsZSAobWVzc2FnZV9jYWNoZVtpXSAhPSBOVUxMKQorICAgICsraTsKKworICBfZGJ1c19hc3NlcnQgKGkgPCBNQVhfTUVTU0FHRV9DQUNIRV9TSVpFKTsKKworICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2VfY2FjaGVbaV0gPT0gTlVMTCk7CisgIG1lc3NhZ2VfY2FjaGVbaV0gPSBtZXNzYWdlOworICBtZXNzYWdlX2NhY2hlX2NvdW50ICs9IDE7CisgIHdhc19jYWNoZWQgPSBUUlVFOworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIG1lc3NhZ2UtPmluX2NhY2hlID0gVFJVRTsKKyNlbmRpZgorCisgb3V0OgorICBfZGJ1c19hc3NlcnQgKF9kYnVzX2F0b21pY19nZXQgKCZtZXNzYWdlLT5yZWZjb3VudCkgPT0gMCk7CisKKyAgX0RCVVNfVU5MT0NLIChtZXNzYWdlX2NhY2hlKTsKKyAgCisgIGlmICghd2FzX2NhY2hlZCkKKyAgICBkYnVzX21lc3NhZ2VfZmluYWxpemUgKG1lc3NhZ2UpOworfQorCisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfbWVzc2FnZV9pdGVyX2NoZWNrIChEQnVzTWVzc2FnZVJlYWxJdGVyICppdGVyKQoreworICBjaGFyIGJ5dGVfb3JkZXI7CisKKyAgaWYgKGl0ZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoImRidXMgbWVzc2FnZSBpdGVyYXRvciBpcyBOVUxMXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgYnl0ZV9vcmRlciA9IF9kYnVzX2hlYWRlcl9nZXRfYnl0ZV9vcmRlciAoJml0ZXItPm1lc3NhZ2UtPmhlYWRlcik7CisKKyAgaWYgKGl0ZXItPml0ZXJfdHlwZSA9PSBEQlVTX01FU1NBR0VfSVRFUl9UWVBFX1JFQURFUikKKyAgICB7CisgICAgICBpZiAoaXRlci0+dS5yZWFkZXIuYnl0ZV9vcmRlciAhPSBieXRlX29yZGVyKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJkYnVzIG1lc3NhZ2UgY2hhbmdlZCBieXRlIG9yZGVyIHNpbmNlIGl0ZXJhdG9yIHdhcyBjcmVhdGVkXG4iKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIC8qIGJlY2F1c2Ugd2Ugc3dhcCB0aGUgbWVzc2FnZSBpbnRvIGNvbXBpbGVyIG9yZGVyIHdoZW4geW91IGluaXQgYW4gaXRlciAqLworICAgICAgX2RidXNfYXNzZXJ0IChpdGVyLT51LnJlYWRlci5ieXRlX29yZGVyID09IERCVVNfQ09NUElMRVJfQllURV9PUkRFUik7CisgICAgfQorICBlbHNlIGlmIChpdGVyLT5pdGVyX3R5cGUgPT0gREJVU19NRVNTQUdFX0lURVJfVFlQRV9XUklURVIpCisgICAgeworICAgICAgaWYgKGl0ZXItPnUud3JpdGVyLmJ5dGVfb3JkZXIgIT0gYnl0ZV9vcmRlcikKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkICgiZGJ1cyBtZXNzYWdlIGNoYW5nZWQgYnl0ZSBvcmRlciBzaW5jZSBhcHBlbmQgaXRlcmF0b3Igd2FzIGNyZWF0ZWRcbiIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgLyogYmVjYXVzZSB3ZSBzd2FwIHRoZSBtZXNzYWdlIGludG8gY29tcGlsZXIgb3JkZXIgd2hlbiB5b3UgaW5pdCBhbiBpdGVyICovCisgICAgICBfZGJ1c19hc3NlcnQgKGl0ZXItPnUud3JpdGVyLmJ5dGVfb3JkZXIgPT0gREJVU19DT01QSUxFUl9CWVRFX09SREVSKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoImRidXMgbWVzc2FnZSBpdGVyYXRvciBsb29rcyB1bmluaXRpYWxpemVkIG9yIGNvcnJ1cHRlZFxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChpdGVyLT5jaGFuZ2VkX3N0YW1wICE9IGl0ZXItPm1lc3NhZ2UtPmNoYW5nZWRfc3RhbXApCisgICAgeworICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJkYnVzIG1lc3NhZ2UgaXRlcmF0b3IgaW52YWxpZCBiZWNhdXNlIHRoZSBtZXNzYWdlIGhhcyBiZWVuIG1vZGlmaWVkIChvciBwZXJoYXBzIHRoZSBpdGVyYXRvciBpcyBqdXN0IHVuaW5pdGlhbGl6ZWQpXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLyogREJVU19ESVNBQkxFX0NIRUNLUyAqLworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB2YXJhcmdzIGFyZy1nZXR0aW5nIGZ1bmN0aW9ucy4KKyAqIGRidXNfbWVzc2FnZV9nZXRfYXJncygpIGlzIHRoZSBwbGFjZSB0byBnbyBmb3IgY29tcGxldGUKKyAqIGRvY3VtZW50YXRpb24uCisgKgorICogQHRvZG8gVGhpcyBtYXkgbGVhayBtZW1vcnkgYW5kIGZpbGUgZGVzY3JpcHRvcnMgaWYgcGFyc2luZyBmYWlscy4gU2VlICMyMTI1OQorICoKKyAqIEBzZWUgZGJ1c19tZXNzYWdlX2dldF9hcmdzCisgKiBAcGFyYW0gaXRlciB0aGUgbWVzc2FnZSBpdGVyCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgdG8gYmUgZmlsbGVkIGluCisgKiBAcGFyYW0gZmlyc3RfYXJnX3R5cGUgdHlwZSBvZiB0aGUgZmlyc3QgYXJndW1lbnQKKyAqIEBwYXJhbSB2YXJfYXJncyByZXR1cm4gbG9jYXRpb24gZm9yIGZpcnN0IGFyZ3VtZW50LCBmb2xsb3dlZCBieSBsaXN0IG9mIHR5cGUvbG9jYXRpb24gcGFpcnMKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciB3YXMgc2V0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ3NfdmFsaXN0IChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBmaXJzdF9hcmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgICAgICAgICAgdmFyX2FyZ3MpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisgIGludCBzcGVjX3R5cGUsIG1zZ190eXBlLCBpOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19tZXNzYWdlX2l0ZXJfY2hlY2sgKHJlYWwpKTsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBzcGVjX3R5cGUgPSBmaXJzdF9hcmdfdHlwZTsKKyAgaSA9IDA7CisKKyAgd2hpbGUgKHNwZWNfdHlwZSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICB7CisgICAgICBtc2dfdHlwZSA9IGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoaXRlcik7CisKKyAgICAgIGlmIChtc2dfdHlwZSAhPSBzcGVjX3R5cGUpCisJeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJBcmd1bWVudCAlZCBpcyBzcGVjaWZpZWQgdG8gYmUgb2YgdHlwZSBcIiVzXCIsIGJ1dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpcyBhY3R1YWxseSBvZiB0eXBlIFwiJXNcIlxuIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHNwZWNfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChtc2dfdHlwZSkpOworCisgICAgICAgICAgZ290byBvdXQ7CisJfQorCisgICAgICBpZiAoc3BlY190eXBlID09IERCVVNfVFlQRV9VTklYX0ZEKQorICAgICAgICB7CisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgICAgICAgICBEQnVzQmFzaWNWYWx1ZSBpZHg7CisgICAgICAgICAgaW50ICpwZmQsIG5mZDsKKworICAgICAgICAgIHBmZCA9IHZhX2FyZyAodmFyX2FyZ3MsIGludCopOworICAgICAgICAgIF9kYnVzX2Fzc2VydChwZmQpOworCisgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYygmcmVhbC0+dS5yZWFkZXIsICZpZHgpOworCisgICAgICAgICAgaWYgKGlkeC51MzIgPj0gcmVhbC0+bWVzc2FnZS0+bl91bml4X2ZkcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOQ09OU0lTVEVOVF9NRVNTQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgcmVmZXJzIHRvIGZpbGUgZGVzY3JpcHRvciBhdCBpbmRleCAlaSwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGhhcyBvbmx5ICVpIGRlc2NyaXB0b3JzIGF0dGFjaGVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeC51MzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsLT5tZXNzYWdlLT5uX3VuaXhfZmRzKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoKG5mZCA9IF9kYnVzX2R1cChyZWFsLT5tZXNzYWdlLT51bml4X2Zkc1tpZHgudTMyXSwgZXJyb3IpKSA8IDApCisgICAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICAgICpwZmQgPSBuZmQ7CisjZWxzZQorICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBmaWxlIGRlc2NpcHRvciBwYXNzaW5nLlxuIik7CisgICAgICAgICAgZ290byBvdXQ7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c190eXBlX2lzX2Jhc2ljIChzcGVjX3R5cGUpKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0Jhc2ljVmFsdWUgKnB0cjsKKworICAgICAgICAgIHB0ciA9IHZhX2FyZyAodmFyX2FyZ3MsIERCdXNCYXNpY1ZhbHVlKik7CisKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKHB0ciAhPSBOVUxMKTsKKworICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKCZyZWFsLT51LnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzcGVjX3R5cGUgPT0gREJVU19UWVBFX0FSUkFZKQorICAgICAgICB7CisgICAgICAgICAgaW50IGVsZW1lbnRfdHlwZTsKKyAgICAgICAgICBpbnQgc3BlY19lbGVtZW50X3R5cGU7CisgICAgICAgICAgY29uc3QgREJ1c0Jhc2ljVmFsdWUgKipwdHI7CisgICAgICAgICAgaW50ICpuX2VsZW1lbnRzX3A7CisgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgYXJyYXk7CisKKyAgICAgICAgICBzcGVjX2VsZW1lbnRfdHlwZSA9IHZhX2FyZyAodmFyX2FyZ3MsIGludCk7CisgICAgICAgICAgZWxlbWVudF90eXBlID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2VsZW1lbnRfdHlwZSAoJnJlYWwtPnUucmVhZGVyKTsKKworICAgICAgICAgIGlmIChzcGVjX2VsZW1lbnRfdHlwZSAhPSBlbGVtZW50X3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJndW1lbnQgJWQgaXMgc3BlY2lmaWVkIHRvIGJlIGFuIGFycmF5IG9mIFwiJXNcIiwgYnV0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpcyBhY3R1YWxseSBhbiBhcnJheSBvZiBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHNwZWNfZWxlbWVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChlbGVtZW50X3R5cGUpKTsKKworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChkYnVzX3R5cGVfaXNfZml4ZWQgKHNwZWNfZWxlbWVudF90eXBlKSAmJgorICAgICAgICAgICAgICBlbGVtZW50X3R5cGUgIT0gREJVU19UWVBFX1VOSVhfRkQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHB0ciA9IHZhX2FyZyAodmFyX2FyZ3MsIGNvbnN0IERCdXNCYXNpY1ZhbHVlKiopOworICAgICAgICAgICAgICBuX2VsZW1lbnRzX3AgPSB2YV9hcmcgKHZhcl9hcmdzLCBpbnQqKTsKKworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKHB0ciAhPSBOVUxMKTsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChuX2VsZW1lbnRzX3AgIT0gTlVMTCk7CisKKyAgICAgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAoJnJlYWwtPnUucmVhZGVyLCAmYXJyYXkpOworCisgICAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfZml4ZWRfbXVsdGkgKCZhcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgcHRyLCBuX2VsZW1lbnRzX3ApOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKF9EQlVTX1RZUEVfSVNfU1RSSU5HTElLRSAoc3BlY19lbGVtZW50X3R5cGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjaGFyICoqKnN0cl9hcnJheV9wOworICAgICAgICAgICAgICBpbnQgbl9lbGVtZW50czsKKyAgICAgICAgICAgICAgY2hhciAqKnN0cl9hcnJheTsKKworICAgICAgICAgICAgICBzdHJfYXJyYXlfcCA9IHZhX2FyZyAodmFyX2FyZ3MsIGNoYXIqKiopOworICAgICAgICAgICAgICBuX2VsZW1lbnRzX3AgPSB2YV9hcmcgKHZhcl9hcmdzLCBpbnQqKTsKKworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKHN0cl9hcnJheV9wICE9IE5VTEwpOworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKG5fZWxlbWVudHNfcCAhPSBOVUxMKTsKKworICAgICAgICAgICAgICAvKiBDb3VudCBlbGVtZW50cyBpbiB0aGUgYXJyYXkgKi8KKyAgICAgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAoJnJlYWwtPnUucmVhZGVyLCAmYXJyYXkpOworCisgICAgICAgICAgICAgIG5fZWxlbWVudHMgPSAwOworICAgICAgICAgICAgICB3aGlsZSAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJmFycmF5KSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICArK25fZWxlbWVudHM7CisgICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmYXJyYXkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBzdHJfYXJyYXkgPSBkYnVzX25ldzAgKGNoYXIqLCBuX2VsZW1lbnRzICsgMSk7CisgICAgICAgICAgICAgIGlmIChzdHJfYXJyYXkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogTm93IGdvIHRocm91Z2ggYW5kIGR1cCBlYWNoIHN0cmluZyAqLworICAgICAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlICgmcmVhbC0+dS5yZWFkZXIsICZhcnJheSk7CisKKyAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICAgIHdoaWxlIChpIDwgbl9lbGVtZW50cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzOworICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAoJmFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgJnMpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBzdHJfYXJyYXlbaV0gPSBfZGJ1c19zdHJkdXAgKHMpOworICAgICAgICAgICAgICAgICAgaWYgKHN0cl9hcnJheVtpXSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc3RyX2FycmF5KTsKKyAgICAgICAgICAgICAgICAgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBpZiAoIV9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZhcnJheSkpCisgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoaSA9PSBuX2VsZW1lbnRzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmYXJyYXkpID09IERCVVNfVFlQRV9JTlZBTElEKTsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChpID09IG5fZWxlbWVudHMpOworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKHN0cl9hcnJheVtpXSA9PSBOVUxMKTsKKworICAgICAgICAgICAgICAqc3RyX2FycmF5X3AgPSBzdHJfYXJyYXk7CisgICAgICAgICAgICAgICpuX2VsZW1lbnRzX3AgPSBuX2VsZW1lbnRzOworICAgICAgICAgICAgfQorI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgieW91IGNhbid0IHJlYWQgYXJyYXlzIG9mIGNvbnRhaW5lciB0eXBlcyAoc3RydWN0LCB2YXJpYW50LCBhcnJheSkgd2l0aCAlcyBmb3Igbm93XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19GVU5DVElPTl9OQU1FKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgieW91IGNhbiBvbmx5IHJlYWQgYXJyYXlzIGFuZCBiYXNpYyB0eXBlcyB3aXRoICVzIGZvciBub3dcbiIsCisgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfRlVOQ1RJT05fTkFNRSk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICBzcGVjX3R5cGUgPSB2YV9hcmcgKHZhcl9hcmdzLCBpbnQpOworICAgICAgaWYgKCFfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmcmVhbC0+dS5yZWFkZXIpICYmIHNwZWNfdHlwZSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlIGhhcyBvbmx5ICVkIGFyZ3VtZW50cywgYnV0IG1vcmUgd2VyZSBleHBlY3RlZCIsIGkpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGkrKzsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKiogQH0gKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c01lc3NhZ2UgREJ1c01lc3NhZ2UKKyAqIEBpbmdyb3VwICBEQnVzCisgKiBAYnJpZWYgTWVzc2FnZSB0byBiZSBzZW50IG9yIHJlY2VpdmVkIG92ZXIgYSAjREJ1c0Nvbm5lY3Rpb24uCisgKgorICogQSBEQnVzTWVzc2FnZSBpcyB0aGUgbW9zdCBiYXNpYyB1bml0IG9mIGNvbW11bmljYXRpb24gb3ZlciBhCisgKiBEQnVzQ29ubmVjdGlvbi4gQSBEQnVzQ29ubmVjdGlvbiByZXByZXNlbnRzIGEgc3RyZWFtIG9mIG1lc3NhZ2VzCisgKiByZWNlaXZlZCBmcm9tIGEgcmVtb3RlIGFwcGxpY2F0aW9uLCBhbmQgYSBzdHJlYW0gb2YgbWVzc2FnZXMKKyAqIHNlbnQgdG8gYSByZW1vdGUgYXBwbGljYXRpb24uCisgKgorICogQSBtZXNzYWdlIGhhcyBhIG1lc3NhZ2UgdHlwZSwgcmV0dXJuZWQgZnJvbQorICogZGJ1c19tZXNzYWdlX2dldF90eXBlKCkuICBUaGlzIGluZGljYXRlcyB3aGV0aGVyIHRoZSBtZXNzYWdlIGlzIGEKKyAqIG1ldGhvZCBjYWxsLCBhIHJlcGx5IHRvIGEgbWV0aG9kIGNhbGwsIGEgc2lnbmFsLCBvciBhbiBlcnJvciByZXBseS4KKyAqCisgKiBBIG1lc3NhZ2UgaGFzIGhlYWRlciBmaWVsZHMgc3VjaCBhcyB0aGUgc2VuZGVyLCBkZXN0aW5hdGlvbiwgbWV0aG9kCisgKiBvciBzaWduYWwgbmFtZSwgYW5kIHNvIGZvcnRoLiBEQnVzTWVzc2FnZSBoYXMgYWNjZXNzb3IgZnVuY3Rpb25zIGZvcgorICogdGhlc2UsIHN1Y2ggYXMgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIoKS4KKyAqCisgKiBDb252ZW5pZW5jZSBmdW5jdGlvbnMgZGJ1c19tZXNzYWdlX2lzX21ldGhvZF9jYWxsKCksIGRidXNfbWVzc2FnZV9pc19zaWduYWwoKSwKKyAqIGFuZCBkYnVzX21lc3NhZ2VfaXNfZXJyb3IoKSBjaGVjayBzZXZlcmFsIGhlYWRlciBmaWVsZHMgYXQgb25jZSBhbmQgYXJlCisgKiBzbGlnaHRseSBtb3JlIGVmZmljaWVudCB0aGFuIGNoZWNraW5nIHRoZSBoZWFkZXIgZmllbGRzIHdpdGggaW5kaXZpZHVhbAorICogYWNjZXNzb3IgZnVuY3Rpb25zLgorICoKKyAqIEZpbmFsbHksIGEgbWVzc2FnZSBoYXMgYXJndW1lbnRzLiBUaGUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMKKyAqIGFyZSBpbiB0aGUgbWVzc2FnZSdzIHNpZ25hdHVyZSBoZWFkZXIgZmllbGQgKGFjY2Vzc2VkIHdpdGgKKyAqIGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlKCkpLiAgU2ltcGxlIGFyZ3VtZW50IHZhbHVlcyBhcmUgdXN1YWxseQorICogcmV0cmlldmVkIHdpdGggZGJ1c19tZXNzYWdlX2dldF9hcmdzKCkgYnV0IG1vcmUgY29tcGxleCB2YWx1ZXMgc3VjaAorICogYXMgc3RydWN0cyBtYXkgcmVxdWlyZSB0aGUgdXNlIG9mICNEQnVzTWVzc2FnZUl0ZXIuCisgKgorICogVGhlIEQtQnVzIHNwZWNpZmljYXRpb24gZ29lcyBpbnRvIHNvbWUgbW9yZSBkZXRhaWwgYWJvdXQgaGVhZGVyIGZpZWxkcyBhbmQKKyAqIG1lc3NhZ2UgdHlwZXMuCisgKiAKKyAqIEB7CisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBEQnVzTWVzc2FnZQorICoKKyAqIE9wYXF1ZSBkYXRhIHR5cGUgcmVwcmVzZW50aW5nIGEgbWVzc2FnZSByZWNlaXZlZCBmcm9tIG9yIHRvIGJlCisgKiBzZW50IHRvIGFub3RoZXIgYXBwbGljYXRpb24uCisgKi8KKworLyoqCisgKiBSZXR1cm5zIHRoZSBzZXJpYWwgb2YgYSBtZXNzYWdlIG9yIDAgaWYgbm9uZSBoYXMgYmVlbiBzcGVjaWZpZWQuCisgKiBUaGUgbWVzc2FnZSdzIHNlcmlhbCBudW1iZXIgaXMgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHNlbmRpbmcKKyAqIHRoZSBtZXNzYWdlIGFuZCBpcyB1c2VkIHRvIGlkZW50aWZ5IHJlcGxpZXMgdG8gdGhpcyBtZXNzYWdlLgorICoKKyAqIEFsbCBtZXNzYWdlcyByZWNlaXZlZCBvbiBhIGNvbm5lY3Rpb24gd2lsbCBoYXZlIGEgc2VyaWFsIHByb3ZpZGVkCisgKiBieSB0aGUgcmVtb3RlIGFwcGxpY2F0aW9uLgorICoKKyAqIEZvciBtZXNzYWdlcyB5b3UncmUgc2VuZGluZywgZGJ1c19jb25uZWN0aW9uX3NlbmQoKSB3aWxsIGFzc2lnbiBhCisgKiBzZXJpYWwgYW5kIHJldHVybiBpdCB0byB5b3UuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEByZXR1cm5zIHRoZSBzZXJpYWwKKyAqLworZGJ1c191aW50MzJfdAorZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgMCk7CisKKyAgcmV0dXJuIF9kYnVzX2hlYWRlcl9nZXRfc2VyaWFsICgmbWVzc2FnZS0+aGVhZGVyKTsKK30KKworLyoqCisgKiBTZXRzIHRoZSByZXBseSBzZXJpYWwgb2YgYSBtZXNzYWdlICh0aGUgc2VyaWFsIG9mIHRoZSBtZXNzYWdlIHRoaXMKKyAqIGlzIGEgcmVwbHkgdG8pLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gcmVwbHlfc2VyaWFsIHRoZSBzZXJpYWwgd2UncmUgcmVwbHlpbmcgdG8KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX3NldF9yZXBseV9zZXJpYWwgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgcmVwbHlfc2VyaWFsKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKCFtZXNzYWdlLT5sb2NrZWQsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChyZXBseV9zZXJpYWwgIT0gMCwgRkFMU0UpOyAvKiAwIGlzIGludmFsaWQgKi8KKworICByZXR1cm4gX2RidXNfaGVhZGVyX3NldF9maWVsZF9iYXNpYyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1JFUExZX1NFUklBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHlfc2VyaWFsKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBzZXJpYWwgdGhhdCB0aGUgbWVzc2FnZSBpcyBhIHJlcGx5IHRvIG9yIDAgaWYgbm9uZS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHJldHVybnMgdGhlIHJlcGx5IHNlcmlhbAorICovCitkYnVzX3VpbnQzMl90CitkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAgKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBkYnVzX3VpbnQzMl90IHZfVUlOVDMyOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCAwKTsKKworICBpZiAoX2RidXNfaGVhZGVyX2dldF9maWVsZF9iYXNpYyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1JFUExZX1NFUklBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9VSU5UMzIpKQorICAgIHJldHVybiB2X1VJTlQzMjsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorZGJ1c19tZXNzYWdlX2ZpbmFsaXplIChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19hdG9taWNfZ2V0ICgmbWVzc2FnZS0+cmVmY291bnQpID09IDApOworCisgIC8qIFRoaXMgY2FsbHMgYXBwbGljYXRpb24gY2FsbGJhY2tzISAqLworICBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9mcmVlICgmbWVzc2FnZS0+c2xvdF9saXN0KTsKKworICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZtZXNzYWdlLT5jb3VudGVycywKKyAgICAgICAgICAgICAgICAgICAgICBmcmVlX2NvdW50ZXIsIG1lc3NhZ2UpOworICBfZGJ1c19saXN0X2NsZWFyICgmbWVzc2FnZS0+Y291bnRlcnMpOworCisgIF9kYnVzX2hlYWRlcl9mcmVlICgmbWVzc2FnZS0+aGVhZGVyKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZtZXNzYWdlLT5ib2R5KTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIGNsb3NlX3VuaXhfZmRzKG1lc3NhZ2UtPnVuaXhfZmRzLCAmbWVzc2FnZS0+bl91bml4X2Zkcyk7CisgIGRidXNfZnJlZShtZXNzYWdlLT51bml4X2Zkcyk7CisjZW5kaWYKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2F0b21pY19nZXQgKCZtZXNzYWdlLT5yZWZjb3VudCkgPT0gMCk7CisKKyAgZGJ1c19mcmVlIChtZXNzYWdlKTsKK30KKworc3RhdGljIERCdXNNZXNzYWdlKgorZGJ1c19tZXNzYWdlX25ld19lbXB0eV9oZWFkZXIgKHZvaWQpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX2Jvb2xfdCBmcm9tX2NhY2hlOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfZ2V0X2NhY2hlZCAoKTsKKworICBpZiAobWVzc2FnZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZyb21fY2FjaGUgPSBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZyb21fY2FjaGUgPSBGQUxTRTsKKyAgICAgIG1lc3NhZ2UgPSBkYnVzX25ldzAgKERCdXNNZXNzYWdlLCAxKTsKKyAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgICAgICBtZXNzYWdlLT5nZW5lcmF0aW9uID0gX2RidXNfY3VycmVudF9nZW5lcmF0aW9uOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICAgICAgbWVzc2FnZS0+dW5peF9mZHMgPSBOVUxMOworICAgICAgbWVzc2FnZS0+bl91bml4X2Zkc19hbGxvY2F0ZWQgPSAwOworI2VuZGlmCisgICAgfQorCisgIF9kYnVzX2F0b21pY19pbmMgKCZtZXNzYWdlLT5yZWZjb3VudCk7CisKKyAgX2RidXNfbWVzc2FnZV90cmFjZV9yZWYgKG1lc3NhZ2UsIDAsIDEsICJuZXdfZW1wdHlfaGVhZGVyIik7CisKKyAgbWVzc2FnZS0+bG9ja2VkID0gRkFMU0U7CisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgbWVzc2FnZS0+aW5fY2FjaGUgPSBGQUxTRTsKKyNlbmRpZgorICBtZXNzYWdlLT5jb3VudGVycyA9IE5VTEw7CisgIG1lc3NhZ2UtPnNpemVfY291bnRlcl9kZWx0YSA9IDA7CisgIG1lc3NhZ2UtPmNoYW5nZWRfc3RhbXAgPSAwOworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgbWVzc2FnZS0+bl91bml4X2ZkcyA9IDA7CisgIG1lc3NhZ2UtPm5fdW5peF9mZHNfYWxsb2NhdGVkID0gMDsKKyAgbWVzc2FnZS0+dW5peF9mZF9jb3VudGVyX2RlbHRhID0gMDsKKyNlbmRpZgorCisgIGlmICghZnJvbV9jYWNoZSkKKyAgICBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9pbml0ICgmbWVzc2FnZS0+c2xvdF9saXN0KTsKKworICBpZiAoZnJvbV9jYWNoZSkKKyAgICB7CisgICAgICBfZGJ1c19oZWFkZXJfcmVpbml0ICgmbWVzc2FnZS0+aGVhZGVyKTsKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmbWVzc2FnZS0+Ym9keSwgMCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFfZGJ1c19oZWFkZXJfaW5pdCAoJm1lc3NhZ2UtPmhlYWRlcikpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2ZyZWUgKG1lc3NhZ2UpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXRfcHJlYWxsb2NhdGVkICgmbWVzc2FnZS0+Ym9keSwgMzIpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfaGVhZGVyX2ZyZWUgKCZtZXNzYWdlLT5oZWFkZXIpOworICAgICAgICAgIGRidXNfZnJlZSAobWVzc2FnZSk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKKy8qKgorICogQ29uc3RydWN0cyBhIG5ldyBtZXNzYWdlIG9mIHRoZSBnaXZlbiBtZXNzYWdlIHR5cGUuCisgKiBUeXBlcyBpbmNsdWRlICNEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCwKKyAqICNEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwsIGFuZCBzbyBmb3J0aC4KKyAqCisgKiBVc3VhbGx5IHlvdSB3YW50IHRvIHVzZSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsKCksCisgKiBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4oKSwgZGJ1c19tZXNzYWdlX25ld19zaWduYWwoKSwKKyAqIG9yIGRidXNfbWVzc2FnZV9uZXdfZXJyb3IoKSBpbnN0ZWFkLgorICogCisgKiBAcGFyYW0gbWVzc2FnZV90eXBlIHR5cGUgb2YgbWVzc2FnZQorICogQHJldHVybnMgbmV3IG1lc3NhZ2Ugb3IgI05VTEwgaWYgbm8gbWVtb3J5CisgKi8KK0RCdXNNZXNzYWdlKgorZGJ1c19tZXNzYWdlX25ldyAoaW50IG1lc3NhZ2VfdHlwZSkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlX3R5cGUgIT0gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCwgTlVMTCk7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfZW1wdHlfaGVhZGVyICgpOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghX2RidXNfaGVhZGVyX2NyZWF0ZSAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKKy8qKgorICogQ29uc3RydWN0cyBhIG5ldyBtZXNzYWdlIHRvIGludm9rZSBhIG1ldGhvZCBvbiBhIHJlbW90ZQorICogb2JqZWN0LiBSZXR1cm5zICNOVUxMIGlmIG1lbW9yeSBjYW4ndCBiZSBhbGxvY2F0ZWQgZm9yIHRoZQorICogbWVzc2FnZS4gVGhlIGRlc3RpbmF0aW9uIG1heSBiZSAjTlVMTCBpbiB3aGljaCBjYXNlIG5vIGRlc3RpbmF0aW9uCisgKiBpcyBzZXQ7IHRoaXMgaXMgYXBwcm9wcmlhdGUgd2hlbiB1c2luZyBELUJ1cyBpbiBhIHBlZXItdG8tcGVlcgorICogY29udGV4dCAobm8gbWVzc2FnZSBidXMpLiBUaGUgaW50ZXJmYWNlIG1heSBiZSAjTlVMTCwgd2hpY2ggbWVhbnMKKyAqIHRoYXQgaWYgbXVsdGlwbGUgbWV0aG9kcyB3aXRoIHRoZSBnaXZlbiBuYW1lIGV4aXN0IGl0IGlzIHVuZGVmaW5lZAorICogd2hpY2ggb25lIHdpbGwgYmUgaW52b2tlZC4KKyAqCisgKiBUaGUgcGF0aCBhbmQgbWV0aG9kIG5hbWVzIG1heSBub3QgYmUgI05VTEwuCisgKgorICogRGVzdGluYXRpb24sIHBhdGgsIGludGVyZmFjZSwgYW5kIG1ldGhvZCBuYW1lIGNhbid0IGNvbnRhaW4KKyAqIGFueSBpbnZhbGlkIGNoYXJhY3RlcnMgKHNlZSB0aGUgRC1CdXMgc3BlY2lmaWNhdGlvbikuCisgKiAKKyAqIEBwYXJhbSBkZXN0aW5hdGlvbiBuYW1lIHRoYXQgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIHNlbnQgdG8gb3IgI05VTEwKKyAqIEBwYXJhbSBwYXRoIG9iamVjdCBwYXRoIHRoZSBtZXNzYWdlIHNob3VsZCBiZSBzZW50IHRvCisgKiBAcGFyYW0gaW50ZXJmYWNlIGludGVyZmFjZSB0byBpbnZva2UgbWV0aG9kIG9uLCBvciAjTlVMTAorICogQHBhcmFtIG1ldGhvZCBtZXRob2QgdG8gaW52b2tlCisgKgorICogQHJldHVybnMgYSBuZXcgREJ1c01lc3NhZ2UsIGZyZWUgd2l0aCBkYnVzX21lc3NhZ2VfdW5yZWYoKQorICovCitEQnVzTWVzc2FnZSoKK2RidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKGNvbnN0IGNoYXIgKmRlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1ldGhvZCkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwYXRoICE9IE5VTEwsIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1ldGhvZCAhPSBOVUxMLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChkZXN0aW5hdGlvbiA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfY2hlY2tfaXNfdmFsaWRfYnVzX25hbWUgKGRlc3RpbmF0aW9uKSwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfY2hlY2tfaXNfdmFsaWRfcGF0aCAocGF0aCksIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGludGVyZmFjZSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfY2hlY2tfaXNfdmFsaWRfaW50ZXJmYWNlIChpbnRlcmZhY2UpLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19jaGVja19pc192YWxpZF9tZW1iZXIgKG1ldGhvZCksIE5VTEwpOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X2VtcHR5X2hlYWRlciAoKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIV9kYnVzX2hlYWRlcl9jcmVhdGUgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19DT01QSUxFUl9CWVRFX09SREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLCBwYXRoLCBpbnRlcmZhY2UsIG1ldGhvZCwgTlVMTCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gbWVzc2FnZTsKK30KKworLyoqCisgKiBDb25zdHJ1Y3RzIGEgbWVzc2FnZSB0aGF0IGlzIGEgcmVwbHkgdG8gYSBtZXRob2QgY2FsbC4gUmV0dXJucworICogI05VTEwgaWYgbWVtb3J5IGNhbid0IGJlIGFsbG9jYXRlZCBmb3IgdGhlIG1lc3NhZ2UuCisgKgorICogQHBhcmFtIG1ldGhvZF9jYWxsIHRoZSBtZXNzYWdlIGJlaW5nIHJlcGxpZWQgdG8KKyAqIEByZXR1cm5zIGEgbmV3IERCdXNNZXNzYWdlLCBmcmVlIHdpdGggZGJ1c19tZXNzYWdlX3VucmVmKCkKKyAqLworREJ1c01lc3NhZ2UqCitkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKERCdXNNZXNzYWdlICptZXRob2RfY2FsbCkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGNvbnN0IGNoYXIgKnNlbmRlcjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1ldGhvZF9jYWxsICE9IE5VTEwsIE5VTEwpOworCisgIHNlbmRlciA9IGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXRob2RfY2FsbCk7CisKKyAgLyogc2VuZGVyIGlzIGFsbG93ZWQgdG8gYmUgbnVsbCBoZXJlIGluIHBlZXItdG8tcGVlciBjYXNlICovCisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfZW1wdHlfaGVhZGVyICgpOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghX2RidXNfaGVhZGVyX2NyZWF0ZSAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3NldF9ub19yZXBseSAobWVzc2FnZSwgVFJVRSk7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKG1ldGhvZF9jYWxsKSkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gbWVzc2FnZTsKK30KKworLyoqCisgKiBDb25zdHJ1Y3RzIGEgbmV3IG1lc3NhZ2UgcmVwcmVzZW50aW5nIGEgc2lnbmFsIGVtaXNzaW9uLiBSZXR1cm5zCisgKiAjTlVMTCBpZiBtZW1vcnkgY2FuJ3QgYmUgYWxsb2NhdGVkIGZvciB0aGUgbWVzc2FnZS4gIEEgc2lnbmFsIGlzCisgKiBpZGVudGlmaWVkIGJ5IGl0cyBvcmlnaW5hdGluZyBvYmplY3QgcGF0aCwgaW50ZXJmYWNlLCBhbmQgdGhlIG5hbWUKKyAqIG9mIHRoZSBzaWduYWwuCisgKgorICogUGF0aCwgaW50ZXJmYWNlLCBhbmQgc2lnbmFsIG5hbWUgbXVzdCBhbGwgYmUgdmFsaWQgKHRoZSBELUJ1cworICogc3BlY2lmaWNhdGlvbiBkZWZpbmVzIHRoZSBzeW50YXggb2YgdGhlc2UgZmllbGRzKS4KKyAqIAorICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gdGhlIG9iamVjdCBlbWl0dGluZyB0aGUgc2lnbmFsCisgKiBAcGFyYW0gaW50ZXJmYWNlIHRoZSBpbnRlcmZhY2UgdGhlIHNpZ25hbCBpcyBlbWl0dGVkIGZyb20KKyAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIHNpZ25hbAorICogQHJldHVybnMgYSBuZXcgREJ1c01lc3NhZ2UsIGZyZWUgd2l0aCBkYnVzX21lc3NhZ2VfdW5yZWYoKQorICovCitEQnVzTWVzc2FnZSoKK2RidXNfbWVzc2FnZV9uZXdfc2lnbmFsIChjb25zdCBjaGFyICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHBhdGggIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoaW50ZXJmYWNlICE9IE5VTEwsIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG5hbWUgIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfY2hlY2tfaXNfdmFsaWRfcGF0aCAocGF0aCksIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2ludGVyZmFjZSAoaW50ZXJmYWNlKSwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfY2hlY2tfaXNfdmFsaWRfbWVtYmVyIChuYW1lKSwgTlVMTCk7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfZW1wdHlfaGVhZGVyICgpOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghX2RidXNfaGVhZGVyX2NyZWF0ZSAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHBhdGgsIGludGVyZmFjZSwgbmFtZSwgTlVMTCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBkYnVzX21lc3NhZ2Vfc2V0X25vX3JlcGx5IChtZXNzYWdlLCBUUlVFKTsKKworICByZXR1cm4gbWVzc2FnZTsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IG1lc3NhZ2UgdGhhdCBpcyBhbiBlcnJvciByZXBseSB0byBhbm90aGVyIG1lc3NhZ2UuCisgKiBFcnJvciByZXBsaWVzIGFyZSBtb3N0IGNvbW1vbiBpbiByZXNwb25zZSB0byBtZXRob2QgY2FsbHMsIGJ1dAorICogY2FuIGJlIHJldHVybmVkIGluIHJlcGx5IHRvIGFueSBtZXNzYWdlLgorICoKKyAqIFRoZSBlcnJvciBuYW1lIG11c3QgYmUgYSB2YWxpZCBlcnJvciBuYW1lIGFjY29yZGluZyB0byB0aGUgc3ludGF4CisgKiBnaXZlbiBpbiB0aGUgRC1CdXMgc3BlY2lmaWNhdGlvbi4gSWYgeW91IGRvbid0IHdhbnQgdG8gbWFrZQorICogdXAgYW4gZXJyb3IgbmFtZSBqdXN0IHVzZSAjREJVU19FUlJPUl9GQUlMRUQuCisgKgorICogQHBhcmFtIHJlcGx5X3RvIHRoZSBtZXNzYWdlIHdlJ3JlIHJlcGx5aW5nIHRvCisgKiBAcGFyYW0gZXJyb3JfbmFtZSB0aGUgZXJyb3IgbmFtZQorICogQHBhcmFtIGVycm9yX21lc3NhZ2UgdGhlIGVycm9yIG1lc3NhZ2Ugc3RyaW5nIChvciAjTlVMTCBmb3Igbm9uZSwgYnV0IHBsZWFzZSBnaXZlIGEgbWVzc2FnZSkKKyAqIEByZXR1cm5zIGEgbmV3IGVycm9yIG1lc3NhZ2Ugb2JqZWN0LCBmcmVlIHdpdGggZGJ1c19tZXNzYWdlX3VucmVmKCkKKyAqLworREJ1c01lc3NhZ2UqCitkYnVzX21lc3NhZ2VfbmV3X2Vycm9yIChEQnVzTWVzc2FnZSAqcmVwbHlfdG8sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqZXJyb3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICplcnJvcl9tZXNzYWdlKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgY29uc3QgY2hhciAqc2VuZGVyOworICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHJlcGx5X3RvICE9IE5VTEwsIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGVycm9yX25hbWUgIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfY2hlY2tfaXNfdmFsaWRfZXJyb3JfbmFtZSAoZXJyb3JfbmFtZSksIE5VTEwpOworCisgIHNlbmRlciA9IGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChyZXBseV90byk7CisKKyAgLyogc2VuZGVyIG1heSBiZSBOVUxMIGZvciBub24tbWVzc2FnZS1idXMgY2FzZSBvcgorICAgKiB3aGVuIHRoZSBtZXNzYWdlIGJ1cyBpcyBkZWFsaW5nIHdpdGggYW4gdW5yZWdpc3RlcmVkCisgICAqIGNvbm5lY3Rpb24uCisgICAqLworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19lbXB0eV9oZWFkZXIgKCk7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCFfZGJ1c19oZWFkZXJfY3JlYXRlICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQ09NUElMRVJfQllURV9PUkRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIsIE5VTEwsIE5VTEwsIE5VTEwsIGVycm9yX25hbWUpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3NldF9ub19yZXBseSAobWVzc2FnZSwgVFJVRSk7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKHJlcGx5X3RvKSkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoZXJyb3JfbWVzc2FnZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtZXNzYWdlLCAmaXRlcik7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3JfbWVzc2FnZSkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBtZXNzYWdlOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgbWVzc2FnZSB0aGF0IGlzIGFuIGVycm9yIHJlcGx5IHRvIGFub3RoZXIgbWVzc2FnZSwgYWxsb3dpbmcKKyAqIHlvdSB0byB1c2UgcHJpbnRmIGZvcm1hdHRpbmcuCisgKgorICogU2VlIGRidXNfbWVzc2FnZV9uZXdfZXJyb3IoKSBmb3IgZGV0YWlscyAtIHRoaXMgZnVuY3Rpb24gaXMgdGhlIHNhbWUKKyAqIGFzaWRlIGZyb20gdGhlIHByaW50ZiBmb3JtYXR0aW5nLgorICoKKyAqIEB0b2RvIGFkZCBfREJVU19HTlVDX1BSSU5URiB0byB0aGlzIChyZXF1aXJlcyBtb3ZpbmcgX0RCVVNfR05VQ19QUklOVEYgdG8KKyAqIHB1YmxpYyBoZWFkZXIsIHNlZSBEQlVTX0RFUFJFQ0FURUQgZm9yIGFuIGV4YW1wbGUpCisgKiAKKyAqIEBwYXJhbSByZXBseV90byB0aGUgb3JpZ2luYWwgbWVzc2FnZQorICogQHBhcmFtIGVycm9yX25hbWUgdGhlIGVycm9yIG5hbWUKKyAqIEBwYXJhbSBlcnJvcl9mb3JtYXQgdGhlIGVycm9yIG1lc3NhZ2UgZm9ybWF0IGFzIHdpdGggcHJpbnRmCisgKiBAcGFyYW0gLi4uIGZvcm1hdCBzdHJpbmcgYXJndW1lbnRzCisgKiBAcmV0dXJucyBhIG5ldyBlcnJvciBtZXNzYWdlCisgKi8KK0RCdXNNZXNzYWdlKgorZGJ1c19tZXNzYWdlX25ld19lcnJvcl9wcmludGYgKERCdXNNZXNzYWdlICpyZXBseV90bywKKwkJCSAgICAgICBjb25zdCBjaGFyICAqZXJyb3JfbmFtZSwKKwkJCSAgICAgICBjb25zdCBjaGFyICAqZXJyb3JfZm9ybWF0LAorCQkJICAgICAgIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworICBEQnVzU3RyaW5nIHN0cjsKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChyZXBseV90byAhPSBOVUxMLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChlcnJvcl9uYW1lICE9IE5VTEwsIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2Vycm9yX25hbWUgKGVycm9yX25hbWUpLCBOVUxMKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICByZXR1cm4gTlVMTDsKKworICB2YV9zdGFydCAoYXJncywgZXJyb3JfZm9ybWF0KTsKKworICBpZiAoX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGZfdmFsaXN0ICgmc3RyLCBlcnJvcl9mb3JtYXQsIGFyZ3MpKQorICAgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X2Vycm9yIChyZXBseV90bywgZXJyb3JfbmFtZSwKKwkJCQkgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZzdHIpKTsKKyAgZWxzZQorICAgIG1lc3NhZ2UgPSBOVUxMOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKworICB2YV9lbmQgKGFyZ3MpOworCisgIHJldHVybiBtZXNzYWdlOworfQorCisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBtZXNzYWdlIHRoYXQgaXMgYW4gZXhhY3QgcmVwbGljYSBvZiB0aGUgbWVzc2FnZQorICogc3BlY2lmaWVkLCBleGNlcHQgdGhhdCBpdHMgcmVmY291bnQgaXMgc2V0IHRvIDEsIGl0cyBtZXNzYWdlIHNlcmlhbAorICogaXMgcmVzZXQgdG8gMCwgYW5kIGlmIHRoZSBvcmlnaW5hbCBtZXNzYWdlIHdhcyAibG9ja2VkIiAoaW4gdGhlCisgKiBvdXRnb2luZyBtZXNzYWdlIHF1ZXVlIGFuZCB0aHVzIG5vdCBtb2RpZmlhYmxlKSB0aGUgbmV3IG1lc3NhZ2UKKyAqIHdpbGwgbm90IGJlIGxvY2tlZC4KKyAqCisgKiBAdG9kbyBUaGlzIGZ1bmN0aW9uIGNhbid0IGJlIHVzZWQgaW4gcHJvZ3JhbXMgdGhhdCB0cnkgdG8gcmVjb3ZlciBmcm9tIE9PTSBlcnJvcnMuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEByZXR1cm5zIHRoZSBuZXcgbWVzc2FnZS5vciAjTlVMTCBpZiBub3QgZW5vdWdoIG1lbW9yeSBvciBVbml4IGZpbGUgZGVzY3JpcHRvcnMgKGluIGNhc2UgdGhlIG1lc3NhZ2UgdG8gY29weSBpbmNsdWRlcyBVbml4IGZpbGUgZGVzY3JpcHRvcnMpIGNhbiBiZSBhbGxvY2F0ZWQuCisgKi8KK0RCdXNNZXNzYWdlICoKK2RidXNfbWVzc2FnZV9jb3B5IChjb25zdCBEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgREJ1c01lc3NhZ2UgKnJldHZhbDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgTlVMTCk7CisKKyAgcmV0dmFsID0gZGJ1c19uZXcwIChEQnVzTWVzc2FnZSwgMSk7CisgIGlmIChyZXR2YWwgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBfZGJ1c19hdG9taWNfaW5jICgmcmV0dmFsLT5yZWZjb3VudCk7CisKKyAgcmV0dmFsLT5sb2NrZWQgPSBGQUxTRTsKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICByZXR2YWwtPmdlbmVyYXRpb24gPSBtZXNzYWdlLT5nZW5lcmF0aW9uOworI2VuZGlmCisKKyAgaWYgKCFfZGJ1c19oZWFkZXJfY29weSAoJm1lc3NhZ2UtPmhlYWRlciwgJnJldHZhbC0+aGVhZGVyKSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHJldHZhbCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdF9wcmVhbGxvY2F0ZWQgKCZyZXR2YWwtPmJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmJvZHkpKSkKKyAgICB7CisgICAgICBfZGJ1c19oZWFkZXJfZnJlZSAoJnJldHZhbC0+aGVhZGVyKTsKKyAgICAgIGRidXNfZnJlZSAocmV0dmFsKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmbWVzc2FnZS0+Ym9keSwgMCwKKwkJCSAgJnJldHZhbC0+Ym9keSwgMCkpCisgICAgZ290byBmYWlsZWRfY29weTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIHJldHZhbC0+dW5peF9mZHMgPSBkYnVzX25ldyhpbnQsIG1lc3NhZ2UtPm5fdW5peF9mZHMpOworICBpZiAocmV0dmFsLT51bml4X2ZkcyA9PSBOVUxMICYmIG1lc3NhZ2UtPm5fdW5peF9mZHMgPiAwKQorICAgIGdvdG8gZmFpbGVkX2NvcHk7CisKKyAgcmV0dmFsLT5uX3VuaXhfZmRzX2FsbG9jYXRlZCA9IG1lc3NhZ2UtPm5fdW5peF9mZHM7CisKKyAgZm9yIChyZXR2YWwtPm5fdW5peF9mZHMgPSAwOworICAgICAgIHJldHZhbC0+bl91bml4X2ZkcyA8IG1lc3NhZ2UtPm5fdW5peF9mZHM7CisgICAgICAgcmV0dmFsLT5uX3VuaXhfZmRzKyspCisgICAgeworICAgICAgcmV0dmFsLT51bml4X2Zkc1tyZXR2YWwtPm5fdW5peF9mZHNdID0gX2RidXNfZHVwKG1lc3NhZ2UtPnVuaXhfZmRzW3JldHZhbC0+bl91bml4X2Zkc10sIE5VTEwpOworCisgICAgICBpZiAocmV0dmFsLT51bml4X2Zkc1tyZXR2YWwtPm5fdW5peF9mZHNdIDwgMCkKKyAgICAgICAgZ290byBmYWlsZWRfY29weTsKKyAgICB9CisKKyNlbmRpZgorCisgIF9kYnVzX21lc3NhZ2VfdHJhY2VfcmVmIChyZXR2YWwsIDAsIDEsICJjb3B5Iik7CisgIHJldHVybiByZXR2YWw7CisKKyBmYWlsZWRfY29weToKKyAgX2RidXNfaGVhZGVyX2ZyZWUgKCZyZXR2YWwtPmhlYWRlcik7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcmV0dmFsLT5ib2R5KTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIGNsb3NlX3VuaXhfZmRzKHJldHZhbC0+dW5peF9mZHMsICZyZXR2YWwtPm5fdW5peF9mZHMpOworICBkYnVzX2ZyZWUocmV0dmFsLT51bml4X2Zkcyk7CisjZW5kaWYKKworICBkYnVzX2ZyZWUgKHJldHZhbCk7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworLyoqCisgKiBJbmNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgYSBEQnVzTWVzc2FnZS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHJldHVybnMgdGhlIG1lc3NhZ2UKKyAqIEBzZWUgZGJ1c19tZXNzYWdlX3VucmVmCisgKi8KK0RCdXNNZXNzYWdlICoKK2RidXNfbWVzc2FnZV9yZWYgKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBkYnVzX2ludDMyX3Qgb2xkX3JlZmNvdW50OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlLT5nZW5lcmF0aW9uID09IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbiwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoIW1lc3NhZ2UtPmluX2NhY2hlLCBOVUxMKTsKKworICBvbGRfcmVmY291bnQgPSBfZGJ1c19hdG9taWNfaW5jICgmbWVzc2FnZS0+cmVmY291bnQpOworICBfZGJ1c19hc3NlcnQgKG9sZF9yZWZjb3VudCA+PSAxKTsKKyAgX2RidXNfbWVzc2FnZV90cmFjZV9yZWYgKG1lc3NhZ2UsIG9sZF9yZWZjb3VudCwgb2xkX3JlZmNvdW50ICsgMSwgInJlZiIpOworCisgIHJldHVybiBtZXNzYWdlOworfQorCisvKioKKyAqIERlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhIERCdXNNZXNzYWdlLCBmcmVlaW5nIHRoZQorICogbWVzc2FnZSBpZiB0aGUgY291bnQgcmVhY2hlcyAwLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAc2VlIGRidXNfbWVzc2FnZV9yZWYKKyAqLwordm9pZAorZGJ1c19tZXNzYWdlX3VucmVmIChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyBkYnVzX2ludDMyX3Qgb2xkX3JlZmNvdW50OworCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAobWVzc2FnZS0+Z2VuZXJhdGlvbiA9PSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24pOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoIW1lc3NhZ2UtPmluX2NhY2hlKTsKKworICBvbGRfcmVmY291bnQgPSBfZGJ1c19hdG9taWNfZGVjICgmbWVzc2FnZS0+cmVmY291bnQpOworCisgIF9kYnVzX2Fzc2VydCAob2xkX3JlZmNvdW50ID49IDEpOworCisgIF9kYnVzX21lc3NhZ2VfdHJhY2VfcmVmIChtZXNzYWdlLCBvbGRfcmVmY291bnQsIG9sZF9yZWZjb3VudCAtIDEsICJ1bnJlZiIpOworCisgIGlmIChvbGRfcmVmY291bnQgPT0gMSkKKyAgICB7CisgICAgICAvKiBDYWxscyBhcHBsaWNhdGlvbiBjYWxsYmFja3MhICovCisgICAgICBkYnVzX21lc3NhZ2VfY2FjaGVfb3JfZmluYWxpemUgKG1lc3NhZ2UpOworICAgIH0KK30KKworLyoqCisgKiBHZXRzIHRoZSB0eXBlIG9mIGEgbWVzc2FnZS4gVHlwZXMgaW5jbHVkZQorICogI0RCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMLCAjREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTiwKKyAqICNEQlVTX01FU1NBR0VfVFlQRV9FUlJPUiwgI0RCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCwgYnV0IG90aGVyCisgKiB0eXBlcyBhcmUgYWxsb3dlZCBhbmQgYWxsIGNvZGUgbXVzdCBzaWxlbnRseSBpZ25vcmUgbWVzc2FnZXMgb2YKKyAqIHVua25vd24gdHlwZS4gI0RCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQgd2lsbCBuZXZlciBiZSByZXR1cm5lZC4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHJldHVybnMgdGhlIHR5cGUgb2YgdGhlIG1lc3NhZ2UKKyAqLworaW50CitkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCk7CisKKyAgcmV0dXJuIF9kYnVzX2hlYWRlcl9nZXRfbWVzc2FnZV90eXBlICgmbWVzc2FnZS0+aGVhZGVyKTsKK30KKworLyoqCisgKiBBcHBlbmRzIGZpZWxkcyB0byBhIG1lc3NhZ2UgZ2l2ZW4gYSB2YXJpYWJsZSBhcmd1bWVudCBsaXN0LiBUaGUKKyAqIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3Qgc2hvdWxkIGNvbnRhaW4gdGhlIHR5cGUgb2YgZWFjaCBhcmd1bWVudAorICogZm9sbG93ZWQgYnkgdGhlIHZhbHVlIHRvIGFwcGVuZC4gQXBwZW5kYWJsZSB0eXBlcyBhcmUgYmFzaWMgdHlwZXMsCisgKiBhbmQgYXJyYXlzIG9mIGZpeGVkLWxlbmd0aCBiYXNpYyB0eXBlcyAoZXhjZXB0IGFycmF5cyBvZiBVbml4IGZpbGUKKyAqIGRlc2NyaXB0b3JzKS4gVG8gYXBwZW5kIHZhcmlhYmxlLWxlbmd0aCBiYXNpYyB0eXBlcywgb3IgYW55IG1vcmUKKyAqIGNvbXBsZXggdmFsdWUsIHlvdSBoYXZlIHRvIHVzZSBhbiBpdGVyYXRvciByYXRoZXIgdGhhbiB0aGlzCisgKiBmdW5jdGlvbi4KKyAqCisgKiBUbyBhcHBlbmQgYSBiYXNpYyB0eXBlLCBzcGVjaWZ5IGl0cyB0eXBlIGNvZGUgZm9sbG93ZWQgYnkgdGhlCisgKiBhZGRyZXNzIG9mIHRoZSB2YWx1ZS4gRm9yIGV4YW1wbGU6CisgKgorICogQGNvZGUKKyAqCisgKiBkYnVzX2ludDMyX3Qgdl9JTlQzMiA9IDQyOworICogY29uc3QgY2hhciAqdl9TVFJJTkcgPSAiSGVsbG8gV29ybGQiOworICogZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdl9TVFJJTkcsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKyAqIEBlbmRjb2RlCisgKgorICogVG8gYXBwZW5kIGFuIGFycmF5IG9mIGZpeGVkLWxlbmd0aCBiYXNpYyB0eXBlcyAoZXhjZXB0IFVuaXggZmlsZQorICogZGVzY3JpcHRvcnMpLCBwYXNzIGluIHRoZSBEQlVTX1RZUEVfQVJSQVkgdHlwZWNvZGUsIHRoZSBlbGVtZW50CisgKiB0eXBlY29kZSwgdGhlIGFkZHJlc3Mgb2YgdGhlIGFycmF5IHBvaW50ZXIsIGFuZCBhIDMyLWJpdCBpbnRlZ2VyCisgKiBnaXZpbmcgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkuIFNvIGZvciBleGFtcGxlOiBAY29kZQorICogY29uc3QgZGJ1c19pbnQzMl90IGFycmF5W10gPSB7IDEsIDIsIDMgfTsgY29uc3QgZGJ1c19pbnQzMl90CisgKiAqdl9BUlJBWSA9IGFycmF5OyBkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgKiBEQlVTX1RZUEVfQVJSQVksIERCVVNfVFlQRV9JTlQzMiwgJnZfQVJSQVksIDMsIERCVVNfVFlQRV9JTlZBTElEKTsKKyAqIEBlbmRjb2RlCisgKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGFycmF5cyBvZiBVbml4IGZpbGUgZGVzY3JpcHRvcnMuIElmCisgKiB5b3UgbmVlZCB0aG9zZSB5b3UgbmVlZCB0byBtYW51YWxseSByZWN1cnNlIGludG8gdGhlIGFycmF5LgorICoKKyAqIEZvciBVbml4IGZpbGUgZGVzY3JpcHRvcnMgdGhpcyBmdW5jdGlvbiB3aWxsIGludGVybmFsbHkgZHVwbGljYXRlCisgKiB0aGUgZGVzY3JpcHRvciB5b3UgcGFzc2VkIGluLiBIZW5jZSB5b3UgbWF5IGNsb3NlIHRoZSBkZXNjcmlwdG9yCisgKiBpbW1lZGlhdGVseSBhZnRlciB0aGlzIGNhbGwuCisgKgorICogQHdhcm5pbmcgaW4gQywgZ2l2ZW4gImludCBhcnJheVtdIiwgIiZhcnJheSA9PSBhcnJheSIgKHRoZQorICogY29tcC5sYW5nLmMgRkFRIHNheXMgb3RoZXJ3aXNlLCBidXQgZ2NjIGFuZCB0aGUgRkFRIGRvbid0IGFncmVlKS4KKyAqIFNvIGlmIHlvdSdyZSB1c2luZyBhbiBhcnJheSBpbnN0ZWFkIG9mIGEgcG9pbnRlciB5b3UgaGF2ZSB0byBjcmVhdGUKKyAqIGEgcG9pbnRlciB2YXJpYWJsZSwgYXNzaWduIHRoZSBhcnJheSB0byBpdCwgdGhlbiB0YWtlIHRoZSBhZGRyZXNzCisgKiBvZiB0aGUgcG9pbnRlciB2YXJpYWJsZS4gRm9yIHN0cmluZ3MgaXQgd29ya3MgdG8gd3JpdGUKKyAqIGNvbnN0IGNoYXIgKmFycmF5ID0gIkhlbGxvIiBhbmQgdGhlbiB1c2UgJmFycmF5IHRob3VnaC4KKyAqCisgKiBUaGUgbGFzdCBhcmd1bWVudCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgI0RCVVNfVFlQRV9JTlZBTElELAorICogbWFya2luZyB0aGUgZW5kIG9mIHRoZSBhcmd1bWVudCBsaXN0LiBJZiB5b3UgZG9uJ3QgZG8gdGhpcworICogdGhlbiBsaWJkYnVzIHdvbid0IGtub3cgdG8gc3RvcCBhbmQgd2lsbCByZWFkIGludmFsaWQgbWVtb3J5LgorICoKKyAqIFN0cmluZy9zaWduYXR1cmUvcGF0aCBhcnJheXMgc2hvdWxkIGJlIHBhc3NlZCBpbiBhcyAiY29uc3QgY2hhcioqKgorICogYWRkcmVzc19vZl9hcnJheSIgYW5kICJpbnQgbl9lbGVtZW50cyIKKyAqCisgKiBAdG9kbyBzdXBwb3J0IERCVVNfVFlQRV9TVFJVQ1QgYW5kIERCVVNfVFlQRV9WQVJJQU5UIGFuZCBjb21wbGV4IGFycmF5cworICoKKyAqIEB0b2RvIElmIHRoaXMgZmFpbHMgZHVlIHRvIGxhY2sgb2YgbWVtb3J5LCB0aGUgbWVzc2FnZSBpcyBob3NlZCBhbmQKKyAqIHlvdSBoYXZlIHRvIHN0YXJ0IG92ZXIgYnVpbGRpbmcgdGhlIHdob2xlIG1lc3NhZ2UuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBmaXJzdF9hcmdfdHlwZSB0eXBlIG9mIHRoZSBmaXJzdCBhcmd1bWVudAorICogQHBhcmFtIC4uLiB2YWx1ZSBvZiBmaXJzdCBhcmd1bWVudCwgbGlzdCBvZiBhZGRpdGlvbmFsIHR5cGUtdmFsdWUgcGFpcnMKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisJCQkgIGludCAgICAgICAgICBmaXJzdF9hcmdfdHlwZSwKKwkJCSAgLi4uKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIHZhX2xpc3QgdmFyX2FyZ3M7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKworICB2YV9zdGFydCAodmFyX2FyZ3MsIGZpcnN0X2FyZ190eXBlKTsKKyAgcmV0dmFsID0gZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzX3ZhbGlzdCAobWVzc2FnZSwKKwkJCQkJICAgIGZpcnN0X2FyZ190eXBlLAorCQkJCQkgICAgdmFyX2FyZ3MpOworICB2YV9lbmQgKHZhcl9hcmdzKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIExpa2UgZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzKCkgYnV0IHRha2VzIGEgdmFfbGlzdCBmb3IgdXNlIGJ5IGxhbmd1YWdlIGJpbmRpbmdzLgorICoKKyAqIEB0b2RvIGZvciBub3csIGlmIHRoaXMgZnVuY3Rpb24gZmFpbHMgZHVlIHRvIE9PTSBpdCB3aWxsIGxlYXZlCisgKiB0aGUgbWVzc2FnZSBoYWxmLXdyaXR0ZW4gYW5kIHlvdSBoYXZlIHRvIGRpc2NhcmQgdGhlIG1lc3NhZ2UKKyAqIGFuZCBzdGFydCBvdmVyLgorICoKKyAqIEBzZWUgZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzLgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBmaXJzdF9hcmdfdHlwZSB0eXBlIG9mIGZpcnN0IGFyZ3VtZW50CisgKiBAcGFyYW0gdmFyX2FyZ3MgdmFsdWUgb2YgZmlyc3QgYXJndW1lbnQsIHRoZW4gbGlzdCBvZiB0eXBlL3ZhbHVlIHBhaXJzCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3NfdmFsaXN0IChEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKwkJCQkgaW50ICAgICAgICAgIGZpcnN0X2FyZ190eXBlLAorCQkJCSB2YV9saXN0ICAgICAgdmFyX2FyZ3MpCit7CisgIGludCB0eXBlOworICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworCisgIHR5cGUgPSBmaXJzdF9hcmdfdHlwZTsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAobWVzc2FnZSwgJml0ZXIpOworCisgIHdoaWxlICh0eXBlICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgIHsKKyAgICAgIGlmIChkYnVzX3R5cGVfaXNfYmFzaWMgKHR5cGUpKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgREJ1c0Jhc2ljVmFsdWUgKnZhbHVlOworICAgICAgICAgIHZhbHVlID0gdmFfYXJnICh2YXJfYXJncywgY29uc3QgREJ1c0Jhc2ljVmFsdWUqKTsKKworICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpKQorICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHR5cGUgPT0gREJVU19UWVBFX0FSUkFZKQorICAgICAgICB7CisgICAgICAgICAgaW50IGVsZW1lbnRfdHlwZTsKKyAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgYXJyYXk7CisgICAgICAgICAgY2hhciBidWZbMl07CisKKyAgICAgICAgICBlbGVtZW50X3R5cGUgPSB2YV9hcmcgKHZhcl9hcmdzLCBpbnQpOworICAgICAgICAgICAgICAKKyAgICAgICAgICBidWZbMF0gPSBlbGVtZW50X3R5cGU7CisgICAgICAgICAgYnVmWzFdID0gJ1wwJzsKKyAgICAgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQVJSQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhcnJheSkpCisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKworICAgICAgICAgIGlmIChkYnVzX3R5cGVfaXNfZml4ZWQgKGVsZW1lbnRfdHlwZSkgJiYKKyAgICAgICAgICAgICAgZWxlbWVudF90eXBlICE9IERCVVNfVFlQRV9VTklYX0ZEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjb25zdCBEQnVzQmFzaWNWYWx1ZSAqKnZhbHVlOworICAgICAgICAgICAgICBpbnQgbl9lbGVtZW50czsKKworICAgICAgICAgICAgICB2YWx1ZSA9IHZhX2FyZyAodmFyX2FyZ3MsIGNvbnN0IERCdXNCYXNpY1ZhbHVlKiopOworICAgICAgICAgICAgICBuX2VsZW1lbnRzID0gdmFfYXJnICh2YXJfYXJncywgaW50KTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2ZpeGVkX2FycmF5ICgmYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fZWxlbWVudHMpKSB7CisgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmYXJyYXkpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoX0RCVVNfVFlQRV9JU19TVFJJTkdMSUtFIChlbGVtZW50X3R5cGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjb25zdCBjaGFyICoqKnZhbHVlX3A7CisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKip2YWx1ZTsKKyAgICAgICAgICAgICAgaW50IG5fZWxlbWVudHM7CisgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgdmFsdWVfcCA9IHZhX2FyZyAodmFyX2FyZ3MsIGNvbnN0IGNoYXIqKiopOworICAgICAgICAgICAgICBuX2VsZW1lbnRzID0gdmFfYXJnICh2YXJfYXJncywgaW50KTsKKworICAgICAgICAgICAgICB2YWx1ZSA9ICp2YWx1ZV9wOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICAgIHdoaWxlIChpIDwgbl9lbGVtZW50cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJmFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJmFycmF5KTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoImFycmF5cyBvZiAlcyBjYW4ndCBiZSBhcHBlbmRlZCB3aXRoICVzIGZvciBub3dcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChlbGVtZW50X3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19GVU5DVElPTl9OQU1FKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJml0ZXIsICZhcnJheSkpCisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgidHlwZSAlcyBpc24ndCBzdXBwb3J0ZWQgeWV0IGluICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nICh0eXBlKSwgX0RCVVNfRlVOQ1RJT05fTkFNRSk7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICB0eXBlID0gdmFfYXJnICh2YXJfYXJncywgaW50KTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7CisKKyBmYWlsZWQ6CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBHZXRzIGFyZ3VtZW50cyBmcm9tIGEgbWVzc2FnZSBnaXZlbiBhIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3QuICBUaGUKKyAqIHN1cHBvcnRlZCB0eXBlcyBpbmNsdWRlIHRob3NlIHN1cHBvcnRlZCBieQorICogZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzKCk7IHRoYXQgaXMsIGJhc2ljIHR5cGVzIGFuZCBhcnJheXMgb2YKKyAqIGZpeGVkLWxlbmd0aCBiYXNpYyB0eXBlcy4gIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIHRoZXkgd291bGQKKyAqIGJlIGZvciBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMoKSBvcgorICogZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2ZpeGVkX2FycmF5KCkuCisgKgorICogSW4gYWRkaXRpb24gdG8gdGhvc2UgdHlwZXMsIGFycmF5cyBvZiBzdHJpbmcsIG9iamVjdCBwYXRoLCBhbmQKKyAqIHNpZ25hdHVyZSBhcmUgc3VwcG9ydGVkOyBidXQgdGhlc2UgYXJlIHJldHVybmVkIGFzIGFsbG9jYXRlZCBtZW1vcnkKKyAqIGFuZCBtdXN0IGJlIGZyZWVkIHdpdGggZGJ1c19mcmVlX3N0cmluZ19hcnJheSgpLCB3aGlsZSB0aGUgb3RoZXIKKyAqIHR5cGVzIGFyZSByZXR1cm5lZCBhcyBjb25zdCByZWZlcmVuY2VzLiBUbyBnZXQgYSBzdHJpbmcgYXJyYXkKKyAqIHBhc3MgaW4gImNoYXIgKioqYXJyYXlfbG9jYXRpb24iIGFuZCAiaW50ICpuX2VsZW1lbnRzIi4KKyAqCisgKiBTaW1pbGFyIHRvIGRidXNfbWVzc2FnZV9nZXRfZml4ZWRfYXJyYXkoKSB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90CisgKiBzdXBwb3J0IGFycmF5cyBvZiB0eXBlIERCVVNfVFlQRV9VTklYX0ZELiBJZiB5b3UgbmVlZCB0byBwYXJzZQorICogbWVzc2FnZXMgd2l0aCBhcnJheXMgb2YgVW5peCBmaWxlIGRlc2NyaXB0b3JzIHlvdSBuZWVkIHRvIHJlY3Vyc2UKKyAqIGludG8gdGhlIGFycmF5IG1hbnVhbGx5LgorICoKKyAqIFVuaXggZmlsZSBkZXNjcmlwdG9ycyB0aGF0IGFyZSByZWFkIHdpdGggdGhpcyBmdW5jdGlvbiB3aWxsIGhhdmUKKyAqIHRoZSBGRF9DTE9FWEVDIGZsYWcgc2V0LiBJZiB5b3UgbmVlZCB0aGVtIHdpdGhvdXQgdGhpcyBmbGFnIHNldCwKKyAqIG1ha2Ugc3VyZSB0byB1bnNldCBpdCB3aXRoIGZjbnRsKCkuCisgKgorICogVGhlIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3Qgc2hvdWxkIGNvbnRhaW4gdGhlIHR5cGUgb2YgdGhlIGFyZ3VtZW50CisgKiBmb2xsb3dlZCBieSBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIHZhbHVlIHNob3VsZCBiZSBzdG9yZWQuIFRoZSBsaXN0CisgKiBpcyB0ZXJtaW5hdGVkIHdpdGggI0RCVVNfVFlQRV9JTlZBTElELgorICoKKyAqIEV4Y2VwdCBmb3Igc3RyaW5nIGFycmF5cywgdGhlIHJldHVybmVkIHZhbHVlcyBhcmUgY29uc3RhbnQ7IGRvIG5vdAorICogZnJlZSB0aGVtLiBUaGV5IHBvaW50IGludG8gdGhlICNEQnVzTWVzc2FnZS4KKyAqCisgKiBJZiB0aGUgcmVxdWVzdGVkIGFyZ3VtZW50cyBhcmUgbm90IHByZXNlbnQsIG9yIGRvIG5vdCBoYXZlIHRoZQorICogcmVxdWVzdGVkIHR5cGVzLCB0aGVuIGFuIGVycm9yIHdpbGwgYmUgc2V0LgorICoKKyAqIElmIG1vcmUgYXJndW1lbnRzIHRoYW4gcmVxdWVzdGVkIGFyZSBwcmVzZW50LCB0aGUgcmVxdWVzdGVkCisgKiBhcmd1bWVudHMgYXJlIHJldHVybmVkIGFuZCB0aGUgZXh0cmEgYXJndW1lbnRzIGFyZSBpZ25vcmVkLgorICogCisgKiBAdG9kbyBzdXBwb3J0IERCVVNfVFlQRV9TVFJVQ1QgYW5kIERCVVNfVFlQRV9WQVJJQU5UIGFuZCBjb21wbGV4IGFycmF5cworICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgdG8gYmUgZmlsbGVkIGluIG9uIGZhaWx1cmUKKyAqIEBwYXJhbSBmaXJzdF9hcmdfdHlwZSB0aGUgZmlyc3QgYXJndW1lbnQgdHlwZQorICogQHBhcmFtIC4uLiBsb2NhdGlvbiBmb3IgZmlyc3QgYXJndW1lbnQgdmFsdWUsIHRoZW4gbGlzdCBvZiB0eXBlLWxvY2F0aW9uIHBhaXJzCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlIGVycm9yIHdhcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9nZXRfYXJncyAoREJ1c01lc3NhZ2UgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgKmVycm9yLAorCQkgICAgICAgaW50ICAgICAgICAgICAgICBmaXJzdF9hcmdfdHlwZSwKKwkJICAgICAgIC4uLikKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICB2YV9saXN0IHZhcl9hcmdzOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZXJyb3JfaXNfc2V0IChlcnJvciwgRkFMU0UpOworCisgIHZhX3N0YXJ0ICh2YXJfYXJncywgZmlyc3RfYXJnX3R5cGUpOworICByZXR2YWwgPSBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3NfdmFsaXN0IChtZXNzYWdlLCBlcnJvciwgZmlyc3RfYXJnX3R5cGUsIHZhcl9hcmdzKTsKKyAgdmFfZW5kICh2YXJfYXJncyk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBMaWtlIGRidXNfbWVzc2FnZV9nZXRfYXJncyBidXQgdGFrZXMgYSB2YV9saXN0IGZvciB1c2UgYnkgbGFuZ3VhZ2UgYmluZGluZ3MuCisgKgorICogQHNlZSBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgdG8gYmUgZmlsbGVkIGluCisgKiBAcGFyYW0gZmlyc3RfYXJnX3R5cGUgdHlwZSBvZiB0aGUgZmlyc3QgYXJndW1lbnQKKyAqIEBwYXJhbSB2YXJfYXJncyByZXR1cm4gbG9jYXRpb24gZm9yIGZpcnN0IGFyZ3VtZW50LCBmb2xsb3dlZCBieSBsaXN0IG9mIHR5cGUvbG9jYXRpb24gcGFpcnMKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciB3YXMgc2V0CisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfZ2V0X2FyZ3NfdmFsaXN0IChEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgKmVycm9yLAorCQkJICAgICAgaW50ICAgICAgICAgICAgICBmaXJzdF9hcmdfdHlwZSwKKwkJCSAgICAgIHZhX2xpc3QgICAgICAgICAgdmFyX2FyZ3MpCit7CisgIERCdXNNZXNzYWdlSXRlciBpdGVyOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZXJyb3JfaXNfc2V0IChlcnJvciwgRkFMU0UpOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXQgKG1lc3NhZ2UsICZpdGVyKTsKKyAgcmV0dXJuIF9kYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnc192YWxpc3QgKCZpdGVyLCBlcnJvciwgZmlyc3RfYXJnX3R5cGUsIHZhcl9hcmdzKTsKK30KKworc3RhdGljIHZvaWQKK19kYnVzX21lc3NhZ2VfaXRlcl9pbml0X2NvbW1vbiAoREJ1c01lc3NhZ2UgICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgaXRlcl90eXBlKQoreworICBfZGJ1c19hc3NlcnQgKHNpemVvZiAoREJ1c01lc3NhZ2VSZWFsSXRlcikgPD0gc2l6ZW9mIChEQnVzTWVzc2FnZUl0ZXIpKTsKKworICAvKiBTaW5jZSB0aGUgaXRlcmF0b3Igd2lsbCByZWFkIG9yIHdyaXRlIHdoby1rbm93cy13aGF0IGZyb20gdGhlCisgICAqIG1lc3NhZ2UsIHdlIG5lZWQgdG8gZ2V0IGluIHRoZSByaWdodCBieXRlIG9yZGVyCisgICAqLworICBlbnN1cmVfYnl0ZV9vcmRlciAobWVzc2FnZSk7CisgIAorICByZWFsLT5tZXNzYWdlID0gbWVzc2FnZTsKKyAgcmVhbC0+Y2hhbmdlZF9zdGFtcCA9IG1lc3NhZ2UtPmNoYW5nZWRfc3RhbXA7CisgIHJlYWwtPml0ZXJfdHlwZSA9IGl0ZXJfdHlwZTsKKyAgcmVhbC0+c2lnX3JlZmNvdW50ID0gMDsKK30KKworLyoqCisgKiBJbml0aWFsaXplcyBhICNEQnVzTWVzc2FnZUl0ZXIgZm9yIHJlYWRpbmcgdGhlIGFyZ3VtZW50cyBvZiB0aGUKKyAqIG1lc3NhZ2UgcGFzc2VkIGluLgorICoKKyAqIFdoZW4gcG9zc2libGUsIGRidXNfbWVzc2FnZV9nZXRfYXJncygpIGlzIG11Y2ggbW9yZSBjb252ZW5pZW50LgorICogU29tZSB0eXBlcyBvZiBhcmd1bWVudCBjYW4gb25seSBiZSByZWFkIHdpdGggI0RCdXNNZXNzYWdlSXRlcgorICogaG93ZXZlci4KKyAqCisgKiBUaGUgZWFzaWVzdCB3YXkgdG8gaXRlcmF0ZSBpcyBsaWtlIHRoaXM6IAorICogQGNvZGUKKyAqIGRidXNfbWVzc2FnZV9pdGVyX2luaXQgKG1lc3NhZ2UsICZpdGVyKTsKKyAqIHdoaWxlICgoY3VycmVudF90eXBlID0gZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmaXRlcikpICE9IERCVVNfVFlQRV9JTlZBTElEKQorICogICBkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmaXRlcik7CisgKiBAZW5kY29kZQorICoKKyAqICNEQnVzTWVzc2FnZUl0ZXIgY29udGFpbnMgbm8gYWxsb2NhdGVkIG1lbW9yeTsgaXQgbmVlZCBub3QgYmUKKyAqIGZyZWVkLCBhbmQgY2FuIGJlIGNvcGllZCBieSBhc3NpZ25tZW50IG9yIG1lbWNweSgpLgorICogCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIGl0ZXIgcG9pbnRlciB0byBhbiBpdGVyYXRvciB0byBpbml0aWFsaXplCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlIG1lc3NhZ2UgaGFzIG5vIGFyZ3VtZW50cworICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdCAoREJ1c01lc3NhZ2UgICAgICptZXNzYWdlLAorCQkJREJ1c01lc3NhZ2VJdGVyICppdGVyKQoreworICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKilpdGVyOworICBjb25zdCBEQnVzU3RyaW5nICp0eXBlX3N0cjsKKyAgaW50IHR5cGVfcG9zOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoaXRlciAhPSBOVUxMLCBGQUxTRSk7CisKKyAgZ2V0X2NvbnN0X3NpZ25hdHVyZSAoJm1lc3NhZ2UtPmhlYWRlciwgJnR5cGVfc3RyLCAmdHlwZV9wb3MpOworCisgIF9kYnVzX21lc3NhZ2VfaXRlcl9pbml0X2NvbW1vbiAobWVzc2FnZSwgcmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX01FU1NBR0VfSVRFUl9UWVBFX1JFQURFUik7CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfaW5pdCAoJnJlYWwtPnUucmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19oZWFkZXJfZ2V0X2J5dGVfb3JkZXIgKCZtZXNzYWdlLT5oZWFkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX3N0ciwgdHlwZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlLT5ib2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnJlYWwtPnUucmVhZGVyKSAhPSBEQlVTX1RZUEVfSU5WQUxJRDsKK30KKworLyoqCisgKiBDaGVja3MgaWYgYW4gaXRlcmF0b3IgaGFzIGFueSBtb3JlIGZpZWxkcy4KKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgbWVzc2FnZSBpdGVyCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGVyZSBhcmUgbW9yZSBmaWVsZHMgZm9sbG93aW5nCisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfaXRlcl9oYXNfbmV4dCAoREJ1c01lc3NhZ2VJdGVyICppdGVyKQoreworICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKilpdGVyOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfbWVzc2FnZV9pdGVyX2NoZWNrIChyZWFsKSwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHJlYWwtPml0ZXJfdHlwZSA9PSBEQlVTX01FU1NBR0VfSVRFUl9UWVBFX1JFQURFUiwgRkFMU0UpOworCisgIHJldHVybiBfZGJ1c190eXBlX3JlYWRlcl9oYXNfbmV4dCAoJnJlYWwtPnUucmVhZGVyKTsKK30KKworLyoqCisgKiBNb3ZlcyB0aGUgaXRlcmF0b3IgdG8gdGhlIG5leHQgZmllbGQsIGlmIGFueS4gSWYgdGhlcmUncyBubyBuZXh0CisgKiBmaWVsZCwgcmV0dXJucyAjRkFMU0UuIElmIHRoZSBpdGVyYXRvciBtb3ZlcyBmb3J3YXJkLCByZXR1cm5zCisgKiAjVFJVRS4KKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgbWVzc2FnZSBpdGVyCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgaXRlcmF0b3Igd2FzIG1vdmVkIHRvIHRoZSBuZXh0IGZpZWxkCisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfaXRlcl9uZXh0IChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19tZXNzYWdlX2l0ZXJfY2hlY2sgKHJlYWwpLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocmVhbC0+aXRlcl90eXBlID09IERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfUkVBREVSLCBGQUxTRSk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZyZWFsLT51LnJlYWRlcik7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgYXJndW1lbnQgdHlwZSBvZiB0aGUgYXJndW1lbnQgdGhhdCB0aGUgbWVzc2FnZSBpdGVyYXRvcgorICogcG9pbnRzIHRvLiBJZiB0aGUgaXRlcmF0b3IgaXMgYXQgdGhlIGVuZCBvZiB0aGUgbWVzc2FnZSwgcmV0dXJucworICogI0RCVVNfVFlQRV9JTlZBTElELiBZb3UgY2FuIHRodXMgd3JpdGUgYSBsb29wIGFzIGZvbGxvd3M6CisgKgorICogQGNvZGUKKyAqIGRidXNfbWVzc2FnZV9pdGVyX2luaXQgKG1lc3NhZ2UsICZpdGVyKTsKKyAqIHdoaWxlICgoY3VycmVudF90eXBlID0gZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmaXRlcikpICE9IERCVVNfVFlQRV9JTlZBTElEKQorICogICBkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmaXRlcik7CisgKiBAZW5kY29kZQorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBtZXNzYWdlIGl0ZXIKKyAqIEByZXR1cm5zIHRoZSBhcmd1bWVudCB0eXBlCisgKi8KK2ludAorZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19tZXNzYWdlX2l0ZXJfY2hlY2sgKHJlYWwpLCBEQlVTX1RZUEVfSU5WQUxJRCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocmVhbC0+aXRlcl90eXBlID09IERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfUkVBREVSLCBGQUxTRSk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZyZWFsLT51LnJlYWRlcik7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgZWxlbWVudCB0eXBlIG9mIHRoZSBhcnJheSB0aGF0IHRoZSBtZXNzYWdlIGl0ZXJhdG9yCisgKiBwb2ludHMgdG8uIE5vdGUgdGhhdCB5b3UgbmVlZCB0byBjaGVjayB0aGF0IHRoZSBpdGVyYXRvciBwb2ludHMgdG8KKyAqIGFuIGFycmF5IHByaW9yIHRvIHVzaW5nIHRoaXMgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIG1lc3NhZ2UgaXRlcgorICogQHJldHVybnMgdGhlIGFycmF5IGVsZW1lbnQgdHlwZQorICovCitpbnQKK2RidXNfbWVzc2FnZV9pdGVyX2dldF9lbGVtZW50X3R5cGUgKERCdXNNZXNzYWdlSXRlciAqaXRlcikKK3sKKyAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbCA9IChEQnVzTWVzc2FnZVJlYWxJdGVyICopaXRlcjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9jaGVjayAocmVhbCksIERCVVNfVFlQRV9JTlZBTElEKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChyZWFsLT5pdGVyX3R5cGUgPT0gREJVU19NRVNTQUdFX0lURVJfVFlQRV9SRUFERVIsIERCVVNfVFlQRV9JTlZBTElEKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKGl0ZXIpID09IERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX0lOVkFMSUQpOworCisgIHJldHVybiBfZGJ1c190eXBlX3JlYWRlcl9nZXRfZWxlbWVudF90eXBlICgmcmVhbC0+dS5yZWFkZXIpOworfQorCisvKioKKyAqIFJlY3Vyc2VzIGludG8gYSBjb250YWluZXIgdmFsdWUgd2hlbiByZWFkaW5nIHZhbHVlcyBmcm9tIGEgbWVzc2FnZSwKKyAqIGluaXRpYWxpemluZyBhIHN1Yi1pdGVyYXRvciB0byB1c2UgZm9yIHRyYXZlcnNpbmcgdGhlIGNoaWxkIHZhbHVlcworICogb2YgdGhlIGNvbnRhaW5lci4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyByZWN1cnNlcyBpbnRvIGEgdmFsdWUsIG5vdCBhIHR5cGUsIHNvIHlvdSBjYW4gb25seQorICogcmVjdXJzZSBpZiB0aGUgdmFsdWUgZXhpc3RzLiBUaGUgbWFpbiBpbXBsaWNhdGlvbiBvZiB0aGlzIGlzIHRoYXQKKyAqIGlmIHlvdSBoYXZlIGZvciBleGFtcGxlIGFuIGVtcHR5IGFycmF5IG9mIGFycmF5IG9mIGludDMyLCB5b3UgY2FuCisgKiByZWN1cnNlIGludG8gdGhlIG91dGVybW9zdCBhcnJheSwgYnV0IGl0IHdpbGwgaGF2ZSBubyB2YWx1ZXMsIHNvCisgKiB5b3Ugd29uJ3QgYmUgYWJsZSB0byByZWN1cnNlIGZ1cnRoZXIuIFRoZXJlJ3Mgbm8gYXJyYXkgb2YgaW50MzIgdG8KKyAqIHJlY3Vyc2UgaW50by4KKyAqCisgKiBJZiBhIGNvbnRhaW5lciBpcyBhbiBhcnJheSBvZiBmaXhlZC1sZW5ndGggdHlwZXMgKGV4Y2VwdCBVbml4IGZpbGUKKyAqIGRlc2NyaXB0b3JzKSwgaXQgaXMgbXVjaCBtb3JlIGVmZmljaWVudCB0byB1c2UKKyAqIGRidXNfbWVzc2FnZV9pdGVyX2dldF9maXhlZF9hcnJheSgpIHRvIGdldCB0aGUgd2hvbGUgYXJyYXkgaW4gb25lCisgKiBzaG90LCByYXRoZXIgdGhhbiBpbmRpdmlkdWFsbHkgd2Fsa2luZyBvdmVyIHRoZSBhcnJheSBlbGVtZW50cy4KKyAqCisgKiBCZSBzdXJlIHlvdSBoYXZlIHNvbWVob3cgY2hlY2tlZCB0aGF0CisgKiBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUoKSBtYXRjaGVzIHRoZSB0eXBlIHlvdSBhcmUgZXhwZWN0aW5nCisgKiB0byByZWN1cnNlIGludG8uIFJlc3VsdHMgb2YgdGhpcyBmdW5jdGlvbiBhcmUgdW5kZWZpbmVkIGlmIHRoZXJlIGlzCisgKiBubyBjb250YWluZXIgdG8gcmVjdXJzZSBpbnRvIGF0IHRoZSBjdXJyZW50IGl0ZXJhdG9yIHBvc2l0aW9uLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBtZXNzYWdlIGl0ZXJhdG9yCisgKiBAcGFyYW0gc3ViIHRoZSBzdWItaXRlcmF0b3IgdG8gaW5pdGlhbGl6ZQorICovCit2b2lkCitkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlIChEQnVzTWVzc2FnZUl0ZXIgICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICAqc3ViKQoreworICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKilpdGVyOworICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsX3N1YiA9IChEQnVzTWVzc2FnZVJlYWxJdGVyICopc3ViOworCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChfZGJ1c19tZXNzYWdlX2l0ZXJfY2hlY2sgKHJlYWwpKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKHN1YiAhPSBOVUxMKTsKKworICAqcmVhbF9zdWIgPSAqcmVhbDsKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAoJnJlYWwtPnUucmVhZGVyLCAmcmVhbF9zdWItPnUucmVhZGVyKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNpZ25hdHVyZSBvZiBhIG1lc3NhZ2UgaXRlcmF0b3IuICBUaGlzCisgKiBpcyB1c2VmdWwgcHJpbWFyaWx5IGZvciBkZWFsaW5nIHdpdGggdmFyaWFudHM7IG9uZSBjYW4KKyAqIHJlY3Vyc2UgaW50byBhIHZhcmlhbnQgYW5kIGRldGVybWluZSB0aGUgc2lnbmF0dXJlIG9mCisgKiB0aGUgdmFyaWFudCdzIHZhbHVlLgorICoKKyAqIFRoZSByZXR1cm5lZCBzdHJpbmcgbXVzdCBiZSBmcmVlZCB3aXRoIGRidXNfZnJlZSgpLgorICogCisgKiBAcGFyYW0gaXRlciB0aGUgbWVzc2FnZSBpdGVyYXRvcgorICogQHJldHVybnMgdGhlIGNvbnRhaW5lZCBzaWduYXR1cmUsIG9yIE5VTEwgaWYgb3V0IG9mIG1lbW9yeQorICovCitjaGFyICoKK2RidXNfbWVzc2FnZV9pdGVyX2dldF9zaWduYXR1cmUgKERCdXNNZXNzYWdlSXRlciAqaXRlcikKK3sKKyAgY29uc3QgREJ1c1N0cmluZyAqc2lnOworICBEQnVzU3RyaW5nIHJldHN0cjsKKyAgY2hhciAqcmV0OworICBpbnQgc3RhcnQsIGxlbjsKKyAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbCA9IChEQnVzTWVzc2FnZVJlYWxJdGVyICopaXRlcjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9jaGVjayAocmVhbCksIE5VTEwpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZyZXRzdHIpKQorICAgIHJldHVybiBOVUxMOworCisgIF9kYnVzX3R5cGVfcmVhZGVyX2dldF9zaWduYXR1cmUgKCZyZWFsLT51LnJlYWRlciwgJnNpZywKKwkJCQkgICAmc3RhcnQsICZsZW4pOworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfbGVuICgmcmV0c3RyLAorCQkJCV9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc2lnKSArIHN0YXJ0LAorCQkJCWxlbikpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmICghX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgKCZyZXRzdHIsICZyZXQpKQorICAgIHJldHVybiBOVUxMOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnJldHN0cik7CisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogUmVhZHMgYSBiYXNpYy10eXBlZCB2YWx1ZSBmcm9tIHRoZSBtZXNzYWdlIGl0ZXJhdG9yLgorICogQmFzaWMgdHlwZXMgYXJlIHRoZSBub24tY29udGFpbmVycyBzdWNoIGFzIGludGVnZXIgYW5kIHN0cmluZy4KKyAqCisgKiBUaGUgdmFsdWUgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSBhZGRyZXNzIG9mIGEgbG9jYXRpb24gdG8gc3RvcmUKKyAqIHRoZSByZXR1cm5lZCB2YWx1ZS4gU28gZm9yIGludDMyIGl0IHNob3VsZCBiZSBhICJkYnVzX2ludDMyX3QqIgorICogYW5kIGZvciBzdHJpbmcgYSAiY29uc3QgY2hhcioqIi4gVGhlIHJldHVybmVkIHZhbHVlIGlzCisgKiBieSByZWZlcmVuY2UgYW5kIHNob3VsZCBub3QgYmUgZnJlZWQuCisgKgorICogVGhpcyBjYWxsIGR1cGxpY2F0ZXMgVW5peCBmaWxlIGRlc2NyaXB0b3JzIHdoZW4gcmVhZGluZyB0aGVtLiBJdCBpcworICogeW91ciBqb2IgdG8gY2xvc2UgdGhlbSB3aGVuIHlvdSBkb24ndCBuZWVkIHRoZW0gYW55bW9yZS4KKyAqCisgKiBVbml4IGZpbGUgZGVzY3JpcHRvcnMgdGhhdCBhcmUgcmVhZCB3aXRoIHRoaXMgZnVuY3Rpb24gd2lsbCBoYXZlCisgKiB0aGUgRkRfQ0xPRVhFQyBmbGFnIHNldC4gSWYgeW91IG5lZWQgdGhlbSB3aXRob3V0IHRoaXMgZmxhZyBzZXQsCisgKiBtYWtlIHN1cmUgdG8gdW5zZXQgaXQgd2l0aCBmY250bCgpLgorICoKKyAqIEJlIHN1cmUgeW91IGhhdmUgc29tZWhvdyBjaGVja2VkIHRoYXQKKyAqIGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSgpIG1hdGNoZXMgdGhlIHR5cGUgeW91IGFyZQorICogZXhwZWN0aW5nLCBvciB5b3UnbGwgY3Jhc2ggd2hlbiB5b3UgdHJ5IHRvIHVzZSBhbiBpbnRlZ2VyIGFzIGEKKyAqIHN0cmluZyBvciBzb21ldGhpbmcuCisgKgorICogVG8gcmVhZCBhbnkgY29udGFpbmVyIHR5cGUgKGFycmF5LCBzdHJ1Y3QsIGRpY3QpIHlvdSB3aWxsIG5lZWQgdG8KKyAqIHJlY3Vyc2UgaW50byB0aGUgY29udGFpbmVyIHdpdGggZGJ1c19tZXNzYWdlX2l0ZXJfcmVjdXJzZSgpLiAgSWYKKyAqIHRoZSBjb250YWluZXIgaXMgYW4gYXJyYXkgb2YgZml4ZWQtbGVuZ3RoIHZhbHVlcyAoZXhjZXB0IFVuaXggZmlsZQorICogZGVzY3JpcHRvcnMpLCB5b3UgY2FuIGdldCBhbGwgdGhlIGFycmF5IGVsZW1lbnRzIGF0IG9uY2Ugd2l0aAorICogZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2ZpeGVkX2FycmF5KCkuIE90aGVyd2lzZSwgeW91IGhhdmUgdG8gaXRlcmF0ZQorICogb3ZlciB0aGUgY29udGFpbmVyJ3MgY29udGVudHMgb25lIHZhbHVlIGF0IGEgdGltZS4KKyAqCisgKiBBbGwgYmFzaWMtdHlwZWQgdmFsdWVzIGFyZSBndWFyYW50ZWVkIHRvIGZpdCBpbiBhICNEQnVzQmFzaWNWYWx1ZSwKKyAqIHNvIGluIHZlcnNpb25zIG9mIGxpYmRidXMgdGhhdCBoYXZlIHRoYXQgdHlwZSwgeW91IGNhbiB3cml0ZSBjb2RlIGxpa2UgdGhpczoKKyAqCisgKiBAY29kZQorICogREJ1c0Jhc2ljVmFsdWUgdmFsdWU7CisgKiBpbnQgdHlwZTsKKyAqIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoJnJlYWRfaXRlciwgJnZhbHVlKTsKKyAqIHR5cGUgPSBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZyZWFkX2l0ZXIpOworICogZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmd3JpdGVfaXRlciwgdHlwZSwgJnZhbHVlKTsKKyAqIEBlbmRjb2RlCisgKgorICogKEFsbCBELUJ1cyBiYXNpYyB0eXBlcyBhcmUgZWl0aGVyIG51bWVyaWMgYW5kIDggYnl0ZXMgb3Igc21hbGxlciwgb3IKKyAqIGJlaGF2ZSBsaWtlIGEgc3RyaW5nOyBzbyBpbiBvbGRlciB2ZXJzaW9ucyBvZiBsaWJkYnVzLCBEQnVzQmFzaWNWYWx1ZQorICogY2FuIGJlIHJlcGxhY2VkIHdpdGggdW5pb24geyBjaGFyICpzdHJpbmc7IHVuc2lnbmVkIGNoYXIgYnl0ZXNbOF07IH0sCisgKiBmb3IgaW5zdGFuY2UuKQorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBpdGVyYXRvcgorICogQHBhcmFtIHZhbHVlIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSB2YWx1ZQorICovCit2b2lkCitkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKERCdXNNZXNzYWdlSXRlciAgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKnZhbHVlKQoreworICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKilpdGVyOworCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChfZGJ1c19tZXNzYWdlX2l0ZXJfY2hlY2sgKHJlYWwpKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKHZhbHVlICE9IE5VTEwpOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKGl0ZXIpID09IERCVVNfVFlQRV9VTklYX0ZEKQorICAgIHsKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICAgICAgREJ1c0Jhc2ljVmFsdWUgaWR4OworCisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljKCZyZWFsLT51LnJlYWRlciwgJmlkeCk7CisKKyAgICAgIGlmIChpZHgudTMyID49IHJlYWwtPm1lc3NhZ2UtPm5fdW5peF9mZHMpIHsKKyAgICAgICAgLyogSG1tLCB3ZSBjYW5ub3QgcmVhbGx5IHNpZ25hbCBhbiBlcnJvciBoZXJlLCBzbyBsZXQncyBtYWtlCisgICAgICAgICAgIHN1cmUgdG8gcmV0dXJuIGFuIGludmFsaWQgZmQuICovCisgICAgICAgICooKGludCopIHZhbHVlKSA9IC0xOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgICooKGludCopIHZhbHVlKSA9IF9kYnVzX2R1cChyZWFsLT5tZXNzYWdlLT51bml4X2Zkc1tpZHgudTMyXSwgTlVMTCk7CisjZWxzZQorICAgICAgKigoaW50KikgdmFsdWUpID0gLTE7CisjZW5kaWYKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljICgmcmVhbC0+dS5yZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7CisgICAgfQorfQorCisvKioKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYXJyYXkgYXMgbWFyc2hhbGVkIGluIHRoZSB3aXJlCisgKiBwcm90b2NvbC4gVGhlIGl0ZXJhdG9yIG11c3QgY3VycmVudGx5IGJlIGluc2lkZSBhbiBhcnJheS10eXBlZAorICogdmFsdWUuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIG9uIHRoZSBncm91bmRzIHRoYXQgaXQgaXMgc3R1cGlkLiAgV2h5CisgKiB3b3VsZCB5b3Ugd2FudCB0byBrbm93IGhvdyBtYW55IGJ5dGVzIGFyZSBpbiB0aGUgYXJyYXkgYXMgbWFyc2hhbGVkCisgKiBpbiB0aGUgd2lyZSBwcm90b2NvbD8gIEZvciBub3csIHVzZSB0aGUgbl9lbGVtZW50cyByZXR1cm5lZCBmcm9tCisgKiBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZml4ZWRfYXJyYXkoKSBpbnN0ZWFkLCBvciBpdGVyYXRlIG92ZXIgdGhlCisgKiBhcnJheSB2YWx1ZXMgYW5kIGNvdW50IHRoZW0uCisgKgorICogQHRvZG8gaW50cm9kdWNlIGEgdmFyaWFudCBvZiB0aGlzIGdldF9uX2VsZW1lbnRzIHRoYXQgcmV0dXJucworICogdGhlIG51bWJlciBvZiBlbGVtZW50cywgdGhvdWdoIHdpdGggYSBub24tZml4ZWQgYXJyYXkgaXQgd2lsbCBub3QKKyAqIGJlIHZlcnkgZWZmaWNpZW50LCBzbyBtYXliZSBpdCdzIG5vdCBnb29kLgorICogCisgKiBAcGFyYW0gaXRlciB0aGUgaXRlcmF0b3IKKyAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGFycmF5CisgKi8KK2ludAorZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FycmF5X2xlbiAoREJ1c01lc3NhZ2VJdGVyICppdGVyKQoreworICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKilpdGVyOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfbWVzc2FnZV9pdGVyX2NoZWNrIChyZWFsKSwgMCk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfcmVhZGVyX2dldF9hcnJheV9sZW5ndGggKCZyZWFsLT51LnJlYWRlcik7Cit9CisKKy8qKgorICogUmVhZHMgYSBibG9jayBvZiBmaXhlZC1sZW5ndGggdmFsdWVzIGZyb20gdGhlIG1lc3NhZ2UgaXRlcmF0b3IuCisgKiBGaXhlZC1sZW5ndGggdmFsdWVzIGFyZSB0aG9zZSBiYXNpYyB0eXBlcyB0aGF0IGFyZSBub3Qgc3RyaW5nLWxpa2UsCisgKiBzdWNoIGFzIGludGVnZXJzLCBib29sLCBkb3VibGUuIFRoZSByZXR1cm5lZCBibG9jayB3aWxsIGJlIGZyb20gdGhlCisgKiBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBhcnJheSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBhcnJheS4KKyAqCisgKiBUaGVyZSBpcyBvbmUgZXhjZXB0aW9uIGhlcmU6IGFsdGhvdWdoIERCVVNfVFlQRV9VTklYX0ZEIGlzCisgKiBjb25zaWRlcmVkIGEgJ2ZpeGVkJyB0eXBlIGFycmF5cyBvZiB0aGlzIHR5cGUgbWF5IG5vdCBiZSByZWFkIHdpdGgKKyAqIHRoaXMgZnVuY3Rpb24uCisgKgorICogVGhlIG1lc3NhZ2UgaXRlciBzaG91bGQgYmUgImluIiB0aGUgYXJyYXkgKHRoYXQgaXMsIHlvdSByZWN1cnNlIGludG8gdGhlCisgKiBhcnJheSwgYW5kIHRoZW4geW91IGNhbGwgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2ZpeGVkX2FycmF5KCkgb24gdGhlCisgKiAic3ViLWl0ZXJhdG9yIiBjcmVhdGVkIGJ5IGRidXNfbWVzc2FnZV9pdGVyX3JlY3Vyc2UoKSkuCisgKgorICogVGhlIHZhbHVlIGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgYWRkcmVzcyBvZiBhIGxvY2F0aW9uIHRvIHN0b3JlIHRoZQorICogcmV0dXJuZWQgYXJyYXkuIFNvIGZvciBpbnQzMiBpdCBzaG91bGQgYmUgYSAiY29uc3QgZGJ1c19pbnQzMl90KioiCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgYnkgcmVmZXJlbmNlIGFuZCBzaG91bGQgbm90IGJlIGZyZWVkLgorICogCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgZGJ1c190eXBlX2lzX2ZpeGVkKCkgcmV0dXJucworICogI1RSVUUgZm9yIHRoZSBlbGVtZW50IHR5cGUuCisgKgorICogSWYgYW4gYXJyYXkncyBlbGVtZW50cyBhcmUgbm90IGZpeGVkIGluIHNpemUsIHlvdSBoYXZlIHRvIHJlY3Vyc2UKKyAqIGludG8gdGhlIGFycmF5IHdpdGggZGJ1c19tZXNzYWdlX2l0ZXJfcmVjdXJzZSgpIGFuZCByZWFkIHRoZQorICogZWxlbWVudHMgb25lIGJ5IG9uZS4KKyAqIAorICogQmVjYXVzZSB0aGUgYXJyYXkgaXMgbm90IGNvcGllZCwgdGhpcyBmdW5jdGlvbiBydW5zIGluIGNvbnN0YW50CisgKiB0aW1lIGFuZCBpcyBmYXN0OyBpdCdzIG11Y2ggcHJlZmVycmVkIG92ZXIgd2Fsa2luZyB0aGUgZW50aXJlIGFycmF5CisgKiB3aXRoIGFuIGl0ZXJhdG9yLiAoSG93ZXZlciwgeW91IGNhbiBhbHdheXMgdXNlCisgKiBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlKCksIGV2ZW4gZm9yIGZpeGVkLWxlbmd0aCB0eXBlczsKKyAqIGRidXNfbWVzc2FnZV9pdGVyX2dldF9maXhlZF9hcnJheSgpIGlzIGp1c3QgYW4gb3B0aW1pemF0aW9uLikKKyAqIAorICogQHBhcmFtIGl0ZXIgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gdmFsdWUgbG9jYXRpb24gdG8gc3RvcmUgdGhlIGJsb2NrCisgKiBAcGFyYW0gbl9lbGVtZW50cyBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGJsb2NrCisgKi8KK3ZvaWQKK2RidXNfbWVzc2FnZV9pdGVyX2dldF9maXhlZF9hcnJheSAoREJ1c01lc3NhZ2VJdGVyICAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKm5fZWxlbWVudHMpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgaW50IHN1YnR5cGUgPSBfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlKCZyZWFsLT51LnJlYWRlcik7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9jaGVjayAocmVhbCkpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAodmFsdWUgIT0gTlVMTCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsICgoc3VidHlwZSA9PSBEQlVTX1RZUEVfSU5WQUxJRCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChkYnVzX3R5cGVfaXNfZml4ZWQgKHN1YnR5cGUpICYmIHN1YnR5cGUgIT0gREJVU19UWVBFX1VOSVhfRkQpKTsKKyNlbmRpZgorCisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfZml4ZWRfbXVsdGkgKCZyZWFsLT51LnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIG5fZWxlbWVudHMpOworfQorCisvKioKKyAqIEluaXRpYWxpemVzIGEgI0RCdXNNZXNzYWdlSXRlciBmb3IgYXBwZW5kaW5nIGFyZ3VtZW50cyB0byB0aGUgZW5kCisgKiBvZiBhIG1lc3NhZ2UuCisgKgorICogQHRvZG8gSWYgYXBwZW5kaW5nIGFueSBvZiB0aGUgYXJndW1lbnRzIGZhaWxzIGR1ZSB0byBsYWNrIG9mCisgKiBtZW1vcnksIHRoZSBtZXNzYWdlIGlzIGhvc2VkIGFuZCB5b3UgaGF2ZSB0byBzdGFydCBvdmVyIGJ1aWxkaW5nCisgKiB0aGUgd2hvbGUgbWVzc2FnZS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIGl0ZXIgcG9pbnRlciB0byBhbiBpdGVyYXRvciB0byBpbml0aWFsaXplCisgKi8KK3ZvaWQKK2RidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisJCQkgICAgICAgREJ1c01lc3NhZ2VJdGVyICppdGVyKQoreworICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKilpdGVyOworCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoaXRlciAhPSBOVUxMKTsKKworICBfZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9jb21tb24gKG1lc3NhZ2UsIHJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19NRVNTQUdFX0lURVJfVFlQRV9XUklURVIpOworCisgIC8qIFdlIGNyZWF0ZSB0aGUgc2lnbmF0dXJlIHN0cmluZyBhbmQgcG9pbnQgaXRlcmF0b3JzIGF0IGl0ICJvbiBkZW1hbmQiCisgICAqIHdoZW4gYSB2YWx1ZSBpcyBhY3R1YWxseSBhcHBlbmRlZC4gVGhhdCBtZWFucyB0aGF0IGluaXQoKSBuZXZlciBmYWlscworICAgKiBkdWUgdG8gT09NLgorICAgKi8KKyAgX2RidXNfdHlwZV93cml0ZXJfaW5pdF90eXBlc19kZWxheWVkICgmcmVhbC0+dS53cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfaGVhZGVyX2dldF9ieXRlX29yZGVyICgmbWVzc2FnZS0+aGVhZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZS0+Ym9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmJvZHkpKTsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgdGVtcG9yYXJ5IHNpZ25hdHVyZSBzdHJpbmcgY29udGFpbmluZyB0aGUgY3VycmVudAorICogc2lnbmF0dXJlLCBzdG9yZXMgaXQgaW4gdGhlIGl0ZXJhdG9yLCBhbmQgcG9pbnRzIHRoZSBpdGVyYXRvciB0bworICogdGhlIGVuZCBvZiBpdC4gVXNlZCBhbnkgdGltZSB3ZSB3cml0ZSB0byB0aGUgbWVzc2FnZS4KKyAqCisgKiBAcGFyYW0gcmVhbCBhbiBpdGVyYXRvciB3aXRob3V0IGEgdHlwZV9zdHIKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9zaWduYXR1cmUgKERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwpCit7CisgIERCdXNTdHJpbmcgKnN0cjsKKyAgY29uc3QgREJ1c1N0cmluZyAqY3VycmVudF9zaWc7CisgIGludCBjdXJyZW50X3NpZ19wb3M7CisKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT5pdGVyX3R5cGUgPT0gREJVU19NRVNTQUdFX0lURVJfVFlQRV9XUklURVIpOworCisgIGlmIChyZWFsLT51LndyaXRlci50eXBlX3N0ciAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAocmVhbC0+c2lnX3JlZmNvdW50ID4gMCk7CisgICAgICByZWFsLT5zaWdfcmVmY291bnQgKz0gMTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBzdHIgPSBkYnVzX25ldyAoREJ1c1N0cmluZywgMSk7CisgIGlmIChzdHIgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX3JhdyAoJnJlYWwtPm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VycmVudF9zaWcsICZjdXJyZW50X3NpZ19wb3MpKQorICAgIGN1cnJlbnRfc2lnID0gTlVMTDsKKworICBpZiAoY3VycmVudF9zaWcpCisgICAgeworICAgICAgaW50IGN1cnJlbnRfbGVuOworCisgICAgICBjdXJyZW50X2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoY3VycmVudF9zaWcsIGN1cnJlbnRfc2lnX3Bvcyk7CisgICAgICBjdXJyZW50X3NpZ19wb3MgKz0gMTsgLyogbW92ZSBvbiB0byBzaWcgZGF0YSAqLworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0X3ByZWFsbG9jYXRlZCAoc3RyLCBjdXJyZW50X2xlbiArIDQpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19mcmVlIChzdHIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoY3VycmVudF9zaWcsIGN1cnJlbnRfc2lnX3BvcywgY3VycmVudF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLCAwKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlIChzdHIpOworICAgICAgICAgIGRidXNfZnJlZSAoc3RyKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0X3ByZWFsbG9jYXRlZCAoc3RyLCA0KSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfZnJlZSAoc3RyKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmVhbC0+c2lnX3JlZmNvdW50ID0gMTsKKworICBfZGJ1c190eXBlX3dyaXRlcl9hZGRfdHlwZXMgKCZyZWFsLT51LndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogU2V0cyB0aGUgbmV3IHNpZ25hdHVyZSBhcyB0aGUgbWVzc2FnZSBzaWduYXR1cmUsIGZyZWVzIHRoZQorICogc2lnbmF0dXJlIHN0cmluZywgYW5kIG1hcmtzIHRoZSBpdGVyYXRvciBhcyBub3QgaGF2aW5nIGEgdHlwZV9zdHIKKyAqIGFueW1vcmUuIEZyZWVzIHRoZSBzaWduYXR1cmUgZXZlbiBpZiBpdCBmYWlscywgc28geW91IGNhbid0CisgKiByZWFsbHkgcmVjb3ZlciBmcm9tIGZhaWx1cmUuIEtpbmRhIGJ1c3RlZC4KKyAqCisgKiBAcGFyYW0gcmVhbCBhbiBpdGVyYXRvciB3aXRob3V0IGEgdHlwZV9zdHIKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2Vfc2lnbmF0dXJlIChEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsKQoreworICBEQnVzU3RyaW5nICpzdHI7CisgIGNvbnN0IGNoYXIgKnZfU1RSSU5HOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT5pdGVyX3R5cGUgPT0gREJVU19NRVNTQUdFX0lURVJfVFlQRV9XUklURVIpOworICBfZGJ1c19hc3NlcnQgKHJlYWwtPnUud3JpdGVyLnR5cGVfc3RyICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHJlYWwtPnNpZ19yZWZjb3VudCA+IDApOworCisgIHJlYWwtPnNpZ19yZWZjb3VudCAtPSAxOworCisgIGlmIChyZWFsLT5zaWdfcmVmY291bnQgPiAwKQorICAgIHJldHVybiBUUlVFOworICBfZGJ1c19hc3NlcnQgKHJlYWwtPnNpZ19yZWZjb3VudCA9PSAwKTsKKworICByZXR2YWwgPSBUUlVFOworCisgIHN0ciA9IHJlYWwtPnUud3JpdGVyLnR5cGVfc3RyOworCisgIHZfU1RSSU5HID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzdHIpOworICBpZiAoIV9kYnVzX2hlYWRlcl9zZXRfZmllbGRfYmFzaWMgKCZyZWFsLT5tZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TSUdOQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfU1RSSU5HKSkKKyAgICByZXR2YWwgPSBGQUxTRTsKKworICBfZGJ1c190eXBlX3dyaXRlcl9yZW1vdmVfdHlwZXMgKCZyZWFsLT51LndyaXRlcik7CisgIF9kYnVzX3N0cmluZ19mcmVlIChzdHIpOworICBkYnVzX2ZyZWUgKHN0cik7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBGcmVlcyB0aGUgc2lnbmF0dXJlIHN0cmluZyBhbmQgbWFya3MgdGhlIGl0ZXJhdG9yIGFzIG5vdCBoYXZpbmcgYQorICogdHlwZV9zdHIgYW55bW9yZS4gIFNpbmNlIHRoZSBuZXcgc2lnbmF0dXJlIGlzIG5vdCBzZXQsIHRoZSBtZXNzYWdlCisgKiB3aWxsIGdlbmVyYWxseSBiZSBob3NlZCBhZnRlciB0aGlzIGlzIGNhbGxlZC4KKyAqCisgKiBAcGFyYW0gcmVhbCBhbiBpdGVyYXRvciB3aXRob3V0IGEgdHlwZV9zdHIKKyAqLworc3RhdGljIHZvaWQKK19kYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX3NpZ25hdHVyZSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbCkKK3sKKyAgREJ1c1N0cmluZyAqc3RyOworCisgIF9kYnVzX2Fzc2VydCAocmVhbC0+aXRlcl90eXBlID09IERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfV1JJVEVSKTsKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT51LndyaXRlci50eXBlX3N0ciAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT5zaWdfcmVmY291bnQgPiAwKTsKKworICByZWFsLT5zaWdfcmVmY291bnQgLT0gMTsKKworICBpZiAocmVhbC0+c2lnX3JlZmNvdW50ID4gMCkKKyAgICByZXR1cm47CisgIF9kYnVzX2Fzc2VydCAocmVhbC0+c2lnX3JlZmNvdW50ID09IDApOworCisgIHN0ciA9IHJlYWwtPnUud3JpdGVyLnR5cGVfc3RyOworCisgIF9kYnVzX3R5cGVfd3JpdGVyX3JlbW92ZV90eXBlcyAoJnJlYWwtPnUud3JpdGVyKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKHN0cik7CisgIGRidXNfZnJlZSAoc3RyKTsKK30KKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfY2hlY2sgKERCdXNNZXNzYWdlUmVhbEl0ZXIgKml0ZXIpCit7CisgIGlmICghX2RidXNfbWVzc2FnZV9pdGVyX2NoZWNrIChpdGVyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGl0ZXItPm1lc3NhZ2UtPmxvY2tlZCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoImRidXMgYXBwZW5kIGl0ZXJhdG9yIGNhbid0IGJlIHVzZWQ6IG1lc3NhZ2UgaXMgbG9ja2VkIChoYXMgYWxyZWFkeSBiZWVuIHNlbnQpXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLyogREJVU19ESVNBQkxFX0NIRUNLUyAqLworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKK3N0YXRpYyBpbnQgKgorZXhwYW5kX2ZkX2FycmF5KERCdXNNZXNzYWdlICptLAorICAgICAgICAgICAgICAgIHVuc2lnbmVkICAgICBuKQoreworICBfZGJ1c19hc3NlcnQobSk7CisKKyAgLyogVGhpcyBtYWtlcyBzcGFjZSBmb3IgYWRkaW5nIG4gbmV3IGZkcyB0byB0aGUgYXJyYXkgYW5kIHJldHVybnMgYQorICAgICBwb2ludGVyIHRvIHRoZSBwbGFjZSB3ZXJlIHRoZSBmaXJzdCBmZCBzaG91bGQgYmUgcHV0LiAqLworCisgIGlmIChtLT5uX3VuaXhfZmRzICsgbiA+IG0tPm5fdW5peF9mZHNfYWxsb2NhdGVkKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGs7CisgICAgICBpbnQgKnA7CisKKyAgICAgIC8qIE1ha2UgdHdpY2UgYXMgbXVjaCBzcGFjZSBhcyBuZWNlc3NhcnkgKi8KKyAgICAgIGsgPSAobS0+bl91bml4X2ZkcyArIG4pICogMjsKKworICAgICAgLyogQWxsb2NhdGUgYXQgbGVhc3QgZm91ciAqLworICAgICAgaWYgKGsgPCA0KQorICAgICAgICBrID0gNDsKKworICAgICAgcCA9IGRidXNfcmVhbGxvYyhtLT51bml4X2ZkcywgayAqIHNpemVvZihpbnQpKTsKKyAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICBtLT51bml4X2ZkcyA9IHA7CisgICAgICBtLT5uX3VuaXhfZmRzX2FsbG9jYXRlZCA9IGs7CisgICAgfQorCisgIHJldHVybiBtLT51bml4X2ZkcyArIG0tPm5fdW5peF9mZHM7Cit9CisjZW5kaWYKKworLyoqCisgKiBBcHBlbmRzIGEgYmFzaWMtdHlwZWQgdmFsdWUgdG8gdGhlIG1lc3NhZ2UuIFRoZSBiYXNpYyB0eXBlcyBhcmUgdGhlCisgKiBub24tY29udGFpbmVyIHR5cGVzIHN1Y2ggYXMgaW50ZWdlciBhbmQgc3RyaW5nLgorICoKKyAqIFRoZSAidmFsdWUiIGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgYWRkcmVzcyBvZiBhIGJhc2ljLXR5cGVkIHZhbHVlLgorICogU28gZm9yIHN0cmluZywgY29uc3QgY2hhcioqLiBGb3IgaW50ZWdlciwgZGJ1c19pbnQzMl90Ki4KKyAqCisgKiBGb3IgVW5peCBmaWxlIGRlc2NyaXB0b3JzIHRoaXMgZnVuY3Rpb24gd2lsbCBpbnRlcm5hbGx5IGR1cGxpY2F0ZQorICogdGhlIGRlc2NyaXB0b3IgeW91IHBhc3NlZCBpbi4gSGVuY2UgeW91IG1heSBjbG9zZSB0aGUgZGVzY3JpcHRvcgorICogaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyBjYWxsLgorICoKKyAqIEB0b2RvIElmIHRoaXMgZmFpbHMgZHVlIHRvIGxhY2sgb2YgbWVtb3J5LCB0aGUgbWVzc2FnZSBpcyBob3NlZCBhbmQKKyAqIHlvdSBoYXZlIHRvIHN0YXJ0IG92ZXIgYnVpbGRpbmcgdGhlIHdob2xlIG1lc3NhZ2UuCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIGFwcGVuZCBpdGVyYXRvcgorICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIHZhbHVlCisgKiBAcGFyYW0gdmFsdWUgdGhlIGFkZHJlc3Mgb2YgdGhlIHZhbHVlCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICAqdmFsdWUpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisgIGRidXNfYm9vbF90IHJldDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfY2hlY2sgKHJlYWwpLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocmVhbC0+aXRlcl90eXBlID09IERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfV1JJVEVSLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoZGJ1c190eXBlX2lzX2Jhc2ljICh0eXBlKSwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHZhbHVlICE9IE5VTEwsIEZBTFNFKTsKKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICogY29uc3QgKnN0cmluZ19wOworICAgICAgY29uc3QgZGJ1c19ib29sX3QgKmJvb2xfcDsKKworICAgICAgY2FzZSBEQlVTX1RZUEVfU1RSSU5HOgorICAgICAgICBzdHJpbmdfcCA9IHZhbHVlOworICAgICAgICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX2NoZWNrX2lzX3ZhbGlkX3V0ZjggKCpzdHJpbmdfcCksIEZBTFNFKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgREJVU19UWVBFX09CSkVDVF9QQVRIOgorICAgICAgICBzdHJpbmdfcCA9IHZhbHVlOworICAgICAgICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX2NoZWNrX2lzX3ZhbGlkX3BhdGggKCpzdHJpbmdfcCksIEZBTFNFKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgREJVU19UWVBFX1NJR05BVFVSRToKKyAgICAgICAgc3RyaW5nX3AgPSB2YWx1ZTsKKyAgICAgICAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19jaGVja19pc192YWxpZF9zaWduYXR1cmUgKCpzdHJpbmdfcCksIEZBTFNFKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgREJVU19UWVBFX0JPT0xFQU46CisgICAgICAgIGJvb2xfcCA9IHZhbHVlOworICAgICAgICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKCpib29sX3AgPT0gMCB8fCAqYm9vbF9wID09IDEsIEZBTFNFKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgeworICAgICAgICAgICAgLyogbm90aGluZyB0byBjaGVjaywgYWxsIHBvc3NpYmxlIHZhbHVlcyBhcmUgYWxsb3dlZCAqLworICAgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICBpZiAoIV9kYnVzX21lc3NhZ2VfaXRlcl9vcGVuX3NpZ25hdHVyZSAocmVhbCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICh0eXBlID09IERCVVNfVFlQRV9VTklYX0ZEKQorICAgIHsKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICAgICAgaW50ICpmZHM7CisgICAgICBkYnVzX3VpbnQzMl90IHU7CisKKyAgICAgIC8qIEZpcnN0IHN0ZXAsIGluY2x1ZGUgdGhlIGZkIGluIHRoZSBmZCBsaXN0IG9mIHRoaXMgbWVzc2FnZSAqLworICAgICAgaWYgKCEoZmRzID0gZXhwYW5kX2ZkX2FycmF5KHJlYWwtPm1lc3NhZ2UsIDEpKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAqZmRzID0gX2RidXNfZHVwKCooaW50KikgdmFsdWUsIE5VTEwpOworICAgICAgaWYgKCpmZHMgPCAwKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIHUgPSByZWFsLT5tZXNzYWdlLT5uX3VuaXhfZmRzOworCisgICAgICAvKiBTZWNvbmQgc3RlcCwgd3JpdGUgdGhlIGluZGV4IHRvIHRoZSBmZCAqLworICAgICAgaWYgKCEocmV0ID0gX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKCZyZWFsLT51LndyaXRlciwgREJVU19UWVBFX1VOSVhfRkQsICZ1KSkpIHsKKyAgICAgICAgX2RidXNfY2xvc2UoKmZkcywgTlVMTCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKworICAgICAgcmVhbC0+bWVzc2FnZS0+bl91bml4X2ZkcyArPSAxOworICAgICAgdSArPSAxOworCisgICAgICAvKiBGaW5hbCBzdGVwLCB1cGRhdGUgdGhlIGhlYWRlciBhY2NvcmRpbmdseSAqLworICAgICAgcmV0ID0gX2RidXNfaGVhZGVyX3NldF9maWVsZF9iYXNpYyAoJnJlYWwtPm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1VOSVhfRkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1KTsKKworICAgICAgLyogSWYgYW55IG9mIHRoZXNlIG9wZXJhdGlvbnMgZmFpbCB0aGUgbWVzc2FnZSBpcworICAgICAgICAgaG9zZWQuIEhvd2V2ZXIsIG5vIG1lbW9yeSBvciBmZHMgc2hvdWxkIGJlIGxlYWtlZCBzaW5jZSB3aGF0CisgICAgICAgICBoYXMgYmVlbiBhZGRlZCB0byBtZXNzYWdlIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBtZXNzYWdlLCBhbmQKKyAgICAgICAgIGNhbiBoZW5jZSBiZSBhY2NvdW50ZWQgZm9yIHdoZW4gdGhlIG1lc3NhZ2UgaXMgYmVpbmcKKyAgICAgICAgIGZyZWVkLiAqLworI2Vsc2UKKyAgICAgIHJldCA9IEZBTFNFOworI2VuZGlmCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmV0ID0gX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKCZyZWFsLT51LndyaXRlciwgdHlwZSwgdmFsdWUpOworICAgIH0KKworICBpZiAoIV9kYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9zaWduYXR1cmUgKHJlYWwpKQorICAgIHJldCA9IEZBTFNFOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogQXBwZW5kcyBhIGJsb2NrIG9mIGZpeGVkLWxlbmd0aCB2YWx1ZXMgdG8gYW4gYXJyYXkuIFRoZQorICogZml4ZWQtbGVuZ3RoIHR5cGVzIGFyZSBhbGwgYmFzaWMgdHlwZXMgdGhhdCBhcmUgbm90IHN0cmluZy1saWtlLiBTbworICogaW50MzIsIGRvdWJsZSwgYm9vbCwgZXRjLiAoVW5peCBmaWxlIGRlc2NyaXB0b3JzIGhvd2V2ZXIgYXJlIG5vdAorICogc3VwcG9ydGVkLikgWW91IG11c3QgY2FsbCBkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lcigpIHRvCisgKiBvcGVuIGFuIGFycmF5IG9mIHZhbHVlcyBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiBZb3UgbWF5IGNhbGwKKyAqIHRoaXMgZnVuY3Rpb24gbXVsdGlwbGUgdGltZXMgKGFuZCBpbnRlcm1peGVkIHdpdGggY2FsbHMgdG8KKyAqIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYygpKSBmb3IgdGhlIHNhbWUgYXJyYXkuCisgKgorICogVGhlICJ2YWx1ZSIgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSBhZGRyZXNzIG9mIHRoZSBhcnJheS4gIFNvIGZvcgorICogaW50ZWdlciwgImRidXNfaW50MzJfdCoqIiBpcyBleHBlY3RlZCBmb3IgZXhhbXBsZS4KKyAqCisgKiBAd2FybmluZyBpbiBDLCBnaXZlbiAiaW50IGFycmF5W10iLCAiJmFycmF5ID09IGFycmF5IiAodGhlCisgKiBjb21wLmxhbmcuYyBGQVEgc2F5cyBvdGhlcndpc2UsIGJ1dCBnY2MgYW5kIHRoZSBGQVEgZG9uJ3QgYWdyZWUpLgorICogU28gaWYgeW91J3JlIHVzaW5nIGFuIGFycmF5IGluc3RlYWQgb2YgYSBwb2ludGVyIHlvdSBoYXZlIHRvIGNyZWF0ZQorICogYSBwb2ludGVyIHZhcmlhYmxlLCBhc3NpZ24gdGhlIGFycmF5IHRvIGl0LCB0aGVuIHRha2UgdGhlIGFkZHJlc3MKKyAqIG9mIHRoZSBwb2ludGVyIHZhcmlhYmxlLgorICogQGNvZGUKKyAqIGNvbnN0IGRidXNfaW50MzJfdCBhcnJheVtdID0geyAxLCAyLCAzIH07CisgKiBjb25zdCBkYnVzX2ludDMyX3QgKnZfQVJSQVkgPSBhcnJheTsKKyAqIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2ZpeGVkX2FycmF5ICgmaXRlciwgREJVU19UWVBFX0lOVDMyLCAmdl9BUlJBWSwgMykpCisgKiAgIGZwcmludGYgKHN0ZGVyciwgIk5vIG1lbW9yeSFcbiIpOworICogQGVuZGNvZGUKKyAqIEZvciBzdHJpbmdzIGl0IHdvcmtzIHRvIHdyaXRlIGNvbnN0IGNoYXIgKmFycmF5ID0gIkhlbGxvIiBhbmQgdGhlbgorICogdXNlICZhcnJheSB0aG91Z2guCisgKgorICogQHRvZG8gSWYgdGhpcyBmYWlscyBkdWUgdG8gbGFjayBvZiBtZW1vcnksIHRoZSBtZXNzYWdlIGlzIGhvc2VkIGFuZAorICogeW91IGhhdmUgdG8gc3RhcnQgb3ZlciBidWlsZGluZyB0aGUgd2hvbGUgbWVzc2FnZS4KKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgYXBwZW5kIGl0ZXJhdG9yCisgKiBAcGFyYW0gZWxlbWVudF90eXBlIHRoZSB0eXBlIG9mIHRoZSBhcnJheSBlbGVtZW50cworICogQHBhcmFtIHZhbHVlIHRoZSBhZGRyZXNzIG9mIHRoZSBhcnJheQorICogQHBhcmFtIG5fZWxlbWVudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBhcHBlbmQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2ZpeGVkX2FycmF5IChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIG5fZWxlbWVudHMpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisgIGRidXNfYm9vbF90IHJldDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfY2hlY2sgKHJlYWwpLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocmVhbC0+aXRlcl90eXBlID09IERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfV1JJVEVSLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoZGJ1c190eXBlX2lzX2ZpeGVkIChlbGVtZW50X3R5cGUpICYmIGVsZW1lbnRfdHlwZSAhPSBEQlVTX1RZUEVfVU5JWF9GRCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHJlYWwtPnUud3JpdGVyLmNvbnRhaW5lcl90eXBlID09IERCVVNfVFlQRV9BUlJBWSwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHZhbHVlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChuX2VsZW1lbnRzID49IDAsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChuX2VsZW1lbnRzIDw9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19NQVhJTVVNX0FSUkFZX0xFTkdUSCAvIF9kYnVzX3R5cGVfZ2V0X2FsaWdubWVudCAoZWxlbWVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICBpZiAoZWxlbWVudF90eXBlID09IERCVVNfVFlQRV9CT09MRUFOKQorICAgIHsKKyAgICAgIGNvbnN0IGRidXNfYm9vbF90ICogY29uc3QgKmJvb2xzID0gdmFsdWU7CisgICAgICBpbnQgaTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG5fZWxlbWVudHM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoKCpib29scylbaV0gPT0gMCB8fCAoKmJvb2xzKVtpXSA9PSAxLCBGQUxTRSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICByZXQgPSBfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9maXhlZF9tdWx0aSAoJnJlYWwtPnUud3JpdGVyLCBlbGVtZW50X3R5cGUsIHZhbHVlLCBuX2VsZW1lbnRzKTsKKworICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIEFwcGVuZHMgYSBjb250YWluZXItdHlwZWQgdmFsdWUgdG8gdGhlIG1lc3NhZ2U7IHlvdSBhcmUgcmVxdWlyZWQgdG8KKyAqIGFwcGVuZCB0aGUgY29udGVudHMgb2YgdGhlIGNvbnRhaW5lciB1c2luZyB0aGUgcmV0dXJuZWQKKyAqIHN1Yi1pdGVyYXRvciwgYW5kIHRoZW4gY2FsbAorICogZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyKCkuIENvbnRhaW5lciB0eXBlcyBhcmUgZm9yCisgKiBleGFtcGxlIHN0cnVjdCwgdmFyaWFudCwgYW5kIGFycmF5LiBGb3IgdmFyaWFudHMsIHRoZQorICogY29udGFpbmVkX3NpZ25hdHVyZSBzaG91bGQgYmUgdGhlIHR5cGUgb2YgdGhlIHNpbmdsZSB2YWx1ZSBpbnNpZGUKKyAqIHRoZSB2YXJpYW50LiBGb3Igc3RydWN0cyBhbmQgZGljdCBlbnRyaWVzLCBjb250YWluZWRfc2lnbmF0dXJlCisgKiBzaG91bGQgYmUgI05VTEw7IGl0IHdpbGwgYmUgc2V0IHRvIHdoYXRldmVyIHR5cGVzIHlvdSB3cml0ZSBpbnRvCisgKiB0aGUgc3RydWN0LiAgRm9yIGFycmF5cywgY29udGFpbmVkX3NpZ25hdHVyZSBzaG91bGQgYmUgdGhlIHR5cGUgb2YKKyAqIHRoZSBhcnJheSBlbGVtZW50cy4KKyAqCisgKiBAdG9kbyBJZiB0aGlzIGZhaWxzIGR1ZSB0byBsYWNrIG9mIG1lbW9yeSwgdGhlIG1lc3NhZ2UgaXMgaG9zZWQgYW5kCisgKiB5b3UgaGF2ZSB0byBzdGFydCBvdmVyIGJ1aWxkaW5nIHRoZSB3aG9sZSBtZXNzYWdlLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBhcHBlbmQgaXRlcmF0b3IKKyAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZQorICogQHBhcmFtIGNvbnRhaW5lZF9zaWduYXR1cmUgdGhlIHR5cGUgb2YgY29udGFpbmVyIGNvbnRlbnRzCisgKiBAcGFyYW0gc3ViIHN1Yi1pdGVyYXRvciB0byBpbml0aWFsaXplCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqY29udGFpbmVkX3NpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKnN1YikKK3sKKyAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbCA9IChEQnVzTWVzc2FnZVJlYWxJdGVyICopaXRlcjsKKyAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbF9zdWIgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKXN1YjsKKyAgREJ1c1N0cmluZyBjb250YWluZWRfc3RyOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9jaGVjayAocmVhbCksIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChyZWFsLT5pdGVyX3R5cGUgPT0gREJVU19NRVNTQUdFX0lURVJfVFlQRV9XUklURVIsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChkYnVzX3R5cGVfaXNfY29udGFpbmVyICh0eXBlKSwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHN1YiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoKHR5cGUgPT0gREJVU19UWVBFX1NUUlVDVCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfc2lnbmF0dXJlID09IE5VTEwpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gREJVU19UWVBFX0RJQ1RfRU5UUlkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3NpZ25hdHVyZSA9PSBOVUxMKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlID09IERCVVNfVFlQRV9WQVJJQU5UICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZF9zaWduYXR1cmUgIT0gTlVMTCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBEQlVTX1RZUEVfQVJSQVkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3NpZ25hdHVyZSAhPSBOVUxMKSwgRkFMU0UpOworICAKKyAgLyogdGhpcyB3b3VsZCBmYWlsIGlmIHRoZSBjb250YWluZWRfc2lnbmF0dXJlIGlzIGEgZGljdCBlbnRyeSwgc2luY2UKKyAgICogZGljdCBlbnRyaWVzIGFyZSBpbnZhbGlkIHNpZ25hdHVyZXMgc3RhbmRhbG9uZSAodGhleSBtdXN0IGJlIGluCisgICAqIGFuIGFycmF5KQorICAgKi8KKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICgodHlwZSA9PSBEQlVTX1RZUEVfQVJSQVkgJiYgY29udGFpbmVkX3NpZ25hdHVyZSAmJiAqY29udGFpbmVkX3NpZ25hdHVyZSA9PSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udGFpbmVkX3NpZ25hdHVyZSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX3NpZ25hdHVyZSAoY29udGFpbmVkX3NpZ25hdHVyZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsKKworICBpZiAoIV9kYnVzX21lc3NhZ2VfaXRlcl9vcGVuX3NpZ25hdHVyZSAocmVhbCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgICpyZWFsX3N1YiA9ICpyZWFsOworCisgIGlmIChjb250YWluZWRfc2lnbmF0dXJlICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZjb250YWluZWRfc3RyLCBjb250YWluZWRfc2lnbmF0dXJlKTsKKworICAgICAgcmV0dXJuIF9kYnVzX3R5cGVfd3JpdGVyX3JlY3Vyc2UgKCZyZWFsLT51LndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250YWluZWRfc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFsX3N1Yi0+dS53cml0ZXIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiBfZGJ1c190eXBlX3dyaXRlcl9yZWN1cnNlICgmcmVhbC0+dS53cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFsX3N1Yi0+dS53cml0ZXIpOworICAgIH0gCit9CisKKworLyoqCisgKiBDbG9zZXMgYSBjb250YWluZXItdHlwZWQgdmFsdWUgYXBwZW5kZWQgdG8gdGhlIG1lc3NhZ2U7IG1heSB3cml0ZQorICogb3V0IG1vcmUgaW5mb3JtYXRpb24gdG8gdGhlIG1lc3NhZ2Uga25vd24gb25seSBhZnRlciB0aGUgZW50aXJlCisgKiBjb250YWluZXIgaXMgd3JpdHRlbiwgYW5kIG1heSBmcmVlIHJlc291cmNlcyBjcmVhdGVkIGJ5CisgKiBkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lcigpLgorICoKKyAqIEB0b2RvIElmIHRoaXMgZmFpbHMgZHVlIHRvIGxhY2sgb2YgbWVtb3J5LCB0aGUgbWVzc2FnZSBpcyBob3NlZCBhbmQKKyAqIHlvdSBoYXZlIHRvIHN0YXJ0IG92ZXIgYnVpbGRpbmcgdGhlIHdob2xlIG1lc3NhZ2UuCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIGFwcGVuZCBpdGVyYXRvcgorICogQHBhcmFtIHN1YiBzdWItaXRlcmF0b3IgdG8gY2xvc2UKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAqc3ViKQoreworICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKilpdGVyOworICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsX3N1YiA9IChEQnVzTWVzc2FnZVJlYWxJdGVyICopc3ViOworICBkYnVzX2Jvb2xfdCByZXQ7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2NoZWNrIChyZWFsKSwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHJlYWwtPml0ZXJfdHlwZSA9PSBEQlVTX01FU1NBR0VfSVRFUl9UWVBFX1dSSVRFUiwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfY2hlY2sgKHJlYWxfc3ViKSwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHJlYWxfc3ViLT5pdGVyX3R5cGUgPT0gREJVU19NRVNTQUdFX0lURVJfVFlQRV9XUklURVIsIEZBTFNFKTsKKworICByZXQgPSBfZGJ1c190eXBlX3dyaXRlcl91bnJlY3Vyc2UgKCZyZWFsLT51LndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhbF9zdWItPnUud3JpdGVyKTsKKworICBpZiAoIV9kYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9zaWduYXR1cmUgKHJlYWwpKQorICAgIHJldCA9IEZBTFNFOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogQWJhbmRvbnMgY3JlYXRpb24gb2YgYSBjb250YWluZWQtdHlwZWQgdmFsdWUgYW5kIGZyZWVzIHJlc291cmNlcyBjcmVhdGVkCisgKiBieSBkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lcigpLiAgT25jZSB0aGlzIHJldHVybnMsIHRoZSBtZXNzYWdlCisgKiBpcyBob3NlZCBhbmQgeW91IGhhdmUgdG8gc3RhcnQgb3ZlciBidWlsZGluZyB0aGUgd2hvbGUgbWVzc2FnZS4KKyAqCisgKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgdG8gYWJhbmRvbiBjcmVhdGlvbiBvZiBhIG1lc3NhZ2Ugd2hlbiB5b3UgaGF2ZQorICogb3BlbiBjb250YWluZXJzLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBhcHBlbmQgaXRlcmF0b3IKKyAqIEBwYXJhbSBzdWIgc3ViLWl0ZXJhdG9yIHRvIGNsb3NlCisgKi8KK3ZvaWQKK2RidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICpzdWIpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbF9zdWIgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKXN1YjsKKworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoX2RidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9jaGVjayAocmVhbCkpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAocmVhbC0+aXRlcl90eXBlID09IERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfV1JJVEVSKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfY2hlY2sgKHJlYWxfc3ViKSk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChyZWFsX3N1Yi0+aXRlcl90eXBlID09IERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfV1JJVEVSKTsKKyNlbmRpZgorCisgIF9kYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX3NpZ25hdHVyZSAocmVhbCk7Cit9CisKKy8qKgorICogU2V0cyBhIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBtZXNzYWdlIGRvZXMgbm90IHdhbnQgYSByZXBseTsgaWYKKyAqIHRoaXMgZmxhZyBpcyBzZXQsIHRoZSBvdGhlciBlbmQgb2YgdGhlIGNvbm5lY3Rpb24gbWF5IChidXQgaXMgbm90CisgKiByZXF1aXJlZCB0bykgb3B0aW1pemUgYnkgbm90IHNlbmRpbmcgbWV0aG9kIHJldHVybiBvciBlcnJvcgorICogcmVwbGllcy4gSWYgdGhpcyBmbGFnIGlzIHNldCwgdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgd2hldGhlciB0aGUKKyAqIG1lc3NhZ2Ugc3VjY2Vzc2Z1bGx5IGFycml2ZWQgYXQgdGhlIHJlbW90ZSBlbmQuIE5vcm1hbGx5IHlvdSBrbm93IGEKKyAqIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkIHdoZW4geW91IHJlY2VpdmUgdGhlIHJlcGx5IHRvIGl0LgorICoKKyAqIFRoZSBmbGFnIGlzICNGQUxTRSBieSBkZWZhdWx0LCB0aGF0IGlzIGJ5IGRlZmF1bHQgdGhlIG90aGVyIGVuZCBpcworICogcmVxdWlyZWQgdG8gcmVwbHkuCisgKgorICogT24gdGhlIHByb3RvY29sIGxldmVsIHRoaXMgdG9nZ2xlcyAjREJVU19IRUFERVJfRkxBR19OT19SRVBMWV9FWFBFQ1RFRAorICogCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIG5vX3JlcGx5ICNUUlVFIGlmIG5vIHJlcGx5IGlzIGRlc2lyZWQKKyAqLwordm9pZAorZGJ1c19tZXNzYWdlX3NldF9ub19yZXBseSAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgbm9fcmVwbHkpCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoIW1lc3NhZ2UtPmxvY2tlZCk7CisKKyAgX2RidXNfaGVhZGVyX3RvZ2dsZV9mbGFnICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZMQUdfTk9fUkVQTFlfRVhQRUNURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9fcmVwbHkpOworfQorCisvKioKKyAqIFJldHVybnMgI1RSVUUgaWYgdGhlIG1lc3NhZ2UgZG9lcyBub3QgZXhwZWN0CisgKiBhIHJlcGx5LgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgbWVzc2FnZSBzZW5kZXIgaXNuJ3Qgd2FpdGluZyBmb3IgYSByZXBseQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2dldF9ub19yZXBseSAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisKKyAgcmV0dXJuIF9kYnVzX2hlYWRlcl9nZXRfZmxhZyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRkxBR19OT19SRVBMWV9FWFBFQ1RFRCk7Cit9CisKKy8qKgorICogU2V0cyBhIGZsYWcgaW5kaWNhdGluZyB0aGF0IGFuIG93bmVyIGZvciB0aGUgZGVzdGluYXRpb24gbmFtZSB3aWxsCisgKiBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgYmVmb3JlIHRoZSBtZXNzYWdlIGlzIGRlbGl2ZXJlZC4gV2hlbiB0aGlzCisgKiBmbGFnIGlzIHNldCwgdGhlIG1lc3NhZ2UgaXMgaGVsZCB1bnRpbCBhIG5hbWUgb3duZXIgZmluaXNoZXMKKyAqIHN0YXJ0aW5nIHVwLCBvciBmYWlscyB0byBzdGFydCB1cC4gSW4gY2FzZSBvZiBmYWlsdXJlLCB0aGUgcmVwbHkKKyAqIHdpbGwgYmUgYW4gZXJyb3IuCisgKgorICogVGhlIGZsYWcgaXMgc2V0IHRvICNUUlVFIGJ5IGRlZmF1bHQsIGkuZS4gYXV0byBzdGFydGluZyBpcyB0aGUgZGVmYXVsdC4KKyAqCisgKiBPbiB0aGUgcHJvdG9jb2wgbGV2ZWwgdGhpcyB0b2dnbGVzICNEQlVTX0hFQURFUl9GTEFHX05PX0FVVE9fU1RBUlQKKyAqIAorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBhdXRvX3N0YXJ0ICNUUlVFIGlmIGF1dG8tc3RhcnRpbmcgaXMgZGVzaXJlZAorICovCit2b2lkCitkYnVzX21lc3NhZ2Vfc2V0X2F1dG9fc3RhcnQgKERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgYXV0b19zdGFydCkKK3sKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsICghbWVzc2FnZS0+bG9ja2VkKTsKKworICBfZGJ1c19oZWFkZXJfdG9nZ2xlX2ZsYWcgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRkxBR19OT19BVVRPX1NUQVJULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICFhdXRvX3N0YXJ0KTsKK30KKworLyoqCisgKiBSZXR1cm5zICNUUlVFIGlmIHRoZSBtZXNzYWdlIHdpbGwgY2F1c2UgYW4gb3duZXIgZm9yCisgKiBkZXN0aW5hdGlvbiBuYW1lIHRvIGJlIGF1dG8tc3RhcnRlZC4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIG1lc3NhZ2Ugd2lsbCB1c2UgYXV0by1zdGFydAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2dldF9hdXRvX3N0YXJ0IChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKworICByZXR1cm4gIV9kYnVzX2hlYWRlcl9nZXRfZmxhZyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZMQUdfTk9fQVVUT19TVEFSVCk7Cit9CisKKworLyoqCisgKiBTZXRzIHRoZSBvYmplY3QgcGF0aCB0aGlzIG1lc3NhZ2UgaXMgYmVpbmcgc2VudCB0byAoZm9yCisgKiBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCkgb3IgdGhlIG9uZSBhIHNpZ25hbCBpcyBiZWluZworICogZW1pdHRlZCBmcm9tIChmb3IgREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKS4KKyAqCisgKiBUaGUgcGF0aCBtdXN0IGNvbnRhaW4gb25seSB2YWxpZCBjaGFyYWN0ZXJzIGFzIGRlZmluZWQKKyAqIGluIHRoZSBELUJ1cyBzcGVjaWZpY2F0aW9uLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gb2JqZWN0X3BhdGggdGhlIHBhdGggb3IgI05VTEwgdG8gdW5zZXQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX3NldF9wYXRoIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpvYmplY3RfcGF0aCkKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICghbWVzc2FnZS0+bG9ja2VkLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAob2JqZWN0X3BhdGggPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX3BhdGggKG9iamVjdF9wYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisKKyAgcmV0dXJuIHNldF9vcl9kZWxldGVfc3RyaW5nX2ZpZWxkIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1BBVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX09CSkVDVF9QQVRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9wYXRoKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBvYmplY3QgcGF0aCB0aGlzIG1lc3NhZ2UgaXMgYmVpbmcgc2VudCB0byAoZm9yCisgKiBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCkgb3IgYmVpbmcgZW1pdHRlZCBmcm9tIChmb3IKKyAqIERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCkuIFJldHVybnMgI05VTEwgaWYgbm9uZS4KKyAqCisgKiBTZWUgYWxzbyBkYnVzX21lc3NhZ2VfZ2V0X3BhdGhfZGVjb21wb3NlZCgpLgorICoKKyAqIFRoZSByZXR1cm5lZCBzdHJpbmcgYmVjb21lcyBpbnZhbGlkIGlmIHRoZSBtZXNzYWdlIGlzCisgKiBtb2RpZmllZCwgc2luY2UgaXQgcG9pbnRzIGludG8gdGhlIHdpcmUtbWFyc2hhbGVkIG1lc3NhZ2UgZGF0YS4KKyAqIAorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEByZXR1cm5zIHRoZSBwYXRoIChzaG91bGQgbm90IGJlIGZyZWVkKSBvciAjTlVMTAorICovCitjb25zdCBjaGFyKgorZGJ1c19tZXNzYWdlX2dldF9wYXRoIChEQnVzTWVzc2FnZSAgICptZXNzYWdlKQoreworICBjb25zdCBjaGFyICp2OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBOVUxMKTsKKworICB2ID0gTlVMTDsgLyogaW4gY2FzZSBmaWVsZCBkb2Vzbid0IGV4aXN0ICovCisgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfYmFzaWMgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1BBVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9PQkpFQ1RfUEFUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgJnYpOworICByZXR1cm4gdjsKK30KKworLyoqCisgKiBDaGVja3MgaWYgdGhlIG1lc3NhZ2UgaGFzIGEgcGFydGljdWxhciBvYmplY3QgcGF0aC4gIFRoZSBvYmplY3QKKyAqIHBhdGggaXMgdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBmb3IgYSBtZXRob2QgY2FsbCBvciB0aGUgZW1pdHRpbmcKKyAqIG9iamVjdCBmb3IgYSBzaWduYWwuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIG5hbWUKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZXJlIGlzIGEgcGF0aCBmaWVsZCBpbiB0aGUgaGVhZGVyCisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfaGFzX3BhdGggKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKnBhdGgpCit7CisgIGNvbnN0IGNoYXIgKm1zZ19wYXRoOworICBtc2dfcGF0aCA9IGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobWVzc2FnZSk7CisgIAorICBpZiAobXNnX3BhdGggPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAocGF0aCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAocGF0aCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKyAgIAorICBpZiAoc3RyY21wIChtc2dfcGF0aCwgcGF0aCkgPT0gMCkKKyAgICByZXR1cm4gVFJVRTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogR2V0cyB0aGUgb2JqZWN0IHBhdGggdGhpcyBtZXNzYWdlIGlzIGJlaW5nIHNlbnQgdG8KKyAqIChmb3IgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwpIG9yIGJlaW5nIGVtaXR0ZWQKKyAqIGZyb20gKGZvciBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpIGluIGEgZGVjb21wb3NlZAorICogZm9ybWF0IChvbmUgYXJyYXkgZWxlbWVudCBwZXIgcGF0aCBjb21wb25lbnQpLgorICogRnJlZSB0aGUgcmV0dXJuZWQgYXJyYXkgd2l0aCBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5KCkuCisgKgorICogQW4gZW1wdHkgYnV0IG5vbi1OVUxMIHBhdGggYXJyYXkgbWVhbnMgdGhlIHBhdGggIi8iLgorICogU28gdGhlIHBhdGggIi9mb28vYmFyIiBiZWNvbWVzIHsgImZvbyIsICJiYXIiLCBOVUxMIH0KKyAqIGFuZCB0aGUgcGF0aCAiLyIgYmVjb21lcyB7IE5VTEwgfS4KKyAqCisgKiBTZWUgYWxzbyBkYnVzX21lc3NhZ2VfZ2V0X3BhdGgoKS4KKyAqIAorICogQHRvZG8gdGhpcyBjb3VsZCBiZSBvcHRpbWl6ZWQgYnkgdXNpbmcgdGhlIGxlbiBmcm9tIHRoZSBtZXNzYWdlCisgKiBpbnN0ZWFkIG9mIGNhbGxpbmcgc3RybGVuKCkgYWdhaW4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIHBhdGggcGxhY2UgdG8gc3RvcmUgYWxsb2NhdGVkIGFycmF5IG9mIHBhdGggY29tcG9uZW50czsgI05VTEwgc2V0IGhlcmUgaWYgbm8gcGF0aCBmaWVsZCBleGlzdHMKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIGFycmF5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfZ2V0X3BhdGhfZGVjb21wb3NlZCAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAqKipwYXRoKQoreworICBjb25zdCBjaGFyICp2OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGF0aCAhPSBOVUxMLCBGQUxTRSk7CisKKyAgKnBhdGggPSBOVUxMOworCisgIHYgPSBkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpOworICBpZiAodiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfZGVjb21wb3NlX3BhdGggKHYsIHN0cmxlbiAodiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBOVUxMKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogU2V0cyB0aGUgaW50ZXJmYWNlIHRoaXMgbWVzc2FnZSBpcyBiZWluZyBzZW50IHRvCisgKiAoZm9yIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMKSBvcgorICogdGhlIGludGVyZmFjZSBhIHNpZ25hbCBpcyBiZWluZyBlbWl0dGVkIGZyb20KKyAqIChmb3IgREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKS4KKyAqCisgKiBUaGUgaW50ZXJmYWNlIG5hbWUgbXVzdCBjb250YWluIG9ubHkgdmFsaWQgY2hhcmFjdGVycyBhcyBkZWZpbmVkCisgKiBpbiB0aGUgRC1CdXMgc3BlY2lmaWNhdGlvbi4KKyAqIAorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBpbnRlcmZhY2UgdGhlIGludGVyZmFjZSBvciAjTlVMTCB0byB1bnNldAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2Vfc2V0X2ludGVyZmFjZSAoREJ1c01lc3NhZ2UgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqaW50ZXJmYWNlKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKCFtZXNzYWdlLT5sb2NrZWQsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChpbnRlcmZhY2UgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2ludGVyZmFjZSAoaW50ZXJmYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisKKyAgcmV0dXJuIHNldF9vcl9kZWxldGVfc3RyaW5nX2ZpZWxkIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX0lOVEVSRkFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSk7Cit9CisKKy8qKgorICogR2V0cyB0aGUgaW50ZXJmYWNlIHRoaXMgbWVzc2FnZSBpcyBiZWluZyBzZW50IHRvCisgKiAoZm9yIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMKSBvciBiZWluZyBlbWl0dGVkCisgKiBmcm9tIChmb3IgREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKS4KKyAqIFRoZSBpbnRlcmZhY2UgbmFtZSBpcyBmdWxseS1xdWFsaWZpZWQgKG5hbWVzcGFjZWQpLgorICogUmV0dXJucyAjTlVMTCBpZiBub25lLgorICoKKyAqIFRoZSByZXR1cm5lZCBzdHJpbmcgYmVjb21lcyBpbnZhbGlkIGlmIHRoZSBtZXNzYWdlIGlzCisgKiBtb2RpZmllZCwgc2luY2UgaXQgcG9pbnRzIGludG8gdGhlIHdpcmUtbWFyc2hhbGVkIG1lc3NhZ2UgZGF0YS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHJldHVybnMgdGhlIG1lc3NhZ2UgaW50ZXJmYWNlIChzaG91bGQgbm90IGJlIGZyZWVkKSBvciAjTlVMTAorICovCitjb25zdCBjaGFyKgorZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBjb25zdCBjaGFyICp2OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBOVUxMKTsKKworICB2ID0gTlVMTDsgLyogaW4gY2FzZSBmaWVsZCBkb2Vzbid0IGV4aXN0ICovCisgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfYmFzaWMgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX0lOVEVSRkFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgJnYpOworICByZXR1cm4gdjsKK30KKworLyoqCisgKiBDaGVja3MgaWYgdGhlIG1lc3NhZ2UgaGFzIGFuIGludGVyZmFjZQorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gaW50ZXJmYWNlIHRoZSBpbnRlcmZhY2UgbmFtZQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGludGVyZmFjZSBmaWVsZCBpbiB0aGUgaGVhZGVyIG1hdGNoZXMKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9oYXNfaW50ZXJmYWNlIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKmludGVyZmFjZSkKK3sKKyAgY29uc3QgY2hhciAqbXNnX2ludGVyZmFjZTsKKyAgbXNnX2ludGVyZmFjZSA9IGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKTsKKyAgIAorICBpZiAobXNnX2ludGVyZmFjZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChpbnRlcmZhY2UgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKGludGVyZmFjZSA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKyAgICAgCisgIGlmIChzdHJjbXAgKG1zZ19pbnRlcmZhY2UsIGludGVyZmFjZSkgPT0gMCkKKyAgICByZXR1cm4gVFJVRTsKKworICByZXR1cm4gRkFMU0U7CisKK30KKworLyoqCisgKiBTZXRzIHRoZSBpbnRlcmZhY2UgbWVtYmVyIGJlaW5nIGludm9rZWQKKyAqIChEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCkgb3IgZW1pdHRlZAorICogKERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCkuCisgKgorICogVGhlIG1lbWJlciBuYW1lIG11c3QgY29udGFpbiBvbmx5IHZhbGlkIGNoYXJhY3RlcnMgYXMgZGVmaW5lZAorICogaW4gdGhlIEQtQnVzIHNwZWNpZmljYXRpb24uCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBtZW1iZXIgdGhlIG1lbWJlciBvciAjTlVMTCB0byB1bnNldAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2Vfc2V0X21lbWJlciAoREJ1c01lc3NhZ2UgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqbWVtYmVyKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKCFtZXNzYWdlLT5sb2NrZWQsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZW1iZXIgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX21lbWJlciAobWVtYmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisKKyAgcmV0dXJuIHNldF9vcl9kZWxldGVfc3RyaW5nX2ZpZWxkIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX01FTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcik7Cit9CisKKy8qKgorICogR2V0cyB0aGUgaW50ZXJmYWNlIG1lbWJlciBiZWluZyBpbnZva2VkCisgKiAoREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwpIG9yIGVtaXR0ZWQKKyAqIChEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpLiBSZXR1cm5zICNOVUxMIGlmIG5vbmUuCisgKgorICogVGhlIHJldHVybmVkIHN0cmluZyBiZWNvbWVzIGludmFsaWQgaWYgdGhlIG1lc3NhZ2UgaXMKKyAqIG1vZGlmaWVkLCBzaW5jZSBpdCBwb2ludHMgaW50byB0aGUgd2lyZS1tYXJzaGFsZWQgbWVzc2FnZSBkYXRhLgorICogCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHJldHVybnMgdGhlIG1lbWJlciBuYW1lIChzaG91bGQgbm90IGJlIGZyZWVkKSBvciAjTlVMTAorICovCitjb25zdCBjaGFyKgorZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBjb25zdCBjaGFyICp2OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBOVUxMKTsKKworICB2ID0gTlVMTDsgLyogaW4gY2FzZSBmaWVsZCBkb2Vzbid0IGV4aXN0ICovCisgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfYmFzaWMgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX01FTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgJnYpOworICByZXR1cm4gdjsKK30KKworLyoqCisgKiBDaGVja3MgaWYgdGhlIG1lc3NhZ2UgaGFzIGFuIGludGVyZmFjZSBtZW1iZXIKKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIG1lbWJlciB0aGUgbWVtYmVyIG5hbWUKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZXJlIGlzIGEgbWVtYmVyIGZpZWxkIGluIHRoZSBoZWFkZXIKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9oYXNfbWVtYmVyIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKm1lbWJlcikKK3sKKyAgY29uc3QgY2hhciAqbXNnX21lbWJlcjsKKyAgbXNnX21lbWJlciA9IGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKTsKKyAKKyAgaWYgKG1zZ19tZW1iZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAobWVtYmVyID09IE5VTEwpCisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChtZW1iZXIgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisgICAgCisgIGlmIChzdHJjbXAgKG1zZ19tZW1iZXIsIG1lbWJlcikgPT0gMCkKKyAgICByZXR1cm4gVFJVRTsKKworICByZXR1cm4gRkFMU0U7CisKK30KKworLyoqCisgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBlcnJvciAoREJVU19NRVNTQUdFX1RZUEVfRVJST1IpLgorICogVGhlIG5hbWUgaXMgZnVsbHktcXVhbGlmaWVkIChuYW1lc3BhY2VkKS4KKyAqCisgKiBUaGUgZXJyb3IgbmFtZSBtdXN0IGNvbnRhaW4gb25seSB2YWxpZCBjaGFyYWN0ZXJzIGFzIGRlZmluZWQKKyAqIGluIHRoZSBELUJ1cyBzcGVjaWZpY2F0aW9uLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gZXJyb3JfbmFtZSB0aGUgbmFtZSBvciAjTlVMTCB0byB1bnNldAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2Vfc2V0X2Vycm9yX25hbWUgKERCdXNNZXNzYWdlICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICplcnJvcl9uYW1lKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKCFtZXNzYWdlLT5sb2NrZWQsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChlcnJvcl9uYW1lID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19jaGVja19pc192YWxpZF9lcnJvcl9uYW1lIChlcnJvcl9uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisKKyAgcmV0dXJuIHNldF9vcl9kZWxldGVfc3RyaW5nX2ZpZWxkIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX0VSUk9SX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9uYW1lKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBlcnJvciBuYW1lIChEQlVTX01FU1NBR0VfVFlQRV9FUlJPUiBvbmx5KQorICogb3IgI05VTEwgaWYgbm9uZS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgc3RyaW5nIGJlY29tZXMgaW52YWxpZCBpZiB0aGUgbWVzc2FnZSBpcworICogbW9kaWZpZWQsIHNpbmNlIGl0IHBvaW50cyBpbnRvIHRoZSB3aXJlLW1hcnNoYWxlZCBtZXNzYWdlIGRhdGEuCisgKiAKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcmV0dXJucyB0aGUgZXJyb3IgbmFtZSAoc2hvdWxkIG5vdCBiZSBmcmVlZCkgb3IgI05VTEwKKyAqLworY29uc3QgY2hhcioKK2RidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIGNvbnN0IGNoYXIgKnY7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIE5VTEwpOworCisgIHYgPSBOVUxMOyAvKiBpbiBjYXNlIGZpZWxkIGRvZXNuJ3QgZXhpc3QgKi8KKyAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9iYXNpYyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfRVJST1JfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgJnYpOworICByZXR1cm4gdjsKK30KKworLyoqCisgKiBTZXRzIHRoZSBtZXNzYWdlJ3MgZGVzdGluYXRpb24uIFRoZSBkZXN0aW5hdGlvbiBpcyB0aGUgbmFtZSBvZgorICogYW5vdGhlciBjb25uZWN0aW9uIG9uIHRoZSBidXMgYW5kIG1heSBiZSBlaXRoZXIgdGhlIHVuaXF1ZSBuYW1lCisgKiBhc3NpZ25lZCBieSB0aGUgYnVzIHRvIGVhY2ggY29ubmVjdGlvbiwgb3IgYSB3ZWxsLWtub3duIG5hbWUKKyAqIHNwZWNpZmllZCBpbiBhZHZhbmNlLgorICoKKyAqIFRoZSBkZXN0aW5hdGlvbiBuYW1lIG11c3QgY29udGFpbiBvbmx5IHZhbGlkIGNoYXJhY3RlcnMgYXMgZGVmaW5lZAorICogaW4gdGhlIEQtQnVzIHNwZWNpZmljYXRpb24uCisgKiAKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gZGVzdGluYXRpb24gdGhlIGRlc3RpbmF0aW9uIG5hbWUgb3IgI05VTEwgdG8gdW5zZXQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAoREJ1c01lc3NhZ2UgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICpkZXN0aW5hdGlvbikKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICghbWVzc2FnZS0+bG9ja2VkLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoZGVzdGluYXRpb24gPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2J1c19uYW1lIChkZXN0aW5hdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpOworCisgIHJldHVybiBzZXRfb3JfZGVsZXRlX3N0cmluZ19maWVsZCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9ERVNUSU5BVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBkZXN0aW5hdGlvbiBvZiBhIG1lc3NhZ2Ugb3IgI05VTEwgaWYgdGhlcmUgaXMgbm9uZSBzZXQuCisgKgorICogVGhlIHJldHVybmVkIHN0cmluZyBiZWNvbWVzIGludmFsaWQgaWYgdGhlIG1lc3NhZ2UgaXMKKyAqIG1vZGlmaWVkLCBzaW5jZSBpdCBwb2ludHMgaW50byB0aGUgd2lyZS1tYXJzaGFsZWQgbWVzc2FnZSBkYXRhLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcmV0dXJucyB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiAoc2hvdWxkIG5vdCBiZSBmcmVlZCkgb3IgI05VTEwKKyAqLworY29uc3QgY2hhcioKK2RidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBjb25zdCBjaGFyICp2OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBOVUxMKTsKKworICB2ID0gTlVMTDsgLyogaW4gY2FzZSBmaWVsZCBkb2Vzbid0IGV4aXN0ICovCisgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfYmFzaWMgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX0RFU1RJTkFUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSAmdik7CisgIHJldHVybiB2OworfQorCisvKioKKyAqIFNldHMgdGhlIG1lc3NhZ2Ugc2VuZGVyLgorICoKKyAqIFRoZSBzZW5kZXIgbXVzdCBiZSBhIHZhbGlkIGJ1cyBuYW1lIGFzIGRlZmluZWQgaW4gdGhlIEQtQnVzCisgKiBzcGVjaWZpY2F0aW9uLgorICoKKyAqIFVzdWFsbHkgeW91IGRvbid0IHdhbnQgdG8gY2FsbCB0aGlzLiBUaGUgbWVzc2FnZSBidXMgZGFlbW9uIHdpbGwKKyAqIGNhbGwgaXQgdG8gc2V0IHRoZSBvcmlnaW4gb2YgZWFjaCBtZXNzYWdlLiBJZiB5b3UgYXJlbid0IGltcGxlbWVudGluZworICogYSBtZXNzYWdlIGJ1cyBkYWVtb24geW91IHNob3VsZG4ndCBuZWVkIHRvIHNldCB0aGUgc2VuZGVyLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gc2VuZGVyIHRoZSBzZW5kZXIgb3IgI05VTEwgdG8gdW5zZXQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX3NldF9zZW5kZXIgKERCdXNNZXNzYWdlICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKnNlbmRlcikKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICghbWVzc2FnZS0+bG9ja2VkLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoc2VuZGVyID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19jaGVja19pc192YWxpZF9idXNfbmFtZSAoc2VuZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisKKyAgcmV0dXJuIHNldF9vcl9kZWxldGVfc3RyaW5nX2ZpZWxkIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NFTkRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlcik7Cit9CisKKy8qKgorICogR2V0cyB0aGUgdW5pcXVlIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24gd2hpY2ggb3JpZ2luYXRlZCB0aGlzCisgKiBtZXNzYWdlLCBvciAjTlVMTCBpZiB1bmtub3duIG9yIGluYXBwbGljYWJsZS4gVGhlIHNlbmRlciBpcyBmaWxsZWQKKyAqIGluIGJ5IHRoZSBtZXNzYWdlIGJ1cy4KKyAqCisgKiBOb3RlLCB0aGUgcmV0dXJuZWQgc2VuZGVyIGlzIGFsd2F5cyB0aGUgdW5pcXVlIGJ1cyBuYW1lLgorICogQ29ubmVjdGlvbnMgbWF5IG93biBtdWx0aXBsZSBvdGhlciBidXMgbmFtZXMsIGJ1dCB0aG9zZQorICogYXJlIG5vdCBmb3VuZCBpbiB0aGUgc2VuZGVyIGZpZWxkLgorICogCisgKiBUaGUgcmV0dXJuZWQgc3RyaW5nIGJlY29tZXMgaW52YWxpZCBpZiB0aGUgbWVzc2FnZSBpcworICogbW9kaWZpZWQsIHNpbmNlIGl0IHBvaW50cyBpbnRvIHRoZSB3aXJlLW1hcnNoYWxlZCBtZXNzYWdlIGRhdGEuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEByZXR1cm5zIHRoZSB1bmlxdWUgbmFtZSBvZiB0aGUgc2VuZGVyIG9yICNOVUxMCisgKi8KK2NvbnN0IGNoYXIqCitkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIGNvbnN0IGNoYXIgKnY7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIE5VTEwpOworCisgIHYgPSBOVUxMOyAvKiBpbiBjYXNlIGZpZWxkIGRvZXNuJ3QgZXhpc3QgKi8KKyAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9iYXNpYyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0VOREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSAmdik7CisgIHJldHVybiB2OworfQorCisvKioKKyAqIEdldHMgdGhlIHR5cGUgc2lnbmF0dXJlIG9mIHRoZSBtZXNzYWdlLCBpLmUuIHRoZSBhcmd1bWVudHMgaW4gdGhlCisgKiBtZXNzYWdlIHBheWxvYWQuIFRoZSBzaWduYXR1cmUgaW5jbHVkZXMgb25seSAiaW4iIGFyZ3VtZW50cyBmb3IKKyAqICNEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCBhbmQgb25seSAib3V0IiBhcmd1bWVudHMgZm9yCisgKiAjREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTiwgc28gaXMgc2xpZ2h0bHkgZGlmZmVyZW50IGZyb20KKyAqIHdoYXQgeW91IG1pZ2h0IGV4cGVjdCAodGhhdCBpcywgaXQgZG9lcyBub3QgaW5jbHVkZSB0aGUgc2lnbmF0dXJlIG9mIHRoZQorICogZW50aXJlIEMrKy1zdHlsZSBtZXRob2QpLgorICoKKyAqIFRoZSBzaWduYXR1cmUgaXMgYSBzdHJpbmcgbWFkZSB1cCBvZiB0eXBlIGNvZGVzIHN1Y2ggYXMKKyAqICNEQlVTX1RZUEVfSU5UMzIuIFRoZSBzdHJpbmcgaXMgdGVybWluYXRlZCB3aXRoIG51bCAobnVsIGlzIGFsc28KKyAqIHRoZSB2YWx1ZSBvZiAjREJVU19UWVBFX0lOVkFMSUQpLgorICoKKyAqIFRoZSByZXR1cm5lZCBzdHJpbmcgYmVjb21lcyBpbnZhbGlkIGlmIHRoZSBtZXNzYWdlIGlzCisgKiBtb2RpZmllZCwgc2luY2UgaXQgcG9pbnRzIGludG8gdGhlIHdpcmUtbWFyc2hhbGVkIG1lc3NhZ2UgZGF0YS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHJldHVybnMgdGhlIHR5cGUgc2lnbmF0dXJlCisgKi8KK2NvbnN0IGNoYXIqCitkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIGNvbnN0IERCdXNTdHJpbmcgKnR5cGVfc3RyOworICBpbnQgdHlwZV9wb3M7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIE5VTEwpOworCisgIGdldF9jb25zdF9zaWduYXR1cmUgKCZtZXNzYWdlLT5oZWFkZXIsICZ0eXBlX3N0ciwgJnR5cGVfcG9zKTsKKworICByZXR1cm4gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAodHlwZV9zdHIsIHR5cGVfcG9zLCAwKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19tZXNzYWdlX2hhc190eXBlX2ludGVyZmFjZV9tZW1iZXIgKERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKm1lbWJlcikKK3sKKyAgY29uc3QgY2hhciAqbjsKKworICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoaW50ZXJmYWNlICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKG1lbWJlciAhPSBOVUxMKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSAhPSB0eXBlKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBPcHRpbWl6ZSBieSBjaGVja2luZyB0aGUgc2hvcnQgbWVtYmVyIG5hbWUgZmlyc3QKKyAgICogaW5zdGVhZCBvZiB0aGUgbG9uZ2VyIGludGVyZmFjZSBuYW1lCisgICAqLworCisgIG4gPSBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSk7CisKKyAgaWYgKG4gJiYgc3RyY21wIChuLCBtZW1iZXIpID09IDApCisgICAgeworICAgICAgbiA9IGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKTsKKworICAgICAgaWYgKG4gPT0gTlVMTCB8fCBzdHJjbXAgKG4sIGludGVyZmFjZSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciB0aGUgbWVzc2FnZSBpcyBhIG1ldGhvZCBjYWxsIHdpdGggdGhlIGdpdmVuCisgKiBpbnRlcmZhY2UgYW5kIG1lbWJlciBmaWVsZHMuICBJZiB0aGUgbWVzc2FnZSBpcyBub3QKKyAqICNEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCwgb3IgaGFzIGEgZGlmZmVyZW50IGludGVyZmFjZSBvcgorICogbWVtYmVyIGZpZWxkLCByZXR1cm5zICNGQUxTRS4gSWYgdGhlIGludGVyZmFjZSBmaWVsZCBpcyBtaXNzaW5nLAorICogdGhlbiBpdCB3aWxsIGJlIGFzc3VtZWQgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIGludGVyZmFjZS4gIFRoZSBELUJ1cworICogcHJvdG9jb2wgYWxsb3dzIG1ldGhvZCBjYWxsZXJzIHRvIGxlYXZlIG91dCB0aGUgaW50ZXJmYWNlIG5hbWUuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBpbnRlcmZhY2UgdGhlIG5hbWUgdG8gY2hlY2sgKG11c3Qgbm90IGJlICNOVUxMKQorICogQHBhcmFtIG1ldGhvZCB0aGUgbmFtZSB0byBjaGVjayAobXVzdCBub3QgYmUgI05VTEwpCisgKgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIG1lc3NhZ2UgaXMgdGhlIHNwZWNpZmllZCBtZXRob2QgY2FsbAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2lzX21ldGhvZF9jYWxsIChEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKm1ldGhvZCkKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChpbnRlcmZhY2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1ldGhvZCAhPSBOVUxMLCBGQUxTRSk7CisgIC8qIGRvbid0IGNoZWNrIHRoYXQgaW50ZXJmYWNlL21ldGhvZCBhcmUgdmFsaWQgc2luY2UgaXQgd291bGQgYmUKKyAgICogZXhwZW5zaXZlLCBhbmQgbm90IGNhdGNoIG1hbnkgY29tbW9uIGVycm9ycworICAgKi8KKworICByZXR1cm4gX2RidXNfbWVzc2FnZV9oYXNfdHlwZV9pbnRlcmZhY2VfbWVtYmVyIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlLCBtZXRob2QpOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBtZXNzYWdlIGlzIGEgc2lnbmFsIHdpdGggdGhlIGdpdmVuIGludGVyZmFjZSBhbmQKKyAqIG1lbWJlciBmaWVsZHMuICBJZiB0aGUgbWVzc2FnZSBpcyBub3QgI0RCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCwgb3IKKyAqIGhhcyBhIGRpZmZlcmVudCBpbnRlcmZhY2Ugb3IgbWVtYmVyIGZpZWxkLCByZXR1cm5zICNGQUxTRS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIGludGVyZmFjZSB0aGUgbmFtZSB0byBjaGVjayAobXVzdCBub3QgYmUgI05VTEwpCisgKiBAcGFyYW0gc2lnbmFsX25hbWUgdGhlIG5hbWUgdG8gY2hlY2sgKG11c3Qgbm90IGJlICNOVUxMKQorICoKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBtZXNzYWdlIGlzIHRoZSBzcGVjaWZpZWQgc2lnbmFsCisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICppbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqc2lnbmFsX25hbWUpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoaW50ZXJmYWNlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChzaWduYWxfbmFtZSAhPSBOVUxMLCBGQUxTRSk7CisgIC8qIGRvbid0IGNoZWNrIHRoYXQgaW50ZXJmYWNlL25hbWUgYXJlIHZhbGlkIHNpbmNlIGl0IHdvdWxkIGJlCisgICAqIGV4cGVuc2l2ZSwgYW5kIG5vdCBjYXRjaCBtYW55IGNvbW1vbiBlcnJvcnMKKyAgICovCisKKyAgcmV0dXJuIF9kYnVzX21lc3NhZ2VfaGFzX3R5cGVfaW50ZXJmYWNlX21lbWJlciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UsIHNpZ25hbF9uYW1lKTsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciB0aGUgbWVzc2FnZSBpcyBhbiBlcnJvciByZXBseSB3aXRoIHRoZSBnaXZlbiBlcnJvcgorICogbmFtZS4gIElmIHRoZSBtZXNzYWdlIGlzIG5vdCAjREJVU19NRVNTQUdFX1RZUEVfRVJST1IsIG9yIGhhcyBhCisgKiBkaWZmZXJlbnQgbmFtZSwgcmV0dXJucyAjRkFMU0UuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBlcnJvcl9uYW1lIHRoZSBuYW1lIHRvIGNoZWNrIChtdXN0IG5vdCBiZSAjTlVMTCkKKyAqCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgbWVzc2FnZSBpcyB0aGUgc3BlY2lmaWVkIGVycm9yCisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqZXJyb3JfbmFtZSkKK3sKKyAgY29uc3QgY2hhciAqbjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGVycm9yX25hbWUgIT0gTlVMTCwgRkFMU0UpOworICAvKiBkb24ndCBjaGVjayB0aGF0IGVycm9yX25hbWUgaXMgdmFsaWQgc2luY2UgaXQgd291bGQgYmUgZXhwZW5zaXZlLAorICAgKiBhbmQgbm90IGNhdGNoIG1hbnkgY29tbW9uIGVycm9ycworICAgKi8KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSAhPSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbiA9IGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSk7CisKKyAgaWYgKG4gJiYgc3RyY21wIChuLCBlcnJvcl9uYW1lKSA9PSAwKQorICAgIHJldHVybiBUUlVFOworICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBtZXNzYWdlIHdhcyBzZW50IHRvIHRoZSBnaXZlbiBuYW1lLiAgSWYgdGhlCisgKiBtZXNzYWdlIGhhcyBubyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQgb3IgaGFzIGEgZGlmZmVyZW50CisgKiBkZXN0aW5hdGlvbiwgcmV0dXJucyAjRkFMU0UuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGNoZWNrIChtdXN0IG5vdCBiZSAjTlVMTCkKKyAqCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgbWVzc2FnZSBoYXMgdGhlIGdpdmVuIGRlc3RpbmF0aW9uIG5hbWUKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9oYXNfZGVzdGluYXRpb24gKERCdXNNZXNzYWdlICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqbmFtZSkKK3sKKyAgY29uc3QgY2hhciAqczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG5hbWUgIT0gTlVMTCwgRkFMU0UpOworICAvKiBkb24ndCBjaGVjayB0aGF0IG5hbWUgaXMgdmFsaWQgc2luY2UgaXQgd291bGQgYmUgZXhwZW5zaXZlLCBhbmQKKyAgICogbm90IGNhdGNoIG1hbnkgY29tbW9uIGVycm9ycworICAgKi8KKworICBzID0gZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSk7CisKKyAgaWYgKHMgJiYgc3RyY21wIChzLCBuYW1lKSA9PSAwKQorICAgIHJldHVybiBUUlVFOworICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBtZXNzYWdlIGhhcyB0aGUgZ2l2ZW4gdW5pcXVlIG5hbWUgYXMgaXRzIHNlbmRlci4KKyAqIElmIHRoZSBtZXNzYWdlIGhhcyBubyBzZW5kZXIgc3BlY2lmaWVkIG9yIGhhcyBhIGRpZmZlcmVudCBzZW5kZXIsCisgKiByZXR1cm5zICNGQUxTRS4gTm90ZSB0aGF0IGEgcGVlciBhcHBsaWNhdGlvbiB3aWxsIGFsd2F5cyBoYXZlIHRoZQorICogdW5pcXVlIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24gYXMgdGhlIHNlbmRlci4gU28geW91IGNhbid0IHVzZSB0aGlzCisgKiBmdW5jdGlvbiB0byBzZWUgd2hldGhlciBhIHNlbmRlciBvd25lZCBhIHdlbGwta25vd24gbmFtZS4KKyAqCisgKiBNZXNzYWdlcyBmcm9tIHRoZSBidXMgaXRzZWxmIHdpbGwgaGF2ZSAjREJVU19TRVJWSUNFX0RCVVMKKyAqIGFzIHRoZSBzZW5kZXIuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGNoZWNrIChtdXN0IG5vdCBiZSAjTlVMTCkKKyAqCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgbWVzc2FnZSBoYXMgdGhlIGdpdmVuIHNlbmRlcgorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2hhc19zZW5kZXIgKERCdXNNZXNzYWdlICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKm5hbWUpCit7CisgIGNvbnN0IGNoYXIgKnM7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChuYW1lICE9IE5VTEwsIEZBTFNFKTsKKyAgLyogZG9uJ3QgY2hlY2sgdGhhdCBuYW1lIGlzIHZhbGlkIHNpbmNlIGl0IHdvdWxkIGJlIGV4cGVuc2l2ZSwgYW5kCisgICAqIG5vdCBjYXRjaCBtYW55IGNvbW1vbiBlcnJvcnMKKyAgICovCisKKyAgcyA9IGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKTsKKworICBpZiAocyAmJiBzdHJjbXAgKHMsIG5hbWUpID09IDApCisgICAgcmV0dXJuIFRSVUU7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1lc3NhZ2UgaGFzIHRoZSBnaXZlbiBzaWduYXR1cmU7IHNlZQorICogZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUoKSBmb3IgbW9yZSBkZXRhaWxzIG9uIHdoYXQgdGhlIHNpZ25hdHVyZQorICogbG9va3MgbGlrZS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIHNpZ25hdHVyZSB0eXBlY29kZSBhcnJheQorICogQHJldHVybnMgI1RSVUUgaWYgbWVzc2FnZSBoYXMgdGhlIGdpdmVuIHNpZ25hdHVyZQorKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfaGFzX3NpZ25hdHVyZSAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpzaWduYXR1cmUpCit7CisgIGNvbnN0IGNoYXIgKnM7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChzaWduYXR1cmUgIT0gTlVMTCwgRkFMU0UpOworICAvKiBkb24ndCBjaGVjayB0aGF0IHNpZ25hdHVyZSBpcyB2YWxpZCBzaW5jZSBpdCB3b3VsZCBiZSBleHBlbnNpdmUsCisgICAqIGFuZCBub3QgY2F0Y2ggbWFueSBjb21tb24gZXJyb3JzCisgICAqLworCisgIHMgPSBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSk7CisKKyAgaWYgKHMgJiYgc3RyY21wIChzLCBzaWduYXR1cmUpID09IDApCisgICAgcmV0dXJuIFRSVUU7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogU2V0cyBhICNEQnVzRXJyb3IgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbgorICogbWVzc2FnZS4gVGhlIGVycm9yIGlzIG9ubHkgc2V0IGlmIHRoZSBtZXNzYWdlCisgKiBpcyBhbiBlcnJvciBtZXNzYWdlLCBhcyBpbiAjREJVU19NRVNTQUdFX1RZUEVfRVJST1IuCisgKiBUaGUgbmFtZSBvZiB0aGUgZXJyb3IgaXMgc2V0IHRvIHRoZSBuYW1lIG9mIHRoZSBtZXNzYWdlLAorICogYW5kIHRoZSBlcnJvciBtZXNzYWdlIGlzIHNldCB0byB0aGUgZmlyc3QgYXJndW1lbnQKKyAqIGlmIHRoZSBhcmd1bWVudCBleGlzdHMgYW5kIGlzIGEgc3RyaW5nLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVycm9yIHdhcyBzZXQgKHRoZSBlcnJvciBpcworICogc2V0IGlmIGFuZCBvbmx5IGlmIHRoZSBtZXNzYWdlIGlzIGFuIGVycm9yIG1lc3NhZ2UpLiAgU28geW91IGNhbgorICogY2hlY2sgZm9yIGFuIGVycm9yIHJlcGx5IGFuZCBjb252ZXJ0IGl0IHRvIERCdXNFcnJvciBpbiBvbmUgZ286CisgKiBAY29kZQorICogIGlmIChkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgKGVycm9yLCByZXBseSkpCisgKiAgICByZXR1cm4gZXJyb3I7CisgKiAgZWxzZQorICogICAgcHJvY2VzcyByZXBseTsKKyAqIEBlbmRjb2RlCisgKgorICogQHBhcmFtIGVycm9yIHRoZSBlcnJvciB0byBzZXQKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIHNldCBpdCBmcm9tCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgbWVzc2FnZSBoYWQgdHlwZSAjREJVU19NRVNTQUdFX1RZUEVfRVJST1IKKyAqLworZGJ1c19ib29sX3QKK2RidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAoREJ1c0Vycm9yICAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgY29uc3QgY2hhciAqc3RyOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZXJyb3JfaXNfc2V0IChlcnJvciwgRkFMU0UpOworCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpICE9IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKQorICAgIHJldHVybiBGQUxTRTsKKworICBzdHIgPSBOVUxMOworICBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisKKyAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgc3RyID8gIiVzIiA6IE5VTEwsIHN0cik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgYSBtZXNzYWdlIGNvbnRhaW5zIHVuaXggZmRzCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBtZXNzYWdlIGNvbnRhaW5zIHVuaXggZmRzCisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfY29udGFpbnNfdW5peF9mZHMoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgX2RidXNfYXNzZXJ0KG1lc3NhZ2UpOworCisgIHJldHVybiBtZXNzYWdlLT5uX3VuaXhfZmRzID4gMDsKKyNlbHNlCisgIHJldHVybiBGQUxTRTsKKyNlbmRpZgorfQorCisvKiogQH0gKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzTWVzc2FnZUludGVybmFscworICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBUaGUgaW5pdGlhbCBidWZmZXIgc2l6ZSBvZiB0aGUgbWVzc2FnZSBsb2FkZXIuCisgKgorICogQHRvZG8gdGhpcyBzaG91bGQgYmUgYmFzZWQgb24gbWluIGhlYWRlciBzaXplIHBsdXMgc29tZSBhdmVyYWdlCisgKiBib2R5IHNpemUsIG9yIHNvbWV0aGluZy4gT3IgcmF0aGVyLCB0aGUgbWluIGhlYWRlciBzaXplIG9ubHksIGlmIHdlCisgKiB3YW50IHRvIHRyeSB0byByZWFkIG9ubHkgdGhlIGhlYWRlciwgc3RvcmUgdGhhdCBpbiBhIERCdXNNZXNzYWdlLAorICogdGhlbiByZWFkIG9ubHkgdGhlIGJvZHkgYW5kIHN0b3JlIHRoYXQsIGV0Yy4sIGRlcGVuZHMgb24KKyAqIGhvdyB3ZSBvcHRpbWl6ZSBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfYnVmZmVyKCkgYW5kIHdoYXQKKyAqIHRoZSBleGFjdCBtZXNzYWdlIGZvcm1hdCBpcy4KKyAqLworI2RlZmluZSBJTklUSUFMX0xPQURFUl9EQVRBX0xFTiAzMgorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgbWVzc2FnZSBsb2FkZXIuIFJldHVybnMgI05VTEwgaWYgbWVtb3J5IGNhbid0CisgKiBiZSBhbGxvY2F0ZWQuCisgKgorICogQHJldHVybnMgbmV3IGxvYWRlciwgb3IgI05VTEwuCisgKi8KK0RCdXNNZXNzYWdlTG9hZGVyKgorX2RidXNfbWVzc2FnZV9sb2FkZXJfbmV3ICh2b2lkKQoreworICBEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyOworCisgIGxvYWRlciA9IGRidXNfbmV3MCAoREJ1c01lc3NhZ2VMb2FkZXIsIDEpOworICBpZiAobG9hZGVyID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBsb2FkZXItPnJlZmNvdW50ID0gMTsKKworICBsb2FkZXItPmNvcnJ1cHRlZCA9IEZBTFNFOworICBsb2FkZXItPmNvcnJ1cHRpb25fcmVhc29uID0gREJVU19WQUxJRDsKKworICAvKiB0aGlzIGNhbiBiZSBjb25maWd1cmVkIGJ5IHRoZSBhcHAsIGJ1dCBkZWZhdWx0cyB0byB0aGUgcHJvdG9jb2wgbWF4ICovCisgIGxvYWRlci0+bWF4X21lc3NhZ2Vfc2l6ZSA9IERCVVNfTUFYSU1VTV9NRVNTQUdFX0xFTkdUSDsKKworICAvKiBXZSBzZXQgYSB2ZXJ5IHJlbGF0aXZlbHkgY29uc2VydmF0aXZlIGRlZmF1bHQgaGVyZSBzaW5jZSBkdWUgdG8gaG93CisgIFNDTV9SSUdIVFMgd29ya3Mgd2UgbmVlZCB0byBwcmVhbGxvY2F0ZSBhbiBmZCBhcnJheSBvZiB0aGUgbWF4aW11bQorICBudW1iZXIgb2YgdW5peCBmZHMgd2Ugd2FudCB0byByZWNlaXZlIGluIGFkdmFuY2UuIEEKKyAgdHJ5LWFuZC1yZWFsbG9jYXRlIGxvb3AgaXMgbm90IHBvc3NpYmxlLiAqLworICBsb2FkZXItPm1heF9tZXNzYWdlX3VuaXhfZmRzID0gMTAyNDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmbG9hZGVyLT5kYXRhKSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKGxvYWRlcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogcHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciBmb3Igc3BlZWQsIGlnbm9yZSBmYWlsdXJlICovCisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmbG9hZGVyLT5kYXRhLCBJTklUSUFMX0xPQURFUl9EQVRBX0xFTik7CisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmbG9hZGVyLT5kYXRhLCAwKTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIGxvYWRlci0+dW5peF9mZHMgPSBOVUxMOworICBsb2FkZXItPm5fdW5peF9mZHMgPSBsb2FkZXItPm5fdW5peF9mZHNfYWxsb2NhdGVkID0gMDsKKyAgbG9hZGVyLT51bml4X2Zkc19vdXRzdGFuZGluZyA9IEZBTFNFOworI2VuZGlmCisKKyAgcmV0dXJuIGxvYWRlcjsKK30KKworLyoqCisgKiBJbmNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIGxvYWRlci4KKyAqCisgKiBAcGFyYW0gbG9hZGVyIHRoZSBsb2FkZXIuCisgKiBAcmV0dXJucyB0aGUgbG9hZGVyCisgKi8KK0RCdXNNZXNzYWdlTG9hZGVyICoKK19kYnVzX21lc3NhZ2VfbG9hZGVyX3JlZiAoREJ1c01lc3NhZ2VMb2FkZXIgKmxvYWRlcikKK3sKKyAgbG9hZGVyLT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiBsb2FkZXI7Cit9CisKKy8qKgorICogRGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBsb2FkZXIgYW5kIGZpbmFsaXplcyB0aGUKKyAqIGxvYWRlciB3aGVuIHRoZSBjb3VudCByZWFjaGVzIHplcm8uCisgKgorICogQHBhcmFtIGxvYWRlciB0aGUgbG9hZGVyLgorICovCit2b2lkCitfZGJ1c19tZXNzYWdlX2xvYWRlcl91bnJlZiAoREJ1c01lc3NhZ2VMb2FkZXIgKmxvYWRlcikKK3sKKyAgbG9hZGVyLT5yZWZjb3VudCAtPSAxOworICBpZiAobG9hZGVyLT5yZWZjb3VudCA9PSAwKQorICAgIHsKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICAgICAgY2xvc2VfdW5peF9mZHMobG9hZGVyLT51bml4X2ZkcywgJmxvYWRlci0+bl91bml4X2Zkcyk7CisgICAgICBkYnVzX2ZyZWUobG9hZGVyLT51bml4X2Zkcyk7CisjZW5kaWYKKyAgICAgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJmxvYWRlci0+bWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzRm9yZWFjaEZ1bmN0aW9uKSBkYnVzX21lc3NhZ2VfdW5yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgX2RidXNfbGlzdF9jbGVhciAoJmxvYWRlci0+bWVzc2FnZXMpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZsb2FkZXItPmRhdGEpOworICAgICAgZGJ1c19mcmVlIChsb2FkZXIpOworICAgIH0KK30KKworLyoqCisgKiBHZXRzIHRoZSBidWZmZXIgdG8gdXNlIGZvciByZWFkaW5nIGRhdGEgZnJvbSB0aGUgbmV0d29yay4gIE5ldHdvcmsKKyAqIGRhdGEgaXMgcmVhZCBkaXJlY3RseSBpbnRvIGFuIGFsbG9jYXRlZCBidWZmZXIsIHdoaWNoIGlzIHRoZW4gdXNlZAorICogaW4gdGhlIERCdXNNZXNzYWdlLCB0byBhdm9pZCBhcyBtYW55IGV4dHJhIG1lbWNweSdzIGFzIHBvc3NpYmxlLgorICogVGhlIGJ1ZmZlciBtdXN0IGFsd2F5cyBiZSByZXR1cm5lZCBpbW1lZGlhdGVseSB1c2luZworICogX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX2J1ZmZlcigpLCBldmVuIGlmIG5vIGJ5dGVzIGFyZQorICogc3VjY2Vzc2Z1bGx5IHJlYWQuCisgKgorICogQHRvZG8gdGhpcyBmdW5jdGlvbiBjYW4gYmUgYSBsb3QgbW9yZSBjbGV2ZXIuIEZvciBleGFtcGxlCisgKiBpdCBjYW4gcHJvYmFibHkgYWx3YXlzIHJldHVybiBhIGJ1ZmZlciBzaXplIHRvIHJlYWQgZXhhY3RseQorICogdGhlIGJvZHkgb2YgdGhlIG5leHQgbWVzc2FnZSwgdGh1cyBhdm9pZGluZyBhbnkgbWVtb3J5IHdhc3RhZ2UKKyAqIG9yIHJlYWxsb2NzLgorICoKKyAqIEB0b2RvIHdlIG5lZWQgdG8gZW5mb3JjZSBhIG1heCBsZW5ndGggb24gc3RyaW5ncyBpbiBoZWFkZXIgZmllbGRzLgorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIG1lc3NhZ2UgbG9hZGVyLgorICogQHBhcmFtIGJ1ZmZlciB0aGUgYnVmZmVyCisgKi8KK3ZvaWQKK19kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9idWZmZXIgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgKipidWZmZXIpCit7CisgIF9kYnVzX2Fzc2VydCAoIWxvYWRlci0+YnVmZmVyX291dHN0YW5kaW5nKTsKKworICAqYnVmZmVyID0gJmxvYWRlci0+ZGF0YTsKKworICBsb2FkZXItPmJ1ZmZlcl9vdXRzdGFuZGluZyA9IFRSVUU7Cit9CisKKy8qKgorICogUmV0dXJucyBhIGJ1ZmZlciBvYnRhaW5lZCBmcm9tIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9idWZmZXIoKSwKKyAqIGluZGljYXRpbmcgdG8gdGhlIGxvYWRlciBob3cgbWFueSBieXRlcyBvZiB0aGUgYnVmZmVyIHdlcmUgZmlsbGVkCisgKiBpbi4gVGhpcyBmdW5jdGlvbiBtdXN0IGFsd2F5cyBiZSBjYWxsZWQsIGV2ZW4gaWYgbm8gYnl0ZXMgd2VyZQorICogc3VjY2Vzc2Z1bGx5IHJlYWQuCisgKgorICogQHBhcmFtIGxvYWRlciB0aGUgbG9hZGVyLgorICogQHBhcmFtIGJ1ZmZlciB0aGUgYnVmZmVyLgorICogQHBhcmFtIGJ5dGVzX3JlYWQgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2VyZSByZWFkIGludG8gdGhlIGJ1ZmZlci4KKyAqLwordm9pZAorX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX2J1ZmZlciAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgYnl0ZXNfcmVhZCkKK3sKKyAgX2RidXNfYXNzZXJ0IChsb2FkZXItPmJ1ZmZlcl9vdXRzdGFuZGluZyk7CisgIF9kYnVzX2Fzc2VydCAoYnVmZmVyID09ICZsb2FkZXItPmRhdGEpOworCisgIGxvYWRlci0+YnVmZmVyX291dHN0YW5kaW5nID0gRkFMU0U7Cit9CisKKy8qKgorICogR2V0cyB0aGUgYnVmZmVyIHRvIHVzZSBmb3IgcmVhZGluZyB1bml4IGZkcyBmcm9tIHRoZSBuZXR3b3JrLgorICoKKyAqIFRoaXMgd29ya3Mgc2ltaWxhciB0byBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfYnVmZmVyKCkKKyAqCisgKiBAcGFyYW0gbG9hZGVyIHRoZSBtZXNzYWdlIGxvYWRlci4KKyAqIEBwYXJhbSBmZHMgdGhlIGFycmF5IHRvIHJlYWQgZmRzIGludG8KKyAqIEBwYXJhbSBtYXhfbl9mZHMgaG93IG1hbnkgZmRzIHRvIHJlYWQgYXQgbW9zdAorICogQHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIE9PTQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X3VuaXhfZmRzKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICoqZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICAgICAgICAgICAqbWF4X25fZmRzKQoreworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIF9kYnVzX2Fzc2VydCAoIWxvYWRlci0+dW5peF9mZHNfb3V0c3RhbmRpbmcpOworCisgIC8qIEFsbG9jYXRlIHNwYWNlIHdoZXJlIHdlIGNhbiBwdXQgdGhlIGZkcyB3ZSByZWFkLiBXZSBhbGxvY2F0ZQorICAgICBzcGFjZSBmb3IgbWF4X21lc3NhZ2VfdW5peF9mZHMgc2luY2UgdGhpcyBpcyBhbgorICAgICB1cHBlciBsaW1pdCBob3cgbWFueSBmZHMgY2FuIGJlIHJlY2VpdmVkIHdpdGhpbiBhIHNpbmdsZQorICAgICBtZXNzYWdlLiBTaW5jZSBTQ01fUklHSFRTIGRvZXNuJ3QgYWxsb3cgYSByZWFsbG9jYXRlK3JldHJ5IGxvZ2ljCisgICAgIHdlIGFyZSBhbGxvY2F0aW5nIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGFycmF5IHNpemUgcmlnaHQgZnJvbSB0aGUKKyAgICAgYmVnaW5uaW5nLiBUaGlzIHN1Y2tzIGEgYml0LCBob3dldmVyIHVubGVzcyBTQ01fUklHSFRTIGlzIGZpeGVkCisgICAgIHRoZXJlIGlzIG5vIGJldHRlciB3YXkuICovCisKKyAgaWYgKGxvYWRlci0+bl91bml4X2Zkc19hbGxvY2F0ZWQgPCBsb2FkZXItPm1heF9tZXNzYWdlX3VuaXhfZmRzKQorICAgIHsKKyAgICAgIGludCAqYSA9IGRidXNfcmVhbGxvYyhsb2FkZXItPnVuaXhfZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlci0+bWF4X21lc3NhZ2VfdW5peF9mZHMgKiBzaXplb2YobG9hZGVyLT51bml4X2Zkc1swXSkpOworCisgICAgICBpZiAoIWEpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgbG9hZGVyLT51bml4X2ZkcyA9IGE7CisgICAgICBsb2FkZXItPm5fdW5peF9mZHNfYWxsb2NhdGVkID0gbG9hZGVyLT5tYXhfbWVzc2FnZV91bml4X2ZkczsKKyAgICB9CisKKyAgKmZkcyA9IGxvYWRlci0+dW5peF9mZHMgKyBsb2FkZXItPm5fdW5peF9mZHM7CisgICptYXhfbl9mZHMgPSBsb2FkZXItPm5fdW5peF9mZHNfYWxsb2NhdGVkIC0gbG9hZGVyLT5uX3VuaXhfZmRzOworCisgIGxvYWRlci0+dW5peF9mZHNfb3V0c3RhbmRpbmcgPSBUUlVFOworICByZXR1cm4gVFJVRTsKKyNlbHNlCisgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiUGxhdGZvcm0gZG9lc24ndCBzdXBwb3J0IHVuaXggZmQgcGFzc2luZyIpOworICByZXR1cm4gRkFMU0U7CisjZW5kaWYKK30KKworLyoqCisgKiBSZXR1cm5zIGEgYnVmZmVyIG9idGFpbmVkIGZyb20gX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X3VuaXhfZmRzKCkuCisgKgorICogVGhpcyB3b3JrcyBzaW1pbGFyIHRvIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIoKQorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIG1lc3NhZ2UgbG9hZGVyLgorICogQHBhcmFtIGZkcyB0aGUgYXJyYXkgZmRzIHdlcmUgcmVhZCBpbnRvCisgKiBAcGFyYW0gbWF4X25fZmRzIGhvdyBtYW55IGZkcyB3ZXJlIHJlYWQKKyAqLworCit2b2lkCitfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fdW5peF9mZHMoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICpmZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgICAgICAgICAgICBuX2ZkcykKK3sKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICBfZGJ1c19hc3NlcnQobG9hZGVyLT51bml4X2Zkc19vdXRzdGFuZGluZyk7CisgIF9kYnVzX2Fzc2VydChsb2FkZXItPnVuaXhfZmRzICsgbG9hZGVyLT5uX3VuaXhfZmRzID09IGZkcyk7CisgIF9kYnVzX2Fzc2VydChsb2FkZXItPm5fdW5peF9mZHMgKyBuX2ZkcyA8PSBsb2FkZXItPm5fdW5peF9mZHNfYWxsb2NhdGVkKTsKKworICBsb2FkZXItPm5fdW5peF9mZHMgKz0gbl9mZHM7CisgIGxvYWRlci0+dW5peF9mZHNfb3V0c3RhbmRpbmcgPSBGQUxTRTsKKyNlbHNlCisgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiUGxhdGZvcm0gZG9lc24ndCBzdXBwb3J0IHVuaXggZmQgcGFzc2luZyIpOworI2VuZGlmCit9CisKKy8qCisgKiBGSVhNRSB3aGVuIHdlIG1vdmUgdGhlIGhlYWRlciBvdXQgb2YgdGhlIGJ1ZmZlciwgdGhhdCBtZW1tb3ZlcyBhbGwKKyAqIGJ1ZmZlcmVkIG1lc3NhZ2VzLiBLaW5kIG9mIGNyYXBweS4KKyAqCisgKiBBbHNvIHdlIGNvcHkgdGhlIGhlYWRlciBhbmQgYm9keSwgd2hpY2ggaXMga2luZCBvZiBjcmFwcHkuICBUbworICogYXZvaWQgdGhpcywgd2UgaGF2ZSB0byBhbGxvdyBoZWFkZXIgYW5kIGJvZHkgdG8gYmUgaW4gYSBzaW5nbGUKKyAqIG1lbW9yeSBibG9jaywgd2hpY2ggaXMgZ29vZCBmb3IgbWVzc2FnZXMgd2UgcmVhZCBhbmQgYmFkIGZvcgorICogbWVzc2FnZXMgd2UgYXJlIGNyZWF0aW5nLiBCdXQgd2UgY291bGQgbW92ZV9sZW4oKSB0aGUgYnVmZmVyIGludG8KKyAqIHRoaXMgc2luZ2xlIG1lbW9yeSBibG9jaywgYW5kIG1vdmVfbGVuKCkgd2lsbCBqdXN0IHN3YXAgdGhlIGJ1ZmZlcnMKKyAqIGlmIHlvdSdyZSBtb3ZpbmcgdGhlIGVudGlyZSBidWZmZXIgcmVwbGFjaW5nIHRoZSBkZXN0IHN0cmluZy4KKyAqCisgKiBXZSBjb3VsZCBhbHNvIGhhdmUgdGhlIG1lc3NhZ2UgbG9hZGVyIHRlbGwgdGhlIHRyYW5zcG9ydCBob3cgbWFueQorICogYnl0ZXMgdG8gcmVhZDsgc28gaXQgd291bGQgZmlyc3QgYXNrIGZvciBzb21lIGFyYml0cmFyeSBudW1iZXIgbGlrZQorICogMjU2LCB0aGVuIGlmIHRoZSBtZXNzYWdlIHdhcyBpbmNvbXBsZXRlIGl0IHdvdWxkIHVzZSB0aGUKKyAqIGhlYWRlci9ib2R5IGxlbiB0byBhc2sgZm9yIGV4YWN0bHkgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UgKG9yCisgKiBibG9ja3MgdGhlIHNpemUgb2YgYSB0eXBpY2FsIGtlcm5lbCBidWZmZXIgZm9yIHRoZSBzb2NrZXQpLiBUaGF0CisgKiB3YXkgd2UgZG9uJ3QgZ2V0IHRyYWlsaW5nIGJ5dGVzIGluIHRoZSBidWZmZXIgdGhhdCBoYXZlIHRvIGJlCisgKiBtZW1tb3ZlZC4gVGhvdWdoIEkgc3VwcG9zZSB3ZSBhbHNvIGRvbid0IGhhdmUgYSBjaGFuY2Ugb2YgcmVhZGluZyBhCisgKiBidW5jaCBvZiBzbWFsbCBtZXNzYWdlcyBhdCBvbmNlLCBzbyB0aGUgb3B0aW1pemF0aW9uIG1heSBiZSBzdHVwaWQuCisgKgorICogQW5vdGhlciBhcHByb2FjaCB3b3VsZCBiZSB0byBrZWVwIGEgInN0YXJ0IiBpbmRleCBpbnRvCisgKiBsb2FkZXItPmRhdGEgYW5kIG9ubHkgZGVsZXRlIGl0IG9jY2FzaW9uYWxseSwgaW5zdGVhZCBvZiBhZnRlcgorICogZWFjaCBtZXNzYWdlIGlzIGxvYWRlZC4KKyAqCisgKiBsb2FkX21lc3NhZ2UoKSByZXR1cm5zIEZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5IE9SIHRoZSBsb2FkZXIgd2FzIGNvcnJ1cHRlZAorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2xvYWRfbWVzc2FnZSAoREJ1c01lc3NhZ2VMb2FkZXIgKmxvYWRlciwKKyAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgZmllbGRzX2FycmF5X2xlbiwKKyAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGhlYWRlcl9sZW4sCisgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBib2R5X2xlbikKK3sKKyAgZGJ1c19ib29sX3Qgb29tOworICBEQnVzVmFsaWRpdHkgdmFsaWRpdHk7CisgIGNvbnN0IERCdXNTdHJpbmcgKnR5cGVfc3RyOworICBpbnQgdHlwZV9wb3M7CisgIERCdXNWYWxpZGF0aW9uTW9kZSBtb2RlOworICBkYnVzX3VpbnQzMl90IG5fdW5peF9mZHMgPSAwOworCisgIG1vZGUgPSBEQlVTX1ZBTElEQVRJT05fTU9ERV9EQVRBX0lTX1VOVFJVU1RFRDsKKyAgCisgIG9vbSA9IEZBTFNFOworCisjaWYgMAorICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJmxvYWRlci0+ZGF0YSwgMCwgaGVhZGVyX2xlbiAvKiArIGJvZHlfbGVuICovKTsKKyNlbmRpZgorCisgIC8qIDEuIFZBTElEQVRFIEFORCBDT1BZIE9WRVIgSEVBREVSICovCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZtZXNzYWdlLT5oZWFkZXIuZGF0YSkgPT0gMCk7CisgIF9kYnVzX2Fzc2VydCAoKGhlYWRlcl9sZW4gKyBib2R5X2xlbikgPD0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZsb2FkZXItPmRhdGEpKTsKKworICBpZiAoIV9kYnVzX2hlYWRlcl9sb2FkICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsaWRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkc19hcnJheV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9hZGVyLT5kYXRhLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmxvYWRlci0+ZGF0YSkpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gbG9hZCBoZWFkZXIgZm9yIG5ldyBtZXNzYWdlIGNvZGUgJWRcbiIsIHZhbGlkaXR5KTsKKworICAgICAgLyogYXNzZXJ0IGhlcmUgc28gd2UgY2FuIGNhdGNoIGFueSBjb2RlIHRoYXQgc3RpbGwgdXNlcyBEQlVTX1ZBTElEIHRvIGluZGljYXRlCisgICAgICAgICBvb20gZXJyb3JzLiAgVGhleSBzaG91bGQgdXNlIERCVVNfVkFMSURJVFlfVU5LTk9XTl9PT01fRVJST1IgaW5zdGVhZCAqLworICAgICAgX2RidXNfYXNzZXJ0ICh2YWxpZGl0eSAhPSBEQlVTX1ZBTElEKTsKKworICAgICAgaWYgKHZhbGlkaXR5ID09IERCVVNfVkFMSURJVFlfVU5LTk9XTl9PT01fRVJST1IpCisgICAgICAgIG9vbSA9IFRSVUU7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBsb2FkZXItPmNvcnJ1cHRlZCA9IFRSVUU7CisgICAgICAgICAgbG9hZGVyLT5jb3JydXB0aW9uX3JlYXNvbiA9IHZhbGlkaXR5OworICAgICAgICB9CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0ICh2YWxpZGl0eSA9PSBEQlVTX1ZBTElEKTsKKworICAvKiAyLiBWQUxJREFURSBCT0RZICovCisgIGlmIChtb2RlICE9IERCVVNfVkFMSURBVElPTl9NT0RFX1dFX1RSVVNUX1RISVNfREFUQV9BQlNPTFVURUxZKQorICAgIHsKKyAgICAgIGdldF9jb25zdF9zaWduYXR1cmUgKCZtZXNzYWdlLT5oZWFkZXIsICZ0eXBlX3N0ciwgJnR5cGVfcG9zKTsKKyAgICAgIAorICAgICAgLyogQmVjYXVzZSB0aGUgYnl0ZXNfcmVtYWluaW5nIGFyZyBpcyBOVUxMLCB0aGlzIHZhbGlkYXRlcyB0aGF0IHRoZQorICAgICAgICogYm9keSBpcyB0aGUgcmlnaHQgbGVuZ3RoCisgICAgICAgKi8KKyAgICAgIHZhbGlkaXR5ID0gX2RidXNfdmFsaWRhdGVfYm9keV93aXRoX3JlYXNvbiAodHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9hZGVyLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5X2xlbik7CisgICAgICBpZiAodmFsaWRpdHkgIT0gREJVU19WQUxJRCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gdmFsaWRhdGUgbWVzc2FnZSBib2R5IGNvZGUgJWRcbiIsIHZhbGlkaXR5KTsKKworICAgICAgICAgIGxvYWRlci0+Y29ycnVwdGVkID0gVFJVRTsKKyAgICAgICAgICBsb2FkZXItPmNvcnJ1cHRpb25fcmVhc29uID0gdmFsaWRpdHk7CisgICAgICAgICAgCisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogMy4gQ09QWSBPVkVSIFVOSVggRkRTICovCisgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfYmFzaWMoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9VTklYX0ZEUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuX3VuaXhfZmRzKTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisKKyAgaWYgKG5fdW5peF9mZHMgPiBsb2FkZXItPm5fdW5peF9mZHMpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSgiTWVzc2FnZSBjb250YWlucyByZWZlcmVuY2VzIHRvIG1vcmUgdW5peCBmZHMgdGhhbiB3ZXJlIHNlbnQgJXUgIT0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgIG5fdW5peF9mZHMsIGxvYWRlci0+bl91bml4X2Zkcyk7CisKKyAgICAgIGxvYWRlci0+Y29ycnVwdGVkID0gVFJVRTsKKyAgICAgIGxvYWRlci0+Y29ycnVwdGlvbl9yZWFzb24gPSBEQlVTX0lOVkFMSURfTUlTU0lOR19VTklYX0ZEUzsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICAvKiBJZiB0aGlzIHdhcyBhIHJlY3ljbGVkIG1lc3NhZ2UgdGhlcmUgbWlnaHQgc3RpbGwgYmUKKyAgICAgc29tZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgZmRzICovCisgIGRidXNfZnJlZShtZXNzYWdlLT51bml4X2Zkcyk7CisKKyAgaWYgKG5fdW5peF9mZHMgPiAwKQorICAgIHsKKyAgICAgIG1lc3NhZ2UtPnVuaXhfZmRzID0gX2RidXNfbWVtZHVwKGxvYWRlci0+dW5peF9mZHMsIG5fdW5peF9mZHMgKiBzaXplb2YobWVzc2FnZS0+dW5peF9mZHNbMF0pKTsKKyAgICAgIGlmIChtZXNzYWdlLT51bml4X2ZkcyA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBhbGxvY2F0ZSBmaWxlIGRlc2NyaXB0b3IgYXJyYXlcbiIpOworICAgICAgICAgIG9vbSA9IFRSVUU7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKworICAgICAgbWVzc2FnZS0+bl91bml4X2Zkc19hbGxvY2F0ZWQgPSBtZXNzYWdlLT5uX3VuaXhfZmRzID0gbl91bml4X2ZkczsKKyAgICAgIGxvYWRlci0+bl91bml4X2ZkcyAtPSBuX3VuaXhfZmRzOworICAgICAgbWVtbW92ZShsb2FkZXItPnVuaXhfZmRzICsgbl91bml4X2ZkcywgbG9hZGVyLT51bml4X2ZkcywgbG9hZGVyLT5uX3VuaXhfZmRzKTsKKyAgICB9CisgIGVsc2UKKyAgICBtZXNzYWdlLT51bml4X2ZkcyA9IE5VTEw7CisKKyNlbHNlCisKKyAgaWYgKG5fdW5peF9mZHMgPiAwKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJIbW0sIG1lc3NhZ2UgY2xhaW1zIHRvIGNvbWUgd2l0aCBmaWxlIGRlc2NyaXB0b3JzICIKKyAgICAgICAgICAgICAgICAgICAgICJidXQgdGhhdCdzIG5vdCBzdXBwb3J0ZWQgb24gb3VyIHBsYXRmb3JtLCBkaXNjb25uZWN0aW5nLlxuIik7CisKKyAgICAgIGxvYWRlci0+Y29ycnVwdGVkID0gVFJVRTsKKyAgICAgIGxvYWRlci0+Y29ycnVwdGlvbl9yZWFzb24gPSBEQlVTX0lOVkFMSURfTUlTU0lOR19VTklYX0ZEUzsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworI2VuZGlmCisKKyAgLyogMy4gQ09QWSBPVkVSIEJPRFkgQU5EIFFVRVVFIE1FU1NBR0UgKi8KKworICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmbG9hZGVyLT5tZXNzYWdlcywgbWVzc2FnZSkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBhcHBlbmQgbmV3IG1lc3NhZ2UgdG8gbG9hZGVyIHF1ZXVlXG4iKTsKKyAgICAgIG9vbSA9IFRSVUU7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmJvZHkpID09IDApOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbG9hZGVyLT5kYXRhKSA+PQorICAgICAgICAgICAgICAgIChoZWFkZXJfbGVuICsgYm9keV9sZW4pKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoJmxvYWRlci0+ZGF0YSwgaGVhZGVyX2xlbiwgYm9keV9sZW4sICZtZXNzYWdlLT5ib2R5LCAwKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIG1vdmUgYm9keSBpbnRvIG5ldyBtZXNzYWdlXG4iKTsKKyAgICAgIG9vbSA9IFRSVUU7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2RlbGV0ZSAoJmxvYWRlci0+ZGF0YSwgMCwgaGVhZGVyX2xlbiArIGJvZHlfbGVuKTsKKworICAvKiBkb24ndCB3YXN0ZSBtb3JlIHRoYW4gMmsgb2YgbWVtb3J5ICovCisgIF9kYnVzX3N0cmluZ19jb21wYWN0ICgmbG9hZGVyLT5kYXRhLCAyMDQ4KTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+aGVhZGVyLmRhdGEpID09IGhlYWRlcl9sZW4pOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+Ym9keSkgPT0gYm9keV9sZW4pOworCisgIF9kYnVzX3ZlcmJvc2UgKCJMb2FkZWQgbWVzc2FnZSAlcFxuIiwgbWVzc2FnZSk7CisKKyAgX2RidXNfYXNzZXJ0ICghb29tKTsKKyAgX2RidXNfYXNzZXJ0ICghbG9hZGVyLT5jb3JydXB0ZWQpOworICBfZGJ1c19hc3NlcnQgKGxvYWRlci0+bWVzc2FnZXMgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfbGlzdF9maW5kX2xhc3QgKCZsb2FkZXItPm1lc3NhZ2VzLCBtZXNzYWdlKSAhPSBOVUxMKTsKKworICByZXR1cm4gVFJVRTsKKworIGZhaWxlZDoKKworICAvKiBDbGVhbiB1cCAqLworCisgIC8qIGRvZXMgbm90aGluZyBpZiB0aGUgbWVzc2FnZSBpc24ndCBpbiB0aGUgbGlzdCAqLworICBfZGJ1c19saXN0X3JlbW92ZV9sYXN0ICgmbG9hZGVyLT5tZXNzYWdlcywgbWVzc2FnZSk7CisgIAorICBpZiAob29tKQorICAgIF9kYnVzX2Fzc2VydCAoIWxvYWRlci0+Y29ycnVwdGVkKTsKKyAgZWxzZQorICAgIF9kYnVzX2Fzc2VydCAobG9hZGVyLT5jb3JydXB0ZWQpOworCisgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmbG9hZGVyLT5kYXRhLCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmxvYWRlci0+ZGF0YSkpOworCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBDb252ZXJ0cyBidWZmZXJlZCBkYXRhIGludG8gbWVzc2FnZXMsIGlmIHdlIGhhdmUgZW5vdWdoIGRhdGEuICBJZgorICogd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggZGF0YSwgZG9lcyBub3RoaW5nLgorICoKKyAqIEB0b2RvIHdlIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgcHJvcGVyIG5hbWVkIGhlYWRlciBmaWVsZHMgZXhpc3QKKyAqIGZvciBlYWNoIG1lc3NhZ2UgdHlwZS4KKyAqCisgKiBAdG9kbyBJZiBhIG1lc3NhZ2UgaGFzIHVua25vd24gdHlwZSwgd2Ugc2hvdWxkIHByb2JhYmx5IGVhdCBpdAorICogcmlnaHQgaGVyZSByYXRoZXIgdGhhbiBwYXNzaW5nIGl0IG91dCB0byBhcHBsaWNhdGlvbnMuICBIb3dldmVyCisgKiBpdCdzIG5vdCBhbiBlcnJvciB0byBzZWUgbWVzc2FnZXMgb2YgdW5rbm93biB0eXBlLgorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlci4KKyAqIEByZXR1cm5zICNUUlVFIGlmIHdlIGhhZCBlbm91Z2ggbWVtb3J5IHRvIGZpbmlzaC4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX21lc3NhZ2VfbG9hZGVyX3F1ZXVlX21lc3NhZ2VzIChEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyKQoreworICB3aGlsZSAoIWxvYWRlci0+Y29ycnVwdGVkICYmCisgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmxvYWRlci0+ZGF0YSkgPj0gREJVU19NSU5JTVVNX0hFQURFUl9TSVpFKQorICAgIHsKKyAgICAgIERCdXNWYWxpZGl0eSB2YWxpZGl0eTsKKyAgICAgIGludCBieXRlX29yZGVyLCBmaWVsZHNfYXJyYXlfbGVuLCBoZWFkZXJfbGVuLCBib2R5X2xlbjsKKworICAgICAgaWYgKF9kYnVzX2hlYWRlcl9oYXZlX21lc3NhZ2VfdW50cnVzdGVkIChsb2FkZXItPm1heF9tZXNzYWdlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWxpZGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZHNfYXJyYXlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVhZGVyX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvZHlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9hZGVyLT5kYXRhLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmxvYWRlci0+ZGF0YSkpKQorICAgICAgICB7CisgICAgICAgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKHZhbGlkaXR5ID09IERCVVNfVkFMSUQpOworCisgICAgICAgICAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfZW1wdHlfaGVhZGVyICgpOworICAgICAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgICBpZiAoIWxvYWRfbWVzc2FnZSAobG9hZGVyLCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLCBmaWVsZHNfYXJyYXlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfbGVuLCBib2R5X2xlbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICAgICAgICAgIC8qIGxvYWRfbWVzc2FnZSgpIHJldHVybnMgZmFsc2UgaWYgY29ycnVwdGVkIG9yIE9PTTsgaWYKKyAgICAgICAgICAgICAgICogY29ycnVwdGVkIHRoZW4gcmV0dXJuIFRSVUUgZm9yIG5vdCBPT00KKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIHJldHVybiBsb2FkZXItPmNvcnJ1cHRlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIF9kYnVzX2Fzc2VydCAobG9hZGVyLT5tZXNzYWdlcyAhPSBOVUxMKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX2xpc3RfZmluZF9sYXN0ICgmbG9hZGVyLT5tZXNzYWdlcywgbWVzc2FnZSkgIT0gTlVMTCk7CisJfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkluaXRpYWwgcGVlayBhdCBoZWFkZXIgc2F5cyB3ZSBkb24ndCBoYXZlIGEgd2hvbGUgbWVzc2FnZSB5ZXQsIG9yIGRhdGEgYnJva2VuIHdpdGggaW52YWxpZCBjb2RlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkaXR5KTsKKyAgICAgICAgICBpZiAodmFsaWRpdHkgIT0gREJVU19WQUxJRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbG9hZGVyLT5jb3JydXB0ZWQgPSBUUlVFOworICAgICAgICAgICAgICBsb2FkZXItPmNvcnJ1cHRpb25fcmVhc29uID0gdmFsaWRpdHk7CisgICAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogUGVla3MgYXQgZmlyc3QgbG9hZGVkIG1lc3NhZ2UsIHJldHVybnMgI05VTEwgaWYgbm8gbWVzc2FnZXMgaGF2ZQorICogYmVlbiBxdWV1ZWQuCisgKgorICogQHBhcmFtIGxvYWRlciB0aGUgbG9hZGVyLgorICogQHJldHVybnMgdGhlIG5leHQgbWVzc2FnZSwgb3IgI05VTEwgaWYgbm9uZS4KKyAqLworREJ1c01lc3NhZ2UqCitfZGJ1c19tZXNzYWdlX2xvYWRlcl9wZWVrX21lc3NhZ2UgKERCdXNNZXNzYWdlTG9hZGVyICpsb2FkZXIpCit7CisgIGlmIChsb2FkZXItPm1lc3NhZ2VzKQorICAgIHJldHVybiBsb2FkZXItPm1lc3NhZ2VzLT5kYXRhOworICBlbHNlCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogUG9wcyBhIGxvYWRlZCBtZXNzYWdlIChwYXNzaW5nIG93bmVyc2hpcCBvZiB0aGUgbWVzc2FnZQorICogdG8gdGhlIGNhbGxlcikuIFJldHVybnMgI05VTEwgaWYgbm8gbWVzc2FnZXMgaGF2ZSBiZWVuCisgKiBxdWV1ZWQuCisgKgorICogQHBhcmFtIGxvYWRlciB0aGUgbG9hZGVyLgorICogQHJldHVybnMgdGhlIG5leHQgbWVzc2FnZSwgb3IgI05VTEwgaWYgbm9uZS4KKyAqLworREJ1c01lc3NhZ2UqCitfZGJ1c19tZXNzYWdlX2xvYWRlcl9wb3BfbWVzc2FnZSAoREJ1c01lc3NhZ2VMb2FkZXIgKmxvYWRlcikKK3sKKyAgcmV0dXJuIF9kYnVzX2xpc3RfcG9wX2ZpcnN0ICgmbG9hZGVyLT5tZXNzYWdlcyk7Cit9CisKKy8qKgorICogUG9wcyBhIGxvYWRlZCBtZXNzYWdlIGluc2lkZSBhIGxpc3QgbGluayAocGFzc2luZyBvd25lcnNoaXAgb2YgdGhlCisgKiBtZXNzYWdlIGFuZCBsaW5rIHRvIHRoZSBjYWxsZXIpLiBSZXR1cm5zICNOVUxMIGlmIG5vIG1lc3NhZ2VzIGhhdmUKKyAqIGJlZW4gbG9hZGVkLgorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlci4KKyAqIEByZXR1cm5zIHRoZSBuZXh0IG1lc3NhZ2UgbGluaywgb3IgI05VTEwgaWYgbm9uZS4KKyAqLworREJ1c0xpc3QqCitfZGJ1c19tZXNzYWdlX2xvYWRlcl9wb3BfbWVzc2FnZV9saW5rIChEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyKQoreworICByZXR1cm4gX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayAoJmxvYWRlci0+bWVzc2FnZXMpOworfQorCisvKioKKyAqIFJldHVybnMgYSBwb3BwZWQgbWVzc2FnZSBsaW5rLCB1c2VkIHRvIHVuZG8gYSBwb3AuCisgKgorICogQHBhcmFtIGxvYWRlciB0aGUgbG9hZGVyCisgKiBAcGFyYW0gbGluayB0aGUgbGluayB3aXRoIGEgbWVzc2FnZSBpbiBpdAorICovCit2b2lkCitfZGJ1c19tZXNzYWdlX2xvYWRlcl9wdXRiYWNrX21lc3NhZ2VfbGluayAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgICAgICpsaW5rKQoreworICBfZGJ1c19saXN0X3ByZXBlbmRfbGluayAoJmxvYWRlci0+bWVzc2FnZXMsIGxpbmspOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBsb2FkZXIgaXMgY29uZnVzZWQgZHVlIHRvIGJhZCBkYXRhLgorICogSWYgbWVzc2FnZXMgYXJlIHJlY2VpdmVkIHRoYXQgYXJlIGludmFsaWQsIHRoZQorICogbG9hZGVyIGdldHMgY29uZnVzZWQgYW5kIGdpdmVzIHVwIHBlcm1hbmVudGx5LgorICogVGhpcyBzdGF0ZSBpcyBjYWxsZWQgImNvcnJ1cHRlZC4iCisgKgorICogQHBhcmFtIGxvYWRlciB0aGUgbG9hZGVyCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgbG9hZGVyIGlzIGhvc2VkLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X2lzX2NvcnJ1cHRlZCAoREJ1c01lc3NhZ2VMb2FkZXIgKmxvYWRlcikKK3sKKyAgX2RidXNfYXNzZXJ0ICgobG9hZGVyLT5jb3JydXB0ZWQgJiYgbG9hZGVyLT5jb3JydXB0aW9uX3JlYXNvbiAhPSBEQlVTX1ZBTElEKSB8fAorICAgICAgICAgICAgICAgICghbG9hZGVyLT5jb3JydXB0ZWQgJiYgbG9hZGVyLT5jb3JydXB0aW9uX3JlYXNvbiA9PSBEQlVTX1ZBTElEKSk7CisgIHJldHVybiBsb2FkZXItPmNvcnJ1cHRlZDsKK30KKworLyoqCisgKiBDaGVja3Mgd2hhdCBraW5kIG9mIGJhZCBkYXRhIGNvbmZ1c2VkIHRoZSBsb2FkZXIuCisgKgorICogQHBhcmFtIGxvYWRlciB0aGUgbG9hZGVyCisgKiBAcmV0dXJucyB3aHkgdGhlIGxvYWRlciBpcyBob3NlZCwgb3IgREJVU19WQUxJRCBpZiBpdCBpc24ndC4KKyAqLworREJ1c1ZhbGlkaXR5CitfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfY29ycnVwdGlvbl9yZWFzb24gKERCdXNNZXNzYWdlTG9hZGVyICpsb2FkZXIpCit7CisgIF9kYnVzX2Fzc2VydCAoKGxvYWRlci0+Y29ycnVwdGVkICYmIGxvYWRlci0+Y29ycnVwdGlvbl9yZWFzb24gIT0gREJVU19WQUxJRCkgfHwKKyAgICAgICAgICAgICAgICAoIWxvYWRlci0+Y29ycnVwdGVkICYmIGxvYWRlci0+Y29ycnVwdGlvbl9yZWFzb24gPT0gREJVU19WQUxJRCkpOworCisgIHJldHVybiBsb2FkZXItPmNvcnJ1cHRpb25fcmVhc29uOworfQorCisvKioKKyAqIFNldHMgdGhlIG1heGltdW0gc2l6ZSBtZXNzYWdlIHdlIGFsbG93LgorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlcgorICogQHBhcmFtIHNpemUgdGhlIG1heCBtZXNzYWdlIHNpemUgaW4gYnl0ZXMKKyAqLwordm9pZAorX2RidXNfbWVzc2FnZV9sb2FkZXJfc2V0X21heF9tZXNzYWdlX3NpemUgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICAgICAgc2l6ZSkKK3sKKyAgaWYgKHNpemUgPiBEQlVTX01BWElNVU1fTUVTU0FHRV9MRU5HVEgpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNsYW1waW5nIHJlcXVlc3RlZCBtYXggbWVzc2FnZSBzaXplICVsZCB0byAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHNpemUsIERCVVNfTUFYSU1VTV9NRVNTQUdFX0xFTkdUSCk7CisgICAgICBzaXplID0gREJVU19NQVhJTVVNX01FU1NBR0VfTEVOR1RIOworICAgIH0KKyAgbG9hZGVyLT5tYXhfbWVzc2FnZV9zaXplID0gc2l6ZTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBtYXhpbXVtIGFsbG93ZWQgbWVzc2FnZSBzaXplIGluIGJ5dGVzLgorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlcgorICogQHJldHVybnMgbWF4IHNpemUgaW4gYnl0ZXMKKyAqLworbG9uZworX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X21heF9tZXNzYWdlX3NpemUgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyKQoreworICByZXR1cm4gbG9hZGVyLT5tYXhfbWVzc2FnZV9zaXplOworfQorCisvKioKKyAqIFNldHMgdGhlIG1heGltdW0gdW5peCBmZHMgcGVyIG1lc3NhZ2Ugd2UgYWxsb3cuCisgKgorICogQHBhcmFtIGxvYWRlciB0aGUgbG9hZGVyCisgKiBAcGFyYW0gc2l6ZSB0aGUgbWF4IG51bWJlciBvZiB1bml4IGZkcyBpbiBhIG1lc3NhZ2UKKyAqLwordm9pZAorX2RidXNfbWVzc2FnZV9sb2FkZXJfc2V0X21heF9tZXNzYWdlX3VuaXhfZmRzIChEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgICAgICBuKQoreworICBpZiAobiA+IERCVVNfTUFYSU1VTV9NRVNTQUdFX1VOSVhfRkRTKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjbGFtcGluZyByZXF1ZXN0ZWQgbWF4IG1lc3NhZ2UgdW5peF9mZHMgJWxkIHRvICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgbiwgREJVU19NQVhJTVVNX01FU1NBR0VfVU5JWF9GRFMpOworICAgICAgbiA9IERCVVNfTUFYSU1VTV9NRVNTQUdFX1VOSVhfRkRTOworICAgIH0KKyAgbG9hZGVyLT5tYXhfbWVzc2FnZV91bml4X2ZkcyA9IG47Cit9CisKKy8qKgorICogR2V0cyB0aGUgbWF4aW11bSBhbGxvd2VkIG51bWJlciBvZiB1bml4IGZkcyBwZXIgbWVzc2FnZQorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlcgorICogQHJldHVybnMgbWF4IHVuaXggZmRzCisgKi8KK2xvbmcKK19kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9tYXhfbWVzc2FnZV91bml4X2ZkcyAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIpCit7CisgIHJldHVybiBsb2FkZXItPm1heF9tZXNzYWdlX3VuaXhfZmRzOworfQorCitzdGF0aWMgREJ1c0RhdGFTbG90QWxsb2NhdG9yIHNsb3RfYWxsb2NhdG9yOworX0RCVVNfREVGSU5FX0dMT0JBTF9MT0NLIChtZXNzYWdlX3Nsb3RzKTsKKworLyoqCisgKiBBbGxvY2F0ZXMgYW4gaW50ZWdlciBJRCB0byBiZSB1c2VkIGZvciBzdG9yaW5nIGFwcGxpY2F0aW9uLXNwZWNpZmljCisgKiBkYXRhIG9uIGFueSBEQnVzTWVzc2FnZS4gVGhlIGFsbG9jYXRlZCBJRCBtYXkgdGhlbiBiZSB1c2VkCisgKiB3aXRoIGRidXNfbWVzc2FnZV9zZXRfZGF0YSgpIGFuZCBkYnVzX21lc3NhZ2VfZ2V0X2RhdGEoKS4KKyAqIFRoZSBwYXNzZWQtaW4gc2xvdCBtdXN0IGJlIGluaXRpYWxpemVkIHRvIC0xLCBhbmQgaXMgZmlsbGVkIGluCisgKiB3aXRoIHRoZSBzbG90IElELiBJZiB0aGUgcGFzc2VkLWluIHNsb3QgaXMgbm90IC0xLCBpdCdzIGFzc3VtZWQKKyAqIHRvIGJlIGFscmVhZHkgYWxsb2NhdGVkLCBhbmQgaXRzIHJlZmNvdW50IGlzIGluY3JlbWVudGVkLgorICoKKyAqIFRoZSBhbGxvY2F0ZWQgc2xvdCBpcyBnbG9iYWwsIGkuZS4gYWxsIERCdXNNZXNzYWdlIG9iamVjdHMgd2lsbAorICogaGF2ZSBhIHNsb3Qgd2l0aCB0aGUgZ2l2ZW4gaW50ZWdlciBJRCByZXNlcnZlZC4KKyAqCisgKiBAcGFyYW0gc2xvdF9wIGFkZHJlc3Mgb2YgYSBnbG9iYWwgdmFyaWFibGUgc3RvcmluZyB0aGUgc2xvdAorICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUgKG5vIG1lbW9yeSkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9hbGxvY2F0ZV9kYXRhX3Nsb3QgKGRidXNfaW50MzJfdCAqc2xvdF9wKQoreworICByZXR1cm4gX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9hbGxvYyAoJnNsb3RfYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9EQlVTX0xPQ0tfTkFNRSAobWVzc2FnZV9zbG90cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90X3ApOworfQorCisvKioKKyAqIERlYWxsb2NhdGVzIGEgZ2xvYmFsIElEIGZvciBtZXNzYWdlIGRhdGEgc2xvdHMuCisgKiBkYnVzX21lc3NhZ2VfZ2V0X2RhdGEoKSBhbmQgZGJ1c19tZXNzYWdlX3NldF9kYXRhKCkgbWF5IG5vCisgKiBsb25nZXIgYmUgdXNlZCB3aXRoIHRoaXMgc2xvdC4gIEV4aXN0aW5nIGRhdGEgc3RvcmVkIG9uIGV4aXN0aW5nCisgKiBEQnVzTWVzc2FnZSBvYmplY3RzIHdpbGwgYmUgZnJlZWQgd2hlbiB0aGUgbWVzc2FnZSBpcworICogZmluYWxpemVkLCBidXQgbWF5IG5vdCBiZSByZXRyaWV2ZWQgKGFuZCBtYXkgb25seSBiZSByZXBsYWNlZCBpZgorICogc29tZW9uZSBlbHNlIHJlYWxsb2NhdGVzIHRoZSBzbG90KS4gIFdoZW4gdGhlIHJlZmNvdW50IG9uIHRoZQorICogcGFzc2VkLWluIHNsb3QgcmVhY2hlcyAwLCBpdCBpcyBzZXQgdG8gLTEuCisgKgorICogQHBhcmFtIHNsb3RfcCBhZGRyZXNzIHN0b3JpbmcgdGhlIHNsb3QgdG8gZGVhbGxvY2F0ZQorICovCit2b2lkCitkYnVzX21lc3NhZ2VfZnJlZV9kYXRhX3Nsb3QgKGRidXNfaW50MzJfdCAqc2xvdF9wKQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoKnNsb3RfcCA+PSAwKTsKKworICBfZGJ1c19kYXRhX3Nsb3RfYWxsb2NhdG9yX2ZyZWUgKCZzbG90X2FsbG9jYXRvciwgc2xvdF9wKTsKK30KKworLyoqCisgKiBTdG9yZXMgYSBwb2ludGVyIG9uIGEgREJ1c01lc3NhZ2UsIGFsb25nCisgKiB3aXRoIGFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIGJlIHVzZWQgZm9yIGZyZWVpbmcKKyAqIHRoZSBkYXRhIHdoZW4gdGhlIGRhdGEgaXMgc2V0IGFnYWluLCBvciB3aGVuCisgKiB0aGUgbWVzc2FnZSBpcyBmaW5hbGl6ZWQuIFRoZSBzbG90IG51bWJlcgorICogbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIHdpdGggZGJ1c19tZXNzYWdlX2FsbG9jYXRlX2RhdGFfc2xvdCgpLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gc2xvdCB0aGUgc2xvdCBudW1iZXIKKyAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIHRvIHN0b3JlCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmMgZmluYWxpemVyIGZ1bmN0aW9uIGZvciB0aGUgZGF0YQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlcmUgd2FzIGVub3VnaCBtZW1vcnkgdG8gc3RvcmUgdGhlIGRhdGEKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9zZXRfZGF0YSAoREJ1c01lc3NhZ2UgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiBmcmVlX2RhdGFfZnVuYykKK3sKKyAgREJ1c0ZyZWVGdW5jdGlvbiBvbGRfZnJlZV9mdW5jOworICB2b2lkICpvbGRfZGF0YTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoc2xvdCA+PSAwLCBGQUxTRSk7CisKKyAgcmV0dmFsID0gX2RidXNfZGF0YV9zbG90X2xpc3Rfc2V0ICgmc2xvdF9hbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2UtPnNsb3RfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LCBkYXRhLCBmcmVlX2RhdGFfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2xkX2ZyZWVfZnVuYywgJm9sZF9kYXRhKTsKKworICBpZiAocmV0dmFsKQorICAgIHsKKyAgICAgIC8qIERvIHRoZSBhY3R1YWwgZnJlZSBvdXRzaWRlIHRoZSBtZXNzYWdlIGxvY2sgKi8KKyAgICAgIGlmIChvbGRfZnJlZV9mdW5jKQorICAgICAgICAoKiBvbGRfZnJlZV9mdW5jKSAob2xkX2RhdGEpOworICAgIH0KKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFJldHJpZXZlcyBkYXRhIHByZXZpb3VzbHkgc2V0IHdpdGggZGJ1c19tZXNzYWdlX3NldF9kYXRhKCkuCisgKiBUaGUgc2xvdCBtdXN0IHN0aWxsIGJlIGFsbG9jYXRlZCAobXVzdCBub3QgaGF2ZSBiZWVuIGZyZWVkKS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIHNsb3QgdGhlIHNsb3QgdG8gZ2V0IGRhdGEgZnJvbQorICogQHJldHVybnMgdGhlIGRhdGEsIG9yICNOVUxMIGlmIG5vdCBmb3VuZAorICovCit2b2lkKgorZGJ1c19tZXNzYWdlX2dldF9kYXRhIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICBzbG90KQoreworICB2b2lkICpyZXM7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIE5VTEwpOworCisgIHJlcyA9IF9kYnVzX2RhdGFfc2xvdF9saXN0X2dldCAoJnNsb3RfYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlLT5zbG90X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdCk7CisKKyAgcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGNvbnZlcnQgYSBtYWNoaW5lLXJlYWRhYmxlIChub3QgdHJhbnNsYXRlZCkKKyAqIHN0cmluZyBpbnRvIGEgRC1CdXMgbWVzc2FnZSB0eXBlLgorICoKKyAqIEBjb2RlCisgKiAgICJtZXRob2RfY2FsbCIgICAgLT4gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwKKyAqICAgIm1ldGhvZF9yZXR1cm4iICAtPiBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOCisgKiAgICJzaWduYWwiICAgICAgICAgLT4gREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMCisgKiAgICJlcnJvciIgICAgICAgICAgLT4gREJVU19NRVNTQUdFX1RZUEVfRVJST1IKKyAqICAgYW55dGhpbmcgZWxzZSAgICAtPiBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElECisgKiBAZW5kY29kZQorICoKKyAqLworaW50CitkYnVzX21lc3NhZ2VfdHlwZV9mcm9tX3N0cmluZyAoY29uc3QgY2hhciAqdHlwZV9zdHIpCit7CisgIGlmIChzdHJjbXAgKHR5cGVfc3RyLCAibWV0aG9kX2NhbGwiKSA9PSAwKQorICAgIHJldHVybiBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTDsKKyAgaWYgKHN0cmNtcCAodHlwZV9zdHIsICJtZXRob2RfcmV0dXJuIikgPT0gMCkKKyAgICByZXR1cm4gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTjsKKyAgZWxzZSBpZiAoc3RyY21wICh0eXBlX3N0ciwgInNpZ25hbCIpID09IDApCisgICAgcmV0dXJuIERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTDsKKyAgZWxzZSBpZiAoc3RyY21wICh0eXBlX3N0ciwgImVycm9yIikgPT0gMCkKKyAgICByZXR1cm4gREJVU19NRVNTQUdFX1RZUEVfRVJST1I7CisgIGVsc2UKKyAgICByZXR1cm4gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRDsKK30KKworLyoqCisgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGNvbnZlcnQgYSBELUJ1cyBtZXNzYWdlIHR5cGUgaW50byBhCisgKiBtYWNoaW5lLXJlYWRhYmxlIHN0cmluZyAobm90IHRyYW5zbGF0ZWQpLgorICoKKyAqIEBjb2RlCisgKiAgIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMICAgIC0+ICJtZXRob2RfY2FsbCIKKyAqICAgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTiAgLT4gIm1ldGhvZF9yZXR1cm4iCisgKiAgIERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCAgICAgICAgIC0+ICJzaWduYWwiCisgKiAgIERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SICAgICAgICAgIC0+ICJlcnJvciIKKyAqICAgREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCAgICAgICAgLT4gImludmFsaWQiCisgKiBAZW5kY29kZQorICoKKyAqLworY29uc3QgY2hhciAqCitkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGludCB0eXBlKQoreworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEw6CisgICAgICByZXR1cm4gIm1ldGhvZF9jYWxsIjsKKyAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk46CisgICAgICByZXR1cm4gIm1ldGhvZF9yZXR1cm4iOworICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMOgorICAgICAgcmV0dXJuICJzaWduYWwiOworICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfRVJST1I6CisgICAgICByZXR1cm4gImVycm9yIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9Cit9CisKKy8qKgorICogVHVybiBhIERCdXNNZXNzYWdlIGludG8gdGhlIG1hcnNoYWxsZWQgZm9ybSBhcyBkZXNjcmliZWQgaW4gdGhlIEQtQnVzCisgKiBzcGVjaWZpY2F0aW9uLgorICoKKyAqIEdlbmVyYWxseSwgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWZ1bCBmb3IgZW5jYXBzdWxhdGluZyBELUJ1cyBtZXNzYWdlcyBpbgorICogYSBkaWZmZXJlbnQgcHJvdG9jb2wuCisgKgorICogQHBhcmFtIG1zZyB0aGUgREJ1c01lc3NhZ2UKKyAqIEBwYXJhbSBtYXJzaGFsbGVkX2RhdGFfcCB0aGUgbG9jYXRpb24gdG8gc2F2ZSB0aGUgbWFyc2hhbGxlZCBmb3JtIHRvCisgKiBAcGFyYW0gbGVuX3AgdGhlIGxvY2F0aW9uIHRvIHNhdmUgdGhlIGxlbmd0aCBvZiB0aGUgbWFyc2hhbGxlZCBmb3JtIHRvCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfbWFyc2hhbCAoREJ1c01lc3NhZ2UgICptc2csCisgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgKiptYXJzaGFsbGVkX2RhdGFfcCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgKmxlbl9wKQoreworICBEQnVzU3RyaW5nIHRtcDsKKyAgZGJ1c19ib29sX3Qgd2FzX2xvY2tlZDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1zZyAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWFyc2hhbGxlZF9kYXRhX3AgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGxlbl9wICE9IE5VTEwsIEZBTFNFKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ0bXApKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBFbnN1cmUgdGhlIG1lc3NhZ2UgaXMgbG9ja2VkLCB0byBlbnN1cmUgdGhlIGxlbmd0aCBoZWFkZXIgaXMgZmlsbGVkIGluLiAqLworICB3YXNfbG9ja2VkID0gbXNnLT5sb2NrZWQ7CisKKyAgaWYgKCF3YXNfbG9ja2VkKQorICAgIGRidXNfbWVzc2FnZV9sb2NrIChtc2cpOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCYobXNnLT5oZWFkZXIuZGF0YSksIDAsICZ0bXAsIDApKQorICAgIGdvdG8gZmFpbDsKKworICAqbGVuX3AgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnRtcCk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJihtc2ctPmJvZHkpLCAwLCAmdG1wLCAqbGVuX3ApKQorICAgIGdvdG8gZmFpbDsKKworICAqbGVuX3AgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnRtcCk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJnRtcCwgbWFyc2hhbGxlZF9kYXRhX3ApKQorICAgIGdvdG8gZmFpbDsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRtcCk7CisKKyAgaWYgKCF3YXNfbG9ja2VkKQorICAgIG1zZy0+bG9ja2VkID0gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7CisKKyBmYWlsOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRtcCk7CisKKyAgaWYgKCF3YXNfbG9ja2VkKQorICAgIG1zZy0+bG9ja2VkID0gRkFMU0U7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIERlbWFyc2hhbCBhIEQtQnVzIG1lc3NhZ2UgZnJvbSB0aGUgZm9ybWF0IGRlc2NyaWJlZCBpbiB0aGUgRC1CdXMKKyAqIHNwZWNpZmljYXRpb24uCisgKgorICogR2VuZXJhbGx5LCB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZnVsIGZvciBlbmNhcHN1bGF0aW5nIEQtQnVzIG1lc3NhZ2VzIGluCisgKiBhIGRpZmZlcmVudCBwcm90b2NvbC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBtYXJzaGFsbGVkIERCdXNNZXNzYWdlCisgKiBAcGFyYW0gbGVuIHRoZSBsZW5ndGggb2Ygc3RyCisgKiBAcGFyYW0gZXJyb3IgdGhlIGxvY2F0aW9uIHRvIHNhdmUgZXJyb3JzIHRvCisgKiBAcmV0dXJucyAjTlVMTCBpZiB0aGVyZSB3YXMgYW4gZXJyb3IKKyAqLworREJ1c01lc3NhZ2UgKgorZGJ1c19tZXNzYWdlX2RlbWFyc2hhbCAoY29uc3QgY2hhciAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIERCdXNNZXNzYWdlTG9hZGVyICpsb2FkZXI7CisgIERCdXNTdHJpbmcgKmJ1ZmZlcjsKKyAgREJ1c01lc3NhZ2UgKm1zZzsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHN0ciAhPSBOVUxMLCBOVUxMKTsKKworICBsb2FkZXIgPSBfZGJ1c19tZXNzYWdlX2xvYWRlcl9uZXcgKCk7CisKKyAgaWYgKGxvYWRlciA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9idWZmZXIgKGxvYWRlciwgJmJ1ZmZlcik7CisgIF9kYnVzX3N0cmluZ19hcHBlbmRfbGVuIChidWZmZXIsIHN0ciwgbGVuKTsKKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX2J1ZmZlciAobG9hZGVyLCBidWZmZXIsIGxlbik7CisKKyAgaWYgKCFfZGJ1c19tZXNzYWdlX2xvYWRlcl9xdWV1ZV9tZXNzYWdlcyAobG9hZGVyKSkKKyAgICBnb3RvIGZhaWxfb29tOworCisgIGlmIChfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfaXNfY29ycnVwdGVkIChsb2FkZXIpKQorICAgIGdvdG8gZmFpbF9jb3JydXB0OworCisgIG1zZyA9IF9kYnVzX21lc3NhZ2VfbG9hZGVyX3BvcF9tZXNzYWdlIChsb2FkZXIpOworCisgIGlmICghbXNnKQorICAgIGdvdG8gZmFpbF9vb207CisKKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfdW5yZWYgKGxvYWRlcik7CisgIHJldHVybiBtc2c7CisKKyBmYWlsX2NvcnJ1cHQ6CisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsICJNZXNzYWdlIGlzIGNvcnJ1cHRlZCAoJXMpIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3ZhbGlkaXR5X3RvX2Vycm9yX21lc3NhZ2UgKGxvYWRlci0+Y29ycnVwdGlvbl9yZWFzb24pKTsKKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfdW5yZWYgKGxvYWRlcik7CisgIHJldHVybiBOVUxMOworCisgZmFpbF9vb206CisgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfdW5yZWYgKGxvYWRlcik7CisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBiZSBpbiB0aGUgYnVmZmVyIHRvIGRlbWFyc2hhbCBhCisgKiBELUJ1cyBtZXNzYWdlLgorICoKKyAqIEdlbmVyYWxseSwgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWZ1bCBmb3IgZW5jYXBzdWxhdGluZyBELUJ1cyBtZXNzYWdlcyBpbgorICogYSBkaWZmZXJlbnQgcHJvdG9jb2wuCisgKgorICogQHBhcmFtIHN0ciBkYXRhIHRvIGJlIG1hcnNoYWxsZWQKKyAqIEBwYXJhbSBsZW4gdGhlIGxlbmd0aCBvZiBzdHIKKyAqIEBwYXJhbSBlcnJvciB0aGUgbG9jYXRpb24gdG8gc2F2ZSBlcnJvcnMgdG8KKyAqIEByZXR1cm5zIC0xIGlmIHRoZXJlIHdhcyBubyB2YWxpZCBkYXRhIHRvIGJlIGRlbWFyc2hhbGxlZCwgMCBpZiB0aGVyZSB3YXNuJ3QgZW5vdWdoIGRhdGEgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIHNob3VsZCBiZSBkZW1hcnNoYWxsZWQuIE90aGVyd2lzZSByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgZGVtYXJzaGFsbGVkCisgKiAKKyAqLworaW50IAorZGJ1c19tZXNzYWdlX2RlbWFyc2hhbF9ieXRlc19uZWVkZWQoY29uc3QgY2hhciAqYnVmLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGxlbikKK3sKKyAgREJ1c1N0cmluZyBzdHI7CisgIGludCBieXRlX29yZGVyLCBmaWVsZHNfYXJyYXlfbGVuLCBoZWFkZXJfbGVuLCBib2R5X2xlbjsKKyAgREJ1c1ZhbGlkaXR5IHZhbGlkaXR5ID0gREJVU19WQUxJRDsKKyAgaW50IGhhdmVfbWVzc2FnZTsKKworICBpZiAoIWJ1ZiB8fCBsZW4gPCBEQlVTX01JTklNVU1fSEVBREVSX1NJWkUpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKGxlbiA+IERCVVNfTUFYSU1VTV9NRVNTQUdFX0xFTkdUSCkKKyAgICBsZW4gPSBEQlVTX01BWElNVU1fTUVTU0FHRV9MRU5HVEg7CisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbiAoJnN0ciwgYnVmLCBsZW4pOworICAKKyAgdmFsaWRpdHkgPSBEQlVTX1ZBTElEOworICBoYXZlX21lc3NhZ2UKKyAgICA9IF9kYnVzX2hlYWRlcl9oYXZlX21lc3NhZ2VfdW50cnVzdGVkKERCVVNfTUFYSU1VTV9NRVNTQUdFX0xFTkdUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWxpZGl0eSwgJmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRzX2FycmF5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWFkZXJfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvZHlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbik7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKworICBpZiAodmFsaWRpdHkgPT0gREJVU19WQUxJRCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKGhhdmVfbWVzc2FnZSB8fCAoaGVhZGVyX2xlbiArIGJvZHlfbGVuKSA+IGxlbik7CisgICAgICAodm9pZCkgaGF2ZV9tZXNzYWdlOyAvKiB1bnVzZWQgdW5sZXNzIGFzc2VydGluZyAqLworICAgICAgcmV0dXJuIGhlYWRlcl9sZW4gKyBib2R5X2xlbjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXR1cm4gLTE7IC8qIGJyb2tlbiEgKi8KKyAgICB9Cit9CisKKy8qKiBAfSAqLworCisvKiB0ZXN0cyBpbiBkYnVzLW1lc3NhZ2UtdXRpbC5jICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1tZXNzYWdlLmggYi9kYnVzL2RidXMvZGJ1cy1tZXNzYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUwMDQ5MgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLW1lc3NhZ2UuaApAQCAtMCwwICsxLDMwOSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1lc3NhZ2UuaCBEQnVzTWVzc2FnZSBvYmplY3QKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDUgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWYgIWRlZmluZWQgKERCVVNfSU5TSURFX0RCVVNfSCkgJiYgIWRlZmluZWQgKERCVVNfQ09NUElMQVRJT04pCisjZXJyb3IgIk9ubHkgPGRidXMvZGJ1cy5oPiBjYW4gYmUgaW5jbHVkZWQgZGlyZWN0bHksIHRoaXMgZmlsZSBtYXkgZGlzYXBwZWFyIG9yIGNoYW5nZSBjb250ZW50cy4iCisjZW5kaWYKKworI2lmbmRlZiBEQlVTX01FU1NBR0VfSAorI2RlZmluZSBEQlVTX01FU1NBR0VfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1hcmNoLWRlcHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVtb3J5Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c01lc3NhZ2UKKyAqIEB7CisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgREJ1c01lc3NhZ2UgREJ1c01lc3NhZ2U7CisvKiogT3BhcXVlIHR5cGUgcmVwcmVzZW50aW5nIGEgbWVzc2FnZSBpdGVyYXRvci4gQ2FuIGJlIGNvcGllZCBieSB2YWx1ZSwgYW5kIGNvbnRhaW5zIG5vIGFsbG9jYXRlZCBtZW1vcnkgc28gbmV2ZXIgbmVlZHMgdG8gYmUgZnJlZWQgYW5kIGNhbiBiZSBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrLiAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c01lc3NhZ2VJdGVyIERCdXNNZXNzYWdlSXRlcjsKKworLyoqCisgKiBEQnVzTWVzc2FnZUl0ZXIgc3RydWN0OyBjb250YWlucyBubyBwdWJsaWMgZmllbGRzLiAKKyAqLworc3RydWN0IERCdXNNZXNzYWdlSXRlcgoreyAKKyAgdm9pZCAqZHVtbXkxOyAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgdm9pZCAqZHVtbXkyOyAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgZGJ1c191aW50MzJfdCBkdW1teTM7IC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15NDsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15NTsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15NjsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15NzsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15ODsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15OTsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15MTA7ICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15MTE7ICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IHBhZDE7ICAgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IHBhZDI7ICAgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgdm9pZCAqcGFkMzsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KK307CisKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSogZGJ1c19tZXNzYWdlX25ldyAgICAgICAgICAgICAgIChpbnQgICAgICAgICAgbWVzc2FnZV90eXBlKTsKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSogZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAgIChjb25zdCBjaGFyICAqYnVzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICppbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqbWV0aG9kKTsKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSogZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChEQnVzTWVzc2FnZSAqbWV0aG9kX2NhbGwpOworREJVU19FWFBPUlQKK0RCdXNNZXNzYWdlKiBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAgICAgICAgKGNvbnN0IGNoYXIgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpuYW1lKTsKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSogZGJ1c19tZXNzYWdlX25ld19lcnJvciAgICAgICAgIChEQnVzTWVzc2FnZSAqcmVwbHlfdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqZXJyb3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICplcnJvcl9tZXNzYWdlKTsKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSogZGJ1c19tZXNzYWdlX25ld19lcnJvcl9wcmludGYgIChEQnVzTWVzc2FnZSAqcmVwbHlfdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqZXJyb3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICplcnJvcl9mb3JtYXQsCisJCQkJCSAgICAgLi4uKTsKKworREJVU19FWFBPUlQKK0RCdXNNZXNzYWdlKiBkYnVzX21lc3NhZ2VfY29weSAgICAgICAgICAgICAgKGNvbnN0IERCdXNNZXNzYWdlICptZXNzYWdlKTsKKworREJVU19FWFBPUlQKK0RCdXNNZXNzYWdlKiAgZGJ1c19tZXNzYWdlX3JlZiAgICAgICAgICAgICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmICAgICAgICAgICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UpOworREJVU19FWFBPUlQKK2ludCAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF90eXBlICAgICAgICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgZGJ1c19tZXNzYWdlX3NldF9wYXRoICAgICAgICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpvYmplY3RfcGF0aCk7CitEQlVTX0VYUE9SVAorY29uc3QgY2hhciogICBkYnVzX21lc3NhZ2VfZ2V0X3BhdGggICAgICAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICBkYnVzX21lc3NhZ2VfaGFzX3BhdGggICAgICAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpvYmplY3RfcGF0aCk7ICAKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIGRidXNfbWVzc2FnZV9zZXRfaW50ZXJmYWNlICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqaW50ZXJmYWNlKTsgICAgICAgCitEQlVTX0VYUE9SVAorY29uc3QgY2hhciogICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICBkYnVzX21lc3NhZ2VfaGFzX2ludGVyZmFjZSAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICppbnRlcmZhY2UpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgZGJ1c19tZXNzYWdlX3NldF9tZW1iZXIgICAgICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICptZW1iZXIpOworREJVU19FWFBPUlQKK2NvbnN0IGNoYXIqICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgICAgICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgZGJ1c19tZXNzYWdlX2hhc19tZW1iZXIgICAgICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqbWVtYmVyKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIGRidXNfbWVzc2FnZV9zZXRfZXJyb3JfbmFtZSAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqbmFtZSk7CitEQlVTX0VYUE9SVAorY29uc3QgY2hhciogICBkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICBkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKmRlc3RpbmF0aW9uKTsKK0RCVVNfRVhQT1JUCitjb25zdCBjaGFyKiAgIGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gIChEQnVzTWVzc2FnZSAgICptZXNzYWdlKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIGRidXNfbWVzc2FnZV9zZXRfc2VuZGVyICAgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqc2VuZGVyKTsKK0RCVVNfRVhQT1JUCitjb25zdCBjaGFyKiAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyICAgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlKTsKK0RCVVNfRVhQT1JUCitjb25zdCBjaGFyKiAgIGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgIGRidXNfbWVzc2FnZV9zZXRfbm9fcmVwbHkgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgbm9fcmVwbHkpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgZGJ1c19tZXNzYWdlX2dldF9ub19yZXBseSAgICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgZGJ1c19tZXNzYWdlX2lzX21ldGhvZF9jYWxsICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICppbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICptZXRob2QpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAgICAgICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICppbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpzaWduYWxfbmFtZSk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICBkYnVzX21lc3NhZ2VfaXNfZXJyb3IgICAgICAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKmVycm9yX25hbWUpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgZGJ1c19tZXNzYWdlX2hhc19kZXN0aW5hdGlvbiAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpidXNfbmFtZSk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICBkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAgICAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKnVuaXF1ZV9idXNfbmFtZSk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICBkYnVzX21lc3NhZ2VfaGFzX3NpZ25hdHVyZSAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKnNpZ25hdHVyZSk7CitEQlVTX0VYUE9SVAorZGJ1c191aW50MzJfdCBkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAgICAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSk7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICBkYnVzX21lc3NhZ2Vfc2V0X3NlcmlhbCAgICAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICBzZXJpYWwpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgZGJ1c19tZXNzYWdlX3NldF9yZXBseV9zZXJpYWwgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICByZXBseV9zZXJpYWwpOworREJVU19FWFBPUlQKK2RidXNfdWludDMyX3QgZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UpOworCitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICBkYnVzX21lc3NhZ2Vfc2V0X2F1dG9fc3RhcnQgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgIGF1dG9fc3RhcnQpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgZGJ1c19tZXNzYWdlX2dldF9hdXRvX3N0YXJ0ICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICBkYnVzX21lc3NhZ2VfZ2V0X3BhdGhfZGVjb21wb3NlZCAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICoqKnBhdGgpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzICAgICAgICAgIChEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisJCQkJCSAgICAgICBpbnQgICAgICAgICAgICAgIGZpcnN0X2FyZ190eXBlLAorCQkJCQkgICAgICAgLi4uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3NfdmFsaXN0ICAgKERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKwkJCQkJICAgICAgIGludCAgICAgICAgICAgICAgZmlyc3RfYXJnX3R5cGUsCisJCQkJCSAgICAgICB2YV9saXN0ICAgICAgICAgIHZhcl9hcmdzKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgICAgICAgICAgICAgKERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKwkJCQkJICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IsCisJCQkJCSAgICAgICBpbnQgICAgICAgICAgICAgIGZpcnN0X2FyZ190eXBlLAorCQkJCQkgICAgICAgLi4uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3NfdmFsaXN0ICAgICAgKERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKwkJCQkJICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IsCisJCQkJCSAgICAgICBpbnQgICAgICAgICAgICAgIGZpcnN0X2FyZ190eXBlLAorCQkJCQkgICAgICAgdmFfbGlzdCAgICAgICAgICB2YXJfYXJncyk7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX21lc3NhZ2VfY29udGFpbnNfdW5peF9mZHMgICAgKERCdXNNZXNzYWdlICptZXNzYWdlKTsKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfbWVzc2FnZV9pdGVyX2luaXQgICAgICAgICAgICAgKERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAqaXRlcik7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19tZXNzYWdlX2l0ZXJfaGFzX25leHQgICAgICAgICAoREJ1c01lc3NhZ2VJdGVyICppdGVyKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICAgICAgICAgICAgIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpOworREJVU19FWFBPUlQKK2NoYXIqICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9zaWduYXR1cmUgICAgKERCdXNNZXNzYWdlSXRlciAqaXRlcik7CitEQlVTX0VYUE9SVAoraW50ICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICAgICAoREJ1c01lc3NhZ2VJdGVyICppdGVyKTsKK0RCVVNfRVhQT1JUCitpbnQgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZWxlbWVudF90eXBlIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX3JlY3Vyc2UgICAgICAgICAgKERCdXNNZXNzYWdlSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAqc3ViKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgICAgICAgIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKnZhbHVlKTsKKyNpZm5kZWYgREJVU19ESVNBQkxFX0RFUFJFQ0FURUQKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgd2lyZSBwcm90b2NvbCBzaXplIG9mIHRoZSBhcnJheSBpbiBieXRlcywKKyAqIHlvdSBkbyBub3Qgd2FudCB0byBrbm93IHRoYXQgcHJvYmFibHkKKyAqLworREJVU19FWFBPUlQKK0RCVVNfREVQUkVDQVRFRCBpbnQgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJyYXlfbGVuICAgIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpOworI2VuZGlmCitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2ZpeGVkX2FycmF5ICAoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAqbl9lbGVtZW50cyk7CisKKworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kICAgICAgICAoREJ1c01lc3NhZ2UgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAgICAgICAoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICAqdmFsdWUpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9maXhlZF9hcnJheSAoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBuX2VsZW1lbnRzKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAgICAgKERCdXNNZXNzYWdlSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgKmNvbnRhaW5lZF9zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAqc3ViKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgICAgKERCdXNNZXNzYWdlSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICpzdWIpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICAoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKnN1Yik7CisKK0RCVVNfRVhQT1JUCit2b2lkIGRidXNfbWVzc2FnZV9sb2NrICAgIChEQnVzTWVzc2FnZSAgKm1lc3NhZ2UpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgIGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAgKERCdXNFcnJvciAgICAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICptZXNzYWdlKTsKKworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19tZXNzYWdlX2FsbG9jYXRlX2RhdGFfc2xvdCAoZGJ1c19pbnQzMl90ICAgICAqc2xvdF9wKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX21lc3NhZ2VfZnJlZV9kYXRhX3Nsb3QgICAgIChkYnVzX2ludDMyX3QgICAgICpzbG90X3ApOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfbWVzc2FnZV9zZXRfZGF0YSAgICAgICAgICAgKERCdXNNZXNzYWdlICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gIGZyZWVfZGF0YV9mdW5jKTsKK0RCVVNfRVhQT1JUCit2b2lkKiAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2RhdGEgICAgICAgICAgIChEQnVzTWVzc2FnZSAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICAgc2xvdCk7CisKK0RCVVNfRVhQT1JUCitpbnQgICAgICAgICBkYnVzX21lc3NhZ2VfdHlwZV9mcm9tX3N0cmluZyAoY29uc3QgY2hhciAqdHlwZV9zdHIpOworREJVU19FWFBPUlQKK2NvbnN0IGNoYXIqIGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAgIChpbnQgdHlwZSk7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgZGJ1c19tZXNzYWdlX21hcnNoYWwgICAoREJ1c01lc3NhZ2UgICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgKiptYXJzaGFsbGVkX2RhdGFfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgKmxlbl9wKTsKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSogZGJ1c19tZXNzYWdlX2RlbWFyc2hhbCAoY29uc3QgY2hhciAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcik7CisKK0RCVVNfRVhQT1JUCitpbnQgICAgICAgICAgZGJ1c19tZXNzYWdlX2RlbWFyc2hhbF9ieXRlc19uZWVkZWQgKGNvbnN0IGNoYXIgKnN0ciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pOworCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfTUVTU0FHRV9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1taXNjLmMgYi9kYnVzL2RidXMvZGJ1cy1taXNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE2MTAxMwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLW1pc2MuYwpAQCAtMCwwICsxLDI0OCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1pc2MuYyAgQSBmZXcgYXNzb3J0ZWQgcHVibGljIGZ1bmN0aW9ucyB0aGF0IGRvbid0IGZpdCBlbHNld2hlcmUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1taXNjLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzTWlzYyBNaXNjZWxsYW5lb3VzCisgKiBAaW5ncm91cCAgREJ1cworICogQGJyaWVmIE1pc2NlbGxhbmVvdXMgQVBJIHRoYXQgZG9lc24ndCBjbGVhbmx5IGZpdCBhbnl3aGVyZSBlbHNlCisgKgorICogQHsKKyAqLworCisvKioKKyAqIE9idGFpbnMgdGhlIG1hY2hpbmUgVVVJRCBvZiB0aGUgbWFjaGluZSB0aGlzIHByb2Nlc3MgaXMgcnVubmluZyBvbi4KKyAqCisgKiBUaGUgcmV0dXJuZWQgc3RyaW5nIG11c3QgYmUgZnJlZWQgd2l0aCBkYnVzX2ZyZWUoKS4KKyAqIAorICogVGhpcyBVVUlEIGlzIGd1YXJhbnRlZWQgdG8gcmVtYWluIHRoZSBzYW1lIHVudGlsIHRoZSBuZXh0IHJlYm9vdAorICogKHVubGVzcyB0aGUgc3lzYWRtaW4gZm9vbGlzaGx5IGNoYW5nZXMgaXQgYW5kIHNjcmV3cyB0aGVtc2VsdmVzKS4KKyAqIEl0IHdpbGwgdXN1YWxseSByZW1haW4gdGhlIHNhbWUgYWNyb3NzIHJlYm9vdHMgYWxzbywgYnV0IGhhcmR3YXJlCisgKiBjb25maWd1cmF0aW9uIGNoYW5nZXMgb3IgcmVidWlsZGluZyB0aGUgbWFjaGluZSBjb3VsZCBicmVhayB0aGF0LgorICoKKyAqIFRoZSBpZGVhIGlzIHRoYXQgdHdvIHByb2Nlc3NlcyB3aXRoIHRoZSBzYW1lIG1hY2hpbmUgSUQgc2hvdWxkIGJlCisgKiBhYmxlIHRvIHVzZSBzaGFyZWQgbWVtb3J5LCBVTklYIGRvbWFpbiBzb2NrZXRzLCBwcm9jZXNzIElEcywgYW5kIG90aGVyCisgKiBmZWF0dXJlcyBvZiB0aGUgT1MgdGhhdCByZXF1aXJlIGJvdGggcHJvY2Vzc2VzIHRvIGJlIHJ1bm5pbmcKKyAqIG9uIHRoZSBzYW1lIE9TIGtlcm5lbCBpbnN0YW5jZS4KKyAqCisgKiBUaGUgbWFjaGluZSBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGNyZWF0ZSB1bmlxdWUgcGVyLW1hY2hpbmUKKyAqIGluc3RhbmNlcy4gRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCB1c2UgaXQgaW4gYnVzIG5hbWVzIG9yCisgKiBYIHNlbGVjdGlvbiBuYW1lcy4KKyAqCisgKiBUaGUgbWFjaGluZSBJRCBpcyBwcmVmZXJyZWQgb3ZlciB0aGUgbWFjaGluZSBob3N0bmFtZSwgYmVjYXVzZQorICogdGhlIGhvc3RuYW1lIGlzIGZyZXF1ZW50bHkgc2V0IHRvICJsb2NhbGhvc3QubG9jYWxkb21haW4iIGFuZAorICogbWF5IGFsc28gY2hhbmdlIGF0IHJ1bnRpbWUuCisgKgorICogWW91IGNhbiBnZXQgdGhlIG1hY2hpbmUgSUQgb2YgYSByZW1vdGUgYXBwbGljYXRpb24gYnkgaW52b2tpbmcgdGhlCisgKiBtZXRob2QgR2V0TWFjaGluZUlkIGZyb20gaW50ZXJmYWNlIG9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIuCisgKgorICogSWYgdGhlIHJlbW90ZSBhcHBsaWNhdGlvbiBoYXMgdGhlIHNhbWUgbWFjaGluZSBJRCBhcyB0aGUgb25lCisgKiByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uLCB0aGVuIHRoZSByZW1vdGUgYXBwbGljYXRpb24gaXMgb24gdGhlCisgKiBzYW1lIG1hY2hpbmUgYXMgeW91ciBhcHBsaWNhdGlvbi4KKyAqCisgKiBUaGUgVVVJRCBpcyBub3QgYSBVVUlEIGluIHRoZSBzZW5zZSBvZiBSRkM0MTIyOyB0aGUgZGV0YWlscworICogYXJlIGV4cGxhaW5lZCBpbiB0aGUgRC1CdXMgc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBAcmV0dXJucyBhIDMyLWJ5dGUtbG9uZyBoZXgtZW5jb2RlZCBVVUlEIHN0cmluZywgb3IgI05VTEwgaWYgaW5zdWZmaWNpZW50IG1lbW9yeQorICovCitjaGFyKgorZGJ1c19nZXRfbG9jYWxfbWFjaGluZV9pZCAodm9pZCkKK3sKKyAgREJ1c1N0cmluZyB1dWlkOworICBjaGFyICpzOworCisgIHMgPSBOVUxMOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ1dWlkKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIV9kYnVzX2dldF9sb2NhbF9tYWNoaW5lX3V1aWRfZW5jb2RlZCAoJnV1aWQpIHx8CisgICAgICAhX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgKCZ1dWlkLCAmcykpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ1dWlkKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdXVpZCk7CisgICAgICByZXR1cm4gczsKKyAgICB9CisKK30KKworLyoqCisgKiBAZGVmIERCVVNfTUFKT1JfVkVSU0lPTgorICoKKyAqIFRoZSBDT01QSUxFIFRJTUUgbWFqb3IgdmVyc2lvbiBvZiBsaWJkYnVzLCB0aGF0IGlzLCB0aGUgIlgiIGluICJYLlkuWiIsCisgKiBhcyBhbiBpbnRlZ2VyIGxpdGVyYWwuIENvbnNpZGVyIGNhcmVmdWxseSB3aGV0aGVyIHRvIHVzZSB0aGlzIG9yIHRoZQorICogcnVudGltZSB2ZXJzaW9uIGZyb20gZGJ1c19nZXRfdmVyc2lvbigpLgorICovCisKKy8qKgorICogQGRlZiBEQlVTX01JTk9SX1ZFUlNJT04KKyAqCisgKiBUaGUgQ09NUElMRSBUSU1FIG1pbm9yIHZlcnNpb24gb2YgbGliZGJ1cywgdGhhdCBpcywgdGhlICJZIiBpbiAiWC5ZLloiLAorICogYXMgYW4gaW50ZWdlciBsaXRlcmFsLiBDb25zaWRlciBjYXJlZnVsbHkgd2hldGhlciB0byB1c2UgdGhpcyBvciB0aGUKKyAqIHJ1bnRpbWUgdmVyc2lvbiBmcm9tIGRidXNfZ2V0X3ZlcnNpb24oKS4KKyAqLworCisvKioKKyAqIEBkZWYgREJVU19NSUNST19WRVJTSU9OCisgKgorICogVGhlIENPTVBJTEUgVElNRSBtaWNybyB2ZXJzaW9uIG9mIGxpYmRidXMsIHRoYXQgaXMsIHRoZSAiWiIgaW4gIlguWS5aIiwKKyAqIGFzIGFuIGludGVnZXIgbGl0ZXJhbC4gQ29uc2lkZXIgY2FyZWZ1bGx5IHdoZXRoZXIgdG8gdXNlIHRoaXMgb3IgdGhlCisgKiBydW50aW1lIHZlcnNpb24gZnJvbSBkYnVzX2dldF92ZXJzaW9uKCkuCisgKi8KKworLyoqCisgKiBAZGVmIERCVVNfVkVSU0lPTgorICoKKyAqIFRoZSBDT01QSUxFIFRJTUUgdmVyc2lvbiBvZiBsaWJkYnVzLCBhcyBhIHNpbmdsZSBpbnRlZ2VyIHRoYXQgaGFzIDAgaW4gdGhlIG1vc3QKKyAqIHNpZ25pZmljYW50IGJ5dGUsIHRoZSBtYWpvciB2ZXJzaW9uIGluIHRoZSBuZXh0IG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSwKKyAqIHRoZSBtaW5vciB2ZXJzaW9uIGluIHRoZSB0aGlyZCBtb3N0IHNpZ25pZmljYW50LCBhbmQgdGhlIG1pY3JvIHZlcnNpb24gaW4gdGhlCisgKiBsZWFzdCBzaWduaWZpY2FudCBieXRlLiBUaGlzIG1lYW5zIHR3byBEQlVTX1ZFUlNJT04gY2FuIGJlIGNvbXBhcmVkIHRvIHNlZQorICogd2hpY2ggaXMgaGlnaGVyLgorICoKKyAqIENvbnNpZGVyIGNhcmVmdWxseSB3aGV0aGVyIHRvIHVzZSB0aGlzIG9yIHRoZSBydW50aW1lIHZlcnNpb24gZnJvbQorICogZGJ1c19nZXRfdmVyc2lvbigpLgorICovCisKKy8qKgorICogQGRlZiBEQlVTX1ZFUlNJT05fU1RSSU5HCisgKgorICogVGhlIENPTVBJTEUgVElNRSB2ZXJzaW9uIG9mIGxpYmRidXMsIGFzIGEgc3RyaW5nICJYLlkuWiIuCisgKgorICogQ29uc2lkZXIgY2FyZWZ1bGx5IHdoZXRoZXIgdG8gdXNlIHRoaXMgb3IgdGhlIHJ1bnRpbWUgdmVyc2lvbiBmcm9tCisgKiBkYnVzX2dldF92ZXJzaW9uKCkuCisgKi8KKworLyoqCisgKiBHZXRzIHRoZSBEWU5BTUlDQUxMWSBMSU5LRUQgdmVyc2lvbiBvZiBsaWJkYnVzLiBBbHRlcm5hdGl2ZWx5LCB0aGVyZQorICogYXJlIG1hY3JvcyAjREJVU19NQUpPUl9WRVJTSU9OLCAjREJVU19NSU5PUl9WRVJTSU9OLCAjREJVU19NSUNST19WRVJTSU9OLAorICogYW5kICNEQlVTX1ZFUlNJT04gd2hpY2ggYWxsb3cgeW91IHRvIHRlc3QgdGhlIFZFUlNJT04gWU9VIEFSRSBDT01QSUxFRCBBR0FJTlNULgorICogSW4gb3RoZXIgd29yZHMsIHlvdSBjYW4gZ2V0IGVpdGhlciB0aGUgcnVudGltZSBvciB0aGUgY29tcGlsZS10aW1lIHZlcnNpb24uCisgKiBUaGluayBjYXJlZnVsbHkgYWJvdXQgd2hpY2ggb2YgdGhlc2UgeW91IHdhbnQgaW4gYSBnaXZlbiBjYXNlLgorICoKKyAqIFRoZSBsaWJkYnVzIGZ1bGwgdmVyc2lvbiBudW1iZXIgaXMgIk1BSk9SLk1JTk9SLk1JQ1JPIiB3aGVyZSB0aGUKKyAqIE1JTk9SIGNoYW5nZXMgaWYgQVBJIGlzIGFkZGVkLCBhbmQgdGhlIE1JQ1JPIGNoYW5nZXMgd2l0aCBlYWNoCisgKiByZWxlYXNlIG9mIGEgTUFKT1IuTUlOT1Igc2VyaWVzLiAgVGhlIE1JTk9SIGlzIGFuIG9kZCBudW1iZXIgZm9yCisgKiBkZXZlbG9wbWVudCByZWxlYXNlcyBhbmQgYW4gZXZlbiBudW1iZXIgZm9yIHN0YWJsZSByZWxlYXNlcy4KKyAqIAorICogQHBhcmFtIG1ham9yX3ZlcnNpb25fcCBwb2ludGVyIHRvIHJldHVybiB0aGUgbWFqb3IgdmVyc2lvbiwgb3IgI05VTEwKKyAqIEBwYXJhbSBtaW5vcl92ZXJzaW9uX3AgcG9pbnRlciB0byByZXR1cm4gdGhlIG1pbm9yIHZlcnNpb24sIG9yICNOVUxMCisgKiBAcGFyYW0gbWljcm9fdmVyc2lvbl9wIHBvaW50ZXIgdG8gcmV0dXJuIHRoZSBtaWNybyB2ZXJzaW9uLCBvciAjTlVMTCAKKyAqIAorICovCit2b2lkCitkYnVzX2dldF92ZXJzaW9uIChpbnQgKm1ham9yX3ZlcnNpb25fcCwKKyAgICAgICAgICAgICAgICAgIGludCAqbWlub3JfdmVyc2lvbl9wLAorICAgICAgICAgICAgICAgICAgaW50ICptaWNyb192ZXJzaW9uX3ApCit7CisgIGlmIChtYWpvcl92ZXJzaW9uX3ApCisgICAgKm1ham9yX3ZlcnNpb25fcCA9IERCVVNfTUFKT1JfVkVSU0lPTjsKKyAgaWYgKG1pbm9yX3ZlcnNpb25fcCkKKyAgICAqbWlub3JfdmVyc2lvbl9wID0gREJVU19NSU5PUl9WRVJTSU9OOworICBpZiAobWljcm9fdmVyc2lvbl9wKQorICAgICptaWNyb192ZXJzaW9uX3AgPSBEQlVTX01JQ1JPX1ZFUlNJT047Cit9CisKKworLyoqIEB9ICovIC8qIEVuZCBvZiBwdWJsaWMgQVBJICovCisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisKKyNpZm5kZWYgRE9YWUdFTl9TSE9VTERfU0tJUF9USElTCisKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworCitkYnVzX2Jvb2xfdAorX2RidXNfbWlzY190ZXN0ICh2b2lkKQoreworICBpbnQgbWFqb3IsIG1pbm9yLCBtaWNybzsKKyAgREJ1c1N0cmluZyBzdHI7CisKKyAgLyogbWFrZSBzdXJlIHdlIGRvbid0IGNyYXNoIG9uIE5VTEwgKi8KKyAgZGJ1c19nZXRfdmVyc2lvbiAoTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgLyogTm93IHZlcmlmeSB0aGF0IGFsbCB0aGUgY29tcGlsZS10aW1lIHZlcnNpb24gc3R1ZmYKKyAgICogaXMgcmlnaHQgYW5kIG1hdGNoZXMgdGhlIHJ1bnRpbWUuIFRoZXNlIHRlc3RzCisgICAqIGFyZSBtb3N0bHkgaW50ZW5kZWQgdG8gY2F0Y2ggdmFyaW91cyBraW5kcyBvZgorICAgKiB0eXBvIChtaXhpbmcgdXAgbWFqb3IgYW5kIG1pbm9yLCB0aGF0IHNvcnQgb2YgdGhpbmcpLgorICAgKi8KKyAgZGJ1c19nZXRfdmVyc2lvbiAoJm1ham9yLCAmbWlub3IsICZtaWNybyk7CisKKyAgX2RidXNfYXNzZXJ0IChtYWpvciA9PSBEQlVTX01BSk9SX1ZFUlNJT04pOworICBfZGJ1c19hc3NlcnQgKG1pbm9yID09IERCVVNfTUlOT1JfVkVSU0lPTik7CisgIF9kYnVzX2Fzc2VydCAobWljcm8gPT0gREJVU19NSUNST19WRVJTSU9OKTsKKworI2RlZmluZSBNQUtFX1ZFUlNJT04oeCwgeSwgeikgKCgoeCkgPDwgMTYpIHwgKCh5KSA8PCA4KSB8ICh6KSkKKworICAvKiBjaGVjayB0aGF0IE1BS0VfVkVSU0lPTiB3b3JrcyBhbmQgcHJvZHVjZXMgdGhlIGludGVuZGVkIG9yZGVyaW5nICovCisgIF9kYnVzX2Fzc2VydCAoTUFLRV9WRVJTSU9OICgxLCAwLCAwKSA+IE1BS0VfVkVSU0lPTiAoMCwgMCwgMCkpOworICBfZGJ1c19hc3NlcnQgKE1BS0VfVkVSU0lPTiAoMSwgMSwgMCkgPiBNQUtFX1ZFUlNJT04gKDEsIDAsIDApKTsKKyAgX2RidXNfYXNzZXJ0IChNQUtFX1ZFUlNJT04gKDEsIDEsIDEpID4gTUFLRV9WRVJTSU9OICgxLCAxLCAwKSk7CisKKyAgX2RidXNfYXNzZXJ0IChNQUtFX1ZFUlNJT04gKDIsIDAsIDApID4gTUFLRV9WRVJTSU9OICgxLCAxLCAxKSk7CisgIF9kYnVzX2Fzc2VydCAoTUFLRV9WRVJTSU9OICgyLCAxLCAwKSA+IE1BS0VfVkVSU0lPTiAoMSwgMSwgMSkpOworICBfZGJ1c19hc3NlcnQgKE1BS0VfVkVSU0lPTiAoMiwgMSwgMSkgPiBNQUtFX1ZFUlNJT04gKDEsIDEsIDEpKTsKKworICAvKiBjaGVjayBEQlVTX1ZFUlNJT04gKi8KKyAgX2RidXNfYXNzZXJ0IChNQUtFX1ZFUlNJT04gKG1ham9yLCBtaW5vciwgbWljcm8pID09IERCVVNfVkVSU0lPTik7CisKKyAgLyogY2hlY2sgdGhhdCBvcmRlcmluZyB3b3JrcyB3aXRoIERCVVNfVkVSU0lPTiAqLworICBfZGJ1c19hc3NlcnQgKE1BS0VfVkVSU0lPTiAobWFqb3IgLSAxLCBtaW5vciwgbWljcm8pIDwgREJVU19WRVJTSU9OKTsKKyAgX2RidXNfYXNzZXJ0IChNQUtFX1ZFUlNJT04gKG1ham9yLCBtaW5vciAtIDEsIG1pY3JvKSA8IERCVVNfVkVSU0lPTik7CisgIF9kYnVzX2Fzc2VydCAoTUFLRV9WRVJTSU9OIChtYWpvciwgbWlub3IsIG1pY3JvIC0gMSkgPCBEQlVTX1ZFUlNJT04pOworICAKKyAgX2RidXNfYXNzZXJ0IChNQUtFX1ZFUlNJT04gKG1ham9yICsgMSwgbWlub3IsIG1pY3JvKSA+IERCVVNfVkVSU0lPTik7CisgIF9kYnVzX2Fzc2VydCAoTUFLRV9WRVJTSU9OIChtYWpvciwgbWlub3IgKyAxLCBtaWNybykgPiBEQlVTX1ZFUlNJT04pOworICBfZGJ1c19hc3NlcnQgKE1BS0VfVkVSU0lPTiAobWFqb3IsIG1pbm9yLCBtaWNybyArIDEpID4gREJVU19WRVJTSU9OKTsKKworICAvKiBDaGVjayBEQlVTX1ZFUlNJT05fU1RSSU5HICovCisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgaWYgKCEoX2RidXNfc3RyaW5nX2FwcGVuZF9pbnQgKCZzdHIsIG1ham9yKSAmJgorICAgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZzdHIsICcuJykgJiYKKyAgICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZF9pbnQgKCZzdHIsIG1pbm9yKSAmJgorICAgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZzdHIsICcuJykgJiYKKyAgICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZF9pbnQgKCZzdHIsIG1pY3JvKSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZzdHIsIERCVVNfVkVSU0lPTl9TVFJJTkcpKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiAhRE9YWUdFTl9TSE9VTERfU0tJUF9USElTICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtbWlzYy5oIGIvZGJ1cy9kYnVzL2RidXMtbWlzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MDRiY2EKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1taXNjLmgKQEAgLTAsMCArMSw1MiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1pc2MuaCAgQSBmZXcgYXNzb3J0ZWQgcHVibGljIGZ1bmN0aW9ucyB0aGF0IGRvbid0IGZpdCBlbHNld2hlcmUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmICFkZWZpbmVkIChEQlVTX0lOU0lERV9EQlVTX0gpICYmICFkZWZpbmVkIChEQlVTX0NPTVBJTEFUSU9OKQorI2Vycm9yICJPbmx5IDxkYnVzL2RidXMuaD4gY2FuIGJlIGluY2x1ZGVkIGRpcmVjdGx5LCB0aGlzIGZpbGUgbWF5IGRpc2FwcGVhciBvciBjaGFuZ2UgY29udGVudHMuIgorI2VuZGlmCisKKyNpZm5kZWYgREJVU19NSVNDX0gKKyNkZWZpbmUgREJVU19NSVNDX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKworREJVU19CRUdJTl9ERUNMUworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNNaXNjCisgKiBAeworICovCitEQlVTX0VYUE9SVAorY2hhciogICAgICAgZGJ1c19nZXRfbG9jYWxfbWFjaGluZV9pZCAgKHZvaWQpOworCitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19nZXRfdmVyc2lvbiAgICAgICAgICAgKGludCAqbWFqb3JfdmVyc2lvbl9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbWlub3JfdmVyc2lvbl9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbWljcm9fdmVyc2lvbl9wKTsKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX01JU0NfSCAqLworCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1ub25jZS5jIGIvZGJ1cy9kYnVzL2RidXMtbm9uY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzRjMmRkCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtbm9uY2UuYwpAQCAtMCwwICsxLDQyNiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW5vbmNlLmMgIE5vbmNlIGhhbmRsaW5nIGZ1bmN0aW9ucyB1c2VkIGJ5IG5vbmNlLXRjcCAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEtsYXJhbHZkYWxlbnMgRGF0YWtvbnN1bHQgQUIsIGEgS0RBQiBHcm91cCBjb21wYW55LCBpbmZvQGtkYWIubmV0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorLy8gbWFqb3Igc2VjdGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBtb2RpZmllZCBjb2RlIGZyb20gbGliYXNzdWFuLCAoQykgRlNGCisjaW5jbHVkZSAiZGJ1cy1ub25jZS5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIGRidXNfYm9vbF90Citkb19jaGVja19ub25jZSAoaW50IGZkLCBjb25zdCBEQnVzU3RyaW5nICpub25jZSwgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBidWZmZXI7CisgIERCdXNTdHJpbmcgcDsKKyAgc2l6ZV90IG5sZWZ0OworICBkYnVzX2Jvb2xfdCByZXN1bHQ7CisgIGludCBuOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIG5sZWZ0ID0gMTY7CisKKyAgaWYgKCAgICFfZGJ1c19zdHJpbmdfaW5pdCAoJmJ1ZmZlcikKKyAgICAgIHx8ICFfZGJ1c19zdHJpbmdfaW5pdCAoJnApICkgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwKTsKKyAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZidWZmZXIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisKKyAgd2hpbGUgKG5sZWZ0KQorICAgIHsKKyAgICAgIG4gPSBfZGJ1c19yZWFkX3NvY2tldCAoZmQsICZwLCBubGVmdCk7CisgICAgICBpZiAobiA9PSAtMSAmJiBfZGJ1c19nZXRfaXNfZXJybm9fZWludHIoKSkKKyAgICAgICAgOworICAgICAgZWxzZSBpZiAobiA9PSAtMSAmJiBfZGJ1c19nZXRfaXNfZXJybm9fZWFnYWluX29yX2V3b3VsZGJsb2NrKCkpCisgICAgICAgIF9kYnVzX3NsZWVwX21pbGxpc2Vjb25kcyAoMTAwKTsKKyAgICAgIGVsc2UgaWYgKG49PS0xKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lPX0VSUk9SLCAiQ291bGQgbm90IHJlYWQgbm9uY2UgZnJvbSBzb2NrZXQgKGZkPSVkKSIsIGZkICk7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmJ1ZmZlcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghbikKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcCk7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZidWZmZXIpOworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JT19FUlJPUiwgIkNvdWxkIG5vdCByZWFkIG5vbmNlIGZyb20gc29ja2V0IChmZD0lZCkiLCBmZCApOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZF9sZW4oJmJ1ZmZlciwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmcCksIG4pOworICAgICAgICAgIG5sZWZ0IC09IG47CisgICAgICAgIH0KKyAgICB9CisKKyAgcmVzdWx0ID0gIF9kYnVzX3N0cmluZ19lcXVhbF9sZW4gKCZidWZmZXIsIG5vbmNlLCAxNik7CisgIGlmICghcmVzdWx0KQorICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVELCAiTm9uY2VzIGRvIG5vdCBtYXRjaCwgYWNjZXNzIGRlbmllZCAoZmQ9JWQpIiwgZmQgKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnApOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmJ1ZmZlcik7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiByZWFkcyB0aGUgbm9uY2UgZnJvbSB0aGUgbm9uY2UgZmlsZSBhbmQgc3RvcmVzIGl0IGluIGEgc3RyaW5nCisgKgorICogQHBhcmFtIGZuYW1lIHRoZSBmaWxlIHRvIHJlYWQgdGhlIG5vbmNlIGZyb20KKyAqIEBwYXJhbSBub25jZSByZXR1cm5zIHRoZSBub25jZS4gTXVzdCBiZSBhbiBpbml0aWFsaXplZCBzdHJpbmcsIHRoZSBub25jZSB3aWxsIGJlIGFwcGVuZGVkLgorICogQHBhcmFtIGVycm9yIGVycm9yIG9iamVjdCB0byByZXBvcnQgcG9zc2libGUgZXJyb3JzCisgKiBAcmV0dXJuIEZBTFNFIGlmZiByZWFkaW5nIHRoZSBub25jZSBmYWlscyAoZXJyb3IgaXMgc2V0IHRoZW4pCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19yZWFkX25vbmNlIChjb25zdCBEQnVzU3RyaW5nICpmbmFtZSwgREJ1c1N0cmluZyAqbm9uY2UsIERCdXNFcnJvciogZXJyb3IpCit7CisgIEZJTEUgKmZwOworICBjaGFyIGJ1ZmZlclsxN107CisgIHNpemVfdCBucmVhZDsKKworICBidWZmZXJbc2l6ZW9mIGJ1ZmZlciAtIDFdID0gJ1wwJzsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBfZGJ1c192ZXJib3NlICgicmVhZGluZyBub25jZSBmcm9tIGZpbGU6ICVzXG4iLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZuYW1lKSk7CisKKworICBmcCA9IGZvcGVuIChfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZuYW1lKSwgInJiIik7CisgIGlmICghZnApCisgICAgcmV0dXJuIEZBTFNFOworICBucmVhZCA9IGZyZWFkIChidWZmZXIsIDEsIHNpemVvZiBidWZmZXIgLSAxLCBmcCk7CisgIGZjbG9zZSAoZnApOworICBpZiAoIW5yZWFkKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GSUxFX05PVF9GT1VORCwgIkNvdWxkIG5vdCByZWFkIG5vbmNlIGZyb20gZmlsZSAlcyIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZm5hbWUpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2xlbiAobm9uY2UsIGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciAtIDEgKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQKK19kYnVzX2FjY2VwdF93aXRoX25vbmNlZmlsZSAoaW50IGxpc3Rlbl9mZCwgY29uc3QgREJ1c05vbmNlRmlsZSAqbm9uY2VmaWxlKQoreworICBpbnQgZmQ7CisgIERCdXNTdHJpbmcgbm9uY2U7CisKKyAgX2RidXNfYXNzZXJ0IChub25jZWZpbGUgIT0gTlVMTCk7CisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZub25jZSkpCisgICAgcmV0dXJuIC0xOworICAvL1BFTkRJTkcoa2RhYik6IHNldCBiZXR0ZXIgZXJyb3JzCisgIGlmIChfZGJ1c19yZWFkX25vbmNlIChfZGJ1c19ub25jZWZpbGVfZ2V0X3BhdGgobm9uY2VmaWxlKSwgJm5vbmNlLCBOVUxMKSAhPSBUUlVFKQorICAgIHJldHVybiAtMTsKKyAgZmQgPSBfZGJ1c19hY2NlcHQgKGxpc3Rlbl9mZCk7CisgIGlmIChfZGJ1c19zb2NrZXRfaXNfaW52YWxpZCAoZmQpKQorICAgIHJldHVybiBmZDsKKyAgaWYgKGRvX2NoZWNrX25vbmNlKGZkLCAmbm9uY2UsIE5VTEwpICE9IFRSVUUpIHsKKyAgICBfZGJ1c192ZXJib3NlICgibm9uY2UgY2hlY2sgZmFpbGVkLiBDbG9zaW5nIHNvY2tldC5cbiIpOworICAgIF9kYnVzX2Nsb3NlX3NvY2tldChmZCwgTlVMTCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0dXJuIGZkOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2dlbmVyYXRlX2FuZF93cml0ZV9ub25jZSAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsIERCdXNFcnJvciAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgbm9uY2U7CisgIGRidXNfYm9vbF90IHJldDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmbm9uY2UpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX2dlbmVyYXRlX3JhbmRvbV9ieXRlcyAoJm5vbmNlLCAxNikpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJm5vbmNlKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0ID0gX2RidXNfc3RyaW5nX3NhdmVfdG9fZmlsZSAoJm5vbmNlLCBmaWxlbmFtZSwgRkFMU0UsIGVycm9yKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJm5vbmNlKTsKKworICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIHNlbmRzIHRoZSBub25jZSBvdmVyIGEgZ2l2ZW4gc29ja2V0LiBCbG9ja3Mgd2hpbGUgZG9pbmcgc28uCisgKgorICogQHBhcmFtIGZkIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gd3JpdGUgdGhlIG5vbmNlIGRhdGEgdG8gKHVzdWFsbHkgYSBzb2NrZXQpCisgKiBAcGFyYW0gbm9uY2VmaWxlIHRoZSBub25jZWZpbGUgbG9jYXRpb24gdG8gcmVhZCB0aGUgbm9uY2UgZnJvbQorICogQHBhcmFtIGVycm9yIGNvbnRhaW5zIGVycm9yIGRldGFpbHMgaWYgRkFMU0UgaXMgcmV0dXJuZWQKKyAqIEByZXR1cm4gVFJVRSBpZmYgdGhlIG5vbmNlIHdhcyBzdWNjZXNzZnVsbHkgc2VudC4gTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QKKyAqIGluZGljYXRlIHdoZXRoZXIgdGhlIHNlcnZlciBhY2NlcHRlZCB0aGUgbm9uY2UuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zZW5kX25vbmNlIChpbnQgZmQsIGNvbnN0IERCdXNTdHJpbmcgKm5vbmNlZmlsZSwgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgZGJ1c19ib29sX3QgcmVhZF9yZXN1bHQ7CisgIGludCBzZW5kX3Jlc3VsdDsKKyAgREJ1c1N0cmluZyBub25jZTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKG5vbmNlZmlsZSkgPT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJm5vbmNlKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmVhZF9yZXN1bHQgPSBfZGJ1c19yZWFkX25vbmNlIChub25jZWZpbGUsICZub25jZSwgZXJyb3IpOworICBpZiAoIXJlYWRfcmVzdWx0KQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbm9uY2UpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgc2VuZF9yZXN1bHQgPSBfZGJ1c193cml0ZV9zb2NrZXQgKGZkLCAmbm9uY2UsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbm9uY2UpKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJm5vbmNlKTsKKworICBpZiAoc2VuZF9yZXN1bHQgPT0gLTEpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Vycm9yX2Zyb21fc3lzdGVtX2Vycm5vICgpLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2VuZCBub25jZSAoZmQ9JWQpOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgZmQsIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKCkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citkb19ub25jZWZpbGVfY3JlYXRlIChEQnVzTm9uY2VGaWxlICpub25jZWZpbGUsCisgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgdXNlX3N1YmRpcikKK3sKKyAgICBEQnVzU3RyaW5nIHJhbmRvbVN0cjsKKworICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgICAgX2RidXNfYXNzZXJ0IChub25jZWZpbGUpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnJhbmRvbVN0cikpCisgICAgICB7CisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICBnb3RvIG9uX2Vycm9yOworICAgICAgfQorCisgICAgaWYgKCFfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYXNjaWkgKCZyYW5kb21TdHIsIDgpKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgZ290byBvbl9lcnJvcjsKKyAgICAgIH0KKworICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZub25jZWZpbGUtPmRpcikKKyAgICAgICAgfHwgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZub25jZWZpbGUtPmRpciwgX2RidXNfZ2V0X3RtcGRpcigpKSkKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgIGdvdG8gb25fZXJyb3I7CisgICAgICB9CisgICAgaWYgKHVzZV9zdWJkaXIpCisgICAgICB7CisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJm5vbmNlZmlsZS0+ZGlyLCAiL2RidXNfbm9uY2UtIikKKyAgICAgICAgICAgIHx8ICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmbm9uY2VmaWxlLT5kaXIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnJhbmRvbVN0cikpICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICAgIGdvdG8gb25fZXJyb3I7CisgICAgICAgICAgfQorICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmbm9uY2VmaWxlLT5wYXRoKQorICAgICAgICAgICAgfHwgIV9kYnVzX3N0cmluZ19jb3B5ICgmbm9uY2VmaWxlLT5kaXIsIDAsICZub25jZWZpbGUtPnBhdGgsIDApCisgICAgICAgICAgICB8fCAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJm5vbmNlZmlsZS0+cGF0aCwgIi9ub25jZSIpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgICAgZ290byBvbl9lcnJvcjsKKyAgICAgICAgICB9CisgICAgICAgIGlmICghX2RidXNfY3JlYXRlX2RpcmVjdG9yeSAoJm5vbmNlZmlsZS0+ZGlyLCBlcnJvcikpCisgICAgICAgICAgeworICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgICAgZ290byBvbl9lcnJvcjsKKyAgICAgICAgICB9CisgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgICAgICB9CisgICAgZWxzZQorICAgICAgeworICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmbm9uY2VmaWxlLT5wYXRoKQorICAgICAgICAgICAgfHwgIV9kYnVzX3N0cmluZ19jb3B5ICgmbm9uY2VmaWxlLT5kaXIsIDAsICZub25jZWZpbGUtPnBhdGgsIDApCisgICAgICAgICAgICB8fCAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJm5vbmNlZmlsZS0+cGF0aCwgIi9kYnVzX25vbmNlLSIpCisgICAgICAgICAgICB8fCAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJm5vbmNlZmlsZS0+cGF0aCwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmcmFuZG9tU3RyKSkpCisgICAgICAgICAgeworICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgICBnb3RvIG9uX2Vycm9yOworICAgICAgICAgIH0KKworICAgICAgfQorCisgICAgaWYgKCFnZW5lcmF0ZV9hbmRfd3JpdGVfbm9uY2UgKCZub25jZWZpbGUtPnBhdGgsIGVycm9yKSkKKyAgICAgIHsKKyAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICBpZiAodXNlX3N1YmRpcikKKyAgICAgICAgICBfZGJ1c19kZWxldGVfZGlyZWN0b3J5ICgmbm9uY2VmaWxlLT5kaXIsIE5VTEwpOyAvL3dlIGlnbm9yZSBwb3NzaWJsZSBlcnJvcnMgZGVsZXRpbmcgdGhlIGRpciBhbmQgcmV0dXJuIHRoZSB3cml0ZSBlcnJvciBpbnN0ZWFkCisgICAgICAgIGdvdG8gb25fZXJyb3I7CisgICAgICB9CisgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnJhbmRvbVN0cik7CisKKyAgICByZXR1cm4gVFJVRTsKKyAgb25fZXJyb3I6CisgICAgaWYgKHVzZV9zdWJkaXIpCisgICAgICBfZGJ1c19kZWxldGVfZGlyZWN0b3J5ICgmbm9uY2VmaWxlLT5kaXIsIE5VTEwpOworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbm9uY2VmaWxlLT5kaXIpOworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbm9uY2VmaWxlLT5wYXRoKTsKKyAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnJhbmRvbVN0cik7CisgICAgcmV0dXJuIEZBTFNFOworfQorCisjaWZkZWYgREJVU19XSU4KKy8qKgorICogY3JlYXRlcyBhIG5vbmNlIGZpbGUgaW4gYSB1c2VyLXJlYWRhYmxlIGxvY2F0aW9uIGFuZCB3cml0ZXMgYSBnZW5lcmF0ZWQgbm9uY2UgdG8gaXQKKyAqCisgKiBAcGFyYW0gbm9uY2VmaWxlIHJldHVybnMgdGhlIG5vbmNlIGZpbGUgbG9jYXRpb24KKyAqIEBwYXJhbSBlcnJvciBlcnJvciBkZXRhaWxzIGlmIGNyZWF0aW5nIHRoZSBub25jZSBmaWxlIGZhaWxzCisgKiBAcmV0dXJuIFRSVUUgaWZmIHRoZSBub25jZSBmaWxlIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbm9uY2VmaWxlX2NyZWF0ZSAoREJ1c05vbmNlRmlsZSAqbm9uY2VmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgICByZXR1cm4gZG9fbm9uY2VmaWxlX2NyZWF0ZSAobm9uY2VmaWxlLCBlcnJvciwgLyp1c2Vfc3ViZGlyPSovRkFMU0UpOworfQorCisvKioKKyAqIGRlbGV0ZXMgdGhlIG5vbmNlZmlsZSBhbmQgZnJlZXMgdGhlIERCdXNOb25jZUZpbGUgb2JqZWN0LgorICoKKyAqIEBwYXJhbSBub25jZWZpbGUgdGhlIG5vbmNlIGZpbGUgdG8gZGVsZXRlLiBDb250ZW50cyB3aWxsIGJlIGZyZWVkLgorICogQHBhcmFtIGVycm9yIGVycm9yIGRldGFpbHMgaWYgdGhlIG5vbmNlIGZpbGUgY291bGQgbm90IGJlIGRlbGV0ZWQKKyAqIEByZXR1cm4gVFJVRQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbm9uY2VmaWxlX2RlbGV0ZSAoREJ1c05vbmNlRmlsZSAqbm9uY2VmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICAgIF9kYnVzX2RlbGV0ZV9maWxlICgmbm9uY2VmaWxlLT5wYXRoLCBlcnJvcik7CisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZub25jZWZpbGUtPmRpcik7CisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZub25jZWZpbGUtPnBhdGgpOworICAgIHJldHVybiBUUlVFOworfQorCisjZWxzZQorLyoqCisgKiBjcmVhdGVzIGEgbm9uY2UgZmlsZSBpbiBhIHVzZXItcmVhZGFibGUgbG9jYXRpb24gYW5kIHdyaXRlcyBhIGdlbmVyYXRlZCBub25jZSB0byBpdC4KKyAqIEluaXRpYWxpemVzIHRoZSBub25jZWZpbGUgb2JqZWN0LgorICoKKyAqIEBwYXJhbSBub25jZWZpbGUgcmV0dXJucyB0aGUgbm9uY2UgZmlsZSBsb2NhdGlvbgorICogQHBhcmFtIGVycm9yIGVycm9yIGRldGFpbHMgaWYgY3JlYXRpbmcgdGhlIG5vbmNlIGZpbGUgZmFpbHMKKyAqIEByZXR1cm4gVFJVRSBpZmYgdGhlIG5vbmNlIGZpbGUgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19ub25jZWZpbGVfY3JlYXRlIChEQnVzTm9uY2VGaWxlICpub25jZWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICAgIHJldHVybiBkb19ub25jZWZpbGVfY3JlYXRlIChub25jZWZpbGUsIGVycm9yLCAvKnVzZV9zdWJkaXI9Ki9UUlVFKTsKK30KKworLyoqCisgKiBkZWxldGVzIHRoZSBub25jZWZpbGUgYW5kIGZyZWVzIHRoZSBEQnVzTm9uY2VGaWxlIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gbm9uY2VmaWxlIHRoZSBub25jZSBmaWxlIHRvIGRlbGV0ZS4gQ29udGVudHMgd2lsbCBiZSBmcmVlZC4KKyAqIEBwYXJhbSBlcnJvciBlcnJvciBkZXRhaWxzIGlmIHRoZSBub25jZSBmaWxlIGNvdWxkIG5vdCBiZSBkZWxldGVkCisgKiBAcmV0dXJuIFRSVUUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX25vbmNlZmlsZV9kZWxldGUgKERCdXNOb25jZUZpbGUgKm5vbmNlZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpCit7CisgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgICBfZGJ1c19kZWxldGVfZGlyZWN0b3J5ICgmbm9uY2VmaWxlLT5kaXIsIGVycm9yKTsKKyAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJm5vbmNlZmlsZS0+ZGlyKTsKKyAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJm5vbmNlZmlsZS0+cGF0aCk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYKKworCisvKioKKyAqIHJldHVybnMgdGhlIGFic29sdXRlIGZpbGUgcGF0aCBvZiB0aGUgbm9uY2UgZmlsZQorICoKKyAqIEBwYXJhbSBub25jZWZpbGUgYW4gaW5pdGlhbGl6ZWQgbm9uY2VmaWxlIG9iamVjdAorICogQHJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgbm9uY2UgZmlsZQorICovCitjb25zdCBEQnVzU3RyaW5nKgorX2RidXNfbm9uY2VmaWxlX2dldF9wYXRoIChjb25zdCBEQnVzTm9uY2VGaWxlICpub25jZWZpbGUpCit7CisgICAgX2RidXNfYXNzZXJ0IChub25jZWZpbGUpOworICAgIHJldHVybiAmbm9uY2VmaWxlLT5wYXRoOworfQorCisvKioKKyAqIHJlYWRzIGRhdGEgZnJvbSBhIGZpbGUgZGVzY3JpcHRvciBhbmQgY2hlY2tzIGlmIHRoZSByZWNlaXZlZCBkYXRhIG1hdGNoZXMKKyAqIHRoZSBkYXRhIGluIHRoZSBnaXZlbiBub25jZWZpbGUuCisgKgorICogQHBhcmFtIGZkIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gcmVhZCB0aGUgbm9uY2UgZnJvbQorICogQHBhcmFtIG5vbmNlZmlsZSB0aGUgbm9uY2UgZmlsZSB0byBjaGVjayB0aGUgcmVjZWl2ZWQgZGF0YSBhZ2FpbnN0CisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgZGV0YWlscyBvbiBmYWlsCisgKiBAcmV0dXJuIFRSVUUgaWZmIGEgbm9uY2UgY291bGQgYmUgc3VjY2Vzc2Z1bGx5IHJlYWQgZnJvbSB0aGUgZmlsZSBkZXNjcmlwdG9yCisgKiBhbmQgbWF0Y2hlcyB0aGUgbm9uY2UgZnJvbSB0aGUgZ2l2ZW4gbm9uY2UgZmlsZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbm9uY2VmaWxlX2NoZWNrX25vbmNlIChpbnQgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNOb25jZUZpbGUgKm5vbmNlZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yKiBlcnJvcikKK3sKKyAgICByZXR1cm4gZG9fY2hlY2tfbm9uY2UgKGZkLCBfZGJ1c19ub25jZWZpbGVfZ2V0X3BhdGggKG5vbmNlZmlsZSksIGVycm9yKTsKK30KKworCisvKiogQH0gZW5kIG9mIG5vbmNlICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1ub25jZS5oIGIvZGJ1cy9kYnVzL2RidXMtbm9uY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzRlYTcyCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtbm9uY2UuaApAQCAtMCwwICsxLDcyIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbm9uY2UuaCAgTm9uY2UgaGFuZGxpbmcgZnVuY3Rpb25zIHVzZWQgYnkgbm9uY2UtdGNwIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgS2xhcmFsdmRhbGVucyBEYXRha29uc3VsdCBBQiwgYSBLREFCIEdyb3VwIGNvbXBhbnksIGluZm9Aa2RhYi5uZXQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX05PTkNFX0gKKyNkZWZpbmUgREJVU19OT05DRV9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFjcm9zLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXR5cGVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKworREJVU19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBEQnVzTm9uY2VGaWxlIERCdXNOb25jZUZpbGU7CisKK3N0cnVjdCBEQnVzTm9uY2VGaWxlCit7CisgIERCdXNTdHJpbmcgcGF0aDsKKyAgREJ1c1N0cmluZyBkaXI7Cit9OworCisvLyBzZXJ2ZXIKKworZGJ1c19ib29sX3QgX2RidXNfbm9uY2VmaWxlX2NyZWF0ZSAoREJ1c05vbmNlRmlsZSAqbm9uY2VmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICplcnJvcik7CisKK2RidXNfYm9vbF90IF9kYnVzX25vbmNlZmlsZV9kZWxldGUgKERCdXNOb25jZUZpbGUgKm5vbmNlZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19ub25jZWZpbGVfY2hlY2tfbm9uY2UgKGludCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c05vbmNlRmlsZSAqbm9uY2VmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKTsKKworY29uc3QgREJ1c1N0cmluZyogX2RidXNfbm9uY2VmaWxlX2dldF9wYXRoIChjb25zdCBEQnVzTm9uY2VGaWxlICpub25jZWZpbGUpOworCitpbnQgX2RidXNfYWNjZXB0X3dpdGhfbm9uY2VmaWxlIChpbnQgbGlzdGVuX2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c05vbmNlRmlsZSAqbm9uY2VmaWxlKTsKKworLy8gc2hhcmVkCisKK2RidXNfYm9vbF90IF9kYnVzX3JlYWRfbm9uY2UgKGNvbnN0IERCdXNTdHJpbmcgKmZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAqbm9uY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKTsKKworLy8gY2xpZW50CisKK2RidXNfYm9vbF90IF9kYnVzX3NlbmRfbm9uY2UgKGludCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKm5vbmNlZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpOworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19OT05DRV9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1vYmplY3QtdHJlZS5jIGIvZGJ1cy9kYnVzL2RidXMtb2JqZWN0LXRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzJjOWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtb2JqZWN0LXRyZWUuYwpAQCAtMCwwICsxLDE5NjUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1vYmplY3QtdHJlZS5jICBEQnVzT2JqZWN0VHJlZSAoaW50ZXJuYWxzIG9mIERCdXNDb25uZWN0aW9uKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNSAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1vYmplY3QtdHJlZS5oIgorI2luY2x1ZGUgImRidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1oYXNoLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8qKgorICogQGRlZmdyb3VwIERCdXNPYmplY3RUcmVlIEEgaGllcmFyY2h5IG9mIG9iamVjdHMgd2l0aCBjb250YWluZXItY29udGFpbmVkIHJlbGF0aW9uc2hpcAorICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBEQnVzT2JqZWN0VHJlZSBpcyB1c2VkIGJ5IERCdXNDb25uZWN0aW9uIHRvIHRyYWNrIHRoZSBvYmplY3QgdHJlZQorICoKKyAqIFR5cGVzIGFuZCBmdW5jdGlvbnMgcmVsYXRlZCB0byBEQnVzT2JqZWN0VHJlZS4gVGhlc2UKKyAqIGFyZSBhbGwgbGlicmFyeS1pbnRlcm5hbC4KKyAqCisgKiBAeworICovCisKKy8qKiBTdWJub2RlIG9mIHRoZSBvYmplY3QgaGllcmFyY2h5ICovCit0eXBlZGVmIHN0cnVjdCBEQnVzT2JqZWN0U3VidHJlZSBEQnVzT2JqZWN0U3VidHJlZTsKKworc3RhdGljIERCdXNPYmplY3RTdWJ0cmVlKiBfZGJ1c19vYmplY3Rfc3VidHJlZV9uZXcgICAoY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c09iamVjdFBhdGhWVGFibGUgICp2dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSk7CitzdGF0aWMgREJ1c09iamVjdFN1YnRyZWUqIF9kYnVzX29iamVjdF9zdWJ0cmVlX3JlZiAgIChEQnVzT2JqZWN0U3VidHJlZSAgICAgICAgICAgKnN1YnRyZWUpOworc3RhdGljIHZvaWQgICAgICAgICAgICAgICBfZGJ1c19vYmplY3Rfc3VidHJlZV91bnJlZiAoREJ1c09iamVjdFN1YnRyZWUgICAgICAgICAgICpzdWJ0cmVlKTsKKworLyoqCisgKiBJbnRlcm5hbHMgb2YgREJ1c09iamVjdFRyZWUKKyAqLworc3RydWN0IERCdXNPYmplY3RUcmVlCit7CisgIGludCAgICAgICAgICAgICAgICAgcmVmY291bnQ7ICAgLyoqPCBSZWZlcmVuY2UgY291bnQgKi8KKyAgREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uOyAvKio8IENvbm5lY3Rpb24gdGhpcyB0cmVlIGJlbG9uZ3MgdG8gKi8KKworICBEQnVzT2JqZWN0U3VidHJlZSAgKnJvb3Q7ICAgICAgIC8qKjwgUm9vdCBvZiB0aGUgdHJlZSAoIi8iIG5vZGUpICovCit9OworCisvKioKKyAqIFN0cnVjdCByZXByZXNlbnRpbmcgYSBzaW5nbGUgcmVnaXN0ZXJlZCBzdWJ0cmVlIGhhbmRsZXIsIG9yIG5vZGUKKyAqIHRoYXQncyBhIHBhcmVudCBvZiBhIHJlZ2lzdGVyZWQgc3VidHJlZSBoYW5kbGVyLiBJZgorICogbWVzc2FnZV9mdW5jdGlvbiAhPSBOVUxMIHRoZXJlJ3MgYWN0dWFsbHkgYSBoYW5kbGVyIGF0IHRoaXMgbm9kZS4KKyAqLworc3RydWN0IERCdXNPYmplY3RTdWJ0cmVlCit7CisgIERCdXNBdG9taWMgICAgICAgICAgICAgICAgICAgICAgICAgcmVmY291bnQ7ICAgICAgICAgICAgLyoqPCBSZWZlcmVuY2UgY291bnQgKi8KKyAgREJ1c09iamVjdFN1YnRyZWUgICAgICAgICAgICAgICAgICpwYXJlbnQ7ICAgICAgICAgICAgICAvKio8IFBhcmVudCBub2RlICovCisgIERCdXNPYmplY3RQYXRoVW5yZWdpc3RlckZ1bmN0aW9uICAgdW5yZWdpc3Rlcl9mdW5jdGlvbjsgLyoqPCBGdW5jdGlvbiB0byBjYWxsIG9uIHVucmVnaXN0ZXIgKi8KKyAgREJ1c09iamVjdFBhdGhNZXNzYWdlRnVuY3Rpb24gICAgICBtZXNzYWdlX2Z1bmN0aW9uOyAgICAvKio8IEZ1bmN0aW9uIHRvIGhhbmRsZSBtZXNzYWdlcyAqLworICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YTsgICAgICAgICAgIC8qKjwgRGF0YSBmb3IgZnVuY3Rpb25zICovCisgIERCdXNPYmplY3RTdWJ0cmVlICAgICAgICAgICAgICAgICoqc3VidHJlZXM7ICAgICAgICAgICAgLyoqPCBDaGlsZCBub2RlcyAqLworICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fc3VidHJlZXM7ICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoaWxkIG5vZGVzICovCisgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3N1YnRyZWVzOyAgICAgICAgLyoqPCBOdW1iZXIgb2YgYWxsb2NhdGVkIGVudHJpZXMgaW4gc3VidHJlZXMgKi8KKyAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgICAgICBpbnZva2VfYXNfZmFsbGJhY2sgOiAxOyAvKio8IFdoZXRoZXIgdG8gaW52b2tlIG1lc3NhZ2VfZnVuY3Rpb24gd2hlbiBjaGlsZCBub2RlcyBkb24ndCBoYW5kbGUgdGhlIG1lc3NhZ2UgKi8KKyAgY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lWzFdOyAvKio8IEFsbG9jYXRlZCBhcyBsYXJnZSBhcyBuZWNlc3NhcnkgKi8KK307CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBvYmplY3QgdHJlZSwgcmVwcmVzZW50aW5nIGEgbWFwcGluZyBmcm9tIHBhdGhzCisgKiB0byBoYW5kbGVyIHZ0YWJsZXMuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24gdGhpcyB0cmVlIGJlbG9uZ3MgdG8KKyAqIEByZXR1cm5zIHRoZSBuZXcgdHJlZSBvciAjTlVMTCBpZiBubyBtZW1vcnkKKyAqLworREJ1c09iamVjdFRyZWUqCitfZGJ1c19vYmplY3RfdHJlZV9uZXcgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzT2JqZWN0VHJlZSAqdHJlZTsKKworICAvKiB0aGUgY29ubmVjdGlvbiBwYXNzZWQgaW4gaGVyZSBpc24ndCBmdWxseSBjb25zdHJ1Y3RlZCwKKyAgICogc28gZG9uJ3QgZG8gYW55dGhpbmcgbW9yZSB0aGFuIHN0b3JlIGEgcG9pbnRlciB0bworICAgKiBpdAorICAgKi8KKworICB0cmVlID0gZGJ1c19uZXcwIChEQnVzT2JqZWN0VHJlZSwgMSk7CisgIGlmICh0cmVlID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgdHJlZS0+cmVmY291bnQgPSAxOworICB0cmVlLT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgdHJlZS0+cm9vdCA9IF9kYnVzX29iamVjdF9zdWJ0cmVlX25ldyAoIi8iLCBOVUxMLCBOVUxMKTsKKyAgaWYgKHRyZWUtPnJvb3QgPT0gTlVMTCkKKyAgICBnb3RvIG9vbTsKKyAgdHJlZS0+cm9vdC0+aW52b2tlX2FzX2ZhbGxiYWNrID0gVFJVRTsKKyAgCisgIHJldHVybiB0cmVlOworCisgb29tOgorICBpZiAodHJlZSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHRyZWUpOworICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBJbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudAorICogQHBhcmFtIHRyZWUgdGhlIG9iamVjdCB0cmVlCisgKiBAcmV0dXJucyB0aGUgb2JqZWN0IHRyZWUKKyAqLworREJ1c09iamVjdFRyZWUgKgorX2RidXNfb2JqZWN0X3RyZWVfcmVmIChEQnVzT2JqZWN0VHJlZSAqdHJlZSkKK3sKKyAgX2RidXNfYXNzZXJ0ICh0cmVlLT5yZWZjb3VudCA+IDApOworCisgIHRyZWUtPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIHRyZWU7Cit9CisKKy8qKgorICogRGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQKKyAqIEBwYXJhbSB0cmVlIHRoZSBvYmplY3QgdHJlZQorICovCit2b2lkCitfZGJ1c19vYmplY3RfdHJlZV91bnJlZiAoREJ1c09iamVjdFRyZWUgKnRyZWUpCit7CisgIF9kYnVzX2Fzc2VydCAodHJlZS0+cmVmY291bnQgPiAwKTsKKworICB0cmVlLT5yZWZjb3VudCAtPSAxOworCisgIGlmICh0cmVlLT5yZWZjb3VudCA9PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX29iamVjdF90cmVlX2ZyZWVfYWxsX3VubG9ja2VkICh0cmVlKTsKKworICAgICAgZGJ1c19mcmVlICh0cmVlKTsKKyAgICB9Cit9CisKKy8qKiBTZXQgdG8gMSB0byBnZXQgYSBidW5jaCBvZiBkZWJ1ZyBzcGV3IGFib3V0IGZpbmRpbmcgdGhlCisgKiBzdWJ0cmVlIG5vZGVzCisgKi8KKyNkZWZpbmUgVkVSQk9TRV9GSU5EIDAKKworc3RhdGljIERCdXNPYmplY3RTdWJ0cmVlKgorZmluZF9zdWJ0cmVlX3JlY3Vyc2UgKERCdXNPYmplY3RTdWJ0cmVlICAqc3VidHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICBjcmVhdGVfaWZfbm90X2ZvdW5kLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAqaW5kZXhfaW5fcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAqZXhhY3RfbWF0Y2gpCit7CisgIGludCBpLCBqOworICBkYnVzX2Jvb2xfdCByZXR1cm5fZGVlcGVzdF9tYXRjaDsKKworICByZXR1cm5fZGVlcGVzdF9tYXRjaCA9IGV4YWN0X21hdGNoICE9IE5VTEw7CisKKyAgX2RidXNfYXNzZXJ0ICghKHJldHVybl9kZWVwZXN0X21hdGNoICYmIGNyZWF0ZV9pZl9ub3RfZm91bmQpKTsKKworICBpZiAocGF0aFswXSA9PSBOVUxMKQorICAgIHsKKyNpZiBWRVJCT1NFX0ZJTkQKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIHBhdGggZXhoYXVzdGVkLCByZXR1cm5pbmcgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlLT5uYW1lKTsKKyNlbmRpZgorICAgICAgaWYgKGV4YWN0X21hdGNoICE9IE5VTEwpCisJKmV4YWN0X21hdGNoID0gVFJVRTsKKyAgICAgIHJldHVybiBzdWJ0cmVlOworICAgIH0KKworI2lmIFZFUkJPU0VfRklORAorICBfZGJ1c192ZXJib3NlICgiICBzZWFyY2hpbmcgY2hpbGRyZW4gb2YgJXMgZm9yICVzXG4iLAorICAgICAgICAgICAgICAgICBzdWJ0cmVlLT5uYW1lLCBwYXRoWzBdKTsKKyNlbmRpZgorICAKKyAgaSA9IDA7CisgIGogPSBzdWJ0cmVlLT5uX3N1YnRyZWVzOworICB3aGlsZSAoaSA8IGopCisgICAgeworICAgICAgaW50IGssIHY7CisKKyAgICAgIGsgPSAoaSArIGopIC8gMjsKKyAgICAgIHYgPSBzdHJjbXAgKHBhdGhbMF0sIHN1YnRyZWUtPnN1YnRyZWVzW2tdLT5uYW1lKTsKKworI2lmIFZFUkJPU0VfRklORAorICAgICAgX2RidXNfdmVyYm9zZSAoIiAgJXMgY21wICVzID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBwYXRoWzBdLCBzdWJ0cmVlLT5zdWJ0cmVlc1trXS0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIHYpOworI2VuZGlmCisgICAgICAKKyAgICAgIGlmICh2ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoaW5kZXhfaW5fcGFyZW50KQorICAgICAgICAgICAgeworI2lmIFZFUkJPU0VfRklORAorICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICBzdG9yaW5nIHBhcmVudCBpbmRleCAlZFxuIiwgayk7CisjZW5kaWYKKyAgICAgICAgICAgICAgKmluZGV4X2luX3BhcmVudCA9IGs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAocmV0dXJuX2RlZXBlc3RfbWF0Y2gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIERCdXNPYmplY3RTdWJ0cmVlICpuZXh0OworCisgICAgICAgICAgICAgIG5leHQgPSBmaW5kX3N1YnRyZWVfcmVjdXJzZSAoc3VidHJlZS0+c3VidHJlZXNba10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGhbMV0sIGNyZWF0ZV9pZl9ub3RfZm91bmQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4X2luX3BhcmVudCwgZXhhY3RfbWF0Y2gpOworICAgICAgICAgICAgICBpZiAobmV4dCA9PSBOVUxMICYmCisgICAgICAgICAgICAgICAgICBzdWJ0cmVlLT5pbnZva2VfYXNfZmFsbGJhY2spCisgICAgICAgICAgICAgICAgeworI2lmIFZFUkJPU0VfRklORAorICAgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgbm8gZGVlcGVyIG1hdGNoIGZvdW5kLCByZXR1cm5pbmcgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlLT5uYW1lKTsKKyNlbmRpZgorCQkgIGlmIChleGFjdF9tYXRjaCAhPSBOVUxMKQorCQkgICAgKmV4YWN0X21hdGNoID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICByZXR1cm4gc3VidHJlZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gZmluZF9zdWJ0cmVlX3JlY3Vyc2UgKHN1YnRyZWUtPnN1YnRyZWVzW2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aFsxXSwgY3JlYXRlX2lmX25vdF9mb3VuZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4X2luX3BhcmVudCwgZXhhY3RfbWF0Y2gpOworICAgICAgICB9CisgICAgICBlbHNlIGlmICh2IDwgMCkKKyAgICAgICAgeworICAgICAgICAgIGogPSBrOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpID0gayArIDE7CisgICAgICAgIH0KKyAgICB9CisKKyNpZiBWRVJCT1NFX0ZJTkQKKyAgX2RidXNfdmVyYm9zZSAoIiAgbm8gbWF0Y2ggZm91bmQsIGN1cnJlbnQgdHJlZSAlcywgY3JlYXRlX2lmX25vdF9mb3VuZCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICBzdWJ0cmVlLT5uYW1lLCBjcmVhdGVfaWZfbm90X2ZvdW5kKTsKKyNlbmRpZgorICAKKyAgaWYgKGNyZWF0ZV9pZl9ub3RfZm91bmQpCisgICAgeworICAgICAgREJ1c09iamVjdFN1YnRyZWUqIGNoaWxkOworICAgICAgaW50IGNoaWxkX3BvcywgbmV3X25fc3VidHJlZXM7CisKKyNpZiBWRVJCT1NFX0ZJTkQKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIGNyZWF0aW5nIHN1YnRyZWUgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBwYXRoWzBdKTsKKyNlbmRpZgorICAgICAgCisgICAgICBjaGlsZCA9IF9kYnVzX29iamVjdF9zdWJ0cmVlX25ldyAocGF0aFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKKyAgICAgIGlmIChjaGlsZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgbmV3X25fc3VidHJlZXMgPSBzdWJ0cmVlLT5uX3N1YnRyZWVzICsgMTsKKyAgICAgIGlmIChuZXdfbl9zdWJ0cmVlcyA+IHN1YnRyZWUtPm1heF9zdWJ0cmVlcykKKyAgICAgICAgeworICAgICAgICAgIGludCBuZXdfbWF4X3N1YnRyZWVzOworICAgICAgICAgIERCdXNPYmplY3RTdWJ0cmVlICoqbmV3X3N1YnRyZWVzOworCisgICAgICAgICAgbmV3X21heF9zdWJ0cmVlcyA9IHN1YnRyZWUtPm1heF9zdWJ0cmVlcyA9PSAwID8gMSA6IDIgKiBzdWJ0cmVlLT5tYXhfc3VidHJlZXM7CisgICAgICAgICAgbmV3X3N1YnRyZWVzID0gZGJ1c19yZWFsbG9jIChzdWJ0cmVlLT5zdWJ0cmVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19tYXhfc3VidHJlZXMgKiBzaXplb2YgKERCdXNPYmplY3RTdWJ0cmVlKikpOworICAgICAgICAgIGlmIChuZXdfc3VidHJlZXMgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfb2JqZWN0X3N1YnRyZWVfdW5yZWYgKGNoaWxkKTsKKyAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgc3VidHJlZS0+c3VidHJlZXMgPSBuZXdfc3VidHJlZXM7CisgICAgICAgICAgc3VidHJlZS0+bWF4X3N1YnRyZWVzID0gbmV3X21heF9zdWJ0cmVlczsKKyAgICAgICAgfQorCisgICAgICAvKiBUaGUgYmluYXJ5IHNlYXJjaCBmYWlsZWQsIHNvIGkgPT0gaiBwb2ludHMgdG8gdGhlIAorICAgICAgICAgcGxhY2UgdGhlIGNoaWxkIHNob3VsZCBiZSBpbnNlcnRlZC4gKi8KKyAgICAgIGNoaWxkX3BvcyA9IGk7CisgICAgICBfZGJ1c19hc3NlcnQgKGNoaWxkX3BvcyA8IG5ld19uX3N1YnRyZWVzICYmCisgICAgICAgICAgICAgICAgICAgIG5ld19uX3N1YnRyZWVzIDw9IHN1YnRyZWUtPm1heF9zdWJ0cmVlcyk7CisgICAgICBpZiAoY2hpbGRfcG9zICsgMSA8IG5ld19uX3N1YnRyZWVzKQorCXsKKwkgIG1lbW1vdmUgKCZzdWJ0cmVlLT5zdWJ0cmVlc1tjaGlsZF9wb3MrMV0sIAorCQkgICAmc3VidHJlZS0+c3VidHJlZXNbY2hpbGRfcG9zXSwgCisJCSAgIChuZXdfbl9zdWJ0cmVlcyAtIGNoaWxkX3BvcyAtIDEpICogCisJCSAgIHNpemVvZiBzdWJ0cmVlLT5zdWJ0cmVlc1swXSk7CisJfQorICAgICAgc3VidHJlZS0+c3VidHJlZXNbY2hpbGRfcG9zXSA9IGNoaWxkOworCisgICAgICBpZiAoaW5kZXhfaW5fcGFyZW50KQorICAgICAgICAqaW5kZXhfaW5fcGFyZW50ID0gY2hpbGRfcG9zOworICAgICAgc3VidHJlZS0+bl9zdWJ0cmVlcyA9IG5ld19uX3N1YnRyZWVzOworICAgICAgY2hpbGQtPnBhcmVudCA9IHN1YnRyZWU7CisKKyAgICAgIHJldHVybiBmaW5kX3N1YnRyZWVfcmVjdXJzZSAoY2hpbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRoWzFdLCBjcmVhdGVfaWZfbm90X2ZvdW5kLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhfaW5fcGFyZW50LCBleGFjdF9tYXRjaCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGV4YWN0X21hdGNoICE9IE5VTEwpCisJKmV4YWN0X21hdGNoID0gRkFMU0U7CisgICAgICByZXR1cm4gKHJldHVybl9kZWVwZXN0X21hdGNoICYmIHN1YnRyZWUtPmludm9rZV9hc19mYWxsYmFjaykgPyBzdWJ0cmVlIDogTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyBEQnVzT2JqZWN0U3VidHJlZSoKK2ZpbmRfc3VidHJlZSAoREJ1c09iamVjdFRyZWUgKnRyZWUsCisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKipwYXRoLAorICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAqaW5kZXhfaW5fcGFyZW50KQoreworICBEQnVzT2JqZWN0U3VidHJlZSAqc3VidHJlZTsKKworI2lmIFZFUkJPU0VfRklORAorICBfZGJ1c192ZXJib3NlICgiTG9va2luZyBmb3IgZXhhY3QgcmVnaXN0ZXJlZCBzdWJ0cmVlXG4iKTsKKyNlbmRpZgorICAKKyAgc3VidHJlZSA9IGZpbmRfc3VidHJlZV9yZWN1cnNlICh0cmVlLT5yb290LCBwYXRoLCBGQUxTRSwgaW5kZXhfaW5fcGFyZW50LCBOVUxMKTsKKworICBpZiAoc3VidHJlZSAmJiBzdWJ0cmVlLT5tZXNzYWdlX2Z1bmN0aW9uID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIGVsc2UKKyAgICByZXR1cm4gc3VidHJlZTsKK30KKworc3RhdGljIERCdXNPYmplY3RTdWJ0cmVlKgorbG9va3VwX3N1YnRyZWUgKERCdXNPYmplY3RUcmVlICp0cmVlLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKipwYXRoKQoreworI2lmIFZFUkJPU0VfRklORAorICBfZGJ1c192ZXJib3NlICgiTG9va2luZyBmb3Igc3VidHJlZVxuIik7CisjZW5kaWYKKyAgcmV0dXJuIGZpbmRfc3VidHJlZV9yZWN1cnNlICh0cmVlLT5yb290LCBwYXRoLCBGQUxTRSwgTlVMTCwgTlVMTCk7Cit9CisKK3N0YXRpYyBEQnVzT2JqZWN0U3VidHJlZSoKK2ZpbmRfaGFuZGxlciAoREJ1c09iamVjdFRyZWUgKnRyZWUsCisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKipwYXRoLAorICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAqZXhhY3RfbWF0Y2gpCit7CisjaWYgVkVSQk9TRV9GSU5ECisgIF9kYnVzX3ZlcmJvc2UgKCJMb29raW5nIGZvciBkZWVwZXN0IGhhbmRsZXJcbiIpOworI2VuZGlmCisgIF9kYnVzX2Fzc2VydCAoZXhhY3RfbWF0Y2ggIT0gTlVMTCk7CisKKyAgKmV4YWN0X21hdGNoID0gRkFMU0U7IC8qIGVuc3VyZSBhbHdheXMgaW5pdGlhbGl6ZWQgKi8KKyAgCisgIHJldHVybiBmaW5kX3N1YnRyZWVfcmVjdXJzZSAodHJlZS0+cm9vdCwgcGF0aCwgRkFMU0UsIE5VTEwsIGV4YWN0X21hdGNoKTsKK30KKworc3RhdGljIERCdXNPYmplY3RTdWJ0cmVlKgorZW5zdXJlX3N1YnRyZWUgKERCdXNPYmplY3RUcmVlICp0cmVlLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKipwYXRoKQoreworI2lmIFZFUkJPU0VfRklORAorICBfZGJ1c192ZXJib3NlICgiRW5zdXJpbmcgc3VidHJlZVxuIik7CisjZW5kaWYKKyAgcmV0dXJuIGZpbmRfc3VidHJlZV9yZWN1cnNlICh0cmVlLT5yb290LCBwYXRoLCBUUlVFLCBOVUxMLCBOVUxMKTsKK30KKworc3RhdGljIGNoYXIgKmZsYXR0ZW5fcGF0aCAoY29uc3QgY2hhciAqKnBhdGgpOworCisvKioKKyAqIFJlZ2lzdGVycyBhIG5ldyBzdWJ0cmVlIGluIHRoZSBnbG9iYWwgb2JqZWN0IHRyZWUuCisgKgorICogQHBhcmFtIHRyZWUgdGhlIGdsb2JhbCBvYmplY3QgdHJlZQorICogQHBhcmFtIGZhbGxiYWNrICNUUlVFIHRvIGhhbmRsZSBtZXNzYWdlcyB0byBjaGlsZHJlbiBvZiB0aGlzIHBhdGgKKyAqIEBwYXJhbSBwYXRoIE5VTEwtdGVybWluYXRlZCBhcnJheSBvZiBwYXRoIGVsZW1lbnRzIGdpdmluZyBwYXRoIHRvIHN1YnRyZWUKKyAqIEBwYXJhbSB2dGFibGUgdGhlIHZ0YWJsZSB1c2VkIHRvIHRyYXZlcnNlIHRoaXMgc3VidHJlZQorICogQHBhcmFtIHVzZXJfZGF0YSB1c2VyIGRhdGEgdG8gcGFzcyB0byBtZXRob2RzIGluIHRoZSB2dGFibGUKKyAqIEBwYXJhbSBlcnJvciBhZGRyZXNzIHdoZXJlIGFuIGVycm9yIGNhbiBiZSByZXR1cm5lZAorICogQHJldHVybnMgI0ZBTFNFIGlmIGFuIGVycm9yICgjREJVU19FUlJPUl9OT19NRU1PUlkgb3IKKyAqICAgICNEQlVTX0VSUk9SX09CSkVDVF9QQVRIX0lOX1VTRSkgaXMgcmVwb3J0ZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX29iamVjdF90cmVlX3JlZ2lzdGVyIChEQnVzT2JqZWN0VHJlZSAgICAgICAgICAgICAgKnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgICAgICBmYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAqKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c09iamVjdFBhdGhWVGFibGUgICp2dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAgICplcnJvcikKK3sKKyAgREJ1c09iamVjdFN1YnRyZWUgICpzdWJ0cmVlOworCisgIF9kYnVzX2Fzc2VydCAodHJlZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0ICh2dGFibGUtPm1lc3NhZ2VfZnVuY3Rpb24gIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocGF0aCAhPSBOVUxMKTsKKworICBzdWJ0cmVlID0gZW5zdXJlX3N1YnRyZWUgKHRyZWUsIHBhdGgpOworICBpZiAoc3VidHJlZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKHN1YnRyZWUtPm1lc3NhZ2VfZnVuY3Rpb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoZXJyb3IgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGNoYXIgKmNvbXBsZXRlX3BhdGggPSBmbGF0dGVuX3BhdGggKHBhdGgpOworCisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX09CSkVDVF9QQVRIX0lOX1VTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkEgaGFuZGxlciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVfcGF0aCA/IGNvbXBsZXRlX3BhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIoY2Fubm90IHJlcHJlc2VudCBwYXRoOiBvdXQgb2YgbWVtb3J5ISkiKTsKKworICAgICAgICAgIGRidXNfZnJlZSAoY29tcGxldGVfcGF0aCk7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBzdWJ0cmVlLT5tZXNzYWdlX2Z1bmN0aW9uID0gdnRhYmxlLT5tZXNzYWdlX2Z1bmN0aW9uOworICBzdWJ0cmVlLT51bnJlZ2lzdGVyX2Z1bmN0aW9uID0gdnRhYmxlLT51bnJlZ2lzdGVyX2Z1bmN0aW9uOworICBzdWJ0cmVlLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisgIHN1YnRyZWUtPmludm9rZV9hc19mYWxsYmFjayA9IGZhbGxiYWNrICE9IEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFVucmVnaXN0ZXJzIGFuIG9iamVjdCBzdWJ0cmVlIHRoYXQgd2FzIHJlZ2lzdGVyZWQgd2l0aCB0aGUKKyAqIHNhbWUgcGF0aC4KKyAqCisgKiBAcGFyYW0gdHJlZSB0aGUgZ2xvYmFsIG9iamVjdCB0cmVlCisgKiBAcGFyYW0gcGF0aCBwYXRoIHRvIHRoZSBzdWJ0cmVlIChzYW1lIGFzIHRoZSBvbmUgcGFzc2VkIHRvIF9kYnVzX29iamVjdF90cmVlX3JlZ2lzdGVyKCkpCisgKi8KK3ZvaWQKK19kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAoREJ1c09iamVjdFRyZWUgICAgICAgICAgKnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgKipwYXRoKQoreworICBpbnQgaTsKKyAgREJ1c09iamVjdFN1YnRyZWUgKnN1YnRyZWU7CisgIERCdXNPYmplY3RQYXRoVW5yZWdpc3RlckZ1bmN0aW9uIHVucmVnaXN0ZXJfZnVuY3Rpb247CisgIHZvaWQgKnVzZXJfZGF0YTsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisKKyAgX2RidXNfYXNzZXJ0IChwYXRoICE9IE5VTEwpOworCisgIHVucmVnaXN0ZXJfZnVuY3Rpb24gPSBOVUxMOworICB1c2VyX2RhdGEgPSBOVUxMOworCisgIHN1YnRyZWUgPSBmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgsICZpKTsKKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIGlmIChzdWJ0cmVlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkF0dGVtcHRlZCB0byB1bnJlZ2lzdGVyIHBhdGggKHBhdGhbMF0gPSAlcyBwYXRoWzFdID0gJXMpIHdoaWNoIGlzbid0IHJlZ2lzdGVyZWRcbiIsCisgICAgICAgICAgICAgICAgICBwYXRoWzBdID8gcGF0aFswXSA6ICJudWxsIiwKKyAgICAgICAgICAgICAgICAgIHBhdGhbMV0gPyBwYXRoWzFdIDogIm51bGwiKTsKKyAgICAgIGdvdG8gdW5sb2NrOyAgICAKKyAgICB9CisjZWxzZQorICBfZGJ1c19hc3NlcnQgKHN1YnRyZWUgIT0gTlVMTCk7CisjZW5kaWYKKworICBfZGJ1c19hc3NlcnQgKHN1YnRyZWUtPnBhcmVudCA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgKGkgPj0gMCAmJiBzdWJ0cmVlLT5wYXJlbnQtPnN1YnRyZWVzW2ldID09IHN1YnRyZWUpKTsKKworICBzdWJ0cmVlLT5tZXNzYWdlX2Z1bmN0aW9uID0gTlVMTDsKKworICB1bnJlZ2lzdGVyX2Z1bmN0aW9uID0gc3VidHJlZS0+dW5yZWdpc3Rlcl9mdW5jdGlvbjsKKyAgdXNlcl9kYXRhID0gc3VidHJlZS0+dXNlcl9kYXRhOworCisgIHN1YnRyZWUtPnVucmVnaXN0ZXJfZnVuY3Rpb24gPSBOVUxMOworICBzdWJ0cmVlLT51c2VyX2RhdGEgPSBOVUxMOworCisgIC8qIElmIHdlIGhhdmUgbm8gc3VidHJlZXMgb2Ygb3VyIG93biwgcmVtb3ZlIGZyb20KKyAgICogb3VyIHBhcmVudCAoRklYTUUgY291bGQgYWxzbyBiZSBtb3JlIGFnZ3Jlc3NpdmUKKyAgICogYW5kIHJlbW92ZSBvdXIgcGFyZW50IGlmIGl0IGJlY29tZXMgZW1wdHkpCisgICAqLworICBpZiAoc3VidHJlZS0+cGFyZW50ICYmIHN1YnRyZWUtPm5fc3VidHJlZXMgPT0gMCkKKyAgICB7CisgICAgICAvKiBhc3N1bWVzIGEgMC1ieXRlIG1lbW1vdmUgaXMgT0sgKi8KKyAgICAgIG1lbW1vdmUgKCZzdWJ0cmVlLT5wYXJlbnQtPnN1YnRyZWVzW2ldLAorICAgICAgICAgICAgICAgJnN1YnRyZWUtPnBhcmVudC0+c3VidHJlZXNbaSsxXSwKKyAgICAgICAgICAgICAgIChzdWJ0cmVlLT5wYXJlbnQtPm5fc3VidHJlZXMgLSBpIC0gMSkgKgorICAgICAgICAgICAgICAgc2l6ZW9mIChzdWJ0cmVlLT5wYXJlbnQtPnN1YnRyZWVzWzBdKSk7CisgICAgICBzdWJ0cmVlLT5wYXJlbnQtPm5fc3VidHJlZXMgLT0gMTsKKworICAgICAgc3VidHJlZS0+cGFyZW50ID0gTlVMTDsKKworICAgICAgX2RidXNfb2JqZWN0X3N1YnRyZWVfdW5yZWYgKHN1YnRyZWUpOworICAgIH0KKyAgc3VidHJlZSA9IE5VTEw7CisKK3VubG9jazoKKyAgY29ubmVjdGlvbiA9IHRyZWUtPmNvbm5lY3Rpb247CisKKyAgLyogVW5sb2NrIGFuZCBjYWxsIGFwcGxpY2F0aW9uIGNvZGUgKi8KKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgIGlmIChjb25uZWN0aW9uKQorI2VuZGlmCisgICAgeworICAgICAgX2RidXNfY29ubmVjdGlvbl9yZWZfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworICAgICAgX2RidXNfdmVyYm9zZSAoInVubG9ja1xuIik7CisgICAgICBfZGJ1c19jb25uZWN0aW9uX3VubG9jayAoY29ubmVjdGlvbik7CisgICAgfQorCisgIGlmICh1bnJlZ2lzdGVyX2Z1bmN0aW9uKQorICAgICgqIHVucmVnaXN0ZXJfZnVuY3Rpb24pIChjb25uZWN0aW9uLCB1c2VyX2RhdGEpOworCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICBpZiAoY29ubmVjdGlvbikKKyNlbmRpZgorICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX3N1YnRyZWVfcmVjdXJzZSAoREJ1c0Nvbm5lY3Rpb24gICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgREJ1c09iamVjdFN1YnRyZWUgKnN1YnRyZWUpCit7CisgIC8qIERlbGV0ZSB0aGVtIGZyb20gdGhlIGVuZCwgZm9yIHNsaWdodGx5CisgICAqIG1vcmUgcm9idXN0bmVzcyBhZ2FpbnN0IG9kZCByZWVudHJhbmN5LgorICAgKi8KKyAgd2hpbGUgKHN1YnRyZWUtPm5fc3VidHJlZXMgPiAwKQorICAgIHsKKyAgICAgIERCdXNPYmplY3RTdWJ0cmVlICpjaGlsZDsKKworICAgICAgY2hpbGQgPSBzdWJ0cmVlLT5zdWJ0cmVlc1tzdWJ0cmVlLT5uX3N1YnRyZWVzIC0gMV07CisgICAgICBzdWJ0cmVlLT5zdWJ0cmVlc1tzdWJ0cmVlLT5uX3N1YnRyZWVzIC0gMV0gPSBOVUxMOworICAgICAgc3VidHJlZS0+bl9zdWJ0cmVlcyAtPSAxOworICAgICAgY2hpbGQtPnBhcmVudCA9IE5VTEw7CisKKyAgICAgIGZyZWVfc3VidHJlZV9yZWN1cnNlIChjb25uZWN0aW9uLCBjaGlsZCk7CisgICAgfQorCisgIC8qIENhbGwgYXBwbGljYXRpb24gY29kZSAqLworICBpZiAoc3VidHJlZS0+dW5yZWdpc3Rlcl9mdW5jdGlvbikKKyAgICAoKiBzdWJ0cmVlLT51bnJlZ2lzdGVyX2Z1bmN0aW9uKSAoY29ubmVjdGlvbiwKKwkJCQkgICAgICBzdWJ0cmVlLT51c2VyX2RhdGEpOworCisgIHN1YnRyZWUtPm1lc3NhZ2VfZnVuY3Rpb24gPSBOVUxMOworICBzdWJ0cmVlLT51bnJlZ2lzdGVyX2Z1bmN0aW9uID0gTlVMTDsKKyAgc3VidHJlZS0+dXNlcl9kYXRhID0gTlVMTDsKKworICAvKiBOb3cgZnJlZSBvdXJzZWx2ZXMgKi8KKyAgX2RidXNfb2JqZWN0X3N1YnRyZWVfdW5yZWYgKHN1YnRyZWUpOworfQorCisvKioKKyAqIEZyZWUgYWxsIHRoZSBoYW5kbGVycyBpbiB0aGUgdHJlZS4gTG9jayBvbiB0cmVlJ3MgY29ubmVjdGlvbgorICogbXVzdCBub3QgYmUgaGVsZC4KKyAqCisgKiBAcGFyYW0gdHJlZSB0aGUgb2JqZWN0IHRyZWUKKyAqLwordm9pZAorX2RidXNfb2JqZWN0X3RyZWVfZnJlZV9hbGxfdW5sb2NrZWQgKERCdXNPYmplY3RUcmVlICp0cmVlKQoreworICBpZiAodHJlZS0+cm9vdCkKKyAgICBmcmVlX3N1YnRyZWVfcmVjdXJzZSAodHJlZS0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZS0+cm9vdCk7CisgIHRyZWUtPnJvb3QgPSBOVUxMOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX29iamVjdF90cmVlX2xpc3RfcmVnaXN0ZXJlZF91bmxvY2tlZCAoREJ1c09iamVjdFRyZWUgKnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKipwYXJlbnRfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICoqKmNoaWxkX2VudHJpZXMpCit7CisgIERCdXNPYmplY3RTdWJ0cmVlICpzdWJ0cmVlOworICBjaGFyICoqcmV0dmFsOworICAKKyAgX2RidXNfYXNzZXJ0IChwYXJlbnRfcGF0aCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChjaGlsZF9lbnRyaWVzICE9IE5VTEwpOworCisgICpjaGlsZF9lbnRyaWVzID0gTlVMTDsKKyAgCisgIHN1YnRyZWUgPSBsb29rdXBfc3VidHJlZSAodHJlZSwgcGFyZW50X3BhdGgpOworICBpZiAoc3VidHJlZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHJldHZhbCA9IGRidXNfbmV3MCAoY2hhciAqLCAxKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIHJldHZhbCA9IGRidXNfbmV3MCAoY2hhciosIHN1YnRyZWUtPm5fc3VidHJlZXMgKyAxKTsKKyAgICAgIGlmIChyZXR2YWwgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChpIDwgc3VidHJlZS0+bl9zdWJ0cmVlcykKKyAgICAgICAgeworICAgICAgICAgIHJldHZhbFtpXSA9IF9kYnVzX3N0cmR1cCAoc3VidHJlZS0+c3VidHJlZXNbaV0tPm5hbWUpOworICAgICAgICAgIGlmIChyZXR2YWxbaV0gPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAocmV0dmFsKTsKKyAgICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgfQorCisgb3V0OgorICAgIAorICAqY2hpbGRfZW50cmllcyA9IHJldHZhbDsKKyAgcmV0dXJuIHJldHZhbCAhPSBOVUxMOworfQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK2hhbmRsZV9kZWZhdWx0X2ludHJvc3BlY3RfYW5kX3VubG9jayAoREJ1c09iamVjdFRyZWUgICAgICAgICAgKnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICoqcGF0aCkKK3sKKyAgREJ1c1N0cmluZyB4bWw7CisgIERCdXNIYW5kbGVyUmVzdWx0IHJlc3VsdDsKKyAgY2hhciAqKmNoaWxkcmVuOworICBpbnQgaTsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjsKKyAgY29uc3QgY2hhciAqdl9TVFJJTkc7CisgIGRidXNfYm9vbF90IGFscmVhZHlfdW5sb2NrZWQ7CisKKyAgLyogV2UgaGF2ZSB0aGUgY29ubmVjdGlvbiBsb2NrIGhlcmUgKi8KKworICBhbHJlYWR5X3VubG9ja2VkID0gRkFMU0U7CisgIAorICBfZGJ1c192ZXJib3NlICgiIGNvbnNpZGVyaW5nIGRlZmF1bHQgSW50cm9zcGVjdCgpIGhhbmRsZXIuLi5cbiIpOworCisgIHJlcGx5ID0gTlVMTDsKKyAgCisgIGlmICghZGJ1c19tZXNzYWdlX2lzX21ldGhvZF9jYWxsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfSU5UUk9TUEVDVEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50cm9zcGVjdCIpKQorICAgIHsKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgICAgICBpZiAodHJlZS0+Y29ubmVjdGlvbikKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInVubG9ja1xuIik7CisgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl91bmxvY2sgKHRyZWUtPmNvbm5lY3Rpb24pOworICAgICAgICB9CisgICAgICAKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIiB1c2luZyBkZWZhdWx0IEludHJvc3BlY3QoKSBoYW5kbGVyIVxuIik7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmeG1sKSkKKyAgICB7CisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICAgICAgaWYgKHRyZWUtPmNvbm5lY3Rpb24pCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ1bmxvY2tcbiIpOworICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrICh0cmVlLT5jb25uZWN0aW9uKTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9ORUVEX01FTU9SWTsKKyAgICB9CisKKyAgcmVzdWx0ID0gREJVU19IQU5ETEVSX1JFU1VMVF9ORUVEX01FTU9SWTsKKworICBjaGlsZHJlbiA9IE5VTEw7CisgIGlmICghX2RidXNfb2JqZWN0X3RyZWVfbGlzdF9yZWdpc3RlcmVkX3VubG9ja2VkICh0cmVlLCBwYXRoLCAmY2hpbGRyZW4pKQorICAgIGdvdG8gb3V0OworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnhtbCwgREJVU19JTlRST1NQRUNUXzFfMF9YTUxfRE9DVFlQRV9ERUNMX05PREUpKQorICAgIGdvdG8gb3V0OworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmeG1sLCAiPG5vZGU+XG4iKSkKKyAgICBnb3RvIG91dDsKKworICBpID0gMDsKKyAgd2hpbGUgKGNoaWxkcmVuW2ldICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoJnhtbCwgIiAgPG5vZGUgbmFtZT1cIiVzXCIvPlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuW2ldKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmeG1sLCAiPC9ub2RlPlxuIikpCisgICAgZ290byBvdXQ7CisKKyAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICBnb3RvIG91dDsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAocmVwbHksICZpdGVyKTsKKyAgdl9TVFJJTkcgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ4bWwpOworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJml0ZXIsIERCVVNfVFlQRV9TVFJJTkcsICZ2X1NUUklORykpCisgICAgZ290byBvdXQ7CisgIAorI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgaWYgKHRyZWUtPmNvbm5lY3Rpb24pCisjZW5kaWYKKyAgICB7CisgICAgICBhbHJlYWR5X3VubG9ja2VkID0gVFJVRTsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19jb25uZWN0aW9uX3NlbmRfYW5kX3VubG9jayAodHJlZS0+Y29ubmVjdGlvbiwgcmVwbHksIE5VTEwpKQorICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgIAorICByZXN1bHQgPSBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisgIAorIG91dDoKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgIGlmICh0cmVlLT5jb25uZWN0aW9uKQorI2VuZGlmCisgICAgeworICAgICAgaWYgKCFhbHJlYWR5X3VubG9ja2VkKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInVubG9ja1xuIik7CisgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl91bmxvY2sgKHRyZWUtPmNvbm5lY3Rpb24pOworICAgICAgICB9CisgICAgfQorICAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ4bWwpOworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChjaGlsZHJlbik7CisgIGlmIChyZXBseSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogVHJpZXMgdG8gZGlzcGF0Y2ggYSBtZXNzYWdlIGJ5IGRpcmVjdGluZyBpdCB0byBoYW5kbGVyIGZvciB0aGUKKyAqIG9iamVjdCBwYXRoIGxpc3RlZCBpbiB0aGUgbWVzc2FnZSBoZWFkZXIsIGlmIGFueS4gTWVzc2FnZXMgYXJlCisgKiBkaXNwYXRjaGVkIGZpcnN0IHRvIHRoZSByZWdpc3RlcmVkIGhhbmRsZXIgdGhhdCBtYXRjaGVzIHRoZSBsYXJnZXN0CisgKiBudW1iZXIgb2YgcGF0aCBlbGVtZW50czsgdGhhdCBpcywgbWVzc2FnZSB0byAvZm9vL2Jhci9iYXogd291bGQgZ28KKyAqIHRvIHRoZSBoYW5kbGVyIGZvciAvZm9vL2JhciBiZWZvcmUgdGhlIG9uZSBmb3IgL2Zvby4KKyAqCisgKiBAdG9kbyB0aHJlYWQgcHJvYmxlbXMKKyAqCisgKiBAcGFyYW0gdHJlZSB0aGUgZ2xvYmFsIG9iamVjdCB0cmVlCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBkaXNwYXRjaAorICogQHJldHVybnMgd2hldGhlciBtZXNzYWdlIHdhcyBoYW5kbGVkIHN1Y2Nlc3NmdWxseQorICovCitEQnVzSGFuZGxlclJlc3VsdAorX2RidXNfb2JqZWN0X3RyZWVfZGlzcGF0Y2hfYW5kX3VubG9jayAoREJ1c09iamVjdFRyZWUgICAgICAgICAgKnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgICpmb3VuZF9vYmplY3QpCit7CisgIGNoYXIgKipwYXRoOworICBkYnVzX2Jvb2xfdCBleGFjdF9tYXRjaDsKKyAgREJ1c0xpc3QgKmxpc3Q7CisgIERCdXNMaXN0ICpsaW5rOworICBEQnVzSGFuZGxlclJlc3VsdCByZXN1bHQ7CisgIERCdXNPYmplY3RTdWJ0cmVlICpzdWJ0cmVlOworICAKKyNpZiAwCisgIF9kYnVzX3ZlcmJvc2UgKCJEaXNwYXRjaCBvZiBtZXNzYWdlIGJ5IG9iamVjdCBwYXRoXG4iKTsKKyNlbmRpZgorICAKKyAgcGF0aCA9IE5VTEw7CisgIGlmICghZGJ1c19tZXNzYWdlX2dldF9wYXRoX2RlY29tcG9zZWQgKG1lc3NhZ2UsICZwYXRoKSkKKyAgICB7CisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICAgICAgaWYgKHRyZWUtPmNvbm5lY3Rpb24pCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ1bmxvY2tcbiIpOworICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrICh0cmVlLT5jb25uZWN0aW9uKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBfZGJ1c192ZXJib3NlICgiTm8gbWVtb3J5IHRvIGdldCBkZWNvbXBvc2VkIHBhdGhcbiIpOworCisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9ORUVEX01FTU9SWTsKKyAgICB9CisKKyAgaWYgKHBhdGggPT0gTlVMTCkKKyAgICB7CisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICAgICAgaWYgKHRyZWUtPmNvbm5lY3Rpb24pCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ1bmxvY2tcbiIpOworICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrICh0cmVlLT5jb25uZWN0aW9uKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBfZGJ1c192ZXJib3NlICgiTm8gcGF0aCBmaWVsZCBpbiBtZXNzYWdlXG4iKTsKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKKyAgICB9CisgIAorICAvKiBGaW5kIHRoZSBkZWVwZXN0IHBhdGggdGhhdCBjb3ZlcnMgdGhlIHBhdGggaW4gdGhlIG1lc3NhZ2UgKi8KKyAgc3VidHJlZSA9IGZpbmRfaGFuZGxlciAodHJlZSwgKGNvbnN0IGNoYXIqKikgcGF0aCwgJmV4YWN0X21hdGNoKTsKKyAgCisgIGlmIChmb3VuZF9vYmplY3QpCisgICAgKmZvdW5kX29iamVjdCA9ICEhc3VidHJlZTsKKworICAvKiBCdWlsZCBhIGxpc3Qgb2YgYWxsIHBhdGhzIHRoYXQgY292ZXIgdGhlIHBhdGggaW4gdGhlIG1lc3NhZ2UgKi8KKworICBsaXN0ID0gTlVMTDsKKworICB3aGlsZSAoc3VidHJlZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChzdWJ0cmVlLT5tZXNzYWdlX2Z1bmN0aW9uICE9IE5VTEwgJiYgKGV4YWN0X21hdGNoIHx8IHN1YnRyZWUtPmludm9rZV9hc19mYWxsYmFjaykpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19vYmplY3Rfc3VidHJlZV9yZWYgKHN1YnRyZWUpOworCisgICAgICAgICAgLyogcnVuIGRlZXBlc3QgcGF0aHMgZmlyc3QgKi8KKyAgICAgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmbGlzdCwgc3VidHJlZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlc3VsdCA9IERCVVNfSEFORExFUl9SRVNVTFRfTkVFRF9NRU1PUlk7CisgICAgICAgICAgICAgIF9kYnVzX29iamVjdF9zdWJ0cmVlX3VucmVmIChzdWJ0cmVlKTsKKyAgICAgICAgICAgICAgZ290byBmcmVlX2FuZF9yZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgZXhhY3RfbWF0Y2ggPSBGQUxTRTsKKyAgICAgIHN1YnRyZWUgPSBzdWJ0cmVlLT5wYXJlbnQ7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCIlZCBoYW5kbGVycyBpbiB0aGUgcGF0aCB0cmVlIGZvciB0aGlzIG1lc3NhZ2VcbiIsCisgICAgICAgICAgICAgICAgIF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAoJmxpc3QpKTsKKworICAvKiBJbnZva2UgZWFjaCBoYW5kbGVyIGluIHRoZSBsaXN0ICovCisKKyAgcmVzdWx0ID0gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZsaXN0KTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmxpc3QsIGxpbmspOworICAgICAgc3VidHJlZSA9IGxpbmstPmRhdGE7CisKKyAgICAgIC8qIG1lc3NhZ2VfZnVuY3Rpb24gaXMgTlVMTCBpZiB3ZSdyZSB1bnJlZ2lzdGVyZWQKKyAgICAgICAqIGR1ZSB0byByZWVudHJhbmN5CisgICAgICAgKi8KKyAgICAgIGlmIChzdWJ0cmVlLT5tZXNzYWdlX2Z1bmN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgREJ1c09iamVjdFBhdGhNZXNzYWdlRnVuY3Rpb24gbWVzc2FnZV9mdW5jdGlvbjsKKyAgICAgICAgICB2b2lkICp1c2VyX2RhdGE7CisKKyAgICAgICAgICBtZXNzYWdlX2Z1bmN0aW9uID0gc3VidHJlZS0+bWVzc2FnZV9mdW5jdGlvbjsKKyAgICAgICAgICB1c2VyX2RhdGEgPSBzdWJ0cmVlLT51c2VyX2RhdGE7CisKKyNpZiAwCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKGludm9raW5nIGEgaGFuZGxlcilcbiIpOworI2VuZGlmCisgICAgICAgICAgCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICAgICAgICAgIGlmICh0cmVlLT5jb25uZWN0aW9uKQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ1bmxvY2tcbiIpOworICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3VubG9jayAodHJlZS0+Y29ubmVjdGlvbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBGSVhNRSB5b3UgY291bGQgdW5yZWdpc3RlciB0aGUgc3VidHJlZSBpbiBhbm90aGVyIHRocmVhZAorICAgICAgICAgICAqIGJlZm9yZSB3ZSBpbnZva2UgdGhlIGNhbGxiYWNrLCBhbmQgSSBjYW4ndCBmaWd1cmUgb3V0IGEKKyAgICAgICAgICAgKiBnb29kIHdheSB0byBzb2x2ZSB0aGlzLgorICAgICAgICAgICAqLworCisgICAgICAgICAgcmVzdWx0ID0gKCogbWVzc2FnZV9mdW5jdGlvbikgKHRyZWUtPmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfZGF0YSk7CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgICAgICAgICAgaWYgKHRyZWUtPmNvbm5lY3Rpb24pCisjZW5kaWYKKyAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fbG9jayAodHJlZS0+Y29ubmVjdGlvbik7CisKKyAgICAgICAgICBpZiAocmVzdWx0ICE9IERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEKQorICAgICAgICAgICAgZ290byBmcmVlX2FuZF9yZXR1cm47CisgICAgICAgIH0KKworICAgICAgbGluayA9IG5leHQ7CisgICAgfQorCisgZnJlZV9hbmRfcmV0dXJuOgorCisgIGlmIChyZXN1bHQgPT0gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQpCisgICAgeworICAgICAgLyogVGhpcyBoYXJkY29kZWQgZGVmYXVsdCBoYW5kbGVyIGRvZXMgYSBtaW5pbWFsIEludHJvc3BlY3QoKQorICAgICAgICovCisgICAgICByZXN1bHQgPSBoYW5kbGVfZGVmYXVsdF9pbnRyb3NwZWN0X2FuZF91bmxvY2sgKHRyZWUsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyKiopIHBhdGgpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgICAgICBpZiAodHJlZS0+Y29ubmVjdGlvbikKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInVubG9ja1xuIik7CisgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl91bmxvY2sgKHRyZWUtPmNvbm5lY3Rpb24pOworICAgICAgICB9CisgICAgfQorICAKKyAgd2hpbGUgKGxpc3QgIT0gTlVMTCkKKyAgICB7CisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmxpc3QpOworICAgICAgX2RidXNfb2JqZWN0X3N1YnRyZWVfdW5yZWYgKGxpbmstPmRhdGEpOworICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAoJmxpc3QsIGxpbmspOworICAgIH0KKyAgCisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKHBhdGgpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogTG9va3MgdXAgdGhlIGRhdGEgcGFzc2VkIHRvIF9kYnVzX29iamVjdF90cmVlX3JlZ2lzdGVyKCkgZm9yIGEKKyAqIGhhbmRsZXIgYXQgdGhlIGdpdmVuIHBhdGguCisgKgorICogQHBhcmFtIHRyZWUgdGhlIGdsb2JhbCBvYmplY3QgdHJlZQorICogQHBhcmFtIHBhdGggTlVMTC10ZXJtaW5hdGVkIGFycmF5IG9mIHBhdGggZWxlbWVudHMgZ2l2aW5nIHBhdGggdG8gc3VidHJlZQorICogQHJldHVybnMgdGhlIG9iamVjdCdzIHVzZXJfZGF0YSBvciAjTlVMTCBpZiBub25lIGZvdW5kCisgKi8KK3ZvaWQqCitfZGJ1c19vYmplY3RfdHJlZV9nZXRfdXNlcl9kYXRhX3VubG9ja2VkIChEQnVzT2JqZWN0VHJlZSAqdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKipwYXRoKQoreworICBkYnVzX2Jvb2xfdCBleGFjdF9tYXRjaDsKKyAgREJ1c09iamVjdFN1YnRyZWUgKnN1YnRyZWU7CisKKyAgX2RidXNfYXNzZXJ0ICh0cmVlICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHBhdGggIT0gTlVMTCk7CisgIAorICAvKiBGaW5kIHRoZSBkZWVwZXN0IHBhdGggdGhhdCBjb3ZlcnMgdGhlIHBhdGggaW4gdGhlIG1lc3NhZ2UgKi8KKyAgc3VidHJlZSA9IGZpbmRfaGFuZGxlciAodHJlZSwgKGNvbnN0IGNoYXIqKikgcGF0aCwgJmV4YWN0X21hdGNoKTsKKworICBpZiAoKHN1YnRyZWUgPT0gTlVMTCkgfHwgIWV4YWN0X21hdGNoKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBvYmplY3QgYXQgc3BlY2lmaWVkIHBhdGggZm91bmRcbiIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJldHVybiBzdWJ0cmVlLT51c2VyX2RhdGE7Cit9CisKKy8qKgorICogQWxsb2NhdGVzIGEgc3VidHJlZSBvYmplY3QuCisgKgorICogQHBhcmFtIG5hbWUgbmFtZSB0byBkdXBsaWNhdGUuCisgKiBAcmV0dXJucyBuZXdseS1hbGxvY2F0ZWQgc3VidHJlZQorICovCitzdGF0aWMgREJ1c09iamVjdFN1YnRyZWUqCithbGxvY2F0ZV9zdWJ0cmVlX29iamVjdCAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgaW50IGxlbjsKKyAgREJ1c09iamVjdFN1YnRyZWUgKnN1YnRyZWU7CisgIGNvbnN0IHNpemVfdCBmcm9udF9wYWRkaW5nID0gX0RCVVNfU1RSVUNUX09GRlNFVCAoREJ1c09iamVjdFN1YnRyZWUsIG5hbWUpOworCisgIF9kYnVzX2Fzc2VydCAobmFtZSAhPSBOVUxMKTsKKworICBsZW4gPSBzdHJsZW4gKG5hbWUpOworCisgIHN1YnRyZWUgPSBkYnVzX21hbGxvYzAgKE1BWCAoZnJvbnRfcGFkZGluZyArIChsZW4gKyAxKSwgc2l6ZW9mIChEQnVzT2JqZWN0U3VidHJlZSkpKTsKKworICBpZiAoc3VidHJlZSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIG1lbWNweSAoc3VidHJlZS0+bmFtZSwgbmFtZSwgbGVuICsgMSk7CisKKyAgcmV0dXJuIHN1YnRyZWU7Cit9CisKK3N0YXRpYyBEQnVzT2JqZWN0U3VidHJlZSoKK19kYnVzX29iamVjdF9zdWJ0cmVlX25ldyAoY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzT2JqZWN0UGF0aFZUYWJsZSAgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIERCdXNPYmplY3RTdWJ0cmVlICpzdWJ0cmVlOworCisgIHN1YnRyZWUgPSBhbGxvY2F0ZV9zdWJ0cmVlX29iamVjdCAobmFtZSk7CisgIGlmIChzdWJ0cmVlID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgX2RidXNfYXNzZXJ0IChuYW1lICE9IE5VTEwpOworCisgIHN1YnRyZWUtPnBhcmVudCA9IE5VTEw7CisKKyAgaWYgKHZ0YWJsZSkKKyAgICB7CisgICAgICBzdWJ0cmVlLT5tZXNzYWdlX2Z1bmN0aW9uID0gdnRhYmxlLT5tZXNzYWdlX2Z1bmN0aW9uOworICAgICAgc3VidHJlZS0+dW5yZWdpc3Rlcl9mdW5jdGlvbiA9IHZ0YWJsZS0+dW5yZWdpc3Rlcl9mdW5jdGlvbjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzdWJ0cmVlLT5tZXNzYWdlX2Z1bmN0aW9uID0gTlVMTDsKKyAgICAgIHN1YnRyZWUtPnVucmVnaXN0ZXJfZnVuY3Rpb24gPSBOVUxMOworICAgIH0KKworICBzdWJ0cmVlLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisgIF9kYnVzX2F0b21pY19pbmMgKCZzdWJ0cmVlLT5yZWZjb3VudCk7CisgIHN1YnRyZWUtPnN1YnRyZWVzID0gTlVMTDsKKyAgc3VidHJlZS0+bl9zdWJ0cmVlcyA9IDA7CisgIHN1YnRyZWUtPm1heF9zdWJ0cmVlcyA9IDA7CisgIHN1YnRyZWUtPmludm9rZV9hc19mYWxsYmFjayA9IEZBTFNFOworCisgIHJldHVybiBzdWJ0cmVlOworCisgb29tOgorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIERCdXNPYmplY3RTdWJ0cmVlICoKK19kYnVzX29iamVjdF9zdWJ0cmVlX3JlZiAoREJ1c09iamVjdFN1YnRyZWUgKnN1YnRyZWUpCit7CisjaWZkZWYgREJVU19ESVNBQkxFX0FTU0VSVAorICBfZGJ1c19hdG9taWNfaW5jICgmc3VidHJlZS0+cmVmY291bnQpOworI2Vsc2UKKyAgZGJ1c19pbnQzMl90IG9sZF92YWx1ZTsKKworICBvbGRfdmFsdWUgPSBfZGJ1c19hdG9taWNfaW5jICgmc3VidHJlZS0+cmVmY291bnQpOworICBfZGJ1c19hc3NlcnQgKG9sZF92YWx1ZSA+IDApOworI2VuZGlmCisKKyAgcmV0dXJuIHN1YnRyZWU7Cit9CisKK3N0YXRpYyB2b2lkCitfZGJ1c19vYmplY3Rfc3VidHJlZV91bnJlZiAoREJ1c09iamVjdFN1YnRyZWUgKnN1YnRyZWUpCit7CisgIGRidXNfaW50MzJfdCBvbGRfdmFsdWU7CisKKyAgb2xkX3ZhbHVlID0gX2RidXNfYXRvbWljX2RlYyAoJnN1YnRyZWUtPnJlZmNvdW50KTsKKyAgX2RidXNfYXNzZXJ0IChvbGRfdmFsdWUgPiAwKTsKKworICBpZiAob2xkX3ZhbHVlID09IDEpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChzdWJ0cmVlLT51bnJlZ2lzdGVyX2Z1bmN0aW9uID09IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChzdWJ0cmVlLT5tZXNzYWdlX2Z1bmN0aW9uID09IE5VTEwpOworCisgICAgICBkYnVzX2ZyZWUgKHN1YnRyZWUtPnN1YnRyZWVzKTsKKyAgICAgIGRidXNfZnJlZSAoc3VidHJlZSk7CisgICAgfQorfQorCisvKioKKyAqIExpc3RzIHRoZSByZWdpc3RlcmVkIGZhbGxiYWNrIGhhbmRsZXJzIGFuZCBvYmplY3QgcGF0aCBoYW5kbGVycyBhdAorICogdGhlIGdpdmVuIHBhcmVudF9wYXRoLiBUaGUgcmV0dXJuZWQgYXJyYXkgc2hvdWxkIGJlIGZyZWVkIHdpdGgKKyAqIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkoKS4KKyAqCisgKiBAcGFyYW0gdHJlZSB0aGUgb2JqZWN0IHRyZWUKKyAqIEBwYXJhbSBwYXJlbnRfcGF0aCB0aGUgcGF0aCB0byBsaXN0IHRoZSBjaGlsZCBoYW5kbGVycyBvZgorICogQHBhcmFtIGNoaWxkX2VudHJpZXMgcmV0dXJucyAjTlVMTC10ZXJtaW5hdGVkIGFycmF5IG9mIGNoaWxkcmVuCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSBjaGlsZCBlbnRyaWVzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19vYmplY3RfdHJlZV9saXN0X3JlZ2lzdGVyZWRfYW5kX3VubG9jayAoREJ1c09iamVjdFRyZWUgKnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqKnBhcmVudF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAqKipjaGlsZF9lbnRyaWVzKQoreworICBkYnVzX2Jvb2xfdCByZXN1bHQ7CisKKyAgcmVzdWx0ID0gX2RidXNfb2JqZWN0X3RyZWVfbGlzdF9yZWdpc3RlcmVkX3VubG9ja2VkICh0cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX2VudHJpZXMpOworICAKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgIGlmICh0cmVlLT5jb25uZWN0aW9uKQorI2VuZGlmCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoInVubG9ja1xuIik7CisgICAgICBfZGJ1c19jb25uZWN0aW9uX3VubG9jayAodHJlZS0+Y29ubmVjdGlvbik7CisgICAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyoqIFNldCB0byAxIHRvIGdldCBhIGJ1bmNoIG9mIHNwZXcgYWJvdXQgZGlzYXNzZW1ibGluZyB0aGUgcGF0aCBzdHJpbmcgKi8KKyNkZWZpbmUgVkVSQk9TRV9ERUNPTVBPU0UgMAorCisvKioKKyAqIERlY29tcG9zZSBhbiBvYmplY3QgcGF0aC4gIEEgcGF0aCBvZiBqdXN0ICIvIiBpcworICogcmVwcmVzZW50ZWQgYXMgYW4gZW1wdHkgdmVjdG9yIG9mIHN0cmluZ3MuCisgKiBUaGUgcGF0aCBuZWVkIG5vdCBiZSBudWwgdGVybWluYXRlZC4KKyAqIAorICogQHBhcmFtIGRhdGEgdGhlIHBhdGggZGF0YQorICogQHBhcmFtIGxlbiAgdGhlIGxlbmd0aCBvZiB0aGUgcGF0aCBzdHJpbmcKKyAqIEBwYXJhbSBwYXRoIGFkZHJlc3MgdG8gc3RvcmUgbmV3IG9iamVjdCBwYXRoCisgKiBAcGFyYW0gcGF0aF9sZW4gbGVuZ3RoIG9mIHN0b3JlZCBwYXRoCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19kZWNvbXBvc2VfcGF0aCAoY29uc3QgY2hhciogICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgKioqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAqcGF0aF9sZW4pCit7CisgIGNoYXIgKipyZXR2YWw7CisgIGludCBuX2NvbXBvbmVudHM7CisgIGludCBpLCBqLCBjb21wOworCisgIF9kYnVzX2Fzc2VydCAoZGF0YSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChwYXRoICE9IE5VTEwpOworICAKKyNpZiBWRVJCT1NFX0RFQ09NUE9TRQorICBfZGJ1c192ZXJib3NlICgiRGVjb21wb3NpbmcgcGF0aCBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgIGRhdGEpOworI2VuZGlmCisgIAorICBuX2NvbXBvbmVudHMgPSAwOworICBpZiAobGVuID4gMSkgLyogaWYgcGF0aCBpcyBub3QganVzdCAiLyIgKi8KKyAgICB7CisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChpIDwgbGVuKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfYXNzZXJ0IChkYXRhW2ldICE9ICdcMCcpOworICAgICAgICAgIGlmIChkYXRhW2ldID09ICcvJykKKyAgICAgICAgICAgIG5fY29tcG9uZW50cyArPSAxOworICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIHJldHZhbCA9IGRidXNfbmV3MCAoY2hhciosIG5fY29tcG9uZW50cyArIDEpOworCisgIGlmIChyZXR2YWwgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgY29tcCA9IDA7CisgIGlmIChuX2NvbXBvbmVudHMgPT0gMCkKKyAgICBpID0gMTsKKyAgZWxzZQorICAgIGkgPSAwOworICB3aGlsZSAoY29tcCA8IG5fY29tcG9uZW50cykKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKGkgPCBsZW4pOworICAgICAgCisgICAgICBpZiAoZGF0YVtpXSA9PSAnLycpCisgICAgICAgICsraTsKKyAgICAgIGogPSBpOworCisgICAgICB3aGlsZSAoaiA8IGxlbiAmJiBkYXRhW2pdICE9ICcvJykKKyAgICAgICAgKytqOworCisgICAgICAvKiBOb3cgW2ksIGopIGlzIHRoZSBwYXRoIGNvbXBvbmVudCAqLworICAgICAgX2RidXNfYXNzZXJ0IChpIDwgaik7CisgICAgICBfZGJ1c19hc3NlcnQgKGRhdGFbaV0gIT0gJy8nKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoaiA9PSBsZW4gfHwgZGF0YVtqXSA9PSAnLycpOworCisjaWYgVkVSQk9TRV9ERUNPTVBPU0UKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChjb21wb25lbnQgaW4gWyVkLCVkKSlcbiIsCisgICAgICAgICAgICAgICAgICAgICBpLCBqKTsKKyNlbmRpZgorICAgICAgCisgICAgICByZXR2YWxbY29tcF0gPSBfZGJ1c19tZW1kdXAgKCZkYXRhW2ldLCBqIC0gaSArIDEpOworICAgICAgaWYgKHJldHZhbFtjb21wXSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAocmV0dmFsKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIHJldHZhbFtjb21wXVtqLWldID0gJ1wwJzsKKyNpZiBWRVJCT1NFX0RFQ09NUE9TRQorICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKGNvbXBvbmVudCAlZCA9IFwiJXNcIilcbiIsCisgICAgICAgICAgICAgICAgICAgICBjb21wLCByZXR2YWxbY29tcF0pOworI2VuZGlmCisKKyAgICAgICsrY29tcDsKKyAgICAgIGkgPSBqOworICAgIH0KKyAgX2RidXNfYXNzZXJ0IChpID09IGxlbik7CisgIAorICAqcGF0aCA9IHJldHZhbDsKKyAgaWYgKHBhdGhfbGVuKQorICAgICpwYXRoX2xlbiA9IG5fY29tcG9uZW50czsKKyAgCisgIHJldHVybiBUUlVFOworfQorCisvKiogQH0gKi8KKworc3RhdGljIGNoYXIqCitmbGF0dGVuX3BhdGggKGNvbnN0IGNoYXIgKipwYXRoKQoreworICBEQnVzU3RyaW5nIHN0cjsKKyAgY2hhciAqczsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAocGF0aFswXSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmc3RyLCAnLycpKQorICAgICAgICBnb3RvIG5vbWVtOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgCisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChwYXRoW2ldKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZzdHIsICcvJykpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgIAorICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgcGF0aFtpXSkpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgIAorICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgmc3RyLCAmcykpCisgICAgZ290byBub21lbTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisKKyAgcmV0dXJuIHM7CisKKyBub21lbToKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICByZXR1cm4gTlVMTDsKK30KKworCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworCisjaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUworCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKwordHlwZWRlZiBlbnVtIAoreworICBTVFJfRVFVQUwsCisgIFNUUl9QUkVGSVgsCisgIFNUUl9ESUZGRVJFTlQKK30gU3RyQ29tcGFyaXNvbjsKKworLyogUmV0dXJucyBUUlVFIGlmIGNvbnRhaW5lciBpcyBhIHBhcmVudCBvZiBjaGlsZAorICovCitzdGF0aWMgU3RyQ29tcGFyaXNvbgorcGF0aF9jb250YWlucyAoY29uc3QgY2hhciAqKmNvbnRhaW5lciwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipjaGlsZCkKK3sKKyAgaW50IGk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChjaGlsZFtpXSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGludCB2OworCisgICAgICBpZiAoY29udGFpbmVyW2ldID09IE5VTEwpCisgICAgICAgIHJldHVybiBTVFJfUFJFRklYOyAvKiBjb250YWluZXIgcmFuIG91dCwgY2hpbGQgY29udGludWVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGh1cyB0aGUgY29udGFpbmVyIGlzIGEgcGFyZW50IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY2hpbGQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgX2RidXNfYXNzZXJ0IChjb250YWluZXJbaV0gIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKGNoaWxkW2ldICE9IE5VTEwpOworCisgICAgICB2ID0gc3RyY21wIChjb250YWluZXJbaV0sIGNoaWxkW2ldKTsKKworICAgICAgaWYgKHYgIT0gMCkKKyAgICAgICAgcmV0dXJuIFNUUl9ESUZGRVJFTlQ7IC8qIHRoZXkgb3ZlcmxhcCB1bnRpbCBoZXJlIGFuZCB0aGVuIGFyZSBkaWZmZXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBub3Qgb3ZlcmxhcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICArK2k7CisgICAgfQorCisgIC8qIENoaWxkIHJhbiBvdXQ7IGlmIGNvbnRhaW5lciBhbHNvIGRpZCwgdGhleSBhcmUgZXF1YWw7CisgICAqIG90aGVyd2lzZSwgdGhlIGNoaWxkIGlzIGEgcGFyZW50IG9mIHRoZSBjb250YWluZXIuCisgICAqLworICBpZiAoY29udGFpbmVyW2ldID09IE5VTEwpCisgICAgcmV0dXJuIFNUUl9FUVVBTDsKKyAgZWxzZQorICAgIHJldHVybiBTVFJfRElGRkVSRU5UOworfQorCisjaWYgMAorc3RhdGljIHZvaWQKK3NwZXdfc3VidHJlZV9yZWN1cnNlIChEQnVzT2JqZWN0U3VidHJlZSAqc3VidHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgaW5kZW50KQoreworICBpbnQgaTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBpbmRlbnQpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIiAiKTsKKyAgICAgICsraTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIiVzICglZCBjaGlsZHJlbilcbiIsCisgICAgICAgICAgICAgICAgIHN1YnRyZWUtPm5hbWUsIHN1YnRyZWUtPm5fc3VidHJlZXMpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IHN1YnRyZWUtPm5fc3VidHJlZXMpCisgICAgeworICAgICAgc3Bld19zdWJ0cmVlX3JlY3Vyc2UgKHN1YnRyZWUtPnN1YnRyZWVzW2ldLCBpbmRlbnQgKyAyKTsKKworICAgICAgKytpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3NwZXdfdHJlZSAoREJ1c09iamVjdFRyZWUgKnRyZWUpCit7CisgIHNwZXdfc3VidHJlZV9yZWN1cnNlICh0cmVlLT5yb290LCAwKTsKK30KKyNlbmRpZgorCisvKioKKyAqIENhbGxiYWNrIGRhdGEgdXNlZCBpbiB0ZXN0cworICovCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBjaGFyICoqcGF0aDsgLyoqPCBQYXRoICovCisgIGRidXNfYm9vbF90IGhhbmRsZXJfZmFsbGJhY2s7IC8qKjwgdHJ1ZSBpZiB0aGUgaGFuZGxlciBtYXkgYmUgY2FsbGVkIGFzIGZhbGxiYWNrICovCisgIGRidXNfYm9vbF90IG1lc3NhZ2VfaGFuZGxlZDsgLyoqPCBHZXRzIHNldCB0byB0cnVlIGlmIG1lc3NhZ2UgaGFuZGxlciBjYWxsZWQgKi8KKyAgZGJ1c19ib29sX3QgaGFuZGxlcl91bnJlZ2lzdGVyZWQ7IC8qKjwgZ2V0cyBzZXQgdG8gdHJ1ZSBpZiBoYW5kbGVyIGlzIHVucmVnaXN0ZXJlZCAqLworfSBUcmVlVGVzdERhdGE7CisKKworc3RhdGljIHZvaWQKK3Rlc3RfdW5yZWdpc3Rlcl9mdW5jdGlvbiAoREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgVHJlZVRlc3REYXRhICp0dGQgPSB1c2VyX2RhdGE7CisKKyAgdHRkLT5oYW5kbGVyX3VucmVnaXN0ZXJlZCA9IFRSVUU7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAordGVzdF9tZXNzYWdlX2Z1bmN0aW9uIChEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIFRyZWVUZXN0RGF0YSAqdHRkID0gdXNlcl9kYXRhOworCisgIHR0ZC0+bWVzc2FnZV9oYW5kbGVkID0gVFJVRTsKKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZG9fcmVnaXN0ZXIgKERCdXNPYmplY3RUcmVlICp0cmVlLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKipwYXRoLAorICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICBmYWxsYmFjaywKKyAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICBUcmVlVGVzdERhdGEgICAqdHJlZV90ZXN0X2RhdGEpCit7CisgIERCdXNPYmplY3RQYXRoVlRhYmxlIHZ0YWJsZSA9IHsgdGVzdF91bnJlZ2lzdGVyX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbWVzc2FnZV9mdW5jdGlvbiwgTlVMTCB9OworCisgIHRyZWVfdGVzdF9kYXRhW2ldLm1lc3NhZ2VfaGFuZGxlZCA9IEZBTFNFOworICB0cmVlX3Rlc3RfZGF0YVtpXS5oYW5kbGVyX3VucmVnaXN0ZXJlZCA9IEZBTFNFOworICB0cmVlX3Rlc3RfZGF0YVtpXS5oYW5kbGVyX2ZhbGxiYWNrID0gZmFsbGJhY2s7CisgIHRyZWVfdGVzdF9kYXRhW2ldLnBhdGggPSBwYXRoOworCisgIGlmICghX2RidXNfb2JqZWN0X3RyZWVfcmVnaXN0ZXIgKHRyZWUsIGZhbGxiYWNrLCBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJlZV90ZXN0X2RhdGFbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX29iamVjdF90cmVlX2dldF91c2VyX2RhdGFfdW5sb2NrZWQgKHRyZWUsIHBhdGgpID09CisgICAgICAgICAgICAgICAgJnRyZWVfdGVzdF9kYXRhW2ldKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2RvX3Rlc3RfZGlzcGF0Y2ggKERCdXNPYmplY3RUcmVlICp0cmVlLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqKnBhdGgsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgIFRyZWVUZXN0RGF0YSAgICp0cmVlX3Rlc3RfZGF0YSwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBuX3Rlc3RfZGF0YSkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGludCBqOworICBEQnVzSGFuZGxlclJlc3VsdCByZXN1bHQ7CisgIGNoYXIgKmZsYXQ7CisKKyAgbWVzc2FnZSA9IE5VTEw7CisgIAorICBmbGF0ID0gZmxhdHRlbl9wYXRoIChwYXRoKTsKKyAgaWYgKGZsYXQgPT0gTlVMTCkKKyAgICBnb3RvIG9vbTsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLlRlc3RJbnRlcmZhY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvbyIpOworICBkYnVzX2ZyZWUgKGZsYXQpOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIGogPSAwOworICB3aGlsZSAoaiA8IG5fdGVzdF9kYXRhKQorICAgIHsKKyAgICAgIHRyZWVfdGVzdF9kYXRhW2pdLm1lc3NhZ2VfaGFuZGxlZCA9IEZBTFNFOworICAgICAgKytqOworICAgIH0KKworICByZXN1bHQgPSBfZGJ1c19vYmplY3RfdHJlZV9kaXNwYXRjaF9hbmRfdW5sb2NrICh0cmVlLCBtZXNzYWdlLCBOVUxMKTsKKyAgaWYgKHJlc3VsdCA9PSBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZKQorICAgIGdvdG8gb29tOworCisgIF9kYnVzX2Fzc2VydCAodHJlZV90ZXN0X2RhdGFbaV0ubWVzc2FnZV9oYW5kbGVkKTsKKworICBqID0gMDsKKyAgd2hpbGUgKGogPCBuX3Rlc3RfZGF0YSkKKyAgICB7CisgICAgICBpZiAodHJlZV90ZXN0X2RhdGFbal0ubWVzc2FnZV9oYW5kbGVkKQorCXsKKwkgIGlmICh0cmVlX3Rlc3RfZGF0YVtqXS5oYW5kbGVyX2ZhbGxiYWNrKQorCSAgICBfZGJ1c19hc3NlcnQgKHBhdGhfY29udGFpbnMgKHRyZWVfdGVzdF9kYXRhW2pdLnBhdGgsCisJCQkJCSBwYXRoKSAhPSBTVFJfRElGRkVSRU5UKTsKKwkgIGVsc2UKKwkgICAgX2RidXNfYXNzZXJ0IChwYXRoX2NvbnRhaW5zICh0cmVlX3Rlc3RfZGF0YVtqXS5wYXRoLCBwYXRoKSA9PSBTVFJfRVFVQUwpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAodHJlZV90ZXN0X2RhdGFbal0uaGFuZGxlcl9mYWxsYmFjaykKKwkgICAgX2RidXNfYXNzZXJ0IChwYXRoX2NvbnRhaW5zICh0cmVlX3Rlc3RfZGF0YVtqXS5wYXRoLAorCQkJCQkgcGF0aCkgPT0gU1RSX0RJRkZFUkVOVCk7CisJICBlbHNlCisJICAgIF9kYnVzX2Fzc2VydCAocGF0aF9jb250YWlucyAodHJlZV90ZXN0X2RhdGFbal0ucGF0aCwgcGF0aCkgIT0gU1RSX0VRVUFMKTsKKwl9CisKKyAgICAgICsrajsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgc2l6ZV90CitzdHJpbmdfYXJyYXlfbGVuZ3RoIChjb25zdCBjaGFyICoqYXJyYXkpCit7CisgIHNpemVfdCBpOworICBmb3IgKGkgPSAwOyBhcnJheVtpXTsgaSsrKSA7CisgIHJldHVybiBpOworfQorCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBjaGFyICpwYXRoOworICBjb25zdCBjaGFyICpyZXN1bHRbMjBdOworfSBEZWNvbXBvc2VQYXRoVGVzdDsKKworc3RhdGljIERlY29tcG9zZVBhdGhUZXN0IGRlY29tcG9zZV90ZXN0c1tdID0geworICB7ICIvZm9vIiwgeyAiZm9vIiwgTlVMTCB9IH0sCisgIHsgIi9mb28vYmFyIiwgeyAiZm9vIiwgImJhciIsIE5VTEwgfSB9LAorICB7ICIvIiwgeyBOVUxMIH0gfSwKKyAgeyAiL2EvYiIsIHsgImEiLCAiYiIsIE5VTEwgfSB9LAorICB7ICIvYS9iL2MiLCB7ICJhIiwgImIiLCAiYyIsIE5VTEwgfSB9LAorICB7ICIvYS9iL2MvZCIsIHsgImEiLCAiYiIsICJjIiwgImQiLCBOVUxMIH0gfSwKKyAgeyAiL2Zvby9iYXIvcSIsIHsgImZvbyIsICJiYXIiLCAicSIsIE5VTEwgfSB9LAorICB7ICIvZm9vL2Jhci90aGlzL2lzL2xvbmdlciIsIHsgImZvbyIsICJiYXIiLCAidGhpcyIsICJpcyIsICJsb25nZXIiLCBOVUxMIH0gfQorfTsKKworc3RhdGljIGRidXNfYm9vbF90CitydW5fZGVjb21wb3NlX3Rlc3RzICh2b2lkKQoreworICBpbnQgaTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBfREJVU19OX0VMRU1FTlRTIChkZWNvbXBvc2VfdGVzdHMpKQorICAgIHsKKyAgICAgIGNoYXIgKipyZXN1bHQ7CisgICAgICBpbnQgICAgcmVzdWx0X2xlbjsKKyAgICAgIGludCAgICBleHBlY3RlZF9sZW47CisKKyAgICAgIGlmICghX2RidXNfZGVjb21wb3NlX3BhdGggKGRlY29tcG9zZV90ZXN0c1tpXS5wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuIChkZWNvbXBvc2VfdGVzdHNbaV0ucGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0LCAmcmVzdWx0X2xlbikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgZXhwZWN0ZWRfbGVuID0gc3RyaW5nX2FycmF5X2xlbmd0aCAoZGVjb21wb3NlX3Rlc3RzW2ldLnJlc3VsdCk7CisgICAgICAKKyAgICAgIGlmIChyZXN1bHRfbGVuICE9IChpbnQpIHN0cmluZ19hcnJheV9sZW5ndGggKChjb25zdCBjaGFyKiopcmVzdWx0KSB8fAorICAgICAgICAgIGV4cGVjdGVkX2xlbiAhPSByZXN1bHRfbGVuIHx8CisgICAgICAgICAgcGF0aF9jb250YWlucyAoZGVjb21wb3NlX3Rlc3RzW2ldLnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhcioqKSByZXN1bHQpICE9IFNUUl9FUVVBTCkKKyAgICAgICAgeworICAgICAgICAgIGludCByZWFsX2xlbiA9IHN0cmluZ19hcnJheV9sZW5ndGggKChjb25zdCBjaGFyKiopcmVzdWx0KTsKKyAgICAgICAgICBfZGJ1c193YXJuICgiRXhwZWN0ZWQgZGVjb21wb3NlIG9mICVzIHRvIGhhdmUgbGVuICVkLCByZXR1cm5lZCAlZCwgYXBwZWFycyB0byBoYXZlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGRlY29tcG9zZV90ZXN0c1tpXS5wYXRoLCBleHBlY3RlZF9sZW4sIHJlc3VsdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgcmVhbF9sZW4pOworICAgICAgICAgIF9kYnVzX3dhcm4gKCJEZWNvbXBvc2UgcmVzdWx0ZWQgaW4gZWxlbWVudHM6IHsgIik7CisgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgd2hpbGUgKGkgPCByZWFsX2xlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIlwiJXNcIiVzIiwgcmVzdWx0W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaSArIDEpID09IHJlYWxfbGVuID8gIiIgOiAiLCAiKTsKKyAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgfQorICAgICAgICAgIF9kYnVzX3dhcm4gKCJ9XG4iKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJwYXRoIGRlY29tcG9zZSBmYWlsZWRcbiIpOworICAgICAgICB9CisKKyAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKHJlc3VsdCk7CisKKyAgICAgICsraTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitvYmplY3RfdHJlZV90ZXN0X2l0ZXJhdGlvbiAodm9pZCAqZGF0YSkKK3sKKyAgY29uc3QgY2hhciAqcGF0aDBbXSA9IHsgTlVMTCB9OworICBjb25zdCBjaGFyICpwYXRoMVtdID0geyAiZm9vIiwgTlVMTCB9OworICBjb25zdCBjaGFyICpwYXRoMltdID0geyAiZm9vIiwgImJhciIsIE5VTEwgfTsKKyAgY29uc3QgY2hhciAqcGF0aDNbXSA9IHsgImZvbyIsICJiYXIiLCAiYmF6IiwgTlVMTCB9OworICBjb25zdCBjaGFyICpwYXRoNFtdID0geyAiZm9vIiwgImJhciIsICJib28iLCBOVUxMIH07CisgIGNvbnN0IGNoYXIgKnBhdGg1W10gPSB7ICJibGFoIiwgTlVMTCB9OworICBjb25zdCBjaGFyICpwYXRoNltdID0geyAiYmxhaCIsICJib29mIiwgTlVMTCB9OworICBjb25zdCBjaGFyICpwYXRoN1tdID0geyAiYmxhaCIsICJib29mIiwgInRoaXMiLCAiaXMiLCAicmVhbGx5IiwgImxvbmciLCBOVUxMIH07CisgIGNvbnN0IGNoYXIgKnBhdGg4W10gPSB7ICJjaGlsZGxlc3MiLCBOVUxMIH07CisgIERCdXNPYmplY3RUcmVlICp0cmVlOworICBUcmVlVGVzdERhdGEgdHJlZV90ZXN0X2RhdGFbOV07CisgIGludCBpOworICBkYnVzX2Jvb2xfdCBleGFjdF9tYXRjaDsKKworICBpZiAoIXJ1bl9kZWNvbXBvc2VfdGVzdHMgKCkpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgdHJlZSA9IE5VTEw7CisKKyAgdHJlZSA9IF9kYnVzX29iamVjdF90cmVlX25ldyAoTlVMTCk7CisgIGlmICh0cmVlID09IE5VTEwpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDAsIFRSVUUsIDAsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDAsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgyLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDMsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg1LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDYsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg4LCBOVUxMKSk7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGgwLCAmZXhhY3RfbWF0Y2gpICYmIGV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGgxLCAmZXhhY3RfbWF0Y2gpID09IHRyZWUtPnJvb3QgJiYgIWV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGgyLCAmZXhhY3RfbWF0Y2gpID09IHRyZWUtPnJvb3QgJiYgIWV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGgzLCAmZXhhY3RfbWF0Y2gpID09IHRyZWUtPnJvb3QgJiYgIWV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGg0LCAmZXhhY3RfbWF0Y2gpID09IHRyZWUtPnJvb3QgJiYgIWV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGg1LCAmZXhhY3RfbWF0Y2gpID09IHRyZWUtPnJvb3QgJiYgIWV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGg2LCAmZXhhY3RfbWF0Y2gpID09IHRyZWUtPnJvb3QgJiYgIWV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGg3LCAmZXhhY3RfbWF0Y2gpID09IHRyZWUtPnJvb3QgJiYgIWV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGg4LCAmZXhhY3RfbWF0Y2gpID09IHRyZWUtPnJvb3QgJiYgIWV4YWN0X21hdGNoKTsKKyAgCisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgxLCBUUlVFLCAxLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgyLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDMsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg1LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDYsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg4LCBOVUxMKSk7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGgwLCAmZXhhY3RfbWF0Y2gpICYmICBleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMSwgJmV4YWN0X21hdGNoKSAmJiAgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDIsICZleGFjdF9tYXRjaCkgJiYgIWV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGgzLCAmZXhhY3RfbWF0Y2gpICYmICFleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoNCwgJmV4YWN0X21hdGNoKSAmJiAhZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDUsICZleGFjdF9tYXRjaCkgPT0gdHJlZS0+cm9vdCAmJiAhZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDYsICZleGFjdF9tYXRjaCkgPT0gdHJlZS0+cm9vdCAmJiAhZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDcsICZleGFjdF9tYXRjaCkgPT0gdHJlZS0+cm9vdCAmJiAhZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDgsICZleGFjdF9tYXRjaCkgPT0gdHJlZS0+cm9vdCAmJiAhZXhhY3RfbWF0Y2gpOworCisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgyLCBUUlVFLCAyLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDQsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDcsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworCisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgzLCBUUlVFLCAzLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDQsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDcsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworICAKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDQsIFRSVUUsIDQsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDAsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDMsIE5VTEwpKTsgIAorICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDQsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDcsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworICAKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDUsIFRSVUUsIDUsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDAsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDMsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDcsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworCisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMCwgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICBleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMSwgJmV4YWN0X21hdGNoKSAhPSB0cmVlLT5yb290ICYmICBleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMiwgJmV4YWN0X21hdGNoKSAhPSB0cmVlLT5yb290ICYmICBleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMywgJmV4YWN0X21hdGNoKSAhPSB0cmVlLT5yb290ICYmICBleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoNCwgJmV4YWN0X21hdGNoKSAhPSB0cmVlLT5yb290ICYmICBleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoNSwgJmV4YWN0X21hdGNoKSAhPSB0cmVlLT5yb290ICYmICBleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoNiwgJmV4YWN0X21hdGNoKSAhPSB0cmVlLT5yb290ICYmICFleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoNywgJmV4YWN0X21hdGNoKSAhPSB0cmVlLT5yb290ICYmICFleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoOCwgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICFleGFjdF9tYXRjaCk7CisKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDYsIFRSVUUsIDYsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDAsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDMsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDYsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg4LCBOVUxMKSk7CisKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDcsIFRSVUUsIDcsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDAsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDMsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDYsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg3LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKworICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoOCwgVFJVRSwgOCwgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworCisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgyLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDQsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg1LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDcsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg4LCBOVUxMKSk7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGgwLCAmZXhhY3RfbWF0Y2gpID09IHRyZWUtPnJvb3QgJiYgIGV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGgxLCAmZXhhY3RfbWF0Y2gpICE9IHRyZWUtPnJvb3QgJiYgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDIsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiBleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMywgJmV4YWN0X21hdGNoKSAhPSB0cmVlLT5yb290ICYmIGV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGg0LCAmZXhhY3RfbWF0Y2gpICE9IHRyZWUtPnJvb3QgJiYgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDUsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiBleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoNiwgJmV4YWN0X21hdGNoKSAhPSB0cmVlLT5yb290ICYmIGV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGg3LCAmZXhhY3RfbWF0Y2gpICE9IHRyZWUtPnJvb3QgJiYgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDgsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiBleGFjdF9tYXRjaCk7CisgIAorICAvKiB0ZXN0IHRoZSBsaXN0X3JlZ2lzdGVyZWQgZnVuY3Rpb24gKi8KKworICB7CisgICAgY29uc3QgY2hhciAqcm9vdFtdID0geyBOVUxMIH07CisgICAgY2hhciAqKmNoaWxkX2VudHJpZXM7CisgICAgaW50IG5iOworCisgICAgX2RidXNfb2JqZWN0X3RyZWVfbGlzdF9yZWdpc3RlcmVkX3VubG9ja2VkICh0cmVlLCBwYXRoMSwgJmNoaWxkX2VudHJpZXMpOworICAgIGlmIChjaGlsZF9lbnRyaWVzICE9IE5VTEwpCisgICAgICB7CisJbmIgPSBzdHJpbmdfYXJyYXlfbGVuZ3RoICgoY29uc3QgY2hhcioqKWNoaWxkX2VudHJpZXMpOworCV9kYnVzX2Fzc2VydCAobmIgPT0gMSk7CisJZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoY2hpbGRfZW50cmllcyk7CisgICAgICB9CisKKyAgICBfZGJ1c19vYmplY3RfdHJlZV9saXN0X3JlZ2lzdGVyZWRfdW5sb2NrZWQgKHRyZWUsIHBhdGgyLCAmY2hpbGRfZW50cmllcyk7CisgICAgaWYgKGNoaWxkX2VudHJpZXMgIT0gTlVMTCkKKyAgICAgIHsKKwluYiA9IHN0cmluZ19hcnJheV9sZW5ndGggKChjb25zdCBjaGFyKiopY2hpbGRfZW50cmllcyk7CisJX2RidXNfYXNzZXJ0IChuYiA9PSAyKTsKKwlkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChjaGlsZF9lbnRyaWVzKTsKKyAgICAgIH0KKworICAgIF9kYnVzX29iamVjdF90cmVlX2xpc3RfcmVnaXN0ZXJlZF91bmxvY2tlZCAodHJlZSwgcGF0aDgsICZjaGlsZF9lbnRyaWVzKTsKKyAgICBpZiAoY2hpbGRfZW50cmllcyAhPSBOVUxMKQorICAgICAgeworCW5iID0gc3RyaW5nX2FycmF5X2xlbmd0aCAoKGNvbnN0IGNoYXIqKiljaGlsZF9lbnRyaWVzKTsKKwlfZGJ1c19hc3NlcnQgKG5iID09IDApOworCWRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGNoaWxkX2VudHJpZXMpOworICAgICAgfQorCisgICAgX2RidXNfb2JqZWN0X3RyZWVfbGlzdF9yZWdpc3RlcmVkX3VubG9ja2VkICh0cmVlLCByb290LCAmY2hpbGRfZW50cmllcyk7CisgICAgaWYgKGNoaWxkX2VudHJpZXMgIT0gTlVMTCkKKyAgICAgIHsKKwluYiA9IHN0cmluZ19hcnJheV9sZW5ndGggKChjb25zdCBjaGFyKiopY2hpbGRfZW50cmllcyk7CisJX2RidXNfYXNzZXJ0IChuYiA9PSAzKTsKKwlkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChjaGlsZF9lbnRyaWVzKTsKKyAgICAgIH0KKyAgfQorCisgIC8qIENoZWNrIHRoYXQgZGVzdHJveWluZyB0cmVlIGNhbGxzIHVucmVnaXN0ZXIgZnVuY3MgKi8KKyAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWYgKHRyZWUpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IChpbnQpIF9EQlVTX05fRUxFTUVOVFMgKHRyZWVfdGVzdF9kYXRhKSkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHRyZWVfdGVzdF9kYXRhW2ldLmhhbmRsZXJfdW5yZWdpc3RlcmVkKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoIXRyZWVfdGVzdF9kYXRhW2ldLm1lc3NhZ2VfaGFuZGxlZCk7CisgICAgICArK2k7CisgICAgfQorCisgIC8qIE5vdyBzdGFydCBhZ2FpbiBhbmQgdHJ5IHRoZSBpbmRpdmlkdWFsIHVucmVnaXN0ZXIgZnVuY3Rpb24gKi8KKyAgdHJlZSA9IF9kYnVzX29iamVjdF90cmVlX25ldyAoTlVMTCk7CisgIGlmICh0cmVlID09IE5VTEwpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDAsIFRSVUUsIDAsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDEsIFRSVUUsIDEsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDIsIFRSVUUsIDIsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDMsIFRSVUUsIDMsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDQsIFRSVUUsIDQsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDUsIFRSVUUsIDUsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDYsIFRSVUUsIDYsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDcsIFRSVUUsIDcsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDgsIFRSVUUsIDgsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKworICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZ2lzdGVyX2FuZF91bmxvY2sgKHRyZWUsIHBhdGgwKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19vYmplY3RfdHJlZV9nZXRfdXNlcl9kYXRhX3VubG9ja2VkICh0cmVlLCBwYXRoMCkgPT0gTlVMTCk7CisKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgyLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDQsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg1LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDcsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg4LCBOVUxMKSk7CisgIAorICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZ2lzdGVyX2FuZF91bmxvY2sgKHRyZWUsIHBhdGgxKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19vYmplY3RfdHJlZV9nZXRfdXNlcl9kYXRhX3VubG9ja2VkICh0cmVlLCBwYXRoMSkgPT0gTlVMTCk7CisKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDMsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDYsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg3LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDIpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX29iamVjdF90cmVlX2dldF91c2VyX2RhdGFfdW5sb2NrZWQgKHRyZWUsIHBhdGgyKSA9PSBOVUxMKTsKKworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDMsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDYsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg3LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworICAKKyAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWdpc3Rlcl9hbmRfdW5sb2NrICh0cmVlLCBwYXRoMyk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfb2JqZWN0X3RyZWVfZ2V0X3VzZXJfZGF0YV91bmxvY2tlZCAodHJlZSwgcGF0aDMpID09IE5VTEwpOworCisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDAsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgyLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDMsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDYsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg3LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworICAKKyAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWdpc3Rlcl9hbmRfdW5sb2NrICh0cmVlLCBwYXRoNCk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfb2JqZWN0X3RyZWVfZ2V0X3VzZXJfZGF0YV91bmxvY2tlZCAodHJlZSwgcGF0aDQpID09IE5VTEwpOworCisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDAsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgyLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDMsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKyAgCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDUpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX29iamVjdF90cmVlX2dldF91c2VyX2RhdGFfdW5sb2NrZWQgKHRyZWUsIHBhdGg1KSA9PSBOVUxMKTsKKworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDQsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDYsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg3LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworICAKKyAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWdpc3Rlcl9hbmRfdW5sb2NrICh0cmVlLCBwYXRoNik7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfb2JqZWN0X3RyZWVfZ2V0X3VzZXJfZGF0YV91bmxvY2tlZCAodHJlZSwgcGF0aDYpID09IE5VTEwpOworCisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDAsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgyLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDMsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg1LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDYsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg3LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDcpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX29iamVjdF90cmVlX2dldF91c2VyX2RhdGFfdW5sb2NrZWQgKHRyZWUsIHBhdGg3KSA9PSBOVUxMKTsKKworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDQsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDcsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg4LCBOVUxMKSk7CisKKyAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWdpc3Rlcl9hbmRfdW5sb2NrICh0cmVlLCBwYXRoOCk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfb2JqZWN0X3RyZWVfZ2V0X3VzZXJfZGF0YV91bmxvY2tlZCAodHJlZSwgcGF0aDgpID09IE5VTEwpOworCisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDAsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgyLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDMsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg1LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDYsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg4LCBOVUxMKSk7CisgIAorICBpID0gMDsKKyAgd2hpbGUgKGkgPCAoaW50KSBfREJVU19OX0VMRU1FTlRTICh0cmVlX3Rlc3RfZGF0YSkpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0ICh0cmVlX3Rlc3RfZGF0YVtpXS5oYW5kbGVyX3VucmVnaXN0ZXJlZCk7CisgICAgICBfZGJ1c19hc3NlcnQgKCF0cmVlX3Rlc3RfZGF0YVtpXS5tZXNzYWdlX2hhbmRsZWQpOworICAgICAgKytpOworICAgIH0KKworICAvKiBSZWdpc3RlciBpdCBhbGwgYWdhaW4sIGFuZCB0ZXN0IGRpc3BhdGNoICovCisgIAorICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoMCwgVFJVRSwgMCwgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoMSwgRkFMU0UsIDEsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDIsIFRSVUUsIDIsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDMsIFRSVUUsIDMsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDQsIFRSVUUsIDQsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDUsIFRSVUUsIDUsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDYsIEZBTFNFLCA2LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg3LCBUUlVFLCA3LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg4LCBUUlVFLCA4LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisKKyNpZiAwCisgIHNwZXdfdHJlZSAodHJlZSk7CisjZW5kaWYKKworICBpZiAoIWRvX3Rlc3RfZGlzcGF0Y2ggKHRyZWUsIHBhdGgwLCAwLCB0cmVlX3Rlc3RfZGF0YSwgX0RCVVNfTl9FTEVNRU5UUyAodHJlZV90ZXN0X2RhdGEpKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb190ZXN0X2Rpc3BhdGNoICh0cmVlLCBwYXRoMSwgMSwgdHJlZV90ZXN0X2RhdGEsIF9EQlVTX05fRUxFTUVOVFMgKHRyZWVfdGVzdF9kYXRhKSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fdGVzdF9kaXNwYXRjaCAodHJlZSwgcGF0aDIsIDIsIHRyZWVfdGVzdF9kYXRhLCBfREJVU19OX0VMRU1FTlRTICh0cmVlX3Rlc3RfZGF0YSkpKQorICAgIGdvdG8gb3V0OworICBpZiAoIWRvX3Rlc3RfZGlzcGF0Y2ggKHRyZWUsIHBhdGgzLCAzLCB0cmVlX3Rlc3RfZGF0YSwgX0RCVVNfTl9FTEVNRU5UUyAodHJlZV90ZXN0X2RhdGEpKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb190ZXN0X2Rpc3BhdGNoICh0cmVlLCBwYXRoNCwgNCwgdHJlZV90ZXN0X2RhdGEsIF9EQlVTX05fRUxFTUVOVFMgKHRyZWVfdGVzdF9kYXRhKSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fdGVzdF9kaXNwYXRjaCAodHJlZSwgcGF0aDUsIDUsIHRyZWVfdGVzdF9kYXRhLCBfREJVU19OX0VMRU1FTlRTICh0cmVlX3Rlc3RfZGF0YSkpKQorICAgIGdvdG8gb3V0OworICBpZiAoIWRvX3Rlc3RfZGlzcGF0Y2ggKHRyZWUsIHBhdGg2LCA2LCB0cmVlX3Rlc3RfZGF0YSwgX0RCVVNfTl9FTEVNRU5UUyAodHJlZV90ZXN0X2RhdGEpKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb190ZXN0X2Rpc3BhdGNoICh0cmVlLCBwYXRoNywgNywgdHJlZV90ZXN0X2RhdGEsIF9EQlVTX05fRUxFTUVOVFMgKHRyZWVfdGVzdF9kYXRhKSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fdGVzdF9kaXNwYXRjaCAodHJlZSwgcGF0aDgsIDgsIHRyZWVfdGVzdF9kYXRhLCBfREJVU19OX0VMRU1FTlRTICh0cmVlX3Rlc3RfZGF0YSkpKQorICAgIGdvdG8gb3V0OworICAKKyBvdXQ6CisgIGlmICh0cmVlKQorICAgIHsKKyAgICAgIC8qIHRlc3QgcmVmICovCisgICAgICBfZGJ1c19vYmplY3RfdHJlZV9yZWYgKHRyZWUpOworICAgICAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWYgKHRyZWUpOworICAgICAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWYgKHRyZWUpOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBAaW5ncm91cCBEQnVzT2JqZWN0VHJlZQorICogVW5pdCB0ZXN0IGZvciBEQnVzT2JqZWN0VHJlZQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX29iamVjdF90cmVlX3Rlc3QgKHZvaWQpCit7CisgIF9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nICgib2JqZWN0IHRyZWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3RyZWVfdGVzdF9pdGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qICFET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMgKi8KKworI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLW9iamVjdC10cmVlLmggYi9kYnVzL2RidXMvZGJ1cy1vYmplY3QtdHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NzZjMjUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1vYmplY3QtdHJlZS5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1vYmplY3QtdHJlZS5oICBEQnVzT2JqZWN0VHJlZSAoaW50ZXJuYWxzIG9mIERCdXNDb25uZWN0aW9uKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfT0JKRUNUX1RSRUVfSAorI2RlZmluZSBEQlVTX09CSkVDVF9UUkVFX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgREJ1c09iamVjdFRyZWUgREJ1c09iamVjdFRyZWU7CisKK0RCdXNPYmplY3RUcmVlKiBfZGJ1c19vYmplY3RfdHJlZV9uZXcgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworREJ1c09iamVjdFRyZWUqIF9kYnVzX29iamVjdF90cmVlX3JlZiAgIChEQnVzT2JqZWN0VHJlZSAqdHJlZSk7Cit2b2lkICAgICAgICAgICAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWYgKERCdXNPYmplY3RUcmVlICp0cmVlKTsKKworZGJ1c19ib29sX3QgICAgICAgX2RidXNfb2JqZWN0X3RyZWVfcmVnaXN0ZXIgICAgICAgICAgICAgICAoREJ1c09iamVjdFRyZWUgICAgICAgICAgICAgICp0cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgICAgICBmYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICoqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNPYmplY3RQYXRoVlRhYmxlICAqdnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICAgICAgKmVycm9yKTsKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAgKERCdXNPYmplY3RUcmVlICAgICAgICAgICAgICAqdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICoqcGF0aCk7CitEQnVzSGFuZGxlclJlc3VsdCBfZGJ1c19vYmplY3RfdHJlZV9kaXNwYXRjaF9hbmRfdW5sb2NrICAgIChEQnVzT2JqZWN0VHJlZSAgICAgICAgICAgICAgKnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgICAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgICAgKmZvdW5kX29iamVjdCk7Cit2b2lkKiAgICAgICAgICAgICBfZGJ1c19vYmplY3RfdHJlZV9nZXRfdXNlcl9kYXRhX3VubG9ja2VkIChEQnVzT2JqZWN0VHJlZSAgICAgICAgICAgICAgKnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAqKnBhdGgpOwordm9pZCAgICAgICAgICAgICAgX2RidXNfb2JqZWN0X3RyZWVfZnJlZV9hbGxfdW5sb2NrZWQgICAgICAoREJ1c09iamVjdFRyZWUgICAgICAgICAgICAgICp0cmVlKTsKKworCitkYnVzX2Jvb2xfdCBfZGJ1c19vYmplY3RfdHJlZV9saXN0X3JlZ2lzdGVyZWRfYW5kX3VubG9jayAoREJ1c09iamVjdFRyZWUgKnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqKnBhcmVudF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAqKipjaGlsZF9lbnRyaWVzKTsKKworZGJ1c19ib29sX3QgX2RidXNfZGVjb21wb3NlX3BhdGggKGNvbnN0IGNoYXIgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICoqKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICpwYXRoX2xlbik7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX09CSkVDVF9UUkVFX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLXBlbmRpbmctY2FsbC1pbnRlcm5hbC5oIGIvZGJ1cy9kYnVzL2RidXMtcGVuZGluZy1jYWxsLWludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg3NWVlYQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXBlbmRpbmctY2FsbC1pbnRlcm5hbC5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1wZW5kaW5nLWNhbGwtaW50ZXJuYWwuaCBEQnVzUGVuZGluZ0NhbGwgaW50ZXJuYWwgaW50ZXJmYWNlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfUEVORElOR19DQUxMX0lOVEVSTkFMX0gKKyNkZWZpbmUgREJVU19QRU5ESU5HX0NBTExfSU5URVJOQUxfSAorCisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtY29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworZGJ1c19ib29sX3QgICAgICBfZGJ1c19wZW5kaW5nX2NhbGxfaXNfdGltZW91dF9hZGRlZF91bmxvY2tlZCAgICAoREJ1c1BlbmRpbmdDYWxsICAgICpwZW5kaW5nKTsKK3ZvaWQgICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX3NldF90aW1lb3V0X2FkZGVkX3VubG9ja2VkICAgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgaXNfYWRkZWQpOworREJ1c1RpbWVvdXQgICAgKiBfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X3RpbWVvdXRfdW5sb2NrZWQgICAgICAgICAoREJ1c1BlbmRpbmdDYWxsICAgICpwZW5kaW5nKTsKK2RidXNfdWludDMyX3QgICAgX2RidXNfcGVuZGluZ19jYWxsX2dldF9yZXBseV9zZXJpYWxfdW5sb2NrZWQgICAgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZyk7Cit2b2lkICAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfcmVwbHlfc2VyaWFsX3VubG9ja2VkICAgIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICAgIHNlcmlhbCk7CitEQnVzQ29ubmVjdGlvbiAqIF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29ubmVjdGlvbl9hbmRfbG9jayAgICAgIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcpOworREJ1c0Nvbm5lY3Rpb24gKiBfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2Nvbm5lY3Rpb25fdW5sb2NrZWQgICAgICAoREJ1c1BlbmRpbmdDYWxsICAgICpwZW5kaW5nKTsKK2RidXNfYm9vbF90ICAgICAgX2RidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWRfdW5sb2NrZWQgICAgICAgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZyk7Cit2b2lkICAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9jb21wbGV0ZSAgICAgICAgICAgICAgICAgICAgIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcpOwordm9pZCAgICAgICAgICAgICBfZGJ1c19wZW5kaW5nX2NhbGxfc2V0X3JlcGx5X3VubG9ja2VkICAgICAgICAgICAoREJ1c1BlbmRpbmdDYWxsICAgICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlKTsKK3ZvaWQgICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX3F1ZXVlX3RpbWVvdXRfZXJyb3JfdW5sb2NrZWQgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbik7Cit2b2lkICAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfcmVwbHlfc2VyaWFsX3VubG9ja2VkICAgIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICAgIHNlcmlhbCk7CitkYnVzX2Jvb2xfdCAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfdGltZW91dF9lcnJvcl91bmxvY2tlZCAgIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICAgIHNlcmlhbCk7CitEQnVzUGVuZGluZ0NhbGwqIF9kYnVzX3BlbmRpbmdfY2FsbF9uZXdfdW5sb2NrZWQgICAgICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXRIYW5kbGVyICB0aW1lb3V0X2hhbmRsZXIpOworREJ1c1BlbmRpbmdDYWxsKiBfZGJ1c19wZW5kaW5nX2NhbGxfcmVmX3VubG9ja2VkICAgICAgICAgICAgICAgICAoREJ1c1BlbmRpbmdDYWxsICAgICpwZW5kaW5nKTsKK3ZvaWQgICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX3VucmVmX2FuZF91bmxvY2sgICAgICAgICAgICAgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZyk7CitkYnVzX2Jvb2xfdCAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfZGF0YV91bmxvY2tlZCAgICAgICAgICAgIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICAgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgIGZyZWVfZGF0YV9mdW5jKTsKKworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19QRU5ESU5HX0NBTExfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtcGVuZGluZy1jYWxsLmMgYi9kYnVzL2RidXMvZGJ1cy1wZW5kaW5nLWNhbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmM2Yzc0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtcGVuZGluZy1jYWxsLmMKQEAgLTAsMCArMSw4NTEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1wZW5kaW5nLWNhbGwuYyBPYmplY3QgcmVwcmVzZW50aW5nIGEgY2FsbCBpbiBwcm9ncmVzcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkYnVzLW1lc3NhZ2UtaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkYnVzLXBlbmRpbmctY2FsbC1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImRidXMtcGVuZGluZy1jYWxsLmgiCisjaW5jbHVkZSAiZGJ1cy1saXN0LmgiCisjaW5jbHVkZSAiZGJ1cy10aHJlYWRzLmgiCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNQZW5kaW5nQ2FsbEludGVybmFscyBEQnVzUGVuZGluZ0NhbGwgaW1wbGVtZW50YXRpb24gZGV0YWlscworICogQGluZ3JvdXAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNQZW5kaW5nQ2FsbCBwcml2YXRlIGltcGxlbWVudGF0aW9uIGRldGFpbHMuCisgKgorICogVGhlIGd1dHMgb2YgREJ1c1BlbmRpbmdDYWxsIGFuZCBpdHMgbWV0aG9kcy4KKyAqCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmIEludGVybmFscyBvZiBEQnVzUGVuZGluZ0NhbGwKKyAqCisgKiBPcGFxdWUgb2JqZWN0IHJlcHJlc2VudGluZyBhIHJlcGx5IG1lc3NhZ2UgdGhhdCB3ZSdyZSB3YWl0aW5nIGZvci4KKyAqLworCisvKioKKyAqIHNob3J0ZXIgYW5kIG1vcmUgdmlzaWJsZSB3YXkgdG8gd3JpdGUgX2RidXNfY29ubmVjdGlvbl9sb2NrKCkKKyAqLworI2RlZmluZSBDT05ORUNUSU9OX0xPQ0soY29ubmVjdGlvbikgICBfZGJ1c19jb25uZWN0aW9uX2xvY2soY29ubmVjdGlvbikKKy8qKgorICogc2hvcnRlciBhbmQgbW9yZSB2aXNpYmxlIHdheSB0byB3cml0ZSBfZGJ1c19jb25uZWN0aW9uX3VubG9jaygpCisgKi8KKyNkZWZpbmUgQ09OTkVDVElPTl9VTkxPQ0soY29ubmVjdGlvbikgX2RidXNfY29ubmVjdGlvbl91bmxvY2soY29ubmVjdGlvbikKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mICNEQnVzUGVuZGluZ0NhbGwgLSBhbGwgZmllbGRzIGFyZSBwcml2YXRlLgorICovCitzdHJ1Y3QgREJ1c1BlbmRpbmdDYWxsCit7CisgIERCdXNBdG9taWMgcmVmY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlIGNvdW50ICovCisKKyAgREJ1c0RhdGFTbG90TGlzdCBzbG90X2xpc3Q7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBEYXRhIHN0b3JlZCBieSBhbGxvY2F0ZWQgaW50ZWdlciBJRCAqLworICAKKyAgREJ1c1BlbmRpbmdDYWxsTm90aWZ5RnVuY3Rpb24gZnVuY3Rpb247ICAgICAgICAgLyoqPCBOb3RpZmllciB3aGVuIHJlcGx5IGFycml2ZXMuICovCisKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247ICAgICAgICAgICAgICAgICAgICAgLyoqPCBDb25uZWN0aW9ucyB3ZSdyZSBhc3NvY2lhdGVkIHdpdGggKi8KKyAgREJ1c01lc3NhZ2UgKnJlcGx5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBSZXBseSAoYWZ0ZXIgd2UndmUgcmVjZWl2ZWQgaXQpICovCisgIERCdXNUaW1lb3V0ICp0aW1lb3V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGltZW91dCAqLworCisgIERCdXNMaXN0ICp0aW1lb3V0X2xpbms7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUHJlYWxsb2NhdGVkIHRpbWVvdXQgcmVzcG9uc2UgKi8KKyAgCisgIGRidXNfdWludDMyX3QgcmVwbHlfc2VyaWFsOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgRXhwZWN0ZWQgc2VyaWFsIG9mIHJlcGx5ICovCisKKyAgdW5zaWduZWQgaW50IGNvbXBsZXRlZCA6IDE7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBUUlVFIGlmIGNvbXBsZXRlZCAqLworICB1bnNpZ25lZCBpbnQgdGltZW91dF9hZGRlZCA6IDE7ICAgICAgICAgICAgICAgICAvKio8IEhhdmUgYWRkZWQgdGhlIHRpbWVvdXQgKi8KK307CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKK3N0YXRpYyB2b2lkCitfZGJ1c19wZW5kaW5nX2NhbGxfdHJhY2VfcmVmIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmdfY2FsbCwKKyAgICBpbnQgb2xkX3JlZmNvdW50LAorICAgIGludCBuZXdfcmVmY291bnQsCisgICAgY29uc3QgY2hhciAqd2h5KQoreworICBzdGF0aWMgaW50IGVuYWJsZWQgPSAtMTsKKworICBfZGJ1c190cmFjZV9yZWYgKCJEQnVzUGVuZGluZ0NhbGwiLCBwZW5kaW5nX2NhbGwsIG9sZF9yZWZjb3VudCwKKyAgICAgIG5ld19yZWZjb3VudCwgd2h5LCAiREJVU19QRU5ESU5HX0NBTExfVFJBQ0UiLCAmZW5hYmxlZCk7Cit9CisjZWxzZQorI2RlZmluZSBfZGJ1c19wZW5kaW5nX2NhbGxfdHJhY2VfcmVmKHAsIG8sIG4sIHcpIFwKKyAgZG8gXAorICB7XAorICAgICh2b2lkKSAobyk7IFwKKyAgICAodm9pZCkgKG4pOyBcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworc3RhdGljIGRidXNfaW50MzJfdCBub3RpZnlfdXNlcl9kYXRhX3Nsb3QgPSAtMTsKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IHBlbmRpbmcgcmVwbHkgb2JqZWN0LgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIGNvbm5lY3Rpb24gd2hlcmUgcmVwbHkgd2lsbCBhcnJpdmUKKyAqIEBwYXJhbSB0aW1lb3V0X21pbGxpc2Vjb25kcyBsZW5ndGggb2YgdGltZW91dCwgLTEgKG9yCisgKiAgI0RCVVNfVElNRU9VVF9VU0VfREVGQVVMVCkgZm9yIGRlZmF1bHQsCisgKiAgI0RCVVNfVElNRU9VVF9JTkZJTklURSBmb3Igbm8gdGltZW91dAorICogQHBhcmFtIHRpbWVvdXRfaGFuZGxlciB0aW1lb3V0IGhhbmRsZXIsIHRha2VzIHBlbmRpbmcgY2FsbCBhcyBkYXRhCisgKiBAcmV0dXJucyBhIG5ldyAjREJ1c1BlbmRpbmdDYWxsIG9yICNOVUxMIGlmIG5vIG1lbW9yeS4KKyAqLworREJ1c1BlbmRpbmdDYWxsKgorX2RidXNfcGVuZGluZ19jYWxsX25ld191bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dEhhbmRsZXIgdGltZW91dF9oYW5kbGVyKQoreworICBEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmc7CisgIERCdXNUaW1lb3V0ICp0aW1lb3V0OworCisgIF9kYnVzX2Fzc2VydCAodGltZW91dF9taWxsaXNlY29uZHMgPj0gMCB8fCB0aW1lb3V0X21pbGxpc2Vjb25kcyA9PSAtMSk7CisgCisgIGlmICh0aW1lb3V0X21pbGxpc2Vjb25kcyA9PSAtMSkKKyAgICB0aW1lb3V0X21pbGxpc2Vjb25kcyA9IF9EQlVTX0RFRkFVTFRfVElNRU9VVF9WQUxVRTsKKworICBpZiAoIWRidXNfcGVuZGluZ19jYWxsX2FsbG9jYXRlX2RhdGFfc2xvdCAoJm5vdGlmeV91c2VyX2RhdGFfc2xvdCkpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBwZW5kaW5nID0gZGJ1c19uZXcwIChEQnVzUGVuZGluZ0NhbGwsIDEpOworICAKKyAgaWYgKHBlbmRpbmcgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3BlbmRpbmdfY2FsbF9mcmVlX2RhdGFfc2xvdCAoJm5vdGlmeV91c2VyX2RhdGFfc2xvdCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKHRpbWVvdXRfbWlsbGlzZWNvbmRzICE9IERCVVNfVElNRU9VVF9JTkZJTklURSkKKyAgICB7CisgICAgICB0aW1lb3V0ID0gX2RidXNfdGltZW91dF9uZXcgKHRpbWVvdXRfbWlsbGlzZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X2hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcsIE5VTEwpOyAgCisKKyAgICAgIGlmICh0aW1lb3V0ID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3BlbmRpbmdfY2FsbF9mcmVlX2RhdGFfc2xvdCAoJm5vdGlmeV91c2VyX2RhdGFfc2xvdCk7CisgICAgICAgICAgZGJ1c19mcmVlIChwZW5kaW5nKTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBwZW5kaW5nLT50aW1lb3V0ID0gdGltZW91dDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwZW5kaW5nLT50aW1lb3V0ID0gTlVMTDsKKyAgICB9CisKKyAgX2RidXNfYXRvbWljX2luYyAoJnBlbmRpbmctPnJlZmNvdW50KTsKKyAgcGVuZGluZy0+Y29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisgIF9kYnVzX2Nvbm5lY3Rpb25fcmVmX3VubG9ja2VkIChwZW5kaW5nLT5jb25uZWN0aW9uKTsKKworICBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9pbml0ICgmcGVuZGluZy0+c2xvdF9saXN0KTsKKworICBfZGJ1c19wZW5kaW5nX2NhbGxfdHJhY2VfcmVmIChwZW5kaW5nLCAwLCAxLCAibmV3X3VubG9ja2VkIik7CisKKyAgcmV0dXJuIHBlbmRpbmc7Cit9CisKKy8qKgorICogU2V0cyB0aGUgcmVwbHkgb2YgYSBwZW5kaW5nIGNhbGwgd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSwKKyAqIG9yIGlmIHRoZSBtZXNzYWdlIGlzICNOVUxMLCBieSB0aW1pbmcgb3V0IHRoZSBwZW5kaW5nIGNhbGwuCisgKiAKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGNvbXBsZXRlIHRoZSBjYWxsIHdpdGgsIG9yICNOVUxMCisgKiAgdG8gdGltZSBvdXQgdGhlIGNhbGwKKyAqLwordm9pZAorX2RidXNfcGVuZGluZ19jYWxsX3NldF9yZXBseV91bmxvY2tlZCAoREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICptZXNzYWdlKQoreworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIG1lc3NhZ2UgPSBwZW5kaW5nLT50aW1lb3V0X2xpbmstPmRhdGE7CisgICAgICBfZGJ1c19saXN0X2NsZWFyICgmcGVuZGluZy0+dGltZW91dF9saW5rKTsKKyAgICB9CisgIGVsc2UKKyAgICBkYnVzX21lc3NhZ2VfcmVmIChtZXNzYWdlKTsKKworICBfZGJ1c192ZXJib3NlICgiICBoYW5kaW5nIG1lc3NhZ2UgJXAgKCVzKSB0byBwZW5kaW5nIGNhbGwgc2VyaWFsICV1XG4iLAorICAgICAgICAgICAgICAgICBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4gPworICAgICAgICAgICAgICAgICAibWV0aG9kIHJldHVybiIgOgorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SID8KKyAgICAgICAgICAgICAgICAgImVycm9yIiA6ICJvdGhlciB0eXBlIiwKKyAgICAgICAgICAgICAgICAgcGVuZGluZy0+cmVwbHlfc2VyaWFsKTsKKyAgCisgIF9kYnVzX2Fzc2VydCAocGVuZGluZy0+cmVwbHkgPT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocGVuZGluZy0+cmVwbHlfc2VyaWFsID09IGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSk7CisgIHBlbmRpbmctPnJlcGx5ID0gbWVzc2FnZTsKK30KKworLyoqCisgKiBDYWxscyBub3RpZmllciBmdW5jdGlvbiBmb3IgdGhlIHBlbmRpbmcgY2FsbAorICogYW5kIHNldHMgdGhlIGNhbGwgdG8gY29tcGxldGVkLgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwKKyAqIAorICovCit2b2lkCitfZGJ1c19wZW5kaW5nX2NhbGxfY29tcGxldGUgKERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZykKK3sKKyAgX2RidXNfYXNzZXJ0ICghcGVuZGluZy0+Y29tcGxldGVkKTsKKyAgCisgIHBlbmRpbmctPmNvbXBsZXRlZCA9IFRSVUU7CisKKyAgaWYgKHBlbmRpbmctPmZ1bmN0aW9uKQorICAgIHsKKyAgICAgIHZvaWQgKnVzZXJfZGF0YTsKKyAgICAgIHVzZXJfZGF0YSA9IGRidXNfcGVuZGluZ19jYWxsX2dldF9kYXRhIChwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeV91c2VyX2RhdGFfc2xvdCk7CisgICAgICAKKyAgICAgICgqIHBlbmRpbmctPmZ1bmN0aW9uKSAocGVuZGluZywgdXNlcl9kYXRhKTsKKyAgICB9Cit9CisKKy8qKgorICogSWYgdGhlIHBlbmRpbmcgY2FsbCBoYXNuJ3QgYmVlbiB0aW1lZCBvdXQsIGFkZCBpdHMgdGltZW91dAorICogZXJyb3IgcmVwbHkgdG8gdGhlIGNvbm5lY3Rpb24ncyBpbmNvbWluZyBtZXNzYWdlIHF1ZXVlLgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uIHRoZSBjYWxsIHdhcyBzZW50IHRvCisgKi8KK3ZvaWQKK19kYnVzX3BlbmRpbmdfY2FsbF9xdWV1ZV90aW1lb3V0X2Vycm9yX3VubG9ja2VkIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbikKK3sKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uID09IHBlbmRpbmctPmNvbm5lY3Rpb24pOworICAKKyAgaWYgKHBlbmRpbmctPnRpbWVvdXRfbGluaykKKyAgICB7CisgICAgICBfZGJ1c19jb25uZWN0aW9uX3F1ZXVlX3N5bnRoZXNpemVkX21lc3NhZ2VfbGluayAoY29ubmVjdGlvbiwKKwkJCQkJCSAgICAgICBwZW5kaW5nLT50aW1lb3V0X2xpbmspOworICAgICAgcGVuZGluZy0+dGltZW91dF9saW5rID0gTlVMTDsKKyAgICB9Cit9CisKKy8qKgorICogQ2hlY2tzIHRvIHNlZSBpZiBhIHRpbWVvdXQgaGFzIGJlZW4gYWRkZWQKKyAqCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZ19jYWxsCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGVyZSBpcyBhIHRpbWVvdXQgb3IgI0ZBTFNFIGlmIG5vdAorICovCitkYnVzX2Jvb2xfdCAKK19kYnVzX3BlbmRpbmdfY2FsbF9pc190aW1lb3V0X2FkZGVkX3VubG9ja2VkIChEQnVzUGVuZGluZ0NhbGwgICpwZW5kaW5nKQoreworICBfZGJ1c19hc3NlcnQgKHBlbmRpbmcgIT0gTlVMTCk7CisKKyAgcmV0dXJuIHBlbmRpbmctPnRpbWVvdXRfYWRkZWQ7Cit9CisKKworLyoqCisgKiBTZXRzIHdldGhlciB0aGUgdGltZW91dCBoYXMgYmVlbiBhZGRlZAorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nX2NhbGwKKyAqIEBwYXJhbSBpc19hZGRlZCB3aGV0aGVyIG9yIG5vdCBhIHRpbWVvdXQgaXMgYWRkZWQKKyAqLwordm9pZAorX2RidXNfcGVuZGluZ19jYWxsX3NldF90aW1lb3V0X2FkZGVkX3VubG9ja2VkIChEQnVzUGVuZGluZ0NhbGwgICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBpc19hZGRlZCkKK3sKKyAgX2RidXNfYXNzZXJ0IChwZW5kaW5nICE9IE5VTEwpOworCisgIHBlbmRpbmctPnRpbWVvdXRfYWRkZWQgPSBpc19hZGRlZDsKK30KKworCisvKioKKyAqIFJldHJpdmVzIHRoZSB0aW1lb3V0CisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmdfY2FsbAorICogQHJldHVybnMgYSB0aW1lb3V0IG9iamVjdCBvciBOVUxMIGlmIGNhbGwgaGFzIG5vIHRpbWVvdXQKKyAqLworREJ1c1RpbWVvdXQgKgorX2RidXNfcGVuZGluZ19jYWxsX2dldF90aW1lb3V0X3VubG9ja2VkIChEQnVzUGVuZGluZ0NhbGwgICpwZW5kaW5nKQoreworICBfZGJ1c19hc3NlcnQgKHBlbmRpbmcgIT0gTlVMTCk7CisKKyAgcmV0dXJuIHBlbmRpbmctPnRpbWVvdXQ7Cit9CisKKy8qKgorICogR2V0cyB0aGUgcmVwbHkncyBzZXJpYWwgbnVtYmVyCisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmdfY2FsbAorICogQHJldHVybnMgYSBzZXJpYWwgbnVtYmVyIGZvciB0aGUgcmVwbHkgb3IgMCAKKyAqLworZGJ1c191aW50MzJfdCAKK19kYnVzX3BlbmRpbmdfY2FsbF9nZXRfcmVwbHlfc2VyaWFsX3VubG9ja2VkIChEQnVzUGVuZGluZ0NhbGwgICpwZW5kaW5nKQoreworICBfZGJ1c19hc3NlcnQgKHBlbmRpbmcgIT0gTlVMTCk7CisKKyAgcmV0dXJuIHBlbmRpbmctPnJlcGx5X3NlcmlhbDsKK30KKworLyoqCisgKiBTZXRzIHRoZSByZXBseSdzIHNlcmlhbCBudW1iZXIKKyAqCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZ19jYWxsCisgKiBAcGFyYW0gc2VyaWFsIHRoZSBzZXJpYWwgbnVtYmVyIAorICovCit2b2lkCitfZGJ1c19wZW5kaW5nX2NhbGxfc2V0X3JlcGx5X3NlcmlhbF91bmxvY2tlZCAgKERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCBzZXJpYWwpCit7CisgIF9kYnVzX2Fzc2VydCAocGVuZGluZyAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChwZW5kaW5nLT5yZXBseV9zZXJpYWwgPT0gMCk7CisKKyAgcGVuZGluZy0+cmVwbHlfc2VyaWFsID0gc2VyaWFsOworfQorCisvKioKKyAqIEdldHMgdGhlIGNvbm5lY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGVuZGluZyBjYWxsLgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nX2NhbGwKKyAqIEByZXR1cm5zIHRoZSBjb25uZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGVuZGluZyBjYWxsCisgKi8KK0RCdXNDb25uZWN0aW9uICoKK19kYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29ubmVjdGlvbl9hbmRfbG9jayAoREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nKQoreworICBfZGJ1c19hc3NlcnQgKHBlbmRpbmcgIT0gTlVMTCk7CisgCisgIENPTk5FQ1RJT05fTE9DSyAocGVuZGluZy0+Y29ubmVjdGlvbik7CisgIHJldHVybiBwZW5kaW5nLT5jb25uZWN0aW9uOworfQorCisvKioKKyAqIEdldHMgdGhlIGNvbm5lY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGVuZGluZyBjYWxsLgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nX2NhbGwKKyAqIEByZXR1cm5zIHRoZSBjb25uZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGVuZGluZyBjYWxsCisgKi8KK0RCdXNDb25uZWN0aW9uICoKK19kYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29ubmVjdGlvbl91bmxvY2tlZCAoREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nKQoreworICBfZGJ1c19hc3NlcnQgKHBlbmRpbmcgIT0gTlVMTCk7CisgCisgIHJldHVybiBwZW5kaW5nLT5jb25uZWN0aW9uOworfQorCisvKioKKyAqIFNldHMgdGhlIHJlcGx5IG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBwZW5kaW5nIGNhbGwgdG8gYSB0aW1lb3V0IGVycm9yCisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmdfY2FsbAorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2Ugd2UgYXJlIHNlbmRpbmcgdGhlIGVycm9yIHJlcGx5IHRvIAorICogQHBhcmFtIHNlcmlhbCBzZXJpYWwgbnVtYmVyIGZvciB0aGUgcmVwbHkKKyAqIEByZXR1cm4gI0ZBTFNFIG9uIE9PTQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfcGVuZGluZ19jYWxsX3NldF90aW1lb3V0X2Vycm9yX3VubG9ja2VkIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICBzZXJpYWwpCit7IAorICBEQnVzTGlzdCAqcmVwbHlfbGluazsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19lcnJvciAobWVzc2FnZSwgREJVU19FUlJPUl9OT19SRVBMWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlkIG5vdCByZWNlaXZlIGEgcmVwbHkuIFBvc3NpYmxlIGNhdXNlcyBpbmNsdWRlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSByZW1vdGUgYXBwbGljYXRpb24gZGlkIG5vdCBzZW5kIGEgcmVwbHksICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIG1lc3NhZ2UgYnVzIHNlY3VyaXR5IHBvbGljeSBibG9ja2VkIHRoZSByZXBseSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgcmVwbHkgdGltZW91dCBleHBpcmVkLCBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBuZXR3b3JrIGNvbm5lY3Rpb24gd2FzIGJyb2tlbi4iKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJlcGx5X2xpbmsgPSBfZGJ1c19saXN0X2FsbG9jX2xpbmsgKHJlcGx5KTsKKyAgaWYgKHJlcGx5X2xpbmsgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBpdCdzIE9LIHRvIHVucmVmIHRoaXMsIG5vdGhpbmcgdGhhdCBjb3VsZCBoYXZlIGF0dGFjaGVkIGEgY2FsbGJhY2sKKyAgICAgICAqIGhhcyBldmVyIHNlZW4gaXQgKi8KKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBwZW5kaW5nLT50aW1lb3V0X2xpbmsgPSByZXBseV9saW5rOworCisgIF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfcmVwbHlfc2VyaWFsX3VubG9ja2VkIChwZW5kaW5nLCBzZXJpYWwpOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogSW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIGEgcGVuZGluZyBjYWxsLAorICogd2hpbGUgdGhlIGxvY2sgb24gaXRzIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBoZWxkLgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwgb2JqZWN0CisgKiBAcmV0dXJucyB0aGUgcGVuZGluZyBjYWxsIG9iamVjdAorICovCitEQnVzUGVuZGluZ0NhbGwgKgorX2RidXNfcGVuZGluZ19jYWxsX3JlZl91bmxvY2tlZCAoREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nKQoreworICBkYnVzX2ludDMyX3Qgb2xkX3JlZmNvdW50OworCisgIG9sZF9yZWZjb3VudCA9IF9kYnVzX2F0b21pY19pbmMgKCZwZW5kaW5nLT5yZWZjb3VudCk7CisgIF9kYnVzX3BlbmRpbmdfY2FsbF90cmFjZV9yZWYgKHBlbmRpbmcsIG9sZF9yZWZjb3VudCwgb2xkX3JlZmNvdW50ICsgMSwKKyAgICAgICJyZWZfdW5sb2NrZWQiKTsKKworICByZXR1cm4gcGVuZGluZzsKK30KKworCitzdGF0aWMgdm9pZAorX2RidXNfcGVuZGluZ19jYWxsX2xhc3RfdW5yZWYgKERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZykKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIAorICAvKiBJZiB3ZSBnZXQgaGVyZSwgd2Ugc2hvdWxkIGJlIGFscmVhZHkgZGV0YWNoZWQKKyAgICogZnJvbSB0aGUgY29ubmVjdGlvbiwgb3IgbmV2ZXIgYXR0YWNoZWQuCisgICAqLworICBfZGJ1c19hc3NlcnQgKCFwZW5kaW5nLT50aW1lb3V0X2FkZGVkKTsgIAorCisgIGNvbm5lY3Rpb24gPSBwZW5kaW5nLT5jb25uZWN0aW9uOworCisgIC8qIHRoaXMgYXNzdW1lcyB3ZSBhcmVuJ3QgaG9sZGluZyBjb25uZWN0aW9uIGxvY2suLi4gKi8KKyAgX2RidXNfZGF0YV9zbG90X2xpc3RfZnJlZSAoJnBlbmRpbmctPnNsb3RfbGlzdCk7CisKKyAgaWYgKHBlbmRpbmctPnRpbWVvdXQgIT0gTlVMTCkKKyAgICBfZGJ1c190aW1lb3V0X3VucmVmIChwZW5kaW5nLT50aW1lb3V0KTsKKyAgICAgIAorICBpZiAocGVuZGluZy0+dGltZW91dF9saW5rKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAoKERCdXNNZXNzYWdlICopcGVuZGluZy0+dGltZW91dF9saW5rLT5kYXRhKTsKKyAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChwZW5kaW5nLT50aW1lb3V0X2xpbmspOworICAgICAgcGVuZGluZy0+dGltZW91dF9saW5rID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKHBlbmRpbmctPnJlcGx5KQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocGVuZGluZy0+cmVwbHkpOworICAgICAgcGVuZGluZy0+cmVwbHkgPSBOVUxMOworICAgIH0KKyAgICAgIAorICBkYnVzX2ZyZWUgKHBlbmRpbmcpOworCisgIGRidXNfcGVuZGluZ19jYWxsX2ZyZWVfZGF0YV9zbG90ICgmbm90aWZ5X3VzZXJfZGF0YV9zbG90KTsKKworICAvKiBjb25uZWN0aW9uIGxvY2sgc2hvdWxkIG5vdCBiZSBoZWxkLiAqLworICAvKiBGcmVlIHRoZSBjb25uZWN0aW9uIGxhc3QgdG8gYXZvaWQgYSB3ZWlyZCBzdGF0ZSB3aGlsZQorICAgKiBjYWxsaW5nIG91dCB0byBhcHBsaWNhdGlvbiBjb2RlIHdoZXJlIHRoZSBwZW5kaW5nIGV4aXN0cworICAgKiBidXQgbm90IHRoZSBjb25uZWN0aW9uLgorICAgKi8KKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKK30KKworLyoqCisgKiBEZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb24gYSBwZW5kaW5nIGNhbGwsCisgKiBmcmVlaW5nIGl0IGlmIHRoZSBjb3VudCByZWFjaGVzIDAuIEFzc3VtZXMKKyAqIGNvbm5lY3Rpb24gbG9jayBpcyBhbHJlYWR5IGhlbGQuCisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmcgY2FsbCBvYmplY3QKKyAqLwordm9pZAorX2RidXNfcGVuZGluZ19jYWxsX3VucmVmX2FuZF91bmxvY2sgKERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZykKK3sKKyAgZGJ1c19pbnQzMl90IG9sZF9yZWZjb3VudDsKKworICBvbGRfcmVmY291bnQgPSBfZGJ1c19hdG9taWNfZGVjICgmcGVuZGluZy0+cmVmY291bnQpOworICBfZGJ1c19hc3NlcnQgKG9sZF9yZWZjb3VudCA+IDApOworICBfZGJ1c19wZW5kaW5nX2NhbGxfdHJhY2VfcmVmIChwZW5kaW5nLCBvbGRfcmVmY291bnQsCisgICAgICBvbGRfcmVmY291bnQgLSAxLCAidW5yZWZfYW5kX3VubG9jayIpOworCisgIENPTk5FQ1RJT05fVU5MT0NLIChwZW5kaW5nLT5jb25uZWN0aW9uKTsKKworICBpZiAob2xkX3JlZmNvdW50ID09IDEpCisgICAgX2RidXNfcGVuZGluZ19jYWxsX2xhc3RfdW5yZWYgKHBlbmRpbmcpOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBwZW5kaW5nIGNhbGwgaGFzIHJlY2VpdmVkIGEgcmVwbHkKKyAqIHlldCwgb3Igbm90LiBBc3N1bWVzIGNvbm5lY3Rpb24gbG9jayBpcyBoZWxkLgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwKKyAqIEByZXR1cm5zICNUUlVFIGlmIGEgcmVwbHkgaGFzIGJlZW4gcmVjZWl2ZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29tcGxldGVkX3VubG9ja2VkIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcpCit7CisgIHJldHVybiBwZW5kaW5nLT5jb21wbGV0ZWQ7Cit9CisKK3N0YXRpYyBEQnVzRGF0YVNsb3RBbGxvY2F0b3Igc2xvdF9hbGxvY2F0b3I7CitfREJVU19ERUZJTkVfR0xPQkFMX0xPQ0sgKHBlbmRpbmdfY2FsbF9zbG90cyk7CisKKy8qKgorICogU3RvcmVzIGEgcG9pbnRlciBvbiBhICNEQnVzUGVuZGluZ0NhbGwsIGFsb25nCisgKiB3aXRoIGFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIGJlIHVzZWQgZm9yIGZyZWVpbmcKKyAqIHRoZSBkYXRhIHdoZW4gdGhlIGRhdGEgaXMgc2V0IGFnYWluLCBvciB3aGVuCisgKiB0aGUgcGVuZGluZyBjYWxsIGlzIGZpbmFsaXplZC4gVGhlIHNsb3QgbnVtYmVyCisgKiBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgd2l0aCBkYnVzX3BlbmRpbmdfY2FsbF9hbGxvY2F0ZV9kYXRhX3Nsb3QoKS4KKyAqCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZ19jYWxsCisgKiBAcGFyYW0gc2xvdCB0aGUgc2xvdCBudW1iZXIKKyAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIHRvIHN0b3JlCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmMgZmluYWxpemVyIGZ1bmN0aW9uIGZvciB0aGUgZGF0YQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlcmUgd2FzIGVub3VnaCBtZW1vcnkgdG8gc3RvcmUgdGhlIGRhdGEKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3BlbmRpbmdfY2FsbF9zZXRfZGF0YV91bmxvY2tlZCAoREJ1c1BlbmRpbmdDYWxsICAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgZnJlZV9kYXRhX2Z1bmMpCit7CisgIERCdXNGcmVlRnVuY3Rpb24gb2xkX2ZyZWVfZnVuYzsKKyAgdm9pZCAqb2xkX2RhdGE7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICByZXR2YWwgPSBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9zZXQgKCZzbG90X2FsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVuZGluZy0+c2xvdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QsIGRhdGEsIGZyZWVfZGF0YV9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvbGRfZnJlZV9mdW5jLCAmb2xkX2RhdGEpOworCisgIC8qIERyb3AgbG9ja3MgdG8gY2FsbCBvdXQgdG8gYXBwIGNvZGUgKi8KKyAgQ09OTkVDVElPTl9VTkxPQ0sgKHBlbmRpbmctPmNvbm5lY3Rpb24pOworICAKKyAgaWYgKHJldHZhbCkKKyAgICB7CisgICAgICBpZiAob2xkX2ZyZWVfZnVuYykKKyAgICAgICAgKCogb2xkX2ZyZWVfZnVuYykgKG9sZF9kYXRhKTsKKyAgICB9CisKKyAgQ09OTkVDVElPTl9MT0NLIChwZW5kaW5nLT5jb25uZWN0aW9uKTsKKyAgCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKiBAfSAqLworCisvKioKKyAqIEBkZWZncm91cCBEQnVzUGVuZGluZ0NhbGwgREJ1c1BlbmRpbmdDYWxsCisgKiBAaW5ncm91cCAgREJ1cworICogQGJyaWVmIFBlbmRpbmcgcmVwbHkgdG8gYSBtZXRob2QgY2FsbCBtZXNzYWdlCisgKgorICogQSBEQnVzUGVuZGluZ0NhbGwgaXMgYW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbgorICogZXhwZWN0ZWQgcmVwbHkuIEEgI0RCdXNQZW5kaW5nQ2FsbCBjYW4gYmUgY3JlYXRlZAorICogd2hlbiB5b3Ugc2VuZCBhIG1lc3NhZ2UgdGhhdCBzaG91bGQgaGF2ZSBhIHJlcGx5LgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBAZGVmIERCVVNfVElNRU9VVF9JTkZJTklURQorICoKKyAqIEFuIGludGVnZXIgY29uc3RhbnQgcmVwcmVzZW50aW5nIGFuIGluZmluaXRlIHRpbWVvdXQuIFRoaXMgaGFzIHRoZQorICogbnVtZXJpYyB2YWx1ZSAweDdmZmZmZmZmICh0aGUgbGFyZ2VzdCAzMi1iaXQgc2lnbmVkIGludGVnZXIpLgorICoKKyAqIEZvciBzb3VyY2UgY29tcGF0aWJpbGl0eSB3aXRoIEQtQnVzIHZlcnNpb25zIGVhcmxpZXIgdGhhbiAxLjQuMTIsIHVzZQorICogMHg3ZmZmZmZmZiwgb3IgSU5UMzJfTUFYIChhc3N1bWluZyB5b3VyIHBsYXRmb3JtIGhhcyBpdCkuCisgKi8KKworLyoqCisgKiBAZGVmIERCVVNfVElNRU9VVF9VU0VfREVGQVVMVAorICoKKyAqIEFuIGludGVnZXIgY29uc3RhbnQgcmVwcmVzZW50aW5nIGEgcmVxdWVzdCB0byB1c2UgdGhlIGRlZmF1bHQgdGltZW91dC4KKyAqIFRoaXMgaGFzIG51bWVyaWMgdmFsdWUgLTEuCisgKgorICogRm9yIHNvdXJjZSBjb21wYXRpYmlsaXR5IHdpdGggRC1CdXMgdmVyc2lvbnMgZWFybGllciB0aGFuIDEuNC4xMiwgdXNlIGEKKyAqIGxpdGVyYWwgLTEuCisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBEQnVzUGVuZGluZ0NhbGwKKyAqCisgKiBPcGFxdWUgZGF0YSB0eXBlIHJlcHJlc2VudGluZyBhIG1lc3NhZ2UgcGVuZGluZy4KKyAqLworCisvKioKKyAqIEluY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiBhIHBlbmRpbmcgY2FsbC4KKyAqCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZyBjYWxsIG9iamVjdAorICogQHJldHVybnMgdGhlIHBlbmRpbmcgY2FsbCBvYmplY3QKKyAqLworREJ1c1BlbmRpbmdDYWxsICoKK2RidXNfcGVuZGluZ19jYWxsX3JlZiAoREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nKQoreworICBkYnVzX2ludDMyX3Qgb2xkX3JlZmNvdW50OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGVuZGluZyAhPSBOVUxMLCBOVUxMKTsKKworICBvbGRfcmVmY291bnQgPSBfZGJ1c19hdG9taWNfaW5jICgmcGVuZGluZy0+cmVmY291bnQpOworICBfZGJ1c19wZW5kaW5nX2NhbGxfdHJhY2VfcmVmIChwZW5kaW5nLCBvbGRfcmVmY291bnQsIG9sZF9yZWZjb3VudCArIDEsCisgICAgICAicmVmIik7CisKKyAgcmV0dXJuIHBlbmRpbmc7Cit9CisKKy8qKgorICogRGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIGEgcGVuZGluZyBjYWxsLAorICogZnJlZWluZyBpdCBpZiB0aGUgY291bnQgcmVhY2hlcyAwLgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwgb2JqZWN0CisgKi8KK3ZvaWQKK2RidXNfcGVuZGluZ19jYWxsX3VucmVmIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcpCit7CisgIGRidXNfaW50MzJfdCBvbGRfcmVmY291bnQ7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKHBlbmRpbmcgIT0gTlVMTCk7CisKKyAgb2xkX3JlZmNvdW50ID0gX2RidXNfYXRvbWljX2RlYyAoJnBlbmRpbmctPnJlZmNvdW50KTsKKyAgX2RidXNfcGVuZGluZ19jYWxsX3RyYWNlX3JlZiAocGVuZGluZywgb2xkX3JlZmNvdW50LCBvbGRfcmVmY291bnQgLSAxLAorICAgICAgInVucmVmIik7CisKKyAgaWYgKG9sZF9yZWZjb3VudCA9PSAxKQorICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9sYXN0X3VucmVmKHBlbmRpbmcpOworfQorCisvKioKKyAqIFNldHMgYSBub3RpZmljYXRpb24gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHJlcGx5IGlzCisgKiByZWNlaXZlZCBvciB0aGUgcGVuZGluZyBjYWxsIHRpbWVzIG91dC4KKyAqCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZyBjYWxsCisgKiBAcGFyYW0gZnVuY3Rpb24gbm90aWZpZXIgZnVuY3Rpb24KKyAqIEBwYXJhbSB1c2VyX2RhdGEgZGF0YSB0byBwYXNzIHRvIG5vdGlmaWVyIGZ1bmN0aW9uCisgKiBAcGFyYW0gZnJlZV91c2VyX2RhdGEgZnVuY3Rpb24gdG8gZnJlZSB0aGUgdXNlciBkYXRhCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkgKERCdXNQZW5kaW5nQ2FsbCAgICAgICAgICAgICAgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUGVuZGluZ0NhbGxOb3RpZnlGdW5jdGlvbiBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgICAgIGZyZWVfdXNlcl9kYXRhKQoreworICBkYnVzX2Jvb2xfdCByZXQgPSBGQUxTRTsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHBlbmRpbmcgIT0gTlVMTCwgRkFMU0UpOworCisgIENPTk5FQ1RJT05fTE9DSyAocGVuZGluZy0+Y29ubmVjdGlvbik7CisgIAorICAvKiBjb3VsZCBpbnZva2UgYXBwbGljYXRpb24gY29kZSEgKi8KKyAgaWYgKCFfZGJ1c19wZW5kaW5nX2NhbGxfc2V0X2RhdGFfdW5sb2NrZWQgKHBlbmRpbmcsIG5vdGlmeV91c2VyX2RhdGFfc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfZGF0YSwgZnJlZV91c2VyX2RhdGEpKQorICAgIGdvdG8gb3V0OworICAKKyAgcGVuZGluZy0+ZnVuY3Rpb24gPSBmdW5jdGlvbjsKKyAgcmV0ID0gVFJVRTsKKworb3V0OgorICBDT05ORUNUSU9OX1VOTE9DSyAocGVuZGluZy0+Y29ubmVjdGlvbik7CisgIAorICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIENhbmNlbHMgdGhlIHBlbmRpbmcgY2FsbCwgc3VjaCB0aGF0IGFueSByZXBseSBvciBlcnJvciByZWNlaXZlZAorICogd2lsbCBqdXN0IGJlIGlnbm9yZWQuICBEcm9wcyB0aGUgZGJ1cyBsaWJyYXJ5J3MgaW50ZXJuYWwgcmVmZXJlbmNlCisgKiB0byB0aGUgI0RCdXNQZW5kaW5nQ2FsbCBzbyB3aWxsIGZyZWUgdGhlIGNhbGwgaWYgbm9ib2R5IGVsc2UgaXMKKyAqIGhvbGRpbmcgYSByZWZlcmVuY2UuIEhvd2V2ZXIgeW91IHVzdWFsbHkgZ2V0IGEgcmVmZXJlbmNlIGZyb20KKyAqIGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkoKSBzbyBwcm9iYWJseSB5b3VyIGFwcCBvd25zIGEgcmVmCisgKiBhbHNvLgorICoKKyAqIE5vdGUgdGhhdCBjYW5jZWxpbmcgYSBwZW5kaW5nIGNhbGwgd2lsbCA8ZW0+bm90PC9lbT4gc2ltdWxhdGUgYQorICogdGltZWQtb3V0IGNhbGw7IGlmIGEgY2FsbCB0aW1lcyBvdXQsIHRoZW4gYSB0aW1lb3V0IGVycm9yIHJlcGx5IGlzCisgKiByZWNlaXZlZC4gSWYgeW91IGNhbmNlbCB0aGUgY2FsbCwgbm8gcmVwbHkgaXMgcmVjZWl2ZWQgdW5sZXNzIHRoZQorICogdGhlIHJlcGx5IHdhcyBhbHJlYWR5IHJlY2VpdmVkIGJlZm9yZSB5b3UgY2FuY2VsZWQuCisgKiAKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwKKyAqLwordm9pZAorZGJ1c19wZW5kaW5nX2NhbGxfY2FuY2VsIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcpCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChwZW5kaW5nICE9IE5VTEwpOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3BlbmRpbmdfY2FsbCAocGVuZGluZy0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nKTsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciB0aGUgcGVuZGluZyBjYWxsIGhhcyByZWNlaXZlZCBhIHJlcGx5CisgKiB5ZXQsIG9yIG5vdC4KKyAqCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZyBjYWxsCisgKiBAcmV0dXJucyAjVFJVRSBpZiBhIHJlcGx5IGhhcyBiZWVuIHJlY2VpdmVkCisgKi8KK2RidXNfYm9vbF90CitkYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29tcGxldGVkIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcpCit7CisgIGRidXNfYm9vbF90IGNvbXBsZXRlZDsKKyAgCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGVuZGluZyAhPSBOVUxMLCBGQUxTRSk7CisKKyAgQ09OTkVDVElPTl9MT0NLIChwZW5kaW5nLT5jb25uZWN0aW9uKTsKKyAgY29tcGxldGVkID0gcGVuZGluZy0+Y29tcGxldGVkOworICBDT05ORUNUSU9OX1VOTE9DSyAocGVuZGluZy0+Y29ubmVjdGlvbik7CisKKyAgcmV0dXJuIGNvbXBsZXRlZDsKK30KKworLyoqCisgKiBHZXRzIHRoZSByZXBseSwgb3IgcmV0dXJucyAjTlVMTCBpZiBub25lIGhhcyBiZWVuIHJlY2VpdmVkCisgKiB5ZXQuIE93bmVyc2hpcCBvZiB0aGUgcmVwbHkgbWVzc2FnZSBwYXNzZXMgdG8gdGhlIGNhbGxlci4gVGhpcworICogZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UgcGVyIHBlbmRpbmcgY2FsbCwgc2luY2UgdGhlIHJlcGx5CisgKiBtZXNzYWdlIGlzIHRyYW5mZXJyZWQgdG8gdGhlIGNhbGxlci4KKyAqIAorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmcgY2FsbAorICogQHJldHVybnMgdGhlIHJlcGx5IG1lc3NhZ2Ugb3IgI05VTEwuCisgKi8KK0RCdXNNZXNzYWdlKgorZGJ1c19wZW5kaW5nX2NhbGxfc3RlYWxfcmVwbHkgKERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZykKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIAorICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHBlbmRpbmcgIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGVuZGluZy0+Y29tcGxldGVkLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwZW5kaW5nLT5yZXBseSAhPSBOVUxMLCBOVUxMKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKHBlbmRpbmctPmNvbm5lY3Rpb24pOworICAKKyAgbWVzc2FnZSA9IHBlbmRpbmctPnJlcGx5OworICBwZW5kaW5nLT5yZXBseSA9IE5VTEw7CisKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKHBlbmRpbmctPmNvbm5lY3Rpb24pOworCisgIF9kYnVzX21lc3NhZ2VfdHJhY2VfcmVmIChtZXNzYWdlLCAtMSwgLTEsICJkYnVzX3BlbmRpbmdfY2FsbF9zdGVhbF9yZXBseSIpOworICByZXR1cm4gbWVzc2FnZTsKK30KKworLyoqCisgKiBCbG9jayB1bnRpbCB0aGUgcGVuZGluZyBjYWxsIGlzIGNvbXBsZXRlZC4gIFRoZSBibG9ja2luZyBpcyBhcyB3aXRoCisgKiBkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jaygpOyBpdCBkb2VzIG5vdCBlbnRlciB0aGUKKyAqIG1haW4gbG9vcCBvciBwcm9jZXNzIG90aGVyIG1lc3NhZ2VzLCBpdCBzaW1wbHkgd2FpdHMgZm9yIHRoZSByZXBseQorICogaW4gcXVlc3Rpb24uCisgKgorICogSWYgdGhlIHBlbmRpbmcgY2FsbCBpcyBhbHJlYWR5IGNvbXBsZXRlZCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zCisgKiBpbW1lZGlhdGVseS4KKyAqCisgKiBAdG9kbyB3aGVuIHlvdSBzdGFydCBibG9ja2luZywgdGhlIHRpbWVvdXQgaXMgcmVzZXQsIGJ1dCBpdCBzaG91bGQKKyAqIHJlYWxseSBvbmx5IHVzZSB0aW1lIHJlbWFpbmluZyBzaW5jZSB0aGUgcGVuZGluZyBjYWxsIHdhcyBjcmVhdGVkLgorICogVGhpcyByZXF1aXJlcyBzdG9yaW5nIHRpbWVzdGFtcHMgaW5zdGVhZCBvZiBpbnRlcnZhbHMgaW4gdGhlIHRpbWVvdXQKKyAqCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZyBjYWxsCisgKi8KK3ZvaWQKK2RidXNfcGVuZGluZ19jYWxsX2Jsb2NrIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcpCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChwZW5kaW5nICE9IE5VTEwpOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fYmxvY2tfcGVuZGluZ19jYWxsIChwZW5kaW5nKTsKK30KKworLyoqCisgKiBBbGxvY2F0ZXMgYW4gaW50ZWdlciBJRCB0byBiZSB1c2VkIGZvciBzdG9yaW5nIGFwcGxpY2F0aW9uLXNwZWNpZmljCisgKiBkYXRhIG9uIGFueSBEQnVzUGVuZGluZ0NhbGwuIFRoZSBhbGxvY2F0ZWQgSUQgbWF5IHRoZW4gYmUgdXNlZAorICogd2l0aCBkYnVzX3BlbmRpbmdfY2FsbF9zZXRfZGF0YSgpIGFuZCBkYnVzX3BlbmRpbmdfY2FsbF9nZXRfZGF0YSgpLgorICogVGhlIHBhc3NlZC1pbiBzbG90IG11c3QgYmUgaW5pdGlhbGl6ZWQgdG8gLTEsIGFuZCBpcyBmaWxsZWQgaW4KKyAqIHdpdGggdGhlIHNsb3QgSUQuIElmIHRoZSBwYXNzZWQtaW4gc2xvdCBpcyBub3QgLTEsIGl0J3MgYXNzdW1lZAorICogdG8gYmUgYWxyZWFkeSBhbGxvY2F0ZWQsIGFuZCBpdHMgcmVmY291bnQgaXMgaW5jcmVtZW50ZWQuCisgKiAKKyAqIFRoZSBhbGxvY2F0ZWQgc2xvdCBpcyBnbG9iYWwsIGkuZS4gYWxsIERCdXNQZW5kaW5nQ2FsbCBvYmplY3RzIHdpbGwKKyAqIGhhdmUgYSBzbG90IHdpdGggdGhlIGdpdmVuIGludGVnZXIgSUQgcmVzZXJ2ZWQuCisgKgorICogQHBhcmFtIHNsb3RfcCBhZGRyZXNzIG9mIGEgZ2xvYmFsIHZhcmlhYmxlIHN0b3JpbmcgdGhlIHNsb3QKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBmYWlsdXJlIChubyBtZW1vcnkpCisgKi8KK2RidXNfYm9vbF90CitkYnVzX3BlbmRpbmdfY2FsbF9hbGxvY2F0ZV9kYXRhX3Nsb3QgKGRidXNfaW50MzJfdCAqc2xvdF9wKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNsb3RfcCAhPSBOVUxMLCBGQUxTRSk7CisKKyAgcmV0dXJuIF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfYWxsb2MgKCZzbG90X2FsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfREJVU19MT0NLX05BTUUgKHBlbmRpbmdfY2FsbF9zbG90cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90X3ApOworfQorCisvKioKKyAqIERlYWxsb2NhdGVzIGEgZ2xvYmFsIElEIGZvciAjREJ1c1BlbmRpbmdDYWxsIGRhdGEgc2xvdHMuCisgKiBkYnVzX3BlbmRpbmdfY2FsbF9nZXRfZGF0YSgpIGFuZCBkYnVzX3BlbmRpbmdfY2FsbF9zZXRfZGF0YSgpIG1heQorICogbm8gbG9uZ2VyIGJlIHVzZWQgd2l0aCB0aGlzIHNsb3QuICBFeGlzdGluZyBkYXRhIHN0b3JlZCBvbiBleGlzdGluZworICogREJ1c1BlbmRpbmdDYWxsIG9iamVjdHMgd2lsbCBiZSBmcmVlZCB3aGVuIHRoZSAjREJ1c1BlbmRpbmdDYWxsIGlzCisgKiBmaW5hbGl6ZWQsIGJ1dCBtYXkgbm90IGJlIHJldHJpZXZlZCAoYW5kIG1heSBvbmx5IGJlIHJlcGxhY2VkIGlmCisgKiBzb21lb25lIGVsc2UgcmVhbGxvY2F0ZXMgdGhlIHNsb3QpLiAgV2hlbiB0aGUgcmVmY291bnQgb24gdGhlCisgKiBwYXNzZWQtaW4gc2xvdCByZWFjaGVzIDAsIGl0IGlzIHNldCB0byAtMS4KKyAqCisgKiBAcGFyYW0gc2xvdF9wIGFkZHJlc3Mgc3RvcmluZyB0aGUgc2xvdCB0byBkZWFsbG9jYXRlCisgKi8KK3ZvaWQKK2RidXNfcGVuZGluZ19jYWxsX2ZyZWVfZGF0YV9zbG90IChkYnVzX2ludDMyX3QgKnNsb3RfcCkKK3sKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKHNsb3RfcCAhPSBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKCpzbG90X3AgPj0gMCk7CisKKyAgX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9mcmVlICgmc2xvdF9hbGxvY2F0b3IsIHNsb3RfcCk7Cit9CisKKy8qKgorICogU3RvcmVzIGEgcG9pbnRlciBvbiBhICNEQnVzUGVuZGluZ0NhbGwsIGFsb25nCisgKiB3aXRoIGFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIGJlIHVzZWQgZm9yIGZyZWVpbmcKKyAqIHRoZSBkYXRhIHdoZW4gdGhlIGRhdGEgaXMgc2V0IGFnYWluLCBvciB3aGVuCisgKiB0aGUgcGVuZGluZyBjYWxsIGlzIGZpbmFsaXplZC4gVGhlIHNsb3QgbnVtYmVyCisgKiBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgd2l0aCBkYnVzX3BlbmRpbmdfY2FsbF9hbGxvY2F0ZV9kYXRhX3Nsb3QoKS4KKyAqCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZ19jYWxsCisgKiBAcGFyYW0gc2xvdCB0aGUgc2xvdCBudW1iZXIKKyAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIHRvIHN0b3JlCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmMgZmluYWxpemVyIGZ1bmN0aW9uIGZvciB0aGUgZGF0YQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlcmUgd2FzIGVub3VnaCBtZW1vcnkgdG8gc3RvcmUgdGhlIGRhdGEKKyAqLworZGJ1c19ib29sX3QKK2RidXNfcGVuZGluZ19jYWxsX3NldF9kYXRhIChEQnVzUGVuZGluZ0NhbGwgICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCAgICAgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICBmcmVlX2RhdGFfZnVuYykKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICAKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwZW5kaW5nICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChzbG90ID49IDAsIEZBTFNFKTsKKworICAKKyAgQ09OTkVDVElPTl9MT0NLIChwZW5kaW5nLT5jb25uZWN0aW9uKTsKKyAgcmV0dmFsID0gX2RidXNfcGVuZGluZ19jYWxsX3NldF9kYXRhX3VubG9ja2VkIChwZW5kaW5nLCBzbG90LCBkYXRhLCBmcmVlX2RhdGFfZnVuYyk7CisgIENPTk5FQ1RJT05fVU5MT0NLIChwZW5kaW5nLT5jb25uZWN0aW9uKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBSZXRyaWV2ZXMgZGF0YSBwcmV2aW91c2x5IHNldCB3aXRoIGRidXNfcGVuZGluZ19jYWxsX3NldF9kYXRhKCkuCisgKiBUaGUgc2xvdCBtdXN0IHN0aWxsIGJlIGFsbG9jYXRlZCAobXVzdCBub3QgaGF2ZSBiZWVuIGZyZWVkKS4KKyAqCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZ19jYWxsCisgKiBAcGFyYW0gc2xvdCB0aGUgc2xvdCB0byBnZXQgZGF0YSBmcm9tCisgKiBAcmV0dXJucyB0aGUgZGF0YSwgb3IgI05VTEwgaWYgbm90IGZvdW5kCisgKi8KK3ZvaWQqCitkYnVzX3BlbmRpbmdfY2FsbF9nZXRfZGF0YSAoREJ1c1BlbmRpbmdDYWxsICAgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICAgIHNsb3QpCit7CisgIHZvaWQgKnJlczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHBlbmRpbmcgIT0gTlVMTCwgTlVMTCk7CisKKyAgQ09OTkVDVElPTl9MT0NLIChwZW5kaW5nLT5jb25uZWN0aW9uKTsKKyAgcmVzID0gX2RidXNfZGF0YV9zbG90X2xpc3RfZ2V0ICgmc2xvdF9hbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlbmRpbmctPnNsb3RfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90KTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKHBlbmRpbmctPmNvbm5lY3Rpb24pOworCisgIHJldHVybiByZXM7Cit9CisKKy8qKiBAfSAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtcGVuZGluZy1jYWxsLmggYi9kYnVzL2RidXMvZGJ1cy1wZW5kaW5nLWNhbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTM3ZWMwCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtcGVuZGluZy1jYWxsLmgKQEAgLTAsMCArMSw3OSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXBlbmRpbmctY2FsbC5oIE9iamVjdCByZXByZXNlbnRpbmcgYSBjYWxsIGluIHByb2dyZXNzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZiAhZGVmaW5lZCAoREJVU19JTlNJREVfREJVU19IKSAmJiAhZGVmaW5lZCAoREJVU19DT01QSUxBVElPTikKKyNlcnJvciAiT25seSA8ZGJ1cy9kYnVzLmg+IGNhbiBiZSBpbmNsdWRlZCBkaXJlY3RseSwgdGhpcyBmaWxlIG1heSBkaXNhcHBlYXIgb3IgY2hhbmdlIGNvbnRlbnRzLiIKKyNlbmRpZgorCisjaWZuZGVmIERCVVNfUEVORElOR19DQUxMX0gKKyNkZWZpbmUgREJVU19QRU5ESU5HX0NBTExfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzUGVuZGluZ0NhbGwKKyAqIEB7CisgKi8KKworI2RlZmluZSBEQlVTX1RJTUVPVVRfSU5GSU5JVEUgKChpbnQpIDB4N2ZmZmZmZmYpCisjZGVmaW5lIERCVVNfVElNRU9VVF9VU0VfREVGQVVMVCAoLTEpCisKK0RCVVNfRVhQT1JUCitEQnVzUGVuZGluZ0NhbGwqIGRidXNfcGVuZGluZ19jYWxsX3JlZiAgICAgICAoREJ1c1BlbmRpbmdDYWxsICAgICAgICAgICAgICAgKnBlbmRpbmcpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiAgICAgICAgIChEQnVzUGVuZGluZ0NhbGwgICAgICAgICAgICAgICAqcGVuZGluZyk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgIGRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkgICAgKERCdXNQZW5kaW5nQ2FsbCAgICAgICAgICAgICAgICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQZW5kaW5nQ2FsbE5vdGlmeUZ1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgICAgICBmcmVlX3VzZXJfZGF0YSk7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgIGRidXNfcGVuZGluZ19jYWxsX2NhbmNlbCAgICAgICAgKERCdXNQZW5kaW5nQ2FsbCAgICAgICAgICAgICAgICpwZW5kaW5nKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZCAoREJ1c1BlbmRpbmdDYWxsICAgICAgICAgICAgICAgKnBlbmRpbmcpOworREJVU19FWFBPUlQKK0RCdXNNZXNzYWdlKiBkYnVzX3BlbmRpbmdfY2FsbF9zdGVhbF9yZXBseSAgIChEQnVzUGVuZGluZ0NhbGwgICAgICAgICAgICAgICAqcGVuZGluZyk7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgIGRidXNfcGVuZGluZ19jYWxsX2Jsb2NrICAgICAgICAgKERCdXNQZW5kaW5nQ2FsbCAgICAgICAgICAgICAgICpwZW5kaW5nKTsKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfcGVuZGluZ19jYWxsX2FsbG9jYXRlX2RhdGFfc2xvdCAoZGJ1c19pbnQzMl90ICAgICAqc2xvdF9wKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX3BlbmRpbmdfY2FsbF9mcmVlX2RhdGFfc2xvdCAgICAgKGRidXNfaW50MzJfdCAgICAgKnNsb3RfcCk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19wZW5kaW5nX2NhbGxfc2V0X2RhdGEgICAgICAgICAgIChEQnVzUGVuZGluZ0NhbGwgICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICBmcmVlX2RhdGFfZnVuYyk7CitEQlVTX0VYUE9SVAordm9pZCogICAgICAgZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2RhdGEgICAgICAgICAgIChEQnVzUGVuZGluZ0NhbGwgICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICBzbG90KTsKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1BFTkRJTkdfQ0FMTF9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1waXBlLXVuaXguYyBiL2RidXMvZGJ1cy9kYnVzLXBpcGUtdW5peC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYzU3MDQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1waXBlLXVuaXguYwpAQCAtMCwwICsxLDgzIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtcGlwZS11bml4LmMgdW5peCByZWxhdGVkIHBpcGUgaW1wbGVtZW50YXRpb24KKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA2ICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1waXBlLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLXVuaXguaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisKKy8qKgorICogd3JpdGUgZGF0YSB0byBhIHBpcGUuCisgKgorICogQHBhcmFtIHBpcGUgdGhlIHBpcGUgaW5zdGFuY2UKKyAqIEBwYXJhbSBidWZmZXIgdGhlIGJ1ZmZlciB0byB3cml0ZSBkYXRhIGZyb20KKyAqIEBwYXJhbSBzdGFydCB0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgYnVmZmVyIHRvIHdyaXRlCisgKiBAcGFyYW0gbGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gdHJ5IHRvIHdyaXRlCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gb3IgLTEgb24gZXJyb3IKKyAqLworaW50CitfZGJ1c19waXBlX3dyaXRlIChEQnVzUGlwZSAgICAgICAgICpwaXBlLAorICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgaW50IHdyaXR0ZW47CisgIAorICB3cml0dGVuID0gX2RidXNfd3JpdGUgKHBpcGUtPmZkLCBidWZmZXIsIHN0YXJ0LCBsZW4pOworICBpZiAod3JpdHRlbiA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiV3JpdGluZyB0byBwaXBlOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICB9CisgIHJldHVybiB3cml0dGVuOworfQorCisvKioKKyAqIGNsb3NlIGEgcGlwZS4KKyAqCisgKiBAcGFyYW0gcGlwZSB0aGUgcGlwZSBpbnN0YW5jZQorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgYW4gZXJyb3IKKyAqIEByZXR1cm5zIC0xIGlmIGVycm9yIGlzIHNldAorICovCitpbnQKK19kYnVzX3BpcGVfY2xvc2UgIChEQnVzUGlwZSAgICAgICAgICpwaXBlLAorICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBpZiAoIV9kYnVzX2Nsb3NlIChwaXBlLT5mZCwgZXJyb3IpKQorICAgIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19waXBlX2ludmFsaWRhdGUgKHBpcGUpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtcGlwZS13aW4uYyBiL2RidXMvZGJ1cy9kYnVzLXBpcGUtd2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM3YzI1NwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXBpcGUtd2luLmMKQEAgLTAsMCArMSw5MCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXBpcGUtd2luLmMgd2luZG93cyByZWxhdGVkIHBpcGUgaW1wbGVtZW50YXRpb24KKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA2ICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1waXBlLmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8aW8uaD4KKworLyoqCisgKiB3cml0ZSBkYXRhIHRvIGEgcGlwZS4KKyAqCisgKiBAcGFyYW0gcGlwZSB0aGUgcGlwZSBpbnN0YW5jZQorICogQHBhcmFtIGJ1ZmZlciB0aGUgYnVmZmVyIHRvIHdyaXRlIGRhdGEgZnJvbQorICogQHBhcmFtIHN0YXJ0IHRoZSBmaXJzdCBieXRlIGluIHRoZSBidWZmZXIgdG8gd3JpdGUKKyAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byB0cnkgdG8gd3JpdGUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciByZXR1cm4KKyAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBvciAtMSBvbiBlcnJvcgorICovCitpbnQKK19kYnVzX3BpcGVfd3JpdGUgKERCdXNQaXBlICAgICAgICAgKnBpcGUsCisgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpidWZmZXJfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoYnVmZmVyKTsKKyAgaW50IHdyaXR0ZW47CisKKyAgd3JpdHRlbiA9IF93cml0ZSAocGlwZS0+ZmQsIGJ1ZmZlcl9jICsgc3RhcnQsIGxlbik7CisKKyAgaWYgKHdyaXR0ZW4gPj0gMCkKKyAgICByZXR1cm4gd3JpdHRlbjsKKworICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fc3lzdGVtX2Vycm5vICgpLAorICAgICAgICAgICAgICAgICAgIldyaXRpbmcgdG8gcGlwZTogJXMiLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgIHJldHVybiAtMTsKK30KKworLyoqCisgKiBjbG9zZSBhIHBpcGUuCisgKgorICogQHBhcmFtIHBpcGUgdGhlIHBpcGUgaW5zdGFuY2UKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGFuIGVycm9yCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgZXJyb3IgaXMgc2V0CisgKi8KK2ludAorX2RidXNfcGlwZV9jbG9zZSAgKERCdXNQaXBlICAgICAgICAgKnBpcGUsCisgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmIChfY2xvc2UgKHBpcGUtPmZkKSAhPSAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9zeXN0ZW1fZXJybm8gKCksCisgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjbG9zZSBwaXBlIGZkICVkOiAlcyIsIHBpcGUtPmZkLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKCkpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3BpcGVfaW52YWxpZGF0ZSAocGlwZSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1waXBlLmMgYi9kYnVzL2RidXMvZGJ1cy1waXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I1ZmU2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXBpcGUuYwpAQCAtMCwwICsxLDg1IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtcGlwZS5jIHBpcGUgaW1wbGVtZW50YXRpb24gKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDYgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1waXBlLmgiCisKKy8qCisgKiBpbml0IGEgcGlwZSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcGlwZSB0aGUgcGlwZQorICogQHBhcmFtIGZkIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gaW5pdCBmcm9tIAorICovCit2b2lkCitfZGJ1c19waXBlX2luaXQgKERCdXNQaXBlICpwaXBlLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgZmQpCit7CisgIHBpcGUtPmZkID0gZmQ7Cit9CisKKy8qKgorICogaW5pdCBhIHBpcGUgd2l0aCBzdGRvdXQKKyAqCisgKiBAcGFyYW0gcGlwZSB0aGUgcGlwZQorICovCit2b2lkCitfZGJ1c19waXBlX2luaXRfc3Rkb3V0IChEQnVzUGlwZSAqcGlwZSkKK3sKKyAgX2RidXNfcGlwZV9pbml0IChwaXBlLCAxKTsKK30KKworLyoqCisgKiBjaGVjayBpZiBhIHBpcGUgaXMgdmFsaWQ7IHBpcGVzIGNhbiBiZSBzZXQgaW52YWxpZCwgc2ltaWxhciB0bworICogYSAtMSBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIHBpcGUgdGhlIHBpcGUgaW5zdGFuY2UKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBwaXBlIGlzIG5vdCB2YWxpZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfcGlwZV9pc192YWxpZChEQnVzUGlwZSAqcGlwZSkKK3sKKyAgcmV0dXJuIHBpcGUtPmZkID49IDA7Cit9CisKKy8qKgorICogQ2hlY2sgaWYgYSBwaXBlIGlzIHN0ZG91dCBvciBzdGRlcnIuCisgKgorICogQHBhcmFtIHBpcGUgdGhlIHBpcGUgaW5zdGFuY2UKKyAqIEByZXR1cm5zICNUUlVFIGlmIHBpcGUgaXMgb25lIG9mIHRoZSBzdGFuZGFyZCBvdXQvZXJyIGNoYW5uZWxzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19waXBlX2lzX3N0ZG91dF9vcl9zdGRlcnIgKERCdXNQaXBlICpwaXBlKQoreworICByZXR1cm4gcGlwZS0+ZmQgPT0gMSB8fCBwaXBlLT5mZCA9PSAyOworfQorCisvKioKKyAqIEluaXRpYWxpemVzIGEgcGlwZSB0byBhbiBpbnZhbGlkIHZhbHVlLgorICogQHBhcmFtIHBpcGUgdGhlIHBpcGUKKyAqLwordm9pZAorX2RidXNfcGlwZV9pbnZhbGlkYXRlIChEQnVzUGlwZSAqcGlwZSkKK3sKKyAgcGlwZS0+ZmQgPSAtMTsKK30KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLXBpcGUuaCBiL2RidXMvZGJ1cy9kYnVzLXBpcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjA2M2I1Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtcGlwZS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zeXNkZXBzLmggV3JhcHBlcnMgYXJvdW5kIHN5c3RlbS9saWJjIGZlYXR1cmVzIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX1BJUEVfSAorI2RlZmluZSBEQlVTX1BJUEVfSAorCisjaWZkZWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZXJyb3JzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisKK3N0cnVjdCBEQnVzUGlwZSB7CisgIGludCBmZDsKK307CisKK3ZvaWQgICAgICAgIF9kYnVzX3BpcGVfaW5pdCAgICAgICAgICAgICAgICAoREJ1c1BpcGUgICAgICAgICAqcGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgZmQpOwordm9pZCAgICAgICAgX2RidXNfcGlwZV9pbml0X3N0ZG91dCAgICAgICAgIChEQnVzUGlwZSAgICAgICAgICpwaXBlKTsKK2ludCAgICAgICAgIF9kYnVzX3BpcGVfd3JpdGUgICAgICAgICAgICAgICAoREJ1c1BpcGUgICAgICAgICAqcGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitpbnQgICAgICAgICBfZGJ1c19waXBlX2Nsb3NlICAgICAgICAgICAgICAgKERCdXNQaXBlICAgICAgICAgKnBpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90IF9kYnVzX3BpcGVfaXNfdmFsaWQgICAgICAgICAgICAoREJ1c1BpcGUgICAgICAgICAqcGlwZSk7Cit2b2lkICAgICAgICBfZGJ1c19waXBlX2ludmFsaWRhdGUgICAgICAgICAgKERCdXNQaXBlICAgICAgICAgKnBpcGUpOworZGJ1c19ib29sX3QgX2RidXNfcGlwZV9pc19zdGRvdXRfb3Jfc3RkZXJyIChEQnVzUGlwZSAgICAgICAgICpwaXBlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1wcm90b2NvbC5oIGIvZGJ1cy9kYnVzL2RidXMtcHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDYwNWFiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtcHJvdG9jb2wuaApAQCAtMCwwICsxLDQ3MCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXByb3RvY29sLmggIEQtQnVzIHByb3RvY29sIGNvbnN0YW50cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfUFJPVE9DT0xfSAorI2RlZmluZSBEQlVTX1BST1RPQ09MX0gKKworLyogRG9uJ3QgaW5jbHVkZSBhbnl0aGluZyBpbiBoZXJlIGZyb20gYW55d2hlcmUgZWxzZS4gSXQncworICogaW50ZW5kZWQgZm9yIHVzZSBieSBhbnkgcmFuZG9tIGxpYnJhcnkuCisgKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjaWYgMAorfSAvKiBhdm9pZHMgY29uZnVzaW5nIGVtYWNzIGluZGVudGF0aW9uICovCisjZW5kaWYKKyNlbmRpZgorCisvKiBOb3JtYWxseSBkb2NzIGFyZSBpbiAuYyBmaWxlcywgYnV0IHRoZXJlIGlzbid0IGEgLmMgZmlsZSBmb3IgdGhpcy4gKi8KKy8qKgorICogQGRlZmdyb3VwIERCdXNQcm90b2NvbCBQcm90b2NvbCBjb25zdGFudHMKKyAqIEBpbmdyb3VwICBEQnVzCisgKgorICogQGJyaWVmIERlZmluZXMgY29uc3RhbnRzIHdoaWNoIGFyZSBwYXJ0IG9mIHRoZSBELUJ1cyBwcm90b2NvbAorICoKKyAqIFRoaXMgaGVhZGVyIGlzIGludGVuZGVkIGZvciB1c2UgYnkgYW55IGxpYnJhcnksIG5vdCBvbmx5IGxpYmRidXMuCisgKgorICogQHsKKyAqLworCisKKy8qIE1lc3NhZ2UgYnl0ZSBvcmRlciAqLworI2RlZmluZSBEQlVTX0xJVFRMRV9FTkRJQU4gKCdsJykgIC8qKjwgQ29kZSBtYXJraW5nIExTQi1maXJzdCBieXRlIG9yZGVyIGluIHRoZSB3aXJlIHByb3RvY29sLiAqLworI2RlZmluZSBEQlVTX0JJR19FTkRJQU4gICAgKCdCJykgIC8qKjwgQ29kZSBtYXJraW5nIE1TQi1maXJzdCBieXRlIG9yZGVyIGluIHRoZSB3aXJlIHByb3RvY29sLiAqLworCisvKiogUHJvdG9jb2wgdmVyc2lvbi4gKi8KKyNkZWZpbmUgREJVU19NQUpPUl9QUk9UT0NPTF9WRVJTSU9OIDEKKworLyoqIFR5cGUgY29kZSB0aGF0IGlzIG5ldmVyIGVxdWFsIHRvIGEgbGVnaXRpbWF0ZSB0eXBlIGNvZGUgKi8KKyNkZWZpbmUgREJVU19UWVBFX0lOVkFMSUQgICAgICAgKChpbnQpICdcMCcpCisvKiogI0RCVVNfVFlQRV9JTlZBTElEIGFzIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfVFlQRV9JTlZBTElEX0FTX1NUUklORyAgICAgICAgIlwwIgorCisvKiBQcmltaXRpdmUgdHlwZXMgKi8KKy8qKiBUeXBlIGNvZGUgbWFya2luZyBhbiA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyICovCisjZGVmaW5lIERCVVNfVFlQRV9CWVRFICAgICAgICAgICgoaW50KSAneScpCisvKiogI0RCVVNfVFlQRV9CWVRFIGFzIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfVFlQRV9CWVRFX0FTX1NUUklORyAgICAgICAgICAgInkiCisvKiogVHlwZSBjb2RlIG1hcmtpbmcgYSBib29sZWFuICovCisjZGVmaW5lIERCVVNfVFlQRV9CT09MRUFOICAgICAgICgoaW50KSAnYicpCisvKiogI0RCVVNfVFlQRV9CT09MRUFOIGFzIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfVFlQRV9CT09MRUFOX0FTX1NUUklORyAgICAgICAgImIiCisvKiogVHlwZSBjb2RlIG1hcmtpbmcgYSAxNi1iaXQgc2lnbmVkIGludGVnZXIgKi8KKyNkZWZpbmUgREJVU19UWVBFX0lOVDE2ICAgICAgICAgKChpbnQpICduJykKKy8qKiAjREJVU19UWVBFX0lOVDE2IGFzIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfVFlQRV9JTlQxNl9BU19TVFJJTkcgICAgICAgICAgIm4iCisvKiogVHlwZSBjb2RlIG1hcmtpbmcgYSAxNi1iaXQgdW5zaWduZWQgaW50ZWdlciAqLworI2RlZmluZSBEQlVTX1RZUEVfVUlOVDE2ICAgICAgICAoKGludCkgJ3EnKQorLyoqICNEQlVTX1RZUEVfVUlOVDE2IGFzIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfVFlQRV9VSU5UMTZfQVNfU1RSSU5HICAgICAgICAgInEiCisvKiogVHlwZSBjb2RlIG1hcmtpbmcgYSAzMi1iaXQgc2lnbmVkIGludGVnZXIgKi8KKyNkZWZpbmUgREJVU19UWVBFX0lOVDMyICAgICAgICAgKChpbnQpICdpJykKKy8qKiAjREJVU19UWVBFX0lOVDMyIGFzIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfVFlQRV9JTlQzMl9BU19TVFJJTkcgICAgICAgICAgImkiCisvKiogVHlwZSBjb2RlIG1hcmtpbmcgYSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciAqLworI2RlZmluZSBEQlVTX1RZUEVfVUlOVDMyICAgICAgICAoKGludCkgJ3UnKQorLyoqICNEQlVTX1RZUEVfVUlOVDMyIGFzIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfVFlQRV9VSU5UMzJfQVNfU1RSSU5HICAgICAgICAgInUiCisvKiogVHlwZSBjb2RlIG1hcmtpbmcgYSA2NC1iaXQgc2lnbmVkIGludGVnZXIgKi8KKyNkZWZpbmUgREJVU19UWVBFX0lOVDY0ICAgICAgICAgKChpbnQpICd4JykKKy8qKiAjREJVU19UWVBFX0lOVDY0IGFzIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfVFlQRV9JTlQ2NF9BU19TVFJJTkcgICAgICAgICAgIngiCisvKiogVHlwZSBjb2RlIG1hcmtpbmcgYSA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciAqLworI2RlZmluZSBEQlVTX1RZUEVfVUlOVDY0ICAgICAgICAoKGludCkgJ3QnKQorLyoqICNEQlVTX1RZUEVfVUlOVDY0IGFzIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfVFlQRV9VSU5UNjRfQVNfU1RSSU5HICAgICAgICAgInQiCisvKiogVHlwZSBjb2RlIG1hcmtpbmcgYW4gOC1ieXRlIGRvdWJsZSBpbiBJRUVFIDc1NCBmb3JtYXQgKi8KKyNkZWZpbmUgREJVU19UWVBFX0RPVUJMRSAgICAgICAgKChpbnQpICdkJykKKy8qKiAjREJVU19UWVBFX0RPVUJMRSBhcyBhIHN0cmluZyBsaXRlcmFsIGluc3RlYWQgb2YgYSBpbnQgbGl0ZXJhbCAqLworI2RlZmluZSBEQlVTX1RZUEVfRE9VQkxFX0FTX1NUUklORyAgICAgICAgICJkIgorLyoqIFR5cGUgY29kZSBtYXJraW5nIGEgVVRGLTggZW5jb2RlZCwgbnVsLXRlcm1pbmF0ZWQgVW5pY29kZSBzdHJpbmcgKi8KKyNkZWZpbmUgREJVU19UWVBFX1NUUklORyAgICAgICAgKChpbnQpICdzJykKKy8qKiAjREJVU19UWVBFX1NUUklORyBhcyBhIHN0cmluZyBsaXRlcmFsIGluc3RlYWQgb2YgYSBpbnQgbGl0ZXJhbCAqLworI2RlZmluZSBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORyAgICAgICAgICJzIgorLyoqIFR5cGUgY29kZSBtYXJraW5nIGEgRC1CdXMgb2JqZWN0IHBhdGggKi8KKyNkZWZpbmUgREJVU19UWVBFX09CSkVDVF9QQVRIICAgKChpbnQpICdvJykKKy8qKiAjREJVU19UWVBFX09CSkVDVF9QQVRIIGFzIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfVFlQRV9PQkpFQ1RfUEFUSF9BU19TVFJJTkcgICAgIm8iCisvKiogVHlwZSBjb2RlIG1hcmtpbmcgYSBELUJ1cyB0eXBlIHNpZ25hdHVyZSAqLworI2RlZmluZSBEQlVTX1RZUEVfU0lHTkFUVVJFICAgICAoKGludCkgJ2cnKQorLyoqICNEQlVTX1RZUEVfU0lHTkFUVVJFIGFzIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfVFlQRV9TSUdOQVRVUkVfQVNfU1RSSU5HICAgICAgImciCisvKiogVHlwZSBjb2RlIG1hcmtpbmcgYSB1bml4IGZpbGUgZGVzY3JpcHRvciAqLworI2RlZmluZSBEQlVTX1RZUEVfVU5JWF9GRCAgICAgICgoaW50KSAnaCcpCisvKiogI0RCVVNfVFlQRV9VTklYX0ZEIGFzIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfVFlQRV9VTklYX0ZEX0FTX1NUUklORyAgICAgICAgImgiCisKKy8qIENvbXBvdW5kIHR5cGVzICovCisvKiogVHlwZSBjb2RlIG1hcmtpbmcgYSBELUJ1cyBhcnJheSB0eXBlICovCisjZGVmaW5lIERCVVNfVFlQRV9BUlJBWSAgICAgICAgICgoaW50KSAnYScpCisvKiogI0RCVVNfVFlQRV9BUlJBWSBhcyBhIHN0cmluZyBsaXRlcmFsIGluc3RlYWQgb2YgYSBpbnQgbGl0ZXJhbCAqLworI2RlZmluZSBEQlVTX1RZUEVfQVJSQVlfQVNfU1RSSU5HICAgICAgICAgICJhIgorLyoqIFR5cGUgY29kZSBtYXJraW5nIGEgRC1CdXMgdmFyaWFudCB0eXBlICovCisjZGVmaW5lIERCVVNfVFlQRV9WQVJJQU5UICAgICAgICgoaW50KSAndicpCisvKiogI0RCVVNfVFlQRV9WQVJJQU5UIGFzIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfVFlQRV9WQVJJQU5UX0FTX1NUUklORyAgICAgICAgInYiCisKKy8qKiBTVFJVQ1QgYW5kIERJQ1RfRU5UUlkgYXJlIHNvcnQgb2Ygc3BlY2lhbCBzaW5jZSB0aGVpciBjb2RlcyBjYW4ndAorICogYXBwZWFyIGluIGEgdHlwZSBzdHJpbmcsIGluc3RlYWQKKyAqIERCVVNfU1RSVUNUX0JFR0lOX0NIQVIvREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVIgaGF2ZSB0byBhcHBlYXIKKyAqLworLyoqIFR5cGUgY29kZSB1c2VkIHRvIHJlcHJlc2VudCBhIHN0cnVjdDsgaG93ZXZlciwgdGhpcyB0eXBlIGNvZGUgZG9lcyBub3QgYXBwZWFyCisgKiBpbiB0eXBlIHNpZ25hdHVyZXMsIGluc3RlYWQgI0RCVVNfU1RSVUNUX0JFR0lOX0NIQVIgYW5kICNEQlVTX1NUUlVDVF9FTkRfQ0hBUiB3aWxsCisgKiBhcHBlYXIgaW4gYSBzaWduYXR1cmUuCisgKi8KKyNkZWZpbmUgREJVU19UWVBFX1NUUlVDVCAgICAgICAgKChpbnQpICdyJykKKy8qKiAjREJVU19UWVBFX1NUUlVDVCBhcyBhIHN0cmluZyBsaXRlcmFsIGluc3RlYWQgb2YgYSBpbnQgbGl0ZXJhbCAqLworI2RlZmluZSBEQlVTX1RZUEVfU1RSVUNUX0FTX1NUUklORyAgICAgICAgICJyIgorLyoqIFR5cGUgY29kZSB1c2VkIHRvIHJlcHJlc2VudCBhIGRpY3QgZW50cnk7IGhvd2V2ZXIsIHRoaXMgdHlwZSBjb2RlIGRvZXMgbm90IGFwcGVhcgorICogaW4gdHlwZSBzaWduYXR1cmVzLCBpbnN0ZWFkICNEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUiBhbmQgI0RCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUiB3aWxsCisgKiBhcHBlYXIgaW4gYSBzaWduYXR1cmUuCisgKi8KKyNkZWZpbmUgREJVU19UWVBFX0RJQ1RfRU5UUlkgICAgKChpbnQpICdlJykKKy8qKiAjREJVU19UWVBFX0RJQ1RfRU5UUlkgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX0RJQ1RfRU5UUllfQVNfU1RSSU5HICAgICAiZSIKKworLyoqIERvZXMgbm90IGluY2x1ZGUgI0RCVVNfVFlQRV9JTlZBTElELCAjREJVU19TVFJVQ1RfQkVHSU5fQ0hBUiwgI0RCVVNfU1RSVUNUX0VORF9DSEFSLAorICogI0RCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSLCBvciAjREJVU19ESUNUX0VOVFJZX0VORF9DSEFSIC0gaS5lLiBpdCBpcyB0aGUgbnVtYmVyIG9mCisgKiB2YWxpZCB0eXBlcywgbm90IHRoZSBudW1iZXIgb2YgZGlzdGluY3QgY2hhcmFjdGVycyB0aGF0IG1heSBhcHBlYXIgaW4gYSB0eXBlIHNpZ25hdHVyZS4KKyAqLworI2RlZmluZSBEQlVTX05VTUJFUl9PRl9UWVBFUyAgICAoMTYpCisKKy8qIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiB0eXBlY29kZXMgdGhhdCBhcHBlYXIgaW4gdHlwZSBzaWduYXR1cmVzICovCisKKy8qKiBDb2RlIG1hcmtpbmcgdGhlIHN0YXJ0IG9mIGEgc3RydWN0IHR5cGUgaW4gYSB0eXBlIHNpZ25hdHVyZSAqLworI2RlZmluZSBEQlVTX1NUUlVDVF9CRUdJTl9DSEFSICAgKChpbnQpICcoJykKKy8qKiAjREJVU19TVFJVQ1RfQkVHSU5fQ0hBUiBhcyBhIHN0cmluZyBsaXRlcmFsIGluc3RlYWQgb2YgYSBpbnQgbGl0ZXJhbCAqLworI2RlZmluZSBEQlVTX1NUUlVDVF9CRUdJTl9DSEFSX0FTX1NUUklORyAgICIoIgorLyoqIENvZGUgbWFya2luZyB0aGUgZW5kIG9mIGEgc3RydWN0IHR5cGUgaW4gYSB0eXBlIHNpZ25hdHVyZSAqLworI2RlZmluZSBEQlVTX1NUUlVDVF9FTkRfQ0hBUiAgICAgKChpbnQpICcpJykKKy8qKiAjREJVU19TVFJVQ1RfRU5EX0NIQVIgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19TVFJVQ1RfRU5EX0NIQVJfQVNfU1RSSU5HICAgICAiKSIKKy8qKiBDb2RlIG1hcmtpbmcgdGhlIHN0YXJ0IG9mIGEgZGljdCBlbnRyeSB0eXBlIGluIGEgdHlwZSBzaWduYXR1cmUgKi8KKyNkZWZpbmUgREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVIgICAoKGludCkgJ3snKQorLyoqICNEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUiBhcyBhIHN0cmluZyBsaXRlcmFsIGluc3RlYWQgb2YgYSBpbnQgbGl0ZXJhbCAqLworI2RlZmluZSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUl9BU19TVFJJTkcgICAieyIKKy8qKiBDb2RlIG1hcmtpbmcgdGhlIGVuZCBvZiBhIGRpY3QgZW50cnkgdHlwZSBpbiBhIHR5cGUgc2lnbmF0dXJlICovCisjZGVmaW5lIERCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUiAgICAgKChpbnQpICd9JykKKy8qKiAjREJVU19ESUNUX0VOVFJZX0VORF9DSEFSIGFzIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUl9BU19TVFJJTkcgICAgICJ9IgorCisvKiogTWF4IGxlbmd0aCBpbiBieXRlcyBvZiBhIGJ1cyBuYW1lLCBpbnRlcmZhY2UsIG9yIG1lbWJlciAobm90IG9iamVjdAorICogcGF0aCwgcGF0aHMgYXJlIHVubGltaXRlZCkuIFRoaXMgaXMgbGltaXRlZCBiZWNhdXNlIGxvdHMgb2Ygc3R1ZmYKKyAqIGlzIE8obikgaW4gdGhpcyBudW1iZXIsIHBsdXMgaXQgd291bGQgYmUgb2Jub3hpb3VzIHRvIHR5cGUgaW4gYQorICogcGFyYWdyYXBoLWxvbmcgbWV0aG9kIG5hbWUgc28gbW9zdCBsaWtlbHkgc29tZXRoaW5nIGxpa2UgdGhhdCB3b3VsZAorICogYmUgYW4gZXhwbG9pdC4KKyAqLworI2RlZmluZSBEQlVTX01BWElNVU1fTkFNRV9MRU5HVEggMjU1CisKKy8qKiBUaGlzIG9uZSBpcyAyNTUgc28gaXQgZml0cyBpbiBhIGJ5dGUgKi8KKyNkZWZpbmUgREJVU19NQVhJTVVNX1NJR05BVFVSRV9MRU5HVEggMjU1CisKKy8qKiBNYXggbGVuZ3RoIG9mIGEgbWF0Y2ggcnVsZSBzdHJpbmc7IHRvIGtlZXAgcGVvcGxlIGZyb20gaG9zaW5nIHRoZQorICogZGFlbW9uIHdpdGggc29tZSBodWdlIHJ1bGUKKyAqLworI2RlZmluZSBEQlVTX01BWElNVU1fTUFUQ0hfUlVMRV9MRU5HVEggMTAyNAorCisvKiogTWF4IGFyZyBudW1iZXIgeW91IGNhbiBtYXRjaCBvbiBpbiBhIG1hdGNoIHJ1bGUsIGUuZy4KKyAqIGFyZzA9J2hlbGxvJyBpcyBPSywgYXJnMzQ4OTcyMDk4Nz0naGVsbG8nIGlzIG5vdAorICovCisjZGVmaW5lIERCVVNfTUFYSU1VTV9NQVRDSF9SVUxFX0FSR19OVU1CRVIgNjMKKworLyoqIE1heCBsZW5ndGggb2YgYSBtYXJzaGFsZWQgYXJyYXkgaW4gYnl0ZXMgKDY0TSwgMl4yNikgV2UgdXNlIHNpZ25lZAorICogaW50IGZvciBsZW5ndGhzIHNvIG11c3QgYmUgSU5UX01BWCBvciBsZXNzLiAgV2UgbmVlZCBzb21ldGhpbmcgYQorICogYml0IHNtYWxsZXIgdGhhbiBJTlRfTUFYIGJlY2F1c2UgdGhlIGFycmF5IGlzIGluc2lkZSBhIG1lc3NhZ2Ugd2l0aAorICogaGVhZGVyIGluZm8sIGV0Yy4gIHNvIGFuIElOVF9NQVggYXJyYXkgd291bGRuJ3QgYWxsb3cgdGhlIG1lc3NhZ2UKKyAqIG92ZXJoZWFkLiAgVGhlIDY0TSBudW1iZXIgaXMgYW4gYXR0ZW1wdCBhdCBhIGxhcmdlciBudW1iZXIgdGhhbgorICogd2UnZCByZWFzb25hYmx5IGV2ZXIgdXNlLCBidXQgc21hbGwgZW5vdWdoIHRoYXQgeW91ciBidXMgd291bGQgY2hldworICogdGhyb3VnaCBpdCBmYWlybHkgcXVpY2tseSB3aXRob3V0IGxvY2tpbmcgdXAgZm9yZXZlci4gSWYgeW91IGhhdmUKKyAqIGRhdGEgdGhhdCdzIGxpa2VseSB0byBiZSBsYXJnZXIgdGhhbiB0aGlzLCB5b3Ugc2hvdWxkIHByb2JhYmx5IGJlCisgKiBzZW5kaW5nIGl0IGluIG11bHRpcGxlIGluY3JlbWVudGFsIG1lc3NhZ2VzIGFueWhvdy4KKyAqLworI2RlZmluZSBEQlVTX01BWElNVU1fQVJSQVlfTEVOR1RIICg2NzEwODg2NCkKKy8qKiBOdW1iZXIgb2YgYml0cyB5b3UgbmVlZCBpbiBhbiB1bnNpZ25lZCB0byBzdG9yZSB0aGUgbWF4IGFycmF5IHNpemUgKi8KKyNkZWZpbmUgREJVU19NQVhJTVVNX0FSUkFZX0xFTkdUSF9CSVRTIDI2CisKKy8qKiBUaGUgbWF4aW11bSB0b3RhbCBtZXNzYWdlIHNpemUgaW5jbHVkaW5nIGhlYWRlciBhbmQgYm9keTsgc2ltaWxhcgorICogcmF0aW9uYWxlIHRvIG1heCBhcnJheSBzaXplLgorICovCisjZGVmaW5lIERCVVNfTUFYSU1VTV9NRVNTQUdFX0xFTkdUSCAoREJVU19NQVhJTVVNX0FSUkFZX0xFTkdUSCAqIDIpCisvKiogTnVtYmVyIG9mIGJpdHMgeW91IG5lZWQgaW4gYW4gdW5zaWduZWQgdG8gc3RvcmUgdGhlIG1heCBtZXNzYWdlIHNpemUgKi8KKyNkZWZpbmUgREJVU19NQVhJTVVNX01FU1NBR0VfTEVOR1RIX0JJVFMgMjcKKworLyoqIFRoZSBtYXhpbXVtIHRvdGFsIG51bWJlciBvZiB1bml4IGZkcyBpbiBhIG1lc3NhZ2UuIFNpbWlsYXIKKyAqIHJhdGlvbmFsZSBhcyBEQlVTX01BWElNVU1fTUVTU0FHRV9MRU5HVEguIEhvd2V2ZXIgd2UgZGl2aWRlIGJ5IGZvdXIKKyAqIGdpdmVuIHRoYXQgb25lIGZkIGlzIGFuIGludCBhbmQgaGVuY2UgYXQgbGVhc3QgMzIgYml0cy4KKyAqLworI2RlZmluZSBEQlVTX01BWElNVU1fTUVTU0FHRV9VTklYX0ZEUyAoREJVU19NQVhJTVVNX01FU1NBR0VfTEVOR1RILzQpCisvKiogTnVtYmVyIG9mIGJpdHMgeW91IG5lZWQgaW4gYW4gdW5zaWduZWQgdG8gc3RvcmUgdGhlIG1heCBtZXNzYWdlIHVuaXggZmRzICovCisjZGVmaW5lIERCVVNfTUFYSU1VTV9NRVNTQUdFX1VOSVhfRkRTX0JJVFMgKERCVVNfTUFYSU1VTV9NRVNTQUdFX0xFTkdUSF9CSVRTLTIpCisKKy8qKiBEZXB0aCBvZiByZWN1cnNpb24gaW4gdGhlIHR5cGUgdHJlZS4gVGhpcyBpcyBhdXRvbWF0aWNhbGx5IGxpbWl0ZWQKKyAqIHRvIERCVVNfTUFYSU1VTV9TSUdOQVRVUkVfTEVOR1RIIHNpbmNlIHlvdSBjb3VsZCBvbmx5IGhhdmUgYW4gYXJyYXkKKyAqIG9mIGFycmF5IG9mIGFycmF5IG9mIC4uLiB0aGF0IGZpdCBpbiB0aGUgbWF4IHNpZ25hdHVyZS4gIEJ1dCB0aGF0J3MKKyAqIHByb2JhYmx5IGEgYml0IHRvbyBsYXJnZS4KKyAqLworI2RlZmluZSBEQlVTX01BWElNVU1fVFlQRV9SRUNVUlNJT05fREVQVEggMzIKKworLyogVHlwZXMgb2YgbWVzc2FnZSAqLworCisvKiogVGhpcyB2YWx1ZSBpcyBuZXZlciBhIHZhbGlkIG1lc3NhZ2UgdHlwZSwgc2VlIGRidXNfbWVzc2FnZV9nZXRfdHlwZSgpICovCisjZGVmaW5lIERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQgICAgICAgMAorLyoqIE1lc3NhZ2UgdHlwZSBvZiBhIG1ldGhvZCBjYWxsIG1lc3NhZ2UsIHNlZSBkYnVzX21lc3NhZ2VfZ2V0X3R5cGUoKSAqLworI2RlZmluZSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCAgIDEKKy8qKiBNZXNzYWdlIHR5cGUgb2YgYSBtZXRob2QgcmV0dXJuIG1lc3NhZ2UsIHNlZSBkYnVzX21lc3NhZ2VfZ2V0X3R5cGUoKSAqLworI2RlZmluZSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOIDIKKy8qKiBNZXNzYWdlIHR5cGUgb2YgYW4gZXJyb3IgcmVwbHkgbWVzc2FnZSwgc2VlIGRidXNfbWVzc2FnZV9nZXRfdHlwZSgpICovCisjZGVmaW5lIERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SICAgICAgICAgMworLyoqIE1lc3NhZ2UgdHlwZSBvZiBhIHNpZ25hbCBtZXNzYWdlLCBzZWUgZGJ1c19tZXNzYWdlX2dldF90eXBlKCkgKi8KKyNkZWZpbmUgREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMICAgICAgICA0CisKKyNkZWZpbmUgREJVU19OVU1fTUVTU0FHRV9UWVBFUyAgICAgICAgICA1CisKKy8qIEhlYWRlciBmbGFncyAqLworCisvKiogSWYgc2V0LCB0aGlzIGZsYWcgbWVhbnMgdGhhdCB0aGUgc2VuZGVyIG9mIGEgbWVzc2FnZSBkb2VzIG5vdCBjYXJlIGFib3V0IGdldHRpbmcKKyAqIGEgcmVwbHksIHNvIHRoZSByZWNpcGllbnQgbmVlZCBub3Qgc2VuZCBvbmUuIFNlZSBkYnVzX21lc3NhZ2Vfc2V0X25vX3JlcGx5KCkuCisgKi8KKyNkZWZpbmUgREJVU19IRUFERVJfRkxBR19OT19SRVBMWV9FWFBFQ1RFRCAweDEKKy8qKgorICogSWYgc2V0LCB0aGlzIGZsYWcgbWVhbnMgdGhhdCBldmVuIGlmIHRoZSBtZXNzYWdlIGJ1cyBrbm93cyBob3cgdG8gc3RhcnQgYW4gb3duZXIgZm9yCisgKiB0aGUgZGVzdGluYXRpb24gYnVzIG5hbWUgKHNlZSBkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uKCkpLCBpdCBzaG91bGQgbm90CisgKiBkbyBzby4gSWYgdGhpcyBmbGFnIGlzIG5vdCBzZXQsIHRoZSBidXMgbWF5IGxhdW5jaCBhIHByb2dyYW0gdG8gcHJvY2VzcyB0aGUKKyAqIG1lc3NhZ2UuCisgKi8KKyNkZWZpbmUgREJVU19IRUFERVJfRkxBR19OT19BVVRPX1NUQVJUICAgICAweDIKKworLyogSGVhZGVyIGZpZWxkcyAqLworCisvKiogTm90IGVxdWFsIHRvIGFueSB2YWxpZCBoZWFkZXIgZmllbGQgY29kZSAqLworI2RlZmluZSBEQlVTX0hFQURFUl9GSUVMRF9JTlZBTElEICAgICAgICAwCisvKiogSGVhZGVyIGZpZWxkIGNvZGUgZm9yIHRoZSBwYXRoIC0gdGhlIHBhdGggaXMgdGhlIG9iamVjdCBlbWl0dGluZyBhIHNpZ25hbCBvciB0aGUgb2JqZWN0IHJlY2VpdmluZyBhIG1ldGhvZCBjYWxsLgorICogU2VlIGRidXNfbWVzc2FnZV9zZXRfcGF0aCgpLgorICovCisjZGVmaW5lIERCVVNfSEVBREVSX0ZJRUxEX1BBVEggICAgICAgICAgIDEKKy8qKiBIZWFkZXIgZmllbGQgY29kZSBmb3IgdGhlIGludGVyZmFjZSBjb250YWluaW5nIGEgbWVtYmVyIChtZXRob2Qgb3Igc2lnbmFsKS4KKyAqIFNlZSBkYnVzX21lc3NhZ2Vfc2V0X2ludGVyZmFjZSgpLgorICovCisjZGVmaW5lIERCVVNfSEVBREVSX0ZJRUxEX0lOVEVSRkFDRSAgICAgIDIKKy8qKiBIZWFkZXIgZmllbGQgY29kZSBmb3IgYSBtZW1iZXIgKG1ldGhvZCBvciBzaWduYWwpLiBTZWUgZGJ1c19tZXNzYWdlX3NldF9tZW1iZXIoKS4gKi8KKyNkZWZpbmUgREJVU19IRUFERVJfRklFTERfTUVNQkVSICAgICAgICAgMworLyoqIEhlYWRlciBmaWVsZCBjb2RlIGZvciBhbiBlcnJvciBuYW1lIChmb3VuZCBpbiAjREJVU19NRVNTQUdFX1RZUEVfRVJST1IgbWVzc2FnZXMpLgorICogU2VlIGRidXNfbWVzc2FnZV9zZXRfZXJyb3JfbmFtZSgpLgorICovCisjZGVmaW5lIERCVVNfSEVBREVSX0ZJRUxEX0VSUk9SX05BTUUgICAgIDQKKy8qKiBIZWFkZXIgZmllbGQgY29kZSBmb3IgYSByZXBseSBzZXJpYWwsIHVzZWQgdG8gbWF0Y2ggYSAjREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTiBtZXNzYWdlIHdpdGggdGhlCisgKiBtZXNzYWdlIHRoYXQgaXQncyBhIHJlcGx5IHRvLiBTZWUgZGJ1c19tZXNzYWdlX3NldF9yZXBseV9zZXJpYWwoKS4KKyAqLworI2RlZmluZSBEQlVTX0hFQURFUl9GSUVMRF9SRVBMWV9TRVJJQUwgICA1CisvKioKKyAqIEhlYWRlciBmaWVsZCBjb2RlIGZvciB0aGUgZGVzdGluYXRpb24gYnVzIG5hbWUgb2YgYSBtZXNzYWdlLiBTZWUgZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbigpLgorICovCisjZGVmaW5lIERCVVNfSEVBREVSX0ZJRUxEX0RFU1RJTkFUSU9OICAgIDYKKy8qKgorICogSGVhZGVyIGZpZWxkIGNvZGUgZm9yIHRoZSBzZW5kZXIgb2YgYSBtZXNzYWdlOyB1c3VhbGx5IGluaXRpYWxpemVkIGJ5IHRoZSBtZXNzYWdlIGJ1cy4KKyAqIFNlZSBkYnVzX21lc3NhZ2Vfc2V0X3NlbmRlcigpLgorICovCisjZGVmaW5lIERCVVNfSEVBREVSX0ZJRUxEX1NFTkRFUiAgICAgICAgIDcKKy8qKgorICogSGVhZGVyIGZpZWxkIGNvZGUgZm9yIHRoZSB0eXBlIHNpZ25hdHVyZSBvZiBhIG1lc3NhZ2UuCisgKi8KKyNkZWZpbmUgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFICAgICAgOAorLyoqCisgKiBIZWFkZXIgZmllbGQgY29kZSBmb3IgdGhlIG51bWJlciBvZiB1bml4IGZpbGUgZGVzY3JpcHRvcnMgYXNzb2NpYXRlZAorICogd2l0aCB0aGlzIG1lc3NhZ2UuCisgKi8KKyNkZWZpbmUgREJVU19IRUFERVJfRklFTERfVU5JWF9GRFMgICAgICAgOQorCisKKy8qKgorICogVmFsdWUgb2YgdGhlIGhpZ2hlc3QtbnVtYmVyZWQgaGVhZGVyIGZpZWxkIGNvZGUsIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZQorICogdGhlIHNpemUgb2YgYW4gYXJyYXkgaW5kZXhlZCBieSBoZWFkZXIgZmllbGQgY29kZS4gUmVtZW1iZXIgdGhvdWdoCisgKiB0aGF0IHVua25vd24gY29kZXMgbXVzdCBiZSBpZ25vcmVkLCBzbyBjaGVjayBmb3IgdGhhdCBiZWZvcmUKKyAqIGluZGV4aW5nIHRoZSBhcnJheS4KKyAqLworI2RlZmluZSBEQlVTX0hFQURFUl9GSUVMRF9MQVNUIERCVVNfSEVBREVSX0ZJRUxEX1VOSVhfRkRTCisKKy8qKiBIZWFkZXIgZm9ybWF0IGlzIGRlZmluZWQgYXMgYSBzaWduYXR1cmU6CisgKiAgIGJ5dGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSBvcmRlcgorICogICBieXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgdHlwZSBJRAorICogICBieXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzCisgKiAgIGJ5dGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgdmVyc2lvbgorICogICB1aW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgbGVuZ3RoCisgKiAgIHVpbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsCisgKiAgIGFycmF5IG9mIHN0cnVjdCAoYnl0ZSx2YXJpYW50KSAgKGZpZWxkIG5hbWUsIHZhbHVlKQorICoKKyAqIFRoZSBsZW5ndGggb2YgdGhlIGhlYWRlciBjYW4gYmUgY29tcHV0ZWQgYXMgdGhlCisgKiBmaXhlZCBzaXplIG9mIHRoZSBpbml0aWFsIGRhdGEsIHBsdXMgdGhlIGxlbmd0aCBvZgorICogdGhlIGFycmF5IGF0IHRoZSBlbmQsIHBsdXMgcGFkZGluZyB0byBhbiA4LWJvdW5kYXJ5LgorICovCisjZGVmaW5lIERCVVNfSEVBREVSX1NJR05BVFVSRSAgICAgICAgICAgICAgICAgICBcCisgICAgIERCVVNfVFlQRV9CWVRFX0FTX1NUUklORyAgICAgICAgICAgICAgICAgICBcCisgICAgIERCVVNfVFlQRV9CWVRFX0FTX1NUUklORyAgICAgICAgICAgICAgICAgICBcCisgICAgIERCVVNfVFlQRV9CWVRFX0FTX1NUUklORyAgICAgICAgICAgICAgICAgICBcCisgICAgIERCVVNfVFlQRV9CWVRFX0FTX1NUUklORyAgICAgICAgICAgICAgICAgICBcCisgICAgIERCVVNfVFlQRV9VSU5UMzJfQVNfU1RSSU5HICAgICAgICAgICAgICAgICBcCisgICAgIERCVVNfVFlQRV9VSU5UMzJfQVNfU1RSSU5HICAgICAgICAgICAgICAgICBcCisgICAgIERCVVNfVFlQRV9BUlJBWV9BU19TVFJJTkcgICAgICAgICAgICAgICAgICBcCisgICAgIERCVVNfU1RSVUNUX0JFR0lOX0NIQVJfQVNfU1RSSU5HICAgICAgICAgICBcCisgICAgIERCVVNfVFlQRV9CWVRFX0FTX1NUUklORyAgICAgICAgICAgICAgICAgICBcCisgICAgIERCVVNfVFlQRV9WQVJJQU5UX0FTX1NUUklORyAgICAgICAgICAgICAgICBcCisgICAgIERCVVNfU1RSVUNUX0VORF9DSEFSX0FTX1NUUklORworCisKKy8qKgorICogVGhlIHNtYWxsZXN0IGhlYWRlciBzaXplIHRoYXQgY2FuIG9jY3VyLiAgKEl0IHdvbid0IGJlIHZhbGlkIGR1ZSB0bworICogbWlzc2luZyByZXF1aXJlZCBoZWFkZXIgZmllbGRzLikgVGhpcyBpcyA0IGJ5dGVzLCB0d28gdWludDMyLCBhbgorICogYXJyYXkgbGVuZ3RoLiBUaGlzIGlzbid0IGFueSBraW5kIG9mIHJlc291cmNlIGxpbWl0LCBqdXN0IHRoZQorICogbmVjZXNzYXJ5L2xvZ2ljYWwgb3V0Y29tZSBvZiB0aGUgaGVhZGVyIHNpZ25hdHVyZS4KKyAqLworI2RlZmluZSBEQlVTX01JTklNVU1fSEVBREVSX1NJWkUgMTYKKworLyogRXJyb3JzICovCisvKiBXQVJOSU5HIHRoZXNlIGdldCBhdXRvY29udmVydGVkIHRvIGFuIGVudW0gaW4gZGJ1cy1nbGliLmguIFRodXMsCisgKiBpZiB5b3UgY2hhbmdlIHRoZSBvcmRlciBpdCBicmVha3MgdGhlIEFCSS4gS2VlcCB0aGVtIGluIG9yZGVyLgorICogQWxzbywgZG9uJ3QgY2hhbmdlIHRoZSBmb3JtYXR0aW5nIHNpbmNlIHRoYXQgd2lsbCBicmVhayB0aGUgc2VkCisgKiBzY3JpcHQuCisgKi8KKy8qKiBBIGdlbmVyaWMgZXJyb3I7ICJzb21ldGhpbmcgd2VudCB3cm9uZyIgLSBzZWUgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIG1vcmUuICovCisjZGVmaW5lIERCVVNfRVJST1JfRkFJTEVEICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLkZhaWxlZCIKKy8qKiBUaGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgYW4gb3BlcmF0aW9uLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX05PX01FTU9SWSAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5Ob01lbW9yeSIKKy8qKiBUaGUgYnVzIGRvZXNuJ3Qga25vdyBob3cgdG8gbGF1bmNoIGEgc2VydmljZSB0byBzdXBwbHkgdGhlIGJ1cyBuYW1lIHlvdSB3YW50ZWQuICovCisjZGVmaW5lIERCVVNfRVJST1JfU0VSVklDRV9VTktOT1dOICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLlNlcnZpY2VVbmtub3duIgorLyoqIFRoZSBidXMgbmFtZSB5b3UgcmVmZXJlbmNlZCBkb2Vzbid0IGV4aXN0IChpLmUuIG5vIGFwcGxpY2F0aW9uIG93bnMgaXQpLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX05BTUVfSEFTX05PX09XTkVSICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5OYW1lSGFzTm9Pd25lciIKKy8qKiBObyByZXBseSB0byBhIG1lc3NhZ2UgZXhwZWN0aW5nIG9uZSwgdXN1YWxseSBtZWFucyBhIHRpbWVvdXQgb2NjdXJyZWQuICovCisjZGVmaW5lIERCVVNfRVJST1JfTk9fUkVQTFkgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLk5vUmVwbHkiCisvKiogU29tZXRoaW5nIHdlbnQgd3JvbmcgcmVhZGluZyBvciB3cml0aW5nIHRvIGEgc29ja2V0LCBmb3IgZXhhbXBsZS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9JT19FUlJPUiAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuSU9FcnJvciIKKy8qKiBBIEQtQnVzIGJ1cyBhZGRyZXNzIHdhcyBtYWxmb3JtZWQuICovCisjZGVmaW5lIERCVVNfRVJST1JfQkFEX0FERFJFU1MgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLkJhZEFkZHJlc3MiCisvKiogUmVxdWVzdGVkIG9wZXJhdGlvbiBpc24ndCBzdXBwb3J0ZWQgKGxpa2UgRU5PU1lTIG9uIFVOSVgpLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5Ob3RTdXBwb3J0ZWQiCisvKiogU29tZSBsaW1pdGVkIHJlc291cmNlIGlzIGV4aGF1c3RlZC4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9MSU1JVFNfRVhDRUVERUQgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuTGltaXRzRXhjZWVkZWQiCisvKiogU2VjdXJpdHkgcmVzdHJpY3Rpb25zIGRvbid0IGFsbG93IGRvaW5nIHdoYXQgeW91J3JlIHRyeWluZyB0byBkby4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVEICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuQWNjZXNzRGVuaWVkIgorLyoqIEF1dGhlbnRpY2F0aW9uIGRpZG4ndCB3b3JrLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX0FVVEhfRkFJTEVEICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5BdXRoRmFpbGVkIgorLyoqIFVuYWJsZSB0byBjb25uZWN0IHRvIHNlcnZlciAocHJvYmFibHkgY2F1c2VkIGJ5IEVDT05OUkVGVVNFRCBvbiBhIHNvY2tldCkuICovCisjZGVmaW5lIERCVVNfRVJST1JfTk9fU0VSVkVSICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLk5vU2VydmVyIgorLyoqIENlcnRhaW4gdGltZW91dCBlcnJvcnMsIHBvc3NpYmx5IEVUSU1FRE9VVCBvbiBhIHNvY2tldC4KKyAqIE5vdGUgdGhhdCAjREJVU19FUlJPUl9OT19SRVBMWSBpcyB1c2VkIGZvciBtZXNzYWdlIHJlcGx5IHRpbWVvdXRzLgorICogQHdhcm5pbmcgdGhpcyBpcyBjb25mdXNpbmdseS1uYW1lZCBnaXZlbiB0aGF0ICNEQlVTX0VSUk9SX1RJTUVEX09VVCBhbHNvIGV4aXN0cy4gV2UgY2FuJ3QgZml4CisgKiBpdCBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zIHNvIGp1c3QgYmUgY2FyZWZ1bC4KKyAqLworI2RlZmluZSBEQlVTX0VSUk9SX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5UaW1lb3V0IgorLyoqIE5vIG5ldHdvcmsgYWNjZXNzIChwcm9iYWJseSBFTkVUVU5SRUFDSCBvbiBhIHNvY2tldCkuICovCisjZGVmaW5lIERCVVNfRVJST1JfTk9fTkVUV09SSyAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLk5vTmV0d29yayIKKy8qKiBDYW4ndCBiaW5kIGEgc29ja2V0IHNpbmNlIGl0cyBhZGRyZXNzIGlzIGluIHVzZSAoaS5lLiBFQUREUklOVVNFKS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9BRERSRVNTX0lOX1VTRSAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuQWRkcmVzc0luVXNlIgorLyoqIFRoZSBjb25uZWN0aW9uIGlzIGRpc2Nvbm5lY3RlZCBhbmQgeW91J3JlIHRyeWluZyB0byB1c2UgaXQuICovCisjZGVmaW5lIERCVVNfRVJST1JfRElTQ09OTkVDVEVEICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLkRpc2Nvbm5lY3RlZCIKKy8qKiBJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8gYSBtZXRob2QgY2FsbC4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9JTlZBTElEX0FSR1MgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuSW52YWxpZEFyZ3MiCisvKiogTWlzc2luZyBmaWxlLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX0ZJTEVfTk9UX0ZPVU5EICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5GaWxlTm90Rm91bmQiCisvKiogRXhpc3RpbmcgZmlsZSBhbmQgdGhlIG9wZXJhdGlvbiB5b3UncmUgdXNpbmcgZG9lcyBub3Qgc2lsZW50bHkgb3ZlcndyaXRlLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX0ZJTEVfRVhJU1RTICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5GaWxlRXhpc3RzIgorLyoqIE1ldGhvZCBuYW1lIHlvdSBpbnZva2VkIGlzbid0IGtub3duIGJ5IHRoZSBvYmplY3QgeW91IGludm9rZWQgaXQgb24uICovCisjZGVmaW5lIERCVVNfRVJST1JfVU5LTk9XTl9NRVRIT0QgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLlVua25vd25NZXRob2QiCisvKiogT2JqZWN0IHlvdSBpbnZva2VkIGEgbWV0aG9kIG9uIGlzbid0IGtub3duLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX1VOS05PV05fT0JKRUNUICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5Vbmtub3duT2JqZWN0IgorLyoqIEludGVyZmFjZSB5b3UgaW52b2tlZCBhIG1ldGhvZCBvbiBpc24ndCBrbm93biBieSB0aGUgb2JqZWN0LiAqLworI2RlZmluZSBEQlVTX0VSUk9SX1VOS05PV05fSU5URVJGQUNFICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5Vbmtub3duSW50ZXJmYWNlIgorLyoqIFByb3BlcnR5IHlvdSB0cmllZCB0byBhY2Nlc3MgaXNuJ3Qga25vd24gYnkgdGhlIG9iamVjdC4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9VTktOT1dOX1BST1BFUlRZICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuVW5rbm93blByb3BlcnR5IgorLyoqIFByb3BlcnR5IHlvdSB0cmllZCB0byBzZXQgaXMgcmVhZC1vbmx5LiAqLworI2RlZmluZSBEQlVTX0VSUk9SX1BST1BFUlRZX1JFQURfT05MWSAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5Qcm9wZXJ0eVJlYWRPbmx5IgorLyoqIENlcnRhaW4gdGltZW91dCBlcnJvcnMsIGUuZy4gd2hpbGUgc3RhcnRpbmcgYSBzZXJ2aWNlLgorICogQHdhcm5pbmcgdGhpcyBpcyBjb25mdXNpbmdseS1uYW1lZCBnaXZlbiB0aGF0ICNEQlVTX0VSUk9SX1RJTUVPVVQgYWxzbyBleGlzdHMuIFdlIGNhbid0IGZpeAorICogaXQgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucyBzbyBqdXN0IGJlIGNhcmVmdWwuCisgKi8KKyNkZWZpbmUgREJVU19FUlJPUl9USU1FRF9PVVQgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuVGltZWRPdXQiCisvKiogVHJpZWQgdG8gcmVtb3ZlIG9yIG1vZGlmeSBhIG1hdGNoIHJ1bGUgdGhhdCBkaWRuJ3QgZXhpc3QuICovCisjZGVmaW5lIERCVVNfRVJST1JfTUFUQ0hfUlVMRV9OT1RfRk9VTkQgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLk1hdGNoUnVsZU5vdEZvdW5kIgorLyoqIFRoZSBtYXRjaCBydWxlIGlzbid0IHN5bnRhY3RpY2FsbHkgdmFsaWQuICovCisjZGVmaW5lIERCVVNfRVJST1JfTUFUQ0hfUlVMRV9JTlZBTElEICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLk1hdGNoUnVsZUludmFsaWQiCisvKiogV2hpbGUgc3RhcnRpbmcgYSBuZXcgcHJvY2VzcywgdGhlIGV4ZWMoKSBjYWxsIGZhaWxlZC4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9TUEFXTl9FWEVDX0ZBSUxFRCAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuU3Bhd24uRXhlY0ZhaWxlZCIKKy8qKiBXaGlsZSBzdGFydGluZyBhIG5ldyBwcm9jZXNzLCB0aGUgZm9yaygpIGNhbGwgZmFpbGVkLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX1NQQVdOX0ZPUktfRkFJTEVEICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5TcGF3bi5Gb3JrRmFpbGVkIgorLyoqIFdoaWxlIHN0YXJ0aW5nIGEgbmV3IHByb2Nlc3MsIHRoZSBjaGlsZCBleGl0ZWQgd2l0aCBhIHN0YXR1cyBjb2RlLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX0VYSVRFRCAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5TcGF3bi5DaGlsZEV4aXRlZCIKKy8qKiBXaGlsZSBzdGFydGluZyBhIG5ldyBwcm9jZXNzLCB0aGUgY2hpbGQgZXhpdGVkIG9uIGEgc2lnbmFsLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX1NJR05BTEVEICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5TcGF3bi5DaGlsZFNpZ25hbGVkIgorLyoqIFdoaWxlIHN0YXJ0aW5nIGEgbmV3IHByb2Nlc3MsIHNvbWV0aGluZyB3ZW50IHdyb25nLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX1NQQVdOX0ZBSUxFRCAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5TcGF3bi5GYWlsZWQiCisvKiogV2UgZmFpbGVkIHRvIHNldHVwIHRoZSBlbnZpcm9ubWVudCBjb3JyZWN0bHkuICovCisjZGVmaW5lIERCVVNfRVJST1JfU1BBV05fU0VUVVBfRkFJTEVEICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLlNwYXduLkZhaWxlZFRvU2V0dXAiCisvKiogV2UgZmFpbGVkIHRvIHNldHVwIHRoZSBjb25maWcgcGFyc2VyIGNvcnJlY3RseS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9TUEFXTl9DT05GSUdfSU5WQUxJRCAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuU3Bhd24uQ29uZmlnSW52YWxpZCIKKy8qKiBCdXMgbmFtZSB3YXMgbm90IHZhbGlkLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX1NQQVdOX1NFUlZJQ0VfSU5WQUxJRCAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5TcGF3bi5TZXJ2aWNlTm90VmFsaWQiCisvKiogU2VydmljZSBmaWxlIG5vdCBmb3VuZCBpbiBzeXN0ZW0tc2VydmljZXMgZGlyZWN0b3J5LiAqLworI2RlZmluZSBEQlVTX0VSUk9SX1NQQVdOX1NFUlZJQ0VfTk9UX0ZPVU5EICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5TcGF3bi5TZXJ2aWNlTm90Rm91bmQiCisvKiogUGVybWlzc2lvbnMgYXJlIGluY29ycmVjdCBvbiB0aGUgc2V0dWlkIGhlbHBlci4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9TUEFXTl9QRVJNSVNTSU9OU19JTlZBTElEICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuU3Bhd24uUGVybWlzc2lvbnNJbnZhbGlkIgorLyoqIFNlcnZpY2UgZmlsZSBpbnZhbGlkIChOYW1lLCBVc2VyIG9yIEV4ZWMgbWlzc2luZykuICovCisjZGVmaW5lIERCVVNfRVJST1JfU1BBV05fRklMRV9JTlZBTElEICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLlNwYXduLkZpbGVJbnZhbGlkIgorLyoqIFRyaWVkIHRvIGdldCBhIFVOSVggcHJvY2VzcyBJRCBhbmQgaXQgd2Fzbid0IGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9TUEFXTl9OT19NRU1PUlkgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuU3Bhd24uTm9NZW1vcnkiCisvKiogVHJpZWQgdG8gZ2V0IGEgVU5JWCBwcm9jZXNzIElEIGFuZCBpdCB3YXNuJ3QgYXZhaWxhYmxlLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX1VOSVhfUFJPQ0VTU19JRF9VTktOT1dOICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5Vbml4UHJvY2Vzc0lkVW5rbm93biIKKy8qKiBBIHR5cGUgc2lnbmF0dXJlIGlzIG5vdCB2YWxpZC4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9JTlZBTElEX1NJR05BVFVSRSAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuSW52YWxpZFNpZ25hdHVyZSIKKy8qKiBBIGZpbGUgY29udGFpbnMgaW52YWxpZCBzeW50YXggb3IgaXMgb3RoZXJ3aXNlIGJyb2tlbi4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9JTlZBTElEX0ZJTEVfQ09OVEVOVCAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuSW52YWxpZEZpbGVDb250ZW50IgorLyoqIEFza2VkIGZvciBTRUxpbnV4IHNlY3VyaXR5IGNvbnRleHQgYW5kIGl0IHdhc24ndCBhdmFpbGFibGUuICovCisjZGVmaW5lIERCVVNfRVJST1JfU0VMSU5VWF9TRUNVUklUWV9DT05URVhUX1VOS05PV04gICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLlNFTGludXhTZWN1cml0eUNvbnRleHRVbmtub3duIgorLyoqIEFza2VkIGZvciBBRFQgYXVkaXQgZGF0YSBhbmQgaXQgd2Fzbid0IGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9BRFRfQVVESVRfREFUQV9VTktOT1dOICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuQWR0QXVkaXREYXRhVW5rbm93biIKKy8qKiBUaGVyZSdzIGFscmVhZHkgYW4gb2JqZWN0IHdpdGggdGhlIHJlcXVlc3RlZCBvYmplY3QgcGF0aC4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9PQkpFQ1RfUEFUSF9JTl9VU0UgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuT2JqZWN0UGF0aEluVXNlIgorLyoqIFRoZSBtZXNzYWdlIG1ldGEgZGF0YSBkb2VzIG5vdCBtYXRjaCB0aGUgcGF5bG9hZC4gZS5nLiBleHBlY3RlZAorICAgIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIHdlcmUgbm90IHNlbnQgb3ZlciB0aGUgc29ja2V0IHRoaXMgbWVzc2FnZSB3YXMgcmVjZWl2ZWQgb24uICovCisjZGVmaW5lIERCVVNfRVJST1JfSU5DT05TSVNURU5UX01FU1NBR0UgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLkluY29uc2lzdGVudE1lc3NhZ2UiCisKKy8qIFhNTCBpbnRyb3NwZWN0aW9uIGZvcm1hdCAqLworCisvKiogWE1MIG5hbWVzcGFjZSBvZiB0aGUgaW50cm9zcGVjdGlvbiBmb3JtYXQgdmVyc2lvbiAxLjAgKi8KKyNkZWZpbmUgREJVU19JTlRST1NQRUNUXzFfMF9YTUxfTkFNRVNQQUNFICAgICAgICAgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzIgorLyoqIFhNTCBwdWJsaWMgaWRlbnRpZmllciBvZiB0aGUgaW50cm9zcGVjdGlvbiBmb3JtYXQgdmVyc2lvbiAxLjAgKi8KKyNkZWZpbmUgREJVU19JTlRST1NQRUNUXzFfMF9YTUxfUFVCTElDX0lERU5USUZJRVIgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgT2JqZWN0IEludHJvc3BlY3Rpb24gMS4wLy9FTiIKKy8qKiBYTUwgc3lzdGVtIGlkZW50aWZpZXIgb2YgdGhlIGludHJvc3BlY3Rpb24gZm9ybWF0IHZlcnNpb24gMS4wICovCisjZGVmaW5lIERCVVNfSU5UUk9TUEVDVF8xXzBfWE1MX1NZU1RFTV9JREVOVElGSUVSICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvaW50cm9zcGVjdC5kdGQiCisvKiogWE1MIGRvY3VtZW50IHR5cGUgZGVjbGFyYXRpb24gb2YgdGhlIGludHJvc3BlY3Rpb24gZm9ybWF0IHZlcnNpb24gMS4wICovCisjZGVmaW5lIERCVVNfSU5UUk9TUEVDVF8xXzBfWE1MX0RPQ1RZUEVfREVDTF9OT0RFICI8IURPQ1RZUEUgbm9kZSBQVUJMSUMgXCIiIERCVVNfSU5UUk9TUEVDVF8xXzBfWE1MX1BVQkxJQ19JREVOVElGSUVSICJcIlxuXCIiIERCVVNfSU5UUk9TUEVDVF8xXzBfWE1MX1NZU1RFTV9JREVOVElGSUVSICJcIj5cbiIKKworLyoqIEB9ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmIDAKK3sgLyogYXZvaWRzIGNvbmZ1c2luZyBlbWFjcyBpbmRlbnRhdGlvbiAqLworI2VuZGlmCit9CisjZW5kaWYKKworI2VuZGlmIC8qIERCVVNfUFJPVE9DT0xfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtcmVzb3VyY2VzLmMgYi9kYnVzL2RidXMvZGJ1cy1yZXNvdXJjZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGZiNTViCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtcmVzb3VyY2VzLmMKQEAgLTAsMCArMSwyOTAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1yZXNvdXJjZXMuYyBSZXNvdXJjZSB0cmFja2luZy9saW1pdHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXJlc291cmNlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1Jlc291cmNlcyBSZXNvdXJjZSBsaW1pdHMgcmVsYXRlZCBjb2RlCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNDb3VudGVyIGFuZCBvdGhlciBzdHVmZiByZWxhdGVkIHRvIHJlc291cmNlIGxpbWl0cworICoKKyAqIFR5cGVzIGFuZCBmdW5jdGlvbnMgcmVsYXRlZCB0byB0cmFja2luZyByZXNvdXJjZSBsaW1pdHMsCisgKiBzdWNoIGFzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkvdW5peCBmZHMgYSBjb25uZWN0aW9uIGNhbiB1c2UKKyAqIGZvciBtZXNzYWdlcywgZXRjLgorICovCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNSZXNvdXJjZXNJbnRlcm5hbHMgUmVzb3VyY2UgbGltaXRzIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgUmVzb3VyY2UgbGltaXRzIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqCisgKiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIHJlc291cmNlIGxpbWl0cyBjb2RlLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgSW50ZXJuYWxzIG9mIERCdXNDb3VudGVyLgorICogCisgKiBEQnVzQ291bnRlciBpbnRlcm5hbHMuIERCdXNDb3VudGVyIGlzIGFuIG9wYXF1ZSBvYmplY3QsIGl0IG11c3QgYmUKKyAqIHVzZWQgdmlhIGFjY2Vzc29yIGZ1bmN0aW9ucy4KKyAqLworc3RydWN0IERCdXNDb3VudGVyCit7CisgIGludCByZWZjb3VudDsgIC8qKjwgcmVmZXJlbmNlIGNvdW50ICovCisKKyAgbG9uZyBzaXplX3ZhbHVlOyAgICAgICAvKio8IGN1cnJlbnQgc2l6ZSBjb3VudGVyIHZhbHVlICovCisgIGxvbmcgdW5peF9mZF92YWx1ZTsgICAgLyoqPCBjdXJyZW50IHVuaXggZmQgY291bnRlciB2YWx1ZSAqLworCisjaWZkZWYgREJVU19FTkFCTEVfU1RBVFMKKyAgbG9uZyBwZWFrX3NpemVfdmFsdWU7ICAgICAvKio8IGxhcmdlc3QgZXZlciBzaXplIGNvdW50ZXIgdmFsdWUgKi8KKyAgbG9uZyBwZWFrX3VuaXhfZmRfdmFsdWU7ICAvKio8IGxhcmdlc3QgZXZlciB1bml4IGZkIGNvdW50ZXIgdmFsdWUgKi8KKyNlbmRpZgorCisgIGxvbmcgbm90aWZ5X3NpemVfZ3VhcmRfdmFsdWU7ICAgIC8qKjwgY2FsbCBub3RpZnkgZnVuY3Rpb24gd2hlbiBjcm9zc2luZyB0aGlzIHNpemUgdmFsdWUgKi8KKyAgbG9uZyBub3RpZnlfdW5peF9mZF9ndWFyZF92YWx1ZTsgLyoqPCBjYWxsIG5vdGlmeSBmdW5jdGlvbiB3aGVuIGNyb3NzaW5nIHRoaXMgdW5peCBmZCB2YWx1ZSAqLworCisgIERCdXNDb3VudGVyTm90aWZ5RnVuY3Rpb24gbm90aWZ5X2Z1bmN0aW9uOyAvKio8IG5vdGlmeSBmdW5jdGlvbiAqLworICB2b2lkICpub3RpZnlfZGF0YTsgLyoqPCBkYXRhIGZvciBub3RpZnkgZnVuY3Rpb24gKi8KKyAgZGJ1c19ib29sX3Qgbm90aWZ5X3BlbmRpbmcgOiAxOyAvKio8IFRSVUUgaWYgdGhlIGd1YXJkIHZhbHVlIGhhcyBiZWVuIGNyb3NzZWQgKi8KK307CisKKy8qKiBAfSAqLyAgLyogZW5kIG9mIHJlc291cmNlIGxpbWl0cyBpbnRlcm5hbHMgZG9jcyAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNSZXNvdXJjZXMKKyAqIEB7CisgKi8KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IERCdXNDb3VudGVyLiBEQnVzQ291bnRlciBpcyB1c2VkCisgKiB0byBjb3VudCB1c2FnZSBvZiBzb21lIHJlc291cmNlIHN1Y2ggYXMgbWVtb3J5LgorICoKKyAqIEByZXR1cm5zIG5ldyBjb3VudGVyIG9yICNOVUxMIG9uIGZhaWx1cmUKKyAqLworREJ1c0NvdW50ZXIqCitfZGJ1c19jb3VudGVyX25ldyAodm9pZCkKK3sKKyAgREJ1c0NvdW50ZXIgKmNvdW50ZXI7CisKKyAgY291bnRlciA9IGRidXNfbmV3MCAoREJ1c0NvdW50ZXIsIDEpOworICBpZiAoY291bnRlciA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGNvdW50ZXItPnJlZmNvdW50ID0gMTsKKworICByZXR1cm4gY291bnRlcjsKK30KKworLyoqCisgKiBJbmNyZW1lbnRzIHJlZmNvdW50IG9mIHRoZSBjb3VudGVyCisgKgorICogQHBhcmFtIGNvdW50ZXIgdGhlIGNvdW50ZXIKKyAqIEByZXR1cm5zIHRoZSBjb3VudGVyCisgKi8KK0RCdXNDb3VudGVyICoKK19kYnVzX2NvdW50ZXJfcmVmIChEQnVzQ291bnRlciAqY291bnRlcikKK3sKKyAgX2RidXNfYXNzZXJ0IChjb3VudGVyLT5yZWZjb3VudCA+IDApOworICAKKyAgY291bnRlci0+cmVmY291bnQgKz0gMTsKKworICByZXR1cm4gY291bnRlcjsKK30KKworLyoqCisgKiBEZWNyZW1lbnRzIHJlZmNvdW50IG9mIHRoZSBjb3VudGVyIGFuZCBwb3NzaWJseQorICogZmluYWxpemVzIHRoZSBjb3VudGVyLgorICoKKyAqIEBwYXJhbSBjb3VudGVyIHRoZSBjb3VudGVyCisgKi8KK3ZvaWQKK19kYnVzX2NvdW50ZXJfdW5yZWYgKERCdXNDb3VudGVyICpjb3VudGVyKQoreworICBfZGJ1c19hc3NlcnQgKGNvdW50ZXItPnJlZmNvdW50ID4gMCk7CisKKyAgY291bnRlci0+cmVmY291bnQgLT0gMTsKKworICBpZiAoY291bnRlci0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICAKKyAgICAgIGRidXNfZnJlZSAoY291bnRlcik7CisgICAgfQorfQorCisvKioKKyAqIEFkanVzdHMgdGhlIHZhbHVlIG9mIHRoZSBzaXplIGNvdW50ZXIgYnkgdGhlIGdpdmVuCisgKiBkZWx0YSB3aGljaCBtYXkgYmUgcG9zaXRpdmUgb3IgbmVnYXRpdmUuCisgKgorICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIHdpdGggbG9ja3MgaGVsZC4gQWZ0ZXIgY2FsbGluZyBpdCwgd2hlbgorICogYW55IHJlbGV2YW50IGxvY2tzIGFyZSBubyBsb25nZXIgaGVsZCB5b3UgbXVzdCBjYWxsIF9kYnVzX2NvdW50ZXJfbm90aWZ5KCkuCisgKgorICogQHBhcmFtIGNvdW50ZXIgdGhlIGNvdW50ZXIKKyAqIEBwYXJhbSBkZWx0YSB2YWx1ZSB0byBhZGQgdG8gdGhlIHNpemUgY291bnRlcidzIGN1cnJlbnQgdmFsdWUKKyAqLwordm9pZAorX2RidXNfY291bnRlcl9hZGp1c3Rfc2l6ZSAoREJ1c0NvdW50ZXIgKmNvdW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgZGVsdGEpCit7CisgIGxvbmcgb2xkID0gY291bnRlci0+c2l6ZV92YWx1ZTsKKworICBjb3VudGVyLT5zaXplX3ZhbHVlICs9IGRlbHRhOworCisjaWZkZWYgREJVU19FTkFCTEVfU1RBVFMKKyAgaWYgKGNvdW50ZXItPnBlYWtfc2l6ZV92YWx1ZSA8IGNvdW50ZXItPnNpemVfdmFsdWUpCisgICAgY291bnRlci0+cGVha19zaXplX3ZhbHVlID0gY291bnRlci0+c2l6ZV92YWx1ZTsKKyNlbmRpZgorCisjaWYgMAorICBfZGJ1c192ZXJib3NlICgiQWRqdXN0aW5nIGNvdW50ZXIgJWxkIGJ5ICVsZCA9ICVsZFxuIiwKKyAgICAgICAgICAgICAgICAgb2xkLCBkZWx0YSwgY291bnRlci0+c2l6ZV92YWx1ZSk7CisjZW5kaWYKKworICBpZiAoY291bnRlci0+bm90aWZ5X2Z1bmN0aW9uICE9IE5VTEwgJiYKKyAgICAgICgob2xkIDwgY291bnRlci0+bm90aWZ5X3NpemVfZ3VhcmRfdmFsdWUgJiYKKyAgICAgICAgY291bnRlci0+c2l6ZV92YWx1ZSA+PSBjb3VudGVyLT5ub3RpZnlfc2l6ZV9ndWFyZF92YWx1ZSkgfHwKKyAgICAgICAob2xkID49IGNvdW50ZXItPm5vdGlmeV9zaXplX2d1YXJkX3ZhbHVlICYmCisgICAgICAgIGNvdW50ZXItPnNpemVfdmFsdWUgPCBjb3VudGVyLT5ub3RpZnlfc2l6ZV9ndWFyZF92YWx1ZSkpKQorICAgIGNvdW50ZXItPm5vdGlmeV9wZW5kaW5nID0gVFJVRTsKK30KKworLyoqCisgKiBDYWxscyB0aGUgbm90aWZ5IGZ1bmN0aW9uIGZyb20gX2RidXNfY291bnRlcl9zZXRfbm90aWZ5KCksCisgKiBpZiB0aGF0IGZ1bmN0aW9uIGhhcyBiZWVuIHNwZWNpZmllZCBhbmQgdGhlIGNvdW50ZXIgaGFzIGNyb3NzZWQgdGhlCisgKiBndWFyZCB2YWx1ZSAoaW4gZWl0aGVyIGRpcmVjdGlvbikgc2luY2UgdGhlIGxhc3QgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgY2FsbGVkIHdpdGggbG9ja3MgaGVsZCwgc2luY2UgaXQgY2FuIGNhbGwgb3V0CisgKiB0byB1c2VyIGNvZGUuCisgKi8KK3ZvaWQKK19kYnVzX2NvdW50ZXJfbm90aWZ5IChEQnVzQ291bnRlciAqY291bnRlcikKK3sKKyAgaWYgKGNvdW50ZXItPm5vdGlmeV9wZW5kaW5nKQorICAgIHsKKyAgICAgIGNvdW50ZXItPm5vdGlmeV9wZW5kaW5nID0gRkFMU0U7CisgICAgICAoKiBjb3VudGVyLT5ub3RpZnlfZnVuY3Rpb24pIChjb3VudGVyLCBjb3VudGVyLT5ub3RpZnlfZGF0YSk7CisgICAgfQorfQorCisvKioKKyAqIEFkanVzdHMgdGhlIHZhbHVlIG9mIHRoZSB1bml4IGZkIGNvdW50ZXIgYnkgdGhlIGdpdmVuCisgKiBkZWx0YSB3aGljaCBtYXkgYmUgcG9zaXRpdmUgb3IgbmVnYXRpdmUuCisgKgorICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIHdpdGggbG9ja3MgaGVsZC4gQWZ0ZXIgY2FsbGluZyBpdCwgd2hlbgorICogYW55IHJlbGV2YW50IGxvY2tzIGFyZSBubyBsb25nZXIgaGVsZCB5b3UgbXVzdCBjYWxsIF9kYnVzX2NvdW50ZXJfbm90aWZ5KCkuCisgKgorICogQHBhcmFtIGNvdW50ZXIgdGhlIGNvdW50ZXIKKyAqIEBwYXJhbSBkZWx0YSB2YWx1ZSB0byBhZGQgdG8gdGhlIHVuaXggZmRzIGNvdW50ZXIncyBjdXJyZW50IHZhbHVlCisgKi8KK3ZvaWQKK19kYnVzX2NvdW50ZXJfYWRqdXN0X3VuaXhfZmQgKERCdXNDb3VudGVyICpjb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgIGRlbHRhKQoreworICBsb25nIG9sZCA9IGNvdW50ZXItPnVuaXhfZmRfdmFsdWU7CisgIAorICBjb3VudGVyLT51bml4X2ZkX3ZhbHVlICs9IGRlbHRhOworCisjaWZkZWYgREJVU19FTkFCTEVfU1RBVFMKKyAgaWYgKGNvdW50ZXItPnBlYWtfdW5peF9mZF92YWx1ZSA8IGNvdW50ZXItPnVuaXhfZmRfdmFsdWUpCisgICAgY291bnRlci0+cGVha191bml4X2ZkX3ZhbHVlID0gY291bnRlci0+dW5peF9mZF92YWx1ZTsKKyNlbmRpZgorCisjaWYgMAorICBfZGJ1c192ZXJib3NlICgiQWRqdXN0aW5nIGNvdW50ZXIgJWxkIGJ5ICVsZCA9ICVsZFxuIiwKKyAgICAgICAgICAgICAgICAgb2xkLCBkZWx0YSwgY291bnRlci0+dW5peF9mZF92YWx1ZSk7CisjZW5kaWYKKyAgCisgIGlmIChjb3VudGVyLT5ub3RpZnlfZnVuY3Rpb24gIT0gTlVMTCAmJgorICAgICAgKChvbGQgPCBjb3VudGVyLT5ub3RpZnlfdW5peF9mZF9ndWFyZF92YWx1ZSAmJgorICAgICAgICBjb3VudGVyLT51bml4X2ZkX3ZhbHVlID49IGNvdW50ZXItPm5vdGlmeV91bml4X2ZkX2d1YXJkX3ZhbHVlKSB8fAorICAgICAgIChvbGQgPj0gY291bnRlci0+bm90aWZ5X3VuaXhfZmRfZ3VhcmRfdmFsdWUgJiYKKyAgICAgICAgY291bnRlci0+dW5peF9mZF92YWx1ZSA8IGNvdW50ZXItPm5vdGlmeV91bml4X2ZkX2d1YXJkX3ZhbHVlKSkpCisgICAgY291bnRlci0+bm90aWZ5X3BlbmRpbmcgPSBUUlVFOworfQorCisvKioKKyAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNpemUgY291bnRlci4KKyAqCisgKiBAcGFyYW0gY291bnRlciB0aGUgY291bnRlcgorICogQHJldHVybnMgaXRzIGN1cnJlbnQgc2l6ZSB2YWx1ZQorICovCitsb25nCitfZGJ1c19jb3VudGVyX2dldF9zaXplX3ZhbHVlIChEQnVzQ291bnRlciAqY291bnRlcikKK3sKKyAgcmV0dXJuIGNvdW50ZXItPnNpemVfdmFsdWU7Cit9CisKKy8qKgorICogR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgdW5peCBmZCBjb3VudGVyLgorICoKKyAqIEBwYXJhbSBjb3VudGVyIHRoZSBjb3VudGVyCisgKiBAcmV0dXJucyBpdHMgY3VycmVudCB1bml4IGZkIHZhbHVlCisgKi8KK2xvbmcKK19kYnVzX2NvdW50ZXJfZ2V0X3VuaXhfZmRfdmFsdWUgKERCdXNDb3VudGVyICpjb3VudGVyKQoreworICByZXR1cm4gY291bnRlci0+dW5peF9mZF92YWx1ZTsKK30KKworLyoqCisgKiBTZXRzIHRoZSBub3RpZnkgZnVuY3Rpb24gZm9yIHRoaXMgY291bnRlcjsgdGhlIG5vdGlmeSBmdW5jdGlvbiBpcworICogY2FsbGVkIHdoZW5ldmVyIHRoZSBjb3VudGVyJ3MgdmFsdWVzIGNyb3NzIHRoZSBndWFyZCB2YWx1ZXMgaW4KKyAqIGVpdGhlciBkaXJlY3Rpb24gKG1vdmluZyB1cCwgb3IgbW92aW5nIGRvd24pLgorICoKKyAqIEBwYXJhbSBjb3VudGVyIHRoZSBjb3VudGVyCisgKiBAcGFyYW0gc2l6ZV9ndWFyZF92YWx1ZSB0aGUgdmFsdWUgd2UncmUgbm90aWZpZWQgaWYgdGhlIHNpemUgY291bnRlciBjcm9zc2VzCisgKiBAcGFyYW0gdW5peF9mZF9ndWFyZF92YWx1ZSB0aGUgdmFsdWUgd2UncmUgbm90aWZpZWQgaWYgdGhlIHVuaXggZmQgY291bnRlciBjcm9zc2VzCisgKiBAcGFyYW0gZnVuY3Rpb24gZnVuY3Rpb24gdG8gY2FsbCBpbiBvcmRlciB0byBub3RpZnkKKyAqIEBwYXJhbSB1c2VyX2RhdGEgZGF0YSB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbgorICovCit2b2lkCitfZGJ1c19jb3VudGVyX3NldF9ub3RpZnkgKERCdXNDb3VudGVyICAgICAgICAgICAgICAgKmNvdW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICAgICAgICAgICAgIHNpemVfZ3VhcmRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICAgICAgICAgICAgIHVuaXhfZmRfZ3VhcmRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb3VudGVyTm90aWZ5RnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIGNvdW50ZXItPm5vdGlmeV9zaXplX2d1YXJkX3ZhbHVlID0gc2l6ZV9ndWFyZF92YWx1ZTsKKyAgY291bnRlci0+bm90aWZ5X3VuaXhfZmRfZ3VhcmRfdmFsdWUgPSB1bml4X2ZkX2d1YXJkX3ZhbHVlOworICBjb3VudGVyLT5ub3RpZnlfZnVuY3Rpb24gPSBmdW5jdGlvbjsKKyAgY291bnRlci0+bm90aWZ5X2RhdGEgPSB1c2VyX2RhdGE7CisgIGNvdW50ZXItPm5vdGlmeV9wZW5kaW5nID0gRkFMU0U7Cit9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9TVEFUUworbG9uZworX2RidXNfY291bnRlcl9nZXRfcGVha19zaXplX3ZhbHVlIChEQnVzQ291bnRlciAqY291bnRlcikKK3sKKyAgcmV0dXJuIGNvdW50ZXItPnBlYWtfc2l6ZV92YWx1ZTsKK30KKworbG9uZworX2RidXNfY291bnRlcl9nZXRfcGVha191bml4X2ZkX3ZhbHVlIChEQnVzQ291bnRlciAqY291bnRlcikKK3sKKyAgcmV0dXJuIGNvdW50ZXItPnBlYWtfdW5peF9mZF92YWx1ZTsKK30KKyNlbmRpZgorCisvKiogQH0gKi8gIC8qIGVuZCBvZiByZXNvdXJjZSBsaW1pdHMgZXhwb3J0ZWQgQVBJICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1yZXNvdXJjZXMuaCBiL2RidXMvZGJ1cy9kYnVzLXJlc291cmNlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MWE1NzUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1yZXNvdXJjZXMuaApAQCAtMCwwICsxLDYxIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtcmVzb3VyY2VzLmggUmVzb3VyY2UgdHJhY2tpbmcvbGltaXRzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZm5kZWYgREJVU19SRVNPVVJDRVNfSAorI2RlZmluZSBEQlVTX1JFU09VUkNFU19ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFjcm9zLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgREJ1c0NvdW50ZXIgREJ1c0NvdW50ZXI7CisKK3R5cGVkZWYgdm9pZCAoKiBEQnVzQ291bnRlck5vdGlmeUZ1bmN0aW9uKSAoREJ1c0NvdW50ZXIgKmNvdW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICp1c2VyX2RhdGEpOworCitEQnVzQ291bnRlciogX2RidXNfY291bnRlcl9uZXcgICAgICAgKHZvaWQpOworREJ1c0NvdW50ZXIqIF9kYnVzX2NvdW50ZXJfcmVmICAgICAgIChEQnVzQ291bnRlciAqY291bnRlcik7Cit2b2lkICAgICAgICAgX2RidXNfY291bnRlcl91bnJlZiAgICAgKERCdXNDb3VudGVyICpjb3VudGVyKTsKKwordm9pZCAgICAgICAgIF9kYnVzX2NvdW50ZXJfYWRqdXN0X3NpemUgICAgICAgKERCdXNDb3VudGVyICpjb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICBkZWx0YSk7Cit2b2lkICAgICAgICAgX2RidXNfY291bnRlcl9hZGp1c3RfdW5peF9mZCAgICAoREJ1c0NvdW50ZXIgKmNvdW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgIGRlbHRhKTsKK3ZvaWQgICAgICAgICBfZGJ1c19jb3VudGVyX25vdGlmeSAgICAgICAgICAgIChEQnVzQ291bnRlciAqY291bnRlcik7Citsb25nICAgICAgICAgX2RidXNfY291bnRlcl9nZXRfc2l6ZV92YWx1ZSAgICAoREJ1c0NvdW50ZXIgKmNvdW50ZXIpOworbG9uZyAgICAgICAgIF9kYnVzX2NvdW50ZXJfZ2V0X3VuaXhfZmRfdmFsdWUgKERCdXNDb3VudGVyICpjb3VudGVyKTsKKwordm9pZCBfZGJ1c19jb3VudGVyX3NldF9ub3RpZnkgICAgKERCdXNDb3VudGVyICAgICAgICAgICAgICAgKmNvdW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9ndWFyZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgICAgICAgICAgICB1bml4X2ZkX2d1YXJkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb3VudGVyTm90aWZ5RnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSk7CisKKy8qIGlmIERCVVNfRU5BQkxFX1NUQVRTICovCitsb25nIF9kYnVzX2NvdW50ZXJfZ2V0X3BlYWtfc2l6ZV92YWx1ZSAgICAoREJ1c0NvdW50ZXIgKmNvdW50ZXIpOworbG9uZyBfZGJ1c19jb3VudGVyX2dldF9wZWFrX3VuaXhfZmRfdmFsdWUgKERCdXNDb3VudGVyICpjb3VudGVyKTsKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfUkVTT1VSQ0VTX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmMgYi9kYnVzL2RidXMvZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOWRiNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5jCkBAIC0wLDAgKzEsNDMxIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc2VydmVyLWRlYnVnLXBpcGUuYyBJbi1wcm9jIGRlYnVnIHNlcnZlciBpbXBsZW1lbnRhdGlvbiAKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIENvZGVGYWN0b3J5IEFCCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5oIgorI2luY2x1ZGUgImRidXMtdHJhbnNwb3J0LXNvY2tldC5oIgorI2luY2x1ZGUgImRidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImRidXMtaGFzaC5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworCisvKioKKyAqIEBkZWZncm91cCBEQnVzU2VydmVyRGVidWdQaXBlIERCdXNTZXJ2ZXJEZWJ1Z1BpcGUKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgSW4tcHJvY2VzcyBwaXBlIGRlYnVnIHNlcnZlciB1c2VkIGluIHVuaXQgdGVzdHMuCisgKgorICogVHlwZXMgYW5kIGZ1bmN0aW9ucyByZWxhdGVkIHRvIERCdXNTZXJ2ZXJEZWJ1Z1BpcGUuCisgKiBUaGlzIGlzIHVzZWQgZm9yIHVuaXQgdGVzdGluZy4KKyAqCisgKiBAeworICovCisKKy8qKgorICogT3BhcXVlIG9iamVjdCByZXByZXNlbnRpbmcgYSBkZWJ1ZyBzZXJ2ZXIgaW1wbGVtZW50YXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNTZXJ2ZXJEZWJ1Z1BpcGUgREJ1c1NlcnZlckRlYnVnUGlwZTsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIERCdXNTZXJ2ZXJEZWJ1Z1BpcGUuIEFsbCBtZW1iZXJzCisgKiBhcmUgcHJpdmF0ZS4KKyAqLworc3RydWN0IERCdXNTZXJ2ZXJEZWJ1Z1BpcGUKK3sKKyAgREJ1c1NlcnZlciBiYXNlOyAgLyoqPCBQYXJlbnQgY2xhc3MgbWVtYmVycy4gKi8KKworICBjaGFyICpuYW1lOyAvKio8IFNlcnZlciBuYW1lLiAqLworCisgIGRidXNfYm9vbF90IGRpc2Nvbm5lY3RlZDsgLyoqPCBUUlVFIGlmIGRpc2Nvbm5lY3QgaGFzIGJlZW4gY2FsbGVkICovCit9OworCisvKiBGSVhNRSBub3QgdGhyZWFkc2FmZSAocmlnaHQgbm93IHRoZSB0ZXN0IHN1aXRlIGRvZXNuJ3QgdXNlIHRocmVhZHMgYW55aG93ICkgKi8KK3N0YXRpYyBEQnVzSGFzaFRhYmxlICpzZXJ2ZXJfcGlwZV9oYXNoOworc3RhdGljIGludCBzZXJ2ZXJfcGlwZV9oYXNoX3JlZmNvdW50ID0gMDsKKworc3RhdGljIGRidXNfYm9vbF90CitwaXBlX2hhc2hfcmVmICh2b2lkKQoreworICBpZiAoIXNlcnZlcl9waXBlX2hhc2gpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChzZXJ2ZXJfcGlwZV9oYXNoX3JlZmNvdW50ID09IDApOworICAgICAgCisgICAgICBzZXJ2ZXJfcGlwZV9oYXNoID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9TVFJJTkcsIE5VTEwsIE5VTEwpOworCisgICAgICBpZiAoIXNlcnZlcl9waXBlX2hhc2gpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgc2VydmVyX3BpcGVfaGFzaF9yZWZjb3VudCA9IDE7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitwaXBlX2hhc2hfdW5yZWYgKHZvaWQpCit7CisgIF9kYnVzX2Fzc2VydCAoc2VydmVyX3BpcGVfaGFzaCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChzZXJ2ZXJfcGlwZV9oYXNoX3JlZmNvdW50ID4gMCk7CisKKyAgc2VydmVyX3BpcGVfaGFzaF9yZWZjb3VudCAtPSAxOworICBpZiAoc2VydmVyX3BpcGVfaGFzaF9yZWZjb3VudCA9PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHNlcnZlcl9waXBlX2hhc2gpOworICAgICAgc2VydmVyX3BpcGVfaGFzaCA9IE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorZGVidWdfZmluYWxpemUgKERCdXNTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgREJ1c1NlcnZlckRlYnVnUGlwZSAqZGVidWdfc2VydmVyID0gKERCdXNTZXJ2ZXJEZWJ1Z1BpcGUqKSBzZXJ2ZXI7CisKKyAgcGlwZV9oYXNoX3VucmVmICgpOworICAKKyAgX2RidXNfc2VydmVyX2ZpbmFsaXplX2Jhc2UgKHNlcnZlcik7CisKKyAgZGJ1c19mcmVlIChkZWJ1Z19zZXJ2ZXItPm5hbWUpOworICBkYnVzX2ZyZWUgKHNlcnZlcik7Cit9CisKK3N0YXRpYyB2b2lkCitkZWJ1Z19kaXNjb25uZWN0IChEQnVzU2VydmVyICpzZXJ2ZXIpCit7CisgICgoREJ1c1NlcnZlckRlYnVnUGlwZSopc2VydmVyKS0+ZGlzY29ubmVjdGVkID0gVFJVRTsKK30KKworc3RhdGljIERCdXNTZXJ2ZXJWVGFibGUgZGVidWdfdnRhYmxlID0geworICBkZWJ1Z19maW5hbGl6ZSwKKyAgZGVidWdfZGlzY29ubmVjdAorfTsKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IGRlYnVnIHNlcnZlciB1c2luZyBhbiBpbi1wcm9jZXNzIHBpcGUKKyAqCisgKiBAcGFyYW0gc2VydmVyX25hbWUgdGhlIG5hbWUgb2YgdGhlIHNlcnZlci4KKyAqIEBwYXJhbSBlcnJvciBhZGRyZXNzIHdoZXJlIGFuIGVycm9yIGNhbiBiZSByZXR1cm5lZC4KKyAqIEByZXR1cm5zIGEgbmV3IHNlcnZlciwgb3IgI05VTEwgb24gZmFpbHVyZS4KKyAqLworREJ1c1NlcnZlcioKK19kYnVzX3NlcnZlcl9kZWJ1Z19waXBlX25ldyAoY29uc3QgY2hhciAgICAgKnNlcnZlcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNTZXJ2ZXJEZWJ1Z1BpcGUgKmRlYnVnX3NlcnZlcjsKKyAgREJ1c1N0cmluZyBhZGRyZXNzOworICBEQnVzU3RyaW5nIG5hbWVfc3RyOworICAKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICBpZiAoIXBpcGVfaGFzaF9yZWYgKCkpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBpZiAoX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChzZXJ2ZXJfcGlwZV9oYXNoLCBzZXJ2ZXJfbmFtZSkgIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQUREUkVTU19JTl9VU0UsIE5VTEwpOworICAgICAgcGlwZV9oYXNoX3VucmVmICgpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgZGVidWdfc2VydmVyID0gZGJ1c19uZXcwIChEQnVzU2VydmVyRGVidWdQaXBlLCAxKTsKKyAgaWYgKGRlYnVnX3NlcnZlciA9PSBOVUxMKQorICAgIGdvdG8gbm9tZW1fMDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYWRkcmVzcykpCisgICAgZ290byBub21lbV8xOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmbmFtZV9zdHIsIHNlcnZlcl9uYW1lKTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgImRlYnVnLXBpcGU6bmFtZT0iKSB8fAorICAgICAgIV9kYnVzX2FkZHJlc3NfYXBwZW5kX2VzY2FwZWQgKCZhZGRyZXNzLCAmbmFtZV9zdHIpKQorICAgIGdvdG8gbm9tZW1fMjsKKyAgCisgIGRlYnVnX3NlcnZlci0+bmFtZSA9IF9kYnVzX3N0cmR1cCAoc2VydmVyX25hbWUpOworICBpZiAoZGVidWdfc2VydmVyLT5uYW1lID09IE5VTEwpCisgICAgZ290byBub21lbV8yOworICAKKyAgaWYgKCFfZGJ1c19zZXJ2ZXJfaW5pdF9iYXNlICgmZGVidWdfc2VydmVyLT5iYXNlLAorCQkJICAgICAgICZkZWJ1Z192dGFibGUsICZhZGRyZXNzKSkKKyAgICBnb3RvIG5vbWVtXzM7CisKKyAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKHNlcnZlcl9waXBlX2hhc2gsCisJCQkJICAgICAgIGRlYnVnX3NlcnZlci0+bmFtZSwKKwkJCQkgICAgICAgZGVidWdfc2VydmVyKSkKKyAgICBnb3RvIG5vbWVtXzQ7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhZGRyZXNzKTsKKworICAvKiBzZXJ2ZXIga2VlcHMgdGhlIHBpcGUgaGFzaCByZWYgKi8KKworICBfZGJ1c19zZXJ2ZXJfdHJhY2VfcmVmICgmZGVidWdfc2VydmVyLT5iYXNlLCAwLCAxLCAiZGVidWdfcGlwZV9uZXciKTsKKyAgcmV0dXJuIChEQnVzU2VydmVyICopZGVidWdfc2VydmVyOworCisgbm9tZW1fNDoKKyAgX2RidXNfc2VydmVyX2ZpbmFsaXplX2Jhc2UgKCZkZWJ1Z19zZXJ2ZXItPmJhc2UpOworIG5vbWVtXzM6CisgIGRidXNfZnJlZSAoZGVidWdfc2VydmVyLT5uYW1lKTsKKyBub21lbV8yOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworIG5vbWVtXzE6CisgIGRidXNfZnJlZSAoZGVidWdfc2VydmVyKTsKKyBub21lbV8wOgorICBwaXBlX2hhc2hfdW5yZWYgKCk7CisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBDcmVhdGVzIHRoZSBjbGllbnQtc2lkZSB0cmFuc3BvcnQgZm9yCisgKiBhIGRlYnVnLXBpcGUgY29ubmVjdGlvbiBjb25uZWN0ZWQgdG8gdGhlCisgKiBnaXZlbiBkZWJ1Zy1waXBlIHNlcnZlciBuYW1lLgorICogCisgKiBAcGFyYW0gc2VydmVyX25hbWUgbmFtZSBvZiBzZXJ2ZXIgdG8gY29ubmVjdCB0bworICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgd2hlcmUgYW4gZXJyb3IgY2FuIGJlIHJldHVybmVkLgorICogQHJldHVybnMgI05VTEwgb24gbm8gbWVtb3J5IG9yIHRyYW5zcG9ydAorICovCitEQnVzVHJhbnNwb3J0KgorX2RidXNfdHJhbnNwb3J0X2RlYnVnX3BpcGVfbmV3IChjb25zdCBjaGFyICAgICAqc2VydmVyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c1RyYW5zcG9ydCAqY2xpZW50X3RyYW5zcG9ydDsKKyAgREJ1c1RyYW5zcG9ydCAqc2VydmVyX3RyYW5zcG9ydDsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIGludCBjbGllbnRfZmQsIHNlcnZlcl9mZDsKKyAgREJ1c1NlcnZlciAqc2VydmVyOworICBEQnVzU3RyaW5nIGFkZHJlc3M7CisgIAorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoc2VydmVyX3BpcGVfaGFzaCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19TRVJWRVIsIE5VTEwpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgc2VydmVyID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChzZXJ2ZXJfcGlwZV9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9uYW1lKTsKKyAgaWYgKHNlcnZlciA9PSBOVUxMIHx8CisgICAgICAoKERCdXNTZXJ2ZXJEZWJ1Z1BpcGUqKXNlcnZlciktPmRpc2Nvbm5lY3RlZCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fU0VSVkVSLCBOVUxMKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYWRkcmVzcykpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgImRlYnVnLXBpcGU6bmFtZT0iKSB8fAorICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCBzZXJ2ZXJfbmFtZSkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19mdWxsX2R1cGxleF9waXBlICgmY2xpZW50X2ZkLCAmc2VydmVyX2ZkLCBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiZmFpbGVkIHRvIGNyZWF0ZSBmdWxsIGR1cGxleCBwaXBlXG4iKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJDb3VsZCBub3QgY3JlYXRlIGZ1bGwtZHVwbGV4IHBpcGUiKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgY2xpZW50X3RyYW5zcG9ydCA9IF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX3NvY2tldCAoY2xpZW50X2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmYWRkcmVzcyk7CisgIGlmIChjbGllbnRfdHJhbnNwb3J0ID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfY2xvc2Vfc29ja2V0IChjbGllbnRfZmQsIE5VTEwpOworICAgICAgX2RidXNfY2xvc2Vfc29ja2V0IChzZXJ2ZXJfZmQsIE5VTEwpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisgIAorICBjbGllbnRfZmQgPSAtMTsKKworICBzZXJ2ZXJfdHJhbnNwb3J0ID0gX2RidXNfdHJhbnNwb3J0X25ld19mb3Jfc29ja2V0IChzZXJ2ZXJfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2ZXItPmd1aWRfaGV4LCBOVUxMKTsKKyAgaWYgKHNlcnZlcl90cmFuc3BvcnQgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c190cmFuc3BvcnRfdW5yZWYgKGNsaWVudF90cmFuc3BvcnQpOworICAgICAgX2RidXNfY2xvc2Vfc29ja2V0IChzZXJ2ZXJfZmQsIE5VTEwpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgc2VydmVyX2ZkID0gLTE7CisKKyAgaWYgKCFfZGJ1c190cmFuc3BvcnRfc2V0X2F1dGhfbWVjaGFuaXNtcyAoc2VydmVyX3RyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIqKikgc2VydmVyLT5hdXRoX21lY2hhbmlzbXMpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgX2RidXNfdHJhbnNwb3J0X3VucmVmIChzZXJ2ZXJfdHJhbnNwb3J0KTsKKyAgICAgIF9kYnVzX3RyYW5zcG9ydF91bnJlZiAoY2xpZW50X3RyYW5zcG9ydCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICBjb25uZWN0aW9uID0gX2RidXNfY29ubmVjdGlvbl9uZXdfZm9yX3RyYW5zcG9ydCAoc2VydmVyX3RyYW5zcG9ydCk7CisgIF9kYnVzX3RyYW5zcG9ydF91bnJlZiAoc2VydmVyX3RyYW5zcG9ydCk7CisgIHNlcnZlcl90cmFuc3BvcnQgPSBOVUxMOworICAKKyAgaWYgKGNvbm5lY3Rpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c190cmFuc3BvcnRfdW5yZWYgKGNsaWVudF90cmFuc3BvcnQpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogU2VlIGlmIHNvbWVvbmUgd2FudHMgdG8gaGFuZGxlIHRoaXMgbmV3IGNvbm5lY3Rpb24sCisgICAqIHNlbGYtcmVmZXJlbmNpbmcgZm9yIHBhcmFub2lhCisgICAqLworICBpZiAoc2VydmVyLT5uZXdfY29ubmVjdGlvbl9mdW5jdGlvbikKKyAgICB7CisgICAgICBkYnVzX3NlcnZlcl9yZWYgKHNlcnZlcik7CisgICAgICAoKiBzZXJ2ZXItPm5ld19jb25uZWN0aW9uX2Z1bmN0aW9uKSAoc2VydmVyLCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci0+bmV3X2Nvbm5lY3Rpb25fZGF0YSk7CisgICAgICBkYnVzX3NlcnZlcl91bnJlZiAoc2VydmVyKTsKKyAgICB9CisgIAorICAvKiBJZiBubyBvbmUgZ3JhYmJlZCBhIHJlZmVyZW5jZSwgdGhlIGNvbm5lY3Rpb24gd2lsbCBkaWUsCisgICAqIGFuZCB0aGUgY2xpZW50IHRyYW5zcG9ydCB3aWxsIGdldCBhbiBpbW1lZGlhdGUgZGlzY29ubmVjdAorICAgKi8KKyAgX2RidXNfY29ubmVjdGlvbl9jbG9zZV9pZl9vbmx5X29uZV9yZWYgKGNvbm5lY3Rpb24pOworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiBjbGllbnRfdHJhbnNwb3J0OworfQorCisvKioKKyAqIFRyaWVzIHRvIGludGVycHJldCB0aGUgYWRkcmVzcyBlbnRyeSBhcyBhIGRlYnVnIHBpcGUgZW50cnkuCisgKiAKKyAqIFNldHMgZXJyb3IgaWYgdGhlIHJlc3VsdCBpcyBub3QgT0suCisgKiAKKyAqIEBwYXJhbSBlbnRyeSBhbiBhZGRyZXNzIGVudHJ5CisgKiBAcGFyYW0gc2VydmVyX3AgbG9jYXRpb24gdG8gc3RvcmUgYSBuZXcgREJ1c1NlcnZlciwgb3IgI05VTEwgb24gZmFpbHVyZS4KKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSByYXRpb25hbGUgZm9yIGZhaWx1cmUgb24gYmFkIGFkZHJlc3MKKyAqIEByZXR1cm5zIHRoZSBvdXRjb21lCisgKiAKKyAqLworREJ1c1NlcnZlckxpc3RlblJlc3VsdAorX2RidXNfc2VydmVyX2xpc3Rlbl9kZWJ1Z19waXBlIChEQnVzQWRkcmVzc0VudHJ5ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NlcnZlciAgICAgICoqc2VydmVyX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICptZXRob2Q7CisKKyAgKnNlcnZlcl9wID0gTlVMTDsKKyAgCisgIG1ldGhvZCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfbWV0aG9kIChlbnRyeSk7CisgIAorICBpZiAoc3RyY21wIChtZXRob2QsICJkZWJ1Zy1waXBlIikgPT0gMCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpuYW1lID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJuYW1lIik7CisgICAgICAKKyAgICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zZXRfYmFkX2FkZHJlc3MoZXJyb3IsICJkZWJ1Zy1waXBlIiwgIm5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX0JBRF9BRERSRVNTOworICAgICAgICB9CisKKyAgICAgICpzZXJ2ZXJfcCA9IF9kYnVzX3NlcnZlcl9kZWJ1Z19waXBlX25ldyAobmFtZSwgZXJyb3IpOworICAgICAgCisgICAgICBpZiAoKnNlcnZlcl9wKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX09LOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcik7CisgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX05PVF9IQU5ETEVEOworICAgIH0KK30KKworLyoqCisgKiBPcGVucyBhIGRlYnVnIHBpcGUgdHJhbnNwb3J0LCB1c2VkIGluIHRoZSB0ZXN0IHN1aXRlLgorICogCisgKiBAcGFyYW0gZW50cnkgdGhlIGFkZHJlc3MgZW50cnkgdG8gdHJ5IG9wZW5pbmcgYXMgZGVidWctcGlwZQorICogQHBhcmFtIHRyYW5zcG9ydF9wIHJldHVybiBsb2NhdGlvbiBmb3IgdGhlIG9wZW5lZCB0cmFuc3BvcnQKKyAqIEBwYXJhbSBlcnJvciBlcnJvciB0byBiZSBzZXQKKyAqIEByZXR1cm5zIHJlc3VsdCBvZiB0aGUgYXR0ZW1wdAorICovCitEQnVzVHJhbnNwb3J0T3BlblJlc3VsdAorX2RidXNfdHJhbnNwb3J0X29wZW5fZGVidWdfcGlwZSAoREJ1c0FkZHJlc3NFbnRyeSAgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RyYW5zcG9ydCAgICAqKnRyYW5zcG9ydF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICptZXRob2Q7CisgIAorICBtZXRob2QgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X21ldGhvZCAoZW50cnkpOworICBfZGJ1c19hc3NlcnQgKG1ldGhvZCAhPSBOVUxMKTsKKworICBpZiAoc3RyY21wIChtZXRob2QsICJkZWJ1Zy1waXBlIikgPT0gMCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpuYW1lID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJuYW1lIik7CisKKyAgICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zZXRfYmFkX2FkZHJlc3MgKGVycm9yLCAiZGVidWctcGlwZSIsICJuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX0JBRF9BRERSRVNTOworICAgICAgICB9CisgICAgICAgICAgCisgICAgICAqdHJhbnNwb3J0X3AgPSBfZGJ1c190cmFuc3BvcnRfZGVidWdfcGlwZV9uZXcgKG5hbWUsIGVycm9yKTsKKworICAgICAgaWYgKCp0cmFuc3BvcnRfcCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fT0s7CisgICAgICAgIH0gICAgICAKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX05PVF9IQU5ETEVEOworICAgIH0KK30KKworCisvKiogQH0gKi8KKworI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KKwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtc2VydmVyLWRlYnVnLXBpcGUuaCBiL2RidXMvZGJ1cy9kYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU3NDMxMQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmgKQEAgLTAsMCArMSw0NyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmggSW4tcHJvYyBkZWJ1ZyBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICogQ29weXJpZ2h0IChDKSAyMDAzICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfU0VSVkVSX0RFQlVHX1BJUEVfSAorI2RlZmluZSBEQlVTX1NFUlZFUl9ERUJVR19QSVBFX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc2VydmVyLXByb3RlY3RlZC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10cmFuc3BvcnQtcHJvdGVjdGVkLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworREJ1c1NlcnZlciogICAgICAgICAgICAgX2RidXNfc2VydmVyX2RlYnVnX3BpcGVfbmV3ICAgICAoY29uc3QgY2hhciAgICAgICAgKnNlcnZlcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKK0RCdXNUcmFuc3BvcnQqICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9kZWJ1Z19waXBlX25ldyAgKGNvbnN0IGNoYXIgICAgICAgICpzZXJ2ZXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcik7CitEQnVzU2VydmVyTGlzdGVuUmVzdWx0ICBfZGJ1c19zZXJ2ZXJfbGlzdGVuX2RlYnVnX3BpcGUgIChEQnVzQWRkcmVzc0VudHJ5ICAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU2VydmVyICAgICAgICoqc2VydmVyX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworREJ1c1RyYW5zcG9ydE9wZW5SZXN1bHQgX2RidXNfdHJhbnNwb3J0X29wZW5fZGVidWdfcGlwZSAoREJ1c0FkZHJlc3NFbnRyeSAgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RyYW5zcG9ydCAgICAqKnRyYW5zcG9ydF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKKworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19TRVJWRVJfREVCVUdfUElQRV9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1zZXJ2ZXItbGF1bmNoZC5jIGIvZGJ1cy9kYnVzL2RidXMtc2VydmVyLWxhdW5jaGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjQ2NzNjCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtc2VydmVyLWxhdW5jaGQuYwpAQCAtMCwwICsxLDIwOSBAQAorLyogZGJ1cy1zZXJ2ZXItbGF1bmNoZC5jIFNlcnZlciBtZXRob2RzIGZvciBpbnRlcmFjdGluZyB3aXRoIGxhdW5jaGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIFRhbm5lciBMb3ZlbGFjZSA8bG92ZWxhY2VAd2F5ZmFyZXIub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4LCBDb2xpbiBXYWx0ZXJzIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSwgQmVuamFtaW4gUmVlZCA8cmFuZ2Vycmlja0BiZWZ1bmsuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA5LCBKb25hcyBCw6RociA8am9uYXMuYmFlaHJAd2ViLmRlPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXNlcnZlci1sYXVuY2hkLmgiCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNTZXJ2ZXJMYXVuY2hkIERCdXNTZXJ2ZXIgaW1wbGVtZW50YXRpb25zIGZvciBMYXVuY2hkCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgREJ1c1NlcnZlciB3aXRoIExhdW5jaGQgc3VwcG9ydAorICoKKyAqIEB7CisgKi8KKworI2lmZGVmIERCVVNfRU5BQkxFX0xBVU5DSEQKKyNpbmNsdWRlIDxsYXVuY2guaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAiZGJ1cy1zZXJ2ZXItc29ja2V0LmgiCisKKy8qIHB1dCBvdGhlciBwcml2YXRlIGxhdW5jaGQgZnVuY3Rpb25zIGhlcmUgKi8KKworI2VuZGlmIC8qIERCVVNfRU5BQkxFX0xBVU5DSEQgKi8KKworLyoqCisgKiBAYnJpZWYgQ3JlYXRlcyBhIG5ldyBzZXJ2ZXIgZnJvbSBsYXVuY2hkLgorICoKKyAqIGxhdW5jaGQgaGFzIGFsbG9jYWVkIGEgc29ja2V0IGZvciB1cy4gV2Ugbm93IHF1ZXJ5IGxhdW5jaGQgZm9yIHRoZQorICogZmlsZSBkZXNjcmlwdG9yIG9mIHRoaXMgc29ja2V0IGFuZCBjcmVhdGUgYSBzZXJ2ZXIgb24gaXQuCisgKiBJbiBhZGRpdGlvbiB3ZSBpbmhlcml0IGxhdW5jaGQncyBlbnZpcm9ubWVudCB3aGljaCBob2xkcyBhIHZhcmlhYmxlCisgKiBjb250YWluaW5nIHRoZSBwYXRoIHRvIHRoZSBzb2NrZXQuIFRoaXMgaXMgdXNlZCB0byBpbml0IHRoZSBzZXJ2ZXIncworICogYWRkcmVzcyB3aGljaCBpcyBwYXNzZWQgdG8gYXV0b2xhdW5jaGVkIHNlcnZpY2VzLgorICoKKyAqIEBwYXJhbSBsYXVuY2hkX2Vudl92YXIgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHdoaWNoIGhvbGRzIHRoZSB1bml4IHBhdGggdG8gdGhlIHNvY2tldAorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJlYXNvbiBmb3IgZmFpbHVyZS4KKyAqIEByZXR1cm5zIHRoZSBuZXcgc2VydmVyLCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICovCisKK0RCdXNTZXJ2ZXIgKgorX2RidXNfc2VydmVyX25ld19mb3JfbGF1bmNoZCAoY29uc3QgY2hhciAqbGF1bmNoZF9lbnZfdmFyLCBEQnVzRXJyb3IgKiBlcnJvcikKKyAgeworI2lmZGVmIERCVVNfRU5BQkxFX0xBVU5DSEQKKyAgICBEQnVzU2VydmVyICpzZXJ2ZXI7CisgICAgREJ1c1N0cmluZyBhZGRyZXNzOworICAgIGludCBsYXVuY2hkX2ZkOworICAgIGxhdW5jaF9kYXRhX3Qgc29ja2V0c19kaWN0LCBjaGVja2luX3Jlc3BvbnNlOworICAgIGxhdW5jaF9kYXRhX3QgY2hlY2tpbl9yZXF1ZXN0OworICAgIGxhdW5jaF9kYXRhX3QgbGlzdGVuaW5nX2ZkX2FycmF5LCBsaXN0ZW5pbmdfZmQ7CisgICAgbGF1bmNoX2RhdGFfdCBlbnZpcm9ubWVudF9kaWN0LCBlbnZpcm9ubWVudF9wYXJhbTsKKyAgICBjb25zdCBjaGFyICpsYXVuY2hkX3NvY2tldF9wYXRoLCAqZGlzcGxheTsKKworICAgIGxhdW5jaGRfc29ja2V0X3BhdGggPSBfZGJ1c19nZXRlbnYgKGxhdW5jaGRfZW52X3Zhcik7CisgICAgZGlzcGxheSA9IF9kYnVzX2dldGVudiAoIkRJU1BMQVkiKTsKKworICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgICAgaWYgKGxhdW5jaGRfc29ja2V0X3BhdGggPT0gTlVMTCB8fCAqbGF1bmNoZF9zb2NrZXRfcGF0aCA9PSAnXDAnKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQkFEX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAibGF1bmNoZCdzIGVudmlyb25tZW50IHZhcmlhYmxlICVzIGlzIGVtcHR5LCBidXQgc2hvdWxkIGNvbnRhaW4gYSBzb2NrZXQgcGF0aC5cbiIsIGxhdW5jaGRfZW52X3Zhcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmFkZHJlc3MpKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgInVuaXg6cGF0aD0iKSkKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgIGdvdG8gbF9mYWlsZWRfMDsKKyAgICAgIH0KKyAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCBsYXVuY2hkX3NvY2tldF9wYXRoKSkKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgIGdvdG8gbF9mYWlsZWRfMDsKKyAgICAgIH0KKworICAgIGlmICgoY2hlY2tpbl9yZXF1ZXN0ID0gbGF1bmNoX2RhdGFfbmV3X3N0cmluZyAoTEFVTkNIX0tFWV9DSEVDS0lOKSkgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJsYXVuY2hfZGF0YV9uZXdfc3RyaW5nKFwiJXNcIikgVW5hYmxlIHRvIGNyZWF0ZSBzdHJpbmcuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgTEFVTkNIX0tFWV9DSEVDS0lOKTsKKyAgICAgICAgZ290byBsX2ZhaWxlZF8wOworICAgICAgfQorCisgICAgaWYgKChjaGVja2luX3Jlc3BvbnNlID0gbGF1bmNoX21zZyAoY2hlY2tpbl9yZXF1ZXN0KSkgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lPX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgImxhdW5jaF9tc2coXCIlc1wiKSBJUEMgZmFpbHVyZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBMQVVOQ0hfS0VZX0NIRUNLSU4sIHN0cmVycm9yIChlcnJubykpOworICAgICAgICBnb3RvIGxfZmFpbGVkXzA7CisgICAgICB9CisKKyAgICBpZiAoTEFVTkNIX0RBVEFfRVJSTk8gPT0gbGF1bmNoX2RhdGFfZ2V0X3R5cGUgKGNoZWNraW5fcmVzcG9uc2UpKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELCAiQ2hlY2staW4gZmFpbGVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yIChsYXVuY2hfZGF0YV9nZXRfZXJybm8gKGNoZWNraW5fcmVzcG9uc2UpKSk7CisgICAgICAgIGdvdG8gbF9mYWlsZWRfMDsKKyAgICAgIH0KKworICAgIHNvY2tldHNfZGljdCA9CisgICAgICBsYXVuY2hfZGF0YV9kaWN0X2xvb2t1cCAoY2hlY2tpbl9yZXNwb25zZSwgTEFVTkNIX0pPQktFWV9TT0NLRVRTKTsKKyAgICBpZiAoTlVMTCA9PSBzb2NrZXRzX2RpY3QpCisgICAgICB7CisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JT19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJObyBzb2NrZXRzIGZvdW5kIHRvIGFuc3dlciByZXF1ZXN0cyBvbiFcbiIpOworICAgICAgICBnb3RvIGxfZmFpbGVkXzA7CisgICAgICB9CisKKyAgICBsaXN0ZW5pbmdfZmRfYXJyYXkgPQorICAgICAgbGF1bmNoX2RhdGFfZGljdF9sb29rdXAgKHNvY2tldHNfZGljdCwgInVuaXhfZG9tYWluX2xpc3RlbmVyIik7CisgICAgaWYgKE5VTEwgPT0gbGlzdGVuaW5nX2ZkX2FycmF5KQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU9fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAiTm8ga25vd24gc29ja2V0cyBmb3VuZCB0byBhbnN3ZXIgcmVxdWVzdHMgb24hXG4iKTsKKyAgICAgICAgZ290byBsX2ZhaWxlZF8wOworICAgICAgfQorCisgICAgaWYgKGxhdW5jaF9kYXRhX2FycmF5X2dldF9jb3VudCAobGlzdGVuaW5nX2ZkX2FycmF5KSAhPSAxKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTElNSVRTX0VYQ0VFREVELAorICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIDEgc29ja2V0IGZyb20gbGF1bmNoZCwgZ290ICVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhdW5jaF9kYXRhX2FycmF5X2dldF9jb3VudCAobGlzdGVuaW5nX2ZkX2FycmF5KSk7CisgICAgICAgIGdvdG8gbF9mYWlsZWRfMDsKKyAgICAgIH0KKworICAgIGxpc3RlbmluZ19mZCA9IGxhdW5jaF9kYXRhX2FycmF5X2dldF9pbmRleCAobGlzdGVuaW5nX2ZkX2FycmF5LCAwKTsKKyAgICBsYXVuY2hkX2ZkID0gbGF1bmNoX2RhdGFfZ2V0X2ZkIChsaXN0ZW5pbmdfZmQpOworCisgICAgX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMgKGxhdW5jaGRfZmQpOworCisgICAgaWYgKGxhdW5jaGRfZmQgPCAwKQorICAgICAgeworICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgIGdvdG8gbF9mYWlsZWRfMDsKKyAgaWYgKGRpc3BsYXkgPT0gTlVMTCB8fCAqZGlzcGxheSA9PSAnXDAnKQorICAgIHsKKyAgICAgIGVudmlyb25tZW50X2RpY3QgPSBsYXVuY2hfZGF0YV9kaWN0X2xvb2t1cCAoY2hlY2tpbl9yZXNwb25zZSwgTEFVTkNIX0pPQktFWV9VU0VSRU5WSVJPTk1FTlRWQVJJQUJMRVMpOworICAgICAgaWYgKE5VTEwgPT0gZW52aXJvbm1lbnRfZGljdCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJVbmFibGUgdG8gcmV0cmlldmUgdXNlciBlbnZpcm9ubWVudCBmcm9tIGxhdW5jaGQuIik7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGVudmlyb25tZW50X3BhcmFtID0gbGF1bmNoX2RhdGFfZGljdF9sb29rdXAgKGVudmlyb25tZW50X2RpY3QsICJESVNQTEFZIik7CisgICAgICAgICAgaWYgKE5VTEwgPT0gZW52aXJvbm1lbnRfcGFyYW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJVbmFibGUgdG8gcmV0cmlldmUgRElTUExBWSBmcm9tIGxhdW5jaGQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkaXNwbGF5ID0gbGF1bmNoX2RhdGFfZ2V0X3N0cmluZyhlbnZpcm9ubWVudF9wYXJhbSk7CisgICAgICAgICAgICAgIF9kYnVzX3NldGVudiAoIkRJU1BMQVkiLCBkaXNwbGF5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgICAgfQorCisgICAgc2VydmVyID0gX2RidXNfc2VydmVyX25ld19mb3Jfc29ja2V0ICgmbGF1bmNoZF9mZCwgMSwgJmFkZHJlc3MsIDApOworICAgIGlmIChzZXJ2ZXIgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX1NFUlZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gbGlzdGVuIG9uIGxhdW5jaGQgZmQgJWQuIiwgbGF1bmNoZF9mZCk7CisgICAgICAgIGdvdG8gbF9mYWlsZWRfMDsKKyAgICAgIH0KKworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisKKyAgICByZXR1cm4gc2VydmVyOworCisgIGxfZmFpbGVkXzA6CisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhZGRyZXNzKTsKKworICAgIHJldHVybiBOVUxMOworI2Vsc2UgLyogREJVU19FTkFCTEVfTEFVTkNIRCAqLworICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgImFkZHJlc3MgdHlwZSAnbGF1bmNoZCcgcmVxdWVzdGVkLCBidXQgbGF1bmNoZCBzdXBwb3J0IG5vdCBjb21waWxlZCBpbiIpOworICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgIH0KKworLyoqIEB9ICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1zZXJ2ZXItbGF1bmNoZC5oIGIvZGJ1cy9kYnVzL2RidXMtc2VydmVyLWxhdW5jaGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjliOTE0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtc2VydmVyLWxhdW5jaGQuaApAQCAtMCwwICsxLDM2IEBACisvKiBkYnVzLXNlcnZlci1sYXVuY2hkLmggU2VydmVyIG1ldGhvZHMgZm9yIGludGVyYWN0aW5nIHdpdGggbGF1bmNoZC4KKyogQ29weXJpZ2h0IChDKSAyMDA4LCBCZW5qYW1pbiBSZWVkIDxyYW5nZXJyaWNrQGJlZnVuay5jb20+CisqCisqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisqIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisqIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorKgorKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyoKKyogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorKi8KKworI2lmbmRlZiBEQlVTX1NFUlZFUl9MQVVOQ0hEX0gKKyNkZWZpbmUgREJVU19TRVJWRVJfTEFVTkNIRF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXNlcnZlci1wcm90ZWN0ZWQuaD4KKworREJVU19CRUdJTl9ERUNMUworCitEQnVzU2VydmVyICogX2RidXNfc2VydmVyX25ld19mb3JfbGF1bmNoZCAoY29uc3QgY2hhciAqbGF1bmNoZF9lbnZfdmFyLCBEQnVzRXJyb3IgKiBlcnJvcik7CisKK0RCVVNfRU5EX0RFQ0xTCisjZW5kaWYgLyogREJVU19TRVJWRVJfTEFVTkNIRF9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1zZXJ2ZXItcHJvdGVjdGVkLmggYi9kYnVzL2RidXMvZGJ1cy1zZXJ2ZXItcHJvdGVjdGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ1MjM0YgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXNlcnZlci1wcm90ZWN0ZWQuaApAQCAtMCwwICsxLDE3NiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNlcnZlci1wcm90ZWN0ZWQuaCBVc2VkIGJ5IHN1YmNsYXNzZXMgb2YgREJ1c1NlcnZlciBvYmplY3QgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfU0VSVkVSX1BST1RFQ1RFRF9ICisjZGVmaW5lIERCVVNfU0VSVkVSX1BST1RFQ1RFRF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXRocmVhZHMtaW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc2VydmVyLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWFkZHJlc3MuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdGltZW91dC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy13YXRjaC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1yZXNvdXJjZXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZGF0YXNsb3QuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgREJ1c1NlcnZlclZUYWJsZSBEQnVzU2VydmVyVlRhYmxlOworCisvKioKKyAqIFZpcnR1YWwgdGFibGUgdG8gYmUgaW1wbGVtZW50ZWQgYnkgYWxsIHNlcnZlciAic3ViY2xhc3NlcyIKKyAqLworc3RydWN0IERCdXNTZXJ2ZXJWVGFibGUKK3sKKyAgdm9pZCAgICAgICAgKCogZmluYWxpemUpICAgICAgKERCdXNTZXJ2ZXIgKnNlcnZlcik7CisgIC8qKjwgVGhlIGZpbmFsaXplIG1ldGhvZCBtdXN0IGZyZWUgdGhlIHNlcnZlci4gKi8KKyAgCisgIHZvaWQgICAgICAgICgqIGRpc2Nvbm5lY3QpICAgIChEQnVzU2VydmVyICpzZXJ2ZXIpOworICAvKio8IERpc2Nvbm5lY3QgdGhpcyBzZXJ2ZXIuICovCit9OworCisvKioKKyAqIEBpbmdyb3VwIERCdXNTZXJ2ZXJJbnRlcm5hbHMKKyAqIEludGVybmFscyBvZiBEQnVzU2VydmVyIG9iamVjdAorICovCitzdHJ1Y3QgREJ1c1NlcnZlcgoreworICBEQnVzQXRvbWljIHJlZmNvdW50OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVmZXJlbmNlIGNvdW50LiAqLworICBjb25zdCBEQnVzU2VydmVyVlRhYmxlICp2dGFibGU7ICAgICAgICAgICAgIC8qKjwgVmlydHVhbCBtZXRob2RzIGZvciB0aGlzIGluc3RhbmNlLiAqLworICBEQnVzUk11dGV4ICptdXRleDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9jayBvbiB0aGUgc2VydmVyIG9iamVjdCAqLworCisgIERCdXNHVUlEIGd1aWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBHbG9iYWxseSB1bmlxdWUgSUQgb2Ygc2VydmVyICovCisKKyAgREJ1c1N0cmluZyBndWlkX2hleDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEhleC1lbmNvZGVkIHZlcnNpb24gb2YgR1VJRCAqLworICAKKyAgREJ1c1dhdGNoTGlzdCAqd2F0Y2hlczsgICAgICAgICAgICAgICAgICAgICAvKio8IE91ciB3YXRjaGVzICovCisgIERCdXNUaW1lb3V0TGlzdCAqdGltZW91dHM7ICAgICAgICAgICAgICAgICAgLyoqPCBPdXIgdGltZW91dHMgKi8gIAorCisgIGNoYXIgKmFkZHJlc3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBBZGRyZXNzIHRoaXMgc2VydmVyIGlzIGxpc3RlbmluZyBvbi4gKi8KKyAgZGJ1c19ib29sX3QgcHVibGlzaGVkX2FkZHJlc3M7ICAgICAgICAgICAgICAvKio8IGZsYWcgd2hpY2ggaW5kaWNhdGVzIHRoYXQgc2VydmVyIGhhcyBwdWJsaXNoZWQgaXRzIGJ1cyBhZGRyZXNzLiAqLworCisgIGludCBtYXhfY29ubmVjdGlvbnM7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNYXggbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGFsbG93ZWQgYXQgb25jZS4gKi8KKworICBEQnVzRGF0YVNsb3RMaXN0IHNsb3RfbGlzdDsgICAvKio8IERhdGEgc3RvcmVkIGJ5IGFsbG9jYXRlZCBpbnRlZ2VyIElEICovCisgIAorICBEQnVzTmV3Q29ubmVjdGlvbkZ1bmN0aW9uICBuZXdfY29ubmVjdGlvbl9mdW5jdGlvbjsKKyAgLyoqPCBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiBhIG5ldyBjb25uZWN0aW9uIGlzIGNyZWF0ZWQuICovCisgIHZvaWQgKm5ld19jb25uZWN0aW9uX2RhdGE7CisgIC8qKjwgRGF0YSBmb3IgbmV3IGNvbm5lY3Rpb24gY2FsbGJhY2sgKi8KKyAgREJ1c0ZyZWVGdW5jdGlvbiBuZXdfY29ubmVjdGlvbl9mcmVlX2RhdGFfZnVuY3Rpb247CisgIC8qKjwgQ2FsbGJhY2sgdG8gaW52b2tlIHRvIGZyZWUgbmV3X2Nvbm5lY3Rpb25fZGF0YQorICAgKiB3aGVuIHNlcnZlciBpcyBmaW5hbGl6ZWQgb3IgZGF0YSBpcyByZXBsYWNlZC4KKyAgICovCisKKyAgY2hhciAqKmF1dGhfbWVjaGFuaXNtczsgLyoqPCBBcnJheSBvZiBhbGxvd2VkIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgKi8KKyAgCisgIHVuc2lnbmVkIGludCBkaXNjb25uZWN0ZWQgOiAxOyAgICAgICAgICAgICAgLyoqPCBUUlVFIGlmIHdlIGFyZSBkaXNjb25uZWN0ZWQuICovCisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICB1bnNpZ25lZCBpbnQgaGF2ZV9zZXJ2ZXJfbG9jayA6IDE7IC8qKjwgRG9lcyBzb21lb25lIGhhdmUgdGhlIHNlcnZlciBtdXRleCBsb2NrZWQgKi8KKyNlbmRpZgorfTsKKworZGJ1c19ib29sX3QgX2RidXNfc2VydmVyX2luaXRfYmFzZSAgICAgIChEQnVzU2VydmVyICAgICAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTZXJ2ZXJWVGFibGUgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgICAqYWRkcmVzcyk7Cit2b2lkICAgICAgICBfZGJ1c19zZXJ2ZXJfZmluYWxpemVfYmFzZSAgKERCdXNTZXJ2ZXIgICAgICAgICAgICAgKnNlcnZlcik7CitkYnVzX2Jvb2xfdCBfZGJ1c19zZXJ2ZXJfYWRkX3dhdGNoICAgICAgKERCdXNTZXJ2ZXIgICAgICAgICAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAgICAgICAgICAqd2F0Y2gpOwordm9pZCAgICAgICAgX2RidXNfc2VydmVyX3JlbW92ZV93YXRjaCAgIChEQnVzU2VydmVyICAgICAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICAgICAgICAgKndhdGNoKTsKK3ZvaWQgICAgICAgIF9kYnVzX3NlcnZlcl90b2dnbGVfd2F0Y2ggICAoREJ1c1NlcnZlciAgICAgICAgICAgICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgZW5hYmxlZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19zZXJ2ZXJfYWRkX3RpbWVvdXQgICAgKERCdXNTZXJ2ZXIgICAgICAgICAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgICAgICAgICAqdGltZW91dCk7Cit2b2lkICAgICAgICBfZGJ1c19zZXJ2ZXJfcmVtb3ZlX3RpbWVvdXQgKERCdXNTZXJ2ZXIgICAgICAgICAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgICAgICAgICAqdGltZW91dCk7Cit2b2lkICAgICAgICBfZGJ1c19zZXJ2ZXJfdG9nZ2xlX3RpbWVvdXQgKERCdXNTZXJ2ZXIgICAgICAgICAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgICAgICAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgZW5hYmxlZCk7CisKK3ZvaWQgICAgICAgIF9kYnVzX3NlcnZlcl9yZWZfdW5sb2NrZWQgICAoREJ1c1NlcnZlciAgICAgICAgICAgICAqc2VydmVyKTsKK3ZvaWQgICAgICAgIF9kYnVzX3NlcnZlcl91bnJlZl91bmxvY2tlZCAoREJ1c1NlcnZlciAgICAgICAgICAgICAqc2VydmVyKTsKKwordHlwZWRlZiBlbnVtCit7CisgIERCVVNfU0VSVkVSX0xJU1RFTl9OT1RfSEFORExFRCwgLyoqPCB3ZSBhcmVuJ3QgaW4gY2hhcmdlIG9mIHRoaXMgYWRkcmVzcyB0eXBlICovCisgIERCVVNfU0VSVkVSX0xJU1RFTl9PSywgICAgICAgICAgLyoqPCB3ZSBzZXQgdXAgdGhlIGxpc3RlbiAqLworICBEQlVTX1NFUlZFUl9MSVNURU5fQkFEX0FERFJFU1MsIC8qKjwgbWFsZm9ybWVkIGFkZHJlc3MgKi8KKyAgREJVU19TRVJWRVJfTElTVEVOX0RJRF9OT1RfQ09OTkVDVCwgLyoqPCB3ZWxsLWZvcm1lZCBhZGRyZXNzIGJ1dCBmYWlsZWQgdG8gc2V0IGl0IHVwICovCisgIERCVVNfU0VSVkVSX0xJU1RFTl9BRERSRVNTX0FMUkVBRFlfVVNFRCAvKio8IGFkZHJlc3MgaXMgYWxyZWFkeSB1c2VkICovCit9IERCdXNTZXJ2ZXJMaXN0ZW5SZXN1bHQ7CisKK0RCdXNTZXJ2ZXJMaXN0ZW5SZXN1bHQgX2RidXNfc2VydmVyX2xpc3Rlbl9wbGF0Zm9ybV9zcGVjaWZpYyAoREJ1c0FkZHJlc3NFbnRyeSAgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU2VydmVyICAgICAgICoqc2VydmVyX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcik7CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKK3ZvaWQgX2RidXNfc2VydmVyX3RyYWNlX3JlZiAoREJ1c1NlcnZlciAqc2VydmVyLAorICAgIGludCBvbGRfcmVmY291bnQsCisgICAgaW50IG5ld19yZWZjb3VudCwKKyAgICBjb25zdCBjaGFyICp3aHkpOworI2Vsc2UKKyNkZWZpbmUgX2RidXNfc2VydmVyX3RyYWNlX3JlZihzLG8sbix3KSBcCisgIGRvIFwKKyAge1wKKyAgICAodm9pZCkgKG8pOyBcCisgICAgKHZvaWQpIChuKTsgXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisjZGVmaW5lIFRPT0tfTE9DS19DSEVDSyhzZXJ2ZXIpCisjZGVmaW5lIFJFTEVBU0lOR19MT0NLX0NIRUNLKHNlcnZlcikKKyNkZWZpbmUgSEFWRV9MT0NLX0NIRUNLKHNlcnZlcikKKyNlbHNlCisjZGVmaW5lIFRPT0tfTE9DS19DSEVDSyhzZXJ2ZXIpIGRvIHsgICAgICAgICAgICAgICAgXAorICAgIF9kYnVzX2Fzc2VydCAoIShzZXJ2ZXIpLT5oYXZlX3NlcnZlcl9sb2NrKTsgXAorICAgIChzZXJ2ZXIpLT5oYXZlX3NlcnZlcl9sb2NrID0gVFJVRTsgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBSRUxFQVNJTkdfTE9DS19DSEVDSyhzZXJ2ZXIpIGRvIHsgICAgICAgICAgICBcCisgICAgX2RidXNfYXNzZXJ0ICgoc2VydmVyKS0+aGF2ZV9zZXJ2ZXJfbG9jayk7ICAgXAorICAgIChzZXJ2ZXIpLT5oYXZlX3NlcnZlcl9sb2NrID0gRkFMU0U7ICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgSEFWRV9MT0NLX0NIRUNLKHNlcnZlcikgICAgICAgIF9kYnVzX2Fzc2VydCAoKHNlcnZlciktPmhhdmVfc2VydmVyX2xvY2spCisvKiBBICJET19OT1RfSEFWRV9MT0NLX0NIRUNLIiBpcyBpbXBvc3NpYmxlIHNpbmNlIHdlIG5lZWQgdGhlIGxvY2sgdG8gY2hlY2sgdGhlIGZsYWcgKi8KKyNlbmRpZgorCisjZGVmaW5lIFRSQUNFX0xPQ0tTIDAKKworI2RlZmluZSBTRVJWRVJfTE9DSyhzZXJ2ZXIpICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKFRSQUNFX0xPQ0tTKSB7IF9kYnVzX3ZlcmJvc2UgKCJMT0NLXG4iKTsgfSAgIFwKKyAgICBfZGJ1c19ybXV0ZXhfbG9jayAoKHNlcnZlciktPm11dGV4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRPT0tfTE9DS19DSEVDSyAoc2VydmVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgU0VSVkVSX1VOTE9DSyhzZXJ2ZXIpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKFRSQUNFX0xPQ0tTKSB7IF9kYnVzX3ZlcmJvc2UgKCJVTkxPQ0tcbiIpOyAgfSAgICAgICAgXAorICAgIFJFTEVBU0lOR19MT0NLX0NIRUNLIChzZXJ2ZXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfZGJ1c19ybXV0ZXhfdW5sb2NrICgoc2VydmVyKS0+bXV0ZXgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1NFUlZFUl9QUk9URUNURURfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtc2VydmVyLXNvY2tldC5jIGIvZGJ1cy9kYnVzL2RidXMtc2VydmVyLXNvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNGI2MDIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1zZXJ2ZXItc29ja2V0LmMKQEAgLTAsMCArMSw1ODYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zZXJ2ZXItc29ja2V0LmMgU2VydmVyIGltcGxlbWVudGF0aW9uIGZvciBzb2NrZXRzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA2ICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc2VydmVyLXNvY2tldC5oIgorI2luY2x1ZGUgImRidXMtdHJhbnNwb3J0LXNvY2tldC5oIgorI2luY2x1ZGUgImRidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImRidXMtbWVtb3J5LmgiCisjaW5jbHVkZSAiZGJ1cy1ub25jZS5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNTZXJ2ZXJTb2NrZXQgREJ1c1NlcnZlciBpbXBsZW1lbnRhdGlvbnMgZm9yIFNPQ0tFVAorICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIERCdXNTZXJ2ZXIgb24gU09DS0VUCisgKgorICogQHsKKyAqLworLyoqCisgKgorICogT3BhcXVlIG9iamVjdCByZXByZXNlbnRpbmcgYSBTb2NrZXQgc2VydmVyIGltcGxlbWVudGF0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCBEQnVzU2VydmVyU29ja2V0IERCdXNTZXJ2ZXJTb2NrZXQ7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBEQnVzU2VydmVyU29ja2V0LiBBbGwgbWVtYmVycworICogYXJlIHByaXZhdGUuCisgKi8KK3N0cnVjdCBEQnVzU2VydmVyU29ja2V0Cit7CisgIERCdXNTZXJ2ZXIgYmFzZTsgICAvKio8IFBhcmVudCBjbGFzcyBtZW1iZXJzLiAqLworICBpbnQgbl9mZHM7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgYWN0aXZlIGZpbGUgaGFuZGxlcyAqLworICBpbnQgKmZkczsgICAgICAgICAgLyoqPCBGaWxlIGRlc2NyaXB0b3Igb3IgLTEgaWYgZGlzY29ubmVjdGVkLiAqLworICBEQnVzV2F0Y2ggKip3YXRjaDsgLyoqPCBGaWxlIGRlc2NyaXB0b3Igd2F0Y2guICovCisgIGNoYXIgKnNvY2tldF9uYW1lOyAvKio8IE5hbWUgb2YgZG9tYWluIHNvY2tldCwgdG8gdW5saW5rIGlmIGFwcHJvcHJpYXRlICovCisgIERCdXNOb25jZUZpbGUgKm5vbmNlZmlsZTsgLyoqPCBOb25jZSBmaWxlIHVzZWQgdG8gYXV0aGVudGljYXRlIGNsaWVudHMgKi8KK307CisKK3N0YXRpYyB2b2lkCitzb2NrZXRfZmluYWxpemUgKERCdXNTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgREJ1c1NlcnZlclNvY2tldCAqc29ja2V0X3NlcnZlciA9IChEQnVzU2VydmVyU29ja2V0Kikgc2VydmVyOworICBpbnQgaTsKKworICBfZGJ1c19zZXJ2ZXJfZmluYWxpemVfYmFzZSAoc2VydmVyKTsKKworICBmb3IgKGkgPSAwIDsgaSA8IHNvY2tldF9zZXJ2ZXItPm5fZmRzIDsgaSsrKQorICAgIGlmIChzb2NrZXRfc2VydmVyLT53YXRjaFtpXSkKKyAgICAgIHsKKyAgICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgKHNvY2tldF9zZXJ2ZXItPndhdGNoW2ldKTsKKyAgICAgICAgc29ja2V0X3NlcnZlci0+d2F0Y2hbaV0gPSBOVUxMOworICAgICAgfQorCisgIGRidXNfZnJlZSAoc29ja2V0X3NlcnZlci0+ZmRzKTsKKyAgZGJ1c19mcmVlIChzb2NrZXRfc2VydmVyLT53YXRjaCk7CisgIGRidXNfZnJlZSAoc29ja2V0X3NlcnZlci0+c29ja2V0X25hbWUpOworICBpZiAoc29ja2V0X3NlcnZlci0+bm9uY2VmaWxlKQorCV9kYnVzX25vbmNlZmlsZV9kZWxldGUgKHNvY2tldF9zZXJ2ZXItPm5vbmNlZmlsZSwgTlVMTCk7CisgIGRidXNfZnJlZSAoc29ja2V0X3NlcnZlci0+bm9uY2VmaWxlKTsKKyAgZGJ1c19mcmVlIChzZXJ2ZXIpOworfQorCisvKiBSZXR1cm4gdmFsdWUgaXMganVzdCBmb3IgbWVtb3J5LCBub3Qgb3RoZXIgZmFpbHVyZXMuICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV9uZXdfY2xpZW50X2ZkX2FuZF91bmxvY2sgKERCdXNTZXJ2ZXIgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGNsaWVudF9mZCkKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydDsKKyAgREJ1c05ld0Nvbm5lY3Rpb25GdW5jdGlvbiBuZXdfY29ubmVjdGlvbl9mdW5jdGlvbjsKKyAgdm9pZCAqbmV3X2Nvbm5lY3Rpb25fZGF0YTsKKworICBfZGJ1c192ZXJib3NlICgiQ3JlYXRpbmcgbmV3IGNsaWVudCBjb25uZWN0aW9uIHdpdGggZmQgJWRcbiIsIGNsaWVudF9mZCk7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChzZXJ2ZXIpOworCisgIGlmICghX2RidXNfc2V0X2ZkX25vbmJsb2NraW5nIChjbGllbnRfZmQsIE5VTEwpKQorICAgIHsKKyAgICAgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgdHJhbnNwb3J0ID0gX2RidXNfdHJhbnNwb3J0X25ld19mb3Jfc29ja2V0IChjbGllbnRfZmQsICZzZXJ2ZXItPmd1aWRfaGV4LCBGQUxTRSk7CisgIGlmICh0cmFuc3BvcnQgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19jbG9zZV9zb2NrZXQgKGNsaWVudF9mZCwgTlVMTCk7CisgICAgICBTRVJWRVJfVU5MT0NLIChzZXJ2ZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3RyYW5zcG9ydF9zZXRfYXV0aF9tZWNoYW5pc21zICh0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICoqKSBzZXJ2ZXItPmF1dGhfbWVjaGFuaXNtcykpCisgICAgeworICAgICAgX2RidXNfdHJhbnNwb3J0X3VucmVmICh0cmFuc3BvcnQpOworICAgICAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogbm90ZSB0aGF0IGNsaWVudF9mZCBpcyBub3cgb3duZWQgYnkgdGhlIHRyYW5zcG9ydCwgYW5kIHdpbGwgYmUKKyAgICogY2xvc2VkIG9uIHRyYW5zcG9ydCBkaXNjb25uZWN0aW9uL2ZpbmFsaXphdGlvbgorICAgKi8KKworICBjb25uZWN0aW9uID0gX2RidXNfY29ubmVjdGlvbl9uZXdfZm9yX3RyYW5zcG9ydCAodHJhbnNwb3J0KTsKKyAgX2RidXNfdHJhbnNwb3J0X3VucmVmICh0cmFuc3BvcnQpOworICB0cmFuc3BvcnQgPSBOVUxMOyAvKiBub3cgdW5kZXIgdGhlIGNvbm5lY3Rpb24gbG9jayAqLworCisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgeworICAgICAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogU2VlIGlmIHNvbWVvbmUgd2FudHMgdG8gaGFuZGxlIHRoaXMgbmV3IGNvbm5lY3Rpb24sIHNlbGYtcmVmZXJlbmNpbmcKKyAgICogZm9yIHBhcmFub2lhLgorICAgKi8KKyAgbmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb24gPSBzZXJ2ZXItPm5ld19jb25uZWN0aW9uX2Z1bmN0aW9uOworICBuZXdfY29ubmVjdGlvbl9kYXRhID0gc2VydmVyLT5uZXdfY29ubmVjdGlvbl9kYXRhOworCisgIF9kYnVzX3NlcnZlcl9yZWZfdW5sb2NrZWQgKHNlcnZlcik7CisgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisKKyAgaWYgKG5ld19jb25uZWN0aW9uX2Z1bmN0aW9uKQorICAgIHsKKyAgICAgICgqIG5ld19jb25uZWN0aW9uX2Z1bmN0aW9uKSAoc2VydmVyLCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfY29ubmVjdGlvbl9kYXRhKTsKKyAgICB9CisgIGRidXNfc2VydmVyX3VucmVmIChzZXJ2ZXIpOworCisgIC8qIElmIG5vIG9uZSBncmFiYmVkIGEgcmVmZXJlbmNlLCB0aGUgY29ubmVjdGlvbiB3aWxsIGRpZS4gKi8KKyAgX2RidXNfY29ubmVjdGlvbl9jbG9zZV9pZl9vbmx5X29uZV9yZWYgKGNvbm5lY3Rpb24pOworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NvY2tldF9oYW5kbGVfd2F0Y2ggKERCdXNXYXRjaCAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICBmbGFncywKKyAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgKmRhdGEpCit7CisgIERCdXNTZXJ2ZXIgKnNlcnZlciA9IGRhdGE7CisgIERCdXNTZXJ2ZXJTb2NrZXQgKnNvY2tldF9zZXJ2ZXIgPSBkYXRhOworCisjaWZuZGVmIERCVVNfRElTQUJMRV9BU1NFUlQKKyAgaW50IGk7CisgIGRidXNfYm9vbF90IGZvdW5kID0gRkFMU0U7CisjZW5kaWYKKworICBTRVJWRVJfTE9DSyAoc2VydmVyKTsKKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisgIGZvciAoaSA9IDAgOyBpIDwgc29ja2V0X3NlcnZlci0+bl9mZHMgOyBpKyspCisgICAgeworICAgICAgaWYgKHNvY2tldF9zZXJ2ZXItPndhdGNoW2ldID09IHdhdGNoKQorICAgICAgICBmb3VuZCA9IFRSVUU7CisgICAgfQorICBfZGJ1c19hc3NlcnQgKGZvdW5kKTsKKyNlbmRpZgorCisgIF9kYnVzX3ZlcmJvc2UgKCJIYW5kbGluZyBjbGllbnQgY29ubmVjdGlvbiwgZmxhZ3MgMHgleFxuIiwgZmxhZ3MpOworCisgIGlmIChmbGFncyAmIERCVVNfV0FUQ0hfUkVBREFCTEUpCisgICAgeworICAgICAgaW50IGNsaWVudF9mZDsKKyAgICAgIGludCBsaXN0ZW5fZmQ7CisKKyAgICAgIGxpc3Rlbl9mZCA9IGRidXNfd2F0Y2hfZ2V0X3NvY2tldCAod2F0Y2gpOworCisgICAgICBpZiAoc29ja2V0X3NlcnZlci0+bm9uY2VmaWxlKQorICAgICAgICAgIGNsaWVudF9mZCA9IF9kYnVzX2FjY2VwdF93aXRoX25vbmNlZmlsZSAobGlzdGVuX2ZkLCBzb2NrZXRfc2VydmVyLT5ub25jZWZpbGUpOworICAgICAgZWxzZSAKKyAgICAgICAgICBjbGllbnRfZmQgPSBfZGJ1c19hY2NlcHQgKGxpc3Rlbl9mZCk7CisKKyAgICAgIGlmIChjbGllbnRfZmQgPCAwKQorICAgICAgICB7CisgICAgICAgICAgLyogRUlOVFIgaGFuZGxlZCBmb3IgdXMgKi8KKworICAgICAgICAgIGlmIChfZGJ1c19nZXRfaXNfZXJybm9fZWFnYWluX29yX2V3b3VsZGJsb2NrICgpKQorICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIGNsaWVudCBhdmFpbGFibGUgdG8gYWNjZXB0IGFmdGVyIGFsbFxuIik7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBhY2NlcHQgYSBjbGllbnQgY29ubmVjdGlvbjogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKworICAgICAgICAgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmICghaGFuZGxlX25ld19jbGllbnRfZmRfYW5kX3VubG9jayAoc2VydmVyLCBjbGllbnRfZmQpKQorICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIlJlamVjdGVkIGNsaWVudCBjb25uZWN0aW9uIGR1ZSB0byBsYWNrIG9mIG1lbW9yeVxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKGZsYWdzICYgREJVU19XQVRDSF9FUlJPUikKKyAgICBfZGJ1c192ZXJib3NlICgiRXJyb3Igb24gc2VydmVyIGxpc3RlbmluZyBzb2NrZXRcbiIpOworCisgIGlmIChmbGFncyAmIERCVVNfV0FUQ0hfSEFOR1VQKQorICAgIF9kYnVzX3ZlcmJvc2UgKCJIYW5ndXAgb24gc2VydmVyIGxpc3RlbmluZyBzb2NrZXRcbiIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorc29ja2V0X2Rpc2Nvbm5lY3QgKERCdXNTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgREJ1c1NlcnZlclNvY2tldCAqc29ja2V0X3NlcnZlciA9IChEQnVzU2VydmVyU29ja2V0Kikgc2VydmVyOworICBpbnQgaTsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKHNlcnZlcik7CisKKyAgZm9yIChpID0gMCA7IGkgPCBzb2NrZXRfc2VydmVyLT5uX2ZkcyA7IGkrKykKKyAgICB7CisgICAgICBpZiAoc29ja2V0X3NlcnZlci0+d2F0Y2hbaV0pCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zZXJ2ZXJfcmVtb3ZlX3dhdGNoIChzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X3NlcnZlci0+d2F0Y2hbaV0pOworICAgICAgICAgIF9kYnVzX3dhdGNoX2ludmFsaWRhdGUgKHNvY2tldF9zZXJ2ZXItPndhdGNoW2ldKTsKKyAgICAgICAgICBfZGJ1c193YXRjaF91bnJlZiAoc29ja2V0X3NlcnZlci0+d2F0Y2hbaV0pOworICAgICAgICAgIHNvY2tldF9zZXJ2ZXItPndhdGNoW2ldID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c19jbG9zZV9zb2NrZXQgKHNvY2tldF9zZXJ2ZXItPmZkc1tpXSwgTlVMTCk7CisgICAgICBzb2NrZXRfc2VydmVyLT5mZHNbaV0gPSAtMTsKKyAgICB9CisKKyAgaWYgKHNvY2tldF9zZXJ2ZXItPnNvY2tldF9uYW1lICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c1N0cmluZyB0bXA7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnRtcCwgc29ja2V0X3NlcnZlci0+c29ja2V0X25hbWUpOworICAgICAgX2RidXNfZGVsZXRlX2ZpbGUgKCZ0bXAsIE5VTEwpOworICAgIH0KKworICBpZiAoc2VydmVyLT5wdWJsaXNoZWRfYWRkcmVzcykKKyAgICAgIF9kYnVzX2RhZW1vbl91bnB1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcygpOworCisgIEhBVkVfTE9DS19DSEVDSyAoc2VydmVyKTsKK30KKworc3RhdGljIGNvbnN0IERCdXNTZXJ2ZXJWVGFibGUgc29ja2V0X3Z0YWJsZSA9IHsKKyAgc29ja2V0X2ZpbmFsaXplLAorICBzb2NrZXRfZGlzY29ubmVjdAorfTsKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IHNlcnZlciBsaXN0ZW5pbmcgb24gdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvci4gIFRoZQorICogZmlsZSBkZXNjcmlwdG9yIHNob3VsZCBiZSBub25ibG9ja2luZyAodXNlCisgKiBfZGJ1c19zZXRfZmRfbm9uYmxvY2tpbmcoKSB0byBtYWtlIGl0IHNvKS4gVGhlIGZpbGUgZGVzY3JpcHRvcgorICogc2hvdWxkIGJlIGxpc3RlbmluZyBmb3IgY29ubmVjdGlvbnMsIHRoYXQgaXMsIGxpc3RlbigpIHNob3VsZCBoYXZlCisgKiBiZWVuIHN1Y2Nlc3NmdWxseSBpbnZva2VkIG9uIGl0LiBUaGUgc2VydmVyIHdpbGwgdXNlIGFjY2VwdCgpIHRvCisgKiBhY2NlcHQgbmV3IGNsaWVudCBjb25uZWN0aW9ucy4KKyAqCisgKiBAcGFyYW0gZmRzIGxpc3Qgb2YgZmlsZSBkZXNjcmlwdG9ycy4KKyAqIEBwYXJhbSBuX2ZkcyBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycworICogQHBhcmFtIGFkZHJlc3MgdGhlIHNlcnZlcidzIGFkZHJlc3MKKyAqIEBwYXJhbSBub25jZWZpbGUgdG8gYmUgdXNlZCBmb3IgYXV0aGVudGljYXRpb24gKE5VTEwgaWYgbm90IG5lZWRlZCkKKyAqIEByZXR1cm5zIHRoZSBuZXcgc2VydmVyLCBvciAjTlVMTCBpZiBubyBtZW1vcnkuCisgKgorICovCitEQnVzU2VydmVyKgorX2RidXNfc2VydmVyX25ld19mb3Jfc29ja2V0IChpbnQgICAgICAgICAgICAgICpmZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIG5fZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTm9uY2VGaWxlICAgICpub25jZWZpbGUpCit7CisgIERCdXNTZXJ2ZXJTb2NrZXQgKnNvY2tldF9zZXJ2ZXI7CisgIERCdXNTZXJ2ZXIgKnNlcnZlcjsKKyAgaW50IGk7CisKKyAgc29ja2V0X3NlcnZlciA9IGRidXNfbmV3MCAoREJ1c1NlcnZlclNvY2tldCwgMSk7CisgIGlmIChzb2NrZXRfc2VydmVyID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgc29ja2V0X3NlcnZlci0+bm9uY2VmaWxlID0gbm9uY2VmaWxlOworCisgIHNvY2tldF9zZXJ2ZXItPmZkcyA9IGRidXNfbmV3IChpbnQsIG5fZmRzKTsKKyAgaWYgKCFzb2NrZXRfc2VydmVyLT5mZHMpCisgICAgZ290byBmYWlsZWRfMDsKKworICBzb2NrZXRfc2VydmVyLT53YXRjaCA9IGRidXNfbmV3MCAoREJ1c1dhdGNoICosIG5fZmRzKTsKKyAgaWYgKCFzb2NrZXRfc2VydmVyLT53YXRjaCkKKyAgICBnb3RvIGZhaWxlZF8xOworCisgIGZvciAoaSA9IDAgOyBpIDwgbl9mZHMgOyBpKyspCisgICAgeworICAgICAgREJ1c1dhdGNoICp3YXRjaDsKKworICAgICAgd2F0Y2ggPSBfZGJ1c193YXRjaF9uZXcgKGZkc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1dBVENIX1JFQURBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X2hhbmRsZV93YXRjaCwgc29ja2V0X3NlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIGlmICh3YXRjaCA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWxlZF8yOworCisgICAgICBzb2NrZXRfc2VydmVyLT5uX2ZkcysrOworICAgICAgc29ja2V0X3NlcnZlci0+ZmRzW2ldID0gZmRzW2ldOworICAgICAgc29ja2V0X3NlcnZlci0+d2F0Y2hbaV0gPSB3YXRjaDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zZXJ2ZXJfaW5pdF9iYXNlICgmc29ja2V0X3NlcnZlci0+YmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc29ja2V0X3Z0YWJsZSwgYWRkcmVzcykpCisgICAgZ290byBmYWlsZWRfMjsKKworICBzZXJ2ZXIgPSAoREJ1c1NlcnZlciopc29ja2V0X3NlcnZlcjsKKworICBTRVJWRVJfTE9DSyAoc2VydmVyKTsKKworICBmb3IgKGkgPSAwIDsgaSA8IG5fZmRzIDsgaSsrKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc2VydmVyX2FkZF93YXRjaCAoJnNvY2tldF9zZXJ2ZXItPmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF9zZXJ2ZXItPndhdGNoW2ldKSkKKyAgICAgICAgeworICAgICAgICAgIGludCBqOworICAgICAgICAgIGZvciAoaiA9IDAgOyBqIDwgaSA7IGorKykKKyAgICAgICAgICAgIF9kYnVzX3NlcnZlcl9yZW1vdmVfd2F0Y2ggKHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF9zZXJ2ZXItPndhdGNoW2pdKTsKKworICAgICAgICAgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisgICAgICAgICAgX2RidXNfc2VydmVyX2ZpbmFsaXplX2Jhc2UgKCZzb2NrZXRfc2VydmVyLT5iYXNlKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZF8yOworICAgICAgICB9CisgICAgfQorCisgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisKKyAgX2RidXNfc2VydmVyX3RyYWNlX3JlZiAoJnNvY2tldF9zZXJ2ZXItPmJhc2UsIDAsIDEsICJuZXdfZm9yX3NvY2tldCIpOworICByZXR1cm4gKERCdXNTZXJ2ZXIqKSBzb2NrZXRfc2VydmVyOworCisgZmFpbGVkXzI6CisgIGZvciAoaSA9IDAgOyBpIDwgbl9mZHMgOyBpKyspCisgICAgeworICAgICAgaWYgKHNvY2tldF9zZXJ2ZXItPndhdGNoW2ldICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXRjaF91bnJlZiAoc29ja2V0X3NlcnZlci0+d2F0Y2hbaV0pOworICAgICAgICAgIHNvY2tldF9zZXJ2ZXItPndhdGNoW2ldID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgZGJ1c19mcmVlIChzb2NrZXRfc2VydmVyLT53YXRjaCk7CisKKyBmYWlsZWRfMToKKyAgZGJ1c19mcmVlIChzb2NrZXRfc2VydmVyLT5mZHMpOworCisgZmFpbGVkXzA6CisgIGRidXNfZnJlZSAoc29ja2V0X3NlcnZlcik7CisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgc2VydmVyIGxpc3RlbmluZyBvbiBUQ1AuCisgKiBJZiBob3N0IGlzIE5VTEwsIGl0IHdpbGwgZGVmYXVsdCB0byBsb2NhbGhvc3QuCisgKiBJZiBiaW5kIGlzIE5VTEwsIGl0IHdpbGwgZGVmYXVsdCB0byB0aGUgdmFsdWUgZm9yIHRoZSBob3N0CisgKiBwYXJhbWV0ZXIsIGFuZCBpZiB0aGF0IGlzIE5VTEwsIHRoZW4gbG9jYWxob3N0CisgKiBJZiBiaW5kIGlzIGEgaG9zdG5hbWUsIGl0IHdpbGwgYmUgcmVzb2x2ZWQgYW5kIHdpbGwgbGlzdGVuCisgKiBvbiBhbGwgcmV0dXJuZWQgYWRkcmVzc2VzLgorICogSWYgZmFtaWx5IGlzIE5VTEwsIGhvc3RuYW1lIHJlc29sdXRpb24gd2lsbCB0cnkgYWxsIGFkZHJlc3MKKyAqIGZhbWlsaWVzLCBvdGhlcndpc2UgaXQgY2FuIGJlIGlwdjQgb3IgaXB2NiB0byByZXN0cmljdCB0aGUKKyAqIGFkZHJlc3NlcyBjb25zaWRlcmVkLgorICoKKyAqIEBwYXJhbSBob3N0IHRoZSBob3N0bmFtZSB0byByZXBvcnQgZm9yIHRoZSBsaXN0ZW4gYWRkcmVzcworICogQHBhcmFtIGJpbmQgdGhlIGhvc3RuYW1lIHRvIGxpc3RlbiBvbgorICogQHBhcmFtIHBvcnQgdGhlIHBvcnQgdG8gbGlzdGVuIG9uIG9yIDAgdG8gbGV0IHRoZSBPUyBjaG9vc2UKKyAqIEBwYXJhbSBmYW1pbHkKKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSByZWFzb24gZm9yIGZhaWx1cmUuCisgKiBAcGFyYW0gdXNlX25vbmNlIHdoZXRoZXIgdG8gdXNlIGEgbm9uY2UgZm9yIGxvdy1sZXZlbCBhdXRoZW50aWNhdGlvbiAobm9uY2UtdGNwIHRyYW5zcG9ydCkgb3Igbm90ICh0Y3AgdHJhbnNwb3J0KQorICogQHJldHVybnMgdGhlIG5ldyBzZXJ2ZXIsIG9yICNOVUxMIG9uIGZhaWx1cmUuCisgKi8KK0RCdXNTZXJ2ZXIqCitfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl90Y3Bfc29ja2V0IChjb25zdCBjaGFyICAgICAqaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpiaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgdXNlX25vbmNlKQoreworICBEQnVzU2VydmVyICpzZXJ2ZXI7CisgIGludCAqbGlzdGVuX2ZkcyA9IE5VTEw7CisgIGludCBubGlzdGVuX2ZkcyA9IDAsIGk7CisgIERCdXNTdHJpbmcgYWRkcmVzczsKKyAgREJ1c1N0cmluZyBob3N0X3N0cjsKKyAgREJ1c1N0cmluZyBwb3J0X3N0cjsKKyAgREJ1c05vbmNlRmlsZSAqbm9uY2VmaWxlOworICAKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgbm9uY2VmaWxlID0gTlVMTDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYWRkcmVzcykpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnBvcnRfc3RyKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gZmFpbGVkXzA7CisgICAgfQorCisgIGlmIChob3N0ID09IE5VTEwpCisgICAgaG9zdCA9ICJsb2NhbGhvc3QiOworCisgIGlmIChwb3J0ID09IE5VTEwpCisgICAgcG9ydCA9ICIwIjsKKworICBpZiAoYmluZCA9PSBOVUxMKQorICAgIGJpbmQgPSBob3N0OworICBlbHNlIGlmIChzdHJjbXAgKGJpbmQsICIqIikgPT0gMCkKKyAgICBiaW5kID0gTlVMTDsKKworICBubGlzdGVuX2ZkcyA9X2RidXNfbGlzdGVuX3RjcF9zb2NrZXQgKGJpbmQsIHBvcnQsIGZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9ydF9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpc3Rlbl9mZHMsIGVycm9yKTsKKyAgaWYgKG5saXN0ZW5fZmRzIDw9IDApCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZF8xOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmhvc3Rfc3RyLCBob3N0KTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgdXNlX25vbmNlID8gIm5vbmNlLXRjcDpob3N0PSIgOiAidGNwOmhvc3Q9IikgfHwKKyAgICAgICFfZGJ1c19hZGRyZXNzX2FwcGVuZF9lc2NhcGVkICgmYWRkcmVzcywgJmhvc3Rfc3RyKSB8fAorICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCAiLHBvcnQ9IikgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhKCZwb3J0X3N0cikpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgZ290byBmYWlsZWRfMjsKKyAgICB9CisgIGlmIChmYW1pbHkgJiYKKyAgICAgICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsICIsZmFtaWx5PSIpIHx8CisgICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCBmYW1pbHkpKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gZmFpbGVkXzI7CisgICAgfQorCisgIGlmICh1c2Vfbm9uY2UpCisgICAgeworICAgICAgbm9uY2VmaWxlID0gZGJ1c19uZXcwIChEQnVzTm9uY2VGaWxlLCAxKTsKKyAgICAgIGlmIChub25jZWZpbGUgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgIGdvdG8gZmFpbGVkXzI7CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19ub25jZWZpbGVfY3JlYXRlIChub25jZWZpbGUsIGVycm9yKSkKKyAgICAgICAgICBnb3RvIGZhaWxlZF8zOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCAiLG5vbmNlZmlsZT0iKSB8fAorICAgICAgICAgICFfZGJ1c19hZGRyZXNzX2FwcGVuZF9lc2NhcGVkICgmYWRkcmVzcywgX2RidXNfbm9uY2VmaWxlX2dldF9wYXRoIChub25jZWZpbGUpKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgIGdvdG8gZmFpbGVkXzQ7CisgICAgICAgIH0KKworICAgIH0KKworICBzZXJ2ZXIgPSBfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl9zb2NrZXQgKGxpc3Rlbl9mZHMsIG5saXN0ZW5fZmRzLCAmYWRkcmVzcywgbm9uY2VmaWxlKTsKKyAgaWYgKHNlcnZlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgZ290byBmYWlsZWRfNDsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwb3J0X3N0cik7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisgIGRidXNfZnJlZShsaXN0ZW5fZmRzKTsKKworICByZXR1cm4gc2VydmVyOworCisgZmFpbGVkXzQ6CisgIF9kYnVzX25vbmNlZmlsZV9kZWxldGUgKG5vbmNlZmlsZSwgTlVMTCk7CisKKyBmYWlsZWRfMzoKKyAgZGJ1c19mcmVlIChub25jZWZpbGUpOworCisgZmFpbGVkXzI6CisgIGZvciAoaSA9IDAgOyBpIDwgbmxpc3Rlbl9mZHMgOyBpKyspCisgICAgX2RidXNfY2xvc2Vfc29ja2V0IChsaXN0ZW5fZmRzW2ldLCBOVUxMKTsKKyAgZGJ1c19mcmVlKGxpc3Rlbl9mZHMpOworCisgZmFpbGVkXzE6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcG9ydF9zdHIpOworCisgZmFpbGVkXzA6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogVHJpZXMgdG8gaW50ZXJwcmV0IHRoZSBhZGRyZXNzIGVudHJ5IGZvciB2YXJpb3VzIHNvY2tldC1yZWxhdGVkCisgKiBhZGRyZXNzZXMgKHdlbGwsIGN1cnJlbnRseSBvbmx5IHRjcCBhbmQgbm9uY2UtdGNwKS4KKyAqCisgKiBTZXRzIGVycm9yIGlmIHRoZSByZXN1bHQgaXMgbm90IE9LLgorICoKKyAqIEBwYXJhbSBlbnRyeSBhbiBhZGRyZXNzIGVudHJ5CisgKiBAcGFyYW0gc2VydmVyX3AgYSBuZXcgREJ1c1NlcnZlciwgb3IgI05VTEwgb24gZmFpbHVyZS4KKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSByYXRpb25hbGUgZm9yIGZhaWx1cmUgb24gYmFkIGFkZHJlc3MKKyAqIEByZXR1cm5zIHRoZSBvdXRjb21lCisgKgorICovCitEQnVzU2VydmVyTGlzdGVuUmVzdWx0CitfZGJ1c19zZXJ2ZXJfbGlzdGVuX3NvY2tldCAoREJ1c0FkZHJlc3NFbnRyeSAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NlcnZlciAgICAgICoqc2VydmVyX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKm1ldGhvZDsKKworICAqc2VydmVyX3AgPSBOVUxMOworCisgIG1ldGhvZCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfbWV0aG9kIChlbnRyeSk7CisKKyAgaWYgKHN0cmNtcCAobWV0aG9kLCAidGNwIikgPT0gMCB8fCBzdHJjbXAgKG1ldGhvZCwgIm5vbmNlLXRjcCIpID09IDApCisgICAgeworICAgICAgY29uc3QgY2hhciAqaG9zdDsKKyAgICAgIGNvbnN0IGNoYXIgKnBvcnQ7CisgICAgICBjb25zdCBjaGFyICpiaW5kOworICAgICAgY29uc3QgY2hhciAqZmFtaWx5OworCisgICAgICBob3N0ID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJob3N0Iik7CisgICAgICBiaW5kID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJiaW5kIik7CisgICAgICBwb3J0ID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJwb3J0Iik7CisgICAgICBmYW1pbHkgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgImZhbWlseSIpOworCisgICAgICAqc2VydmVyX3AgPSBfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl90Y3Bfc29ja2V0IChob3N0LCBiaW5kLCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5LCBlcnJvciwgc3RyY21wIChtZXRob2QsICJub25jZS10Y3AiKSA9PSAwID8gVFJVRSA6IEZBTFNFKTsKKworICAgICAgaWYgKCpzZXJ2ZXJfcCkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9PSzsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIoZXJyb3IpOworICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9OT1RfSEFORExFRDsKKyAgICB9Cit9CisKKy8qKgorICogVGhpcyBpcyBhIGJhZCBoYWNrIHNpbmNlIGl0J3MgcmVhbGx5IHVuaXggZG9tYWluIHNvY2tldAorICogc3BlY2lmaWMuIEFsc28sIHRoZSBmdW5jdGlvbiB3ZWlyZGx5IGFkb3B0cyBvd25lcnNoaXAKKyAqIG9mIHRoZSBwYXNzZWQtaW4gc3RyaW5nLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgYSBzb2NrZXQgc2VydmVyCisgKiBAcGFyYW0gZmlsZW5hbWUgc29ja2V0IGZpbGVuYW1lIHRvIHJlcG9ydC9kZWxldGUKKyAqCisgKi8KK3ZvaWQKK19kYnVzX3NlcnZlcl9zb2NrZXRfb3duX2ZpbGVuYW1lIChEQnVzU2VydmVyICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAqZmlsZW5hbWUpCit7CisgIERCdXNTZXJ2ZXJTb2NrZXQgKnNvY2tldF9zZXJ2ZXIgPSAoREJ1c1NlcnZlclNvY2tldCopIHNlcnZlcjsKKworICBzb2NrZXRfc2VydmVyLT5zb2NrZXRfbmFtZSA9IGZpbGVuYW1lOworfQorCisKKy8qKiBAfSAqLworCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1zZXJ2ZXItc29ja2V0LmggYi9kYnVzL2RidXMvZGJ1cy1zZXJ2ZXItc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FlYzcxMgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXNlcnZlci1zb2NrZXQuaApAQCAtMCwwICsxLDU0IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc2VydmVyLXNvY2tldC5oIFNlcnZlciBpbXBsZW1lbnRhdGlvbiBmb3Igc29ja2V0cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfU0VSVkVSX1NPQ0tFVF9ICisjZGVmaW5lIERCVVNfU0VSVkVSX1NPQ0tFVF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXNlcnZlci1wcm90ZWN0ZWQuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbm9uY2UuaD4KKworREJVU19CRUdJTl9ERUNMUworCitEQnVzU2VydmVyKiBfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl9zb2NrZXQgICAgICAgICAgIChpbnQgICAgICAgICAgICAgICpmZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBuX2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTm9uY2VGaWxlICAgICpub25jZWZpbGUpOworREJ1c1NlcnZlciogX2RidXNfc2VydmVyX25ld19mb3JfYXV0b2xhdW5jaCAgICAgICAoY29uc3QgREJ1c1N0cmluZyAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK0RCdXNTZXJ2ZXIqIF9kYnVzX3NlcnZlcl9uZXdfZm9yX3RjcF9zb2NrZXQgICAgICAgKGNvbnN0IGNoYXIgICAgICAgKmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpiaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICB1c2Vfbm9uY2UpOworREJ1c1NlcnZlckxpc3RlblJlc3VsdCBfZGJ1c19zZXJ2ZXJfbGlzdGVuX3NvY2tldCAoREJ1c0FkZHJlc3NFbnRyeSAgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NlcnZlciAgICAgICAqKnNlcnZlcl9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKKworCit2b2lkIF9kYnVzX3NlcnZlcl9zb2NrZXRfb3duX2ZpbGVuYW1lIChEQnVzU2VydmVyICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICpmaWxlbmFtZSk7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1NFUlZFUl9TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtc2VydmVyLXVuaXguYyBiL2RidXMvZGJ1cy9kYnVzLXNlcnZlci11bml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMwZjY2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXNlcnZlci11bml4LmMKQEAgLTAsMCArMSwzMDAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zZXJ2ZXItdW5peC5jIFNlcnZlciBpbXBsZW1lbnRhdGlvbiBmb3IgVW5peCBuZXR3b3JrIHByb3RvY29scy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1zZXJ2ZXItdW5peC5oIgorI2luY2x1ZGUgImRidXMtc2VydmVyLXNvY2tldC5oIgorI2luY2x1ZGUgImRidXMtc2VydmVyLWxhdW5jaGQuaCIKKyNpbmNsdWRlICJkYnVzLXRyYW5zcG9ydC11bml4LmgiCisjaW5jbHVkZSAiZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLXVuaXguaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzU2VydmVyVW5peCBEQnVzU2VydmVyIGltcGxlbWVudGF0aW9ucyBmb3IgVU5JWAorICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIERCdXNTZXJ2ZXIgb24gVU5JWAorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBUcmllcyB0byBpbnRlcnByZXQgdGhlIGFkZHJlc3MgZW50cnkgaW4gYSBwbGF0Zm9ybS1zcGVjaWZpYworICogd2F5LCBjcmVhdGluZyBhIHBsYXRmb3JtLXNwZWNpZmljIHNlcnZlciB0eXBlIGlmIGFwcHJvcHJpYXRlLgorICogU2V0cyBlcnJvciBpZiB0aGUgcmVzdWx0IGlzIG5vdCBPSy4KKyAqCisgKiBAcGFyYW0gZW50cnkgYW4gYWRkcmVzcyBlbnRyeQorICogQHBhcmFtIHNlcnZlcl9wIGxvY2F0aW9uIHRvIHN0b3JlIGEgbmV3IERCdXNTZXJ2ZXIsIG9yICNOVUxMIG9uIGZhaWx1cmUuCisgKiBAcGFyYW0gZXJyb3IgbG9jYXRpb24gdG8gc3RvcmUgcmF0aW9uYWxlIGZvciBmYWlsdXJlIG9uIGJhZCBhZGRyZXNzCisgKiBAcmV0dXJucyB0aGUgb3V0Y29tZQorICoKKyAqLworREJ1c1NlcnZlckxpc3RlblJlc3VsdAorX2RidXNfc2VydmVyX2xpc3Rlbl9wbGF0Zm9ybV9zcGVjaWZpYyAoREJ1c0FkZHJlc3NFbnRyeSAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU2VydmVyICAgICAgKipzZXJ2ZXJfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICptZXRob2Q7CisKKyAgKnNlcnZlcl9wID0gTlVMTDsKKworICBtZXRob2QgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X21ldGhvZCAoZW50cnkpOworCisgIGlmIChzdHJjbXAgKG1ldGhvZCwgInVuaXgiKSA9PSAwKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnBhdGggPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgInBhdGgiKTsKKyAgICAgIGNvbnN0IGNoYXIgKnRtcGRpciA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAidG1wZGlyIik7CisgICAgICBjb25zdCBjaGFyICphYnN0cmFjdCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAiYWJzdHJhY3QiKTsKKworICAgICAgaWYgKHBhdGggPT0gTlVMTCAmJiB0bXBkaXIgPT0gTlVMTCAmJiBhYnN0cmFjdCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc2V0X2JhZF9hZGRyZXNzKGVycm9yLCAidW5peCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXRoIG9yIHRtcGRpciBvciBhYnN0cmFjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fQkFEX0FERFJFU1M7CisgICAgICAgIH0KKworICAgICAgaWYgKChwYXRoICYmIHRtcGRpcikgfHwKKyAgICAgICAgICAocGF0aCAmJiBhYnN0cmFjdCkgfHwKKyAgICAgICAgICAodG1wZGlyICYmIGFic3RyYWN0KSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3NldF9iYWRfYWRkcmVzcyhlcnJvciwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBzcGVjaWZ5IHR3byBvZiBcInBhdGhcIiBhbmQgXCJ0bXBkaXJcIiBhbmQgXCJhYnN0cmFjdFwiIGF0IHRoZSBzYW1lIHRpbWUiKTsKKyAgICAgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX0JBRF9BRERSRVNTOworICAgICAgICB9CisKKyAgICAgIGlmICh0bXBkaXIgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIERCdXNTdHJpbmcgZnVsbF9wYXRoOworICAgICAgICAgIERCdXNTdHJpbmcgZmlsZW5hbWU7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZnVsbF9wYXRoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fRElEX05PVF9DT05ORUNUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZpbGVuYW1lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYnVzLSIpIHx8CisgICAgICAgICAgICAgICFfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYXNjaWkgKCZmaWxlbmFtZSwgMTApIHx8CisgICAgICAgICAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZnVsbF9wYXRoLCB0bXBkaXIpIHx8CisgICAgICAgICAgICAgICFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmZnVsbF9wYXRoLCAmZmlsZW5hbWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBBbHdheXMgdXNlIGFic3RyYWN0IG5hbWVzcGFjZSBpZiBwb3NzaWJsZSB3aXRoIHRtcGRpciAqLworCisgICAgICAgICAgKnNlcnZlcl9wID0KKyAgICAgICAgICAgIF9kYnVzX3NlcnZlcl9uZXdfZm9yX2RvbWFpbl9zb2NrZXQgKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZ1bGxfcGF0aCksCisjaWZkZWYgSEFWRV9BQlNUUkFDVF9TT0NLRVRTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmIChwYXRoKQorICAgICAgICAgICAgKnNlcnZlcl9wID0gX2RidXNfc2VydmVyX25ld19mb3JfZG9tYWluX3NvY2tldCAocGF0aCwgRkFMU0UsIGVycm9yKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAqc2VydmVyX3AgPSBfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl9kb21haW5fc29ja2V0IChhYnN0cmFjdCwgVFJVRSwgZXJyb3IpOworICAgICAgICB9CisKKyAgICAgIGlmICgqc2VydmVyX3AgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9PSzsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobWV0aG9kLCAic3lzdGVtZCIpID09IDApCisgICAgeworICAgICAgaW50IG4sICpmZHM7CisgICAgICBEQnVzU3RyaW5nIGFkZHJlc3M7CisKKyAgICAgIG4gPSBfZGJ1c19saXN0ZW5fc3lzdGVtZF9zb2NrZXRzICgmZmRzLCBlcnJvcik7CisgICAgICBpZiAobiA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgIH0KKworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZhZGRyZXNzLCAic3lzdGVtZDoiKTsKKworICAgICAgKnNlcnZlcl9wID0gX2RidXNfc2VydmVyX25ld19mb3Jfc29ja2V0IChmZHMsIG4sICZhZGRyZXNzLCBOVUxMKTsKKyAgICAgIGlmICgqc2VydmVyX3AgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGludCBpOworCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfY2xvc2Vfc29ja2V0IChmZHNbaV0sIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgIGRidXNfZnJlZSAoZmRzKTsKKworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fRElEX05PVF9DT05ORUNUOworICAgICAgICB9CisKKyAgICAgIGRidXNfZnJlZSAoZmRzKTsKKworICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9PSzsKKwl9CisjaWZkZWYgREJVU19FTkFCTEVfTEFVTkNIRAorICBlbHNlIGlmIChzdHJjbXAgKG1ldGhvZCwgImxhdW5jaGQiKSA9PSAwKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmxhdW5jaGRfZW52X3ZhciA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAiZW52Iik7CisgICAgICBpZiAobGF1bmNoZF9lbnZfdmFyID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zZXRfYmFkX2FkZHJlc3MgKGVycm9yLCAibGF1bmNoZCIsICJlbnYiLCBOVUxMKTsKKyAgICAgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICAgICAgfQorICAgICAgKnNlcnZlcl9wID0gX2RidXNfc2VydmVyX25ld19mb3JfbGF1bmNoZCAobGF1bmNoZF9lbnZfdmFyLCBlcnJvcik7CisKKyAgICAgIGlmICgqc2VydmVyX3AgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9PSzsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIElmIHdlIGRvbid0IGhhbmRsZSB0aGUgbWV0aG9kLCB3ZSByZXR1cm4gTlVMTCB3aXRoIHRoZQorICAgICAgICogZXJyb3IgdW5zZXQKKyAgICAgICAqLworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSKGVycm9yKTsKKyAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fTk9UX0hBTkRMRUQ7CisgICAgfQorfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgc2VydmVyIGxpc3RlbmluZyBvbiB0aGUgZ2l2ZW4gVW5peCBkb21haW4gc29ja2V0LgorICoKKyAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIGZvciB0aGUgZG9tYWluIHNvY2tldC4KKyAqIEBwYXJhbSBhYnN0cmFjdCAjVFJVRSB0byB1c2UgYWJzdHJhY3Qgc29ja2V0IG5hbWVzcGFjZQorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJlYXNvbiBmb3IgZmFpbHVyZS4KKyAqIEByZXR1cm5zIHRoZSBuZXcgc2VydmVyLCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICovCitEQnVzU2VydmVyKgorX2RidXNfc2VydmVyX25ld19mb3JfZG9tYWluX3NvY2tldCAoY29uc3QgY2hhciAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgYWJzdHJhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNTZXJ2ZXIgKnNlcnZlcjsKKyAgaW50IGxpc3Rlbl9mZDsKKyAgREJ1c1N0cmluZyBhZGRyZXNzOworICBjaGFyICpwYXRoX2NvcHk7CisgIERCdXNTdHJpbmcgcGF0aF9zdHI7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmFkZHJlc3MpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmcGF0aF9zdHIsIHBhdGgpOworICBpZiAoKGFic3RyYWN0ICYmCisgICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCAidW5peDphYnN0cmFjdD0iKSkgfHwKKyAgICAgICghYWJzdHJhY3QgJiYKKyAgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsICJ1bml4OnBhdGg9IikpIHx8CisgICAgICAhX2RidXNfYWRkcmVzc19hcHBlbmRfZXNjYXBlZCAoJmFkZHJlc3MsICZwYXRoX3N0cikpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBnb3RvIGZhaWxlZF8wOworICAgIH0KKworICBpZiAoYWJzdHJhY3QpCisgICAgeworICAgICAgcGF0aF9jb3B5ID0gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwYXRoX2NvcHkgPSBfZGJ1c19zdHJkdXAgKHBhdGgpOworICAgICAgaWYgKHBhdGhfY29weSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgZ290byBmYWlsZWRfMDsKKyAgICAgICAgfQorICAgIH0KKworICBsaXN0ZW5fZmQgPSBfZGJ1c19saXN0ZW5fdW5peF9zb2NrZXQgKHBhdGgsIGFic3RyYWN0LCBlcnJvcik7CisKKyAgaWYgKGxpc3Rlbl9mZCA8IDApCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWRfMTsKKyAgICB9CisKKyAgc2VydmVyID0gX2RidXNfc2VydmVyX25ld19mb3Jfc29ja2V0ICgmbGlzdGVuX2ZkLCAxLCAmYWRkcmVzcywgMCk7CisgIGlmIChzZXJ2ZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gZmFpbGVkXzI7CisgICAgfQorCisgIGlmIChwYXRoX2NvcHkgIT0gTlVMTCkKKyAgICBfZGJ1c19zZXJ2ZXJfc29ja2V0X293bl9maWxlbmFtZShzZXJ2ZXIsIHBhdGhfY29weSk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhZGRyZXNzKTsKKworICByZXR1cm4gc2VydmVyOworCisgZmFpbGVkXzI6CisgIF9kYnVzX2Nsb3NlX3NvY2tldCAobGlzdGVuX2ZkLCBOVUxMKTsKKyBmYWlsZWRfMToKKyAgZGJ1c19mcmVlIChwYXRoX2NvcHkpOworIGZhaWxlZF8wOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworCisgIHJldHVybiBOVUxMOworfQorCisvKiogQH0gKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLXNlcnZlci11bml4LmggYi9kYnVzL2RidXMvZGJ1cy1zZXJ2ZXItdW5peC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYjk5NmMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1zZXJ2ZXItdW5peC5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zZXJ2ZXItdW5peC5oIFNlcnZlciBpbXBsZW1lbnRhdGlvbiBmb3IgVW5peCBuZXR3b3JrIHByb3RvY29scy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX1NFUlZFUl9VTklYX0gKKyNkZWZpbmUgREJVU19TRVJWRVJfVU5JWF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXNlcnZlci1wcm90ZWN0ZWQuaD4KKworREJVU19CRUdJTl9ERUNMUworCitEQnVzU2VydmVyKiBfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl9kb21haW5fc29ja2V0IChjb25zdCBjaGFyICAgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgYWJzdHJhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1NFUlZFUl9VTklYX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLXNlcnZlci13aW4uYyBiL2RidXMvZGJ1cy9kYnVzLXNlcnZlci13aW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjZkYTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtc2VydmVyLXdpbi5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zZXJ2ZXItd2luLmMgU2VydmVyIGltcGxlbWVudGF0aW9uIGZvciBXSU4gbmV0d29yayBwcm90b2NvbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0ICBSZWQgSGF0IEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBSYWxmIEhhYmFja2VyIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc2VydmVyLXdpbi5oIgorI2luY2x1ZGUgImRidXMtc2VydmVyLXNvY2tldC5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzU2VydmVyV2luIERCdXNTZXJ2ZXIgaW1wbGVtZW50YXRpb25zIGZvciBXaW5kb3dzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgREJ1c1NlcnZlciBvbiBXaW5kb3dzIAorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBUcmllcyB0byBpbnRlcnByZXQgdGhlIGFkZHJlc3MgZW50cnkgaW4gYSBwbGF0Zm9ybS1zcGVjaWZpYworICogd2F5LCBjcmVhdGluZyBhIHBsYXRmb3JtLXNwZWNpZmljIHNlcnZlciB0eXBlIGlmIGFwcHJvcHJpYXRlLgorICogU2V0cyBlcnJvciBpZiB0aGUgcmVzdWx0IGlzIG5vdCBPSy4KKyAqIAorICogQHBhcmFtIGVudHJ5IGFuIGFkZHJlc3MgZW50cnkKKyAqIEBwYXJhbSBzZXJ2ZXJfcCBsb2NhdGlvbiB0byBzdG9yZSBhIG5ldyBEQnVzU2VydmVyLCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJhdGlvbmFsZSBmb3IgZmFpbHVyZSBvbiBiYWQgYWRkcmVzcworICogQHJldHVybnMgdGhlIG91dGNvbWUKKyAqIAorICovCitEQnVzU2VydmVyTGlzdGVuUmVzdWx0CitfZGJ1c19zZXJ2ZXJfbGlzdGVuX3BsYXRmb3JtX3NwZWNpZmljIChEQnVzQWRkcmVzc0VudHJ5ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTZXJ2ZXIgICAgICAqKnNlcnZlcl9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKm1ldGhvZDsKKworICAqc2VydmVyX3AgID0gTlVMTDsKKworICBtZXRob2QgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X21ldGhvZCAoZW50cnkpOworCisgIGlmIChzdHJjbXAgKG1ldGhvZCwgImF1dG9sYXVuY2giKSA9PSAwKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmhvc3QgPSAibG9jYWxob3N0IjsKKyAgICAgIGNvbnN0IGNoYXIgKmJpbmQgPSAibG9jYWxob3N0IjsKKyAgICAgIGNvbnN0IGNoYXIgKnBvcnQgPSAiMCI7CisgICAgICBjb25zdCBjaGFyICpmYW1pbHkgPSAiaXB2NCI7CisgICAgICBjb25zdCBjaGFyICpzY29wZSA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAic2NvcGUiKTsKKworICAgICAgaWYgKF9kYnVzX2RhZW1vbl9pc19zZXNzaW9uX2J1c19hZGRyZXNzX3B1Ymxpc2hlZCAoc2NvcGUpKQorICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fQUREUkVTU19BTFJFQURZX1VTRUQ7CisKKyAgICAgICpzZXJ2ZXJfcCA9IF9kYnVzX3NlcnZlcl9uZXdfZm9yX3RjcF9zb2NrZXQgKGhvc3QsIGJpbmQsIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHksIGVycm9yLCBGQUxTRSk7CisgICAgICBpZiAoKnNlcnZlcl9wKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSKGVycm9yKTsKKyAgICAgICAgICAoKnNlcnZlcl9wKS0+cHVibGlzaGVkX2FkZHJlc3MgPQorICAgICAgICAgICAgICBfZGJ1c19kYWVtb25fcHVibGlzaF9zZXNzaW9uX2J1c19hZGRyZXNzICgoKnNlcnZlcl9wKS0+YWRkcmVzcywgc2NvcGUpOworICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fT0s7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8vIG1ha2Ugc3VyZSBubyBoYW5kbGUgaXMgb3BlbgorICAgICAgICAgIF9kYnVzX2RhZW1vbl91bnB1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcyAoKTsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIoZXJyb3IpOworICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fTk9UX0hBTkRMRUQ7CisgICAgfQorfQorCisvKiogQH0gKi8KKwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtc2VydmVyLXdpbi5oIGIvZGJ1cy9kYnVzL2RidXMtc2VydmVyLXdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YzI3NTYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1zZXJ2ZXItd2luLmgKQEAgLTAsMCArMSwzNiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNlcnZlci13aW4uaCBTZXJ2ZXIgaW1wbGVtZW50YXRpb24gZm9yIHdpbmRvd3MgbmV0d29yayBwcm90b2NvbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0IEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNyAgUmFsZiBIYWJhY2tlciA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX1NFUlZFUl9XSU5fSAorI2RlZmluZSBEQlVTX1NFUlZFUl9XSU5fSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zZXJ2ZXItcHJvdGVjdGVkLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyogYWRkIGRlZmluaXRpb25zIGhlcmUgKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfU0VSVkVSX1dJTl9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1zZXJ2ZXIuYyBiL2RidXMvZGJ1cy9kYnVzLXNlcnZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MmMyYjQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1zZXJ2ZXIuYwpAQCAtMCwwICsxLDEyNDkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zZXJ2ZXIuYyBEQnVzU2VydmVyIG9iamVjdAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8gCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXNlcnZlci5oIgorI2luY2x1ZGUgImRidXMtc2VydmVyLXVuaXguaCIKKyNpbmNsdWRlICJkYnVzLXNlcnZlci1zb2NrZXQuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyNpbmNsdWRlICJkYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmgiCisjZW5kaWYKKyNpbmNsdWRlICJkYnVzLWFkZHJlc3MuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNTZXJ2ZXIgREJ1c1NlcnZlcgorICogQGluZ3JvdXAgIERCdXMKKyAqIEBicmllZiBTZXJ2ZXIgdGhhdCBsaXN0ZW5zIGZvciBuZXcgY29ubmVjdGlvbnMuCisgKgorICogQSBEQnVzU2VydmVyIHJlcHJlc2VudHMgYSBzZXJ2ZXIgdGhhdCBvdGhlciBhcHBsaWNhdGlvbnMKKyAqIGNhbiBjb25uZWN0IHRvLiBFYWNoIGNvbm5lY3Rpb24gZnJvbSBhbm90aGVyIGFwcGxpY2F0aW9uCisgKiBpcyByZXByZXNlbnRlZCBieSBhICNEQnVzQ29ubmVjdGlvbi4KKyAqCisgKiBAdG9kbyBUaHJlYWQgc2FmZXR5IGhhc24ndCBiZWVuIHRlc3RlZCBtdWNoIGZvciAjREJ1c1NlcnZlcgorICogQHRvZG8gTmVlZCBub3RpZmljYXRpb24gdG8gYXBwcyBvZiBkaXNjb25uZWN0aW9uLCBtYXkgbWF0dGVyIGZvciBzb21lIHRyYW5zcG9ydHMKKyAqLworCisvKioKKyAqIEBkZWZncm91cCBEQnVzU2VydmVySW50ZXJuYWxzIERCdXNTZXJ2ZXIgaW1wbGVtZW50YXRpb24gZGV0YWlscworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIERCdXNTZXJ2ZXIKKyAqCisgKiBAeworICovCisKKyNpZm5kZWYgX2RidXNfc2VydmVyX3RyYWNlX3JlZgordm9pZAorX2RidXNfc2VydmVyX3RyYWNlX3JlZiAoREJ1c1NlcnZlciAqc2VydmVyLAorICAgIGludCBvbGRfcmVmY291bnQsCisgICAgaW50IG5ld19yZWZjb3VudCwKKyAgICBjb25zdCBjaGFyICp3aHkpCit7CisgIHN0YXRpYyBpbnQgZW5hYmxlZCA9IC0xOworCisgIF9kYnVzX3RyYWNlX3JlZiAoIkRCdXNTZXJ2ZXIiLCBzZXJ2ZXIsIG9sZF9yZWZjb3VudCwgbmV3X3JlZmNvdW50LCB3aHksCisgICAgICAiREJVU19TRVJWRVJfVFJBQ0UiLCAmZW5hYmxlZCk7Cit9CisjZW5kaWYKKworLyogdGhpcyBpcyBhIGxpdHRsZSBmcmFnaWxlIHNpbmNlIGl0IGFzc3VtZXMgdGhlIGFkZHJlc3MgZG9lc24ndAorICogYWxyZWFkeSBoYXZlIGEgZ3VpZCwgYnV0IGl0IHNob3VsZG4ndAorICovCitzdGF0aWMgY2hhcioKK2NvcHlfYWRkcmVzc193aXRoX2d1aWRfYXBwZW5kZWQgKGNvbnN0IERCdXNTdHJpbmcgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpndWlkX2hleCkKK3sKKyAgREJ1c1N0cmluZyB3aXRoX2d1aWQ7CisgIGNoYXIgKnJldHZhbDsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ3aXRoX2d1aWQpKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKGFkZHJlc3MsIDAsICZ3aXRoX2d1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmd2l0aF9ndWlkKSkgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmd2l0aF9ndWlkLCAiLGd1aWQ9IikgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfY29weSAoZ3VpZF9oZXgsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aXRoX2d1aWQsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmd2l0aF9ndWlkKSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ3aXRoX2d1aWQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJldHZhbCA9IE5VTEw7CisgIF9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgmd2l0aF9ndWlkLCAmcmV0dmFsKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJndpdGhfZ3VpZCk7CisgICAgICAKKyAgcmV0dXJuIHJldHZhbDsgLyogbWF5IGJlIE5VTEwgaWYgc3RlYWxfZGF0YSBmYWlsZWQgKi8KK30KKworLyoqCisgKiBJbml0aWFsaXplcyB0aGUgbWVtYmVycyBvZiB0aGUgREJ1c1NlcnZlciBiYXNlIGNsYXNzLgorICogQ2hhaW5lZCB1cCB0byBieSBzdWJjbGFzcyBjb25zdHJ1Y3RvcnMuCisgKgorICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyLgorICogQHBhcmFtIHZ0YWJsZSB0aGUgdnRhYmxlIGZvciB0aGUgc3ViY2xhc3MuCisgKiBAcGFyYW0gYWRkcmVzcyB0aGUgc2VydmVyJ3MgYWRkcmVzcworICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3NlcnZlcl9pbml0X2Jhc2UgKERCdXNTZXJ2ZXIgICAgICAgICAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTZXJ2ZXJWVGFibGUgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAgKmFkZHJlc3MpCit7CisgIHNlcnZlci0+dnRhYmxlID0gdnRhYmxlOworCisjaWZkZWYgREJVU19ESVNBQkxFX0FTU0VSVAorICBfZGJ1c19hdG9taWNfaW5jICgmc2VydmVyLT5yZWZjb3VudCk7CisjZWxzZQorICAgIHsKKyAgICAgIGRidXNfaW50MzJfdCBvbGRfcmVmY291bnQgPSBfZGJ1c19hdG9taWNfaW5jICgmc2VydmVyLT5yZWZjb3VudCk7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAob2xkX3JlZmNvdW50ID09IDApOworICAgIH0KKyNlbmRpZgorCisgIHNlcnZlci0+YWRkcmVzcyA9IE5VTEw7CisgIHNlcnZlci0+d2F0Y2hlcyA9IE5VTEw7CisgIHNlcnZlci0+dGltZW91dHMgPSBOVUxMOworICBzZXJ2ZXItPnB1Ymxpc2hlZF9hZGRyZXNzID0gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnNlcnZlci0+Z3VpZF9oZXgpKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19nZW5lcmF0ZV91dWlkICgmc2VydmVyLT5ndWlkKTsKKworICBpZiAoIV9kYnVzX3V1aWRfZW5jb2RlICgmc2VydmVyLT5ndWlkLCAmc2VydmVyLT5ndWlkX2hleCkpCisgICAgZ290byBmYWlsZWQ7CisgIAorICBzZXJ2ZXItPmFkZHJlc3MgPSBjb3B5X2FkZHJlc3Nfd2l0aF9ndWlkX2FwcGVuZGVkIChhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmVyLT5ndWlkX2hleCk7CisgIGlmIChzZXJ2ZXItPmFkZHJlc3MgPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZDsKKyAgCisgIF9kYnVzX3JtdXRleF9uZXdfYXRfbG9jYXRpb24gKCZzZXJ2ZXItPm11dGV4KTsKKyAgaWYgKHNlcnZlci0+bXV0ZXggPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZDsKKyAgCisgIHNlcnZlci0+d2F0Y2hlcyA9IF9kYnVzX3dhdGNoX2xpc3RfbmV3ICgpOworICBpZiAoc2VydmVyLT53YXRjaGVzID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisKKyAgc2VydmVyLT50aW1lb3V0cyA9IF9kYnVzX3RpbWVvdXRfbGlzdF9uZXcgKCk7CisgIGlmIChzZXJ2ZXItPnRpbWVvdXRzID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisKKyAgX2RidXNfZGF0YV9zbG90X2xpc3RfaW5pdCAoJnNlcnZlci0+c2xvdF9saXN0KTsKKworICBfZGJ1c192ZXJib3NlICgiSW5pdGlhbGl6ZWQgc2VydmVyIG9uIGFkZHJlc3MgJXNcbiIsIHNlcnZlci0+YWRkcmVzcyk7CisgIAorICByZXR1cm4gVFJVRTsKKworIGZhaWxlZDoKKyAgX2RidXNfcm11dGV4X2ZyZWVfYXRfbG9jYXRpb24gKCZzZXJ2ZXItPm11dGV4KTsKKyAgc2VydmVyLT5tdXRleCA9IE5VTEw7CisgIGlmIChzZXJ2ZXItPndhdGNoZXMpCisgICAgeworICAgICAgX2RidXNfd2F0Y2hfbGlzdF9mcmVlIChzZXJ2ZXItPndhdGNoZXMpOworICAgICAgc2VydmVyLT53YXRjaGVzID0gTlVMTDsKKyAgICB9CisgIGlmIChzZXJ2ZXItPnRpbWVvdXRzKQorICAgIHsKKyAgICAgIF9kYnVzX3RpbWVvdXRfbGlzdF9mcmVlIChzZXJ2ZXItPnRpbWVvdXRzKTsKKyAgICAgIHNlcnZlci0+dGltZW91dHMgPSBOVUxMOworICAgIH0KKyAgaWYgKHNlcnZlci0+YWRkcmVzcykKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHNlcnZlci0+YWRkcmVzcyk7CisgICAgICBzZXJ2ZXItPmFkZHJlc3MgPSBOVUxMOworICAgIH0KKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzZXJ2ZXItPmd1aWRfaGV4KTsKKyAgCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBGaW5hbGl6ZXMgdGhlIG1lbWJlcnMgb2YgdGhlIERCdXNTZXJ2ZXIgYmFzZSBjbGFzcy4KKyAqIENoYWluZWQgdXAgdG8gYnkgc3ViY2xhc3MgZmluYWxpemVycy4KKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIuCisgKi8KK3ZvaWQKK19kYnVzX3NlcnZlcl9maW5hbGl6ZV9iYXNlIChEQnVzU2VydmVyICpzZXJ2ZXIpCit7CisgIC8qIFdlIGRvbid0IGhhdmUgdGhlIGxvY2ssIGJ1dCBub2JvZHkgc2hvdWxkIGJlIGFjY2Vzc2luZworICAgKiBjb25jdXJyZW50bHkgc2luY2UgdGhleSBkb24ndCBoYXZlIGEgcmVmCisgICAqLworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIF9kYnVzX2Fzc2VydCAoIXNlcnZlci0+aGF2ZV9zZXJ2ZXJfbG9jayk7CisjZW5kaWYKKyAgX2RidXNfYXNzZXJ0IChzZXJ2ZXItPmRpc2Nvbm5lY3RlZCk7CisgIAorICAvKiBjYWxscyBvdXQgdG8gYXBwbGljYXRpb24gY29kZS4uLiAqLworICBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9mcmVlICgmc2VydmVyLT5zbG90X2xpc3QpOworCisgIGRidXNfc2VydmVyX3NldF9uZXdfY29ubmVjdGlvbl9mdW5jdGlvbiAoc2VydmVyLCBOVUxMLCBOVUxMLCBOVUxMKTsKKworICBfZGJ1c193YXRjaF9saXN0X2ZyZWUgKHNlcnZlci0+d2F0Y2hlcyk7CisgIF9kYnVzX3RpbWVvdXRfbGlzdF9mcmVlIChzZXJ2ZXItPnRpbWVvdXRzKTsKKworICBfZGJ1c19ybXV0ZXhfZnJlZV9hdF9sb2NhdGlvbiAoJnNlcnZlci0+bXV0ZXgpOworICAKKyAgZGJ1c19mcmVlIChzZXJ2ZXItPmFkZHJlc3MpOworCisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKHNlcnZlci0+YXV0aF9tZWNoYW5pc21zKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNlcnZlci0+Z3VpZF9oZXgpOworfQorCisKKy8qKiBGdW5jdGlvbiB0byBiZSBjYWxsZWQgaW4gcHJvdGVjdGVkX2NoYW5nZV93YXRjaCgpIHdpdGggcmVmY291bnQgaGVsZCAqLwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzV2F0Y2hBZGRGdW5jdGlvbikgICAgIChEQnVzV2F0Y2hMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICp3YXRjaCk7CisvKiogRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGluIHByb3RlY3RlZF9jaGFuZ2Vfd2F0Y2goKSB3aXRoIHJlZmNvdW50IGhlbGQgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c1dhdGNoUmVtb3ZlRnVuY3Rpb24pICAoREJ1c1dhdGNoTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAqd2F0Y2gpOworLyoqIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBpbiBwcm90ZWN0ZWRfY2hhbmdlX3dhdGNoKCkgd2l0aCByZWZjb3VudCBoZWxkICovCit0eXBlZGVmIHZvaWQgICAgICAgICgqIERCdXNXYXRjaFRvZ2dsZUZ1bmN0aW9uKSAgKERCdXNXYXRjaExpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICBlbmFibGVkKTsKKworc3RhdGljIGRidXNfYm9vbF90Citwcm90ZWN0ZWRfY2hhbmdlX3dhdGNoIChEQnVzU2VydmVyICAgICAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaEFkZEZ1bmN0aW9uICAgIGFkZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaFJlbW92ZUZ1bmN0aW9uIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaFRvZ2dsZUZ1bmN0aW9uIHRvZ2dsZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgIGVuYWJsZWQpCit7CisgIERCdXNXYXRjaExpc3QgKndhdGNoZXM7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgCisgIEhBVkVfTE9DS19DSEVDSyAoc2VydmVyKTsKKworICAvKiBUaGlzIGlzbid0IHJlYWxseSBzYWZlIG9yIHJlYXNvbmFibGU7IGEgYmV0dGVyIHBhdHRlcm4gaXMgdGhlICJkbworICAgKiBldmVyeXRoaW5nLCB0aGVuIGRyb3AgbG9jayBhbmQgY2FsbCBvdXQiIG9uZTsgYnV0IGl0IGhhcyB0byBiZQorICAgKiBwcm9wYWdhdGVkIHVwIHRocm91Z2ggYWxsIGNhbGxlcnMKKyAgICovCisgIAorICB3YXRjaGVzID0gc2VydmVyLT53YXRjaGVzOworICBpZiAod2F0Y2hlcykKKyAgICB7CisgICAgICBzZXJ2ZXItPndhdGNoZXMgPSBOVUxMOworICAgICAgX2RidXNfc2VydmVyX3JlZl91bmxvY2tlZCAoc2VydmVyKTsKKyAgICAgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisKKyAgICAgIGlmIChhZGRfZnVuY3Rpb24pCisgICAgICAgIHJldHZhbCA9ICgqIGFkZF9mdW5jdGlvbikgKHdhdGNoZXMsIHdhdGNoKTsKKyAgICAgIGVsc2UgaWYgKHJlbW92ZV9mdW5jdGlvbikKKyAgICAgICAgeworICAgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICAgICAgKCogcmVtb3ZlX2Z1bmN0aW9uKSAod2F0Y2hlcywgd2F0Y2gpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgICAgICgqIHRvZ2dsZV9mdW5jdGlvbikgKHdhdGNoZXMsIHdhdGNoLCBlbmFibGVkKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBTRVJWRVJfTE9DSyAoc2VydmVyKTsKKyAgICAgIHNlcnZlci0+d2F0Y2hlcyA9IHdhdGNoZXM7CisgICAgICBfZGJ1c19zZXJ2ZXJfdW5yZWZfdW5sb2NrZWQgKHNlcnZlcik7CisKKyAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEFkZHMgYSB3YXRjaCBmb3IgdGhpcyBzZXJ2ZXIsIGNoYWluaW5nIG91dCB0byBhcHBsaWNhdGlvbi1wcm92aWRlZAorICogd2F0Y2ggaGFuZGxlcnMuCisgKgorICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyLgorICogQHBhcmFtIHdhdGNoIHRoZSB3YXRjaCB0byBhZGQuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zZXJ2ZXJfYWRkX3dhdGNoIChEQnVzU2VydmVyICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICp3YXRjaCkKK3sKKyAgSEFWRV9MT0NLX0NIRUNLIChzZXJ2ZXIpOworICByZXR1cm4gcHJvdGVjdGVkX2NoYW5nZV93YXRjaCAoc2VydmVyLCB3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3dhdGNoX2xpc3RfYWRkX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgRkFMU0UpOworfQorCisvKioKKyAqIFJlbW92ZXMgYSB3YXRjaCBwcmV2aW91c2x5IGFkZGVkIHdpdGggX2RidXNfc2VydmVyX3JlbW92ZV93YXRjaCgpLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlci4KKyAqIEBwYXJhbSB3YXRjaCB0aGUgd2F0Y2ggdG8gcmVtb3ZlLgorICovCit2b2lkCitfZGJ1c19zZXJ2ZXJfcmVtb3ZlX3dhdGNoICAoREJ1c1NlcnZlciAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgKndhdGNoKQoreworICBIQVZFX0xPQ0tfQ0hFQ0sgKHNlcnZlcik7CisgIHByb3RlY3RlZF9jaGFuZ2Vfd2F0Y2ggKHNlcnZlciwgd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3dhdGNoX2xpc3RfcmVtb3ZlX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBGQUxTRSk7Cit9CisKKy8qKgorICogVG9nZ2xlcyBhIHdhdGNoIGFuZCBub3RpZmllcyBhcHAgdmlhIHNlcnZlcidzCisgKiBEQnVzV2F0Y2hUb2dnbGVkRnVuY3Rpb24gaWYgYXZhaWxhYmxlLiBJdCdzIGFuIGVycm9yIHRvIGNhbGwgdGhpcworICogZnVuY3Rpb24gb24gYSB3YXRjaCB0aGF0IHdhcyBub3QgcHJldmlvdXNseSBhZGRlZC4KKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIuCisgKiBAcGFyYW0gd2F0Y2ggdGhlIHdhdGNoIHRvIHRvZ2dsZS4KKyAqIEBwYXJhbSBlbmFibGVkIHdoZXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUKKyAqLwordm9pZAorX2RidXNfc2VydmVyX3RvZ2dsZV93YXRjaCAoREJ1c1NlcnZlciAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICBlbmFibGVkKQoreworICBfZGJ1c19hc3NlcnQgKHdhdGNoICE9IE5VTEwpOworCisgIEhBVkVfTE9DS19DSEVDSyAoc2VydmVyKTsKKyAgcHJvdGVjdGVkX2NoYW5nZV93YXRjaCAoc2VydmVyLCB3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfd2F0Y2hfbGlzdF90b2dnbGVfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQpOworfQorCisvKiogRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGluIHByb3RlY3RlZF9jaGFuZ2VfdGltZW91dCgpIHdpdGggcmVmY291bnQgaGVsZCAqLwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzVGltZW91dEFkZEZ1bmN0aW9uKSAgICAoREJ1c1RpbWVvdXRMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgICp0aW1lb3V0KTsKKy8qKiBGdW5jdGlvbiB0byBiZSBjYWxsZWQgaW4gcHJvdGVjdGVkX2NoYW5nZV90aW1lb3V0KCkgd2l0aCByZWZjb3VudCBoZWxkICovCit0eXBlZGVmIHZvaWQgICAgICAgICgqIERCdXNUaW1lb3V0UmVtb3ZlRnVuY3Rpb24pIChEQnVzVGltZW91dExpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dCAgICAgKnRpbWVvdXQpOworLyoqIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBpbiBwcm90ZWN0ZWRfY2hhbmdlX3RpbWVvdXQoKSB3aXRoIHJlZmNvdW50IGhlbGQgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c1RpbWVvdXRUb2dnbGVGdW5jdGlvbikgKERCdXNUaW1lb3V0TGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgZW5hYmxlZCk7CisKKworc3RhdGljIGRidXNfYm9vbF90Citwcm90ZWN0ZWRfY2hhbmdlX3RpbWVvdXQgKERCdXNTZXJ2ZXIgICAgICAgICAgICAgICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dCAgICAgICAgICAgICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0QWRkRnVuY3Rpb24gICAgYWRkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dFJlbW92ZUZ1bmN0aW9uIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXRUb2dnbGVGdW5jdGlvbiB0b2dnbGVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgICAgZW5hYmxlZCkKK3sKKyAgREJ1c1RpbWVvdXRMaXN0ICp0aW1lb3V0czsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICAKKyAgSEFWRV9MT0NLX0NIRUNLIChzZXJ2ZXIpOworCisgIC8qIFRoaXMgaXNuJ3QgcmVhbGx5IHNhZmUgb3IgcmVhc29uYWJsZTsgYSBiZXR0ZXIgcGF0dGVybiBpcyB0aGUgImRvIGV2ZXJ5dGhpbmcsIHRoZW4KKyAgICogZHJvcCBsb2NrIGFuZCBjYWxsIG91dCIgb25lOyBidXQgaXQgaGFzIHRvIGJlIHByb3BhZ2F0ZWQgdXAgdGhyb3VnaCBhbGwgY2FsbGVycworICAgKi8KKyAgCisgIHRpbWVvdXRzID0gc2VydmVyLT50aW1lb3V0czsKKyAgaWYgKHRpbWVvdXRzKQorICAgIHsKKyAgICAgIHNlcnZlci0+dGltZW91dHMgPSBOVUxMOworICAgICAgX2RidXNfc2VydmVyX3JlZl91bmxvY2tlZCAoc2VydmVyKTsKKyAgICAgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisKKyAgICAgIGlmIChhZGRfZnVuY3Rpb24pCisgICAgICAgIHJldHZhbCA9ICgqIGFkZF9mdW5jdGlvbikgKHRpbWVvdXRzLCB0aW1lb3V0KTsKKyAgICAgIGVsc2UgaWYgKHJlbW92ZV9mdW5jdGlvbikKKyAgICAgICAgeworICAgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICAgICAgKCogcmVtb3ZlX2Z1bmN0aW9uKSAodGltZW91dHMsIHRpbWVvdXQpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgICAgICgqIHRvZ2dsZV9mdW5jdGlvbikgKHRpbWVvdXRzLCB0aW1lb3V0LCBlbmFibGVkKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBTRVJWRVJfTE9DSyAoc2VydmVyKTsKKyAgICAgIHNlcnZlci0+dGltZW91dHMgPSB0aW1lb3V0czsKKyAgICAgIF9kYnVzX3NlcnZlcl91bnJlZl91bmxvY2tlZCAoc2VydmVyKTsKKworICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogQWRkcyBhIHRpbWVvdXQgZm9yIHRoaXMgc2VydmVyLCBjaGFpbmluZyBvdXQgdG8KKyAqIGFwcGxpY2F0aW9uLXByb3ZpZGVkIHRpbWVvdXQgaGFuZGxlcnMuIFRoZSB0aW1lb3V0IHNob3VsZCBiZQorICogcmVwZWF0ZWRseSBoYW5kbGVkIHdpdGggZGJ1c190aW1lb3V0X2hhbmRsZSgpIGF0IGl0cyBnaXZlbiBpbnRlcnZhbAorICogdW50aWwgaXQgaXMgcmVtb3ZlZC4KKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIuCisgKiBAcGFyYW0gdGltZW91dCB0aGUgdGltZW91dCB0byBhZGQuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zZXJ2ZXJfYWRkX3RpbWVvdXQgKERCdXNTZXJ2ZXIgICpzZXJ2ZXIsCisJCQkgIERCdXNUaW1lb3V0ICp0aW1lb3V0KQoreworICByZXR1cm4gcHJvdGVjdGVkX2NoYW5nZV90aW1lb3V0IChzZXJ2ZXIsIHRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3RpbWVvdXRfbGlzdF9hZGRfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgRkFMU0UpOworfQorCisvKioKKyAqIFJlbW92ZXMgYSB0aW1lb3V0IHByZXZpb3VzbHkgYWRkZWQgd2l0aCBfZGJ1c19zZXJ2ZXJfYWRkX3RpbWVvdXQoKS4KKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIuCisgKiBAcGFyYW0gdGltZW91dCB0aGUgdGltZW91dCB0byByZW1vdmUuCisgKi8KK3ZvaWQKK19kYnVzX3NlcnZlcl9yZW1vdmVfdGltZW91dCAoREJ1c1NlcnZlciAgKnNlcnZlciwKKwkJCSAgICAgREJ1c1RpbWVvdXQgKnRpbWVvdXQpCit7CisgIHByb3RlY3RlZF9jaGFuZ2VfdGltZW91dCAoc2VydmVyLCB0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdGltZW91dF9saXN0X3JlbW92ZV90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIEZBTFNFKTsKK30KKworLyoqCisgKiBUb2dnbGVzIGEgdGltZW91dCBhbmQgbm90aWZpZXMgYXBwIHZpYSBzZXJ2ZXIncworICogREJ1c1RpbWVvdXRUb2dnbGVkRnVuY3Rpb24gaWYgYXZhaWxhYmxlLiBJdCdzIGFuIGVycm9yIHRvIGNhbGwgdGhpcworICogZnVuY3Rpb24gb24gYSB0aW1lb3V0IHRoYXQgd2FzIG5vdCBwcmV2aW91c2x5IGFkZGVkLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlci4KKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0IHRvIHRvZ2dsZS4KKyAqIEBwYXJhbSBlbmFibGVkIHdoZXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUKKyAqLwordm9pZAorX2RidXNfc2VydmVyX3RvZ2dsZV90aW1lb3V0IChEQnVzU2VydmVyICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dCAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgIGVuYWJsZWQpCit7CisgIHByb3RlY3RlZF9jaGFuZ2VfdGltZW91dCAoc2VydmVyLCB0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdGltZW91dF9saXN0X3RvZ2dsZV90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQpOworfQorCisKKy8qKgorICogTGlrZSBkYnVzX3NlcnZlcl9yZWYoKSBidXQgZG9lcyBub3QgYWNxdWlyZSB0aGUgbG9jayAobXVzdCBhbHJlYWR5IGJlIGhlbGQpCisgKgorICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyLgorICovCit2b2lkCitfZGJ1c19zZXJ2ZXJfcmVmX3VubG9ja2VkIChEQnVzU2VydmVyICpzZXJ2ZXIpCit7CisgIGRidXNfaW50MzJfdCBvbGRfcmVmY291bnQ7CisKKyAgX2RidXNfYXNzZXJ0IChzZXJ2ZXIgIT0gTlVMTCk7CisgIEhBVkVfTE9DS19DSEVDSyAoc2VydmVyKTsKKworICBvbGRfcmVmY291bnQgPSBfZGJ1c19hdG9taWNfaW5jICgmc2VydmVyLT5yZWZjb3VudCk7CisgIF9kYnVzX2Fzc2VydCAob2xkX3JlZmNvdW50ID4gMCk7CisgIF9kYnVzX3NlcnZlcl90cmFjZV9yZWYgKHNlcnZlciwgb2xkX3JlZmNvdW50LCBvbGRfcmVmY291bnQgKyAxLAorICAgICAgInJlZl91bmxvY2tlZCIpOworfQorCisvKioKKyAqIExpa2UgZGJ1c19zZXJ2ZXJfdW5yZWYoKSBidXQgZG9lcyBub3QgYWNxdWlyZSB0aGUgbG9jayAobXVzdCBhbHJlYWR5IGJlIGhlbGQpCisgKgorICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyLgorICovCit2b2lkCitfZGJ1c19zZXJ2ZXJfdW5yZWZfdW5sb2NrZWQgKERCdXNTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgZGJ1c19pbnQzMl90IG9sZF9yZWZjb3VudDsKKworICAvKiBLZWVwIHRoaXMgaW4gc3luYyB3aXRoIGRidXNfc2VydmVyX3VucmVmICovCisKKyAgX2RidXNfYXNzZXJ0IChzZXJ2ZXIgIT0gTlVMTCk7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChzZXJ2ZXIpOworCisgIG9sZF9yZWZjb3VudCA9IF9kYnVzX2F0b21pY19kZWMgKCZzZXJ2ZXItPnJlZmNvdW50KTsKKyAgX2RidXNfYXNzZXJ0IChvbGRfcmVmY291bnQgPiAwKTsKKworICBfZGJ1c19zZXJ2ZXJfdHJhY2VfcmVmIChzZXJ2ZXIsIG9sZF9yZWZjb3VudCwgb2xkX3JlZmNvdW50IC0gMSwKKyAgICAgICJ1bnJlZl91bmxvY2tlZCIpOworCisgIGlmIChvbGRfcmVmY291bnQgPT0gMSkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHNlcnZlci0+ZGlzY29ubmVjdGVkKTsKKyAgICAgIAorICAgICAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChzZXJ2ZXItPnZ0YWJsZS0+ZmluYWxpemUgIT0gTlVMTCk7CisgICAgICAKKyAgICAgICgqIHNlcnZlci0+dnRhYmxlLT5maW5hbGl6ZSkgKHNlcnZlcik7CisgICAgfQorfQorCisvKiogQH0gKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzU2VydmVyCisgKgorICogQHsKKyAqLworCisKKy8qKgorICogQHR5cGVkZWYgREJ1c1NlcnZlcgorICoKKyAqIEFuIG9wYXF1ZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgc2VydmVyIHRoYXQgbGlzdGVucyBmb3IKKyAqIGNvbm5lY3Rpb25zIGZyb20gb3RoZXIgYXBwbGljYXRpb25zLiBFYWNoIHRpbWUgYSBjb25uZWN0aW9uCisgKiBpcyBtYWRlLCBhIG5ldyBEQnVzQ29ubmVjdGlvbiBpcyBjcmVhdGVkIGFuZCBtYWRlIGF2YWlsYWJsZQorICogdmlhIGFuIGFwcGxpY2F0aW9uLXByb3ZpZGVkIERCdXNOZXdDb25uZWN0aW9uRnVuY3Rpb24uCisgKiBUaGUgREJ1c05ld0Nvbm5lY3Rpb25GdW5jdGlvbiBpcyBwcm92aWRlZCB3aXRoCisgKiBkYnVzX3NlcnZlcl9zZXRfbmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb24oKS4KKyAqIAorICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICBEQnVzU2VydmVyTGlzdGVuUmVzdWx0ICgqIGZ1bmMpIChEQnVzQWRkcmVzc0VudHJ5ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NlcnZlciAgICAgICoqc2VydmVyX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK30gbGlzdGVuX2Z1bmNzW10gPSB7CisgIHsgX2RidXNfc2VydmVyX2xpc3Rlbl9zb2NrZXQgfQorICAsIHsgX2RidXNfc2VydmVyX2xpc3Rlbl9wbGF0Zm9ybV9zcGVjaWZpYyB9CisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICAsIHsgX2RidXNfc2VydmVyX2xpc3Rlbl9kZWJ1Z19waXBlIH0KKyNlbmRpZgorfTsKKworLyoqCisgKiBMaXN0ZW5zIGZvciBuZXcgY29ubmVjdGlvbnMgb24gdGhlIGdpdmVuIGFkZHJlc3MuICBJZiB0aGVyZSBhcmUKKyAqIG11bHRpcGxlIHNlbWljb2xvbi1zZXBhcmF0ZWQgYWRkcmVzcyBlbnRyaWVzIGluIHRoZSBhZGRyZXNzLCB0cmllcworICogZWFjaCBvbmUgYW5kIGxpc3RlbnMgb24gdGhlIGZpcnN0IG9uZSB0aGF0IHdvcmtzLgorICogCisgKiBSZXR1cm5zICNOVUxMIGFuZCBzZXRzIGVycm9yIGlmIGxpc3RlbmluZyBmYWlscyBmb3IgYW55IHJlYXNvbi4KKyAqIE90aGVyd2lzZSByZXR1cm5zIGEgbmV3ICNEQnVzU2VydmVyLgorICogZGJ1c19zZXJ2ZXJfc2V0X25ld19jb25uZWN0aW9uX2Z1bmN0aW9uKCksCisgKiBkYnVzX3NlcnZlcl9zZXRfd2F0Y2hfZnVuY3Rpb25zKCksIGFuZAorICogZGJ1c19zZXJ2ZXJfc2V0X3RpbWVvdXRfZnVuY3Rpb25zKCkgc2hvdWxkIGJlIGNhbGxlZCBpbW1lZGlhdGVseSB0bworICogcmVuZGVyIHRoZSBzZXJ2ZXIgZnVsbHkgZnVuY3Rpb25hbC4KKyAqCisgKiBUbyBmcmVlIHRoZSBzZXJ2ZXIsIGFwcGxpY2F0aW9ucyBtdXN0IGNhbGwgZmlyc3QKKyAqIGRidXNfc2VydmVyX2Rpc2Nvbm5lY3QoKSBhbmQgdGhlbiBkYnVzX3NlcnZlcl91bnJlZigpLgorICogCisgKiBAcGFyYW0gYWRkcmVzcyB0aGUgYWRkcmVzcyBvZiB0aGlzIHNlcnZlci4KKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSByZWFzb24gZm9yIGZhaWx1cmUuCisgKiBAcmV0dXJucyBhIG5ldyAjREJ1c1NlcnZlciwgb3IgI05VTEwgb24gZmFpbHVyZS4KKyAqIAorICovCitEQnVzU2VydmVyKgorZGJ1c19zZXJ2ZXJfbGlzdGVuIChjb25zdCBjaGFyICAgICAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzU2VydmVyICpzZXJ2ZXI7CisgIERCdXNBZGRyZXNzRW50cnkgKiplbnRyaWVzOworICBpbnQgbGVuLCBpOworICBEQnVzRXJyb3IgZmlyc3RfY29ubmVjdF9lcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgZGJ1c19ib29sX3QgaGFuZGxlZF9vbmNlOworICAKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChhZGRyZXNzICE9IE5VTEwsIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2Vycm9yX2lzX3NldCAoZXJyb3IsIE5VTEwpOworICAKKyAgaWYgKCFkYnVzX3BhcnNlX2FkZHJlc3MgKGFkZHJlc3MsICZlbnRyaWVzLCAmbGVuLCBlcnJvcikpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgc2VydmVyID0gTlVMTDsKKyAgaGFuZGxlZF9vbmNlID0gRkFMU0U7CisKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgIHsKKyAgICAgIGludCBqOworCisgICAgICBmb3IgKGogPSAwOyBqIDwgKGludCkgX0RCVVNfTl9FTEVNRU5UUyAobGlzdGVuX2Z1bmNzKTsgKytqKQorICAgICAgICB7CisgICAgICAgICAgREJ1c1NlcnZlckxpc3RlblJlc3VsdCByZXN1bHQ7CisgICAgICAgICAgREJ1c0Vycm9yIHRtcF9lcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKworICAgICAgICAgIHJlc3VsdCA9ICgqIGxpc3Rlbl9mdW5jc1tqXS5mdW5jKSAoZW50cmllc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wX2Vycm9yKTsKKworICAgICAgICAgIGlmIChyZXN1bHQgPT0gREJVU19TRVJWRVJfTElTVEVOX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKHNlcnZlciAhPSBOVUxMKTsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSICgmdG1wX2Vycm9yKTsKKyAgICAgICAgICAgICAgaGFuZGxlZF9vbmNlID0gVFJVRTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAocmVzdWx0ID09IERCVVNfU0VSVkVSX0xJU1RFTl9BRERSRVNTX0FMUkVBRFlfVVNFRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChzZXJ2ZXIgPT0gTlVMTCk7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9BRERSRVNTX0lOX1VTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkFkZHJlc3MgJyVzJyBhbHJlYWR5IHVzZWQiLAorICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X21ldGhvZCAoZW50cmllc1swXSkpOworICAgICAgICAgICAgICBoYW5kbGVkX29uY2UgPSBUUlVFOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgPT0gREJVU19TRVJWRVJfTElTVEVOX0JBRF9BRERSRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKHNlcnZlciA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJnRtcF9lcnJvcik7CisgICAgICAgICAgICAgIGRidXNfbW92ZV9lcnJvciAoJnRtcF9lcnJvciwgZXJyb3IpOworICAgICAgICAgICAgICBoYW5kbGVkX29uY2UgPSBUUlVFOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgPT0gREJVU19TRVJWRVJfTElTVEVOX05PVF9IQU5ETEVEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKHNlcnZlciA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSICgmdG1wX2Vycm9yKTsKKworICAgICAgICAgICAgICAvKiBrZWVwIHRyeWluZyBhZGRyZXNzZXMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgPT0gREJVU19TRVJWRVJfTElTVEVOX0RJRF9OT1RfQ09OTkVDVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChzZXJ2ZXIgPT0gTlVMTCk7CisgICAgICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZ0bXBfZXJyb3IpOworICAgICAgICAgICAgICBpZiAoIWRidXNfZXJyb3JfaXNfc2V0ICgmZmlyc3RfY29ubmVjdF9lcnJvcikpCisgICAgICAgICAgICAgICAgZGJ1c19tb3ZlX2Vycm9yICgmdG1wX2Vycm9yLCAmZmlyc3RfY29ubmVjdF9lcnJvcik7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZ0bXBfZXJyb3IpOworCisgICAgICAgICAgICAgIGhhbmRsZWRfb25jZSA9IFRSVUU7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAvKiBrZWVwIHRyeWluZyBhZGRyZXNzZXMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBfZGJ1c19hc3NlcnQgKHNlcnZlciA9PSBOVUxMKTsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAgIH0KKworIG91dDoKKworICBpZiAoIWhhbmRsZWRfb25jZSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAgIGlmIChsZW4gPiAwKQorICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfQkFEX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIGFkZHJlc3MgdHlwZSAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19hZGRyZXNzX2VudHJ5X2dldF9tZXRob2QgKGVudHJpZXNbMF0pKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICJFbXB0eSBhZGRyZXNzICclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyk7CisgICAgfQorICAKKyAgZGJ1c19hZGRyZXNzX2VudHJpZXNfZnJlZSAoZW50cmllcyk7CisKKyAgaWYgKHNlcnZlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCB8fCBkYnVzX2Vycm9yX2lzX3NldCAoJmZpcnN0X2Nvbm5lY3RfZXJyb3IpIHx8CisgICAgICAgICAgICAgICAgICAgZGJ1c19lcnJvcl9pc19zZXQgKGVycm9yKSk7CisgICAgICAKKyAgICAgIGlmIChlcnJvciAmJiBkYnVzX2Vycm9yX2lzX3NldCAoZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgLyogYWxyZWFkeSBzZXQgdGhlIGVycm9yICovCisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIGRpZG4ndCBzZXQgdGhlIGVycm9yIGJ1dCBlaXRoZXIgZXJyb3Igc2hvdWxkIGJlCisgICAgICAgICAgICogTlVMTCBvciBmaXJzdF9jb25uZWN0X2Vycm9yIHNob3VsZCBiZSBzZXQuCisgICAgICAgICAgICovCisgICAgICAgICAgX2RidXNfYXNzZXJ0IChlcnJvciA9PSBOVUxMIHx8IGRidXNfZXJyb3JfaXNfc2V0ICgmZmlyc3RfY29ubmVjdF9lcnJvcikpOworICAgICAgICAgIGRidXNfbW92ZV9lcnJvciAoJmZpcnN0X2Nvbm5lY3RfZXJyb3IsIGVycm9yKTsKKyAgICAgICAgfQorCisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKCZmaXJzdF9jb25uZWN0X2Vycm9yKTsgLyogYmUgc3VyZSB3ZSBmcmVlZCBpdCAqLworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworCisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAgIHJldHVybiBzZXJ2ZXI7CisgICAgfQorfQorCisvKioKKyAqIEluY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhIERCdXNTZXJ2ZXIuCisgKgorICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyLgorICogQHJldHVybnMgdGhlIHNlcnZlcgorICovCitEQnVzU2VydmVyICoKK2RidXNfc2VydmVyX3JlZiAoREJ1c1NlcnZlciAqc2VydmVyKQoreworICBkYnVzX2ludDMyX3Qgb2xkX3JlZmNvdW50OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoc2VydmVyICE9IE5VTEwsIE5VTEwpOworCisgIC8qIGNhbid0IGdldCB0aGUgcmVmY291bnQgd2l0aG91dCBhIHNpZGUtZWZmZWN0ICovCisgIG9sZF9yZWZjb3VudCA9IF9kYnVzX2F0b21pY19pbmMgKCZzZXJ2ZXItPnJlZmNvdW50KTsKKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIGlmIChfREJVU19VTkxJS0VMWSAob2xkX3JlZmNvdW50IDw9IDApKQorICAgIHsKKyAgICAgIC8qIHVuZG8gc2lkZS1lZmZlY3QgZmlyc3QgKi8KKyAgICAgIF9kYnVzX2F0b21pY19kZWMgKCZzZXJ2ZXItPnJlZmNvdW50KTsKKyAgICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkIChfZGJ1c19yZXR1cm5faWZfZmFpbF93YXJuaW5nX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19GVU5DVElPTl9OQU1FLCAib2xkX3JlZmNvdW50ID4gMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyNlbmRpZgorCisgIF9kYnVzX3NlcnZlcl90cmFjZV9yZWYgKHNlcnZlciwgb2xkX3JlZmNvdW50LCBvbGRfcmVmY291bnQgKyAxLCAicmVmIik7CisKKyAgcmV0dXJuIHNlcnZlcjsKK30KKworLyoqCisgKiBEZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgYSBEQnVzU2VydmVyLiAgRmluYWxpemVzIHRoZQorICogc2VydmVyIGlmIHRoZSByZWZlcmVuY2UgY291bnQgcmVhY2hlcyB6ZXJvLgorICoKKyAqIFRoZSBzZXJ2ZXIgbXVzdCBiZSBkaXNjb25uZWN0ZWQgYmVmb3JlIHRoZSByZWZjb3VudCByZWFjaGVzIHplcm8uCisgKgorICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyLgorICovCit2b2lkCitkYnVzX3NlcnZlcl91bnJlZiAoREJ1c1NlcnZlciAqc2VydmVyKQoreworICBkYnVzX2ludDMyX3Qgb2xkX3JlZmNvdW50OworCisgIC8qIGtlZXAgdGhpcyBpbiBzeW5jIHdpdGggdW5yZWZfdW5sb2NrZWQgKi8KKworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoc2VydmVyICE9IE5VTEwpOworCisgIC8qIGNhbid0IGdldCB0aGUgcmVmY291bnQgd2l0aG91dCBhIHNpZGUtZWZmZWN0ICovCisgIG9sZF9yZWZjb3VudCA9IF9kYnVzX2F0b21pY19kZWMgKCZzZXJ2ZXItPnJlZmNvdW50KTsKKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIGlmIChfREJVU19VTkxJS0VMWSAob2xkX3JlZmNvdW50IDw9IDApKQorICAgIHsKKyAgICAgIC8qIHVuZG8gc2lkZS1lZmZlY3QgZmlyc3QgKi8KKyAgICAgIF9kYnVzX2F0b21pY19pbmMgKCZzZXJ2ZXItPnJlZmNvdW50KTsKKyAgICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkIChfZGJ1c19yZXR1cm5faWZfZmFpbF93YXJuaW5nX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19GVU5DVElPTl9OQU1FLCAib2xkX3JlZmNvdW50ID4gMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKworICBfZGJ1c19zZXJ2ZXJfdHJhY2VfcmVmIChzZXJ2ZXIsIG9sZF9yZWZjb3VudCwgb2xkX3JlZmNvdW50IC0gMSwgInVucmVmIik7CisKKyAgaWYgKG9sZF9yZWZjb3VudCA9PSAxKQorICAgIHsKKyAgICAgIC8qIGxvY2sgbm90IGhlbGQhICovCisgICAgICBfZGJ1c19hc3NlcnQgKHNlcnZlci0+ZGlzY29ubmVjdGVkKTsKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChzZXJ2ZXItPnZ0YWJsZS0+ZmluYWxpemUgIT0gTlVMTCk7CisgICAgICAKKyAgICAgICgqIHNlcnZlci0+dnRhYmxlLT5maW5hbGl6ZSkgKHNlcnZlcik7CisgICAgfQorfQorCisvKioKKyAqIFJlbGVhc2VzIHRoZSBzZXJ2ZXIncyBhZGRyZXNzIGFuZCBzdG9wcyBsaXN0ZW5pbmcgZm9yCisgKiBuZXcgY2xpZW50cy4gSWYgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLCBvbmx5IHRoZSBmaXJzdAorICogY2FsbCBoYXMgYW4gZWZmZWN0LiBEb2VzIG5vdCBtb2RpZnkgdGhlIHNlcnZlcidzCisgKiByZWZlcmVuY2UgY291bnQuCisgKiAKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlci4KKyAqLwordm9pZAorZGJ1c19zZXJ2ZXJfZGlzY29ubmVjdCAoREJ1c1NlcnZlciAqc2VydmVyKQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoc2VydmVyICE9IE5VTEwpOworCisjaWZkZWYgREJVU19ESVNBQkxFX0NIRUNLUworICBfZGJ1c19hdG9taWNfaW5jICgmc2VydmVyLT5yZWZjb3VudCk7CisjZWxzZQorICAgIHsKKyAgICAgIGRidXNfaW50MzJfdCBvbGRfcmVmY291bnQgPSBfZGJ1c19hdG9taWNfaW5jICgmc2VydmVyLT5yZWZjb3VudCk7CisKKyAgICAgIF9kYnVzX3JldHVybl9pZl9mYWlsIChvbGRfcmVmY291bnQgPiAwKTsKKyAgICB9CisjZW5kaWYKKworICBTRVJWRVJfTE9DSyAoc2VydmVyKTsKKworICBfZGJ1c19hc3NlcnQgKHNlcnZlci0+dnRhYmxlLT5kaXNjb25uZWN0ICE9IE5VTEwpOworCisgIGlmICghc2VydmVyLT5kaXNjb25uZWN0ZWQpCisgICAgeworICAgICAgLyogdGhpcyBoYXMgdG8gYmUgZmlyc3Qgc28gcmVjdXJzaXZlIGNhbGxzIHRvIGRpc2Nvbm5lY3QgZG9uJ3QgaGFwcGVuICovCisgICAgICBzZXJ2ZXItPmRpc2Nvbm5lY3RlZCA9IFRSVUU7CisgICAgICAKKyAgICAgICgqIHNlcnZlci0+dnRhYmxlLT5kaXNjb25uZWN0KSAoc2VydmVyKTsKKyAgICB9CisKKyAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKyAgZGJ1c19zZXJ2ZXJfdW5yZWYgKHNlcnZlcik7Cit9CisKKy8qKgorICogUmV0dXJucyAjVFJVRSBpZiB0aGUgc2VydmVyIGlzIHN0aWxsIGxpc3RlbmluZyBmb3IgbmV3IGNvbm5lY3Rpb25zLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlci4KKyAqLworZGJ1c19ib29sX3QKK2RidXNfc2VydmVyX2dldF9pc19jb25uZWN0ZWQgKERCdXNTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICAKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChzZXJ2ZXIgIT0gTlVMTCwgRkFMU0UpOworCisgIFNFUlZFUl9MT0NLIChzZXJ2ZXIpOworICByZXR2YWwgPSAhc2VydmVyLT5kaXNjb25uZWN0ZWQ7CisgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBzZXJ2ZXIsIGFzIGEgbmV3bHktYWxsb2NhdGVkCisgKiBzdHJpbmcgd2hpY2ggbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlcgorICogQHJldHVybnMgdGhlIGFkZHJlc3Mgb3IgI05VTEwgaWYgbm8gbWVtb3J5CisgKi8KK2NoYXIqCitkYnVzX3NlcnZlcl9nZXRfYWRkcmVzcyAoREJ1c1NlcnZlciAqc2VydmVyKQoreworICBjaGFyICpyZXR2YWw7CisgIAorICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNlcnZlciAhPSBOVUxMLCBOVUxMKTsKKworICBTRVJWRVJfTE9DSyAoc2VydmVyKTsKKyAgcmV0dmFsID0gX2RidXNfc3RyZHVwIChzZXJ2ZXItPmFkZHJlc3MpOworICBTRVJWRVJfVU5MT0NLIChzZXJ2ZXIpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgdW5pcXVlIElEIG9mIHRoZSBzZXJ2ZXIsIGFzIGEgbmV3bHktYWxsb2NhdGVkCisgKiBzdHJpbmcgd2hpY2ggbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLiBUaGlzIElEIGlzCisgKiBub3JtYWxseSB1c2VkIGJ5IGNsaWVudHMgdG8gdGVsbCB3aGVuIHR3byAjREJ1c0Nvbm5lY3Rpb24KKyAqIHdvdWxkIGJlIGVxdWl2YWxlbnQgKGJlY2F1c2UgdGhlIHNlcnZlciBhZGRyZXNzIHBhc3NlZAorICogdG8gZGJ1c19jb25uZWN0aW9uX29wZW4oKSB3aWxsIGhhdmUgdGhlIHNhbWUgZ3VpZCBpbiB0aGUKKyAqIHR3byBjYXNlcykuIGRidXNfY29ubmVjdGlvbl9vcGVuKCkgY2FuIHJlLXVzZSBhbiBleGlzdGluZworICogY29ubmVjdGlvbiB3aXRoIHRoZSBzYW1lIElEIGluc3RlYWQgb2Ygb3BlbmluZyBhIG5ldworICogY29ubmVjdGlvbi4KKyAqCisgKiBUaGlzIGlzIGFuIElEIHVuaXF1ZSB0byBlYWNoICNEQnVzU2VydmVyLiBSZW1lbWJlciB0aGF0CisgKiBhICNEQnVzU2VydmVyIHJlcHJlc2VudHMgb25seSBvbmUgbW9kZSBvZiBjb25uZWN0aW5nLAorICogc28gZS5nLiBhIGJ1cyBkYWVtb24gY2FuIGxpc3RlbiBvbiBtdWx0aXBsZSBhZGRyZXNzZXMKKyAqIHdoaWNoIHdpbGwgbWVhbiBpdCBoYXMgbXVsdGlwbGUgI0RCdXNTZXJ2ZXIgZWFjaCB3aXRoCisgKiB0aGVpciBvd24gSUQuCisgKgorICogVGhlIElEIGlzIG5vdCBhIFVVSUQgaW4gdGhlIHNlbnNlIG9mIFJGQzQxMjI7IHRoZSBkZXRhaWxzCisgKiBhcmUgZXhwbGFpbmVkIGluIHRoZSBELUJ1cyBzcGVjaWZpY2F0aW9uLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlcgorICogQHJldHVybnMgdGhlIGlkIG9mIHRoZSBzZXJ2ZXIgb3IgI05VTEwgaWYgbm8gbWVtb3J5CisgKi8KK2NoYXIqCitkYnVzX3NlcnZlcl9nZXRfaWQgKERCdXNTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgY2hhciAqcmV0dmFsOworICAKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChzZXJ2ZXIgIT0gTlVMTCwgTlVMTCk7CisKKyAgU0VSVkVSX0xPQ0sgKHNlcnZlcik7CisgIHJldHZhbCA9IE5VTEw7CisgIF9kYnVzX3N0cmluZ19jb3B5X2RhdGEgKCZzZXJ2ZXItPmd1aWRfaGV4LCAmcmV0dmFsKTsKKyAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFNldHMgYSBmdW5jdGlvbiB0byBiZSB1c2VkIGZvciBoYW5kbGluZyBuZXcgY29ubmVjdGlvbnMuICBUaGUgZ2l2ZW4KKyAqIGZ1bmN0aW9uIGlzIHBhc3NlZCBlYWNoIG5ldyBjb25uZWN0aW9uIGFzIHRoZSBjb25uZWN0aW9uIGlzCisgKiBjcmVhdGVkLiBJZiB0aGUgbmV3IGNvbm5lY3Rpb24gZnVuY3Rpb24gaW5jcmVtZW50cyB0aGUgY29ubmVjdGlvbidzCisgKiByZWZlcmVuY2UgY291bnQsIHRoZSBjb25uZWN0aW9uIHdpbGwgc3RheSBhbGl2ZS4gT3RoZXJ3aXNlLCB0aGUKKyAqIGNvbm5lY3Rpb24gd2lsbCBiZSB1bnJlZmVyZW5jZWQgYW5kIGNsb3NlZC4gVGhlIG5ldyBjb25uZWN0aW9uCisgKiBmdW5jdGlvbiBtYXkgYWxzbyBjbG9zZSB0aGUgY29ubmVjdGlvbiBpdHNlbGYsIHdoaWNoIGlzIGNvbnNpZGVyZWQKKyAqIGdvb2QgZm9ybSBpZiB0aGUgY29ubmVjdGlvbiBpcyBub3Qgd2FudGVkLgorICoKKyAqIFRoZSBjb25uZWN0aW9uIGhlcmUgaXMgcHJpdmF0ZSBpbiB0aGUgc2Vuc2Ugb2YKKyAqIGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUoKSwgc28gaWYgdGhlIG5ldyBjb25uZWN0aW9uIGZ1bmN0aW9uCisgKiBrZWVwcyBhIHJlZmVyZW5jZSBpdCBtdXN0IGFycmFuZ2UgZm9yIHRoZSBjb25uZWN0aW9uIHRvIGJlIGNsb3NlZC4KKyAqIGkuZS4gbGliZGJ1cyBkb2VzIG5vdCBvd24gdGhpcyBjb25uZWN0aW9uIG9uY2UgdGhlIG5ldyBjb25uZWN0aW9uCisgKiBmdW5jdGlvbiB0YWtlcyBhIHJlZmVyZW5jZS4KKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIuCisgKiBAcGFyYW0gZnVuY3Rpb24gYSBmdW5jdGlvbiB0byBoYW5kbGUgbmV3IGNvbm5lY3Rpb25zLgorICogQHBhcmFtIGRhdGEgZGF0YSB0byBwYXNzIHRvIHRoZSBuZXcgY29ubmVjdGlvbiBoYW5kbGVyLgorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jdGlvbiBmdW5jdGlvbiB0byBmcmVlIHRoZSBkYXRhLgorICovCit2b2lkCitkYnVzX3NlcnZlcl9zZXRfbmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb24gKERCdXNTZXJ2ZXIgICAgICAgICAgICAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c05ld0Nvbm5lY3Rpb25GdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgREJ1c0ZyZWVGdW5jdGlvbiBvbGRfZnJlZV9mdW5jdGlvbjsKKyAgdm9pZCAqb2xkX2RhdGE7CisgIAorICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoc2VydmVyICE9IE5VTEwpOworCisgIFNFUlZFUl9MT0NLIChzZXJ2ZXIpOworICBvbGRfZnJlZV9mdW5jdGlvbiA9IHNlcnZlci0+bmV3X2Nvbm5lY3Rpb25fZnJlZV9kYXRhX2Z1bmN0aW9uOworICBvbGRfZGF0YSA9IHNlcnZlci0+bmV3X2Nvbm5lY3Rpb25fZGF0YTsKKyAgCisgIHNlcnZlci0+bmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb24gPSBmdW5jdGlvbjsKKyAgc2VydmVyLT5uZXdfY29ubmVjdGlvbl9kYXRhID0gZGF0YTsKKyAgc2VydmVyLT5uZXdfY29ubmVjdGlvbl9mcmVlX2RhdGFfZnVuY3Rpb24gPSBmcmVlX2RhdGFfZnVuY3Rpb247CisgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisgICAgCisgIGlmIChvbGRfZnJlZV9mdW5jdGlvbiAhPSBOVUxMKQorICAgICgqIG9sZF9mcmVlX2Z1bmN0aW9uKSAob2xkX2RhdGEpOworfQorCisvKioKKyAqIFNldHMgdGhlIHdhdGNoIGZ1bmN0aW9ucyBmb3IgdGhlIHNlcnZlci4gVGhlc2UgZnVuY3Rpb25zIGFyZQorICogcmVzcG9uc2libGUgZm9yIG1ha2luZyB0aGUgYXBwbGljYXRpb24ncyBtYWluIGxvb3AgYXdhcmUgb2YgZmlsZQorICogZGVzY3JpcHRvcnMgdGhhdCBuZWVkIHRvIGJlIG1vbml0b3JlZCBmb3IgZXZlbnRzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYmVoYXZlcyBleGFjdGx5IGxpa2UgZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMoKTsKKyAqIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhhdCByb3V0aW5lLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlci4KKyAqIEBwYXJhbSBhZGRfZnVuY3Rpb24gZnVuY3Rpb24gdG8gYmVnaW4gbW9uaXRvcmluZyBhIG5ldyBkZXNjcmlwdG9yLgorICogQHBhcmFtIHJlbW92ZV9mdW5jdGlvbiBmdW5jdGlvbiB0byBzdG9wIG1vbml0b3JpbmcgYSBkZXNjcmlwdG9yLgorICogQHBhcmFtIHRvZ2dsZWRfZnVuY3Rpb24gZnVuY3Rpb24gdG8gbm90aWZ5IHdoZW4gdGhlIHdhdGNoIGlzIGVuYWJsZWQvZGlzYWJsZWQKKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gcGFzcyB0byBhZGRfZnVuY3Rpb24gYW5kIHJlbW92ZV9mdW5jdGlvbi4KKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuY3Rpb24gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHRvIGZyZWUgdGhlIGRhdGEuCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZSAobm8gbWVtb3J5KQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19zZXJ2ZXJfc2V0X3dhdGNoX2Z1bmN0aW9ucyAoREJ1c1NlcnZlciAgICAgICAgICAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBZGRXYXRjaEZ1bmN0aW9uICAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUmVtb3ZlV2F0Y2hGdW5jdGlvbiAgcmVtb3ZlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoVG9nZ2xlZEZ1bmN0aW9uIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pCit7CisgIGRidXNfYm9vbF90IHJlc3VsdDsKKyAgREJ1c1dhdGNoTGlzdCAqd2F0Y2hlczsKKyAgCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoc2VydmVyICE9IE5VTEwsIEZBTFNFKTsKKworICBTRVJWRVJfTE9DSyAoc2VydmVyKTsKKyAgd2F0Y2hlcyA9IHNlcnZlci0+d2F0Y2hlczsKKyAgc2VydmVyLT53YXRjaGVzID0gTlVMTDsKKyAgaWYgKHdhdGNoZXMpCisgICAgeworICAgICAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKyAgICAgIHJlc3VsdCA9IF9kYnVzX3dhdGNoX2xpc3Rfc2V0X2Z1bmN0aW9ucyAod2F0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbik7CisgICAgICBTRVJWRVJfTE9DSyAoc2VydmVyKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoIlJlLWVudHJhbnQgY2FsbCB0byAlc1xuIiwgX0RCVVNfRlVOQ1RJT05fTkFNRSk7CisgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICB9CisgIHNlcnZlci0+d2F0Y2hlcyA9IHdhdGNoZXM7CisgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisgIAorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFNldHMgdGhlIHRpbWVvdXQgZnVuY3Rpb25zIGZvciB0aGUgc2VydmVyLiBUaGVzZSBmdW5jdGlvbnMgYXJlCisgKiByZXNwb25zaWJsZSBmb3IgbWFraW5nIHRoZSBhcHBsaWNhdGlvbidzIG1haW4gbG9vcCBhd2FyZSBvZiB0aW1lb3V0cy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGJlaGF2ZXMgZXhhY3RseSBsaWtlIGRidXNfY29ubmVjdGlvbl9zZXRfdGltZW91dF9mdW5jdGlvbnMoKTsKKyAqIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhhdCByb3V0aW5lLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlci4KKyAqIEBwYXJhbSBhZGRfZnVuY3Rpb24gZnVuY3Rpb24gdG8gYWRkIGEgdGltZW91dC4KKyAqIEBwYXJhbSByZW1vdmVfZnVuY3Rpb24gZnVuY3Rpb24gdG8gcmVtb3ZlIGEgdGltZW91dC4KKyAqIEBwYXJhbSB0b2dnbGVkX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIG5vdGlmeSB3aGVuIHRoZSB0aW1lb3V0IGlzIGVuYWJsZWQvZGlzYWJsZWQKKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gcGFzcyB0byBhZGRfZnVuY3Rpb24gYW5kIHJlbW92ZV9mdW5jdGlvbi4KKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuY3Rpb24gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHRvIGZyZWUgdGhlIGRhdGEuCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZSAobm8gbWVtb3J5KQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19zZXJ2ZXJfc2V0X3RpbWVvdXRfZnVuY3Rpb25zIChEQnVzU2VydmVyICAgICAgICAgICAgICAgICpzZXJ2ZXIsCisJCQkJICAgREJ1c0FkZFRpbWVvdXRGdW5jdGlvbiAgICAgYWRkX2Z1bmN0aW9uLAorCQkJCSAgIERCdXNSZW1vdmVUaW1lb3V0RnVuY3Rpb24gIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXRUb2dnbGVkRnVuY3Rpb24gdG9nZ2xlZF9mdW5jdGlvbiwKKwkJCQkgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorCQkJCSAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgZGJ1c19ib29sX3QgcmVzdWx0OworICBEQnVzVGltZW91dExpc3QgKnRpbWVvdXRzOworICAKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChzZXJ2ZXIgIT0gTlVMTCwgRkFMU0UpOworCisgIFNFUlZFUl9MT0NLIChzZXJ2ZXIpOworICB0aW1lb3V0cyA9IHNlcnZlci0+dGltZW91dHM7CisgIHNlcnZlci0+dGltZW91dHMgPSBOVUxMOworICBpZiAodGltZW91dHMpCisgICAgeworICAgICAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKyAgICAgIHJlc3VsdCA9IF9kYnVzX3RpbWVvdXRfbGlzdF9zZXRfZnVuY3Rpb25zICh0aW1lb3V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pOworICAgICAgU0VSVkVSX0xPQ0sgKHNlcnZlcik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJSZS1lbnRyYW50IGNhbGwgdG8gJXNcbiIsIF9EQlVTX0ZVTkNUSU9OX05BTUUpOworICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgfQorICBzZXJ2ZXItPnRpbWVvdXRzID0gdGltZW91dHM7CisgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisgIAorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFNldHMgdGhlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgdGhhdCB0aGlzIHNlcnZlciBvZmZlcnMgdG8KKyAqIGNsaWVudHMsIGFzIGEgI05VTEwtdGVybWluYXRlZCBhcnJheSBvZiBtZWNoYW5pc20gbmFtZXMuIFRoaXMKKyAqIGZ1bmN0aW9uIG9ubHkgYWZmZWN0cyBjb25uZWN0aW9ucyBjcmVhdGVkIDxlbT5hZnRlcjwvZW0+IGl0IGlzCisgKiBjYWxsZWQuICBQYXNzICNOVUxMIGluc3RlYWQgb2YgYW4gYXJyYXkgdG8gdXNlIGFsbCBhdmFpbGFibGUKKyAqIG1lY2hhbmlzbXMgKHRoaXMgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IpLgorICoKKyAqIFRoZSBELUJ1cyBzcGVjaWZpY2F0aW9uIGRlc2NyaWJlcyBzb21lIG9mIHRoZSBzdXBwb3J0ZWQgbWVjaGFuaXNtcy4KKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIKKyAqIEBwYXJhbSBtZWNoYW5pc21zICNOVUxMLXRlcm1pbmF0ZWQgYXJyYXkgb2YgbWVjaGFuaXNtcworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19zZXJ2ZXJfc2V0X2F1dGhfbWVjaGFuaXNtcyAoREJ1c1NlcnZlciAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiptZWNoYW5pc21zKQoreworICBjaGFyICoqY29weTsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNlcnZlciAhPSBOVUxMLCBGQUxTRSk7CisKKyAgU0VSVkVSX0xPQ0sgKHNlcnZlcik7CisgIAorICBpZiAobWVjaGFuaXNtcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNvcHkgPSBfZGJ1c19kdXBfc3RyaW5nX2FycmF5IChtZWNoYW5pc21zKTsKKyAgICAgIGlmIChjb3B5ID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICBjb3B5ID0gTlVMTDsKKworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChzZXJ2ZXItPmF1dGhfbWVjaGFuaXNtcyk7CisgIHNlcnZlci0+YXV0aF9tZWNoYW5pc21zID0gY29weTsKKworICBTRVJWRVJfVU5MT0NLIChzZXJ2ZXIpOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIERCdXNEYXRhU2xvdEFsbG9jYXRvciBzbG90X2FsbG9jYXRvcjsKK19EQlVTX0RFRklORV9HTE9CQUxfTE9DSyAoc2VydmVyX3Nsb3RzKTsKKworLyoqCisgKiBBbGxvY2F0ZXMgYW4gaW50ZWdlciBJRCB0byBiZSB1c2VkIGZvciBzdG9yaW5nIGFwcGxpY2F0aW9uLXNwZWNpZmljCisgKiBkYXRhIG9uIGFueSBEQnVzU2VydmVyLiBUaGUgYWxsb2NhdGVkIElEIG1heSB0aGVuIGJlIHVzZWQKKyAqIHdpdGggZGJ1c19zZXJ2ZXJfc2V0X2RhdGEoKSBhbmQgZGJ1c19zZXJ2ZXJfZ2V0X2RhdGEoKS4KKyAqIFRoZSBzbG90IG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCAtMS4gSWYgYSBub25uZWdhdGl2ZQorICogc2xvdCBpcyBwYXNzZWQgaW4sIHRoZSByZWZjb3VudCBpcyBpbmNyZW1lbnRlZCBvbiB0aGF0CisgKiBzbG90LCByYXRoZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBzbG90LgorICogIAorICogVGhlIGFsbG9jYXRlZCBzbG90IGlzIGdsb2JhbCwgaS5lLiBhbGwgREJ1c1NlcnZlciBvYmplY3RzIHdpbGwgaGF2ZQorICogYSBzbG90IHdpdGggdGhlIGdpdmVuIGludGVnZXIgSUQgcmVzZXJ2ZWQuCisgKgorICogQHBhcmFtIHNsb3RfcCBhZGRyZXNzIG9mIGdsb2JhbCB2YXJpYWJsZSBzdG9yaW5nIHRoZSBzbG90IElECisgKiBAcmV0dXJucyAjRkFMU0Ugb24gbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX3NlcnZlcl9hbGxvY2F0ZV9kYXRhX3Nsb3QgKGRidXNfaW50MzJfdCAqc2xvdF9wKQoreworICByZXR1cm4gX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9hbGxvYyAoJnNsb3RfYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNSTXV0ZXggKiopJl9EQlVTX0xPQ0tfTkFNRSAoc2VydmVyX3Nsb3RzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RfcCk7Cit9CisKKy8qKgorICogRGVhbGxvY2F0ZXMgYSBnbG9iYWwgSUQgZm9yIHNlcnZlciBkYXRhIHNsb3RzLgorICogZGJ1c19zZXJ2ZXJfZ2V0X2RhdGEoKSBhbmQgZGJ1c19zZXJ2ZXJfc2V0X2RhdGEoKQorICogbWF5IG5vIGxvbmdlciBiZSB1c2VkIHdpdGggdGhpcyBzbG90LgorICogRXhpc3RpbmcgZGF0YSBzdG9yZWQgb24gZXhpc3RpbmcgREJ1c1NlcnZlciBvYmplY3RzCisgKiB3aWxsIGJlIGZyZWVkIHdoZW4gdGhlIHNlcnZlciBpcyBmaW5hbGl6ZWQsCisgKiBidXQgbWF5IG5vdCBiZSByZXRyaWV2ZWQgKGFuZCBtYXkgb25seSBiZSByZXBsYWNlZAorICogaWYgc29tZW9uZSBlbHNlIHJlYWxsb2NhdGVzIHRoZSBzbG90KS4KKyAqCisgKiBAcGFyYW0gc2xvdF9wIGFkZHJlc3Mgb2YgdGhlIHNsb3QgdG8gZGVhbGxvY2F0ZQorICovCit2b2lkCitkYnVzX3NlcnZlcl9mcmVlX2RhdGFfc2xvdCAoZGJ1c19pbnQzMl90ICpzbG90X3ApCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsICgqc2xvdF9wID49IDApOworICAKKyAgX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9mcmVlICgmc2xvdF9hbGxvY2F0b3IsIHNsb3RfcCk7Cit9CisKKy8qKgorICogU3RvcmVzIGEgcG9pbnRlciBvbiBhIERCdXNTZXJ2ZXIsIGFsb25nCisgKiB3aXRoIGFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIGJlIHVzZWQgZm9yIGZyZWVpbmcKKyAqIHRoZSBkYXRhIHdoZW4gdGhlIGRhdGEgaXMgc2V0IGFnYWluLCBvciB3aGVuCisgKiB0aGUgc2VydmVyIGlzIGZpbmFsaXplZC4gVGhlIHNsb3QgbnVtYmVyCisgKiBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgd2l0aCBkYnVzX3NlcnZlcl9hbGxvY2F0ZV9kYXRhX3Nsb3QoKS4KKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIKKyAqIEBwYXJhbSBzbG90IHRoZSBzbG90IG51bWJlcgorICogQHBhcmFtIGRhdGEgdGhlIGRhdGEgdG8gc3RvcmUKKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuYyBmaW5hbGl6ZXIgZnVuY3Rpb24gZm9yIHRoZSBkYXRhCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGVyZSB3YXMgZW5vdWdoIG1lbW9yeSB0byBzdG9yZSB0aGUgZGF0YQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19zZXJ2ZXJfc2V0X2RhdGEgKERCdXNTZXJ2ZXIgICAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgZnJlZV9kYXRhX2Z1bmMpCit7CisgIERCdXNGcmVlRnVuY3Rpb24gb2xkX2ZyZWVfZnVuYzsKKyAgdm9pZCAqb2xkX2RhdGE7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNlcnZlciAhPSBOVUxMLCBGQUxTRSk7CisKKyAgU0VSVkVSX0xPQ0sgKHNlcnZlcik7CisgIAorICByZXR2YWwgPSBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9zZXQgKCZzbG90X2FsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmVyLT5zbG90X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdCwgZGF0YSwgZnJlZV9kYXRhX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9sZF9mcmVlX2Z1bmMsICZvbGRfZGF0YSk7CisKKworICBTRVJWRVJfVU5MT0NLIChzZXJ2ZXIpOworICAKKyAgaWYgKHJldHZhbCkKKyAgICB7CisgICAgICAvKiBEbyB0aGUgYWN0dWFsIGZyZWUgb3V0c2lkZSB0aGUgc2VydmVyIGxvY2sgKi8KKyAgICAgIGlmIChvbGRfZnJlZV9mdW5jKQorICAgICAgICAoKiBvbGRfZnJlZV9mdW5jKSAob2xkX2RhdGEpOworICAgIH0KKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFJldHJpZXZlcyBkYXRhIHByZXZpb3VzbHkgc2V0IHdpdGggZGJ1c19zZXJ2ZXJfc2V0X2RhdGEoKS4KKyAqIFRoZSBzbG90IG11c3Qgc3RpbGwgYmUgYWxsb2NhdGVkIChtdXN0IG5vdCBoYXZlIGJlZW4gZnJlZWQpLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlcgorICogQHBhcmFtIHNsb3QgdGhlIHNsb3QgdG8gZ2V0IGRhdGEgZnJvbQorICogQHJldHVybnMgdGhlIGRhdGEsIG9yICNOVUxMIGlmIG5vdCBmb3VuZAorICovCit2b2lkKgorZGJ1c19zZXJ2ZXJfZ2V0X2RhdGEgKERCdXNTZXJ2ZXIgICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgc2xvdCkKK3sKKyAgdm9pZCAqcmVzOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoc2VydmVyICE9IE5VTEwsIE5VTEwpOworICAKKyAgU0VSVkVSX0xPQ0sgKHNlcnZlcik7CisgIAorICByZXMgPSBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9nZXQgKCZzbG90X2FsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmVyLT5zbG90X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdCk7CisKKyAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKyAgCisgIHJldHVybiByZXM7Cit9CisKKy8qKiBAfSAqLworCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitkYnVzX2Jvb2xfdAorX2RidXNfc2VydmVyX3Rlc3QgKHZvaWQpCit7CisgIGNvbnN0IGNoYXIgKnZhbGlkX2FkZHJlc3Nlc1tdID0geworICAgICJ0Y3A6cG9ydD0xMjM0IiwKKyAgICAidGNwOmhvc3Q9bG9jYWxob3N0LHBvcnQ9MTIzNCIsCisgICAgInRjcDpob3N0PWxvY2FsaG9zdCxwb3J0PTEyMzQ7dGNwOnBvcnQ9NTY3OCIsCisjaWZkZWYgREJVU19VTklYCisgICAgInVuaXg6cGF0aD0uL2Jvb2dpZSIsCisgICAgInRjcDpwb3J0PTEyMzQ7dW5peDpwYXRoPS4vYm9vZ2llIiwKKyNlbmRpZgorICB9OworCisgIERCdXNTZXJ2ZXIgKnNlcnZlcjsKKyAgaW50IGk7CisgIAorICBmb3IgKGkgPSAwOyBpIDwgX0RCVVNfTl9FTEVNRU5UUyAodmFsaWRfYWRkcmVzc2VzKTsgaSsrKQorICAgIHsKKyAgICAgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgICAgIGNoYXIgKmFkZHJlc3M7CisgICAgICBjaGFyICppZDsKKworICAgICAgc2VydmVyID0gZGJ1c19zZXJ2ZXJfbGlzdGVuICh2YWxpZF9hZGRyZXNzZXNbaV0sICZlcnJvcik7CisgICAgICBpZiAoc2VydmVyID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgic2VydmVyIGxpc3RlbiBlcnJvcjogJXM6ICVzXG4iLCBlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRmFpbGVkIHRvIGxpc3RlbiBmb3IgdmFsaWQgYWRkcmVzcy4iKTsKKyAgICAgICAgfQorCisgICAgICBpZCA9IGRidXNfc2VydmVyX2dldF9pZCAoc2VydmVyKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoaWQgIT0gTlVMTCk7CisgICAgICBhZGRyZXNzID0gZGJ1c19zZXJ2ZXJfZ2V0X2FkZHJlc3MgKHNlcnZlcik7CisgICAgICBfZGJ1c19hc3NlcnQgKGFkZHJlc3MgIT0gTlVMTCk7CisKKyAgICAgIGlmIChzdHJzdHIgKGFkZHJlc3MsIGlkKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoInNlcnZlciBpZCAnJXMnIGlzIG5vdCBpbiB0aGUgc2VydmVyIGFkZHJlc3MgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBpZCwgYWRkcmVzcyk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiYmFkIHNlcnZlciBpZCBvciBhZGRyZXNzIik7CisgICAgICAgIH0KKworICAgICAgZGJ1c19mcmVlIChpZCk7CisgICAgICBkYnVzX2ZyZWUgKGFkZHJlc3MpOworICAgICAgCisgICAgICBkYnVzX3NlcnZlcl9kaXNjb25uZWN0IChzZXJ2ZXIpOworICAgICAgZGJ1c19zZXJ2ZXJfdW5yZWYgKHNlcnZlcik7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtc2VydmVyLmggYi9kYnVzL2RidXMvZGJ1cy1zZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGJlZmEwCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtc2VydmVyLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zZXJ2ZXIuaCBEQnVzU2VydmVyIG9iamVjdAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWYgIWRlZmluZWQgKERCVVNfSU5TSURFX0RCVVNfSCkgJiYgIWRlZmluZWQgKERCVVNfQ09NUElMQVRJT04pCisjZXJyb3IgIk9ubHkgPGRidXMvZGJ1cy5oPiBjYW4gYmUgaW5jbHVkZWQgZGlyZWN0bHksIHRoaXMgZmlsZSBtYXkgZGlzYXBwZWFyIG9yIGNoYW5nZSBjb250ZW50cy4iCisjZW5kaWYKKworI2lmbmRlZiBEQlVTX1NFUlZFUl9ICisjZGVmaW5lIERCVVNfU0VSVkVSX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVzc2FnZS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXByb3RvY29sLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzU2VydmVyCisgKiBAeworICovCisKK3R5cGVkZWYgc3RydWN0IERCdXNTZXJ2ZXIgREJ1c1NlcnZlcjsKKworLyoqIENhbGxlZCB3aGVuIGEgbmV3IGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBpcyBhdmFpbGFibGUuIE11c3QgcmVmZXJlbmNlIGFuZCBzYXZlIHRoZSBuZXcKKyAqIGNvbm5lY3Rpb24sIG9yIGNsb3NlIHRoZSBuZXcgY29ubmVjdGlvbi4gU2V0IHdpdGggZGJ1c19zZXJ2ZXJfc2V0X25ld19jb25uZWN0aW9uX2Z1bmN0aW9uKCkuCisgKi8KK3R5cGVkZWYgdm9pZCAoKiBEQnVzTmV3Q29ubmVjdGlvbkZ1bmN0aW9uKSAoREJ1c1NlcnZlciAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKm5ld19jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSk7CisKK0RCVVNfRVhQT1JUCitEQnVzU2VydmVyKiBkYnVzX3NlcnZlcl9saXN0ZW4gICAgICAgICAgIChjb25zdCBjaGFyICAgICAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitEQlVTX0VYUE9SVAorREJ1c1NlcnZlciogZGJ1c19zZXJ2ZXJfcmVmICAgICAgICAgICAgICAoREJ1c1NlcnZlciAgICAgKnNlcnZlcik7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19zZXJ2ZXJfdW5yZWYgICAgICAgICAgICAoREJ1c1NlcnZlciAgICAgKnNlcnZlcik7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19zZXJ2ZXJfZGlzY29ubmVjdCAgICAgICAoREJ1c1NlcnZlciAgICAgKnNlcnZlcik7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19zZXJ2ZXJfZ2V0X2lzX2Nvbm5lY3RlZCAoREJ1c1NlcnZlciAgICAgKnNlcnZlcik7CitEQlVTX0VYUE9SVAorY2hhciogICAgICAgZGJ1c19zZXJ2ZXJfZ2V0X2FkZHJlc3MgICAgICAoREJ1c1NlcnZlciAgICAgKnNlcnZlcik7CitEQlVTX0VYUE9SVAorY2hhciogICAgICAgZGJ1c19zZXJ2ZXJfZ2V0X2lkICAgICAgICAgICAoREJ1c1NlcnZlciAgICAgKnNlcnZlcik7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19zZXJ2ZXJfc2V0X25ld19jb25uZWN0aW9uX2Z1bmN0aW9uIChEQnVzU2VydmVyICAgICAgICAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNOZXdDb25uZWN0aW9uRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfc2VydmVyX3NldF93YXRjaF9mdW5jdGlvbnMgICAgICAgICAoREJ1c1NlcnZlciAgICAgICAgICAgICAgICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQWRkV2F0Y2hGdW5jdGlvbiAgICAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNSZW1vdmVXYXRjaEZ1bmN0aW9uICAgIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoVG9nZ2xlZEZ1bmN0aW9uICAgdG9nZ2xlZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX3NlcnZlcl9zZXRfdGltZW91dF9mdW5jdGlvbnMgICAgICAgKERCdXNTZXJ2ZXIgICAgICAgICAgICAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0FkZFRpbWVvdXRGdW5jdGlvbiAgICAgYWRkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUmVtb3ZlVGltZW91dEZ1bmN0aW9uICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0VG9nZ2xlZEZ1bmN0aW9uIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbik7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19zZXJ2ZXJfc2V0X2F1dGhfbWVjaGFuaXNtcyAgICAgICAgIChEQnVzU2VydmVyICAgICAgICAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAqKm1lY2hhbmlzbXMpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19zZXJ2ZXJfYWxsb2NhdGVfZGF0YV9zbG90IChkYnVzX2ludDMyX3QgICAgICpzbG90X3ApOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfc2VydmVyX2ZyZWVfZGF0YV9zbG90ICAgICAoZGJ1c19pbnQzMl90ICAgICAqc2xvdF9wKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX3NlcnZlcl9zZXRfZGF0YSAgICAgICAgICAgKERCdXNTZXJ2ZXIgICAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgZnJlZV9kYXRhX2Z1bmMpOworREJVU19FWFBPUlQKK3ZvaWQqICAgICAgIGRidXNfc2VydmVyX2dldF9kYXRhICAgICAgICAgICAoREJ1c1NlcnZlciAgICAgICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzbG90KTsKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1NFUlZFUl9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1zaGEuYyBiL2RidXMvZGJ1cy9kYnVzLXNoYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxODI3NTIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1zaGEuYwpAQCAtMCwwICsxLDk2OSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNoYS5jIFNIQS0xIGltcGxlbWVudGF0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQgSW5jLgorICogQ29weXJpZ2h0IChDKSAxOTk1IEEuIE0uIEt1Y2hsaW5nCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXNoYS5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1iYXNpYy5oIiAvKiBmb3IgYnl0ZXN3YXAgcm91dGluZXMgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyogVGhlIGZvbGxvd2luZyBjb21tZW50cyBoYXZlIHRoZSBoaXN0b3J5IG9mIHdoZXJlIHRoaXMgY29kZQorICogY29tZXMgZnJvbS4gSSBhY3R1YWxseSBjb3BpZWQgaXQgZnJvbSBHTmV0IGluIEdOT01FIENWUy4KKyAqIC0gaHBAcmVkaGF0LmNvbQorICovCisKKy8qCisgKiAgc2hhLmggOiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU2VjdXJlIEhhc2ggQWxnb3JpdGhtCisgKgorICogUGFydCBvZiB0aGUgUHl0aG9uIENyeXB0b2dyYXBoeSBUb29sa2l0LCB2ZXJzaW9uIDEuMC4wCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCBBLk0uIEt1Y2hsaW5nCisgKgorICogRGlzdHJpYnV0ZSBhbmQgdXNlIGZyZWVseTsgdGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiBmdXJ0aGVyCisgKiBkaXNzZW1pbmF0aW9uIGFuZCB1c2FnZSBleGNlcHQgdGhvc2UgaW1wb3NlZCBieSB0aGUgbGF3cyBvZiB5b3VyCisgKiBjb3VudHJ5IG9mIHJlc2lkZW5jZS4KKyAqCisgKi8KKworLyogU0hBOiBOSVNUJ3MgU2VjdXJlIEhhc2ggQWxnb3JpdGhtICovCisKKy8qIEJhc2VkIG9uIFNIQSBjb2RlIG9yaWdpbmFsbHkgcG9zdGVkIHRvIHNjaS5jcnlwdCBieSBQZXRlciBHdXRtYW5uCisgICBpbiBtZXNzYWdlIDwzMGFqbzUkb2U4QGNjdTIuYXVja2xhbmQuYWMubno+LgorICAgTW9kaWZpZWQgdG8gdGVzdCBmb3IgZW5kaWFubmVzcyBvbiBjcmVhdGlvbiBvZiBTSEEgb2JqZWN0cyBieSBBTUsuCisgICBBbHNvLCB0aGUgb3JpZ2luYWwgc3BlY2lmaWNhdGlvbiBvZiBTSEEgd2FzIGZvdW5kIHRvIGhhdmUgYSB3ZWFrbmVzcworICAgYnkgTlNBL05JU1QuICBUaGlzIGNvZGUgaW1wbGVtZW50cyB0aGUgZml4ZWQgdmVyc2lvbiBvZiBTSEEuCisqLworCisvKiBIZXJlJ3MgdGhlIGZpcnN0IHBhcmFncmFwaCBvZiBQZXRlciBHdXRtYW5uJ3MgcG9zdGluZzoKKworVGhlIGZvbGxvd2luZyBpcyBteSBTSEEgKEZJUFMgMTgwKSBjb2RlIHVwZGF0ZWQgdG8gYWxsb3cgdXNlIG9mIHRoZSAiZml4ZWQiCitTSEEsIHRoYW5rcyB0byBKaW0gR2lsbG9nbHkgYW5kIGFuIGFub255bW91cyBjb250cmlidXRvciBmb3IgdGhlIGluZm9ybWF0aW9uIG9uCit3aGF0J3MgY2hhbmdlZCBpbiB0aGUgbmV3IHZlcnNpb24uICBUaGUgZml4IGlzIGEgc2ltcGxlIGNoYW5nZSB3aGljaCBpbnZvbHZlcworYWRkaW5nIGEgc2luZ2xlIHJvdGF0ZSBpbiB0aGUgaW5pdGlhbCBleHBhbnNpb24gZnVuY3Rpb24uICBJdCBpcyB1bmtub3duCit3aGV0aGVyIHRoaXMgaXMgYW4gb3B0aW1hbCBzb2x1dGlvbiB0byB0aGUgcHJvYmxlbSB3aGljaCB3YXMgZGlzY292ZXJlZCBpbiB0aGUKK1NIQSBvciB3aGV0aGVyIGl0J3Mgc2ltcGx5IGEgYmFuZGFpZCB3aGljaCBmaXhlcyB0aGUgcHJvYmxlbSB3aXRoIGEgbWluaW11bSBvZgorZWZmb3J0IChmb3IgZXhhbXBsZSB0aGUgcmVlbmdpbmVlcmluZyBvZiBhIGdyZWF0IG1hbnkgQ2Fwc3RvbmUgY2hpcHMpLgorKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1NIQSBTSEEgaW1wbGVtZW50YXRpb24KKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgU0hBLTEgaGFzaAorICoKKyAqIFR5cGVzIGFuZCBmdW5jdGlvbnMgcmVsYXRlZCB0byBjb21wdXRpbmcgU0hBLTEgaGFzaC4KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBEQnVzU0hBSW50ZXJuYWxzIFNIQSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIEludGVybmFscyBvZiBTSEEgaW1wbGVtZW50YXRpb24uCisgKgorICogVGhlIGltcGxlbWVudGF0aW9uIG9mIFNIQS0xIChzZWUgaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZmlwc3B1YnMvZmlwMTgwLTEuaHRtKS4KKyAqIFRoaXMgU0hBIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIGJ5IEEuTS4gS3VjaGxpbmcKKyAqCisgKiBAeworICovCisKKyNpZm5kZWYgRE9YWUdFTl9TSE9VTERfU0tJUF9USElTCisKKy8qIFRoZSBTSEEgYmxvY2sgc2l6ZSBhbmQgbWVzc2FnZSBkaWdlc3Qgc2l6ZXMsIGluIGJ5dGVzICovCisKKyNkZWZpbmUgU0hBX0RBVEFTSVpFICAgIDY0CisjZGVmaW5lIFNIQV9ESUdFU1RTSVpFICAyMAorCisvKiBUaGUgU0hBIGYoKS1mdW5jdGlvbnMuICBUaGUgZjEgYW5kIGYzIGZ1bmN0aW9ucyBjYW4gYmUgb3B0aW1pemVkIHRvCisgICBzYXZlIG9uZSBib29sZWFuIG9wZXJhdGlvbiBlYWNoIC0gdGhhbmtzIHRvIFJpY2ggU2Nocm9lcHBlbCwKKyAgIHJjc0Bjcy5hcml6b25hLmVkdSBmb3IgZGlzY292ZXJpbmcgdGhpcyAqLworCisvKiNkZWZpbmUgZjEoeCx5LHopICggKCB4ICYgeSApIHwgKCB+eCAmIHogKSApICAgICAgICAgIC8vIFJvdW5kcyAgMC0xOSAqLworI2RlZmluZSBmMSh4LHkseikgICggeiBeICggeCAmICggeSBeIHogKSApICkgICAgICAgICAgIC8qIFJvdW5kcyAgMC0xOSAqLworI2RlZmluZSBmMih4LHkseikgICggeCBeIHkgXiB6ICkgICAgICAgICAgICAgICAgICAgICAgIC8qIFJvdW5kcyAyMC0zOSAqLworLyojZGVmaW5lIGYzKHgseSx6KSAoICggeCAmIHkgKSB8ICggeCAmIHogKSB8ICggeSAmIHogKSApICAgLy8gUm91bmRzIDQwLTU5ICovCisjZGVmaW5lIGYzKHgseSx6KSAgKCAoIHggJiB5ICkgfCAoIHogJiAoIHggfCB5ICkgKSApICAgLyogUm91bmRzIDQwLTU5ICovCisjZGVmaW5lIGY0KHgseSx6KSAgKCB4IF4geSBeIHogKSAgICAgICAgICAgICAgICAgICAgICAgLyogUm91bmRzIDYwLTc5ICovCisKKy8qIFRoZSBTSEEgTXlzdGVyaW91cyBDb25zdGFudHMgKi8KKworI2RlZmluZSBLMSAgMHg1QTgyNzk5OUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSb3VuZHMgIDAtMTkgKi8KKyNkZWZpbmUgSzIgIDB4NkVEOUVCQTFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUm91bmRzIDIwLTM5ICovCisjZGVmaW5lIEszICAweDhGMUJCQ0RDTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJvdW5kcyA0MC01OSAqLworI2RlZmluZSBLNCAgMHhDQTYyQzFENkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSb3VuZHMgNjAtNzkgKi8KKworLyogU0hBIGluaXRpYWwgdmFsdWVzICovCisKKyNkZWZpbmUgaDBpbml0ICAweDY3NDUyMzAxTAorI2RlZmluZSBoMWluaXQgIDB4RUZDREFCODlMCisjZGVmaW5lIGgyaW5pdCAgMHg5OEJBRENGRUwKKyNkZWZpbmUgaDNpbml0ICAweDEwMzI1NDc2TAorI2RlZmluZSBoNGluaXQgIDB4QzNEMkUxRjBMCisKKy8qIE5vdGUgdGhhdCBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIGFkZCBwYXJlbnRoZXNlcyB0byB0aGVzZSBtYWNyb3MgaWYgdGhleQorICAgYXJlIHRvIGJlIGNhbGxlZCB3aXRoIGV4cHJlc3Npb25zIGFzIGFyZ3VtZW50cyAqLworLyogMzItYml0IHJvdGF0ZSBsZWZ0IC0ga2x1ZGdlZCB3aXRoIHNoaWZ0cyAqLworCisjZGVmaW5lIFJPVEwobixYKSAoICggKCBYICkgPDwgbiApIHwgKCAoIFggKSA+PiAoIDMyIC0gbiApICkgKQorCisvKiBUaGUgaW5pdGlhbCBleHBhbmRpbmcgZnVuY3Rpb24uICBUaGUgaGFzaCBmdW5jdGlvbiBpcyBkZWZpbmVkIG92ZXIgYW4KKyAgIDgwLXdvcmQgZXhwYW5kZWQgaW5wdXQgYXJyYXkgVywgd2hlcmUgdGhlIGZpcnN0IDE2IGFyZSBjb3BpZXMgb2YgdGhlIGlucHV0CisgICBkYXRhLCBhbmQgdGhlIHJlbWFpbmluZyA2NCBhcmUgZGVmaW5lZCBieQorCisgICAgICAgIFdbIGkgXSA9IFdbIGkgLSAxNiBdIF4gV1sgaSAtIDE0IF0gXiBXWyBpIC0gOCBdIF4gV1sgaSAtIDMgXQorCisgICBUaGlzIGltcGxlbWVudGF0aW9uIGdlbmVyYXRlcyB0aGVzZSB2YWx1ZXMgb24gdGhlIGZseSBpbiBhIGNpcmN1bGFyCisgICBidWZmZXIgLSB0aGFua3MgdG8gQ29saW4gUGx1bWIsIGNvbGluQG55eDEwLmNzLmR1LmVkdSBmb3IgdGhpcworICAgb3B0aW1pemF0aW9uLgorCisgICBUaGUgdXBkYXRlZCBTSEEgY2hhbmdlcyB0aGUgZXhwYW5kaW5nIGZ1bmN0aW9uIGJ5IGFkZGluZyBhIHJvdGF0ZSBvZiAxCisgICBiaXQuICBUaGFua3MgdG8gSmltIEdpbGxvZ2x5LCBqaW1AcmFuZC5vcmcsIGFuZCBhbiBhbm9ueW1vdXMgY29udHJpYnV0b3IKKyAgIGZvciB0aGlzIGluZm9ybWF0aW9uICovCisKKyNkZWZpbmUgZXhwYW5kKFcsaSkgKCBXWyBpICYgMTUgXSA9IFJPVEwoIDEsICggV1sgaSAmIDE1IF0gXiBXWyAoaSAtIDE0KSAmIDE1IF0gXiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1sgKGkgLSA4KSAmIDE1IF0gXiBXWyAoaSAtIDMpICYgMTUgXSApICkgKQorCisKKy8qIFRoZSBwcm90b3R5cGUgU0hBIHN1Yi1yb3VuZC4gIFRoZSBmdW5kYW1lbnRhbCBzdWItcm91bmQgaXM6CisKKyAgICAgICAgYScgPSBlICsgUk9UTCggNSwgYSApICsgZiggYiwgYywgZCApICsgayArIGRhdGE7CisgICAgICAgIGInID0gYTsKKyAgICAgICAgYycgPSBST1RMKCAzMCwgYiApOworICAgICAgICBkJyA9IGM7CisgICAgICAgIGUnID0gZDsKKworICAgYnV0IHRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgdW5yb2xsaW5nIHRoZSBsb29wIDUgdGltZXMgYW5kIHJlbmFtaW5nIHRoZQorICAgdmFyaWFibGVzICggZSwgYSwgYiwgYywgZCApID0gKCBhJywgYicsIGMnLCBkJywgZScgKSBlYWNoIGl0ZXJhdGlvbi4KKyAgIFRoaXMgY29kZSBpcyB0aGVuIHJlcGxpY2F0ZWQgMjAgdGltZXMgZm9yIGVhY2ggb2YgdGhlIDQgZnVuY3Rpb25zLCB1c2luZworICAgdGhlIG5leHQgMjAgdmFsdWVzIGZyb20gdGhlIFdbXSBhcnJheSBlYWNoIHRpbWUgKi8KKworI2RlZmluZSBzdWJSb3VuZChhLCBiLCBjLCBkLCBlLCBmLCBrLCBkYXRhKSBcCisgICAoIGUgKz0gUk9UTCggNSwgYSApICsgZiggYiwgYywgZCApICsgayArIGRhdGEsIGIgPSBST1RMKCAzMCwgYiApICkKKworI2VuZGlmIC8qICFET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMgKi8KKworLyogUGVyZm9ybSB0aGUgU0hBIHRyYW5zZm9ybWF0aW9uLiAgTm90ZSB0aGF0IHRoaXMgY29kZSwgbGlrZSBNRDUsIHNlZW1zIHRvCisgICBicmVhayBzb21lIG9wdGltaXppbmcgY29tcGlsZXJzIGR1ZSB0byB0aGUgY29tcGxleGl0eSBvZiB0aGUgZXhwcmVzc2lvbnMKKyAgIGFuZCB0aGUgc2l6ZSBvZiB0aGUgYmFzaWMgYmxvY2suICBJdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHNwbGl0IGl0IGludG8KKyAgIHNlY3Rpb25zLCBlLmcuIGJhc2VkIG9uIHRoZSBmb3VyIHN1YnJvdW5kcworCisgICBOb3RlIHRoYXQgdGhpcyBjb3JydXB0cyB0aGUgY29udGV4dC0+ZGF0YSBhcmVhICovCisKK3N0YXRpYyB2b2lkCitTSEFUcmFuc2Zvcm0oZGJ1c191aW50MzJfdCAqZGlnZXN0LCBkYnVzX3VpbnQzMl90ICpkYXRhKQoreworICBkYnVzX3VpbnQzMl90IEEsIEIsIEMsIEQsIEU7ICAgICAvKiBMb2NhbCB2YXJzICovCisgIGRidXNfdWludDMyX3QgZURhdGFbMTZdOyAgICAgICAvKiBFeHBhbmRlZCBkYXRhICovCisKKyAgLyogU2V0IHVwIGZpcnN0IGJ1ZmZlciBhbmQgbG9jYWwgZGF0YSBidWZmZXIgKi8KKyAgQSA9IGRpZ2VzdFswXTsKKyAgQiA9IGRpZ2VzdFsxXTsKKyAgQyA9IGRpZ2VzdFsyXTsKKyAgRCA9IGRpZ2VzdFszXTsKKyAgRSA9IGRpZ2VzdFs0XTsKKyAgbWVtbW92ZSAoZURhdGEsIGRhdGEsIFNIQV9EQVRBU0laRSk7CisKKyAgLyogSGVhdnkgbWFuZ2xpbmcsIGluIDQgc3ViLXJvdW5kcyBvZiAyMCBpbnRlcmF0aW9ucyBlYWNoLiAqLworICBzdWJSb3VuZCAoQSwgQiwgQywgRCwgRSwgZjEsIEsxLCBlRGF0YVswXSk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmMSwgSzEsIGVEYXRhWzFdKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGYxLCBLMSwgZURhdGFbMl0pOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjEsIEsxLCBlRGF0YVszXSk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmMSwgSzEsIGVEYXRhWzRdKTsKKyAgc3ViUm91bmQgKEEsIEIsIEMsIEQsIEUsIGYxLCBLMSwgZURhdGFbNV0pOworICBzdWJSb3VuZCAoRSwgQSwgQiwgQywgRCwgZjEsIEsxLCBlRGF0YVs2XSk7CisgIHN1YlJvdW5kIChELCBFLCBBLCBCLCBDLCBmMSwgSzEsIGVEYXRhWzddKTsKKyAgc3ViUm91bmQgKEMsIEQsIEUsIEEsIEIsIGYxLCBLMSwgZURhdGFbOF0pOworICBzdWJSb3VuZCAoQiwgQywgRCwgRSwgQSwgZjEsIEsxLCBlRGF0YVs5XSk7CisgIHN1YlJvdW5kIChBLCBCLCBDLCBELCBFLCBmMSwgSzEsIGVEYXRhWzEwXSk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmMSwgSzEsIGVEYXRhWzExXSk7CisgIHN1YlJvdW5kIChELCBFLCBBLCBCLCBDLCBmMSwgSzEsIGVEYXRhWzEyXSk7CisgIHN1YlJvdW5kIChDLCBELCBFLCBBLCBCLCBmMSwgSzEsIGVEYXRhWzEzXSk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmMSwgSzEsIGVEYXRhWzE0XSk7CisgIHN1YlJvdW5kIChBLCBCLCBDLCBELCBFLCBmMSwgSzEsIGVEYXRhWzE1XSk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmMSwgSzEsIGV4cGFuZCAoIGVEYXRhLCAxNikgKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGYxLCBLMSwgZXhwYW5kICggZURhdGEsIDE3KSApOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjEsIEsxLCBleHBhbmQgKCBlRGF0YSwgMTgpICk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmMSwgSzEsIGV4cGFuZCAoIGVEYXRhLCAxOSkgKTsKKworICBzdWJSb3VuZCAoQSwgQiwgQywgRCwgRSwgZjIsIEsyLCBleHBhbmQgKCBlRGF0YSwgMjApICk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAyMSkgKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGYyLCBLMiwgZXhwYW5kICggZURhdGEsIDIyKSApOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjIsIEsyLCBleHBhbmQgKCBlRGF0YSwgMjMpICk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAyNCkgKTsKKyAgc3ViUm91bmQgKEEsIEIsIEMsIEQsIEUsIGYyLCBLMiwgZXhwYW5kICggZURhdGEsIDI1KSApOworICBzdWJSb3VuZCAoRSwgQSwgQiwgQywgRCwgZjIsIEsyLCBleHBhbmQgKCBlRGF0YSwgMjYpICk7CisgIHN1YlJvdW5kIChELCBFLCBBLCBCLCBDLCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAyNykgKTsKKyAgc3ViUm91bmQgKEMsIEQsIEUsIEEsIEIsIGYyLCBLMiwgZXhwYW5kICggZURhdGEsIDI4KSApOworICBzdWJSb3VuZCAoQiwgQywgRCwgRSwgQSwgZjIsIEsyLCBleHBhbmQgKCBlRGF0YSwgMjkpICk7CisgIHN1YlJvdW5kIChBLCBCLCBDLCBELCBFLCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAzMCkgKTsKKyAgc3ViUm91bmQgKEUsIEEsIEIsIEMsIEQsIGYyLCBLMiwgZXhwYW5kICggZURhdGEsIDMxKSApOworICBzdWJSb3VuZCAoRCwgRSwgQSwgQiwgQywgZjIsIEsyLCBleHBhbmQgKCBlRGF0YSwgMzIpICk7CisgIHN1YlJvdW5kIChDLCBELCBFLCBBLCBCLCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAzMykgKTsKKyAgc3ViUm91bmQgKEIsIEMsIEQsIEUsIEEsIGYyLCBLMiwgZXhwYW5kICggZURhdGEsIDM0KSApOworICBzdWJSb3VuZCAoQSwgQiwgQywgRCwgRSwgZjIsIEsyLCBleHBhbmQgKCBlRGF0YSwgMzUpICk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAzNikgKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGYyLCBLMiwgZXhwYW5kICggZURhdGEsIDM3KSApOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjIsIEsyLCBleHBhbmQgKCBlRGF0YSwgMzgpICk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAzOSkgKTsKKworICBzdWJSb3VuZCAoQSwgQiwgQywgRCwgRSwgZjMsIEszLCBleHBhbmQgKCBlRGF0YSwgNDApICk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA0MSkgKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGYzLCBLMywgZXhwYW5kICggZURhdGEsIDQyKSApOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjMsIEszLCBleHBhbmQgKCBlRGF0YSwgNDMpICk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA0NCkgKTsKKyAgc3ViUm91bmQgKEEsIEIsIEMsIEQsIEUsIGYzLCBLMywgZXhwYW5kICggZURhdGEsIDQ1KSApOworICBzdWJSb3VuZCAoRSwgQSwgQiwgQywgRCwgZjMsIEszLCBleHBhbmQgKCBlRGF0YSwgNDYpICk7CisgIHN1YlJvdW5kIChELCBFLCBBLCBCLCBDLCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA0NykgKTsKKyAgc3ViUm91bmQgKEMsIEQsIEUsIEEsIEIsIGYzLCBLMywgZXhwYW5kICggZURhdGEsIDQ4KSApOworICBzdWJSb3VuZCAoQiwgQywgRCwgRSwgQSwgZjMsIEszLCBleHBhbmQgKCBlRGF0YSwgNDkpICk7CisgIHN1YlJvdW5kIChBLCBCLCBDLCBELCBFLCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA1MCkgKTsKKyAgc3ViUm91bmQgKEUsIEEsIEIsIEMsIEQsIGYzLCBLMywgZXhwYW5kICggZURhdGEsIDUxKSApOworICBzdWJSb3VuZCAoRCwgRSwgQSwgQiwgQywgZjMsIEszLCBleHBhbmQgKCBlRGF0YSwgNTIpICk7CisgIHN1YlJvdW5kIChDLCBELCBFLCBBLCBCLCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA1MykgKTsKKyAgc3ViUm91bmQgKEIsIEMsIEQsIEUsIEEsIGYzLCBLMywgZXhwYW5kICggZURhdGEsIDU0KSApOworICBzdWJSb3VuZCAoQSwgQiwgQywgRCwgRSwgZjMsIEszLCBleHBhbmQgKCBlRGF0YSwgNTUpICk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA1NikgKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGYzLCBLMywgZXhwYW5kICggZURhdGEsIDU3KSApOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjMsIEszLCBleHBhbmQgKCBlRGF0YSwgNTgpICk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA1OSkgKTsKKworICBzdWJSb3VuZCAoQSwgQiwgQywgRCwgRSwgZjQsIEs0LCBleHBhbmQgKCBlRGF0YSwgNjApICk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA2MSkgKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGY0LCBLNCwgZXhwYW5kICggZURhdGEsIDYyKSApOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjQsIEs0LCBleHBhbmQgKCBlRGF0YSwgNjMpICk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA2NCkgKTsKKyAgc3ViUm91bmQgKEEsIEIsIEMsIEQsIEUsIGY0LCBLNCwgZXhwYW5kICggZURhdGEsIDY1KSApOworICBzdWJSb3VuZCAoRSwgQSwgQiwgQywgRCwgZjQsIEs0LCBleHBhbmQgKCBlRGF0YSwgNjYpICk7CisgIHN1YlJvdW5kIChELCBFLCBBLCBCLCBDLCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA2NykgKTsKKyAgc3ViUm91bmQgKEMsIEQsIEUsIEEsIEIsIGY0LCBLNCwgZXhwYW5kICggZURhdGEsIDY4KSApOworICBzdWJSb3VuZCAoQiwgQywgRCwgRSwgQSwgZjQsIEs0LCBleHBhbmQgKCBlRGF0YSwgNjkpICk7CisgIHN1YlJvdW5kIChBLCBCLCBDLCBELCBFLCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA3MCkgKTsKKyAgc3ViUm91bmQgKEUsIEEsIEIsIEMsIEQsIGY0LCBLNCwgZXhwYW5kICggZURhdGEsIDcxKSApOworICBzdWJSb3VuZCAoRCwgRSwgQSwgQiwgQywgZjQsIEs0LCBleHBhbmQgKCBlRGF0YSwgNzIpICk7CisgIHN1YlJvdW5kIChDLCBELCBFLCBBLCBCLCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA3MykgKTsKKyAgc3ViUm91bmQgKEIsIEMsIEQsIEUsIEEsIGY0LCBLNCwgZXhwYW5kICggZURhdGEsIDc0KSApOworICBzdWJSb3VuZCAoQSwgQiwgQywgRCwgRSwgZjQsIEs0LCBleHBhbmQgKCBlRGF0YSwgNzUpICk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA3NikgKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGY0LCBLNCwgZXhwYW5kICggZURhdGEsIDc3KSApOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjQsIEs0LCBleHBhbmQgKCBlRGF0YSwgNzgpICk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA3OSkgKTsKKworICAvKiBCdWlsZCBtZXNzYWdlIGRpZ2VzdCAqLworICBkaWdlc3RbMF0gKz0gQTsKKyAgZGlnZXN0WzFdICs9IEI7CisgIGRpZ2VzdFsyXSArPSBDOworICBkaWdlc3RbM10gKz0gRDsKKyAgZGlnZXN0WzRdICs9IEU7Cit9CisKKy8qIFdoZW4gcnVuIG9uIGEgbGl0dGxlLWVuZGlhbiBDUFUgd2UgbmVlZCB0byBwZXJmb3JtIGJ5dGUgcmV2ZXJzYWwgb24gYW4KKyAgIGFycmF5IG9mIGxvbmd3b3Jkcy4gKi8KKworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorI2RlZmluZSBzd2FwX3dvcmRzKGJ1ZmZlciwgYnl0ZV9jb3VudCkKKyNlbHNlCitzdGF0aWMgdm9pZAorc3dhcF93b3JkcyAoZGJ1c191aW50MzJfdCAqYnVmZmVyLAorICAgICAgICAgICAgaW50ICAgICAgICAgICAgYnl0ZV9jb3VudCkKK3sKKyAgYnl0ZV9jb3VudCAvPSBzaXplb2YgKGRidXNfdWludDMyX3QpOworICB3aGlsZSAoYnl0ZV9jb3VudC0tKQorICAgIHsKKyAgICAgICpidWZmZXIgPSBEQlVTX1VJTlQzMl9TV0FQX0xFX0JFICgqYnVmZmVyKTsKKyAgICAgICsrYnVmZmVyOworICAgIH0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorc2hhX2luaXQgKERCdXNTSEFDb250ZXh0ICpjb250ZXh0KQoreworICAvKiBTZXQgdGhlIGgtdmFycyB0byB0aGVpciBpbml0aWFsIHZhbHVlcyAqLworICBjb250ZXh0LT5kaWdlc3RbMF0gPSBoMGluaXQ7CisgIGNvbnRleHQtPmRpZ2VzdFsxXSA9IGgxaW5pdDsKKyAgY29udGV4dC0+ZGlnZXN0WzJdID0gaDJpbml0OworICBjb250ZXh0LT5kaWdlc3RbM10gPSBoM2luaXQ7CisgIGNvbnRleHQtPmRpZ2VzdFs0XSA9IGg0aW5pdDsKKworICAvKiBJbml0aWFsaXNlIGJpdCBjb3VudCAqLworICBjb250ZXh0LT5jb3VudF9sbyA9IGNvbnRleHQtPmNvdW50X2hpID0gMDsKK30KKworc3RhdGljIHZvaWQKK3NoYV9hcHBlbmQgKERCdXNTSEFDb250ZXh0ICAgICAgKmNvbnRleHQsCisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmZXIsCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICBjb3VudCkKK3sKKyAgZGJ1c191aW50MzJfdCB0bXA7CisgIHVuc2lnbmVkIGludCBkYXRhQ291bnQ7CisKKyAgLyogVXBkYXRlIGJpdGNvdW50ICovCisgIHRtcCA9IGNvbnRleHQtPmNvdW50X2xvOworICBpZiAoKCBjb250ZXh0LT5jb3VudF9sbyA9IHRtcCArICggKCBkYnVzX3VpbnQzMl90KSBjb3VudCA8PCAzKSApIDwgdG1wKQorICAgIGNvbnRleHQtPmNvdW50X2hpKys7ICAgICAgICAgICAgIC8qIENhcnJ5IGZyb20gbG93IHRvIGhpZ2ggKi8KKyAgY29udGV4dC0+Y291bnRfaGkgKz0gY291bnQgPj4gMjk7CisKKyAgLyogR2V0IGNvdW50IG9mIGJ5dGVzIGFscmVhZHkgaW4gZGF0YSAqLworICBkYXRhQ291bnQgPSAoaW50KSAodG1wID4+IDMpICYgMHgzRjsKKworICAvKiBIYW5kbGUgYW55IGxlYWRpbmcgb2RkLXNpemVkIGNodW5rcyAqLworICBpZiAoZGF0YUNvdW50KQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKnAgPSAodW5zaWduZWQgY2hhciAqKSBjb250ZXh0LT5kYXRhICsgZGF0YUNvdW50OworCisgICAgICBkYXRhQ291bnQgPSBTSEFfREFUQVNJWkUgLSBkYXRhQ291bnQ7CisgICAgICBpZiAoY291bnQgPCBkYXRhQ291bnQpCisgICAgICAgIHsKKyAgICAgICAgICBtZW1tb3ZlIChwLCBidWZmZXIsIGNvdW50KTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIG1lbW1vdmUgKHAsIGJ1ZmZlciwgZGF0YUNvdW50KTsKKyAgICAgIHN3YXBfd29yZHMgKGNvbnRleHQtPmRhdGEsIFNIQV9EQVRBU0laRSk7CisgICAgICBTSEFUcmFuc2Zvcm0gKGNvbnRleHQtPmRpZ2VzdCwgY29udGV4dC0+ZGF0YSk7CisgICAgICBidWZmZXIgKz0gZGF0YUNvdW50OworICAgICAgY291bnQgLT0gZGF0YUNvdW50OworICAgIH0KKworICAvKiBQcm9jZXNzIGRhdGEgaW4gU0hBX0RBVEFTSVpFIGNodW5rcyAqLworICB3aGlsZSAoY291bnQgPj0gU0hBX0RBVEFTSVpFKQorICAgIHsKKyAgICAgIG1lbW1vdmUgKGNvbnRleHQtPmRhdGEsIGJ1ZmZlciwgU0hBX0RBVEFTSVpFKTsKKyAgICAgIHN3YXBfd29yZHMgKGNvbnRleHQtPmRhdGEsIFNIQV9EQVRBU0laRSk7CisgICAgICBTSEFUcmFuc2Zvcm0gKGNvbnRleHQtPmRpZ2VzdCwgY29udGV4dC0+ZGF0YSk7CisgICAgICBidWZmZXIgKz0gU0hBX0RBVEFTSVpFOworICAgICAgY291bnQgLT0gU0hBX0RBVEFTSVpFOworICAgIH0KKworICAvKiBIYW5kbGUgYW55IHJlbWFpbmluZyBieXRlcyBvZiBkYXRhLiAqLworICBtZW1tb3ZlIChjb250ZXh0LT5kYXRhLCBidWZmZXIsIGNvdW50KTsKK30KKworCisvKiBGaW5hbCB3cmFwdXAgLSBwYWQgdG8gU0hBX0RBVEFTSVpFLWJ5dGUgYm91bmRhcnkgd2l0aCB0aGUgYml0IHBhdHRlcm4KKyAgIDEgMCogKDY0LWJpdCBjb3VudCBvZiBiaXRzIHByb2Nlc3NlZCwgTVNCLWZpcnN0KSAqLworCitzdGF0aWMgdm9pZAorc2hhX2ZpbmlzaCAoREJ1c1NIQUNvbnRleHQgKmNvbnRleHQsIHVuc2lnbmVkIGNoYXIgZGlnZXN0WzIwXSkKK3sKKyAgaW50IGNvdW50OworICB1bnNpZ25lZCBjaGFyICpkYXRhX3A7CisKKyAgLyogQ29tcHV0ZSBudW1iZXIgb2YgYnl0ZXMgbW9kIDY0ICovCisgIGNvdW50ID0gKGludCkgY29udGV4dC0+Y291bnRfbG87CisgIGNvdW50ID0gKGNvdW50ID4+IDMpICYgMHgzRjsKKworICAvKiBTZXQgdGhlIGZpcnN0IGNoYXIgb2YgcGFkZGluZyB0byAweDgwLiAgVGhpcyBpcyBzYWZlIHNpbmNlIHRoZXJlIGlzCisgICAgIGFsd2F5cyBhdCBsZWFzdCBvbmUgYnl0ZSBmcmVlICovCisgIGRhdGFfcCA9ICh1bnNpZ25lZCBjaGFyICopIGNvbnRleHQtPmRhdGEgKyBjb3VudDsKKyAgKmRhdGFfcCsrID0gMHg4MDsKKworICAvKiBCeXRlcyBvZiBwYWRkaW5nIG5lZWRlZCB0byBtYWtlIDY0IGJ5dGVzICovCisgIGNvdW50ID0gU0hBX0RBVEFTSVpFIC0gMSAtIGNvdW50OworCisgIC8qIFBhZCBvdXQgdG8gNTYgbW9kIDY0ICovCisgIGlmIChjb3VudCA8IDgpCisgICAgeworICAgICAgLyogVHdvIGxvdHMgb2YgcGFkZGluZzogIFBhZCB0aGUgZmlyc3QgYmxvY2sgdG8gNjQgYnl0ZXMgKi8KKyAgICAgIG1lbXNldCAoZGF0YV9wLCAwLCBjb3VudCk7CisgICAgICBzd2FwX3dvcmRzIChjb250ZXh0LT5kYXRhLCBTSEFfREFUQVNJWkUpOworICAgICAgU0hBVHJhbnNmb3JtIChjb250ZXh0LT5kaWdlc3QsIGNvbnRleHQtPmRhdGEpOworCisgICAgICAvKiBOb3cgZmlsbCB0aGUgbmV4dCBibG9jayB3aXRoIDU2IGJ5dGVzICovCisgICAgICBtZW1zZXQgKGNvbnRleHQtPmRhdGEsIDAsIFNIQV9EQVRBU0laRSAtIDgpOworICAgIH0KKyAgZWxzZQorICAgIC8qIFBhZCBibG9jayB0byA1NiBieXRlcyAqLworICAgIG1lbXNldCAoZGF0YV9wLCAwLCBjb3VudCAtIDgpOworCisgIC8qIEFwcGVuZCBsZW5ndGggaW4gYml0cyBhbmQgdHJhbnNmb3JtICovCisgIGNvbnRleHQtPmRhdGFbMTRdID0gY29udGV4dC0+Y291bnRfaGk7CisgIGNvbnRleHQtPmRhdGFbMTVdID0gY29udGV4dC0+Y291bnRfbG87CisKKyAgc3dhcF93b3JkcyAoY29udGV4dC0+ZGF0YSwgU0hBX0RBVEFTSVpFIC0gOCk7CisgIFNIQVRyYW5zZm9ybSAoY29udGV4dC0+ZGlnZXN0LCBjb250ZXh0LT5kYXRhKTsKKyAgc3dhcF93b3JkcyAoY29udGV4dC0+ZGlnZXN0LCBTSEFfRElHRVNUU0laRSk7CisgIG1lbW1vdmUgKGRpZ2VzdCwgY29udGV4dC0+ZGlnZXN0LCBTSEFfRElHRVNUU0laRSk7Cit9CisKKy8qKiBAfSAqLyAvKiBFbmQgb2YgaW50ZXJuYWxzICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c1NIQQorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBJbml0aWFsaXplcyB0aGUgU0hBIGNvbnRleHQuCisgKgorICogQHBhcmFtIGNvbnRleHQgYW4gdW5pbml0aWFsaXplZCBjb250ZXh0LCB0eXBpY2FsbHkgb24gdGhlIHN0YWNrLgorICovCit2b2lkCitfZGJ1c19zaGFfaW5pdCAoREJ1c1NIQUNvbnRleHQgKmNvbnRleHQpCit7CisgIHNoYV9pbml0IChjb250ZXh0KTsKK30KKworLyoqCisgKiBGZWVkcyBtb3JlIGRhdGEgaW50byBhbiBleGlzdGluZyBzaGFzdW0gY29tcHV0YXRpb24uCisgKgorICogQHBhcmFtIGNvbnRleHQgdGhlIFNIQSBjb250ZXh0CisgKiBAcGFyYW0gZGF0YSB0aGUgYWRkaXRpb25hbCBkYXRhIHRvIGhhc2gKKyAqLwordm9pZAorX2RidXNfc2hhX3VwZGF0ZSAoREJ1c1NIQUNvbnRleHQgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmRhdGEpCit7CisgIHVuc2lnbmVkIGludCBpbnB1dExlbjsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqaW5wdXQ7CisKKyAgaW5wdXQgPSAoY29uc3QgdW5zaWduZWQgY2hhciopIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZGF0YSk7CisgIGlucHV0TGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpOworCisgIHNoYV9hcHBlbmQgKGNvbnRleHQsIGlucHV0LCBpbnB1dExlbik7Cit9CisKKy8qKgorICogU0hBIGZpbmFsaXphdGlvbi4gRW5kcyBhbiBTSEEgbWVzc2FnZS1kaWdlc3Qgb3BlcmF0aW9uLCB3cml0aW5nIHRoZQorICogdGhlIG1lc3NhZ2UgZGlnZXN0IGFuZCB6ZXJvaW5nIHRoZSBjb250ZXh0LiAgVGhlIHJlc3VsdHMgYXJlCisgKiByZXR1cm5lZCBhcyBhIHJhdyAyMC1ieXRlIGRpZ2VzdCwgbm90IGFzIHRoZSBhc2NpaS1oZXgtZGlnaXRzCisgKiBzdHJpbmcgZm9ybSBvZiB0aGUgZGlnZXN0LgorICoKKyAqIEBwYXJhbSBjb250ZXh0IHRoZSBTSEEgY29udGV4dAorICogQHBhcmFtIHJlc3VsdHMgc3RyaW5nIHRvIGFwcGVuZCB0aGUgMjAtYnl0ZSBTSEEgZGlnZXN0IHRvCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkgdG8gYXBwZW5kIHRoZSBkaWdlc3QKKyAqCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zaGFfZmluYWwgKERCdXNTSEFDb250ZXh0ICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKnJlc3VsdHMpCit7CisgIHVuc2lnbmVkIGNoYXIgZGlnZXN0WzIwXTsKKworICBzaGFfZmluaXNoIChjb250ZXh0LCBkaWdlc3QpOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9sZW4gKHJlc3VsdHMsIGRpZ2VzdCwgMjApKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBzb21lIGtpbmQgb2Ygc2VjdXJpdHkgcGFyYW5vaWEsIHRob3VnaCBpdCBzZWVtcyBwb2ludGxlc3MKKyAgICogdG8gbWUgZ2l2ZW4gdGhlIG5vbnplcm9lZCBzdHVmZiBmbHlpbmcgYXJvdW5kCisgICAqLworICBfREJVU19aRVJPKCpjb250ZXh0KTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDb21wdXRlcyB0aGUgQVNDSUkgaGV4LWVuY29kZWQgc2hhc3VtIG9mIHRoZSBnaXZlbiBkYXRhIGFuZAorICogYXBwZW5kcyBpdCB0byB0aGUgb3V0cHV0IHN0cmluZy4KKyAqCisgKiBAcGFyYW0gZGF0YSBpbnB1dCBkYXRhIHRvIGJlIGhhc2hlZAorICogQHBhcmFtIGFzY2lpX291dHB1dCBzdHJpbmcgdG8gYXBwZW5kIEFTQ0lJIHNoYXN1bSB0bworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zaGFfY29tcHV0ZSAoY29uc3QgREJ1c1N0cmluZyAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICphc2NpaV9vdXRwdXQpCit7CisgIERCdXNTSEFDb250ZXh0IGNvbnRleHQ7CisgIERCdXNTdHJpbmcgZGlnZXN0OworCisgIF9kYnVzX3NoYV9pbml0ICgmY29udGV4dCk7CisKKyAgX2RidXNfc2hhX3VwZGF0ZSAoJmNvbnRleHQsIGRhdGEpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZkaWdlc3QpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3NoYV9maW5hbCAoJmNvbnRleHQsICZkaWdlc3QpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAoJmRpZ2VzdCwgMCwgYXNjaWlfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYXNjaWlfb3V0cHV0KSkpCisgICAgZ290byBlcnJvcjsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRpZ2VzdCk7CisgIAorICByZXR1cm4gVFJVRTsKKworIGVycm9yOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRpZ2VzdCk7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqIEB9ICovIC8qIGVuZCBvZiBleHBvcnRlZCBmdW5jdGlvbnMgKi8KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NoYV9iaW5hcnkgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlucHV0LAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgaW5wdXRfbGVuLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAqZXhwZWN0ZWQpCit7CisgIERCdXNTdHJpbmcgaW5wdXRfc3RyOworICBEQnVzU3RyaW5nIGV4cGVjdGVkX3N0cjsKKyAgREJ1c1N0cmluZyByZXN1bHRzOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbiAoJmlucHV0X3N0ciwgaW5wdXQsIGlucHV0X2xlbik7CisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZXhwZWN0ZWRfc3RyLCBleHBlY3RlZCk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnJlc3VsdHMpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSBmb3IgU0hBLTEgcmVzdWx0cyIpOworCisgIGlmICghX2RidXNfc2hhX2NvbXB1dGUgKCZpbnB1dF9zdHIsICZyZXN1bHRzKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkgZm9yIFNIQS0xIHJlc3VsdHMiKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbCAoJmV4cGVjdGVkX3N0ciwgJnJlc3VsdHMpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RlZCBoYXNoICVzIGdvdCAlcyBmb3IgU0hBLTEgc3VtXG4iLAorICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZyZXN1bHRzKSk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnJlc3VsdHMpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnJlc3VsdHMpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19zaGFfc3RyIChjb25zdCBjaGFyICppbnB1dCwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmV4cGVjdGVkKQoreworICByZXR1cm4gY2hlY2tfc2hhX2JpbmFyeSAoaW5wdXQsIHN0cmxlbiAoaW5wdXQpLCBleHBlY3RlZCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZGVjb2RlX2NvbXBhY3Rfc3RyaW5nIChjb25zdCBEQnVzU3RyaW5nICpsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpkZWNvZGVkKQoreworICBpbnQgbl9iaXRzOworICBkYnVzX2Jvb2xfdCBjdXJyZW50X2I7CisgIGludCBvZmZzZXQ7CisgIGludCBuZXh0OworICBsb25nIHZhbDsKKyAgaW50IGxlbmd0aF9ieXRlczsKKyAgCisgIG9mZnNldCA9IDA7CisgIG5leHQgPSAwOworCisgIGlmICghX2RidXNfc3RyaW5nX3BhcnNlX2ludCAobGluZSwgb2Zmc2V0LCAmdmFsLCAmbmV4dCkpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiY291bGQgbm90IHBhcnNlIGxlbmd0aCBhdCBzdGFydCBvZiBjb21wYWN0IHN0cmluZzogJXNcbiIsCisgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGxpbmUpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgKGxpbmUsIG5leHQsICZuZXh0KTsKKyAgCisgIG9mZnNldCA9IG5leHQ7CisgIGlmICghX2RidXNfc3RyaW5nX3BhcnNlX2ludCAobGluZSwgb2Zmc2V0LCAmdmFsLCAmbmV4dCkpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiY291bGQgbm90IHBhcnNlIHN0YXJ0IGJpdCAnYicgaW4gY29tcGFjdCBzdHJpbmc6ICVzXG4iLAorICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChsaW5lKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKCEodmFsID09IDAgfHwgdmFsID09IDEpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgInRoZSB2YWx1ZSAnYicgbXVzdCBiZSAwIG9yIDEsIHNlZSBzaGEtMS9SZWFkbWUudHh0XG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgKGxpbmUsIG5leHQsICZuZXh0KTsKKyAgCisgIGN1cnJlbnRfYiA9IHZhbDsKKyAgbl9iaXRzID0gMDsKKyAgCisgIHdoaWxlIChuZXh0IDwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGxpbmUpKQorICAgIHsKKyAgICAgIGludCB0b3RhbF9iaXRzOworICAgICAgCisgICAgICBvZmZzZXQgPSBuZXh0OworCisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChsaW5lLCBvZmZzZXQpID09ICdeJykKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX3BhcnNlX2ludCAobGluZSwgb2Zmc2V0LCAmdmFsLCAmbmV4dCkpCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJjb3VsZCBub3QgcGFyc2UgYml0IGNvdW50IGluIGNvbXBhY3Qgc3RyaW5nXG4iKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgLyogV2Ugbm93IGFwcGVuZCAidmFsIiBjb3BpZXMgb2YgImN1cnJlbnRfYiIgYml0cyB0byB0aGUgc3RyaW5nICovCisgICAgICB0b3RhbF9iaXRzID0gbl9iaXRzICsgdmFsOworICAgICAgd2hpbGUgKG5fYml0cyA8IHRvdGFsX2JpdHMpCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgYnl0ZV9jb250YWluaW5nX25leHRfYml0ID0gbl9iaXRzIC8gODsKKyAgICAgICAgICBpbnQgYml0X2NvbnRhaW5pbmdfbmV4dF9iaXQgPSA3IC0gKG5fYml0cyAlIDgpOworICAgICAgICAgIHVuc2lnbmVkIGNoYXIgb2xkX2J5dGU7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKGJ5dGVfY29udGFpbmluZ19uZXh0X2JpdCA+PSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGVjb2RlZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKGRlY29kZWQsIGJ5dGVfY29udGFpbmluZ19uZXh0X2JpdCArIDEpKQorICAgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSB0byBleHRlbmQgdG8gbmV4dCBieXRlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBvbGRfYnl0ZSA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZGVjb2RlZCwgYnl0ZV9jb250YWluaW5nX25leHRfYml0KTsKKyAgICAgICAgICBvbGRfYnl0ZSB8PSBjdXJyZW50X2IgPDwgYml0X2NvbnRhaW5pbmdfbmV4dF9iaXQ7CisKKyNpZiAwCisgICAgICAgICAgcHJpbnRmICgiQXBwZW5kaW5nIGJpdCAlZCB0byBieXRlICVkIGF0IGJpdCAlZCByZXN1bHRpbmcgaW4gYnl0ZSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgY3VycmVudF9iLCBieXRlX2NvbnRhaW5pbmdfbmV4dF9iaXQsCisgICAgICAgICAgICAgICAgICBiaXRfY29udGFpbmluZ19uZXh0X2JpdCwgb2xkX2J5dGUpOworI2VuZGlmCisgICAgICAgICAgCisgICAgICAgICAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChkZWNvZGVkLCBieXRlX2NvbnRhaW5pbmdfbmV4dF9iaXQsIG9sZF9ieXRlKTsKKyAgICAgICAgICAKKyAgICAgICAgICArK25fYml0czsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAobGluZSwgbmV4dCwgJm5leHQpOworICAgICAgICAgIAorICAgICAgY3VycmVudF9iID0gIWN1cnJlbnRfYjsKKyAgICB9CisKKyAgbGVuZ3RoX2J5dGVzID0gKG5fYml0cyAvIDggKyAoKG5fYml0cyAlIDgpID8gMSA6IDApKTsKKyAgCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGVjb2RlZCkgIT0gbGVuZ3RoX2J5dGVzKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkV4cGVjdGVkIGxlbmd0aCAlZCBieXRlcyAlZCBiaXRzIGZvciBjb21wYWN0IHN0cmluZywgZ290ICVkIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgbGVuZ3RoX2J5dGVzLCBuX2JpdHMsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkZWNvZGVkKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2V0X25leHRfZXhwZWN0ZWRfcmVzdWx0IChEQnVzU3RyaW5nICpyZXN1bHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICpyZXN1bHQpCit7CisgIERCdXNTdHJpbmcgbGluZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIHJldHZhbCA9IEZBTFNFOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmxpbmUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworICAKKyBuZXh0X2l0ZXJhdGlvbjoKKyAgd2hpbGUgKF9kYnVzX3N0cmluZ19wb3BfbGluZSAocmVzdWx0cywgJmxpbmUpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19kZWxldGVfbGVhZGluZ19ibGFua3MgKCZsaW5lKTsKKworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbGluZSkgPT0gMCkKKyAgICAgICAgZ290byBuZXh0X2l0ZXJhdGlvbjsKKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsICIjIikpCisgICAgICAgIGdvdG8gbmV4dF9pdGVyYXRpb247CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLCAiSD4iKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIGRvbid0IHByaW50ICovCisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsICJEPiIpIHx8CisgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLCAiPEQiKSkKKyAgICAgICAgZ290byBuZXh0X2l0ZXJhdGlvbjsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGludCBpOworICAgICAgICAgIAorICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX21vdmUgKCZsaW5lLCAwLCByZXN1bHQsIDApKQorICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICAgICAgICBpID0gMDsKKyAgICAgICAgICB3aGlsZSAoaSA8IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChyZXN1bHQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBzd2l0Y2ggKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAocmVzdWx0LCBpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAnQSc6CisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKHJlc3VsdCwgaSwgJ2EnKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ0InOgorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChyZXN1bHQsIGksICdiJyk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAocmVzdWx0LCBpLCAnYycpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnRCc6CisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKHJlc3VsdCwgaSwgJ2QnKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ0UnOgorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChyZXN1bHQsIGksICdlJyk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdGJzoKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAocmVzdWx0LCBpLCAnZicpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnXic6CisgICAgICAgICAgICAgICAgY2FzZSAnICc6CisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZGVsZXRlIChyZXN1bHQsIGksIDEpOworICAgICAgICAgICAgICAgICAgLS1pOyAvKiB0byBvZmZzZXQgKytpIGJlbG93ICovCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAKKyAgcmV0dmFsID0gVFJVRTsKKyAgCisgIC8qIG91dDogKi8KKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZsaW5lKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citwcm9jZXNzX3Rlc3RfZGF0YSAoY29uc3QgY2hhciAqdGVzdF9kYXRhX2RpcikKK3sKKyAgREJ1c1N0cmluZyB0ZXN0c19maWxlOworICBEQnVzU3RyaW5nIHJlc3VsdHNfZmlsZTsKKyAgREJ1c1N0cmluZyB0ZXN0czsKKyAgREJ1c1N0cmluZyByZXN1bHRzOworICBEQnVzU3RyaW5nIGxpbmU7CisgIERCdXNTdHJpbmcgdG1wOworICBpbnQgbGluZV9ubzsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBpbnQgc3VjY2Vzc19jb3VudDsKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworCisgIHJldHZhbCA9IEZBTFNFOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnRlc3RzX2ZpbGUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZyZXN1bHRzX2ZpbGUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ0ZXN0cykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnJlc3VsdHMpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZsaW5lKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnRlc3RzX2ZpbGUsIHRlc3RfZGF0YV9kaXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnJlc3VsdHNfZmlsZSwgdGVzdF9kYXRhX2RpcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZ0bXAsICJzaGEtMS9ieXRlLW1lc3NhZ2VzLnNoYTEiKTsKKyAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmdGVzdHNfZmlsZSwgJnRtcCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZ0bXAsICJzaGEtMS9ieXRlLWhhc2hlcy5zaGExIik7CisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJnJlc3VsdHNfZmlsZSwgJnRtcCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgaWYgKCFfZGJ1c19maWxlX2dldF9jb250ZW50cyAoJnRlc3RzLCAmdGVzdHNfZmlsZSwgJmVycm9yKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJjb3VsZCBub3QgbG9hZCB0ZXN0IGRhdGEgZmlsZSAlczogJXNcbiIsCisgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ0ZXN0c19maWxlKSwKKyAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmICghX2RidXNfZmlsZV9nZXRfY29udGVudHMgKCZyZXN1bHRzLCAmcmVzdWx0c19maWxlLCAmZXJyb3IpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgImNvdWxkIG5vdCBsb2FkIHJlc3VsdHMgZGF0YSBmaWxlICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnJlc3VsdHNfZmlsZSksIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHN1Y2Nlc3NfY291bnQgPSAwOworICBsaW5lX25vID0gMDsKKyBuZXh0X2l0ZXJhdGlvbjoKKyAgd2hpbGUgKF9kYnVzX3N0cmluZ19wb3BfbGluZSAoJnRlc3RzLCAmbGluZSkpCisgICAgeworICAgICAgbGluZV9ubyArPSAxOworCisgICAgICBfZGJ1c19zdHJpbmdfZGVsZXRlX2xlYWRpbmdfYmxhbmtzICgmbGluZSk7CisKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmxpbmUpID09IDApCisgICAgICAgIGdvdG8gbmV4dF9pdGVyYXRpb247CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLCAiIyIpKQorICAgICAgICBnb3RvIG5leHRfaXRlcmF0aW9uOworICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwgIkg+IikpCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgKCJTSEEtMTogJXNcbiIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmxpbmUpKTsKKworICAgICAgICAgIGlmIChfZGJ1c19zdHJpbmdfZmluZCAoJmxpbmUsIDAsICJUeXBlIDMiLCBOVUxMKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogU2VlIHNoYS0xL1JlYWRtZS50eHQgLSB0aGUgIlR5cGUgMyIgdGVzdHMgYXJlCisgICAgICAgICAgICAgICAqIHJhbmRvbSBzZWVkcywgcmF0aGVyIHRoYW4gZGF0YSB0byBiZSBoYXNoZWQuCisgICAgICAgICAgICAgICAqIHdlJ2QgaGF2ZSB0byBkbyBhIGxpdHRsZSBiaXQgbW9yZSBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgICAgKiB0byB1c2UgdGhvc2UgdGVzdHMuCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgcHJpbnRmICgiIChlbmRpbmcgdGVzdHMgZHVlIHRvIFR5cGUgMyB0ZXN0cyBzZWVuIC0gdGhpcyBpcyBub3JtYWwpXG4iKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsICJEPiIpIHx8CisgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLCAiPEQiKSkKKyAgICAgICAgZ290byBuZXh0X2l0ZXJhdGlvbjsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIERCdXNTdHJpbmcgdGVzdDsKKyAgICAgICAgICBEQnVzU3RyaW5nIHJlc3VsdDsKKyAgICAgICAgICBEQnVzU3RyaW5nIG5leHRfbGluZTsKKyAgICAgICAgICBEQnVzU3RyaW5nIGV4cGVjdGVkOworICAgICAgICAgIGRidXNfYm9vbF90IHN1Y2Nlc3M7CisKKyAgICAgICAgICBzdWNjZXNzID0gRkFMU0U7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJm5leHRfbGluZSkpCisgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZleHBlY3RlZCkpCisgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdGVzdCkpCisgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZyZXN1bHQpKQorICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICAgICAgICAvKiB0aGUgImNvbXBhY3Qgc3RyaW5ncyIgYXJlICJeIi10ZXJtaW5hdGVkIG5vdAorICAgICAgICAgICAqIG5ld2xpbmUtdGVybWluYXRlZCBzbyByZWFkYWhlYWQgdG8gZmluZCB0aGUKKyAgICAgICAgICAgKiAiXiIKKyAgICAgICAgICAgKi8KKyAgICAgICAgICB3aGlsZSAoIV9kYnVzX3N0cmluZ19maW5kICgmbGluZSwgMCwgIl4iLCBOVUxMKSAmJgorICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfcG9wX2xpbmUgKCZ0ZXN0cywgJm5leHRfbGluZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmbGluZSwgJyAnKSB8fAorICAgICAgICAgICAgICAgICAgIV9kYnVzX3N0cmluZ19tb3ZlICgmbmV4dF9saW5lLCAwLCAmbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZsaW5lKSkpCisgICAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCFkZWNvZGVfY29tcGFjdF9zdHJpbmcgKCZsaW5lLCAmdGVzdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkZhaWxlZCB0byBkZWNvZGUgbGluZSAlZCBhcyBhIGNvbXBhY3Qgc3RyaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBsaW5lX25vKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsdXJlOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGlmICghX2RidXNfc2hhX2NvbXB1dGUgKCZ0ZXN0LCAmcmVzdWx0KSkKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSBmb3IgU0hBLTEgcmVzdWx0Iik7CisKKyAgICAgICAgICBpZiAoIWdldF9uZXh0X2V4cGVjdGVkX3Jlc3VsdCAoJnJlc3VsdHMsICZleHBlY3RlZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkZhaWxlZCB0byByZWFkIGFuIGV4cGVjdGVkIHJlc3VsdFxuIik7CisgICAgICAgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbCAoJnJlc3VsdCwgJmV4cGVjdGVkKSkKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIgZm9yIGxpbmUgJWQgZ290IGhhc2ggJXMgZXhwZWN0ZWQgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbm8sCisgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnJlc3VsdCksCisgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmV4cGVjdGVkKSk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHN1Y2Nlc3NfY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHN1Y2Nlc3MgPSBUUlVFOworCisgICAgICAgIGZhaWx1cmU6CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0ZXN0KTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnJlc3VsdCk7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZuZXh0X2xpbmUpOworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZXhwZWN0ZWQpOworCisgICAgICAgICAgaWYgKCFzdWNjZXNzKQorICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworICBwcmludGYgKCJQYXNzZWQgdGhlICVkIFNIQS0xIHRlc3RzIGluIHRoZSB0ZXN0IGZpbGVcbiIsCisgICAgICAgICAgc3VjY2Vzc19jb3VudCk7CisgIAorIG91dDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0ZXN0c19maWxlKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZyZXN1bHRzX2ZpbGUpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRlc3RzKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZyZXN1bHRzKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZsaW5lKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIEBpbmdyb3VwIERCdXNTSEFJbnRlcm5hbHMKKyAqIFVuaXQgdGVzdCBmb3IgU0hBIGNvbXB1dGF0aW9uLgorICoKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zaGFfdGVzdCAoY29uc3QgY2hhciAqdGVzdF9kYXRhX2RpcikKK3sKKyAgdW5zaWduZWQgY2hhciBhbGxfYnl0ZXNbMjU2XTsKKyAgaW50IGk7CisKKyAgaWYgKHRlc3RfZGF0YV9kaXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIXByb2Nlc3NfdGVzdF9kYXRhICh0ZXN0X2RhdGFfZGlyKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHByaW50ZiAoIk5vIHRlc3QgZGF0YSBkaXJcbiIpOworICAKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgMjU2KQorICAgIHsKKyAgICAgIGFsbF9ieXRlc1tpXSA9IGk7CisgICAgICArK2k7CisgICAgfQorCisgIGlmICghY2hlY2tfc2hhX2JpbmFyeSAoYWxsX2J5dGVzLCAyNTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIjQ5MTZkNmJkYjdmNzhlNjgwMzY5OGNhYjMyZDE1ODZlYTQ1N2RmYzgiKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyNkZWZpbmUgQ0hFQ0soaW5wdXQsZXhwZWN0ZWQpIGlmICghY2hlY2tfc2hhX3N0ciAoaW5wdXQsIGV4cGVjdGVkKSkgcmV0dXJuIEZBTFNFCisKKyAgQ0hFQ0sgKCIiLCAiZGEzOWEzZWU1ZTZiNGIwZDMyNTViZmVmOTU2MDE4OTBhZmQ4MDcwOSIpOworICBDSEVDSyAoImEiLCAiODZmN2U0MzdmYWE1YTdmY2UxNWQxZGRjYjllYWVhZWEzNzc2NjdiOCIpOworICBDSEVDSyAoImFiYyIsICJhOTk5M2UzNjQ3MDY4MTZhYmEzZTI1NzE3ODUwYzI2YzljZDBkODlkIik7CisgIENIRUNLICgibWVzc2FnZSBkaWdlc3QiLCAiYzEyMjUyY2VkYThiZTg5OTRkNWZhMDI5MGE0NzIzMWMxZDE2YWFlMyIpOworICBDSEVDSyAoImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiwgIjMyZDEwYzdiOGNmOTY1NzBjYTA0Y2UzN2YyYTE5ZDg0MjQwZDNhODkiKTsKKyAgQ0hFQ0sgKCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSIsCisgICAgICAgICAiNzYxYzQ1N2JmNzNiMTRkMjdlOWU5MjY1YzQ2ZjRiNGRkYTExZjk0MCIpOworICBDSEVDSyAoIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiwKKyAgICAgICAgICI1MGFiZjU3MDZhMTUwOTkwYTA4YjJjNWVhNDBmYTBlNTg1NTU0NzMyIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1zaGEuaCBiL2RidXMvZGJ1cy9kYnVzLXNoYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ODAzNWIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1zaGEuaApAQCAtMCwwICsxLDU1IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc2hhLmggU0hBLTEgaW1wbGVtZW50YXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX1NIQV9ICisjZGVmaW5lIERCVVNfU0hBX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWNyb3MuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZXJyb3JzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IERCdXNTSEFDb250ZXh0IERCdXNTSEFDb250ZXh0OworCisvKioKKyAqIFN0cnVjdCBzdG9yaW5nIHN0YXRlIG9mIHRoZSBTSEEgYWxnb3JpdGhtCisgKi8KK3N0cnVjdCBEQnVzU0hBQ29udGV4dAoreworICBkYnVzX3VpbnQzMl90ICBkaWdlc3RbNV07ICAgICAgICAgLyoqPCBNZXNzYWdlIGRpZ2VzdCAqLworICBkYnVzX3VpbnQzMl90ICBjb3VudF9sbzsgICAgICAgICAgLyoqPCA2NC1iaXQgYml0IGNvdW50ICovCisgIGRidXNfdWludDMyX3QgIGNvdW50X2hpOyAgICAgICAgICAvKio8IE5vIGNsdWUgKi8KKyAgZGJ1c191aW50MzJfdCAgZGF0YVsxNl07ICAgICAgICAgIC8qKjwgU0hBIGRhdGEgYnVmZmVyICovCit9OworCit2b2lkICAgICAgICBfZGJ1c19zaGFfaW5pdCAgICAoREJ1c1NIQUNvbnRleHQgICAqY29udGV4dCk7Cit2b2lkICAgICAgICBfZGJ1c19zaGFfdXBkYXRlICAoREJ1c1NIQUNvbnRleHQgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpkYXRhKTsKK2RidXNfYm9vbF90IF9kYnVzX3NoYV9maW5hbCAgIChEQnVzU0hBQ29udGV4dCAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKnJlc3VsdHMpOworZGJ1c19ib29sX3QgX2RidXNfc2hhX2NvbXB1dGUgKGNvbnN0IERCdXNTdHJpbmcgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqYXNjaWlfb3V0cHV0KTsKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfU0hBX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLXNoYXJlZC5oIGIvZGJ1cy9kYnVzL2RidXMtc2hhcmVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE1NzY3MAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXNoYXJlZC5oCkBAIC0wLDAgKzEsMTMxIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc2hhcmVkLmggIFN0dWZmIHVzZWQgYnkgYm90aCBkYnVzL2RidXMuaCBsb3ctbGV2ZWwgYW5kIEMvQysrIGJpbmRpbmcgQVBJcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19TSEFSRURfSAorI2RlZmluZSBEQlVTX1NIQVJFRF9ICisKKy8qIERvbid0IGluY2x1ZGUgYW55dGhpbmcgaW4gaGVyZSBmcm9tIGFueXdoZXJlIGVsc2UuIEl0J3MKKyAqIGludGVuZGVkIGZvciB1c2UgYnkgYW55IHJhbmRvbSBsaWJyYXJ5LgorICovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2lmIDAKK30gLyogYXZvaWRzIGNvbmZ1c2luZyBlbWFjcyBpbmRlbnRhdGlvbiAqLworI2VuZGlmCisjZW5kaWYKKworLyogTm9ybWFsbHkgZG9jcyBhcmUgaW4gLmMgZmlsZXMsIGJ1dCB0aGVyZSBpc24ndCBhIC5jIGZpbGUgZm9yIHRoaXMuICovCisvKioKKyAqIEBkZWZncm91cCBEQnVzU2hhcmVkIFNoYXJlZCBjb25zdGFudHMgCisgKiBAaW5ncm91cCAgREJ1cworICoKKyAqIEBicmllZiBTaGFyZWQgaGVhZGVyIGluY2x1ZGVkIGJ5IGJvdGggbGliZGJ1cyBhbmQgQy9DKysgYmluZGluZ3Mgc3VjaCBhcyB0aGUgR0xpYiBiaW5kaW5ncy4KKyAqCisgKiBVc3VhbGx5IGEgQy9DKysgYmluZGluZyBzdWNoIGFzIHRoZSBHTGliIG9yIFF0IGJpbmRpbmcgd29uJ3Qgd2FudCB0byBpbmNsdWRlIGRidXMuaCBpbiBpdHMKKyAqIHB1YmxpYyBoZWFkZXJzLiBIb3dldmVyLCBhIGZldyBjb25zdGFudHMgYW5kIG1hY3JvcyBtYXkgYmUgdXNlZnVsIHRvIGluY2x1ZGU7IHRob3NlIGFyZQorICogZm91bmQgaGVyZSBhbmQgaW4gZGJ1cy1wcm90b2NvbC5oCisgKgorICogQHsKKyAqLworCisKKy8qKgorICogV2VsbC1rbm93biBidXMgdHlwZXMuIFNlZSBkYnVzX2J1c19nZXQoKS4KKyAqLwordHlwZWRlZiBlbnVtCit7CisgIERCVVNfQlVTX1NFU1NJT04sICAgIC8qKjwgVGhlIGxvZ2luIHNlc3Npb24gYnVzICovCisgIERCVVNfQlVTX1NZU1RFTSwgICAgIC8qKjwgVGhlIHN5c3RlbXdpZGUgYnVzICovCisgIERCVVNfQlVTX1NUQVJURVIgICAgIC8qKjwgVGhlIGJ1cyB0aGF0IHN0YXJ0ZWQgdXMsIGlmIGFueSAqLworfSBEQnVzQnVzVHlwZTsKKworLyoqCisgKiBSZXN1bHRzIHRoYXQgYSBtZXNzYWdlIGhhbmRsZXIgY2FuIHJldHVybi4KKyAqLwordHlwZWRlZiBlbnVtCit7CisgIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRCwgICAgICAgICAvKio8IE1lc3NhZ2UgaGFzIGhhZCBpdHMgZWZmZWN0IC0gbm8gbmVlZCB0byBydW4gbW9yZSBoYW5kbGVycy4gKi8gCisgIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVELCAvKio8IE1lc3NhZ2UgaGFzIG5vdCBoYWQgYW55IGVmZmVjdCAtIHNlZSBpZiBvdGhlciBoYW5kbGVycyB3YW50IGl0LiAqLworICBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZICAgICAgLyoqPCBOZWVkIG1vcmUgbWVtb3J5IGluIG9yZGVyIHRvIHJldHVybiAjREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEIG9yICNEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRC4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlciB3aXRoIG1vcmUgbWVtb3J5LiAqLworfSBEQnVzSGFuZGxlclJlc3VsdDsKKworLyogQnVzIG5hbWVzICovCisKKy8qKiBUaGUgYnVzIG5hbWUgdXNlZCB0byB0YWxrIHRvIHRoZSBidXMgaXRzZWxmLiAqLworI2RlZmluZSBEQlVTX1NFUlZJQ0VfREJVUyAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cyIKKworLyogUGF0aHMgKi8KKy8qKiBUaGUgb2JqZWN0IHBhdGggdXNlZCB0byB0YWxrIHRvIHRoZSBidXMgaXRzZWxmLiAqLworI2RlZmluZSBEQlVTX1BBVEhfREJVUyAgIi9vcmcvZnJlZWRlc2t0b3AvREJ1cyIKKy8qKiBUaGUgb2JqZWN0IHBhdGggdXNlZCBpbiBsb2NhbC9pbi1wcm9jZXNzLWdlbmVyYXRlZCBtZXNzYWdlcy4gKi8KKyNkZWZpbmUgREJVU19QQVRIX0xPQ0FMICIvb3JnL2ZyZWVkZXNrdG9wL0RCdXMvTG9jYWwiCisKKy8qIEludGVyZmFjZXMsIHRoZXNlICNkZWZpbmUgZG9uJ3QgZG8gbXVjaCBvdGhlciB0aGFuCisgKiBjYXRjaCB0eXBvcyBhdCBjb21waWxlIHRpbWUKKyAqLworLyoqIFRoZSBpbnRlcmZhY2UgZXhwb3J0ZWQgYnkgdGhlIG9iamVjdCB3aXRoICNEQlVTX1NFUlZJQ0VfREJVUyBhbmQgI0RCVVNfUEFUSF9EQlVTICovCisjZGVmaW5lIERCVVNfSU5URVJGQUNFX0RCVVMgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cyIKKy8qKiBUaGUgaW50ZXJmYWNlIHN1cHBvcnRlZCBieSBpbnRyb3NwZWN0YWJsZSBvYmplY3RzICovCisjZGVmaW5lIERCVVNfSU5URVJGQUNFX0lOVFJPU1BFQ1RBQkxFICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5JbnRyb3NwZWN0YWJsZSIKKy8qKiBUaGUgaW50ZXJmYWNlIHN1cHBvcnRlZCBieSBvYmplY3RzIHdpdGggcHJvcGVydGllcyAqLworI2RlZmluZSBEQlVTX0lOVEVSRkFDRV9QUk9QRVJUSUVTICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllcyIKKy8qKiBUaGUgaW50ZXJmYWNlIHN1cHBvcnRlZCBieSBtb3N0IGRidXMgcGVlcnMgKi8KKyNkZWZpbmUgREJVU19JTlRFUkZBQ0VfUEVFUiAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIiCisKKy8qKiBUaGlzIGlzIGEgc3BlY2lhbCBpbnRlcmZhY2Ugd2hvc2UgbWV0aG9kcyBjYW4gb25seSBiZSBpbnZva2VkCisgKiBieSB0aGUgbG9jYWwgaW1wbGVtZW50YXRpb24gKG1lc3NhZ2VzIGZyb20gcmVtb3RlIGFwcHMgYXJlbid0CisgKiBhbGxvd2VkIHRvIHNwZWNpZnkgdGhpcyBpbnRlcmZhY2UpLgorICovCisjZGVmaW5lIERCVVNfSU5URVJGQUNFX0xPQ0FMICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5Mb2NhbCIKKworLyogT3duZXIgZmxhZ3MgKi8KKyNkZWZpbmUgREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgMHgxIC8qKjwgQWxsb3cgYW5vdGhlciBzZXJ2aWNlIHRvIGJlY29tZSB0aGUgcHJpbWFyeSBvd25lciBpZiByZXF1ZXN0ZWQgKi8KKyNkZWZpbmUgREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORyAgMHgyIC8qKjwgUmVxdWVzdCB0byByZXBsYWNlIHRoZSBjdXJyZW50IHByaW1hcnkgb3duZXIgKi8KKyNkZWZpbmUgREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFICAgICAgMHg0IC8qKjwgSWYgd2UgY2FuIG5vdCBiZWNvbWUgdGhlIHByaW1hcnkgb3duZXIgZG8gbm90IHBsYWNlIHVzIGluIHRoZSBxdWV1ZSAqLworCisvKiBSZXBsaWVzIHRvIHJlcXVlc3QgZm9yIGEgbmFtZSAqLworI2RlZmluZSBEQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9QUklNQVJZX09XTkVSICAxIC8qKjwgU2VydmljZSBoYXMgYmVjb21lIHRoZSBwcmltYXJ5IG93bmVyIG9mIHRoZSByZXF1ZXN0ZWQgbmFtZSAqLworI2RlZmluZSBEQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9JTl9RVUVVRSAgICAgICAyIC8qKjwgU2VydmljZSBjb3VsZCBub3QgYmVjb21lIHRoZSBwcmltYXJ5IG93bmVyIGFuZCBoYXMgYmVlbiBwbGFjZWQgaW4gdGhlIHF1ZXVlICovCisjZGVmaW5lIERCVVNfUkVRVUVTVF9OQU1FX1JFUExZX0VYSVNUUyAgICAgICAgIDMgLyoqPCBTZXJ2aWNlIGlzIGFscmVhZHkgaW4gdGhlIHF1ZXVlICovCisjZGVmaW5lIERCVVNfUkVRVUVTVF9OQU1FX1JFUExZX0FMUkVBRFlfT1dORVIgIDQgLyoqPCBTZXJ2aWNlIGlzIGFscmVhZHkgdGhlIHByaW1hcnkgb3duZXIgKi8KKworLyogUmVwbGllcyB0byByZWxlYXNpbmcgYSBuYW1lICovCisjZGVmaW5lIERCVVNfUkVMRUFTRV9OQU1FX1JFUExZX1JFTEVBU0VEICAgICAgICAxIC8qKjwgU2VydmljZSB3YXMgcmVsZWFzZWQgZnJvbSB0aGUgZ2l2ZW4gbmFtZSAqLworI2RlZmluZSBEQlVTX1JFTEVBU0VfTkFNRV9SRVBMWV9OT05fRVhJU1RFTlQgICAgMiAvKio8IFRoZSBnaXZlbiBuYW1lIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBidXMgKi8KKyNkZWZpbmUgREJVU19SRUxFQVNFX05BTUVfUkVQTFlfTk9UX09XTkVSICAgICAgIDMgLyoqPCBTZXJ2aWNlIGlzIG5vdCBhbiBvd25lciBvZiB0aGUgZ2l2ZW4gbmFtZSAqLworCisvKiBSZXBsaWVzIHRvIHNlcnZpY2Ugc3RhcnRzICovCisjZGVmaW5lIERCVVNfU1RBUlRfUkVQTFlfU1VDQ0VTUyAgICAgICAgIDEgLyoqPCBTZXJ2aWNlIHdhcyBhdXRvIHN0YXJ0ZWQgKi8KKyNkZWZpbmUgREJVU19TVEFSVF9SRVBMWV9BTFJFQURZX1JVTk5JTkcgMiAvKio8IFNlcnZpY2Ugd2FzIGFscmVhZHkgcnVubmluZyAqLworCisvKiogQH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCisjaWYgMAoreyAvKiBhdm9pZHMgY29uZnVzaW5nIGVtYWNzIGluZGVudGF0aW9uICovCisjZW5kaWYKK30KKyNlbmRpZgorCisjZW5kaWYgLyogREJVU19TSEFSRURfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtc2hlbGwuYyBiL2RidXMvZGJ1cy9kYnVzLXNoZWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTExZDM5ZAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXNoZWxsLmMKQEAgLTAsMCArMSw2NDEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zaGVsbC5jIFNoZWxsIGNvbW1hbmQgbGluZSB1dGlsaXR5IGZ1bmN0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1saXN0LmgiCisjaW5jbHVkZSAiZGJ1cy1tZW1vcnkuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSAiZGJ1cy1zaGVsbC5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisKKy8qIFNpbmdsZSBxdW90ZXMgcHJlc2VydmUgdGhlIGxpdGVyYWwgc3RyaW5nIGV4YWN0bHkuIGVzY2FwZQorICogc2VxdWVuY2VzIGFyZSBub3QgYWxsb3dlZDsgbm90IGV2ZW4gXCcgLSBpZiB5b3Ugd2FudCBhICcKKyAqIGluIHRoZSBxdW90ZWQgdGV4dCwgeW91IGhhdmUgdG8gZG8gc29tZXRoaW5nIGxpa2UgJ2ZvbydcJydiYXInCisgKgorICogRG91YmxlIHF1b3RlcyBhbGxvdyAkIGAgIiBcIGFuZCBuZXdsaW5lIHRvIGJlIGVzY2FwZWQgd2l0aCBiYWNrc2xhc2guCisgKiBPdGhlcndpc2UgZG91YmxlIHF1b3RlcyBwcmVzZXJ2ZSB0aGluZ3MgbGl0ZXJhbGx5LgorICovCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAordW5xdW90ZV9zdHJpbmdfaW5wbGFjZSAoY2hhciogc3RyLCBjaGFyKiogZW5kKQoreworICBjaGFyKiBkZXN0OworICBjaGFyKiBzOworICBjaGFyIHF1b3RlX2NoYXI7CisgIAorICBkZXN0ID0gcyA9IHN0cjsKKworICBxdW90ZV9jaGFyID0gKnM7CisgIAorICBpZiAoISgqcyA9PSAnIicgfHwgKnMgPT0gJ1wnJykpCisgICAgeworICAgICAgKmVuZCA9IHN0cjsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogU2tpcCB0aGUgaW5pdGlhbCBxdW90ZSBtYXJrICovCisgICsrczsKKworICBpZiAocXVvdGVfY2hhciA9PSAnIicpCisgICAgeworICAgICAgd2hpbGUgKCpzKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfYXNzZXJ0KHMgPiBkZXN0KTsgLyogbG9vcCBpbnZhcmlhbnQgKi8KKyAgICAgIAorICAgICAgICAgIHN3aXRjaCAoKnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgICAgLyogRW5kIG9mIHRoZSBzdHJpbmcsIHJldHVybiBub3cgKi8KKyAgICAgICAgICAgICAgKmRlc3QgPSAnXDAnOworICAgICAgICAgICAgICArK3M7CisgICAgICAgICAgICAgICplbmQgPSBzOworICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKworICAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICAvKiBQb3NzaWJsZSBlc2NhcGVkIHF1b3RlIG9yIFwgKi8KKyAgICAgICAgICAgICAgKytzOworICAgICAgICAgICAgICBzd2l0Y2ggKCpzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgICAgY2FzZSAnYCc6CisgICAgICAgICAgICAgICAgY2FzZSAnJCc6CisgICAgICAgICAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgICAgICAgKmRlc3QgPSAqczsKKyAgICAgICAgICAgICAgICAgICsrczsKKyAgICAgICAgICAgICAgICAgICsrZGVzdDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgIC8qIG5vdCBhbiBlc2NhcGVkIGNoYXIgKi8KKyAgICAgICAgICAgICAgICAgICpkZXN0ID0gJ1xcJzsKKyAgICAgICAgICAgICAgICAgICsrZGVzdDsKKyAgICAgICAgICAgICAgICAgIC8qICsrcyBhbHJlYWR5IGRvbmUuICovCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAqZGVzdCA9ICpzOworICAgICAgICAgICAgICArK2Rlc3Q7CisgICAgICAgICAgICAgICsrczsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBfZGJ1c19hc3NlcnQocyA+IGRlc3QpOyAvKiBsb29wIGludmFyaWFudCAqLworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgd2hpbGUgKCpzKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfYXNzZXJ0KHMgPiBkZXN0KTsgLyogbG9vcCBpbnZhcmlhbnQgKi8KKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoKnMgPT0gJ1wnJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogRW5kIG9mIHRoZSBzdHJpbmcsIHJldHVybiBub3cgKi8KKyAgICAgICAgICAgICAgKmRlc3QgPSAnXDAnOworICAgICAgICAgICAgICArK3M7CisgICAgICAgICAgICAgICplbmQgPSBzOworICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICpkZXN0ID0gKnM7CisgICAgICAgICAgICAgICsrZGVzdDsKKyAgICAgICAgICAgICAgKytzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgX2RidXNfYXNzZXJ0KHMgPiBkZXN0KTsgLyogbG9vcCBpbnZhcmlhbnQgKi8KKyAgICAgICAgfQorICAgIH0KKyAgCisgIC8qIElmIHdlIHJlYWNoIGhlcmUgdGhpcyBtZWFucyB0aGUgY2xvc2UgcXVvdGUgd2FzIG5ldmVyIGVuY291bnRlcmVkICovCisKKyAgKmRlc3QgPSAnXDAnOworICAKKyAgKmVuZCA9IHM7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqIAorICogVW5xdW90ZXMgYSBzdHJpbmcgYXMgdGhlIHNoZWxsICgvYmluL3NoKSB3b3VsZC4gT25seSBoYW5kbGVzCisgKiBxdW90ZXM7IGlmIGEgc3RyaW5nIGNvbnRhaW5zIGZpbGUgZ2xvYnMsIGFyaXRobWV0aWMgb3BlcmF0b3JzLAorICogdmFyaWFibGVzLCBiYWNrdGlja3MsIHJlZGlyZWN0aW9ucywgb3Igb3RoZXIgc3BlY2lhbC10by10aGUtc2hlbGwKKyAqIGZlYXR1cmVzLCB0aGUgcmVzdWx0IHdpbGwgYmUgZGlmZmVyZW50IGZyb20gdGhlIHJlc3VsdCBhIHJlYWwgc2hlbGwKKyAqIHdvdWxkIHByb2R1Y2UgKHRoZSB2YXJpYWJsZXMsIGJhY2t0aWNrcywgZXRjLiB3aWxsIGJlIHBhc3NlZAorICogdGhyb3VnaCBsaXRlcmFsbHkgaW5zdGVhZCBvZiBiZWluZyBleHBhbmRlZCkuIFRoaXMgZnVuY3Rpb24gaXMKKyAqIGd1YXJhbnRlZWQgdG8gc3VjY2VlZCBpZiBhcHBsaWVkIHRvIHRoZSByZXN1bHQgb2YKKyAqIF9kYnVzX3NoZWxsX3F1b3RlKCkuIElmIGl0IGZhaWxzLCBpdCByZXR1cm5zICVOVUxMLgorICogVGhlIEBxdW90ZWRfc3RyaW5nIG5lZWQgbm90IGFjdHVhbGx5IGNvbnRhaW4gcXVvdGVkIG9yCisgKiBlc2NhcGVkIHRleHQ7IF9kYnVzX3NoZWxsX3VucXVvdGUoKSBzaW1wbHkgZ29lcyB0aHJvdWdoIHRoZSBzdHJpbmcgYW5kCisgKiB1bnF1b3Rlcy91bmVzY2FwZXMgYW55dGhpbmcgdGhhdCB0aGUgc2hlbGwgd291bGQuIEJvdGggc2luZ2xlIGFuZAorICogZG91YmxlIHF1b3RlcyBhcmUgaGFuZGxlZCwgYXMgYXJlIGVzY2FwZXMgaW5jbHVkaW5nIGVzY2FwZWQKKyAqIG5ld2xpbmVzLiBUaGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgZnJlZWQgd2l0aCBkYnVzX2ZyZWUoKS4KKyAqIAorICogU2hlbGwgcXVvdGluZyBydWxlcyBhcmUgYSBiaXQgc3RyYW5nZS4gU2luZ2xlIHF1b3RlcyBwcmVzZXJ2ZSB0aGUKKyAqIGxpdGVyYWwgc3RyaW5nIGV4YWN0bHkuIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIG5vdCBhbGxvd2VkOyBub3QgZXZlbgorICogXCcgLSBpZiB5b3Ugd2FudCBhICcgaW4gdGhlIHF1b3RlZCB0ZXh0LCB5b3UgaGF2ZSB0byBkbyBzb21ldGhpbmcKKyAqIGxpa2UgJ2ZvbydcJydiYXInLiAgRG91YmxlIHF1b3RlcyBhbGxvdyAkLCBgLCAiLCBcLCBhbmQgbmV3bGluZSB0bworICogYmUgZXNjYXBlZCB3aXRoIGJhY2tzbGFzaC4gT3RoZXJ3aXNlIGRvdWJsZSBxdW90ZXMgcHJlc2VydmUgdGhpbmdzCisgKiBsaXRlcmFsbHkuCisgKgorICogQHF1b3RlZF9zdHJpbmc6IHNoZWxsLXF1b3RlZCBzdHJpbmcKKyAqKi8KK2NoYXIqCitfZGJ1c19zaGVsbF91bnF1b3RlIChjb25zdCBjaGFyICpxdW90ZWRfc3RyaW5nKQoreworICBjaGFyICp1bnF1b3RlZDsKKyAgY2hhciAqZW5kOworICBjaGFyICpzdGFydDsKKyAgY2hhciAqcmV0OworICBEQnVzU3RyaW5nIHJldHZhbDsKKworICB1bnF1b3RlZCA9IF9kYnVzX3N0cmR1cCAocXVvdGVkX3N0cmluZyk7CisgIGlmICh1bnF1b3RlZCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHN0YXJ0ID0gdW5xdW90ZWQ7CisgIGVuZCA9IHVucXVvdGVkOworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcmV0dmFsKSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHVucXVvdGVkKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBUaGUgbG9vcCBhbGxvd3MgY2FzZXMgc3VjaCBhcworICAgKiAiZm9vImJsYWggYmxhaCdiYXInd29vIGZvbyJiYXoibGEgbGEgbGFcJ1wnJ2ZvbycKKyAgICovCisgIHdoaWxlICgqc3RhcnQpCisgICAgeworICAgICAgLyogQXBwZW5kIGFsbCBub24tcXVvdGVkIGNoYXJzLCBob25vcmluZyBiYWNrc2xhc2ggZXNjYXBlCisgICAgICAgKi8KKyAgICAgIAorICAgICAgd2hpbGUgKCpzdGFydCAmJiAhKCpzdGFydCA9PSAnIicgfHwgKnN0YXJ0ID09ICdcJycpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCpzdGFydCA9PSAnXFwnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBhbGwgY2hhcmFjdGVycyBjYW4gZ2V0IGVzY2FwZWQgYnkgYmFja3NsYXNoLAorICAgICAgICAgICAgICAgKiBleGNlcHQgbmV3bGluZSwgd2hpY2ggaXMgcmVtb3ZlZCBpZiBpdCBmb2xsb3dzCisgICAgICAgICAgICAgICAqIGEgYmFja3NsYXNoIG91dHNpZGUgb2YgcXVvdGVzCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgKytzdGFydDsKKyAgICAgICAgICAgICAgaWYgKCpzdGFydCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoKnN0YXJ0ICE9ICdcbicpCisJCSAgICB7CisJCSAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmcmV0dmFsLCAqc3RhcnQpKQorCQkJZ290byBlcnJvcjsKKwkJICAgIH0KKyAgICAgICAgICAgICAgICAgICsrc3RhcnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZyZXR2YWwsICpzdGFydCkpCisJCWdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICsrc3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgaWYgKCpzdGFydCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghdW5xdW90ZV9zdHJpbmdfaW5wbGFjZSAoc3RhcnQsICZlbmQpKQorCSAgICBnb3RvIGVycm9yOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmcmV0dmFsLCBzdGFydCkpCisJCWdvdG8gZXJyb3I7CisgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIHJldCA9IF9kYnVzX3N0cmR1cCAoX2RidXNfc3RyaW5nX2dldF9kYXRhICgmcmV0dmFsKSk7CisgIGlmICghcmV0KQorICAgIGdvdG8gZXJyb3I7CisKKyAgZGJ1c19mcmVlICh1bnF1b3RlZCk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcmV0dmFsKTsKKyAgCisgIHJldHVybiByZXQ7CisgIAorIGVycm9yOgorICBkYnVzX2ZyZWUgKHVucXVvdGVkKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZyZXR2YWwpOworICByZXR1cm4gTlVMTDsKK30KKworLyogX2RidXNfc2hlbGxfcGFyc2VfYXJndigpIGRvZXMgYSBzZW1pLWFyYml0cmFyeSB3ZWlyZCBzdWJzZXQgb2YgdGhlIHdheQorICogdGhlIHNoZWxsIHBhcnNlcyBhIGNvbW1hbmQgbGluZS4gV2UgZG9uJ3QgZG8gdmFyaWFibGUgZXhwYW5zaW9uLAorICogZG9uJ3QgdW5kZXJzdGFuZCB0aGF0IG9wZXJhdG9ycyBhcmUgdG9rZW5zLCBkb24ndCBkbyB0aWxkZSBleHBhbnNpb24sCisgKiBkb24ndCBkbyBjb21tYW5kIHN1YnN0aXR1dGlvbiwgbm8gYXJpdGhtZXRpYyBleHBhbnNpb24sIElGUyBnZXRzIGlnbm9yZWQsCisgKiBkb24ndCBkbyBmaWxlbmFtZSBnbG9icywgZG9uJ3QgcmVtb3ZlIHJlZGlyZWN0aW9uIHN0dWZmLCBldGMuCisgKgorICogUkVBRCBUSEUgVU5JWDk4IFNQRUMgb24gIlNoZWxsIENvbW1hbmQgTGFuZ3VhZ2UiIGJlZm9yZSBjaGFuZ2luZworICogdGhlIGJlaGF2aW9yIG9mIHRoaXMgY29kZS4KKyAqCisgKiBTdGVwcyB0byBwYXJzaW5nIHRoZSBhcmd2IHN0cmluZzoKKyAqCisgKiAgLSB0b2tlbml6ZSB0aGUgc3RyaW5nIChidXQgc2luY2Ugd2UgaWdub3JlIG9wZXJhdG9ycywKKyAqICAgIG91ciB0b2tlbml6YXRpb24gbWF5IGRpdmVyZ2UgZnJvbSB3aGF0IHRoZSBzaGVsbCB3b3VsZCBkbykKKyAqICAgIG5vdGUgdGhhdCB0b2tlbml6YXRpb24gaWdub3JlcyB0aGUgaW50ZXJuYWxzIG9mIGEgcXVvdGVkCisgKiAgICB3b3JkIGFuZCBpdCBhbHdheXMgc3BsaXRzIG9uIHNwYWNlcywgbm90IG9uIElGUyBldmVuCisgKiAgICBpZiB3ZSB1c2VkIElGUy4gV2UgYWxzbyBpZ25vcmUgImVuZCBvZiBpbnB1dCBpbmRpY2F0b3IiCisgKiAgICAoSSBndWVzcyB0aGlzIGlzIGNvbnRyb2wtRD8pCisgKgorICogICAgVG9rZW5pemF0aW9uIHN0ZXBzLCBmcm9tIFVOSVg5OCB3aXRoIG9wZXJhdG9yIHN0dWZmIHJlbW92ZWQsCisgKiAgICBhcmU6CisgKiAKKyAqICAgIDEpICJJZiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgYmFja3NsYXNoLCBzaW5nbGUtcXVvdGUgb3IKKyAqICAgICAgICBkb3VibGUtcXVvdGUgKFwsICcgb3IgIikgYW5kIGl0IGlzIG5vdCBxdW90ZWQsIGl0IHdpbGwgYWZmZWN0CisgKiAgICAgICAgcXVvdGluZyBmb3Igc3Vic2VxdWVudCBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIHF1b3RlZAorICogICAgICAgIHRleHQuIFRoZSBydWxlcyBmb3IgcXVvdGluZyBhcmUgYXMgZGVzY3JpYmVkIGluIFF1b3RpbmcKKyAqICAgICAgICAuIER1cmluZyB0b2tlbiByZWNvZ25pdGlvbiBubyBzdWJzdGl0dXRpb25zIHdpbGwgYmUgYWN0dWFsbHkKKyAqICAgICAgICBwZXJmb3JtZWQsIGFuZCB0aGUgcmVzdWx0IHRva2VuIHdpbGwgY29udGFpbiBleGFjdGx5IHRoZQorICogICAgICAgIGNoYXJhY3RlcnMgdGhhdCBhcHBlYXIgaW4gdGhlIGlucHV0IChleGNlcHQgZm9yIG5ld2xpbmUKKyAqICAgICAgICBjaGFyYWN0ZXIgam9pbmluZyksIHVubW9kaWZpZWQsIGluY2x1ZGluZyBhbnkgZW1iZWRkZWQgb3IKKyAqICAgICAgICBlbmNsb3NpbmcgcXVvdGVzIG9yIHN1YnN0aXR1dGlvbiBvcGVyYXRvcnMsIGJldHdlZW4gdGhlIHF1b3RlCisgKiAgICAgICAgbWFyayBhbmQgdGhlIGVuZCBvZiB0aGUgcXVvdGVkIHRleHQuIFRoZSB0b2tlbiB3aWxsIG5vdCBiZQorICogICAgICAgIGRlbGltaXRlZCBieSB0aGUgZW5kIG9mIHRoZSBxdW90ZWQgZmllbGQuIgorICoKKyAqICAgIDIpICJJZiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgYW4gdW5xdW90ZWQgbmV3bGluZSBjaGFyYWN0ZXIsCisgKiAgICAgICAgdGhlIGN1cnJlbnQgdG9rZW4gd2lsbCBiZSBkZWxpbWl0ZWQuIgorICoKKyAqICAgIDMpICJJZiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgYW4gdW5xdW90ZWQgYmxhbmsgY2hhcmFjdGVyLCBhbnkKKyAqICAgICAgICB0b2tlbiBjb250YWluaW5nIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIgaXMgZGVsaW1pdGVkIGFuZCB0aGUKKyAqICAgICAgICBjdXJyZW50IGNoYXJhY3RlciB3aWxsIGJlIGRpc2NhcmRlZC4iCisgKgorICogICAgNCkgIklmIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIgd2FzIHBhcnQgb2YgYSB3b3JkLCB0aGUgY3VycmVudAorICogICAgICAgIGNoYXJhY3RlciB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoYXQgd29yZC4iCisgKgorICogICAgNSkgIklmIHRoZSBjdXJyZW50IGNoYXJhY3RlciBpcyBhICIjIiwgaXQgYW5kIGFsbCBzdWJzZXF1ZW50CisgKiAgICAgICAgY2hhcmFjdGVycyB1cCB0bywgYnV0IGV4Y2x1ZGluZywgdGhlIG5leHQgbmV3bGluZSBjaGFyYWN0ZXIKKyAqICAgICAgICB3aWxsIGJlIGRpc2NhcmRlZCBhcyBhIGNvbW1lbnQuIFRoZSBuZXdsaW5lIGNoYXJhY3RlciB0aGF0CisgKiAgICAgICAgZW5kcyB0aGUgbGluZSBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBjb21tZW50LiBUaGUKKyAqICAgICAgICAiIyIgc3RhcnRzIGEgY29tbWVudCBvbmx5IHdoZW4gaXQgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhCisgKiAgICAgICAgdG9rZW4uIFNpbmNlIHRoZSBzZWFyY2ggZm9yIHRoZSBlbmQtb2YtY29tbWVudCBkb2VzIG5vdAorICogICAgICAgIGNvbnNpZGVyIGFuIGVzY2FwZWQgbmV3bGluZSBjaGFyYWN0ZXIgc3BlY2lhbGx5LCBhIGNvbW1lbnQKKyAqICAgICAgICBjYW5ub3QgYmUgY29udGludWVkIHRvIHRoZSBuZXh0IGxpbmUuIgorICoKKyAqICAgIDYpICJUaGUgY3VycmVudCBjaGFyYWN0ZXIgd2lsbCBiZSB1c2VkIGFzIHRoZSBzdGFydCBvZiBhIG5ldyB3b3JkLiIKKyAqCisgKgorICogIC0gZm9yIGVhY2ggdG9rZW4gKHdvcmQpLCBwZXJmb3JtIHBvcnRpb25zIG9mIHdvcmQgZXhwYW5zaW9uLCBuYW1lbHkKKyAqICAgIGZpZWxkIHNwbGl0dGluZyAodXNpbmcgZGVmYXVsdCB3aGl0ZXNwYWNlIElGUykgYW5kIHF1b3RlCisgKiAgICByZW1vdmFsLiAgRmllbGQgc3BsaXR0aW5nIG1heSBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIHdvcmRzLgorICogICAgUXVvdGUgcmVtb3ZhbCBkb2VzIG5vdCBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIHdvcmRzLgorICoKKyAqICAgIklmIHRoZSBjb21wbGV0ZSBleHBhbnNpb24gYXBwcm9wcmlhdGUgZm9yIGEgd29yZCByZXN1bHRzIGluIGFuCisgKiAgIGVtcHR5IGZpZWxkLCB0aGF0IGVtcHR5IGZpZWxkIHdpbGwgYmUgZGVsZXRlZCBmcm9tIHRoZSBsaXN0IG9mCisgKiAgIGZpZWxkcyB0aGF0IGZvcm0gdGhlIGNvbXBsZXRlbHkgZXhwYW5kZWQgY29tbWFuZCwgdW5sZXNzIHRoZQorICogICBvcmlnaW5hbCB3b3JkIGNvbnRhaW5lZCBzaW5nbGUtcXVvdGUgb3IgZG91YmxlLXF1b3RlIGNoYXJhY3RlcnMuIgorICogICAgLSBVTklYOTggc3BlYworICoKKyAqCisgKi8KKworc3RhdGljIGRidXNfYm9vbF90CitkZWxpbWl0X3Rva2VuIChEQnVzU3RyaW5nICp0b2tlbiwKKyAgICAgICAgICAgICAgIERCdXNMaXN0ICoqcmV0dmFsLAorCSAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICBjaGFyICpzdHI7CisKKyAgc3RyID0gX2RidXNfc3RyZHVwIChfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKHRva2VuKSk7CisgIGlmICghc3RyKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAocmV0dmFsLCBzdHIpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAoc3RyKTsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBEQnVzTGlzdCoKK3Rva2VuaXplX2NvbW1hbmRfbGluZSAoY29uc3QgY2hhciAqY29tbWFuZF9saW5lLCBEQnVzRXJyb3IgKmVycm9yKQoreworICBjaGFyIGN1cnJlbnRfcXVvdGU7CisgIGNvbnN0IGNoYXIgKnA7CisgIERCdXNTdHJpbmcgY3VycmVudF90b2tlbjsKKyAgREJ1c0xpc3QgKnJldHZhbCA9IE5VTEw7CisgIGRidXNfYm9vbF90IHF1b3RlZDs7CisKKyAgY3VycmVudF9xdW90ZSA9ICdcMCc7CisgIHF1b3RlZCA9IEZBTFNFOworICBwID0gY29tbWFuZF9saW5lOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjdXJyZW50X3Rva2VuKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgd2hpbGUgKCpwKQorICAgIHsKKyAgICAgIGlmIChjdXJyZW50X3F1b3RlID09ICdcXCcpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKnAgPT0gJ1xuJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogd2UgYXBwZW5kIG5vdGhpbmc7IGJhY2tzbGFzaC1uZXdsaW5lIGJlY29tZSBub3RoaW5nICovCisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworCSAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmY3VycmVudF90b2tlbiwgJ1xcJykgfHwgCisJICAgICAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZjdXJyZW50X3Rva2VuLCAqcCkpCisJCXsKKwkJICBfREJVU19TRVRfT09NIChlcnJvcik7CisJCSAgZ290byBlcnJvcjsKKwkJfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgY3VycmVudF9xdW90ZSA9ICdcMCc7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGN1cnJlbnRfcXVvdGUgPT0gJyMnKQorICAgICAgICB7CisgICAgICAgICAgLyogRGlzY2FyZCB1cCB0byBhbmQgaW5jbHVkaW5nIG5leHQgbmV3bGluZSAqLworICAgICAgICAgIHdoaWxlICgqcCAmJiAqcCAhPSAnXG4nKQorICAgICAgICAgICAgKytwOworCisgICAgICAgICAgY3VycmVudF9xdW90ZSA9ICdcMCc7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCpwID09ICdcMCcpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoY3VycmVudF9xdW90ZSkKKyAgICAgICAgeworICAgICAgICAgIGlmICgqcCA9PSBjdXJyZW50X3F1b3RlICYmCisgICAgICAgICAgICAgIC8qIGNoZWNrIHRoYXQgaXQgaXNuJ3QgYW4gZXNjYXBlZCBkb3VibGUgcXVvdGUgKi8KKyAgICAgICAgICAgICAgIShjdXJyZW50X3F1b3RlID09ICciJyAmJiBxdW90ZWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBjbG9zZSB0aGUgcXVvdGUgKi8KKyAgICAgICAgICAgICAgY3VycmVudF9xdW90ZSA9ICdcMCc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBFdmVyeXRoaW5nIGluc2lkZSBxdW90ZXMsIGFuZCB0aGUgY2xvc2UgcXVvdGUsCisgICAgICAgICAgICogZ2V0cyBhcHBlbmRlZCBsaXRlcmFsbHkuCisgICAgICAgICAgICovCisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJmN1cnJlbnRfdG9rZW4sICpwKSkKKwkgICAgeworCSAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKwkgICAgICBnb3RvIGVycm9yOworCSAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHN3aXRjaCAoKnApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgIGlmICghZGVsaW1pdF90b2tlbiAoJmN1cnJlbnRfdG9rZW4sICZyZXR2YWwsIGVycm9yKSkKKwkJZ290byBlcnJvcjsKKworCQlfZGJ1c19zdHJpbmdfZnJlZSAoJmN1cnJlbnRfdG9rZW4pOworCisJCWlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjdXJyZW50X3Rva2VuKSkKKwkJICB7CisJCSAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisJCSAgICBnb3RvIGluaXRfZXJyb3I7CisJCSAgfQorCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICcgJzoKKyAgICAgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICAgICAgLyogSWYgdGhlIGN1cnJlbnQgdG9rZW4gY29udGFpbnMgdGhlIHByZXZpb3VzIGNoYXIsIGRlbGltaXQKKyAgICAgICAgICAgICAgICogdGhlIGN1cnJlbnQgdG9rZW4uIEEgbm9uemVybyBsZW5ndGgKKyAgICAgICAgICAgICAgICogdG9rZW4gc2hvdWxkIGFsd2F5cyBjb250YWluIHRoZSBwcmV2aW91cyBjaGFyLgorICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmY3VycmVudF90b2tlbikgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICghZGVsaW1pdF90b2tlbiAoJmN1cnJlbnRfdG9rZW4sICZyZXR2YWwsIGVycm9yKSkKKwkJICAgIGdvdG8gZXJyb3I7CisKKwkJICBfZGJ1c19zdHJpbmdfZnJlZSAoJmN1cnJlbnRfdG9rZW4pOworCisJCSAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmN1cnJlbnRfdG9rZW4pKQorCQkgICAgeworCQkgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisJCSAgICAgIGdvdG8gaW5pdF9lcnJvcjsKKwkJICAgIH0KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIC8qIGRpc2NhcmQgYWxsIHVucXVvdGVkIGJsYW5rcyAoZG9uJ3QgYWRkIHRoZW0gdG8gYSB0b2tlbikgKi8KKyAgICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICAgICAgICAvKiBzaW5nbGUvZG91YmxlIHF1b3RlcyBhcmUgYXBwZW5kZWQgdG8gdGhlIHRva2VuLAorICAgICAgICAgICAgICAgKiBlc2NhcGVzIGFyZSBtYXliZSBhcHBlbmRlZCBuZXh0IHRpbWUgdGhyb3VnaCB0aGUgbG9vcCwKKyAgICAgICAgICAgICAgICogY29tbWVudCBjaGFycyBhcmUgbmV2ZXIgYXBwZW5kZWQuCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJmN1cnJlbnRfdG9rZW4sICpwKSkKKwkJeworCQkgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKwkJICBnb3RvIGVycm9yOworCQl9CisKKyAgICAgICAgICAgICAgLyogRkFMTCBUSFJVICovCisgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSAnIyc6CisgICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgIGN1cnJlbnRfcXVvdGUgPSAqcDsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIC8qIENvbWJpbmVzIHJ1bGVzIDQpIGFuZCA2KSAtIGlmIHdlIGhhdmUgYSB0b2tlbiwgYXBwZW5kIHRvIGl0LAorICAgICAgICAgICAgICAgKiBvdGhlcndpc2UgY3JlYXRlIGEgbmV3IHRva2VuLgorICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZjdXJyZW50X3Rva2VuLCAqcCkpCisJCXsKKwkJICBfREJVU19TRVRfT09NIChlcnJvcik7CisJCSAgZ290byBlcnJvcjsKKwkJfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAvKiBXZSBuZWVkIHRvIGNvdW50IGNvbnNlY3V0aXZlIGJhY2tzbGFzaGVzIG1vZCAyLCAKKyAgICAgICAqIHRvIGRldGVjdCBlc2NhcGVkIGRvdWJsZXF1b3Rlcy4KKyAgICAgICAqLworICAgICAgaWYgKCpwICE9ICdcXCcpCisJcXVvdGVkID0gRkFMU0U7CisgICAgICBlbHNlCisJcXVvdGVkID0gIXF1b3RlZDsKKworICAgICAgKytwOworICAgIH0KKworICBpZiAoIWRlbGltaXRfdG9rZW4gKCZjdXJyZW50X3Rva2VuLCAmcmV0dmFsLCBlcnJvcikpCisgICAgZ290byBlcnJvcjsKKworICBpZiAoY3VycmVudF9xdW90ZSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvcl9jb25zdCAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLCAiVW5jbG9zZWQgcXVvdGVzIGluIGNvbW1hbmQgbGluZSIpOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgaWYgKHJldHZhbCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsICJObyB0b2tlbnMgZm91bmQgaW4gY29tbWFuZCBsaW5lIik7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjdXJyZW50X3Rva2VuKTsKKyAKKyAgcmV0dXJuIHJldHZhbDsKKworIGVycm9yOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmN1cnJlbnRfdG9rZW4pOworCisgaW5pdF9lcnJvcjoKKyAgaWYgKHJldHZhbCkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZyZXR2YWwsIChEQnVzRm9yZWFjaEZ1bmN0aW9uKSBkYnVzX2ZyZWUsIE5VTEwpOworICAgICAgX2RidXNfbGlzdF9jbGVhciAoJnJldHZhbCk7CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIF9kYnVzX3NoZWxsX3BhcnNlX2FyZ3Y6CisgKiAKKyAqIFBhcnNlcyBhIGNvbW1hbmQgbGluZSBpbnRvIGFuIGFyZ3VtZW50IHZlY3RvciwgaW4gbXVjaCB0aGUgc2FtZSB3YXkKKyAqIHRoZSBzaGVsbCB3b3VsZCwgYnV0IHdpdGhvdXQgbWFueSBvZiB0aGUgZXhwYW5zaW9ucyB0aGUgc2hlbGwgd291bGQKKyAqIHBlcmZvcm0gKHZhcmlhYmxlIGV4cGFuc2lvbiwgZ2xvYnMsIG9wZXJhdG9ycywgZmlsZW5hbWUgZXhwYW5zaW9uLAorICogZXRjLiBhcmUgbm90IHN1cHBvcnRlZCkuIFRoZSByZXN1bHRzIGFyZSBkZWZpbmVkIHRvIGJlIHRoZSBzYW1lIGFzCisgKiB0aG9zZSB5b3Ugd291bGQgZ2V0IGZyb20gYSBVTklYOTggL2Jpbi9zaCwgYXMgbG9uZyBhcyB0aGUgaW5wdXQKKyAqIGNvbnRhaW5zIG5vbmUgb2YgdGhlIHVuc3VwcG9ydGVkIHNoZWxsIGV4cGFuc2lvbnMuIElmIHRoZSBpbnB1dAorICogZG9lcyBjb250YWluIHN1Y2ggZXhwYW5zaW9ucywgdGhleSBhcmUgcGFzc2VkIHRocm91Z2gKKyAqIGxpdGVyYWxseS4gRnJlZSB0aGUgcmV0dXJuZWQgdmVjdG9yIHdpdGggZGJ1c19mcmVlX3N0cmluZ19hcnJheSgpLgorICogCisgKiBAY29tbWFuZF9saW5lOiBjb21tYW5kIGxpbmUgdG8gcGFyc2UKKyAqIEBhcmdjcDogcmV0dXJuIGxvY2F0aW9uIGZvciBudW1iZXIgb2YgYXJncworICogQGFyZ3ZwOiByZXR1cm4gbG9jYXRpb24gZm9yIGFycmF5IG9mIGFyZ3MKKyAqIEBlcnJvcjogZXJyb3IgaW5mb3JtYXRpb24KKyAqKi8KK2RidXNfYm9vbF90CitfZGJ1c19zaGVsbF9wYXJzZV9hcmd2IChjb25zdCBjaGFyICpjb21tYW5kX2xpbmUsCisJCQlpbnQgICAgICAgICphcmdjcCwKKwkJCWNoYXIgICAgICoqKmFyZ3ZwLAorCQkJREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIC8qIENvZGUgYmFzZWQgb24gcG9wdFBhcnNlQXJndlN0cmluZygpIGZyb20gbGlicG9wdCAqLworICBpbnQgYXJnYyA9IDA7CisgIGNoYXIgKiphcmd2ID0gTlVMTDsKKyAgREJ1c0xpc3QgKnRva2VucyA9IE5VTEw7CisgIGludCBpOworICBEQnVzTGlzdCAqdG1wX2xpc3Q7CisgIAorICBpZiAoIWNvbW1hbmRfbGluZSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiQ29tbWFuZCBsaW5lIGlzIE5VTExcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICB0b2tlbnMgPSB0b2tlbml6ZV9jb21tYW5kX2xpbmUgKGNvbW1hbmRfbGluZSwgZXJyb3IpOworICBpZiAodG9rZW5zID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIHRva2VucyBmb3IgY29tbWFuZCBsaW5lICclcydcbiIsIGNvbW1hbmRfbGluZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIEJlY2F1c2Ugd2UgY2FuJ3QgaGF2ZSBpbnRyb2R1Y2VkIGFueSBuZXcgYmxhbmsgc3BhY2UgaW50byB0aGUKKyAgICogdG9rZW5zICh3ZSBkaWRuJ3QgZG8gYW55IG5ldyBleHBhbnNpb25zKSwgd2UgZG9uJ3QgbmVlZCB0bworICAgKiBwZXJmb3JtIGZpZWxkIHNwbGl0dGluZy4gSWYgd2Ugd2VyZSBnb2luZyB0byBob25vciBJRlMgb3IgZG8gYW55CisgICAqIGV4cGFuc2lvbnMsIHdlIHdvdWxkIGhhdmUgdG8gZG8gZmllbGQgc3BsaXR0aW5nIG9uIGVhY2ggd29yZAorICAgKiBoZXJlLiBBbHNvLCBpZiB3ZSB3ZXJlIGdvaW5nIHRvIGRvIGFueSBleHBhbnNpb24gd2Ugd291bGQgbmVlZCB0bworICAgKiByZW1vdmUgYW55IHplcm8tbGVuZ3RoIHdvcmRzIHRoYXQgZGlkbid0IGNvbnRhaW4gcXVvdGVzCisgICAqIG9yaWdpbmFsbHk7IGJ1dCBzaW5jZSB0aGVyZSdzIG5vIGV4cGFuc2lvbiB3ZSBrbm93IGFsbCB3b3JkcyBoYXZlCisgICAqIG5vbnplcm8gbGVuZ3RoLCB1bmxlc3MgdGhleSBjb250YWluIHF1b3Rlcy4KKyAgICogCisgICAqIFNvLCB3ZSBzaW1wbHkgcmVtb3ZlIHF1b3RlcywgYW5kIGRvbid0IGRvIGFueSBmaWVsZCBzcGxpdHRpbmcgb3IKKyAgICogZW1wdHkgd29yZCByZW1vdmFsLCBzaW5jZSB3ZSBrbm93IHRoZXJlIHdhcyBubyB3YXkgdG8gaW50cm9kdWNlCisgICAqIHN1Y2ggdGhpbmdzLgorICAgKi8KKworICBhcmdjID0gX2RidXNfbGlzdF9nZXRfbGVuZ3RoICgmdG9rZW5zKTsKKyAgYXJndiA9IGRidXNfbmV3IChjaGFyICosIGFyZ2MgKyAxKTsKKyAgaWYgKCFhcmd2KQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgIGkgPSAwOworICB0bXBfbGlzdCA9IHRva2VuczsKKyAgd2hpbGUgKHRtcF9saXN0KQorICAgIHsKKyAgICAgIGFyZ3ZbaV0gPSBfZGJ1c19zaGVsbF91bnF1b3RlICh0bXBfbGlzdC0+ZGF0YSk7CisKKyAgICAgIGlmICghYXJndltpXSkKKyAgICAgICAgeworICAgICAgICAgIGludCBqOworCSAgZm9yIChqID0gMDsgaiA8IGk7IGorKykKKwkgICAgZGJ1c19mcmVlKGFyZ3Zbal0pOworCisgICAgICAgICAgZGJ1c19mcmVlIChhcmd2KTsKKwkgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKwkgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgdG1wX2xpc3QgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZ0b2tlbnMsIHRtcF9saXN0KTsKKyAgICAgICsraTsKKyAgICB9CisgIGFyZ3ZbYXJnY10gPSBOVUxMOworICAKKyAgX2RidXNfbGlzdF9mb3JlYWNoICgmdG9rZW5zLCAoREJ1c0ZvcmVhY2hGdW5jdGlvbikgZGJ1c19mcmVlLCBOVUxMKTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJnRva2Vucyk7CisgIAorICBpZiAoYXJnY3ApCisgICAgKmFyZ2NwID0gYXJnYzsKKworICBpZiAoYXJndnApCisgICAgKmFyZ3ZwID0gYXJndjsKKyAgZWxzZQorICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGFyZ3YpOworCisgIHJldHVybiBUUlVFOworCisgZXJyb3I6CisgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJnRva2VucywgKERCdXNGb3JlYWNoRnVuY3Rpb24pIGRidXNfZnJlZSwgTlVMTCk7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZ0b2tlbnMpOworCisgIHJldHVybiBGQUxTRTsKKworfQpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtc2hlbGwuaCBiL2RidXMvZGJ1cy9kYnVzLXNoZWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZkYTI3NAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXNoZWxsLmgKQEAgLTAsMCArMSw0MSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNoZWxsLmggU2hlbGwgY29tbWFuZCBsaW5lIHV0aWxpdHkgZnVuY3Rpb25zLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisKKyNpZm5kZWYgREJVU19TSEVMTF9ICisjZGVmaW5lIERCVVNfU0hFTExfSAorCitEQlVTX0JFR0lOX0RFQ0xTCisKK2NoYXIqICAgICAgIF9kYnVzX3NoZWxsX3VucXVvdGUgICAgKGNvbnN0IGNoYXIgKnF1b3RlZF9zdHJpbmcpOworZGJ1c19ib29sX3QgX2RidXNfc2hlbGxfcGFyc2VfYXJndiAoY29uc3QgY2hhciAqY29tbWFuZF9saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAqYXJnY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICoqKmFyZ3ZwLAorCQkJCSAgICBEQnVzRXJyb3IgICplcnJvcik7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1NIRUxMX0ggKi8KKworCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1zaWduYXR1cmUuYyBiL2RidXMvZGJ1cy9kYnVzLXNpZ25hdHVyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMzBkZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1zaWduYXR1cmUuYwpAQCAtMCwwICsxLDU4OSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNpZ25hdHVyZS5jICBSb3V0aW5lcyBmb3IgcmVhZGluZyByZWN1cnNpdmUgdHlwZSBzaWduYXR1cmVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgImRidXMtc2lnbmF0dXJlLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1iYXNpYy5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiAjREJ1c1NpZ25hdHVyZUl0ZXIsIGFsbCBmaWVsZHMgYXJlIHByaXZhdGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sgCisgIGNvbnN0IGNoYXIgKnBvczsgICAgICAgICAgIC8qKjwgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgc2lnbmF0dXJlIHN0cmluZyAqLworICB1bnNpZ25lZCBpbnQgZmluaXNoZWQgOiAxOyAvKio8IHRydWUgaWYgd2UgYXJlIGF0IHRoZSBlbmQgaXRlciAqLworICB1bnNpZ25lZCBpbnQgaW5fYXJyYXkgOiAxOyAvKio8IHRydWUgaWYgd2UgYXJlIGEgc3ViaXRlcmF0b3IgcG9pbnRpbmcgdG8gYW4gYXJyYXkncyBlbGVtZW50IHR5cGUgKi8KK30gREJ1c1NpZ25hdHVyZVJlYWxJdGVyOworCisvKiogbWFjcm8gdGhhdCBjaGVja3Mgd2hldGhlciBhIHR5cGVjb2RlIGlzIGEgY29udGFpbmVyIHR5cGUgKi8KKyNkZWZpbmUgVFlQRV9JU19DT05UQUlORVIodHlwZWNvZGUpICAgICAgICAgICAgIFwKKyAgICAoKHR5cGVjb2RlKSA9PSBEQlVTX1RZUEVfU1RSVUNUIHx8ICAgICAgICAgIFwKKyAgICAgKHR5cGVjb2RlKSA9PSBEQlVTX1RZUEVfRElDVF9FTlRSWSB8fCAgICAgIFwKKyAgICAgKHR5cGVjb2RlKSA9PSBEQlVTX1RZUEVfVkFSSUFOVCB8fCAgICAgICAgIFwKKyAgICAgKHR5cGVjb2RlKSA9PSBEQlVTX1RZUEVfQVJSQVkpCisKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1NpZ25hdHVyZSBUeXBlIHNpZ25hdHVyZSBwYXJzaW5nCisgKiBAaW5ncm91cCAgREJ1cworICogQGJyaWVmIFBhcnNpbmcgRC1CdXMgdHlwZSBzaWduYXR1cmVzCisgKiBAeworICovCisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSAjREJ1c1NpZ25hdHVyZUl0ZXIgZm9yIHJlYWRpbmcgYSB0eXBlIHNpZ25hdHVyZS4gIFRoaXMKKyAqIGZ1bmN0aW9uIGlzIG5vdCBzYWZlIHRvIHVzZSBvbiBpbnZhbGlkIHNpZ25hdHVyZXM7IGJlIHN1cmUgdG8KKyAqIHZhbGlkYXRlIHBvdGVudGlhbGx5IGludmFsaWQgc2lnbmF0dXJlcyB3aXRoIGRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlCisgKiBiZWZvcmUgdXNpbmcgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gaXRlciBwb2ludGVyIHRvIGFuIGl0ZXJhdG9yIHRvIGluaXRpYWxpemUKKyAqIEBwYXJhbSBzaWduYXR1cmUgdGhlIHR5cGUgc2lnbmF0dXJlCisgKi8KK3ZvaWQKK2RidXNfc2lnbmF0dXJlX2l0ZXJfaW5pdCAoREJ1c1NpZ25hdHVyZUl0ZXIgKml0ZXIsCisJCQkgIGNvbnN0IGNoYXIgICAgICAgICpzaWduYXR1cmUpCit7CisgIERCdXNTaWduYXR1cmVSZWFsSXRlciAqcmVhbF9pdGVyID0gKERCdXNTaWduYXR1cmVSZWFsSXRlciAqKSBpdGVyOworCisgIHJlYWxfaXRlci0+cG9zID0gc2lnbmF0dXJlOworICByZWFsX2l0ZXItPmZpbmlzaGVkID0gRkFMU0U7CisgIHJlYWxfaXRlci0+aW5fYXJyYXkgPSBGQUxTRTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHR5cGUgcG9pbnRlZCB0byBieSB0aGUgaXRlcmF0b3IuCisgKiBJZiB0aGUgaXRlcmF0b3IgaXMgcG9pbnRpbmcgYXQgYSB0eXBlIGNvZGUgc3VjaCBhcyAncycsIHRoZW4KKyAqIGl0IHdpbGwgYmUgcmV0dXJuZWQgZGlyZWN0bHkuCisgKgorICogSG93ZXZlciwgd2hlbiB0aGUgcGFyc2VyIGVuY291bnRlcnMgYSBjb250YWluZXIgdHlwZSBzdGFydAorICogY2hhcmFjdGVyIHN1Y2ggYXMgJygnIGZvciBhIHN0cnVjdHVyZSwgdGhlIGNvcnJlc3BvbmRpbmcgdHlwZSBmb3IKKyAqIHRoZSBjb250YWluZXIgd2lsbCBiZSByZXR1cm5lZCwgZS5nLiAgREJVU19UWVBFX1NUUlVDVCwgbm90ICcoJy4KKyAqIEluIHRoaXMgY2FzZSwgeW91IHNob3VsZCBpbml0aWFsaXplIGEgc3ViLWl0ZXJhdG9yIHdpdGgKKyAqIGRidXNfc2lnbmF0dXJlX2l0ZXJfcmVjdXJzZSgpIHRvIHBhcnNlIHRoZSBjb250YWluZXIgdHlwZS4KKyAqCisgKiBAcGFyYW0gaXRlciBwb2ludGVyIHRvIGFuIGl0ZXJhdG9yIAorICogQHJldHVybnMgY3VycmVudCB0eXBlIChlLmcuICNEQlVTX1RZUEVfU1RSSU5HLCAjREJVU19UWVBFX0FSUkFZKQorICovCitpbnQKK2RidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoY29uc3QgREJ1c1NpZ25hdHVyZUl0ZXIgKml0ZXIpCit7CisgIERCdXNTaWduYXR1cmVSZWFsSXRlciAqcmVhbF9pdGVyID0gKERCdXNTaWduYXR1cmVSZWFsSXRlciAqKSBpdGVyOworCisgIHJldHVybiBfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZV9jX3N0ciAocmVhbF9pdGVyLT5wb3MsIDApOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIHNpZ25hdHVyZSBvZiB0aGUgc2luZ2xlIGNvbXBsZXRlIHR5cGUgc3RhcnRpbmcgYXQgdGhlCisgKiBnaXZlbiBpdGVyYXRvci4KKyAqCisgKiBGb3IgZXhhbXBsZSwgaWYgdGhlIGl0ZXJhdG9yIGlzIHBvaW50aW5nIGF0IHRoZSBzdGFydCBvZiAiKGlpKWlpIgorICogKHdoaWNoIGlzICJhIHN0cnVjdCBvZiB0d28gaW50cywgZm9sbG93ZWQgYnkgYW4gaW50LCBmb2xsb3dlZCBieSBhbgorICogaW50IiksIHRoZW4gIihpaSkiIHdvdWxkIGJlIHJldHVybmVkLiBJZiB0aGUgaXRlcmF0b3IgaXMgcG9pbnRpbmcgYXQKKyAqIG9uZSBvZiB0aGUgImkiIHRoZW4ganVzdCB0aGF0ICJpIiB3b3VsZCBiZSByZXR1cm5lZC4KKyAqCisgKiBAcGFyYW0gaXRlciBwb2ludGVyIHRvIGFuIGl0ZXJhdG9yIAorICogQHJldHVybnMgY3VycmVudCBzaWduYXR1cmU7IG9yICNOVUxMIGlmIG5vIG1lbW9yeS4gIFNob3VsZCBiZSBmcmVlZCB3aXRoIGRidXNfZnJlZSgpCisgKi8KK2NoYXIgKgorZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfc2lnbmF0dXJlIChjb25zdCBEQnVzU2lnbmF0dXJlSXRlciAqaXRlcikKK3sKKyAgREJ1c1NpZ25hdHVyZVJlYWxJdGVyICpyZWFsX2l0ZXIgPSAoREJ1c1NpZ25hdHVyZVJlYWxJdGVyICopIGl0ZXI7CisgIERCdXNTdHJpbmcgc3RyOworICBjaGFyICpyZXQ7CisgIGludCBwb3M7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBwb3MgPSAwOworICBfZGJ1c190eXBlX3NpZ25hdHVyZV9uZXh0IChyZWFsX2l0ZXItPnBvcywgJnBvcyk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2xlbiAoJnN0ciwgcmVhbF9pdGVyLT5wb3MsIHBvcykpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmICghX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgKCZzdHIsICZyZXQpKQorICAgIHJldCA9IE5VTEw7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKworICByZXR1cm4gcmV0OyAKK30KKworLyoqCisgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgcmV0dXJuaW5nIHRoZSBlbGVtZW50IHR5cGUgb2YgYW4gYXJyYXk7CisgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gYXZvaWQgaW5pdGlhbGl6aW5nIGEgc3ViLWl0ZXJhdG9yIGFuZAorICogZ2V0dGluZyBpdHMgY3VycmVudCB0eXBlLgorICoKKyAqIFVuZGVmaW5lZCBiZWhhdmlvciByZXN1bHRzIGlmIHlvdSBpbnZva2UgdGhpcyBmdW5jdGlvbiB3aGVuIHRoZQorICogY3VycmVudCB0eXBlIG9mIHRoZSBpdGVyYXRvciBpcyBub3QgI0RCVVNfVFlQRV9BUlJBWS4KKyAqCisgKiBAcGFyYW0gaXRlciBwb2ludGVyIHRvIGFuIGl0ZXJhdG9yIAorICogQHJldHVybnMgY3VycmVudCBhcnJheSBlbGVtZW50IHR5cGUKKyAqLworaW50CitkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9lbGVtZW50X3R5cGUgKGNvbnN0IERCdXNTaWduYXR1cmVJdGVyICppdGVyKQoreworICBEQnVzU2lnbmF0dXJlUmVhbEl0ZXIgKnJlYWxfaXRlciA9IChEQnVzU2lnbmF0dXJlUmVhbEl0ZXIgKikgaXRlcjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoaXRlcikgPT0gREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfSU5WQUxJRCk7CisKKyAgcmV0dXJuIF9kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlX2Nfc3RyIChyZWFsX2l0ZXItPnBvcywgMSk7Cit9CisKKy8qKgorICogU2tpcCB0byB0aGUgbmV4dCB2YWx1ZSBvbiB0aGlzICJsZXZlbCIuIGUuZy4gdGhlIG5leHQgZmllbGQgaW4gYQorICogc3RydWN0LCB0aGUgbmV4dCB2YWx1ZSBpbiBhbiBhcnJheS4gUmV0dXJucyAjRkFMU0UgYXQgdGhlIGVuZCBvZiB0aGUKKyAqIGN1cnJlbnQgY29udGFpbmVyLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBpdGVyYXRvcgorICogQHJldHVybnMgRkFMU0UgaWYgbm90aGluZyBtb3JlIHRvIHJlYWQgYXQgb3IgYmVsb3cgdGhpcyBsZXZlbAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19zaWduYXR1cmVfaXRlcl9uZXh0IChEQnVzU2lnbmF0dXJlSXRlciAqaXRlcikKK3sKKyAgREJ1c1NpZ25hdHVyZVJlYWxJdGVyICpyZWFsX2l0ZXIgPSAoREJ1c1NpZ25hdHVyZVJlYWxJdGVyICopIGl0ZXI7CisKKyAgaWYgKHJlYWxfaXRlci0+ZmluaXNoZWQpCisgICAgcmV0dXJuIEZBTFNFOworICBlbHNlCisgICAgeworICAgICAgaW50IHBvczsKKworICAgICAgaWYgKHJlYWxfaXRlci0+aW5fYXJyYXkpCisJeworCSAgcmVhbF9pdGVyLT5maW5pc2hlZCA9IFRSVUU7CisJICByZXR1cm4gRkFMU0U7CisJfQorCisgICAgICBwb3MgPSAwOworICAgICAgX2RidXNfdHlwZV9zaWduYXR1cmVfbmV4dCAocmVhbF9pdGVyLT5wb3MsICZwb3MpOworICAgICAgcmVhbF9pdGVyLT5wb3MgKz0gcG9zOworCisgICAgICBpZiAoKnJlYWxfaXRlci0+cG9zID09IERCVVNfU1RSVUNUX0VORF9DSEFSCisJICB8fCAqcmVhbF9pdGVyLT5wb3MgPT0gREJVU19ESUNUX0VOVFJZX0VORF9DSEFSKQorCXsKKwkgIHJlYWxfaXRlci0+ZmluaXNoZWQgPSBUUlVFOworCSAgcmV0dXJuIEZBTFNFOworCX0KKworICAgICAgcmV0dXJuICpyZWFsX2l0ZXItPnBvcyAhPSBEQlVTX1RZUEVfSU5WQUxJRDsKKyAgICB9Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZSBhIG5ldyBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3QgdHlwZSBpbiB0aGUgY3VycmVudAorICogY29udGFpbmVyLgorICogCisgKiBUaGUgcmVzdWx0cyBhcmUgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyB0aGlzIGlmIHRoZSBjdXJyZW50IHR5cGUgaXMKKyAqIGEgbm9uLWNvbnRhaW5lciAoaS5lLiBpZiBkYnVzX3R5cGVfaXNfY29udGFpbmVyKCkgcmV0dXJucyAjRkFMU0UKKyAqIGZvciB0aGUgcmVzdWx0IG9mIGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSgpKS4KKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgY3VycmVudCBpbnRlcmF0b3IKKyAqIEBwYXJhbSBzdWJpdGVyIGFuIGl0ZXJhdG9yIHRvIGluaXRpYWxpemUgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGNoaWxkCisgKi8KK3ZvaWQKK2RidXNfc2lnbmF0dXJlX2l0ZXJfcmVjdXJzZSAoY29uc3QgREJ1c1NpZ25hdHVyZUl0ZXIgKml0ZXIsCisJCQkgICAgIERCdXNTaWduYXR1cmVJdGVyICAgICAgICpzdWJpdGVyKQoreworICBEQnVzU2lnbmF0dXJlUmVhbEl0ZXIgKnJlYWxfaXRlciA9IChEQnVzU2lnbmF0dXJlUmVhbEl0ZXIgKikgaXRlcjsKKyAgREJ1c1NpZ25hdHVyZVJlYWxJdGVyICpyZWFsX3N1Yl9pdGVyID0gKERCdXNTaWduYXR1cmVSZWFsSXRlciAqKSBzdWJpdGVyOworCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChkYnVzX3R5cGVfaXNfY29udGFpbmVyIChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKGl0ZXIpKSk7CisKKyAgKnJlYWxfc3ViX2l0ZXIgPSAqcmVhbF9pdGVyOworICByZWFsX3N1Yl9pdGVyLT5pbl9hcnJheSA9IEZBTFNFOworICByZWFsX3N1Yl9pdGVyLT5wb3MrKzsKKworICBpZiAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlIChpdGVyKSA9PSBEQlVTX1RZUEVfQVJSQVkpCisgICAgcmVhbF9zdWJfaXRlci0+aW5fYXJyYXkgPSBUUlVFOworfQorCisvKioKKyAqIENoZWNrIGEgdHlwZSBzaWduYXR1cmUgZm9yIHZhbGlkaXR5LiBSZW1lbWJlciB0aGF0ICNOVUxMIGNhbiBhbHdheXMKKyAqIGJlIHBhc3NlZCBpbnN0ZWFkIG9mIGEgREJ1c0Vycm9yKiwgaWYgeW91IGRvbid0IGNhcmUgYWJvdXQgaGF2aW5nCisgKiBhbiBlcnJvciBuYW1lIGFuZCBtZXNzYWdlLgorICoKKyAqIEBwYXJhbSBzaWduYXR1cmUgYSBwb3RlbnRpYWxseSBpbnZhbGlkIHR5cGUgc2lnbmF0dXJlCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyAjVFJVRSBpZiBzaWduYXR1cmUgaXMgdmFsaWQgb3IgI0ZBTFNFIGlmIGFuIGVycm9yIGlzIHNldAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUgKGNvbnN0IGNoYXIgICAgICAgKnNpZ25hdHVyZSwKKwkJCSBEQnVzRXJyb3IgICAgICAgICplcnJvcikKKwkJCSAKK3sKKyAgREJ1c1N0cmluZyBzdHI7CisgIERCdXNWYWxpZGl0eSByZWFzb247CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIHNpZ25hdHVyZSk7CisgIHJlYXNvbiA9IF9kYnVzX3ZhbGlkYXRlX3NpZ25hdHVyZV93aXRoX3JlYXNvbiAoJnN0ciwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKTsKKworICBpZiAocmVhc29uID09IERCVVNfVkFMSUQpCisgICAgcmV0dXJuIFRSVUU7CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9TSUdOQVRVUkUsIF9kYnVzX3ZhbGlkaXR5X3RvX2Vycm9yX21lc3NhZ2UgKHJlYXNvbikpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworLyoqCisgKiBDaGVjayB0aGF0IGEgdHlwZSBzaWduYXR1cmUgaXMgYm90aCB2YWxpZCBhbmQgY29udGFpbnMgZXhhY3RseSBvbmUKKyAqIGNvbXBsZXRlIHR5cGUuICJPbmUgY29tcGxldGUgdHlwZSIgbWVhbnMgYSBzaW5nbGUgYmFzaWMgdHlwZSwKKyAqIGFycmF5LCBzdHJ1Y3QsIG9yIGRpY3Rpb25hcnksIHRob3VnaCB0aGUgc3RydWN0IG9yIGFycmF5IG1heSBiZQorICogYXJiaXRyYXJpbHkgcmVjdXJzaXZlIGFuZCBjb21wbGV4LiBNb3JlIHRoYW4gb25lIGNvbXBsZXRlIHR5cGUKKyAqIHdvdWxkIG1lYW4gZm9yIGV4YW1wbGUgImlpIiBvciB0d28gaW50ZWdlcnMgaW4gc2VxdWVuY2UuCisgKgorICogQHBhcmFtIHNpZ25hdHVyZSBhIHBvdGVudGlhbGx5IGludmFsaWQgdHlwZSBzaWduYXR1cmUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciByZXR1cm4KKyAqIEByZXR1cm5zICNUUlVFIGlmIHNpZ25hdHVyZSBpcyB2YWxpZCBhbmQgaGFzIGV4YWN0bHkgb25lIGNvbXBsZXRlIHR5cGUKKyAqLworZGJ1c19ib29sX3QKK2RidXNfc2lnbmF0dXJlX3ZhbGlkYXRlX3NpbmdsZSAoY29uc3QgY2hhciAgICAgICAqc2lnbmF0dXJlLAorCQkJCURCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBEQnVzU2lnbmF0dXJlSXRlciBpdGVyOworCisgIGlmICghZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUgKHNpZ25hdHVyZSwgZXJyb3IpKQorICAgIHJldHVybiBGQUxTRTsKKworICBkYnVzX3NpZ25hdHVyZV9pdGVyX2luaXQgKCZpdGVyLCBzaWduYXR1cmUpOworICBpZiAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmaXRlcikgPT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgZ290byBsb3NlOworICBpZiAoIWRidXNfc2lnbmF0dXJlX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgIHJldHVybiBUUlVFOworIGxvc2U6CisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX1NJR05BVFVSRSwgIkV4YWN0bHkgb25lIGNvbXBsZXRlIHR5cGUgcmVxdWlyZWQgaW4gc2lnbmF0dXJlIik7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBBICJjb250YWluZXIgdHlwZSIgY2FuIGNvbnRhaW4gYmFzaWMgdHlwZXMsIG9yIG5lc3RlZAorICogY29udGFpbmVyIHR5cGVzLiAjREJVU19UWVBFX0lOVkFMSUQgaXMgbm90IGEgY29udGFpbmVyIHR5cGUuCisgKgorICogSXQgaXMgYW4gZXJyb3IgdG8gcGFzcyBhbiBpbnZhbGlkIHR5cGUtY29kZSwgb3RoZXIgdGhhbiBEQlVTX1RZUEVfSU5WQUxJRCwKKyAqIHRvIHRoaXMgZnVuY3Rpb24uIFRoZSB2YWxpZCB0eXBlLWNvZGVzIGFyZSBkZWZpbmVkIGJ5IGRidXMtcHJvdG9jb2wuaAorICogYW5kIGNhbiBiZSBjaGVja2VkIHdpdGggZGJ1c190eXBlX2lzX3ZhbGlkKCkuCisgKgorICogQHBhcmFtIHR5cGVjb2RlIGVpdGhlciBhIHZhbGlkIHR5cGUtY29kZSBvciBEQlVTX1RZUEVfSU5WQUxJRAorICogQHJldHVybnMgI1RSVUUgaWYgdHlwZSBpcyBhIGNvbnRhaW5lcgorICovCitkYnVzX2Jvb2xfdAorZGJ1c190eXBlX2lzX2NvbnRhaW5lciAoaW50IHR5cGVjb2RlKQoreworICAvKiBvbmx5IHJlYXNvbmFibGUgKG5vbi1saW5lLW5vaXNlKSB0eXBlY29kZXMgYXJlIGFsbG93ZWQgKi8KKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChkYnVzX3R5cGVfaXNfdmFsaWQgKHR5cGVjb2RlKSB8fCB0eXBlY29kZSA9PSBEQlVTX1RZUEVfSU5WQUxJRCwKKwkJCSAgICBGQUxTRSk7CisgIHJldHVybiBUWVBFX0lTX0NPTlRBSU5FUiAodHlwZWNvZGUpOworfQorCisvKioKKyAqIEEgImJhc2ljIHR5cGUiIGlzIGEgc29tZXdoYXQgYXJiaXRyYXJ5IGNvbmNlcHQsIGJ1dCB0aGUgaW50ZW50IGlzCisgKiB0byBpbmNsdWRlIHRob3NlIHR5cGVzIHRoYXQgYXJlIGZ1bGx5LXNwZWNpZmllZCBieSBhIHNpbmdsZQorICogdHlwZWNvZGUsIHdpdGggbm8gYWRkaXRpb25hbCB0eXBlIGluZm9ybWF0aW9uIG9yIG5lc3RlZCB2YWx1ZXMuIFNvCisgKiBhbGwgbnVtYmVycyBhbmQgc3RyaW5ncyBhcmUgYmFzaWMgdHlwZXMgYW5kIHN0cnVjdHMsIGFycmF5cywgYW5kCisgKiB2YXJpYW50cyBhcmUgbm90IGJhc2ljIHR5cGVzLiAgI0RCVVNfVFlQRV9JTlZBTElEIGlzIG5vdCBhIGJhc2ljCisgKiB0eXBlLgorICoKKyAqIEl0IGlzIGFuIGVycm9yIHRvIHBhc3MgYW4gaW52YWxpZCB0eXBlLWNvZGUsIG90aGVyIHRoYW4gREJVU19UWVBFX0lOVkFMSUQsCisgKiB0byB0aGlzIGZ1bmN0aW9uLiBUaGUgdmFsaWQgdHlwZS1jb2RlcyBhcmUgZGVmaW5lZCBieSBkYnVzLXByb3RvY29sLmgKKyAqIGFuZCBjYW4gYmUgY2hlY2tlZCB3aXRoIGRidXNfdHlwZV9pc192YWxpZCgpLgorICoKKyAqIEBwYXJhbSB0eXBlY29kZSBlaXRoZXIgYSB2YWxpZCB0eXBlLWNvZGUgb3IgREJVU19UWVBFX0lOVkFMSUQKKyAqIEByZXR1cm5zICNUUlVFIGlmIHR5cGUgaXMgYmFzaWMKKyAqLworZGJ1c19ib29sX3QKK2RidXNfdHlwZV9pc19iYXNpYyAoaW50IHR5cGVjb2RlKQoreworICAvKiBvbmx5IHJlYXNvbmFibGUgKG5vbi1saW5lLW5vaXNlKSB0eXBlY29kZXMgYXJlIGFsbG93ZWQgKi8KKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChkYnVzX3R5cGVfaXNfdmFsaWQgKHR5cGVjb2RlKSB8fCB0eXBlY29kZSA9PSBEQlVTX1RZUEVfSU5WQUxJRCwKKwkJCSAgICBGQUxTRSk7CisKKyAgLyogZXZlcnl0aGluZyB0aGF0IGlzbid0IGludmFsaWQgb3IgYSBjb250YWluZXIgKi8KKyAgcmV0dXJuICEodHlwZWNvZGUgPT0gREJVU19UWVBFX0lOVkFMSUQgfHwgVFlQRV9JU19DT05UQUlORVIgKHR5cGVjb2RlKSk7Cit9CisKKy8qKgorICogVGVsbHMgeW91IHdoZXRoZXIgdmFsdWVzIG9mIHRoaXMgdHlwZSBjYW4gY2hhbmdlIGxlbmd0aCBpZiB5b3Ugc2V0CisgKiB0aGVtIHRvIHNvbWUgb3RoZXIgdmFsdWUuIEZvciB0aGlzIHB1cnBvc2UsIHlvdSBhc3N1bWUgdGhhdCB0aGUKKyAqIGZpcnN0IGJ5dGUgb2YgdGhlIG9sZCBhbmQgbmV3IHZhbHVlIHdvdWxkIGJlIGluIHRoZSBzYW1lIGxvY2F0aW9uLAorICogc28gYWxpZ25tZW50IHBhZGRpbmcgaXMgbm90IGEgZmFjdG9yLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIHRvIGRldGVybWluZSB3aGV0aGVyCisgKiBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZml4ZWRfYXJyYXkoKSBtYXkgYmUgdXNlZC4KKyAqCisgKiBTb21lIHN0cnVjdHMgYXJlIGZpeGVkLXNpemUgKGlmIHRoZXkgY29udGFpbiBvbmx5IGZpeGVkLXNpemUgdHlwZXMpCisgKiBidXQgc3RydWN0IGlzIG5vdCBjb25zaWRlcmVkIGEgZml4ZWQgdHlwZSBmb3IgcHVycG9zZXMgb2YgdGhpcworICogZnVuY3Rpb24uCisgKgorICogSXQgaXMgYW4gZXJyb3IgdG8gcGFzcyBhbiBpbnZhbGlkIHR5cGUtY29kZSwgb3RoZXIgdGhhbiBEQlVTX1RZUEVfSU5WQUxJRCwKKyAqIHRvIHRoaXMgZnVuY3Rpb24uIFRoZSB2YWxpZCB0eXBlLWNvZGVzIGFyZSBkZWZpbmVkIGJ5IGRidXMtcHJvdG9jb2wuaAorICogYW5kIGNhbiBiZSBjaGVja2VkIHdpdGggZGJ1c190eXBlX2lzX3ZhbGlkKCkuCisgKgorICogQHBhcmFtIHR5cGVjb2RlIGVpdGhlciBhIHZhbGlkIHR5cGUtY29kZSBvciBEQlVTX1RZUEVfSU5WQUxJRAorICogQHJldHVybnMgI0ZBTFNFIGlmIHRoZSB0eXBlIGNhbiBvY2N1cHkgZGlmZmVyZW50IGxlbmd0aHMKKyAqLworZGJ1c19ib29sX3QKK2RidXNfdHlwZV9pc19maXhlZCAoaW50IHR5cGVjb2RlKQoreworICAvKiBvbmx5IHJlYXNvbmFibGUgKG5vbi1saW5lLW5vaXNlKSB0eXBlY29kZXMgYXJlIGFsbG93ZWQgKi8KKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChkYnVzX3R5cGVfaXNfdmFsaWQgKHR5cGVjb2RlKSB8fCB0eXBlY29kZSA9PSBEQlVTX1RZUEVfSU5WQUxJRCwKKwkJCSAgICBGQUxTRSk7CisgIAorICBzd2l0Y2ggKHR5cGVjb2RlKQorICAgIHsKKyAgICBjYXNlIERCVVNfVFlQRV9CWVRFOgorICAgIGNhc2UgREJVU19UWVBFX0JPT0xFQU46CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgIGNhc2UgREJVU19UWVBFX0lOVDMyOgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQzMjoKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UNjQ6CisgICAgY2FzZSBEQlVTX1RZUEVfRE9VQkxFOgorICAgIGNhc2UgREJVU19UWVBFX1VOSVhfRkQ6CisgICAgICByZXR1cm4gVFJVRTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworLyoqCisgKiBSZXR1cm4gI1RSVUUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgdmFsaWQgdHlwZWNvZGUuCisgKiAjREJVU19UWVBFX0lOVkFMSUQgc3VycHJpc2luZ2x5IGVub3VnaCBpcyBub3QgY29uc2lkZXJlZCB2YWxpZCwgYW5kCisgKiByYW5kb20gdW5rbm93biBieXRlcyBhcmVuJ3QgZWl0aGVyLiBUaGlzIGZ1bmN0aW9uIGlzIHNhZmUgd2l0aAorICogdW50cnVzdGVkIGRhdGEuCisgKgorICogQHBhcmFtIHR5cGVjb2RlIGEgcG90ZW50aWFsIHR5cGUtY29kZQorICogQHJldHVybnMgI1RSVUUgaWYgdmFsaWQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfdHlwZV9pc192YWxpZCAoaW50IHR5cGVjb2RlKQoreworICBzd2l0Y2ggKHR5cGVjb2RlKQorICAgIHsKKyAgICBjYXNlIERCVVNfVFlQRV9CWVRFOgorICAgIGNhc2UgREJVU19UWVBFX0JPT0xFQU46CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgIGNhc2UgREJVU19UWVBFX0lOVDMyOgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQzMjoKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UNjQ6CisgICAgY2FzZSBEQlVTX1RZUEVfRE9VQkxFOgorICAgIGNhc2UgREJVU19UWVBFX1NUUklORzoKKyAgICBjYXNlIERCVVNfVFlQRV9PQkpFQ1RfUEFUSDoKKyAgICBjYXNlIERCVVNfVFlQRV9TSUdOQVRVUkU6CisgICAgY2FzZSBEQlVTX1RZUEVfQVJSQVk6CisgICAgY2FzZSBEQlVTX1RZUEVfU1RSVUNUOgorICAgIGNhc2UgREJVU19UWVBFX0RJQ1RfRU5UUlk6CisgICAgY2FzZSBEQlVTX1RZUEVfVkFSSUFOVDoKKyAgICBjYXNlIERCVVNfVFlQRV9VTklYX0ZEOgorICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworLyoqIEB9ICovIC8qIGVuZCBvZiBEQnVzU2lnbmF0dXJlIGdyb3VwICovCisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisKKy8qKgorICogQGluZ3JvdXAgREJ1c1NpZ25hdHVyZUludGVybmFscworICogVW5pdCB0ZXN0IGZvciBEQnVzU2lnbmF0dXJlLgorICoKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zaWduYXR1cmVfdGVzdCAodm9pZCkKK3sKKyAgREJ1c1NpZ25hdHVyZUl0ZXIgaXRlcjsKKyAgREJ1c1NpZ25hdHVyZUl0ZXIgc3ViaXRlcjsKKyAgREJ1c1NpZ25hdHVyZUl0ZXIgc3Vic3ViaXRlcjsKKyAgREJ1c1NpZ25hdHVyZUl0ZXIgc3Vic3Vic3ViaXRlcjsKKyAgY29uc3QgY2hhciAqc2lnOworICBkYnVzX2Jvb2xfdCBib29scmVzOworCisgIF9kYnVzX2Fzc2VydCAoc2l6ZW9mIChEQnVzU2lnbmF0dXJlSXRlcikgPj0gc2l6ZW9mIChEQnVzU2lnbmF0dXJlUmVhbEl0ZXIpKTsKKworICBzaWcgPSAiIjsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSAoc2lnLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlX3NpbmdsZSAoc2lnLCBOVUxMKSk7CisgIGRidXNfc2lnbmF0dXJlX2l0ZXJfaW5pdCAoJml0ZXIsIHNpZyk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmaXRlcikgPT0gREJVU19UWVBFX0lOVkFMSUQpOworCisgIHNpZyA9IERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlIChzaWcsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZV9zaW5nbGUgKHNpZywgTlVMTCkpOworICBkYnVzX3NpZ25hdHVyZV9pdGVyX2luaXQgKCZpdGVyLCBzaWcpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJml0ZXIpID09IERCVVNfVFlQRV9TVFJJTkcpOworCisgIHNpZyA9IERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HIERCVVNfVFlQRV9CWVRFX0FTX1NUUklORzsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSAoc2lnLCBOVUxMKSk7CisgIGRidXNfc2lnbmF0dXJlX2l0ZXJfaW5pdCAoJml0ZXIsIHNpZyk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmaXRlcikgPT0gREJVU19UWVBFX1NUUklORyk7CisgIGJvb2xyZXMgPSBkYnVzX3NpZ25hdHVyZV9pdGVyX25leHQgKCZpdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChib29scmVzKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZpdGVyKSA9PSBEQlVTX1RZUEVfQllURSk7CisKKyAgc2lnID0gREJVU19UWVBFX1VJTlQxNl9BU19TVFJJTkcKKyAgICBEQlVTX1NUUlVDVF9CRUdJTl9DSEFSX0FTX1NUUklORworICAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HCisgICAgREJVU19UWVBFX1VJTlQzMl9BU19TVFJJTkcKKyAgICBEQlVTX1RZUEVfVkFSSUFOVF9BU19TVFJJTkcKKyAgICBEQlVTX1RZUEVfRE9VQkxFX0FTX1NUUklORworICAgIERCVVNfU1RSVUNUX0VORF9DSEFSX0FTX1NUUklORzsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSAoc2lnLCBOVUxMKSk7CisgIGRidXNfc2lnbmF0dXJlX2l0ZXJfaW5pdCAoJml0ZXIsIHNpZyk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmaXRlcikgPT0gREJVU19UWVBFX1VJTlQxNik7CisgIGJvb2xyZXMgPSBkYnVzX3NpZ25hdHVyZV9pdGVyX25leHQgKCZpdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChib29scmVzKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZpdGVyKSA9PSBEQlVTX1RZUEVfU1RSVUNUKTsKKyAgZGJ1c19zaWduYXR1cmVfaXRlcl9yZWN1cnNlICgmaXRlciwgJnN1Yml0ZXIpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1Yml0ZXIpID09IERCVVNfVFlQRV9TVFJJTkcpOworICBib29scmVzID0gZGJ1c19zaWduYXR1cmVfaXRlcl9uZXh0ICgmc3ViaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoYm9vbHJlcyk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmc3ViaXRlcikgPT0gREJVU19UWVBFX1VJTlQzMik7CisgIGJvb2xyZXMgPSBkYnVzX3NpZ25hdHVyZV9pdGVyX25leHQgKCZzdWJpdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChib29scmVzKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZzdWJpdGVyKSA9PSBEQlVTX1RZUEVfVkFSSUFOVCk7CisgIGJvb2xyZXMgPSBkYnVzX3NpZ25hdHVyZV9pdGVyX25leHQgKCZzdWJpdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChib29scmVzKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZzdWJpdGVyKSA9PSBEQlVTX1RZUEVfRE9VQkxFKTsKKworICBzaWcgPSBEQlVTX1RZUEVfVUlOVDE2X0FTX1NUUklORworICAgIERCVVNfU1RSVUNUX0JFR0lOX0NIQVJfQVNfU1RSSU5HCisgICAgREJVU19UWVBFX1VJTlQzMl9BU19TVFJJTkcKKyAgICBEQlVTX1RZUEVfQllURV9BU19TVFJJTkcKKyAgICBEQlVTX1RZUEVfQVJSQVlfQVNfU1RSSU5HCisgICAgREJVU19UWVBFX0FSUkFZX0FTX1NUUklORworICAgIERCVVNfVFlQRV9ET1VCTEVfQVNfU1RSSU5HCisgICAgREJVU19TVFJVQ1RfQkVHSU5fQ0hBUl9BU19TVFJJTkcKKyAgICBEQlVTX1RZUEVfQllURV9BU19TVFJJTkcKKyAgICBEQlVTX1NUUlVDVF9FTkRfQ0hBUl9BU19TVFJJTkcKKyAgICBEQlVTX1NUUlVDVF9FTkRfQ0hBUl9BU19TVFJJTkc7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUgKHNpZywgTlVMTCkpOworICBkYnVzX3NpZ25hdHVyZV9pdGVyX2luaXQgKCZpdGVyLCBzaWcpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJml0ZXIpID09IERCVVNfVFlQRV9VSU5UMTYpOworICBib29scmVzID0gZGJ1c19zaWduYXR1cmVfaXRlcl9uZXh0ICgmaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoYm9vbHJlcyk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmaXRlcikgPT0gREJVU19UWVBFX1NUUlVDVCk7CisgIGRidXNfc2lnbmF0dXJlX2l0ZXJfcmVjdXJzZSAoJml0ZXIsICZzdWJpdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZzdWJpdGVyKSA9PSBEQlVTX1RZUEVfVUlOVDMyKTsKKyAgYm9vbHJlcyA9IGRidXNfc2lnbmF0dXJlX2l0ZXJfbmV4dCAoJnN1Yml0ZXIpOworICBfZGJ1c19hc3NlcnQgKGJvb2xyZXMpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1Yml0ZXIpID09IERCVVNfVFlQRV9CWVRFKTsKKyAgYm9vbHJlcyA9IGRidXNfc2lnbmF0dXJlX2l0ZXJfbmV4dCAoJnN1Yml0ZXIpOworICBfZGJ1c19hc3NlcnQgKGJvb2xyZXMpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1Yml0ZXIpID09IERCVVNfVFlQRV9BUlJBWSk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfZWxlbWVudF90eXBlICgmc3ViaXRlcikgPT0gREJVU19UWVBFX0FSUkFZKTsKKworICBkYnVzX3NpZ25hdHVyZV9pdGVyX3JlY3Vyc2UgKCZzdWJpdGVyLCAmc3Vic3ViaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmc3Vic3ViaXRlcikgPT0gREJVU19UWVBFX0FSUkFZKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9lbGVtZW50X3R5cGUgKCZzdWJzdWJpdGVyKSA9PSBEQlVTX1RZUEVfRE9VQkxFKTsKKworICBkYnVzX3NpZ25hdHVyZV9pdGVyX3JlY3Vyc2UgKCZzdWJzdWJpdGVyLCAmc3Vic3Vic3ViaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmc3Vic3Vic3ViaXRlcikgPT0gREJVU19UWVBFX0RPVUJMRSk7CisgIGJvb2xyZXMgPSBkYnVzX3NpZ25hdHVyZV9pdGVyX25leHQgKCZzdWJpdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChib29scmVzKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZzdWJpdGVyKSA9PSBEQlVTX1RZUEVfU1RSVUNUKTsKKyAgZGJ1c19zaWduYXR1cmVfaXRlcl9yZWN1cnNlICgmc3ViaXRlciwgJnN1YnN1Yml0ZXIpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1YnN1Yml0ZXIpID09IERCVVNfVFlQRV9CWVRFKTsKKworICBzaWcgPSBEQlVTX1RZUEVfQVJSQVlfQVNfU1RSSU5HCisgICAgREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVJfQVNfU1RSSU5HCisgICAgREJVU19UWVBFX0lOVDE2X0FTX1NUUklORworICAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HCisgICAgREJVU19ESUNUX0VOVFJZX0VORF9DSEFSX0FTX1NUUklORworICAgIERCVVNfVFlQRV9WQVJJQU5UX0FTX1NUUklORzsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSAoc2lnLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlX3NpbmdsZSAoc2lnLCBOVUxMKSk7CisgIGRidXNfc2lnbmF0dXJlX2l0ZXJfaW5pdCAoJml0ZXIsIHNpZyk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmaXRlcikgPT0gREJVU19UWVBFX0FSUkFZKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9lbGVtZW50X3R5cGUgKCZpdGVyKSA9PSBEQlVTX1RZUEVfRElDVF9FTlRSWSk7CisKKyAgZGJ1c19zaWduYXR1cmVfaXRlcl9yZWN1cnNlICgmaXRlciwgJnN1Yml0ZXIpOworICBkYnVzX3NpZ25hdHVyZV9pdGVyX3JlY3Vyc2UgKCZzdWJpdGVyLCAmc3Vic3ViaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmc3Vic3ViaXRlcikgPT0gREJVU19UWVBFX0lOVDE2KTsKKyAgYm9vbHJlcyA9IGRidXNfc2lnbmF0dXJlX2l0ZXJfbmV4dCAoJnN1YnN1Yml0ZXIpOworICBfZGJ1c19hc3NlcnQgKGJvb2xyZXMpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1YnN1Yml0ZXIpID09IERCVVNfVFlQRV9TVFJJTkcpOworICBib29scmVzID0gZGJ1c19zaWduYXR1cmVfaXRlcl9uZXh0ICgmc3Vic3ViaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoIWJvb2xyZXMpOworCisgIGJvb2xyZXMgPSBkYnVzX3NpZ25hdHVyZV9pdGVyX25leHQgKCZpdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChib29scmVzKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZpdGVyKSA9PSBEQlVTX1RZUEVfVkFSSUFOVCk7CisgIGJvb2xyZXMgPSBkYnVzX3NpZ25hdHVyZV9pdGVyX25leHQgKCZpdGVyKTsKKyAgX2RidXNfYXNzZXJ0ICghYm9vbHJlcyk7CisKKyAgc2lnID0gREJVU19UWVBFX0RJQ1RfRU5UUllfQVNfU1RSSU5HOworICBfZGJ1c19hc3NlcnQgKCFkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSAoc2lnLCBOVUxMKSk7CisKKyAgc2lnID0gREJVU19UWVBFX0FSUkFZX0FTX1NUUklORzsKKyAgX2RidXNfYXNzZXJ0ICghZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUgKHNpZywgTlVMTCkpOworCisgIHNpZyA9IERCVVNfVFlQRV9VSU5UMzJfQVNfU1RSSU5HCisgICAgREJVU19UWVBFX0FSUkFZX0FTX1NUUklORzsKKyAgX2RidXNfYXNzZXJ0ICghZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUgKHNpZywgTlVMTCkpOworCisgIHNpZyA9IERCVVNfVFlQRV9BUlJBWV9BU19TVFJJTkcKKyAgICBEQlVTX1RZUEVfRElDVF9FTlRSWV9BU19TVFJJTkc7CisgIF9kYnVzX2Fzc2VydCAoIWRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlIChzaWcsIE5VTEwpKTsKKworICBzaWcgPSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUl9BU19TVFJJTkc7CisgIF9kYnVzX2Fzc2VydCAoIWRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlIChzaWcsIE5VTEwpKTsKKworICBzaWcgPSBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVJfQVNfU1RSSU5HOworICBfZGJ1c19hc3NlcnQgKCFkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSAoc2lnLCBOVUxMKSk7CisKKyAgc2lnID0gREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVJfQVNfU1RSSU5HCisgICAgREJVU19UWVBFX0lOVDMyX0FTX1NUUklORzsKKyAgX2RidXNfYXNzZXJ0ICghZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUgKHNpZywgTlVMTCkpOworCisgIHNpZyA9IERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSX0FTX1NUUklORworICAgIERCVVNfVFlQRV9JTlQzMl9BU19TVFJJTkcKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORzsKKyAgX2RidXNfYXNzZXJ0ICghZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUgKHNpZywgTlVMTCkpOworCisgIHNpZyA9IERCVVNfU1RSVUNUX0VORF9DSEFSX0FTX1NUUklORworICAgIERCVVNfU1RSVUNUX0JFR0lOX0NIQVJfQVNfU1RSSU5HOworICBfZGJ1c19hc3NlcnQgKCFkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSAoc2lnLCBOVUxMKSk7CisKKyAgc2lnID0gREJVU19TVFJVQ1RfQkVHSU5fQ0hBUl9BU19TVFJJTkcKKyAgICBEQlVTX1RZUEVfQk9PTEVBTl9BU19TVFJJTkc7CisgIF9kYnVzX2Fzc2VydCAoIWRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlIChzaWcsIE5VTEwpKTsKKyAgcmV0dXJuIFRSVUU7CisjaWYgMAorIG9vbToKKyAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib3V0IG9mIG1lbW9yeSIpOworICByZXR1cm4gRkFMU0U7CisjZW5kaWYKK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLXNpZ25hdHVyZS5oIGIvZGJ1cy9kYnVzL2RidXMtc2lnbmF0dXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQzOTQxYwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXNpZ25hdHVyZS5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zaWduYXR1cmVzLmggdXRpbGl0eSBmdW5jdGlvbnMgZm9yIEQtQnVzIHR5cGVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmICFkZWZpbmVkIChEQlVTX0lOU0lERV9EQlVTX0gpICYmICFkZWZpbmVkIChEQlVTX0NPTVBJTEFUSU9OKQorI2Vycm9yICJPbmx5IDxkYnVzL2RidXMuaD4gY2FuIGJlIGluY2x1ZGVkIGRpcmVjdGx5LCB0aGlzIGZpbGUgbWF5IGRpc2FwcGVhciBvciBjaGFuZ2UgY29udGVudHMuIgorI2VuZGlmCisKKyNpZm5kZWYgREJVU19TSUdOQVRVUkVTX0gKKyNkZWZpbmUgREJVU19TSUdOQVRVUkVTX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWNyb3MuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZXJyb3JzLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzU2lnbmF0dXJlCisgKiBAeworICovCisKKy8qKgorICogREJ1c1NpZ25hdHVyZUl0ZXIgc3RydWN0OyBjb250YWlucyBubyBwdWJsaWMgZmllbGRzIAorICovCit0eXBlZGVmIHN0cnVjdAoreyAKKyAgdm9pZCAqZHVtbXkxOyAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgdm9pZCAqZHVtbXkyOyAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgZGJ1c191aW50MzJfdCBkdW1teTg7IC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15MTI7ICAgICAgICAgICAvKio8IERvbid0IHVzZSB0aGlzICovCisgIGludCBkdW1teTE3OyAgICAgICAgICAgLyoqPCBEb24ndCB1c2UgdGhpcyAqLworfSBEQnVzU2lnbmF0dXJlSXRlcjsKKworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICAgICBkYnVzX3NpZ25hdHVyZV9pdGVyX2luaXQgICAgICAgICAgICAgKERCdXNTaWduYXR1cmVJdGVyICAgICAgICppdGVyLAorCQkJCQkJICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgKnNpZ25hdHVyZSk7CisKK0RCVVNfRVhQT1JUCitpbnQgICAgICAgICAgICAgZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlIChjb25zdCBEQnVzU2lnbmF0dXJlSXRlciAqaXRlcik7CisKK0RCVVNfRVhQT1JUCitjaGFyICogICAgICAgICAgZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfc2lnbmF0dXJlICAgIChjb25zdCBEQnVzU2lnbmF0dXJlSXRlciAqaXRlcik7CisKK0RCVVNfRVhQT1JUCitpbnQgICAgICAgICAgICAgZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfZWxlbWVudF90eXBlIChjb25zdCBEQnVzU2lnbmF0dXJlSXRlciAqaXRlcik7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgZGJ1c19zaWduYXR1cmVfaXRlcl9uZXh0ICAgICAgICAgICAgIChEQnVzU2lnbmF0dXJlSXRlciAgICAgICAqaXRlcik7CisKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgICAgZGJ1c19zaWduYXR1cmVfaXRlcl9yZWN1cnNlICAgICAgICAgIChjb25zdCBEQnVzU2lnbmF0dXJlSXRlciAqaXRlciwKKwkJCQkJCSAgICAgIERCdXNTaWduYXR1cmVJdGVyICAgICAgICpzdWJpdGVyKTsKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICBkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgICAgICAgKnNpZ25hdHVyZSwKKwkJCQkJCSAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICBkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZV9zaW5nbGUgICAgICAgKGNvbnN0IGNoYXIgICAgICAgKnNpZ25hdHVyZSwKKwkJCQkJCSAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICBkYnVzX3R5cGVfaXNfdmFsaWQgICAgICAgICAgICAgICAgICAgKGludCAgICAgICAgICAgIHR5cGVjb2RlKTsKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICBkYnVzX3R5cGVfaXNfYmFzaWMgICAgICAgICAgICAgICAgICAgKGludCAgICAgICAgICAgIHR5cGVjb2RlKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgZGJ1c190eXBlX2lzX2NvbnRhaW5lciAgICAgICAgICAgICAgIChpbnQgICAgICAgICAgICB0eXBlY29kZSk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgIGRidXNfdHlwZV9pc19maXhlZCAgICAgICAgICAgICAgICAgICAoaW50ICAgICAgICAgICAgdHlwZWNvZGUpOworCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfU0lHTkFUVVJFX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLXNvY2tldC1zZXQtZXBvbGwuYyBiL2RidXMvZGJ1cy9kYnVzLXNvY2tldC1zZXQtZXBvbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2Q5YTU2Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtc29ja2V0LXNldC1lcG9sbC5jCkBAIC0wLDAgKzEsMzcxIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc29ja2V0LXNldC1lcG9sbC5jIC0gYSBzb2NrZXQgc2V0IGltcGxlbWVudGVkIHZpYSBMaW51eCBlcG9sbCg0KQorICoKKyAqIENvcHlyaWdodCDCqSAyMDExIE5va2lhIENvcnBvcmF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwKKyAqIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtc29ja2V0LXNldC5oIgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisKKyNpZm5kZWYgX19saW51eF9fCisjIGVycm9yIFRoaXMgZmlsZSBpcyBmb3IgTGludXggZXBvbGwoNCkKKyNlbmRpZgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9lcG9sbC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgREJ1c1NvY2tldFNldCBwYXJlbnQ7CisgICAgaW50IGVwZmQ7Cit9IERCdXNTb2NrZXRTZXRFcG9sbDsKKworc3RhdGljIGlubGluZSBEQnVzU29ja2V0U2V0RXBvbGwgKgorc29ja2V0X3NldF9lcG9sbF9jYXN0IChEQnVzU29ja2V0U2V0ICpzZXQpCit7CisgIF9kYnVzX2Fzc2VydCAoc2V0LT5jbHMgPT0gJl9kYnVzX3NvY2tldF9zZXRfZXBvbGxfY2xhc3MpOworICByZXR1cm4gKERCdXNTb2NrZXRTZXRFcG9sbCAqKSBzZXQ7Cit9CisKKy8qIHRoaXMgaXMgc2FmZSB0byBjYWxsIG9uIGEgcGFydGlhbGx5LWFsbG9jYXRlZCBzb2NrZXQgc2V0ICovCitzdGF0aWMgdm9pZAorc29ja2V0X3NldF9lcG9sbF9mcmVlIChEQnVzU29ja2V0U2V0ICpzZXQpCit7CisgIERCdXNTb2NrZXRTZXRFcG9sbCAqc2VsZiA9IHNvY2tldF9zZXRfZXBvbGxfY2FzdCAoc2V0KTsKKworICBpZiAoc2VsZiA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBpZiAoc2VsZi0+ZXBmZCAhPSAtMSkKKyAgICBjbG9zZSAoc2VsZi0+ZXBmZCk7CisKKyAgZGJ1c19mcmVlIChzZWxmKTsKK30KKworREJ1c1NvY2tldFNldCAqCitfZGJ1c19zb2NrZXRfc2V0X2Vwb2xsX25ldyAodm9pZCkKK3sKKyAgREJ1c1NvY2tldFNldEVwb2xsICpzZWxmOworCisgIHNlbGYgPSBkYnVzX25ldzAgKERCdXNTb2NrZXRTZXRFcG9sbCwgMSk7CisKKyAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBzZWxmLT5wYXJlbnQuY2xzID0gJl9kYnVzX3NvY2tldF9zZXRfZXBvbGxfY2xhc3M7CisKKyAgc2VsZi0+ZXBmZCA9IGVwb2xsX2NyZWF0ZTEgKEVQT0xMX0NMT0VYRUMpOworCisgIGlmIChzZWxmLT5lcGZkID09IC0xKQorICAgIHsKKyAgICAgIGludCBmbGFnczsKKworICAgICAgLyogdGhlIHNpemUgaGludCBpcyBpZ25vcmVkIHVubGVzcyB5b3UgaGF2ZSBhIHJhdGhlciBvbGQga2VybmVsLAorICAgICAgICogYnV0IG11c3QgYmUgcG9zaXRpdmUgb24gc29tZSB2ZXJzaW9ucywgc28ganVzdCBwaWNrIHNvbWV0aGluZworICAgICAgICogYXJiaXRyYXJ5OyBpdCdzIGEgaGludCwgbm90IGEgbGltaXQgKi8KKyAgICAgIHNlbGYtPmVwZmQgPSBlcG9sbF9jcmVhdGUgKDQyKTsKKworICAgICAgZmxhZ3MgPSBmY250bCAoc2VsZi0+ZXBmZCwgRl9HRVRGRCwgMCk7CisKKyAgICAgIGlmIChmbGFncyAhPSAtMSkKKyAgICAgICAgZmNudGwgKHNlbGYtPmVwZmQsIEZfU0VURkQsIGZsYWdzIHwgRkRfQ0xPRVhFQyk7CisgICAgfQorCisgIGlmIChzZWxmLT5lcGZkID09IC0xKQorICAgIHsKKyAgICAgIHNvY2tldF9zZXRfZXBvbGxfZnJlZSAoKERCdXNTb2NrZXRTZXQgKikgc2VsZik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIChEQnVzU29ja2V0U2V0ICopIHNlbGY7Cit9CisKK3N0YXRpYyB1aW50MzJfdAord2F0Y2hfZmxhZ3NfdG9fZXBvbGxfZXZlbnRzICh1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisgIHVpbnQzMl90IGV2ZW50cyA9IDA7CisKKyAgaWYgKGZsYWdzICYgREJVU19XQVRDSF9SRUFEQUJMRSkKKyAgICBldmVudHMgfD0gRVBPTExJTjsKKyAgaWYgKGZsYWdzICYgREJVU19XQVRDSF9XUklUQUJMRSkKKyAgICBldmVudHMgfD0gRVBPTExPVVQ7CisKKyAgcmV0dXJuIGV2ZW50czsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorZXBvbGxfZXZlbnRzX3RvX3dhdGNoX2ZsYWdzICh1aW50MzJfdCBldmVudHMpCit7CisgIHNob3J0IGZsYWdzID0gMDsKKworICBpZiAoZXZlbnRzICYgRVBPTExJTikKKyAgICBmbGFncyB8PSBEQlVTX1dBVENIX1JFQURBQkxFOworICBpZiAoZXZlbnRzICYgRVBPTExPVVQpCisgICAgZmxhZ3MgfD0gREJVU19XQVRDSF9XUklUQUJMRTsKKyAgaWYgKGV2ZW50cyAmIEVQT0xMSFVQKQorICAgIGZsYWdzIHw9IERCVVNfV0FUQ0hfSEFOR1VQOworICBpZiAoZXZlbnRzICYgRVBPTExFUlIpCisgICAgZmxhZ3MgfD0gREJVU19XQVRDSF9FUlJPUjsKKworICByZXR1cm4gZmxhZ3M7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc29ja2V0X3NldF9lcG9sbF9hZGQgKERCdXNTb2NrZXRTZXQgICpzZXQsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgZW5hYmxlZCkKK3sKKyAgREJ1c1NvY2tldFNldEVwb2xsICpzZWxmID0gc29ja2V0X3NldF9lcG9sbF9jYXN0IChzZXQpOworICBzdHJ1Y3QgZXBvbGxfZXZlbnQgZXZlbnQ7CisgIGludCBlcnI7CisKKyAgZXZlbnQuZGF0YS5mZCA9IGZkOworCisgIGlmIChlbmFibGVkKQorICAgIHsKKyAgICAgIGV2ZW50LmV2ZW50cyA9IHdhdGNoX2ZsYWdzX3RvX2Vwb2xsX2V2ZW50cyAoZmxhZ3MpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdlIG5lZWQgdG8gYWRkICpzb21ldGhpbmcqIHRvIHJlc2VydmUgc3BhY2UgaW4gdGhlIGtlcm5lbCdzIGRhdGEKKyAgICAgICAqIHN0cnVjdHVyZXM6IHNlZSBzb2NrZXRfc2V0X2Vwb2xsX2Rpc2FibGUgZm9yIG1vcmUgZGV0YWlscyAqLworICAgICAgZXZlbnQuZXZlbnRzID0gRVBPTExFVDsKKyAgICB9CisKKyAgaWYgKGVwb2xsX2N0bCAoc2VsZi0+ZXBmZCwgRVBPTExfQ1RMX0FERCwgZmQsICZldmVudCkgPT0gMCkKKyAgICByZXR1cm4gVFJVRTsKKworICAvKiBBbnl0aGluZyBleGNlcHQgRU5PTUVNLCBFTk9TUEMgbWVhbnMgd2UgaGF2ZSBhbiBpbnRlcm5hbCBlcnJvci4gKi8KKyAgZXJyID0gZXJybm87CisgIHN3aXRjaCAoZXJyKQorICAgIHsKKyAgICAgIGNhc2UgRU5PTUVNOgorICAgICAgY2FzZSBFTk9TUEM6CisgICAgICAgIC8qIGJlIHNpbGVudDogdGhpcyBpcyBiYXNpY2FsbHkgT09NLCB3aGljaCBvdXIgY2FsbGVycyBhcmUgZXhwZWN0ZWQKKyAgICAgICAgICogdG8gY29wZSB3aXRoICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEVCQURGOgorICAgICAgICBfZGJ1c193YXJuICgiQmFkIGZkICVkXG4iLCBmZCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEVFWElTVDoKKyAgICAgICAgX2RidXNfd2FybiAoImZkICVkIGFkZGVkIGFuZCB0aGVuIGFkZGVkIGFnYWluXG4iLCBmZCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBfZGJ1c193YXJuICgiTWlzYyBlcnJvciB3aGVuIHRyeWluZyB0byB3YXRjaCBmZCAlZDogJXNcbiIsIGZkLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJyKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCitzb2NrZXRfc2V0X2Vwb2xsX2VuYWJsZSAoREJ1c1NvY2tldFNldCAgKnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgIGZsYWdzKQoreworICBEQnVzU29ja2V0U2V0RXBvbGwgKnNlbGYgPSBzb2NrZXRfc2V0X2Vwb2xsX2Nhc3QgKHNldCk7CisgIHN0cnVjdCBlcG9sbF9ldmVudCBldmVudDsKKyAgaW50IGVycjsKKworICBldmVudC5kYXRhLmZkID0gZmQ7CisgIGV2ZW50LmV2ZW50cyA9IHdhdGNoX2ZsYWdzX3RvX2Vwb2xsX2V2ZW50cyAoZmxhZ3MpOworCisgIGlmIChlcG9sbF9jdGwgKHNlbGYtPmVwZmQsIEVQT0xMX0NUTF9NT0QsIGZkLCAmZXZlbnQpID09IDApCisgICAgcmV0dXJuOworCisgIGVyciA9IGVycm5vOworCisgIC8qIEVuYWJsaW5nIGEgZmlsZSBkZXNjcmlwdG9yIGlzbid0IGFsbG93ZWQgdG8gZmFpbCwgZXZlbiBmb3IgT09NLCBzbyB3ZQorICAgKiBkbyBvdXIgYmVzdCB0byBhdm9pZCBhbGwgb2YgdGhlc2UuICovCisgIHN3aXRjaCAoZXJyKQorICAgIHsKKyAgICAgIGNhc2UgRUJBREY6CisgICAgICAgIF9kYnVzX3dhcm4gKCJCYWQgZmQgJWRcbiIsIGZkKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRU5PRU5UOgorICAgICAgICBfZGJ1c193YXJuICgiZmQgJWQgZW5hYmxlZCBiZWZvcmUgaXQgd2FzIGFkZGVkXG4iLCBmZCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEVOT01FTToKKyAgICAgICAgX2RidXNfd2FybiAoIkluc3VmZmljaWVudCBtZW1vcnkgdG8gY2hhbmdlIHdhdGNoIGZvciBmZCAlZFxuIiwgZmQpOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgX2RidXNfd2FybiAoIk1pc2MgZXJyb3Igd2hlbiB0cnlpbmcgdG8gd2F0Y2ggZmQgJWQ6ICVzXG4iLCBmZCwKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycikpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitzb2NrZXRfc2V0X2Vwb2xsX2Rpc2FibGUgKERCdXNTb2NrZXRTZXQgICpzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBmZCkKK3sKKyAgREJ1c1NvY2tldFNldEVwb2xsICpzZWxmID0gc29ja2V0X3NldF9lcG9sbF9jYXN0IChzZXQpOworICBzdHJ1Y3QgZXBvbGxfZXZlbnQgZXZlbnQ7CisgIGludCBlcnI7CisKKyAgLyogVGhlIG5haXZlIHRoaW5nIHRvIGRvIHdvdWxkIGJlIEVQT0xMX0NUTF9ERUwsIGJ1dCB0aGF0J2xsIHByb2JhYmx5CisgICAqIGZyZWUgcmVzb3VyY2VzIGluIHRoZSBrZXJuZWwuIFdoZW4gd2UgY29tZSB0byBkbyBzb2NrZXRfc2V0X2Vwb2xsX2VuYWJsZSwKKyAgICogdGhlcmUgbWlnaHQgbm90IGJlIGVub3VnaCByZXNvdXJjZXMgdG8gYnJpbmcgaXQgYmFjayEKKyAgICoKKyAgICogVGhlIG5leHQgaWRlYSB5b3UgbWlnaHQgaGF2ZSBpcyB0byBzZXQgdGhlIGZsYWdzIHRvIDAuIEhvd2V2ZXIsIGV2ZW50cworICAgKiBhbHdheXMgdHJpZ2dlciBvbiBFUE9MTEVSUiBhbmQgRVBPTExIVVAsIGV2ZW4gaWYgbGliZGJ1cyBpc24ndCBhY3R1YWxseQorICAgKiBkZWxpdmVyaW5nIHRoZW0gdG8gYSBEQnVzV2F0Y2guIEJlY2F1c2UgZXBvbGwgaXMgbGV2ZWwtdHJpZ2dlcmVkIGJ5CisgICAqIGRlZmF1bHQsIHdlJ2xsIGJ1c3ktbG9vcCBvbiBhbiB1bmhhbmRsZWQgZXJyb3Igb3IgaGFuZ3VwOyBub3QgZ29vZC4KKyAgICoKKyAgICogU28sIGxldCdzIHNldCBpdCB0byBiZSBlZGdlLXRyaWdnZXJlZDogdGhlbiB0aGUgd29yc3QgY2FzZSBpcyB0aGF0CisgICAqIHdlIHJldHVybiBmcm9tIHBvbGwgaW1tZWRpYXRlbHkgb24gb25lIGl0ZXJhdGlvbiwgaWdub3JlIGl0IGJlY2F1c2Ugbm8KKyAgICogd2F0Y2ggaXMgZW5hYmxlZCwgdGhlbiBnbyBiYWNrIHRvIG5vcm1hbC4gV2hlbiB3ZSByZS1lbmFibGUgYSB3YXRjaAorICAgKiB3ZSdsbCBzd2l0Y2ggYmFjayB0byBsZXZlbC10cmlnZ2VyZWQgYW5kIGJlIG5vdGlmaWVkIGFnYWluICh2ZXJpZmllZCB0bworICAgKiB3b3JrIG9uIDIuNi4zMikuIENvbXBpbGUgdGhpcyBmaWxlIHdpdGggLURURVNUX0JFSEFWSU9VUl9PRl9FUE9MTEVUIGZvcgorICAgKiB0ZXN0IGNvZGUuCisgICAqLworICBldmVudC5kYXRhLmZkID0gZmQ7CisgIGV2ZW50LmV2ZW50cyA9IEVQT0xMRVQ7CisKKyAgaWYgKGVwb2xsX2N0bCAoc2VsZi0+ZXBmZCwgRVBPTExfQ1RMX01PRCwgZmQsICZldmVudCkgPT0gMCkKKyAgICByZXR1cm47CisKKyAgZXJyID0gZXJybm87CisgIF9kYnVzX3dhcm4gKCJFcnJvciB3aGVuIHRyeWluZyB0byB3YXRjaCBmZCAlZDogJXNcbiIsIGZkLAorICAgICAgICAgICAgICBzdHJlcnJvciAoZXJyKSk7Cit9CisKK3N0YXRpYyB2b2lkCitzb2NrZXRfc2V0X2Vwb2xsX3JlbW92ZSAoREJ1c1NvY2tldFNldCAgKnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgZmQpCit7CisgIERCdXNTb2NrZXRTZXRFcG9sbCAqc2VsZiA9IHNvY2tldF9zZXRfZXBvbGxfY2FzdCAoc2V0KTsKKyAgaW50IGVycjsKKyAgLyogS2VybmVscyA8IDIuNi45IHJlcXVpcmUgYSBub24tTlVMTCBzdHJ1Y3QgcG9pbnRlciwgZXZlbiB0aG91Z2ggaXRzCisgICAqIGNvbnRlbnRzIGFyZSBpZ25vcmVkICovCisgIHN0cnVjdCBlcG9sbF9ldmVudCBkdW1teSA9IHsgMCB9OworCisgIGlmIChlcG9sbF9jdGwgKHNlbGYtPmVwZmQsIEVQT0xMX0NUTF9ERUwsIGZkLCAmZHVtbXkpID09IDApCisgICAgcmV0dXJuOworCisgIGVyciA9IGVycm5vOworICBfZGJ1c193YXJuICgiRXJyb3Igd2hlbiB0cnlpbmcgdG8gcmVtb3ZlIGZkICVkOiAlc1xuIiwgZmQsIHN0cmVycm9yIChlcnIpKTsKK30KKworLyogT3B0aW1hbGx5LCB0aGlzIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBpbiBEQnVzTG9vcDogd2UgdXNlIGl0IHRvIHRyYW5zbGF0ZQorICogYmV0d2VlbiBzdHJ1Y3QgZXBvbGxfZXZlbnQgYW5kIERCdXNTb2NrZXRFdmVudCB3aXRob3V0IGFsbG9jYXRpbmcgaGVhcAorICogbWVtb3J5LiAqLworI2RlZmluZSBOX1NUQUNLX0RFU0NSSVBUT1JTIDY0CisKK3N0YXRpYyBpbnQKK3NvY2tldF9zZXRfZXBvbGxfcG9sbCAoREJ1c1NvY2tldFNldCAgICpzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNTb2NrZXRFdmVudCAqcmV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBtYXhfZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIHRpbWVvdXRfbXMpCit7CisgIERCdXNTb2NrZXRTZXRFcG9sbCAqc2VsZiA9IHNvY2tldF9zZXRfZXBvbGxfY2FzdCAoc2V0KTsKKyAgc3RydWN0IGVwb2xsX2V2ZW50IGV2ZW50c1tOX1NUQUNLX0RFU0NSSVBUT1JTXTsKKyAgaW50IG5fcmVhZHk7CisgIGludCBpOworCisgIF9kYnVzX2Fzc2VydCAobWF4X2V2ZW50cyA+IDApOworCisgIG5fcmVhZHkgPSBlcG9sbF93YWl0IChzZWxmLT5lcGZkLCBldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICBNSU4gKF9EQlVTX05fRUxFTUVOVFMgKGV2ZW50cyksIG1heF9ldmVudHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9tcyk7CisKKyAgaWYgKG5fcmVhZHkgPD0gMCkKKyAgICByZXR1cm4gbl9yZWFkeTsKKworICBmb3IgKGkgPSAwOyBpIDwgbl9yZWFkeTsgaSsrKQorICAgIHsKKyAgICAgIHJldmVudHNbaV0uZmQgPSBldmVudHNbaV0uZGF0YS5mZDsKKyAgICAgIHJldmVudHNbaV0uZmxhZ3MgPSBlcG9sbF9ldmVudHNfdG9fd2F0Y2hfZmxhZ3MgKGV2ZW50c1tpXS5ldmVudHMpOworICAgIH0KKworICByZXR1cm4gbl9yZWFkeTsKK30KKworREJ1c1NvY2tldFNldENsYXNzIF9kYnVzX3NvY2tldF9zZXRfZXBvbGxfY2xhc3MgPSB7CisgICAgc29ja2V0X3NldF9lcG9sbF9mcmVlLAorICAgIHNvY2tldF9zZXRfZXBvbGxfYWRkLAorICAgIHNvY2tldF9zZXRfZXBvbGxfcmVtb3ZlLAorICAgIHNvY2tldF9zZXRfZXBvbGxfZW5hYmxlLAorICAgIHNvY2tldF9zZXRfZXBvbGxfZGlzYWJsZSwKKyAgICBzb2NrZXRfc2V0X2Vwb2xsX3BvbGwKK307CisKKyNpZmRlZiBURVNUX0JFSEFWSU9VUl9PRl9FUE9MTEVUCisvKiB1c2FnZTogY2F0IC9kZXYvbnVsbCB8IC4vZXBvbGwKKyAqCisgKiBkZXNpcmVkIG91dHB1dDoKKyAqIGN0bCBBREQ6IDAKKyAqIHdhaXQgZm9yIEhVUCwgZWRnZS10cmlnZ2VyZWQ6IDEKKyAqIHdhaXQgZm9yIEhVUCBhZ2FpbjogMAorICogY3RsIE1PRDogMAorICogd2FpdCBmb3IgSFVQOiAxCisgKi8KKworI2luY2x1ZGUgPHN5cy9lcG9sbC5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50CittYWluICh2b2lkKQoreworICBzdHJ1Y3QgZXBvbGxfZXZlbnQgaW5wdXQ7CisgIHN0cnVjdCBlcG9sbF9ldmVudCBvdXRwdXQ7CisgIGludCBlcGZkID0gZXBvbGxfY3JlYXRlMSAoRVBPTExfQ0xPRVhFQyk7CisgIGludCBmZCA9IDA7IC8qIHN0ZGluICovCisgIGludCByZXQ7CisKKyAgaW5wdXQuZXZlbnRzID0gRVBPTExIVVAgfCBFUE9MTEVUOworICByZXQgPSBlcG9sbF9jdGwgKGVwZmQsIEVQT0xMX0NUTF9BREQsIGZkLCAmaW5wdXQpOworICBwcmludGYgKCJjdGwgQUREOiAlZFxuIiwgcmV0KTsKKworICByZXQgPSBlcG9sbF93YWl0IChlcGZkLCAmb3V0cHV0LCAxLCAtMSk7CisgIHByaW50ZiAoIndhaXQgZm9yIEhVUCwgZWRnZS10cmlnZ2VyZWQ6ICVkXG4iLCByZXQpOworCisgIHJldCA9IGVwb2xsX3dhaXQgKGVwZmQsICZvdXRwdXQsIDEsIDEpOworICBwcmludGYgKCJ3YWl0IGZvciBIVVAgYWdhaW46ICVkXG4iLCByZXQpOworCisgIGlucHV0LmV2ZW50cyA9IEVQT0xMSFVQOworICByZXQgPSBlcG9sbF9jdGwgKGVwZmQsIEVQT0xMX0NUTF9NT0QsIGZkLCAmaW5wdXQpOworICBwcmludGYgKCJjdGwgTU9EOiAlZFxuIiwgcmV0KTsKKworICByZXQgPSBlcG9sbF93YWl0IChlcGZkLCAmb3V0cHV0LCAxLCAtMSk7CisgIHByaW50ZiAoIndhaXQgZm9yIEhVUDogJWRcbiIsIHJldCk7CisKKyAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBURVNUX0JFSEFWSU9VUl9PRl9FUE9MTEVUICovCisKKyNlbmRpZiAvKiAhRE9YWUdFTl9TSE9VTERfU0tJUF9USElTICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1zb2NrZXQtc2V0LXBvbGwuYyBiL2RidXMvZGJ1cy9kYnVzLXNvY2tldC1zZXQtcG9sbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YTFmZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1zb2NrZXQtc2V0LXBvbGwuYwpAQCAtMCwwICsxLDMyMCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNvY2tldC1zZXQtcG9sbC5jIC0gYSBzb2NrZXQgc2V0IGltcGxlbWVudGVkIHZpYSBfZGJ1c19wb2xsCisgKgorICogQ29weXJpZ2h0IMKpIDIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAorICogTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1zb2NrZXQtc2V0LmgiCisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy13YXRjaC5oPgorCisjaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgREJ1c1NvY2tldFNldCAgICAgIHBhcmVudDsKKyAgICBEQnVzUG9sbEZEICAgICAgICAqZmRzOworICAgIGludCAgICAgICAgICAgICAgICBuX2ZkczsKKyAgICBpbnQgICAgICAgICAgICAgICAgbl9yZXNlcnZlZDsKKyAgICBpbnQgICAgICAgICAgICAgICAgbl9hbGxvY2F0ZWQ7Cit9IERCdXNTb2NrZXRTZXRQb2xsOworCisjZGVmaW5lIFJFQUxMT0NfSU5DUkVNRU5UIDgKKyNkZWZpbmUgTUlOSU1VTV9TSVpFIDgKKworLyogSWYgd2UncmUgaW4gdGhlIHJlZ3Jlc3Npb24gdGVzdHMsIGZvcmNlIHJlYWxsb2NhdGlvbiB0byBoYXBwZW4gc29vbmVyICovCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworI2RlZmluZSBERUZBVUxUX1NJWkVfSElOVCAxCisjZWxzZQorI2RlZmluZSBERUZBVUxUX1NJWkVfSElOVCBNSU5JTVVNX1NJWkUKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIERCdXNTb2NrZXRTZXRQb2xsICoKK3NvY2tldF9zZXRfcG9sbF9jYXN0IChEQnVzU29ja2V0U2V0ICpzZXQpCit7CisgIF9kYnVzX2Fzc2VydCAoc2V0LT5jbHMgPT0gJl9kYnVzX3NvY2tldF9zZXRfcG9sbF9jbGFzcyk7CisgIHJldHVybiAoREJ1c1NvY2tldFNldFBvbGwgKikgc2V0OworfQorCisvKiB0aGlzIGlzIHNhZmUgdG8gY2FsbCBvbiBhIHBhcnRpYWxseS1hbGxvY2F0ZWQgc29ja2V0IHNldCAqLworc3RhdGljIHZvaWQKK3NvY2tldF9zZXRfcG9sbF9mcmVlIChEQnVzU29ja2V0U2V0ICpzZXQpCit7CisgIERCdXNTb2NrZXRTZXRQb2xsICpzZWxmID0gc29ja2V0X3NldF9wb2xsX2Nhc3QgKHNldCk7CisKKyAgZGJ1c19mcmVlIChzZWxmLT5mZHMpOworICBkYnVzX2ZyZWUgKHNlbGYpOworICBfZGJ1c192ZXJib3NlICgiZnJlZWQgc29ja2V0IHNldCAlcFxuIiwgc2VsZik7Cit9CisKK0RCdXNTb2NrZXRTZXQgKgorX2RidXNfc29ja2V0X3NldF9wb2xsX25ldyAoaW50IHNpemVfaGludCkKK3sKKyAgREJ1c1NvY2tldFNldFBvbGwgKnJldDsKKworICBpZiAoc2l6ZV9oaW50IDw9IDApCisgICAgc2l6ZV9oaW50ID0gREVGQVVMVF9TSVpFX0hJTlQ7CisKKyAgcmV0ID0gZGJ1c19uZXcwIChEQnVzU29ja2V0U2V0UG9sbCwgMSk7CisKKyAgaWYgKHJldCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHJldC0+cGFyZW50LmNscyA9ICZfZGJ1c19zb2NrZXRfc2V0X3BvbGxfY2xhc3M7CisgIHJldC0+bl9mZHMgPSAwOworICByZXQtPm5fYWxsb2NhdGVkID0gc2l6ZV9oaW50OworCisgIHJldC0+ZmRzID0gZGJ1c19uZXcwIChEQnVzUG9sbEZELCBzaXplX2hpbnQpOworCisgIGlmIChyZXQtPmZkcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIHNvY2tldF9zZXRfcG9sbF9mcmVlIHNwZWNpZmljYWxseSBzdXBwb3J0cyBoYWxmLWNvbnN0cnVjdGVkCisgICAgICAgKiBzb2NrZXQgc2V0cyAqLworICAgICAgc29ja2V0X3NldF9wb2xsX2ZyZWUgKChEQnVzU29ja2V0U2V0ICopIHJldCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIm5ldyBzb2NrZXQgc2V0IGF0ICVwXG4iLCByZXQpOworICByZXR1cm4gKERCdXNTb2NrZXRTZXQgKikgcmV0OworfQorCitzdGF0aWMgc2hvcnQKK3dhdGNoX2ZsYWdzX3RvX3BvbGxfZXZlbnRzICh1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisgIHNob3J0IGV2ZW50cyA9IDA7CisKKyAgaWYgKGZsYWdzICYgREJVU19XQVRDSF9SRUFEQUJMRSkKKyAgICBldmVudHMgfD0gX0RCVVNfUE9MTElOOworICBpZiAoZmxhZ3MgJiBEQlVTX1dBVENIX1dSSVRBQkxFKQorICAgIGV2ZW50cyB8PSBfREJVU19QT0xMT1VUOworCisgIHJldHVybiBldmVudHM7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc29ja2V0X3NldF9wb2xsX2FkZCAoREJ1c1NvY2tldFNldCAgKnNldCwKKyAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICBlbmFibGVkKQoreworICBEQnVzU29ja2V0U2V0UG9sbCAqc2VsZiA9IHNvY2tldF9zZXRfcG9sbF9jYXN0IChzZXQpOworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBzZWxmLT5uX2ZkczsgaSsrKQorICAgIF9kYnVzX2Fzc2VydCAoc2VsZi0+ZmRzW2ldLmZkICE9IGZkKTsKKyNlbmRpZgorCisgIGlmIChzZWxmLT5uX3Jlc2VydmVkID49IHNlbGYtPm5fYWxsb2NhdGVkKQorICAgIHsKKyAgICAgIERCdXNQb2xsRkQgKm5ld19mZHMgPSBkYnVzX3JlYWxsb2MgKHNlbGYtPmZkcywKKyAgICAgICAgICBzaXplb2YgKERCdXNQb2xsRkQpICogKHNlbGYtPm5fYWxsb2NhdGVkICsgUkVBTExPQ19JTkNSRU1FTlQpKTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoImluZmxhdGluZyBzZXQgJXAgZnJvbSAlZCBlbi8lZCByZXMvJWQgYWxsb2MgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLCBzZWxmLT5uX2Zkcywgc2VsZi0+bl9yZXNlcnZlZCwgc2VsZi0+bl9hbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLT5uX2FsbG9jYXRlZCArIFJFQUxMT0NfSU5DUkVNRU5UKTsKKworICAgICAgaWYgKG5ld19mZHMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBzZWxmLT5mZHMgPSBuZXdfZmRzOworICAgICAgc2VsZi0+bl9hbGxvY2F0ZWQgKz0gUkVBTExPQ19JTkNSRU1FTlQ7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJiZWZvcmUgYWRkaW5nIGZkICVkIHRvICVwLCAlZCBlbi8lZCByZXMvJWQgYWxsb2NcbiIsCisgICAgICAgICAgICAgICAgIGZkLCBzZWxmLCBzZWxmLT5uX2Zkcywgc2VsZi0+bl9yZXNlcnZlZCwgc2VsZi0+bl9hbGxvY2F0ZWQpOworICBfZGJ1c19hc3NlcnQgKHNlbGYtPm5fcmVzZXJ2ZWQgPj0gc2VsZi0+bl9mZHMpOworICBfZGJ1c19hc3NlcnQgKHNlbGYtPm5fYWxsb2NhdGVkID4gc2VsZi0+bl9yZXNlcnZlZCk7CisKKyAgc2VsZi0+bl9yZXNlcnZlZCsrOworCisgIGlmIChlbmFibGVkKQorICAgIHsKKyAgICAgIHNlbGYtPmZkc1tzZWxmLT5uX2Zkc10uZmQgPSBmZDsKKyAgICAgIHNlbGYtPmZkc1tzZWxmLT5uX2Zkc10uZXZlbnRzID0gd2F0Y2hfZmxhZ3NfdG9fcG9sbF9ldmVudHMgKGZsYWdzKTsKKyAgICAgIHNlbGYtPm5fZmRzKys7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorc29ja2V0X3NldF9wb2xsX2VuYWJsZSAoREJ1c1NvY2tldFNldCAqc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICBmbGFncykKK3sKKyAgREJ1c1NvY2tldFNldFBvbGwgKnNlbGYgPSBzb2NrZXRfc2V0X3BvbGxfY2FzdCAoc2V0KTsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNlbGYtPm5fZmRzOyBpKyspCisgICAgeworICAgICAgaWYgKHNlbGYtPmZkc1tpXS5mZCA9PSBmZCkKKyAgICAgICAgeworICAgICAgICAgIHNlbGYtPmZkc1tpXS5ldmVudHMgPSB3YXRjaF9mbGFnc190b19wb2xsX2V2ZW50cyAoZmxhZ3MpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAvKiB3ZSBhbGxvY2F0ZWQgc3BhY2Ugd2hlbiB0aGUgc29ja2V0IHdhcyBhZGRlZCAqLworICBfZGJ1c19hc3NlcnQgKHNlbGYtPm5fZmRzIDwgc2VsZi0+bl9yZXNlcnZlZCk7CisgIF9kYnVzX2Fzc2VydCAoc2VsZi0+bl9yZXNlcnZlZCA8PSBzZWxmLT5uX2FsbG9jYXRlZCk7CisKKyAgc2VsZi0+ZmRzW3NlbGYtPm5fZmRzXS5mZCA9IGZkOworICBzZWxmLT5mZHNbc2VsZi0+bl9mZHNdLmV2ZW50cyA9IHdhdGNoX2ZsYWdzX3RvX3BvbGxfZXZlbnRzIChmbGFncyk7CisgIHNlbGYtPm5fZmRzKys7Cit9CisKK3N0YXRpYyB2b2lkCitzb2NrZXRfc2V0X3BvbGxfZGlzYWJsZSAoREJ1c1NvY2tldFNldCAqc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGZkKQoreworICBEQnVzU29ja2V0U2V0UG9sbCAqc2VsZiA9IHNvY2tldF9zZXRfcG9sbF9jYXN0IChzZXQpOworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgc2VsZi0+bl9mZHM7IGkrKykKKyAgICB7CisgICAgICBpZiAoc2VsZi0+ZmRzW2ldLmZkID09IGZkKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGkgIT0gc2VsZi0+bl9mZHMgLSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBzZWxmLT5mZHNbaV0uZmQgPSBzZWxmLT5mZHNbc2VsZi0+bl9mZHMgLSAxXS5mZDsKKyAgICAgICAgICAgICAgc2VsZi0+ZmRzW2ldLmV2ZW50cyA9IHNlbGYtPmZkc1tzZWxmLT5uX2ZkcyAtIDFdLmV2ZW50czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHNlbGYtPm5fZmRzLS07CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorc29ja2V0X3NldF9wb2xsX3JlbW92ZSAoREJ1c1NvY2tldFNldCAqc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgZmQpCit7CisgIERCdXNTb2NrZXRTZXRQb2xsICpzZWxmID0gc29ja2V0X3NldF9wb2xsX2Nhc3QgKHNldCk7CisKKyAgc29ja2V0X3NldF9wb2xsX2Rpc2FibGUgKHNldCwgZmQpOworICBzZWxmLT5uX3Jlc2VydmVkLS07CisKKyAgX2RidXNfdmVyYm9zZSAoImFmdGVyIHJlbW92aW5nIGZkICVkIGZyb20gJXAsICVkIGVuLyVkIHJlcy8lZCBhbGxvY1xuIiwKKyAgICAgICAgICAgICAgICAgZmQsIHNlbGYsIHNlbGYtPm5fZmRzLCBzZWxmLT5uX3Jlc2VydmVkLCBzZWxmLT5uX2FsbG9jYXRlZCk7CisgIF9kYnVzX2Fzc2VydCAoc2VsZi0+bl9mZHMgPD0gc2VsZi0+bl9yZXNlcnZlZCk7CisgIF9kYnVzX2Fzc2VydCAoc2VsZi0+bl9yZXNlcnZlZCA8PSBzZWxmLT5uX2FsbG9jYXRlZCk7CisKKyAgaWYgKHNlbGYtPm5fcmVzZXJ2ZWQgKyBNSU5JTVVNX1NJWkUgPCBzZWxmLT5uX2FsbG9jYXRlZCAvIDIpCisgICAgeworICAgICAgLyogT3VyIGFycmF5IGlzIHR3aWNlIGFzIGJpZyBhcyBpdCBuZWVkcyB0byBiZSAtIGRlZmxhdGUgaXQgdW50aWwgaXQncworICAgICAgICogb25seSBzbGlnaHRseSBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIHJlc2VydmVkLiAqLworICAgICAgREJ1c1BvbGxGRCAqbmV3X2ZkcyA9IGRidXNfcmVhbGxvYyAoc2VsZi0+ZmRzLAorICAgICAgICAgIHNpemVvZiAoREJ1c1BvbGxGRCkgKiAoc2VsZi0+bl9yZXNlcnZlZCArIE1JTklNVU1fU0laRSkpOworCisgICAgICBfZGJ1c192ZXJib3NlICgiYmVmb3JlIGRlZmxhdGluZyAlcCwgJWQgZW4vJWQgcmVzLyVkIGFsbG9jXG4iLAorICAgICAgICAgICAgICAgICAgICAgc2VsZiwgc2VsZi0+bl9mZHMsIHNlbGYtPm5fcmVzZXJ2ZWQsIHNlbGYtPm5fYWxsb2NhdGVkKTsKKworICAgICAgaWYgKF9EQlVTX1VOTElLRUxZIChuZXdfZmRzID09IE5VTEwpKQorICAgICAgICB7CisgICAgICAgICAgLyogV2VpcmQuIE9oIHdlbGwsIG5ldmVyIG1pbmQsIHRoZSB0b28tYmlnIGFycmF5IGlzIHVudG91Y2hlZCAqLworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICBzZWxmLT5mZHMgPSBuZXdfZmRzOworICAgICAgc2VsZi0+bl9hbGxvY2F0ZWQgPSBzZWxmLT5uX3Jlc2VydmVkOworICAgIH0KK30KKworc3RhdGljIHVuc2lnbmVkIGludAord2F0Y2hfZmxhZ3NfZnJvbV9wb2xsX3JldmVudHMgKHNob3J0IHJldmVudHMpCit7CisgIHVuc2lnbmVkIGludCBjb25kaXRpb24gPSAwOworCisgIGlmIChyZXZlbnRzICYgX0RCVVNfUE9MTElOKQorICAgIGNvbmRpdGlvbiB8PSBEQlVTX1dBVENIX1JFQURBQkxFOworICBpZiAocmV2ZW50cyAmIF9EQlVTX1BPTExPVVQpCisgICAgY29uZGl0aW9uIHw9IERCVVNfV0FUQ0hfV1JJVEFCTEU7CisgIGlmIChyZXZlbnRzICYgX0RCVVNfUE9MTEhVUCkKKyAgICBjb25kaXRpb24gfD0gREJVU19XQVRDSF9IQU5HVVA7CisgIGlmIChyZXZlbnRzICYgX0RCVVNfUE9MTEVSUikKKyAgICBjb25kaXRpb24gfD0gREJVU19XQVRDSF9FUlJPUjsKKworICBpZiAoX0RCVVNfVU5MSUtFTFkgKHJldmVudHMgJiBfREJVU19QT0xMTlZBTCkpCisgICAgY29uZGl0aW9uIHw9IF9EQlVTX1dBVENIX05WQUw7CisKKyAgcmV0dXJuIGNvbmRpdGlvbjsKK30KKworLyoqIFRoaXMgaXMgYmFzaWNhbGx5IExpbnV4J3MgZXBvbGxfd2FpdCgyKSBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBwb2xsKDIpOworICogaXQgcmV0dXJucyByZXN1bHRzIGludG8gYSBjYWxsZXItc3VwcGxpZWQgYnVmZmVyIHNvIHdlIGNhbiBiZSByZWVudHJhbnQuICovCitzdGF0aWMgaW50Citzb2NrZXRfc2V0X3BvbGxfcG9sbCAoREJ1c1NvY2tldFNldCAgICpzZXQsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c1NvY2tldEV2ZW50ICpyZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgbWF4X2V2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIHRpbWVvdXRfbXMpCit7CisgIERCdXNTb2NrZXRTZXRQb2xsICpzZWxmID0gc29ja2V0X3NldF9wb2xsX2Nhc3QgKHNldCk7CisgIGludCBpOworICBpbnQgbl9ldmVudHM7CisgIGludCBuX3JlYWR5OworCisgIF9kYnVzX2Fzc2VydCAobWF4X2V2ZW50cyA+IDApOworCisgIGZvciAoaSA9IDA7IGkgPCBzZWxmLT5uX2ZkczsgaSsrKQorICAgIHNlbGYtPmZkc1tpXS5yZXZlbnRzID0gMDsKKworICBuX3JlYWR5ID0gX2RidXNfcG9sbCAoc2VsZi0+ZmRzLCBzZWxmLT5uX2ZkcywgdGltZW91dF9tcyk7CisKKyAgaWYgKG5fcmVhZHkgPD0gMCkKKyAgICByZXR1cm4gbl9yZWFkeTsKKworICBuX2V2ZW50cyA9IDA7CisKKyAgZm9yIChpID0gMDsgaSA8IHNlbGYtPm5fZmRzOyBpKyspCisgICAgeworICAgICAgaWYgKHNlbGYtPmZkc1tpXS5yZXZlbnRzICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICByZXZlbnRzW25fZXZlbnRzXS5mZCA9IHNlbGYtPmZkc1tpXS5mZDsKKyAgICAgICAgICByZXZlbnRzW25fZXZlbnRzXS5mbGFncyA9IHdhdGNoX2ZsYWdzX2Zyb21fcG9sbF9yZXZlbnRzIChzZWxmLT5mZHNbaV0ucmV2ZW50cyk7CisKKyAgICAgICAgICBuX2V2ZW50cyArPSAxOworCisgICAgICAgICAgLyogV2UgaWdub3JlIGV2ZW50cyBiZXlvbmQgbWF4X2V2ZW50cyBiZWNhdXNlIHdlIGhhdmUgbm93aGVyZSB0bworICAgICAgICAgICAqIHB1dCB0aGVtLiBfZGJ1c19wb2xsIGlzIGxldmVsLXRyaWdnZXJlZCwgc28gd2UnbGwganVzdCBiZSB0b2xkCisgICAgICAgICAgICogYWJvdXQgdGhlbSBuZXh0IHRpbWUgcm91bmQgdGhlIG1haW4gbG9vcCBhbnl3YXkuICovCisgICAgICAgICAgaWYgKG5fZXZlbnRzID09IG1heF9ldmVudHMpCisgICAgICAgICAgICByZXR1cm4gbl9ldmVudHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIG5fZXZlbnRzOworfQorCitEQnVzU29ja2V0U2V0Q2xhc3MgX2RidXNfc29ja2V0X3NldF9wb2xsX2NsYXNzID0geworICAgIHNvY2tldF9zZXRfcG9sbF9mcmVlLAorICAgIHNvY2tldF9zZXRfcG9sbF9hZGQsCisgICAgc29ja2V0X3NldF9wb2xsX3JlbW92ZSwKKyAgICBzb2NrZXRfc2V0X3BvbGxfZW5hYmxlLAorICAgIHNvY2tldF9zZXRfcG9sbF9kaXNhYmxlLAorICAgIHNvY2tldF9zZXRfcG9sbF9wb2xsCit9OworCisjZW5kaWYgLyogIURPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtc29ja2V0LXNldC5jIGIvZGJ1cy9kYnVzL2RidXMtc29ja2V0LXNldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMGQ2MDAKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1zb2NrZXQtc2V0LmMKQEAgLTAsMCArMSw0NyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKgorICogZGJ1cy1zb2NrZXQtc2V0LmMgLSB1c2VkIHRvIGJvbHQgZmlsZSBkZXNjcmlwdG9ycyBvbnRvIGEgYnVzCisgKgorICogQ29weXJpZ2h0IMKpIDIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAorICogTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXNvY2tldC1zZXQuaD4KKworREJ1c1NvY2tldFNldCAqCitfZGJ1c19zb2NrZXRfc2V0X25ldyAoaW50IHNpemVfaGludCkKK3sKKyAgREJ1c1NvY2tldFNldCAqcmV0OworCisjaWZkZWYgREJVU19IQVZFX0xJTlVYX0VQT0xMCisgIHJldCA9IF9kYnVzX3NvY2tldF9zZXRfZXBvbGxfbmV3ICgpOworCisgIGlmIChyZXQgIT0gTlVMTCkKKyAgICByZXR1cm4gcmV0OworI2VuZGlmCisKKyAgcmV0ID0gX2RidXNfc29ja2V0X3NldF9wb2xsX25ldyAoc2l6ZV9oaW50KTsKKworICBpZiAocmV0ICE9IE5VTEwpCisgICAgcmV0dXJuIHJldDsKKworICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLXNvY2tldC1zZXQuaCBiL2RidXMvZGJ1cy9kYnVzLXNvY2tldC1zZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjcxYTkyCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtc29ja2V0LXNldC5oCkBAIC0wLDAgKzEsMTIyIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qCisgKiBkYnVzLXNvY2tldC1zZXQuaCAtIHVzZWQgdG8gYm9sdCBmaWxlIGRlc2NyaXB0b3JzIG9udG8gYSBidXMKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sCisgKiBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19TT0NLRVRfU0VUX0gKKyNkZWZpbmUgREJVU19TT0NLRVRfU0VUX0gKKworI2lmbmRlZiBET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGZkOworICAgIHVuc2lnbmVkIGludCBmbGFnczsKK30gREJ1c1NvY2tldEV2ZW50OworCit0eXBlZGVmIHN0cnVjdCBEQnVzU29ja2V0U2V0IERCdXNTb2NrZXRTZXQ7CisKK3R5cGVkZWYgc3RydWN0IERCdXNTb2NrZXRTZXRDbGFzcyBEQnVzU29ja2V0U2V0Q2xhc3M7CitzdHJ1Y3QgREJ1c1NvY2tldFNldENsYXNzIHsKKyAgICB2b2lkICAgICAgICAgICAgKCpmcmVlKSAgICAgKERCdXNTb2NrZXRTZXQgICAqc2VsZik7CisgICAgZGJ1c19ib29sX3QgICAgICgqYWRkKSAgICAgIChEQnVzU29ja2V0U2V0ICAgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgZW5hYmxlZCk7CisgICAgdm9pZCAgICAgICAgICAgICgqcmVtb3ZlKSAgIChEQnVzU29ja2V0U2V0ICAgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIGZkKTsKKyAgICB2b2lkICAgICAgICAgICAgKCplbmFibGUpICAgKERCdXNTb2NrZXRTZXQgICAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgIGZsYWdzKTsKKyAgICB2b2lkICAgICAgICAgICAgKCpkaXNhYmxlKSAgKERCdXNTb2NrZXRTZXQgICAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgZmQpOworICAgIGludCAgICAgICAgICAgICAoKnBvbGwpICAgICAoREJ1c1NvY2tldFNldCAgICpzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NvY2tldEV2ZW50ICpyZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBtYXhfZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICB0aW1lb3V0X21zKTsKK307CisKK3N0cnVjdCBEQnVzU29ja2V0U2V0IHsKKyAgICBEQnVzU29ja2V0U2V0Q2xhc3MgKmNsczsKK307CisKK0RCdXNTb2NrZXRTZXQgKl9kYnVzX3NvY2tldF9zZXRfbmV3ICAgICAgICAgICAoaW50ICAgICAgICAgICAgICAgc2l6ZV9oaW50KTsKKworc3RhdGljIGlubGluZSB2b2lkCitfZGJ1c19zb2NrZXRfc2V0X2ZyZWUgKERCdXNTb2NrZXRTZXQgKnNlbGYpCit7CisgIChzZWxmLT5jbHMtPmZyZWUpIChzZWxmKTsKK30KKworc3RhdGljIGlubGluZSBkYnVzX2Jvb2xfdAorX2RidXNfc29ja2V0X3NldF9hZGQgKERCdXNTb2NrZXRTZXQgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgZW5hYmxlZCkKK3sKKyAgcmV0dXJuIChzZWxmLT5jbHMtPmFkZCkgKHNlbGYsIGZkLCBmbGFncywgZW5hYmxlZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX2RidXNfc29ja2V0X3NldF9yZW1vdmUgKERCdXNTb2NrZXRTZXQgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgZmQpCit7CisgIChzZWxmLT5jbHMtPnJlbW92ZSkgKHNlbGYsIGZkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfZGJ1c19zb2NrZXRfc2V0X2VuYWJsZSAoREJ1c1NvY2tldFNldCAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICBmbGFncykKK3sKKyAgKHNlbGYtPmNscy0+ZW5hYmxlKSAoc2VsZiwgZmQsIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfZGJ1c19zb2NrZXRfc2V0X2Rpc2FibGUgKERCdXNTb2NrZXRTZXQgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGZkKQoreworICAoc2VsZi0+Y2xzLT5kaXNhYmxlKSAoc2VsZiwgZmQpOworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50CitfZGJ1c19zb2NrZXRfc2V0X3BvbGwgKERCdXNTb2NrZXRTZXQgICAgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNTb2NrZXRFdmVudCAgKnJldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIG1heF9ldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHRpbWVvdXRfbXMpCit7CisgIHJldHVybiAoc2VsZi0+Y2xzLT5wb2xsKSAoc2VsZiwgcmV2ZW50cywgbWF4X2V2ZW50cywgdGltZW91dF9tcyk7Cit9CisKKy8qIGNvbmNyZXRlIGltcGxlbWVudGF0aW9ucywgbm90IG5lY2Vzc2FyaWx5IGJ1aWx0IG9uIGFsbCBwbGF0Zm9ybXMgKi8KKworZXh0ZXJuIERCdXNTb2NrZXRTZXRDbGFzcyBfZGJ1c19zb2NrZXRfc2V0X3BvbGxfY2xhc3M7CitleHRlcm4gREJ1c1NvY2tldFNldENsYXNzIF9kYnVzX3NvY2tldF9zZXRfZXBvbGxfY2xhc3M7CisKK0RCdXNTb2NrZXRTZXQgKl9kYnVzX3NvY2tldF9zZXRfcG9sbF9uZXcgIChpbnQgIHNpemVfaGludCk7CitEQnVzU29ja2V0U2V0ICpfZGJ1c19zb2NrZXRfc2V0X2Vwb2xsX25ldyAodm9pZCk7CisKKyNlbmRpZiAvKiAhRE9YWUdFTl9TSE9VTERfU0tJUF9USElTICovCisjZW5kaWYgLyogbXVsdGlwbGUtaW5jbHVzaW9uIGd1YXJkICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1zb2NrZXRzLXdpbi5oIGIvZGJ1cy9kYnVzL2RidXMtc29ja2V0cy13aW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTFhYjhjCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtc29ja2V0cy13aW4uaApAQCAtMCwwICsxLDY2IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc29ja2V0cy5oIFdyYXBwZXJzIGFyb3VuZCBzb2NrZXQgZmVhdHVyZXMgKGludGVybmFsIHRvIEQtQlVTIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTm92ZWxsLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19TT0NLRVRTX0gKKyNkZWZpbmUgREJVU19TT0NLRVRTX0gKKworI2lmIGRlZmluZWQoREJVU19XSU4pIHx8IGRlZmluZWQoREJVU19XSU5DRSkKKworCisKKyNpZm5kZWYgU1RSSUNUCisjZGVmaW5lIFNUUklDVAorI2luY2x1ZGUgPHdpbnNvY2syLmg+CisjdW5kZWYgU1RSSUNUCisjZW5kaWYKKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorCisjdW5kZWYgaW50ZXJmYWNlCisKKyNpZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisKKyNkZWZpbmUgREJVU19TT0NLRVRfSVNfSU5WQUxJRChzKSAoKFNPQ0tFVCkocykgPT0gSU5WQUxJRF9TT0NLRVQpCisjZGVmaW5lIERCVVNfU09DS0VUX0FQSV9SRVRVUk5TX0VSUk9SKG4pICgobikgPT0gU09DS0VUX0VSUk9SKQorI2RlZmluZSBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8oKSAoX2RidXNfd2luX3NldF9lcnJubyAoV1NBR2V0TGFzdEVycm9yKCkpKQorCisjZGVmaW5lIERCVVNfQ0xPU0VfU09DS0VUKHMpIGNsb3Nlc29ja2V0KHMpCisKKyNlbHNlCisKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2RlZmluZSBEQlVTX1NPQ0tFVF9JU19JTlZBTElEKHMpICgocykgPCAwKQorI2RlZmluZSBEQlVTX1NPQ0tFVF9BUElfUkVUVVJOU19FUlJPUihuKSAoKG4pIDwgMCkKKyNkZWZpbmUgREJVU19TT0NLRVRfU0VUX0VSUk5PKCkJLyogZW1wdHkgKi8KKworI2RlZmluZSBEQlVTX0NMT1NFX1NPQ0tFVChzKSBjbG9zZShzKQorCisjZW5kaWYgLyogIVdpbjMyICovCisKKyNlbmRpZiAvKiBEQlVTX1NPQ0tFVFNfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtc3Bhd24td2luLmMgYi9kYnVzL2RidXMvZGJ1cy1zcGF3bi13aW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGFlNGYzCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtc3Bhd24td2luLmMKQEAgLTAsMCArMSwxMDM1IEBACisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKy8vI2RlZmluZSBTUEFXTl9ERUJVRworCisjaWYgIWRlZmluZWQoU1BBV05fREVCVUcpIHx8IGRlZmluZWQoX01TQ19WRVIpCisjZGVmaW5lIFBJTkcoKQorI2Vsc2UKKyNkZWZpbmUgUElORygpIGZwcmludGYgKHN0ZGVyciwgIiVzOiVzOiVkXG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IGZmbHVzaCAoc3RkZXJyKQorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3Bhd24td2luMzIuYyBXcmFwcGVyIGFyb3VuZCBnX3NwYXduCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTm92ZWxsLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaW5jbHVkZSAiZGJ1cy1zcGF3bi5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy13aW4uaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgImRidXMtcHJvdG9jb2wuaCIKKworI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjaW5jbHVkZSA8d2luZG93cy5oPgorLy8jZGVmaW5lIFNUUklDVAorLy8jaW5jbHVkZSA8d2luZG93cy5oPgorLy8jdW5kZWYgU1RSSUNUCisjaW5jbHVkZSA8d2luc29jazIuaD4KKyN1bmRlZiBpbnRlcmZhY2UKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaWZuZGVmIERCVVNfV0lOQ0UKKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisjZW5kaWYKKworLyoqCisgKiBCYWJ5c2l0dGVyIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqLworc3RydWN0IERCdXNCYWJ5c2l0dGVyCisgIHsKKyAgICBpbnQgcmVmY291bnQ7CisKKyAgICBIQU5ETEUgc3RhcnRfc3luY19ldmVudDsKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisKKyAgICBIQU5ETEUgZW5kX3N5bmNfZXZlbnQ7CisjZW5kaWYKKworICAgIGNoYXIgKmV4ZWN1dGFibGU7CisgICAgREJ1c1NwYXduQ2hpbGRTZXR1cEZ1bmMgY2hpbGRfc2V0dXA7CisgICAgdm9pZCAqdXNlcl9kYXRhOworCisgICAgaW50IGFyZ2M7CisgICAgY2hhciAqKmFyZ3Y7CisgICAgY2hhciAqKmVudnA7CisKKyAgICBIQU5ETEUgY2hpbGRfaGFuZGxlOworICAgIGludCBzb2NrZXRfdG9fYmFieXNpdHRlcjsJLyogQ29ubmVjdGlvbiB0byB0aGUgYmFieXNpdHRlciB0aHJlYWQgKi8KKyAgICBpbnQgc29ja2V0X3RvX21haW47CisKKyAgICBEQnVzV2F0Y2hMaXN0ICp3YXRjaGVzOworICAgIERCdXNXYXRjaCAqc2l0dGVyX3dhdGNoOworICAgIERCdXNCYWJ5c2l0dGVyRmluaXNoZWRGdW5jIGZpbmlzaGVkX2NiOworICAgIHZvaWQgKmZpbmlzaGVkX2RhdGE7CisKKyAgICBkYnVzX2Jvb2xfdCBoYXZlX3NwYXduX2Vycm5vOworICAgIGludCBzcGF3bl9lcnJubzsKKyAgICBkYnVzX2Jvb2xfdCBoYXZlX2NoaWxkX3N0YXR1czsKKyAgICBpbnQgY2hpbGRfc3RhdHVzOworICB9OworCitzdGF0aWMgREJ1c0JhYnlzaXR0ZXIqCitfZGJ1c19iYWJ5c2l0dGVyX25ldyAodm9pZCkKK3sKKyAgREJ1c0JhYnlzaXR0ZXIgKnNpdHRlcjsKKworICBzaXR0ZXIgPSBkYnVzX25ldzAgKERCdXNCYWJ5c2l0dGVyLCAxKTsKKyAgaWYgKHNpdHRlciA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHNpdHRlci0+cmVmY291bnQgPSAxOworCisgIHNpdHRlci0+c3RhcnRfc3luY19ldmVudCA9IENyZWF0ZUV2ZW50IChOVUxMLCBGQUxTRSwgRkFMU0UsIE5VTEwpOworICBpZiAoc2l0dGVyLT5zdGFydF9zeW5jX2V2ZW50ID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYmFieXNpdHRlcl91bnJlZiAoc2l0dGVyKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgc2l0dGVyLT5lbmRfc3luY19ldmVudCA9IENyZWF0ZUV2ZW50IChOVUxMLCBGQUxTRSwgRkFMU0UsIE5VTEwpOworICBpZiAoc2l0dGVyLT5lbmRfc3luY19ldmVudCA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKHNpdHRlcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisjZW5kaWYKKworICBzaXR0ZXItPmNoaWxkX2hhbmRsZSA9IE5VTEw7CisKKyAgc2l0dGVyLT5zb2NrZXRfdG9fYmFieXNpdHRlciA9IHNpdHRlci0+c29ja2V0X3RvX21haW4gPSAtMTsKKworICBzaXR0ZXItPmFyZ2MgPSAwOworICBzaXR0ZXItPmFyZ3YgPSBOVUxMOworICBzaXR0ZXItPmVudnAgPSBOVUxMOworCisgIHNpdHRlci0+d2F0Y2hlcyA9IF9kYnVzX3dhdGNoX2xpc3RfbmV3ICgpOworICBpZiAoc2l0dGVyLT53YXRjaGVzID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYmFieXNpdHRlcl91bnJlZiAoc2l0dGVyKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBzaXR0ZXItPmhhdmVfc3Bhd25fZXJybm8gPSBGQUxTRTsKKyAgc2l0dGVyLT5oYXZlX2NoaWxkX3N0YXR1cyA9IEZBTFNFOworCisgIHJldHVybiBzaXR0ZXI7Cit9CisKKy8qKgorICogSW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgb24gdGhlIGJhYnlzaXR0ZXIgb2JqZWN0LgorICoKKyAqIEBwYXJhbSBzaXR0ZXIgdGhlIGJhYnlzaXR0ZXIKKyAqIEByZXR1cm5zIHRoZSBiYWJ5c2l0dGVyCisgKi8KK0RCdXNCYWJ5c2l0dGVyICoKK19kYnVzX2JhYnlzaXR0ZXJfcmVmIChEQnVzQmFieXNpdHRlciAqc2l0dGVyKQoreworICBQSU5HKCk7CisgIF9kYnVzX2Fzc2VydCAoc2l0dGVyICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHNpdHRlci0+cmVmY291bnQgPiAwKTsKKworICBzaXR0ZXItPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIHNpdHRlcjsKK30KKworc3RhdGljIHZvaWQKK2Nsb3NlX3NvY2tldF90b19iYWJ5c2l0dGVyIChEQnVzQmFieXNpdHRlciAqc2l0dGVyKQoreworICBfZGJ1c192ZXJib3NlICgiQ2xvc2luZyBiYWJ5c2l0dGVyXG4iKTsKKworICBpZiAoc2l0dGVyLT5zaXR0ZXJfd2F0Y2ggIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHNpdHRlci0+d2F0Y2hlcyAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX3dhdGNoX2xpc3RfcmVtb3ZlX3dhdGNoIChzaXR0ZXItPndhdGNoZXMsICBzaXR0ZXItPnNpdHRlcl93YXRjaCk7CisgICAgICBfZGJ1c193YXRjaF9pbnZhbGlkYXRlIChzaXR0ZXItPnNpdHRlcl93YXRjaCk7CisgICAgICBfZGJ1c193YXRjaF91bnJlZiAoc2l0dGVyLT5zaXR0ZXJfd2F0Y2gpOworICAgICAgc2l0dGVyLT5zaXR0ZXJfd2F0Y2ggPSBOVUxMOworICAgIH0KKworICBpZiAoc2l0dGVyLT5zb2NrZXRfdG9fYmFieXNpdHRlciAhPSAtMSkKKyAgICB7CisgICAgICBfZGJ1c19jbG9zZV9zb2NrZXQgKHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIsIE5VTEwpOworICAgICAgc2l0dGVyLT5zb2NrZXRfdG9fYmFieXNpdHRlciA9IC0xOworICAgIH0KK30KKworLyoqCisgKiBEZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiB0aGUgYmFieXNpdHRlciBvYmplY3QuCisgKgorICogQHBhcmFtIHNpdHRlciB0aGUgYmFieXNpdHRlcgorICovCit2b2lkCitfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChEQnVzQmFieXNpdHRlciAqc2l0dGVyKQoreworICBpbnQgaTsKKworICBQSU5HKCk7CisgIF9kYnVzX2Fzc2VydCAoc2l0dGVyICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHNpdHRlci0+cmVmY291bnQgPiAwKTsKKworICBzaXR0ZXItPnJlZmNvdW50IC09IDE7CisKKyAgaWYgKHNpdHRlci0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBjbG9zZV9zb2NrZXRfdG9fYmFieXNpdHRlciAoc2l0dGVyKTsKKworICAgICAgaWYgKHNpdHRlci0+c29ja2V0X3RvX21haW4gIT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19jbG9zZV9zb2NrZXQgKHNpdHRlci0+c29ja2V0X3RvX21haW4sIE5VTEwpOworICAgICAgICAgIHNpdHRlci0+c29ja2V0X3RvX21haW4gPSAtMTsKKyAgICAgICAgfQorCisgICAgICBQSU5HKCk7CisgICAgICBpZiAoc2l0dGVyLT5hcmd2ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l0dGVyLT5hcmdjOyBpKyspCisgICAgICAgICAgICBpZiAoc2l0dGVyLT5hcmd2W2ldICE9IE5VTEwpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkYnVzX2ZyZWUgKHNpdHRlci0+YXJndltpXSk7CisgICAgICAgICAgICAgICAgc2l0dGVyLT5hcmd2W2ldID0gTlVMTDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIGRidXNfZnJlZSAoc2l0dGVyLT5hcmd2KTsKKyAgICAgICAgICBzaXR0ZXItPmFyZ3YgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgIGlmIChzaXR0ZXItPmVudnAgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGNoYXIgKiplID0gc2l0dGVyLT5lbnZwOworCisgICAgICAgICAgd2hpbGUgKCplKQorICAgICAgICAgICAgZGJ1c19mcmVlICgqZSsrKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHNpdHRlci0+ZW52cCk7CisgICAgICAgICAgc2l0dGVyLT5lbnZwID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBpZiAoc2l0dGVyLT5jaGlsZF9oYW5kbGUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIENsb3NlSGFuZGxlIChzaXR0ZXItPmNoaWxkX2hhbmRsZSk7CisgICAgICAgICAgc2l0dGVyLT5jaGlsZF9oYW5kbGUgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgIGlmIChzaXR0ZXItPnNpdHRlcl93YXRjaCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhdGNoX2ludmFsaWRhdGUgKHNpdHRlci0+c2l0dGVyX3dhdGNoKTsKKyAgICAgICAgICBfZGJ1c193YXRjaF91bnJlZiAoc2l0dGVyLT5zaXR0ZXJfd2F0Y2gpOworICAgICAgICAgIHNpdHRlci0+c2l0dGVyX3dhdGNoID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBpZiAoc2l0dGVyLT53YXRjaGVzKQorICAgICAgICBfZGJ1c193YXRjaF9saXN0X2ZyZWUgKHNpdHRlci0+d2F0Y2hlcyk7CisKKyAgICAgIGlmIChzaXR0ZXItPnN0YXJ0X3N5bmNfZXZlbnQgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIFBJTkcoKTsKKyAgICAgICAgICBDbG9zZUhhbmRsZSAoc2l0dGVyLT5zdGFydF9zeW5jX2V2ZW50KTsKKyAgICAgICAgICBzaXR0ZXItPnN0YXJ0X3N5bmNfZXZlbnQgPSBOVUxMOworICAgICAgICB9CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgICAgICBpZiAoc2l0dGVyLT5lbmRfc3luY19ldmVudCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQ2xvc2VIYW5kbGUgKHNpdHRlci0+ZW5kX3N5bmNfZXZlbnQpOworICAgICAgICAgIHNpdHRlci0+ZW5kX3N5bmNfZXZlbnQgPSBOVUxMOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgZGJ1c19mcmVlIChzaXR0ZXItPmV4ZWN1dGFibGUpOworCisgICAgICBkYnVzX2ZyZWUgKHNpdHRlcik7CisgICAgfQorfQorCit2b2lkCitfZGJ1c19iYWJ5c2l0dGVyX2tpbGxfY2hpbGQgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIpCit7CisgIFBJTkcoKTsKKyAgaWYgKHNpdHRlci0+Y2hpbGRfaGFuZGxlID09IE5VTEwpCisgICAgcmV0dXJuOyAvKiBjaGlsZCBpcyBhbHJlYWR5IGRlYWQsIG9yIHdlJ3JlIHNvIGhvc2VkIHdlJ2xsIG5ldmVyIHJlY292ZXIgKi8KKworICBQSU5HKCk7CisgIFRlcm1pbmF0ZVByb2Nlc3MgKHNpdHRlci0+Y2hpbGRfaGFuZGxlLCAxMjM0NSk7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNoaWxkIGhhcyBleGl0ZWQsIHdpdGhvdXQgYmxvY2tpbmcuCisgKgorICogQHBhcmFtIHNpdHRlciB0aGUgYmFieXNpdHRlcgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdGVkIChEQnVzQmFieXNpdHRlciAqc2l0dGVyKQoreworICBQSU5HKCk7CisgIHJldHVybiAoc2l0dGVyLT5jaGlsZF9oYW5kbGUgPT0gTlVMTCk7Cit9CisKKy8qKgorICogR2V0cyB0aGUgZXhpdCBzdGF0dXMgb2YgdGhlIGNoaWxkLiBXZSBkbyB0aGlzIHNvIGltcGxlbWVudGF0aW9uIHNwZWNpZmljCisgKiBkZXRhaWwgaXMgbm90IGNsdXR0ZXJpbmcgdXAgZGJ1cywgZm9yIGV4YW1wbGUgdGhlIHN5c3RlbSBsYXVuY2hlciBjb2RlLgorICogVGhpcyBjYW4gb25seSBiZSBjYWxsZWQgaWYgdGhlIGNoaWxkIGhhcyBleGl0ZWQsIGkuZS4gY2FsbAorICogX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdGVkKCkuIEl0IHJldHVybnMgRkFMU0UgaWYgdGhlIGNoaWxkCisgKiBkaWQgbm90IHJldHVybiBhIHN0YXR1cyBjb2RlLCBlLmcuIGJlY2F1c2UgdGhlIGNoaWxkIHdhcyBzaWduYWxlZAorICogb3Igd2UgZmFpbGVkIHRvIGV2ZXIgbGF1bmNoIHRoZSBjaGlsZCBpbiB0aGUgZmlyc3QgcGxhY2UuCisgKgorICogQHBhcmFtIHNpdHRlciB0aGUgYmFieXNpdHRlcgorICogQHBhcmFtIHN0YXR1cyB0aGUgcmV0dXJuZWQgc3RhdHVzIGNvZGUKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBmYWlsdXJlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19iYWJ5c2l0dGVyX2dldF9jaGlsZF9leGl0X3N0YXR1cyAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAqc3RhdHVzKQoreworICBpZiAoIV9kYnVzX2JhYnlzaXR0ZXJfZ2V0X2NoaWxkX2V4aXRlZCAoc2l0dGVyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJDaGlsZCBoYXMgbm90IGV4aXRlZCIpOworCisgIGlmICghc2l0dGVyLT5oYXZlX2NoaWxkX3N0YXR1cyB8fAorICAgICAgc2l0dGVyLT5jaGlsZF9zdGF0dXMgPT0gU1RJTExfQUNUSVZFKQorICAgIHJldHVybiBGQUxTRTsKKworICAqc3RhdHVzID0gc2l0dGVyLT5jaGlsZF9zdGF0dXM7CisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFNldHMgdGhlICNEQnVzRXJyb3Igd2l0aCBhbiBleHBsYW5hdGlvbiBvZiB3aHkgdGhlIHNwYXduZWQKKyAqIGNoaWxkIHByb2Nlc3MgZXhpdGVkIChvbiBhIHNpZ25hbCwgb3Igd2hhdGV2ZXIpLiBJZgorICogdGhlIGNoaWxkIHByb2Nlc3MgaGFzIG5vdCBleGl0ZWQsIGRvZXMgbm90aGluZyAoZXJyb3IKKyAqIHdpbGwgcmVtYWluIHVuc2V0KS4KKyAqCisgKiBAcGFyYW0gc2l0dGVyIHRoZSBiYWJ5c2l0dGVyCisgKiBAcGFyYW0gZXJyb3IgYW4gZXJyb3IgdG8gZmlsbCBpbgorICovCit2b2lkCitfZGJ1c19iYWJ5c2l0dGVyX3NldF9jaGlsZF9leGl0X2Vycm9yIChEQnVzQmFieXNpdHRlciAqc2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBQSU5HKCk7CisgIGlmICghX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdGVkIChzaXR0ZXIpKQorICAgIHJldHVybjsKKworICBQSU5HKCk7CisgIGlmIChzaXR0ZXItPmhhdmVfc3Bhd25fZXJybm8pCisgICAgeworICAgICAgY2hhciAqZW1zZyA9IF9kYnVzX3dpbl9lcnJvcl9zdHJpbmcgKHNpdHRlci0+c3Bhd25fZXJybm8pOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0VYRUNfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZXhlY3V0ZSBwcm9ncmFtICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgc2l0dGVyLT5leGVjdXRhYmxlLCBlbXNnKTsKKyAgICAgIF9kYnVzX3dpbl9mcmVlX2Vycm9yX3N0cmluZyAoZW1zZyk7CisgICAgfQorICBlbHNlIGlmIChzaXR0ZXItPmhhdmVfY2hpbGRfc3RhdHVzKQorICAgIHsKKyAgICAgIFBJTkcoKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9DSElMRF9FWElURUQsCisgICAgICAgICAgICAgICAgICAgICAgIlByb2Nlc3MgJXMgZXhpdGVkIHdpdGggc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBzaXR0ZXItPmV4ZWN1dGFibGUsIHNpdHRlci0+Y2hpbGRfc3RhdHVzKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBQSU5HKCk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJQcm9jZXNzICVzIGV4aXRlZCwgc3RhdHVzIHVua25vd24iLAorICAgICAgICAgICAgICAgICAgICAgIHNpdHRlci0+ZXhlY3V0YWJsZSk7CisgICAgfQorICBQSU5HKCk7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19iYWJ5c2l0dGVyX3NldF93YXRjaF9mdW5jdGlvbnMgKERCdXNCYWJ5c2l0dGVyICAgICAgICAgICAgKnNpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0FkZFdhdGNoRnVuY3Rpb24gICAgICAgYWRkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUmVtb3ZlV2F0Y2hGdW5jdGlvbiAgICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaFRvZ2dsZWRGdW5jdGlvbiAgIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgUElORygpOworICByZXR1cm4gX2RidXNfd2F0Y2hfbGlzdF9zZXRfZnVuY3Rpb25zIChzaXR0ZXItPndhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV93YXRjaCAoREJ1c1dhdGNoICAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICBjb25kaXRpb24sCisgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciA9IGRhdGE7CisKKyAgLyogT24gVW5peCBkYnVzLXNwYXduIHVzZXMgYSBiYWJ5c2l0dGVyICpwcm9jZXNzKiwgdGh1cyBpdCBoYXMgdG8KKyAgICogYWN0dWFsbHkgc2VuZCB0aGUgZXhpdCBzdGF0dXNlcywgZXJyb3IgY29kZXMgYW5kIHdoYXRub3QgdGhyb3VnaAorICAgKiBzb2NrZXRzIGFuZC9vciBwaXBlcy4gT24gV2luMzIsIHRoZSBiYWJ5c2l0dGVyIGlzIGp1cyBhIHRocmVhZCwKKyAgICogc28gaXQgY2FuIHNldCB0aGUgc3RhdHVzIGZpZWxkcyBkaXJlY3RseSBpbiB0aGUgYmFieXNpdHRlciBzdHJ1Y3QKKyAgICoganVzdCBmaW5lLiBUaGUgc29ja2V0IHBpcGUgaXMgdXNlZCBqdXN0IHNvIHdlIGNhbiB3YXRjaCBpdCB3aXRoCisgICAqIHNlbGVjdCgpLCBhcyBzb29uIGFzIGFueXRoaW5nIGlzIHdyaXR0ZW4gdG8gaXQgd2Uga25vdyB0aGF0IHRoZQorICAgKiBiYWJ5c2l0dGVyIHRocmVhZCBoYXMgcmVjb3JkZWQgdGhlIHN0YXR1cyBpbiB0aGUgYmFieXNpdHRlcgorICAgKiBzdHJ1Y3QuCisgICAqLworCisgIFBJTkcoKTsKKyAgY2xvc2Vfc29ja2V0X3RvX2JhYnlzaXR0ZXIgKHNpdHRlcik7CisgIFBJTkcoKTsKKworICBpZiAoX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdGVkIChzaXR0ZXIpICYmCisgICAgICBzaXR0ZXItPmZpbmlzaGVkX2NiICE9IE5VTEwpCisgICAgeworICAgICAgc2l0dGVyLT5maW5pc2hlZF9jYiAoc2l0dGVyLCBzaXR0ZXItPmZpbmlzaGVkX2RhdGEpOworICAgICAgc2l0dGVyLT5maW5pc2hlZF9jYiA9IE5VTEw7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKiBwcm90ZWN0X2FyZ3YgbGlmdGVkIGZyb20gR0xpYiwgcmVsaWNlbnNlZCBieSBhdXRob3IsIFRvciBMaWxscXZpc3QgKi8KK3N0YXRpYyBpbnQKK3Byb3RlY3RfYXJndiAoY2hhciAgKiphcmd2LAorICAgICAgICAgICAgICBjaGFyICoqKm5ld19hcmd2KQoreworICBpbnQgaTsKKyAgaW50IGFyZ2MgPSAwOworCisgIHdoaWxlIChhcmd2W2FyZ2NdKQorICAgICsrYXJnYzsKKyAgKm5ld19hcmd2ID0gZGJ1c19tYWxsb2MgKChhcmdjICsgMSkgKiBzaXplb2YgKGNoYXIgKikpOworICBpZiAoKm5ld19hcmd2ID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisgIGZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspCisgICAgKCpuZXdfYXJndilbaV0gPSBOVUxMOworCisgIC8qIFF1b3RlIGVhY2ggYXJndiBlbGVtZW50IGlmIG5lY2Vzc2FyeSwgc28gdGhhdCBpdCB3aWxsIGdldAorICAgKiByZWNvbnN0cnVjdGVkIGNvcnJlY3RseSBpbiB0aGUgQyBydW50aW1lIHN0YXJ0dXAgY29kZS4gIE5vdGUgdGhhdAorICAgKiB0aGUgdW5xdW90aW5nIGFsZ29yaXRobSBpbiB0aGUgQyBydW50aW1lIGlzIHJlYWxseSB3ZWlyZCwgYW5kCisgICAqIHJhdGhlciBkaWZmZXJlbnQgdGhhbiB3aGF0IFVuaXggc2hlbGxzIGRvLiBTZWUgc3RkYXJndi5jIGluIHRoZSBDCisgICAqIHJ1bnRpbWUgc291cmNlcyAoaW4gdGhlIFBsYXRmb3JtIFNESywgaW4gc3JjL2NydCkuCisgICAqCisgICAqIE5vdGUgdGhhdCBhbiBuZXdfYXJndlswXSBjb25zdHJ1Y3RlZCBieSB0aGlzIGZ1bmN0aW9uIHNob3VsZAorICAgKiAqbm90KiBiZSBwYXNzZWQgYXMgdGhlIGZpbGVuYW1lIGFyZ3VtZW50IHRvIGEgc3Bhd24qIG9yIGV4ZWMqCisgICAqIGZhbWlseSBmdW5jdGlvbi4gVGhhdCBhcmd1bWVudCBzaG91bGQgYmUgdGhlIHJlYWwgZmlsZSBuYW1lCisgICAqIHdpdGhvdXQgYW55IHF1b3RpbmcuCisgICAqLworICBmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKQorICAgIHsKKyAgICAgIGNoYXIgKnAgPSBhcmd2W2ldOworICAgICAgY2hhciAqcTsKKyAgICAgIGludCBsZW4gPSAwOworICAgICAgaW50IG5lZWRfZGJscXVvdGVzID0gRkFMU0U7CisgICAgICB3aGlsZSAoKnApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcpCisgICAgICAgICAgICBuZWVkX2RibHF1b3RlcyA9IFRSVUU7CisgICAgICAgICAgZWxzZSBpZiAoKnAgPT0gJyInKQorICAgICAgICAgICAgbGVuKys7CisgICAgICAgICAgZWxzZSBpZiAoKnAgPT0gJ1xcJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2hhciAqcHAgPSBwOworICAgICAgICAgICAgICB3aGlsZSAoKnBwICYmICpwcCA9PSAnXFwnKQorICAgICAgICAgICAgICAgIHBwKys7CisgICAgICAgICAgICAgIGlmICgqcHAgPT0gJyInKQorICAgICAgICAgICAgICAgIGxlbisrOworICAgICAgICAgICAgfQorICAgICAgICAgIGxlbisrOworICAgICAgICAgIHArKzsKKyAgICAgICAgfQorCisgICAgICBxID0gKCpuZXdfYXJndilbaV0gPSBkYnVzX21hbGxvYyAobGVuICsgbmVlZF9kYmxxdW90ZXMqMiArIDEpOworCisgICAgICBpZiAocSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisKKworICAgICAgcCA9IGFyZ3ZbaV07CisKKyAgICAgIGlmIChuZWVkX2RibHF1b3RlcykKKyAgICAgICAgKnErKyA9ICciJzsKKworICAgICAgd2hpbGUgKCpwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCpwID09ICciJykKKyAgICAgICAgICAgICpxKysgPSAnXFwnOworICAgICAgICAgIGVsc2UgaWYgKCpwID09ICdcXCcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNoYXIgKnBwID0gcDsKKyAgICAgICAgICAgICAgd2hpbGUgKCpwcCAmJiAqcHAgPT0gJ1xcJykKKyAgICAgICAgICAgICAgICBwcCsrOworICAgICAgICAgICAgICBpZiAoKnBwID09ICciJykKKyAgICAgICAgICAgICAgICAqcSsrID0gJ1xcJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAqcSsrID0gKnA7CisgICAgICAgICAgcCsrOworICAgICAgICB9CisKKyAgICAgIGlmIChuZWVkX2RibHF1b3RlcykKKyAgICAgICAgKnErKyA9ICciJzsKKyAgICAgICpxKysgPSAnXDAnOworICAgICAgLyogcHJpbnRmICgiYXJndlslZF06JXMsIG5lZWRfZGJscXVvdGVzOiVzIGxlbjolZCA9PiAlc1xuIiwgaSwgYXJndltpXSwgbmVlZF9kYmxxdW90ZXM/IlRSVUUiOiJGQUxTRSIsIGxlbiwgKCpuZXdfYXJndilbaV0pOyAqLworICAgIH0KKyAgKCpuZXdfYXJndilbYXJnY10gPSBOVUxMOworCisgIHJldHVybiBhcmdjOworfQorCisKKy8qIEZyb20gR1BHTUUsIHJlbGljZW5zZWQgYnkgZzEwIENvZGUgR21iSC4gICovCitzdGF0aWMgY2hhciAqCitjb21wb3NlX3N0cmluZyAoY2hhciAqKnN0cmluZ3MsIGNoYXIgc2VwYXJhdG9yKQoreworICBpbnQgaTsKKyAgaW50IG4gPSAwOworICBjaGFyICpidWY7CisgIGNoYXIgKnA7CisKKyAgaWYgKCFzdHJpbmdzIHx8ICFzdHJpbmdzWzBdKQorICAgIHJldHVybiAwOworICBmb3IgKGkgPSAwOyBzdHJpbmdzW2ldOyBpKyspCisgICAgbiArPSBzdHJsZW4gKHN0cmluZ3NbaV0pICsgMTsKKyAgbisrOworCisgIGJ1ZiA9IHAgPSBtYWxsb2MgKG4pOworICBpZiAoIWJ1ZikKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yIChpID0gMDsgc3RyaW5nc1tpXTsgaSsrKQorICAgIHsKKyAgICAgIHN0cmNweSAocCwgc3RyaW5nc1tpXSk7CisgICAgICBwICs9IHN0cmxlbiAoc3RyaW5nc1tpXSk7CisgICAgICAqKHArKykgPSBzZXBhcmF0b3I7CisgICAgfQorICBwLS07CisgICoocCsrKSA9ICdcMCc7CisgICpwID0gJ1wwJzsKKworICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgY2hhciAqCitidWlsZF9jb21tYW5kbGluZSAoY2hhciAqKmFyZ3YpCit7CisgIHJldHVybiBjb21wb3NlX3N0cmluZyAoYXJndiwgJyAnKTsKK30KKworc3RhdGljIGNoYXIgKgorYnVpbGRfZW52X3N0cmluZyAoY2hhcioqIGVudnApCit7CisgIHJldHVybiBjb21wb3NlX3N0cmluZyAoZW52cCwgJ1wwJyk7Cit9CisKK3N0YXRpYyBIQU5ETEUKK3NwYXduX3Byb2dyYW0gKGNoYXIqIG5hbWUsIGNoYXIqKiBhcmd2LCBjaGFyKiogZW52cCkKK3sKKyAgUFJPQ0VTU19JTkZPUk1BVElPTiBwaSA9IHsgTlVMTCwgMCwgMCwgMCB9OworICBTVEFSVFVQSU5GT0Egc2k7CisgIGNoYXIgKmFyZ19zdHJpbmcsICplbnZfc3RyaW5nOworICBCT09MIHJlc3VsdDsKKworI2lmZGVmIERCVVNfV0lOQ0UKKyAgaWYgKGFyZ3YgJiYgYXJndlswXSkKKyAgICBhcmdfc3RyaW5nID0gYnVpbGRfY29tbWFuZGxpbmUgKGFyZ3YgKyAxKTsKKyAgZWxzZQorICAgIGFyZ19zdHJpbmcgPSBOVUxMOworI2Vsc2UKKyAgYXJnX3N0cmluZyA9IGJ1aWxkX2NvbW1hbmRsaW5lIChhcmd2KTsKKyNlbmRpZgorICBpZiAoIWFyZ19zdHJpbmcpCisgICAgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOworCisgIGVudl9zdHJpbmcgPSBidWlsZF9lbnZfc3RyaW5nKGVudnApOworCisgIG1lbXNldCAoJnNpLCAwLCBzaXplb2YgKHNpKSk7CisgIHNpLmNiID0gc2l6ZW9mIChzaSk7CisjaWZkZWYgREJVU19XSU5DRQorICByZXN1bHQgPSBDcmVhdGVQcm9jZXNzQSAobmFtZSwgYXJnX3N0cmluZywgTlVMTCwgTlVMTCwgRkFMU0UsIDAsCisjZWxzZQorICByZXN1bHQgPSBDcmVhdGVQcm9jZXNzQSAoTlVMTCwgYXJnX3N0cmluZywgTlVMTCwgTlVMTCwgRkFMU0UsIDAsCisjZW5kaWYKKwkJCSAgIChMUFZPSUQpZW52X3N0cmluZywgTlVMTCwgJnNpLCAmcGkpOworICBmcmVlIChhcmdfc3RyaW5nKTsKKyAgaWYgKGVudl9zdHJpbmcpCisgICAgZnJlZSAoZW52X3N0cmluZyk7CisKKyAgaWYgKCFyZXN1bHQpCisgICAgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOworCisgIENsb3NlSGFuZGxlIChwaS5oVGhyZWFkKTsKKyAgcmV0dXJuIHBpLmhQcm9jZXNzOworfQorCisKK3N0YXRpYyBEV09SRCBfX3N0ZGNhbGwKK2JhYnlzaXR0ZXIgKHZvaWQgKnBhcmFtZXRlcikKK3sKKyAgREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciA9IChEQnVzQmFieXNpdHRlciAqKSBwYXJhbWV0ZXI7CisKKyAgUElORygpOworICBfZGJ1c19iYWJ5c2l0dGVyX3JlZiAoc2l0dGVyKTsKKworICBpZiAoc2l0dGVyLT5jaGlsZF9zZXR1cCkKKyAgICB7CisgICAgICBQSU5HKCk7CisgICAgICAoKnNpdHRlci0+Y2hpbGRfc2V0dXApIChzaXR0ZXItPnVzZXJfZGF0YSk7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJiYWJ5c2l0dGVyOiBzcGF3bmluZyAlc1xuIiwgc2l0dGVyLT5leGVjdXRhYmxlKTsKKworICBQSU5HKCk7CisgIHNpdHRlci0+Y2hpbGRfaGFuZGxlID0gc3Bhd25fcHJvZ3JhbSAoc2l0dGVyLT5leGVjdXRhYmxlLAorCQkJCQlzaXR0ZXItPmFyZ3YsIHNpdHRlci0+ZW52cCk7CisKKyAgUElORygpOworICBpZiAoc2l0dGVyLT5jaGlsZF9oYW5kbGUgPT0gKEhBTkRMRSkgLTEpCisgICAgeworICAgICAgc2l0dGVyLT5jaGlsZF9oYW5kbGUgPSBOVUxMOworICAgICAgc2l0dGVyLT5oYXZlX3NwYXduX2Vycm5vID0gVFJVRTsKKyAgICAgIHNpdHRlci0+c3Bhd25fZXJybm8gPSBHZXRMYXN0RXJyb3IoKTsKKyAgICB9CisgIAorICBQSU5HKCk7CisgIFNldEV2ZW50IChzaXR0ZXItPnN0YXJ0X3N5bmNfZXZlbnQpOworCisgIGlmIChzaXR0ZXItPmNoaWxkX2hhbmRsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGludCByZXQ7CisgICAgICBEV09SRCBzdGF0dXM7CisKKyAgICAgIFBJTkcoKTsKKyAgICAgIFdhaXRGb3JTaW5nbGVPYmplY3QgKHNpdHRlci0+Y2hpbGRfaGFuZGxlLCBJTkZJTklURSk7CisKKyAgICAgIFBJTkcoKTsKKyAgICAgIHJldCA9IEdldEV4aXRDb2RlUHJvY2VzcyAoc2l0dGVyLT5jaGlsZF9oYW5kbGUsICZzdGF0dXMpOworCisgICAgICBzaXR0ZXItPmNoaWxkX3N0YXR1cyA9IHN0YXR1czsKKyAgICAgIHNpdHRlci0+aGF2ZV9jaGlsZF9zdGF0dXMgPSBUUlVFOworCisgICAgICBDbG9zZUhhbmRsZSAoc2l0dGVyLT5jaGlsZF9oYW5kbGUpOworICAgICAgc2l0dGVyLT5jaGlsZF9oYW5kbGUgPSBOVUxMOworICAgIH0KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgU2V0RXZlbnQgKHNpdHRlci0+ZW5kX3N5bmNfZXZlbnQpOworI2VuZGlmCisKKyAgUElORygpOworICBzZW5kIChzaXR0ZXItPnNvY2tldF90b19tYWluLCAiICIsIDEsIDApOworCisgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKHNpdHRlcik7CisKKyAgcmV0dXJuIDA7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19zcGF3bl9hc3luY193aXRoX2JhYnlzaXR0ZXIgKERCdXNCYWJ5c2l0dGVyICAgICAgICAgICAqKnNpdHRlcl9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgKiphcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgKiplbnZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3Bhd25DaGlsZFNldHVwRnVuYyAgICBjaGlsZF9zZXR1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICAgICplcnJvcikKK3sKKyAgREJ1c0JhYnlzaXR0ZXIgKnNpdHRlcjsKKyAgSEFORExFIHNpdHRlcl90aHJlYWQ7CisgIERXT1JEIHNpdHRlcl90aHJlYWRfaWQ7CisgIAorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICAqc2l0dGVyX3AgPSBOVUxMOworCisgIFBJTkcoKTsKKyAgc2l0dGVyID0gX2RidXNfYmFieXNpdHRlcl9uZXcgKCk7CisgIGlmIChzaXR0ZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHNpdHRlci0+Y2hpbGRfc2V0dXAgPSBjaGlsZF9zZXR1cDsKKyAgc2l0dGVyLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisKKyAgc2l0dGVyLT5leGVjdXRhYmxlID0gX2RidXNfc3RyZHVwIChhcmd2WzBdKTsKKyAgaWYgKHNpdHRlci0+ZXhlY3V0YWJsZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0MDsKKyAgICB9CisKKyAgUElORygpOworICBpZiAoIV9kYnVzX2Z1bGxfZHVwbGV4X3BpcGUgKCZzaXR0ZXItPnNvY2tldF90b19iYWJ5c2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXR0ZXItPnNvY2tldF90b19tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBlcnJvcikpCisgICAgZ290byBvdXQwOworCisgIHNpdHRlci0+c2l0dGVyX3dhdGNoID0gX2RidXNfd2F0Y2hfbmV3IChzaXR0ZXItPnNvY2tldF90b19iYWJ5c2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19XQVRDSF9SRUFEQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsIGhhbmRsZV93YXRjaCwgc2l0dGVyLCBOVUxMKTsKKyAgUElORygpOworICBpZiAoc2l0dGVyLT5zaXR0ZXJfd2F0Y2ggPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDA7CisgICAgfQorCisgIFBJTkcoKTsKKyAgaWYgKCFfZGJ1c193YXRjaF9saXN0X2FkZF93YXRjaCAoc2l0dGVyLT53YXRjaGVzLCAgc2l0dGVyLT5zaXR0ZXJfd2F0Y2gpKQorICAgIHsKKyAgICAgIC8qIHdlIG5lZWQgdG8gZnJlZSBpdCBlYXJseSBzbyB0aGUgZGVzdHJ1Y3RvciB3b24ndCB0cnkgdG8gcmVtb3ZlIGl0CisgICAgICAgKiB3aXRob3V0IGl0IGhhdmluZyBiZWVuIGFkZGVkLCB3aGljaCBEQnVzTG9vcCBkb2Vzbid0IGFsbG93ICovCisgICAgICBfZGJ1c193YXRjaF9pbnZhbGlkYXRlIChzaXR0ZXItPnNpdHRlcl93YXRjaCk7CisgICAgICBfZGJ1c193YXRjaF91bnJlZiAoc2l0dGVyLT5zaXR0ZXJfd2F0Y2gpOworICAgICAgc2l0dGVyLT5zaXR0ZXJfd2F0Y2ggPSBOVUxMOworCisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDA7CisgICAgfQorCisgIHNpdHRlci0+YXJnYyA9IHByb3RlY3RfYXJndiAoYXJndiwgJnNpdHRlci0+YXJndik7CisgIGlmIChzaXR0ZXItPmFyZ2MgPT0gLTEpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQwOworICAgIH0KKyAgc2l0dGVyLT5lbnZwID0gZW52cDsKKworICBQSU5HKCk7CisgIHNpdHRlcl90aHJlYWQgPSAoSEFORExFKSBDcmVhdGVUaHJlYWQgKE5VTEwsIDAsIGJhYnlzaXR0ZXIsCisgICAgICAgICAgICAgICAgICBzaXR0ZXIsIDAsICZzaXR0ZXJfdGhyZWFkX2lkKTsKKworICBpZiAoc2l0dGVyX3RocmVhZCA9PSAwKQorICAgIHsKKyAgICAgIFBJTkcoKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9GT1JLX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBuZXcgdGhyZWFkIik7CisgICAgICBnb3RvIG91dDA7CisgICAgfQorICBDbG9zZUhhbmRsZSAoc2l0dGVyX3RocmVhZCk7CisKKyAgUElORygpOworICBXYWl0Rm9yU2luZ2xlT2JqZWN0IChzaXR0ZXItPnN0YXJ0X3N5bmNfZXZlbnQsIElORklOSVRFKTsKKworICBQSU5HKCk7CisgIGlmIChzaXR0ZXJfcCAhPSBOVUxMKQorICAgICpzaXR0ZXJfcCA9IHNpdHRlcjsKKyAgZWxzZQorICAgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKHNpdHRlcik7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgUElORygpOworICByZXR1cm4gVFJVRTsKKworb3V0MDoKKyAgX2RidXNfYmFieXNpdHRlcl91bnJlZiAoc2l0dGVyKTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKK3ZvaWQKK19kYnVzX2JhYnlzaXR0ZXJfc2V0X3Jlc3VsdF9mdW5jdGlvbiAgKERCdXNCYWJ5c2l0dGVyICAgICAgICAgICAgICpzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQmFieXNpdHRlckZpbmlzaGVkRnVuYyAgZmluaXNoZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhKQoreworICBzaXR0ZXItPmZpbmlzaGVkX2NiID0gZmluaXNoZWQ7CisgIHNpdHRlci0+ZmluaXNoZWRfZGF0YSA9IHVzZXJfZGF0YTsKK30KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKworc3RhdGljIGNoYXIgKgorZ2V0X3Rlc3RfZXhlYyAoY29uc3QgY2hhciAqZXhlLAorICAgICAgICAgICAgICAgREJ1c1N0cmluZyAqc2NyYXRjaF9zcGFjZSkKK3sKKyAgY29uc3QgY2hhciAqZGJ1c190ZXN0X2V4ZWM7CisKKyAgZGJ1c190ZXN0X2V4ZWMgPSBfZGJ1c19nZXRlbnYgKCJEQlVTX1RFU1RfRVhFQyIpOworCisgIGlmIChkYnVzX3Rlc3RfZXhlYyA9PSBOVUxMKQorICAgIGRidXNfdGVzdF9leGVjID0gREJVU19URVNUX0VYRUM7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoc2NyYXRjaF9zcGFjZSkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoc2NyYXRjaF9zcGFjZSwgIiVzLyVzJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3Rlc3RfZXhlYywgZXhlLCBEQlVTX0VYRUVYVCkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKHNjcmF0Y2hfc3BhY2UpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJldHVybiBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKHNjcmF0Y2hfc3BhY2UpOworfQorCisjZGVmaW5lIExJVkVfQ0hJTERSRU4oc2l0dGVyKSAoKHNpdHRlciktPmNoaWxkX2hhbmRsZSAhPSBOVUxMKQorCitzdGF0aWMgdm9pZAorX2RidXNfYmFieXNpdHRlcl9ibG9ja19mb3JfY2hpbGRfZXhpdCAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlcikKK3sKKyAgaWYgKHNpdHRlci0+Y2hpbGRfaGFuZGxlID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIFdhaXRGb3JTaW5nbGVPYmplY3QgKHNpdHRlci0+ZW5kX3N5bmNfZXZlbnQsIElORklOSVRFKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19zcGF3bl9ub25leGlzdGVudCAodm9pZCAqZGF0YSkKK3sKKyAgY2hhciAqYXJndls0XSA9IHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9OworICBEQnVzQmFieXNpdHRlciAqc2l0dGVyOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgc2l0dGVyID0gTlVMTDsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgLyoqKiBUZXN0IGxhdW5jaGluZyBub25leGlzdGVudCBiaW5hcnkgKi8KKworICBhcmd2WzBdID0gIi90aGlzL2RvZXMvbm90L2V4aXN0LzMyNTQyc2RnYWZnYWZkZyI7CisgIGlmIChfZGJ1c19zcGF3bl9hc3luY193aXRoX2JhYnlzaXR0ZXIgKCZzaXR0ZXIsIGFyZ3YsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfYmFieXNpdHRlcl9ibG9ja19mb3JfY2hpbGRfZXhpdCAoc2l0dGVyKTsKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfc2V0X2NoaWxkX2V4aXRfZXJyb3IgKHNpdHRlciwgJmVycm9yKTsKKyAgICB9CisKKyAgaWYgKHNpdHRlcikKKyAgICBfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChzaXR0ZXIpOworCisgIGlmICghZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgZ2V0IGFuIGVycm9yIGxhdW5jaGluZyBub25leGlzdGVudCBleGVjdXRhYmxlXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCEoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkgfHwKKyAgICAgICAgZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0VYRUNfRkFJTEVEKSkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk5vdCBleHBlY3RpbmcgZXJyb3Igd2hlbiBsYXVuY2hpbmcgbm9uZXhpc3RlbnQgZXhlY3V0YWJsZTogJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19zcGF3bl9zZWdmYXVsdCAodm9pZCAqZGF0YSkKK3sKKyAgY2hhciAqYXJndls0XSA9IHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9OworICBEQnVzQmFieXNpdHRlciAqc2l0dGVyOworICBEQnVzRXJyb3IgZXJyb3I7CisgIERCdXNTdHJpbmcgYXJndjA7CisKKyAgc2l0dGVyID0gTlVMTDsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgLyoqKiBUZXN0IGxhdW5jaGluZyBzZWdmYXVsdCBiaW5hcnkgKi8KKworICBhcmd2WzBdID0gZ2V0X3Rlc3RfZXhlYyAoInRlc3Qtc2VnZmF1bHQiLCAmYXJndjApOworCisgIGlmIChhcmd2WzBdID09IE5VTEwpCisgICAgeworICAgICAgLyogT09NIHdhcyBzaW11bGF0ZWQsIG5ldmVyIG1pbmQgKi8KKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoX2RidXNfc3Bhd25fYXN5bmNfd2l0aF9iYWJ5c2l0dGVyICgmc2l0dGVyLCBhcmd2LCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfYmxvY2tfZm9yX2NoaWxkX2V4aXQgKHNpdHRlcik7CisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX3NldF9jaGlsZF9leGl0X2Vycm9yIChzaXR0ZXIsICZlcnJvcik7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlICgmYXJndjApOworCisgIGlmIChzaXR0ZXIpCisgICAgX2RidXNfYmFieXNpdHRlcl91bnJlZiAoc2l0dGVyKTsKKworICBpZiAoIWRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGdldCBhbiBlcnJvciBsYXVuY2hpbmcgc2VnZmF1bHRpbmcgYmluYXJ5XG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCEoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkgfHwKKyAgICAgICAgZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX0VYSVRFRCkpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJOb3QgZXhwZWN0aW5nIGVycm9yIHdoZW4gbGF1bmNoaW5nIHNlZ2ZhdWx0aW5nIGV4ZWN1dGFibGU6ICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfc3Bhd25fZXhpdCAodm9pZCAqZGF0YSkKK3sKKyAgY2hhciAqYXJndls0XSA9IHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9OworICBEQnVzQmFieXNpdHRlciAqc2l0dGVyOworICBEQnVzRXJyb3IgZXJyb3I7CisgIERCdXNTdHJpbmcgYXJndjA7CisKKyAgc2l0dGVyID0gTlVMTDsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgLyoqKiBUZXN0IGxhdW5jaGluZyBleGl0IGZhaWx1cmUgYmluYXJ5ICovCisKKyAgYXJndlswXSA9IGdldF90ZXN0X2V4ZWMgKCJ0ZXN0LWV4aXQiLCAmYXJndjApOworCisgIGlmIChhcmd2WzBdID09IE5VTEwpCisgICAgeworICAgICAgLyogT09NIHdhcyBzaW11bGF0ZWQsIG5ldmVyIG1pbmQgKi8KKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoX2RidXNfc3Bhd25fYXN5bmNfd2l0aF9iYWJ5c2l0dGVyICgmc2l0dGVyLCBhcmd2LCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfYmxvY2tfZm9yX2NoaWxkX2V4aXQgKHNpdHRlcik7CisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX3NldF9jaGlsZF9leGl0X2Vycm9yIChzaXR0ZXIsICZlcnJvcik7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlICgmYXJndjApOworCisgIGlmIChzaXR0ZXIpCisgICAgX2RidXNfYmFieXNpdHRlcl91bnJlZiAoc2l0dGVyKTsKKworICBpZiAoIWRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGdldCBhbiBlcnJvciBsYXVuY2hpbmcgYmluYXJ5IHRoYXQgZXhpdGVkIHdpdGggZmFpbHVyZSBjb2RlXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCEoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkgfHwKKyAgICAgICAgZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX0VYSVRFRCkpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJOb3QgZXhwZWN0aW5nIGVycm9yIHdoZW4gbGF1bmNoaW5nIGV4aXRpbmcgZXhlY3V0YWJsZTogJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19zcGF3bl9hbmRfa2lsbCAodm9pZCAqZGF0YSkKK3sKKyAgY2hhciAqYXJndls0XSA9IHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9OworICBEQnVzQmFieXNpdHRlciAqc2l0dGVyOworICBEQnVzRXJyb3IgZXJyb3I7CisgIERCdXNTdHJpbmcgYXJndjA7CisKKyAgc2l0dGVyID0gTlVMTDsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgLyoqKiBUZXN0IGxhdW5jaGluZyBzbGVlcGluZyBiaW5hcnkgdGhlbiBraWxsaW5nIGl0ICovCisKKyAgYXJndlswXSA9IGdldF90ZXN0X2V4ZWMgKCJ0ZXN0LXNsZWVwLWZvcmV2ZXIiLCAmYXJndjApOworCisgIGlmIChhcmd2WzBdID09IE5VTEwpCisgICAgeworICAgICAgLyogT09NIHdhcyBzaW11bGF0ZWQsIG5ldmVyIG1pbmQgKi8KKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoX2RidXNfc3Bhd25fYXN5bmNfd2l0aF9iYWJ5c2l0dGVyICgmc2l0dGVyLCBhcmd2LCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfa2lsbF9jaGlsZCAoc2l0dGVyKTsKKworICAgICAgX2RidXNfYmFieXNpdHRlcl9ibG9ja19mb3JfY2hpbGRfZXhpdCAoc2l0dGVyKTsKKworICAgICAgX2RidXNfYmFieXNpdHRlcl9zZXRfY2hpbGRfZXhpdF9lcnJvciAoc2l0dGVyLCAmZXJyb3IpOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFyZ3YwKTsKKworICBpZiAoc2l0dGVyKQorICAgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKHNpdHRlcik7CisKKyAgaWYgKCFkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgYW4gZXJyb3IgYWZ0ZXIga2lsbGluZyBzcGF3bmVkIGJpbmFyeVxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpIHx8CisgICAgICAgIGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9TUEFXTl9DSElMRF9FWElURUQpKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTm90IGV4cGVjdGluZyBlcnJvciB3aGVuIGtpbGxpbmcgZXhlY3V0YWJsZTogJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX3NwYXduX3Rlc3QgKGNvbnN0IGNoYXIgKnRlc3RfZGF0YV9kaXIpCit7CisgIGlmICghX2RidXNfdGVzdF9vb21faGFuZGxpbmcgKCJzcGF3bl9ub25leGlzdGVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3NwYXduX25vbmV4aXN0ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogRG9uJ3QgcnVuIHRoZSBvYm5veGlvdXMgc2VnZmF1bHQgdGVzdCBieSBkZWZhdWx0LAorICAgKiBpdCdzIGEgcGFpbiB0byBoYXZlIHRvIGNsaWNrIGFsbCB0aG9zZSBlcnJvciBib3hlcy4KKyAgICovCisgIGlmIChnZXRlbnYgKCJET19TRUdGQVVMVF9URVNUIikpCisgICAgaWYgKCFfZGJ1c190ZXN0X29vbV9oYW5kbGluZyAoInNwYXduX3NlZ2ZhdWx0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19zcGF3bl9zZWdmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nICgic3Bhd25fZXhpdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3NwYXduX2V4aXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nICgic3Bhd25fYW5kX2tpbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19zcGF3bl9hbmRfa2lsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1zcGF3bi5jIGIvZGJ1cy9kYnVzL2RidXMtc3Bhd24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjAwODAxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtc3Bhd24uYwpAQCAtMCwwICsxLDE1NzkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zcGF3bi5jIFdyYXBwZXIgYXJvdW5kIGZvcmsvZXhlYworICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlICJkYnVzLXNwYXduLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLXVuaXguaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgImRidXMtcHJvdG9jb2wuaCIKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZmRlZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisKK2V4dGVybiBjaGFyICoqZW52aXJvbjsKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzSW50ZXJuYWxzVXRpbHMKKyAqIEB7CisgKi8KKworLyoKKyAqIEknbSBwcmV0dHkgc3VyZSB0aGlzIHdob2xlIHNwYXduIGZpbGUgY291bGQgYmUgbWFkZSBzaW1wbGVyLAorICogaWYgeW91IHRob3VnaHQgYWJvdXQgaXQgYSBiaXQuCisgKi8KKworLyoqCisgKiBFbnVtZXJhdGlvbiBmb3Igc3RhdHVzIG9mIGEgcmVhZCgpCisgKi8KK3R5cGVkZWYgZW51bQoreworICBSRUFEX1NUQVRVU19PSywgICAgLyoqPCBSZWFkIHN1Y2NlZWRlZCAqLworICBSRUFEX1NUQVRVU19FUlJPUiwgLyoqPCBTb21lIGtpbmQgb2YgZXJyb3IgKi8KKyAgUkVBRF9TVEFUVVNfRU9GICAgIC8qKjwgRU9GIHJldHVybmVkICovCit9IFJlYWRTdGF0dXM7CisKK3N0YXRpYyBSZWFkU3RhdHVzCityZWFkX2ludHMgKGludCAgICAgICAgZmQsCisJICAgaW50ICAgICAgICpidWYsCisJICAgaW50ICAgICAgICBuX2ludHNfaW5fYnVmLAorCSAgIGludCAgICAgICAqbl9pbnRzX3JlYWQsCisJICAgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgc2l6ZV90IGJ5dGVzID0gMDsgICAgCisgIFJlYWRTdGF0dXMgcmV0dmFsOworICAKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgcmV0dmFsID0gUkVBRF9TVEFUVVNfT0s7CisgIAorICB3aGlsZSAoVFJVRSkKKyAgICB7CisgICAgICBzc2l6ZV90IGNodW5rOworICAgICAgc2l6ZV90IHRvX3JlYWQ7CisKKyAgICAgIHRvX3JlYWQgPSBzaXplb2YgKGludCkgKiBuX2ludHNfaW5fYnVmIC0gYnl0ZXM7CisKKyAgICAgIGlmICh0b19yZWFkID09IDApCisgICAgICAgIGJyZWFrOworCisgICAgYWdhaW46CisgICAgICAKKyAgICAgIGNodW5rID0gcmVhZCAoZmQsCisgICAgICAgICAgICAgICAgICAgICgoY2hhciopYnVmKSArIGJ5dGVzLAorICAgICAgICAgICAgICAgICAgICB0b19yZWFkKTsKKyAgICAgIAorICAgICAgaWYgKGNodW5rIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgICAgICAKKyAgICAgIGlmIChjaHVuayA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisJCQkgIERCVVNfRVJST1JfU1BBV05fRkFJTEVELAorCQkJICAiRmFpbGVkIHRvIHJlYWQgZnJvbSBjaGlsZCBwaXBlICglcykiLAorCQkJICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKworICAgICAgICAgIHJldHZhbCA9IFJFQURfU1RBVFVTX0VSUk9SOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChjaHVuayA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgcmV0dmFsID0gUkVBRF9TVEFUVVNfRU9GOworICAgICAgICAgIGJyZWFrOyAvKiBFT0YgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSAvKiBjaHVuayA+IDAgKi8KKwlieXRlcyArPSBjaHVuazsKKyAgICB9CisKKyAgKm5faW50c19yZWFkID0gKGludCkoYnl0ZXMgLyBzaXplb2YoaW50KSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIFJlYWRTdGF0dXMKK3JlYWRfcGlkIChpbnQgICAgICAgIGZkLAorICAgICAgICAgIHBpZF90ICAgICAqYnVmLAorICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpCit7CisgIHNpemVfdCBieXRlcyA9IDA7ICAgIAorICBSZWFkU3RhdHVzIHJldHZhbDsKKyAgCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHJldHZhbCA9IFJFQURfU1RBVFVTX09LOworICAKKyAgd2hpbGUgKFRSVUUpCisgICAgeworICAgICAgc3NpemVfdCBjaHVuazsKKyAgICAgIHNpemVfdCB0b19yZWFkOworCisgICAgICB0b19yZWFkID0gc2l6ZW9mIChwaWRfdCkgLSBieXRlczsKKworICAgICAgaWYgKHRvX3JlYWQgPT0gMCkKKyAgICAgICAgYnJlYWs7CisKKyAgICBhZ2FpbjoKKyAgICAgIAorICAgICAgY2h1bmsgPSByZWFkIChmZCwKKyAgICAgICAgICAgICAgICAgICAgKChjaGFyKilidWYpICsgYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgIHRvX3JlYWQpOworICAgICAgaWYgKGNodW5rIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgICAgICAKKyAgICAgIGlmIChjaHVuayA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisJCQkgIERCVVNfRVJST1JfU1BBV05fRkFJTEVELAorCQkJICAiRmFpbGVkIHRvIHJlYWQgZnJvbSBjaGlsZCBwaXBlICglcykiLAorCQkJICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKworICAgICAgICAgIHJldHZhbCA9IFJFQURfU1RBVFVTX0VSUk9SOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChjaHVuayA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgcmV0dmFsID0gUkVBRF9TVEFUVVNfRU9GOworICAgICAgICAgIGJyZWFrOyAvKiBFT0YgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSAvKiBjaHVuayA+IDAgKi8KKwlieXRlcyArPSBjaHVuazsKKyAgICB9CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgYW4gaW50ZXJtZWRpYXRlIGNoaWxkIGJldHdlZW4gdGhlIG1haW4gcHJvY2VzcworICogYW5kIHRoZSBncmFuZGNoaWxkLiBUaGUgZ3JhbmRjaGlsZCBpcyBvdXIgc3Bhd25lZCBwcm9jZXNzLiBUaGUgaW50ZXJtZWRpYXRlCisgKiBjaGlsZCBpcyBhIGJhYnlzaXR0ZXIgcHJvY2VzczsgaXQga2VlcHMgdHJhY2sgb2Ygd2hlbiB0aGUgZ3JhbmRjaGlsZAorICogZXhpdHMvY3Jhc2hlcywgYW5kIHJlYXBzIHRoZSBncmFuZGNoaWxkLgorICovCisKKy8qIE1lc3NhZ2VzIGZyb20gY2hpbGRyZW4gdG8gcGFyZW50cyAqLworZW51bQoreworICBDSElMRF9FWElURUQsICAgICAgICAgICAgLyogVGhpcyBtZXNzYWdlIGlzIGZvbGxvd2VkIGJ5IHRoZSBleGl0IHN0YXR1cyBpbnQgKi8KKyAgQ0hJTERfRk9SS19GQUlMRUQsICAgICAgIC8qIEZvbGxvd2VkIGJ5IGVycm5vICovCisgIENISUxEX0VYRUNfRkFJTEVELCAgICAgICAvKiBGb2xsb3dlZCBieSBlcnJubyAqLworICBDSElMRF9QSUQgICAgICAgICAgICAgICAgLyogRm9sbG93ZWQgYnkgcGlkX3QgKi8KK307CisKKy8qKgorICogQmFieXNpdHRlciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKi8KK3N0cnVjdCBEQnVzQmFieXNpdHRlcgoreworICBpbnQgcmVmY291bnQ7IC8qKjwgUmVmZXJlbmNlIGNvdW50ICovCisKKyAgY2hhciAqZXhlY3V0YWJsZTsgLyoqPCBleGVjdXRhYmxlIG5hbWUgdG8gdXNlIGluIGVycm9yIG1lc3NhZ2VzICovCisgIAorICBpbnQgc29ja2V0X3RvX2JhYnlzaXR0ZXI7IC8qKjwgQ29ubmVjdGlvbiB0byB0aGUgYmFieXNpdHRlciBwcm9jZXNzICovCisgIGludCBlcnJvcl9waXBlX2Zyb21fY2hpbGQ7IC8qKjwgQ29ubmVjdGlvbiB0byB0aGUgcHJvY2VzcyB0aGF0IGRvZXMgdGhlIGV4ZWMoKSAqLworICAKKyAgcGlkX3Qgc2l0dGVyX3BpZDsgIC8qKjwgUElEIE9mIHRoZSBiYWJ5c2l0dGVyICovCisgIHBpZF90IGdyYW5kY2hpbGRfcGlkOyAvKio8IFBJRCBvZiB0aGUgZ3JhbmRjaGlsZCAqLworCisgIERCdXNXYXRjaExpc3QgKndhdGNoZXM7IC8qKjwgV2F0Y2hlcyAqLworCisgIERCdXNXYXRjaCAqZXJyb3Jfd2F0Y2g7IC8qKjwgRXJyb3IgcGlwZSB3YXRjaCAqLworICBEQnVzV2F0Y2ggKnNpdHRlcl93YXRjaDsgLyoqPCBTaXR0ZXIgcGlwZSB3YXRjaCAqLworCisgIERCdXNCYWJ5c2l0dGVyRmluaXNoZWRGdW5jIGZpbmlzaGVkX2NiOworICB2b2lkICpmaW5pc2hlZF9kYXRhOworCisgIGludCBlcnJudW07IC8qKjwgRXJyb3IgbnVtYmVyICovCisgIGludCBzdGF0dXM7IC8qKjwgRXhpdCBzdGF0dXMgY29kZSAqLworICB1bnNpZ25lZCBpbnQgaGF2ZV9jaGlsZF9zdGF0dXMgOiAxOyAvKio8IFRydWUgaWYgY2hpbGQgc3RhdHVzIGhhcyBiZWVuIHJlYXBlZCAqLworICB1bnNpZ25lZCBpbnQgaGF2ZV9mb3JrX2Vycm51bSA6IDE7IC8qKjwgVHJ1ZSBpZiB3ZSBoYXZlIGFuIGVycm9yIGNvZGUgZnJvbSBmb3JrKCkgKi8KKyAgdW5zaWduZWQgaW50IGhhdmVfZXhlY19lcnJudW0gOiAxOyAvKio8IFRydWUgaWYgd2UgaGF2ZSBhbiBlcnJvciBjb2RlIGZyb20gZXhlYygpICovCit9OworCitzdGF0aWMgREJ1c0JhYnlzaXR0ZXIqCitfZGJ1c19iYWJ5c2l0dGVyX25ldyAodm9pZCkKK3sKKyAgREJ1c0JhYnlzaXR0ZXIgKnNpdHRlcjsKKworICBzaXR0ZXIgPSBkYnVzX25ldzAgKERCdXNCYWJ5c2l0dGVyLCAxKTsKKyAgaWYgKHNpdHRlciA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHNpdHRlci0+cmVmY291bnQgPSAxOworCisgIHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIgPSAtMTsKKyAgc2l0dGVyLT5lcnJvcl9waXBlX2Zyb21fY2hpbGQgPSAtMTsKKyAgCisgIHNpdHRlci0+c2l0dGVyX3BpZCA9IC0xOworICBzaXR0ZXItPmdyYW5kY2hpbGRfcGlkID0gLTE7CisKKyAgc2l0dGVyLT53YXRjaGVzID0gX2RidXNfd2F0Y2hfbGlzdF9uZXcgKCk7CisgIGlmIChzaXR0ZXItPndhdGNoZXMgPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZDsKKyAgCisgIHJldHVybiBzaXR0ZXI7CisKKyBmYWlsZWQ6CisgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKHNpdHRlcik7CisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIEluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIHRoZSBiYWJ5c2l0dGVyIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gc2l0dGVyIHRoZSBiYWJ5c2l0dGVyCisgKiBAcmV0dXJucyB0aGUgYmFieXNpdHRlcgorICovCitEQnVzQmFieXNpdHRlciAqCitfZGJ1c19iYWJ5c2l0dGVyX3JlZiAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlcikKK3sKKyAgX2RidXNfYXNzZXJ0IChzaXR0ZXIgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoc2l0dGVyLT5yZWZjb3VudCA+IDApOworICAKKyAgc2l0dGVyLT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiBzaXR0ZXI7Cit9CisKK3N0YXRpYyB2b2lkIGNsb3NlX3NvY2tldF90b19iYWJ5c2l0dGVyICAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlcik7CitzdGF0aWMgdm9pZCBjbG9zZV9lcnJvcl9waXBlX2Zyb21fY2hpbGQgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIpOworCisvKioKKyAqIERlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIHRoZSBiYWJ5c2l0dGVyIG9iamVjdC4KKyAqIFdoZW4gdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgYmFieXNpdHRlciBvYmplY3QgcmVhY2hlcworICogemVybywgdGhlIGJhYnlzaXR0ZXIgaXMga2lsbGVkIGFuZCB0aGUgY2hpbGQgdGhhdCB3YXMgYmVpbmcKKyAqIGJhYnlzYXQgZ2V0cyBlbWFuY2lwYXRlZC4KKyAqCisgKiBAcGFyYW0gc2l0dGVyIHRoZSBiYWJ5c2l0dGVyCisgKi8KK3ZvaWQKK19kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIpCit7CisgIF9kYnVzX2Fzc2VydCAoc2l0dGVyICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHNpdHRlci0+cmVmY291bnQgPiAwKTsKKyAgCisgIHNpdHRlci0+cmVmY291bnQgLT0gMTsKKyAgaWYgKHNpdHRlci0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICAvKiBJZiB3ZSBoYXZlbid0IGZvcmtlZCBvdGhlciBiYWJ5c2l0dGVycworICAgICAgICogc2luY2UgdGhpcyBiYWJ5c2l0dGVyIGFuZCBzb2NrZXQgd2VyZQorICAgICAgICogY3JlYXRlZCB0aGVuIHRoaXMgY2xvc2Ugd2lsbCBjYXVzZSB0aGUKKyAgICAgICAqIGJhYnlzaXR0ZXIgdG8gd2FrZSB1cCBmcm9tIHBvbGwgd2l0aAorICAgICAgICogYSBoYW5ndXAgYW5kIHRoZW4gdGhlIGJhYnlzaXR0ZXIgd2lsbAorICAgICAgICogcXVpdCBpdHNlbGYuCisgICAgICAgKi8KKyAgICAgIGNsb3NlX3NvY2tldF90b19iYWJ5c2l0dGVyIChzaXR0ZXIpOworCisgICAgICBjbG9zZV9lcnJvcl9waXBlX2Zyb21fY2hpbGQgKHNpdHRlcik7CisKKyAgICAgIGlmIChzaXR0ZXItPnNpdHRlcl9waWQgPiAwKQorICAgICAgICB7CisgICAgICAgICAgaW50IHN0YXR1czsKKyAgICAgICAgICBpbnQgcmV0OworCisgICAgICAgICAgLyogSXQncyBwb3NzaWJsZSB0aGUgYmFieXNpdHRlciBkaWVkIG9uIGl0cyBvd24gYWJvdmUgCisgICAgICAgICAgICogZnJvbSB0aGUgY2xvc2UsIG9yIHdhcyBraWxsZWQgcmFuZG9tbHkKKyAgICAgICAgICAgKiBieSBzb21lIG90aGVyIHByb2Nlc3MsIHNvIGZpcnN0IHRyeSB0byByZWFwIGl0CisgICAgICAgICAgICovCisgICAgICAgICAgcmV0ID0gd2FpdHBpZCAoc2l0dGVyLT5zaXR0ZXJfcGlkLCAmc3RhdHVzLCBXTk9IQU5HKTsKKworICAgICAgICAgIC8qIElmIHdlIGNvdWxkbid0IHJlYXAgdGhlIGNoaWxkIHRoZW4ga2lsbCBpdCwgYW5kCisgICAgICAgICAgICogdHJ5IGFnYWluCisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKHJldCA9PSAwKQorICAgICAgICAgICAga2lsbCAoc2l0dGVyLT5zaXR0ZXJfcGlkLCBTSUdLSUxMKTsKKworICAgICAgICBhZ2FpbjoKKyAgICAgICAgICBpZiAocmV0ID09IDApCisgICAgICAgICAgICByZXQgPSB3YWl0cGlkIChzaXR0ZXItPnNpdHRlcl9waWQsICZzdGF0dXMsIDApOworCisgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKKyAgICAgICAgICAgICAgICBnb3RvIGFnYWluOworICAgICAgICAgICAgICBlbHNlIGlmIChlcnJubyA9PSBFQ0hJTEQpCisgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIkJhYnlzaXR0ZXIgcHJvY2VzcyBub3QgYXZhaWxhYmxlIHRvIGJlIHJlYXBlZDsgc2hvdWxkIG5vdCBoYXBwZW5cbiIpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIlVuZXhwZWN0ZWQgZXJyb3IgJWQgaW4gd2FpdHBpZCgpIGZvciBiYWJ5c2l0dGVyOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJubywgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiUmVhcGVkICVsZCwgd2FpdGluZyBmb3IgYmFieXNpdHRlciAlbGRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSByZXQsIChsb25nKSBzaXR0ZXItPnNpdHRlcl9waWQpOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgaWYgKFdJRkVYSVRFRCAoc2l0dGVyLT5zdGF0dXMpKQorICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJCYWJ5c2l0dGVyIGV4aXRlZCB3aXRoIHN0YXR1cyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRVhJVFNUQVRVUyAoc2l0dGVyLT5zdGF0dXMpKTsKKyAgICAgICAgICAgICAgZWxzZSBpZiAoV0lGU0lHTkFMRUQgKHNpdHRlci0+c3RhdHVzKSkKKyAgICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiQmFieXNpdHRlciByZWNlaXZlZCBzaWduYWwgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1RFUk1TSUcgKHNpdHRlci0+c3RhdHVzKSk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiQmFieXNpdHRlciBleGl0ZWQgYWJub3JtYWxseVxuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBzaXR0ZXItPnNpdHRlcl9waWQgPSAtMTsKKyAgICAgICAgfQorCisgICAgICBpZiAoc2l0dGVyLT53YXRjaGVzKQorICAgICAgICBfZGJ1c193YXRjaF9saXN0X2ZyZWUgKHNpdHRlci0+d2F0Y2hlcyk7CisKKyAgICAgIGRidXNfZnJlZSAoc2l0dGVyLT5leGVjdXRhYmxlKTsKKyAgICAgIAorICAgICAgZGJ1c19mcmVlIChzaXR0ZXIpOworICAgIH0KK30KKworc3RhdGljIFJlYWRTdGF0dXMKK3JlYWRfZGF0YSAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciwKKyAgICAgICAgICAgaW50ICAgICAgICAgICAgIGZkKQoreworICBpbnQgd2hhdDsKKyAgaW50IGdvdDsKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworICBSZWFkU3RhdHVzIHI7CisKKyAgciA9IHJlYWRfaW50cyAoZmQsICZ3aGF0LCAxLCAmZ290LCAmZXJyb3IpOworCisgIHN3aXRjaCAocikKKyAgICB7CisgICAgY2FzZSBSRUFEX1NUQVRVU19FUlJPUjoKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gcmVhZCBkYXRhIGZyb20gZmQgJWQ6ICVzXG4iLCBmZCwgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICByZXR1cm4gcjsKKworICAgIGNhc2UgUkVBRF9TVEFUVVNfRU9GOgorICAgICAgcmV0dXJuIHI7CisKKyAgICBjYXNlIFJFQURfU1RBVFVTX09LOgorICAgICAgYnJlYWs7CisgICAgfQorICAKKyAgaWYgKGdvdCA9PSAxKQorICAgIHsKKyAgICAgIHN3aXRjaCAod2hhdCkKKyAgICAgICAgeworICAgICAgICBjYXNlIENISUxEX0VYSVRFRDoKKyAgICAgICAgY2FzZSBDSElMRF9GT1JLX0ZBSUxFRDoKKyAgICAgICAgY2FzZSBDSElMRF9FWEVDX0ZBSUxFRDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBpbnQgYXJnOworICAgICAgICAgICAgCisgICAgICAgICAgICByID0gcmVhZF9pbnRzIChmZCwgJmFyZywgMSwgJmdvdCwgJmVycm9yKTsKKworICAgICAgICAgICAgc3dpdGNoIChyKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgUkVBRF9TVEFUVVNfRVJST1I6CisgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byByZWFkIGFyZyBmcm9tIGZkICVkOiAlc1xuIiwgZmQsIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgICAgICAgY2FzZSBSRUFEX1NUQVRVU19FT0Y6CisgICAgICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgICAgICAgIGNhc2UgUkVBRF9TVEFUVVNfT0s6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGdvdCA9PSAxKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gQ0hJTERfRVhJVEVEKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzaXR0ZXItPmhhdmVfY2hpbGRfc3RhdHVzID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgc2l0dGVyLT5zdGF0dXMgPSBhcmc7CisgICAgICAgICAgICAgICAgICAgIHNpdHRlci0+ZXJybnVtID0gMDsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInJlY29yZGVkIGNoaWxkIHN0YXR1cyBleGl0ZWQgPSAlZCBzaWduYWxlZCA9ICVkIGV4aXRzdGF0dXMgPSAlZCB0ZXJtc2lnID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJRkVYSVRFRCAoc2l0dGVyLT5zdGF0dXMpLCBXSUZTSUdOQUxFRCAoc2l0dGVyLT5zdGF0dXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRVhJVFNUQVRVUyAoc2l0dGVyLT5zdGF0dXMpLCBXVEVSTVNJRyAoc2l0dGVyLT5zdGF0dXMpKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICh3aGF0ID09IENISUxEX0ZPUktfRkFJTEVEKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzaXR0ZXItPmhhdmVfZm9ya19lcnJudW0gPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBzaXR0ZXItPmVycm51bSA9IGFyZzsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInJlY29yZGVkIGZvcmsgZXJybnVtICVkXG4iLCBzaXR0ZXItPmVycm51bSk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAod2hhdCA9PSBDSElMRF9FWEVDX0ZBSUxFRCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2l0dGVyLT5oYXZlX2V4ZWNfZXJybnVtID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgc2l0dGVyLT5lcnJudW0gPSBhcmc7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJyZWNvcmRlZCBleGVjIGVycm51bSAlZFxuIiwgc2l0dGVyLT5lcnJudW0pOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENISUxEX1BJRDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBwaWRfdCBwaWQgPSAtMTsKKworICAgICAgICAgICAgciA9IHJlYWRfcGlkIChmZCwgJnBpZCwgJmVycm9yKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgc3dpdGNoIChyKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgUkVBRF9TVEFUVVNfRVJST1I6CisgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byByZWFkIFBJRCBmcm9tIGZkICVkOiAlc1xuIiwgZmQsIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgICAgICAgY2FzZSBSRUFEX1NUQVRVU19FT0Y6CisgICAgICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgICAgICAgIGNhc2UgUkVBRF9TVEFUVVNfT0s6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgc2l0dGVyLT5ncmFuZGNoaWxkX3BpZCA9IHBpZDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInJlY29yZGVkIGdyYW5kY2hpbGQgcGlkICVkXG4iLCBzaXR0ZXItPmdyYW5kY2hpbGRfcGlkKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgX2RidXNfd2FybiAoIlVua25vd24gbWVzc2FnZSByZWNlaXZlZCBmcm9tIGJhYnlzaXR0ZXIgcHJvY2Vzc1xuIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkCitjbG9zZV9zb2NrZXRfdG9fYmFieXNpdHRlciAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlcikKK3sKKyAgX2RidXNfdmVyYm9zZSAoIkNsb3NpbmcgYmFieXNpdHRlclxuIik7CisKKyAgaWYgKHNpdHRlci0+c2l0dGVyX3dhdGNoICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChzaXR0ZXItPndhdGNoZXMgIT0gTlVMTCk7CisgICAgICBfZGJ1c193YXRjaF9saXN0X3JlbW92ZV93YXRjaCAoc2l0dGVyLT53YXRjaGVzLCAgc2l0dGVyLT5zaXR0ZXJfd2F0Y2gpOworICAgICAgX2RidXNfd2F0Y2hfaW52YWxpZGF0ZSAoc2l0dGVyLT5zaXR0ZXJfd2F0Y2gpOworICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgKHNpdHRlci0+c2l0dGVyX3dhdGNoKTsKKyAgICAgIHNpdHRlci0+c2l0dGVyX3dhdGNoID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIgPj0gMCkKKyAgICB7CisgICAgICBfZGJ1c19jbG9zZV9zb2NrZXQgKHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIsIE5VTEwpOworICAgICAgc2l0dGVyLT5zb2NrZXRfdG9fYmFieXNpdHRlciA9IC0xOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2Nsb3NlX2Vycm9yX3BpcGVfZnJvbV9jaGlsZCAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlcikKK3sKKyAgX2RidXNfdmVyYm9zZSAoIkNsb3NpbmcgY2hpbGQgZXJyb3JcbiIpOworCisgIGlmIChzaXR0ZXItPmVycm9yX3dhdGNoICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChzaXR0ZXItPndhdGNoZXMgIT0gTlVMTCk7CisgICAgICBfZGJ1c193YXRjaF9saXN0X3JlbW92ZV93YXRjaCAoc2l0dGVyLT53YXRjaGVzLCAgc2l0dGVyLT5lcnJvcl93YXRjaCk7CisgICAgICBfZGJ1c193YXRjaF9pbnZhbGlkYXRlIChzaXR0ZXItPmVycm9yX3dhdGNoKTsKKyAgICAgIF9kYnVzX3dhdGNoX3VucmVmIChzaXR0ZXItPmVycm9yX3dhdGNoKTsKKyAgICAgIHNpdHRlci0+ZXJyb3Jfd2F0Y2ggPSBOVUxMOworICAgIH0KKworICBpZiAoc2l0dGVyLT5lcnJvcl9waXBlX2Zyb21fY2hpbGQgPj0gMCkKKyAgICB7CisgICAgICBfZGJ1c19jbG9zZV9zb2NrZXQgKHNpdHRlci0+ZXJyb3JfcGlwZV9mcm9tX2NoaWxkLCBOVUxMKTsKKyAgICAgIHNpdHRlci0+ZXJyb3JfcGlwZV9mcm9tX2NoaWxkID0gLTE7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX2JhYnlzaXR0ZXJfc29ja2V0IChEQnVzQmFieXNpdHRlciAqc2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgcmV2ZW50cykKK3sKKyAgLyogRXZlbiBpZiB3ZSBoYXZlIFBPTExIVVAsIHdlIHdhbnQgdG8ga2VlcCByZWFkaW5nCisgICAqIGRhdGEgdW50aWwgUE9MTElOIGdvZXMgYXdheTsgc28gdGhpcyBmdW5jdGlvbiBvbmx5CisgICAqIGxvb2tzIGF0IEhVUC9FUlIgaWYgbm8gSU4gaXMgc2V0LgorICAgKi8KKyAgaWYgKHJldmVudHMgJiBfREJVU19QT0xMSU4pCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIlJlYWRpbmcgZGF0YSBmcm9tIGJhYnlzaXR0ZXJcbiIpOworICAgICAgaWYgKHJlYWRfZGF0YSAoc2l0dGVyLCBzaXR0ZXItPnNvY2tldF90b19iYWJ5c2l0dGVyKSAhPSBSRUFEX1NUQVRVU19PSykKKyAgICAgICAgY2xvc2Vfc29ja2V0X3RvX2JhYnlzaXR0ZXIgKHNpdHRlcik7CisgICAgfQorICBlbHNlIGlmIChyZXZlbnRzICYgKF9EQlVTX1BPTExFUlIgfCBfREJVU19QT0xMSFVQKSkKKyAgICB7CisgICAgICBjbG9zZV9zb2NrZXRfdG9fYmFieXNpdHRlciAoc2l0dGVyKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfZXJyb3JfcGlwZSAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgcmV2ZW50cykKK3sKKyAgaWYgKHJldmVudHMgJiBfREJVU19QT0xMSU4pCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIlJlYWRpbmcgZGF0YSBmcm9tIGNoaWxkIGVycm9yXG4iKTsKKyAgICAgIGlmIChyZWFkX2RhdGEgKHNpdHRlciwgc2l0dGVyLT5lcnJvcl9waXBlX2Zyb21fY2hpbGQpICE9IFJFQURfU1RBVFVTX09LKQorICAgICAgICBjbG9zZV9lcnJvcl9waXBlX2Zyb21fY2hpbGQgKHNpdHRlcik7CisgICAgfQorICBlbHNlIGlmIChyZXZlbnRzICYgKF9EQlVTX1BPTExFUlIgfCBfREJVU19QT0xMSFVQKSkKKyAgICB7CisgICAgICBjbG9zZV9lcnJvcl9waXBlX2Zyb21fY2hpbGQgKHNpdHRlcik7CisgICAgfQorfQorCisvKiByZXR1cm5zIHdoZXRoZXIgdGhlcmUgd2VyZSBhbnkgcG9sbCBldmVudHMgaGFuZGxlZCAqLworc3RhdGljIGRidXNfYm9vbF90CitiYWJ5c2l0dGVyX2l0ZXJhdGlvbiAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgYmxvY2spCit7CisgIERCdXNQb2xsRkQgZmRzWzJdOworICBpbnQgaTsKKyAgZGJ1c19ib29sX3QgZGVzY3JpcHRvcnNfcmVhZHk7CisKKyAgZGVzY3JpcHRvcnNfcmVhZHkgPSBGQUxTRTsKKyAgCisgIGkgPSAwOworCisgIGlmIChzaXR0ZXItPmVycm9yX3BpcGVfZnJvbV9jaGlsZCA+PSAwKQorICAgIHsKKyAgICAgIGZkc1tpXS5mZCA9IHNpdHRlci0+ZXJyb3JfcGlwZV9mcm9tX2NoaWxkOworICAgICAgZmRzW2ldLmV2ZW50cyA9IF9EQlVTX1BPTExJTjsKKyAgICAgIGZkc1tpXS5yZXZlbnRzID0gMDsKKyAgICAgICsraTsKKyAgICB9CisgIAorICBpZiAoc2l0dGVyLT5zb2NrZXRfdG9fYmFieXNpdHRlciA+PSAwKQorICAgIHsKKyAgICAgIGZkc1tpXS5mZCA9IHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXI7CisgICAgICBmZHNbaV0uZXZlbnRzID0gX0RCVVNfUE9MTElOOworICAgICAgZmRzW2ldLnJldmVudHMgPSAwOworICAgICAgKytpOworICAgIH0KKworICBpZiAoaSA+IDApCisgICAgeworICAgICAgaW50IHJldDsKKworICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgIHJldCA9IF9kYnVzX3BvbGwgKGZkcywgaSwgMCk7CisgICAgICAgIH0KKyAgICAgIHdoaWxlIChyZXQgPCAwICYmIGVycm5vID09IEVJTlRSKTsKKworICAgICAgaWYgKHJldCA9PSAwICYmIGJsb2NrKQorICAgICAgICB7CisgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmV0ID0gX2RidXNfcG9sbCAoZmRzLCBpLCAtMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgd2hpbGUgKHJldCA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworICAgICAgICB9CisKKyAgICAgIGlmIChyZXQgPiAwKQorICAgICAgICB7CisgICAgICAgICAgZGVzY3JpcHRvcnNfcmVhZHkgPSBUUlVFOworICAgICAgICAgIAorICAgICAgICAgIHdoaWxlIChpID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLS1pOworICAgICAgICAgICAgICBpZiAoZmRzW2ldLmZkID09IHNpdHRlci0+ZXJyb3JfcGlwZV9mcm9tX2NoaWxkKQorICAgICAgICAgICAgICAgIGhhbmRsZV9lcnJvcl9waXBlIChzaXR0ZXIsIGZkc1tpXS5yZXZlbnRzKTsKKyAgICAgICAgICAgICAgZWxzZSBpZiAoZmRzW2ldLmZkID09IHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIpCisgICAgICAgICAgICAgICAgaGFuZGxlX2JhYnlzaXR0ZXJfc29ja2V0IChzaXR0ZXIsIGZkc1tpXS5yZXZlbnRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gZGVzY3JpcHRvcnNfcmVhZHk7Cit9CisKKy8qKgorICogTWFjcm8gcmV0dXJucyAjVFJVRSBpZiB0aGUgYmFieXNpdHRlciBzdGlsbCBoYXMgbGl2ZSBzb2NrZXRzIG9wZW4gdG8gdGhlCisgKiBiYWJ5c2l0dGVyIGNoaWxkIG9yIHRoZSBncmFuZGNoaWxkLgorICovCisjZGVmaW5lIExJVkVfQ0hJTERSRU4oc2l0dGVyKSAoKHNpdHRlciktPnNvY2tldF90b19iYWJ5c2l0dGVyID49IDAgfHwgKHNpdHRlciktPmVycm9yX3BpcGVfZnJvbV9jaGlsZCA+PSAwKQorCisvKioKKyAqIEJsb2NrcyB1bnRpbCB0aGUgYmFieXNpdHRlciBwcm9jZXNzIGdpdmVzIHVzIHRoZSBQSUQgb2YgdGhlIHNwYXduZWQgZ3JhbmRjaGlsZCwKKyAqIHRoZW4ga2lsbHMgdGhlIHNwYXduZWQgZ3JhbmRjaGlsZC4KKyAqCisgKiBAcGFyYW0gc2l0dGVyIHRoZSBiYWJ5c2l0dGVyIG9iamVjdAorICovCit2b2lkCitfZGJ1c19iYWJ5c2l0dGVyX2tpbGxfY2hpbGQgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIpCit7CisgIC8qIGJlIHN1cmUgd2UgaGF2ZSB0aGUgUElEIG9mIHRoZSBjaGlsZCAqLworICB3aGlsZSAoTElWRV9DSElMRFJFTiAoc2l0dGVyKSAmJgorICAgICAgICAgc2l0dGVyLT5ncmFuZGNoaWxkX3BpZCA9PSAtMSkKKyAgICBiYWJ5c2l0dGVyX2l0ZXJhdGlvbiAoc2l0dGVyLCBUUlVFKTsKKworICBfZGJ1c192ZXJib3NlICgiR290IGNoaWxkIFBJRCAlbGQgZm9yIGtpbGxpbmdcbiIsCisgICAgICAgICAgICAgICAgIChsb25nKSBzaXR0ZXItPmdyYW5kY2hpbGRfcGlkKTsKKyAgCisgIGlmIChzaXR0ZXItPmdyYW5kY2hpbGRfcGlkID09IC0xKQorICAgIHJldHVybjsgLyogY2hpbGQgaXMgYWxyZWFkeSBkZWFkLCBvciB3ZSdyZSBzbyBob3NlZCB3ZSdsbCBuZXZlciByZWNvdmVyICovCisKKyAga2lsbCAoc2l0dGVyLT5ncmFuZGNoaWxkX3BpZCwgU0lHS0lMTCk7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNoaWxkIGhhcyBleGl0ZWQsIHdpdGhvdXQgYmxvY2tpbmcuCisgKgorICogQHBhcmFtIHNpdHRlciB0aGUgYmFieXNpdHRlcgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdGVkIChEQnVzQmFieXNpdHRlciAqc2l0dGVyKQoreworCisgIC8qIEJlIHN1cmUgd2UncmUgdXAtdG8tZGF0ZSAqLworICB3aGlsZSAoTElWRV9DSElMRFJFTiAoc2l0dGVyKSAmJgorICAgICAgICAgYmFieXNpdHRlcl9pdGVyYXRpb24gKHNpdHRlciwgRkFMU0UpKQorICAgIDsKKworICAvKiBXZSB3aWxsIGhhdmUgZXhpdGVkIHRoZSBiYWJ5c2l0dGVyIHdoZW4gdGhlIGNoaWxkIGhhcyBleGl0ZWQgKi8KKyAgcmV0dXJuIHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIgPCAwOworfQorCisvKioKKyAqIEdldHMgdGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBjaGlsZC4gV2UgZG8gdGhpcyBzbyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYworICogZGV0YWlsIGlzIG5vdCBjbHV0dGVyaW5nIHVwIGRidXMsIGZvciBleGFtcGxlIHRoZSBzeXN0ZW0gbGF1bmNoZXIgY29kZS4KKyAqIFRoaXMgY2FuIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSBjaGlsZCBoYXMgZXhpdGVkLCBpLmUuIGNhbGwKKyAqIF9kYnVzX2JhYnlzaXR0ZXJfZ2V0X2NoaWxkX2V4aXRlZCgpLiBJdCByZXR1cm5zIEZBTFNFIGlmIHRoZSBjaGlsZAorICogZGlkIG5vdCByZXR1cm4gYSBzdGF0dXMgY29kZSwgZS5nLiBiZWNhdXNlIHRoZSBjaGlsZCB3YXMgc2lnbmFsZWQKKyAqIG9yIHdlIGZhaWxlZCB0byBldmVyIGxhdW5jaCB0aGUgY2hpbGQgaW4gdGhlIGZpcnN0IHBsYWNlLgorICoKKyAqIEBwYXJhbSBzaXR0ZXIgdGhlIGJhYnlzaXR0ZXIKKyAqIEBwYXJhbSBzdGF0dXMgdGhlIHJldHVybmVkIHN0YXR1cyBjb2RlCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdF9zdGF0dXMgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgKnN0YXR1cykKK3sKKyAgaWYgKCFfZGJ1c19iYWJ5c2l0dGVyX2dldF9jaGlsZF9leGl0ZWQgKHNpdHRlcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiQ2hpbGQgaGFzIG5vdCBleGl0ZWQiKTsKKyAgCisgIGlmICghc2l0dGVyLT5oYXZlX2NoaWxkX3N0YXR1cyB8fAorICAgICAgIShXSUZFWElURUQgKHNpdHRlci0+c3RhdHVzKSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgICpzdGF0dXMgPSBXRVhJVFNUQVRVUyAoc2l0dGVyLT5zdGF0dXMpOworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBTZXRzIHRoZSAjREJ1c0Vycm9yIHdpdGggYW4gZXhwbGFuYXRpb24gb2Ygd2h5IHRoZSBzcGF3bmVkCisgKiBjaGlsZCBwcm9jZXNzIGV4aXRlZCAob24gYSBzaWduYWwsIG9yIHdoYXRldmVyKS4gSWYKKyAqIHRoZSBjaGlsZCBwcm9jZXNzIGhhcyBub3QgZXhpdGVkLCBkb2VzIG5vdGhpbmcgKGVycm9yCisgKiB3aWxsIHJlbWFpbiB1bnNldCkuCisgKgorICogQHBhcmFtIHNpdHRlciB0aGUgYmFieXNpdHRlcgorICogQHBhcmFtIGVycm9yIGFuIGVycm9yIHRvIGZpbGwgaW4KKyAqLwordm9pZAorX2RidXNfYmFieXNpdHRlcl9zZXRfY2hpbGRfZXhpdF9lcnJvciAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgaWYgKCFfZGJ1c19iYWJ5c2l0dGVyX2dldF9jaGlsZF9leGl0ZWQgKHNpdHRlcikpCisgICAgcmV0dXJuOworCisgIC8qIE5vdGUgdGhhdCBpZiBleGVjIGZhaWxzLCB3ZSB3aWxsIGFsc28gZ2V0IGEgY2hpbGQgc3RhdHVzCisgICAqIGZyb20gdGhlIGJhYnlzaXR0ZXIgc2F5aW5nIHRoZSBjaGlsZCBleGl0ZWQsCisgICAqIHNvIHdlIG5lZWQgdG8gZ2l2ZSBwcmlvcml0eSB0byB0aGUgZXhlYyBlcnJvcgorICAgKi8KKyAgaWYgKHNpdHRlci0+aGF2ZV9leGVjX2Vycm51bSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fRVhFQ19GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBleGVjdXRlIHByb2dyYW0gJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBzaXR0ZXItPmV4ZWN1dGFibGUsIF9kYnVzX3N0cmVycm9yIChzaXR0ZXItPmVycm51bSkpOworICAgIH0KKyAgZWxzZSBpZiAoc2l0dGVyLT5oYXZlX2ZvcmtfZXJybnVtKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBmb3JrIGEgbmV3IHByb2Nlc3MgJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBzaXR0ZXItPmV4ZWN1dGFibGUsIF9kYnVzX3N0cmVycm9yIChzaXR0ZXItPmVycm51bSkpOworICAgIH0KKyAgZWxzZSBpZiAoc2l0dGVyLT5oYXZlX2NoaWxkX3N0YXR1cykKKyAgICB7CisgICAgICBpZiAoV0lGRVhJVEVEIChzaXR0ZXItPnN0YXR1cykpCisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9DSElMRF9FWElURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAiUHJvY2VzcyAlcyBleGl0ZWQgd2l0aCBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l0dGVyLT5leGVjdXRhYmxlLCBXRVhJVFNUQVRVUyAoc2l0dGVyLT5zdGF0dXMpKTsKKyAgICAgIGVsc2UgaWYgKFdJRlNJR05BTEVEIChzaXR0ZXItPnN0YXR1cykpCisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9DSElMRF9TSUdOQUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJQcm9jZXNzICVzIHJlY2VpdmVkIHNpZ25hbCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXR0ZXItPmV4ZWN1dGFibGUsIFdURVJNU0lHIChzaXR0ZXItPnN0YXR1cykpOworICAgICAgZWxzZQorICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgIlByb2Nlc3MgJXMgZXhpdGVkIGFibm9ybWFsbHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l0dGVyLT5leGVjdXRhYmxlKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJQcm9jZXNzICVzIGV4aXRlZCwgcmVhc29uIHVua25vd24iLAorICAgICAgICAgICAgICAgICAgICAgIHNpdHRlci0+ZXhlY3V0YWJsZSk7CisgICAgfQorfQorCisvKioKKyAqIFNldHMgd2F0Y2ggZnVuY3Rpb25zIHRvIG5vdGlmeSB1cyB3aGVuIHRoZQorICogYmFieXNpdHRlciBvYmplY3QgbmVlZHMgdG8gcmVhZC93cml0ZSBmaWxlIGRlc2NyaXB0b3JzLgorICoKKyAqIEBwYXJhbSBzaXR0ZXIgdGhlIGJhYnlzaXR0ZXIKKyAqIEBwYXJhbSBhZGRfZnVuY3Rpb24gZnVuY3Rpb24gdG8gYmVnaW4gbW9uaXRvcmluZyBhIG5ldyBkZXNjcmlwdG9yLgorICogQHBhcmFtIHJlbW92ZV9mdW5jdGlvbiBmdW5jdGlvbiB0byBzdG9wIG1vbml0b3JpbmcgYSBkZXNjcmlwdG9yLgorICogQHBhcmFtIHRvZ2dsZWRfZnVuY3Rpb24gZnVuY3Rpb24gdG8gbm90aWZ5IHdoZW4gdGhlIHdhdGNoIGlzIGVuYWJsZWQvZGlzYWJsZWQKKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gcGFzcyB0byBhZGRfZnVuY3Rpb24gYW5kIHJlbW92ZV9mdW5jdGlvbi4KKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuY3Rpb24gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHRvIGZyZWUgdGhlIGRhdGEuCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZSAobm8gbWVtb3J5KQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYmFieXNpdHRlcl9zZXRfd2F0Y2hfZnVuY3Rpb25zIChEQnVzQmFieXNpdHRlciAgICAgICAgICAgICpzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBZGRXYXRjaEZ1bmN0aW9uICAgICAgIGFkZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1JlbW92ZVdhdGNoRnVuY3Rpb24gICAgcmVtb3ZlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2hUb2dnbGVkRnVuY3Rpb24gICB0b2dnbGVkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pCit7CisgIHJldHVybiBfZGJ1c193YXRjaF9saXN0X3NldF9mdW5jdGlvbnMgKHNpdHRlci0+d2F0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraGFuZGxlX3dhdGNoIChEQnVzV2F0Y2ggICAgICAgKndhdGNoLAorICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgIGNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICpkYXRhKQoreworICBEQnVzQmFieXNpdHRlciAqc2l0dGVyID0gX2RidXNfYmFieXNpdHRlcl9yZWYgKGRhdGEpOworICBpbnQgcmV2ZW50czsKKyAgaW50IGZkOworICAKKyAgcmV2ZW50cyA9IDA7CisgIGlmIChjb25kaXRpb24gJiBEQlVTX1dBVENIX1JFQURBQkxFKQorICAgIHJldmVudHMgfD0gX0RCVVNfUE9MTElOOworICBpZiAoY29uZGl0aW9uICYgREJVU19XQVRDSF9FUlJPUikKKyAgICByZXZlbnRzIHw9IF9EQlVTX1BPTExFUlI7CisgIGlmIChjb25kaXRpb24gJiBEQlVTX1dBVENIX0hBTkdVUCkKKyAgICByZXZlbnRzIHw9IF9EQlVTX1BPTExIVVA7CisKKyAgZmQgPSBkYnVzX3dhdGNoX2dldF9zb2NrZXQgKHdhdGNoKTsKKworICBpZiAoZmQgPT0gc2l0dGVyLT5lcnJvcl9waXBlX2Zyb21fY2hpbGQpCisgICAgaGFuZGxlX2Vycm9yX3BpcGUgKHNpdHRlciwgcmV2ZW50cyk7CisgIGVsc2UgaWYgKGZkID09IHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIpCisgICAgaGFuZGxlX2JhYnlzaXR0ZXJfc29ja2V0IChzaXR0ZXIsIHJldmVudHMpOworCisgIHdoaWxlIChMSVZFX0NISUxEUkVOIChzaXR0ZXIpICYmCisgICAgICAgICBiYWJ5c2l0dGVyX2l0ZXJhdGlvbiAoc2l0dGVyLCBGQUxTRSkpCisgICAgOworCisgIC8qIGZkLm8gIzMyOTkyOiBpZiB0aGUgaGFuZGxlXyogbWV0aG9kcyBjbG9zZWQgdGhlaXIgc29ja2V0cywgdGhleSBwcmV2aW91c2x5CisgICAqIGRpZG4ndCBhbHdheXMgcmVtb3ZlIHRoZSB3YXRjaGVzLiBDaGVjayB0aGF0IHdlIGRvbid0IHJlZ3Jlc3MuICovCisgIF9kYnVzX2Fzc2VydCAoc2l0dGVyLT5zb2NrZXRfdG9fYmFieXNpdHRlciAhPSAtMSB8fCBzaXR0ZXItPnNpdHRlcl93YXRjaCA9PSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChzaXR0ZXItPmVycm9yX3BpcGVfZnJvbV9jaGlsZCAhPSAtMSB8fCBzaXR0ZXItPmVycm9yX3dhdGNoID09IE5VTEwpOworCisgIGlmIChfZGJ1c19iYWJ5c2l0dGVyX2dldF9jaGlsZF9leGl0ZWQgKHNpdHRlcikgJiYKKyAgICAgIHNpdHRlci0+ZmluaXNoZWRfY2IgIT0gTlVMTCkKKyAgICB7CisgICAgICBzaXR0ZXItPmZpbmlzaGVkX2NiIChzaXR0ZXIsIHNpdHRlci0+ZmluaXNoZWRfZGF0YSk7CisgICAgICBzaXR0ZXItPmZpbmlzaGVkX2NiID0gTlVMTDsKKyAgICB9CisKKyAgX2RidXNfYmFieXNpdHRlcl91bnJlZiAoc2l0dGVyKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKiBIZWxwcyByZW1lbWJlciB3aGljaCBlbmQgb2YgdGhlIHBpcGUgaXMgd2hpY2ggKi8KKyNkZWZpbmUgUkVBRF9FTkQgMAorLyoqIEhlbHBzIHJlbWVtYmVyIHdoaWNoIGVuZCBvZiB0aGUgcGlwZSBpcyB3aGljaCAqLworI2RlZmluZSBXUklURV9FTkQgMQorCisKKy8qIEF2b2lkcyBhIGRhbmdlciBpbiB0aHJlYWRlZCBzaXR1YXRpb25zIChjYWxsaW5nIGNsb3NlKCkKKyAqIG9uIGEgZmlsZSBkZXNjcmlwdG9yIHR3aWNlLCBhbmQgYW5vdGhlciB0aHJlYWQgaGFzCisgKiByZS1vcGVuZWQgaXQgc2luY2UgdGhlIGZpcnN0IGNsb3NlKQorICovCitzdGF0aWMgaW50CitjbG9zZV9hbmRfaW52YWxpZGF0ZSAoaW50ICpmZCkKK3sKKyAgaW50IHJldDsKKworICBpZiAoKmZkIDwgMCkKKyAgICByZXR1cm4gLTE7CisgIGVsc2UKKyAgICB7CisgICAgICByZXQgPSBfZGJ1c19jbG9zZV9zb2NrZXQgKCpmZCwgTlVMTCk7CisgICAgICAqZmQgPSAtMTsKKyAgICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CittYWtlX3BpcGUgKGludCAgICAgICAgIHBbMl0sCisgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworICBpbnQgcmV0dmFsOworCisjaWZkZWYgSEFWRV9QSVBFMgorICBkYnVzX2Jvb2xfdCBjbG9leGVjX2RvbmU7CisKKyAgcmV0dmFsID0gcGlwZTIgKHAsIE9fQ0xPRVhFQyk7CisgIGNsb2V4ZWNfZG9uZSA9IHJldHZhbCA+PSAwOworCisgIC8qIENoZWNrIGlmIGtlcm5lbCBzZWVtcyB0byBiZSB0b28gb2xkIHRvIGtub3cgcGlwZTIoKS4gV2UgYXNzdW1lCisgICAgIHRoYXQgaWYgcGlwZTIgaXMgYXZhaWxhYmxlLCBPX0NMT0VYRUMgaXMgdG9vLiAgKi8KKyAgaWYgKHJldHZhbCA8IDAgJiYgZXJybm8gPT0gRU5PU1lTKQorI2VuZGlmCisgICAgeworICAgICAgcmV0dmFsID0gcGlwZShwKTsKKyAgICB9CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKHJldHZhbCA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorCQkgICAgICBEQlVTX0VSUk9SX1NQQVdOX0ZBSUxFRCwKKwkJICAgICAgIkZhaWxlZCB0byBjcmVhdGUgcGlwZSBmb3IgY29tbXVuaWNhdGluZyB3aXRoIGNoaWxkIHByb2Nlc3MgKCVzKSIsCisJCSAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworI2lmZGVmIEhBVkVfUElQRTIKKyAgaWYgKCFjbG9leGVjX2RvbmUpCisjZW5kaWYKKyAgICB7CisgICAgICBfZGJ1c19mZF9zZXRfY2xvc2Vfb25fZXhlYyAocFswXSk7CisgICAgICBfZGJ1c19mZF9zZXRfY2xvc2Vfb25fZXhlYyAocFsxXSk7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZG9fd3JpdGUgKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCit7CisgIHNpemVfdCBieXRlc193cml0dGVuOworICBpbnQgcmV0OworICAKKyAgYnl0ZXNfd3JpdHRlbiA9IDA7CisgIAorIGFnYWluOgorICAKKyAgcmV0ID0gd3JpdGUgKGZkLCAoKGNvbnN0IGNoYXIqKWJ1ZikgKyBieXRlc193cml0dGVuLCBjb3VudCAtIGJ5dGVzX3dyaXR0ZW4pOworCisgIGlmIChyZXQgPCAwKQorICAgIHsKKyAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gd3JpdGUgZGF0YSB0byBwaXBlIVxuIik7CisgICAgICAgICAgZXhpdCAoMSk7IC8qIGdpdmUgdXAsIHdlIHN1Y2sgKi8KKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIGJ5dGVzX3dyaXR0ZW4gKz0gcmV0OworICAKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPCBjb3VudCkKKyAgICBnb3RvIGFnYWluOworfQorCitzdGF0aWMgdm9pZAord3JpdGVfZXJyX2FuZF9leGl0IChpbnQgZmQsIGludCBtc2cpCit7CisgIGludCBlbiA9IGVycm5vOworCisgIGRvX3dyaXRlIChmZCwgJm1zZywgc2l6ZW9mIChtc2cpKTsKKyAgZG9fd3JpdGUgKGZkLCAmZW4sIHNpemVvZiAoZW4pKTsKKyAgCisgIGV4aXQgKDEpOworfQorCitzdGF0aWMgdm9pZAord3JpdGVfcGlkIChpbnQgZmQsIHBpZF90IHBpZCkKK3sKKyAgaW50IG1zZyA9IENISUxEX1BJRDsKKyAgCisgIGRvX3dyaXRlIChmZCwgJm1zZywgc2l6ZW9mIChtc2cpKTsKKyAgZG9fd3JpdGUgKGZkLCAmcGlkLCBzaXplb2YgKHBpZCkpOworfQorCitzdGF0aWMgdm9pZAord3JpdGVfc3RhdHVzX2FuZF9leGl0IChpbnQgZmQsIGludCBzdGF0dXMpCit7CisgIGludCBtc2cgPSBDSElMRF9FWElURUQ7CisgIAorICBkb193cml0ZSAoZmQsICZtc2csIHNpemVvZiAobXNnKSk7CisgIGRvX3dyaXRlIChmZCwgJnN0YXR1cywgc2l6ZW9mIChzdGF0dXMpKTsKKyAgCisgIGV4aXQgKDApOworfQorCitzdGF0aWMgdm9pZAorZG9fZXhlYyAoaW50ICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF9lcnJfcmVwb3J0X2ZkLAorCSBjaGFyICAgICAgICAgICAgICAgICAgICAqKmFyZ3YsCisJIGNoYXIgICAgICAgICAgICAgICAgICAgICoqZW52cCwKKwkgREJ1c1NwYXduQ2hpbGRTZXR1cEZ1bmMgICBjaGlsZF9zZXR1cCwKKwkgdm9pZCAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICBpbnQgaSwgbWF4X29wZW47CisjZW5kaWYKKworICBfZGJ1c192ZXJib3NlX3Jlc2V0ICgpOworICBfZGJ1c192ZXJib3NlICgiQ2hpbGQgcHJvY2VzcyBoYXMgUElEICIgREJVU19QSURfRk9STUFUICJcbiIsCisgICAgICAgICAgICAgICAgIF9kYnVzX2dldHBpZCAoKSk7CisgIAorICBpZiAoY2hpbGRfc2V0dXApCisgICAgKCogY2hpbGRfc2V0dXApICh1c2VyX2RhdGEpOworCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICBtYXhfb3BlbiA9IHN5c2NvbmYgKF9TQ19PUEVOX01BWCk7CisgIAorICBmb3IgKGkgPSAzOyBpIDwgbWF4X29wZW47IGkrKykKKyAgICB7CisgICAgICBpbnQgcmV0dmFsOworCisgICAgICBpZiAoaSA9PSBjaGlsZF9lcnJfcmVwb3J0X2ZkKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIAorICAgICAgcmV0dmFsID0gZmNudGwgKGksIEZfR0VURkQpOworCisgICAgICBpZiAocmV0dmFsICE9IC0xICYmICEocmV0dmFsICYgRkRfQ0xPRVhFQykpCisJX2RidXNfd2FybiAoIkZkICVkIGRpZCBub3QgaGF2ZSB0aGUgY2xvc2Utb24tZXhlYyBmbGFnIHNldCFcbiIsIGkpOworICAgIH0KKyNlbmRpZgorCisgIGlmIChlbnZwID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChlbnZpcm9uICE9IE5VTEwpOworCisgICAgICBlbnZwID0gZW52aXJvbjsKKyAgICB9CisgIAorICBleGVjdmUgKGFyZ3ZbMF0sIGFyZ3YsIGVudnApOworICAKKyAgLyogRXhlYyBmYWlsZWQgKi8KKyAgd3JpdGVfZXJyX2FuZF9leGl0IChjaGlsZF9lcnJfcmVwb3J0X2ZkLAorICAgICAgICAgICAgICAgICAgICAgIENISUxEX0VYRUNfRkFJTEVEKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2JhYnlzaXRfZXZlbnRzIChwaWRfdCBncmFuZGNoaWxkX3BpZCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICBwYXJlbnRfcGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICByZXZlbnRzKQoreworICBwaWRfdCByZXQ7CisgIGludCBzdGF0dXM7CisgIAorICBkbworICAgIHsKKyAgICAgIHJldCA9IHdhaXRwaWQgKGdyYW5kY2hpbGRfcGlkLCAmc3RhdHVzLCBXTk9IQU5HKTsKKyAgICAgIC8qIFRoZSBtYW4gcGFnZSBzYXlzIEVJTlRSIGNhbid0IGhhcHBlbiB3aXRoIFdOT0hBTkcsCisgICAgICAgKiBidXQgdGhlcmUgYXJlIHJlcG9ydHMgb2YgaXQgKG1heWJlIG9ubHkgd2l0aCB2YWxncmluZD8pCisgICAgICAgKi8KKyAgICB9CisgIHdoaWxlIChyZXQgPCAwICYmIGVycm5vID09IEVJTlRSKTsKKworICBpZiAocmV0ID09IDApCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIm5vIGNoaWxkIGV4aXRlZFxuIik7CisgICAgICAKKyAgICAgIDsgLyogbm8gY2hpbGQgZXhpdGVkICovCisgICAgfQorICBlbHNlIGlmIChyZXQgPCAwKQorICAgIHsKKyAgICAgIC8qIFRoaXMgaXNuJ3Qgc3VwcG9zZWQgdG8gaGFwcGVuLiAqLworICAgICAgX2RidXNfd2FybiAoInVuZXhwZWN0ZWQgd2FpdHBpZCgpIGZhaWx1cmUgaW4gY2hlY2tfYmFieXNpdF9ldmVudHMoKTogJXNcbiIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgZWxzZSBpZiAocmV0ID09IGdyYW5kY2hpbGRfcGlkKQorICAgIHsKKyAgICAgIC8qIENoaWxkIGV4aXRlZCAqLworICAgICAgX2RidXNfdmVyYm9zZSAoInJlYXBlZCBjaGlsZCBwaWQgJWxkXG4iLCAobG9uZykgcmV0KTsKKyAgICAgIAorICAgICAgd3JpdGVfc3RhdHVzX2FuZF9leGl0IChwYXJlbnRfcGlwZSwgc3RhdHVzKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgid2FpdHBpZCgpIHJlYXBlZCBwaWQgJWQgdGhhdCB3ZSd2ZSBuZXZlciBoZWFyZCBvZlxuIiwKKyAgICAgICAgICAgICAgICAgIChpbnQpIHJldCk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKHJldmVudHMgJiBfREJVU19QT0xMSU4pCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImJhYnlzaXR0ZXIgZ290IFBPTExJTiBmcm9tIHBhcmVudCBwaXBlXG4iKTsKKyAgICB9CisKKyAgaWYgKHJldmVudHMgJiAoX0RCVVNfUE9MTEVSUiB8IF9EQlVTX1BPTExIVVApKQorICAgIHsKKyAgICAgIC8qIFBhcmVudCBpcyBnb25lLCBzbyB3ZSBqdXN0IGV4aXQgKi8KKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJiYWJ5c2l0dGVyIGdvdCBQT0xMRVJSIG9yIFBPTExIVVAgZnJvbSBwYXJlbnRcbiIpOworICAgICAgZXhpdCAoMCk7CisgICAgfQorfQorCitzdGF0aWMgaW50IGJhYnlzaXRfc2lnY2hsZF9waXBlID0gLTE7CisKK3N0YXRpYyB2b2lkCitiYWJ5c2l0X3NpZ25hbF9oYW5kbGVyIChpbnQgc2lnbm8pCit7CisgIGNoYXIgYiA9ICdcMCc7CisgYWdhaW46CisgIGlmICh3cml0ZSAoYmFieXNpdF9zaWdjaGxkX3BpcGUsICZiLCAxKSA8PSAwKSAKKyAgICBpZiAoZXJybm8gPT0gRUlOVFIpCisgICAgICBnb3RvIGFnYWluOworfQorCitzdGF0aWMgdm9pZAorYmFieXNpdCAocGlkX3QgZ3JhbmRjaGlsZF9waWQsCisgICAgICAgICBpbnQgICBwYXJlbnRfcGlwZSkKK3sKKyAgaW50IHNpZ2NobGRfcGlwZVsyXTsKKworICAvKiBXZSBkb24ndCBleGVjLCBzbyB3ZSBrZWVwIHBhcmVudCBzdGF0ZSwgc3VjaCBhcyB0aGUgcGlkIHRoYXQKKyAgICogX2RidXNfdmVyYm9zZSgpIHVzZXMuIFJlc2V0IHRoZSBwaWQgaGVyZS4KKyAgICovCisgIF9kYnVzX3ZlcmJvc2VfcmVzZXQgKCk7CisgIAorICAvKiBJIHRob3VnaHQgU0lHQ0hMRCB3b3VsZCBqdXN0IHdha2UgdXAgdGhlIHBvbGwsIGJ1dAorICAgKiB0aGF0IGRpZG4ndCBzZWVtIHRvIHdvcmssIHNvIGFkZGVkIHRoaXMgcGlwZS4KKyAgICogUHJvYmFibHkgdGhlIHBpcGUgaXMgbW9yZSBsaWtlbHkgdG8gd29yayBvbiBidXN0ZWQKKyAgICogb3BlcmF0aW5nIHN5c3RlbXMgYW55aG93LgorICAgKi8KKyAgaWYgKHBpcGUgKHNpZ2NobGRfcGlwZSkgPCAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJOb3QgZW5vdWdoIGZpbGUgZGVzY3JpcHRvcnMgdG8gY3JlYXRlIHBpcGUgaW4gYmFieXNpdHRlciBwcm9jZXNzXG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBiYWJ5c2l0X3NpZ2NobGRfcGlwZSA9IHNpZ2NobGRfcGlwZVtXUklURV9FTkRdOworCisgIF9kYnVzX3NldF9zaWduYWxfaGFuZGxlciAoU0lHQ0hMRCwgYmFieXNpdF9zaWduYWxfaGFuZGxlcik7CisgIAorICB3cml0ZV9waWQgKHBhcmVudF9waXBlLCBncmFuZGNoaWxkX3BpZCk7CisKKyAgY2hlY2tfYmFieXNpdF9ldmVudHMgKGdyYW5kY2hpbGRfcGlkLCBwYXJlbnRfcGlwZSwgMCk7CisKKyAgd2hpbGUgKFRSVUUpCisgICAgeworICAgICAgREJ1c1BvbGxGRCBwZmRzWzJdOworICAgICAgCisgICAgICBwZmRzWzBdLmZkID0gcGFyZW50X3BpcGU7CisgICAgICBwZmRzWzBdLmV2ZW50cyA9IF9EQlVTX1BPTExJTjsKKyAgICAgIHBmZHNbMF0ucmV2ZW50cyA9IDA7CisKKyAgICAgIHBmZHNbMV0uZmQgPSBzaWdjaGxkX3BpcGVbUkVBRF9FTkRdOworICAgICAgcGZkc1sxXS5ldmVudHMgPSBfREJVU19QT0xMSU47CisgICAgICBwZmRzWzFdLnJldmVudHMgPSAwOworICAgICAgCisgICAgICBpZiAoX2RidXNfcG9sbCAocGZkcywgX0RCVVNfTl9FTEVNRU5UUyAocGZkcyksIC0xKSA8IDAgJiYgZXJybm8gIT0gRUlOVFIpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiX2RidXNfcG9sbCgpIGVycm9yOiAlc1xuIiwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKworICAgICAgaWYgKHBmZHNbMF0ucmV2ZW50cyAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgY2hlY2tfYmFieXNpdF9ldmVudHMgKGdyYW5kY2hpbGRfcGlkLCBwYXJlbnRfcGlwZSwgcGZkc1swXS5yZXZlbnRzKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAocGZkc1sxXS5yZXZlbnRzICYgX0RCVVNfUE9MTElOKQorICAgICAgICB7CisgICAgICAgICAgY2hhciBiOworICAgICAgICAgIGlmIChyZWFkIChzaWdjaGxkX3BpcGVbUkVBRF9FTkRdLCAmYiwgMSkgPT0gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIGlnbm9yZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgIC8qIGRvIHdhaXRwaWQgY2hlY2sgKi8KKyAgICAgICAgICBjaGVja19iYWJ5c2l0X2V2ZW50cyAoZ3JhbmRjaGlsZF9waWQsIHBhcmVudF9waXBlLCAwKTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIGV4aXQgKDEpOworfQorCisvKioKKyAqIFNwYXducyBhIG5ldyBwcm9jZXNzLiBUaGUgZXhlY3V0YWJsZSBuYW1lIGFuZCBhcmd2WzBdCisgKiBhcmUgdGhlIHNhbWUsIGJvdGggYXJlIHByb3ZpZGVkIGluIGFyZ3ZbMF0uIFRoZSBjaGlsZF9zZXR1cAorICogZnVuY3Rpb24gaXMgcGFzc2VkIHRoZSBnaXZlbiB1c2VyX2RhdGEgYW5kIGlzIHJ1biBpbiB0aGUgY2hpbGQKKyAqIGp1c3QgYmVmb3JlIGNhbGxpbmcgZXhlYygpLgorICoKKyAqIEFsc28gY3JlYXRlcyBhICJiYWJ5c2l0dGVyIiB3aGljaCB0cmFja3MgdGhlIHN0YXR1cyBvZiB0aGUKKyAqIGNoaWxkIHByb2Nlc3MsIGFkdmlzaW5nIHRoZSBwYXJlbnQgaWYgdGhlIGNoaWxkIGV4aXRzLgorICogSWYgdGhlIHNwYXduIGZhaWxzLCBubyBiYWJ5c2l0dGVyIGlzIGNyZWF0ZWQuCisgKiBJZiBzaXR0ZXJfcCBpcyAjTlVMTCwgbm8gYmFieXNpdHRlciBpcyBrZXB0LgorICoKKyAqIEBwYXJhbSBzaXR0ZXJfcCByZXR1cm4gbG9jYXRpb24gZm9yIGJhYnlzaXR0ZXIgb3IgI05VTEwKKyAqIEBwYXJhbSBhcmd2IHRoZSBleGVjdXRhYmxlIGFuZCBhcmd1bWVudHMKKyAqIEBwYXJhbSBlbnYgdGhlIGVudmlyb25tZW50IChub3QgdXNlZCBvbiB1bml4IHlldCkKKyAqIEBwYXJhbSBjaGlsZF9zZXR1cCBmdW5jdGlvbiB0byBjYWxsIGluIGNoaWxkIHByZS1leGVjKCkKKyAqIEBwYXJhbSB1c2VyX2RhdGEgdXNlciBkYXRhIGZvciBzZXR1cCBmdW5jdGlvbgorICogQHBhcmFtIGVycm9yIGVycm9yIG9iamVjdCB0byBiZSBmaWxsZWQgaW4gaWYgZnVuY3Rpb24gZmFpbHMKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBpZiBlcnJvciBpcyBmaWxsZWQgaW4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3NwYXduX2FzeW5jX3dpdGhfYmFieXNpdHRlciAoREJ1c0JhYnlzaXR0ZXIgICAgICAgICAgKipzaXR0ZXJfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgKiphcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICAgICAgICAqKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NwYXduQ2hpbGRTZXR1cEZ1bmMgICBjaGlsZF9zZXR1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAqZXJyb3IpCit7CisgIERCdXNCYWJ5c2l0dGVyICpzaXR0ZXI7CisgIGludCBjaGlsZF9lcnJfcmVwb3J0X3BpcGVbMl0gPSB7IC0xLCAtMSB9OworICBpbnQgYmFieXNpdHRlcl9waXBlWzJdID0geyAtMSwgLTEgfTsKKyAgcGlkX3QgcGlkOworICAKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKHNpdHRlcl9wICE9IE5VTEwpCisgICAgKnNpdHRlcl9wID0gTlVMTDsKKworICBzaXR0ZXIgPSBOVUxMOworCisgIHNpdHRlciA9IF9kYnVzX2JhYnlzaXR0ZXJfbmV3ICgpOworICBpZiAoc2l0dGVyID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHNpdHRlci0+ZXhlY3V0YWJsZSA9IF9kYnVzX3N0cmR1cCAoYXJndlswXSk7CisgIGlmIChzaXR0ZXItPmV4ZWN1dGFibGUgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gY2xlYW51cF9hbmRfZmFpbDsKKyAgICB9CisgIAorICBpZiAoIW1ha2VfcGlwZSAoY2hpbGRfZXJyX3JlcG9ydF9waXBlLCBlcnJvcikpCisgICAgZ290byBjbGVhbnVwX2FuZF9mYWlsOworCisgIGlmICghX2RidXNfZnVsbF9kdXBsZXhfcGlwZSAoJmJhYnlzaXR0ZXJfcGlwZVswXSwgJmJhYnlzaXR0ZXJfcGlwZVsxXSwgVFJVRSwgZXJyb3IpKQorICAgIGdvdG8gY2xlYW51cF9hbmRfZmFpbDsKKworICAvKiBTZXR0aW5nIHVwIHRoZSBiYWJ5c2l0dGVyIGlzIG9ubHkgdXNlZnVsIGluIHRoZSBwYXJlbnQsCisgICAqIGJ1dCB3ZSBkb24ndCB3YW50IHRvIHJ1biBvdXQgb2YgbWVtb3J5IGFuZCBmYWlsCisgICAqIGFmdGVyIHdlJ3ZlIGFscmVhZHkgZm9ya2VkLCBzaW5jZSB0aGVuIHdlJ2QgbGVhaworICAgKiBjaGlsZCBwcm9jZXNzZXMgZXZlcnl3aGVyZS4KKyAgICovCisgIHNpdHRlci0+ZXJyb3Jfd2F0Y2ggPSBfZGJ1c193YXRjaF9uZXcgKGNoaWxkX2Vycl9yZXBvcnRfcGlwZVtSRUFEX0VORF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfV0FUQ0hfUkVBREFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsIGhhbmRsZV93YXRjaCwgc2l0dGVyLCBOVUxMKTsKKyAgaWYgKHNpdHRlci0+ZXJyb3Jfd2F0Y2ggPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gY2xlYW51cF9hbmRfZmFpbDsKKyAgICB9CisgICAgICAgIAorICBpZiAoIV9kYnVzX3dhdGNoX2xpc3RfYWRkX3dhdGNoIChzaXR0ZXItPndhdGNoZXMsICBzaXR0ZXItPmVycm9yX3dhdGNoKSkKKyAgICB7CisgICAgICAvKiB3ZSBuZWVkIHRvIGZyZWUgaXQgZWFybHkgc28gdGhlIGRlc3RydWN0b3Igd29uJ3QgdHJ5IHRvIHJlbW92ZSBpdAorICAgICAgICogd2l0aG91dCBpdCBoYXZpbmcgYmVlbiBhZGRlZCwgd2hpY2ggREJ1c0xvb3AgZG9lc24ndCBhbGxvdyAqLworICAgICAgX2RidXNfd2F0Y2hfaW52YWxpZGF0ZSAoc2l0dGVyLT5lcnJvcl93YXRjaCk7CisgICAgICBfZGJ1c193YXRjaF91bnJlZiAoc2l0dGVyLT5lcnJvcl93YXRjaCk7CisgICAgICBzaXR0ZXItPmVycm9yX3dhdGNoID0gTlVMTDsKKworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBnb3RvIGNsZWFudXBfYW5kX2ZhaWw7CisgICAgfQorICAgICAgCisgIHNpdHRlci0+c2l0dGVyX3dhdGNoID0gX2RidXNfd2F0Y2hfbmV3IChiYWJ5c2l0dGVyX3BpcGVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1dBVENIX1JFQURBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwgaGFuZGxlX3dhdGNoLCBzaXR0ZXIsIE5VTEwpOworICBpZiAoc2l0dGVyLT5zaXR0ZXJfd2F0Y2ggPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gY2xlYW51cF9hbmRfZmFpbDsKKyAgICB9CisgICAgICAKKyAgaWYgKCFfZGJ1c193YXRjaF9saXN0X2FkZF93YXRjaCAoc2l0dGVyLT53YXRjaGVzLCAgc2l0dGVyLT5zaXR0ZXJfd2F0Y2gpKQorICAgIHsKKyAgICAgIC8qIHdlIG5lZWQgdG8gZnJlZSBpdCBlYXJseSBzbyB0aGUgZGVzdHJ1Y3RvciB3b24ndCB0cnkgdG8gcmVtb3ZlIGl0CisgICAgICAgKiB3aXRob3V0IGl0IGhhdmluZyBiZWVuIGFkZGVkLCB3aGljaCBEQnVzTG9vcCBkb2Vzbid0IGFsbG93ICovCisgICAgICBfZGJ1c193YXRjaF9pbnZhbGlkYXRlIChzaXR0ZXItPnNpdHRlcl93YXRjaCk7CisgICAgICBfZGJ1c193YXRjaF91bnJlZiAoc2l0dGVyLT5zaXR0ZXJfd2F0Y2gpOworICAgICAgc2l0dGVyLT5zaXR0ZXJfd2F0Y2ggPSBOVUxMOworCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gY2xlYW51cF9hbmRfZmFpbDsKKyAgICB9CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICBwaWQgPSBmb3JrICgpOworICAKKyAgaWYgKHBpZCA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorCQkgICAgICBEQlVTX0VSUk9SX1NQQVdOX0ZPUktfRkFJTEVELAorCQkgICAgICAiRmFpbGVkIHRvIGZvcmsgKCVzKSIsCisJCSAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgZ290byBjbGVhbnVwX2FuZF9mYWlsOworICAgIH0KKyAgZWxzZSBpZiAocGlkID09IDApCisgICAgeworICAgICAgLyogSW1tZWRpYXRlIGNoaWxkLCB0aGlzIGlzIHRoZSBiYWJ5c2l0dGVyIHByb2Nlc3MuICovCisgICAgICBpbnQgZ3JhbmRjaGlsZF9waWQ7CisgICAgICAKKyAgICAgIC8qIEJlIHN1cmUgd2UgY3Jhc2ggaWYgdGhlIHBhcmVudCBleGl0cworICAgICAgICogYW5kIHdlIHdyaXRlIHRvIHRoZSBlcnJfcmVwb3J0X3BpcGUKKyAgICAgICAqLworICAgICAgc2lnbmFsIChTSUdQSVBFLCBTSUdfREZMKTsKKworICAgICAgLyogQ2xvc2UgdGhlIHBhcmVudCdzIGVuZCBvZiB0aGUgcGlwZXMuICovCisgICAgICBjbG9zZV9hbmRfaW52YWxpZGF0ZSAoJmNoaWxkX2Vycl9yZXBvcnRfcGlwZVtSRUFEX0VORF0pOworICAgICAgY2xvc2VfYW5kX2ludmFsaWRhdGUgKCZiYWJ5c2l0dGVyX3BpcGVbMF0pOworICAgICAgCisgICAgICAvKiBDcmVhdGUgdGhlIGNoaWxkIHRoYXQgd2lsbCBleGVjICgpICovCisgICAgICBncmFuZGNoaWxkX3BpZCA9IGZvcmsgKCk7CisgICAgICAKKyAgICAgIGlmIChncmFuZGNoaWxkX3BpZCA8IDApCisJeworCSAgd3JpdGVfZXJyX2FuZF9leGl0IChiYWJ5c2l0dGVyX3BpcGVbMV0sCisJCQkgICAgICBDSElMRF9GT1JLX0ZBSUxFRCk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiR290IHRvIGNvZGUgYWZ0ZXIgd3JpdGVfZXJyX2FuZF9leGl0KCkiKTsKKwl9CisgICAgICBlbHNlIGlmIChncmFuZGNoaWxkX3BpZCA9PSAwKQorCXsKKwkgIGRvX2V4ZWMgKGNoaWxkX2Vycl9yZXBvcnRfcGlwZVtXUklURV9FTkRdLAorCQkgICBhcmd2LAorCQkgICBlbnYsCisJCSAgIGNoaWxkX3NldHVwLCB1c2VyX2RhdGEpOworICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkdvdCB0byBjb2RlIGFmdGVyIGV4ZWMoKSAtIHNob3VsZCBoYXZlIGV4aXRlZCBvbiBlcnJvciIpOworCX0KKyAgICAgIGVsc2UKKwl7CisgICAgICAgICAgYmFieXNpdCAoZ3JhbmRjaGlsZF9waWQsIGJhYnlzaXR0ZXJfcGlwZVsxXSk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiR290IHRvIGNvZGUgYWZ0ZXIgYmFieXNpdCgpIik7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsgICAgICAKKyAgICAgIC8qIENsb3NlIHRoZSB1bmNhcmVkLWFib3V0IGVuZHMgb2YgdGhlIHBpcGVzICovCisgICAgICBjbG9zZV9hbmRfaW52YWxpZGF0ZSAoJmNoaWxkX2Vycl9yZXBvcnRfcGlwZVtXUklURV9FTkRdKTsKKyAgICAgIGNsb3NlX2FuZF9pbnZhbGlkYXRlICgmYmFieXNpdHRlcl9waXBlWzFdKTsKKworICAgICAgc2l0dGVyLT5zb2NrZXRfdG9fYmFieXNpdHRlciA9IGJhYnlzaXR0ZXJfcGlwZVswXTsKKyAgICAgIGJhYnlzaXR0ZXJfcGlwZVswXSA9IC0xOworICAgICAgCisgICAgICBzaXR0ZXItPmVycm9yX3BpcGVfZnJvbV9jaGlsZCA9IGNoaWxkX2Vycl9yZXBvcnRfcGlwZVtSRUFEX0VORF07CisgICAgICBjaGlsZF9lcnJfcmVwb3J0X3BpcGVbUkVBRF9FTkRdID0gLTE7CisKKyAgICAgIHNpdHRlci0+c2l0dGVyX3BpZCA9IHBpZDsKKworICAgICAgaWYgKHNpdHRlcl9wICE9IE5VTEwpCisgICAgICAgICpzaXR0ZXJfcCA9IHNpdHRlcjsKKyAgICAgIGVsc2UKKyAgICAgICAgX2RidXNfYmFieXNpdHRlcl91bnJlZiAoc2l0dGVyKTsKKworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoZW52KTsKKworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgICAgICAKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworIGNsZWFudXBfYW5kX2ZhaWw6CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAKKyAgY2xvc2VfYW5kX2ludmFsaWRhdGUgKCZjaGlsZF9lcnJfcmVwb3J0X3BpcGVbUkVBRF9FTkRdKTsKKyAgY2xvc2VfYW5kX2ludmFsaWRhdGUgKCZjaGlsZF9lcnJfcmVwb3J0X3BpcGVbV1JJVEVfRU5EXSk7CisgIGNsb3NlX2FuZF9pbnZhbGlkYXRlICgmYmFieXNpdHRlcl9waXBlWzBdKTsKKyAgY2xvc2VfYW5kX2ludmFsaWRhdGUgKCZiYWJ5c2l0dGVyX3BpcGVbMV0pOworCisgIGlmIChzaXR0ZXIgIT0gTlVMTCkKKyAgICBfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChzaXR0ZXIpOworICAKKyAgcmV0dXJuIEZBTFNFOworfQorCit2b2lkCitfZGJ1c19iYWJ5c2l0dGVyX3NldF9yZXN1bHRfZnVuY3Rpb24gIChEQnVzQmFieXNpdHRlciAgICAgICAgICAgICAqc2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0JhYnlzaXR0ZXJGaW5pc2hlZEZ1bmMgIGZpbmlzaGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgc2l0dGVyLT5maW5pc2hlZF9jYiA9IGZpbmlzaGVkOworICBzaXR0ZXItPmZpbmlzaGVkX2RhdGEgPSB1c2VyX2RhdGE7Cit9CisKKy8qKiBAfSAqLworCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworCitzdGF0aWMgY2hhciAqCitnZXRfdGVzdF9leGVjIChjb25zdCBjaGFyICpleGUsCisgICAgICAgICAgICAgICBEQnVzU3RyaW5nICpzY3JhdGNoX3NwYWNlKQoreworICBjb25zdCBjaGFyICpkYnVzX3Rlc3RfZXhlYzsKKworICBkYnVzX3Rlc3RfZXhlYyA9IF9kYnVzX2dldGVudiAoIkRCVVNfVEVTVF9FWEVDIik7CisKKyAgaWYgKGRidXNfdGVzdF9leGVjID09IE5VTEwpCisgICAgZGJ1c190ZXN0X2V4ZWMgPSBEQlVTX1RFU1RfRVhFQzsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0IChzY3JhdGNoX3NwYWNlKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmIChzY3JhdGNoX3NwYWNlLCAiJXMvJXMlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdGVzdF9leGVjLCBleGUsIERCVVNfRVhFRVhUKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoc2NyYXRjaF9zcGFjZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIF9kYnVzX3N0cmluZ19nZXRfZGF0YSAoc2NyYXRjaF9zcGFjZSk7Cit9CisKK3N0YXRpYyB2b2lkCitfZGJ1c19iYWJ5c2l0dGVyX2Jsb2NrX2Zvcl9jaGlsZF9leGl0IChEQnVzQmFieXNpdHRlciAqc2l0dGVyKQoreworICB3aGlsZSAoTElWRV9DSElMRFJFTiAoc2l0dGVyKSkKKyAgICBiYWJ5c2l0dGVyX2l0ZXJhdGlvbiAoc2l0dGVyLCBUUlVFKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19zcGF3bl9ub25leGlzdGVudCAodm9pZCAqZGF0YSkKK3sKKyAgY2hhciAqYXJndls0XSA9IHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9OworICBEQnVzQmFieXNpdHRlciAqc2l0dGVyID0gTlVMTDsKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworCisgIC8qKiogVGVzdCBsYXVuY2hpbmcgbm9uZXhpc3RlbnQgYmluYXJ5ICovCisgIAorICBhcmd2WzBdID0gIi90aGlzL2RvZXMvbm90L2V4aXN0LzMyNTQyc2RnYWZnYWZkZyI7CisgIGlmIChfZGJ1c19zcGF3bl9hc3luY193aXRoX2JhYnlzaXR0ZXIgKCZzaXR0ZXIsIGFyZ3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfYmFieXNpdHRlcl9ibG9ja19mb3JfY2hpbGRfZXhpdCAoc2l0dGVyKTsKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfc2V0X2NoaWxkX2V4aXRfZXJyb3IgKHNpdHRlciwgJmVycm9yKTsKKyAgICB9CisKKyAgaWYgKHNpdHRlcikKKyAgICBfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChzaXR0ZXIpOworCisgIGlmICghZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgZ2V0IGFuIGVycm9yIGxhdW5jaGluZyBub25leGlzdGVudCBleGVjdXRhYmxlXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCEoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkgfHwKKyAgICAgICAgZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0VYRUNfRkFJTEVEKSkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk5vdCBleHBlY3RpbmcgZXJyb3Igd2hlbiBsYXVuY2hpbmcgbm9uZXhpc3RlbnQgZXhlY3V0YWJsZTogJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NwYXduX3NlZ2ZhdWx0ICh2b2lkICpkYXRhKQoreworICBjaGFyICphcmd2WzRdID0geyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH07CisgIERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIgPSBOVUxMOworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgIERCdXNTdHJpbmcgYXJndjA7CisKKyAgLyoqKiBUZXN0IGxhdW5jaGluZyBzZWdmYXVsdCBiaW5hcnkgKi8KKworICBhcmd2WzBdID0gZ2V0X3Rlc3RfZXhlYyAoInRlc3Qtc2VnZmF1bHQiLCAmYXJndjApOworCisgIGlmIChhcmd2WzBdID09IE5VTEwpCisgICAgeworICAgICAgLyogT09NIHdhcyBzaW11bGF0ZWQsIG5ldmVyIG1pbmQgKi8KKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoX2RidXNfc3Bhd25fYXN5bmNfd2l0aF9iYWJ5c2l0dGVyICgmc2l0dGVyLCBhcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfYmxvY2tfZm9yX2NoaWxkX2V4aXQgKHNpdHRlcik7CisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX3NldF9jaGlsZF9leGl0X2Vycm9yIChzaXR0ZXIsICZlcnJvcik7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlICgmYXJndjApOworCisgIGlmIChzaXR0ZXIpCisgICAgX2RidXNfYmFieXNpdHRlcl91bnJlZiAoc2l0dGVyKTsKKworICBpZiAoIWRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGdldCBhbiBlcnJvciBsYXVuY2hpbmcgc2VnZmF1bHRpbmcgYmluYXJ5XG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCEoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkgfHwKKyAgICAgICAgZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX1NJR05BTEVEKSkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk5vdCBleHBlY3RpbmcgZXJyb3Igd2hlbiBsYXVuY2hpbmcgc2VnZmF1bHRpbmcgZXhlY3V0YWJsZTogJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NwYXduX2V4aXQgKHZvaWQgKmRhdGEpCit7CisgIGNoYXIgKmFyZ3ZbNF0gPSB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKyAgREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciA9IE5VTEw7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgREJ1c1N0cmluZyBhcmd2MDsKKworICAvKioqIFRlc3QgbGF1bmNoaW5nIGV4aXQgZmFpbHVyZSBiaW5hcnkgKi8KKworICBhcmd2WzBdID0gZ2V0X3Rlc3RfZXhlYyAoInRlc3QtZXhpdCIsICZhcmd2MCk7CisKKyAgaWYgKGFyZ3ZbMF0gPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBPT00gd2FzIHNpbXVsYXRlZCwgbmV2ZXIgbWluZCAqLworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmIChfZGJ1c19zcGF3bl9hc3luY193aXRoX2JhYnlzaXR0ZXIgKCZzaXR0ZXIsIGFyZ3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfYmFieXNpdHRlcl9ibG9ja19mb3JfY2hpbGRfZXhpdCAoc2l0dGVyKTsKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfc2V0X2NoaWxkX2V4aXRfZXJyb3IgKHNpdHRlciwgJmVycm9yKTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhcmd2MCk7CisKKyAgaWYgKHNpdHRlcikKKyAgICBfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChzaXR0ZXIpOworCisgIGlmICghZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgZ2V0IGFuIGVycm9yIGxhdW5jaGluZyBiaW5hcnkgdGhhdCBleGl0ZWQgd2l0aCBmYWlsdXJlIGNvZGVcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIShkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSB8fAorICAgICAgICBkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfU1BBV05fQ0hJTERfRVhJVEVEKSkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk5vdCBleHBlY3RpbmcgZXJyb3Igd2hlbiBsYXVuY2hpbmcgZXhpdGluZyBleGVjdXRhYmxlOiAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICBlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfc3Bhd25fYW5kX2tpbGwgKHZvaWQgKmRhdGEpCit7CisgIGNoYXIgKmFyZ3ZbNF0gPSB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKyAgREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciA9IE5VTEw7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgREJ1c1N0cmluZyBhcmd2MDsKKworICAvKioqIFRlc3QgbGF1bmNoaW5nIHNsZWVwaW5nIGJpbmFyeSB0aGVuIGtpbGxpbmcgaXQgKi8KKworICBhcmd2WzBdID0gZ2V0X3Rlc3RfZXhlYyAoInRlc3Qtc2xlZXAtZm9yZXZlciIsICZhcmd2MCk7CisKKyAgaWYgKGFyZ3ZbMF0gPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBPT00gd2FzIHNpbXVsYXRlZCwgbmV2ZXIgbWluZCAqLworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmIChfZGJ1c19zcGF3bl9hc3luY193aXRoX2JhYnlzaXR0ZXIgKCZzaXR0ZXIsIGFyZ3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfYmFieXNpdHRlcl9raWxsX2NoaWxkIChzaXR0ZXIpOworICAgICAgCisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX2Jsb2NrX2Zvcl9jaGlsZF9leGl0IChzaXR0ZXIpOworICAgICAgCisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX3NldF9jaGlsZF9leGl0X2Vycm9yIChzaXR0ZXIsICZlcnJvcik7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlICgmYXJndjApOworCisgIGlmIChzaXR0ZXIpCisgICAgX2RidXNfYmFieXNpdHRlcl91bnJlZiAoc2l0dGVyKTsKKworICBpZiAoIWRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGdldCBhbiBlcnJvciBhZnRlciBraWxsaW5nIHNwYXduZWQgYmluYXJ5XG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCEoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkgfHwKKyAgICAgICAgZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX1NJR05BTEVEKSkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk5vdCBleHBlY3RpbmcgZXJyb3Igd2hlbiBraWxsaW5nIGV4ZWN1dGFibGU6ICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX3NwYXduX3Rlc3QgKGNvbnN0IGNoYXIgKnRlc3RfZGF0YV9kaXIpCit7CisgIGlmICghX2RidXNfdGVzdF9vb21faGFuZGxpbmcgKCJzcGF3bl9ub25leGlzdGVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3NwYXduX25vbmV4aXN0ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c190ZXN0X29vbV9oYW5kbGluZyAoInNwYXduX3NlZ2ZhdWx0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfc3Bhd25fc2VnZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nICgic3Bhd25fZXhpdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3NwYXduX2V4aXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nICgic3Bhd25fYW5kX2tpbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19zcGF3bl9hbmRfa2lsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLXNwYXduLmggYi9kYnVzL2RidXMvZGJ1cy1zcGF3bi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ODE0ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1zcGF3bi5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zcGF3bi5oIFdyYXBwZXIgYXJvdW5kIGZvcmsvZXhlYworICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfU1BBV05fSAorI2RlZmluZSBEQlVTX1NQQVdOX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZXJyb3JzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXdhdGNoLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKwordHlwZWRlZiB2b2lkICgqIERCdXNTcGF3bkNoaWxkU2V0dXBGdW5jKSAodm9pZCAqdXNlcl9kYXRhKTsKKwordHlwZWRlZiBzdHJ1Y3QgREJ1c0JhYnlzaXR0ZXIgREJ1c0JhYnlzaXR0ZXI7CisKK3R5cGVkZWYgdm9pZCAoKiBEQnVzQmFieXNpdHRlckZpbmlzaGVkRnVuYykgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqdXNlcl9kYXRhKTsKKworZGJ1c19ib29sX3QgX2RidXNfc3Bhd25fYXN5bmNfd2l0aF9iYWJ5c2l0dGVyICAgICAoREJ1c0JhYnlzaXR0ZXIgICAgICAgICAgICoqc2l0dGVyX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgKiphcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICoqZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NwYXduQ2hpbGRTZXR1cEZ1bmMgICAgY2hpbGRfc2V0dXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICAgICplcnJvcik7Cit2b2lkICAgICAgICBfZGJ1c19iYWJ5c2l0dGVyX3NldF9yZXN1bHRfZnVuY3Rpb24gIChEQnVzQmFieXNpdHRlciAgICAgICAgICAgICpzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQmFieXNpdHRlckZpbmlzaGVkRnVuYyBmaW5pc2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSk7CitEQnVzQmFieXNpdHRlciogX2RidXNfYmFieXNpdHRlcl9yZWYgICAgICAgICAgICAgIChEQnVzQmFieXNpdHRlciAgICAgICAgICAgICpzaXR0ZXIpOwordm9pZCAgICAgICAgX2RidXNfYmFieXNpdHRlcl91bnJlZiAgICAgICAgICAgICAgICAoREJ1c0JhYnlzaXR0ZXIgICAgICAgICAgICAqc2l0dGVyKTsKK3ZvaWQgICAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfa2lsbF9jaGlsZCAgICAgICAgICAgKERCdXNCYWJ5c2l0dGVyICAgICAgICAgICAgKnNpdHRlcik7CitkYnVzX2Jvb2xfdCBfZGJ1c19iYWJ5c2l0dGVyX2dldF9jaGlsZF9leGl0ZWQgICAgIChEQnVzQmFieXNpdHRlciAgICAgICAgICAgICpzaXR0ZXIpOwordm9pZCAgICAgICAgX2RidXNfYmFieXNpdHRlcl9zZXRfY2hpbGRfZXhpdF9lcnJvciAoREJ1c0JhYnlzaXR0ZXIgICAgICAgICAgICAqc2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdF9zdGF0dXMgKERCdXNCYWJ5c2l0dGVyICAgICAgICAgICAqc2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAqc3RhdHVzKTsKK2RidXNfYm9vbF90IF9kYnVzX2JhYnlzaXR0ZXJfc2V0X3dhdGNoX2Z1bmN0aW9ucyAgKERCdXNCYWJ5c2l0dGVyICAgICAgICAgICAgKnNpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBZGRXYXRjaEZ1bmN0aW9uICAgICAgIGFkZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNSZW1vdmVXYXRjaEZ1bmN0aW9uICAgIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaFRvZ2dsZWRGdW5jdGlvbiAgIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfU1BBV05fSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtc3RyaW5nLXByaXZhdGUuaCBiL2RidXMvZGJ1cy9kYnVzLXN0cmluZy1wcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU2ZGU5MAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXN0cmluZy1wcml2YXRlLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zdHJpbmctcHJpdmF0ZS5oIFN0cmluZyB1dGlsaXR5IGNsYXNzIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19TVFJJTkdfUFJJVkFURV9ICisjZGVmaW5lIERCVVNfU1RSSU5HX1BSSVZBVEVfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tZW1vcnkuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKworI2lmbmRlZiBEQlVTX0NBTl9VU0VfREJVU19TVFJJTkdfUFJJVkFURQorI2Vycm9yICJEb24ndCBnbyBpbmNsdWRpbmcgZGJ1cy1zdHJpbmctcHJpdmF0ZS5oIGZvciBubyBnb29kIHJlYXNvbiIKKyNlbmRpZgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogQGJyaWVmIEludGVybmFscyBvZiBEQnVzU3RyaW5nLgorICogCisgKiBEQnVzU3RyaW5nIGludGVybmFscy4gREJ1c1N0cmluZyBpcyBhbiBvcGFxdWUgb2JqZWN0cywgaXQgbXVzdCBiZQorICogdXNlZCB2aWEgYWNjZXNzb3IgZnVuY3Rpb25zLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICB1bnNpZ25lZCBjaGFyICpzdHI7ICAgICAgICAgICAgLyoqPCBTdHJpbmcgZGF0YSwgcGx1cyBudWwgdGVybWluYXRpb24gKi8KKyAgaW50ICAgICAgICAgICAgbGVuOyAgICAgICAgICAgIC8qKjwgTGVuZ3RoIHdpdGhvdXQgbnVsICovCisgIGludCAgICAgICAgICAgIGFsbG9jYXRlZDsgICAgICAvKio8IEFsbG9jYXRlZCBzaXplIG9mIGRhdGEgKi8KKyAgdW5zaWduZWQgaW50ICAgY29uc3RhbnQgOiAxOyAgIC8qKjwgU3RyaW5nIGRhdGEgaXMgbm90IG93bmVkIGJ5IERCdXNTdHJpbmcgKi8KKyAgdW5zaWduZWQgaW50ICAgbG9ja2VkIDogMTsgICAgIC8qKjwgREJ1c1N0cmluZyBoYXMgYmVlbiBsb2NrZWQgYW5kIGNhbid0IGJlIGNoYW5nZWQgKi8KKyAgdW5zaWduZWQgaW50ICAgaW52YWxpZCA6IDE7ICAgIC8qKjwgREJ1c1N0cmluZyBpcyBpbnZhbGlkIChlLmcuIGFscmVhZHkgZnJlZWQpICovCisgIHVuc2lnbmVkIGludCAgIGFsaWduX29mZnNldCA6IDM7IC8qKjwgc3RyIC0gYWxpZ25fb2Zmc2V0IGlzIHRoZSBhY3R1YWwgbWFsbG9jIGJsb2NrICovCit9IERCdXNSZWFsU3RyaW5nOworCitfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKERCdXNSZWFsU3RyaW5nKSA9PSBzaXplb2YgKERCdXNTdHJpbmcpKTsKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1N0cmluZ0ludGVybmFscyBEQnVzU3RyaW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgREJ1c1N0cmluZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKgorICogVGhlIGd1dHMgb2YgREJ1c1N0cmluZy4KKyAqCisgKiBAeworICovCisKKy8qKgorICogVGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgREJ1c1N0cmluZworICovCisjZGVmaW5lIF9EQlVTX1NUUklOR19NQVhfTEVOR1RIIChfREJVU19JTlQzMl9NQVggLSBfREJVU19TVFJJTkdfQUxMT0NBVElPTl9QQURESU5HKQorCisvKioKKyAqIENoZWNrcyBhIGJ1bmNoIG9mIGFzc2VydGlvbnMgYWJvdXQgYSBzdHJpbmcgb2JqZWN0CisgKgorICogQHBhcmFtIHJlYWwgdGhlIERCdXNSZWFsU3RyaW5nCisgKi8KKyNkZWZpbmUgREJVU19HRU5FUklDX1NUUklOR19QUkVBTUJMRShyZWFsKSBcCisgIGRvIHsgXAorICAgICAgKHZvaWQpIHJlYWw7IC8qIG1pZ2h0IGJlIHVudXNlZCB1bmxlc3MgYXNzZXJ0aW5nICovIFwKKyAgICAgIF9kYnVzX2Fzc2VydCAoKHJlYWwpICE9IE5VTEwpOyBcCisgICAgICBfZGJ1c19hc3NlcnQgKCEocmVhbCktPmludmFsaWQpOyBcCisgICAgICBfZGJ1c19hc3NlcnQgKChyZWFsKS0+bGVuID49IDApOyBcCisgICAgICBfZGJ1c19hc3NlcnQgKChyZWFsKS0+YWxsb2NhdGVkID49IDApOyBcCisgICAgICBfZGJ1c19hc3NlcnQgKChyZWFsKS0+bGVuIDw9ICgocmVhbCktPmFsbG9jYXRlZCAtIF9EQlVTX1NUUklOR19BTExPQ0FUSU9OX1BBRERJTkcpKTsgXAorICAgICAgX2RidXNfYXNzZXJ0ICgocmVhbCktPmxlbiA8PSBfREJVU19TVFJJTkdfTUFYX0xFTkdUSCk7IFwKKyAgfSB3aGlsZSAoMCkKKworLyoqCisgKiBDaGVja3MgYXNzZXJ0aW9ucyBhYm91dCBhIHN0cmluZyBvYmplY3QgdGhhdCBuZWVkcyB0byBiZQorICogbW9kaWZpYWJsZSAtIG1heSBub3QgYmUgbG9ja2VkIG9yIGNvbnN0LiBBbHNvIGRlY2xhcmVzCisgKiB0aGUgInJlYWwiIHZhcmlhYmxlIHBvaW50aW5nIHRvIERCdXNSZWFsU3RyaW5nLiAKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICovCisjZGVmaW5lIERCVVNfU1RSSU5HX1BSRUFNQkxFKHN0cikgREJ1c1JlYWxTdHJpbmcgKnJlYWwgPSAoREJ1c1JlYWxTdHJpbmcqKSBzdHI7IFwKKyAgREJVU19HRU5FUklDX1NUUklOR19QUkVBTUJMRSAocmVhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfZGJ1c19hc3NlcnQgKCEocmVhbCktPmNvbnN0YW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9kYnVzX2Fzc2VydCAoIShyZWFsKS0+bG9ja2VkKQorCisvKioKKyAqIENoZWNrcyBhc3NlcnRpb25zIGFib3V0IGEgc3RyaW5nIG9iamVjdCB0aGF0IG1heSBiZSBsb2NrZWQgYnV0CisgKiBjYW4ndCBiZSBjb25zdC4gaS5lLiBhIHN0cmluZyBvYmplY3QgdGhhdCB3ZSBjYW4gZnJlZS4gIEFsc28KKyAqIGRlY2xhcmVzIHRoZSAicmVhbCIgdmFyaWFibGUgcG9pbnRpbmcgdG8gREJ1c1JlYWxTdHJpbmcuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKi8KKyNkZWZpbmUgREJVU19MT0NLRURfU1RSSU5HX1BSRUFNQkxFKHN0cikgREJ1c1JlYWxTdHJpbmcgKnJlYWwgPSAoREJ1c1JlYWxTdHJpbmcqKSBzdHI7IFwKKyAgREJVU19HRU5FUklDX1NUUklOR19QUkVBTUJMRSAocmVhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX2RidXNfYXNzZXJ0ICghKHJlYWwpLT5jb25zdGFudCkKKworLyoqCisgKiBDaGVja3MgYXNzZXJ0aW9ucyBhYm91dCBhIHN0cmluZyB0aGF0IG1heSBiZSBjb25zdCBvciBsb2NrZWQuICBBbHNvCisgKiBkZWNsYXJlcyB0aGUgInJlYWwiIHZhcmlhYmxlIHBvaW50aW5nIHRvIERCdXNSZWFsU3RyaW5nLgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nLgorICovCisjZGVmaW5lIERCVVNfQ09OU1RfU1RSSU5HX1BSRUFNQkxFKHN0cikgY29uc3QgREJ1c1JlYWxTdHJpbmcgKnJlYWwgPSAoREJ1c1JlYWxTdHJpbmcqKSBzdHI7IFwKKyAgREJVU19HRU5FUklDX1NUUklOR19QUkVBTUJMRSAocmVhbCkKKworLyoqCisgKiBDaGVja3MgZm9yIEFTQ0lJIGJsYW5rIGJ5dGUKKyAqIEBwYXJhbSBjIHRoZSBieXRlCisgKi8KKyNkZWZpbmUgREJVU19JU19BU0NJSV9CTEFOSyhjKSAoKGMpID09ICcgJyB8fCAoYykgPT0gJ1x0JykKKworLyoqCisgKiBDaGVja3MgZm9yIEFTQ0lJIHdoaXRlc3BhY2UgYnl0ZQorICogQHBhcmFtIGMgdGhlIGJ5dGUKKyAqLworI2RlZmluZSBEQlVTX0lTX0FTQ0lJX1dISVRFKGMpICgoYykgPT0gJyAnIHx8IChjKSA9PSAnXHQnIHx8IChjKSA9PSAnXG4nIHx8IChjKSA9PSAnXHInKQorCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfU1RSSU5HX1BSSVZBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtc3RyaW5nLXV0aWwuYyBiL2RidXMvZGJ1cy9kYnVzLXN0cmluZy11dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIyNTgwZAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXN0cmluZy11dGlsLmMKQEAgLTAsMCArMSw5MzggQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zdHJpbmctdXRpbC5jIFdvdWxkIGJlIGluIGRidXMtc3RyaW5nLmMsIGJ1dCBub3QgdXNlZCBpbiBsaWJkYnVzCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmFsZiBIYWJhY2tlciA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorI2RlZmluZSBEQlVTX0NBTl9VU0VfREJVU19TVFJJTkdfUFJJVkFURSAxCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmctcHJpdmF0ZS5oIgorCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNTdHJpbmcKKyAqIEB7CisgKi8KKworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgYSBzdHJpbmcgZW5kcyB3aXRoIHRoZSBnaXZlbiBzdWZmaXgKKyAqCisgKiBAdG9kbyBtZW1jbXAgbWlnaHQgbWFrZSB0aGlzIGZhc3Rlci4KKyAqIAorICogQHBhcmFtIGEgdGhlIHN0cmluZworICogQHBhcmFtIGNfc3RyIHRoZSBDLXN0eWxlIHN0cmluZworICogQHJldHVybnMgI1RSVUUgaWYgdGhlIHN0cmluZyBlbmRzIHdpdGggdGhlIHN1ZmZpeAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2VuZHNfd2l0aF9jX3N0ciAoY29uc3QgREJ1c1N0cmluZyAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmNfc3RyKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICphcDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYnA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFfZW5kOworICB1bnNpZ25lZCBsb25nIGNfc3RyX2xlbjsKKyAgY29uc3QgREJ1c1JlYWxTdHJpbmcgKnJlYWxfYSA9IChjb25zdCBEQnVzUmVhbFN0cmluZyopIGE7CisgIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgKHJlYWxfYSk7CisgIF9kYnVzX2Fzc2VydCAoY19zdHIgIT0gTlVMTCk7CisgIAorICBjX3N0cl9sZW4gPSBzdHJsZW4gKGNfc3RyKTsKKyAgaWYgKCgodW5zaWduZWQgbG9uZylyZWFsX2EtPmxlbikgPCBjX3N0cl9sZW4pCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgYXAgPSByZWFsX2EtPnN0ciArIChyZWFsX2EtPmxlbiAtIGNfc3RyX2xlbik7CisgIGJwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBjX3N0cjsKKyAgYV9lbmQgPSByZWFsX2EtPnN0ciArIHJlYWxfYS0+bGVuOworICB3aGlsZSAoYXAgIT0gYV9lbmQpCisgICAgeworICAgICAgaWYgKCphcCAhPSAqYnApCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgKythcDsKKyAgICAgICsrYnA7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoKmFwID09ICdcMCcpOworICBfZGJ1c19hc3NlcnQgKCpicCA9PSAnXDAnKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEZpbmQgdGhlIGdpdmVuIGJ5dGUgc2Nhbm5pbmcgYmFja3dhcmQgZnJvbSB0aGUgZ2l2ZW4gc3RhcnQuCisgKiBTZXRzICpmb3VuZCB0byAtMSBpZiB0aGUgYnl0ZSBpcyBub3QgZm91bmQuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgdGhlIHBsYWNlIHRvIHN0YXJ0IHNjYW5uaW5nICh3aWxsIG5vdCBmaW5kIHRoZSBieXRlIGF0IHRoaXMgcG9pbnQpCisgKiBAcGFyYW0gYnl0ZSB0aGUgYnl0ZSB0byBmaW5kCisgKiBAcGFyYW0gZm91bmQgcmV0dXJuIGxvY2F0aW9uIGZvciB3aGVyZSBpdCB3YXMgZm91bmQKKyAqIEByZXR1cm5zICNUUlVFIGlmIGZvdW5kCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfZmluZF9ieXRlX2JhY2t3YXJkIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIGJ5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqZm91bmQpCit7CisgIGludCBpOworICBEQlVTX0NPTlNUX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSByZWFsLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ID49IDApOworICBfZGJ1c19hc3NlcnQgKGZvdW5kICE9IE5VTEwpOworCisgIGkgPSBzdGFydCAtIDE7CisgIHdoaWxlIChpID49IDApCisgICAgeworICAgICAgaWYgKHJlYWwtPnN0cltpXSA9PSBieXRlKQorICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgLS1pOworICAgIH0KKworICBpZiAoZm91bmQpCisgICAgKmZvdW5kID0gaTsKKworICByZXR1cm4gaSA+PSAwOworfQorCisvKiogQH0gKi8KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgdm9pZAordGVzdF9oZXhfcm91bmR0cmlwIChjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLAorICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBsZW4pCit7CisgIERCdXNTdHJpbmcgb3JpZzsKKyAgREJ1c1N0cmluZyBlbmNvZGVkOworICBEQnVzU3RyaW5nIGRlY29kZWQ7CisgIGludCBlbmQ7CisKKyAgaWYgKGxlbiA8IDApCisgICAgbGVuID0gc3RybGVuIChkYXRhKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZvcmlnKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgaW5pdCBzdHJpbmciKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZW5jb2RlZCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGluaXQgc3RyaW5nIik7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZGVjb2RlZCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGluaXQgc3RyaW5nIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2xlbiAoJm9yaWcsIGRhdGEsIGxlbikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgYXBwZW5kIG9yaWcgZGF0YSIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2hleF9lbmNvZGUgKCZvcmlnLCAwLCAmZW5jb2RlZCwgMCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGVuY29kZSIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2hleF9kZWNvZGUgKCZlbmNvZGVkLCAwLCAmZW5kLCAmZGVjb2RlZCwgMCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGRlY29kZSIpOworICAgIAorICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmZW5jb2RlZCkgPT0gZW5kKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbCAoJm9yaWcsICZkZWNvZGVkKSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpzOworICAgICAgCisgICAgICBwcmludGYgKCJPcmlnaW5hbCBzdHJpbmcgJWQgYnl0ZXMgZW5jb2RlZCAlZCBieXRlcyBkZWNvZGVkICVkIGJ5dGVzXG4iLAorICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm9yaWcpLAorICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmVuY29kZWQpLAorICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmRlY29kZWQpKTsKKyAgICAgIHByaW50ZiAoIk9yaWdpbmFsOiAlc1xuIiwgZGF0YSk7CisgICAgICBzID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZGVjb2RlZCk7CisgICAgICBwcmludGYgKCJEZWNvZGVkOiAlc1xuIiwgcyk7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvcmlnaW5hbCBzdHJpbmcgbm90IHRoZSBzYW1lIGFzIHN0cmluZyBkZWNvZGVkIGZyb20gaGV4Iik7CisgICAgfQorICAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZvcmlnKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZlbmNvZGVkKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkZWNvZGVkKTsgIAorfQorCit0eXBlZGVmIHZvaWQgKCogVGVzdFJvdW5kdHJpcEZ1bmMpIChjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgbGVuKTsKK3N0YXRpYyB2b2lkCit0ZXN0X3JvdW5kdHJpcHMgKFRlc3RSb3VuZHRyaXBGdW5jIGZ1bmMpCit7CisgICgqIGZ1bmMpICgiSGVsbG8gdGhpcyBpcyBhIHN0cmluZ1xuIiwgLTEpOworICAoKiBmdW5jKSAoIkhlbGxvIHRoaXMgaXMgYSBzdHJpbmdcbjEiLCAtMSk7CisgICgqIGZ1bmMpICgiSGVsbG8gdGhpcyBpcyBhIHN0cmluZ1xuMTIiLCAtMSk7CisgICgqIGZ1bmMpICgiSGVsbG8gdGhpcyBpcyBhIHN0cmluZ1xuMTIzIiwgLTEpOworICAoKiBmdW5jKSAoIkhlbGxvIHRoaXMgaXMgYSBzdHJpbmdcbjEyMzQiLCAtMSk7CisgICgqIGZ1bmMpICgiSGVsbG8gdGhpcyBpcyBhIHN0cmluZ1xuMTIzNDUiLCAtMSk7CisgICgqIGZ1bmMpICgiIiwgMCk7CisgICgqIGZ1bmMpICgiMSIsIDEpOworICAoKiBmdW5jKSAoIjEyIiwgMik7CisgICgqIGZ1bmMpICgiMTIzIiwgMyk7CisgICgqIGZ1bmMpICgiMTIzNCIsIDQpOworICAoKiBmdW5jKSAoIjEyMzQ1IiwgNSk7CisgICgqIGZ1bmMpICgiIiwgMSk7CisgICgqIGZ1bmMpICgiMSIsIDIpOworICAoKiBmdW5jKSAoIjEyIiwgMyk7CisgICgqIGZ1bmMpICgiMTIzIiwgNCk7CisgICgqIGZ1bmMpICgiMTIzNCIsIDUpOworICAoKiBmdW5jKSAoIjEyMzQ1IiwgNik7CisgIHsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1Zls1MTJdOworICAgIGludCBpOworICAgIAorICAgIGkgPSAwOworICAgIHdoaWxlIChpIDwgX0RCVVNfTl9FTEVNRU5UUyAoYnVmKSkKKyAgICAgIHsKKyAgICAgICAgYnVmW2ldID0gaTsKKyAgICAgICAgKytpOworICAgICAgfQorICAgIGkgPSAwOworICAgIHdoaWxlIChpIDwgX0RCVVNfTl9FTEVNRU5UUyAoYnVmKSkKKyAgICAgIHsKKyAgICAgICAgKCogZnVuYykgKGJ1ZiwgaSk7CisgICAgICAgICsraTsKKyAgICAgIH0KKyAgfQorfQorCisvKioKKyAqIEBpbmdyb3VwIERCdXNTdHJpbmdJbnRlcm5hbHMKKyAqIFVuaXQgdGVzdCBmb3IgREJ1c1N0cmluZy4KKyAqCisgKiBAdG9kbyBOZWVkIHRvIHdyaXRlIHRlc3RzIGZvciBfZGJ1c19zdHJpbmdfY29weSgpIGFuZAorICogX2RidXNfc3RyaW5nX21vdmUoKSBtb3ZpbmcgdG8vZnJvbSBlYWNoIG9mIHN0YXJ0L21pZGRsZS9lbmQgb2YgYQorICogc3RyaW5nLiBBbHNvIG5lZWQgdGVzdHMgZm9yIF9kYnVzX3N0cmluZ19tb3ZlX2xlbiAoKQorICogCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX3Rlc3QgKHZvaWQpCit7CisgIERCdXNTdHJpbmcgc3RyOworICBEQnVzU3RyaW5nIG90aGVyOworICBpbnQgaSwgYSwgZW5kOworICBsb25nIHY7CisgIGludCBsZW5zW10gPSB7IDAsIDEsIDIsIDMsIDQsIDUsIDEwLCAxNiwgMTcsIDE4LCAyNSwgMzEsIDMyLCAzMywgMzQsIDM1LCA2MywgNjQsIDY1LCA2NiwgNjcsIDY4LCA2OSwgNzAsIDcxLCAxMjcsIDEyOCwgMTI5LCAxMzAsIDEzMSwgMTMyLCAxMzMsIDEzNCwgMTM1LCAxMzYgfTsKKyAgY2hhciAqczsKKworICAvKiBUZXN0IHNob3J0ZW5pbmcgYW5kIHNldHRpbmcgbGVuZ3RoICovCisgIGkgPSAwOworICB3aGlsZSAoaSA8IF9EQlVTX05fRUxFTUVOVFMgKGxlbnMpKQorICAgIHsKKyAgICAgIGludCBqOworICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGluaXQgc3RyaW5nIik7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZzdHIsIGxlbnNbaV0pKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gc2V0IHN0cmluZyBsZW5ndGgiKTsKKworICAgICAgaiA9IGxlbnNbaV07CisgICAgICB3aGlsZSAoaiA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA9PSBqKTsKKyAgICAgICAgICBpZiAoaiA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19zaG9ydGVuICgmc3RyLCAxKTsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPT0gKGogLSAxKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgLS1qOworICAgICAgICB9CisgICAgICAKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKworICAgICAgKytpOworICAgIH0KKworICAvKiBUZXN0IGVxdWFsaXR5ICovCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgIkhlbGxvIFdvcmxkIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZvdGhlciwgIkgiKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmc3RyLCAwLCAxLCAmb3RoZXIsIDApKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmc3RyLCAxLCAwLCAmb3RoZXIsIDEpKTsKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZvdGhlciwgIkhlbGxvIik7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoJnN0ciwgMCwgNSwgJm90aGVyLCAwKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoJnN0ciwgMSwgNCwgJm90aGVyLCAxKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoJnN0ciwgMiwgMywgJm90aGVyLCAyKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoJnN0ciwgMywgMiwgJm90aGVyLCAzKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoJnN0ciwgNCwgMSwgJm90aGVyLCA0KSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoJnN0ciwgNSwgMCwgJm90aGVyLCA1KSk7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmb3RoZXIsIDAsIDUsICZzdHIsIDApKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmb3RoZXIsIDEsIDQsICZzdHIsIDEpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmb3RoZXIsIDIsIDMsICZzdHIsIDIpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmb3RoZXIsIDMsIDIsICZzdHIsIDMpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmb3RoZXIsIDQsIDEsICZzdHIsIDQpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmb3RoZXIsIDUsIDAsICZzdHIsIDUpKTsKKworICAKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZvdGhlciwgIldvcmxkIik7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoJnN0ciwgNiwgIDUsICZvdGhlciwgMCkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZzdHIsIDcsICA0LCAmb3RoZXIsIDEpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmc3RyLCA4LCAgMywgJm90aGVyLCAyKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoJnN0ciwgOSwgIDIsICZvdGhlciwgMykpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZzdHIsIDEwLCAxLCAmb3RoZXIsIDQpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmc3RyLCAxMSwgMCwgJm90aGVyLCA1KSk7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmb3RoZXIsIDAsIDUsICZzdHIsIDYpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmb3RoZXIsIDEsIDQsICZzdHIsIDcpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmb3RoZXIsIDIsIDMsICZzdHIsIDgpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmb3RoZXIsIDMsIDIsICZzdHIsIDkpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmb3RoZXIsIDQsIDEsICZzdHIsIDEwKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoJm90aGVyLCA1LCAwLCAmc3RyLCAxMSkpOworICAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICAKKyAgLyogVGVzdCBhcHBlbmRpbmcgZGF0YSAqLworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gaW5pdCBzdHJpbmciKTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAxMCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICJhIikpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBhcHBlbmQgc3RyaW5nIHRvIHN0cmluZ1xuIik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IGkgKiAyICsgMSk7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmc3RyLCAnYicpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gYXBwZW5kIGJ5dGUgdG8gc3RyaW5nXG4iKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPT0gaSAqIDIgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKworICAvKiBDaGVjayBzdGVhbF9kYXRhICovCisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gaW5pdCBzdHJpbmciKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICJIZWxsbyBXb3JsZCIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhcHBlbmQgdG8gc3RyaW5nIik7CisKKyAgaSA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgKCZzdHIsICZzKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gc3RlYWwgZGF0YSIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IDApOworICBfZGJ1c19hc3NlcnQgKCgoaW50KXN0cmxlbiAocykpID09IGkpOworCisgIGRidXNfZnJlZSAocyk7CisKKyAgLyogQ2hlY2sgbW92ZSAqLworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiSGVsbG8gV29ybGQiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgYXBwZW5kIHRvIHN0cmluZyIpOworCisgIGkgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJm90aGVyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgaW5pdCBzdHJpbmciKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX21vdmUgKCZzdHIsIDAsICZvdGhlciwgMCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IG1vdmUiKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA9PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSA9PSBpKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICJIZWxsbyBXb3JsZCIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhcHBlbmQgdG8gc3RyaW5nIik7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19tb3ZlICgmc3RyLCAwLCAmb3RoZXIsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgbW92ZSIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IDApOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpID09IGkgKiAyKTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgIkhlbGxvIFdvcmxkIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFwcGVuZCB0byBzdHJpbmciKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX21vdmUgKCZzdHIsIDAsICZvdGhlciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvdGhlcikgLyAyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgbW92ZSIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IDApOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpID09IGkgKiAzKTsKKyAgCisgIF9kYnVzX3N0cmluZ19mcmVlICgmb3RoZXIpOworCisgIC8qIENoZWNrIGNvcHkgKi8KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgIkhlbGxvIFdvcmxkIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFwcGVuZCB0byBzdHJpbmciKTsKKworICBpID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJm90aGVyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgaW5pdCBzdHJpbmciKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZzdHIsIDAsICZvdGhlciwgMCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGNvcHkiKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA9PSBpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSA9PSBpKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmc3RyLCAwLCAmb3RoZXIsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgY29weSIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IGkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpID09IGkgKiAyKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxsbyBXb3JsZEhlbGxvIFdvcmxkIikpOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZzdHIsIDAsICZvdGhlciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvdGhlcikgLyAyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgY29weSIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IGkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpID09IGkgKiAzKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxsbyBXb3JsZEhlbGxvIFdvcmxkSGVsbG8gV29ybGQiKSk7CisgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmb3RoZXIpOworCisgIC8qIENoZWNrIHJlcGxhY2UgKi8KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gaW5pdCBzdHJpbmciKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgIkhlbGxvIFdvcmxkIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFwcGVuZCB0byBzdHJpbmciKTsKKworICBpID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJm90aGVyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgaW5pdCBzdHJpbmciKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX3JlcGxhY2VfbGVuICgmc3RyLCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3RoZXIsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgcmVwbGFjZSIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IGkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpID09IGkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJm90aGVyLCAiSGVsbG8gV29ybGQiKSk7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19yZXBsYWNlX2xlbiAoJnN0ciwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm90aGVyLCA1LCAxKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgcmVwbGFjZSBjZW50ZXIgc3BhY2UiKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA9PSBpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSA9PSBpICogMiAtIDEpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJm90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbGxvSGVsbG8gV29ybGRXb3JsZCIpKTsKKworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfcmVwbGFjZV9sZW4gKCZzdHIsIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgcmVwbGFjZSBlbmQgY2hhcmFjdGVyIik7CisgIAorICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA9PSBpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSA9PSBpICogMiAtIDEpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJm90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbGxvSGVsbG8gV29ybGRXb3JsZSIpKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmb3RoZXIpOworCisgIC8qIERpZmZlcmVudCB0ZXN0cyBhcmUgcHJvdmlkZWQgYmVjYXVzZSBkaWZmZXJlbnQgYmVoYXZpb3VycyBhcmUKKyAgICogaW1wbGVtZW50ZWQgaW4gX2RidXNfc3RyaW5nX3JlcGxhY2VfbGVuKCkgaW4gZnVuY3Rpb24gb2YgcmVwbGFjaW5nIGFuZAorICAgKiByZXBsYWNlZCBsZW5ndGhzCisgICAqLworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBpbml0IHN0cmluZyIpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiSGVsbG8gV29ybGQiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgYXBwZW5kIHRvIHN0cmluZyIpOworCisgIGkgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cik7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmb3RoZXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBpbml0IHN0cmluZyIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJm90aGVyLCAiRm9vIFN0cmluZyIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhcHBlbmQgdG8gc3RyaW5nIik7CisKKyAgYSA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpOworCisgIGlmICghX2RidXNfc3RyaW5nX3JlcGxhY2VfbGVuICgmc3RyLCAwLCA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm90aGVyLCA0LCAwKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgcmVwbGFjZSAwIGxlbmd0aCIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IGkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpID09IGEgKyA2KTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb28gSGVsbG8gU3RyaW5nIikpOworCisgIGlmICghX2RidXNfc3RyaW5nX3JlcGxhY2VfbGVuICgmc3RyLCA1LCA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvdGhlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgcmVwbGFjZSBhdCB0aGUgZW5kIik7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPT0gaSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvdGhlcikgPT0gYSArIDYgKyA2KTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb28gSGVsbG8gU3RyaW5nIFdvcmxkIikpOworCisgIGlmICghX2RidXNfc3RyaW5nX3JlcGxhY2VfbGVuICgmc3RyLCAwLCA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvdGhlcikgLSA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IHJlcGxhY2Ugc2FtZSBsZW5ndGgiKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA9PSBpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSA9PSBhICsgNiArIDYpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJm90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvbyBIZWxsbyBTdHJpbmcgSGVsbG8iKSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfcmVwbGFjZV9sZW4gKCZzdHIsIDYsIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3RoZXIsIDQsIDEyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgcmVwbGFjZSB3aXRoIHNob3J0ZXIgc3RyaW5nIik7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPT0gaSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvdGhlcikgPT0gYSArIDUpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJm90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvbyBXb3JsZCBIZWxsbyIpKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19yZXBsYWNlX2xlbiAoJnN0ciwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdGhlciwgMCwgMykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IHJlcGxhY2UgYXQgdGhlIGJlZ2lubmluZyIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IGkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpID09IGEgKyAzKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIIFdvcmxkIEhlbGxvIikpOworCisgIGlmICghX2RidXNfc3RyaW5nX3JlcGxhY2VfbGVuICgmc3RyLCA2LCA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvdGhlcikgLSA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IHJlcGxhY2Ugc2FtZSBsZW5ndGgiKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA9PSBpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSA9PSBhICsgMyk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSCBXb3JsZCBXb3JsZCIpKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmb3RoZXIpOworCisgIC8qIENoZWNrIGluc2VydC9zZXQvZ2V0IGJ5dGUgKi8KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBpbml0IHN0cmluZyIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgIkhlbGxvIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGFwcGVuZCBIZWxsbyIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9ieXRlICgmc3RyLCAwKSA9PSAnSCcpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnN0ciwgMSkgPT0gJ2UnKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZzdHIsIDIpID09ICdsJyk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9ieXRlICgmc3RyLCAzKSA9PSAnbCcpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnN0ciwgNCkgPT0gJ28nKTsKKworICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKCZzdHIsIDEsICdxJyk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9ieXRlICgmc3RyLCAxKSA9PSAncScpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luc2VydF9ieXRlcyAoJnN0ciwgMCwgMSwgMjU1KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjYW4ndCBpbnNlcnQgYnl0ZSIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luc2VydF9ieXRlcyAoJnN0ciwgMiwgNCwgJ1onKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjYW4ndCBpbnNlcnQgYnl0ZSIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luc2VydF9ieXRlcyAoJnN0ciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpLCAxLCAnVycpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNhbid0IGluc2VydCBieXRlIik7CisgIAorICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnN0ciwgMCkgPT0gMjU1KTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZzdHIsIDEpID09ICdIJyk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9ieXRlICgmc3RyLCAyKSA9PSAnWicpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnN0ciwgMykgPT0gJ1onKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZzdHIsIDQpID09ICdaJyk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9ieXRlICgmc3RyLCA1KSA9PSAnWicpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnN0ciwgNikgPT0gJ3EnKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZzdHIsIDcpID09ICdsJyk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9ieXRlICgmc3RyLCA4KSA9PSAnbCcpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnN0ciwgOSkgPT0gJ28nKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZzdHIsIDEwKSA9PSAnVycpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgCisgIC8qIENoZWNrIGFwcGVuZC9wYXJzZSBpbnQvZG91YmxlICovCisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gaW5pdCBzdHJpbmciKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfaW50ICgmc3RyLCAyNykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGFwcGVuZCBpbnQiKTsKKworICBpID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpOworCisgIGlmICghX2RidXNfc3RyaW5nX3BhcnNlX2ludCAoJnN0ciwgMCwgJnYsICZlbmQpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBwYXJzZSBpbnQiKTsKKworICBfZGJ1c19hc3NlcnQgKHYgPT0gMjcpOworICBfZGJ1c19hc3NlcnQgKGVuZCA9PSBpKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisKKyAgLyogVGVzdCBmaW5kICovCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBpbml0IHN0cmluZyIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgIkhlbGxvIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgYXBwZW5kIHRvIHN0cmluZyIpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZCAoJnN0ciwgMCwgIkhlIiwgJmkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBmaW5kICdIZSciKTsKKyAgX2RidXNfYXNzZXJ0IChpID09IDApOworCisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmQgKCZzdHIsIDAsICJIZWxsbyIsICZpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgZmluZCAnSGVsbG8nIik7CisgIF9kYnVzX2Fzc2VydCAoaSA9PSAwKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmQgKCZzdHIsIDAsICJlbGxvIiwgJmkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBmaW5kICdlbGxvJyIpOworICBfZGJ1c19hc3NlcnQgKGkgPT0gMSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZCAoJnN0ciwgMCwgImxvIiwgJmkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBmaW5kICdsbyciKTsKKyAgX2RidXNfYXNzZXJ0IChpID09IDMpOworCisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmQgKCZzdHIsIDIsICJsbyIsICZpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgZmluZCAnbG8nIik7CisgIF9kYnVzX2Fzc2VydCAoaSA9PSAzKTsKKworICBpZiAoX2RidXNfc3RyaW5nX2ZpbmQgKCZzdHIsIDQsICJsbyIsICZpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWQgZmluZCAnbG8nIik7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19maW5kICgmc3RyLCAwLCAibCIsICZpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgZmluZCAnbCciKTsKKyAgX2RidXNfYXNzZXJ0IChpID09IDIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmQgKCZzdHIsIDAsICJIIiwgJmkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBmaW5kICdIJyIpOworICBfZGJ1c19hc3NlcnQgKGkgPT0gMCk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZCAoJnN0ciwgMCwgIiIsICZpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgZmluZCAnJyIpOworICBfZGJ1c19hc3NlcnQgKGkgPT0gMCk7CisgIAorICBpZiAoX2RidXNfc3RyaW5nX2ZpbmQgKCZzdHIsIDAsICJIZWxsbyEiLCBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJEaWQgZmluZCAnSGVsbG8hJyIpOworCisgIGlmIChfZGJ1c19zdHJpbmdfZmluZCAoJnN0ciwgMCwgIk9oLCBIZWxsbyIsIE5VTEwpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkRpZCBmaW5kICdPaCwgSGVsbG8nIik7CisgIAorICBpZiAoX2RidXNfc3RyaW5nX2ZpbmQgKCZzdHIsIDAsICJpbGwiLCBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJEaWQgZmluZCAnaWxsJyIpOworCisgIGlmIChfZGJ1c19zdHJpbmdfZmluZCAoJnN0ciwgMCwgInEiLCBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJEaWQgZmluZCAncSciKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19maW5kX3RvICgmc3RyLCAwLCAyLCAiSGUiLCBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJEaWRuJ3QgZmluZCAnSGUnIik7CisKKyAgaWYgKF9kYnVzX3N0cmluZ19maW5kX3RvICgmc3RyLCAwLCAyLCAiSGVsbG8iLCBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJEaWQgZmluZCAnSGVsbG8nIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZF9ieXRlX2JhY2t3YXJkICgmc3RyLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0ciksICdIJywgJmkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkRpZCBub3QgZmluZCAnSCciKTsKKyAgX2RidXNfYXNzZXJ0IChpID09IDApOworCisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmRfYnl0ZV9iYWNrd2FyZCAoJnN0ciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpLCAnbycsICZpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJEaWQgbm90IGZpbmQgJ28nIik7CisgIF9kYnVzX2Fzc2VydCAoaSA9PSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgLSAxKTsKKworICBpZiAoX2RidXNfc3RyaW5nX2ZpbmRfYnl0ZV9iYWNrd2FyZCAoJnN0ciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpIC0gMSwgJ28nLCAmaSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRGlkIGZpbmQgJ28nIik7CisgIF9kYnVzX2Fzc2VydCAoaSA9PSAtMSk7CisKKyAgaWYgKF9kYnVzX3N0cmluZ19maW5kX2J5dGVfYmFja3dhcmQgKCZzdHIsIDEsICdlJywgJmkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkRpZCBmaW5kICdlJyIpOworICBfZGJ1c19hc3NlcnQgKGkgPT0gLTEpOworCisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmRfYnl0ZV9iYWNrd2FyZCAoJnN0ciwgMiwgJ2UnLCAmaSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRGlkbid0IGZpbmQgJ2UnIik7CisgIF9kYnVzX2Fzc2VydCAoaSA9PSAxKTsKKyAgCisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKworICAvKiBIZXggZW5jb2RpbmcgKi8KKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsICJjYWZlYmFiZSwgdGhpcyBpcyBhIGJvZ3VzIGhleCBzdHJpbmciKTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJm90aGVyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgaW5pdCBzdHJpbmciKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19oZXhfZGVjb2RlICgmc3RyLCAwLCAmZW5kLCAmb3RoZXIsIDApKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRlY2NvZGVkIGJvZ3VzIGhleCBzdHJpbmcgd2l0aCBubyBlcnJvciIpOworCisgIF9kYnVzX2Fzc2VydCAoZW5kID09IDgpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmb3RoZXIpOworCisgIHRlc3Rfcm91bmR0cmlwcyAodGVzdF9oZXhfcm91bmR0cmlwKTsKKyAgCisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKworICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGludCBmb3VuZCwgZm91bmRfbGVuOyAgCisKKyAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgIjAxMlxyXG41NjdcbjkwIik7CisgICAgCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZF9lb2wgKCZzdHIsIDAsICZmb3VuZCwgJmZvdW5kX2xlbikgfHwgZm91bmQgIT0gMyB8fCBmb3VuZF9sZW4gIT0gMikKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkRpZCBub3QgZmluZCAnXFxyXFxuJyIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGlmIChmb3VuZCAhPSAzIHx8IGZvdW5kX2xlbiAhPSAyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnZhbGlkIHJldHVybiB2YWx1ZXMiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19maW5kX2VvbCAoJnN0ciwgNSwgJmZvdW5kLCAmZm91bmRfbGVuKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkRpZCBub3QgZmluZCAnXFxuJyIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGlmIChmb3VuZCAhPSA4IHx8IGZvdW5kX2xlbiAhPSAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnZhbGlkIHJldHVybiB2YWx1ZXMiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAKKyAgICBpZiAoX2RidXNfc3RyaW5nX2ZpbmRfZW9sICgmc3RyLCA5LCAmZm91bmQsICZmb3VuZF9sZW4pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkZvdW5kIG5vdCBleHBlY3RlZCAnXFxuJyIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGVsc2UgaWYgKGZvdW5kICE9IDExIHx8IGZvdW5kX2xlbiAhPSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnZhbGlkIHJldHVybiB2YWx1ZXMgJ1xcbiciKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgIGZvdW5kID0gLTE7CisgICAgZm91bmRfbGVuID0gLTE7CisgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsICIiKTsKKyAgICBpZiAoX2RidXNfc3RyaW5nX2ZpbmRfZW9sICgmc3RyLCAwLCAmZm91bmQsICZmb3VuZF9sZW4pKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZm91bmQgYW4gZW9sIGluIGFuIGVtcHR5IHN0cmluZyIpOworICAgIF9kYnVzX2Fzc2VydCAoZm91bmQgPT0gMCk7CisgICAgX2RidXNfYXNzZXJ0IChmb3VuZF9sZW4gPT0gMCk7CisgICAgCisgICAgZm91bmQgPSAtMTsKKyAgICBmb3VuZF9sZW4gPSAtMTsKKyAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgImZvb2JhciIpOworICAgIGlmIChfZGJ1c19zdHJpbmdfZmluZF9lb2wgKCZzdHIsIDAsICZmb3VuZCwgJmZvdW5kX2xlbikpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmb3VuZCBlb2wgaW4gc3RyaW5nIHRoYXQgbGFja3Mgb25lIik7CisgICAgX2RidXNfYXNzZXJ0IChmb3VuZCA9PSA2KTsKKyAgICBfZGJ1c19hc3NlcnQgKGZvdW5kX2xlbiA9PSAwKTsKKworICAgIGZvdW5kID0gLTE7CisgICAgZm91bmRfbGVuID0gLTE7CisgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsICJmb29iYXJcbiIpOworICAgIGlmICghX2RidXNfc3RyaW5nX2ZpbmRfZW9sICgmc3RyLCAwLCAmZm91bmQsICZmb3VuZF9sZW4pKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkIG5vdCBmaW5kIGVvbCBpbiBzdHJpbmcgdGhhdCBoYXMgb25lIGF0IGVuZCIpOworICAgIF9kYnVzX2Fzc2VydCAoZm91bmQgPT0gNik7CisgICAgX2RidXNfYXNzZXJ0IChmb3VuZF9sZW4gPT0gMSk7CisgIH0KKworICB7CisgICAgREJ1c1N0cmluZyBsaW5lOworCisjZGVmaW5lIEZJUlNUX0xJTkUgInRoaXMgaXMgYSBsaW5lIgorI2RlZmluZSBTRUNPTkRfTElORSAidGhpcyBpcyBhIHNlY29uZCBsaW5lIgorICAgIC8qIHRoaXJkIGxpbmUgaXMgZW1wdHkgKi8KKyNkZWZpbmUgVEhJUkRfTElORSAiIgorI2RlZmluZSBGT1VSVEhfTElORSAidGhpcyBpcyBhIGZvdXJ0aCBsaW5lIgorICAgIAorICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsIEZJUlNUX0xJTkUgIlxuIiBTRUNPTkRfTElORSAiXHJcbiIgVEhJUkRfTElORSAiXG4iIEZPVVJUSF9MSU5FKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworICAgIAorICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZsaW5lKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworICAgIAorICAgIGlmICghX2RidXNfc3RyaW5nX3BvcF9saW5lICgmc3RyLCAmbGluZSkpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gcG9wIGZpcnN0IGxpbmUiKTsKKworICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmbGluZSwgRklSU1RfTElORSkpOworICAgIAorICAgIGlmICghX2RidXNfc3RyaW5nX3BvcF9saW5lICgmc3RyLCAmbGluZSkpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gcG9wIHNlY29uZCBsaW5lIik7CisKKyAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJmxpbmUsIFNFQ09ORF9MSU5FKSk7CisgICAgCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfcG9wX2xpbmUgKCZzdHIsICZsaW5lKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBwb3AgdGhpcmQgbGluZSIpOworCisgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZsaW5lLCBUSElSRF9MSU5FKSk7CisgICAgCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfcG9wX2xpbmUgKCZzdHIsICZsaW5lKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBwb3AgZm91cnRoIGxpbmUiKTsKKworICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmbGluZSwgRk9VUlRIX0xJTkUpKTsKKyAgICAKKyAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZsaW5lKTsKKyAgfQorCisgIHsKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgICAgZm9yIChpID0gMDsgaSA8IDEwMDAwOyBpKyspCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZzdHIsIDEwKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBzZXQgbGVuZ3RoIik7CisKKyAgICAvKiBhY3R1YWxseSBjb21wYWN0ICovCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29tcGFjdCAoJnN0ciwgMjA0OCkpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gY29tcGFjdCBhZnRlciBzZXRfbGVuZ3RoIik7CisKKyAgICAvKiBwZWVrIGluc2lkZSB0byBtYWtlIHN1cmUgaXQgd29ya2VkICovCisgICAgaWYgKCgoREJ1c1JlYWxTdHJpbmcgKikmc3RyKS0+YWxsb2NhdGVkID4gMzApCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb21wYWN0aW5nIHN0cmluZyBkaWRuJ3QgZG8gYW55dGhpbmciKTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmc3RyLCAiYWJjZGVmZ2hpaiIpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidW5leHBlY3RlZCBjb250ZW50IGFmdGVyIGNvbXBhY3QiKTsKKworICAgIC8qIGNvbXBhY3Qgbm90aGluZyAqLworICAgIGlmICghX2RidXNfc3RyaW5nX2NvbXBhY3QgKCZzdHIsIDIwNDgpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGNvbXBhY3QgMm5kIHRpbWUiKTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmc3RyLCAiYWJjZGVmZ2hpaiIpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidW5leHBlY3RlZCBjb250ZW50IGFmdGVyIDJuZCBjb21wYWN0Iik7CisKKyAgICAvKiBhbmQgbWFrZSBzdXJlIGl0IHN0aWxsIHdvcmtzLi4uKi8KKyAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICIxMjM0NTYiKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBhcHBlbmQgYWZ0ZXIgY29tcGFjdCIpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZzdHIsICJhYmNkZWZnaGlqMTIzNDU2IikpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ1bmV4cGVjdGVkIGNvbnRlbnQgYWZ0ZXIgYXBwZW5kIik7CisKKyAgICAvKiBhZnRlciBncm93aW5nIGF1dG9tYXRpY2FsbHksIHRoaXMgc2hvdWxkIGRvIG5vdGhpbmcgKi8KKyAgICBpZiAoIV9kYnVzX3N0cmluZ19jb21wYWN0ICgmc3RyLCAyMDAwMCkpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gY29tcGFjdCBhZnRlciBncm93Iik7CisKKyAgICAvKiBidXQgdGhpcyBvbmUgd2lsbCBkbyBzb21ldGhpbmcgKi8KKyAgICBpZiAoIV9kYnVzX3N0cmluZ19jb21wYWN0ICgmc3RyLCAwKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBjb21wYWN0IGFmdGVyIGdyb3ciKTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmc3RyLCAiYWJjZGVmZ2hpajEyMzQ1NiIpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidW5leHBlY3RlZCBjb250ZW50Iik7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICIhQCMkJSIpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGFwcGVuZCBhZnRlciBjb21wYWN0Iik7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJnN0ciwgImFiY2RlZmdoaWoxMjM0NTYhQCMkJSIpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidW5leHBlY3RlZCBjb250ZW50Iik7CisKKyAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgIH0KKworICB7CisgICAgY29uc3QgY2hhciB0d29fc3RyaW5nc1tdID0gIm9uZVx0dHdvIjsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmb3RoZXIpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsIHR3b19zdHJpbmdzKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfc3BsaXRfb25fYnl0ZSAoJnN0ciwgJ1x0JywgJm90aGVyKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSBvciBkZWxpbWl0ZXIgbm90IGZvdW5kIik7CisKKyAgICBpZiAoc3RyY21wIChfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKCZzdHIpLCAib25lIikgIT0gMCkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImxlZnQgc2lkZSBhZnRlciBzcGxpdCBvbiB0YWIgaXMgd3JvbmciKTsKKworICAgIGlmIChzdHJjbXAgKF9kYnVzX3N0cmluZ19nZXRfZGF0YSAoJm90aGVyKSwgInR3byIpICE9IDApCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJyaWdodCBzaWRlIGFmdGVyIHNwbGl0IG9uIHRhYiBpcyB3cm9uZyIpOworCisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmb3RoZXIpOworICB9CisKKyAgeworICAgIGNvbnN0IGNoYXIgdXBwZXJfc3RyaW5nW10gPSAiVE9VUFBFUlNUUklORyI7CisgICAgY29uc3QgY2hhciBsb3dlcl9zdHJpbmdbXSA9ICJ0b3VwcGVyc3RyaW5nIjsKKyAgICBjb25zdCBjaGFyIGxvd2VyMl9zdHJpbmdbXSA9ICJ0b3VwcGVyU1RSSU5HIjsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsIHVwcGVyX3N0cmluZykpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICAgIF9kYnVzX3N0cmluZ190b2xvd2VyX2FzY2lpICgmc3RyLCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCgmc3RyKSk7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJnN0ciwgbG93ZXJfc3RyaW5nKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIl9kYnVzX3N0cmluZ190b2xvd2VyX2FzY2lpIGZhaWxlZCIpOworCisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgdXBwZXJfc3RyaW5nKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgICAgX2RidXNfc3RyaW5nX3RvbG93ZXJfYXNjaWkgKCZzdHIsIDAsIDcpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZzdHIsIGxvd2VyMl9zdHJpbmcpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiX2RidXNfc3RyaW5nX3RvbG93ZXJfYXNjaWkgZmFpbGVkIGluIHBhcnRpYWwgY29udmVyc2lvbiIpOworCisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICB9CisKKyAgeworICAgIGNvbnN0IGNoYXIgbG93ZXJfc3RyaW5nW10gPSAidG91cHBlcnN0cmluZyI7CisgICAgY29uc3QgY2hhciB1cHBlcl9zdHJpbmdbXSA9ICJUT1VQUEVSU1RSSU5HIjsKKyAgICBjb25zdCBjaGFyIHVwcGVyMl9zdHJpbmdbXSA9ICJUT1VQUEVSc3RyaW5nIjsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsIGxvd2VyX3N0cmluZykpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICAgIF9kYnVzX3N0cmluZ190b3VwcGVyX2FzY2lpICgmc3RyLCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCgmc3RyKSk7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJnN0ciwgdXBwZXJfc3RyaW5nKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIl9kYnVzX3N0cmluZ190b3VwcGVyX2FzY2lpIGZhaWxlZCIpOworCisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgbG93ZXJfc3RyaW5nKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgICAgX2RidXNfc3RyaW5nX3RvdXBwZXJfYXNjaWkgKCZzdHIsIDAsIDcpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZzdHIsIHVwcGVyMl9zdHJpbmcpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiX2RidXNfc3RyaW5nX3RvdXBwZXJfYXNjaWkgZmFpbGVkIGluIHBhcnRpYWwgY29udmVyc2lvbiIpOworCisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1zdHJpbmcuYyBiL2RidXMvZGJ1cy9kYnVzLXN0cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhY2NkYjEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1zdHJpbmcuYwpAQCAtMCwwICsxLDI2OTggQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zdHJpbmcuYyBTdHJpbmcgdXRpbGl0eSBjbGFzcyAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmFsZiBIYWJhY2tlciA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorLyogd2UgYWxsb3cgYSBzeXN0ZW0gaGVhZGVyIGhlcmUsIGZvciBzcGVlZC9jb252ZW5pZW5jZSAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorLyogZm9yIHZzbnByaW50ZiAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjZGVmaW5lIERCVVNfQ0FOX1VTRV9EQlVTX1NUUklOR19QUklWQVRFIDEKKyNpbmNsdWRlICJkYnVzLXN0cmluZy1wcml2YXRlLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLWJhc2ljLmgiIC8qIHByb2JhYmx5IHNob3VsZCBiZSByZW1vdmVkIGJ5IG1vdmluZyB0aGUgdXNhZ2Ugb2YgREJVU19UWVBFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGludG8gdGhlIG1hcnNoYWxpbmctcmVsYXRlZCBmaWxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGZvciBEQlVTX1ZBX0NPUFkgKi8KKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMuaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1N0cmluZyBEQnVzU3RyaW5nIGNsYXNzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNTdHJpbmcgZGF0YSBzdHJ1Y3R1cmUgZm9yIHNhZmVyIHN0cmluZyBoYW5kbGluZworICoKKyAqIFR5cGVzIGFuZCBmdW5jdGlvbnMgcmVsYXRlZCB0byBEQnVzU3RyaW5nLiBEQnVzU3RyaW5nIGlzIGludGVuZGVkCisgKiB0byBiZSBhIHN0cmluZyBjbGFzcyB0aGF0IG1ha2VzIGl0IGhhcmQgdG8gbWVzcyB1cCBzZWN1cml0eSBpc3N1ZXMKKyAqIChhbmQganVzdCBpbiBnZW5lcmFsIGhhcmRlciB0byB3cml0ZSBidWdneSBjb2RlKS4gIEl0IHNob3VsZCBiZQorICogdXNlZCAob3IgZXh0ZW5kZWQgYW5kIHRoZW4gdXNlZCkgcmF0aGVyIHRoYW4gdGhlIGxpYmMgc3R1ZmYgaW4KKyAqIHN0cmluZy5oLiAgVGhlIHN0cmluZyBjbGFzcyBpcyBhIGJpdCBpbmNvbnZlbmllbnQgYXQgc3BvdHMgYmVjYXVzZQorICogaXQgaGFuZGxlcyBvdXQtb2YtbWVtb3J5IGZhaWx1cmVzIGFuZCB0cmllcyB0byBiZSBleHRyYS1yb2J1c3QuCisgKiAKKyAqIEEgREJ1c1N0cmluZyBoYXMgYSBtYXhpbXVtIGxlbmd0aCBzZXQgYXQgaW5pdGlhbGl6YXRpb24gdGltZTsgdGhpcworICogY2FuIGJlIHVzZWQgdG8gZW5zdXJlIHRoYXQgYSBidWZmZXIgZG9lc24ndCBnZXQgdG9vIGJpZy4gIFRoZQorICogX2RidXNfc3RyaW5nX2xlbmd0aGVuKCkgbWV0aG9kIGNoZWNrcyBmb3Igb3ZlcmZsb3csIGFuZCBmb3IgbWF4CisgKiBsZW5ndGggYmVpbmcgZXhjZWVkZWQuCisgKiAKKyAqIFRyeSB0byBhdm9pZCBjb252ZXJzaW9uIHRvIGEgcGxhaW4gQyBzdHJpbmcsIGkuZS4gYWRkIG1ldGhvZHMgb24KKyAqIHRoZSBzdHJpbmcgb2JqZWN0IGluc3RlYWQsIG9ubHkgY29udmVydCB0byBDIHN0cmluZyB3aGVuIHBhc3NpbmcKKyAqIHRoaW5ncyBvdXQgdG8gdGhlIHB1YmxpYyBBUEkuIEluIHBhcnRpY3VsYXIsIG5vIHNwcmludGYsIHN0cmNweSwKKyAqIHN0cmNhdCwgYW55IG9mIHRoYXQgc2hvdWxkIGJlIHVzZWQuIFRoZSBHU3RyaW5nIGZlYXR1cmUgb2YKKyAqIGFjY2VwdGluZyBuZWdhdGl2ZSBudW1iZXJzIGZvciAibGVuZ3RoIG9mIHN0cmluZyIgaXMgYWxzbyBhYnNlbnQsCisgKiBiZWNhdXNlIGl0IGNvdWxkIGtlZXAgdXMgZnJvbSBkZXRlY3RpbmcgYm9ndXMgaHVnZSBsZW5ndGhzLiBpLmUuIGlmCisgKiB3ZSBwYXNzZWQgaW4gc29tZSBib2d1cyBodWdlIGxlbmd0aCBpdCB3b3VsZCBiZSB0YWtlbiB0byBtZWFuCisgKiAiY3VycmVudCBsZW5ndGggb2Ygc3RyaW5nIiBpbnN0ZWFkIG9mICJicm9rZW4gY3JhY2siCisgKgorICogQHRvZG8gI0RCdXNTdHJpbmcgbmVlZHMgYSBsb3Qgb2YgY2xlYW5pbmcgdXA7IHNvbWUgb2YgdGhlCisgKiBBUEkgaXMgbm8gbG9uZ2VyIHVzZWQsIGFuZCB0aGUgQVBJIGlzIHByZXR0eSBpbmNvbnNpc3RlbnQuCisgKiBJbiBwYXJ0aWN1bGFyIGFsbCB0aGUgImFwcGVuZCIgQVBJcywgZXNwZWNpYWxseSB0aG9zZSBpbnZvbHZpbmcKKyAqIGFsaWdubWVudCBidXQgcHJvYmFibHkgbG90cyBvZiB0aGVtLCBhcmUgbm8gbG9uZ2VyIHVzZWQgYnkgdGhlCisgKiBtYXJzaGFsaW5nIGNvZGUgd2hpY2ggYWx3YXlzIGRvZXMgImluc2VydHMiIG5vdy4KKyAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNTdHJpbmcKKyAqIEB7CisgKi8KKworc3RhdGljIHZvaWQKK2ZpeHVwX2FsaWdubWVudCAoREJ1c1JlYWxTdHJpbmcgKnJlYWwpCit7CisgIHVuc2lnbmVkIGNoYXIgKmFsaWduZWQ7CisgIHVuc2lnbmVkIGNoYXIgKnJlYWxfYmxvY2s7CisgIHVuc2lnbmVkIGludCBvbGRfYWxpZ25fb2Zmc2V0OworCisgIC8qIHdlIGhhdmUgdG8gaGF2ZSBleHRyYSBzcGFjZSBpbiByZWFsLT5hbGxvY2F0ZWQgZm9yIHRoZSBhbGlnbiBvZmZzZXQgYW5kIG51bCBieXRlICovCisgIF9kYnVzX2Fzc2VydCAocmVhbC0+bGVuIDw9IHJlYWwtPmFsbG9jYXRlZCAtIF9EQlVTX1NUUklOR19BTExPQ0FUSU9OX1BBRERJTkcpOworICAKKyAgb2xkX2FsaWduX29mZnNldCA9IHJlYWwtPmFsaWduX29mZnNldDsKKyAgcmVhbF9ibG9jayA9IHJlYWwtPnN0ciAtIG9sZF9hbGlnbl9vZmZzZXQ7CisgIAorICBhbGlnbmVkID0gX0RCVVNfQUxJR05fQUREUkVTUyAocmVhbF9ibG9jaywgOCk7CisKKyAgcmVhbC0+YWxpZ25fb2Zmc2V0ID0gYWxpZ25lZCAtIHJlYWxfYmxvY2s7CisgIHJlYWwtPnN0ciA9IGFsaWduZWQ7CisgIAorICBpZiAob2xkX2FsaWduX29mZnNldCAhPSByZWFsLT5hbGlnbl9vZmZzZXQpCisgICAgeworICAgICAgLyogSGVyZSBjb21lcyB0aGUgc3VjayAqLworICAgICAgbWVtbW92ZSAocmVhbF9ibG9jayArIHJlYWwtPmFsaWduX29mZnNldCwKKyAgICAgICAgICAgICAgIHJlYWxfYmxvY2sgKyBvbGRfYWxpZ25fb2Zmc2V0LAorICAgICAgICAgICAgICAgcmVhbC0+bGVuICsgMSk7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAocmVhbC0+YWxpZ25fb2Zmc2V0IDwgOCk7CisgIF9kYnVzX2Fzc2VydCAoX0RCVVNfQUxJR05fQUREUkVTUyAocmVhbC0+c3RyLCA4KSA9PSByZWFsLT5zdHIpOworfQorCitzdGF0aWMgdm9pZAordW5kb19hbGlnbm1lbnQgKERCdXNSZWFsU3RyaW5nICpyZWFsKQoreworICBpZiAocmVhbC0+YWxpZ25fb2Zmc2V0ICE9IDApCisgICAgeworICAgICAgbWVtbW92ZSAocmVhbC0+c3RyIC0gcmVhbC0+YWxpZ25fb2Zmc2V0LAorICAgICAgICAgICAgICAgcmVhbC0+c3RyLAorICAgICAgICAgICAgICAgcmVhbC0+bGVuICsgMSk7CisKKyAgICAgIHJlYWwtPnN0ciA9IHJlYWwtPnN0ciAtIHJlYWwtPmFsaWduX29mZnNldDsKKyAgICAgIHJlYWwtPmFsaWduX29mZnNldCA9IDA7CisgICAgfQorfQorCisvKioKKyAqIEluaXRpYWxpemVzIGEgc3RyaW5nIHRoYXQgY2FuIGJlIHVwIHRvIHRoZSBnaXZlbiBhbGxvY2F0aW9uIHNpemUKKyAqIGJlZm9yZSBpdCBoYXMgdG8gcmVhbGxvYy4gVGhlIHN0cmluZyBzdGFydHMgbGlmZSB3aXRoIHplcm8gbGVuZ3RoLgorICogVGhlIHN0cmluZyBtdXN0IGV2ZW50dWFsbHkgYmUgZnJlZWQgd2l0aCBfZGJ1c19zdHJpbmdfZnJlZSgpLgorICogCisgKiBAcGFyYW0gc3RyIG1lbW9yeSB0byBob2xkIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBhbGxvY2F0ZV9zaXplIGFtb3VudCB0byBwcmVhbGxvY2F0ZQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2luaXRfcHJlYWxsb2NhdGVkIChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGFsbG9jYXRlX3NpemUpCit7CisgIERCdXNSZWFsU3RyaW5nICpyZWFsOworICAKKyAgX2RidXNfYXNzZXJ0IChzdHIgIT0gTlVMTCk7CisKKyAgX2RidXNfYXNzZXJ0IChzaXplb2YgKERCdXNTdHJpbmcpID09IHNpemVvZiAoREJ1c1JlYWxTdHJpbmcpKTsKKyAgCisgIHJlYWwgPSAoREJ1c1JlYWxTdHJpbmcqKSBzdHI7CisKKyAgLyogSXQncyB2ZXJ5IGltcG9ydGFudCBub3QgdG8gdG91Y2ggYW55dGhpbmcKKyAgICogb3RoZXIgdGhhbiByZWFsLT5zdHIgaWYgd2UncmUgZ29pbmcgdG8gZmFpbCwKKyAgICogc2luY2Ugd2UgYWxzbyB1c2UgdGhpcyBmdW5jdGlvbiB0byByZXNldAorICAgKiBhbiBleGlzdGluZyBzdHJpbmcsIGUuZy4gaW4gX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEoKQorICAgKi8KKyAgCisgIHJlYWwtPnN0ciA9IGRidXNfbWFsbG9jIChfREJVU19TVFJJTkdfQUxMT0NBVElPTl9QQURESU5HICsgYWxsb2NhdGVfc2l6ZSk7CisgIGlmIChyZWFsLT5zdHIgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7ICAKKyAgCisgIHJlYWwtPmFsbG9jYXRlZCA9IF9EQlVTX1NUUklOR19BTExPQ0FUSU9OX1BBRERJTkcgKyBhbGxvY2F0ZV9zaXplOworICByZWFsLT5sZW4gPSAwOworICByZWFsLT5zdHJbcmVhbC0+bGVuXSA9ICdcMCc7CisgIAorICByZWFsLT5jb25zdGFudCA9IEZBTFNFOworICByZWFsLT5sb2NrZWQgPSBGQUxTRTsKKyAgcmVhbC0+aW52YWxpZCA9IEZBTFNFOworICByZWFsLT5hbGlnbl9vZmZzZXQgPSAwOworICAKKyAgZml4dXBfYWxpZ25tZW50IChyZWFsKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEluaXRpYWxpemVzIGEgc3RyaW5nLiBUaGUgc3RyaW5nIHN0YXJ0cyBsaWZlIHdpdGggemVybyBsZW5ndGguICBUaGUKKyAqIHN0cmluZyBtdXN0IGV2ZW50dWFsbHkgYmUgZnJlZWQgd2l0aCBfZGJ1c19zdHJpbmdfZnJlZSgpLgorICogCisgKiBAcGFyYW0gc3RyIG1lbW9yeSB0byBob2xkIHRoZSBzdHJpbmcKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19pbml0IChEQnVzU3RyaW5nICpzdHIpCit7CisgIHJldHVybiBfZGJ1c19zdHJpbmdfaW5pdF9wcmVhbGxvY2F0ZWQgKHN0ciwgMCk7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBjb25zdGFudCBzdHJpbmcuIFRoZSB2YWx1ZSBwYXJhbWV0ZXIgaXMgbm90IGNvcGllZAorICogKHNob3VsZCBiZSBzdGF0aWMpLCBhbmQgdGhlIHN0cmluZyBtYXkgbmV2ZXIgYmUgbW9kaWZpZWQuCisgKiBJdCBpcyBzYWZlIGJ1dCBub3QgbmVjZXNzYXJ5IHRvIGNhbGwgX2RidXNfc3RyaW5nX2ZyZWUoKQorICogb24gYSBjb25zdCBzdHJpbmcuIFRoZSBzdHJpbmcgaGFzIGEgbGVuZ3RoIGxpbWl0IG9mIE1BWElOVCAtIDguCisgKiAKKyAqIEBwYXJhbSBzdHIgbWVtb3J5IHRvIHVzZSBmb3IgdGhlIHN0cmluZworICogQHBhcmFtIHZhbHVlIGEgc3RyaW5nIHRvIGJlIHN0b3JlZCBpbiBzdHIgKG5vdCBjb3BpZWQhISEpCisgKi8KK3ZvaWQKK19kYnVzX3N0cmluZ19pbml0X2NvbnN0IChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUpCit7CisgIF9kYnVzX2Fzc2VydCAodmFsdWUgIT0gTlVMTCk7CisgIAorICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4gKHN0ciwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuICh2YWx1ZSkpOworfQorCisvKioKKyAqIEluaXRpYWxpemVzIGEgY29uc3RhbnQgc3RyaW5nIHdpdGggYSBsZW5ndGguIFRoZSB2YWx1ZSBwYXJhbWV0ZXIgaXMKKyAqIG5vdCBjb3BpZWQgKHNob3VsZCBiZSBzdGF0aWMpLCBhbmQgdGhlIHN0cmluZyBtYXkgbmV2ZXIgYmUKKyAqIG1vZGlmaWVkLiAgSXQgaXMgc2FmZSBidXQgbm90IG5lY2Vzc2FyeSB0byBjYWxsIF9kYnVzX3N0cmluZ19mcmVlKCkKKyAqIG9uIGEgY29uc3Qgc3RyaW5nLgorICogCisgKiBAcGFyYW0gc3RyIG1lbW9yeSB0byB1c2UgZm9yIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSB2YWx1ZSBhIHN0cmluZyB0byBiZSBzdG9yZWQgaW4gc3RyIChub3QgY29waWVkISEhKQorICogQHBhcmFtIGxlbiB0aGUgbGVuZ3RoIHRvIHVzZQorICovCit2b2lkCitfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4gKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGxlbikKK3sKKyAgREJ1c1JlYWxTdHJpbmcgKnJlYWw7CisgIAorICBfZGJ1c19hc3NlcnQgKHN0ciAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPT0gMCB8fCB2YWx1ZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPD0gX0RCVVNfU1RSSU5HX01BWF9MRU5HVEgpOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKyAgCisgIHJlYWwgPSAoREJ1c1JlYWxTdHJpbmcqKSBzdHI7CisgIAorICByZWFsLT5zdHIgPSAodW5zaWduZWQgY2hhciopIHZhbHVlOworICByZWFsLT5sZW4gPSBsZW47CisgIHJlYWwtPmFsbG9jYXRlZCA9IHJlYWwtPmxlbiArIF9EQlVTX1NUUklOR19BTExPQ0FUSU9OX1BBRERJTkc7IC8qIGEgbGllLCBqdXN0IHRvIGF2b2lkIHNwZWNpYWwtY2FzZSBhc3NlcnRpb25zLi4uICovCisgIHJlYWwtPmNvbnN0YW50ID0gVFJVRTsKKyAgcmVhbC0+bG9ja2VkID0gVFJVRTsKKyAgcmVhbC0+aW52YWxpZCA9IEZBTFNFOworICByZWFsLT5hbGlnbl9vZmZzZXQgPSAwOworCisgIC8qIFdlIGRvbid0IHJlcXVpcmUgY29uc3Qgc3RyaW5ncyB0byBiZSA4LWJ5dGUgYWxpZ25lZCBhcyB0aGUKKyAgICogbWVtb3J5IGlzIGNvbWluZyBmcm9tIGVsc2V3aGVyZS4KKyAgICovCit9CisKKy8qKgorICogRnJlZXMgYSBzdHJpbmcgY3JlYXRlZCBieSBfZGJ1c19zdHJpbmdfaW5pdCgpLgorICoKKyAqIEBwYXJhbSBzdHIgbWVtb3J5IHdoZXJlIHRoZSBzdHJpbmcgaXMgc3RvcmVkLgorICovCit2b2lkCitfZGJ1c19zdHJpbmdfZnJlZSAoREJ1c1N0cmluZyAqc3RyKQoreworICBEQnVzUmVhbFN0cmluZyAqcmVhbCA9IChEQnVzUmVhbFN0cmluZyopIHN0cjsKKyAgREJVU19HRU5FUklDX1NUUklOR19QUkVBTUJMRSAocmVhbCk7CisgIAorICBpZiAocmVhbC0+Y29uc3RhbnQpCisgICAgcmV0dXJuOworICBkYnVzX2ZyZWUgKHJlYWwtPnN0ciAtIHJlYWwtPmFsaWduX29mZnNldCk7CisKKyAgcmVhbC0+aW52YWxpZCA9IFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY29tcGFjdCAoREJ1c1JlYWxTdHJpbmcgKnJlYWwsCisgICAgICAgICBpbnQgICAgICAgICAgICAgbWF4X3dhc3RlKQoreworICB1bnNpZ25lZCBjaGFyICpuZXdfc3RyOworICBpbnQgbmV3X2FsbG9jYXRlZDsKKyAgaW50IHdhc3RlOworCisgIHdhc3RlID0gcmVhbC0+YWxsb2NhdGVkIC0gKHJlYWwtPmxlbiArIF9EQlVTX1NUUklOR19BTExPQ0FUSU9OX1BBRERJTkcpOworCisgIGlmICh3YXN0ZSA8PSBtYXhfd2FzdGUpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgbmV3X2FsbG9jYXRlZCA9IHJlYWwtPmxlbiArIF9EQlVTX1NUUklOR19BTExPQ0FUSU9OX1BBRERJTkc7CisKKyAgbmV3X3N0ciA9IGRidXNfcmVhbGxvYyAocmVhbC0+c3RyIC0gcmVhbC0+YWxpZ25fb2Zmc2V0LCBuZXdfYWxsb2NhdGVkKTsKKyAgaWYgKF9EQlVTX1VOTElLRUxZIChuZXdfc3RyID09IE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZWFsLT5zdHIgPSBuZXdfc3RyICsgcmVhbC0+YWxpZ25fb2Zmc2V0OworICByZWFsLT5hbGxvY2F0ZWQgPSBuZXdfYWxsb2NhdGVkOworICBmaXh1cF9hbGlnbm1lbnQgKHJlYWwpOworCisgIHJldHVybiBUUlVFOworfQorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworLyogTm90IHVzaW5nIHRoaXMgZmVhdHVyZSBhdCB0aGUgbW9tZW50LAorICogc28gbWFya2VkIERCVVNfQlVJTERfVEVTVFMtb25seQorICovCisvKioKKyAqIExvY2tzIGEgc3RyaW5nIHN1Y2ggdGhhdCBhbnkgYXR0ZW1wdHMgdG8gY2hhbmdlIHRoZSBzdHJpbmcgd2lsbAorICogcmVzdWx0IGluIGFib3J0aW5nIHRoZSBwcm9ncmFtLiBBbHNvLCBpZiB0aGUgc3RyaW5nIGlzIHdhc3RpbmcgYQorICogbG90IG9mIG1lbW9yeSAoYWxsb2NhdGlvbiBpcyBzdWZmaWNpZW50bHkgbGFyZ2VyIHRoYW4gd2hhdCB0aGUKKyAqIHN0cmluZyBpcyByZWFsbHkgdXNpbmcpLCBfZGJ1c19zdHJpbmdfbG9jaygpIHdpbGwgcmVhbGxvYyB0aGUKKyAqIHN0cmluZydzIGRhdGEgdG8gImNvbXBhY3QiIGl0LgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byBsb2NrLgorICovCit2b2lkCitfZGJ1c19zdHJpbmdfbG9jayAoREJ1c1N0cmluZyAqc3RyKQoreyAgCisgIERCVVNfTE9DS0VEX1NUUklOR19QUkVBTUJMRSAoc3RyKTsgLyogY2FuIGxvY2sgbXVsdGlwbGUgdGltZXMgKi8KKworICByZWFsLT5sb2NrZWQgPSBUUlVFOworCisgIC8qIFRyeSB0byByZWFsbG9jIHRvIGF2b2lkIGV4Y2VzcyBtZW1vcnkgdXNhZ2UsIHNpbmNlCisgICAqIHdlIGtub3cgd2Ugd29uJ3QgY2hhbmdlIHRoZSBzdHJpbmcgZnVydGhlcgorICAgKi8KKyNkZWZpbmUgTUFYX1dBU1RFIDQ4CisgIGNvbXBhY3QgKHJlYWwsIE1BWF9XQVNURSk7Cit9CisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLworCitzdGF0aWMgZGJ1c19ib29sX3QKK3JlYWxsb2NhdGVfZm9yX2xlbmd0aCAoREJ1c1JlYWxTdHJpbmcgKnJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBuZXdfbGVuZ3RoKQoreworICBpbnQgbmV3X2FsbG9jYXRlZDsKKyAgdW5zaWduZWQgY2hhciAqbmV3X3N0cjsKKworICAvKiBhdCBsZWFzdCBkb3VibGUgb3VyIG9sZCBhbGxvY2F0aW9uIHRvIGF2b2lkIE8obiksIGF2b2lkaW5nCisgICAqIG92ZXJmbG93CisgICAqLworICBpZiAocmVhbC0+YWxsb2NhdGVkID4gKF9EQlVTX1NUUklOR19NQVhfTEVOR1RIICsgX0RCVVNfU1RSSU5HX0FMTE9DQVRJT05fUEFERElORykgLyAyKQorICAgIG5ld19hbGxvY2F0ZWQgPSBfREJVU19TVFJJTkdfTUFYX0xFTkdUSCArIF9EQlVTX1NUUklOR19BTExPQ0FUSU9OX1BBRERJTkc7CisgIGVsc2UKKyAgICBuZXdfYWxsb2NhdGVkID0gcmVhbC0+YWxsb2NhdGVkICogMjsKKworICAvKiBpZiB5b3UgY2hhbmdlIHRoZSBjb2RlIGp1c3QgYWJvdmUgaGVyZSwgcnVuIHRoZSB0ZXN0cyB3aXRob3V0CisgICAqIHRoZSBmb2xsb3dpbmcgYXNzZXJ0LW9ubHkgaGFjayBiZWZvcmUgeW91IGNvbW1pdAorICAgKi8KKyAgLyogVGhpcyBpcyBrZXllZCBvZmYgYXNzZXJ0cyBpbiBhZGRpdGlvbiB0byB0ZXN0cyBzbyB3aGVuIHlvdQorICAgKiBkaXNhYmxlIGFzc2VydHMgdG8gcHJvZmlsZSwgeW91IGRvbid0IGdldCB0aGlzIGRlc3Ryb3llcgorICAgKiBvZiBwcm9maWxlcy4KKyAgICovCisjaWZkZWYgREJVU19ESVNBQkxFX0FTU0VSVAorI2Vsc2UKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgIG5ld19hbGxvY2F0ZWQgPSAwOyAvKiBlbnN1cmUgYSByZWFsbG9jIGV2ZXJ5IHRpbWUgc28gdGhhdCB3ZSBnbworICAgICAgICAgICAgICAgICAgICAgICogdGhyb3VnaCBhbGwgbWFsbG9jIGZhaWx1cmUgY29kZXBhdGhzCisgICAgICAgICAgICAgICAgICAgICAgKi8KKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCisjZW5kaWYgLyogIURCVVNfRElTQUJMRV9BU1NFUlQgKi8KKworICAvKiBCdXQgYmUgc3VyZSB3ZSBhbHdheXMgYWxsb2MgYXQgbGVhc3Qgc3BhY2UgZm9yIHRoZSBuZXcgbGVuZ3RoICovCisgIG5ld19hbGxvY2F0ZWQgPSBNQVggKG5ld19hbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgIG5ld19sZW5ndGggKyBfREJVU19TVFJJTkdfQUxMT0NBVElPTl9QQURESU5HKTsKKworICBfZGJ1c19hc3NlcnQgKG5ld19hbGxvY2F0ZWQgPj0gcmVhbC0+YWxsb2NhdGVkKTsgLyogY29kZSByZWxpZXMgb24gdGhpcyAqLworICBuZXdfc3RyID0gZGJ1c19yZWFsbG9jIChyZWFsLT5zdHIgLSByZWFsLT5hbGlnbl9vZmZzZXQsIG5ld19hbGxvY2F0ZWQpOworICBpZiAoX0RCVVNfVU5MSUtFTFkgKG5ld19zdHIgPT0gTlVMTCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJlYWwtPnN0ciA9IG5ld19zdHIgKyByZWFsLT5hbGlnbl9vZmZzZXQ7CisgIHJlYWwtPmFsbG9jYXRlZCA9IG5ld19hbGxvY2F0ZWQ7CisgIGZpeHVwX2FsaWdubWVudCAocmVhbCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ29tcGFjdHMgdGhlIHN0cmluZyB0byBhdm9pZCB3YXN0ZWQgbWVtb3J5LiAgV2FzdGVkIG1lbW9yeSBpcworICogbWVtb3J5IHRoYXQgaXMgYWxsb2NhdGVkIGJ1dCBub3QgYWN0dWFsbHkgcmVxdWlyZWQgdG8gc3RvcmUgdGhlCisgKiBjdXJyZW50IGxlbmd0aCBvZiB0aGUgc3RyaW5nLiAgVGhlIGNvbXBhY3QgaXMgb25seSBkb25lIGlmIG1vcmUKKyAqIHRoYW4gdGhlIGdpdmVuIGFtb3VudCBvZiBtZW1vcnkgaXMgYmVpbmcgd2FzdGVkIChvdGhlcndpc2UgdGhlCisgKiB3YXN0ZSBpcyBpZ25vcmVkIGFuZCB0aGUgY2FsbCBkb2VzIG5vdGhpbmcpLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIG1heF93YXN0ZSB0aGUgbWF4aW11bSBhbW91bnQgb2Ygd2FzdGUgdG8gaWdub3JlCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlIGNvbXBhY3QgZmFpbGVkIGR1ZSB0byByZWFsbG9jIGZhaWx1cmUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19jb21wYWN0IChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbWF4X3dhc3RlKQoreworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKworICByZXR1cm4gY29tcGFjdCAocmVhbCwgbWF4X3dhc3RlKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZXRfbGVuZ3RoIChEQnVzUmVhbFN0cmluZyAqcmVhbCwKKyAgICAgICAgICAgIGludCAgICAgICAgICAgICBuZXdfbGVuZ3RoKQoreworICAvKiBOb3RlLCB3ZSBhcmUgc2V0dGluZyB0aGUgbGVuZ3RoIG5vdCBpbmNsdWRpbmcgbnVsIHRlcm1pbmF0aW9uICovCisKKyAgLyogZXhjZWVkaW5nIG1heCBsZW5ndGggaXMgdGhlIHNhbWUgYXMgZmFpbHVyZSB0byBhbGxvY2F0ZSBtZW1vcnkgKi8KKyAgaWYgKF9EQlVTX1VOTElLRUxZIChuZXdfbGVuZ3RoID4gX0RCVVNfU1RSSU5HX01BWF9MRU5HVEgpKQorICAgIHJldHVybiBGQUxTRTsKKyAgZWxzZSBpZiAobmV3X2xlbmd0aCA+IChyZWFsLT5hbGxvY2F0ZWQgLSBfREJVU19TVFJJTkdfQUxMT0NBVElPTl9QQURESU5HKSAmJgorICAgICAgICAgICBfREJVU19VTkxJS0VMWSAoIXJlYWxsb2NhdGVfZm9yX2xlbmd0aCAocmVhbCwgbmV3X2xlbmd0aCkpKQorICAgIHJldHVybiBGQUxTRTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHJlYWwtPmxlbiA9IG5ld19sZW5ndGg7CisgICAgICByZWFsLT5zdHJbbmV3X2xlbmd0aF0gPSAnXDAnOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK29wZW5fZ2FwIChpbnQgICAgICAgICAgICAgbGVuLAorICAgICAgICAgIERCdXNSZWFsU3RyaW5nICpkZXN0LAorICAgICAgICAgIGludCAgICAgICAgICAgICBpbnNlcnRfYXQpCit7CisgIGlmIChsZW4gPT0gMCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAobGVuID4gX0RCVVNfU1RSSU5HX01BWF9MRU5HVEggLSBkZXN0LT5sZW4pCisgICAgcmV0dXJuIEZBTFNFOyAvKiBkZXRlY3RlZCBvdmVyZmxvdyBvZiBkZXN0LT5sZW4gKyBsZW4gYmVsb3cgKi8KKyAgCisgIGlmICghc2V0X2xlbmd0aCAoZGVzdCwgZGVzdC0+bGVuICsgbGVuKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbWVtbW92ZSAoZGVzdC0+c3RyICsgaW5zZXJ0X2F0ICsgbGVuLCAKKyAgICAgICAgICAgZGVzdC0+c3RyICsgaW5zZXJ0X2F0LAorICAgICAgICAgICBkZXN0LT5sZW4gLSBsZW4gLSBpbnNlcnRfYXQpOworCisgIHJldHVybiBUUlVFOworfQorCisjaWZuZGVmIF9kYnVzX3N0cmluZ19nZXRfZGF0YQorLyoqCisgKiBHZXRzIHRoZSByYXcgY2hhcmFjdGVyIGJ1ZmZlciBmcm9tIHRoZSBzdHJpbmcuICBUaGUgcmV0dXJuZWQgYnVmZmVyCisgKiB3aWxsIGJlIG51bC10ZXJtaW5hdGVkLCBidXQgbm90ZSB0aGF0IHN0cmluZ3MgbWF5IGNvbnRhaW4gYmluYXJ5CisgKiBkYXRhIHNvIHRoZXJlIG1heSBiZSBleHRyYSBudWwgY2hhcmFjdGVycyBwcmlvciB0byB0aGUgdGVybWluYXRpb24uCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBsaXR0bGUtdXNlZCwgZXh0ZW5kIERCdXNTdHJpbmcgb3IgYWRkCisgKiBzdHVmZiB0byBkYnVzLXN5c2RlcHMuYyBpbnN0ZWFkLiBJdCdzIGFuIGVycm9yIHRvIHVzZSB0aGlzCisgKiBmdW5jdGlvbiBvbiBhIGNvbnN0IHN0cmluZy4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEByZXR1cm5zIHRoZSBkYXRhCisgKi8KK2NoYXIqCitfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKERCdXNTdHJpbmcgKnN0cikKK3sKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIAorICByZXR1cm4gKGNoYXIqKSByZWFsLT5zdHI7Cit9CisjZW5kaWYgLyogX2RidXNfc3RyaW5nX2dldF9kYXRhICovCisKKy8qIG9ubHkgZG8gdGhlIGZ1bmN0aW9uIGlmIHdlIGRvbid0IGhhdmUgdGhlIG1hY3JvICovCisjaWZuZGVmIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YQorLyoqCisgKiBHZXRzIHRoZSByYXcgY2hhcmFjdGVyIGJ1ZmZlciBmcm9tIGEgY29uc3Qgc3RyaW5nLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHJldHVybnMgdGhlIHN0cmluZyBkYXRhCisgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIpCit7CisgIERCVVNfQ09OU1RfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICAKKyAgcmV0dXJuIChjb25zdCBjaGFyKikgcmVhbC0+c3RyOworfQorI2VuZGlmIC8qIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAqLworCisvKioKKyAqIEdldHMgYSBzdWItcG9ydGlvbiBvZiB0aGUgcmF3IGNoYXJhY3RlciBidWZmZXIgZnJvbSB0aGUKKyAqIHN0cmluZy4gVGhlICJsZW4iIGZpZWxkIGlzIHJlcXVpcmVkIHNpbXBseSBmb3IgZXJyb3IKKyAqIGNoZWNraW5nLCB0byBiZSBzdXJlIHlvdSBkb24ndCB0cnkgdG8gdXNlIG1vcmUKKyAqIHN0cmluZyB0aGFuIGV4aXN0cy4gVGhlIG51bCB0ZXJtaW5hdGlvbiBvZiB0aGUKKyAqIHJldHVybmVkIGJ1ZmZlciByZW1haW5zIGF0IHRoZSBlbmQgb2YgdGhlIGVudGlyZQorICogc3RyaW5nLCBub3QgYXQgc3RhcnQgKyBsZW4uCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgYnl0ZSBvZmZzZXQgdG8gcmV0dXJuCisgKiBAcGFyYW0gbGVuIGxlbmd0aCBvZiBzZWdtZW50IHRvIHJldHVybgorICogQHJldHVybnMgdGhlIHN0cmluZyBkYXRhCisgKi8KK2NoYXIqCitfZGJ1c19zdHJpbmdfZ2V0X2RhdGFfbGVuIChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGxlbikKK3sKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IHJlYWwtPmxlbik7CisgIF9kYnVzX2Fzc2VydCAobGVuIDw9IHJlYWwtPmxlbiAtIHN0YXJ0KTsKKyAgCisgIHJldHVybiAoY2hhciopIHJlYWwtPnN0ciArIHN0YXJ0OworfQorCisvKiBvbmx5IGRvIHRoZSBmdW5jdGlvbiBpZiB3ZSBkb24ndCBoYXZlIHRoZSBtYWNybyAqLworI2lmbmRlZiBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuCisvKioKKyAqIGNvbnN0IHZlcnNpb24gb2YgX2RidXNfc3RyaW5nX2dldF9kYXRhX2xlbigpLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IGJ5dGUgb2Zmc2V0IHRvIHJldHVybgorICogQHBhcmFtIGxlbiBsZW5ndGggb2Ygc2VnbWVudCB0byByZXR1cm4KKyAqIEByZXR1cm5zIHRoZSBzdHJpbmcgZGF0YQorICovCitjb25zdCBjaGFyKgorX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pCit7CisgIERCVVNfQ09OU1RfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ID49IDApOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSByZWFsLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKGxlbiA8PSByZWFsLT5sZW4gLSBzdGFydCk7CisgIAorICByZXR1cm4gKGNvbnN0IGNoYXIqKSByZWFsLT5zdHIgKyBzdGFydDsKK30KKyNlbmRpZiAvKiBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuICovCisKKy8qIG9ubHkgZG8gdGhlIGZ1bmN0aW9uIGlmIHdlIGRvbid0IGhhdmUgdGhlIG1hY3JvICovCisjaWZuZGVmIF9kYnVzX3N0cmluZ19zZXRfYnl0ZQorLyoqCisgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYnl0ZSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gaSB0aGUgcG9zaXRpb24KKyAqIEBwYXJhbSBieXRlIHRoZSBuZXcgdmFsdWUKKyAqLwordm9pZAorX2RidXNfc3RyaW5nX3NldF9ieXRlIChEQnVzU3RyaW5nICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgIGJ5dGUpCit7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKGkgPCByZWFsLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKGkgPj0gMCk7CisgIAorICByZWFsLT5zdHJbaV0gPSBieXRlOworfQorI2VuZGlmIC8qIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAqLworCisvKiBvbmx5IGhhdmUgdGhlIGZ1bmN0aW9uIGlmIHdlIGRpZG4ndCBjcmVhdGUgYSBtYWNybyAqLworI2lmbmRlZiBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUKKy8qKgorICogR2V0cyB0aGUgYnl0ZSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uIEl0IGlzCisgKiBhbGxvd2VkIHRvIGFzayBmb3IgdGhlIG51bCBieXRlIGF0IHRoZSBlbmQgb2YKKyAqIHRoZSBzdHJpbmcuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgdGhlIHBvc2l0aW9uCisgKiBAcmV0dXJucyB0aGUgYnl0ZSBhdCB0aGF0IHBvc2l0aW9uCisgKi8KK3Vuc2lnbmVkIGNoYXIKK19kYnVzX3N0cmluZ19nZXRfYnl0ZSAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0KQoreworICBEQlVTX0NPTlNUX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSByZWFsLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ID49IDApOworICAKKyAgcmV0dXJuIHJlYWwtPnN0cltzdGFydF07Cit9CisjZW5kaWYgLyogX2RidXNfc3RyaW5nX2dldF9ieXRlICovCisKKy8qKgorICogSW5zZXJ0cyBhIG51bWJlciBvZiBieXRlcyBvZiBhIGdpdmVuIHZhbHVlIGF0IHRoZQorICogZ2l2ZW4gcG9zaXRpb24uCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gaSB0aGUgcG9zaXRpb24KKyAqIEBwYXJhbSBuX2J5dGVzIG51bWJlciBvZiBieXRlcworICogQHBhcmFtIGJ5dGUgdGhlIHZhbHVlIHRvIGluc2VydAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2luc2VydF9ieXRlcyAoREJ1c1N0cmluZyAgICpzdHIsCisJCQkgICBpbnQgICAgICAgICAgIGksCisJCQkgICBpbnQgICAgICAgICAgIG5fYnl0ZXMsCisJCQkgICB1bnNpZ25lZCBjaGFyIGJ5dGUpCit7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKGkgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChpID49IDApOworICBfZGJ1c19hc3NlcnQgKG5fYnl0ZXMgPj0gMCk7CisKKyAgaWYgKG5fYnl0ZXMgPT0gMCkKKyAgICByZXR1cm4gVFJVRTsKKyAgCisgIGlmICghb3Blbl9nYXAgKG5fYnl0ZXMsIHJlYWwsIGkpKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIG1lbXNldCAocmVhbC0+c3RyICsgaSwgYnl0ZSwgbl9ieXRlcyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogSW5zZXJ0cyBhIHNpbmdsZSBieXRlIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBpIHRoZSBwb3NpdGlvbgorICogQHBhcmFtIGJ5dGUgdGhlIHZhbHVlIHRvIGluc2VydAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2luc2VydF9ieXRlIChEQnVzU3RyaW5nICAgKnN0ciwKKwkJCSAgIGludCAgICAgICAgICAgaSwKKwkJCSAgIHVuc2lnbmVkIGNoYXIgYnl0ZSkKK3sKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoaSA8PSByZWFsLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKGkgPj0gMCk7CisgIAorICBpZiAoIW9wZW5fZ2FwICgxLCByZWFsLCBpKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmVhbC0+c3RyW2ldID0gYnl0ZTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBMaWtlIF9kYnVzX3N0cmluZ19nZXRfZGF0YSgpLCBidXQgcmVtb3ZlcyB0aGUKKyAqIGdvdHRlbiBkYXRhIGZyb20gdGhlIG9yaWdpbmFsIHN0cmluZy4gVGhlIGNhbGxlcgorICogbXVzdCBmcmVlIHRoZSBkYXRhIHJldHVybmVkLiBUaGlzIGZ1bmN0aW9uIG1heQorICogZmFpbCBkdWUgdG8gbGFjayBvZiBtZW1vcnksIGFuZCByZXR1cm4gI0ZBTFNFLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIGRhdGFfcmV0dXJuIGxvY2F0aW9uIHRvIHJldHVybiB0aGUgYnVmZmVyCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICoqZGF0YV9yZXR1cm4pCit7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKGRhdGFfcmV0dXJuICE9IE5VTEwpOworCisgIHVuZG9fYWxpZ25tZW50IChyZWFsKTsKKyAgCisgICpkYXRhX3JldHVybiA9IChjaGFyKikgcmVhbC0+c3RyOworCisgIC8qIHJlc2V0IHRoZSBzdHJpbmcgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoc3RyKSkKKyAgICB7CisgICAgICAvKiBocm0sIHB1dCBpdCBiYWNrIHRoZW4gKi8KKyAgICAgIHJlYWwtPnN0ciA9ICh1bnNpZ25lZCBjaGFyKikgKmRhdGFfcmV0dXJuOworICAgICAgKmRhdGFfcmV0dXJuID0gTlVMTDsKKyAgICAgIGZpeHVwX2FsaWdubWVudCAocmVhbCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENvcGllcyB0aGUgZGF0YSBmcm9tIHRoZSBzdHJpbmcgaW50byBhIGNoYXIqCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gZGF0YV9yZXR1cm4gcGxhY2UgdG8gcmV0dXJuIHRoZSBkYXRhCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0Ugb24gbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfY29weV9kYXRhIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAqKmRhdGFfcmV0dXJuKQoreworICBEQlVTX0NPTlNUX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChkYXRhX3JldHVybiAhPSBOVUxMKTsKKyAgCisgICpkYXRhX3JldHVybiA9IGRidXNfbWFsbG9jIChyZWFsLT5sZW4gKyAxKTsKKyAgaWYgKCpkYXRhX3JldHVybiA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBtZW1jcHkgKCpkYXRhX3JldHVybiwgcmVhbC0+c3RyLCByZWFsLT5sZW4gKyAxKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDb3BpZXMgdGhlIGNvbnRlbnRzIG9mIGEgREJ1c1N0cmluZyBpbnRvIGEgZGlmZmVyZW50IGJ1ZmZlci4gSXQgaXMKKyAqIGEgYnVnIGlmIGF2YWlsX2xlbiBpcyB0b28gc2hvcnQgdG8gaG9sZCB0aGUgc3RyaW5nIGNvbnRlbnRzLiBudWwKKyAqIHRlcm1pbmF0aW9uIGlzIG5vdCBjb3BpZWQsIGp1c3QgdGhlIHN1cHBsaWVkIGJ5dGVzLgorICogCisgKiBAcGFyYW0gc3RyIGEgc3RyaW5nCisgKiBAcGFyYW0gYnVmZmVyIGEgQyBidWZmZXIgdG8gY29weSBkYXRhIHRvCisgKiBAcGFyYW0gYXZhaWxfbGVuIG1heGltdW0gbGVuZ3RoIG9mIEMgYnVmZmVyCisgKi8KK3ZvaWQKK19kYnVzX3N0cmluZ19jb3B5X3RvX2J1ZmZlciAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKwkJCSAgICAgY2hhciAgICAgICAgICAgICAgKmJ1ZmZlciwKKwkJCSAgICAgaW50ICAgICAgICAgICAgICAgIGF2YWlsX2xlbikKK3sKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisKKyAgX2RidXNfYXNzZXJ0IChhdmFpbF9sZW4gPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoYXZhaWxfbGVuID49IHJlYWwtPmxlbik7CisgIAorICBtZW1jcHkgKGJ1ZmZlciwgcmVhbC0+c3RyLCByZWFsLT5sZW4pOworfQorCisvKioKKyAqIENvcGllcyB0aGUgY29udGVudHMgb2YgYSBEQnVzU3RyaW5nIGludG8gYSBkaWZmZXJlbnQgYnVmZmVyLiBJdCBpcworICogYSBidWcgaWYgYXZhaWxfbGVuIGlzIHRvbyBzaG9ydCB0byBob2xkIHRoZSBzdHJpbmcgY29udGVudHMgcGx1cyBhCisgKiBudWwgYnl0ZS4gCisgKiAKKyAqIEBwYXJhbSBzdHIgYSBzdHJpbmcKKyAqIEBwYXJhbSBidWZmZXIgYSBDIGJ1ZmZlciB0byBjb3B5IGRhdGEgdG8KKyAqIEBwYXJhbSBhdmFpbF9sZW4gbWF4aW11bSBsZW5ndGggb2YgQyBidWZmZXIKKyAqLwordm9pZAorX2RidXNfc3RyaW5nX2NvcHlfdG9fYnVmZmVyX3dpdGhfbnVsIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYXZhaWxfbGVuKQoreworICBEQlVTX0NPTlNUX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKworICBfZGJ1c19hc3NlcnQgKGF2YWlsX2xlbiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChhdmFpbF9sZW4gPiByZWFsLT5sZW4pOworICAKKyAgbWVtY3B5IChidWZmZXIsIHJlYWwtPnN0ciwgcmVhbC0+bGVuKzEpOworfQorCisvKiBPbmx5IGhhdmUgdGhlIGZ1bmN0aW9uIGlmIHdlIGRvbid0IGhhdmUgdGhlIG1hY3JvICovCisjaWZuZGVmIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoCisvKioKKyAqIEdldHMgdGhlIGxlbmd0aCBvZiBhIHN0cmluZyAobm90IGluY2x1ZGluZyBudWwgdGVybWluYXRpb24pLgorICoKKyAqIEByZXR1cm5zIHRoZSBsZW5ndGguCisgKi8KK2ludAorX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGNvbnN0IERCdXNTdHJpbmcgICpzdHIpCit7CisgIERCVVNfQ09OU1RfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICAKKyAgcmV0dXJuIHJlYWwtPmxlbjsKK30KKyNlbmRpZiAvKiAhX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKi8KKworLyoqCisgKiBNYWtlcyBhIHN0cmluZyBsb25nZXIgYnkgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcy4gIENoZWNrcyB3aGV0aGVyCisgKiBhZGRpbmcgYWRkaXRpb25hbF9sZW5ndGggdG8gdGhlIGN1cnJlbnQgbGVuZ3RoIHdvdWxkIG92ZXJmbG93IGFuCisgKiBpbnRlZ2VyLCBhbmQgY2hlY2tzIGZvciBleGNlZWRpbmcgYSBzdHJpbmcncyBtYXggbGVuZ3RoLgorICogVGhlIG5ldyBieXRlcyBhcmUgbm90IGluaXRpYWxpemVkLCBvdGhlciB0aGFuIG51bC10ZXJtaW5hdGluZworICogdGhlIGVuZCBvZiB0aGUgc3RyaW5nLiBUaGUgdW5pbml0aWFsaXplZCBieXRlcyBtYXkgY29udGFpbgorICogbnVsIGJ5dGVzIG9yIG90aGVyIGp1bmsuCisgKgorICogQHBhcmFtIHN0ciBhIHN0cmluZworICogQHBhcmFtIGFkZGl0aW9uYWxfbGVuZ3RoIGxlbmd0aCB0byBhZGQgdG8gdGhlIHN0cmluZy4KKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfbGVuZ3RoZW4gKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgYWRkaXRpb25hbF9sZW5ndGgpCit7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOyAgCisgIF9kYnVzX2Fzc2VydCAoYWRkaXRpb25hbF9sZW5ndGggPj0gMCk7CisKKyAgaWYgKF9EQlVTX1VOTElLRUxZIChhZGRpdGlvbmFsX2xlbmd0aCA+IF9EQlVTX1NUUklOR19NQVhfTEVOR1RIIC0gcmVhbC0+bGVuKSkKKyAgICByZXR1cm4gRkFMU0U7IC8qIHdvdWxkIG92ZXJmbG93ICovCisgIAorICByZXR1cm4gc2V0X2xlbmd0aCAocmVhbCwKKyAgICAgICAgICAgICAgICAgICAgIHJlYWwtPmxlbiArIGFkZGl0aW9uYWxfbGVuZ3RoKTsKK30KKworLyoqCisgKiBNYWtlcyBhIHN0cmluZyBzaG9ydGVyIGJ5IHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMuCisgKgorICogQHBhcmFtIHN0ciBhIHN0cmluZworICogQHBhcmFtIGxlbmd0aF90b19yZW1vdmUgbGVuZ3RoIHRvIHJlbW92ZSBmcm9tIHRoZSBzdHJpbmcuCisgKi8KK3ZvaWQKK19kYnVzX3N0cmluZ19zaG9ydGVuIChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbGVuZ3RoX3RvX3JlbW92ZSkKK3sKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAobGVuZ3RoX3RvX3JlbW92ZSA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsZW5ndGhfdG9fcmVtb3ZlIDw9IHJlYWwtPmxlbik7CisKKyAgc2V0X2xlbmd0aCAocmVhbCwKKyAgICAgICAgICAgICAgcmVhbC0+bGVuIC0gbGVuZ3RoX3RvX3JlbW92ZSk7Cit9CisKKy8qKgorICogU2V0cyB0aGUgbGVuZ3RoIG9mIGEgc3RyaW5nLiBDYW4gYmUgdXNlZCB0byB0cnVuY2F0ZSBvciBsZW5ndGhlbgorICogdGhlIHN0cmluZy4gSWYgdGhlIHN0cmluZyBpcyBsZW5ndGhlbmVkLCB0aGUgZnVuY3Rpb24gbWF5IGZhaWwgYW5kCisgKiByZXR1cm4gI0ZBTFNFLiBOZXdseS1hZGRlZCBieXRlcyBhcmUgbm90IGluaXRpYWxpemVkLCBhcyB3aXRoCisgKiBfZGJ1c19zdHJpbmdfbGVuZ3RoZW4oKS4KKyAqCisgKiBAcGFyYW0gc3RyIGEgc3RyaW5nCisgKiBAcGFyYW0gbGVuZ3RoIG5ldyBsZW5ndGggb2YgdGhlIHN0cmluZy4KKyAqIEByZXR1cm5zICNGQUxTRSBvbiBmYWlsdXJlLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBsZW5ndGgpCit7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKGxlbmd0aCA+PSAwKTsKKworICByZXR1cm4gc2V0X2xlbmd0aCAocmVhbCwgbGVuZ3RoKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithbGlnbl9pbnNlcnRfcG9pbnRfdGhlbl9vcGVuX2dhcCAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgKmluc2VydF9hdF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBnYXBfc2l6ZSkKK3sKKyAgdW5zaWduZWQgbG9uZyBuZXdfbGVuOyAvKiB1bG9uZyB0byBhdm9pZCBfREJVU19BTElHTl9WQUxVRSBvdmVyZmxvdyAqLworICB1bnNpZ25lZCBsb25nIGdhcF9wb3M7CisgIGludCBpbnNlcnRfYXQ7CisgIGludCBkZWx0YTsKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoYWxpZ25tZW50ID49IDEpOworICBfZGJ1c19hc3NlcnQgKGFsaWdubWVudCA8PSA4KTsgLyogaXQgaGFzIHRvIGJlIGEgYnVnIGlmID4gOCAqLworCisgIGluc2VydF9hdCA9ICppbnNlcnRfYXRfcDsKKworICBfZGJ1c19hc3NlcnQgKGluc2VydF9hdCA8PSByZWFsLT5sZW4pOworICAKKyAgZ2FwX3BvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChpbnNlcnRfYXQsIGFsaWdubWVudCk7CisgIG5ld19sZW4gPSByZWFsLT5sZW4gKyAoZ2FwX3BvcyAtIGluc2VydF9hdCkgKyBnYXBfc2l6ZTsKKyAgCisgIGlmIChfREJVU19VTkxJS0VMWSAobmV3X2xlbiA+ICh1bnNpZ25lZCBsb25nKSBfREJVU19TVFJJTkdfTUFYX0xFTkdUSCkpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgZGVsdGEgPSBuZXdfbGVuIC0gcmVhbC0+bGVuOworICBfZGJ1c19hc3NlcnQgKGRlbHRhID49IDApOworCisgIGlmIChkZWx0YSA9PSAwKSAvKiBvbmx5IGhhcHBlbnMgaWYgZ2FwX3NpemUgPT0gMCBhbmQgaW5zZXJ0X2F0IGlzIGFsaWduZWQgYWxyZWFkeSAqLworICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoKCh1bnNpZ25lZCBsb25nKSAqaW5zZXJ0X2F0X3ApID09IGdhcF9wb3MpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmIChfREJVU19VTkxJS0VMWSAoIW9wZW5fZ2FwIChuZXdfbGVuIC0gcmVhbC0+bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbCwgaW5zZXJ0X2F0KSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIG51bCB0aGUgcGFkZGluZyBpZiB3ZSBoYWQgdG8gYWRkIGFueSBwYWRkaW5nICovCisgIGlmIChnYXBfc2l6ZSA8IGRlbHRhKQorICAgIHsKKyAgICAgIG1lbXNldCAoJnJlYWwtPnN0cltpbnNlcnRfYXRdLCAnXDAnLAorICAgICAgICAgICAgICBnYXBfcG9zIC0gaW5zZXJ0X2F0KTsKKyAgICB9CisKKyAgKmluc2VydF9hdF9wID0gZ2FwX3BvczsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FsaWduX2xlbmd0aF90aGVuX2xlbmd0aGVuIChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgYWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIHRoZW5fbGVuZ3RoZW5fYnkpCit7CisgIGludCBpbnNlcnRfYXQ7CisKKyAgaW5zZXJ0X2F0ID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisgIAorICByZXR1cm4gYWxpZ25faW5zZXJ0X3BvaW50X3RoZW5fb3Blbl9nYXAgKHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudCwgdGhlbl9sZW5ndGhlbl9ieSk7Cit9CisKKy8qKgorICogQWxpZ24gdGhlIGxlbmd0aCBvZiBhIHN0cmluZyB0byBhIHNwZWNpZmljIGFsaWdubWVudCAodHlwaWNhbGx5IDQgb3IgOCkKKyAqIGJ5IGFwcGVuZGluZyBudWwgYnl0ZXMgdG8gdGhlIHN0cmluZy4KKyAqCisgKiBAcGFyYW0gc3RyIGEgc3RyaW5nCisgKiBAcGFyYW0gYWxpZ25tZW50IHRoZSBhbGlnbm1lbnQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19hbGlnbl9sZW5ndGggKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGFsaWdubWVudCkKK3sKKyAgcmV0dXJuIGFsaWduX2xlbmd0aF90aGVuX2xlbmd0aGVuIChzdHIsIGFsaWdubWVudCwgMCk7Cit9CisKKy8qKgorICogUHJlYWxsb2NhdGUgZXh0cmFfYnl0ZXMgc3VjaCB0aGF0IGEgZnV0dXJlIGxlbmd0aGVuaW5nIG9mIHRoZQorICogc3RyaW5nIGJ5IGV4dHJhX2J5dGVzIGlzIGd1YXJhbnRlZWQgdG8gc3VjY2VlZCB3aXRob3V0IGFuIG91dCBvZgorICogbWVtb3J5IGVycm9yLgorICoKKyAqIEBwYXJhbSBzdHIgYSBzdHJpbmcKKyAqIEBwYXJhbSBleHRyYV9ieXRlcyBieXRlcyB0byBhbGxvYworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2FsbG9jX3NwYWNlIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgZXh0cmFfYnl0ZXMpCit7CisgIGlmICghX2RidXNfc3RyaW5nX2xlbmd0aGVuIChzdHIsIGV4dHJhX2J5dGVzKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIF9kYnVzX3N0cmluZ19zaG9ydGVuIChzdHIsIGV4dHJhX2J5dGVzKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithcHBlbmQgKERCdXNSZWFsU3RyaW5nICpyZWFsLAorICAgICAgICBjb25zdCBjaGFyICAgICAqYnVmZmVyLAorICAgICAgICBpbnQgICAgICAgICAgICAgYnVmZmVyX2xlbikKK3sKKyAgaWYgKGJ1ZmZlcl9sZW4gPT0gMCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19sZW5ndGhlbiAoKERCdXNTdHJpbmcqKXJlYWwsIGJ1ZmZlcl9sZW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBtZW1jcHkgKHJlYWwtPnN0ciArIChyZWFsLT5sZW4gLSBidWZmZXJfbGVuKSwKKyAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgYnVmZmVyX2xlbik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQXBwZW5kcyBhIG51bC10ZXJtaW5hdGVkIEMtc3R5bGUgc3RyaW5nIHRvIGEgREJ1c1N0cmluZy4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBEQnVzU3RyaW5nCisgKiBAcGFyYW0gYnVmZmVyIHRoZSBudWwtdGVybWluYXRlZCBjaGFyYWN0ZXJzIHRvIGFwcGVuZAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5LgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2FwcGVuZCAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmZmVyKQoreworICB1bnNpZ25lZCBsb25nIGJ1ZmZlcl9sZW47CisgIAorICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChidWZmZXIgIT0gTlVMTCk7CisgIAorICBidWZmZXJfbGVuID0gc3RybGVuIChidWZmZXIpOworICBpZiAoYnVmZmVyX2xlbiA+ICh1bnNpZ25lZCBsb25nKSBfREJVU19TVFJJTkdfTUFYX0xFTkdUSCkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICByZXR1cm4gYXBwZW5kIChyZWFsLCBidWZmZXIsIGJ1ZmZlcl9sZW4pOworfQorCisvKiogYXNzaWduIDIgYnl0ZXMgZnJvbSBvbmUgc3RyaW5nIHRvIGFub3RoZXIgKi8KKyNkZWZpbmUgQVNTSUdOXzJfT0NURVRTKHAsIG9jdGV0cykgXAorICAqKChkYnVzX3VpbnQxNl90KikocCkpID0gKigoZGJ1c191aW50MTZfdCopKG9jdGV0cykpOworCisvKiogYXNzaWduIDQgYnl0ZXMgZnJvbSBvbmUgc3RyaW5nIHRvIGFub3RoZXIgKi8KKyNkZWZpbmUgQVNTSUdOXzRfT0NURVRTKHAsIG9jdGV0cykgXAorICAqKChkYnVzX3VpbnQzMl90KikocCkpID0gKigoZGJ1c191aW50MzJfdCopKG9jdGV0cykpOworCisjaWZkZWYgREJVU19IQVZFX0lOVDY0CisvKiogYXNzaWduIDggYnl0ZXMgZnJvbSBvbmUgc3RyaW5nIHRvIGFub3RoZXIgKi8KKyNkZWZpbmUgQVNTSUdOXzhfT0NURVRTKHAsIG9jdGV0cykgXAorICAqKChkYnVzX3VpbnQ2NF90KikocCkpID0gKigoZGJ1c191aW50NjRfdCopKG9jdGV0cykpOworI2Vsc2UKKy8qKiBhc3NpZ24gOCBieXRlcyBmcm9tIG9uZSBzdHJpbmcgdG8gYW5vdGhlciAqLworI2RlZmluZSBBU1NJR05fOF9PQ1RFVFMocCwgb2N0ZXRzKSAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1bnNpZ25lZCBjaGFyICpiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBiID0gcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAqYisrID0gb2N0ZXRzWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAqYisrID0gb2N0ZXRzWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAqYisrID0gb2N0ZXRzWzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAqYisrID0gb2N0ZXRzWzNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAqYisrID0gb2N0ZXRzWzRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAqYisrID0gb2N0ZXRzWzVdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAqYisrID0gb2N0ZXRzWzZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAqYisrID0gb2N0ZXRzWzddOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfZGJ1c19hc3NlcnQgKGIgPT0gcCArIDgpOyAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBEQlVTX0hBVkVfSU5UNjQgKi8KKworLyoqCisgKiBJbnNlcnRzIDIgYnl0ZXMgYWxpZ25lZCBvbiBhIDIgYnl0ZSBib3VuZGFyeQorICogd2l0aCBhbnkgYWxpZ25tZW50IHBhZGRpbmcgaW5pdGlhbGl6ZWQgdG8gMC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBEQnVzU3RyaW5nCisgKiBAcGFyYW0gaW5zZXJ0X2F0IHdoZXJlIHRvIGluc2VydAorICogQHBhcmFtIG9jdGV0cyAyIGJ5dGVzIHRvIGluc2VydAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5LgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2luc2VydF8yX2FsaWduZWQgKERCdXNTdHJpbmcgICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgb2N0ZXRzWzRdKQoreworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgCisgIGlmICghYWxpZ25faW5zZXJ0X3BvaW50X3RoZW5fb3Blbl9nYXAgKHN0ciwgJmluc2VydF9hdCwgMiwgMikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEFTU0lHTl8yX09DVEVUUyAocmVhbC0+c3RyICsgaW5zZXJ0X2F0LCBvY3RldHMpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEluc2VydHMgNCBieXRlcyBhbGlnbmVkIG9uIGEgNCBieXRlIGJvdW5kYXJ5CisgKiB3aXRoIGFueSBhbGlnbm1lbnQgcGFkZGluZyBpbml0aWFsaXplZCB0byAwLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIERCdXNTdHJpbmcKKyAqIEBwYXJhbSBpbnNlcnRfYXQgd2hlcmUgdG8gaW5zZXJ0CisgKiBAcGFyYW0gb2N0ZXRzIDQgYnl0ZXMgdG8gaW5zZXJ0CisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfaW5zZXJ0XzRfYWxpZ25lZCAoREJ1c1N0cmluZyAgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBvY3RldHNbNF0pCit7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICAKKyAgaWYgKCFhbGlnbl9pbnNlcnRfcG9pbnRfdGhlbl9vcGVuX2dhcCAoc3RyLCAmaW5zZXJ0X2F0LCA0LCA0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQVNTSUdOXzRfT0NURVRTIChyZWFsLT5zdHIgKyBpbnNlcnRfYXQsIG9jdGV0cyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogSW5zZXJ0cyA4IGJ5dGVzIGFsaWduZWQgb24gYW4gOCBieXRlIGJvdW5kYXJ5CisgKiB3aXRoIGFueSBhbGlnbm1lbnQgcGFkZGluZyBpbml0aWFsaXplZCB0byAwLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIERCdXNTdHJpbmcKKyAqIEBwYXJhbSBpbnNlcnRfYXQgd2hlcmUgdG8gaW5zZXJ0CisgKiBAcGFyYW0gb2N0ZXRzIDggYnl0ZXMgdG8gaW5zZXJ0CisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfaW5zZXJ0XzhfYWxpZ25lZCAoREJ1c1N0cmluZyAgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBvY3RldHNbOF0pCit7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICAKKyAgaWYgKCFhbGlnbl9pbnNlcnRfcG9pbnRfdGhlbl9vcGVuX2dhcCAoc3RyLCAmaW5zZXJ0X2F0LCA4LCA4KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfYXNzZXJ0IChfREJVU19BTElHTl9WQUxVRSAoaW5zZXJ0X2F0LCA4KSA9PSAodW5zaWduZWQpIGluc2VydF9hdCk7CisgIAorICBBU1NJR05fOF9PQ1RFVFMgKHJlYWwtPnN0ciArIGluc2VydF9hdCwgb2N0ZXRzKTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKioKKyAqIEluc2VydHMgcGFkZGluZyBhdCAqaW5zZXJ0X2F0IHN1Y2ggdG8gYWxpZ24gaXQgdG8gdGhlIGdpdmVuCisgKiBib3VuZGFyeS4gSW5pdGlhbGl6ZXMgdGhlIHBhZGRpbmcgdG8gbnVsIGJ5dGVzLiBTZXRzICppbnNlcnRfYXQKKyAqIHRvIHRoZSBhbGlnbmVkIHBvc2l0aW9uLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIERCdXNTdHJpbmcKKyAqIEBwYXJhbSBpbnNlcnRfYXQgbG9jYXRpb24gdG8gYmUgYWxpZ25lZAorICogQHBhcmFtIGFsaWdubWVudCBhbGlnbm1lbnQgYm91bmRhcnkgKDEsIDIsIDQsIG9yIDgpCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfaW5zZXJ0X2FsaWdubWVudCAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBhbGlnbm1lbnQpCit7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICAKKyAgaWYgKCFhbGlnbl9pbnNlcnRfcG9pbnRfdGhlbl9vcGVuX2dhcCAoc3RyLCBpbnNlcnRfYXQsIGFsaWdubWVudCwgMCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX2Fzc2VydCAoX0RCVVNfQUxJR05fVkFMVUUgKCppbnNlcnRfYXQsIGFsaWdubWVudCkgPT0gKHVuc2lnbmVkKSAqaW5zZXJ0X2F0KTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBBcHBlbmRzIGEgcHJpbnRmLXN0eWxlIGZvcm1hdHRlZCBzdHJpbmcKKyAqIHRvIHRoZSAjREJ1c1N0cmluZy4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBmb3JtYXQgcHJpbnRmIGZvcm1hdAorICogQHBhcmFtIGFyZ3MgdmFyaWFibGUgYXJndW1lbnQgbGlzdAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGZfdmFsaXN0ICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0ICAgICAgICAgICAgYXJncykKK3sKKyAgaW50IGxlbjsKKyAgdmFfbGlzdCBhcmdzX2NvcHk7CisKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisKKyAgREJVU19WQV9DT1BZIChhcmdzX2NvcHksIGFyZ3MpOworCisgIC8qIE1lYXN1cmUgdGhlIG1lc3NhZ2UgbGVuZ3RoIHdpdGhvdXQgdGVybWluYXRpbmcgbnVsICovCisgIGxlbiA9IF9kYnVzX3ByaW50Zl9zdHJpbmdfdXBwZXJfYm91bmQgKGZvcm1hdCwgYXJncyk7CisKKyAgaWYgKGxlbiA8IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2xlbmd0aGVuIChzdHIsIGxlbikpCisgICAgeworICAgICAgLyogZG9uJ3QgbGVhayB0aGUgY29weSAqLworICAgICAgdmFfZW5kIChhcmdzX2NvcHkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIHZzcHJpbnRmICgoY2hhciopIChyZWFsLT5zdHIgKyAocmVhbC0+bGVuIC0gbGVuKSksCisgICAgICAgICAgICBmb3JtYXQsIGFyZ3NfY29weSk7CisKKyAgdmFfZW5kIChhcmdzX2NvcHkpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEFwcGVuZHMgYSBwcmludGYtc3R5bGUgZm9ybWF0dGVkIHN0cmluZworICogdG8gdGhlICNEQnVzU3RyaW5nLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIGZvcm1hdCBwcmludGYgZm9ybWF0CisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIAorICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyAgcmV0dmFsID0gX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGZfdmFsaXN0IChzdHIsIGZvcm1hdCwgYXJncyk7CisgIHZhX2VuZCAoYXJncyk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBBcHBlbmRzIGJsb2NrIG9mIGJ5dGVzIHdpdGggdGhlIGdpdmVuIGxlbmd0aCB0byBhIERCdXNTdHJpbmcuCisgKgorICogQHBhcmFtIHN0ciB0aGUgREJ1c1N0cmluZworICogQHBhcmFtIGJ1ZmZlciB0aGUgYnl0ZXMgdG8gYXBwZW5kCisgKiBAcGFyYW0gbGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYXBwZW5kCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfYXBwZW5kX2xlbiAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBsZW4pCit7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKGJ1ZmZlciAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisKKyAgcmV0dXJuIGFwcGVuZCAocmVhbCwgYnVmZmVyLCBsZW4pOworfQorCisvKioKKyAqIEFwcGVuZHMgYSBzaW5nbGUgYnl0ZSB0byB0aGUgc3RyaW5nLCByZXR1cm5pbmcgI0ZBTFNFCisgKiBpZiBub3QgZW5vdWdoIG1lbW9yeS4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBieXRlIHRoZSBieXRlIHRvIGFwcGVuZAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChEQnVzU3RyaW5nICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgIGJ5dGUpCit7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworCisgIGlmICghc2V0X2xlbmd0aCAocmVhbCwgcmVhbC0+bGVuICsgMSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJlYWwtPnN0cltyZWFsLT5sZW4tMV0gPSBieXRlOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZGVsZXRlIChEQnVzUmVhbFN0cmluZyAqcmVhbCwKKyAgICAgICAgaW50ICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICBpbnQgICAgICAgICAgICAgbGVuKQoreworICBpZiAobGVuID09IDApCisgICAgcmV0dXJuOworICAKKyAgbWVtbW92ZSAocmVhbC0+c3RyICsgc3RhcnQsIHJlYWwtPnN0ciArIHN0YXJ0ICsgbGVuLCByZWFsLT5sZW4gLSAoc3RhcnQgKyBsZW4pKTsKKyAgcmVhbC0+bGVuIC09IGxlbjsKKyAgcmVhbC0+c3RyW3JlYWwtPmxlbl0gPSAnXDAnOworfQorCisvKioKKyAqIERlbGV0ZXMgYSBzZWdtZW50IG9mIGEgREJ1c1N0cmluZyB3aXRoIGxlbmd0aCBsZW4gc3RhcnRpbmcgYXQKKyAqIHN0YXJ0LiAoSGludDogdG8gY2xlYXIgYW4gZW50aXJlIHN0cmluZywgc2V0dGluZyBsZW5ndGggdG8gMAorICogd2l0aCBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCgpIGlzIGVhc2llci4pCisgKgorICogQHBhcmFtIHN0ciB0aGUgREJ1c1N0cmluZworICogQHBhcmFtIHN0YXJ0IHdoZXJlIHRvIHN0YXJ0IGRlbGV0aW5nCisgKiBAcGFyYW0gbGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gZGVsZXRlCisgKi8KK3ZvaWQKK19kYnVzX3N0cmluZ19kZWxldGUgKERCdXNTdHJpbmcgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuKQoreworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPD0gcmVhbC0+bGVuIC0gc3RhcnQpOworICAKKyAgZGVsZXRlIChyZWFsLCBzdGFydCwgbGVuKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citjb3B5IChEQnVzUmVhbFN0cmluZyAqc291cmNlLAorICAgICAgaW50ICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgaW50ICAgICAgICAgICAgIGxlbiwKKyAgICAgIERCdXNSZWFsU3RyaW5nICpkZXN0LAorICAgICAgaW50ICAgICAgICAgICAgIGluc2VydF9hdCkKK3sKKyAgaWYgKGxlbiA9PSAwKQorICAgIHJldHVybiBUUlVFOworCisgIGlmICghb3Blbl9nYXAgKGxlbiwgZGVzdCwgaW5zZXJ0X2F0KSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBtZW1tb3ZlIChkZXN0LT5zdHIgKyBpbnNlcnRfYXQsCisgICAgICAgICAgIHNvdXJjZS0+c3RyICsgc3RhcnQsCisgICAgICAgICAgIGxlbik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ2hlY2tzIGFzc2VydGlvbnMgZm9yIHR3byBzdHJpbmdzIHdlJ3JlIGNvcHlpbmcgYSBzZWdtZW50IGJldHdlZW4sCisgKiBhbmQgZGVjbGFyZXMgcmVhbF9zb3VyY2UvcmVhbF9kZXN0IHZhcmlhYmxlcy4KKyAqCisgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2Ugc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0aW5nIG9mZnNldAorICogQHBhcmFtIGRlc3QgdGhlIGRlc3Qgc3RyaW5nCisgKiBAcGFyYW0gaW5zZXJ0X2F0IHdoZXJlIHRoZSBjb3BpZWQgc2VnbWVudCBpcyBpbnNlcnRlZAorICovCisjZGVmaW5lIERCVVNfU1RSSU5HX0NPUFlfUFJFQU1CTEUoc291cmNlLCBzdGFydCwgZGVzdCwgaW5zZXJ0X2F0KSAgICAgICBcCisgIERCdXNSZWFsU3RyaW5nICpyZWFsX3NvdXJjZSA9IChEQnVzUmVhbFN0cmluZyopIHNvdXJjZTsgICAgICAgICAgICAgICBcCisgIERCdXNSZWFsU3RyaW5nICpyZWFsX2Rlc3QgPSAoREJ1c1JlYWxTdHJpbmcqKSBkZXN0OyAgICAgICAgICAgICAgICAgICBcCisgIF9kYnVzX2Fzc2VydCAoKHNvdXJjZSkgIT0gKGRlc3QpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgKHJlYWxfc291cmNlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgKHJlYWxfZGVzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9kYnVzX2Fzc2VydCAoIXJlYWxfZGVzdC0+Y29uc3RhbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9kYnVzX2Fzc2VydCAoIXJlYWxfZGVzdC0+bG9ja2VkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9kYnVzX2Fzc2VydCAoKHN0YXJ0KSA+PSAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9kYnVzX2Fzc2VydCAoKHN0YXJ0KSA8PSByZWFsX3NvdXJjZS0+bGVuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9kYnVzX2Fzc2VydCAoKGluc2VydF9hdCkgPj0gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9kYnVzX2Fzc2VydCAoKGluc2VydF9hdCkgPD0gcmVhbF9kZXN0LT5sZW4pCisKKy8qKgorICogTW92ZXMgdGhlIGVuZCBvZiBvbmUgc3RyaW5nIGludG8gYW5vdGhlciBzdHJpbmcuIEJvdGggc3RyaW5ncworICogbXVzdCBiZSBpbml0aWFsaXplZCwgdmFsaWQgc3RyaW5ncy4KKyAqCisgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2Ugc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgd2hlcmUgdG8gY2hvcCBvZmYgdGhlIHNvdXJjZSBzdHJpbmcKKyAqIEBwYXJhbSBkZXN0IHRoZSBkZXN0aW5hdGlvbiBzdHJpbmcKKyAqIEBwYXJhbSBpbnNlcnRfYXQgd2hlcmUgdG8gbW92ZSB0aGUgY2hvcHBlZC1vZmYgcGFydCBvZiBzb3VyY2Ugc3RyaW5nCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19tb3ZlIChEQnVzU3RyaW5nICAgICAgICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBpbnNlcnRfYXQpCit7CisgIERCdXNSZWFsU3RyaW5nICpyZWFsX3NvdXJjZSA9IChEQnVzUmVhbFN0cmluZyopIHNvdXJjZTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSByZWFsX3NvdXJjZS0+bGVuKTsKKyAgCisgIHJldHVybiBfZGJ1c19zdHJpbmdfbW92ZV9sZW4gKHNvdXJjZSwgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxfc291cmNlLT5sZW4gLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCwgaW5zZXJ0X2F0KTsKK30KKworLyoqCisgKiBMaWtlIF9kYnVzX3N0cmluZ19tb3ZlKCksIGJ1dCBkb2VzIG5vdCBkZWxldGUgdGhlIHNlY3Rpb24KKyAqIG9mIHRoZSBzb3VyY2Ugc3RyaW5nIHRoYXQncyBjb3BpZWQgdG8gdGhlIGRlc3Qgc3RyaW5nLgorICoKKyAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCB3aGVyZSB0byBzdGFydCBjb3B5aW5nIHRoZSBzb3VyY2Ugc3RyaW5nCisgKiBAcGFyYW0gZGVzdCB0aGUgZGVzdGluYXRpb24gc3RyaW5nCisgKiBAcGFyYW0gaW5zZXJ0X2F0IHdoZXJlIHRvIHBsYWNlIHRoZSBjb3BpZWQgcGFydCBvZiBzb3VyY2Ugc3RyaW5nCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19jb3B5IChjb25zdCBEQnVzU3RyaW5nICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBpbnNlcnRfYXQpCit7CisgIERCVVNfU1RSSU5HX0NPUFlfUFJFQU1CTEUgKHNvdXJjZSwgc3RhcnQsIGRlc3QsIGluc2VydF9hdCk7CisKKyAgcmV0dXJuIGNvcHkgKHJlYWxfc291cmNlLCBzdGFydCwKKyAgICAgICAgICAgICAgIHJlYWxfc291cmNlLT5sZW4gLSBzdGFydCwKKyAgICAgICAgICAgICAgIHJlYWxfZGVzdCwKKyAgICAgICAgICAgICAgIGluc2VydF9hdCk7Cit9CisKKy8qKgorICogTGlrZSBfZGJ1c19zdHJpbmdfbW92ZSgpLCBidXQgY2FuIG1vdmUgYSBzZWdtZW50IGZyb20KKyAqIHRoZSBtaWRkbGUgb2YgdGhlIHNvdXJjZSBzdHJpbmcuCisgKgorICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IGZpcnN0IGJ5dGUgb2Ygc291cmNlIHN0cmluZyB0byBtb3ZlCisgKiBAcGFyYW0gbGVuIGxlbmd0aCBvZiBzZWdtZW50IHRvIG1vdmUKKyAqIEBwYXJhbSBkZXN0IHRoZSBkZXN0aW5hdGlvbiBzdHJpbmcKKyAqIEBwYXJhbSBpbnNlcnRfYXQgd2hlcmUgdG8gbW92ZSB0aGUgYnl0ZXMgZnJvbSB0aGUgc291cmNlIHN0cmluZworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfbW92ZV9sZW4gKERCdXNTdHJpbmcgICAgICAgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgaW5zZXJ0X2F0KQorCit7CisgIERCVVNfU1RSSU5HX0NPUFlfUFJFQU1CTEUgKHNvdXJjZSwgc3RhcnQsIGRlc3QsIGluc2VydF9hdCk7CisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworICBfZGJ1c19hc3NlcnQgKChzdGFydCArIGxlbikgPD0gcmVhbF9zb3VyY2UtPmxlbik7CisKKworICBpZiAobGVuID09IDApCisgICAgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChzdGFydCA9PSAwICYmCisgICAgICAgICAgIGxlbiA9PSByZWFsX3NvdXJjZS0+bGVuICYmCisgICAgICAgICAgIHJlYWxfZGVzdC0+bGVuID09IDApCisgICAgeworICAgICAgLyogU2hvcnQtY2lyY3VpdCBtb3ZpbmcgYW4gZW50aXJlIGV4aXN0aW5nIHN0cmluZyB0byBhbiBlbXB0eSBzdHJpbmcKKyAgICAgICAqIGJ5IGp1c3Qgc3dhcHBpbmcgdGhlIGJ1ZmZlcnMuCisgICAgICAgKi8KKyAgICAgIC8qIHdlIGFzc3VtZSAtPmNvbnN0YW50IGRvZXNuJ3QgbWF0dGVyIGFzIHlvdSBjYW4ndCBoYXZlCisgICAgICAgKiBhIGNvbnN0YW50IHN0cmluZyBpbnZvbHZlZCBpbiBhIG1vdmUuCisgICAgICAgKi8KKyNkZWZpbmUgQVNTSUdOX0RBVEEoYSwgYikgZG8geyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGEpLT5zdHIgPSAoYiktPnN0cjsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGEpLT5sZW4gPSAoYiktPmxlbjsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGEpLT5hbGxvY2F0ZWQgPSAoYiktPmFsbG9jYXRlZDsgICAgICAgIFwKKyAgICAgICAgKGEpLT5hbGlnbl9vZmZzZXQgPSAoYiktPmFsaWduX29mZnNldDsgIFwKKyAgICAgIH0gd2hpbGUgKDApCisgICAgICAKKyAgICAgIERCdXNSZWFsU3RyaW5nIHRtcDsKKworICAgICAgQVNTSUdOX0RBVEEgKCZ0bXAsIHJlYWxfc291cmNlKTsKKyAgICAgIEFTU0lHTl9EQVRBIChyZWFsX3NvdXJjZSwgcmVhbF9kZXN0KTsKKyAgICAgIEFTU0lHTl9EQVRBIChyZWFsX2Rlc3QsICZ0bXApOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIWNvcHkgKHJlYWxfc291cmNlLCBzdGFydCwgbGVuLAorICAgICAgICAgICAgICAgICByZWFsX2Rlc3QsCisgICAgICAgICAgICAgICAgIGluc2VydF9hdCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgZGVsZXRlIChyZWFsX3NvdXJjZSwgc3RhcnQsCisgICAgICAgICAgICAgIGxlbik7CisgICAgICAKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KK30KKworLyoqCisgKiBMaWtlIF9kYnVzX3N0cmluZ19jb3B5KCksIGJ1dCBjYW4gY29weSBhIHNlZ21lbnQgZnJvbSB0aGUgbWlkZGxlIG9mCisgKiB0aGUgc291cmNlIHN0cmluZy4KKyAqCisgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2Ugc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgd2hlcmUgdG8gc3RhcnQgY29weWluZyB0aGUgc291cmNlIHN0cmluZworICogQHBhcmFtIGxlbiBsZW5ndGggb2Ygc2VnbWVudCB0byBjb3B5CisgKiBAcGFyYW0gZGVzdCB0aGUgZGVzdGluYXRpb24gc3RyaW5nCisgKiBAcGFyYW0gaW5zZXJ0X2F0IHdoZXJlIHRvIHBsYWNlIHRoZSBjb3BpZWQgc2VnbWVudCBvZiBzb3VyY2Ugc3RyaW5nCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19jb3B5X2xlbiAoY29uc3QgREJ1c1N0cmluZyAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBpbnNlcnRfYXQpCit7CisgIERCVVNfU1RSSU5HX0NPUFlfUFJFQU1CTEUgKHNvdXJjZSwgc3RhcnQsIGRlc3QsIGluc2VydF9hdCk7CisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IHJlYWxfc291cmNlLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKGxlbiA8PSByZWFsX3NvdXJjZS0+bGVuIC0gc3RhcnQpOworICAKKyAgcmV0dXJuIGNvcHkgKHJlYWxfc291cmNlLCBzdGFydCwgbGVuLAorICAgICAgICAgICAgICAgcmVhbF9kZXN0LAorICAgICAgICAgICAgICAgaW5zZXJ0X2F0KTsKK30KKworLyoqCisgKiBSZXBsYWNlcyBhIHNlZ21lbnQgb2YgZGVzdCBzdHJpbmcgd2l0aCBhIHNlZ21lbnQgb2Ygc291cmNlIHN0cmluZy4KKyAqCisgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2Ugc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgd2hlcmUgdG8gc3RhcnQgY29weWluZyB0aGUgc291cmNlIHN0cmluZworICogQHBhcmFtIGxlbiBsZW5ndGggb2Ygc2VnbWVudCB0byBjb3B5CisgKiBAcGFyYW0gZGVzdCB0aGUgZGVzdGluYXRpb24gc3RyaW5nCisgKiBAcGFyYW0gcmVwbGFjZV9hdCBzdGFydCBvZiBzZWdtZW50IG9mIGRlc3Qgc3RyaW5nIHRvIHJlcGxhY2UKKyAqIEBwYXJhbSByZXBsYWNlX2xlbiBsZW5ndGggb2Ygc2VnbWVudCBvZiBkZXN0IHN0cmluZyB0byByZXBsYWNlCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfcmVwbGFjZV9sZW4gKGNvbnN0IERCdXNTdHJpbmcgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgcmVwbGFjZV9hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgcmVwbGFjZV9sZW4pCit7CisgIERCVVNfU1RSSU5HX0NPUFlfUFJFQU1CTEUgKHNvdXJjZSwgc3RhcnQsIGRlc3QsIHJlcGxhY2VfYXQpOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSByZWFsX3NvdXJjZS0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPD0gcmVhbF9zb3VyY2UtPmxlbiAtIHN0YXJ0KTsKKyAgX2RidXNfYXNzZXJ0IChyZXBsYWNlX2F0ID49IDApOworICBfZGJ1c19hc3NlcnQgKHJlcGxhY2VfYXQgPD0gcmVhbF9kZXN0LT5sZW4pOworICBfZGJ1c19hc3NlcnQgKHJlcGxhY2VfbGVuIDw9IHJlYWxfZGVzdC0+bGVuIC0gcmVwbGFjZV9hdCk7CisKKyAgaWYgKGxlbiA9PSByZXBsYWNlX2xlbikKKyAgICB7CisgICAgICBtZW1tb3ZlIChyZWFsX2Rlc3QtPnN0ciArIHJlcGxhY2VfYXQsCisgICAgICAgICAgICAgICByZWFsX3NvdXJjZS0+c3RyICsgc3RhcnQsIGxlbik7CisgICAgfQorICBlbHNlIGlmIChsZW4gPCByZXBsYWNlX2xlbikKKyAgICB7CisgICAgICBtZW1tb3ZlIChyZWFsX2Rlc3QtPnN0ciArIHJlcGxhY2VfYXQsCisgICAgICAgICAgICAgICByZWFsX3NvdXJjZS0+c3RyICsgc3RhcnQsIGxlbik7CisgICAgICBkZWxldGUgKHJlYWxfZGVzdCwgcmVwbGFjZV9hdCArIGxlbiwKKyAgICAgICAgICAgICAgcmVwbGFjZV9sZW4gLSBsZW4pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGludCBkaWZmOworCisgICAgICBfZGJ1c19hc3NlcnQgKGxlbiA+IHJlcGxhY2VfbGVuKTsKKworICAgICAgZGlmZiA9IGxlbiAtIHJlcGxhY2VfbGVuOworCisgICAgICAvKiBGaXJzdCBvZiBhbGwgd2UgY2hlY2sgaWYgZGVzdGluYXRpb24gc3RyaW5nIGNhbiBiZSBlbmxhcmdlZCBhcworICAgICAgICogcmVxdWlyZWQsIHRoZW4gd2Ugb3ZlcndyaXRlIHByZXZpb3VzIGJ5dGVzCisgICAgICAgKi8KKworICAgICAgaWYgKCFjb3B5IChyZWFsX3NvdXJjZSwgc3RhcnQgKyByZXBsYWNlX2xlbiwgZGlmZiwKKyAgICAgICAgICAgICAgICAgcmVhbF9kZXN0LCByZXBsYWNlX2F0ICsgcmVwbGFjZV9sZW4pKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIG1lbW1vdmUgKHJlYWxfZGVzdC0+c3RyICsgcmVwbGFjZV9hdCwKKyAgICAgICAgICAgICAgIHJlYWxfc291cmNlLT5zdHIgKyBzdGFydCwgcmVwbGFjZV9sZW4pOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBMb29rcyBmb3IgdGhlIGZpcnN0IG9jY3VyYW5jZSBvZiBhIGJ5dGUsIGRlbGV0ZXMgdGhhdCBieXRlLAorICogYW5kIG1vdmVzIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGJ5dGUgdG8gdGhlIGJlZ2lubmluZyBvZiBhCisgKiBzZXBhcmF0ZSBzdHJpbmcuICBCb3RoIHN0cmluZ3MgbXVzdCBiZSBpbml0aWFsaXplZCwgdmFsaWQKKyAqIHN0cmluZ3MuCisgKgorICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIHN0cmluZworICogQHBhcmFtIGJ5dGUgdGhlIGJ5dGUgdG8gcmVtb3ZlIGFuZCBzcGxpdCB0aGUgc3RyaW5nIGF0CisgKiBAcGFyYW0gdGFpbCB0aGUgc3BsaXQgb2ZmIHN0cmluZworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5IG9yIGlmIGJ5dGUgY291bGQgbm90IGJlIGZvdW5kCisgKgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX3NwbGl0X29uX2J5dGUgKERCdXNTdHJpbmcgICAgICAgICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIGJ5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgKnRhaWwpCit7CisgIGludCBieXRlX3Bvc2l0aW9uOworICBjaGFyIGJ5dGVfc3RyaW5nWzJdID0gIiI7CisgIGludCBoZWFkX2xlbmd0aDsKKyAgaW50IHRhaWxfbGVuZ3RoOworCisgIGJ5dGVfc3RyaW5nWzBdID0gKGNoYXIpIGJ5dGU7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZCAoc291cmNlLCAwLCBieXRlX3N0cmluZywgJmJ5dGVfcG9zaXRpb24pKQorICAgIHJldHVybiBGQUxTRTsKKworICBoZWFkX2xlbmd0aCA9IGJ5dGVfcG9zaXRpb247CisgIHRhaWxfbGVuZ3RoID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHNvdXJjZSkgLSBoZWFkX2xlbmd0aCAtIDE7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbW92ZV9sZW4gKHNvdXJjZSwgYnl0ZV9wb3NpdGlvbiArIDEsIHRhaWxfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFpbCwgMCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIHJlbW92ZSB0aGUgdHJhaWxpbmcgZGVsaW1pdGVyIGJ5dGUgZnJvbSB0aGUgaGVhZCBub3cuCisgICAqLworICBpZiAoIV9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChzb3VyY2UsIGhlYWRfbGVuZ3RoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIFVuaWNvZGUgbWFjcm9zIGFuZCB1dGY4X3ZhbGlkYXRlKCkgZnJvbSBHTGliIE93ZW4gVGF5bG9yLCBIYXZvYworICogUGVubmluZ3RvbiwgYW5kIFRvbSBUcm9tZXkgYXJlIHRoZSBhdXRob3JzIGFuZCBhdXRob3JpemVkIHJlbGljZW5zZS4KKyAqLworCisvKiogY29tcHV0ZXMgbGVuZ3RoIGFuZCBtYXNrIG9mIGEgdW5pY29kZSBjaGFyYWN0ZXIKKyAqIEBwYXJhbSBDaGFyIHRoZSBjaGFyCisgKiBAcGFyYW0gTWFzayB0aGUgbWFzayB2YXJpYWJsZSB0byBhc3NpZ24gdG8KKyAqIEBwYXJhbSBMZW4gdGhlIGxlbmd0aCB2YXJpYWJsZSB0byBhc3NpZ24gdG8KKyAqLworI2RlZmluZSBVVEY4X0NPTVBVVEUoQ2hhciwgTWFzaywgTGVuKQkJCQkJICAgICAgXAorICBpZiAoQ2hhciA8IDEyOCkJCQkJCQkJICAgICAgXAorICAgIHsJCQkJCQkJCQkgICAgICBcCisgICAgICBMZW4gPSAxOwkJCQkJCQkJICAgICAgXAorICAgICAgTWFzayA9IDB4N2Y7CQkJCQkJCSAgICAgIFwKKyAgICB9CQkJCQkJCQkJICAgICAgXAorICBlbHNlIGlmICgoQ2hhciAmIDB4ZTApID09IDB4YzApCQkJCQkgICAgICBcCisgICAgewkJCQkJCQkJCSAgICAgIFwKKyAgICAgIExlbiA9IDI7CQkJCQkJCQkgICAgICBcCisgICAgICBNYXNrID0gMHgxZjsJCQkJCQkJICAgICAgXAorICAgIH0JCQkJCQkJCQkgICAgICBcCisgIGVsc2UgaWYgKChDaGFyICYgMHhmMCkgPT0gMHhlMCkJCQkJCSAgICAgIFwKKyAgICB7CQkJCQkJCQkJICAgICAgXAorICAgICAgTGVuID0gMzsJCQkJCQkJCSAgICAgIFwKKyAgICAgIE1hc2sgPSAweDBmOwkJCQkJCQkgICAgICBcCisgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgZWxzZSBpZiAoKENoYXIgJiAweGY4KSA9PSAweGYwKQkJCQkJICAgICAgXAorICAgIHsJCQkJCQkJCQkgICAgICBcCisgICAgICBMZW4gPSA0OwkJCQkJCQkJICAgICAgXAorICAgICAgTWFzayA9IDB4MDc7CQkJCQkJCSAgICAgIFwKKyAgICB9CQkJCQkJCQkJICAgICAgXAorICBlbHNlIGlmICgoQ2hhciAmIDB4ZmMpID09IDB4ZjgpCQkJCQkgICAgICBcCisgICAgewkJCQkJCQkJCSAgICAgIFwKKyAgICAgIExlbiA9IDU7CQkJCQkJCQkgICAgICBcCisgICAgICBNYXNrID0gMHgwMzsJCQkJCQkJICAgICAgXAorICAgIH0JCQkJCQkJCQkgICAgICBcCisgIGVsc2UgaWYgKChDaGFyICYgMHhmZSkgPT0gMHhmYykJCQkJCSAgICAgIFwKKyAgICB7CQkJCQkJCQkJICAgICAgXAorICAgICAgTGVuID0gNjsJCQkJCQkJCSAgICAgIFwKKyAgICAgIE1hc2sgPSAweDAxOwkJCQkJCQkgICAgICBcCisgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIExlbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgTWFzayA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworLyoqCisgKiBjb21wdXRlcyBsZW5ndGggb2YgYSB1bmljb2RlIGNoYXJhY3RlciBpbiBVVEYtOAorICogQHBhcmFtIENoYXIgdGhlIGNoYXIKKyAqLworI2RlZmluZSBVVEY4X0xFTkdUSChDaGFyKSAgICAgICAgICAgICAgXAorICAoKENoYXIpIDwgMHg4MCA/IDEgOiAgICAgICAgICAgICAgICAgXAorICAgKChDaGFyKSA8IDB4ODAwID8gMiA6ICAgICAgICAgICAgICAgXAorICAgICgoQ2hhcikgPCAweDEwMDAwID8gMyA6ICAgICAgICAgICAgXAorICAgICAoKENoYXIpIDwgMHgyMDAwMDAgPyA0IDogICAgICAgICAgXAorICAgICAgKChDaGFyKSA8IDB4NDAwMDAwMCA/IDUgOiA2KSkpKSkKKyAgIAorLyoqCisgKiBHZXRzIGEgVVRGLTggdmFsdWUuCisgKgorICogQHBhcmFtIFJlc3VsdCB2YXJpYWJsZSBmb3IgZXh0cmFjdGVkIHVuaWNvZGUgY2hhci4KKyAqIEBwYXJhbSBDaGFycyB0aGUgYnl0ZXMgdG8gZGVjb2RlCisgKiBAcGFyYW0gQ291bnQgY291bnRlciB2YXJpYWJsZQorICogQHBhcmFtIE1hc2sgbWFzayBmb3IgdGhpcyBjaGFyCisgKiBAcGFyYW0gTGVuIGxlbmd0aCBmb3IgdGhpcyBjaGFyIGluIGJ5dGVzCisgKi8KKyNkZWZpbmUgVVRGOF9HRVQoUmVzdWx0LCBDaGFycywgQ291bnQsIE1hc2ssIExlbikJCQkgICAgICBcCisgIChSZXN1bHQpID0gKENoYXJzKVswXSAmIChNYXNrKTsJCQkJCSAgICAgIFwKKyAgZm9yICgoQ291bnQpID0gMTsgKENvdW50KSA8IChMZW4pOyArKyhDb3VudCkpCQkJCSAgICAgIFwKKyAgICB7CQkJCQkJCQkJICAgICAgXAorICAgICAgaWYgKCgoQ2hhcnMpWyhDb3VudCldICYgMHhjMCkgIT0gMHg4MCkJCQkJICAgICAgXAorCXsJCQkJCQkJCSAgICAgIFwKKwkgIChSZXN1bHQpID0gLTE7CQkJCQkJICAgICAgXAorCSAgYnJlYWs7CQkJCQkJCSAgICAgIFwKKwl9CQkJCQkJCQkgICAgICBcCisgICAgICAoUmVzdWx0KSA8PD0gNjsJCQkJCQkJICAgICAgXAorICAgICAgKFJlc3VsdCkgfD0gKChDaGFycylbKENvdW50KV0gJiAweDNmKTsJCQkJICAgICAgXAorICAgIH0KKworLyoqCisgKiBDaGVjayB3aGV0aGVyIGEgVW5pY29kZSAoNS4yKSBjaGFyIGlzIGluIGEgdmFsaWQgcmFuZ2UuCisgKgorICogVGhlIGZpcnN0IGNoZWNrIGNvbWVzIGZyb20gdGhlIFVuaWNvZGUgZ3VhcmFudGVlIHRvIG5ldmVyIGVuY29kZQorICogYSBwb2ludCBhYm92ZSAweDAwMTBmZmZmLCBzaW5jZSBVVEYtMTYgY291bGRuJ3QgcmVwcmVzZW50IGl0LgorICoKKyAqIFRoZSBzZWNvbmQgY2hlY2sgY292ZXJzIHN1cnJvZ2F0ZSBwYWlycyAoY2F0ZWdvcnkgQ3MpLgorICoKKyAqIFRoZSBsYXN0IHR3byBjaGVja3MgY292ZXIgIk5vbmNoYXJhY3RlciI6IGRlZmluZWQgYXM6CisgKiAgICJBIGNvZGUgcG9pbnQgdGhhdCBpcyBwZXJtYW5lbnRseSByZXNlcnZlZCBmb3IKKyAqICAgIGludGVybmFsIHVzZSwgYW5kIHRoYXQgc2hvdWxkIG5ldmVyIGJlIGludGVyY2hhbmdlZC4gSW4KKyAqICAgIFVuaWNvZGUgMy4xLCB0aGVzZSBjb25zaXN0IG9mIHRoZSB2YWx1ZXMgVStuRkZGRSBhbmQgVStuRkZGRgorICogICAgKHdoZXJlIG4gaXMgZnJvbSAwIHRvIDEwXzE2KSBhbmQgdGhlIHZhbHVlcyBVK0ZERDAuLlUrRkRFRi4iCisgKgorICogQHBhcmFtIENoYXIgdGhlIGNoYXJhY3RlcgorICovCisjZGVmaW5lIFVOSUNPREVfVkFMSUQoQ2hhcikgICAgICAgICAgICAgICAgICAgXAorICAgICgoQ2hhcikgPCAweDExMDAwMCAmJiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKCgoQ2hhcikgJiAweEZGRkZGODAwKSAhPSAweEQ4MDApICYmICAgICBcCisgICAgICgoQ2hhcikgPCAweEZERDAgfHwgKENoYXIpID4gMHhGREVGKSAmJiAgXAorICAgICAoKENoYXIpICYgMHhGRkZFKSAhPSAweEZGRkUpCisKKy8qKgorICogRmluZHMgdGhlIGdpdmVuIHN1YnN0cmluZyBpbiB0aGUgc3RyaW5nLAorICogcmV0dXJuaW5nICNUUlVFIGFuZCBmaWxsaW5nIGluIHRoZSBieXRlIGluZGV4CisgKiB3aGVyZSB0aGUgc3Vic3RyaW5nIHdhcyBmb3VuZCwgaWYgaXQgd2FzIGZvdW5kLgorICogUmV0dXJucyAjRkFMU0UgaWYgdGhlIHN1YnN0cmluZyB3YXNuJ3QgZm91bmQuCisgKiBTZXRzICpzdGFydCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaWYgdGhlIHN1YnN0cmluZworICogaXMgbm90IGZvdW5kLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHdoZXJlIHRvIHN0YXJ0IGxvb2tpbmcKKyAqIEBwYXJhbSBzdWJzdHIgdGhlIHN1YnN0cmluZworICogQHBhcmFtIGZvdW5kIHJldHVybiBsb2NhdGlvbiBmb3Igd2hlcmUgaXQgd2FzIGZvdW5kLCBvciAjTlVMTAorICogQHJldHVybnMgI1RSVUUgaWYgZm91bmQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19maW5kIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqc3Vic3RyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKmZvdW5kKQoreworICByZXR1cm4gX2RidXNfc3RyaW5nX2ZpbmRfdG8gKHN0ciwgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjb25zdCBEQnVzUmVhbFN0cmluZyopc3RyKS0+bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0ciwgZm91bmQpOworfQorCisvKioKKyAqIEZpbmRzIGVuZCBvZiBsaW5lICgiXHJcbiIgb3IgIlxuIikgaW4gdGhlIHN0cmluZywKKyAqIHJldHVybmluZyAjVFJVRSBhbmQgZmlsbGluZyBpbiB0aGUgYnl0ZSBpbmRleAorICogd2hlcmUgdGhlIGVvbCBzdHJpbmcgd2FzIGZvdW5kLCBpZiBpdCB3YXMgZm91bmQuCisgKiBSZXR1cm5zICNGQUxTRSBpZiBlb2wgd2Fzbid0IGZvdW5kLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHdoZXJlIHRvIHN0YXJ0IGxvb2tpbmcKKyAqIEBwYXJhbSBmb3VuZCByZXR1cm4gbG9jYXRpb24gZm9yIHdoZXJlIGVvbCB3YXMgZm91bmQgb3Igc3RyaW5nIGxlbmd0aCBvdGhlcndpc2UKKyAqIEBwYXJhbSBmb3VuZF9sZW4gcmV0dXJuIGxlbmd0aCBvZiBmb3VuZCBlb2wgc3RyaW5nIG9yIHplcm8gb3RoZXJ3aXNlCisgKiBAcmV0dXJucyAjVFJVRSBpZiBmb3VuZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2ZpbmRfZW9sIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpmb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqZm91bmRfbGVuKQoreworICBpbnQgaTsKKworICBEQlVTX0NPTlNUX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSByZWFsLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ID49IDApOworICAKKyAgaSA9IHN0YXJ0OworICB3aGlsZSAoaSA8IHJlYWwtPmxlbikKKyAgICB7CisgICAgICBpZiAocmVhbC0+c3RyW2ldID09ICdccicpIAorICAgICAgICB7CisgICAgICAgICAgaWYgKChpKzEpIDwgcmVhbC0+bGVuICYmIHJlYWwtPnN0cltpKzFdID09ICdcbicpIC8qICJcclxuIiAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoZm91bmQpIAorICAgICAgICAgICAgICAgICpmb3VuZCA9IGk7CisgICAgICAgICAgICAgIGlmIChmb3VuZF9sZW4pCisgICAgICAgICAgICAgICAgKmZvdW5kX2xlbiA9IDI7CisgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgfSAKKyAgICAgICAgICBlbHNlIC8qIG9ubHkgIlxyIiAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoZm91bmQpIAorICAgICAgICAgICAgICAgICpmb3VuZCA9IGk7CisgICAgICAgICAgICAgIGlmIChmb3VuZF9sZW4pCisgICAgICAgICAgICAgICAgKmZvdW5kX2xlbiA9IDE7CisgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9IAorICAgICAgZWxzZSBpZiAocmVhbC0+c3RyW2ldID09ICdcbicpICAvKiBvbmx5ICJcbiIgKi8KKyAgICAgICAgeworICAgICAgICAgIGlmIChmb3VuZCkgCisgICAgICAgICAgICAqZm91bmQgPSBpOworICAgICAgICAgIGlmIChmb3VuZF9sZW4pCisgICAgICAgICAgICAqZm91bmRfbGVuID0gMTsKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgKytpOworICAgIH0KKworICBpZiAoZm91bmQpCisgICAgKmZvdW5kID0gcmVhbC0+bGVuOworCisgIGlmIChmb3VuZF9sZW4pCisgICAgKmZvdW5kX2xlbiA9IDA7CisgIAorICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogRmluZHMgdGhlIGdpdmVuIHN1YnN0cmluZyBpbiB0aGUgc3RyaW5nLAorICogdXAgdG8gYSBjZXJ0YWluIHBvc2l0aW9uLAorICogcmV0dXJuaW5nICNUUlVFIGFuZCBmaWxsaW5nIGluIHRoZSBieXRlIGluZGV4CisgKiB3aGVyZSB0aGUgc3Vic3RyaW5nIHdhcyBmb3VuZCwgaWYgaXQgd2FzIGZvdW5kLgorICogUmV0dXJucyAjRkFMU0UgaWYgdGhlIHN1YnN0cmluZyB3YXNuJ3QgZm91bmQuCisgKiBTZXRzICpzdGFydCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaWYgdGhlIHN1YnN0cmluZworICogaXMgbm90IGZvdW5kLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHdoZXJlIHRvIHN0YXJ0IGxvb2tpbmcKKyAqIEBwYXJhbSBlbmQgd2hlcmUgdG8gc3RvcCBsb29raW5nCisgKiBAcGFyYW0gc3Vic3RyIHRoZSBzdWJzdHJpbmcKKyAqIEBwYXJhbSBmb3VuZCByZXR1cm4gbG9jYXRpb24gZm9yIHdoZXJlIGl0IHdhcyBmb3VuZCwgb3IgI05VTEwKKyAqIEByZXR1cm5zICNUUlVFIGlmIGZvdW5kCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfZmluZF90byAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorCQkgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKwkJICAgICAgaW50ICAgICAgICAgICAgICAgZW5kLAorCQkgICAgICBjb25zdCBjaGFyICAgICAgICpzdWJzdHIsCisJCSAgICAgIGludCAgICAgICAgICAgICAgKmZvdW5kKQoreworICBpbnQgaTsKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoc3Vic3RyICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IHJlYWwtPmxlbik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3Vic3RyICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGVuZCA8PSByZWFsLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IGVuZCk7CisKKyAgLyogd2UgYWx3YXlzICJmaW5kIiBhbiBlbXB0eSBzdHJpbmcgKi8KKyAgaWYgKCpzdWJzdHIgPT0gJ1wwJykKKyAgICB7CisgICAgICBpZiAoZm91bmQpCisgICAgICAgICpmb3VuZCA9IHN0YXJ0OworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGkgPSBzdGFydDsKKyAgd2hpbGUgKGkgPCBlbmQpCisgICAgeworICAgICAgaWYgKHJlYWwtPnN0cltpXSA9PSBzdWJzdHJbMF0pCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgaiA9IGkgKyAxOworICAgICAgICAgIAorICAgICAgICAgIHdoaWxlIChqIDwgZW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoc3Vic3RyW2ogLSBpXSA9PSAnXDAnKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBlbHNlIGlmIChyZWFsLT5zdHJbal0gIT0gc3Vic3RyW2ogLSBpXSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICsrajsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChzdWJzdHJbaiAtIGldID09ICdcMCcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChmb3VuZCkKKyAgICAgICAgICAgICAgICAqZm91bmQgPSBpOworICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIGlmIChmb3VuZCkKKyAgICAqZm91bmQgPSBlbmQ7CisgIAorICByZXR1cm4gRkFMU0U7ICAKK30KKworLyoqCisgKiBGaW5kcyBhIGJsYW5rIChzcGFjZSBvciB0YWIpIGluIHRoZSBzdHJpbmcuIFJldHVybnMgI1RSVUUKKyAqIGlmIGZvdW5kLCAjRkFMU0Ugb3RoZXJ3aXNlLiBJZiBhIGJsYW5rIGlzIG5vdCBmb3VuZCBzZXRzCisgKiAqZm91bmQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IGJ5dGUgaW5kZXggdG8gc3RhcnQgbG9va2luZworICogQHBhcmFtIGZvdW5kIHBsYWNlIHRvIHN0b3JlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlyc3QgYmxhbmsKKyAqIEByZXR1cm5zICNUUlVFIGlmIGEgYmxhbmsgd2FzIGZvdW5kCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfZmluZF9ibGFuayAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKmZvdW5kKQoreworICBpbnQgaTsKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgCisgIGkgPSBzdGFydDsKKyAgd2hpbGUgKGkgPCByZWFsLT5sZW4pCisgICAgeworICAgICAgaWYgKHJlYWwtPnN0cltpXSA9PSAnICcgfHwKKyAgICAgICAgICByZWFsLT5zdHJbaV0gPT0gJ1x0JykKKyAgICAgICAgeworICAgICAgICAgIGlmIChmb3VuZCkKKyAgICAgICAgICAgICpmb3VuZCA9IGk7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgKytpOworICAgIH0KKworICBpZiAoZm91bmQpCisgICAgKmZvdW5kID0gcmVhbC0+bGVuOworICAKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIFNraXBzIGJsYW5rcyBmcm9tIHN0YXJ0LCBzdG9yaW5nIHRoZSBmaXJzdCBub24tYmxhbmsgaW4gKmVuZAorICogKGJsYW5rIGlzIHNwYWNlIG9yIHRhYikuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgd2hlcmUgdG8gc3RhcnQKKyAqIEBwYXJhbSBlbmQgd2hlcmUgdG8gc3RvcmUgdGhlIGZpcnN0IG5vbi1ibGFuayBieXRlIGluZGV4CisgKi8KK3ZvaWQKK19kYnVzX3N0cmluZ19za2lwX2JsYW5rIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqZW5kKQoreworICBpbnQgaTsKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgCisgIGkgPSBzdGFydDsKKyAgd2hpbGUgKGkgPCByZWFsLT5sZW4pCisgICAgeworICAgICAgaWYgKCFEQlVTX0lTX0FTQ0lJX0JMQU5LIChyZWFsLT5zdHJbaV0pKQorICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgKytpOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGkgPT0gcmVhbC0+bGVuIHx8ICFEQlVTX0lTX0FTQ0lJX1dISVRFIChyZWFsLT5zdHJbaV0pKTsKKyAgCisgIGlmIChlbmQpCisgICAgKmVuZCA9IGk7Cit9CisKKworLyoqCisgKiBTa2lwcyB3aGl0ZXNwYWNlIGZyb20gc3RhcnQsIHN0b3JpbmcgdGhlIGZpcnN0IG5vbi13aGl0ZXNwYWNlIGluICplbmQuCisgKiAod2hpdGVzcGFjZSBpcyBzcGFjZSwgdGFiLCBuZXdsaW5lLCBDUikuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgd2hlcmUgdG8gc3RhcnQKKyAqIEBwYXJhbSBlbmQgd2hlcmUgdG8gc3RvcmUgdGhlIGZpcnN0IG5vbi13aGl0ZXNwYWNlIGJ5dGUgaW5kZXgKKyAqLwordm9pZAorX2RidXNfc3RyaW5nX3NraXBfd2hpdGUgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICplbmQpCit7CisgIGludCBpOworICBEQlVTX0NPTlNUX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSByZWFsLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ID49IDApOworICAKKyAgaSA9IHN0YXJ0OworICB3aGlsZSAoaSA8IHJlYWwtPmxlbikKKyAgICB7CisgICAgICBpZiAoIURCVVNfSVNfQVNDSUlfV0hJVEUgKHJlYWwtPnN0cltpXSkpCisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoaSA9PSByZWFsLT5sZW4gfHwgIShEQlVTX0lTX0FTQ0lJX1dISVRFIChyZWFsLT5zdHJbaV0pKSk7CisgIAorICBpZiAoZW5kKQorICAgICplbmQgPSBpOworfQorCisvKioKKyAqIFNraXBzIHdoaXRlc3BhY2UgZnJvbSBlbmQsIHN0b3JpbmcgdGhlIHN0YXJ0IGluZGV4IG9mIHRoZSB0cmFpbGluZworICogd2hpdGVzcGFjZSBpbiAqc3RhcnQuICh3aGl0ZXNwYWNlIGlzIHNwYWNlLCB0YWIsIG5ld2xpbmUsIENSKS4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBlbmQgd2hlcmUgdG8gc3RhcnQgc2Nhbm5pbmcgYmFja3dhcmQKKyAqIEBwYXJhbSBzdGFydCB3aGVyZSB0byBzdG9yZSB0aGUgc3RhcnQgb2Ygd2hpdGVzcGFjZSBjaGFycworICovCit2b2lkCitfZGJ1c19zdHJpbmdfc2tpcF93aGl0ZV9yZXZlcnNlIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpzdGFydCkKK3sKKyAgaW50IGk7CisgIERCVVNfQ09OU1RfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKGVuZCA8PSByZWFsLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKGVuZCA+PSAwKTsKKyAgCisgIGkgPSBlbmQ7CisgIHdoaWxlIChpID4gMCkKKyAgICB7CisgICAgICBpZiAoIURCVVNfSVNfQVNDSUlfV0hJVEUgKHJlYWwtPnN0cltpLTFdKSkKKyAgICAgICAgYnJlYWs7CisgICAgICAtLWk7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoaSA+PSAwICYmIChpID09IDAgfHwgIShEQlVTX0lTX0FTQ0lJX1dISVRFIChyZWFsLT5zdHJbaS0xXSkpKSk7CisgIAorICBpZiAoc3RhcnQpCisgICAgKnN0YXJ0ID0gaTsKK30KKworLyoqCisgKiBBc3NpZ25zIGEgbmV3bGluZS10ZXJtaW5hdGVkIG9yIFxcclxcbi10ZXJtaW5hdGVkIGxpbmUgZnJvbSB0aGUgZnJvbnQKKyAqIG9mIHRoZSBzdHJpbmcgdG8gdGhlIGdpdmVuIGRlc3Qgc3RyaW5nLiBUaGUgZGVzdCBzdHJpbmcncyBwcmV2aW91cworICogY29udGVudHMgYXJlIGRlbGV0ZWQuIElmIHRoZSBzb3VyY2Ugc3RyaW5nIGNvbnRhaW5zIG5vIG5ld2xpbmUsCisgKiBtb3ZlcyB0aGUgZW50aXJlIHNvdXJjZSBzdHJpbmcgdG8gdGhlIGRlc3Qgc3RyaW5nLgorICoKKyAqIEB0b2RvIG93ZW4gY29ycmVjdGx5IG5vdGVzIHRoYXQgdGhpcyBpcyBhIHN0dXBpZCBmdW5jdGlvbiAoaXQgd2FzCisgKiB3cml0dGVuIHB1cmVseSBmb3IgdGVzdCBjb2RlLAorICogZS5nLiBkYnVzLW1lc3NhZ2UtYnVpbGRlci5jKS4gUHJvYmFibHkgc2hvdWxkIGJlIGVuZm9yY2VkIGFzIHRlc3QKKyAqIGNvZGUgb25seSB3aXRoIGlmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAqIAorICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIHN0cmluZworICogQHBhcmFtIGRlc3QgdGhlIGRlc3RpbmF0aW9uIHN0cmluZyAoY29udGVudHMgYXJlIHJlcGxhY2VkKQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeSwgb3Igc291cmNlIGhhcyBsZW5ndGggMAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX3BvcF9saW5lIChEQnVzU3RyaW5nICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgKmRlc3QpCit7CisgIGludCBlb2wsIGVvbF9sZW47CisgIAorICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoZGVzdCwgMCk7CisgIAorICBlb2wgPSAwOworICBlb2xfbGVuID0gMDsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZF9lb2wgKHNvdXJjZSwgMCwgJmVvbCwgJmVvbF9sZW4pKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoZW9sID09IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzb3VyY2UpKTsKKyAgICAgIGlmIChlb2wgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIC8qIElmIHRoZXJlJ3Mgbm8gbmV3bGluZSBhbmQgc291cmNlIGhhcyB6ZXJvIGxlbmd0aCwgd2UncmUgZG9uZSAqLworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgLyogb3RoZXJ3aXNlLCB0aGUgbGFzdCBsaW5lIG9mIHRoZSBmaWxlIGhhcyBubyBlb2wgY2hhcmFjdGVycyAqLworICAgIH0KKworICAvKiByZW1lbWJlciBlb2wgY2FuIGJlIDAgaWYgaXQncyBhbiBlbXB0eSBsaW5lLCBidXQgZW9sX2xlbiBzaG91bGQgbm90IGJlIHplcm8gYWxzbworICAgKiBzaW5jZSBmaW5kX2VvbCByZXR1cm5lZCBUUlVFCisgICAqLworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbW92ZV9sZW4gKHNvdXJjZSwgMCwgZW9sICsgZW9sX2xlbiwgZGVzdCwgMCkpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgLyogcmVtb3ZlIGxpbmUgZW5kaW5nICovCisgIGlmICghX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKGRlc3QsIGVvbCkpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib3V0IG9mIG1lbW9yeSB3aGVuIHNob3J0ZW5pbmcgYSBzdHJpbmciKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisvKioKKyAqIERlbGV0ZXMgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgZmlyc3QgYmxhbmsgc3BhY2UKKyAqIGluIHRoZSBzdHJpbmcuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKi8KK3ZvaWQKK19kYnVzX3N0cmluZ19kZWxldGVfZmlyc3Rfd29yZCAoREJ1c1N0cmluZyAqc3RyKQoreworICBpbnQgaTsKKyAgCisgIGlmIChfZGJ1c19zdHJpbmdfZmluZF9ibGFuayAoc3RyLCAwLCAmaSkpCisgICAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgKHN0ciwgaSwgJmkpOworCisgIF9kYnVzX3N0cmluZ19kZWxldGUgKHN0ciwgMCwgaSk7Cit9CisjZW5kaWYKKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKy8qKgorICogRGVsZXRlcyBhbnkgbGVhZGluZyBibGFua3MgaW4gdGhlIHN0cmluZworICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICovCit2b2lkCitfZGJ1c19zdHJpbmdfZGVsZXRlX2xlYWRpbmdfYmxhbmtzIChEQnVzU3RyaW5nICpzdHIpCit7CisgIGludCBpOworICAKKyAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgKHN0ciwgMCwgJmkpOworCisgIGlmIChpID4gMCkKKyAgICBfZGJ1c19zdHJpbmdfZGVsZXRlIChzdHIsIDAsIGkpOworfQorI2VuZGlmCisKKy8qKgorICogRGVsZXRlcyBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlCisgKiAKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICovCit2b2lkCitfZGJ1c19zdHJpbmdfY2hvcF93aGl0ZShEQnVzU3RyaW5nICpzdHIpCit7CisgIGludCBpOworICAKKyAgX2RidXNfc3RyaW5nX3NraXBfd2hpdGUgKHN0ciwgMCwgJmkpOworCisgIGlmIChpID4gMCkKKyAgICBfZGJ1c19zdHJpbmdfZGVsZXRlIChzdHIsIDAsIGkpOworICAKKyAgX2RidXNfc3RyaW5nX3NraXBfd2hpdGVfcmV2ZXJzZSAoc3RyLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSwgJmkpOworCisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChzdHIsIGkpOworfQorCisvKioKKyAqIFRlc3RzIHR3byBEQnVzU3RyaW5nIGZvciBlcXVhbGl0eS4KKyAqCisgKiBAdG9kbyBtZW1jbXAgaXMgcHJvYmFibHkgZmFzdGVyCisgKgorICogQHBhcmFtIGEgZmlyc3Qgc3RyaW5nCisgKiBAcGFyYW0gYiBzZWNvbmQgc3RyaW5nCisgKiBAcmV0dXJucyAjVFJVRSBpZiBlcXVhbAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2VxdWFsIChjb25zdCBEQnVzU3RyaW5nICphLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpiKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICphcDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYnA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFfZW5kOworICBjb25zdCBEQnVzUmVhbFN0cmluZyAqcmVhbF9hID0gKGNvbnN0IERCdXNSZWFsU3RyaW5nKikgYTsKKyAgY29uc3QgREJ1c1JlYWxTdHJpbmcgKnJlYWxfYiA9IChjb25zdCBEQnVzUmVhbFN0cmluZyopIGI7CisgIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgKHJlYWxfYSk7CisgIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgKHJlYWxfYik7CisKKyAgaWYgKHJlYWxfYS0+bGVuICE9IHJlYWxfYi0+bGVuKQorICAgIHJldHVybiBGQUxTRTsKKworICBhcCA9IHJlYWxfYS0+c3RyOworICBicCA9IHJlYWxfYi0+c3RyOworICBhX2VuZCA9IHJlYWxfYS0+c3RyICsgcmVhbF9hLT5sZW47CisgIHdoaWxlIChhcCAhPSBhX2VuZCkKKyAgICB7CisgICAgICBpZiAoKmFwICE9ICpicCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICArK2FwOworICAgICAgKyticDsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogVGVzdHMgdHdvIERCdXNTdHJpbmcgZm9yIGVxdWFsaXR5IHVwIHRvIHRoZSBnaXZlbiBsZW5ndGguCisgKiBUaGUgc3RyaW5ncyBtYXkgYmUgc2hvcnRlciB0aGFuIHRoZSBnaXZlbiBsZW5ndGguCisgKgorICogQHRvZG8gd3JpdGUgYSB1bml0IHRlc3QKKyAqCisgKiBAdG9kbyBtZW1jbXAgaXMgcHJvYmFibHkgZmFzdGVyCisgKgorICogQHBhcmFtIGEgZmlyc3Qgc3RyaW5nCisgKiBAcGFyYW0gYiBzZWNvbmQgc3RyaW5nCisgKiBAcGFyYW0gbGVuIHRoZSBtYXhpbXVtIGxlbmd0aCB0byBsb29rIGF0CisgKiBAcmV0dXJucyAjVFJVRSBpZiBlcXVhbCBmb3IgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2VxdWFsX2xlbiAoY29uc3QgREJ1c1N0cmluZyAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4pCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpicDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYV9lbmQ7CisgIGNvbnN0IERCdXNSZWFsU3RyaW5nICpyZWFsX2EgPSAoY29uc3QgREJ1c1JlYWxTdHJpbmcqKSBhOworICBjb25zdCBEQnVzUmVhbFN0cmluZyAqcmVhbF9iID0gKGNvbnN0IERCdXNSZWFsU3RyaW5nKikgYjsKKyAgREJVU19HRU5FUklDX1NUUklOR19QUkVBTUJMRSAocmVhbF9hKTsKKyAgREJVU19HRU5FUklDX1NUUklOR19QUkVBTUJMRSAocmVhbF9iKTsKKworICBpZiAocmVhbF9hLT5sZW4gIT0gcmVhbF9iLT5sZW4gJiYKKyAgICAgIChyZWFsX2EtPmxlbiA8IGxlbiB8fCByZWFsX2ItPmxlbiA8IGxlbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGFwID0gcmVhbF9hLT5zdHI7CisgIGJwID0gcmVhbF9iLT5zdHI7CisgIGFfZW5kID0gcmVhbF9hLT5zdHIgKyBNSU4gKHJlYWxfYS0+bGVuLCBsZW4pOworICB3aGlsZSAoYXAgIT0gYV9lbmQpCisgICAgeworICAgICAgaWYgKCphcCAhPSAqYnApCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgKythcDsKKyAgICAgICsrYnA7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFRlc3RzIHR3byBzdWItcGFydHMgb2YgdHdvIERCdXNTdHJpbmcgZm9yIGVxdWFsaXR5LiAgVGhlIHNwZWNpZmllZAorICogcmFuZ2Ugb2YgdGhlIGZpcnN0IHN0cmluZyBtdXN0IGV4aXN0OyB0aGUgc3BlY2lmaWVkIHN0YXJ0IHBvc2l0aW9uCisgKiBvZiB0aGUgc2Vjb25kIHN0cmluZyBtdXN0IGV4aXN0LgorICoKKyAqIEB0b2RvIHdyaXRlIGEgdW5pdCB0ZXN0CisgKgorICogQHRvZG8gbWVtY21wIGlzIHByb2JhYmx5IGZhc3RlcgorICoKKyAqIEBwYXJhbSBhIGZpcnN0IHN0cmluZworICogQHBhcmFtIGFfc3RhcnQgd2hlcmUgdG8gc3RhcnQgc3Vic3RyaW5nIGluIGZpcnN0IHN0cmluZworICogQHBhcmFtIGFfbGVuIGxlbmd0aCBvZiBzdWJzdHJpbmcgaW4gZmlyc3Qgc3RyaW5nCisgKiBAcGFyYW0gYiBzZWNvbmQgc3RyaW5nCisgKiBAcGFyYW0gYl9zdGFydCB3aGVyZSB0byBzdGFydCBzdWJzdHJpbmcgaW4gc2Vjb25kIHN0cmluZworICogQHJldHVybnMgI1RSVUUgaWYgdGhlIHR3byBzdWJzdHJpbmdzIGFyZSBlcXVhbAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoY29uc3QgREJ1c1N0cmluZyAgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBhX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICpiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGJfc3RhcnQpCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpicDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYV9lbmQ7CisgIGNvbnN0IERCdXNSZWFsU3RyaW5nICpyZWFsX2EgPSAoY29uc3QgREJ1c1JlYWxTdHJpbmcqKSBhOworICBjb25zdCBEQnVzUmVhbFN0cmluZyAqcmVhbF9iID0gKGNvbnN0IERCdXNSZWFsU3RyaW5nKikgYjsKKyAgREJVU19HRU5FUklDX1NUUklOR19QUkVBTUJMRSAocmVhbF9hKTsKKyAgREJVU19HRU5FUklDX1NUUklOR19QUkVBTUJMRSAocmVhbF9iKTsKKyAgX2RidXNfYXNzZXJ0IChhX3N0YXJ0ID49IDApOworICBfZGJ1c19hc3NlcnQgKGFfbGVuID49IDApOworICBfZGJ1c19hc3NlcnQgKGFfc3RhcnQgPD0gcmVhbF9hLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKGFfbGVuIDw9IHJlYWxfYS0+bGVuIC0gYV9zdGFydCk7CisgIF9kYnVzX2Fzc2VydCAoYl9zdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChiX3N0YXJ0IDw9IHJlYWxfYi0+bGVuKTsKKyAgCisgIGlmIChhX2xlbiA+IHJlYWxfYi0+bGVuIC0gYl9zdGFydCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgYXAgPSByZWFsX2EtPnN0ciArIGFfc3RhcnQ7CisgIGJwID0gcmVhbF9iLT5zdHIgKyBiX3N0YXJ0OworICBhX2VuZCA9IGFwICsgYV9sZW47CisgIHdoaWxlIChhcCAhPSBhX2VuZCkKKyAgICB7CisgICAgICBpZiAoKmFwICE9ICpicCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICArK2FwOworICAgICAgKyticDsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChicCA8PSAocmVhbF9iLT5zdHIgKyByZWFsX2ItPmxlbikpOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgYSBzdHJpbmcgaXMgZXF1YWwgdG8gYSBDIHN0cmluZy4KKyAqCisgKiBAcGFyYW0gYSB0aGUgc3RyaW5nCisgKiBAcGFyYW0gY19zdHIgdGhlIEMgc3RyaW5nCisgKiBAcmV0dXJucyAjVFJVRSBpZiBlcXVhbAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyIChjb25zdCBEQnVzU3RyaW5nICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpjX3N0cikKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYXA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICphX2VuZDsKKyAgY29uc3QgREJ1c1JlYWxTdHJpbmcgKnJlYWxfYSA9IChjb25zdCBEQnVzUmVhbFN0cmluZyopIGE7CisgIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgKHJlYWxfYSk7CisgIF9kYnVzX2Fzc2VydCAoY19zdHIgIT0gTlVMTCk7CisgIAorICBhcCA9IHJlYWxfYS0+c3RyOworICBicCA9IChjb25zdCB1bnNpZ25lZCBjaGFyKikgY19zdHI7CisgIGFfZW5kID0gcmVhbF9hLT5zdHIgKyByZWFsX2EtPmxlbjsKKyAgd2hpbGUgKGFwICE9IGFfZW5kICYmICpicCkKKyAgICB7CisgICAgICBpZiAoKmFwICE9ICpicCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICArK2FwOworICAgICAgKyticDsKKyAgICB9CisKKyAgaWYgKGFwICE9IGFfZW5kIHx8ICpicCkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciBhIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gQyBzdHJpbmcuCisgKgorICogQHBhcmFtIGEgdGhlIHN0cmluZworICogQHBhcmFtIGNfc3RyIHRoZSBDIHN0cmluZworICogQHJldHVybnMgI1RSVUUgaWYgc3RyaW5nIHN0YXJ0cyB3aXRoIGl0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKGNvbnN0IERCdXNTdHJpbmcgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmNfc3RyKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICphcDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYnA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFfZW5kOworICBjb25zdCBEQnVzUmVhbFN0cmluZyAqcmVhbF9hID0gKGNvbnN0IERCdXNSZWFsU3RyaW5nKikgYTsKKyAgREJVU19HRU5FUklDX1NUUklOR19QUkVBTUJMRSAocmVhbF9hKTsKKyAgX2RidXNfYXNzZXJ0IChjX3N0ciAhPSBOVUxMKTsKKyAgCisgIGFwID0gcmVhbF9hLT5zdHI7CisgIGJwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBjX3N0cjsKKyAgYV9lbmQgPSByZWFsX2EtPnN0ciArIHJlYWxfYS0+bGVuOworICB3aGlsZSAoYXAgIT0gYV9lbmQgJiYgKmJwKQorICAgIHsKKyAgICAgIGlmICgqYXAgIT0gKmJwKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgICsrYXA7CisgICAgICArK2JwOworICAgIH0KKworICBpZiAoKmJwID09ICdcMCcpCisgICAgcmV0dXJuIFRSVUU7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogQXBwZW5kcyBhIHR3by1jaGFyYWN0ZXIgaGV4IGRpZ2l0IHRvIGEgc3RyaW5nLCB3aGVyZSB0aGUgaGV4IGRpZ2l0CisgKiBoYXMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBieXRlLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIGJ5dGUgdGhlIGJ5dGUKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZV9hc19oZXggKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGJ5dGUpCit7CisgIGNvbnN0IGNoYXIgaGV4ZGlnaXRzWzE2XSA9IHsKKyAgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsCisgICAgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJworICB9OworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXhkaWdpdHNbKGJ5dGUgPj4gNCldKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGV4ZGlnaXRzWyhieXRlICYgMHgwZildKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpIC0gMSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEVuY29kZXMgYSBzdHJpbmcgaW4gaGV4LCB0aGUgd2F5IE1ENSBhbmQgU0hBLTEgYXJlIHVzdWFsbHkKKyAqIGVuY29kZWQuIChFYWNoIGJ5dGUgaXMgdHdvIGhleCBkaWdpdHMuKQorICoKKyAqIEBwYXJhbSBzb3VyY2UgdGhlIHN0cmluZyB0byBlbmNvZGUKKyAqIEBwYXJhbSBzdGFydCBieXRlIGluZGV4IHRvIHN0YXJ0IGVuY29kaW5nCisgKiBAcGFyYW0gZGVzdCBzdHJpbmcgd2hlcmUgZW5jb2RlZCBkYXRhIHNob3VsZCBiZSBwbGFjZWQKKyAqIEBwYXJhbSBpbnNlcnRfYXQgd2hlcmUgdG8gcGxhY2UgZW5jb2RlZCBkYXRhCisgKiBAcmV0dXJucyAjVFJVRSBpZiBlbmNvZGluZyB3YXMgc3VjY2Vzc2Z1bCwgI0ZBTFNFIGlmIG5vIG1lbW9yeSBldGMuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAoY29uc3QgREJ1c1N0cmluZyAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgaW5zZXJ0X2F0KQoreworICBEQnVzU3RyaW5nIHJlc3VsdDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIAorICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzb3VyY2UpKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcmVzdWx0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dmFsID0gRkFMU0U7CisgIAorICBwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNvdXJjZSk7CisgIGVuZCA9IHAgKyBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc291cmNlKTsKKyAgcCArPSBzdGFydDsKKyAgCisgIHdoaWxlIChwICE9IGVuZCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZV9hc19oZXggKCZyZXN1bHQsICpwKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICAKKyAgICAgICsrcDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbW92ZSAoJnJlc3VsdCwgMCwgZGVzdCwgaW5zZXJ0X2F0KSkKKyAgICBnb3RvIG91dDsKKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnJlc3VsdCk7CisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogRGVjb2RlcyBhIHN0cmluZyBmcm9tIGhleCBlbmNvZGluZy4KKyAqCisgKiBAcGFyYW0gc291cmNlIHRoZSBzdHJpbmcgdG8gZGVjb2RlCisgKiBAcGFyYW0gc3RhcnQgYnl0ZSBpbmRleCB0byBzdGFydCBkZWNvZGUKKyAqIEBwYXJhbSBlbmRfcmV0dXJuIHJldHVybiBsb2NhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBoZXggZGF0YSwgb3IgI05VTEwKKyAqIEBwYXJhbSBkZXN0IHN0cmluZyB3aGVyZSBkZWNvZGVkIGRhdGEgc2hvdWxkIGJlIHBsYWNlZAorICogQHBhcmFtIGluc2VydF9hdCB3aGVyZSB0byBwbGFjZSBkZWNvZGVkIGRhdGEKKyAqIEByZXR1cm5zICNUUlVFIGlmIGRlY29kaW5nIHdhcyBzdWNjZXNzZnVsLCAjRkFMU0UgaWYgbm8gbWVtb3J5LgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2hleF9kZWNvZGUgKGNvbnN0IERCdXNTdHJpbmcgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKwkJCSBpbnQgICAgICAgICAgICAgICplbmRfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgaW5zZXJ0X2F0KQoreworICBEQnVzU3RyaW5nIHJlc3VsdDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGRidXNfYm9vbF90IGhpZ2hfYml0czsKKyAgCisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHNvdXJjZSkpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZyZXN1bHQpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBoaWdoX2JpdHMgPSBUUlVFOworICBwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNvdXJjZSk7CisgIGVuZCA9IHAgKyBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc291cmNlKTsKKyAgcCArPSBzdGFydDsKKyAgCisgIHdoaWxlIChwICE9IGVuZCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgdmFsOworCisgICAgICBzd2l0Y2ggKCpwKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJzAnOgorICAgICAgICAgIHZhbCA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzEnOgorICAgICAgICAgIHZhbCA9IDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzInOgorICAgICAgICAgIHZhbCA9IDI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzMnOgorICAgICAgICAgIHZhbCA9IDM7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzQnOgorICAgICAgICAgIHZhbCA9IDQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzUnOgorICAgICAgICAgIHZhbCA9IDU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzYnOgorICAgICAgICAgIHZhbCA9IDY7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzcnOgorICAgICAgICAgIHZhbCA9IDc7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzgnOgorICAgICAgICAgIHZhbCA9IDg7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzknOgorICAgICAgICAgIHZhbCA9IDk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2EnOgorICAgICAgICBjYXNlICdBJzoKKyAgICAgICAgICB2YWwgPSAxMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnYic6CisgICAgICAgIGNhc2UgJ0InOgorICAgICAgICAgIHZhbCA9IDExOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgY2FzZSAnQyc6CisgICAgICAgICAgdmFsID0gMTI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICBjYXNlICdEJzoKKyAgICAgICAgICB2YWwgPSAxMzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnZSc6CisgICAgICAgIGNhc2UgJ0UnOgorICAgICAgICAgIHZhbCA9IDE0OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdmJzoKKyAgICAgICAgY2FzZSAnRic6CisgICAgICAgICAgdmFsID0gMTU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisKKyAgICAgIGlmIChoaWdoX2JpdHMpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsIDw8IDQpKQorCSAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaW50IGxlbjsKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyIGI7CisKKyAgICAgICAgICBsZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnJlc3VsdCk7CisgICAgICAgICAgCisgICAgICAgICAgYiA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnJlc3VsdCwgbGVuIC0gMSk7CisKKyAgICAgICAgICBiIHw9IHZhbDsKKworICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAoJnJlc3VsdCwgbGVuIC0gMSwgYik7CisgICAgICAgIH0KKworICAgICAgaGlnaF9iaXRzID0gIWhpZ2hfYml0czsKKworICAgICAgKytwOworICAgIH0KKworIGRvbmU6CisgIGlmICghX2RidXNfc3RyaW5nX21vdmUgKCZyZXN1bHQsIDAsIGRlc3QsIGluc2VydF9hdCkpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKGVuZF9yZXR1cm4pCisgICAgKmVuZF9yZXR1cm4gPSBwIC0gKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNvdXJjZSk7CisKKyAgcmV0dmFsID0gVFJVRTsKKyAgCisgb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnJlc3VsdCk7ICAKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBDaGVja3MgdGhhdCB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIHN0cmluZyBpcyB2YWxpZCBBU0NJSSB3aXRoIG5vCisgKiBudWwgYnl0ZXMuIElmIHRoZSBnaXZlbiByYW5nZSBpcyBub3QgZW50aXJlbHkgY29udGFpbmVkIGluIHRoZQorICogc3RyaW5nLCByZXR1cm5zICNGQUxTRS4KKyAqCisgKiBAdG9kbyB0aGlzIGlzIGluY29uc2lzdGVudCB3aXRoIG1vc3Qgb2YgREJ1c1N0cmluZyBpbiB0aGF0CisgKiBpdCBhbGxvd3MgYSBzdGFydCxsZW4gcmFuZ2UgdGhhdCBleHRlbmRzIHBhc3QgdGhlIHN0cmluZyBlbmQuCisgKiAKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IGZpcnN0IGJ5dGUgaW5kZXggdG8gY2hlY2sKKyAqIEBwYXJhbSBsZW4gbnVtYmVyIG9mIGJ5dGVzIHRvIGNoZWNrCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgYnl0ZSByYW5nZSBleGlzdHMgYW5kIGlzIGFsbCB2YWxpZCBBU0NJSQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX3ZhbGlkYXRlX2FzY2lpIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4pCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnM7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZDsKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisgIAorICBpZiAobGVuID4gcmVhbC0+bGVuIC0gc3RhcnQpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgcyA9IHJlYWwtPnN0ciArIHN0YXJ0OworICBlbmQgPSBzICsgbGVuOworICB3aGlsZSAocyAhPSBlbmQpCisgICAgeworICAgICAgaWYgKF9EQlVTX1VOTElLRUxZICghX0RCVVNfSVNBU0NJSSAoKnMpKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAKKyAgICAgICsrczsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIHN0cmluZyB0byBsb3dlciBjYXNlLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IGZpcnN0IGJ5dGUgaW5kZXggdG8gY29udmVydAorICogQHBhcmFtIGxlbiBudW1iZXIgb2YgYnl0ZXMgdG8gY29udmVydAorICovCit2b2lkCitfZGJ1c19zdHJpbmdfdG9sb3dlcl9hc2NpaSAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbikKK3sKKyAgdW5zaWduZWQgY2hhciAqczsKKyAgdW5zaWduZWQgY2hhciAqZW5kOworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSByZWFsLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPD0gcmVhbC0+bGVuIC0gc3RhcnQpOworCisgIHMgPSByZWFsLT5zdHIgKyBzdGFydDsKKyAgZW5kID0gcyArIGxlbjsKKworICB3aGlsZSAocyAhPSBlbmQpCisgICAgeworICAgICAgaWYgKCpzID49ICdBJyAmJiAqcyA8PSAnWicpCisgICAgICAgICAgKnMgKz0gJ2EnIC0gJ0EnOworICAgICAgKytzOworICAgIH0KK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIHN0cmluZyB0byB1cHBlciBjYXNlLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IGZpcnN0IGJ5dGUgaW5kZXggdG8gY29udmVydAorICogQHBhcmFtIGxlbiBudW1iZXIgb2YgYnl0ZXMgdG8gY29udmVydAorICovCit2b2lkCitfZGJ1c19zdHJpbmdfdG91cHBlcl9hc2NpaSAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbikKK3sKKyAgdW5zaWduZWQgY2hhciAqczsKKyAgdW5zaWduZWQgY2hhciAqZW5kOworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSByZWFsLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPD0gcmVhbC0+bGVuIC0gc3RhcnQpOworCisgIHMgPSByZWFsLT5zdHIgKyBzdGFydDsKKyAgZW5kID0gcyArIGxlbjsKKworICB3aGlsZSAocyAhPSBlbmQpCisgICAgeworICAgICAgaWYgKCpzID49ICdhJyAmJiAqcyA8PSAneicpCisgICAgICAgICAgKnMgKz0gJ0EnIC0gJ2EnOworICAgICAgKytzOworICAgIH0KK30KKworLyoqCisgKiBDaGVja3MgdGhhdCB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIHN0cmluZyBpcyB2YWxpZCBVVEYtOC4gSWYgdGhlCisgKiBnaXZlbiByYW5nZSBpcyBub3QgZW50aXJlbHkgY29udGFpbmVkIGluIHRoZSBzdHJpbmcsIHJldHVybnMKKyAqICNGQUxTRS4gSWYgdGhlIHN0cmluZyBjb250YWlucyBhbnkgbnVsIGJ5dGVzIGluIHRoZSBnaXZlbiByYW5nZSwKKyAqIHJldHVybnMgI0ZBTFNFLiBJZiB0aGUgc3RhcnQgYW5kIHN0YXJ0K2xlbiBhcmUgbm90IG9uIGNoYXJhY3RlcgorICogYm91bmRhcmllcywgcmV0dXJucyAjRkFMU0UuCisgKgorICogQHRvZG8gdGhpcyBpcyBpbmNvbnNpc3RlbnQgd2l0aCBtb3N0IG9mIERCdXNTdHJpbmcgaW4gdGhhdAorICogaXQgYWxsb3dzIGEgc3RhcnQsbGVuIHJhbmdlIHRoYXQgZXh0ZW5kcyBwYXN0IHRoZSBzdHJpbmcgZW5kLgorICogCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCBmaXJzdCBieXRlIGluZGV4IHRvIGNoZWNrCisgKiBAcGFyYW0gbGVuIG51bWJlciBvZiBieXRlcyB0byBjaGVjaworICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGJ5dGUgcmFuZ2UgZXhpc3RzIGFuZCBpcyBhbGwgdmFsaWQgVVRGLTgKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ192YWxpZGF0ZV91dGY4ICAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICplbmQ7CisgIERCVVNfQ09OU1RfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ID49IDApOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IHJlYWwtPmxlbik7CisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworCisgIC8qIHdlIGFyZSBkb2luZyBfREJVU19VTkxJS0VMWSgpIGhlcmUgd2hpY2ggbWlnaHQgYmUKKyAgICogZHViaW91cyBpbiBhIGdlbmVyaWMgbGlicmFyeSBsaWtlIEdMaWIsIGJ1dCBpbiBELUJ1cworICAgKiB3ZSBrbm93IHdlJ3JlIHZhbGlkYXRpbmcgbWVzc2FnZXMgYW5kIHRoYXQgaXQgd291bGQKKyAgICogb25seSBiZSBldmlsL2Jyb2tlbiBhcHBzIHRoYXQgd291bGQgaGF2ZSBpbnZhbGlkCisgICAqIFVURi04LiBBbHNvLCB0aGlzIGZ1bmN0aW9uIHNlZW1zIHRvIGJlIGEgcGVyZm9ybWFuY2UKKyAgICogYm90dGxlbmVjayBpbiBwcm9maWxlcy4KKyAgICovCisgIAorICBpZiAoX0RCVVNfVU5MSUtFTFkgKGxlbiA+IHJlYWwtPmxlbiAtIHN0YXJ0KSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBwID0gcmVhbC0+c3RyICsgc3RhcnQ7CisgIGVuZCA9IHAgKyBsZW47CisgIAorICB3aGlsZSAocCA8IGVuZCkKKyAgICB7CisgICAgICBpbnQgaSwgbWFzaywgY2hhcl9sZW47CisgICAgICBkYnVzX3VuaWNoYXJfdCByZXN1bHQ7CisKKyAgICAgIC8qIG51bCBieXRlcyBjb25zaWRlcmVkIGludmFsaWQgKi8KKyAgICAgIGlmICgqcCA9PSAnXDAnKQorICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgLyogU3BlY2lhbC1jYXNlIEFTQ0lJOyB0aGlzIG1ha2VzIHVzIGdvIGEgbG90IGZhc3RlciBpbgorICAgICAgICogRC1CdXMgcHJvZmlsZXMgd2hlcmUgd2UgYXJlIHR5cGljYWxseSB2YWxpZGF0aW5nCisgICAgICAgKiBmdW5jdGlvbiBuYW1lcyBhbmQgc3VjaC4gV2UgaGF2ZSB0byBrbm93IHRoYXQKKyAgICAgICAqIGFsbCBmb2xsb3dpbmcgY2hlY2tzIHdpbGwgcGFzcyBmb3IgQVNDSUkgdGhvdWdoLAorICAgICAgICogY29tbWVudHMgZm9sbG93IC4uLgorICAgICAgICovICAgICAgCisgICAgICBpZiAoKnAgPCAxMjgpCisgICAgICAgIHsKKyAgICAgICAgICArK3A7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgVVRGOF9DT01QVVRFICgqcCwgbWFzaywgY2hhcl9sZW4pOworCisgICAgICBpZiAoX0RCVVNfVU5MSUtFTFkgKGNoYXJfbGVuID09IDApKSAgLyogQVNDSUk6IGNoYXJfbGVuID09IDEgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIGNoZWNrIHRoYXQgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBieXRlcyBleGlzdHMgaW4gdGhlIHJlbWFpbmluZyBsZW5ndGggKi8KKyAgICAgIGlmIChfREJVU19VTkxJS0VMWSAoKGVuZCAtIHApIDwgY2hhcl9sZW4pKSAvKiBBU0NJSTogcCA8IGVuZCBhbmQgY2hhcl9sZW4gPT0gMSAqLworICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICBVVEY4X0dFVCAocmVzdWx0LCBwLCBpLCBtYXNrLCBjaGFyX2xlbik7CisKKyAgICAgIC8qIENoZWNrIGZvciBvdmVybG9uZyBVVEYtOCAqLworICAgICAgaWYgKF9EQlVTX1VOTElLRUxZIChVVEY4X0xFTkdUSCAocmVzdWx0KSAhPSBjaGFyX2xlbikpIC8qIEFTQ0lJOiBVVEY4X0xFTkdUSCA9PSAxICovCisgICAgICAgIGJyZWFrOworI2lmIDAKKyAgICAgIC8qIFRoZSBVTklDT0RFX1ZBTElEIGNoZWNrIGJlbG93IHdpbGwgY2F0Y2ggdGhpcyAqLworICAgICAgaWYgKF9EQlVTX1VOTElLRUxZIChyZXN1bHQgPT0gKGRidXNfdW5pY2hhcl90KS0xKSkgLyogQVNDSUk6IHJlc3VsdCA9IGFzY2lpIHZhbHVlICovCisgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICAgIGlmIChfREJVU19VTkxJS0VMWSAoIVVOSUNPREVfVkFMSUQgKHJlc3VsdCkpKSAvKiBBU0NJSTogYWx3YXlzIHZhbGlkICovCisgICAgICAgIGJyZWFrOworCisgICAgICAvKiBVTklDT0RFX1ZBTElEIHNob3VsZCBoYXZlIGNhdWdodCBpdCAqLworICAgICAgX2RidXNfYXNzZXJ0IChyZXN1bHQgIT0gKGRidXNfdW5pY2hhcl90KS0xKTsKKyAgICAgIAorICAgICAgcCArPSBjaGFyX2xlbjsKKyAgICB9CisKKyAgLyogU2VlIHRoYXQgd2UgY292ZXJlZCB0aGUgZW50aXJlIGxlbmd0aCBpZiBhIGxlbmd0aCB3YXMKKyAgICogcGFzc2VkIGluCisgICAqLworICBpZiAoX0RCVVNfVU5MSUtFTFkgKHAgIT0gZW5kKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDaGVja3MgdGhhdCB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIHN0cmluZyBpcyBhbGwgbnVsIGJ5dGVzLiBJZiB0aGUKKyAqIGdpdmVuIHJhbmdlIGlzIG5vdCBlbnRpcmVseSBjb250YWluZWQgaW4gdGhlIHN0cmluZywgcmV0dXJucworICogI0ZBTFNFLgorICoKKyAqIEB0b2RvIHRoaXMgaXMgaW5jb25zaXN0ZW50IHdpdGggbW9zdCBvZiBEQnVzU3RyaW5nIGluIHRoYXQKKyAqIGl0IGFsbG93cyBhIHN0YXJ0LGxlbiByYW5nZSB0aGF0IGV4dGVuZHMgcGFzdCB0aGUgc3RyaW5nIGVuZC4KKyAqIAorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgZmlyc3QgYnl0ZSBpbmRleCB0byBjaGVjaworICogQHBhcmFtIGxlbiBudW1iZXIgb2YgYnl0ZXMgdG8gY2hlY2sKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBieXRlIHJhbmdlIGV4aXN0cyBhbmQgaXMgYWxsIG51bCBieXRlcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX3ZhbGlkYXRlX251bCAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4pCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnM7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZDsKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IHJlYWwtPmxlbik7CisgIAorICBpZiAobGVuID4gcmVhbC0+bGVuIC0gc3RhcnQpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgcyA9IHJlYWwtPnN0ciArIHN0YXJ0OworICBlbmQgPSBzICsgbGVuOworICB3aGlsZSAocyAhPSBlbmQpCisgICAgeworICAgICAgaWYgKF9EQlVTX1VOTElLRUxZICgqcyAhPSAnXDAnKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgKytzOworICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENsZWFycyBhbGwgYWxsb2NhdGVkIGJ5dGVzIGluIHRoZSBzdHJpbmcgdG8gemVyby4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqLwordm9pZAorX2RidXNfc3RyaW5nX3plcm8gKERCdXNTdHJpbmcgKnN0cikKK3sKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisKKyAgbWVtc2V0IChyZWFsLT5zdHIgLSByZWFsLT5hbGlnbl9vZmZzZXQsICdcMCcsIHJlYWwtPmFsbG9jYXRlZCk7Cit9CisvKiogQH0gKi8KKworLyogdGVzdHMgYXJlIGluIGRidXMtc3RyaW5nLXV0aWwuYyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtc3RyaW5nLmggYi9kYnVzL2RidXMvZGJ1cy1zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWY1OWRiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtc3RyaW5nLmgKQEAgLTAsMCArMSwzMTQgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zdHJpbmcuaCBTdHJpbmcgdXRpbGl0eSBjbGFzcyAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmFsZiBIYWJhY2tlciA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfU1RSSU5HX0gKKyNkZWZpbmUgREJVU19TVFJJTkdfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tZW1vcnkuaD4KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogREJ1c1N0cmluZyBvYmplY3QKKyAqLworCit0eXBlZGVmIHN0cnVjdCBEQnVzU3RyaW5nIERCdXNTdHJpbmc7CisKK3N0cnVjdCBEQnVzU3RyaW5nCit7CisjaWYgZGVmaW5lZChEQlVTX1dJTikgJiYgZGVmaW5lZChfREVCVUcpCisgIGNvbnN0IGNoYXIgKmR1bW15MTsgLyoqPCBwbGFjZWhvbGRlciAqLworI2Vsc2UKKyAgY29uc3Qgdm9pZCAqZHVtbXkxOyAvKio8IHBsYWNlaG9sZGVyICovCisjZW5kaWYKKyAgaW50ICAgZHVtbXkyOyAgICAgICAvKio8IHBsYWNlaG9sZGVyICovCisgIGludCAgIGR1bW15MzsgICAgICAgLyoqPCBwbGFjZWhvbGRlciAqLworICB1bnNpZ25lZCBpbnQgZHVtbXlfYml0MSA6IDE7IC8qKjwgcGxhY2Vob2xkZXIgKi8KKyAgdW5zaWduZWQgaW50IGR1bW15X2JpdDIgOiAxOyAvKio8IHBsYWNlaG9sZGVyICovCisgIHVuc2lnbmVkIGludCBkdW1teV9iaXQzIDogMTsgLyoqPCBwbGFjZWhvbGRlciAqLworICB1bnNpZ25lZCBpbnQgZHVtbXlfYml0cyA6IDM7IC8qKjwgcGxhY2Vob2xkZXIgKi8KK307CisKKyNpZmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisvKiBTb21lIHNpbXBsZSBpbmxpbmluZyBoYWNrczsgdGhlIGN1cnJlbnQgbGlua2VyIGlzIG5vdCBzbWFydCBlbm91Z2gKKyAqIHRvIGlubGluZSBub24tZXhwb3J0ZWQgc3ltYm9scyBhY3Jvc3MgZmlsZXMgaW4gdGhlIGxpYnJhcnkuCisgKiBOb3RlIHRoYXQgdGhlc2UgYnJlYWsgdHlwZSBzYWZldHkgKGR1ZSB0byB0aGUgY2FzdHMpCisgKi8KKyNkZWZpbmUgX2RidXNfc3RyaW5nX2dldF9kYXRhKHMpICgoY2hhciopKCgoREJ1c1N0cmluZyopKHMpKS0+ZHVtbXkxKSkKKyNkZWZpbmUgX2RidXNfc3RyaW5nX2dldF9sZW5ndGgocykgKCgoREJ1c1N0cmluZyopKHMpKS0+ZHVtbXkyKQorI2RlZmluZSBfZGJ1c19zdHJpbmdfc2V0X2J5dGUocywgaSwgYikgKCgoKHVuc2lnbmVkIGNoYXIqKSgoKERCdXNTdHJpbmcqKShzKSktPmR1bW15MSkpWyhpKV0pID0gKHVuc2lnbmVkIGNoYXIpIChiKSkKKyNkZWZpbmUgX2RidXNfc3RyaW5nX2dldF9ieXRlKHMsIGkpICgoKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSgoKERCdXNTdHJpbmcqKShzKSktPmR1bW15MSkpWyhpKV0pCisjZGVmaW5lIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YShzKSAoKGNvbnN0IGNoYXIqKSgoKERCdXNTdHJpbmcqKShzKSktPmR1bW15MSkpCisjZGVmaW5lIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4ocyxzdGFydCxsZW4pICgoKGNvbnN0IGNoYXIqKSgoKERCdXNTdHJpbmcqKShzKSktPmR1bW15MSkpICsgKHN0YXJ0KSkKKyNlbmRpZgorCitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19pbml0ICAgICAgICAgICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIpOwordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqdmFsdWUpOwordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4gICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfaW5pdF9wcmVhbGxvY2F0ZWQgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYWxsb2NhdGVfc2l6ZSk7Cit2b2lkICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICAgICAgICAgICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIpOwordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfbG9jayAgICAgICAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyKTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2NvbXBhY3QgICAgICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIG1heF93YXN0ZSk7CisjaWZuZGVmIF9kYnVzX3N0cmluZ19nZXRfZGF0YQorY2hhciogICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgICAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyKTsKKyNlbmRpZiAvKiBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKi8KKyNpZm5kZWYgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhCitjb25zdCBjaGFyKiAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIpOworI2VuZGlmIC8qIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAqLworY2hhciogICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2RhdGFfbGVuICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pOworI2lmbmRlZiBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuCitjb25zdCBjaGFyKiAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbik7CisjZW5kaWYKKyNpZm5kZWYgX2RidXNfc3RyaW5nX3NldF9ieXRlCit2b2lkICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAgICAgICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgYnl0ZSk7CisjZW5kaWYKKyNpZm5kZWYgX2RidXNfc3RyaW5nX2dldF9ieXRlCit1bnNpZ25lZCBjaGFyIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCk7CisjZW5kaWYgLyogX2RidXNfc3RyaW5nX2dldF9ieXRlICovCitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZXMgICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBpLAorCQkJCQkJICBpbnQgICAgICAgICAgICAgICAgbl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIGJ5dGUpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGUgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIGJ5dGUpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICoqZGF0YV9yZXR1cm4pOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YV9sZW4gICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICoqZGF0YV9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbik7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19jb3B5X2RhdGEgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgKipkYXRhX3JldHVybik7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19jb3B5X2RhdGFfbGVuICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgKipkYXRhX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKTsKK3ZvaWQgICAgICAgICAgX2RidXNfc3RyaW5nX2NvcHlfdG9fYnVmZmVyICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgKmJ1ZmZlciwKKwkJCQkJCSAgaW50ICAgICAgICAgICAgICAgIGxlbik7Cit2b2lkICAgICAgICAgIF9kYnVzX3N0cmluZ19jb3B5X3RvX2J1ZmZlcl93aXRoX251bCAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBhdmFpbF9sZW4pOworI2lmbmRlZiBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aAoraW50ICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyKTsKKyNlbmRpZiAvKiAhX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKi8KKworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfbGVuZ3RoZW4gICAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYWRkaXRpb25hbF9sZW5ndGgpOwordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfc2hvcnRlbiAgICAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuZ3RoX3RvX3JlbW92ZSk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICAgICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW5ndGgpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfYWxpZ25fbGVuZ3RoICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYWxpZ25tZW50KTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2FsbG9jX3NwYWNlICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGV4dHJhX2J5dGVzKTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2FwcGVuZCAgICAgICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmJ1ZmZlcik7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19hcHBlbmRfbGVuICAgICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfYXBwZW5kX2ludCAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgICAgdmFsdWUpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfYXBwZW5kX3VpbnQgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgdmFsdWUpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgYnl0ZSk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLikgX0RCVVNfR05VQ19QUklOVEYgKDIsIDMpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50Zl92YWxpc3QgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0ICAgICAgICAgICAgYXJncyk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19pbnNlcnRfMl9hbGlnbmVkICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgb2N0ZXRzWzJdKTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2luc2VydF80X2FsaWduZWQgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGluc2VydF9hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBvY3RldHNbNF0pOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfaW5zZXJ0XzhfYWxpZ25lZCAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIG9jdGV0c1s4XSk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19pbnNlcnRfYWxpZ25tZW50ICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICppbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBhbGlnbm1lbnQpOwordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfZGVsZXRlICAgICAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfbW92ZSAgICAgICAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgaW5zZXJ0X2F0KTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2NvcHkgICAgICAgICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGluc2VydF9hdCk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19tb3ZlX2xlbiAgICAgICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBpbnNlcnRfYXQpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfY29weV9sZW4gICAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgaW5zZXJ0X2F0KTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX3JlcGxhY2VfbGVuICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHJlcGxhY2VfYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICByZXBsYWNlX2xlbik7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19zcGxpdF9vbl9ieXRlICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICBieXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAqdGFpbCk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19wYXJzZV9pbnQgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgICAgKnZhbHVlX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKmVuZF9yZXR1cm4pOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfcGFyc2VfdWludCAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICp2YWx1ZV9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICplbmRfcmV0dXJuKTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2ZpbmQgICAgICAgICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqc3Vic3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqZm91bmQpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfZmluZF9lb2wgICAgICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKmZvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqZm91bmRfbGVuKTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2ZpbmRfdG8gICAgICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqc3Vic3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqZm91bmQpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfZmluZF9ieXRlX2JhY2t3YXJkICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICBieXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqZm91bmQpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfZmluZF9ibGFuayAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICpmb3VuZCk7Cit2b2lkICAgICAgICAgIF9kYnVzX3N0cmluZ19za2lwX2JsYW5rICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKmVuZCk7Cit2b2lkICAgICAgICAgIF9kYnVzX3N0cmluZ19za2lwX3doaXRlICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKmVuZCk7Cit2b2lkICAgICAgICAgIF9kYnVzX3N0cmluZ19za2lwX3doaXRlX3JldmVyc2UgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICpzdGFydCk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19lcXVhbCAgICAgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqYik7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqY19zdHIpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfZXF1YWxfbGVuICAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGFfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBhX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBiX3N0YXJ0KTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICAgICAoY29uc3QgREJ1c1N0cmluZyAgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICpjX3N0cik7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19lbmRzX3dpdGhfY19zdHIgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqY19zdHIpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfcG9wX2xpbmUgICAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAqZGVzdCk7Cit2b2lkICAgICAgICAgIF9kYnVzX3N0cmluZ19kZWxldGVfZmlyc3Rfd29yZCAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIpOwordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfZGVsZXRlX2xlYWRpbmdfYmxhbmtzIChEQnVzU3RyaW5nICAgICAgICAqc3RyKTsKK3ZvaWQgICAgICAgICAgX2RidXNfc3RyaW5nX2Nob3Bfd2hpdGUgICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0cik7IAorZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGVfYXNfaGV4ICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYnl0ZSk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19oZXhfZW5jb2RlICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBpbnNlcnRfYXQpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfaGV4X2RlY29kZSAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisJCQkJCQkgIGludCAgICAgICAgICAgICAgICplbmRfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGluc2VydF9hdCk7Cit2b2lkICAgICAgICAgIF9kYnVzX3N0cmluZ190b2xvd2VyX2FzY2lpICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbik7Cit2b2lkICAgICAgICAgIF9kYnVzX3N0cmluZ190b3VwcGVyX2FzY2lpICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbik7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ192YWxpZGF0ZV9hc2NpaSAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbik7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ192YWxpZGF0ZV91dGY4ICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbik7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ192YWxpZGF0ZV9udWwgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbik7Cit2b2lkICAgICAgICAgIF9kYnVzX3N0cmluZ196ZXJvICAgICAgICAgICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIpOworCisKKy8qKgorICogV2UgYWxsb2NhdGUgMSBieXRlIGZvciBudWwgdGVybWluYXRpb24sIHBsdXMgNyBieXRlcyBmb3IgcG9zc2libGUKKyAqIGFsaWduX29mZnNldCwgc28gd2UgYWx3YXlzIG5lZWQgOCBieXRlcyBvbiB0b3Agb2YgdGhlIHN0cmluZydzCisgKiBsZW5ndGggdG8gYmUgaW4gdGhlIGFsbG9jYXRlZCBibG9jay4KKyAqLworI2RlZmluZSBfREJVU19TVFJJTkdfQUxMT0NBVElPTl9QQURESU5HIDgKKworLyoqCisgKiBEZWZpbmVzIGEgc3RhdGljIGNvbnN0IHZhcmlhYmxlIHdpdGggdHlwZSAjREJ1c1N0cmluZyBjYWxsZWQgIm5hbWUiCisgKiBjb250YWluaW5nIHRoZSBnaXZlbiBzdHJpbmcgbGl0ZXJhbC4KKyAqCisgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB2YWx1ZQorICovCisjZGVmaW5lIF9EQlVTX1NUUklOR19ERUZJTkVfU1RBVElDKG5hbWUsIHN0cikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBjb25zdCBjaGFyIF9kYnVzX3N0YXRpY19zdHJpbmdfIyNuYW1lW10gPSBzdHI7ICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBjb25zdCBEQnVzU3RyaW5nIG5hbWUgPSB7IF9kYnVzX3N0YXRpY19zdHJpbmdfIyNuYW1lLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihfZGJ1c19zdGF0aWNfc3RyaW5nXyMjbmFtZSksICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihfZGJ1c19zdGF0aWNfc3RyaW5nXyMjbmFtZSkgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX1NUUklOR19BTExPQ0FUSU9OX1BBRERJTkcsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsIFRSVUUsIEZBTFNFLCAwIH0KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfU1RSSU5HX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLXN5bnRheC5jIGIvZGJ1cy9kYnVzL2RidXMtc3ludGF4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc5MjI4NwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXN5bnRheC5jCkBAIC0wLDAgKzEsMzA5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3ludGF4LmMgLSB1dGlsaXR5IGZ1bmN0aW9ucyBmb3Igc3RyaW5ncyB3aXRoIHNwZWNpYWwgc3ludGF4CisgKgorICogQXV0aG9yOiBTaW1vbiBNY1ZpdHRpZSA8c2ltb24ubWN2aXR0aWVAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IMKpIDIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXN5bnRheC5oIgorCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtdmFsaWRhdGUuaCIKKyNpbmNsdWRlICJkYnVzLXNoYXJlZC5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzU3ludGF4IFV0aWxpdHkgZnVuY3Rpb25zIGZvciBzdHJpbmdzIHdpdGggc3BlY2lhbCBzeW50YXgKKyAqIEBpbmdyb3VwICBEQnVzCisgKiBAYnJpZWYgUGFyc2luZyBELUJ1cyB0eXBlIHNpZ25hdHVyZXMKKyAqIEB7CisgKi8KKworLyoqCisgKiBDaGVjayBhbiBvYmplY3QgcGF0aCBmb3IgdmFsaWRpdHkuIFJlbWVtYmVyIHRoYXQgI05VTEwgY2FuIGFsd2F5cworICogYmUgcGFzc2VkIGluc3RlYWQgb2YgYSBEQnVzRXJyb3IgKiwgaWYgeW91IGRvbid0IGNhcmUgYWJvdXQgaGF2aW5nCisgKiBhbiBlcnJvciBuYW1lIGFuZCBtZXNzYWdlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgc3VpdGFibGUgZm9yIHZhbGlkYXRpbmcgQyBzdHJpbmdzLCBidXQgaXMgbm90IHN1aXRhYmxlCisgKiBmb3IgdmFsaWRhdGluZyB1bnRydXN0ZWQgZGF0YSBmcm9tIGEgbmV0d29yayB1bmxlc3MgdGhlIHN0cmluZydzIGxlbmd0aAorICogaXMgYWxzbyBjaGVja2VkLCBzaW5jZSBpdCBhc3N1bWVzIHRoYXQgdGhlIHN0cmluZyBlbmRzIGF0IHRoZSBmaXJzdCB6ZXJvCisgKiBieXRlIGFjY29yZGluZyB0byBub3JtYWwgQyBjb252ZW50aW9ucy4KKyAqCisgKiBAcGFyYW0gcGF0aCBhIHBvdGVudGlhbGx5IGludmFsaWQgb2JqZWN0IHBhdGgsIHdoaWNoIG11c3Qgbm90IGJlICNOVUxMCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyAjVFJVRSBpZiBwYXRoIGlzIHZhbGlkCisgKi8KK2RidXNfYm9vbF90CitkYnVzX3ZhbGlkYXRlX3BhdGggKGNvbnN0IGNoYXIgICAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIHN0cjsKKyAgaW50IGxlbjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHBhdGggIT0gTlVMTCwgRkFMU0UpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBwYXRoKTsKKyAgbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpOworCisgIC8qIEluIGdlbmVyYWwsIGl0IG91Z2h0IHRvIGJlIHZhbGlkLi4uICovCisgIGlmIChfREJVU19MSUtFTFkgKF9kYnVzX3ZhbGlkYXRlX3BhdGggKCZzdHIsIDAsIGxlbikpKQorICAgIHJldHVybiBUUlVFOworCisgIC8qIHNsb3cgcGF0aDogc3RyaW5nIGlzIGludmFsaWQsIGZpbmQgb3V0IHdoeSAqLworCisgIGlmICghX2RidXNfc3RyaW5nX3ZhbGlkYXRlX3V0ZjggKCZzdHIsIDAsIGxlbikpCisgICAgeworICAgICAgLyogZG9uJ3QgcXVvdGUgdGhlIGFjdHVhbCBzdHJpbmcgaGVyZSwgc2luY2UgYSBEQnVzRXJyb3IgYWxzbyBuZWVkcyB0bworICAgICAgICogYmUgdmFsaWQgVVRGLTggKi8KKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgIk9iamVjdCBwYXRoIHdhcyBub3QgdmFsaWQgVVRGLTgiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogRklYTUU6IGxhdGVyLCBkaWFnbm9zZSBleGFjdGx5IGhvdyBpdCB3YXMgaW52YWxpZCAqLworICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgIk9iamVjdCBwYXRoIHdhcyBub3QgdmFsaWQ6ICclcyciLCBwYXRoKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIENoZWNrIGFuIGludGVyZmFjZSBuYW1lIGZvciB2YWxpZGl0eS4gUmVtZW1iZXIgdGhhdCAjTlVMTCBjYW4gYWx3YXlzCisgKiBiZSBwYXNzZWQgaW5zdGVhZCBvZiBhIERCdXNFcnJvciAqLCBpZiB5b3UgZG9uJ3QgY2FyZSBhYm91dCBoYXZpbmcKKyAqIGFuIGVycm9yIG5hbWUgYW5kIG1lc3NhZ2UuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBzdWl0YWJsZSBmb3IgdmFsaWRhdGluZyBDIHN0cmluZ3MsIGJ1dCBpcyBub3Qgc3VpdGFibGUKKyAqIGZvciB2YWxpZGF0aW5nIHVudHJ1c3RlZCBkYXRhIGZyb20gYSBuZXR3b3JrIHVubGVzcyB0aGUgc3RyaW5nJ3MgbGVuZ3RoCisgKiBpcyBhbHNvIGNoZWNrZWQsIHNpbmNlIGl0IGFzc3VtZXMgdGhhdCB0aGUgc3RyaW5nIGVuZHMgYXQgdGhlIGZpcnN0IHplcm8KKyAqIGJ5dGUgYWNjb3JkaW5nIHRvIG5vcm1hbCBDIGNvbnZlbnRpb25zLgorICoKKyAqIEBwYXJhbSBwYXRoIGEgcG90ZW50aWFsbHkgaW52YWxpZCBpbnRlcmZhY2UgbmFtZSwgd2hpY2ggbXVzdCBub3QgYmUgI05VTEwKKyAqIEBwYXJhbSBlcnJvciBlcnJvciByZXR1cm4KKyAqIEByZXR1cm5zICNUUlVFIGlmIG5hbWUgaXMgdmFsaWQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfdmFsaWRhdGVfaW50ZXJmYWNlIChjb25zdCBjaGFyICAgICAgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIHN0cjsKKyAgaW50IGxlbjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG5hbWUgIT0gTlVMTCwgRkFMU0UpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBuYW1lKTsKKyAgbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpOworCisgIC8qIEluIGdlbmVyYWwsIGl0IG91Z2h0IHRvIGJlIHZhbGlkLi4uICovCisgIGlmIChfREJVU19MSUtFTFkgKF9kYnVzX3ZhbGlkYXRlX2ludGVyZmFjZSAoJnN0ciwgMCwgbGVuKSkpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgLyogc2xvdyBwYXRoOiBzdHJpbmcgaXMgaW52YWxpZCwgZmluZCBvdXQgd2h5ICovCisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfdmFsaWRhdGVfdXRmOCAoJnN0ciwgMCwgbGVuKSkKKyAgICB7CisgICAgICAvKiBkb24ndCBxdW90ZSB0aGUgYWN0dWFsIHN0cmluZyBoZXJlLCBzaW5jZSBhIERCdXNFcnJvciBhbHNvIG5lZWRzIHRvCisgICAgICAgKiBiZSB2YWxpZCBVVEYtOCAqLworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAiSW50ZXJmYWNlIG5hbWUgd2FzIG5vdCB2YWxpZCBVVEYtOCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBGSVhNRTogbGF0ZXIsIGRpYWdub3NlIGV4YWN0bHkgaG93IGl0IHdhcyBpbnZhbGlkICovCisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgICAgICAgICAiSW50ZXJmYWNlIG5hbWUgd2FzIG5vdCB2YWxpZDogJyVzJyIsIG5hbWUpOworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogQ2hlY2sgYSBtZW1iZXIgKG1ldGhvZC9zaWduYWwpIG5hbWUgZm9yIHZhbGlkaXR5LiBSZW1lbWJlciB0aGF0ICNOVUxMCisgKiBjYW4gYWx3YXlzIGJlIHBhc3NlZCBpbnN0ZWFkIG9mIGEgREJ1c0Vycm9yICosIGlmIHlvdSBkb24ndCBjYXJlIGFib3V0CisgKiBoYXZpbmcgYW4gZXJyb3IgbmFtZSBhbmQgbWVzc2FnZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHN1aXRhYmxlIGZvciB2YWxpZGF0aW5nIEMgc3RyaW5ncywgYnV0IGlzIG5vdCBzdWl0YWJsZQorICogZm9yIHZhbGlkYXRpbmcgdW50cnVzdGVkIGRhdGEgZnJvbSBhIG5ldHdvcmsgdW5sZXNzIHRoZSBzdHJpbmcncyBsZW5ndGgKKyAqIGlzIGFsc28gY2hlY2tlZCwgc2luY2UgaXQgYXNzdW1lcyB0aGF0IHRoZSBzdHJpbmcgZW5kcyBhdCB0aGUgZmlyc3QgemVybworICogYnl0ZSBhY2NvcmRpbmcgdG8gbm9ybWFsIEMgY29udmVudGlvbnMuCisgKgorICogQHBhcmFtIHBhdGggYSBwb3RlbnRpYWxseSBpbnZhbGlkIG1lbWJlciBuYW1lLCB3aGljaCBtdXN0IG5vdCBiZSAjTlVMTAorICogQHBhcmFtIGVycm9yIGVycm9yIHJldHVybgorICogQHJldHVybnMgI1RSVUUgaWYgbmFtZSBpcyB2YWxpZAorICovCitkYnVzX2Jvb2xfdAorZGJ1c192YWxpZGF0ZV9tZW1iZXIgKGNvbnN0IGNoYXIgICAgICAgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgc3RyOworICBpbnQgbGVuOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobmFtZSAhPSBOVUxMLCBGQUxTRSk7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIG5hbWUpOworICBsZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cik7CisKKyAgLyogSW4gZ2VuZXJhbCwgaXQgb3VnaHQgdG8gYmUgdmFsaWQuLi4gKi8KKyAgaWYgKF9EQlVTX0xJS0VMWSAoX2RidXNfdmFsaWRhdGVfbWVtYmVyICgmc3RyLCAwLCBsZW4pKSkKKyAgICByZXR1cm4gVFJVRTsKKworICAvKiBzbG93IHBhdGg6IHN0cmluZyBpcyBpbnZhbGlkLCBmaW5kIG91dCB3aHkgKi8KKworICBpZiAoIV9kYnVzX3N0cmluZ192YWxpZGF0ZV91dGY4ICgmc3RyLCAwLCBsZW4pKQorICAgIHsKKyAgICAgIC8qIGRvbid0IHF1b3RlIHRoZSBhY3R1YWwgc3RyaW5nIGhlcmUsIHNpbmNlIGEgREJ1c0Vycm9yIGFsc28gbmVlZHMgdG8KKyAgICAgICAqIGJlIHZhbGlkIFVURi04ICovCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICJNZW1iZXIgbmFtZSB3YXMgbm90IHZhbGlkIFVURi04Iik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIEZJWE1FOiBsYXRlciwgZGlhZ25vc2UgZXhhY3RseSBob3cgaXQgd2FzIGludmFsaWQgKi8KKyAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICAgICAgICJNZW1iZXIgbmFtZSB3YXMgbm90IHZhbGlkOiAnJXMnIiwgbmFtZSk7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBDaGVjayBhbiBlcnJvciBuYW1lIGZvciB2YWxpZGl0eS4gUmVtZW1iZXIgdGhhdCAjTlVMTAorICogY2FuIGFsd2F5cyBiZSBwYXNzZWQgaW5zdGVhZCBvZiBhIERCdXNFcnJvciAqLCBpZiB5b3UgZG9uJ3QgY2FyZSBhYm91dAorICogaGF2aW5nIGFuIGVycm9yIG5hbWUgYW5kIG1lc3NhZ2UuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBzdWl0YWJsZSBmb3IgdmFsaWRhdGluZyBDIHN0cmluZ3MsIGJ1dCBpcyBub3Qgc3VpdGFibGUKKyAqIGZvciB2YWxpZGF0aW5nIHVudHJ1c3RlZCBkYXRhIGZyb20gYSBuZXR3b3JrIHVubGVzcyB0aGUgc3RyaW5nJ3MgbGVuZ3RoCisgKiBpcyBhbHNvIGNoZWNrZWQsIHNpbmNlIGl0IGFzc3VtZXMgdGhhdCB0aGUgc3RyaW5nIGVuZHMgYXQgdGhlIGZpcnN0IHplcm8KKyAqIGJ5dGUgYWNjb3JkaW5nIHRvIG5vcm1hbCBDIGNvbnZlbnRpb25zLgorICoKKyAqIEBwYXJhbSBwYXRoIGEgcG90ZW50aWFsbHkgaW52YWxpZCBlcnJvciBuYW1lLCB3aGljaCBtdXN0IG5vdCBiZSAjTlVMTAorICogQHBhcmFtIGVycm9yIGVycm9yIHJldHVybgorICogQHJldHVybnMgI1RSVUUgaWYgbmFtZSBpcyB2YWxpZAorICovCitkYnVzX2Jvb2xfdAorZGJ1c192YWxpZGF0ZV9lcnJvcl9uYW1lIChjb25zdCBjaGFyICAgICAgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBzdHI7CisgIGludCBsZW47CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChuYW1lICE9IE5VTEwsIEZBTFNFKTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgbmFtZSk7CisgIGxlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKTsKKworICAvKiBJbiBnZW5lcmFsLCBpdCBvdWdodCB0byBiZSB2YWxpZC4uLiAqLworICBpZiAoX0RCVVNfTElLRUxZIChfZGJ1c192YWxpZGF0ZV9lcnJvcl9uYW1lICgmc3RyLCAwLCBsZW4pKSkKKyAgICByZXR1cm4gVFJVRTsKKworICAvKiBzbG93IHBhdGg6IHN0cmluZyBpcyBpbnZhbGlkLCBmaW5kIG91dCB3aHkgKi8KKworICBpZiAoIV9kYnVzX3N0cmluZ192YWxpZGF0ZV91dGY4ICgmc3RyLCAwLCBsZW4pKQorICAgIHsKKyAgICAgIC8qIGRvbid0IHF1b3RlIHRoZSBhY3R1YWwgc3RyaW5nIGhlcmUsIHNpbmNlIGEgREJ1c0Vycm9yIGFsc28gbmVlZHMgdG8KKyAgICAgICAqIGJlIHZhbGlkIFVURi04ICovCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBuYW1lIHdhcyBub3QgdmFsaWQgVVRGLTgiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogRklYTUU6IGxhdGVyLCBkaWFnbm9zZSBleGFjdGx5IGhvdyBpdCB3YXMgaW52YWxpZCAqLworICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgIkVycm9yIG5hbWUgd2FzIG5vdCB2YWxpZDogJyVzJyIsIG5hbWUpOworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogQ2hlY2sgYSBidXMgbmFtZSBmb3IgdmFsaWRpdHkuIFJlbWVtYmVyIHRoYXQgI05VTEwKKyAqIGNhbiBhbHdheXMgYmUgcGFzc2VkIGluc3RlYWQgb2YgYSBEQnVzRXJyb3IgKiwgaWYgeW91IGRvbid0IGNhcmUgYWJvdXQKKyAqIGhhdmluZyBhbiBlcnJvciBuYW1lIGFuZCBtZXNzYWdlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgc3VpdGFibGUgZm9yIHZhbGlkYXRpbmcgQyBzdHJpbmdzLCBidXQgaXMgbm90IHN1aXRhYmxlCisgKiBmb3IgdmFsaWRhdGluZyB1bnRydXN0ZWQgZGF0YSBmcm9tIGEgbmV0d29yayB1bmxlc3MgdGhlIHN0cmluZydzIGxlbmd0aAorICogaXMgYWxzbyBjaGVja2VkLCBzaW5jZSBpdCBhc3N1bWVzIHRoYXQgdGhlIHN0cmluZyBlbmRzIGF0IHRoZSBmaXJzdCB6ZXJvCisgKiBieXRlIGFjY29yZGluZyB0byBub3JtYWwgQyBjb252ZW50aW9ucy4KKyAqCisgKiBAcGFyYW0gcGF0aCBhIHBvdGVudGlhbGx5IGludmFsaWQgYnVzIG5hbWUsIHdoaWNoIG11c3Qgbm90IGJlICNOVUxMCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyAjVFJVRSBpZiBuYW1lIGlzIHZhbGlkCisgKi8KK2RidXNfYm9vbF90CitkYnVzX3ZhbGlkYXRlX2J1c19uYW1lIChjb25zdCBjaGFyICAgICAgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgc3RyOworICBpbnQgbGVuOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobmFtZSAhPSBOVUxMLCBGQUxTRSk7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIG5hbWUpOworICBsZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cik7CisKKyAgLyogSW4gZ2VuZXJhbCwgaXQgb3VnaHQgdG8gYmUgdmFsaWQuLi4gKi8KKyAgaWYgKF9EQlVTX0xJS0VMWSAoX2RidXNfdmFsaWRhdGVfYnVzX25hbWUgKCZzdHIsIDAsIGxlbikpKQorICAgIHJldHVybiBUUlVFOworCisgIC8qIHNsb3cgcGF0aDogc3RyaW5nIGlzIGludmFsaWQsIGZpbmQgb3V0IHdoeSAqLworCisgIGlmICghX2RidXNfc3RyaW5nX3ZhbGlkYXRlX3V0ZjggKCZzdHIsIDAsIGxlbikpCisgICAgeworICAgICAgLyogZG9uJ3QgcXVvdGUgdGhlIGFjdHVhbCBzdHJpbmcgaGVyZSwgc2luY2UgYSBEQnVzRXJyb3IgYWxzbyBuZWVkcyB0bworICAgICAgICogYmUgdmFsaWQgVVRGLTggKi8KKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgIkJ1cyBuYW1lIHdhcyBub3QgdmFsaWQgVVRGLTgiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogRklYTUU6IGxhdGVyLCBkaWFnbm9zZSBleGFjdGx5IGhvdyBpdCB3YXMgaW52YWxpZCAqLworICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgIkJ1cyBuYW1lIHdhcyBub3QgdmFsaWQ6ICclcyciLCBuYW1lKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIENoZWNrIGEgc3RyaW5nIGZvciB2YWxpZGl0eS4gU3RyaW5ncyBvbiBELUJ1cyBtdXN0IGJlIHZhbGlkIFVURi04LgorICogUmVtZW1iZXIgdGhhdCAjTlVMTCBjYW4gYWx3YXlzIGJlIHBhc3NlZCBpbnN0ZWFkIG9mIGEgREJ1c0Vycm9yICosCisgKiBpZiB5b3UgZG9uJ3QgY2FyZSBhYm91dCBoYXZpbmcgYW4gZXJyb3IgbmFtZSBhbmQgbWVzc2FnZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHN1aXRhYmxlIGZvciB2YWxpZGF0aW5nIEMgc3RyaW5ncywgYnV0IGlzIG5vdCBzdWl0YWJsZQorICogZm9yIHZhbGlkYXRpbmcgdW50cnVzdGVkIGRhdGEgZnJvbSBhIG5ldHdvcmsgdW5sZXNzIHRoZSBzdHJpbmcncyBsZW5ndGgKKyAqIGlzIGFsc28gY2hlY2tlZCwgc2luY2UgaXQgYXNzdW1lcyB0aGF0IHRoZSBzdHJpbmcgZW5kcyBhdCB0aGUgZmlyc3QgemVybworICogYnl0ZSBhY2NvcmRpbmcgdG8gbm9ybWFsIEMgY29udmVudGlvbnMuCisgKgorICogQHBhcmFtIGFsbGVnZWRfdXRmOCBhIHN0cmluZyB0byBiZSBjaGVja2VkLCB3aGljaCBtdXN0IG5vdCBiZSAjTlVMTAorICogQHBhcmFtIGVycm9yIGVycm9yIHJldHVybgorICogQHJldHVybnMgI1RSVUUgaWYgYWxsZWdlZF91dGY4IGlzIHZhbGlkIFVURi04CisgKi8KK2RidXNfYm9vbF90CitkYnVzX3ZhbGlkYXRlX3V0ZjggKGNvbnN0IGNoYXIgICAgICAgKmFsbGVnZWRfdXRmOCwKKyAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgc3RyOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoYWxsZWdlZF91dGY4ICE9IE5VTEwsIEZBTFNFKTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgYWxsZWdlZF91dGY4KTsKKworICBpZiAoX0RCVVNfTElLRUxZIChfZGJ1c19zdHJpbmdfdmFsaWRhdGVfdXRmOCAoJnN0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpKQorICAgIHJldHVybiBUUlVFOworCisgIC8qIGRvbid0IHF1b3RlIHRoZSBhY3R1YWwgc3RyaW5nIGhlcmUsIHNpbmNlIGEgREJ1c0Vycm9yIGFsc28gbmVlZHMgdG8KKyAgICogYmUgdmFsaWQgVVRGLTggKi8KKyAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICAgICAgICJTdHJpbmcgd2FzIG5vdCB2YWxpZCBVVEYtOCIpOworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKiBAfSAqLyAvKiBlbmQgb2YgZ3JvdXAgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLXN5bnRheC5oIGIvZGJ1cy9kYnVzL2RidXMtc3ludGF4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFmMjBmMAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXN5bnRheC5oCkBAIC0wLDAgKzEsNTggQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zeW50YXguaCAtIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBzdHJpbmdzIHdpdGggc3BlY2lhbCBzeW50YXgKKyAqCisgKiBBdXRob3I6IFNpbW9uIE1jVml0dGllIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CisgKiBDb3B5cmlnaHQgwqkgMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZiAhZGVmaW5lZCAoREJVU19JTlNJREVfREJVU19IKSAmJiAhZGVmaW5lZCAoREJVU19DT01QSUxBVElPTikKKyNlcnJvciAiT25seSA8ZGJ1cy9kYnVzLmg+IGNhbiBiZSBpbmNsdWRlZCBkaXJlY3RseSwgdGhpcyBmaWxlIG1heSBkaXNhcHBlYXIgb3IgY2hhbmdlIGNvbnRlbnRzLiIKKyNlbmRpZgorCisjaWZuZGVmIERCVVNfU1lOVEFYX0gKKyNkZWZpbmUgREJVU19TWU5UQVhfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKworREJVU19CRUdJTl9ERUNMUworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgIGRidXNfdmFsaWRhdGVfcGF0aCAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgZGJ1c192YWxpZGF0ZV9pbnRlcmZhY2UgICAgICAgICAgICAgIChjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICBkYnVzX3ZhbGlkYXRlX21lbWJlciAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcik7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgIGRidXNfdmFsaWRhdGVfZXJyb3JfbmFtZSAgICAgICAgICAgICAoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAgICAgICAgICAgICAgIChjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICBkYnVzX3ZhbGlkYXRlX3V0ZjggICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKmFsbGVnZWRfdXRmOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKTsKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIG11bHRpcGxlLWluY2x1c2lvbiBndWFyZCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtc3lzZGVwcy1wdGhyZWFkLmMgYi9kYnVzL2RidXMvZGJ1cy1zeXNkZXBzLXB0aHJlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjA0NTdiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtc3lzZGVwcy1wdGhyZWFkLmMKQEAgLTAsMCArMSwyODUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zeXNkZXBzLXB0aHJlYWQuYyBJbXBsZW1lbnRzIHRocmVhZHMgdXNpbmcgcHRocmVhZHMgKGludGVybmFsIHRvIGxpYmRidXMpCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNiAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMuaCIKKyNpbmNsdWRlICJkYnVzLXRocmVhZHMuaCIKKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKy8qIFdoZXRoZXIgd2UgaGF2ZSBhICJtb25vdG9uaWMiIGNsb2NrOyBpLmUuIGEgY2xvY2sgbm90IGFmZmVjdGVkIGJ5CisgKiBjaGFuZ2VzIGluIHN5c3RlbSB0aW1lLgorICogVGhpcyBpcyBpbml0aWFsaXplZCBvbmNlIGluIGNoZWNrX21vbm90b25pY19jbG9jayBiZWxvdy4KKyAqIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTE4MTIxCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdCBoYXZlX21vbm90b25pY19jbG9jayA9IDA7CisKK3N0cnVjdCBEQnVzUk11dGV4IHsKKyAgcHRocmVhZF9tdXRleF90IGxvY2s7IC8qKjwgdGhlIGxvY2sgKi8KK307CisKK3N0cnVjdCBEQnVzQ011dGV4IHsKKyAgcHRocmVhZF9tdXRleF90IGxvY2s7IC8qKjwgdGhlIGxvY2sgKi8KK307CisKK3N0cnVjdCBEQnVzQ29uZFZhciB7CisgIHB0aHJlYWRfY29uZF90IGNvbmQ7IC8qKjwgdGhlIGNvbmRpdGlvbiAqLworfTsKKworI2RlZmluZSBEQlVTX01VVEVYKG0pICAgICAgICAgKChEQnVzTXV0ZXgqKSBtKQorI2RlZmluZSBEQlVTX01VVEVYX1BUSFJFQUQobSkgKChEQnVzTXV0ZXhQVGhyZWFkKikgbSkKKworI2RlZmluZSBEQlVTX0NPTkRfVkFSKGMpICAgICAgICAgKChEQnVzQ29uZFZhciopIGMpCisjZGVmaW5lIERCVVNfQ09ORF9WQVJfUFRIUkVBRChjKSAoKERCdXNDb25kVmFyUFRocmVhZCopIGMpCisKKworI2lmZGVmIERCVVNfRElTQUJMRV9BU1NFUlQKKy8qICh0bXAgIT0gMCkgaXMgYSBuby1vcCB1c2FnZSB0byBzaWxlbmNlIGNvbXBpbGVyICovCisjZGVmaW5lIFBUSFJFQURfQ0hFQ0soZnVuY19uYW1lLCByZXN1bHRfb3JfY2FsbCkgICAgXAorICAgIGRvIHsgaW50IHRtcCA9IChyZXN1bHRfb3JfY2FsbCk7IGlmICh0bXAgIT0gMCkgezt9IH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBQVEhSRUFEX0NIRUNLKGZ1bmNfbmFtZSwgcmVzdWx0X29yX2NhbGwpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCB0bXAgPSAocmVzdWx0X29yX2NhbGwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICh0bXAgIT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJwdGhyZWFkIGZ1bmN0aW9uICVzIGZhaWxlZCB3aXRoICVkICVzIGluICVzXG4iLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSwgdG1wLCBzdHJlcnJvcih0bXApLCBfREJVU19GVU5DVElPTl9OQU1FKTsgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiAhREJVU19ESVNBQkxFX0FTU0VSVCAqLworCitEQnVzQ011dGV4ICoKK19kYnVzX3BsYXRmb3JtX2NtdXRleF9uZXcgKHZvaWQpCit7CisgIERCdXNDTXV0ZXggKnBtdXRleDsKKyAgaW50IHJlc3VsdDsKKworICBwbXV0ZXggPSBkYnVzX25ldyAoREJ1c0NNdXRleCwgMSk7CisgIGlmIChwbXV0ZXggPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXN1bHQgPSBwdGhyZWFkX211dGV4X2luaXQgKCZwbXV0ZXgtPmxvY2ssIE5VTEwpOworCisgIGlmIChyZXN1bHQgPT0gRU5PTUVNIHx8IHJlc3VsdCA9PSBFQUdBSU4pCisgICAgeworICAgICAgZGJ1c19mcmVlIChwbXV0ZXgpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgUFRIUkVBRF9DSEVDSyAoInB0aHJlYWRfbXV0ZXhfaW5pdCIsIHJlc3VsdCk7CisgICAgfQorCisgIHJldHVybiBwbXV0ZXg7Cit9CisKK0RCdXNSTXV0ZXggKgorX2RidXNfcGxhdGZvcm1fcm11dGV4X25ldyAodm9pZCkKK3sKKyAgREJ1c1JNdXRleCAqcG11dGV4OworICBwdGhyZWFkX211dGV4YXR0cl90IG11dGV4YXR0cjsKKyAgaW50IHJlc3VsdDsKKworICBwbXV0ZXggPSBkYnVzX25ldyAoREJ1c1JNdXRleCwgMSk7CisgIGlmIChwbXV0ZXggPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBwdGhyZWFkX211dGV4YXR0cl9pbml0ICgmbXV0ZXhhdHRyKTsKKyAgcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSAoJm11dGV4YXR0ciwgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUpOworICByZXN1bHQgPSBwdGhyZWFkX211dGV4X2luaXQgKCZwbXV0ZXgtPmxvY2ssICZtdXRleGF0dHIpOworICBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95ICgmbXV0ZXhhdHRyKTsKKworICBpZiAocmVzdWx0ID09IEVOT01FTSB8fCByZXN1bHQgPT0gRUFHQUlOKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAocG11dGV4KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIFBUSFJFQURfQ0hFQ0sgKCJwdGhyZWFkX211dGV4X2luaXQiLCByZXN1bHQpOworICAgIH0KKworICByZXR1cm4gcG11dGV4OworfQorCit2b2lkCitfZGJ1c19wbGF0Zm9ybV9jbXV0ZXhfZnJlZSAoREJ1c0NNdXRleCAqbXV0ZXgpCit7CisgIFBUSFJFQURfQ0hFQ0sgKCJwdGhyZWFkX211dGV4X2Rlc3Ryb3kiLCBwdGhyZWFkX211dGV4X2Rlc3Ryb3kgKCZtdXRleC0+bG9jaykpOworICBkYnVzX2ZyZWUgKG11dGV4KTsKK30KKwordm9pZAorX2RidXNfcGxhdGZvcm1fcm11dGV4X2ZyZWUgKERCdXNSTXV0ZXggKm11dGV4KQoreworICBQVEhSRUFEX0NIRUNLICgicHRocmVhZF9tdXRleF9kZXN0cm95IiwgcHRocmVhZF9tdXRleF9kZXN0cm95ICgmbXV0ZXgtPmxvY2spKTsKKyAgZGJ1c19mcmVlIChtdXRleCk7Cit9CisKK3ZvaWQKK19kYnVzX3BsYXRmb3JtX2NtdXRleF9sb2NrIChEQnVzQ011dGV4ICptdXRleCkKK3sKKyAgUFRIUkVBRF9DSEVDSyAoInB0aHJlYWRfbXV0ZXhfbG9jayIsIHB0aHJlYWRfbXV0ZXhfbG9jayAoJm11dGV4LT5sb2NrKSk7Cit9CisKK3ZvaWQKK19kYnVzX3BsYXRmb3JtX3JtdXRleF9sb2NrIChEQnVzUk11dGV4ICptdXRleCkKK3sKKyAgUFRIUkVBRF9DSEVDSyAoInB0aHJlYWRfbXV0ZXhfbG9jayIsIHB0aHJlYWRfbXV0ZXhfbG9jayAoJm11dGV4LT5sb2NrKSk7Cit9CisKK3ZvaWQKK19kYnVzX3BsYXRmb3JtX2NtdXRleF91bmxvY2sgKERCdXNDTXV0ZXggKm11dGV4KQoreworICBQVEhSRUFEX0NIRUNLICgicHRocmVhZF9tdXRleF91bmxvY2siLCBwdGhyZWFkX211dGV4X3VubG9jayAoJm11dGV4LT5sb2NrKSk7Cit9CisKK3ZvaWQKK19kYnVzX3BsYXRmb3JtX3JtdXRleF91bmxvY2sgKERCdXNSTXV0ZXggKm11dGV4KQoreworICBQVEhSRUFEX0NIRUNLICgicHRocmVhZF9tdXRleF91bmxvY2siLCBwdGhyZWFkX211dGV4X3VubG9jayAoJm11dGV4LT5sb2NrKSk7Cit9CisKK0RCdXNDb25kVmFyICoKK19kYnVzX3BsYXRmb3JtX2NvbmR2YXJfbmV3ICh2b2lkKQoreworICBEQnVzQ29uZFZhciAqcGNvbmQ7CisgIHB0aHJlYWRfY29uZGF0dHJfdCBhdHRyOworICBpbnQgcmVzdWx0OworICAKKyAgcGNvbmQgPSBkYnVzX25ldyAoREJ1c0NvbmRWYXIsIDEpOworICBpZiAocGNvbmQgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBwdGhyZWFkX2NvbmRhdHRyX2luaXQgKCZhdHRyKTsKKyNpZmRlZiBIQVZFX01PTk9UT05JQ19DTE9DSworICBpZiAoaGF2ZV9tb25vdG9uaWNfY2xvY2spCisgICAgcHRocmVhZF9jb25kYXR0cl9zZXRjbG9jayAoJmF0dHIsIENMT0NLX01PTk9UT05JQyk7CisjZW5kaWYKKworICByZXN1bHQgPSBwdGhyZWFkX2NvbmRfaW5pdCAoJnBjb25kLT5jb25kLCAmYXR0cik7CisgIHB0aHJlYWRfY29uZGF0dHJfZGVzdHJveSAoJmF0dHIpOworCisgIGlmIChyZXN1bHQgPT0gRUFHQUlOIHx8IHJlc3VsdCA9PSBFTk9NRU0pCisgICAgeworICAgICAgZGJ1c19mcmVlIChwY29uZCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBQVEhSRUFEX0NIRUNLICgicHRocmVhZF9jb25kX2luaXQiLCByZXN1bHQpOworICAgIH0KKyAgCisgIHJldHVybiBwY29uZDsKK30KKwordm9pZAorX2RidXNfcGxhdGZvcm1fY29uZHZhcl9mcmVlIChEQnVzQ29uZFZhciAqY29uZCkKK3sKKyAgUFRIUkVBRF9DSEVDSyAoInB0aHJlYWRfY29uZF9kZXN0cm95IiwgcHRocmVhZF9jb25kX2Rlc3Ryb3kgKCZjb25kLT5jb25kKSk7CisgIGRidXNfZnJlZSAoY29uZCk7Cit9CisKK3ZvaWQKK19kYnVzX3BsYXRmb3JtX2NvbmR2YXJfd2FpdCAoREJ1c0NvbmRWYXIgKmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDTXV0ZXggICptdXRleCkKK3sKKyAgUFRIUkVBRF9DSEVDSyAoInB0aHJlYWRfY29uZF93YWl0IiwgcHRocmVhZF9jb25kX3dhaXQgKCZjb25kLT5jb25kLCAmbXV0ZXgtPmxvY2spKTsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX3BsYXRmb3JtX2NvbmR2YXJfd2FpdF90aW1lb3V0IChEQnVzQ29uZFZhciAgICAgICAgICAgICAgICpjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDTXV0ZXggICAgICAgICAgICAgICAgKm11dGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKQoreworICBzdHJ1Y3QgdGltZXZhbCB0aW1lX25vdzsKKyAgc3RydWN0IHRpbWVzcGVjIGVuZF90aW1lOworICBpbnQgcmVzdWx0OworCisjaWZkZWYgSEFWRV9NT05PVE9OSUNfQ0xPQ0sKKyAgaWYgKGhhdmVfbW9ub3RvbmljX2Nsb2NrKQorICAgIHsKKyAgICAgIHN0cnVjdCB0aW1lc3BlYyBtb25vdG9uaWNfdGltZXI7CisgICAgICBjbG9ja19nZXR0aW1lIChDTE9DS19NT05PVE9OSUMsJm1vbm90b25pY190aW1lcik7CisgICAgICB0aW1lX25vdy50dl9zZWMgPSBtb25vdG9uaWNfdGltZXIudHZfc2VjOworICAgICAgdGltZV9ub3cudHZfdXNlYyA9IG1vbm90b25pY190aW1lci50dl9uc2VjIC8gMTAwMDsKKyAgICB9CisgIGVsc2UKKyAgICAvKiBUaGlzIGVsc2UgZmFsbHMgdGhyb3VnaCB0byBnZXR0aW1lb2ZkYXkgKi8KKyNlbmRpZgorICBnZXR0aW1lb2ZkYXkgKCZ0aW1lX25vdywgTlVMTCk7CisgIAorICBlbmRfdGltZS50dl9zZWMgPSB0aW1lX25vdy50dl9zZWMgKyB0aW1lb3V0X21pbGxpc2Vjb25kcyAvIDEwMDA7CisgIGVuZF90aW1lLnR2X25zZWMgPSAodGltZV9ub3cudHZfdXNlYyArICh0aW1lb3V0X21pbGxpc2Vjb25kcyAlIDEwMDApICogMTAwMCkgKiAxMDAwOworICBpZiAoZW5kX3RpbWUudHZfbnNlYyA+IDEwMDAqMTAwMCoxMDAwKQorICAgIHsKKyAgICAgIGVuZF90aW1lLnR2X3NlYyArPSAxOworICAgICAgZW5kX3RpbWUudHZfbnNlYyAtPSAxMDAwKjEwMDAqMTAwMDsKKyAgICB9CisKKyAgcmVzdWx0ID0gcHRocmVhZF9jb25kX3RpbWVkd2FpdCAoJmNvbmQtPmNvbmQsICZtdXRleC0+bG9jaywgJmVuZF90aW1lKTsKKyAgCisgIGlmIChyZXN1bHQgIT0gRVRJTUVET1VUKQorICAgIHsKKyAgICAgIFBUSFJFQURfQ0hFQ0sgKCJwdGhyZWFkX2NvbmRfdGltZWR3YWl0IiwgcmVzdWx0KTsKKyAgICB9CisKKyAgLyogcmV0dXJuIHRydWUgaWYgd2UgZGlkIG5vdCB0aW1lIG91dCAqLworICByZXR1cm4gcmVzdWx0ICE9IEVUSU1FRE9VVDsKK30KKwordm9pZAorX2RidXNfcGxhdGZvcm1fY29uZHZhcl93YWtlX29uZSAoREJ1c0NvbmRWYXIgKmNvbmQpCit7CisgIFBUSFJFQURfQ0hFQ0sgKCJwdGhyZWFkX2NvbmRfc2lnbmFsIiwgcHRocmVhZF9jb25kX3NpZ25hbCAoJmNvbmQtPmNvbmQpKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX21vbm90b25pY19jbG9jayAodm9pZCkKK3sKKyNpZmRlZiBIQVZFX01PTk9UT05JQ19DTE9DSworICBzdHJ1Y3QgdGltZXNwZWMgZHVtbXk7CisgIGlmIChjbG9ja19nZXRyZXMgKENMT0NLX01PTk9UT05JQywgJmR1bW15KSA9PSAwKQorICAgIGhhdmVfbW9ub3RvbmljX2Nsb2NrID0gVFJVRTsKKyNlbmRpZgorfQorCitkYnVzX2Jvb2xfdAorX2RidXNfdGhyZWFkc19pbml0X3BsYXRmb3JtX3NwZWNpZmljICh2b2lkKQoreworICAvKiBUaGVzZSBoYXZlIHN0YXRpYyB2YXJpYWJsZXMsIGFuZCB3ZSBuZWVkIHRvIGhhbmRsZSBib3RoIHRoZSBjYXNlCisgICAqIHdoZXJlIGRidXNfdGhyZWFkc19pbml0KCkgaGFzIGJlZW4gY2FsbGVkIGFuZCB3aGVuIGl0IGhhc24ndDsKKyAgICogc28gaW5pdGlhbGl6ZSB0aGVtIGJlZm9yZSBhbnkgdGhyZWFkcyBhcmUgYWxsb3dlZCB0byBlbnRlci4KKyAgICovCisgIGNoZWNrX21vbm90b25pY19jbG9jayAoKTsKKyAgKHZvaWQpIF9kYnVzX2NoZWNrX3NldHVpZCAoKTsKKyAgcmV0dXJuIGRidXNfdGhyZWFkc19pbml0IChOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLXN5c2RlcHMtdGhyZWFkLXdpbi5jIGIvZGJ1cy9kYnVzL2RidXMtc3lzZGVwcy10aHJlYWQtd2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMwZTdiOAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXN5c2RlcHMtdGhyZWFkLXdpbi5jCkBAIC0wLDAgKzEsMjc0IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3lzZGVwcy1wdGhyZWFkLmMgSW1wbGVtZW50cyB0aHJlYWRzIHVzaW5nIFdpbmRvd3MgdGhyZWFkcyAoaW50ZXJuYWwgdG8gbGliZGJ1cykKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDA2ICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy13aW4uaCIKKyNpbmNsdWRlICJkYnVzLXRocmVhZHMuaCIKKyNpbmNsdWRlICJkYnVzLWxpc3QuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworc3RydWN0IERCdXNDb25kVmFyIHsKKyAgREJ1c0xpc3QgKmxpc3Q7ICAgICAgICAvKio8IGxpc3QgdGhyZWFkLWxvY2FsLXN0b3JlZCBldmVudHMgd2FpdGluZyBvbiB0aGUgY29uZCB2YXJpYWJsZSAqLworICBDUklUSUNBTF9TRUNUSU9OIGxvY2s7IC8qKjwgbG9jayBwcm90ZWN0aW5nIHRoZSBsaXN0ICovCit9OworCitzdGF0aWMgRFdPUkQgZGJ1c19jb25kX2V2ZW50X3RscyA9IFRMU19PVVRfT0ZfSU5ERVhFUzsKKworCitzdGF0aWMgSE1PRFVMRSBkYnVzX2RsbF9obW9kdWxlOworCit2b2lkICoKK19kYnVzX3dpbl9nZXRfZGxsX2htb2R1bGUgKHZvaWQpCit7CisgIHJldHVybiBkYnVzX2RsbF9obW9kdWxlOworfQorCisjaWZkZWYgREJVU19XSU5DRQorI2RlZmluZSBoaW5zdF90IEhBTkRMRQorI2Vsc2UKKyNkZWZpbmUgaGluc3RfdCBISU5TVEFOQ0UKKyNlbmRpZgorCitCT09MIFdJTkFQSSBEbGxNYWluIChoaW5zdF90LCBEV09SRCwgTFBWT0lEKTsKKworLyogV2UgbmVlZCB0aGlzIHRvIGZyZWUgdGhlIFRMUyBldmVudHMgb24gdGhyZWFkIGV4aXQgKi8KK0JPT0wgV0lOQVBJCitEbGxNYWluIChoaW5zdF90IGhpbnN0RExMLAorCSBEV09SRCAgICAgZmR3UmVhc29uLAorCSBMUFZPSUQgICAgbHB2UmVzZXJ2ZWQpCit7CisgIEhBTkRMRSBldmVudDsKKyAgc3dpdGNoIChmZHdSZWFzb24pIAorICAgIHsgCisgICAgY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6CisgICAgICBkYnVzX2RsbF9obW9kdWxlID0gaGluc3RETEw7CisgICAgICBicmVhazsKKyAgICBjYXNlIERMTF9USFJFQURfREVUQUNIOgorICAgICAgaWYgKGRidXNfY29uZF9ldmVudF90bHMgIT0gVExTX09VVF9PRl9JTkRFWEVTKQorCXsKKwkgIGV2ZW50ID0gVGxzR2V0VmFsdWUoZGJ1c19jb25kX2V2ZW50X3Rscyk7CisJICBDbG9zZUhhbmRsZSAoZXZlbnQpOworCSAgVGxzU2V0VmFsdWUoZGJ1c19jb25kX2V2ZW50X3RscywgTlVMTCk7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBETExfUFJPQ0VTU19ERVRBQ0g6IAorICAgICAgaWYgKGRidXNfY29uZF9ldmVudF90bHMgIT0gVExTX09VVF9PRl9JTkRFWEVTKQorCXsKKwkgIGV2ZW50ID0gVGxzR2V0VmFsdWUoZGJ1c19jb25kX2V2ZW50X3Rscyk7CisJICBDbG9zZUhhbmRsZSAoZXZlbnQpOworCSAgVGxzU2V0VmFsdWUoZGJ1c19jb25kX2V2ZW50X3RscywgTlVMTCk7CisKKwkgIFRsc0ZyZWUoZGJ1c19jb25kX2V2ZW50X3Rscyk7IAorCX0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IAorICAgICAgYnJlYWs7IAorICAgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK0RCdXNDTXV0ZXggKgorX2RidXNfcGxhdGZvcm1fY211dGV4X25ldyAodm9pZCkKK3sKKyAgSEFORExFIGhhbmRsZTsKKyAgaGFuZGxlID0gQ3JlYXRlTXV0ZXggKE5VTEwsIEZBTFNFLCBOVUxMKTsKKyAgcmV0dXJuIChEQnVzQ011dGV4ICopIGhhbmRsZTsKK30KKworREJ1c1JNdXRleCAqCitfZGJ1c19wbGF0Zm9ybV9ybXV0ZXhfbmV3ICh2b2lkKQoreworICBIQU5ETEUgaGFuZGxlOworICBoYW5kbGUgPSBDcmVhdGVNdXRleCAoTlVMTCwgRkFMU0UsIE5VTEwpOworICByZXR1cm4gKERCdXNSTXV0ZXggKikgaGFuZGxlOworfQorCit2b2lkCitfZGJ1c19wbGF0Zm9ybV9jbXV0ZXhfZnJlZSAoREJ1c0NNdXRleCAqbXV0ZXgpCit7CisgIENsb3NlSGFuZGxlICgoSEFORExFICopIG11dGV4KTsKK30KKwordm9pZAorX2RidXNfcGxhdGZvcm1fcm11dGV4X2ZyZWUgKERCdXNSTXV0ZXggKm11dGV4KQoreworICBDbG9zZUhhbmRsZSAoKEhBTkRMRSAqKSBtdXRleCk7Cit9CisKK3ZvaWQKK19kYnVzX3BsYXRmb3JtX2NtdXRleF9sb2NrIChEQnVzQ011dGV4ICptdXRleCkKK3sKKyAgV2FpdEZvclNpbmdsZU9iamVjdCAoKEhBTkRMRSAqKSBtdXRleCwgSU5GSU5JVEUpOworfQorCit2b2lkCitfZGJ1c19wbGF0Zm9ybV9ybXV0ZXhfbG9jayAoREJ1c1JNdXRleCAqbXV0ZXgpCit7CisgIFdhaXRGb3JTaW5nbGVPYmplY3QgKChIQU5ETEUgKikgbXV0ZXgsIElORklOSVRFKTsKK30KKwordm9pZAorX2RidXNfcGxhdGZvcm1fY211dGV4X3VubG9jayAoREJ1c0NNdXRleCAqbXV0ZXgpCit7CisgIFJlbGVhc2VNdXRleCAoKEhBTkRMRSAqKSBtdXRleCk7Cit9CisKK3ZvaWQKK19kYnVzX3BsYXRmb3JtX3JtdXRleF91bmxvY2sgKERCdXNSTXV0ZXggKm11dGV4KQoreworICBSZWxlYXNlTXV0ZXggKChIQU5ETEUgKikgbXV0ZXgpOworfQorCitEQnVzQ29uZFZhciAqCitfZGJ1c19wbGF0Zm9ybV9jb25kdmFyX25ldyAodm9pZCkKK3sKKyAgREJ1c0NvbmRWYXIgKmNvbmQ7CisgICAgCisgIGNvbmQgPSBkYnVzX25ldyAoREJ1c0NvbmRWYXIsIDEpOworICBpZiAoY29uZCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICAKKyAgY29uZC0+bGlzdCA9IE5VTEw7CisgIAorICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uICgmY29uZC0+bG9jayk7CisgIHJldHVybiBjb25kOworfQorCit2b2lkCitfZGJ1c19wbGF0Zm9ybV9jb25kdmFyX2ZyZWUgKERCdXNDb25kVmFyICpjb25kKQoreworICBEZWxldGVDcml0aWNhbFNlY3Rpb24gKCZjb25kLT5sb2NrKTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJmNvbmQtPmxpc3QpOworICBkYnVzX2ZyZWUgKGNvbmQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX2NvbmR2YXJfd2FpdF93aW4zMiAoREJ1c0NvbmRWYXIgKmNvbmQsCisJCQkgIERCdXNDTXV0ZXggKm11dGV4LAorCQkJICBpbnQgbWlsbGlzZWNvbmRzKQoreworICBEV09SRCByZXR2YWw7CisgIGRidXNfYm9vbF90IHJldDsKKyAgSEFORExFIGV2ZW50ID0gVGxzR2V0VmFsdWUgKGRidXNfY29uZF9ldmVudF90bHMpOworCisgIGlmICghZXZlbnQpCisgICAgeworICAgICAgZXZlbnQgPSBDcmVhdGVFdmVudCAoMCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKKyAgICAgIGlmIChldmVudCA9PSAwKQorCXJldHVybiBGQUxTRTsKKyAgICAgIFRsc1NldFZhbHVlIChkYnVzX2NvbmRfZXZlbnRfdGxzLCBldmVudCk7CisgICAgfQorCisgIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmY29uZC0+bG9jayk7CisKKyAgLyogVGhlIGV2ZW50IG11c3Qgbm90IGJlIHNpZ25hbGVkLiBDaGVjayB0aGlzICovCisgIF9kYnVzX2Fzc2VydCAoV2FpdEZvclNpbmdsZU9iamVjdCAoZXZlbnQsIDApID09IFdBSVRfVElNRU9VVCk7CisKKyAgcmV0ID0gX2RidXNfbGlzdF9hcHBlbmQgKCZjb25kLT5saXN0LCBldmVudCk7CisgIAorICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJmNvbmQtPmxvY2spOworICAKKyAgaWYgKCFyZXQpCisgICAgcmV0dXJuIEZBTFNFOyAvKiBQcmVwZW5kIGZhaWxlZCAqLworCisgIF9kYnVzX3BsYXRmb3JtX2NtdXRleF91bmxvY2sgKG11dGV4KTsKKyAgcmV0dmFsID0gV2FpdEZvclNpbmdsZU9iamVjdCAoZXZlbnQsIG1pbGxpc2Vjb25kcyk7CisgIF9kYnVzX3BsYXRmb3JtX2NtdXRleF9sb2NrIChtdXRleCk7CisgIAorICBpZiAocmV0dmFsID09IFdBSVRfVElNRU9VVCkKKyAgICB7CisgICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiAoJmNvbmQtPmxvY2spOworICAgICAgX2RidXNfbGlzdF9yZW1vdmUgKCZjb25kLT5saXN0LCBldmVudCk7CisKKyAgICAgIC8qIEluIHRoZSBtZWFudGltZSB3ZSBjb3VsZCBoYXZlIGJlZW4gc2lnbmFsZWQsIHNvIHdlIG11c3QgYWdhaW4KKyAgICAgICAqIHdhaXQgZm9yIHRoZSBzaWduYWwsIHRoaXMgdGltZSB3aXRoIG5vIHRpbWVvdXQsIHRvIHJlc2V0CisgICAgICAgKiBpdC4gcmV0dmFsIGlzIHNldCBhZ2FpbiB0byBob25vdXIgdGhlIGxhdGUgYXJyaXZhbCBvZiB0aGUKKyAgICAgICAqIHNpZ25hbCAqLworICAgICAgcmV0dmFsID0gV2FpdEZvclNpbmdsZU9iamVjdCAoZXZlbnQsIDApOworCisgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJmNvbmQtPmxvY2spOworICAgIH0KKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisgIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmY29uZC0+bG9jayk7CisKKyAgLyogTm93IGV2ZW50IG11c3Qgbm90IGJlIGluc2lkZSB0aGUgYXJyYXksIGNoZWNrIHRoaXMgKi8KKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19saXN0X3JlbW92ZSAoJmNvbmQtPmxpc3QsIGV2ZW50KSA9PSBGQUxTRSk7CisKKyAgTGVhdmVDcml0aWNhbFNlY3Rpb24gKCZjb25kLT5sb2NrKTsKKyNlbmRpZiAvKiAhR19ESVNBQkxFX0FTU0VSVCAqLworCisgIHJldHVybiByZXR2YWwgIT0gV0FJVF9USU1FT1VUOworfQorCit2b2lkCitfZGJ1c19wbGF0Zm9ybV9jb25kdmFyX3dhaXQgKERCdXNDb25kVmFyICpjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ011dGV4ICAqbXV0ZXgpCit7CisgIF9kYnVzX2NvbmR2YXJfd2FpdF93aW4zMiAoY29uZCwgbXV0ZXgsIElORklOSVRFKTsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX3BsYXRmb3JtX2NvbmR2YXJfd2FpdF90aW1lb3V0IChEQnVzQ29uZFZhciAgICAgICAgICAgICAgICpjb25kLAorCQkJCSAgICAgREJ1c0NNdXRleCAgICAgICAgICAgICAgICAqbXV0ZXgsCisJCQkJICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcykKK3sKKyAgcmV0dXJuIF9kYnVzX2NvbmR2YXJfd2FpdF93aW4zMiAoY29uZCwgbXV0ZXgsIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKK30KKwordm9pZAorX2RidXNfcGxhdGZvcm1fY29uZHZhcl93YWtlX29uZSAoREJ1c0NvbmRWYXIgKmNvbmQpCit7CisgIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmY29uZC0+bG9jayk7CisgIAorICBpZiAoY29uZC0+bGlzdCAhPSBOVUxMKQorICAgIHsKKyAgICAgIFNldEV2ZW50IChfZGJ1c19saXN0X3BvcF9maXJzdCAoJmNvbmQtPmxpc3QpKTsKKyAgICAgIC8qIEF2b2lkIGxpdmUgbG9jayBieSBwdXNoaW5nIHRoZSB3YWl0ZXIgdG8gdGhlIG11dGV4IGxvY2sKKyAgICAgICAgIGluc3RydWN0aW9uLCB3aGljaCBpcyBmYWlyLiAgSWYgd2UgZG9uJ3QgZG8gdGhpcywgd2UgY291bGQKKyAgICAgICAgIGFjcXVpcmUgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBhZ2FpbiBiZWZvcmUgdGhlIHdhaXRlciBoYXMgYQorICAgICAgICAgY2hhbmNlIGl0c2VsZiwgbGVhZGluZyB0byBzdGFydmF0aW9uLiAgKi8KKyAgICAgIFNsZWVwICgwKTsKKyAgICB9CisgIExlYXZlQ3JpdGljYWxTZWN0aW9uICgmY29uZC0+bG9jayk7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c190aHJlYWRzX2luaXRfcGxhdGZvcm1fc3BlY2lmaWMgKHZvaWQpCit7CisgIC8qIFdlIHJldXNlIHRoaXMgb3ZlciBzZXZlcmFsIGdlbmVyYXRpb25zLCBiZWNhdXNlIHdlIGNhbid0CisgICAqIGZyZWUgdGhlIGV2ZW50cyBvbmNlIHRoZXkgYXJlIGluIHVzZQorICAgKi8KKyAgaWYgKGRidXNfY29uZF9ldmVudF90bHMgPT0gVExTX09VVF9PRl9JTkRFWEVTKQorICAgIHsKKyAgICAgIGRidXNfY29uZF9ldmVudF90bHMgPSBUbHNBbGxvYyAoKTsKKyAgICAgIGlmIChkYnVzX2NvbmRfZXZlbnRfdGxzID09IFRMU19PVVRfT0ZfSU5ERVhFUykKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBkYnVzX3RocmVhZHNfaW5pdCAoTlVMTCk7Cit9CisKZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jIGIvZGJ1cy9kYnVzL2RidXMtc3lzZGVwcy11bml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YzNWQ5OQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jCkBAIC0wLDAgKzEsNDE5MSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXN5c2RlcHMtdW5peC5jIFdyYXBwZXJzIGFyb3VuZCBVTklYIHN5c3RlbS9saWJjIGZlYXR1cmVzIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDYgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMtdW5peC5oIgorI2luY2x1ZGUgImRidXMtdGhyZWFkcy5oIgorI2luY2x1ZGUgImRidXMtcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJkYnVzLXRyYW5zcG9ydC5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSAiZGJ1cy11c2VyZGIuaCIKKyNpbmNsdWRlICJkYnVzLWxpc3QuaCIKKyNpbmNsdWRlICJkYnVzLWNyZWRlbnRpYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1ub25jZS5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxzeXMvdW4uaD4KKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bG9jYWxlLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8Z3JwLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3NvY2tldHMuaD4KKworI2lmZGVmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1dSSVRFVgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfUE9MTAorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0JBQ0tUUkFDRQorI2luY2x1ZGUgPGV4ZWNpbmZvLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0dFVFBFRVJVQ1JFRAorI2luY2x1ZGUgPHVjcmVkLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQURUCisjaW5jbHVkZSA8YnNtL2FkdC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzZC1kYWVtb24uaCIKKworI2lmbmRlZiBPX0JJTkFSWQorI2RlZmluZSBPX0JJTkFSWSAwCisjZW5kaWYKKworI2lmbmRlZiBBSV9BRERSQ09ORklHCisjZGVmaW5lIEFJX0FERFJDT05GSUcgMAorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TT0NLTEVOX1QKKyNkZWZpbmUgc29ja2xlbl90IGludAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX3N1bikgfHwgZGVmaW5lZCAoX19zdW5fXykKKy8qCisgKiBDTVNfU1BBQ0UgZXRjLiBkZWZpbml0aW9ucyBmb3IgU29sYXJpcyA8IDEwLCBiYXNlZCBvbgorICogICBodHRwOi8vbWFpbG1hbi52aWRlb2xhbi5vcmcvcGlwZXJtYWlsL3ZsYy1kZXZlbC8yMDA2LU1heS8wMjQ0MDIuaHRtbAorICogdmlhCisgKiAgIGh0dHA6Ly93aWtpLm9wZW5jc3cub3JnL3BvcnRpbmctZmFxI3RvYzEwCisgKgorICogVGhlc2UgYXJlIG9ubHkgcmVkZWZpbmVkIGZvciBTb2xhcmlzLCBmb3Igbm93OiBpZiB5b3VyIE9TIG5lZWRzIHRoZXNlIHRvbywKKyAqIHBsZWFzZSBmaWxlIGEgYnVnLiAoT3IgcHJlZmVyYWJseSwgaW1wcm92ZSB5b3VyIE9TIHNvIHRoZXkncmUgbm90IG5lZWRlZC4pCisgKi8KKworIyBpZm5kZWYgQ01TR19BTElHTgorIyAgIGlmZGVmIF9fc3VuX18KKyMgICAgIGRlZmluZSBDTVNHX0FMSUdOKGxlbikgX0NNU0dfREFUQV9BTElHTiAobGVuKQorIyAgIGVsc2UKKyAgICAgIC8qIGFsaWduaW5nIHRvIHNpemVvZiAobG9uZykgaXMgYXNzdW1lZCB0byBiZSBwb3J0YWJsZSAoZmQubyM0MDIzNSkgKi8KKyMgICAgIGRlZmluZSBDTVNHX0FMSUdOKGxlbikgKCgobGVuKSArIHNpemVvZiAobG9uZykgLSAxKSAmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oc2l6ZW9mIChsb25nKSAtIDEpKQorIyAgIGVuZGlmCisjIGVuZGlmCisKKyMgaWZuZGVmIENNU0dfU1BBQ0UKKyMgICBkZWZpbmUgQ01TR19TUEFDRShsZW4pIChDTVNHX0FMSUdOIChzaXplb2YgKHN0cnVjdCBjbXNnaGRyKSkgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ01TR19BTElHTiAobGVuKSkKKyMgZW5kaWYKKworIyBpZm5kZWYgQ01TR19MRU4KKyMgICBkZWZpbmUgQ01TR19MRU4obGVuKSAoQ01TR19BTElHTiAoc2l6ZW9mIChzdHJ1Y3QgY21zZ2hkcikpICsgKGxlbikpCisjIGVuZGlmCisKKyNlbmRpZiAvKiBTb2xhcmlzICovCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfb3Blbl9zb2NrZXQgKGludCAgICAgICAgICAgICAgKmZkX3AsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgZG9tYWluLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisjaWZkZWYgU09DS19DTE9FWEVDCisgIGRidXNfYm9vbF90IGNsb2V4ZWNfZG9uZTsKKworICAqZmRfcCA9IHNvY2tldCAoZG9tYWluLCB0eXBlIHwgU09DS19DTE9FWEVDLCBwcm90b2NvbCk7CisgIGNsb2V4ZWNfZG9uZSA9ICpmZF9wID49IDA7CisKKyAgLyogQ2hlY2sgaWYga2VybmVsIHNlZW1zIHRvIGJlIHRvbyBvbGQgdG8ga25vdyBTT0NLX0NMT0VYRUMgKi8KKyAgaWYgKCpmZF9wIDwgMCAmJiBlcnJubyA9PSBFSU5WQUwpCisjZW5kaWYKKyAgICB7CisgICAgICAqZmRfcCA9IHNvY2tldCAoZG9tYWluLCB0eXBlLCBwcm90b2NvbCk7CisgICAgfQorCisgIGlmICgqZmRfcCA+PSAwKQorICAgIHsKKyNpZmRlZiBTT0NLX0NMT0VYRUMKKyAgICAgIGlmICghY2xvZXhlY19kb25lKQorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19mZF9zZXRfY2xvc2Vfb25fZXhlYygqZmRfcCk7CisgICAgICAgIH0KKworICAgICAgX2RidXNfdmVyYm9zZSAoInNvY2tldCBmZCAlZCBvcGVuZWRcbiIsICpmZF9wKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBvcGVuIHNvY2tldDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorCisvKioKKyAqIE9wZW5zIGEgVU5JWCBkb21haW4gc29ja2V0IChhcyBpbiB0aGUgc29ja2V0KCkgY2FsbCkuCisgKiBEb2VzIG5vdCBiaW5kIHRoZSBzb2NrZXQuCisgKgorICogVGhpcyB3aWxsIHNldCBGRF9DTE9FWEVDIGZvciB0aGUgc29ja2V0IHJldHVybmVkCisgKgorICogQHBhcmFtIGZkIHJldHVybiBsb2NhdGlvbiBmb3Igc29ja2V0IGRlc2NyaXB0b3IKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGFuIGVycm9yCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgZXJyb3IgaXMgc2V0CisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfb3Blbl91bml4X3NvY2tldCAoaW50ICAgICAgICAgICAgICAqZmQsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgcmV0dXJuIF9kYnVzX29wZW5fc29ja2V0KGZkLCBQRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgZXJyb3IpOworfQorCisvKioKKyAqIENsb3NlcyBhIHNvY2tldC4gU2hvdWxkIG5vdCBiZSB1c2VkIG9uIG5vbi1zb2NrZXQKKyAqIGZpbGUgZGVzY3JpcHRvcnMgb3IgaGFuZGxlcy4KKyAqCisgKiBAcGFyYW0gZmQgdGhlIHNvY2tldAorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgYW4gZXJyb3IKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciBpcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2Nsb3NlX3NvY2tldCAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICByZXR1cm4gX2RidXNfY2xvc2UgKGZkLCBlcnJvcik7Cit9CisKKy8qKgorICogTGlrZSBfZGJ1c19yZWFkKCksIGJ1dCBvbmx5IHdvcmtzIG9uIHNvY2tldHMgc28gaXMKKyAqIGF2YWlsYWJsZSBvbiBXaW5kb3dzLgorICoKKyAqIEBwYXJhbSBmZCB0aGUgc29ja2V0CisgKiBAcGFyYW0gYnVmZmVyIHN0cmluZyB0byBhcHBlbmQgZGF0YSB0bworICogQHBhcmFtIGNvdW50IG1heCBhbW91bnQgb2YgZGF0YSB0byByZWFkCisgKiBAcmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgYXBwZW5kZWQgdG8gdGhlIHN0cmluZworICovCitpbnQKK19kYnVzX3JlYWRfc29ja2V0IChpbnQgICAgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgY291bnQpCit7CisgIHJldHVybiBfZGJ1c19yZWFkIChmZCwgYnVmZmVyLCBjb3VudCk7Cit9CisKKy8qKgorICogTGlrZSBfZGJ1c193cml0ZSgpLCBidXQgb25seSBzdXBwb3J0cyBzb2NrZXRzCisgKiBhbmQgaXMgdGh1cyBhdmFpbGFibGUgb24gV2luZG93cy4KKyAqCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvciB0byB3cml0ZQorICogQHBhcmFtIGJ1ZmZlciB0aGUgYnVmZmVyIHRvIHdyaXRlIGRhdGEgZnJvbQorICogQHBhcmFtIHN0YXJ0IHRoZSBmaXJzdCBieXRlIGluIHRoZSBidWZmZXIgdG8gd3JpdGUKKyAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byB0cnkgdG8gd3JpdGUKKyAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBvciAtMSBvbiBlcnJvcgorICovCitpbnQKK19kYnVzX3dyaXRlX3NvY2tldCAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbikKK3sKKyNpZiBIQVZFX0RFQ0xfTVNHX05PU0lHTkFMCisgIGNvbnN0IGNoYXIgKmRhdGE7CisgIGludCBieXRlc193cml0dGVuOworCisgIGRhdGEgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChidWZmZXIsIHN0YXJ0LCBsZW4pOworCisgYWdhaW46CisKKyAgYnl0ZXNfd3JpdHRlbiA9IHNlbmQgKGZkLCBkYXRhLCBsZW4sIE1TR19OT1NJR05BTCk7CisKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPCAwICYmIGVycm5vID09IEVJTlRSKQorICAgIGdvdG8gYWdhaW47CisKKyAgcmV0dXJuIGJ5dGVzX3dyaXR0ZW47CisKKyNlbHNlCisgIHJldHVybiBfZGJ1c193cml0ZSAoZmQsIGJ1ZmZlciwgc3RhcnQsIGxlbik7CisjZW5kaWYKK30KKworLyoqCisgKiBMaWtlIF9kYnVzX3JlYWRfc29ja2V0KCkgYnV0IGFsc28gdHJpZXMgdG8gcmVhZCB1bml4IGZkcyBmcm9tIHRoZQorICogc29ja2V0LiBXaGVuIHRoZXJlIGFyZSBtb3JlIGZkcyB0byByZWFkIHRoYW4gc3BhY2UgaW4gdGhlIGFycmF5CisgKiBwYXNzZWQgdGhpcyBmdW5jdGlvbiB3aWxsIGZhaWwgd2l0aCBFTk9TUEMuCisgKgorICogQHBhcmFtIGZkIHRoZSBzb2NrZXQKKyAqIEBwYXJhbSBidWZmZXIgc3RyaW5nIHRvIGFwcGVuZCBkYXRhIHRvCisgKiBAcGFyYW0gY291bnQgbWF4IGFtb3VudCBvZiBkYXRhIHRvIHJlYWQKKyAqIEBwYXJhbSBmZHMgYXJyYXkgdG8gcGxhY2UgcmVhZCBmaWxlIGRlc2NyaXB0b3JzIGluCisgKiBAcGFyYW0gbl9mZHMgb24gaW5wdXQgc3BhY2UgaW4gZmRzIGFycmF5LCBvbiBvdXRwdXQgaG93IG1hbnkgZmRzIGFjdHVhbGx5IGdvdCByZWFkCisgKiBAcmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgYXBwZW5kZWQgdG8gc3RyaW5nCisgKi8KK2ludAorX2RidXNfcmVhZF9zb2NrZXRfd2l0aF91bml4X2ZkcyAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKmZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKm5fZmRzKSB7CisjaWZuZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIGludCByOworCisgIGlmICgociA9IF9kYnVzX3JlYWRfc29ja2V0KGZkLCBidWZmZXIsIGNvdW50KSkgPCAwKQorICAgIHJldHVybiByOworCisgICpuX2ZkcyA9IDA7CisgIHJldHVybiByOworCisjZWxzZQorICBpbnQgYnl0ZXNfcmVhZDsKKyAgaW50IHN0YXJ0OworICBzdHJ1Y3QgbXNnaGRyIG07CisgIHN0cnVjdCBpb3ZlYyBpb3Y7CisKKyAgX2RidXNfYXNzZXJ0IChjb3VudCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0ICgqbl9mZHMgPj0gMCk7CisKKyAgc3RhcnQgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYnVmZmVyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19sZW5ndGhlbiAoYnVmZmVyLCBjb3VudCkpCisgICAgeworICAgICAgZXJybm8gPSBFTk9NRU07CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIF9EQlVTX1pFUk8oaW92KTsKKyAgaW92Lmlvdl9iYXNlID0gX2RidXNfc3RyaW5nX2dldF9kYXRhX2xlbiAoYnVmZmVyLCBzdGFydCwgY291bnQpOworICBpb3YuaW92X2xlbiA9IGNvdW50OworCisgIF9EQlVTX1pFUk8obSk7CisgIG0ubXNnX2lvdiA9ICZpb3Y7CisgIG0ubXNnX2lvdmxlbiA9IDE7CisKKyAgLyogSG1tLCB3ZSBoYXZlIG5vIGNsdWUgaG93IGxvbmcgdGhlIGNvbnRyb2wgZGF0YSB3aWxsIGFjdHVhbGx5IGJlCisgICAgIHRoYXQgaXMgcXVldWVkIGZvciB1cy4gVGhlIGxlYXN0IHdlIGNhbiBkbyBpcyBhc3N1bWUgdGhhdCB0aGUKKyAgICAgY2FsbGVyIGtub3dzLiBIZW5jZSBsZXQncyBtYWtlIHNwYWNlIGZvciB0aGUgbnVtYmVyIG9mIGZkcyB0aGF0CisgICAgIHdlIHNoYWxsIHJlYWQgYXQgbWF4IHBsdXMgdGhlIGNtc2cgaGVhZGVyLiAqLworICBtLm1zZ19jb250cm9sbGVuID0gQ01TR19TUEFDRSgqbl9mZHMgKiBzaXplb2YoaW50KSk7CisKKyAgLyogSXQncyBwcm9iYWJseSBzYWZlIHRvIGFzc3VtZSB0aGF0IHN5c3RlbXMgd2l0aCBTQ01fUklHSFRTIGFsc28KKyAgICAga25vdyBhbGxvY2EoKSAqLworICBtLm1zZ19jb250cm9sID0gYWxsb2NhKG0ubXNnX2NvbnRyb2xsZW4pOworICBtZW1zZXQobS5tc2dfY29udHJvbCwgMCwgbS5tc2dfY29udHJvbGxlbik7CisKKyBhZ2FpbjoKKworICBieXRlc19yZWFkID0gcmVjdm1zZyhmZCwgJm0sIDAKKyNpZmRlZiBNU0dfQ01TR19DTE9FWEVDCisgICAgICAgICAgICAgICAgICAgICAgIHxNU0dfQ01TR19DTE9FWEVDCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICBpZiAoYnl0ZXNfcmVhZCA8IDApCisgICAgeworICAgICAgaWYgKGVycm5vID09IEVJTlRSKQorICAgICAgICBnb3RvIGFnYWluOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogcHV0IGxlbmd0aCBiYWNrIChub3RlIHRoYXQgdGhpcyBkb2Vzbid0IGFjdHVhbGx5IHJlYWxsb2MgYW55dGhpbmcpICovCisgICAgICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKGJ1ZmZlciwgc3RhcnQpOworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHN0cnVjdCBjbXNnaGRyICpjbTsKKyAgICAgIGRidXNfYm9vbF90IGZvdW5kID0gRkFMU0U7CisKKyAgICAgIGlmIChtLm1zZ19mbGFncyAmIE1TR19DVFJVTkMpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBIbW0sIGFwcGFyZW50bHkgdGhlIGNvbnRyb2wgZGF0YSB3YXMgdHJ1bmNhdGVkLiBUaGUgYmFkCisgICAgICAgICAgICAgdGhpbmcgaXMgdGhhdCB3ZSBtaWdodCBoYXZlIGNvbXBsZXRlbHkgbG9zdCBhIGNvdXBsZSBvZiBmZHMKKyAgICAgICAgICAgICB3aXRob3V0IGNoYW5jZSB0byByZWNvdmVyIHRoZW0uIEhlbmNlIGxldCdzIHRyZWF0IHRoaXMgYXMgYQorICAgICAgICAgICAgIHNlcmlvdXMgZXJyb3IuICovCisKKyAgICAgICAgICBlcnJubyA9IEVOT1NQQzsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoYnVmZmVyLCBzdGFydCk7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgIGZvciAoY20gPSBDTVNHX0ZJUlNUSERSKCZtKTsgY207IGNtID0gQ01TR19OWFRIRFIoJm0sIGNtKSkKKyAgICAgICAgaWYgKGNtLT5jbXNnX2xldmVsID09IFNPTF9TT0NLRVQgJiYgY20tPmNtc2dfdHlwZSA9PSBTQ01fUklHSFRTKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGk7CisKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydChjbS0+Y21zZ19sZW4gPD0gQ01TR19MRU4oKm5fZmRzICogc2l6ZW9mKGludCkpKTsKKyAgICAgICAgICAgICpuX2ZkcyA9IChjbS0+Y21zZ19sZW4gLSBDTVNHX0xFTigwKSkgLyBzaXplb2YoaW50KTsKKworICAgICAgICAgICAgbWVtY3B5KGZkcywgQ01TR19EQVRBKGNtKSwgKm5fZmRzICogc2l6ZW9mKGludCkpOworICAgICAgICAgICAgZm91bmQgPSBUUlVFOworCisgICAgICAgICAgICAvKiBMaW51eCBkb2Vzbid0IHRlbGwgdXMgd2hldGhlciBNU0dfQ01TR19DTE9FWEVDIGFjdHVhbGx5CisgICAgICAgICAgICAgICB3b3JrZWQsIGhlbmNlIHdlIG5lZWQgdG8gZ28gdGhyb3VnaCB0aGlzIGxpc3QgYW5kIHNldAorICAgICAgICAgICAgICAgQ0xPRVhFQyBldmVyeXdoZXJlIGluIGFueSBjYXNlICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKm5fZmRzOyBpKyspCisgICAgICAgICAgICAgIF9kYnVzX2ZkX3NldF9jbG9zZV9vbl9leGVjKGZkc1tpXSk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgaWYgKCFmb3VuZCkKKyAgICAgICAgKm5fZmRzID0gMDsKKworICAgICAgLyogcHV0IGxlbmd0aCBiYWNrIChkb2Vzbid0IGFjdHVhbGx5IHJlYWxsb2MpICovCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoYnVmZmVyLCBzdGFydCArIGJ5dGVzX3JlYWQpOworCisjaWYgMAorICAgICAgaWYgKGJ5dGVzX3JlYWQgPiAwKQorICAgICAgICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoYnVmZmVyLCBzdGFydCwgYnl0ZXNfcmVhZCk7CisjZW5kaWYKKworICAgICAgcmV0dXJuIGJ5dGVzX3JlYWQ7CisgICAgfQorI2VuZGlmCit9CisKK2ludAorX2RidXNfd3JpdGVfc29ja2V0X3dpdGhfdW5peF9mZHMoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICAgKmZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIG5fZmRzKSB7CisKKyNpZm5kZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKworICBpZiAobl9mZHMgPiAwKSB7CisgICAgZXJybm8gPSBFTk9UU1VQOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHJldHVybiBfZGJ1c193cml0ZV9zb2NrZXQoZmQsIGJ1ZmZlciwgc3RhcnQsIGxlbik7CisjZWxzZQorICByZXR1cm4gX2RidXNfd3JpdGVfc29ja2V0X3dpdGhfdW5peF9mZHNfdHdvKGZkLCBidWZmZXIsIHN0YXJ0LCBsZW4sIE5VTEwsIDAsIDAsIGZkcywgbl9mZHMpOworI2VuZGlmCit9CisKK2ludAorX2RidXNfd3JpdGVfc29ja2V0X3dpdGhfdW5peF9mZHNfdHdvKGludCAgICAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlcjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgICpmZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbl9mZHMpIHsKKworI2lmbmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworCisgIGlmIChuX2ZkcyA+IDApIHsKKyAgICBlcnJubyA9IEVOT1RTVVA7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0dXJuIF9kYnVzX3dyaXRlX3NvY2tldF90d28oZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjEsIHN0YXJ0MSwgbGVuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyMiwgc3RhcnQyLCBsZW4yKTsKKyNlbHNlCisKKyAgc3RydWN0IG1zZ2hkciBtOworICBzdHJ1Y3QgY21zZ2hkciAqY207CisgIHN0cnVjdCBpb3ZlYyBpb3ZbMl07CisgIGludCBieXRlc193cml0dGVuOworCisgIF9kYnVzX2Fzc2VydCAobGVuMSA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4yID49IDApOworICBfZGJ1c19hc3NlcnQgKG5fZmRzID49IDApOworCisgIF9EQlVTX1pFUk8oaW92KTsKKyAgaW92WzBdLmlvdl9iYXNlID0gKGNoYXIqKSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChidWZmZXIxLCBzdGFydDEsIGxlbjEpOworICBpb3ZbMF0uaW92X2xlbiA9IGxlbjE7CisKKyAgaWYgKGJ1ZmZlcjIpCisgICAgeworICAgICAgaW92WzFdLmlvdl9iYXNlID0gKGNoYXIqKSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChidWZmZXIyLCBzdGFydDIsIGxlbjIpOworICAgICAgaW92WzFdLmlvdl9sZW4gPSBsZW4yOworICAgIH0KKworICBfREJVU19aRVJPKG0pOworICBtLm1zZ19pb3YgPSBpb3Y7CisgIG0ubXNnX2lvdmxlbiA9IGJ1ZmZlcjIgPyAyIDogMTsKKworICBpZiAobl9mZHMgPiAwKQorICAgIHsKKyAgICAgIG0ubXNnX2NvbnRyb2xsZW4gPSBDTVNHX1NQQUNFKG5fZmRzICogc2l6ZW9mKGludCkpOworICAgICAgbS5tc2dfY29udHJvbCA9IGFsbG9jYShtLm1zZ19jb250cm9sbGVuKTsKKyAgICAgIG1lbXNldChtLm1zZ19jb250cm9sLCAwLCBtLm1zZ19jb250cm9sbGVuKTsKKworICAgICAgY20gPSBDTVNHX0ZJUlNUSERSKCZtKTsKKyAgICAgIGNtLT5jbXNnX2xldmVsID0gU09MX1NPQ0tFVDsKKyAgICAgIGNtLT5jbXNnX3R5cGUgPSBTQ01fUklHSFRTOworICAgICAgY20tPmNtc2dfbGVuID0gQ01TR19MRU4obl9mZHMgKiBzaXplb2YoaW50KSk7CisgICAgICBtZW1jcHkoQ01TR19EQVRBKGNtKSwgZmRzLCBuX2ZkcyAqIHNpemVvZihpbnQpKTsKKyAgICB9CisKKyBhZ2FpbjoKKworICBieXRlc193cml0dGVuID0gc2VuZG1zZyAoZmQsICZtLCAwCisjaWYgSEFWRV9ERUNMX01TR19OT1NJR05BTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgfE1TR19OT1NJR05BTAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgIGlmIChieXRlc193cml0dGVuIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKKyAgICBnb3RvIGFnYWluOworCisjaWYgMAorICBpZiAoYnl0ZXNfd3JpdHRlbiA+IDApCisgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKGJ1ZmZlciwgc3RhcnQsIGJ5dGVzX3dyaXR0ZW4pOworI2VuZGlmCisKKyAgcmV0dXJuIGJ5dGVzX3dyaXR0ZW47CisjZW5kaWYKK30KKworLyoqCisgKiBMaWtlIF9kYnVzX3dyaXRlX3R3bygpIGJ1dCBvbmx5IHdvcmtzIG9uIHNvY2tldHMgYW5kIGlzIHRodXMKKyAqIGF2YWlsYWJsZSBvbiBXaW5kb3dzLgorICoKKyAqIEBwYXJhbSBmZCB0aGUgZmlsZSBkZXNjcmlwdG9yCisgKiBAcGFyYW0gYnVmZmVyMSBmaXJzdCBidWZmZXIKKyAqIEBwYXJhbSBzdGFydDEgZmlyc3QgYnl0ZSB0byB3cml0ZSBpbiBmaXJzdCBidWZmZXIKKyAqIEBwYXJhbSBsZW4xIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSBmcm9tIGZpcnN0IGJ1ZmZlcgorICogQHBhcmFtIGJ1ZmZlcjIgc2Vjb25kIGJ1ZmZlciwgb3IgI05VTEwKKyAqIEBwYXJhbSBzdGFydDIgZmlyc3QgYnl0ZSB0byB3cml0ZSBpbiBzZWNvbmQgYnVmZmVyCisgKiBAcGFyYW0gbGVuMiBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgaW4gc2Vjb25kIGJ1ZmZlcgorICogQHJldHVybnMgdG90YWwgYnl0ZXMgd3JpdHRlbiBmcm9tIGJvdGggYnVmZmVycywgb3IgLTEgb24gZXJyb3IKKyAqLworaW50CitfZGJ1c193cml0ZV9zb2NrZXRfdHdvIChpbnQgICAgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlcjEsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydDEsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4xLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbjIpCit7CisjaWYgSEFWRV9ERUNMX01TR19OT1NJR05BTAorICBzdHJ1Y3QgaW92ZWMgdmVjdG9yc1syXTsKKyAgY29uc3QgY2hhciAqZGF0YTE7CisgIGNvbnN0IGNoYXIgKmRhdGEyOworICBpbnQgYnl0ZXNfd3JpdHRlbjsKKyAgc3RydWN0IG1zZ2hkciBtOworCisgIF9kYnVzX2Fzc2VydCAoYnVmZmVyMSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydDEgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQyID49IDApOworICBfZGJ1c19hc3NlcnQgKGxlbjEgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobGVuMiA+PSAwKTsKKworICBkYXRhMSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKGJ1ZmZlcjEsIHN0YXJ0MSwgbGVuMSk7CisKKyAgaWYgKGJ1ZmZlcjIgIT0gTlVMTCkKKyAgICBkYXRhMiA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKGJ1ZmZlcjIsIHN0YXJ0MiwgbGVuMik7CisgIGVsc2UKKyAgICB7CisgICAgICBkYXRhMiA9IE5VTEw7CisgICAgICBzdGFydDIgPSAwOworICAgICAgbGVuMiA9IDA7CisgICAgfQorCisgIHZlY3RvcnNbMF0uaW92X2Jhc2UgPSAoY2hhciopIGRhdGExOworICB2ZWN0b3JzWzBdLmlvdl9sZW4gPSBsZW4xOworICB2ZWN0b3JzWzFdLmlvdl9iYXNlID0gKGNoYXIqKSBkYXRhMjsKKyAgdmVjdG9yc1sxXS5pb3ZfbGVuID0gbGVuMjsKKworICBfREJVU19aRVJPKG0pOworICBtLm1zZ19pb3YgPSB2ZWN0b3JzOworICBtLm1zZ19pb3ZsZW4gPSBkYXRhMiA/IDIgOiAxOworCisgYWdhaW46CisKKyAgYnl0ZXNfd3JpdHRlbiA9IHNlbmRtc2cgKGZkLCAmbSwgTVNHX05PU0lHTkFMKTsKKworICBpZiAoYnl0ZXNfd3JpdHRlbiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpCisgICAgZ290byBhZ2FpbjsKKworICByZXR1cm4gYnl0ZXNfd3JpdHRlbjsKKworI2Vsc2UKKyAgcmV0dXJuIF9kYnVzX3dyaXRlX3R3byAoZmQsIGJ1ZmZlcjEsIHN0YXJ0MSwgbGVuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyMiwgc3RhcnQyLCBsZW4yKTsKKyNlbmRpZgorfQorCitkYnVzX2Jvb2xfdAorX2RidXNfc29ja2V0X2lzX2ludmFsaWQgKGludCBmZCkKK3sKKyAgICByZXR1cm4gZmQgPCAwID8gVFJVRSA6IEZBTFNFOworfQorCisvKioKKyAqIFRoaW4gd3JhcHBlciBhcm91bmQgdGhlIHJlYWQoKSBzeXN0ZW0gY2FsbCB0aGF0IGFwcGVuZHMKKyAqIHRoZSBkYXRhIGl0IHJlYWRzIHRvIHRoZSBEQnVzU3RyaW5nIGJ1ZmZlci4gSXQgYXBwZW5kcworICogdXAgdG8gdGhlIGdpdmVuIGNvdW50LCBhbmQgcmV0dXJucyB0aGUgc2FtZSB2YWx1ZQorICogYW5kIHNhbWUgZXJybm8gYXMgcmVhZCgpLiBUaGUgb25seSBleGNlcHRpb24gaXMgdGhhdAorICogX2RidXNfcmVhZCgpIGhhbmRsZXMgRUlOVFIgZm9yIHlvdS4gQWxzbywgX2RidXNfcmVhZCgpIGNhbgorICogcmV0dXJuIEVOT01FTSwgZXZlbiB0aG91Z2ggcmVndWxhciBVTklYIHJlYWQgZG9lc24ndC4KKyAqCisgKiBVbmxpa2UgX2RidXNfcmVhZF9zb2NrZXQoKSwgX2RidXNfcmVhZCgpIGlzIG5vdCBhdmFpbGFibGUKKyAqIG9uIFdpbmRvd3MuCisgKgorICogQHBhcmFtIGZkIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gcmVhZCBmcm9tCisgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gYXBwZW5kIGRhdGEgdG8KKyAqIEBwYXJhbSBjb3VudCB0aGUgYW1vdW50IG9mIGRhdGEgdG8gcmVhZAorICogQHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIC0xCisgKi8KK2ludAorX2RidXNfcmVhZCAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpidWZmZXIsCisgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBjb3VudCkKK3sKKyAgaW50IGJ5dGVzX3JlYWQ7CisgIGludCBzdGFydDsKKyAgY2hhciAqZGF0YTsKKworICBfZGJ1c19hc3NlcnQgKGNvdW50ID49IDApOworCisgIHN0YXJ0ID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGJ1ZmZlcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbGVuZ3RoZW4gKGJ1ZmZlciwgY291bnQpKQorICAgIHsKKyAgICAgIGVycm5vID0gRU5PTUVNOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBkYXRhID0gX2RidXNfc3RyaW5nX2dldF9kYXRhX2xlbiAoYnVmZmVyLCBzdGFydCwgY291bnQpOworCisgYWdhaW46CisKKyAgYnl0ZXNfcmVhZCA9IHJlYWQgKGZkLCBkYXRhLCBjb3VudCk7CisKKyAgaWYgKGJ5dGVzX3JlYWQgPCAwKQorICAgIHsKKyAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIHB1dCBsZW5ndGggYmFjayAobm90ZSB0aGF0IHRoaXMgZG9lc24ndCBhY3R1YWxseSByZWFsbG9jIGFueXRoaW5nKSAqLworICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChidWZmZXIsIHN0YXJ0KTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBwdXQgbGVuZ3RoIGJhY2sgKGRvZXNuJ3QgYWN0dWFsbHkgcmVhbGxvYykgKi8KKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChidWZmZXIsIHN0YXJ0ICsgYnl0ZXNfcmVhZCk7CisKKyNpZiAwCisgICAgICBpZiAoYnl0ZXNfcmVhZCA+IDApCisgICAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nIChidWZmZXIsIHN0YXJ0LCBieXRlc19yZWFkKTsKKyNlbmRpZgorCisgICAgICByZXR1cm4gYnl0ZXNfcmVhZDsKKyAgICB9Cit9CisKKy8qKgorICogVGhpbiB3cmFwcGVyIGFyb3VuZCB0aGUgd3JpdGUoKSBzeXN0ZW0gY2FsbCB0aGF0IHdyaXRlcyBhIHBhcnQgb2YgYQorICogREJ1c1N0cmluZyBhbmQgaGFuZGxlcyBFSU5UUiBmb3IgeW91LgorICoKKyAqIEBwYXJhbSBmZCB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIHdyaXRlCisgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gd3JpdGUgZGF0YSBmcm9tCisgKiBAcGFyYW0gc3RhcnQgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ1ZmZlciB0byB3cml0ZQorICogQHBhcmFtIGxlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHRyeSB0byB3cml0ZQorICogQHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG9yIC0xIG9uIGVycm9yCisgKi8KK2ludAorX2RidXNfd3JpdGUgKGludCAgICAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlciwKKyAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4pCit7CisgIGNvbnN0IGNoYXIgKmRhdGE7CisgIGludCBieXRlc193cml0dGVuOworCisgIGRhdGEgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChidWZmZXIsIHN0YXJ0LCBsZW4pOworCisgYWdhaW46CisKKyAgYnl0ZXNfd3JpdHRlbiA9IHdyaXRlIChmZCwgZGF0YSwgbGVuKTsKKworICBpZiAoYnl0ZXNfd3JpdHRlbiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpCisgICAgZ290byBhZ2FpbjsKKworI2lmIDAKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPiAwKQorICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nIChidWZmZXIsIHN0YXJ0LCBieXRlc193cml0dGVuKTsKKyNlbmRpZgorCisgIHJldHVybiBieXRlc193cml0dGVuOworfQorCisvKioKKyAqIExpa2UgX2RidXNfd3JpdGUoKSBidXQgd2lsbCB1c2Ugd3JpdGV2KCkgaWYgcG9zc2libGUKKyAqIHRvIHdyaXRlIGJvdGggYnVmZmVycyBpbiBzZXF1ZW5jZS4gVGhlIHJldHVybiB2YWx1ZQorICogaXMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGluIHRoZSBmaXJzdCBidWZmZXIsCisgKiBwbHVzIHRoZSBudW1iZXIgd3JpdHRlbiBpbiB0aGUgc2Vjb25kLiBJZiB0aGUgZmlyc3QKKyAqIGJ1ZmZlciBpcyB3cml0dGVuIHN1Y2Nlc3NmdWxseSBhbmQgYW4gZXJyb3Igb2NjdXJzCisgKiB3cml0aW5nIHRoZSBzZWNvbmQsIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGZpcnN0CisgKiBpcyByZXR1cm5lZCAoaS5lLiB0aGUgZXJyb3IgaXMgaWdub3JlZCksIG9uIHN5c3RlbXMgdGhhdAorICogZG9uJ3QgaGF2ZSB3cml0ZXYuIEhhbmRsZXMgRUlOVFIgZm9yIHlvdS4KKyAqIFRoZSBzZWNvbmQgYnVmZmVyIG1heSBiZSAjTlVMTC4KKyAqCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvcgorICogQHBhcmFtIGJ1ZmZlcjEgZmlyc3QgYnVmZmVyCisgKiBAcGFyYW0gc3RhcnQxIGZpcnN0IGJ5dGUgdG8gd3JpdGUgaW4gZmlyc3QgYnVmZmVyCisgKiBAcGFyYW0gbGVuMSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgZnJvbSBmaXJzdCBidWZmZXIKKyAqIEBwYXJhbSBidWZmZXIyIHNlY29uZCBidWZmZXIsIG9yICNOVUxMCisgKiBAcGFyYW0gc3RhcnQyIGZpcnN0IGJ5dGUgdG8gd3JpdGUgaW4gc2Vjb25kIGJ1ZmZlcgorICogQHBhcmFtIGxlbjIgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIGluIHNlY29uZCBidWZmZXIKKyAqIEByZXR1cm5zIHRvdGFsIGJ5dGVzIHdyaXR0ZW4gZnJvbSBib3RoIGJ1ZmZlcnMsIG9yIC0xIG9uIGVycm9yCisgKi8KK2ludAorX2RidXNfd3JpdGVfdHdvIChpbnQgICAgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyMSwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQxLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4xLAorICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIyLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydDIsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbjIpCit7CisgIF9kYnVzX2Fzc2VydCAoYnVmZmVyMSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydDEgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQyID49IDApOworICBfZGJ1c19hc3NlcnQgKGxlbjEgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobGVuMiA+PSAwKTsKKworI2lmZGVmIEhBVkVfV1JJVEVWCisgIHsKKyAgICBzdHJ1Y3QgaW92ZWMgdmVjdG9yc1syXTsKKyAgICBjb25zdCBjaGFyICpkYXRhMTsKKyAgICBjb25zdCBjaGFyICpkYXRhMjsKKyAgICBpbnQgYnl0ZXNfd3JpdHRlbjsKKworICAgIGRhdGExID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAoYnVmZmVyMSwgc3RhcnQxLCBsZW4xKTsKKworICAgIGlmIChidWZmZXIyICE9IE5VTEwpCisgICAgICBkYXRhMiA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKGJ1ZmZlcjIsIHN0YXJ0MiwgbGVuMik7CisgICAgZWxzZQorICAgICAgeworICAgICAgICBkYXRhMiA9IE5VTEw7CisgICAgICAgIHN0YXJ0MiA9IDA7CisgICAgICAgIGxlbjIgPSAwOworICAgICAgfQorCisgICAgdmVjdG9yc1swXS5pb3ZfYmFzZSA9IChjaGFyKikgZGF0YTE7CisgICAgdmVjdG9yc1swXS5pb3ZfbGVuID0gbGVuMTsKKyAgICB2ZWN0b3JzWzFdLmlvdl9iYXNlID0gKGNoYXIqKSBkYXRhMjsKKyAgICB2ZWN0b3JzWzFdLmlvdl9sZW4gPSBsZW4yOworCisgIGFnYWluOgorCisgICAgYnl0ZXNfd3JpdHRlbiA9IHdyaXRldiAoZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhMiA/IDIgOiAxKTsKKworICAgIGlmIChieXRlc193cml0dGVuIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKKyAgICAgIGdvdG8gYWdhaW47CisKKyAgICByZXR1cm4gYnl0ZXNfd3JpdHRlbjsKKyAgfQorI2Vsc2UgLyogSEFWRV9XUklURVYgKi8KKyAgeworICAgIGludCByZXQxOworCisgICAgcmV0MSA9IF9kYnVzX3dyaXRlIChmZCwgYnVmZmVyMSwgc3RhcnQxLCBsZW4xKTsKKyAgICBpZiAocmV0MSA9PSBsZW4xICYmIGJ1ZmZlcjIgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgcmV0MiA9IF9kYnVzX3dyaXRlIChmZCwgYnVmZmVyMiwgc3RhcnQyLCBsZW4yKTsKKyAgICAgICAgaWYgKHJldDIgPCAwKQorICAgICAgICAgIHJldDIgPSAwOyAvKiB3ZSBjYW4ndCByZXBvcnQgYW4gZXJyb3IgYXMgdGhlIGZpcnN0IHdyaXRlIHdhcyBPSyAqLworCisgICAgICAgIHJldHVybiByZXQxICsgcmV0MjsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICByZXR1cm4gcmV0MTsKKyAgfQorI2VuZGlmIC8qICFIQVZFX1dSSVRFViAqLworfQorCisjZGVmaW5lIF9EQlVTX01BWF9TVU5fUEFUSF9MRU5HVEggOTkKKworLyoqCisgKiBAZGVmIF9EQlVTX01BWF9TVU5fUEFUSF9MRU5HVEgKKyAqCisgKiBNYXhpbXVtIGxlbmd0aCBvZiB0aGUgcGF0aCB0byBhIFVOSVggZG9tYWluIHNvY2tldCwKKyAqIHNvY2thZGRyX3VuOjpzdW5fcGF0aCBtZW1iZXIuIFBPU0lYIHJlcXVpcmVzIHRoYXQgYWxsIHN5c3RlbXMKKyAqIHN1cHBvcnQgYXQgbGVhc3QgMTAwIGJ5dGVzIGhlcmUsIGluY2x1ZGluZyB0aGUgbnVsIHRlcm1pbmF0aW9uLgorICogV2UgdXNlIDk5IGZvciB0aGUgbWF4IHZhbHVlIHRvIGFsbG93IGZvciB0aGUgbnVsLgorICoKKyAqIFdlIGNvdWxkIHByb2JhYmx5IGFsc28gZG8gc2l6ZW9mIChhZGRyLnN1bl9wYXRoKQorICogYnV0IHRoaXMgd2F5IHdlIGFyZSB0aGUgc2FtZSBvbiBhbGwgcGxhdGZvcm1zCisgKiB3aGljaCBpcyBwcm9iYWJseSBhIGdvb2QgaWRlYS4KKyAqLworCisvKioKKyAqIENyZWF0ZXMgYSBzb2NrZXQgYW5kIGNvbm5lY3RzIGl0IHRvIHRoZSBVTklYIGRvbWFpbiBzb2NrZXQgYXQgdGhlCisgKiBnaXZlbiBwYXRoLiAgVGhlIGNvbm5lY3Rpb24gZmQgaXMgcmV0dXJuZWQsIGFuZCBpcyBzZXQgdXAgYXMKKyAqIG5vbmJsb2NraW5nLgorICoKKyAqIFVzZXMgYWJzdHJhY3Qgc29ja2V0cyBpbnN0ZWFkIG9mIGZpbGVzeXN0ZW0tbGlua2VkIHNvY2tldHMgaWYKKyAqIHJlcXVlc3RlZCAoaXQncyBwb3NzaWJsZSBvbmx5IG9uIExpbnV4OyBzZWUgIm1hbiA3IHVuaXgiIG9uIExpbnV4KS4KKyAqIE9uIG5vbi1MaW51eCBhYnN0cmFjdCBzb2NrZXQgdXNhZ2UgYWx3YXlzIGZhaWxzLgorICoKKyAqIFRoaXMgd2lsbCBzZXQgRkRfQ0xPRVhFQyBmb3IgdGhlIHNvY2tldCByZXR1cm5lZC4KKyAqCisgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byBVTklYIGRvbWFpbiBzb2NrZXQKKyAqIEBwYXJhbSBhYnN0cmFjdCAjVFJVRSB0byB1c2UgYWJzdHJhY3QgbmFtZXNwYWNlCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvciBjb2RlCisgKiBAcmV0dXJucyBjb25uZWN0aW9uIGZpbGUgZGVzY3JpcHRvciBvciAtMSBvbiBlcnJvcgorICovCitpbnQKK19kYnVzX2Nvbm5lY3RfdW5peF9zb2NrZXQgKGNvbnN0IGNoYXIgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgIGFic3RyYWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBpbnQgZmQ7CisgIHNpemVfdCBwYXRoX2xlbjsKKyAgc3RydWN0IHNvY2thZGRyX3VuIGFkZHI7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3RpbmcgdG8gdW5peCBzb2NrZXQgJXMgYWJzdHJhY3Q9JWRcbiIsCisgICAgICAgICAgICAgICAgIHBhdGgsIGFic3RyYWN0KTsKKworCisgIGlmICghX2RidXNfb3Blbl91bml4X3NvY2tldCAoJmZkLCBlcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIoZXJyb3IpOworCisgIF9EQlVTX1pFUk8gKGFkZHIpOworICBhZGRyLnN1bl9mYW1pbHkgPSBBRl9VTklYOworICBwYXRoX2xlbiA9IHN0cmxlbiAocGF0aCk7CisKKyAgaWYgKGFic3RyYWN0KQorICAgIHsKKyNpZmRlZiBIQVZFX0FCU1RSQUNUX1NPQ0tFVFMKKyAgICAgIGFkZHIuc3VuX3BhdGhbMF0gPSAnXDAnOyAvKiB0aGlzIGlzIHdoYXQgc2F5cyAidXNlIGFic3RyYWN0IiAqLworICAgICAgcGF0aF9sZW4rKzsgLyogQWNjb3VudCBmb3IgdGhlIGV4dHJhIG51bCBieXRlIGFkZGVkIHRvIHRoZSBzdGFydCBvZiBzdW5fcGF0aCAqLworCisgICAgICBpZiAocGF0aF9sZW4gPiBfREJVU19NQVhfU1VOX1BBVEhfTEVOR1RIKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0JBRF9BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAgICJBYnN0cmFjdCBzb2NrZXQgbmFtZSB0b28gbG9uZ1xuIik7CisgICAgICAgICAgX2RidXNfY2xvc2UgKGZkLCBOVUxMKTsKKyAgICAgICAgICByZXR1cm4gLTE7CisJfQorCisgICAgICBzdHJuY3B5ICgmYWRkci5zdW5fcGF0aFsxXSwgcGF0aCwgcGF0aF9sZW4pOworICAgICAgLyogX2RidXNfdmVyYm9zZV9ieXRlcyAoYWRkci5zdW5fcGF0aCwgc2l6ZW9mIChhZGRyLnN1bl9wYXRoKSk7ICovCisjZWxzZSAvKiBIQVZFX0FCU1RSQUNUX1NPQ0tFVFMgKi8KKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgICAgICAgICJPcGVyYXRpbmcgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgYWJzdHJhY3Qgc29ja2V0IG5hbWVzcGFjZVxuIik7CisgICAgICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworICAgICAgcmV0dXJuIC0xOworI2VuZGlmIC8qICEgSEFWRV9BQlNUUkFDVF9TT0NLRVRTICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKHBhdGhfbGVuID4gX0RCVVNfTUFYX1NVTl9QQVRIX0xFTkdUSCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAiU29ja2V0IG5hbWUgdG9vIGxvbmdcbiIpOworICAgICAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgICAgICAgcmV0dXJuIC0xOworCX0KKworICAgICAgc3RybmNweSAoYWRkci5zdW5fcGF0aCwgcGF0aCwgcGF0aF9sZW4pOworICAgIH0KKworICBpZiAoY29ubmVjdCAoZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSAmYWRkciwgX0RCVVNfU1RSVUNUX09GRlNFVCAoc3RydWN0IHNvY2thZGRyX3VuLCBzdW5fcGF0aCkgKyBwYXRoX2xlbikgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjb25uZWN0IHRvIHNvY2tldCAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworCisgICAgICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAoIV9kYnVzX3NldF9mZF9ub25ibG9ja2luZyAoZmQsIGVycm9yKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisKKyAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiBmZDsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgVU5JWCBkb21haW4gc29ja2V0IGFuZCBjb25uZWN0cyBpdCB0byB0aGUgc3BlY2lmaWVkCisgKiBwcm9jZXNzIHRvIGV4ZWN1dGUuCisgKgorICogVGhpcyB3aWxsIHNldCBGRF9DTE9FWEVDIGZvciB0aGUgc29ja2V0IHJldHVybmVkLgorICoKKyAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIHRoZSBleGVjdXRhYmxlCisgKiBAcGFyYW0gYXJndiB0aGUgYXJndW1lbnQgbGlzdCBmb3IgdGhlIHByb2Nlc3MgdG8gZXhlY3V0ZS4KKyAqIGFyZ3ZbMF0gdHlwaWNhbGx5IGlzIGlkZW50aWNhbCB0byB0aGUgcGF0aCBvZiB0aGUgZXhlY3V0YWJsZQorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3IgY29kZQorICogQHJldHVybnMgY29ubmVjdGlvbiBmaWxlIGRlc2NyaXB0b3Igb3IgLTEgb24gZXJyb3IKKyAqLworaW50CitfZGJ1c19jb25uZWN0X2V4ZWMgKGNvbnN0IGNoYXIgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICBjaGFyICpjb25zdCAgICBhcmd2W10sCisgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgaW50IGZkc1syXTsKKyAgcGlkX3QgcGlkOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW5nIHRvIHByb2Nlc3MgJXNcbiIsIHBhdGgpOworCisgIGlmIChzb2NrZXRwYWlyIChBRl9VTklYLCBTT0NLX1NUUkVBTQorI2lmZGVmIFNPQ0tfQ0xPRVhFQworICAgICAgICAgICAgICAgICAgfFNPQ0tfQ0xPRVhFQworI2VuZGlmCisgICAgICAgICAgICAgICAgICAsIDAsIGZkcykgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgc29ja2V0IHBhaXI6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMgKGZkc1swXSk7CisgIF9kYnVzX2ZkX3NldF9jbG9zZV9vbl9leGVjIChmZHNbMV0pOworCisgIHBpZCA9IGZvcmsgKCk7CisgIGlmIChwaWQgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBmb3JrKCkgdG8gY2FsbCAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgY2xvc2UgKGZkc1swXSk7CisgICAgICBjbG9zZSAoZmRzWzFdKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgaWYgKHBpZCA9PSAwKQorICAgIHsKKyAgICAgIC8qIGNoaWxkICovCisgICAgICBjbG9zZSAoZmRzWzBdKTsKKworICAgICAgZHVwMiAoZmRzWzFdLCBTVERJTl9GSUxFTk8pOworICAgICAgZHVwMiAoZmRzWzFdLCBTVERPVVRfRklMRU5PKTsKKworICAgICAgaWYgKGZkc1sxXSAhPSBTVERJTl9GSUxFTk8gJiYKKyAgICAgICAgICBmZHNbMV0gIT0gU1RET1VUX0ZJTEVOTykKKyAgICAgICAgY2xvc2UgKGZkc1sxXSk7CisKKyAgICAgIC8qIEluaGVyaXQgU1RERVJSIGFuZCB0aGUgY29udHJvbGxpbmcgdGVybWluYWwgZnJvbSB0aGUKKyAgICAgICAgIHBhcmVudCAqLworCisgICAgICBfZGJ1c19jbG9zZV9hbGwgKCk7CisKKyAgICAgIGV4ZWN2cCAocGF0aCwgYXJndik7CisKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkZhaWxlZCB0byBleGVjdXRlIHByb2Nlc3MgJXM6ICVzXG4iLCBwYXRoLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKworICAgICAgX2V4aXQoMSk7CisgICAgfQorCisgIC8qIHBhcmVudCAqLworICBjbG9zZSAoZmRzWzFdKTsKKworICBpZiAoIV9kYnVzX3NldF9mZF9ub25ibG9ja2luZyAoZmRzWzBdLCBlcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworCisgICAgICBjbG9zZSAoZmRzWzBdKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgcmV0dXJuIGZkc1swXTsKK30KKworLyoqCisgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSByZWNlcHRpb24gb2YgY3JlZGVudGlhbHMgb24gdGhlIGdpdmVuIHNvY2tldCBkdXJpbmcKKyAqIHRoZSBuZXh0IG1lc3NhZ2UgdHJhbnNtaXNzaW9uLiAgVGhpcyBpcyBvbmx5IGVmZmVjdGl2ZSBpZiB0aGUgI0xPQ0FMX0NSRURTCisgKiBzeXN0ZW0gZmVhdHVyZSBleGlzdHMsIGluIHdoaWNoIGNhc2UgdGhlIG90aGVyIHNpZGUgb2YgdGhlIGNvbm5lY3Rpb24gZG9lcworICogbm90IGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbCB0byBzZW5kIHRoZSBjcmVkZW50aWFscy4KKyAqCisgKiBAcGFyYW0gZmQgc29ja2V0IG9uIHdoaWNoIHRvIGNoYW5nZSB0aGUgI0xPQ0FMX0NSRURTIGZsYWcuCisgKiBAcGFyYW0gb24gd2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgI0xPQ0FMX0NSRURTIGZsYWcuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfc2V0X2xvY2FsX2NyZWRzIChpbnQgZmQsIGRidXNfYm9vbF90IG9uKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWwgPSBUUlVFOworCisjaWYgZGVmaW5lZChIQVZFX0NNU0dDUkVEKQorICAvKiBOT09QIGp1c3QgdG8gbWFrZSBzdXJlIG9ubHkgb25lIGNvZGVwYXRoIGlzIHVzZWQKKyAgICogICAgICBhbmQgdG8gcHJlZmVyIENNU0dDUkVECisgICAqLworI2VsaWYgZGVmaW5lZChMT0NBTF9DUkVEUykKKyAgaW50IHZhbCA9IG9uID8gMSA6IDA7CisgIGlmIChzZXRzb2Nrb3B0IChmZCwgMCwgTE9DQUxfQ1JFRFMsICZ2YWwsIHNpemVvZiAodmFsKSkgPCAwKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJVbmFibGUgdG8gc2V0IExPQ0FMX0NSRURTIHNvY2tldCBvcHRpb24gb24gZmQgJWRcbiIsIGZkKTsKKyAgICAgIHJldHZhbCA9IEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIF9kYnVzX3ZlcmJvc2UgKCJMT0NBTF9DUkVEUyAlcyBmb3IgZnVydGhlciBtZXNzYWdlcyBvbiBmZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBvbiA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIsIGZkKTsKKyNlbmRpZgorCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIHNvY2tldCBhbmQgYmluZHMgaXQgdG8gdGhlIGdpdmVuIHBhdGgsCisgKiB0aGVuIGxpc3RlbnMgb24gdGhlIHNvY2tldC4gVGhlIHNvY2tldCBpcworICogc2V0IHRvIGJlIG5vbmJsb2NraW5nLgorICoKKyAqIFVzZXMgYWJzdHJhY3Qgc29ja2V0cyBpbnN0ZWFkIG9mIGZpbGVzeXN0ZW0tbGlua2VkCisgKiBzb2NrZXRzIGlmIHJlcXVlc3RlZCAoaXQncyBwb3NzaWJsZSBvbmx5IG9uIExpbnV4OworICogc2VlICJtYW4gNyB1bml4IiBvbiBMaW51eCkuCisgKiBPbiBub24tTGludXggYWJzdHJhY3Qgc29ja2V0IHVzYWdlIGFsd2F5cyBmYWlscy4KKyAqCisgKiBUaGlzIHdpbGwgc2V0IEZEX0NMT0VYRUMgZm9yIHRoZSBzb2NrZXQgcmV0dXJuZWQKKyAqCisgKiBAcGFyYW0gcGF0aCB0aGUgc29ja2V0IG5hbWUKKyAqIEBwYXJhbSBhYnN0cmFjdCAjVFJVRSB0byB1c2UgYWJzdHJhY3QgbmFtZXNwYWNlCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvcnMKKyAqIEByZXR1cm5zIHRoZSBsaXN0ZW5pbmcgZmlsZSBkZXNjcmlwdG9yIG9yIC0xIG9uIGVycm9yCisgKi8KK2ludAorX2RidXNfbGlzdGVuX3VuaXhfc29ja2V0IChjb25zdCBjaGFyICAgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgIGFic3RyYWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIGludCBsaXN0ZW5fZmQ7CisgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyOworICBzaXplX3QgcGF0aF9sZW47CisgIHVuc2lnbmVkIGludCByZXVzZWFkZHI7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgX2RidXNfdmVyYm9zZSAoImxpc3RlbmluZyBvbiB1bml4IHNvY2tldCAlcyBhYnN0cmFjdD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgcGF0aCwgYWJzdHJhY3QpOworI2lmZGVmIEFORFJPSURfTUFOQUdFRF9TT0NLRVQKKyAgaWYgKHN0cm5jbXAgKHBhdGgsIEFORFJPSURfU09DS0VUX0RJUiIvIiwgc3RybGVuKEFORFJPSURfU09DS0VUX0RJUiIvIikpID09IDApCisgICAgeworICAgICAgY29uc3QgY2hhciogc3VmZml4OworICAgICAgLyogaW5pdCBoYXMgY3JlYXRlZCBhIHNvY2tldCBmb3IgdXMsIHBpY2sgaXQgdXAgZnJvbSBlbnZpcm9uICovCisgICAgICBzdWZmaXggPSAmcGF0aFtzdHJsZW4gKEFORFJPSURfU09DS0VUX0RJUiIvIildOworICAgICAgbGlzdGVuX2ZkID0gYW5kcm9pZF9nZXRfY29udHJvbF9zb2NrZXQgKHN1ZmZpeCk7CisgICAgICBpZiAobGlzdGVuX2ZkID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICAgICAiQ291bGQgbm90IG9idGFpbiBmZCBmb3IgYW5kcm9pZCBzb2NrZXQgJXNcbiIsIHN1ZmZpeCk7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJPYnRhaW5lZCBmZCBmb3IgYW5kcm9pZCBzb2NrZXQgJXNcbiIsIHN1ZmZpeCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICJOb3QgYW4gYW5kcm9pZCBzb2NrZXQ6ICVzXG4iLCBwYXRoKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisjZWxzZQorCisgIGlmICghX2RidXNfb3Blbl91bml4X3NvY2tldCAoJmxpc3Rlbl9mZCwgZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQoZXJyb3IpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSKGVycm9yKTsKKworICBfREJVU19aRVJPIChhZGRyKTsKKyAgYWRkci5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKyAgcGF0aF9sZW4gPSBzdHJsZW4gKHBhdGgpOworCisgIGlmIChhYnN0cmFjdCkKKyAgICB7CisjaWZkZWYgSEFWRV9BQlNUUkFDVF9TT0NLRVRTCisgICAgICAvKiByZW1lbWJlciB0aGF0IGFic3RyYWN0IG5hbWVzIGFyZW4ndCBudWwtdGVybWluYXRlZCBzbyB3ZSByZWx5CisgICAgICAgKiBvbiBzdW5fcGF0aCBiZWluZyBmaWxsZWQgaW4gd2l0aCB6ZXJvZXMgYWJvdmUuCisgICAgICAgKi8KKyAgICAgIGFkZHIuc3VuX3BhdGhbMF0gPSAnXDAnOyAvKiB0aGlzIGlzIHdoYXQgc2F5cyAidXNlIGFic3RyYWN0IiAqLworICAgICAgcGF0aF9sZW4rKzsgLyogQWNjb3VudCBmb3IgdGhlIGV4dHJhIG51bCBieXRlIGFkZGVkIHRvIHRoZSBzdGFydCBvZiBzdW5fcGF0aCAqLworCisgICAgICBpZiAocGF0aF9sZW4gPiBfREJVU19NQVhfU1VOX1BBVEhfTEVOR1RIKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0JBRF9BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAgICJBYnN0cmFjdCBzb2NrZXQgbmFtZSB0b28gbG9uZ1xuIik7CisgICAgICAgICAgX2RidXNfY2xvc2UgKGxpc3Rlbl9mZCwgTlVMTCk7CisgICAgICAgICAgcmV0dXJuIC0xOworCX0KKworICAgICAgc3RybmNweSAoJmFkZHIuc3VuX3BhdGhbMV0sIHBhdGgsIHBhdGhfbGVuKTsKKyAgICAgIC8qIF9kYnVzX3ZlcmJvc2VfYnl0ZXMgKGFkZHIuc3VuX3BhdGgsIHNpemVvZiAoYWRkci5zdW5fcGF0aCkpOyAqLworI2Vsc2UgLyogSEFWRV9BQlNUUkFDVF9TT0NLRVRTICovCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiT3BlcmF0aW5nIHN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IGFic3RyYWN0IHNvY2tldCBuYW1lc3BhY2VcbiIpOworICAgICAgX2RidXNfY2xvc2UgKGxpc3Rlbl9mZCwgTlVMTCk7CisgICAgICByZXR1cm4gLTE7CisjZW5kaWYgLyogISBIQVZFX0FCU1RSQUNUX1NPQ0tFVFMgKi8KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBEaXNjdXNzZWQgc2VjdXJpdHkgaW1wbGljYXRpb25zIG9mIHRoaXMgd2l0aCBOYWxpbiwKKyAgICAgICAqIGFuZCB3ZSBjb3VsZG4ndCB0aGluayBvZiB3aGVyZSBpdCB3b3VsZCBraWNrIG91ciBhc3MsIGJ1dAorICAgICAgICogaXQgc3RpbGwgc2VlbXMgYSBiaXQgc3Vja3kuIEl0IGFsc28gaGFzIG5vbi1zZWN1cml0eSBzdWNrYWdlOworICAgICAgICogcmVhbGx5IHdlJ2QgcHJlZmVyIHRvIGV4aXQgaWYgdGhlIHNvY2tldCBpcyBhbHJlYWR5IGluIHVzZS4KKyAgICAgICAqIEJ1dCB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSBnb29kIHdheSB0byBkbyB0aGlzLgorICAgICAgICoKKyAgICAgICAqIEp1c3QgdG8gYmUgZXh0cmEgY2FyZWZ1bCwgSSB0aHJldyBpbiB0aGUgc3RhdCgpIC0gY2xlYXJseQorICAgICAgICogdGhlIHN0YXQoKSBjYW4ndCAqZml4KiBhbnkgc2VjdXJpdHkgaXNzdWUsIGJ1dCBpdCBhdCBsZWFzdAorICAgICAgICogYXZvaWRzIGluYWR2ZXJ0ZW50L2FjY2lkZW50YWwgZGF0YSBsb3NzLgorICAgICAgICovCisgICAgICB7CisgICAgICAgIHN0cnVjdCBzdGF0IHNiOworCisgICAgICAgIGlmIChzdGF0IChwYXRoLCAmc2IpID09IDAgJiYKKyAgICAgICAgICAgIFNfSVNTT0NLIChzYi5zdF9tb2RlKSkKKyAgICAgICAgICB1bmxpbmsgKHBhdGgpOworICAgICAgfQorCisgICAgICBpZiAocGF0aF9sZW4gPiBfREJVU19NQVhfU1VOX1BBVEhfTEVOR1RIKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0JBRF9BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAgICJBYnN0cmFjdCBzb2NrZXQgbmFtZSB0b28gbG9uZ1xuIik7CisgICAgICAgICAgX2RidXNfY2xvc2UgKGxpc3Rlbl9mZCwgTlVMTCk7CisgICAgICAgICAgcmV0dXJuIC0xOworCX0KKworICAgICAgc3RybmNweSAoYWRkci5zdW5fcGF0aCwgcGF0aCwgcGF0aF9sZW4pOworICAgIH0KKworICByZXVzZWFkZHIgPSAxOworICBpZiAoc2V0c29ja29wdCAgKGxpc3Rlbl9mZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmcmV1c2VhZGRyLCBzaXplb2YocmV1c2VhZGRyKSk9PS0xKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gc2V0IHNvY2tldCBvcHRpb25cIiVzXCI6ICVzIiwKKyAgICAgICAgICAgICAgICAgIHBhdGgsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgIH0KKworICBpZiAoYmluZCAobGlzdGVuX2ZkLCAoc3RydWN0IHNvY2thZGRyKikgJmFkZHIsIF9EQlVTX1NUUlVDVF9PRkZTRVQgKHN0cnVjdCBzb2NrYWRkcl91biwgc3VuX3BhdGgpICsgcGF0aF9sZW4pIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGJpbmQgc29ja2V0IFwiJXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgX2RidXNfY2xvc2UgKGxpc3Rlbl9mZCwgTlVMTCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisjZW5kaWYgIC8qIGFuZHJvaWQgaW5pdCBtYW5hZ2VkIHNvY2tldHMgKi8KKworICBpZiAobGlzdGVuIChsaXN0ZW5fZmQsIDMwIC8qIGJhY2tsb2cgKi8pIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGxpc3RlbiBvbiBzb2NrZXQgXCIlc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBfZGJ1c19jbG9zZSAobGlzdGVuX2ZkLCBOVUxMKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zZXRfbG9jYWxfY3JlZHMgKGxpc3Rlbl9mZCwgVFJVRSkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBlbmFibGUgTE9DQUxfQ1JFRFMgb24gc29ja2V0IFwiJXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgY2xvc2UgKGxpc3Rlbl9mZCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGlmICghX2RidXNfc2V0X2ZkX25vbmJsb2NraW5nIChsaXN0ZW5fZmQsIGVycm9yKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBfZGJ1c19jbG9zZSAobGlzdGVuX2ZkLCBOVUxMKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyNpZm5kZWYgQU5EUk9JRF9NQU5BR0VEX1NPQ0tFVAorICAvKiBUcnkgb3BlbmluZyB1cCB0aGUgcGVybWlzc2lvbnMsIGJ1dCBpZiB3ZSBjYW4ndCwganVzdCBnbyBhaGVhZAorICAgKiBhbmQgY29udGludWUsIG1heWJlIGl0IHdpbGwgYmUgZ29vZCBlbm91Z2guCisgICAqLworICBpZiAoIWFic3RyYWN0ICYmIGNobW9kIChwYXRoLCAwNzc3KSA8IDApCisgICAgX2RidXNfd2FybiAoIkNvdWxkIG5vdCBzZXQgbW9kZSAwNzc3IG9uIHNvY2tldCAlc1xuIiwKKyAgICAgICAgICAgICAgICBwYXRoKTsKKyNlbmRpZgorICAKKyAgcmV0dXJuIGxpc3Rlbl9mZDsKK30KKworLyoqCisgKiBBY3F1aXJlcyBvbmUgb3IgbW9yZSBzb2NrZXRzIHBhc3NlZCBpbiBmcm9tIHN5c3RlbWQuIFRoZSBzb2NrZXRzCisgKiBhcmUgc2V0IHRvIGJlIG5vbmJsb2NraW5nLgorICoKKyAqIFRoaXMgd2lsbCBzZXQgRkRfQ0xPRVhFQyBmb3IgdGhlIHNvY2tldHMgcmV0dXJuZWQuCisgKgorICogQG9hcmFtIGZkcyB0aGUgZmlsZSBkZXNjcmlwdG9ycworICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3JzCisgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMKKyAqLworaW50CitfZGJ1c19saXN0ZW5fc3lzdGVtZF9zb2NrZXRzIChpbnQgICAgICAgKipmZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICBpbnQgciwgbjsKKyAgdW5zaWduZWQgZmQ7CisgIGludCAqbmV3X2ZkczsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBuID0gc2RfbGlzdGVuX2ZkcyAoVFJVRSk7CisgIGlmIChuIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKC1uKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFjcXVpcmUgc3lzdGVtZCBzb2NrZXQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoLW4pKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgaWYgKG4gPD0gMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQkFEX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICAgIk5vIHNvY2tldCByZWNlaXZlZC4iKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgZm9yIChmZCA9IFNEX0xJU1RFTl9GRFNfU1RBUlQ7IGZkIDwgU0RfTElTVEVOX0ZEU19TVEFSVCArIG47IGZkICsrKQorICAgIHsKKyAgICAgIHIgPSBzZF9pc19zb2NrZXQgKGZkLCBBRl9VTlNQRUMsIFNPQ0tfU1RSRUFNLCAxKTsKKyAgICAgIGlmIChyIDwgMCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoLXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHZlcmlmeSBzeXN0ZW1kIHNvY2tldCB0eXBlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yICgtcikpOworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIXIpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQkFEX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJQYXNzZWQgc29ja2V0IGhhcyB3cm9uZyB0eXBlLiIpOworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBPSywgdGhlIGZpbGUgZGVzY3JpcHRvcnMgYXJlIGFsbCBnb29kLCBzbyBsZXQncyB0YWtlIHBvc2Vzc2lvbiBvZgorICAgICB0aGVtIHRoZW4uICovCisKKyAgbmV3X2ZkcyA9IGRidXNfbmV3IChpbnQsIG4pOworICBpZiAoIW5ld19mZHMpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIGZpbGUgaGFuZGxlIGFycmF5LiIpOworICAgICAgZ290byBmYWlsOworICAgIH0KKworICBmb3IgKGZkID0gU0RfTElTVEVOX0ZEU19TVEFSVDsgZmQgPCBTRF9MSVNURU5fRkRTX1NUQVJUICsgbjsgZmQgKyspCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zZXRfbG9jYWxfY3JlZHMgKGZkLCBUUlVFKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGVuYWJsZSBMT0NBTF9DUkVEUyBvbiBzeXN0ZW1kIHNvY2tldDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19zZXRfZmRfbm9uYmxvY2tpbmcgKGZkLCBlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgIG5ld19mZHNbZmQgLSBTRF9MSVNURU5fRkRTX1NUQVJUXSA9IGZkOworICAgIH0KKworICAqZmRzID0gbmV3X2ZkczsKKyAgcmV0dXJuIG47CisKKyBmYWlsOgorCisgIGZvciAoZmQgPSBTRF9MSVNURU5fRkRTX1NUQVJUOyBmZCA8IFNEX0xJU1RFTl9GRFNfU1RBUlQgKyBuOyBmZCArKykKKyAgICB7CisgICAgICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworICAgIH0KKworICBkYnVzX2ZyZWUgKG5ld19mZHMpOworICByZXR1cm4gLTE7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIHNvY2tldCBhbmQgY29ubmVjdHMgdG8gYSBzb2NrZXQgYXQgdGhlIGdpdmVuIGhvc3QKKyAqIGFuZCBwb3J0LiBUaGUgY29ubmVjdGlvbiBmZCBpcyByZXR1cm5lZCwgYW5kIGlzIHNldCB1cCBhcworICogbm9uYmxvY2tpbmcuCisgKgorICogVGhpcyB3aWxsIHNldCBGRF9DTE9FWEVDIGZvciB0aGUgc29ja2V0IHJldHVybmVkCisgKgorICogQHBhcmFtIGhvc3QgdGhlIGhvc3QgbmFtZSB0byBjb25uZWN0IHRvCisgKiBAcGFyYW0gcG9ydCB0aGUgcG9ydCB0byBjb25uZWN0IHRvCisgKiBAcGFyYW0gZmFtaWx5IHRoZSBhZGRyZXNzIGZhbWlseSB0byBsaXN0ZW4gb24sIE5VTEwgZm9yIGFsbAorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3IgY29kZQorICogQHJldHVybnMgY29ubmVjdGlvbiBmaWxlIGRlc2NyaXB0b3Igb3IgLTEgb24gZXJyb3IKKyAqLworaW50CitfZGJ1c19jb25uZWN0X3RjcF9zb2NrZXQgKGNvbnN0IGNoYXIgICAgICpob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICAgIHJldHVybiBfZGJ1c19jb25uZWN0X3RjcF9zb2NrZXRfd2l0aF9ub25jZSAoaG9zdCwgcG9ydCwgZmFtaWx5LCAoY29uc3QgY2hhciopTlVMTCwgZXJyb3IpOworfQorCitpbnQKK19kYnVzX2Nvbm5lY3RfdGNwX3NvY2tldF93aXRoX25vbmNlIChjb25zdCBjaGFyICAgICAqaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpub25jZWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBpbnQgc2F2ZWRfZXJybm8gPSAwOworICBpbnQgZmQgPSAtMSwgcmVzOworICBzdHJ1Y3QgYWRkcmluZm8gaGludHM7CisgIHN0cnVjdCBhZGRyaW5mbyAqYWksICp0bXA7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSKGVycm9yKTsKKworICBfREJVU19aRVJPIChoaW50cyk7CisKKyAgaWYgKCFmYW1pbHkpCisgICAgaGludHMuYWlfZmFtaWx5ID0gQUZfVU5TUEVDOworICBlbHNlIGlmICghc3RyY21wKGZhbWlseSwgImlwdjQiKSkKKyAgICBoaW50cy5haV9mYW1pbHkgPSBBRl9JTkVUOworICBlbHNlIGlmICghc3RyY21wKGZhbWlseSwgImlwdjYiKSkKKyAgICBoaW50cy5haV9mYW1pbHkgPSBBRl9JTkVUNjsKKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX0JBRF9BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIGFkZHJlc3MgZmFtaWx5ICVzIiwgZmFtaWx5KTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIGhpbnRzLmFpX3Byb3RvY29sID0gSVBQUk9UT19UQ1A7CisgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgIGhpbnRzLmFpX2ZsYWdzID0gQUlfQUREUkNPTkZJRzsKKworICBpZiAoKHJlcyA9IGdldGFkZHJpbmZvKGhvc3QsIHBvcnQsICZoaW50cywgJmFpKSkgIT0gMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gbG9va3VwIGhvc3QvcG9ydDogXCIlczolc1wiOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICBob3N0LCBwb3J0LCBnYWlfc3RyZXJyb3IocmVzKSwgcmVzKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgdG1wID0gYWk7CisgIHdoaWxlICh0bXApCisgICAgeworICAgICAgaWYgKCFfZGJ1c19vcGVuX3NvY2tldCAoJmZkLCB0bXAtPmFpX2ZhbWlseSwgU09DS19TVFJFQU0sIDAsIGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIGZyZWVhZGRyaW5mbyhhaSk7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIoZXJyb3IpOworCisgICAgICBpZiAoY29ubmVjdCAoZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSB0bXAtPmFpX2FkZHIsIHRtcC0+YWlfYWRkcmxlbikgPCAwKQorICAgICAgICB7CisgICAgICAgICAgc2F2ZWRfZXJybm8gPSBlcnJubzsKKyAgICAgICAgICBfZGJ1c19jbG9zZShmZCwgTlVMTCk7CisgICAgICAgICAgZmQgPSAtMTsKKyAgICAgICAgICB0bXAgPSB0bXAtPmFpX25leHQ7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgYnJlYWs7CisgICAgfQorICBmcmVlYWRkcmluZm8oYWkpOworCisgIGlmIChmZCA9PSAtMSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoc2F2ZWRfZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY29ubmVjdCB0byBzb2NrZXQgXCIlczolc1wiICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBob3N0LCBwb3J0LCBfZGJ1c19zdHJlcnJvcihzYXZlZF9lcnJubykpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAobm9uY2VmaWxlICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c1N0cmluZyBub25jZWZpbGVTdHI7CisgICAgICBkYnVzX2Jvb2xfdCByZXQ7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJm5vbmNlZmlsZVN0ciwgbm9uY2VmaWxlKTsKKyAgICAgIHJldCA9IF9kYnVzX3NlbmRfbm9uY2UgKGZkLCAmbm9uY2VmaWxlU3RyLCBlcnJvcik7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJm5vbmNlZmlsZVN0cik7CisKKyAgICAgIGlmICghcmV0KQorICAgIHsKKyAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgIGlmICghX2RidXNfc2V0X2ZkX25vbmJsb2NraW5nIChmZCwgZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiBmZDsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgc29ja2V0IGFuZCBiaW5kcyBpdCB0byB0aGUgZ2l2ZW4gcGF0aCwgdGhlbiBsaXN0ZW5zIG9uCisgKiB0aGUgc29ja2V0LiBUaGUgc29ja2V0IGlzIHNldCB0byBiZSBub25ibG9ja2luZy4gIEluIGNhc2Ugb2YgcG9ydD0wCisgKiBhIHJhbmRvbSBmcmVlIHBvcnQgaXMgdXNlZCBhbmQgcmV0dXJuZWQgaW4gdGhlIHBvcnQgcGFyYW1ldGVyLgorICogSWYgaW5hZGRyX2FueSBpcyBzcGVjaWZpZWQsIHRoZSBob3N0bmFtZSBpcyBpZ25vcmVkLgorICoKKyAqIFRoaXMgd2lsbCBzZXQgRkRfQ0xPRVhFQyBmb3IgdGhlIHNvY2tldCByZXR1cm5lZAorICoKKyAqIEBwYXJhbSBob3N0IHRoZSBob3N0IG5hbWUgdG8gbGlzdGVuIG9uCisgKiBAcGFyYW0gcG9ydCB0aGUgcG9ydCB0byBsaXN0ZW4gb24sIGlmIHplcm8gYSBmcmVlIHBvcnQgd2lsbCBiZSB1c2VkCisgKiBAcGFyYW0gZmFtaWx5IHRoZSBhZGRyZXNzIGZhbWlseSB0byBsaXN0ZW4gb24sIE5VTEwgZm9yIGFsbAorICogQHBhcmFtIHJldHBvcnQgc3RyaW5nIHRvIHJldHVybiB0aGUgYWN0dWFsIHBvcnQgbGlzdGVuZWQgb24KKyAqIEBwYXJhbSBmZHNfcCBsb2NhdGlvbiB0byBzdG9yZSByZXR1cm5lZCBmaWxlIGRlc2NyaXB0b3JzCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvcnMKKyAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgbGlzdGVuaW5nIGZpbGUgZGVzY3JpcHRvcnMgb3IgLTEgb24gZXJyb3IKKyAqLworaW50CitfZGJ1c19saXN0ZW5fdGNwX3NvY2tldCAoY29uc3QgY2hhciAgICAgKmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAqcmV0cG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICoqZmRzX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBpbnQgc2F2ZWRfZXJybm87CisgIGludCBubGlzdGVuX2ZkID0gMCwgKmxpc3Rlbl9mZCA9IE5VTEwsIHJlcywgaTsKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzOworICBzdHJ1Y3QgYWRkcmluZm8gKmFpLCAqdG1wOworICB1bnNpZ25lZCBpbnQgcmV1c2VhZGRyOworCisgICpmZHNfcCA9IE5VTEw7CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIF9EQlVTX1pFUk8gKGhpbnRzKTsKKworICBpZiAoIWZhbWlseSkKKyAgICBoaW50cy5haV9mYW1pbHkgPSBBRl9VTlNQRUM7CisgIGVsc2UgaWYgKCFzdHJjbXAoZmFtaWx5LCAiaXB2NCIpKQorICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ7CisgIGVsc2UgaWYgKCFzdHJjbXAoZmFtaWx5LCAiaXB2NiIpKQorICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ2OworICBlbHNlCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfQkFEX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gYWRkcmVzcyBmYW1pbHkgJXMiLCBmYW1pbHkpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBoaW50cy5haV9wcm90b2NvbCA9IElQUFJPVE9fVENQOworICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworICBoaW50cy5haV9mbGFncyA9IEFJX0FERFJDT05GSUcgfCBBSV9QQVNTSVZFOworCisgcmVkb19sb29rdXBfd2l0aF9wb3J0OgorICBhaSA9IE5VTEw7CisgIGlmICgocmVzID0gZ2V0YWRkcmluZm8oaG9zdCwgcG9ydCwgJmhpbnRzLCAmYWkpKSAhPSAwIHx8ICFhaSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gbG9va3VwIGhvc3QvcG9ydDogXCIlczolc1wiOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICBob3N0ID8gaG9zdCA6ICIqIiwgcG9ydCwgZ2FpX3N0cmVycm9yKHJlcyksIHJlcyk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgdG1wID0gYWk7CisgIHdoaWxlICh0bXApCisgICAgeworICAgICAgaW50IGZkID0gLTEsICpuZXdsaXN0ZW5fZmQ7CisgICAgICBpZiAoIV9kYnVzX29wZW5fc29ja2V0ICgmZmQsIHRtcC0+YWlfZmFtaWx5LCBTT0NLX1NUUkVBTSwgMCwgZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcik7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcik7CisKKyAgICAgIHJldXNlYWRkciA9IDE7CisgICAgICBpZiAoc2V0c29ja29wdCAoZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJnJldXNlYWRkciwgc2l6ZW9mKHJldXNlYWRkcikpPT0tMSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gc2V0IHNvY2tldCBvcHRpb24gXCIlczolc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgaG9zdCA/IGhvc3QgOiAiKiIsIHBvcnQsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICB9CisKKyAgICAgIGlmIChiaW5kIChmZCwgKHN0cnVjdCBzb2NrYWRkciopIHRtcC0+YWlfYWRkciwgdG1wLT5haV9hZGRybGVuKSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBzYXZlZF9lcnJubyA9IGVycm5vOworICAgICAgICAgIF9kYnVzX2Nsb3NlKGZkLCBOVUxMKTsKKyAgICAgICAgICBpZiAoc2F2ZWRfZXJybm8gPT0gRUFERFJJTlVTRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogRGVwZW5kaW5nIG9uIGtlcm5lbCBwb2xpY3ksIGl0IG1heSBvciBtYXkgbm90CisgICAgICAgICAgICAgICAgIGJlIG5lY2Nlc3NhcnkgdG8gYmluZCB0byBib3RoIElQdjQgJiA2IGFkZHJlc3NlcworICAgICAgICAgICAgICAgICBzbyBpZ25vcmUgRUFERFJJTlVTRSBoZXJlICovCisgICAgICAgICAgICAgIHRtcCA9IHRtcC0+YWlfbmV4dDsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChzYXZlZF9lcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYmluZCBzb2NrZXQgXCIlczolc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QgPyBob3N0IDogIioiLCBwb3J0LCBfZGJ1c19zdHJlcnJvciAoc2F2ZWRfZXJybm8pKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisgICAgICBpZiAobGlzdGVuIChmZCwgMzAgLyogYmFja2xvZyAqLykgPCAwKQorICAgICAgICB7CisgICAgICAgICAgc2F2ZWRfZXJybm8gPSBlcnJubzsKKyAgICAgICAgICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoc2F2ZWRfZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGxpc3RlbiBvbiBzb2NrZXQgXCIlczolc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QgPyBob3N0IDogIioiLCBwb3J0LCBfZGJ1c19zdHJlcnJvciAoc2F2ZWRfZXJybm8pKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisgICAgICBuZXdsaXN0ZW5fZmQgPSBkYnVzX3JlYWxsb2MobGlzdGVuX2ZkLCBzaXplb2YoaW50KSoobmxpc3Rlbl9mZCsxKSk7CisgICAgICBpZiAoIW5ld2xpc3Rlbl9mZCkKKyAgICAgICAgeworICAgICAgICAgIHNhdmVkX2Vycm5vID0gZXJybm87CisgICAgICAgICAgX2RidXNfY2xvc2UgKGZkLCBOVUxMKTsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKHNhdmVkX2Vycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBmaWxlIGhhbmRsZSBhcnJheTogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoc2F2ZWRfZXJybm8pKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgICAgbGlzdGVuX2ZkID0gbmV3bGlzdGVuX2ZkOworICAgICAgbGlzdGVuX2ZkW25saXN0ZW5fZmRdID0gZmQ7CisgICAgICBubGlzdGVuX2ZkKys7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2dldF9sZW5ndGgocmV0cG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBJZiB0aGUgdXNlciBkaWRuJ3Qgc3BlY2lmeSBhIHBvcnQsIG9yIHVzZWQgMCwgdGhlbgorICAgICAgICAgICAgIHRoZSBrZXJuZWwgY2hvb3NlcyBhIHBvcnQuIEFmdGVyIHRoZSBmaXJzdCBhZGRyZXNzCisgICAgICAgICAgICAgaXMgYm91bmQgdG8sIHdlIG5lZWQgdG8gZm9yY2UgYWxsIHJlbWFpbmluZyBhZGRyZXNzZXMKKyAgICAgICAgICAgICB0byB1c2UgdGhlIHNhbWUgcG9ydCAqLworICAgICAgICAgIGlmICghcG9ydCB8fCAhc3RyY21wKHBvcnQsICIwIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGludCByZXN1bHQ7CisgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7CisgICAgICAgICAgICAgIHNvY2tsZW5fdCBhZGRybGVuOworICAgICAgICAgICAgICBjaGFyIHBvcnRidWZbNTBdOworCisgICAgICAgICAgICAgIGFkZHJsZW4gPSBzaXplb2YoYWRkcik7CisgICAgICAgICAgICAgIHJlc3VsdCA9IGdldHNvY2tuYW1lKGZkLCAoc3RydWN0IHNvY2thZGRyKikgJmFkZHIsICZhZGRybGVuKTsKKworICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IC0xIHx8CisgICAgICAgICAgICAgICAgICAocmVzID0gZ2V0bmFtZWluZm8gKChzdHJ1Y3Qgc29ja2FkZHIqKSZhZGRyLCBhZGRybGVuLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0YnVmLCBzaXplb2YocG9ydGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JX05VTUVSSUNIT1NUKSkgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlc29sdmUgcG9ydCBcIiVzOiVzXCI6ICVzICglcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QgPyBob3N0IDogIioiLCBwb3J0LCBnYWlfc3RyZXJyb3IocmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kKHJldHBvcnQsIHBvcnRidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8qIFJlbGVhc2UgY3VycmVudCBhZGRyZXNzIGxpc3QgJiByZWRvIGxvb2t1cCAqLworICAgICAgICAgICAgICBwb3J0ID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhKHJldHBvcnQpOworICAgICAgICAgICAgICBmcmVlYWRkcmluZm8oYWkpOworICAgICAgICAgICAgICBnb3RvIHJlZG9fbG9va3VwX3dpdGhfcG9ydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZChyZXRwb3J0LCBwb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgdG1wID0gdG1wLT5haV9uZXh0OworICAgIH0KKyAgZnJlZWFkZHJpbmZvKGFpKTsKKyAgYWkgPSBOVUxMOworCisgIGlmICghbmxpc3Rlbl9mZCkKKyAgICB7CisgICAgICBlcnJubyA9IEVBRERSSU5VU0U7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGJpbmQgc29ja2V0IFwiJXM6JXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGhvc3QgPyBob3N0IDogIioiLCBwb3J0LCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBmb3IgKGkgPSAwIDsgaSA8IG5saXN0ZW5fZmQgOyBpKyspCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zZXRfZmRfbm9uYmxvY2tpbmcgKGxpc3Rlbl9mZFtpXSwgZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgKmZkc19wID0gbGlzdGVuX2ZkOworCisgIHJldHVybiBubGlzdGVuX2ZkOworCisgZmFpbGVkOgorICBpZiAoYWkpCisgICAgZnJlZWFkZHJpbmZvKGFpKTsKKyAgZm9yIChpID0gMCA7IGkgPCBubGlzdGVuX2ZkIDsgaSsrKQorICAgIF9kYnVzX2Nsb3NlKGxpc3Rlbl9mZFtpXSwgTlVMTCk7CisgIGRidXNfZnJlZShsaXN0ZW5fZmQpOworICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAord3JpdGVfY3JlZGVudGlhbHNfYnl0ZSAoaW50ICAgICAgICAgICAgIHNlcnZlcl9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgaW50IGJ5dGVzX3dyaXR0ZW47CisgIGNoYXIgYnVmWzFdID0geyAnXDAnIH07CisjaWYgZGVmaW5lZChIQVZFX0NNU0dDUkVEKQorICB1bmlvbiB7CisJICBzdHJ1Y3QgY21zZ2hkciBoZHI7CisJICBjaGFyIGNyZWRbQ01TR19TUEFDRSAoc2l6ZW9mIChzdHJ1Y3QgY21zZ2NyZWQpKV07CisgIH0gY21zZzsKKyAgc3RydWN0IGlvdmVjIGlvdjsKKyAgc3RydWN0IG1zZ2hkciBtc2c7CisgIGlvdi5pb3ZfYmFzZSA9IGJ1ZjsKKyAgaW92Lmlvdl9sZW4gPSAxOworCisgIF9EQlVTX1pFUk8obXNnKTsKKyAgbXNnLm1zZ19pb3YgPSAmaW92OworICBtc2cubXNnX2lvdmxlbiA9IDE7CisKKyAgbXNnLm1zZ19jb250cm9sID0gKGNhZGRyX3QpICZjbXNnOworICBtc2cubXNnX2NvbnRyb2xsZW4gPSBDTVNHX1NQQUNFIChzaXplb2YgKHN0cnVjdCBjbXNnY3JlZCkpOworICBfREJVU19aRVJPKGNtc2cpOworICBjbXNnLmhkci5jbXNnX2xlbiA9IENNU0dfTEVOIChzaXplb2YgKHN0cnVjdCBjbXNnY3JlZCkpOworICBjbXNnLmhkci5jbXNnX2xldmVsID0gU09MX1NPQ0tFVDsKKyAgY21zZy5oZHIuY21zZ190eXBlID0gU0NNX0NSRURTOworI2VuZGlmCisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyBhZ2FpbjoKKworI2lmIGRlZmluZWQoSEFWRV9DTVNHQ1JFRCkKKyAgYnl0ZXNfd3JpdHRlbiA9IHNlbmRtc2cgKHNlcnZlcl9mZCwgJm1zZywgMAorI2lmIEhBVkVfREVDTF9NU0dfTk9TSUdOQUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHxNU0dfTk9TSUdOQUwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyNlbHNlCisgIGJ5dGVzX3dyaXR0ZW4gPSBzZW5kIChzZXJ2ZXJfZmQsIGJ1ZiwgMSwgMAorI2lmIEhBVkVfREVDTF9NU0dfTk9TSUdOQUwKKyAgICAgICAgICAgICAgICAgICAgICAgIHxNU0dfTk9TSUdOQUwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyNlbmRpZgorCisgIGlmIChieXRlc193cml0dGVuIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKKyAgICBnb3RvIGFnYWluOworCisgIGlmIChieXRlc193cml0dGVuIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHdyaXRlIGNyZWRlbnRpYWxzIGJ5dGU6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZSBpZiAoYnl0ZXNfd3JpdHRlbiA9PSAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JT19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAid3JvdGUgemVybyBieXRlcyB3cml0aW5nIGNyZWRlbnRpYWxzIGJ5dGUiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKGJ5dGVzX3dyaXR0ZW4gPT0gMSk7CisgICAgICBfZGJ1c192ZXJib3NlICgid3JvdGUgY3JlZGVudGlhbHMgYnl0ZVxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9Cit9CisKKy8qKgorICogUmVhZHMgYSBzaW5nbGUgYnl0ZSB3aGljaCBtdXN0IGJlIG51bCAoYW4gZXJyb3Igb2NjdXJzIG90aGVyd2lzZSksCisgKiBhbmQgcmVhZHMgdW5peCBjcmVkZW50aWFscyBpZiBhdmFpbGFibGUuIENsZWFycyB0aGUgY3JlZGVudGlhbHMKKyAqIG9iamVjdCwgdGhlbiBhZGRzIHBpZC91aWQgaWYgYXZhaWxhYmxlLCBzbyBhbnkgcHJldmlvdXMgY3JlZGVudGlhbHMKKyAqIHN0b3JlZCBpbiB0aGUgb2JqZWN0IGFyZSBsb3N0LgorICoKKyAqIFJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgd2hldGhlciBhIGJ5dGUgd2FzIHJlYWQsIG5vdCB3aGV0aGVyCisgKiB3ZSBnb3QgdmFsaWQgY3JlZGVudGlhbHMuIE9uIHNvbWUgc3lzdGVtcywgc3VjaCBhcyBMaW51eCwKKyAqIHJlYWRpbmcvd3JpdGluZyB0aGUgYnl0ZSBpc24ndCBhY3R1YWxseSByZXF1aXJlZCwgYnV0IHdlIGRvIGl0CisgKiBhbnl3YXkganVzdCB0byBhdm9pZCBtdWx0aXBsZSBjb2RlcGF0aHMuCisgKgorICogRmFpbHMgaWYgbm8gYnl0ZSBpcyBhdmFpbGFibGUsIHNvIHlvdSBtdXN0IHNlbGVjdCgpIGZpcnN0LgorICoKKyAqIFRoZSBwb2ludCBvZiB0aGUgYnl0ZSBpcyB0aGF0IG9uIHNvbWUgc3lzdGVtcyB3ZSBoYXZlIHRvCisgKiB1c2Ugc2VuZG1zZygpL3JlY3Ztc2coKSB0byB0cmFuc21pdCBjcmVkZW50aWFscy4KKyAqCisgKiBAcGFyYW0gY2xpZW50X2ZkIHRoZSBjbGllbnQgZmlsZSBkZXNjcmlwdG9yCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgb2JqZWN0IHRvIGFkZCBjbGllbnQgY3JlZGVudGlhbHMgdG8KKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSBlcnJvciBjb2RlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19yZWFkX2NyZWRlbnRpYWxzX3NvY2tldCAgKGludCAgICAgICAgICAgICAgY2xpZW50X2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgKmVycm9yKQoreworICBzdHJ1Y3QgbXNnaGRyIG1zZzsKKyAgc3RydWN0IGlvdmVjIGlvdjsKKyAgY2hhciBidWY7CisgIGRidXNfdWlkX3QgdWlkX3JlYWQ7CisgIGRidXNfcGlkX3QgcGlkX3JlYWQ7CisgIGludCBieXRlc19yZWFkOworCisjaWZkZWYgSEFWRV9DTVNHQ1JFRAorICB1bmlvbiB7CisgICAgc3RydWN0IGNtc2doZHIgaGRyOworICAgIGNoYXIgY3JlZFtDTVNHX1NQQUNFIChzaXplb2YgKHN0cnVjdCBjbXNnY3JlZCkpXTsKKyAgfSBjbXNnOworCisjZWxpZiBkZWZpbmVkKExPQ0FMX0NSRURTKQorICBzdHJ1Y3QgeworICAgIHN0cnVjdCBjbXNnaGRyIGhkcjsKKyAgICBzdHJ1Y3Qgc29ja2NyZWQgY3JlZDsKKyAgfSBjbXNnOworI2VuZGlmCisKKyAgdWlkX3JlYWQgPSBEQlVTX1VJRF9VTlNFVDsKKyAgcGlkX3JlYWQgPSBEQlVTX1BJRF9VTlNFVDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICAvKiBUaGUgUE9TSVggc3BlYyBjZXJ0YWlubHkgZG9lc24ndCBwcm9taXNlIHRoaXMsIGJ1dAorICAgKiB3ZSBuZWVkIHRoZXNlIGFzc2VydGlvbnMgdG8gZmFpbCBhcyBzb29uIGFzIHdlJ3JlIHdyb25nIGFib3V0CisgICAqIGl0IHNvIHdlIGNhbiBkbyB0aGUgcG9ydGluZyBmaXh1cHMKKyAgICovCisgIF9kYnVzX2Fzc2VydCAoc2l6ZW9mIChwaWRfdCkgPD0gc2l6ZW9mIChkYnVzX3BpZF90KSk7CisgIF9kYnVzX2Fzc2VydCAoc2l6ZW9mICh1aWRfdCkgPD0gc2l6ZW9mIChkYnVzX3VpZF90KSk7CisgIF9kYnVzX2Fzc2VydCAoc2l6ZW9mIChnaWRfdCkgPD0gc2l6ZW9mIChkYnVzX2dpZF90KSk7CisKKyAgX2RidXNfY3JlZGVudGlhbHNfY2xlYXIgKGNyZWRlbnRpYWxzKTsKKworICAvKiBTeXN0ZW1zIHN1cHBvcnRpbmcgTE9DQUxfQ1JFRFMgYXJlIGNvbmZpZ3VyZWQgdG8gaGF2ZSB0aGlzIGZlYXR1cmUKKyAgICogZW5hYmxlZCAoaWYgaXQgZG9lcyBub3QgY29uZmxpY3Qgd2l0aCBIQVZFX0NNU0dDUkVEKSBwcmlvciBhY2NlcHRpbmcKKyAgICogdGhlIGNvbm5lY3Rpb24uICBUaGVyZWZvcmUsIHRoZSByZWNlaXZlZCBtZXNzYWdlIG11c3QgY2FycnkgdGhlCisgICAqIGNyZWRlbnRpYWxzIGluZm9ybWF0aW9uIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcgc3BlY2lhbC4KKyAgICovCisKKyAgaW92Lmlvdl9iYXNlID0gJmJ1ZjsKKyAgaW92Lmlvdl9sZW4gPSAxOworCisgIF9EQlVTX1pFUk8obXNnKTsKKyAgbXNnLm1zZ19pb3YgPSAmaW92OworICBtc2cubXNnX2lvdmxlbiA9IDE7CisKKyNpZiBkZWZpbmVkKEhBVkVfQ01TR0NSRUQpIHx8IGRlZmluZWQoTE9DQUxfQ1JFRFMpCisgIF9EQlVTX1pFUk8oY21zZyk7CisgIG1zZy5tc2dfY29udHJvbCA9IChjYWRkcl90KSAmY21zZzsKKyAgbXNnLm1zZ19jb250cm9sbGVuID0gQ01TR19TUEFDRSAoc2l6ZW9mIChzdHJ1Y3QgY21zZ2NyZWQpKTsKKyNlbmRpZgorCisgYWdhaW46CisgIGJ5dGVzX3JlYWQgPSByZWN2bXNnIChjbGllbnRfZmQsICZtc2csIDApOworCisgIGlmIChieXRlc19yZWFkIDwgMCkKKyAgICB7CisgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpCisJZ290byBhZ2FpbjsKKworICAgICAgLyogRUFHQUlOIG9yIEVXT1VMREJMT0NLIHdvdWxkIGJlIHVuZXhwZWN0ZWQgaGVyZSBzaW5jZSB3ZSB3b3VsZAorICAgICAgICogbm9ybWFsbHkgb25seSBjYWxsIHJlYWRfY3JlZGVudGlhbHMgaWYgdGhlIHNvY2tldCB3YXMgcmVhZHkKKyAgICAgICAqIGZvciByZWFkaW5nCisgICAgICAgKi8KKworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZWFkIGNyZWRlbnRpYWxzIGJ5dGU6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UgaWYgKGJ5dGVzX3JlYWQgPT0gMCkKKyAgICB7CisgICAgICAvKiB0aGlzIHNob3VsZCBub3QgaGFwcGVuIHVubGVzcyB3ZSBhcmUgdXNpbmcgcmVjdm1zZyB3cm9uZywKKyAgICAgICAqIHNvIGlzIGVzc2VudGlhbGx5IGhlcmUgZm9yIHBhcmFub2lhCisgICAgICAgKi8KKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZWFkIGNyZWRlbnRpYWxzIGJ5dGUgKHplcm8tbGVuZ3RoIHJlYWQpIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlIGlmIChidWYgIT0gJ1wwJykKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJDcmVkZW50aWFscyBieXRlIHdhcyBub3QgbnVsIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisjaWYgZGVmaW5lZChIQVZFX0NNU0dDUkVEKSB8fCBkZWZpbmVkKExPQ0FMX0NSRURTKQorICBpZiAoY21zZy5oZHIuY21zZ19sZW4gPCBDTVNHX0xFTiAoc2l6ZW9mIChzdHJ1Y3QgY21zZ2NyZWQpKQorCQkgIHx8IGNtc2cuaGRyLmNtc2dfdHlwZSAhPSBTQ01fQ1JFRFMpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZSBmcm9tIHJlY3Ztc2coKSB3YXMgbm90IFNDTV9DUkVEUyIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyNlbmRpZgorCisgIF9kYnVzX3ZlcmJvc2UgKCJyZWFkIGNyZWRlbnRpYWxzIGJ5dGVcbiIpOworCisgIHsKKyNpZmRlZiBTT19QRUVSQ1JFRAorI2lmZGVmIF9fT3BlbkJTRF9fCisgICAgc3RydWN0IHNvY2twZWVyY3JlZCBjcjsKKyNlbHNlCisgICAgc3RydWN0IHVjcmVkIGNyOworI2VuZGlmCisgICAgaW50IGNyX2xlbiA9IHNpemVvZiAoY3IpOworCisgICAgaWYgKGdldHNvY2tvcHQgKGNsaWVudF9mZCwgU09MX1NPQ0tFVCwgU09fUEVFUkNSRUQsICZjciwgJmNyX2xlbikgPT0gMCAmJgorCWNyX2xlbiA9PSBzaXplb2YgKGNyKSkKKyAgICAgIHsKKwlwaWRfcmVhZCA9IGNyLnBpZDsKKwl1aWRfcmVhZCA9IGNyLnVpZDsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisJX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBnZXRzb2Nrb3B0KCkgY3JlZGVudGlhbHMsIHJldHVybmVkIGxlbiAlZC8lZDogJXNcbiIsCisJCSAgICAgICBjcl9sZW4sIChpbnQpIHNpemVvZiAoY3IpLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIH0KKyNlbGlmIGRlZmluZWQoSEFWRV9DTVNHQ1JFRCkKKyAgICBzdHJ1Y3QgY21zZ2NyZWQgKmNyZWQ7CisKKyAgICBjcmVkID0gKHN0cnVjdCBjbXNnY3JlZCAqKSBDTVNHX0RBVEEgKCZjbXNnLmhkcik7CisgICAgcGlkX3JlYWQgPSBjcmVkLT5jbWNyZWRfcGlkOworICAgIHVpZF9yZWFkID0gY3JlZC0+Y21jcmVkX2V1aWQ7CisjZWxpZiBkZWZpbmVkKExPQ0FMX0NSRURTKQorICAgIHBpZF9yZWFkID0gREJVU19QSURfVU5TRVQ7CisgICAgdWlkX3JlYWQgPSBjbXNnLmNyZWQuc2NfdWlkOworICAgIC8qIFNpbmNlIHdlIGhhdmUgYWxyZWFkeSBnb3QgdGhlIGNyZWRlbnRpYWxzIGZyb20gdGhpcyBzb2NrZXQsIHdlIGNhbgorICAgICAqIGRpc2FibGUgaXRzIExPQ0FMX0NSRURTIGZsYWcgaWYgaXQgd2FzIGV2ZXIgc2V0LiAqLworICAgIF9kYnVzX3NldF9sb2NhbF9jcmVkcyAoY2xpZW50X2ZkLCBGQUxTRSk7CisjZWxpZiBkZWZpbmVkKEhBVkVfR0VUUEVFUkVJRCkKKyAgICB1aWRfdCBldWlkOworICAgIGdpZF90IGVnaWQ7CisgICAgaWYgKGdldHBlZXJlaWQgKGNsaWVudF9mZCwgJmV1aWQsICZlZ2lkKSA9PSAwKQorICAgICAgeworICAgICAgICB1aWRfcmVhZCA9IGV1aWQ7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGdldHBlZXJlaWQoKSBjcmVkZW50aWFsczogJXNcbiIsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgfQorI2VsaWYgZGVmaW5lZChIQVZFX0dFVFBFRVJVQ1JFRCkKKyAgICB1Y3JlZF90ICogdWNyZWQgPSBOVUxMOworICAgIGlmIChnZXRwZWVydWNyZWQgKGNsaWVudF9mZCwgJnVjcmVkKSA9PSAwKQorICAgICAgeworICAgICAgICBwaWRfcmVhZCA9IHVjcmVkX2dldHBpZCAodWNyZWQpOworICAgICAgICB1aWRfcmVhZCA9IHVjcmVkX2dldGV1aWQgKHVjcmVkKTsKKyNpZmRlZiBIQVZFX0FEVAorICAgICAgICAvKiBnZW5lcmF0ZSBhdWRpdCBzZXNzaW9uIGRhdGEgYmFzZWQgb24gc29ja2V0IHVjcmVkICovCisgICAgICAgIGFkdF9zZXNzaW9uX2RhdGFfdCAqYWR0aCA9IE5VTEw7CisgICAgICAgIGFkdF9leHBvcnRfZGF0YV90ICpkYXRhID0gTlVMTDsKKyAgICAgICAgc2l6ZV90IHNpemUgPSAwOworICAgICAgICBpZiAoYWR0X3N0YXJ0X3Nlc3Npb24gKCZhZHRoLCBOVUxMLCAwKSB8fCAoYWR0aCA9PSBOVUxMKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGFkdF9zdGFydF9zZXNzaW9uKCk6ICVzXG4iLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoYWR0X3NldF9mcm9tX3VjcmVkIChhZHRoLCB1Y3JlZCwgQURUX05FVykpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGFkdF9zZXRfZnJvbV91Y3JlZCgpOiAlc1xuIiwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNpemUgPSBhZHRfZXhwb3J0X3Nlc3Npb25fZGF0YSAoYWR0aCwgJmRhdGEpOworICAgICAgICAgICAgICAgIGlmIChzaXplIDw9IDApCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gYWR0X2V4cG9ydF9zZXNzaW9uX2RhdGEoKTogJXNcbiIsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfYWRkX2FkdF9hdWRpdF9kYXRhIChjcmVkZW50aWFscywgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGZyZWUgKGRhdGEpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAodm9pZCkgYWR0X2VuZF9zZXNzaW9uIChhZHRoKTsKKyAgICAgICAgICB9CisjZW5kaWYgLyogSEFWRV9BRFQgKi8KKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gZ2V0cGVlcnVjcmVkKCkgY3JlZGVudGlhbHM6ICVzXG4iLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIH0KKyAgICBpZiAodWNyZWQgIT0gTlVMTCkKKyAgICAgIHVjcmVkX2ZyZWUgKHVjcmVkKTsKKyNlbHNlIC8qICFTT19QRUVSQ1JFRCAmJiAhSEFWRV9DTVNHQ1JFRCAmJiAhSEFWRV9HRVRQRUVSRUlEICYmICFIQVZFX0dFVFBFRVJVQ1JFRCAqLworICAgIF9kYnVzX3ZlcmJvc2UgKCJTb2NrZXQgY3JlZGVudGlhbHMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIE9TXG4iKTsKKyNlbmRpZgorICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIkNyZWRlbnRpYWxzOiIKKyAgICAgICAgICAgICAgICAgIiAgcGlkICJEQlVTX1BJRF9GT1JNQVQKKyAgICAgICAgICAgICAgICAgIiAgdWlkICJEQlVTX1VJRF9GT1JNQVQKKyAgICAgICAgICAgICAgICAgIlxuIiwKKwkJIHBpZF9yZWFkLAorCQkgdWlkX3JlYWQpOworCisgIGlmIChwaWRfcmVhZCAhPSBEQlVTX1BJRF9VTlNFVCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF91bml4X3BpZCAoY3JlZGVudGlhbHMsIHBpZF9yZWFkKSkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKHVpZF9yZWFkICE9IERCVVNfVUlEX1VOU0VUKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX3VuaXhfdWlkIChjcmVkZW50aWFscywgdWlkX3JlYWQpKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBTZW5kcyBhIHNpbmdsZSBudWwgYnl0ZSB3aXRoIG91ciBVTklYIGNyZWRlbnRpYWxzIGFzIGFuY2lsbGFyeQorICogZGF0YS4gIFJldHVybnMgI1RSVUUgaWYgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSB3cml0dGVuLiAgT24KKyAqIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHNlbmRpbmcgY3JlZGVudGlhbHMsIGp1c3Qgd3JpdGVzIGEgYnl0ZSwKKyAqIGRvZXNuJ3Qgc2VuZCBhbnkgY3JlZGVudGlhbHMuICBPbiBzb21lIHN5c3RlbXMsIHN1Y2ggYXMgTGludXgsCisgKiByZWFkaW5nL3dyaXRpbmcgdGhlIGJ5dGUgaXNuJ3QgYWN0dWFsbHkgcmVxdWlyZWQsIGJ1dCB3ZSBkbyBpdAorICogYW55d2F5IGp1c3QgdG8gYXZvaWQgbXVsdGlwbGUgY29kZXBhdGhzLgorICoKKyAqIEZhaWxzIGlmIG5vIGJ5dGUgY2FuIGJlIHdyaXR0ZW4sIHNvIHlvdSBtdXN0IHNlbGVjdCgpIGZpcnN0LgorICoKKyAqIFRoZSBwb2ludCBvZiB0aGUgYnl0ZSBpcyB0aGF0IG9uIHNvbWUgc3lzdGVtcyB3ZSBoYXZlIHRvCisgKiB1c2Ugc2VuZG1zZygpL3JlY3Ztc2coKSB0byB0cmFuc21pdCBjcmVkZW50aWFscy4KKyAqCisgKiBAcGFyYW0gc2VydmVyX2ZkIGZpbGUgZGVzY3JpcHRvciBmb3IgY29ubmVjdGlvbiB0byBzZXJ2ZXIKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9yIGNvZGUKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBieXRlIHdhcyBzZW50CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zZW5kX2NyZWRlbnRpYWxzX3NvY2tldCAgKGludCAgICAgICAgICAgICAgc2VydmVyX2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgKmVycm9yKQoreworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAod3JpdGVfY3JlZGVudGlhbHNfYnl0ZSAoc2VydmVyX2ZkLCBlcnJvcikpCisgICAgcmV0dXJuIFRSVUU7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogQWNjZXB0cyBhIGNvbm5lY3Rpb24gb24gYSBsaXN0ZW5pbmcgc29ja2V0LgorICogSGFuZGxlcyBFSU5UUiBmb3IgeW91LgorICoKKyAqIFRoaXMgd2lsbCBlbmFibGUgRkRfQ0xPRVhFQyBmb3IgdGhlIHJldHVybmVkIHNvY2tldC4KKyAqCisgKiBAcGFyYW0gbGlzdGVuX2ZkIHRoZSBsaXN0ZW4gZmlsZSBkZXNjcmlwdG9yCisgKiBAcmV0dXJucyB0aGUgY29ubmVjdGlvbiBmZCBvZiB0aGUgY2xpZW50LCBvciAtMSBvbiBlcnJvcgorICovCitpbnQKK19kYnVzX2FjY2VwdCAgKGludCBsaXN0ZW5fZmQpCit7CisgIGludCBjbGllbnRfZmQ7CisgIHN0cnVjdCBzb2NrYWRkciBhZGRyOworICBzb2NrbGVuX3QgYWRkcmxlbjsKKyNpZmRlZiBIQVZFX0FDQ0VQVDQKKyAgZGJ1c19ib29sX3QgY2xvZXhlY19kb25lOworI2VuZGlmCisKKyAgYWRkcmxlbiA9IHNpemVvZiAoYWRkcik7CisKKyByZXRyeToKKworI2lmZGVmIEhBVkVfQUNDRVBUNAorICAvKiBXZSBhc3N1bWUgdGhhdCBpZiBhY2NlcHQ0IGlzIGF2YWlsYWJsZSBTT0NLX0NMT0VYRUMgaXMgdG9vICovCisgIGNsaWVudF9mZCA9IGFjY2VwdDQgKGxpc3Rlbl9mZCwgJmFkZHIsICZhZGRybGVuLCBTT0NLX0NMT0VYRUMpOworICBjbG9leGVjX2RvbmUgPSBjbGllbnRfZmQgPj0gMDsKKworICBpZiAoY2xpZW50X2ZkIDwgMCAmJiBlcnJubyA9PSBFTk9TWVMpCisjZW5kaWYKKyAgICB7CisgICAgICBjbGllbnRfZmQgPSBhY2NlcHQgKGxpc3Rlbl9mZCwgJmFkZHIsICZhZGRybGVuKTsKKyAgICB9CisKKyAgaWYgKGNsaWVudF9mZCA8IDApCisgICAgeworICAgICAgaWYgKGVycm5vID09IEVJTlRSKQorICAgICAgICBnb3RvIHJldHJ5OworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiY2xpZW50IGZkICVkIGFjY2VwdGVkXG4iLCBjbGllbnRfZmQpOworCisjaWZkZWYgSEFWRV9BQ0NFUFQ0CisgIGlmICghY2xvZXhlY19kb25lKQorI2VuZGlmCisgICAgeworICAgICAgX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMoY2xpZW50X2ZkKTsKKyAgICB9CisKKyAgcmV0dXJuIGNsaWVudF9mZDsKK30KKworLyoqCisgKiBDaGVja3MgdG8gbWFrZSBzdXJlIHRoZSBnaXZlbiBkaXJlY3RvcnkgaXMKKyAqIHByaXZhdGUgdG8gdGhlIHVzZXIKKyAqCisgKiBAcGFyYW0gZGlyIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkKKyAqIEBwYXJhbSBlcnJvciBlcnJvciByZXR1cm4KKyAqIEByZXR1cm5zICNGQUxTRSBvbiBmYWlsdXJlCisgKiovCitkYnVzX2Jvb2xfdAorX2RidXNfY2hlY2tfZGlyX2lzX3ByaXZhdGVfdG9fdXNlciAoREJ1c1N0cmluZyAqZGlyLCBEQnVzRXJyb3IgKmVycm9yKQoreworICBjb25zdCBjaGFyICpkaXJlY3Rvcnk7CisgIHN0cnVjdCBzdGF0IHNiOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGRpcmVjdG9yeSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZGlyKTsKKworICBpZiAoc3RhdCAoZGlyZWN0b3J5LCAmc2IpIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiJXMiLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoKFNfSVJPVEggJiBzYi5zdF9tb2RlKSB8fCAoU19JV09USCAmIHNiLnN0X21vZGUpIHx8CisgICAgICAoU19JUkdSUCAmIHNiLnN0X21vZGUpIHx8IChTX0lXR1JQICYgc2Iuc3RfbW9kZSkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICIlcyBkaXJlY3RvcnkgaXMgbm90IHByaXZhdGUgdG8gdGhlIHVzZXIiLCBkaXJlY3RvcnkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitmaWxsX3VzZXJfaW5mb19mcm9tX3Bhc3N3ZCAoc3RydWN0IHBhc3N3ZCAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVXNlckluZm8gICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgKmVycm9yKQoreworICBfZGJ1c19hc3NlcnQgKHAtPnB3X25hbWUgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocC0+cHdfZGlyICE9IE5VTEwpOworCisgIGluZm8tPnVpZCA9IHAtPnB3X3VpZDsKKyAgaW5mby0+cHJpbWFyeV9naWQgPSBwLT5wd19naWQ7CisgIGluZm8tPnVzZXJuYW1lID0gX2RidXNfc3RyZHVwIChwLT5wd19uYW1lKTsKKyAgaW5mby0+aG9tZWRpciA9IF9kYnVzX3N0cmR1cCAocC0+cHdfZGlyKTsKKworICBpZiAoaW5mby0+dXNlcm5hbWUgPT0gTlVMTCB8fAorICAgICAgaW5mby0+aG9tZWRpciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitmaWxsX3VzZXJfaW5mbyAoREJ1c1VzZXJJbmZvICAgICAgICppbmZvLAorICAgICAgICAgICAgICAgIGRidXNfdWlkX3QgICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAqdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqdXNlcm5hbWVfYzsKKworICAvKiBleGFjdGx5IG9uZSBvZiB1c2VybmFtZS91aWQgcHJvdmlkZWQgKi8KKyAgX2RidXNfYXNzZXJ0ICh1c2VybmFtZSAhPSBOVUxMIHx8IHVpZCAhPSBEQlVTX1VJRF9VTlNFVCk7CisgIF9kYnVzX2Fzc2VydCAodXNlcm5hbWUgPT0gTlVMTCB8fCB1aWQgPT0gREJVU19VSURfVU5TRVQpOworCisgIGluZm8tPnVpZCA9IERCVVNfVUlEX1VOU0VUOworICBpbmZvLT5wcmltYXJ5X2dpZCA9IERCVVNfR0lEX1VOU0VUOworICBpbmZvLT5ncm91cF9pZHMgPSBOVUxMOworICBpbmZvLT5uX2dyb3VwX2lkcyA9IDA7CisgIGluZm8tPnVzZXJuYW1lID0gTlVMTDsKKyAgaW5mby0+aG9tZWRpciA9IE5VTEw7CisKKyAgaWYgKHVzZXJuYW1lICE9IE5VTEwpCisgICAgdXNlcm5hbWVfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAodXNlcm5hbWUpOworICBlbHNlCisgICAgdXNlcm5hbWVfYyA9IE5VTEw7CisKKyAgLyogRm9yIG5vdyBhc3N1bWluZyB0aGF0IHRoZSBnZXRwd25hbSgpIGFuZCBnZXRwd3VpZCgpIGZsYXZvcnMKKyAgICogYXJlIGFsd2F5cyBzeW1tZXRyaWNhbCwgaWYgbm90IHdlIGhhdmUgdG8gYWRkIG1vcmUgY29uZmlndXJlCisgICAqIGNoZWNrcworICAgKi8KKworI2lmIGRlZmluZWQgKEhBVkVfUE9TSVhfR0VUUFdOQU1fUikgfHwgZGVmaW5lZCAoSEFWRV9OT05QT1NJWF9HRVRQV05BTV9SKQorICB7CisgICAgc3RydWN0IHBhc3N3ZCAqcDsKKyAgICBpbnQgcmVzdWx0OworICAgIHNpemVfdCBidWZsZW47CisgICAgY2hhciAqYnVmOworICAgIHN0cnVjdCBwYXNzd2QgcF9zdHI7CisKKyAgICAvKiByZXRyaWV2ZSBtYXhpbXVtIG5lZWRlZCBzaXplIGZvciBidWYgKi8KKyAgICBidWZsZW4gPSBzeXNjb25mIChfU0NfR0VUUFdfUl9TSVpFX01BWCk7CisKKyAgICAvKiBzeXNjb25mIGFjdHVhbGx5IHJldHVybnMgYSBsb25nLCBidXQgZXZlcnl0aGluZyBlbHNlIGV4cGVjdHMgc2l6ZV90LAorICAgICAqIHNvIGp1c3QgcmVjYXN0IGhlcmUuCisgICAgICogaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTcwNjEKKyAgICAgKi8KKyAgICBpZiAoKGxvbmcpIGJ1ZmxlbiA8PSAwKQorICAgICAgYnVmbGVuID0gMTAyNDsKKworICAgIHJlc3VsdCA9IC0xOworICAgIHdoaWxlICgxKQorICAgICAgeworICAgICAgICBidWYgPSBkYnVzX21hbGxvYyAoYnVmbGVuKTsKKyAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIH0KKworICAgICAgICBwID0gTlVMTDsKKyNpZmRlZiBIQVZFX1BPU0lYX0dFVFBXTkFNX1IKKyAgICAgICAgaWYgKHVpZCAhPSBEQlVTX1VJRF9VTlNFVCkKKyAgICAgICAgICByZXN1bHQgPSBnZXRwd3VpZF9yICh1aWQsICZwX3N0ciwgYnVmLCBidWZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnApOworICAgICAgICBlbHNlCisgICAgICAgICAgcmVzdWx0ID0gZ2V0cHduYW1fciAodXNlcm5hbWVfYywgJnBfc3RyLCBidWYsIGJ1ZmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcCk7CisjZWxzZQorICAgICAgICBpZiAodWlkICE9IERCVVNfVUlEX1VOU0VUKQorICAgICAgICAgIHAgPSBnZXRwd3VpZF9yICh1aWQsICZwX3N0ciwgYnVmLCBidWZsZW4pOworICAgICAgICBlbHNlCisgICAgICAgICAgcCA9IGdldHB3bmFtX3IgKHVzZXJuYW1lX2MsICZwX3N0ciwgYnVmLCBidWZsZW4pOworICAgICAgICByZXN1bHQgPSAwOworI2VuZGlmIC8qICFIQVZFX1BPU0lYX0dFVFBXTkFNX1IgKi8KKyAgICAgICAgLy9UcnkgYSBiaWdnZXIgYnVmZmVyIGlmIEVSQU5HRSB3YXMgcmV0dXJuZWQKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBFUkFOR0UgJiYgYnVmbGVuIDwgNTEyICogMTAyNCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX2ZyZWUgKGJ1Zik7CisgICAgICAgICAgICBidWZsZW4gKj0gMjsKKyAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgaWYgKHJlc3VsdCA9PSAwICYmIHAgPT0gJnBfc3RyKQorICAgICAgeworICAgICAgICBpZiAoIWZpbGxfdXNlcl9pbmZvX2Zyb21fcGFzc3dkIChwLCBpbmZvLCBlcnJvcikpCisgICAgICAgICAgeworICAgICAgICAgICAgZGJ1c19mcmVlIChidWYpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIH0KKyAgICAgICAgZGJ1c19mcmVlIChidWYpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAiVXNlciBcIiVzXCIgdW5rbm93biBvciBubyBtZW1vcnkgdG8gYWxsb2NhdGUgcGFzc3dvcmQgZW50cnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZV9jID8gdXNlcm5hbWVfYyA6ICI/Pz8iKTsKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIlVzZXIgJXMgdW5rbm93blxuIiwgdXNlcm5hbWVfYyA/IHVzZXJuYW1lX2MgOiAiPz8/Iik7CisgICAgICAgIGRidXNfZnJlZSAoYnVmKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICB9CisjZWxzZSAvKiAhIEhBVkVfR0VUUFdOQU1fUiAqLworICB7CisgICAgLyogSSBndWVzcyB3ZSdyZSBzY3Jld2VkIG9uIHRocmVhZCBzYWZldHkgaGVyZSAqLworICAgIHN0cnVjdCBwYXNzd2QgKnA7CisKKyAgICBpZiAodWlkICE9IERCVVNfVUlEX1VOU0VUKQorICAgICAgcCA9IGdldHB3dWlkICh1aWQpOworICAgIGVsc2UKKyAgICAgIHAgPSBnZXRwd25hbSAodXNlcm5hbWVfYyk7CisKKyAgICBpZiAocCAhPSBOVUxMKQorICAgICAgeworICAgICAgICBpZiAoIWZpbGxfdXNlcl9pbmZvX2Zyb21fcGFzc3dkIChwLCBpbmZvLCBlcnJvcikpCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVzZXIgXCIlc1wiIHVua25vd24gb3Igbm8gbWVtb3J5IHRvIGFsbG9jYXRlIHBhc3N3b3JkIGVudHJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWVfYyA/IHVzZXJuYW1lX2MgOiAiPz8/Iik7CisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJVc2VyICVzIHVua25vd25cbiIsIHVzZXJuYW1lX2MgPyB1c2VybmFtZV9jIDogIj8/PyIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgIH0KKyNlbmRpZiAgLyogISBIQVZFX0dFVFBXTkFNX1IgKi8KKworICAvKiBGaWxsIHRoaXMgaW4gc28gd2UgY2FuIHVzZSBpdCB0byBnZXQgZ3JvdXBzICovCisgIHVzZXJuYW1lX2MgPSBpbmZvLT51c2VybmFtZTsKKworI2lmZGVmIEhBVkVfR0VUR1JPVVBMSVNUCisgIHsKKyAgICBnaWRfdCAqYnVmOworICAgIGludCBidWZfY291bnQ7CisgICAgaW50IGk7CisgICAgaW50IGluaXRpYWxfYnVmX2NvdW50OworCisgICAgaW5pdGlhbF9idWZfY291bnQgPSAxNzsKKyAgICBidWZfY291bnQgPSBpbml0aWFsX2J1Zl9jb3VudDsKKyAgICBidWYgPSBkYnVzX25ldyAoZ2lkX3QsIGJ1Zl9jb3VudCk7CisgICAgaWYgKGJ1ZiA9PSBOVUxMKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICB9CisKKyAgICBpZiAoZ2V0Z3JvdXBsaXN0ICh1c2VybmFtZV9jLAorICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnByaW1hcnlfZ2lkLAorICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgJmJ1Zl9jb3VudCkgPCAwKQorICAgICAgeworICAgICAgICBnaWRfdCAqbmV3OworICAgICAgICAvKiBQcmVzdW1lZCBjYXVzZSBvZiBuZWdhdGl2ZSByZXR1cm4gY29kZTogYnVmIGhhcyBpbnN1ZmZpY2llbnQKKyAgICAgICAgICAgZW50cmllcyB0byBob2xkIHRoZSBlbnRpcmUgZ3JvdXAgbGlzdC4gVGhlIExpbnV4IGJlaGF2aW9yIGluIHRoaXMKKyAgICAgICAgICAgY2FzZSBpcyB0byBwYXNzIGJhY2sgdGhlIGFjdHVhbCBudW1iZXIgb2YgZ3JvdXBzIGluIGJ1Zl9jb3VudCwgYnV0CisgICAgICAgICAgIG9uIE1hYyBPUyBYIDEwLjUsIGJ1Zl9jb3VudCBpcyB1bmhlbHBmdWxseSBsZWZ0IGFsb25lLgorICAgICAgICAgICBTbyBhcyBhIGhhY2ssIHRyeSB0byBoZWxwIG91dCBhIGJpdCBieSBndWVzc2luZyBhIGxhcmdlcgorICAgICAgICAgICBudW1iZXIgb2YgZ3JvdXBzLCB3aXRoaW4gcmVhc29uLi4gbWlnaHQgc3RpbGwgZmFpbCwgb2YgY291cnNlLAorICAgICAgICAgICBidXQgd2UgY2FuIGF0IGxlYXN0IHByaW50IGEgbW9yZSBpbmZvcm1hdGl2ZSBtZXNzYWdlLiAgSSBsb29rZWQgdXAKKyAgICAgICAgICAgdGhlICJyaWdodCB3YXkiIHRvIGRvIHRoaXMgYnkgZG93bmxvYWRpbmcgQXBwbGUncyBvd24gc291cmNlIGNvZGUKKyAgICAgICAgICAgZm9yIHRoZSAiaWQiIGNvbW1hbmQsIGFuZCBpdCB0dXJucyBvdXQgdGhhdCB0aGV5IHVzZSBhbgorICAgICAgICAgICB1bmRvY3VtZW50ZWQgbGlicmFyeSBmdW5jdGlvbiBnZXRncm91cGxpc3RfMiAoISkgd2hpY2ggaXMgbm90CisgICAgICAgICAgIGRlY2xhcmVkIGluIGFueSBoZWFkZXIgaW4gL3Vzci9pbmNsdWRlICghISkuIFRoYXQgZGlkIG5vdCBzZWVtCisgICAgICAgICAgIGxpa2UgdGhlIHdheSB0byBnbyBoZXJlLgorICAgICAgICAqLworICAgICAgICBpZiAoYnVmX2NvdW50ID09IGluaXRpYWxfYnVmX2NvdW50KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGJ1Zl9jb3VudCAqPSAxNjsgLyogUmV0cnkgd2l0aCBhbiBhcmJpdHJhcmlseSBzY2FsZWQtdXAgYXJyYXkgKi8KKyAgICAgICAgICB9CisgICAgICAgIG5ldyA9IGRidXNfcmVhbGxvYyAoYnVmLCBidWZfY291bnQgKiBzaXplb2YgKGJ1ZlswXSkpOworICAgICAgICBpZiAobmV3ID09IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgICBkYnVzX2ZyZWUgKGJ1Zik7CisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICB9CisKKyAgICAgICAgYnVmID0gbmV3OworCisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgaWYgKGdldGdyb3VwbGlzdCAodXNlcm5hbWVfYywgaW5mby0+cHJpbWFyeV9naWQsIGJ1ZiwgJmJ1Zl9jb3VudCkgPCAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlcnJubyA9PSAwKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIkl0IGFwcGVhcnMgdGhhdCB1c2VybmFtZSBcIiVzXCIgaXMgaW4gbW9yZSB0aGFuICVkIGdyb3Vwcy5cblByb2NlZWRpbmcgd2l0aCBqdXN0IHRoZSBmaXJzdCAlZCBncm91cHMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZV9jLCBidWZfY291bnQsIGJ1Zl9jb3VudCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCBncm91cHMgZm9yIHVzZXJuYW1lIFwiJXNcIiBwcmltYXJ5IEdJRCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfR0lEX0ZPUk1BVCAiOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWVfYywgaW5mby0+cHJpbWFyeV9naWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICAgICAgICAgIGRidXNfZnJlZSAoYnVmKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgIH0KKworICAgIGluZm8tPmdyb3VwX2lkcyA9IGRidXNfbmV3IChkYnVzX2dpZF90LCBidWZfY291bnQpOworICAgIGlmIChpbmZvLT5ncm91cF9pZHMgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgIGRidXNfZnJlZSAoYnVmKTsKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmX2NvdW50OyArK2kpCisgICAgICBpbmZvLT5ncm91cF9pZHNbaV0gPSBidWZbaV07CisKKyAgICBpbmZvLT5uX2dyb3VwX2lkcyA9IGJ1Zl9jb3VudDsKKworICAgIGRidXNfZnJlZSAoYnVmKTsKKyAgfQorI2Vsc2UgIC8qIEhBVkVfR0VUR1JPVVBMSVNUICovCisgIHsKKyAgICAvKiBXZSBqdXN0IGdldCB0aGUgb25lIGdyb3VwIElEICovCisgICAgaW5mby0+Z3JvdXBfaWRzID0gZGJ1c19uZXcgKGRidXNfZ2lkX3QsIDEpOworICAgIGlmIChpbmZvLT5ncm91cF9pZHMgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgfQorCisgICAgaW5mby0+bl9ncm91cF9pZHMgPSAxOworCisgICAgKGluZm8tPmdyb3VwX2lkcylbMF0gPSBpbmZvLT5wcmltYXJ5X2dpZDsKKyAgfQorI2VuZGlmIC8qIEhBVkVfR0VUR1JPVVBMSVNUICovCisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgcmV0dXJuIFRSVUU7CisKKyBmYWlsZWQ6CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEdldHMgdXNlciBpbmZvIGZvciB0aGUgZ2l2ZW4gdXNlcm5hbWUuCisgKgorICogQHBhcmFtIGluZm8gdXNlciBpbmZvIG9iamVjdCB0byBpbml0aWFsaXplCisgKiBAcGFyYW0gdXNlcm5hbWUgdGhlIHVzZXJuYW1lCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c191c2VyX2luZm9fZmlsbCAoREJ1c1VzZXJJbmZvICAgICAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgcmV0dXJuIGZpbGxfdXNlcl9pbmZvIChpbmZvLCBEQlVTX1VJRF9VTlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSwgZXJyb3IpOworfQorCisvKioKKyAqIEdldHMgdXNlciBpbmZvIGZvciB0aGUgZ2l2ZW4gdXNlciBJRC4KKyAqCisgKiBAcGFyYW0gaW5mbyB1c2VyIGluZm8gb2JqZWN0IHRvIGluaXRpYWxpemUKKyAqIEBwYXJhbSB1aWQgdGhlIHVzZXIgSUQKKyAqIEBwYXJhbSBlcnJvciBlcnJvciByZXR1cm4KKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3VzZXJfaW5mb19maWxsX3VpZCAoREJ1c1VzZXJJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICplcnJvcikKK3sKKyAgcmV0dXJuIGZpbGxfdXNlcl9pbmZvIChpbmZvLCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgZXJyb3IpOworfQorCisvKioKKyAqIEFkZHMgdGhlIGNyZWRlbnRpYWxzIG9mIHRoZSBjdXJyZW50IHByb2Nlc3MgdG8gdGhlCisgKiBwYXNzZWQtaW4gY3JlZGVudGlhbHMgb2JqZWN0LgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyBjcmVkZW50aWFscyB0byBhZGQgdG8KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnk7IGRvZXMgbm90IHByb3Blcmx5IHJvbGwgYmFjayBvbiBmYWlsdXJlLCBzbyBvbmx5IHNvbWUgY3JlZGVudGlhbHMgbWF5IGhhdmUgYmVlbiBhZGRlZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlZGVudGlhbHNfYWRkX2Zyb21fY3VycmVudF9wcm9jZXNzIChEQnVzQ3JlZGVudGlhbHMgKmNyZWRlbnRpYWxzKQoreworICAvKiBUaGUgUE9TSVggc3BlYyBjZXJ0YWlubHkgZG9lc24ndCBwcm9taXNlIHRoaXMsIGJ1dAorICAgKiB3ZSBuZWVkIHRoZXNlIGFzc2VydGlvbnMgdG8gZmFpbCBhcyBzb29uIGFzIHdlJ3JlIHdyb25nIGFib3V0CisgICAqIGl0IHNvIHdlIGNhbiBkbyB0aGUgcG9ydGluZyBmaXh1cHMKKyAgICovCisgIF9kYnVzX2Fzc2VydCAoc2l6ZW9mIChwaWRfdCkgPD0gc2l6ZW9mIChkYnVzX3BpZF90KSk7CisgIF9kYnVzX2Fzc2VydCAoc2l6ZW9mICh1aWRfdCkgPD0gc2l6ZW9mIChkYnVzX3VpZF90KSk7CisgIF9kYnVzX2Fzc2VydCAoc2l6ZW9mIChnaWRfdCkgPD0gc2l6ZW9mIChkYnVzX2dpZF90KSk7CisKKyAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfdW5peF9waWQoY3JlZGVudGlhbHMsIF9kYnVzX2dldHBpZCgpKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX3VuaXhfdWlkKGNyZWRlbnRpYWxzLCBfZGJ1c19nZXRldWlkKCkpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBBcHBlbmQgdG8gdGhlIHN0cmluZyB0aGUgaWRlbnRpdHkgd2Ugd291bGQgbGlrZSB0byBoYXZlIHdoZW4gd2UKKyAqIGF1dGhlbnRpY2F0ZSwgb24gVU5JWCB0aGlzIGlzIHRoZSBjdXJyZW50IHByb2Nlc3MgVUlEIGFuZCBvbgorICogV2luZG93cyBzb21ldGhpbmcgZWxzZSwgcHJvYmFibHkgYSBXaW5kb3dzIFNJRCBzdHJpbmcuICBObyBlc2NhcGluZworICogaXMgcmVxdWlyZWQsIHRoYXQgaXMgZG9uZSBpbiBkYnVzLWF1dGguYy4gVGhlIHVzZXJuYW1lIGhlcmUKKyAqIG5lZWQgbm90IGJlIGFueXRoaW5nIGh1bWFuLXJlYWRhYmxlLCBpdCBjYW4gYmUgdGhlIG1hY2hpbmUtcmVhZGFibGUKKyAqIGZvcm0gaS5lLiBhIHVzZXIgaWQuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIGFwcGVuZCB0bworICogQHJldHVybnMgI0ZBTFNFIG9uIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXBwZW5kX3VzZXJfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKERCdXNTdHJpbmcgKnN0cikKK3sKKyAgcmV0dXJuIF9kYnVzX3N0cmluZ19hcHBlbmRfdWludCAoc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19nZXRldWlkICgpKTsKK30KKworLyoqCisgKiBHZXRzIG91ciBwcm9jZXNzIElECisgKiBAcmV0dXJucyBwcm9jZXNzIElECisgKi8KK2RidXNfcGlkX3QKK19kYnVzX2dldHBpZCAodm9pZCkKK3sKKyAgcmV0dXJuIGdldHBpZCAoKTsKK30KKworLyoqIEdldHMgb3VyIFVJRAorICogQHJldHVybnMgcHJvY2VzcyBVSUQKKyAqLworZGJ1c191aWRfdAorX2RidXNfZ2V0dWlkICh2b2lkKQoreworICByZXR1cm4gZ2V0dWlkICgpOworfQorCisvKiogR2V0cyBvdXIgZWZmZWN0aXZlIFVJRAorICogQHJldHVybnMgcHJvY2VzcyBlZmZlY3RpdmUgVUlECisgKi8KK2RidXNfdWlkX3QKK19kYnVzX2dldGV1aWQgKHZvaWQpCit7CisgIHJldHVybiBnZXRldWlkICgpOworfQorCisvKioKKyAqIFRoZSBvbmx5IHJlYXNvbiB0aGlzIGlzIHNlcGFyYXRlIGZyb20gX2RidXNfZ2V0cGlkKCkgaXMgdG8gYWxsb3cgaXQKKyAqIG9uIFdpbmRvd3MgZm9yIGxvZ2dpbmcgYnV0IG5vdCBmb3Igb3RoZXIgcHVycG9zZXMuCisgKgorICogQHJldHVybnMgcHJvY2VzcyBJRCB0byBwdXQgaW4gbG9nIG1lc3NhZ2VzCisgKi8KK3Vuc2lnbmVkIGxvbmcKK19kYnVzX3BpZF9mb3JfbG9nICh2b2lkKQoreworICByZXR1cm4gZ2V0cGlkICgpOworfQorCisvKioKKyAqIEdldHMgYSBVSUQgZnJvbSBhIFVJRCBzdHJpbmcuCisgKgorICogQHBhcmFtIHVpZF9zdHIgdGhlIFVJRCBpbiBzdHJpbmcgZm9ybQorICogQHBhcmFtIHVpZCBVSUQgdG8gZmlsbCBpbgorICogQHJldHVybnMgI1RSVUUgaWYgc3VjY2Vzc2Z1bGx5IGZpbGxlZCBpbiBVSUQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3BhcnNlX3VpZCAoY29uc3QgREJ1c1N0cmluZyAgICAgICp1aWRfc3RyLAorICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICAgICAgKnVpZCkKK3sKKyAgaW50IGVuZDsKKyAgbG9uZyB2YWw7CisKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh1aWRfc3RyKSA9PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJVSUQgc3RyaW5nIHdhcyB6ZXJvIGxlbmd0aFxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHZhbCA9IC0xOworICBlbmQgPSAwOworICBpZiAoIV9kYnVzX3N0cmluZ19wYXJzZV9pbnQgKHVpZF9zdHIsIDAsICZ2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuZCkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvdWxkIG5vdCBwYXJzZSBzdHJpbmcgYXMgYSBVSURcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoZW5kICE9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh1aWRfc3RyKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgic3RyaW5nIGNvbnRhaW5lZCB0cmFpbGluZyBzdHVmZiBhZnRlciBVSURcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAqdWlkID0gdmFsOworCisgIHJldHVybiBUUlVFOworfQorCisjaWYgIURCVVNfVVNFX1NZTkMKK19EQlVTX0RFRklORV9HTE9CQUxfTE9DSyAoYXRvbWljKTsKKyNlbmRpZgorCisvKioKKyAqIEF0b21pY2FsbHkgaW5jcmVtZW50cyBhbiBpbnRlZ2VyCisgKgorICogQHBhcmFtIGF0b21pYyBwb2ludGVyIHRvIHRoZSBpbnRlZ2VyIHRvIGluY3JlbWVudAorICogQHJldHVybnMgdGhlIHZhbHVlIGJlZm9yZSBpbmNyZW1lbnRpbmcKKyAqLworZGJ1c19pbnQzMl90CitfZGJ1c19hdG9taWNfaW5jIChEQnVzQXRvbWljICphdG9taWMpCit7CisjaWYgREJVU19VU0VfU1lOQworICByZXR1cm4gX19zeW5jX2FkZF9hbmRfZmV0Y2goJmF0b21pYy0+dmFsdWUsIDEpLTE7CisjZWxzZQorICBkYnVzX2ludDMyX3QgcmVzOworICBfREJVU19MT0NLIChhdG9taWMpOworICByZXMgPSBhdG9taWMtPnZhbHVlOworICBhdG9taWMtPnZhbHVlICs9IDE7CisgIF9EQlVTX1VOTE9DSyAoYXRvbWljKTsKKyAgcmV0dXJuIHJlczsKKyNlbmRpZgorfQorCisvKioKKyAqIEF0b21pY2FsbHkgZGVjcmVtZW50IGFuIGludGVnZXIKKyAqCisgKiBAcGFyYW0gYXRvbWljIHBvaW50ZXIgdG8gdGhlIGludGVnZXIgdG8gZGVjcmVtZW50CisgKiBAcmV0dXJucyB0aGUgdmFsdWUgYmVmb3JlIGRlY3JlbWVudGluZworICovCitkYnVzX2ludDMyX3QKK19kYnVzX2F0b21pY19kZWMgKERCdXNBdG9taWMgKmF0b21pYykKK3sKKyNpZiBEQlVTX1VTRV9TWU5DCisgIHJldHVybiBfX3N5bmNfc3ViX2FuZF9mZXRjaCgmYXRvbWljLT52YWx1ZSwgMSkrMTsKKyNlbHNlCisgIGRidXNfaW50MzJfdCByZXM7CisKKyAgX0RCVVNfTE9DSyAoYXRvbWljKTsKKyAgcmVzID0gYXRvbWljLT52YWx1ZTsKKyAgYXRvbWljLT52YWx1ZSAtPSAxOworICBfREJVU19VTkxPQ0sgKGF0b21pYyk7CisgIHJldHVybiByZXM7CisjZW5kaWYKK30KKworLyoqCisgKiBBdG9taWNhbGx5IGdldCB0aGUgdmFsdWUgb2YgYW4gaW50ZWdlci4gSXQgbWF5IGNoYW5nZSBhdCBhbnkgdGltZQorICogdGhlcmVhZnRlciwgc28gdGhpcyBpcyBtb3N0bHkgb25seSB1c2VmdWwgZm9yIGFzc2VydGlvbnMuCisgKgorICogQHBhcmFtIGF0b21pYyBwb2ludGVyIHRvIHRoZSBpbnRlZ2VyIHRvIGdldAorICogQHJldHVybnMgdGhlIHZhbHVlIGF0IHRoaXMgbW9tZW50CisgKi8KK2RidXNfaW50MzJfdAorX2RidXNfYXRvbWljX2dldCAoREJ1c0F0b21pYyAqYXRvbWljKQoreworI2lmIERCVVNfVVNFX1NZTkMKKyAgX19zeW5jX3N5bmNocm9uaXplICgpOworICByZXR1cm4gYXRvbWljLT52YWx1ZTsKKyNlbHNlCisgIGRidXNfaW50MzJfdCByZXM7CisKKyAgX0RCVVNfTE9DSyAoYXRvbWljKTsKKyAgcmVzID0gYXRvbWljLT52YWx1ZTsKKyAgX0RCVVNfVU5MT0NLIChhdG9taWMpOworICByZXR1cm4gcmVzOworI2VuZGlmCit9CisKKy8qKgorICogV3JhcHBlciBmb3IgcG9sbCgpLgorICoKKyAqIEBwYXJhbSBmZHMgdGhlIGZpbGUgZGVzY3JpcHRvcnMgdG8gcG9sbAorICogQHBhcmFtIG5fZmRzIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiB0aGUgYXJyYXkKKyAqIEBwYXJhbSB0aW1lb3V0X21pbGxpc2Vjb25kcyB0aW1lb3V0IG9yIC0xIGZvciBpbmZpbml0ZQorICogQHJldHVybnMgbnVtYmVycyBvZiBmZHMgd2l0aCByZXZlbnRzLCBvciA8MCBvbiBlcnJvcgorICovCitpbnQKK19kYnVzX3BvbGwgKERCdXNQb2xsRkQgKmZkcywKKyAgICAgICAgICAgIGludCAgICAgICAgIG5fZmRzLAorICAgICAgICAgICAgaW50ICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpCit7CisjaWYgZGVmaW5lZChIQVZFX1BPTEwpICYmICFkZWZpbmVkKEJST0tFTl9QT0xMKQorICAvKiBUaGlzIGJpZyB0aGluZyBpcyBhIGNvbnN0YW50IGV4cHJlc3Npb24gYW5kIHNob3VsZCBnZXQgb3B0aW1pemVkCisgICAqIG91dCBvZiBleGlzdGVuY2UuIFNvIGl0J3MgbW9yZSByb2J1c3QgdGhhbiBhIGNvbmZpZ3VyZSBjaGVjayBhdAorICAgKiBubyBjb3N0LgorICAgKi8KKyAgaWYgKF9EQlVTX1BPTExJTiA9PSBQT0xMSU4gJiYKKyAgICAgIF9EQlVTX1BPTExQUkkgPT0gUE9MTFBSSSAmJgorICAgICAgX0RCVVNfUE9MTE9VVCA9PSBQT0xMT1VUICYmCisgICAgICBfREJVU19QT0xMRVJSID09IFBPTExFUlIgJiYKKyAgICAgIF9EQlVTX1BPTExIVVAgPT0gUE9MTEhVUCAmJgorICAgICAgX0RCVVNfUE9MTE5WQUwgPT0gUE9MTE5WQUwgJiYKKyAgICAgIHNpemVvZiAoREJ1c1BvbGxGRCkgPT0gc2l6ZW9mIChzdHJ1Y3QgcG9sbGZkKSAmJgorICAgICAgX0RCVVNfU1RSVUNUX09GRlNFVCAoREJ1c1BvbGxGRCwgZmQpID09CisgICAgICBfREJVU19TVFJVQ1RfT0ZGU0VUIChzdHJ1Y3QgcG9sbGZkLCBmZCkgJiYKKyAgICAgIF9EQlVTX1NUUlVDVF9PRkZTRVQgKERCdXNQb2xsRkQsIGV2ZW50cykgPT0KKyAgICAgIF9EQlVTX1NUUlVDVF9PRkZTRVQgKHN0cnVjdCBwb2xsZmQsIGV2ZW50cykgJiYKKyAgICAgIF9EQlVTX1NUUlVDVF9PRkZTRVQgKERCdXNQb2xsRkQsIHJldmVudHMpID09CisgICAgICBfREJVU19TVFJVQ1RfT0ZGU0VUIChzdHJ1Y3QgcG9sbGZkLCByZXZlbnRzKSkKKyAgICB7CisgICAgICByZXR1cm4gcG9sbCAoKHN0cnVjdCBwb2xsZmQqKSBmZHMsCisgICAgICAgICAgICAgICAgICAgbl9mZHMsCisgICAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdlIGhhdmUgdG8gY29udmVydCB0aGUgREJ1c1BvbGxGRCB0byBhbiBhcnJheSBvZgorICAgICAgICogc3RydWN0IHBvbGxmZCwgcG9sbCwgYW5kIGNvbnZlcnQgYmFjay4KKyAgICAgICAqLworICAgICAgX2RidXNfd2FybiAoImRpZG4ndCBpbXBsZW1lbnQgcG9sbCgpIHByb3Blcmx5IGZvciB0aGlzIHN5c3RlbSB5ZXRcbiIpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyNlbHNlIC8qICEgSEFWRV9QT0xMICovCisKKyAgZmRfc2V0IHJlYWRfc2V0LCB3cml0ZV9zZXQsIGVycl9zZXQ7CisgIGludCBtYXhfZmQgPSAwOworICBpbnQgaTsKKyAgc3RydWN0IHRpbWV2YWwgdHY7CisgIGludCByZWFkeTsKKworICBGRF9aRVJPICgmcmVhZF9zZXQpOworICBGRF9aRVJPICgmd3JpdGVfc2V0KTsKKyAgRkRfWkVSTyAoJmVycl9zZXQpOworCisgIGZvciAoaSA9IDA7IGkgPCBuX2ZkczsgaSsrKQorICAgIHsKKyAgICAgIERCdXNQb2xsRkQgKmZkcCA9ICZmZHNbaV07CisKKyAgICAgIGlmIChmZHAtPmV2ZW50cyAmIF9EQlVTX1BPTExJTikKKwlGRF9TRVQgKGZkcC0+ZmQsICZyZWFkX3NldCk7CisKKyAgICAgIGlmIChmZHAtPmV2ZW50cyAmIF9EQlVTX1BPTExPVVQpCisJRkRfU0VUIChmZHAtPmZkLCAmd3JpdGVfc2V0KTsKKworICAgICAgRkRfU0VUIChmZHAtPmZkLCAmZXJyX3NldCk7CisKKyAgICAgIG1heF9mZCA9IE1BWCAobWF4X2ZkLCBmZHAtPmZkKTsKKyAgICB9CisKKyAgdHYudHZfc2VjID0gdGltZW91dF9taWxsaXNlY29uZHMgLyAxMDAwOworICB0di50dl91c2VjID0gKHRpbWVvdXRfbWlsbGlzZWNvbmRzICUgMTAwMCkgKiAxMDAwOworCisgIHJlYWR5ID0gc2VsZWN0IChtYXhfZmQgKyAxLCAmcmVhZF9zZXQsICZ3cml0ZV9zZXQsICZlcnJfc2V0LAorICAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMgPCAwID8gTlVMTCA6ICZ0dik7CisKKyAgaWYgKHJlYWR5ID4gMCkKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbl9mZHM7IGkrKykKKwl7CisJICBEQnVzUG9sbEZEICpmZHAgPSAmZmRzW2ldOworCisJICBmZHAtPnJldmVudHMgPSAwOworCisJICBpZiAoRkRfSVNTRVQgKGZkcC0+ZmQsICZyZWFkX3NldCkpCisJICAgIGZkcC0+cmV2ZW50cyB8PSBfREJVU19QT0xMSU47CisKKwkgIGlmIChGRF9JU1NFVCAoZmRwLT5mZCwgJndyaXRlX3NldCkpCisJICAgIGZkcC0+cmV2ZW50cyB8PSBfREJVU19QT0xMT1VUOworCisJICBpZiAoRkRfSVNTRVQgKGZkcC0+ZmQsICZlcnJfc2V0KSkKKwkgICAgZmRwLT5yZXZlbnRzIHw9IF9EQlVTX1BPTExFUlI7CisJfQorICAgIH0KKworICByZXR1cm4gcmVhZHk7CisjZW5kaWYKK30KKworLyoqCisgKiBHZXQgY3VycmVudCB0aW1lLCBhcyBpbiBnZXR0aW1lb2ZkYXkoKS4gVXNlIHRoZSBtb25vdG9uaWMgY2xvY2sgaWYKKyAqIGF2YWlsYWJsZSwgdG8gYXZvaWQgcHJvYmxlbXMgd2hlbiB0aGUgc3lzdGVtIHRpbWUgY2hhbmdlcy4KKyAqCisgKiBAcGFyYW0gdHZfc2VjIHJldHVybiBsb2NhdGlvbiBmb3IgbnVtYmVyIG9mIHNlY29uZHMKKyAqIEBwYXJhbSB0dl91c2VjIHJldHVybiBsb2NhdGlvbiBmb3IgbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcworICovCit2b2lkCitfZGJ1c19nZXRfbW9ub3RvbmljX3RpbWUgKGxvbmcgKnR2X3NlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAqdHZfdXNlYykKK3sKKyNpZmRlZiBIQVZFX01PTk9UT05JQ19DTE9DSworICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisgIGNsb2NrX2dldHRpbWUgKENMT0NLX01PTk9UT05JQywgJnRzKTsKKworICBpZiAodHZfc2VjKQorICAgICp0dl9zZWMgPSB0cy50dl9zZWM7CisgIGlmICh0dl91c2VjKQorICAgICp0dl91c2VjID0gdHMudHZfbnNlYyAvIDEwMDA7CisjZWxzZQorICBzdHJ1Y3QgdGltZXZhbCB0OworCisgIGdldHRpbWVvZmRheSAoJnQsIE5VTEwpOworCisgIGlmICh0dl9zZWMpCisgICAgKnR2X3NlYyA9IHQudHZfc2VjOworICBpZiAodHZfdXNlYykKKyAgICAqdHZfdXNlYyA9IHQudHZfdXNlYzsKKyNlbmRpZgorfQorCisvKioKKyAqIEdldCBjdXJyZW50IHRpbWUsIGFzIGluIGdldHRpbWVvZmRheSgpLiBOZXZlciB1c2VzIHRoZSBtb25vdG9uaWMKKyAqIGNsb2NrLgorICoKKyAqIEBwYXJhbSB0dl9zZWMgcmV0dXJuIGxvY2F0aW9uIGZvciBudW1iZXIgb2Ygc2Vjb25kcworICogQHBhcmFtIHR2X3VzZWMgcmV0dXJuIGxvY2F0aW9uIGZvciBudW1iZXIgb2YgbWljcm9zZWNvbmRzCisgKi8KK3ZvaWQKK19kYnVzX2dldF9yZWFsX3RpbWUgKGxvbmcgKnR2X3NlYywKKyAgICAgICAgICAgICAgICAgICAgIGxvbmcgKnR2X3VzZWMpCit7CisgIHN0cnVjdCB0aW1ldmFsIHQ7CisKKyAgZ2V0dGltZW9mZGF5ICgmdCwgTlVMTCk7CisKKyAgaWYgKHR2X3NlYykKKyAgICAqdHZfc2VjID0gdC50dl9zZWM7CisgIGlmICh0dl91c2VjKQorICAgICp0dl91c2VjID0gdC50dl91c2VjOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBkaXJlY3Rvcnk7IHN1Y2NlZWRzIGlmIHRoZSBkaXJlY3RvcnkKKyAqIGlzIGNyZWF0ZWQgb3IgYWxyZWFkeSBleGlzdGVkLgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSBkaXJlY3RvcnkgZmlsZW5hbWUKKyAqIEBwYXJhbSBlcnJvciBpbml0aWFsaXplZCBlcnJvciBvYmplY3QKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NyZWF0ZV9kaXJlY3RvcnkgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgZmlsZW5hbWVfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworCisgIGlmIChta2RpciAoZmlsZW5hbWVfYywgMDcwMCkgPCAwKQorICAgIHsKKyAgICAgIGlmIChlcnJubyA9PSBFRVhJU1QpCisgICAgICAgIHJldHVybiBUUlVFOworCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIGRpcmVjdG9yeSAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfYywgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQXBwZW5kcyB0aGUgZ2l2ZW4gZmlsZW5hbWUgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeS4KKyAqCisgKiBAdG9kbyBpdCBtaWdodCBiZSBjdXRlIHRvIGNvbGxhcHNlIG11bHRpcGxlICcvJyBzdWNoIGFzICJmb28vLyIKKyAqIGNvbmNhdCAiLy9iYXIiCisgKgorICogQHBhcmFtIGRpciB0aGUgZGlyZWN0b3J5IG5hbWUKKyAqIEBwYXJhbSBuZXh0X2NvbXBvbmVudCB0aGUgZmlsZW5hbWUKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKERCdXNTdHJpbmcgICAgICAgKmRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKm5leHRfY29tcG9uZW50KQoreworICBkYnVzX2Jvb2xfdCBkaXJfZW5kc19pbl9zbGFzaDsKKyAgZGJ1c19ib29sX3QgZmlsZV9zdGFydHNfd2l0aF9zbGFzaDsKKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRpcikgPT0gMCB8fAorICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKG5leHRfY29tcG9uZW50KSA9PSAwKQorICAgIHJldHVybiBUUlVFOworCisgIGRpcl9lbmRzX2luX3NsYXNoID0gJy8nID09IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkaXIpIC0gMSk7CisKKyAgZmlsZV9zdGFydHNfd2l0aF9zbGFzaCA9ICcvJyA9PSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKG5leHRfY29tcG9uZW50LCAwKTsKKworICBpZiAoZGlyX2VuZHNfaW5fc2xhc2ggJiYgZmlsZV9zdGFydHNfd2l0aF9zbGFzaCkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfc2hvcnRlbiAoZGlyLCAxKTsKKyAgICB9CisgIGVsc2UgaWYgKCEoZGlyX2VuZHNfaW5fc2xhc2ggfHwgZmlsZV9zdGFydHNfd2l0aF9zbGFzaCkpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKGRpciwgJy8nKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gX2RidXNfc3RyaW5nX2NvcHkgKG5leHRfY29tcG9uZW50LCAwLCBkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRpcikpOworfQorCisvKiogbmFub3NlY29uZHMgaW4gYSBzZWNvbmQgKi8KKyNkZWZpbmUgTkFOT1NFQ09ORFNfUEVSX1NFQ09ORCAgICAgICAxMDAwMDAwMDAwCisvKiogbWljcm9zZWNvbmRzIGluIGEgc2Vjb25kICovCisjZGVmaW5lIE1JQ1JPU0VDT05EU19QRVJfU0VDT05EICAgICAgMTAwMDAwMAorLyoqIG1pbGxpc2Vjb25kcyBpbiBhIHNlY29uZCAqLworI2RlZmluZSBNSUxMSVNFQ09ORFNfUEVSX1NFQ09ORCAgICAgIDEwMDAKKy8qKiBuYW5vc2Vjb25kcyBpbiBhIG1pbGxpc2Vjb25kICovCisjZGVmaW5lIE5BTk9TRUNPTkRTX1BFUl9NSUxMSVNFQ09ORCAgMTAwMDAwMAorLyoqIG1pY3Jvc2Vjb25kcyBpbiBhIG1pbGxpc2Vjb25kICovCisjZGVmaW5lIE1JQ1JPU0VDT05EU19QRVJfTUlMTElTRUNPTkQgMTAwMAorCisvKioKKyAqIFNsZWVwcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4KKyAqIEBwYXJhbSBtaWxsaXNlY29uZHMgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcworICovCit2b2lkCitfZGJ1c19zbGVlcF9taWxsaXNlY29uZHMgKGludCBtaWxsaXNlY29uZHMpCit7CisjaWZkZWYgSEFWRV9OQU5PU0xFRVAKKyAgc3RydWN0IHRpbWVzcGVjIHJlcTsKKyAgc3RydWN0IHRpbWVzcGVjIHJlbTsKKworICByZXEudHZfc2VjID0gbWlsbGlzZWNvbmRzIC8gTUlMTElTRUNPTkRTX1BFUl9TRUNPTkQ7CisgIHJlcS50dl9uc2VjID0gKG1pbGxpc2Vjb25kcyAlIE1JTExJU0VDT05EU19QRVJfU0VDT05EKSAqIE5BTk9TRUNPTkRTX1BFUl9NSUxMSVNFQ09ORDsKKyAgcmVtLnR2X3NlYyA9IDA7CisgIHJlbS50dl9uc2VjID0gMDsKKworICB3aGlsZSAobmFub3NsZWVwICgmcmVxLCAmcmVtKSA8IDAgJiYgZXJybm8gPT0gRUlOVFIpCisgICAgcmVxID0gcmVtOworI2VsaWYgZGVmaW5lZCAoSEFWRV9VU0xFRVApCisgIHVzbGVlcCAobWlsbGlzZWNvbmRzICogTUlDUk9TRUNPTkRTX1BFUl9NSUxMSVNFQ09ORCk7CisjZWxzZSAvKiAhIEhBVkVfVVNMRUVQICovCisgIHNsZWVwIChNQVggKG1pbGxpc2Vjb25kcyAvIDEwMDAsIDEpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX2dlbmVyYXRlX3BzZXVkb3JhbmRvbV9ieXRlcyAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBuX2J5dGVzKQoreworICBpbnQgb2xkX2xlbjsKKyAgY2hhciAqcDsKKworICBvbGRfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbGVuZ3RoZW4gKHN0ciwgbl9ieXRlcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHAgPSBfZGJ1c19zdHJpbmdfZ2V0X2RhdGFfbGVuIChzdHIsIG9sZF9sZW4sIG5fYnl0ZXMpOworCisgIF9kYnVzX2dlbmVyYXRlX3BzZXVkb3JhbmRvbV9ieXRlc19idWZmZXIgKHAsIG5fYnl0ZXMpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHJhbmRvbSBieXRlcywKKyAqIHVzaW5nIHRoZSBiZXN0IG1lY2hhbmlzbSB3ZSBjYW4gY29tZSB1cCB3aXRoLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIG5fYnl0ZXMgdGhlIG51bWJlciBvZiByYW5kb20gYnl0ZXMgdG8gYXBwZW5kIHRvIHN0cmluZworICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2J5dGVzIChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIG5fYnl0ZXMpCit7CisgIGludCBvbGRfbGVuOworICBpbnQgZmQ7CisKKyAgLyogRkFMU0UgcmV0dXJuIG1lYW5zICJubyBtZW1vcnkiLCBpZiBpdCBjb3VsZAorICAgKiBtZWFuIHNvbWV0aGluZyBlbHNlIHRoZW4gd2UnZCBuZWVkIHRvIHJldHVybgorICAgKiBhIERCdXNFcnJvci4gU28gd2UgYWx3YXlzIGZhbGwgYmFjayB0byBwc2V1ZG9yYW5kb20KKyAgICogaWYgdGhlIEkvTyBmYWlscy4KKyAgICovCisKKyAgb2xkX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworICBmZCA9IC0xOworCisgIC8qIG5vdGUsIHVyYW5kb20gb24gbGludXggd2lsbCBmYWxsIGJhY2sgdG8gcHNldWRvcmFuZG9tICovCisgIGZkID0gb3BlbiAoIi9kZXYvdXJhbmRvbSIsIE9fUkRPTkxZKTsKKyAgaWYgKGZkIDwgMCkKKyAgICByZXR1cm4gX2RidXNfZ2VuZXJhdGVfcHNldWRvcmFuZG9tX2J5dGVzIChzdHIsIG5fYnl0ZXMpOworCisgIF9kYnVzX3ZlcmJvc2UgKCIvZGV2L3VyYW5kb20gZmQgJWQgb3BlbmVkXG4iLCBmZCk7CisKKyAgaWYgKF9kYnVzX3JlYWQgKGZkLCBzdHIsIG5fYnl0ZXMpICE9IG5fYnl0ZXMpCisgICAgeworICAgICAgX2RidXNfY2xvc2UgKGZkLCBOVUxMKTsKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChzdHIsIG9sZF9sZW4pOworICAgICAgcmV0dXJuIF9kYnVzX2dlbmVyYXRlX3BzZXVkb3JhbmRvbV9ieXRlcyAoc3RyLCBuX2J5dGVzKTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIlJlYWQgJWQgYnl0ZXMgZnJvbSAvZGV2L3VyYW5kb21cbiIsCisgICAgICAgICAgICAgICAgIG5fYnl0ZXMpOworCisgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogRXhpdCB0aGUgcHJvY2VzcywgcmV0dXJuaW5nIHRoZSBnaXZlbiB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gY29kZSB0aGUgZXhpdCBjb2RlCisgKi8KK3ZvaWQKK19kYnVzX2V4aXQgKGludCBjb2RlKQoreworICBfZXhpdCAoY29kZSk7Cit9CisKKy8qKgorICogQSB3cmFwcGVyIGFyb3VuZCBzdHJlcnJvcigpIGJlY2F1c2Ugc29tZSBwbGF0Zm9ybXMKKyAqIG1heSBiZSBsYW1lIGFuZCBub3QgaGF2ZSBzdHJlcnJvcigpLiBBbHNvLCBuZXZlcgorICogcmV0dXJucyBOVUxMLgorICoKKyAqIEBwYXJhbSBlcnJvcl9udW1iZXIgZXJybm8uCisgKiBAcmV0dXJucyBlcnJvciBkZXNjcmlwdGlvbi4KKyAqLworY29uc3QgY2hhcioKK19kYnVzX3N0cmVycm9yIChpbnQgZXJyb3JfbnVtYmVyKQoreworICBjb25zdCBjaGFyICptc2c7CisKKyAgbXNnID0gc3RyZXJyb3IgKGVycm9yX251bWJlcik7CisgIGlmIChtc2cgPT0gTlVMTCkKKyAgICBtc2cgPSAidW5rbm93biI7CisKKyAgcmV0dXJuIG1zZzsKK30KKworLyoqCisgKiBzaWduYWwgKFNJR1BJUEUsIFNJR19JR04pOworICovCit2b2lkCitfZGJ1c19kaXNhYmxlX3NpZ3BpcGUgKHZvaWQpCit7CisgIHNpZ25hbCAoU0lHUElQRSwgU0lHX0lHTik7Cit9CisKKy8qKgorICogU2V0cyB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIGJlIGNsb3NlCisgKiBvbiBleGVjLiBTaG91bGQgYmUgY2FsbGVkIGZvciBhbGwgZmlsZQorICogZGVzY3JpcHRvcnMgaW4gRC1CdXMgY29kZS4KKyAqCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvcgorICovCit2b2lkCitfZGJ1c19mZF9zZXRfY2xvc2Vfb25fZXhlYyAoaW50cHRyX3QgZmQpCit7CisgIGludCB2YWw7CisKKyAgdmFsID0gZmNudGwgKGZkLCBGX0dFVEZELCAwKTsKKworICBpZiAodmFsIDwgMCkKKyAgICByZXR1cm47CisKKyAgdmFsIHw9IEZEX0NMT0VYRUM7CisKKyAgZmNudGwgKGZkLCBGX1NFVEZELCB2YWwpOworfQorCisvKioKKyAqIENsb3NlcyBhIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvcgorICogQHBhcmFtIGVycm9yIGVycm9yIG9iamVjdAorICogQHJldHVybnMgI0ZBTFNFIGlmIGVycm9yIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY2xvc2UgKGludCAgICAgICAgZmQsCisgICAgICAgICAgICAgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyBhZ2FpbjoKKyAgaWYgKGNsb3NlIChmZCkgPCAwKQorICAgIHsKKyAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byBhZ2FpbjsKKworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjbG9zZSBmZCAlZCIsIGZkKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogRHVwbGljYXRlcyBhIGZpbGUgZGVzY3JpcHRvci4gTWFrZXMgc3VyZSB0aGUgZmQgcmV0dXJuZWQgaXMgPj0gMworICogKGkuZS4gYXZvaWRzIHN0ZGluL3N0ZG91dC9zdGRlcnIpLiBTZXRzIE9fQ0xPRVhFQy4KKyAqCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvciB0byBkdXBsaWNhdGUKKyAqIEByZXR1cm5zIGR1cGxpY2F0ZWQgZmlsZSBkZXNjcmlwdG9yCisgKiAqLworaW50CitfZGJ1c19kdXAoaW50ICAgICAgICBmZCwKKyAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICBpbnQgbmV3X2ZkOworCisjaWZkZWYgRl9EVVBGRF9DTE9FWEVDCisgIGRidXNfYm9vbF90IGNsb2V4ZWNfZG9uZTsKKworICBuZXdfZmQgPSBmY250bChmZCwgRl9EVVBGRF9DTE9FWEVDLCAzKTsKKyAgY2xvZXhlY19kb25lID0gbmV3X2ZkID49IDA7CisKKyAgaWYgKG5ld19mZCA8IDAgJiYgZXJybm8gPT0gRUlOVkFMKQorI2VuZGlmCisgICAgeworICAgICAgbmV3X2ZkID0gZmNudGwoZmQsIEZfRFVQRkQsIDMpOworICAgIH0KKworICBpZiAobmV3X2ZkIDwgMCkgeworCisgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZHVwbGljYXRlIGZkICVkIiwgZmQpOworICAgIHJldHVybiAtMTsKKyAgfQorCisjaWZkZWYgRl9EVVBGRF9DTE9FWEVDCisgIGlmICghY2xvZXhlY19kb25lKQorI2VuZGlmCisgICAgeworICAgICAgX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMobmV3X2ZkKTsKKyAgICB9CisKKyAgcmV0dXJuIG5ld19mZDsKK30KKworLyoqCisgKiBTZXRzIGEgZmlsZSBkZXNjcmlwdG9yIHRvIGJlIG5vbmJsb2NraW5nLgorICoKKyAqIEBwYXJhbSBmZCB0aGUgZmlsZSBkZXNjcmlwdG9yLgorICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgb2YgZXJyb3IgbG9jYXRpb24uCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc2V0X2ZkX25vbmJsb2NraW5nIChpbnQgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgaW50IHZhbDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICB2YWwgPSBmY250bCAoZmQsIEZfR0VURkwsIDApOworICBpZiAodmFsIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCBmbGFncyBmcm9tIGZpbGUgZGVzY3JpcHRvciAlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGZkLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gZ2V0IGZsYWdzIGZvciBmZCAlZDogJXNcbiIsIGZkLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChmY250bCAoZmQsIEZfU0VURkwsIHZhbCB8IE9fTk9OQkxPQ0spIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCBub25ibG9ja2luZyBmbGFnIG9mIGZpbGUgZGVzY3JpcHRvciAlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGZkLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gc2V0IGZkICVkIG5vbmJsb2NraW5nOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIGZkLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBPbiBHTlUgbGliYyBzeXN0ZW1zLCBwcmludCBhIGNydWRlIGJhY2t0cmFjZSB0byBzdGRlcnIuICBPbiBvdGhlcgorICogc3lzdGVtcywgcHJpbnQgIm5vIGJhY2t0cmFjZSBzdXBwb3J0IiBhbmQgYmxvY2sgZm9yIHBvc3NpYmxlIGdkYgorICogYXR0YWNobWVudCBpZiBhbiBhcHByb3ByaWF0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQuCisgKi8KK3ZvaWQKK19kYnVzX3ByaW50X2JhY2t0cmFjZSAodm9pZCkKK3sKKyNpZiBkZWZpbmVkIChIQVZFX0JBQ0tUUkFDRSkgJiYgZGVmaW5lZCAoREJVU19CVUlMVF9SX0RZTkFNSUMpCisgIHZvaWQgKmJ0WzUwMF07CisgIGludCBidF9zaXplOworICBpbnQgaTsKKyAgY2hhciAqKnN5bXM7CisKKyAgYnRfc2l6ZSA9IGJhY2t0cmFjZSAoYnQsIDUwMCk7CisKKyAgc3ltcyA9IGJhY2t0cmFjZV9zeW1ib2xzIChidCwgYnRfc2l6ZSk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgYnRfc2l6ZSkKKyAgICB7CisgICAgICAvKiBkb24ndCB1c2UgZGJ1c193YXJuIHNpbmNlIGl0IGNhbiBfZGJ1c19hYm9ydCgpICovCisgICAgICBmcHJpbnRmIChzdGRlcnIsICIgICVzXG4iLCBzeW1zW2ldKTsKKyAgICAgICsraTsKKyAgICB9CisgIGZmbHVzaCAoc3RkZXJyKTsKKworICBmcmVlIChzeW1zKTsKKyNlbGlmIGRlZmluZWQgKEhBVkVfQkFDS1RSQUNFKSAmJiAhIGRlZmluZWQgKERCVVNfQlVJTFRfUl9EWU5BTUlDKQorICBmcHJpbnRmIChzdGRlcnIsICIgIEQtQnVzIG5vdCBidWlsdCB3aXRoIC1yZHluYW1pYyBzbyB1bmFibGUgdG8gcHJpbnQgYSBiYWNrdHJhY2VcbiIpOworI2Vsc2UKKyAgZnByaW50ZiAoc3RkZXJyLCAiICBELUJ1cyBub3QgY29tcGlsZWQgd2l0aCBiYWNrdHJhY2Ugc3VwcG9ydCBzbyB1bmFibGUgdG8gcHJpbnQgYSBiYWNrdHJhY2VcbiIpOworI2VuZGlmCit9CisKKy8qKgorICogQ3JlYXRlcyBhIGZ1bGwtZHVwbGV4IHBpcGUgKGFzIGluIHNvY2tldHBhaXIoKSkuCisgKiBTZXRzIGJvdGggZW5kcyBvZiB0aGUgcGlwZSBub25ibG9ja2luZy4KKyAqCisgKiBNYXJrcyBib3RoIGZpbGUgZGVzY3JpcHRvcnMgYXMgY2xvc2Utb24tZXhlYworICoKKyAqIEBwYXJhbSBmZDEgcmV0dXJuIGxvY2F0aW9uIGZvciBvbmUgZW5kCisgKiBAcGFyYW0gZmQyIHJldHVybiBsb2NhdGlvbiBmb3IgdGhlIG90aGVyIGVuZAorICogQHBhcmFtIGJsb2NraW5nICNUUlVFIGlmIHBpcGUgc2hvdWxkIGJlIGJsb2NraW5nCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZSAoaWYgZXJyb3IgaXMgc2V0KQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZnVsbF9kdXBsZXhfcGlwZSAoaW50ICAgICAgICAqZmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAqZmQyLAorICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgYmxvY2tpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyNpZmRlZiBIQVZFX1NPQ0tFVFBBSVIKKyAgaW50IGZkc1syXTsKKyAgaW50IHJldHZhbDsKKworI2lmZGVmIFNPQ0tfQ0xPRVhFQworICBkYnVzX2Jvb2xfdCBjbG9leGVjX2RvbmU7CisKKyAgcmV0dmFsID0gc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTXxTT0NLX0NMT0VYRUMsIDAsIGZkcyk7CisgIGNsb2V4ZWNfZG9uZSA9IHJldHZhbCA+PSAwOworCisgIGlmIChyZXR2YWwgPCAwICYmIGVycm5vID09IEVJTlZBTCkKKyNlbmRpZgorICAgIHsKKyAgICAgIHJldHZhbCA9IHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0sIDAsIGZkcyk7CisgICAgfQorCisgIGlmIChyZXR2YWwgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY3JlYXRlIGZ1bGwtZHVwbGV4IHBpcGUiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyNpZmRlZiBTT0NLX0NMT0VYRUMKKyAgaWYgKCFjbG9leGVjX2RvbmUpCisjZW5kaWYKKyAgICB7CisgICAgICBfZGJ1c19mZF9zZXRfY2xvc2Vfb25fZXhlYyAoZmRzWzBdKTsKKyAgICAgIF9kYnVzX2ZkX3NldF9jbG9zZV9vbl9leGVjIChmZHNbMV0pOworICAgIH0KKworICBpZiAoIWJsb2NraW5nICYmCisgICAgICAoIV9kYnVzX3NldF9mZF9ub25ibG9ja2luZyAoZmRzWzBdLCBOVUxMKSB8fAorICAgICAgICFfZGJ1c19zZXRfZmRfbm9uYmxvY2tpbmcgKGZkc1sxXSwgTlVMTCkpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2V0IGZ1bGwtZHVwbGV4IHBpcGUgbm9uYmxvY2tpbmciKTsKKworICAgICAgX2RidXNfY2xvc2UgKGZkc1swXSwgTlVMTCk7CisgICAgICBfZGJ1c19jbG9zZSAoZmRzWzFdLCBOVUxMKTsKKworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAqZmQxID0gZmRzWzBdOworICAqZmQyID0gZmRzWzFdOworCisgIF9kYnVzX3ZlcmJvc2UgKCJmdWxsLWR1cGxleCBwaXBlICVkIDwtPiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgKmZkMSwgKmZkMik7CisKKyAgcmV0dXJuIFRSVUU7CisjZWxzZQorICBfZGJ1c193YXJuICgiX2RidXNfZnVsbF9kdXBsZXhfcGlwZSgpIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIE9TXG4iKTsKKyAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICJfZGJ1c19mdWxsX2R1cGxleF9waXBlKCkgbm90IGltcGxlbWVudGVkIG9uIHRoaXMgT1MiKTsKKyAgcmV0dXJuIEZBTFNFOworI2VuZGlmCit9CisKKy8qKgorICogTWVhc3VyZSB0aGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiBmb3JtYXQgc3RyaW5nIGFuZCBhcmd1bWVudHMsCisgKiBub3QgaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyBudWwuCisgKgorICogQHBhcmFtIGZvcm1hdCBhIHByaW50Zi1zdHlsZSBmb3JtYXQgc3RyaW5nCisgKiBAcGFyYW0gYXJncyBhcmd1bWVudHMgZm9yIHRoZSBmb3JtYXQgc3RyaW5nCisgKiBAcmV0dXJucyBsZW5ndGggb2YgdGhlIGdpdmVuIGZvcm1hdCBzdHJpbmcgYW5kIGFyZ3MsIG9yIC0xIGlmIG5vIG1lbW9yeQorICovCitpbnQKK19kYnVzX3ByaW50Zl9zdHJpbmdfdXBwZXJfYm91bmQgKGNvbnN0IGNoYXIgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgICAgIGFyZ3MpCit7CisgIGNoYXIgc3RhdGljX2J1ZlsxMDI0XTsKKyAgaW50IGJ1ZnNpemUgPSBzaXplb2YgKHN0YXRpY19idWYpOworICBpbnQgbGVuOworCisgIGxlbiA9IHZzbnByaW50ZiAoc3RhdGljX2J1ZiwgYnVmc2l6ZSwgZm9ybWF0LCBhcmdzKTsKKworICAvKiBJZiB2c25wcmludGYoKSByZXR1cm5lZCBub24tbmVnYXRpdmUsIHRoZW4gZWl0aGVyIHRoZSBzdHJpbmcgZml0cyBpbgorICAgKiBzdGF0aWNfYnVmLCBvciB0aGlzIE9TIGhhcyB0aGUgUE9TSVggYW5kIEM5OSBiZWhhdmlvdXIgd2hlcmUgdnNucHJpbnRmCisgICAqIHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgd2VyZSBuZWVkZWQsIG9yIHRoaXMgT1MgcmV0dXJucyB0aGUKKyAgICogdHJ1bmNhdGVkIGxlbmd0aC4KKyAgICoKKyAgICogV2UgaWdub3JlIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHNucHJpbnRmIG1pZ2h0IGp1c3QgaWdub3JlIHRoZSBsZW5ndGggYW5kCisgICAqIG92ZXJydW4gdGhlIGJ1ZmZlciAoNjQtYml0IFNvbGFyaXMgNyksIGJlY2F1c2UgdGhhdCdzIHBhdGhvbG9naWNhbC4KKyAgICogSWYgeW91ciBsaWJjIGlzIHJlYWxseSB0aGF0IGJhZCwgY29tZSBiYWNrIHdoZW4geW91IGhhdmUgYSBiZXR0ZXIgb25lLiAqLworICBpZiAobGVuID09IGJ1ZnNpemUpCisgICAgeworICAgICAgLyogVGhpcyBjb3VsZCBiZSB0aGUgdHJ1bmNhdGVkIGxlbmd0aCAoVHJ1NjQgYW5kIElSSVggaGF2ZSB0aGlzIGJ1ZyksCisgICAgICAgKiBvciB0aGUgcmVhbCBsZW5ndGggY291bGQgYmUgY29pbmNpZGVudGFsbHkgdGhlIHNhbWUuIFdoaWNoIGlzIGl0PworICAgICAgICogSWYgdnNucHJpbnRmIHJldHVybnMgdGhlIHRydW5jYXRlZCBsZW5ndGgsIHdlJ2xsIGdvIHRvIHRoZSBzbG93CisgICAgICAgKiBwYXRoLiAqLworICAgICAgaWYgKHZzbnByaW50ZiAoc3RhdGljX2J1ZiwgMSwgZm9ybWF0LCBhcmdzKSA9PSAxKQorICAgICAgICBsZW4gPSAtMTsKKyAgICB9CisKKyAgLyogSWYgdnNucHJpbnRmKCkgcmV0dXJuZWQgbmVnYXRpdmUsIHdlIGhhdmUgdG8gZG8gbW9yZSB3b3JrLgorICAgKiBIUC1VWCByZXR1cm5zIG5lZ2F0aXZlLiAqLworICB3aGlsZSAobGVuIDwgMCkKKyAgICB7CisgICAgICBjaGFyICpidWY7CisKKyAgICAgIGJ1ZnNpemUgKj0gMjsKKworICAgICAgYnVmID0gZGJ1c19tYWxsb2MgKGJ1ZnNpemUpOworCisgICAgICBpZiAoYnVmID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKworICAgICAgbGVuID0gdnNucHJpbnRmIChidWYsIGJ1ZnNpemUsIGZvcm1hdCwgYXJncyk7CisgICAgICBkYnVzX2ZyZWUgKGJ1Zik7CisKKyAgICAgIC8qIElmIHRoZSByZXBvcnRlZCBsZW5ndGggaXMgZXhhY3RseSB0aGUgYnVmZmVyIHNpemUsIHJvdW5kIHVwIHRvIHRoZQorICAgICAgICogbmV4dCBzaXplLCBpbiBjYXNlIHZzbnByaW50ZiBoYXMgYmVlbiByZXR1cm5pbmcgdGhlIHRydW5jYXRlZAorICAgICAgICogbGVuZ3RoICovCisgICAgICBpZiAobGVuID09IGJ1ZnNpemUpCisgICAgICAgIGxlbiA9IC0xOworICAgIH0KKworICByZXR1cm4gbGVuOworfQorCisvKioKKyAqIEdldHMgdGhlIHRlbXBvcmFyeSBmaWxlcyBkaXJlY3RvcnkgYnkgaW5zcGVjdGluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgKiBUTVBESVIsIFRNUCwgYW5kIFRFTVAgaW4gdGhhdCBvcmRlci4gSWYgbm9uZSBvZiB0aG9zZSBhcmUgc2V0ICIvdG1wIiBpcyByZXR1cm5lZAorICoKKyAqIEByZXR1cm5zIGxvY2F0aW9uIG9mIHRlbXAgZGlyZWN0b3J5CisgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c19nZXRfdG1wZGlyKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBjaGFyKiB0bXBkaXIgPSBOVUxMOworCisgIGlmICh0bXBkaXIgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBUTVBESVIgaXMgd2hhdCBnbGliYyB1c2VzLCB0aGVuCisgICAgICAgKiBnbGliYyBmYWxscyBiYWNrIHRvIHRoZSBQX3RtcGRpciBtYWNybyB3aGljaAorICAgICAgICoganVzdCBleHBhbmRzIHRvICIvdG1wIgorICAgICAgICovCisgICAgICBpZiAodG1wZGlyID09IE5VTEwpCisgICAgICAgIHRtcGRpciA9IGdldGVudigiVE1QRElSIik7CisKKyAgICAgIC8qIFRoZXNlIHR3byBlbnYgdmFyaWFibGVzIGFyZSBwcm9iYWJseQorICAgICAgICogYnJva2VuLCBidXQgbWF5YmUgc29tZSBPUyB1c2VzIHRoZW0/CisgICAgICAgKi8KKyAgICAgIGlmICh0bXBkaXIgPT0gTlVMTCkKKyAgICAgICAgdG1wZGlyID0gZ2V0ZW52KCJUTVAiKTsKKyAgICAgIGlmICh0bXBkaXIgPT0gTlVMTCkKKyAgICAgICAgdG1wZGlyID0gZ2V0ZW52KCJURU1QIik7CisKKyAgICAgIC8qIEFuZCB0aGlzIGlzIHRoZSBzYW5lIGZhbGxiYWNrLiAqLworICAgICAgaWYgKHRtcGRpciA9PSBOVUxMKQorICAgICAgICB0bXBkaXIgPSAiL3RtcCI7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCh0bXBkaXIgIT0gTlVMTCk7CisKKyAgcmV0dXJuIHRtcGRpcjsKK30KKworLyoqCisgKiBFeGVjdXRlIGEgc3VicHJvY2VzcywgcmV0dXJuaW5nIHVwIHRvIDEwMjQgYnl0ZXMgb2Ygb3V0cHV0CisgKiBpbnRvIEBwIHJlc3VsdC4KKyAqCisgKiBJZiBzdWNjZXNzZnVsLCByZXR1cm5zICNUUlVFIGFuZCBhcHBlbmRzIHRoZSBvdXRwdXQgdG8gQHAKKyAqIHJlc3VsdC4gSWYgYSBmYWlsdXJlIGhhcHBlbnMsIHJldHVybnMgI0ZBTFNFIGFuZAorICogc2V0cyBhbiBlcnJvciBpbiBAcCBlcnJvci4KKyAqCisgKiBAbm90ZSBJdCdzIG5vdCBhbiBlcnJvciBpZiB0aGUgc3VicHJvY2VzcyB0ZXJtaW5hdGVzIG5vcm1hbGx5CisgKiB3aXRob3V0IHdyaXRpbmcgYW55IGRhdGEgdG8gc3Rkb3V0LiBWZXJpZnkgdGhlIEBwIHJlc3VsdCBsZW5ndGgKKyAqIGJlZm9yZSBhbmQgYWZ0ZXIgdGhpcyBmdW5jdGlvbiBjYWxsIHRvIGNvdmVyIHRoaXMgY2FzZS4KKyAqCisgKiBAcGFyYW0gcHJvZ25hbWUgaW5pdGlhbCBwYXRoIHRvIGV4ZWMgKG1heSBvciBtYXkgbm90IGJlIGFic29sdXRlKQorICogQHBhcmFtIHBhdGhfZmFsbGJhY2sgaWYgJVRSVUUsIHNlYXJjaCBQQVRIIGZvciBleGVjdXRhYmxlCisgKiBAcGFyYW0gYXJndiBOVUxMLXRlcm1pbmF0ZWQgbGlzdCBvZiBhcmd1bWVudHMKKyAqIEBwYXJhbSByZXN1bHQgYSBEQnVzU3RyaW5nIHdoZXJlIHRoZSBvdXRwdXQgY2FuIGJlIGFwcGVuZAorICogQHBhcmFtIGVycm9yIGEgREJ1c0Vycm9yIHRvIHN0b3JlIHRoZSBlcnJvciBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBpZiBhbiBlcnJvciBoYXBwZW5lZAorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK19yZWFkX3N1YnByb2Nlc3NfbGluZV9hcmd2IChjb25zdCBjaGFyICpwcm9ncGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCBwYXRoX2ZhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKiBjb25zdCAqYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICpyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIGludCByZXN1bHRfcGlwZVsyXSA9IHsgLTEsIC0xIH07CisgIGludCBlcnJvcnNfcGlwZVsyXSA9IHsgLTEsIC0xIH07CisgIHBpZF90IHBpZDsKKyAgaW50IHJldDsKKyAgaW50IHN0YXR1czsKKyAgaW50IG9yaWdfbGVuOworCisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgc2lnc2V0X3QgbmV3X3NldCwgb2xkX3NldDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgLyogV2UgbmVlZCB0byBibG9jayBhbnkgZXhpc3RpbmcgaGFuZGxlcnMgZm9yIFNJR0NITEQgdGVtcG9yYXJpbHk7IHRoZXkKKyAgICogd2lsbCBjYXVzZSB3YWl0cGlkKCkgYmVsb3cgdG8gZmFpbC4KKyAgICogaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjEzNDcKKyAgICovCisgIHNpZ2VtcHR5c2V0ICgmbmV3X3NldCk7CisgIHNpZ2FkZHNldCAoJm5ld19zZXQsIFNJR0NITEQpOworICBzaWdwcm9jbWFzayAoU0lHX0JMT0NLLCAmbmV3X3NldCwgJm9sZF9zZXQpOworCisgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHJlc3VsdCk7CisKKyNkZWZpbmUgUkVBRF9FTkQgICAgICAgIDAKKyNkZWZpbmUgV1JJVEVfRU5EICAgICAgIDEKKyAgaWYgKHBpcGUgKHJlc3VsdF9waXBlKSA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgYSBwaXBlIHRvIGNhbGwgJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBwcm9ncGF0aCwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGNyZWF0ZSBhIHBpcGUgdG8gY2FsbCAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBwcm9ncGF0aCwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIGlmIChwaXBlIChlcnJvcnNfcGlwZSkgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIGEgcGlwZSB0byBjYWxsICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgcHJvZ3BhdGgsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBjcmVhdGUgYSBwaXBlIHRvIGNhbGwgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgcHJvZ3BhdGgsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHBpZCA9IGZvcmsgKCk7CisgIGlmIChwaWQgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZm9yaygpIHRvIGNhbGwgJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBwcm9ncGF0aCwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGZvcmsoKSB0byBjYWxsICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHByb2dwYXRoLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAocGlkID09IDApCisgICAgeworICAgICAgLyogY2hpbGQgcHJvY2VzcyAqLworICAgICAgaW50IGZkOworCisgICAgICBmZCA9IG9wZW4gKCIvZGV2L251bGwiLCBPX1JEV1IpOworICAgICAgaWYgKGZkID09IC0xKQorICAgICAgICAvKiBodWg/ISBjYW4ndCBvcGVuIC9kZXYvbnVsbD8gKi8KKyAgICAgICAgX2V4aXQgKDEpOworCisgICAgICBfZGJ1c192ZXJib3NlICgiL2Rldi9udWxsIGZkICVkIG9wZW5lZFxuIiwgZmQpOworCisgICAgICAvKiBzZXQtdXAgc3RkWFhYICovCisgICAgICBjbG9zZSAocmVzdWx0X3BpcGVbUkVBRF9FTkRdKTsKKyAgICAgIGNsb3NlIChlcnJvcnNfcGlwZVtSRUFEX0VORF0pOworICAgICAgY2xvc2UgKDApOyAgICAgICAgICAgICAgICAvKiBjbG9zZSBzdGRpbiAqLworICAgICAgY2xvc2UgKDEpOyAgICAgICAgICAgICAgICAvKiBjbG9zZSBzdGRvdXQgKi8KKyAgICAgIGNsb3NlICgyKTsgICAgICAgICAgICAgICAgLyogY2xvc2Ugc3RkZXJyICovCisKKyAgICAgIGlmIChkdXAyIChmZCwgMCkgPT0gLTEpCisgICAgICAgIF9leGl0ICgxKTsKKyAgICAgIGlmIChkdXAyIChyZXN1bHRfcGlwZVtXUklURV9FTkRdLCAxKSA9PSAtMSkKKyAgICAgICAgX2V4aXQgKDEpOworICAgICAgaWYgKGR1cDIgKGVycm9yc19waXBlW1dSSVRFX0VORF0sIDIpID09IC0xKQorICAgICAgICBfZXhpdCAoMSk7CisKKyAgICAgIF9kYnVzX2Nsb3NlX2FsbCAoKTsKKworICAgICAgc2lncHJvY21hc2sgKFNJR19TRVRNQVNLLCAmb2xkX3NldCwgTlVMTCk7CisKKyAgICAgIC8qIElmIGl0IGxvb2tzIGZ1bGx5LXF1YWxpZmllZCwgdHJ5IGV4ZWN2IGZpcnN0ICovCisgICAgICBpZiAocHJvZ3BhdGhbMF0gPT0gJy8nKQorICAgICAgICB7CisgICAgICAgICAgZXhlY3YgKHByb2dwYXRoLCBhcmd2KTsKKyAgICAgICAgICAvKiBPaywgdGhhdCBmYWlsZWQuICBOb3cgaWYgcGF0aF9mYWxsYmFjayBpcyBnaXZlbiwgbGV0J3MKKyAgICAgICAgICAgKiB0cnkgdW5xdWFsaWZpZWQuICBUaGlzIGlzIG1vc3RseSBhIGhhY2sgdG8gd29yaworICAgICAgICAgICAqIGFyb3VuZCBzeXN0ZW1zIHdoaWNoIHNoaXAgZGJ1cy1sYXVuY2ggaW4gL3Vzci9iaW4KKyAgICAgICAgICAgKiBidXQgZXZlcnl0aGluZyBlbHNlIGluIC9iaW4gKGJlY2F1c2UgZGJ1cy1sYXVuY2gKKyAgICAgICAgICAgKiBkZXBlbmRzIG9uIFgxMSkuCisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKHBhdGhfZmFsbGJhY2spCisgICAgICAgICAgICAvKiBXZSBtdXN0IGhhdmUgYSBzbGFzaCwgYmVjYXVzZSB3ZSBjaGVja2VkIGFib3ZlICovCisgICAgICAgICAgICBleGVjdnAgKHN0cnJjaHIgKHByb2dwYXRoLCAnLycpKzEsIGFyZ3YpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGV4ZWN2cCAocHJvZ3BhdGgsIGFyZ3YpOworCisgICAgICAvKiBzdGlsbCBub3RoaW5nLCB3ZSBmYWlsZWQgKi8KKyAgICAgIF9leGl0ICgxKTsKKyAgICB9CisKKyAgLyogcGFyZW50IHByb2Nlc3MgKi8KKyAgY2xvc2UgKHJlc3VsdF9waXBlW1dSSVRFX0VORF0pOworICBjbG9zZSAoZXJyb3JzX3BpcGVbV1JJVEVfRU5EXSk7CisgIHJlc3VsdF9waXBlW1dSSVRFX0VORF0gPSAtMTsKKyAgZXJyb3JzX3BpcGVbV1JJVEVfRU5EXSA9IC0xOworCisgIHJldCA9IDA7CisgIGRvCisgICAgeworICAgICAgcmV0ID0gX2RidXNfcmVhZCAocmVzdWx0X3BpcGVbUkVBRF9FTkRdLCByZXN1bHQsIDEwMjQpOworICAgIH0KKyAgd2hpbGUgKHJldCA+IDApOworCisgIC8qIHJlYXAgdGhlIGNoaWxkIHByb2Nlc3MgdG8gYXZvaWQgaXQgbGluZ2VyaW5nIGFzIHpvbWJpZSAqLworICBkbworICAgIHsKKyAgICAgIHJldCA9IHdhaXRwaWQgKHBpZCwgJnN0YXR1cywgMCk7CisgICAgfQorICB3aGlsZSAocmV0ID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKKworICAvKiBXZSBzdWNjZWVkZWQgaWYgdGhlIHByb2Nlc3MgZXhpdGVkIHdpdGggc3RhdHVzIDAgYW5kCisgICAgIGFueXRoaW5nIHdhcyByZWFkICovCisgIGlmICghV0lGRVhJVEVEIChzdGF0dXMpIHx8IFdFWElUU1RBVFVTIChzdGF0dXMpICE9IDAgKQorICAgIHsKKyAgICAgIC8qIFRoZSBwcm9jZXNzIGVuZGVkIHdpdGggZXJyb3IgKi8KKyAgICAgIERCdXNTdHJpbmcgZXJyb3JfbWVzc2FnZTsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZlcnJvcl9tZXNzYWdlKSkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICByZXQgPSAwOworICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgIHJldCA9IF9kYnVzX3JlYWQgKGVycm9yc19waXBlW1JFQURfRU5EXSwgJmVycm9yX21lc3NhZ2UsIDEwMjQpOworICAgICAgICB9CisgICAgICB3aGlsZSAocmV0ID4gMCk7CisKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChyZXN1bHQsIG9yaWdfbGVuKTsKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmVycm9yX21lc3NhZ2UpID4gMCkKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0VYRUNfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzIHRlcm1pbmF0ZWQgYWJub3JtYWxseSB3aXRoIHRoZSBmb2xsb3dpbmcgZXJyb3I6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2dwYXRoLCBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKCZlcnJvcl9tZXNzYWdlKSk7CisgICAgICBlbHNlCisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9FWEVDX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcyB0ZXJtaW5hdGVkIGFibm9ybWFsbHkgd2l0aG91dCBhbnkgZXJyb3IgbWVzc2FnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncGF0aCk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgc2lncHJvY21hc2sgKFNJR19TRVRNQVNLLCAmb2xkX3NldCwgTlVMTCk7CisKKyAgaWYgKHJldHZhbCkKKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgZWxzZQorICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKworICBpZiAocmVzdWx0X3BpcGVbMF0gIT0gLTEpCisgICAgY2xvc2UgKHJlc3VsdF9waXBlWzBdKTsKKyAgaWYgKHJlc3VsdF9waXBlWzFdICE9IC0xKQorICAgIGNsb3NlIChyZXN1bHRfcGlwZVsxXSk7CisgIGlmIChlcnJvcnNfcGlwZVswXSAhPSAtMSkKKyAgICBjbG9zZSAoZXJyb3JzX3BpcGVbMF0pOworICBpZiAoZXJyb3JzX3BpcGVbMV0gIT0gLTEpCisgICAgY2xvc2UgKGVycm9yc19waXBlWzFdKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgYSBuZXcgc2Vzc2lvbiBidXMuCisgKgorICogSWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyAjVFJVRSBhbmQgYXBwZW5kcyB0aGUgYWRkcmVzcyB0byBAcAorICogYWRkcmVzcy4gSWYgYSBmYWlsdXJlIGhhcHBlbnMsIHJldHVybnMgI0ZBTFNFIGFuZAorICogc2V0cyBhbiBlcnJvciBpbiBAcCBlcnJvci4KKyAqCisgKiBAcGFyYW0gYWRkcmVzcyBhIERCdXNTdHJpbmcgd2hlcmUgdGhlIGFkZHJlc3MgY2FuIGJlIHN0b3JlZAorICogQHBhcmFtIGVycm9yIGEgREJ1c0Vycm9yIHRvIHN0b3JlIHRoZSBlcnJvciBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBpZiBhbiBlcnJvciBoYXBwZW5lZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X2F1dG9sYXVuY2hfYWRkcmVzcyAoY29uc3QgY2hhciAqc2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisjaWZkZWYgREJVU19FTkFCTEVfWDExX0FVVE9MQVVOQ0gKKyAgLyogUGVyZm9ybSBYMTEtYmFzZWQgYXV0b2xhdW5jaC4gKFdlIGFsc28gc3VwcG9ydCBsYXVuY2hkLWJhc2VkIGF1dG9sYXVuY2gsCisgICAqIGJ1dCB0aGF0J3MgZG9uZSBlbHNld2hlcmUsIGFuZCBpZiBpdCB3b3JrZWQsIHRoaXMgZnVuY3Rpb24gd291bGRuJ3QKKyAgICogYmUgY2FsbGVkLikgKi8KKyAgY29uc3QgY2hhciAqZGlzcGxheTsKKyAgc3RhdGljIGNoYXIgKmFyZ3ZbNl07CisgIGludCBpOworICBEQnVzU3RyaW5nIHV1aWQ7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBpZiAoX2RidXNfY2hlY2tfc2V0dWlkICgpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gYXV0b2xhdW5jaCB3aGVuIHNldHVpZCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgLyogZmQubyAjMTk5OTc6IGlmICRESVNQTEFZIGlzbid0IHNldCB0byBzb21ldGhpbmcgdXNlZnVsLCB0aGVuCisgICAqIGRidXMtbGF1bmNoLXgxMSBpcyBqdXN0IGdvaW5nIHRvIGZhaWwuIFJhdGhlciB0aGFuIHRyeWluZyB0bworICAgKiBydW4gaXQsIHdlIG1pZ2h0IGFzIHdlbGwgYmFpbCBvdXQgZWFybHkgd2l0aCBhIG5pY2UgZXJyb3IuICovCisgIGRpc3BsYXkgPSBfZGJ1c19nZXRlbnYgKCJESVNQTEFZIik7CisKKyAgaWYgKGRpc3BsYXkgPT0gTlVMTCB8fCBkaXNwbGF5WzBdID09ICdcMCcpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKGVycm9yLCBEQlVTX0VSUk9SX05PVF9TVVBQT1JURUQsCisgICAgICAgICAgIlVuYWJsZSB0byBhdXRvbGF1bmNoIGEgZGJ1cy1kYWVtb24gd2l0aG91dCBhICRESVNQTEFZIGZvciBYMTEiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnV1aWQpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19nZXRfbG9jYWxfbWFjaGluZV91dWlkX2VuY29kZWQgKCZ1dWlkKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaSA9IDA7CisgIGFyZ3ZbaV0gPSAiZGJ1cy1sYXVuY2giOworICArK2k7CisgIGFyZ3ZbaV0gPSAiLS1hdXRvbGF1bmNoIjsKKyAgKytpOworICBhcmd2W2ldID0gX2RidXNfc3RyaW5nX2dldF9kYXRhICgmdXVpZCk7CisgICsraTsKKyAgYXJndltpXSA9ICItLWJpbmFyeS1zeW50YXgiOworICArK2k7CisgIGFyZ3ZbaV0gPSAiLS1jbG9zZS1zdGRlcnIiOworICArK2k7CisgIGFyZ3ZbaV0gPSBOVUxMOworICArK2k7CisKKyAgX2RidXNfYXNzZXJ0IChpID09IF9EQlVTX05fRUxFTUVOVFMgKGFyZ3YpKTsKKworICByZXR2YWwgPSBfcmVhZF9zdWJwcm9jZXNzX2xpbmVfYXJndiAoREJVU19CSU5ESVIgIi9kYnVzLWxhdW5jaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndiwgYWRkcmVzcywgZXJyb3IpOworCisgb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnV1aWQpOworICByZXR1cm4gcmV0dmFsOworI2Vsc2UKKyAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKGVycm9yLCBEQlVTX0VSUk9SX05PVF9TVVBQT1JURUQsCisgICAgICAiVXNpbmcgWDExIGZvciBkYnVzLWRhZW1vbiBhdXRvbGF1bmNoIHdhcyBkaXNhYmxlZCBhdCBjb21waWxlIHRpbWUsICIKKyAgICAgICJzZXQgeW91ciBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MgaW5zdGVhZCIpOworICByZXR1cm4gRkFMU0U7CisjZW5kaWYKK30KKworLyoqCisgKiBSZWFkcyB0aGUgdXVpZCBvZiB0aGUgbWFjaGluZSB3ZSdyZSBydW5uaW5nIG9uIGZyb20KKyAqIHRoZSBkYnVzIGNvbmZpZ3VyYXRpb24uIE9wdGlvbmFsbHkgdHJ5IHRvIGNyZWF0ZSBpdAorICogKG9ubHkgcm9vdCBjYW4gZG8gdGhpcyB1c3VhbGx5KS4KKyAqCisgKiBPbiBVTklYLCByZWFkcyBhIGZpbGUgdGhhdCBnZXRzIGNyZWF0ZWQgYnkgZGJ1cy11dWlkZ2VuCisgKiBpbiBhIHBvc3QtaW5zdGFsbCBzY3JpcHQuIE9uIFdpbmRvd3MsIGlmIHRoZXJlJ3MgYSBzdGFuZGFyZAorICogbWFjaGluZSB1dWlkIHdlIGNvdWxkIGp1c3QgdXNlIHRoYXQsIGJ1dCBJIGNhbid0IGZpbmQgb25lCisgKiB3aXRoIHRoZSByaWdodCBwcm9wZXJ0aWVzICh0aGUgaGFyZHdhcmUgcHJvZmlsZSBndWlkIGNhbiBjaGFuZ2UKKyAqIHdpdGhvdXQgcmVib290aW5nIEkgYmVsaWV2ZSkuIElmIHRoZXJlJ3Mgbm8gc3RhbmRhcmQgb25lCisgKiB3ZSBtaWdodCB3YW50IHRvIHVzZSB0aGUgcmVnaXN0cnkgaW5zdGVhZCBvZiBhIGZpbGUgZm9yCisgKiB0aGlzLCBhbmQgSSdtIG5vdCBzdXJlIGhvdyB3ZSdkIGVuc3VyZSB0aGUgdXVpZCBnZXRzIGNyZWF0ZWQuCisgKgorICogQHBhcmFtIG1hY2hpbmVfaWQgZ3VpZCB0byBpbml0IHdpdGggdGhlIG1hY2hpbmUncyB1dWlkCisgKiBAcGFyYW0gY3JlYXRlX2lmX25vdF9mb3VuZCB0cnkgdG8gY3JlYXRlIHRoZSB1dWlkIGlmIGl0IGRvZXNuJ3QgZXhpc3QKKyAqIEBwYXJhbSBlcnJvciB0aGUgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlIGVycm9yIGlzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfcmVhZF9sb2NhbF9tYWNoaW5lX3V1aWQgKERCdXNHVUlEICAgKm1hY2hpbmVfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgY3JlYXRlX2lmX25vdF9mb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBmaWxlbmFtZTsKKyAgZGJ1c19ib29sX3QgYjsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmZpbGVuYW1lLCBEQlVTX01BQ0hJTkVfVVVJRF9GSUxFKTsKKworICBiID0gX2RidXNfcmVhZF91dWlkX2ZpbGUgKCZmaWxlbmFtZSwgbWFjaGluZV9pZCwgY3JlYXRlX2lmX25vdF9mb3VuZCwgZXJyb3IpOworICBpZiAoYikKKyAgICByZXR1cm4gVFJVRTsKKworICBkYnVzX2Vycm9yX2ZyZWUgKGVycm9yKTsKKworICAvKiBGYWxsYmFjayB0byB0aGUgc3lzdGVtIG1hY2hpbmUgSUQgKi8KKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZmaWxlbmFtZSwgIi9ldGMvbWFjaGluZS1pZCIpOworICByZXR1cm4gX2RidXNfcmVhZF91dWlkX2ZpbGUgKCZmaWxlbmFtZSwgbWFjaGluZV9pZCwgRkFMU0UsIGVycm9yKTsKK30KKworI2RlZmluZSBEQlVTX1VOSVhfU1RBTkRBUkRfU0VTU0lPTl9TRVJWSUNFRElSICIvZGJ1cy0xL3NlcnZpY2VzIgorI2RlZmluZSBEQlVTX1VOSVhfU1RBTkRBUkRfU1lTVEVNX1NFUlZJQ0VESVIgIi9kYnVzLTEvc3lzdGVtLXNlcnZpY2VzIgorCisvKioKKyAqIHF1cmllcyBsYXVuY2hkIGZvciBhIHNwZWNpZmljIGVudiB2YXIgd2hpY2ggaG9sZHMgdGhlIHNvY2tldCBwYXRoLgorICogQHBhcmFtIGxhdW5jaGRfZW52X3ZhciB0aGUgZW52IHZhciB0byBsb29rIHVwCisgKiBAcGFyYW0gZXJyb3IgYSBEQnVzRXJyb3IgdG8gc3RvcmUgdGhlIGVycm9yIGluIGNhc2Ugb2YgZmFpbHVyZQorICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGVudiB2YXIKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2xvb2t1cF9sYXVuY2hkX3NvY2tldCAoREJ1c1N0cmluZyAqc29ja2V0X3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxhdW5jaGRfZW52X3ZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisjaWZkZWYgREJVU19FTkFCTEVfTEFVTkNIRAorICBjaGFyICphcmd2WzRdOworICBpbnQgaTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoX2RidXNfY2hlY2tfc2V0dWlkICgpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZmluZCBsYXVuY2hkIHNvY2tldCB3aGVuIHNldHVpZCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpID0gMDsKKyAgYXJndltpXSA9ICJsYXVuY2hjdGwiOworICArK2k7CisgIGFyZ3ZbaV0gPSAiZ2V0ZW52IjsKKyAgKytpOworICBhcmd2W2ldID0gKGNoYXIqKWxhdW5jaGRfZW52X3ZhcjsKKyAgKytpOworICBhcmd2W2ldID0gTlVMTDsKKyAgKytpOworCisgIF9kYnVzX2Fzc2VydCAoaSA9PSBfREJVU19OX0VMRU1FTlRTIChhcmd2KSk7CisKKyAgaWYgKCFfcmVhZF9zdWJwcm9jZXNzX2xpbmVfYXJndihhcmd2WzBdLCBUUlVFLCBhcmd2LCBzb2NrZXRfcGF0aCwgZXJyb3IpKQorICAgIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogbm8gZXJyb3IsIGJ1dCBubyByZXN1bHQgZWl0aGVyICovCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aChzb2NrZXRfcGF0aCkgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIHN0cmlwIHRoZSBjYXJyaWFnZS1yZXR1cm4gKi8KKyAgX2RidXNfc3RyaW5nX3Nob3J0ZW4oc29ja2V0X3BhdGgsIDEpOworICByZXR1cm4gVFJVRTsKKyNlbHNlIC8qIERCVVNfRU5BQkxFX0xBVU5DSEQgKi8KKyAgZGJ1c19zZXRfZXJyb3IoZXJyb3IsIERCVVNfRVJST1JfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICAiY2FuJ3QgbG9va3VwIHNvY2tldCBmcm9tIGxhdW5jaGQ7IGxhdW5jaGQgc3VwcG9ydCBub3QgY29tcGlsZWQgaW4iKTsKKyAgcmV0dXJuIEZBTFNFOworI2VuZGlmCit9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9MQVVOQ0hECitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX2xvb2t1cF9zZXNzaW9uX2FkZHJlc3NfbGF1bmNoZCAoREJ1c1N0cmluZyAqYWRkcmVzcywgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIGRidXNfYm9vbF90IHZhbGlkX3NvY2tldDsKKyAgREJ1c1N0cmluZyBzb2NrZXRfcGF0aDsKKworICBpZiAoX2RidXNfY2hlY2tfc2V0dWlkICgpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZmluZCBsYXVuY2hkIHNvY2tldCB3aGVuIHNldHVpZCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc29ja2V0X3BhdGgpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgdmFsaWRfc29ja2V0ID0gX2RidXNfbG9va3VwX2xhdW5jaGRfc29ja2V0ICgmc29ja2V0X3BhdGgsICJEQlVTX0xBVU5DSERfU0VTU0lPTl9CVVNfU09DS0VUIiwgZXJyb3IpOworCisgIGlmIChkYnVzX2Vycm9yX2lzX3NldChlcnJvcikpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUoJnNvY2tldF9wYXRoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCF2YWxpZF9zb2NrZXQpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IoZXJyb3IsICJubyBzb2NrZXQgcGF0aCIsCisgICAgICAgICAgICAgICAgImxhdW5jaGQgZGlkIG5vdCBwcm92aWRlIGEgc29ja2V0IHBhdGgsICIKKyAgICAgICAgICAgICAgICAidmVyaWZ5IHRoYXQgb3JnLmZyZWVkZXNrdG9wLmRidXMtc2Vzc2lvbi5wbGlzdCBpcyBsb2FkZWQhIik7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSgmc29ja2V0X3BhdGgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kIChhZGRyZXNzLCAidW5peDpwYXRoPSIpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlKCZzb2NrZXRfcGF0aCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmc29ja2V0X3BhdGgsIDAsIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChhZGRyZXNzKSkpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUoJnNvY2tldF9wYXRoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUoJnNvY2tldF9wYXRoKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYKKworLyoqCisgKiBEZXRlcm1pbmVzIHRoZSBhZGRyZXNzIG9mIHRoZSBzZXNzaW9uIGJ1cyBieSBxdWVyeWluZyBhCisgKiBwbGF0Zm9ybS1zcGVjaWZpYyBtZXRob2QuCisgKgorICogVGhlIGZpcnN0IHBhcmFtZXRlciB3aWxsIGJlIGEgYm9vbGVhbiBzcGVjaWZ5aW5nIHdoZXRoZXIKKyAqIG9yIG5vdCBhIGR5bmFtaWMgc2Vzc2lvbiBsb29rdXAgaXMgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0uCisgKgorICogSWYgc3VwcG9ydGVkIGlzIFRSVUUgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgI1RSVUUsIHRoZQorICogYWRkcmVzcyB3aWxsIGJlICBhcHBlbmRlZCB0byBAcCBhZGRyZXNzLgorICogSWYgYSBmYWlsdXJlIGhhcHBlbnMsIHJldHVybnMgI0ZBTFNFIGFuZCBzZXRzIGFuIGVycm9yIGluCisgKiBAcCBlcnJvci4KKyAqCisgKiBJZiBzdXBwb3J0ZWQgaXMgRkFMU0UsIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlLgorICoKKyAqIEBwYXJhbSBzdXBwb3J0ZWQgcmV0dXJucyB3aGV0aGVyIHRoaXMgbWV0aG9kIGlzIHN1cHBvcnRlZAorICogQHBhcmFtIGFkZHJlc3MgYSBEQnVzU3RyaW5nIHdoZXJlIHRoZSBhZGRyZXNzIGNhbiBiZSBzdG9yZWQKKyAqIEBwYXJhbSBlcnJvciBhIERCdXNFcnJvciB0byBzdG9yZSB0aGUgZXJyb3IgaW4gY2FzZSBvZiBmYWlsdXJlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0UgaWYgYW4gZXJyb3IgaGFwcGVuZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2xvb2t1cF9zZXNzaW9uX2FkZHJlc3MgKGRidXNfYm9vbF90ICpzdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICplcnJvcikKK3sKKyNpZmRlZiBEQlVTX0VOQUJMRV9MQVVOQ0hECisgICpzdXBwb3J0ZWQgPSBUUlVFOworICByZXR1cm4gX2RidXNfbG9va3VwX3Nlc3Npb25fYWRkcmVzc19sYXVuY2hkIChhZGRyZXNzLCBlcnJvcik7CisjZWxzZQorICAvKiBPbiBub24tTWFjIFVuaXggcGxhdGZvcm1zLCBpZiB0aGUgc2Vzc2lvbiBhZGRyZXNzIGlzbid0IGFscmVhZHkKKyAgICogc2V0IGluIERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgd2UgcHVudCBhbmQKKyAgICogZmFsbCBiYWNrIHRvIHRoZSBhdXRvbGF1bmNoOiBnbG9iYWwgZGVmYXVsdDsgc2VlCisgICAqIGluaXRfc2Vzc2lvbl9hZGRyZXNzIGluIGRidXMvZGJ1cy1idXMuYy4gKi8KKyAgKnN1cHBvcnRlZCA9IEZBTFNFOworICByZXR1cm4gVFJVRTsKKyNlbmRpZgorfQorCisvKioKKyAqIFJldHVybnMgdGhlIHN0YW5kYXJkIGRpcmVjdG9yaWVzIGZvciBhIHNlc3Npb24gYnVzIHRvIGxvb2sgZm9yIHNlcnZpY2UKKyAqIGFjdGl2YXRpb24gZmlsZXMKKyAqCisgKiBPbiBVTklYIHRoaXMgc2hvdWxkIGJlIHRoZSBzdGFuZGFyZCB4ZGcgZnJlZWRlc2t0b3Aub3JnIGRhdGEgZGlyZWN0b3JpZXM6CisgKgorICogWERHX0RBVEFfSE9NRT0ke1hER19EQVRBX0hPTUUtJEhPTUUvLmxvY2FsL3NoYXJlfQorICogWERHX0RBVEFfRElSUz0ke1hER19EQVRBX0RJUlMtL3Vzci9sb2NhbC9zaGFyZTovdXNyL3NoYXJlfQorICoKKyAqIGFuZAorICoKKyAqIERCVVNfREFUQURJUgorICoKKyAqIEBwYXJhbSBkaXJzIHRoZSBkaXJlY3RvcnkgbGlzdCB3ZSBhcmUgcmV0dXJuaW5nCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gT09NCisgKi8KKworZGJ1c19ib29sX3QKK19kYnVzX2dldF9zdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzIChEQnVzTGlzdCAqKmRpcnMpCit7CisgIGNvbnN0IGNoYXIgKnhkZ19kYXRhX2hvbWU7CisgIGNvbnN0IGNoYXIgKnhkZ19kYXRhX2RpcnM7CisgIERCdXNTdHJpbmcgc2VydmljZWRpcl9wYXRoOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzZXJ2aWNlZGlyX3BhdGgpKQorICAgIHJldHVybiBGQUxTRTsKKworICB4ZGdfZGF0YV9ob21lID0gX2RidXNfZ2V0ZW52ICgiWERHX0RBVEFfSE9NRSIpOworICB4ZGdfZGF0YV9kaXJzID0gX2RidXNfZ2V0ZW52ICgiWERHX0RBVEFfRElSUyIpOworCisgIGlmICh4ZGdfZGF0YV9ob21lICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLCB4ZGdfZGF0YV9ob21lKSkKKyAgICAgICAgZ290byBvb207CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY29uc3QgREJ1c1N0cmluZyAqaG9tZWRpcjsKKyAgICAgIERCdXNTdHJpbmcgbG9jYWxfc2hhcmU7CisKKyAgICAgIGlmICghX2RidXNfaG9tZWRpcl9mcm9tX2N1cnJlbnRfcHJvY2VzcyAoJmhvbWVkaXIpKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGhvbWVkaXIpKSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmbG9jYWxfc2hhcmUsICIvLmxvY2FsL3NoYXJlIik7CisgICAgICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZzZXJ2aWNlZGlyX3BhdGgsICZsb2NhbF9zaGFyZSkpCisgICAgICAgIGdvdG8gb29tOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzZXJ2aWNlZGlyX3BhdGgsICI6IikpCisgICAgZ290byBvb207CisKKyAgaWYgKHhkZ19kYXRhX2RpcnMgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzZXJ2aWNlZGlyX3BhdGgsIHhkZ19kYXRhX2RpcnMpKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLCAiOiIpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzZXJ2aWNlZGlyX3BhdGgsICIvdXNyL2xvY2FsL3NoYXJlOi91c3Ivc2hhcmU6IikpCisgICAgICAgIGdvdG8gb29tOworICAgIH0KKworICAvKgorICAgKiBhZGQgY29uZmlndXJlZCBkYXRhZGlyIHRvIGRlZmF1bHRzCisgICAqIHRoaXMgbWF5IGJlIHRoZSBzYW1lIGFzIGFuIHhkZyBkaXIKKyAgICogaG93ZXZlciB0aGUgY29uZmlnIHBhcnNlciBzaG91bGQgdGFrZQorICAgKiBjYXJlIG9mIGR1cGxpY2F0ZXMKKyAgICovCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnNlcnZpY2VkaXJfcGF0aCwgREJVU19EQVRBRElSKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoIV9kYnVzX3NwbGl0X3BhdGhzX2FuZF9hcHBlbmQgKCZzZXJ2aWNlZGlyX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19VTklYX1NUQU5EQVJEX1NFU1NJT05fU0VSVklDRURJUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJzKSkKKyAgICBnb3RvIG9vbTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNlcnZpY2VkaXJfcGF0aCk7CisgIHJldHVybiBUUlVFOworCisgb29tOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNlcnZpY2VkaXJfcGF0aCk7CisgIHJldHVybiBGQUxTRTsKK30KKworCisvKioKKyAqIFJldHVybnMgdGhlIHN0YW5kYXJkIGRpcmVjdG9yaWVzIGZvciBhIHN5c3RlbSBidXMgdG8gbG9vayBmb3Igc2VydmljZQorICogYWN0aXZhdGlvbiBmaWxlcworICoKKyAqIE9uIFVOSVggdGhpcyBzaG91bGQgYmUgdGhlIHN0YW5kYXJkIHhkZyBmcmVlZGVza3RvcC5vcmcgZGF0YSBkaXJlY3RvcmllczoKKyAqCisgKiBYREdfREFUQV9ESVJTPSR7WERHX0RBVEFfRElSUy0vdXNyL2xvY2FsL3NoYXJlOi91c3Ivc2hhcmV9CisgKgorICogYW5kCisgKgorICogREJVU19EQVRBRElSCisgKgorICogT24gV2luZG93cyB0aGVyZSBpcyBubyBzeXN0ZW0gYnVzIGFuZCB0aGlzIGZ1bmN0aW9uIGNhbiByZXR1cm4gbm90aGluZy4KKyAqCisgKiBAcGFyYW0gZGlycyB0aGUgZGlyZWN0b3J5IGxpc3Qgd2UgYXJlIHJldHVybmluZworICogQHJldHVybnMgI0ZBTFNFIG9uIE9PTQorICovCisKK2RidXNfYm9vbF90CitfZGJ1c19nZXRfc3RhbmRhcmRfc3lzdGVtX3NlcnZpY2VkaXJzIChEQnVzTGlzdCAqKmRpcnMpCit7CisgIC8qCisgICAqIERCVVNfREFUQURJUiBtYXkgYmUgdGhlIHNhbWUgYXMgb25lIG9mIHRoZSBzdGFuZGFyZCBkaXJlY3Rvcmllcy4gSG93ZXZlciwKKyAgICogdGhlIGNvbmZpZyBwYXJzZXIgc2hvdWxkIHRha2UgY2FyZSBvZiB0aGUgZHVwbGljYXRlcy4KKyAgICoKKyAgICogQWxzbywgYXBwZW5kIC9saWIgYXMgY291bnRlcnBhcnQgb2YgL3Vzci9zaGFyZSBvbiB0aGUgcm9vdAorICAgKiBkaXJlY3RvcnkgKHRoZSByb290IGRpcmVjdG9yeSBkb2VzIG5vdCBrbm93IC9zaGFyZSksIGluIG9yZGVyIHRvCisgICAqIGZhY2lsaXRhdGUgZWFybHkgYm9vdCBzeXN0ZW0gYnVzIGFjdGl2YXRpb24gd2hlcmUgL3VzciBtaWdodCBub3QKKyAgICogYmUgYXZhaWxhYmxlLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IGNoYXIgc3RhbmRhcmRfc2VhcmNoX3BhdGhbXSA9CisgICAgIi91c3IvbG9jYWwvc2hhcmU6IgorICAgICIvdXNyL3NoYXJlOiIKKyAgICBEQlVTX0RBVEFESVIgIjoiCisgICAgIi9saWIiOworICBEQnVzU3RyaW5nIHNlcnZpY2VkaXJfcGF0aDsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnNlcnZpY2VkaXJfcGF0aCwgc3RhbmRhcmRfc2VhcmNoX3BhdGgpOworCisgIHJldHVybiBfZGJ1c19zcGxpdF9wYXRoc19hbmRfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19VTklYX1NUQU5EQVJEX1NZU1RFTV9TRVJWSUNFRElSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlycyk7Cit9CisKKy8qKgorICogQXBwZW5kIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBzeXN0ZW0uY29uZiBmaWxlCisgKiAodGhlcmUgaXMgbm8gc3lzdGVtIGJ1cyBvbiBXaW5kb3dzIHNvIHRoaXMgY2FuIGp1c3QKKyAqIHJldHVybiBGQUxTRSBhbmQgcHJpbnQgYSB3YXJuaW5nIG9yIHNvbWV0aGluZykKKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gYXBwZW5kIHRvCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hcHBlbmRfc3lzdGVtX2NvbmZpZ19maWxlIChEQnVzU3RyaW5nICpzdHIpCit7CisgIHJldHVybiBfZGJ1c19zdHJpbmdfYXBwZW5kIChzdHIsIERCVVNfU1lTVEVNX0NPTkZJR19GSUxFKTsKK30KKworLyoqCisgKiBBcHBlbmQgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHNlc3Npb24uY29uZiBmaWxlLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byBhcHBlbmQgdG8KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2FwcGVuZF9zZXNzaW9uX2NvbmZpZ19maWxlIChEQnVzU3RyaW5nICpzdHIpCit7CisgIHJldHVybiBfZGJ1c19zdHJpbmdfYXBwZW5kIChzdHIsIERCVVNfU0VTU0lPTl9DT05GSUdfRklMRSk7Cit9CisKKy8qKgorICogQ2FsbGVkIHdoZW4gdGhlIGJ1cyBkYWVtb24gaXMgc2lnbmFsZWQgdG8gcmVsb2FkIGl0cyBjb25maWd1cmF0aW9uOyBhbnkKKyAqIGNhY2hlcyBzaG91bGQgYmUgbnVrZWQuIE9mIGNvdXJzZSBhbnkgY2FjaGVzIHRoYXQgbmVlZCBleHBsaWNpdCByZWxvYWQKKyAqIGFyZSBwcm9iYWJseSBicm9rZW4sIGJ1dCBjJ2VzdCBsYSB2aWUuCisgKgorICoKKyAqLwordm9pZAorX2RidXNfZmx1c2hfY2FjaGVzICh2b2lkKQoreworICBfZGJ1c191c2VyX2RhdGFiYXNlX2ZsdXNoX3N5c3RlbSAoKTsKK30KKworLyoqCisgKiBBcHBlbmRzIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggYSBrZXlyaW5nIGZvciB0aGUgZ2l2ZW4gY3JlZGVudGlhbHMKKyAqIHNob3VsZCBiZSBzdG9yZWQuICBUaGUgY3JlZGVudGlhbHMgc2hvdWxkIGhhdmUgZWl0aGVyIGEgV2luZG93cyBvcgorICogVU5JWCB1c2VyIGluIHRoZW0uICBUaGUgZGlyZWN0b3J5IHNob3VsZCBiZSBhbiBhYnNvbHV0ZSBwYXRoLgorICoKKyAqIE9uIFVOSVggdGhlIGRpcmVjdG9yeSBpcyB+Ly5kYnVzLWtleXJpbmdzIHdoaWxlIG9uIFdpbmRvd3MgaXQgc2hvdWxkIHByb2JhYmx5CisgKiBiZSBzb21ldGhpbmcgZWxzZSwgc2luY2UgdGhlIGRvdGZpbGUgY29udmVudGlvbiBpcyBub3Qgbm9ybWFsIG9uIFdpbmRvd3MuCisgKgorICogQHBhcmFtIGRpcmVjdG9yeSBzdHJpbmcgdG8gYXBwZW5kIGRpcmVjdG9yeSB0bworICogQHBhcmFtIGNyZWRlbnRpYWxzIGNyZWRlbnRpYWxzIHRoZSBkaXJlY3Rvcnkgc2hvdWxkIGJlIGZvcgorICoKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2FwcGVuZF9rZXlyaW5nX2RpcmVjdG9yeV9mb3JfY3JlZGVudGlhbHMgKERCdXNTdHJpbmcgICAgICAqZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICpjcmVkZW50aWFscykKK3sKKyAgREJ1c1N0cmluZyBob21lZGlyOworICBEQnVzU3RyaW5nIGRvdGRpcjsKKyAgZGJ1c191aWRfdCB1aWQ7CisKKyAgX2RidXNfYXNzZXJ0IChjcmVkZW50aWFscyAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfY3JlZGVudGlhbHNfYXJlX2Fub255bW91cyAoY3JlZGVudGlhbHMpKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmaG9tZWRpcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHVpZCA9IF9kYnVzX2NyZWRlbnRpYWxzX2dldF91bml4X3VpZCAoY3JlZGVudGlhbHMpOworICBfZGJ1c19hc3NlcnQgKHVpZCAhPSBEQlVTX1VJRF9VTlNFVCk7CisKKyAgaWYgKCFfZGJ1c19ob21lZGlyX2Zyb21fdWlkICh1aWQsICZob21lZGlyKSkKKyAgICBnb3RvIGZhaWxlZDsKKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgeworICAgIGNvbnN0IGNoYXIgKm92ZXJyaWRlOworCisgICAgb3ZlcnJpZGUgPSBfZGJ1c19nZXRlbnYgKCJEQlVTX1RFU1RfSE9NRURJUiIpOworICAgIGlmIChvdmVycmlkZSAhPSBOVUxMICYmICpvdmVycmlkZSAhPSAnXDAnKQorICAgICAgeworICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmhvbWVkaXIsIDApOworICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZob21lZGlyLCBvdmVycmlkZSkpCisgICAgICAgICAgZ290byBmYWlsZWQ7CisKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIlVzaW5nIGZha2UgaG9tZWRpciBmb3IgdGVzdGluZzogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmhvbWVkaXIpKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIHN0YXRpYyBkYnVzX2Jvb2xfdCBhbHJlYWR5X3dhcm5lZCA9IEZBTFNFOworICAgICAgICBpZiAoIWFscmVhZHlfd2FybmVkKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJVc2luZyB5b3VyIHJlYWwgaG9tZSBkaXJlY3RvcnkgZm9yIHRlc3RpbmcsIHNldCBEQlVTX1RFU1RfSE9NRURJUiB0byBhdm9pZFxuIik7CisgICAgICAgICAgICBhbHJlYWR5X3dhcm5lZCA9IFRSVUU7CisgICAgICAgICAgfQorICAgICAgfQorICB9CisjZW5kaWYKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmRvdGRpciwgIi5kYnVzLWtleXJpbmdzIik7CisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmhvbWVkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRvdGRpcikpCisgICAgZ290byBmYWlsZWQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmhvbWVkaXIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRpcmVjdG9yeSkpKSB7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmhvbWVkaXIpOworICByZXR1cm4gVFJVRTsKKworIGZhaWxlZDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZob21lZGlyKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvL1BFTkRJTkcoa2RhYikgZG9jcworZGJ1c19ib29sX3QKK19kYnVzX2RhZW1vbl9wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MgKGNvbnN0IGNoYXIqIGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzY29wZSkKK3sKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8vUEVORElORyhrZGFiKSBkb2NzCit2b2lkCitfZGJ1c19kYWVtb25fdW5wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MgKHZvaWQpCit7CisKK30KKworLyoqCisgKiBTZWUgaWYgZXJybm8gaXMgRUFHQUlOIG9yIEVXT1VMREJMT0NLICh0aGlzIGhhcyB0byBiZSBkb25lIGRpZmZlcmVudGx5CisgKiBmb3IgV2luc29jayBzbyBpcyBhYnN0cmFjdGVkKQorICoKKyAqIEByZXR1cm5zICNUUlVFIGlmIGVycm5vID09IEVBR0FJTiBvciBlcnJubyA9PSBFV09VTERCTE9DSworICovCitkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X2lzX2Vycm5vX2VhZ2Fpbl9vcl9ld291bGRibG9jayAodm9pZCkKK3sKKyAgcmV0dXJuIGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFV09VTERCTE9DSzsKK30KKworLyoqCisgKiBSZW1vdmVzIGEgZGlyZWN0b3J5OyBEaXJlY3RvcnkgbXVzdCBiZSBlbXB0eQorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSBkaXJlY3RvcnkgZmlsZW5hbWUKKyAqIEBwYXJhbSBlcnJvciBpbml0aWFsaXplZCBlcnJvciBvYmplY3QKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2RlbGV0ZV9kaXJlY3RvcnkgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgZmlsZW5hbWVfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworCisgIGlmIChybWRpciAoZmlsZW5hbWVfYykgIT0gMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVtb3ZlIGRpcmVjdG9yeSAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfYywgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqICBDaGVja3Mgd2hldGhlciBmaWxlIGRlc2NyaXB0b3JzIG1heSBiZSBwYXNzZWQgdmlhIHRoZSBzb2NrZXQKKyAqCisgKiAgQHBhcmFtIGZkIHRoZSBzb2NrZXQKKyAqICBAcmV0dXJuIFRSVUUgd2hlbiBmZCBwYXNzaW5nIG92ZXIgdGhpcyBzb2NrZXQgaXMgc3VwcG9ydGVkCisgKgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc29ja2V0X2Nhbl9wYXNzX3VuaXhfZmQoaW50IGZkKSB7CisKKyNpZmRlZiBTQ01fUklHSFRTCisgIHVuaW9uIHsKKyAgICBzdHJ1Y3Qgc29ja2FkZHIgc2E7CisgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc3RvcmFnZTsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gdW47CisgIH0gc2FfYnVmOworCisgIHNvY2tsZW5fdCBzYV9sZW4gPSBzaXplb2Yoc2FfYnVmKTsKKworICBfREJVU19aRVJPKHNhX2J1Zik7CisKKyAgaWYgKGdldHNvY2tuYW1lKGZkLCAmc2FfYnVmLnNhLCAmc2FfbGVuKSA8IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBzYV9idWYuc2Euc2FfZmFtaWx5ID09IEFGX1VOSVg7CisKKyNlbHNlCisgIHJldHVybiBGQUxTRTsKKworI2VuZGlmCit9CisKKworLyoKKyAqIHJlcGxhY2VzIHRoZSB0ZXJtIERCVVNfUFJFRklYIGluIGNvbmZpZ3VyZV90aW1lX3BhdGggYnkgdGhlCisgKiBjdXJyZW50IGRidXMgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4gT24gdW5peCB0aGlzIGZ1bmN0aW9uIGlzIGEgbm9vcAorICoKKyAqIEBwYXJhbSBjb25maWd1cmVfdGltZV9wYXRoCisgKiBAcmV0dXJuIHJlYWwgcGF0aAorICovCitjb25zdCBjaGFyICoKK19kYnVzX3JlcGxhY2VfaW5zdGFsbF9wcmVmaXggKGNvbnN0IGNoYXIgKmNvbmZpZ3VyZV90aW1lX3BhdGgpCit7CisgIHJldHVybiBjb25maWd1cmVfdGltZV9wYXRoOworfQorCisvKioKKyAqIENsb3NlcyBhbGwgZmlsZSBkZXNjcmlwdG9ycyBleGNlcHQgdGhlIGZpcnN0IHRocmVlIChpLmUuIHN0ZGluLAorICogc3Rkb3V0LCBzdGRlcnIpLgorICovCit2b2lkCitfZGJ1c19jbG9zZV9hbGwgKHZvaWQpCit7CisgIGludCBtYXhmZHMsIGk7CisKKyNpZmRlZiBfX2xpbnV4X18KKyAgRElSICpkOworCisgIC8qIE9uIExpbnV4IHdlIGNhbiBvcHRpbWl6ZSB0aGlzIGEgYml0IGlmIC9wcm9jIGlzIGF2YWlsYWJsZS4gSWYgaXQKKyAgICAgaXNuJ3QgYXZhaWxhYmxlLCBmYWxsIGJhY2sgdG8gdGhlIGJydXRlIGZvcmNlIHdheS4gKi8KKworICBkID0gb3BlbmRpciAoIi9wcm9jL3NlbGYvZmQiKTsKKyAgaWYgKGQpCisgICAgeworICAgICAgZm9yICg7OykKKyAgICAgICAgeworICAgICAgICAgIHN0cnVjdCBkaXJlbnQgYnVmLCAqZGU7CisgICAgICAgICAgaW50IGssIGZkOworICAgICAgICAgIGxvbmcgbDsKKyAgICAgICAgICBjaGFyICplID0gTlVMTDsKKworICAgICAgICAgIGsgPSByZWFkZGlyX3IgKGQsICZidWYsICZkZSk7CisgICAgICAgICAgaWYgKGsgIT0gMCB8fCAhZGUpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGlmIChkZS0+ZF9uYW1lWzBdID09ICcuJykKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgIGwgPSBzdHJ0b2wgKGRlLT5kX25hbWUsICZlLCAxMCk7CisgICAgICAgICAgaWYgKGVycm5vICE9IDAgfHwgZSA9PSBOVUxMIHx8ICplICE9ICdcMCcpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIGZkID0gKGludCkgbDsKKyAgICAgICAgICBpZiAoZmQgPCAzKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBpZiAoZmQgPT0gZGlyZmQgKGQpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBjbG9zZSAoZmQpOworICAgICAgICB9CisKKyAgICAgIGNsb3NlZGlyIChkKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKworICBtYXhmZHMgPSBzeXNjb25mIChfU0NfT1BFTl9NQVgpOworCisgIC8qIFBpY2sgc29tZXRoaW5nIHJlYXNvbmFibGUgaWYgZm9yIHNvbWUgcmVhc29uIHN5c2NvbmYgc2F5cworICAgKiB1bmxpbWl0ZWQuCisgICAqLworICBpZiAobWF4ZmRzIDwgMCkKKyAgICBtYXhmZHMgPSAxMDI0OworCisgIC8qIGNsb3NlIGFsbCBpbmhlcml0ZWQgZmRzICovCisgIGZvciAoaSA9IDM7IGkgPCBtYXhmZHM7IGkrKykKKyAgICBjbG9zZSAoaSk7Cit9CisKKy8qKgorICogKipOT1RFKio6IElmIHlvdSBtb2RpZnkgdGhpcyBmdW5jdGlvbiwgcGxlYXNlIGFsc28gY29uc2lkZXIgbWFraW5nCisgKiB0aGUgY29ycmVzcG9uZGluZyBjaGFuZ2UgaW4gR0xpYi4gIFNlZQorICogZ2xpYi9ndXRpbHMuYzpnX2NoZWNrX3NldHVpZCgpLgorICoKKyAqIFJldHVybnMgVFJVRSBpZiB0aGUgY3VycmVudCBwcm9jZXNzIHdhcyBleGVjdXRlZCBhcyBzZXR1aWQgKG9yIGFuCisgKiBlcXVpdmFsZW50IF9fbGliY19lbmFibGVfc2VjdXJlIGlzIGF2YWlsYWJsZSkuICBTZWU6CisgKiBodHRwOi8vb3NkaXIuY29tL21sL2xpbnV4Lmxmcy5oYXJkZW5lZC8yMDA3LTA0L21zZzAwMDMyLmh0bWwKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NoZWNrX3NldHVpZCAodm9pZCkKK3sKKyAgLyogVE9ETzogZ2V0IF9fbGliY19lbmFibGVfc2VjdXJlIGV4cG9ydGVkIGZyb20gZ2xpYmMuCisgICAqIFNlZSBodHRwOi8vd3d3Lm9wZW53YWxsLmNvbS9saXN0cy9vd2wtZGV2LzIwMTIvMDgvMTQvMQorICAgKi8KKyNpZiAwICYmIGRlZmluZWQoSEFWRV9MSUJDX0VOQUJMRV9TRUNVUkUpCisgIHsKKyAgICAvKiBTZWUgZ2xpYmMvaW5jbHVkZS91bmlzdGQuaCAqLworICAgIGV4dGVybiBpbnQgX19saWJjX2VuYWJsZV9zZWN1cmU7CisgICAgcmV0dXJuIF9fbGliY19lbmFibGVfc2VjdXJlOworICB9CisjZWxpZiBkZWZpbmVkKEhBVkVfSVNTRVRVR0lEKQorICAvKiBCU0Q6IGh0dHA6Ly93d3cuZnJlZWJzZC5vcmcvY2dpL21hbi5jZ2k/cXVlcnk9aXNzZXR1Z2lkJnNla3Rpb249MiAqLworICByZXR1cm4gaXNzZXR1Z2lkICgpOworI2Vsc2UKKyAgdWlkX3QgcnVpZCwgZXVpZCwgc3VpZDsgLyogUmVhbCwgZWZmZWN0aXZlIGFuZCBzYXZlZCB1c2VyIElEJ3MgKi8KKyAgZ2lkX3QgcmdpZCwgZWdpZCwgc2dpZDsgLyogUmVhbCwgZWZmZWN0aXZlIGFuZCBzYXZlZCBncm91cCBJRCdzICovCisKKyAgc3RhdGljIGRidXNfYm9vbF90IGNoZWNrX3NldHVpZF9pbml0aWFsaXNlZDsKKyAgc3RhdGljIGRidXNfYm9vbF90IGlzX3NldHVpZDsKKworICBpZiAoX0RCVVNfVU5MSUtFTFkgKCFjaGVja19zZXR1aWRfaW5pdGlhbGlzZWQpKQorICAgIHsKKyNpZmRlZiBIQVZFX0dFVFJFU1VJRAorICAgICAgaWYgKGdldHJlc3VpZCAoJnJ1aWQsICZldWlkLCAmc3VpZCkgIT0gMCB8fAorICAgICAgICAgIGdldHJlc2dpZCAoJnJnaWQsICZlZ2lkLCAmc2dpZCkgIT0gMCkKKyNlbmRpZiAvKiBIQVZFX0dFVFJFU1VJRCAqLworICAgICAgICB7CisgICAgICAgICAgc3VpZCA9IHJ1aWQgPSBnZXR1aWQgKCk7CisgICAgICAgICAgc2dpZCA9IHJnaWQgPSBnZXRnaWQgKCk7CisgICAgICAgICAgZXVpZCA9IGdldGV1aWQgKCk7CisgICAgICAgICAgZWdpZCA9IGdldGVnaWQgKCk7CisgICAgICAgIH0KKworICAgICAgY2hlY2tfc2V0dWlkX2luaXRpYWxpc2VkID0gVFJVRTsKKyAgICAgIGlzX3NldHVpZCA9IChydWlkICE9IGV1aWQgfHwgcnVpZCAhPSBzdWlkIHx8CisgICAgICAgICAgICAgICAgICAgcmdpZCAhPSBlZ2lkIHx8IHJnaWQgIT0gc2dpZCk7CisKKyAgICB9CisgIHJldHVybiBpc19zZXR1aWQ7CisjZW5kaWYKK30KKworLyogdGVzdHMgaW4gZGJ1cy1zeXNkZXBzLXV0aWwuYyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtc3lzZGVwcy11bml4LmggYi9kYnVzL2RidXMvZGJ1cy1zeXNkZXBzLXVuaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjcwODk2Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtc3lzZGVwcy11bml4LmgKQEAgLTAsMCArMSwxNDUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zeXNkZXBzLXVuaXguaCBVTklYLXNwZWNpZmljIHdyYXBwZXJzIGFyb3VuZCBzeXN0ZW0vbGliYyBmZWF0dXJlcyAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA2ICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19TWVNERVBTX1VOSVhfSAorI2RlZmluZSBEQlVTX1NZU0RFUFNfVU5JWF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorCisjaWZkZWYgREJVU19XSU4KKyNlcnJvciAiRG9uJ3QgaW5jbHVkZSB0aGlzIG9uIFdpbmRvd3MiCisjZW5kaWYKKworREJVU19CRUdJTl9ERUNMUworCisvKioKKyAqIEBkZWZncm91cCBEQnVzU3lzZGVwc1VuaXggVU5JWC1zcGVjaWZpYyBpbnRlcm5hbCBBUEkKKyAqIEBpbmdyb3VwIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBJbnRlcm5hbCBzeXN0ZW0tZGVwZW5kZW50IEFQSSBhdmFpbGFibGUgb24gVU5JWCBvbmx5CisgKiBAeworICovCisKK2RidXNfYm9vbF90CitfZGJ1c19jbG9zZSAgICAgKGludCAgICAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitpbnQgX2RidXNfZHVwICAgKGludCAgICAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitpbnQKK19kYnVzX3JlYWQgICAgICAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgY291bnQpOworaW50CitfZGJ1c193cml0ZSAgICAgKGludCAgICAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4pOworaW50CitfZGJ1c193cml0ZV90d28gKGludCAgICAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIxLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydDEsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbjEsCisgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlcjIsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0MiwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuMik7CisKK2ludCBfZGJ1c19jb25uZWN0X3VuaXhfc29ja2V0IChjb25zdCBjaGFyICAgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgYWJzdHJhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKK2ludCBfZGJ1c19saXN0ZW5fdW5peF9zb2NrZXQgIChjb25zdCBjaGFyICAgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgYWJzdHJhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKKworaW50IF9kYnVzX2Nvbm5lY3RfZXhlYyAoY29uc3QgY2hhciAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpjb25zdCAgICBhcmd2W10sCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworCitpbnQgX2RidXNfbGlzdGVuX3N5c3RlbWRfc29ja2V0cyAoaW50ICAgICAgICoqZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKTsKKworZGJ1c19ib29sX3QgX2RidXNfcmVhZF9jcmVkZW50aWFscyAoaW50ICAgICAgICAgICAgICAgY2xpZW50X2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCBfZGJ1c19zZW5kX2NyZWRlbnRpYWxzIChpbnQgICAgICAgICAgICAgIHNlcnZlcl9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19sb29rdXBfbGF1bmNoZF9zb2NrZXQgKERCdXNTdHJpbmcgKnNvY2tldF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpsYXVuY2hkX2Vudl92YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKTsKKworLyoqIEluZm9ybWF0aW9uIGFib3V0IGEgVU5JWCB1c2VyICovCit0eXBlZGVmIHN0cnVjdCBEQnVzVXNlckluZm8gIERCdXNVc2VySW5mbzsKKy8qKiBJbmZvcm1hdGlvbiBhYm91dCBhIFVOSVggZ3JvdXAgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNHcm91cEluZm8gREJ1c0dyb3VwSW5mbzsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBhYm91dCBhIFVOSVggdXNlcgorICovCitzdHJ1Y3QgREJ1c1VzZXJJbmZvCit7CisgIGRidXNfdWlkX3QgIHVpZDsgICAgICAgICAgICAvKio8IFVJRCAqLworICBkYnVzX2dpZF90ICBwcmltYXJ5X2dpZDsgICAgLyoqPCBHSUQgKi8KKyAgZGJ1c19naWRfdCAqZ3JvdXBfaWRzOyAgICAgIC8qKjwgR3JvdXBzIElEcywgKmluY2x1ZGluZyogYWJvdmUgcHJpbWFyeSBncm91cCAqLworICBpbnQgICAgICAgICBuX2dyb3VwX2lkczsgICAgLyoqPCBTaXplIG9mIGdyb3VwIElEcyBhcnJheSAqLworICBjaGFyICAgICAgICp1c2VybmFtZTsgICAgICAgLyoqPCBVc2VybmFtZSAqLworICBjaGFyICAgICAgICpob21lZGlyOyAgICAgICAgLyoqPCBIb21lIGRpcmVjdG9yeSAqLworfTsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBhYm91dCBhIFVOSVggZ3JvdXAKKyAqLworc3RydWN0IERCdXNHcm91cEluZm8KK3sKKyAgZGJ1c19naWRfdCAgZ2lkOyAgICAgICAgICAgIC8qKjwgR0lEICovCisgIGNoYXIgICAgICAgKmdyb3VwbmFtZTsgICAgICAvKio8IEdyb3VwIG5hbWUgKi8KK307CisKK2RidXNfYm9vbF90IF9kYnVzX3VzZXJfaW5mb19maWxsICAgICAoREJ1c1VzZXJJbmZvICAgICAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90IF9kYnVzX3VzZXJfaW5mb19maWxsX3VpZCAoREJ1c1VzZXJJbmZvICAgICAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aWRfdCAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7Cit2b2lkICAgICAgICBfZGJ1c191c2VyX2luZm9fZnJlZSAgICAgKERCdXNVc2VySW5mbyAgICAgKmluZm8pOworCitkYnVzX2Jvb2xfdCBfZGJ1c19ncm91cF9pbmZvX2ZpbGwgICAgIChEQnVzR3JvdXBJbmZvICAgICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZ3JvdXBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgX2RidXNfZ3JvdXBfaW5mb19maWxsX2dpZCAoREJ1c0dyb3VwSW5mbyAgICAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICAgIGdpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK3ZvaWQgICAgICAgIF9kYnVzX2dyb3VwX2luZm9fZnJlZSAgICAgKERCdXNHcm91cEluZm8gICAgKmluZm8pOworCitkYnVzX3VpZF90ICAgIF9kYnVzX2dldHVpZCAodm9pZCk7CitkYnVzX3VpZF90ICAgIF9kYnVzX2dldGV1aWQgKHZvaWQpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19wYXJzZV91aWQgKGNvbnN0IERCdXNTdHJpbmcgICp1aWRfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICAqdWlkKTsKKwordm9pZCBfZGJ1c19jbG9zZV9hbGwgKHZvaWQpOworCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfU1lTREVQU19VTklYX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC11bml4LmMgYi9kYnVzL2RidXMvZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NDIzYWIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jCkBAIC0wLDAgKzEsMTE2NiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXN5c2RlcHMtdXRpbC11bml4LmMgV291bGQgYmUgaW4gZGJ1cy1zeXNkZXBzLXVuaXguYywgYnV0IG5vdCB1c2VkIGluIGxpYmRidXMKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1ICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy11bml4LmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXBpcGUuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKyNkZWZpbmUgREJVU19VU0VSREJfSU5DTFVERVNfUFJJVkFURSAxCisjaW5jbHVkZSAiZGJ1cy11c2VyZGIuaCIKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaWZkZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8Z3JwLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorCisjaWZkZWYgSEFWRV9TWVNfU1lTTElNSVRTX0gKKyNpbmNsdWRlIDxzeXMvc3lzbGltaXRzLmg+CisjZW5kaWYKKworI2lmbmRlZiBPX0JJTkFSWQorI2RlZmluZSBPX0JJTkFSWSAwCisjZW5kaWYKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzSW50ZXJuYWxzVXRpbHMKKyAqIEB7CisgKi8KKworCisvKioKKyAqIERvZXMgdGhlIGNoZGlyLCBmb3JrLCBzZXRzaWQsIGV0Yy4gdG8gYmVjb21lIGEgZGFlbW9uIHByb2Nlc3MuCisgKgorICogQHBhcmFtIHBpZGZpbGUgI05VTEwsIG9yIHBpZGZpbGUgdG8gY3JlYXRlCisgKiBAcGFyYW0gcHJpbnRfcGlkX3BpcGUgcGlwZSB0byBwcmludCBkYWVtb24ncyBwaWQgdG8sIG9yIC0xIGZvciBub25lCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvcnMKKyAqIEBwYXJhbSBrZWVwX3VtYXNrICNUUlVFIHRvIGtlZXAgdGhlIG9yaWdpbmFsIHVtYXNrCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYmVjb21lX2RhZW1vbiAoY29uc3QgREJ1c1N0cmluZyAqcGlkZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNQaXBlICAgICAgICAgKnByaW50X3BpZF9waXBlLAorICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBrZWVwX3VtYXNrKQoreworICBjb25zdCBjaGFyICpzOworICBwaWRfdCBjaGlsZF9waWQ7CisgIGludCBkZXZfbnVsbF9mZDsKKworICBfZGJ1c192ZXJib3NlICgiQmVjb21pbmcgYSBkYWVtb24uLi5cbiIpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJjaGRpciB0byAvXG4iKTsKKyAgaWYgKGNoZGlyICgiLyIpIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY2hkaXIoKSB0byByb290IGRpcmVjdG9yeSIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiZm9ya2luZy4uLlxuIik7CisgIHN3aXRjaCAoKGNoaWxkX3BpZCA9IGZvcmsgKCkpKQorICAgIHsKKyAgICBjYXNlIC0xOgorICAgICAgX2RidXNfdmVyYm9zZSAoImZvcmsgZmFpbGVkXG4iKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZm9yayBkYWVtb246ICVzIiwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgMDoKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJpbiBjaGlsZCwgY2xvc2luZyBzdGQgZmlsZSBkZXNjcmlwdG9yc1xuIik7CisKKyAgICAgIC8qIHNpbGVudGx5IGlnbm9yZSBmYWlsdXJlcyBoZXJlLCBpZiBzb21lb25lCisgICAgICAgKiBkb2Vzbid0IGhhdmUgL2Rldi9udWxsIHdlIG1heSBhcyB3ZWxsIHRyeQorICAgICAgICogdG8gY29udGludWUgYW55aG93CisgICAgICAgKi8KKyAgICAgIAorICAgICAgZGV2X251bGxfZmQgPSBvcGVuICgiL2Rldi9udWxsIiwgT19SRFdSKTsKKyAgICAgIGlmIChkZXZfbnVsbF9mZCA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgZHVwMiAoZGV2X251bGxfZmQsIDApOworICAgICAgICAgIGR1cDIgKGRldl9udWxsX2ZkLCAxKTsKKyAgICAgICAgICAKKyAgICAgICAgICBzID0gX2RidXNfZ2V0ZW52ICgiREJVU19ERUJVR19PVVRQVVQiKTsKKyAgICAgICAgICBpZiAocyA9PSBOVUxMIHx8ICpzID09ICdcMCcpCisgICAgICAgICAgICBkdXAyIChkZXZfbnVsbF9mZCwgMik7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoImtlZXBpbmcgc3RkZXJyIG9wZW4gZHVlIHRvIERCVVNfREVCVUdfT1VUUFVUXG4iKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIWtlZXBfdW1hc2spCisgICAgICAgIHsKKyAgICAgICAgICAvKiBHZXQgYSBwcmVkaWN0YWJsZSB1bWFzayAqLworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJzZXR0aW5nIHVtYXNrXG4iKTsKKyAgICAgICAgICB1bWFzayAoMDIyKTsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c192ZXJib3NlICgiY2FsbGluZyBzZXRzaWQoKVxuIik7CisgICAgICBpZiAoc2V0c2lkICgpID09IC0xKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzZXRzaWQoKSBmYWlsZWQiKTsKKyAgICAgIAorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKCFfZGJ1c193cml0ZV9waWRfdG9fZmlsZV9hbmRfcGlwZSAocGlkZmlsZSwgcHJpbnRfcGlkX3BpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF9waWQsIGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJwaWQgZmlsZSBvciBwaXBlIHdyaXRlIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICAgIGtpbGwgKGNoaWxkX3BpZCwgU0lHVEVSTSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJwYXJlbnQgZXhpdGluZ1xuIik7CisgICAgICBfZXhpdCAoMCk7CisgICAgICBicmVhazsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworCisvKioKKyAqIENyZWF0ZXMgYSBmaWxlIGNvbnRhaW5pbmcgdGhlIHByb2Nlc3MgSUQuCisgKgorICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlbmFtZSB0byB3cml0ZSB0bworICogQHBhcmFtIHBpZCBvdXIgcHJvY2VzcyBJRAorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3JzCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZQorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX3dyaXRlX3BpZF9maWxlIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICBwaWQsCisJCSAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpjZmlsZW5hbWU7CisgIGludCBmZDsKKyAgRklMRSAqZjsKKworICBjZmlsZW5hbWUgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKyAgCisgIGZkID0gb3BlbiAoY2ZpbGVuYW1lLCBPX1dST05MWXxPX0NSRUFUfE9fRVhDTHxPX0JJTkFSWSwgMDY0NCk7CisgIAorICBpZiAoZmQgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gb3BlbiBcIiVzXCI6ICVzIiwgY2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoKGYgPSBmZG9wZW4gKGZkLCAidyIpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZmRvcGVuIGZkICVkOiAlcyIsIGZkLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKGZwcmludGYgKGYsICIlbHVcbiIsIHBpZCkgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gd3JpdGUgdG8gXCIlc1wiOiAlcyIsIGNmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIAorICAgICAgZmNsb3NlIChmKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKGZjbG9zZSAoZikgPT0gRU9GKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY2xvc2UgXCIlc1wiOiAlcyIsIGNmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBXcml0ZXMgdGhlIGdpdmVuIHBpZF90b193cml0ZSB0byBhIHBpZGZpbGUgKGlmIG5vbi1OVUxMKSBhbmQvb3IgdG8gYQorICogcGlwZSAoaWYgbm9uLU5VTEwpLiBEb2VzIG5vdGhpbmcgaWYgcGlkZmlsZSBhbmQgcHJpbnRfcGlkX3BpcGUgYXJlIGJvdGgKKyAqIE5VTEwuCisgKgorICogQHBhcmFtIHBpZGZpbGUgdGhlIGZpbGUgdG8gd3JpdGUgdG8gb3IgI05VTEwKKyAqIEBwYXJhbSBwcmludF9waWRfcGlwZSB0aGUgcGlwZSB0byB3cml0ZSB0byBvciAjTlVMTAorICogQHBhcmFtIHBpZF90b193cml0ZSB0aGUgcGlkIHRvIHdyaXRlIG91dAorICogQHBhcmFtIGVycm9yIGVycm9yIG9uIGZhaWx1cmUKKyAqIEByZXR1cm5zIEZBTFNFIGlmIGVycm9yIGlzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfd3JpdGVfcGlkX3RvX2ZpbGVfYW5kX3BpcGUgKGNvbnN0IERCdXNTdHJpbmcgKnBpZGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BpcGUgICAgICAgICAqcHJpbnRfcGlkX3BpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19waWRfdCAgICAgICAgcGlkX3RvX3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBpZiAocGlkZmlsZSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgid3JpdGluZyBwaWQgZmlsZSAlc1xuIiwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChwaWRmaWxlKSk7CisgICAgICBpZiAoIV9kYnVzX3dyaXRlX3BpZF9maWxlIChwaWRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3RvX3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInBpZCBmaWxlIHdyaXRlIGZhaWxlZFxuIik7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIHBpZCBmaWxlIHJlcXVlc3RlZFxuIik7CisgICAgfQorCisgIGlmIChwcmludF9waWRfcGlwZSAhPSBOVUxMICYmIF9kYnVzX3BpcGVfaXNfdmFsaWQgKHByaW50X3BpZF9waXBlKSkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIHBpZDsKKyAgICAgIGludCBieXRlczsKKworICAgICAgX2RidXNfdmVyYm9zZSAoIndyaXRpbmcgb3VyIHBpZCB0byBwaXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgcHJpbnRfcGlkX3BpcGUtPmZkKTsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnBpZCkpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisJICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9pbnQgKCZwaWQsIHBpZF90b193cml0ZSkgfHwKKyAgICAgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJnBpZCwgIlxuIikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBpZCk7CisgICAgICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCSAgCisgICAgICBieXRlcyA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmcGlkKTsKKyAgICAgIGlmIChfZGJ1c19waXBlX3dyaXRlIChwcmludF9waWRfcGlwZSwgJnBpZCwgMCwgYnl0ZXMsIGVycm9yKSAhPSBieXRlcykKKyAgICAgICAgeworICAgICAgICAgIC8qIF9kYnVzX3BpcGVfd3JpdGUgc2V0cyBlcnJvciBvbmx5IG9uIGZhaWx1cmUsIG5vdCBzaG9ydCB3cml0ZSAqLworICAgICAgICAgIGlmIChlcnJvciAhPSBOVUxMICYmICFkYnVzX2Vycm9yX2lzX3NldChlcnJvcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbnRpbmcgbWVzc2FnZSBidXMgUElEOiBkaWQgbm90IHdyaXRlIGVub3VnaCBieXRlc1xuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwaWQpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCSAgCisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBpZCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIHBpZCBwaXBlIHRvIHdyaXRlIHRvXG4iKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogVmVyaWZ5IHRoYXQgYWZ0ZXIgdGhlIGZvcmsgd2UgY2FuIHN1Y2Nlc3NmdWxseSBjaGFuZ2UgdG8gdGhpcyB1c2VyLgorICoKKyAqIEBwYXJhbSB1c2VyIHRoZSB1c2VybmFtZSBnaXZlbiBpbiB0aGUgZGFlbW9uIGNvbmZpZ3VyYXRpb24KKyAqIEByZXR1cm5zICNUUlVFIGlmIHVzZXJuYW1lIGlzIHZhbGlkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c192ZXJpZnlfZGFlbW9uX3VzZXIgKGNvbnN0IGNoYXIgKnVzZXIpCit7CisgIERCdXNTdHJpbmcgdTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnUsIHVzZXIpOworCisgIHJldHVybiBfZGJ1c19nZXRfdXNlcl9pZF9hbmRfcHJpbWFyeV9ncm91cCAoJnUsIE5VTEwsIE5VTEwpOworfQorCisKKy8qIFRoZSBIQVZFX0xJQkFVRElUIGNhc2UgbGl2ZXMgaW4gc2VsaW51eC5jICovCisjaWZuZGVmIEhBVkVfTElCQVVESVQKKy8qKgorICogQ2hhbmdlcyB0aGUgdXNlciBhbmQgZ3JvdXAgdGhlIGJ1cyBpcyBydW5uaW5nIGFzLgorICoKKyAqIEBwYXJhbSB1c2VyIHRoZSB1c2VyIHRvIGJlY29tZQorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3JzCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY2hhbmdlX3RvX2RhZW1vbl91c2VyICAoY29uc3QgY2hhciAgICAqdXNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgKmVycm9yKQoreworICBkYnVzX3VpZF90IHVpZDsKKyAgZGJ1c19naWRfdCBnaWQ7CisgIERCdXNTdHJpbmcgdTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnUsIHVzZXIpOworCisgIGlmICghX2RidXNfZ2V0X3VzZXJfaWRfYW5kX3ByaW1hcnlfZ3JvdXAgKCZ1LCAmdWlkLCAmZ2lkKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJVc2VyICclcycgZG9lcyBub3QgYXBwZWFyIHRvIGV4aXN0PyIsCisgICAgICAgICAgICAgICAgICAgICAgdXNlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIHNldGdyb3VwcygpIG9ubHkgd29ya3MgaWYgd2UgYXJlIGEgcHJpdmlsZWdlZCBwcm9jZXNzLAorICAgKiBzbyB3ZSBkb24ndCByZXR1cm4gZXJyb3Igb24gZmFpbHVyZTsgdGhlIG9ubHkgcG9zc2libGUKKyAgICogZmFpbHVyZSBpcyB0aGF0IHdlIGRvbid0IGhhdmUgcGVybXMgdG8gZG8gaXQuCisgICAqCisgICAqIG5vdCBzdXJlIHRoaXMgaXMgcmlnaHQsIG1heWJlIGlmIHNldHVpZCgpCisgICAqIGlzIGdvaW5nIHRvIHdvcmsgdGhlbiBzZXRncm91cHMoKSBzaG91bGQgYWxzbyB3b3JrLgorICAgKi8KKyAgaWYgKHNldGdyb3VwcyAoMCwgTlVMTCkgPCAwKQorICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gZHJvcCBzdXBwbGVtZW50YXJ5IGdyb3VwczogJXNcbiIsCisgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgLyogU2V0IEdJRCBmaXJzdCwgb3IgdGhlIHNldHVpZCBtYXkgcmVtb3ZlIG91ciBwZXJtaXNzaW9uCisgICAqIHRvIGNoYW5nZSB0aGUgR0lECisgICAqLworICBpZiAoc2V0Z2lkIChnaWQpIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCBHSUQgdG8gJWx1OiAlcyIsIGdpZCwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKHNldHVpZCAodWlkKSA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZXQgVUlEIHRvICVsdTogJXMiLCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8qICFIQVZFX0xJQkFVRElUICovCisKKworLyoqCisgKiBBdHRlbXB0IHRvIGVuc3VyZSB0aGF0IHRoZSBjdXJyZW50IHByb2Nlc3MgY2FuIG9wZW4KKyAqIGF0IGxlYXN0IEBsaW1pdCBmaWxlIGRlc2NyaXB0b3JzLgorICoKKyAqIElmIEBsaW1pdCBpcyBsb3dlciB0aGFuIHRoZSBjdXJyZW50LCBpdCB3aWxsIG5vdCBiZQorICogbG93ZXJlZC4gIE5vIGVycm9yIGlzIHJldHVybmVkIGlmIHRoZSByZXF1ZXN0IGNhbgorICogbm90IGJlIHNhdGlzZmllZC4KKyAqCisgKiBAbGltaXQgTnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMKKyAqLwordm9pZAorX2RidXNfcmVxdWVzdF9maWxlX2Rlc2NyaXB0b3JfbGltaXQgKHVuc2lnbmVkIGludCBsaW1pdCkKK3sKKyNpZmRlZiBIQVZFX1NFVFJMSU1JVAorICBzdHJ1Y3QgcmxpbWl0IGxpbTsKKyAgc3RydWN0IHJsaW1pdCB0YXJnZXRfbGltOworCisgIC8qIE5vIHBvaW50IHRvIGRvaW5nIHRoaXMgcHJhY3RpY2FsbHkgc3BlYWtpbmcKKyAgICogaWYgd2UncmUgbm90IHVpZCAwLiAgV2UgZXhwZWN0IHRoZSBzeXN0ZW0KKyAgICogYnVzIHRvIHVzZSB0aGlzIGJlZm9yZSB3ZSBjaGFuZ2UgVUlELCBhbmQKKyAgICogdGhlIHNlc3Npb24gYnVzIHRha2VzIHRoZSBMaW51eCBkZWZhdWx0CisgICAqIG9mIDEwMjQgZm9yIGJvdGggY3VyIGFuZCBtYXguCisgICAqLworICBpZiAoZ2V0dWlkICgpICE9IDApCisgICAgcmV0dXJuOworCisgIGlmIChnZXRybGltaXQgKFJMSU1JVF9OT0ZJTEUsICZsaW0pIDwgMCkKKyAgICByZXR1cm47CisKKyAgaWYgKGxpbS5ybGltX2N1ciA+PSBsaW1pdCkKKyAgICByZXR1cm47CisKKyAgLyogSWdub3JlICJtYXhpbXVtIGxpbWl0IiwgYXNzdW1lIHdlIGhhdmUgdGhlICJzdXBlcnVzZXIiCisgICAqIHByaXZpbGVnZXMuICBPbiBMaW51eCB0aGlzIGlzIENBUF9TWVNfUkVTT1VSQ0UuCisgICAqLworICB0YXJnZXRfbGltLnJsaW1fY3VyID0gdGFyZ2V0X2xpbS5ybGltX21heCA9IGxpbWl0OworICAvKiBBbHNvIGlnbm9yZSBlcnJvcnM7IGlmIHdlIGZhaWwsIHdlIHdpbGwgYXQgbGVhc3Qgd29yaworICAgKiB1cCB0byB3aGF0ZXZlciBsaW1pdCB3ZSBoYWQsIHdoaWNoIHNlZW1zIGJldHRlciB0aGFuCisgICAqIGp1c3Qgb3V0cmlnaHQgYWJvcnRpbmcuCisgICAqCisgICAqIEhvd2V2ZXIsIGluIHRoZSBmdXR1cmUgd2Ugc2hvdWxkIHByb2JhYmx5IGxvZyB0aGlzIHNvIE9TIGJ1aWxkZXJzCisgICAqIGhhdmUgYSBjaGFuY2UgdG8gbm90aWNlIGFueSBtaXNjb25maWd1cmF0aW9uIGxpa2UgZGJ1cy1kYWVtb24KKyAgICogYmVpbmcgc3RhcnRlZCB3aXRob3V0IENBUF9TWVNfUkVTT1VSQ0UuCisgICAqLworICBzZXRybGltaXQgKFJMSU1JVF9OT0ZJTEUsICZ0YXJnZXRfbGltKTsKKyNlbmRpZgorfQorCit2b2lkCitfZGJ1c19pbml0X3N5c3RlbV9sb2cgKHZvaWQpCit7CisjaWYgSEFWRV9ERUNMX0xPR19QRVJST1IKKyAgb3BlbmxvZyAoImRidXMiLCBMT0dfUElEIHwgTE9HX1BFUlJPUiwgTE9HX0RBRU1PTik7CisjZWxzZQorICBvcGVubG9nICgiZGJ1cyIsIExPR19QSUQsIExPR19EQUVNT04pOworI2VuZGlmCit9CisKKy8qKgorICogTG9nIGEgbWVzc2FnZSB0byB0aGUgc3lzdGVtIGxvZyBmaWxlIChlLmcuIHN5c2xvZyBvbiBVbml4KS4KKyAqCisgKiBAcGFyYW0gc2V2ZXJpdHkgYSBzZXZlcml0eSB2YWx1ZQorICogQHBhcmFtIG1zZyBhIHByaW50Zi1zdHlsZSBmb3JtYXQgc3RyaW5nCisgKiBAcGFyYW0gYXJncyBhcmd1bWVudHMgZm9yIHRoZSBmb3JtYXQgc3RyaW5nCisgKgorICovCit2b2lkCitfZGJ1c19zeXN0ZW1fbG9nIChEQnVzU3lzdGVtTG9nU2V2ZXJpdHkgc2V2ZXJpdHksIGNvbnN0IGNoYXIgKm1zZywgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisKKyAgdmFfc3RhcnQgKGFyZ3MsIG1zZyk7CisKKyAgX2RidXNfc3lzdGVtX2xvZ3YgKHNldmVyaXR5LCBtc2csIGFyZ3MpOworCisgIHZhX2VuZCAoYXJncyk7Cit9CisKKy8qKgorICogTG9nIGEgbWVzc2FnZSB0byB0aGUgc3lzdGVtIGxvZyBmaWxlIChlLmcuIHN5c2xvZyBvbiBVbml4KS4KKyAqCisgKiBAcGFyYW0gc2V2ZXJpdHkgYSBzZXZlcml0eSB2YWx1ZQorICogQHBhcmFtIG1zZyBhIHByaW50Zi1zdHlsZSBmb3JtYXQgc3RyaW5nCisgKiBAcGFyYW0gYXJncyBhcmd1bWVudHMgZm9yIHRoZSBmb3JtYXQgc3RyaW5nCisgKgorICogSWYgdGhlIEZBVEFMIHNldmVyaXR5IGlzIGdpdmVuLCB0aGlzIGZ1bmN0aW9uIHdpbGwgdGVybWluYXRlIHRoZSBwcm9ncmFtCisgKiB3aXRoIGFuIGVycm9yIGNvZGUuCisgKi8KK3ZvaWQKK19kYnVzX3N5c3RlbV9sb2d2IChEQnVzU3lzdGVtTG9nU2V2ZXJpdHkgc2V2ZXJpdHksIGNvbnN0IGNoYXIgKm1zZywgdmFfbGlzdCBhcmdzKQoreworICBpbnQgZmxhZ3M7CisgIHN3aXRjaCAoc2V2ZXJpdHkpCisgICAgeworICAgICAgY2FzZSBEQlVTX1NZU1RFTV9MT0dfSU5GTzoKKyAgICAgICAgZmxhZ3MgPSAgTE9HX0RBRU1PTiB8IExPR19OT1RJQ0U7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBEQlVTX1NZU1RFTV9MT0dfU0VDVVJJVFk6CisgICAgICAgIGZsYWdzID0gTE9HX0FVVEggfCBMT0dfTk9USUNFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgREJVU19TWVNURU1fTE9HX0ZBVEFMOgorICAgICAgICBmbGFncyA9IExPR19EQUVNT058TE9HX0NSSVQ7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmbmRlZiBIQVZFX0RFQ0xfTE9HX1BFUlJPUgorICAgIHsKKyAgICAgIC8qIHZzeXNsb2coKSB3b24ndCB3cml0ZSB0byBzdGRlcnIsIHNvIHdlJ2QgYmV0dGVyIGRvIGl0ICovCisgICAgICB2YV9saXN0IHRtcDsKKworICAgICAgREJVU19WQV9DT1BZICh0bXAsIGFyZ3MpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZGJ1c1siIERCVVNfUElEX0ZPUk1BVCAiXTogIiwgX2RidXNfZ2V0cGlkICgpKTsKKyAgICAgIHZmcHJpbnRmIChzdGRlcnIsIG1zZywgdG1wKTsKKyAgICAgIGZwdXRjICgnXG4nLCBzdGRlcnIpOworICAgICAgdmFfZW5kICh0bXApOworICAgIH0KKyNlbmRpZgorCisgIHZzeXNsb2cgKGZsYWdzLCBtc2csIGFyZ3MpOworCisgIGlmIChzZXZlcml0eSA9PSBEQlVTX1NZU1RFTV9MT0dfRkFUQUwpCisgICAgZXhpdCAoMSk7Cit9CisKKy8qKiBJbnN0YWxscyBhIFVOSVggc2lnbmFsIGhhbmRsZXIKKyAqCisgKiBAcGFyYW0gc2lnIHRoZSBzaWduYWwgdG8gaGFuZGxlCisgKiBAcGFyYW0gaGFuZGxlciB0aGUgaGFuZGxlcgorICovCit2b2lkCitfZGJ1c19zZXRfc2lnbmFsX2hhbmRsZXIgKGludCAgICAgICAgICAgICAgIHNpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NpZ25hbEhhbmRsZXIgaGFuZGxlcikKK3sKKyAgc3RydWN0IHNpZ2FjdGlvbiBhY3Q7CisgIHNpZ3NldF90IGVtcHR5X21hc2s7CisgIAorICBzaWdlbXB0eXNldCAoJmVtcHR5X21hc2spOworICBhY3Quc2FfaGFuZGxlciA9IGhhbmRsZXI7CisgIGFjdC5zYV9tYXNrICAgID0gZW1wdHlfbWFzazsKKyAgYWN0LnNhX2ZsYWdzICAgPSAwOworICBzaWdhY3Rpb24gKHNpZywgICZhY3QsIE5VTEwpOworfQorCisvKiogQ2hlY2tzIGlmIGEgZmlsZSBleGlzdHMKKyoKKyogQHBhcmFtIGZpbGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlCisqIEByZXR1cm5zICNUUlVFIGlmIGZpbGUgZXhpc3RzCisqLworZGJ1c19ib29sX3QgCitfZGJ1c19maWxlX2V4aXN0cyAoY29uc3QgY2hhciAqZmlsZSkKK3sKKyAgcmV0dXJuIChhY2Nlc3MgKGZpbGUsIEZfT0spID09IDApOworfQorCisvKiogQ2hlY2tzIGlmIHVzZXIgaXMgYXQgdGhlIGNvbnNvbGUKKyoKKyogQHBhcmFtIHVzZXJuYW1lIHVzZXIgdG8gY2hlY2sKKyogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3JzCisqIEByZXR1cm5zICNUUlVFIGlzIHRoZSB1c2VyIGlzIGF0IHRoZSBjb25zb2xlaSBhbmQgdGhlcmUgYXJlIG5vIGVycm9ycworKi8KK2RidXNfYm9vbF90IAorX2RidXNfdXNlcl9hdF9jb25zb2xlIChjb25zdCBjaGFyICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisKKyAgREJ1c1N0cmluZyB1LCBmOworICBkYnVzX2Jvb2xfdCByZXN1bHQ7CisKKyAgcmVzdWx0ID0gRkFMU0U7CisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmYsIERCVVNfQ09OU09MRV9BVVRIX0RJUikpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdSwgdXNlcm5hbWUpOworCisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmYsICZ1KSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmVzdWx0ID0gX2RidXNfZmlsZV9leGlzdHMgKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmYpKTsKKworIG91dDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIGZpbGVuYW1lIGlzIGFuIGFic29sdXRlIHBhdGgKKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lCisgKiBAcmV0dXJucyAjVFJVRSBpZiBhbiBhYnNvbHV0ZSBwYXRoCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19wYXRoX2lzX2Fic29sdXRlIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSkKK3sKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChmaWxlbmFtZSkgPiAwKQorICAgIHJldHVybiBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGZpbGVuYW1lLCAwKSA9PSAnLyc7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogc3RhdCgpIHdyYXBwZXIuCisgKgorICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlbmFtZSB0byBzdGF0CisgKiBAcGFyYW0gc3RhdGJ1ZiB0aGUgc3RhdCBpbmZvIHRvIGZpbGwgaW4KKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9yCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgZXJyb3Igd2FzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RhdCAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICBEQnVzU3RhdCAgICAgICAgICpzdGF0YnVmLAorICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisgIHN0cnVjdCBzdGF0IHNiOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAgZmlsZW5hbWVfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworCisgIGlmIChzdGF0IChmaWxlbmFtZV9jLCAmc2IpIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiJXMiLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgc3RhdGJ1Zi0+bW9kZSA9IHNiLnN0X21vZGU7CisgIHN0YXRidWYtPm5saW5rID0gc2Iuc3Rfbmxpbms7CisgIHN0YXRidWYtPnVpZCA9IHNiLnN0X3VpZDsKKyAgc3RhdGJ1Zi0+Z2lkID0gc2Iuc3RfZ2lkOworICBzdGF0YnVmLT5zaXplID0gc2Iuc3Rfc2l6ZTsKKyAgc3RhdGJ1Zi0+YXRpbWUgPSBzYi5zdF9hdGltZTsKKyAgc3RhdGJ1Zi0+bXRpbWUgPSBzYi5zdF9tdGltZTsKKyAgc3RhdGJ1Zi0+Y3RpbWUgPSBzYi5zdF9jdGltZTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKioKKyAqIEludGVybmFscyBvZiBkaXJlY3RvcnkgaXRlcmF0b3IKKyAqLworc3RydWN0IERCdXNEaXJJdGVyCit7CisgIERJUiAqZDsgLyoqPCBUaGUgRElSKiBmcm9tIG9wZW5kaXIoKSAqLworICAKK307CisKKy8qKgorICogT3BlbiBhIGRpcmVjdG9yeSB0byBpdGVyYXRlIG92ZXIuCisgKgorICogQHBhcmFtIGZpbGVuYW1lIHRoZSBkaXJlY3RvcnkgbmFtZQorICogQHBhcmFtIGVycm9yIGV4Y2VwdGlvbiByZXR1cm4gb2JqZWN0IG9yICNOVUxMCisgKiBAcmV0dXJucyBuZXcgaXRlcmF0b3IsIG9yICNOVUxMIG9uIGVycm9yCisgKi8KK0RCdXNEaXJJdGVyKgorX2RidXNfZGlyZWN0b3J5X29wZW4gKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBESVIgKmQ7CisgIERCdXNEaXJJdGVyICppdGVyOworICBjb25zdCBjaGFyICpmaWxlbmFtZV9jOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAgZmlsZW5hbWVfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworCisgIGQgPSBvcGVuZGlyIChmaWxlbmFtZV9jKTsKKyAgaWYgKGQgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlYWQgZGlyZWN0b3J5IFwiJXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIGl0ZXIgPSBkYnVzX25ldzAgKERCdXNEaXJJdGVyLCAxKTsKKyAgaWYgKGl0ZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBjbG9zZWRpciAoZCk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBkaXJlY3RvcnkgaXRlcmF0b3IiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpdGVyLT5kID0gZDsKKworICByZXR1cm4gaXRlcjsKK30KKworLyoqCisgKiBHZXQgbmV4dCBmaWxlIGluIHRoZSBkaXJlY3RvcnkuIFdpbGwgbm90IHJldHVybiAiLiIgb3IgIi4uIiAgb24KKyAqIFVOSVguIElmIGFuIGVycm9yIG9jY3VycywgdGhlIGNvbnRlbnRzIG9mICJmaWxlbmFtZSIgYXJlCisgKiB1bmRlZmluZWQuIFRoZSBlcnJvciBpcyBuZXZlciBzZXQgaWYgdGhlIGZ1bmN0aW9uIHN1Y2NlZWRzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlLWVudHJhbnQsIGFuZCBub3QgbmVjZXNzYXJpbHkgdGhyZWFkLXNhZmUuCisgKiBPbmx5IHVzZSBpdCBmb3IgdGVzdCBjb2RlIG9yIHNpbmdsZS10aHJlYWRlZCB1dGlsaXRpZXMuCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gZmlsZW5hbWUgc3RyaW5nIHRvIGJlIHNldCB0byB0aGUgbmV4dCBmaWxlIGluIHRoZSBkaXIKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9yCisgKiBAcmV0dXJucyAjVFJVRSBpZiBmaWxlbmFtZSB3YXMgZmlsbGVkIGluIHdpdGggYSBuZXcgZmlsZW5hbWUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2RpcmVjdG9yeV9nZXRfbmV4dF9maWxlIChEQnVzRGlySXRlciAgICAgICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBzdHJ1Y3QgZGlyZW50ICplbnQ7CisgIGludCBlcnI7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyBhZ2FpbjoKKyAgZXJybm8gPSAwOworICBlbnQgPSByZWFkZGlyIChpdGVyLT5kKTsKKworICBpZiAoIWVudCkKKyAgICB7CisgICAgICBlcnIgPSBlcnJubzsKKworICAgICAgaWYgKGVyciAhPSAwKQorICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzIiwgX2RidXNfc3RyZXJyb3IgKGVycikpOworCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlIGlmIChlbnQtPmRfbmFtZVswXSA9PSAnLicgJiYKKyAgICAgICAgICAgKGVudC0+ZF9uYW1lWzFdID09ICdcMCcgfHwKKyAgICAgICAgICAgIChlbnQtPmRfbmFtZVsxXSA9PSAnLicgJiYgZW50LT5kX25hbWVbMl0gPT0gJ1wwJykpKQorICAgIGdvdG8gYWdhaW47CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoZmlsZW5hbWUsIDApOworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kIChmaWxlbmFtZSwgZW50LT5kX25hbWUpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIG1lbW9yeSB0byByZWFkIGRpcmVjdG9yeSBlbnRyeSIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogQ2xvc2VzIGEgZGlyZWN0b3J5IGl0ZXJhdGlvbi4KKyAqLwordm9pZAorX2RidXNfZGlyZWN0b3J5X2Nsb3NlIChEQnVzRGlySXRlciAqaXRlcikKK3sKKyAgY2xvc2VkaXIgKGl0ZXItPmQpOworICBkYnVzX2ZyZWUgKGl0ZXIpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ZpbGxfdXNlcl9pbmZvX2Zyb21fZ3JvdXAgKHN0cnVjdCBncm91cCAgKmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzR3JvdXBJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAqZXJyb3IpCit7CisgIF9kYnVzX2Fzc2VydCAoZy0+Z3JfbmFtZSAhPSBOVUxMKTsKKyAgCisgIGluZm8tPmdpZCA9IGctPmdyX2dpZDsKKyAgaW5mby0+Z3JvdXBuYW1lID0gX2RidXNfc3RyZHVwIChnLT5ncl9uYW1lKTsKKworICAvKiBpbmZvLT5tZW1iZXJzID0gZGJ1c19zdHJkdXB2IChnLT5ncl9tZW0pICovCisgIAorICBpZiAoaW5mby0+Z3JvdXBuYW1lID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ZpbGxfZ3JvdXBfaW5mbyAoREJ1c0dyb3VwSW5mbyAgICAqaW5mbywKKyAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAgZ2lkLAorICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpncm91cG5hbWUsCisgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpncm91cF9jX3N0cjsKKworICBfZGJ1c19hc3NlcnQgKGdyb3VwbmFtZSAhPSBOVUxMIHx8IGdpZCAhPSBEQlVTX0dJRF9VTlNFVCk7CisgIF9kYnVzX2Fzc2VydCAoZ3JvdXBuYW1lID09IE5VTEwgfHwgZ2lkID09IERCVVNfR0lEX1VOU0VUKTsKKworICBpZiAoZ3JvdXBuYW1lKQorICAgIGdyb3VwX2Nfc3RyID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChncm91cG5hbWUpOworICBlbHNlCisgICAgZ3JvdXBfY19zdHIgPSBOVUxMOworICAKKyAgLyogRm9yIG5vdyBhc3N1bWluZyB0aGF0IHRoZSBnZXRncm5hbSgpIGFuZCBnZXRncmdpZCgpIGZsYXZvcnMKKyAgICogYWx3YXlzIGNvcnJlc3BvbmQgdG8gdGhlIHB3bmFtIGZsYXZvcnMsIGlmIG5vdCB3ZSBoYXZlCisgICAqIHRvIGFkZCBtb3JlIGNvbmZpZ3VyZSBjaGVja3MuCisgICAqLworICAKKyNpZiBkZWZpbmVkIChIQVZFX1BPU0lYX0dFVFBXTkFNX1IpIHx8IGRlZmluZWQgKEhBVkVfTk9OUE9TSVhfR0VUUFdOQU1fUikKKyAgeworICAgIHN0cnVjdCBncm91cCAqZzsKKyAgICBpbnQgcmVzdWx0OworICAgIHNpemVfdCBidWZsZW47CisgICAgY2hhciAqYnVmOworICAgIHN0cnVjdCBncm91cCBnX3N0cjsKKyAgICBkYnVzX2Jvb2xfdCBiOworCisgICAgLyogcmV0cmlldmUgbWF4aW11bSBuZWVkZWQgc2l6ZSBmb3IgYnVmICovCisgICAgYnVmbGVuID0gc3lzY29uZiAoX1NDX0dFVEdSX1JfU0laRV9NQVgpOworCisgICAgLyogc3lzY29uZiBhY3R1YWxseSByZXR1cm5zIGEgbG9uZywgYnV0IGV2ZXJ5dGhpbmcgZWxzZSBleHBlY3RzIHNpemVfdCwKKyAgICAgKiBzbyBqdXN0IHJlY2FzdCBoZXJlLgorICAgICAqIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTE3MDYxCisgICAgICovCisgICAgaWYgKChsb25nKSBidWZsZW4gPD0gMCkKKyAgICAgIGJ1ZmxlbiA9IDEwMjQ7CisKKyAgICByZXN1bHQgPSAtMTsKKyAgICB3aGlsZSAoMSkKKyAgICAgIHsKKyAgICAgICAgYnVmID0gZGJ1c19tYWxsb2MgKGJ1Zmxlbik7CisgICAgICAgIGlmIChidWYgPT0gTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICB9CisKKyAgICAgICAgZyA9IE5VTEw7CisjaWZkZWYgSEFWRV9QT1NJWF9HRVRQV05BTV9SCisgICAgICAgIGlmIChncm91cF9jX3N0cikKKyAgICAgICAgICByZXN1bHQgPSBnZXRncm5hbV9yIChncm91cF9jX3N0ciwgJmdfc3RyLCBidWYsIGJ1ZmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXN1bHQgPSBnZXRncmdpZF9yIChnaWQsICZnX3N0ciwgYnVmLCBidWZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmcpOworI2Vsc2UKKyAgICAgICAgZyA9IGdldGdybmFtX3IgKGdyb3VwX2Nfc3RyLCAmZ19zdHIsIGJ1ZiwgYnVmbGVuKTsKKyAgICAgICAgcmVzdWx0ID0gMDsKKyNlbmRpZiAvKiAhSEFWRV9QT1NJWF9HRVRQV05BTV9SICovCisgICAgICAgIC8qIFRyeSBhIGJpZ2dlciBidWZmZXIgaWYgRVJBTkdFIHdhcyByZXR1cm5lZDoKKyAgICAgICAgICAgaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY3MjcKKyAgICAgICAgKi8KKyAgICAgICAgaWYgKHJlc3VsdCA9PSBFUkFOR0UgJiYgYnVmbGVuIDwgNTEyICogMTAyNCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX2ZyZWUgKGJ1Zik7CisgICAgICAgICAgICBidWZsZW4gKj0gMjsKKyAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICB9CisKKyAgICBpZiAocmVzdWx0ID09IDAgJiYgZyA9PSAmZ19zdHIpCisgICAgICB7CisgICAgICAgIGIgPSBmaWxsX3VzZXJfaW5mb19mcm9tX2dyb3VwIChnLCBpbmZvLCBlcnJvcik7CisgICAgICAgIGRidXNfZnJlZSAoYnVmKTsKKyAgICAgICAgcmV0dXJuIGI7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJHcm91cCAlcyB1bmtub3duIG9yIGZhaWxlZCB0byBsb29rIGl0IHVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfY19zdHIgPyBncm91cF9jX3N0ciA6ICI/Pz8iKTsKKyAgICAgICAgZGJ1c19mcmVlIChidWYpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgIH0KKyNlbHNlIC8qICEgSEFWRV9HRVRQV05BTV9SICovCisgIHsKKyAgICAvKiBJIGd1ZXNzIHdlJ3JlIHNjcmV3ZWQgb24gdGhyZWFkIHNhZmV0eSBoZXJlICovCisgICAgc3RydWN0IGdyb3VwICpnOworCisgICAgZyA9IGdldGdybmFtIChncm91cF9jX3N0cik7CisKKyAgICBpZiAoZyAhPSBOVUxMKQorICAgICAgeworICAgICAgICByZXR1cm4gZmlsbF91c2VyX2luZm9fZnJvbV9ncm91cCAoZywgaW5mbywgZXJyb3IpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAiR3JvdXAgJXMgdW5rbm93biBvciBmYWlsZWQgdG8gbG9vayBpdCB1cFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2Nfc3RyID8gZ3JvdXBfY19zdHIgOiAiPz8/Iik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgfQorI2VuZGlmICAvKiAhIEhBVkVfR0VUUFdOQU1fUiAqLworfQorCisvKioKKyAqIEluaXRpYWxpemVzIHRoZSBnaXZlbiBEQnVzR3JvdXBJbmZvIHN0cnVjdAorICogd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZ2l2ZW4gZ3JvdXAgbmFtZS4KKyAqCisgKiBAcGFyYW0gaW5mbyB0aGUgZ3JvdXAgaW5mbyBzdHJ1Y3QKKyAqIEBwYXJhbSBncm91cG5hbWUgbmFtZSBvZiBncm91cAorICogQHBhcmFtIGVycm9yIHRoZSBlcnJvciByZXR1cm4KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciBpcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dyb3VwX2luZm9fZmlsbCAoREJ1c0dyb3VwSW5mbyAgICAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZ3JvdXBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgcmV0dXJuIGZpbGxfZ3JvdXBfaW5mbyAoaW5mbywgREJVU19HSURfVU5TRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwbmFtZSwgZXJyb3IpOworCit9CisKKy8qKgorICogSW5pdGlhbGl6ZXMgdGhlIGdpdmVuIERCdXNHcm91cEluZm8gc3RydWN0CisgKiB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBnaXZlbiBncm91cCBJRC4KKyAqCisgKiBAcGFyYW0gaW5mbyB0aGUgZ3JvdXAgaW5mbyBzdHJ1Y3QKKyAqIEBwYXJhbSBnaWQgZ3JvdXAgSUQKKyAqIEBwYXJhbSBlcnJvciB0aGUgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgZXJyb3IgaXMgc2V0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19ncm91cF9pbmZvX2ZpbGxfZ2lkIChEQnVzR3JvdXBJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgZ2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAqZXJyb3IpCit7CisgIHJldHVybiBmaWxsX2dyb3VwX2luZm8gKGluZm8sIGdpZCwgTlVMTCwgZXJyb3IpOworfQorCisvKioKKyAqIFBhcnNlIGEgVU5JWCB1c2VyIGZyb20gdGhlIGJ1cyBjb25maWcgZmlsZS4gT24gV2luZG93cywgdGhpcyBzaG91bGQKKyAqIHNpbXBseSBhbHdheXMgZmFpbCAoanVzdCByZXR1cm4gI0ZBTFNFKS4KKyAqCisgKiBAcGFyYW0gdXNlcm5hbWUgdGhlIHVzZXJuYW1lIHRleHQKKyAqIEBwYXJhbSB1aWRfcCBwbGFjZSB0byByZXR1cm4gdGhlIHVpZAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfcGFyc2VfdW5peF91c2VyX2Zyb21fY29uZmlnIChjb25zdCBEQnVzU3RyaW5nICAqdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWlkX3QgICAgICAgICp1aWRfcCkKK3sKKyAgcmV0dXJuIF9kYnVzX2dldF91c2VyX2lkICh1c2VybmFtZSwgdWlkX3ApOworCit9CisKKy8qKgorICogUGFyc2UgYSBVTklYIGdyb3VwIGZyb20gdGhlIGJ1cyBjb25maWcgZmlsZS4gT24gV2luZG93cywgdGhpcyBzaG91bGQKKyAqIHNpbXBseSBhbHdheXMgZmFpbCAoanVzdCByZXR1cm4gI0ZBTFNFKS4KKyAqCisgKiBAcGFyYW0gZ3JvdXBuYW1lIHRoZSBncm91cG5hbWUgdGV4dAorICogQHBhcmFtIGdpZF9wIHBsYWNlIHRvIHJldHVybiB0aGUgZ2lkCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19wYXJzZV91bml4X2dyb3VwX2Zyb21fY29uZmlnIChjb25zdCBEQnVzU3RyaW5nICAqZ3JvdXBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAgKmdpZF9wKQoreworICByZXR1cm4gX2RidXNfZ2V0X2dyb3VwX2lkIChncm91cG5hbWUsIGdpZF9wKTsKK30KKworLyoqCisgKiBHZXRzIGFsbCBncm91cHMgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gVU5JWCB1c2VyIElELiBPbiBVTklYLAorICoganVzdCBjYWxscyBfZGJ1c19ncm91cHNfZnJvbV91aWQoKS4gT24gV2luZG93cywgc2hvdWxkIGFsd2F5cworICogZmFpbCBzaW5jZSB3ZSBkb24ndCBrbm93IGFueSBVTklYIGdyb3Vwcy4KKyAqCisgKiBAcGFyYW0gdWlkIHRoZSBVSUQKKyAqIEBwYXJhbSBncm91cF9pZHMgcmV0dXJuIGxvY2F0aW9uIGZvciBhcnJheSBvZiBncm91cCBJRHMKKyAqIEBwYXJhbSBuX2dyb3VwX2lkcyByZXR1cm4gbG9jYXRpb24gZm9yIGxlbmd0aCBvZiByZXR1cm5lZCBhcnJheQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIFVJRCBleGlzdGVkIGFuZCB3ZSBnb3Qgc29tZSBjcmVkZW50aWFscworICovCitkYnVzX2Jvb2xfdAorX2RidXNfdW5peF9ncm91cHNfZnJvbV91aWQgKGRidXNfdWlkX3QgICAgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAgICAqKmdyb3VwX2lkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAqbl9ncm91cF9pZHMpCit7CisgIHJldHVybiBfZGJ1c19ncm91cHNfZnJvbV91aWQgKHVpZCwgZ3JvdXBfaWRzLCBuX2dyb3VwX2lkcyk7Cit9CisKKy8qKgorICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgVU5JWCB1c2VyIElEIGlzIGF0IHRoZSBjb25zb2xlLgorICogU2hvdWxkIGFsd2F5cyBmYWlsIG9uIFdpbmRvd3MgKHNldCB0aGUgZXJyb3IgdG8KKyAqICNEQlVTX0VSUk9SX05PVF9TVVBQT1JURUQpLgorICoKKyAqIEBwYXJhbSB1aWQgVUlEIG9mIHBlcnNvbiB0byBjaGVjayAKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9ycworICogQHJldHVybnMgI1RSVUUgaWYgdGhlIFVJRCBpcyB0aGUgc2FtZSBhcyB0aGUgY29uc29sZSB1c2VyIGFuZCB0aGVyZSBhcmUgbm8gZXJyb3JzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c191bml4X3VzZXJfaXNfYXRfY29uc29sZSAoZGJ1c191aWRfdCAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIHJldHVybiBfZGJ1c19pc19jb25zb2xlX3VzZXIgKHVpZCwgZXJyb3IpOworCit9CisKKy8qKgorICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgVU5JWCB1c2VyIElEIG1hdGNoZXMgdGhlIFVJRCBvZgorICogdGhlIHByb2Nlc3MuIFNob3VsZCBhbHdheXMgcmV0dXJuICNGQUxTRSBvbiBXaW5kb3dzLgorICoKKyAqIEBwYXJhbSB1aWQgdGhlIFVOSVggdXNlciBJRAorICogQHJldHVybnMgI1RSVUUgaWYgdGhpcyB1aWQgb3ducyB0aGUgcHJvY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3VuaXhfdXNlcl9pc19wcm9jZXNzX293bmVyIChkYnVzX3VpZF90IHVpZCkKK3sKKyAgcmV0dXJuIHVpZCA9PSBfZGJ1c19nZXRldWlkICgpOworfQorCisvKioKKyAqIENoZWNrcyB0byBzZWUgaWYgdGhlIFdpbmRvd3MgdXNlciBTSUQgbWF0Y2hlcyB0aGUgb3duZXIgb2YKKyAqIHRoZSBwcm9jZXNzLiBTaG91bGQgYWx3YXlzIHJldHVybiAjRkFMU0Ugb24gVU5JWC4KKyAqCisgKiBAcGFyYW0gd2luZG93c19zaWQgdGhlIFdpbmRvd3MgdXNlciBTSUQKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoaXMgdXNlciBvd25zIHRoZSBwcm9jZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfd2luZG93c191c2VyX2lzX3Byb2Nlc3Nfb3duZXIgKGNvbnN0IGNoYXIgKndpbmRvd3Nfc2lkKQoreworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKiBAfSAqLyAvKiBFbmQgb2YgREJ1c0ludGVybmFsc1V0aWxzIGZ1bmN0aW9ucyAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNTdHJpbmcKKyAqCisgKiBAeworICovCisvKioKKyAqIEdldCB0aGUgZGlyZWN0b3J5IG5hbWUgZnJvbSBhIGNvbXBsZXRlIGZpbGVuYW1lCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lCisgKiBAcGFyYW0gZGlybmFtZSBzdHJpbmcgdG8gYXBwZW5kIGRpcmVjdG9yeSBuYW1lIHRvCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfZ2V0X2Rpcm5hbWUgIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmRpcm5hbWUpCit7CisgIGludCBzZXA7CisgIAorICBfZGJ1c19hc3NlcnQgKGZpbGVuYW1lICE9IGRpcm5hbWUpOworICBfZGJ1c19hc3NlcnQgKGZpbGVuYW1lICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGRpcm5hbWUgIT0gTlVMTCk7CisKKyAgLyogSWdub3JlIGFueSBzZXBhcmF0b3JzIG9uIHRoZSBlbmQgKi8KKyAgc2VwID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGZpbGVuYW1lKTsKKyAgaWYgKHNlcCA9PSAwKQorICAgIHJldHVybiBfZGJ1c19zdHJpbmdfYXBwZW5kIChkaXJuYW1lLCAiLiIpOyAvKiBlbXB0eSBzdHJpbmcgcGFzc2VkIGluICovCisgICAgCisgIHdoaWxlIChzZXAgPiAwICYmIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZmlsZW5hbWUsIHNlcCAtIDEpID09ICcvJykKKyAgICAtLXNlcDsKKworICBfZGJ1c19hc3NlcnQgKHNlcCA+PSAwKTsKKyAgCisgIGlmIChzZXAgPT0gMCkKKyAgICByZXR1cm4gX2RidXNfc3RyaW5nX2FwcGVuZCAoZGlybmFtZSwgIi8iKTsKKyAgCisgIC8qIE5vdyBmaW5kIHRoZSBwcmV2aW91cyBzZXBhcmF0b3IgKi8KKyAgX2RidXNfc3RyaW5nX2ZpbmRfYnl0ZV9iYWNrd2FyZCAoZmlsZW5hbWUsIHNlcCwgJy8nLCAmc2VwKTsKKyAgaWYgKHNlcCA8IDApCisgICAgcmV0dXJuIF9kYnVzX3N0cmluZ19hcHBlbmQgKGRpcm5hbWUsICIuIik7CisgIAorICAvKiBza2lwIG11bHRpcGxlIHNlcGFyYXRvcnMgKi8KKyAgd2hpbGUgKHNlcCA+IDAgJiYgX2RidXNfc3RyaW5nX2dldF9ieXRlIChmaWxlbmFtZSwgc2VwIC0gMSkgPT0gJy8nKQorICAgIC0tc2VwOworCisgIF9kYnVzX2Fzc2VydCAoc2VwID49IDApOworICAKKyAgaWYgKHNlcCA9PSAwICYmCisgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGZpbGVuYW1lLCAwKSA9PSAnLycpCisgICAgcmV0dXJuIF9kYnVzX3N0cmluZ19hcHBlbmQgKGRpcm5hbWUsICIvIik7CisgIGVsc2UKKyAgICByZXR1cm4gX2RidXNfc3RyaW5nX2NvcHlfbGVuIChmaWxlbmFtZSwgMCwgc2VwIC0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJuYW1lLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGlybmFtZSkpOworfQorLyoqIEB9ICovIC8qIERCdXNTdHJpbmcgc3R1ZmYgKi8KKworc3RhdGljIHZvaWQKK3N0cmluZ19zcXVhc2hfbm9ucHJpbnRhYmxlIChEQnVzU3RyaW5nICpzdHIpCit7CisgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKyAgaW50IGksIGxlbjsgCisgIAorICBidWYgPSBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKHN0cik7CisgIGxlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworICAKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgYyA9ICh1bnNpZ25lZCBjaGFyKSBidWZbaV07CisgICAgICBpZiAoYyA9PSAnXDAnKQorICAgICAgICBidWZbaV0gPSAnICc7CisgICAgICBlbHNlIGlmIChjIDwgMHgyMCB8fCBjID4gMTI3KQorICAgICAgICBidWZbaV0gPSAnPyc7CisgICAgfQorfQorCisvKioKKyAqIEdldCBhIHByaW50YWJsZSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgY29tbWFuZCB1c2VkIHRvIGV4ZWN1dGUKKyAqIHRoZSBwcm9jZXNzIHdpdGggcGlkLiAgVGhpcyBzdHJpbmcgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IKKyAqIGluZm9ybWF0aXZlIHB1cnBvc2VzIHN1Y2ggYXMgbG9nZ2luZzsgaXQgbWF5IG5vdCBiZSB0cnVzdGVkLgorICogCisgKiBUaGUgY29tbWFuZCBpcyBndWFyYW50ZWVkIHRvIGJlIHByaW50YWJsZSBBU0NJSSBhbmQgbm8gbG9uZ2VyCisgKiB0aGFuIG1heF9sZW4uCisgKiAKKyAqIEBwYXJhbSBwaWQgUHJvY2VzcyBpZAorICogQHBhcmFtIHN0ciBBcHBlbmQgY29tbWFuZCB0byB0aGlzIHN0cmluZworICogQHBhcmFtIG1heF9sZW4gTWF4aW11bSBsZW5ndGggb2YgcmV0dXJuZWQgY29tbWFuZAorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3JzCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZXJyb3IKKyAqLworZGJ1c19ib29sX3QgCitfZGJ1c19jb21tYW5kX2Zvcl9waWQgKHVuc2lnbmVkIGxvbmcgIHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBtYXhfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICplcnJvcikKK3sKKyAgLyogVGhpcyBpcyBhbGwgTGludXgtc3BlY2lmaWMgZm9yIG5vdyAqLworICBEQnVzU3RyaW5nIHBhdGg7CisgIERCdXNTdHJpbmcgY21kbGluZTsKKyAgaW50IGZkOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnBhdGgpKSAKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNtZGxpbmUpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGF0aCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoJnBhdGgsICIvcHJvYy8lbGQvY21kbGluZSIsIHBpZCkpCisgICAgZ290byBvb207CisgIAorICBmZCA9IG9wZW4gKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnBhdGgpLCBPX1JET05MWSk7CisgIGlmIChmZCA8IDApIAorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBvcGVuIFwiJXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnBhdGgpLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgZ290byBmYWlsOworICAgIH0KKyAgCisgIGlmICghX2RidXNfcmVhZCAoZmQsICZjbWRsaW5lLCBtYXhfbGVuKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVhZCBmcm9tIFwiJXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnBhdGgpLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOyAgICAgIAorICAgICAgZ290byBmYWlsOworICAgIH0KKyAgCisgIGlmICghX2RidXNfY2xvc2UgKGZkLCBlcnJvcikpCisgICAgZ290byBmYWlsOworICAKKyAgc3RyaW5nX3NxdWFzaF9ub25wcmludGFibGUgKCZjbWRsaW5lKTsgIAorCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZjbWRsaW5lLCAwLCBzdHIsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpKSkKKyAgICBnb3RvIG9vbTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNtZGxpbmUpOyAgCisgIF9kYnVzX3N0cmluZ19mcmVlICgmcGF0aCk7CisgIHJldHVybiBUUlVFOworb29tOgorICBfREJVU19TRVRfT09NIChlcnJvcik7CitmYWlsOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNtZGxpbmUpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhdGgpOworICByZXR1cm4gRkFMU0U7Cit9CmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1zeXNkZXBzLXV0aWwtd2luLmMgYi9kYnVzL2RidXMvZGJ1cy1zeXNkZXBzLXV0aWwtd2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTExZGI5ZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC13aW4uYwpAQCAtMCwwICsxLDE1MzIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zeXNkZXBzLXV0aWwuYyBXb3VsZCBiZSBpbiBkYnVzLXN5c2RlcHMuYywgYnV0IG5vdCB1c2VkIGluIGxpYmRidXMKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1ICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjZGVmaW5lIFNUUlNBRkVfTk9fREVQUkVDQVRFCisKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy13aW4uaCIKKyNpbmNsdWRlICJkYnVzLXNvY2tldHMtd2luLmgiCisjaW5jbHVkZSAiZGJ1cy1tZW1vcnkuaCIKKyNpbmNsdWRlICJkYnVzLXBpcGUuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorI2luY2x1ZGUgPHdpbnNvY2syLmg+ICAgLy8gV1NBIGVycm9yIGNvZGVzCisKKyNpZm5kZWYgREJVU19XSU5DRQorI2luY2x1ZGUgPGlvLmg+CisjaW5jbHVkZSA8bG0uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisKKworLyoqCisgKiBEb2VzIHRoZSBjaGRpciwgZm9yaywgc2V0c2lkLCBldGMuIHRvIGJlY29tZSBhIGRhZW1vbiBwcm9jZXNzLgorICoKKyAqIEBwYXJhbSBwaWRmaWxlICNOVUxMLCBvciBwaWRmaWxlIHRvIGNyZWF0ZQorICogQHBhcmFtIHByaW50X3BpZF9mZCBmaWxlIGRlc2NyaXB0b3IgdG8gcHJpbnQgZGFlbW9uJ3MgcGlkIHRvLCBvciAtMSBmb3Igbm9uZQorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3JzCisgKiBAcGFyYW0ga2VlcF91bWFzayAjVFJVRSB0byBrZWVwIHRoZSBvcmlnaW5hbCB1bWFzaworICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2JlY29tZV9kYWVtb24gKGNvbnN0IERCdXNTdHJpbmcgKnBpZGZpbGUsCisgICAgICAgICAgICAgICAgICAgICBEQnVzUGlwZSAgICAgICAgICpwcmludF9waWRfcGlwZSwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAga2VlcF91bWFzaykKK3sKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIGZpbGUgY29udGFpbmluZyB0aGUgcHJvY2VzcyBJRC4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lIHRvIHdyaXRlIHRvCisgKiBAcGFyYW0gcGlkIG91ciBwcm9jZXNzIElECisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvcnMKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfd3JpdGVfcGlkX2ZpbGUgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgIHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqY2ZpbGVuYW1lOworICBIQU5ETEUgaG5kOworICBjaGFyIHBpZHN0clsyMF07CisgIGludCB0b3RhbDsKKyAgaW50IGJ5dGVzX3RvX3dyaXRlOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGNmaWxlbmFtZSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworCisgIGhuZCA9IENyZWF0ZUZpbGVBIChjZmlsZW5hbWUsIEdFTkVSSUNfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICBGSUxFX1NIQVJFX1JFQUQgfCBGSUxFX1NIQVJFX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgTlVMTCwgQ1JFQVRFX05FVywgRklMRV9BVFRSSUJVVEVfTk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgSU5WQUxJRF9IQU5ETEVfVkFMVUUpOworICBpZiAoaG5kID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgIHsKKyAgICAgIGNoYXIgKmVtc2cgPSBfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChHZXRMYXN0RXJyb3IgKCkpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c193aW5fZXJyb3JfZnJvbV9sYXN0X2Vycm9yICgpLAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY3JlYXRlIFBJRCBmaWxlICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgY2ZpbGVuYW1lLCBlbXNnKTsKKyAgICAgIF9kYnVzX3dpbl9mcmVlX2Vycm9yX3N0cmluZyAoZW1zZyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChzbnByaW50ZiAocGlkc3RyLCBzaXplb2YgKHBpZHN0ciksICIlbHVcbiIsIHBpZCkgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9zeXN0ZW1fZXJybm8gKCksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBmb3JtYXQgUElEIGZvciBcIiVzXCI6ICVzIiwgY2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKCkpOworICAgICAgQ2xvc2VIYW5kbGUgKGhuZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHRvdGFsID0gMDsKKyAgYnl0ZXNfdG9fd3JpdGUgPSBzdHJsZW4gKHBpZHN0cik7OworCisgIHdoaWxlICh0b3RhbCA8IGJ5dGVzX3RvX3dyaXRlKQorICAgIHsKKyAgICAgIERXT1JEIGJ5dGVzX3dyaXR0ZW47CisgICAgICBCT09MIHJlczsKKworICAgICAgcmVzID0gV3JpdGVGaWxlIChobmQsIHBpZHN0ciArIHRvdGFsLCBieXRlc190b193cml0ZSAtIHRvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNfd3JpdHRlbiwgTlVMTCk7CisKKyAgICAgIGlmIChyZXMgPT0gMCB8fCBieXRlc193cml0dGVuIDw9IDApCisgICAgICAgIHsKKyAgICAgICAgICBjaGFyICplbXNnID0gX2RidXNfd2luX2Vycm9yX3N0cmluZyAoR2V0TGFzdEVycm9yICgpKTsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX3dpbl9lcnJvcl9mcm9tX2xhc3RfZXJyb3IgKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHdyaXRlIHRvICVzOiAlcyIsIGNmaWxlbmFtZSwgZW1zZyk7CisgICAgICAgICAgX2RidXNfd2luX2ZyZWVfZXJyb3Jfc3RyaW5nIChlbXNnKTsKKyAgICAgICAgICBDbG9zZUhhbmRsZSAoaG5kKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgdG90YWwgKz0gYnl0ZXNfd3JpdHRlbjsKKyAgICB9CisKKyAgaWYgKENsb3NlSGFuZGxlIChobmQpID09IDApCisgICAgeworICAgICAgY2hhciAqZW1zZyA9IF9kYnVzX3dpbl9lcnJvcl9zdHJpbmcgKEdldExhc3RFcnJvciAoKSk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX3dpbl9lcnJvcl9mcm9tX2xhc3RfZXJyb3IgKCksCisgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY2xvc2UgZmlsZSAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGNmaWxlbmFtZSwgZW1zZyk7CisgICAgICBfZGJ1c193aW5fZnJlZV9lcnJvcl9zdHJpbmcgKGVtc2cpOworCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFdyaXRlcyB0aGUgZ2l2ZW4gcGlkX3RvX3dyaXRlIHRvIGEgcGlkZmlsZSAoaWYgbm9uLU5VTEwpIGFuZC9vciB0byBhCisgKiBwaXBlIChpZiBub24tTlVMTCkuIERvZXMgbm90aGluZyBpZiBwaWRmaWxlIGFuZCBwcmludF9waWRfcGlwZSBhcmUgYm90aAorICogTlVMTC4KKyAqCisgKiBAcGFyYW0gcGlkZmlsZSB0aGUgZmlsZSB0byB3cml0ZSB0byBvciAjTlVMTAorICogQHBhcmFtIHByaW50X3BpZF9waXBlIHRoZSBwaXBlIHRvIHdyaXRlIHRvIG9yICNOVUxMCisgKiBAcGFyYW0gcGlkX3RvX3dyaXRlIHRoZSBwaWQgdG8gd3JpdGUgb3V0CisgKiBAcGFyYW0gZXJyb3IgZXJyb3Igb24gZmFpbHVyZQorICogQHJldHVybnMgRkFMU0UgaWYgZXJyb3IgaXMgc2V0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c193cml0ZV9waWRfdG9fZmlsZV9hbmRfcGlwZSAoY29uc3QgREJ1c1N0cmluZyAqcGlkZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUGlwZSAgICAgICAgICpwcmludF9waWRfcGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3BpZF90ICAgICAgICBwaWRfdG9fd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGlmIChwaWRmaWxlKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ3cml0aW5nIHBpZCBmaWxlICVzXG4iLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHBpZGZpbGUpKTsKKyAgICAgIGlmICghX2RidXNfd3JpdGVfcGlkX2ZpbGUgKHBpZGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdG9fd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgicGlkIGZpbGUgd3JpdGUgZmFpbGVkXG4iKTsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiTm8gcGlkIGZpbGUgcmVxdWVzdGVkXG4iKTsKKyAgICB9CisKKyAgaWYgKHByaW50X3BpZF9waXBlICE9IE5VTEwgJiYgX2RidXNfcGlwZV9pc192YWxpZCAocHJpbnRfcGlkX3BpcGUpKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgcGlkOworICAgICAgaW50IGJ5dGVzOworCisgICAgICBfZGJ1c192ZXJib3NlICgid3JpdGluZyBvdXIgcGlkIHRvIHBpcGUgJWRcbiIsIHByaW50X3BpZF9waXBlLT5mZCk7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZwaWQpKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfaW50ICgmcGlkLCBwaWRfdG9fd3JpdGUpIHx8CisgICAgICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZwaWQsICJcbiIpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwaWQpOworICAgICAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgYnl0ZXMgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnBpZCk7CisgICAgICBpZiAoX2RidXNfcGlwZV93cml0ZSAocHJpbnRfcGlkX3BpcGUsICZwaWQsIDAsIGJ5dGVzLCBlcnJvcikgIT0gYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBfZGJ1c19waXBlX3dyaXRlIHNldHMgZXJyb3Igb25seSBvbiBmYWlsdXJlLCBub3Qgc2hvcnQgd3JpdGUgKi8KKyAgICAgICAgICBpZiAoZXJyb3IgIT0gTlVMTCAmJiAhZGJ1c19lcnJvcl9pc19zZXQoZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW50aW5nIG1lc3NhZ2UgYnVzIFBJRDogZGlkIG5vdCB3cml0ZSBlbm91Z2ggYnl0ZXNcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGlkKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwaWQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBwaWQgcGlwZSB0byB3cml0ZSB0b1xuIik7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFZlcmlmeSB0aGF0IGFmdGVyIHRoZSBmb3JrIHdlIGNhbiBzdWNjZXNzZnVsbHkgY2hhbmdlIHRvIHRoaXMgdXNlci4KKyAqCisgKiBAcGFyYW0gdXNlciB0aGUgdXNlcm5hbWUgZ2l2ZW4gaW4gdGhlIGRhZW1vbiBjb25maWd1cmF0aW9uCisgKiBAcmV0dXJucyAjVFJVRSBpZiB1c2VybmFtZSBpcyB2YWxpZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdmVyaWZ5X2RhZW1vbl91c2VyIChjb25zdCBjaGFyICp1c2VyKQoreworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDaGFuZ2VzIHRoZSB1c2VyIGFuZCBncm91cCB0aGUgYnVzIGlzIHJ1bm5pbmcgYXMuCisgKgorICogQHBhcmFtIHVzZXIgdGhlIHVzZXIgdG8gYmVjb21lCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvcnMKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBmYWlsdXJlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jaGFuZ2VfdG9fZGFlbW9uX3VzZXIgIChjb25zdCBjaGFyICAgICp1c2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAqZXJyb3IpCit7CisgIHJldHVybiBUUlVFOworfQorCit2b2lkCitfZGJ1c19yZXF1ZXN0X2ZpbGVfZGVzY3JpcHRvcl9saW1pdCAodW5zaWduZWQgaW50IGxpbWl0KQoreworfQorCit2b2lkCitfZGJ1c19pbml0X3N5c3RlbV9sb2cgKHZvaWQpCit7CisgIC8qIE91dHB1dERlYnVnU3RyaW5nQSBkb2Vzbid0IG5lZWQgYW55IHNwZWNpYWwgaW5pdGlhbGl6YXRpb24sIGRvIG5vdGhpbmcgKi8KK30KKworLyoqCisgKiBMb2cgYSBtZXNzYWdlIHRvIHRoZSBzeXN0ZW0gbG9nIGZpbGUgKGUuZy4gc3lzbG9nIG9uIFVuaXgpLgorICoKKyAqIEBwYXJhbSBzZXZlcml0eSBhIHNldmVyaXR5IHZhbHVlCisgKiBAcGFyYW0gbXNnIGEgcHJpbnRmLXN0eWxlIGZvcm1hdCBzdHJpbmcKKyAqIEBwYXJhbSBhcmdzIGFyZ3VtZW50cyBmb3IgdGhlIGZvcm1hdCBzdHJpbmcKKyAqCisgKi8KK3ZvaWQKK19kYnVzX3N5c3RlbV9sb2cgKERCdXNTeXN0ZW1Mb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3QgY2hhciAqbXNnLCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKworICB2YV9zdGFydCAoYXJncywgbXNnKTsKKworICBfZGJ1c19zeXN0ZW1fbG9ndiAoc2V2ZXJpdHksIG1zZywgYXJncyk7CisKKyAgdmFfZW5kIChhcmdzKTsKK30KKworLyoqCisgKiBMb2cgYSBtZXNzYWdlIHRvIHRoZSBzeXN0ZW0gbG9nIGZpbGUgKGUuZy4gc3lzbG9nIG9uIFVuaXgpLgorICoKKyAqIEBwYXJhbSBzZXZlcml0eSBhIHNldmVyaXR5IHZhbHVlCisgKiBAcGFyYW0gbXNnIGEgcHJpbnRmLXN0eWxlIGZvcm1hdCBzdHJpbmcKKyAqIEBwYXJhbSBhcmdzIGFyZ3VtZW50cyBmb3IgdGhlIGZvcm1hdCBzdHJpbmcKKyAqCisgKiBJZiB0aGUgRkFUQUwgc2V2ZXJpdHkgaXMgZ2l2ZW4sIHRoaXMgZnVuY3Rpb24gd2lsbCB0ZXJtaW5hdGUgdGhlIHByb2dyYW0KKyAqIHdpdGggYW4gZXJyb3IgY29kZS4KKyAqLwordm9pZAorX2RidXNfc3lzdGVtX2xvZ3YgKERCdXNTeXN0ZW1Mb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3QgY2hhciAqbXNnLCB2YV9saXN0IGFyZ3MpCit7CisgIGNoYXIgKnMgPSAiIjsKKyAgY2hhciBidWZbMTAyNF07CisgIAorICBzd2l0Y2goc2V2ZXJpdHkpIAorICAgeworICAgICBjYXNlIERCVVNfU1lTVEVNX0xPR19JTkZPOiBzID0gImluZm8iOyBicmVhazsKKyAgICAgY2FzZSBEQlVTX1NZU1RFTV9MT0dfU0VDVVJJVFk6IHMgPSAic2VjdXJpdHkiOyBicmVhazsKKyAgICAgY2FzZSBEQlVTX1NZU1RFTV9MT0dfRkFUQUw6IHMgPSAiZmF0YWwiOyBicmVhazsKKyAgIH0KKyAgIAorICBzcHJpbnRmKGJ1ZiwiJXMlcyIscyxtc2cpOworICB2c3ByaW50ZihidWYsYnVmLGFyZ3MpOworICBPdXRwdXREZWJ1Z1N0cmluZ0EoYnVmKTsKKyAgCisgIGlmIChzZXZlcml0eSA9PSBEQlVTX1NZU1RFTV9MT0dfRkFUQUwpCisgICAgZXhpdCAoMSk7Cit9CisKKy8qKiBJbnN0YWxscyBhIHNpZ25hbCBoYW5kbGVyCisgKgorICogQHBhcmFtIHNpZyB0aGUgc2lnbmFsIHRvIGhhbmRsZQorICogQHBhcmFtIGhhbmRsZXIgdGhlIGhhbmRsZXIKKyAqLwordm9pZAorX2RidXNfc2V0X3NpZ25hbF9oYW5kbGVyIChpbnQgICAgICAgICAgICAgICBzaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTaWduYWxIYW5kbGVyIGhhbmRsZXIpCit7CisgIF9kYnVzX3ZlcmJvc2UgKCJfZGJ1c19zZXRfc2lnbmFsX2hhbmRsZXIoKSBoYXMgdG8gYmUgaW1wbGVtZW50ZWRcbiIpOworfQorCisvKioKKyAqIHN0YXQoKSB3cmFwcGVyLgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUgdG8gc3RhdAorICogQHBhcmFtIHN0YXRidWYgdGhlIHN0YXQgaW5mbyB0byBmaWxsIGluCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvcgorICogQHJldHVybnMgI0ZBTFNFIGlmIGVycm9yIHdhcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0YXQoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgIERCdXNTdGF0ICAgICAgICAgKnN0YXRidWYsCisgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpmaWxlbmFtZV9jOworICBXSU4zMl9GSUxFX0FUVFJJQlVURV9EQVRBIHdmYWQ7CisgIGNoYXIgKmxhc3Rkb3Q7CisgIERXT1JEIHJjOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKworICBpZiAoIUdldEZpbGVBdHRyaWJ1dGVzRXhBIChmaWxlbmFtZV9jLCBHZXRGaWxlRXhJbmZvU3RhbmRhcmQsICZ3ZmFkKSkKKyAgICB7CisgICAgICBfZGJ1c193aW5fc2V0X2Vycm9yX2Zyb21fd2luX2Vycm9yIChlcnJvciwgR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKHdmYWQuZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkKKyAgICBzdGF0YnVmLT5tb2RlID0gX1NfSUZESVI7CisgIGVsc2UKKyAgICBzdGF0YnVmLT5tb2RlID0gX1NfSUZSRUc7CisKKyAgc3RhdGJ1Zi0+bW9kZSB8PSBfU19JUkVBRDsKKyAgaWYgKHdmYWQuZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX1JFQURPTkxZKQorICAgIHN0YXRidWYtPm1vZGUgfD0gX1NfSVdSSVRFOworCisgIGxhc3Rkb3QgPSBzdHJyY2hyIChmaWxlbmFtZV9jLCAnLicpOworICBpZiAobGFzdGRvdCAmJiBzdHJpY21wIChsYXN0ZG90LCAiLmV4ZSIpID09IDApCisgICAgc3RhdGJ1Zi0+bW9kZSB8PSBfU19JRVhFQzsKKworICBzdGF0YnVmLT5tb2RlIHw9IChzdGF0YnVmLT5tb2RlICYgMDcwMCkgPj4gMzsKKyAgc3RhdGJ1Zi0+bW9kZSB8PSAoc3RhdGJ1Zi0+bW9kZSAmIDA3MDApID4+IDY7CisKKyAgc3RhdGJ1Zi0+bmxpbmsgPSAxOworCisjaWZkZWYgRU5BQkxFX1VJRF9UT19TSUQKKyAgeworICAgIFBTSUQgb3duZXJfc2lkLCBncm91cF9zaWQ7CisgICAgUFNFQ1VSSVRZX0RFU0NSSVBUT1Igc2Q7CisKKyAgICBzZCA9IE5VTEw7CisgICAgcmMgPSBHZXROYW1lZFNlY3VyaXR5SW5mbyAoKGNoYXIgKikgZmlsZW5hbWVfYywgU0VfRklMRV9PQkpFQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1dORVJfU0VDVVJJVFlfSU5GT1JNQVRJT04gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdST1VQX1NFQ1VSSVRZX0lORk9STUFUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvd25lcl9zaWQsICZncm91cF9zaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2QpOworICAgIGlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgeworICAgICAgICBfZGJ1c193aW5fc2V0X2Vycm9yX2Zyb21fd2luX2Vycm9yIChlcnJvciwgcmMpOworICAgICAgICBpZiAoc2QgIT0gTlVMTCkKKyAgICAgICAgICBMb2NhbEZyZWUgKHNkKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIAorICAgIC8qIEZJWE1FICovCisgICAgc3RhdGJ1Zi0+dWlkID0gX2RidXNfd2luX3NpZF90b191aWRfdCAob3duZXJfc2lkKTsKKyAgICBzdGF0YnVmLT5naWQgPSBfZGJ1c193aW5fc2lkX3RvX3VpZF90IChncm91cF9zaWQpOworCisgICAgTG9jYWxGcmVlIChzZCk7CisgIH0KKyNlbHNlCisgIHN0YXRidWYtPnVpZCA9IERCVVNfVUlEX1VOU0VUOworICBzdGF0YnVmLT5naWQgPSBEQlVTX0dJRF9VTlNFVDsKKyNlbmRpZgorCisgIHN0YXRidWYtPnNpemUgPSAoKGRidXNfaW50NjRfdCkgd2ZhZC5uRmlsZVNpemVIaWdoIDw8IDMyKSArIHdmYWQubkZpbGVTaXplTG93OworCisgIHN0YXRidWYtPmF0aW1lID0KKyAgICAoKChkYnVzX2ludDY0X3QpIHdmYWQuZnRMYXN0QWNjZXNzVGltZS5kd0hpZ2hEYXRlVGltZSA8PCAzMikgKworICAgICB3ZmFkLmZ0TGFzdEFjY2Vzc1RpbWUuZHdMb3dEYXRlVGltZSkgLyAxMDAwMDAwMCAtIERCVVNfSU5UNjRfQ09OU1RBTlQgKDExNjQ0NDczNjAwMDAwMDAwMCk7CisKKyAgc3RhdGJ1Zi0+bXRpbWUgPQorICAgICgoKGRidXNfaW50NjRfdCkgd2ZhZC5mdExhc3RXcml0ZVRpbWUuZHdIaWdoRGF0ZVRpbWUgPDwgMzIpICsKKyAgICAgd2ZhZC5mdExhc3RXcml0ZVRpbWUuZHdMb3dEYXRlVGltZSkgLyAxMDAwMDAwMCAtIERCVVNfSU5UNjRfQ09OU1RBTlQgKDExNjQ0NDczNjAwMDAwMDAwMCk7CisKKyAgc3RhdGJ1Zi0+Y3RpbWUgPQorICAgICgoKGRidXNfaW50NjRfdCkgd2ZhZC5mdENyZWF0aW9uVGltZS5kd0hpZ2hEYXRlVGltZSA8PCAzMikgKworICAgICB3ZmFkLmZ0Q3JlYXRpb25UaW1lLmR3TG93RGF0ZVRpbWUpIC8gMTAwMDAwMDAgLSBEQlVTX0lOVDY0X0NPTlNUQU5UICgxMTY0NDQ3MzYwMDAwMDAwMDApOworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdAorQ29weXJpZ2h0IChDKSAyMDAwIFdlcm5lciBBbG1lc2JlcmdlcgorCitsaWJjL3N5cy9saW51eC9zeXMvZGlyZW50LmggLSBEaXJlY3RvcnkgZW50cnkgYXMgcmV0dXJuZWQgYnkgcmVhZGRpcgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCittb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCit2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCitMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKK0Jvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorKi8KKyNkZWZpbmUgSEFWRV9OT19EX05BTUxFTgkvKiBubyBzdHJ1Y3QgZGlyZW50LT5kX25hbWxlbiAqLworI2RlZmluZSBIQVZFX0REX0xPQ0sgIAkJLyogaGF2ZSBsb2NraW5nIG1lY2hhbmlzbSAqLworCisjZGVmaW5lIE1BWE5BTUxFTiAyNTUJCS8qIHNpemVvZihzdHJ1Y3QgZGlyZW50LmRfbmFtZSktMSAqLworCisjZGVmaW5lIF9fZGlyZmQoZGlyKSAoZGlyKS0+ZGRfZmQKKworLyogc3RydWN0IGRpcmVudCAtIHNhbWUgYXMgVW5peCAqLworc3RydWN0IGRpcmVudAorICB7CisgICAgbG9uZyBkX2lubzsgICAgICAgICAgICAgICAgICAgIC8qIGlub2RlIChhbHdheXMgMSBpbiBXSU4zMikgKi8KKyAgICBvZmZfdCBkX29mZjsgICAgICAgICAgICAgICAgLyogb2Zmc2V0IHRvIHRoaXMgZGlyZW50ICovCisgICAgdW5zaWduZWQgc2hvcnQgZF9yZWNsZW47ICAgIC8qIGxlbmd0aCBvZiBkX25hbWUgKi8KKyAgICBjaGFyIGRfbmFtZVtfTUFYX0ZOQU1FKzFdOyAgICAvKiBmaWxlbmFtZSAobnVsbCB0ZXJtaW5hdGVkKSAqLworICB9OworCisvKiB0eXBlZGVmIERJUiAtIG5vdCB0aGUgc2FtZSBhcyBVbml4ICovCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgSEFORExFIGhhbmRsZTsgICAgICAgICAgICAgIC8qIEZpbmRGaXJzdC9GaW5kTmV4dCBoYW5kbGUgKi8KKyAgICBzaG9ydCBvZmZzZXQ7ICAgICAgICAgICAgICAgLyogb2Zmc2V0IGludG8gZGlyZWN0b3J5ICovCisgICAgc2hvcnQgZmluaXNoZWQ7ICAgICAgICAgICAgIC8qIDEgaWYgdGhlcmUgYXJlIG5vdCBtb3JlIGZpbGVzICovCisgICAgV0lOMzJfRklORF9EQVRBQSBmaWxlaW5mbzsgIC8qIGZyb20gRmluZEZpcnN0L0ZpbmROZXh0ICovCisgICAgY2hhciAqZGlyOyAgICAgICAgICAgICAgICAgIC8qIHRoZSBkaXIgd2UgYXJlIHJlYWRpbmcgKi8KKyAgICBzdHJ1Y3QgZGlyZW50IGRlbnQ7ICAgICAgICAgLyogdGhlIGRpcmVudCB0byByZXR1cm4gKi8KKyAgfQorRElSOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBJbXBsZW1lbnQgZGlyZW50LXN0eWxlIG9wZW5kaXIvcmVhZGRpci9jbG9zZWRpciBvbiBXaW5kb3cgOTUvTlQKKyoKKyogRnVuY3Rpb25zIGRlZmluZWQgYXJlIG9wZW5kaXIoKSwgcmVhZGRpcigpIGFuZCBjbG9zZWRpcigpIHdpdGggdGhlCisqIHNhbWUgcHJvdG90eXBlcyBhcyB0aGUgbm9ybWFsIGRpcmVudC5oIGltcGxlbWVudGF0aW9uLgorKgorKiBEb2VzIG5vdCBpbXBsZW1lbnQgdGVsbGRpcigpLCBzZWVrZGlyKCksIHJld2luZGRpcigpIG9yIHNjYW5kaXIoKS4KKyogVGhlIGRpcmVudCBzdHJ1Y3QgaXMgY29tcGF0aWJsZSB3aXRoIFVuaXgsIGV4Y2VwdCB0aGF0IGRfaW5vIGlzCisqIGFsd2F5cyAxIGFuZCBkX29mZiBpcyBtYWRlIHVwIGFzIHdlIGdvIGFsb25nLgorKgorKiBFcnJvciBjb2RlcyBhcmUgbm90IGF2YWlsYWJsZSB3aXRoIGVycm5vIGJ1dCBHZXRMYXN0RXJyb3IuCisqCisqIFRoZSBESVIgdHlwZWRlZiBpcyBub3QgY29tcGF0aWJsZSB3aXRoIFVuaXguCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgRElSICogX2RidXNfb3BlbmRpcihjb25zdCBjaGFyICpkaXIpCit7CisgIERJUiAqZHA7CisgIGNoYXIgKmZpbGVzcGVjOworICBIQU5ETEUgaGFuZGxlOworICBpbnQgaW5kZXg7CisKKyAgZmlsZXNwZWMgPSBtYWxsb2Moc3RybGVuKGRpcikgKyAyICsgMSk7CisgIHN0cmNweShmaWxlc3BlYywgZGlyKTsKKyAgaW5kZXggPSBzdHJsZW4oZmlsZXNwZWMpIC0gMTsKKyAgaWYgKGluZGV4ID49IDAgJiYgKGZpbGVzcGVjW2luZGV4XSA9PSAnLycgfHwgZmlsZXNwZWNbaW5kZXhdID09ICdcXCcpKQorICAgIGZpbGVzcGVjW2luZGV4XSA9ICdcMCc7CisgIHN0cmNhdChmaWxlc3BlYywgIlxcKiIpOworCisgIGRwID0gKERJUiAqKW1hbGxvYyhzaXplb2YoRElSKSk7CisgIGRwLT5vZmZzZXQgPSAwOworICBkcC0+ZmluaXNoZWQgPSAwOworICBkcC0+ZGlyID0gc3RyZHVwKGRpcik7CisKKyAgaGFuZGxlID0gRmluZEZpcnN0RmlsZUEoZmlsZXNwZWMsICYoZHAtPmZpbGVpbmZvKSk7CisgIGlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgeworICAgICAgaWYgKEdldExhc3RFcnJvcigpID09IEVSUk9SX05PX01PUkVfRklMRVMpCisgICAgICAgIGRwLT5maW5pc2hlZCA9IDE7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBkcC0+aGFuZGxlID0gaGFuZGxlOworICBmcmVlKGZpbGVzcGVjKTsKKworICByZXR1cm4gZHA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGlyZW50ICogX2RidXNfcmVhZGRpcihESVIgKmRwKQoreworICBpbnQgc2F2ZWRfZXJyID0gR2V0TGFzdEVycm9yKCk7CisKKyAgaWYgKCFkcCB8fCBkcC0+ZmluaXNoZWQpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKGRwLT5vZmZzZXQgIT0gMCkKKyAgICB7CisgICAgICBpZiAoRmluZE5leHRGaWxlQShkcC0+aGFuZGxlLCAmKGRwLT5maWxlaW5mbykpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfTk9fTU9SRV9GSUxFUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgU2V0TGFzdEVycm9yKHNhdmVkX2Vycik7CisgICAgICAgICAgICAgIGRwLT5maW5pc2hlZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgIGRwLT5vZmZzZXQrKzsKKyAgCisgIHN0cm5jcHkoZHAtPmRlbnQuZF9uYW1lLCBkcC0+ZmlsZWluZm8uY0ZpbGVOYW1lLCBfTUFYX0ZOQU1FKTsKKyAgZHAtPmRlbnQuZF9pbm8gPSAxOworICBkcC0+ZGVudC5kX3JlY2xlbiA9IHN0cmxlbihkcC0+ZGVudC5kX25hbWUpOworICBkcC0+ZGVudC5kX29mZiA9IGRwLT5vZmZzZXQ7CisgIAorICByZXR1cm4gJihkcC0+ZGVudCk7Cit9CisKKworc3RhdGljIGludCBfZGJ1c19jbG9zZWRpcihESVIgKmRwKQoreworICBpZiAoIWRwKQorICAgIHJldHVybiAwOworICBGaW5kQ2xvc2UoZHAtPmhhbmRsZSk7CisgIGlmIChkcC0+ZGlyKQorICAgIGZyZWUoZHAtPmRpcik7CisgIGlmIChkcCkKKyAgICBmcmVlKGRwKTsKKworICByZXR1cm4gMDsKK30KKworCisvKioKKyAqIEludGVybmFscyBvZiBkaXJlY3RvcnkgaXRlcmF0b3IKKyAqLworc3RydWN0IERCdXNEaXJJdGVyCisgIHsKKyAgICBESVIgKmQ7IC8qKjwgVGhlIERJUiogZnJvbSBvcGVuZGlyKCkgKi8KKworICB9OworCisvKioKKyAqIE9wZW4gYSBkaXJlY3RvcnkgdG8gaXRlcmF0ZSBvdmVyLgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZGlyZWN0b3J5IG5hbWUKKyAqIEBwYXJhbSBlcnJvciBleGNlcHRpb24gcmV0dXJuIG9iamVjdCBvciAjTlVMTAorICogQHJldHVybnMgbmV3IGl0ZXJhdG9yLCBvciAjTlVMTCBvbiBlcnJvcgorICovCitEQnVzRGlySXRlcioKK19kYnVzX2RpcmVjdG9yeV9vcGVuIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgRElSICpkOworICBEQnVzRGlySXRlciAqaXRlcjsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWVfYzsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBmaWxlbmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSk7CisKKyAgZCA9IF9kYnVzX29wZW5kaXIgKGZpbGVuYW1lX2MpOworICBpZiAoZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGNoYXIgKmVtc2cgPSBfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChHZXRMYXN0RXJyb3IgKCkpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c193aW5fZXJyb3JfZnJvbV9sYXN0X2Vycm9yICgpLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVhZCBkaXJlY3RvcnkgXCIlc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfYywgZW1zZyk7CisgICAgICBfZGJ1c193aW5fZnJlZV9lcnJvcl9zdHJpbmcgKGVtc2cpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICBpdGVyID0gZGJ1c19uZXcwIChEQnVzRGlySXRlciwgMSk7CisgIGlmIChpdGVyID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfY2xvc2VkaXIgKGQpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZGlyZWN0b3J5IGl0ZXJhdG9yIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaXRlci0+ZCA9IGQ7CisKKyAgcmV0dXJuIGl0ZXI7Cit9CisKKy8qKgorICogR2V0IG5leHQgZmlsZSBpbiB0aGUgZGlyZWN0b3J5LiBXaWxsIG5vdCByZXR1cm4gIi4iIG9yICIuLiIgIG9uCisgKiBVTklYLiBJZiBhbiBlcnJvciBvY2N1cnMsIHRoZSBjb250ZW50cyBvZiAiZmlsZW5hbWUiIGFyZQorICogdW5kZWZpbmVkLiBUaGUgZXJyb3IgaXMgbmV2ZXIgc2V0IGlmIHRoZSBmdW5jdGlvbiBzdWNjZWVkcy4KKyAqCisgKiBAdG9kbyBmb3IgdGhyZWFkIHNhZmV0eSwgSSB0aGluayB3ZSBoYXZlIHRvIHVzZQorICogcmVhZGRpcl9yKCkuIChHTGliIGhhcyB0aGUgc2FtZSBpc3N1ZSwgc2hvdWxkIGZpbGUgYSBidWcuKQorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBpdGVyYXRvcgorICogQHBhcmFtIGZpbGVuYW1lIHN0cmluZyB0byBiZSBzZXQgdG8gdGhlIG5leHQgZmlsZSBpbiB0aGUgZGlyCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvcgorICogQHJldHVybnMgI1RSVUUgaWYgZmlsZW5hbWUgd2FzIGZpbGxlZCBpbiB3aXRoIGEgbmV3IGZpbGVuYW1lCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19kaXJlY3RvcnlfZ2V0X25leHRfZmlsZSAoREJ1c0Rpckl0ZXIgICAgICAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgc3RydWN0IGRpcmVudCAqZW50OworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCithZ2FpbjoKKyAgU2V0TGFzdEVycm9yICgwKTsKKyAgZW50ID0gX2RidXNfcmVhZGRpciAoaXRlci0+ZCk7CisgIGlmIChlbnQgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoR2V0TGFzdEVycm9yKCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGNoYXIgKmVtc2cgPSBfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChHZXRMYXN0RXJyb3IgKCkpOworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfd2luX2Vycm9yX2Zyb21fbGFzdF9lcnJvciAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgbmV4dCBpbiBkaXJlY3Rvcnk6ICVzIiwgZW1zZyk7CisgICAgICAgICAgX2RidXNfd2luX2ZyZWVfZXJyb3Jfc3RyaW5nIChlbXNnKTsKKyAgICAgICAgfQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZSBpZiAoZW50LT5kX25hbWVbMF0gPT0gJy4nICYmCisgICAgICAgICAgIChlbnQtPmRfbmFtZVsxXSA9PSAnXDAnIHx8CisgICAgICAgICAgICAoZW50LT5kX25hbWVbMV0gPT0gJy4nICYmIGVudC0+ZF9uYW1lWzJdID09ICdcMCcpKSkKKyAgICBnb3RvIGFnYWluOworICBlbHNlCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKGZpbGVuYW1lLCAwKTsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoZmlsZW5hbWUsIGVudC0+ZF9uYW1lKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBtZW1vcnkgdG8gcmVhZCBkaXJlY3RvcnkgZW50cnkiKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorfQorCisvKioKKyAqIENsb3NlcyBhIGRpcmVjdG9yeSBpdGVyYXRpb24uCisgKi8KK3ZvaWQKK19kYnVzX2RpcmVjdG9yeV9jbG9zZSAoREJ1c0Rpckl0ZXIgKml0ZXIpCit7CisgIF9kYnVzX2Nsb3NlZGlyIChpdGVyLT5kKTsKKyAgZGJ1c19mcmVlIChpdGVyKTsKK30KKworLyoqIEB9ICovIC8qIEVuZCBvZiBEQnVzSW50ZXJuYWxzVXRpbHMgZnVuY3Rpb25zICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c1N0cmluZworICoKKyAqIEB7CisgKi8KKy8qKgorICogR2V0IHRoZSBkaXJlY3RvcnkgbmFtZSBmcm9tIGEgY29tcGxldGUgZmlsZW5hbWUKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUKKyAqIEBwYXJhbSBkaXJuYW1lIHN0cmluZyB0byBhcHBlbmQgZGlyZWN0b3J5IG5hbWUgdG8KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19nZXRfZGlybmFtZShjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpkaXJuYW1lKQoreworICBpbnQgc2VwOworCisgIF9kYnVzX2Fzc2VydCAoZmlsZW5hbWUgIT0gZGlybmFtZSk7CisgIF9kYnVzX2Fzc2VydCAoZmlsZW5hbWUgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoZGlybmFtZSAhPSBOVUxMKTsKKworICAvKiBJZ25vcmUgYW55IHNlcGFyYXRvcnMgb24gdGhlIGVuZCAqLworICBzZXAgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZmlsZW5hbWUpOworICBpZiAoc2VwID09IDApCisgICAgcmV0dXJuIF9kYnVzX3N0cmluZ19hcHBlbmQgKGRpcm5hbWUsICIuIik7IC8qIGVtcHR5IHN0cmluZyBwYXNzZWQgaW4gKi8KKworICB3aGlsZSAoc2VwID4gMCAmJgorICAgICAgICAgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZmlsZW5hbWUsIHNlcCAtIDEpID09ICcvJyB8fAorICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZmlsZW5hbWUsIHNlcCAtIDEpID09ICdcXCcpKQorICAgIC0tc2VwOworCisgIF9kYnVzX2Fzc2VydCAoc2VwID49IDApOworCisgIGlmIChzZXAgPT0gMCB8fAorICAgICAgKHNlcCA9PSAyICYmCisgICAgICAgX2RidXNfc3RyaW5nX2dldF9ieXRlIChmaWxlbmFtZSwgMSkgPT0gJzonICYmCisgICAgICAgaXNhbHBoYSAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChmaWxlbmFtZSwgMCkpKSkKKyAgICByZXR1cm4gX2RidXNfc3RyaW5nX2NvcHlfbGVuIChmaWxlbmFtZSwgMCwgc2VwICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJuYW1lLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGlybmFtZSkpOworCisgIHsKKyAgICBpbnQgc2VwMSwgc2VwMjsKKyAgICBfZGJ1c19zdHJpbmdfZmluZF9ieXRlX2JhY2t3YXJkIChmaWxlbmFtZSwgc2VwLCAnLycsICZzZXAxKTsKKyAgICBfZGJ1c19zdHJpbmdfZmluZF9ieXRlX2JhY2t3YXJkIChmaWxlbmFtZSwgc2VwLCAnXFwnLCAmc2VwMik7CisKKyAgICBzZXAgPSBNQVggKHNlcDEsIHNlcDIpOworICB9CisgIGlmIChzZXAgPCAwKQorICAgIHJldHVybiBfZGJ1c19zdHJpbmdfYXBwZW5kIChkaXJuYW1lLCAiLiIpOworCisgIHdoaWxlIChzZXAgPiAwICYmCisgICAgICAgICAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChmaWxlbmFtZSwgc2VwIC0gMSkgPT0gJy8nIHx8CisgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9ieXRlIChmaWxlbmFtZSwgc2VwIC0gMSkgPT0gJ1xcJykpCisgICAgLS1zZXA7CisKKyAgX2RidXNfYXNzZXJ0IChzZXAgPj0gMCk7CisKKyAgaWYgKChzZXAgPT0gMCB8fAorICAgICAgIChzZXAgPT0gMiAmJgorICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGZpbGVuYW1lLCAxKSA9PSAnOicgJiYKKyAgICAgICAgaXNhbHBoYSAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChmaWxlbmFtZSwgMCkpKSkKKyAgICAgICYmCisgICAgICAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChmaWxlbmFtZSwgc2VwKSA9PSAnLycgfHwKKyAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGZpbGVuYW1lLCBzZXApID09ICdcXCcpKQorICAgIHJldHVybiBfZGJ1c19zdHJpbmdfY29weV9sZW4gKGZpbGVuYW1lLCAwLCBzZXAgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcm5hbWUsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkaXJuYW1lKSk7CisgIGVsc2UKKyAgICByZXR1cm4gX2RidXNfc3RyaW5nX2NvcHlfbGVuIChmaWxlbmFtZSwgMCwgc2VwIC0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJuYW1lLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGlybmFtZSkpOworfQorCisKKy8qKgorICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgVU5JWCB1c2VyIElEIG1hdGNoZXMgdGhlIFVJRCBvZgorICogdGhlIHByb2Nlc3MuIFNob3VsZCBhbHdheXMgcmV0dXJuICNGQUxTRSBvbiBXaW5kb3dzLgorICoKKyAqIEBwYXJhbSB1aWQgdGhlIFVOSVggdXNlciBJRAorICogQHJldHVybnMgI1RSVUUgaWYgdGhpcyB1aWQgb3ducyB0aGUgcHJvY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3VuaXhfdXNlcl9pc19wcm9jZXNzX293bmVyIChkYnVzX3VpZF90IHVpZCkKK3sKKyAgcmV0dXJuIEZBTFNFOworfQorCitkYnVzX2Jvb2xfdCBfZGJ1c193aW5kb3dzX3VzZXJfaXNfcHJvY2Vzc19vd25lciAoY29uc3QgY2hhciAqd2luZG93c19zaWQpCit7CisgIHJldHVybiBUUlVFOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICB1bml4IGVtdWxhdGlvbiBmdW5jdGlvbnMgLSBzaG91bGQgYmUgcmVtb3ZlZCBzb21ldGltZSBpbiB0aGUgZnV0dXJlCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqCisgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBVTklYIHVzZXIgSUQgaXMgYXQgdGhlIGNvbnNvbGUuCisgKiBTaG91bGQgYWx3YXlzIGZhaWwgb24gV2luZG93cyAoc2V0IHRoZSBlcnJvciB0bworICogI0RCVVNfRVJST1JfTk9UX1NVUFBPUlRFRCkuCisgKgorICogQHBhcmFtIHVpZCBVSUQgb2YgcGVyc29uIHRvIGNoZWNrIAorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3JzCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgVUlEIGlzIHRoZSBzYW1lIGFzIHRoZSBjb25zb2xlIHVzZXIgYW5kIHRoZXJlIGFyZSBubyBlcnJvcnMKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3VuaXhfdXNlcl9pc19hdF9jb25zb2xlIChkYnVzX3VpZF90ICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PVF9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgICAiVU5JWCB1c2VyIElEcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3NcbiIpOworICByZXR1cm4gRkFMU0U7Cit9CisKKworLyoqCisgKiBQYXJzZSBhIFVOSVggZ3JvdXAgZnJvbSB0aGUgYnVzIGNvbmZpZyBmaWxlLiBPbiBXaW5kb3dzLCB0aGlzIHNob3VsZAorICogc2ltcGx5IGFsd2F5cyBmYWlsIChqdXN0IHJldHVybiAjRkFMU0UpLgorICoKKyAqIEBwYXJhbSBncm91cG5hbWUgdGhlIGdyb3VwbmFtZSB0ZXh0CisgKiBAcGFyYW0gZ2lkX3AgcGxhY2UgdG8gcmV0dXJuIHRoZSBnaWQKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3BhcnNlX3VuaXhfZ3JvdXBfZnJvbV9jb25maWcgKGNvbnN0IERCdXNTdHJpbmcgICpncm91cG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2dpZF90ICAgICAgICAqZ2lkX3ApCit7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBQYXJzZSBhIFVOSVggdXNlciBmcm9tIHRoZSBidXMgY29uZmlnIGZpbGUuIE9uIFdpbmRvd3MsIHRoaXMgc2hvdWxkCisgKiBzaW1wbHkgYWx3YXlzIGZhaWwgKGp1c3QgcmV0dXJuICNGQUxTRSkuCisgKgorICogQHBhcmFtIHVzZXJuYW1lIHRoZSB1c2VybmFtZSB0ZXh0CisgKiBAcGFyYW0gdWlkX3AgcGxhY2UgdG8gcmV0dXJuIHRoZSB1aWQKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3BhcnNlX3VuaXhfdXNlcl9mcm9tX2NvbmZpZyAoY29uc3QgREJ1c1N0cmluZyAgKnVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICAqdWlkX3ApCit7CisgIHJldHVybiBGQUxTRTsKK30KKworCisvKioKKyAqIEdldHMgYWxsIGdyb3VwcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBVTklYIHVzZXIgSUQuIE9uIFVOSVgsCisgKiBqdXN0IGNhbGxzIF9kYnVzX2dyb3Vwc19mcm9tX3VpZCgpLiBPbiBXaW5kb3dzLCBzaG91bGQgYWx3YXlzCisgKiBmYWlsIHNpbmNlIHdlIGRvbid0IGtub3cgYW55IFVOSVggZ3JvdXBzLgorICoKKyAqIEBwYXJhbSB1aWQgdGhlIFVJRAorICogQHBhcmFtIGdyb3VwX2lkcyByZXR1cm4gbG9jYXRpb24gZm9yIGFycmF5IG9mIGdyb3VwIElEcworICogQHBhcmFtIG5fZ3JvdXBfaWRzIHJldHVybiBsb2NhdGlvbiBmb3IgbGVuZ3RoIG9mIHJldHVybmVkIGFycmF5CisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgVUlEIGV4aXN0ZWQgYW5kIHdlIGdvdCBzb21lIGNyZWRlbnRpYWxzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c191bml4X2dyb3Vwc19mcm9tX3VpZCAoZGJ1c191aWRfdCAgICAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2dpZF90ICAgICAgICAgICoqZ3JvdXBfaWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICpuX2dyb3VwX2lkcykKK3sKKyAgcmV0dXJuIEZBTFNFOworfQorCisKKworLyoqIEB9ICovIC8qIERCdXNTdHJpbmcgc3R1ZmYgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIAorIGVycm9yIGhhbmRsaW5nCisgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworCisKKy8qIGxhbiBtYW5hZ2VyIGVycm9yIGNvZGVzICovCitjb25zdCBjaGFyKgorX2RidXNfbG1fc3RyZXJyb3IoaW50IGVycm9yX251bWJlcikKK3sKKyNpZmRlZiBEQlVTX1dJTkNFCisgIC8vIFRPRE8KKyAgcmV0dXJuICJ1bmtub3duIjsKKyNlbHNlCisgIGNvbnN0IGNoYXIgKm1zZzsKKyAgc3dpdGNoIChlcnJvcl9udW1iZXIpCisgICAgeworICAgIGNhc2UgTkVSUl9OZXROb3RTdGFydGVkOgorICAgICAgcmV0dXJuICJUaGUgd29ya3N0YXRpb24gZHJpdmVyIGlzIG5vdCBpbnN0YWxsZWQuIjsKKyAgICBjYXNlIE5FUlJfVW5rbm93blNlcnZlcjoKKyAgICAgIHJldHVybiAiVGhlIHNlcnZlciBjb3VsZCBub3QgYmUgbG9jYXRlZC4iOworICAgIGNhc2UgTkVSUl9TaGFyZU1lbToKKyAgICAgIHJldHVybiAiQW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuIFRoZSBuZXR3b3JrIGNhbm5vdCBhY2Nlc3MgYSBzaGFyZWQgbWVtb3J5IHNlZ21lbnQuIjsKKyAgICBjYXNlIE5FUlJfTm9OZXR3b3JrUmVzb3VyY2U6CisgICAgICByZXR1cm4gIkEgbmV0d29yayByZXNvdXJjZSBzaG9ydGFnZSBvY2N1cnJlZC4iOworICAgIGNhc2UgTkVSUl9SZW1vdGVPbmx5OgorICAgICAgcmV0dXJuICJUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIG9uIHdvcmtzdGF0aW9ucy4iOworICAgIGNhc2UgTkVSUl9EZXZOb3RSZWRpcmVjdGVkOgorICAgICAgcmV0dXJuICJUaGUgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQuIjsKKyAgICBjYXNlIE5FUlJfU2VydmVyTm90U3RhcnRlZDoKKyAgICAgIHJldHVybiAiVGhlIFNlcnZlciBzZXJ2aWNlIGlzIG5vdCBzdGFydGVkLiI7CisgICAgY2FzZSBORVJSX0l0ZW1Ob3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIHF1ZXVlIGlzIGVtcHR5LiI7CisgICAgY2FzZSBORVJSX1Vua25vd25EZXZEaXI6CisgICAgICByZXR1cm4gIlRoZSBkZXZpY2Ugb3IgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiI7CisgICAgY2FzZSBORVJSX1JlZGlyZWN0ZWRQYXRoOgorICAgICAgcmV0dXJuICJUaGUgb3BlcmF0aW9uIGlzIGludmFsaWQgb24gYSByZWRpcmVjdGVkIHJlc291cmNlLiI7CisgICAgY2FzZSBORVJSX0R1cGxpY2F0ZVNoYXJlOgorICAgICAgcmV0dXJuICJUaGUgbmFtZSBoYXMgYWxyZWFkeSBiZWVuIHNoYXJlZC4iOworICAgIGNhc2UgTkVSUl9Ob1Jvb206CisgICAgICByZXR1cm4gIlRoZSBzZXJ2ZXIgaXMgY3VycmVudGx5IG91dCBvZiB0aGUgcmVxdWVzdGVkIHJlc291cmNlLiI7CisgICAgY2FzZSBORVJSX1Rvb01hbnlJdGVtczoKKyAgICAgIHJldHVybiAiUmVxdWVzdGVkIGFkZGl0aW9uIG9mIGl0ZW1zIGV4Y2VlZHMgdGhlIG1heGltdW0gYWxsb3dlZC4iOworICAgIGNhc2UgTkVSUl9JbnZhbGlkTWF4VXNlcnM6CisgICAgICByZXR1cm4gIlRoZSBQZWVyIHNlcnZpY2Ugc3VwcG9ydHMgb25seSB0d28gc2ltdWx0YW5lb3VzIHVzZXJzLiI7CisgICAgY2FzZSBORVJSX0J1ZlRvb1NtYWxsOgorICAgICAgcmV0dXJuICJUaGUgQVBJIHJldHVybiBidWZmZXIgaXMgdG9vIHNtYWxsLiI7CisgICAgY2FzZSBORVJSX1JlbW90ZUVycjoKKyAgICAgIHJldHVybiAiQSByZW1vdGUgQVBJIGVycm9yIG9jY3VycmVkLiI7CisgICAgY2FzZSBORVJSX0xhbm1hbkluaUVycm9yOgorICAgICAgcmV0dXJuICJBbiBlcnJvciBvY2N1cnJlZCB3aGVuIG9wZW5pbmcgb3IgcmVhZGluZyB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiI7CisgICAgY2FzZSBORVJSX05ldHdvcmtFcnJvcjoKKyAgICAgIHJldHVybiAiQSBnZW5lcmFsIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQuIjsKKyAgICBjYXNlIE5FUlJfV2tzdGFJbmNvbnNpc3RlbnRTdGF0ZToKKyAgICAgIHJldHVybiAiVGhlIFdvcmtzdGF0aW9uIHNlcnZpY2UgaXMgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBSZXN0YXJ0IHRoZSBjb21wdXRlciBiZWZvcmUgcmVzdGFydGluZyB0aGUgV29ya3N0YXRpb24gc2VydmljZS4iOworICAgIGNhc2UgTkVSUl9Xa3N0YU5vdFN0YXJ0ZWQ6CisgICAgICByZXR1cm4gIlRoZSBXb3Jrc3RhdGlvbiBzZXJ2aWNlIGhhcyBub3QgYmVlbiBzdGFydGVkLiI7CisgICAgY2FzZSBORVJSX0Jyb3dzZXJOb3RTdGFydGVkOgorICAgICAgcmV0dXJuICJUaGUgcmVxdWVzdGVkIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUuIjsKKyAgICBjYXNlIE5FUlJfSW50ZXJuYWxFcnJvcjoKKyAgICAgIHJldHVybiAiQW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuIjsKKyAgICBjYXNlIE5FUlJfQmFkVHJhbnNhY3RDb25maWc6CisgICAgICByZXR1cm4gIlRoZSBzZXJ2ZXIgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIHRyYW5zYWN0aW9ucy4iOworICAgIGNhc2UgTkVSUl9JbnZhbGlkQVBJOgorICAgICAgcmV0dXJuICJUaGUgcmVxdWVzdGVkIEFQSSBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSByZW1vdGUgc2VydmVyLiI7CisgICAgY2FzZSBORVJSX0JhZEV2ZW50TmFtZToKKyAgICAgIHJldHVybiAiVGhlIGV2ZW50IG5hbWUgaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9EdXBOYW1lUmVib290OgorICAgICAgcmV0dXJuICJUaGUgY29tcHV0ZXIgbmFtZSBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgbmV0d29yay4gQ2hhbmdlIGl0IGFuZCByZXN0YXJ0IHRoZSBjb21wdXRlci4iOworICAgIGNhc2UgTkVSUl9DZmdDb21wTm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoZSBzcGVjaWZpZWQgY29tcG9uZW50IGNvdWxkIG5vdCBiZSBmb3VuZCBpbiB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4iOworICAgIGNhc2UgTkVSUl9DZmdQYXJhbU5vdEZvdW5kOgorICAgICAgcmV0dXJuICJUaGUgc3BlY2lmaWVkIHBhcmFtZXRlciBjb3VsZCBub3QgYmUgZm91bmQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uIjsKKyAgICBjYXNlIE5FUlJfTGluZVRvb0xvbmc6CisgICAgICByZXR1cm4gIkEgbGluZSBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIHRvbyBsb25nLiI7CisgICAgY2FzZSBORVJSX1FOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIHByaW50ZXIgZG9lcyBub3QgZXhpc3QuIjsKKyAgICBjYXNlIE5FUlJfSm9iTm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoZSBwcmludCBqb2IgZG9lcyBub3QgZXhpc3QuIjsKKyAgICBjYXNlIE5FUlJfRGVzdE5vdEZvdW5kOgorICAgICAgcmV0dXJuICJUaGUgcHJpbnRlciBkZXN0aW5hdGlvbiBjYW5ub3QgYmUgZm91bmQuIjsKKyAgICBjYXNlIE5FUlJfRGVzdEV4aXN0czoKKyAgICAgIHJldHVybiAiVGhlIHByaW50ZXIgZGVzdGluYXRpb24gYWxyZWFkeSBleGlzdHMuIjsKKyAgICBjYXNlIE5FUlJfUUV4aXN0czoKKyAgICAgIHJldHVybiAiVGhlIHByaW50ZXIgcXVldWUgYWxyZWFkeSBleGlzdHMuIjsKKyAgICBjYXNlIE5FUlJfUU5vUm9vbToKKyAgICAgIHJldHVybiAiTm8gbW9yZSBwcmludGVycyBjYW4gYmUgYWRkZWQuIjsKKyAgICBjYXNlIE5FUlJfSm9iTm9Sb29tOgorICAgICAgcmV0dXJuICJObyBtb3JlIHByaW50IGpvYnMgY2FuIGJlIGFkZGVkLiI7CisgICAgY2FzZSBORVJSX0Rlc3ROb1Jvb206CisgICAgICByZXR1cm4gIk5vIG1vcmUgcHJpbnRlciBkZXN0aW5hdGlvbnMgY2FuIGJlIGFkZGVkLiI7CisgICAgY2FzZSBORVJSX0Rlc3RJZGxlOgorICAgICAgcmV0dXJuICJUaGlzIHByaW50ZXIgZGVzdGluYXRpb24gaXMgaWRsZSBhbmQgY2Fubm90IGFjY2VwdCBjb250cm9sIG9wZXJhdGlvbnMuIjsKKyAgICBjYXNlIE5FUlJfRGVzdEludmFsaWRPcDoKKyAgICAgIHJldHVybiAiVGhpcyBwcmludGVyIGRlc3RpbmF0aW9uIHJlcXVlc3QgY29udGFpbnMgYW4gaW52YWxpZCBjb250cm9sIGZ1bmN0aW9uLiI7CisgICAgY2FzZSBORVJSX1Byb2NOb1Jlc3BvbmQ6CisgICAgICByZXR1cm4gIlRoZSBwcmludCBwcm9jZXNzb3IgaXMgbm90IHJlc3BvbmRpbmcuIjsKKyAgICBjYXNlIE5FUlJfU3Bvb2xlck5vdExvYWRlZDoKKyAgICAgIHJldHVybiAiVGhlIHNwb29sZXIgaXMgbm90IHJ1bm5pbmcuIjsKKyAgICBjYXNlIE5FUlJfRGVzdEludmFsaWRTdGF0ZToKKyAgICAgIHJldHVybiAiVGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZCBvbiB0aGUgcHJpbnQgZGVzdGluYXRpb24gaW4gaXRzIGN1cnJlbnQgc3RhdGUuIjsKKyAgICBjYXNlIE5FUlJfUUludmFsaWRTdGF0ZToKKyAgICAgIHJldHVybiAiVGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZCBvbiB0aGUgcHJpbnRlciBxdWV1ZSBpbiBpdHMgY3VycmVudCBzdGF0ZS4iOworICAgIGNhc2UgTkVSUl9Kb2JJbnZhbGlkU3RhdGU6CisgICAgICByZXR1cm4gIlRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgb24gdGhlIHByaW50IGpvYiBpbiBpdHMgY3VycmVudCBzdGF0ZS4iOworICAgIGNhc2UgTkVSUl9TcG9vbE5vTWVtb3J5OgorICAgICAgcmV0dXJuICJBIHNwb29sZXIgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSBvY2N1cnJlZC4iOworICAgIGNhc2UgTkVSUl9Ecml2ZXJOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIGRldmljZSBkcml2ZXIgZG9lcyBub3QgZXhpc3QuIjsKKyAgICBjYXNlIE5FUlJfRGF0YVR5cGVJbnZhbGlkOgorICAgICAgcmV0dXJuICJUaGUgZGF0YSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHByaW50IHByb2Nlc3Nvci4iOworICAgIGNhc2UgTkVSUl9Qcm9jTm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoZSBwcmludCBwcm9jZXNzb3IgaXMgbm90IGluc3RhbGxlZC4iOworICAgIGNhc2UgTkVSUl9TZXJ2aWNlVGFibGVMb2NrZWQ6CisgICAgICByZXR1cm4gIlRoZSBzZXJ2aWNlIGRhdGFiYXNlIGlzIGxvY2tlZC4iOworICAgIGNhc2UgTkVSUl9TZXJ2aWNlVGFibGVGdWxsOgorICAgICAgcmV0dXJuICJUaGUgc2VydmljZSB0YWJsZSBpcyBmdWxsLiI7CisgICAgY2FzZSBORVJSX1NlcnZpY2VJbnN0YWxsZWQ6CisgICAgICByZXR1cm4gIlRoZSByZXF1ZXN0ZWQgc2VydmljZSBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQuIjsKKyAgICBjYXNlIE5FUlJfU2VydmljZUVudHJ5TG9ja2VkOgorICAgICAgcmV0dXJuICJUaGUgc2VydmljZSBkb2VzIG5vdCByZXNwb25kIHRvIGNvbnRyb2wgYWN0aW9ucy4iOworICAgIGNhc2UgTkVSUl9TZXJ2aWNlTm90SW5zdGFsbGVkOgorICAgICAgcmV0dXJuICJUaGUgc2VydmljZSBoYXMgbm90IGJlZW4gc3RhcnRlZC4iOworICAgIGNhc2UgTkVSUl9CYWRTZXJ2aWNlTmFtZToKKyAgICAgIHJldHVybiAiVGhlIHNlcnZpY2UgbmFtZSBpcyBpbnZhbGlkLiI7CisgICAgY2FzZSBORVJSX1NlcnZpY2VDdGxUaW1lb3V0OgorICAgICAgcmV0dXJuICJUaGUgc2VydmljZSBpcyBub3QgcmVzcG9uZGluZyB0byB0aGUgY29udHJvbCBmdW5jdGlvbi4iOworICAgIGNhc2UgTkVSUl9TZXJ2aWNlQ3RsQnVzeToKKyAgICAgIHJldHVybiAiVGhlIHNlcnZpY2UgY29udHJvbCBpcyBidXN5LiI7CisgICAgY2FzZSBORVJSX0JhZFNlcnZpY2VQcm9nTmFtZToKKyAgICAgIHJldHVybiAiVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBjb250YWlucyBhbiBpbnZhbGlkIHNlcnZpY2UgcHJvZ3JhbSBuYW1lLiI7CisgICAgY2FzZSBORVJSX1NlcnZpY2VOb3RDdHJsOgorICAgICAgcmV0dXJuICJUaGUgc2VydmljZSBjb3VsZCBub3QgYmUgY29udHJvbGxlZCBpbiBpdHMgcHJlc2VudCBzdGF0ZS4iOworICAgIGNhc2UgTkVSUl9TZXJ2aWNlS2lsbFByb2M6CisgICAgICByZXR1cm4gIlRoZSBzZXJ2aWNlIGVuZGVkIGFibm9ybWFsbHkuIjsKKyAgICBjYXNlIE5FUlJfU2VydmljZUN0bE5vdFZhbGlkOgorICAgICAgcmV0dXJuICJUaGUgcmVxdWVzdGVkIHBhdXNlIG9yIHN0b3AgaXMgbm90IHZhbGlkIGZvciB0aGlzIHNlcnZpY2UuIjsKKyAgICBjYXNlIE5FUlJfTm90SW5EaXNwYXRjaFRibDoKKyAgICAgIHJldHVybiAiVGhlIHNlcnZpY2UgY29udHJvbCBkaXNwYXRjaGVyIGNvdWxkIG5vdCBmaW5kIHRoZSBzZXJ2aWNlIG5hbWUgaW4gdGhlIGRpc3BhdGNoIHRhYmxlLiI7CisgICAgY2FzZSBORVJSX0JhZENvbnRyb2xSZWN2OgorICAgICAgcmV0dXJuICJUaGUgc2VydmljZSBjb250cm9sIGRpc3BhdGNoZXIgcGlwZSByZWFkIGZhaWxlZC4iOworICAgIGNhc2UgTkVSUl9TZXJ2aWNlTm90U3RhcnRpbmc6CisgICAgICByZXR1cm4gIkEgdGhyZWFkIGZvciB0aGUgbmV3IHNlcnZpY2UgY291bGQgbm90IGJlIGNyZWF0ZWQuIjsKKyAgICBjYXNlIE5FUlJfQWxyZWFkeUxvZ2dlZE9uOgorICAgICAgcmV0dXJuICJUaGlzIHdvcmtzdGF0aW9uIGlzIGFscmVhZHkgbG9nZ2VkIG9uIHRvIHRoZSBsb2NhbC1hcmVhIG5ldHdvcmsuIjsKKyAgICBjYXNlIE5FUlJfTm90TG9nZ2VkT246CisgICAgICByZXR1cm4gIlRoZSB3b3Jrc3RhdGlvbiBpcyBub3QgbG9nZ2VkIG9uIHRvIHRoZSBsb2NhbC1hcmVhIG5ldHdvcmsuIjsKKyAgICBjYXNlIE5FUlJfQmFkVXNlcm5hbWU6CisgICAgICByZXR1cm4gIlRoZSB1c2VyIG5hbWUgb3IgZ3JvdXAgbmFtZSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9CYWRQYXNzd29yZDoKKyAgICAgIHJldHVybiAiVGhlIHBhc3N3b3JkIHBhcmFtZXRlciBpcyBpbnZhbGlkLiI7CisgICAgY2FzZSBORVJSX1VuYWJsZVRvQWRkTmFtZV9XOgorICAgICAgcmV0dXJuICJAVyBUaGUgbG9nb24gcHJvY2Vzc29yIGRpZCBub3QgYWRkIHRoZSBtZXNzYWdlIGFsaWFzLiI7CisgICAgY2FzZSBORVJSX1VuYWJsZVRvQWRkTmFtZV9GOgorICAgICAgcmV0dXJuICJUaGUgbG9nb24gcHJvY2Vzc29yIGRpZCBub3QgYWRkIHRoZSBtZXNzYWdlIGFsaWFzLiI7CisgICAgY2FzZSBORVJSX1VuYWJsZVRvRGVsTmFtZV9XOgorICAgICAgcmV0dXJuICJAVyBUaGUgbG9nb2ZmIHByb2Nlc3NvciBkaWQgbm90IGRlbGV0ZSB0aGUgbWVzc2FnZSBhbGlhcy4iOworICAgIGNhc2UgTkVSUl9VbmFibGVUb0RlbE5hbWVfRjoKKyAgICAgIHJldHVybiAiVGhlIGxvZ29mZiBwcm9jZXNzb3IgZGlkIG5vdCBkZWxldGUgdGhlIG1lc3NhZ2UgYWxpYXMuIjsKKyAgICBjYXNlIE5FUlJfTG9nb25zUGF1c2VkOgorICAgICAgcmV0dXJuICJOZXR3b3JrIGxvZ29ucyBhcmUgcGF1c2VkLiI7CisgICAgY2FzZSBORVJSX0xvZ29uU2VydmVyQ29uZmxpY3Q6CisgICAgICByZXR1cm4gIkEgY2VudHJhbGl6ZWQgbG9nb24tc2VydmVyIGNvbmZsaWN0IG9jY3VycmVkLiI7CisgICAgY2FzZSBORVJSX0xvZ29uTm9Vc2VyUGF0aDoKKyAgICAgIHJldHVybiAiVGhlIHNlcnZlciBpcyBjb25maWd1cmVkIHdpdGhvdXQgYSB2YWxpZCB1c2VyIHBhdGguIjsKKyAgICBjYXNlIE5FUlJfTG9nb25TY3JpcHRFcnJvcjoKKyAgICAgIHJldHVybiAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZyBvciBydW5uaW5nIHRoZSBsb2dvbiBzY3JpcHQuIjsKKyAgICBjYXNlIE5FUlJfU3RhbmRhbG9uZUxvZ29uOgorICAgICAgcmV0dXJuICJUaGUgbG9nb24gc2VydmVyIHdhcyBub3Qgc3BlY2lmaWVkLiBZb3VyIGNvbXB1dGVyIHdpbGwgYmUgbG9nZ2VkIG9uIGFzIFNUQU5EQUxPTkUuIjsKKyAgICBjYXNlIE5FUlJfTG9nb25TZXJ2ZXJOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIGxvZ29uIHNlcnZlciBjb3VsZCBub3QgYmUgZm91bmQuIjsKKyAgICBjYXNlIE5FUlJfTG9nb25Eb21haW5FeGlzdHM6CisgICAgICByZXR1cm4gIlRoZXJlIGlzIGFscmVhZHkgYSBsb2dvbiBkb21haW4gZm9yIHRoaXMgY29tcHV0ZXIuIjsKKyAgICBjYXNlIE5FUlJfTm9uVmFsaWRhdGVkTG9nb246CisgICAgICByZXR1cm4gIlRoZSBsb2dvbiBzZXJ2ZXIgY291bGQgbm90IHZhbGlkYXRlIHRoZSBsb2dvbi4iOworICAgIGNhc2UgTkVSUl9BQ0ZOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIHNlY3VyaXR5IGRhdGFiYXNlIGNvdWxkIG5vdCBiZSBmb3VuZC4iOworICAgIGNhc2UgTkVSUl9Hcm91cE5vdEZvdW5kOgorICAgICAgcmV0dXJuICJUaGUgZ3JvdXAgbmFtZSBjb3VsZCBub3QgYmUgZm91bmQuIjsKKyAgICBjYXNlIE5FUlJfVXNlck5vdEZvdW5kOgorICAgICAgcmV0dXJuICJUaGUgdXNlciBuYW1lIGNvdWxkIG5vdCBiZSBmb3VuZC4iOworICAgIGNhc2UgTkVSUl9SZXNvdXJjZU5vdEZvdW5kOgorICAgICAgcmV0dXJuICJUaGUgcmVzb3VyY2UgbmFtZSBjb3VsZCBub3QgYmUgZm91bmQuIjsKKyAgICBjYXNlIE5FUlJfR3JvdXBFeGlzdHM6CisgICAgICByZXR1cm4gIlRoZSBncm91cCBhbHJlYWR5IGV4aXN0cy4iOworICAgIGNhc2UgTkVSUl9Vc2VyRXhpc3RzOgorICAgICAgcmV0dXJuICJUaGUgdXNlciBhY2NvdW50IGFscmVhZHkgZXhpc3RzLiI7CisgICAgY2FzZSBORVJSX1Jlc291cmNlRXhpc3RzOgorICAgICAgcmV0dXJuICJUaGUgcmVzb3VyY2UgcGVybWlzc2lvbiBsaXN0IGFscmVhZHkgZXhpc3RzLiI7CisgICAgY2FzZSBORVJSX05vdFByaW1hcnk6CisgICAgICByZXR1cm4gIlRoaXMgb3BlcmF0aW9uIGlzIG9ubHkgYWxsb3dlZCBvbiB0aGUgcHJpbWFyeSBkb21haW4gY29udHJvbGxlciBvZiB0aGUgZG9tYWluLiI7CisgICAgY2FzZSBORVJSX0FDRk5vdExvYWRlZDoKKyAgICAgIHJldHVybiAiVGhlIHNlY3VyaXR5IGRhdGFiYXNlIGhhcyBub3QgYmVlbiBzdGFydGVkLiI7CisgICAgY2FzZSBORVJSX0FDRk5vUm9vbToKKyAgICAgIHJldHVybiAiVGhlcmUgYXJlIHRvbyBtYW55IG5hbWVzIGluIHRoZSB1c2VyIGFjY291bnRzIGRhdGFiYXNlLiI7CisgICAgY2FzZSBORVJSX0FDRkZpbGVJT0ZhaWw6CisgICAgICByZXR1cm4gIkEgZGlzayBJL08gZmFpbHVyZSBvY2N1cnJlZC4iOworICAgIGNhc2UgTkVSUl9BQ0ZUb29NYW55TGlzdHM6CisgICAgICByZXR1cm4gIlRoZSBsaW1pdCBvZiA2NCBlbnRyaWVzIHBlciByZXNvdXJjZSB3YXMgZXhjZWVkZWQuIjsKKyAgICBjYXNlIE5FUlJfVXNlckxvZ29uOgorICAgICAgcmV0dXJuICJEZWxldGluZyBhIHVzZXIgd2l0aCBhIHNlc3Npb24gaXMgbm90IGFsbG93ZWQuIjsKKyAgICBjYXNlIE5FUlJfQUNGTm9QYXJlbnQ6CisgICAgICByZXR1cm4gIlRoZSBwYXJlbnQgZGlyZWN0b3J5IGNvdWxkIG5vdCBiZSBsb2NhdGVkLiI7CisgICAgY2FzZSBORVJSX0Nhbk5vdEdyb3dTZWdtZW50OgorICAgICAgcmV0dXJuICJVbmFibGUgdG8gYWRkIHRvIHRoZSBzZWN1cml0eSBkYXRhYmFzZSBzZXNzaW9uIGNhY2hlIHNlZ21lbnQuIjsKKyAgICBjYXNlIE5FUlJfU3BlR3JvdXBPcDoKKyAgICAgIHJldHVybiAiVGhpcyBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQgb24gdGhpcyBzcGVjaWFsIGdyb3VwLiI7CisgICAgY2FzZSBORVJSX05vdEluQ2FjaGU6CisgICAgICByZXR1cm4gIlRoaXMgdXNlciBpcyBub3QgY2FjaGVkIGluIHVzZXIgYWNjb3VudHMgZGF0YWJhc2Ugc2Vzc2lvbiBjYWNoZS4iOworICAgIGNhc2UgTkVSUl9Vc2VySW5Hcm91cDoKKyAgICAgIHJldHVybiAiVGhlIHVzZXIgYWxyZWFkeSBiZWxvbmdzIHRvIHRoaXMgZ3JvdXAuIjsKKyAgICBjYXNlIE5FUlJfVXNlck5vdEluR3JvdXA6CisgICAgICByZXR1cm4gIlRoZSB1c2VyIGRvZXMgbm90IGJlbG9uZyB0byB0aGlzIGdyb3VwLiI7CisgICAgY2FzZSBORVJSX0FjY291bnRVbmRlZmluZWQ6CisgICAgICByZXR1cm4gIlRoaXMgdXNlciBhY2NvdW50IGlzIHVuZGVmaW5lZC4iOworICAgIGNhc2UgTkVSUl9BY2NvdW50RXhwaXJlZDoKKyAgICAgIHJldHVybiAiVGhpcyB1c2VyIGFjY291bnQgaGFzIGV4cGlyZWQuIjsKKyAgICBjYXNlIE5FUlJfSW52YWxpZFdvcmtzdGF0aW9uOgorICAgICAgcmV0dXJuICJUaGUgdXNlciBpcyBub3QgYWxsb3dlZCB0byBsb2cgb24gZnJvbSB0aGlzIHdvcmtzdGF0aW9uLiI7CisgICAgY2FzZSBORVJSX0ludmFsaWRMb2dvbkhvdXJzOgorICAgICAgcmV0dXJuICJUaGUgdXNlciBpcyBub3QgYWxsb3dlZCB0byBsb2cgb24gYXQgdGhpcyB0aW1lLiI7CisgICAgY2FzZSBORVJSX1Bhc3N3b3JkRXhwaXJlZDoKKyAgICAgIHJldHVybiAiVGhlIHBhc3N3b3JkIG9mIHRoaXMgdXNlciBoYXMgZXhwaXJlZC4iOworICAgIGNhc2UgTkVSUl9QYXNzd29yZENhbnRDaGFuZ2U6CisgICAgICByZXR1cm4gIlRoZSBwYXNzd29yZCBvZiB0aGlzIHVzZXIgY2Fubm90IGNoYW5nZS4iOworICAgIGNhc2UgTkVSUl9QYXNzd29yZEhpc3RDb25mbGljdDoKKyAgICAgIHJldHVybiAiVGhpcyBwYXNzd29yZCBjYW5ub3QgYmUgdXNlZCBub3cuIjsKKyAgICBjYXNlIE5FUlJfUGFzc3dvcmRUb29TaG9ydDoKKyAgICAgIHJldHVybiAiVGhlIHBhc3N3b3JkIGRvZXMgbm90IG1lZXQgdGhlIHBhc3N3b3JkIHBvbGljeSByZXF1aXJlbWVudHMuIENoZWNrIHRoZSBtaW5pbXVtIHBhc3N3b3JkIGxlbmd0aCwgcGFzc3dvcmQgY29tcGxleGl0eSBhbmQgcGFzc3dvcmQgaGlzdG9yeSByZXF1aXJlbWVudHMuIjsKKyAgICBjYXNlIE5FUlJfUGFzc3dvcmRUb29SZWNlbnQ6CisgICAgICByZXR1cm4gIlRoZSBwYXNzd29yZCBvZiB0aGlzIHVzZXIgaXMgdG9vIHJlY2VudCB0byBjaGFuZ2UuIjsKKyAgICBjYXNlIE5FUlJfSW52YWxpZERhdGFiYXNlOgorICAgICAgcmV0dXJuICJUaGUgc2VjdXJpdHkgZGF0YWJhc2UgaXMgY29ycnVwdGVkLiI7CisgICAgY2FzZSBORVJSX0RhdGFiYXNlVXBUb0RhdGU6CisgICAgICByZXR1cm4gIk5vIHVwZGF0ZXMgYXJlIG5lY2Vzc2FyeSB0byB0aGlzIHJlcGxpY2FudCBuZXR3b3JrL2xvY2FsIHNlY3VyaXR5IGRhdGFiYXNlLiI7CisgICAgY2FzZSBORVJSX1N5bmNSZXF1aXJlZDoKKyAgICAgIHJldHVybiAiVGhpcyByZXBsaWNhbnQgZGF0YWJhc2UgaXMgb3V0ZGF0ZWQ7IHN5bmNocm9uaXphdGlvbiBpcyByZXF1aXJlZC4iOworICAgIGNhc2UgTkVSUl9Vc2VOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIG5ldHdvcmsgY29ubmVjdGlvbiBjb3VsZCBub3QgYmUgZm91bmQuIjsKKyAgICBjYXNlIE5FUlJfQmFkQXNnVHlwZToKKyAgICAgIHJldHVybiAiVGhpcyBhc2dfdHlwZSBpcyBpbnZhbGlkLiI7CisgICAgY2FzZSBORVJSX0RldmljZUlzU2hhcmVkOgorICAgICAgcmV0dXJuICJUaGlzIGRldmljZSBpcyBjdXJyZW50bHkgYmVpbmcgc2hhcmVkLiI7CisgICAgY2FzZSBORVJSX05vQ29tcHV0ZXJOYW1lOgorICAgICAgcmV0dXJuICJUaGUgY29tcHV0ZXIgbmFtZSBjb3VsZCBub3QgYmUgYWRkZWQgYXMgYSBtZXNzYWdlIGFsaWFzLiBUaGUgbmFtZSBtYXkgYWxyZWFkeSBleGlzdCBvbiB0aGUgbmV0d29yay4iOworICAgIGNhc2UgTkVSUl9Nc2dBbHJlYWR5U3RhcnRlZDoKKyAgICAgIHJldHVybiAiVGhlIE1lc3NlbmdlciBzZXJ2aWNlIGlzIGFscmVhZHkgc3RhcnRlZC4iOworICAgIGNhc2UgTkVSUl9Nc2dJbml0RmFpbGVkOgorICAgICAgcmV0dXJuICJUaGUgTWVzc2VuZ2VyIHNlcnZpY2UgZmFpbGVkIHRvIHN0YXJ0LiI7CisgICAgY2FzZSBORVJSX05hbWVOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIG1lc3NhZ2UgYWxpYXMgY291bGQgbm90IGJlIGZvdW5kIG9uIHRoZSBuZXR3b3JrLiI7CisgICAgY2FzZSBORVJSX0FscmVhZHlGb3J3YXJkZWQ6CisgICAgICByZXR1cm4gIlRoaXMgbWVzc2FnZSBhbGlhcyBoYXMgYWxyZWFkeSBiZWVuIGZvcndhcmRlZC4iOworICAgIGNhc2UgTkVSUl9BZGRGb3J3YXJkZWQ6CisgICAgICByZXR1cm4gIlRoaXMgbWVzc2FnZSBhbGlhcyBoYXMgYmVlbiBhZGRlZCBidXQgaXMgc3RpbGwgZm9yd2FyZGVkLiI7CisgICAgY2FzZSBORVJSX0FscmVhZHlFeGlzdHM6CisgICAgICByZXR1cm4gIlRoaXMgbWVzc2FnZSBhbGlhcyBhbHJlYWR5IGV4aXN0cyBsb2NhbGx5LiI7CisgICAgY2FzZSBORVJSX1Rvb01hbnlOYW1lczoKKyAgICAgIHJldHVybiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIGFkZGVkIG1lc3NhZ2UgYWxpYXNlcyBoYXMgYmVlbiBleGNlZWRlZC4iOworICAgIGNhc2UgTkVSUl9EZWxDb21wdXRlck5hbWU6CisgICAgICByZXR1cm4gIlRoZSBjb21wdXRlciBuYW1lIGNvdWxkIG5vdCBiZSBkZWxldGVkLiI7CisgICAgY2FzZSBORVJSX0xvY2FsRm9yd2FyZDoKKyAgICAgIHJldHVybiAiTWVzc2FnZXMgY2Fubm90IGJlIGZvcndhcmRlZCBiYWNrIHRvIHRoZSBzYW1lIHdvcmtzdGF0aW9uLiI7CisgICAgY2FzZSBORVJSX0dycE1zZ1Byb2Nlc3NvcjoKKyAgICAgIHJldHVybiAiQW4gZXJyb3Igb2NjdXJyZWQgaW4gdGhlIGRvbWFpbiBtZXNzYWdlIHByb2Nlc3Nvci4iOworICAgIGNhc2UgTkVSUl9QYXVzZWRSZW1vdGU6CisgICAgICByZXR1cm4gIlRoZSBtZXNzYWdlIHdhcyBzZW50LCBidXQgdGhlIHJlY2lwaWVudCBoYXMgcGF1c2VkIHRoZSBNZXNzZW5nZXIgc2VydmljZS4iOworICAgIGNhc2UgTkVSUl9CYWRSZWNlaXZlOgorICAgICAgcmV0dXJuICJUaGUgbWVzc2FnZSB3YXMgc2VudCBidXQgbm90IHJlY2VpdmVkLiI7CisgICAgY2FzZSBORVJSX05hbWVJblVzZToKKyAgICAgIHJldHVybiAiVGhlIG1lc3NhZ2UgYWxpYXMgaXMgY3VycmVudGx5IGluIHVzZS4gVHJ5IGFnYWluIGxhdGVyLiI7CisgICAgY2FzZSBORVJSX01zZ05vdFN0YXJ0ZWQ6CisgICAgICByZXR1cm4gIlRoZSBNZXNzZW5nZXIgc2VydmljZSBoYXMgbm90IGJlZW4gc3RhcnRlZC4iOworICAgIGNhc2UgTkVSUl9Ob3RMb2NhbE5hbWU6CisgICAgICByZXR1cm4gIlRoZSBuYW1lIGlzIG5vdCBvbiB0aGUgbG9jYWwgY29tcHV0ZXIuIjsKKyAgICBjYXNlIE5FUlJfTm9Gb3J3YXJkTmFtZToKKyAgICAgIHJldHVybiAiVGhlIGZvcndhcmRlZCBtZXNzYWdlIGFsaWFzIGNvdWxkIG5vdCBiZSBmb3VuZCBvbiB0aGUgbmV0d29yay4iOworICAgIGNhc2UgTkVSUl9SZW1vdGVGdWxsOgorICAgICAgcmV0dXJuICJUaGUgbWVzc2FnZSBhbGlhcyB0YWJsZSBvbiB0aGUgcmVtb3RlIHN0YXRpb24gaXMgZnVsbC4iOworICAgIGNhc2UgTkVSUl9OYW1lTm90Rm9yd2FyZGVkOgorICAgICAgcmV0dXJuICJNZXNzYWdlcyBmb3IgdGhpcyBhbGlhcyBhcmUgbm90IGN1cnJlbnRseSBiZWluZyBmb3J3YXJkZWQuIjsKKyAgICBjYXNlIE5FUlJfVHJ1bmNhdGVkQnJvYWRjYXN0OgorICAgICAgcmV0dXJuICJUaGUgYnJvYWRjYXN0IG1lc3NhZ2Ugd2FzIHRydW5jYXRlZC4iOworICAgIGNhc2UgTkVSUl9JbnZhbGlkRGV2aWNlOgorICAgICAgcmV0dXJuICJUaGlzIGlzIGFuIGludmFsaWQgZGV2aWNlIG5hbWUuIjsKKyAgICBjYXNlIE5FUlJfV3JpdGVGYXVsdDoKKyAgICAgIHJldHVybiAiQSB3cml0ZSBmYXVsdCBvY2N1cnJlZC4iOworICAgIGNhc2UgTkVSUl9EdXBsaWNhdGVOYW1lOgorICAgICAgcmV0dXJuICJBIGR1cGxpY2F0ZSBtZXNzYWdlIGFsaWFzIGV4aXN0cyBvbiB0aGUgbmV0d29yay4iOworICAgIGNhc2UgTkVSUl9EZWxldGVMYXRlcjoKKyAgICAgIHJldHVybiAiQFcgVGhpcyBtZXNzYWdlIGFsaWFzIHdpbGwgYmUgZGVsZXRlZCBsYXRlci4iOworICAgIGNhc2UgTkVSUl9JbmNvbXBsZXRlRGVsOgorICAgICAgcmV0dXJuICJUaGUgbWVzc2FnZSBhbGlhcyB3YXMgbm90IHN1Y2Nlc3NmdWxseSBkZWxldGVkIGZyb20gYWxsIG5ldHdvcmtzLiI7CisgICAgY2FzZSBORVJSX011bHRpcGxlTmV0czoKKyAgICAgIHJldHVybiAiVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBvbiBjb21wdXRlcnMgd2l0aCBtdWx0aXBsZSBuZXR3b3Jrcy4iOworICAgIGNhc2UgTkVSUl9OZXROYW1lTm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoaXMgc2hhcmVkIHJlc291cmNlIGRvZXMgbm90IGV4aXN0LiI7CisgICAgY2FzZSBORVJSX0RldmljZU5vdFNoYXJlZDoKKyAgICAgIHJldHVybiAiVGhpcyBkZXZpY2UgaXMgbm90IHNoYXJlZC4iOworICAgIGNhc2UgTkVSUl9DbGllbnROYW1lTm90Rm91bmQ6CisgICAgICByZXR1cm4gIkEgc2Vzc2lvbiBkb2VzIG5vdCBleGlzdCB3aXRoIHRoYXQgY29tcHV0ZXIgbmFtZS4iOworICAgIGNhc2UgTkVSUl9GaWxlSWROb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlcmUgaXMgbm90IGFuIG9wZW4gZmlsZSB3aXRoIHRoYXQgaWRlbnRpZmljYXRpb24gbnVtYmVyLiI7CisgICAgY2FzZSBORVJSX0V4ZWNGYWlsdXJlOgorICAgICAgcmV0dXJuICJBIGZhaWx1cmUgb2NjdXJyZWQgd2hlbiBleGVjdXRpbmcgYSByZW1vdGUgYWRtaW5pc3RyYXRpb24gY29tbWFuZC4iOworICAgIGNhc2UgTkVSUl9UbXBGaWxlOgorICAgICAgcmV0dXJuICJBIGZhaWx1cmUgb2NjdXJyZWQgd2hlbiBvcGVuaW5nIGEgcmVtb3RlIHRlbXBvcmFyeSBmaWxlLiI7CisgICAgY2FzZSBORVJSX1Rvb011Y2hEYXRhOgorICAgICAgcmV0dXJuICJUaGUgZGF0YSByZXR1cm5lZCBmcm9tIGEgcmVtb3RlIGFkbWluaXN0cmF0aW9uIGNvbW1hbmQgaGFzIGJlZW4gdHJ1bmNhdGVkIHRvIDY0Sy4iOworICAgIGNhc2UgTkVSUl9EZXZpY2VTaGFyZUNvbmZsaWN0OgorICAgICAgcmV0dXJuICJUaGlzIGRldmljZSBjYW5ub3QgYmUgc2hhcmVkIGFzIGJvdGggYSBzcG9vbGVkIGFuZCBhIG5vbi1zcG9vbGVkIHJlc291cmNlLiI7CisgICAgY2FzZSBORVJSX0Jyb3dzZXJUYWJsZUluY29tcGxldGU6CisgICAgICByZXR1cm4gIlRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgbGlzdCBvZiBzZXJ2ZXJzIG1heSBiZSBpbmNvcnJlY3QuIjsKKyAgICBjYXNlIE5FUlJfTm90TG9jYWxEb21haW46CisgICAgICByZXR1cm4gIlRoZSBjb21wdXRlciBpcyBub3QgYWN0aXZlIGluIHRoaXMgZG9tYWluLiI7CisjaWZkZWYgTkVSUl9Jc0Rmc1NoYXJlCisKKyAgICBjYXNlIE5FUlJfSXNEZnNTaGFyZToKKyAgICAgIHJldHVybiAiVGhlIHNoYXJlIG11c3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBEaXN0cmlidXRlZCBGaWxlIFN5c3RlbSBiZWZvcmUgaXQgY2FuIGJlIGRlbGV0ZWQuIjsKKyNlbmRpZgorCisgICAgY2FzZSBORVJSX0RldkludmFsaWRPcENvZGU6CisgICAgICByZXR1cm4gIlRoZSBvcGVyYXRpb24gaXMgaW52YWxpZCBmb3IgdGhpcyBkZXZpY2UuIjsKKyAgICBjYXNlIE5FUlJfRGV2Tm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoaXMgZGV2aWNlIGNhbm5vdCBiZSBzaGFyZWQuIjsKKyAgICBjYXNlIE5FUlJfRGV2Tm90T3BlbjoKKyAgICAgIHJldHVybiAiVGhpcyBkZXZpY2Ugd2FzIG5vdCBvcGVuLiI7CisgICAgY2FzZSBORVJSX0JhZFF1ZXVlRGV2U3RyaW5nOgorICAgICAgcmV0dXJuICJUaGlzIGRldmljZSBuYW1lIGxpc3QgaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9CYWRRdWV1ZVByaW9yaXR5OgorICAgICAgcmV0dXJuICJUaGUgcXVldWUgcHJpb3JpdHkgaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9Ob0NvbW1EZXZzOgorICAgICAgcmV0dXJuICJUaGVyZSBhcmUgbm8gc2hhcmVkIGNvbW11bmljYXRpb24gZGV2aWNlcy4iOworICAgIGNhc2UgTkVSUl9RdWV1ZU5vdEZvdW5kOgorICAgICAgcmV0dXJuICJUaGUgcXVldWUgeW91IHNwZWNpZmllZCBkb2VzIG5vdCBleGlzdC4iOworICAgIGNhc2UgTkVSUl9CYWREZXZTdHJpbmc6CisgICAgICByZXR1cm4gIlRoaXMgbGlzdCBvZiBkZXZpY2VzIGlzIGludmFsaWQuIjsKKyAgICBjYXNlIE5FUlJfQmFkRGV2OgorICAgICAgcmV0dXJuICJUaGUgcmVxdWVzdGVkIGRldmljZSBpcyBpbnZhbGlkLiI7CisgICAgY2FzZSBORVJSX0luVXNlQnlTcG9vbGVyOgorICAgICAgcmV0dXJuICJUaGlzIGRldmljZSBpcyBhbHJlYWR5IGluIHVzZSBieSB0aGUgc3Bvb2xlci4iOworICAgIGNhc2UgTkVSUl9Db21tRGV2SW5Vc2U6CisgICAgICByZXR1cm4gIlRoaXMgZGV2aWNlIGlzIGFscmVhZHkgaW4gdXNlIGFzIGEgY29tbXVuaWNhdGlvbiBkZXZpY2UuIjsKKyAgICBjYXNlIE5FUlJfSW52YWxpZENvbXB1dGVyOgorICAgICAgcmV0dXJuICJUaGlzIGNvbXB1dGVyIG5hbWUgaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9NYXhMZW5FeGNlZWRlZDoKKyAgICAgIHJldHVybiAiVGhlIHN0cmluZyBhbmQgcHJlZml4IHNwZWNpZmllZCBhcmUgdG9vIGxvbmcuIjsKKyAgICBjYXNlIE5FUlJfQmFkQ29tcG9uZW50OgorICAgICAgcmV0dXJuICJUaGlzIHBhdGggY29tcG9uZW50IGlzIGludmFsaWQuIjsKKyAgICBjYXNlIE5FUlJfQ2FudFR5cGU6CisgICAgICByZXR1cm4gIkNvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgaW5wdXQuIjsKKyAgICBjYXNlIE5FUlJfVG9vTWFueUVudHJpZXM6CisgICAgICByZXR1cm4gIlRoZSBidWZmZXIgZm9yIHR5cGVzIGlzIG5vdCBiaWcgZW5vdWdoLiI7CisgICAgY2FzZSBORVJSX1Byb2ZpbGVGaWxlVG9vQmlnOgorICAgICAgcmV0dXJuICJQcm9maWxlIGZpbGVzIGNhbm5vdCBleGNlZWQgNjRLLiI7CisgICAgY2FzZSBORVJSX1Byb2ZpbGVPZmZzZXQ6CisgICAgICByZXR1cm4gIlRoZSBzdGFydCBvZmZzZXQgaXMgb3V0IG9mIHJhbmdlLiI7CisgICAgY2FzZSBORVJSX1Byb2ZpbGVDbGVhbnVwOgorICAgICAgcmV0dXJuICJUaGUgc3lzdGVtIGNhbm5vdCBkZWxldGUgY3VycmVudCBjb25uZWN0aW9ucyB0byBuZXR3b3JrIHJlc291cmNlcy4iOworICAgIGNhc2UgTkVSUl9Qcm9maWxlVW5rbm93bkNtZDoKKyAgICAgIHJldHVybiAiVGhlIHN5c3RlbSB3YXMgdW5hYmxlIHRvIHBhcnNlIHRoZSBjb21tYW5kIGxpbmUgaW4gdGhpcyBmaWxlLiI7CisgICAgY2FzZSBORVJSX1Byb2ZpbGVMb2FkRXJyOgorICAgICAgcmV0dXJuICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBsb2FkaW5nIHRoZSBwcm9maWxlIGZpbGUuIjsKKyAgICBjYXNlIE5FUlJfUHJvZmlsZVNhdmVFcnI6CisgICAgICByZXR1cm4gIkBXIEVycm9ycyBvY2N1cnJlZCB3aGlsZSBzYXZpbmcgdGhlIHByb2ZpbGUgZmlsZS4gVGhlIHByb2ZpbGUgd2FzIHBhcnRpYWxseSBzYXZlZC4iOworICAgIGNhc2UgTkVSUl9Mb2dPdmVyZmxvdzoKKyAgICAgIHJldHVybiAiTG9nIGZpbGUgJTEgaXMgZnVsbC4iOworICAgIGNhc2UgTkVSUl9Mb2dGaWxlQ2hhbmdlZDoKKyAgICAgIHJldHVybiAiVGhpcyBsb2cgZmlsZSBoYXMgY2hhbmdlZCBiZXR3ZWVuIHJlYWRzLiI7CisgICAgY2FzZSBORVJSX0xvZ0ZpbGVDb3JydXB0OgorICAgICAgcmV0dXJuICJMb2cgZmlsZSAlMSBpcyBjb3JydXB0LiI7CisgICAgY2FzZSBORVJSX1NvdXJjZUlzRGlyOgorICAgICAgcmV0dXJuICJUaGUgc291cmNlIHBhdGggY2Fubm90IGJlIGEgZGlyZWN0b3J5LiI7CisgICAgY2FzZSBORVJSX0JhZFNvdXJjZToKKyAgICAgIHJldHVybiAiVGhlIHNvdXJjZSBwYXRoIGlzIGlsbGVnYWwuIjsKKyAgICBjYXNlIE5FUlJfQmFkRGVzdDoKKyAgICAgIHJldHVybiAiVGhlIGRlc3RpbmF0aW9uIHBhdGggaXMgaWxsZWdhbC4iOworICAgIGNhc2UgTkVSUl9EaWZmZXJlbnRTZXJ2ZXJzOgorICAgICAgcmV0dXJuICJUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBwYXRocyBhcmUgb24gZGlmZmVyZW50IHNlcnZlcnMuIjsKKyAgICBjYXNlIE5FUlJfUnVuU3J2UGF1c2VkOgorICAgICAgcmV0dXJuICJUaGUgUnVuIHNlcnZlciB5b3UgcmVxdWVzdGVkIGlzIHBhdXNlZC4iOworICAgIGNhc2UgTkVSUl9FcnJDb21tUnVuU3J2OgorICAgICAgcmV0dXJuICJBbiBlcnJvciBvY2N1cnJlZCB3aGVuIGNvbW11bmljYXRpbmcgd2l0aCBhIFJ1biBzZXJ2ZXIuIjsKKyAgICBjYXNlIE5FUlJfRXJyb3JFeGVjaW5nR2hvc3Q6CisgICAgICByZXR1cm4gIkFuIGVycm9yIG9jY3VycmVkIHdoZW4gc3RhcnRpbmcgYSBiYWNrZ3JvdW5kIHByb2Nlc3MuIjsKKyAgICBjYXNlIE5FUlJfU2hhcmVOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIHNoYXJlZCByZXNvdXJjZSB5b3UgYXJlIGNvbm5lY3RlZCB0byBjb3VsZCBub3QgYmUgZm91bmQuIjsKKyAgICBjYXNlIE5FUlJfSW52YWxpZExhbmE6CisgICAgICByZXR1cm4gIlRoZSBMQU4gYWRhcHRlciBudW1iZXIgaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9PcGVuRmlsZXM6CisgICAgICByZXR1cm4gIlRoZXJlIGFyZSBvcGVuIGZpbGVzIG9uIHRoZSBjb25uZWN0aW9uLiI7CisgICAgY2FzZSBORVJSX0FjdGl2ZUNvbm5zOgorICAgICAgcmV0dXJuICJBY3RpdmUgY29ubmVjdGlvbnMgc3RpbGwgZXhpc3QuIjsKKyAgICBjYXNlIE5FUlJfQmFkUGFzc3dvcmRDb3JlOgorICAgICAgcmV0dXJuICJUaGlzIHNoYXJlIG5hbWUgb3IgcGFzc3dvcmQgaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9EZXZJblVzZToKKyAgICAgIHJldHVybiAiVGhlIGRldmljZSBpcyBiZWluZyBhY2Nlc3NlZCBieSBhbiBhY3RpdmUgcHJvY2Vzcy4iOworICAgIGNhc2UgTkVSUl9Mb2NhbERyaXZlOgorICAgICAgcmV0dXJuICJUaGUgZHJpdmUgbGV0dGVyIGlzIGluIHVzZSBsb2NhbGx5LiI7CisgICAgY2FzZSBORVJSX0FsZXJ0RXhpc3RzOgorICAgICAgcmV0dXJuICJUaGUgc3BlY2lmaWVkIGNsaWVudCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHRoZSBzcGVjaWZpZWQgZXZlbnQuIjsKKyAgICBjYXNlIE5FUlJfVG9vTWFueUFsZXJ0czoKKyAgICAgIHJldHVybiAiVGhlIGFsZXJ0IHRhYmxlIGlzIGZ1bGwuIjsKKyAgICBjYXNlIE5FUlJfTm9TdWNoQWxlcnQ6CisgICAgICByZXR1cm4gIkFuIGludmFsaWQgb3Igbm9uZXhpc3RlbnQgYWxlcnQgbmFtZSB3YXMgcmFpc2VkLiI7CisgICAgY2FzZSBORVJSX0JhZFJlY2lwaWVudDoKKyAgICAgIHJldHVybiAiVGhlIGFsZXJ0IHJlY2lwaWVudCBpcyBpbnZhbGlkLiI7CisgICAgY2FzZSBORVJSX0FjY3RMaW1pdEV4Y2VlZGVkOgorICAgICAgcmV0dXJuICJBIHVzZXIncyBzZXNzaW9uIHdpdGggdGhpcyBzZXJ2ZXIgaGFzIGJlZW4gZGVsZXRlZC4iOworICAgIGNhc2UgTkVSUl9JbnZhbGlkTG9nU2VlazoKKyAgICAgIHJldHVybiAiVGhlIGxvZyBmaWxlIGRvZXMgbm90IGNvbnRhaW4gdGhlIHJlcXVlc3RlZCByZWNvcmQgbnVtYmVyLiI7CisgICAgY2FzZSBORVJSX0JhZFVhc0NvbmZpZzoKKyAgICAgIHJldHVybiAiVGhlIHVzZXIgYWNjb3VudHMgZGF0YWJhc2UgaXMgbm90IGNvbmZpZ3VyZWQgY29ycmVjdGx5LiI7CisgICAgY2FzZSBORVJSX0ludmFsaWRVQVNPcDoKKyAgICAgIHJldHVybiAiVGhpcyBvcGVyYXRpb24gaXMgbm90IHBlcm1pdHRlZCB3aGVuIHRoZSBOZXRsb2dvbiBzZXJ2aWNlIGlzIHJ1bm5pbmcuIjsKKyAgICBjYXNlIE5FUlJfTGFzdEFkbWluOgorICAgICAgcmV0dXJuICJUaGlzIG9wZXJhdGlvbiBpcyBub3QgYWxsb3dlZCBvbiB0aGUgbGFzdCBhZG1pbmlzdHJhdGl2ZSBhY2NvdW50LiI7CisgICAgY2FzZSBORVJSX0RDTm90Rm91bmQ6CisgICAgICByZXR1cm4gIkNvdWxkIG5vdCBmaW5kIGRvbWFpbiBjb250cm9sbGVyIGZvciB0aGlzIGRvbWFpbi4iOworICAgIGNhc2UgTkVSUl9Mb2dvblRyYWNraW5nRXJyb3I6CisgICAgICByZXR1cm4gIkNvdWxkIG5vdCBzZXQgbG9nb24gaW5mb3JtYXRpb24gZm9yIHRoaXMgdXNlci4iOworICAgIGNhc2UgTkVSUl9OZXRsb2dvbk5vdFN0YXJ0ZWQ6CisgICAgICByZXR1cm4gIlRoZSBOZXRsb2dvbiBzZXJ2aWNlIGhhcyBub3QgYmVlbiBzdGFydGVkLiI7CisgICAgY2FzZSBORVJSX0Nhbk5vdEdyb3dVQVNGaWxlOgorICAgICAgcmV0dXJuICJVbmFibGUgdG8gYWRkIHRvIHRoZSB1c2VyIGFjY291bnRzIGRhdGFiYXNlLiI7CisgICAgY2FzZSBORVJSX1RpbWVEaWZmQXREQzoKKyAgICAgIHJldHVybiAiVGhpcyBzZXJ2ZXIncyBjbG9jayBpcyBub3Qgc3luY2hyb25pemVkIHdpdGggdGhlIHByaW1hcnkgZG9tYWluIGNvbnRyb2xsZXIncyBjbG9jay4iOworICAgIGNhc2UgTkVSUl9QYXNzd29yZE1pc21hdGNoOgorICAgICAgcmV0dXJuICJBIHBhc3N3b3JkIG1pc21hdGNoIGhhcyBiZWVuIGRldGVjdGVkLiI7CisgICAgY2FzZSBORVJSX05vU3VjaFNlcnZlcjoKKyAgICAgIHJldHVybiAiVGhlIHNlcnZlciBpZGVudGlmaWNhdGlvbiBkb2VzIG5vdCBzcGVjaWZ5IGEgdmFsaWQgc2VydmVyLiI7CisgICAgY2FzZSBORVJSX05vU3VjaFNlc3Npb246CisgICAgICByZXR1cm4gIlRoZSBzZXNzaW9uIGlkZW50aWZpY2F0aW9uIGRvZXMgbm90IHNwZWNpZnkgYSB2YWxpZCBzZXNzaW9uLiI7CisgICAgY2FzZSBORVJSX05vU3VjaENvbm5lY3Rpb246CisgICAgICByZXR1cm4gIlRoZSBjb25uZWN0aW9uIGlkZW50aWZpY2F0aW9uIGRvZXMgbm90IHNwZWNpZnkgYSB2YWxpZCBjb25uZWN0aW9uLiI7CisgICAgY2FzZSBORVJSX1Rvb01hbnlTZXJ2ZXJzOgorICAgICAgcmV0dXJuICJUaGVyZSBpcyBubyBzcGFjZSBmb3IgYW5vdGhlciBlbnRyeSBpbiB0aGUgdGFibGUgb2YgYXZhaWxhYmxlIHNlcnZlcnMuIjsKKyAgICBjYXNlIE5FUlJfVG9vTWFueVNlc3Npb25zOgorICAgICAgcmV0dXJuICJUaGUgc2VydmVyIGhhcyByZWFjaGVkIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZXNzaW9ucyBpdCBzdXBwb3J0cy4iOworICAgIGNhc2UgTkVSUl9Ub29NYW55Q29ubmVjdGlvbnM6CisgICAgICByZXR1cm4gIlRoZSBzZXJ2ZXIgaGFzIHJlYWNoZWQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGl0IHN1cHBvcnRzLiI7CisgICAgY2FzZSBORVJSX1Rvb01hbnlGaWxlczoKKyAgICAgIHJldHVybiAiVGhlIHNlcnZlciBjYW5ub3Qgb3BlbiBtb3JlIGZpbGVzIGJlY2F1c2UgaXQgaGFzIHJlYWNoZWQgaXRzIG1heGltdW0gbnVtYmVyLiI7CisgICAgY2FzZSBORVJSX05vQWx0ZXJuYXRlU2VydmVyczoKKyAgICAgIHJldHVybiAiVGhlcmUgYXJlIG5vIGFsdGVybmF0ZSBzZXJ2ZXJzIHJlZ2lzdGVyZWQgb24gdGhpcyBzZXJ2ZXIuIjsKKyAgICBjYXNlIE5FUlJfVHJ5RG93bkxldmVsOgorICAgICAgcmV0dXJuICJUcnkgZG93bi1sZXZlbCAocmVtb3RlIGFkbWluIHByb3RvY29sKSB2ZXJzaW9uIG9mIEFQSSBpbnN0ZWFkLiI7CisgICAgY2FzZSBORVJSX1VQU0RyaXZlck5vdFN0YXJ0ZWQ6CisgICAgICByZXR1cm4gIlRoZSBVUFMgZHJpdmVyIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZCBieSB0aGUgVVBTIHNlcnZpY2UuIjsKKyAgICBjYXNlIE5FUlJfVVBTSW52YWxpZENvbmZpZzoKKyAgICAgIHJldHVybiAiVGhlIFVQUyBzZXJ2aWNlIGlzIG5vdCBjb25maWd1cmVkIGNvcnJlY3RseS4iOworICAgIGNhc2UgTkVSUl9VUFNJbnZhbGlkQ29tbVBvcnQ6CisgICAgICByZXR1cm4gIlRoZSBVUFMgc2VydmljZSBjb3VsZCBub3QgYWNjZXNzIHRoZSBzcGVjaWZpZWQgQ29tbSBQb3J0LiI7CisgICAgY2FzZSBORVJSX1VQU1NpZ25hbEFzc2VydGVkOgorICAgICAgcmV0dXJuICJUaGUgVVBTIGluZGljYXRlZCBhIGxpbmUgZmFpbCBvciBsb3cgYmF0dGVyeSBzaXR1YXRpb24uIFNlcnZpY2Ugbm90IHN0YXJ0ZWQuIjsKKyAgICBjYXNlIE5FUlJfVVBTU2h1dGRvd25GYWlsZWQ6CisgICAgICByZXR1cm4gIlRoZSBVUFMgc2VydmljZSBmYWlsZWQgdG8gcGVyZm9ybSBhIHN5c3RlbSBzaHV0IGRvd24uIjsKKyAgICBjYXNlIE5FUlJfQmFkRG9zUmV0Q29kZToKKyAgICAgIHJldHVybiAiVGhlIHByb2dyYW0gYmVsb3cgcmV0dXJuZWQgYW4gTVMtRE9TIGVycm9yIGNvZGU6IjsKKyAgICBjYXNlIE5FUlJfUHJvZ05lZWRzRXh0cmFNZW06CisgICAgICByZXR1cm4gIlRoZSBwcm9ncmFtIGJlbG93IG5lZWRzIG1vcmUgbWVtb3J5OiI7CisgICAgY2FzZSBORVJSX0JhZERvc0Z1bmN0aW9uOgorICAgICAgcmV0dXJuICJUaGUgcHJvZ3JhbSBiZWxvdyBjYWxsZWQgYW4gdW5zdXBwb3J0ZWQgTVMtRE9TIGZ1bmN0aW9uOiI7CisgICAgY2FzZSBORVJSX1JlbW90ZUJvb3RGYWlsZWQ6CisgICAgICByZXR1cm4gIlRoZSB3b3Jrc3RhdGlvbiBmYWlsZWQgdG8gYm9vdC4iOworICAgIGNhc2UgTkVSUl9CYWRGaWxlQ2hlY2tTdW06CisgICAgICByZXR1cm4gIlRoZSBmaWxlIGJlbG93IGlzIGNvcnJ1cHQuIjsKKyAgICBjYXNlIE5FUlJfTm9ScGxCb290U3lzdGVtOgorICAgICAgcmV0dXJuICJObyBsb2FkZXIgaXMgc3BlY2lmaWVkIGluIHRoZSBib290LWJsb2NrIGRlZmluaXRpb24gZmlsZS4iOworICAgIGNhc2UgTkVSUl9ScGxMb2Fkck5ldEJpb3NFcnI6CisgICAgICByZXR1cm4gIk5ldEJJT1MgcmV0dXJuZWQgYW4gZXJyb3I6ICAgICAgVGhlIE5DQiBhbmQgU01CIGFyZSBkdW1wZWQgYWJvdmUuIjsKKyAgICBjYXNlIE5FUlJfUnBsTG9hZHJEaXNrRXJyOgorICAgICAgcmV0dXJuICJBIGRpc2sgSS9PIGVycm9yIG9jY3VycmVkLiI7CisgICAgY2FzZSBORVJSX0ltYWdlUGFyYW1FcnI6CisgICAgICByZXR1cm4gIkltYWdlIHBhcmFtZXRlciBzdWJzdGl0dXRpb24gZmFpbGVkLiI7CisgICAgY2FzZSBORVJSX1Rvb01hbnlJbWFnZVBhcmFtczoKKyAgICAgIHJldHVybiAiVG9vIG1hbnkgaW1hZ2UgcGFyYW1ldGVycyBjcm9zcyBkaXNrIHNlY3RvciBib3VuZGFyaWVzLiI7CisgICAgY2FzZSBORVJSX05vbkRvc0Zsb3BweVVzZWQ6CisgICAgICByZXR1cm4gIlRoZSBpbWFnZSB3YXMgbm90IGdlbmVyYXRlZCBmcm9tIGFuIE1TLURPUyBkaXNrZXR0ZSBmb3JtYXR0ZWQgd2l0aCAvUy4iOworICAgIGNhc2UgTkVSUl9ScGxCb290UmVzdGFydDoKKyAgICAgIHJldHVybiAiUmVtb3RlIGJvb3Qgd2lsbCBiZSByZXN0YXJ0ZWQgbGF0ZXIuIjsKKyAgICBjYXNlIE5FUlJfUnBsU3J2ckNhbGxGYWlsZWQ6CisgICAgICByZXR1cm4gIlRoZSBjYWxsIHRvIHRoZSBSZW1vdGVib290IHNlcnZlciBmYWlsZWQuIjsKKyAgICBjYXNlIE5FUlJfQ2FudENvbm5lY3RScGxTcnZyOgorICAgICAgcmV0dXJuICJDYW5ub3QgY29ubmVjdCB0byB0aGUgUmVtb3RlYm9vdCBzZXJ2ZXIuIjsKKyAgICBjYXNlIE5FUlJfQ2FudE9wZW5JbWFnZUZpbGU6CisgICAgICByZXR1cm4gIkNhbm5vdCBvcGVuIGltYWdlIGZpbGUgb24gdGhlIFJlbW90ZWJvb3Qgc2VydmVyLiI7CisgICAgY2FzZSBORVJSX0NhbGxpbmdScGxTcnZyOgorICAgICAgcmV0dXJuICJDb25uZWN0aW5nIHRvIHRoZSBSZW1vdGVib290IHNlcnZlci4uLiI7CisgICAgY2FzZSBORVJSX1N0YXJ0aW5nUnBsQm9vdDoKKyAgICAgIHJldHVybiAiQ29ubmVjdGluZyB0byB0aGUgUmVtb3RlYm9vdCBzZXJ2ZXIuLi4iOworICAgIGNhc2UgTkVSUl9ScGxCb290U2VydmljZVRlcm06CisgICAgICByZXR1cm4gIlJlbW90ZSBib290IHNlcnZpY2Ugd2FzIHN0b3BwZWQ7IGNoZWNrIHRoZSBlcnJvciBsb2cgZm9yIHRoZSBjYXVzZSBvZiB0aGUgcHJvYmxlbS4iOworICAgIGNhc2UgTkVSUl9ScGxCb290U3RhcnRGYWlsZWQ6CisgICAgICByZXR1cm4gIlJlbW90ZSBib290IHN0YXJ0dXAgZmFpbGVkOyBjaGVjayB0aGUgZXJyb3IgbG9nIGZvciB0aGUgY2F1c2Ugb2YgdGhlIHByb2JsZW0uIjsKKyAgICBjYXNlIE5FUlJfUlBMX0NPTk5FQ1RFRDoKKyAgICAgIHJldHVybiAiQSBzZWNvbmQgY29ubmVjdGlvbiB0byBhIFJlbW90ZWJvb3QgcmVzb3VyY2UgaXMgbm90IGFsbG93ZWQuIjsKKyAgICBjYXNlIE5FUlJfQnJvd3NlckNvbmZpZ3VyZWRUb05vdFJ1bjoKKyAgICAgIHJldHVybiAiVGhlIGJyb3dzZXIgc2VydmljZSB3YXMgY29uZmlndXJlZCB3aXRoIE1haW50YWluU2VydmVyTGlzdD1Oby4iOworICAgIGNhc2UgTkVSUl9ScGxOb0FkYXB0ZXJzU3RhcnRlZDoKKyAgICAgIHJldHVybiAiU2VydmljZSBmYWlsZWQgdG8gc3RhcnQgc2luY2Ugbm9uZSBvZiB0aGUgbmV0d29yayBhZGFwdGVycyBzdGFydGVkIHdpdGggdGhpcyBzZXJ2aWNlLiI7CisgICAgY2FzZSBORVJSX1JwbEJhZFJlZ2lzdHJ5OgorICAgICAgcmV0dXJuICJTZXJ2aWNlIGZhaWxlZCB0byBzdGFydCBkdWUgdG8gYmFkIHN0YXJ0dXAgaW5mb3JtYXRpb24gaW4gdGhlIHJlZ2lzdHJ5LiI7CisgICAgY2FzZSBORVJSX1JwbEJhZERhdGFiYXNlOgorICAgICAgcmV0dXJuICJTZXJ2aWNlIGZhaWxlZCB0byBzdGFydCBiZWNhdXNlIGl0cyBkYXRhYmFzZSBpcyBhYnNlbnQgb3IgY29ycnVwdC4iOworICAgIGNhc2UgTkVSUl9ScGxScGxmaWxlc1NoYXJlOgorICAgICAgcmV0dXJuICJTZXJ2aWNlIGZhaWxlZCB0byBzdGFydCBiZWNhdXNlIFJQTEZJTEVTIHNoYXJlIGlzIGFic2VudC4iOworICAgIGNhc2UgTkVSUl9ScGxOb3RScGxTZXJ2ZXI6CisgICAgICByZXR1cm4gIlNlcnZpY2UgZmFpbGVkIHRvIHN0YXJ0IGJlY2F1c2UgUlBMVVNFUiBncm91cCBpcyBhYnNlbnQuIjsKKyAgICBjYXNlIE5FUlJfUnBsQ2Fubm90RW51bToKKyAgICAgIHJldHVybiAiQ2Fubm90IGVudW1lcmF0ZSBzZXJ2aWNlIHJlY29yZHMuIjsKKyAgICBjYXNlIE5FUlJfUnBsV2tzdGFJbmZvQ29ycnVwdGVkOgorICAgICAgcmV0dXJuICJXb3Jrc3RhdGlvbiByZWNvcmQgaW5mb3JtYXRpb24gaGFzIGJlZW4gY29ycnVwdGVkLiI7CisgICAgY2FzZSBORVJSX1JwbFdrc3RhTm90Rm91bmQ6CisgICAgICByZXR1cm4gIldvcmtzdGF0aW9uIHJlY29yZCB3YXMgbm90IGZvdW5kLiI7CisgICAgY2FzZSBORVJSX1JwbFdrc3RhTmFtZVVuYXZhaWxhYmxlOgorICAgICAgcmV0dXJuICJXb3Jrc3RhdGlvbiBuYW1lIGlzIGluIHVzZSBieSBzb21lIG90aGVyIHdvcmtzdGF0aW9uLiI7CisgICAgY2FzZSBORVJSX1JwbFByb2ZpbGVJbmZvQ29ycnVwdGVkOgorICAgICAgcmV0dXJuICJQcm9maWxlIHJlY29yZCBpbmZvcm1hdGlvbiBoYXMgYmVlbiBjb3JydXB0ZWQuIjsKKyAgICBjYXNlIE5FUlJfUnBsUHJvZmlsZU5vdEZvdW5kOgorICAgICAgcmV0dXJuICJQcm9maWxlIHJlY29yZCB3YXMgbm90IGZvdW5kLiI7CisgICAgY2FzZSBORVJSX1JwbFByb2ZpbGVOYW1lVW5hdmFpbGFibGU6CisgICAgICByZXR1cm4gIlByb2ZpbGUgbmFtZSBpcyBpbiB1c2UgYnkgc29tZSBvdGhlciBwcm9maWxlLiI7CisgICAgY2FzZSBORVJSX1JwbFByb2ZpbGVOb3RFbXB0eToKKyAgICAgIHJldHVybiAiVGhlcmUgYXJlIHdvcmtzdGF0aW9ucyB1c2luZyB0aGlzIHByb2ZpbGUuIjsKKyAgICBjYXNlIE5FUlJfUnBsQ29uZmlnSW5mb0NvcnJ1cHRlZDoKKyAgICAgIHJldHVybiAiQ29uZmlndXJhdGlvbiByZWNvcmQgaW5mb3JtYXRpb24gaGFzIGJlZW4gY29ycnVwdGVkLiI7CisgICAgY2FzZSBORVJSX1JwbENvbmZpZ05vdEZvdW5kOgorICAgICAgcmV0dXJuICJDb25maWd1cmF0aW9uIHJlY29yZCB3YXMgbm90IGZvdW5kLiI7CisgICAgY2FzZSBORVJSX1JwbEFkYXB0ZXJJbmZvQ29ycnVwdGVkOgorICAgICAgcmV0dXJuICJBZGFwdGVyIElEIHJlY29yZCBpbmZvcm1hdGlvbiBoYXMgYmVlbiBjb3JydXB0ZWQuIjsKKyAgICBjYXNlIE5FUlJfUnBsSW50ZXJuYWw6CisgICAgICByZXR1cm4gIkFuIGludGVybmFsIHNlcnZpY2UgZXJyb3IgaGFzIG9jY3VycmVkLiI7CisgICAgY2FzZSBORVJSX1JwbFZlbmRvckluZm9Db3JydXB0ZWQ6CisgICAgICByZXR1cm4gIlZlbmRvciBJRCByZWNvcmQgaW5mb3JtYXRpb24gaGFzIGJlZW4gY29ycnVwdGVkLiI7CisgICAgY2FzZSBORVJSX1JwbEJvb3RJbmZvQ29ycnVwdGVkOgorICAgICAgcmV0dXJuICJCb290IGJsb2NrIHJlY29yZCBpbmZvcm1hdGlvbiBoYXMgYmVlbiBjb3JydXB0ZWQuIjsKKyAgICBjYXNlIE5FUlJfUnBsV2tzdGFOZWVkc1VzZXJBY2N0OgorICAgICAgcmV0dXJuICJUaGUgdXNlciBhY2NvdW50IGZvciB0aGlzIHdvcmtzdGF0aW9uIHJlY29yZCBpcyBtaXNzaW5nLiI7CisgICAgY2FzZSBORVJSX1JwbE5lZWRzUlBMVVNFUkFjY3Q6CisgICAgICByZXR1cm4gIlRoZSBSUExVU0VSIGxvY2FsIGdyb3VwIGNvdWxkIG5vdCBiZSBmb3VuZC4iOworICAgIGNhc2UgTkVSUl9ScGxCb290Tm90Rm91bmQ6CisgICAgICByZXR1cm4gIkJvb3QgYmxvY2sgcmVjb3JkIHdhcyBub3QgZm91bmQuIjsKKyAgICBjYXNlIE5FUlJfUnBsSW5jb21wYXRpYmxlUHJvZmlsZToKKyAgICAgIHJldHVybiAiQ2hvc2VuIHByb2ZpbGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhpcyB3b3Jrc3RhdGlvbi4iOworICAgIGNhc2UgTkVSUl9ScGxBZGFwdGVyTmFtZVVuYXZhaWxhYmxlOgorICAgICAgcmV0dXJuICJDaG9zZW4gbmV0d29yayBhZGFwdGVyIElEIGlzIGluIHVzZSBieSBzb21lIG90aGVyIHdvcmtzdGF0aW9uLiI7CisgICAgY2FzZSBORVJSX1JwbENvbmZpZ05vdEVtcHR5OgorICAgICAgcmV0dXJuICJUaGVyZSBhcmUgcHJvZmlsZXMgdXNpbmcgdGhpcyBjb25maWd1cmF0aW9uLiI7CisgICAgY2FzZSBORVJSX1JwbEJvb3RJblVzZToKKyAgICAgIHJldHVybiAiVGhlcmUgYXJlIHdvcmtzdGF0aW9ucywgcHJvZmlsZXMsIG9yIGNvbmZpZ3VyYXRpb25zIHVzaW5nIHRoaXMgYm9vdCBibG9jay4iOworICAgIGNhc2UgTkVSUl9ScGxCYWNrdXBEYXRhYmFzZToKKyAgICAgIHJldHVybiAiU2VydmljZSBmYWlsZWQgdG8gYmFja3VwIFJlbW90ZWJvb3QgZGF0YWJhc2UuIjsKKyAgICBjYXNlIE5FUlJfUnBsQWRhcHRlck5vdEZvdW5kOgorICAgICAgcmV0dXJuICJBZGFwdGVyIHJlY29yZCB3YXMgbm90IGZvdW5kLiI7CisgICAgY2FzZSBORVJSX1JwbFZlbmRvck5vdEZvdW5kOgorICAgICAgcmV0dXJuICJWZW5kb3IgcmVjb3JkIHdhcyBub3QgZm91bmQuIjsKKyAgICBjYXNlIE5FUlJfUnBsVmVuZG9yTmFtZVVuYXZhaWxhYmxlOgorICAgICAgcmV0dXJuICJWZW5kb3IgbmFtZSBpcyBpbiB1c2UgYnkgc29tZSBvdGhlciB2ZW5kb3IgcmVjb3JkLiI7CisgICAgY2FzZSBORVJSX1JwbEJvb3ROYW1lVW5hdmFpbGFibGU6CisgICAgICByZXR1cm4gIihib290IG5hbWUsIHZlbmRvciBJRCkgaXMgaW4gdXNlIGJ5IHNvbWUgb3RoZXIgYm9vdCBibG9jayByZWNvcmQuIjsKKyAgICBjYXNlIE5FUlJfUnBsQ29uZmlnTmFtZVVuYXZhaWxhYmxlOgorICAgICAgcmV0dXJuICJDb25maWd1cmF0aW9uIG5hbWUgaXMgaW4gdXNlIGJ5IHNvbWUgb3RoZXIgY29uZmlndXJhdGlvbi4iOworICAgIGNhc2UgTkVSUl9EZnNJbnRlcm5hbENvcnJ1cHRpb246CisgICAgICByZXR1cm4gIlRoZSBpbnRlcm5hbCBkYXRhYmFzZSBtYWludGFpbmVkIGJ5IHRoZSBEZnMgc2VydmljZSBpcyBjb3JydXB0LiI7CisgICAgY2FzZSBORVJSX0Rmc1ZvbHVtZURhdGFDb3JydXB0OgorICAgICAgcmV0dXJuICJPbmUgb2YgdGhlIHJlY29yZHMgaW4gdGhlIGludGVybmFsIERmcyBkYXRhYmFzZSBpcyBjb3JydXB0LiI7CisgICAgY2FzZSBORVJSX0Rmc05vU3VjaFZvbHVtZToKKyAgICAgIHJldHVybiAiVGhlcmUgaXMgbm8gREZTIG5hbWUgd2hvc2UgZW50cnkgcGF0aCBtYXRjaGVzIHRoZSBpbnB1dCBFbnRyeSBQYXRoLiI7CisgICAgY2FzZSBORVJSX0Rmc1ZvbHVtZUFscmVhZHlFeGlzdHM6CisgICAgICByZXR1cm4gIkEgcm9vdCBvciBsaW5rIHdpdGggdGhlIGdpdmVuIG5hbWUgYWxyZWFkeSBleGlzdHMuIjsKKyAgICBjYXNlIE5FUlJfRGZzQWxyZWFkeVNoYXJlZDoKKyAgICAgIHJldHVybiAiVGhlIHNlcnZlciBzaGFyZSBzcGVjaWZpZWQgaXMgYWxyZWFkeSBzaGFyZWQgaW4gdGhlIERmcy4iOworICAgIGNhc2UgTkVSUl9EZnNOb1N1Y2hTaGFyZToKKyAgICAgIHJldHVybiAiVGhlIGluZGljYXRlZCBzZXJ2ZXIgc2hhcmUgZG9lcyBub3Qgc3VwcG9ydCB0aGUgaW5kaWNhdGVkIERGUyBuYW1lc3BhY2UuIjsKKyAgICBjYXNlIE5FUlJfRGZzTm90QUxlYWZWb2x1bWU6CisgICAgICByZXR1cm4gIlRoZSBvcGVyYXRpb24gaXMgbm90IHZhbGlkIG9uIHRoaXMgcG9ydGlvbiBvZiB0aGUgbmFtZXNwYWNlLiI7CisgICAgY2FzZSBORVJSX0Rmc0xlYWZWb2x1bWU6CisgICAgICByZXR1cm4gIlRoZSBvcGVyYXRpb24gaXMgbm90IHZhbGlkIG9uIHRoaXMgcG9ydGlvbiBvZiB0aGUgbmFtZXNwYWNlLiI7CisgICAgY2FzZSBORVJSX0Rmc1ZvbHVtZUhhc011bHRpcGxlU2VydmVyczoKKyAgICAgIHJldHVybiAiVGhlIG9wZXJhdGlvbiBpcyBhbWJpZ3VvdXMgYmVjYXVzZSB0aGUgbGluayBoYXMgbXVsdGlwbGUgc2VydmVycy4iOworICAgIGNhc2UgTkVSUl9EZnNDYW50Q3JlYXRlSnVuY3Rpb25Qb2ludDoKKyAgICAgIHJldHVybiAiVW5hYmxlIHRvIGNyZWF0ZSBhIGxpbmsuIjsKKyAgICBjYXNlIE5FUlJfRGZzU2VydmVyTm90RGZzQXdhcmU6CisgICAgICByZXR1cm4gIlRoZSBzZXJ2ZXIgaXMgbm90IERmcyBBd2FyZS4iOworICAgIGNhc2UgTkVSUl9EZnNCYWRSZW5hbWVQYXRoOgorICAgICAgcmV0dXJuICJUaGUgc3BlY2lmaWVkIHJlbmFtZSB0YXJnZXQgcGF0aCBpcyBpbnZhbGlkLiI7CisgICAgY2FzZSBORVJSX0Rmc1ZvbHVtZUlzT2ZmbGluZToKKyAgICAgIHJldHVybiAiVGhlIHNwZWNpZmllZCBERlMgbGluayBpcyBvZmZsaW5lLiI7CisgICAgY2FzZSBORVJSX0Rmc05vU3VjaFNlcnZlcjoKKyAgICAgIHJldHVybiAiVGhlIHNwZWNpZmllZCBzZXJ2ZXIgaXMgbm90IGEgc2VydmVyIGZvciB0aGlzIGxpbmsuIjsKKyAgICBjYXNlIE5FUlJfRGZzQ3ljbGljYWxOYW1lOgorICAgICAgcmV0dXJuICJBIGN5Y2xlIGluIHRoZSBEZnMgbmFtZSB3YXMgZGV0ZWN0ZWQuIjsKKyAgICBjYXNlIE5FUlJfRGZzTm90U3VwcG9ydGVkSW5TZXJ2ZXJEZnM6CisgICAgICByZXR1cm4gIlRoZSBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBvbiBhIHNlcnZlci1iYXNlZCBEZnMuIjsKKyAgICBjYXNlIE5FUlJfRGZzRHVwbGljYXRlU2VydmljZToKKyAgICAgIHJldHVybiAiVGhpcyBsaW5rIGlzIGFscmVhZHkgc3VwcG9ydGVkIGJ5IHRoZSBzcGVjaWZpZWQgc2VydmVyLXNoYXJlLiI7CisgICAgY2FzZSBORVJSX0Rmc0NhbnRSZW1vdmVMYXN0U2VydmVyU2hhcmU6CisgICAgICByZXR1cm4gIkNhbid0IHJlbW92ZSB0aGUgbGFzdCBzZXJ2ZXItc2hhcmUgc3VwcG9ydGluZyB0aGlzIHJvb3Qgb3IgbGluay4iOworICAgIGNhc2UgTkVSUl9EZnNWb2x1bWVJc0ludGVyRGZzOgorICAgICAgcmV0dXJuICJUaGUgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGFuIEludGVyLURGUyBsaW5rLiI7CisgICAgY2FzZSBORVJSX0Rmc0luY29uc2lzdGVudDoKKyAgICAgIHJldHVybiAiVGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBEZnMgU2VydmljZSBoYXMgYmVjb21lIGluY29uc2lzdGVudC4iOworICAgIGNhc2UgTkVSUl9EZnNTZXJ2ZXJVcGdyYWRlZDoKKyAgICAgIHJldHVybiAiVGhlIERmcyBTZXJ2aWNlIGhhcyBiZWVuIGluc3RhbGxlZCBvbiB0aGUgc3BlY2lmaWVkIHNlcnZlci4iOworICAgIGNhc2UgTkVSUl9EZnNEYXRhSXNJZGVudGljYWw6CisgICAgICByZXR1cm4gIlRoZSBEZnMgZGF0YSBiZWluZyByZWNvbmNpbGVkIGlzIGlkZW50aWNhbC4iOworICAgIGNhc2UgTkVSUl9EZnNDYW50UmVtb3ZlRGZzUm9vdDoKKyAgICAgIHJldHVybiAiVGhlIERGUyByb290IGNhbm5vdCBiZSBkZWxldGVkLiBVbmluc3RhbGwgREZTIGlmIHJlcXVpcmVkLiI7CisgICAgY2FzZSBORVJSX0Rmc0NoaWxkT3JQYXJlbnRJbkRmczoKKyAgICAgIHJldHVybiAiQSBjaGlsZCBvciBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBzaGFyZSBpcyBhbHJlYWR5IGluIGEgRGZzLiI7CisgICAgY2FzZSBORVJSX0Rmc0ludGVybmFsRXJyb3I6CisgICAgICByZXR1cm4gIkRmcyBpbnRlcm5hbCBlcnJvci4iOworICAgICAgLyogdGhlIGZvbGxvd2luZyBhcmUgbm90IGRlZmluZWQgaW4gbWluZ3cgKi8KKyNpZiAwCisKKyAgICBjYXNlIE5FUlJfU2V0dXBBbHJlYWR5Sm9pbmVkOgorICAgICAgcmV0dXJuICJUaGlzIG1hY2hpbmUgaXMgYWxyZWFkeSBqb2luZWQgdG8gYSBkb21haW4uIjsKKyAgICBjYXNlIE5FUlJfU2V0dXBOb3RKb2luZWQ6CisgICAgICByZXR1cm4gIlRoaXMgbWFjaGluZSBpcyBub3QgY3VycmVudGx5IGpvaW5lZCB0byBhIGRvbWFpbi4iOworICAgIGNhc2UgTkVSUl9TZXR1cERvbWFpbkNvbnRyb2xsZXI6CisgICAgICByZXR1cm4gIlRoaXMgbWFjaGluZSBpcyBhIGRvbWFpbiBjb250cm9sbGVyIGFuZCBjYW5ub3QgYmUgdW5qb2luZWQgZnJvbSBhIGRvbWFpbi4iOworICAgIGNhc2UgTkVSUl9EZWZhdWx0Sm9pblJlcXVpcmVkOgorICAgICAgcmV0dXJuICJUaGUgZGVzdGluYXRpb24gZG9tYWluIGNvbnRyb2xsZXIgZG9lcyBub3Qgc3VwcG9ydCBjcmVhdGluZyBtYWNoaW5lIGFjY291bnRzIGluIE9Vcy4iOworICAgIGNhc2UgTkVSUl9JbnZhbGlkV29ya2dyb3VwTmFtZToKKyAgICAgIHJldHVybiAiVGhlIHNwZWNpZmllZCB3b3JrZ3JvdXAgbmFtZSBpcyBpbnZhbGlkLiI7CisgICAgY2FzZSBORVJSX05hbWVVc2VzSW5jb21wYXRpYmxlQ29kZVBhZ2U6CisgICAgICByZXR1cm4gIlRoZSBzcGVjaWZpZWQgY29tcHV0ZXIgbmFtZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgZGVmYXVsdCBsYW5ndWFnZSB1c2VkIG9uIHRoZSBkb21haW4gY29udHJvbGxlci4iOworICAgIGNhc2UgTkVSUl9Db21wdXRlckFjY291bnROb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIHNwZWNpZmllZCBjb21wdXRlciBhY2NvdW50IGNvdWxkIG5vdCBiZSBmb3VuZC4iOworICAgIGNhc2UgTkVSUl9QZXJzb25hbFNrdToKKyAgICAgIHJldHVybiAiVGhpcyB2ZXJzaW9uIG9mIFdpbmRvd3MgY2Fubm90IGJlIGpvaW5lZCB0byBhIGRvbWFpbi4iOworICAgIGNhc2UgTkVSUl9QYXNzd29yZE11c3RDaGFuZ2U6CisgICAgICByZXR1cm4gIlRoZSBwYXNzd29yZCBtdXN0IGNoYW5nZSBhdCB0aGUgbmV4dCBsb2dvbi4iOworICAgIGNhc2UgTkVSUl9BY2NvdW50TG9ja2VkT3V0OgorICAgICAgcmV0dXJuICJUaGUgYWNjb3VudCBpcyBsb2NrZWQgb3V0LiI7CisgICAgY2FzZSBORVJSX1Bhc3N3b3JkVG9vTG9uZzoKKyAgICAgIHJldHVybiAiVGhlIHBhc3N3b3JkIGlzIHRvbyBsb25nLiI7CisgICAgY2FzZSBORVJSX1Bhc3N3b3JkTm90Q29tcGxleEVub3VnaDoKKyAgICAgIHJldHVybiAiVGhlIHBhc3N3b3JkIGRvZXMgbm90IG1lZXQgdGhlIGNvbXBsZXhpdHkgcG9saWN5LiI7CisgICAgY2FzZSBORVJSX1Bhc3N3b3JkRmlsdGVyRXJyb3I6CisgICAgICByZXR1cm4gIlRoZSBwYXNzd29yZCBkb2VzIG5vdCBtZWV0IHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIHBhc3N3b3JkIGZpbHRlciBETExzLiI7CisjZW5kaWYKKworICAgIH0KKyAgbXNnID0gc3RyZXJyb3IgKGVycm9yX251bWJlcik7CisgIGlmIChtc2cgPT0gTlVMTCkKKyAgICBtc2cgPSAidW5rbm93biI7CisKKyAgcmV0dXJuIG1zZzsKKyNlbmRpZiAvL0RCVVNfV0lOQ0UKK30KKworLyoqCisgKiBHZXQgYSBwcmludGFibGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGNvbW1hbmQgdXNlZCB0byBleGVjdXRlCisgKiB0aGUgcHJvY2VzcyB3aXRoIHBpZC4gIFRoaXMgc3RyaW5nIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yCisgKiBpbmZvcm1hdGl2ZSBwdXJwb3NlcyBzdWNoIGFzIGxvZ2dpbmc7IGl0IG1heSBub3QgYmUgdHJ1c3RlZC4KKyAqCisgKiBUaGUgY29tbWFuZCBpcyBndWFyYW50ZWVkIHRvIGJlIHByaW50YWJsZSBBU0NJSSBhbmQgbm8gbG9uZ2VyCisgKiB0aGFuIG1heF9sZW4uCisgKgorICogQHBhcmFtIHBpZCBQcm9jZXNzIGlkCisgKiBAcGFyYW0gc3RyIEFwcGVuZCBjb21tYW5kIHRvIHRoaXMgc3RyaW5nCisgKiBAcGFyYW0gbWF4X2xlbiBNYXhpbXVtIGxlbmd0aCBvZiByZXR1cm5lZCBjb21tYW5kCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvcnMKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBlcnJvcgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY29tbWFuZF9mb3JfcGlkICh1bnNpZ25lZCBsb25nICBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgbWF4X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAqZXJyb3IpCit7CisgIC8vIEZJWE1FCisgIHJldHVybiBGQUxTRTsKK30KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC5jIGIvZGJ1cy9kYnVzL2RidXMtc3lzZGVwcy11dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIzZDE2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC5jCkBAIC0wLDAgKzEsMTk5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3lzZGVwcy11dGlsLmMgVGVzdHMgZm9yIGRidXMtc3lzZGVwcy5oIEFQSQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpZmRlZiBEQlVTX1dJTgorICAvKiBkbyBub3RoaW5nLCBpdCdzIGluIHN0ZGxpYi5oICovCisjZWxpZiAoZGVmaW5lZCBfX0FQUExFX18pCisjIGluY2x1ZGUgPGNydF9leHRlcm5zLmg+CisjIGRlZmluZSBlbnZpcm9uICgqX05TR2V0RW52aXJvbigpKQorI2Vsc2UKK2V4dGVybiBjaGFyICoqZW52aXJvbjsKKyNlbmRpZgorCisvKioKKyAqIEdldHMgYSAjTlVMTC10ZXJtaW5hdGVkIGxpc3Qgb2Yga2V5PXZhbHVlIHBhaXJzIGZyb20gdGhlCisgKiBlbnZpcm9ubWVudC4gVXNlIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgdG8gZnJlZSBpdC4KKyAqCisgKiBAcmV0dXJucyB0aGUgZW52aXJvbm1lbnQgb3IgI05VTEwgb24gT09NCisgKi8KK2NoYXIgKioKK19kYnVzX2dldF9lbnZpcm9ubWVudCAodm9pZCkKK3sKKyAgaW50IGksIGxlbmd0aDsKKyAgY2hhciAqKmVudmlyb25tZW50OworCisgIF9kYnVzX2Fzc2VydCAoZW52aXJvbiAhPSBOVUxMKTsKKworICBmb3IgKGxlbmd0aCA9IDA7IGVudmlyb25bbGVuZ3RoXSAhPSBOVUxMOyBsZW5ndGgrKyk7CisKKyAgLyogQWRkIG9uZSBmb3IgTlVMTCAqLworICBsZW5ndGgrKzsKKworICBlbnZpcm9ubWVudCA9IGRidXNfbmV3MCAoY2hhciAqLCBsZW5ndGgpOworCisgIGlmIChlbnZpcm9ubWVudCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGZvciAoaSA9IDA7IGVudmlyb25baV0gIT0gTlVMTDsgaSsrKQorICAgIHsKKyAgICAgIGVudmlyb25tZW50W2ldID0gX2RidXNfc3RyZHVwIChlbnZpcm9uW2ldKTsKKworICAgICAgaWYgKGVudmlyb25tZW50W2ldID09IE5VTEwpCisgICAgICAgIGJyZWFrOworICAgIH0KKworICBpZiAoZW52aXJvbltpXSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGVudmlyb25tZW50KTsKKyAgICAgIGVudmlyb25tZW50ID0gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIGVudmlyb25tZW50OworfQorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworc3RhdGljIHZvaWQKK2NoZWNrX2Rpcm5hbWUgKGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGlybmFtZSkKK3sKKyAgREJ1c1N0cmluZyBmLCBkOworICAKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZmLCBmaWxlbmFtZSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmQpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2dldF9kaXJuYW1lICgmZiwgJmQpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmZCwgZGlybmFtZSkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkZvciBmaWxlbmFtZSBcIiVzXCIgZ290IGRpcm5hbWUgXCIlc1wiIGFuZCBleHBlY3RlZCBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmQpLAorICAgICAgICAgICAgICAgICAgZGlybmFtZSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX3BhdGhfYWJzb2x1dGUgKGNvbnN0IGNoYXIgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCBleHBlY3RlZCkKK3sKKyAgREJ1c1N0cmluZyBwOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmcCwgcGF0aCk7CisKKyAgaWYgKF9kYnVzX3BhdGhfaXNfYWJzb2x1dGUgKCZwKSAhPSBleHBlY3RlZCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRm9yIHBhdGggXCIlc1wiIGV4cGVjdGVkIGFic29sdXRlID0gJWQgZ290ICVkXG4iLAorICAgICAgICAgICAgICAgICAgcGF0aCwgZXhwZWN0ZWQsIF9kYnVzX3BhdGhfaXNfYWJzb2x1dGUgKCZwKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9Cit9CisKKy8qKgorICogVW5pdCB0ZXN0IGZvciBkYnVzLXN5c2RlcHMuYy4KKyAqIAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N5c2RlcHNfdGVzdCAodm9pZCkKK3sKKyNpZmRlZiBEQlVTX1dJTgorICBjaGVja19kaXJuYW1lICgiZm9vXFxiYXIiLCAiZm9vIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJmb29cXFxcYmFyIiwgImZvbyIpOworICBjaGVja19kaXJuYW1lICgiZm9vL1xcL2JhciIsICJmb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoImZvb1xcYmFyLyIsICJmb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoImZvby8vYmFyXFwiLCAiZm9vIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJmb29cXGJhci8iLCAiZm9vIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJmb28vYmFyXFxcXCIsICJmb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoIlxcZm9vIiwgIlxcIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJcXFxcZm9vIiwgIlxcIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJcXCIsICJcXCIpOworICBjaGVja19kaXJuYW1lICgiXFxcXCIsICJcXCIpOworICBjaGVja19kaXJuYW1lICgiXFwvIiwgIlxcIik7CisgIGNoZWNrX2Rpcm5hbWUgKCIvXFwvIiwgIi8iKTsKKyAgY2hlY2tfZGlybmFtZSAoImM6XFxmb29cXGJhciIsICJjOlxcZm9vIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJjOlxcZm9vIiwgImM6XFwiKTsKKyAgY2hlY2tfZGlybmFtZSAoImM6L2ZvbyIsICJjOi8iKTsKKyAgY2hlY2tfZGlybmFtZSAoImM6XFwiLCAiYzpcXCIpOworICBjaGVja19kaXJuYW1lICgiYzovIiwgImM6LyIpOworICBjaGVja19kaXJuYW1lICgiIiwgIi4iKTsgIAorI2Vsc2UgIAorICBjaGVja19kaXJuYW1lICgiZm9vIiwgIi4iKTsKKyAgY2hlY2tfZGlybmFtZSAoImZvby9iYXIiLCAiZm9vIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJmb28vL2JhciIsICJmb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoImZvby8vL2JhciIsICJmb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoImZvby9iYXIvIiwgImZvbyIpOworICBjaGVja19kaXJuYW1lICgiZm9vLy9iYXIvIiwgImZvbyIpOworICBjaGVja19kaXJuYW1lICgiZm9vLy8vYmFyLyIsICJmb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoImZvby9iYXIvLyIsICJmb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoImZvby8vYmFyLy8vLyIsICJmb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoImZvby8vL2Jhci8vLy8vLy8iLCAiZm9vIik7CisgIGNoZWNrX2Rpcm5hbWUgKCIvZm9vIiwgIi8iKTsKKyAgY2hlY2tfZGlybmFtZSAoIi8vLy9mb28iLCAiLyIpOworICBjaGVja19kaXJuYW1lICgiL2Zvby9iYXIiLCAiL2ZvbyIpOworICBjaGVja19kaXJuYW1lICgiL2Zvby8vYmFyIiwgIi9mb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoIi9mb28vLy9iYXIiLCAiL2ZvbyIpOworICBjaGVja19kaXJuYW1lICgiLyIsICIvIik7CisgIGNoZWNrX2Rpcm5hbWUgKCIvLy8iLCAiLyIpOworICBjaGVja19kaXJuYW1lICgiIiwgIi4iKTsgIAorI2VuZGlmCisKKyNpZmRlZiBEQlVTX1dJTgorICBjaGVja19wYXRoX2Fic29sdXRlICgiYzovIiwgVFJVRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCJjOi9mb28iLCBUUlVFKTsKKyAgY2hlY2tfcGF0aF9hYnNvbHV0ZSAoIiIsIEZBTFNFKTsKKyAgY2hlY2tfcGF0aF9hYnNvbHV0ZSAoImZvbyIsIEZBTFNFKTsKKyAgY2hlY2tfcGF0aF9hYnNvbHV0ZSAoImZvby9iYXIiLCBGQUxTRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCIiLCBGQUxTRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCJmb29cXGJhciIsIEZBTFNFKTsKKyAgY2hlY2tfcGF0aF9hYnNvbHV0ZSAoImM6XFwiLCBUUlVFKTsKKyAgY2hlY2tfcGF0aF9hYnNvbHV0ZSAoImM6XFxmb28iLCBUUlVFKTsKKyAgY2hlY2tfcGF0aF9hYnNvbHV0ZSAoImM6IiwgVFJVRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCJjOlxcZm9vXFxiYXIiLCBUUlVFKTsKKyAgY2hlY2tfcGF0aF9hYnNvbHV0ZSAoIlxcIiwgVFJVRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCIvIiwgVFJVRSk7CisjZWxzZSAgCisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCIvIiwgVFJVRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCIvZm9vIiwgVFJVRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCIiLCBGQUxTRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCJmb28iLCBGQUxTRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCJmb28vYmFyIiwgRkFMU0UpOworI2VuZGlmCisgIAorICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1zeXNkZXBzLXdpbi5jIGIvZGJ1cy9kYnVzL2RidXMtc3lzZGVwcy13aW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzQ5NTFiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtc3lzZGVwcy13aW4uYwpAQCAtMCwwICsxLDM2NDMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zeXNkZXBzLmMgV3JhcHBlcnMgYXJvdW5kIHN5c3RlbS9saWJjIGZlYXR1cmVzIChpbnRlcm5hbCB0byBELUJVUyBpbXBsZW1lbnRhdGlvbikKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqIENvcHlyaWdodCAoQykgMjAwNSBOb3ZlbGwsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBQZXRlciBLw7xtbWVsICA8c3ludGhldGljcHBAZ214Lm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBDaHJpc3RpYW4gRWhybGljaGVyIDxjaC5laHJsaWNoZXJAZ214LmRlPgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTAgUmFsZiBIYWJhY2tlciA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNkZWZpbmUgU1RSU0FGRV9OT19ERVBSRUNBVEUKKworI2lmbmRlZiBEQlVTX1dJTkNFCisjaWZuZGVmIF9XSU4zMl9XSU5OVAorI2RlZmluZSBfV0lOMzJfV0lOTlQgMHgwNTAxCisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXNoYS5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorI2luY2x1ZGUgImRidXMtdGhyZWFkcy5oIgorI2luY2x1ZGUgImRidXMtcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy13aW4uaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSAiZGJ1cy1oYXNoLmgiCisjaW5jbHVkZSAiZGJ1cy1zb2NrZXRzLXdpbi5oIgorI2luY2x1ZGUgImRidXMtbGlzdC5oIgorI2luY2x1ZGUgImRidXMtbm9uY2UuaCIKKyNpbmNsdWRlICJkYnVzLWNyZWRlbnRpYWxzLmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8d3MydGNwaXAuaD4KKyNpbmNsdWRlIDx3aW5jcnlwdC5oPgorCisvKiBEZWNsYXJhdGlvbnMgbWlzc2luZyBpbiBtaW5ndydzIGhlYWRlcnMgKi8KK2V4dGVybiBCT09MIFdJTkFQSSBDb252ZXJ0U3RyaW5nU2lkVG9TaWRBIChMUENTVFIgIFN0cmluZ1NpZCwgUFNJRCAqU2lkKTsKK2V4dGVybiBCT09MIFdJTkFQSSBDb252ZXJ0U2lkVG9TdHJpbmdTaWRBIChQU0lEIFNpZCwgTFBTVFIgKlN0cmluZ1NpZCk7CisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorI2lmbmRlZiBEQlVTX1dJTkNFCisjaW5jbHVkZSA8bWJzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1dTMlRDUElQX0gKKy8qIGdldGFkZHJpbmZvIGZvciBXaW5kb3dzIENFIChhbmQgV2luZG93cykuICAqLworI2luY2x1ZGUgPHdzMnRjcGlwLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfV1NQSUFQSV9ICisvLyBuZWVkZWQgZm9yIHcyayBjb21wYXRpYmlsaXR5IChnZXRhZGRyaW5mby9mcmVlYWRkcmluZm8vZ2V0bmFtZWluZm8pCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgX2lubGluZQorI2luY2x1ZGUgIndzcGlhcGkuaCIKKyNlbHNlCisjaW5jbHVkZSA8d3NwaWFwaS5oPgorI2VuZGlmCisjZW5kaWYgLy8gSEFWRV9XU1BJQVBJX0gKKworI2lmbmRlZiBPX0JJTkFSWQorI2RlZmluZSBPX0JJTkFSWSAwCisjZW5kaWYKKwordHlwZWRlZiBpbnQgc29ja2xlbl90OworCisKK3ZvaWQKK19kYnVzX3dpbl9zZXRfZXJybm8gKGludCBlcnIpCit7CisjaWZkZWYgREJVU19XSU5DRQorICBTZXRMYXN0RXJyb3IgKGVycik7CisjZWxzZQorICBlcnJubyA9IGVycjsKKyNlbmRpZgorfQorCisKKy8qIENvbnZlcnQgR2V0TGFzdEVycm9yKCkgdG8gYSBkYnVzIGVycm9yLiAgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c193aW5fZXJyb3JfZnJvbV9sYXN0X2Vycm9yICh2b2lkKQoreworICBzd2l0Y2ggKEdldExhc3RFcnJvcigpKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9GQUlMRUQ7CisgICAgCisgICAgY2FzZSBFUlJPUl9OT19NT1JFX0ZJTEVTOgorICAgIGNhc2UgRVJST1JfVE9PX01BTllfT1BFTl9GSUxFUzoKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX0xJTUlUU19FWENFRURFRDsgLyoga2VybmVsIG91dCBvZiBtZW1vcnkgKi8KKworICAgIGNhc2UgRVJST1JfQUNDRVNTX0RFTklFRDoKKyAgICBjYXNlIEVSUk9SX0NBTk5PVF9NQUtFOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRDsKKworICAgIGNhc2UgRVJST1JfTk9UX0VOT1VHSF9NRU1PUlk6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9OT19NRU1PUlk7CisKKyAgICBjYXNlIEVSUk9SX0ZJTEVfRVhJU1RTOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfRklMRV9FWElTVFM7CisKKyAgICBjYXNlIEVSUk9SX0ZJTEVfTk9UX0ZPVU5EOgorICAgIGNhc2UgRVJST1JfUEFUSF9OT1RfRk9VTkQ6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9GSUxFX05PVF9GT1VORDsKKyAgICB9CisgIAorICByZXR1cm4gREJVU19FUlJPUl9GQUlMRUQ7Cit9CisKKworY2hhcioKK19kYnVzX3dpbl9lcnJvcl9zdHJpbmcgKGludCBlcnJvcl9udW1iZXIpCit7CisgIGNoYXIgKm1zZzsKKworICBGb3JtYXRNZXNzYWdlQSAoRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSIHwKKyAgICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTIHwKKyAgICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNLAorICAgICAgICAgICAgICAgICAgTlVMTCwgZXJyb3JfbnVtYmVyLCAwLAorICAgICAgICAgICAgICAgICAgKExQU1RSKSAmbXNnLCAwLCBOVUxMKTsKKworICBpZiAobXNnW3N0cmxlbiAobXNnKSAtIDFdID09ICdcbicpCisgICAgbXNnW3N0cmxlbiAobXNnKSAtIDFdID0gJ1wwJzsKKyAgaWYgKG1zZ1tzdHJsZW4gKG1zZykgLSAxXSA9PSAnXHInKQorICAgIG1zZ1tzdHJsZW4gKG1zZykgLSAxXSA9ICdcMCc7CisKKyAgcmV0dXJuIG1zZzsKK30KKwordm9pZAorX2RidXNfd2luX2ZyZWVfZXJyb3Jfc3RyaW5nIChjaGFyICpzdHJpbmcpCit7CisgIExvY2FsRnJlZSAoc3RyaW5nKTsKK30KKworLyoqCisgKiBTb2NrZXQgaW50ZXJmYWNlCisgKgorICovCisKKy8qKgorICogVGhpbiB3cmFwcGVyIGFyb3VuZCB0aGUgcmVhZCgpIHN5c3RlbSBjYWxsIHRoYXQgYXBwZW5kcworICogdGhlIGRhdGEgaXQgcmVhZHMgdG8gdGhlIERCdXNTdHJpbmcgYnVmZmVyLiBJdCBhcHBlbmRzCisgKiB1cCB0byB0aGUgZ2l2ZW4gY291bnQsIGFuZCByZXR1cm5zIHRoZSBzYW1lIHZhbHVlCisgKiBhbmQgc2FtZSBlcnJubyBhcyByZWFkKCkuIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyB0aGF0CisgKiBfZGJ1c19yZWFkX3NvY2tldCgpIGhhbmRsZXMgRUlOVFIgZm9yIHlvdS4gCisgKiBfZGJ1c19yZWFkX3NvY2tldCgpIGNhbiByZXR1cm4gRU5PTUVNLCBldmVuIHRob3VnaCAKKyAqIHJlZ3VsYXIgVU5JWCByZWFkIGRvZXNuJ3QuCisgKgorICogQHBhcmFtIGZkIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gcmVhZCBmcm9tCisgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gYXBwZW5kIGRhdGEgdG8KKyAqIEBwYXJhbSBjb3VudCB0aGUgYW1vdW50IG9mIGRhdGEgdG8gcmVhZAorICogQHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIC0xCisgKi8KKworaW50CitfZGJ1c19yZWFkX3NvY2tldCAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvdW50KQoreworICBpbnQgYnl0ZXNfcmVhZDsKKyAgaW50IHN0YXJ0OworICBjaGFyICpkYXRhOworCisgIF9kYnVzX2Fzc2VydCAoY291bnQgPj0gMCk7CisKKyAgc3RhcnQgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYnVmZmVyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19sZW5ndGhlbiAoYnVmZmVyLCBjb3VudCkpCisgICAgeworICAgICAgX2RidXNfd2luX3NldF9lcnJubyAoRU5PTUVNKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgZGF0YSA9IF9kYnVzX3N0cmluZ19nZXRfZGF0YV9sZW4gKGJ1ZmZlciwgc3RhcnQsIGNvdW50KTsKKworIGFnYWluOgorIAorICBfZGJ1c192ZXJib3NlICgicmVjdjogY291bnQ9JWQgZmQ9JWRcbiIsIGNvdW50LCBmZCk7CisgIGJ5dGVzX3JlYWQgPSByZWN2IChmZCwgZGF0YSwgY291bnQsIDApOworICAKKyAgaWYgKGJ5dGVzX3JlYWQgPT0gU09DS0VUX0VSUk9SKQorCXsKKwkgIERCVVNfU09DS0VUX1NFVF9FUlJOTygpOworCSAgX2RidXNfdmVyYm9zZSAoInJlY3Y6IGZhaWxlZDogJXMgKCVkKVxuIiwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSwgZXJybm8pOworCSAgYnl0ZXNfcmVhZCA9IC0xOworCX0KKwllbHNlCisJICBfZGJ1c192ZXJib3NlICgicmVjdjogPSAlZFxuIiwgYnl0ZXNfcmVhZCk7CisKKyAgaWYgKGJ5dGVzX3JlYWQgPCAwKQorICAgIHsKKyAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgIGVsc2UgICAgCQorICAgICAgICB7CisgICAgICAgICAgLyogcHV0IGxlbmd0aCBiYWNrIChub3RlIHRoYXQgdGhpcyBkb2Vzbid0IGFjdHVhbGx5IHJlYWxsb2MgYW55dGhpbmcpICovCisgICAgICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKGJ1ZmZlciwgc3RhcnQpOworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIHB1dCBsZW5ndGggYmFjayAoZG9lc24ndCBhY3R1YWxseSByZWFsbG9jKSAqLworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKGJ1ZmZlciwgc3RhcnQgKyBieXRlc19yZWFkKTsKKworI2lmIDAKKyAgICAgIGlmIChieXRlc19yZWFkID4gMCkKKyAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKGJ1ZmZlciwgc3RhcnQsIGJ5dGVzX3JlYWQpOworI2VuZGlmCisKKyAgICAgIHJldHVybiBieXRlc19yZWFkOworICAgIH0KK30KKworLyoqCisgKiBUaGluIHdyYXBwZXIgYXJvdW5kIHRoZSB3cml0ZSgpIHN5c3RlbSBjYWxsIHRoYXQgd3JpdGVzIGEgcGFydCBvZiBhCisgKiBEQnVzU3RyaW5nIGFuZCBoYW5kbGVzIEVJTlRSIGZvciB5b3UuCisgKiAKKyAqIEBwYXJhbSBmZCB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIHdyaXRlCisgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gd3JpdGUgZGF0YSBmcm9tCisgKiBAcGFyYW0gc3RhcnQgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ1ZmZlciB0byB3cml0ZQorICogQHBhcmFtIGxlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHRyeSB0byB3cml0ZQorICogQHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG9yIC0xIG9uIGVycm9yCisgKi8KK2ludAorX2RidXNfd3JpdGVfc29ja2V0IChpbnQgICAgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuKQoreworICBjb25zdCBjaGFyICpkYXRhOworICBpbnQgYnl0ZXNfd3JpdHRlbjsKKworICBkYXRhID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAoYnVmZmVyLCBzdGFydCwgbGVuKTsKKworIGFnYWluOgorCisgIF9kYnVzX3ZlcmJvc2UgKCJzZW5kOiBsZW49JWQgZmQ9JWRcbiIsIGxlbiwgZmQpOworICBieXRlc193cml0dGVuID0gc2VuZCAoZmQsIGRhdGEsIGxlbiwgMCk7CisKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPT0gU09DS0VUX0VSUk9SKQorICAgIHsKKyAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTygpOworICAgICAgX2RidXNfdmVyYm9zZSAoInNlbmQ6IGZhaWxlZDogJXNcbiIsIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKCkpOworICAgICAgYnl0ZXNfd3JpdHRlbiA9IC0xOworICAgIH0KKyAgICBlbHNlCisgICAgICBfZGJ1c192ZXJib3NlICgic2VuZDogPSAlZFxuIiwgYnl0ZXNfd3JpdHRlbik7CisKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPCAwICYmIGVycm5vID09IEVJTlRSKQorICAgIGdvdG8gYWdhaW47CisgICAgCisjaWYgMAorICBpZiAoYnl0ZXNfd3JpdHRlbiA+IDApCisgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKGJ1ZmZlciwgc3RhcnQsIGJ5dGVzX3dyaXR0ZW4pOworI2VuZGlmCisKKyAgcmV0dXJuIGJ5dGVzX3dyaXR0ZW47Cit9CisKKworLyoqCisgKiBDbG9zZXMgYSBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIGZkIHRoZSBmaWxlIGRlc2NyaXB0b3IKKyAqIEBwYXJhbSBlcnJvciBlcnJvciBvYmplY3QKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciBzZXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2Nsb3NlX3NvY2tldCAoaW50ICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyBhZ2FpbjoKKyAgaWYgKGNsb3Nlc29ja2V0IChmZCkgPT0gU09DS0VUX0VSUk9SKQorICAgIHsKKyAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgIAorICAgICAgaWYgKGVycm5vID09IEVJTlRSKQorICAgICAgICBnb3RvIGFnYWluOworICAgICAgICAKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY2xvc2Ugc29ja2V0OiBzb2NrZXQ9JWQsICwgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGZkLCBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIF9kYnVzX3ZlcmJvc2UgKCJfZGJ1c19jbG9zZV9zb2NrZXQ6IHNvY2tldD0lZCwgXG4iLCBmZCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogU2V0cyB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIGJlIGNsb3NlCisgKiBvbiBleGVjLiBTaG91bGQgYmUgY2FsbGVkIGZvciBhbGwgZmlsZQorICogZGVzY3JpcHRvcnMgaW4gRC1CdXMgY29kZS4KKyAqCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvcgorICovCit2b2lkCitfZGJ1c19mZF9zZXRfY2xvc2Vfb25fZXhlYyAoaW50cHRyX3QgaGFuZGxlKQoreworICBpZiAoICFTZXRIYW5kbGVJbmZvcm1hdGlvbiggKEhBTkRMRSkgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZMQUdfSU5IRVJJVCB8IEhBTkRMRV9GTEFHX1BST1RFQ1RfRlJPTV9DTE9TRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAgLypkaXNhYmxlIGJvdGggZmxhZ3MqLyApICkKKyAgICB7CisgICAgICBfZGJ1c193aW5fd2Fybl93aW5fZXJyb3IgKCJEaXNhYmxpbmcgc29ja2V0IGhhbmRsZSBpbmhlcml0YW5jZSBmYWlsZWQ6IiwgR2V0TGFzdEVycm9yKCkpOworICAgIH0KK30KKworLyoqCisgKiBTZXRzIGEgZmlsZSBkZXNjcmlwdG9yIHRvIGJlIG5vbmJsb2NraW5nLgorICoKKyAqIEBwYXJhbSBmZCB0aGUgZmlsZSBkZXNjcmlwdG9yLgorICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgb2YgZXJyb3IgbG9jYXRpb24uCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc2V0X2ZkX25vbmJsb2NraW5nIChpbnQgICAgICAgICAgICAgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIHVfbG9uZyBvbmUgPSAxOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmIChpb2N0bHNvY2tldCAoaGFuZGxlLCBGSU9OQklPLCAmb25lKSA9PSBTT0NLRVRfRVJST1IpCisgICAgeworICAgICAgREJVU19TT0NLRVRfU0VUX0VSUk5PICgpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZXQgc29ja2V0ICVkOiVkIHRvIG5vbmJsb2NraW5nOiAlcyIsIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqCisgKiBMaWtlIF9kYnVzX3dyaXRlKCkgYnV0IHdpbGwgdXNlIHdyaXRldigpIGlmIHBvc3NpYmxlCisgKiB0byB3cml0ZSBib3RoIGJ1ZmZlcnMgaW4gc2VxdWVuY2UuIFRoZSByZXR1cm4gdmFsdWUKKyAqIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpbiB0aGUgZmlyc3QgYnVmZmVyLAorICogcGx1cyB0aGUgbnVtYmVyIHdyaXR0ZW4gaW4gdGhlIHNlY29uZC4gSWYgdGhlIGZpcnN0CisgKiBidWZmZXIgaXMgd3JpdHRlbiBzdWNjZXNzZnVsbHkgYW5kIGFuIGVycm9yIG9jY3VycworICogd3JpdGluZyB0aGUgc2Vjb25kLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBmaXJzdAorICogaXMgcmV0dXJuZWQgKGkuZS4gdGhlIGVycm9yIGlzIGlnbm9yZWQpLCBvbiBzeXN0ZW1zIHRoYXQKKyAqIGRvbid0IGhhdmUgd3JpdGV2LiBIYW5kbGVzIEVJTlRSIGZvciB5b3UuCisgKiBUaGUgc2Vjb25kIGJ1ZmZlciBtYXkgYmUgI05VTEwuCisgKgorICogQHBhcmFtIGZkIHRoZSBmaWxlIGRlc2NyaXB0b3IKKyAqIEBwYXJhbSBidWZmZXIxIGZpcnN0IGJ1ZmZlcgorICogQHBhcmFtIHN0YXJ0MSBmaXJzdCBieXRlIHRvIHdyaXRlIGluIGZpcnN0IGJ1ZmZlcgorICogQHBhcmFtIGxlbjEgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIGZyb20gZmlyc3QgYnVmZmVyCisgKiBAcGFyYW0gYnVmZmVyMiBzZWNvbmQgYnVmZmVyLCBvciAjTlVMTAorICogQHBhcmFtIHN0YXJ0MiBmaXJzdCBieXRlIHRvIHdyaXRlIGluIHNlY29uZCBidWZmZXIKKyAqIEBwYXJhbSBsZW4yIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSBpbiBzZWNvbmQgYnVmZmVyCisgKiBAcmV0dXJucyB0b3RhbCBieXRlcyB3cml0dGVuIGZyb20gYm90aCBidWZmZXJzLCBvciAtMSBvbiBlcnJvcgorICovCitpbnQKK19kYnVzX3dyaXRlX3NvY2tldF90d28gKGludCAgICAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbjEsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuMikKK3sKKyAgV1NBQlVGIHZlY3RvcnNbMl07CisgIGNvbnN0IGNoYXIgKmRhdGExOworICBjb25zdCBjaGFyICpkYXRhMjsKKyAgaW50IHJjOworICBEV09SRCBieXRlc193cml0dGVuOworCisgIF9kYnVzX2Fzc2VydCAoYnVmZmVyMSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydDEgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQyID49IDApOworICBfZGJ1c19hc3NlcnQgKGxlbjEgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobGVuMiA+PSAwKTsKKworCisgIGRhdGExID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAoYnVmZmVyMSwgc3RhcnQxLCBsZW4xKTsKKworICBpZiAoYnVmZmVyMiAhPSBOVUxMKQorICAgIGRhdGEyID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAoYnVmZmVyMiwgc3RhcnQyLCBsZW4yKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGRhdGEyID0gTlVMTDsKKyAgICAgIHN0YXJ0MiA9IDA7CisgICAgICBsZW4yID0gMDsKKyAgICB9CisKKyAgdmVjdG9yc1swXS5idWYgPSAoY2hhciopIGRhdGExOworICB2ZWN0b3JzWzBdLmxlbiA9IGxlbjE7CisgIHZlY3RvcnNbMV0uYnVmID0gKGNoYXIqKSBkYXRhMjsKKyAgdmVjdG9yc1sxXS5sZW4gPSBsZW4yOworCisgYWdhaW46CisgCisgIF9kYnVzX3ZlcmJvc2UgKCJXU0FTZW5kOiBsZW4xKzI9JWQrJWQgZmQ9JWRcbiIsIGxlbjEsIGxlbjIsIGZkKTsKKyAgcmMgPSBXU0FTZW5kIChmZCwgCisgICAgICAgICAgICAgICAgdmVjdG9ycywKKyAgICAgICAgICAgICAgICBkYXRhMiA/IDIgOiAxLCAKKyAgICAgICAgICAgICAgICAmYnl0ZXNfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAwLCAKKyAgICAgICAgICAgICAgICBOVUxMLCAKKyAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgICAgICAKKyAgaWYgKHJjID09IFNPQ0tFVF9FUlJPUikKKyAgICB7CisgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICBfZGJ1c192ZXJib3NlICgiV1NBU2VuZDogZmFpbGVkOiAlc1xuIiwgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICBieXRlc193cml0dGVuID0gLTE7CisgICAgfQorICBlbHNlCisgICAgX2RidXNfdmVyYm9zZSAoIldTQVNlbmQ6ID0gJWxkXG4iLCBieXRlc193cml0dGVuKTsKKyAgICAKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPCAwICYmIGVycm5vID09IEVJTlRSKQorICAgIGdvdG8gYWdhaW47CisgICAgICAKKyAgcmV0dXJuIGJ5dGVzX3dyaXR0ZW47Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19zb2NrZXRfaXNfaW52YWxpZCAoaW50IGZkKQoreworICAgIHJldHVybiBmZCA9PSBJTlZBTElEX1NPQ0tFVCA/IFRSVUUgOiBGQUxTRTsKK30KKworI2lmIDAKKworLyoqCisgKiBPcGVucyB0aGUgY2xpZW50IHNpZGUgb2YgYSBXaW5kb3dzIG5hbWVkIHBpcGUuIFRoZSBjb25uZWN0aW9uIEQtQlVTCisgKiBmaWxlIGRlc2NyaXB0b3IgaW5kZXggaXMgcmV0dXJuZWQuIEl0IGlzIHNldCB1cCBhcyBub25ibG9ja2luZy4KKyAqIAorICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gbmFtZWQgcGlwZSBzb2NrZXQKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9yIGNvZGUKKyAqIEByZXR1cm5zIGNvbm5lY3Rpb24gRC1CVVMgZmlsZSBkZXNjcmlwdG9yIG9yIC0xIG9uIGVycm9yCisgKi8KK2ludAorX2RidXNfY29ubmVjdF9uYW1lZF9waXBlIChjb25zdCBjaGFyICAgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJub3QgaW1wbGVtZW50ZWQiKTsKK30KKworI2VuZGlmCisKKworCit2b2lkCitfZGJ1c193aW5fc3RhcnR1cF93aW5zb2NrICh2b2lkKQoreworICAvKiBTdHJhaWdodCBmcm9tIE1TRE4sIGRldWdsaWZpZWQgKi8KKworICBzdGF0aWMgZGJ1c19ib29sX3QgYmVlbmhlcmUgPSBGQUxTRTsKKworICBXT1JEIHdWZXJzaW9uUmVxdWVzdGVkOworICBXU0FEQVRBIHdzYURhdGE7CisgIGludCBlcnI7CisKKyAgaWYgKGJlZW5oZXJlKQorICAgIHJldHVybjsKKworICB3VmVyc2lvblJlcXVlc3RlZCA9IE1BS0VXT1JEICgyLCAwKTsKKworICBlcnIgPSBXU0FTdGFydHVwICh3VmVyc2lvblJlcXVlc3RlZCwgJndzYURhdGEpOworICBpZiAoZXJyICE9IDApCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiQ291bGQgbm90IGluaXRpYWxpemUgV2luU29jayIpOworICAgICAgX2RidXNfYWJvcnQgKCk7CisgICAgfQorCisgIC8qIENvbmZpcm0gdGhhdCB0aGUgV2luU29jayBETEwgc3VwcG9ydHMgMi4wLiAgTm90ZSB0aGF0IGlmIHRoZSBETEwKKyAgICogc3VwcG9ydHMgdmVyc2lvbnMgZ3JlYXRlciB0aGFuIDIuMCBpbiBhZGRpdGlvbiB0byAyLjAsIGl0IHdpbGwKKyAgICogc3RpbGwgcmV0dXJuIDIuMCBpbiB3VmVyc2lvbiBzaW5jZSB0aGF0IGlzIHRoZSB2ZXJzaW9uIHdlCisgICAqIHJlcXVlc3RlZC4KKyAgICovCisgIGlmIChMT0JZVEUgKHdzYURhdGEud1ZlcnNpb24pICE9IDIgfHwKKyAgICAgIEhJQllURSAod3NhRGF0YS53VmVyc2lvbikgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJObyB1c2FibGUgV2luU29jayBmb3VuZCIpOworICAgICAgX2RidXNfYWJvcnQgKCk7CisgICAgfQorCisgIGJlZW5oZXJlID0gVFJVRTsKK30KKworCisKKworCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAKKyBVVEYgLyBzdHJpbmcgY29kZQorIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBNZWFzdXJlIHRoZSBtZXNzYWdlIGxlbmd0aCB3aXRob3V0IHRlcm1pbmF0aW5nIG51bCAKKyAqLworaW50IF9kYnVzX3ByaW50Zl9zdHJpbmdfdXBwZXJfYm91bmQgKGNvbnN0IGNoYXIgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpCit7CisgIC8qIE1TVkNSVCdzIHZzbnByaW50ZiBzZW1hbnRpY3MgYXJlIGEgYml0IGRpZmZlcmVudCAqLworICBjaGFyIGJ1ZlsxMDI0XTsKKyAgaW50IGJ1ZnNpemU7CisgIGludCBsZW47CisKKyAgYnVmc2l6ZSA9IHNpemVvZiAoYnVmKTsKKyAgbGVuID0gX3ZzbnByaW50ZiAoYnVmLCBidWZzaXplIC0gMSwgZm9ybWF0LCBhcmdzKTsKKworICB3aGlsZSAobGVuID09IC0xKSAvKiB0cnkgYWdhaW4gKi8KKyAgICB7CisgICAgICBjaGFyICpwOworCisgICAgICBidWZzaXplICo9IDI7CisKKyAgICAgIHAgPSBtYWxsb2MgKGJ1ZnNpemUpOworCisgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgIGxlbiA9IF92c25wcmludGYgKHAsIGJ1ZnNpemUgLSAxLCBmb3JtYXQsIGFyZ3MpOworICAgICAgZnJlZSAocCk7CisgICAgfQorCisgIHJldHVybiBsZW47Cit9CisKKworLyoqCisgKiBSZXR1cm5zIHRoZSBVVEYtMTYgZm9ybSBvZiBhIFVURi04IHN0cmluZy4gVGhlIHJlc3VsdCBzaG91bGQgYmUKKyAqIGZyZWVkIHdpdGggZGJ1c19mcmVlKCkgd2hlbiBubyBsb25nZXIgbmVlZGVkLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIFVURi04IHN0cmluZworICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3IgY29kZQorICovCit3Y2hhcl90ICoKK19kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChjb25zdCBjaGFyICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgczsKKyAgaW50IG47CisgIHdjaGFyX3QgKnJldHZhbDsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnMsIHN0cik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfdmFsaWRhdGVfdXRmOCAoJnMsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmcykpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJJbnZhbGlkIFVURi04Iik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgbiA9IE11bHRpQnl0ZVRvV2lkZUNoYXIgKENQX1VURjgsIDAsIHN0ciwgLTEsIE5VTEwsIDApOworCisgIGlmIChuID09IDApCisgICAgeworICAgICAgX2RidXNfd2luX3NldF9lcnJvcl9mcm9tX3dpbl9lcnJvciAoZXJyb3IsIEdldExhc3RFcnJvciAoKSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dmFsID0gZGJ1c19uZXcgKHdjaGFyX3QsIG4pOworCisgIGlmICghcmV0dmFsKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoTXVsdGlCeXRlVG9XaWRlQ2hhciAoQ1BfVVRGOCwgMCwgc3RyLCAtMSwgcmV0dmFsLCBuKSAhPSBuKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAocmV0dmFsKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJNdWx0aUJ5dGVUb1dpZGVDaGFyIGluY29uc2lzdGVuY3kiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIFVURi04IGZvcm0gb2YgYSBVVEYtMTYgc3RyaW5nLiBUaGUgcmVzdWx0IHNob3VsZCBiZQorICogZnJlZWQgd2l0aCBkYnVzX2ZyZWUoKSB3aGVuIG5vIGxvbmdlciBuZWVkZWQuCisgKgorICogQHBhcmFtIHN0ciB0aGUgVVRGLTE2IHN0cmluZworICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3IgY29kZQorICovCitjaGFyICoKK19kYnVzX3dpbl91dGYxNl90b191dGY4IChjb25zdCB3Y2hhcl90ICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAqZXJyb3IpCit7CisgIGludCBuOworICBjaGFyICpyZXR2YWw7CisKKyAgbiA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUgKENQX1VURjgsIDAsIHN0ciwgLTEsIE5VTEwsIDAsIE5VTEwsIE5VTEwpOworCisgIGlmIChuID09IDApCisgICAgeworICAgICAgX2RidXNfd2luX3NldF9lcnJvcl9mcm9tX3dpbl9lcnJvciAoZXJyb3IsIEdldExhc3RFcnJvciAoKSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dmFsID0gZGJ1c19tYWxsb2MgKG4pOworCisgIGlmICghcmV0dmFsKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoV2lkZUNoYXJUb011bHRpQnl0ZSAoQ1BfVVRGOCwgMCwgc3RyLCAtMSwgcmV0dmFsLCBuLCBOVUxMLCBOVUxMKSAhPSBuKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAocmV0dmFsKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJXaWRlQ2hhclRvTXVsdGlCeXRlIGluY29uc2lzdGVuY3kiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gcmV0dmFsOworfQorCisKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIAorIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZGJ1c19ib29sX3QKK19kYnVzX3dpbl9hY2NvdW50X3RvX3NpZCAoY29uc3Qgd2NoYXJfdCAqd2FjY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAJICoqcHBzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAJICAqZXJyb3IpCit7CisgIGRidXNfYm9vbF90IHJldHZhbCA9IEZBTFNFOworICBEV09SRCBzaWRfbGVuZ3RoLCB3ZG9tYWluX2xlbmd0aDsKKyAgU0lEX05BTUVfVVNFIHVzZTsKKyAgd2NoYXJfdCAqd2RvbWFpbjsKKworICAqcHBzaWQgPSBOVUxMOworCisgIHNpZF9sZW5ndGggPSAwOworICB3ZG9tYWluX2xlbmd0aCA9IDA7CisgIGlmICghTG9va3VwQWNjb3VudE5hbWVXIChOVUxMLCB3YWNjb3VudCwgTlVMTCwgJnNpZF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmd2RvbWFpbl9sZW5ndGgsICZ1c2UpICYmCisgICAgICBHZXRMYXN0RXJyb3IgKCkgIT0gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUikKKyAgICB7CisgICAgICBfZGJ1c193aW5fc2V0X2Vycm9yX2Zyb21fd2luX2Vycm9yIChlcnJvciwgR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgKnBwc2lkID0gZGJ1c19tYWxsb2MgKHNpZF9sZW5ndGgpOworICBpZiAoISpwcHNpZCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHdkb21haW4gPSBkYnVzX25ldyAod2NoYXJfdCwgd2RvbWFpbl9sZW5ndGgpOworICBpZiAoIXdkb21haW4pCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQxOworICAgIH0KKworICBpZiAoIUxvb2t1cEFjY291bnROYW1lVyAoTlVMTCwgd2FjY291bnQsIChQU0lEKSAqcHBzaWQsICZzaWRfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2RvbWFpbiwgJndkb21haW5fbGVuZ3RoLCAmdXNlKSkKKyAgICB7CisgICAgICBfZGJ1c193aW5fc2V0X2Vycm9yX2Zyb21fd2luX2Vycm9yIChlcnJvciwgR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIGdvdG8gb3V0MjsKKyAgICB9CisKKyAgaWYgKCFJc1ZhbGlkU2lkICgoUFNJRCkgKnBwc2lkKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvcl9jb25zdCAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELCAiSW52YWxpZCBTSUQiKTsKKyAgICAgIGdvdG8gb3V0MjsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworb3V0MjoKKyAgZGJ1c19mcmVlICh3ZG9tYWluKTsKK291dDE6CisgIGlmICghcmV0dmFsKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAoKnBwc2lkKTsKKyAgICAgICpwcHNpZCA9IE5VTEw7CisgICAgfQorCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKiBAfSBlbmQgb2Ygc3lzZGVwcy13aW4gKi8KKworCisvKioKKyAqIFRoZSBvbmx5IHJlYXNvbiB0aGlzIGlzIHNlcGFyYXRlIGZyb20gX2RidXNfZ2V0cGlkKCkgaXMgdG8gYWxsb3cgaXQKKyAqIG9uIFdpbmRvd3MgZm9yIGxvZ2dpbmcgYnV0IG5vdCBmb3Igb3RoZXIgcHVycG9zZXMuCisgKiAKKyAqIEByZXR1cm5zIHByb2Nlc3MgSUQgdG8gcHV0IGluIGxvZyBtZXNzYWdlcworICovCit1bnNpZ25lZCBsb25nCitfZGJ1c19waWRfZm9yX2xvZyAodm9pZCkKK3sKKyAgcmV0dXJuIF9kYnVzX2dldHBpZCAoKTsKK30KKworCisjaWZuZGVmIERCVVNfV0lOQ0UKKy8qKiBHZXRzIG91ciBTSUQKKyAqIEBwYXJhbSBwb2ludHMgdG8gc2lkIGJ1ZmZlciwgbmVlZCB0byBiZSBmcmVlZCB3aXRoIExvY2FsRnJlZSgpCisgKiBAcmV0dXJucyBwcm9jZXNzIHNpZAorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX2dldHNpZChjaGFyICoqc2lkKQoreworICBIQU5ETEUgcHJvY2Vzc190b2tlbiA9IElOVkFMSURfSEFORExFX1ZBTFVFOworICBUT0tFTl9VU0VSICp0b2tlbl91c2VyID0gTlVMTDsKKyAgRFdPUkQgbjsKKyAgUFNJRCBwc2lkOworICBpbnQgcmV0dmFsID0gRkFMU0U7CisgIAorICBpZiAoIU9wZW5Qcm9jZXNzVG9rZW4gKEdldEN1cnJlbnRQcm9jZXNzICgpLCBUT0tFTl9RVUVSWSwgJnByb2Nlc3NfdG9rZW4pKSAKKyAgICB7CisgICAgICBfZGJ1c193aW5fd2Fybl93aW5fZXJyb3IgKCJPcGVuUHJvY2Vzc1Rva2VuIGZhaWxlZCIsIEdldExhc3RFcnJvciAoKSk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIGlmICgoIUdldFRva2VuSW5mb3JtYXRpb24gKHByb2Nlc3NfdG9rZW4sIFRva2VuVXNlciwgTlVMTCwgMCwgJm4pCisgICAgICAgICAgICAmJiBHZXRMYXN0RXJyb3IgKCkgIT0gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUikKKyAgICAgICAgICAgfHwgKHRva2VuX3VzZXIgPSBhbGxvY2EgKG4pKSA9PSBOVUxMCisgICAgICAgICAgIHx8ICFHZXRUb2tlbkluZm9ybWF0aW9uIChwcm9jZXNzX3Rva2VuLCBUb2tlblVzZXIsIHRva2VuX3VzZXIsIG4sICZuKSkKKyAgICB7CisgICAgICBfZGJ1c193aW5fd2Fybl93aW5fZXJyb3IgKCJHZXRUb2tlbkluZm9ybWF0aW9uIGZhaWxlZCIsIEdldExhc3RFcnJvciAoKSk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIHBzaWQgPSB0b2tlbl91c2VyLT5Vc2VyLlNpZDsKKyAgaWYgKCFJc1ZhbGlkU2lkIChwc2lkKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlKCIlcyBpbnZhbGlkIHNpZFxuIixfX0ZVTkNUSU9OX18pOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICBpZiAoIUNvbnZlcnRTaWRUb1N0cmluZ1NpZEEgKHBzaWQsIHNpZCkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSgiJXMgaW52YWxpZCBzaWRcbiIsX19GVU5DVElPTl9fKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKy8vb2theToKKyAgcmV0dmFsID0gVFJVRTsKKworZmFpbGVkOgorICBpZiAocHJvY2Vzc190b2tlbiAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICBDbG9zZUhhbmRsZSAocHJvY2Vzc190b2tlbik7CisKKyAgX2RidXNfdmVyYm9zZSgiX2RidXNfZ2V0c2lkKCkgcmV0dXJucyAlZFxuIixyZXR2YWwpOworICByZXR1cm4gcmV0dmFsOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAKKyBwaXBlcworIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBDcmVhdGVzIGEgZnVsbC1kdXBsZXggcGlwZSAoYXMgaW4gc29ja2V0cGFpcigpKS4KKyAqIFNldHMgYm90aCBlbmRzIG9mIHRoZSBwaXBlIG5vbmJsb2NraW5nLgorICoKKyAqIEBwYXJhbSBmZDEgcmV0dXJuIGxvY2F0aW9uIGZvciBvbmUgZW5kCisgKiBAcGFyYW0gZmQyIHJldHVybiBsb2NhdGlvbiBmb3IgdGhlIG90aGVyIGVuZAorICogQHBhcmFtIGJsb2NraW5nICNUUlVFIGlmIHBpcGUgc2hvdWxkIGJlIGJsb2NraW5nCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZSAoaWYgZXJyb3IgaXMgc2V0KQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZnVsbF9kdXBsZXhfcGlwZSAoaW50ICAgICAgICAqZmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAqZmQyLAorICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgYmxvY2tpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgU09DS0VUIHRlbXAsIHNvY2tldDEgPSAtMSwgc29ja2V0MiA9IC0xOworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2FkZHI7CisgIGludCBsZW47CisgIHVfbG9uZyBhcmc7CisKKyAgX2RidXNfd2luX3N0YXJ0dXBfd2luc29jayAoKTsKKworICB0ZW1wID0gc29ja2V0IChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisgIGlmICh0ZW1wID09IElOVkFMSURfU09DS0VUKQorICAgIHsKKyAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgIGdvdG8gb3V0MDsKKyAgICB9CisKKyAgX0RCVVNfWkVSTyAoc2FkZHIpOworICBzYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgc2FkZHIuc2luX3BvcnQgPSAwOworICBzYWRkci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubCAoSU5BRERSX0xPT1BCQUNLKTsKKworICBpZiAoYmluZCAodGVtcCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzYWRkciwgc2l6ZW9mIChzYWRkcikpID09IFNPQ0tFVF9FUlJPUikKKyAgICB7CisgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICBnb3RvIG91dDA7CisgICAgfQorCisgIGlmIChsaXN0ZW4gKHRlbXAsIDEpID09IFNPQ0tFVF9FUlJPUikKKyAgICB7CisgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICBnb3RvIG91dDA7CisgICAgfQorCisgIGxlbiA9IHNpemVvZiAoc2FkZHIpOworICBpZiAoZ2V0c29ja25hbWUgKHRlbXAsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2FkZHIsICZsZW4pID09IFNPQ0tFVF9FUlJPUikKKyAgICB7CisgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICBnb3RvIG91dDA7CisgICAgfQorCisgIHNvY2tldDEgPSBzb2NrZXQgKEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKyAgaWYgKHNvY2tldDEgPT0gSU5WQUxJRF9TT0NLRVQpCisgICAgeworICAgICAgREJVU19TT0NLRVRfU0VUX0VSUk5PICgpOworICAgICAgZ290byBvdXQwOworICAgIH0KKworICBpZiAoY29ubmVjdCAoc29ja2V0MSwgKHN0cnVjdCBzb2NrYWRkciAgKikmc2FkZHIsIGxlbikgPT0gU09DS0VUX0VSUk9SKQorICAgIHsKKyAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgIGdvdG8gb3V0MTsKKyAgICB9CisKKyAgc29ja2V0MiA9IGFjY2VwdCAodGVtcCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2FkZHIsICZsZW4pOworICBpZiAoc29ja2V0MiA9PSBJTlZBTElEX1NPQ0tFVCkKKyAgICB7CisgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICBnb3RvIG91dDE7CisgICAgfQorCisgIGlmICghYmxvY2tpbmcpCisgICAgeworICAgICAgYXJnID0gMTsKKyAgICAgIGlmIChpb2N0bHNvY2tldCAoc29ja2V0MSwgRklPTkJJTywgJmFyZykgPT0gU09DS0VUX0VSUk9SKQorICAgICAgICB7CisgICAgICAgICAgREJVU19TT0NLRVRfU0VUX0VSUk5PICgpOworICAgICAgICAgIGdvdG8gb3V0MjsKKyAgICAgICAgfQorCisgICAgICBhcmcgPSAxOworICAgICAgaWYgKGlvY3Rsc29ja2V0IChzb2NrZXQyLCBGSU9OQklPLCAmYXJnKSA9PSBTT0NLRVRfRVJST1IpCisgICAgICAgIHsKKyAgICAgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICAgICAgZ290byBvdXQyOworICAgICAgICB9CisgICAgfQorCisgICpmZDEgPSBzb2NrZXQxOworICAqZmQyID0gc29ja2V0MjsKKworICBfZGJ1c192ZXJib3NlICgiZnVsbC1kdXBsZXggcGlwZSAlZDolZCA8LT4gJWQ6JWRcbiIsCisgICAgICAgICAgICAgICAgICpmZDEsIHNvY2tldDEsICpmZDIsIHNvY2tldDIpOworCisgIGNsb3Nlc29ja2V0ICh0ZW1wKTsKKworICByZXR1cm4gVFJVRTsKKworb3V0MjoKKyAgY2xvc2Vzb2NrZXQgKHNvY2tldDIpOworb3V0MToKKyAgY2xvc2Vzb2NrZXQgKHNvY2tldDEpOworb3V0MDoKKyAgY2xvc2Vzb2NrZXQgKHRlbXApOworCisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXR1cCBzb2NrZXQgcGFpcjogJXMiLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIFdyYXBwZXIgZm9yIHBvbGwoKS4KKyAqCisgKiBAcGFyYW0gZmRzIHRoZSBmaWxlIGRlc2NyaXB0b3JzIHRvIHBvbGwKKyAqIEBwYXJhbSBuX2ZkcyBudW1iZXIgb2YgZGVzY3JpcHRvcnMgaW4gdGhlIGFycmF5CisgKiBAcGFyYW0gdGltZW91dF9taWxsaXNlY29uZHMgdGltZW91dCBvciAtMSBmb3IgaW5maW5pdGUKKyAqIEByZXR1cm5zIG51bWJlcnMgb2YgZmRzIHdpdGggcmV2ZW50cywgb3IgPDAgb24gZXJyb3IKKyAqLworaW50CitfZGJ1c19wb2xsIChEQnVzUG9sbEZEICpmZHMsCisgICAgICAgICAgICBpbnQgICAgICAgICBuX2ZkcywKKyAgICAgICAgICAgIGludCAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKQoreworI2RlZmluZSBVU0VfQ0hSSVNfSU1QTCAwCisKKyNpZiBVU0VfQ0hSSVNfSU1QTAorCisjZGVmaW5lIERCVVNfUE9MTF9DSEFSX0JVRkZFUl9TSVpFIDIwMDAKKyAgY2hhciBtc2dbREJVU19QT0xMX0NIQVJfQlVGRkVSX1NJWkVdOworICBjaGFyICptc2dwOworCisgIGludCByZXQgPSAwOworICBpbnQgaTsKKyAgc3RydWN0IHRpbWV2YWwgdHY7CisgIGludCByZWFkeTsKKworI2RlZmluZSBEQlVTX1NUQUNLX1dTQUVWRU5UUyAyNTYKKyAgV1NBRVZFTlQgZXZlbnRzT25TdGFja1tEQlVTX1NUQUNLX1dTQUVWRU5UU107CisgIFdTQUVWRU5UICpwRXZlbnRzID0gTlVMTDsKKyAgaWYgKG5fZmRzID4gREJVU19TVEFDS19XU0FFVkVOVFMpCisgICAgcEV2ZW50cyA9IGNhbGxvYyhzaXplb2YoV1NBRVZFTlQpLCBuX2Zkcyk7CisgIGVsc2UKKyAgICBwRXZlbnRzID0gZXZlbnRzT25TdGFjazsKKworCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgIG1zZ3AgPSBtc2c7CisgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgIldTQUV2ZW50U2VsZWN0OiB0bz0lZFxuXHQiLCB0aW1lb3V0X21pbGxpc2Vjb25kcyk7CisgIGZvciAoaSA9IDA7IGkgPCBuX2ZkczsgaSsrKQorICAgIHsKKyAgICAgIERCdXNQb2xsRkQgKmZkcCA9ICZmZHNbaV07CisKKworICAgICAgaWYgKGZkcC0+ZXZlbnRzICYgX0RCVVNfUE9MTElOKQorICAgICAgICBtc2dwICs9IHNwcmludGYgKG1zZ3AsICJSOiVkICIsIGZkcC0+ZmQpOworCisgICAgICBpZiAoZmRwLT5ldmVudHMgJiBfREJVU19QT0xMT1VUKQorICAgICAgICBtc2dwICs9IHNwcmludGYgKG1zZ3AsICJXOiVkICIsIGZkcC0+ZmQpOworCisgICAgICBtc2dwICs9IHNwcmludGYgKG1zZ3AsICJFOiVkXG5cdCIsIGZkcC0+ZmQpOworCisgICAgICAvLyBGSVhNRTogbW9yZSByb2J1c3QgY29kZSBmb3IgbG9uZyAgbXNnCisgICAgICAvLyAgICAgICAgY3JlYXRlIG9uIGhlYXAgd2hlbiBtc2dbXSBiZWNvbWVzIHRvbyBzbWFsbAorICAgICAgaWYgKG1zZ3AgPj0gbXNnICsgREJVU19QT0xMX0NIQVJfQlVGRkVSX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJidWZmZXIgb3ZlcmZsb3cgaW4gX2RidXNfcG9sbCIpOworICAgICAgICB9CisgICAgfQorCisgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgIlxuIik7CisgIF9kYnVzX3ZlcmJvc2UgKCIlcyIsbXNnKTsKKyNlbmRpZgorICBmb3IgKGkgPSAwOyBpIDwgbl9mZHM7IGkrKykKKyAgICB7CisgICAgICBEQnVzUG9sbEZEICpmZHAgPSAmZmRzW2ldOworICAgICAgV1NBRVZFTlQgZXY7CisgICAgICBsb25nIGxOZXR3b3JrRXZlbnRzID0gRkRfT09COworCisgICAgICBldiA9IFdTQUNyZWF0ZUV2ZW50KCk7CisKKyAgICAgIGlmIChmZHAtPmV2ZW50cyAmIF9EQlVTX1BPTExJTikKKyAgICAgICAgbE5ldHdvcmtFdmVudHMgfD0gRkRfUkVBRCB8IEZEX0FDQ0VQVCB8IEZEX0NMT1NFOworCisgICAgICBpZiAoZmRwLT5ldmVudHMgJiBfREJVU19QT0xMT1VUKQorICAgICAgICBsTmV0d29ya0V2ZW50cyB8PSBGRF9XUklURSB8IEZEX0NPTk5FQ1Q7CisKKyAgICAgIFdTQUV2ZW50U2VsZWN0KGZkcC0+ZmQsIGV2LCBsTmV0d29ya0V2ZW50cyk7CisKKyAgICAgIHBFdmVudHNbaV0gPSBldjsKKyAgICB9CisKKworICByZWFkeSA9IFdTQVdhaXRGb3JNdWx0aXBsZUV2ZW50cyAobl9mZHMsIHBFdmVudHMsIEZBTFNFLCB0aW1lb3V0X21pbGxpc2Vjb25kcywgRkFMU0UpOworCisgIGlmIChEQlVTX1NPQ0tFVF9BUElfUkVUVVJOU19FUlJPUiAocmVhZHkpKQorICAgIHsKKyAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgIGlmIChlcnJubyAhPSBXU0FFV09VTERCTE9DSykKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIldTQVdhaXRGb3JNdWx0aXBsZUV2ZW50czogZmFpbGVkOiAlc1xuIiwgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICByZXQgPSAtMTsKKyAgICB9CisgIGVsc2UgaWYgKHJlYWR5ID09IFdTQV9XQUlUX1RJTUVPVVQpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIldTQVdhaXRGb3JNdWx0aXBsZUV2ZW50czogV1NBX1dBSVRfVElNRU9VVFxuIik7CisgICAgICByZXQgPSAwOworICAgIH0KKyAgZWxzZSBpZiAocmVhZHkgPj0gV1NBX1dBSVRfRVZFTlRfMCAmJiByZWFkeSA8IChpbnQpKFdTQV9XQUlUX0VWRU5UXzAgKyBuX2ZkcykpCisgICAgeworICAgICAgbXNncCA9IG1zZzsKKyAgICAgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgIldTQVdhaXRGb3JNdWx0aXBsZUV2ZW50czogPSVkXG5cdCIsIHJlYWR5KTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG5fZmRzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzUG9sbEZEICpmZHAgPSAmZmRzW2ldOworICAgICAgICAgIFdTQU5FVFdPUktFVkVOVFMgbmU7CisKKyAgICAgICAgICBmZHAtPnJldmVudHMgPSAwOworCisgICAgICAgICAgV1NBRW51bU5ldHdvcmtFdmVudHMoZmRwLT5mZCwgcEV2ZW50c1tpXSwgJm5lKTsKKworICAgICAgICAgIGlmIChuZS5sTmV0d29ya0V2ZW50cyAmIChGRF9SRUFEIHwgRkRfQUNDRVBUIHwgRkRfQ0xPU0UpKQorICAgICAgICAgICAgZmRwLT5yZXZlbnRzIHw9IF9EQlVTX1BPTExJTjsKKworICAgICAgICAgIGlmIChuZS5sTmV0d29ya0V2ZW50cyAmIChGRF9XUklURSB8IEZEX0NPTk5FQ1QpKQorICAgICAgICAgICAgZmRwLT5yZXZlbnRzIHw9IF9EQlVTX1BPTExPVVQ7CisKKyAgICAgICAgICBpZiAobmUubE5ldHdvcmtFdmVudHMgJiAoRkRfT09CKSkKKyAgICAgICAgICAgIGZkcC0+cmV2ZW50cyB8PSBfREJVU19QT0xMRVJSOworCisgICAgICAgICAgaWYgKG5lLmxOZXR3b3JrRXZlbnRzICYgKEZEX1JFQUQgfCBGRF9BQ0NFUFQgfCBGRF9DTE9TRSkpCisgICAgICAgICAgICAgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgIlI6JWQgIiwgZmRwLT5mZCk7CisKKyAgICAgICAgICBpZiAobmUubE5ldHdvcmtFdmVudHMgJiAoRkRfV1JJVEUgfCBGRF9DT05ORUNUKSkKKyAgICAgICAgICAgICAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAiVzolZCAiLCBmZHAtPmZkKTsKKworICAgICAgICAgIGlmIChuZS5sTmV0d29ya0V2ZW50cyAmIChGRF9PT0IpKQorICAgICAgICAgICAgICBtc2dwICs9IHNwcmludGYgKG1zZ3AsICJFOiVkICIsIGZkcC0+ZmQpOworCisgICAgICAgICAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAibE5ldHdvcmtFdmVudHM6JWQgIiwgbmUubE5ldHdvcmtFdmVudHMpOworCisgICAgICAgICAgaWYobmUubE5ldHdvcmtFdmVudHMpCisgICAgICAgICAgICByZXQrKzsKKworICAgICAgICAgIFdTQUV2ZW50U2VsZWN0KGZkcC0+ZmQsIHBFdmVudHNbaV0sIDApOworICAgICAgICB9CisKKyAgICAgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgIlxuIik7CisgICAgICBfZGJ1c192ZXJib3NlICgiJXMiLG1zZyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIldTQVdhaXRGb3JNdWx0aXBsZUV2ZW50czogZmFpbGVkIGZvciB1bmtub3duIHJlYXNvbiEiKTsKKyAgICAgIHJldCA9IC0xOworICAgIH0KKworICBmb3IoaSA9IDA7IGkgPCBuX2ZkczsgaSsrKQorICAgIHsKKyAgICAgIFdTQUNsb3NlRXZlbnQocEV2ZW50c1tpXSk7CisgICAgfQorCisgIGlmIChuX2ZkcyA+IERCVVNfU1RBQ0tfV1NBRVZFTlRTKQorICAgIGZyZWUocEV2ZW50cyk7CisKKyAgcmV0dXJuIHJldDsKKworI2Vsc2UgICAvKiBVU0VfQ0hSSVNfSU1QTCAqLworCisjZGVmaW5lIERCVVNfUE9MTF9DSEFSX0JVRkZFUl9TSVpFIDIwMDAKKyAgY2hhciBtc2dbREJVU19QT0xMX0NIQVJfQlVGRkVSX1NJWkVdOworICBjaGFyICptc2dwOworCisgIGZkX3NldCByZWFkX3NldCwgd3JpdGVfc2V0LCBlcnJfc2V0OworICBpbnQgbWF4X2ZkID0gMDsKKyAgaW50IGk7CisgIHN0cnVjdCB0aW1ldmFsIHR2OworICBpbnQgcmVhZHk7CisKKyAgRkRfWkVSTyAoJnJlYWRfc2V0KTsKKyAgRkRfWkVSTyAoJndyaXRlX3NldCk7CisgIEZEX1pFUk8gKCZlcnJfc2V0KTsKKworCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgIG1zZ3AgPSBtc2c7CisgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgInNlbGVjdDogdG89JWRcblx0IiwgdGltZW91dF9taWxsaXNlY29uZHMpOworICBmb3IgKGkgPSAwOyBpIDwgbl9mZHM7IGkrKykKKyAgICB7CisgICAgICBEQnVzUG9sbEZEICpmZHAgPSAmZmRzW2ldOworCisKKyAgICAgIGlmIChmZHAtPmV2ZW50cyAmIF9EQlVTX1BPTExJTikKKyAgICAgICAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAiUjolZCAiLCBmZHAtPmZkKTsKKworICAgICAgaWYgKGZkcC0+ZXZlbnRzICYgX0RCVVNfUE9MTE9VVCkKKyAgICAgICAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAiVzolZCAiLCBmZHAtPmZkKTsKKworICAgICAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAiRTolZFxuXHQiLCBmZHAtPmZkKTsKKworICAgICAgLy8gRklYTUU6IG1vcmUgcm9idXN0IGNvZGUgZm9yIGxvbmcgIG1zZworICAgICAgLy8gICAgICAgIGNyZWF0ZSBvbiBoZWFwIHdoZW4gbXNnW10gYmVjb21lcyB0b28gc21hbGwKKyAgICAgIGlmIChtc2dwID49IG1zZyArIERCVVNfUE9MTF9DSEFSX0JVRkZFUl9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiYnVmZmVyIG92ZXJmbG93IGluIF9kYnVzX3BvbGwiKTsKKyAgICAgICAgfQorICAgIH0KKworICBtc2dwICs9IHNwcmludGYgKG1zZ3AsICJcbiIpOworICBfZGJ1c192ZXJib3NlICgiJXMiLG1zZyk7CisjZW5kaWYKKyAgZm9yIChpID0gMDsgaSA8IG5fZmRzOyBpKyspCisgICAgeworICAgICAgREJ1c1BvbGxGRCAqZmRwID0gJmZkc1tpXTsgCisKKyAgICAgIGlmIChmZHAtPmV2ZW50cyAmIF9EQlVTX1BPTExJTikKKyAgICAgICAgRkRfU0VUIChmZHAtPmZkLCAmcmVhZF9zZXQpOworCisgICAgICBpZiAoZmRwLT5ldmVudHMgJiBfREJVU19QT0xMT1VUKQorICAgICAgICBGRF9TRVQgKGZkcC0+ZmQsICZ3cml0ZV9zZXQpOworCisgICAgICBGRF9TRVQgKGZkcC0+ZmQsICZlcnJfc2V0KTsKKworICAgICAgbWF4X2ZkID0gTUFYIChtYXhfZmQsIGZkcC0+ZmQpOworICAgIH0KKworICAvLyBBdm9pZCByYW5kb20gbG9ja3VwcyB3aXRoIHNlbmQoKSwgZm9yIGxhY2sgb2YgYSBiZXR0ZXIgc29sdXRpb24gc28gZmFyCisgIHR2LnR2X3NlYyA9IHRpbWVvdXRfbWlsbGlzZWNvbmRzIDwgMCA/IDEgOiB0aW1lb3V0X21pbGxpc2Vjb25kcyAvIDEwMDA7CisgIHR2LnR2X3VzZWMgPSB0aW1lb3V0X21pbGxpc2Vjb25kcyA8IDAgPyAwIDogKHRpbWVvdXRfbWlsbGlzZWNvbmRzICUgMTAwMCkgKiAxMDAwOworCisgIHJlYWR5ID0gc2VsZWN0IChtYXhfZmQgKyAxLCAmcmVhZF9zZXQsICZ3cml0ZV9zZXQsICZlcnJfc2V0LCAmdHYpOworCisgIGlmIChEQlVTX1NPQ0tFVF9BUElfUkVUVVJOU19FUlJPUiAocmVhZHkpKQorICAgIHsKKyAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgIGlmIChlcnJubyAhPSBXU0FFV09VTERCTE9DSykKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoInNlbGVjdDogZmFpbGVkOiAlc1xuIiwgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgfQorICBlbHNlIGlmIChyZWFkeSA9PSAwKQorICAgIF9kYnVzX3ZlcmJvc2UgKCJzZWxlY3Q6ID0gMFxuIik7CisgIGVsc2UKKyAgICBpZiAocmVhZHkgPiAwKQorICAgICAgeworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICAgICAgICBtc2dwID0gbXNnOworICAgICAgICBtc2dwICs9IHNwcmludGYgKG1zZ3AsICJzZWxlY3Q6ID0gJWQ6XG5cdCIsIHJlYWR5KTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbl9mZHM7IGkrKykKKyAgICAgICAgICB7CisgICAgICAgICAgICBEQnVzUG9sbEZEICpmZHAgPSAmZmRzW2ldOworCisgICAgICAgICAgICBpZiAoRkRfSVNTRVQgKGZkcC0+ZmQsICZyZWFkX3NldCkpCisgICAgICAgICAgICAgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgIlI6JWQgIiwgZmRwLT5mZCk7CisKKyAgICAgICAgICAgIGlmIChGRF9JU1NFVCAoZmRwLT5mZCwgJndyaXRlX3NldCkpCisgICAgICAgICAgICAgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgIlc6JWQgIiwgZmRwLT5mZCk7CisKKyAgICAgICAgICAgIGlmIChGRF9JU1NFVCAoZmRwLT5mZCwgJmVycl9zZXQpKQorICAgICAgICAgICAgICBtc2dwICs9IHNwcmludGYgKG1zZ3AsICJFOiVkXG5cdCIsIGZkcC0+ZmQpOworICAgICAgICAgIH0KKyAgICAgICAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAiXG4iKTsKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzIixtc2cpOworI2VuZGlmCisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5fZmRzOyBpKyspCisgICAgICAgICAgeworICAgICAgICAgICAgREJ1c1BvbGxGRCAqZmRwID0gJmZkc1tpXTsKKworICAgICAgICAgICAgZmRwLT5yZXZlbnRzID0gMDsKKworICAgICAgICAgICAgaWYgKEZEX0lTU0VUIChmZHAtPmZkLCAmcmVhZF9zZXQpKQorICAgICAgICAgICAgICBmZHAtPnJldmVudHMgfD0gX0RCVVNfUE9MTElOOworCisgICAgICAgICAgICBpZiAoRkRfSVNTRVQgKGZkcC0+ZmQsICZ3cml0ZV9zZXQpKQorICAgICAgICAgICAgICBmZHAtPnJldmVudHMgfD0gX0RCVVNfUE9MTE9VVDsKKworICAgICAgICAgICAgaWYgKEZEX0lTU0VUIChmZHAtPmZkLCAmZXJyX3NldCkpCisgICAgICAgICAgICAgIGZkcC0+cmV2ZW50cyB8PSBfREJVU19QT0xMRVJSOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgcmV0dXJuIHJlYWR5OworI2VuZGlmICAvKiBVU0VfQ0hSSVNfSU1QTCAqLworfQorCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgCitPcmlnaW5hbCBDVlMgdmVyc2lvbiBvZiBkYnVzLXN5c2RlcHMuYworIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXN5c2RlcHMuYyBXcmFwcGVycyBhcm91bmQgc3lzdGVtL2xpYmMgZmVhdHVyZXMgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICogQ29weXJpZ2h0IChDKSAyMDA1IE5vdmVsbCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisKKy8qKgorICogRXhpdCB0aGUgcHJvY2VzcywgcmV0dXJuaW5nIHRoZSBnaXZlbiB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gY29kZSB0aGUgZXhpdCBjb2RlCisgKi8KK3ZvaWQKK19kYnVzX2V4aXQgKGludCBjb2RlKQoreworICBfZXhpdCAoY29kZSk7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIHNvY2tldCBhbmQgY29ubmVjdHMgdG8gYSBzb2NrZXQgYXQgdGhlIGdpdmVuIGhvc3QgCisgKiBhbmQgcG9ydC4gVGhlIGNvbm5lY3Rpb24gZmQgaXMgcmV0dXJuZWQsIGFuZCBpcyBzZXQgdXAgYXMKKyAqIG5vbmJsb2NraW5nLgorICoKKyAqIEBwYXJhbSBob3N0IHRoZSBob3N0IG5hbWUgdG8gY29ubmVjdCB0bworICogQHBhcmFtIHBvcnQgdGhlIHBvcnQgdG8gY29ubmVjdCB0bworICogQHBhcmFtIGZhbWlseSB0aGUgYWRkcmVzcyBmYW1pbHkgdG8gbGlzdGVuIG9uLCBOVUxMIGZvciBhbGwKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9yIGNvZGUKKyAqIEByZXR1cm5zIGNvbm5lY3Rpb24gZmlsZSBkZXNjcmlwdG9yIG9yIC0xIG9uIGVycm9yCisgKi8KK2ludAorX2RidXNfY29ubmVjdF90Y3Bfc29ja2V0IChjb25zdCBjaGFyICAgICAqaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpmYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgcmV0dXJuIF9kYnVzX2Nvbm5lY3RfdGNwX3NvY2tldF93aXRoX25vbmNlIChob3N0LCBwb3J0LCBmYW1pbHksIChjb25zdCBjaGFyKilOVUxMLCBlcnJvcik7Cit9CisKK2ludAorX2RidXNfY29ubmVjdF90Y3Bfc29ja2V0X3dpdGhfbm9uY2UgKGNvbnN0IGNoYXIgICAgICpob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpmYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKm5vbmNlZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIGludCBmZCA9IC0xLCByZXM7CisgIHN0cnVjdCBhZGRyaW5mbyBoaW50czsKKyAgc3RydWN0IGFkZHJpbmZvICphaSwgKnRtcDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBfZGJ1c193aW5fc3RhcnR1cF93aW5zb2NrICgpOworCisgIF9EQlVTX1pFUk8gKGhpbnRzKTsKKworICBpZiAoIWZhbWlseSkKKyAgICBoaW50cy5haV9mYW1pbHkgPSBBRl9VTlNQRUM7CisgIGVsc2UgaWYgKCFzdHJjbXAoZmFtaWx5LCAiaXB2NCIpKQorICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ7CisgIGVsc2UgaWYgKCFzdHJjbXAoZmFtaWx5LCAiaXB2NiIpKQorICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ2OworICBlbHNlCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIGFkZHJlc3MgZmFtaWx5ICVzIiwgZmFtaWx5KTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIGhpbnRzLmFpX3Byb3RvY29sID0gSVBQUk9UT19UQ1A7CisgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisjaWZkZWYgQUlfQUREUkNPTkZJRworICBoaW50cy5haV9mbGFncyA9IEFJX0FERFJDT05GSUc7CisjZWxzZQorICBoaW50cy5haV9mbGFncyA9IDA7CisjZW5kaWYKKworICBpZiAoKHJlcyA9IGdldGFkZHJpbmZvKGhvc3QsIHBvcnQsICZoaW50cywgJmFpKSkgIT0gMCB8fCAhYWkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKHJlcyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBsb29rdXAgaG9zdC9wb3J0OiBcIiVzOiVzXCI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgIGhvc3QsIHBvcnQsIF9kYnVzX3N0cmVycm9yKHJlcyksIHJlcyk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHRtcCA9IGFpOworICB3aGlsZSAodG1wKQorICAgIHsKKyAgICAgIGlmICgoZmQgPSBzb2NrZXQgKHRtcC0+YWlfZmFtaWx5LCBTT0NLX1NUUkVBTSwgMCkpID09IElOVkFMSURfU09DS0VUKQorICAgICAgICB7CisgICAgICAgICAgREJVU19TT0NLRVRfU0VUX0VSUk5PICgpOworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIG9wZW4gc29ja2V0OiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKCkpOworICAgICAgICAgIGZyZWVhZGRyaW5mbyhhaSk7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIoZXJyb3IpOworCisgICAgICBpZiAoY29ubmVjdCAoZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSB0bXAtPmFpX2FkZHIsIHRtcC0+YWlfYWRkcmxlbikgPT0gU09DS0VUX0VSUk9SKQorICAgICAgICB7CisgICAgICAgICAgREJVU19TT0NLRVRfU0VUX0VSUk5PICgpOworICAgICAgICAgIGNsb3Nlc29ja2V0KGZkKTsKKyAgICAgICAgICBmZCA9IC0xOworICAgICAgICAgIHRtcCA9IHRtcC0+YWlfbmV4dDsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICBicmVhazsKKyAgICB9CisgIGZyZWVhZGRyaW5mbyhhaSk7CisKKyAgaWYgKGZkID09IC0xKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjb25uZWN0IHRvIHNvY2tldCBcIiVzOiVzXCIgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGhvc3QsIHBvcnQsIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKCkpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAobm9uY2VmaWxlICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c1N0cmluZyBub25jZWZpbGVTdHI7CisgICAgICBkYnVzX2Jvb2xfdCByZXQ7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmbm9uY2VmaWxlU3RyKSB8fAorICAgICAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kKCZub25jZWZpbGVTdHIsIG5vbmNlZmlsZSkpCisgICAgICAgIHsKKyAgICAgICAgICBjbG9zZXNvY2tldCAoZmQpOworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICByZXQgPSBfZGJ1c19zZW5kX25vbmNlIChmZCwgJm5vbmNlZmlsZVN0ciwgZXJyb3IpOworCisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJm5vbmNlZmlsZVN0cik7CisKKyAgICAgIGlmICghcmV0KQorICAgICAgICB7CisgICAgICAgICAgY2xvc2Vzb2NrZXQgKGZkKTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMgKGZkKTsKKworICBpZiAoIV9kYnVzX3NldF9mZF9ub25ibG9ja2luZyAoZmQsIGVycm9yKSkKKyAgICB7CisgICAgICBjbG9zZXNvY2tldCAoZmQpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICByZXR1cm4gZmQ7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIHNvY2tldCBhbmQgYmluZHMgaXQgdG8gdGhlIGdpdmVuIHBhdGgsIHRoZW4gbGlzdGVucyBvbgorICogdGhlIHNvY2tldC4gVGhlIHNvY2tldCBpcyBzZXQgdG8gYmUgbm9uYmxvY2tpbmcuICBJbiBjYXNlIG9mIHBvcnQ9MAorICogYSByYW5kb20gZnJlZSBwb3J0IGlzIHVzZWQgYW5kIHJldHVybmVkIGluIHRoZSBwb3J0IHBhcmFtZXRlci4KKyAqIElmIGluYWRkcl9hbnkgaXMgc3BlY2lmaWVkLCB0aGUgaG9zdG5hbWUgaXMgaWdub3JlZC4KKyAqCisgKiBAcGFyYW0gaG9zdCB0aGUgaG9zdCBuYW1lIHRvIGxpc3RlbiBvbgorICogQHBhcmFtIHBvcnQgdGhlIHBvcnQgdG8gbGlzdGVuIG9uLCBpZiB6ZXJvIGEgZnJlZSBwb3J0IHdpbGwgYmUgdXNlZCAKKyAqIEBwYXJhbSBmYW1pbHkgdGhlIGFkZHJlc3MgZmFtaWx5IHRvIGxpc3RlbiBvbiwgTlVMTCBmb3IgYWxsCisgKiBAcGFyYW0gcmV0cG9ydCBzdHJpbmcgdG8gcmV0dXJuIHRoZSBhY3R1YWwgcG9ydCBsaXN0ZW5lZCBvbgorICogQHBhcmFtIGZkc19wIGxvY2F0aW9uIHRvIHN0b3JlIHJldHVybmVkIGZpbGUgZGVzY3JpcHRvcnMKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9ycworICogQHJldHVybnMgdGhlIG51bWJlciBvZiBsaXN0ZW5pbmcgZmlsZSBkZXNjcmlwdG9ycyBvciAtMSBvbiBlcnJvcgorICovCisKK2ludAorX2RidXNfbGlzdGVuX3RjcF9zb2NrZXQgKGNvbnN0IGNoYXIgICAgICpob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpmYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgKnJldHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAqKmZkc19wLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgaW50IG5saXN0ZW5fZmQgPSAwLCAqbGlzdGVuX2ZkID0gTlVMTCwgcmVzLCBpLCBwb3J0X251bSA9IC0xOworICBzdHJ1Y3QgYWRkcmluZm8gaGludHM7CisgIHN0cnVjdCBhZGRyaW5mbyAqYWksICp0bXA7CisKKyAgLy8gT24gVmlzdGEsIHNvY2thZGRyX2dlbiBtdXN0IGJlIGEgc29ja2FkZHJfaW42LCBhbmQgbm90IGEgc29ja2FkZHJfaW42X29sZAorICAvL1RoYXQncyByZXF1aXJlZCBmb3IgZmFtaWx5ID09IElQdjYod2hpY2ggaXMgdGhlIGRlZmF1bHQgb24gVmlzdGEgaWYgZmFtaWx5IGlzIG5vdCBnaXZlbikKKyAgLy9TbyB3ZSB1c2Ugb3VyIG93biB1bmlvbiBpbnN0ZWFkIG9mIHNvY2thZGRyX2dlbjoKKworICB0eXBlZGVmIHVuaW9uIHsKKwlzdHJ1Y3Qgc29ja2FkZHIgQWRkcmVzczsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gQWRkcmVzc0luOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgQWRkcmVzc0luNjsKKyAgfSBteXNvY2thZGRyX2dlbjsKKworICAqZmRzX3AgPSBOVUxMOworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBfZGJ1c193aW5fc3RhcnR1cF93aW5zb2NrICgpOworCisgIF9EQlVTX1pFUk8gKGhpbnRzKTsKKworICBpZiAoIWZhbWlseSkKKyAgICBoaW50cy5haV9mYW1pbHkgPSBBRl9VTlNQRUM7CisgIGVsc2UgaWYgKCFzdHJjbXAoZmFtaWx5LCAiaXB2NCIpKQorICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ7CisgIGVsc2UgaWYgKCFzdHJjbXAoZmFtaWx5LCAiaXB2NiIpKQorICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ2OworICBlbHNlCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIGFkZHJlc3MgZmFtaWx5ICVzIiwgZmFtaWx5KTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgaGludHMuYWlfcHJvdG9jb2wgPSBJUFBST1RPX1RDUDsKKyAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKyNpZmRlZiBBSV9BRERSQ09ORklHCisgIGhpbnRzLmFpX2ZsYWdzID0gQUlfQUREUkNPTkZJRyB8IEFJX1BBU1NJVkU7CisjZWxzZQorICBoaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkU7CisjZW5kaWYKKworIHJlZG9fbG9va3VwX3dpdGhfcG9ydDoKKyAgaWYgKChyZXMgPSBnZXRhZGRyaW5mbyhob3N0LCBwb3J0LCAmaGludHMsICZhaSkpICE9IDAgfHwgIWFpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChyZXMpLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gbG9va3VwIGhvc3QvcG9ydDogXCIlczolc1wiOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICBob3N0ID8gaG9zdCA6ICIqIiwgcG9ydCwgX2RidXNfc3RyZXJyb3IocmVzKSwgcmVzKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgdG1wID0gYWk7CisgIHdoaWxlICh0bXApCisgICAgeworICAgICAgaW50IGZkID0gLTEsICpuZXdsaXN0ZW5fZmQ7CisgICAgICBpZiAoKGZkID0gc29ja2V0ICh0bXAtPmFpX2ZhbWlseSwgU09DS19TVFJFQU0sIDApKSA9PSBJTlZBTElEX1NPQ0tFVCkKKyAgICAgICAgeworICAgICAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIG9wZW4gc29ja2V0OiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcik7CisKKyAgICAgIGlmIChiaW5kIChmZCwgKHN0cnVjdCBzb2NrYWRkciopIHRtcC0+YWlfYWRkciwgdG1wLT5haV9hZGRybGVuKSA9PSBTT0NLRVRfRVJST1IpCisgICAgICAgIHsKKyAgICAgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYmluZCBzb2NrZXQgXCIlczolc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QgPyBob3N0IDogIioiLCBwb3J0LCBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICAgICAgICBjbG9zZXNvY2tldCAoZmQpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICAgICAgaWYgKGxpc3RlbiAoZmQsIDMwIC8qIGJhY2tsb2cgKi8pID09IFNPQ0tFVF9FUlJPUikKKyAgICAgICAgeworICAgICAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBsaXN0ZW4gb24gc29ja2V0IFwiJXM6JXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0ID8gaG9zdCA6ICIqIiwgcG9ydCwgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICAgICAgY2xvc2Vzb2NrZXQgKGZkKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisgICAgICBuZXdsaXN0ZW5fZmQgPSBkYnVzX3JlYWxsb2MobGlzdGVuX2ZkLCBzaXplb2YoaW50KSoobmxpc3Rlbl9mZCsxKSk7CisgICAgICBpZiAoIW5ld2xpc3Rlbl9mZCkKKyAgICAgICAgeworICAgICAgICAgIGNsb3Nlc29ja2V0IChmZCk7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBmaWxlIGhhbmRsZSBhcnJheSIpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICBsaXN0ZW5fZmQgPSBuZXdsaXN0ZW5fZmQ7CisgICAgICBsaXN0ZW5fZmRbbmxpc3Rlbl9mZF0gPSBmZDsKKyAgICAgIG5saXN0ZW5fZmQrKzsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aChyZXRwb3J0KSkKKyAgICAgICAgeworICAgICAgICAgIC8qIElmIHRoZSB1c2VyIGRpZG4ndCBzcGVjaWZ5IGEgcG9ydCwgb3IgdXNlZCAwLCB0aGVuCisgICAgICAgICAgICAgdGhlIGtlcm5lbCBjaG9vc2VzIGEgcG9ydC4gQWZ0ZXIgdGhlIGZpcnN0IGFkZHJlc3MKKyAgICAgICAgICAgICBpcyBib3VuZCB0bywgd2UgbmVlZCB0byBmb3JjZSBhbGwgcmVtYWluaW5nIGFkZHJlc3NlcworICAgICAgICAgICAgIHRvIHVzZSB0aGUgc2FtZSBwb3J0ICovCisgICAgICAgICAgaWYgKCFwb3J0IHx8ICFzdHJjbXAocG9ydCwgIjAiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbXlzb2NrYWRkcl9nZW4gYWRkcjsKKyAgICAgICAgICAgICAgc29ja2xlbl90IGFkZHJsZW4gPSBzaXplb2YoYWRkcik7CisgICAgICAgICAgICAgIGNoYXIgcG9ydGJ1ZlsxMF07CisKKyAgICAgICAgICAgICAgaWYgKGdldHNvY2tuYW1lKGZkLCAmYWRkci5BZGRyZXNzLCAmYWRkcmxlbikgPT0gU09DS0VUX0VSUk9SKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVzb2x2ZSBwb3J0IFwiJXM6JXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QgPyBob3N0IDogIioiLCBwb3J0LCBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vKCkpOworICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBzbnByaW50ZiggcG9ydGJ1Ziwgc2l6ZW9mKCBwb3J0YnVmICkgLSAxLCAiJWQiLCBhZGRyLkFkZHJlc3NJbi5zaW5fcG9ydCApOworICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQocmV0cG9ydCwgcG9ydGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogUmVsZWFzZSBjdXJyZW50IGFkZHJlc3MgbGlzdCAmIHJlZG8gbG9va3VwICovCisgICAgICAgICAgICAgIHBvcnQgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEocmV0cG9ydCk7CisgICAgICAgICAgICAgIGZyZWVhZGRyaW5mbyhhaSk7CisgICAgICAgICAgICAgIGdvdG8gcmVkb19sb29rdXBfd2l0aF9wb3J0OworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kKHJldHBvcnQsIHBvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAKKyAgICAgIHRtcCA9IHRtcC0+YWlfbmV4dDsKKyAgICB9CisgIGZyZWVhZGRyaW5mbyhhaSk7CisgIGFpID0gTlVMTDsKKworICBpZiAoIW5saXN0ZW5fZmQpCisgICAgeworICAgICAgX2RidXNfd2luX3NldF9lcnJubyAoV1NBRUFERFJJTlVTRSk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGJpbmQgc29ja2V0IFwiJXM6JXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGhvc3QgPyBob3N0IDogIioiLCBwb3J0LCBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgc3NjYW5mKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YShyZXRwb3J0KSwgIiVkIiwgJnBvcnRfbnVtKTsKKworICBmb3IgKGkgPSAwIDsgaSA8IG5saXN0ZW5fZmQgOyBpKyspCisgICAgeworICAgICAgX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMgKGxpc3Rlbl9mZFtpXSk7CisgICAgICBpZiAoIV9kYnVzX3NldF9mZF9ub25ibG9ja2luZyAobGlzdGVuX2ZkW2ldLCBlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgIH0KKworICAqZmRzX3AgPSBsaXN0ZW5fZmQ7CisKKyAgcmV0dXJuIG5saXN0ZW5fZmQ7CisKKyBmYWlsZWQ6CisgIGlmIChhaSkKKyAgICBmcmVlYWRkcmluZm8oYWkpOworICBmb3IgKGkgPSAwIDsgaSA8IG5saXN0ZW5fZmQgOyBpKyspCisgICAgY2xvc2Vzb2NrZXQgKGxpc3Rlbl9mZFtpXSk7CisgIGRidXNfZnJlZShsaXN0ZW5fZmQpOworICByZXR1cm4gLTE7Cit9CisKKworLyoqCisgKiBBY2NlcHRzIGEgY29ubmVjdGlvbiBvbiBhIGxpc3RlbmluZyBzb2NrZXQuCisgKiBIYW5kbGVzIEVJTlRSIGZvciB5b3UuCisgKgorICogQHBhcmFtIGxpc3Rlbl9mZCB0aGUgbGlzdGVuIGZpbGUgZGVzY3JpcHRvcgorICogQHJldHVybnMgdGhlIGNvbm5lY3Rpb24gZmQgb2YgdGhlIGNsaWVudCwgb3IgLTEgb24gZXJyb3IKKyAqLworaW50CitfZGJ1c19hY2NlcHQgIChpbnQgbGlzdGVuX2ZkKQoreworICBpbnQgY2xpZW50X2ZkOworCisgcmV0cnk6CisgIGNsaWVudF9mZCA9IGFjY2VwdCAobGlzdGVuX2ZkLCBOVUxMLCBOVUxMKTsKKworICBpZiAoREJVU19TT0NLRVRfSVNfSU5WQUxJRCAoY2xpZW50X2ZkKSkKKyAgICB7CisgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpCisgICAgICAgIGdvdG8gcmV0cnk7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJjbGllbnQgZmQgJWQgYWNjZXB0ZWRcbiIsIGNsaWVudF9mZCk7CisgIAorICByZXR1cm4gY2xpZW50X2ZkOworfQorCisKKworCitkYnVzX2Jvb2xfdAorX2RidXNfc2VuZF9jcmVkZW50aWFsc19zb2NrZXQgKGludCAgICAgICAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKy8qIEZJWE1FOiBmb3IgdGhlIHNlc3Npb24gYnVzIGNyZWRlbnRpYWxzIHNob3VsZG4ndCBtYXR0ZXIgKD8pLCBidXQKKyAqIGZvciB0aGUgc3lzdGVtIGJ1cyB0aGV5IGFyZSBwcmVzdW1hYmx5IGVzc2VudGlhbC4gQSByb3VnaCBvdXRsaW5lCisgKiBvZiBhIHdheSB0byBpbXBsZW1lbnQgdGhlIGNyZWRlbnRpYWwgdHJhbnNmZXIgd291bGQgYmUgdGhpczoKKyAqCisgKiBjbGllbnQgd2FpdHMgdG8gKnJlYWQqIGEgYnl0ZS4KKyAqCisgKiBzZXJ2ZXIgY3JlYXRlcyBhIG5hbWVkIHBpcGUgd2l0aCBhIHJhbmRvbSBuYW1lLCBzZW5kcyBhIGJ5dGUKKyAqIGNvbnRpbmluZyBpdHMgbGVuZ3RoLCBhbmQgaXRzIG5hbWUuCisgKgorICogY2xpZW50IHJlYWRzIHRoZSBuYW1lLCBjb25uZWN0cyB0byBpdCAodXNpbmcgV2luMzIgQVBJKS4KKyAqCisgKiBzZXJ2ZXIgd2FpdHMgZm9yIGNvbm5lY3Rpb24gdG8gdGhlIG5hbWVkIHBpcGUsIHRoZW4gY2FsbHMKKyAqIEltcGVyc29uYXRlTmFtZWRQaXBlQ2xpZW50KCksIG5vdGVzIGl0cyBub3ctY3VycmVudCBjcmVkZW50aWFscywKKyAqIGNhbGxzIFJldmVydFRvU2VsZigpLCBjbG9zZXMgaXRzIGhhbmRsZXMgdG8gdGhlIG5hbWVkIHBpcGUsIGFuZAorICogaXMgZG9uZS4gKE1heWJlIHRoZXJlIGlzIHNvbWUgb3RoZXIgd2F5IHRvIGdldCB0aGUgU0lEIG9mIGEgbmFtZWQKKyAqIHBpcGUgY2xpZW50IHdpdGhvdXQgaGF2aW5nIHRvIHVzZSBpbXBlcnNvbmF0aW9uPykKKyAqCisgKiBjbGllbnQgY2xvc2VzIGl0cyBoYW5kbGVzIGFuZCBpcyBkb25lLgorICogCisgKiBSYWxmOiBXaHkgbm90IHNlbmRpbmcgY3JlZGVudGlhbHMgb3ZlciB0aGUgZ2l2ZW4gdGhpcyBjb25uZWN0aW9uID8KKyAqIFVzaW5nIG5hbWVkIHBpcGVzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gYmUgY29ubmVjdGVkIGZyb20gYSB1bml4IGNsaWVudC4gIAorICoKKyAqLworICBpbnQgYnl0ZXNfd3JpdHRlbjsKKyAgREJ1c1N0cmluZyBidWY7IAorCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbiAoJmJ1ZiwgIlwwIiwgMSk7CithZ2FpbjoKKyAgYnl0ZXNfd3JpdHRlbiA9IF9kYnVzX3dyaXRlX3NvY2tldCAoaGFuZGxlLCAmYnVmLCAwLCAxICk7CisKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPCAwICYmIGVycm5vID09IEVJTlRSKQorICAgIGdvdG8gYWdhaW47CisKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gd3JpdGUgY3JlZGVudGlhbHMgYnl0ZTogJXMiLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlIGlmIChieXRlc193cml0dGVuID09IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lPX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJ3cm90ZSB6ZXJvIGJ5dGVzIHdyaXRpbmcgY3JlZGVudGlhbHMgYnl0ZSIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoYnl0ZXNfd3JpdHRlbiA9PSAxKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ3cm90ZSAxIHplcm8gYnl0ZSwgY3JlZGVudGlhbCBzZW5kaW5nIGlzbid0IGltcGxlbWVudGVkIHlldFxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFJlYWRzIGEgc2luZ2xlIGJ5dGUgd2hpY2ggbXVzdCBiZSBudWwgKGFuIGVycm9yIG9jY3VycyBvdGhlcndpc2UpLAorICogYW5kIHJlYWRzIHVuaXggY3JlZGVudGlhbHMgaWYgYXZhaWxhYmxlLiBGaWxscyBpbiBwaWQvdWlkL2dpZCB3aXRoCisgKiAtMSBpZiBubyBjcmVkZW50aWFscyBhcmUgYXZhaWxhYmxlLiBSZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIKKyAqIGEgYnl0ZSB3YXMgcmVhZCwgbm90IHdoZXRoZXIgd2UgZ290IHZhbGlkIGNyZWRlbnRpYWxzLiBPbiBzb21lCisgKiBzeXN0ZW1zLCBzdWNoIGFzIExpbnV4LCByZWFkaW5nL3dyaXRpbmcgdGhlIGJ5dGUgaXNuJ3QgYWN0dWFsbHkKKyAqIHJlcXVpcmVkLCBidXQgd2UgZG8gaXQgYW55d2F5IGp1c3QgdG8gYXZvaWQgbXVsdGlwbGUgY29kZXBhdGhzLgorICogCisgKiBGYWlscyBpZiBubyBieXRlIGlzIGF2YWlsYWJsZSwgc28geW91IG11c3Qgc2VsZWN0KCkgZmlyc3QuCisgKgorICogVGhlIHBvaW50IG9mIHRoZSBieXRlIGlzIHRoYXQgb24gc29tZSBzeXN0ZW1zIHdlIGhhdmUgdG8KKyAqIHVzZSBzZW5kbXNnKCkvcmVjdm1zZygpIHRvIHRyYW5zbWl0IGNyZWRlbnRpYWxzLgorICoKKyAqIEBwYXJhbSBjbGllbnRfZmQgdGhlIGNsaWVudCBmaWxlIGRlc2NyaXB0b3IKKyAqIEBwYXJhbSBjcmVkZW50aWFscyBzdHJ1Y3QgdG8gZmlsbCB3aXRoIGNyZWRlbnRpYWxzIG9mIGNsaWVudAorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIGVycm9yIGNvZGUKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3JlYWRfY3JlZGVudGlhbHNfc29ja2V0ICAoaW50ICAgICAgICAgICAgICBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFscyAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IpCit7CisgIGludCBieXRlc19yZWFkID0gMDsKKyAgREJ1c1N0cmluZyBidWY7CisgIAorICAvLyBjb3VsZCBmYWlsIGR1ZSB0b28gT09NCisgIGlmIChfZGJ1c19zdHJpbmdfaW5pdCgmYnVmKSkKKyAgICB7CisgICAgICBieXRlc19yZWFkID0gX2RidXNfcmVhZF9zb2NrZXQoaGFuZGxlLCAmYnVmLCAxICk7CisKKyAgICAgIGlmIChieXRlc19yZWFkID4gMCkgCisgICAgICAgIF9kYnVzX3ZlcmJvc2UoImdvdCBvbmUgemVybyBieXRlIGZyb20gc2VydmVyIik7CisKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlKCZidWYpOworICAgIH0KKworICBfZGJ1c19jcmVkZW50aWFsc19hZGRfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKGNyZWRlbnRpYWxzKTsKKyAgX2RidXNfdmVyYm9zZSgiRklYTUU6IGdldCBmYWtlZCBjcmVkZW50aWFscyBmcm9tIGN1cnJlbnQgcHJvY2VzcyIpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyogQ2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGUgZ2l2ZW4gZGlyZWN0b3J5IGlzIAorKiBwcml2YXRlIHRvIHRoZSB1c2VyIAorKgorKiBAcGFyYW0gZGlyIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkKKyogQHBhcmFtIGVycm9yIGVycm9yIHJldHVybgorKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZQorKiovCitkYnVzX2Jvb2xfdAorX2RidXNfY2hlY2tfZGlyX2lzX3ByaXZhdGVfdG9fdXNlciAoREJ1c1N0cmluZyAqZGlyLCBEQnVzRXJyb3IgKmVycm9yKQoreworICAvKiBUT0RPICovCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworCisvKioKKyAqIEFwcGVuZHMgdGhlIGdpdmVuIGZpbGVuYW1lIHRvIHRoZSBnaXZlbiBkaXJlY3RvcnkuCisgKgorICogQHRvZG8gaXQgbWlnaHQgYmUgY3V0ZSB0byBjb2xsYXBzZSBtdWx0aXBsZSAnLycgc3VjaCBhcyAiZm9vLy8iCisgKiBjb25jYXQgIi8vYmFyIgorICoKKyAqIEBwYXJhbSBkaXIgdGhlIGRpcmVjdG9yeSBuYW1lCisgKiBAcGFyYW0gbmV4dF9jb21wb25lbnQgdGhlIGZpbGVuYW1lCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlIChEQnVzU3RyaW5nICAgICAgICpkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpuZXh0X2NvbXBvbmVudCkKK3sKKyAgZGJ1c19ib29sX3QgZGlyX2VuZHNfaW5fc2xhc2g7CisgIGRidXNfYm9vbF90IGZpbGVfc3RhcnRzX3dpdGhfc2xhc2g7CisKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkaXIpID09IDAgfHwKKyAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChuZXh0X2NvbXBvbmVudCkgPT0gMCkKKyAgICByZXR1cm4gVFJVRTsKKworICBkaXJfZW5kc19pbl9zbGFzaCA9CisgICAgKCcvJyA9PSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGRpciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRpcikgLSAxKSB8fAorICAgICAnXFwnID09IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZGlyLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGlyKSAtIDEpKTsKKworICBmaWxlX3N0YXJ0c193aXRoX3NsYXNoID0KKyAgICAoJy8nID09IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAobmV4dF9jb21wb25lbnQsIDApIHx8CisgICAgICdcXCcgPT0gX2RidXNfc3RyaW5nX2dldF9ieXRlIChuZXh0X2NvbXBvbmVudCwgMCkpOworCisgIGlmIChkaXJfZW5kc19pbl9zbGFzaCAmJiBmaWxlX3N0YXJ0c193aXRoX3NsYXNoKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19zaG9ydGVuIChkaXIsIDEpOworICAgIH0KKyAgZWxzZSBpZiAoIShkaXJfZW5kc19pbl9zbGFzaCB8fCBmaWxlX3N0YXJ0c193aXRoX3NsYXNoKSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoZGlyLCAnXFwnKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gX2RidXNfc3RyaW5nX2NvcHkgKG5leHRfY29tcG9uZW50LCAwLCBkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRpcikpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0gREJ1c0NyZWRlbnRpYWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEFkZHMgdGhlIGNyZWRlbnRpYWxzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHVzZXJuYW1lLgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyBjcmVkZW50aWFscyB0byBmaWxsIGluIAorICogQHBhcmFtIHVzZXJuYW1lIHRoZSB1c2VybmFtZQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIHVzZXJuYW1lIGV4aXN0ZWQgYW5kIHdlIGdvdCBzb21lIGNyZWRlbnRpYWxzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc19hZGRfZnJvbV91c2VyIChEQnVzQ3JlZGVudGlhbHMgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICp1c2VybmFtZSkKK3sKKyAgcmV0dXJuIF9kYnVzX2NyZWRlbnRpYWxzX2FkZF93aW5kb3dzX3NpZCAoY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSh1c2VybmFtZSkpOworfQorCisvKioKKyAqIEFkZHMgdGhlIGNyZWRlbnRpYWxzIG9mIHRoZSBjdXJyZW50IHByb2Nlc3MgdG8gdGhlCisgKiBwYXNzZWQtaW4gY3JlZGVudGlhbHMgb2JqZWN0LgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyBjcmVkZW50aWFscyB0byBhZGQgdG8KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnk7IGRvZXMgbm90IHByb3Blcmx5IHJvbGwgYmFjayBvbiBmYWlsdXJlLCBzbyBvbmx5IHNvbWUgY3JlZGVudGlhbHMgbWF5IGhhdmUgYmVlbiBhZGRlZAorICovCisKK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc19hZGRfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKERCdXNDcmVkZW50aWFscyAqY3JlZGVudGlhbHMpCit7CisgIGRidXNfYm9vbF90IHJldHZhbCA9IEZBTFNFOworICBjaGFyICpzaWQgPSBOVUxMOworCisgIGlmICghX2RidXNfZ2V0c2lkKCZzaWQpKQorICAgIGdvdG8gZmFpbGVkOworCisgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX3VuaXhfcGlkKGNyZWRlbnRpYWxzLCBfZGJ1c19nZXRwaWQoKSkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfd2luZG93c19zaWQgKGNyZWRlbnRpYWxzLHNpZCkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKyAgZ290byBlbmQ7CitmYWlsZWQ6CisgIHJldHZhbCA9IEZBTFNFOworZW5kOgorICBpZiAoc2lkKQorICAgIExvY2FsRnJlZShzaWQpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogQXBwZW5kIHRvIHRoZSBzdHJpbmcgdGhlIGlkZW50aXR5IHdlIHdvdWxkIGxpa2UgdG8gaGF2ZSB3aGVuIHdlCisgKiBhdXRoZW50aWNhdGUsIG9uIFVOSVggdGhpcyBpcyB0aGUgY3VycmVudCBwcm9jZXNzIFVJRCBhbmQgb24KKyAqIFdpbmRvd3Mgc29tZXRoaW5nIGVsc2UsIHByb2JhYmx5IGEgV2luZG93cyBTSUQgc3RyaW5nLiAgTm8gZXNjYXBpbmcKKyAqIGlzIHJlcXVpcmVkLCB0aGF0IGlzIGRvbmUgaW4gZGJ1cy1hdXRoLmMuIFRoZSB1c2VybmFtZSBoZXJlCisgKiBuZWVkIG5vdCBiZSBhbnl0aGluZyBodW1hbi1yZWFkYWJsZSwgaXQgY2FuIGJlIHRoZSBtYWNoaW5lLXJlYWRhYmxlCisgKiBmb3JtIGkuZS4gYSB1c2VyIGlkLgorICogCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gYXBwZW5kIHRvCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gbm8gbWVtb3J5CisgKiBAdG9kbyB0byB3aGljaCBjbGFzcyBiZWxvbmdzIHRoaXMgCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hcHBlbmRfdXNlcl9mcm9tX2N1cnJlbnRfcHJvY2VzcyAoREJ1c1N0cmluZyAqc3RyKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWwgPSBGQUxTRTsKKyAgY2hhciAqc2lkID0gTlVMTDsKKworICBpZiAoIV9kYnVzX2dldHNpZCgmc2lkKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dmFsID0gX2RidXNfc3RyaW5nX2FwcGVuZCAoc3RyLHNpZCk7CisKKyAgTG9jYWxGcmVlKHNpZCk7CisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogR2V0cyBvdXIgcHJvY2VzcyBJRAorICogQHJldHVybnMgcHJvY2VzcyBJRAorICovCitkYnVzX3BpZF90CitfZGJ1c19nZXRwaWQgKHZvaWQpCit7CisgIHJldHVybiBHZXRDdXJyZW50UHJvY2Vzc0lkICgpOworfQorCisvKiogbmFub3NlY29uZHMgaW4gYSBzZWNvbmQgKi8KKyNkZWZpbmUgTkFOT1NFQ09ORFNfUEVSX1NFQ09ORCAgICAgICAxMDAwMDAwMDAwCisvKiogbWljcm9zZWNvbmRzIGluIGEgc2Vjb25kICovCisjZGVmaW5lIE1JQ1JPU0VDT05EU19QRVJfU0VDT05EICAgICAgMTAwMDAwMAorLyoqIG1pbGxpc2Vjb25kcyBpbiBhIHNlY29uZCAqLworI2RlZmluZSBNSUxMSVNFQ09ORFNfUEVSX1NFQ09ORCAgICAgIDEwMDAKKy8qKiBuYW5vc2Vjb25kcyBpbiBhIG1pbGxpc2Vjb25kICovCisjZGVmaW5lIE5BTk9TRUNPTkRTX1BFUl9NSUxMSVNFQ09ORCAgMTAwMDAwMAorLyoqIG1pY3Jvc2Vjb25kcyBpbiBhIG1pbGxpc2Vjb25kICovCisjZGVmaW5lIE1JQ1JPU0VDT05EU19QRVJfTUlMTElTRUNPTkQgMTAwMAorCisvKioKKyAqIFNsZWVwcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4KKyAqIEBwYXJhbSBtaWxsaXNlY29uZHMgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcworICovCit2b2lkCitfZGJ1c19zbGVlcF9taWxsaXNlY29uZHMgKGludCBtaWxsaXNlY29uZHMpCit7CisgIFNsZWVwIChtaWxsaXNlY29uZHMpOworfQorCisKKy8qKgorICogR2V0IGN1cnJlbnQgdGltZSwgYXMgaW4gZ2V0dGltZW9mZGF5KCkuIE5ldmVyIHVzZXMgdGhlIG1vbm90b25pYworICogY2xvY2suCisgKgorICogQHBhcmFtIHR2X3NlYyByZXR1cm4gbG9jYXRpb24gZm9yIG51bWJlciBvZiBzZWNvbmRzCisgKiBAcGFyYW0gdHZfdXNlYyByZXR1cm4gbG9jYXRpb24gZm9yIG51bWJlciBvZiBtaWNyb3NlY29uZHMKKyAqLwordm9pZAorX2RidXNfZ2V0X3JlYWxfdGltZSAobG9uZyAqdHZfc2VjLAorICAgICAgICAgICAgICAgICAgICAgbG9uZyAqdHZfdXNlYykKK3sKKyAgRklMRVRJTUUgZnQ7CisgIGRidXNfdWludDY0X3QgdGltZTY0OworCisgIEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lICgmZnQpOworCisgIG1lbWNweSAoJnRpbWU2NCwgJmZ0LCBzaXplb2YgKHRpbWU2NCkpOworCisgIC8qIENvbnZlcnQgZnJvbSAxMDBzIG9mIG5hbm9zZWNvbmRzIHNpbmNlIDE2MDEtMDEtMDEKKyAgKiB0byBVbml4IGVwb2NoLiBZZXMsIHRoaXMgaXMgWTIwMzggdW5zYWZlLgorICAqLworICB0aW1lNjQgLT0gREJVU19JTlQ2NF9DT05TVEFOVCAoMTE2NDQ0NzM2MDAwMDAwMDAwKTsKKyAgdGltZTY0IC89IDEwOworCisgIGlmICh0dl9zZWMpCisgICAgKnR2X3NlYyA9IHRpbWU2NCAvIDEwMDAwMDA7CisKKyAgaWYgKHR2X3VzZWMpCisgICAgKnR2X3VzZWMgPSB0aW1lNjQgJSAxMDAwMDAwOworfQorCisvKioKKyAqIEdldCBjdXJyZW50IHRpbWUsIGFzIGluIGdldHRpbWVvZmRheSgpLiBVc2UgdGhlIG1vbm90b25pYyBjbG9jayBpZgorICogYXZhaWxhYmxlLCB0byBhdm9pZCBwcm9ibGVtcyB3aGVuIHRoZSBzeXN0ZW0gdGltZSBjaGFuZ2VzLgorICoKKyAqIEBwYXJhbSB0dl9zZWMgcmV0dXJuIGxvY2F0aW9uIGZvciBudW1iZXIgb2Ygc2Vjb25kcworICogQHBhcmFtIHR2X3VzZWMgcmV0dXJuIGxvY2F0aW9uIGZvciBudW1iZXIgb2YgbWljcm9zZWNvbmRzCisgKi8KK3ZvaWQKK19kYnVzX2dldF9tb25vdG9uaWNfdGltZSAobG9uZyAqdHZfc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICp0dl91c2VjKQoreworICAvKiBubyBpbXBsZW1lbnRhdGlvbiB5ZXQsIGZhbGwgYmFjayB0byB3YWxsLWNsb2NrIHRpbWUgKi8KKyAgX2RidXNfZ2V0X3JlYWxfdGltZSAodHZfc2VjLCB0dl91c2VjKTsKK30KKworLyoqCisgKiBzaWduYWwgKFNJR1BJUEUsIFNJR19JR04pOworICovCit2b2lkCitfZGJ1c19kaXNhYmxlX3NpZ3BpcGUgKHZvaWQpCit7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIGRpcmVjdG9yeTsgc3VjY2VlZHMgaWYgdGhlIGRpcmVjdG9yeQorICogaXMgY3JlYXRlZCBvciBhbHJlYWR5IGV4aXN0ZWQuCisgKgorICogQHBhcmFtIGZpbGVuYW1lIGRpcmVjdG9yeSBmaWxlbmFtZQorICogQHBhcmFtIGVycm9yIGluaXRpYWxpemVkIGVycm9yIG9iamVjdAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlYXRlX2RpcmVjdG9yeSAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqZmlsZW5hbWVfYzsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBmaWxlbmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSk7CisKKyAgaWYgKCFDcmVhdGVEaXJlY3RvcnlBIChmaWxlbmFtZV9jLCBOVUxMKSkKKyAgICB7CisgICAgICBpZiAoR2V0TGFzdEVycm9yICgpID09IEVSUk9SX0FMUkVBRFlfRVhJU1RTKQorICAgICAgICByZXR1cm4gVFJVRTsKKworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBkaXJlY3RvcnkgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MsIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKCkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBnaXZlbiBudW1iZXIgb2YgcmFuZG9tIGJ5dGVzLAorICogdXNpbmcgdGhlIGJlc3QgbWVjaGFuaXNtIHdlIGNhbiBjb21lIHVwIHdpdGguCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gbl9ieXRlcyB0aGUgbnVtYmVyIG9mIHJhbmRvbSBieXRlcyB0byBhcHBlbmQgdG8gc3RyaW5nCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYnl0ZXMgKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbl9ieXRlcykKK3sKKyAgaW50IG9sZF9sZW47CisgIGNoYXIgKnA7CisgIEhDUllQVFBST1YgaHByb3Y7CisKKyAgb2xkX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2xlbmd0aGVuIChzdHIsIG5fYnl0ZXMpKQorICAgIHJldHVybiBGQUxTRTsKKworICBwID0gX2RidXNfc3RyaW5nX2dldF9kYXRhX2xlbiAoc3RyLCBvbGRfbGVuLCBuX2J5dGVzKTsKKworICBpZiAoIUNyeXB0QWNxdWlyZUNvbnRleHQgKCZocHJvdiwgTlVMTCwgTlVMTCwgUFJPVl9SU0FfRlVMTCwgQ1JZUFRfVkVSSUZZQ09OVEVYVCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghQ3J5cHRHZW5SYW5kb20gKGhwcm92LCBuX2J5dGVzLCBwKSkKKyAgICB7CisgICAgICBDcnlwdFJlbGVhc2VDb250ZXh0IChocHJvdiwgMCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIENyeXB0UmVsZWFzZUNvbnRleHQgKGhwcm92LCAwKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBHZXRzIHRoZSB0ZW1wb3JhcnkgZmlsZXMgZGlyZWN0b3J5IGJ5IGluc3BlY3RpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyAKKyAqIFRNUERJUiwgVE1QLCBhbmQgVEVNUCBpbiB0aGF0IG9yZGVyLiBJZiBub25lIG9mIHRob3NlIGFyZSBzZXQgIi90bXAiIGlzIHJldHVybmVkCisgKgorICogQHJldHVybnMgbG9jYXRpb24gb2YgdGVtcCBkaXJlY3RvcnkKKyAqLworY29uc3QgY2hhcioKK19kYnVzX2dldF90bXBkaXIodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIqIHRtcGRpciA9IE5VTEw7CisgIHN0YXRpYyBjaGFyIGJ1ZlsxMDAwXTsKKworICBpZiAodG1wZGlyID09IE5VTEwpCisgICAgeworICAgICAgY2hhciAqbGFzdF9zbGFzaDsKKworICAgICAgaWYgKCFHZXRUZW1wUGF0aEEgKHNpemVvZiAoYnVmKSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJHZXRUZW1wUGF0aCBmYWlsZWRcbiIpOworICAgICAgICAgIF9kYnVzX2Fib3J0ICgpOworICAgICAgICB9CisKKyAgICAgIC8qIERyb3AgdGVybWluYXRpbmcgYmFja3NsYXNoIG9yIHNsYXNoICovCisgICAgICBsYXN0X3NsYXNoID0gX21ic3JjaHIgKGJ1ZiwgJ1xcJyk7CisgICAgICBpZiAobGFzdF9zbGFzaCA+IGJ1ZiAmJiBsYXN0X3NsYXNoWzFdID09ICdcMCcpCisgICAgICAgIGxhc3Rfc2xhc2hbMF0gPSAnXDAnOworICAgICAgbGFzdF9zbGFzaCA9IF9tYnNyY2hyIChidWYsICcvJyk7CisgICAgICBpZiAobGFzdF9zbGFzaCA+IGJ1ZiAmJiBsYXN0X3NsYXNoWzFdID09ICdcMCcpCisgICAgICAgIGxhc3Rfc2xhc2hbMF0gPSAnXDAnOworCisgICAgICB0bXBkaXIgPSBidWY7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCh0bXBkaXIgIT0gTlVMTCk7CisKKyAgcmV0dXJuIHRtcGRpcjsKK30KKworCisvKioKKyAqIERlbGV0ZXMgdGhlIGdpdmVuIGZpbGUuCisgKgorICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlbmFtZQorICogQHBhcmFtIGVycm9yIGVycm9yIGxvY2F0aW9uCisgKiAKKyAqIEByZXR1cm5zICNUUlVFIGlmIHVubGluaygpIHN1Y2NlZWRlZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZGVsZXRlX2ZpbGUgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpmaWxlbmFtZV9jOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKworICBpZiAoRGVsZXRlRmlsZUEgKGZpbGVuYW1lX2MpID09IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGRlbGV0ZSBmaWxlICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9jLCBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIHJlcGxhY2VzIHRoZSB0ZXJtIERCVVNfUFJFRklYIGluIGNvbmZpZ3VyZV90aW1lX3BhdGggYnkgdGhlCisgKiBjdXJyZW50IGRidXMgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4gT24gdW5peCB0aGlzIGZ1bmN0aW9uIGlzIGEgbm9vcAorICoKKyAqIEBwYXJhbSBjb25maWd1cmVfdGltZV9wYXRoCisgKiBAcmV0dXJuIHJlYWwgcGF0aAorICovCitjb25zdCBjaGFyICoKK19kYnVzX3JlcGxhY2VfaW5zdGFsbF9wcmVmaXggKGNvbnN0IGNoYXIgKmNvbmZpZ3VyZV90aW1lX3BhdGgpCit7CisjaWZuZGVmIERCVVNfUFJFRklYCisgIHJldHVybiBjb25maWd1cmVfdGltZV9wYXRoOworI2Vsc2UKKyAgc3RhdGljIGNoYXIgcmV0dmFsWzEwMDBdOworICBzdGF0aWMgY2hhciBydW50aW1lX3ByZWZpeFsxMDAwXTsKKyAgaW50IGxlbiA9IDEwMDA7CisgIGludCBpOworCisgIGlmICghY29uZmlndXJlX3RpbWVfcGF0aCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoKCFfZGJ1c19nZXRfaW5zdGFsbF9yb290KHJ1bnRpbWVfcHJlZml4LCBsZW4pIHx8CisgICAgICAgc3RybmNtcCAoY29uZmlndXJlX3RpbWVfcGF0aCwgREJVU19QUkVGSVggIi8iLAorICAgICAgICAgICAgICAgIHN0cmxlbiAoREJVU19QUkVGSVgpICsgMSkpKSB7CisgICAgIHN0cmNhdCAocmV0dmFsLCBjb25maWd1cmVfdGltZV9wYXRoKTsKKyAgICAgcmV0dXJuIHJldHZhbDsKKyAgfQorCisgIHN0cmNweSAocmV0dmFsLCBydW50aW1lX3ByZWZpeCk7CisgIHN0cmNhdCAocmV0dmFsLCBjb25maWd1cmVfdGltZV9wYXRoICsgc3RybGVuIChEQlVTX1BSRUZJWCkgKyAxKTsKKworICAvKiBTb21laG93LCBpbiBzb21lIHNpdHVhdGlvbnMsIGJhY2tzbGFzaGVzIGdldCBjb2xsYXBzZWQgaW4gdGhlIHN0cmluZy4KKyAgICogU2luY2Ugd2luZG93cyBDIGxpYnJhcnkgYWNjZXB0cyBib3RoIGZvcndhcmQgYW5kIGJhY2tzbGFzaGVzIGFzCisgICAqIHBhdGggc2VwYXJhdG9ycywgY29udmVydCBhbGwgYmFja3NsYXNoZXMgdG8gZm9yd2FyZCBzbGFzaGVzLgorICAgKi8KKworICBmb3IoaSA9IDA7IHJldHZhbFtpXSAhPSAnXDAnOyBpKyspIHsKKyAgICBpZihyZXR2YWxbaV0gPT0gJ1xcJykKKyAgICAgIHJldHZhbFtpXSA9ICcvJzsKKyAgfQorICByZXR1cm4gcmV0dmFsOworI2VuZGlmCit9CisKKyNpZiAhZGVmaW5lZCAoREJVU19ESVNBQkxFX0FTU0VSVFMpIHx8IGRlZmluZWQoREJVU19CVUlMRF9URVNUUykKKworI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoREJVU19XSU5DRSkKKyMgaWZkZWYgQkFDS1RSQUNFUworIyAgdW5kZWYgQkFDS1RSQUNFUworIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIEJBQ0tUUkFDRVMKKyNlbmRpZgorCisjaWZkZWYgQkFDS1RSQUNFUworLyoKKyAqIEJhY2t0cmFjZSBHZW5lcmF0b3IKKyAqCisgKiBDb3B5cmlnaHQgMjAwNCBFcmljIFBvZWNoCisgKiBDb3B5cmlnaHQgMjAwNCBSb2JlcnQgU2hlYXJtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlIDx3aW52ZXIuaD4KKyNpbmNsdWRlIDxpbWFnZWhscC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgRFBSSU5URiBfZGJ1c193YXJuCisKKyNpZmRlZiBfTVNDX1ZFUgorI2RlZmluZSBCT09MIGludAorCisjZGVmaW5lIF9faTM4Nl9fCisjZW5kaWYKKworLy8jZGVmaW5lIE1BS0VfRlVOQ1BUUihmKSBzdGF0aWMgdHlwZW9mKGYpICogcCMjZgorCisvL01BS0VfRlVOQ1BUUihTdGFja1dhbGspOworLy9NQUtFX0ZVTkNQVFIoU3ltR2V0TW9kdWxlQmFzZSk7CisvL01BS0VfRlVOQ1BUUihTeW1GdW5jdGlvblRhYmxlQWNjZXNzKTsKKy8vTUFLRV9GVU5DUFRSKFN5bUluaXRpYWxpemUpOworLy9NQUtFX0ZVTkNQVFIoU3ltR2V0U3ltRnJvbUFkZHIpOworLy9NQUtFX0ZVTkNQVFIoU3ltR2V0TW9kdWxlSW5mbyk7CitzdGF0aWMgQk9PTCAoV0lOQVBJICpwU3RhY2tXYWxrKSgKKyAgRFdPUkQgTWFjaGluZVR5cGUsCisgIEhBTkRMRSBoUHJvY2VzcywKKyAgSEFORExFIGhUaHJlYWQsCisgIExQU1RBQ0tGUkFNRSBTdGFja0ZyYW1lLAorICBQVk9JRCBDb250ZXh0UmVjb3JkLAorICBQUkVBRF9QUk9DRVNTX01FTU9SWV9ST1VUSU5FIFJlYWRNZW1vcnlSb3V0aW5lLAorICBQRlVOQ1RJT05fVEFCTEVfQUNDRVNTX1JPVVRJTkUgRnVuY3Rpb25UYWJsZUFjY2Vzc1JvdXRpbmUsCisgIFBHRVRfTU9EVUxFX0JBU0VfUk9VVElORSBHZXRNb2R1bGVCYXNlUm91dGluZSwKKyAgUFRSQU5TTEFURV9BRERSRVNTX1JPVVRJTkUgVHJhbnNsYXRlQWRkcmVzcworKTsKKyNpZmRlZiBfV0lONjQKK3N0YXRpYyBEV09SRDY0IChXSU5BUEkgKnBTeW1HZXRNb2R1bGVCYXNlKSgKKyAgSEFORExFIGhQcm9jZXNzLAorICBEV09SRDY0IGR3QWRkcgorKTsKK3N0YXRpYyBQVk9JRCAgKFdJTkFQSSAqcFN5bUZ1bmN0aW9uVGFibGVBY2Nlc3MpKAorICBIQU5ETEUgaFByb2Nlc3MsCisgIERXT1JENjQgQWRkckJhc2UKKyk7CisjZWxzZQorc3RhdGljIERXT1JEIChXSU5BUEkgKnBTeW1HZXRNb2R1bGVCYXNlKSgKKyAgSEFORExFIGhQcm9jZXNzLAorICBEV09SRCBkd0FkZHIKKyk7CitzdGF0aWMgUFZPSUQgIChXSU5BUEkgKnBTeW1GdW5jdGlvblRhYmxlQWNjZXNzKSgKKyAgSEFORExFIGhQcm9jZXNzLAorICBEV09SRCBBZGRyQmFzZQorKTsKKyNlbmRpZgorc3RhdGljIEJPT0wgIChXSU5BUEkgKnBTeW1Jbml0aWFsaXplKSgKKyAgSEFORExFIGhQcm9jZXNzLAorICBQU1RSIFVzZXJTZWFyY2hQYXRoLAorICBCT09MIGZJbnZhZGVQcm9jZXNzCispOworc3RhdGljIEJPT0wgIChXSU5BUEkgKnBTeW1HZXRTeW1Gcm9tQWRkcikoCisgIEhBTkRMRSBoUHJvY2VzcywKKyAgRFdPUkQgQWRkcmVzcywKKyAgUERXT1JEIERpc3BsYWNlbWVudCwKKyAgUElNQUdFSExQX1NZTUJPTCBTeW1ib2wKKyk7CitzdGF0aWMgQk9PTCAgKFdJTkFQSSAqcFN5bUdldE1vZHVsZUluZm8pKAorICBIQU5ETEUgaFByb2Nlc3MsCisgIERXT1JEIGR3QWRkciwKKyAgUElNQUdFSExQX01PRFVMRSBNb2R1bGVJbmZvCispOworc3RhdGljIERXT1JEICAoV0lOQVBJICpwU3ltU2V0T3B0aW9ucykoCisgIERXT1JEIFN5bU9wdGlvbnMKKyk7CisKKworc3RhdGljIEJPT0wgaW5pdF9iYWNrdHJhY2UoKQoreworICAgIEhNT0RVTEUgaG1vZERiZ0hlbHAgPSBMb2FkTGlicmFyeUEoImRiZ2hlbHAiKTsKKy8qCisgICAgI2RlZmluZSBHRVRGVU5DKHgpIFwKKyAgICBwIyN4ID0gKHR5cGVvZih4KSopR2V0UHJvY0FkZHJlc3MoaG1vZERiZ0hlbHAsICN4KTsgXAorICAgIGlmICghcCMjeCkgXAorICAgIHsgXAorICAgICAgICByZXR1cm4gRkFMU0U7IFwKKyAgICB9CisgICAgKi8KKworCisvLyAgICBHRVRGVU5DKFN0YWNrV2Fsayk7CisvLyAgICBHRVRGVU5DKFN5bUdldE1vZHVsZUJhc2UpOworLy8gICAgR0VURlVOQyhTeW1GdW5jdGlvblRhYmxlQWNjZXNzKTsKKy8vICAgIEdFVEZVTkMoU3ltSW5pdGlhbGl6ZSk7CisvLyAgICBHRVRGVU5DKFN5bUdldFN5bUZyb21BZGRyKTsKKy8vICAgIEdFVEZVTkMoU3ltR2V0TW9kdWxlSW5mbyk7CisKKyNkZWZpbmUgRlVOQyh4KSAjeAorCisgICAgICBwU3RhY2tXYWxrID0gKEJPT0wgIChXSU5BUEkgKikoCitEV09SRCBNYWNoaW5lVHlwZSwKK0hBTkRMRSBoUHJvY2VzcywKK0hBTkRMRSBoVGhyZWFkLAorTFBTVEFDS0ZSQU1FIFN0YWNrRnJhbWUsCitQVk9JRCBDb250ZXh0UmVjb3JkLAorUFJFQURfUFJPQ0VTU19NRU1PUllfUk9VVElORSBSZWFkTWVtb3J5Um91dGluZSwKK1BGVU5DVElPTl9UQUJMRV9BQ0NFU1NfUk9VVElORSBGdW5jdGlvblRhYmxlQWNjZXNzUm91dGluZSwKK1BHRVRfTU9EVUxFX0JBU0VfUk9VVElORSBHZXRNb2R1bGVCYXNlUm91dGluZSwKK1BUUkFOU0xBVEVfQUREUkVTU19ST1VUSU5FIFRyYW5zbGF0ZUFkZHJlc3MKKykpR2V0UHJvY0FkZHJlc3MgKGhtb2REYmdIZWxwLCBGVU5DKFN0YWNrV2FsaykpOworI2lmZGVmIF9XSU42NAorICAgIHBTeW1HZXRNb2R1bGVCYXNlPShEV09SRDY0ICAoV0lOQVBJICopKAorICBIQU5ETEUgaFByb2Nlc3MsCisgIERXT1JENjQgZHdBZGRyCispKUdldFByb2NBZGRyZXNzIChobW9kRGJnSGVscCwgRlVOQyhTeW1HZXRNb2R1bGVCYXNlKSk7CisgICAgcFN5bUZ1bmN0aW9uVGFibGVBY2Nlc3M9KFBWT0lEICAoV0lOQVBJICopKAorICBIQU5ETEUgaFByb2Nlc3MsCisgIERXT1JENjQgQWRkckJhc2UKKykpR2V0UHJvY0FkZHJlc3MgKGhtb2REYmdIZWxwLCBGVU5DKFN5bUZ1bmN0aW9uVGFibGVBY2Nlc3MpKTsKKyNlbHNlCisgICAgcFN5bUdldE1vZHVsZUJhc2U9KERXT1JEICAoV0lOQVBJICopKAorICBIQU5ETEUgaFByb2Nlc3MsCisgIERXT1JEIGR3QWRkcgorKSlHZXRQcm9jQWRkcmVzcyAoaG1vZERiZ0hlbHAsIEZVTkMoU3ltR2V0TW9kdWxlQmFzZSkpOworICAgIHBTeW1GdW5jdGlvblRhYmxlQWNjZXNzPShQVk9JRCAgKFdJTkFQSSAqKSgKKyAgSEFORExFIGhQcm9jZXNzLAorICBEV09SRCBBZGRyQmFzZQorKSlHZXRQcm9jQWRkcmVzcyAoaG1vZERiZ0hlbHAsIEZVTkMoU3ltRnVuY3Rpb25UYWJsZUFjY2VzcykpOworI2VuZGlmCisgICAgcFN5bUluaXRpYWxpemUgPSAoQk9PTCAgKFdJTkFQSSAqKSgKKyAgSEFORExFIGhQcm9jZXNzLAorICBQU1RSIFVzZXJTZWFyY2hQYXRoLAorICBCT09MIGZJbnZhZGVQcm9jZXNzCispKUdldFByb2NBZGRyZXNzIChobW9kRGJnSGVscCwgRlVOQyhTeW1Jbml0aWFsaXplKSk7CisgICAgcFN5bUdldFN5bUZyb21BZGRyID0gKEJPT0wgIChXSU5BUEkgKikoCisgIEhBTkRMRSBoUHJvY2VzcywKKyAgRFdPUkQgQWRkcmVzcywKKyAgUERXT1JEIERpc3BsYWNlbWVudCwKKyAgUElNQUdFSExQX1NZTUJPTCBTeW1ib2wKKykpR2V0UHJvY0FkZHJlc3MgKGhtb2REYmdIZWxwLCBGVU5DKFN5bUdldFN5bUZyb21BZGRyKSk7CisgICAgcFN5bUdldE1vZHVsZUluZm8gPSAoQk9PTCAgKFdJTkFQSSAqKSgKKyAgSEFORExFIGhQcm9jZXNzLAorICBEV09SRCBkd0FkZHIsCisgIFBJTUFHRUhMUF9NT0RVTEUgTW9kdWxlSW5mbworKSlHZXRQcm9jQWRkcmVzcyAoaG1vZERiZ0hlbHAsIEZVTkMoU3ltR2V0TW9kdWxlSW5mbykpOworcFN5bVNldE9wdGlvbnMgPSAoRFdPUkQgIChXSU5BUEkgKikoCitEV09SRCBTeW1PcHRpb25zCispKUdldFByb2NBZGRyZXNzIChobW9kRGJnSGVscCwgRlVOQyhTeW1TZXRPcHRpb25zKSk7CisKKworICAgIHBTeW1TZXRPcHRpb25zKFNZTU9QVF9VTkROQU1FKTsKKworICAgIHBTeW1Jbml0aWFsaXplKEdldEN1cnJlbnRQcm9jZXNzKCksIE5VTEwsIFRSVUUpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfYmFja3RyYWNlX2Zvcl90aHJlYWQoSEFORExFIGhUaHJlYWQpCit7CisgICAgU1RBQ0tGUkFNRSBzZjsKKyAgICBDT05URVhUIGNvbnRleHQ7CisgICAgRFdPUkQgZHdJbWFnZVR5cGU7CisKKyAgICBpZiAoIXBTdGFja1dhbGspCisgICAgICAgIGlmICghaW5pdF9iYWNrdHJhY2UoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgIC8qIGNhbid0IHVzZSB0aGlzIGZ1bmN0aW9uIGZvciBjdXJyZW50IHRocmVhZCBhcyBHZXRUaHJlYWRDb250ZXh0CisgICAgICogZG9lc24ndCBzdXBwb3J0IGdldHRpbmcgY29udGV4dCBmcm9tIGN1cnJlbnQgdGhyZWFkICovCisgICAgaWYgKGhUaHJlYWQgPT0gR2V0Q3VycmVudFRocmVhZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBEUFJJTlRGKCJCYWNrdHJhY2U6XG4iKTsKKworICAgIF9EQlVTX1pFUk8oY29udGV4dCk7CisgICAgY29udGV4dC5Db250ZXh0RmxhZ3MgPSBDT05URVhUX0ZVTEw7CisKKyAgICBTdXNwZW5kVGhyZWFkKGhUaHJlYWQpOworCisgICAgaWYgKCFHZXRUaHJlYWRDb250ZXh0KGhUaHJlYWQsICZjb250ZXh0KSkKKyAgICB7CisgICAgICAgIERQUklOVEYoIkNvdWxkbid0IGdldCB0aHJlYWQgY29udGV4dCAoZXJyb3IgJWxkKVxuIiwgR2V0TGFzdEVycm9yKCkpOworICAgICAgICBSZXN1bWVUaHJlYWQoaFRocmVhZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBfREJVU19aRVJPKHNmKTsKKworI2lmZGVmIF9faTM4Nl9fCisgICAgc2YuQWRkckZyYW1lLk9mZnNldCA9IGNvbnRleHQuRWJwOworICAgIHNmLkFkZHJGcmFtZS5Nb2RlID0gQWRkck1vZGVGbGF0OworICAgIHNmLkFkZHJQQy5PZmZzZXQgPSBjb250ZXh0LkVpcDsKKyAgICBzZi5BZGRyUEMuTW9kZSA9IEFkZHJNb2RlRmxhdDsKKyAgICBkd0ltYWdlVHlwZSA9IElNQUdFX0ZJTEVfTUFDSElORV9JMzg2OworI2VsaWYgX01fWDY0CisgIGR3SW1hZ2VUeXBlICAgICAgICAgICAgICAgID0gSU1BR0VfRklMRV9NQUNISU5FX0FNRDY0OworICBzZi5BZGRyUEMuT2Zmc2V0ICAgID0gY29udGV4dC5SaXA7CisgIHNmLkFkZHJQQy5Nb2RlICAgICAgPSBBZGRyTW9kZUZsYXQ7CisgIHNmLkFkZHJGcmFtZS5PZmZzZXQgPSBjb250ZXh0LlJzcDsKKyAgc2YuQWRkckZyYW1lLk1vZGUgICA9IEFkZHJNb2RlRmxhdDsKKyAgc2YuQWRkclN0YWNrLk9mZnNldCA9IGNvbnRleHQuUnNwOworICBzZi5BZGRyU3RhY2suTW9kZSAgID0gQWRkck1vZGVGbGF0OworI2VsaWYgX01fSUE2NAorICBkd0ltYWdlVHlwZSAgICAgICAgICAgICAgICAgPSBJTUFHRV9GSUxFX01BQ0hJTkVfSUE2NDsKKyAgc2YuQWRkclBDLk9mZnNldCAgICA9IGNvbnRleHQuU3RJSVA7CisgIHNmLkFkZHJQQy5Nb2RlICAgICAgPSBBZGRyTW9kZUZsYXQ7CisgIHNmLkFkZHJGcmFtZS5PZmZzZXQgPSBjb250ZXh0LkludFNwOworICBzZi5BZGRyRnJhbWUuTW9kZSAgID0gQWRkck1vZGVGbGF0OworICBzZi5BZGRyQlN0b3JlLk9mZnNldD0gY29udGV4dC5Sc0JTUDsKKyAgc2YuQWRkckJTdG9yZS5Nb2RlICA9IEFkZHJNb2RlRmxhdDsKKyAgc2YuQWRkclN0YWNrLk9mZnNldCA9IGNvbnRleHQuSW50U3A7CisgIHNmLkFkZHJTdGFjay5Nb2RlICAgPSBBZGRyTW9kZUZsYXQ7CisjZWxzZQorIyBlcnJvciBZb3UgbmVlZCB0byBmaWxsIGluIHRoZSBTVEFDS0ZSQU1FIHN0cnVjdHVyZSBmb3IgeW91ciBhcmNoaXRlY3R1cmUKKyNlbmRpZgorCisgICAgd2hpbGUgKHBTdGFja1dhbGsoZHdJbWFnZVR5cGUsIEdldEN1cnJlbnRQcm9jZXNzKCksCisgICAgICAgICAgICAgICAgICAgICBoVGhyZWFkLCAmc2YsICZjb250ZXh0LCBOVUxMLCBwU3ltRnVuY3Rpb25UYWJsZUFjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgIHBTeW1HZXRNb2R1bGVCYXNlLCBOVUxMKSkKKyAgICB7CisgICAgICAgIEJZVEUgYnVmZmVyWzI1Nl07CisgICAgICAgIElNQUdFSExQX1NZTUJPTCAqIHBTeW1ib2wgPSAoSU1BR0VITFBfU1lNQk9MICopYnVmZmVyOworICAgICAgICBEV09SRCBkd0Rpc3BsYWNlbWVudDsKKworICAgICAgICBwU3ltYm9sLT5TaXplT2ZTdHJ1Y3QgPSBzaXplb2YoSU1BR0VITFBfU1lNQk9MKTsKKyAgICAgICAgcFN5bWJvbC0+TWF4TmFtZUxlbmd0aCA9IHNpemVvZihidWZmZXIpIC0gc2l6ZW9mKElNQUdFSExQX1NZTUJPTCkgKyAxOworCisgICAgICAgIGlmICghcFN5bUdldFN5bUZyb21BZGRyKEdldEN1cnJlbnRQcm9jZXNzKCksIHNmLkFkZHJQQy5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkd0Rpc3BsYWNlbWVudCwgcFN5bWJvbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIElNQUdFSExQX01PRFVMRSBNb2R1bGVJbmZvOworICAgICAgICAgICAgTW9kdWxlSW5mby5TaXplT2ZTdHJ1Y3QgPSBzaXplb2YoTW9kdWxlSW5mbyk7CisKKyAgICAgICAgICAgIGlmICghcFN5bUdldE1vZHVsZUluZm8oR2V0Q3VycmVudFByb2Nlc3MoKSwgc2YuQWRkclBDLk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1vZHVsZUluZm8pKQorICAgICAgICAgICAgICAgIERQUklOVEYoIjFcdCVwXG4iLCAodm9pZCopc2YuQWRkclBDLk9mZnNldCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgRFBSSU5URigiMlx0JXMrMHglbHhcbiIsIE1vZHVsZUluZm8uSW1hZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICBzZi5BZGRyUEMuT2Zmc2V0IC0gTW9kdWxlSW5mby5CYXNlT2ZJbWFnZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZHdEaXNwbGFjZW1lbnQpCisgICAgICAgICAgICBEUFJJTlRGKCIzXHQlcysweCVseFxuIiwgcFN5bWJvbC0+TmFtZSwgZHdEaXNwbGFjZW1lbnQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBEUFJJTlRGKCI0XHQlc1xuIiwgcFN5bWJvbC0+TmFtZSk7CisgICAgfQorCisgICAgUmVzdW1lVGhyZWFkKGhUaHJlYWQpOworfQorCitzdGF0aWMgRFdPUkQgV0lOQVBJIGR1bXBfdGhyZWFkX3Byb2MoTFBWT0lEIGxwUGFyYW1ldGVyKQoreworICAgIGR1bXBfYmFja3RyYWNlX2Zvcl90aHJlYWQoKEhBTkRMRSlscFBhcmFtZXRlcik7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIGNhbm5vdCBnZXQgdmFsaWQgY29udGV4dCBmcm9tIGN1cnJlbnQgdGhyZWFkLCBzbyB3ZSBoYXZlIHRvIGV4ZWN1dGUKKyAqIGJhY2t0cmFjZSBmcm9tIGFub3RoZXIgdGhyZWFkICovCitzdGF0aWMgdm9pZCBkdW1wX2JhY2t0cmFjZSgpCit7CisgICAgSEFORExFIGhDdXJyZW50VGhyZWFkOworICAgIEhBTkRMRSBoVGhyZWFkOworICAgIERXT1JEIGR3VGhyZWFkSWQ7CisgICAgRHVwbGljYXRlSGFuZGxlKEdldEN1cnJlbnRQcm9jZXNzKCksIEdldEN1cnJlbnRUaHJlYWQoKSwKKyAgICAgICAgR2V0Q3VycmVudFByb2Nlc3MoKSwgJmhDdXJyZW50VGhyZWFkLCAwLCBGQUxTRSwgRFVQTElDQVRFX1NBTUVfQUNDRVNTKTsKKyAgICBoVGhyZWFkID0gQ3JlYXRlVGhyZWFkKE5VTEwsIDAsIGR1bXBfdGhyZWFkX3Byb2MsIChMUFZPSUQpaEN1cnJlbnRUaHJlYWQsCisgICAgICAgIDAsICZkd1RocmVhZElkKTsKKyAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KGhUaHJlYWQsIElORklOSVRFKTsKKyAgICBDbG9zZUhhbmRsZShoVGhyZWFkKTsKKyAgICBDbG9zZUhhbmRsZShoQ3VycmVudFRocmVhZCk7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBhc3NlcnRzIG9yIHRlc3RzIGVuYWJsZWQgKi8KKworI2lmZGVmIEJBQ0tUUkFDRVMKK3ZvaWQgX2RidXNfcHJpbnRfYmFja3RyYWNlKHZvaWQpCit7CisgIGluaXRfYmFja3RyYWNlKCk7CisgIGR1bXBfYmFja3RyYWNlKCk7Cit9CisjZWxzZQordm9pZCBfZGJ1c19wcmludF9iYWNrdHJhY2Uodm9pZCkKK3sKKyAgX2RidXNfdmVyYm9zZSAoIiAgRC1CdXMgbm90IGNvbXBpbGVkIHdpdGggYmFja3RyYWNlIHN1cHBvcnRcbiIpOworfQorI2VuZGlmCisKK3N0YXRpYyBkYnVzX3VpbnQzMl90IGZyb21Bc2NpaShjaGFyIGFzY2lpKQoreworICAgIGlmKGFzY2lpID49ICcwJyAmJiBhc2NpaSA8PSAnOScpCisgICAgICAgIHJldHVybiBhc2NpaSAtICcwJzsKKyAgICBpZihhc2NpaSA+PSAnQScgJiYgYXNjaWkgPD0gJ0YnKQorICAgICAgICByZXR1cm4gYXNjaWkgLSAnQScgKyAxMDsKKyAgICBpZihhc2NpaSA+PSAnYScgJiYgYXNjaWkgPD0gJ2YnKQorICAgICAgICByZXR1cm4gYXNjaWkgLSAnYScgKyAxMDsKKyAgICByZXR1cm4gMDsgICAgCit9CisKK2RidXNfYm9vbF90IF9kYnVzX3JlYWRfbG9jYWxfbWFjaGluZV91dWlkICAgKERCdXNHVUlEICAgICAgICAgKm1hY2hpbmVfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBjcmVhdGVfaWZfbm90X2ZvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisjaWZkZWYgREJVU19XSU5DRQorCXJldHVybiBUUlVFOworICAvLyBUT0RPCisjZWxzZQorICAgIEhXX1BST0ZJTEVfSU5GT0EgaW5mbzsKKyAgICBjaGFyICpscGMgPSAmaW5mby5zekh3UHJvZmlsZUd1aWRbMF07CisgICAgZGJ1c191aW50MzJfdCB1OworCisgICAgLy8gIHRoZSBody1wcm9maWxlIGd1aWQgbGl2ZXMgbG9uZyBlbm91Z2gKKyAgICBpZighR2V0Q3VycmVudEh3UHJvZmlsZUEoJmluZm8pKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsgLy8gRklYTUUKKyAgICAgICAgcmV0dXJuIEZBTFNFOyAgCisgICAgICB9CisKKyAgICAvLyBGb3JtOiB7MTIzNDAwMDEtNDk4MC0xOTIwLTY3ODgtMTIzNDU2Nzg5MDEyfQorICAgIGxwYysrOworICAgIC8vIDEyMzQwMDAxCisgICAgdSA9ICgoZnJvbUFzY2lpKGxwY1swXSkgPDwgIDApIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzFdKSA8PCAgNCkgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbMl0pIDw8ICA4KSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1szXSkgPDwgMTIpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzRdKSA8PCAxNikgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbNV0pIDw8IDIwKSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1s2XSkgPDwgMjQpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzddKSA8PCAyOCkpOworICAgIG1hY2hpbmVfaWQtPmFzX3VpbnQzMnNbMF0gPSB1OworCisgICAgbHBjICs9IDk7CisgICAgLy8gNDk4MC0xOTIwCisgICAgdSA9ICgoZnJvbUFzY2lpKGxwY1swXSkgPDwgIDApIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzFdKSA8PCAgNCkgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbMl0pIDw8ICA4KSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1szXSkgPDwgMTIpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzVdKSA8PCAxNikgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbNl0pIDw8IDIwKSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1s3XSkgPDwgMjQpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzhdKSA8PCAyOCkpOworICAgIG1hY2hpbmVfaWQtPmFzX3VpbnQzMnNbMV0gPSB1OworICAgIAorICAgIGxwYyArPSAxMDsKKyAgICAvLyA2Nzg4LTEyMzQKKyAgICB1ID0gKChmcm9tQXNjaWkobHBjWzBdKSA8PCAgMCkgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbMV0pIDw8ICA0KSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1syXSkgPDwgIDgpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzNdKSA8PCAxMikgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbNV0pIDw8IDE2KSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1s2XSkgPDwgMjApIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzddKSA8PCAyNCkgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbOF0pIDw8IDI4KSk7CisgICAgbWFjaGluZV9pZC0+YXNfdWludDMyc1syXSA9IHU7CisgICAgCisgICAgbHBjICs9IDk7CisgICAgLy8gNTY3ODkwMTIKKyAgICB1ID0gKChmcm9tQXNjaWkobHBjWzBdKSA8PCAgMCkgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbMV0pIDw8ICA0KSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1syXSkgPDwgIDgpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzNdKSA8PCAxMikgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbNF0pIDw8IDE2KSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1s1XSkgPDwgMjApIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzZdKSA8PCAyNCkgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbN10pIDw8IDI4KSk7CisgICAgbWFjaGluZV9pZC0+YXNfdWludDMyc1szXSA9IHU7CisjZW5kaWYKKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljCitIQU5ETEUgX2RidXNfZ2xvYmFsX2xvY2sgKGNvbnN0IGNoYXIgKm11dGV4bmFtZSkKK3sKKyAgSEFORExFIG11dGV4OworICBEV09SRCBnb3RNdXRleDsKKworICBtdXRleCA9IENyZWF0ZU11dGV4QSggTlVMTCwgRkFMU0UsIG11dGV4bmFtZSApOworICBpZiggIW11dGV4ICkKKyAgICB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICBnb3RNdXRleCA9IFdhaXRGb3JTaW5nbGVPYmplY3QoIG11dGV4LCBJTkZJTklURSApOworICAgc3dpdGNoKCBnb3RNdXRleCApCisgICAgIHsKKyAgICAgICBjYXNlIFdBSVRfQUJBTkRPTkVEOgorICAgICAgICAgICAgICAgUmVsZWFzZU11dGV4IChtdXRleCk7CisgICAgICAgICAgICAgICBDbG9zZUhhbmRsZSAobXV0ZXgpOworICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgY2FzZSBXQUlUX0ZBSUxFRDoKKyAgICAgICBjYXNlIFdBSVRfVElNRU9VVDoKKyAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICB9CisKKyAgIHJldHVybiBtdXRleDsKK30KKworc3RhdGljCit2b2lkIF9kYnVzX2dsb2JhbF91bmxvY2sgKEhBTkRMRSBtdXRleCkKK3sKKyAgUmVsZWFzZU11dGV4IChtdXRleCk7CisgIENsb3NlSGFuZGxlIChtdXRleCk7IAorfQorCisvLyBmb3IgcHJvcGVyIGNsZWFudXAgaW4gZGJ1cy1kYWVtb24KK3N0YXRpYyBIQU5ETEUgaERCdXNEYWVtb25NdXRleCA9IE5VTEw7CitzdGF0aWMgSEFORExFIGhEQnVzU2hhcmVkTWVtID0gTlVMTDsKKy8vIHN5bmMgX2RidXNfZGFlbW9uX3B1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcywgX2RidXNfZGFlbW9uX3VucHVibGlzaF9zZXNzaW9uX2J1c19hZGRyZXNzIGFuZCBfZGJ1c19kYWVtb25fYWxyZWFkeV9ydW5zCitzdGF0aWMgY29uc3QgY2hhciAqY1VuaXF1ZURCdXNJbml0TXV0ZXggPSAiVW5pcXVlREJ1c0luaXRNdXRleCI7CisvLyBzeW5jIF9kYnVzX2dldF9hdXRvbGF1bmNoX2FkZHJlc3MKK3N0YXRpYyBjb25zdCBjaGFyICpjREJ1c0F1dG9sYXVuY2hNdXRleCA9ICJEQnVzQXV0b2xhdW5jaE11dGV4IjsKKy8vIG11dGV4IHRvIGRldGVybWluZSBpZiBkYnVzLWRhZW1vbiBpcyBhbHJlYWR5IHN0YXJ0ZWQgKHBlciB1c2VyKQorc3RhdGljIGNvbnN0IGNoYXIgKmNEQnVzRGFlbW9uTXV0ZXggPSAiREJ1c0RhZW1vbk11dGV4IjsKKy8vIG5hbWVkIHNobSBmb3IgZGJ1cyBhZHJlc3MgaW5mbyAocGVyIHVzZXIpCitzdGF0aWMgY29uc3QgY2hhciAqY0RCdXNEYWVtb25BZGRyZXNzSW5mbyA9ICJEQnVzRGFlbW9uQWRkcmVzc0luZm8iOworCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX2dldF9pbnN0YWxsX3Jvb3RfYXNfaGFzaChEQnVzU3RyaW5nICpvdXQpCit7CisgICAgREJ1c1N0cmluZyBpbnN0YWxsX3BhdGg7CisKKyAgICBjaGFyIHBhdGhbTUFYX1BBVEgqMl07CisgICAgaW50IHBhdGhfc2l6ZSA9IHNpemVvZihwYXRoKTsKKworICAgIGlmICghX2RidXNfZ2V0X2luc3RhbGxfcm9vdChwYXRoLHBhdGhfc2l6ZSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIF9kYnVzX3N0cmluZ19pbml0KCZpbnN0YWxsX3BhdGgpOworICAgIF9kYnVzX3N0cmluZ19hcHBlbmQoJmluc3RhbGxfcGF0aCxwYXRoKTsKKworICAgIF9kYnVzX3N0cmluZ19pbml0KG91dCk7CisgICAgX2RidXNfc3RyaW5nX3RvbG93ZXJfYXNjaWkoJmluc3RhbGxfcGF0aCwwLF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoKCZpbnN0YWxsX3BhdGgpKTsKKworICAgIGlmICghX2RidXNfc2hhX2NvbXB1dGUgKCZpbnN0YWxsX3BhdGgsIG91dCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX2dldF9hZGRyZXNzX3N0cmluZyAoREJ1c1N0cmluZyAqb3V0LCBjb25zdCBjaGFyICpiYXNlc3RyaW5nLCBjb25zdCBjaGFyICpzY29wZSkKK3sKKyAgX2RidXNfc3RyaW5nX2luaXQob3V0KTsKKyAgX2RidXNfc3RyaW5nX2FwcGVuZChvdXQsYmFzZXN0cmluZyk7CisKKyAgaWYgKCFzY29wZSkKKyAgICB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcChzY29wZSwiKmluc3RhbGwtcGF0aCIpID09IDAKKyAgICAgICAgLy8gZm9yIDEuMyBjb21wYXRpYmlsaXR5CisgICAgICAgIHx8IHN0cmNtcChzY29wZSwiaW5zdGFsbC1wYXRoIikgPT0gMCkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIHRlbXA7CisgICAgICBpZiAoIV9kYnVzX2dldF9pbnN0YWxsX3Jvb3RfYXNfaGFzaCgmdGVtcCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZShvdXQpOworICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIF9kYnVzX3N0cmluZ19hcHBlbmQob3V0LCItIik7CisgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kKG91dCxfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEoJnRlbXApKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlKCZ0ZW1wKTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcChzY29wZSwiKnVzZXIiKSA9PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19hcHBlbmQob3V0LCItIik7CisgICAgICBpZiAoIV9kYnVzX2FwcGVuZF91c2VyX2Zyb21fY3VycmVudF9wcm9jZXNzKG91dCkpCisgICAgICAgIHsKKyAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUob3V0KTsKKyAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorICBlbHNlIGlmIChzdHJsZW4oc2NvcGUpID4gMCkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kKG91dCwiLSIpOworICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZChvdXQsc2NvcGUpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19nZXRfc2htX25hbWUgKERCdXNTdHJpbmcgKm91dCxjb25zdCBjaGFyICpzY29wZSkKK3sKKyAgcmV0dXJuIF9kYnVzX2dldF9hZGRyZXNzX3N0cmluZyAob3V0LGNEQnVzRGFlbW9uQWRkcmVzc0luZm8sc2NvcGUpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX2dldF9tdXRleF9uYW1lIChEQnVzU3RyaW5nICpvdXQsY29uc3QgY2hhciAqc2NvcGUpCit7CisgIHJldHVybiBfZGJ1c19nZXRfYWRkcmVzc19zdHJpbmcgKG91dCxjREJ1c0RhZW1vbk11dGV4LHNjb3BlKTsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX2RhZW1vbl9pc19zZXNzaW9uX2J1c19hZGRyZXNzX3B1Ymxpc2hlZCAoY29uc3QgY2hhciAqc2NvcGUpCit7CisgIEhBTkRMRSBsb2NrOworICBEQnVzU3RyaW5nIG11dGV4X25hbWU7CisKKyAgaWYgKCFfZGJ1c19nZXRfbXV0ZXhfbmFtZSgmbXV0ZXhfbmFtZSxzY29wZSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUoICZtdXRleF9uYW1lICk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChoREJ1c0RhZW1vbk11dGV4KQorICAgICAgcmV0dXJuIFRSVUU7CisKKyAgLy8gc3luYyBfZGJ1c19kYWVtb25fcHVibGlzaF9zZXNzaW9uX2J1c19hZGRyZXNzLCBfZGJ1c19kYWVtb25fdW5wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MgYW5kIF9kYnVzX2RhZW1vbl9hbHJlYWR5X3J1bnMKKyAgbG9jayA9IF9kYnVzX2dsb2JhbF9sb2NrKCBjVW5pcXVlREJ1c0luaXRNdXRleCApOworCisgIC8vIHdlIHVzZSBDcmVhdGVNdXRleCBpbnN0ZWFkIG9mIE9wZW5NdXRleCBiZWNhdXNlIG9mIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9ucywKKyAgLy8gc2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczY4NDMxNSUyOFZTLjg1JTI5LmFzcHgKKyAgaERCdXNEYWVtb25NdXRleCA9IENyZWF0ZU11dGV4QSggTlVMTCwgRkFMU0UsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSgmbXV0ZXhfbmFtZSkgKTsKKworICAvKiBUaGUgY2xpZW50IHVzZXMgbXV0ZXggb3duZXJzaGlwIHRvIGRldGVjdCBhIHJ1bm5pbmcgc2VydmVyLCBzbyB0aGUgc2VydmVyIHNob3VsZCBkbyBzbyB0b28uCisgICAgIEZvcnR1bmFsbHkgdGhlIGNsaWVudCBkZWxldGVzIHRoZSBtdXRleCBpbiB0aGUgbG9jayBwcm90ZWN0ZWQgYXJlYSwgc28gY2hlY2tpbmcgcHJlc2VuY2UgCisgICAgIHdpbGwgd29yayB0b28uICAqLworCisgIF9kYnVzX2dsb2JhbF91bmxvY2soIGxvY2sgKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSggJm11dGV4X25hbWUgKTsKKworICBpZiAoaERCdXNEYWVtb25NdXRleCAgPT0gTlVMTCkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKEdldExhc3RFcnJvcigpID09IEVSUk9SX0FMUkVBRFlfRVhJU1RTKQorICAgIHsKKyAgICAgIENsb3NlSGFuZGxlKGhEQnVzRGFlbW9uTXV0ZXgpOworICAgICAgaERCdXNEYWVtb25NdXRleCA9IE5VTEw7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIC8vIG11dGV4IHdhc24ndCBjcmVhdGVkIGJlZm9yZSwgc28gcmV0dXJuIGZhbHNlLgorICAvLyBXZSBsZWF2ZSB0aGUgbXV0ZXggbmFtZSBhbGxvY2F0ZWQgZm9yIGxhdGVyIHJldXNhZ2UKKyAgLy8gaW4gX2RidXNfZGFlbW9uX3B1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcy4KKyAgcmV0dXJuIEZBTFNFOworfQorCitkYnVzX2Jvb2xfdAorX2RidXNfZGFlbW9uX3B1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcyAoY29uc3QgY2hhciogYWRkcmVzcywgY29uc3QgY2hhciAqc2NvcGUpCit7CisgIEhBTkRMRSBsb2NrOworICBjaGFyICpzaGFyZWRfYWRkciA9IE5VTEw7CisgIERCdXNTdHJpbmcgc2htX25hbWU7CisgIERCdXNTdHJpbmcgbXV0ZXhfbmFtZTsKKworICBfZGJ1c19hc3NlcnQgKGFkZHJlc3MpOworCisgIGlmICghX2RidXNfZ2V0X211dGV4X25hbWUoJm11dGV4X25hbWUsc2NvcGUpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlKCAmbXV0ZXhfbmFtZSApOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvLyBzeW5jIF9kYnVzX2RhZW1vbl9wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MsIF9kYnVzX2RhZW1vbl91bnB1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcyBhbmQgX2RidXNfZGFlbW9uX2FscmVhZHlfcnVucworICBsb2NrID0gX2RidXNfZ2xvYmFsX2xvY2soIGNVbmlxdWVEQnVzSW5pdE11dGV4ICk7CisKKyAgaWYgKCFoREJ1c0RhZW1vbk11dGV4KQorICAgIHsKKyAgICAgIGhEQnVzRGFlbW9uTXV0ZXggPSBDcmVhdGVNdXRleEEoIE5VTEwsIEZBTFNFLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEoJm11dGV4X25hbWUpICk7CisgICAgfQorICBfZGJ1c19zdHJpbmdfZnJlZSggJm11dGV4X25hbWUgKTsKKworICAvLyBhY3F1aXJlIHRoZSBtdXRleAorICBpZiAoV2FpdEZvclNpbmdsZU9iamVjdCggaERCdXNEYWVtb25NdXRleCwgMTAgKSAhPSBXQUlUX09CSkVDVF8wKQorICAgIHsKKyAgICAgIF9kYnVzX2dsb2JhbF91bmxvY2soIGxvY2sgKTsKKyAgICAgIENsb3NlSGFuZGxlKCBoREJ1c0RhZW1vbk11dGV4ICk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfZ2V0X3NobV9uYW1lKCZzaG1fbmFtZSxzY29wZSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUoICZzaG1fbmFtZSApOworICAgICAgX2RidXNfZ2xvYmFsX3VubG9jayggbG9jayApOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvLyBjcmVhdGUgc2htCisgIGhEQnVzU2hhcmVkTWVtID0gQ3JlYXRlRmlsZU1hcHBpbmdBKCBJTlZBTElEX0hBTkRMRV9WQUxVRSwgTlVMTCwgUEFHRV9SRUFEV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBzdHJsZW4oIGFkZHJlc3MgKSArIDEsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSgmc2htX25hbWUpICk7CisgIF9kYnVzX2Fzc2VydCggaERCdXNTaGFyZWRNZW0gKTsKKworICBzaGFyZWRfYWRkciA9IE1hcFZpZXdPZkZpbGUoIGhEQnVzU2hhcmVkTWVtLCBGSUxFX01BUF9XUklURSwgMCwgMCwgMCApOworCisgIF9kYnVzX2Fzc2VydCAoc2hhcmVkX2FkZHIpOworCisgIHN0cmNweSggc2hhcmVkX2FkZHIsIGFkZHJlc3MpOworCisgIC8vIGNsZWFudXAKKyAgVW5tYXBWaWV3T2ZGaWxlKCBzaGFyZWRfYWRkciApOworCisgIF9kYnVzX2dsb2JhbF91bmxvY2soIGxvY2sgKTsKKyAgX2RidXNfdmVyYm9zZSggInB1Ymxpc2hlZCBzZXNzaW9uIGJ1cyBhZGRyZXNzIGF0ICVzXG4iLF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnNobV9uYW1lKSApOworCisgIF9kYnVzX3N0cmluZ19mcmVlKCAmc2htX25hbWUgKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQKK19kYnVzX2RhZW1vbl91bnB1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcyAodm9pZCkKK3sKKyAgSEFORExFIGxvY2s7CisKKyAgLy8gc3luYyBfZGJ1c19kYWVtb25fcHVibGlzaF9zZXNzaW9uX2J1c19hZGRyZXNzLCBfZGJ1c19kYWVtb25fdW5wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MgYW5kIF9kYnVzX2RhZW1vbl9hbHJlYWR5X3J1bnMKKyAgbG9jayA9IF9kYnVzX2dsb2JhbF9sb2NrKCBjVW5pcXVlREJ1c0luaXRNdXRleCApOworCisgIENsb3NlSGFuZGxlKCBoREJ1c1NoYXJlZE1lbSApOworCisgIGhEQnVzU2hhcmVkTWVtID0gTlVMTDsKKworICBSZWxlYXNlTXV0ZXgoIGhEQnVzRGFlbW9uTXV0ZXggKTsKKworICBDbG9zZUhhbmRsZSggaERCdXNEYWVtb25NdXRleCApOworCisgIGhEQnVzRGFlbW9uTXV0ZXggPSBOVUxMOworCisgIF9kYnVzX2dsb2JhbF91bmxvY2soIGxvY2sgKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19nZXRfYXV0b2xhdW5jaF9zaG0gKERCdXNTdHJpbmcgKmFkZHJlc3MsIERCdXNTdHJpbmcgKnNobV9uYW1lKQoreworICBIQU5ETEUgc2hhcmVkTWVtOworICBjaGFyICpzaGFyZWRfYWRkcjsKKyAgaW50IGk7CisKKyAgLy8gcmVhZCBzaG0KKyAgZm9yKGk9MDtpPDIwOysraSkgeworICAgICAgLy8gd2Uga25vdyB0aGF0IGRidXMtZGFlbW9uIGlzIGF2YWlsYWJsZSwgc28gd2Ugd2FpdCB1bnRpbCBzaG0gaXMgYXZhaWxhYmxlCisgICAgICBzaGFyZWRNZW0gPSBPcGVuRmlsZU1hcHBpbmdBKCBGSUxFX01BUF9SRUFELCBGQUxTRSwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhKHNobV9uYW1lKSk7CisgICAgICBpZiggc2hhcmVkTWVtID09IDAgKQorICAgICAgICAgIFNsZWVwKCAxMDAgKTsKKyAgICAgIGlmICggc2hhcmVkTWVtICE9IDApCisgICAgICAgICAgYnJlYWs7CisgIH0KKworICBpZiggc2hhcmVkTWVtID09IDAgKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgIHNoYXJlZF9hZGRyID0gTWFwVmlld09mRmlsZSggc2hhcmVkTWVtLCBGSUxFX01BUF9SRUFELCAwLCAwLCAwICk7CisKKyAgaWYoICFzaGFyZWRfYWRkciApCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfc3RyaW5nX2luaXQoIGFkZHJlc3MgKTsKKworICBfZGJ1c19zdHJpbmdfYXBwZW5kKCBhZGRyZXNzLCBzaGFyZWRfYWRkciApOworCisgIC8vIGNsZWFudXAKKyAgVW5tYXBWaWV3T2ZGaWxlKCBzaGFyZWRfYWRkciApOworCisgIENsb3NlSGFuZGxlKCBzaGFyZWRNZW0gKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19kYWVtb25fYWxyZWFkeV9ydW5zIChEQnVzU3RyaW5nICphZGRyZXNzLCBEQnVzU3RyaW5nICpzaG1fbmFtZSwgY29uc3QgY2hhciAqc2NvcGUpCit7CisgIEhBTkRMRSBsb2NrOworICBIQU5ETEUgZGFlbW9uOworICBEQnVzU3RyaW5nIG11dGV4X25hbWU7CisgIGRidXNfYm9vbF90IGJSZXQgPSBUUlVFOworCisgIGlmICghX2RidXNfZ2V0X211dGV4X25hbWUoJm11dGV4X25hbWUsc2NvcGUpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlKCAmbXV0ZXhfbmFtZSApOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvLyBzeW5jIF9kYnVzX2RhZW1vbl9wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MsIF9kYnVzX2RhZW1vbl91bnB1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcyBhbmQgX2RidXNfZGFlbW9uX2FscmVhZHlfcnVucworICBsb2NrID0gX2RidXNfZ2xvYmFsX2xvY2soIGNVbmlxdWVEQnVzSW5pdE11dGV4ICk7CisKKyAgLy8gZG8gY2hlY2tzCisgIGRhZW1vbiA9IENyZWF0ZU11dGV4QSggTlVMTCwgRkFMU0UsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSgmbXV0ZXhfbmFtZSkgKTsKKyAgaWYoV2FpdEZvclNpbmdsZU9iamVjdCggZGFlbW9uLCAxMCApICE9IFdBSVRfVElNRU9VVCkKKyAgICB7CisgICAgICBSZWxlYXNlTXV0ZXggKGRhZW1vbik7CisgICAgICBDbG9zZUhhbmRsZSAoZGFlbW9uKTsKKworICAgICAgX2RidXNfZ2xvYmFsX3VubG9jayggbG9jayApOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUoICZtdXRleF9uYW1lICk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8vIHJlYWQgc2htCisgIGJSZXQgPSBfZGJ1c19nZXRfYXV0b2xhdW5jaF9zaG0oIGFkZHJlc3MsIHNobV9uYW1lICk7CisKKyAgLy8gY2xlYW51cAorICBDbG9zZUhhbmRsZSAoIGRhZW1vbiApOworCisgIF9kYnVzX2dsb2JhbF91bmxvY2soIGxvY2sgKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUoICZtdXRleF9uYW1lICk7CisKKyAgcmV0dXJuIGJSZXQ7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19nZXRfYXV0b2xhdW5jaF9hZGRyZXNzIChjb25zdCBjaGFyICpzY29wZSwgREJ1c1N0cmluZyAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpCit7CisgIEhBTkRMRSBtdXRleDsKKyAgU1RBUlRVUElORk9BIHNpOworICBQUk9DRVNTX0lORk9STUFUSU9OIHBpOworICBkYnVzX2Jvb2xfdCByZXR2YWwgPSBGQUxTRTsKKyAgTFBTVFIgbHBGaWxlOworICBjaGFyIGRidXNfZXhlX3BhdGhbTUFYX1BBVEhdOworICBjaGFyIGRidXNfYXJnc1tNQVhfUEFUSCAqIDJdOworICBjb25zdCBjaGFyICogZGFlbW9uX25hbWUgPSBEQlVTX0RBRU1PTl9OQU1FICIuZXhlIjsKKyAgREJ1c1N0cmluZyBzaG1fbmFtZTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoIV9kYnVzX2dldF9zaG1fbmFtZSgmc2htX25hbWUsc2NvcGUpKQorICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwgImNvdWxkIG5vdCBkZXRlcm1pbmUgc2htIG5hbWUiKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBtdXRleCA9IF9kYnVzX2dsb2JhbF9sb2NrICggY0RCdXNBdXRvbGF1bmNoTXV0ZXggKTsKKworICBpZiAoX2RidXNfZGFlbW9uX2FscmVhZHlfcnVucyhhZGRyZXNzLCZzaG1fbmFtZSxzY29wZSkpCisgICAgeworICAgICAgICBfZGJ1c192ZXJib3NlKCAiZm91bmQgcnVubmluZyBkYnVzIGRhZW1vbiBhdCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc2htX25hbWUpICk7CisgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIVNlYXJjaFBhdGhBKE5VTEwsIGRhZW1vbl9uYW1lLCBOVUxMLCBzaXplb2YoZGJ1c19leGVfcGF0aCksIGRidXNfZXhlX3BhdGgsICZscEZpbGUpKQorICAgIHsKKyAgICAgIC8vIExvb2sgaW4gZGlyZWN0b3J5IGNvbnRhaW5pbmcgZGJ1cyBzaGFyZWQgbGlicmFyeQorICAgICAgSE1PRFVMRSBobW9kOworICAgICAgY2hhciBkYnVzX21vZHVsZV9wYXRoW01BWF9QQVRIXTsKKyAgICAgIERXT1JEIHJjOworCisgICAgICBfZGJ1c192ZXJib3NlKCAiZGlkIG5vdCBmb3VuZCBkYnVzIGRhZW1vbiBleGVjdXRhYmxlIG9uIGRlZmF1bHQgc2VhcmNoIHBhdGgsICIKKyAgICAgICAgICAgICJ0cnlpbmcgcGF0aCB3aGVyZSBkYnVzIHNoYXJlZCBsaWJyYXJ5IGlzIGxvY2F0ZWQiKTsKKworICAgICAgaG1vZCA9IF9kYnVzX3dpbl9nZXRfZGxsX2htb2R1bGUoKTsKKyAgICAgIHJjID0gR2V0TW9kdWxlRmlsZU5hbWVBKGhtb2QsIGRidXNfbW9kdWxlX3BhdGgsIHNpemVvZihkYnVzX21vZHVsZV9wYXRoKSk7CisgICAgICBpZiAocmMgPD0gMCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJjb3VsZCBub3QgcmV0cmlldmUgZGJ1cyBzaGFyZWQgbGlicmFyeSBmaWxlIG5hbWUiKTsKKyAgICAgICAgICByZXR2YWwgPSBGQUxTRTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgY2hhciAqZXh0X2lkeCA9IHN0cnJjaHIoZGJ1c19tb2R1bGVfcGF0aCwgJ1xcJyk7CisgICAgICAgICAgaWYgKGV4dF9pZHgpCisgICAgICAgICAgKmV4dF9pZHggPSAnXDAnOworICAgICAgICAgIGlmICghU2VhcmNoUGF0aEEoZGJ1c19tb2R1bGVfcGF0aCwgZGFlbW9uX25hbWUsIE5VTEwsIHNpemVvZihkYnVzX2V4ZV9wYXRoKSwgZGJ1c19leGVfcGF0aCwgJmxwRmlsZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJjb3VsZCBub3QgZmluZCBkYnVzLWRhZW1vbiBleGVjdXRhYmxlIik7CisgICAgICAgICAgICAgIHJldHZhbCA9IEZBTFNFOworICAgICAgICAgICAgICBwcmludGYgKCJwbGVhc2UgYWRkIHRoZSBwYXRoIHRvICVzIHRvIHlvdXIgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZVxuIiwgZGFlbW9uX25hbWUpOworICAgICAgICAgICAgICBwcmludGYgKCJvciBzdGFydCB0aGUgZGFlbW9uIG1hbnVhbGx5XG5cbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBfZGJ1c192ZXJib3NlKCAiZm91bmQgZGJ1cyBkYWVtb24gZXhlY3V0YWJsZSBhdCAlcyIsZGJ1c19tb2R1bGVfcGF0aCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAvLyBDcmVhdGUgcHJvY2VzcworICBaZXJvTWVtb3J5KCAmc2ksIHNpemVvZihzaSkgKTsKKyAgc2kuY2IgPSBzaXplb2Yoc2kpOworICBaZXJvTWVtb3J5KCAmcGksIHNpemVvZihwaSkgKTsKKworICBfc25wcmludGYoZGJ1c19hcmdzLCBzaXplb2YoZGJ1c19hcmdzKSAtIDEsICJcIiVzXCIgJXMiLCBkYnVzX2V4ZV9wYXRoLCAgIiAtLXNlc3Npb24iKTsKKworLy8gIGFyZ3ZbaV0gPSAiLS1jb25maWctZmlsZT1idXNcXHNlc3Npb24uY29uZiI7CisvLyAgcHJpbnRmKCJjcmVhdGUgcHJvY2VzcyBcIiVzXCIgJXNcbiIsIGRidXNfZXhlX3BhdGgsIGRidXNfYXJncyk7CisgIGlmKENyZWF0ZVByb2Nlc3NBKGRidXNfZXhlX3BhdGgsIGRidXNfYXJncywgTlVMTCwgTlVMTCwgRkFMU0UsIENSRUFURV9OT19XSU5ET1csIE5VTEwsIE5VTEwsICZzaSwgJnBpKSkKKyAgICB7CisgICAgICBDbG9zZUhhbmRsZSAocGkuaFRocmVhZCk7CisgICAgICBDbG9zZUhhbmRsZSAocGkuaFByb2Nlc3MpOworICAgICAgcmV0dmFsID0gX2RidXNfZ2V0X2F1dG9sYXVuY2hfc2htKCBhZGRyZXNzLCAmc2htX25hbWUgKTsKKyAgICAgIGlmIChyZXR2YWwgPT0gRkFMU0UpCisgICAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJGYWlsZWQgdG8gZ2V0IGF1dG9sYXVuY2ggYWRkcmVzcyBmcm9tIGxhdW5jaGVkIGRidXMtZGFlbW9uIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwgIkZhaWxlZCB0byBsYXVuY2ggZGJ1cy1kYWVtb24iKTsKKyAgICAgIHJldHZhbCA9IEZBTFNFOworICAgIH0KKworb3V0OgorICBpZiAocmV0dmFsKQorICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICBlbHNlCisgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAKKyAgX2RidXNfZ2xvYmFsX3VubG9jayAobXV0ZXgpOworCisgIHJldHVybiByZXR2YWw7CisgfQorCisKKy8qKiBNYWtlcyB0aGUgZmlsZSByZWFkYWJsZSBieSBldmVyeSB1c2VyIGluIHRoZSBzeXN0ZW0uCisgKgorICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlbmFtZQorICogQHBhcmFtIGVycm9yIGVycm9yIGxvY2F0aW9uCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgZmlsZSdzIHBlcm1pc3Npb25zIGNvdWxkIGJlIGNoYW5nZWQuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19tYWtlX2ZpbGVfd29ybGRfcmVhZGFibGUoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgLy8gVE9ETworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiByZXR1cm4gdGhlIHJlbG9jYXRlZCBEQVRBRElSCisgKgorICogQHJldHVybnMgcmVsb2NhdGVkIERBVEFESVIgc3RhdGljIHN0cmluZworICovCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK19kYnVzX3dpbmRvd3NfZ2V0X2RhdGFkaXIgKHZvaWQpCit7CisJcmV0dXJuIF9kYnVzX3JlcGxhY2VfaW5zdGFsbF9wcmVmaXgoREJVU19EQVRBRElSKTsKK30KKworI3VuZGVmIERCVVNfREFUQURJUgorI2RlZmluZSBEQlVTX0RBVEFESVIgX2RidXNfd2luZG93c19nZXRfZGF0YWRpciAoKQorCisKKyNkZWZpbmUgREJVU19TVEFOREFSRF9TRVNTSU9OX1NFUlZJQ0VESVIgIi9kYnVzLTEvc2VydmljZXMiCisjZGVmaW5lIERCVVNfU1RBTkRBUkRfU1lTVEVNX1NFUlZJQ0VESVIgIi9kYnVzLTEvc3lzdGVtLXNlcnZpY2VzIgorCisvKioKKyAqIFJldHVybnMgdGhlIHN0YW5kYXJkIGRpcmVjdG9yaWVzIGZvciBhIHNlc3Npb24gYnVzIHRvIGxvb2sgZm9yIHNlcnZpY2UgCisgKiBhY3RpdmF0aW9uIGZpbGVzIAorICoKKyAqIE9uIFdpbmRvd3MgdGhpcyBzaG91bGQgYmUgZGF0YSBkaXJlY3RvcmllczoKKyAqCisgKiAlQ29tbW9uUHJvZ3JhbUZpbGVzJS9kYnVzCisgKgorICogYW5kCisgKgorICogcmVsb2NhdGVkIERCVVNfREFUQURJUgorICoKKyAqIEBwYXJhbSBkaXJzIHRoZSBkaXJlY3RvcnkgbGlzdCB3ZSBhcmUgcmV0dXJuaW5nCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gT09NIAorICovCisKK2RidXNfYm9vbF90IAorX2RidXNfZ2V0X3N0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMgKERCdXNMaXN0ICoqZGlycykKK3sKKyAgY29uc3QgY2hhciAqY29tbW9uX3Byb2dzOworICBEQnVzU3RyaW5nIHNlcnZpY2VkaXJfcGF0aDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc2VydmljZWRpcl9wYXRoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyNpZmRlZiBEQlVTX1dJTkNFCisgIHsKKyAgICAvKiBPbiBXaW5kb3dzIENFLCB3ZSBhZGp1c3QgZGF0YWRpciBkeW5hbWljYWxseSB0byBpbnN0YWxsYXRpb24gbG9jYXRpb24uICAqLworICAgIGNvbnN0IGNoYXIgKmRhdGFfZGlyID0gX2RidXNfZ2V0ZW52ICgiREJVU19EQVRBRElSIik7CisKKyAgICBpZiAoZGF0YV9kaXIgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLCBkYXRhX2RpcikpCisgICAgICAgICAgZ290byBvb207CisgICAgICAgIAorICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzZXJ2aWNlZGlyX3BhdGgsIF9EQlVTX1BBVEhfU0VQQVJBVE9SKSkKKyAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgIH0KKyAgfQorI2Vsc2UKKy8qCisgdGhlIGNvZGUgZm9yIGFjY2Vzc2luZyBzZXJ2aWNlcyByZXF1aXJlcyBhYnNvbHV0ZSBiYXNlIHBhdGhlcworIGluIGNhc2UgREJVU19EQVRBRElSIGlzIHJlbGF0aXZlIG1ha2UgaXQgYWJzb2x1dGUKKyovCisjaWZkZWYgREJVU19XSU4KKyAgeworICAgIERCdXNTdHJpbmcgcDsKKworICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmcCwgREJVU19EQVRBRElSKTsKKworICAgIGlmICghX2RidXNfcGF0aF9pc19hYnNvbHV0ZSAoJnApKQorICAgICAgeworICAgICAgICBjaGFyIGluc3RhbGxfcm9vdFsxMDAwXTsKKyAgICAgICAgaWYgKF9kYnVzX2dldF9pbnN0YWxsX3Jvb3QgKGluc3RhbGxfcm9vdCwgc2l6ZW9mKGluc3RhbGxfcm9vdCkpKQorICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnNlcnZpY2VkaXJfcGF0aCwgaW5zdGFsbF9yb290KSkKKyAgICAgICAgICAgIGdvdG8gb29tOworICAgICAgfQorICB9CisjZW5kaWYKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLCBEQlVTX0RBVEFESVIpKQorICAgIGdvdG8gb29tOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnNlcnZpY2VkaXJfcGF0aCwgX0RCVVNfUEFUSF9TRVBBUkFUT1IpKQorICAgIGdvdG8gb29tOworI2VuZGlmCisKKyAgY29tbW9uX3Byb2dzID0gX2RidXNfZ2V0ZW52ICgiQ29tbW9uUHJvZ3JhbUZpbGVzIik7CisKKyAgaWYgKGNvbW1vbl9wcm9ncyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnNlcnZpY2VkaXJfcGF0aCwgY29tbW9uX3Byb2dzKSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnNlcnZpY2VkaXJfcGF0aCwgX0RCVVNfUEFUSF9TRVBBUkFUT1IpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zcGxpdF9wYXRoc19hbmRfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NUQU5EQVJEX1NFU1NJT05fU0VSVklDRURJUiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlycykpCisgICAgZ290byBvb207CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzZXJ2aWNlZGlyX3BhdGgpOyAgCisgIHJldHVybiBUUlVFOworCisgb29tOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNlcnZpY2VkaXJfcGF0aCk7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBkaXJlY3RvcmllcyBmb3IgYSBzeXN0ZW0gYnVzIHRvIGxvb2sgZm9yIHNlcnZpY2UKKyAqIGFjdGl2YXRpb24gZmlsZXMKKyAqCisgKiBPbiBVTklYIHRoaXMgc2hvdWxkIGJlIHRoZSBzdGFuZGFyZCB4ZGcgZnJlZWRlc2t0b3Aub3JnIGRhdGEgZGlyZWN0b3JpZXM6CisgKgorICogWERHX0RBVEFfRElSUz0ke1hER19EQVRBX0RJUlMtL3Vzci9sb2NhbC9zaGFyZTovdXNyL3NoYXJlfQorICoKKyAqIGFuZAorICoKKyAqIERCVVNfREFUQURJUgorICoKKyAqIE9uIFdpbmRvd3MgdGhlcmUgaXMgbm8gc3lzdGVtIGJ1cyBhbmQgdGhpcyBmdW5jdGlvbiBjYW4gcmV0dXJuIG5vdGhpbmcuCisgKgorICogQHBhcmFtIGRpcnMgdGhlIGRpcmVjdG9yeSBsaXN0IHdlIGFyZSByZXR1cm5pbmcKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBPT00KKyAqLworCitkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X3N0YW5kYXJkX3N5c3RlbV9zZXJ2aWNlZGlycyAoREJ1c0xpc3QgKipkaXJzKQoreworICAqZGlycyA9IE5VTEw7CisgIHJldHVybiBUUlVFOworfQorCitfREJVU19ERUZJTkVfR0xPQkFMX0xPQ0sgKGF0b21pYyk7CisKKy8qKgorICogQXRvbWljYWxseSBpbmNyZW1lbnRzIGFuIGludGVnZXIKKyAqCisgKiBAcGFyYW0gYXRvbWljIHBvaW50ZXIgdG8gdGhlIGludGVnZXIgdG8gaW5jcmVtZW50CisgKiBAcmV0dXJucyB0aGUgdmFsdWUgYmVmb3JlIGluY3JlbWVudGluZworICoKKyAqLworZGJ1c19pbnQzMl90CitfZGJ1c19hdG9taWNfaW5jIChEQnVzQXRvbWljICphdG9taWMpCit7CisgIC8vICsvLSAxIGlzIG5lZWRlZCBoZXJlIQorICAvLyBubyB2b2xhdGlsZSBhcmd1bWVudCB3aXRoIG1pbmd3CisgIHJldHVybiBJbnRlcmxvY2tlZEluY3JlbWVudCAoJmF0b21pYy0+dmFsdWUpIC0gMTsKK30KKworLyoqCisgKiBBdG9taWNhbGx5IGRlY3JlbWVudCBhbiBpbnRlZ2VyCisgKgorICogQHBhcmFtIGF0b21pYyBwb2ludGVyIHRvIHRoZSBpbnRlZ2VyIHRvIGRlY3JlbWVudAorICogQHJldHVybnMgdGhlIHZhbHVlIGJlZm9yZSBkZWNyZW1lbnRpbmcKKyAqCisgKi8KK2RidXNfaW50MzJfdAorX2RidXNfYXRvbWljX2RlYyAoREJ1c0F0b21pYyAqYXRvbWljKQoreworICAvLyArLy0gMSBpcyBuZWVkZWQgaGVyZSEKKyAgLy8gbm8gdm9sYXRpbGUgYXJndW1lbnQgd2l0aCBtaW5ndworICByZXR1cm4gSW50ZXJsb2NrZWREZWNyZW1lbnQgKCZhdG9taWMtPnZhbHVlKSArIDE7Cit9CisKKy8qKgorICogQXRvbWljYWxseSBnZXQgdGhlIHZhbHVlIG9mIGFuIGludGVnZXIuIEl0IG1heSBjaGFuZ2UgYXQgYW55IHRpbWUKKyAqIHRoZXJlYWZ0ZXIsIHNvIHRoaXMgaXMgbW9zdGx5IG9ubHkgdXNlZnVsIGZvciBhc3NlcnRpb25zLgorICoKKyAqIEBwYXJhbSBhdG9taWMgcG9pbnRlciB0byB0aGUgaW50ZWdlciB0byBnZXQKKyAqIEByZXR1cm5zIHRoZSB2YWx1ZSBhdCB0aGlzIG1vbWVudAorICovCitkYnVzX2ludDMyX3QKK19kYnVzX2F0b21pY19nZXQgKERCdXNBdG9taWMgKmF0b21pYykKK3sKKyAgLyogdGhpcyBpcyB3aGF0IEdMaWIgZG9lcywgaG9wZWZ1bGx5IGl0J3MgcmlnaHQuLi4gKi8KKyAgTWVtb3J5QmFycmllciAoKTsKKyAgcmV0dXJuIGF0b21pYy0+dmFsdWU7Cit9CisKKy8qKgorICogQ2FsbGVkIHdoZW4gdGhlIGJ1cyBkYWVtb24gaXMgc2lnbmFsZWQgdG8gcmVsb2FkIGl0cyBjb25maWd1cmF0aW9uOyBhbnkKKyAqIGNhY2hlcyBzaG91bGQgYmUgbnVrZWQuIE9mIGNvdXJzZSBhbnkgY2FjaGVzIHRoYXQgbmVlZCBleHBsaWNpdCByZWxvYWQKKyAqIGFyZSBwcm9iYWJseSBicm9rZW4sIGJ1dCBjJ2VzdCBsYSB2aWUuCisgKgorICogCisgKi8KK3ZvaWQKK19kYnVzX2ZsdXNoX2NhY2hlcyAodm9pZCkKK3sKK30KKworLyoqCisgKiBTZWUgaWYgZXJybm8gaXMgRUFHQUlOIG9yIEVXT1VMREJMT0NLICh0aGlzIGhhcyB0byBiZSBkb25lIGRpZmZlcmVudGx5CisgKiBmb3IgV2luc29jayBzbyBpcyBhYnN0cmFjdGVkKQorICoKKyAqIEByZXR1cm5zICNUUlVFIGlmIGVycm5vID09IEVBR0FJTiBvciBlcnJubyA9PSBFV09VTERCTE9DSworICovCitkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X2lzX2Vycm5vX2VhZ2Fpbl9vcl9ld291bGRibG9jayAodm9pZCkKK3sKKyAgcmV0dXJuIGVycm5vID09IFdTQUVXT1VMREJMT0NLOworfQorCisvKioKKyAqIHJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZGJ1cyBpbnN0YWxsYXRpb24gCisgKgorICogQHBhcmFtIHMgYnVmZmVyIGZvciBpbnN0YWxsYXRpb24gcGF0aAorICogQHBhcmFtIGxlbiBsZW5ndGggb2YgYnVmZmVyCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X2luc3RhbGxfcm9vdChjaGFyICpwcmVmaXgsIGludCBsZW4pCit7CisgICAgLy9UbyBmaW5kIHRoZSBwcmVmaXgsIHdlIGN1dCB0aGUgZmlsZW5hbWUgYW5kIGFsc28gXGJpblwgaWYgcHJlc2VudAorICAgIERXT1JEIHBhdGhMZW5ndGg7CisgICAgY2hhciAqbGFzdFNsYXNoOworICAgIFNldExhc3RFcnJvciggMCApOworICAgIHBhdGhMZW5ndGggPSBHZXRNb2R1bGVGaWxlTmFtZUEoX2RidXNfd2luX2dldF9kbGxfaG1vZHVsZSgpLCBwcmVmaXgsIGxlbik7CisgICAgaWYgKCBwYXRoTGVuZ3RoID09IDAgfHwgR2V0TGFzdEVycm9yKCkgIT0gMCApIHsKKyAgICAgICAgKnByZWZpeCA9ICdcMCc7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgbGFzdFNsYXNoID0gX21ic3JjaHIocHJlZml4LCAnXFwnKTsKKyAgICBpZiAobGFzdFNsYXNoID09IE5VTEwpIHsKKyAgICAgICAgKnByZWZpeCA9ICdcMCc7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgLy9jdXQgb2ZmIGJpbmFyeSBuYW1lCisgICAgbGFzdFNsYXNoWzFdID0gMDsKKworICAgIC8vY3V0IHBvc3NpYmxlICJcXGJpbiIKKworICAgIC8vdGhpcyBmYWlscyBpZiB3ZSBhcmUgaW4gYSBkb3VibGUtYnl0ZSBzeXN0ZW0gY29kZXBhZ2UgYW5kIHRoZQorICAgIC8vZm9sZGVyJ3MgbmFtZSBoYXBwZW5zIHRvIGVuZCB3aXRoIHRoZSAqYnl0ZXMqCisgICAgLy8iXFxiaW4iLi4uIChJLmUuIHRoZSBzZWNvbmQgYnl0ZSBvZiBzb21lIEhhbiBjaGFyYWN0ZXIgYW5kIHRoZW4KKyAgICAvL3RoZSBMYXRpbiAiYmluIiwgYnV0IHRoYXQgaXMgbm90IGxpa2VseSBJIHRoaW5rLi4uCisgICAgaWYgKGxhc3RTbGFzaCAtIHByZWZpeCA+PSA0ICYmIHN0cm5pY21wKGxhc3RTbGFzaCAtIDQsICJcXGJpbiIsIDQpID09IDApCisgICAgICAgIGxhc3RTbGFzaFstM10gPSAwOworICAgIGVsc2UgaWYgKGxhc3RTbGFzaCAtIHByZWZpeCA+PSAxMCAmJiBzdHJuaWNtcChsYXN0U2xhc2ggLSAxMCwgIlxcYmluXFxkZWJ1ZyIsIDEwKSA9PSAwKQorICAgICAgICBsYXN0U2xhc2hbLTldID0gMDsKKyAgICBlbHNlIGlmIChsYXN0U2xhc2ggLSBwcmVmaXggPj0gMTIgJiYgc3RybmljbXAobGFzdFNsYXNoIC0gMTIsICJcXGJpblxccmVsZWFzZSIsIDEyKSA9PSAwKQorICAgICAgICBsYXN0U2xhc2hbLTExXSA9IDA7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoqIAorICBmaW5kIGNvbmZpZyBmaWxlIGVpdGhlciBmcm9tIGluc3RhbGxhdGlvbiBvciBidWlsZCByb290IGFjY29yZGluZyB0byAKKyAgdGhlIGZvbGxvd2luZyBwYXRoIGxheW91dCAKKyAgICBpbnN0YWxsLXJvb3QvCisgICAgICBiaW4vZGJ1cy1kYWVtb25bZF0uZXhlCisgICAgICBldGMvPGNvbmZpZy1maWxlPi5jb25mICpvciogZXRjL2RidXMtMS88Y29uZmlnLWZpbGU+LmNvbmYKKyAgICAgICh0aGUgZm9ybWVyIGFib3ZlIGlzIHdoYXQgZGJ1czR3aW4gdXNlcywgdGhlIGxhdHRlciBhYm92ZSBpcworICAgICAgd2hhdCBhICJub3JtYWwiIFVuaXgtc3R5bGUgIm1ha2UgaW5zdGFsbCIgdXNlcykKKworICAgIGJ1aWxkLXJvb3QvCisgICAgICBiaW4vZGJ1cy1kYWVtb25bZF0uZXhlCisgICAgICBidXMvPGNvbmZpZy1maWxlPi5jb25mIAorKi8KK2RidXNfYm9vbF90IAorX2RidXNfZ2V0X2NvbmZpZ19maWxlX25hbWUoREJ1c1N0cmluZyAqY29uZmlnX2ZpbGUsIGNoYXIgKnMpCit7CisgIGNoYXIgcGF0aFtNQVhfUEFUSCoyXTsKKyAgaW50IHBhdGhfc2l6ZSA9IHNpemVvZihwYXRoKTsKKworICBpZiAoIV9kYnVzX2dldF9pbnN0YWxsX3Jvb3QocGF0aCxwYXRoX3NpemUpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZihzdHJsZW4ocykgKyA0ICsgc3RybGVuKHBhdGgpID4gc2l6ZW9mKHBhdGgpLTIpCisgICAgcmV0dXJuIEZBTFNFOworICBzdHJjYXQocGF0aCwiZXRjXFwiKTsKKyAgc3RyY2F0KHBhdGgscyk7CisgIGlmIChfZGJ1c19maWxlX2V4aXN0cyhwYXRoKSkgCisgICAgeworICAgICAgLy8gZmluZCBwYXRoIGZyb20gZXhlY3V0YWJsZSAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoY29uZmlnX2ZpbGUsIHBhdGgpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlIAorICAgIHsKKyAgICAgIGlmICghX2RidXNfZ2V0X2luc3RhbGxfcm9vdChwYXRoLHBhdGhfc2l6ZSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIGlmKHN0cmxlbihzKSArIDExICsgc3RybGVuKHBhdGgpID4gc2l6ZW9mKHBhdGgpLTIpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIHN0cmNhdChwYXRoLCJldGNcXGRidXMtMVxcIik7CisgICAgICBzdHJjYXQocGF0aCxzKTsKKyAgCisgICAgICBpZiAoX2RidXNfZmlsZV9leGlzdHMocGF0aCkpIAorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kIChjb25maWdfZmlsZSwgcGF0aCkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfZ2V0X2luc3RhbGxfcm9vdChwYXRoLHBhdGhfc2l6ZSkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgaWYoc3RybGVuKHMpICsgNCArIHN0cmxlbihwYXRoKSA+IHNpemVvZihwYXRoKS0yKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIHN0cmNhdChwYXRoLCJidXNcXCIpOworICAgICAgICAgIHN0cmNhdChwYXRoLHMpOworICAgICAgICAgIAorICAgICAgICAgIGlmIChfZGJ1c19maWxlX2V4aXN0cyhwYXRoKSkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoY29uZmlnX2ZpbGUsIHBhdGgpKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgcmV0dXJuIFRSVUU7Cit9ICAgIAorCisvKioKKyAqIEFwcGVuZCB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgc3lzdGVtLmNvbmYgZmlsZQorICogKHRoZXJlIGlzIG5vIHN5c3RlbSBidXMgb24gV2luZG93cyBzbyB0aGlzIGNhbiBqdXN0CisgKiByZXR1cm4gRkFMU0UgYW5kIHByaW50IGEgd2FybmluZyBvciBzb21ldGhpbmcpCisgKiAKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byBhcHBlbmQgdG8KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2FwcGVuZF9zeXN0ZW1fY29uZmlnX2ZpbGUgKERCdXNTdHJpbmcgKnN0cikKK3sKKyAgcmV0dXJuIF9kYnVzX2dldF9jb25maWdfZmlsZV9uYW1lKHN0ciwgInN5c3RlbS5jb25mIik7Cit9CisKKy8qKgorICogQXBwZW5kIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBzZXNzaW9uLmNvbmYgZmlsZS4KKyAqIAorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIGFwcGVuZCB0bworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXBwZW5kX3Nlc3Npb25fY29uZmlnX2ZpbGUgKERCdXNTdHJpbmcgKnN0cikKK3sKKyAgcmV0dXJuIF9kYnVzX2dldF9jb25maWdfZmlsZV9uYW1lKHN0ciwgInNlc3Npb24uY29uZiIpOworfQorCisvKiBTZWUgY29tbWVudCBpbiBkYnVzLXN5c2RlcHMtdW5peC5jICovCitkYnVzX2Jvb2xfdAorX2RidXNfbG9va3VwX3Nlc3Npb25fYWRkcmVzcyAoZGJ1c19ib29sX3QgKnN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgKmVycm9yKQoreworICAvKiBQcm9iYWJseSBmaWxsIHRoaXMgaW4gd2l0aCBzb21ldGhpbmcgYmFzZWQgb24gQ09NPyAqLworICAqc3VwcG9ydGVkID0gRkFMU0U7CisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEFwcGVuZHMgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBhIGtleXJpbmcgZm9yIHRoZSBnaXZlbiBjcmVkZW50aWFscworICogc2hvdWxkIGJlIHN0b3JlZC4gIFRoZSBjcmVkZW50aWFscyBzaG91bGQgaGF2ZSBlaXRoZXIgYSBXaW5kb3dzIG9yCisgKiBVTklYIHVzZXIgaW4gdGhlbS4gIFRoZSBkaXJlY3Rvcnkgc2hvdWxkIGJlIGFuIGFic29sdXRlIHBhdGguCisgKgorICogT24gVU5JWCB0aGUgZGlyZWN0b3J5IGlzIH4vLmRidXMta2V5cmluZ3Mgd2hpbGUgb24gV2luZG93cyBpdCBzaG91bGQgcHJvYmFibHkKKyAqIGJlIHNvbWV0aGluZyBlbHNlLCBzaW5jZSB0aGUgZG90ZmlsZSBjb252ZW50aW9uIGlzIG5vdCBub3JtYWwgb24gV2luZG93cy4KKyAqIAorICogQHBhcmFtIGRpcmVjdG9yeSBzdHJpbmcgdG8gYXBwZW5kIGRpcmVjdG9yeSB0bworICogQHBhcmFtIGNyZWRlbnRpYWxzIGNyZWRlbnRpYWxzIHRoZSBkaXJlY3Rvcnkgc2hvdWxkIGJlIGZvcgorICogIAorICogQHJldHVybnMgI0ZBTFNFIG9uIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXBwZW5kX2tleXJpbmdfZGlyZWN0b3J5X2Zvcl9jcmVkZW50aWFscyAoREJ1c1N0cmluZyAgICAgICpkaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgKmNyZWRlbnRpYWxzKQoreworICBEQnVzU3RyaW5nIGhvbWVkaXI7CisgIERCdXNTdHJpbmcgZG90ZGlyOworICBjb25zdCBjaGFyICpob21lcGF0aDsKKyAgY29uc3QgY2hhciAqaG9tZWRyaXZlOworCisgIF9kYnVzX2Fzc2VydCAoY3JlZGVudGlhbHMgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2NyZWRlbnRpYWxzX2FyZV9hbm9ueW1vdXMgKGNyZWRlbnRpYWxzKSk7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmaG9tZWRpcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGhvbWVkcml2ZSA9IF9kYnVzX2dldGVudigiSE9NRURSSVZFIik7CisgIGlmIChob21lZHJpdmUgIT0gTlVMTCAmJiAqaG9tZWRyaXZlICE9ICdcMCcpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZCgmaG9tZWRpcixob21lZHJpdmUpOworICAgIH0KKworICBob21lcGF0aCA9IF9kYnVzX2dldGVudigiSE9NRVBBVEgiKTsKKyAgaWYgKGhvbWVwYXRoICE9IE5VTEwgJiYgKmhvbWVwYXRoICE9ICdcMCcpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZCgmaG9tZWRpcixob21lcGF0aCk7CisgICAgfQorICAKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgIHsKKyAgICBjb25zdCBjaGFyICpvdmVycmlkZTsKKyAgICAKKyAgICBvdmVycmlkZSA9IF9kYnVzX2dldGVudiAoIkRCVVNfVEVTVF9IT01FRElSIik7CisgICAgaWYgKG92ZXJyaWRlICE9IE5VTEwgJiYgKm92ZXJyaWRlICE9ICdcMCcpCisgICAgICB7CisgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmaG9tZWRpciwgMCk7CisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmhvbWVkaXIsIG92ZXJyaWRlKSkKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKworICAgICAgICBfZGJ1c192ZXJib3NlICgiVXNpbmcgZmFrZSBob21lZGlyIGZvciB0ZXN0aW5nOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmaG9tZWRpcikpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgc3RhdGljIGRidXNfYm9vbF90IGFscmVhZHlfd2FybmVkID0gRkFMU0U7CisgICAgICAgIGlmICghYWxyZWFkeV93YXJuZWQpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfd2FybiAoIlVzaW5nIHlvdXIgcmVhbCBob21lIGRpcmVjdG9yeSBmb3IgdGVzdGluZywgc2V0IERCVVNfVEVTVF9IT01FRElSIHRvIGF2b2lkXG4iKTsKKyAgICAgICAgICAgIGFscmVhZHlfd2FybmVkID0gVFJVRTsKKyAgICAgICAgICB9CisgICAgICB9CisgIH0KKyNlbmRpZgorCisjaWZkZWYgREJVU19XSU5DRQorICAvKiBJdCdzIG5vdCBwb3NzaWJsZSB0byBjcmVhdGUgYSAuc29tZXRoaW5nIGRpcmVjdG9yeSBpbiBXaW5kb3dzIENFCisgICAgIHVzaW5nIHRoZSBmaWxlIGV4cGxvcmVyLiAgKi8KKyNkZWZpbmUgS0VZUklOR19ESVIgImRidXMta2V5cmluZ3MiCisjZWxzZQorI2RlZmluZSBLRVlSSU5HX0RJUiAiLmRidXMta2V5cmluZ3MiCisjZW5kaWYKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmRvdGRpciwgS0VZUklOR19ESVIpOworICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZob21lZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkb3RkaXIpKQorICAgIGdvdG8gZmFpbGVkOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmhvbWVkaXIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRpcmVjdG9yeSkpKSB7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmhvbWVkaXIpOworICByZXR1cm4gVFJVRTsKKyAgCisgZmFpbGVkOiAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZob21lZGlyKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiogQ2hlY2tzIGlmIGEgZmlsZSBleGlzdHMKKyoKKyogQHBhcmFtIGZpbGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlCisqIEByZXR1cm5zICNUUlVFIGlmIGZpbGUgZXhpc3RzCisqLworZGJ1c19ib29sX3QgCitfZGJ1c19maWxlX2V4aXN0cyAoY29uc3QgY2hhciAqZmlsZSkKK3sKKyAgRFdPUkQgYXR0cmlidXRlcyA9IEdldEZpbGVBdHRyaWJ1dGVzQSAoZmlsZSk7CisKKyAgaWYgKGF0dHJpYnV0ZXMgIT0gSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMgJiYgR2V0TGFzdEVycm9yKCkgIT0gRVJST1JfUEFUSF9OT1RfRk9VTkQpCisgICAgcmV0dXJuIFRSVUU7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7ICAKK30KKworLyoqCisgKiBBIHdyYXBwZXIgYXJvdW5kIHN0cmVycm9yKCkgYmVjYXVzZSBzb21lIHBsYXRmb3JtcworICogbWF5IGJlIGxhbWUgYW5kIG5vdCBoYXZlIHN0cmVycm9yKCkuCisgKgorICogQHBhcmFtIGVycm9yX251bWJlciBlcnJuby4KKyAqIEByZXR1cm5zIGVycm9yIGRlc2NyaXB0aW9uLgorICovCitjb25zdCBjaGFyKgorX2RidXNfc3RyZXJyb3IgKGludCBlcnJvcl9udW1iZXIpCit7CisjaWZkZWYgREJVU19XSU5DRQorICAvLyBUT0RPCisgIHJldHVybiAidW5rbm93biI7CisjZWxzZQorICBjb25zdCBjaGFyICptc2c7CisKKyAgc3dpdGNoIChlcnJvcl9udW1iZXIpCisgICAgeworICAgIGNhc2UgV1NBRUlOVFI6CisgICAgICByZXR1cm4gIkludGVycnVwdGVkIGZ1bmN0aW9uIGNhbGwiOworICAgIGNhc2UgV1NBRUFDQ0VTOgorICAgICAgcmV0dXJuICJQZXJtaXNzaW9uIGRlbmllZCI7CisgICAgY2FzZSBXU0FFRkFVTFQ6CisgICAgICByZXR1cm4gIkJhZCBhZGRyZXNzIjsKKyAgICBjYXNlIFdTQUVJTlZBTDoKKyAgICAgIHJldHVybiAiSW52YWxpZCBhcmd1bWVudCI7CisgICAgY2FzZSBXU0FFTUZJTEU6CisgICAgICByZXR1cm4gIlRvbyBtYW55IG9wZW4gZmlsZXMiOworICAgIGNhc2UgV1NBRVdPVUxEQkxPQ0s6CisgICAgICByZXR1cm4gIlJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlIjsKKyAgICBjYXNlIFdTQUVJTlBST0dSRVNTOgorICAgICAgcmV0dXJuICJPcGVyYXRpb24gbm93IGluIHByb2dyZXNzIjsKKyAgICBjYXNlIFdTQUVBTFJFQURZOgorICAgICAgcmV0dXJuICJPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcyI7CisgICAgY2FzZSBXU0FFTk9UU09DSzoKKyAgICAgIHJldHVybiAiU29ja2V0IG9wZXJhdGlvbiBvbiBub25zb2NrZXQiOworICAgIGNhc2UgV1NBRURFU1RBRERSUkVROgorICAgICAgcmV0dXJuICJEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkIjsKKyAgICBjYXNlIFdTQUVNU0dTSVpFOgorICAgICAgcmV0dXJuICJNZXNzYWdlIHRvbyBsb25nIjsKKyAgICBjYXNlIFdTQUVQUk9UT1RZUEU6CisgICAgICByZXR1cm4gIlByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldCI7CisgICAgY2FzZSBXU0FFTk9QUk9UT09QVDoKKyAgICAgIHJldHVybiAiQmFkIHByb3RvY29sIG9wdGlvbiI7CisgICAgY2FzZSBXU0FFUFJPVE9OT1NVUFBPUlQ6CisgICAgICByZXR1cm4gIlByb3RvY29sIG5vdCBzdXBwb3J0ZWQiOworICAgIGNhc2UgV1NBRVNPQ0tUTk9TVVBQT1JUOgorICAgICAgcmV0dXJuICJTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkIjsKKyAgICBjYXNlIFdTQUVPUE5PVFNVUFA6CisgICAgICByZXR1cm4gIk9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIjsKKyAgICBjYXNlIFdTQUVQRk5PU1VQUE9SVDoKKyAgICAgIHJldHVybiAiUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQiOworICAgIGNhc2UgV1NBRUFGTk9TVVBQT1JUOgorICAgICAgcmV0dXJuICJBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sIGZhbWlseSI7CisgICAgY2FzZSBXU0FFQUREUklOVVNFOgorICAgICAgcmV0dXJuICJBZGRyZXNzIGFscmVhZHkgaW4gdXNlIjsKKyAgICBjYXNlIFdTQUVBRERSTk9UQVZBSUw6CisgICAgICByZXR1cm4gIkNhbm5vdCBhc3NpZ24gcmVxdWVzdGVkIGFkZHJlc3MiOworICAgIGNhc2UgV1NBRU5FVERPV046CisgICAgICByZXR1cm4gIk5ldHdvcmsgaXMgZG93biI7CisgICAgY2FzZSBXU0FFTkVUVU5SRUFDSDoKKyAgICAgIHJldHVybiAiTmV0d29yayBpcyB1bnJlYWNoYWJsZSI7CisgICAgY2FzZSBXU0FFTkVUUkVTRVQ6CisgICAgICByZXR1cm4gIk5ldHdvcmsgZHJvcHBlZCBjb25uZWN0aW9uIG9uIHJlc2V0IjsKKyAgICBjYXNlIFdTQUVDT05OQUJPUlRFRDoKKyAgICAgIHJldHVybiAiU29mdHdhcmUgY2F1c2VkIGNvbm5lY3Rpb24gYWJvcnQiOworICAgIGNhc2UgV1NBRUNPTk5SRVNFVDoKKyAgICAgIHJldHVybiAiQ29ubmVjdGlvbiByZXNldCBieSBwZWVyIjsKKyAgICBjYXNlIFdTQUVOT0JVRlM6CisgICAgICByZXR1cm4gIk5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUiOworICAgIGNhc2UgV1NBRUlTQ09OTjoKKyAgICAgIHJldHVybiAiU29ja2V0IGlzIGFscmVhZHkgY29ubmVjdGVkIjsKKyAgICBjYXNlIFdTQUVOT1RDT05OOgorICAgICAgcmV0dXJuICJTb2NrZXQgaXMgbm90IGNvbm5lY3RlZCI7CisgICAgY2FzZSBXU0FFU0hVVERPV046CisgICAgICByZXR1cm4gIkNhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93biI7CisgICAgY2FzZSBXU0FFVElNRURPVVQ6CisgICAgICByZXR1cm4gIkNvbm5lY3Rpb24gdGltZWQgb3V0IjsKKyAgICBjYXNlIFdTQUVDT05OUkVGVVNFRDoKKyAgICAgIHJldHVybiAiQ29ubmVjdGlvbiByZWZ1c2VkIjsKKyAgICBjYXNlIFdTQUVIT1NURE9XTjoKKyAgICAgIHJldHVybiAiSG9zdCBpcyBkb3duIjsKKyAgICBjYXNlIFdTQUVIT1NUVU5SRUFDSDoKKyAgICAgIHJldHVybiAiTm8gcm91dGUgdG8gaG9zdCI7CisgICAgY2FzZSBXU0FFUFJPQ0xJTToKKyAgICAgIHJldHVybiAiVG9vIG1hbnkgcHJvY2Vzc2VzIjsKKyAgICBjYXNlIFdTQUVESVNDT046CisgICAgICByZXR1cm4gIkdyYWNlZnVsIHNodXRkb3duIGluIHByb2dyZXNzIjsKKyAgICBjYXNlIFdTQVRZUEVfTk9UX0ZPVU5EOgorICAgICAgcmV0dXJuICJDbGFzcyB0eXBlIG5vdCBmb3VuZCI7CisgICAgY2FzZSBXU0FIT1NUX05PVF9GT1VORDoKKyAgICAgIHJldHVybiAiSG9zdCBub3QgZm91bmQiOworICAgIGNhc2UgV1NBVFJZX0FHQUlOOgorICAgICAgcmV0dXJuICJOb25hdXRob3JpdGF0aXZlIGhvc3Qgbm90IGZvdW5kIjsKKyAgICBjYXNlIFdTQU5PX1JFQ09WRVJZOgorICAgICAgcmV0dXJuICJUaGlzIGlzIGEgbm9ucmVjb3ZlcmFibGUgZXJyb3IiOworICAgIGNhc2UgV1NBTk9fREFUQToKKyAgICAgIHJldHVybiAiVmFsaWQgbmFtZSwgbm8gZGF0YSByZWNvcmQgb2YgcmVxdWVzdGVkIHR5cGUiOworICAgIGNhc2UgV1NBX0lOVkFMSURfSEFORExFOgorICAgICAgcmV0dXJuICJTcGVjaWZpZWQgZXZlbnQgb2JqZWN0IGhhbmRsZSBpcyBpbnZhbGlkIjsKKyAgICBjYXNlIFdTQV9JTlZBTElEX1BBUkFNRVRFUjoKKyAgICAgIHJldHVybiAiT25lIG9yIG1vcmUgcGFyYW1ldGVycyBhcmUgaW52YWxpZCI7CisgICAgY2FzZSBXU0FfSU9fSU5DT01QTEVURToKKyAgICAgIHJldHVybiAiT3ZlcmxhcHBlZCBJL08gZXZlbnQgb2JqZWN0IG5vdCBpbiBzaWduYWxlZCBzdGF0ZSI7CisgICAgY2FzZSBXU0FfSU9fUEVORElORzoKKyAgICAgIHJldHVybiAiT3ZlcmxhcHBlZCBvcGVyYXRpb25zIHdpbGwgY29tcGxldGUgbGF0ZXIiOworICAgIGNhc2UgV1NBX05PVF9FTk9VR0hfTUVNT1JZOgorICAgICAgcmV0dXJuICJJbnN1ZmZpY2llbnQgbWVtb3J5IGF2YWlsYWJsZSI7CisgICAgY2FzZSBXU0FfT1BFUkFUSU9OX0FCT1JURUQ6CisgICAgICByZXR1cm4gIk92ZXJsYXBwZWQgb3BlcmF0aW9uIGFib3J0ZWQiOworI2lmZGVmIFdTQUlOVkFMSURQUk9DVEFCTEUKKworICAgIGNhc2UgV1NBSU5WQUxJRFBST0NUQUJMRToKKyAgICAgIHJldHVybiAiSW52YWxpZCBwcm9jZWR1cmUgdGFibGUgZnJvbSBzZXJ2aWNlIHByb3ZpZGVyIjsKKyNlbmRpZgorI2lmZGVmIFdTQUlOVkFMSURQUk9WSURFUgorCisgICAgY2FzZSBXU0FJTlZBTElEUFJPVklERVI6CisgICAgICByZXR1cm4gIkludmFsaWQgc2VydmljZSBwcm92aWRlciB2ZXJzaW9uIG51bWJlciI7CisjZW5kaWYKKyNpZmRlZiBXU0FQUk9WSURFUkZBSUxFRElOSVQKKworICAgIGNhc2UgV1NBUFJPVklERVJGQUlMRURJTklUOgorICAgICAgcmV0dXJuICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBhIHNlcnZpY2UgcHJvdmlkZXIiOworI2VuZGlmCisKKyAgICBjYXNlIFdTQVNZU0NBTExGQUlMVVJFOgorICAgICAgcmV0dXJuICJTeXN0ZW0gY2FsbCBmYWlsdXJlIjsKKyAgICB9CisgIG1zZyA9IHN0cmVycm9yIChlcnJvcl9udW1iZXIpOworICBpZiAobXNnID09IE5VTEwpCisgICAgbXNnID0gInVua25vd24iOworCisgIHJldHVybiBtc2c7CisjZW5kaWYgLy9EQlVTX1dJTkNFCit9CisKKy8qKgorICogQXNzaWducyBhbiBlcnJvciBuYW1lIGFuZCBtZXNzYWdlIGNvcnJlc3BvbmRpbmcgdG8gYSBXaW4zMiBlcnJvcgorICogY29kZSB0byBhIERCdXNFcnJvci4gRG9lcyBub3RoaW5nIGlmIGVycm9yIGlzICNOVUxMLgorICoKKyAqIEBwYXJhbSBlcnJvciB0aGUgZXJyb3IuCisgKiBAcGFyYW0gY29kZSB0aGUgV2luMzIgZXJyb3IgY29kZQorICovCit2b2lkCitfZGJ1c193aW5fc2V0X2Vycm9yX2Zyb21fd2luX2Vycm9yIChEQnVzRXJyb3IgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBjb2RlKQoreworICBjaGFyICptc2c7CisKKyAgLyogQXMgd2Ugd2FudCB0aGUgRW5nbGlzaCBtZXNzYWdlLCB1c2UgdGhlIEEgQVBJICovCisgIEZvcm1hdE1lc3NhZ2VBIChGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfAorICAgICAgICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMgfAorICAgICAgICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0sCisgICAgICAgICAgICAgICAgICBOVUxMLCBjb2RlLCBNQUtFTEFOR0lEIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUyksCisgICAgICAgICAgICAgICAgICAoTFBTVFIpICZtc2csIDAsIE5VTEwpOworICBpZiAobXNnKQorICAgIHsKKyAgICAgIGNoYXIgKm1zZ19jb3B5OworCisgICAgICBtc2dfY29weSA9IGRidXNfbWFsbG9jIChzdHJsZW4gKG1zZykpOworICAgICAgc3RyY3B5IChtc2dfY29weSwgbXNnKTsKKyAgICAgIExvY2FsRnJlZSAobXNnKTsKKworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCAid2luMzIuZXJyb3IiLCAiJXMiLCBtc2dfY29weSk7CisgICAgfQorICBlbHNlCisgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCAid2luMzIuZXJyb3IiLCAiVW5rbm93biBlcnJvciBjb2RlICVkIG9yIEZvcm1hdE1lc3NhZ2UgZmFpbGVkIiwgY29kZSk7Cit9CisKK3ZvaWQKK19kYnVzX3dpbl93YXJuX3dpbl9lcnJvciAoY29uc3QgY2hhciAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgY29kZSkKK3sKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgX2RidXNfd2luX3NldF9lcnJvcl9mcm9tX3dpbl9lcnJvciAoJmVycm9yLCBjb2RlKTsKKyAgX2RidXNfd2FybiAoIiVzOiAlc1xuIiwgbWVzc2FnZSwgZXJyb3IubWVzc2FnZSk7CisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKK30KKworLyoqCisgKiBSZW1vdmVzIGEgZGlyZWN0b3J5OyBEaXJlY3RvcnkgbXVzdCBiZSBlbXB0eQorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSBkaXJlY3RvcnkgZmlsZW5hbWUKKyAqIEBwYXJhbSBlcnJvciBpbml0aWFsaXplZCBlcnJvciBvYmplY3QKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2RlbGV0ZV9kaXJlY3RvcnkgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgZmlsZW5hbWVfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworCisgIGlmIChSZW1vdmVEaXJlY3RvcnlBIChmaWxlbmFtZV9jKSA9PSAwKQorICAgIHsKKyAgICAgIGNoYXIgKmVtc2cgPSBfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChHZXRMYXN0RXJyb3IgKCkpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c193aW5fZXJyb3JfZnJvbV9sYXN0X2Vycm9yICgpLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVtb3ZlIGRpcmVjdG9yeSAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MsIGVtc2cpOworICAgICAgX2RidXNfd2luX2ZyZWVfZXJyb3Jfc3RyaW5nIChlbXNnKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIGZpbGVuYW1lIGlzIGFuIGFic29sdXRlIHBhdGgKKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lCisgKiBAcmV0dXJucyAjVFJVRSBpZiBhbiBhYnNvbHV0ZSBwYXRoCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19wYXRoX2lzX2Fic29sdXRlIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSkKK3sKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChmaWxlbmFtZSkgPiAwKQorICAgIHJldHVybiBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGZpbGVuYW1lLCAxKSA9PSAnOicKKyAgICAgICAgICAgfHwgX2RidXNfc3RyaW5nX2dldF9ieXRlIChmaWxlbmFtZSwgMCkgPT0gJ1xcJworICAgICAgICAgICB8fCBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGZpbGVuYW1lLCAwKSA9PSAnLyc7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19jaGVja19zZXR1aWQgKHZvaWQpCit7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqIEB9IGVuZCBvZiBzeXNkZXBzLXdpbiAqLworLyogdGVzdHMgaW4gZGJ1cy1zeXNkZXBzLXV0aWwuYyAqLworCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1zeXNkZXBzLXdpbi5oIGIvZGJ1cy9kYnVzL2RidXMtc3lzZGVwcy13aW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDYyNGI3Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtc3lzZGVwcy13aW4uaApAQCAtMCwwICsxLDkwIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3lzZGVwcy5jIFdyYXBwZXJzIGFyb3VuZCBzeXN0ZW0vbGliYyBmZWF0dXJlcyAoaW50ZXJuYWwgdG8gRC1CVVMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTm92ZWxsLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19TWVNERVBTX1dJTl9ICisjZGVmaW5lIERCVVNfU1lTREVQU19XSU5fSAorCitleHRlcm4gdm9pZCAqX2RidXNfd2luX2dldF9kbGxfaG1vZHVsZSAodm9pZCk7CisjZGVmaW5lIF9XSU5TT0NLQVBJXworCisjaW5jbHVkZSAiZGJ1cy1oYXNoLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyN1bmRlZiBpbnRlcmZhY2UKKworI2RlZmluZSBEQlVTX0NPTlNPTEVfRElSICIvdmFyL3J1bi9jb25zb2xlLyIKKworCit2b2lkIF9kYnVzX3dpbl9zZXRfZXJybm8gKGludCBlcnIpOworY29uc3QgY2hhciogX2RidXNfd2luX2Vycm9yX2Zyb21fbGFzdF9lcnJvciAodm9pZCk7CisKK3ZvaWQgX2RidXNfd2luX3N0YXJ0dXBfd2luc29jayAodm9pZCk7Cit2b2lkIF9kYnVzX3dpbl93YXJuX3dpbl9lcnJvciAgKGNvbnN0IGNoYXIgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGNvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK2NoYXIgKiBfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChpbnQgZXJyb3JfbnVtYmVyKTsKK3ZvaWQgX2RidXNfd2luX2ZyZWVfZXJyb3Jfc3RyaW5nIChjaGFyICpzdHJpbmcpOworCitleHRlcm4gY29uc3QgY2hhciogX2RidXNfbG1fc3RyZXJyb3IgIChpbnQgZXJyb3JfbnVtYmVyKTsKKworCitkYnVzX2Jvb2xfdCBfZGJ1c193aW5fYWNjb3VudF90b19zaWQgKGNvbnN0IHdjaGFyX3QgKndhY2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgKipwcHNpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAqZXJyb3IpOworCitkYnVzX2Jvb2xfdAorX2RidXNfd2luMzJfc2lkX3RvX25hbWVfYW5kX2RvbWFpbiAoZGJ1c191aWRfdCAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCAgICoqd25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90ICAgKip3ZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpOworCisKKy8qIERvbid0IGRlZmluZSBEQlVTX0NPTlNPTEVfRElSIG9uIFdpbjMyICovCisKK3djaGFyX3QgICAgKl9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChjb25zdCBjaGFyICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICplcnJvcik7CitjaGFyICAgICAgICpfZGJ1c193aW5fdXRmMTZfdG9fdXRmOCAoY29uc3Qgd2NoYXJfdCAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpOworCit2b2lkICAgICAgICBfZGJ1c193aW5fc2V0X2Vycm9yX2Zyb21fd2luX2Vycm9yIChEQnVzRXJyb3IgKmVycm9yLCBpbnQgY29kZSk7CisKK2RidXNfYm9vbF90CitfZGJ1c193aW5fc2lkX3RvX25hbWVfYW5kX2RvbWFpbiAoZGJ1c191aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCAgKip3bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90ICAqKndkb21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICplcnJvcik7CisKK2RidXNfYm9vbF90IF9kYnVzX2ZpbGVfZXhpc3RzIChjb25zdCBjaGFyICpmaWxlbmFtZSk7CisKK2RidXNfYm9vbF90IF9kYnVzX2dldF9jb25maWdfZmlsZV9uYW1lKERCdXNTdHJpbmcgKmNvbmZpZ19maWxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnMpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19nZXRfaW5zdGFsbF9yb290KGNoYXIgKnByZWZpeCwgaW50IGxlbik7CisKKyNlbmRpZgorCisvKiogQH0gZW5kIG9mIHN5c2RlcHMtd2luLmggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5jIGIvZGJ1cy9kYnVzL2RidXMtc3lzZGVwcy13aW5jZS1nbHVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRiMTM3MQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5jCkBAIC0wLDAgKzEsMTE2NSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5jIFdyYXBwZXJzIGZvciBXaW5kb3dzIENFIGFyb3VuZCBzeXN0ZW0vbGliYyBmZWF0dXJlcyAoaW50ZXJuYWwgdG8gRC1CVVMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTm92ZWxsLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmFsZiBIYWJhY2tlciA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorICogQ29weXJpZ2h0IChDKSAyMDA2IFBldGVyIEvDvG1tZWwgIDxzeW50aGV0aWNwcEBnbXgubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA2IENocmlzdGlhbiBFaHJsaWNoZXIgPGNoLmVocmxpY2hlckBnbXguZGU+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy13aW4uaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKy8qIEluY2x1ZGluZyBzaGxvYmouaCBjcmVhdGVzIHRyb3VibGUgb24gc29tZSBjb21waWxlcnMuICBKdXN0IGNoaWNrZW4KKyAgIG91dCBoZXJlIGJ5IGRlZmluaW5nIGp1c3Qgd2hhdCB3ZSBuZWVkLiAgKi8KKyNpZm5kZWYgQ1NJRExfUEVSU09OQUwKKyNkZWZpbmUgQ1NJRExfUEVSU09OQUwgNQorI2VuZGlmCisKKworLyogQ29weSBTUkMgdG8gREVTVCwgcmV0dXJuaW5nIHRoZSBhZGRyZXNzIG9mIHRoZSB0ZXJtaW5hdGluZyAnXDAnIGluIERFU1QuICAqLworc3RhdGljIGNoYXIgKgorc3RwY3B5IChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpCit7CisgIGNoYXIgKmQgPSBkZXN0OworICBjb25zdCBjaGFyICpzID0gc3JjOworCisgIGRvCisgICAgKmQrKyA9ICpzOworICB3aGlsZSAoKnMrKyAhPSAnXDAnKTsKKworICByZXR1cm4gZCAtIDE7Cit9CisKKworLyogVGhpcyBpcyBzcGVjaWFsIGNhc2VkLCBiZWNhdXNlIHdlIG11c3QgYXZvaWQgdXNpbmcgbWFueSBkYnVzCisgICBmdW5jdGlvbnMgKHN1Y2ggYXMgbWVtb3J5IGFsbG9jYXRpb25zKTogVGhvc2UgZnVuY3Rpb25zIG1heSBpbiB0dXJuCisgICBjYXVzZSB2ZXJib3NlIG91dHB1dCBhbmQgY2hlY2sgdGhlIGZsYWchICAqLworc3RhdGljIGNoYXIgKgorZ2V0X3ZlcmJvc2Vfc2V0dGluZygpCit7CisgIGNvbnN0IHdjaGFyX3QgZGlyW10gPSBMIlNvZnR3YXJlXFxmcmVlZGVza3RvcFxcREJ1cyI7CisgIGNvbnN0IHdjaGFyX3QgbmFtZVtdID0gTCJWZXJib3NlIjsKKyAgSEtFWSByb290X2tleTsKKyAgSEtFWSBrZXlfaGFuZGxlOworICBEV09SRCBuYnl0ZXM7CisgIERXT1JEIG4xOworICBEV09SRCB0eXBlOworICB3Y2hhcl90ICpyZXN1bHRfdyA9IE5VTEw7CisgIGNoYXIgKnJlc3VsdDsKKyAgaW50IGxlbjsKKworICByb290X2tleSA9IEhLRVlfTE9DQUxfTUFDSElORTsKKyAgaWYgKFJlZ09wZW5LZXlFeFcgKHJvb3Rfa2V5LCBkaXIsIDAsIEtFWV9SRUFELCAma2V5X2hhbmRsZSkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbmJ5dGVzID0gMTsKKyAgaWYgKFJlZ1F1ZXJ5VmFsdWVFeFcgKGtleV9oYW5kbGUsIG5hbWUsIDAsIE5VTEwsIE5VTEwsICZuYnl0ZXMpKQorICAgIHsKKyAgICAgIFJlZ0Nsb3NlS2V5IChrZXlfaGFuZGxlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgLyogUm91bmQgdXAgdG8gbXVsdGlwbGUgb2Ygd2NoYXJfdCwgY29udmVydCB0byBudW1iZXIgb2Ygd2NoYXJfdCdzLCBhbmQgYWRkIDEuICAqLworICBuMSA9ICgobmJ5dGVzICsgc2l6ZW9mKHdjaGFyX3QpIC0gMSkgLyBzaXplb2YgKHdjaGFyX3QpKSArIDE7CisgIHJlc3VsdF93ID0gbWFsbG9jIChuMSAqIHNpemVvZiAod2NoYXJfdCkpOworICBpZiAoIXJlc3VsdF93KQorICAgIHsKKyAgICAgIFJlZ0Nsb3NlS2V5IChrZXlfaGFuZGxlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgaWYgKFJlZ1F1ZXJ5VmFsdWVFeFcgKGtleV9oYW5kbGUsIG5hbWUsIDAsICZ0eXBlLCAoTFBCWVRFKSByZXN1bHRfdywgJm5ieXRlcykpCisgICAgeworICAgICAgUmVnQ2xvc2VLZXkgKGtleV9oYW5kbGUpOworICAgICAgZnJlZSAocmVzdWx0X3cpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICBSZWdDbG9zZUtleSAoa2V5X2hhbmRsZSk7CisgIHJlc3VsdF93W24xIC0gMV0gPSAwOyAvKiBNYWtlIHN1cmUgaXQgaXMgcmVhbGx5IGEgc3RyaW5nLiAgKi8KKworICAvKiBOT1RFOiBSRUdfTVVMVElfU1ogYW5kIFJFR19FWFBBTkRfU1ogbm90IHN1cHBvcnRlZCwgYmVjYXVzZSB0aGV5CisgICAgIGFyZSBub3QgbmVlZGVkIGluIHRoaXMgbW9kdWxlLiAgKi8KKyAgaWYgKHR5cGUgIT0gUkVHX1NaKQorICAgIHsKKyAgICAgIGZyZWUgKHJlc3VsdF93KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBsZW4gPSBXaWRlQ2hhclRvTXVsdGlCeXRlIChDUF9VVEY4LCAwLCByZXN1bHRfdywgLTEsIE5VTEwsIDAsIE5VTEwsIE5VTEwpOworICBpZiAobGVuIDwgMCkKKyAgICB7CisgICAgICBmcmVlIChyZXN1bHRfdyk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmVzdWx0ID0gbWFsbG9jIChsZW4gKyAxKTsKKyAgaWYgKCFyZXN1bHQpCisgICAgeworICAgICAgZnJlZSAocmVzdWx0X3cpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGxlbiA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUgKENQX1VURjgsIDAsIHJlc3VsdF93LCAtMSwgcmVzdWx0LCBsZW4sIE5VTEwsIE5VTEwpOworICBmcmVlIChyZXN1bHRfdyk7CisgIGlmIChsZW4gPCAwKQorICAgIHsKKyAgICAgIGZyZWUgKHJlc3VsdCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyogUmV0dXJuIGEgc3RyaW5nIGZyb20gdGhlIFczMiBSZWdpc3RyeSBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCisgICBDYWxsZXIgbXVzdCByZWxlYXNlIHRoZSByZXR1cm4gdmFsdWUuICBBIE5VTEwgZm9yIHJvb3QgaXMgYW4gYWxpYXMKKyAgIGZvciBIS0VZX0NVUlJFTlRfVVNFUiwgSEtFWV9MT0NBTF9NQUNISU5FIGluIHR1cm4uICovCitzdGF0aWMgY2hhciAqCityZWFkX3czMl9yZWdpc3RyeV9zdHJpbmcgKGNvbnN0IGNoYXIgKnJvb3QsIGNvbnN0IGNoYXIgKmRpciwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgSEtFWSByb290X2tleSwga2V5X2hhbmRsZTsKKyAgRFdPUkQgbjEsIG5ieXRlcywgdHlwZTsKKyAgY2hhciAqcmVzdWx0ID0gTlVMTDsKKwkKKyAgaWYgKCAhcm9vdCApCisgICAgcm9vdF9rZXkgPSBIS0VZX0NVUlJFTlRfVVNFUjsKKyAgZWxzZSBpZiAoICFzdHJjbXAoIHJvb3QsICJIS0VZX0NMQVNTRVNfUk9PVCIgKSApCisgICAgcm9vdF9rZXkgPSBIS0VZX0NMQVNTRVNfUk9PVDsKKyAgZWxzZSBpZiAoICFzdHJjbXAoIHJvb3QsICJIS0VZX0NVUlJFTlRfVVNFUiIgKSApCisgICAgcm9vdF9rZXkgPSBIS0VZX0NVUlJFTlRfVVNFUjsKKyAgZWxzZSBpZiAoICFzdHJjbXAoIHJvb3QsICJIS0VZX0xPQ0FMX01BQ0hJTkUiICkgKQorICAgIHJvb3Rfa2V5ID0gSEtFWV9MT0NBTF9NQUNISU5FOworICBlbHNlIGlmICggIXN0cmNtcCggcm9vdCwgIkhLRVlfVVNFUlMiICkgKQorICAgIHJvb3Rfa2V5ID0gSEtFWV9VU0VSUzsKKyAgZWxzZQorICAgIHJldHVybiBOVUxMOworCisgIGlmIChSZWdPcGVuS2V5RXhBIChyb290X2tleSwgZGlyLCAwLCBLRVlfUkVBRCwgJmtleV9oYW5kbGUpKQorICAgIHsKKyAgICAgIGlmIChyb290KQorICAgICAgICByZXR1cm4gTlVMTDsgLyogbm8gbmVlZCBmb3IgYSBSZWdDbG9zZSwgc28gcmV0dXJuIGRpcmVjdCAqLworICAgICAgLyogSXQgc2VlbXMgdG8gYmUgY29tbW9uIHByYWN0aXNlIHRvIGZhbGwgYmFjayB0byBIS0xNLiAqLworICAgICAgaWYgKFJlZ09wZW5LZXlFeEEgKEhLRVlfTE9DQUxfTUFDSElORSwgZGlyLCAwLCBLRVlfUkVBRCwgJmtleV9oYW5kbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsgLyogc3RpbGwgbm8gbmVlZCBmb3IgYSBSZWdDbG9zZSwgc28gcmV0dXJuIGRpcmVjdCAqLworICAgIH0KKworICBuYnl0ZXMgPSAxOworICBpZiAoUmVnUXVlcnlWYWx1ZUV4QSAoa2V5X2hhbmRsZSwgbmFtZSwgMCwgTlVMTCwgTlVMTCwgJm5ieXRlcykpCisgICAgeworICAgICAgaWYgKHJvb3QpCisgICAgICAgIGdvdG8gb3V0OworICAgICAgLyogVHJ5IHRvIGZhbGxiYWNrIHRvIEhLTE0gYWxzbyBmb3IgYSBtaXNzaW5nIHZhbHVlLiAgKi8KKyAgICAgIFJlZ0Nsb3NlS2V5IChrZXlfaGFuZGxlKTsKKyAgICAgIGlmIChSZWdPcGVuS2V5RXhBIChIS0VZX0xPQ0FMX01BQ0hJTkUsIGRpciwgMCwgS0VZX1JFQUQsICZrZXlfaGFuZGxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIE5vcGUuICAqLworICAgICAgaWYgKFJlZ1F1ZXJ5VmFsdWVFeEEgKGtleV9oYW5kbGUsIG5hbWUsIDAsIE5VTEwsIE5VTEwsICZuYnl0ZXMpKQorICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgIG4xID0gbmJ5dGVzICsgMTsKKyAgcmVzdWx0ID0gbWFsbG9jIChuMSk7CisgIGlmICghcmVzdWx0KQorICAgIGdvdG8gb3V0OworICBpZiAoUmVnUXVlcnlWYWx1ZUV4QSAoa2V5X2hhbmRsZSwgbmFtZSwgMCwgJnR5cGUsIHJlc3VsdCwgJm4xKSkKKyAgICB7CisgICAgICBmcmVlKHJlc3VsdCk7CisgICAgICByZXN1bHQgPSBOVUxMOworICAgICAgZ290byBvdXQ7CisgICAgfQorICByZXN1bHRbbmJ5dGVzXSA9IDA7IC8qIE1ha2Ugc3VyZSBpdCBpcyByZWFsbHkgYSBzdHJpbmcuICAqLworCisgb3V0OgorICBSZWdDbG9zZUtleSAoa2V5X2hhbmRsZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIGNoYXIgKgorZmluZF9pbnN0X2RpciAoKQoreworICByZXR1cm4gcmVhZF93MzJfcmVnaXN0cnlfc3RyaW5nICgiSEtFWV9MT0NBTF9NQUNISU5FIiwKKwkJCQkgICJTb2Z0d2FyZVxcZnJlZWRlc2t0b3BcXERCdXMiLAorCQkJCSAgIkluc3RhbGwgRGlyZWN0b3J5Iik7Cit9CisKKworc3RhdGljIGNoYXIgKgorZmluZF9lbnZfaW5fcmVnaXN0cnkgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIHJldHVybiByZWFkX3czMl9yZWdpc3RyeV9zdHJpbmcgKCJIS0VZX0xPQ0FMX01BQ0hJTkUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU29mdHdhcmVcXGZyZWVkZXNrdG9wXFxEQnVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Cit9CisKKworc3RhdGljIGNoYXIgKgorZmluZF9wcm9ncmFtX2luX2luc3RfZGlyIChjb25zdCBjaGFyICpuYW1lKQoreworICBjaGFyICpyZXN1bHQgPSBOVUxMOworICBjaGFyICp0bXA7CisKKyAgdG1wID0gZmluZF9pbnN0X2RpciAoKTsKKyAgaWYgKCF0bXApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmVzdWx0ID0gbWFsbG9jIChzdHJsZW4gKHRtcCkgKyA1ICsgc3RybGVuIChuYW1lKSArIDEpOworICBpZiAoIXJlc3VsdCkKKyAgICB7CisgICAgICBmcmVlICh0bXApOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHN0cmNweSAoc3RwY3B5IChzdHBjcHkgKHJlc3VsdCwgdG1wKSwgIlxcYmluXFwiKSwgbmFtZSk7CisgIGZyZWUgKHRtcCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgY2hhciAqCitmaW5kX2luc3Rfc3ViZGlyIChjb25zdCBjaGFyICpuYW1lKQoreworICBjaGFyICpyZXN1bHQgPSBOVUxMOworICBjaGFyICp0bXA7CisKKyAgdG1wID0gZmluZF9pbnN0X2RpciAoKTsKKyAgaWYgKCF0bXApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmVzdWx0ID0gbWFsbG9jIChzdHJsZW4gKHRtcCkgKyAxICsgc3RybGVuIChuYW1lKSArIDEpOworICBpZiAoIXJlc3VsdCkKKyAgICB7CisgICAgICBmcmVlICh0bXApOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHN0cmNweSAoc3RwY3B5IChzdHBjcHkgKHJlc3VsdCwgdG1wKSwgIlxcIiksIG5hbWUpOworICBmcmVlICh0bXApOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIGNoYXIgKgorZmluZF9teV9kb2N1bWVudHNfZm9sZGVyICgpCit7CisgIC8qIE9uZSBmb3Igc2FmZXR5LCBqdXN0IGluIGNhc2UuICAqLworICBjaGFyIGRpcltNQVhfUEFUSCArIDFdOworICBjaGFyICpyZXN1bHQ7CisKKyAgZGlyWzBdID0gJ1wwJzsKKyAgLyogTWF5IHJldHVybiBmYWxzZSBldmVuIGlmIHN1Y2Nlc3NmdWwuICAqLworICBTSEdldFNwZWNpYWxGb2xkZXJQYXRoQSAoMCwgZGlyLCBDU0lETF9QRVJTT05BTCwgMCk7CisgIGlmIChkaXJbMF0gPT0gJ1wwJykKKyAgICByZXR1cm4gTlVMTDsKKworICByZXN1bHQgPSBtYWxsb2MgKHN0cmxlbiAoZGlyKSArIDEpOworICBpZiAoIXJlc3VsdCkKKyAgICByZXR1cm4gTlVMTDsKKyAgc3RyY3B5IChyZXN1bHQsIGRpcik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworI2RlZmluZSBNQVhfRU5WIDMwCisKK2NoYXIgKmVudmlyb25bTUFYX0VOViArIDFdOworCitjaGFyICoKK2dldGVudiAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgc3RhdGljIGNoYXIgKnBhc3RfcmVzdWx0OworICBjaGFyICoqZW52cDsKKyAgaW50IGlkeDsKKworICBpZiAocGFzdF9yZXN1bHQpCisgICAgeworICAgICAgZnJlZSAocGFzdF9yZXN1bHQpOworICAgICAgcGFzdF9yZXN1bHQgPSBOVUxMOworICAgIH0KKworICBpZiAoISBzdHJjbXAgKG5hbWUsICJEQlVTX1ZFUkJPU0UiKSkKKyAgICByZXR1cm4gcGFzdF9yZXN1bHQgPSBnZXRfdmVyYm9zZV9zZXR0aW5nICgpOworICBlbHNlIGlmICghIHN0cmNtcCAobmFtZSwgIkhPTUVQQVRIIikpCisgICAgcmV0dXJuIHBhc3RfcmVzdWx0ID0gZmluZF9teV9kb2N1bWVudHNfZm9sZGVyICgpOworICBlbHNlIGlmICghIHN0cmNtcCAobmFtZSwgIkRCVVNfREFUQURJUiIpKQorICAgIHJldHVybiBwYXN0X3Jlc3VsdCA9IGZpbmRfaW5zdF9zdWJkaXIgKCJzaGFyZSIpOworCisgIGZvciAoZW52cCA9IGVudmlyb247ICplbnZwICE9IDA7IGVudnArKykKKyAgICB7CisgICAgICBjb25zdCBjaGFyICp2YXJwID0gbmFtZTsKKyAgICAgIGNoYXIgKmVwID0gKmVudnA7CisgICAgICBpbnQgc2FtZV9uYW1lID0gMDsKKworICAgICAgd2hpbGUgKCp2YXJwID09ICplcCAmJiAqdmFycCAhPSAnXDAnKQorCXsKKwkgICsrZXA7CisJICArK3ZhcnA7CisJfTsKKworICAgICAgaWYgKCp2YXJwID09ICdcMCcgJiYgKmVwID09ICc9JykKKwlyZXR1cm4gZXAgKyAxOworICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworCitpbnQKK3B1dGVudiAoY2hhciAqc3RyKQoreworICBjaGFyICoqZW52cDsKKyAgaW50IGlkeDsKKyAgZm9yIChlbnZwID0gZW52aXJvbjsgKmVudnAgIT0gMDsgZW52cCsrKQorICAgIHsKKyAgICAgIGNoYXIgKnZhcnAgPSBzdHI7CisgICAgICBjaGFyICplcCA9ICplbnZwOworICAgICAgaW50IHNhbWVfbmFtZSA9IDA7CisKKyAgICAgIHdoaWxlICgqdmFycCA9PSAqZXAgJiYgKnZhcnAgIT0gJ1wwJykKKwl7CisJICBpZiAoKnZhcnAgPT0gJz0nKQorCSAgICBzYW1lX25hbWUgPSAxOworCSAgKytlcDsKKwkgICsrdmFycDsKKwl9OworCisgICAgICBpZiAoKnZhcnAgPT0gKmVwICYmICp2YXJwID09ICdcMCcpCisJcmV0dXJuIDA7CisgICAgICBpZiAoc2FtZV9uYW1lKQorCXsKKwkgICplbnZwID0gc3RyOworCSAgcmV0dXJuIDA7CisJfQorICAgIH0KKworICBpZHggPSBlbnZwIC0gZW52aXJvbjsKKyAgaWYgKGlkeCA+IE1BWF9FTlYpCisgICAgeworICAgICAgX2RidXNfd2luX3NldF9lcnJubyAoRU5PTUVNKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgZW52aXJvbltpZHhdID0gc3RyOworICByZXR1cm4gMDsKK30KKworCitjbG9ja190CitjbG9jayAodm9pZCkKK3sKKyAgcmV0dXJuIEdldFRpY2tDb3VudCAoKTsKK30KKworCit2b2lkCithYm9ydCAodm9pZCkKK3sKKyAgLyogVGhpcyBpcyB3aGF0IHdpbmRvd3MgZG9lcy4gICovCisgIGV4aXQgKDMpOworfQorCisKK3ZvaWQKK0dldFN5c3RlbVRpbWVBc0ZpbGVUaW1lIChMUEZJTEVUSU1FIGZ0cCkKK3sKKyAgU1lTVEVNVElNRSBzdDsKKyAgR2V0U3lzdGVtVGltZSAoJnN0KTsKKyAgU3lzdGVtVGltZVRvRmlsZVRpbWUgKCZzdCwgZnRwKTsKK30KKworCit1bnNpZ25lZCBjaGFyKgorX21ic3JjaHIgKGNvbnN0IHVuc2lnbmVkIGNoYXIqIHN0ciwgdW5zaWduZWQgaW50IGNoKQoreworICAvKiBGSVhNRS4gIFRoaXMgaXMgbm90IG11bHRpLWJ5dGUgc2FmZS4gICovCisgIHJldHVybiBzdHJyY2hyIChzdHIsIGNoKTsKK30KKworCitIQU5ETEUgT3BlbkZpbGVNYXBwaW5nQShEV09SRCBkd0Rlc2lyZWRBY2Nlc3MsCisJCQlCT09MIGJJbmhlcml0SGFuZGxlLAorCQkJTFBDU1RSIGxwTmFtZSkKK3sKKyAgRFdPUkQgZmxQcm90ZWN0ID0gMDsKKyAgSEFORExFIGhNYXBwaW5nOworCisgIGlmIChkd0Rlc2lyZWRBY2Nlc3MgJiBGSUxFX01BUF9SRUFEKQorICAgIGZsUHJvdGVjdCB8PSBQQUdFX1JFQURPTkxZOworCisgIGlmIChkd0Rlc2lyZWRBY2Nlc3MgJiBGSUxFX01BUF9XUklURSkKKyAgICBmbFByb3RlY3QgfD0gUEFHRV9SRUFEV1JJVEU7CisKKyAgU2V0TGFzdEVycm9yICgwKTsKKyAgaE1hcHBpbmcgPSBDcmVhdGVGaWxlTWFwcGluZ0EoSU5WQUxJRF9IQU5ETEVfVkFMVUUsCisJCQkJTlVMTCwgZmxQcm90ZWN0LCAwLCAwLCBscE5hbWUpOworICBpZiAoaE1hcHBpbmcgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgeworICAgICAgLyogSnVzdCBpbiBjYXNlIFdpbmRvd3MgQ0UgY2hhbmdlcyBpdHMgYmVoYXZpb3VyLCB3ZSBjaGVjayBmb3IKKyAgICAgICAgIHRoZSByaWdodCBlcnJvciB2YWx1ZSBoZXJlLiAgKi8KKyAgICAgIGlmIChHZXRMYXN0RXJyb3IgKCkgIT0gRVJST1JfQUxSRUFEWV9FWElTVFMpCisgICAgICAgIHsKKyAgICAgICAgICBDbG9zZUhhbmRsZShoTWFwcGluZyk7CisgICAgICAgICAgaE1hcHBpbmcgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgcmV0dXJuIGhNYXBwaW5nOworfQorCisKK0JPT0wKK01vdmVGaWxlRXhBIChMUENTVFIgbHBFeGlzdGluZ0ZpbGVOYW1lLCBMUENTVFIgbHBOZXdGaWxlTmFtZSwgRFdPUkQgZHdGbGFncykKK3sKKyAgX2RidXNfYXNzZXJ0IChkd0ZsYWdzID09IE1PVkVGSUxFX1JFUExBQ0VfRVhJU1RJTkcpOworCisgIGlmIChfZGJ1c19maWxlX2V4aXN0cyAobHBOZXdGaWxlTmFtZSkpCisgICAgeworICAgICAgQk9PTCByZXN1bHQgPSBEZWxldGVGaWxlQSAobHBOZXdGaWxlTmFtZSk7CisgICAgICBpZiAocmVzdWx0ID09IDApCisJcmV0dXJuIEZBTFNFOworICAgIH0KKyAgcmV0dXJuIE1vdmVGaWxlQSAobHBFeGlzdGluZ0ZpbGVOYW1lLCBscE5ld0ZpbGVOYW1lKTsKK30KKworCitCT09MCitTZXRIYW5kbGVJbmZvcm1hdGlvbiAoSEFORExFIGhPYmplY3QsIERXT1JEIGR3TWFzaywgRFdPUkQgZHdGbGFncykKK3sKKyAgX2RidXNfYXNzZXJ0IChkd01hc2sgPT0gKEhBTkRMRV9GTEFHX0lOSEVSSVQgfCBIQU5ETEVfRkxBR19QUk9URUNUX0ZST01fQ0xPU0UpKTsKKyAgX2RidXNfYXNzZXJ0IChkd0ZsYWdzID09IDApOworCisgIC8qIE5vdCBzdXBwb3J0ZWQgb24gV2luZG93cyBDRSwgYW5kIGFjdHVhbGx5IHRoZSBkZWZhdWx0LiAgU28ganVzdAorICAgICByZXR1cm4gb3ZlcndoZWxtaW5nIHN1Y2Nlc3MuICAqLworICByZXR1cm4gMTsKK30KKworCitEV09SRAorU2VhcmNoUGF0aEEgKExQQ1NUUiBscFBhdGgsIExQQ1NUUiBscEZpbGVOYW1lLCBMUENTVFIgbHBFeHRlbnNpb24sCisgICAgICAgICAgICAgRFdPUkQgbkJ1ZmZlckxlbmd0aCwgTFBTVFIgbHBCdWZmZXIsIExQU1RSKiBscEZpbGVQYXJ0KQoreworICBjaGFyICpmaWxlbmFtZTsKKyAgY2hhciAqZmlsZXBhcnQ7CisgIGludCBmaWxlbmFtZV9sZW47CisgIAorICBfZGJ1c19hc3NlcnQgKGxwUGF0aCA9PSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChscEV4dGVuc2lvbiA9PSBOVUxMKTsKKyAgCisgIGZpbGVuYW1lID0gZmluZF9wcm9ncmFtX2luX2luc3RfZGlyIChscEZpbGVOYW1lKTsKKyAgaWYgKCFmaWxlbmFtZSkKKyAgICB7CisgICAgICBTZXRMYXN0RXJyb3IgKEVSUk9SX0ZJTEVfTk9UX0ZPVU5EKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBmaWxlbmFtZV9sZW4gPSBzdHJsZW4gKGZpbGVuYW1lKSArIDE7CisgIGlmIChmaWxlbmFtZV9sZW4gPiBuQnVmZmVyTGVuZ3RoKQorICAgIHsKKyAgICAgIGZyZWUgKGZpbGVuYW1lKTsKKyAgICAgIHJldHVybiBmaWxlbmFtZV9sZW47CisgICAgfQorCisgIHN0cmNweSAobHBCdWZmZXIsIGZpbGVuYW1lKTsKKyAgZnJlZSAoZmlsZW5hbWUpOworCisgIGZpbGVwYXJ0ID0gX21ic3JjaHIgKGxwQnVmZmVyLCAnXFwnKTsKKyAgaWYgKCFmaWxlcGFydCkKKyAgICBmaWxlcGFydCA9IGxwQnVmZmVyOworICAqbHBGaWxlUGFydCA9IGZpbGVwYXJ0OworCisgIHJldHVybiBmaWxlbmFtZV9sZW4gLSAxOworfQorCisKKy8qKiBHZXRzIG91ciBTSUQKKyAqIEBwYXJhbSBwb2ludHMgdG8gc2lkIGJ1ZmZlciwgbmVlZCB0byBiZSBmcmVlZCB3aXRoIExvY2FsRnJlZSgpCisgKiBAcmV0dXJucyBwcm9jZXNzIHNpZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZ2V0c2lkKGNoYXIgKipzaWQpCit7CisgIC8qIFRoZXJlIGlzIG5vdGhpbmcgbGlrZSB0aGlzIG9uIFdpbmRvd3MgQ0UsIHNvIHdlIGZha2UgaXQuICAqLworICBzdGF0aWMgY29uc3QgY2hhciBhc2lkW10gPSAiUy0xLTUtMjEtNTE1OTY3ODk5LTkyMDAyNjI2Ni0xNzA4NTM3NzY4LTEwMDAiOworICBjaGFyICpidWYgPSBMb2NhbEFsbG9jIChMTUVNX0ZJWEVELCBzaXplb2YgKGFzaWQpKTsKKyAgaWYgKCFidWYpCisgICAgeworICAgICAgX2RidXNfd2luX3dhcm5fd2luX2Vycm9yICgiTG9jYWxBbGxvYyBmYWlsZWQiLCBHZXRMYXN0RXJyb3IgKCkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBtZW1jcHkgKGJ1ZiwgYXNpZCwgc2l6ZW9mIChhc2lkKSk7CisgICpzaWQgPSBidWY7CisgIHJldHVybiBUUlVFOworfQorCisKK0JPT0wKK0xvb2t1cEFjY291bnROYW1lVyAoTFBDV1NUUiBscFN5c3RlbU5hbWUsIExQQ1dTVFIgbHBBY2NvdW50TmFtZSwgUFNJRCBTaWQsIFBEV09SRCBjYlNpZCwKKyAgICAgICAgICAgICAgICAgICAgTFBXU1RSIFJlZmVyZW5jZWREb21haW5OYW1lLCBQRFdPUkQgY2NoUmVmZXJlbmNlZERvbWFpbk5hbWUsIFBTSURfTkFNRV9VU0UgcGVVc2UpCit7CisgIC8qIEN1cnJlbnRseSBub3QgbmVlZGVkLiAgKi8KKyAgcmV0dXJuIEZBTFNFOworfQorCisKK0JPT0wKK0lzVmFsaWRTaWQgKFBTSUQgcHNpZCkKK3sKKyAgLyogQ3VycmVudGx5IG5vdCBuZWVkZWQuICAqLworICByZXR1cm4gRkFMU0U7Cit9CisKKworSEFORExFCitDcmVhdGVGaWxlQSAoTFBDU1RSIGxwRmlsZU5hbWUsIERXT1JEIGR3RGVzaXJlZEFjY2VzcywgRFdPUkQgZHdTaGFyZWRNb2RlLAorCSAgICAgTFBTRUNVUklUWV9BVFRSSUJVVEVTIGxwU2VjdXJpdHlBdHRyaWJ1dGVzLAorCSAgICAgRFdPUkQgZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLCBEV09SRCBkd0ZsYWdzQW5kQXR0cmlidXRlcywKKwkgICAgIEhBTkRMRSBoVGVtcGxhdGVGaWxlKQoreworICB3Y2hhcl90ICpmaWxlbmFtZTsKKyAgSEFORExFIHJlc3VsdDsKKyAgaW50IGVycjsKKworICBmaWxlbmFtZSA9IF9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChscEZpbGVOYW1lLCBOVUxMKTsKKyAgaWYgKCFmaWxlbmFtZSkKKyAgICByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisKKyAgcmVzdWx0ID0gQ3JlYXRlRmlsZVcgKGZpbGVuYW1lLCBkd0Rlc2lyZWRBY2Nlc3MsIGR3U2hhcmVkTW9kZSwKKwkJCWxwU2VjdXJpdHlBdHRyaWJ1dGVzLCBkd0NyZWF0aW9uRGlzcG9zaXRpb24sCisJCQlkd0ZsYWdzQW5kQXR0cmlidXRlcywgaFRlbXBsYXRlRmlsZSk7CisKKyAgZXJyID0gR2V0TGFzdEVycm9yICgpOworICBkYnVzX2ZyZWUgKGZpbGVuYW1lKTsKKyAgU2V0TGFzdEVycm9yIChlcnIpOworICByZXR1cm4gcmVzdWx0OworfQorCisKK0JPT0wKK0RlbGV0ZUZpbGVBIChMUENTVFIgbHBGaWxlTmFtZSkKK3sKKyAgd2NoYXJfdCAqZmlsZW5hbWU7CisgIEJPT0wgcmVzdWx0OworICBpbnQgZXJyOworCisgIGZpbGVuYW1lID0gX2RidXNfd2luX3V0ZjhfdG9fdXRmMTYgKGxwRmlsZU5hbWUsIE5VTEwpOworICBpZiAoIWZpbGVuYW1lKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXN1bHQgPSBEZWxldGVGaWxlVyAoZmlsZW5hbWUpOworCisgIGVyciA9IEdldExhc3RFcnJvciAoKTsKKyAgZGJ1c19mcmVlIChmaWxlbmFtZSk7CisgIFNldExhc3RFcnJvciAoZXJyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitCT09MCitNb3ZlRmlsZUEgKExQQ1NUUiBscEV4aXN0aW5nRmlsZU5hbWUsIExQQ1NUUiBscE5ld0ZpbGVOYW1lKQoreworICB3Y2hhcl90ICpleGlzdGluZ19maWxlbmFtZTsKKyAgd2NoYXJfdCAqbmV3X2ZpbGVuYW1lOworICBCT09MIHJlc3VsdDsKKyAgaW50IGVycjsKKworICBleGlzdGluZ19maWxlbmFtZSA9IF9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChscEV4aXN0aW5nRmlsZU5hbWUsIE5VTEwpOworICBpZiAoISBleGlzdGluZ19maWxlbmFtZSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbmV3X2ZpbGVuYW1lID0gX2RidXNfd2luX3V0ZjhfdG9fdXRmMTYgKGxwTmV3RmlsZU5hbWUsIE5VTEwpOworICBpZiAoISBuZXdfZmlsZW5hbWUpCisgICAgeworICAgICAgZGJ1c19mcmVlIChleGlzdGluZ19maWxlbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJlc3VsdCA9IE1vdmVGaWxlVyAoZXhpc3RpbmdfZmlsZW5hbWUsIG5ld19maWxlbmFtZSk7CisKKyAgZXJyID0gR2V0TGFzdEVycm9yICgpOworICBkYnVzX2ZyZWUgKGV4aXN0aW5nX2ZpbGVuYW1lKTsKKyAgZGJ1c19mcmVlIChuZXdfZmlsZW5hbWUpOworICBTZXRMYXN0RXJyb3IgKGVycik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworRFdPUkQKK0dldEZpbGVBdHRyaWJ1dGVzQShMUENTVFIgbHBGaWxlTmFtZSkKK3sKKyAgd2NoYXJfdCAqZmlsZW5hbWU7CisgIERXT1JEIHJlc3VsdDsKKyAgaW50IGVycjsKKworICBmaWxlbmFtZSA9IF9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChscEZpbGVOYW1lLCBOVUxMKTsKKyAgaWYgKCFmaWxlbmFtZSkKKyAgICByZXR1cm4gSU5WQUxJRF9GSUxFX0FUVFJJQlVURVM7CisKKyAgcmVzdWx0ID0gR2V0RmlsZUF0dHJpYnV0ZXNXIChmaWxlbmFtZSk7CisKKyAgZXJyID0gR2V0TGFzdEVycm9yICgpOworICBkYnVzX2ZyZWUgKGZpbGVuYW1lKTsKKyAgU2V0TGFzdEVycm9yIChlcnIpOworICByZXR1cm4gcmVzdWx0OworfQorCisKK0JPT0wKK0dldEZpbGVBdHRyaWJ1dGVzRXhBIChMUENTVFIgbHBGaWxlTmFtZSwgR0VUX0ZJTEVFWF9JTkZPX0xFVkVMUyBmSW5mb0xldmVsSWQsCisgICAgICAgICAgICAgICAgICAgICAgUFZPSUQgbHBGaWxlSW5mb3JtYXRpb24pCit7CisgIHdjaGFyX3QgKmZpbGVuYW1lOworICBEV09SRCByZXN1bHQ7CisgIGludCBlcnI7CisKKyAgZmlsZW5hbWUgPSBfZGJ1c193aW5fdXRmOF90b191dGYxNiAobHBGaWxlTmFtZSwgTlVMTCk7CisgIGlmICghZmlsZW5hbWUpCisgICAgcmV0dXJuIElOVkFMSURfRklMRV9BVFRSSUJVVEVTOworCisgIHJlc3VsdCA9IEdldEZpbGVBdHRyaWJ1dGVzRXhXIChmaWxlbmFtZSwgZkluZm9MZXZlbElkLCBscEZpbGVJbmZvcm1hdGlvbik7CisKKyAgZXJyID0gR2V0TGFzdEVycm9yICgpOworICBkYnVzX2ZyZWUgKGZpbGVuYW1lKTsKKyAgU2V0TGFzdEVycm9yIChlcnIpOworICByZXR1cm4gcmVzdWx0OworfQorCisKK0hBTkRMRQorQ3JlYXRlRmlsZU1hcHBpbmdBIChIQU5ETEUgaEZpbGUsIExQU0VDVVJJVFlfQVRUUklCVVRFUyBscEF0dHJpYnV0ZXMsCisJCSAgICBEV09SRCBmbFByb3RlY3QsIERXT1JEIGR3TWF4aW11bVNpemVIaWdoLAorCQkgICAgRFdPUkQgZHdNYXhpbXVtU2l6ZUxvdywgTFBDU1RSIGxwTmFtZSkKK3sKKyAgd2NoYXJfdCAqbmFtZTsKKyAgSEFORExFIHJlc3VsdDsKKyAgaW50IGVycjsKKworICBpZiAobHBOYW1lKQorICAgIHsKKyAgICAgIG5hbWUgPSBfZGJ1c193aW5fdXRmOF90b191dGYxNiAobHBOYW1lLCBOVUxMKTsKKyAgICAgIGlmICghbmFtZSkKKwlyZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgICAgfQorICBlbHNlCisgICAgbmFtZSA9IE5VTEw7CisKKyAgcmVzdWx0ID0gQ3JlYXRlRmlsZU1hcHBpbmdXIChoRmlsZSwgbHBBdHRyaWJ1dGVzLCBmbFByb3RlY3QsCisJCQkgICAgICAgZHdNYXhpbXVtU2l6ZUhpZ2gsIGR3TWF4aW11bVNpemVMb3csCisJCQkgICAgICAgbmFtZSk7CisKKyAgZXJyID0gR2V0TGFzdEVycm9yICgpOworICBkYnVzX2ZyZWUgKG5hbWUpOworICBTZXRMYXN0RXJyb3IgKGVycik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworQk9PTAorQ3JlYXRlRGlyZWN0b3J5QSAoTFBDU1RSIGxwUGF0aE5hbWUsIExQU0VDVVJJVFlfQVRUUklCVVRFUyBscFNlY3VyaXR5QXR0cmlidXRlcykKK3sKKyAgd2NoYXJfdCAqcGF0aG5hbWU7CisgIEJPT0wgcmVzdWx0OworICBpbnQgZXJyOworCisgIHBhdGhuYW1lID0gX2RidXNfd2luX3V0ZjhfdG9fdXRmMTYgKGxwUGF0aE5hbWUsIE5VTEwpOworICBpZiAoIXBhdGhuYW1lKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXN1bHQgPSBDcmVhdGVEaXJlY3RvcnlXIChwYXRobmFtZSwgbHBTZWN1cml0eUF0dHJpYnV0ZXMpOworCisgIGVyciA9IEdldExhc3RFcnJvciAoKTsKKyAgZGJ1c19mcmVlIChwYXRobmFtZSk7CisgIFNldExhc3RFcnJvciAoZXJyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitCT09MCitSZW1vdmVEaXJlY3RvcnlBIChMUENTVFIgbHBQYXRoTmFtZSkKK3sKKyAgd2NoYXJfdCAqcGF0aG5hbWU7CisgIEJPT0wgcmVzdWx0OworICBpbnQgZXJyOworCisgIHBhdGhuYW1lID0gX2RidXNfd2luX3V0ZjhfdG9fdXRmMTYgKGxwUGF0aE5hbWUsIE5VTEwpOworICBpZiAoIXBhdGhuYW1lKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXN1bHQgPSBSZW1vdmVEaXJlY3RvcnlXIChwYXRobmFtZSk7CisKKyAgZXJyID0gR2V0TGFzdEVycm9yICgpOworICBkYnVzX2ZyZWUgKHBhdGhuYW1lKTsKKyAgU2V0TGFzdEVycm9yIChlcnIpOworICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBCT09MCitjb252ZXJ0X2ZpbmRfZGF0YSAoTFBXSU4zMl9GSU5EX0RBVEFXIGZkdywgTFBXSU4zMl9GSU5EX0RBVEFBIGZkYSkKK3sKKyAgY2hhciAqZmlsZW5hbWU7CisgIGludCBsZW47CisKKyAgZmRhLT5kd0ZpbGVBdHRyaWJ1dGVzID0gZmR3LT5kd0ZpbGVBdHRyaWJ1dGVzOworICBmZGEtPmZ0Q3JlYXRpb25UaW1lID0gZmR3LT5mdENyZWF0aW9uVGltZTsKKyAgZmRhLT5mdExhc3RBY2Nlc3NUaW1lID0gZmR3LT5mdExhc3RBY2Nlc3NUaW1lOworICBmZGEtPmZ0TGFzdFdyaXRlVGltZSA9IGZkdy0+ZnRMYXN0V3JpdGVUaW1lOworICBmZGEtPm5GaWxlU2l6ZUhpZ2ggPSBmZHctPm5GaWxlU2l6ZUhpZ2g7CisgIGZkYS0+bkZpbGVTaXplTG93ID0gZmR3LT5uRmlsZVNpemVMb3c7CisKKyAgZmlsZW5hbWUgPSBfZGJ1c193aW5fdXRmMTZfdG9fdXRmOCAoZmR3LT5jRmlsZU5hbWUsIE5VTEwpOworICBpZiAoIWZpbGVuYW1lKQorICAgIHJldHVybiBGQUxTRTsKKworICBsZW4gPSBzaXplb2YgKGZkYS0+Y0ZpbGVOYW1lKTsKKyAgc3RybmNweSAoZmRhLT5jRmlsZU5hbWUsIGZpbGVuYW1lLCBsZW4pOworICBmZGEtPmNGaWxlTmFtZVtsZW4gLSAxXSA9ICdcMCc7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworCitIQU5ETEUKK0ZpbmRGaXJzdEZpbGVBIChMUENTVFIgbHBGaWxlTmFtZSwgTFBXSU4zMl9GSU5EX0RBVEFBIGxwRmluZEZpbGVEYXRhKQoreworICB3Y2hhcl90ICpwYXRobmFtZTsKKyAgV0lOMzJfRklORF9EQVRBVyBmaW5kX2ZpbGVfZGF0YTsKKyAgSEFORExFIHJlc3VsdDsKKyAgaW50IGVycjsKKworICBwYXRobmFtZSA9IF9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChscEZpbGVOYW1lLCBOVUxMKTsKKyAgaWYgKCFwYXRobmFtZSkKKyAgICByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisKKyAgcmVzdWx0ID0gRmluZEZpcnN0RmlsZVcgKHBhdGhuYW1lLCAmZmluZF9maWxlX2RhdGEpOworICBpZiAocmVzdWx0ICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgIHsKKyAgICAgIEJPT0wgcmVzID0gY29udmVydF9maW5kX2RhdGEgKCZmaW5kX2ZpbGVfZGF0YSwgbHBGaW5kRmlsZURhdGEpOworICAgICAgaWYgKCEgcmVzKQorICAgICAgICB7CisgICAgICAgICAgZXJyID0gR2V0TGFzdEVycm9yICgpOworICAgICAgICAgIEZpbmRDbG9zZSAocmVzdWx0KTsKKyAgICAgICAgICBTZXRMYXN0RXJyb3IgKGVycik7CisgICAgICAgICAgcmVzdWx0ID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgZXJyID0gR2V0TGFzdEVycm9yICgpOworICBkYnVzX2ZyZWUgKHBhdGhuYW1lKTsKKyAgU2V0TGFzdEVycm9yIChlcnIpOworICByZXR1cm4gcmVzdWx0OworfQorCisKK0JPT0wKK0ZpbmROZXh0RmlsZUEgKEhBTkRMRSBoRmluZEZpbGUsIExQV0lOMzJfRklORF9EQVRBQSBscEZpbmRGaWxlRGF0YSkKK3sKKyAgV0lOMzJfRklORF9EQVRBVyBmaW5kX2ZpbGVfZGF0YTsKKyAgQk9PTCByZXN1bHQ7CisgIGludCBlcnI7CisKKyAgcmVzdWx0ID0gRmluZE5leHRGaWxlVyAoaEZpbmRGaWxlLCAmZmluZF9maWxlX2RhdGEpOworICBpZiAocmVzdWx0KQorICAgIHJlc3VsdCA9IGNvbnZlcnRfZmluZF9kYXRhICgmZmluZF9maWxlX2RhdGEsIGxwRmluZEZpbGVEYXRhKTsKKworICByZXR1cm4gcmVzdWx0OyAgCit9CisKKworSEFORExFCitDcmVhdGVNdXRleEEgKExQU0VDVVJJVFlfQVRUUklCVVRFUyBscE11dGV4QXR0cmlidXRlcywgQk9PTCBiSW5pdGlhbE93bmVyLAorCSAgICAgIExQQ1NUUiBscE5hbWUpCit7CisgIHdjaGFyX3QgKm5hbWU7CisgIEhBTkRMRSByZXN1bHQ7CisgIGludCBlcnI7CisKKyAgaWYgKGxwTmFtZSkKKyAgICB7CisgICAgICBuYW1lID0gX2RidXNfd2luX3V0ZjhfdG9fdXRmMTYgKGxwTmFtZSwgTlVMTCk7CisgICAgICBpZiAoIW5hbWUpCisJcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOworICAgIH0KKyAgZWxzZQorICAgIG5hbWUgPSBOVUxMOworCisgIHJlc3VsdCA9IENyZWF0ZU11dGV4VyAobHBNdXRleEF0dHJpYnV0ZXMsIGJJbml0aWFsT3duZXIsIG5hbWUpOworCisgIGVyciA9IEdldExhc3RFcnJvciAoKTsKKyAgZGJ1c19mcmVlIChuYW1lKTsKKyAgU2V0TGFzdEVycm9yIChlcnIpOworICByZXR1cm4gcmVzdWx0OworfQorCisKK0JPT0wKK0NyZWF0ZVByb2Nlc3NBIChMUENTVFIgcHN6SW1hZ2VOYW1lLCBMUFNUUiBwc3pDbWRMaW5lLAorICAgICAgICAgICAgICAgIExQU0VDVVJJVFlfQVRUUklCVVRFUyBwc2FQcm9jZXNzLAorICAgICAgICAgICAgICAgIExQU0VDVVJJVFlfQVRUUklCVVRFUyBwc2FUaHJlYWQsIEJPT0wgZkluaGVyaXRIYW5kbGVzLAorICAgICAgICAgICAgICAgIERXT1JEIGZkd0NyZWF0ZSwgUFZPSUQgcHZFbnZpcm9ubWVudCwgTFBDU1RSIHBzekN1ckRpciwKKyAgICAgICAgICAgICAgICBMUFNUQVJUVVBJTkZPQSBwc2lTdGFydEluZm8sCisgICAgICAgICAgICAgICAgTFBQUk9DRVNTX0lORk9STUFUSU9OIHBQcm9jSW5mbykKK3sKKyAgd2NoYXJfdCAqaW1hZ2VfbmFtZSA9IE5VTEw7CisgIHdjaGFyX3QgKmNtZF9saW5lID0gTlVMTDsKKyAgQk9PTCByZXN1bHQ7CisgIGludCBlcnI7CisKKyAgX2RidXNfYXNzZXJ0IChwc2FQcm9jZXNzID09IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHBzYVRocmVhZCA9PSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChmSW5oZXJpdEhhbmRsZXMgPT0gRkFMU0UpOworICBfZGJ1c19hc3NlcnQgKHB2RW52aXJvbm1lbnQgPT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocHN6Q3VyRGlyID09IE5VTEwpOworICAvKiBwc2lTdGFydEluZm8gaXMgZ2VuZXJhbGx5IG5vdCBOVUxMLiAgKi8KKworICBpZiAocHN6SW1hZ2VOYW1lKQorICAgIHsKKyAgICAgIGltYWdlX25hbWUgPSBfZGJ1c193aW5fdXRmOF90b191dGYxNiAocHN6SW1hZ2VOYW1lLCBOVUxMKTsKKyAgICAgIGlmICghaW1hZ2VfbmFtZSkKKwlyZXR1cm4gMDsKKyAgICB9CisgIGlmIChwc3pDbWRMaW5lKQorICAgIHsKKyAgICAgIGNtZF9saW5lID0gX2RidXNfd2luX3V0ZjhfdG9fdXRmMTYgKHBzekNtZExpbmUsIE5VTEwpOworICAgICAgaWYgKCFjbWRfbGluZSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChpbWFnZV9uYW1lKQorICAgICAgICAgICAgZGJ1c19mcmVlIChpbWFnZV9uYW1lKTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICByZXN1bHQgPSBDcmVhdGVQcm9jZXNzVyAoaW1hZ2VfbmFtZSwgY21kX2xpbmUsIE5VTEwsIE5VTEwsIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmR3Q3JlYXRlLCBOVUxMLCBOVUxMLCBOVUxMLCBwUHJvY0luZm8pOworCisgIGVyciA9IEdldExhc3RFcnJvciAoKTsKKyAgZGJ1c19mcmVlIChpbWFnZV9uYW1lKTsKKyAgZGJ1c19mcmVlIChjbWRfbGluZSk7CisgIFNldExhc3RFcnJvciAoZXJyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitMT05HCitSZWdPcGVuS2V5RXhBIChIS0VZIGhLZXksIExQQ1NUUiBscFN1YktleSwgRFdPUkQgdWxPcHRpb25zLAorICAgICAgICAgICAgICAgUkVHU0FNIHNhbURlc2lyZWQsIFBIS0VZIHBoa1Jlc3VsdCkKK3sKKyAgd2NoYXJfdCAqc3Via2V5OworICBMT05HIHJlc3VsdDsKKyAgaW50IGVycjsKKworICBpZiAobHBTdWJLZXkpCisgICAgeworICAgICAgc3Via2V5ID0gX2RidXNfd2luX3V0ZjhfdG9fdXRmMTYgKGxwU3ViS2V5LCBOVUxMKTsKKyAgICAgIGlmICghc3Via2V5KQorCXJldHVybiAwOworICAgIH0KKyAgZWxzZQorICAgIHN1YmtleSA9IE5VTEw7CisKKyAgcmVzdWx0ID0gUmVnT3BlbktleUV4IChoS2V5LCBzdWJrZXksIHVsT3B0aW9ucywgc2FtRGVzaXJlZCwgcGhrUmVzdWx0KTsKKworICBlcnIgPSBHZXRMYXN0RXJyb3IgKCk7CisgIGRidXNfZnJlZSAoc3Via2V5KTsKKyAgU2V0TGFzdEVycm9yIChlcnIpOworICByZXR1cm4gcmVzdWx0OworfQorCisKK0xPTkcKK1JlZ1F1ZXJ5VmFsdWVFeEEgKEhLRVkgaEtleSwgTFBDU1RSIGxwVmFsdWVOYW1lLCBMUERXT1JEIGxwUmVzZXJ2ZWQsCisgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwVHlwZSwgTFBCWVRFIGxwRGF0YSwgTFBEV09SRCBscGNiRGF0YSkKK3sKKyAgd2NoYXJfdCAqbmFtZTsKKyAgTE9ORyBlcnI7CisgIEJZVEUgKmRhdGE7CisgIERXT1JEIGRhdGFfbGVuOworICBEV09SRCB0eXBlOworCisgIGlmIChscFZhbHVlTmFtZSkKKyAgICB7CisgICAgICBuYW1lID0gX2RidXNfd2luX3V0ZjhfdG9fdXRmMTYgKGxwVmFsdWVOYW1lLCBOVUxMKTsKKyAgICAgIGlmICghbmFtZSkKKwlyZXR1cm4gR2V0TGFzdEVycm9yICgpOworICAgIH0KKyAgZWxzZQorICAgIG5hbWUgPSBOVUxMOworCisgIGRhdGFfbGVuID0gMDsKKyAgZXJyID0gUmVnUXVlcnlWYWx1ZUV4VyAoaEtleSwgbmFtZSwgbHBSZXNlcnZlZCwgbHBUeXBlLCBOVUxMLCAmZGF0YV9sZW4pOworICBpZiAoZXJyIHx8ICFscGNiRGF0YSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKG5hbWUpOworICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgZGF0YSA9IG1hbGxvYyAoZGF0YV9sZW4gKyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgaWYgKCFkYXRhKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAobmFtZSk7CisgICAgICByZXR1cm4gRVJST1JfTk9UX0VOT1VHSF9NRU1PUlk7CisgICAgfQorICAKKyAgZXJyID0gUmVnUXVlcnlWYWx1ZUV4VyAoaEtleSwgbmFtZSwgbHBSZXNlcnZlZCwgJnR5cGUsIGRhdGEsICZkYXRhX2xlbik7CisgIGlmIChscFR5cGUpCisgICAgKmxwVHlwZSA9IHR5cGU7CisgIGRidXNfZnJlZSAobmFtZSk7CisgIC8qIElmIGVyciBpcyBFUlJPUl9NT1JFX0RBVEEsIHRoZXJlIHByb2JhYmx5IHdhcyBhIHJhY2UgY29uZGl0aW9uLgorICAgICBXZSBjYW4gcHVudCB0aGlzIHRvIHRoZSBjYWxsZXIganVzdCBhcyB3ZWxsLiAgKi8KKyAgaWYgKGVycikKKyAgICB7CisgICAgICBmcmVlIChkYXRhKTsKKyAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgIC8qIE5PVEU6IFJFR19NVUxUSV9TWiBhbmQgUkVHX0VYUEFORF9TWiBub3Qgc3VwcG9ydGVkLCBiZWNhdXNlIHRoZXkKKyAgICAgYXJlIG5vdCBuZWVkZWQgaW4gdGhpcyBtb2R1bGUuICAqLworICBpZiAodHlwZSA9PSBSRUdfU1opCisgICAgeworICAgICAgY2hhciAqZGF0YV9jOworICAgICAgaW50IGRhdGFfY19sZW47CisKKyAgICAgIC8qIFRoaXMgaXMgdmFsaWQgc2luY2Ugd2UgYWxsb2NhdGVkIG9uZSBtb3JlIGFib3ZlLiAgKi8KKyAgICAgIGRhdGFbZGF0YV9sZW5dID0gJ1wwJzsKKyAgICAgIGRhdGFbZGF0YV9sZW4gKyAxXSA9ICdcMCc7CisKKyAgICAgIC8qIFRoZSBjYXN0IGlzIHZhbGlkIGJlY2F1c2UgbWFsbG9jIGd1YXJhbnRlZXMgYWxpZ25tZW50IG9mCisgICAgICAgICBiYXNpYyB0eXBlcy4gICovCisgICAgICBkYXRhX2MgPSBfZGJ1c193aW5fdXRmMTZfdG9fdXRmOCAoKHdjaGFyX3QqKSBkYXRhLCBOVUxMKTsKKyAgICAgIGlmICghZGF0YV9jKQorICAgICAgICB7CisgICAgICAgICAgZnJlZSAoZGF0YSk7CisgICAgICAgICAgcmV0dXJuIEdldExhc3RFcnJvcigpOworICAgICAgICB9CisKKyAgICAgIGRhdGFfY19sZW4gPSBzdHJsZW4gKGRhdGFfYykgKyAxOworICAgICAgX2RidXNfYXNzZXJ0IChkYXRhX2NfbGVuIDw9IGRhdGFfbGVuICsgc2l6ZW9mICh3Y2hhcl90KSk7CisgICAgICBtZW1jcHkgKGRhdGEsIGRhdGFfYywgZGF0YV9jX2xlbik7CisgICAgICBkYXRhX2xlbiA9IGRhdGFfY19sZW47CisgICAgICBkYnVzX2ZyZWUgKGRhdGFfYyk7CisgICAgfQorCisgIC8qIERBVEEgYW5kIERBVEFfTEVOIG5vdyBjb250YWluIHRoZSByZXN1bHQuICAqLworICBpZiAobHBEYXRhKQorICAgIHsKKyAgICAgIGlmIChkYXRhX2xlbiA+ICpscGNiRGF0YSkKKyAgICAgICAgZXJyID0gRVJST1JfTU9SRV9EQVRBOworICAgICAgZWxzZQorICAgICAgICBtZW1jcHkgKGxwRGF0YSwgZGF0YSwgZGF0YV9sZW4pOworICAgIH0KKyAgZnJlZSAoZGF0YSk7CisgICpscGNiRGF0YSA9IGRhdGFfbGVuOworICByZXR1cm4gZXJyOworfQorCisKK0RXT1JECitGb3JtYXRNZXNzYWdlQSAoRFdPUkQgZHdGbGFncywgUENWT0lEIGxwU291cmNlLCBEV09SRCBkd01lc3NhZ2VJZCwKKwkJRFdPUkQgZHdMYW5ndWFnZUlkLCBMUFNUUiBscEJ1ZmZlciwgRFdPUkQgblNpemUsCisJCXZhX2xpc3QqIEFyZ3VtZW50cykKK3sKKyAgTFBXU1RSIGJ1ZmZlcl93ID0gTlVMTDsKKyAgTFBTVFIgYnVmZmVyX2M7CisgIERXT1JEIGxlbjsKKyAgY2hhciAqYnVmZmVyX25ldzsKKyAgRFdPUkQgYnVmZmVyX25ld19sZW47CisgIEJPT0wgYnVmZmVyX3dfZnJlZTsKKworICBsZW4gPSBGb3JtYXRNZXNzYWdlVyAoZHdGbGFncyB8IEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiwKKwkJCWxwU291cmNlLCBkd01lc3NhZ2VJZCwgZHdMYW5ndWFnZUlkLAorCQkJKExQV1NUUikgJmJ1ZmZlcl93LCAwLCBBcmd1bWVudHMpOworICBpZiAobGVuID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgYnVmZmVyX2MgPSBfZGJ1c193aW5fdXRmMTZfdG9fdXRmOCAoYnVmZmVyX3csIE5VTEwpOworICBpZiAoISBidWZmZXJfYykKKyAgICB7CisgICAgICBMb2NhbEZyZWUgKGJ1ZmZlcl93KTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAoZHdGbGFncyAmIEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUikKKyAgICB7CisgICAgICAvKiBXZSBuZWVkIHRvIHJldHVybiBhIGJ1ZmZlciB0aGF0J3MgZnJlZWFibGUgd2l0aCBMb2NhbEZyZWUuICAqLworICAgICAgYnVmZmVyX25ldyA9IChjaGFyICopIGJ1ZmZlcl93OworICAgICAgYnVmZmVyX25ld19sZW4gPSBzaXplb2YgKHdjaGFyX3QpICogKGxlbiArIDEpOworICAgICAgYnVmZmVyX3dfZnJlZSA9IEZBTFNFOworICAgICAgLyogQXZvaWQgYWxpZ25tZW50IGlzc3VlIGJ5IHVzaW5nIG1lbWNweS4gICovCisgICAgICBtZW1jcHkgKGxwQnVmZmVyLCAmYnVmZmVyX25ldywgc2l6ZW9mIChidWZmZXJfbmV3KSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYnVmZmVyX25ldyA9IGxwQnVmZmVyOworICAgICAgYnVmZmVyX25ld19sZW4gPSBuU2l6ZTsKKyAgICAgIGJ1ZmZlcl93X2ZyZWUgPSBUUlVFOworICAgIH0KKworICBzdHJuY3B5IChidWZmZXJfbmV3LCBidWZmZXJfYywgYnVmZmVyX25ld19sZW4pOworICBkYnVzX2ZyZWUgKGJ1ZmZlcl9jKTsKKyAgYnVmZmVyX25ld1tidWZmZXJfbmV3X2xlbiAtIDFdID0gJ1wwJzsKKyAgaWYgKGJ1ZmZlcl93X2ZyZWUpCisgICAgTG9jYWxGcmVlIChidWZmZXJfdyk7CisKKyAgLyogc3RybGVuIGlzIGNvcnJlY3QgKG5vdCBfbWJzdHJsZW4pLCBiZWNhdXNlIHdlIHdhbnQgc3RvcmFnZSBhbmQKKyAgICAgbm90IHN0cmluZyBsZW5ndGguICAqLworICByZXR1cm4gc3RybGVuIChidWZmZXJfbmV3KTsKK30KKworCitEV09SRAorR2V0TW9kdWxlRmlsZU5hbWVBIChISU5TVEFOQ0UgaE1vZHVsZSwgTFBTVFIgbHBGaWxlbmFtZSwgRFdPUkQgblNpemUpCit7CisgIHdjaGFyX3QgKmZpbGVuYW1lX3c7CisgIGNoYXIgKmZpbGVuYW1lX2M7CisgIERXT1JEIGxlbjsKKworICBpZiAoblNpemUgPT0gMCkKKyAgICB7CisgICAgICAvKiBXaW5kb3dzIFhQLzIwMDAuICAqLworICAgICAgU2V0TGFzdEVycm9yICgwKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBmaWxlbmFtZV93ID0gbWFsbG9jIChzaXplb2YgKHdjaGFyX3QpICogblNpemUpOworICBpZiAoISBmaWxlbmFtZV93KQorICAgIHJldHVybiAwOworCisgIGxlbiA9IEdldE1vZHVsZUZpbGVOYW1lVyAoaE1vZHVsZSwgZmlsZW5hbWVfdywgblNpemUpOworICBpZiAobGVuID09IDApCisgICAgeworICAgICAgLyogTm90ZTogSWYgd2UgZmFpbCB3aXRoIEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIsIHRoaXMgaXMgc3RpbGwKKyAgICAgICAoYXBwcm94aW1hdGVseSkgY29ycmVjdC4gICovCisgICAgICBmcmVlIChmaWxlbmFtZV93KTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBmaWxlbmFtZV93W25TaXplIC0gMV0gPSAnXDAnOworICBmaWxlbmFtZV9jID0gX2RidXNfd2luX3V0ZjE2X3RvX3V0ZjggKGZpbGVuYW1lX3csIE5VTEwpOworICBmcmVlIChmaWxlbmFtZV93KTsKKyAgaWYgKCEgZmlsZW5hbWVfYykKKyAgICByZXR1cm4gMDsKKworICBzdHJuY3B5IChscEZpbGVuYW1lLCBmaWxlbmFtZV9jLCBuU2l6ZSk7CisgIGRidXNfZnJlZSAoZmlsZW5hbWVfYyk7CisgIGxwRmlsZW5hbWVbblNpemUgLSAxXSA9ICdcMCc7CisgIC8qIHN0cmxlbiBpcyBjb3JyZWN0IChub3QgX21ic3RybGVuKSwgYmVjYXVzZSB3ZSB3YW50IHN0b3JhZ2UgYW5kCisgICAgIG5vdCBzdHJpbmcgbGVuZ3RoLiAgKi8KKyAgcmV0dXJuIHN0cmxlbiAobHBGaWxlbmFtZSk7Cit9CisKKworRFdPUkQKK0dldFRlbXBQYXRoQSAoRFdPUkQgbkJ1ZmZlckxlbmd0aCwgTFBTVFIgbHBCdWZmZXIpCit7CisgIHdjaGFyX3QgZHVtbXlbMV07CisgIERXT1JEIGxlbjsKKworICBsZW4gPSBHZXRUZW1wUGF0aFcgKDAsIGR1bW15KTsKKyAgaWYgKGxlbiA9PSAwKQorICAgIHJldHVybiAwOworCisgIF9kYnVzX2Fzc2VydCAobGVuIDw9IE1BWF9QQVRIKTsKKworICAvKiBCZXR0ZXIgYmUgc2FmZSB0aGFuIHNvcnJ5LiAgTVNETiBkb2Vzbid0IHNheSBpZiBsZW4gaXMgd2l0aCBvcgorICAgICB3aXRob3V0IHRlcm1pbmF0aW5nIDAuICAqLworICBsZW4rKzsKKworICB7CisgICAgd2NoYXJfdCAqYnVmZmVyX3c7CisgICAgRFdPUkQgbGVuX3c7CisgICAgY2hhciAqYnVmZmVyX2M7CisgICAgRFdPUkQgbGVuX2M7CisKKyAgICBidWZmZXJfdyA9IG1hbGxvYyAoc2l6ZW9mICh3Y2hhcl90KSAqIGxlbik7CisgICAgaWYgKCEgYnVmZmVyX3cpCisgICAgICByZXR1cm4gMDsKKworICAgIGxlbl93ID0gR2V0VGVtcFBhdGhXIChsZW4sIGJ1ZmZlcl93KTsKKyAgICAvKiBHaXZlIHVwIGlmIHdlIHN0aWxsIGNhbid0IGdldCBhdCBpdC4gICovCisgICAgaWYgKGxlbl93ID09IDAgfHwgbGVuX3cgPj0gbGVuKQorICAgICAgeworICAgICAgICBmcmVlIChidWZmZXJfdyk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorCisgICAgLyogQmV0dGVyIGJlIHJlYWxseSBzYWZlLiAgKi8KKyAgICBidWZmZXJfd1tsZW5fd10gPSAnXDAnOworCisgICAgYnVmZmVyX2MgPSBfZGJ1c193aW5fdXRmMTZfdG9fdXRmOCAoYnVmZmVyX3csIE5VTEwpOworICAgIGZyZWUgKGJ1ZmZlcl93KTsKKyAgICBpZiAoISBidWZmZXJfYykKKyAgICAgIHJldHVybiAwOworCisgICAgLyogc3RybGVuIGlzIGNvcnJlY3QgKG5vdCBfbWJzdHJsZW4pLCBiZWNhdXNlIHdlIHdhbnQgc3RvcmFnZSBhbmQKKyAgICAgICBub3Qgc3RyaW5nIGxlbmd0aC4gICovCisgICAgbGVuX2MgPSBzdHJsZW4gKGJ1ZmZlcl9jKSArIDE7CisgICAgaWYgKGxlbl9jID4gbkJ1ZmZlckxlbmd0aCkKKyAgICAgIHJldHVybiBsZW5fYzsKKworICAgIHN0cmNweSAobHBCdWZmZXIsIGJ1ZmZlcl9jKTsKKyAgICBkYnVzX2ZyZWUgKGJ1ZmZlcl9jKTsKKyAgICByZXR1cm4gbGVuX2MgLSAxOworICB9Cit9CisKKworQk9PTAorU0hHZXRTcGVjaWFsRm9sZGVyUGF0aEEgKEhXTkQgaHduZE93bmVyLCBMUFNUUiBscHN6UGF0aCwgaW50IG5Gb2xkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCBmQ3JlYXRlKQoreworICB3Y2hhcl90IHBhdGhbTUFYX1BBVEhdOworICBjaGFyICpwYXRoX2M7CisgIEJPT0wgcmVzdWx0OworCisgIHBhdGhbMF0gPSAod2NoYXJfdCkgMDsKKyAgcmVzdWx0ID0gU0hHZXRTcGVjaWFsRm9sZGVyUGF0aFcgKGh3bmRPd25lciwgcGF0aCwgbkZvbGRlciwgZkNyZWF0ZSk7CisgIC8qIE5vdGU6IE1heSByZXR1cm4gZmFsc2UgZXZlbiBpZiBzdWNjZWVkcy4gICovCisKKyAgcGF0aFtNQVhfUEFUSCAtIDFdID0gKHdjaGFyX3QpIDA7CisgIHBhdGhfYyA9IF9kYnVzX3dpbl91dGYxNl90b191dGY4IChwYXRoLCBOVUxMKTsKKyAgaWYgKCEgcGF0aF9jKQorICAgIHJldHVybiAwOworICAKKyAgc3RybmNweSAobHBzelBhdGgsIHBhdGhfYywgTUFYX1BBVEgpOworICBkYnVzX2ZyZWUgKHBhdGhfYyk7CisgIGxwc3pQYXRoW01BWF9QQVRIIC0gMV0gPSAnXDAnOworICByZXR1cm4gcmVzdWx0OworfQorCisKK3ZvaWQKK091dHB1dERlYnVnU3RyaW5nQSAoTFBDU1RSIGxwT3V0cHV0U3RyaW5nKQoreworICB3Y2hhcl90ICpzdHI7CisgIEhBTkRMRSByZXN1bHQ7CisgIGludCBlcnI7CisKKyAgc3RyID0gX2RidXNfd2luX3V0ZjhfdG9fdXRmMTYgKGxwT3V0cHV0U3RyaW5nLCBOVUxMKTsKKyAgaWYgKCFzdHIpCisgICAgcmV0dXJuOworCisgIE91dHB1dERlYnVnU3RyaW5nVyAoc3RyKTsKKworICBlcnIgPSBHZXRMYXN0RXJyb3IgKCk7CisgIGRidXNfZnJlZSAoc3RyKTsKKyAgU2V0TGFzdEVycm9yIChlcnIpOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtc3lzZGVwcy13aW5jZS1nbHVlLmggYi9kYnVzL2RidXMvZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWFjNmM4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtc3lzZGVwcy13aW5jZS1nbHVlLmgKQEAgLTAsMCArMSwyNDYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUuaCBFbXVsYXRpb24gb2Ygc3lzdGVtL2xpYmMgZmVhdHVyZXMgZm9yIFdpbmRvd3MgQ0UgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfU1lTREVQU19XSU5DRV9HTFVFX0gKKyNkZWZpbmUgREJVU19TWVNERVBTX1dJTkNFX0dMVUVfSAorCisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisvKiBGb3IgZ2V0YWRkcmluZm8sIGNvbmZpZ3VyZS9jbWFrZSBkZWZpbmVkIF9XSU4zMl9XQ0UgdG8gc29tZXRoaW5nID49IDB4MDQwMS4gICovCisjaW5jbHVkZSA8d2luZG93cy5oPgorI3VuZGVmIGludGVyZmFjZQorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qIHNobG9iai5oIGRlY2xhcmVzIHRoZXNlIG9ubHkgZm9yIF9XSU4zMl9JRSB0aGF0IHdlIGRvbid0IHdhbnQgdG8gZGVmaW5lLgorICAgSW4gYW55IGNhc2UsIHdpdGggbWluZ3czMmNlIHdlIG9ubHkgZ2V0IGEgU0hHZXRTcGVjaWFsRm9sZGVyUGF0aC4gICovCisjZGVmaW5lIFNIR2V0U3BlY2lhbEZvbGRlclBhdGhXIFNIR2V0U3BlY2lhbEZvbGRlclBhdGgKK0JPT0wgV0lOQVBJIFNIR2V0U3BlY2lhbEZvbGRlclBhdGhBKEhXTkQsTFBTVFIsaW50LEJPT0wpOworQk9PTCBXSU5BUEkgU0hHZXRTcGVjaWFsRm9sZGVyUGF0aFcoSFdORCxMUFdTVFIsaW50LEJPT0wpOworCisjaWZuZGVmIFRMU19PVVRfT0ZfSU5ERVhFUworI2RlZmluZSBUTFNfT1VUX09GX0lOREVYRVMgMHhmZmZmZmZmZgorI2VuZGlmCisKKworLyogU2VyaW91c2x5LiAgV2luZG93cyBDRSBkb2VzIG5vdCBoYXZlIGVycm5vLiAgRG9uJ3QgeW91IGhhdGUgaXQgd2hlbgorICAgdGhhdCBoYXBwZW5zPyAgKi8KKyNkZWZpbmUgZXJybm8gKChpbnQpR2V0TGFzdEVycm9yICgpKQorCisjZGVmaW5lIEVOT0VOVCAgICAgICAgICBFUlJPUl9GSUxFX05PVF9GT1VORAorI2RlZmluZSBFTUZJTEUgICAgICAgICAgRVJST1JfVE9PX01BTllfT1BFTl9GSUxFUworI2RlZmluZSBFQUNDRVMgICAgICAgICAgRVJST1JfQUNDRVNTX0RFTklFRAorI2RlZmluZSBFQkFERiAgICAgICAgICAgRVJST1JfSU5WQUxJRF9IQU5ETEUKKyNkZWZpbmUgRU5PTUVNICAgICAgICAgIEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZCisjZGVmaW5lIEVYREVWICAgICAgICAgICBFUlJPUl9OT1RfU0FNRV9ERVZJQ0UKKyNkZWZpbmUgRU5GSUxFICAgICAgICAgIEVSUk9SX05PX01PUkVfRklMRVMKKyNkZWZpbmUgRVJPRlMgICAgICAgICAgIEVSUk9SX1dSSVRFX1BST1RFQ1QKKyNkZWZpbmUgRU5PTENLICAgICAgICAgIEVSUk9SX1NIQVJJTkdfQlVGRkVSX0VYQ0VFREVECisjZGVmaW5lIEVOT1NZUyAgICAgICAgICBFUlJPUl9OT1RfU1VQUE9SVEVECisjZGVmaW5lIEVFWElTVCAgICAgICAgICBFUlJPUl9GSUxFX0VYSVNUUworI2RlZmluZSBFUEVSTSAgICAgICAgICAgRVJST1JfQ0FOTk9UX01BS0UKKyNkZWZpbmUgRUlOVkFMICAgICAgICAgIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSCisjZGVmaW5lIEVJTlRSICAgICAgICAgICBFUlJPUl9JTlZBTElEX0FUX0lOVEVSUlVQVF9USU1FCisjZGVmaW5lIEVQSVBFICAgICAgICAgICBFUlJPUl9CUk9LRU5fUElQRQorI2RlZmluZSBFTk9TUEMgICAgICAgICAgRVJST1JfRElTS19GVUxMCisjZGVmaW5lIEVOT1RFTVBUWSAgICAgICBFUlJPUl9ESVJfTk9UX0VNUFRZCisjZGVmaW5lIEVCVVNZICAgICAgICAgICBFUlJPUl9CVVNZCisjZGVmaW5lIEVOQU1FVE9PTE9ORyAgICBFUlJPUl9GSUxFTkFNRV9FWENFRF9SQU5HRQorI2RlZmluZSBFQUdBSU4gICAgICAgICAgRVJST1JfTU9SRV9EQVRBCisjZGVmaW5lIEVOT1RESVIgICAgICAgICBFUlJPUl9ESVJFQ1RPUlkKKyNkZWZpbmUgRVJBTkdFICAgICAgICAgIEVSUk9SX0FSSVRITUVUSUNfT1ZFUkZMT1cKKyNkZWZpbmUgRU5YSU8gICAgICAgICAgIEVSUk9SX0ZJTEVfSU5WQUxJRAorI2RlZmluZSBFRkFVTFQgICAgICAgICAgRVJST1JfUFJPQ0VTU19BQk9SVEVECisjZGVmaW5lIEVJTyAgICAgICAgICAgICBFUlJPUl9JT19ERVZJQ0UKKyNkZWZpbmUgRURFQURMT0NLICAgICAgIEVSUk9SX1BPU1NJQkxFX0RFQURMT0NLCisjZGVmaW5lIEVOT0RFViAgICAgICAgICBFUlJPUl9CQURfREVWSUNFCisKKy8qIFdpbmRvd3MgQ0UgaXMgbWlzc2luZyBtb3JlIHN0dWZmIHRoYXQgaXMgcHJldHR5IHN0YW5kYXJkLiAgKi8KKworI2RlZmluZSBzdHJkdXAgX3N0cmR1cAorI2RlZmluZSBzdHJpY21wIF9zdHJpY21wCisjZGVmaW5lIHN0cm5pY21wIF9zdHJuaWNtcAorCisjZGVmaW5lIGVudmlyb24gX2RidXNfd2luY2VfZW52aXJvbgorZXh0ZXJuIGNoYXIgKmVudmlyb25bXTsKKworI2RlZmluZSBnZXRlbnYgX2RidXNfd2luY2VfZ2V0ZW52CitjaGFyICpnZXRlbnYgKGNvbnN0IGNoYXIgKm5hbWUpOworCisjZGVmaW5lIHB1dGVudiBfZGJ1c193aW5jZV9wdXRlbnYKK2ludCBwdXRlbnYgKGNoYXIgKnN0cik7CisKKyNkZWZpbmUgY2xvY2sgX2RidXNfd2luY2VfY2xvY2sKK2Nsb2NrX3QgY2xvY2sgKHZvaWQpOworCisjZGVmaW5lIGFib3J0IF9kYnVzX3dpbmNlX2Fib3J0Cit2b2lkIGFib3J0ICh2b2lkKTsKKworI2RlZmluZSBfU19JRk1UICAgICAgICAgMDE3MDAwMCAgICAgICAgIC8qIGZpbGUgdHlwZSBtYXNrICovCisjZGVmaW5lIF9TX0lGRElSICAgICAgICAwMDQwMDAwICAgICAgICAgLyogZGlyZWN0b3J5ICovCisjZGVmaW5lIF9TX0lGQ0hSICAgICAgICAwMDIwMDAwICAgICAgICAgLyogY2hhcmFjdGVyIHNwZWNpYWwgKi8KKyNkZWZpbmUgX1NfSUZJRk8gICAgICAgIDAwMTAwMDAgICAgICAgICAvKiBwaXBlICovCisjZGVmaW5lIF9TX0lGUkVHICAgICAgICAwMTAwMDAwICAgICAgICAgLyogcmVndWxhciAqLworI2RlZmluZSBfU19JUkVBRCAgICAgICAgMDAwMDQwMCAgICAgICAgIC8qIHJlYWQgcGVybWlzc2lvbiwgb3duZXIgKi8KKyNkZWZpbmUgX1NfSVdSSVRFICAgICAgIDAwMDAyMDAgICAgICAgICAvKiB3cml0ZSBwZXJtaXNzaW9uLCBvd25lciAqLworI2RlZmluZSBfU19JRVhFQyAgICAgICAgMDAwMDEwMCAgICAgICAgIC8qIGV4ZWN1dGUvc2VhcmNoIHBlcm1pc3Npb24sIG93bmVyICovCisKKyNpZm5kZWYgX19PRkZfVF9ERUZJTkVECit0eXBlZGVmIGxvbmcgb2ZmX3Q7CisjZGVmaW5lIF9fT0ZGX1RfREVGSU5FRAorI2VuZGlmCisjaWZuZGVmIF9JTlRQVFJfVF9ERUZJTkVECit0eXBlZGVmIGludCBpbnRwdHJfdDsKKyNkZWZpbmUgX0lOVFBUUl9UX0RFRklORUQKKyNlbmRpZgorI2lmbmRlZiBfVUlOVFBUUl9UX0RFRklORUQKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVpbnRwdHJfdDsKKyNkZWZpbmUgX1VJTlRQVFJfVF9ERUZJTkVECisjZW5kaWYKKworI2lmbmRlZiBfTUFYX0ZOQU1FCisjZGVmaW5lIF9NQVhfRk5BTUUgMjU2CisjZW5kaWYKKworI2lmbmRlZiBfSU9GQkYKKyNkZWZpbmUgX0lPRkJGCTAKKyNlbmRpZgorI2lmbmRlZiBfSU9MQkYKKyNkZWZpbmUgX0lPTEJGCTEKKyNlbmRpZgorI2lmbmRlZiBfSU9OQkYKKyNkZWZpbmUgX0lPTkJGCTIKKyNlbmRpZgorCisKKy8qIFdpbmRvd3MgQ0UgaXMgbWlzc2luZyBzb21lIFdpbmRvd3MgZnVuY3Rpb25zIHRoYXQgd2Ugd2FudC4gICovCisKKyNkZWZpbmUgR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUgX2RidXNfd2luY2VfR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUKK3ZvaWQgR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUgKExQRklMRVRJTUUgZnRwKTsKKworI2RlZmluZSBfbWJzcmNociBfZGJ1c193aW5jZV9tYnNyY2hyCit1bnNpZ25lZCBjaGFyKiBfbWJzcmNociAoY29uc3QgdW5zaWduZWQgY2hhciosIHVuc2lnbmVkIGludCk7CisKKyNkZWZpbmUgT3BlbkZpbGVNYXBwaW5nQSBfZGJ1c193aW5jZV9PcGVuRmlsZU1hcHBpbmdBCitIQU5ETEUgT3BlbkZpbGVNYXBwaW5nQShEV09SRCxCT09MLExQQ1NUUik7CisKKyNkZWZpbmUgTW92ZUZpbGVFeEEgX2RidXNfd2luY2VfTW92ZUZpbGVFeEEKK0JPT0wgTW92ZUZpbGVFeEEoTFBDU1RSLExQQ1NUUixEV09SRCk7CisjaWZuZGVmIE1PVkVGSUxFX1JFUExBQ0VfRVhJU1RJTkcKKyNkZWZpbmUgTU9WRUZJTEVfUkVQTEFDRV9FWElTVElORyAweDAwMDAwMDAxCisjZW5kaWYKKworI2RlZmluZSBTZXRIYW5kbGVJbmZvcm1hdGlvbiBfZGJ1c193aW5jZV9TZXRIYW5kbGVJbmZvcm1hdGlvbgorQk9PTCBTZXRIYW5kbGVJbmZvcm1hdGlvbihIQU5ETEUsRFdPUkQsRFdPUkQpOworI2lmbmRlZiBIQU5ETEVfRkxBR19JTkhFUklUCisjZGVmaW5lIEhBTkRMRV9GTEFHX0lOSEVSSVQgMHgwMQorI2VuZGlmCisjaWZuZGVmIEhBTkRMRV9GTEFHX1BST1RFQ1QKKyNkZWZpbmUgSEFORExFX0ZMQUdfUFJPVEVDVF9GUk9NX0NMT1NFIDB4MDIKKyNlbmRpZgorCisjZGVmaW5lIFNlYXJjaFBhdGhBIF9kYnVzX3dpbmNlX1NlYXJjaFBhdGhBCitEV09SRCBTZWFyY2hQYXRoQShMUENTVFIsTFBDU1RSLExQQ1NUUixEV09SRCxMUFNUUixMUFNUUiopOworCisvKiBJbnN0ZWFkIG9mIGVtdWxhdGluZyBhbGwgZnVuY3Rpb25zIG5lZWRlZCBmb3IgdGhpcywgd2UgcmVwbGFjZSB0aGUKKyAgIHdob2xlIHRoaW5nLiAgKi8KK2RidXNfYm9vbF90IF9kYnVzX2dldHNpZChjaGFyICoqc2lkKTsKKworCisjZGVmaW5lIExvb2t1cEFjY291bnROYW1lVyBfZGJ1c193aW5jZV9Mb29rdXBBY2NvdW50TmFtZVcKK0JPT0wgTG9va3VwQWNjb3VudE5hbWVXKExQQ1dTVFIsTFBDV1NUUixQU0lELFBEV09SRCxMUFdTVFIsUERXT1JELFBTSURfTkFNRV9VU0UpOworCisjZGVmaW5lIElzVmFsaWRTaWQgX2RidXNfd2luY2VfSXNWYWxpZFNpZAorQk9PTCBJc1ZhbGlkU2lkKFBTSUQpOworCisKKy8qIFdpbmRvd3MgQ0UgZG9lcyBvbmx5IGhhdmUgdGhlIFVOSUNPREUgaW50ZXJmYWNlcyAoRm9vVyksIGJ1dCB3ZQorICAgd2FudCB0byB1c2UgdGhlIEFTQ0lJIGludGVyZmFjZXMgKEZvb0EpLiAgV2UgaW1wbGVtZW50IHRoZW0KKyAgIGhlcmUuICAqLworCisjZGVmaW5lIENyZWF0ZUZpbGVBIF9kYnVzX3dpbmNlX0NyZWF0ZUZpbGVBCitIQU5ETEUgQ3JlYXRlRmlsZUEoTFBDU1RSLERXT1JELERXT1JELExQU0VDVVJJVFlfQVRUUklCVVRFUyxEV09SRCxEV09SRCxIQU5ETEUpOworCisjZGVmaW5lIERlbGV0ZUZpbGVBIF9kYnVzX3dpbmNlX0RlbGV0ZUZpbGVBCitCT09MIERlbGV0ZUZpbGVBKExQQ1NUUik7CisKKyNkZWZpbmUgR2V0RmlsZUF0dHJpYnV0ZXNBIF9kYnVzX3dpbmNlX0dldEZpbGVBdHRyaWJ1dGVzQQorRFdPUkQgR2V0RmlsZUF0dHJpYnV0ZXNBKExQQ1NUUik7CisKKyNkZWZpbmUgR2V0RmlsZUF0dHJpYnV0ZXNFeEEgX2RidXNfd2luY2VfR2V0RmlsZUF0dHJpYnV0ZXNFeEEKK0JPT0wgR2V0RmlsZUF0dHJpYnV0ZXNFeEEoTFBDU1RSLEdFVF9GSUxFRVhfSU5GT19MRVZFTFMsUFZPSUQpOworCisjZGVmaW5lIENyZWF0ZUZpbGVNYXBwaW5nQSBfZGJ1c193aW5jZV9DcmVhdGVGaWxlTWFwcGluZ0EKK0hBTkRMRSBDcmVhdGVGaWxlTWFwcGluZ0EoSEFORExFLExQU0VDVVJJVFlfQVRUUklCVVRFUyxEV09SRCxEV09SRCxEV09SRCxMUENTVFIpOworCisjZGVmaW5lIENyZWF0ZURpcmVjdG9yeUEgX2RidXNfd2luY2VfQ3JlYXRlRGlyZWN0b3J5QQorQk9PTCBDcmVhdGVEaXJlY3RvcnlBKExQQ1NUUixMUFNFQ1VSSVRZX0FUVFJJQlVURVMpOworCisjZGVmaW5lIFJlbW92ZURpcmVjdG9yeUEgX2RidXNfd2luY2VfUmVtb3ZlRGlyZWN0b3J5QQorQk9PTCBSZW1vdmVEaXJlY3RvcnlBKExQQ1NUUik7CisKKyNkZWZpbmUgRmluZEZpcnN0RmlsZUEgX2RidXNfd2luY2VfRmluZEZpcnN0RmlsZUEKK0hBTkRMRSBGaW5kRmlyc3RGaWxlQShMUENTVFIsTFBXSU4zMl9GSU5EX0RBVEFBKTsKKworI2RlZmluZSBGaW5kTmV4dEZpbGVBIF9kYnVzX3dpbmNlX0ZpbmROZXh0RmlsZUEKK0JPT0wgRmluZE5leHRGaWxlQShIQU5ETEUsTFBXSU4zMl9GSU5EX0RBVEFBKTsKKworI2RlZmluZSBDcmVhdGVNdXRleEEgX2RidXNfd2luY2VfQ3JlYXRlTXV0ZXhBCitIQU5ETEUgQ3JlYXRlTXV0ZXhBKExQU0VDVVJJVFlfQVRUUklCVVRFUyxCT09MLExQQ1NUUik7CisKKyNkZWZpbmUgQ3JlYXRlUHJvY2Vzc0EgX2RidXNfd2luY2VfQ3JlYXRlUHJvY2Vzc0EKK0JPT0wgQ3JlYXRlUHJvY2Vzc0EoTFBDU1RSLExQU1RSLExQU0VDVVJJVFlfQVRUUklCVVRFUyxMUFNFQ1VSSVRZX0FUVFJJQlVURVMsQk9PTCxEV09SRCxQVk9JRCxMUENTVFIsTFBTVEFSVFVQSU5GT0EsTFBQUk9DRVNTX0lORk9STUFUSU9OKTsKKyNpZm5kZWYgQ1JFQVRFX05PX1dJTkRPVworI2RlZmluZSBDUkVBVEVfTk9fV0lORE9XIDB4MDgwMDAwMDAKKyNlbmRpZgorCisKKyNkZWZpbmUgUmVnT3BlbktleUV4QSBfZGJ1c193aW5jZV9SZWdPcGVuS2V5RXhBCitMT05HIFJlZ09wZW5LZXlFeEEoSEtFWSxMUENTVFIsRFdPUkQsUkVHU0FNLFBIS0VZKTsKKworI2RlZmluZSBSZWdRdWVyeVZhbHVlRXhBIF9kYnVzX3dpbmNlX1JlZ1F1ZXJ5VmFsdWVFeEEKK0xPTkcgV0lOQVBJIFJlZ1F1ZXJ5VmFsdWVFeEEoSEtFWSxMUENTVFIsTFBEV09SRCxMUERXT1JELExQQllURSxMUERXT1JEKTsKKworCisjZGVmaW5lIEZvcm1hdE1lc3NhZ2VBIF9kYnVzX3dpbmNlX0Zvcm1hdE1lc3NhZ2VBCitEV09SRCBGb3JtYXRNZXNzYWdlQShEV09SRCxQQ1ZPSUQsRFdPUkQsRFdPUkQsTFBTVFIsRFdPUkQsdmFfbGlzdCopOworCisjZGVmaW5lIEdldE1vZHVsZUZpbGVOYW1lQSBfZGJ1c193aW5jZV9HZXRNb2R1bGVGaWxlTmFtZUEKK0RXT1JEIEdldE1vZHVsZUZpbGVOYW1lQShISU5TVEFOQ0UsTFBTVFIsRFdPUkQpOworCisjZGVmaW5lIEdldFRlbXBQYXRoQSBfZGJ1c193aW5jZV9HZXRUZW1wUGF0aEEKK0RXT1JEIEdldFRlbXBQYXRoQShEV09SRCxMUFNUUik7CisKKyNkZWZpbmUgU0hHZXRTcGVjaWFsRm9sZGVyUGF0aEEgX2RidXNfd2luY2VfU0hHZXRTcGVjaWFsRm9sZGVyUGF0aEEKK0JPT0wgU0hHZXRTcGVjaWFsRm9sZGVyUGF0aEEoSFdORCxMUFNUUixpbnQsQk9PTCk7CisKKworI2RlZmluZSBPdXRwdXREZWJ1Z1N0cmluZ0EgX2RidXNfd2luY2VfT3V0cHV0RGVidWdTdHJpbmdBCit2b2lkIE91dHB1dERlYnVnU3RyaW5nQShMUENTVFIpOworCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1NZU0RFUFNfV0lOQ0VfR0xVRV9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy1zeXNkZXBzLmMgYi9kYnVzL2RidXMvZGJ1cy1zeXNkZXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRmYjhkNwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXN5c2RlcHMuYwpAQCAtMCwwICsxLDc3NCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXN5c2RlcHMuYyBXcmFwcGVycyBhcm91bmQgc3lzdGVtL2xpYmMgZmVhdHVyZXMgc2hhcmVkIGJldHdlZW4gVU5JWCBhbmQgV2luZG93cyAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNiAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorI2luY2x1ZGUgImRidXMtdGhyZWFkcy5oIgorI2luY2x1ZGUgImRidXMtcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorI2luY2x1ZGUgImRidXMtbGlzdC5oIgorCisvKiBOT1RFOiBJZiB5b3UgaW5jbHVkZSBhbnkgdW5peC93aW5kb3dzLXNwZWNpZmljIGhlYWRlcnMgaGVyZSwgeW91IGFyZSBwcm9iYWJseSBkb2luZyBzb21ldGhpbmcKKyAqIHdyb25nIGFuZCBzaG91bGQgYmUgcHV0dGluZyBzb21lIGNvZGUgaW4gZGJ1cy1zeXNkZXBzLXVuaXguYyBvciBkYnVzLXN5c2RlcHMtd2luLmMuCisgKgorICogVGhlc2UgYXJlIHRoZSBzdGFuZGFyZCBBTlNJIEMgaGVhZGVycy4uLgorICovCisjaWYgSEFWRV9MT0NBTEVfSAorI2luY2x1ZGUgPGxvY2FsZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKworX0RCVVNfREVGSU5FX0dMT0JBTF9MT0NLICh3aW5fZmRzKTsKK19EQlVTX0RFRklORV9HTE9CQUxfTE9DSyAoc2lkX2F0b21fY2FjaGUpOworX0RCVVNfREVGSU5FX0dMT0JBTF9MT0NLIChzeXN0ZW1fdXNlcnMpOworCisjaWZkZWYgREJVU19XSU4KKyAgI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VsaWYgKGRlZmluZWQgX19BUFBMRV9fKQorIyBpbmNsdWRlIDxjcnRfZXh0ZXJucy5oPgorIyBkZWZpbmUgZW52aXJvbiAoKl9OU0dldEVudmlyb24oKSkKKyNlbHNlCitleHRlcm4gY2hhciAqKmVudmlyb247CisjZW5kaWYKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1N5c2RlcHMgSW50ZXJuYWwgc3lzdGVtLWRlcGVuZGVudCBBUEkKKyAqIEBpbmdyb3VwIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBJbnRlcm5hbCBzeXN0ZW0tZGVwZW5kZW50IEFQSSBhdmFpbGFibGUgb24gVU5JWCBhbmQgV2luZG93cworICoKKyAqIFRoZSBzeXN0ZW0tZGVwZW5kZW50IEFQSSBoYXMgYSBkdWFsIHB1cnBvc2UuIEZpcnN0LCBpdCBlbmNhcHN1bGF0ZXMKKyAqIGFsbCB1c2FnZSBvZiBvcGVyYXRpbmcgc3lzdGVtIEFQSXMgZm9yIGVhc2Ugb2YgYXVkaXRpbmcgYW5kIHRvCisgKiBhdm9pZCBjbHV0dGVyaW5nIHRoZSByZXN0IG9mIHRoZSBjb2RlIHdpdGggYml6YXJyZSBPUyBxdWlya3MgYW5kCisgKiBoZWFkZXJzLiBTZWNvbmQsIGl0IGFic3RyYWN0cyBkaWZmZXJlbnQgb3BlcmF0aW5nIHN5c3RlbSBBUElzIGZvcgorICogcG9ydGFiaWxpdHkuCisgKiAKKyAqIEB7CisgKi8KKworLyoqCisgKiBBYm9ydHMgdGhlIHByb2dyYW0gd2l0aCBTSUdBQlJUIChkdW1waW5nIGNvcmUpLgorICovCit2b2lkCitfZGJ1c19hYm9ydCAodm9pZCkKK3sKKyAgY29uc3QgY2hhciAqczsKKyAgCisgIF9kYnVzX3ByaW50X2JhY2t0cmFjZSAoKTsKKyAgCisgIHMgPSBfZGJ1c19nZXRlbnYgKCJEQlVTX0JMT0NLX09OX0FCT1JUIik7CisgIGlmIChzICYmICpzKQorICAgIHsKKyAgICAgIC8qIGRvbid0IHVzZSBfZGJ1c193YXJuIGhlcmUgc2luY2UgaXQgY2FuIF9kYnVzX2Fib3J0KCkgKi8KKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAgUHJvY2VzcyAlbHUgc2xlZXBpbmcgZm9yIGdkYiBhdHRhY2hcbiIsIF9kYnVzX3BpZF9mb3JfbG9nICgpKTsKKyAgICAgIF9kYnVzX3NsZWVwX21pbGxpc2Vjb25kcyAoMTAwMCAqIDE4MCk7CisgICAgfQorICAKKyAgYWJvcnQgKCk7CisgIF9kYnVzX2V4aXQgKDEpOyAvKiBpbiBjYXNlIHNvbWVvbmUgbWFuYWdlcyB0byBpZ25vcmUgU0lHQUJSVCA/ICovCit9CisKKy8qKgorICogV3JhcHBlciBmb3Igc2V0ZW52KCkuIElmIHRoZSB2YWx1ZSBpcyAjTlVMTCwgdW5zZXRzCisgKiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuCisgKgorICogVGhlcmUgaXMgYW4gdW5maXhhYmxlIG1lbWxlYWsgaW4gdGhhdCBpdCBpcyB1bnNhZmUgdG8KKyAqIGZyZWUgbWVtb3J5IG1hbGxvY2VkIGZvciB1c2Ugd2l0aCBzZXRlbnYuIFRoaXMgaXMgYmVjYXVzZQorICogd2UgY2FuIG5vdCByZWx5IG9uIGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YKKyAqIHRoZSB1bmRlcmx5aW5nIGxpYmMgbGlicmFyeS4KKyAqCisgKiBAcGFyYW0gdmFybmFtZSBuYW1lIG9mIGVudmlyb25tZW50IHZhcmlhYmxlCisgKiBAcGFyYW0gdmFsdWUgdmFsdWUgb2YgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zZXRlbnYgKGNvbnN0IGNoYXIgKnZhcm5hbWUsCisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICBfZGJ1c19hc3NlcnQgKHZhcm5hbWUgIT0gTlVMTCk7CisgIAorICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICB7CisjaWZkZWYgSEFWRV9VTlNFVEVOVgorICAgICAgdW5zZXRlbnYgKHZhcm5hbWUpOworICAgICAgcmV0dXJuIFRSVUU7CisjZWxzZQorICAgICAgY2hhciAqcHV0ZW52X3ZhbHVlOworICAgICAgc2l6ZV90IGxlbjsKKworICAgICAgbGVuID0gc3RybGVuICh2YXJuYW1lKTsKKworICAgICAgLyogVXNlIHN5c3RlbSBtYWxsb2MgdG8gYXZvaWQgbWVtbGVha3MgdGhhdCBkYnVzX21hbGxvYworICAgICAgICogd2lsbCBnZXQgdXBzZXQgYWJvdXQuCisgICAgICAgKi8KKyAgICAgIAorICAgICAgcHV0ZW52X3ZhbHVlID0gbWFsbG9jIChsZW4gKyAyKTsKKyAgICAgIGlmIChwdXRlbnZfdmFsdWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBzdHJjcHkgKHB1dGVudl92YWx1ZSwgdmFybmFtZSk7CisjaWYgZGVmaW5lZChEQlVTX1dJTikKKyAgICAgIHN0cmNhdCAocHV0ZW52X3ZhbHVlLCAiPSIpOworI2VuZGlmCisgICAgICAKKyAgICAgIHJldHVybiAocHV0ZW52IChwdXRlbnZfdmFsdWUpID09IDApOworI2VuZGlmCisgICAgfQorICBlbHNlCisgICAgeworI2lmZGVmIEhBVkVfU0VURU5WCisgICAgICByZXR1cm4gKHNldGVudiAodmFybmFtZSwgdmFsdWUsIFRSVUUpID09IDApOworI2Vsc2UKKyAgICAgIGNoYXIgKnB1dGVudl92YWx1ZTsKKyAgICAgIHNpemVfdCBsZW47CisgICAgICBzaXplX3QgdmFybmFtZV9sZW47CisgICAgICBzaXplX3QgdmFsdWVfbGVuOworCisgICAgICB2YXJuYW1lX2xlbiA9IHN0cmxlbiAodmFybmFtZSk7CisgICAgICB2YWx1ZV9sZW4gPSBzdHJsZW4gKHZhbHVlKTsKKyAgICAgIAorICAgICAgbGVuID0gdmFybmFtZV9sZW4gKyB2YWx1ZV9sZW4gKyAxIC8qICc9JyAqLyA7CisKKyAgICAgIC8qIFVzZSBzeXN0ZW0gbWFsbG9jIHRvIGF2b2lkIG1lbWxlYWtzIHRoYXQgZGJ1c19tYWxsb2MKKyAgICAgICAqIHdpbGwgZ2V0IHVwc2V0IGFib3V0LgorICAgICAgICovCisgICAgICAKKyAgICAgIHB1dGVudl92YWx1ZSA9IG1hbGxvYyAobGVuICsgMSk7CisgICAgICBpZiAocHV0ZW52X3ZhbHVlID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgc3RyY3B5IChwdXRlbnZfdmFsdWUsIHZhcm5hbWUpOworICAgICAgc3RyY3B5IChwdXRlbnZfdmFsdWUgKyB2YXJuYW1lX2xlbiwgIj0iKTsKKyAgICAgIHN0cmNweSAocHV0ZW52X3ZhbHVlICsgdmFybmFtZV9sZW4gKyAxLCB2YWx1ZSk7CisgICAgICAKKyAgICAgIHJldHVybiAocHV0ZW52IChwdXRlbnZfdmFsdWUpID09IDApOworI2VuZGlmCisgICAgfQorfQorCisvKioKKyAqIFdyYXBwZXIgZm9yIGdldGVudigpLgorICoKKyAqIEBwYXJhbSB2YXJuYW1lIG5hbWUgb2YgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAqIEByZXR1cm5zIHZhbHVlIG9mIGVudmlyb25tZW50IHZhcmlhYmxlIG9yICNOVUxMIGlmIHVuc2V0CisgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c19nZXRlbnYgKGNvbnN0IGNoYXIgKnZhcm5hbWUpCit7ICAKKyAgLyogRG9uJ3QgcmVzcGVjdCBhbnkgZW52aXJvbm1lbnQgdmFyaWFibGVzIGlmIHRoZSBjdXJyZW50IHByb2Nlc3MgaXMKKyAgICogc2V0dWlkLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiBnbGliYydzIF9fc2VjdXJlX2dldGVudigpLgorICAgKi8KKyAgaWYgKF9kYnVzX2NoZWNrX3NldHVpZCAoKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIGdldGVudiAodmFybmFtZSk7Cit9CisKKy8qKgorICogV3JhcHBlciBmb3IgY2xlYXJlbnYoKS4KKyAqCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY2xlYXJlbnYgKHZvaWQpCit7CisgIGRidXNfYm9vbF90IHJjID0gVFJVRTsKKworI2lmZGVmIEhBVkVfQ0xFQVJFTlYKKyAgaWYgKGNsZWFyZW52ICgpICE9IDApCisgICAgIHJjID0gRkFMU0U7CisjZWxzZQorCisgIGlmIChlbnZpcm9uICE9IE5VTEwpCisgICAgZW52aXJvblswXSA9IE5VTEw7CisjZW5kaWYKKworICByZXR1cm4gcmM7Cit9CisKKy8qKgorICogU3BsaXQgcGF0aHMgaW50byBhIGxpc3Qgb2YgY2hhciBzdHJpbmdzCisgKiAKKyAqIEBwYXJhbSBkaXJzIHN0cmluZyB3aXRoIHBhdGhlcyAKKyAqIEBwYXJhbSBzdWZmaXggc3RyaW5nIGNvbmNhdGVkIHRvIGVhY2ggcGF0aCBpbiBkaXJzCisgKiBAcGFyYW0gZGlyX2xpc3QgY29udGFpbnMgYSBsaXN0IG9mIHNwbGl0dGVkIHBhdGhlcworICogcmV0dXJuICNUUlVFIGlzIHBhdGhlcyBjb3VsZCBiZSBzcGxpdHRlcywjRkFMU0UgaW4gb29tIGNhc2UgCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zcGxpdF9wYXRoc19hbmRfYXBwZW5kIChEQnVzU3RyaW5nICpkaXJzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN1ZmZpeCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgKipkaXJfbGlzdCkKK3sKKyAgIGludCBzdGFydDsKKyAgIGludCBpOworICAgaW50IGxlbjsKKyAgIGNoYXIgKmNwYXRoOworICAgREJ1c1N0cmluZyBmaWxlX3N1ZmZpeDsKKworICAgc3RhcnQgPSAwOworICAgaSA9IDA7CisKKyAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZV9zdWZmaXgsIHN1ZmZpeCk7CisKKyAgIGxlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkaXJzKTsKKworICAgd2hpbGUgKF9kYnVzX3N0cmluZ19maW5kIChkaXJzLCBzdGFydCwgX0RCVVNfUEFUSF9TRVBBUkFUT1IsICZpKSkKKyAgICAgeworICAgICAgIERCdXNTdHJpbmcgcGF0aDsKKworICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZwYXRoKSkKKyAgICAgICAgICBnb3RvIG9vbTsKKworICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuIChkaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXRoKTsKKyAgICAgICAgICAgIGdvdG8gb29tOworICAgICAgICAgIH0KKworICAgICAgICBfZGJ1c19zdHJpbmdfY2hvcF93aGl0ZSAoJnBhdGgpOworCisgICAgICAgIC8qIGNoZWNrIGZvciBhbiBlbXB0eSBwYXRoICovCisgICAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnBhdGgpID09IDApCisgICAgICAgICAgZ290byBuZXh0OworCisgICAgICAgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVfc3VmZml4KSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhdGgpOworICAgICAgICAgICAgZ290byBvb207CisgICAgICAgICAgfQorCisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfZGF0YSgmcGF0aCwgJmNwYXRoKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhdGgpOworICAgICAgICAgICAgZ290byBvb207CisgICAgICAgICAgfQorCisgICAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKGRpcl9saXN0LCBjcGF0aCkpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXRoKTsgICAgICAgICAgICAgIAorICAgICAgICAgICAgZGJ1c19mcmVlIChjcGF0aCk7CisgICAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgICB9CisKKyAgICAgICBuZXh0OgorICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhdGgpOworICAgICAgICBzdGFydCA9IGkgKyAxOworICAgIH0gCisgICAgICAKKyAgaWYgKHN0YXJ0ICE9IGxlbikKKyAgICB7IAorICAgICAgREJ1c1N0cmluZyBwYXRoOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcGF0aCkpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGF0aCk7CisgICAgICAgICAgZ290byBvb207CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVfc3VmZml4KSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGF0aCk7CisgICAgICAgICAgZ290byBvb207CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9kYXRhKCZwYXRoLCAmY3BhdGgpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXRoKTsKKyAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kIChkaXJfbGlzdCwgY3BhdGgpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXRoKTsgICAgICAgICAgICAgIAorICAgICAgICAgIGRidXNfZnJlZSAoY3BhdGgpOworICAgICAgICAgIGdvdG8gb29tOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGF0aCk7IAorICAgIH0KKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgX2RidXNfbGlzdF9mb3JlYWNoIChkaXJfbGlzdCwgKERCdXNGb3JlYWNoRnVuY3Rpb24pZGJ1c19mcmVlLCBOVUxMKTsgCisgIF9kYnVzX2xpc3RfY2xlYXIgKGRpcl9saXN0KTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiogQH0gKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzU3RyaW5nCisgKgorICogQHsKKyAqLworLyoqCisgKiBBcHBlbmRzIGFuIGludGVnZXIgdG8gYSBEQnVzU3RyaW5nLgorICogCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSB2YWx1ZSB0aGUgaW50ZWdlciB2YWx1ZQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5IG9yIG90aGVyIGZhaWx1cmUuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfYXBwZW5kX2ludCAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgIHZhbHVlKQoreworICAvKiB0aGlzIGNhbGN1bGF0aW9uIGlzIGZyb20gY29tcC5sYW5nLmMgZmFxICovCisjZGVmaW5lIE1BWF9MT05HX0xFTiAoKHNpemVvZiAobG9uZykgKiA4ICsgMikgLyAzICsgMSkgIC8qICsxIGZvciAnLScgKi8KKyAgaW50IG9yaWdfbGVuOworICBpbnQgaTsKKyAgY2hhciAqYnVmOworICAKKyAgb3JpZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19sZW5ndGhlbiAoc3RyLCBNQVhfTE9OR19MRU4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBidWYgPSBfZGJ1c19zdHJpbmdfZ2V0X2RhdGFfbGVuIChzdHIsIG9yaWdfbGVuLCBNQVhfTE9OR19MRU4pOworCisgIHNucHJpbnRmIChidWYsIE1BWF9MT05HX0xFTiwgIiVsZCIsIHZhbHVlKTsKKworICBpID0gMDsKKyAgd2hpbGUgKCpidWYpCisgICAgeworICAgICAgKytidWY7CisgICAgICArK2k7CisgICAgfQorICAKKyAgX2RidXNfc3RyaW5nX3Nob3J0ZW4gKHN0ciwgTUFYX0xPTkdfTEVOIC0gaSk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBBcHBlbmRzIGFuIHVuc2lnbmVkIGludGVnZXIgdG8gYSBEQnVzU3RyaW5nLgorICogCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSB2YWx1ZSB0aGUgaW50ZWdlciB2YWx1ZQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5IG9yIG90aGVyIGZhaWx1cmUuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfYXBwZW5kX3VpbnQgKERCdXNTdHJpbmcgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgdmFsdWUpCit7CisgIC8qIHRoaXMgaXMgd3JvbmcsIGJ1dCBkZWZpbml0ZWx5IG9uIHRoZSBoaWdoIHNpZGUuICovCisjZGVmaW5lIE1BWF9VTE9OR19MRU4gKE1BWF9MT05HX0xFTiAqIDIpCisgIGludCBvcmlnX2xlbjsKKyAgaW50IGk7CisgIGNoYXIgKmJ1ZjsKKyAgCisgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbGVuZ3RoZW4gKHN0ciwgTUFYX1VMT05HX0xFTikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1ZiA9IF9kYnVzX3N0cmluZ19nZXRfZGF0YV9sZW4gKHN0ciwgb3JpZ19sZW4sIE1BWF9VTE9OR19MRU4pOworCisgIHNucHJpbnRmIChidWYsIE1BWF9VTE9OR19MRU4sICIlbHUiLCB2YWx1ZSk7CisKKyAgaSA9IDA7CisgIHdoaWxlICgqYnVmKQorICAgIHsKKyAgICAgICsrYnVmOworICAgICAgKytpOworICAgIH0KKyAgCisgIF9kYnVzX3N0cmluZ19zaG9ydGVuIChzdHIsIE1BWF9VTE9OR19MRU4gLSBpKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFBhcnNlcyBhbiBpbnRlZ2VyIGNvbnRhaW5lZCBpbiBhIERCdXNTdHJpbmcuIEVpdGhlciByZXR1cm4gcGFyYW1ldGVyCisgKiBtYXkgYmUgI05VTEwgaWYgeW91IGFyZW4ndCBpbnRlcmVzdGVkIGluIGl0LiBUaGUgaW50ZWdlciBpcyBwYXJzZWQKKyAqIGFuZCBzdG9yZWQgaW4gdmFsdWVfcmV0dXJuLiBSZXR1cm4gcGFyYW1ldGVycyBhcmUgbm90IGluaXRpYWxpemVkCisgKiBpZiB0aGUgZnVuY3Rpb24gcmV0dXJucyAjRkFMU0UuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgdGhlIGJ5dGUgaW5kZXggb2YgdGhlIHN0YXJ0IG9mIHRoZSBpbnRlZ2VyCisgKiBAcGFyYW0gdmFsdWVfcmV0dXJuIHJldHVybiBsb2NhdGlvbiBvZiB0aGUgaW50ZWdlciB2YWx1ZSBvciAjTlVMTAorICogQHBhcmFtIGVuZF9yZXR1cm4gcmV0dXJuIGxvY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGludGVnZXIsIG9yICNOVUxMCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfcGFyc2VfaW50IChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICAgKnZhbHVlX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKmVuZF9yZXR1cm4pCit7CisgIGxvbmcgdjsKKyAgY29uc3QgY2hhciAqcDsKKyAgY2hhciAqZW5kOworCisgIHAgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChzdHIsIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikgLSBzdGFydCk7CisKKyAgZW5kID0gTlVMTDsKKyAgX2RidXNfc2V0X2Vycm5vX3RvX3plcm8gKCk7CisgIHYgPSBzdHJ0b2wgKHAsICZlbmQsIDApOworICBpZiAoZW5kID09IE5VTEwgfHwgZW5kID09IHAgfHwgZXJybm8gIT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHZhbHVlX3JldHVybikKKyAgICAqdmFsdWVfcmV0dXJuID0gdjsKKyAgaWYgKGVuZF9yZXR1cm4pCisgICAgKmVuZF9yZXR1cm4gPSBzdGFydCArIChlbmQgLSBwKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBQYXJzZXMgYW4gdW5zaWduZWQgaW50ZWdlciBjb250YWluZWQgaW4gYSBEQnVzU3RyaW5nLiBFaXRoZXIgcmV0dXJuCisgKiBwYXJhbWV0ZXIgbWF5IGJlICNOVUxMIGlmIHlvdSBhcmVuJ3QgaW50ZXJlc3RlZCBpbiBpdC4gVGhlIGludGVnZXIKKyAqIGlzIHBhcnNlZCBhbmQgc3RvcmVkIGluIHZhbHVlX3JldHVybi4gUmV0dXJuIHBhcmFtZXRlcnMgYXJlIG5vdAorICogaW5pdGlhbGl6ZWQgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgI0ZBTFNFLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHRoZSBieXRlIGluZGV4IG9mIHRoZSBzdGFydCBvZiB0aGUgaW50ZWdlcgorICogQHBhcmFtIHZhbHVlX3JldHVybiByZXR1cm4gbG9jYXRpb24gb2YgdGhlIGludGVnZXIgdmFsdWUgb3IgI05VTEwKKyAqIEBwYXJhbSBlbmRfcmV0dXJuIHJldHVybiBsb2NhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBpbnRlZ2VyLCBvciAjTlVMTAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX3BhcnNlX3VpbnQgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICp2YWx1ZV9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqZW5kX3JldHVybikKK3sKKyAgdW5zaWduZWQgbG9uZyB2OworICBjb25zdCBjaGFyICpwOworICBjaGFyICplbmQ7CisKKyAgcCA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHN0ciwgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSAtIHN0YXJ0KTsKKworICBlbmQgPSBOVUxMOworICBfZGJ1c19zZXRfZXJybm9fdG9femVybyAoKTsKKyAgdiA9IHN0cnRvdWwgKHAsICZlbmQsIDApOworICBpZiAoZW5kID09IE5VTEwgfHwgZW5kID09IHAgfHwgZXJybm8gIT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHZhbHVlX3JldHVybikKKyAgICAqdmFsdWVfcmV0dXJuID0gdjsKKyAgaWYgKGVuZF9yZXR1cm4pCisgICAgKmVuZF9yZXR1cm4gPSBzdGFydCArIChlbmQgLSBwKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqIEB9ICovIC8qIERCdXNTdHJpbmcgZ3JvdXAgKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzSW50ZXJuYWxzVXRpbHMKKyAqIEB7CisgKi8KKwordm9pZAorX2RidXNfZ2VuZXJhdGVfcHNldWRvcmFuZG9tX2J5dGVzX2J1ZmZlciAoY2hhciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgbl9ieXRlcykKK3sKKyAgbG9uZyB0dl91c2VjOworICBpbnQgaTsKKyAgCisgIC8qIGZhbGwgYmFjayB0byBwc2V1ZG9yYW5kb20gKi8KKyAgX2RidXNfdmVyYm9zZSAoIkZhbGxpbmcgYmFjayB0byBwc2V1ZG9yYW5kb20gZm9yICVkIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICBuX2J5dGVzKTsKKyAgCisgIF9kYnVzX2dldF9yZWFsX3RpbWUgKE5VTEwsICZ0dl91c2VjKTsKKyAgc3JhbmQgKHR2X3VzZWMpOworICAKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbl9ieXRlcykKKyAgICB7CisgICAgICBkb3VibGUgcjsKKyAgICAgIHVuc2lnbmVkIGludCBiOworICAgICAgICAgIAorICAgICAgciA9IHJhbmQgKCk7CisgICAgICBiID0gKHIgLyAoZG91YmxlKSBSQU5EX01BWCkgKiAyNTUuMDsKKworICAgICAgYnVmZmVyW2ldID0gYjsKKworICAgICAgKytpOworICAgIH0KK30KKworLyoqCisgKiBGaWxscyBuX2J5dGVzIG9mIHRoZSBnaXZlbiBidWZmZXIgd2l0aCByYW5kb20gYnl0ZXMuCisgKgorICogQHBhcmFtIGJ1ZmZlciBhbiBhbGxvY2F0ZWQgYnVmZmVyCisgKiBAcGFyYW0gbl9ieXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGJ1ZmZlciB0byB3cml0ZSB0bworICovCit2b2lkCitfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYnl0ZXNfYnVmZmVyIChjaGFyICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICBuX2J5dGVzKQoreworICBEQnVzU3RyaW5nIHN0cjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICB7CisgICAgICBfZGJ1c19nZW5lcmF0ZV9wc2V1ZG9yYW5kb21fYnl0ZXNfYnVmZmVyIChidWZmZXIsIG5fYnl0ZXMpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoIV9kYnVzX2dlbmVyYXRlX3JhbmRvbV9ieXRlcyAoJnN0ciwgbl9ieXRlcykpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICAgICAgX2RidXNfZ2VuZXJhdGVfcHNldWRvcmFuZG9tX2J5dGVzX2J1ZmZlciAoYnVmZmVyLCBuX2J5dGVzKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2NvcHlfdG9fYnVmZmVyICgmc3RyLCBidWZmZXIsIG5fYnl0ZXMpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGdpdmVuIG51bWJlciBvZiByYW5kb20gYnl0ZXMsIHdoZXJlIHRoZSBieXRlcyBhcmUKKyAqIGNob3NlbiBmcm9tIHRoZSBhbHBoYW51bWVyaWMgQVNDSUkgc3Vic2V0LgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIG5fYnl0ZXMgdGhlIG51bWJlciBvZiByYW5kb20gQVNDSUkgYnl0ZXMgdG8gYXBwZW5kIHRvIHN0cmluZworICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIGlmIG5vIG1lbW9yeSBvciBvdGhlciBmYWlsdXJlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYXNjaWkgKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbl9ieXRlcykKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgbGV0dGVyc1tdID0KKyAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOworICBpbnQgaTsKKyAgaW50IGxlbjsKKyAgCisgIGlmICghX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2J5dGVzIChzdHIsIG5fYnl0ZXMpKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGxlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworICBpID0gbGVuIC0gbl9ieXRlczsKKyAgd2hpbGUgKGkgPCBsZW4pCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChzdHIsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldHRlcnNbX2RidXNfc3RyaW5nX2dldF9ieXRlIChzdHIsIGkpICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mIChsZXR0ZXJzKSAtIDEpXSk7CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfdmFsaWRhdGVfYXNjaWkgKHN0ciwgbGVuIC0gbl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fYnl0ZXMpKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDb252ZXJ0cyBhIFVOSVggZXJybm8sIG9yIFdpbmRvd3MgZXJybm8gb3IgV2luU29jayBlcnJvciB2YWx1ZSBpbnRvCisgKiBhICNEQnVzRXJyb3IgbmFtZS4KKyAqCisgKiBAdG9kbyBzaG91bGQgY292ZXIgbW9yZSBlcnJub3MsIHNwZWNpZmljYWxseSB0aG9zZQorICogZnJvbSBvcGVuKCkuCisgKiAKKyAqIEBwYXJhbSBlcnJvcl9udW1iZXIgdGhlIGVycm5vLgorICogQHJldHVybnMgYW4gZXJyb3IgbmFtZQorICovCitjb25zdCBjaGFyKgorX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoaW50IGVycm9yX251bWJlcikKK3sKKyAgc3dpdGNoIChlcnJvcl9udW1iZXIpCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX0ZBSUxFRDsKKyAgICAgIAorI2lmZGVmIEVQUk9UT05PU1VQUE9SVAorICAgIGNhc2UgRVBST1RPTk9TVVBQT1JUOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfTk9UX1NVUFBPUlRFRDsKKyNlbGlmIGRlZmluZWQoV1NBRVBST1RPTk9TVVBQT1JUKQorICAgIGNhc2UgV1NBRVBST1RPTk9TVVBQT1JUOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfTk9UX1NVUFBPUlRFRDsKKyNlbmRpZgorI2lmZGVmIEVBRk5PU1VQUE9SVAorICAgIGNhc2UgRUFGTk9TVVBQT1JUOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfTk9UX1NVUFBPUlRFRDsKKyNlbGlmIGRlZmluZWQoV1NBRUFGTk9TVVBQT1JUKQorICAgIGNhc2UgV1NBRUFGTk9TVVBQT1JUOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfTk9UX1NVUFBPUlRFRDsKKyNlbmRpZgorI2lmZGVmIEVORklMRQorICAgIGNhc2UgRU5GSUxFOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfTElNSVRTX0VYQ0VFREVEOyAvKiBrZXJuZWwgb3V0IG9mIG1lbW9yeSAqLworI2VuZGlmCisjaWZkZWYgRU1GSUxFCisgICAgY2FzZSBFTUZJTEU6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9MSU1JVFNfRVhDRUVERUQ7CisjZW5kaWYKKyNpZmRlZiBFQUNDRVMKKyAgICBjYXNlIEVBQ0NFUzoKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQ7CisjZW5kaWYKKyNpZmRlZiBFUEVSTQorICAgIGNhc2UgRVBFUk06CisgICAgICByZXR1cm4gREJVU19FUlJPUl9BQ0NFU1NfREVOSUVEOworI2VuZGlmCisjaWZkZWYgRU5PQlVGUworICAgIGNhc2UgRU5PQlVGUzoKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX05PX01FTU9SWTsKKyNlbmRpZgorI2lmZGVmIEVOT01FTQorICAgIGNhc2UgRU5PTUVNOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfTk9fTUVNT1JZOworI2VuZGlmCisjaWZkZWYgRUNPTk5SRUZVU0VECisgICAgY2FzZSBFQ09OTlJFRlVTRUQ6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9OT19TRVJWRVI7CisjZWxpZiBkZWZpbmVkKFdTQUVDT05OUkVGVVNFRCkKKyAgICBjYXNlIFdTQUVDT05OUkVGVVNFRDoKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX05PX1NFUlZFUjsKKyNlbmRpZgorI2lmZGVmIEVUSU1FRE9VVAorICAgIGNhc2UgRVRJTUVET1VUOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfVElNRU9VVDsKKyNlbGlmIGRlZmluZWQoV1NBRVRJTUVET1VUKQorICAgIGNhc2UgV1NBRVRJTUVET1VUOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfVElNRU9VVDsKKyNlbmRpZgorI2lmZGVmIEVORVRVTlJFQUNICisgICAgY2FzZSBFTkVUVU5SRUFDSDoKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX05PX05FVFdPUks7CisjZWxpZiBkZWZpbmVkKFdTQUVORVRVTlJFQUNIKQorICAgIGNhc2UgV1NBRU5FVFVOUkVBQ0g6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9OT19ORVRXT1JLOworI2VuZGlmCisjaWZkZWYgRUFERFJJTlVTRQorICAgIGNhc2UgRUFERFJJTlVTRToKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX0FERFJFU1NfSU5fVVNFOworI2VsaWYgZGVmaW5lZChXU0FFQUREUklOVVNFKQorICAgIGNhc2UgV1NBRUFERFJJTlVTRToKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX0FERFJFU1NfSU5fVVNFOworI2VuZGlmCisjaWZkZWYgRUVYSVNUCisgICAgY2FzZSBFRVhJU1Q6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9GSUxFX0VYSVNUUzsKKyNlbmRpZgorI2lmZGVmIEVOT0VOVAorICAgIGNhc2UgRU5PRU5UOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfRklMRV9OT1RfRk9VTkQ7CisjZW5kaWYKKyAgICB9CisKKyAgcmV0dXJuIERCVVNfRVJST1JfRkFJTEVEOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBjdXJyZW50IHN5c3RlbSBlcnJubyB2YWx1ZSBpbnRvIGEgI0RCdXNFcnJvciBuYW1lLgorICoKKyAqIEByZXR1cm5zIGFuIGVycm9yIG5hbWUKKyAqLworY29uc3QgY2hhcioKK19kYnVzX2Vycm9yX2Zyb21fc3lzdGVtX2Vycm5vICh2b2lkKQoreworICByZXR1cm4gX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pOworfQorCisvKioKKyAqIEFzc2lnbiAwIHRvIHRoZSBnbG9iYWwgZXJybm8gdmFyaWFibGUKKyAqLwordm9pZAorX2RidXNfc2V0X2Vycm5vX3RvX3plcm8gKHZvaWQpCit7CisjaWZkZWYgREJVU19XSU5DRQorICBTZXRMYXN0RXJyb3IgKDApOworI2Vsc2UKKyAgZXJybm8gPSAwOworI2VuZGlmCit9CisKKy8qKgorICogU2VlIGlmIGVycm5vIGlzIHNldAorICogQHJldHVybnMgI1RSVUUgaWYgZXJybm8gaXMgbm90IDAKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dldF9pc19lcnJub19ub256ZXJvICh2b2lkKQoreworICByZXR1cm4gZXJybm8gIT0gMDsKK30KKworLyoqCisgKiBTZWUgaWYgZXJybm8gaXMgRU5PTUVNCisgKiBAcmV0dXJucyAjVFJVRSBpZiBlcnJubyA9PSBFTk9NRU0KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dldF9pc19lcnJub19lbm9tZW0gKHZvaWQpCit7CisgIHJldHVybiBlcnJubyA9PSBFTk9NRU07Cit9CisKKy8qKgorICogU2VlIGlmIGVycm5vIGlzIEVJTlRSCisgKiBAcmV0dXJucyAjVFJVRSBpZiBlcnJubyA9PSBFSU5UUgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X2lzX2Vycm5vX2VpbnRyICh2b2lkKQoreworICByZXR1cm4gZXJybm8gPT0gRUlOVFI7Cit9CisKKy8qKgorICogU2VlIGlmIGVycm5vIGlzIEVQSVBFCisgKiBAcmV0dXJucyAjVFJVRSBpZiBlcnJubyA9PSBFUElQRQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X2lzX2Vycm5vX2VwaXBlICh2b2lkKQoreworICByZXR1cm4gZXJybm8gPT0gRVBJUEU7Cit9CisKKy8qKgorICogR2V0IGVycm9yIG1lc3NhZ2UgZnJvbSBlcnJubworICogQHJldHVybnMgX2RidXNfc3RyZXJyb3IoZXJybm8pCisgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICh2b2lkKQoreworICByZXR1cm4gX2RidXNfc3RyZXJyb3IgKGVycm5vKTsKK30KKworLyoqIEB9IGVuZCBvZiBzeXNkZXBzICovCisKKy8qIHRlc3RzIGluIGRidXMtc3lzZGVwcy11dGlsLmMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLXN5c2RlcHMuaCBiL2RidXMvZGJ1cy9kYnVzLXN5c2RlcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWU5MTYwCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtc3lzZGVwcy5oCkBAIC0wLDAgKzEsNTQ4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3lzZGVwcy5oIFdyYXBwZXJzIGFyb3VuZCBzeXN0ZW0vbGliYyBmZWF0dXJlcyAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19TWVNERVBTX0gKKyNkZWZpbmUgREJVU19TWVNERVBTX0gKKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWZkZWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxkYnVzL2RidXMtZXJyb3JzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWZpbGUuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisKKy8qIHRoaXMgaXMgcGVyaGFwcyBib2d1cywgYnV0IHN0cmNtcCgpIGV0Yy4gYXJlIGZhc3RlciBpZiB3ZSB1c2UgdGhlCisgKiBzdHVmZiBzdHJhaWdodCBvdXQgb2Ygc3RyaW5nLmgsIHNvIGhhdmUgdGhpcyBoZXJlIGZvciBub3cuCisgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLyogQUlYIHN5cy9wb2xsLmggZG9lcyAjZGVmaW5lIGV2ZW50cyByZXFldmVudHMsIGFuZCBvdGhlcgorICogd29uZGVyb3VzbmVzcywgc28gbXVzdCBpbmNsdWRlIHN5cy9wb2xsIGJlZm9yZSBkZWNsYXJpbmcKKyAqIERCdXNQb2xsRkQKKyAqLyAKKyNpZmRlZiBIQVZFX1BPTEwKKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2VuZGlmCisKKyNpZmRlZiBEQlVTX1dJTkNFCisvKiBXaW5kb3dzIENFIGxhY2tzIHNvbWUgc3lzdGVtIGZ1bmN0aW9ucyAoc3VjaCBhcyBlcnJubyBhbmQgY2xvY2spLgorICAgV2UgYnJpbmcgdGhlbSBpbiBoZXJlLiAgKi8KKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5oIgorI2VuZGlmCisKK0RCVVNfQkVHSU5fREVDTFMKKworI2lmZGVmIERCVVNfV0lOCisjZGVmaW5lIF9EQlVTX1BBVEhfU0VQQVJBVE9SICI7IgorI2Vsc2UKKyNkZWZpbmUgX0RCVVNfUEFUSF9TRVBBUkFUT1IgIjoiCisjZW5kaWYKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KKworCisvKiogQW4gb3BhcXVlIGxpc3QgdHlwZSAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c0xpc3QgREJ1c0xpc3Q7CisKKy8qKiBPYmplY3QgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YgY3JlZGVudGlhbHMgc3VjaCBhcyBVTklYIG9yIFdpbmRvd3MgdXNlciBJRCAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c0NyZWRlbnRpYWxzIERCdXNDcmVkZW50aWFsczsKKworLyoqIEEgd3JhcHBlciBhcm91bmQgYSBwaXBlIGRlc2NyaXB0b3Igb3IgaGFuZGxlICovCit0eXBlZGVmIHN0cnVjdCBEQnVzUGlwZSBEQnVzUGlwZTsKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzU3lzZGVwcworICoKKyAqIEB7CisgKi8KKwordm9pZCBfZGJ1c19hYm9ydCAodm9pZCkgX0RCVVNfR05VQ19OT1JFVFVSTjsKKworZGJ1c19ib29sX3QgX2RidXNfY2hlY2tfc2V0dWlkICh2b2lkKTsKK2NvbnN0IGNoYXIqIF9kYnVzX2dldGVudiAoY29uc3QgY2hhciAqdmFybmFtZSk7CitkYnVzX2Jvb2xfdCBfZGJ1c19zZXRlbnYgKGNvbnN0IGNoYXIgKnZhcm5hbWUsCisJCQkgIGNvbnN0IGNoYXIgKnZhbHVlKTsKK2RidXNfYm9vbF90IF9kYnVzX2NsZWFyZW52ICh2b2lkKTsKK2NoYXIgKiogICAgIF9kYnVzX2dldF9lbnZpcm9ubWVudCAodm9pZCk7CisKKy8qKiBBIHByb2Nlc3MgSUQgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBkYnVzX3BpZF90OworLyoqIEEgdXNlciBJRCAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGRidXNfdWlkX3Q7CisvKiogQSBncm91cCBJRCAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGRidXNfZ2lkX3Q7CisKKy8qKiBhbiBpbnZhbGlkIFBJRCB1c2VkIHRvIHJlcHJlc2VudCBhbiB1bmluaXRpYWxpemVkIGRidXNfcGlkX3QgZmllbGQgKi8KKyNkZWZpbmUgREJVU19QSURfVU5TRVQgKChkYnVzX3BpZF90KSAtMSkKKy8qKiBhbiBpbnZhbGlkIFVJRCB1c2VkIHRvIHJlcHJlc2VudCBhbiB1bmluaXRpYWxpemVkIGRidXNfdWlkX3QgZmllbGQgKi8KKyNkZWZpbmUgREJVU19VSURfVU5TRVQgKChkYnVzX3VpZF90KSAtMSkKKy8qKiBhbiBpbnZhbGlkIEdJRCB1c2VkIHRvIHJlcHJlc2VudCBhbiB1bmluaXRpYWxpemVkIGRidXNfZ2lkX3QgZmllbGQgKi8KKyNkZWZpbmUgREJVU19HSURfVU5TRVQgKChkYnVzX2dpZF90KSAtMSkKKworLyoqIGFuIGFwcHJvcHJpYXRlIHByaW50ZiBmb3JtYXQgZm9yIGRidXNfcGlkX3QgKi8KKyNkZWZpbmUgREJVU19QSURfRk9STUFUICIlbHUiCisvKiogYW4gYXBwcm9wcmlhdGUgcHJpbnRmIGZvcm1hdCBmb3IgZGJ1c191aWRfdCAqLworI2RlZmluZSBEQlVTX1VJRF9GT1JNQVQgIiVsdSIKKy8qKiBhbiBhcHByb3ByaWF0ZSBwcmludGYgZm9ybWF0IGZvciBkYnVzX2dpZF90ICovCisjZGVmaW5lIERCVVNfR0lEX0ZPUk1BVCAiJWx1IgorCisKKy8qKgorICogU29ja2V0IGludGVyZmFjZQorICoKKyAqICBAdG9kbyBVc2UgZm9yIHRoZSBmaWxlIGRlc2NyaXB0b3JzIGEgc3RydWN0CisgKiAgICAgICAgICAgLSBzdHJ1Y3QgREJ1c1NvY2tldHsgaW50IGQ7IH07IC0KKyAqICAgICAgICBpbnN0ZWFkIG9mIGludCB0byBnZXQgdHlwZS1zYWZldHkgd2hpY2ggCisgKiAgICAgICAgd2lsbCBiZSBjaGVja2VkIGJ5IHRoZSBjb21waWxlci4KKyAqIAorICovCisKK2RidXNfYm9vbF90IF9kYnVzX2Nsb3NlX3NvY2tldCAgICAgKGludCAgICAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworaW50ICAgICAgICAgX2RidXNfcmVhZF9zb2NrZXQgICAgICAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBjb3VudCk7CitpbnQgICAgICAgICBfZGJ1c193cml0ZV9zb2NrZXQgICAgIChpbnQgICAgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuKTsKK2ludCAgICAgICAgIF9kYnVzX3dyaXRlX3NvY2tldF90d28gKGludCAgICAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuMik7CisKK2ludCBfZGJ1c19yZWFkX3NvY2tldF93aXRoX3VuaXhfZmRzICAgICAgKGludCAgICAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpmZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpuX2Zkcyk7CitpbnQgX2RidXNfd3JpdGVfc29ja2V0X3dpdGhfdW5peF9mZHMgICAgIChpbnQgICAgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICAqZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbl9mZHMpOworaW50IF9kYnVzX3dyaXRlX3NvY2tldF93aXRoX3VuaXhfZmRzX3R3byAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICAqZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbl9mZHMpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19zb2NrZXRfaXNfaW52YWxpZCAoaW50ICAgICAgICAgICAgICBmZCk7CisKK2ludCBfZGJ1c19jb25uZWN0X3RjcF9zb2NrZXQgIChjb25zdCBjaGFyICAgICAqaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitpbnQgX2RidXNfY29ubmVjdF90Y3Bfc29ja2V0X3dpdGhfbm9uY2UgIChjb25zdCBjaGFyICAgICAqaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpub25jZWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworaW50IF9kYnVzX2xpc3Rlbl90Y3Bfc29ja2V0ICAgKGNvbnN0IGNoYXIgICAgICpob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpmYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgKnJldHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAqKmZkc19wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitpbnQgX2RidXNfYWNjZXB0ICAgICAgICAgICAgICAoaW50ICAgICAgICAgICAgIGxpc3Rlbl9mZCk7CisKKworZGJ1c19ib29sX3QgX2RidXNfcmVhZF9jcmVkZW50aWFsc19zb2NrZXQgKGludCAgICAgICAgICAgICAgIGNsaWVudF9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCBfZGJ1c19zZW5kX2NyZWRlbnRpYWxzX3NvY2tldCAoaW50ICAgICAgICAgICAgICBzZXJ2ZXJfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvcik7CisKK2RidXNfYm9vbF90IF9kYnVzX2NyZWRlbnRpYWxzX2FkZF9mcm9tX3VzZXIgICAgICAgICAgICAoREJ1c0NyZWRlbnRpYWxzICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnVzZXJuYW1lKTsKK2RidXNfYm9vbF90IF9kYnVzX2NyZWRlbnRpYWxzX2FkZF9mcm9tX2N1cnJlbnRfcHJvY2VzcyAoREJ1c0NyZWRlbnRpYWxzICAqY3JlZGVudGlhbHMpOworZGJ1c19ib29sX3QgX2RidXNfYXBwZW5kX3VzZXJfZnJvbV9jdXJyZW50X3Byb2Nlc3MgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyKTsKKworZGJ1c19ib29sX3QgX2RidXNfcGFyc2VfdW5peF91c2VyX2Zyb21fY29uZmlnICAgKGNvbnN0IERCdXNTdHJpbmcgICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICAqdWlkX3ApOworZGJ1c19ib29sX3QgX2RidXNfcGFyc2VfdW5peF9ncm91cF9mcm9tX2NvbmZpZyAgKGNvbnN0IERCdXNTdHJpbmcgICpncm91cG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAgKmdpZF9wKTsKK2RidXNfYm9vbF90IF9kYnVzX3VuaXhfZ3JvdXBzX2Zyb21fdWlkICAgICAgICAgIChkYnVzX3VpZF90ICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICAgKipncm91cF9pZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKm5fZ3JvdXBfaWRzKTsKK2RidXNfYm9vbF90IF9kYnVzX3VuaXhfdXNlcl9pc19hdF9jb25zb2xlICAgICAgIChkYnVzX3VpZF90ICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCBfZGJ1c191bml4X3VzZXJfaXNfcHJvY2Vzc19vd25lciAgICAoZGJ1c191aWRfdCAgICAgICAgIHVpZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c193aW5kb3dzX3VzZXJfaXNfcHJvY2Vzc19vd25lciAoY29uc3QgY2hhciAgICAgICAgKndpbmRvd3Nfc2lkKTsKKworZGJ1c19ib29sX3QgX2RidXNfYXBwZW5kX2tleXJpbmdfZGlyZWN0b3J5X2Zvcl9jcmVkZW50aWFscyAoREJ1c1N0cmluZyAgICAgICpkaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgKmNyZWRlbnRpYWxzKTsKKworZGJ1c19ib29sX3QgX2RidXNfZGFlbW9uX2lzX3Nlc3Npb25fYnVzX2FkZHJlc3NfcHVibGlzaGVkIChjb25zdCBjaGFyICpzY29wZSk7CisKK2RidXNfYm9vbF90IF9kYnVzX2RhZW1vbl9wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MgKGNvbnN0IGNoYXIqIGFkZHJlc3MsIGNvbnN0IGNoYXIqIHNobV9uYW1lKTsKKwordm9pZCBfZGJ1c19kYWVtb25fdW5wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MgKHZvaWQpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19zb2NrZXRfY2FuX3Bhc3NfdW5peF9mZChpbnQgZmQpOworCisvKiogT3BhcXVlIHR5cGUgcmVwcmVzZW50aW5nIGFuIGF0b21pY2FsbHktbW9kaWZpYWJsZSBpbnRlZ2VyCisgKiB0aGF0IGNhbiBiZSB1c2VkIGZyb20gbXVsdGlwbGUgdGhyZWFkcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c0F0b21pYyBEQnVzQXRvbWljOworCisvKioKKyAqIEFuIGF0b21pYyBpbnRlZ2VyIHNhZmUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBmcm9tIG11bHRpcGxlIHRocmVhZHMuCisgKi8KK3N0cnVjdCBEQnVzQXRvbWljCit7CisjaWZkZWYgREJVU19XSU4KKyAgdm9sYXRpbGUgbG9uZyB2YWx1ZTsgLyoqPCBWYWx1ZSBvZiB0aGUgYXRvbWljIGludGVnZXIuICovCisjZWxzZQorICB2b2xhdGlsZSBkYnVzX2ludDMyX3QgdmFsdWU7IC8qKjwgVmFsdWUgb2YgdGhlIGF0b21pYyBpbnRlZ2VyLiAqLworI2VuZGlmCit9OworCisvKiBUaGUgdmFsdWUgd2UgZ2V0IGZyb20gYXV0b2ZvbyBpcyBpbiB0aGUgZm9ybSBvZiBhIGNwcCBleHByZXNzaW9uOworICogY29udmVydCB0aGF0IHRvIGEgY29udmVudGlvbmFsIGRlZmluZWQvdW5kZWYgc3dpdGNoLiAoV2UgY2FuJ3QgZ2V0CisgKiB0aGUgY29udmVudGlvbmFsIGRlZmluZWQvdW5kZWYgYmVjYXVzZSBvZiBtdWx0aWFyY2ggYnVpbGRzIG9ubHkgcnVubmluZworICogLi9jb25maWd1cmUgb25jZSwgb24gRGFyd2luLikgKi8KKyNpZiBEQlVTX0hBVkVfQVRPTUlDX0lOVF9DT05ECisjICAgZGVmaW5lIERCVVNfSEFWRV9BVE9NSUNfSU5UIDEKKyNlbHNlCisjICAgdW5kZWYgREJVU19IQVZFX0FUT01JQ19JTlQKKyNlbmRpZgorCitkYnVzX2ludDMyX3QgX2RidXNfYXRvbWljX2luYyAoREJ1c0F0b21pYyAqYXRvbWljKTsKK2RidXNfaW50MzJfdCBfZGJ1c19hdG9taWNfZGVjIChEQnVzQXRvbWljICphdG9taWMpOworZGJ1c19pbnQzMl90IF9kYnVzX2F0b21pY19nZXQgKERCdXNBdG9taWMgKmF0b21pYyk7CisKKworLyogQUlYIHVzZXMgZGlmZmVyZW50IHZhbHVlcyBmb3IgcG9sbCAqLworCisjaWZkZWYgX0FJWAorLyoqIFRoZXJlIGlzIGRhdGEgdG8gcmVhZCAqLworI2RlZmluZSBfREJVU19QT0xMSU4gICAgICAweDAwMDEKKy8qKiBUaGVyZSBpcyB1cmdlbnQgZGF0YSB0byByZWFkICovCisjZGVmaW5lIF9EQlVTX1BPTExQUkkgICAgIDB4MDAwNAorLyoqIFdyaXRpbmcgbm93IHdpbGwgbm90IGJsb2NrICovCisjZGVmaW5lIF9EQlVTX1BPTExPVVQgICAgIDB4MDAwMgorLyoqIEVycm9yIGNvbmRpdGlvbiAqLworI2RlZmluZSBfREJVU19QT0xMRVJSICAgICAweDQwMDAKKy8qKiBIdW5nIHVwICovCisjZGVmaW5lIF9EQlVTX1BPTExIVVAgICAgIDB4MjAwMAorLyoqIEludmFsaWQgcmVxdWVzdDogZmQgbm90IG9wZW4gKi8KKyNkZWZpbmUgX0RCVVNfUE9MTE5WQUwgICAgMHg4MDAwCisjZWxpZiBkZWZpbmVkKF9fSEFJS1VfXykKKy8qKiBUaGVyZSBpcyBkYXRhIHRvIHJlYWQgKi8KKyNkZWZpbmUgX0RCVVNfUE9MTElOICAgICAgMHgwMDAxCisvKiogV3JpdGluZyBub3cgd2lsbCBub3QgYmxvY2sgKi8KKyNkZWZpbmUgX0RCVVNfUE9MTE9VVCAgICAgMHgwMDAyCisvKiogRXJyb3IgY29uZGl0aW9uICovCisjZGVmaW5lIF9EQlVTX1BPTExFUlIgICAgIDB4MDAwNAorLyoqIFRoZXJlIGlzIHVyZ2VudCBkYXRhIHRvIHJlYWQgKi8KKyNkZWZpbmUgX0RCVVNfUE9MTFBSSSAgICAgMHgwMDIwCisvKiogSHVuZyB1cCAqLworI2RlZmluZSBfREJVU19QT0xMSFVQICAgICAweDAwODAKKy8qKiBJbnZhbGlkIHJlcXVlc3Q6IGZkIG5vdCBvcGVuICovCisjZGVmaW5lIF9EQlVTX1BPTExOVkFMICAgIDB4MTAwMAorI2Vsc2UKKy8qKiBUaGVyZSBpcyBkYXRhIHRvIHJlYWQgKi8KKyNkZWZpbmUgX0RCVVNfUE9MTElOICAgICAgMHgwMDAxCisvKiogVGhlcmUgaXMgdXJnZW50IGRhdGEgdG8gcmVhZCAqLworI2RlZmluZSBfREJVU19QT0xMUFJJICAgICAweDAwMDIKKy8qKiBXcml0aW5nIG5vdyB3aWxsIG5vdCBibG9jayAqLworI2RlZmluZSBfREJVU19QT0xMT1VUICAgICAweDAwMDQKKy8qKiBFcnJvciBjb25kaXRpb24gKi8KKyNkZWZpbmUgX0RCVVNfUE9MTEVSUiAgICAgMHgwMDA4CisvKiogSHVuZyB1cCAqLworI2RlZmluZSBfREJVU19QT0xMSFVQICAgICAweDAwMTAKKy8qKiBJbnZhbGlkIHJlcXVlc3Q6IGZkIG5vdCBvcGVuICovCisjZGVmaW5lIF9EQlVTX1BPTExOVkFMICAgIDB4MDAyMAorI2VuZGlmCisKKy8qKgorICogQSBwb3J0YWJsZSBzdHJ1Y3QgcG9sbGZkIHdyYXBwZXIuIAorICovCit0eXBlZGVmIHN0cnVjdAoreworICBpbnQgZmQ7ICAgICAgICAgICAgLyoqPCBGaWxlIGRlc2NyaXB0b3IgKi8KKyAgc2hvcnQgZXZlbnRzOyAgICAgIC8qKjwgRXZlbnRzIHRvIHBvbGwgZm9yICovCisgIHNob3J0IHJldmVudHM7ICAgICAvKio8IEV2ZW50cyB0aGF0IG9jY3VycmVkICovCit9IERCdXNQb2xsRkQ7CisKK2ludCBfZGJ1c19wb2xsIChEQnVzUG9sbEZEICpmZHMsCisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbl9mZHMsCisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpOworCit2b2lkIF9kYnVzX3NsZWVwX21pbGxpc2Vjb25kcyAoaW50IG1pbGxpc2Vjb25kcyk7CisKK3ZvaWQgX2RidXNfZ2V0X21vbm90b25pY190aW1lIChsb25nICp0dl9zZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAqdHZfdXNlYyk7CisKK3ZvaWQgX2RidXNfZ2V0X3JlYWxfdGltZSAobG9uZyAqdHZfc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICp0dl91c2VjKTsKKworLyoqCisgKiBkaXJlY3RvcnkgaW50ZXJmYWNlCisgKi8KK2RidXNfYm9vbF90ICAgIF9kYnVzX2NyZWF0ZV9kaXJlY3RvcnkgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICBfZGJ1c19kZWxldGVfZGlyZWN0b3J5ICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisJCQkJCSAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKKworZGJ1c19ib29sX3QgX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoREJ1c1N0cmluZyAgICAgICAqZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqbmV4dF9jb21wb25lbnQpOworZGJ1c19ib29sX3QgX2RidXNfc3RyaW5nX2dldF9kaXJuYW1lICAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpkaXJuYW1lKTsKK2RidXNfYm9vbF90IF9kYnVzX3BhdGhfaXNfYWJzb2x1dGUgICAgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lKTsKKworZGJ1c19ib29sX3QgX2RidXNfZ2V0X3N0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMgKERCdXNMaXN0ICoqZGlycyk7CitkYnVzX2Jvb2xfdCBfZGJ1c19nZXRfc3RhbmRhcmRfc3lzdGVtX3NlcnZpY2VkaXJzIChEQnVzTGlzdCAqKmRpcnMpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19hcHBlbmRfc3lzdGVtX2NvbmZpZ19maWxlICAoREJ1c1N0cmluZyAqc3RyKTsKK2RidXNfYm9vbF90IF9kYnVzX2FwcGVuZF9zZXNzaW9uX2NvbmZpZ19maWxlIChEQnVzU3RyaW5nICpzdHIpOworCisvKiogT3BhcXVlIHR5cGUgZm9yIHJlYWRpbmcgYSBkaXJlY3RvcnkgbGlzdGluZyAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c0Rpckl0ZXIgREJ1c0Rpckl0ZXI7CisKK0RCdXNEaXJJdGVyKiBfZGJ1c19kaXJlY3Rvcnlfb3BlbiAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90ICBfZGJ1c19kaXJlY3RvcnlfZ2V0X25leHRfZmlsZSAoREJ1c0Rpckl0ZXIgICAgICAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK3ZvaWQgICAgICAgICBfZGJ1c19kaXJlY3RvcnlfY2xvc2UgICAgICAgICAoREJ1c0Rpckl0ZXIgICAgICAqaXRlcik7CisKK2RidXNfYm9vbF90ICBfZGJ1c19jaGVja19kaXJfaXNfcHJpdmF0ZV90b191c2VyICAgIChEQnVzU3RyaW5nICpkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICplcnJvcik7CisKK3ZvaWQgX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMgKGludHB0cl90IGZkKTsKKworY29uc3QgY2hhciogX2RidXNfZ2V0X3RtcGRpciAgICAgICh2b2lkKTsKKworLyoqCisgKiBSYW5kb20gbnVtYmVycyAKKyAqLwordm9pZCAgICAgICAgX2RidXNfZ2VuZXJhdGVfcHNldWRvcmFuZG9tX2J5dGVzX2J1ZmZlciAoY2hhciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgbl9ieXRlcyk7Cit2b2lkICAgICAgICBfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYnl0ZXNfYnVmZmVyIChjaGFyICAgICAgICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBuX2J5dGVzKTsKK2RidXNfYm9vbF90IF9kYnVzX2dlbmVyYXRlX3JhbmRvbV9ieXRlcyAgICAgICAgKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIG5fYnl0ZXMpOworZGJ1c19ib29sX3QgX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2FzY2lpICAgICAgICAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbl9ieXRlcyk7CisKK2NvbnN0IGNoYXIqIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGludCBlcnJvcl9udW1iZXIpOworY29uc3QgY2hhciogX2RidXNfZXJyb3JfZnJvbV9zeXN0ZW1fZXJybm8gKHZvaWQpOworCit2b2lkICAgICAgICBfZGJ1c19zZXRfZXJybm9fdG9femVybyAgICAgICAgICAgICAgICAgICh2b2lkKTsKK2RidXNfYm9vbF90IF9kYnVzX2dldF9pc19lcnJub19ub256ZXJvICAgICAgICAgICAgICAgKHZvaWQpOworZGJ1c19ib29sX3QgX2RidXNfZ2V0X2lzX2Vycm5vX2VhZ2Fpbl9vcl9ld291bGRibG9jayAodm9pZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19nZXRfaXNfZXJybm9fZW5vbWVtICAgICAgICAgICAgICAgICh2b2lkKTsKK2RidXNfYm9vbF90IF9kYnVzX2dldF9pc19lcnJub19laW50ciAgICAgICAgICAgICAgICAgKHZvaWQpOworZGJ1c19ib29sX3QgX2RidXNfZ2V0X2lzX2Vycm5vX2VwaXBlICAgICAgICAgICAgICAgICAodm9pZCk7Citjb25zdCBjaGFyKiBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICAgICAgICAgICAgICAgICh2b2lkKTsKKwordm9pZCBfZGJ1c19kaXNhYmxlX3NpZ3BpcGUgKHZvaWQpOworCisKK3ZvaWQgX2RidXNfZXhpdCAoaW50IGNvZGUpIF9EQlVTX0dOVUNfTk9SRVRVUk47CisKK2ludCBfZGJ1c19wcmludGZfc3RyaW5nX3VwcGVyX2JvdW5kIChjb25zdCBjaGFyICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKTsKKworCisvKioKKyAqIFBvcnRhYmxlIHN0cnVjdCB3aXRoIHN0YXQoKSByZXN1bHRzCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVuc2lnbmVkIGxvbmcgbW9kZTsgIC8qKjwgRmlsZSBtb2RlICovCisgIHVuc2lnbmVkIGxvbmcgbmxpbms7IC8qKjwgTnVtYmVyIG9mIGhhcmQgbGlua3MgKi8KKyAgZGJ1c191aWRfdCAgICB1aWQ7ICAgLyoqPCBVc2VyIG93bmluZyBmaWxlICovCisgIGRidXNfZ2lkX3QgICAgZ2lkOyAgIC8qKjwgR3JvdXAgb3duaW5nIGZpbGUgKi8KKyAgdW5zaWduZWQgbG9uZyBzaXplOyAgLyoqPCBTaXplIG9mIGZpbGUgKi8KKyAgdW5zaWduZWQgbG9uZyBhdGltZTsgLyoqPCBBY2Nlc3MgdGltZSAqLworICB1bnNpZ25lZCBsb25nIG10aW1lOyAvKio8IE1vZGlmeSB0aW1lICovCisgIHVuc2lnbmVkIGxvbmcgY3RpbWU7IC8qKjwgQ3JlYXRpb24gdGltZSAqLworfSBEQnVzU3RhdDsKKworZGJ1c19ib29sX3QgX2RidXNfc3RhdCAgICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RhdCAgICAgICAgICpzdGF0YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgX2RidXNfZnVsbF9kdXBsZXhfcGlwZSAoaW50ICAgICAgICAgICAgICAqZmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqZmQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgYmxvY2tpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CisKK3ZvaWQgICAgICAgIF9kYnVzX3ByaW50X2JhY2t0cmFjZSAgKHZvaWQpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19iZWNvbWVfZGFlbW9uICAgKGNvbnN0IERCdXNTdHJpbmcgKnBpZGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQaXBlICAgICAgICAgKnByaW50X3BpZF9waXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAga2VlcF91bWFzayk7CisKK2RidXNfYm9vbF90IF9kYnVzX3ZlcmlmeV9kYWVtb25fdXNlciAgICAoY29uc3QgY2hhciAqdXNlcik7CitkYnVzX2Jvb2xfdCBfZGJ1c19jaGFuZ2VfdG9fZGFlbW9uX3VzZXIgKGNvbnN0IGNoYXIgKnVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKTsKKworZGJ1c19ib29sX3QgX2RidXNfd3JpdGVfcGlkX3RvX2ZpbGVfYW5kX3BpcGUgKGNvbnN0IERCdXNTdHJpbmcgKnBpZGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BpcGUgICAgICAgICAqcHJpbnRfcGlkX3BpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19waWRfdCAgICAgICAgcGlkX3RvX3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKKworZGJ1c19ib29sX3QgX2RidXNfY29tbWFuZF9mb3JfcGlkICh1bnNpZ25lZCBsb25nICBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgbWF4X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAqZXJyb3IpOworCisvKiogQSBVTklYIHNpZ25hbCBoYW5kbGVyICovCit0eXBlZGVmIHZvaWQgKCogREJ1c1NpZ25hbEhhbmRsZXIpIChpbnQgc2lnKTsKKwordm9pZCBfZGJ1c19zZXRfc2lnbmFsX2hhbmRsZXIgKGludCAgICAgICAgICAgICAgIHNpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU2lnbmFsSGFuZGxlciBoYW5kbGVyKTsKKworZGJ1c19ib29sX3QgX2RidXNfdXNlcl9hdF9jb25zb2xlIChjb25zdCBjaGFyICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpOworCit2b2lkIF9kYnVzX2luaXRfc3lzdGVtX2xvZyAodm9pZCk7CisKK3R5cGVkZWYgZW51bSB7CisgIERCVVNfU1lTVEVNX0xPR19JTkZPLAorICBEQlVTX1NZU1RFTV9MT0dfU0VDVVJJVFksCisgIERCVVNfU1lTVEVNX0xPR19GQVRBTAorfSBEQnVzU3lzdGVtTG9nU2V2ZXJpdHk7CisKK3ZvaWQgX2RidXNfc3lzdGVtX2xvZyAoREJ1c1N5c3RlbUxvZ1NldmVyaXR5IHNldmVyaXR5LCBjb25zdCBjaGFyICptc2csIC4uLikgX0RCVVNfR05VQ19QUklOVEYgKDIsIDMpOwordm9pZCBfZGJ1c19zeXN0ZW1fbG9ndiAoREJ1c1N5c3RlbUxvZ1NldmVyaXR5IHNldmVyaXR5LCBjb25zdCBjaGFyICptc2csIHZhX2xpc3QgYXJncyk7CisKKy8qIERlZmluZSBEQlVTX1ZBX0NPUFkoKSB0byBkbyB0aGUgcmlnaHQgdGhpbmcgZm9yIGNvcHlpbmcgdmFfbGlzdCB2YXJpYWJsZXMuCisgKiBjb25maWcuaCBtYXkgaGF2ZSBhbHJlYWR5IGRlZmluZWQgREJVU19WQV9DT1BZIGFzIHZhX2NvcHkgb3IgX192YV9jb3B5LgorICovCisjaWYgIWRlZmluZWQgKERCVVNfVkFfQ09QWSkKKyMgIGlmIGRlZmluZWQgKF9fR05VQ19fKSAmJiBkZWZpbmVkIChfX1BQQ19fKSAmJiAoZGVmaW5lZCAoX0NBTExfU1lTVikgfHwgZGVmaW5lZCAoX1dJTjMyKSkKKyMgICAgZGVmaW5lIERCVVNfVkFfQ09QWShhcDEsIGFwMikgICAoKihhcDEpID0gKihhcDIpKQorIyAgZWxpZiBkZWZpbmVkIChEQlVTX1ZBX0NPUFlfQVNfQVJSQVkpCisjICAgIGRlZmluZSBEQlVTX1ZBX0NPUFkoYXAxLCBhcDIpICAgbWVtY3B5ICgoYXAxKSwgKGFwMiksIHNpemVvZiAodmFfbGlzdCkpCisjICBlbHNlIC8qIHZhX2xpc3QgaXMgYSBwb2ludGVyICovCisjICAgIGRlZmluZSBEQlVTX1ZBX0NPUFkoYXAxLCBhcDIpICAgKChhcDEpID0gKGFwMikpCisjICBlbmRpZiAvKiB2YV9saXN0IGlzIGEgcG9pbnRlciAqLworI2VuZGlmIC8qICFEQlVTX1ZBX0NPUFkgKi8KKworCisvKioKKyAqIENhc3RzIGEgcHJpbWl0aXZlIEMgdHlwZSB0byBhIGJ5dGUgYXJyYXkgYW5kIHRoZW4gaW5kZXhlcworICogYSBwYXJ0aWN1bGFyIGJ5dGUgb2YgdGhlIGFycmF5LgorICovCisjZGVmaW5lIF9EQlVTX0JZVEVfT0ZfUFJJTUlUSVZFKHAsIGkpIFwKKyAgICAoKChjb25zdCBjaGFyKikmKHApKVsoaSldKQorLyoqIE9uIHg4NiB0aGVyZSBpcyBhbiA4MC1iaXQgRlBVLCBhbmQgaWYgeW91IGRvICJhID09IGIiIGl0IG1heSBoYXZlIGEKKyAqIG9yIGIgaW4gYW4gODAtYml0IHJlZ2lzdGVyLCB0aHVzIGZhaWxpbmcgdG8gY29tcGFyZSB0aGUgdHdvIDY0LWJpdAorICogZG91YmxlcyBmb3IgYml0d2lzZSBlcXVhbGl0eS4gU28gdGhpcyBtYWNybyBjb21wYXJlcyB0aGUgdHdvIGRvdWJsZXMKKyAqIGJpdHdpc2UuCisgKi8KKyNkZWZpbmUgX0RCVVNfRE9VQkxFU19CSVRXSVNFX0VRVUFMKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoX0RCVVNfQllURV9PRl9QUklNSVRJVkUgKGEsIDApID09IF9EQlVTX0JZVEVfT0ZfUFJJTUlUSVZFIChiLCAwKSAmJiAgICAgICBcCisgICAgICBfREJVU19CWVRFX09GX1BSSU1JVElWRSAoYSwgMSkgPT0gX0RCVVNfQllURV9PRl9QUklNSVRJVkUgKGIsIDEpICYmICAgICAgIFwKKyAgICAgIF9EQlVTX0JZVEVfT0ZfUFJJTUlUSVZFIChhLCAyKSA9PSBfREJVU19CWVRFX09GX1BSSU1JVElWRSAoYiwgMikgJiYgICAgICAgXAorICAgICAgX0RCVVNfQllURV9PRl9QUklNSVRJVkUgKGEsIDMpID09IF9EQlVTX0JZVEVfT0ZfUFJJTUlUSVZFIChiLCAzKSAmJiAgICAgICBcCisgICAgICBfREJVU19CWVRFX09GX1BSSU1JVElWRSAoYSwgNCkgPT0gX0RCVVNfQllURV9PRl9QUklNSVRJVkUgKGIsIDQpICYmICAgICAgIFwKKyAgICAgIF9EQlVTX0JZVEVfT0ZfUFJJTUlUSVZFIChhLCA1KSA9PSBfREJVU19CWVRFX09GX1BSSU1JVElWRSAoYiwgNSkgJiYgICAgICAgXAorICAgICAgX0RCVVNfQllURV9PRl9QUklNSVRJVkUgKGEsIDYpID09IF9EQlVTX0JZVEVfT0ZfUFJJTUlUSVZFIChiLCA2KSAmJiAgICAgICBcCisgICAgICBfREJVU19CWVRFX09GX1BSSU1JVElWRSAoYSwgNykgPT0gX0RCVVNfQllURV9PRl9QUklNSVRJVkUgKGIsIDcpKQorCitkYnVzX2Jvb2xfdCBfZGJ1c19nZXRfYXV0b2xhdW5jaF9hZGRyZXNzIChjb25zdCBjaGFyICpzY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgKmFkZHJlc3MsCisJCQkJCSAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcik7CisKK2RidXNfYm9vbF90IF9kYnVzX2xvb2t1cF9zZXNzaW9uX2FkZHJlc3MgKGRidXNfYm9vbF90ICpzdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICplcnJvcik7CisKKy8qKiBUeXBlIHJlcHJlc2VudGluZyBhIHVuaXZlcnNhbGx5IHVuaXF1ZSBJRAorICogQHRvZG8gcmVuYW1lIHRvIFVVSUQgaW5zdGVhZCBvZiBHVUlECisgKi8KK3R5cGVkZWYgdW5pb24gREJ1c0dVSUQgREJ1c0dVSUQ7CisKK2RidXNfYm9vbF90IF9kYnVzX3JlYWRfbG9jYWxfbWFjaGluZV91dWlkICAgKERCdXNHVUlEICAgICAgICAgKm1hY2hpbmVfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBjcmVhdGVfaWZfbm90X2ZvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworCisvKioKKyAqIEluaXRpYWxpemUgdGhyZWFkcyBhcyBpbiBkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0KCksIGFwcHJvcHJpYXRlbHkKKyAqIGZvciB0aGUgcGxhdGZvcm0uCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90IF9kYnVzX3RocmVhZHNfaW5pdF9wbGF0Zm9ybV9zcGVjaWZpYyAodm9pZCk7CisKK2RidXNfYm9vbF90IF9kYnVzX3NwbGl0X3BhdGhzX2FuZF9hcHBlbmQgKERCdXNTdHJpbmcgKmRpcnMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3VmZml4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICoqZGlyX2xpc3QpOworCit1bnNpZ25lZCBsb25nIF9kYnVzX3BpZF9mb3JfbG9nICh2b2lkKTsKKworLyogRklYTUUgbW92ZSBiYWNrIHRvIGRidXMtc3lzZGVwcy11bml4LmggcHJvYmFibHkgLQorICogdGhlIFBJRCBmaWxlIGhhbmRsaW5nIGp1c3QgbmVlZHMgYSBsaXR0bGUgbW9yZSBhYnN0cmFjdGlvbgorICogaW4gdGhlIGJ1cyBkYWVtb24gZmlyc3QuCisgKi8KK2RidXNfcGlkX3QgICAgX2RidXNfZ2V0cGlkICh2b2lkKTsKKworZGJ1c19ib29sX3QgX2RidXNfY2hhbmdlX3RvX2RhZW1vbl91c2VyIChjb25zdCBjaGFyICp1c2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcik7CisKK3ZvaWQgX2RidXNfZmx1c2hfY2FjaGVzICh2b2lkKTsKKwordm9pZCBfZGJ1c19yZXF1ZXN0X2ZpbGVfZGVzY3JpcHRvcl9saW1pdCAodW5zaWduZWQgaW50IGxpbWl0KTsKKworLyoKKyAqIHJlcGxhY2VzIHRoZSB0ZXJtIERCVVNfUFJFRklYIGluIGNvbmZpZ3VyZV90aW1lX3BhdGggYnkgdGhlCisgKiBjdXJyZW50IGRidXMgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4gT24gdW5peCB0aGlzIGZ1bmN0aW9uIGlzIGEgbm9vcAorICoKKyAqIEBwYXJhbSBjb25maWd1cmVfdGltZV9wYXRoCisgKiBAcmV0dXJuIHJlYWwgcGF0aAorICovCitjb25zdCBjaGFyICoKK19kYnVzX3JlcGxhY2VfaW5zdGFsbF9wcmVmaXggKGNvbnN0IGNoYXIgKmNvbmZpZ3VyZV90aW1lX3BhdGgpOworCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworCisjaWZkZWYgREJVU19XSU4KKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMtd2luLmgiCisjZW5kaWYKKworI2VuZGlmIC8qIERCVVNfU1lTREVQU19IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy10ZXN0LW1haW4uYyBiL2RidXMvZGJ1cy9kYnVzLXRlc3QtbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZWY3ODIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy10ZXN0LW1haW4uYwpAQCAtMCwwICsxLDU4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdGVzdC5jICBQcm9ncmFtIHRvIHJ1biBhbGwgdGVzdHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXR5cGVzLmgiCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZiBIQVZFX0xPQ0FMRV9ICisjaW5jbHVkZSA8bG9jYWxlLmg+CisjZW5kaWYKKworaW50CittYWluIChpbnQgICAgYXJnYywKKyAgICAgIGNoYXIgKiphcmd2KQoreworICBjb25zdCBjaGFyICp0ZXN0X2RhdGFfZGlyOworICBjb25zdCBjaGFyICpzcGVjaWZpY190ZXN0OworCisjaWYgSEFWRV9TRVRMT0NBTEUKKyAgc2V0bG9jYWxlKExDX0FMTCwgIiIpOworI2VuZGlmCisgIAorICBpZiAoYXJnYyA+IDEpCisgICAgdGVzdF9kYXRhX2RpciA9IGFyZ3ZbMV07CisgIGVsc2UKKyAgICB0ZXN0X2RhdGFfZGlyID0gTlVMTDsKKworICBpZiAoYXJnYyA+IDIpCisgICAgc3BlY2lmaWNfdGVzdCA9IGFyZ3ZbMl07CisgIGVsc2UKKyAgICBzcGVjaWZpY190ZXN0ID0gTlVMTDsKKyAgCisgIGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9ydW5fdGVzdHMgKHRlc3RfZGF0YV9kaXIsIHNwZWNpZmljX3Rlc3QpOworICAKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy10ZXN0LmMgYi9kYnVzL2RidXMvZGJ1cy10ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI0YTZjOAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXRlc3QuYwpAQCAtMCwwICsxLDE3MiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXRlc3QuYyAgUHJvZ3JhbSB0byBydW4gYWxsIHRlc3RzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1ICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKmZhaWx1cmUpCit7CisgIGZwcmludGYgKHN0ZGVyciwgIlVuaXQgdGVzdCBmYWlsZWQ6ICVzXG4iLCBmYWlsdXJlKTsKKyAgZXhpdCAoMSk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19tZW1sZWFrcyAodm9pZCkKK3sKKyAgZGJ1c19zaHV0ZG93biAoKTsKKworICBwcmludGYgKCIlczogY2hlY2tpbmcgZm9yIG1lbWxlYWtzXG4iLCAiZGJ1cy10ZXN0Iik7CisgIGlmIChfZGJ1c19nZXRfbWFsbG9jX2Jsb2Nrc19vdXRzdGFuZGluZyAoKSAhPSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCIlZCBkYnVzX21hbGxvYyBibG9ja3Mgd2VyZSBub3QgZnJlZWRcbiIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19nZXRfbWFsbG9jX2Jsb2Nrc19vdXRzdGFuZGluZyAoKSk7CisgICAgICBkaWUgKCJtZW1sZWFrcyIpOworICAgIH0KK30KKwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKlRlc3RGdW5jKSh2b2lkKTsKK3R5cGVkZWYgZGJ1c19ib29sX3QgKCpUZXN0RGF0YUZ1bmMpKGNvbnN0IGNoYXIgKmRhdGEpOworCitzdGF0aWMgdm9pZAorcnVuX3Rlc3QgKGNvbnN0IGNoYXIgICAgICAgICAgICAgKnRlc3RfbmFtZSwKKwkgIGNvbnN0IGNoYXIgICAgICAgICAgICAgKnNwZWNpZmljX3Rlc3QsCisJICBUZXN0RnVuYyAgICAgICAgICAgICAgICB0ZXN0KQoreworICBpZiAoIXNwZWNpZmljX3Rlc3QgfHwgc3RyY21wIChzcGVjaWZpY190ZXN0LCB0ZXN0X25hbWUpID09IDApCisgICAgeworICAgICAgcHJpbnRmICgiJXM6IHJ1bm5pbmcgJXMgdGVzdHNcbiIsICJkYnVzLXRlc3QiLCB0ZXN0X25hbWUpOworICAgICAgaWYgKCF0ZXN0ICgpKQorCWRpZSAodGVzdF9uYW1lKTsKKworICAgICAgY2hlY2tfbWVtbGVha3MgKCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcnVuX2RhdGFfdGVzdCAoY29uc3QgY2hhciAgICAgICAgICAgICAqdGVzdF9uYW1lLAorCSAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICpzcGVjaWZpY190ZXN0LAorCSAgICAgICBUZXN0RGF0YUZ1bmMgICAgICAgICAgICB0ZXN0LAorCSAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICp0ZXN0X2RhdGFfZGlyKQoreworICBpZiAoIXNwZWNpZmljX3Rlc3QgfHwgc3RyY21wIChzcGVjaWZpY190ZXN0LCB0ZXN0X25hbWUpID09IDApCisgICAgeworICAgICAgcHJpbnRmICgiJXM6IHJ1bm5pbmcgJXMgdGVzdHNcbiIsICJkYnVzLXRlc3QiLCB0ZXN0X25hbWUpOworICAgICAgaWYgKCF0ZXN0ICh0ZXN0X2RhdGFfZGlyKSkKKwlkaWUgKHRlc3RfbmFtZSk7CisKKyAgICAgIGNoZWNrX21lbWxlYWtzICgpOworICAgIH0KK30KKworI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KKworLyoqCisgKiBBbiBleHBvcnRlZCBzeW1ib2wgdG8gYmUgcnVuIGluIG9yZGVyIHRvIGV4ZWN1dGUKKyAqIHVuaXQgdGVzdHMuIFNob3VsZCBub3QgYmUgdXNlZCBieQorICogYW55IGFwcCBvdGhlciB0aGFuIG91ciB0ZXN0IGFwcCwgdGhpcyBzeW1ib2wKKyAqIHdvbid0IGV4aXN0IGluIHNvbWUgYnVpbGRzIG9mIHRoZSBsaWJyYXJ5LgorICogKHdpdGggLS1lbmFibGUtdGVzdHM9bm8pCisgKgorICogQHBhcmFtIHRlc3RfZGF0YV9kaXIgdGhlIGRpcmVjdG9yeSB3aXRoIHRlc3QgZGF0YSAodGVzdC9kYXRhIG5vcm1hbGx5KQorICovCit2b2lkCitkYnVzX2ludGVybmFsX2RvX25vdF91c2VfcnVuX3Rlc3RzIChjb25zdCBjaGFyICp0ZXN0X2RhdGFfZGlyLCBjb25zdCBjaGFyICpzcGVjaWZpY190ZXN0KQoreworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgaWYgKCFfZGJ1c190aHJlYWRzX2luaXRfZGVidWcgKCkpCisgICAgZGllICgiZGVidWcgdGhyZWFkcyBpbml0Iik7CisgIAorICBpZiAodGVzdF9kYXRhX2RpciA9PSBOVUxMKQorICAgIHRlc3RfZGF0YV9kaXIgPSBfZGJ1c19nZXRlbnYgKCJEQlVTX1RFU1RfREFUQSIpOworCisgIGlmICh0ZXN0X2RhdGFfZGlyICE9IE5VTEwpCisgICAgcHJpbnRmICgiVGVzdCBkYXRhIGluICVzXG4iLCB0ZXN0X2RhdGFfZGlyKTsKKyAgZWxzZQorICAgIHByaW50ZiAoIk5vIHRlc3QgZGF0YSFcbiIpOworCisgIHJ1bl90ZXN0ICgic3RyaW5nIiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfc3RyaW5nX3Rlc3QpOworICAKKyAgcnVuX3Rlc3QgKCJzeXNkZXBzIiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfc3lzZGVwc190ZXN0KTsKKyAgCisgIHJ1bl90ZXN0ICgiZGF0YS1zbG90Iiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfZGF0YV9zbG90X3Rlc3QpOworCisgIHJ1bl90ZXN0ICgibWlzYyIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX21pc2NfdGVzdCk7CisgIAorICBydW5fdGVzdCAoImFkZHJlc3MiLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19hZGRyZXNzX3Rlc3QpOworCisgIHJ1bl90ZXN0ICgic2VydmVyIiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfc2VydmVyX3Rlc3QpOworCisgIHJ1bl90ZXN0ICgib2JqZWN0LXRyZWUiLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19vYmplY3RfdHJlZV90ZXN0KTsKKworICBydW5fdGVzdCAoInNpZ25hdHVyZSIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX3NpZ25hdHVyZV90ZXN0KTsKKyAgCisgIHJ1bl90ZXN0ICgibWFyc2hhbGxpbmciLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19tYXJzaGFsX3Rlc3QpOworCisgIHJ1bl90ZXN0ICgibWFyc2hhbC1yZWN1cnNpdmUiLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19tYXJzaGFsX3JlY3Vyc2l2ZV90ZXN0KTsKKworICBydW5fdGVzdCAoImJ5dGVzd2FwIiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfbWFyc2hhbF9ieXRlc3dhcF90ZXN0KTsKKyAgCisgIHJ1bl90ZXN0ICgibWVtb3J5Iiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfbWVtb3J5X3Rlc3QpOworCisjaWYgMQorICBydW5fdGVzdCAoIm1lbS1wb29sIiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfbWVtX3Bvb2xfdGVzdCk7CisjZW5kaWYKKyAgCisgIHJ1bl90ZXN0ICgibGlzdCIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX2xpc3RfdGVzdCk7CisKKyAgcnVuX3Rlc3QgKCJtYXJzaGFsLXZhbGlkYXRlIiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfbWFyc2hhbF92YWxpZGF0ZV90ZXN0KTsKKworICBydW5fZGF0YV90ZXN0ICgibWVzc2FnZSIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX21lc3NhZ2VfdGVzdCwgdGVzdF9kYXRhX2Rpcik7CisgIAorICBydW5fdGVzdCAoImhhc2giLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19oYXNoX3Rlc3QpOworCisjaWYgIWRlZmluZWQoREJVU19XSU5DRSkKKyAgcnVuX2RhdGFfdGVzdCAoInNwYXduIiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfc3Bhd25fdGVzdCwgdGVzdF9kYXRhX2Rpcik7CisjZW5kaWYKKyAgCisgIHJ1bl9kYXRhX3Rlc3QgKCJjcmVkZW50aWFscyIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX2NyZWRlbnRpYWxzX3Rlc3QsIHRlc3RfZGF0YV9kaXIpOworCisjaWZkZWYgREJVU19VTklYCisgIHJ1bl9kYXRhX3Rlc3QgKCJ1c2VyZGIiLCBzcGVjaWZpY190ZXN0LCBfZGJ1c191c2VyZGJfdGVzdCwgdGVzdF9kYXRhX2Rpcik7CisKKyAgcnVuX3Rlc3QgKCJ0cmFuc3BvcnQtdW5peCIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX3RyYW5zcG9ydF91bml4X3Rlc3QpOworI2VuZGlmCisgIAorICBydW5fdGVzdCAoImtleXJpbmciLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19rZXlyaW5nX3Rlc3QpOworCisgIHJ1bl9kYXRhX3Rlc3QgKCJzaGEiLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19zaGFfdGVzdCwgdGVzdF9kYXRhX2Rpcik7CisgIAorICBydW5fZGF0YV90ZXN0ICgiYXV0aCIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX2F1dGhfdGVzdCwgdGVzdF9kYXRhX2Rpcik7CisKKyAgcHJpbnRmICgiJXM6IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcbiIsICJkYnVzLXRlc3QiKTsKKyNlbHNlCisgIHByaW50ZiAoIk5vdCBjb21waWxlZCB3aXRoIHVuaXQgdGVzdHMsIG5vdCBydW5uaW5nIGFueVxuIik7CisjZW5kaWYKK30KKwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtdGVzdC5oIGIvZGJ1cy9kYnVzL2RidXMtdGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNTQzODgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy10ZXN0LmgKQEAgLTAsMCArMSw4MCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXRlc3QuaCAgRGVjbGFyYXRpb25zIG9mIHRlc3QgZnVuY3Rpb25zLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19URVNUX0gKKyNkZWZpbmUgREJVU19URVNUX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5oPgorCitkYnVzX2Jvb2xfdCBfZGJ1c19oYXNoX3Rlc3QgICAgICAgICAgICAgICh2b2lkKTsKK2RidXNfYm9vbF90IF9kYnVzX2xpc3RfdGVzdCAgICAgICAgICAgICAgKHZvaWQpOworZGJ1c19ib29sX3QgX2RidXNfbWFyc2hhbF90ZXN0ICAgICAgICAgICAodm9pZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19tYXJzaGFsX3JlY3Vyc2l2ZV90ZXN0ICh2b2lkKTsKK2RidXNfYm9vbF90IF9kYnVzX21hcnNoYWxfYnl0ZXN3YXBfdGVzdCAgKHZvaWQpOworZGJ1c19ib29sX3QgX2RidXNfbWFyc2hhbF92YWxpZGF0ZV90ZXN0ICAodm9pZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19taXNjX3Rlc3QgICAgICAgICAgICAgICh2b2lkKTsKK2RidXNfYm9vbF90IF9kYnVzX3NpZ25hdHVyZV90ZXN0ICAgICAgICAgKHZvaWQpOworZGJ1c19ib29sX3QgX2RidXNfbWVtX3Bvb2xfdGVzdCAgICAgICAgICAodm9pZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19zdHJpbmdfdGVzdCAgICAgICAgICAgICh2b2lkKTsKK2RidXNfYm9vbF90IF9kYnVzX2FkZHJlc3NfdGVzdCAgICAgICAgICAgKHZvaWQpOworZGJ1c19ib29sX3QgX2RidXNfc2VydmVyX3Rlc3QgICAgICAgICAgICAodm9pZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19tZXNzYWdlX3Rlc3QgICAgICAgICAgIChjb25zdCBjaGFyICp0ZXN0X2RhdGFfZGlyKTsKK2RidXNfYm9vbF90IF9kYnVzX2F1dGhfdGVzdCAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKnRlc3RfZGF0YV9kaXIpOworZGJ1c19ib29sX3QgX2RidXNfc2hhX3Rlc3QgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqdGVzdF9kYXRhX2Rpcik7CitkYnVzX2Jvb2xfdCBfZGJ1c19rZXlyaW5nX3Rlc3QgICAgICAgICAgICh2b2lkKTsKK2RidXNfYm9vbF90IF9kYnVzX2RhdGFfc2xvdF90ZXN0ICAgICAgICAgKHZvaWQpOworZGJ1c19ib29sX3QgX2RidXNfc3lzZGVwc190ZXN0ICAgICAgICAgICAodm9pZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19zcGF3bl90ZXN0ICAgICAgICAgICAgIChjb25zdCBjaGFyICp0ZXN0X2RhdGFfZGlyKTsKK2RidXNfYm9vbF90IF9kYnVzX3VzZXJkYl90ZXN0ICAgICAgICAgICAgKGNvbnN0IGNoYXIgKnRlc3RfZGF0YV9kaXIpOworZGJ1c19ib29sX3QgX2RidXNfdHJhbnNwb3J0X3VuaXhfdGVzdCAgICAodm9pZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19tZW1vcnlfdGVzdCAgICAgICAgICAgICh2b2lkKTsKK2RidXNfYm9vbF90IF9kYnVzX29iamVjdF90cmVlX3Rlc3QgICAgICAgKHZvaWQpOworZGJ1c19ib29sX3QgX2RidXNfY3JlZGVudGlhbHNfdGVzdCAgICAgICAoY29uc3QgY2hhciAqdGVzdF9kYXRhX2Rpcik7CisKK3ZvaWQgICAgICAgIGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9ydW5fdGVzdHMgICAgICAgICAoY29uc3QgY2hhciAgICAgICAgICAqdGVzdF9kYXRhX2RpciwKKwkJCQkJCQljb25zdCBjaGFyICAgICAgICAgICpzcGVjaWZpY190ZXN0KTsKK2RidXNfYm9vbF90IGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV90cnlfbWVzc2FnZV9maWxlICAoY29uc3QgREJ1c1N0cmluZyAgICAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICAgIGV4cGVjdGVkX3ZhbGlkaXR5KTsKK2RidXNfYm9vbF90IGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV90cnlfbWVzc2FnZV9kYXRhICAoY29uc3QgREJ1c1N0cmluZyAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICAgICAgICAgZXhwZWN0ZWRfdmFsaWRpdHkpOworZGJ1c19ib29sX3QgZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX2xvYWRfbWVzc2FnZV9maWxlIChjb25zdCBEQnVzU3RyaW5nICAgICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAqZGF0YSk7CisKKworLyogcmV0dXJucyBGQUxTRSBvbiBmYXRhbCBmYWlsdXJlICovCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNGb3JlYWNoTWVzc2FnZUZpbGVGdW5jKSAoY29uc3QgREJ1c1N0cmluZyAgICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgIGV4cGVjdGVkX3ZhbGlkaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAqZGF0YSk7CisKK2RidXNfYm9vbF90IGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9mb3JlYWNoX21lc3NhZ2VfZmlsZSAoY29uc3QgY2hhciAgICAgICAgICAgICAgICAgKnRlc3RfZGF0YV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGb3JlYWNoTWVzc2FnZUZpbGVGdW5jICBmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhKTsKK2RidXNfYm9vbF90IGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9nZW5lcmF0ZV9ib2RpZXMgICAgKGludCAgICAgICAgICAgc2VxdWVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgKnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAqYm9keSk7CisKKworI2VuZGlmIC8qIERCVVNfVEVTVF9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy10aHJlYWRzLWludGVybmFsLmggYi9kYnVzL2RidXMvZGJ1cy10aHJlYWRzLWludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRlOGJhYwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXRocmVhZHMtaW50ZXJuYWwuaApAQCAtMCwwICsxLDk1IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdGhyZWFkcy1pbnRlcm5hbC5oICBELUJ1cyB0aHJlYWQgcHJpbWl0aXZlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNSBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZm5kZWYgREJVU19USFJFQURTX0lOVEVSTkFMX0gKKyNkZWZpbmUgREJVU19USFJFQURTX0lOVEVSTkFMX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWNyb3MuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdGhyZWFkcy5oPgorCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNUaHJlYWRzSW50ZXJuYWxzCisgKiBAeworICovCisKKy8qKgorICogQSBtdXRleCB3aGljaCBpcyByZWN1cnNpdmUgaWYgcG9zc2libGUsIGVsc2Ugbm9uLXJlY3Vyc2l2ZS4KKyAqIFRoaXMgaXMgdHlwaWNhbGx5IHJlY3Vyc2l2ZSwgYnV0IHRoYXQgY2Fubm90IGJlIHJlbGllZCB1cG9uLgorICovCit0eXBlZGVmIHN0cnVjdCBEQnVzUk11dGV4IERCdXNSTXV0ZXg7CisKKy8qKgorICogQSBtdXRleCBzdWl0YWJsZSBmb3IgdXNlIHdpdGggY29uZGl0aW9uIHZhcmlhYmxlcy4KKyAqIFRoaXMgaXMgdHlwaWNhbGx5IG5vbi1yZWN1cnNpdmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNDTXV0ZXggREJ1c0NNdXRleDsKKworLyoqIEB9ICovCisKK0RCVVNfQkVHSU5fREVDTFMKKwordm9pZCAgICAgICAgIF9kYnVzX3JtdXRleF9sb2NrICAgICAgICAgICAgICAgKERCdXNSTXV0ZXggICAgICAgKm11dGV4KTsKK3ZvaWQgICAgICAgICBfZGJ1c19ybXV0ZXhfdW5sb2NrICAgICAgICAgICAgIChEQnVzUk11dGV4ICAgICAgICptdXRleCk7Cit2b2lkICAgICAgICAgX2RidXNfcm11dGV4X25ld19hdF9sb2NhdGlvbiAgICAoREJ1c1JNdXRleCAgICAgICoqbG9jYXRpb25fcCk7Cit2b2lkICAgICAgICAgX2RidXNfcm11dGV4X2ZyZWVfYXRfbG9jYXRpb24gICAoREJ1c1JNdXRleCAgICAgICoqbG9jYXRpb25fcCk7CisKK3ZvaWQgICAgICAgICBfZGJ1c19jbXV0ZXhfbG9jayAgICAgICAgICAgICAgIChEQnVzQ011dGV4ICAgICAgICptdXRleCk7Cit2b2lkICAgICAgICAgX2RidXNfY211dGV4X3VubG9jayAgICAgICAgICAgICAoREJ1c0NNdXRleCAgICAgICAqbXV0ZXgpOwordm9pZCAgICAgICAgIF9kYnVzX2NtdXRleF9uZXdfYXRfbG9jYXRpb24gICAgKERCdXNDTXV0ZXggICAgICAqKmxvY2F0aW9uX3ApOwordm9pZCAgICAgICAgIF9kYnVzX2NtdXRleF9mcmVlX2F0X2xvY2F0aW9uICAgKERCdXNDTXV0ZXggICAgICAqKmxvY2F0aW9uX3ApOworCitEQnVzQ29uZFZhciogX2RidXNfY29uZHZhcl9uZXcgICAgICAgICAgICAgICAodm9pZCk7Cit2b2lkICAgICAgICAgX2RidXNfY29uZHZhcl9mcmVlICAgICAgICAgICAgICAoREJ1c0NvbmRWYXIgICAgICAgKmNvbmQpOwordm9pZCAgICAgICAgIF9kYnVzX2NvbmR2YXJfd2FpdCAgICAgICAgICAgICAgKERCdXNDb25kVmFyICAgICAgICpjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDTXV0ZXggICAgICAgICptdXRleCk7CitkYnVzX2Jvb2xfdCAgX2RidXNfY29uZHZhcl93YWl0X3RpbWVvdXQgICAgICAoREJ1c0NvbmRWYXIgICAgICAgKmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NNdXRleCAgICAgICAgKm11dGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcyk7Cit2b2lkICAgICAgICAgX2RidXNfY29uZHZhcl93YWtlX29uZSAgICAgICAgICAoREJ1c0NvbmRWYXIgICAgICAgKmNvbmQpOwordm9pZCAgICAgICAgIF9kYnVzX2NvbmR2YXJfbmV3X2F0X2xvY2F0aW9uICAgKERCdXNDb25kVmFyICAgICAgKipsb2NhdGlvbl9wKTsKK3ZvaWQgICAgICAgICBfZGJ1c19jb25kdmFyX2ZyZWVfYXRfbG9jYXRpb24gIChEQnVzQ29uZFZhciAgICAgICoqbG9jYXRpb25fcCk7CisKKy8qIFByaXZhdGUgdG8gdGhyZWFkaW5nIGltcGxlbWVudGF0aW9ucyBhbmQgZGJ1cy10aHJlYWRzLmMgKi8KKworREJ1c1JNdXRleCAgKl9kYnVzX3BsYXRmb3JtX3JtdXRleF9uZXcgICAgICAgKHZvaWQpOwordm9pZCAgICAgICAgIF9kYnVzX3BsYXRmb3JtX3JtdXRleF9mcmVlICAgICAgKERCdXNSTXV0ZXggICAgICAgKm11dGV4KTsKK3ZvaWQgICAgICAgICBfZGJ1c19wbGF0Zm9ybV9ybXV0ZXhfbG9jayAgICAgIChEQnVzUk11dGV4ICAgICAgICptdXRleCk7Cit2b2lkICAgICAgICAgX2RidXNfcGxhdGZvcm1fcm11dGV4X3VubG9jayAgICAoREJ1c1JNdXRleCAgICAgICAqbXV0ZXgpOworCitEQnVzQ011dGV4ICAqX2RidXNfcGxhdGZvcm1fY211dGV4X25ldyAgICAgICAodm9pZCk7Cit2b2lkICAgICAgICAgX2RidXNfcGxhdGZvcm1fY211dGV4X2ZyZWUgICAgICAoREJ1c0NNdXRleCAgICAgICAqbXV0ZXgpOwordm9pZCAgICAgICAgIF9kYnVzX3BsYXRmb3JtX2NtdXRleF9sb2NrICAgICAgKERCdXNDTXV0ZXggICAgICAgKm11dGV4KTsKK3ZvaWQgICAgICAgICBfZGJ1c19wbGF0Zm9ybV9jbXV0ZXhfdW5sb2NrICAgIChEQnVzQ011dGV4ICAgICAgICptdXRleCk7CisKK0RCdXNDb25kVmFyKiBfZGJ1c19wbGF0Zm9ybV9jb25kdmFyX25ldyAgICAgICh2b2lkKTsKK3ZvaWQgICAgICAgICBfZGJ1c19wbGF0Zm9ybV9jb25kdmFyX2ZyZWUgICAgIChEQnVzQ29uZFZhciAgICAgICAqY29uZCk7Cit2b2lkICAgICAgICAgX2RidXNfcGxhdGZvcm1fY29uZHZhcl93YWl0ICAgICAoREJ1c0NvbmRWYXIgICAgICAgKmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NNdXRleCAgICAgICAgKm11dGV4KTsKK2RidXNfYm9vbF90ICBfZGJ1c19wbGF0Zm9ybV9jb25kdmFyX3dhaXRfdGltZW91dCAoREJ1c0NvbmRWYXIgICAqY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ011dGV4ICAgICAgICAqbXV0ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKK3ZvaWQgICAgICAgICBfZGJ1c19wbGF0Zm9ybV9jb25kdmFyX3dha2Vfb25lIChEQnVzQ29uZFZhciAgICAgICAqY29uZCk7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1RIUkVBRFNfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtdGhyZWFkcy5jIGIvZGJ1cy9kYnVzL2RidXMtdGhyZWFkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMTE2OWQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy10aHJlYWRzLmMKQEAgLTAsMCArMSw2MzMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy10aHJlYWRzLmggIEQtQnVzIHRocmVhZHMgaGFuZGxpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDYgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy10aHJlYWRzLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXRocmVhZHMtaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkYnVzLWxpc3QuaCIKKworc3RhdGljIGludCB0aHJlYWRfaW5pdF9nZW5lcmF0aW9uID0gMDsKKyAKK3N0YXRpYyBEQnVzTGlzdCAqdW5pbml0aWFsaXplZF9ybXV0ZXhfbGlzdCA9IE5VTEw7CitzdGF0aWMgREJ1c0xpc3QgKnVuaW5pdGlhbGl6ZWRfY211dGV4X2xpc3QgPSBOVUxMOworc3RhdGljIERCdXNMaXN0ICp1bmluaXRpYWxpemVkX2NvbmR2YXJfbGlzdCA9IE5VTEw7CisKKy8qKiBUaGlzIGlzIHVzZWQgZm9yIHRoZSBuby1vcCBkZWZhdWx0IG11dGV4IHBvaW50ZXIsIGp1c3QgdG8gYmUgZGlzdGluY3QgZnJvbSAjTlVMTCAqLworI2RlZmluZSBfREJVU19EVU1NWV9NVVRFWCAoKERCdXNNdXRleCopMHhBQkNERUYpCisjZGVmaW5lIF9EQlVTX0RVTU1ZX1JNVVRFWCAoKERCdXNSTXV0ZXggKikgX0RCVVNfRFVNTVlfTVVURVgpCisjZGVmaW5lIF9EQlVTX0RVTU1ZX0NNVVRFWCAoKERCdXNDTXV0ZXggKikgX0RCVVNfRFVNTVlfTVVURVgpCisKKy8qKiBUaGlzIGlzIHVzZWQgZm9yIHRoZSBuby1vcCBkZWZhdWx0IG11dGV4IHBvaW50ZXIsIGp1c3QgdG8gYmUgZGlzdGluY3QgZnJvbSAjTlVMTCAqLworI2RlZmluZSBfREJVU19EVU1NWV9DT05EVkFSICgoREJ1c0NvbmRWYXIqKTB4QUJDREVGMikKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1RocmVhZHNJbnRlcm5hbHMgVGhyZWFkIGZ1bmN0aW9ucworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBfZGJ1c19ybXV0ZXhfbG9jaygpLCBldGMuCisgKgorICogRnVuY3Rpb25zIGFuZCBtYWNyb3MgcmVsYXRlZCB0byB0aHJlYWRzIGFuZCB0aHJlYWQgbG9ja3MuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgbXV0ZXgKKyAqIG9yIGNyZWF0ZXMgYSBuby1vcCBtdXRleCBpZiB0aHJlYWRzIGFyZSBub3QgaW5pdGlhbGl6ZWQuCisgKiBNYXkgcmV0dXJuICNOVUxMIGV2ZW4gaWYgdGhyZWFkcyBhcmUgaW5pdGlhbGl6ZWQsIGluZGljYXRpbmcKKyAqIG91dC1vZi1tZW1vcnkuCisgKgorICogSWYgcG9zc2libGUsIHRoZSBtdXRleCByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIGlzIHJlY3Vyc2l2ZSwgdG8KKyAqIGF2b2lkIGRlYWRsb2Nrcy4gSG93ZXZlciwgdGhhdCBjYW5ub3QgYmUgcmVsaWVkIG9uLgorICoKKyAqIFRoZSBleHRyYSBsZXZlbCBvZiBpbmRpcmVjdGlvbiBnaXZlbiBieSBhbGxvY2F0aW5nIGEgcG9pbnRlcgorICogdG8gcG9pbnQgdG8gdGhlIG11dGV4IGxvY2F0aW9uIGFsbG93cyB0aGUgdGhyZWFkaW5nCisgKiBtb2R1bGUgdG8gc3dhcCBvdXQgZHVtbXkgbXV0ZXhlcyBmb3IgYSByZWFsIG11dGV4IHNvIGxpYnJhcmllcworICogY2FuIGluaXRpYWxpemUgdGhyZWFkcyBldmVuIGFmdGVyIHRoZSBELUJ1cyBBUEkgaGFzIGJlZW4gdXNlZC4KKyAqCisgKiBAcGFyYW0gbG9jYXRpb25fcCB0aGUgbG9jYXRpb24gb2YgdGhlIG5ldyBtdXRleCwgY2FuIHJldHVybiAjTlVMTCBvbiBPT00KKyAqLwordm9pZAorX2RidXNfcm11dGV4X25ld19hdF9sb2NhdGlvbiAoREJ1c1JNdXRleCAqKmxvY2F0aW9uX3ApCit7CisgIF9kYnVzX2Fzc2VydCAobG9jYXRpb25fcCAhPSBOVUxMKTsKKworICBpZiAodGhyZWFkX2luaXRfZ2VuZXJhdGlvbiA9PSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24pCisgICAgeworICAgICAgKmxvY2F0aW9uX3AgPSBfZGJ1c19wbGF0Zm9ybV9ybXV0ZXhfbmV3ICgpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICpsb2NhdGlvbl9wID0gX0RCVVNfRFVNTVlfUk1VVEVYOworCisgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmdW5pbml0aWFsaXplZF9ybXV0ZXhfbGlzdCwgbG9jYXRpb25fcCkpCisgICAgICAgICpsb2NhdGlvbl9wID0gTlVMTDsKKyAgICB9Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBtdXRleAorICogb3IgY3JlYXRlcyBhIG5vLW9wIG11dGV4IGlmIHRocmVhZHMgYXJlIG5vdCBpbml0aWFsaXplZC4KKyAqIE1heSByZXR1cm4gI05VTEwgZXZlbiBpZiB0aHJlYWRzIGFyZSBpbml0aWFsaXplZCwgaW5kaWNhdGluZworICogb3V0LW9mLW1lbW9yeS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgbXV0ZXggaXMgc3VpdGFibGUgZm9yIHVzZSB3aXRoIGNvbmRpdGlvbiB2YXJpYWJsZXMuCisgKgorICogVGhlIGV4dHJhIGxldmVsIG9mIGluZGlyZWN0aW9uIGdpdmVuIGJ5IGFsbG9jYXRpbmcgYSBwb2ludGVyCisgKiB0byBwb2ludCB0byB0aGUgbXV0ZXggbG9jYXRpb24gYWxsb3dzIHRoZSB0aHJlYWRpbmcKKyAqIG1vZHVsZSB0byBzd2FwIG91dCBkdW1teSBtdXRleGVzIGZvciBhIHJlYWwgbXV0ZXggc28gbGlicmFyaWVzCisgKiBjYW4gaW5pdGlhbGl6ZSB0aHJlYWRzIGV2ZW4gYWZ0ZXIgdGhlIEQtQnVzIEFQSSBoYXMgYmVlbiB1c2VkLgorICoKKyAqIEBwYXJhbSBsb2NhdGlvbl9wIHRoZSBsb2NhdGlvbiBvZiB0aGUgbmV3IG11dGV4LCBjYW4gcmV0dXJuICNOVUxMIG9uIE9PTQorICovCit2b2lkCitfZGJ1c19jbXV0ZXhfbmV3X2F0X2xvY2F0aW9uIChEQnVzQ011dGV4ICoqbG9jYXRpb25fcCkKK3sKKyAgX2RidXNfYXNzZXJ0IChsb2NhdGlvbl9wICE9IE5VTEwpOworCisgIGlmICh0aHJlYWRfaW5pdF9nZW5lcmF0aW9uID09IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbikKKyAgICB7CisgICAgICAqbG9jYXRpb25fcCA9IF9kYnVzX3BsYXRmb3JtX2NtdXRleF9uZXcgKCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgKmxvY2F0aW9uX3AgPSBfREJVU19EVU1NWV9DTVVURVg7CisKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZ1bmluaXRpYWxpemVkX2NtdXRleF9saXN0LCBsb2NhdGlvbl9wKSkKKyAgICAgICAgKmxvY2F0aW9uX3AgPSBOVUxMOworICAgIH0KK30KKworLyoqCisgKiBGcmVlcyBhIERCdXNSTXV0ZXggb3IgcmVtb3ZlcyBpdCBmcm9tIHRoZSB1bmluaXRpYWxpemVkIG11dGV4IGxpc3Q7CisgKiBkb2VzIG5vdGhpbmcgaWYgcGFzc2VkIGEgI05VTEwgcG9pbnRlci4KKyAqLwordm9pZAorX2RidXNfcm11dGV4X2ZyZWVfYXRfbG9jYXRpb24gKERCdXNSTXV0ZXggKipsb2NhdGlvbl9wKQoreworICBpZiAobG9jYXRpb25fcCA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBpZiAodGhyZWFkX2luaXRfZ2VuZXJhdGlvbiA9PSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24pCisgICAgeworICAgICAgaWYgKCpsb2NhdGlvbl9wICE9IE5VTEwpCisgICAgICAgIF9kYnVzX3BsYXRmb3JtX3JtdXRleF9mcmVlICgqbG9jYXRpb25fcCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0ICgqbG9jYXRpb25fcCA9PSBOVUxMIHx8ICpsb2NhdGlvbl9wID09IF9EQlVTX0RVTU1ZX1JNVVRFWCk7CisKKyAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlICgmdW5pbml0aWFsaXplZF9ybXV0ZXhfbGlzdCwgbG9jYXRpb25fcCk7CisgICAgfQorfQorCisvKioKKyAqIEZyZWVzIGEgREJ1c0NNdXRleCBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZQorICogdW5pbml0aWFsaXplZCBtdXRleCBsaXN0OworICogZG9lcyBub3RoaW5nIGlmIHBhc3NlZCBhICNOVUxMIHBvaW50ZXIuCisgKi8KK3ZvaWQKK19kYnVzX2NtdXRleF9mcmVlX2F0X2xvY2F0aW9uIChEQnVzQ011dGV4ICoqbG9jYXRpb25fcCkKK3sKKyAgaWYgKGxvY2F0aW9uX3AgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgaWYgKHRocmVhZF9pbml0X2dlbmVyYXRpb24gPT0gX2RidXNfY3VycmVudF9nZW5lcmF0aW9uKQorICAgIHsKKyAgICAgIGlmICgqbG9jYXRpb25fcCAhPSBOVUxMKQorICAgICAgICBfZGJ1c19wbGF0Zm9ybV9jbXV0ZXhfZnJlZSAoKmxvY2F0aW9uX3ApOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoKmxvY2F0aW9uX3AgPT0gTlVMTCB8fCAqbG9jYXRpb25fcCA9PSBfREJVU19EVU1NWV9DTVVURVgpOworCisgICAgICBfZGJ1c19saXN0X3JlbW92ZSAoJnVuaW5pdGlhbGl6ZWRfY211dGV4X2xpc3QsIGxvY2F0aW9uX3ApOworICAgIH0KK30KKworLyoqCisgKiBMb2NrcyBhIG11dGV4LiBEb2VzIG5vdGhpbmcgaWYgcGFzc2VkIGEgI05VTEwgcG9pbnRlci4KKyAqIExvY2tzIG1heSBiZSByZWN1cnNpdmUgaWYgdGhyZWFkaW5nIGltcGxlbWVudGF0aW9uIGluaXRpYWxpemVkCisgKiByZWN1cnNpdmUgbG9ja3MuCisgKi8KK3ZvaWQKK19kYnVzX3JtdXRleF9sb2NrIChEQnVzUk11dGV4ICptdXRleCkKK3sKKyAgaWYgKG11dGV4ICYmIHRocmVhZF9pbml0X2dlbmVyYXRpb24gPT0gX2RidXNfY3VycmVudF9nZW5lcmF0aW9uKQorICAgIF9kYnVzX3BsYXRmb3JtX3JtdXRleF9sb2NrIChtdXRleCk7Cit9CisKKy8qKgorICogTG9ja3MgYSBtdXRleC4gRG9lcyBub3RoaW5nIGlmIHBhc3NlZCBhICNOVUxMIHBvaW50ZXIuCisgKiBMb2NrcyBtYXkgYmUgcmVjdXJzaXZlIGlmIHRocmVhZGluZyBpbXBsZW1lbnRhdGlvbiBpbml0aWFsaXplZAorICogcmVjdXJzaXZlIGxvY2tzLgorICovCit2b2lkCitfZGJ1c19jbXV0ZXhfbG9jayAoREJ1c0NNdXRleCAqbXV0ZXgpCit7CisgIGlmIChtdXRleCAmJiB0aHJlYWRfaW5pdF9nZW5lcmF0aW9uID09IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbikKKyAgICBfZGJ1c19wbGF0Zm9ybV9jbXV0ZXhfbG9jayAobXV0ZXgpOworfQorCisvKioKKyAqIFVubG9ja3MgYSBtdXRleC4gRG9lcyBub3RoaW5nIGlmIHBhc3NlZCBhICNOVUxMIHBvaW50ZXIuCisgKgorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCit2b2lkCitfZGJ1c19ybXV0ZXhfdW5sb2NrIChEQnVzUk11dGV4ICptdXRleCkKK3sKKyAgaWYgKG11dGV4ICYmIHRocmVhZF9pbml0X2dlbmVyYXRpb24gPT0gX2RidXNfY3VycmVudF9nZW5lcmF0aW9uKQorICAgIF9kYnVzX3BsYXRmb3JtX3JtdXRleF91bmxvY2sgKG11dGV4KTsKK30KKworLyoqCisgKiBVbmxvY2tzIGEgbXV0ZXguIERvZXMgbm90aGluZyBpZiBwYXNzZWQgYSAjTlVMTCBwb2ludGVyLgorICoKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLwordm9pZAorX2RidXNfY211dGV4X3VubG9jayAoREJ1c0NNdXRleCAqbXV0ZXgpCit7CisgIGlmIChtdXRleCAmJiB0aHJlYWRfaW5pdF9nZW5lcmF0aW9uID09IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbikKKyAgICBfZGJ1c19wbGF0Zm9ybV9jbXV0ZXhfdW5sb2NrIChtdXRleCk7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBjb25kaXRpb24gdmFyaWFibGUgdXNpbmcgdGhlIGZ1bmN0aW9uIHN1cHBsaWVkCisgKiB0byBkYnVzX3RocmVhZHNfaW5pdCgpLCBvciBjcmVhdGVzIGEgbm8tb3AgY29uZGl0aW9uIHZhcmlhYmxlCisgKiBpZiB0aHJlYWRzIGFyZSBub3QgaW5pdGlhbGl6ZWQuIE1heSByZXR1cm4gI05VTEwgZXZlbiBpZgorICogdGhyZWFkcyBhcmUgaW5pdGlhbGl6ZWQsIGluZGljYXRpbmcgb3V0LW9mLW1lbW9yeS4KKyAqCisgKiBAcmV0dXJucyBuZXcgbXV0ZXggb3IgI05VTEwKKyAqLworREJ1c0NvbmRWYXIgKgorX2RidXNfY29uZHZhcl9uZXcgKHZvaWQpCit7CisgIGlmICh0aHJlYWRfaW5pdF9nZW5lcmF0aW9uID09IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbikKKyAgICByZXR1cm4gX2RidXNfcGxhdGZvcm1fY29uZHZhcl9uZXcgKCk7CisgIGVsc2UKKyAgICByZXR1cm4gX0RCVVNfRFVNTVlfQ09ORFZBUjsKK30KKworCisvKioKKyAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBfZGJ1c19jb25kdmFyX25ldy4gIEl0IGhvd2V2ZXIKKyAqIGdpdmVzIGFub3RoZXIgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gYnkgYWxsb2NhdGluZyBhIHBvaW50ZXIKKyAqIHRvIHBvaW50IHRvIHRoZSBjb25kdmFyIGxvY2F0aW9uLiAgVGhpcyBhbGxvd3MgdGhlIHRocmVhZGluZworICogbW9kdWxlIHRvIHN3YXAgb3V0IGR1bW15IGNvbmR2YXJzIGZvciBhIHJlYWwgY29uZHZhciBzbyBsaWJyYXJpZXMKKyAqIGNhbiBpbml0aWFsaXplIHRocmVhZHMgZXZlbiBhZnRlciB0aGUgRC1CdXMgQVBJIGhhcyBiZWVuIHVzZWQuCisgKgorICogQHJldHVybnMgdGhlIGxvY2F0aW9uIG9mIGEgbmV3IGNvbmR2YXIgb3IgI05VTEwgb24gT09NCisgKi8KKwordm9pZCAKK19kYnVzX2NvbmR2YXJfbmV3X2F0X2xvY2F0aW9uIChEQnVzQ29uZFZhciAqKmxvY2F0aW9uX3ApCit7CisgIF9kYnVzX2Fzc2VydCAobG9jYXRpb25fcCAhPSBOVUxMKTsKKworICBpZiAodGhyZWFkX2luaXRfZ2VuZXJhdGlvbiA9PSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24pCisgICAgeworICAgICAgKmxvY2F0aW9uX3AgPSBfZGJ1c19jb25kdmFyX25ldygpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICpsb2NhdGlvbl9wID0gX0RCVVNfRFVNTVlfQ09ORFZBUjsKKworICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJnVuaW5pdGlhbGl6ZWRfY29uZHZhcl9saXN0LCBsb2NhdGlvbl9wKSkKKyAgICAgICAgKmxvY2F0aW9uX3AgPSBOVUxMOworICAgIH0KK30KKworCisvKioKKyAqIEZyZWVzIGEgY29uZGl0aW9uYWwgdmFyaWFibGUgY3JlYXRlZCB3aXRoIGRidXNfY29uZHZhcl9uZXcoKTsgZG9lcworICogbm90aGluZyBpZiBwYXNzZWQgYSAjTlVMTCBwb2ludGVyLgorICovCit2b2lkCitfZGJ1c19jb25kdmFyX2ZyZWUgKERCdXNDb25kVmFyICpjb25kKQoreworICBpZiAoY29uZCAmJiB0aHJlYWRfaW5pdF9nZW5lcmF0aW9uID09IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbikKKyAgICBfZGJ1c19wbGF0Zm9ybV9jb25kdmFyX2ZyZWUgKGNvbmQpOworfQorCisvKioKKyAqIEZyZWVzIGEgY29uZGl0aW9uYWwgdmFyaWFibGUgYW5kIHJlbW92ZXMgaXQgZnJvbSB0aGUgCisgKiB1bmluaXRpYWxpemVkX2NvbmR2YXJfbGlzdDsgCisgKiBkb2VzIG5vdGhpbmcgaWYgcGFzc2VkIGEgI05VTEwgcG9pbnRlci4KKyAqLwordm9pZAorX2RidXNfY29uZHZhcl9mcmVlX2F0X2xvY2F0aW9uIChEQnVzQ29uZFZhciAqKmxvY2F0aW9uX3ApCit7CisgIGlmIChsb2NhdGlvbl9wID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGlmICh0aHJlYWRfaW5pdF9nZW5lcmF0aW9uID09IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbikKKyAgICB7CisgICAgICBpZiAoKmxvY2F0aW9uX3AgIT0gTlVMTCkKKyAgICAgICAgX2RidXNfcGxhdGZvcm1fY29uZHZhcl9mcmVlICgqbG9jYXRpb25fcCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0ICgqbG9jYXRpb25fcCA9PSBOVUxMIHx8ICpsb2NhdGlvbl9wID09IF9EQlVTX0RVTU1ZX0NPTkRWQVIpOworCisgICAgICBfZGJ1c19saXN0X3JlbW92ZSAoJnVuaW5pdGlhbGl6ZWRfY29uZHZhcl9saXN0LCBsb2NhdGlvbl9wKTsKKyAgICB9Cit9CisKKy8qKgorICogQXRvbWljYWxseSB1bmxvY2tzIHRoZSBtdXRleCBhbmQgd2FpdHMgZm9yIHRoZSBjb25kaXRpb25zCisgKiB2YXJpYWJsZSB0byBiZSBzaWduYWxsZWQuIExvY2tzIHRoZSBtdXRleCBhZ2FpbiBiZWZvcmUKKyAqIHJldHVybmluZy4KKyAqIERvZXMgbm90aGluZyBpZiBwYXNzZWQgYSAjTlVMTCBwb2ludGVyLgorICovCit2b2lkCitfZGJ1c19jb25kdmFyX3dhaXQgKERCdXNDb25kVmFyICpjb25kLAorICAgICAgICAgICAgICAgICAgICBEQnVzQ011dGV4ICAqbXV0ZXgpCit7CisgIGlmIChjb25kICYmIG11dGV4ICYmIHRocmVhZF9pbml0X2dlbmVyYXRpb24gPT0gX2RidXNfY3VycmVudF9nZW5lcmF0aW9uKQorICAgIF9kYnVzX3BsYXRmb3JtX2NvbmR2YXJfd2FpdCAoY29uZCwgbXV0ZXgpOworfQorCisvKioKKyAqIEF0b21pY2FsbHkgdW5sb2NrcyB0aGUgbXV0ZXggYW5kIHdhaXRzIGZvciB0aGUgY29uZGl0aW9ucyB2YXJpYWJsZQorICogdG8gYmUgc2lnbmFsbGVkLCBvciBmb3IgYSB0aW1lb3V0LiBMb2NrcyB0aGUgbXV0ZXggYWdhaW4gYmVmb3JlCisgKiByZXR1cm5pbmcuICBEb2VzIG5vdGhpbmcgaWYgcGFzc2VkIGEgI05VTEwgcG9pbnRlci4gIFJldHVybiB2YWx1ZQorICogaXMgI0ZBTFNFIGlmIHdlIHRpbWVkIG91dCwgI1RSVUUgb3RoZXJ3aXNlLgorICoKKyAqIEBwYXJhbSBjb25kIHRoZSBjb25kaXRpb24gdmFyaWFibGUKKyAqIEBwYXJhbSBtdXRleCB0aGUgbXV0ZXgKKyAqIEBwYXJhbSB0aW1lb3V0X21pbGxpc2Vjb25kcyB0aGUgbWF4aW11bSB0aW1lIHRvIHdhaXQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiB0aGUgdGltZW91dCBvY2N1cnJlZCwgI1RSVUUgaWYgbm90CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jb25kdmFyX3dhaXRfdGltZW91dCAoREJ1c0NvbmRWYXIgICAgICAgICAgICAgICAqY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ011dGV4ICAgICAgICAgICAgICAgICptdXRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcykKK3sKKyAgaWYgKGNvbmQgJiYgbXV0ZXggJiYgdGhyZWFkX2luaXRfZ2VuZXJhdGlvbiA9PSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24pCisgICAgcmV0dXJuIF9kYnVzX3BsYXRmb3JtX2NvbmR2YXJfd2FpdF90aW1lb3V0IChjb25kLCBtdXRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKKyAgZWxzZQorICAgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIElmIHRoZXJlIGFyZSB0aHJlYWRzIHdhaXRpbmcgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSwgd2FrZQorICogdXAgZXhhY3RseSBvbmUuIAorICogRG9lcyBub3RoaW5nIGlmIHBhc3NlZCBhICNOVUxMIHBvaW50ZXIuCisgKi8KK3ZvaWQKK19kYnVzX2NvbmR2YXJfd2FrZV9vbmUgKERCdXNDb25kVmFyICpjb25kKQoreworICBpZiAoY29uZCAmJiB0aHJlYWRfaW5pdF9nZW5lcmF0aW9uID09IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbikKKyAgICBfZGJ1c19wbGF0Zm9ybV9jb25kdmFyX3dha2Vfb25lIChjb25kKTsKK30KKworc3RhdGljIHZvaWQKK3NodXRkb3duX2dsb2JhbF9sb2NrcyAodm9pZCAqZGF0YSkKK3sKKyAgREJ1c1JNdXRleCAqKipsb2NrcyA9IGRhdGE7CisgIGludCBpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IF9EQlVTX05fR0xPQkFMX0xPQ0tTKQorICAgIHsKKyAgICAgIGlmICgqKGxvY2tzW2ldKSAhPSBOVUxMKQorICAgICAgICBfZGJ1c19wbGF0Zm9ybV9ybXV0ZXhfZnJlZSAoKihsb2Nrc1tpXSkpOworCisgICAgICAqKGxvY2tzW2ldKSA9IE5VTEw7CisgICAgICArK2k7CisgICAgfQorICAKKyAgZGJ1c19mcmVlIChsb2Nrcyk7Cit9CisKK3N0YXRpYyB2b2lkCitzaHV0ZG93bl91bmluaXRpYWxpemVkX2xvY2tzICh2b2lkICpkYXRhKQoreworICBfZGJ1c19saXN0X2NsZWFyICgmdW5pbml0aWFsaXplZF9ybXV0ZXhfbGlzdCk7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZ1bmluaXRpYWxpemVkX2NtdXRleF9saXN0KTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJnVuaW5pdGlhbGl6ZWRfY29uZHZhcl9saXN0KTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citpbml0X3VuaW5pdGlhbGl6ZWRfbG9ja3MgKHZvaWQpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIF9kYnVzX2Fzc2VydCAodGhyZWFkX2luaXRfZ2VuZXJhdGlvbiAhPSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24pOworCisgIGxpbmsgPSB1bmluaXRpYWxpemVkX3JtdXRleF9saXN0OworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNSTXV0ZXggKiptcDsKKworICAgICAgbXAgPSBsaW5rLT5kYXRhOworICAgICAgX2RidXNfYXNzZXJ0ICgqbXAgPT0gX0RCVVNfRFVNTVlfUk1VVEVYKTsKKworICAgICAgKm1wID0gX2RidXNfcGxhdGZvcm1fcm11dGV4X25ldyAoKTsKKyAgICAgIGlmICgqbXAgPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsX211dGV4OworCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmdW5pbml0aWFsaXplZF9ybXV0ZXhfbGlzdCwgbGluayk7CisgICAgfQorCisgIGxpbmsgPSB1bmluaXRpYWxpemVkX2NtdXRleF9saXN0OworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNDTXV0ZXggKiptcDsKKworICAgICAgbXAgPSBsaW5rLT5kYXRhOworICAgICAgX2RidXNfYXNzZXJ0ICgqbXAgPT0gX0RCVVNfRFVNTVlfQ01VVEVYKTsKKworICAgICAgKm1wID0gX2RidXNfcGxhdGZvcm1fY211dGV4X25ldyAoKTsKKyAgICAgIGlmICgqbXAgPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsX211dGV4OworCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmdW5pbml0aWFsaXplZF9jbXV0ZXhfbGlzdCwgbGluayk7CisgICAgfQorCisgIGxpbmsgPSB1bmluaXRpYWxpemVkX2NvbmR2YXJfbGlzdDsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzQ29uZFZhciAqKmNwOworCisgICAgICBjcCA9IChEQnVzQ29uZFZhciAqKilsaW5rLT5kYXRhOworICAgICAgX2RidXNfYXNzZXJ0ICgqY3AgPT0gX0RCVVNfRFVNTVlfQ09ORFZBUik7CisKKyAgICAgICpjcCA9IF9kYnVzX3BsYXRmb3JtX2NvbmR2YXJfbmV3ICgpOworICAgICAgaWYgKCpjcCA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWxfY29uZHZhcjsKKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnVuaW5pdGlhbGl6ZWRfY29uZHZhcl9saXN0LCBsaW5rKTsKKyAgICB9CisKKyAgX2RidXNfbGlzdF9jbGVhciAoJnVuaW5pdGlhbGl6ZWRfcm11dGV4X2xpc3QpOworICBfZGJ1c19saXN0X2NsZWFyICgmdW5pbml0aWFsaXplZF9jbXV0ZXhfbGlzdCk7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZ1bmluaXRpYWxpemVkX2NvbmR2YXJfbGlzdCk7CisKKyAgaWYgKCFfZGJ1c19yZWdpc3Rlcl9zaHV0ZG93bl9mdW5jIChzaHV0ZG93bl91bmluaXRpYWxpemVkX2xvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIGdvdG8gZmFpbF9jb25kdmFyOworCisgIHJldHVybiBUUlVFOworCisgZmFpbF9jb25kdmFyOgorICBsaW5rID0gdW5pbml0aWFsaXplZF9jb25kdmFyX2xpc3Q7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0NvbmRWYXIgKipjcDsKKworICAgICAgY3AgPSBsaW5rLT5kYXRhOworCisgICAgICBpZiAoKmNwICE9IF9EQlVTX0RVTU1ZX0NPTkRWQVIgJiYgKmNwICE9IE5VTEwpCisgICAgICAgIF9kYnVzX3BsYXRmb3JtX2NvbmR2YXJfZnJlZSAoKmNwKTsKKworICAgICAgKmNwID0gX0RCVVNfRFVNTVlfQ09ORFZBUjsKKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnVuaW5pdGlhbGl6ZWRfY29uZHZhcl9saXN0LCBsaW5rKTsKKyAgICB9CisKKyBmYWlsX211dGV4OgorICBsaW5rID0gdW5pbml0aWFsaXplZF9ybXV0ZXhfbGlzdDsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzUk11dGV4ICoqbXA7CisKKyAgICAgIG1wID0gbGluay0+ZGF0YTsKKworICAgICAgaWYgKCptcCAhPSBfREJVU19EVU1NWV9STVVURVggJiYgKm1wICE9IE5VTEwpCisgICAgICAgIF9kYnVzX3BsYXRmb3JtX3JtdXRleF9mcmVlICgqbXApOworCisgICAgICAqbXAgPSBfREJVU19EVU1NWV9STVVURVg7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZ1bmluaXRpYWxpemVkX3JtdXRleF9saXN0LCBsaW5rKTsKKyAgICB9CisKKyAgbGluayA9IHVuaW5pdGlhbGl6ZWRfY211dGV4X2xpc3Q7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0NNdXRleCAqKm1wOworCisgICAgICBtcCA9IGxpbmstPmRhdGE7CisKKyAgICAgIGlmICgqbXAgIT0gX0RCVVNfRFVNTVlfQ01VVEVYICYmICptcCAhPSBOVUxMKQorICAgICAgICBfZGJ1c19wbGF0Zm9ybV9jbXV0ZXhfZnJlZSAoKm1wKTsKKworICAgICAgKm1wID0gX0RCVVNfRFVNTVlfQ01VVEVYOworCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmdW5pbml0aWFsaXplZF9jbXV0ZXhfbGlzdCwgbGluayk7CisgICAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citpbml0X2xvY2tzICh2b2lkKQoreworICBpbnQgaTsKKyAgREJ1c1JNdXRleCAqKipkeW5hbWljX2dsb2JhbF9sb2NrczsKKyAgREJ1c1JNdXRleCAqKmdsb2JhbF9sb2Nrc1tdID0geworI2RlZmluZSBMT0NLX0FERFIobmFtZSkgKCYgX2RidXNfbG9ja18jI25hbWUpCisgICAgTE9DS19BRERSICh3aW5fZmRzKSwKKyAgICBMT0NLX0FERFIgKHNpZF9hdG9tX2NhY2hlKSwKKyAgICBMT0NLX0FERFIgKGxpc3QpLAorICAgIExPQ0tfQUREUiAoY29ubmVjdGlvbl9zbG90cyksCisgICAgTE9DS19BRERSIChwZW5kaW5nX2NhbGxfc2xvdHMpLAorICAgIExPQ0tfQUREUiAoc2VydmVyX3Nsb3RzKSwKKyAgICBMT0NLX0FERFIgKG1lc3NhZ2Vfc2xvdHMpLAorI2lmICFEQlVTX1VTRV9TWU5DCisgICAgTE9DS19BRERSIChhdG9taWMpLAorI2VuZGlmCisgICAgTE9DS19BRERSIChidXMpLAorICAgIExPQ0tfQUREUiAoYnVzX2RhdGFzKSwKKyAgICBMT0NLX0FERFIgKHNodXRkb3duX2Z1bmNzKSwKKyAgICBMT0NLX0FERFIgKHN5c3RlbV91c2VycyksCisgICAgTE9DS19BRERSIChtZXNzYWdlX2NhY2hlKSwKKyAgICBMT0NLX0FERFIgKHNoYXJlZF9jb25uZWN0aW9ucyksCisgICAgTE9DS19BRERSIChtYWNoaW5lX3V1aWQpCisjdW5kZWYgTE9DS19BRERSCisgIH07CisKKyAgX2RidXNfYXNzZXJ0IChfREJVU19OX0VMRU1FTlRTIChnbG9iYWxfbG9ja3MpID09CisgICAgICAgICAgICAgICAgX0RCVVNfTl9HTE9CQUxfTE9DS1MpOworCisgIGkgPSAwOworICAKKyAgZHluYW1pY19nbG9iYWxfbG9ja3MgPSBkYnVzX25ldyAoREJ1c1JNdXRleCoqLCBfREJVU19OX0dMT0JBTF9MT0NLUyk7CisgIGlmIChkeW5hbWljX2dsb2JhbF9sb2NrcyA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkOworICAKKyAgd2hpbGUgKGkgPCBfREJVU19OX0VMRU1FTlRTIChnbG9iYWxfbG9ja3MpKQorICAgIHsKKyAgICAgICpnbG9iYWxfbG9ja3NbaV0gPSBfZGJ1c19wbGF0Zm9ybV9ybXV0ZXhfbmV3ICgpOworCisgICAgICBpZiAoKmdsb2JhbF9sb2Nrc1tpXSA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWxlZDsKKworICAgICAgZHluYW1pY19nbG9iYWxfbG9ja3NbaV0gPSBnbG9iYWxfbG9ja3NbaV07CisKKyAgICAgICsraTsKKyAgICB9CisgIAorICBpZiAoIV9kYnVzX3JlZ2lzdGVyX3NodXRkb3duX2Z1bmMgKHNodXRkb3duX2dsb2JhbF9sb2NrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljX2dsb2JhbF9sb2NrcykpCisgICAgZ290byBmYWlsZWQ7CisKKyAgaWYgKCFpbml0X3VuaW5pdGlhbGl6ZWRfbG9ja3MgKCkpCisgICAgZ290byBmYWlsZWQ7CisgIAorICByZXR1cm4gVFJVRTsKKworIGZhaWxlZDoKKyAgZGJ1c19mcmVlIChkeW5hbWljX2dsb2JhbF9sb2Nrcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGZvciAoaSA9IGkgLSAxOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICBfZGJ1c19wbGF0Zm9ybV9ybXV0ZXhfZnJlZSAoKmdsb2JhbF9sb2Nrc1tpXSk7CisgICAgICAqZ2xvYmFsX2xvY2tzW2ldID0gTlVMTDsKKyAgICB9CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqIEB9ICovIC8qIGVuZCBvZiBpbnRlcm5hbHMgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1RocmVhZHMgVGhyZWFkIGZ1bmN0aW9ucworICogQGluZ3JvdXAgIERCdXMKKyAqIEBicmllZiBkYnVzX3RocmVhZHNfaW5pdCgpIGFuZCBkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0KCkKKyAqCisgKiBGdW5jdGlvbnMgYW5kIG1hY3JvcyByZWxhdGVkIHRvIHRocmVhZHMgYW5kIHRocmVhZCBsb2Nrcy4KKyAqCisgKiBJZiB0aHJlYWRzIGFyZSBpbml0aWFsaXplZCwgdGhlIEQtQnVzIGxpYnJhcnkgaGFzIGxvY2tzIG9uIGFsbAorICogZ2xvYmFsIGRhdGEgc3RydWN0dXJlcy4gIEluIGFkZGl0aW9uLCBlYWNoICNEQnVzQ29ubmVjdGlvbiBoYXMgYQorICogbG9jaywgc28gb25seSBvbmUgdGhyZWFkIGF0IGEgdGltZSBjYW4gdG91Y2ggdGhlIGNvbm5lY3Rpb24uICAoU2VlCisgKiBAcmVmIERCdXNDb25uZWN0aW9uIGZvciBtb3JlIG9uIGNvbm5lY3Rpb24gbG9ja2luZy4pCisgKgorICogTW9zdCBvdGhlciBvYmplY3RzLCBob3dldmVyLCBkbyBub3QgaGF2ZSBsb2NrcyAtIHRoZXkgY2FuIG9ubHkgYmUKKyAqIHVzZWQgZnJvbSBhIHNpbmdsZSB0aHJlYWQgYXQgYSB0aW1lLCB1bmxlc3MgeW91IGxvY2sgdGhlbSB5b3Vyc2VsZi4KKyAqIEZvciBleGFtcGxlLCBhICNEQnVzTWVzc2FnZSBjYW4ndCBiZSBtb2RpZmllZCBmcm9tIHR3byB0aHJlYWRzCisgKiBhdCBvbmNlLgorICogCisgKiBAeworICovCisKKy8qKgorICogSW5pdGlhbGl6ZXMgdGhyZWFkcywgbGlrZSBkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0KCkuCisgKiBUaGlzIHZlcnNpb24gcHJldmlvdXNseSBhbGxvd2VkIHVzZXItc3BlY2lmaWVkIHRocmVhZGluZworICogcHJpbWl0aXZlcywgYnV0IHNpbmNlIEQtQnVzIDEuNiBpdCBpZ25vcmVzIHRoZW0gYW5kIGJlaGF2ZXMKKyAqIGV4YWN0bHkgbGlrZSBkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0KCkuCisgKgorICogQHBhcmFtIGZ1bmN0aW9ucyBpZ25vcmVkLCBmb3JtZXJseSBmdW5jdGlvbnMgZm9yIHVzaW5nIHRocmVhZHMKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfdGhyZWFkc19pbml0IChjb25zdCBEQnVzVGhyZWFkRnVuY3Rpb25zICpmdW5jdGlvbnMpCit7CisgIGlmICh0aHJlYWRfaW5pdF9nZW5lcmF0aW9uID09IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbikKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIWluaXRfbG9ja3MgKCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHRocmVhZF9pbml0X2dlbmVyYXRpb24gPSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb247CisgIAorICByZXR1cm4gVFJVRTsKK30KKworCisKKy8qIERlZmF1bHQgdGhyZWFkIGltcGxlbWVuYXRpb24gKi8KKworLyoqCisgKiBJbml0aWFsaXplcyB0aHJlYWRzLiBJZiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBjYWxsZWQsIHRoZSBELUJ1cworICogbGlicmFyeSB3aWxsIG5vdCBsb2NrIGFueSBkYXRhIHN0cnVjdHVyZXMuICBJZiBpdCBpcyBjYWxsZWQsIEQtQnVzCisgKiB3aWxsIGRvIGxvY2tpbmcsIGF0IHNvbWUgY29zdCBpbiBlZmZpY2llbmN5LiBOb3RlIHRoYXQgdGhpcworICogZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgQkVGT1JFIHRoZSBzZWNvbmQgdGhyZWFkIGlzIHN0YXJ0ZWQuCisgKgorICogSXQncyBzYWZlIHRvIGNhbGwgZGJ1c190aHJlYWRzX2luaXRfZGVmYXVsdCgpIGFzIG1hbnkgdGltZXMgYXMgeW91CisgKiB3YW50LCBidXQgb25seSB0aGUgZmlyc3QgdGltZSB3aWxsIGhhdmUgYW4gZWZmZWN0LgorICoKKyAqIGRidXNfc2h1dGRvd24oKSByZXZlcnNlcyB0aGUgZWZmZWN0cyBvZiB0aGlzIGZ1bmN0aW9uIHdoZW4gaXQKKyAqIHJlc2V0cyBhbGwgZ2xvYmFsIHN0YXRlIGluIGxpYmRidXMuCisgKiAKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c190aHJlYWRzX2luaXRfZGVmYXVsdCAodm9pZCkKK3sKKyAgcmV0dXJuIF9kYnVzX3RocmVhZHNfaW5pdF9wbGF0Zm9ybV9zcGVjaWZpYyAoKTsKK30KKworCisvKiogQH0gKi8KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKworZGJ1c19ib29sX3QKK19kYnVzX3RocmVhZHNfaW5pdF9kZWJ1ZyAodm9pZCkKK3sKKyAgcmV0dXJuIF9kYnVzX3RocmVhZHNfaW5pdF9wbGF0Zm9ybV9zcGVjaWZpYygpOworfQorCisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtdGhyZWFkcy5oIGIvZGJ1cy9kYnVzL2RidXMtdGhyZWFkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMjhhMGIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy10aHJlYWRzLmgKQEAgLTAsMCArMSwxODkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy10aHJlYWRzLmggIEQtQnVzIHRocmVhZHMgaGFuZGxpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmICFkZWZpbmVkIChEQlVTX0lOU0lERV9EQlVTX0gpICYmICFkZWZpbmVkIChEQlVTX0NPTVBJTEFUSU9OKQorI2Vycm9yICJPbmx5IDxkYnVzL2RidXMuaD4gY2FuIGJlIGluY2x1ZGVkIGRpcmVjdGx5LCB0aGlzIGZpbGUgbWF5IGRpc2FwcGVhciBvciBjaGFuZ2UgY29udGVudHMuIgorI2VuZGlmCisKKyNpZm5kZWYgREJVU19USFJFQURTX0gKKyNkZWZpbmUgREJVU19USFJFQURTX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWNyb3MuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKworREJVU19CRUdJTl9ERUNMUworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNUaHJlYWRzCisgKiBAeworICovCisKKy8qKiBBbiBvcGFxdWUgbXV0ZXggdHlwZSBwcm92aWRlZCBieSB0aGUgI0RCdXNUaHJlYWRGdW5jdGlvbnMgaW1wbGVtZW50YXRpb24gaW5zdGFsbGVkIGJ5IGRidXNfdGhyZWFkc19pbml0KCkuICovCit0eXBlZGVmIHN0cnVjdCBEQnVzTXV0ZXggREJ1c011dGV4OworLyoqIEFuIG9wYXF1ZSBjb25kaXRpb24gdmFyaWFibGUgdHlwZSBwcm92aWRlZCBieSB0aGUgI0RCdXNUaHJlYWRGdW5jdGlvbnMgaW1wbGVtZW50YXRpb24gaW5zdGFsbGVkIGJ5IGRidXNfdGhyZWFkc19pbml0KCkuICovCit0eXBlZGVmIHN0cnVjdCBEQnVzQ29uZFZhciBEQnVzQ29uZFZhcjsKKworLyoqIERlcHJlY2F0ZWQsIHByb3ZpZGUgREJ1c1JlY3Vyc2l2ZU11dGV4TmV3RnVuY3Rpb24gaW5zdGVhZC4gKi8KK3R5cGVkZWYgREJ1c011dGV4KiAgKCogREJ1c011dGV4TmV3RnVuY3Rpb24pICAgICh2b2lkKTsKKy8qKiBEZXByZWNhdGVkLCBwcm92aWRlIERCdXNSZWN1cnNpdmVNdXRleEZyZWVGdW5jdGlvbiBpbnN0ZWFkLiAqLwordHlwZWRlZiB2b2lkICAgICAgICAoKiBEQnVzTXV0ZXhGcmVlRnVuY3Rpb24pICAgKERCdXNNdXRleCAqbXV0ZXgpOworLyoqIERlcHJlY2F0ZWQsIHByb3ZpZGUgREJ1c1JlY3Vyc2l2ZU11dGV4TG9ja0Z1bmN0aW9uIGluc3RlYWQuIFJldHVybiB2YWx1ZSBpcyBsb2NrIHN1Y2Nlc3MsIGJ1dCBnZXRzIGlnbm9yZWQgaW4gcHJhY3RpY2UuICovCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNNdXRleExvY2tGdW5jdGlvbikgICAoREJ1c011dGV4ICptdXRleCk7CisvKiogRGVwcmVjYXRlZCwgcHJvdmlkZSBEQnVzUmVjdXJzaXZlTXV0ZXhVbmxvY2tGdW5jdGlvbiBpbnN0ZWFkLiBSZXR1cm4gdmFsdWUgaXMgdW5sb2NrIHN1Y2Nlc3MsIGJ1dCBnZXRzIGlnbm9yZWQgaW4gcHJhY3RpY2UuICovCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNNdXRleFVubG9ja0Z1bmN0aW9uKSAoREJ1c011dGV4ICptdXRleCk7CisKKy8qKiBDcmVhdGVzIGEgbmV3IHJlY3Vyc2l2ZWx5LWxvY2thYmxlIG11dGV4LCBvciByZXR1cm5zICNOVUxMIGlmIG5vdAorICogZW5vdWdoIG1lbW9yeS4gIENhbiBvbmx5IGZhaWwgZHVlIHRvIGxhY2sgb2YgbWVtb3J5LiAgRm91bmQgaW4KKyAqICNEQnVzVGhyZWFkRnVuY3Rpb25zLiBEbyBub3QganVzdCB1c2UgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUgZm9yCisgKiB0aGlzLCBiZWNhdXNlIGl0IGRvZXMgbm90IHNhdmUvcmVzdG9yZSB0aGUgcmVjdXJzaW9uIGNvdW50IHdoZW4KKyAqIHdhaXRpbmcgb24gYSBjb25kaXRpb24uIGxpYmRidXMgcmVxdWlyZXMgdGhlIEphdmEtc3R5bGUgYmVoYXZpb3IKKyAqIHdoZXJlIHRoZSBtdXRleCBpcyBmdWxseSB1bmxvY2tlZCB0byB3YWl0IG9uIGEgY29uZGl0aW9uLgorICovCit0eXBlZGVmIERCdXNNdXRleCogICgqIERCdXNSZWN1cnNpdmVNdXRleE5ld0Z1bmN0aW9uKSAgICAodm9pZCk7CisvKiogRnJlZXMgYSByZWN1cnNpdmVseS1sb2NrYWJsZSBtdXRleC4gIEZvdW5kIGluICNEQnVzVGhyZWFkRnVuY3Rpb25zLgorICovCit0eXBlZGVmIHZvaWQgICAgICAgICgqIERCdXNSZWN1cnNpdmVNdXRleEZyZWVGdW5jdGlvbikgICAoREJ1c011dGV4ICptdXRleCk7CisvKiogTG9ja3MgYSByZWN1cnNpdmVseS1sb2NrYWJsZSBtdXRleC4gIEZvdW5kIGluICNEQnVzVGhyZWFkRnVuY3Rpb25zLgorICogQ2FuIG9ubHkgZmFpbCBkdWUgdG8gbGFjayBvZiBtZW1vcnkuCisgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c1JlY3Vyc2l2ZU11dGV4TG9ja0Z1bmN0aW9uKSAgIChEQnVzTXV0ZXggKm11dGV4KTsKKy8qKiBVbmxvY2tzIGEgcmVjdXJzaXZlbHktbG9ja2FibGUgbXV0ZXguICBGb3VuZCBpbiAjREJ1c1RocmVhZEZ1bmN0aW9ucy4KKyAqIENhbiBvbmx5IGZhaWwgZHVlIHRvIGxhY2sgb2YgbWVtb3J5LgorICovCit0eXBlZGVmIHZvaWQgICAgICAgICgqIERCdXNSZWN1cnNpdmVNdXRleFVubG9ja0Z1bmN0aW9uKSAoREJ1c011dGV4ICptdXRleCk7CisKKy8qKiBDcmVhdGVzIGEgbmV3IGNvbmRpdGlvbiB2YXJpYWJsZS4gIEZvdW5kIGluICNEQnVzVGhyZWFkRnVuY3Rpb25zLgorICogQ2FuIG9ubHkgZmFpbCAocmV0dXJuaW5nICNOVUxMKSBkdWUgdG8gbGFjayBvZiBtZW1vcnkuCisgKi8KK3R5cGVkZWYgREJ1c0NvbmRWYXIqICAoKiBEQnVzQ29uZFZhck5ld0Z1bmN0aW9uKSAgICAgICAgICh2b2lkKTsKKy8qKiBGcmVlcyBhIGNvbmRpdGlvbiB2YXJpYWJsZS4gIEZvdW5kIGluICNEQnVzVGhyZWFkRnVuY3Rpb25zLgorICovCit0eXBlZGVmIHZvaWQgICAgICAgICAgKCogREJ1c0NvbmRWYXJGcmVlRnVuY3Rpb24pICAgICAgICAoREJ1c0NvbmRWYXIgKmNvbmQpOworCisvKiogV2FpdHMgb24gYSBjb25kaXRpb24gdmFyaWFibGUuICBGb3VuZCBpbgorICogI0RCdXNUaHJlYWRGdW5jdGlvbnMuIE11c3Qgd29yayB3aXRoIGVpdGhlciBhIHJlY3Vyc2l2ZSBvcgorICogbm9ucmVjdXJzaXZlIG11dGV4LCB3aGljaGV2ZXIgdGhlIHRocmVhZCBpbXBsZW1lbnRhdGlvbgorICogcHJvdmlkZXMuIE5vdGUgdGhhdCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSBkb2VzIG5vdCB3b3JrIHdpdGgKKyAqIGNvbmRpdGlvbiB2YXJpYWJsZXMgKGRvZXMgbm90IHNhdmUvcmVzdG9yZSB0aGUgcmVjdXJzaW9uIGNvdW50KSBzbworICogZG9uJ3QgdHJ5IHVzaW5nIHNpbXBseSBwdGhyZWFkX2NvbmRfd2FpdCgpIGFuZCBhCisgKiBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSB0byBpbXBsZW1lbnQgdGhpcywgaXQgd29uJ3Qgd29yayByaWdodC4KKyAqCisgKiBIYXMgbm8gZXJyb3IgY29uZGl0aW9ucy4gTXVzdCBzdWNjZWVkIGlmIGl0IHJldHVybnMuCisgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgICAoKiBEQnVzQ29uZFZhcldhaXRGdW5jdGlvbikgICAgICAgIChEQnVzQ29uZFZhciAqY29uZCwKKwkJCQkJCQkgIERCdXNNdXRleCAgICptdXRleCk7CisKKy8qKiBXYWl0cyBvbiBhIGNvbmRpdGlvbiB2YXJpYWJsZSB3aXRoIGEgdGltZW91dC4gIEZvdW5kIGluCisgKiAgI0RCdXNUaHJlYWRGdW5jdGlvbnMuIFJldHVybnMgI1RSVUUgaWYgdGhlIHdhaXQgZGlkIG5vdAorICogIHRpbWUgb3V0LCBhbmQgI0ZBTFNFIGlmIGl0IGRpZC4KKyAqCisgKiBIYXMgbm8gZXJyb3IgY29uZGl0aW9ucy4gTXVzdCBzdWNjZWVkIGlmIGl0IHJldHVybnMuIAorICovCit0eXBlZGVmIGRidXNfYm9vbF90ICAgKCogREJ1c0NvbmRWYXJXYWl0VGltZW91dEZ1bmN0aW9uKSAoREJ1c0NvbmRWYXIgKmNvbmQsCisJCQkJCQkJICBEQnVzTXV0ZXggICAqbXV0ZXgsCisJCQkJCQkJICBpbnQgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpOworLyoqIFdha2VzIG9uZSB3YWl0aW5nIHRocmVhZCBvbiBhIGNvbmRpdGlvbiB2YXJpYWJsZS4gIEZvdW5kIGluICNEQnVzVGhyZWFkRnVuY3Rpb25zLgorICoKKyAqIEhhcyBubyBlcnJvciBjb25kaXRpb25zLiBNdXN0IHN1Y2NlZWQgaWYgaXQgcmV0dXJucy4KKyAqLwordHlwZWRlZiB2b2lkICAgICAgICAgICgqIERCdXNDb25kVmFyV2FrZU9uZUZ1bmN0aW9uKSAoREJ1c0NvbmRWYXIgKmNvbmQpOworCisvKiogV2FrZXMgYWxsIHdhaXRpbmcgdGhyZWFkcyBvbiBhIGNvbmRpdGlvbiB2YXJpYWJsZS4gIEZvdW5kIGluICNEQnVzVGhyZWFkRnVuY3Rpb25zLgorICoKKyAqIEhhcyBubyBlcnJvciBjb25kaXRpb25zLiBNdXN0IHN1Y2NlZWQgaWYgaXQgcmV0dXJucy4KKyAqLwordHlwZWRlZiB2b2lkICAgICAgICAgICgqIERCdXNDb25kVmFyV2FrZUFsbEZ1bmN0aW9uKSAoREJ1c0NvbmRWYXIgKmNvbmQpOworCisvKioKKyAqIEZsYWdzIGluZGljYXRpbmcgd2hpY2ggZnVuY3Rpb25zIGFyZSBwcmVzZW50IGluICNEQnVzVGhyZWFkRnVuY3Rpb25zLiBVc2VkIHRvIGFsbG93CisgKiB0aGUgbGlicmFyeSB0byBkZXRlY3Qgb2xkZXIgY2FsbGVycyBvZiBkYnVzX3RocmVhZHNfaW5pdCgpIGlmIG5ldyBwb3NzaWJsZSBmdW5jdGlvbnMKKyAqIGFyZSBhZGRlZCB0byAjREJ1c1RocmVhZEZ1bmN0aW9ucy4KKyAqLwordHlwZWRlZiBlbnVtIAoreworICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfTVVURVhfTkVXX01BU0sgICAgICA9IDEgPDwgMCwKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX01VVEVYX0ZSRUVfTUFTSyAgICAgPSAxIDw8IDEsCisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19NVVRFWF9MT0NLX01BU0sgICAgID0gMSA8PCAyLAorICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfTVVURVhfVU5MT0NLX01BU0sgICA9IDEgPDwgMywKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX0NPTkRWQVJfTkVXX01BU0sgICAgPSAxIDw8IDQsCisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19DT05EVkFSX0ZSRUVfTUFTSyAgID0gMSA8PCA1LAorICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfQ09ORFZBUl9XQUlUX01BU0sgICA9IDEgPDwgNiwKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX0NPTkRWQVJfV0FJVF9USU1FT1VUX01BU0sgICA9IDEgPDwgNywKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX0NPTkRWQVJfV0FLRV9PTkVfTUFTSyA9IDEgPDwgOCwKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX0NPTkRWQVJfV0FLRV9BTExfTUFTSyA9IDEgPDwgOSwKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX1JFQ1VSU0lWRV9NVVRFWF9ORVdfTUFTSyAgICA9IDEgPDwgMTAsCisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19SRUNVUlNJVkVfTVVURVhfRlJFRV9NQVNLICAgPSAxIDw8IDExLAorICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfUkVDVVJTSVZFX01VVEVYX0xPQ0tfTUFTSyAgID0gMSA8PCAxMiwKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX1JFQ1VSU0lWRV9NVVRFWF9VTkxPQ0tfTUFTSyA9IDEgPDwgMTMsCisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19BTExfTUFTSyAgICAgPSAoMSA8PCAxNCkgLSAxCit9IERCdXNUaHJlYWRGdW5jdGlvbnNNYXNrOworCisvKioKKyAqIEZ1bmN0aW9ucyB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gbWFrZSB0aGUgRC1CdXMgbGlicmFyeQorICogdGhyZWFkLWF3YXJlLgorICoKKyAqIElmIHlvdSBzdXBwbHkgYm90aCByZWN1cnNpdmUgYW5kIG5vbi1yZWN1cnNpdmUgbXV0ZXhlcywKKyAqIGxpYmRidXMgd2lsbCB1c2UgdGhlIG5vbi1yZWN1cnNpdmUgdmVyc2lvbiBmb3IgY29uZGl0aW9uIHZhcmlhYmxlcywKKyAqIGFuZCB0aGUgcmVjdXJzaXZlIHZlcnNpb24gaW4gb3RoZXIgY29udGV4dHMuCisgKgorICogVGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBmdW5jdGlvbnMgaGF2ZSB0byB3b3JrIHdpdGggbm9ucmVjdXJzaXZlCisgKiBtdXRleGVzIGlmIHlvdSBwcm92aWRlIHRob3NlLCBvciB3aXRoIHJlY3Vyc2l2ZSBtdXRleGVzIGlmIHlvdQorICogZG9uJ3QuCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVuc2lnbmVkIGludCBtYXNrOyAvKio8IE1hc2sgaW5kaWNhdGluZyB3aGljaCBmdW5jdGlvbnMgYXJlIHByZXNlbnQuICovCisKKyAgREJ1c011dGV4TmV3RnVuY3Rpb24gbXV0ZXhfbmV3OyAvKio8IEZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG11dGV4OyBvcHRpb25hbCBhbmQgZGVwcmVjYXRlZC4gKi8KKyAgREJ1c011dGV4RnJlZUZ1bmN0aW9uIG11dGV4X2ZyZWU7IC8qKjwgRnVuY3Rpb24gdG8gZnJlZSBhIG11dGV4OyBvcHRpb25hbCBhbmQgZGVwcmVjYXRlZC4gKi8KKyAgREJ1c011dGV4TG9ja0Z1bmN0aW9uIG11dGV4X2xvY2s7IC8qKjwgRnVuY3Rpb24gdG8gbG9jayBhIG11dGV4OyBvcHRpb25hbCBhbmQgZGVwcmVjYXRlZC4gKi8KKyAgREJ1c011dGV4VW5sb2NrRnVuY3Rpb24gbXV0ZXhfdW5sb2NrOyAvKio8IEZ1bmN0aW9uIHRvIHVubG9jayBhIG11dGV4OyBvcHRpb25hbCBhbmQgZGVwcmVjYXRlZC4gKi8KKworICBEQnVzQ29uZFZhck5ld0Z1bmN0aW9uIGNvbmR2YXJfbmV3OyAvKio8IEZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGNvbmRpdGlvbiB2YXJpYWJsZSAqLworICBEQnVzQ29uZFZhckZyZWVGdW5jdGlvbiBjb25kdmFyX2ZyZWU7IC8qKjwgRnVuY3Rpb24gdG8gZnJlZSBhIGNvbmRpdGlvbiB2YXJpYWJsZSAqLworICBEQnVzQ29uZFZhcldhaXRGdW5jdGlvbiBjb25kdmFyX3dhaXQ7IC8qKjwgRnVuY3Rpb24gdG8gd2FpdCBvbiBhIGNvbmRpdGlvbiAqLworICBEQnVzQ29uZFZhcldhaXRUaW1lb3V0RnVuY3Rpb24gY29uZHZhcl93YWl0X3RpbWVvdXQ7IC8qKjwgRnVuY3Rpb24gdG8gd2FpdCBvbiBhIGNvbmRpdGlvbiB3aXRoIGEgdGltZW91dCAqLworICBEQnVzQ29uZFZhcldha2VPbmVGdW5jdGlvbiBjb25kdmFyX3dha2Vfb25lOyAvKio8IEZ1bmN0aW9uIHRvIHdha2Ugb25lIHRocmVhZCB3YWl0aW5nIG9uIHRoZSBjb25kaXRpb24gKi8KKyAgREJ1c0NvbmRWYXJXYWtlQWxsRnVuY3Rpb24gY29uZHZhcl93YWtlX2FsbDsgLyoqPCBGdW5jdGlvbiB0byB3YWtlIGFsbCB0aHJlYWRzIHdhaXRpbmcgb24gdGhlIGNvbmRpdGlvbiAqLworIAorICBEQnVzUmVjdXJzaXZlTXV0ZXhOZXdGdW5jdGlvbiByZWN1cnNpdmVfbXV0ZXhfbmV3OyAvKio8IEZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHJlY3Vyc2l2ZSBtdXRleCAqLworICBEQnVzUmVjdXJzaXZlTXV0ZXhGcmVlRnVuY3Rpb24gcmVjdXJzaXZlX211dGV4X2ZyZWU7IC8qKjwgRnVuY3Rpb24gdG8gZnJlZSBhIHJlY3Vyc2l2ZSBtdXRleCAqLworICBEQnVzUmVjdXJzaXZlTXV0ZXhMb2NrRnVuY3Rpb24gcmVjdXJzaXZlX211dGV4X2xvY2s7IC8qKjwgRnVuY3Rpb24gdG8gbG9jayBhIHJlY3Vyc2l2ZSBtdXRleCAqLworICBEQnVzUmVjdXJzaXZlTXV0ZXhVbmxvY2tGdW5jdGlvbiByZWN1cnNpdmVfbXV0ZXhfdW5sb2NrOyAvKio8IEZ1bmN0aW9uIHRvIHVubG9jayBhIHJlY3Vyc2l2ZSBtdXRleCAqLworCisgIHZvaWQgKCogcGFkZGluZzEpICh2b2lkKTsgLyoqPCBSZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworICB2b2lkICgqIHBhZGRpbmcyKSAodm9pZCk7IC8qKjwgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKyAgdm9pZCAoKiBwYWRkaW5nMykgKHZvaWQpOyAvKio8IFJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCisgIHZvaWQgKCogcGFkZGluZzQpICh2b2lkKTsgLyoqPCBSZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworICAKK30gREJ1c1RocmVhZEZ1bmN0aW9uczsKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICBkYnVzX3RocmVhZHNfaW5pdCAgICAgICAgIChjb25zdCBEQnVzVGhyZWFkRnVuY3Rpb25zICpmdW5jdGlvbnMpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICBkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0ICh2b2lkKTsKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1RIUkVBRFNfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtdGltZW91dC5jIGIvZGJ1cy9kYnVzL2RidXMtdGltZW91dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZDZjZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy10aW1lb3V0LmMKQEAgLTAsMCArMSw0OTEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy10aW1lb3V0LmMgREJ1c1RpbWVvdXQgaW1wbGVtZW50YXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtdGltZW91dC5oIgorI2luY2x1ZGUgImRidXMtbGlzdC5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzVGltZW91dEludGVybmFscyBEQnVzVGltZW91dCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIGltcGxlbWVudGF0aW9uIGRldGFpbHMgZm9yIERCdXNUaW1lb3V0CisgKiAKKyAqIEB7CisgKi8KKworLyoqCisgKiBJbnRlcm5hbHMgb2YgREJ1c1RpbWVvdXQKKyAqLworc3RydWN0IERCdXNUaW1lb3V0Cit7CisgIGludCByZWZjb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVmZXJlbmNlIGNvdW50ICovCisgIGludCBpbnRlcnZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGltZW91dCBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMuICovCisKKyAgREJ1c1RpbWVvdXRIYW5kbGVyIGhhbmRsZXI7ICAgICAgICAgICAgICAgICAgLyoqPCBUaW1lb3V0IGhhbmRsZXIuICovCisgIHZvaWQgKmhhbmRsZXJfZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGltZW91dCBoYW5kbGVyIGRhdGEuICovCisgIERCdXNGcmVlRnVuY3Rpb24gZnJlZV9oYW5kbGVyX2RhdGFfZnVuY3Rpb247IC8qKjwgRnJlZSB0aGUgdGltZW91dCBoYW5kbGVyIGRhdGEuICovCisgIAorICB2b2lkICpkYXRhOwkJICAgCSAgICAgICAgICAgICAgIC8qKjwgQXBwbGljYXRpb24gZGF0YS4gKi8KKyAgREJ1c0ZyZWVGdW5jdGlvbiBmcmVlX2RhdGFfZnVuY3Rpb247ICAgICAgICAgLyoqPCBGcmVlIHRoZSBhcHBsaWNhdGlvbiBkYXRhLiAqLworICB1bnNpZ25lZCBpbnQgZW5hYmxlZCA6IDE7ICAgICAgICAgICAgICAgICAgICAvKio8IFRydWUgaWYgdGltZW91dCBpcyBhY3RpdmUuICovCit9OworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgREJ1c1RpbWVvdXQsIGVuYWJsZWQgYnkgZGVmYXVsdC4KKyAqIEBwYXJhbSBpbnRlcnZhbCB0aGUgdGltZW91dCBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMuCisgKiBAcGFyYW0gaGFuZGxlciBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHRpbWVvdXQgb2NjdXJzLgorICogQHBhcmFtIGRhdGEgZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byBmcmVlIHRoZSBkYXRhLgorICogQHJldHVybnMgdGhlIG5ldyBEQnVzVGltZW91dCBvYmplY3QsCisgKi8KK0RCdXNUaW1lb3V0KgorX2RidXNfdGltZW91dF9uZXcgKGludCAgICAgICAgICAgICAgICAgaW50ZXJ2YWwsCisJCSAgIERCdXNUaW1lb3V0SGFuZGxlciAgaGFuZGxlciwKKwkJICAgdm9pZCAgICAgICAgICAgICAgICpkYXRhLAorCQkgICBEQnVzRnJlZUZ1bmN0aW9uICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgREJ1c1RpbWVvdXQgKnRpbWVvdXQ7CisKKyAgdGltZW91dCA9IGRidXNfbmV3MCAoREJ1c1RpbWVvdXQsIDEpOworICBpZiAodGltZW91dCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICAKKyAgdGltZW91dC0+cmVmY291bnQgPSAxOworICB0aW1lb3V0LT5pbnRlcnZhbCA9IGludGVydmFsOworCisgIHRpbWVvdXQtPmhhbmRsZXIgPSBoYW5kbGVyOworICB0aW1lb3V0LT5oYW5kbGVyX2RhdGEgPSBkYXRhOworICB0aW1lb3V0LT5mcmVlX2hhbmRsZXJfZGF0YV9mdW5jdGlvbiA9IGZyZWVfZGF0YV9mdW5jdGlvbjsKKworICB0aW1lb3V0LT5lbmFibGVkID0gVFJVRTsKKyAgCisgIHJldHVybiB0aW1lb3V0OworfQorCisvKioKKyAqIEluY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhIERCdXNUaW1lb3V0IG9iamVjdC4KKyAqCisgKiBAcGFyYW0gdGltZW91dCB0aGUgdGltZW91dCBvYmplY3QuCisgKiBAcmV0dXJucyB0aGUgdGltZW91dCBvYmplY3QuCisgKi8KK0RCdXNUaW1lb3V0ICoKK19kYnVzX3RpbWVvdXRfcmVmIChEQnVzVGltZW91dCAqdGltZW91dCkKK3sKKyAgdGltZW91dC0+cmVmY291bnQgKz0gMTsKKworICByZXR1cm4gdGltZW91dDsKK30KKworLyoqCisgKiBEZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgYSBEQnVzVGltZW91dCBvYmplY3QKKyAqIGFuZCBmaW5hbGl6ZXMgdGhlIG9iamVjdCBpZiB0aGUgY291bnQgcmVhY2hlcyB6ZXJvLgorICoKKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0IG9iamVjdC4KKyAqLwordm9pZAorX2RidXNfdGltZW91dF91bnJlZiAoREJ1c1RpbWVvdXQgKnRpbWVvdXQpCit7CisgIF9kYnVzX2Fzc2VydCAodGltZW91dCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0ICh0aW1lb3V0LT5yZWZjb3VudCA+IDApOworICAKKyAgdGltZW91dC0+cmVmY291bnQgLT0gMTsKKyAgaWYgKHRpbWVvdXQtPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgZGJ1c190aW1lb3V0X3NldF9kYXRhICh0aW1lb3V0LCBOVUxMLCBOVUxMKTsgLyogY2FsbCBmcmVlX2RhdGFfZnVuY3Rpb24gKi8KKworICAgICAgaWYgKHRpbWVvdXQtPmZyZWVfaGFuZGxlcl9kYXRhX2Z1bmN0aW9uKQorCSgqIHRpbWVvdXQtPmZyZWVfaGFuZGxlcl9kYXRhX2Z1bmN0aW9uKSAodGltZW91dC0+aGFuZGxlcl9kYXRhKTsKKyAgICAgIAorICAgICAgZGJ1c19mcmVlICh0aW1lb3V0KTsKKyAgICB9Cit9CisKKy8qKgorICogQ2hhbmdlcyB0aGUgdGltZW91dCBpbnRlcnZhbC4gTm90ZSB0aGF0IHlvdSBoYXZlIHRvIGRpc2FibGUgYW5kCisgKiByZS1lbmFibGUgdGhlIHRpbWVvdXQgdXNpbmcgdGhlIHRpbWVvdXQgdG9nZ2xlIGZ1bmN0aW9uCisgKiAoX2RidXNfY29ubmVjdGlvbl90b2dnbGVfdGltZW91dF91bmxvY2tlZCgpIGV0Yy4pIHRvIG5vdGlmeSB0aGUKKyAqIGFwcGxpY2F0aW9uIG9mIHRoaXMgY2hhbmdlLgorICoKKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0CisgKiBAcGFyYW0gaW50ZXJ2YWwgdGhlIG5ldyBpbnRlcnZhbAorICovCit2b2lkCitfZGJ1c190aW1lb3V0X3NldF9pbnRlcnZhbCAoREJ1c1RpbWVvdXQgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIGludGVydmFsKQoreworICBfZGJ1c19hc3NlcnQgKGludGVydmFsID49IDApOworICAKKyAgdGltZW91dC0+aW50ZXJ2YWwgPSBpbnRlcnZhbDsKK30KKworLyoqCisgKiBDaGFuZ2VzIHRoZSB0aW1lb3V0J3MgZW5hYmxlZC1uZXNzLiBOb3RlIHRoYXQgeW91IHNob3VsZCB1c2UKKyAqIF9kYnVzX2Nvbm5lY3Rpb25fdG9nZ2xlX3RpbWVvdXRfdW5sb2NrZWQoKSBldGMuIGluc3RlYWQsIGlmCisgKiB0aGUgdGltZW91dCBpcyBwYXNzZWQgb3V0IHRvIGFuIGFwcGxpY2F0aW9uIG1haW4gbG9vcC4KKyAqIGkuZS4geW91IGNhbid0IHVzZSB0aGlzIGZ1bmN0aW9uIGluIHRoZSBELUJ1cyBsaWJyYXJ5LCBpdCdzCisgKiBvbmx5IHVzZWQgaW4gdGhlIG1lc3NhZ2UgYnVzIGRhZW1vbiBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAcGFyYW0gdGltZW91dCB0aGUgdGltZW91dAorICogQHBhcmFtIGVuYWJsZWQgI1RSVUUgaWYgdGltZW91dCBzaG91bGQgYmUgZW5hYmxlZC4KKyAqLwordm9pZAorX2RidXNfdGltZW91dF9zZXRfZW5hYmxlZCAoREJ1c1RpbWVvdXQgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICBlbmFibGVkKQoreworICB0aW1lb3V0LT5lbmFibGVkID0gZW5hYmxlZCAhPSBGQUxTRTsKK30KKworCisvKioKKyAqIEB0eXBlZGVmIERCdXNUaW1lb3V0TGlzdAorICoKKyAqIE9wYXF1ZSBkYXRhIHR5cGUgcmVwcmVzZW50aW5nIGEgbGlzdCBvZiB0aW1lb3V0cworICogYW5kIGEgc2V0IG9mIERCdXNBZGRUaW1lb3V0RnVuY3Rpb24vREJ1c1JlbW92ZVRpbWVvdXRGdW5jdGlvbi4KKyAqIEF1dG9tYXRpY2FsbHkgaGFuZGxlcyByZW1vdmluZy9yZS1hZGRpbmcgdGltZW91dHMKKyAqIHdoZW4gdGhlIERCdXNBZGRUaW1lb3V0RnVuY3Rpb24gaXMgdXBkYXRlZCBvciBjaGFuZ2VkLgorICogSG9sZHMgYSByZWZlcmVuY2UgY291bnQgdG8gZWFjaCB0aW1lb3V0LgorICoKKyAqLworCisvKioKKyAqIERCdXNUaW1lb3V0TGlzdCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLiBBbGwgZmllbGRzCisgKiBhcmUgcHJpdmF0ZS4KKyAqCisgKi8KK3N0cnVjdCBEQnVzVGltZW91dExpc3QKK3sKKyAgREJ1c0xpc3QgKnRpbWVvdXRzOyAvKio8IFRpbWVvdXQgb2JqZWN0cy4gKi8KKworICBEQnVzQWRkVGltZW91dEZ1bmN0aW9uIGFkZF90aW1lb3V0X2Z1bmN0aW9uOyAgICAgICAvKio8IENhbGxiYWNrIGZvciBhZGRpbmcgYSB0aW1lb3V0LiAqLworICBEQnVzUmVtb3ZlVGltZW91dEZ1bmN0aW9uIHJlbW92ZV90aW1lb3V0X2Z1bmN0aW9uOyAvKio8IENhbGxiYWNrIGZvciByZW1vdmluZyBhIHRpbWVvdXQuICovCisgIERCdXNUaW1lb3V0VG9nZ2xlZEZ1bmN0aW9uIHRpbWVvdXRfdG9nZ2xlZF9mdW5jdGlvbjsgLyoqPCBDYWxsYmFjayB3aGVuIHRpbWVvdXQgaXMgZW5hYmxlZC9kaXNhYmxlZCBvciBjaGFuZ2VzIGludGVydmFsICovCisgIHZvaWQgKnRpbWVvdXRfZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRGF0YSBmb3IgdGltZW91dCBjYWxsYmFja3MgKi8KKyAgREJ1c0ZyZWVGdW5jdGlvbiB0aW1lb3V0X2ZyZWVfZGF0YV9mdW5jdGlvbjsgICAgICAgLyoqPCBGcmVlIGZ1bmN0aW9uIGZvciB0aW1lb3V0IGNhbGxiYWNrIGRhdGEgKi8KK307CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyB0aW1lb3V0IGxpc3QuIFJldHVybnMgI05VTEwgaWYgaW5zdWZmaWNpZW50CisgKiBtZW1vcnkgZXhpc3RzLgorICoKKyAqIEByZXR1cm5zIHRoZSBuZXcgdGltZW91dCBsaXN0LCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICovCitEQnVzVGltZW91dExpc3QqCitfZGJ1c190aW1lb3V0X2xpc3RfbmV3ICh2b2lkKQoreworICBEQnVzVGltZW91dExpc3QgKnRpbWVvdXRfbGlzdDsKKworICB0aW1lb3V0X2xpc3QgPSBkYnVzX25ldzAgKERCdXNUaW1lb3V0TGlzdCwgMSk7CisgIGlmICh0aW1lb3V0X2xpc3QgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR1cm4gdGltZW91dF9saXN0OworfQorCisvKioKKyAqIEZyZWVzIGEgREJ1c1RpbWVvdXRMaXN0LgorICoKKyAqIEBwYXJhbSB0aW1lb3V0X2xpc3QgdGhlIHRpbWVvdXQgbGlzdC4KKyAqLwordm9pZAorX2RidXNfdGltZW91dF9saXN0X2ZyZWUgKERCdXNUaW1lb3V0TGlzdCAqdGltZW91dF9saXN0KQoreworICAvKiBmcmVlIHRpbWVvdXRfZGF0YSBhbmQgcmVtb3ZlIHRpbWVvdXRzIGFzIGEgc2lkZSBlZmZlY3QgKi8KKyAgX2RidXNfdGltZW91dF9saXN0X3NldF9mdW5jdGlvbnMgKHRpbWVvdXRfbGlzdCwKKwkJCQkgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgX2RidXNfbGlzdF9mb3JlYWNoICgmdGltZW91dF9saXN0LT50aW1lb3V0cywKKwkJICAgICAgKERCdXNGb3JlYWNoRnVuY3Rpb24pIF9kYnVzX3RpbWVvdXRfdW5yZWYsCisJCSAgICAgIE5VTEwpOworICBfZGJ1c19saXN0X2NsZWFyICgmdGltZW91dF9saXN0LT50aW1lb3V0cyk7CisKKyAgZGJ1c19mcmVlICh0aW1lb3V0X2xpc3QpOworfQorCisvKioKKyAqIFNldHMgdGhlIHRpbWVvdXQgZnVuY3Rpb25zLiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSAiYmFja2VuZCIKKyAqIGZvciBkYnVzX2Nvbm5lY3Rpb25fc2V0X3RpbWVvdXRfZnVuY3Rpb25zKCkuCisgKgorICogQHBhcmFtIHRpbWVvdXRfbGlzdCB0aGUgdGltZW91dCBsaXN0CisgKiBAcGFyYW0gYWRkX2Z1bmN0aW9uIHRoZSBhZGQgdGltZW91dCBmdW5jdGlvbi4KKyAqIEBwYXJhbSByZW1vdmVfZnVuY3Rpb24gdGhlIHJlbW92ZSB0aW1lb3V0IGZ1bmN0aW9uLgorICogQHBhcmFtIHRvZ2dsZWRfZnVuY3Rpb24gdG9nZ2xlIG5vdGlmeSBmdW5jdGlvbiwgb3IgI05VTEwKKyAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIGZvciB0aG9zZSBmdW5jdGlvbnMuCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIHRoZSBmdW5jdGlvbiB0byBmcmVlIHRoZSBkYXRhLgorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICoKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3RpbWVvdXRfbGlzdF9zZXRfZnVuY3Rpb25zIChEQnVzVGltZW91dExpc3QgICAgICAgICAgICp0aW1lb3V0X2xpc3QsCisJCQkJICBEQnVzQWRkVGltZW91dEZ1bmN0aW9uICAgICBhZGRfZnVuY3Rpb24sCisJCQkJICBEQnVzUmVtb3ZlVGltZW91dEZ1bmN0aW9uICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXRUb2dnbGVkRnVuY3Rpb24gdG9nZ2xlZF9mdW5jdGlvbiwKKwkJCQkgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisJCQkJICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pCit7CisgIC8qIEFkZCB0aW1lb3V0cyB3aXRoIHRoZSBuZXcgZnVuY3Rpb24sIGZhaWxpbmcgb24gT09NICovCisgIGlmIChhZGRfZnVuY3Rpb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbGluazsKKyAgICAgIAorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZ0aW1lb3V0X2xpc3QtPnRpbWVvdXRzKTsKKyAgICAgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnRpbWVvdXRfbGlzdC0+dGltZW91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmspOworICAgICAgCisgICAgICAgICAgaWYgKCEoKiBhZGRfZnVuY3Rpb24pIChsaW5rLT5kYXRhLCBkYXRhKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogcmVtb3ZlIGl0IGFsbCBhZ2FpbiBhbmQgcmV0dXJuIEZBTFNFICovCisgICAgICAgICAgICAgIERCdXNMaXN0ICpsaW5rMjsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGxpbmsyID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnRpbWVvdXRfbGlzdC0+dGltZW91dHMpOworICAgICAgICAgICAgICB3aGlsZSAobGluazIgIT0gbGluaykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnRpbWVvdXRfbGlzdC0+dGltZW91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluazIpOworCisgICAgICAgICAgICAgICAgICAoKiByZW1vdmVfZnVuY3Rpb24pIChsaW5rMi0+ZGF0YSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIGxpbmsyID0gbmV4dDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgCisgICAgICAgICAgbGluayA9IG5leHQ7CisgICAgICAgIH0KKyAgICB9CisgIAorICAvKiBSZW1vdmUgYWxsIGN1cnJlbnQgdGltZW91dHMgZnJvbSBwcmV2aW91cyB0aW1lb3V0IGhhbmRsZXJzICovCisKKyAgaWYgKHRpbWVvdXRfbGlzdC0+cmVtb3ZlX3RpbWVvdXRfZnVuY3Rpb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZ0aW1lb3V0X2xpc3QtPnRpbWVvdXRzLAorCQkJICAoREJ1c0ZvcmVhY2hGdW5jdGlvbikgdGltZW91dF9saXN0LT5yZW1vdmVfdGltZW91dF9mdW5jdGlvbiwKKwkJCSAgdGltZW91dF9saXN0LT50aW1lb3V0X2RhdGEpOworICAgIH0KKworICBpZiAodGltZW91dF9saXN0LT50aW1lb3V0X2ZyZWVfZGF0YV9mdW5jdGlvbiAhPSBOVUxMKQorICAgICgqIHRpbWVvdXRfbGlzdC0+dGltZW91dF9mcmVlX2RhdGFfZnVuY3Rpb24pICh0aW1lb3V0X2xpc3QtPnRpbWVvdXRfZGF0YSk7CisKKyAgdGltZW91dF9saXN0LT5hZGRfdGltZW91dF9mdW5jdGlvbiA9IGFkZF9mdW5jdGlvbjsKKyAgdGltZW91dF9saXN0LT5yZW1vdmVfdGltZW91dF9mdW5jdGlvbiA9IHJlbW92ZV9mdW5jdGlvbjsKKyAgdGltZW91dF9saXN0LT50aW1lb3V0X3RvZ2dsZWRfZnVuY3Rpb24gPSB0b2dnbGVkX2Z1bmN0aW9uOworICB0aW1lb3V0X2xpc3QtPnRpbWVvdXRfZGF0YSA9IGRhdGE7CisgIHRpbWVvdXRfbGlzdC0+dGltZW91dF9mcmVlX2RhdGFfZnVuY3Rpb24gPSBmcmVlX2RhdGFfZnVuY3Rpb247CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQWRkcyBhIG5ldyB0aW1lb3V0IHRvIHRoZSB0aW1lb3V0IGxpc3QsIGludm9raW5nIHRoZQorICogYXBwbGljYXRpb24gREJ1c0FkZFRpbWVvdXRGdW5jdGlvbiBpZiBhcHByb3ByaWF0ZS4KKyAqCisgKiBAcGFyYW0gdGltZW91dF9saXN0IHRoZSB0aW1lb3V0IGxpc3QuCisgKiBAcGFyYW0gdGltZW91dCB0aGUgdGltZW91dCB0byBhZGQuCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0UgSWYgbm8gbWVtb3J5LgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdGltZW91dF9saXN0X2FkZF90aW1lb3V0IChEQnVzVGltZW91dExpc3QgKnRpbWVvdXRfbGlzdCwKKwkJCQlEQnVzVGltZW91dCAgICAgKnRpbWVvdXQpCit7CisgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZ0aW1lb3V0X2xpc3QtPnRpbWVvdXRzLCB0aW1lb3V0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfdGltZW91dF9yZWYgKHRpbWVvdXQpOworCisgIGlmICh0aW1lb3V0X2xpc3QtPmFkZF90aW1lb3V0X2Z1bmN0aW9uICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCEoKiB0aW1lb3V0X2xpc3QtPmFkZF90aW1lb3V0X2Z1bmN0aW9uKSAodGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbGlzdC0+dGltZW91dF9kYXRhKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xhc3QgKCZ0aW1lb3V0X2xpc3QtPnRpbWVvdXRzLCB0aW1lb3V0KTsKKyAgICAgICAgICBfZGJ1c190aW1lb3V0X3VucmVmICh0aW1lb3V0KTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogUmVtb3ZlcyBhIHRpbWVvdXQgZnJvbSB0aGUgdGltZW91dCBsaXN0LCBpbnZva2luZyB0aGUKKyAqIGFwcGxpY2F0aW9uJ3MgREJ1c1JlbW92ZVRpbWVvdXRGdW5jdGlvbiBpZiBhcHByb3ByaWF0ZS4KKyAqCisgKiBAcGFyYW0gdGltZW91dF9saXN0IHRoZSB0aW1lb3V0IGxpc3QuCisgKiBAcGFyYW0gdGltZW91dCB0aGUgdGltZW91dCB0byByZW1vdmUuCisgKi8KK3ZvaWQKK19kYnVzX3RpbWVvdXRfbGlzdF9yZW1vdmVfdGltZW91dCAoREJ1c1RpbWVvdXRMaXN0ICp0aW1lb3V0X2xpc3QsCisJCQkJICAgREJ1c1RpbWVvdXQgICAgICp0aW1lb3V0KQoreworICBpZiAoIV9kYnVzX2xpc3RfcmVtb3ZlICgmdGltZW91dF9saXN0LT50aW1lb3V0cywgdGltZW91dCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiTm9uZXhpc3RlbnQgdGltZW91dCB3YXMgcmVtb3ZlZCIpOworCisgIGlmICh0aW1lb3V0X2xpc3QtPnJlbW92ZV90aW1lb3V0X2Z1bmN0aW9uICE9IE5VTEwpCisgICAgKCogdGltZW91dF9saXN0LT5yZW1vdmVfdGltZW91dF9mdW5jdGlvbikgKHRpbWVvdXQsCisJCQkJCSAgICAgICB0aW1lb3V0X2xpc3QtPnRpbWVvdXRfZGF0YSk7CisKKyAgX2RidXNfdGltZW91dF91bnJlZiAodGltZW91dCk7Cit9CisKKy8qKgorICogU2V0cyBhIHRpbWVvdXQgdG8gdGhlIGdpdmVuIGVuYWJsZWQgc3RhdGUsIGludm9raW5nIHRoZQorICogYXBwbGljYXRpb24ncyBEQnVzVGltZW91dFRvZ2dsZWRGdW5jdGlvbiBpZiBhcHByb3ByaWF0ZS4KKyAqCisgKiBAcGFyYW0gdGltZW91dF9saXN0IHRoZSB0aW1lb3V0IGxpc3QuCisgKiBAcGFyYW0gdGltZW91dCB0aGUgdGltZW91dCB0byB0b2dnbGUuCisgKiBAcGFyYW0gZW5hYmxlZCAjVFJVRSB0byBlbmFibGUKKyAqLwordm9pZAorX2RidXNfdGltZW91dF9saXN0X3RvZ2dsZV90aW1lb3V0IChEQnVzVGltZW91dExpc3QgICAgICAgICAgICp0aW1lb3V0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgICAgICAgICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgICAgIGVuYWJsZWQpCit7CisgIGVuYWJsZWQgPSAhIWVuYWJsZWQ7CisgIAorICBpZiAoZW5hYmxlZCA9PSB0aW1lb3V0LT5lbmFibGVkKQorICAgIHJldHVybjsKKworICB0aW1lb3V0LT5lbmFibGVkID0gZW5hYmxlZDsKKyAgCisgIGlmICh0aW1lb3V0X2xpc3QtPnRpbWVvdXRfdG9nZ2xlZF9mdW5jdGlvbiAhPSBOVUxMKQorICAgICgqIHRpbWVvdXRfbGlzdC0+dGltZW91dF90b2dnbGVkX2Z1bmN0aW9uKSAodGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbGlzdC0+dGltZW91dF9kYXRhKTsKK30KKworLyoqIEB9ICovCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNUaW1lb3V0IERCdXNUaW1lb3V0CisgKiBAaW5ncm91cCAgREJ1cworICogQGJyaWVmIE9iamVjdCByZXByZXNlbnRpbmcgYSB0aW1lb3V0CisgKgorICogVHlwZXMgYW5kIGZ1bmN0aW9ucyByZWxhdGVkIHRvIERCdXNUaW1lb3V0LiBBIHRpbWVvdXQKKyAqIHJlcHJlc2VudHMgYSB0aW1lb3V0IHRoYXQgdGhlIG1haW4gbG9vcCBuZWVkcyB0byBtb25pdG9yLAorICogYXMgaW4gUXQncyBRVGltZXIgb3IgR0xpYidzIGdfdGltZW91dF9hZGQoKS4KKyAqCisgKiBVc2UgZGJ1c19jb25uZWN0aW9uX3NldF90aW1lb3V0X2Z1bmN0aW9ucygpIG9yIGRidXNfc2VydmVyX3NldF90aW1lb3V0X2Z1bmN0aW9ucygpCisgKiB0byBiZSBub3RpZmllZCB3aGVuIGxpYmRidXMgbmVlZHMgdG8gYWRkIG9yIHJlbW92ZSB0aW1lb3V0cy4KKyAqIAorICogQHsKKyAqLworCisKKy8qKgorICogQHR5cGVkZWYgREJ1c1RpbWVvdXQKKyAqCisgKiBPcGFxdWUgb2JqZWN0IHJlcHJlc2VudGluZyBhIHRpbWVvdXQuCisgKi8KKworLyoqCisgKiBHZXRzIHRoZSB0aW1lb3V0IGludGVydmFsLiBUaGUgZGJ1c190aW1lb3V0X2hhbmRsZSgpCisgKiBzaG91bGQgYmUgY2FsbGVkIGVhY2ggdGltZSB0aGlzIGludGVydmFsIGVsYXBzZXMsCisgKiBzdGFydGluZyBhZnRlciBpdCBlbGFwc2VzIG9uY2UuCisgKgorICogVGhlIGludGVydmFsIG1heSBjaGFuZ2UgZHVyaW5nIHRoZSBsaWZlIG9mIHRoZQorICogdGltZW91dDsgaWYgc28sIHRoZSB0aW1lb3V0IHdpbGwgYmUgZGlzYWJsZWQgYW5kCisgKiByZS1lbmFibGVkIChjYWxsaW5nIHRoZSAidGltZW91dCB0b2dnbGVkIGZ1bmN0aW9uIikKKyAqIHRvIG5vdGlmeSB5b3Ugb2YgdGhlIGNoYW5nZS4KKyAqCisgKiBAcGFyYW0gdGltZW91dCB0aGUgREJ1c1RpbWVvdXQgb2JqZWN0LgorICogQHJldHVybnMgdGhlIGludGVydmFsIGluIG1pbGxpc2Vjb25kcy4KKyAqLworaW50CitkYnVzX3RpbWVvdXRfZ2V0X2ludGVydmFsIChEQnVzVGltZW91dCAqdGltZW91dCkKK3sKKyAgcmV0dXJuIHRpbWVvdXQtPmludGVydmFsOworfQorCisvKioKKyAqIEdldHMgZGF0YSBwcmV2aW91c2x5IHNldCB3aXRoIGRidXNfdGltZW91dF9zZXRfZGF0YSgpCisgKiBvciAjTlVMTCBpZiBub25lLgorICoKKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSBEQnVzVGltZW91dCBvYmplY3QuCisgKiBAcmV0dXJucyBwcmV2aW91c2x5LXNldCBkYXRhLgorICovCit2b2lkKgorZGJ1c190aW1lb3V0X2dldF9kYXRhIChEQnVzVGltZW91dCAqdGltZW91dCkKK3sKKyAgcmV0dXJuIHRpbWVvdXQtPmRhdGE7Cit9CisKKy8qKgorICogU2V0cyBkYXRhIHdoaWNoIGNhbiBiZSByZXRyaWV2ZWQgd2l0aCBkYnVzX3RpbWVvdXRfZ2V0X2RhdGEoKS4KKyAqIEludGVuZGVkIGZvciB1c2UgYnkgdGhlIERCdXNBZGRUaW1lb3V0RnVuY3Rpb24gYW5kCisgKiBEQnVzUmVtb3ZlVGltZW91dEZ1bmN0aW9uIHRvIHN0b3JlIHRoZWlyIG93biBkYXRhLiAgRm9yIGV4YW1wbGUgd2l0aAorICogUXQgeW91IG1pZ2h0IHN0b3JlIHRoZSBRVGltZXIgZm9yIHRoaXMgdGltZW91dCBhbmQgd2l0aCBHTGliCisgKiB5b3UgbWlnaHQgc3RvcmUgYSBnX3RpbWVvdXRfYWRkIHJlc3VsdCBpZC4KKyAqCisgKiBAcGFyYW0gdGltZW91dCB0aGUgREJ1c1RpbWVvdXQgb2JqZWN0LgorICogQHBhcmFtIGRhdGEgdGhlIGRhdGEuCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byBmcmVlIHRoZSBkYXRhLgorICovCit2b2lkCitkYnVzX3RpbWVvdXRfc2V0X2RhdGEgKERCdXNUaW1lb3V0ICAgICAgKnRpbWVvdXQsCisJCSAgICAgICB2b2lkICAgICAgICAgICAgICpkYXRhLAorCQkgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgZnJlZV9kYXRhX2Z1bmN0aW9uKQoreworICBpZiAodGltZW91dC0+ZnJlZV9kYXRhX2Z1bmN0aW9uICE9IE5VTEwpCisgICAgKCogdGltZW91dC0+ZnJlZV9kYXRhX2Z1bmN0aW9uKSAodGltZW91dC0+ZGF0YSk7CisKKyAgdGltZW91dC0+ZGF0YSA9IGRhdGE7CisgIHRpbWVvdXQtPmZyZWVfZGF0YV9mdW5jdGlvbiA9IGZyZWVfZGF0YV9mdW5jdGlvbjsKK30KKworLyoqCisgKiBDYWxscyB0aGUgdGltZW91dCBoYW5kbGVyIGZvciB0aGlzIHRpbWVvdXQuCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgdGltZW91dAorICogb2NjdXJzLgorICoKKyAqIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAjRkFMU0UsIHRoZW4gdGhlcmUgd2Fzbid0CisgKiBlbm91Z2ggbWVtb3J5IHRvIGhhbmRsZSB0aGUgdGltZW91dC4gVHlwaWNhbGx5IGp1c3QKKyAqIGxldHRpbmcgdGhlIHRpbWVvdXQgZmlyZSBhZ2FpbiBuZXh0IHRpbWUgaXQgbmF0dXJhbGx5CisgKiB0aW1lcyBvdXQgaXMgYW4gYWRlcXVhdGUgcmVzcG9uc2UgdG8gdGhhdCBwcm9ibGVtLAorICogYnV0IHlvdSBjb3VsZCB0cnkgdG8gZG8gbW9yZSBpZiB5b3Ugd2FudGVkLgorICoKKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSBEQnVzVGltZW91dCBvYmplY3QuCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlcmUgd2Fzbid0IGVub3VnaCBtZW1vcnkgCisgKi8KK2RidXNfYm9vbF90CitkYnVzX3RpbWVvdXRfaGFuZGxlIChEQnVzVGltZW91dCAqdGltZW91dCkKK3sKKyAgcmV0dXJuICgqIHRpbWVvdXQtPmhhbmRsZXIpICh0aW1lb3V0LT5oYW5kbGVyX2RhdGEpOworfQorCisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIGEgdGltZW91dCBpcyBlbmFibGVkIG9yIG5vdC4gSWYgbm90CisgKiBlbmFibGVkLCBpdCBzaG91bGQgbm90IGJlIHBvbGxlZCBieSB0aGUgbWFpbiBsb29wLgorICoKKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSBEQnVzVGltZW91dCBvYmplY3QKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSB0aW1lb3V0IGlzIGVuYWJsZWQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfdGltZW91dF9nZXRfZW5hYmxlZCAoREJ1c1RpbWVvdXQgKnRpbWVvdXQpCit7CisgIHJldHVybiB0aW1lb3V0LT5lbmFibGVkOworfQorCisvKiogQH0gZW5kIHB1YmxpYyBBUEkgZG9jcyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtdGltZW91dC5oIGIvZGJ1cy9kYnVzL2RidXMtdGltZW91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYThhZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy10aW1lb3V0LmgKQEAgLTAsMCArMSw3NSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXRpbWVvdXQuaCBEQnVzVGltZW91dCBpbnRlcm5hbCBpbnRlcmZhY2VzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX1RJTUVPVVRfSAorI2RlZmluZSBEQlVTX1RJTUVPVVRfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWNvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzVGltZW91dEludGVybmFscworICogQHsKKyAqLworCisvKiBQdWJsaWMgbWV0aG9kcyBvbiBEQnVzVGltZW91dCBhcmUgaW4gZGJ1cy1jb25uZWN0aW9uLmggKi8KKwordHlwZWRlZiBzdHJ1Y3QgREJ1c1RpbWVvdXRMaXN0IERCdXNUaW1lb3V0TGlzdDsKKworLyoqIGZ1bmN0aW9uIHRvIHJ1biB3aGVuIHRoZSB0aW1lb3V0IGlzIGhhbmRsZWQgKi8KK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogREJ1c1RpbWVvdXRIYW5kbGVyKSAodm9pZCAqZGF0YSk7CisKK0RCdXNUaW1lb3V0KiBfZGJ1c190aW1lb3V0X25ldyAgICAgICAgICAoaW50ICAgICAgICAgICAgICAgICBpbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXRIYW5kbGVyICBoYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK0RCdXNUaW1lb3V0KiBfZGJ1c190aW1lb3V0X3JlZiAgICAgICAgICAoREJ1c1RpbWVvdXQgICAgICAgICp0aW1lb3V0KTsKK3ZvaWQgICAgICAgICBfZGJ1c190aW1lb3V0X3VucmVmICAgICAgICAoREJ1c1RpbWVvdXQgICAgICAgICp0aW1lb3V0KTsKK3ZvaWQgICAgICAgICBfZGJ1c190aW1lb3V0X3NldF9pbnRlcnZhbCAoREJ1c1RpbWVvdXQgICAgICAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIGludGVydmFsKTsKK3ZvaWQgICAgICAgICBfZGJ1c190aW1lb3V0X3NldF9lbmFibGVkICAoREJ1c1RpbWVvdXQgICAgICAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgIGVuYWJsZWQpOworCitEQnVzVGltZW91dExpc3QgKl9kYnVzX3RpbWVvdXRfbGlzdF9uZXcgICAgICAgICAgICAodm9pZCk7Cit2b2lkICAgICAgICAgICAgIF9kYnVzX3RpbWVvdXRfbGlzdF9mcmVlICAgICAgICAgICAoREJ1c1RpbWVvdXRMaXN0ICAgICAgICAgICAqdGltZW91dF9saXN0KTsKK2RidXNfYm9vbF90ICAgICAgX2RidXNfdGltZW91dF9saXN0X3NldF9mdW5jdGlvbnMgIChEQnVzVGltZW91dExpc3QgICAgICAgICAgICp0aW1lb3V0X2xpc3QsCisJCQkJCQkgICAgREJ1c0FkZFRpbWVvdXRGdW5jdGlvbiAgICAgYWRkX2Z1bmN0aW9uLAorCQkJCQkJICAgIERCdXNSZW1vdmVUaW1lb3V0RnVuY3Rpb24gIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dFRvZ2dsZWRGdW5jdGlvbiB0b2dnbGVkX2Z1bmN0aW9uLAorCQkJCQkJICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisJCQkJCQkgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK2RidXNfYm9vbF90ICAgICAgX2RidXNfdGltZW91dF9saXN0X2FkZF90aW1lb3V0ICAgIChEQnVzVGltZW91dExpc3QgICAgICAgICAgICp0aW1lb3V0X2xpc3QsCisJCQkJCQkgICAgREJ1c1RpbWVvdXQgICAgICAgICAgICAgICAqdGltZW91dCk7Cit2b2lkICAgICAgICAgICAgIF9kYnVzX3RpbWVvdXRfbGlzdF9yZW1vdmVfdGltZW91dCAoREJ1c1RpbWVvdXRMaXN0ICAgICAgICAgICAqdGltZW91dF9saXN0LAorCQkJCQkJICAgIERCdXNUaW1lb3V0ICAgICAgICAgICAgICAgKnRpbWVvdXQpOwordm9pZCAgICAgICAgICAgICBfZGJ1c190aW1lb3V0X2xpc3RfdG9nZ2xlX3RpbWVvdXQgKERCdXNUaW1lb3V0TGlzdCAgICAgICAgICAgKnRpbWVvdXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dCAgICAgICAgICAgICAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgICAgIGVuYWJsZWQpOworCisKKy8qKiBAfSAqLworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19USU1FT1VUX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLXRyYW5zcG9ydC1wcm90ZWN0ZWQuaCBiL2RidXMvZGJ1cy9kYnVzLXRyYW5zcG9ydC1wcm90ZWN0ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGI5ZDc4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtdHJhbnNwb3J0LXByb3RlY3RlZC5oCkBAIC0wLDAgKzEsMTQ2IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdHJhbnNwb3J0LXByb3RlY3RlZC5oIFVzZWQgYnkgc3ViY2xhc3NlcyBvZiBEQnVzVHJhbnNwb3J0IG9iamVjdCAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA0ICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZm5kZWYgREJVU19UUkFOU1BPUlRfUFJPVEVDVEVEX0gKKyNkZWZpbmUgREJVU19UUkFOU1BPUlRfUFJPVEVDVEVEX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZXJyb3JzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tZXNzYWdlLWludGVybmFsLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWF1dGguaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtcmVzb3VyY2VzLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgREJ1c1RyYW5zcG9ydFZUYWJsZSBEQnVzVHJhbnNwb3J0VlRhYmxlOworCisvKioKKyAqIFRoZSB2aXJ0dWFsIHRhYmxlIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCB0bworICogY3JlYXRlIGEgbmV3IGtpbmQgb2YgdHJhbnNwb3J0LgorICovCitzdHJ1Y3QgREJ1c1RyYW5zcG9ydFZUYWJsZQoreworICB2b2lkICAgICAgICAoKiBmaW5hbGl6ZSkgICAgICAgICAgICAgIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpOworICAvKio8IFRoZSBmaW5hbGl6ZSBtZXRob2QgbXVzdCBmcmVlIHRoZSB0cmFuc3BvcnQuICovCisKKyAgZGJ1c19ib29sX3QgKCogaGFuZGxlX3dhdGNoKSAgICAgICAgICAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgZmxhZ3MpOworICAvKio8IFRoZSBoYW5kbGVfd2F0Y2ggbWV0aG9kIGhhbmRsZXMgcmVhZGluZy93cml0aW5nCisgICAqIGRhdGEgYXMgaW5kaWNhdGVkIGJ5IHRoZSBmbGFncy4KKyAgICovCisKKyAgdm9pZCAgICAgICAgKCogZGlzY29ubmVjdCkgICAgICAgICAgICAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KTsKKyAgLyoqPCBEaXNjb25uZWN0IHRoaXMgdHJhbnNwb3J0LiAqLworCisgIGRidXNfYm9vbF90ICgqIGNvbm5lY3Rpb25fc2V0KSAgICAgICAgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCk7CisgIC8qKjwgQ2FsbGVkIHdoZW4gdHJhbnNwb3J0LT5jb25uZWN0aW9uIGhhcyBiZWVuIGZpbGxlZCBpbiAqLworCisgIHZvaWQgICAgICAgICgqIGRvX2l0ZXJhdGlvbikgICAgICAgICAgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKKyAgLyoqPCBDYWxsZWQgdG8gZG8gYSBzaW5nbGUgIml0ZXJhdGlvbiIgKGJsb2NrIG9uIHNlbGVjdC9wb2xsCisgICAqIGZvbGxvd2VkIGJ5IHJlYWRpbmcgb3Igd3JpdGluZyBkYXRhKS4KKyAgICovCisKKyAgdm9pZCAgICAgICAgKCogbGl2ZV9tZXNzYWdlc19jaGFuZ2VkKSAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KTsKKyAgLyoqPCBPdXRzdGFuZGluZyBtZXNzYWdlcyBjb3VudGVyIGNoYW5nZWQgKi8KKworICBkYnVzX2Jvb2xfdCAoKiBnZXRfc29ja2V0X2ZkKSAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAqZmRfcCk7CisgIC8qKjwgR2V0IHNvY2tldCBmaWxlIGRlc2NyaXB0b3IgKi8KK307CisKKy8qKgorICogT2JqZWN0IHJlcHJlc2VudGluZyBhIHRyYW5zcG9ydCBzdWNoIGFzIGEgc29ja2V0LgorICogQSB0cmFuc3BvcnQgY2FuIHNodXR0bGUgbWVzc2FnZXMgZnJvbSBwb2ludCBBIHRvIHBvaW50IEIsCisgKiBhbmQgaXMgdGhlIGJhY2tlbmQgZm9yIGEgI0RCdXNDb25uZWN0aW9uLgorICoKKyAqLworc3RydWN0IERCdXNUcmFuc3BvcnQKK3sKKyAgaW50IHJlZmNvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJlZmVyZW5jZSBjb3VudC4gKi8KKworICBjb25zdCBEQnVzVHJhbnNwb3J0VlRhYmxlICp2dGFibGU7ICAgICAgICAgIC8qKjwgVmlydHVhbCBtZXRob2RzIGZvciB0aGlzIGluc3RhbmNlLiAqLworCisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOyAgICAgICAgICAgICAgICAgLyoqPCBDb25uZWN0aW9uIG93bmluZyB0aGlzIHRyYW5zcG9ydC4gKi8KKworICBEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyOyAgICAgICAgICAgICAgICAgIC8qKjwgTWVzc2FnZS1sb2FkaW5nIGJ1ZmZlci4gKi8KKworICBEQnVzQXV0aCAqYXV0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQXV0aGVudGljYXRpb24gY29udmVyc2F0aW9uICovCisKKyAgREJ1c0NyZWRlbnRpYWxzICpjcmVkZW50aWFsczsgICAgICAgICAgICAgICAvKio8IENyZWRlbnRpYWxzIG9mIG90aGVyIGVuZCByZWFkIGZyb20gdGhlIHNvY2tldCAqLyAgCisKKyAgbG9uZyBtYXhfbGl2ZV9tZXNzYWdlc19zaXplOyAgICAgICAgICAgICAgICAvKio8IE1heCB0b3RhbCBzaXplIG9mIHJlY2VpdmVkIG1lc3NhZ2VzLiAqLworICBsb25nIG1heF9saXZlX21lc3NhZ2VzX3VuaXhfZmRzOyAgICAgICAgICAgIC8qKjwgTWF4IHRvdGFsIHVuaXggZmRzIG9mIHJlY2VpdmVkIG1lc3NhZ2VzLiAqLworCisgIERCdXNDb3VudGVyICpsaXZlX21lc3NhZ2VzOyAgICAgICAgICAgICAgICAgLyoqPCBDb3VudGVyIGZvciBzaXplL3VuaXggZmRzIG9mIGFsbCBsaXZlIG1lc3NhZ2VzLiAqLworCisgIGNoYXIgKmFkZHJlc3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBBZGRyZXNzIG9mIHRoZSBzZXJ2ZXIgd2UgYXJlIGNvbm5lY3RpbmcgdG8gKCNOVUxMIGZvciB0aGUgc2VydmVyIHNpZGUgb2YgYSB0cmFuc3BvcnQpICovCisKKyAgY2hhciAqZXhwZWN0ZWRfZ3VpZDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEdVSUQgd2UgZXhwZWN0IHRoZSBzZXJ2ZXIgdG8gaGF2ZSwgI05VTEwgb24gc2VydmVyIHNpZGUgb3IgaWYgd2UgZG9uJ3QgaGF2ZSBhbiBleHBlY3RhdGlvbiAqLworICAKKyAgREJ1c0FsbG93VW5peFVzZXJGdW5jdGlvbiB1bml4X3VzZXJfZnVuY3Rpb247IC8qKjwgRnVuY3Rpb24gZm9yIGNoZWNraW5nIHdoZXRoZXIgYSB1c2VyIGlzIGF1dGhvcml6ZWQuICovCisgIHZvaWQgKnVuaXhfdXNlcl9kYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IERhdGEgZm9yIHVuaXhfdXNlcl9mdW5jdGlvbiAqLworICAKKyAgREJ1c0ZyZWVGdW5jdGlvbiBmcmVlX3VuaXhfdXNlcl9kYXRhOyAgICAgICAgIC8qKjwgRnVuY3Rpb24gdG8gZnJlZSB1bml4X3VzZXJfZGF0YSAqLworCisgIERCdXNBbGxvd1dpbmRvd3NVc2VyRnVuY3Rpb24gd2luZG93c191c2VyX2Z1bmN0aW9uOyAvKio8IEZ1bmN0aW9uIGZvciBjaGVja2luZyB3aGV0aGVyIGEgdXNlciBpcyBhdXRob3JpemVkLiAqLworICB2b2lkICp3aW5kb3dzX3VzZXJfZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEYXRhIGZvciB3aW5kb3dzX3VzZXJfZnVuY3Rpb24gKi8KKyAgCisgIERCdXNGcmVlRnVuY3Rpb24gZnJlZV93aW5kb3dzX3VzZXJfZGF0YTsgICAgICAgICAgICAvKio8IEZ1bmN0aW9uIHRvIGZyZWUgd2luZG93c191c2VyX2RhdGEgKi8KKyAgCisgIHVuc2lnbmVkIGludCBkaXNjb25uZWN0ZWQgOiAxOyAgICAgICAgICAgICAgLyoqPCAjVFJVRSBpZiB3ZSBhcmUgZGlzY29ubmVjdGVkLiAqLworICB1bnNpZ25lZCBpbnQgYXV0aGVudGljYXRlZCA6IDE7ICAgICAgICAgICAgIC8qKjwgQ2FjaGUgb2YgYXV0aCBzdGF0ZTsgdXNlIF9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfYXV0aGVudGljYXRlZCgpIHRvIHF1ZXJ5IHZhbHVlICovCisgIHVuc2lnbmVkIGludCBzZW5kX2NyZWRlbnRpYWxzX3BlbmRpbmcgOiAxOyAgLyoqPCAjVFJVRSBpZiB3ZSBuZWVkIHRvIHNlbmQgY3JlZGVudGlhbHMgKi8KKyAgdW5zaWduZWQgaW50IHJlY2VpdmVfY3JlZGVudGlhbHNfcGVuZGluZyA6IDE7IC8qKjwgI1RSVUUgaWYgd2UgbmVlZCB0byByZWNlaXZlIGNyZWRlbnRpYWxzICovCisgIHVuc2lnbmVkIGludCBpc19zZXJ2ZXIgOiAxOyAgICAgICAgICAgICAgICAgLyoqPCAjVFJVRSBpZiBvbiB0aGUgc2VydmVyIHNpZGUgKi8KKyAgdW5zaWduZWQgaW50IHVudXNlZF9ieXRlc19yZWNvdmVyZWQgOiAxOyAgICAvKio8ICNUUlVFIGlmIHdlJ3ZlIHJlY292ZXJlZCB1bnVzZWQgYnl0ZXMgZnJvbSBhdXRoICovCisgIHVuc2lnbmVkIGludCBhbGxvd19hbm9ueW1vdXMgOiAxOyAgICAgICAgICAgLyoqPCAjVFJVRSBpZiBhbiBhbm9ueW1vdXMgY2xpZW50IGNhbiBjb25uZWN0ICovCit9OworCitkYnVzX2Jvb2xfdCBfZGJ1c190cmFuc3BvcnRfaW5pdF9iYXNlICAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNUcmFuc3BvcnRWVGFibGUgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICpzZXJ2ZXJfZ3VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICphZGRyZXNzKTsKK3ZvaWQgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9maW5hbGl6ZV9iYXNlIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICp0cmFuc3BvcnQpOworCisKK3R5cGVkZWYgZW51bQoreworICBEQlVTX1RSQU5TUE9SVF9PUEVOX05PVF9IQU5ETEVELCAgICAvKio8IHdlIGFyZW4ndCBpbiBjaGFyZ2Ugb2YgdGhpcyBhZGRyZXNzIHR5cGUgKi8KKyAgREJVU19UUkFOU1BPUlRfT1BFTl9PSywgICAgICAgICAgICAgLyoqPCB3ZSBzZXQgdXAgdGhlIGxpc3RlbiAqLworICBEQlVTX1RSQU5TUE9SVF9PUEVOX0JBRF9BRERSRVNTLCAgICAvKio8IG1hbGZvcm1lZCBhZGRyZXNzICovCisgIERCVVNfVFJBTlNQT1JUX09QRU5fRElEX05PVF9DT05ORUNUIC8qKjwgd2VsbC1mb3JtZWQgYWRkcmVzcyBidXQgZmFpbGVkIHRvIHNldCBpdCB1cCAqLworfSBEQnVzVHJhbnNwb3J0T3BlblJlc3VsdDsKKworREJ1c1RyYW5zcG9ydE9wZW5SZXN1bHQgX2RidXNfdHJhbnNwb3J0X29wZW5fcGxhdGZvcm1fc3BlY2lmaWMgKERCdXNBZGRyZXNzRW50cnkgICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHJhbnNwb3J0ICAgICoqdHJhbnNwb3J0X3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKKworI2RlZmluZSBEQlVTX1RSQU5TUE9SVF9DQU5fU0VORF9VTklYX0ZEKHgpICAgICAgXAorICBfZGJ1c19hdXRoX2dldF91bml4X2ZkX25lZ290aWF0ZWQoKHgpLT5hdXRoKQorCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19UUkFOU1BPUlRfUFJPVEVDVEVEX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLXRyYW5zcG9ydC1zb2NrZXQuYyBiL2RidXMvZGJ1cy9kYnVzLXRyYW5zcG9ydC1zb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDRkMDBhCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtdHJhbnNwb3J0LXNvY2tldC5jCkBAIC0wLDAgKzEsMTQzOCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXRyYW5zcG9ydC1zb2NrZXQuYyAgU29ja2V0IHN1YmNsYXNzZXMgb2YgREJ1c1RyYW5zcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImRidXMtbm9uY2UuaCIKKyNpbmNsdWRlICJkYnVzLXRyYW5zcG9ydC1zb2NrZXQuaCIKKyNpbmNsdWRlICJkYnVzLXRyYW5zcG9ydC1wcm90ZWN0ZWQuaCIKKyNpbmNsdWRlICJkYnVzLXdhdGNoLmgiCisjaW5jbHVkZSAiZGJ1cy1jcmVkZW50aWFscy5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzVHJhbnNwb3J0U29ja2V0IERCdXNUcmFuc3BvcnQgaW1wbGVtZW50YXRpb25zIGZvciBzb2NrZXRzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgREJ1c1RyYW5zcG9ydCBvbiBzb2NrZXRzCisgKgorICogQHsKKyAqLworCisvKioKKyAqIE9wYXF1ZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgc29ja2V0IGZpbGUgZGVzY3JpcHRvciB0cmFuc3BvcnQuCisgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNUcmFuc3BvcnRTb2NrZXQgREJ1c1RyYW5zcG9ydFNvY2tldDsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIERCdXNUcmFuc3BvcnRTb2NrZXQuIEFsbCBtZW1iZXJzIGFyZSBwcml2YXRlLgorICovCitzdHJ1Y3QgREJ1c1RyYW5zcG9ydFNvY2tldAoreworICBEQnVzVHJhbnNwb3J0IGJhc2U7ICAgICAgICAgICAgICAgICAgIC8qKjwgUGFyZW50IGluc3RhbmNlICovCisgIGludCBmZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBGaWxlIGRlc2NyaXB0b3IuICovCisgIERCdXNXYXRjaCAqcmVhZF93YXRjaDsgICAgICAgICAgICAgICAgLyoqPCBXYXRjaCBmb3IgcmVhZGFiaWxpdHkuICovCisgIERCdXNXYXRjaCAqd3JpdGVfd2F0Y2g7ICAgICAgICAgICAgICAgLyoqPCBXYXRjaCBmb3Igd3JpdGFiaWxpdHkuICovCisKKyAgaW50IG1heF9ieXRlc19yZWFkX3Blcl9pdGVyYXRpb247ICAgICAvKio8IFRvIGF2b2lkIGJsb2NraW5nIHRvbyBsb25nLiAqLworICBpbnQgbWF4X2J5dGVzX3dyaXR0ZW5fcGVyX2l0ZXJhdGlvbjsgIC8qKjwgVG8gYXZvaWQgYmxvY2tpbmcgdG9vIGxvbmcuICovCisKKyAgaW50IG1lc3NhZ2VfYnl0ZXNfd3JpdHRlbjsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBieXRlcyBvZiBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBvdXRnb2luZyBtZXNzYWdlIHRoYXQgaGF2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgYmVlbiB3cml0dGVuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBEQnVzU3RyaW5nIGVuY29kZWRfb3V0Z29pbmc7ICAgICAgICAgIC8qKjwgRW5jb2RlZCB2ZXJzaW9uIG9mIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIG91dGdvaW5nIG1lc3NhZ2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIERCdXNTdHJpbmcgZW5jb2RlZF9pbmNvbWluZzsgICAgICAgICAgLyoqPCBFbmNvZGVkIHZlcnNpb24gb2YgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgaW5jb21pbmcgZGF0YS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK307CisKK3N0YXRpYyB2b2lkCitmcmVlX3dhdGNoZXMgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqc29ja2V0X3RyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0KikgdHJhbnNwb3J0OworCisgIF9kYnVzX3ZlcmJvc2UgKCJzdGFydFxuIik7CisgIAorICBpZiAoc29ja2V0X3RyYW5zcG9ydC0+cmVhZF93YXRjaCkKKyAgICB7CisgICAgICBpZiAodHJhbnNwb3J0LT5jb25uZWN0aW9uKQorICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlbW92ZV93YXRjaF91bmxvY2tlZCAodHJhbnNwb3J0LT5jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X3RyYW5zcG9ydC0+cmVhZF93YXRjaCk7CisgICAgICBfZGJ1c193YXRjaF9pbnZhbGlkYXRlIChzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoKTsKKyAgICAgIF9kYnVzX3dhdGNoX3VucmVmIChzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoKTsKKyAgICAgIHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2ggPSBOVUxMOworICAgIH0KKworICBpZiAoc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2gpCisgICAgeworICAgICAgaWYgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbikKKyAgICAgICAgX2RidXNfY29ubmVjdGlvbl9yZW1vdmVfd2F0Y2hfdW5sb2NrZWQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF90cmFuc3BvcnQtPndyaXRlX3dhdGNoKTsKKyAgICAgIF9kYnVzX3dhdGNoX2ludmFsaWRhdGUgKHNvY2tldF90cmFuc3BvcnQtPndyaXRlX3dhdGNoKTsKKyAgICAgIF9kYnVzX3dhdGNoX3VucmVmIChzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCk7CisgICAgICBzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCA9IE5VTEw7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJlbmRcbiIpOworfQorCitzdGF0aWMgdm9pZAorc29ja2V0X2ZpbmFsaXplIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIERCdXNUcmFuc3BvcnRTb2NrZXQgKnNvY2tldF90cmFuc3BvcnQgPSAoREJ1c1RyYW5zcG9ydFNvY2tldCopIHRyYW5zcG9ydDsKKworICBfZGJ1c192ZXJib3NlICgiXG4iKTsKKyAgCisgIGZyZWVfd2F0Y2hlcyAodHJhbnNwb3J0KTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfb3V0Z29pbmcpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfaW5jb21pbmcpOworICAKKyAgX2RidXNfdHJhbnNwb3J0X2ZpbmFsaXplX2Jhc2UgKHRyYW5zcG9ydCk7CisKKyAgX2RidXNfYXNzZXJ0IChzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoID09IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHNvY2tldF90cmFuc3BvcnQtPndyaXRlX3dhdGNoID09IE5VTEwpOworICAKKyAgZGJ1c19mcmVlICh0cmFuc3BvcnQpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfd3JpdGVfd2F0Y2ggKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqc29ja2V0X3RyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0KikgdHJhbnNwb3J0OworICBkYnVzX2Jvb2xfdCBuZWVkZWQ7CisKKyAgaWYgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbiA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBpZiAodHJhbnNwb3J0LT5kaXNjb25uZWN0ZWQpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCA9PSBOVUxMKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIAorICBfZGJ1c190cmFuc3BvcnRfcmVmICh0cmFuc3BvcnQpOworCisgIGlmIChfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2F1dGhlbnRpY2F0ZWQgKHRyYW5zcG9ydCkpCisgICAgbmVlZGVkID0gX2RidXNfY29ubmVjdGlvbl9oYXNfbWVzc2FnZXNfdG9fc2VuZF91bmxvY2tlZCAodHJhbnNwb3J0LT5jb25uZWN0aW9uKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICh0cmFuc3BvcnQtPnNlbmRfY3JlZGVudGlhbHNfcGVuZGluZykKKyAgICAgICAgbmVlZGVkID0gVFJVRTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIERCdXNBdXRoU3RhdGUgYXV0aF9zdGF0ZTsKKyAgICAgICAgICAKKyAgICAgICAgICBhdXRoX3N0YXRlID0gX2RidXNfYXV0aF9kb193b3JrICh0cmFuc3BvcnQtPmF1dGgpOworICAgICAgICAgIAorICAgICAgICAgIC8qIElmIHdlIG5lZWQgbWVtb3J5IHdlIGluc3RhbGwgdGhlIHdyaXRlIHdhdGNoIGp1c3QgaW4gY2FzZSwKKyAgICAgICAgICAgKiBpZiB0aGVyZSdzIG5vIG5lZWQgZm9yIGl0LCBpdCB3aWxsIGdldCBkZS1pbnN0YWxsZWQKKyAgICAgICAgICAgKiBuZXh0IHRpbWUgd2UgdHJ5IHJlYWRpbmcuCisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKGF1dGhfc3RhdGUgPT0gREJVU19BVVRIX1NUQVRFX0hBVkVfQllURVNfVE9fU0VORCB8fAorICAgICAgICAgICAgICBhdXRoX3N0YXRlID09IERCVVNfQVVUSF9TVEFURV9XQUlUSU5HX0ZPUl9NRU1PUlkpCisgICAgICAgICAgICBuZWVkZWQgPSBUUlVFOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG5lZWRlZCA9IEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJjaGVja193cml0ZV93YXRjaCgpOiBuZWVkZWQgPSAlZCBvbiBjb25uZWN0aW9uICVwIHdhdGNoICVwIGZkID0gJWQgb3V0Z29pbmcgbWVzc2FnZXMgZXhpc3QgJWRcbiIsCisgICAgICAgICAgICAgICAgIG5lZWRlZCwgdHJhbnNwb3J0LT5jb25uZWN0aW9uLCBzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCwKKyAgICAgICAgICAgICAgICAgc29ja2V0X3RyYW5zcG9ydC0+ZmQsCisgICAgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25faGFzX21lc3NhZ2VzX3RvX3NlbmRfdW5sb2NrZWQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbikpOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fdG9nZ2xlX3dhdGNoX3VubG9ja2VkICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCk7CisKKyAgX2RidXNfdHJhbnNwb3J0X3VucmVmICh0cmFuc3BvcnQpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfcmVhZF93YXRjaCAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBEQnVzVHJhbnNwb3J0U29ja2V0ICpzb2NrZXRfdHJhbnNwb3J0ID0gKERCdXNUcmFuc3BvcnRTb2NrZXQqKSB0cmFuc3BvcnQ7CisgIGRidXNfYm9vbF90IG5lZWRfcmVhZF93YXRjaDsKKworICBfZGJ1c192ZXJib3NlICgiZmQgPSAlZFxuIixzb2NrZXRfdHJhbnNwb3J0LT5mZCk7CisgIAorICBpZiAodHJhbnNwb3J0LT5jb25uZWN0aW9uID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGlmICh0cmFuc3BvcnQtPmRpc2Nvbm5lY3RlZCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2ggPT0gTlVMTCk7CisgICAgICByZXR1cm47CisgICAgfQorICAKKyAgX2RidXNfdHJhbnNwb3J0X3JlZiAodHJhbnNwb3J0KTsKKworICBpZiAoX2RidXNfdHJhbnNwb3J0X2dldF9pc19hdXRoZW50aWNhdGVkICh0cmFuc3BvcnQpKQorICAgIG5lZWRfcmVhZF93YXRjaCA9CisgICAgICAoX2RidXNfY291bnRlcl9nZXRfc2l6ZV92YWx1ZSAodHJhbnNwb3J0LT5saXZlX21lc3NhZ2VzKSA8IHRyYW5zcG9ydC0+bWF4X2xpdmVfbWVzc2FnZXNfc2l6ZSkgJiYKKyAgICAgIChfZGJ1c19jb3VudGVyX2dldF91bml4X2ZkX3ZhbHVlICh0cmFuc3BvcnQtPmxpdmVfbWVzc2FnZXMpIDwgdHJhbnNwb3J0LT5tYXhfbGl2ZV9tZXNzYWdlc191bml4X2Zkcyk7CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAodHJhbnNwb3J0LT5yZWNlaXZlX2NyZWRlbnRpYWxzX3BlbmRpbmcpCisgICAgICAgIG5lZWRfcmVhZF93YXRjaCA9IFRSVUU7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBUaGUgcmVhc29uIHRvIGRpc2FibGUgbmVlZF9yZWFkX3dhdGNoIHdoZW4gbm90IFdBSVRJTkdfRk9SX0lOUFVUCisgICAgICAgICAgICogaXMgdG8gYXZvaWQgc3Bpbm5pbmcgb24gdGhlIGZpbGUgZGVzY3JpcHRvciB3aGVuIHdlJ3JlIHdhaXRpbmcKKyAgICAgICAgICAgKiB0byB3cml0ZSBvciBmb3Igc29tZSBvdGhlciBwYXJ0IG9mIHRoZSBhdXRoIHByb2Nlc3MKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBEQnVzQXV0aFN0YXRlIGF1dGhfc3RhdGU7CisgICAgICAgICAgCisgICAgICAgICAgYXV0aF9zdGF0ZSA9IF9kYnVzX2F1dGhfZG9fd29yayAodHJhbnNwb3J0LT5hdXRoKTsKKworICAgICAgICAgIC8qIElmIHdlIG5lZWQgbWVtb3J5IHdlIGluc3RhbGwgdGhlIHJlYWQgd2F0Y2gganVzdCBpbiBjYXNlLAorICAgICAgICAgICAqIGlmIHRoZXJlJ3Mgbm8gbmVlZCBmb3IgaXQsIGl0IHdpbGwgZ2V0IGRlLWluc3RhbGxlZAorICAgICAgICAgICAqIG5leHQgdGltZSB3ZSB0cnkgcmVhZGluZy4gSWYgd2UncmUgYXV0aGVudGljYXRlZCB3ZQorICAgICAgICAgICAqIGluc3RhbGwgaXQgc2luY2Ugd2Ugbm9ybWFsbHkgaGF2ZSBpdCBpbnN0YWxsZWQgd2hpbGUKKyAgICAgICAgICAgKiBhdXRoZW50aWNhdGVkLgorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChhdXRoX3N0YXRlID09IERCVVNfQVVUSF9TVEFURV9XQUlUSU5HX0ZPUl9JTlBVVCB8fAorICAgICAgICAgICAgICBhdXRoX3N0YXRlID09IERCVVNfQVVUSF9TVEFURV9XQUlUSU5HX0ZPUl9NRU1PUlkgfHwKKyAgICAgICAgICAgICAgYXV0aF9zdGF0ZSA9PSBEQlVTX0FVVEhfU1RBVEVfQVVUSEVOVElDQVRFRCkKKyAgICAgICAgICAgIG5lZWRfcmVhZF93YXRjaCA9IFRSVUU7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbmVlZF9yZWFkX3dhdGNoID0gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIiAgc2V0dGluZyByZWFkIHdhdGNoIGVuYWJsZWQgPSAlZFxuIiwgbmVlZF9yZWFkX3dhdGNoKTsKKyAgX2RidXNfY29ubmVjdGlvbl90b2dnbGVfd2F0Y2hfdW5sb2NrZWQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3JlYWRfd2F0Y2gpOworCisgIF9kYnVzX3RyYW5zcG9ydF91bnJlZiAodHJhbnNwb3J0KTsKK30KKworc3RhdGljIHZvaWQKK2RvX2lvX2Vycm9yIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIF9kYnVzX3RyYW5zcG9ydF9yZWYgKHRyYW5zcG9ydCk7CisgIF9kYnVzX3RyYW5zcG9ydF9kaXNjb25uZWN0ICh0cmFuc3BvcnQpOworICBfZGJ1c190cmFuc3BvcnRfdW5yZWYgKHRyYW5zcG9ydCk7Cit9CisKKy8qIHJldHVybiB2YWx1ZSBpcyB3aGV0aGVyIHdlIHN1Y2Nlc3NmdWxseSByZWFkIGFueSBuZXcgZGF0YS4gKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorcmVhZF9kYXRhX2ludG9fYXV0aCAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAqb29tKQoreworICBEQnVzVHJhbnNwb3J0U29ja2V0ICpzb2NrZXRfdHJhbnNwb3J0ID0gKERCdXNUcmFuc3BvcnRTb2NrZXQqKSB0cmFuc3BvcnQ7CisgIERCdXNTdHJpbmcgKmJ1ZmZlcjsKKyAgaW50IGJ5dGVzX3JlYWQ7CisgIAorICAqb29tID0gRkFMU0U7CisKKyAgX2RidXNfYXV0aF9nZXRfYnVmZmVyICh0cmFuc3BvcnQtPmF1dGgsICZidWZmZXIpOworICAKKyAgYnl0ZXNfcmVhZCA9IF9kYnVzX3JlYWRfc29ja2V0IChzb2NrZXRfdHJhbnNwb3J0LT5mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIHNvY2tldF90cmFuc3BvcnQtPm1heF9ieXRlc19yZWFkX3Blcl9pdGVyYXRpb24pOworCisgIF9kYnVzX2F1dGhfcmV0dXJuX2J1ZmZlciAodHJhbnNwb3J0LT5hdXRoLCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfcmVhZCA+IDAgPyBieXRlc19yZWFkIDogMCk7CisKKyAgaWYgKGJ5dGVzX3JlYWQgPiAwKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgcmVhZCAlZCBieXRlcyBpbiBhdXRoIHBoYXNlXG4iLCBieXRlc19yZWFkKTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChieXRlc19yZWFkIDwgMCkKKyAgICB7CisgICAgICAvKiBFSU5UUiBhbHJlYWR5IGhhbmRsZWQgZm9yIHVzICovCisKKyAgICAgIGlmIChfZGJ1c19nZXRfaXNfZXJybm9fZW5vbWVtICgpKQorICAgICAgICB7CisgICAgICAgICAgKm9vbSA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX2dldF9pc19lcnJub19lYWdhaW5fb3JfZXdvdWxkYmxvY2sgKCkpCisgICAgICAgIDsgLyogZG8gbm90aGluZywganVzdCByZXR1cm4gRkFMU0UgYmVsb3cgKi8KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJFcnJvciByZWFkaW5nIGZyb20gcmVtb3RlIGFwcDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICAgICAgZG9faW9fZXJyb3IgKHRyYW5zcG9ydCk7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoYnl0ZXNfcmVhZCA9PSAwKTsKKyAgICAgIAorICAgICAgX2RidXNfdmVyYm9zZSAoIkRpc2Nvbm5lY3RlZCBmcm9tIHJlbW90ZSBhcHBcbiIpOworICAgICAgZG9faW9fZXJyb3IgKHRyYW5zcG9ydCk7CisKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9Cit9CisKKy8qIFJldHVybiB2YWx1ZSBpcyB3aGV0aGVyIHdlIHN1Y2Nlc3NmdWxseSB3cm90ZSBhbnkgYnl0ZXMgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAord3JpdGVfZGF0YV9mcm9tX2F1dGggKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqc29ja2V0X3RyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0KikgdHJhbnNwb3J0OworICBpbnQgYnl0ZXNfd3JpdHRlbjsKKyAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyOworCisgIGlmICghX2RidXNfYXV0aF9nZXRfYnl0ZXNfdG9fc2VuZCAodHJhbnNwb3J0LT5hdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIpKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGJ5dGVzX3dyaXR0ZW4gPSBfZGJ1c193cml0ZV9zb2NrZXQgKHNvY2tldF90cmFuc3BvcnQtPmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChidWZmZXIpKTsKKworICBpZiAoYnl0ZXNfd3JpdHRlbiA+IDApCisgICAgeworICAgICAgX2RidXNfYXV0aF9ieXRlc19zZW50ICh0cmFuc3BvcnQtPmF1dGgsIGJ5dGVzX3dyaXR0ZW4pOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChieXRlc193cml0dGVuIDwgMCkKKyAgICB7CisgICAgICAvKiBFSU5UUiBhbHJlYWR5IGhhbmRsZWQgZm9yIHVzICovCisgICAgICAKKyAgICAgIGlmIChfZGJ1c19nZXRfaXNfZXJybm9fZWFnYWluX29yX2V3b3VsZGJsb2NrICgpKQorICAgICAgICA7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRXJyb3Igd3JpdGluZyB0byByZW1vdGUgYXBwOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICAgICAgICBkb19pb19lcnJvciAodHJhbnNwb3J0KTsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qIEZBTFNFIG9uIE9PTSAqLworc3RhdGljIGRidXNfYm9vbF90CitleGNoYW5nZV9jcmVkZW50aWFscyAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgIGRvX3JlYWRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgZG9fd3JpdGluZykKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqc29ja2V0X3RyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0KikgdHJhbnNwb3J0OworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgX2RidXNfdmVyYm9zZSAoImV4Y2hhbmdlX2NyZWRlbnRpYWxzOiBkb19yZWFkaW5nID0gJWQsIGRvX3dyaXRpbmcgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGRvX3JlYWRpbmcsIGRvX3dyaXRpbmcpOworCisgIGlmIChkb193cml0aW5nICYmIHRyYW5zcG9ydC0+c2VuZF9jcmVkZW50aWFsc19wZW5kaW5nKQorICAgIHsKKyAgICAgIGlmIChfZGJ1c19zZW5kX2NyZWRlbnRpYWxzX3NvY2tldCAoc29ja2V0X3RyYW5zcG9ydC0+ZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICB0cmFuc3BvcnQtPnNlbmRfY3JlZGVudGlhbHNfcGVuZGluZyA9IEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIHdyaXRlIGNyZWRlbnRpYWxzOiAlc1xuIiwgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgIGRvX2lvX2Vycm9yICh0cmFuc3BvcnQpOworICAgICAgICB9CisgICAgfQorICAKKyAgaWYgKGRvX3JlYWRpbmcgJiYgdHJhbnNwb3J0LT5yZWNlaXZlX2NyZWRlbnRpYWxzX3BlbmRpbmcpCisgICAgeworICAgICAgLyogRklYTUUgdGhpcyBjYW4gZmFpbCBkdWUgdG8gSU8gZXJyb3IgX29yXyBPT00sIGJyb2tlbgorICAgICAgICogKHNvbWV3aGF0IHRyaWNreSB0byBmaXggc2luY2UgdGhlIE9PTSBlcnJvciBjYW4gYmUgc2V0IGFmdGVyCisgICAgICAgKiB3ZSBhbHJlYWR5IHJlYWQgdGhlIGNyZWRlbnRpYWxzIGJ5dGUsIHNvIGJhc2ljYWxseSB3ZSBuZWVkIHRvCisgICAgICAgKiBzZXBhcmF0ZSByZWFkaW5nIHRoZSBieXRlIGFuZCBzdG9yaW5nIGl0IGluIHRoZQorICAgICAgICogdHJhbnNwb3J0LT5jcmVkZW50aWFscykuIERvZXMgbm90IHJlYWxseSBtYXR0ZXIgZm9yIG5vdworICAgICAgICogYmVjYXVzZSBzdG9yaW5nIGluIGNyZWRlbnRpYWxzIG5ldmVyIGFjdHVhbGx5IGZhaWxzIG9uIHVuaXguCisgICAgICAgKi8gICAgICAKKyAgICAgIGlmIChfZGJ1c19yZWFkX2NyZWRlbnRpYWxzX3NvY2tldCAoc29ja2V0X3RyYW5zcG9ydC0+ZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC0+Y3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICB0cmFuc3BvcnQtPnJlY2VpdmVfY3JlZGVudGlhbHNfcGVuZGluZyA9IEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIHJlYWQgY3JlZGVudGlhbHMgJXNcbiIsIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICBkb19pb19lcnJvciAodHJhbnNwb3J0KTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoISh0cmFuc3BvcnQtPnNlbmRfY3JlZGVudGlhbHNfcGVuZGluZyB8fAorICAgICAgICB0cmFuc3BvcnQtPnJlY2VpdmVfY3JlZGVudGlhbHNfcGVuZGluZykpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19hdXRoX3NldF9jcmVkZW50aWFscyAodHJhbnNwb3J0LT5hdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LT5jcmVkZW50aWFscykpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZG9fYXV0aGVudGljYXRpb24gKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICBkb19yZWFkaW5nLAorICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgIGRvX3dyaXRpbmcsCisJCSAgIGRidXNfYm9vbF90ICAgKmF1dGhfY29tcGxldGVkKQoreworICBkYnVzX2Jvb2xfdCBvb207CisgIGRidXNfYm9vbF90IG9yaWdfYXV0aF9zdGF0ZTsKKworICBvb20gPSBGQUxTRTsKKyAgCisgIG9yaWdfYXV0aF9zdGF0ZSA9IF9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfYXV0aGVudGljYXRlZCAodHJhbnNwb3J0KTsKKworICAvKiBUaGlzIGlzIGVzc2VudGlhbCB0byBhdm9pZCB0aGUgY2hlY2tfd3JpdGVfd2F0Y2goKSBhdCB0aGUgZW5kLAorICAgKiB3ZSBkb24ndCB3YW50IHRvIGFkZCBhIHdyaXRlIHdhdGNoIGluIGRvX2l0ZXJhdGlvbiBiZWZvcmUKKyAgICogd2UgdHJ5IHdyaXRpbmcgYW5kIGdldCBFQUdBSU4KKyAgICovCisgIGlmIChvcmlnX2F1dGhfc3RhdGUpCisgICAgeworICAgICAgaWYgKGF1dGhfY29tcGxldGVkKQorICAgICAgICAqYXV0aF9jb21wbGV0ZWQgPSBGQUxTRTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgCisgIF9kYnVzX3RyYW5zcG9ydF9yZWYgKHRyYW5zcG9ydCk7CisgIAorICB3aGlsZSAoIV9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfYXV0aGVudGljYXRlZCAodHJhbnNwb3J0KSAmJgorICAgICAgICAgX2RidXNfdHJhbnNwb3J0X2dldF9pc19jb25uZWN0ZWQgKHRyYW5zcG9ydCkpCisgICAgeyAgICAgIAorICAgICAgaWYgKCFleGNoYW5nZV9jcmVkZW50aWFscyAodHJhbnNwb3J0LCBkb19yZWFkaW5nLCBkb193cml0aW5nKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIE9PTSAqLworICAgICAgICAgIG9vbSA9IFRSVUU7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKHRyYW5zcG9ydC0+c2VuZF9jcmVkZW50aWFsc19wZW5kaW5nIHx8CisgICAgICAgICAgdHJhbnNwb3J0LT5yZWNlaXZlX2NyZWRlbnRpYWxzX3BlbmRpbmcpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgic2VuZF9jcmVkZW50aWFsc19wZW5kaW5nID0gJWQgcmVjZWl2ZV9jcmVkZW50aWFsc19wZW5kaW5nID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LT5zZW5kX2NyZWRlbnRpYWxzX3BlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LT5yZWNlaXZlX2NyZWRlbnRpYWxzX3BlbmRpbmcpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyNkZWZpbmUgVFJBTlNQT1JUX1NJREUodCkgKCh0KS0+aXNfc2VydmVyID8gInNlcnZlciIgOiAiY2xpZW50IikKKyAgICAgIHN3aXRjaCAoX2RidXNfYXV0aF9kb193b3JrICh0cmFuc3BvcnQtPmF1dGgpKQorICAgICAgICB7CisgICAgICAgIGNhc2UgREJVU19BVVRIX1NUQVRFX1dBSVRJTkdfRk9SX0lOUFVUOgorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgJXMgYXV0aCBzdGF0ZTogd2FpdGluZyBmb3IgaW5wdXRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNQT1JUX1NJREUgKHRyYW5zcG9ydCkpOworICAgICAgICAgIGlmICghZG9fcmVhZGluZyB8fCAhcmVhZF9kYXRhX2ludG9fYXV0aCAodHJhbnNwb3J0LCAmb29tKSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICAgIGNhc2UgREJVU19BVVRIX1NUQVRFX1dBSVRJTkdfRk9SX01FTU9SWToKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICVzIGF1dGggc3RhdGU6IHdhaXRpbmcgZm9yIG1lbW9yeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1BPUlRfU0lERSAodHJhbnNwb3J0KSk7CisgICAgICAgICAgb29tID0gVFJVRTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgICBjYXNlIERCVVNfQVVUSF9TVEFURV9IQVZFX0JZVEVTX1RPX1NFTkQ6CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAlcyBhdXRoIHN0YXRlOiBieXRlcyB0byBzZW5kXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUE9SVF9TSURFICh0cmFuc3BvcnQpKTsKKyAgICAgICAgICBpZiAoIWRvX3dyaXRpbmcgfHwgIXdyaXRlX2RhdGFfZnJvbV9hdXRoICh0cmFuc3BvcnQpKQorICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgICAgY2FzZSBEQlVTX0FVVEhfU1RBVEVfTkVFRF9ESVNDT05ORUNUOgorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgJXMgYXV0aCBzdGF0ZTogbmVlZCB0byBkaXNjb25uZWN0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUE9SVF9TSURFICh0cmFuc3BvcnQpKTsKKyAgICAgICAgICBkb19pb19lcnJvciAodHJhbnNwb3J0KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgICBjYXNlIERCVVNfQVVUSF9TVEFURV9BVVRIRU5USUNBVEVEOgorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgJXMgYXV0aCBzdGF0ZTogYXV0aGVudGljYXRlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1BPUlRfU0lERSAodHJhbnNwb3J0KSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyBvdXQ6CisgIGlmIChhdXRoX2NvbXBsZXRlZCkKKyAgICAqYXV0aF9jb21wbGV0ZWQgPSAob3JpZ19hdXRoX3N0YXRlICE9IF9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfYXV0aGVudGljYXRlZCAodHJhbnNwb3J0KSk7CisgIAorICBjaGVja19yZWFkX3dhdGNoICh0cmFuc3BvcnQpOworICBjaGVja193cml0ZV93YXRjaCAodHJhbnNwb3J0KTsKKyAgX2RidXNfdHJhbnNwb3J0X3VucmVmICh0cmFuc3BvcnQpOworCisgIGlmIChvb20pCisgICAgcmV0dXJuIEZBTFNFOworICBlbHNlCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIHJldHVybnMgZmFsc2Ugb24gb29tICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2RvX3dyaXRpbmcgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgaW50IHRvdGFsOworICBEQnVzVHJhbnNwb3J0U29ja2V0ICpzb2NrZXRfdHJhbnNwb3J0ID0gKERCdXNUcmFuc3BvcnRTb2NrZXQqKSB0cmFuc3BvcnQ7CisgIGRidXNfYm9vbF90IG9vbTsKKyAgCisgIC8qIE5vIG1lc3NhZ2VzIHdpdGhvdXQgYXV0aGVudGljYXRpb24hICovCisgIGlmICghX2RidXNfdHJhbnNwb3J0X2dldF9pc19hdXRoZW50aWNhdGVkICh0cmFuc3BvcnQpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJOb3QgYXV0aGVudGljYXRlZCwgbm90IHdyaXRpbmcgYW55dGhpbmdcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmICh0cmFuc3BvcnQtPmRpc2Nvbm5lY3RlZCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiTm90IGNvbm5lY3RlZCwgbm90IHdyaXRpbmcgYW55dGhpbmdcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisjaWYgMQorICBfZGJ1c192ZXJib3NlICgiZG9fd3JpdGluZygpLCBoYXZlX21lc3NhZ2VzID0gJWQsIGZkID0gJWRcbiIsCisgICAgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25faGFzX21lc3NhZ2VzX3RvX3NlbmRfdW5sb2NrZWQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbiksCisgICAgICAgICAgICAgICAgIHNvY2tldF90cmFuc3BvcnQtPmZkKTsKKyNlbmRpZgorICAKKyAgb29tID0gRkFMU0U7CisgIHRvdGFsID0gMDsKKworICB3aGlsZSAoIXRyYW5zcG9ydC0+ZGlzY29ubmVjdGVkICYmCisgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2hhc19tZXNzYWdlc190b19zZW5kX3VubG9ja2VkICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIGludCBieXRlc193cml0dGVuOworICAgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgICAgICBjb25zdCBEQnVzU3RyaW5nICpoZWFkZXI7CisgICAgICBjb25zdCBEQnVzU3RyaW5nICpib2R5OworICAgICAgaW50IGhlYWRlcl9sZW4sIGJvZHlfbGVuOworICAgICAgaW50IHRvdGFsX2J5dGVzX3RvX3dyaXRlOworICAgICAgCisgICAgICBpZiAodG90YWwgPiBzb2NrZXRfdHJhbnNwb3J0LT5tYXhfYnl0ZXNfd3JpdHRlbl9wZXJfaXRlcmF0aW9uKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVkIGJ5dGVzIGV4Y2VlZHMgJWQgYnl0ZXMgd3JpdHRlbiBwZXIgaXRlcmF0aW9uLCByZXR1cm5pbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwsIHNvY2tldF90cmFuc3BvcnQtPm1heF9ieXRlc193cml0dGVuX3Blcl9pdGVyYXRpb24pOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAKKyAgICAgIG1lc3NhZ2UgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9tZXNzYWdlX3RvX3NlbmQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbik7CisgICAgICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UgIT0gTlVMTCk7CisgICAgICBkYnVzX21lc3NhZ2VfbG9jayAobWVzc2FnZSk7CisKKyNpZiAwCisgICAgICBfZGJ1c192ZXJib3NlICgid3JpdGluZyBtZXNzYWdlICVwXG4iLCBtZXNzYWdlKTsKKyNlbmRpZgorICAgICAgCisgICAgICBfZGJ1c19tZXNzYWdlX2dldF9uZXR3b3JrX2RhdGEgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWFkZXIsICZib2R5KTsKKworICAgICAgaGVhZGVyX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChoZWFkZXIpOworICAgICAgYm9keV9sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYm9keSk7CisKKyAgICAgIGlmIChfZGJ1c19hdXRoX25lZWRzX2VuY29kaW5nICh0cmFuc3BvcnQtPmF1dGgpKQorICAgICAgICB7CisgICAgICAgICAgLyogRG9lcyBmZCBwYXNzaW5nIGV2ZW4gbWFrZSBzZW5zZSB3aXRoIGVuY29kZWQgZGF0YT8gKi8KKyAgICAgICAgICBfZGJ1c19hc3NlcnQoIURCVVNfVFJBTlNQT1JUX0NBTl9TRU5EX1VOSVhfRkQodHJhbnNwb3J0KSk7CisKKyAgICAgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzb2NrZXRfdHJhbnNwb3J0LT5lbmNvZGVkX291dGdvaW5nKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIV9kYnVzX2F1dGhfZW5jb2RlX2RhdGEgKHRyYW5zcG9ydC0+YXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIsICZzb2NrZXRfdHJhbnNwb3J0LT5lbmNvZGVkX291dGdvaW5nKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBvb20gPSBUUlVFOworICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19hdXRoX2VuY29kZV9kYXRhICh0cmFuc3BvcnQtPmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keSwgJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfb3V0Z29pbmcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9vdXRnb2luZywgMCk7CisgICAgICAgICAgICAgICAgICBvb20gPSBUUlVFOworICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIHRvdGFsX2J5dGVzX3RvX3dyaXRlID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzb2NrZXRfdHJhbnNwb3J0LT5lbmNvZGVkX291dGdvaW5nKTsKKworI2lmIDAKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiZW5jb2RlZCBtZXNzYWdlIGlzICVkIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2J5dGVzX3RvX3dyaXRlKTsKKyNlbmRpZgorICAgICAgICAgIAorICAgICAgICAgIGJ5dGVzX3dyaXR0ZW4gPQorICAgICAgICAgICAgX2RidXNfd3JpdGVfc29ja2V0IChzb2NrZXRfdHJhbnNwb3J0LT5mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfb3V0Z29pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfYnl0ZXNfdG9fd3JpdGUgLSBzb2NrZXRfdHJhbnNwb3J0LT5tZXNzYWdlX2J5dGVzX3dyaXR0ZW4pOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB0b3RhbF9ieXRlc190b193cml0ZSA9IGhlYWRlcl9sZW4gKyBib2R5X2xlbjsKKworI2lmIDAKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgibWVzc2FnZSBpcyAlZCBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9ieXRlc190b193cml0ZSk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgICAgICAgICAgaWYgKHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiA8PSAwICYmIERCVVNfVFJBTlNQT1JUX0NBTl9TRU5EX1VOSVhfRkQodHJhbnNwb3J0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogU2VuZCB0aGUgZmRzIGFsb25nIHdpdGggdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG1lc3NhZ2UgKi8KKyAgICAgICAgICAgICAgY29uc3QgaW50ICp1bml4X2ZkczsKKyAgICAgICAgICAgICAgdW5zaWduZWQgbjsKKworICAgICAgICAgICAgICBfZGJ1c19tZXNzYWdlX2dldF91bml4X2ZkcyhtZXNzYWdlLCAmdW5peF9mZHMsICZuKTsKKworICAgICAgICAgICAgICBieXRlc193cml0dGVuID0KKyAgICAgICAgICAgICAgICBfZGJ1c193cml0ZV9zb2NrZXRfd2l0aF91bml4X2Zkc190d28gKHNvY2tldF90cmFuc3BvcnQtPmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X3RyYW5zcG9ydC0+bWVzc2FnZV9ieXRlc193cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2xlbiAtIHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBib2R5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXhfZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbik7CisKKyAgICAgICAgICAgICAgaWYgKGJ5dGVzX3dyaXR0ZW4gPiAwICYmIG4gPiAwKQorICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UoIldyb3RlICVpIHVuaXggZmRzXG4iLCBuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiA8IGhlYWRlcl9sZW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgYnl0ZXNfd3JpdHRlbiA9CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3dyaXRlX3NvY2tldF90d28gKHNvY2tldF90cmFuc3BvcnQtPmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2xlbiAtIHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgYm9keV9sZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGJ5dGVzX3dyaXR0ZW4gPQorICAgICAgICAgICAgICAgICAgICBfZGJ1c193cml0ZV9zb2NrZXQgKHNvY2tldF90cmFuc3BvcnQtPmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiAtIGhlYWRlcl9sZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlfbGVuIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc29ja2V0X3RyYW5zcG9ydC0+bWVzc2FnZV9ieXRlc193cml0dGVuIC0gaGVhZGVyX2xlbikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBpZiAoYnl0ZXNfd3JpdHRlbiA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBFSU5UUiBhbHJlYWR5IGhhbmRsZWQgZm9yIHVzICovCisgICAgICAgICAgCisgICAgICAgICAgLyogRm9yIHNvbWUgZGlzY3Vzc2lvbiBvZiB3aHkgd2UgYWxzbyBpZ25vcmUgRVBJUEUgaGVyZSwgc2VlCisgICAgICAgICAgICogaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9hcmNoaXZlcy9kYnVzLzIwMDgtTWFyY2gvMDA5NTI2Lmh0bWwKKyAgICAgICAgICAgKi8KKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoX2RidXNfZ2V0X2lzX2Vycm5vX2VhZ2Fpbl9vcl9ld291bGRibG9jayAoKSB8fCBfZGJ1c19nZXRfaXNfZXJybm9fZXBpcGUgKCkpCisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJFcnJvciB3cml0aW5nIHRvIHJlbW90ZSBhcHA6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICAgICAgICAgICAgZG9faW9fZXJyb3IgKHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiIHdyb3RlICVkIGJ5dGVzIG9mICVkXG4iLCBieXRlc193cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2J5dGVzX3RvX3dyaXRlKTsKKyAgICAgICAgICAKKyAgICAgICAgICB0b3RhbCArPSBieXRlc193cml0dGVuOworICAgICAgICAgIHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiArPSBieXRlc193cml0dGVuOworCisgICAgICAgICAgX2RidXNfYXNzZXJ0IChzb2NrZXRfdHJhbnNwb3J0LT5tZXNzYWdlX2J5dGVzX3dyaXR0ZW4gPD0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2J5dGVzX3RvX3dyaXRlKTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoc29ja2V0X3RyYW5zcG9ydC0+bWVzc2FnZV9ieXRlc193cml0dGVuID09IHRvdGFsX2J5dGVzX3RvX3dyaXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBzb2NrZXRfdHJhbnNwb3J0LT5tZXNzYWdlX2J5dGVzX3dyaXR0ZW4gPSAwOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfb3V0Z29pbmcsIDApOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfY29tcGFjdCAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfb3V0Z29pbmcsIDIwNDgpOworCisgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fbWVzc2FnZV9zZW50X3VubG9ja2VkICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworIG91dDoKKyAgaWYgKG9vbSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyogcmV0dXJucyBmYWxzZSBvbiBvdXQtb2YtbWVtb3J5ICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2RvX3JlYWRpbmcgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqc29ja2V0X3RyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0KikgdHJhbnNwb3J0OworICBEQnVzU3RyaW5nICpidWZmZXI7CisgIGludCBieXRlc19yZWFkOworICBpbnQgdG90YWw7CisgIGRidXNfYm9vbF90IG9vbTsKKworICBfZGJ1c192ZXJib3NlICgiZmQgPSAlZFxuIixzb2NrZXRfdHJhbnNwb3J0LT5mZCk7CisgIAorICAvKiBObyBtZXNzYWdlcyB3aXRob3V0IGF1dGhlbnRpY2F0aW9uISAqLworICBpZiAoIV9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfYXV0aGVudGljYXRlZCAodHJhbnNwb3J0KSkKKyAgICByZXR1cm4gVFJVRTsKKworICBvb20gPSBGQUxTRTsKKyAgCisgIHRvdGFsID0gMDsKKworIGFnYWluOgorICAKKyAgLyogU2VlIGlmIHdlJ3ZlIGV4Y2VlZGVkIG1heCBtZXNzYWdlcyBhbmQgbmVlZCB0byBkaXNhYmxlIHJlYWRpbmcgKi8KKyAgY2hlY2tfcmVhZF93YXRjaCAodHJhbnNwb3J0KTsKKyAgCisgIGlmICh0b3RhbCA+IHNvY2tldF90cmFuc3BvcnQtPm1heF9ieXRlc19yZWFkX3Blcl9pdGVyYXRpb24pCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIiVkIGJ5dGVzIGV4Y2VlZHMgJWQgYnl0ZXMgcmVhZCBwZXIgaXRlcmF0aW9uLCByZXR1cm5pbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICB0b3RhbCwgc29ja2V0X3RyYW5zcG9ydC0+bWF4X2J5dGVzX3JlYWRfcGVyX2l0ZXJhdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoICE9IE5VTEwgfHwKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQtPmRpc2Nvbm5lY3RlZCk7CisgIAorICBpZiAodHJhbnNwb3J0LT5kaXNjb25uZWN0ZWQpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFkYnVzX3dhdGNoX2dldF9lbmFibGVkIChzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoKSkKKyAgICByZXR1cm4gVFJVRTsKKyAgCisgIGlmIChfZGJ1c19hdXRoX25lZWRzX2RlY29kaW5nICh0cmFuc3BvcnQtPmF1dGgpKQorICAgIHsKKyAgICAgIC8qIERvZXMgZmQgcGFzc2luZyBldmVuIG1ha2Ugc2Vuc2Ugd2l0aCBlbmNvZGVkIGRhdGE/ICovCisgICAgICBfZGJ1c19hc3NlcnQoIURCVVNfVFJBTlNQT1JUX0NBTl9TRU5EX1VOSVhfRkQodHJhbnNwb3J0KSk7CisKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfaW5jb21pbmcpID4gMCkKKyAgICAgICAgYnl0ZXNfcmVhZCA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9pbmNvbWluZyk7CisgICAgICBlbHNlCisgICAgICAgIGJ5dGVzX3JlYWQgPSBfZGJ1c19yZWFkX3NvY2tldCAoc29ja2V0X3RyYW5zcG9ydC0+ZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfaW5jb21pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X3RyYW5zcG9ydC0+bWF4X2J5dGVzX3JlYWRfcGVyX2l0ZXJhdGlvbik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzb2NrZXRfdHJhbnNwb3J0LT5lbmNvZGVkX2luY29taW5nKSA9PQorICAgICAgICAgICAgICAgICAgICBieXRlc19yZWFkKTsKKyAgICAgIAorICAgICAgaWYgKGJ5dGVzX3JlYWQgPiAwKQorICAgICAgICB7CisgICAgICAgICAgaW50IG9yaWdfbGVuOworICAgICAgICAgIAorICAgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9idWZmZXIgKHRyYW5zcG9ydC0+bG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIpOworCisgICAgICAgICAgb3JpZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYnVmZmVyKTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoIV9kYnVzX2F1dGhfZGVjb2RlX2RhdGEgKHRyYW5zcG9ydC0+YXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb2NrZXRfdHJhbnNwb3J0LT5lbmNvZGVkX2luY29taW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIk91dCBvZiBtZW1vcnkgZGVjb2RpbmcgaW5jb21pbmcgZGF0YVxuIik7CisgICAgICAgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIgKHRyYW5zcG9ydC0+bG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYnVmZmVyKSAtIG9yaWdfbGVuKTsKKworICAgICAgICAgICAgICBvb20gPSBUUlVFOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIgKHRyYW5zcG9ydC0+bG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYnVmZmVyKSAtIG9yaWdfbGVuKTsKKworICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9pbmNvbWluZywgMCk7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2NvbXBhY3QgKCZzb2NrZXRfdHJhbnNwb3J0LT5lbmNvZGVkX2luY29taW5nLCAyMDQ4KTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9idWZmZXIgKHRyYW5zcG9ydC0+bG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcik7CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICAgICAgaWYgKERCVVNfVFJBTlNQT1JUX0NBTl9TRU5EX1VOSVhfRkQodHJhbnNwb3J0KSkKKyAgICAgICAgeworICAgICAgICAgIGludCAqZmRzLCBuX2ZkczsKKworICAgICAgICAgIGlmICghX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X3VuaXhfZmRzKHRyYW5zcG9ydC0+bG9hZGVyLCAmZmRzLCAmbl9mZHMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiT3V0IG9mIG1lbW9yeSByZWFkaW5nIGZpbGUgZGVzY3JpcHRvcnNcbiIpOworICAgICAgICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyICh0cmFuc3BvcnQtPmxvYWRlciwgYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgb29tID0gVFJVRTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBieXRlc19yZWFkID0gX2RidXNfcmVhZF9zb2NrZXRfd2l0aF91bml4X2Zkcyhzb2NrZXRfdHJhbnNwb3J0LT5mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X3RyYW5zcG9ydC0+bWF4X2J5dGVzX3JlYWRfcGVyX2l0ZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZHMsICZuX2Zkcyk7CisKKyAgICAgICAgICBpZiAoYnl0ZXNfcmVhZCA+PSAwICYmIG5fZmRzID4gMCkKKyAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UoIlJlYWQgJWkgdW5peCBmZHNcbiIsIG5fZmRzKTsKKworICAgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl91bml4X2Zkcyh0cmFuc3BvcnQtPmxvYWRlciwgZmRzLCBieXRlc19yZWFkIDwgMCA/IDAgOiBuX2Zkcyk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgYnl0ZXNfcmVhZCA9IF9kYnVzX3JlYWRfc29ja2V0IChzb2NrZXRfdHJhbnNwb3J0LT5mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgc29ja2V0X3RyYW5zcG9ydC0+bWF4X2J5dGVzX3JlYWRfcGVyX2l0ZXJhdGlvbik7CisgICAgICAgIH0KKworICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX2J1ZmZlciAodHJhbnNwb3J0LT5sb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc19yZWFkIDwgMCA/IDAgOiBieXRlc19yZWFkKTsKKyAgICB9CisgIAorICBpZiAoYnl0ZXNfcmVhZCA8IDApCisgICAgeworICAgICAgLyogRUlOVFIgYWxyZWFkeSBoYW5kbGVkIGZvciB1cyAqLworCisgICAgICBpZiAoX2RidXNfZ2V0X2lzX2Vycm5vX2Vub21lbSAoKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJPdXQgb2YgbWVtb3J5IGluIHJlYWQoKS9kb19yZWFkaW5nKClcbiIpOworICAgICAgICAgIG9vbSA9IFRSVUU7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX2dldF9pc19lcnJub19lYWdhaW5fb3JfZXdvdWxkYmxvY2sgKCkpCisgICAgICAgIGdvdG8gb3V0OworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkVycm9yIHJlYWRpbmcgZnJvbSByZW1vdGUgYXBwOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICAgICAgICBkb19pb19lcnJvciAodHJhbnNwb3J0KTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZSBpZiAoYnl0ZXNfcmVhZCA9PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJEaXNjb25uZWN0ZWQgZnJvbSByZW1vdGUgYXBwXG4iKTsKKyAgICAgIGRvX2lvX2Vycm9yICh0cmFuc3BvcnQpOworICAgICAgZ290byBvdXQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIiByZWFkICVkIGJ5dGVzXG4iLCBieXRlc19yZWFkKTsKKyAgICAgIAorICAgICAgdG90YWwgKz0gYnl0ZXNfcmVhZDsgICAgICAKKworICAgICAgaWYgKCFfZGJ1c190cmFuc3BvcnRfcXVldWVfbWVzc2FnZXMgKHRyYW5zcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICBvb20gPSBUUlVFOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgb3V0IG9mIG1lbW9yeSB3aGVuIHF1ZXVlaW5nIG1lc3NhZ2VzIHdlIGp1c3QgcmVhZCBpbiB0aGUgdHJhbnNwb3J0XG4iKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgCisgICAgICAvKiBUcnkgcmVhZGluZyBtb3JlIGRhdGEgdW50aWwgd2UgZ2V0IEVBR0FJTiBhbmQgcmV0dXJuLCBvcgorICAgICAgICogZXhjZWVkIG1heCBieXRlcyBwZXIgaXRlcmF0aW9uLiAgSWYgaW4gYmxvY2tpbmcgbW9kZSBvZgorICAgICAgICogY291cnNlIHdlJ2xsIGJsb2NrIGluc3RlYWQgb2YgcmV0dXJuaW5nLgorICAgICAgICovCisgICAgICBnb3RvIGFnYWluOworICAgIH0KKworIG91dDoKKyAgaWYgKG9vbSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Cit1bml4X2Vycm9yX3dpdGhfcmVhZF90b19jb21lIChEQnVzVHJhbnNwb3J0ICppdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICBmbGFncykKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqdHJhbnNwb3J0ID0gKERCdXNUcmFuc3BvcnRTb2NrZXQgKikgaXRyYW5zcG9ydDsKKworICBpZiAoIShmbGFncyAmIERCVVNfV0FUQ0hfSEFOR1VQIHx8IGZsYWdzICYgREJVU19XQVRDSF9FUlJPUikpCisgICAgcmV0dXJuIEZBTFNFOworICAgCisgIC8qIElmIHdlIGhhdmUgYSByZWFkIHdhdGNoIGVuYWJsZWQgLi4uCisgICAgIHdlIC1taWdodCBoYXZlIGRhdGEgaW5jb21pbmcgLi4uID0+IGhhbmRsZSB0aGUgSEFOR1VQIHRoZXJlICovCisgIGlmICh3YXRjaCAhPSB0cmFuc3BvcnQtPnJlYWRfd2F0Y2ggJiYKKyAgICAgIF9kYnVzX3dhdGNoX2dldF9lbmFibGVkICh0cmFuc3BvcnQtPnJlYWRfd2F0Y2gpKQorICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICByZXR1cm4gVFJVRTsgCit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc29ja2V0X2hhbmRsZV93YXRjaCAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgIGZsYWdzKQoreworICBEQnVzVHJhbnNwb3J0U29ja2V0ICpzb2NrZXRfdHJhbnNwb3J0ID0gKERCdXNUcmFuc3BvcnRTb2NrZXQqKSB0cmFuc3BvcnQ7CisKKyAgX2RidXNfYXNzZXJ0ICh3YXRjaCA9PSBzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoIHx8CisgICAgICAgICAgICAgICAgd2F0Y2ggPT0gc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2gpOworICBfZGJ1c19hc3NlcnQgKHdhdGNoICE9IE5VTEwpOworICAKKyAgLyogSWYgd2UgaGl0IGFuIGVycm9yIGhlcmUgb24gYSB3cml0ZSB3YXRjaCwgZG9uJ3QgZGlzY29ubmVjdCB0aGUgdHJhbnNwb3J0IHlldCBiZWNhdXNlIGRhdGEgY2FuCisgICAqIHN0aWxsIGJlIGluIHRoZSBidWZmZXIgYW5kIGRvX3JlYWRpbmcgbWF5IG5lZWQgc2V2ZXJhbCBpdGVyYXRpb24gdG8gcmVhZAorICAgKiBpdCBhbGwgKGJlY2F1c2Ugb2YgaXRzIG1heF9ieXRlc19yZWFkX3Blcl9pdGVyYXRpb24gbGltaXQpLiAKKyAgICovCisgIGlmICghKGZsYWdzICYgREJVU19XQVRDSF9SRUFEQUJMRSkgJiYgdW5peF9lcnJvcl93aXRoX3JlYWRfdG9fY29tZSAodHJhbnNwb3J0LCB3YXRjaCwgZmxhZ3MpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJIYW5nIHVwIG9yIGVycm9yIG9uIHdhdGNoXG4iKTsKKyAgICAgIF9kYnVzX3RyYW5zcG9ydF9kaXNjb25uZWN0ICh0cmFuc3BvcnQpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAKKyAgaWYgKHdhdGNoID09IHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2ggJiYKKyAgICAgIChmbGFncyAmIERCVVNfV0FUQ0hfUkVBREFCTEUpKQorICAgIHsKKyAgICAgIGRidXNfYm9vbF90IGF1dGhfZmluaXNoZWQ7CisjaWYgMQorICAgICAgX2RidXNfdmVyYm9zZSAoImhhbmRsaW5nIHJlYWQgd2F0Y2ggJXAgZmxhZ3MgPSAleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHdhdGNoLCBmbGFncyk7CisjZW5kaWYKKyAgICAgIGlmICghZG9fYXV0aGVudGljYXRpb24gKHRyYW5zcG9ydCwgVFJVRSwgRkFMU0UsICZhdXRoX2ZpbmlzaGVkKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAvKiBXZSBkb24ndCB3YW50IHRvIGRvIGEgcmVhZCBpbW1lZGlhdGVseSBmb2xsb3dpbmcKKyAgICAgICAqIGEgc3VjY2Vzc2Z1bCBhdXRoZW50aWNhdGlvbi4gIFRoaXMgaXMgc28gd2UKKyAgICAgICAqIGhhdmUgYSBjaGFuY2UgdG8gcHJvcGFnYXRlIHRoZSBhdXRoZW50aWNhdGlvbgorICAgICAgICogc3RhdGUgZnVydGhlciB1cC4gIFNwZWNpZmljYWxseSwgd2UgbmVlZCB0bworICAgICAgICogcHJvY2VzcyBhbnkgcGVuZGluZyBkYXRhIGZyb20gdGhlIGF1dGggb2JqZWN0LgorICAgICAgICovCisgICAgICBpZiAoIWF1dGhfZmluaXNoZWQpCisJeworCSAgaWYgKCFkb19yZWFkaW5nICh0cmFuc3BvcnQpKQorCSAgICB7CisJICAgICAgX2RidXNfdmVyYm9zZSAoIm5vIG1lbW9yeSB0byByZWFkXG4iKTsKKwkgICAgICByZXR1cm4gRkFMU0U7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiTm90IHJlYWRpbmcgYW55dGhpbmcgc2luY2Ugd2UganVzdCBjb21wbGV0ZWQgdGhlIGF1dGhlbnRpY2F0aW9uXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZSBpZiAod2F0Y2ggPT0gc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2ggJiYKKyAgICAgICAgICAgKGZsYWdzICYgREJVU19XQVRDSF9XUklUQUJMRSkpCisgICAgeworI2lmIDEKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJoYW5kbGluZyB3cml0ZSB3YXRjaCwgaGF2ZV9vdXRnb2luZ19tZXNzYWdlcyA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9oYXNfbWVzc2FnZXNfdG9fc2VuZF91bmxvY2tlZCAodHJhbnNwb3J0LT5jb25uZWN0aW9uKSk7CisjZW5kaWYKKyAgICAgIGlmICghZG9fYXV0aGVudGljYXRpb24gKHRyYW5zcG9ydCwgRkFMU0UsIFRSVUUsIE5VTEwpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgIGlmICghZG9fd3JpdGluZyAodHJhbnNwb3J0KSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJubyBtZW1vcnkgdG8gd3JpdGVcbiIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAvKiBTZWUgaWYgd2Ugc3RpbGwgbmVlZCB0aGUgd3JpdGUgd2F0Y2ggKi8KKyAgICAgIGNoZWNrX3dyaXRlX3dhdGNoICh0cmFuc3BvcnQpOworICAgIH0KKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICh3YXRjaCA9PSBzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoKQorICAgICAgICBfZGJ1c192ZXJib3NlICgiYXNrZWQgdG8gaGFuZGxlIHJlYWQgd2F0Y2ggd2l0aCBub24tcmVhZCBjb25kaXRpb24gMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgICAgZWxzZSBpZiAod2F0Y2ggPT0gc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2gpCisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJhc2tlZCB0byBoYW5kbGUgd3JpdGUgd2F0Y2ggd2l0aCBub24td3JpdGUgY29uZGl0aW9uIDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICAgIGVsc2UKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoImFza2VkIHRvIGhhbmRsZSB3YXRjaCAlcCBvbiBmZCAlZCB0aGF0IHdlIGRvbid0IHJlY29nbml6ZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2gsIGRidXNfd2F0Y2hfZ2V0X3NvY2tldCAod2F0Y2gpKTsKKyAgICB9CisjZW5kaWYgLyogREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFICovCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitzb2NrZXRfZGlzY29ubmVjdCAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBEQnVzVHJhbnNwb3J0U29ja2V0ICpzb2NrZXRfdHJhbnNwb3J0ID0gKERCdXNUcmFuc3BvcnRTb2NrZXQqKSB0cmFuc3BvcnQ7CisKKyAgX2RidXNfdmVyYm9zZSAoIlxuIik7CisgIAorICBmcmVlX3dhdGNoZXMgKHRyYW5zcG9ydCk7CisgIAorICBfZGJ1c19jbG9zZV9zb2NrZXQgKHNvY2tldF90cmFuc3BvcnQtPmZkLCBOVUxMKTsKKyAgc29ja2V0X3RyYW5zcG9ydC0+ZmQgPSAtMTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citzb2NrZXRfY29ubmVjdGlvbl9zZXQgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqc29ja2V0X3RyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0KikgdHJhbnNwb3J0OworCisgIF9kYnVzX3dhdGNoX3NldF9oYW5kbGVyIChzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25faGFuZGxlX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LT5jb25uZWN0aW9uLCBOVUxMKTsKKworICBfZGJ1c193YXRjaF9zZXRfaGFuZGxlciAoc29ja2V0X3RyYW5zcG9ydC0+cmVhZF93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25faGFuZGxlX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LT5jb25uZWN0aW9uLCBOVUxMKTsKKyAgCisgIGlmICghX2RidXNfY29ubmVjdGlvbl9hZGRfd2F0Y2hfdW5sb2NrZWQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2gpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX2Nvbm5lY3Rpb25fYWRkX3dhdGNoX3VubG9ja2VkICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2gpKQorICAgIHsKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3dhdGNoX3VubG9ja2VkICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2gpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBjaGVja19yZWFkX3dhdGNoICh0cmFuc3BvcnQpOworICBjaGVja193cml0ZV93YXRjaCAodHJhbnNwb3J0KTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBAdG9kbyBXZSBuZWVkIHRvIGhhdmUgYSB3YXkgdG8gd2FrZSB1cCB0aGUgc2VsZWN0IHNsZWVwIGlmCisgKiBhIG5ldyBpdGVyYXRpb24gcmVxdWVzdCBjb21lcyBpbiB3aXRoIGEgZmxhZyAocmVhZC93cml0ZSkgdGhhdAorICogd2UncmUgbm90IGN1cnJlbnRseSBzZXJ2aW5nLiBPdGhlcndpc2UgYSBjYWxsIHRoYXQganVzdCByZWFkcworICogY291bGQgYmxvY2sgYSB3cml0ZSBjYWxsIGZvcmV2ZXIgKGlmIHRoZXJlIGFyZSBubyBpbmNvbWluZworICogbWVzc2FnZXMpLgorICovCitzdGF0aWMgIHZvaWQKK3NvY2tldF9kb19pdGVyYXRpb24gKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcykKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqc29ja2V0X3RyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0KikgdHJhbnNwb3J0OworICBEQnVzUG9sbEZEIHBvbGxfZmQ7CisgIGludCBwb2xsX3JlczsKKyAgaW50IHBvbGxfdGltZW91dDsKKworICBfZGJ1c192ZXJib3NlICgiIGl0ZXJhdGlvbiBmbGFncyA9ICVzJXMgdGltZW91dCA9ICVkIHJlYWRfd2F0Y2ggPSAlcCB3cml0ZV93YXRjaCA9ICVwIGZkID0gJWRcbiIsCisgICAgICAgICAgICAgICAgIGZsYWdzICYgREJVU19JVEVSQVRJT05fRE9fUkVBRElORyA/ICJyZWFkIiA6ICIiLAorICAgICAgICAgICAgICAgICBmbGFncyAmIERCVVNfSVRFUkFUSU9OX0RPX1dSSVRJTkcgPyAid3JpdGUiIDogIiIsCisgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzLAorICAgICAgICAgICAgICAgICBzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoLAorICAgICAgICAgICAgICAgICBzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCwKKyAgICAgICAgICAgICAgICAgc29ja2V0X3RyYW5zcG9ydC0+ZmQpOworICAKKyAgLyogdGhlIHBhc3NlZCBpbiBET19SRUFESU5HL0RPX1dSSVRJTkcgZmxhZ3MgaW5kaWNhdGUgd2hldGhlciB0bworICAgKiByZWFkL3dyaXRlIG1lc3NhZ2VzLCBidXQgcmVnYXJkbGVzcyBvZiB0aG9zZSB3ZSBtYXkgbmVlZCB0byBibG9jaworICAgKiBmb3IgcmVhZGluZy93cml0aW5nIHRvIGRvIGF1dGguICBCdXQgaWYgd2UgZG8gcmVhZGluZyBmb3IgYXV0aCwKKyAgICogd2UgZG9uJ3Qgd2FudCB0byByZWFkIGFueSBtZXNzYWdlcyB5ZXQgaWYgbm90IGdpdmVuIERPX1JFQURJTkcuCisgICAqLworCisgIHBvbGxfZmQuZmQgPSBzb2NrZXRfdHJhbnNwb3J0LT5mZDsKKyAgcG9sbF9mZC5ldmVudHMgPSAwOworICAKKyAgaWYgKF9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfYXV0aGVudGljYXRlZCAodHJhbnNwb3J0KSkKKyAgICB7CisgICAgICAvKiBUaGlzIGlzIGtpbmQgb2YgYSBoYWNrOyBpZiB3ZSBoYXZlIHN0dWZmIHRvIHdyaXRlLCB0aGVuIHRyeQorICAgICAgICogdG8gYXZvaWQgdGhlIHBvbGwuIFRoaXMgaXMgcHJvYmFibHkgYWJvdXQgYSA1JSBzcGVlZHVwIG9uIGFuCisgICAgICAgKiBlY2hvIGNsaWVudC9zZXJ2ZXIuCisgICAgICAgKgorICAgICAgICogSWYgYm90aCByZWFkaW5nIGFuZCB3cml0aW5nIHdlcmUgcmVxdWVzdGVkLCB3ZSB3YW50IHRvIGF2b2lkIHRoaXMKKyAgICAgICAqIHNpbmNlIGl0IGNvdWxkIGhhdmUgZnVua3kgZWZmZWN0czoKKyAgICAgICAqICAgLSBib3RoIGVuZHMgc3Bpbm5pbmcgd2FpdGluZyBmb3IgdGhlIG90aGVyIG9uZSB0byByZWFkCisgICAgICAgKiAgICAgZGF0YSBzbyB0aGV5IGNhbiBmaW5pc2ggd3JpdGluZworICAgICAgICogICAtIHByaW9yaXRpemluZyBhbGwgd3JpdGluZyBhaGVhZCBvZiByZWFkaW5nCisgICAgICAgKi8KKyAgICAgIGlmICgoZmxhZ3MgJiBEQlVTX0lURVJBVElPTl9ET19XUklUSU5HKSAmJgorICAgICAgICAgICEoZmxhZ3MgJiAoREJVU19JVEVSQVRJT05fRE9fUkVBRElORyB8IERCVVNfSVRFUkFUSU9OX0JMT0NLKSkgJiYKKyAgICAgICAgICAhdHJhbnNwb3J0LT5kaXNjb25uZWN0ZWQgJiYKKyAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2hhc19tZXNzYWdlc190b19zZW5kX3VubG9ja2VkICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24pKQorICAgICAgICB7CisgICAgICAgICAgZG9fd3JpdGluZyAodHJhbnNwb3J0KTsKKworICAgICAgICAgIGlmICh0cmFuc3BvcnQtPmRpc2Nvbm5lY3RlZCB8fAorICAgICAgICAgICAgICAhX2RidXNfY29ubmVjdGlvbl9oYXNfbWVzc2FnZXNfdG9fc2VuZF91bmxvY2tlZCAodHJhbnNwb3J0LT5jb25uZWN0aW9uKSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIC8qIElmIHdlIGdldCBoZXJlLCB3ZSBkZWNpZGVkIHRvIGRvIHRoZSBwb2xsKCkgYWZ0ZXIgYWxsICovCisgICAgICBfZGJ1c19hc3NlcnQgKHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2gpOworICAgICAgaWYgKGZsYWdzICYgREJVU19JVEVSQVRJT05fRE9fUkVBRElORykKKwlwb2xsX2ZkLmV2ZW50cyB8PSBfREJVU19QT0xMSU47CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2gpOworICAgICAgaWYgKGZsYWdzICYgREJVU19JVEVSQVRJT05fRE9fV1JJVElORykKKyAgICAgICAgcG9sbF9mZC5ldmVudHMgfD0gX0RCVVNfUE9MTE9VVDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBEQnVzQXV0aFN0YXRlIGF1dGhfc3RhdGU7CisgICAgICAKKyAgICAgIGF1dGhfc3RhdGUgPSBfZGJ1c19hdXRoX2RvX3dvcmsgKHRyYW5zcG9ydC0+YXV0aCk7CisKKyAgICAgIGlmICh0cmFuc3BvcnQtPnJlY2VpdmVfY3JlZGVudGlhbHNfcGVuZGluZyB8fAorICAgICAgICAgIGF1dGhfc3RhdGUgPT0gREJVU19BVVRIX1NUQVRFX1dBSVRJTkdfRk9SX0lOUFVUKQorCXBvbGxfZmQuZXZlbnRzIHw9IF9EQlVTX1BPTExJTjsKKworICAgICAgaWYgKHRyYW5zcG9ydC0+c2VuZF9jcmVkZW50aWFsc19wZW5kaW5nIHx8CisgICAgICAgICAgYXV0aF9zdGF0ZSA9PSBEQlVTX0FVVEhfU1RBVEVfSEFWRV9CWVRFU19UT19TRU5EKQorCXBvbGxfZmQuZXZlbnRzIHw9IF9EQlVTX1BPTExPVVQ7CisgICAgfQorCisgIGlmIChwb2xsX2ZkLmV2ZW50cykKKyAgICB7CisgICAgICBpZiAoZmxhZ3MgJiBEQlVTX0lURVJBVElPTl9CTE9DSykKKwlwb2xsX3RpbWVvdXQgPSB0aW1lb3V0X21pbGxpc2Vjb25kczsKKyAgICAgIGVsc2UKKwlwb2xsX3RpbWVvdXQgPSAwOworCisgICAgICAvKiBGb3IgYmxvY2tpbmcgc2VsZWN0cyB3ZSBkcm9wIHRoZSBjb25uZWN0aW9uIGxvY2sgaGVyZQorICAgICAgICogdG8gYXZvaWQgYmxvY2tpbmcgb3V0IGNvbm5lY3Rpb24gYWNjZXNzIGR1cmluZyBhIHBvdGVudGlhbGx5CisgICAgICAgKiBpbmRlZmluaXRlIGJsb2NraW5nIGNhbGwuIFRoZSBpbyBwYXRoIGlzIHN0aWxsIHByb3RlY3RlZAorICAgICAgICogYnkgdGhlIGlvX3BhdGhfY29uZCBjb25kdmFyLCBzbyB3ZSB3b24ndCByZWVudGVyIHRoaXMuCisgICAgICAgKi8KKyAgICAgIGlmIChmbGFncyAmIERCVVNfSVRFUkFUSU9OX0JMT0NLKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInVubG9jayBwcmUgcG9sbFxuIik7CisgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl91bmxvY2sgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbik7CisgICAgICAgIH0KKyAgICAgIAorICAgIGFnYWluOgorICAgICAgcG9sbF9yZXMgPSBfZGJ1c19wb2xsICgmcG9sbF9mZCwgMSwgcG9sbF90aW1lb3V0KTsKKworICAgICAgaWYgKHBvbGxfcmVzIDwgMCAmJiBfZGJ1c19nZXRfaXNfZXJybm9fZWludHIgKCkpCisJZ290byBhZ2FpbjsKKworICAgICAgaWYgKGZsYWdzICYgREJVU19JVEVSQVRJT05fQkxPQ0spCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgibG9jayBwb3N0IHBvbGxcbiIpOworICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fbG9jayAodHJhbnNwb3J0LT5jb25uZWN0aW9uKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAocG9sbF9yZXMgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChwb2xsX3JlcyA9PSAwKQorICAgICAgICAgICAgcG9sbF9mZC5yZXZlbnRzID0gMDsgLyogc29tZSBjb25jZXJuIHRoYXQgcG9zaXggZG9lcyBub3QgZ3VhcmFudGVlIHRoaXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB2YWxncmluZCBmbGFncyBpdCBhcyBhbiBlcnJvci4gdGhvdWdoIGl0IHByb2JhYmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpcyBndWFyYW50ZWVkIG9uIGxpbnV4IGF0IGxlYXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgCisgICAgICAgICAgaWYgKHBvbGxfZmQucmV2ZW50cyAmIF9EQlVTX1BPTExFUlIpCisgICAgICAgICAgICBkb19pb19lcnJvciAodHJhbnNwb3J0KTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfYm9vbF90IG5lZWRfcmVhZCA9IChwb2xsX2ZkLnJldmVudHMgJiBfREJVU19QT0xMSU4pID4gMDsKKyAgICAgICAgICAgICAgZGJ1c19ib29sX3QgbmVlZF93cml0ZSA9IChwb2xsX2ZkLnJldmVudHMgJiBfREJVU19QT0xMT1VUKSA+IDA7CisJICAgICAgZGJ1c19ib29sX3QgYXV0aGVudGljYXRpb25fY29tcGxldGVkOworCisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJpbiBpdGVyYXRpb24sIG5lZWRfcmVhZD0lZCBuZWVkX3dyaXRlPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3JlYWQsIG5lZWRfd3JpdGUpOworICAgICAgICAgICAgICBkb19hdXRoZW50aWNhdGlvbiAodHJhbnNwb3J0LCBuZWVkX3JlYWQsIG5lZWRfd3JpdGUsCisJCQkJICZhdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQpOworCisJICAgICAgLyogU2VlIGNvbW1lbnQgaW4gc29ja2V0X2hhbmRsZV93YXRjaC4gKi8KKwkgICAgICBpZiAoYXV0aGVudGljYXRpb25fY29tcGxldGVkKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmIChuZWVkX3JlYWQgJiYgKGZsYWdzICYgREJVU19JVEVSQVRJT05fRE9fUkVBRElORykpCisgICAgICAgICAgICAgICAgZG9fcmVhZGluZyAodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgaWYgKG5lZWRfd3JpdGUgJiYgKGZsYWdzICYgREJVU19JVEVSQVRJT05fRE9fV1JJVElORykpCisgICAgICAgICAgICAgICAgZG9fd3JpdGluZyAodHJhbnNwb3J0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkVycm9yIGZyb20gX2RidXNfcG9sbCgpOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgb3V0OgorICAvKiBXZSBuZWVkIHRvIGluc3RhbGwgdGhlIHdyaXRlIHdhdGNoIG9ubHkgaWYgd2UgZGlkIG5vdAorICAgKiBzdWNjZXNzZnVsbHkgd3JpdGUgZXZlcnl0aGluZy4gTm90ZSB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwgdGhhdCB3ZQorICAgKiBkb24ndCBjYWxsIGNoZWNrX3dyaXRlX3dhdGNoICpiZWZvcmUqIGRvX3dyaXRpbmcsIHNpbmNlIGl0J3MKKyAgICogaW5lZmZpY2llbnQgdG8gYWRkIHRoZSB3cml0ZSB3YXRjaCwgYW5kIHdlIGNhbiBhdm9pZCBpdCBtb3N0IG9mCisgICAqIHRoZSB0aW1lIHNpbmNlIHdlIGNhbiB3cml0ZSBpbW1lZGlhdGVseS4KKyAgICogCisgICAqIEhvd2V2ZXIsIHdlIE1VU1QgYWx3YXlzIGNhbGwgY2hlY2tfd3JpdGVfd2F0Y2goKTsgREJ1c0Nvbm5lY3Rpb24gY29kZQorICAgKiByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBydW5uaW5nIGFuIGl0ZXJhdGlvbiB3aWxsIG5vdGljZSB0aGF0CisgICAqIG1lc3NhZ2VzIGFyZSBwZW5kaW5nLgorICAgKi8KKyAgY2hlY2tfd3JpdGVfd2F0Y2ggKHRyYW5zcG9ydCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIiAuLi4gbGVhdmluZyBkb19pdGVyYXRpb24oKVxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitzb2NrZXRfbGl2ZV9tZXNzYWdlc19jaGFuZ2VkIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIC8qIFNlZSBpZiB3ZSBzaG91bGQgbG9vayBmb3IgaW5jb21pbmcgbWVzc2FnZXMgYWdhaW4gKi8KKyAgY2hlY2tfcmVhZF93YXRjaCAodHJhbnNwb3J0KTsKK30KKworCitzdGF0aWMgZGJ1c19ib29sX3QKK3NvY2tldF9nZXRfc29ja2V0X2ZkIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAqZmRfcCkKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqc29ja2V0X3RyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0KikgdHJhbnNwb3J0OworICAKKyAgKmZkX3AgPSBzb2NrZXRfdHJhbnNwb3J0LT5mZDsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgY29uc3QgREJ1c1RyYW5zcG9ydFZUYWJsZSBzb2NrZXRfdnRhYmxlID0geworICBzb2NrZXRfZmluYWxpemUsCisgIHNvY2tldF9oYW5kbGVfd2F0Y2gsCisgIHNvY2tldF9kaXNjb25uZWN0LAorICBzb2NrZXRfY29ubmVjdGlvbl9zZXQsCisgIHNvY2tldF9kb19pdGVyYXRpb24sCisgIHNvY2tldF9saXZlX21lc3NhZ2VzX2NoYW5nZWQsCisgIHNvY2tldF9nZXRfc29ja2V0X2ZkCit9OworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgdHJhbnNwb3J0IGZvciB0aGUgZ2l2ZW4gc29ja2V0IGZpbGUgZGVzY3JpcHRvci4gIFRoZSBmaWxlCisgKiBkZXNjcmlwdG9yIG11c3QgYmUgbm9uYmxvY2tpbmcgKHVzZSBfZGJ1c19zZXRfZmRfbm9uYmxvY2tpbmcoKSB0bworICogbWFrZSBpdCBzbykuIFRoaXMgZnVuY3Rpb24gaXMgc2hhcmVkIGJ5IHZhcmlvdXMgdHJhbnNwb3J0cyB0aGF0CisgKiBib2lsIGRvd24gdG8gYSBmdWxsIGR1cGxleCBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIGZkIHRoZSBmaWxlIGRlc2NyaXB0b3IuCisgKiBAcGFyYW0gc2VydmVyX2d1aWQgbm9uLSNOVUxMIGlmIHRoaXMgdHJhbnNwb3J0IGlzIG9uIHRoZSBzZXJ2ZXIgc2lkZSBvZiBhIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBhZGRyZXNzIHRoZSB0cmFuc3BvcnQncyBhZGRyZXNzCisgKiBAcmV0dXJucyB0aGUgbmV3IHRyYW5zcG9ydCwgb3IgI05VTEwgaWYgbm8gbWVtb3J5LgorICovCitEQnVzVHJhbnNwb3J0KgorX2RidXNfdHJhbnNwb3J0X25ld19mb3Jfc29ja2V0IChpbnQgICAgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqc2VydmVyX2d1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFkZHJlc3MpCit7CisgIERCdXNUcmFuc3BvcnRTb2NrZXQgKnNvY2tldF90cmFuc3BvcnQ7CisgIAorICBzb2NrZXRfdHJhbnNwb3J0ID0gZGJ1c19uZXcwIChEQnVzVHJhbnNwb3J0U29ja2V0LCAxKTsKKyAgaWYgKHNvY2tldF90cmFuc3BvcnQgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9vdXRnb2luZykpCisgICAgZ290byBmYWlsZWRfMDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9pbmNvbWluZykpCisgICAgZ290byBmYWlsZWRfMTsKKyAgCisgIHNvY2tldF90cmFuc3BvcnQtPndyaXRlX3dhdGNoID0gX2RidXNfd2F0Y2hfbmV3IChmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1dBVENIX1dSSVRBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2ggPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZF8yOworICAKKyAgc29ja2V0X3RyYW5zcG9ydC0+cmVhZF93YXRjaCA9IF9kYnVzX3dhdGNoX25ldyAoZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1dBVENIX1JFQURBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2ggPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZF8zOworCisgIGlmICghX2RidXNfdHJhbnNwb3J0X2luaXRfYmFzZSAoJnNvY2tldF90cmFuc3BvcnQtPmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvY2tldF92dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX2d1aWQsIGFkZHJlc3MpKQorICAgIGdvdG8gZmFpbGVkXzQ7CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICBfZGJ1c19hdXRoX3NldF91bml4X2ZkX3Bvc3NpYmxlKHNvY2tldF90cmFuc3BvcnQtPmJhc2UuYXV0aCwgX2RidXNfc29ja2V0X2Nhbl9wYXNzX3VuaXhfZmQoZmQpKTsKKyNlbmRpZgorCisgIHNvY2tldF90cmFuc3BvcnQtPmZkID0gZmQ7CisgIHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiA9IDA7CisgIAorICAvKiBUaGVzZSB2YWx1ZXMgc2hvdWxkIHByb2JhYmx5IGJlIHR1bmFibGUgb3Igc29tZXRoaW5nLiAqLyAgICAgCisgIHNvY2tldF90cmFuc3BvcnQtPm1heF9ieXRlc19yZWFkX3Blcl9pdGVyYXRpb24gPSAyMDQ4OworICBzb2NrZXRfdHJhbnNwb3J0LT5tYXhfYnl0ZXNfd3JpdHRlbl9wZXJfaXRlcmF0aW9uID0gMjA0ODsKKyAgCisgIHJldHVybiAoREJ1c1RyYW5zcG9ydCopIHNvY2tldF90cmFuc3BvcnQ7CisKKyBmYWlsZWRfNDoKKyAgX2RidXNfd2F0Y2hfaW52YWxpZGF0ZSAoc29ja2V0X3RyYW5zcG9ydC0+cmVhZF93YXRjaCk7CisgIF9kYnVzX3dhdGNoX3VucmVmIChzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoKTsKKyBmYWlsZWRfMzoKKyAgX2RidXNfd2F0Y2hfaW52YWxpZGF0ZSAoc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2gpOworICBfZGJ1c193YXRjaF91bnJlZiAoc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2gpOworIGZhaWxlZF8yOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfaW5jb21pbmcpOworIGZhaWxlZF8xOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfb3V0Z29pbmcpOworIGZhaWxlZF8wOgorICBkYnVzX2ZyZWUgKHNvY2tldF90cmFuc3BvcnQpOworICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IHRyYW5zcG9ydCBmb3IgdGhlIGdpdmVuIGhvc3RuYW1lIGFuZCBwb3J0LgorICogSWYgaG9zdCBpcyBOVUxMLCBpdCB3aWxsIGRlZmF1bHQgdG8gbG9jYWxob3N0CisgKgorICogQHBhcmFtIGhvc3QgdGhlIGhvc3QgdG8gY29ubmVjdCB0bworICogQHBhcmFtIHBvcnQgdGhlIHBvcnQgdG8gY29ubmVjdCB0bworICogQHBhcmFtIGZhbWlseSB0aGUgYWRkcmVzcyBmYW1pbHkgdG8gY29ubmVjdCB0bworICogQHBhcmFtIHBhdGggdG8gbm9uY2UgZmlsZQorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJlYXNvbiBmb3IgZmFpbHVyZS4KKyAqIEByZXR1cm5zIGEgbmV3IHRyYW5zcG9ydCwgb3IgI05VTEwgb24gZmFpbHVyZS4KKyAqLworREJ1c1RyYW5zcG9ydCoKK19kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX3RjcF9zb2NrZXQgKGNvbnN0IGNoYXIgICAgICpob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKm5vbmNlZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgaW50IGZkOworICBEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisgIERCdXNTdHJpbmcgYWRkcmVzczsKKyAgCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhZGRyZXNzKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoaG9zdCA9PSBOVUxMKQorICAgIGhvc3QgPSAibG9jYWxob3N0IjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCBub25jZWZpbGUgPyAibm9uY2UtdGNwOiIgOiAidGNwOiIpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgImhvc3Q9IikgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgaG9zdCkpCisgICAgZ290byBlcnJvcjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCAiLHBvcnQ9IikgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgcG9ydCkpCisgICAgZ290byBlcnJvcjsKKworICBpZiAoZmFtaWx5ICE9IE5VTEwgJiYKKyAgICAgICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsICIsZmFtaWx5PSIpIHx8CisgICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCBmYW1pbHkpKSkKKyAgICBnb3RvIGVycm9yOworCisgIGlmIChub25jZWZpbGUgIT0gTlVMTCAmJgorICAgICAgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgIixub25jZWZpbGU9IikgfHwKKyAgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsIG5vbmNlZmlsZSkpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgZmQgPSBfZGJ1c19jb25uZWN0X3RjcF9zb2NrZXRfd2l0aF9ub25jZSAoaG9zdCwgcG9ydCwgZmFtaWx5LCBub25jZWZpbGUsIGVycm9yKTsKKyAgaWYgKGZkIDwgMCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJTdWNjZXNzZnVsbHkgY29ubmVjdGVkIHRvIHRjcCBzb2NrZXQgJXM6JXNcbiIsCisgICAgICAgICAgICAgICAgIGhvc3QsIHBvcnQpOworICAKKyAgdHJhbnNwb3J0ID0gX2RidXNfdHJhbnNwb3J0X25ld19mb3Jfc29ja2V0IChmZCwgTlVMTCwgJmFkZHJlc3MpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworICBpZiAodHJhbnNwb3J0ID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBfZGJ1c19jbG9zZV9zb2NrZXQgKGZkLCBOVUxMKTsKKyAgICAgIGZkID0gLTE7CisgICAgfQorCisgIHJldHVybiB0cmFuc3BvcnQ7CisKK2Vycm9yOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogT3BlbnMgYSBUQ1Agc29ja2V0IHRyYW5zcG9ydC4KKyAqIAorICogQHBhcmFtIGVudHJ5IHRoZSBhZGRyZXNzIGVudHJ5IHRvIHRyeSBvcGVuaW5nIGFzIGEgdGNwIHRyYW5zcG9ydC4KKyAqIEBwYXJhbSB0cmFuc3BvcnRfcCByZXR1cm4gbG9jYXRpb24gZm9yIHRoZSBvcGVuZWQgdHJhbnNwb3J0CisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgdG8gYmUgc2V0CisgKiBAcmV0dXJucyByZXN1bHQgb2YgdGhlIGF0dGVtcHQKKyAqLworREJ1c1RyYW5zcG9ydE9wZW5SZXN1bHQKK19kYnVzX3RyYW5zcG9ydF9vcGVuX3NvY2tldChEQnVzQWRkcmVzc0VudHJ5ICAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RyYW5zcG9ydCAgICAqKnRyYW5zcG9ydF9wLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKm1ldGhvZDsKKyAgZGJ1c19ib29sX3QgaXNUY3A7CisgIGRidXNfYm9vbF90IGlzTm9uY2VUY3A7CisgIAorICBtZXRob2QgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X21ldGhvZCAoZW50cnkpOworICBfZGJ1c19hc3NlcnQgKG1ldGhvZCAhPSBOVUxMKTsKKworICBpc1RjcCA9IHN0cmNtcCAobWV0aG9kLCAidGNwIikgPT0gMDsKKyAgaXNOb25jZVRjcCA9IHN0cmNtcCAobWV0aG9kLCAibm9uY2UtdGNwIikgPT0gMDsKKworICBpZiAoaXNUY3AgfHwgaXNOb25jZVRjcCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpob3N0ID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJob3N0Iik7CisgICAgICBjb25zdCBjaGFyICpwb3J0ID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJwb3J0Iik7CisgICAgICBjb25zdCBjaGFyICpmYW1pbHkgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgImZhbWlseSIpOworICAgICAgY29uc3QgY2hhciAqbm9uY2VmaWxlID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJub25jZWZpbGUiKTsKKworICAgICAgaWYgKChpc05vbmNlVGNwID09IFRSVUUpICE9IChub25jZWZpbGUgIT0gTlVMTCkpIHsKKyAgICAgICAgICBfZGJ1c19zZXRfYmFkX2FkZHJlc3MgKGVycm9yLCBtZXRob2QsICJub25jZWZpbGUiLCBOVUxMKTsKKyAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9CQURfQUREUkVTUzsKKyAgICAgIH0KKworICAgICAgaWYgKHBvcnQgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3NldF9iYWRfYWRkcmVzcyAoZXJyb3IsIG1ldGhvZCwgInBvcnQiLCBOVUxMKTsKKyAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9CQURfQUREUkVTUzsKKyAgICAgICAgfQorCisgICAgICAqdHJhbnNwb3J0X3AgPSBfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl90Y3Bfc29ja2V0IChob3N0LCBwb3J0LCBmYW1pbHksIG5vbmNlZmlsZSwgZXJyb3IpOworICAgICAgaWYgKCp0cmFuc3BvcnRfcCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fT0s7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX05PVF9IQU5ETEVEOworICAgIH0KK30KKworLyoqIEB9ICovCisKZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLXRyYW5zcG9ydC1zb2NrZXQuaCBiL2RidXMvZGJ1cy9kYnVzLXRyYW5zcG9ydC1zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWVmYWUzCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtdHJhbnNwb3J0LXNvY2tldC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy10cmFuc3BvcnQtc29ja2V0LmggU29ja2V0IHN1YmNsYXNzZXMgb2YgREJ1c1RyYW5zcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfVFJBTlNQT1JUX1NPQ0tFVF9ICisjZGVmaW5lIERCVVNfVFJBTlNQT1JUX1NPQ0tFVF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtdHJhbnNwb3J0LXByb3RlY3RlZC5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK0RCdXNUcmFuc3BvcnQqICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX3NvY2tldCAgICAgKGludCAgICAgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICpzZXJ2ZXJfZ3VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICphZGRyZXNzKTsKK0RCdXNUcmFuc3BvcnQqICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX3RjcF9zb2NrZXQgKGNvbnN0IGNoYXIgICAgICAgICpob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKm5vbmNlZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcik7CitEQnVzVHJhbnNwb3J0T3BlblJlc3VsdCBfZGJ1c190cmFuc3BvcnRfb3Blbl9zb2NrZXQgICAgICAgIChEQnVzQWRkcmVzc0VudHJ5ICAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHJhbnNwb3J0ICAgICoqdHJhbnNwb3J0X3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworCisKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfVFJBTlNQT1JUX1NPQ0tFVF9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jIGIvZGJ1cy9kYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmE1YzBiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYwpAQCAtMCwwICsxLDQ0MiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXRyYW5zcG9ydC11bml4LmMgVU5JWCBzb2NrZXQgc3ViY2xhc3NlcyBvZiBEQnVzVHJhbnNwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0ICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmgiCisjaW5jbHVkZSAiZGJ1cy10cmFuc3BvcnQtdW5peC5oIgorI2luY2x1ZGUgImRidXMtdHJhbnNwb3J0LXNvY2tldC5oIgorI2luY2x1ZGUgImRidXMtdHJhbnNwb3J0LXByb3RlY3RlZC5oIgorI2luY2x1ZGUgImRidXMtd2F0Y2guaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMtdW5peC5oIgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzVHJhbnNwb3J0VW5peCBEQnVzVHJhbnNwb3J0IGltcGxlbWVudGF0aW9ucyBmb3IgVU5JWAorICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIERCdXNUcmFuc3BvcnQgb24gVU5JWAorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IHRyYW5zcG9ydCBmb3IgdGhlIGdpdmVuIFVuaXggZG9tYWluIHNvY2tldAorICogcGF0aC4gVGhpcyBjcmVhdGVzIGEgY2xpZW50LXNpZGUgb2YgYSB0cmFuc3BvcnQuCisgKgorICogQHRvZG8gb25jZSB3ZSBhZGQgYSB3YXkgdG8gZXNjYXBlIHBhdGhzIGluIGEgZGJ1cworICogYWRkcmVzcywgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBkbyBlc2NhcGluZy4KKyAqCisgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byB0aGUgZG9tYWluIHNvY2tldC4KKyAqIEBwYXJhbSBhYnN0cmFjdCAjVFJVRSB0byB1c2UgYWJzdHJhY3Qgc29ja2V0IG5hbWVzcGFjZQorICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgd2hlcmUgYW4gZXJyb3IgY2FuIGJlIHJldHVybmVkLgorICogQHJldHVybnMgYSBuZXcgdHJhbnNwb3J0LCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICovCitEQnVzVHJhbnNwb3J0KgorX2RidXNfdHJhbnNwb3J0X25ld19mb3JfZG9tYWluX3NvY2tldCAoY29uc3QgY2hhciAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgYWJzdHJhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIGludCBmZDsKKyAgREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0OworICBEQnVzU3RyaW5nIGFkZHJlc3M7CisgIAorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYWRkcmVzcykpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgZmQgPSAtMTsKKworICBpZiAoKGFic3RyYWN0ICYmCisgICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCAidW5peDphYnN0cmFjdD0iKSkgfHwKKyAgICAgICghYWJzdHJhY3QgJiYKKyAgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsICJ1bml4OnBhdGg9IikpIHx8CisgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsIHBhdGgpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgZ290byBmYWlsZWRfMDsKKyAgICB9CisgIAorICBmZCA9IF9kYnVzX2Nvbm5lY3RfdW5peF9zb2NrZXQgKHBhdGgsIGFic3RyYWN0LCBlcnJvcik7CisgIGlmIChmZCA8IDApCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWRfMDsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIlN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gdW5peCBzb2NrZXQgJXNcbiIsCisgICAgICAgICAgICAgICAgIHBhdGgpOworCisgIHRyYW5zcG9ydCA9IF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX3NvY2tldCAoZmQsIE5VTEwsICZhZGRyZXNzKTsKKyAgaWYgKHRyYW5zcG9ydCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgZ290byBmYWlsZWRfMTsKKyAgICB9CisgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworICAKKyAgcmV0dXJuIHRyYW5zcG9ydDsKKworIGZhaWxlZF8xOgorICBfZGJ1c19jbG9zZV9zb2NrZXQgKGZkLCBOVUxMKTsKKyBmYWlsZWRfMDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhZGRyZXNzKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyB0cmFuc3BvcnQgZm9yIHRoZSBnaXZlbiBiaW5hcnkgYW5kIGFyZ3VtZW50cy4gVGhpcworICogY3JlYXRlcyBhIGNsaWVudC1zaWRlIG9mIGEgdHJhbnNwb3J0LiBUaGUgcHJvY2VzcyB3aWxsIGJlIGZvcmtlZAorICogb2ZmIGFuZCBleGVjdXRlZCB3aXRoIHN0ZGluL3N0ZG91dCBjb25uZWN0ZWQgdG8gYSBsb2NhbCBBRl9VTklYCisgKiBzb2NrZXQuCisgKgorICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gdGhlIGRvbWFpbiBzb2NrZXQuCisgKiBAcGFyYW0gYXJndiBQYXJhbWV0ZXJzIGxpc3QKKyAqIEBwYXJhbSBlcnJvciBhZGRyZXNzIHdoZXJlIGFuIGVycm9yIGNhbiBiZSByZXR1cm5lZC4KKyAqIEByZXR1cm5zIGEgbmV3IHRyYW5zcG9ydCwgb3IgI05VTEwgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIERCdXNUcmFuc3BvcnQqCitfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl9leGVjIChjb25zdCBjaGFyICAgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmNvbnN0ICAgICBhcmd2W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIGludCBmZDsKKyAgREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0OworICBEQnVzU3RyaW5nIGFkZHJlc3M7CisgIHVuc2lnbmVkIGk7CisgIGNoYXIgKmVzY2FwZWQ7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmFkZHJlc3MpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGZkID0gLTE7CisKKyAgZXNjYXBlZCA9IGRidXNfYWRkcmVzc19lc2NhcGVfdmFsdWUgKHBhdGgpOworICBpZiAoIWVzY2FwZWQpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgInVuaXhleGVjOnBhdGg9IikgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgZXNjYXBlZCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBkYnVzX2ZyZWUgKGVzY2FwZWQpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGRidXNfZnJlZSAoZXNjYXBlZCk7CisKKyAgaWYgKGFyZ3YpCisgICAgeworICAgICAgZm9yIChpID0gMDsgYXJndltpXTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19ib29sX3Qgc3VjY2VzczsKKworICAgICAgICAgIGVzY2FwZWQgPSBkYnVzX2FkZHJlc3NfZXNjYXBlX3ZhbHVlIChhcmd2W2ldKTsKKyAgICAgICAgICBpZiAoIWVzY2FwZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHN1Y2Nlc3MgPSBfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoJmFkZHJlc3MsICIsYXJndiV1PSVzIiwgaSwgZXNjYXBlZCk7CisgICAgICAgICAgZGJ1c19mcmVlIChlc2NhcGVkKTsKKworICAgICAgICAgIGlmICghc3VjY2VzcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIGZkID0gX2RidXNfY29ubmVjdF9leGVjIChwYXRoLCBhcmd2LCBlcnJvcik7CisgIGlmIChmZCA8IDApCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJTdWNjZXNzZnVsbHkgY29ubmVjdGVkIHRvIHByb2Nlc3MgJXNcbiIsCisgICAgICAgICAgICAgICAgIHBhdGgpOworCisgIHRyYW5zcG9ydCA9IF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX3NvY2tldCAoZmQsIE5VTEwsICZhZGRyZXNzKTsKKyAgaWYgKHRyYW5zcG9ydCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisKKyAgcmV0dXJuIHRyYW5zcG9ydDsKKworIGZhaWxlZDoKKyAgaWYgKGZkID49IDApCisgICAgX2RidXNfY2xvc2Vfc29ja2V0IChmZCwgTlVMTCk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhZGRyZXNzKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogT3BlbnMgcGxhdGZvcm0gc3BlY2lmaWMgdHJhbnNwb3J0IHR5cGVzLgorICogCisgKiBAcGFyYW0gZW50cnkgdGhlIGFkZHJlc3MgZW50cnkgdG8gdHJ5IG9wZW5pbmcKKyAqIEBwYXJhbSB0cmFuc3BvcnRfcCByZXR1cm4gbG9jYXRpb24gZm9yIHRoZSBvcGVuZWQgdHJhbnNwb3J0CisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgdG8gYmUgc2V0CisgKiBAcmV0dXJucyByZXN1bHQgb2YgdGhlIGF0dGVtcHQKKyAqLworREJ1c1RyYW5zcG9ydE9wZW5SZXN1bHQKK19kYnVzX3RyYW5zcG9ydF9vcGVuX3BsYXRmb3JtX3NwZWNpZmljIChEQnVzQWRkcmVzc0VudHJ5ICAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RyYW5zcG9ydCAgICAqKnRyYW5zcG9ydF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqbWV0aG9kOworICAKKyAgbWV0aG9kID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF9tZXRob2QgKGVudHJ5KTsKKyAgX2RidXNfYXNzZXJ0IChtZXRob2QgIT0gTlVMTCk7CisKKyAgaWYgKHN0cmNtcCAobWV0aG9kLCAidW5peCIpID09IDApCisgICAgeworICAgICAgY29uc3QgY2hhciAqcGF0aCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAicGF0aCIpOworICAgICAgY29uc3QgY2hhciAqdG1wZGlyID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJ0bXBkaXIiKTsKKyAgICAgIGNvbnN0IGNoYXIgKmFic3RyYWN0ID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJhYnN0cmFjdCIpOworICAgICAgICAgIAorICAgICAgaWYgKHRtcGRpciAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc2V0X2JhZF9hZGRyZXNzIChlcnJvciwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgdXNlIHRoZSBcInRtcGRpclwiIG9wdGlvbiBmb3IgYW4gYWRkcmVzcyB0byBjb25uZWN0IHRvLCBvbmx5IGluIGFuIGFkZHJlc3MgdG8gbGlzdGVuIG9uIik7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fQkFEX0FERFJFU1M7CisgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgIGlmIChwYXRoID09IE5VTEwgJiYgYWJzdHJhY3QgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3NldF9iYWRfYWRkcmVzcyAoZXJyb3IsICJ1bml4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXRoIG9yIGFic3RyYWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX0JBRF9BRERSRVNTOworICAgICAgICB9CisKKyAgICAgIGlmIChwYXRoICE9IE5VTEwgJiYgYWJzdHJhY3QgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3NldF9iYWRfYWRkcmVzcyAoZXJyb3IsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3Qgc3BlY2lmeSBib3RoIFwicGF0aFwiIGFuZCBcImFic3RyYWN0XCIgb3B0aW9ucyBpbiBhbiBhZGRyZXNzIik7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fQkFEX0FERFJFU1M7CisgICAgICAgIH0KKworICAgICAgaWYgKHBhdGgpCisgICAgICAgICp0cmFuc3BvcnRfcCA9IF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX2RvbWFpbl9zb2NrZXQgKHBhdGgsIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgICAgICBlbHNlCisgICAgICAgICp0cmFuc3BvcnRfcCA9IF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX2RvbWFpbl9zb2NrZXQgKGFic3RyYWN0LCBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgICAgICBpZiAoKnRyYW5zcG9ydF9wID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fRElEX05PVF9DT05ORUNUOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9PSzsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChtZXRob2QsICJ1bml4ZXhlYyIpID09IDApCisgICAgeworICAgICAgY29uc3QgY2hhciAqcGF0aDsKKyAgICAgIHVuc2lnbmVkIGk7CisgICAgICBjaGFyICoqYXJndjsKKworICAgICAgcGF0aCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAicGF0aCIpOworICAgICAgaWYgKHBhdGggPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3NldF9iYWRfYWRkcmVzcyAoZXJyb3IsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gcHJvY2VzcyBwYXRoIHNwZWNpZmllZCIpOworICAgICAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX0JBRF9BRERSRVNTOworICAgICAgICB9CisKKyAgICAgIC8qIEZpcnN0IGNvdW50IGFyZ3YgYXJndW1lbnRzICovCisgICAgICBmb3IgKGkgPSAxOyA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIGNoYXIgdFs0KzIwKzFdOyAvKiAiYXJndiIgcGx1cyBzcGFjZSBmb3IgYSBmb3JtYXR0ZWQgYmFzZSAxMCA2NGJpdCBpbnRlZ2VyLCBwbHVzIE5VTCAqLworCisgICAgICAgICAgc25wcmludGYgKHQsIHNpemVvZih0KSwgImFyZ3YldSIsIGkpOworCisgICAgICAgICAgaWYgKCFkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgdCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAvKiBBbGxvY2F0ZSBzdHJpbmcgYXJyYXkgKi8KKyAgICAgIGFyZ3YgPSBkYnVzX25ldzAgKGNoYXIqLCBpKzEpOworICAgICAgaWYgKCFhcmd2KQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fRElEX05PVF9DT05ORUNUOworICAgICAgICB9CisKKyAgICAgIC8qIEZpbGwgaW4gc3RyaW5nIGFycmF5ICovCisgICAgICBmb3IgKGkgPSAwOyA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIGNoYXIgdFs0KzIwKzFdOworICAgICAgICAgIGNvbnN0IGNoYXIgKnA7CisKKyAgICAgICAgICBzbnByaW50ZiAodCwgc2l6ZW9mKHQpLCAiYXJndiV1IiwgaSk7CisKKyAgICAgICAgICBwID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksIHQpOworICAgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgICAgICAgICAvKiBJZiBhcmd2MCBpc24ndCBzcGVjaWZpZWQsIGZpbGwgaW4gdGhlIHBhdGggaW5zdGVhZCAqLworICAgICAgICAgICAgICAgIHAgPSBwYXRoOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBhcmd2W2ldID0gX2RidXNfc3RyZHVwIChwKTsKKyAgICAgICAgICBpZiAoIWFyZ3ZbaV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGFyZ3YpOworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fRElEX05PVF9DT05ORUNUOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICp0cmFuc3BvcnRfcCA9IF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX2V4ZWMgKHBhdGgsIGFyZ3YsIGVycm9yKTsKKyAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGFyZ3YpOworCisgICAgICBpZiAoKnRyYW5zcG9ydF9wID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fRElEX05PVF9DT05ORUNUOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9PSzsKKyAgICAgICAgfQorICAgIH0KKyNpZmRlZiBEQlVTX0VOQUJMRV9MQVVOQ0hECisgIGVsc2UgaWYgKHN0cmNtcCAobWV0aG9kLCAibGF1bmNoZCIpID09IDApCisgICAgeworICAgICAgREJ1c0Vycm9yIHRtcF9lcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgICAgIGNvbnN0IGNoYXIgKmxhdW5jaGRfZW52X3ZhciA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAiZW52Iik7CisgICAgICBjb25zdCBjaGFyICpsYXVuY2hkX3NvY2tldDsKKyAgICAgIERCdXNTdHJpbmcgc29ja2V0X3BhdGg7CisgICAgICBkYnVzX2Jvb2xfdCB2YWxpZF9zb2NrZXQ7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzb2NrZXRfcGF0aCkpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmIChsYXVuY2hkX2Vudl92YXIgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3NldF9iYWRfYWRkcmVzcyAoZXJyb3IsICJsYXVuY2hkIiwgImVudiIsIE5VTEwpOworICAgICAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX0JBRF9BRERSRVNTOworICAgICAgICB9CisKKyAgICAgIHZhbGlkX3NvY2tldCA9IF9kYnVzX2xvb2t1cF9sYXVuY2hkX3NvY2tldCAoJnNvY2tldF9wYXRoLCBsYXVuY2hkX2Vudl92YXIsIGVycm9yKTsKKworICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlKCZzb2NrZXRfcGF0aCk7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fRElEX05PVF9DT05ORUNUOworICAgICAgICB9CisKKyAgICAgIGlmICghdmFsaWRfc29ja2V0KQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IoJnRtcF9lcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAibGF1bmNoZCdzIGVudiB2YXIgJXMgZG9lcyBub3QgZXhpc3QiLCBsYXVuY2hkX2Vudl92YXIpOworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZShlcnJvcik7CisgICAgICAgICAgZGJ1c19tb3ZlX2Vycm9yKCZ0bXBfZXJyb3IsIGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgIH0KKworICAgICAgbGF1bmNoZF9zb2NrZXQgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEoJnNvY2tldF9wYXRoKTsKKyAgICAgICp0cmFuc3BvcnRfcCA9IF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX2RvbWFpbl9zb2NrZXQgKGxhdW5jaGRfc29ja2V0LCBGQUxTRSwgZXJyb3IpOworCisgICAgICBpZiAoKnRyYW5zcG9ydF9wID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fRElEX05PVF9DT05ORUNUOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9PSzsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICBlbHNlCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9OT1RfSEFORExFRDsKKyAgICB9Cit9CisKKy8qKiBAfSAqLworCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworCitkYnVzX2Jvb2xfdAorX2RidXNfdHJhbnNwb3J0X3VuaXhfdGVzdCAodm9pZCkKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmM7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgZGJ1c19ib29sX3QgcmV0OworICBjb25zdCBjaGFyICphZGRyZXNzOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBjID0gZGJ1c19jb25uZWN0aW9uX29wZW4gKCJ1bml4ZXhlYzphcmd2MD1mYWxzZSxhcmd2MT1mb29iYXIscGF0aD0vYmluL2ZhbHNlIiwgJmVycm9yKTsKKyAgX2RidXNfYXNzZXJ0IChjICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKCFkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSk7CisKKyAgYWRkcmVzcyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2FkZHJlc3MgKGMpOworICBfZGJ1c19hc3NlcnQgKGFkZHJlc3MgIT0gTlVMTCk7CisKKyAgLyogTGV0J3Mgc2VlIGlmIHRoZSBhZGRyZXNzIGdvdCBwYXJzZWQsIHJlb3JkZXJlZCBhbmQgZm9ybWF0dGVkIGNvcnJlY3RseSAqLworICByZXQgPSBzdHJjbXAgKGFkZHJlc3MsICJ1bml4ZXhlYzpwYXRoPS9iaW4vZmFsc2UsYXJndjA9ZmFsc2UsYXJndjE9Zm9vYmFyIikgPT0gMDsKKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGMpOworCisgIHJldHVybiByZXQ7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguaCBiL2RidXMvZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgzYTgzMQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmgKQEAgLTAsMCArMSwzNyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXRyYW5zcG9ydC11bml4LmggVU5JWCBzb2NrZXQgc3ViY2xhc3NlcyBvZiBEQnVzVHJhbnNwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZm5kZWYgREJVU19UUkFOU1BPUlRfVU5JWF9ICisjZGVmaW5lIERCVVNfVFJBTlNQT1JUX1VOSVhfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXRyYW5zcG9ydC5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK0RCdXNUcmFuc3BvcnQqIF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX2RvbWFpbl9zb2NrZXQgKGNvbnN0IGNoYXIgICAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBhYnN0cmFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKKworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19UUkFOU1BPUlRfVU5JWF9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy10cmFuc3BvcnQtd2luLmMgYi9kYnVzL2RidXMvZGJ1cy10cmFuc3BvcnQtd2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZjMTU3NAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXRyYW5zcG9ydC13aW4uYwpAQCAtMCwwICsxLDU4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdHJhbnNwb3J0LXdpbi5jIFdpbmRvd3Mgc29ja2V0IHN1YmNsYXNzZXMgb2YgREJ1c1RyYW5zcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCAgUmVkIEhhdCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmFsZiBIYWJhY2tlciA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkYnVzLXRyYW5zcG9ydC1zb2NrZXQuaCIKKyNpbmNsdWRlICJkYnVzLXRyYW5zcG9ydC1wcm90ZWN0ZWQuaCIKKyNpbmNsdWRlICJkYnVzLXdhdGNoLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLXdpbi5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzVHJhbnNwb3J0VW5peCBEQnVzVHJhbnNwb3J0IGltcGxlbWVudGF0aW9ucyBmb3IgVU5JWAorICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIERCdXNUcmFuc3BvcnQgb24gVU5JWAorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBPcGVucyBwbGF0Zm9ybSBzcGVjaWZpYyB0cmFuc3BvcnQgdHlwZXMuCisgKiAKKyAqIEBwYXJhbSBlbnRyeSB0aGUgYWRkcmVzcyBlbnRyeSB0byB0cnkgb3BlbmluZworICogQHBhcmFtIHRyYW5zcG9ydF9wIHJldHVybiBsb2NhdGlvbiBmb3IgdGhlIG9wZW5lZCB0cmFuc3BvcnQKKyAqIEBwYXJhbSBlcnJvciBlcnJvciB0byBiZSBzZXQKKyAqIEByZXR1cm5zIHJlc3VsdCBvZiB0aGUgYXR0ZW1wdAorICovCitEQnVzVHJhbnNwb3J0T3BlblJlc3VsdAorX2RidXNfdHJhbnNwb3J0X29wZW5fcGxhdGZvcm1fc3BlY2lmaWMgKERCdXNBZGRyZXNzRW50cnkgICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHJhbnNwb3J0ICAgICoqdHJhbnNwb3J0X3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICAvKiBjdXJyZW50bHkgbm8gV2luZG93cy1zcGVjaWZpYyB0cmFuc3BvcnRzICovCisgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX05PVF9IQU5ETEVEOworfQorCisvKiogQH0gKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLXRyYW5zcG9ydC13aW4uaCBiL2RidXMvZGJ1cy9kYnVzLXRyYW5zcG9ydC13aW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjk5N2EyCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtdHJhbnNwb3J0LXdpbi5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy10cmFuc3BvcnQtd2luLmggV2luZG93cyBzb2NrZXQgc3ViY2xhc3NlcyBvZiBEQnVzVHJhbnNwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0IEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBSYWxmIEhhYmFja2VyIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfVFJBTlNQT1JUX1dJTl9ICisjZGVmaW5lIERCVVNfVFJBTlNQT1JUX1dJTl9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtdHJhbnNwb3J0Lmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfVFJBTlNQT1JUX1dJTl9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy10cmFuc3BvcnQuYyBiL2RidXMvZGJ1cy9kYnVzLXRyYW5zcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNThmZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy10cmFuc3BvcnQuYwpAQCAtMCwwICsxLDE1MTYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy10cmFuc3BvcnQuYyBEQnVzVHJhbnNwb3J0IG9iamVjdCAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtdHJhbnNwb3J0LXByb3RlY3RlZC5oIgorI2luY2x1ZGUgImRidXMtdHJhbnNwb3J0LXVuaXguaCIKKyNpbmNsdWRlICJkYnVzLXRyYW5zcG9ydC1zb2NrZXQuaCIKKyNpbmNsdWRlICJkYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkYnVzLXdhdGNoLmgiCisjaW5jbHVkZSAiZGJ1cy1hdXRoLmgiCisjaW5jbHVkZSAiZGJ1cy1hZGRyZXNzLmgiCisjaW5jbHVkZSAiZGJ1cy1jcmVkZW50aWFscy5oIgorI2luY2x1ZGUgImRidXMtbWFpbmxvb3AuaCIKKyNpbmNsdWRlICJkYnVzLW1lc3NhZ2UuaCIKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisjaW5jbHVkZSAiZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5oIgorI2VuZGlmCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNUcmFuc3BvcnQgREJ1c1RyYW5zcG9ydCBvYmplY3QKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgIkJhY2tlbmQiIGZvciBhIERCdXNDb25uZWN0aW9uLgorICoKKyAqIFR5cGVzIGFuZCBmdW5jdGlvbnMgcmVsYXRlZCB0byBEQnVzVHJhbnNwb3J0LiAgQSB0cmFuc3BvcnQgaXMgYW4KKyAqIGFic3RyYWN0aW9uIHRoYXQgY2FuIHNlbmQgYW5kIHJlY2VpdmUgZGF0YSB2aWEgdmFyaW91cyBraW5kcyBvZgorICogbmV0d29yayBjb25uZWN0aW9ucyBvciBvdGhlciBJUEMgbWVjaGFuaXNtcy4KKyAqIAorICogQHsKKyAqLworCisvKioKKyAqIEB0eXBlZGVmIERCdXNUcmFuc3BvcnQKKyAqCisgKiBPcGFxdWUgb2JqZWN0IHJlcHJlc2VudGluZyBhIHdheSBtZXNzYWdlIHN0cmVhbS4KKyAqIERCdXNUcmFuc3BvcnQgYWJzdHJhY3RzIHZhcmlvdXMga2luZHMgb2YgYWN0dWFsCisgKiB0cmFuc3BvcnQgbWVjaGFuaXNtLCBzdWNoIGFzIGRpZmZlcmVudCBuZXR3b3JrIHByb3RvY29scywKKyAqIG9yIGVuY3J5cHRpb24gc2NoZW1lcy4KKyAqLworCitzdGF0aWMgdm9pZAorbGl2ZV9tZXNzYWdlc19ub3RpZnkgKERCdXNDb3VudGVyICpjb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0ID0gdXNlcl9kYXRhOworCisgIF9kYnVzX3RyYW5zcG9ydF9yZWYgKHRyYW5zcG9ydCk7CisKKyNpZiAwCisgIF9kYnVzX3ZlcmJvc2UgKCJTaXplIGNvdW50ZXIgdmFsdWUgaXMgbm93ICVkXG4iLAorICAgICAgICAgICAgICAgICAoaW50KSBfZGJ1c19jb3VudGVyX2dldF9zaXplX3ZhbHVlIChjb3VudGVyKSk7CisgIF9kYnVzX3ZlcmJvc2UgKCJVbml4IEZEIGNvdW50ZXIgdmFsdWUgaXMgbm93ICVkXG4iLAorICAgICAgICAgICAgICAgICAoaW50KSBfZGJ1c19jb3VudGVyX2dldF91bml4X2ZkX3ZhbHVlIChjb3VudGVyKSk7CisjZW5kaWYKKworICAvKiBkaXNhYmxlIG9yIHJlLWVuYWJsZSB0aGUgcmVhZCB3YXRjaCBmb3IgdGhlIHRyYW5zcG9ydCBpZgorICAgKiByZXF1aXJlZC4KKyAgICovCisgIGlmICh0cmFuc3BvcnQtPnZ0YWJsZS0+bGl2ZV9tZXNzYWdlc19jaGFuZ2VkKQorICAgIHsKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fbG9jayAodHJhbnNwb3J0LT5jb25uZWN0aW9uKTsKKyAgICAgICgqIHRyYW5zcG9ydC0+dnRhYmxlLT5saXZlX21lc3NhZ2VzX2NoYW5nZWQpICh0cmFuc3BvcnQpOworICAgICAgX2RidXNfY29ubmVjdGlvbl91bmxvY2sgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbik7CisgICAgfQorCisgIF9kYnVzX3RyYW5zcG9ydF91bnJlZiAodHJhbnNwb3J0KTsKK30KKworLyoqCisgKiBJbml0aWFsaXplcyB0aGUgYmFzZSBjbGFzcyBtZW1iZXJzIG9mIERCdXNUcmFuc3BvcnQuICBDaGFpbmVkIHVwIHRvCisgKiBieSBzdWJjbGFzc2VzIGluIHRoZWlyIGNvbnN0cnVjdG9yLiAgVGhlIHNlcnZlciBHVUlEIGlzIHRoZQorICogZ2xvYmFsbHkgdW5pcXVlIElEIGZvciB0aGUgc2VydmVyIGNyZWF0aW5nIHRoaXMgY29ubmVjdGlvbgorICogYW5kIHdpbGwgYmUgI05VTEwgZm9yIHRoZSBjbGllbnQgc2lkZSBvZiBhIGNvbm5lY3Rpb24uIFRoZSBHVUlECisgKiBpcyBpbiBoZXggZm9ybWF0LgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydCBiZWluZyBjcmVhdGVkLgorICogQHBhcmFtIHZ0YWJsZSB0aGUgc3ViY2xhc3MgdnRhYmxlLgorICogQHBhcmFtIHNlcnZlcl9ndWlkIG5vbi0jTlVMTCBpZiB0aGlzIHRyYW5zcG9ydCBpcyBvbiB0aGUgc2VydmVyIHNpZGUgb2YgYSBjb25uZWN0aW9uCisgKiBAcGFyYW0gYWRkcmVzcyB0aGUgYWRkcmVzcyBvZiB0aGUgdHJhbnNwb3J0CisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHJhbnNwb3J0X2luaXRfYmFzZSAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1RyYW5zcG9ydFZUYWJsZSAqdnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgICAgICAqc2VydmVyX2d1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICphZGRyZXNzKQoreworICBEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyOworICBEQnVzQXV0aCAqYXV0aDsKKyAgREJ1c0NvdW50ZXIgKmNvdW50ZXI7CisgIGNoYXIgKmFkZHJlc3NfY29weTsKKyAgREJ1c0NyZWRlbnRpYWxzICpjcmVkczsKKyAgCisgIGxvYWRlciA9IF9kYnVzX21lc3NhZ2VfbG9hZGVyX25ldyAoKTsKKyAgaWYgKGxvYWRlciA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGlmIChzZXJ2ZXJfZ3VpZCkKKyAgICBhdXRoID0gX2RidXNfYXV0aF9zZXJ2ZXJfbmV3IChzZXJ2ZXJfZ3VpZCk7CisgIGVsc2UKKyAgICBhdXRoID0gX2RidXNfYXV0aF9jbGllbnRfbmV3ICgpOworICBpZiAoYXV0aCA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3VucmVmIChsb2FkZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBjb3VudGVyID0gX2RidXNfY291bnRlcl9uZXcgKCk7CisgIGlmIChjb3VudGVyID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXV0aF91bnJlZiAoYXV0aCk7CisgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl91bnJlZiAobG9hZGVyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9ICAKKworICBjcmVkcyA9IF9kYnVzX2NyZWRlbnRpYWxzX25ldyAoKTsKKyAgaWYgKGNyZWRzID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfY291bnRlcl91bnJlZiAoY291bnRlcik7CisgICAgICBfZGJ1c19hdXRoX3VucmVmIChhdXRoKTsKKyAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3VucmVmIChsb2FkZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmIChzZXJ2ZXJfZ3VpZCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKGFkZHJlc3MgPT0gTlVMTCk7CisgICAgICBhZGRyZXNzX2NvcHkgPSBOVUxMOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoYWRkcmVzcyAhPSBOVUxMKTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9kYXRhIChhZGRyZXNzLCAmYWRkcmVzc19jb3B5KSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkcyk7CisgICAgICAgICAgX2RidXNfY291bnRlcl91bnJlZiAoY291bnRlcik7CisgICAgICAgICAgX2RidXNfYXV0aF91bnJlZiAoYXV0aCk7CisgICAgICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfdW5yZWYgKGxvYWRlcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorICAKKyAgdHJhbnNwb3J0LT5yZWZjb3VudCA9IDE7CisgIHRyYW5zcG9ydC0+dnRhYmxlID0gdnRhYmxlOworICB0cmFuc3BvcnQtPmxvYWRlciA9IGxvYWRlcjsKKyAgdHJhbnNwb3J0LT5hdXRoID0gYXV0aDsKKyAgdHJhbnNwb3J0LT5saXZlX21lc3NhZ2VzID0gY291bnRlcjsKKyAgdHJhbnNwb3J0LT5hdXRoZW50aWNhdGVkID0gRkFMU0U7CisgIHRyYW5zcG9ydC0+ZGlzY29ubmVjdGVkID0gRkFMU0U7CisgIHRyYW5zcG9ydC0+aXNfc2VydmVyID0gKHNlcnZlcl9ndWlkICE9IE5VTEwpOworICB0cmFuc3BvcnQtPnNlbmRfY3JlZGVudGlhbHNfcGVuZGluZyA9ICF0cmFuc3BvcnQtPmlzX3NlcnZlcjsKKyAgdHJhbnNwb3J0LT5yZWNlaXZlX2NyZWRlbnRpYWxzX3BlbmRpbmcgPSB0cmFuc3BvcnQtPmlzX3NlcnZlcjsKKyAgdHJhbnNwb3J0LT5hZGRyZXNzID0gYWRkcmVzc19jb3B5OworICAKKyAgdHJhbnNwb3J0LT51bml4X3VzZXJfZnVuY3Rpb24gPSBOVUxMOworICB0cmFuc3BvcnQtPnVuaXhfdXNlcl9kYXRhID0gTlVMTDsKKyAgdHJhbnNwb3J0LT5mcmVlX3VuaXhfdXNlcl9kYXRhID0gTlVMTDsKKworICB0cmFuc3BvcnQtPndpbmRvd3NfdXNlcl9mdW5jdGlvbiA9IE5VTEw7CisgIHRyYW5zcG9ydC0+d2luZG93c191c2VyX2RhdGEgPSBOVUxMOworICB0cmFuc3BvcnQtPmZyZWVfd2luZG93c191c2VyX2RhdGEgPSBOVUxMOworICAKKyAgdHJhbnNwb3J0LT5leHBlY3RlZF9ndWlkID0gTlVMTDsKKyAgCisgIC8qIFRyeSB0byBkZWZhdWx0IHRvIHNvbWV0aGluZyB0aGF0IHdvbid0IHRvdGFsbHkgaG9zZSB0aGUgc3lzdGVtLAorICAgKiBidXQgZG9lc24ndCBpbXBvc2UgdG9vIG11Y2ggb2YgYSBsaW1pdGF0aW9uLgorICAgKi8KKyAgdHJhbnNwb3J0LT5tYXhfbGl2ZV9tZXNzYWdlc19zaXplID0gX0RCVVNfT05FX01FR0FCWVRFICogNjM7CisKKyAgLyogT24gTGludXggUkxJTUlUX05PRklMRSBkZWZhdWx0cyB0byAxMDI0LCBzbyBhbGxvd2luZyA0MDk2IGZkcyBsaXZlCisgICAgIHNob3VsZCBiZSBtb3JlIHRoYW4gZW5vdWdoICovCisgIHRyYW5zcG9ydC0+bWF4X2xpdmVfbWVzc2FnZXNfdW5peF9mZHMgPSA0MDk2OworCisgIC8qIGNyZWRlbnRpYWxzIHJlYWQgZnJvbSBzb2NrZXQgaWYgYW55ICovCisgIHRyYW5zcG9ydC0+Y3JlZGVudGlhbHMgPSBjcmVkczsKKworICBfZGJ1c19jb3VudGVyX3NldF9ub3RpZnkgKHRyYW5zcG9ydC0+bGl2ZV9tZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQtPm1heF9saXZlX21lc3NhZ2VzX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LT5tYXhfbGl2ZV9tZXNzYWdlc191bml4X2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlX21lc3NhZ2VzX25vdGlmeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQpOworCisgIGlmICh0cmFuc3BvcnQtPmFkZHJlc3MpCisgICAgX2RidXNfdmVyYm9zZSAoIkluaXRpYWxpemVkIHRyYW5zcG9ydCBvbiBhZGRyZXNzICVzXG4iLCB0cmFuc3BvcnQtPmFkZHJlc3MpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEZpbmFsaXplcyBiYXNlIGNsYXNzIG1lbWJlcnMgb2YgREJ1c1RyYW5zcG9ydC4KKyAqIENoYWluZWQgdXAgdG8gZnJvbSBzdWJjbGFzcyBmaW5hbGl6ZXJzLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydC4KKyAqLwordm9pZAorX2RidXNfdHJhbnNwb3J0X2ZpbmFsaXplX2Jhc2UgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgaWYgKCF0cmFuc3BvcnQtPmRpc2Nvbm5lY3RlZCkKKyAgICBfZGJ1c190cmFuc3BvcnRfZGlzY29ubmVjdCAodHJhbnNwb3J0KTsKKworICBpZiAodHJhbnNwb3J0LT5mcmVlX3VuaXhfdXNlcl9kYXRhICE9IE5VTEwpCisgICAgKCogdHJhbnNwb3J0LT5mcmVlX3VuaXhfdXNlcl9kYXRhKSAodHJhbnNwb3J0LT51bml4X3VzZXJfZGF0YSk7CisKKyAgaWYgKHRyYW5zcG9ydC0+ZnJlZV93aW5kb3dzX3VzZXJfZGF0YSAhPSBOVUxMKQorICAgICgqIHRyYW5zcG9ydC0+ZnJlZV93aW5kb3dzX3VzZXJfZGF0YSkgKHRyYW5zcG9ydC0+d2luZG93c191c2VyX2RhdGEpOworICAKKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfdW5yZWYgKHRyYW5zcG9ydC0+bG9hZGVyKTsKKyAgX2RidXNfYXV0aF91bnJlZiAodHJhbnNwb3J0LT5hdXRoKTsKKyAgX2RidXNfY291bnRlcl9zZXRfbm90aWZ5ICh0cmFuc3BvcnQtPmxpdmVfbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgTlVMTCwgTlVMTCk7CisgIF9kYnVzX2NvdW50ZXJfdW5yZWYgKHRyYW5zcG9ydC0+bGl2ZV9tZXNzYWdlcyk7CisgIGRidXNfZnJlZSAodHJhbnNwb3J0LT5hZGRyZXNzKTsKKyAgZGJ1c19mcmVlICh0cmFuc3BvcnQtPmV4cGVjdGVkX2d1aWQpOworICBpZiAodHJhbnNwb3J0LT5jcmVkZW50aWFscykKKyAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAodHJhbnNwb3J0LT5jcmVkZW50aWFscyk7Cit9CisKKworLyoqCisgKiBWZXJpZmllcyBpZiBhIGdpdmVuIEQtQnVzIGFkZHJlc3MgaXMgYSB2YWxpZCBhZGRyZXNzCisgKiBieSBhdHRlbXB0aW5nIHRvIGNvbm5lY3QgdG8gaXQuIElmIGl0IGlzLCByZXR1cm5zIHRoZQorICogb3BlbmVkIERCdXNUcmFuc3BvcnQgb2JqZWN0LiBJZiBpdCBpc24ndCwgcmV0dXJucyAjTlVMTAorICogYW5kIHNldHMgQHAgZXJyb3IuCisgKgorICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgd2hlcmUgYW4gZXJyb3IgY2FuIGJlIHJldHVybmVkLgorICogQHJldHVybnMgYSBuZXcgdHJhbnNwb3J0LCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgREJ1c1RyYW5zcG9ydCoKK2NoZWNrX2FkZHJlc3MgKGNvbnN0IGNoYXIgKmFkZHJlc3MsIERCdXNFcnJvciAqZXJyb3IpCit7CisgIERCdXNBZGRyZXNzRW50cnkgKiplbnRyaWVzOworICBEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBpbnQgbGVuLCBpOworCisgIF9kYnVzX2Fzc2VydCAoYWRkcmVzcyAhPSBOVUxMKTsKKworICBpZiAoIWRidXNfcGFyc2VfYWRkcmVzcyAoYWRkcmVzcywgJmVudHJpZXMsICZsZW4sIGVycm9yKSkKKyAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgIC8qIG5vdCBhIHZhbGlkIGFkZHJlc3MgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgeworICAgICAgdHJhbnNwb3J0ID0gX2RidXNfdHJhbnNwb3J0X29wZW4gKGVudHJpZXNbaV0sIGVycm9yKTsKKyAgICAgIGlmICh0cmFuc3BvcnQgIT0gTlVMTCkKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgIGRidXNfYWRkcmVzc19lbnRyaWVzX2ZyZWUgKGVudHJpZXMpOworICByZXR1cm4gdHJhbnNwb3J0OworfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgdHJhbnNwb3J0IGZvciB0aGUgImF1dG9zdGFydCIgbWV0aG9kLgorICogVGhpcyBjcmVhdGVzIGEgY2xpZW50LXNpZGUgb2YgYSB0cmFuc3BvcnQuCisgKgorICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgd2hlcmUgYW4gZXJyb3IgY2FuIGJlIHJldHVybmVkLgorICogQHJldHVybnMgYSBuZXcgdHJhbnNwb3J0LCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgREJ1c1RyYW5zcG9ydCoKK19kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX2F1dG9sYXVuY2ggKGNvbnN0IGNoYXIgKnNjb3BlLCBEQnVzRXJyb3IgKmVycm9yKQoreworICBEQnVzU3RyaW5nIGFkZHJlc3M7CisgIERCdXNUcmFuc3BvcnQgKnJlc3VsdCA9IE5VTEw7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmFkZHJlc3MpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmICghX2RidXNfZ2V0X2F1dG9sYXVuY2hfYWRkcmVzcyAoc2NvcGUsICZhZGRyZXNzLCBlcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJlc3VsdCA9IGNoZWNrX2FkZHJlc3MgKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmFkZHJlc3MpLCBlcnJvcik7CisgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIGVsc2UKKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworIG91dDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhZGRyZXNzKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIERCdXNUcmFuc3BvcnRPcGVuUmVzdWx0CitfZGJ1c190cmFuc3BvcnRfb3Blbl9hdXRvbGF1bmNoIChEQnVzQWRkcmVzc0VudHJ5ICAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHJhbnNwb3J0ICAgICoqdHJhbnNwb3J0X3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKm1ldGhvZDsKKyAgCisgIG1ldGhvZCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfbWV0aG9kIChlbnRyeSk7CisgIF9kYnVzX2Fzc2VydCAobWV0aG9kICE9IE5VTEwpOworCisgIGlmIChzdHJjbXAgKG1ldGhvZCwgImF1dG9sYXVuY2giKSA9PSAwKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnNjb3BlID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJzY29wZSIpOworCisgICAgICAqdHJhbnNwb3J0X3AgPSBfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl9hdXRvbGF1bmNoIChzY29wZSwgZXJyb3IpOworCisgICAgICBpZiAoKnRyYW5zcG9ydF9wID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fRElEX05PVF9DT05ORUNUOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9PSzsKKyAgICAgICAgfSAgICAgIAorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fTk9UX0hBTkRMRUQ7CisgICAgfQorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgREJ1c1RyYW5zcG9ydE9wZW5SZXN1bHQgKCogZnVuYykgKERCdXNBZGRyZXNzRW50cnkgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RyYW5zcG9ydCAgICoqdHJhbnNwb3J0X3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7Cit9IG9wZW5fZnVuY3NbXSA9IHsKKyAgeyBfZGJ1c190cmFuc3BvcnRfb3Blbl9zb2NrZXQgfSwKKyAgeyBfZGJ1c190cmFuc3BvcnRfb3Blbl9wbGF0Zm9ybV9zcGVjaWZpYyB9LAorICB7IF9kYnVzX3RyYW5zcG9ydF9vcGVuX2F1dG9sYXVuY2ggfQorI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgLCB7IF9kYnVzX3RyYW5zcG9ydF9vcGVuX2RlYnVnX3BpcGUgfQorI2VuZGlmCit9OworCisvKioKKyAqIFRyeSB0byBvcGVuIGEgbmV3IHRyYW5zcG9ydCBmb3IgdGhlIGdpdmVuIGFkZHJlc3MgZW50cnkuICAoVGhpcworICogb3BlbnMgYSBjbGllbnQtc2lkZS1vZi10aGUtY29ubmVjdGlvbiB0cmFuc3BvcnQuKQorICogCisgKiBAcGFyYW0gZW50cnkgdGhlIGFkZHJlc3MgZW50cnkKKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSByZWFzb24gZm9yIGZhaWx1cmUuCisgKiBAcmV0dXJucyBuZXcgdHJhbnNwb3J0IG9mICNOVUxMIG9uIGZhaWx1cmUuCisgKi8KK0RCdXNUcmFuc3BvcnQqCitfZGJ1c190cmFuc3BvcnRfb3BlbiAoREJ1c0FkZHJlc3NFbnRyeSAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydDsKKyAgY29uc3QgY2hhciAqZXhwZWN0ZWRfZ3VpZF9vcmlnOworICBjaGFyICpleHBlY3RlZF9ndWlkOworICBpbnQgaTsKKyAgREJ1c0Vycm9yIHRtcF9lcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIHRyYW5zcG9ydCA9IE5VTEw7CisgIGV4cGVjdGVkX2d1aWRfb3JpZyA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAiZ3VpZCIpOworICBleHBlY3RlZF9ndWlkID0gX2RidXNfc3RyZHVwIChleHBlY3RlZF9ndWlkX29yaWcpOworCisgIGlmIChleHBlY3RlZF9ndWlkX29yaWcgIT0gTlVMTCAmJiBleHBlY3RlZF9ndWlkID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGZvciAoaSA9IDA7IGkgPCAoaW50KSBfREJVU19OX0VMRU1FTlRTIChvcGVuX2Z1bmNzKTsgKytpKQorICAgIHsKKyAgICAgIERCdXNUcmFuc3BvcnRPcGVuUmVzdWx0IHJlc3VsdDsKKworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSICgmdG1wX2Vycm9yKTsKKyAgICAgIHJlc3VsdCA9ICgqIG9wZW5fZnVuY3NbaV0uZnVuYykgKGVudHJ5LCAmdHJhbnNwb3J0LCAmdG1wX2Vycm9yKTsKKworICAgICAgc3dpdGNoIChyZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBEQlVTX1RSQU5TUE9SVF9PUEVOX09LOgorICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoJnRtcF9lcnJvcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgREJVU19UUkFOU1BPUlRfT1BFTl9OT1RfSEFORExFRDoKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKCZ0bXBfZXJyb3IpOworICAgICAgICAgIC8qIGtlZXAgZ29pbmcgdGhyb3VnaCB0aGUgbG9vcCBvZiBvcGVuIGZ1bmNzICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgREJVU19UUkFOU1BPUlRfT1BFTl9CQURfQUREUkVTUzoKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmdG1wX2Vycm9yKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEQlVTX1RSQU5TUE9SVF9PUEVOX0RJRF9OT1RfQ09OTkVDVDoKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmdG1wX2Vycm9yKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworIG91dDoKKyAgCisgIGlmICh0cmFuc3BvcnQgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIWRidXNfZXJyb3JfaXNfc2V0ICgmdG1wX2Vycm9yKSkKKyAgICAgICAgX2RidXNfc2V0X2JhZF9hZGRyZXNzICgmdG1wX2Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gYWRkcmVzcyB0eXBlIChleGFtcGxlcyBvZiB2YWxpZCB0eXBlcyBhcmUgXCJ0Y3BcIiBhbmQgb24gVU5JWCBcInVuaXhcIikiKTsKKyAgICAgIAorICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJnRtcF9lcnJvcik7CisgICAgICBkYnVzX21vdmVfZXJyb3IoJnRtcF9lcnJvciwgZXJyb3IpOworICAgICAgZGJ1c19mcmVlIChleHBlY3RlZF9ndWlkKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKCZ0bXBfZXJyb3IpOworCisgICAgICAvKiBJbiB0aGUgY2FzZSBvZiBhdXRvc3RhcnQgdGhlIGluaXRpYWwgZ3VpZCBpcyBOVUxMCisgICAgICAgKiBhbmQgdGhlIGF1dG9zdGFydCB0cmFuc3BvcnQgcmVjdXJzaXZlbHkgY2FsbHMKKyAgICAgICAqIF9kYnVzX29wZW5fdHJhbnNwb3J0IHdpY2ggcmV0dXJucyBhIHRyYW5zcG9ydAorICAgICAgICogd2l0aCBhIGd1aWQuICBUaGF0IGd1aWQgaXMgdGhlIGRlZmluaXRpdmUgb25lLgorICAgICAgICoKKyAgICAgICAqIEZJWE1FOiBpZiBtb3JlIHRyYW5zcG9ydHMgYXJlIGFkZGVkIHRoZXkgbWF5IGhhdmUKKyAgICAgICAqIGFuIGVmZmVjdCBvbiB0aGUgZXhwZWN0ZWRfZ3VpZCBzZW1hbnRpY3MgKGkuZS4gCisgICAgICAgKiBleHBlY3RlZF9ndWlkIGFuZCB0cmFuc3BvcnQtPmV4cGVjdGVkX2d1aWQgbWF5CisgICAgICAgKiBib3RoIGhhdmUgdmFsdWVzKS4gIFRoaXMgaXMgdmVyeSB1bmxpa2VseSB0aG91Z2gKKyAgICAgICAqIHdlIHNob3VsZCBlaXRoZXIgdGhyb3cgYXNzZXJ0cyBoZXJlIGZvciB0aG9zZSAKKyAgICAgICAqIGNvcm5lciBjYXNlcyBvciByZWZhY3RvciB0aGUgY29kZSBzbyBpdCBpcyAKKyAgICAgICAqIGNsZWFyZXIgb24gd2hhdCBpcyBleHBlY3RlZCBhbmQgd2hhdCBpcyBub3QKKyAgICAgICAqLworICAgICAgaWYoZXhwZWN0ZWRfZ3VpZCkKKyAgICAgICAgdHJhbnNwb3J0LT5leHBlY3RlZF9ndWlkID0gZXhwZWN0ZWRfZ3VpZDsKKyAgICB9CisKKyAgcmV0dXJuIHRyYW5zcG9ydDsKK30KKworLyoqCisgKiBJbmNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgZm9yIHRoZSB0cmFuc3BvcnQuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0LgorICogQHJldHVybnMgdGhlIHRyYW5zcG9ydC4KKyAqLworREJ1c1RyYW5zcG9ydCAqCitfZGJ1c190cmFuc3BvcnRfcmVmIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIF9kYnVzX2Fzc2VydCAodHJhbnNwb3J0LT5yZWZjb3VudCA+IDApOworICAKKyAgdHJhbnNwb3J0LT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiB0cmFuc3BvcnQ7Cit9CisKKy8qKgorICogRGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IGZvciB0aGUgdHJhbnNwb3J0LgorICogRGlzY29ubmVjdHMgYW5kIGZpbmFsaXplcyB0aGUgdHJhbnNwb3J0IGlmCisgKiB0aGUgcmVmZXJlbmNlIGNvdW50IHJlYWNoZXMgemVyby4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQuCisgKi8KK3ZvaWQKK19kYnVzX3RyYW5zcG9ydF91bnJlZiAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBfZGJ1c19hc3NlcnQgKHRyYW5zcG9ydCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0ICh0cmFuc3BvcnQtPnJlZmNvdW50ID4gMCk7CisgIAorICB0cmFuc3BvcnQtPnJlZmNvdW50IC09IDE7CisgIGlmICh0cmFuc3BvcnQtPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImZpbmFsaXppbmdcbiIpOworICAgICAgCisgICAgICBfZGJ1c19hc3NlcnQgKHRyYW5zcG9ydC0+dnRhYmxlLT5maW5hbGl6ZSAhPSBOVUxMKTsKKyAgICAgIAorICAgICAgKCogdHJhbnNwb3J0LT52dGFibGUtPmZpbmFsaXplKSAodHJhbnNwb3J0KTsKKyAgICB9Cit9CisKKy8qKgorICogQ2xvc2VzIG91ciBlbmQgb2YgdGhlIGNvbm5lY3Rpb24gdG8gYSByZW1vdGUgYXBwbGljYXRpb24uIEZ1cnRoZXIKKyAqIGF0dGVtcHRzIHRvIHVzZSB0aGlzIHRyYW5zcG9ydCB3aWxsIGZhaWwuIE9ubHkgdGhlIGZpcnN0IGNhbGwgdG8KKyAqIF9kYnVzX3RyYW5zcG9ydF9kaXNjb25uZWN0KCkgd2lsbCBoYXZlIGFuIGVmZmVjdC4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQuCisgKiAKKyAqLwordm9pZAorX2RidXNfdHJhbnNwb3J0X2Rpc2Nvbm5lY3QgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgX2RidXNfdmVyYm9zZSAoInN0YXJ0XG4iKTsKKyAgCisgIF9kYnVzX2Fzc2VydCAodHJhbnNwb3J0LT52dGFibGUtPmRpc2Nvbm5lY3QgIT0gTlVMTCk7CisgIAorICBpZiAodHJhbnNwb3J0LT5kaXNjb25uZWN0ZWQpCisgICAgcmV0dXJuOworCisgICgqIHRyYW5zcG9ydC0+dnRhYmxlLT5kaXNjb25uZWN0KSAodHJhbnNwb3J0KTsKKyAgCisgIHRyYW5zcG9ydC0+ZGlzY29ubmVjdGVkID0gVFJVRTsKKworICBfZGJ1c192ZXJib3NlICgiZW5kXG4iKTsKK30KKworLyoqCisgKiBSZXR1cm5zICNUUlVFIGlmIHRoZSB0cmFuc3BvcnQgaGFzIG5vdCBiZWVuIGRpc2Nvbm5lY3RlZC4KKyAqIERpc2Nvbm5lY3Rpb24gY2FuIHJlc3VsdCBmcm9tIF9kYnVzX3RyYW5zcG9ydF9kaXNjb25uZWN0KCkKKyAqIG9yIGJlY2F1c2UgdGhlIHNlcnZlciBkcm9wcyBpdHMgZW5kIG9mIHRoZSBjb25uZWN0aW9uLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydC4KKyAqIEByZXR1cm5zIHdoZXRoZXIgd2UncmUgY29ubmVjdGVkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2Nvbm5lY3RlZCAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICByZXR1cm4gIXRyYW5zcG9ydC0+ZGlzY29ubmVjdGVkOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2F1dGhfdmlhX3VuaXhfdXNlcl9mdW5jdGlvbiAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBEQnVzQ3JlZGVudGlhbHMgKmF1dGhfaWRlbnRpdHk7CisgIGRidXNfYm9vbF90IGFsbG93OworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgREJ1c0FsbG93VW5peFVzZXJGdW5jdGlvbiB1bml4X3VzZXJfZnVuY3Rpb247CisgIHZvaWQgKnVuaXhfdXNlcl9kYXRhOworICBkYnVzX3VpZF90IHVpZDsKKworICAvKiBEcm9wcGluZyB0aGUgbG9jayBoZXJlIHByb2JhYmx5IGlzbid0IHRoYXQgc2FmZS4gKi8KKyAgCisgIGF1dGhfaWRlbnRpdHkgPSBfZGJ1c19hdXRoX2dldF9pZGVudGl0eSAodHJhbnNwb3J0LT5hdXRoKTsKKyAgX2RidXNfYXNzZXJ0IChhdXRoX2lkZW50aXR5ICE9IE5VTEwpOworCisgIGNvbm5lY3Rpb24gPSB0cmFuc3BvcnQtPmNvbm5lY3Rpb247CisgIHVuaXhfdXNlcl9mdW5jdGlvbiA9IHRyYW5zcG9ydC0+dW5peF91c2VyX2Z1bmN0aW9uOworICB1bml4X3VzZXJfZGF0YSA9IHRyYW5zcG9ydC0+dW5peF91c2VyX2RhdGE7CisgIHVpZCA9IF9kYnVzX2NyZWRlbnRpYWxzX2dldF91bml4X3VpZCAoYXV0aF9pZGVudGl0eSk7CisgICAgICAgICAgICAgIAorICBfZGJ1c192ZXJib3NlICgidW5sb2NrXG4iKTsKKyAgX2RidXNfY29ubmVjdGlvbl91bmxvY2sgKGNvbm5lY3Rpb24pOworCisgIGFsbG93ID0gKCogdW5peF91c2VyX2Z1bmN0aW9uKSAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5peF91c2VyX2RhdGEpOworICAgICAgICAgICAgICAKKyAgX2RidXNfdmVyYm9zZSAoImxvY2sgcG9zdCB1bml4IHVzZXIgZnVuY3Rpb25cbiIpOworICBfZGJ1c19jb25uZWN0aW9uX2xvY2sgKGNvbm5lY3Rpb24pOworCisgIGlmIChhbGxvdykKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiQ2xpZW50IFVJRCAiREJVU19VSURfRk9STUFUIiBhdXRob3JpemVkXG4iLCB1aWQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDbGllbnQgVUlEICJEQlVTX1VJRF9GT1JNQVQKKyAgICAgICAgICAgICAgICAgICAgICIgd2FzIHJlamVjdGVkLCBkaXNjb25uZWN0aW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfZ2V0X3VuaXhfdWlkIChhdXRoX2lkZW50aXR5KSk7CisgICAgICBfZGJ1c190cmFuc3BvcnRfZGlzY29ubmVjdCAodHJhbnNwb3J0KTsKKyAgICB9CisKKyAgcmV0dXJuIGFsbG93OworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2F1dGhfdmlhX3dpbmRvd3NfdXNlcl9mdW5jdGlvbiAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBEQnVzQ3JlZGVudGlhbHMgKmF1dGhfaWRlbnRpdHk7ICAKKyAgZGJ1c19ib29sX3QgYWxsb3c7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICBEQnVzQWxsb3dXaW5kb3dzVXNlckZ1bmN0aW9uIHdpbmRvd3NfdXNlcl9mdW5jdGlvbjsKKyAgdm9pZCAqd2luZG93c191c2VyX2RhdGE7CisgIGNoYXIgKndpbmRvd3Nfc2lkOworCisgIC8qIERyb3BwaW5nIHRoZSBsb2NrIGhlcmUgcHJvYmFibHkgaXNuJ3QgdGhhdCBzYWZlLiAqLworICAKKyAgYXV0aF9pZGVudGl0eSA9IF9kYnVzX2F1dGhfZ2V0X2lkZW50aXR5ICh0cmFuc3BvcnQtPmF1dGgpOworICBfZGJ1c19hc3NlcnQgKGF1dGhfaWRlbnRpdHkgIT0gTlVMTCk7CisKKyAgY29ubmVjdGlvbiA9IHRyYW5zcG9ydC0+Y29ubmVjdGlvbjsKKyAgd2luZG93c191c2VyX2Z1bmN0aW9uID0gdHJhbnNwb3J0LT53aW5kb3dzX3VzZXJfZnVuY3Rpb247CisgIHdpbmRvd3NfdXNlcl9kYXRhID0gdHJhbnNwb3J0LT51bml4X3VzZXJfZGF0YTsKKyAgd2luZG93c19zaWQgPSBfZGJ1c19zdHJkdXAgKF9kYnVzX2NyZWRlbnRpYWxzX2dldF93aW5kb3dzX3NpZCAoYXV0aF9pZGVudGl0eSkpOworCisgIGlmICh3aW5kb3dzX3NpZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIE9PTSAqLworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgX2RidXNfdmVyYm9zZSAoInVubG9ja1xuIik7CisgIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrIChjb25uZWN0aW9uKTsKKworICBhbGxvdyA9ICgqIHdpbmRvd3NfdXNlcl9mdW5jdGlvbikgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93c19zaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93c191c2VyX2RhdGEpOworICAgICAgICAgICAgICAKKyAgX2RidXNfdmVyYm9zZSAoImxvY2sgcG9zdCB3aW5kb3dzIHVzZXIgZnVuY3Rpb25cbiIpOworICBfZGJ1c19jb25uZWN0aW9uX2xvY2sgKGNvbm5lY3Rpb24pOworCisgIGlmIChhbGxvdykKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiQ2xpZW50IFNJRCAnJXMnIGF1dGhvcml6ZWRcbiIsIHdpbmRvd3Nfc2lkKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiQ2xpZW50IFNJRCAnJXMnIHdhcyByZWplY3RlZCwgZGlzY29ubmVjdGluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2dldF93aW5kb3dzX3NpZCAoYXV0aF9pZGVudGl0eSkpOworICAgICAgX2RidXNfdHJhbnNwb3J0X2Rpc2Nvbm5lY3QgKHRyYW5zcG9ydCk7CisgICAgfQorCisgIHJldHVybiBhbGxvdzsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithdXRoX3ZpYV9kZWZhdWx0X3J1bGVzIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIERCdXNDcmVkZW50aWFscyAqYXV0aF9pZGVudGl0eTsKKyAgREJ1c0NyZWRlbnRpYWxzICpvdXJfaWRlbnRpdHk7CisgIGRidXNfYm9vbF90IGFsbG93OworICAKKyAgYXV0aF9pZGVudGl0eSA9IF9kYnVzX2F1dGhfZ2V0X2lkZW50aXR5ICh0cmFuc3BvcnQtPmF1dGgpOworICBfZGJ1c19hc3NlcnQgKGF1dGhfaWRlbnRpdHkgIT0gTlVMTCk7CisKKyAgLyogQnkgZGVmYXVsdCwgY29ubmVjdGlvbiBpcyBhbGxvd2VkIGlmIHRoZSBjbGllbnQgaXMgMSkgcm9vdCBvciAyKQorICAgKiBoYXMgdGhlIHNhbWUgVUlEIGFzIHVzIG9yIDMpIGFub255bW91cyBpcyBhbGxvd2VkLgorICAgKi8KKyAgCisgIG91cl9pZGVudGl0eSA9IF9kYnVzX2NyZWRlbnRpYWxzX25ld19mcm9tX2N1cnJlbnRfcHJvY2VzcyAoKTsKKyAgaWYgKG91cl9pZGVudGl0eSA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIE9PTSAqLworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICAgICAgICAgICAgCisgIGlmICh0cmFuc3BvcnQtPmFsbG93X2Fub255bW91cyB8fAorICAgICAgX2RidXNfY3JlZGVudGlhbHNfZ2V0X3VuaXhfdWlkIChhdXRoX2lkZW50aXR5KSA9PSAwIHx8CisgICAgICBfZGJ1c19jcmVkZW50aWFsc19zYW1lX3VzZXIgKG91cl9pZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aF9pZGVudGl0eSkpCisgICAgeworICAgICAgaWYgKF9kYnVzX2NyZWRlbnRpYWxzX2luY2x1ZGUob3VyX2lkZW50aXR5LERCVVNfQ1JFREVOVElBTF9XSU5ET1dTX1NJRCkpCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkNsaWVudCBhdXRob3JpemVkIGFzIFNJRCAnJXMnIgorICAgICAgICAgICAgICAgICAgICAgICAgICJtYXRjaGluZyBvdXIgU0lEICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfZ2V0X3dpbmRvd3Nfc2lkKGF1dGhfaWRlbnRpdHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2dldF93aW5kb3dzX3NpZChvdXJfaWRlbnRpdHkpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiQ2xpZW50IGF1dGhvcml6ZWQgYXMgVUlEICJEQlVTX1VJRF9GT1JNQVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAiIG1hdGNoaW5nIG91ciBVSUQgIkRCVVNfVUlEX0ZPUk1BVCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfZ2V0X3VuaXhfdWlkKGF1dGhfaWRlbnRpdHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2dldF91bml4X3VpZChvdXJfaWRlbnRpdHkpKTsKKyAgICAgIC8qIFdlIGhhdmUgYXV0aGVudGljYXRlZCEgKi8KKyAgICAgIGFsbG93ID0gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoX2RidXNfY3JlZGVudGlhbHNfaW5jbHVkZShvdXJfaWRlbnRpdHksREJVU19DUkVERU5USUFMX1dJTkRPV1NfU0lEKSkKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiQ2xpZW50IGF1dGhvcml6ZWQgYXMgU0lEICclcyciCisgICAgICAgICAgICAgICAgICAgICAgICAgIiBidXQgb3VyIFNJRCBpcyAnJXMnLCBkaXNjb25uZWN0aW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIChfZGJ1c19jcmVkZW50aWFsc19nZXRfd2luZG93c19zaWQoYXV0aF9pZGVudGl0eSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc19nZXRfd2luZG93c19zaWQoYXV0aF9pZGVudGl0eSkgOiAiPG51bGw+IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgKF9kYnVzX2NyZWRlbnRpYWxzX2dldF93aW5kb3dzX3NpZChvdXJfaWRlbnRpdHkpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfZ2V0X3dpbmRvd3Nfc2lkKG91cl9pZGVudGl0eSkgOiAiPG51bGw+IikpOworICAgICAgZWxzZQorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDbGllbnQgYXV0aG9yaXplZCBhcyBVSUQgIkRCVVNfVUlEX0ZPUk1BVAorICAgICAgICAgICAgICAgICAgICAgICAgICIgYnV0IG91ciBVSUQgaXMgIkRCVVNfVUlEX0ZPUk1BVCIsIGRpc2Nvbm5lY3RpbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfZ2V0X3VuaXhfdWlkKGF1dGhfaWRlbnRpdHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2dldF91bml4X3VpZChvdXJfaWRlbnRpdHkpKTsKKyAgICAgIF9kYnVzX3RyYW5zcG9ydF9kaXNjb25uZWN0ICh0cmFuc3BvcnQpOworICAgICAgYWxsb3cgPSBGQUxTRTsKKyAgICB9ICAKKworICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAob3VyX2lkZW50aXR5KTsKKyAgCisgIHJldHVybiBhbGxvdzsKK30KKworCisvKioKKyAqIFJldHVybnMgI1RSVUUgaWYgd2UgaGF2ZSBiZWVuIGF1dGhlbnRpY2F0ZWQuICBXaWxsIHJldHVybiAjVFJVRQorICogZXZlbiBpZiB0aGUgdHJhbnNwb3J0IGlzIGRpc2Nvbm5lY3RlZC4KKyAqCisgKiBAdG9kbyB3ZSBkcm9wIGNvbm5lY3Rpb24tPm11dGV4IHdoZW4gY2FsbGluZyB0aGUgdW5peF91c2VyX2Z1bmN0aW9uLAorICogYW5kIHdpbmRvd3NfdXNlcl9mdW5jdGlvbiwgd2hpY2ggbWF5IG5vdCBiZSBzYWZlIHJlYWxseS4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEByZXR1cm5zIHdoZXRoZXIgd2UncmUgYXV0aGVudGljYXRlZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHJhbnNwb3J0X2dldF9pc19hdXRoZW50aWNhdGVkIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7ICAKKyAgaWYgKHRyYW5zcG9ydC0+YXV0aGVudGljYXRlZCkKKyAgICByZXR1cm4gVFJVRTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfYm9vbF90IG1heWJlX2F1dGhlbnRpY2F0ZWQ7CisgICAgICAKKyAgICAgIGlmICh0cmFuc3BvcnQtPmRpc2Nvbm5lY3RlZCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAvKiBwYXJhbm9pYSByZWYgc2luY2Ugd2UgY2FsbCB1c2VyIGNhbGxiYWNrcyBzb21ldGltZXMgKi8KKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVmX3VubG9ja2VkICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24pOworICAgICAgCisgICAgICBtYXliZV9hdXRoZW50aWNhdGVkID0KKyAgICAgICAgKCEodHJhbnNwb3J0LT5zZW5kX2NyZWRlbnRpYWxzX3BlbmRpbmcgfHwKKyAgICAgICAgICAgdHJhbnNwb3J0LT5yZWNlaXZlX2NyZWRlbnRpYWxzX3BlbmRpbmcpKTsKKworICAgICAgaWYgKG1heWJlX2F1dGhlbnRpY2F0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICBzd2l0Y2ggKF9kYnVzX2F1dGhfZG9fd29yayAodHJhbnNwb3J0LT5hdXRoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgREJVU19BVVRIX1NUQVRFX0FVVEhFTlRJQ0FURUQ6CisgICAgICAgICAgICAgIC8qIGxlYXZlIGFzIG1heWJlX2F1dGhlbnRpY2F0ZWQgKi8KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBtYXliZV9hdXRoZW50aWNhdGVkID0gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgLyogSWYgd2UncmUgdGhlIGNsaWVudCwgdmVyaWZ5IHRoZSBHVUlECisgICAgICAgKi8KKyAgICAgIGlmIChtYXliZV9hdXRoZW50aWNhdGVkICYmICF0cmFuc3BvcnQtPmlzX3NlcnZlcikKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGNoYXIgKnNlcnZlcl9ndWlkOworCisgICAgICAgICAgc2VydmVyX2d1aWQgPSBfZGJ1c19hdXRoX2dldF9ndWlkX2Zyb21fc2VydmVyICh0cmFuc3BvcnQtPmF1dGgpOworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoc2VydmVyX2d1aWQgIT0gTlVMTCk7CisKKyAgICAgICAgICBpZiAodHJhbnNwb3J0LT5leHBlY3RlZF9ndWlkICYmCisgICAgICAgICAgICAgIHN0cmNtcCAodHJhbnNwb3J0LT5leHBlY3RlZF9ndWlkLCBzZXJ2ZXJfZ3VpZCkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkNsaWVudCBleHBlY3RlZCBHVUlEICclcycgYW5kIHdlIGdvdCAnJXMnIGZyb20gdGhlIHNlcnZlclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LT5leHBlY3RlZF9ndWlkLCBzZXJ2ZXJfZ3VpZCk7CisgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9kaXNjb25uZWN0ICh0cmFuc3BvcnQpOworICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3VucmVmX3VubG9ja2VkICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24pOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgLyogSWYgd2UncmUgdGhlIHNlcnZlciwgc2VlIGlmIHdlIHdhbnQgdG8gYWxsb3cgdGhpcyBpZGVudGl0eSB0byBwcm9jZWVkLgorICAgICAgICovCisgICAgICBpZiAobWF5YmVfYXV0aGVudGljYXRlZCAmJiB0cmFuc3BvcnQtPmlzX3NlcnZlcikKKyAgICAgICAgeworICAgICAgICAgIGRidXNfYm9vbF90IGFsbG93OworICAgICAgICAgIERCdXNDcmVkZW50aWFscyAqYXV0aF9pZGVudGl0eTsKKyAgICAgICAgICAKKyAgICAgICAgICBhdXRoX2lkZW50aXR5ID0gX2RidXNfYXV0aF9nZXRfaWRlbnRpdHkgKHRyYW5zcG9ydC0+YXV0aCk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0IChhdXRoX2lkZW50aXR5ICE9IE5VTEwpOworICAgICAgICAgIAorICAgICAgICAgIC8qIElmIHdlIGhhdmUgYW4gYXV0aCdkIHVzZXIgYW5kIGEgdXNlciBmdW5jdGlvbiwgZGVsZWdhdGUKKyAgICAgICAgICAgKiBkZWNpZGluZyB3aGV0aGVyIGF1dGggY3JlZGVudGlhbHMgYXJlIGdvb2QgZW5vdWdoIHRvIHRoZQorICAgICAgICAgICAqIGFwcDsgb3RoZXJ3aXNlLCB1c2Ugb3VyIGRlZmF1bHQgZGVjaXNpb24gcHJvY2Vzcy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAodHJhbnNwb3J0LT51bml4X3VzZXJfZnVuY3Rpb24gIT0gTlVMTCAmJgorICAgICAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlIChhdXRoX2lkZW50aXR5LCBEQlVTX0NSRURFTlRJQUxfVU5JWF9VU0VSX0lEKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYWxsb3cgPSBhdXRoX3ZpYV91bml4X3VzZXJfZnVuY3Rpb24gKHRyYW5zcG9ydCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAodHJhbnNwb3J0LT53aW5kb3dzX3VzZXJfZnVuY3Rpb24gIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2luY2x1ZGUgKGF1dGhfaWRlbnRpdHksIERCVVNfQ1JFREVOVElBTF9XSU5ET1dTX1NJRCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGFsbG93ID0gYXV0aF92aWFfd2luZG93c191c2VyX2Z1bmN0aW9uICh0cmFuc3BvcnQpOworICAgICAgICAgICAgfSAgICAgIAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYWxsb3cgPSBhdXRoX3ZpYV9kZWZhdWx0X3J1bGVzICh0cmFuc3BvcnQpOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGlmICghYWxsb3cpCisgICAgICAgICAgICBtYXliZV9hdXRoZW50aWNhdGVkID0gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgdHJhbnNwb3J0LT5hdXRoZW50aWNhdGVkID0gbWF5YmVfYXV0aGVudGljYXRlZDsKKworICAgICAgX2RidXNfY29ubmVjdGlvbl91bnJlZl91bmxvY2tlZCAodHJhbnNwb3J0LT5jb25uZWN0aW9uKTsKKyAgICAgIHJldHVybiBtYXliZV9hdXRoZW50aWNhdGVkOworICAgIH0KK30KKworLyoqCisgKiBTZWUgZGJ1c19jb25uZWN0aW9uX2dldF9pc19hbm9ueW1vdXMoKS4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEByZXR1cm5zICNUUlVFIGlmIG5vdCBhdXRoZW50aWNhdGVkIG9yIGF1dGhlbnRpY2F0ZWQgYXMgYW5vbnltb3VzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2Fub255bW91cyAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBEQnVzQ3JlZGVudGlhbHMgKmF1dGhfaWRlbnRpdHk7CisgIAorICBpZiAoIXRyYW5zcG9ydC0+YXV0aGVudGljYXRlZCkKKyAgICByZXR1cm4gVFJVRTsKKyAgCisgIGF1dGhfaWRlbnRpdHkgPSBfZGJ1c19hdXRoX2dldF9pZGVudGl0eSAodHJhbnNwb3J0LT5hdXRoKTsKKworICBpZiAoX2RidXNfY3JlZGVudGlhbHNfYXJlX2Fub255bW91cyAoYXV0aF9pZGVudGl0eSkpCisgICAgcmV0dXJuIFRSVUU7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogUmV0dXJucyBUUlVFIGlmIHRoZSB0cmFuc3BvcnQgc3VwcG9ydHMgc2VuZGluZyB1bml4IGZkcy4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEByZXR1cm5zICNUUlVFIGlmIFRSVUUgaXQgaXMgcG9zc2libGUgdG8gc2VuZCB1bml4IGZkcyBhY3Jvc3MgdGhlIHRyYW5zcG9ydC4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3RyYW5zcG9ydF9jYW5fcGFzc191bml4X2ZkKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX0NBTl9TRU5EX1VOSVhfRkQodHJhbnNwb3J0KTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBhZGRyZXNzIG9mIGEgdHJhbnNwb3J0LiBJdCB3aWxsIGJlCisgKiAjTlVMTCBmb3IgYSBzZXJ2ZXItc2lkZSB0cmFuc3BvcnQuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcmV0dXJucyB0cmFuc3BvcnQncyBhZGRyZXNzCisgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c190cmFuc3BvcnRfZ2V0X2FkZHJlc3MgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgcmV0dXJuIHRyYW5zcG9ydC0+YWRkcmVzczsKK30KKworLyoqCisgKiBHZXRzIHRoZSBpZCBvZiB0aGUgc2VydmVyIHdlIGFyZSBjb25uZWN0ZWQgdG8gKHNlZQorICogZGJ1c19zZXJ2ZXJfZ2V0X2lkKCkpLiBPbmx5IHdvcmtzIG9uIGNsaWVudCBzaWRlLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHJldHVybnMgdHJhbnNwb3J0J3Mgc2VydmVyJ3MgaWQgb3IgI05VTEwgaWYgd2UgYXJlIHRoZSBzZXJ2ZXIgc2lkZQorICovCitjb25zdCBjaGFyKgorX2RidXNfdHJhbnNwb3J0X2dldF9zZXJ2ZXJfaWQgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgaWYgKHRyYW5zcG9ydC0+aXNfc2VydmVyKQorICAgIHJldHVybiBOVUxMOworICBlbHNlIGlmICh0cmFuc3BvcnQtPmF1dGhlbnRpY2F0ZWQpCisgICAgcmV0dXJuIF9kYnVzX2F1dGhfZ2V0X2d1aWRfZnJvbV9zZXJ2ZXIgKHRyYW5zcG9ydC0+YXV0aCk7CisgIGVsc2UKKyAgICByZXR1cm4gdHJhbnNwb3J0LT5leHBlY3RlZF9ndWlkOworfQorCisvKioKKyAqIEhhbmRsZXMgYSB3YXRjaCBieSByZWFkaW5nIGRhdGEsIHdyaXRpbmcgZGF0YSwgb3IgZGlzY29ubmVjdGluZworICogdGhlIHRyYW5zcG9ydCwgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBnaXZlbiBjb25kaXRpb24uCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0LgorICogQHBhcmFtIHdhdGNoIHRoZSB3YXRjaC4KKyAqIEBwYXJhbSBjb25kaXRpb24gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHdhdGNoZWQgZmlsZSBkZXNjcmlwdG9yLgorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGZ1bGx5IGhhbmRsZSB0aGUgd2F0Y2gKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3RyYW5zcG9ydF9oYW5kbGVfd2F0Y2ggKERCdXNUcmFuc3BvcnQgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICAgICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgY29uZGl0aW9uKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIAorICBfZGJ1c19hc3NlcnQgKHRyYW5zcG9ydC0+dnRhYmxlLT5oYW5kbGVfd2F0Y2ggIT0gTlVMTCk7CisKKyAgaWYgKHRyYW5zcG9ydC0+ZGlzY29ubmVjdGVkKQorICAgIHJldHVybiBUUlVFOworCisgIGlmIChkYnVzX3dhdGNoX2dldF9zb2NrZXQgKHdhdGNoKSA8IDApCisgICAgeworICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJUcmllZCB0byBoYW5kbGUgYW4gaW52YWxpZGF0ZWQgd2F0Y2g7IHRoaXMgd2F0Y2ggc2hvdWxkIGhhdmUgYmVlbiByZW1vdmVkXG4iKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgCisgIF9kYnVzX3dhdGNoX3Nhbml0aXplX2NvbmRpdGlvbiAod2F0Y2gsICZjb25kaXRpb24pOworCisgIF9kYnVzX3RyYW5zcG9ydF9yZWYgKHRyYW5zcG9ydCk7CisgIF9kYnVzX3dhdGNoX3JlZiAod2F0Y2gpOworICByZXR2YWwgPSAoKiB0cmFuc3BvcnQtPnZ0YWJsZS0+aGFuZGxlX3dhdGNoKSAodHJhbnNwb3J0LCB3YXRjaCwgY29uZGl0aW9uKTsKKyAgX2RidXNfd2F0Y2hfdW5yZWYgKHdhdGNoKTsKKyAgX2RidXNfdHJhbnNwb3J0X3VucmVmICh0cmFuc3BvcnQpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogU2V0cyB0aGUgY29ubmVjdGlvbiB1c2luZyB0aGlzIHRyYW5zcG9ydC4gQWxsb3dzIHRoZSB0cmFuc3BvcnQKKyAqIHRvIGFkZCB3YXRjaGVzIHRvIHRoZSBjb25uZWN0aW9uLCBxdWV1ZSBpbmNvbWluZyBtZXNzYWdlcywKKyAqIGFuZCBwdWxsIG91dGdvaW5nIG1lc3NhZ2VzLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydC4KKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190cmFuc3BvcnRfc2V0X2Nvbm5lY3Rpb24gKERCdXNUcmFuc3BvcnQgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBfZGJ1c19hc3NlcnQgKHRyYW5zcG9ydC0+dnRhYmxlLT5jb25uZWN0aW9uX3NldCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0ICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24gPT0gTlVMTCk7CisgIAorICB0cmFuc3BvcnQtPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCisgIF9kYnVzX3RyYW5zcG9ydF9yZWYgKHRyYW5zcG9ydCk7CisgIGlmICghKCogdHJhbnNwb3J0LT52dGFibGUtPmNvbm5lY3Rpb25fc2V0KSAodHJhbnNwb3J0KSkKKyAgICB0cmFuc3BvcnQtPmNvbm5lY3Rpb24gPSBOVUxMOworICBfZGJ1c190cmFuc3BvcnRfdW5yZWYgKHRyYW5zcG9ydCk7CisKKyAgcmV0dXJuIHRyYW5zcG9ydC0+Y29ubmVjdGlvbiAhPSBOVUxMOworfQorCisvKioKKyAqIEdldCB0aGUgc29ja2V0IGZpbGUgZGVzY3JpcHRvciwgaWYgYW55LgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHBhcmFtIGZkX3AgcG9pbnRlciB0byBmaWxsIGluIHdpdGggdGhlIGRlc2NyaXB0b3IKKyAqIEByZXR1cm5zICNUUlVFIGlmIGEgZGVzY3JpcHRvciB3YXMgYXZhaWxhYmxlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190cmFuc3BvcnRfZ2V0X3NvY2tldF9mZCAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgKmZkX3ApCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgCisgIGlmICh0cmFuc3BvcnQtPnZ0YWJsZS0+Z2V0X3NvY2tldF9mZCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAodHJhbnNwb3J0LT5kaXNjb25uZWN0ZWQpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX3RyYW5zcG9ydF9yZWYgKHRyYW5zcG9ydCk7CisKKyAgcmV0dmFsID0gKCogdHJhbnNwb3J0LT52dGFibGUtPmdldF9zb2NrZXRfZmQpICh0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRfcCk7CisgIAorICBfZGJ1c190cmFuc3BvcnRfdW5yZWYgKHRyYW5zcG9ydCk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBQZXJmb3JtcyBhIHNpbmdsZSBwb2xsKCkvc2VsZWN0KCkgb24gdGhlIHRyYW5zcG9ydCdzIGZpbGUKKyAqIGRlc2NyaXB0b3JzIGFuZCB0aGVuIHJlYWRzL3dyaXRlcyBkYXRhIGFzIGFwcHJvcHJpYXRlLAorICogcXVldWVpbmcgaW5jb21pbmcgbWVzc2FnZXMgYW5kIHNlbmRpbmcgb3V0Z29pbmcgbWVzc2FnZXMuCisgKiBUaGlzIGlzIHRoZSBiYWNrZW5kIGZvciBfZGJ1c19jb25uZWN0aW9uX2RvX2l0ZXJhdGlvbigpLgorICogU2VlIF9kYnVzX2Nvbm5lY3Rpb25fZG9faXRlcmF0aW9uKCkgZm9yIGZ1bGwgZGV0YWlscy4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQuCisgKiBAcGFyYW0gZmxhZ3MgaW5kaWNhdGVzIHdoZXRoZXIgdG8gcmVhZCBvciB3cml0ZSwgYW5kIHdoZXRoZXIgdG8gYmxvY2suCisgKiBAcGFyYW0gdGltZW91dF9taWxsaXNlY29uZHMgaWYgYmxvY2tpbmcsIHRpbWVvdXQgb3IgLTEgZm9yIG5vIHRpbWVvdXQuCisgKi8KK3ZvaWQKK19kYnVzX3RyYW5zcG9ydF9kb19pdGVyYXRpb24gKERCdXNUcmFuc3BvcnQgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpCit7CisgIF9kYnVzX2Fzc2VydCAodHJhbnNwb3J0LT52dGFibGUtPmRvX2l0ZXJhdGlvbiAhPSBOVUxMKTsKKworICBfZGJ1c192ZXJib3NlICgiVHJhbnNwb3J0IGl0ZXJhdGlvbiBmbGFncyAweCV4IHRpbWVvdXQgJWQgY29ubmVjdGVkID0gJWRcbiIsCisgICAgICAgICAgICAgICAgIGZsYWdzLCB0aW1lb3V0X21pbGxpc2Vjb25kcywgIXRyYW5zcG9ydC0+ZGlzY29ubmVjdGVkKTsKKyAgCisgIGlmICgoZmxhZ3MgJiAoREJVU19JVEVSQVRJT05fRE9fV1JJVElORyB8CisgICAgICAgICAgICAgICAgREJVU19JVEVSQVRJT05fRE9fUkVBRElORykpID09IDApCisgICAgcmV0dXJuOyAvKiBOb3RoaW5nIHRvIGRvICovCisKKyAgaWYgKHRyYW5zcG9ydC0+ZGlzY29ubmVjdGVkKQorICAgIHJldHVybjsKKworICBfZGJ1c190cmFuc3BvcnRfcmVmICh0cmFuc3BvcnQpOworICAoKiB0cmFuc3BvcnQtPnZ0YWJsZS0+ZG9faXRlcmF0aW9uKSAodHJhbnNwb3J0LCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKKyAgX2RidXNfdHJhbnNwb3J0X3VucmVmICh0cmFuc3BvcnQpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJlbmRcbiIpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3JlY292ZXJfdW51c2VkX2J5dGVzIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIGlmIChfZGJ1c19hdXRoX25lZWRzX2RlY29kaW5nICh0cmFuc3BvcnQtPmF1dGgpKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgcGxhaW50ZXh0OworICAgICAgY29uc3QgREJ1c1N0cmluZyAqZW5jb2RlZDsKKyAgICAgIERCdXNTdHJpbmcgKmJ1ZmZlcjsKKyAgICAgIGludCBvcmlnX2xlbjsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnBsYWludGV4dCkpCisgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAKKyAgICAgIF9kYnVzX2F1dGhfZ2V0X3VudXNlZF9ieXRlcyAodHJhbnNwb3J0LT5hdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RlZCk7CisKKyAgICAgIGlmICghX2RidXNfYXV0aF9kZWNvZGVfZGF0YSAodHJhbnNwb3J0LT5hdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkLCAmcGxhaW50ZXh0KSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGxhaW50ZXh0KTsKKyAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICB9CisgICAgICAKKyAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9idWZmZXIgKHRyYW5zcG9ydC0+bG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcik7CisgICAgICAKKyAgICAgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGJ1ZmZlcik7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX21vdmUgKCZwbGFpbnRleHQsIDAsIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdfbGVuKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGxhaW50ZXh0KTsKKyAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICB9CisgICAgICAKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgJWQgdW51c2VkIGJ5dGVzIHNlbnQgdG8gbWVzc2FnZSBsb2FkZXJcbiIsIAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGJ1ZmZlcikgLQorICAgICAgICAgICAgICAgICAgICAgb3JpZ19sZW4pOworICAgICAgCisgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyICh0cmFuc3BvcnQtPmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChidWZmZXIpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdfbGVuKTsKKworICAgICAgX2RidXNfYXV0aF9kZWxldGVfdW51c2VkX2J5dGVzICh0cmFuc3BvcnQtPmF1dGgpOworICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBsYWludGV4dCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnl0ZXM7CisgICAgICBEQnVzU3RyaW5nICpidWZmZXI7CisgICAgICBpbnQgb3JpZ19sZW47CisgICAgICBkYnVzX2Jvb2xfdCBzdWNjZWVkZWQ7CisKKyAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9idWZmZXIgKHRyYW5zcG9ydC0+bG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgCisgICAgICBvcmlnX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChidWZmZXIpOworICAgICAgICAgICAgICAgIAorICAgICAgX2RidXNfYXV0aF9nZXRfdW51c2VkX2J5dGVzICh0cmFuc3BvcnQtPmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlcyk7CisKKyAgICAgIHN1Y2NlZWRlZCA9IFRSVUU7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5IChieXRlcywgMCwgYnVmZmVyLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYnVmZmVyKSkpCisgICAgICAgIHN1Y2NlZWRlZCA9IEZBTFNFOworICAgICAgCisgICAgICBfZGJ1c192ZXJib3NlICgiICVkIHVudXNlZCBieXRlcyBzZW50IHRvIG1lc3NhZ2UgbG9hZGVyXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChidWZmZXIpIC0KKyAgICAgICAgICAgICAgICAgICAgIG9yaWdfbGVuKTsKKyAgICAgIAorICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX2J1ZmZlciAodHJhbnNwb3J0LT5sb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYnVmZmVyKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnX2xlbik7CisKKyAgICAgIGlmIChzdWNjZWVkZWQpCisgICAgICAgIF9kYnVzX2F1dGhfZGVsZXRlX3VudXNlZF9ieXRlcyAodHJhbnNwb3J0LT5hdXRoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZ290byBub21lbTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7CisKKyBub21lbToKKyAgX2RidXNfdmVyYm9zZSAoIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHRyYW5zZmVyIHVudXNlZCBieXRlcyBmcm9tIGF1dGggY29udmVyc2F0aW9uXG4iKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIFJlcG9ydHMgb3VyIGN1cnJlbnQgZGlzcGF0Y2ggc3RhdHVzICh3aGV0aGVyIHRoZXJlJ3MgYnVmZmVyZWQKKyAqIGRhdGEgdG8gYmUgcXVldWVkIGFzIG1lc3NhZ2VzLCBvciBub3QsIG9yIHdlIG5lZWQgbWVtb3J5KS4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEByZXR1cm5zIGN1cnJlbnQgc3RhdHVzCisgKi8KK0RCdXNEaXNwYXRjaFN0YXR1cworX2RidXNfdHJhbnNwb3J0X2dldF9kaXNwYXRjaF9zdGF0dXMgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgaWYgKF9kYnVzX2NvdW50ZXJfZ2V0X3NpemVfdmFsdWUgKHRyYW5zcG9ydC0+bGl2ZV9tZXNzYWdlcykgPj0gdHJhbnNwb3J0LT5tYXhfbGl2ZV9tZXNzYWdlc19zaXplIHx8CisgICAgICBfZGJ1c19jb3VudGVyX2dldF91bml4X2ZkX3ZhbHVlICh0cmFuc3BvcnQtPmxpdmVfbWVzc2FnZXMpID49IHRyYW5zcG9ydC0+bWF4X2xpdmVfbWVzc2FnZXNfdW5peF9mZHMpCisgICAgcmV0dXJuIERCVVNfRElTUEFUQ0hfQ09NUExFVEU7IC8qIGNvbXBsZXRlIGZvciBub3cgKi8KKworICBpZiAoIV9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfYXV0aGVudGljYXRlZCAodHJhbnNwb3J0KSkKKyAgICB7CisgICAgICBpZiAoX2RidXNfYXV0aF9kb193b3JrICh0cmFuc3BvcnQtPmF1dGgpID09CisgICAgICAgICAgREJVU19BVVRIX1NUQVRFX1dBSVRJTkdfRk9SX01FTU9SWSkKKyAgICAgICAgcmV0dXJuIERCVVNfRElTUEFUQ0hfTkVFRF9NRU1PUlk7CisgICAgICBlbHNlIGlmICghX2RidXNfdHJhbnNwb3J0X2dldF9pc19hdXRoZW50aWNhdGVkICh0cmFuc3BvcnQpKQorICAgICAgICByZXR1cm4gREJVU19ESVNQQVRDSF9DT01QTEVURTsKKyAgICB9CisKKyAgaWYgKCF0cmFuc3BvcnQtPnVudXNlZF9ieXRlc19yZWNvdmVyZWQgJiYKKyAgICAgICFyZWNvdmVyX3VudXNlZF9ieXRlcyAodHJhbnNwb3J0KSkKKyAgICByZXR1cm4gREJVU19ESVNQQVRDSF9ORUVEX01FTU9SWTsKKworICB0cmFuc3BvcnQtPnVudXNlZF9ieXRlc19yZWNvdmVyZWQgPSBUUlVFOworICAKKyAgaWYgKCFfZGJ1c19tZXNzYWdlX2xvYWRlcl9xdWV1ZV9tZXNzYWdlcyAodHJhbnNwb3J0LT5sb2FkZXIpKQorICAgIHJldHVybiBEQlVTX0RJU1BBVENIX05FRURfTUVNT1JZOworCisgIGlmIChfZGJ1c19tZXNzYWdlX2xvYWRlcl9wZWVrX21lc3NhZ2UgKHRyYW5zcG9ydC0+bG9hZGVyKSAhPSBOVUxMKQorICAgIHJldHVybiBEQlVTX0RJU1BBVENIX0RBVEFfUkVNQUlOUzsKKyAgZWxzZQorICAgIHJldHVybiBEQlVTX0RJU1BBVENIX0NPTVBMRVRFOworfQorCisvKioKKyAqIFByb2Nlc3NlcyBkYXRhIHdlJ3ZlIHJlYWQgd2hpbGUgaGFuZGxpbmcgYSB3YXRjaCwgcG90ZW50aWFsbHkKKyAqIGNvbnZlcnRpbmcgc29tZSBvZiBpdCB0byBtZXNzYWdlcyBhbmQgcXVldWVpbmcgdGhvc2UgbWVzc2FnZXMgb24KKyAqIHRoZSBjb25uZWN0aW9uLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHJldHVybnMgI1RSVUUgaWYgd2UgaGFkIGVub3VnaCBtZW1vcnkgdG8gcXVldWUgYWxsIG1lc3NhZ2VzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190cmFuc3BvcnRfcXVldWVfbWVzc2FnZXMgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgREJ1c0Rpc3BhdGNoU3RhdHVzIHN0YXR1czsKKworI2lmIDAKKyAgX2RidXNfdmVyYm9zZSAoIl9kYnVzX3RyYW5zcG9ydF9xdWV1ZV9tZXNzYWdlcygpXG4iKTsKKyNlbmRpZgorICAKKyAgLyogUXVldWUgYW55IG1lc3NhZ2VzICovCisgIHdoaWxlICgoc3RhdHVzID0gX2RidXNfdHJhbnNwb3J0X2dldF9kaXNwYXRjaF9zdGF0dXMgKHRyYW5zcG9ydCkpID09IERCVVNfRElTUEFUQ0hfREFUQV9SRU1BSU5TKQorICAgIHsKKyAgICAgIERCdXNNZXNzYWdlICptZXNzYWdlOworICAgICAgREJ1c0xpc3QgKmxpbms7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19tZXNzYWdlX2xvYWRlcl9wb3BfbWVzc2FnZV9saW5rICh0cmFuc3BvcnQtPmxvYWRlcik7CisgICAgICBfZGJ1c19hc3NlcnQgKGxpbmsgIT0gTlVMTCk7CisgICAgICAKKyAgICAgIG1lc3NhZ2UgPSBsaW5rLT5kYXRhOworICAgICAgCisgICAgICBfZGJ1c192ZXJib3NlICgicXVldWVpbmcgcmVjZWl2ZWQgbWVzc2FnZSAlcFxuIiwgbWVzc2FnZSk7CisKKyAgICAgIGlmICghX2RidXNfbWVzc2FnZV9hZGRfY291bnRlciAobWVzc2FnZSwgdHJhbnNwb3J0LT5saXZlX21lc3NhZ2VzKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3B1dGJhY2tfbWVzc2FnZV9saW5rICh0cmFuc3BvcnQtPmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluayk7CisgICAgICAgICAgc3RhdHVzID0gREJVU19ESVNQQVRDSF9ORUVEX01FTU9SWTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogV2UgZGlkbid0IGNhbGwgdGhlIG5vdGlmeSBmdW5jdGlvbiB3aGVuIHdlIGFkZGVkIHRoZSBjb3VudGVyLCBzbworICAgICAgICAgICAqIGNhdGNoIHVwIG5vdy4gU2luY2Ugd2UgaGF2ZSB0aGUgY29ubmVjdGlvbidzIGxvY2ssIGl0J3MgZGVzaXJhYmxlCisgICAgICAgICAgICogdGhhdCB3ZSBieXBhc3MgdGhlIG5vdGlmeSBmdW5jdGlvbiBhbmQgY2FsbCB0aGlzIHZpcnR1YWwgbWV0aG9kCisgICAgICAgICAgICogZGlyZWN0bHkuICovCisgICAgICAgICAgaWYgKHRyYW5zcG9ydC0+dnRhYmxlLT5saXZlX21lc3NhZ2VzX2NoYW5nZWQpCisgICAgICAgICAgICAoKiB0cmFuc3BvcnQtPnZ0YWJsZS0+bGl2ZV9tZXNzYWdlc19jaGFuZ2VkKSAodHJhbnNwb3J0KTsKKworICAgICAgICAgIC8qIHBhc3Mgb3duZXJzaGlwIG9mIGxpbmsgYW5kIG1lc3NhZ2UgcmVmIHRvIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3F1ZXVlX3JlY2VpdmVkX21lc3NhZ2VfbGluayAodHJhbnNwb3J0LT5jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rKTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X2lzX2NvcnJ1cHRlZCAodHJhbnNwb3J0LT5sb2FkZXIpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDb3JydXB0ZWQgbWVzc2FnZSBzdHJlYW0sIGRpc2Nvbm5lY3RpbmdcbiIpOworICAgICAgX2RidXNfdHJhbnNwb3J0X2Rpc2Nvbm5lY3QgKHRyYW5zcG9ydCk7CisgICAgfQorCisgIHJldHVybiBzdGF0dXMgIT0gREJVU19ESVNQQVRDSF9ORUVEX01FTU9SWTsKK30KKworLyoqCisgKiBTZWUgZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfbWVzc2FnZV9zaXplKCkuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcGFyYW0gc2l6ZSB0aGUgbWF4IHNpemUgb2YgYSBzaW5nbGUgbWVzc2FnZQorICovCit2b2lkCitfZGJ1c190cmFuc3BvcnRfc2V0X21heF9tZXNzYWdlX3NpemUgKERCdXNUcmFuc3BvcnQgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICBzaXplKQoreworICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9zZXRfbWF4X21lc3NhZ2Vfc2l6ZSAodHJhbnNwb3J0LT5sb2FkZXIsIHNpemUpOworfQorCisvKioKKyAqIFNlZSBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9tZXNzYWdlX3VuaXhfZmRzKCkuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcGFyYW0gbiB0aGUgbWF4IG51bWJlciBvZiB1bml4IGZkcyBvZiBhIHNpbmdsZSBtZXNzYWdlCisgKi8KK3ZvaWQKK19kYnVzX3RyYW5zcG9ydF9zZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMgKERCdXNUcmFuc3BvcnQgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgbikKK3sKKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfc2V0X21heF9tZXNzYWdlX3VuaXhfZmRzICh0cmFuc3BvcnQtPmxvYWRlciwgbik7Cit9CisKKy8qKgorICogU2VlIGRidXNfY29ubmVjdGlvbl9nZXRfbWF4X21lc3NhZ2Vfc2l6ZSgpLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHJldHVybnMgbWF4IG1lc3NhZ2Ugc2l6ZQorICovCitsb25nCitfZGJ1c190cmFuc3BvcnRfZ2V0X21heF9tZXNzYWdlX3NpemUgKERCdXNUcmFuc3BvcnQgICp0cmFuc3BvcnQpCit7CisgIHJldHVybiBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfbWF4X21lc3NhZ2Vfc2l6ZSAodHJhbnNwb3J0LT5sb2FkZXIpOworfQorCisvKioKKyAqIFNlZSBkYnVzX2Nvbm5lY3Rpb25fZ2V0X21heF9tZXNzYWdlX3VuaXhfZmRzKCkuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcmV0dXJucyBtYXggbWVzc2FnZSB1bml4IGZkcworICovCitsb25nCitfZGJ1c190cmFuc3BvcnRfZ2V0X21heF9tZXNzYWdlX3VuaXhfZmRzIChEQnVzVHJhbnNwb3J0ICAqdHJhbnNwb3J0KQoreworICByZXR1cm4gX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X21heF9tZXNzYWdlX3VuaXhfZmRzICh0cmFuc3BvcnQtPmxvYWRlcik7Cit9CisKKy8qKgorICogU2VlIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X3JlY2VpdmVkX3NpemUoKS4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEBwYXJhbSBzaXplIHRoZSBtYXggc2l6ZSBvZiBhbGwgaW5jb21pbmcgbWVzc2FnZXMKKyAqLwordm9pZAorX2RidXNfdHJhbnNwb3J0X3NldF9tYXhfcmVjZWl2ZWRfc2l6ZSAoREJ1c1RyYW5zcG9ydCAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICBzaXplKQoreworICB0cmFuc3BvcnQtPm1heF9saXZlX21lc3NhZ2VzX3NpemUgPSBzaXplOworICBfZGJ1c19jb3VudGVyX3NldF9ub3RpZnkgKHRyYW5zcG9ydC0+bGl2ZV9tZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQtPm1heF9saXZlX21lc3NhZ2VzX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LT5tYXhfbGl2ZV9tZXNzYWdlc191bml4X2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlX21lc3NhZ2VzX25vdGlmeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQpOworfQorCisvKioKKyAqIFNlZSBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9yZWNlaXZlZF91bml4X2ZkcygpLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHBhcmFtIG4gdGhlIG1heCB1bml4IGZkcyBvZiBhbGwgaW5jb21pbmcgbWVzc2FnZXMKKyAqLwordm9pZAorX2RidXNfdHJhbnNwb3J0X3NldF9tYXhfcmVjZWl2ZWRfdW5peF9mZHMgKERCdXNUcmFuc3BvcnQgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgIG4pCit7CisgIHRyYW5zcG9ydC0+bWF4X2xpdmVfbWVzc2FnZXNfdW5peF9mZHMgPSBuOworICBfZGJ1c19jb3VudGVyX3NldF9ub3RpZnkgKHRyYW5zcG9ydC0+bGl2ZV9tZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQtPm1heF9saXZlX21lc3NhZ2VzX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LT5tYXhfbGl2ZV9tZXNzYWdlc191bml4X2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlX21lc3NhZ2VzX25vdGlmeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQpOworfQorCisvKioKKyAqIFNlZSBkYnVzX2Nvbm5lY3Rpb25fZ2V0X21heF9yZWNlaXZlZF9zaXplKCkuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcmV0dXJucyBtYXggYnl0ZXMgZm9yIGFsbCBsaXZlIG1lc3NhZ2VzCisgKi8KK2xvbmcKK19kYnVzX3RyYW5zcG9ydF9nZXRfbWF4X3JlY2VpdmVkX3NpemUgKERCdXNUcmFuc3BvcnQgICp0cmFuc3BvcnQpCit7CisgIHJldHVybiB0cmFuc3BvcnQtPm1heF9saXZlX21lc3NhZ2VzX3NpemU7Cit9CisKKy8qKgorICogU2VlIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X3JlY2VpdmVkX3VuaXhfZmRzKCkuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcmV0dXJucyBtYXggdW5peCBmZHMgZm9yIGFsbCBsaXZlIG1lc3NhZ2VzCisgKi8KK2xvbmcKK19kYnVzX3RyYW5zcG9ydF9nZXRfbWF4X3JlY2VpdmVkX3VuaXhfZmRzIChEQnVzVHJhbnNwb3J0ICAqdHJhbnNwb3J0KQoreworICByZXR1cm4gdHJhbnNwb3J0LT5tYXhfbGl2ZV9tZXNzYWdlc191bml4X2ZkczsKK30KKworLyoqCisgKiBTZWUgZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3VzZXIoKS4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEBwYXJhbSB1aWQgcmV0dXJuIGxvY2F0aW9uIGZvciB0aGUgdXNlciBJRAorICogQHJldHVybnMgI1RSVUUgaWYgdWlkIGlzIGZpbGxlZCBpbiB3aXRoIGEgdmFsaWQgdXNlciBJRAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHJhbnNwb3J0X2dldF91bml4X3VzZXIgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICp1aWQpCit7CisgIERCdXNDcmVkZW50aWFscyAqYXV0aF9pZGVudGl0eTsKKworICAqdWlkID0gX0RCVVNfSU5UMzJfTUFYOyAvKiBiZXR0ZXIgdGhhbiBzb21lIHJvb3Qgb3Igc3lzdGVtIHVzZXIgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICogY2FzZSBvZiBidWdzIGluIHRoZSBjYWxsZXIuIENhbGxlciBzaG91bGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICogbmV2ZXIgdXNlIHRoaXMgdmFsdWUgb24gcHVycG9zZSwgaG93ZXZlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIAorICBpZiAoIXRyYW5zcG9ydC0+YXV0aGVudGljYXRlZCkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBhdXRoX2lkZW50aXR5ID0gX2RidXNfYXV0aF9nZXRfaWRlbnRpdHkgKHRyYW5zcG9ydC0+YXV0aCk7CisKKyAgaWYgKF9kYnVzX2NyZWRlbnRpYWxzX2luY2x1ZGUgKGF1dGhfaWRlbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NSRURFTlRJQUxfVU5JWF9VU0VSX0lEKSkKKyAgICB7CisgICAgICAqdWlkID0gX2RidXNfY3JlZGVudGlhbHNfZ2V0X3VuaXhfdWlkIChhdXRoX2lkZW50aXR5KTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBTZWUgZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3Byb2Nlc3NfaWQoKS4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEBwYXJhbSBwaWQgcmV0dXJuIGxvY2F0aW9uIGZvciB0aGUgcHJvY2VzcyBJRAorICogQHJldHVybnMgI1RSVUUgaWYgdWlkIGlzIGZpbGxlZCBpbiB3aXRoIGEgdmFsaWQgcHJvY2VzcyBJRAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHJhbnNwb3J0X2dldF91bml4X3Byb2Nlc3NfaWQgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgKnBpZCkKK3sKKyAgREJ1c0NyZWRlbnRpYWxzICphdXRoX2lkZW50aXR5OworCisgICpwaWQgPSBEQlVTX1BJRF9VTlNFVDsgLyogQ2FsbGVyIHNob3VsZCBuZXZlciB1c2UgdGhpcyB2YWx1ZSBvbiBwdXJwb3NlLAorCQkJICAqIGJ1dCB3ZSBzZXQgaXQgdG8gYSBzYWZlIG51bWJlciwgSU5UX01BWCwKKwkJCSAgKiBqdXN0IHRvIHJvb3Qgb3V0IHBvc3NpYmxlIGJ1Z3MgaW4gYmFkIGNhbGxlcnMuCisJCQkgICovCisgIAorICBpZiAoIXRyYW5zcG9ydC0+YXV0aGVudGljYXRlZCkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBhdXRoX2lkZW50aXR5ID0gX2RidXNfYXV0aF9nZXRfaWRlbnRpdHkgKHRyYW5zcG9ydC0+YXV0aCk7CisKKyAgaWYgKF9kYnVzX2NyZWRlbnRpYWxzX2luY2x1ZGUgKGF1dGhfaWRlbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NSRURFTlRJQUxfVU5JWF9QUk9DRVNTX0lEKSkKKyAgICB7CisgICAgICAqcGlkID0gX2RidXNfY3JlZGVudGlhbHNfZ2V0X3VuaXhfcGlkIChhdXRoX2lkZW50aXR5KTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBTZWUgZGJ1c19jb25uZWN0aW9uX2dldF9hZHRfYXVkaXRfc2Vzc2lvbl9kYXRhKCkuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcGFyYW0gZGF0YSByZXR1cm4gbG9jYXRpb24gZm9yIHRoZSBBRFQgYXVkaXQgZGF0YSAKKyAqIEBwYXJhbSBkYXRhX3NpemUgcmV0dXJuIGxlbmd0aCBvZiBhdWRpdCBkYXRhCisgKiBAcmV0dXJucyAjVFJVRSBpZiBhdWRpdCBkYXRhIGlzIGZpbGxlZCBpbiB3aXRoIGEgdmFsaWQgdWNyZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3RyYW5zcG9ydF9nZXRfYWR0X2F1ZGl0X3Nlc3Npb25fZGF0YSAoREJ1c1RyYW5zcG9ydCAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICoqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICpkYXRhX3NpemUpCit7CisgIERCdXNDcmVkZW50aWFscyAqYXV0aF9pZGVudGl0eTsKKworICAqZGF0YSA9IE5VTEw7CisgICpkYXRhX3NpemUgPSAwOworICAKKyAgaWYgKCF0cmFuc3BvcnQtPmF1dGhlbnRpY2F0ZWQpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgYXV0aF9pZGVudGl0eSA9IF9kYnVzX2F1dGhfZ2V0X2lkZW50aXR5ICh0cmFuc3BvcnQtPmF1dGgpOworCisgIGlmIChfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlIChhdXRoX2lkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19DUkVERU5USUFMX0FEVF9BVURJVF9EQVRBX0lEKSkKKyAgICB7CisgICAgICAqZGF0YSA9ICh2b2lkICopIF9kYnVzX2NyZWRlbnRpYWxzX2dldF9hZHRfYXVkaXRfZGF0YSAoYXV0aF9pZGVudGl0eSk7CisgICAgICAqZGF0YV9zaXplID0gX2RidXNfY3JlZGVudGlhbHNfZ2V0X2FkdF9hdWRpdF9kYXRhX3NpemUgKGF1dGhfaWRlbnRpdHkpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIFNlZSBkYnVzX2Nvbm5lY3Rpb25fc2V0X3VuaXhfdXNlcl9mdW5jdGlvbigpLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHBhcmFtIGZ1bmN0aW9uIHRoZSBwcmVkaWNhdGUKKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gcGFzcyB0byB0aGUgcHJlZGljYXRlCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGZyZWUgdGhlIGRhdGEKKyAqIEBwYXJhbSBvbGRfZGF0YSB0aGUgb2xkIHVzZXIgZGF0YSB0byBiZSBmcmVlZAorICogQHBhcmFtIG9sZF9mcmVlX2RhdGFfZnVuY3Rpb24gb2xkIGZyZWUgZGF0YSBmdW5jdGlvbiB0byBmcmVlIGl0IHdpdGgKKyAqLwordm9pZAorX2RidXNfdHJhbnNwb3J0X3NldF91bml4X3VzZXJfZnVuY3Rpb24gKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQWxsb3dVbml4VXNlckZ1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgKipvbGRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICpvbGRfZnJlZV9kYXRhX2Z1bmN0aW9uKQoreyAgCisgICpvbGRfZGF0YSA9IHRyYW5zcG9ydC0+dW5peF91c2VyX2RhdGE7CisgICpvbGRfZnJlZV9kYXRhX2Z1bmN0aW9uID0gdHJhbnNwb3J0LT5mcmVlX3VuaXhfdXNlcl9kYXRhOworCisgIHRyYW5zcG9ydC0+dW5peF91c2VyX2Z1bmN0aW9uID0gZnVuY3Rpb247CisgIHRyYW5zcG9ydC0+dW5peF91c2VyX2RhdGEgPSBkYXRhOworICB0cmFuc3BvcnQtPmZyZWVfdW5peF91c2VyX2RhdGEgPSBmcmVlX2RhdGFfZnVuY3Rpb247Cit9CisKKy8qKgorICogU2VlIGRidXNfY29ubmVjdGlvbl9nZXRfd2luZG93c191c2VyKCkuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcGFyYW0gd2luZG93c19zaWRfcCByZXR1cm4gbG9jYXRpb24gZm9yIHRoZSB1c2VyIElECisgKiBAcmV0dXJucyAjVFJVRSBpZiB1c2VyIGlzIGF2YWlsYWJsZTsgdGhlIHJldHVybmVkIHZhbHVlIG1heSBzdGlsbCBiZSAjTlVMTCBpZiBubyBtZW1vcnkgdG8gY29weSBpdAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHJhbnNwb3J0X2dldF93aW5kb3dzX3VzZXIgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAqKndpbmRvd3Nfc2lkX3ApCit7CisgIERCdXNDcmVkZW50aWFscyAqYXV0aF9pZGVudGl0eTsKKworICAqd2luZG93c19zaWRfcCA9IE5VTEw7CisgIAorICBpZiAoIXRyYW5zcG9ydC0+YXV0aGVudGljYXRlZCkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBhdXRoX2lkZW50aXR5ID0gX2RidXNfYXV0aF9nZXRfaWRlbnRpdHkgKHRyYW5zcG9ydC0+YXV0aCk7CisKKyAgaWYgKF9kYnVzX2NyZWRlbnRpYWxzX2luY2x1ZGUgKGF1dGhfaWRlbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NSRURFTlRJQUxfV0lORE9XU19TSUQpKQorICAgIHsKKyAgICAgIC8qIElmIG5vIG1lbW9yeSwgd2UgYXJlIHN1cHBvc2VkIHRvIHJldHVybiBUUlVFIGFuZCBzZXQgTlVMTCAqLworICAgICAgKndpbmRvd3Nfc2lkX3AgPSBfZGJ1c19zdHJkdXAgKF9kYnVzX2NyZWRlbnRpYWxzX2dldF93aW5kb3dzX3NpZCAoYXV0aF9pZGVudGl0eSkpOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogU2VlIGRidXNfY29ubmVjdGlvbl9zZXRfd2luZG93c191c2VyX2Z1bmN0aW9uKCkuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcGFyYW0gZnVuY3Rpb24gdGhlIHByZWRpY2F0ZQorICogQHBhcmFtIGRhdGEgZGF0YSB0byBwYXNzIHRvIHRoZSBwcmVkaWNhdGUKKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuY3Rpb24gZnVuY3Rpb24gdG8gZnJlZSB0aGUgZGF0YQorICogQHBhcmFtIG9sZF9kYXRhIHRoZSBvbGQgdXNlciBkYXRhIHRvIGJlIGZyZWVkCisgKiBAcGFyYW0gb2xkX2ZyZWVfZGF0YV9mdW5jdGlvbiBvbGQgZnJlZSBkYXRhIGZ1bmN0aW9uIHRvIGZyZWUgaXQgd2l0aAorICovCisKK3ZvaWQKK19kYnVzX3RyYW5zcG9ydF9zZXRfd2luZG93c191c2VyX2Z1bmN0aW9uIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBbGxvd1dpbmRvd3NVc2VyRnVuY3Rpb24gICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKipvbGRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICAqb2xkX2ZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgKm9sZF9kYXRhID0gdHJhbnNwb3J0LT53aW5kb3dzX3VzZXJfZGF0YTsKKyAgKm9sZF9mcmVlX2RhdGFfZnVuY3Rpb24gPSB0cmFuc3BvcnQtPmZyZWVfd2luZG93c191c2VyX2RhdGE7CisKKyAgdHJhbnNwb3J0LT53aW5kb3dzX3VzZXJfZnVuY3Rpb24gPSBmdW5jdGlvbjsKKyAgdHJhbnNwb3J0LT53aW5kb3dzX3VzZXJfZGF0YSA9IGRhdGE7CisgIHRyYW5zcG9ydC0+ZnJlZV93aW5kb3dzX3VzZXJfZGF0YSA9IGZyZWVfZGF0YV9mdW5jdGlvbjsKK30KKworLyoqCisgKiBTZXRzIHRoZSBTQVNMIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgc3VwcG9ydGVkIGJ5IHRoaXMgdHJhbnNwb3J0LgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHBhcmFtIG1lY2hhbmlzbXMgdGhlICNOVUxMLXRlcm1pbmF0ZWQgYXJyYXkgb2YgbWVjaGFuaXNtcworICoKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3RyYW5zcG9ydF9zZXRfYXV0aF9tZWNoYW5pc21zIChEQnVzVHJhbnNwb3J0ICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKiptZWNoYW5pc21zKQoreworICByZXR1cm4gX2RidXNfYXV0aF9zZXRfbWVjaGFuaXNtcyAodHJhbnNwb3J0LT5hdXRoLCBtZWNoYW5pc21zKTsKK30KKworLyoqCisgKiBTZWUgZGJ1c19jb25uZWN0aW9uX3NldF9hbGxvd19hbm9ueW1vdXMoKQorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHBhcmFtIHZhbHVlICNUUlVFIHRvIGFsbG93IGFub255bW91cyBjb25uZWN0aW9uCisgKi8KK3ZvaWQKK19kYnVzX3RyYW5zcG9ydF9zZXRfYWxsb3dfYW5vbnltb3VzIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgICAgICB2YWx1ZSkKK3sKKyAgdHJhbnNwb3J0LT5hbGxvd19hbm9ueW1vdXMgPSB2YWx1ZSAhPSBGQUxTRTsKK30KKworI2lmZGVmIERCVVNfRU5BQkxFX1NUQVRTCit2b2lkCitfZGJ1c190cmFuc3BvcnRfZ2V0X3N0YXRzIChEQnVzVHJhbnNwb3J0ICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKnF1ZXVlX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKnF1ZXVlX2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICpwZWFrX3F1ZXVlX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKnBlYWtfcXVldWVfZmRzKQoreworICBpZiAocXVldWVfYnl0ZXMgIT0gTlVMTCkKKyAgICAqcXVldWVfYnl0ZXMgPSBfZGJ1c19jb3VudGVyX2dldF9zaXplX3ZhbHVlICh0cmFuc3BvcnQtPmxpdmVfbWVzc2FnZXMpOworCisgIGlmIChxdWV1ZV9mZHMgIT0gTlVMTCkKKyAgICAqcXVldWVfZmRzID0gX2RidXNfY291bnRlcl9nZXRfdW5peF9mZF92YWx1ZSAodHJhbnNwb3J0LT5saXZlX21lc3NhZ2VzKTsKKworICBpZiAocGVha19xdWV1ZV9ieXRlcyAhPSBOVUxMKQorICAgICpwZWFrX3F1ZXVlX2J5dGVzID0gX2RidXNfY291bnRlcl9nZXRfcGVha19zaXplX3ZhbHVlICh0cmFuc3BvcnQtPmxpdmVfbWVzc2FnZXMpOworCisgIGlmIChwZWFrX3F1ZXVlX2ZkcyAhPSBOVUxMKQorICAgICpwZWFrX3F1ZXVlX2ZkcyA9IF9kYnVzX2NvdW50ZXJfZ2V0X3BlYWtfdW5peF9mZF92YWx1ZSAodHJhbnNwb3J0LT5saXZlX21lc3NhZ2VzKTsKK30KKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9TVEFUUyAqLworCisvKiogQH0gKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLXRyYW5zcG9ydC5oIGIvZGJ1cy9kYnVzL2RidXMtdHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI4MjE1MQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsMTA5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdHJhbnNwb3J0LmggREJ1c1RyYW5zcG9ydCBvYmplY3QgKGludGVybmFsIHRvIEQtQlVTIGltcGxlbWVudGF0aW9uKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNCAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfVFJBTlNQT1JUX0gKKyNkZWZpbmUgREJVU19UUkFOU1BPUlRfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXByb3RvY29sLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWFkZHJlc3MuaD4KKworREJVU19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBEQnVzVHJhbnNwb3J0IERCdXNUcmFuc3BvcnQ7CisKK0RCdXNUcmFuc3BvcnQqICAgICBfZGJ1c190cmFuc3BvcnRfb3BlbiAgICAgICAgICAgICAgICAgICAoREJ1c0FkZHJlc3NFbnRyeSAgICAgICAgICAgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICAgICAqZXJyb3IpOworREJ1c1RyYW5zcG9ydCogICAgIF9kYnVzX3RyYW5zcG9ydF9yZWYgICAgICAgICAgICAgICAgICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0KTsKK3ZvaWQgICAgICAgICAgICAgICBfZGJ1c190cmFuc3BvcnRfdW5yZWYgICAgICAgICAgICAgICAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCk7Cit2b2lkICAgICAgICAgICAgICAgX2RidXNfdHJhbnNwb3J0X2Rpc2Nvbm5lY3QgICAgICAgICAgICAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQpOworZGJ1c19ib29sX3QgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfY29ubmVjdGVkICAgICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0KTsKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2F1dGhlbnRpY2F0ZWQgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCk7CitkYnVzX2Jvb2xfdCAgICAgICAgX2RidXNfdHJhbnNwb3J0X2dldF9pc19hbm9ueW1vdXMgICAgICAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQpOworZGJ1c19ib29sX3QgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9jYW5fcGFzc191bml4X2ZkICAgICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0KTsKKworY29uc3QgY2hhciogICAgICAgIF9kYnVzX3RyYW5zcG9ydF9nZXRfYWRkcmVzcyAgICAgICAgICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0KTsKK2NvbnN0IGNoYXIqICAgICAgICBfZGJ1c190cmFuc3BvcnRfZ2V0X3NlcnZlcl9pZCAgICAgICAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCk7CitkYnVzX2Jvb2xfdCAgICAgICAgX2RidXNfdHJhbnNwb3J0X2hhbmRsZV93YXRjaCAgICAgICAgICAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICAgICAgICAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIGNvbmRpdGlvbik7CitkYnVzX2Jvb2xfdCAgICAgICAgX2RidXNfdHJhbnNwb3J0X3NldF9jb25uZWN0aW9uICAgICAgICAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK3ZvaWQgICAgICAgICAgICAgICBfZGJ1c190cmFuc3BvcnRfZG9faXRlcmF0aW9uICAgICAgICAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpOworREJ1c0Rpc3BhdGNoU3RhdHVzIF9kYnVzX3RyYW5zcG9ydF9nZXRfZGlzcGF0Y2hfc3RhdHVzICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0KTsKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c190cmFuc3BvcnRfcXVldWVfbWVzc2FnZXMgICAgICAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCk7CisKK3ZvaWQgICAgICAgICAgICAgICBfZGJ1c190cmFuc3BvcnRfc2V0X21heF9tZXNzYWdlX3NpemUgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworbG9uZyAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9nZXRfbWF4X21lc3NhZ2Vfc2l6ZSAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0KTsKK3ZvaWQgICAgICAgICAgICAgICBfZGJ1c190cmFuc3BvcnRfc2V0X21heF9yZWNlaXZlZF9zaXplICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworbG9uZyAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9nZXRfbWF4X3JlY2VpdmVkX3NpemUgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0KTsKKwordm9pZCAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9zZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgIG4pOworbG9uZyAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9nZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQpOwordm9pZCAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9zZXRfbWF4X3JlY2VpdmVkX3VuaXhfZmRzKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgIG4pOworbG9uZyAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9nZXRfbWF4X3JlY2VpdmVkX3VuaXhfZmRzKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQpOworCitkYnVzX2Jvb2xfdCAgICAgICAgX2RidXNfdHJhbnNwb3J0X2dldF9zb2NrZXRfZmQgICAgICAgICAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICpmZF9wKTsKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c190cmFuc3BvcnRfZ2V0X3VuaXhfdXNlciAgICAgICAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgKnVpZCk7CitkYnVzX2Jvb2xfdCAgICAgICAgX2RidXNfdHJhbnNwb3J0X2dldF91bml4X3Byb2Nlc3NfaWQgICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAqcGlkKTsKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c190cmFuc3BvcnRfZ2V0X2FkdF9hdWRpdF9zZXNzaW9uX2RhdGEgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICoqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUpOwordm9pZCAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9zZXRfdW5peF91c2VyX2Z1bmN0aW9uIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQWxsb3dVbml4VXNlckZ1bmN0aW9uICAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICoqb2xkX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgICpvbGRfZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c190cmFuc3BvcnRfZ2V0X3dpbmRvd3NfdXNlciAgICAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAqKndpbmRvd3Nfc2lkX3ApOwordm9pZCAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9zZXRfd2luZG93c191c2VyX2Z1bmN0aW9uIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQWxsb3dXaW5kb3dzVXNlckZ1bmN0aW9uICAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICoqb2xkX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgICpvbGRfZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c190cmFuc3BvcnRfc2V0X2F1dGhfbWVjaGFuaXNtcyAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAqKm1lY2hhbmlzbXMpOwordm9pZCAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9zZXRfYWxsb3dfYW5vbnltb3VzICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgICAgdmFsdWUpOworCisvKiBpZiBEQlVTX0VOQUJMRV9TVEFUUyAqLwordm9pZCBfZGJ1c190cmFuc3BvcnRfZ2V0X3N0YXRzIChEQnVzVHJhbnNwb3J0ICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAqcXVldWVfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICpxdWV1ZV9mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICpwZWFrX3F1ZXVlX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAqcGVha19xdWV1ZV9mZHMpOworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19UUkFOU1BPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtdHlwZXMuaCBiL2RidXMvZGJ1cy9kYnVzLXR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdmYzU4NgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXR5cGVzLmgKQEAgLTAsMCArMSwxNzggQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy10eXBlcy5oICB0eXBlcyBzdWNoIGFzIGRidXNfYm9vbF90CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZiAhZGVmaW5lZCAoREJVU19JTlNJREVfREJVU19IKSAmJiAhZGVmaW5lZCAoREJVU19DT01QSUxBVElPTikKKyNlcnJvciAiT25seSA8ZGJ1cy9kYnVzLmg+IGNhbiBiZSBpbmNsdWRlZCBkaXJlY3RseSwgdGhpcyBmaWxlIG1heSBkaXNhcHBlYXIgb3IgY2hhbmdlIGNvbnRlbnRzLiIKKyNlbmRpZgorCisjaWZuZGVmIERCVVNfVFlQRVNfSAorI2RlZmluZSBEQlVTX1RZUEVTX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1hcmNoLWRlcHMuaD4KKwordHlwZWRlZiBkYnVzX3VpbnQzMl90ICBkYnVzX3VuaWNoYXJfdDsKKy8qIGJvb2xlYW4gc2l6ZSBtdXN0IGJlIGZpeGVkIGF0IDQgYnl0ZXMgZHVlIHRvIHdpcmUgcHJvdG9jb2whICovCit0eXBlZGVmIGRidXNfdWludDMyX3QgIGRidXNfYm9vbF90OworCisvKiBOb3JtYWxseSBkb2NzIGFyZSBpbiAuYyBmaWxlcywgYnV0IHRoZXJlIGlzbid0IGEgLmMgZmlsZSBmb3IgdGhpcy4gKi8KKy8qKgorICogQGRlZmdyb3VwIERCdXNUeXBlcyBCYXNpYyB0eXBlcworICogQGluZ3JvdXAgIERCdXMKKyAqIEBicmllZiBkYnVzX2Jvb2xfdCwgZGJ1c19pbnQzMl90LCBldGMuCisgKgorICogVHlwZWRlZnMgZm9yIGNvbW1vbiBwcmltaXRpdmUgdHlwZXMuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIEB0eXBlZGVmIGRidXNfYm9vbF90CisgKgorICogQSBib29sZWFuLCB2YWxpZCB2YWx1ZXMgYXJlICNUUlVFIGFuZCAjRkFMU0UuCisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBkYnVzX3VpbnQzMl90CisgKgorICogQSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciBvbiBhbGwgcGxhdGZvcm1zLgorICovCisKKy8qKgorICogQHR5cGVkZWYgZGJ1c19pbnQzMl90CisgKgorICogQSAzMi1iaXQgc2lnbmVkIGludGVnZXIgb24gYWxsIHBsYXRmb3Jtcy4KKyAqLworCisvKioKKyAqIEB0eXBlZGVmIGRidXNfdWludDE2X3QKKyAqCisgKiBBIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIG9uIGFsbCBwbGF0Zm9ybXMuCisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBkYnVzX2ludDE2X3QKKyAqCisgKiBBIDE2LWJpdCBzaWduZWQgaW50ZWdlciBvbiBhbGwgcGxhdGZvcm1zLgorICovCisKKworLyoqCisgKiBAdHlwZWRlZiBkYnVzX3VpbnQ2NF90CisgKgorICogQSA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciBvbiBhbGwgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCBpdC4KKyAqIElmIHN1cHBvcnRlZCwgI0RCVVNfSEFWRV9JTlQ2NCB3aWxsIGJlIGRlZmluZWQuCisgKgorICogQzk5IHJlcXVpcmVzIGEgNjQtYml0IHR5cGUgYW5kIG1vc3QgbGlrZWx5IGFsbCBpbnRlcmVzdGluZworICogY29tcGlsZXJzIHN1cHBvcnQgb25lLiBHTGliIGZvciBleGFtcGxlIGZsYXQtb3V0IHJlcXVpcmVzCisgKiBhIDY0LWJpdCB0eXBlLgorICoKKyAqIFlvdSBwcm9iYWJseSB3YW50IHRvIGp1c3QgYXNzdW1lICNEQlVTX0hBVkVfSU5UNjQgaXMgYWx3YXlzIGRlZmluZWQuCisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBkYnVzX2ludDY0X3QKKyAqCisgKiBBIDY0LWJpdCBzaWduZWQgaW50ZWdlciBvbiBhbGwgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCBpdC4KKyAqIElmIHN1cHBvcnRlZCwgI0RCVVNfSEFWRV9JTlQ2NCB3aWxsIGJlIGRlZmluZWQuCisgKgorICogQzk5IHJlcXVpcmVzIGEgNjQtYml0IHR5cGUgYW5kIG1vc3QgbGlrZWx5IGFsbCBpbnRlcmVzdGluZworICogY29tcGlsZXJzIHN1cHBvcnQgb25lLiBHTGliIGZvciBleGFtcGxlIGZsYXQtb3V0IHJlcXVpcmVzCisgKiBhIDY0LWJpdCB0eXBlLgorICogCisgKiBZb3UgcHJvYmFibHkgd2FudCB0byBqdXN0IGFzc3VtZSAjREJVU19IQVZFX0lOVDY0IGlzIGFsd2F5cyBkZWZpbmVkLgorICovCisKKy8qKgorICogQGRlZiBEQlVTX0hBVkVfSU5UNjQKKyAqCisgKiBEZWZpbmVkIGlmIDY0LWJpdCBpbnRlZ2VycyBhcmUgYXZhaWxhYmxlLiBXaWxsIGJlIGRlZmluZWQKKyAqIG9uIGFueSBwbGF0Zm9ybSB5b3UgY2FyZSBhYm91dCwgdW5sZXNzIHlvdSBjYXJlIGFib3V0CisgKiBzb21lIHRydWx5IGFuY2llbnQgVU5JWCwgb3Igc29tZSBiaXphcnJlIGVtYmVkZGVkIHBsYXRmb3JtLgorICoKKyAqIEM5OSByZXF1aXJlcyBhIDY0LWJpdCB0eXBlIGFuZCBtb3N0IGxpa2VseSBhbGwgaW50ZXJlc3RpbmcKKyAqIGNvbXBpbGVycyBzdXBwb3J0IG9uZS4gR0xpYiBmb3IgZXhhbXBsZSBmbGF0LW91dCByZXF1aXJlcworICogYSA2NC1iaXQgdHlwZS4KKyAqCisgKiBZb3Ugc2hvdWxkIGZlZWwgY29tZm9ydGFibGUgaWdub3JpbmcgdGhpcyBtYWNybyBhbmQganVzdCB1c2luZworICogaW50NjQgdW5jb25kaXRpb25hbGx5LgorICogCisgKi8KKworLyoqCisgKiBAZGVmIERCVVNfSU5UNjRfQ09OU1RBTlQKKyAqCisgKiBEZWNsYXJlIGEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyIGNvbnN0YW50LiBUaGUgbWFjcm8KKyAqIGFkZHMgdGhlIG5lY2Vzc2FyeSAiTEwiIG9yIHdoYXRldmVyIGFmdGVyIHRoZSBpbnRlZ2VyLAorICogZ2l2aW5nIGEgbGl0ZXJhbCBzdWNoIGFzICIzMjUxNDUyNDY3NjVMTCIKKyAqLworCisvKioKKyAqIEBkZWYgREJVU19VSU5UNjRfQ09OU1RBTlQKKyAqCisgKiBEZWNsYXJlIGEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIgY29uc3RhbnQuIFRoZSBtYWNybworICogYWRkcyB0aGUgbmVjZXNzYXJ5ICJVTEwiIG9yIHdoYXRldmVyIGFmdGVyIHRoZSBpbnRlZ2VyLAorICogZ2l2aW5nIGEgbGl0ZXJhbCBzdWNoIGFzICIzMjUxNDUyNDY3NjVVTEwiCisgKi8KKworLyoqCisgKiBBbiA4LWJ5dGUgc3RydWN0IHlvdSBjb3VsZCB1c2UgdG8gYWNjZXNzIGludDY0IHdpdGhvdXQgaGF2aW5nCisgKiBpbnQ2NCBzdXBwb3J0CisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIGRidXNfdWludDMyX3QgZmlyc3QzMjsgIC8qKjwgZmlyc3QgMzIgYml0cyBpbiB0aGUgOCBieXRlcyAoYmV3YXJlIGVuZGlhbiBpc3N1ZXMpICovCisgIGRidXNfdWludDMyX3Qgc2Vjb25kMzI7IC8qKjwgc2Vjb25kIDMyIGJpdHMgaW4gdGhlIDggYnl0ZXMgKGJld2FyZSBlbmRpYW4gaXNzdWVzKSAqLworfSBEQnVzOEJ5dGVTdHJ1Y3Q7CisKKy8qKgorICogQSBzaW1wbGUgdmFsdWUgdW5pb24gdGhhdCBsZXRzIHlvdSBhY2Nlc3MgYnl0ZXMgYXMgaWYgdGhleQorICogd2VyZSB2YXJpb3VzIHR5cGVzOyB1c2VmdWwgd2hlbiBkZWFsaW5nIHdpdGggYmFzaWMgdHlwZXMgdmlhCisgKiB2b2lkIHBvaW50ZXJzIGFuZCB2YXJhcmdzLgorICoKKyAqIFRoaXMgdW5pb24gYWxzbyBjb250YWlucyBhIHBvaW50ZXIgbWVtYmVyICh3aGljaCBjYW4gYmUgdXNlZAorICogdG8gcmV0cmlldmUgYSBzdHJpbmcgZnJvbSBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMoKSwgZm9yCisgKiBpbnN0YW5jZSksIHNvIG9uIGZ1dHVyZSBwbGF0Zm9ybXMgaXQgY291bGQgY29uY2VpdmFibHkgYmUgbGFyZ2VyCisgKiB0aGFuIDggYnl0ZXMuCisgKi8KK3R5cGVkZWYgdW5pb24KK3sKKyAgdW5zaWduZWQgY2hhciBieXRlc1s4XTsgLyoqPCBhcyA4IGluZGl2aWR1YWwgYnl0ZXMgKi8KKyAgZGJ1c19pbnQxNl90ICBpMTY7ICAgLyoqPCBhcyBpbnQxNiAqLworICBkYnVzX3VpbnQxNl90IHUxNjsgICAvKio8IGFzIGludDE2ICovCisgIGRidXNfaW50MzJfdCAgaTMyOyAgIC8qKjwgYXMgaW50MzIgKi8KKyAgZGJ1c191aW50MzJfdCB1MzI7ICAgLyoqPCBhcyBpbnQzMiAqLworICBkYnVzX2Jvb2xfdCAgIGJvb2xfdmFsOyAvKio8IGFzIGJvb2xlYW4gKi8KKyNpZmRlZiBEQlVTX0hBVkVfSU5UNjQKKyAgZGJ1c19pbnQ2NF90ICBpNjQ7ICAgLyoqPCBhcyBpbnQ2NCAqLworICBkYnVzX3VpbnQ2NF90IHU2NDsgICAvKio8IGFzIGludDY0ICovCisjZW5kaWYKKyAgREJ1czhCeXRlU3RydWN0IGVpZ2h0OyAvKio8IGFzIDgtYnl0ZSBzdHJ1Y3QgKi8KKyAgZG91YmxlIGRibDsgICAgICAgICAgLyoqPCBhcyBkb3VibGUgKi8KKyAgdW5zaWduZWQgY2hhciBieXQ7ICAgLyoqPCBhcyBieXRlICovCisgIGNoYXIgKnN0cjsgICAgICAgICAgIC8qKjwgYXMgY2hhciogKHN0cmluZywgb2JqZWN0IHBhdGggb3Igc2lnbmF0dXJlKSAqLworICBpbnQgZmQ7ICAgICAgICAgICAgICAvKio8IGFzIFVuaXggZmlsZSBkZXNjcmlwdG9yICovCit9IERCdXNCYXNpY1ZhbHVlOworCisvKiogQH0gKi8KKworI2VuZGlmIC8qIERCVVNfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtdXNlcmRiLXV0aWwuYyBiL2RidXMvZGJ1cy9kYnVzLXVzZXJkYi11dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZiZjIyOQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXVzZXJkYi11dGlsLmMKQEAgLTAsMCArMSw0ODAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy11c2VyZGItdXRpbC5jIFdvdWxkIGJlIGluIGRidXMtdXNlcmRiLmMsIGJ1dCBub3QgdXNlZCBpbiBsaWJkYnVzCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2RlZmluZSBEQlVTX1VTRVJEQl9JTkNMVURFU19QUklWQVRFIDEKKyNpbmNsdWRlICJkYnVzLXVzZXJkYi5oIgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWYgSEFWRV9TWVNURU1ECisjaW5jbHVkZSA8c3lzdGVtZC9zZC1kYWVtb24uaD4KKyNpbmNsdWRlIDxzeXN0ZW1kL3NkLWxvZ2luLmg+CisjZW5kaWYKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzSW50ZXJuYWxzVXRpbHMKKyAqIEB7CisgKi8KKworLyoqCisgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBVSUQgc2VudCBpbiBpcyB0aGUgY29uc29sZSB1c2VyCisgKgorICogQHBhcmFtIHVpZCBVSUQgb2YgcGVyc29uIHRvIGNoZWNrIAorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3JzCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgVUlEIGlzIHRoZSBzYW1lIGFzIHRoZSBjb25zb2xlIHVzZXIgYW5kIHRoZXJlIGFyZSBubyBlcnJvcnMKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2lzX2NvbnNvbGVfdXNlciAoZGJ1c191aWRfdCB1aWQsCisJCSAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworCisgIERCdXNVc2VyRGF0YWJhc2UgKmRiOworICBjb25zdCBEQnVzVXNlckluZm8gKmluZm87CisgIGRidXNfYm9vbF90IHJlc3VsdCA9IEZBTFNFOworCisjaWZkZWYgSEFWRV9TWVNURU1ECisgIGlmIChzZF9ib290ZWQgKCkgPiAwKQorICAgIHsKKyAgICAgIGludCByOworCisgICAgICAvKiBDaGVjayB3aGV0aGVyIHRoaXMgdXNlciBpcyBsb2dnZWQgaW4gb24gYXQgbGVhc3Qgb25lIHBoeXNpY2FsCisgICAgICAgICBzZWF0ICovCisgICAgICByID0gc2RfdWlkX2dldF9zZWF0cyAodWlkLCAwLCBOVUxMKTsKKyAgICAgIGlmIChyIDwgMCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoLXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGRldGVybWluZSBzZWF0cyBvZiB1c2VyIFwiIiBEQlVTX1VJRF9GT1JNQVQgIlwiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKC1yKSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIHJldHVybiAociA+IDApOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05TT0xFX09XTkVSX0ZJTEUKKworICBEQnVzU3RyaW5nIGY7CisgIERCdXNTdGF0IHN0OworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCgmZiwgREJVU19DT05TT0xFX09XTkVSX0ZJTEUpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlKCZmKTsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKF9kYnVzX3N0YXQoJmYsICZzdCwgTlVMTCkgJiYgKHN0LnVpZCA9PSB1aWQpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlKCZmKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSgmZik7CisKKyNlbmRpZiAvKiBIQVZFX0NPTlNPTEVfT1dORVJfRklMRSAqLworCisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfbG9ja19zeXN0ZW0gKCk7CisKKyAgZGIgPSBfZGJ1c191c2VyX2RhdGFiYXNlX2dldF9zeXN0ZW0gKCk7CisgIGlmIChkYiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJDb3VsZCBub3QgZ2V0IHN5c3RlbSBkYXRhYmFzZS4iKTsKKyAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogVFBURDogdGhpcyBzaG91bGQgYmUgY2FjaGUtc2FmZSwgd2UndmUgbG9ja2VkIHRoZSBEQiBhbmQKKyAgICBfZGJ1c191c2VyX2F0X2NvbnNvbGUgZG9lc24ndCBwYXNzIGl0IG9uLiAqLworICBpbmZvID0gX2RidXNfdXNlcl9kYXRhYmFzZV9sb29rdXAgKGRiLCB1aWQsIE5VTEwsIGVycm9yKTsKKworICBpZiAoaW5mbyA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJlc3VsdCA9IF9kYnVzX3VzZXJfYXRfY29uc29sZSAoaW5mby0+dXNlcm5hbWUsIGVycm9yKTsKKworICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBHZXRzIHVzZXIgSUQgZ2l2ZW4gdXNlcm5hbWUKKyAqCisgKiBAcGFyYW0gdXNlcm5hbWUgdGhlIHVzZXJuYW1lCisgKiBAcGFyYW0gdWlkIHJldHVybiBsb2NhdGlvbiBmb3IgVUlECisgKiBAcmV0dXJucyAjVFJVRSBpZiB1c2VybmFtZSBleGlzdGVkIGFuZCB3ZSBnb3QgdGhlIFVJRAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X3VzZXJfaWQgKGNvbnN0IERCdXNTdHJpbmcgICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICAqdWlkKQoreworICByZXR1cm4gX2RidXNfZ2V0X3VzZXJfaWRfYW5kX3ByaW1hcnlfZ3JvdXAgKHVzZXJuYW1lLCB1aWQsIE5VTEwpOworfQorCisvKioKKyAqIEdldHMgZ3JvdXAgSUQgZ2l2ZW4gZ3JvdXBuYW1lCisgKgorICogQHBhcmFtIGdyb3VwbmFtZSB0aGUgZ3JvdXBuYW1lCisgKiBAcGFyYW0gZ2lkIHJldHVybiBsb2NhdGlvbiBmb3IgR0lECisgKiBAcmV0dXJucyAjVFJVRSBpZiBncm91cCBuYW1lIGV4aXN0ZWQgYW5kIHdlIGdvdCB0aGUgR0lECisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19nZXRfZ3JvdXBfaWQgKGNvbnN0IERCdXNTdHJpbmcgICpncm91cG5hbWUsCisgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICAgICpnaWQpCit7CisgIERCdXNVc2VyRGF0YWJhc2UgKmRiOworICBjb25zdCBEQnVzR3JvdXBJbmZvICppbmZvOworICBfZGJ1c191c2VyX2RhdGFiYXNlX2xvY2tfc3lzdGVtICgpOworCisgIGRiID0gX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfc3lzdGVtICgpOworICBpZiAoZGIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfZ3JvdXBuYW1lIChkYiwgZ3JvdXBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8sIE5VTEwpKQorICAgIHsKKyAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgKmdpZCA9IGluZm8tPmdpZDsKKyAgCisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogR2V0cyB1c2VyIElEIGFuZCBwcmltYXJ5IGdyb3VwIGdpdmVuIHVzZXJuYW1lCisgKgorICogQHBhcmFtIHVzZXJuYW1lIHRoZSB1c2VybmFtZQorICogQHBhcmFtIHVpZF9wIHJldHVybiBsb2NhdGlvbiBmb3IgVUlECisgKiBAcGFyYW0gZ2lkX3AgcmV0dXJuIGxvY2F0aW9uIGZvciBHSUQKKyAqIEByZXR1cm5zICNUUlVFIGlmIHVzZXJuYW1lIGV4aXN0ZWQgYW5kIHdlIGdvdCB0aGUgVUlEIGFuZCBHSUQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dldF91c2VyX2lkX2FuZF9wcmltYXJ5X2dyb3VwIChjb25zdCBEQnVzU3RyaW5nICAqdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aWRfdCAgICAgICAgKnVpZF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICAgICpnaWRfcCkKK3sKKyAgREJ1c1VzZXJEYXRhYmFzZSAqZGI7CisgIGNvbnN0IERCdXNVc2VySW5mbyAqaW5mbzsKKyAgX2RidXNfdXNlcl9kYXRhYmFzZV9sb2NrX3N5c3RlbSAoKTsKKworICBkYiA9IF9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X3N5c3RlbSAoKTsKKyAgaWYgKGRiID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X3VzZXJuYW1lIChkYiwgdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLCBOVUxMKSkKKyAgICB7CisgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICh1aWRfcCkKKyAgICAqdWlkX3AgPSBpbmZvLT51aWQ7CisgIGlmIChnaWRfcCkKKyAgICAqZ2lkX3AgPSBpbmZvLT5wcmltYXJ5X2dpZDsKKyAgCisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogTG9va3MgdXAgYSBnaWQgb3IgZ3JvdXAgbmFtZSBpbiB0aGUgdXNlciBkYXRhYmFzZS4gIE9ubHkgb25lIG9mCisgKiBuYW1lIG9yIEdJRCBjYW4gYmUgcHJvdmlkZWQuIFRoZXJlIGFyZSB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgdGhpcworICogdGhhdCBhcmUgYmV0dGVyIHRvIHVzZSwgdGhpcyBvbmUgZG9lcyBubyBsb2NraW5nIG9yIGFueXRoaW5nIG9uIHRoZQorICogZGF0YWJhc2UgYW5kIG90aGVyd2lzZSBzb3J0IG9mIHN1Y2tzLgorICoKKyAqIEBwYXJhbSBkYiB0aGUgZGF0YWJhc2UKKyAqIEBwYXJhbSBnaWQgdGhlIGdyb3VwIElEIG9yICNEQlVTX0dJRF9VTlNFVAorICogQHBhcmFtIGdyb3VwbmFtZSBncm91cCBuYW1lIG9yICNOVUxMIAorICogQHBhcmFtIGVycm9yIGVycm9yIHRvIGZpbGwgaW4KKyAqIEByZXR1cm5zIHRoZSBlbnRyeSBpbiB0aGUgZGF0YWJhc2UKKyAqLworREJ1c0dyb3VwSW5mbyoKK19kYnVzX3VzZXJfZGF0YWJhc2VfbG9va3VwX2dyb3VwIChEQnVzVXNlckRhdGFiYXNlICpkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2dpZF90ICAgICAgICBnaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZ3JvdXBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBEQnVzR3JvdXBJbmZvICppbmZvOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgICAvKiBTZWUgaWYgdGhlIGdyb3VwIGlzIHJlYWxseSBhIG51bWJlciAqLworICAgaWYgKGdpZCA9PSBEQlVTX1VJRF9VTlNFVCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIG47CisKKyAgICAgIGlmIChfZGJ1c19pc19hX251bWJlciAoZ3JvdXBuYW1lLCAmbikpCisgICAgICAgIGdpZCA9IG47CisgICAgfQorCisjaWZkZWYgREJVU19FTkFCTEVfVVNFUkRCX0NBQ0hFCisgIGlmIChnaWQgIT0gREJVU19HSURfVU5TRVQpCisgICAgaW5mbyA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3VpbnRwdHIgKGRiLT5ncm91cHMsIGdpZCk7CisgIGVsc2UKKyAgICBpbmZvID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChkYi0+Z3JvdXBzX2J5X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChncm91cG5hbWUpKTsKKyAgaWYgKGluZm8pCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIlVzaW5nIGNhY2hlIGZvciBHSUQgIkRCVVNfR0lEX0ZPUk1BVCIgaW5mb3JtYXRpb25cbiIsCisgICAgICAgICAgICAgICAgICAgICBpbmZvLT5naWQpOworICAgICAgcmV0dXJuIGluZm87CisgICAgfQorICBlbHNlCisjZWxzZQorICBpZiAoMSkKKyNlbmRpZgorICAgIHsKKyAgICAgIGlmIChnaWQgIT0gREJVU19HSURfVU5TRVQpCisJX2RidXNfdmVyYm9zZSAoIk5vIGNhY2hlIGZvciBHSUQgIkRCVVNfR0lEX0ZPUk1BVCJcbiIsCisJCSAgICAgICBnaWQpOworICAgICAgZWxzZQorCV9kYnVzX3ZlcmJvc2UgKCJObyBjYWNoZSBmb3IgZ3JvdXBuYW1lIFwiJXNcIlxuIiwKKwkJICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZ3JvdXBuYW1lKSk7CisgICAgICAKKyAgICAgIGluZm8gPSBkYnVzX25ldzAgKERCdXNHcm91cEluZm8sIDEpOworICAgICAgaWYgKGluZm8gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgIGlmIChnaWQgIT0gREJVU19HSURfVU5TRVQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX2dyb3VwX2luZm9fZmlsbF9naWQgKGluZm8sIGdpZCwgZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgICAgIF9kYnVzX2dyb3VwX2luZm9fZnJlZV9hbGxvY2F0ZWQgKGluZm8pOworICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19ncm91cF9pbmZvX2ZpbGwgKGluZm8sIGdyb3VwbmFtZSwgZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgICAgIF9kYnVzX2dyb3VwX2luZm9fZnJlZV9hbGxvY2F0ZWQgKGluZm8pOworICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAvKiBkb24ndCB1c2UgdGhlc2UgcGFzdCBoZXJlICovCisgICAgICBnaWQgPSBEQlVTX0dJRF9VTlNFVDsKKyAgICAgIGdyb3VwbmFtZSA9IE5VTEw7CisKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfdWludHB0ciAoZGItPmdyb3VwcywgaW5mby0+Z2lkLCBpbmZvKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgIF9kYnVzX2dyb3VwX2luZm9fZnJlZV9hbGxvY2F0ZWQgKGluZm8pOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKworICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKGRiLT5ncm91cHNfYnlfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5ncm91cG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbykpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV91aW50cHRyIChkYi0+Z3JvdXBzLCBpbmZvLT5naWQpOworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAKKyAgICAgIHJldHVybiBpbmZvOworICAgIH0KK30KKworCisvKioKKyAqIEdldHMgdGhlIHVzZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbiBncm91cCBuYW1lLAorICogcmV0dXJuZWQgZ3JvdXAgaW5mbyBzaG91bGQgbm90IGJlIGZyZWVkLiAKKyAqCisgKiBAcGFyYW0gZGIgdXNlciBkYXRhYmFzZQorICogQHBhcmFtIGdyb3VwbmFtZSB0aGUgZ3JvdXAgbmFtZQorICogQHBhcmFtIGluZm8gcmV0dXJuIGxvY2F0aW9uIGZvciBjb25zdCByZWYgdG8gZ3JvdXAgaW5mbworICogQHBhcmFtIGVycm9yIGVycm9yIGxvY2F0aW9uCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgZXJyb3IgaXMgc2V0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c191c2VyX2RhdGFiYXNlX2dldF9ncm91cG5hbWUgKERCdXNVc2VyRGF0YWJhc2UgICAgICpkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgKmdyb3VwbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c0dyb3VwSW5mbyAqKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICplcnJvcikKK3sKKyAgKmluZm8gPSBfZGJ1c191c2VyX2RhdGFiYXNlX2xvb2t1cF9ncm91cCAoZGIsIERCVVNfR0lEX1VOU0VULCBncm91cG5hbWUsIGVycm9yKTsKKyAgcmV0dXJuICppbmZvICE9IE5VTEw7Cit9CisKKy8qKgorICogR2V0cyB0aGUgdXNlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIEdJRCwKKyAqIHJldHVybmVkIGdyb3VwIGluZm8gc2hvdWxkIG5vdCBiZSBmcmVlZC4gCisgKgorICogQHBhcmFtIGRiIHVzZXIgZGF0YWJhc2UKKyAqIEBwYXJhbSBnaWQgdGhlIGdyb3VwIElECisgKiBAcGFyYW0gaW5mbyByZXR1cm4gbG9jYXRpb24gZm9yIGNvbnN0IHJlZiB0byBncm91cCBpbmZvCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgbG9jYXRpb24KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciBpcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X2dpZCAoREJ1c1VzZXJEYXRhYmFzZSAgICAgKmRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2dpZF90ICAgICAgICAgICAgZ2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzR3JvdXBJbmZvICoqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgKmVycm9yKQoreworICAqaW5mbyA9IF9kYnVzX3VzZXJfZGF0YWJhc2VfbG9va3VwX2dyb3VwIChkYiwgZ2lkLCBOVUxMLCBlcnJvcik7CisgIHJldHVybiAqaW5mbyAhPSBOVUxMOworfQorCisKKy8qKgorICogR2V0cyBhbGwgZ3JvdXBzICBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBVSUQuIFJldHVybnMgI0ZBTFNFCisgKiBpZiBubyBtZW1vcnksIG9yIHVzZXIgaXNuJ3Qga25vd24sIGJ1dCBhbHdheXMgaW5pdGlhbGl6ZXMKKyAqIGdyb3VwX2lkcyB0byBhIE5VTEwgYXJyYXkuIAorICoKKyAqIEBwYXJhbSB1aWQgdGhlIFVJRAorICogQHBhcmFtIGdyb3VwX2lkcyByZXR1cm4gbG9jYXRpb24gZm9yIGFycmF5IG9mIGdyb3VwIElEcworICogQHBhcmFtIG5fZ3JvdXBfaWRzIHJldHVybiBsb2NhdGlvbiBmb3IgbGVuZ3RoIG9mIHJldHVybmVkIGFycmF5CisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgVUlEIGV4aXN0ZWQgYW5kIHdlIGdvdCBzb21lIGNyZWRlbnRpYWxzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19ncm91cHNfZnJvbV91aWQgKGRidXNfdWlkX3QgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICAgKipncm91cF9pZHMsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICpuX2dyb3VwX2lkcykKK3sKKyAgREJ1c1VzZXJEYXRhYmFzZSAqZGI7CisgIGNvbnN0IERCdXNVc2VySW5mbyAqaW5mbzsKKyAgKmdyb3VwX2lkcyA9IE5VTEw7CisgICpuX2dyb3VwX2lkcyA9IDA7CisKKyAgX2RidXNfdXNlcl9kYXRhYmFzZV9sb2NrX3N5c3RlbSAoKTsKKworICBkYiA9IF9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X3N5c3RlbSAoKTsKKyAgaWYgKGRiID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X3VpZCAoZGIsIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLCBOVUxMKSkKKyAgICB7CisgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoaW5mby0+dWlkID09IHVpZCk7CisgIAorICBpZiAoaW5mby0+bl9ncm91cF9pZHMgPiAwKQorICAgIHsKKyAgICAgICpncm91cF9pZHMgPSBkYnVzX25ldyAoZGJ1c19naWRfdCwgaW5mby0+bl9ncm91cF9pZHMpOworICAgICAgaWYgKCpncm91cF9pZHMgPT0gTlVMTCkKKyAgICAgICAgeworCSAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAqbl9ncm91cF9pZHMgPSBpbmZvLT5uX2dyb3VwX2lkczsKKworICAgICAgbWVtY3B5ICgqZ3JvdXBfaWRzLCBpbmZvLT5ncm91cF9pZHMsIGluZm8tPm5fZ3JvdXBfaWRzICogc2l6ZW9mIChkYnVzX2dpZF90KSk7CisgICAgfQorCisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisvKiogQH0gKi8KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKioKKyAqIFVuaXQgdGVzdCBmb3IgZGJ1cy11c2VyZGIuYy4KKyAqIAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3VzZXJkYl90ZXN0IChjb25zdCBjaGFyICp0ZXN0X2RhdGFfZGlyKQoreworICBjb25zdCBEQnVzU3RyaW5nICp1c2VybmFtZTsKKyAgY29uc3QgREJ1c1N0cmluZyAqaG9tZWRpcjsKKyAgZGJ1c191aWRfdCB1aWQ7CisgIHVuc2lnbmVkIGxvbmcgKmdyb3VwX2lkczsKKyAgaW50IG5fZ3JvdXBfaWRzLCBpOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgaWYgKCFfZGJ1c191c2VybmFtZV9mcm9tX2N1cnJlbnRfcHJvY2VzcyAoJnVzZXJuYW1lKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgZ2V0IHVzZXJuYW1lIik7CisKKyAgaWYgKCFfZGJ1c19ob21lZGlyX2Zyb21fY3VycmVudF9wcm9jZXNzICgmaG9tZWRpcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGdldCBob21lZGlyIik7ICAKKworICBpZiAoIV9kYnVzX2dldF91c2VyX2lkICh1c2VybmFtZSwgJnVpZCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGdldCB1aWQiKTsKKworICBpZiAoIV9kYnVzX2dyb3Vwc19mcm9tX3VpZCAodWlkLCAmZ3JvdXBfaWRzLCAmbl9ncm91cF9pZHMpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBnZXQgZ3JvdXBzIik7CisKKyAgcHJpbnRmICgiICAgIEN1cnJlbnQgdXNlcjogJXMgaG9tZWRpcjogJXMgZ2lkczoiLAorICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAodXNlcm5hbWUpLAorICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoaG9tZWRpcikpOworCisgIGZvciAoaT0wOyBpPG5fZ3JvdXBfaWRzOyBpKyspCisgICAgICBwcmludGYoIiAlbGQiLCBncm91cF9pZHNbaV0pOworCisgIHByaW50ZiAoIlxuIik7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBwcmludGYgKCJJcyBDb25zb2xlIHVzZXI6ICVpXG4iLAorICAgICAgICAgIF9kYnVzX2lzX2NvbnNvbGVfdXNlciAodWlkLCAmZXJyb3IpKTsKKyAgcHJpbnRmICgiSW52b2NhdGlvbiB3YXMgT0s6ICVzXG4iLCBlcnJvci5tZXNzYWdlID8gZXJyb3IubWVzc2FnZSA6ICJ5ZXMiKTsKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICBwcmludGYgKCJJcyBDb25zb2xlIHVzZXIgNDcxMTogJWlcbiIsCisgICAgICAgICAgX2RidXNfaXNfY29uc29sZV91c2VyICg0NzExLCAmZXJyb3IpKTsKKyAgcHJpbnRmICgiSW52b2NhdGlvbiB3YXMgT0s6ICVzXG4iLCBlcnJvci5tZXNzYWdlID8gZXJyb3IubWVzc2FnZSA6ICJ5ZXMiKTsKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIGRidXNfZnJlZSAoZ3JvdXBfaWRzKTsKKworICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy11c2VyZGIuYyBiL2RidXMvZGJ1cy9kYnVzLXVzZXJkYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlOGIzOWEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy11c2VyZGIuYwpAQCAtMCwwICsxLDY2OCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXVzZXJkYi5jIFVzZXIgZGF0YWJhc2UgYWJzdHJhY3Rpb24KKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZGVmaW5lIERCVVNfVVNFUkRCX0lOQ0xVREVTX1BSSVZBVEUgMQorI2luY2x1ZGUgImRidXMtdXNlcmRiLmgiCisjaW5jbHVkZSAiZGJ1cy1oYXNoLmgiCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSAiZGJ1cy1jcmVkZW50aWFscy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNJbnRlcm5hbHNVdGlscworICogQHsKKyAqLworCisvKioKKyAqIEZyZWVzIHRoZSBnaXZlbiAjREJ1c1VzZXJJbmZvJ3MgbWVtYmVycyB3aXRoIF9kYnVzX3VzZXJfaW5mb19mcmVlKCkKKyAqIGFuZCBhbHNvIGNhbGxzIGRidXNfZnJlZSgpIG9uIHRoZSBibG9jayBpdHNlbGYKKyAqCisgKiBAcGFyYW0gaW5mbyB0aGUgaW5mbworICovCit2b2lkCitfZGJ1c191c2VyX2luZm9fZnJlZV9hbGxvY2F0ZWQgKERCdXNVc2VySW5mbyAqaW5mbykKK3sKKyAgaWYgKGluZm8gPT0gTlVMTCkgLyogaGFzaCB0YWJsZSB3aWxsIHBhc3MgTlVMTCAqLworICAgIHJldHVybjsKKworICBfZGJ1c191c2VyX2luZm9fZnJlZSAoaW5mbyk7CisgIGRidXNfZnJlZSAoaW5mbyk7Cit9CisKKy8qKgorICogRnJlZXMgdGhlIGdpdmVuICNEQnVzR3JvdXBJbmZvJ3MgbWVtYmVycyB3aXRoIF9kYnVzX2dyb3VwX2luZm9fZnJlZSgpCisgKiBhbmQgYWxzbyBjYWxscyBkYnVzX2ZyZWUoKSBvbiB0aGUgYmxvY2sgaXRzZWxmCisgKgorICogQHBhcmFtIGluZm8gdGhlIGluZm8KKyAqLwordm9pZAorX2RidXNfZ3JvdXBfaW5mb19mcmVlX2FsbG9jYXRlZCAoREJ1c0dyb3VwSW5mbyAqaW5mbykKK3sKKyAgaWYgKGluZm8gPT0gTlVMTCkgLyogaGFzaCB0YWJsZSB3aWxsIHBhc3MgTlVMTCAqLworICAgIHJldHVybjsKKworICBfZGJ1c19ncm91cF9pbmZvX2ZyZWUgKGluZm8pOworICBkYnVzX2ZyZWUgKGluZm8pOworfQorCisvKioKKyAqIEZyZWVzIHRoZSBtZW1iZXJzIG9mIGluZm8KKyAqIChidXQgbm90IGluZm8gaXRzZWxmKQorICogQHBhcmFtIGluZm8gdGhlIHVzZXIgaW5mbyBzdHJ1Y3QKKyAqLwordm9pZAorX2RidXNfdXNlcl9pbmZvX2ZyZWUgKERCdXNVc2VySW5mbyAqaW5mbykKK3sKKyAgZGJ1c19mcmVlIChpbmZvLT5ncm91cF9pZHMpOworICBkYnVzX2ZyZWUgKGluZm8tPnVzZXJuYW1lKTsKKyAgZGJ1c19mcmVlIChpbmZvLT5ob21lZGlyKTsKK30KKworLyoqCisgKiBGcmVlcyB0aGUgbWVtYmVycyBvZiBpbmZvIChidXQgbm90IGluZm8gaXRzZWxmKS4KKyAqCisgKiBAcGFyYW0gaW5mbyB0aGUgZ3JvdXAgaW5mbworICovCit2b2lkCitfZGJ1c19ncm91cF9pbmZvX2ZyZWUgKERCdXNHcm91cEluZm8gICAgKmluZm8pCit7CisgIGRidXNfZnJlZSAoaW5mby0+Z3JvdXBuYW1lKTsKK30KKworLyoqCisgKiBDaGVja3MgaWYgYSBnaXZlbiBzdHJpbmcgaXMgYWN0dWFsbHkgYSBudW1iZXIgCisgKiBhbmQgY29udmVydHMgaXQgaWYgaXQgaXMgCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIGNoZWNrCisgKiBAcGFyYW0gbnVtIHRoZSBtZW1vcnkgbG9jYXRpb24gb2YgdGhlIHVuc2lnbmVkIGxvbmcgdG8gZmlsbCBpbgorICogQHJldHVybnMgVFJVRSBpZiBzdHIgaXMgYSBudW1iZXIgYW5kIG51bSBpcyBmaWxsZWQgaW4gCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19pc19hX251bWJlciAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgKm51bSkKK3sKKyAgaW50IGVuZDsKKworICBpZiAoX2RidXNfc3RyaW5nX3BhcnNlX3VpbnQgKHN0ciwgMCwgbnVtLCAmZW5kKSAmJgorICAgICAgZW5kID09IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpKQorICAgIHJldHVybiBUUlVFOworICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIExvb2tzIHVwIGEgdWlkIG9yIHVzZXJuYW1lIGluIHRoZSB1c2VyIGRhdGFiYXNlLiAgT25seSBvbmUgb2YgbmFtZQorICogb3IgVUlEIGNhbiBiZSBwcm92aWRlZC4gVGhlcmUgYXJlIHdyYXBwZXIgZnVuY3Rpb25zIGZvciB0aGlzIHRoYXQKKyAqIGFyZSBiZXR0ZXIgdG8gdXNlLCB0aGlzIG9uZSBkb2VzIG5vIGxvY2tpbmcgb3IgYW55dGhpbmcgb24gdGhlCisgKiBkYXRhYmFzZSBhbmQgb3RoZXJ3aXNlIHNvcnQgb2Ygc3Vja3MuCisgKgorICogQHBhcmFtIGRiIHRoZSBkYXRhYmFzZQorICogQHBhcmFtIHVpZCB0aGUgdXNlciBJRCBvciAjREJVU19VSURfVU5TRVQKKyAqIEBwYXJhbSB1c2VybmFtZSB1c2VybmFtZSBvciAjTlVMTCAKKyAqIEBwYXJhbSBlcnJvciBlcnJvciB0byBmaWxsIGluCisgKiBAcmV0dXJucyB0aGUgZW50cnkgaW4gdGhlIGRhdGFiYXNlCisgKi8KK0RCdXNVc2VySW5mbyoKK19kYnVzX3VzZXJfZGF0YWJhc2VfbG9va3VwIChEQnVzVXNlckRhdGFiYXNlICpkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIERCdXNVc2VySW5mbyAqaW5mbzsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgX2RidXNfYXNzZXJ0ICh1aWQgIT0gREJVU19VSURfVU5TRVQgfHwgdXNlcm5hbWUgIT0gTlVMTCk7CisKKyAgLyogU2VlIGlmIHRoZSB1c2VybmFtZSBpcyByZWFsbHkgYSBudW1iZXIgKi8KKyAgaWYgKHVpZCA9PSBEQlVTX1VJRF9VTlNFVCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIG47CisKKyAgICAgIGlmIChfZGJ1c19pc19hX251bWJlciAodXNlcm5hbWUsICZuKSkKKyAgICAgICAgdWlkID0gbjsKKyAgICB9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9VU0VSREJfQ0FDSEUgIAorICBpZiAodWlkICE9IERCVVNfVUlEX1VOU0VUKQorICAgIGluZm8gPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF91aW50cHRyIChkYi0+dXNlcnMsIHVpZCk7CisgIGVsc2UKKyAgICBpbmZvID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChkYi0+dXNlcnNfYnlfbmFtZSwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICh1c2VybmFtZSkpOworCisgIGlmIChpbmZvKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJVc2luZyBjYWNoZSBmb3IgVUlEICJEQlVTX1VJRF9GT1JNQVQiIGluZm9ybWF0aW9uXG4iLAorICAgICAgICAgICAgICAgICAgICAgaW5mby0+dWlkKTsKKyAgICAgIHJldHVybiBpbmZvOworICAgIH0KKyAgZWxzZQorI2Vsc2UgCisgIGlmICgxKQorI2VuZGlmCisgICAgeworICAgICAgaWYgKHVpZCAhPSBEQlVTX1VJRF9VTlNFVCkKKwlfZGJ1c192ZXJib3NlICgiTm8gY2FjaGUgZm9yIFVJRCAiREJVU19VSURfRk9STUFUIlxuIiwKKwkJICAgICAgIHVpZCk7CisgICAgICBlbHNlCisJX2RidXNfdmVyYm9zZSAoIk5vIGNhY2hlIGZvciB1c2VyIFwiJXNcIlxuIiwKKwkJICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAodXNlcm5hbWUpKTsKKyAgICAgIAorICAgICAgaW5mbyA9IGRidXNfbmV3MCAoREJ1c1VzZXJJbmZvLCAxKTsKKyAgICAgIGlmIChpbmZvID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBpZiAodWlkICE9IERCVVNfVUlEX1VOU0VUKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c191c2VyX2luZm9fZmlsbF91aWQgKGluZm8sIHVpZCwgZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgICAgIF9kYnVzX3VzZXJfaW5mb19mcmVlX2FsbG9jYXRlZCAoaW5mbyk7CisgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3VzZXJfaW5mb19maWxsIChpbmZvLCB1c2VybmFtZSwgZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgICAgIF9kYnVzX3VzZXJfaW5mb19mcmVlX2FsbG9jYXRlZCAoaW5mbyk7CisgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIC8qIGJlIHN1cmUgd2UgZG9uJ3QgdXNlIHRoZXNlIGFmdGVyIGhlcmUgKi8KKyAgICAgIHVpZCA9IERCVVNfVUlEX1VOU0VUOworICAgICAgdXNlcm5hbWUgPSBOVUxMOworCisgICAgICAvKiBpbnNlcnQgaW50byBoYXNoICovCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3VpbnRwdHIgKGRiLT51c2VycywgaW5mby0+dWlkLCBpbmZvKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgIF9kYnVzX3VzZXJfaW5mb19mcmVlX2FsbG9jYXRlZCAoaW5mbyk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKGRiLT51c2Vyc19ieV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8pKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfdWludHB0ciAoZGItPnVzZXJzLCBpbmZvLT51aWQpOworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAKKyAgICAgIHJldHVybiBpbmZvOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90IGRhdGFiYXNlX2xvY2tlZCA9IEZBTFNFOworc3RhdGljIERCdXNVc2VyRGF0YWJhc2UgKnN5c3RlbV9kYiA9IE5VTEw7CitzdGF0aWMgREJ1c1N0cmluZyBwcm9jZXNzX3VzZXJuYW1lOworc3RhdGljIERCdXNTdHJpbmcgcHJvY2Vzc19ob21lZGlyOworICAgICAgCitzdGF0aWMgdm9pZAorc2h1dGRvd25fc3lzdGVtX2RiICh2b2lkICpkYXRhKQoreworICBpZiAoc3lzdGVtX2RiICE9IE5VTEwpCisgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bnJlZiAoc3lzdGVtX2RiKTsKKyAgc3lzdGVtX2RiID0gTlVMTDsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwcm9jZXNzX3VzZXJuYW1lKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwcm9jZXNzX2hvbWVkaXIpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2luaXRfc3lzdGVtX2RiICh2b2lkKQoreworICBfZGJ1c19hc3NlcnQgKGRhdGFiYXNlX2xvY2tlZCk7CisgICAgCisgIGlmIChzeXN0ZW1fZGIgPT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgICAgICBjb25zdCBEQnVzVXNlckluZm8gKmluZm87CisgICAgICAKKyAgICAgIHN5c3RlbV9kYiA9IF9kYnVzX3VzZXJfZGF0YWJhc2VfbmV3ICgpOworICAgICAgaWYgKHN5c3RlbV9kYiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmICghX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfdWlkIChzeXN0ZW1fZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfZ2V0dWlkICgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VucmVmIChzeXN0ZW1fZGIpOworICAgICAgICAgIHN5c3RlbV9kYiA9IE5VTEw7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIFRoaXMgcmVhbGx5IHNob3VsZCBub3QgaGFwcGVuLiAqLworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiQ291bGQgbm90IGdldCBwYXNzd29yZCBkYXRhYmFzZSBpbmZvcm1hdGlvbiBmb3IgVUlEIG9mIGN1cnJlbnQgcHJvY2VzczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcHJvY2Vzc191c2VybmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VucmVmIChzeXN0ZW1fZGIpOworICAgICAgICAgIHN5c3RlbV9kYiA9IE5VTEw7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZwcm9jZXNzX2hvbWVkaXIpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwcm9jZXNzX3VzZXJuYW1lKTsKKyAgICAgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VucmVmIChzeXN0ZW1fZGIpOworICAgICAgICAgIHN5c3RlbV9kYiA9IE5VTEw7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnByb2Nlc3NfdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnVzZXJuYW1lKSB8fAorICAgICAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmcHJvY2Vzc19ob21lZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5ob21lZGlyKSB8fAorICAgICAgICAgICFfZGJ1c19yZWdpc3Rlcl9zaHV0ZG93bl9mdW5jIChzaHV0ZG93bl9zeXN0ZW1fZGIsIE5VTEwpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwcm9jZXNzX3VzZXJuYW1lKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnByb2Nlc3NfaG9tZWRpcik7CisgICAgICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bnJlZiAoc3lzdGVtX2RiKTsKKyAgICAgICAgICBzeXN0ZW1fZGIgPSBOVUxMOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBMb2NrcyBnbG9iYWwgc3lzdGVtIHVzZXIgZGF0YWJhc2UuCisgKi8KK3ZvaWQKK19kYnVzX3VzZXJfZGF0YWJhc2VfbG9ja19zeXN0ZW0gKHZvaWQpCit7CisgIF9EQlVTX0xPQ0sgKHN5c3RlbV91c2Vycyk7CisgIGRhdGFiYXNlX2xvY2tlZCA9IFRSVUU7Cit9CisKKy8qKgorICogVW5sb2NrcyBnbG9iYWwgc3lzdGVtIHVzZXIgZGF0YWJhc2UuCisgKi8KK3ZvaWQKK19kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAodm9pZCkKK3sKKyAgZGF0YWJhc2VfbG9ja2VkID0gRkFMU0U7CisgIF9EQlVTX1VOTE9DSyAoc3lzdGVtX3VzZXJzKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBzeXN0ZW0gZ2xvYmFsIHVzZXIgZGF0YWJhc2U7CisgKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGxvY2sgaGVsZCAoX2RidXNfdXNlcl9kYXRhYmFzZV9sb2NrX3N5c3RlbSgpKS4KKyAqCisgKiBAcmV0dXJucyB0aGUgZGF0YWJhc2Ugb3IgI05VTEwgaWYgbm8gbWVtb3J5CisgKi8KK0RCdXNVc2VyRGF0YWJhc2UqCitfZGJ1c191c2VyX2RhdGFiYXNlX2dldF9zeXN0ZW0gKHZvaWQpCit7CisgIF9kYnVzX2Fzc2VydCAoZGF0YWJhc2VfbG9ja2VkKTsKKworICBpbml0X3N5c3RlbV9kYiAoKTsKKyAgCisgIHJldHVybiBzeXN0ZW1fZGI7Cit9CisKKy8qKgorICogRmx1c2hlcyB0aGUgc3lzdGVtIGdsb2JhbCB1c2VyIGRhdGFiYXNlOworICovCit2b2lkCitfZGJ1c191c2VyX2RhdGFiYXNlX2ZsdXNoX3N5c3RlbSAodm9pZCkKK3sKKyAgX2RidXNfdXNlcl9kYXRhYmFzZV9sb2NrX3N5c3RlbSAoKTsKKyAgIAorICAgaWYgKHN5c3RlbV9kYiAhPSBOVUxMKQorICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfZmx1c2ggKHN5c3RlbV9kYik7CisKKyAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworfQorCisvKioKKyAqIEdldHMgdXNlcm5hbWUgb2YgdXNlciBvd25pbmcgY3VycmVudCBwcm9jZXNzLiAgVGhlIHJldHVybmVkIHN0cmluZworICogaXMgdmFsaWQgdW50aWwgZGJ1c19zaHV0ZG93bigpIGlzIGNhbGxlZC4KKyAqCisgKiBAcGFyYW0gdXNlcm5hbWUgcGxhY2UgdG8gc3RvcmUgcG9pbnRlciB0byB1c2VybmFtZQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdXNlcm5hbWVfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKGNvbnN0IERCdXNTdHJpbmcgKip1c2VybmFtZSkKK3sKKyAgX2RidXNfdXNlcl9kYXRhYmFzZV9sb2NrX3N5c3RlbSAoKTsKKyAgaWYgKCFpbml0X3N5c3RlbV9kYiAoKSkKKyAgICB7CisgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAqdXNlcm5hbWUgPSAmcHJvY2Vzc191c2VybmFtZTsKKyAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOyAgCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogR2V0cyBob21lZGlyIG9mIHVzZXIgb3duaW5nIGN1cnJlbnQgcHJvY2Vzcy4gIFRoZSByZXR1cm5lZCBzdHJpbmcKKyAqIGlzIHZhbGlkIHVudGlsIGRidXNfc2h1dGRvd24oKSBpcyBjYWxsZWQuCisgKgorICogQHBhcmFtIGhvbWVkaXIgcGxhY2UgdG8gc3RvcmUgcG9pbnRlciB0byBob21lZGlyCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19ob21lZGlyX2Zyb21fY3VycmVudF9wcm9jZXNzIChjb25zdCBEQnVzU3RyaW5nICAqKmhvbWVkaXIpCit7CisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfbG9ja19zeXN0ZW0gKCk7CisgIGlmICghaW5pdF9zeXN0ZW1fZGIgKCkpCisgICAgeworICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgKmhvbWVkaXIgPSAmcHJvY2Vzc19ob21lZGlyOworICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogR2V0cyB0aGUgaG9tZSBkaXJlY3RvcnkgZm9yIHRoZSBnaXZlbiB1c2VyLgorICoKKyAqIEBwYXJhbSB1c2VybmFtZSB0aGUgdXNlcm5hbWUKKyAqIEBwYXJhbSBob21lZGlyIHN0cmluZyB0byBhcHBlbmQgaG9tZSBkaXJlY3RvcnkgdG8KKyAqIEByZXR1cm5zICNUUlVFIGlmIHVzZXIgZXhpc3RlZCBhbmQgd2UgYXBwZW5kZWQgdGhlaXIgaG9tZWRpcgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaG9tZWRpcl9mcm9tX3VzZXJuYW1lIChjb25zdCBEQnVzU3RyaW5nICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqaG9tZWRpcikKK3sKKyAgREJ1c1VzZXJEYXRhYmFzZSAqZGI7CisgIGNvbnN0IERCdXNVc2VySW5mbyAqaW5mbzsKKyAgX2RidXNfdXNlcl9kYXRhYmFzZV9sb2NrX3N5c3RlbSAoKTsKKworICBkYiA9IF9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X3N5c3RlbSAoKTsKKyAgaWYgKGRiID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X3VzZXJuYW1lIChkYiwgdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLCBOVUxMKSkKKyAgICB7CisgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoaG9tZWRpciwgaW5mby0+aG9tZWRpcikpCisgICAgeworICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogR2V0cyB0aGUgaG9tZSBkaXJlY3RvcnkgZm9yIHRoZSBnaXZlbiB1c2VyLgorICoKKyAqIEBwYXJhbSB1aWQgdGhlIHVpZAorICogQHBhcmFtIGhvbWVkaXIgc3RyaW5nIHRvIGFwcGVuZCBob21lIGRpcmVjdG9yeSB0bworICogQHJldHVybnMgI1RSVUUgaWYgdXNlciBleGlzdGVkIGFuZCB3ZSBhcHBlbmRlZCB0aGVpciBob21lZGlyCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19ob21lZGlyX2Zyb21fdWlkIChkYnVzX3VpZF90ICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgKmhvbWVkaXIpCit7CisgIERCdXNVc2VyRGF0YWJhc2UgKmRiOworICBjb25zdCBEQnVzVXNlckluZm8gKmluZm87CisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfbG9ja19zeXN0ZW0gKCk7CisKKyAgZGIgPSBfZGJ1c191c2VyX2RhdGFiYXNlX2dldF9zeXN0ZW0gKCk7CisgIGlmIChkYiA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c191c2VyX2RhdGFiYXNlX2dldF91aWQgKGRiLCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbywgTlVMTCkpCisgICAgeworICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKGhvbWVkaXIsIGluZm8tPmhvbWVkaXIpKQorICAgIHsKKyAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEFkZHMgdGhlIGNyZWRlbnRpYWxzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHVzZXJuYW1lLgorICoKKyAqIFVzZWQgYW1vbmcgb3RoZXIgcHVycG9zZXMgdG8gcGFyc2VzIGEgZGVzaXJlZCBpZGVudGl0eSBwcm92aWRlZAorICogZnJvbSBhIGNsaWVudCBpbiB0aGUgYXV0aCBwcm90b2NvbC4gT24gVU5JWCB0aGlzIG1lYW5zIHBhcnNpbmcgYQorICogVUlELCBvbiBXaW5kb3dzIHByb2JhYmx5IHBhcnNpbmcgYW4gU0lEIHN0cmluZy4KKyAqIAorICogQHRvZG8gdGhpcyBpcyBicm9rZW4gYmVjYXVzZSBpdCB0cmVhdHMgT09NIGFuZCBwYXJzZSBlcnJvcgorICogdGhlIHNhbWUgd2F5LiBOZWVkcyBhICNEQnVzRXJyb3IuCisgKiAKKyAqIEBwYXJhbSBjcmVkZW50aWFscyBjcmVkZW50aWFscyB0byBmaWxsIGluIAorICogQHBhcmFtIHVzZXJuYW1lIHRoZSB1c2VybmFtZQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIHVzZXJuYW1lIGV4aXN0ZWQgYW5kIHdlIGdvdCBzb21lIGNyZWRlbnRpYWxzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc19hZGRfZnJvbV91c2VyIChEQnVzQ3JlZGVudGlhbHMgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnVzZXJuYW1lKQoreworICBEQnVzVXNlckRhdGFiYXNlICpkYjsKKyAgY29uc3QgREJ1c1VzZXJJbmZvICppbmZvOworCisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfbG9ja19zeXN0ZW0gKCk7CisKKyAgZGIgPSBfZGJ1c191c2VyX2RhdGFiYXNlX2dldF9zeXN0ZW0gKCk7CisgIGlmIChkYiA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c191c2VyX2RhdGFiYXNlX2dldF91c2VybmFtZSAoZGIsIHVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbywgTlVMTCkpCisgICAgeworICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF91bml4X3VpZChjcmVkZW50aWFscywgaW5mby0+dWlkKSkKKyAgICB7CisgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IHVzZXIgZGF0YWJhc2Ugb2JqZWN0IHVzZWQgdG8gbG9vayB1cCBhbmQKKyAqIGNhY2hlIHVzZXIgaW5mb3JtYXRpb24uCisgKiBAcmV0dXJucyBuZXcgZGF0YWJhc2UsIG9yICNOVUxMIG9uIG91dCBvZiBtZW1vcnkKKyAqLworREJ1c1VzZXJEYXRhYmFzZSoKK19kYnVzX3VzZXJfZGF0YWJhc2VfbmV3ICh2b2lkKQoreworICBEQnVzVXNlckRhdGFiYXNlICpkYjsKKyAgCisgIGRiID0gZGJ1c19uZXcwIChEQnVzVXNlckRhdGFiYXNlLCAxKTsKKyAgaWYgKGRiID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgZGItPnJlZmNvdW50ID0gMTsKKworICBkYi0+dXNlcnMgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1VJTlRQVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAoREJ1c0ZyZWVGdW5jdGlvbikgX2RidXNfdXNlcl9pbmZvX2ZyZWVfYWxsb2NhdGVkKTsKKyAgCisgIGlmIChkYi0+dXNlcnMgPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZDsKKworICBkYi0+Z3JvdXBzID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9VSU5UUFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIChEQnVzRnJlZUZ1bmN0aW9uKSBfZGJ1c19ncm91cF9pbmZvX2ZyZWVfYWxsb2NhdGVkKTsKKyAgCisgIGlmIChkYi0+Z3JvdXBzID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisKKyAgZGItPnVzZXJzX2J5X25hbWUgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CisgIGlmIChkYi0+dXNlcnNfYnlfbmFtZSA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkOworICAKKyAgZGItPmdyb3Vwc19ieV9uYW1lID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKKyAgaWYgKGRiLT5ncm91cHNfYnlfbmFtZSA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkOworICAKKyAgcmV0dXJuIGRiOworICAKKyBmYWlsZWQ6CisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5yZWYgKGRiKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogRmx1c2ggYWxsIGluZm9ybWF0aW9uIG91dCBvZiB0aGUgdXNlciBkYXRhYmFzZS4gCisgKi8KK3ZvaWQKK19kYnVzX3VzZXJfZGF0YWJhc2VfZmx1c2ggKERCdXNVc2VyRGF0YWJhc2UgKmRiKSAKK3sKKyAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfYWxsKGRiLT51c2Vyc19ieV9uYW1lKTsKKyAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfYWxsKGRiLT5ncm91cHNfYnlfbmFtZSk7CisgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX2FsbChkYi0+dXNlcnMpOworICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9hbGwoZGItPmdyb3Vwcyk7Cit9CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisvKioKKyAqIEluY3JlbWVudHMgcmVmY291bnQgb2YgdXNlciBkYXRhYmFzZS4KKyAqIEBwYXJhbSBkYiB0aGUgZGF0YWJhc2UKKyAqIEByZXR1cm5zIHRoZSBkYXRhYmFzZQorICovCitEQnVzVXNlckRhdGFiYXNlICoKK19kYnVzX3VzZXJfZGF0YWJhc2VfcmVmIChEQnVzVXNlckRhdGFiYXNlICAqZGIpCit7CisgIF9kYnVzX2Fzc2VydCAoZGItPnJlZmNvdW50ID4gMCk7CisKKyAgZGItPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIGRiOworfQorI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KKworLyoqCisgKiBEZWNyZW1lbnRzIHJlZmNvdW50IG9mIHVzZXIgZGF0YWJhc2UuCisgKiBAcGFyYW0gZGIgdGhlIGRhdGFiYXNlCisgKi8KK3ZvaWQKK19kYnVzX3VzZXJfZGF0YWJhc2VfdW5yZWYgKERCdXNVc2VyRGF0YWJhc2UgICpkYikKK3sKKyAgX2RidXNfYXNzZXJ0IChkYi0+cmVmY291bnQgPiAwKTsKKworICBkYi0+cmVmY291bnQgLT0gMTsKKyAgaWYgKGRiLT5yZWZjb3VudCA9PSAwKQorICAgIHsKKyAgICAgIGlmIChkYi0+dXNlcnMpCisgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKGRiLT51c2Vycyk7CisKKyAgICAgIGlmIChkYi0+Z3JvdXBzKQorICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChkYi0+Z3JvdXBzKTsKKworICAgICAgaWYgKGRiLT51c2Vyc19ieV9uYW1lKQorICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChkYi0+dXNlcnNfYnlfbmFtZSk7CisKKyAgICAgIGlmIChkYi0+Z3JvdXBzX2J5X25hbWUpCisgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKGRiLT5ncm91cHNfYnlfbmFtZSk7CisgICAgICAKKyAgICAgIGRidXNfZnJlZSAoZGIpOworICAgIH0KK30KKworLyoqCisgKiBHZXRzIHRoZSB1c2VyIGluZm9ybWF0aW9uIGZvciB0aGUgZ2l2ZW4gVUlELAorICogcmV0dXJuZWQgdXNlciBpbmZvIHNob3VsZCBub3QgYmUgZnJlZWQuIAorICoKKyAqIEBwYXJhbSBkYiB1c2VyIGRhdGFiYXNlCisgKiBAcGFyYW0gdWlkIHRoZSB1c2VyIElECisgKiBAcGFyYW0gaW5mbyByZXR1cm4gbG9jYXRpb24gZm9yIGNvbnN0IHJlZiB0byB1c2VyIGluZm8KKyAqIEBwYXJhbSBlcnJvciBlcnJvciBsb2NhdGlvbgorICogQHJldHVybnMgI0ZBTFNFIGlmIGVycm9yIGlzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfdWlkIChEQnVzVXNlckRhdGFiYXNlICAgICpkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aWRfdCAgICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzVXNlckluZm8gKippbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICplcnJvcikKK3sKKyAgKmluZm8gPSBfZGJ1c191c2VyX2RhdGFiYXNlX2xvb2t1cCAoZGIsIHVpZCwgTlVMTCwgZXJyb3IpOworICByZXR1cm4gKmluZm8gIT0gTlVMTDsKK30KKworLyoqCisgKiBHZXRzIHRoZSB1c2VyIGluZm9ybWF0aW9uIGZvciB0aGUgZ2l2ZW4gdXNlcm5hbWUuCisgKgorICogQHBhcmFtIGRiIHVzZXIgZGF0YWJhc2UKKyAqIEBwYXJhbSB1c2VybmFtZSB0aGUgdXNlciBuYW1lCisgKiBAcGFyYW0gaW5mbyByZXR1cm4gbG9jYXRpb24gZm9yIGNvbnN0IHJlZiB0byB1c2VyIGluZm8KKyAqIEBwYXJhbSBlcnJvciBlcnJvciBsb2NhdGlvbgorICogQHJldHVybnMgI0ZBTFNFIGlmIGVycm9yIGlzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfdXNlcm5hbWUgIChEQnVzVXNlckRhdGFiYXNlICAgICAqZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1VzZXJJbmZvICAqKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICplcnJvcikKK3sKKyAgKmluZm8gPSBfZGJ1c191c2VyX2RhdGFiYXNlX2xvb2t1cCAoZGIsIERCVVNfVUlEX1VOU0VULCB1c2VybmFtZSwgZXJyb3IpOworICByZXR1cm4gKmluZm8gIT0gTlVMTDsKK30KKworLyoqIEB9ICovCisKKy8qIFRlc3RzIGluIGRidXMtdXNlcmRiLXV0aWwuYyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtdXNlcmRiLmggYi9kYnVzL2RidXMvZGJ1cy11c2VyZGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjQ5ZDllCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtdXNlcmRiLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy11c2VyZGIuaCBVc2VyIGRhdGFiYXNlIGFic3RyYWN0aW9uCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfVVNFUkRCX0gKKyNkZWZpbmUgREJVU19VU0VSREJfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5oPgorCisjaWZkZWYgREJVU19XSU4KKyNlcnJvciAiRG9uJ3QgaW5jbHVkZSB0aGlzIG9uIFdpbmRvd3MiCisjZW5kaWYKKworREJVU19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBEQnVzVXNlckRhdGFiYXNlIERCdXNVc2VyRGF0YWJhc2U7CisKKyNpZmRlZiBEQlVTX1VTRVJEQl9JTkNMVURFU19QUklWQVRFCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWhhc2guaD4KKworLyoqCisgKiBJbnRlcm5hbHMgb2YgREJ1c1VzZXJEYXRhYmFzZQorICovCitzdHJ1Y3QgREJ1c1VzZXJEYXRhYmFzZQoreworICBpbnQgcmVmY291bnQ7IC8qKjwgUmVmZXJlbmNlIGNvdW50ICovCisKKyAgREJ1c0hhc2hUYWJsZSAqdXNlcnM7IC8qKjwgVXNlcnMgaW4gdGhlIGRhdGFiYXNlIGJ5IFVJRCAqLworICBEQnVzSGFzaFRhYmxlICpncm91cHM7IC8qKjwgR3JvdXBzIGluIHRoZSBkYXRhYmFzZSBieSBHSUQgKi8KKyAgREJ1c0hhc2hUYWJsZSAqdXNlcnNfYnlfbmFtZTsgLyoqPCBVc2VycyBpbiB0aGUgZGF0YWJhc2UgYnkgbmFtZSAqLworICBEQnVzSGFzaFRhYmxlICpncm91cHNfYnlfbmFtZTsgLyoqPCBHcm91cHMgaW4gdGhlIGRhdGFiYXNlIGJ5IG5hbWUgKi8KKworfTsKKworCitEQnVzVXNlckRhdGFiYXNlKiBfZGJ1c191c2VyX2RhdGFiYXNlX25ldyAgICAgICAgICAgKHZvaWQpOworREJ1c1VzZXJEYXRhYmFzZSogX2RidXNfdXNlcl9kYXRhYmFzZV9yZWYgICAgICAgICAgIChEQnVzVXNlckRhdGFiYXNlICAgICAqZGIpOwordm9pZCAgICAgICAgICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV9mbHVzaCAgICAgICAgIChEQnVzVXNlckRhdGFiYXNlICAgICAqZGIpOwordm9pZCAgICAgICAgICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bnJlZiAgICAgICAgIChEQnVzVXNlckRhdGFiYXNlICAgICAqZGIpOworZGJ1c19ib29sX3QgICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfdWlkICAgICAgIChEQnVzVXNlckRhdGFiYXNlICAgICAqZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWlkX3QgICAgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNVc2VySW5mbyAgKippbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfZ2lkICAgICAgIChEQnVzVXNlckRhdGFiYXNlICAgICAqZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICAgICAgICBnaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNHcm91cEluZm8gKippbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfdXNlcm5hbWUgIChEQnVzVXNlckRhdGFiYXNlICAgICAqZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1VzZXJJbmZvICAqKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX2dldF9ncm91cG5hbWUgKERCdXNVc2VyRGF0YWJhc2UgICAgICpkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgKmdyb3VwbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c0dyb3VwSW5mbyAqKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICplcnJvcik7CisKK0RCdXNVc2VySW5mbyogIF9kYnVzX3VzZXJfZGF0YWJhc2VfbG9va3VwICAgICAgIChEQnVzVXNlckRhdGFiYXNlICpkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworREJ1c0dyb3VwSW5mbyogX2RidXNfdXNlcl9kYXRhYmFzZV9sb29rdXBfZ3JvdXAgKERCdXNVc2VyRGF0YWJhc2UgKmRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICAgIGdpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpncm91cG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOwordm9pZCAgICAgICAgICAgX2RidXNfdXNlcl9pbmZvX2ZyZWVfYWxsb2NhdGVkICAgKERCdXNVc2VySW5mbyAgICAgKmluZm8pOwordm9pZCAgICAgICAgICAgX2RidXNfZ3JvdXBfaW5mb19mcmVlX2FsbG9jYXRlZCAgKERCdXNHcm91cEluZm8gICAgKmluZm8pOworI2VuZGlmIC8qIERCVVNfVVNFUkRCX0lOQ0xVREVTX1BSSVZBVEUgKi8KKworREJ1c1VzZXJEYXRhYmFzZSogX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfc3lzdGVtICAgICh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfbG9ja19zeXN0ZW0gICAodm9pZCk7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKHZvaWQpOwordm9pZCAgICAgICAgICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV9mbHVzaF9zeXN0ZW0gICh2b2lkKTsKKworZGJ1c19ib29sX3QgX2RidXNfZ2V0X3VzZXJfaWQgICAgICAgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICAqdWlkKTsKK2RidXNfYm9vbF90IF9kYnVzX2dldF9ncm91cF9pZCAgICAgICAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqZ3JvdXBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2dpZF90ICAgICAgICAqZ2lkKTsKK2RidXNfYm9vbF90IF9kYnVzX2dldF91c2VyX2lkX2FuZF9wcmltYXJ5X2dyb3VwIChjb25zdCBEQnVzU3RyaW5nICAqdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aWRfdCAgICAgICAgKnVpZF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICAgICpnaWRfcCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19jcmVkZW50aWFsc19mcm9tX3VpZCAgICAgICAgICAoZGJ1c191aWRfdCAgICAgICAgIHVzZXJfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICAgKmNyZWRlbnRpYWxzKTsKK2RidXNfYm9vbF90IF9kYnVzX2dyb3Vwc19mcm9tX3VpZAkJKGRidXNfdWlkX3QgICAgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAgICAqKmdyb3VwX2lkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAqbl9ncm91cF9pZHMpOworZGJ1c19ib29sX3QgX2RidXNfaXNfY29uc29sZV91c2VyICAgICAgICAgICAgICAgKGRidXNfdWlkX3QgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKKworZGJ1c19ib29sX3QgX2RidXNfaXNfYV9udW1iZXIgICAgICAgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAqbnVtKTsKKworZGJ1c19ib29sX3QgX2RidXNfdXNlcm5hbWVfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKGNvbnN0IERCdXNTdHJpbmcgKip1c2VybmFtZSk7CitkYnVzX2Jvb2xfdCBfZGJ1c19ob21lZGlyX2Zyb21fY3VycmVudF9wcm9jZXNzICAoY29uc3QgREJ1c1N0cmluZyAqKmhvbWVkaXIpOworZGJ1c19ib29sX3QgX2RidXNfaG9tZWRpcl9mcm9tX3VzZXJuYW1lICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAqaG9tZWRpcik7CisKK2RidXNfYm9vbF90IF9kYnVzX2hvbWVkaXJfZnJvbV91aWQgICAgICAgICAgICAgIChkYnVzX3VpZF90ICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICpob21lZGlyKTsKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfVVNFUkRCX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLXV1aWRnZW4uYyBiL2RidXMvZGJ1cy9kYnVzLXV1aWRnZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDdjMGFlCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtdXVpZGdlbi5jCkBAIC0wLDAgKzEsMTMwIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdXVpZGdlbi5jICBUaGUgZ3V0cyBvZiB0aGUgZGJ1cy11dWlkZ2VuIGJpbmFyeSBsaXZlIGluIGxpYmRidXMsIGluIHRoaXMgZmlsZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXV1aWRnZW4uaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorCisjaWZkZWYgREJVU19XSU4KKyNlcnJvciAiZGJ1cy11dWlkZ2VuIHNob3VsZCBub3QgYmUgbmVlZGVkIG9uIFdpbmRvd3MiCisjZW5kaWYKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0ludGVybmFsc1V1aWRnZW4gZGJ1cy11dWlkZ2VuIGltcGxlbWVudGF0aW9uCisgKiBAaW5ncm91cCBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgRnVuY3Rpb25zIGZvciBkYnVzLXV1aWRnZW4gYmluYXJ5CisgKgorICogVGhlc2UgYXJlIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIEFCSSwgYW5kIGlmIHlvdSBjYWxsIHRoZW0KKyAqIHlvdSB3aWxsIGdldCBzY3Jld2VkIGJ5IGZ1dHVyZSBjaGFuZ2VzLgorICogCisgKiBAeworICovCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcmV0dXJuX3V1aWQgKERCdXNHVUlEICAgKnV1aWQsCisgICAgICAgICAgICAgY2hhciAgICAgICoqdXVpZF9wLAorICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworICBpZiAodXVpZF9wKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgZW5jb2RlZDsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmVuY29kZWQpKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3V1aWRfZW5jb2RlICh1dWlkLCAmZW5jb2RlZCkgfHwKKyAgICAgICAgICAhX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgKCZlbmNvZGVkLCB1dWlkX3ApKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZW5jb2RlZCk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmVuY29kZWQpOworICAgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogRm9yIHVzZSBieSB0aGUgZGJ1cy11dWlkZ2VuIGJpbmFyeSBPTkxZLCBkbyBub3QgY2FsbCB0aGlzLgorICogV2UgY2FuIGFuZCB3aWxsIGNoYW5nZSB0aGlzIGZ1bmN0aW9uIHdpdGhvdXQgbW9kaWZ5aW5nCisgKiB0aGUgbGliZGJ1cyBzb25hbWUuCisgKgorICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlIG9yICNOVUxMIGZvciB0aGUgbWFjaGluZSBJRCBmaWxlCisgKiBAcGFyYW0gdXVpZF9wIG91dCBwYXJhbSB0byByZXR1cm4gdGhlIHV1aWQKKyAqIEBwYXJhbSBjcmVhdGVfaWZfbm90X2ZvdW5kIHdoZXRoZXIgdG8gY3JlYXRlIGl0IGlmIG5vdCBhbHJlYWR5IHRoZXJlCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgZXJyb3IgaXMgc2V0CisgKi8KK2RidXNfYm9vbF90CitkYnVzX2ludGVybmFsX2RvX25vdF91c2VfZ2V0X3V1aWQgKGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgKip1dWlkX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90IGNyZWF0ZV9pZl9ub3RfZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworICBEQnVzR1VJRCB1dWlkOworICAKKyAgaWYgKGZpbGVuYW1lKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgZmlsZW5hbWVfc3RyOworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZmaWxlbmFtZV9zdHIsIGZpbGVuYW1lKTsKKyAgICAgIGlmICghX2RidXNfcmVhZF91dWlkX2ZpbGUgKCZmaWxlbmFtZV9zdHIsICZ1dWlkLCBjcmVhdGVfaWZfbm90X2ZvdW5kLCBlcnJvcikpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFfZGJ1c19yZWFkX2xvY2FsX21hY2hpbmVfdXVpZCAoJnV1aWQsIGNyZWF0ZV9pZl9ub3RfZm91bmQsIGVycm9yKSkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgaWYgKCFyZXR1cm5fdXVpZCgmdXVpZCwgdXVpZF9wLCBlcnJvcikpCisgICAgZ290byBlcnJvcjsKKworICByZXR1cm4gVFJVRTsKKyAgCisgZXJyb3I6CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEZvciB1c2UgYnkgdGhlIGRidXMtdXVpZGdlbiBiaW5hcnkgT05MWSwgZG8gbm90IGNhbGwgdGhpcy4KKyAqIFdlIGNhbiBhbmQgd2lsbCBjaGFuZ2UgdGhpcyBmdW5jdGlvbiB3aXRob3V0IG1vZGlmeWluZworICogdGhlIGxpYmRidXMgc29uYW1lLgorICoKKyAqIEBwYXJhbSB1dWlkX3Agb3V0IHBhcmFtIHRvIHJldHVybiB0aGUgdXVpZAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX2NyZWF0ZV91dWlkIChjaGFyICAgICAgKip1dWlkX3ApCit7CisgIERCdXNHVUlEIHV1aWQ7CisKKyAgX2RidXNfZ2VuZXJhdGVfdXVpZCAoJnV1aWQpOworICByZXR1cm4gcmV0dXJuX3V1aWQgKCZ1dWlkLCB1dWlkX3AsIE5VTEwpOworfQorCisvKiogQH0gKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLXV1aWRnZW4uaCBiL2RidXMvZGJ1cy9kYnVzLXV1aWRnZW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzFiODU5Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtdXVpZGdlbi5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy11dWlkZ2VuLmggIFRoZSBndXRzIG9mIHRoZSBkYnVzLXV1aWRnZW4gYmluYXJ5IGxpdmUgaW4gbGliZGJ1cywgaW4gdGhpcyBmaWxlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmZGVmIERCVVNfSU5TSURFX0RCVVNfSAorI2Vycm9yICJZb3UgY2FuJ3QgaW5jbHVkZSBkYnVzLXV1aWRnZW4uaCBpbiB0aGUgcHVibGljIGhlYWRlciBkYnVzLmgiCisjZW5kaWYKKworI2lmbmRlZiBEQlVTX1VVSURHRU5fSAorI2RlZmluZSBEQlVTX1VVSURHRU5fSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXR5cGVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK2RidXNfYm9vbF90IGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9nZXRfdXVpZCAgICAoY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAqKnV1aWRfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgY3JlYXRlX2lmX25vdF9mb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpOworZGJ1c19ib29sX3QgZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX2Vuc3VyZV91dWlkIChjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqdXVpZF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcik7CitkYnVzX2Jvb2xfdCBkYnVzX2ludGVybmFsX2RvX25vdF91c2VfY3JlYXRlX3V1aWQgKGNoYXIgICAgICAqKnV1aWRfcCk7CisKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfVVVJREdFTl9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMvZGJ1cy12YWxncmluZC1pbnRlcm5hbC5oIGIvZGJ1cy9kYnVzL2RidXMtdmFsZ3JpbmQtaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTU2NmVjCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL2RidXMtdmFsZ3JpbmQtaW50ZXJuYWwuaApAQCAtMCwwICsxLDY3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdmFsZ3JpbmQtaW50ZXJuYWwuaCAtIHZhbGdyaW5kIGdsdWUKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX1ZBTEdSSU5EX0lOVEVSTkFMX0gKKyNkZWZpbmUgREJVU19WQUxHUklORF9JTlRFUk5BTF9ICisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorCisjaWZkZWYgV0lUSF9WQUxHUklORAorIyAgIGluY2x1ZGUgPG1lbWNoZWNrLmg+CisjICAgaW5jbHVkZSA8dmFsZ3JpbmQuaD4KKyNlbHNlCisjICAgZGVmaW5lIFZBTEdSSU5EX0NSRUFURV9NRU1QT09MKF8xLCBfMiwgXzMpIC8qIG5vdGhpbmcgKi8KKyMgICBkZWZpbmUgVkFMR1JJTkRfREVTVFJPWV9NRU1QT09MKF8xKSAvKiBub3RoaW5nICovCisjICAgZGVmaW5lIFZBTEdSSU5EX01FTVBPT0xfQUxMT0MoXzEsIF8yLCBfMykgLyogbm90aGluZyAqLworIyAgIGRlZmluZSBWQUxHUklORF9NRU1QT09MX0ZSRUUoXzEsIF8yKSAvKiBub3RoaW5nICovCisKKy8qIFJlY2VudCBnY2Mgd2lsbCB3YXJuIGlmIHlvdSBoYXZlIGEgc3RhdGVtZW50IHRoYXQncyBqdXN0IGEgbWFjcm8KKyAqIGV4cGFuZGluZyB0byAoMCksIGJ1dCBub3QgaWYgeW91IGhhdmUgYW4gaW5saW5lIHN0dWIgZnVuY3Rpb24gdGhhdAorICogYWx3YXlzIHJldHVybnMgMCwgc28gbGV0J3MgZG8gdGhlIGxhdHRlci4gKi8KK3N0YXRpYyBpbmxpbmUgaW50CitWQUxHUklORF9NQUtFX01FTV9VTkRFRklORUQgKHZvaWQgICAqYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICBsZW4pCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorVkFMR1JJTkRfUFJJTlRGIChjb25zdCBjaGFyICpmb3JtYXQsCisgICAgICAgICAgICAgICAgIC4uLikKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitWQUxHUklORF9QUklOVEZfQkFDS1RSQUNFIChjb25zdCBjaGFyICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pCit7CisgIHJldHVybiAwOworfQorCisjICAgZGVmaW5lIFJVTk5JTkdfT05fVkFMR1JJTkQgMAorI2VuZGlmIC8qIFdJVEhfVkFMR1JJTkQgKi8KKworI2VuZGlmIC8qIGhlYWRlciBndWFyZCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMtd2F0Y2guYyBiL2RidXMvZGJ1cy9kYnVzLXdhdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlmNGFjMgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLXdhdGNoLmMKQEAgLTAsMCArMSw3MDUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy13YXRjaC5jIERCdXNXYXRjaCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtd2F0Y2guaCIKKyNpbmNsdWRlICJkYnVzLWxpc3QuaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1dhdGNoSW50ZXJuYWxzIERCdXNXYXRjaCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIGltcGxlbWVudGF0aW9uIGRldGFpbHMgZm9yIERCdXNXYXRjaAorICogCisgKiBAeworICovCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgREJ1c1dhdGNoCisgKi8KK3N0cnVjdCBEQnVzV2F0Y2gKK3sKKyAgaW50IHJlZmNvdW50OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVmZXJlbmNlIGNvdW50ICovCisgIGludCBmZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEZpbGUgZGVzY3JpcHRvci4gKi8KKyAgdW5zaWduZWQgaW50IGZsYWdzOyAgICAgICAgICAgICAgICAgIC8qKjwgQ29uZGl0aW9ucyB0byB3YXRjaC4gKi8KKworICBEQnVzV2F0Y2hIYW5kbGVyIGhhbmRsZXI7ICAgICAgICAgICAgICAgICAgICAvKio8IFdhdGNoIGhhbmRsZXIuICovCisgIHZvaWQgKmhhbmRsZXJfZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2F0Y2ggaGFuZGxlciBkYXRhLiAqLworICBEQnVzRnJlZUZ1bmN0aW9uIGZyZWVfaGFuZGxlcl9kYXRhX2Z1bmN0aW9uOyAvKio8IEZyZWUgdGhlIHdhdGNoIGhhbmRsZXIgZGF0YS4gKi8KKyAgCisgIHZvaWQgKmRhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEFwcGxpY2F0aW9uIGRhdGEuICovCisgIERCdXNGcmVlRnVuY3Rpb24gZnJlZV9kYXRhX2Z1bmN0aW9uOyAvKio8IEZyZWUgdGhlIGFwcGxpY2F0aW9uIGRhdGEuICovCisgIHVuc2lnbmVkIGludCBlbmFibGVkIDogMTsgICAgICAgICAgICAvKio8IFdoZXRoZXIgaXQncyBlbmFibGVkLiAqLworICB1bnNpZ25lZCBpbnQgb29tX2xhc3RfdGltZSA6IDE7ICAgICAgLyoqPCBXaGV0aGVyIGl0IHdhcyBPT00gbGFzdCB0aW1lLiAqLworfTsKKworZGJ1c19ib29sX3QKK19kYnVzX3dhdGNoX2dldF9lbmFibGVkIChEQnVzV2F0Y2ggKndhdGNoKQoreworICByZXR1cm4gd2F0Y2gtPmVuYWJsZWQ7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c193YXRjaF9nZXRfb29tX2xhc3RfdGltZSAoREJ1c1dhdGNoICp3YXRjaCkKK3sKKyAgcmV0dXJuIHdhdGNoLT5vb21fbGFzdF90aW1lOworfQorCit2b2lkCitfZGJ1c193YXRjaF9zZXRfb29tX2xhc3RfdGltZSAoREJ1c1dhdGNoICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICBvb20pCit7CisgIHdhdGNoLT5vb21fbGFzdF90aW1lID0gb29tOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgREJ1c1dhdGNoLiBVc2VkIHRvIGFkZCBhIGZpbGUgZGVzY3JpcHRvciB0byBiZSBwb2xsZWQKKyAqIGJ5IGEgbWFpbiBsb29wLgorICogCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvciB0byBiZSB3YXRjaGVkLgorICogQHBhcmFtIGZsYWdzIHRoZSBjb25kaXRpb25zIHRvIHdhdGNoIGZvciBvbiB0aGUgZGVzY3JpcHRvci4KKyAqIEBwYXJhbSBlbmFibGVkIHRoZSBpbml0aWFsIGVuYWJsZWQgc3RhdGUKKyAqIEBwYXJhbSBoYW5kbGVyIHRoZSBoYW5kbGVyIGZ1bmN0aW9uCisgKiBAcGFyYW0gZGF0YSBkYXRhIGZvciBoYW5kbGVyIGZ1bmN0aW9uCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGZyZWUgdGhlIGRhdGEKKyAqIEByZXR1cm5zIHRoZSBuZXcgREJ1c1dhdGNoIG9iamVjdC4KKyAqLworREJ1c1dhdGNoKgorX2RidXNfd2F0Y2hfbmV3IChpbnQgICAgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGVuYWJsZWQsCisgICAgICAgICAgICAgICAgIERCdXNXYXRjaEhhbmRsZXIgIGhhbmRsZXIsCisgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgREJ1c1dhdGNoICp3YXRjaDsKKworI2RlZmluZSBWQUxJRF9XQVRDSF9GTEFHUyAoREJVU19XQVRDSF9XUklUQUJMRSB8IERCVVNfV0FUQ0hfUkVBREFCTEUpCisgIAorICBfZGJ1c19hc3NlcnQgKChmbGFncyAmIFZBTElEX1dBVENIX0ZMQUdTKSA9PSBmbGFncyk7CisgIAorICB3YXRjaCA9IGRidXNfbmV3MCAoREJ1c1dhdGNoLCAxKTsKKyAgaWYgKHdhdGNoID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICB3YXRjaC0+cmVmY291bnQgPSAxOworICB3YXRjaC0+ZmQgPSBmZDsKKyAgd2F0Y2gtPmZsYWdzID0gZmxhZ3M7CisgIHdhdGNoLT5lbmFibGVkID0gZW5hYmxlZDsKKworICB3YXRjaC0+aGFuZGxlciA9IGhhbmRsZXI7CisgIHdhdGNoLT5oYW5kbGVyX2RhdGEgPSBkYXRhOworICB3YXRjaC0+ZnJlZV9oYW5kbGVyX2RhdGFfZnVuY3Rpb24gPSBmcmVlX2RhdGFfZnVuY3Rpb247CisgIAorICByZXR1cm4gd2F0Y2g7Cit9CisKKy8qKgorICogSW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGEgREJ1c1dhdGNoIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gd2F0Y2ggdGhlIHdhdGNoIG9iamVjdC4KKyAqIEByZXR1cm5zIHRoZSB3YXRjaCBvYmplY3QuCisgKi8KK0RCdXNXYXRjaCAqCitfZGJ1c193YXRjaF9yZWYgKERCdXNXYXRjaCAqd2F0Y2gpCit7CisgIHdhdGNoLT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiB3YXRjaDsKK30KKworLyoqCisgKiBEZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgYSBEQnVzV2F0Y2ggb2JqZWN0CisgKiBhbmQgZmluYWxpemVzIHRoZSBvYmplY3QgaWYgdGhlIGNvdW50IHJlYWNoZXMgemVyby4KKyAqCisgKiBAcGFyYW0gd2F0Y2ggdGhlIHdhdGNoIG9iamVjdC4KKyAqLwordm9pZAorX2RidXNfd2F0Y2hfdW5yZWYgKERCdXNXYXRjaCAqd2F0Y2gpCit7CisgIF9kYnVzX2Fzc2VydCAod2F0Y2ggIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAod2F0Y2gtPnJlZmNvdW50ID4gMCk7CisKKyAgd2F0Y2gtPnJlZmNvdW50IC09IDE7CisgIGlmICh3YXRjaC0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBpZiAod2F0Y2gtPmZkICE9IC0xKQorICAgICAgICBfZGJ1c193YXJuICgidGhpcyB3YXRjaCBzaG91bGQgaGF2ZSBiZWVuIGludmFsaWRhdGVkIik7CisKKyAgICAgIGRidXNfd2F0Y2hfc2V0X2RhdGEgKHdhdGNoLCBOVUxMLCBOVUxMKTsgLyogY2FsbCBmcmVlX2RhdGFfZnVuY3Rpb24gKi8KKworICAgICAgaWYgKHdhdGNoLT5mcmVlX2hhbmRsZXJfZGF0YV9mdW5jdGlvbikKKwkoKiB3YXRjaC0+ZnJlZV9oYW5kbGVyX2RhdGFfZnVuY3Rpb24pICh3YXRjaC0+aGFuZGxlcl9kYXRhKTsKKyAgICAgIAorICAgICAgZGJ1c19mcmVlICh3YXRjaCk7CisgICAgfQorfQorCisvKioKKyAqIENsZWFycyB0aGUgZmlsZSBkZXNjcmlwdG9yIGZyb20gYSBub3ctaW52YWxpZCB3YXRjaCBvYmplY3Qgc28gdGhhdAorICogbm8gb25lIHRyaWVzIHRvIHVzZSBpdC4gIFRoaXMgaXMgYmVjYXVzZSBhIHdhdGNoIG1heSBzdGF5IGFsaXZlIGR1ZQorICogdG8gcmVmZXJlbmNlIGNvdW50cyBhZnRlciB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzIGNsb3NlZC4KKyAqIEludmFsaWRhdGlvbiBtYWtlcyBpdCBlYXNpZXIgdG8gY2F0Y2ggYnVncy4gSXQgYWxzbworICoga2VlcHMgcGVvcGxlIGZyb20gZG9pbmcgZG9ya3kgdGhpbmdzIGxpa2UgYXNzdW1pbmcgZmlsZSBkZXNjcmlwdG9ycworICogYXJlIHVuaXF1ZSAobmV2ZXIgcmVjeWNsZWQpLgorICoKKyAqIEBwYXJhbSB3YXRjaCB0aGUgd2F0Y2ggb2JqZWN0LgorICovCit2b2lkCitfZGJ1c193YXRjaF9pbnZhbGlkYXRlIChEQnVzV2F0Y2ggKndhdGNoKQoreworICB3YXRjaC0+ZmQgPSAtMTsKKyAgd2F0Y2gtPmZsYWdzID0gMDsKK30KKworLyoqCisgKiBTYW5pdGl6ZXMgdGhlIGdpdmVuIGNvbmRpdGlvbiBzbyB0aGF0IGl0IG9ubHkgY29udGFpbnMKKyAqIGZsYWdzIHRoYXQgdGhlIERCdXNXYXRjaCByZXF1ZXN0ZWQuIGUuZy4gaWYgdGhlCisgKiB3YXRjaCBpcyBhIERCVVNfV0FUQ0hfUkVBREFCTEUgd2F0Y2ggdGhlbgorICogREJVU19XQVRDSF9XUklUQUJMRSB3aWxsIGJlIHN0cmlwcGVkIGZyb20gdGhlIGNvbmRpdGlvbi4KKyAqCisgKiBAcGFyYW0gd2F0Y2ggdGhlIHdhdGNoIG9iamVjdC4KKyAqIEBwYXJhbSBjb25kaXRpb24gYWRkcmVzcyBvZiB0aGUgY29uZGl0aW9uIHRvIHNhbml0aXplLgorICovCit2b2lkCitfZGJ1c193YXRjaF9zYW5pdGl6ZV9jb25kaXRpb24gKERCdXNXYXRjaCAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqY29uZGl0aW9uKQoreworICBpZiAoISh3YXRjaC0+ZmxhZ3MgJiBEQlVTX1dBVENIX1JFQURBQkxFKSkKKyAgICAqY29uZGl0aW9uICY9IH5EQlVTX1dBVENIX1JFQURBQkxFOworICBpZiAoISh3YXRjaC0+ZmxhZ3MgJiBEQlVTX1dBVENIX1dSSVRBQkxFKSkKKyAgICAqY29uZGl0aW9uICY9IH5EQlVTX1dBVENIX1dSSVRBQkxFOworfQorCisKKy8qKgorICogQHR5cGVkZWYgREJ1c1dhdGNoTGlzdAorICoKKyAqIE9wYXF1ZSBkYXRhIHR5cGUgcmVwcmVzZW50aW5nIGEgbGlzdCBvZiB3YXRjaGVzCisgKiBhbmQgYSBzZXQgb2YgREJ1c0FkZFdhdGNoRnVuY3Rpb24vREJ1c1JlbW92ZVdhdGNoRnVuY3Rpb24uCisgKiBBdXRvbWF0aWNhbGx5IGhhbmRsZXMgcmVtb3ZpbmcvcmUtYWRkaW5nIHdhdGNoZXMKKyAqIHdoZW4gdGhlIERCdXNBZGRXYXRjaEZ1bmN0aW9uIGlzIHVwZGF0ZWQgb3IgY2hhbmdlZC4KKyAqIEhvbGRzIGEgcmVmZXJlbmNlIGNvdW50IHRvIGVhY2ggd2F0Y2guCisgKgorICogVXNlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgYm90aCBEQnVzU2VydmVyIGFuZAorICogREJ1c0NsaWVudC4KKyAqCisgKi8KKworLyoqCisgKiBEQnVzV2F0Y2hMaXN0IGltcGxlbWVudGF0aW9uIGRldGFpbHMuIEFsbCBmaWVsZHMKKyAqIGFyZSBwcml2YXRlLgorICoKKyAqLworc3RydWN0IERCdXNXYXRjaExpc3QKK3sKKyAgREJ1c0xpc3QgKndhdGNoZXM7ICAgICAgICAgICAvKio8IFdhdGNoIG9iamVjdHMuICovCisKKyAgREJ1c0FkZFdhdGNoRnVuY3Rpb24gYWRkX3dhdGNoX2Z1bmN0aW9uOyAgICAvKio8IENhbGxiYWNrIGZvciBhZGRpbmcgYSB3YXRjaC4gKi8KKyAgREJ1c1JlbW92ZVdhdGNoRnVuY3Rpb24gcmVtb3ZlX3dhdGNoX2Z1bmN0aW9uOyAvKio8IENhbGxiYWNrIGZvciByZW1vdmluZyBhIHdhdGNoLiAqLworICBEQnVzV2F0Y2hUb2dnbGVkRnVuY3Rpb24gd2F0Y2hfdG9nZ2xlZF9mdW5jdGlvbjsgLyoqPCBDYWxsYmFjayBvbiB0b2dnbGluZyBlbmFibGVtZW50ICovCisgIHZvaWQgKndhdGNoX2RhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEYXRhIGZvciB3YXRjaCBjYWxsYmFja3MgKi8KKyAgREJ1c0ZyZWVGdW5jdGlvbiB3YXRjaF9mcmVlX2RhdGFfZnVuY3Rpb247ICAvKio8IEZyZWUgZnVuY3Rpb24gZm9yIHdhdGNoIGNhbGxiYWNrIGRhdGEgKi8KK307CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyB3YXRjaCBsaXN0LiBSZXR1cm5zICNOVUxMIGlmIGluc3VmZmljaWVudAorICogbWVtb3J5IGV4aXN0cy4KKyAqCisgKiBAcmV0dXJucyB0aGUgbmV3IHdhdGNoIGxpc3QsIG9yICNOVUxMIG9uIGZhaWx1cmUuCisgKi8KK0RCdXNXYXRjaExpc3QqCitfZGJ1c193YXRjaF9saXN0X25ldyAodm9pZCkKK3sKKyAgREJ1c1dhdGNoTGlzdCAqd2F0Y2hfbGlzdDsKKworICB3YXRjaF9saXN0ID0gZGJ1c19uZXcwIChEQnVzV2F0Y2hMaXN0LCAxKTsKKyAgaWYgKHdhdGNoX2xpc3QgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR1cm4gd2F0Y2hfbGlzdDsKK30KKworLyoqCisgKiBGcmVlcyBhIERCdXNXYXRjaExpc3QuCisgKgorICogQHBhcmFtIHdhdGNoX2xpc3QgdGhlIHdhdGNoIGxpc3QuCisgKi8KK3ZvaWQKK19kYnVzX3dhdGNoX2xpc3RfZnJlZSAoREJ1c1dhdGNoTGlzdCAqd2F0Y2hfbGlzdCkKK3sKKyAgLyogZnJlZSB3YXRjaF9kYXRhIGFuZCByZW1vdmVzIHdhdGNoZXMgYXMgYSBzaWRlIGVmZmVjdCAqLworICBfZGJ1c193YXRjaF9saXN0X3NldF9mdW5jdGlvbnMgKHdhdGNoX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJndhdGNoX2xpc3QtPndhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgKERCdXNGb3JlYWNoRnVuY3Rpb24pIF9kYnVzX3dhdGNoX3VucmVmLAorICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBfZGJ1c19saXN0X2NsZWFyICgmd2F0Y2hfbGlzdC0+d2F0Y2hlcyk7CisKKyAgZGJ1c19mcmVlICh3YXRjaF9saXN0KTsKK30KKworLyoqCisgKiBTZXRzIHRoZSB3YXRjaCBmdW5jdGlvbnMuIFRoaXMgZnVuY3Rpb24gaXMgdGhlICJiYWNrZW5kIgorICogZm9yIGRidXNfY29ubmVjdGlvbl9zZXRfd2F0Y2hfZnVuY3Rpb25zKCkgYW5kCisgKiBkYnVzX3NlcnZlcl9zZXRfd2F0Y2hfZnVuY3Rpb25zKCkuCisgKgorICogQHBhcmFtIHdhdGNoX2xpc3QgdGhlIHdhdGNoIGxpc3QuCisgKiBAcGFyYW0gYWRkX2Z1bmN0aW9uIHRoZSBhZGQgd2F0Y2ggZnVuY3Rpb24uCisgKiBAcGFyYW0gcmVtb3ZlX2Z1bmN0aW9uIHRoZSByZW1vdmUgd2F0Y2ggZnVuY3Rpb24uCisgKiBAcGFyYW0gdG9nZ2xlZF9mdW5jdGlvbiBmdW5jdGlvbiBvbiB0b2dnbGluZyBlbmFibGVkIGZsYWcsIG9yICNOVUxMCisgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSBmb3IgdGhvc2UgZnVuY3Rpb25zLgorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jdGlvbiB0aGUgZnVuY3Rpb24gdG8gZnJlZSB0aGUgZGF0YS4KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICoKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3dhdGNoX2xpc3Rfc2V0X2Z1bmN0aW9ucyAoREJ1c1dhdGNoTGlzdCAgICAgICAgICAgKndhdGNoX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBZGRXYXRjaEZ1bmN0aW9uICAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNSZW1vdmVXYXRjaEZ1bmN0aW9uICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaFRvZ2dsZWRGdW5jdGlvbiB0b2dnbGVkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgLyogQWRkIHdhdGNoZXMgd2l0aCB0aGUgbmV3IHdhdGNoIGZ1bmN0aW9uLCBmYWlsaW5nIG9uIE9PTSAqLworICBpZiAoYWRkX2Z1bmN0aW9uICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0xpc3QgKmxpbms7CisgICAgICAKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmd2F0Y2hfbGlzdC0+d2F0Y2hlcyk7CisgICAgICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZ3YXRjaF9saXN0LT53YXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rKTsKKworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKndhdGNoX3R5cGU7CisgICAgICAgICAgICBpbnQgZmxhZ3M7CisKKyAgICAgICAgICAgIGZsYWdzID0gZGJ1c193YXRjaF9nZXRfZmxhZ3MgKGxpbmstPmRhdGEpOworICAgICAgICAgICAgaWYgKChmbGFncyAmIERCVVNfV0FUQ0hfUkVBREFCTEUpICYmCisgICAgICAgICAgICAgICAgKGZsYWdzICYgREJVU19XQVRDSF9XUklUQUJMRSkpCisgICAgICAgICAgICAgIHdhdGNoX3R5cGUgPSAicmVhZHdyaXRlIjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZsYWdzICYgREJVU19XQVRDSF9SRUFEQUJMRSkKKyAgICAgICAgICAgICAgd2F0Y2hfdHlwZSA9ICJyZWFkIjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZsYWdzICYgREJVU19XQVRDSF9XUklUQUJMRSkKKyAgICAgICAgICAgICAgd2F0Y2hfdHlwZSA9ICJ3cml0ZSI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHdhdGNoX3R5cGUgPSAibm90IHJlYWQgb3Igd3JpdGUiOworICAgICAgICAgICAgCisgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiQWRkaW5nIGEgJXMgd2F0Y2ggb24gZmQgJWQgdXNpbmcgbmV3bHktc2V0IGFkZCB3YXRjaCBmdW5jdGlvblxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3dhdGNoX2dldF9zb2NrZXQgKGxpbmstPmRhdGEpKTsKKyAgICAgICAgICB9CisjZW5kaWYgLyogREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFICovCisgICAgICAgICAgCisgICAgICAgICAgaWYgKCEoKiBhZGRfZnVuY3Rpb24pIChsaW5rLT5kYXRhLCBkYXRhKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogcmVtb3ZlIGl0IGFsbCBhZ2FpbiBhbmQgcmV0dXJuIEZBTFNFICovCisgICAgICAgICAgICAgIERCdXNMaXN0ICpsaW5rMjsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGxpbmsyID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJndhdGNoX2xpc3QtPndhdGNoZXMpOworICAgICAgICAgICAgICB3aGlsZSAobGluazIgIT0gbGluaykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJndhdGNoX2xpc3QtPndhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluazIpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiUmVtb3Zpbmcgd2F0Y2ggb24gZmQgJWQgdXNpbmcgbmV3bHktc2V0IHJlbW92ZSBmdW5jdGlvbiBiZWNhdXNlIGluaXRpYWwgYWRkIGZhaWxlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfd2F0Y2hfZ2V0X3NvY2tldCAobGluazItPmRhdGEpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgKCogcmVtb3ZlX2Z1bmN0aW9uKSAobGluazItPmRhdGEsIGRhdGEpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBsaW5rMiA9IG5leHQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgIAorICAgICAgICAgIGxpbmsgPSBuZXh0OworICAgICAgICB9CisgICAgfQorICAKKyAgLyogUmVtb3ZlIGFsbCBjdXJyZW50IHdhdGNoZXMgZnJvbSBwcmV2aW91cyB3YXRjaCBoYW5kbGVycyAqLworCisgIGlmICh3YXRjaF9saXN0LT5yZW1vdmVfd2F0Y2hfZnVuY3Rpb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiUmVtb3ZpbmcgYWxsIHByZS1leGlzdGluZyB3YXRjaGVzXG4iKTsKKyAgICAgIAorICAgICAgX2RidXNfbGlzdF9mb3JlYWNoICgmd2F0Y2hfbGlzdC0+d2F0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNGb3JlYWNoRnVuY3Rpb24pIHdhdGNoX2xpc3QtPnJlbW92ZV93YXRjaF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hfbGlzdC0+d2F0Y2hfZGF0YSk7CisgICAgfQorCisgIGlmICh3YXRjaF9saXN0LT53YXRjaF9mcmVlX2RhdGFfZnVuY3Rpb24gIT0gTlVMTCkKKyAgICAoKiB3YXRjaF9saXN0LT53YXRjaF9mcmVlX2RhdGFfZnVuY3Rpb24pICh3YXRjaF9saXN0LT53YXRjaF9kYXRhKTsKKyAgCisgIHdhdGNoX2xpc3QtPmFkZF93YXRjaF9mdW5jdGlvbiA9IGFkZF9mdW5jdGlvbjsKKyAgd2F0Y2hfbGlzdC0+cmVtb3ZlX3dhdGNoX2Z1bmN0aW9uID0gcmVtb3ZlX2Z1bmN0aW9uOworICB3YXRjaF9saXN0LT53YXRjaF90b2dnbGVkX2Z1bmN0aW9uID0gdG9nZ2xlZF9mdW5jdGlvbjsKKyAgd2F0Y2hfbGlzdC0+d2F0Y2hfZGF0YSA9IGRhdGE7CisgIHdhdGNoX2xpc3QtPndhdGNoX2ZyZWVfZGF0YV9mdW5jdGlvbiA9IGZyZWVfZGF0YV9mdW5jdGlvbjsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBBZGRzIGEgbmV3IHdhdGNoIHRvIHRoZSB3YXRjaCBsaXN0LCBpbnZva2luZyB0aGUKKyAqIGFwcGxpY2F0aW9uIERCdXNBZGRXYXRjaEZ1bmN0aW9uIGlmIGFwcHJvcHJpYXRlLgorICoKKyAqIEBwYXJhbSB3YXRjaF9saXN0IHRoZSB3YXRjaCBsaXN0LgorICogQHBhcmFtIHdhdGNoIHRoZSB3YXRjaCB0byBhZGQuCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0UgaWYgbm8gbWVtb3J5LgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfd2F0Y2hfbGlzdF9hZGRfd2F0Y2ggKERCdXNXYXRjaExpc3QgKndhdGNoX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAqd2F0Y2gpCit7CisgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZ3YXRjaF9saXN0LT53YXRjaGVzLCB3YXRjaCkpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgX2RidXNfd2F0Y2hfcmVmICh3YXRjaCk7CisKKyAgaWYgKHdhdGNoX2xpc3QtPmFkZF93YXRjaF9mdW5jdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJBZGRpbmcgd2F0Y2ggb24gZmQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBkYnVzX3dhdGNoX2dldF9zb2NrZXQgKHdhdGNoKSk7CisgICAgICAKKyAgICAgIGlmICghKCogd2F0Y2hfbGlzdC0+YWRkX3dhdGNoX2Z1bmN0aW9uKSAod2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoX2xpc3QtPndhdGNoX2RhdGEpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGFzdCAoJndhdGNoX2xpc3QtPndhdGNoZXMsIHdhdGNoKTsKKyAgICAgICAgICBfZGJ1c193YXRjaF91bnJlZiAod2F0Y2gpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFJlbW92ZXMgYSB3YXRjaCBmcm9tIHRoZSB3YXRjaCBsaXN0LCBpbnZva2luZyB0aGUKKyAqIGFwcGxpY2F0aW9uJ3MgREJ1c1JlbW92ZVdhdGNoRnVuY3Rpb24gaWYgYXBwcm9wcmlhdGUuCisgKgorICogQHBhcmFtIHdhdGNoX2xpc3QgdGhlIHdhdGNoIGxpc3QuCisgKiBAcGFyYW0gd2F0Y2ggdGhlIHdhdGNoIHRvIHJlbW92ZS4KKyAqLwordm9pZAorX2RidXNfd2F0Y2hfbGlzdF9yZW1vdmVfd2F0Y2ggIChEQnVzV2F0Y2hMaXN0ICp3YXRjaF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICp3YXRjaCkKK3sKKyAgaWYgKCFfZGJ1c19saXN0X3JlbW92ZSAoJndhdGNoX2xpc3QtPndhdGNoZXMsIHdhdGNoKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJOb25leGlzdGVudCB3YXRjaCB3YXMgcmVtb3ZlZCIpOworICAKKyAgaWYgKHdhdGNoX2xpc3QtPnJlbW92ZV93YXRjaF9mdW5jdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJSZW1vdmluZyB3YXRjaCBvbiBmZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGRidXNfd2F0Y2hfZ2V0X3NvY2tldCAod2F0Y2gpKTsKKyAgICAgIAorICAgICAgKCogd2F0Y2hfbGlzdC0+cmVtb3ZlX3dhdGNoX2Z1bmN0aW9uKSAod2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRjaF9saXN0LT53YXRjaF9kYXRhKTsKKyAgICB9CisgIAorICBfZGJ1c193YXRjaF91bnJlZiAod2F0Y2gpOworfQorCisvKioKKyAqIFNldHMgYSB3YXRjaCB0byB0aGUgZ2l2ZW4gZW5hYmxlZCBzdGF0ZSwgaW52b2tpbmcgdGhlCisgKiBhcHBsaWNhdGlvbidzIERCdXNXYXRjaFRvZ2dsZWRGdW5jdGlvbiBpZiBhcHByb3ByaWF0ZS4KKyAqCisgKiBAcGFyYW0gd2F0Y2hfbGlzdCB0aGUgd2F0Y2ggbGlzdC4KKyAqIEBwYXJhbSB3YXRjaCB0aGUgd2F0Y2ggdG8gdG9nZ2xlLgorICogQHBhcmFtIGVuYWJsZWQgI1RSVUUgdG8gZW5hYmxlCisgKi8KK3ZvaWQKK19kYnVzX3dhdGNoX2xpc3RfdG9nZ2xlX3dhdGNoIChEQnVzV2F0Y2hMaXN0ICAgICAgICAgICAqd2F0Y2hfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICAgICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgIGVuYWJsZWQpCit7CisgIGVuYWJsZWQgPSAhIWVuYWJsZWQ7CisgIAorICBpZiAoZW5hYmxlZCA9PSB3YXRjaC0+ZW5hYmxlZCkKKyAgICByZXR1cm47CisKKyAgd2F0Y2gtPmVuYWJsZWQgPSBlbmFibGVkOworICAKKyAgaWYgKHdhdGNoX2xpc3QtPndhdGNoX3RvZ2dsZWRfZnVuY3Rpb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiVG9nZ2xpbmcgd2F0Y2ggJXAgb24gZmQgJWQgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICB3YXRjaCwgZGJ1c193YXRjaF9nZXRfc29ja2V0ICh3YXRjaCksIHdhdGNoLT5lbmFibGVkKTsKKyAgICAgIAorICAgICAgKCogd2F0Y2hfbGlzdC0+d2F0Y2hfdG9nZ2xlZF9mdW5jdGlvbikgKHdhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoX2xpc3QtPndhdGNoX2RhdGEpOworICAgIH0KK30KKworLyoqCisgKiBTZXRzIHRoZSBoYW5kbGVyIGZvciB0aGUgd2F0Y2guCisgKgorICogQHRvZG8gdGhpcyBmdW5jdGlvbiBvbmx5IGV4aXN0cyBiZWNhdXNlIG9mIHRoZSB3ZWlyZAorICogd2F5IGNvbm5lY3Rpb24gd2F0Y2hlcyBhcmUgZG9uZSwgc2VlIHRoZSBub3RlCisgKiBpbiBkb2NzIGZvciBfZGJ1c19jb25uZWN0aW9uX2hhbmRsZV93YXRjaCgpLgorICoKKyAqIEBwYXJhbSB3YXRjaCB0aGUgd2F0Y2gKKyAqIEBwYXJhbSBoYW5kbGVyIHRoZSBuZXcgaGFuZGxlcgorICogQHBhcmFtIGRhdGEgdGhlIGRhdGEKKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuY3Rpb24gZnJlZSBkYXRhIHdpdGggdGhpcworICovCit2b2lkCitfZGJ1c193YXRjaF9zZXRfaGFuZGxlciAoREJ1c1dhdGNoICAgICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoSGFuZGxlciAgaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgaWYgKHdhdGNoLT5mcmVlX2hhbmRsZXJfZGF0YV9mdW5jdGlvbikKKyAgICAoKiB3YXRjaC0+ZnJlZV9oYW5kbGVyX2RhdGFfZnVuY3Rpb24pICh3YXRjaC0+aGFuZGxlcl9kYXRhKTsKKworICB3YXRjaC0+aGFuZGxlciA9IGhhbmRsZXI7CisgIHdhdGNoLT5oYW5kbGVyX2RhdGEgPSBkYXRhOworICB3YXRjaC0+ZnJlZV9oYW5kbGVyX2RhdGFfZnVuY3Rpb24gPSBmcmVlX2RhdGFfZnVuY3Rpb247Cit9CisKKy8qKiBAfSAqLworCisvKioKKyAqIEBkZWZncm91cCBEQnVzV2F0Y2ggREJ1c1dhdGNoCisgKiBAaW5ncm91cCAgREJ1cworICogQGJyaWVmIE9iamVjdCByZXByZXNlbnRpbmcgYSBmaWxlIGRlc2NyaXB0b3IgdG8gYmUgd2F0Y2hlZC4KKyAqCisgKiBUeXBlcyBhbmQgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gREJ1c1dhdGNoLiBBIHdhdGNoIHJlcHJlc2VudHMKKyAqIGEgZmlsZSBkZXNjcmlwdG9yIHRoYXQgdGhlIG1haW4gbG9vcCBuZWVkcyB0byBtb25pdG9yLAorICogYXMgaW4gUXQncyBRU29ja2V0Tm90aWZpZXIgb3IgR0xpYidzIGdfaW9fYWRkX3dhdGNoKCkuCisgKgorICogVXNlIGRidXNfY29ubmVjdGlvbl9zZXRfd2F0Y2hfZnVuY3Rpb25zKCkgb3IgZGJ1c19zZXJ2ZXJfc2V0X3dhdGNoX2Z1bmN0aW9ucygpCisgKiB0byBiZSBub3RpZmllZCB3aGVuIGxpYmRidXMgbmVlZHMgdG8gYWRkIG9yIHJlbW92ZSB3YXRjaGVzLgorICogCisgKiBAeworICovCisKKy8qKgorICogQHR5cGVkZWYgREJ1c1dhdGNoCisgKgorICogT3BhcXVlIG9iamVjdCByZXByZXNlbnRpbmcgYSBmaWxlIGRlc2NyaXB0b3IKKyAqIHRvIGJlIHdhdGNoZWQgZm9yIGNoYW5nZXMgaW4gcmVhZGFiaWxpdHksCisgKiB3cml0YWJpbGl0eSwgb3IgaGFuZ3VwLgorICovCisKKy8qKgorICogRGVwcmVjYXRlZCBmb3JtZXIgbmFtZSBvZiBkYnVzX3dhdGNoX2dldF91bml4X2ZkKCkuCisgKiAKKyAqIEBwYXJhbSB3YXRjaCB0aGUgREJ1c1dhdGNoIG9iamVjdC4KKyAqIEByZXR1cm5zIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gd2F0Y2guCisgKi8KK2ludAorZGJ1c193YXRjaF9nZXRfZmQgKERCdXNXYXRjaCAqd2F0Y2gpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAod2F0Y2ggIT0gTlVMTCwgLTEpOworCisgIHJldHVybiBkYnVzX3dhdGNoX2dldF91bml4X2ZkKHdhdGNoKTsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgVU5JWCBmaWxlIGRlc2NyaXB0b3IgdG8gYmUgd2F0Y2hlZCwKKyAqIHdoaWNoIG1heSBiZSBhIHBpcGUsIHNvY2tldCwgb3Igb3RoZXIgdHlwZSBvZgorICogZGVzY3JpcHRvci4gT24gVU5JWCB0aGlzIGlzIHByZWZlcnJlZCB0bworICogZGJ1c193YXRjaF9nZXRfc29ja2V0KCkgc2luY2UgaXQgd29ya3Mgd2l0aAorICogbW9yZSBraW5kcyBvZiAjREJ1c1dhdGNoLgorICoKKyAqIEFsd2F5cyByZXR1cm5zIC0xIG9uIFdpbmRvd3MuIE9uIFdpbmRvd3MgeW91IHVzZQorICogZGJ1c193YXRjaF9nZXRfc29ja2V0KCkgdG8gZ2V0IGEgV2luc29jayBzb2NrZXQgdG8gd2F0Y2guCisgKiAKKyAqIEBwYXJhbSB3YXRjaCB0aGUgREJ1c1dhdGNoIG9iamVjdC4KKyAqIEByZXR1cm5zIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gd2F0Y2guCisgKi8KK2ludAorZGJ1c193YXRjaF9nZXRfdW5peF9mZCAoREJ1c1dhdGNoICp3YXRjaCkKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICh3YXRjaCAhPSBOVUxMLCAtMSk7CisKKyAgLyogRklYTUUgcmVtb3ZlICNpZmRlZiBhbmQgZG8gdGhpcyBvbiBhIGxvd2VyIGxldmVsCisgICAqICh3YXRjaCBzaG91bGQgaGF2ZSBzZXRfc29ja2V0IGFuZCBzZXRfdW5peF9mZCBhbmQgdHJhY2sKKyAgICogd2hpY2ggaXQgaGFzLCBhbmQgdGhlIHRyYW5zcG9ydCBzaG91bGQgcHJvdmlkZSB0aGUKKyAgICogYXBwcm9wcmlhdGUgd2F0Y2ggdHlwZSkKKyAgICovCisjaWZkZWYgREJVU19VTklYCisgIHJldHVybiB3YXRjaC0+ZmQ7CisjZWxzZQorICByZXR1cm4gZGJ1c193YXRjaF9nZXRfc29ja2V0KCB3YXRjaCApOworI2VuZGlmCit9CisKKy8qKgorICogUmV0dXJucyBhIHNvY2tldCB0byBiZSB3YXRjaGVkLCBvbiBVTklYIHRoaXMgd2lsbCByZXR1cm4gLTEgaWYgb3VyCisgKiB0cmFuc3BvcnQgaXMgbm90IHNvY2tldC1iYXNlZCBzbyBkYnVzX3dhdGNoX2dldF91bml4X2ZkKCkgaXMKKyAqIHByZWZlcnJlZC4KKyAqCisgKiBPbiBXaW5kb3dzLCBkYnVzX3dhdGNoX2dldF91bml4X2ZkKCkgcmV0dXJucyAtMSBidXQgdGhpcyBmdW5jdGlvbgorICogcmV0dXJucyBhIFdpbnNvY2sgc29ja2V0IChhc3N1bWluZyB0aGUgdHJhbnNwb3J0IGlzIHNvY2tldC1iYXNlZCwKKyAqIGFzIGl0IGFsd2F5cyBpcyBmb3Igbm93KS4KKyAqIAorICogQHBhcmFtIHdhdGNoIHRoZSBEQnVzV2F0Y2ggb2JqZWN0LgorICogQHJldHVybnMgdGhlIHNvY2tldCB0byB3YXRjaC4KKyAqLworaW50CitkYnVzX3dhdGNoX2dldF9zb2NrZXQgKERCdXNXYXRjaCAqd2F0Y2gpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAod2F0Y2ggIT0gTlVMTCwgLTEpOworCisgIHJldHVybiB3YXRjaC0+ZmQ7Cit9CisKKy8qKgorICogR2V0cyBmbGFncyBmcm9tIERCdXNXYXRjaEZsYWdzIGluZGljYXRpbmcKKyAqIHdoYXQgY29uZGl0aW9ucyBzaG91bGQgYmUgbW9uaXRvcmVkIG9uIHRoZQorICogZmlsZSBkZXNjcmlwdG9yLgorICogCisgKiBUaGUgZmxhZ3MgcmV0dXJuZWQgd2lsbCBvbmx5IGNvbnRhaW4gREJVU19XQVRDSF9SRUFEQUJMRQorICogYW5kIERCVVNfV0FUQ0hfV1JJVEFCTEUsIG5ldmVyIERCVVNfV0FUQ0hfSEFOR1VQIG9yCisgKiBEQlVTX1dBVENIX0VSUk9SOyBhbGwgd2F0Y2hlcyBpbXBsaWNpdGx5IGluY2x1ZGUgYSB3YXRjaAorICogZm9yIGhhbmd1cHMsIGVycm9ycywgYW5kIG90aGVyIGV4Y2VwdGlvbmFsIGNvbmRpdGlvbnMuCisgKgorICogQHBhcmFtIHdhdGNoIHRoZSBEQnVzV2F0Y2ggb2JqZWN0LgorICogQHJldHVybnMgdGhlIGNvbmRpdGlvbnMgdG8gd2F0Y2guCisgKi8KK3Vuc2lnbmVkIGludAorZGJ1c193YXRjaF9nZXRfZmxhZ3MgKERCdXNXYXRjaCAqd2F0Y2gpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAod2F0Y2ggIT0gTlVMTCwgMCk7CisgIF9kYnVzX2Fzc2VydCAoKHdhdGNoLT5mbGFncyAmIFZBTElEX1dBVENIX0ZMQUdTKSA9PSB3YXRjaC0+ZmxhZ3MpOworCisgIHJldHVybiB3YXRjaC0+ZmxhZ3M7Cit9CisKKy8qKgorICogR2V0cyBkYXRhIHByZXZpb3VzbHkgc2V0IHdpdGggZGJ1c193YXRjaF9zZXRfZGF0YSgpCisgKiBvciAjTlVMTCBpZiBub25lLgorICoKKyAqIEBwYXJhbSB3YXRjaCB0aGUgREJ1c1dhdGNoIG9iamVjdC4KKyAqIEByZXR1cm5zIHByZXZpb3VzbHktc2V0IGRhdGEuCisgKi8KK3ZvaWQqCitkYnVzX3dhdGNoX2dldF9kYXRhIChEQnVzV2F0Y2ggKndhdGNoKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHdhdGNoICE9IE5VTEwsIE5VTEwpOworCisgIHJldHVybiB3YXRjaC0+ZGF0YTsKK30KKworLyoqCisgKiBTZXRzIGRhdGEgd2hpY2ggY2FuIGJlIHJldHJpZXZlZCB3aXRoIGRidXNfd2F0Y2hfZ2V0X2RhdGEoKS4KKyAqIEludGVuZGVkIGZvciB1c2UgYnkgdGhlIERCdXNBZGRXYXRjaEZ1bmN0aW9uIGFuZAorICogREJ1c1JlbW92ZVdhdGNoRnVuY3Rpb24gdG8gc3RvcmUgdGhlaXIgb3duIGRhdGEuICBGb3IgZXhhbXBsZSB3aXRoCisgKiBRdCB5b3UgbWlnaHQgc3RvcmUgdGhlIFFTb2NrZXROb3RpZmllciBmb3IgdGhpcyB3YXRjaCBhbmQgd2l0aCBHTGliCisgKiB5b3UgbWlnaHQgc3RvcmUgYSBHU291cmNlLgorICoKKyAqIEBwYXJhbSB3YXRjaCB0aGUgREJ1c1dhdGNoIG9iamVjdC4KKyAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhLgorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jdGlvbiBmdW5jdGlvbiB0byBiZSBjYWxsZWQgdG8gZnJlZSB0aGUgZGF0YS4KKyAqLwordm9pZAorZGJ1c193YXRjaF9zZXRfZGF0YSAoREJ1c1dhdGNoICAgICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgZnJlZV9kYXRhX2Z1bmN0aW9uKQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAod2F0Y2ggIT0gTlVMTCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIlNldHRpbmcgd2F0Y2ggZmQgJWQgZGF0YSB0byBkYXRhID0gJXAgZnVuY3Rpb24gPSAlcCBmcm9tIGRhdGEgPSAlcCBmdW5jdGlvbiA9ICVwXG4iLAorICAgICAgICAgICAgICAgICBkYnVzX3dhdGNoX2dldF9zb2NrZXQgKHdhdGNoKSwKKyAgICAgICAgICAgICAgICAgZGF0YSwgZnJlZV9kYXRhX2Z1bmN0aW9uLCB3YXRjaC0+ZGF0YSwgd2F0Y2gtPmZyZWVfZGF0YV9mdW5jdGlvbik7CisgIAorICBpZiAod2F0Y2gtPmZyZWVfZGF0YV9mdW5jdGlvbiAhPSBOVUxMKQorICAgICgqIHdhdGNoLT5mcmVlX2RhdGFfZnVuY3Rpb24pICh3YXRjaC0+ZGF0YSk7CisgIAorICB3YXRjaC0+ZGF0YSA9IGRhdGE7CisgIHdhdGNoLT5mcmVlX2RhdGFfZnVuY3Rpb24gPSBmcmVlX2RhdGFfZnVuY3Rpb247Cit9CisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIGEgd2F0Y2ggaXMgZW5hYmxlZCBvciBub3QuIElmIG5vdAorICogZW5hYmxlZCwgaXQgc2hvdWxkIG5vdCBiZSBwb2xsZWQgYnkgdGhlIG1haW4gbG9vcC4KKyAqCisgKiBAcGFyYW0gd2F0Y2ggdGhlIERCdXNXYXRjaCBvYmplY3QKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSB3YXRjaCBpcyBlbmFibGVkCisgKi8KK2RidXNfYm9vbF90CitkYnVzX3dhdGNoX2dldF9lbmFibGVkIChEQnVzV2F0Y2ggKndhdGNoKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHdhdGNoICE9IE5VTEwsIEZBTFNFKTsKKworICByZXR1cm4gd2F0Y2gtPmVuYWJsZWQ7Cit9CisKKworLyoqCisgKiBDYWxsZWQgdG8gbm90aWZ5IHRoZSBELUJ1cyBsaWJyYXJ5IHdoZW4gYSBwcmV2aW91c2x5LWFkZGVkIHdhdGNoIGlzCisgKiByZWFkeSBmb3IgcmVhZGluZyBvciB3cml0aW5nLCBvciBoYXMgYW4gZXhjZXB0aW9uIHN1Y2ggYXMgYSBoYW5ndXAuCisgKiAKKyAqIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAjRkFMU0UsIHRoZW4gdGhlIGZpbGUgZGVzY3JpcHRvciBtYXkgc3RpbGwKKyAqIGJlIHJlYWR5IGZvciByZWFkaW5nIG9yIHdyaXRpbmcsIGJ1dCBtb3JlIG1lbW9yeSBpcyBuZWVkZWQgaW4gb3JkZXIKKyAqIHRvIGRvIHRoZSByZWFkaW5nIG9yIHdyaXRpbmcuIElmIHlvdSBpZ25vcmUgdGhlICNGQUxTRSByZXR1cm4sIHlvdXIKKyAqIGFwcGxpY2F0aW9uIG1heSBzcGluIGluIGEgYnVzeSBsb29wIG9uIHRoZSBmaWxlIGRlc2NyaXB0b3IgdW50aWwKKyAqIG1lbW9yeSBiZWNvbWVzIGF2YWlsYWJsZSwgYnV0IG5vdGhpbmcgbW9yZSBjYXRhc3Ryb3BoaWMgc2hvdWxkCisgKiBoYXBwZW4uCisgKgorICogZGJ1c193YXRjaF9oYW5kbGUoKSBjYW5ub3QgYmUgY2FsbGVkIGR1cmluZyB0aGUKKyAqIERCdXNBZGRXYXRjaEZ1bmN0aW9uLCBhcyB0aGUgY29ubmVjdGlvbiB3aWxsIG5vdCBiZSByZWFkeSB0byBoYW5kbGUKKyAqIHRoYXQgd2F0Y2ggeWV0LgorICogCisgKiBJdCBpcyBub3QgYWxsb3dlZCB0byByZWZlcmVuY2UgYSBEQnVzV2F0Y2ggYWZ0ZXIgaXQgaGFzIGJlZW4gcGFzc2VkCisgKiB0byByZW1vdmVfZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHdhdGNoIHRoZSBEQnVzV2F0Y2ggb2JqZWN0LgorICogQHBhcmFtIGZsYWdzIHRoZSBwb2xsIGNvbmRpdGlvbiB1c2luZyAjREJ1c1dhdGNoRmxhZ3MgdmFsdWVzCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlcmUgd2Fzbid0IGVub3VnaCBtZW1vcnkgCisgKi8KK2RidXNfYm9vbF90CitkYnVzX3dhdGNoX2hhbmRsZSAoREJ1c1dhdGNoICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgIGZsYWdzKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHdhdGNoICE9IE5VTEwsIEZBTFNFKTsKKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIGlmICh3YXRjaC0+ZmQgPCAwIHx8IHdhdGNoLT5mbGFncyA9PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkICgiV2F0Y2ggaXMgaW52YWxpZCwgaXQgc2hvdWxkIGhhdmUgYmVlbiByZW1vdmVkXG4iKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyNlbmRpZgorICAgIAorICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHdhdGNoLT5mZCA+PSAwIC8qIGZhaWxzIGlmIHdhdGNoIHdhcyByZW1vdmVkICovLCBUUlVFKTsKKyAgCisgIF9kYnVzX3dhdGNoX3Nhbml0aXplX2NvbmRpdGlvbiAod2F0Y2gsICZmbGFncyk7CisKKyAgaWYgKGZsYWdzID09IDApCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkFmdGVyIHNhbml0aXphdGlvbiwgd2F0Y2ggZmxhZ3Mgb24gZmQgJWQgd2VyZSAwXG4iLAorICAgICAgICAgICAgICAgICAgICAgd2F0Y2gtPmZkKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiAoKiB3YXRjaC0+aGFuZGxlcikgKHdhdGNoLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRjaC0+aGFuZGxlcl9kYXRhKTsKK30KKworCisvKiogQH0gKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9kYnVzLXdhdGNoLmggYi9kYnVzL2RidXMvZGJ1cy13YXRjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ODMyMTQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvZGJ1cy13YXRjaC5oCkBAIC0wLDAgKzEsODkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy13YXRjaC5oIERCdXNXYXRjaCBpbnRlcm5hbCBpbnRlcmZhY2VzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZm5kZWYgREJVU19XQVRDSF9ICisjZGVmaW5lIERCVVNfV0FUQ0hfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzV2F0Y2hJbnRlcm5hbHMKKyAqIEB7CisgKi8KKworLyogUHVibGljIG1ldGhvZHMgb24gREJ1c1dhdGNoIGFyZSBpbiBkYnVzLWNvbm5lY3Rpb24uaCAqLworCit0eXBlZGVmIHN0cnVjdCBEQnVzV2F0Y2hMaXN0IERCdXNXYXRjaExpc3Q7CisKKyNkZWZpbmUgX0RCVVNfV0FUQ0hfTlZBTCAoMTw8NCkKKworLyoqIGZ1bmN0aW9uIHRvIHJ1biB3aGVuIHRoZSB3YXRjaCBpcyBoYW5kbGVkICovCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNXYXRjaEhhbmRsZXIpIChEQnVzV2F0Y2ggICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAqZGF0YSk7CisKK0RCdXNXYXRjaCogX2RidXNfd2F0Y2hfbmV3ICAgICAgICAgICAgICAgIChpbnQgICAgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBlbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaEhhbmRsZXIgIGhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICBmcmVlX2RhdGFfZnVuY3Rpb24pOworREJ1c1dhdGNoKiBfZGJ1c193YXRjaF9yZWYgICAgICAgICAgICAgICAgKERCdXNXYXRjaCAgICAgICAgKndhdGNoKTsKK3ZvaWQgICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgICAgICAgICAgICAgIChEQnVzV2F0Y2ggICAgICAgICp3YXRjaCk7Cit2b2lkICAgICAgIF9kYnVzX3dhdGNoX2ludmFsaWRhdGUgICAgICAgICAoREJ1c1dhdGNoICAgICAgICAqd2F0Y2gpOwordm9pZCAgICAgICBfZGJ1c193YXRjaF9zYW5pdGl6ZV9jb25kaXRpb24gKERCdXNXYXRjaCAgICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgKmNvbmRpdGlvbik7Cit2b2lkICAgICAgIF9kYnVzX3dhdGNoX3NldF9oYW5kbGVyICAgICAgICAoREJ1c1dhdGNoICAgICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoSGFuZGxlciAgaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gIGZyZWVfZGF0YV9mdW5jdGlvbik7CisKKworREJ1c1dhdGNoTGlzdCogX2RidXNfd2F0Y2hfbGlzdF9uZXcgICAgICAgICAgICh2b2lkKTsKK3ZvaWQgICAgICAgICAgIF9kYnVzX3dhdGNoX2xpc3RfZnJlZSAgICAgICAgICAoREJ1c1dhdGNoTGlzdCAgICAgICAgICAgKndhdGNoX2xpc3QpOworZGJ1c19ib29sX3QgICAgX2RidXNfd2F0Y2hfbGlzdF9zZXRfZnVuY3Rpb25zIChEQnVzV2F0Y2hMaXN0ICAgICAgICAgICAqd2F0Y2hfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0FkZFdhdGNoRnVuY3Rpb24gICAgIGFkZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1JlbW92ZVdhdGNoRnVuY3Rpb24gIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoVG9nZ2xlZEZ1bmN0aW9uIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK2RidXNfYm9vbF90ICAgIF9kYnVzX3dhdGNoX2xpc3RfYWRkX3dhdGNoICAgICAoREJ1c1dhdGNoTGlzdCAgICAgICAgICAgKndhdGNoX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICAgICAgICAgICp3YXRjaCk7Cit2b2lkICAgICAgICAgICBfZGJ1c193YXRjaF9saXN0X3JlbW92ZV93YXRjaCAgKERCdXNXYXRjaExpc3QgICAgICAgICAgICp3YXRjaF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICAgICAgICAqd2F0Y2gpOwordm9pZCAgICAgICAgICAgX2RidXNfd2F0Y2hfbGlzdF90b2dnbGVfd2F0Y2ggIChEQnVzV2F0Y2hMaXN0ICAgICAgICAgICAqd2F0Y2hfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAgICAgICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgZW5hYmxlZCk7CitkYnVzX2Jvb2xfdCAgICBfZGJ1c193YXRjaF9nZXRfZW5hYmxlZCAgICAgICAgKERCdXNXYXRjaCAgICAgICAgICAgICAgKndhdGNoKTsKKworZGJ1c19ib29sX3QgICAgX2RidXNfd2F0Y2hfZ2V0X29vbV9sYXN0X3RpbWUgIChEQnVzV2F0Y2ggICAgICAgICAgICAgICAqd2F0Y2gpOwordm9pZCAgICAgICAgICAgX2RidXNfd2F0Y2hfc2V0X29vbV9sYXN0X3RpbWUgIChEQnVzV2F0Y2ggICAgICAgICAgICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgICBvb20pOworCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfV0FUQ0hfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL2RidXMuaCBiL2RidXMvZGJ1cy9kYnVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMyY2VhYgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9kYnVzLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy5oICBDb252ZW5pZW5jZSBoZWFkZXIgaW5jbHVkaW5nIGFsbCBvdGhlciBoZWFkZXJzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX0gKKyNkZWZpbmUgREJVU19ICisKKyNkZWZpbmUgREJVU19JTlNJREVfREJVU19IIDEKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1hcmNoLWRlcHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtYWRkcmVzcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1idXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtY29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFjcm9zLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWlzYy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1wZW5kaW5nLWNhbGwuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc2VydmVyLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXNoYXJlZC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zaWduYXR1cmUuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3ludGF4Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXRocmVhZHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKworI3VuZGVmIERCVVNfSU5TSURFX0RCVVNfSAorCisvKioKKyAqIEBkZWZncm91cCBEQnVzIEQtQnVzIGxvdy1sZXZlbCBwdWJsaWMgQVBJCisgKiBAYnJpZWYgVGhlIGxvdy1sZXZlbCBwdWJsaWMgQVBJIG9mIHRoZSBELUJ1cyBsaWJyYXJ5CisgKgorICogbGliZGJ1cyBwcm92aWRlcyBhIGxvdy1sZXZlbCBDIEFQSSBpbnRlbmRlZCBwcmltYXJpbHkgZm9yIHVzZSBieQorICogYmluZGluZ3MgdG8gc3BlY2lmaWMgb2JqZWN0IHN5c3RlbXMgYW5kIGxhbmd1YWdlcy4gIEQtQnVzIGlzIG1vc3QKKyAqIGNvbnZlbmllbnQgd2hlbiB1c2VkIHdpdGggdGhlIEdMaWIgYmluZGluZ3MsIFB5dGhvbiBiaW5kaW5ncywgUXQKKyAqIGJpbmRpbmdzLCBNb25vIGJpbmRpbmdzLCBhbmQgc28gZm9ydGguICBUaGlzIGxvdy1sZXZlbCBBUEkgaGFzIGEKKyAqIGxvdCBvZiBjb21wbGV4aXR5IHVzZWZ1bCBvbmx5IGZvciBiaW5kaW5ncy4KKyAqIAorICogQHsKKyAqLworCisvKiogQH0gKi8KKworLyoqCisgKiBAbWFpbnBhZ2UKKyAqCisgKiBUaGlzIG1hbnVhbCBkb2N1bWVudHMgdGhlIDxlbT5sb3ctbGV2ZWw8L2VtPiBELUJ1cyBDIEFQSS4gPGI+SWYgeW91IHVzZQorICogdGhpcyBsb3ctbGV2ZWwgQVBJIGRpcmVjdGx5LCB5b3UncmUgc2lnbmluZyB1cCBmb3Igc29tZSBwYWluLjwvYj4KKyAqCisgKiBDYXZlYXRzIGFzaWRlLCB5b3UgbWlnaHQgZ2V0IHN0YXJ0ZWQgbGVhcm5pbmcgdGhlIGxvdy1sZXZlbCBBUEkgYnkgcmVhZGluZworICogYWJvdXQgQHJlZiBEQnVzQ29ubmVjdGlvbiBhbmQgQHJlZiBEQnVzTWVzc2FnZS4KKyAqIAorICogVGhlcmUgYXJlIHNldmVyYWwgb3RoZXIgcGxhY2VzIHRvIGxvb2sgZm9yIEQtQnVzIGluZm9ybWF0aW9uLCBzdWNoCisgKiBhcyB0aGUgdHV0b3JpYWwgYW5kIHRoZSBzcGVjaWZpY2F0aW9uOyB0aG9zZSBjYW4gYmUgZm91bmQgYXQgPGEKKyAqIGhyZWY9Imh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3dpa2kvU29mdHdhcmUvZGJ1cyI+dGhlIEQtQnVzCisgKiB3ZWJzaXRlPC9hPi4gSWYgeW91J3JlIGludGVyZXN0ZWQgaW4gYSBzeXNhZG1pbiBvciBwYWNrYWdlCisgKiBtYWludGFpbmVyJ3MgcGVyc3BlY3RpdmUgb24gdGhlIGRidXMtZGFlbW9uIGl0c2VsZiBhbmQgaXRzCisgKiBjb25maWd1cmF0aW9uLCBiZSBzdXJlIHRvIGNoZWNrIG91dCB0aGUgbWFuIHBhZ2VzIGFzIHdlbGwuCisgKgorICogVGhlIGxvdy1sZXZlbCBBUEkgZG9jdW1lbnRlZCBpbiB0aGlzIG1hbnVhbCBkZWxpYmVyYXRlbHkgbGFja3MKKyAqIG1vc3QgY29udmVuaWVuY2UgZnVuY3Rpb25zIC0gdGhvc2UgYXJlIGxlZnQgdXAgdG8gaGlnaGVyLWxldmVsIGxpYnJhcmllcworICogYmFzZWQgb24gZnJhbWV3b3JrcyBzdWNoIGFzIEdMaWIsIFF0LCBQeXRob24sIE1vbm8sIEphdmEsCisgKiBldGMuIFRoZXNlIGhpZ2hlci1sZXZlbCBsaWJyYXJpZXMgKG9mdGVuIGNhbGxlZCAiRC1CdXMgYmluZGluZ3MiKQorICogaGF2ZSBmZWF0dXJlcyBzdWNoIGFzIG9iamVjdCBzeXN0ZW1zIGFuZCBtYWluIGxvb3BzIHRoYXQgYWxsb3cgYQorICogPGVtPm11Y2g8L2VtPiBtb3JlIGNvbnZlbmllbnQgQVBJLgorICogCisgKiBUaGUgbG93LWxldmVsIEFQSSBhbHNvIGNvbnRhaW5zIHBsZW50eSBvZiBjbHV0dGVyIHRvIHN1cHBvcnQKKyAqIGludGVncmF0aW9uIHdpdGggYXJiaXRyYXJ5IG9iamVjdCBzeXN0ZW1zLCBsYW5ndWFnZXMsIG1haW4gbG9vcHMsCisgKiBhbmQgc28gZm9ydGguIFRoZXNlIGZlYXR1cmVzIGFkZCBhIGxvdCBvZiBub2lzZSB0byB0aGUgQVBJIHRoYXQgeW91CisgKiBwcm9iYWJseSBkb24ndCBjYXJlIGFib3V0IHVubGVzcyB5b3UncmUgY29kaW5nIGEgYmluZGluZy4KKyAqCisgKiBUaGlzIG1hbnVhbCBhbHNvIGNvbnRhaW5zIGRvY3MgZm9yIEByZWYgREJ1c0ludGVybmFscyAiRC1CdXMgaW50ZXJuYWxzIiwKKyAqIHNvIHlvdSBjYW4gdXNlIGl0IHRvIGdldCBvcmllbnRlZCB0byB0aGUgRC1CdXMgc291cmNlIGNvZGUgaWYgeW91J3JlCisgKiBpbnRlcmVzdGVkIGluIHBhdGNoaW5nIHRoZSBjb2RlLiBZb3Ugc2hvdWxkIGFsc28gcmVhZCB0aGUKKyAqIGZpbGUgSEFDS0lORyB3aGljaCBjb21lcyB3aXRoIHRoZSBzb3VyY2UgY29kZSBpZiB5b3UgcGxhbiB0byBjb250cmlidXRlIHRvCisgKiBELUJ1cy4KKyAqCisgKiBBcyB5b3UgcmVhZCB0aGUgY29kZSwgeW91IGNhbiBpZGVudGlmeSBpbnRlcm5hbCBELUJ1cyBmdW5jdGlvbnMKKyAqIGJlY2F1c2UgdGhleSBzdGFydCB3aXRoIGFuIHVuZGVyc2NvcmUgKCdfJykgY2hhcmFjdGVyLiBBbHNvLCBhbnkKKyAqIGlkZW50aWZpZXIgb3IgbWFjcm8gdGhhdCBsYWNrcyBhIERCdXMsIGRidXNfLCBvciBEQlVTXyBuYW1lcGFjZQorICogcHJlZml4IGlzIGludGVybmFsLCB3aXRoIGEgY291cGxlIG9mIGV4Y2VwdGlvbnMgc3VjaCBhcyAjTlVMTCwKKyAqICNUUlVFLCBhbmQgI0ZBTFNFLgorICovCisKKyNlbmRpZiAvKiBEQlVTX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy9zZC1kYWVtb24uYyBiL2RidXMvZGJ1cy9zZC1kYWVtb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzIzYjkxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzL3NkLWRhZW1vbi5jCkBAIC0wLDAgKzEsNDM1IEBACisvKi0qLSBNb2RlOiBDOyBjLWJhc2ljLW9mZnNldDogODsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLSovCisKKy8qKioKKyAgQ29weXJpZ2h0IDIwMTAgTGVubmFydCBQb2V0dGVyaW5nCisKKyAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyAgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKKyAgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyAgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgIFNPRlRXQVJFLgorKioqLworCisjaWZuZGVmIF9HTlVfU09VUkNFCisjZGVmaW5lIF9HTlVfU09VUkNFCisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorI2luY2x1ZGUgPHN5cy9mY250bC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJzZC1kYWVtb24uaCIKKworaW50IHNkX2xpc3Rlbl9mZHMoaW50IHVuc2V0X2Vudmlyb25tZW50KSB7CisKKyNpZiBkZWZpbmVkKERJU0FCTEVfU1lTVEVNRCkgfHwgIWRlZmluZWQoX19saW51eF9fKQorICAgICAgICByZXR1cm4gMDsKKyNlbHNlCisgICAgICAgIGludCByLCBmZDsKKyAgICAgICAgY29uc3QgY2hhciAqZTsKKyAgICAgICAgY2hhciAqcCA9IE5VTEw7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgbDsKKworICAgICAgICBpZiAoIShlID0gZ2V0ZW52KCJMSVNURU5fUElEIikpKSB7CisgICAgICAgICAgICAgICAgciA9IDA7CisgICAgICAgICAgICAgICAgZ290byBmaW5pc2g7CisgICAgICAgIH0KKworICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIGwgPSBzdHJ0b3VsKGUsICZwLCAxMCk7CisKKyAgICAgICAgaWYgKGVycm5vICE9IDApIHsKKyAgICAgICAgICAgICAgICByID0gLWVycm5vOworICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFwIHx8ICpwIHx8IGwgPD0gMCkgeworICAgICAgICAgICAgICAgIHIgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICB9CisKKyAgICAgICAgLyogSXMgdGhpcyBmb3IgdXM/ICovCisgICAgICAgIGlmIChnZXRwaWQoKSAhPSAocGlkX3QpIGwpIHsKKyAgICAgICAgICAgICAgICByID0gMDsKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghKGUgPSBnZXRlbnYoIkxJU1RFTl9GRFMiKSkpIHsKKyAgICAgICAgICAgICAgICByID0gMDsKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgfQorCisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgbCA9IHN0cnRvdWwoZSwgJnAsIDEwKTsKKworICAgICAgICBpZiAoZXJybm8gIT0gMCkgeworICAgICAgICAgICAgICAgIHIgPSAtZXJybm87CisgICAgICAgICAgICAgICAgZ290byBmaW5pc2g7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXAgfHwgKnApIHsKKyAgICAgICAgICAgICAgICByID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoZmQgPSBTRF9MSVNURU5fRkRTX1NUQVJUOyBmZCA8IFNEX0xJU1RFTl9GRFNfU1RBUlQgKyAoaW50KSBsOyBmZCArKykgeworICAgICAgICAgICAgICAgIGludCBmbGFnczsKKworICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgPSBmY250bChmZCwgRl9HRVRGRCkpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgciA9IC1lcnJubzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChmbGFncyAmIEZEX0NMT0VYRUMpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGlmIChmY250bChmZCwgRl9TRVRGRCwgZmxhZ3MgfCBGRF9DTE9FWEVDKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIgPSAtZXJybm87CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByID0gKGludCkgbDsKKworZmluaXNoOgorICAgICAgICBpZiAodW5zZXRfZW52aXJvbm1lbnQpIHsKKyAgICAgICAgICAgICAgICB1bnNldGVudigiTElTVEVOX1BJRCIpOworICAgICAgICAgICAgICAgIHVuc2V0ZW52KCJMSVNURU5fRkRTIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcjsKKyNlbmRpZgorfQorCitpbnQgc2RfaXNfZmlmbyhpbnQgZmQsIGNvbnN0IGNoYXIgKnBhdGgpIHsKKyAgICAgICAgc3RydWN0IHN0YXQgc3RfZmQ7CisKKyAgICAgICAgaWYgKGZkIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICBtZW1zZXQoJnN0X2ZkLCAwLCBzaXplb2Yoc3RfZmQpKTsKKyAgICAgICAgaWYgKGZzdGF0KGZkLCAmc3RfZmQpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLWVycm5vOworCisgICAgICAgIGlmICghU19JU0ZJRk8oc3RfZmQuc3RfbW9kZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgaWYgKHBhdGgpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBzdF9wYXRoOworCisgICAgICAgICAgICAgICAgbWVtc2V0KCZzdF9wYXRoLCAwLCBzaXplb2Yoc3RfcGF0aCkpOworICAgICAgICAgICAgICAgIGlmIChzdGF0KHBhdGgsICZzdF9wYXRoKSA8IDApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm5vID09IEVOT0VOVCB8fCBlcnJubyA9PSBFTk9URElSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0X3BhdGguc3RfZGV2ID09IHN0X2ZkLnN0X2RldiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgc3RfcGF0aC5zdF9pbm8gPT0gc3RfZmQuc3RfaW5vOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2RfaXNfc29ja2V0X2ludGVybmFsKGludCBmZCwgaW50IHR5cGUsIGludCBsaXN0ZW5pbmcpIHsKKyAgICAgICAgc3RydWN0IHN0YXQgc3RfZmQ7CisKKyAgICAgICAgaWYgKGZkIDwgMCB8fCB0eXBlIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICBpZiAoZnN0YXQoZmQsICZzdF9mZCkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtZXJybm87CisKKyAgICAgICAgaWYgKCFTX0lTU09DSyhzdF9mZC5zdF9tb2RlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAodHlwZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaW50IG90aGVyX3R5cGUgPSAwOworICAgICAgICAgICAgICAgIHNvY2tsZW5fdCBsID0gc2l6ZW9mKG90aGVyX3R5cGUpOworCisgICAgICAgICAgICAgICAgaWYgKGdldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1RZUEUsICZvdGhlcl90eXBlLCAmbCkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgICAgICAgICAgICAgIGlmIChsICE9IHNpemVvZihvdGhlcl90eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgICAgICAgICAgICAgaWYgKG90aGVyX3R5cGUgIT0gdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxpc3RlbmluZyA+PSAwKSB7CisgICAgICAgICAgICAgICAgaW50IGFjY2VwdGluZyA9IDA7CisgICAgICAgICAgICAgICAgc29ja2xlbl90IGwgPSBzaXplb2YoYWNjZXB0aW5nKTsKKworICAgICAgICAgICAgICAgIGlmIChnZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19BQ0NFUFRDT05OLCAmYWNjZXB0aW5nLCAmbCkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgICAgICAgICAgICAgIGlmIChsICE9IHNpemVvZihhY2NlcHRpbmcpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgICAgICAgICBpZiAoIWFjY2VwdGluZyAhPSAhbGlzdGVuaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMTsKK30KKwordW5pb24gc29ja2FkZHJfdW5pb24geworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgc2E7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBpbjQ7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgaW42OworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gdW47CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHN0b3JhZ2U7Cit9OworCitpbnQgc2RfaXNfc29ja2V0KGludCBmZCwgaW50IGZhbWlseSwgaW50IHR5cGUsIGludCBsaXN0ZW5pbmcpIHsKKyAgICAgICAgaW50IHI7CisKKyAgICAgICAgaWYgKGZhbWlseSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgaWYgKChyID0gc2RfaXNfc29ja2V0X2ludGVybmFsKGZkLCB0eXBlLCBsaXN0ZW5pbmcpKSA8PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiByOworCisgICAgICAgIGlmIChmYW1pbHkgPiAwKSB7CisgICAgICAgICAgICAgICAgdW5pb24gc29ja2FkZHJfdW5pb24gc29ja2FkZHI7CisgICAgICAgICAgICAgICAgc29ja2xlbl90IGw7CisKKyAgICAgICAgICAgICAgICBtZW1zZXQoJnNvY2thZGRyLCAwLCBzaXplb2Yoc29ja2FkZHIpKTsKKyAgICAgICAgICAgICAgICBsID0gc2l6ZW9mKHNvY2thZGRyKTsKKworICAgICAgICAgICAgICAgIGlmIChnZXRzb2NrbmFtZShmZCwgJnNvY2thZGRyLnNhLCAmbCkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgICAgICAgICAgICAgIGlmIChsIDwgc2l6ZW9mKHNhX2ZhbWlseV90KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHNvY2thZGRyLnNhLnNhX2ZhbWlseSA9PSBmYW1pbHk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMTsKK30KKworaW50IHNkX2lzX3NvY2tldF9pbmV0KGludCBmZCwgaW50IGZhbWlseSwgaW50IHR5cGUsIGludCBsaXN0ZW5pbmcsIHVpbnQxNl90IHBvcnQpIHsKKyAgICAgICAgdW5pb24gc29ja2FkZHJfdW5pb24gc29ja2FkZHI7CisgICAgICAgIHNvY2tsZW5fdCBsOworICAgICAgICBpbnQgcjsKKworICAgICAgICBpZiAoZmFtaWx5ICE9IDAgJiYgZmFtaWx5ICE9IEFGX0lORVQgJiYgZmFtaWx5ICE9IEFGX0lORVQ2KQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgICAgIGlmICgociA9IHNkX2lzX3NvY2tldF9pbnRlcm5hbChmZCwgdHlwZSwgbGlzdGVuaW5nKSkgPD0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcjsKKworICAgICAgICBtZW1zZXQoJnNvY2thZGRyLCAwLCBzaXplb2Yoc29ja2FkZHIpKTsKKyAgICAgICAgbCA9IHNpemVvZihzb2NrYWRkcik7CisKKyAgICAgICAgaWYgKGdldHNvY2tuYW1lKGZkLCAmc29ja2FkZHIuc2EsICZsKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgICAgICBpZiAobCA8IHNpemVvZihzYV9mYW1pbHlfdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgaWYgKHNvY2thZGRyLnNhLnNhX2ZhbWlseSAhPSBBRl9JTkVUICYmCisgICAgICAgICAgICBzb2NrYWRkci5zYS5zYV9mYW1pbHkgIT0gQUZfSU5FVDYpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgaWYgKGZhbWlseSA+IDApCisgICAgICAgICAgICAgICAgaWYgKHNvY2thZGRyLnNhLnNhX2ZhbWlseSAhPSBmYW1pbHkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAocG9ydCA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoc29ja2FkZHIuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHRvbnMocG9ydCkgPT0gc29ja2FkZHIuaW40LnNpbl9wb3J0OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobCA8IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBodG9ucyhwb3J0KSA9PSBzb2NrYWRkci5pbjYuc2luNl9wb3J0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAxOworfQorCitpbnQgc2RfaXNfc29ja2V0X3VuaXgoaW50IGZkLCBpbnQgdHlwZSwgaW50IGxpc3RlbmluZywgY29uc3QgY2hhciAqcGF0aCwgc2l6ZV90IGxlbmd0aCkgeworICAgICAgICB1bmlvbiBzb2NrYWRkcl91bmlvbiBzb2NrYWRkcjsKKyAgICAgICAgc29ja2xlbl90IGw7CisgICAgICAgIGludCByOworCisgICAgICAgIGlmICgociA9IHNkX2lzX3NvY2tldF9pbnRlcm5hbChmZCwgdHlwZSwgbGlzdGVuaW5nKSkgPD0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcjsKKworICAgICAgICBtZW1zZXQoJnNvY2thZGRyLCAwLCBzaXplb2Yoc29ja2FkZHIpKTsKKyAgICAgICAgbCA9IHNpemVvZihzb2NrYWRkcik7CisKKyAgICAgICAgaWYgKGdldHNvY2tuYW1lKGZkLCAmc29ja2FkZHIuc2EsICZsKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgICAgICBpZiAobCA8IHNpemVvZihzYV9mYW1pbHlfdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgaWYgKHNvY2thZGRyLnNhLnNhX2ZhbWlseSAhPSBBRl9VTklYKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGlmIChwYXRoKSB7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBhdGgpOworCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgLyogVW5uYW1lZCBzb2NrZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsID09IHNpemVvZihzYV9mYW1pbHlfdCk7CisKKyAgICAgICAgICAgICAgICBpZiAocGF0aFswXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vcm1hbCBwYXRoIHNvY2tldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsID49IHNpemVvZihzYV9mYW1pbHlfdCkgKyBsZW5ndGggKyAxKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jbXAocGF0aCwgc29ja2FkZHIudW4uc3VuX3BhdGgsIGxlbmd0aCsxKSA9PSAwOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFic3RyYWN0IG5hbWVzcGFjZSBzb2NrZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobCA9PSBzaXplb2Yoc2FfZmFtaWx5X3QpICsgbGVuZ3RoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jbXAocGF0aCwgc29ja2FkZHIudW4uc3VuX3BhdGgsIGxlbmd0aCkgPT0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAxOworfQorCitpbnQgc2Rfbm90aWZ5KGludCB1bnNldF9lbnZpcm9ubWVudCwgY29uc3QgY2hhciAqc3RhdGUpIHsKKyNpZiBkZWZpbmVkKERJU0FCTEVfU1lTVEVNRCkgfHwgIWRlZmluZWQoX19saW51eF9fKSB8fCAhZGVmaW5lZChTT0NLX0NMT0VYRUMpCisgICAgICAgIHJldHVybiAwOworI2Vsc2UKKyAgICAgICAgaW50IGZkID0gLTEsIHI7CisgICAgICAgIHN0cnVjdCBtc2doZHIgbXNnaGRyOworICAgICAgICBzdHJ1Y3QgaW92ZWMgaW92ZWM7CisgICAgICAgIHVuaW9uIHNvY2thZGRyX3VuaW9uIHNvY2thZGRyOworICAgICAgICBjb25zdCBjaGFyICplOworCisgICAgICAgIGlmICghc3RhdGUpIHsKKyAgICAgICAgICAgICAgICByID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghKGUgPSBnZXRlbnYoIk5PVElGWV9TT0NLRVQiKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgLyogTXVzdCBiZSBhbiBhYnN0cmFjdCBzb2NrZXQsIG9yIGFuIGFic29sdXRlIHBhdGggKi8KKyAgICAgICAgaWYgKChlWzBdICE9ICdAJyAmJiBlWzBdICE9ICcvJykgfHwgZVsxXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgciA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgZ290byBmaW5pc2g7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGZkID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfREdSQU18U09DS19DTE9FWEVDLCAwKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgciA9IC1lcnJubzsKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgfQorCisgICAgICAgIG1lbXNldCgmc29ja2FkZHIsIDAsIHNpemVvZihzb2NrYWRkcikpOworICAgICAgICBzb2NrYWRkci5zYS5zYV9mYW1pbHkgPSBBRl9VTklYOworICAgICAgICBzdHJuY3B5KHNvY2thZGRyLnVuLnN1bl9wYXRoLCBlLCBzaXplb2Yoc29ja2FkZHIudW4uc3VuX3BhdGgpKTsKKworICAgICAgICBpZiAoc29ja2FkZHIudW4uc3VuX3BhdGhbMF0gPT0gJ0AnKQorICAgICAgICAgICAgICAgIHNvY2thZGRyLnVuLnN1bl9wYXRoWzBdID0gMDsKKworICAgICAgICBtZW1zZXQoJmlvdmVjLCAwLCBzaXplb2YoaW92ZWMpKTsKKyAgICAgICAgaW92ZWMuaW92X2Jhc2UgPSAoY2hhciopIHN0YXRlOworICAgICAgICBpb3ZlYy5pb3ZfbGVuID0gc3RybGVuKHN0YXRlKTsKKworICAgICAgICBtZW1zZXQoJm1zZ2hkciwgMCwgc2l6ZW9mKG1zZ2hkcikpOworICAgICAgICBtc2doZHIubXNnX25hbWUgPSAmc29ja2FkZHI7CisgICAgICAgIG1zZ2hkci5tc2dfbmFtZWxlbiA9IHNpemVvZihzYV9mYW1pbHlfdCkgKyBzdHJsZW4oZSk7CisKKyAgICAgICAgaWYgKG1zZ2hkci5tc2dfbmFtZWxlbiA+IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdW4pKQorICAgICAgICAgICAgICAgIG1zZ2hkci5tc2dfbmFtZWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdW4pOworCisgICAgICAgIG1zZ2hkci5tc2dfaW92ID0gJmlvdmVjOworICAgICAgICBtc2doZHIubXNnX2lvdmxlbiA9IDE7CisKKyAgICAgICAgaWYgKHNlbmRtc2coZmQsICZtc2doZHIsIE1TR19OT1NJR05BTCkgPCAwKSB7CisgICAgICAgICAgICAgICAgciA9IC1lcnJubzsKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgfQorCisgICAgICAgIHIgPSAxOworCitmaW5pc2g6CisgICAgICAgIGlmICh1bnNldF9lbnZpcm9ubWVudCkKKyAgICAgICAgICAgICAgICB1bnNldGVudigiTk9USUZZX1NPQ0tFVCIpOworCisgICAgICAgIGlmIChmZCA+PSAwKQorICAgICAgICAgICAgICAgIGNsb3NlKGZkKTsKKworICAgICAgICByZXR1cm4gcjsKKyNlbmRpZgorfQorCitpbnQgc2Rfbm90aWZ5ZihpbnQgdW5zZXRfZW52aXJvbm1lbnQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSB7CisjaWYgZGVmaW5lZChESVNBQkxFX1NZU1RFTUQpIHx8ICFkZWZpbmVkKF9fbGludXhfXykKKyAgICAgICAgcmV0dXJuIDA7CisjZWxzZQorICAgICAgICB2YV9saXN0IGFwOworICAgICAgICBjaGFyICpwID0gTlVMTDsKKyAgICAgICAgaW50IHI7CisKKyAgICAgICAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisgICAgICAgIHIgPSB2YXNwcmludGYoJnAsIGZvcm1hdCwgYXApOworICAgICAgICB2YV9lbmQoYXApOworCisgICAgICAgIGlmIChyIDwgMCB8fCAhcCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKworICAgICAgICByID0gc2Rfbm90aWZ5KHVuc2V0X2Vudmlyb25tZW50LCBwKTsKKyAgICAgICAgZnJlZShwKTsKKworICAgICAgICByZXR1cm4gcjsKKyNlbmRpZgorfQorCitpbnQgc2RfYm9vdGVkKHZvaWQpIHsKKyNpZiBkZWZpbmVkKERJU0FCTEVfU1lTVEVNRCkgfHwgIWRlZmluZWQoX19saW51eF9fKQorICAgICAgICByZXR1cm4gMDsKKyNlbHNlCisKKyAgICAgICAgc3RydWN0IHN0YXQgYSwgYjsKKworICAgICAgICAvKiBXZSBzaW1wbHkgdGVzdCB3aGV0aGVyIHRoZSBzeXN0ZW1kIGNncm91cCBoaWVyYXJjaHkgaXMKKyAgICAgICAgICogbW91bnRlZCAqLworCisgICAgICAgIGlmIChsc3RhdCgiL3N5cy9mcy9jZ3JvdXAiLCAmYSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGlmIChsc3RhdCgiL3N5cy9mcy9jZ3JvdXAvc3lzdGVtZCIsICZiKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgcmV0dXJuIGEuc3RfZGV2ICE9IGIuc3RfZGV2OworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9kYnVzL2RidXMvc2QtZGFlbW9uLmggYi9kYnVzL2RidXMvc2QtZGFlbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY4Yzk2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy9zZC1kYWVtb24uaApAQCAtMCwwICsxLDI1NyBAQAorLyotKi0gTW9kZTogQzsgYy1iYXNpYy1vZmZzZXQ6IDg7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0qLworCisjaWZuZGVmIGZvb3NkZGFlbW9uaGZvbworI2RlZmluZSBmb29zZGRhZW1vbmhmb28KKworLyoqKgorICBDb3B5cmlnaHQgMjAxMCBMZW5uYXJ0IFBvZXR0ZXJpbmcKKworICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcworICAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAorICBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorICBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLAorICBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAgU09GVFdBUkUuCisqKiovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgIFJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBhIGZldyBzeXN0ZW1kIHJlbGF0ZWQgaW50ZXJmYWNlcyBmb3IKKyAgd3JpdGluZyBkYWVtb25zLiBUaGVzZSBpbnRlcmZhY2VzIGFyZSB0cml2aWFsIHRvIGltcGxlbWVudC4gVG8KKyAgc2ltcGxpZnkgcG9ydGluZyB3ZSBwcm92aWRlIHRoaXMgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLgorICBBcHBsaWNhdGlvbnMgYXJlIHdlbGNvbWUgdG8gcmVpbXBsZW1lbnQgdGhlIGFsZ29yaXRobXMgZGVzY3JpYmVkCisgIGhlcmUgaWYgdGhleSBkbyBub3Qgd2FudCB0byBpbmNsdWRlIHRoZXNlIHR3byBzb3VyY2UgZmlsZXMuCisKKyAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbmFsaXR5IGlzIHByb3ZpZGVkOgorCisgIC0gU3VwcG9ydCBmb3IgbG9nZ2luZyB3aXRoIGxvZyBsZXZlbHMgb24gc3RkZXJyCisgIC0gRmlsZSBkZXNjcmlwdG9yIHBhc3NpbmcgZm9yIHNvY2tldC1iYXNlZCBhY3RpdmF0aW9uCisgIC0gRGFlbW9uIHN0YXJ0dXAgYW5kIHN0YXR1cyBub3RpZmljYXRpb24KKyAgLSBEZXRlY3Rpb24gb2Ygc3lzdGVtZCBib290cworCisgIFlvdSBtYXkgY29tcGlsZSB0aGlzIHdpdGggLURESVNBQkxFX1NZU1RFTUQgdG8gZGlzYWJsZSBzeXN0ZW1kCisgIHN1cHBvcnQuIFRoaXMgbWFrZXMgYWxsIHRob3NlIGNhbGxzIE5PUHMgdGhhdCBhcmUgZGlyZWN0bHkgcmVsYXRlZCB0bworICBzeXN0ZW1kIChpLmUuIG9ubHkgc2RfaXNfeHh4KCkgd2lsbCBzdGF5IHVzZWZ1bCkuCisKKyAgU2luY2UgdGhpcyBpcyBkcm9wLWluIGNvZGUgd2UgZG9uJ3Qgd2FudCBhbnkgb2Ygb3VyIHN5bWJvbHMgdG8gYmUKKyAgZXhwb3J0ZWQgaW4gYW55IGNhc2UuIEhlbmNlIHdlIGRlY2xhcmUgaGlkZGVuIHZpc2liaWxpdHkgZm9yIGFsbCBvZgorICB0aGVtLgorCisgIFlvdSBtYXkgZmluZCBhbiB1cC10by1kYXRlIHZlcnNpb24gb2YgdGhlc2Ugc291cmNlIGZpbGVzIG9ubGluZToKKworICBodHRwOi8vY2dpdC5mcmVlZGVza3RvcC5vcmcvc3lzdGVtZC9wbGFpbi9zcmMvc2QtZGFlbW9uLmgKKyAgaHR0cDovL2NnaXQuZnJlZWRlc2t0b3Aub3JnL3N5c3RlbWQvcGxhaW4vc3JjL3NkLWRhZW1vbi5jCisKKyAgVGhpcyBzaG91bGQgY29tcGlsZSBvbiBub24tTGludXggc3lzdGVtcywgdG9vLCBidXQgd2l0aCB0aGUKKyAgZXhjZXB0aW9uIG9mIHRoZSBzZF9pc194eHgoKSBjYWxscyBhbGwgZnVuY3Rpb25zIHdpbGwgYmVjb21lIE5PUHMuCisKKyAgU2VlIHNkLWRhZW1vbig3KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyovCisKKyNpZiBfX0dOVUNfXyA+PSA0CisjZGVmaW5lIF9zZF9wcmludGZfYXR0cl8oYSxiKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIGEsIGIpKSkKKyNkZWZpbmUgX3NkX2hpZGRlbl8gX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkoImhpZGRlbiIpKSkKKyNlbHNlCisjZGVmaW5lIF9zZF9wcmludGZfYXR0cl8oYSxiKQorI2RlZmluZSBfc2RfaGlkZGVuXworI2VuZGlmCisKKy8qCisgIExvZyBsZXZlbHMgZm9yIHVzYWdlIG9uIHN0ZGVycjoKKworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBTRF9OT1RJQ0UgIkhlbGxvIFdvcmxkIVxuIik7CisKKyAgVGhpcyBpcyBzaW1pbGFyIHRvIHByaW50aygpIHVzYWdlIGluIHRoZSBrZXJuZWwuCisqLworI2RlZmluZSBTRF9FTUVSRyAgICI8MD4iICAvKiBzeXN0ZW0gaXMgdW51c2FibGUgKi8KKyNkZWZpbmUgU0RfQUxFUlQgICAiPDE+IiAgLyogYWN0aW9uIG11c3QgYmUgdGFrZW4gaW1tZWRpYXRlbHkgKi8KKyNkZWZpbmUgU0RfQ1JJVCAgICAiPDI+IiAgLyogY3JpdGljYWwgY29uZGl0aW9ucyAqLworI2RlZmluZSBTRF9FUlIgICAgICI8Mz4iICAvKiBlcnJvciBjb25kaXRpb25zICovCisjZGVmaW5lIFNEX1dBUk5JTkcgIjw0PiIgIC8qIHdhcm5pbmcgY29uZGl0aW9ucyAqLworI2RlZmluZSBTRF9OT1RJQ0UgICI8NT4iICAvKiBub3JtYWwgYnV0IHNpZ25pZmljYW50IGNvbmRpdGlvbiAqLworI2RlZmluZSBTRF9JTkZPICAgICI8Nj4iICAvKiBpbmZvcm1hdGlvbmFsICovCisjZGVmaW5lIFNEX0RFQlVHICAgIjw3PiIgIC8qIGRlYnVnLWxldmVsIG1lc3NhZ2VzICovCisKKy8qIFRoZSBmaXJzdCBwYXNzZWQgZmlsZSBkZXNjcmlwdG9yIGlzIGZkIDMgKi8KKyNkZWZpbmUgU0RfTElTVEVOX0ZEU19TVEFSVCAzCisKKy8qCisgIFJldHVybnMgaG93IG1hbnkgZmlsZSBkZXNjcmlwdG9ycyBoYXZlIGJlZW4gcGFzc2VkLCBvciBhIG5lZ2F0aXZlCisgIGVycm5vIGNvZGUgb24gZmFpbHVyZS4gT3B0aW9uYWxseSwgcmVtb3ZlcyB0aGUgJExJU1RFTl9GRFMgYW5kCisgICRMSVNURU5fUElEIGZpbGUgZGVzY3JpcHRvcnMgZnJvbSB0aGUgZW52aXJvbm1lbnQgKHJlY29tbWVuZGVkLCBidXQKKyAgcHJvYmxlbWF0aWMgaW4gdGhyZWFkZWQgZW52aXJvbm1lbnRzKS4gSWYgciBpcyB0aGUgcmV0dXJuIHZhbHVlIG9mCisgIHRoaXMgZnVuY3Rpb24geW91J2xsIGZpbmQgdGhlIGZpbGUgZGVzY3JpcHRvcnMgcGFzc2VkIGFzIGZkcworICBTRF9MSVNURU5fRkRTX1NUQVJUIHRvIFNEX0xJU1RFTl9GRFNfU1RBUlQrci0xLiBSZXR1cm5zIGEgbmVnYXRpdmUKKyAgZXJybm8gc3R5bGUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLiBUaGlzIGZ1bmN0aW9uIGNhbGwgZW5zdXJlcyB0aGF0CisgIHRoZSBGRF9DTE9FWEVDIGZsYWcgaXMgc2V0IGZvciB0aGUgcGFzc2VkIGZpbGUgZGVzY3JpcHRvcnMsIHRvIG1ha2UKKyAgc3VyZSB0aGV5IGFyZSBub3QgcGFzc2VkIG9uIHRvIGNoaWxkIHByb2Nlc3Nlcy4gSWYgRkRfQ0xPRVhFQyBzaGFsbAorICBub3QgYmUgc2V0LCB0aGUgY2FsbGVyIG5lZWRzIHRvIHVuc2V0IGl0IGFmdGVyIHRoaXMgY2FsbCBmb3IgYWxsIGZpbGUKKyAgZGVzY3JpcHRvcnMgdGhhdCBhcmUgdXNlZC4KKworICBTZWUgc2RfbGlzdGVuX2ZkcygzKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyovCitpbnQgc2RfbGlzdGVuX2ZkcyhpbnQgdW5zZXRfZW52aXJvbm1lbnQpIF9zZF9oaWRkZW5fOworCisvKgorICBIZWxwZXIgY2FsbCBmb3IgaWRlbnRpZnlpbmcgYSBwYXNzZWQgZmlsZSBkZXNjcmlwdG9yLiBSZXR1cm5zIDEgaWYKKyAgdGhlIGZpbGUgZGVzY3JpcHRvciBpcyBhIEZJRk8gaW4gdGhlIGZpbGUgc3lzdGVtIHN0b3JlZCB1bmRlciB0aGUKKyAgc3BlY2lmaWVkIHBhdGgsIDAgb3RoZXJ3aXNlLiBJZiBwYXRoIGlzIE5VTEwgYSBwYXRoIG5hbWUgY2hlY2sgd2lsbAorICBub3QgYmUgZG9uZSBhbmQgdGhlIGNhbGwgb25seSB2ZXJpZmllcyBpZiB0aGUgZmlsZSBkZXNjcmlwdG9yCisgIHJlZmVycyB0byBhIEZJRk8uIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJubyBzdHlsZSBlcnJvciBjb2RlIG9uCisgIGZhaWx1cmUuCisKKyAgU2VlIHNkX2lzX2ZpZm8oMykgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisqLworaW50IHNkX2lzX2ZpZm8oaW50IGZkLCBjb25zdCBjaGFyICpwYXRoKSBfc2RfaGlkZGVuXzsKKworLyoKKyAgSGVscGVyIGNhbGwgZm9yIGlkZW50aWZ5aW5nIGEgcGFzc2VkIGZpbGUgZGVzY3JpcHRvci4gUmV0dXJucyAxIGlmCisgIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgYSBzb2NrZXQgb2YgdGhlIHNwZWNpZmllZCBmYW1pbHkgKEFGX0lORVQsCisgIC4uLikgYW5kIHR5cGUgKFNPQ0tfREdSQU0sIFNPQ0tfU1RSRUFNLCAuLi4pLCAwIG90aGVyd2lzZS4gSWYKKyAgZmFtaWx5IGlzIDAgYSBzb2NrZXQgZmFtaWx5IGNoZWNrIHdpbGwgbm90IGJlIGRvbmUuIElmIHR5cGUgaXMgMCBhCisgIHNvY2tldCB0eXBlIGNoZWNrIHdpbGwgbm90IGJlIGRvbmUgYW5kIHRoZSBjYWxsIG9ubHkgdmVyaWZpZXMgaWYKKyAgdGhlIGZpbGUgZGVzY3JpcHRvciByZWZlcnMgdG8gYSBzb2NrZXQuIElmIGxpc3RlbmluZyBpcyA+IDAgaXQgaXMKKyAgdmVyaWZpZWQgdGhhdCB0aGUgc29ja2V0IGlzIGluIGxpc3RlbmluZyBtb2RlLiAoaS5lLiBsaXN0ZW4oKSBoYXMKKyAgYmVlbiBjYWxsZWQpIElmIGxpc3RlbmluZyBpcyA9PSAwIGl0IGlzIHZlcmlmaWVkIHRoYXQgdGhlIHNvY2tldCBpcworICBub3QgaW4gbGlzdGVuaW5nIG1vZGUuIElmIGxpc3RlbmluZyBpcyA8IDAgbm8gbGlzdGVuaW5nIG1vZGUgY2hlY2sKKyAgaXMgZG9uZS4gUmV0dXJucyBhIG5lZ2F0aXZlIGVycm5vIHN0eWxlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKworICBTZWUgc2RfaXNfc29ja2V0KDMpIGZvciBtb3JlIGluZm9ybWF0aW9uLgorKi8KK2ludCBzZF9pc19zb2NrZXQoaW50IGZkLCBpbnQgZmFtaWx5LCBpbnQgdHlwZSwgaW50IGxpc3RlbmluZykgX3NkX2hpZGRlbl87CisKKy8qCisgIEhlbHBlciBjYWxsIGZvciBpZGVudGlmeWluZyBhIHBhc3NlZCBmaWxlIGRlc2NyaXB0b3IuIFJldHVybnMgMSBpZgorICB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzIGFuIEludGVybmV0IHNvY2tldCwgb2YgdGhlIHNwZWNpZmllZCBmYW1pbHkKKyAgKGVpdGhlciBBRl9JTkVUIG9yIEFGX0lORVQ2KSBhbmQgdGhlIHNwZWNpZmllZCB0eXBlIChTT0NLX0RHUkFNLAorICBTT0NLX1NUUkVBTSwgLi4uKSwgMCBvdGhlcndpc2UuIElmIHZlcnNpb24gaXMgMCBhIHByb3RvY29sIHZlcnNpb24KKyAgY2hlY2sgaXMgbm90IGRvbmUuIElmIHR5cGUgaXMgMCBhIHNvY2tldCB0eXBlIGNoZWNrIHdpbGwgbm90IGJlCisgIGRvbmUuIElmIHBvcnQgaXMgMCBhIHNvY2tldCBwb3J0IGNoZWNrIHdpbGwgbm90IGJlIGRvbmUuIFRoZQorICBsaXN0ZW5pbmcgZmxhZyBpcyB1c2VkIHRoZSBzYW1lIHdheSBhcyBpbiBzZF9pc19zb2NrZXQoKS4gUmV0dXJucyBhCisgIG5lZ2F0aXZlIGVycm5vIHN0eWxlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKworICBTZWUgc2RfaXNfc29ja2V0X2luZXQoMykgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisqLworaW50IHNkX2lzX3NvY2tldF9pbmV0KGludCBmZCwgaW50IGZhbWlseSwgaW50IHR5cGUsIGludCBsaXN0ZW5pbmcsIHVpbnQxNl90IHBvcnQpIF9zZF9oaWRkZW5fOworCisvKgorICBIZWxwZXIgY2FsbCBmb3IgaWRlbnRpZnlpbmcgYSBwYXNzZWQgZmlsZSBkZXNjcmlwdG9yLiBSZXR1cm5zIDEgaWYKKyAgdGhlIGZpbGUgZGVzY3JpcHRvciBpcyBhbiBBRl9VTklYIHNvY2tldCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUKKyAgKFNPQ0tfREdSQU0sIFNPQ0tfU1RSRUFNLCAuLi4pIGFuZCBwYXRoLCAwIG90aGVyd2lzZS4gSWYgdHlwZSBpcyAwCisgIGEgc29ja2V0IHR5cGUgY2hlY2sgd2lsbCBub3QgYmUgZG9uZS4gSWYgcGF0aCBpcyBOVUxMIGEgc29ja2V0IHBhdGgKKyAgY2hlY2sgd2lsbCBub3QgYmUgZG9uZS4gRm9yIG5vcm1hbCBBRl9VTklYIHNvY2tldHMgc2V0IGxlbmd0aCB0bworICAwLiBGb3IgYWJzdHJhY3QgbmFtZXNwYWNlIHNvY2tldHMgc2V0IGxlbmd0aCB0byB0aGUgbGVuZ3RoIG9mIHRoZQorICBzb2NrZXQgbmFtZSAoaW5jbHVkaW5nIHRoZSBpbml0aWFsIDAgYnl0ZSksIGFuZCBwYXNzIHRoZSBmdWxsCisgIHNvY2tldCBwYXRoIGluIHBhdGggKGluY2x1ZGluZyB0aGUgaW5pdGlhbCAwIGJ5dGUpLiBUaGUgbGlzdGVuaW5nCisgIGZsYWcgaXMgdXNlZCB0aGUgc2FtZSB3YXkgYXMgaW4gc2RfaXNfc29ja2V0KCkuIFJldHVybnMgYSBuZWdhdGl2ZQorICBlcnJubyBzdHlsZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisKKyAgU2VlIHNkX2lzX3NvY2tldF91bml4KDMpIGZvciBtb3JlIGluZm9ybWF0aW9uLgorKi8KK2ludCBzZF9pc19zb2NrZXRfdW5peChpbnQgZmQsIGludCB0eXBlLCBpbnQgbGlzdGVuaW5nLCBjb25zdCBjaGFyICpwYXRoLCBzaXplX3QgbGVuZ3RoKSBfc2RfaGlkZGVuXzsKKworLyoKKyAgSW5mb3JtcyBzeXN0ZW1kIGFib3V0IGNoYW5nZWQgZGFlbW9uIHN0YXRlLiBUaGlzIHRha2VzIGEgbnVtYmVyIG9mCisgIG5ld2xpbmUgc2VwZXJhdGVkIGVudmlyb25tZW50LXN0eWxlIHZhcmlhYmxlIGFzc2lnbm1lbnRzIGluIGEKKyAgc3RyaW5nLiBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBhcmUga25vd246CisKKyAgICAgUkVBRFk9MSAgICAgIFRlbGxzIHN5c3RlbWQgdGhhdCBkYWVtb24gc3RhcnR1cCBpcyBmaW5pc2hlZCAob25seQorICAgICAgICAgICAgICAgICAgcmVsZXZhbnQgZm9yIHNlcnZpY2VzIG9mIFR5cGU9bm90aWZ5KS4gVGhlIHBhc3NlZAorICAgICAgICAgICAgICAgICAgYXJndW1lbnQgaXMgYSBib29sZWFuICIxIiBvciAiMCIuIFNpbmNlIHRoZXJlIGlzCisgICAgICAgICAgICAgICAgICBsaXR0bGUgdmFsdWUgaW4gc2lnbmFsbGluZyBub24tcmVhZGluZXNzIHRoZSBvbmx5CisgICAgICAgICAgICAgICAgICB2YWx1ZSBkYWVtb25zIHNob3VsZCBzZW5kIGlzICJSRUFEWT0xIi4KKworICAgICBTVEFUVVM9Li4uICAgUGFzc2VzIGEgc2luZ2xlLWxpbmUgc3RhdHVzIHN0cmluZyBiYWNrIHRvIHN5c3RlbWQKKyAgICAgICAgICAgICAgICAgIHRoYXQgZGVzY3JpYmVzIHRoZSBkYWVtb24gc3RhdGUuIFRoaXMgaXMgZnJlZS1mcm9tCisgICAgICAgICAgICAgICAgICBhbmQgY2FuIGJlIHVzZWQgZm9yIHZhcmlvdXMgcHVycG9zZXM6IGdlbmVyYWwgc3RhdGUKKyAgICAgICAgICAgICAgICAgIGZlZWRiYWNrLCBmc2NrLWxpa2UgcHJvZ3JhbXMgY291bGQgcGFzcyBjb21wbGV0aW9uCisgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlcyBhbmQgZmFpbGluZyBwcm9ncmFtcyBjb3VsZCBwYXNzIGEgaHVtYW4KKyAgICAgICAgICAgICAgICAgIHJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuIEV4YW1wbGU6ICJTVEFUVVM9Q29tcGxldGVkCisgICAgICAgICAgICAgICAgICA2NiUgb2YgZmlsZSBzeXN0ZW0gY2hlY2suLi4iCisKKyAgICAgRVJSTk89Li4uICAgIElmIGEgZGFlbW9uIGZhaWxzLCB0aGUgZXJybm8tc3R5bGUgZXJyb3IgY29kZSwKKyAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZCBhcyBzdHJpbmcuIEV4YW1wbGU6ICJFUlJOTz0yIiBmb3IgRU5PRU5ULgorCisgICAgIEJVU0VSUk9SPS4uLiBJZiBhIGRhZW1vbiBmYWlscywgdGhlIEQtQnVzIGVycm9yLXN0eWxlIGVycm9yCisgICAgICAgICAgICAgICAgICBjb2RlLiBFeGFtcGxlOiAiQlVTRVJST1I9b3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuVGltZWRPdXQiCisKKyAgICAgTUFJTlBJRD0uLi4gIFRoZSBtYWluIHBpZCBvZiBhIGRhZW1vbiwgaW4gY2FzZSBzeXN0ZW1kIGRpZCBub3QKKyAgICAgICAgICAgICAgICAgIGZvcmsgb2ZmIHRoZSBwcm9jZXNzIGl0c2VsZi4gRXhhbXBsZTogIk1BSU5QSUQ9NDcxMSIKKworICBEYWVtb25zIGNhbiBjaG9vc2UgdG8gc2VuZCBhZGRpdGlvbmFsIHZhcmlhYmxlcy4gSG93ZXZlciwgaXQgaXMKKyAgcmVjb21tZW5lZCB0byBwcmVmaXggdmFyaWFibGUgbmFtZXMgbm90IGxpc3RlZCBhYm92ZSB3aXRoIFhfLgorCisgIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJuby1zdHlsZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuIFJldHVybnMgPiAwCisgIGlmIHN5c3RlbWQgY291bGQgYmUgbm90aWZpZWQsIDAgaWYgaXQgY291bGRuJ3QgcG9zc2libHkgYmVjYXVzZQorICBzeXN0ZW1kIGlzIG5vdCBydW5uaW5nLgorCisgIEV4YW1wbGU6IFdoZW4gYSBkYWVtb24gZmluaXNoZWQgc3RhcnRpbmcgdXAsIGl0IGNvdWxkIGlzc3VlIHRoaXMKKyAgY2FsbCB0byBub3RpZnkgc3lzdGVtZCBhYm91dCBpdDoKKworICAgICBzZF9ub3RpZnkoMCwgIlJFQURZPTEiKTsKKworICBTZWUgc2Rfbm90aWZ5ZigpIGZvciBtb3JlIGNvbXBsZXRlIGV4YW1wbGVzLgorCisgIFNlZSBzZF9ub3RpZnkoMykgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisqLworaW50IHNkX25vdGlmeShpbnQgdW5zZXRfZW52aXJvbm1lbnQsIGNvbnN0IGNoYXIgKnN0YXRlKSBfc2RfaGlkZGVuXzsKKworLyoKKyAgU2ltaWxhciB0byBzZF9ub3RpZnkoKSBidXQgdGFrZXMgYSBmb3JtYXQgc3RyaW5nLgorCisgIEV4YW1wbGUgMTogQSBkYWVtb24gY291bGQgc2VuZCB0aGUgZm9sbG93aW5nIGFmdGVyIGluaXRpYWxpemF0aW9uOgorCisgICAgIHNkX25vdGlmeWYoMCwgIlJFQURZPTFcbiIKKyAgICAgICAgICAgICAgICAgICAiU1RBVFVTPVByb2Nlc3NpbmcgcmVxdWVzdHMuLi5cbiIKKyAgICAgICAgICAgICAgICAgICAiTUFJTlBJRD0lbHUiLAorICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBnZXRwaWQoKSk7CisKKyAgRXhhbXBsZSAyOiBBIGRhZW1vbiBjb3VsZCBzZW5kIHRoZSBmb2xsb3dpbmcgc2hvcnRseSBiZWZvcmUKKyAgZXhpdGluZywgb24gZmFpbHVyZToKKworICAgICBzZF9ub3RpZnlmKDAsICJTVEFUVVM9RmFpbGVkIHRvIHN0YXJ0IHVwOiAlc1xuIgorICAgICAgICAgICAgICAgICAgICJFUlJOTz0laSIsCisgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pLAorICAgICAgICAgICAgICAgICAgIGVycm5vKTsKKworICBTZWUgc2Rfbm90aWZ5ZigzKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyovCitpbnQgc2Rfbm90aWZ5ZihpbnQgdW5zZXRfZW52aXJvbm1lbnQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSBfc2RfcHJpbnRmX2F0dHJfKDIsMykgX3NkX2hpZGRlbl87CisKKy8qCisgIFJldHVybnMgPiAwIGlmIHRoZSBzeXN0ZW0gd2FzIGJvb3RlZCB3aXRoIHN5c3RlbWQuIFJldHVybnMgPCAwIG9uCisgIGVycm9yLiBSZXR1cm5zIDAgaWYgdGhlIHN5c3RlbSB3YXMgbm90IGJvb3RlZCB3aXRoIHN5c3RlbWQuIE5vdGUKKyAgdGhhdCBhbGwgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZSBoYW5kbGUgbm9uLXN5c3RlbWQgYm9vdHMganVzdAorICBmaW5lLiBZb3Ugc2hvdWxkIE5PVCBwcm90ZWN0IHRoZW0gd2l0aCBhIGNhbGwgdG8gdGhpcyBmdW5jdGlvbi4gQWxzbworICBub3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciB0aGUgc3lzdGVtLCBub3QgdGhlIHVzZXIKKyAgc2Vzc2lvbiBpcyBjb250cm9sbGVkIGJ5IHN5c3RlbWQuIEhvd2V2ZXIgdGhlIGZ1bmN0aW9ucyBhYm92ZSB3b3JrCisgIGZvciBib3RoIHNlc3Npb24gYW5kIHN5c3RlbSBzZXJ2aWNlcy4KKworICBTZWUgc2RfYm9vdGVkKDMpIGZvciBtb3JlIGluZm9ybWF0aW9uLgorKi8KK2ludCBzZF9ib290ZWQodm9pZCkgX3NkX2hpZGRlbl87CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzL3ZlcnNpb25pbmZvLnJjLmluIGIvZGJ1cy9kYnVzL3ZlcnNpb25pbmZvLnJjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NDViMzkKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMvdmVyc2lvbmluZm8ucmMuaW4KQEAgLTAsMCArMSw1MiBAQAorLyogdmVyc2lvbmluZm8ucmMuaW4gLSBmb3IgZGJ1cworICogQ29weXJpZ2h0IChDKSAyMDA1IGcxMCBDb2RlIEdtYkgKKyAqIAorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IGFzIGEgc3BlY2lhbCBleGNlcHRpb24gdGhlIGF1dGhvciBnaXZlcworICogdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0IGV2ZW4gdGhlCisgKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworIAorLyogVGhpcyBmaWxlIGlzIHByb2Nlc3NlZCBieSBjb25maWd1cmUgdG8gY3JlYXRlIHZlcnNpb25pbmZvLnJjICovCisKKyNsaW5lIF9fTElORV9fICJ2ZXJzaW9uaW5mby5yYy5pbiIKKworI2luY2x1ZGUgPGFmeHJlcy5oPgorCisKK1ZTX1ZFUlNJT05fSU5GTyBWRVJTSU9OSU5GTworIEZJTEVWRVJTSU9OIEBCVUlMRF9GSUxFVkVSU0lPTkAKKyBQUk9EVUNUVkVSU0lPTiBAQlVJTERfRklMRVZFUlNJT05ACisgRklMRUZMQUdTTUFTSyAweDNmTAorI2lmZGVmIF9ERUJVRworIEZJTEVGTEFHUyAweDIxTAorI2Vsc2UKKyBGSUxFRkxBR1MgMHgyMEwKKyNlbmRpZgorIEZJTEVPUyAweDQwMDA0TAorIEZJTEVUWVBFIDB4MUwKKyBGSUxFU1VCVFlQRSAweDBMCitCRUdJTgorICAgIEJMT0NLICJTdHJpbmdGaWxlSW5mbyIKKyAgICBCRUdJTgorICAgICAgICBCTE9DSyAiMDQwOTA0YjAiCisgICAgICAgIEJFR0lOCisgICAgICAgICAgICBWQUxVRSAiQ29tbWVudHMiLCAiUHJvdmlkZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuXDAiCisgICAgICAgICAgICBWQUxVRSAiQ29tcGFueU5hbWUiLCAiRnJlZURlc2t0b3Aub3JnXDAiCisgICAgICAgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgImRidXMgLSBGcmVlRGVza3RvcCBtZXNzYWdlIGJ1cyBzeXN0ZW1cMCIKKyAgICAgICAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsICJAREJVU19WRVJTSU9OQFwwIgorICAgICAgICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICJkYnVzXDAiCisgICAgICAgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiQ29weXJpZ2h0IKkgMjAwOSBGcmVlRGVza3RvcC5vcmdcMCIKKyAgICAgICAgICAgIFZBTFVFICJMZWdhbFRyYWRlbWFya3MiLCAiXDAiCisgICAgICAgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsICJkYnVzLTEuZGxsXDAiCisgICAgICAgICAgICBWQUxVRSAiUHJpdmF0ZUJ1aWxkIiwgIlwwIgorICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgImRidXNcMCIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsICJAREJVU19WRVJTSU9OQFwwIgorICAgICAgICAgICAgVkFMVUUgIlNwZWNpYWxCdWlsZCIsICJAQlVJTERfVElNRVNUQU1QQFwwIgorICAgICAgICBFTkQKKyAgICBFTkQKK0VORAorCmRpZmYgLS1naXQgYS9kYnVzL2RvYy9NYWtlZmlsZS5hbSBiL2RidXMvZG9jL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNjU5ODcKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RvYy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE3NiBAQAorYXBpZGlyID0gQGh0bWxkaXJAL2FwaQorCisjIGF1dG9tYWtlIG5vcm1hbGx5IGFzc3VtZXMgdGhhdCBtYW4gcGFnZXMgYXJlIGdlbmVyYXRlZCBmaWxlczsKKyMgdGhlc2Ugb25lcyBhcmVuJ3QsIHNvIHdlIG5lZWQgdGhlIGRpc3RfIHByZWZpeCB0byBzYXkgdGhhdCB0aGV5J3JlCisjIHRoZWlyIG93biBzb3VyY2UgY29kZQorZGlzdF9tYW4xX01BTlMgPSBcCisJZGJ1cy1jbGVhbnVwLXNvY2tldHMuMSBcCisJZGJ1cy1sYXVuY2guMSBcCisJZGJ1cy1tb25pdG9yLjEgXAorCWRidXMtc2VuZC4xIFwKKwlkYnVzLXV1aWRnZW4uMQorCisjIG9uIHRoZSBvdGhlciBoYW5kLCB0aGlzIG9uZSBpcyBnZW5lcmF0ZWQKK21hbjFfTUFOUyA9IFwKKwlkYnVzLWRhZW1vbi4xCisKK01BTl9JTl9GSUxFUyA9IGRidXMtZGFlbW9uLjEuaW4KKworTUFOX0hUTUxfRklMRVMgPSBcCisJZGJ1cy1jbGVhbnVwLXNvY2tldHMuMS5odG1sIFwKKwlkYnVzLWRhZW1vbi4xLmh0bWwgXAorCWRidXMtbGF1bmNoLjEuaHRtbCBcCisJZGJ1cy1tb25pdG9yLjEuaHRtbCBcCisJZGJ1cy1zZW5kLjEuaHRtbCBcCisJZGJ1cy11dWlkZ2VuLjEuaHRtbAorCitEVERTID0gXAorCWJ1c2NvbmZpZy5kdGQgXAorCWludHJvc3BlY3QuZHRkCisKK2Rpc3RfZG9jX0RBVEEgPSBzeXN0ZW0tYWN0aXZhdGlvbi50eHQKKworIyB1cGxvYWRlZCBhbmQgZGlzdHJpYnV0ZWQsIGJ1dCBub3QgaW5zdGFsbGVkCitTVEFUSUNfRE9DUyA9IFwKKwlkYnVzLWZhcS54bWwgXAorCWRidXMtc3BlY2lmaWNhdGlvbi54bWwgXAorCWRidXMtdGVzdC1wbGFuLnhtbCBcCisJZGJ1cy10dXRvcmlhbC54bWwgXAorCWRjb3AtaG93dG8udHh0IFwKKwlpbnRyb3NwZWN0LnhzbCBcCisJJChEVERTKQorCitFWFRSQV9ESVNUID0gXAorCWZpbGUtYm9pbGVycGxhdGUuYyBcCisJZG94eWdlbl90b19kZXZoZWxwLnhzbCBcCisJJChTVEFUSUNfRE9DUykgXAorCSQoTUFOX0lOX0ZJTEVTKQorCitodG1sX0RBVEEgPQorCitkaXN0X2h0bWxfREFUQSA9CisKKyMgZGlhZ3JhbS5wbmcvZGlhZ3JhbS5zdmcgYXJlbid0IHJlYWxseSBIVE1MLCBidXQgbXVzdCBnbyBpbiB0aGUgc2FtZQorIyBkaXJlY3RvcnkgYXMgdGhlIEhUTUwgdG8gYXZvaWQgYnJva2VuIGxpbmtzCitTVEFUSUNfSFRNTCA9IFwKKwlkaWFncmFtLnBuZyBcCisJZGlhZ3JhbS5zdmcgXAorCSQoTlVMTCkKKworZGlzdF9odG1sX0RBVEEgKz0gJChTVEFUSUNfSFRNTCkKKworIyB3ZSBkaXN0cmlidXRlIHRoZXNlIGluIHRoZSB0YXJiYWxsIHNvIHVzZXJzIGRvbid0IG5lY2Vzc2FyaWx5IG5lZWQgeG1sdG8KK2Rpc3RfaHRtbF9EQVRBICs9ICQoWE1MVE9fT1VUUFVUKQorCitYTUxUT19PVVRQVVQ9CQkJCQlcCisJZGJ1cy1mYXEuaHRtbAkJCQlcCisJZGJ1cy1zcGVjaWZpY2F0aW9uLmh0bWwJCQlcCisJZGJ1cy10ZXN0LXBsYW4uaHRtbAkJCVwKKwlkYnVzLXR1dG9yaWFsLmh0bWwKKworaWYgREJVU19YTUxfRE9DU19FTkFCTEVECitkYnVzLXNwZWNpZmljYXRpb24uaHRtbDogZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbAorCSQoWE1MVE8pIGh0bWwtbm9jaHVua3MgJDwKKworZGJ1cy10ZXN0LXBsYW4uaHRtbDogZGJ1cy10ZXN0LXBsYW4ueG1sCisJJChYTUxUTykgaHRtbC1ub2NodW5rcyAkPAorCitkYnVzLXR1dG9yaWFsLmh0bWw6IGRidXMtdHV0b3JpYWwueG1sCisJJChYTUxUTykgaHRtbC1ub2NodW5rcyAkPAorCitkYnVzLWZhcS5odG1sOiBkYnVzLWZhcS54bWwKKwkkKFhNTFRPKSBodG1sLW5vY2h1bmtzICQ8CitlbmRpZgorCitpZiBEQlVTX0RPWFlHRU5fRE9DU19FTkFCTEVECithbGwtbG9jYWw6OiBkb3h5Z2VuLnN0YW1wCisKK2RveHlnZW4uc3RhbXA6ICQod2lsZGNhcmQgJCh0b3Bfc3JjZGlyKS9kYnVzLyouW2NoXSkKKwkkKEFNX1ZfR0VOKWNkICQodG9wX2J1aWxkZGlyKSAmJiBkb3h5Z2VuIERveHlmaWxlCisJQHRvdWNoICRACisKK2lmIERCVVNfSEFWRV9YU0xUUFJPQworaHRtbF9EQVRBICs9IGRidXMuZGV2aGVscAorCitkYnVzLmRldmhlbHA6ICQoc3JjZGlyKS9kb3h5Z2VuX3RvX2RldmhlbHAueHNsIGRveHlnZW4uc3RhbXAKKwkkKFhTTFRQUk9DKSAtbyAkQCAkPCBhcGkveG1sL2luZGV4LnhtbAorZW5kaWYKKworIyB0aGlzIGFzc3VtZXMgQ1JFQVRFX1NVQkRJUlMgaXNuJ3Qgc2V0IHRvIFlFUyBpbiBEb3h5ZmlsZQorIyAod2hpY2ggaXQgaXNuJ3QgY3VycmVudGx5KQoraW5zdGFsbC1kYXRhLWxvY2FsOjogZG94eWdlbi5zdGFtcAorCSQoTUtESVJfUCkgJChERVNURElSKSQoYXBpZGlyKQorCSQoSU5TVEFMTF9EQVRBKSBhcGkvaHRtbC8qICQoREVTVERJUikkKGFwaWRpcikKKwordW5pbnN0YWxsLWxvY2FsOjoKKwlybSAtZiAkKERFU1RESVIpJChhcGlkaXIpLyouaHRtbAorCXJtIC1mICQoREVTVERJUikkKGFwaWRpcikvKi5wbmcKKwlybSAtZiAkKERFU1RESVIpJChhcGlkaXIpLyouY3NzCisJcm0gLWYgJChERVNURElSKSQoYXBpZGlyKS8qLmpzCisJcm0gLWYgJChERVNURElSKSQoaHRtbGRpcikvKi5odG1sCisJcm0gLWYgJChERVNURElSKSQoZG9jZGlyKS8qLnR4dAorCXJtIC1mICQoREVTVERJUikkKGh0bWxkaXIpLyoucG5nCisJcm0gLWYgJChERVNURElSKSQoaHRtbGRpcikvKi5zdmcKKwlybWRpciAtLWlnbm9yZS1mYWlsLW9uLW5vbi1lbXB0eSAkKERFU1RESVIpJChhcGlkaXIpIHx8IFwKKwkJcm1kaXIgJChERVNURElSKSQoYXBpZGlyKQorZW5kaWYKKworaWYgREJVU19IQVZFX01BTjJIVE1MCitodG1sX0RBVEEgKz0gJChNQU5fSFRNTF9GSUxFUykKKworJS4xLmh0bWw6ICUuMQorCSQoQU1fVl9HRU4pKCAkKE1BTjJIVE1MKSA8ICQ8ID4gJEAudG1wICYmIG12ICRALnRtcCAkQCApCitlbmRpZgorCitpZiBEQlVTX0NBTl9VUExPQURfRE9DUworQk9OVVNfRklMRVMgPSBcCisJJCh0b3Bfc3JjZGlyKS9SRUFETUUgXAorCSQodG9wX3NyY2RpcikvSEFDS0lORyBcCisJJCh0b3Bfc3JjZGlyKS9BVVRIT1JTIFwKKwkkKHRvcF9zcmNkaXIpL05FV1MgXAorCSQodG9wX3NyY2RpcikvQ09QWUlORyBcCisJJCh0b3Bfc3JjZGlyKS9DaGFuZ2VMb2cKKworZGJ1cy1kb2NzOiAkKFNUQVRJQ19ET0NTKSAkKGRpc3RfZG9jX0RBVEEpICQoZGlzdF9odG1sX0RBVEEpICQoTUFOX0hUTUxfRklMRVMpICQoQk9OVVNfRklMRVMpIGRveHlnZW4uc3RhbXAKKwkkKEFNX1ZfYXQpcm0gLXJmICRAICRALnRtcAorCSQoQU1fVl9HRU4pJChNS0RJUl9QKSAkQC50bXAvYXBpCisJJChBTV9WX2F0KWNkICQoc3JjZGlyKSAmJiBjcCAkKFNUQVRJQ19ET0NTKSBAYWJzX2J1aWxkZGlyQC8kQC50bXAKKwkkKEFNX1ZfYXQpY2QgJChzcmNkaXIpICYmIGNwICQoZGlzdF9kb2NfREFUQSkgQGFic19idWlsZGRpckAvJEAudG1wCisJJChBTV9WX2F0KWNkICQoc3JjZGlyKSAmJiBjcCAkKFNUQVRJQ19IVE1MKSBAYWJzX2J1aWxkZGlyQC8kQC50bXAKKwkkKEFNX1ZfYXQpY3AgJChYTUxUT19PVVRQVVQpIEBhYnNfYnVpbGRkaXJALyRALnRtcAorCSQoQU1fVl9hdCljcCAkKE1BTl9IVE1MX0ZJTEVTKSBAYWJzX2J1aWxkZGlyQC8kQC50bXAKKwkkKEFNX1ZfYXQpY3AgJChCT05VU19GSUxFUykgQGFic19idWlsZGRpckAvJEAudG1wCisJJChBTV9WX2F0KWNwIC1yIGFwaS9odG1sIEBhYnNfYnVpbGRkaXJALyRALnRtcC9hcGkKKwkkKEFNX1ZfYXQpbXYgJEAudG1wICRACisKK2RidXMtZG9jcy50YXIuZ3o6IGRidXMtZG9jcworCSQoQU1fVl9HRU4pdGFyIGN6ZiAkQCAkPAorCitET0NfU0VSVkVSID0gZGJ1cy5mcmVlZGVza3RvcC5vcmcKK0RPQ19XV1dfRElSID0gL3Nydi9kYnVzLmZyZWVkZXNrdG9wLm9yZy93d3cKKworU1BFQ0lGSUNBVElPTl9TRVJWRVIgPSBzcGVjaWZpY2F0aW9ucy5mcmVlZGVza3RvcC5vcmcKK1NQRUNJRklDQVRJT05fUEFUSCA9IC9zcnYvc3BlY2lmaWNhdGlvbnMuZnJlZWRlc2t0b3Aub3JnL3d3dy9kYnVzLzEuMAorCittYWludGFpbmVyLXVwbG9hZC1kb2NzOiBkYnVzLWRvY3MudGFyLmd6IGRidXMtZG9jcworCXNjcCBkYnVzLWRvY3MudGFyLmd6ICQoRE9DX1NFUlZFUik6JChET0NfV1dXX0RJUikvCisJcnN5bmMgLXJwdnpQIC0tY2htb2Q9RGcrcyx1Zytyd1gsbz1yWCBcCisJCWRidXMtZG9jcy8gJChET0NfU0VSVkVSKTokKERPQ19XV1dfRElSKS9kb2MvCisJY2QgJChzcmNkaXIpICYmIHNjcCAtcCAkKERURFMpICQoU1BFQ0lGSUNBVElPTl9TRVJWRVIpOiQoU1BFQ0lGSUNBVElPTl9QQVRIKS8KK2Vsc2UKK21haW50YWluZXItdXBsb2FkLWRvY3M6CisJQGVjaG8gIkNhbid0IHVwbG9hZCBkb2N1bWVudGF0aW9uISBSZS1ydW4gY29uZmlndXJlIHdpdGgiCisJQGVjaG8gIiAgLS1lbmFibGUtZG94eWdlbi1kb2NzIC0tZW5hYmxlLXhtbC1kb2NzIgorCUBlY2hvICJhbmQgZW5zdXJlIHRoYXQgbWFuMmh0bWwgaXMgaW5zdGFsbGVkLiIKKwlAZmFsc2UKK2VuZGlmCisKK2NsZWFuLWxvY2FsOgorCXJtIC1mICQoaHRtbF9EQVRBKQorCXJtIC1yZiBhcGkKKwlybSAtcmYgZGJ1cy1kb2NzIGRidXMtZG9jcy50bXAKKwlybSAtZiAqLjEuaHRtbAorCXJtIC1mIGRveHlnZW4uc3RhbXAKKworbWFpbnRhaW5lci1jbGVhbi1sb2NhbDoKKwlybSAtZiAkKFhNTFRPX09VVFBVVCkKZGlmZiAtLWdpdCBhL2RidXMvZG9jL1RPRE8gYi9kYnVzL2RvYy9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNGU3OTcKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RvYy9UT0RPCkBAIC0wLDAgKzEsMTU1IEBACitJbXBvcnRhbnQgZm9yIDEuMgorPT09CisKKyAtIFN5c3RlbSBidXMgYWN0aXZhdGlvbgorCisgLSBXaW5kb3dzIHBvcnQKKworSW1wb3J0YW50IGZvciAxLjAgR0xpYiBCaW5kaW5ncworPT09CisKKyAtIFRlc3QgcG9pbnQtdG8tcG9pbnQgbW9kZQorCisgLSBBZGQgc3VwcG9ydCBmb3IgZ2V0dGluZyBzZW5kZXIKKworIC0gZm9ybWF0X3ZlcnNpb24gaW4gdGhlIG9iamVjdCBpbmZvIGRvZXNuJ3QgbG9vayBsaWtlIGl0J3MgaGFuZGxlZCBjb3JyZWN0bHkuIFRoZSBjcmVhdG9yCisgICBvZiB0aGUgb2JqZWN0IGluZm8gc2hvdWxkIHNwZWNpZnkgc29tZSBmaXhlZCBudW1iZXIgcGVyIHN0cnVjdCB2ZXJzaW9uOyB0aGUgbGlicmFyeQorICAgc2hvdWxkIGhhbmRsZSBvbmx5IHNwZWNpZmljIG51bWJlcnMgaXQga25vd3MgYWJvdXQuIFRoZXJlJ3Mgbm8gYXNzdW1wdGlvbiB0aGF0IGFsbCAKKyAgIG51bWJlcnMgPj0gdGhlIGdpdmVuIG9uZSBhcmUgY29tcGF0aWJsZS4gVGhlIGlkZWEgaXMgdGhhdCBuZXcgdmVyc2lvbnMgb2YgdGhlIGxpYgorICAgY2FuIG9mZmVyIHRvdGFsbHkgZGlmZmVyZW50IG9iamVjdCBpbmZvIHN0cnVjdHMsIGJ1dCBvbGQgdmVyc2lvbnMKKyAgIGtlZXAgd29ya2luZy4KKworSW1wb3J0YW50IGZvciAxLjAgUHl0aG9uIGJpbmRpbmdzCis9PT0KKworIC0gSGFtbWVyIGRvd24gQVBJCisKKyAtIEZpeCByZW1vdmluZyBvZiBzaWduYWxzIGZyb20gdGhlIG1hdGNoIHRyZWUKKworIC0gRml4IHJlZmNvdW50aW5nIGFuZCB1c2VyZGF0YSBsaWZlY3ljbGVzCisKKyAtIFdyaXRlIGEgZ2VuZXJpYyBtYWlubG9vcAorCitNaWdodCBhcyBXZWxsIGZvciAxLjAKKz09PQorCisgLSBwcm90b2NvbCB2ZXJzaW9uIGluIGVhY2ggbWVzc2FnZSBpcyBwcmV0dHkgc2lsbHkKKworQ2FuIEJlIFBvc3QgMS4wCis9PT0KKworIC0gcmV2YW1wIGRidXMtbGF1bmNoIGEgYml0LAorICAgc2VlIGh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvYXJjaGl2ZXMvZGJ1cy8yMDA2LU9jdG9iZXIvMDA1OTA2Lmh0bWwKKyAgIGZvciBzb21lIHRob3VnaHRzLgorCisgLSBjbGVhbiB1cCB0aGUgY3JlZHMgaXNzdWUgb24gKkJTRCdzIGluIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYy4KKyAgIFRoZXkgc2hvdWxkIHdvcmsgYXMgaXMgYnV0IHdlIG5lZWQgdG8gcmVhcmFuZ2UgaXQgdG8gbWFrZSBpdAorICAgY2xlYXJlciB3aGljaCBtZXRob2QgaXMgYmVpbmcgdXNlZC4gIGNvbmZpZ3VyZS5pbiBzaG91bGQKKyAgIGJlIGZpeGVkIHVwIHRvIG1ha2UgdGhhdCBkZWNpdGlvbi4KKworIC0gX2RidXNfY29ubmVjdGlvbl91bnJlZl91bmxvY2tlZCgpIGlzIGVzc2VudGlhbGx5IGFsd2F5cyBicm9rZW4gYmVjYXVzZQorICAgdGhlIGNvbm5lY3Rpb24gZmluYWxpemVyIGNhbGxzIG5vbi11bmxvY2tlZCBmdW5jdGlvbnMuIE9uZSBmaXggaXMgdG8gbWFrZSAKKyAgIHRoZSBmaW5hbGl6ZXIgcnVuIHdpdGggdGhlIGxvY2sgaGVsZCwgYnV0IHNpbmNlIGl0IGNhbGxzIG91dCB0byB0aGUgYXBwIHRoYXQgbWF5IAorICAgYmUgcHJldHR5IGJyb2tlbi4gTW9yZSBsaWtlbHkgYWxsIHRoZSB1c2VzIG9mIHVucmVmX3VubG9ja2VkIGFyZSBqdXN0IHdyb25nLgorCisgLSBpZiB0aGUgR1VJRCBpcyBvYnRhaW5lZCBvbmx5IGR1cmluZyBhdXRoZW50aWNhdGlvbiwgbm90IGluIHRoZSBhZGRyZXNzLCAKKyAgIHdlIGNvdWxkIHN0aWxsIHNoYXJlIHRoZSBjb25uZWN0aW9uCisKKyAtIEFsbG93IGEgZGJ1c19nX3Byb3h5X3RvX3N0cmluZygpL2dfb2JqZWN0X3RvX3N0cmluZygpIHRoYXQKKyAgIHdvdWxkIGNvbnZlcnQgdGhlIHByb3h5IHRvIGFuICJJT1IiIGFuZCBkYnVzX2dfcHJveHlfZnJvbV9zdHJpbmcoKQorICAgdGhhdCB3b3VsZCBkZWNvZGU7IHVzaW5nIHRoZXNlLCBkYnVzLWdsaWIgdXNlcnMgY291bGQgYXZvaWQKKyAgIERCdXNDb25uZWN0aW9uIGVudGlyZWx5LiBPZiBjb3Vyc2UgdGhlIHNhbWUgYXBwbGllcyB0byBvdGhlciBraW5kcworICAgb2YgYmluZGluZy4gVGhpcyB3b3VsZCB1c2UgZGJ1c19jb25uZWN0aW9uX29wZW4oKSdzIGNvbm5lY3Rpb24tc2hhcmluZworICAgZmVhdHVyZSB0byBhdm9pZCBtYXNzaXZlIHByb2xpZmVyYXRpb24gb2YgY29ubmVjdGlvbnMuCisKKyAtIERCdXNXYXRjaExpc3QvVGltZW91dExpc3QgZHVwbGljYXRlIGEgbG90IG9mIGNvZGUsIGFzIGRvCisgICBwcm90ZWN0ZWRfY2hhbmdlX3dhdGNoL3Byb3RlY3RlZF9jaGFuZ2VfdGltZW91dCBpbiBkYnVzLWNvbm5lY3Rpb24uYworICAgYW5kIGRidXMtc2VydmVyLmMuIFRoaXMgY291bGQgYWxsIGJlIG1vcHBlZCB1cCwgY3V0LWFuZC1wYXN0ZSAKKyAgIGZpeGVkLCBjb2RlIHNpemUgcmVkdWNlZC4KKworIC0gY2hhbmdlIC5zZXJ2aWNlIGZpbGVzIHRvIGFsbG93IE5hbWVzPWxpc3QgaW4gYWRkaXRpb24gdG8gTmFtZT1zdHJpbmcKKworIC0gVGhlIG1lc3NhZ2UgYnVzIGludGVybmFsIGNvZGUgc3RpbGwgc2F5cyAic2VydmljZSIgZm9yIAorICAgIm5hbWUiLCAiYmFzZSBzZXJ2aWNlIiBmb3IgInVuaXF1ZSBuYW1lIiwgImFjdGl2YXRlIiBmb3IgCisgICAic3RhcnQiOyB3b3VsZCBiZSBuaWNlIHRvIGNsZWFuIHVwLgorCisgLSBQcm9wZXJ0eSBsaXN0IGZlYXR1cmUgb24gbWVzc2FnZSBidXMgKGxpc3Qgb2YgcHJvcGVydGllcyBhc3NvY2lhdGVkIAorICAgd2l0aCBhIGNvbm5lY3Rpb24pLiBNYXkgYWxzbyBpbmNsdWRlIG1lc3NhZ2UgbWF0Y2hpbmcgcnVsZXMgCisgICB0aGF0IGludm9sdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHNvdXJjZSBvciBkZXN0aW5hdGlvbgorICAgY29ubmVjdGlvbi4KKworIC0gRGlzY29ubmVjdGluZyB0aGUgcmVtb3RlIGVuZCBvbiBpbnZhbGlkIFVURi04IGlzIHByb2JhYmx5IG5vdCBhIGdvb2QgCisgICBpZGVhLiBUaGUgZGVmaW5pdGlvbiBvZiAidmFsaWQiIGlzIHNsaWdodGx5IGZ1enp5LiBJIHRoaW5rIGl0IG1pZ2h0IAorICAgYmUgYmV0dGVyIHRvIGp1c3Qgc2lsZW50bHkgImZpeCIgdGhlIFVURi04LCBvciBwZXJoYXBzIHJldHVybiBhbiBlcnJvci4KKworIC0gYnVpbGQgYW5kIGluc3RhbGwgdGhlIERveHlnZW4gbWFudWFsIGluIE1ha2VmaWxlIHdoZW4gLS1lbmFibGUtZG9jcworCisgLSBpZiB5b3Ugc2VuZCB0aGUgc2FtZSBtZXNzYWdlIHRvIG11bHRpcGxlIGNvbm5lY3Rpb25zLCB0aGUgc2VyaWFsIG51bWJlciAKKyAgIHdpbGwgb25seSBiZSByaWdodCBmb3Igb25lIG9mIHRoZW0uIFByb2JhYmx5IG5lZWQgdG8ganVzdCB3cml0ZSgpIHRoZSBzZXJpYWwgCisgICBudW1iZXIsIHJhdGhlciB0aGFuIHB1dHRpbmcgaXQgaW4gdGhlIERCdXNNZXNzYWdlLCBvciBzb21ldGhpbmcuCisKKyAtIHBlcmhhcHMgdGhlIGJ1cyBkcml2ZXIgc2hvdWxkIGhhdmUgcHJvcGVydGllcyB0aGF0IHJlZmxlY3QgYXR0cmlidXRlcworICAgb2YgdGhlIHNlc3Npb24sIHN1Y2ggYXMgaG9zdG5hbWUsIGFyY2hpdGVjdHVyZSwgb3BlcmF0aW5nIHN5c3RlbSwgCisgICBldGMuIENvdWxkIGJlIHVzZWZ1bCBmb3IgY29kZSB0aGF0IHdhbnRzIHRvIHNwZWNpYWwtY2FzZSBiZWhhdmlvciAKKyAgIGZvciBhIHBhcnRpY3VsYXIgaG9zdCBvciBjbGFzcyBvZiBob3N0cywgZm9yIGV4YW1wbGUuCisKKyAtIGN1cnJlbnRseSB0aGUgc2VjdXJpdHkgcG9saWN5IHN0dWZmIGZvciBtZXNzYWdlcyB0by9mcm9tIAorICAgdGhlIGJ1cyBkcml2ZXIgaXMga2luZCBvZiBzdHJhbmdlOyBiYXNpY2FsbHkgaXQncyBoYXJkY29kZWQgdGhhdCAKKyAgIHlvdSBjYW4gYWx3YXlzIHRhbGsgdG8gdGhlIGRyaXZlciwgYnV0IHRoZSBkZWZhdWx0IGNvbmZpZyBmaWxlIAorICAgaGFzIHJ1bGVzIGZvciBpdCBhbnl3YXksIG9yIHNvbWV0aGluZy4gaXQncyBjb25jZXB0dWFsbHkgCisgICBzY3Jld3kgYXQgdGhlIG1vbWVudC4KKworIC0gd2hlbiBtYWtpbmcgYSBtZXRob2QgY2FsbCwgaWYgdGhlIGNhbGwgc2VyaWFsIHdlcmUgZ2xvYmFsbHkgdW5pcXVlLAorICAgd2UgY291bGQgZm9yd2FyZCB0aGUgY2FsbCBzZXJpYWwgYWxvbmcgd2l0aCBhbnkgbWV0aG9kIGNhbGxzIG1hZGUKKyAgIGFzIGEgcmVzdWx0IG9mIHRoZSBmaXJzdCBtZXRob2QgY2FsbCwgYW5kIGFsbG93IHJlZW50cmFuY3kgdGhhdCB3YXMKKyAgIHN0cmljdGx5IHBhcnQgb2YgdGhlIGNhbGwgc3RhY2sgb2Ygc2FpZCBtZXRob2QgY2FsbC4gQnV0IEkgZG9uJ3QKKyAgIHJlYWxseSBzZWUgaG93IHRvIGRvIHRoaXMgd2l0aG91dCBtYWtpbmcgdGhlIHVzZXIgcGFzcyBhcm91bmQgdGhlCisgICBjYWxsIHNlcmlhbCB0byBhbGwgbWV0aG9kIGNhbGxzIGFsbCB0aGUgdGltZSwgb3IgZGlzYWxsb3dpbmcgCisgICBhc3luYyBjYWxscy4KKworICAgSWYgZG9uZSBwb3N0IDEuMCB3aWxsIHByb2JhYmx5IGJlIGFuIG9wdGlvbmFsL3VnbHktQVBJIHR5cGUgCisgICBvZiB0aGluZy4KKworIC0gSSBkb24ndCB3YW50IHRvIGludHJvZHVjZSBEQnVzT2JqZWN0LCBidXQgcmVmY291bnRpbmcgYW5kIG9iamVjdAorICAgZGF0YSBjb3VsZCBzdGlsbCBiZSBmYWN0b3JlZCBvdXQgaW50byBhbiBpbnRlcm5hbCAiYmFzZSBjbGFzcyIgCisgICBwZXJoYXBzLgorCisgLSBLZWVwIGNvbnZlbmllbmNlIHdyYXBwZXJzIGluIHN5bmMgd2l0aCBidXMgbWV0aG9kcworCisgLSBkb2N1bWVudCB0aGUgYXV0aCBwcm90b2NvbCBhcyBhIHNldCBvZiBzdGF0ZXMgYW5kIHRyYW5zaXRpb25zLCBhbmQKKyAgIHRoZW4gcmVpbXBsZW1lbnQgaXQgaW4gdGhvc2UgdGVybXMKKworIC0gcmVjdXJzaXZlIGRpc3BhdGNoLCBzZWUgZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkKKworIC0gZG8gd2UgbmVlZCBwZXItZGlzcGxheSBhY3RpdmF0aW9uOyBpZiBzbyBJJ2QgbGlrZSB0byBkbyB0aGlzIGJ5IHNldHRpbmcgYQorICAgImRpc3BsYXkgSUQiIHByb3BlcnR5IG9uIHNjcmVlbiAwLCB3aXRoIGEgR1VJRCwgYW5kIGtleWluZyBhY3RpdmF0aW9uIGJ5IAorICAgc2FpZCBHVUlELiBPdGhlcndpc2UgeW91IGdldCBhbGwga2luZHMgb2YgdW5yb2J1c3QKKyAgIHN0cmluZy9ob3N0bmFtZS1iYXNlZCBtZXNzLiBwZXItc2NyZWVuIGlzIHRoZW4gZG9uZSBieSBhcHBlbmRpbmcgc2NyZWVuIG51bWJlcgorICAgdG8gdGhlIGRpc3BsYXkuIElmIGRpc3BsYXlzIGhhdmUgYSBkZXRlcm1pbmlzdGljIElEIGxpa2UgdGhpcywgeW91IGNhbiAKKyAgIGRvIHBlci1kaXNwbGF5IGJ5IHNpbXBseSBpbmNsdWRpbmcgR1VJRCBpbiB0aGUgc2VydmljZSBuYW1lLgorCisgLSBvcHRpbWl6YXRpb24gYW5kIHByb2ZpbGluZyEKKworIC0gTWF0Y2ggcnVsZXMgYXJlbid0IGluIHRoZSBzcGVjIChwcm9iYWJseSBhIGxvdCBvZiBtZXRob2RzIG9uIHRoZSBidXMKKyAgIGFyZSBub3QpCisKKyAtIHRoZSAiYnJlYWsgbG9hZGVyIiBhbmQgdmFsaWQvaW52YWxpZCBtZXNzYWdlIHRlc3RzIGFyZSBhbGwgZGlzYWJsZWQ7CisgICB0aGV5IG5lZWQgdG8gYmUgZml4ZWQgYW5kIHJlLWVuYWJsZWQgd2l0aCB0aGUgbmV3IG1lc3NhZ2UgYXJncyBzdHVmZi4KKyAgIEkgdGhpbmsgSSB3YW50IHRvIGRyb3AgdGhlIC5tZXNzYWdlIGZpbGVzIHRoaW5nIGFuZCBqdXN0IGhhdmUgY29kZQorICAgdGhhdCBnZW5lcmF0ZXMgbWVzc2FnZXMsIG1vcmUgbGlrZSB0aGUgdGVzdHMgZm9yCisgICBkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmMgKHRoaXMgaXMgbW9zdGx5IGRvbmUgbm93LCBqdXN0IG5lZWRzIHNvbWUKKyAgIGNsZWFudXApCisKKyAtIGp1c3QgYmVmb3JlIDEuMCwgdHJ5IGEgSEFWRV9JTlQ2ND0wIGJ1aWxkIGFuZCBiZSBzdXJlIGl0IHJ1bnMKKworIC0gV2luZG93cyBwb3J0IG5lZWRzIHJlY3Vyc2l2ZSBtdXRleGVzCisKK1Nob3VsZCBCZSBQb3N0IDEuMAorPT09CisKKyAtIGxvb2sgaW50byBzdXBwb3J0aW5nIHRoZSBjb25jZXB0IG9mIGEgImNvbm5lY3Rpb24iIGdlbmVyaWNhbGx5CisgICAod2hhdCBkb2VzIHRoaXMgVE9ETyBpdGVtIG1lYW4/KQorCisgLSB0ZXN0L25hbWUtdGVzdCBzaG91bGQgYmUgbmFtZWQgdGVzdC93aXRoLWJ1cyBvciBzb21ldGhpbmcgbGlrZSB0aGF0CisKKwpkaWZmIC0tZ2l0IGEvZGJ1cy9kb2MvYnVzY29uZmlnLmR0ZCBiL2RidXMvZG9jL2J1c2NvbmZpZy5kdGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNjNTE5YgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZG9jL2J1c2NvbmZpZy5kdGQKQEAgLTAsMCArMSw2NSBAQAorPCFFTEVNRU5UIGJ1c2NvbmZpZyAodXNlciB8CisgICAgICAgICAgICAgICAgICAgICB0eXBlIHwKKyAgICAgICAgICAgICAgICAgICAgIGZvcmsgfAorICAgICAgICAgICAgICAgICAgICAga2VlcF91bWFzayB8CisgICAgICAgICAgICAgICAgICAgICBsaXN0ZW4gfCAKKyAgICAgICAgICAgICAgICAgICAgIHBpZGZpbGUgfAorICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWRpciB8CisgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlZGlyIHwKKyAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VoZWxwZXIgfAorICAgICAgICAgICAgICAgICAgICAgYXV0aCB8CisgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlIHwKKyAgICAgICAgICAgICAgICAgICAgIHBvbGljeSB8CisgICAgICAgICAgICAgICAgICAgICBsaW1pdCB8CisgICAgICAgICAgICAgICAgICAgICBzZWxpbnV4KSo+CisKKzwhRUxFTUVOVCB1c2VyICgjUENEQVRBKT4KKzwhRUxFTUVOVCBsaXN0ZW4gKCNQQ0RBVEEpPgorPCFFTEVNRU5UIGluY2x1ZGVkaXIgKCNQQ0RBVEEpPgorPCFFTEVNRU5UIHNlcnZpY2VkaXIgKCNQQ0RBVEEpPgorPCFFTEVNRU5UIHNlcnZpY2VoZWxwZXIgKCNQQ0RBVEEpPgorPCFFTEVNRU5UIGF1dGggKCNQQ0RBVEEpPgorPCFFTEVNRU5UIHR5cGUgKCNQQ0RBVEEpPgorPCFFTEVNRU5UIHBpZGZpbGUgKCNQQ0RBVEEpPgorPCFFTEVNRU5UIGZvcmsgRU1QVFk+Cis8IUVMRU1FTlQga2VlcF91bWFzayBFTVBUWT4KKworPCFFTEVNRU5UIGluY2x1ZGUgKCNQQ0RBVEEpPgorPCFBVFRMSVNUIGluY2x1ZGUgCisgICAgICAgICAgaWdub3JlX21pc3NpbmcgKHllc3xubykgIm5vIgorICAgICAgICAgIGlmX3NlbGludXhfZW5hYmxlZCAoeWVzfG5vKSAibm8iCisgICAgICAgICAgc2VsaW51eF9yb290X3JlbGF0aXZlICh5ZXN8bm8pICJubyI+CisKKzwhRUxFTUVOVCBwb2xpY3kgKGFsbG93fGRlbnkpKj4KKzwhQVRUTElTVCBwb2xpY3kgCisgICAgICAgICAgY29udGV4dCAoZGVmYXVsdHxtYW5kYXRvcnkpICNJTVBMSUVECisgICAgICAgICAgdXNlciBDREFUQSAjSU1QTElFRAorICAgICAgICAgIGdyb3VwIENEQVRBICNJTVBMSUVECisgICAgICAgICAgYXRfY29uc29sZSAoeWVzfG5vKSAjSU1QTElFRD4KKworPCFFTEVNRU5UIGFsbG93IEVNUFRZPgorPCFBVFRMSVNUIGFsbG93IAorICAgICAgICAgIHVzZXIgQ0RBVEEgI0lNUExJRUQKKyAgICAgICAgICBzZW5kIENEQVRBICNJTVBMSUVECisgICAgICAgICAgcmVjZWl2ZSBDREFUQSAjSU1QTElFRAorICAgICAgICAgIG93biBDREFUQSAjSU1QTElFRAorICAgICAgICAgIHNlbmRfdG8gQ0RBVEEgI0lNUExJRUQKKyAgICAgICAgICByZWNlaXZlX2Zyb20gQ0RBVEEgI0lNUExJRUQ+CisKKzwhRUxFTUVOVCBkZW55IEVNUFRZPgorPCFBVFRMSVNUIGRlbnkKKyAgICAgICAgICB1c2VyIENEQVRBICNJTVBMSUVECisgICAgICAgICAgc2VuZCBDREFUQSAjSU1QTElFRAorICAgICAgICAgIHJlY2VpdmUgQ0RBVEEgI0lNUExJRUQKKyAgICAgICAgICBvd24gQ0RBVEEgI0lNUExJRUQKKyAgICAgICAgICBzZW5kX3RvIENEQVRBICNJTVBMSUVECisgICAgICAgICAgcmVjZWl2ZV9mcm9tIENEQVRBICNJTVBMSUVEPgorCis8IUVMRU1FTlQgbGltaXQgKCNQQ0RBVEEpPgorPCFBVFRMSVNUIGxpbWl0IG5hbWUgQ0RBVEEgI1JFUVVJUkVEPgorCis8IUVMRU1FTlQgc2VsaW51eCAoYXNzb2NpYXRlKSo+Cis8IUVMRU1FTlQgYXNzb2NpYXRlIEVNUFRZPgorPCFBVFRMSVNUIGFzc29jaWF0ZQorICAgICAgICAgIG93biBDREFUQSAjUkVRVUlSRUQKKyAgICAgICAgICBjb250ZXh0IENEQVRBICNSRVFVSVJFRD4KZGlmZiAtLWdpdCBhL2RidXMvZG9jL2RidXMtY2xlYW51cC1zb2NrZXRzLjEgYi9kYnVzL2RvYy9kYnVzLWNsZWFudXAtc29ja2V0cy4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNjJkNDkKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RvYy9kYnVzLWNsZWFudXAtc29ja2V0cy4xCkBAIC0wLDAgKzEsNDMgQEAKKy5cIiAKKy5cIiBkYnVzXC1jbGVhbnVwXC1zb2NrZXRzIG1hbnVhbCBwYWdlLgorLlwiIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisuXCIKKy5USCBkYnVzXC1jbGVhbnVwXC1zb2NrZXRzIDEKKy5TSCBOQU1FCitkYnVzXC1jbGVhbnVwXC1zb2NrZXRzIFwtIGNsZWFuIHVwIGxlZnRvdmVyIHNvY2tldHMgaW4gYSBkaXJlY3RvcnkKKy5TSCBTWU5PUFNJUworLlBQCisuQiBkYnVzXC1jbGVhbnVwXC1zb2NrZXRzIFtESVJFQ1RPUlldCisKKy5TSCBERVNDUklQVElPTgorCitUaGUgXGZJZGJ1c1wtY2xlYW51cFwtc29ja2V0c1xmUCBjb21tYW5kIGNsZWFucyB1cCB1bnVzZWQgRFwtQnVzCitjb25uZWN0aW9uIHNvY2tldHMuIFNlZSBodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyBmb3IKK21vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJpZyBwaWN0dXJlLgorCisuUFAKK0lmIGdpdmVuIG5vIGFyZ3VtZW50cywgXGZJZGJ1c1wtY2xlYW51cFwtc29ja2V0c1xmUCBjbGVhbnMgdXAgc29ja2V0cyAKK2luIHRoZSBzdGFuZGFyZCBkZWZhdWx0IHNvY2tldCBkaXJlY3RvcnkgZm9yIHRoZQorcGVyXC11c2VyXC1sb2dpblwtc2Vzc2lvbiBtZXNzYWdlIGJ1czsgdGhpcyBpcyB1c3VhbGx5IC90bXAuIAorT3B0aW9uYWxseSwgeW91IGNhbiBwYXNzIGEgZGlmZmVyZW50IGRpcmVjdG9yeSBvbiB0aGUgY29tbWFuZCBsaW5lLgorCisuUFAKK09uIExpbnV4LCB0aGlzIHByb2dyYW0gaXMgZXNzZW50aWFsbHkgdXNlbGVzcywgYmVjYXVzZSBEXC1CdXMgZGVmYXVsdHMKK3RvIHVzaW5nICJhYnN0cmFjdCBzb2NrZXRzIiB0aGF0IGV4aXN0IG9ubHkgaW4gbWVtb3J5IGFuZCBkb24ndCBoYXZlIGEKK2NvcnJlc3BvbmRpbmcgZmlsZSBpbiAvdG1wLiAKKworLlBQCitPbiBtb3N0IG90aGVyIGZsYXZvcnMgb2YgVU5JWCwgaXQncyBwb3NzaWJsZSBmb3IgdGhlIHNvY2tldCBmaWxlcyB0bworbGVhayB3aGVuIHByb2dyYW1zIHVzaW5nIERcLUJ1cyBleGl0IGFibm9ybWFsbHkgb3Igd2l0aG91dCBjbG9zaW5nCit0aGVpciBEXC1CdXMgY29ubmVjdGlvbnMuIFRodXMsIGl0IG1pZ2h0IGJlIGludGVyZXN0aW5nIHRvIHJ1bgorZGJ1c1wtY2xlYW51cFwtc29ja2V0cyBpbiBhIGNyb24gam9iIHRvIG1vcCB1cCBhbnkgbGVha2VkIHNvY2tldHMuCitPciB5b3UgY2FuIGp1c3QgaWdub3JlIHRoZSBsZWFrZWQgc29ja2V0cywgdGhleSBhcmVuJ3QgcmVhbGx5IGh1cnRpbmcKK2FueXRoaW5nLCBvdGhlciB0aGFuIGNsdXR0ZXJpbmcgdGhlIG91dHB1dCBvZiAibHMgL3RtcCIKKworLlNIIEFVVEhPUgorZGJ1c1wtY2xlYW51cFwtc29ja2V0cyB3YXMgYWRhcHRlZCBieSBIYXZvYyBQZW5uaW5ndG9uIGZyb20KK2xpbmNcLWNsZWFudXBcLXNvY2tldHMgd3JpdHRlbiBieSBNaWNoYWVsIE1lZWtzLgorCisuU0ggQlVHUworUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgdG8gdGhlIERcLUJ1cyBtYWlsaW5nIGxpc3Qgb3IgYnVnIHRyYWNrZXIsCitzZWUgaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8KZGlmZiAtLWdpdCBhL2RidXMvZG9jL2RidXMtZGFlbW9uLjEuaW4gYi9kYnVzL2RvYy9kYnVzLWRhZW1vbi4xLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzODU2ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RvYy9kYnVzLWRhZW1vbi4xLmluCkBAIC0wLDAgKzEsNzY2IEBACisuXCIKKy5cIiBkYnVzXC1kYWVtb24gbWFudWFsIHBhZ2UuCisuXCIgQ29weXJpZ2h0IChDKSAyMDAzLDIwMDggUmVkIEhhdCwgSW5jLgorLlwiCisuVEggZGJ1c1wtZGFlbW9uIDEKKy5TSCBOQU1FCitkYnVzXC1kYWVtb24gXC0gTWVzc2FnZSBidXMgZGFlbW9uCisuU0ggU1lOT1BTSVMKKy5QUAorLkIgZGJ1c1wtZGFlbW9uCitkYnVzXC1kYWVtb24gW1wtXC12ZXJzaW9uXSBbXC1cLXNlc3Npb25dIFtcLVwtc3lzdGVtXSBbXC1cLWNvbmZpZ1wtZmlsZT1GSUxFXQorW1wtXC1wcmludFwtYWRkcmVzc1s9REVTQ1JJUFRPUl1dIFtcLVwtcHJpbnRcLXBpZFs9REVTQ1JJUFRPUl1dIFtcLVwtZm9ya10KKworLlNIIERFU0NSSVBUSU9OCitcZklkYnVzXC1kYWVtb25cZlAgaXMgdGhlIERcLUJ1cyBtZXNzYWdlIGJ1cyBkYWVtb24uIFNlZQoraHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQKK3RoZSBiaWcgcGljdHVyZS4gRFwtQnVzIGlzIGZpcnN0IGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG9uZVwtdG9cLW9uZQorY29tbXVuaWNhdGlvbiBiZXR3ZWVuIGFueSB0d28gYXBwbGljYXRpb25zOyBcZklkYnVzXC1kYWVtb25cZlAgaXMgYW4KK2FwcGxpY2F0aW9uIHRoYXQgdXNlcyB0aGlzIGxpYnJhcnkgdG8gaW1wbGVtZW50IGEgbWVzc2FnZSBidXMKK2RhZW1vbi4gTXVsdGlwbGUgcHJvZ3JhbXMgY29ubmVjdCB0byB0aGUgbWVzc2FnZSBidXMgZGFlbW9uIGFuZCBjYW4KK2V4Y2hhbmdlIG1lc3NhZ2VzIHdpdGggb25lIGFub3RoZXIuCisuUFAKK1RoZXJlIGFyZSB0d28gc3RhbmRhcmQgbWVzc2FnZSBidXMgaW5zdGFuY2VzOiB0aGUgc3lzdGVtd2lkZSBtZXNzYWdlIGJ1cworKGluc3RhbGxlZCBvbiBtYW55IHN5c3RlbXMgYXMgdGhlICJtZXNzYWdlYnVzIiBpbml0IHNlcnZpY2UpIGFuZCB0aGUKK3BlclwtdXNlclwtbG9naW5cLXNlc3Npb24gbWVzc2FnZSBidXMgKHN0YXJ0ZWQgZWFjaCB0aW1lIGEgdXNlciBsb2dzIGluKS4KK1xmSWRidXNcLWRhZW1vblxmUCBpcyB1c2VkIGZvciBib3RoIG9mIHRoZXNlIGluc3RhbmNlcywgYnV0IHdpdGgKK2EgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gZmlsZS4KKy5QUAorVGhlIFwtXC1zZXNzaW9uIG9wdGlvbiBpcyBlcXVpdmFsZW50IHRvCisiXC1cLWNvbmZpZ1wtZmlsZT1ARVhQQU5ERURfU1lTQ09ORkRJUkAvZGJ1c1wtMS9zZXNzaW9uLmNvbmYiIGFuZCB0aGUgXC1cLXN5c3RlbQorb3B0aW9uIGlzIGVxdWl2YWxlbnQgdG8KKyJcLVwtY29uZmlnXC1maWxlPUBFWFBBTkRFRF9TWVNDT05GRElSQC9kYnVzXC0xL3N5c3RlbS5jb25mIi4gQnkgY3JlYXRpbmcKK2FkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBmaWxlcyBhbmQgdXNpbmcgdGhlIFwtXC1jb25maWdcLWZpbGUgb3B0aW9uLAorYWRkaXRpb25hbCBzcGVjaWFsXC1wdXJwb3NlIG1lc3NhZ2UgYnVzIGRhZW1vbnMgY291bGQgYmUgY3JlYXRlZC4KKy5QUAorVGhlIHN5c3RlbXdpZGUgZGFlbW9uIGlzIG5vcm1hbGx5IGxhdW5jaGVkIGJ5IGFuIGluaXQgc2NyaXB0LAorc3RhbmRhcmRseSBjYWxsZWQgc2ltcGx5ICJtZXNzYWdlYnVzIi4KKy5QUAorVGhlIHN5c3RlbXdpZGUgZGFlbW9uIGlzIGxhcmdlbHkgdXNlZCBmb3IgYnJvYWRjYXN0aW5nIHN5c3RlbSBldmVudHMsCitzdWNoIGFzIGNoYW5nZXMgdG8gdGhlIHByaW50ZXIgcXVldWUsIG9yIGFkZGluZy9yZW1vdmluZyBkZXZpY2VzLgorLlBQCitUaGUgcGVyXC1zZXNzaW9uIGRhZW1vbiBpcyB1c2VkIGZvciB2YXJpb3VzIGludGVycHJvY2VzcyBjb21tdW5pY2F0aW9uCithbW9uZyBkZXNrdG9wIGFwcGxpY2F0aW9ucyAoaG93ZXZlciwgaXQgaXMgbm90IHRpZWQgdG8gWCBvciB0aGUgR1VJCitpbiBhbnkgd2F5KS4KKy5QUAorU0lHSFVQIHdpbGwgY2F1c2UgdGhlIERcLUJ1cyBkYWVtb24gdG8gUEFSVElBTExZIHJlbG9hZCBpdHMKK2NvbmZpZ3VyYXRpb24gZmlsZSBhbmQgdG8gZmx1c2ggaXRzIHVzZXIvZ3JvdXAgaW5mb3JtYXRpb24gY2FjaGVzLiBTb21lCitjb25maWd1cmF0aW9uIGNoYW5nZXMgd291bGQgcmVxdWlyZSBraWNraW5nIGFsbCBhcHBzIG9mZiB0aGUgYnVzOyBzbyB0aGV5IHdpbGwKK29ubHkgdGFrZSBlZmZlY3QgaWYgeW91IHJlc3RhcnQgdGhlIGRhZW1vbi4gUG9saWN5IGNoYW5nZXMgc2hvdWxkIHRha2UgZWZmZWN0Cit3aXRoIFNJR0hVUC4KKworLlNIIE9QVElPTlMKK1RoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgc3VwcG9ydGVkOgorLlRQCisuSSAiXC1cLWNvbmZpZ1wtZmlsZT1GSUxFIgorVXNlIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGZpbGUuCisuVFAKKy5JICJcLVwtZm9yayIKK0ZvcmNlIHRoZSBtZXNzYWdlIGJ1cyB0byBmb3JrIGFuZCBiZWNvbWUgYSBkYWVtb24sIGV2ZW4gaWYKK3RoZSBjb25maWd1cmF0aW9uIGZpbGUgZG9lcyBub3Qgc3BlY2lmeSB0aGF0IGl0IHNob3VsZC4KK0luIG1vc3QgY29udGV4dHMgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBhbHJlYWR5IGdldHMgdGhpcworcmlnaHQsIHRob3VnaC4KKy5JICJcLVwtbm9mb3JrIgorRm9yY2UgdGhlIG1lc3NhZ2UgYnVzIG5vdCB0byBmb3JrIGFuZCBiZWNvbWUgYSBkYWVtb24sIGV2ZW4gaWYKK3RoZSBjb25maWd1cmF0aW9uIGZpbGUgc3BlY2lmaWVzIHRoYXQgaXQgc2hvdWxkLgorLlRQCisuSSAiXC1cLXByaW50XC1hZGRyZXNzWz1ERVNDUklQVE9SXSIKK1ByaW50IHRoZSBhZGRyZXNzIG9mIHRoZSBtZXNzYWdlIGJ1cyB0byBzdGFuZGFyZCBvdXRwdXQsIG9yCit0byB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yLiBUaGlzIGlzIHVzZWQgYnkgcHJvZ3JhbXMgdGhhdAorbGF1bmNoIHRoZSBtZXNzYWdlIGJ1cy4KKy5UUAorLkkgIlwtXC1wcmludFwtcGlkWz1ERVNDUklQVE9SXSIKK1ByaW50IHRoZSBwcm9jZXNzIElEIG9mIHRoZSBtZXNzYWdlIGJ1cyB0byBzdGFuZGFyZCBvdXRwdXQsIG9yCit0byB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yLiBUaGlzIGlzIHVzZWQgYnkgcHJvZ3JhbXMgdGhhdAorbGF1bmNoIHRoZSBtZXNzYWdlIGJ1cy4KKy5UUAorLkkgIlwtXC1zZXNzaW9uIgorVXNlIHRoZSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSBwZXJcLWxvZ2luXC1zZXNzaW9uIG1lc3NhZ2UKK2J1cy4KKy5UUAorLkkgIlwtXC1zeXN0ZW0iCitVc2UgdGhlIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIHN5c3RlbXdpZGUgbWVzc2FnZSBidXMuCisuVFAKKy5JICJcLVwtdmVyc2lvbiIKK1ByaW50IHRoZSB2ZXJzaW9uIG9mIHRoZSBkYWVtb24uCisuVFAKKy5JICJcLVwtaW50cm9zcGVjdCIKK1ByaW50IHRoZSBpbnRyb3NwZWN0aW9uIGluZm9ybWF0aW9uIGZvciBhbGwgRFwtQnVzIGludGVybmFsIGludGVyZmFjZXMuCisuVFAKKy5JICJcLVwtYWRkcmVzc1s9QUREUkVTU10iCitTZXQgdGhlIGFkZHJlc3MgdG8gbGlzdGVuIG9uLiBUaGlzIG9wdGlvbiBvdmVycmlkZXMgdGhlIGFkZHJlc3MKK2NvbmZpZ3VyZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKy5UUAorLkkgIlwtXC1zeXN0ZW1kXC1hY3RpdmF0aW9uIgorRW5hYmxlIHN5c3RlbWRcLXN0eWxlIHNlcnZpY2UgYWN0aXZhdGlvbi4gT25seSB1c2VmdWwgaW4gY29uanVuY3Rpb24KK3dpdGggdGhlIHN5c3RlbWQgc3lzdGVtIGFuZCBzZXNzaW9uIG1hbmFnZXIgb24gTGludXguCisuVFAKKy5JICJcLVwtbm9waWRmaWxlIgorRG9uJ3Qgd3JpdGUgYSBQSUQgZmlsZSBldmVuIGlmIG9uZSBpcyBjb25maWd1cmVkIGluIHRoZSBjb25maWd1cmF0aW9uCitmaWxlcy4KKworLlNIIENPTkZJR1VSQVRJT04gRklMRQorCitBIG1lc3NhZ2UgYnVzIGRhZW1vbiBoYXMgYSBjb25maWd1cmF0aW9uIGZpbGUgdGhhdCBzcGVjaWFsaXplcyBpdAorZm9yIGEgcGFydGljdWxhciBhcHBsaWNhdGlvbi4gRm9yIGV4YW1wbGUsIG9uZSBjb25maWd1cmF0aW9uCitmaWxlIG1pZ2h0IHNldCB1cCB0aGUgbWVzc2FnZSBidXMgdG8gYmUgYSBzeXN0ZW13aWRlIG1lc3NhZ2UgYnVzLAord2hpbGUgYW5vdGhlciBtaWdodCBzZXQgaXQgdXAgdG8gYmUgYSBwZXJcLXVzZXJcLWxvZ2luXC1zZXNzaW9uIGJ1cy4KKy5QUAorVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBhbHNvIGVzdGFibGlzaGVzIHJlc291cmNlIGxpbWl0cywgc2VjdXJpdHkKK3BhcmFtZXRlcnMsIGFuZCBzbyBmb3J0aC4KKy5QUAorVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBub3QgcGFydCBvZiBhbnkgaW50ZXJvcGVyYWJpbGl0eQorc3BlY2lmaWNhdGlvbiBhbmQgaXRzIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaXMgbm90IGd1YXJhbnRlZWQ7IHRoaXMKK2RvY3VtZW50IGlzIGRvY3VtZW50YXRpb24sIG5vdCBzcGVjaWZpY2F0aW9uLgorLlBQCitUaGUgc3RhbmRhcmQgc3lzdGVtd2lkZSBhbmQgcGVyXC1zZXNzaW9uIG1lc3NhZ2UgYnVzIHNldHVwcyBhcmUKK2NvbmZpZ3VyZWQgaW4gdGhlIGZpbGVzICJARVhQQU5ERURfU1lTQ09ORkRJUkAvZGJ1c1wtMS9zeXN0ZW0uY29uZiIgYW5kCisiQEVYUEFOREVEX1NZU0NPTkZESVJAL2RidXNcLTEvc2Vzc2lvbi5jb25mIi4gIFRoZXNlIGZpbGVzIG5vcm1hbGx5Cis8aW5jbHVkZT4gYSBzeXN0ZW1cLWxvY2FsLmNvbmYgb3Igc2Vzc2lvblwtbG9jYWwuY29uZjsgeW91IGNhbiBwdXQgbG9jYWwKK292ZXJyaWRlcyBpbiB0aG9zZSBmaWxlcyB0byBhdm9pZCBtb2RpZnlpbmcgdGhlIHByaW1hcnkgY29uZmlndXJhdGlvbgorZmlsZXMuCisKKy5QUAorVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBhbiBYTUwgZG9jdW1lbnQuIEl0IG11c3QgaGF2ZSB0aGUgZm9sbG93aW5nCitkb2N0eXBlIGRlY2xhcmF0aW9uOgorLm5mCisKKyAgIDwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICJcLS8vZnJlZWRlc2t0b3AvL0RURCBEXC1CdXMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAgICAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorCisuZmkKKworLlBQCitUaGUgZm9sbG93aW5nIGVsZW1lbnRzIG1heSBiZSBwcmVzZW50IGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisKKy5UUAorLkkgIjxidXNjb25maWc+IgorCisuUFAKK1Jvb3QgZWxlbWVudC4KKworLlRQCisuSSAiPHR5cGU+IgorCisuUFAKK1RoZSB3ZWxsXC1rbm93biB0eXBlIG9mIHRoZSBtZXNzYWdlIGJ1cy4gQ3VycmVudGx5IGtub3duIHZhbHVlcyBhcmUKKyJzeXN0ZW0iIGFuZCAic2Vzc2lvbiI7IGlmIG90aGVyIHZhbHVlcyBhcmUgc2V0LCB0aGV5IHNob3VsZCBiZQorZWl0aGVyIGFkZGVkIHRvIHRoZSBEXC1CdXMgc3BlY2lmaWNhdGlvbiwgb3IgbmFtZXNwYWNlZC4gIFRoZSBsYXN0Cis8dHlwZT4gZWxlbWVudCAid2lucyIgKHByZXZpb3VzIHZhbHVlcyBhcmUgaWdub3JlZCkuIFRoaXMgZWxlbWVudAorb25seSBjb250cm9scyB3aGljaCBtZXNzYWdlIGJ1cyBzcGVjaWZpYyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlCitzZXQgaW4gYWN0aXZhdGVkIGNsaWVudHMuICBNb3N0IG9mIHRoZSBwb2xpY3kgdGhhdCBkaXN0aW5ndWlzaGVzIGEKK3Nlc3Npb24gYnVzIGZyb20gdGhlIHN5c3RlbSBidXMgaXMgY29udHJvbGxlZCBmcm9tIHRoZSBvdGhlciBlbGVtZW50cworaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKworLlBQCitJZiB0aGUgd2VsbFwta25vd24gdHlwZSBvZiB0aGUgbWVzc2FnZSBidXMgaXMgInNlc3Npb24iLCB0aGVuIHRoZQorREJVU19TVEFSVEVSX0JVU19UWVBFIGVudmlyb25tZW50IHZhcmlhYmxlIHdpbGwgYmUgc2V0IHRvICJzZXNzaW9uIgorYW5kIHRoZSBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MgZW52aXJvbm1lbnQgdmFyaWFibGUgd2lsbCBiZSBzZXQKK3RvIHRoZSBhZGRyZXNzIG9mIHRoZSBzZXNzaW9uIGJ1cy4gIExpa2V3aXNlLCBpZiB0aGUgdHlwZSBvZiB0aGUKK21lc3NhZ2UgYnVzIGlzICJzeXN0ZW0iLCB0aGVuIHRoZSBEQlVTX1NUQVJURVJfQlVTX1RZUEUgZW52aXJvbm1lbnQKK3ZhcmlhYmxlIHdpbGwgYmUgc2V0IHRvICJzeXN0ZW0iIGFuZCB0aGUgREJVU19TRVNTSU9OX0JVU19BRERSRVNTCitlbnZpcm9ubWVudCB2YXJpYWJsZSB3aWxsIGJlIHNldCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgc3lzdGVtIGJ1cworKHdoaWNoIGlzIG5vcm1hbGx5IHdlbGwga25vd24gYW55d2F5KS4KKworLlBQCitFeGFtcGxlOiA8dHlwZT5zZXNzaW9uPC90eXBlPgorCisuVFAKKy5JICI8aW5jbHVkZT4iCisKKy5QUAorSW5jbHVkZSBhIGZpbGUgPGluY2x1ZGU+ZmlsZW5hbWUuY29uZjwvaW5jbHVkZT4gYXQgdGhpcyBwb2ludC4gIElmIHRoZQorZmlsZW5hbWUgaXMgcmVsYXRpdmUsIGl0IGlzIGxvY2F0ZWQgcmVsYXRpdmUgdG8gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQorZG9pbmcgdGhlIGluY2x1ZGluZy4KKworLlBQCis8aW5jbHVkZT4gaGFzIGFuIG9wdGlvbmFsIGF0dHJpYnV0ZSAiaWdub3JlX21pc3Npbmc9KHllc3xubykiCit3aGljaCBkZWZhdWx0cyB0byAibm8iIGlmIG5vdCBwcm92aWRlZC4gVGhpcyBhdHRyaWJ1dGUKK2NvbnRyb2xzIHdoZXRoZXIgaXQncyBhIGZhdGFsIGVycm9yIGZvciB0aGUgaW5jbHVkZWQgZmlsZQordG8gYmUgYWJzZW50LgorCisuVFAKKy5JICI8aW5jbHVkZWRpcj4iCisKKy5QUAorSW5jbHVkZSBhbGwgZmlsZXMgaW4gPGluY2x1ZGVkaXI+Zm9vLmQ8L2luY2x1ZGVkaXI+IGF0IHRoaXMKK3BvaW50LiBGaWxlcyBpbiB0aGUgZGlyZWN0b3J5IGFyZSBpbmNsdWRlZCBpbiB1bmRlZmluZWQgb3JkZXIuCitPbmx5IGZpbGVzIGVuZGluZyBpbiAiLmNvbmYiIGFyZSBpbmNsdWRlZC4KKworLlBQCitUaGlzIGlzIGludGVuZGVkIHRvIGFsbG93IGV4dGVuc2lvbiBvZiB0aGUgc3lzdGVtIGJ1cyBieSBwYXJ0aWN1bGFyCitwYWNrYWdlcy4gRm9yIGV4YW1wbGUsIGlmIENVUFMgd2FudHMgdG8gYmUgYWJsZSB0byBzZW5kIG91dAorbm90aWZpY2F0aW9uIG9mIHByaW50ZXIgcXVldWUgY2hhbmdlcywgaXQgY291bGQgaW5zdGFsbCBhIGZpbGUgdG8KK0BFWFBBTkRFRF9TWVNDT05GRElSQC9kYnVzXC0xL3N5c3RlbS5kIHRoYXQgYWxsb3dlZCBhbGwgYXBwcyB0byByZWNlaXZlCit0aGlzIG1lc3NhZ2UgYW5kIGFsbG93ZWQgdGhlIHByaW50ZXIgZGFlbW9uIHVzZXIgdG8gc2VuZCBpdC4KKworLlRQCisuSSAiPHVzZXI+IgorCisuUFAKK1RoZSB1c2VyIGFjY291bnQgdGhlIGRhZW1vbiBzaG91bGQgcnVuIGFzLCBhcyBlaXRoZXIgYSB1c2VybmFtZSBvciBhCitVSUQuIElmIHRoZSBkYWVtb24gY2Fubm90IGNoYW5nZSB0byB0aGlzIFVJRCBvbiBzdGFydHVwLCBpdCB3aWxsIGV4aXQuCitJZiB0aGlzIGVsZW1lbnQgaXMgbm90IHByZXNlbnQsIHRoZSBkYWVtb24gd2lsbCBub3QgY2hhbmdlIG9yIGNhcmUKK2Fib3V0IGl0cyBVSUQuCisKKy5QUAorVGhlIGxhc3QgPHVzZXI+IGVudHJ5IGluIHRoZSBmaWxlICJ3aW5zIiwgdGhlIG90aGVycyBhcmUgaWdub3JlZC4KKworLlBQCitUaGUgdXNlciBpcyBjaGFuZ2VkIGFmdGVyIHRoZSBidXMgaGFzIGNvbXBsZXRlZCBpbml0aWFsaXphdGlvbi4gIFNvCitzb2NrZXRzIGV0Yy4gd2lsbCBiZSBjcmVhdGVkIGJlZm9yZSBjaGFuZ2luZyB1c2VyLCBidXQgbm8gZGF0YSB3aWxsIGJlCityZWFkIGZyb20gY2xpZW50cyBiZWZvcmUgY2hhbmdpbmcgdXNlci4gVGhpcyBtZWFucyB0aGF0IHNvY2tldHMKK2FuZCBQSUQgZmlsZXMgY2FuIGJlIGNyZWF0ZWQgaW4gYSBsb2NhdGlvbiB0aGF0IHJlcXVpcmVzIHJvb3QKK3ByaXZpbGVnZXMgZm9yIHdyaXRpbmcuCisKKy5UUAorLkkgIjxmb3JrPiIKKworLlBQCitJZiBwcmVzZW50LCB0aGUgYnVzIGRhZW1vbiBiZWNvbWVzIGEgcmVhbCBkYWVtb24gKGZvcmtzCitpbnRvIHRoZSBiYWNrZ3JvdW5kLCBldGMuKS4gVGhpcyBpcyBnZW5lcmFsbHkgdXNlZAorcmF0aGVyIHRoYW4gdGhlIFwtXC1mb3JrIGNvbW1hbmQgbGluZSBvcHRpb24uCisKKy5UUAorLkkgIjxrZWVwX3VtYXNrPiIKKworLlBQCitJZiBwcmVzZW50LCB0aGUgYnVzIGRhZW1vbiBrZWVwcyBpdHMgb3JpZ2luYWwgdW1hc2sgd2hlbiBmb3JraW5nLgorVGhpcyBtYXkgYmUgdXNlZnVsIHRvIGF2b2lkIGFmZmVjdGluZyB0aGUgYmVoYXZpb3Igb2YgY2hpbGQgcHJvY2Vzc2VzLgorCisuVFAKKy5JICI8bGlzdGVuPiIKKworLlBQCitBZGQgYW4gYWRkcmVzcyB0aGF0IHRoZSBidXMgc2hvdWxkIGxpc3RlbiBvbi4gVGhlCithZGRyZXNzIGlzIGluIHRoZSBzdGFuZGFyZCBEXC1CdXMgZm9ybWF0IHRoYXQgY29udGFpbnMKK2EgdHJhbnNwb3J0IG5hbWUgcGx1cyBwb3NzaWJsZSBwYXJhbWV0ZXJzL29wdGlvbnMuCisKKy5QUAorRXhhbXBsZTogPGxpc3Rlbj51bml4OnBhdGg9L3RtcC9mb288L2xpc3Rlbj4KKworLlBQCitFeGFtcGxlOiA8bGlzdGVuPnRjcDpob3N0PWxvY2FsaG9zdCxwb3J0PTEyMzQ8L2xpc3Rlbj4KKworLlBQCitJZiB0aGVyZSBhcmUgbXVsdGlwbGUgPGxpc3Rlbj4gZWxlbWVudHMsIHRoZW4gdGhlIGJ1cyBsaXN0ZW5zCitvbiBtdWx0aXBsZSBhZGRyZXNzZXMuIFRoZSBidXMgd2lsbCBwYXNzIGl0cyBhZGRyZXNzIHRvCitzdGFydGVkIHNlcnZpY2VzIG9yIG90aGVyIGludGVyZXN0ZWQgcGFydGllcyB3aXRoCit0aGUgbGFzdCBhZGRyZXNzIGdpdmVuIGluIDxsaXN0ZW4+IGZpcnN0LiBUaGF0IGlzLAorYXBwcyB3aWxsIHRyeSB0byBjb25uZWN0IHRvIHRoZSBsYXN0IDxsaXN0ZW4+IGFkZHJlc3MgZmlyc3QuCisKKy5QUAordGNwIHNvY2tldHMgY2FuIGFjY2VwdCBJUHY0IGFkZHJlc3NlcywgSVB2NiBhZGRyZXNzZXMgb3IgaG9zdG5hbWVzLgorSWYgYSBob3N0bmFtZSByZXNvbHZlcyB0byBtdWx0aXBsZSBhZGRyZXNzZXMsIHRoZSBzZXJ2ZXIgd2lsbCBiaW5kCit0byBhbGwgb2YgdGhlbS4gVGhlIGZhbWlseT1pcHY0IG9yIGZhbWlseT1pcHY2IG9wdGlvbnMgY2FuIGJlIHVzZWQKK3RvIGZvcmNlIGl0IHRvIGJpbmQgdG8gYSBzdWJzZXQgb2YgYWRkcmVzc2VzCisKKy5QUAorRXhhbXBsZTogPGxpc3Rlbj50Y3A6aG9zdD1sb2NhbGhvc3QscG9ydD0wLGZhbWlseT1pcHY0PC9saXN0ZW4+CisKKy5QUAorQSBzcGVjaWFsIGNhc2UgaXMgdXNpbmcgYSBwb3J0IG51bWJlciBvZiB6ZXJvIChvciBvbWl0dGluZyB0aGUgcG9ydCksCit3aGljaCBtZWFucyB0byBjaG9vc2UgYW4gYXZhaWxhYmxlIHBvcnQgc2VsZWN0ZWQgYnkgdGhlIG9wZXJhdGluZworc3lzdGVtLiBUaGUgcG9ydCBudW1iZXIgY2hvc2VuIGNhbiBiZSBvYnRhaW5lZCB3aXRoIHRoZQorXC1cLXByaW50XC1hZGRyZXNzIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIgYW5kIHdpbGwgYmUgcHJlc2VudCBpbiBvdGhlcgorY2FzZXMgd2hlcmUgdGhlIHNlcnZlciByZXBvcnRzIGl0cyBvd24gYWRkcmVzcywgc3VjaCBhcyB3aGVuCitEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MgaXMgc2V0LgorCisuUFAKK0V4YW1wbGU6IDxsaXN0ZW4+dGNwOmhvc3Q9bG9jYWxob3N0LHBvcnQ9MDwvbGlzdGVuPgorCisuUFAKK3RjcCBhZGRyZXNzZXMgYWxzbyBhbGxvdyBhIGJpbmQ9aG9zdG5hbWUgb3B0aW9uLCB3aGljaCB3aWxsIG92ZXJyaWRlCit0aGUgaG9zdCBvcHRpb24gc3BlY2lmeWluZyB3aGF0IGFkZHJlc3MgdG8gYmluZCB0bywgd2l0aG91dCBjaGFuZ2luZwordGhlIGFkZHJlc3MgcmVwb3J0ZWQgYnkgdGhlIGJ1cy4gVGhlIGJpbmQgb3B0aW9uIGNhbiBhbHNvIHRha2UgYQorc3BlY2lhbCBuYW1lICcqJyB0byBjYXVzZSB0aGUgYnVzIHRvIGxpc3RlbiBvbiBhbGwgbG9jYWwgYWRkcmVzcworKElOQUREUl9BTlkpLiBUaGUgc3BlY2lmaWVkIGhvc3Qgc2hvdWxkIGJlIGEgdmFsaWQgbmFtZSBvZiB0aGUgbG9jYWwKK21hY2hpbmUgb3Igd2VpcmQgc3R1ZmYgd2lsbCBoYXBwZW4uCisKKy5QUAorRXhhbXBsZTogPGxpc3Rlbj50Y3A6aG9zdD1sb2NhbGhvc3QsYmluZD0qLHBvcnQ9MDwvbGlzdGVuPgorCisuVFAKKy5JICI8YXV0aD4iCisKKy5QUAorTGlzdHMgcGVybWl0dGVkIGF1dGhvcml6YXRpb24gbWVjaGFuaXNtcy4gSWYgdGhpcyBlbGVtZW50IGRvZXNuJ3QKK2V4aXN0LCB0aGVuIGFsbCBrbm93biBtZWNoYW5pc21zIGFyZSBhbGxvd2VkLiAgSWYgdGhlcmUgYXJlIG11bHRpcGxlCis8YXV0aD4gZWxlbWVudHMsIGFsbCB0aGUgbGlzdGVkIG1lY2hhbmlzbXMgYXJlIGFsbG93ZWQuICBUaGUgb3JkZXIgaW4KK3doaWNoIG1lY2hhbmlzbXMgYXJlIGxpc3RlZCBpcyBub3QgbWVhbmluZ2Z1bC4KKworLlBQCitFeGFtcGxlOiA8YXV0aD5FWFRFUk5BTDwvYXV0aD4KKworLlBQCitFeGFtcGxlOiA8YXV0aD5EQlVTX0NPT0tJRV9TSEExPC9hdXRoPgorCisuVFAKKy5JICI8c2VydmljZWRpcj4iCisKKy5QUAorQWRkcyBhIGRpcmVjdG9yeSB0byBzY2FuIGZvciAuc2VydmljZSBmaWxlcy4gRGlyZWN0b3JpZXMgYXJlCitzY2FubmVkIHN0YXJ0aW5nIHdpdGggdGhlIGxhc3QgdG8gYXBwZWFyIGluIHRoZSBjb25maWcgZmlsZQorKHRoZSBmaXJzdCAuc2VydmljZSBmaWxlIGZvdW5kIHRoYXQgcHJvdmlkZXMgYSBwYXJ0aWN1bGFyCitzZXJ2aWNlIHdpbGwgYmUgdXNlZCkuCisKKy5QUAorU2VydmljZSBmaWxlcyB0ZWxsIHRoZSBidXMgaG93IHRvIGF1dG9tYXRpY2FsbHkgc3RhcnQgYSBwcm9ncmFtLgorVGhleSBhcmUgcHJpbWFyaWx5IHVzZWQgd2l0aCB0aGUgcGVyXC11c2VyXC1zZXNzaW9uIGJ1cywKK25vdCB0aGUgc3lzdGVtd2lkZSBidXMuCisKKy5UUAorLkkgIjxzdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzLz4iCisKKy5QUAorPHN0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMvPiBpcyBlcXVpdmFsZW50IHRvIHNwZWNpZnlpbmcgYSBzZXJpZXMKK29mIDxzZXJ2aWNlZGlyLz4gZWxlbWVudHMgZm9yIGVhY2ggb2YgdGhlIGRhdGEgZGlyZWN0b3JpZXMgaW4gdGhlICJYREcKK0Jhc2UgRGlyZWN0b3J5IFNwZWNpZmljYXRpb24iIHdpdGggdGhlIHN1YmRpcmVjdG9yeSAiZGJ1c1wtMS9zZXJ2aWNlcyIsCitzbyBmb3IgZXhhbXBsZSAiL3Vzci9zaGFyZS9kYnVzXC0xL3NlcnZpY2VzIiB3b3VsZCBiZSBhbW9uZyB0aGUKK2RpcmVjdG9yaWVzIHNlYXJjaGVkLgorCisuUFAKK1RoZSAiWERHIEJhc2UgRGlyZWN0b3J5IFNwZWNpZmljYXRpb24iIGNhbiBiZSBmb3VuZCBhdAoraHR0cDovL2ZyZWVkZXNrdG9wLm9yZy93aWtpL1N0YW5kYXJkcy9iYXNlZGlyXC1zcGVjIGlmIGl0IGhhc24ndCBtb3ZlZCwKK290aGVyd2lzZSB0cnkgeW91ciBmYXZvcml0ZSBzZWFyY2ggZW5naW5lLgorCisuUFAKK1RoZSA8c3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycy8+IG9wdGlvbiBpcyBvbmx5IHJlbGV2YW50IHRvIHRoZQorcGVyXC11c2VyXC1zZXNzaW9uIGJ1cyBkYWVtb24gZGVmaW5lZCBpbgorQEVYUEFOREVEX1NZU0NPTkZESVJAL2RidXNcLTEvc2Vzc2lvbi5jb25mLiBQdXR0aW5nIGl0IGluIGFueSBvdGhlcgorY29uZmlndXJhdGlvbiBmaWxlIHdvdWxkIHByb2JhYmx5IGJlIG5vbnNlbnNlLgorCisuVFAKKy5JICI8c3RhbmRhcmRfc3lzdGVtX3NlcnZpY2VkaXJzLz4iCisKKy5QUAorPHN0YW5kYXJkX3N5c3RlbV9zZXJ2aWNlZGlycy8+IHNwZWNpZmllcyB0aGUgc3RhbmRhcmQgc3lzdGVtXC13aWRlCithY3RpdmF0aW9uIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIGJlIHNlYXJjaGVkIGZvciBzZXJ2aWNlIGZpbGVzLgorVGhpcyBvcHRpb24gZGVmYXVsdHMgdG8gQEVYUEFOREVEX0RBVEFESVJAL2RidXNcLTEvc3lzdGVtXC1zZXJ2aWNlcy4KKworLlBQCitUaGUgPHN0YW5kYXJkX3N5c3RlbV9zZXJ2aWNlZGlycy8+IG9wdGlvbiBpcyBvbmx5IHJlbGV2YW50IHRvIHRoZQorcGVyXC1zeXN0ZW0gYnVzIGRhZW1vbiBkZWZpbmVkIGluCitARVhQQU5ERURfU1lTQ09ORkRJUkAvZGJ1c1wtMS9zeXN0ZW0uY29uZi4gUHV0dGluZyBpdCBpbiBhbnkgb3RoZXIKK2NvbmZpZ3VyYXRpb24gZmlsZSB3b3VsZCBwcm9iYWJseSBiZSBub25zZW5zZS4KKworLlRQCisuSSAiPHNlcnZpY2VoZWxwZXIvPiIKKworLlBQCis8c2VydmljZWhlbHBlci8+IHNwZWNpZmllcyB0aGUgc2V0dWlkIGhlbHBlciB0aGF0IGlzIHVzZWQgdG8gbGF1bmNoCitzeXN0ZW0gZGFlbW9ucyB3aXRoIGFuIGFsdGVybmF0ZSB1c2VyLiBUeXBpY2FsbHkgdGhpcyBzaG91bGQgYmUKK3RoZSBkYnVzXC1kYWVtb25cLWxhdW5jaFwtaGVscGVyIGV4ZWN1dGFibGUgaW4gbG9jYXRlZCBpbiBsaWJleGVjLgorCisuUFAKK1RoZSA8c2VydmljZWhlbHBlci8+IG9wdGlvbiBpcyBvbmx5IHJlbGV2YW50IHRvIHRoZSBwZXJcLXN5c3RlbSBidXMgZGFlbW9uCitkZWZpbmVkIGluIEBFWFBBTkRFRF9TWVNDT05GRElSQC9kYnVzXC0xL3N5c3RlbS5jb25mLiBQdXR0aW5nIGl0IGluIGFueSBvdGhlcgorY29uZmlndXJhdGlvbiBmaWxlIHdvdWxkIHByb2JhYmx5IGJlIG5vbnNlbnNlLgorCisuVFAKKy5JICI8bGltaXQ+IgorCisuUFAKKzxsaW1pdD4gZXN0YWJsaXNoZXMgYSByZXNvdXJjZSBsaW1pdC4gRm9yIGV4YW1wbGU6CisubmYKKyAgPGxpbWl0IG5hbWU9Im1heF9tZXNzYWdlX3NpemUiPjY0PC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9jb21wbGV0ZWRfY29ubmVjdGlvbnMiPjUxMjwvbGltaXQ+CisuZmkKKworLlBQCitUaGUgbmFtZSBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5LgorQXZhaWxhYmxlIGxpbWl0IG5hbWVzIGFyZToKKy5uZgorICAgICAgIm1heF9pbmNvbWluZ19ieXRlcyIgICAgICAgICA6IHRvdGFsIHNpemUgaW4gYnl0ZXMgb2YgbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWluZyBmcm9tIGEgc2luZ2xlIGNvbm5lY3Rpb24KKyAgICAgICJtYXhfaW5jb21pbmdfdW5peF9mZHMiICAgICAgOiB0b3RhbCBudW1iZXIgb2YgdW5peCBmZHMgb2YgbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWluZyBmcm9tIGEgc2luZ2xlIGNvbm5lY3Rpb24KKyAgICAgICJtYXhfb3V0Z29pbmdfYnl0ZXMiICAgICAgICAgOiB0b3RhbCBzaXplIGluIGJ5dGVzIG9mIG1lc3NhZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVkIHVwIGZvciBhIHNpbmdsZSBjb25uZWN0aW9uCisgICAgICAibWF4X291dGdvaW5nX3VuaXhfZmRzIiAgICAgIDogdG90YWwgbnVtYmVyIG9mIHVuaXggZmRzIG9mIG1lc3NhZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVkIHVwIGZvciBhIHNpbmdsZSBjb25uZWN0aW9uCisgICAgICAibWF4X21lc3NhZ2Vfc2l6ZSIgICAgICAgICAgIDogbWF4IHNpemUgb2YgYSBzaW5nbGUgbWVzc2FnZSBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzCisgICAgICAibWF4X21lc3NhZ2VfdW5peF9mZHMiICAgICAgIDogbWF4IHVuaXggZmRzIG9mIGEgc2luZ2xlIG1lc3NhZ2UKKyAgICAgICJzZXJ2aWNlX3N0YXJ0X3RpbWVvdXQiICAgICAgOiBtaWxsaXNlY29uZHMgKHRob3VzYW5kdGhzKSB1bnRpbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgc3RhcnRlZCBzZXJ2aWNlIGhhcyB0byBjb25uZWN0CisgICAgICAiYXV0aF90aW1lb3V0IiAgICAgICAgICAgICAgIDogbWlsbGlzZWNvbmRzICh0aG91c2FuZHRocykgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gaXMgZ2l2ZW4gdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGUKKyAgICAgICJtYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zIiAgOiBtYXggbnVtYmVyIG9mIGF1dGhlbnRpY2F0ZWQgY29ubmVjdGlvbnMKKyAgICAgICJtYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyIgOiBtYXggbnVtYmVyIG9mIHVuYXV0aGVudGljYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zCisgICAgICAibWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyIiAgIDogbWF4IG51bWJlciBvZiBjb21wbGV0ZWQgY29ubmVjdGlvbnMgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzYW1lIHVzZXIKKyAgICAgICJtYXhfcGVuZGluZ19zZXJ2aWNlX3N0YXJ0cyIgOiBtYXggbnVtYmVyIG9mIHNlcnZpY2UgbGF1bmNoZXMgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcyBhdCB0aGUgc2FtZSB0aW1lCisgICAgICAibWF4X25hbWVzX3Blcl9jb25uZWN0aW9uIiAgIDogbWF4IG51bWJlciBvZiBuYW1lcyBhIHNpbmdsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gY2FuIG93bgorICAgICAgIm1heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbiI6IG1heCBudW1iZXIgb2YgbWF0Y2ggcnVsZXMgZm9yIGEgc2luZ2xlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbgorICAgICAgIm1heF9yZXBsaWVzX3Blcl9jb25uZWN0aW9uIiA6IG1heCBudW1iZXIgb2YgcGVuZGluZyBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsaWVzIHBlciBjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bWJlciBvZiBjYWxsc1wtaW5cLXByb2dyZXNzKQorICAgICAgInJlcGx5X3RpbWVvdXQiICAgICAgICAgICAgICA6IG1pbGxpc2Vjb25kcyAodGhvdXNhbmR0aHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW50aWwgYSBtZXRob2QgY2FsbCB0aW1lcyBvdXQKKy5maQorCisuUFAKK1RoZSBtYXggaW5jb21pbmcvb3V0Z29pbmcgcXVldWUgc2l6ZXMgYWxsb3cgYSBuZXcgbWVzc2FnZSB0byBiZSBxdWV1ZWQKK2lmIG9uZSBieXRlIHJlbWFpbnMgYmVsb3cgdGhlIG1heC4gU28geW91IGNhbiBpbiBmYWN0IGV4Y2VlZCB0aGUgbWF4CitieSBtYXhfbWVzc2FnZV9zaXplLgorCisuUFAKK21heF9jb21wbGV0ZWRfY29ubmVjdGlvbnMgZGl2aWRlZCBieSBtYXhfY29ubmVjdGlvbnNfcGVyX3VzZXIgaXMgdGhlCitudW1iZXIgb2YgdXNlcnMgdGhhdCBjYW4gd29yayB0b2dldGhlciB0byBkZW5pYWxcLW9mXC1zZXJ2aWNlIGFsbCBvdGhlciB1c2VycyBieSB1c2luZwordXAgYWxsIGNvbm5lY3Rpb25zIG9uIHRoZSBzeXN0ZW13aWRlIGJ1cy4KKworLlBQCitMaW1pdHMgYXJlIG5vcm1hbGx5IG9ubHkgb2YgaW50ZXJlc3Qgb24gdGhlIHN5c3RlbXdpZGUgYnVzLCBub3QgdGhlIHVzZXIgc2Vzc2lvbgorYnVzZXMuCisKKy5UUAorLkkgIjxwb2xpY3k+IgorCisuUFAKK1RoZSA8cG9saWN5PiBlbGVtZW50IGRlZmluZXMgYSBzZWN1cml0eSBwb2xpY3kgdG8gYmUgYXBwbGllZCB0byBhIHBhcnRpY3VsYXIKK3NldCBvZiBjb25uZWN0aW9ucyB0byB0aGUgYnVzLiBBIHBvbGljeSBpcyBtYWRlIHVwIG9mCis8YWxsb3c+IGFuZCA8ZGVueT4gZWxlbWVudHMuIFBvbGljaWVzIGFyZSBub3JtYWxseSB1c2VkIHdpdGggdGhlIHN5c3RlbXdpZGUgYnVzOwordGhleSBhcmUgYW5hbG9nb3VzIHRvIGEgZmlyZXdhbGwgaW4gdGhhdCB0aGV5IGFsbG93IGV4cGVjdGVkIHRyYWZmaWMKK2FuZCBwcmV2ZW50IHVuZXhwZWN0ZWQgdHJhZmZpYy4KKworLlBQCitDdXJyZW50bHksIHRoZSBzeXN0ZW0gYnVzIGhhcyBhIGRlZmF1bHRcLWRlbnkgcG9saWN5IGZvciBzZW5kaW5nIG1ldGhvZCBjYWxscworYW5kIG93bmluZyBidXMgbmFtZXMuICBFdmVyeXRoaW5nIGVsc2UsIGluIHBhcnRpY3VsYXIgcmVwbHkgbWVzc2FnZXMsIHJlY2VpdmUKK2NoZWNrcywgYW5kIHNpZ25hbHMgaGFzIGEgZGVmYXVsdCBhbGxvdyBwb2xpY3kuCisKKy5QUAorSW4gZ2VuZXJhbCwgaXQgaXMgYmVzdCB0byBrZWVwIHN5c3RlbSBzZXJ2aWNlcyBhcyBzbWFsbCwgdGFyZ2V0ZWQgcHJvZ3JhbXMgd2hpY2gKK3J1biBpbiB0aGVpciBvd24gcHJvY2VzcyBhbmQgcHJvdmlkZSBhIHNpbmdsZSBidXMgbmFtZS4gIFRoZW4sIGFsbCB0aGF0IGlzIG5lZWRlZAoraXMgYW4gPGFsbG93PiBydWxlIGZvciB0aGUgIm93biIgcGVybWlzc2lvbiB0byBsZXQgdGhlIHByb2Nlc3MgY2xhaW0gdGhlIGJ1cworbmFtZSwgYW5kIGEgInNlbmRfZGVzdGluYXRpb24iIHJ1bGUgdG8gYWxsb3cgdHJhZmZpYyBmcm9tIHNvbWUgb3IgYWxsIHVpZHMgdG8KK3lvdXIgc2VydmljZS4KKworLlBQCitUaGUgPHBvbGljeT4gZWxlbWVudCBoYXMgb25lIG9mIGZvdXIgYXR0cmlidXRlczoKKy5uZgorICBjb250ZXh0PSIoZGVmYXVsdHxtYW5kYXRvcnkpIgorICBhdF9jb25zb2xlPSIodHJ1ZXxmYWxzZSkiCisgIHVzZXI9InVzZXJuYW1lIG9yIHVzZXJpZCIKKyAgZ3JvdXA9Imdyb3VwIG5hbWUgb3IgZ2lkIgorLmZpCisKKy5QUAorUG9saWNpZXMgYXJlIGFwcGxpZWQgdG8gYSBjb25uZWN0aW9uIGFzIGZvbGxvd3M6CisubmYKKyAgIFwtIGFsbCBjb250ZXh0PSJkZWZhdWx0IiBwb2xpY2llcyBhcmUgYXBwbGllZAorICAgXC0gYWxsIGdyb3VwPSJjb25uZWN0aW9uJ3MgdXNlcidzIGdyb3VwIiBwb2xpY2llcyBhcmUgYXBwbGllZAorICAgICBpbiB1bmRlZmluZWQgb3JkZXIKKyAgIFwtIGFsbCB1c2VyPSJjb25uZWN0aW9uJ3MgYXV0aCB1c2VyIiBwb2xpY2llcyBhcmUgYXBwbGllZAorICAgICBpbiB1bmRlZmluZWQgb3JkZXIKKyAgIFwtIGFsbCBhdF9jb25zb2xlPSJ0cnVlIiBwb2xpY2llcyBhcmUgYXBwbGllZAorICAgXC0gYWxsIGF0X2NvbnNvbGU9ImZhbHNlIiBwb2xpY2llcyBhcmUgYXBwbGllZAorICAgXC0gYWxsIGNvbnRleHQ9Im1hbmRhdG9yeSIgcG9saWNpZXMgYXJlIGFwcGxpZWQKKy5maQorCisuUFAKK1BvbGljaWVzIGFwcGxpZWQgbGF0ZXIgd2lsbCBvdmVycmlkZSB0aG9zZSBhcHBsaWVkIGVhcmxpZXIsCit3aGVuIHRoZSBwb2xpY2llcyBvdmVybGFwLiBNdWx0aXBsZSBwb2xpY2llcyB3aXRoIHRoZSBzYW1lCit1c2VyL2dyb3VwL2NvbnRleHQgYXJlIGFwcGxpZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyCitpbiB0aGUgY29uZmlnIGZpbGUuCisKKy5UUAorLkkgIjxkZW55PiIKKy5JICI8YWxsb3c+IgorCisuUFAKK0EgPGRlbnk+IGVsZW1lbnQgYXBwZWFycyBiZWxvdyBhIDxwb2xpY3k+IGVsZW1lbnQgYW5kIHByb2hpYml0cyBzb21lCithY3Rpb24uIFRoZSA8YWxsb3c+IGVsZW1lbnQgbWFrZXMgYW4gZXhjZXB0aW9uIHRvIHByZXZpb3VzIDxkZW55Pgorc3RhdGVtZW50cywgYW5kIHdvcmtzIGp1c3QgbGlrZSA8ZGVueT4gYnV0IHdpdGggdGhlIGludmVyc2UgbWVhbmluZy4KKworLlBQCitUaGUgcG9zc2libGUgYXR0cmlidXRlcyBvZiB0aGVzZSBlbGVtZW50cyBhcmU6CisubmYKKyAgIHNlbmRfaW50ZXJmYWNlPSJpbnRlcmZhY2VfbmFtZSIKKyAgIHNlbmRfbWVtYmVyPSJtZXRob2Rfb3Jfc2lnbmFsX25hbWUiCisgICBzZW5kX2Vycm9yPSJlcnJvcl9uYW1lIgorICAgc2VuZF9kZXN0aW5hdGlvbj0ibmFtZSIKKyAgIHNlbmRfdHlwZT0ibWV0aG9kX2NhbGwiIHwgIm1ldGhvZF9yZXR1cm4iIHwgInNpZ25hbCIgfCAiZXJyb3IiCisgICBzZW5kX3BhdGg9Ii9wYXRoL25hbWUiCisKKyAgIHJlY2VpdmVfaW50ZXJmYWNlPSJpbnRlcmZhY2VfbmFtZSIKKyAgIHJlY2VpdmVfbWVtYmVyPSJtZXRob2Rfb3Jfc2lnbmFsX25hbWUiCisgICByZWNlaXZlX2Vycm9yPSJlcnJvcl9uYW1lIgorICAgcmVjZWl2ZV9zZW5kZXI9Im5hbWUiCisgICByZWNlaXZlX3R5cGU9Im1ldGhvZF9jYWxsIiB8ICJtZXRob2RfcmV0dXJuIiB8ICJzaWduYWwiIHwgImVycm9yIgorICAgcmVjZWl2ZV9wYXRoPSIvcGF0aC9uYW1lIgorCisgICBzZW5kX3JlcXVlc3RlZF9yZXBseT0idHJ1ZSIgfCAiZmFsc2UiCisgICByZWNlaXZlX3JlcXVlc3RlZF9yZXBseT0idHJ1ZSIgfCAiZmFsc2UiCisKKyAgIGVhdmVzZHJvcD0idHJ1ZSIgfCAiZmFsc2UiCisKKyAgIG93bj0ibmFtZSIKKyAgIG93bl9wcmVmaXg9Im5hbWUiCisgICB1c2VyPSJ1c2VybmFtZSIKKyAgIGdyb3VwPSJncm91cG5hbWUiCisuZmkKKworLlBQCitFeGFtcGxlczoKKy5uZgorICAgPGRlbnkgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLlNlcnZpY2UiIHNlbmRfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuU3lzdGVtIiBzZW5kX21lbWJlcj0iUmVib290Ii8+CisgICA8ZGVueSBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuU3lzdGVtIi8+CisgICA8ZGVueSByZWNlaXZlX3NlbmRlcj0ib3JnLmZyZWVkZXNrdG9wLlN5c3RlbSIvPgorICAgPGRlbnkgdXNlcj0iam9obiIvPgorICAgPGRlbnkgZ3JvdXA9ImVuZW1pZXMiLz4KKy5maQorCisuUFAKK1RoZSA8ZGVueT4gZWxlbWVudCdzIGF0dHJpYnV0ZXMgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRlbnkgIm1hdGNoZXMiIGEKK3BhcnRpY3VsYXIgYWN0aW9uLiBJZiBpdCBtYXRjaGVzLCB0aGUgYWN0aW9uIGlzIGRlbmllZCAodW5sZXNzIGxhdGVyCitydWxlcyBpbiB0aGUgY29uZmlnIGZpbGUgYWxsb3cgaXQpLgorLlBQCitzZW5kX2Rlc3RpbmF0aW9uIGFuZCByZWNlaXZlX3NlbmRlciBydWxlcyBtZWFuIHRoYXQgbWVzc2FnZXMgbWF5IG5vdCBiZQorc2VudCB0byBvciByZWNlaXZlZCBmcm9tIHRoZSAqb3duZXIqIG9mIHRoZSBnaXZlbiBuYW1lLCBub3QgdGhhdAordGhleSBtYXkgbm90IGJlIHNlbnQgKnRvIHRoYXQgbmFtZSouIFRoYXQgaXMsIGlmIGEgY29ubmVjdGlvbgorb3ducyBzZXJ2aWNlcyBBLCBCLCBDLCBhbmQgc2VuZGluZyB0byBBIGlzIGRlbmllZCwgc2VuZGluZyB0byBCIG9yIEMKK3dpbGwgbm90IHdvcmsgZWl0aGVyLgorLlBQCitUaGUgb3RoZXIgc2VuZF8qIGFuZCByZWNlaXZlXyogYXR0cmlidXRlcyBhcmUgcHVyZWx5IHRleHR1YWwvYnlcLXZhbHVlCittYXRjaGVzIGFnYWluc3QgdGhlIGdpdmVuIGZpZWxkIGluIHRoZSBtZXNzYWdlIGhlYWRlci4KKy5QUAorIkVhdmVzZHJvcHBpbmciIG9jY3VycyB3aGVuIGFuIGFwcGxpY2F0aW9uIHJlY2VpdmVzIGEgbWVzc2FnZSB0aGF0Cit3YXMgZXhwbGljaXRseSBhZGRyZXNzZWQgdG8gYSBuYW1lIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBvd24sIG9yCitpcyBhIHJlcGx5IHRvIHN1Y2ggYSBtZXNzYWdlLiBFYXZlc2Ryb3BwaW5nIHRodXMgb25seSBhcHBsaWVzIHRvCittZXNzYWdlcyB0aGF0IGFyZSBhZGRyZXNzZWQgdG8gc2VydmljZXMgYW5kIHJlcGxpZXMgdG8gc3VjaCBtZXNzYWdlcworKGkuZS4gaXQgZG9lcyBub3QgYXBwbHkgdG8gc2lnbmFscykuCisuUFAKK0ZvciA8YWxsb3c+LCBlYXZlc2Ryb3A9InRydWUiIGluZGljYXRlcyB0aGF0IHRoZSBydWxlIG1hdGNoZXMgZXZlbgord2hlbiBlYXZlc2Ryb3BwaW5nLiBlYXZlc2Ryb3A9ImZhbHNlIiBpcyB0aGUgZGVmYXVsdCBhbmQgbWVhbnMgdGhhdAordGhlIHJ1bGUgb25seSBhbGxvd3MgbWVzc2FnZXMgdG8gZ28gdG8gdGhlaXIgc3BlY2lmaWVkIHJlY2lwaWVudC4KK0ZvciA8ZGVueT4sIGVhdmVzZHJvcD0idHJ1ZSIgaW5kaWNhdGVzIHRoYXQgdGhlIHJ1bGUgbWF0Y2hlcworb25seSB3aGVuIGVhdmVzZHJvcHBpbmcuIGVhdmVzZHJvcD0iZmFsc2UiIGlzIHRoZSBkZWZhdWx0IGZvciA8ZGVueT4KK2Fsc28sIGJ1dCBoZXJlIGl0IG1lYW5zIHRoYXQgdGhlIHJ1bGUgYXBwbGllcyBhbHdheXMsIGV2ZW4gd2hlbgorbm90IGVhdmVzZHJvcHBpbmcuIFRoZSBlYXZlc2Ryb3AgYXR0cmlidXRlIGNhbiBvbmx5IGJlIGNvbWJpbmVkIHdpdGgKK3NlbmQgYW5kIHJlY2VpdmUgcnVsZXMgKHdpdGggc2VuZF8qIGFuZCByZWNlaXZlXyogYXR0cmlidXRlcykuCisuUFAKK1RoZSBbc2VuZHxyZWNlaXZlXV9yZXF1ZXN0ZWRfcmVwbHkgYXR0cmlidXRlIHdvcmtzIHNpbWlsYXJseSB0byB0aGUgZWF2ZXNkcm9wCithdHRyaWJ1dGUuIEl0IGNvbnRyb2xzIHdoZXRoZXIgdGhlIDxkZW55PiBvciA8YWxsb3c+IG1hdGNoZXMgYSByZXBseQordGhhdCBpcyBleHBlY3RlZCAoY29ycmVzcG9uZHMgdG8gYSBwcmV2aW91cyBtZXRob2QgY2FsbCBtZXNzYWdlKS4KK1RoaXMgYXR0cmlidXRlIG9ubHkgbWFrZXMgc2Vuc2UgZm9yIHJlcGx5IG1lc3NhZ2VzIChlcnJvcnMgYW5kIG1ldGhvZAorcmV0dXJucyksIGFuZCBpcyBpZ25vcmVkIGZvciBvdGhlciBtZXNzYWdlIHR5cGVzLgorCisuUFAKK0ZvciA8YWxsb3c+LCBbc2VuZHxyZWNlaXZlXV9yZXF1ZXN0ZWRfcmVwbHk9InRydWUiIGlzIHRoZSBkZWZhdWx0IGFuZCBpbmRpY2F0ZXMgdGhhdAorb25seSByZXF1ZXN0ZWQgcmVwbGllcyBhcmUgYWxsb3dlZCBieSB0aGUKK3J1bGUuIFtzZW5kfHJlY2VpdmVdX3JlcXVlc3RlZF9yZXBseT0iZmFsc2UiIG1lYW5zIHRoYXQgdGhlIHJ1bGUgYWxsb3dzIGFueSByZXBseQorZXZlbiBpZiB1bmV4cGVjdGVkLgorCisuUFAKK0ZvciA8ZGVueT4sIFtzZW5kfHJlY2VpdmVdX3JlcXVlc3RlZF9yZXBseT0iZmFsc2UiIGlzIHRoZSBkZWZhdWx0IGJ1dCBpbmRpY2F0ZXMgdGhhdAordGhlIHJ1bGUgbWF0Y2hlcyBvbmx5IHdoZW4gdGhlIHJlcGx5IHdhcyBub3QKK3JlcXVlc3RlZC4gW3NlbmR8cmVjZWl2ZV1fcmVxdWVzdGVkX3JlcGx5PSJ0cnVlIiBpbmRpY2F0ZXMgdGhhdCB0aGUgcnVsZSBhcHBsaWVzCithbHdheXMsIHJlZ2FyZGxlc3Mgb2YgcGVuZGluZyByZXBseSBzdGF0ZS4KKworLlBQCit1c2VyIGFuZCBncm91cCBkZW5pYWxzIG1lYW4gdGhhdCB0aGUgZ2l2ZW4gdXNlciBvciBncm91cCBtYXkKK25vdCBjb25uZWN0IHRvIHRoZSBtZXNzYWdlIGJ1cy4KKworLlBQCitGb3IgIm5hbWUiLCAidXNlcm5hbWUiLCAiZ3JvdXBuYW1lIiwgZXRjLgordGhlIGNoYXJhY3RlciAiKiIgY2FuIGJlIHN1YnN0aXR1dGVkLCBtZWFuaW5nICJhbnkuIiBDb21wbGV4IGdsb2JzCitsaWtlICJmb28uYmFyLioiIGFyZW4ndCBhbGxvd2VkIGZvciBub3cgYmVjYXVzZSB0aGV5J2QgYmUgd29yayB0bworaW1wbGVtZW50IGFuZCBtYXliZSBlbmNvdXJhZ2Ugc2xvcHB5IHNlY3VyaXR5IGFueXdheS4KKworLlBQCis8YWxsb3cgb3duX3ByZWZpeD0iYS5iIi8+IGFsbG93cyB5b3UgdG8gb3duIHRoZSBuYW1lICJhLmIiIG9yIGFueQorbmFtZSB3aG9zZSBmaXJzdCBkb3Qtc2VwYXJhdGVkIGVsZW1lbnRzIGFyZSAiYS5iIjogaW4gcGFydGljdWxhciwKK3lvdSBjYW4gb3duICJhLmIuYyIgb3IgImEuYi5jLmQiLCBidXQgbm90ICJhLmJjIiBvciAiYS5jIi4KK1RoaXMgaXMgdXNlZnVsIHdoZW4gc2VydmljZXMgbGlrZSBUZWxlcGF0aHkgYW5kIFJlc2VydmVEZXZpY2UKK2RlZmluZSBhIG1lYW5pbmcgZm9yIHN1YnRyZWVzIG9mIHdlbGwta25vd24gbmFtZXMsIHN1Y2ggYXMKK29yZy5mcmVlZGVza3RvcC5UZWxlcGF0aHkuQ29ubmVjdGlvbk1hbmFnZXIuKGFueXRoaW5nKQorYW5kIG9yZy5mcmVlZGVza3RvcC5SZXNlcnZlRGV2aWNlMS4oYW55dGhpbmcpLgorCisuUFAKK0l0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gZGVueSBhIHVzZXIgb3IgZ3JvdXAgaW5zaWRlIGEgPHBvbGljeT4KK2ZvciBhIHVzZXIgb3IgZ3JvdXA7IHVzZXIvZ3JvdXAgZGVuaWFscyBjYW4gb25seSBiZSBpbnNpZGUKK2NvbnRleHQ9ImRlZmF1bHQiIG9yIGNvbnRleHQ9Im1hbmRhdG9yeSIgcG9saWNpZXMuCisKKy5QUAorQSBzaW5nbGUgPGRlbnk+IHJ1bGUgbWF5IHNwZWNpZnkgY29tYmluYXRpb25zIG9mIGF0dHJpYnV0ZXMgc3VjaCBhcworc2VuZF9kZXN0aW5hdGlvbiBhbmQgc2VuZF9pbnRlcmZhY2UgYW5kIHNlbmRfdHlwZS4gSW4gdGhpcyBjYXNlLCB0aGUKK2RlbmlhbCBhcHBsaWVzIG9ubHkgaWYgYm90aCBhdHRyaWJ1dGVzIG1hdGNoIHRoZSBtZXNzYWdlIGJlaW5nIGRlbmllZC4KK2UuZy4gPGRlbnkgc2VuZF9pbnRlcmZhY2U9ImZvby5iYXIiIHNlbmRfZGVzdGluYXRpb249ImZvby5ibGFoIi8+IHdvdWxkCitkZW55IG1lc3NhZ2VzIHdpdGggdGhlIGdpdmVuIGludGVyZmFjZSBBTkQgdGhlIGdpdmVuIGJ1cyBuYW1lLgorVG8gZ2V0IGFuIE9SIGVmZmVjdCB5b3Ugc3BlY2lmeSBtdWx0aXBsZSA8ZGVueT4gcnVsZXMuCisKKy5QUAorWW91IGNhbid0IGluY2x1ZGUgYm90aCBzZW5kXyBhbmQgcmVjZWl2ZV8gYXR0cmlidXRlcyBvbiB0aGUgc2FtZQorcnVsZSwgc2luY2UgIndoZXRoZXIgdGhlIG1lc3NhZ2UgY2FuIGJlIHNlbnQiIGFuZCAid2hldGhlciBpdCBjYW4gYmUKK3JlY2VpdmVkIiBhcmUgZXZhbHVhdGVkIHNlcGFyYXRlbHkuCisKKy5QUAorQmUgY2FyZWZ1bCB3aXRoIHNlbmRfaW50ZXJmYWNlL3JlY2VpdmVfaW50ZXJmYWNlLCBiZWNhdXNlIHRoZQoraW50ZXJmYWNlIGZpZWxkIGluIG1lc3NhZ2VzIGlzIG9wdGlvbmFsLiAgSW4gcGFydGljdWxhciwgZG8gTk9UCitzcGVjaWZ5IDxkZW55IHNlbmRfaW50ZXJmYWNlPSJvcmcuZm9vLkJhciIvPiEgIFRoaXMgd2lsbCBjYXVzZQorbm9cLWludGVyZmFjZSBtZXNzYWdlcyB0byBiZSBibG9ja2VkIGZvciBhbGwgc2VydmljZXMsIHdoaWNoIGlzCithbG1vc3QgY2VydGFpbmx5IG5vdCB3aGF0IHlvdSBpbnRlbmRlZC4gIEFsd2F5cyB1c2UgcnVsZXMgb2YKK3RoZSBmb3JtOiA8ZGVueSBzZW5kX2ludGVyZmFjZT0ib3JnLmZvby5CYXIiIHNlbmRfZGVzdGluYXRpb249Im9yZy5mb28uU2VydmljZSIvPgorCisuVFAKKy5JICI8c2VsaW51eD4iCisKKy5QUAorVGhlIDxzZWxpbnV4PiBlbGVtZW50IGNvbnRhaW5zIHNldHRpbmdzIHJlbGF0ZWQgdG8gU2VjdXJpdHkgRW5oYW5jZWQgTGludXguCitNb3JlIGRldGFpbHMgYmVsb3cuCisKKy5UUAorLkkgIjxhc3NvY2lhdGU+IgorCisuUFAKK0FuIDxhc3NvY2lhdGU+IGVsZW1lbnQgYXBwZWFycyBiZWxvdyBhbiA8c2VsaW51eD4gZWxlbWVudCBhbmQKK2NyZWF0ZXMgYSBtYXBwaW5nLiBSaWdodCBub3cgb25seSBvbmUga2luZCBvZiBhc3NvY2lhdGlvbiBpcyBwb3NzaWJsZToKKy5uZgorICAgPGFzc29jaWF0ZSBvd249Im9yZy5mcmVlZGVza3RvcC5Gb29iYXIiIGNvbnRleHQ9ImZvb190Ii8+CisuZmkKKworLlBQCitUaGlzIG1lYW5zIHRoYXQgaWYgYSBjb25uZWN0aW9uIGFza3MgdG8gb3duIHRoZSBuYW1lCisib3JnLmZyZWVkZXNrdG9wLkZvb2JhciIgdGhlbiB0aGUgc291cmNlIGNvbnRleHQgd2lsbCBiZSB0aGUgY29udGV4dAorb2YgdGhlIGNvbm5lY3Rpb24gYW5kIHRoZSB0YXJnZXQgY29udGV4dCB3aWxsIGJlICJmb29fdCIgXC0gc2VlIHRoZQorc2hvcnQgZGlzY3Vzc2lvbiBvZiBTRUxpbnV4IGJlbG93LgorCisuUFAKK05vdGUsIHRoZSBjb250ZXh0IGhlcmUgaXMgdGhlIHRhcmdldCBjb250ZXh0IHdoZW4gcmVxdWVzdGluZyBhIG5hbWUsCitOT1QgdGhlIGNvbnRleHQgb2YgdGhlIGNvbm5lY3Rpb24gb3duaW5nIHRoZSBuYW1lLgorCisuUFAKK1RoZXJlJ3MgY3VycmVudGx5IG5vIHdheSB0byBzZXQgYSBkZWZhdWx0IGZvciBvd25pbmcgYW55IG5hbWUsIGlmCit3ZSBhZGQgdGhpcyBzeW50YXggaXQgd2lsbCBsb29rIGxpa2U6CisubmYKKyAgIDxhc3NvY2lhdGUgb3duPSIqIiBjb250ZXh0PSJmb29fdCIvPgorLmZpCitJZiB5b3UgZmluZCBhIHJlYXNvbiB0aGlzIGlzIHVzZWZ1bCwgbGV0IHRoZSBkZXZlbG9wZXJzIGtub3cuCitSaWdodCBub3cgdGhlIGRlZmF1bHQgd2lsbCBiZSB0aGUgc2VjdXJpdHkgY29udGV4dCBvZiB0aGUgYnVzIGl0c2VsZi4KKworLlBQCitJZiB0d28gPGFzc29jaWF0ZT4gZWxlbWVudHMgc3BlY2lmeSB0aGUgc2FtZSBuYW1lLCB0aGUgZWxlbWVudAorYXBwZWFyaW5nIGxhdGVyIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgd2lsbCBiZSB1c2VkLgorCisuU0ggU0VMaW51eAorCisuUFAKK1NlZSBodHRwOi8vd3d3Lm5zYS5nb3Yvc2VsaW51eC8gZm9yIGZ1bGwgZGV0YWlscyBvbiBTRUxpbnV4LiBTb21lIHVzZWZ1bCBleGNlcnB0czoKKworLklQICIiIDgKK0V2ZXJ5IHN1YmplY3QgKHByb2Nlc3MpIGFuZCBvYmplY3QgKGUuZy4gZmlsZSwgc29ja2V0LCBJUEMgb2JqZWN0LAorZXRjKSBpbiB0aGUgc3lzdGVtIGlzIGFzc2lnbmVkIGEgY29sbGVjdGlvbiBvZiBzZWN1cml0eSBhdHRyaWJ1dGVzLAora25vd24gYXMgYSBzZWN1cml0eSBjb250ZXh0LiBBIHNlY3VyaXR5IGNvbnRleHQgY29udGFpbnMgYWxsIG9mIHRoZQorc2VjdXJpdHkgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIHN1YmplY3Qgb3Igb2JqZWN0Cit0aGF0IGFyZSByZWxldmFudCB0byB0aGUgc2VjdXJpdHkgcG9saWN5LgorCisuSVAgIiIgOAorSW4gb3JkZXIgdG8gYmV0dGVyIGVuY2Fwc3VsYXRlIHNlY3VyaXR5IGNvbnRleHRzIGFuZCB0byBwcm92aWRlCitncmVhdGVyIGVmZmljaWVuY3ksIHRoZSBwb2xpY3kgZW5mb3JjZW1lbnQgY29kZSBvZiBTRUxpbnV4IHR5cGljYWxseQoraGFuZGxlcyBzZWN1cml0eSBpZGVudGlmaWVycyAoU0lEcykgcmF0aGVyIHRoYW4gc2VjdXJpdHkgY29udGV4dHMuIEEKK1NJRCBpcyBhbiBpbnRlZ2VyIHRoYXQgaXMgbWFwcGVkIGJ5IHRoZSBzZWN1cml0eSBzZXJ2ZXIgdG8gYSBzZWN1cml0eQorY29udGV4dCBhdCBydW50aW1lLgorCisuSVAgIiIgOAorV2hlbiBhIHNlY3VyaXR5IGRlY2lzaW9uIGlzIHJlcXVpcmVkLCB0aGUgcG9saWN5IGVuZm9yY2VtZW50IGNvZGUKK3Bhc3NlcyBhIHBhaXIgb2YgU0lEcyAodHlwaWNhbGx5IHRoZSBTSUQgb2YgYSBzdWJqZWN0IGFuZCB0aGUgU0lEIG9mCithbiBvYmplY3QsIGJ1dCBzb21ldGltZXMgYSBwYWlyIG9mIHN1YmplY3QgU0lEcyBvciBhIHBhaXIgb2Ygb2JqZWN0CitTSURzKSwgYW5kIGFuIG9iamVjdCBzZWN1cml0eSBjbGFzcyB0byB0aGUgc2VjdXJpdHkgc2VydmVyLiBUaGUgb2JqZWN0CitzZWN1cml0eSBjbGFzcyBpbmRpY2F0ZXMgdGhlIGtpbmQgb2Ygb2JqZWN0LCBlLmcuIGEgcHJvY2VzcywgYSByZWd1bGFyCitmaWxlLCBhIGRpcmVjdG9yeSwgYSBUQ1Agc29ja2V0LCBldGMuCisKKy5JUCAiIiA4CitBY2Nlc3MgZGVjaXNpb25zIHNwZWNpZnkgd2hldGhlciBvciBub3QgYSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgZm9yIGEKK2dpdmVuIHBhaXIgb2YgU0lEcyBhbmQgY2xhc3MuIEVhY2ggb2JqZWN0IGNsYXNzIGhhcyBhIHNldCBvZgorYXNzb2NpYXRlZCBwZXJtaXNzaW9ucyBkZWZpbmVkIHRvIGNvbnRyb2wgb3BlcmF0aW9ucyBvbiBvYmplY3RzIHdpdGgKK3RoYXQgY2xhc3MuCisKKy5QUAorRFwtQnVzIHBlcmZvcm1zIFNFTGludXggc2VjdXJpdHkgY2hlY2tzIGluIHR3byBwbGFjZXMuCisKKy5QUAorRmlyc3QsIGFueSB0aW1lIGEgbWVzc2FnZSBpcyByb3V0ZWQgZnJvbSBvbmUgY29ubmVjdGlvbiB0byBhbm90aGVyCitjb25uZWN0aW9uLCB0aGUgYnVzIGRhZW1vbiB3aWxsIGNoZWNrIHBlcm1pc3Npb25zIHdpdGggdGhlIHNlY3VyaXR5IGNvbnRleHQgb2YKK3RoZSBmaXJzdCBjb25uZWN0aW9uIGFzIHNvdXJjZSwgc2VjdXJpdHkgY29udGV4dCBvZiB0aGUgc2Vjb25kIGNvbm5lY3Rpb24KK2FzIHRhcmdldCwgb2JqZWN0IGNsYXNzICJkYnVzIiBhbmQgcmVxdWVzdGVkIHBlcm1pc3Npb24gInNlbmRfbXNnIi4KKworLlBQCitJZiBhIHNlY3VyaXR5IGNvbnRleHQgaXMgbm90IGF2YWlsYWJsZSBmb3IgYSBjb25uZWN0aW9uCisoaW1wb3NzaWJsZSB3aGVuIHVzaW5nIFVOSVggZG9tYWluIHNvY2tldHMpLCB0aGVuIHRoZSB0YXJnZXQKK2NvbnRleHQgdXNlZCBpcyB0aGUgY29udGV4dCBvZiB0aGUgYnVzIGRhZW1vbiBpdHNlbGYuCitUaGVyZSBpcyBjdXJyZW50bHkgbm8gd2F5IHRvIGNoYW5nZSB0aGlzIGRlZmF1bHQsIGJlY2F1c2Ugd2UncmUKK2Fzc3VtaW5nIHRoYXQgb25seSBVTklYIGRvbWFpbiBzb2NrZXRzIHdpbGwgYmUgdXNlZCB0bworY29ubmVjdCB0byB0aGUgc3lzdGVtd2lkZSBidXMuIElmIHRoaXMgY2hhbmdlcywgd2UnbGwKK3Byb2JhYmx5IGFkZCBhIHdheSB0byBzZXQgdGhlIGRlZmF1bHQgY29ubmVjdGlvbiBjb250ZXh0LgorCisuUFAKK1NlY29uZCwgYW55IHRpbWUgYSBjb25uZWN0aW9uIGFza3MgdG8gb3duIGEgbmFtZSwKK3RoZSBidXMgZGFlbW9uIHdpbGwgY2hlY2sgcGVybWlzc2lvbnMgd2l0aCB0aGUgc2VjdXJpdHkKK2NvbnRleHQgb2YgdGhlIGNvbm5lY3Rpb24gYXMgc291cmNlLCB0aGUgc2VjdXJpdHkgY29udGV4dCBzcGVjaWZpZWQKK2ZvciB0aGUgbmFtZSBpbiB0aGUgY29uZmlnIGZpbGUgYXMgdGFyZ2V0LCBvYmplY3QKK2NsYXNzICJkYnVzIiBhbmQgcmVxdWVzdGVkIHBlcm1pc3Npb24gImFjcXVpcmVfc3ZjIi4KKworLlBQCitUaGUgc2VjdXJpdHkgY29udGV4dCBmb3IgYSBidXMgbmFtZSBpcyBzcGVjaWZpZWQgd2l0aCB0aGUKKzxhc3NvY2lhdGU+IGVsZW1lbnQgZGVzY3JpYmVkIGVhcmxpZXIgaW4gdGhpcyBkb2N1bWVudC4KK0lmIGEgbmFtZSBoYXMgbm8gc2VjdXJpdHkgY29udGV4dCBhc3NvY2lhdGVkIGluIHRoZQorY29uZmlndXJhdGlvbiBmaWxlLCB0aGUgc2VjdXJpdHkgY29udGV4dCBvZiB0aGUgYnVzIGRhZW1vbgoraXRzZWxmIHdpbGwgYmUgdXNlZC4KKworLlNIIERFQlVHR0lORworCisuUFAKK0lmIHlvdSdyZSB0cnlpbmcgdG8gZmlndXJlIG91dCB3aGVyZSB5b3VyIG1lc3NhZ2VzIGFyZSBnb2luZyBvciB3aHkKK3lvdSBhcmVuJ3QgZ2V0dGluZyBtZXNzYWdlcywgdGhlcmUgYXJlIHNldmVyYWwgdGhpbmdzIHlvdSBjYW4gdHJ5LgorLlBQCitSZW1lbWJlciB0aGF0IHRoZSBzeXN0ZW0gYnVzIGlzIGhlYXZpbHkgbG9ja2VkIGRvd24gYW5kIGlmIHlvdQoraGF2ZW4ndCBpbnN0YWxsZWQgYSBzZWN1cml0eSBwb2xpY3kgZmlsZSB0byBhbGxvdyB5b3VyIG1lc3NhZ2UKK3Rocm91Z2gsIGl0IHdvbid0IHdvcmsuIEZvciB0aGUgc2Vzc2lvbiBidXMsIHRoaXMgaXMgbm90IGEgY29uY2Vybi4KKy5QUAorVGhlIHNpbXBsZXN0IHdheSB0byBmaWd1cmUgb3V0IHdoYXQncyBoYXBwZW5pbmcgb24gdGhlIGJ1cyBpcyB0byBydW4KK3RoZSBcZklkYnVzXC1tb25pdG9yXGZQIHByb2dyYW0sIHdoaWNoIGNvbWVzIHdpdGggdGhlIERcLUJ1cworcGFja2FnZS4gWW91IGNhbiBhbHNvIHNlbmQgdGVzdCBtZXNzYWdlcyB3aXRoIFxmSWRidXNcLXNlbmRcZlAuIFRoZXNlCitwcm9ncmFtcyBoYXZlIHRoZWlyIG93biBtYW4gcGFnZXMuCisuUFAKK0lmIHlvdSB3YW50IHRvIGtub3cgd2hhdCB0aGUgZGFlbW9uIGl0c2VsZiBpcyBkb2luZywgeW91IG1pZ2h0IGNvbnNpZGVyCitydW5uaW5nIGEgc2VwYXJhdGUgY29weSBvZiB0aGUgZGFlbW9uIHRvIHRlc3QgYWdhaW5zdC4gVGhpcyB3aWxsIGFsbG93IHlvdQordG8gcHV0IHRoZSBkYWVtb24gdW5kZXIgYSBkZWJ1Z2dlciwgb3IgcnVuIGl0IHdpdGggdmVyYm9zZSBvdXRwdXQsIHdpdGhvdXQKK21lc3NpbmcgdXAgeW91ciByZWFsIHNlc3Npb24gYW5kIHN5c3RlbSBkYWVtb25zLgorLlBQCitUbyBydW4gYSBzZXBhcmF0ZSB0ZXN0IGNvcHkgb2YgdGhlIGRhZW1vbiwgZm9yIGV4YW1wbGUgeW91IG1pZ2h0IG9wZW4gYSB0ZXJtaW5hbAorYW5kIHR5cGU6CisubmYKKyAgREJVU19WRVJCT1NFPTEgZGJ1c1wtZGFlbW9uIFwtXC1zZXNzaW9uIFwtXC1wcmludFwtYWRkcmVzcworLmZpCisuUFAKK1RoZSB0ZXN0IGRhZW1vbiBhZGRyZXNzIHdpbGwgYmUgcHJpbnRlZCB3aGVuIHRoZSBkYWVtb24gc3RhcnRzLiBZb3Ugd2lsbCBuZWVkCit0byBjb3B5XC1hbmRcLXBhc3RlIHRoaXMgYWRkcmVzcyBhbmQgdXNlIGl0IGFzIHRoZSB2YWx1ZSBvZiB0aGUKK0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGVuIHlvdSBsYXVuY2ggdGhlIGFwcGxpY2F0aW9ucworeW91IHdhbnQgdG8gdGVzdC4gVGhpcyB3aWxsIGNhdXNlIHRob3NlIGFwcGxpY2F0aW9ucyB0byBjb25uZWN0IHRvIHlvdXIKK3Rlc3QgYnVzIGluc3RlYWQgb2YgdGhlIERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyBvZiB5b3VyIHJlYWwgc2Vzc2lvbiBidXMuCisuUFAKK0RCVVNfVkVSQk9TRT0xIHdpbGwgaGF2ZSBOTyBFRkZFQ1QgdW5sZXNzIHlvdXIgY29weSBvZiBEXC1CdXMKK3dhcyBjb21waWxlZCB3aXRoIHZlcmJvc2UgbW9kZSBlbmFibGVkLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZCBpbgorcHJvZHVjdGlvbiBidWlsZHMgZHVlIHRvIHBlcmZvcm1hbmNlIGltcGFjdC4gWW91IG1heSBuZWVkIHRvIHJlYnVpbGQKK0RcLUJ1cyBpZiB5b3VyIGNvcHkgd2FzIG5vdCBidWlsdCB3aXRoIGRlYnVnZ2luZyBpbiBtaW5kLiAoREJVU19WRVJCT1NFCithbHNvIGFmZmVjdHMgdGhlIERcLUJ1cyBsaWJyYXJ5IGFuZCB0aHVzIGFwcGxpY2F0aW9ucyB1c2luZyBEXC1CdXM7IGl0IG1heQorYmUgdXNlZnVsIHRvIHNlZSB2ZXJib3NlIG91dHB1dCBvbiBib3RoIHRoZSBjbGllbnQgc2lkZSBhbmQgZnJvbSB0aGUgZGFlbW9uLikKKy5QUAorSWYgeW91IHdhbnQgdG8gZ2V0IGZhbmN5LCB5b3UgY2FuIGNyZWF0ZSBhIGN1c3RvbSBidXMKK2NvbmZpZ3VyYXRpb24gZm9yIHlvdXIgdGVzdCBidXMgKHNlZSB0aGUgc2Vzc2lvbi5jb25mIGFuZCBzeXN0ZW0uY29uZgorZmlsZXMgdGhhdCBkZWZpbmUgdGhlIHR3byBkZWZhdWx0IGNvbmZpZ3VyYXRpb25zIGZvciBleGFtcGxlKS4gVGhpcword291bGQgYWxsb3cgeW91IHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgZGlyZWN0b3J5IGZvciAuc2VydmljZSBmaWxlcywKK2ZvciBleGFtcGxlLgorCisuU0ggQVVUSE9SCitTZWUgaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy9kb2MvQVVUSE9SUworCisuU0ggQlVHUworUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgdG8gdGhlIERcLUJ1cyBtYWlsaW5nIGxpc3Qgb3IgYnVnIHRyYWNrZXIsCitzZWUgaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8KZGlmZiAtLWdpdCBhL2RidXMvZG9jL2RidXMtZmFxLnhtbCBiL2RidXMvZG9jL2RidXMtZmFxLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWFjM2YxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kb2MvZGJ1cy1mYXEueG1sCkBAIC0wLDAgKzEsNjc0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+Cis8IURPQ1RZUEUgYXJ0aWNsZSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMS4yLy9FTiIKKyJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuMS4yL2RvY2Jvb2t4LmR0ZCIKK1sKK10+CisKKzxhcnRpY2xlIGlkPSJpbmRleCI+CisgIDxhcnRpY2xlaW5mbz4KKyAgICA8dGl0bGU+RC1CdXMgRkFRPC90aXRsZT4KKyAgICA8cmVsZWFzZWluZm8+VmVyc2lvbiAwLjM8L3JlbGVhc2VpbmZvPgorICAgIDxkYXRlPjE3IE5vdmVtYmVyIDIwMDY8L2RhdGU+CisgICAgPGF1dGhvcmdyb3VwPgorICAgICAgPGF1dGhvcj4KKwk8Zmlyc3RuYW1lPkhhdm9jPC9maXJzdG5hbWU+CisJPHN1cm5hbWU+UGVubmluZ3Rvbjwvc3VybmFtZT4KKwk8YWZmaWxpYXRpb24+CisJICA8b3JnbmFtZT5SZWQgSGF0LCBJbmMuPC9vcmduYW1lPgorCSAgPGFkZHJlc3M+CisJICAgIDxlbWFpbD5ocEBwb2JveC5jb208L2VtYWlsPgorCSAgPC9hZGRyZXNzPgorCTwvYWZmaWxpYXRpb24+CisgICAgICA8L2F1dGhvcj4KKyAgICAgIDxhdXRob3I+CisJPGZpcnN0bmFtZT5EYXZpZDwvZmlyc3RuYW1lPgorICAgICAgICA8b3RoZXJuYW1lIHJvbGU9Im1pIj5BPC9vdGhlcm5hbWU+CisJPHN1cm5hbWU+V2hlZWxlcjwvc3VybmFtZT4KKyAgICAgIDwvYXV0aG9yPgorICAgIDwvYXV0aG9yZ3JvdXA+CisgIDwvYXJ0aWNsZWluZm8+CisKKyAgPHFhbmRhc2V0IGlkPSJmYXEiPgorCisgICAgPHFhbmRhZW50cnk+CisgICAgICA8cXVlc3Rpb24+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFdoYXQgaXMgRC1CdXM/CisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGlzIGlzIHByb2JhYmx5IGJlc3QgYW5zd2VyZWQgYnkgcmVhZGluZyB0aGUgRC1CdXMgPHVsaW5rIHVybD0iZGJ1cy10dXRvcmlhbC5odG1sIj50dXRvcmlhbDwvdWxpbms+IG9yCisgICAgICAgICAgdGhlIGludHJvZHVjdGlvbiB0byB0aGUgPHVsaW5rIHVybD0iZGJ1cy1zcGVjaWZpY2F0aW9uLmh0bWwiPnNwZWNpZmljYXRpb248L3VsaW5rPi4gSW4KKyAgICAgICAgICBzaG9ydCwgaXQgaXMgYSBzeXN0ZW0gY29uc2lzdGluZyBvZiAxKSBhIHdpcmUgcHJvdG9jb2wgZm9yIGV4cG9zaW5nIGEKKyAgICAgICAgICB0eXBpY2FsIG9iamVjdC1vcmllbnRlZCBsYW5ndWFnZS9mcmFtZXdvcmsgdG8gb3RoZXIgYXBwbGljYXRpb25zOyBhbmQKKyAgICAgICAgICAyKSBhIGJ1cyBkYWVtb24gdGhhdCBhbGxvd3MgYXBwbGljYXRpb25zIHRvIGZpbmQgYW5kIG1vbml0b3Igb25lIGFub3RoZXIuCisgICAgICAgICAgUGhyYXNlZCBkaWZmZXJlbnRseSwgRC1CdXMgaXMgMSkgYW4gaW50ZXJwcm9jZXNzIGNvbW11bmljYXRpb24gKElQQykgc3lzdGVtIGFuZCAyKSBzb21lIGhpZ2hlci1sZXZlbCAKKyAgICAgICAgICBzdHJ1Y3R1cmUgKGxpZmVjeWNsZSB0cmFja2luZywgc2VydmljZSBhY3RpdmF0aW9uLCBzZWN1cml0eSBwb2xpY3kpIHByb3ZpZGVkIGJ5IHR3byBidXMgZGFlbW9ucywKKyAgICAgICAgICBvbmUgc3lzdGVtd2lkZSBhbmQgb25lIHBlci11c2VyLXNlc3Npb24uCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvcWFuZGFlbnRyeT4KKworICAgIDxxYW5kYWVudHJ5PgorICAgICAgPHF1ZXN0aW9uPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBJcyBELUJ1cyBzdGFibGUvZmluaXNoZWQ/CisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgbG93LWxldmVsIGxpYnJhcnkgImxpYmRidXMiIGFuZCB0aGUgcHJvdG9jb2wgc3BlY2lmaWNhdGlvbiBhcmUgY29uc2lkZXJlZCAKKyAgICAgICAgICBBQkkgc3RhYmxlLiBUaGUgPHVsaW5rIHVybD0iUkVBRE1FIj5SRUFETUU8L3VsaW5rPgorICAgICAgICAgIGZpbGUgaGFzIGEgZGlzY3Vzc2lvbiBvZiB0aGUgQVBJL0FCSSBzdGFiaWxpdHkgZ3VhcmFudGVlcy4KKyAgICAgICAgICBIaWdoZXItbGV2ZWwgYmluZGluZ3MgKHN1Y2ggYXMgdGhvc2UgZm9yIFF0LCBHTGliLCBQeXRob24sIEphdmEsIEMjKSBlYWNoIAorICAgICAgICAgIGhhdmUgdGhlaXIgb3duIHJlbGVhc2Ugc2NoZWR1bGVzIGFuZCBkZWdyZWUgb2YgbWF0dXJpdHksIG5vdCBsaW5rZWQgdG8gCisgICAgICAgICAgdGhlIGxvdy1sZXZlbCBsaWJyYXJ5IGFuZCBidXMgZGFlbW9uIHJlbGVhc2UuIENoZWNrIHRoZSBwcm9qZWN0IHBhZ2UgZm9yCisgICAgICAgICAgdGhlIGJpbmRpbmcgeW91J3JlIGNvbnNpZGVyaW5nIHRvIHVuZGVyc3RhbmQgdGhhdCBwcm9qZWN0J3MgcG9saWNpZXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvcWFuZGFlbnRyeT4KKworICAgIDxxYW5kYWVudHJ5PgorICAgICAgPHF1ZXN0aW9uPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBIb3cgaXMgdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBsaWNlbnNlZD8gQ2FuIEkgdXNlIGl0IGluIAorICAgICAgICAgIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucz8KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSBzaG9ydCBhbnN3ZXIgaXMgeWVzLCB5b3UgY2FuIHVzZSBpdCBpbiBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMuCisgICAgICAgICAgWW91IHNob3VsZCByZWFkIHRoZSA8dWxpbmsgdXJsPSJDT1BZSU5HIj5DT1BZSU5HPC91bGluaz4gZmlsZSwgd2hpY2gKKyAgICAgICAgICBvZmZlcnMgeW91IHRoZSBjaG9pY2Ugb2YgdHdvIGxpY2Vuc2VzLiBUaGVzZSBhcmUgdGhlIEdQTCBhbmQgdGhlCisgICAgICAgICAgQUZMLiBUaGUgR1BMIHJlcXVpcmVzIHRoYXQgeW91ciBhcHBsaWNhdGlvbiBiZSBsaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgICAgICAgICAgYXMgd2VsbC4gVGhlIEFGTCBpcyBhbiAiWC1zdHlsZSIgb3IgIkJTRC1zdHlsZSIgbGljZW5zZSBjb21wYXRpYmxlCisgICAgICAgICAgd2l0aCBwcm9wcmlldGFyeSBsaWNlbnNpbmcsIGJ1dCBpdCBkb2VzIGhhdmUgc29tZSByZXF1aXJlbWVudHM7IGluCisgICAgICAgICAgcGFydGljdWxhciBpdCBwcm9oaWJpdHMgeW91IGZyb20gZmlsaW5nIGEgbGF3c3VpdCBhbGxlZ2luZyB0aGF0IHRoZQorICAgICAgICAgIEQtQnVzIHNvZnR3YXJlIGluZnJpbmdlcyB5b3VyIHBhdGVudHMgPGVtcGhhc2lzPndoaWxlIHlvdSBjb250aW51ZSB0bworICAgICAgICAgIHVzZSBELUJ1czwvZW1waGFzaXM+LiAgSWYgeW91J3JlIGdvaW5nIHRvIHN1ZSwgeW91IGhhdmUgdG8gc3RvcCB1c2luZworICAgICAgICAgIHRoZSBzb2Z0d2FyZS4gUmVhZCB0aGUgbGljZW5zZXMgdG8gZGV0ZXJtaW5lIHRoZWlyIG1lYW5pbmcsIHRoaXMgRkFRCisgICAgICAgICAgZW50cnkgaXMgbm90IGludGVuZGVkIHRvIGNoYW5nZSB0aGUgbWVhbmluZyBvciB0ZXJtcyBvZiB0aGUgbGljZW5zZXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvcWFuZGFlbnRyeT4KKworICAgIDxxYW5kYWVudHJ5PgorICAgICAgPHF1ZXN0aW9uPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBXaGF0IGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBidXMgbmFtZSwgYW5kIG9iamVjdCBwYXRoLCAKKyAgICAgICAgICBhbmQgYW4gaW50ZXJmYWNlPworICAgICAgICA8L3BhcmE+CisgICAgICA8L3F1ZXN0aW9uPgorICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSWYgeW91IGltYWdpbmUgYSBDKysgcHJvZ3JhbSB0aGF0IGltcGxlbWVudHMgYSBuZXR3b3JrIHNlcnZpY2UsIHRoZW4KKyAgICAgICAgICB0aGUgYnVzIG5hbWUgaXMgdGhlIGhvc3RuYW1lIG9mIHRoZSBjb21wdXRlciBydW5uaW5nIHRoaXMgQysrIHByb2dyYW0sCisgICAgICAgICAgdGhlIG9iamVjdCBwYXRoIGlzIGEgQysrIG9iamVjdCBpbnN0YW5jZSBwb2ludGVyLCBhbmQgYW4gaW50ZXJmYWNlIGlzCisgICAgICAgICAgYSBDKysgY2xhc3MgKGEgcHVyZSB2aXJ0dWFsIG9yIGFic3RyYWN0IGNsYXNzLCB0byBiZSBleGFjdCkuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSW4gSmF2YSB0ZXJtcywgdGhlIG9iamVjdCBwYXRoIGlzIGFuIG9iamVjdCByZWZlcmVuY2UsIAorICAgICAgICAgIGFuZCBhbiBpbnRlcmZhY2UgaXMgYSBKYXZhIGludGVyZmFjZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBQZW9wbGUgZ2V0IGNvbmZ1c2VkIGJlY2F1c2UgaWYgdGhleSB3cml0ZSBhbiBhcHBsaWNhdGlvbiAKKyAgICAgICAgICB3aXRoIGEgc2luZ2xlIG9iamVjdCBpbnN0YW5jZSBhbmQgYSBzaW5nbGUgaW50ZXJmYWNlLCAKKyAgICAgICAgICB0aGVuIHRoZSBidXMgbmFtZSwgb2JqZWN0IHBhdGgsIGFuZCBpbnRlcmZhY2UgbG9vayAKKyAgICAgICAgICByZWR1bmRhbnQuIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgaGF2ZSBhIHRleHQgZWRpdG9yIAorICAgICAgICAgIHRoYXQgdXNlcyB0aGUgYnVzIG5hbWUgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLlRleHRFZGl0b3I8L2xpdGVyYWw+LAorICAgICAgICAgIGhhcyBhIGdsb2JhbCBzaW5nbGV0b24gb2JqZWN0IGNhbGxlZCAKKyAgICAgICAgICA8bGl0ZXJhbD4vb3JnL2ZyZWVkZXNrdG9wL1RleHRFZGl0b3I8L2xpdGVyYWw+LCBhbmQgCisgICAgICAgICAgdGhhdCBzaW5nbGV0b24gb2JqZWN0IGNvdWxkIGltcGxlbWVudCB0aGUgaW50ZXJmYWNlIAorICAgICAgICAgIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5UZXh0RWRpdG9yPC9saXRlcmFsPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBIb3dldmVyLCBhIHRleHQgZWRpdG9yIGFwcGxpY2F0aW9uIGNvdWxkIGFzIGVhc2lseSBvd24gbXVsdGlwbGUgYnVzCisgICAgICAgICAgbmFtZXMgKGZvciBleGFtcGxlLCA8bGl0ZXJhbD5vcmcua2RlLktXcml0ZTwvbGl0ZXJhbD4gaW4gYWRkaXRpb24gdG8KKyAgICAgICAgICBnZW5lcmljIDxsaXRlcmFsPlRleHRFZGl0b3I8L2xpdGVyYWw+KSwgaGF2ZSBtdWx0aXBsZSBvYmplY3RzIChtYXliZQorICAgICAgICAgIDxsaXRlcmFsPi9vcmcva2RlL2RvY3VtZW50cy80MzUyPC9saXRlcmFsPiB3aGVyZSB0aGUgbnVtYmVyIGNoYW5nZXMKKyAgICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIGRvY3VtZW50KSwgYW5kIGVhY2ggb2JqZWN0IGNvdWxkIGltcGxlbWVudCBtdWx0aXBsZQorICAgICAgICAgIGludGVyZmFjZXMsIHN1Y2ggYXMgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuSW50cm9zcGVjdGFibGU8L2xpdGVyYWw+LAorICAgICAgICAgIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5CYXNpY1RleHRGaWVsZDwvbGl0ZXJhbD4sCisgICAgICAgICAgPGxpdGVyYWw+b3JnLmtkZS5SaWNoVGV4dERvY3VtZW50PC9saXRlcmFsPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9xYW5kYWVudHJ5PgorCisKKyAgICA8cWFuZGFlbnRyeSBpZD0ic2VydmljZSI+CisgICAgICA8cXVlc3Rpb24+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFdoYXQgaXMgYSAic2VydmljZSI/CisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBIHNlcnZpY2UgaXMgYSBwcm9ncmFtIHRoYXQgY2FuIGJlIGxhdW5jaGVkIGJ5IHRoZSBidXMgZGFlbW9uIAorICAgICAgICAgIHRvIHByb3ZpZGUgc29tZSBmdW5jdGlvbmFsaXR5IHRvIG90aGVyIHByb2dyYW1zLiBTZXJ2aWNlcworICAgICAgICAgIGFyZSBub3JtYWxseSBsYXVuY2hlZCBhY2NvcmRpbmcgdG8gdGhlIGJ1cyBuYW1lIHRoZXkgd2lsbCAKKyAgICAgICAgICBoYXZlLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFBlb3BsZSBvZnRlbiBtaXN1c2UgdGhlIHdvcmQgInNlcnZpY2UiIGZvciBhbnkgCisgICAgICAgICAgYnVzIG5hbWUsIGJ1dCB0aGlzIHRlbmRzIHRvIGJlIGFtYmlndW91cyBhbmQgY29uZnVzaW5nIHNvIGlzIGRpc2NvdXJhZ2VkLgorICAgICAgICAgIEluIHRoZSBELUJ1cyBkb2NzIHdlIHRyeSB0byB1c2UgInNlcnZpY2UiIG9ubHkgd2hlbiB0YWxraW5nIGFib3V0IAorICAgICAgICAgIHByb2dyYW1zIHRoZSBidXMga25vd3MgaG93IHRvIGxhdW5jaCwgaS5lLiBhIHNlcnZpY2UgYWx3YXlzIGhhcyBhIAorICAgICAgICAgIC5zZXJ2aWNlIGZpbGUuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvcWFuZGFlbnRyeT4KKworICAgIDxxYW5kYWVudHJ5IGlkPSJjb21wb25lbnRzIj4KKyAgICAgIDxxdWVzdGlvbj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSXMgRC1CdXMgYSAiY29tcG9uZW50IHN5c3RlbSI/CisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBJdCBoZWxwcyB0byBrZWVwIHRoZXNlIGNvbmNlcHRzIHNlcGFyYXRlIGluIHlvdXIgbWluZDoKKyAgICAgICAgICA8b3JkZXJlZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIE9iamVjdC9jb21wb25lbnQgc3lzdGVtCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEdVSSBjb250cm9sL3dpZGdldCBlbWJlZGRpbmcgaW50ZXJmYWNlcworICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBJbnRlcnByb2Nlc3MgY29tbXVuaWNhdGlvbiBzeXN0ZW0gb3Igd2lyZSBwcm90b2NvbAorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDwvb3JkZXJlZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRC1CdXMgaXMgbm90IGEgY29tcG9uZW50IHN5c3RlbS4gIkNvbXBvbmVudCBzeXN0ZW0iIHdhcyBvcmlnaW5hbGx5CisgICAgICAgICAgZGVmaW5lZCBieSBDT00sIGFuZCB3YXMgZXNzZW50aWFsbHkgYSB3b3JrYXJvdW5kIGZvciB0aGUgbGltaXRhdGlvbnMKKyAgICAgICAgICBvZiB0aGUgQysrIG9iamVjdCBzeXN0ZW0gKGFkZGluZyBpbnRyb3NwZWN0aW9uLCBydW50aW1lIGxvY2F0aW9uIG9mCisgICAgICAgICAgb2JqZWN0cywgQUJJIGd1YXJhbnRlZXMsIGFuZCBzbyBmb3J0aCkuIFdpdGggdGhlIEMjIGxhbmd1YWdlIGFuZCBDTFIsCisgICAgICAgICAgTWljcm9zb2Z0IGFkZGVkIHRoZXNlIGZlYXR1cmVzIHRvIHRoZSBwcmltYXJ5IG9iamVjdCBzeXN0ZW0sIGxlYXZpbmcKKyAgICAgICAgICBDT00gb2Jzb2xldGUuIFNpbWlsYXJseSwgSmF2YSBoYXMgbXVjaCBsZXNzIG5lZWQgZm9yIHNvbWV0aGluZyBsaWtlCisgICAgICAgICAgQ09NIHRoYW4gQysrIGRpZC4gRXZlbiBRT2JqZWN0IChmcm9tIFF0KSBhbmQgR09iamVjdCAoZnJvbSBHTGliKSBvZmZlcgorICAgICAgICAgIHNvbWUgb2YgdGhlIHNhbWUgZmVhdHVyZXMgZm91bmQgaW4gQ09NLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIENvbXBvbmVudCBzeXN0ZW1zIGFyZSBub3QgYWJvdXQgR1VJIGNvbnRyb2wgZW1iZWRkaW5nLiBFbWJlZGRpbmcKKyAgICAgICAgICBhIHNwcmVhZHNoZWV0IGluIGEgd29yZCBwcm9jZXNzb3IgZG9jdW1lbnQgaXMgYSBtYXR0ZXIgb2YgZGVmaW5pbmcKKyAgICAgICAgICBzb21lIHNwZWNpZmljIDxlbXBoYXNpcz5pbnRlcmZhY2VzPC9lbXBoYXNpcz4gdGhhdCBvYmplY3RzCisgICAgICAgICAgY2FuIGltcGxlbWVudC4gVGhlc2UgaW50ZXJmYWNlcyBwcm92aWRlIG1ldGhvZHMgcmVsYXRlZCB0byAKKyAgICAgICAgICBHVUkgY29udHJvbHMuIFNvIGFuIG9iamVjdCBpbXBsZW1lbnRpbmcgdGhvc2UgaW50ZXJmYWNlcyAKKyAgICAgICAgICBjYW4gYmUgZW1iZWRkZWQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlIHdvcmQgImNvbXBvbmVudCIganVzdCBtZWFucyAib2JqZWN0IHdpdGggc29tZSBmYW5jeSBmZWF0dXJlcyIgYW5kCisgICAgICAgICAgaW4gbW9kZXJuIGxhbmd1YWdlcyBhbGwgb2JqZWN0cyBhcmUgZWZmZWN0aXZlbHkgImNvbXBvbmVudHMuIgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFNvIGNvbXBvbmVudHMgYXJlIGZhbmN5IG9iamVjdHMsIGFuZCBzb21lIG9iamVjdHMgYXJlIEdVSSBjb250cm9scy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBIHRoaXJkLCB1bnJlbGF0ZWQgZmVhdHVyZSBpcyBpbnRlcnByb2Nlc3MgY29tbXVuaWNhdGlvbiBvciBJUEMuCisgICAgICAgICAgRC1CdXMgaXMgYW4gSVBDIHN5c3RlbS4gR2l2ZW4gYW4gb2JqZWN0IChvciAiY29tcG9uZW50IiBpZiB5b3UgbXVzdCksIAorICAgICAgICAgIHlvdSBjYW4gZXhwb3NlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoYXQgb2JqZWN0IG92ZXIgYW4gSVBDIHN5c3RlbS4KKyAgICAgICAgICBFeGFtcGxlcyBvZiBJUEMgc3lzdGVtcyBhcmUgRENPTSwgQ09SQkEsIFNPQVAsIFhNTC1SUEMsIGFuZCBELUJ1cy4KKyAgICAgICAgICBZb3UgY2FuIHVzZSBhbnkgb2YgdGhlc2UgSVBDIHN5c3RlbXMgd2l0aCBhbnkgb2JqZWN0L2NvbXBvbmVudCBzeXN0ZW0sCisgICAgICAgICAgdGhvdWdoIHNvbWUgb2YgdGhlbSBhcmUgInR1bmVkIiBmb3Igc3BlY2lmaWMgb2JqZWN0IHN5c3RlbXMuCisgICAgICAgICAgWW91IGNhbiB0aGluayBvZiBhbiBJUEMgc3lzdGVtIHByaW1hcmlseSBhcyBhIHdpcmUgcHJvdG9jb2wuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSWYgeW91IGNvbWJpbmUgYW4gSVBDIHN5c3RlbSB3aXRoIGEgc2V0IG9mIEdVSSBjb250cm9sIGludGVyZmFjZXMsIAorICAgICAgICAgIHRoZW4geW91IGNhbiBoYXZlIGFuIG91dC1vZi1wcm9jZXNzIG9yIGR5bmFtaWNhbGx5LWxvYWRlZCBHVUkgY29udHJvbC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBbm90aGVyIHJlbGF0ZWQgY29uY2VwdCBpcyB0aGUgPGZpcnN0dGVybT5wbHVnaW48L2ZpcnN0dGVybT4gb3IKKyAgICAgICAgICA8Zmlyc3R0ZXJtPmV4dGVuc2lvbjwvZmlyc3R0ZXJtPi4gIEdlbmVyaWMgcGx1Z2luIHN5c3RlbXMgc3VjaCBhcyB0aGUKKyAgICAgICAgICA8dWxpbmsgdXJsPSJodHRwOi8vZWNsaXBzZS5vcmciPkVjbGlwc2U8L3VsaW5rPiBzeXN0ZW0gYXJlIG5vdCBzbyBkaWZmZXJlbnQKKyAgICAgICAgICBmcm9tIGNvbXBvbmVudC9vYmplY3Qgc3lzdGVtcywgdGhvdWdoIHBlcmhhcHMgYSAicGx1Z2luIiB0ZW5kcyB0byBiZSBhCisgICAgICAgICAgYnVuZGxlIG9mIG9iamVjdHMgd2l0aCBhIHVzZXItdmlzaWJsZSBuYW1lIGFuZCBjYW4gYmUKKyAgICAgICAgICBkb3dubG9hZGVkL3BhY2thZ2VkIGFzIGEgdW5pdC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9xYW5kYWVudHJ5PgorCisgICAgPHFhbmRhZW50cnkgaWQ9InNwZWVkIj4KKyAgICAgIDxxdWVzdGlvbj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSG93IGZhc3QgaXMgdGhlIEQtQnVzIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbj8KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIE9mIGNvdXJzZSBpdCBkZXBlbmRzIGEgYml0IG9uIHdoYXQgeW91J3JlIGRvaW5nLiAKKyAgICAgICAgICA8dWxpbmsgdXJsPSJodHRwOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL3BpcGVybWFpbC9kYnVzLzIwMDQtTm92ZW1iZXIvMDAxNzc5Lmh0bWwiPgorICAgICAgICAgICAgVGhpcyBtYWlsPC91bGluaz4gY29udGFpbnMgc29tZSBiZW5jaG1hcmtpbmcuICBBdCB0aGUgdGltZSBvZiB0aGF0CisgICAgICAgICAgYmVuY2htYXJrLCBELUJ1cyBvbmUtdG8tb25lIGNvbW11bmljYXRpb24gd2FzIGFib3V0IDIuNXggc2xvd2VyIHRoYW4KKyAgICAgICAgICBzaW1wbHkgcHVzaGluZyB0aGUgZGF0YSByYXcgb3ZlciBhIHNvY2tldC4gQWZ0ZXIgdGhlIHJlY2VudCByZXdyaXRlIG9mCisgICAgICAgICAgdGhlIG1hcnNoYWxpbmcgY29kZSwgRC1CdXMgaXMgc2xvd2VyIHRoYW4gdGhhdCBiZWNhdXNlIGEgbG90IG9mCisgICAgICAgICAgb3B0aW1pemF0aW9uIHdvcmsgd2FzIGxvc3QuIEJ1dCBpdCBjYW4gcHJvYmFibHkgYmUgc3BlZCB1cCBhZ2Fpbi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBELUJ1cyBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGludGVybWVkaWF0ZSBidXMgZGFlbW9uIHNob3VsZCBiZSAKKyAgICAgICAgICAoYW5kIGFzIGxhc3QgcHJvZmlsZWQsIHdhcykgYWJvdXQgdHdpY2UgYXMgc2xvdyBhcyBvbmUtdG8tb25lIAorICAgICAgICAgIG1vZGUsIGJlY2F1c2UgYSByb3VuZCB0cmlwIGludm9sdmVzIGZvdXIgc29ja2V0IHJlYWRzL3dyaXRlcyByYXRoZXIgCisgICAgICAgICAgdGhhbiB0d28gc29ja2V0IHJlYWRzL3dyaXRlcy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgb3ZlcmhlYWQgY29tZXMgZnJvbSBhIGNvdXBsZSBvZiBwbGFjZXM7IHBhcnQgb2YgaXQgaXMgc2ltcGx5IAorICAgICAgICAgICJhYnN0cmFjdGlvbiBwZW5hbHR5IiAodGhlcmUgYXJlIGxheWVycyBvZiBjb2RlIHRvIHN1cHBvcnQgCisgICAgICAgICAgbXVsdGlwbGUgbWFpbiBsb29wcywgbXVsdGlwbGUgdHJhbnNwb3J0IHR5cGVzLCBzZWN1cml0eSwgZXRjLikuCisgICAgICAgICAgUHJvYmFibHkgdGhlIGxhcmdlc3QgcGFydCBjb21lcyBmcm9tIGRhdGEgdmFsaWRhdGlvbgorICAgICAgICAgIChiZWNhdXNlIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgdHJ1c3QgaW5jb21pbmcgZGF0YSkuCisgICAgICAgICAgSXQgd291bGQgYmUgc2ltcGxlIHRvIGFkZCBhICJubyB2YWxpZGF0aW9uIiBtb2RlLCBidXQgcHJvYmFibHkgCisgICAgICAgICAgbm90IGEgZ29vZCBpZGVhIGFsbCB0aGluZ3MgY29uc2lkZXJlZC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBSYXcgYmFuZHdpZHRoIGlzbid0IHRoZSBvbmx5IGNvbmNlcm47IEQtQnVzIGlzIGRlc2lnbmVkIHRvIAorICAgICAgICAgIGVuYWJsZSBhc3luY2hyb25vdXMgY29tbXVuaWNhdGlvbiBhbmQgYXZvaWQgcm91bmQgdHJpcHMuCisgICAgICAgICAgVGhpcyBpcyBmcmVxdWVudGx5IGEgbW9yZSBpbXBvcnRhbnQgcGVyZm9ybWFuY2UgaXNzdWUgCisgICAgICAgICAgdGhhbiB0aHJvdWdocHV0LgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L3FhbmRhZW50cnk+CisKKworICAgIDxxYW5kYWVudHJ5IGlkPSJzaXplIj4KKyAgICAgIDxxdWVzdGlvbj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSG93IGxhcmdlIGlzIHRoZSBELUJ1cyByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24/CisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBIHByb2R1Y3Rpb24gYnVpbGQgKHdpdGggYXNzZXJ0aW9ucywgdW5pdCB0ZXN0cywgYW5kIHZlcmJvc2UgbG9nZ2luZworICAgICAgICAgIGRpc2FibGVkKSBpcyBvbiB0aGUgb3JkZXIgb2YgYSAxNTBLIHNoYXJlZCBsaWJyYXJ5LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEEgbXVjaCwgbXVjaCBzbWFsbGVyIGltcGxlbWVudGF0aW9uIHdvdWxkIGJlIHBvc3NpYmxlIGJ5IG9taXR0aW5nIG91dAorICAgICAgICAgIG9mIG1lbW9yeSBoYW5kbGluZywgaGFyZGNvZGluZyBhIG1haW4gbG9vcCAob3IgYWx3YXlzIHVzaW5nIGJsb2NraW5nCisgICAgICAgICAgSS9PKSwgc2tpcHBpbmcgdmFsaWRhdGlvbiwgYW5kIG90aGVyd2lzZSBzaW1wbGlmeWluZyB0aGluZ3MuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvcWFuZGFlbnRyeT4KKyAgICAKKyAgICA8cWFuZGFlbnRyeSBpZD0ib3RoZXItaXBjIj4KKyAgICAgIDxxdWVzdGlvbj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSG93IGRvZXMgRC1CdXMgZGlmZmVyIGZyb20gb3RoZXIgaW50ZXJwcm9jZXNzIGNvbW11bmljYXRpb24KKyAgICAgICAgICBvciBuZXR3b3JraW5nIHByb3RvY29scz8KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEtlZXAgaW4gbWluZCwgaXQgaXMgbm90IG9ubHkgYW4gSVBDIHN5c3RlbTsgaXQgYWxzbyBpbmNsdWRlcworICAgICAgICAgIGxpZmVjeWNsZSB0cmFja2luZywgc2VydmljZSBhY3RpdmF0aW9uLCBzZWN1cml0eSBwb2xpY3ksIGFuZCBvdGhlcgorICAgICAgICAgIGhpZ2hlci1sZXZlbCBzdHJ1Y3R1cmUgYW5kIGFzc3VtcHRpb25zLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSBiZXN0IHBsYWNlIHRvIHN0YXJ0IGlzIHRvIHJlYWQgdGhlIEQtQnVzIDx1bGluayB1cmw9ImRidXMtdHV0b3JpYWwuaHRtbCI+dHV0b3JpYWw8L3VsaW5rPiwgc28gCisgICAgICAgICAgeW91IGhhdmUgYSBjb25jcmV0ZSBpZGVhIHdoYXQgRC1CdXMgYWN0dWFsbHkgaXMuIElmIHlvdSAKKyAgICAgICAgICB1bmRlcnN0YW5kIG90aGVyIHByb3RvY29scyBvbiBhIHdpcmUgZm9ybWF0IGxldmVsLCB5b3UgCisgICAgICAgICAgbWF5IGFsc28gd2FudCB0byByZWFkIHRoZSBELUJ1cyA8dWxpbmsgdXJsPSJkYnVzLXNwZWNpZmljYXRpb24uaHRtbCI+c3BlY2lmaWNhdGlvbjwvdWxpbms+IHRvIHNlZSB3aGF0IAorICAgICAgICAgIEQtQnVzIGxvb2tzIGxpa2Ugb24gYSBsb3cgbGV2ZWwuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQXMgdGhlIDx1bGluayB1cmw9ImRidXMtdHV0b3JpYWwuaHRtbCI+dHV0b3JpYWw8L3VsaW5rPiBhbmQgPHVsaW5rIHVybD0iZGJ1cy1zcGVjaWZpY2F0aW9uLmh0bWwiPnNwZWNpZmljYXRpb248L3VsaW5rPiBib3RoIGV4cGxhaW4sIEQtQnVzIGlzIHR1bmVkIAorICAgICAgICAgIGZvciBzb21lIHNwZWNpZmljIHVzZSBjYXNlcy4gVGh1cywgaXQgcHJvYmFibHkgaXNuJ3QgdHVuZWQgCisgICAgICAgICAgZm9yIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVubGVzcyB5b3UgYXJlIGRvaW5nIHRoZSB0aGluZ3MgCisgICAgICAgICAgRC1CdXMgd2FzIGRlc2lnbmVkIGZvci4gRG9uJ3QgbWFrZSB0aGUgbWlzdGFrZSBvZiB0aGlua2luZyAKKyAgICAgICAgICB0aGF0IGFueSBzeXN0ZW0gaW52b2x2aW5nICJJUEMiIGlzIHRoZSBzYW1lIHRoaW5nLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSBELUJ1cyBhdXRob3JzIHdvdWxkIG5vdCByZWNvbW1lbmQgdXNpbmcgRC1CdXMgCisgICAgICAgICAgZm9yIGFwcGxpY2F0aW9ucyB3aGVyZSBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UuCisgICAgICAgICAgVGhlIGZvbGxvd2luZyBxdWVzdGlvbnMgY29tcGFyZSBELUJ1cyB0byBzb21lIG90aGVyIAorICAgICAgICAgIHByb3RvY29scyBwcmltYXJpbHkgdG8gaGVscCB5b3UgdW5kZXJzdGFuZCBELUJ1cyAKKyAgICAgICAgICBhbmQgZGVjaWRlIHdoZXRoZXIgaXQncyBhcHByb3ByaWF0ZTsgRC1CdXMgaXMgbmVpdGhlciBpbnRlbmRlZAorICAgICAgICAgIG5vciBjbGFpbWVkIHRvIGJlIHRoZSByaWdodCBjaG9pY2UgZm9yIGV2ZXJ5IGFwcGxpY2F0aW9uLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBicmlkZ2UgRC1CdXMgdG8gb3RoZXIgSVBDIHN5c3RlbXMsIAorICAgICAgICAgIGp1c3QgYXMgRC1CdXMgY2FuIGJlIGJyaWRnZWQgdG8gb2JqZWN0IHN5c3RlbXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgTm90ZTogdGhlIEQtQnVzIG1haWxpbmcgbGlzdCBzdWJzY3JpYmVycyBhcmUgPGVtcGhhc2lzPnZlcnkgbXVjaCBub3QKKyAgICAgICAgICBpbnRlcmVzdGVkPC9lbXBoYXNpcz4gaW4gZGViYXRpbmcgd2hpY2ggSVBDIHN5c3RlbSBpcyB0aGUgT25lIFRydWUKKyAgICAgICAgICBTeXN0ZW0uIFNvIGlmIHlvdSB3YW50IHRvIGRpc2N1c3MgdGhhdCwgcGxlYXNlIHVzZSBhbm90aGVyIGZvcnVtLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2Fuc3dlcj4gICAgICAKKyAgICA8L3FhbmRhZW50cnk+CisKKyAgICAKKyAgICA8cWFuZGFlbnRyeSBpZD0iY29yYmEiPgorICAgICAgPHF1ZXN0aW9uPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBIb3cgZG9lcyBELUJ1cyBkaWZmZXIgZnJvbSBDT1JCQT8KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFN0YXJ0IGJ5IHJlYWRpbmcgPHhyZWYgbGlua2VuZD0ib3RoZXItaXBjIi8+LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIDx1bGluayB1cmw9Imh0dHA6Ly93d3cub21nLm9yZyI+Q09SQkE8L3VsaW5rPiBpcyBkZXNpZ25lZCB0byBzdXBwb3J0CisgICAgICAgICBvYmplY3Qtb3JpZW50ZWQgSVBDIGJldHdlZW4gb2JqZWN0cywgYXV0b21hdGljYWxseSBtYXJzaGFsbGluZworICAgICAgICAgcGFyYW1ldGVycyBhcyBuZWNlc3NhcnkuIENPUkJBIGlzIHN0cm9uZ2x5IHN1cHBvcnRlZCBieSB0aGUgPHVsaW5rCisgICAgICAgICB1cmw9Imh0dHA6Ly93d3cub21nLm9yZyI+T3BlbiBNYW5hZ2VtZW50IEdyb3VwIChPTUcpPC91bGluaz4sIHdoaWNoCisgICAgICAgICBwcm9kdWNlcyB2YXJpb3VzIHN0YW5kYXJkcyBhbmQgc3VwcG9ydGluZyBkb2N1bWVudHMgZm9yIENPUkJBIGFuZCBoYXMKKyAgICAgICAgIHRoZSBiYWNraW5nIG9mIG1hbnkgbGFyZ2Ugb3JnYW5pemF0aW9ucy4gIFRoZXJlIGFyZSBtYW55IENPUkJBIE9SQnMKKyAgICAgICAgIGF2YWlsYWJsZSwgYm90aCBwcm9wcmlldGFyeSBPUkJzIGFuZCBmcmVlIC8gb3BlbiBzb3VyY2Ugc29mdHdhcmUgT1JCcworICAgICAgICAgKHRoZSBsYXR0ZXIgaW5jbHVkZSA8dWxpbmsKKyAgICAgICAgIHVybD0iaHR0cDovL29yYml0LXJlc291cmNlLnNvdXJjZWZvcmdlLm5ldC8iPk9SQml0PC91bGluaz4sIDx1bGluaworICAgICAgICAgdXJsPSJodHRwOi8vd3d3Lm1pY28ub3JnLyI+TUlDTzwvdWxpbms+LCBhbmQgPHVsaW5rCisgICAgICAgICB1cmw9Imh0dHA6Ly93d3cudGhlYWNlb3JiLmNvbS8iPlRoZSBBQ0UgT3JiIChUQU8pPC91bGluaz4pLiAgTWFueQorICAgICAgICAgb3JnYW5pemF0aW9ucyBjb250aW51ZSB0byB1c2UgQ09SQkEgT1JCcyBmb3IgdmFyaW91cyBraW5kcyBvZiBJUEMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQm90aCBHTk9NRSBhbmQgS0RFIGhhdmUgdXNlZCBDT1JCQSBhbmQgdGhlbiBtb3ZlZCBhd2F5IGZyb20gaXQuICBLREUKKyAgICAgICAgICBoYWQgbW9yZSBzdWNjZXNzIHdpdGggYSBzeXN0ZW0gY2FsbGVkIERDT1AsIGFuZCBHTk9NRSBsYXllcmVkIGEgc3lzdGVtCisgICAgICAgICAgY2FsbGVkIEJvbm9ibyBvbiB0b3Agb2YgQ09SQkEuIFdpdGhvdXQgY3VzdG9tIGV4dGVuc2lvbnMsIENPUkJBIGRvZXMKKyAgICAgICAgICBub3Qgc3VwcG9ydCBtYW55IG9mIHRoZSB0aGluZ3Mgb25lIHdhbnRzIHRvIGRvIGluIGEgZGVza3RvcAorICAgICAgICAgIGVudmlyb25tZW50IHdpdGggdGhlIEdOT01FL0tERSBhcmNoaXRlY3R1cmUuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQ09SQkEgb24gdGhlIG90aGVyIGhhbmQgaGFzIGEgbnVtYmVyIG9mIGZlYXR1cmVzIG9mIGludGVyZXN0IGZvcgorICAgICAgICAgIGVudGVycHJpc2UgYW5kIHdlYiBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCwgdGhvdWdoIFhNTCBzeXN0ZW1zIHN1Y2ggYXMKKyAgICAgICAgICBTT0FQIGFyZSB0aGUgbGF0ZXN0IGZhZC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBMaWtlIEQtQnVzLCBDT1JCQSB1c2VzIGEgZmFzdCBiaW5hcnkgcHJvdG9jb2wgKElJT1ApLiBCb3RoIHN5c3RlbXMKKyAgICAgICAgICB3b3JrIGluIHRlcm1zIG9mIG9iamVjdHMgYW5kIG1ldGhvZHMsIGFuZCBoYXZlIGNvbmNlcHRzIHN1Y2ggYXMKKyAgICAgICAgICAib25ld2F5IiBjYWxscy4gT25seSBELUJ1cyBoYXMgZGlyZWN0IHN1cHBvcnQgZm9yICJzaWduYWxzIiBhcyBpbgorICAgICAgICAgIEdMaWIvUXQgKG9yIEphdmEgbGlzdGVuZXJzLCBvciBDIyBkZWxlZ2F0ZXMpLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEQtQnVzIGhhcmRjb2RlcyBhbmQgc3BlY2lmaWVzIGEgbG90IG9mIHRoaW5ncyB0aGF0IENPUkJBIGxlYXZlcyBvcGVuLWVuZGVkLAorICAgICAgICAgIGJlY2F1c2UgQ09SQkEgaXMgbW9yZSBnZW5lcmljIGFuZCBELUJ1cyBoYXMgdHdvIHNwZWNpZmljIHVzZS1jYXNlcyBpbiBtaW5kLgorICAgICAgICAgIFRoaXMgbWFrZXMgRC1CdXMgYSBiaXQgc2ltcGxlci4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBIb3dldmVyLCB1bmxpa2UgQ09SQkEgRC1CdXMgZG9lcyA8ZW1waGFzaXM+bm90PC9lbXBoYXNpcz4gc3BlY2lmeSB0aGUKKyAgICAgICAgICBBUEkgZm9yIHRoZSBsYW5ndWFnZSBiaW5kaW5ncy4gSW5zdGVhZCwgIm5hdGl2ZSIgYmluZGluZ3MgYWRhcHRlZAorICAgICAgICAgIHNwZWNpZmljYWxseSB0byB0aGUgY29udmVudGlvbnMgb2YgYSBmcmFtZXdvcmsgc3VjaCBhcyBRT2JqZWN0LAorICAgICAgICAgIEdPYmplY3QsIEMjLCBKYXZhLCBQeXRob24sIGV0Yy4gYXJlIGVuY291cmFnZWQuIFRoZSBsaWJkYnVzIHJlZmVyZW5jZQorICAgICAgICAgIGltcGxlbWVudGF0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGEgYmFja2VuZCBmb3IgYmluZGluZ3Mgb2YgdGhpcworICAgICAgICAgIG5hdHVyZSwgcmF0aGVyIHRoYW4gdG8gYmUgdXNlZCBkaXJlY3RseS4gVGhlIHJhdGlvbmFsZSBpcyB0aGF0IGFuIElQQworICAgICAgICAgIHN5c3RlbSBBUEkgc2hvdWxkIG5vdCAibGVhayIgYWxsIG92ZXIgYSBwcm9ncmFtOyBpdCBzaG91bGQgY29tZSBpbnRvCisgICAgICAgICAgcGxheSBvbmx5IGp1c3QgYmVmb3JlIGRhdGEgZ29lcyBvdmVyIHRoZSB3aXJlLiBBcyBhbiBhc2lkZSwgT01HIGlzCisgICAgICAgICAgYXBwYXJlbnRseSB3b3JraW5nIG9uIGEgc2ltcGxlciBDKysgYmluZGluZyBmb3IgQ09SQkEuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgTWFueSBDT1JCQSBpbXBsZW1lbnRhdGlvbnMgc3VjaCBhcyBPUkJpdCBhcmUgZmFzdGVyIHRoYW4gdGhlIGxpYmRidXMKKyAgICAgICAgICByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24uICBPbmUgcmVhc29uIGlzIHRoYXQgRC1CdXMgY29uc2lkZXJzIGRhdGEKKyAgICAgICAgICBmcm9tIHRoZSBvdGhlciBlbmQgb2YgdGhlIGNvbm5lY3Rpb24gdG8gYmUgdW50cnVzdGVkIGFuZCBleHRlbnNpdmVseQorICAgICAgICAgIHZhbGlkYXRlcyBpdC4gQnV0IGdlbmVyYWxseSBzcGVha2luZyBvdGhlciBwcmlvcml0aWVzIHdlcmUgcGxhY2VkCisgICAgICAgICAgYWhlYWQgb2YgcmF3IHNwZWVkIGluIHRoZSBsaWJkYnVzIGltcGxlbWVudGF0aW9uLiBBIGZhc3QgRC1CdXMKKyAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBhbG9uZyB0aGUgbGluZXMgb2YgT1JCaXQgc2hvdWxkIGJlIHBvc3NpYmxlLCBvZiBjb3Vyc2UuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgT24gYSBtb3JlIHRyaXZpYWwgbm90ZSwgRC1CdXMgaW52b2x2ZXMgc3Vic3RhbnRpYWxseSBmZXdlciBhY3JvbnltcworICAgICAgICAgIHRoYW4gQ09SQkEuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvcWFuZGFlbnRyeT4KKworCisgICAgPHFhbmRhZW50cnkgaWQ9InhtbHJwY3NvYXAiPgorICAgICAgPHF1ZXN0aW9uPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBIb3cgZG9lcyBELUJ1cyBkaWZmZXIgZnJvbSBYTUwtUlBDIGFuZCBTT0FQPworICAgICAgICA8L3BhcmE+CisgICAgICA8L3F1ZXN0aW9uPgorICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgU3RhcnQgYnkgcmVhZGluZyA8eHJlZiBsaW5rZW5kPSJvdGhlci1pcGMiLz4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSW4gPHVsaW5rIHVybD0iaHR0cDovL3d3dy53My5vcmcvVFIvU09BUC8iPlNPQVA8L3VsaW5rPiBhbmQgPHVsaW5rCisgICAgICAgICAgICB1cmw9Imh0dHA6Ly93d3cueG1scnBjLmNvbSI+WE1MLVJQQzwvdWxpbms+LCBSUEMgY2FsbHMgYXJlIHRyYW5zZm9ybWVkCisgICAgICAgICAgaW50byBhbiBYTUwtYmFzZWQgZm9ybWF0LCB0aGVuIHNlbnQgb3ZlciB0aGUgd2lyZSAodHlwaWNhbGx5IHVzaW5nIHRoZQorICAgICAgICAgIEhUVFAgcHJvdG9jb2wpLCB3aGVyZSB0aGV5IGFyZSBwcm9jZXNzZWQgYW5kIHJldHVybmVkLiAgWE1MLVJQQyBpcyB0aGUKKyAgICAgICAgICBzaW1wbGUgcHJvdG9jb2wgKGl0cyBzcGVjIGlzIG9ubHkgYSBwYWdlIG9yIHR3byksIGFuZCBTT0FQIGlzIHRoZQorICAgICAgICAgIGZ1bGwtZmVhdHVyZWQgcHJvdG9jb2wuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgWE1MLVJQQyBhbmQgU09BUCBpbXBvc2UgWE1MIHBhcnNpbmcgb3ZlcmhlYWQgdGhhdCBpcyBub3JtYWxseQorICAgICAgICAgIGlycmVsZXZhbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIEludGVybmV0LCBidXQgc2lnbmlmaWNhbnQgZm9yCisgICAgICAgICAgY29uc3RhbnQgZmluZS1ncmFpbmVkIElQQyBhbW9uZyBhcHBsaWNhdGlvbnMgaW4gYSBkZXNrdG9wIHNlc3Npb24uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRC1CdXMgb2ZmZXJzIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgYW5kIHdpdGggdGhlIGJ1cyBkYWVtb24gCisgICAgICAgICAgc3VwcG9ydHMgbGlmZWN5Y2xlIHRyYWNraW5nIG9mIG90aGVyIGFwcGxpY2F0aW9ucyBjb25uZWN0ZWQKKyAgICAgICAgICB0byB0aGUgYnVzLiBXaXRoIFhNTC1SUEMgYW5kIFNPQVAsIHR5cGljYWxseSBlYWNoIG1ldGhvZCBjYWxsIAorICAgICAgICAgIGV4aXN0cyBpbiBpc29sYXRpb24gYW5kIGhhcyBpdHMgb3duIEhUVFAgY29ubmVjdGlvbi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9xYW5kYWVudHJ5PgorCisgICAgPHFhbmRhZW50cnkgaWQ9ImRjZSI+CisgICAgICA8cXVlc3Rpb24+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEhvdyBkb2VzIEQtQnVzIGRpZmZlciBmcm9tIERDRT8KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFN0YXJ0IGJ5IHJlYWRpbmcgPHhyZWYgbGlua2VuZD0ib3RoZXItaXBjIi8+LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIDx1bGluayB1cmw9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9kY2UvIj5EaXN0cmlidXRlZCBDb21wdXRpbmcKKyAgICAgICAgICBFbnZpcm9ubWVudCAoRENFKTwvdWxpbms+IGlzIGFuIGluZHVzdHJ5LXN0YW5kYXJkIHZlbmRvci1uZXV0cmFsCisgICAgICAgICAgc3RhbmRhcmQgdGhhdCBpbmNsdWRlcyBhbiBJUEMgbWVjaGFuaXNtLiAgPHVsaW5rCisgICAgICAgICAgdXJsPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvY29tbS9wcmVzcy8wNS0wMS0xMi5odG0iPlRoZSBPcGVuIEdyb3VwCisgICAgICAgICAgaGFzIHJlbGVhc2VkIGFuIGltcGxlbWVudGF0aW9uIGFzIG9wZW4gc291cmNlIHNvZnR3YXJlPC91bGluaz4uICBEQ0UKKyAgICAgICAgICBpcyBxdWl0ZSBjYXBhYmxlLCBhbmQgaW5jbHVkZXMgYSB2YXN0IGFtb3VudCBvZiBmdW5jdGlvbmFsaXR5IHN1Y2ggYXMKKyAgICAgICAgICBhIGRpc3RyaWJ1dGVkIHRpbWUgc2VydmljZS4gIEFzIHRoZSBuYW1lIGltcGxpZXMsIERDRSBpcyBpbnRlbmRlZCBmb3IKKyAgICAgICAgICB1c2UgaW4gYSBsYXJnZSwgbXVsdGktY29tcHV0ZXIgZGlzdHJpYnV0ZWQgYXBwbGljYXRpb24uIEQtQnVzIHdvdWxkCisgICAgICAgICAgbm90IGJlIHdlbGwtc3VpdGVkIGZvciB0aGlzLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L3FhbmRhZW50cnk+ICAgIAorCisKKyAgICA8cWFuZGFlbnRyeSBpZD0iZGNvbSI+CisgICAgICA8cXVlc3Rpb24+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEhvdyBkb2VzIEQtQnVzIGRpZmZlciBmcm9tIERDT00gYW5kIENPTT8KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFN0YXJ0IGJ5IHJlYWRpbmcgPHhyZWYgbGlua2VuZD0ib3RoZXItaXBjIi8+LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIENvbXBhcmluZyBELUJ1cyB0byBDT00gaXMgYXBwbGVzIGFuZCBvcmFuZ2VzOyAKKyAgICAgICAgICBzZWUgPHhyZWYgbGlua2VuZD0iY29tcG9uZW50cyIvPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBEQ09NIChkaXN0cmlidXRlZCBDT00pIGlzIGEgV2luZG93cyBJUEMgc3lzdGVtIGRlc2lnbmVkIGZvciB1c2Ugd2l0aAorICAgICAgICAgIHRoZSBDT00gb2JqZWN0IHN5c3RlbS4gSXQncyBzaW1pbGFyIGluIHNvbWUgd2F5cyB0byBEQ0UgYW5kIENPUkJBLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L3FhbmRhZW50cnk+ICAgIAorCisgICAgPHFhbmRhZW50cnkgaWQ9ImludGVybmV0LWNvbW11bmljYXRpb25zLWVuZ2luZSI+CisgICAgICA8cXVlc3Rpb24+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEhvdyBkb2VzIEQtQnVzIGRpZmZlciBmcm9tIFplcm9DJ3MgSW50ZXJuZXQgQ29tbXVuaWNhdGlvbnMgRW5naW5lIChJY2UpCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBTdGFydCBieSByZWFkaW5nIDx4cmVmIGxpbmtlbmQ9Im90aGVyLWlwYyIvPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgPHVsaW5rIHVybD0iaHR0cDovL3d3dy56ZXJvYy5jb20vaWNlLmh0bWwiPiBJbnRlcm5ldAorICAgICAgICAgIENvbW11bmljYXRpb25zIEVuZ2luZSAoSWNlKTwvdWxpbms+IGlzIGEgcG93ZXJmdWwgSVBDIG1lY2hhbmlzbSBtb3JlCisgICAgICAgICAgb24gdGhlIGxldmVsIG9mIFNPQVAgb3IgQ09SQkEgdGhhbiBELUJ1cy4gIEljZSBoYXMgYSAiZHVhbC1saWNlbnNlIgorICAgICAgICAgIGJ1c2luZXNzIGFyb3VuZCBpdDsgaS5lLiB5b3UgY2FuIHVzZSBpdCB1bmRlciB0aGUgR1BMLCBvciBwYXkgZm9yIGEKKyAgICAgICAgICBwcm9wcmlldGFyeSBsaWNlbnNlLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L3FhbmRhZW50cnk+ICAgIAorCisgICAgPHFhbmRhZW50cnkgaWQ9ImludGVyLWNsaWVudC1leGNoYW5nZSI+CisgICAgICA8cXVlc3Rpb24+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEhvdyBkb2VzIEQtQnVzIGRpZmZlciBmcm9tIEludGVyLUNsaWVudCBFeGNoYW5nZSAoSUNFKT8KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIDx1bGluayB1cmw9Imh0dHA6Ly93d3cueC5vcmcvWDExUjYuOC4xL2RvY3MvSUNFL2ljZS5wZGYiPklDRTwvdWxpbms+CisgICAgICAgICAgd2FzIGRldmVsb3BlZCBmb3IgdGhlIFggU2Vzc2lvbiBNYW5hZ2VtZW50IHByb3RvY29sIChYU01QKSwgYXMgcGFydCBvZgorICAgICAgICAgIHRoZSBYIFdpbmRvdyBTeXN0ZW0gKFgxMVI2LjEpLiBUaGUgaWRlYSB3YXMgdG8gYWxsb3cgZGVza3RvcCBzZXNzaW9ucworICAgICAgICAgIHRvIGNvbnRhaW4gbm9uZ3JhcGhpY2FsIGNsaWVudHMgaW4gYWRkaXRpb24gdG8gWCBjbGllbnRzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIElDRSBpcyBhIGJpbmFyeSBwcm90b2NvbCBkZXNpZ25lZCBmb3IgZGVza3RvcCB1c2UsIGFuZCBLREUncyBEQ09QCisgICAgICAgICAgYnVpbGRzIG9uIElDRS4gIElDRSBpcyBzdWJzdGFudGlhbGx5IHNpbXBsZXIgdGhhbiBELUJ1cyAoaW4gY29udHJhc3QKKyAgICAgICAgICB0byBtb3N0IG9mIHRoZSBvdGhlciBJUEMgc3lzdGVtcyBtZW50aW9uZWQgaGVyZSwgd2hpY2ggYXJlIG1vcmUKKyAgICAgICAgICBjb21wbGV4KS4gSUNFIGRvZXNuJ3QgcmVhbGx5IGRlZmluZSBhIG1hcHBpbmcgdG8gb2JqZWN0cyBhbmQgbWV0aG9kcworICAgICAgICAgIChEQ09QIGFkZHMgdGhhdCBsYXllcikuICBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIElDRSAobGliSUNFKQorICAgICAgICAgIGlzIG9mdGVuIGNvbnNpZGVyZWQgdG8gYmUgaG9ycmlibGUgKGFuZCBob3JyaWJseSBpbnNlY3VyZSkuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRENPUCBhbmQgWFNNUCBhcmUgdGhlIG9ubHkgdHdvIHdpZGVseS11c2VkIGFwcGxpY2F0aW9ucyBvZiBJQ0UsCisgICAgICAgICAgYW5kIGJvdGggY291bGQgaW4gcHJpbmNpcGxlIGJlIHJlcGxhY2VkIGJ5IEQtQnVzLiAoVGhvdWdoIHdoZXRoZXIgCisgICAgICAgICAgR05PTUUgYW5kIEtERSB3aWxsIGJvdGhlciBpcyBhbiBvcGVuIHF1ZXN0aW9uLikKKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9xYW5kYWVudHJ5PgorCisgICAgCisKKyAgICA8cWFuZGFlbnRyeSBpZD0iZGNvcCI+CisgICAgICA8cXVlc3Rpb24+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEhvdyBkb2VzIEQtQnVzIGRpZmZlciBmcm9tIERDT1A/CisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBTdGFydCBieSByZWFkaW5nIDx4cmVmIGxpbmtlbmQ9Im90aGVyLWlwYyIvPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBELUJ1cyBpcyBpbnRlbnRpb25hbGx5IHByZXR0eSBzaW1pbGFyIHRvIDx1bGluaworICAgICAgICAgIHVybD0iaHR0cDovL2RldmVsb3Blci5rZGUub3JnL2RvY3VtZW50YXRpb24vbGlicmFyeS9rZGVxdC9kY29wLmh0bWwiPkRDT1A8L3VsaW5rPiwKKyAgICAgICAgICBhbmQgY2FuIGJlIHRob3VnaHQgb2YgYXMgYSAiRENPUCB0aGUgbmV4dCBnZW5lcmF0aW9uIiBzdWl0YWJsZSBmb3IgCisgICAgICAgICAgc2hhcmluZyBiZXR3ZWVuIHRoZSB2YXJpb3VzIG9wZW4gc291cmNlIGRlc2t0b3AgcHJvamVjdHMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRC1CdXMgaXMgYSBiaXQgbW9yZSBjb21wbGV4IHRoYW4gRENPUCwgdGhvdWdoIHRoZSBRdCBiaW5kaW5nIGZvciBELUJ1cworICAgICAgICAgIHNob3VsZCBub3QgYmUgbW9yZSBjb21wbGV4IGZvciBwcm9ncmFtbWVycy4gVGhlIGFkZGl0aW9uYWwgY29tcGxleGl0eQorICAgICAgICAgIG9mIEQtQnVzIGFyaXNlcyBmcm9tIGl0cyBzZXBhcmF0aW9uIG9mIG9iamVjdCByZWZlcmVuY2VzIHZzLiBidXMgbmFtZXMKKyAgICAgICAgICB2cy4gaW50ZXJmYWNlcyBhcyBkaXN0aW5jdCBjb25jZXB0cywgYW5kIGl0cyBzdXBwb3J0IGZvciBvbmUtdG8tb25lCisgICAgICAgICAgY29ubmVjdGlvbnMgaW4gYWRkaXRpb24gdG8gY29ubmVjdGlvbnMgb3ZlciB0aGUgYnVzLiBUaGUgbGliZGJ1cworICAgICAgICAgIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgYSBsb3Qgb2YgQVBJIHRvIHN1cHBvcnQgbXVsdGlwbGUgYmluZGluZ3MKKyAgICAgICAgICBhbmQgbWFpbiBsb29wcywgYW5kIHBlcmZvcm1zIGRhdGEgdmFsaWRhdGlvbiBhbmQgb3V0LW9mLW1lbW9yeSBoYW5kbGluZyAKKyAgICAgICAgICBpbiBvcmRlciB0byBzdXBwb3J0IHNlY3VyZSBhcHBsaWNhdGlvbnMgc3VjaCBhcyB0aGUgc3lzdGVtd2lkZSBidXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRC1CdXMgaXMgcHJvYmFibHkgc29tZXdoYXQgc2xvd2VyIHRoYW4gRENPUCBkdWUgdG8gZGF0YSB2YWxpZGF0aW9uIAorICAgICAgICAgIGFuZCBtb3JlICJsYXllcnMiIGluIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24uIEEgY29tcGFyaXNvbiAKKyAgICAgICAgICBoYXNuJ3QgYmVlbiBwb3N0ZWQgdG8gdGhlIGxpc3QgdGhvdWdoLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEF0IHRoaXMgdGltZSwgS0RFIGhhcyBub3QgY29tbWl0dGVkIHRvIHVzaW5nIEQtQnVzLCBidXQgdGhlcmUgaGF2ZQorICAgICAgICAgIGJlZW4gZGlzY3Vzc2lvbnMgb2YgS0RFIGJyaWRnaW5nIEQtQnVzIGFuZCBEQ09QLCBvciBldmVuIGNoYW5naW5nCisgICAgICAgICAgRENPUCdzIGltcGxlbWVudGF0aW9uIHRvIHVzZSBELUJ1cyBpbnRlcm5hbGx5IChzbyB0aGF0IEdOT01FIGFuZCBLREUKKyAgICAgICAgICB3b3VsZCBlbmQgdXAgdXNpbmcgZXhhY3RseSB0aGUgc2FtZSBidXMpLiBTZWUgdGhlIEtERSBtYWlsaW5nIGxpc3QgCisgICAgICAgICAgYXJjaGl2ZXMgZm9yIHNvbWUgb2YgdGhlc2UgZGlzY3Vzc2lvbnMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvcWFuZGFlbnRyeT4KKworCisgICAgPHFhbmRhZW50cnkgaWQ9InlldC1tb3JlLWlwYyI+CisgICAgICA8cXVlc3Rpb24+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEhvdyBkb2VzIEQtQnVzIGRpZmZlciBmcm9tIFt5ZXQgbW9yZSBJUEMgbWVjaGFuaXNtc10/CisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBTdGFydCBieSByZWFkaW5nIDx4cmVmIGxpbmtlbmQ9Im90aGVyLWlwYyIvPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGVyZSBhcmUgY291bnRsZXNzIHVzZXMgb2YgbmV0d29yayBzb2NrZXRzIGluIHRoZSB3b3JsZC4gIDx1bGluaworICAgICAgICAgIHVybD0iaHR0cDovL3d3dy5tYnVzLm9yZy8iPk1CVVM8L3VsaW5rPiwgU3VuIE9OQy9SUEMsIEphYmJlci9YTVBQLAorICAgICAgICAgIFNJUCwgYXJlIHNvbWUgd2UgY2FuIHRoaW5rIG9mIHF1aWNrbHkuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvcWFuZGFlbnRyeT4KKworCisgICAgPHFhbmRhZW50cnkgaWQ9IndoaWNoLWlwYyI+CisgICAgICA8cXVlc3Rpb24+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFdoaWNoIElQQyBtZWNoYW5pc20gc2hvdWxkIEkgdXNlPworICAgICAgICA8L3BhcmE+CisgICAgICA8L3F1ZXN0aW9uPgorICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgU3RhcnQgYnkgcmVhZGluZyA8eHJlZiBsaW5rZW5kPSJvdGhlci1pcGMiLz4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSWYgeW91J3JlIHdyaXRpbmcgYW4gSW50ZXJuZXQgb3IgSW50cmFuZXQgYXBwbGljYXRpb24sIFhNTC1SUEMgb3IgU09BUAorICAgICAgICAgIHdvcmsgZm9yIG1hbnkgcGVvcGxlLiBUaGVzZSBhcmUgc3RhbmRhcmQsIGF2YWlsYWJsZSBmb3IgbW9zdAorICAgICAgICAgIGxhbmd1YWdlcywgc2ltcGxlIHRvIGRlYnVnIGFuZCBlYXN5IHRvIHVzZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBJZiB5b3UncmUgd3JpdGluZyBhIGRlc2t0b3AgYXBwbGljYXRpb24gZm9yIFVOSVgsIAorICAgICAgICAgIHRoZW4gRC1CdXMgaXMgb2YgY291cnNlIG91ciByZWNvbW1lbmRhdGlvbiBmb3IgCisgICAgICAgICAgdGFsa2luZyB0byBvdGhlciBwYXJ0cyBvZiB0aGUgZGVza3RvcCBzZXNzaW9uLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEQtQnVzIGlzIGFsc28gZGVzaWduZWQgZm9yIGNvbW11bmljYXRpb25zIGJldHdlZW4gc3lzdGVtIGRhZW1vbnMgYW5kCisgICAgICAgICAgY29tbXVuaWNhdGlvbnMgYmV0d2VlbiB0aGUgZGVza3RvcCBhbmQgc3lzdGVtIGRhZW1vbnMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSWYgeW91J3JlIGRvaW5nIHNvbWV0aGluZyBjb21wbGljYXRlZCBzdWNoIGFzIGNsdXN0ZXJpbmcsIAorICAgICAgICAgIGRpc3RyaWJ1dGVkIHN3YXJtcywgcGVlci10by1wZWVyLCBvciB3aGF0ZXZlciB0aGVuIAorICAgICAgICAgIHRoZSBhdXRob3JzIG9mIHRoaXMgRkFRIGRvbid0IGhhdmUgZXhwZXJ0aXNlIGluIHRoZXNlCisgICAgICAgICAgYXJlYXMgYW5kIHlvdSBzaG91bGQgYXNrIHNvbWVvbmUgZWxzZSBvciB0cnkgYSBzZWFyY2ggZW5naW5lLgorICAgICAgICAgIEQtQnVzIGlzIG1vc3QgbGlrZWx5IGEgcG9vciBjaG9pY2UgYnV0IGNvdWxkIGJlIGFwcHJvcHJpYXRlCisgICAgICAgICAgZm9yIHNvbWUgdGhpbmdzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIE5vdGU6IHRoZSBELUJ1cyBtYWlsaW5nIGxpc3QgaXMgcHJvYmFibHkgbm90IHRoZSBwbGFjZSB0byAKKyAgICAgICAgICBkaXNjdXNzIHdoaWNoIHN5c3RlbSBpcyBhcHByb3ByaWF0ZSBmb3IgeW91ciBhcHBsaWNhdGlvbiwgCisgICAgICAgICAgdGhvdWdoIHlvdSBhcmUgd2VsY29tZSB0byBhc2sgc3BlY2lmaWMgcXVlc3Rpb25zIGFib3V0IAorICAgICAgICAgIEQtQnVzIDxlbXBoYXNpcz5hZnRlciByZWFkaW5nIHRoaXMgRkFRLCB0aGUgdHV0b3JpYWwsIGFuZCAKKyAgICAgICAgICAgIHNlYXJjaGluZyB0aGUgbGlzdCBhcmNoaXZlczwvZW1waGFzaXM+LiBUaGUgYmVzdCB3YXkgCisgICAgICAgICAgdG8gc2VhcmNoIHRoZSBsaXN0IGFyY2hpdmVzIGlzIHByb2JhYmx5IHRvIHVzZSAKKyAgICAgICAgICBhbiBJbnRlcm5ldCBlbmdpbmUgc3VjaCBhcyBHb29nbGUuIE9uIEdvb2dsZSwgCisgICAgICAgICAgaW5jbHVkZSAic2l0ZTpmcmVlZGVza3RvcC5vcmciIGluIHlvdXIgc2VhcmNoLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L3FhbmRhZW50cnk+CisKKworICAgIDxxYW5kYWVudHJ5PgorICAgICAgPHF1ZXN0aW9uPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBIb3cgY2FuIEkgc3VibWl0IGEgYnVnIG9yIHBhdGNoPworICAgICAgICA8L3BhcmE+CisgICAgICA8L3F1ZXN0aW9uPgorICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlIEQtQnVzIDx1bGluayB1cmw9Imh0dHA6Ly9kYnVzLmZyZWVkZXNrdG9wLm9yZyI+d2ViIHNpdGU8L3VsaW5rPgorICAgICAgICAgIGhhcyBhIGxpbmsgdG8gdGhlIGJ1ZyB0cmFja2VyLCB3aGljaCBpcyB0aGUgYmVzdCBwbGFjZSB0byBzdG9yZQorICAgICAgICAgIHBhdGNoZXMuICBZb3UgY2FuIGFsc28gcG9zdCB0aGVtIHRvIHRoZSBsaXN0LCBlc3BlY2lhbGx5IGlmIHlvdSB3YW50CisgICAgICAgICAgdG8gZGlzY3VzcyB0aGUgcGF0Y2ggb3IgZ2V0IGZlZWRiYWNrLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L3FhbmRhZW50cnk+CisKKyAgPC9xYW5kYXNldD4KKworPC9hcnRpY2xlPgpkaWZmIC0tZ2l0IGEvZGJ1cy9kb2MvZGJ1cy1sYXVuY2guMSBiL2RidXMvZG9jL2RidXMtbGF1bmNoLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIyYTNiZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZG9jL2RidXMtbGF1bmNoLjEKQEAgLTAsMCArMSwyMTEgQEAKKy5cIiAKKy5cIiBkYnVzXC1sYXVuY2ggbWFudWFsIHBhZ2UuCisuXCIgQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKy5cIgorLlRIIGRidXNcLWxhdW5jaCAxCisuU0ggTkFNRQorZGJ1c1wtbGF1bmNoIFwtIFV0aWxpdHkgdG8gc3RhcnQgYSBtZXNzYWdlIGJ1cyBmcm9tIGEgc2hlbGwgc2NyaXB0CisuU0ggU1lOT1BTSVMKKy5QUAorLkIgZGJ1c1wtbGF1bmNoIFtcLVwtdmVyc2lvbl0gW1wtXC1zaFwtc3ludGF4XSBbXC1cLWNzaFwtc3ludGF4XSBbXC1cLWF1dG9cLXN5bnRheF0gW1wtXC1leGl0XC13aXRoXC1zZXNzaW9uXSBbXC1cLWF1dG9sYXVuY2g9TUFDSElORUlEXSBbXC1cLWNvbmZpZ1wtZmlsZT1GSUxFTkFNRV0gW1BST0dSQU1dIFtBUkdTLi4uXQorCisuU0ggREVTQ1JJUFRJT04KKworVGhlIFxmSWRidXNcLWxhdW5jaFxmUCBjb21tYW5kIGlzIHVzZWQgdG8gc3RhcnQgYSBzZXNzaW9uIGJ1cyAKK2luc3RhbmNlIG9mIFxmSWRidXNcLWRhZW1vblxmUCBmcm9tIGEgc2hlbGwgc2NyaXB0LgorSXQgd291bGQgbm9ybWFsbHkgYmUgY2FsbGVkIGZyb20gYSB1c2VyJ3MgbG9naW4KK3NjcmlwdHMuIFVubGlrZSB0aGUgZGFlbW9uIGl0c2VsZiwgXGZJZGJ1c1wtbGF1bmNoXGZQIGV4aXRzLCBzbworYmFja3RpY2tzIG9yIHRoZSAkKCkgY29uc3RydWN0IGNhbiBiZSB1c2VkIHRvIHJlYWQgaW5mb3JtYXRpb24gZnJvbQorXGZJZGJ1c1wtbGF1bmNoXGZQLgorCitXaXRoIG5vIGFyZ3VtZW50cywgXGZJZGJ1c1wtbGF1bmNoXGZQIHdpbGwgbGF1bmNoIGEgc2Vzc2lvbiBidXMKK2luc3RhbmNlIGFuZCBwcmludCB0aGUgYWRkcmVzcyBhbmQgUElEIG9mIHRoYXQgaW5zdGFuY2UgdG8gc3RhbmRhcmQKK291dHB1dC4KKworWW91IG1heSBzcGVjaWZ5IGEgcHJvZ3JhbSB0byBiZSBydW47IGluIHRoaXMgY2FzZSwgXGZJZGJ1c1wtbGF1bmNoXGZQCit3aWxsIGxhdW5jaCBhIHNlc3Npb24gYnVzIGluc3RhbmNlLCBzZXQgdGhlIGFwcHJvcHJpYXRlIGVudmlyb25tZW50Cit2YXJpYWJsZXMgc28gdGhlIHNwZWNpZmllZCBwcm9ncmFtIGNhbiBmaW5kIHRoZSBidXMsIGFuZCB0aGVuIGV4ZWN1dGUgdGhlCitzcGVjaWZpZWQgcHJvZ3JhbSwgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cy4gIFNlZSBiZWxvdyBmb3IKK2V4YW1wbGVzLgorCitJZiB5b3UgbGF1bmNoIGEgcHJvZ3JhbSwgXGZJZGJ1c1wtbGF1bmNoXGZQIHdpbGwgbm90IHByaW50IHRoZQoraW5mb3JtYXRpb24gYWJvdXQgdGhlIG5ldyBidXMgdG8gc3RhbmRhcmQgb3V0cHV0LgorCitXaGVuIFxmSWRidXNcLWxhdW5jaFxmUCBwcmludHMgYnVzIGluZm9ybWF0aW9uIHRvIHN0YW5kYXJkIG91dHB1dCwgYnkKK2RlZmF1bHQgaXQgaXMgaW4gYSBzaW1wbGUga2V5XC12YWx1ZSBwYWlycyBmb3JtYXQuIEhvd2V2ZXIsIHlvdSBtYXkgCityZXF1ZXN0IHNldmVyYWwgYWx0ZXJuYXRlIHN5bnRheGVzIHVzaW5nIHRoZSBcLVwtc2hcLXN5bnRheCwgXC1cLWNzaFwtc3ludGF4LAorXC1cLWJpbmFyeVwtc3ludGF4LCBvcgorXC1cLWF1dG9cLXN5bnRheCBvcHRpb25zLiBTZXZlcmFsIG9mIHRoZXNlIGNhdXNlIFxmSWRidXNcLWxhdW5jaFxmUCB0byBlbWl0IHNoZWxsIGNvZGUKK3RvIHNldCB1cCB0aGUgZW52aXJvbm1lbnQuCisKK1dpdGggdGhlIFwtXC1hdXRvXC1zeW50YXggb3B0aW9uLCBcZklkYnVzXC1sYXVuY2hcZlAgbG9va3MgYXQgdGhlIHZhbHVlCitvZiB0aGUgU0hFTEwgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gZGV0ZXJtaW5lIHdoaWNoIHNoZWxsIHN5bnRheAorc2hvdWxkIGJlIHVzZWQuICBJZiBTSEVMTCBlbmRzIGluICJjc2giLCB0aGVuIGNzaFwtY29tcGF0aWJsZSBjb2RlIGlzCitlbWl0dGVkOyBvdGhlcndpc2UgQm91cm5lIHNoZWxsIGNvZGUgaXMgZW1pdHRlZC4gIEluc3RlYWQgb2YgcGFzc2luZworXC1cLWF1dG9cLXN5bnRheCwgeW91IG1heSBleHBsaWNpdGx5IHNwZWNpZnkgYSBwYXJ0aWN1bGFyIG9uZSBieSB1c2luZworXC1cLXNoXC1zeW50YXggZm9yIEJvdXJuZSBzeW50YXgsIG9yIFwtXC1jc2hcLXN5bnRheCBmb3IgY3NoIHN5bnRheC4KK0luIHNjcmlwdHMsIGl0J3MgbW9yZSByb2J1c3QgdG8gYXZvaWQgXC1cLWF1dG9cLXN5bnRheCBhbmQgeW91IGhvcGVmdWxseQora25vdyB3aGljaCBzaGVsbCB5b3VyIHNjcmlwdCBpcyB3cml0dGVuIGluLgorCisuUFAKK1NlZSBodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyBmb3IgbW9yZSBpbmZvcm1hdGlvbgorYWJvdXQgRFwtQnVzLiBTZWUgYWxzbyB0aGUgbWFuIHBhZ2UgZm9yIFxmSWRidXNcLWRhZW1vblxmUC4KKworLlNIIEVYQU1QTEVTCisKK0Rpc3RyaWJ1dGlvbnMgcnVubmluZworLkIgZGJ1c1wtbGF1bmNoCithcyBwYXJ0IG9mIGEgc3RhbmRhcmQgWCBzZXNzaW9uIHNob3VsZCBydW4KKy5CICJkYnVzXC1sYXVuY2ggXC1cLWV4aXRcLXdpdGhcLXNlc3Npb24iCithZnRlciB0aGUgWCBzZXJ2ZXIgaGFzIHN0YXJ0ZWQgYW5kIGJlY29tZSBhdmFpbGFibGUsIGFzIGEgd3JhcHBlciBhcm91bmQKK3RoZSAibWFpbiIgWCBjbGllbnQgKHR5cGljYWxseSBhIHNlc3Npb24gbWFuYWdlciBvciB3aW5kb3cgbWFuYWdlciksIGFzIGluCit0aGVzZSBleGFtcGxlczoKKworLlJTCisuQiAiZGJ1c1wtbGF1bmNoIFwtXC1leGl0XC13aXRoXC1zZXNzaW9uIGdub21lXC1zZXNzaW9uIgorCisuQiAiZGJ1c1wtbGF1bmNoIFwtXC1leGl0XC13aXRoXC1zZXNzaW9uIG9wZW5ib3giCisKKy5CICJkYnVzXC1sYXVuY2ggXC1cLWV4aXRcLXdpdGhcLXNlc3Npb24gfi8ueHNlc3Npb24iCisuUkUKKworSWYgeW91ciBkaXN0cmlidXRpb24gZG9lcyBub3QgZG8gdGhpcywgeW91IGNhbiBhY2hpZXZlIHNpbWlsYXIgcmVzdWx0cworYnkgcnVubmluZyB5b3VyIHNlc3Npb24gb3Igd2luZG93IG1hbmFnZXIgaW4gdGhlIHNhbWUgd2F5IGluIGEgc2NyaXB0CitydW4gYnkgeW91ciBYIHNlc3Npb24sIHN1Y2ggYXMKKy5CUiB+Ly54c2Vzc2lvbiAsCisuQiB+Ly54aW5pdHJjCitvcgorLkJSIH4vLlhjbGllbnRzIC4KKworVG8gc3RhcnQgYSBELUJ1cyBzZXNzaW9uIHdpdGhpbiBhIHRleHQtbW9kZSBzZXNzaW9uLCB5b3UgY2FuIHJ1bgorZGJ1cy1sYXVuY2ggaW4gdGhlIGJhY2tncm91bmQuIEZvciBpbnN0YW5jZSwgaW4gYSBzaC1jb21wYXRpYmxlIHNoZWxsOgorCisubmYKKyAgIyMgdGVzdCBmb3IgYW4gZXhpc3RpbmcgYnVzIGRhZW1vbiwganVzdCB0byBiZSBzYWZlCisgIGlmIHRlc3QgXC16ICIkREJVU19TRVNTSU9OX0JVU19BRERSRVNTIiA7IHRoZW4KKyAgICAgICMjIGlmIG5vdCBmb3VuZCwgbGF1bmNoIGEgbmV3IG9uZQorICAgICAgZXZhbCBgZGJ1c1wtbGF1bmNoIFwtXC1zaFwtc3ludGF4YAorICAgICAgZWNobyAiRFwtQnVzIHBlclwtc2Vzc2lvbiBkYWVtb24gYWRkcmVzcyBpczogJERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyIKKyAgZmkKKy5maQorTm90ZSB0aGF0IGluIHRoaXMgY2FzZSwgZGJ1cy1sYXVuY2ggd2lsbCBleGl0LCBhbmQgZGJ1cy1kYWVtb24gd2lsbCBub3QgYmUKK3Rlcm1pbmF0ZWQgYXV0b21hdGljYWxseSBvbiBsb2dvdXQuCisKKy5TSCBBVVRPTUFUSUMgTEFVTkNISU5HCisKKy5QUAorSWYgREJVU19TRVNTSU9OX0JVU19BRERSRVNTIGlzIG5vdCBzZXQgZm9yIGEgcHJvY2VzcyB0aGF0IHRyaWVzIHRvIHVzZQorRFwtQnVzLCBieSBkZWZhdWx0IHRoZSBwcm9jZXNzIHdpbGwgYXR0ZW1wdCB0byBpbnZva2UgZGJ1c1wtbGF1bmNoIHdpdGgKK3RoZSBcLVwtYXV0b2xhdW5jaCBvcHRpb24gdG8gc3RhcnQgdXAgYSBuZXcgc2Vzc2lvbiBidXMgb3IgZmluZCB0aGUgCitleGlzdGluZyBidXMgYWRkcmVzcyBvbiB0aGUgWCBkaXNwbGF5IG9yIGluIGEgZmlsZSBpbgorfi8uZGJ1cy9zZXNzaW9uXC1idXMvCisKKy5QUAorV2hlbmV2ZXIgYW4gYXV0b2xhdW5jaCBvY2N1cnMsIHRoZSBhcHBsaWNhdGlvbiB0aGF0IGhhZCB0bworc3RhcnQgYSBuZXcgYnVzIHdpbGwgYmUgaW4gaXRzIG93biBsaXR0bGUgd29ybGQ7IGl0IGNhbiBlZmZlY3RpdmVseQorZW5kIHVwIHN0YXJ0aW5nIGEgd2hvbGUgbmV3IHNlc3Npb24gaWYgaXQgdHJpZXMgdG8gdXNlIGEgbG90IG9mIAorYnVzIHNlcnZpY2VzLiBUaGlzIGNhbiBiZSBzdWJvcHRpbWFsIG9yIGV2ZW4gdG90YWxseSBicm9rZW4sIGRlcGVuZGluZworb24gdGhlIGFwcCBhbmQgd2hhdCBpdCB0cmllcyB0byBkby4KKworLlBQCitUaGVyZSBhcmUgdHdvIGNvbW1vbiByZWFzb25zIGZvciBhdXRvbGF1bmNoLiBPbmUgaXMgc3NoIHRvIGEgcmVtb3RlCittYWNoaW5lLiBUaGUgaWRlYWwgZml4IGZvciB0aGF0IHdvdWxkIGJlIGZvcndhcmRpbmcgb2YKK0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyBpbiB0aGUgc2FtZSB3YXkgdGhhdCBESVNQTEFZIGlzIGZvcndhcmRlZC4KK0luIHRoZSBtZWFudGltZSwgeW91IGNhbiBlZGl0IHRoZSBzZXNzaW9uLmNvbmYgY29uZmlnIGZpbGUgdG8gCitoYXZlIHlvdXIgc2Vzc2lvbiBidXMgbGlzdGVuIG9uIFRDUCwgYW5kIG1hbnVhbGx5IHNldAorREJVU19TRVNTSU9OX0JVU19BRERSRVNTLCBpZiB5b3UgbGlrZS4KKworLlBQCitUaGUgc2Vjb25kIGNvbW1vbiByZWFzb24gZm9yIGF1dG9sYXVuY2ggaXMgYW4gc3UgdG8gYW5vdGhlciB1c2VyLCBhbmQKK2Rpc3BsYXkgb2YgWCBhcHBsaWNhdGlvbnMgcnVubmluZyBhcyB0aGUgc2Vjb25kIHVzZXIgb24gdGhlIGRpc3BsYXkKK2JlbG9uZ2luZyB0byB0aGUgZmlyc3QgdXNlci4gUGVyaGFwcyB0aGUgaWRlYWwgZml4IGluIHRoaXMgY2FzZQord291bGQgYmUgdG8gYWxsb3cgdGhlIHNlY29uZCB1c2VyIHRvIGNvbm5lY3QgdG8gdGhlIHNlc3Npb24gYnVzIG9mIHRoZQorZmlyc3QgdXNlciwganVzdCBhcyB0aGV5IGNhbiBjb25uZWN0IHRvIHRoZSBmaXJzdCB1c2VyJ3MgZGlzcGxheS4KK0hvd2V2ZXIsIGEgbWVjaGFuaXNtIGZvciB0aGF0IGhhcyBub3QgYmVlbiBjb2RlZC4KKworLlBQCitZb3UgY2FuIGFsd2F5cyBhdm9pZCBhdXRvbGF1bmNoIGJ5IG1hbnVhbGx5IHNldHRpbmcKK0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUy4gQXV0b2xhdW5jaCBoYXBwZW5zIGJlY2F1c2UgdGhlIGRlZmF1bHQKK2FkZHJlc3MgaWYgbm9uZSBpcyBzZXQgaXMgImF1dG9sYXVuY2g6Iiwgc28gaWYgYW55IG90aGVyIGFkZHJlc3MgaXMKK3NldCB0aGVyZSB3aWxsIGJlIG5vIGF1dG9sYXVuY2guIFlvdSBjYW4gaG93ZXZlciBpbmNsdWRlIGF1dG9sYXVuY2ggaW4KK2FuIGV4cGxpY2l0IHNlc3Npb24gYnVzIGFkZHJlc3MgYXMgYSBmYWxsYmFjaywgZm9yIGV4YW1wbGUKK0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUz0ic29tZXRoaW5nOixhdXRvbGF1bmNoOiIgXC0gaW4gdGhhdCBjYXNlIGlmCit0aGUgZmlyc3QgYWRkcmVzcyBkb2Vzbid0IHdvcmssIHByb2Nlc3NlcyB3aWxsIGF1dG9sYXVuY2guIChUaGUgYnVzCithZGRyZXNzIHZhcmlhYmxlIGNvbnRhaW5zIGEgY29tbWFcLXNlcGFyYXRlZCBsaXN0IG9mIGFkZHJlc3NlcyB0byB0cnkuKQorCisuUFAKK1RoZSBcLVwtYXV0b2xhdW5jaCBvcHRpb24gaXMgY29uc2lkZXJlZCBhbiBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbgorZGV0YWlsIG9mIGxpYmRidXMsIGFuZCBpbiBmYWN0IHRoZXJlIGFyZSBwbGFucyB0byBjaGFuZ2UgaXQuIFRoZXJlJ3MKK25vIHJlYWwgcmVhc29uIHRvIHVzZSBpdCBvdXRzaWRlIG9mIHRoZSBsaWJkYnVzIGltcGxlbWVudGF0aW9uIGFueWhvdy4KKworLlNIIE9QVElPTlMKK1RoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgc3VwcG9ydGVkOgorLlRQCisuSSAiXC1cLWF1dG9cLXN5bnRheCIKK0Nob29zZSBcLVwtY3NoXC1zeW50YXggb3IgXC1cLXNoXC1zeW50YXggYmFzZWQgb24gdGhlIFNIRUxMIGVudmlyb25tZW50IHZhcmlhYmxlLgorCisuSSAiXC1cLWJpbmFyeVwtc3ludGF4IgorV3JpdGUgdG8gc3Rkb3V0IGEgbnVsXC10ZXJtaW5hdGVkIGJ1cyBhZGRyZXNzLCB0aGVuIHRoZSBidXMgUElEIGFzIGEKK2JpbmFyeSBpbnRlZ2VyIG9mIHNpemUgc2l6ZW9mKHBpZF90KSwgdGhlbiB0aGUgYnVzIFggd2luZG93IElEIGFzIGEKK2JpbmFyeSBpbnRlZ2VyIG9mIHNpemUgc2l6ZW9mKGxvbmcpLiBJbnRlZ2VycyBhcmUgaW4gdGhlIG1hY2hpbmUncworYnl0ZSBvcmRlciwgbm90IG5ldHdvcmsgYnl0ZSBvcmRlciBvciBhbnkgb3RoZXIgY2Fub25pY2FsIGJ5dGUgb3JkZXIuCisKKy5UUAorLkkgIlwtXC1jbG9zZVwtc3RkZXJyIgorQ2xvc2UgdGhlIHN0YW5kYXJkIGVycm9yIG91dHB1dCBzdHJlYW0gYmVmb3JlIHN0YXJ0aW5nIHRoZSBEXC1CdXMKK2RhZW1vbi4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gY2FwdHVyZSBkYnVzXC1sYXVuY2ggZXJyb3IKK21lc3NhZ2VzIGJ1dCB5b3UgZG9uJ3Qgd2FudCBkYnVzXC1kYWVtb24gdG8ga2VlcCB0aGUgc3RyZWFtIG9wZW4gdG8KK3lvdXIgYXBwbGljYXRpb24uCisKKy5UUAorLkkgIlwtXC1jb25maWdcLWZpbGU9RklMRU5BTUUiCitQYXNzIFwtXC1jb25maWdcLWZpbGU9RklMRU5BTUUgdG8gdGhlIGJ1cyBkYWVtb24sIGluc3RlYWQgb2YgcGFzc2luZyBpdCAKK3RoZSBcLVwtc2Vzc2lvbiBhcmd1bWVudC4gU2VlIHRoZSBtYW4gcGFnZSBmb3IgZGJ1c1wtZGFlbW9uCisKKy5UUAorLkkgIlwtXC1jc2hcLXN5bnRheCIKK0VtaXQgY3NoIGNvbXBhdGlibGUgY29kZSB0byBzZXQgdXAgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorCisuVFAKKy5JICJcLVwtZXhpdFwtd2l0aFwtc2Vzc2lvbiIKK0lmIHRoaXMgb3B0aW9uIGlzIHByb3ZpZGVkLCBhIHBlcnNpc3RlbnQgImJhYnlzaXR0ZXIiIHByb2Nlc3Mgd2lsbCBiZSAKK2NyZWF0ZWQgdGhhdCB3YXRjaGVzIHN0ZGluIGZvciBIVVAgYW5kIHRyaWVzIHRvIGNvbm5lY3QgdG8gdGhlIFgKK3NlcnZlci4gSWYgdGhpcyBwcm9jZXNzIGdldHMgYSBIVVAgb24gc3RkaW4gb3IgbG9zZXMgaXRzIFggY29ubmVjdGlvbiwKK2l0IGtpbGxzIHRoZSBtZXNzYWdlIGJ1cyBkYWVtb24uCisKKy5UUAorLkkgIlwtXC1hdXRvbGF1bmNoPU1BQ0hJTkVJRCIKK1RoaXMgb3B0aW9uIGltcGxpZXMgdGhhdCBcZklkYnVzXC1sYXVuY2hcZlAgc2hvdWxkIHNjYW4gZm9yIGEKK3ByZXZpb3VzbHlcLXN0YXJ0ZWQgc2Vzc2lvbiBhbmQgcmV1c2UgdGhlIHZhbHVlcyBmb3VuZCB0aGVyZS4gSWYgbm8KK3Nlc3Npb24gaXMgZm91bmQsIGl0IHdpbGwgc3RhcnQgYSBuZXcgc2Vzc2lvbi4gVGhlCitcLVwtZXhpdFwtd2l0aFwtc2Vzc2lvbiBvcHRpb24gaXMgaW1wbGllZCBpZiBcLVwtYXV0b2xhdW5jaCBpcyBnaXZlbi4KK1RoaXMgb3B0aW9uIGlzIGZvciB0aGUgZXhjbHVzaXZlIHVzZSBvZiBsaWJkYnVzLCB5b3UgZG8gbm90IHdhbnQgdG8KK3VzZSBpdCBtYW51YWxseS4gSXQgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLgorCisuVFAKKy5JICJcLVwtc2hcLXN5bnRheCIKK0VtaXQgQm91cm5lXC1zaGVsbCBjb21wYXRpYmxlIGNvZGUgdG8gc2V0IHVwIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKworLlRQCisuSSAiXC1cLXZlcnNpb24iCitQcmludCB0aGUgdmVyc2lvbiBvZiBkYnVzXC1sYXVuY2gKKworLlNIIE5PVEVTCisKK0lmIHlvdSBydW4KKy5CICJkYnVzXC1sYXVuY2ggbXlhcHAiCisod2l0aCBhbnkgb3RoZXIgb3B0aW9ucyksIGRidXNcLWRhZW1vbiB3aWxsCisuSSBub3QKK2V4aXQgd2hlbgorLkIgbXlhcHAKK3Rlcm1pbmF0ZXM6IHRoaXMgaXMgYmVjYXVzZQorLkIgbXlhcHAKK2lzIGFzc3VtZWQgdG8gYmUgcGFydCBvZiBhIGxhcmdlciBzZXNzaW9uLCByYXRoZXIgdGhhbiBhIHNlc3Npb24gaW4gaXRzCitvd24gcmlnaHQuCisKKy5TSCBBVVRIT1IKK1NlZSBodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzL2RvYy9BVVRIT1JTCisKKy5TSCBCVUdTCitQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyB0byB0aGUgRFwtQnVzIG1haWxpbmcgbGlzdCBvciBidWcgdHJhY2tlciwKK3NlZSBodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kb2MvZGJ1cy1tb25pdG9yLjEgYi9kYnVzL2RvYy9kYnVzLW1vbml0b3IuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjgyYjllCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kb2MvZGJ1cy1tb25pdG9yLjEKQEAgLTAsMCArMSw3OCBAQAorLlwiIAorLlwiIGRidXNcLW1vbml0b3IgbWFudWFsIHBhZ2UuCisuXCIgQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKy5cIgorLlRIIGRidXNcLW1vbml0b3IgMQorLlNIIE5BTUUKK2RidXNcLW1vbml0b3IgXC0gZGVidWcgcHJvYmUgdG8gcHJpbnQgbWVzc2FnZSBidXMgbWVzc2FnZXMKKy5TSCBTWU5PUFNJUworLlBQCisuQiBkYnVzXC1tb25pdG9yCitbXC1cLXN5c3RlbSB8IFwtXC1zZXNzaW9uIHwgXC1cLWFkZHJlc3MgQUREUkVTU10gW1wtXC1wcm9maWxlIHwgXC1cLW1vbml0b3JdCitbd2F0Y2ggZXhwcmVzc2lvbnNdCisKKy5TSCBERVNDUklQVElPTgorCitUaGUgXGZJZGJ1c1wtbW9uaXRvclxmUCBjb21tYW5kIGlzIHVzZWQgdG8gbW9uaXRvciBtZXNzYWdlcyBnb2luZwordGhyb3VnaCBhIERcLUJ1cyBtZXNzYWdlIGJ1cy4gIFNlZQoraHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQKK3RoZSBiaWcgcGljdHVyZS4KKworLlBQCitUaGVyZSBhcmUgdHdvIHdlbGxcLWtub3duIG1lc3NhZ2UgYnVzZXM6IHRoZSBzeXN0ZW13aWRlIG1lc3NhZ2UgYnVzCisoaW5zdGFsbGVkIG9uIG1hbnkgc3lzdGVtcyBhcyB0aGUgIm1lc3NhZ2VidXMiIHNlcnZpY2UpIGFuZCB0aGUKK3BlclwtdXNlclwtbG9naW5cLXNlc3Npb24gbWVzc2FnZSBidXMgKHN0YXJ0ZWQgZWFjaCB0aW1lIGEgdXNlciBsb2dzIGluKS4KK1RoZSBcLVwtc3lzdGVtIGFuZCBcLVwtc2Vzc2lvbiBvcHRpb25zIGRpcmVjdCBcZklkYnVzXC1tb25pdG9yXGZQIHRvCittb25pdG9yIHRoZSBzeXN0ZW0gb3Igc2Vzc2lvbiBidXNlcyByZXNwZWN0aXZlbHkuICBJZiBuZWl0aGVyIGlzCitzcGVjaWZpZWQsIFxmSWRidXNcLW1vbml0b3JcZlAgbW9uaXRvcnMgdGhlIHNlc3Npb24gYnVzLgorCisuUFAKK1xmSWRidXNcLW1vbml0b3JcZlAgaGFzIHR3byBkaWZmZXJlbnQgb3V0cHV0IG1vZGVzLCB0aGUgJ2NsYXNzaWMnXC1zdHlsZQorbW9uaXRvcmluZyBtb2RlIGFuZCBwcm9maWxpbmcgbW9kZS4gVGhlIHByb2ZpbGluZyBmb3JtYXQgaXMgYSBjb21wYWN0Citmb3JtYXQgd2l0aCBhIHNpbmdsZSBsaW5lIHBlciBtZXNzYWdlIGFuZCBtaWNyb3NlY29uZFwtcmVzb2x1dGlvbiB0aW1pbmcKK2luZm9ybWF0aW9uLiBUaGUgXC1cLXByb2ZpbGUgYW5kIFwtXC1tb25pdG9yIG9wdGlvbnMgc2VsZWN0IHRoZSBwcm9maWxpbmcKK2FuZCBtb25pdG9yaW5nIG91dHB1dCBmb3JtYXQgcmVzcGVjdGl2ZWx5LiBJZiBuZWl0aGVyIGlzIHNwZWNpZmllZCwKK1xmSWRidXNcLW1vbml0b3JcZlAgdXNlcyB0aGUgbW9uaXRvcmluZyBvdXRwdXQgZm9ybWF0LgorCisuUFAKK0luIG9yZGVyIHRvIGdldCBcZklkYnVzXC1tb25pdG9yXGZQIHRvIHNlZSB0aGUgbWVzc2FnZXMgeW91IGFyZSBpbnRlcmVzdGVkCitpbiwgeW91IHNob3VsZCBzcGVjaWZ5IGEgc2V0IG9mIHdhdGNoIGV4cHJlc3Npb25zIGFzIHlvdSB3b3VsZCBleHBlY3QgdG8KK2JlIHBhc3NlZCB0byB0aGUgXGZJZGJ1c19idXNfYWRkX21hdGNoXGZQIGZ1bmN0aW9uLgorCisuUFAgCitUaGUgbWVzc2FnZSBidXMgY29uZmlndXJhdGlvbiBtYXkga2VlcCBcZklkYnVzXC1tb25pdG9yXGZQIGZyb20gc2VlaW5nCithbGwgbWVzc2FnZXMsIGVzcGVjaWFsbHkgaWYgeW91IHJ1biB0aGUgbW9uaXRvciBhcyBhIG5vblwtcm9vdCB1c2VyLgorCisuU0ggT1BUSU9OUworLlRQCisuSSAiXC1cLXN5c3RlbSIKK01vbml0b3IgdGhlIHN5c3RlbSBtZXNzYWdlIGJ1cy4KKy5UUAorLkkgIlwtXC1zZXNzaW9uIgorTW9uaXRvciB0aGUgc2Vzc2lvbiBtZXNzYWdlIGJ1cy4gIChUaGlzIGlzIHRoZSBkZWZhdWx0LikKKy5UUAorLkkgIlwtXC1hZGRyZXNzIEFERFJFU1MiCitNb25pdG9yIGFuIGFyYml0cmFyeSBtZXNzYWdlIGJ1cyBnaXZlbiBhdCBBRERSRVNTLgorLlRQCisuSSAiXC1cLXByb2ZpbGUiCitVc2UgdGhlIHByb2ZpbGluZyBvdXRwdXQgZm9ybWF0LgorLlRQCisuSSAiXC1cLW1vbml0b3IiCitVc2UgdGhlIG1vbml0b3Jpbmcgb3V0cHV0IGZvcm1hdC4gIChUaGlzIGlzIHRoZSBkZWZhdWx0LikKKworLlNIIEVYQU1QTEUKK0hlcmUgaXMgYW4gZXhhbXBsZSBvZiB1c2luZyBkYnVzXC1tb25pdG9yIHRvIHdhdGNoIGZvciB0aGUgZ25vbWUgdHlwaW5nCittb25pdG9yIHRvIHNheSB0aGluZ3MKKy5uZgorCisgIGRidXNcLW1vbml0b3IgInR5cGU9J3NpZ25hbCcsc2VuZGVyPSdvcmcuZ25vbWUuVHlwaW5nTW9uaXRvcicsaW50ZXJmYWNlPSdvcmcuZ25vbWUuVHlwaW5nTW9uaXRvciciCisKKy5maQorCisuU0ggQVVUSE9SCitkYnVzXC1tb25pdG9yIHdhcyB3cml0dGVuIGJ5IFBoaWxpcCBCbHVuZGVsbC4KK1RoZSBwcm9maWxpbmcgb3V0cHV0IG1vZGUgd2FzIGFkZGVkIGJ5IE9sbGkgU2FsbGkuCisKKy5TSCBCVUdTCitQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyB0byB0aGUgRFwtQnVzIG1haWxpbmcgbGlzdCBvciBidWcgdHJhY2tlciwKK3NlZSBodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kb2MvZGJ1cy1zZW5kLjEgYi9kYnVzL2RvYy9kYnVzLXNlbmQuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzFhNjBkCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kb2MvZGJ1cy1zZW5kLjEKQEAgLTAsMCArMSwxMDkgQEAKKy5cIiAKKy5cIiBkYnVzXC1zZW5kIG1hbnVhbCBwYWdlLgorLlwiIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisuXCIKKy5USCBkYnVzXC1zZW5kIDEKKy5TSCBOQU1FCitkYnVzXC1zZW5kIFwtIFNlbmQgYSBtZXNzYWdlIHRvIGEgbWVzc2FnZSBidXMKKy5TSCBTWU5PUFNJUworLlBQCisuQiBkYnVzXC1zZW5kCitbXGZCXC1cLXN5c3RlbVxmUCB8IFxmQlwtXC1zZXNzaW9uXGZQXQorW1xmQlwtXC1kZXN0PVxmSU5BTUVcZlBdCitbXGZCXC1cLXByaW50XC1yZXBseVxmUFtcZkI9bGl0ZXJhbFxmUF1dCitbXGZCXC1cLXJlcGx5XC10aW1lb3V0PVxmSU1TRUNcZlBdCitbXGZCXC1cLXR5cGU9XGZJVFlQRVxmUF0KK1xmSU9CSkVDVF9QQVRIXGZQIFxmSUlOVEVSRkFDRVxmQi5cZklNRU1CRVJcZlAgW1xmSUNPTlRFTlRTXGZQIC4uLl0KKworLlNIIERFU0NSSVBUSU9OCisKK1RoZSBcZklkYnVzXC1zZW5kXGZQIGNvbW1hbmQgaXMgdXNlZCB0byBzZW5kIGEgbWVzc2FnZSB0byBhIERcLUJ1cyBtZXNzYWdlCitidXMuIFNlZSBodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyBmb3IgbW9yZSAKK2luZm9ybWF0aW9uIGFib3V0IHRoZSBiaWcgcGljdHVyZS4KKworLlBQCitUaGVyZSBhcmUgdHdvIHdlbGxcLWtub3duIG1lc3NhZ2UgYnVzZXM6IHRoZSBzeXN0ZW13aWRlIG1lc3NhZ2UgYnVzIAorKGluc3RhbGxlZCBvbiBtYW55IHN5c3RlbXMgYXMgdGhlICJtZXNzYWdlYnVzIiBzZXJ2aWNlKSBhbmQgdGhlIAorcGVyXC11c2VyXC1sb2dpblwtc2Vzc2lvbiBtZXNzYWdlIGJ1cyAoc3RhcnRlZCBlYWNoIHRpbWUgYSB1c2VyIGxvZ3MgaW4pLgorVGhlIFxmQlwtXC1zeXN0ZW1cZlAgYW5kIFxmQlwtXC1zZXNzaW9uXGZQIG9wdGlvbnMgZGlyZWN0CitcZkJkYnVzXC1zZW5kXGZQIHRvIHNlbmQgbWVzc2FnZXMgdG8gdGhlIHN5c3RlbSBvciBzZXNzaW9uIGJ1c2VzIHJlc3BlY3RpdmVseS4KK0lmIG5laXRoZXIgaXMgc3BlY2lmaWVkLCBcZkJkYnVzXC1zZW5kXGZQIHNlbmRzIHRvIHRoZSBzZXNzaW9uIGJ1cy4KKworLlBQIAorTmVhcmx5IGFsbCB1c2VzIG9mIFxmQmRidXNcLXNlbmRcZlAgbXVzdCBwcm92aWRlIHRoZSBcZkJcLVwtZGVzdFxmUCBhcmd1bWVudAord2hpY2ggaXMgdGhlIG5hbWUgb2YgYSBjb25uZWN0aW9uIG9uIHRoZSBidXMgdG8gc2VuZCB0aGUgbWVzc2FnZSB0by4gSWYKK1xmQlwtXC1kZXN0XGZQIGlzIG9taXR0ZWQsIG5vIGRlc3RpbmF0aW9uIGlzIHNldC4KKworLlBQCitUaGUgb2JqZWN0IHBhdGggYW5kIHRoZSBuYW1lIG9mIHRoZSBtZXNzYWdlIHRvIHNlbmQgbXVzdCBhbHdheXMgYmUKK3NwZWNpZmllZC4gRm9sbG93aW5nIGFyZ3VtZW50cywgaWYgYW55LCBhcmUgdGhlIG1lc3NhZ2UgY29udGVudHMKKyhtZXNzYWdlIGFyZ3VtZW50cykuICBUaGVzZSBhcmUgZ2l2ZW4gYXMgdHlwZVwtc3BlY2lmaWVkIHZhbHVlcyBhbmQgCittYXkgaW5jbHVkZSBjb250YWluZXJzIChhcnJheXMsIGRpY3RzLCBhbmQgdmFyaWFudHMpIGFzIGRlc2NyaWJlZCBiZWxvdy4KKworLm5mCis8Y29udGVudHM+ICAgOjo9IDxpdGVtPiB8IDxjb250YWluZXI+IFsgPGl0ZW0+IHwgPGNvbnRhaW5lcj4uLi5dCis8aXRlbT4gICAgICAgOjo9IDx0eXBlPjo8dmFsdWU+Cis8Y29udGFpbmVyPiAgOjo9IDxhcnJheT4gfCA8ZGljdD4gfCA8dmFyaWFudD4KKzxhcnJheT4gICAgICA6Oj0gYXJyYXk6PHR5cGU+Ojx2YWx1ZT5bLDx2YWx1ZT4uLi5dIAorPGRpY3Q+ICAgICAgIDo6PSBkaWN0Ojx0eXBlPjo8dHlwZT46PGtleT4sPHZhbHVlPlssPGtleT4sPHZhbHVlPi4uLl0KKzx2YXJpYW50PiAgICA6Oj0gdmFyaWFudDo8dHlwZT46PHZhbHVlPgorPHR5cGU+ICAgICAgIDo6PSBzdHJpbmcgfCBpbnQxNiB8IHVpbnQgMTYgfCBpbnQzMiB8IHVpbnQzMiB8IGludDY0IHwgdWludDY0IHwgZG91YmxlIHwgYnl0ZSB8IGJvb2xlYW4gfCBvYmpwYXRoCisuZmkKKworRFwtQnVzIHN1cHBvcnRzIG1vcmUgdHlwZXMgdGhhbiB0aGVzZSwgYnV0IFxmQmRidXNcLXNlbmRcZlAgY3VycmVudGx5Citkb2VzIG5vdC4gIEFsc28sIFxmQmRidXNcLXNlbmRcZlAgZG9lcyBub3QgcGVybWl0IGVtcHR5IGNvbnRhaW5lcnMKK29yIG5lc3RlZCBjb250YWluZXJzIChlLmcuIGFycmF5cyBvZiB2YXJpYW50cykuCisKKy5QUAorSGVyZSBpcyBhbiBleGFtcGxlIGludm9jYXRpb246CisubmYKKworICBkYnVzXC1zZW5kIFwtXC1kZXN0PW9yZy5mcmVlZGVza3RvcC5FeGFtcGxlTmFtZSAgICAgICAgICAgICAgIFxcCisgICAgICAgICAgICAvb3JnL2ZyZWVkZXNrdG9wL3NhbXBsZS9vYmplY3QvbmFtZSAgICAgICAgICAgICAgXFwKKyAgICAgICAgICAgIG9yZy5mcmVlZGVza3RvcC5FeGFtcGxlSW50ZXJmYWNlLkV4YW1wbGVNZXRob2QgICBcXAorICAgICAgICAgICAgaW50MzI6NDcgc3RyaW5nOidoZWxsbyB3b3JsZCcgZG91YmxlOjY1LjMyICAgICAgIFxcCisgICAgICAgICAgICBhcnJheTpzdHJpbmc6IjFzdCBpdGVtIiwibmV4dCBpdGVtIiwibGFzdCBpdGVtIiAgXFwKKyAgICAgICAgICAgIGRpY3Q6c3RyaW5nOmludDMyOiJvbmUiLDEsInR3byIsMiwidGhyZWUiLDMgICAgICBcXAorICAgICAgICAgICAgdmFyaWFudDppbnQzMjpcLTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXAorICAgICAgICAgICAgb2JqcGF0aDovb3JnL2ZyZWVkZXNrdG9wL3NhbXBsZS9vYmplY3QvbmFtZSAKKworLmZpCisKK05vdGUgdGhhdCB0aGUgaW50ZXJmYWNlIGlzIHNlcGFyYXRlZCBmcm9tIGEgbWV0aG9kIG9yIHNpZ25hbCAKK25hbWUgYnkgYSBkb3QsIHRob3VnaCBpbiB0aGUgYWN0dWFsIHByb3RvY29sIHRoZSBpbnRlcmZhY2UKK2FuZCB0aGUgaW50ZXJmYWNlIG1lbWJlciBhcmUgc2VwYXJhdGUgZmllbGRzLgorCisuU0ggT1BUSU9OUworVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBzdXBwb3J0ZWQ6CisuVFAKKy5CSSBcLVwtZGVzdD0gTkFNRQorU3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgY29ubmVjdGlvbiB0byByZWNlaXZlIHRoZSBtZXNzYWdlLgorLlRQCisuQiAiXC1cLXByaW50XC1yZXBseSIKK0Jsb2NrIGZvciBhIHJlcGx5IHRvIHRoZSBtZXNzYWdlIHNlbnQsIGFuZCBwcmludCBhbnkgcmVwbHkgcmVjZWl2ZWQKK2luIGEgaHVtYW4tcmVhZGFibGUgZm9ybS4KKy5UUAorLkIgIlwtXC1wcmludFwtcmVwbHk9bGl0ZXJhbCIKK0Jsb2NrIGZvciBhIHJlcGx5IHRvIHRoZSBtZXNzYWdlIHNlbnQsIGFuZCBwcmludCB0aGUgYm9keSBvZiB0aGUKK3JlcGx5LiBJZiB0aGUgcmVwbHkgaXMgYW4gb2JqZWN0IHBhdGggb3IgYSBzdHJpbmcsIGl0IGlzIHByaW50ZWQKK2xpdGVyYWxseSwgd2l0aCBubyBwdW5jdHVhdGlvbiwgZXNjYXBlIGNoYXJhY3RlcnMgZXRjLgorLlRQCisuQkkgXC1cLXJlcGx5XC10aW1lb3V0PSBNU0VDCitXYWl0IGZvciBhIHJlcGx5IGZvciB1cCB0byBcZklNU0VDXGZQIG1pbGxpc2Vjb25kcy4KK1RoZSBkZWZhdWx0IGlzIGltcGxlbWVudGF0aW9uXChoeWRlZmluZWQsIHR5cGljYWxseSAyNSBzZWNvbmRzLgorLlRQCisuQiAiXC1cLXN5c3RlbSIKK1NlbmQgdG8gdGhlIHN5c3RlbSBtZXNzYWdlIGJ1cy4KKy5UUAorLkIgIlwtXC1zZXNzaW9uIgorU2VuZCB0byB0aGUgc2Vzc2lvbiBtZXNzYWdlIGJ1cy4gIChUaGlzIGlzIHRoZSBkZWZhdWx0LikKKy5UUAorLkJJIFwtXC10eXBlPSBUWVBFCitTcGVjaWZ5IFxmQm1ldGhvZF9jYWxsXGZQIG9yIFxmQnNpZ25hbFxmUCAoZGVmYXVsdHMgdG8gIlxmQnNpZ25hbFxmUCIpLgorCisuU0ggQVVUSE9SCitkYnVzXC1zZW5kIHdhcyB3cml0dGVuIGJ5IFBoaWxpcCBCbHVuZGVsbC4KKworLlNIIEJVR1MKK1BsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIHRvIHRoZSBEXC1CdXMgbWFpbGluZyBsaXN0IG9yIGJ1ZyB0cmFja2VyLAorc2VlIGh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvCmRpZmYgLS1naXQgYS9kYnVzL2RvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sIGIvZGJ1cy9kb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODA2YjhlCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbApAQCAtMCwwICsxLDU1NzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iID8+Cis8IURPQ1RZUEUgYXJ0aWNsZSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMS4yLy9FTiIKKyJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuMS4yL2RvY2Jvb2t4LmR0ZCIKK1sKK10+Cis8YXJ0aWNsZSBpZD0iaW5kZXgiPgorICA8YXJ0aWNsZWluZm8+CisgICAgPHRpdGxlPkQtQnVzIFNwZWNpZmljYXRpb248L3RpdGxlPgorICAgIDxyZWxlYXNlaW5mbz5WZXJzaW9uIDAuMTk8L3JlbGVhc2VpbmZvPgorICAgIDxkYXRlPjIwMTItMDItMjE8L2RhdGU+CisgICAgPGF1dGhvcmdyb3VwPgorICAgICAgPGF1dGhvcj4KKwk8Zmlyc3RuYW1lPkhhdm9jPC9maXJzdG5hbWU+CisJPHN1cm5hbWU+UGVubmluZ3Rvbjwvc3VybmFtZT4KKwk8YWZmaWxpYXRpb24+CisJICA8b3JnbmFtZT5SZWQgSGF0LCBJbmMuPC9vcmduYW1lPgorCSAgPGFkZHJlc3M+CisJICAgIDxlbWFpbD5ocEBwb2JveC5jb208L2VtYWlsPgorCSAgPC9hZGRyZXNzPgorCTwvYWZmaWxpYXRpb24+CisgICAgICA8L2F1dGhvcj4KKyAgICAgIDxhdXRob3I+CisJPGZpcnN0bmFtZT5BbmRlcnM8L2ZpcnN0bmFtZT4KKwk8c3VybmFtZT5DYXJsc3Nvbjwvc3VybmFtZT4KKwk8YWZmaWxpYXRpb24+CisJICA8b3JnbmFtZT5Db2RlRmFjdG9yeSBBQjwvb3JnbmFtZT4KKwkgIDxhZGRyZXNzPgorICAgICAgICAgICAgPGVtYWlsPmFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPC9lbWFpbD4KKyAgICAgICAgICA8L2FkZHJlc3M+CisJPC9hZmZpbGlhdGlvbj4KKyAgICAgIDwvYXV0aG9yPgorICAgICAgPGF1dGhvcj4KKwk8Zmlyc3RuYW1lPkFsZXhhbmRlcjwvZmlyc3RuYW1lPgorCTxzdXJuYW1lPkxhcnNzb248L3N1cm5hbWU+CisJPGFmZmlsaWF0aW9uPgorCSAgPG9yZ25hbWU+UmVkIEhhdCwgSW5jLjwvb3JnbmFtZT4KKwkgIDxhZGRyZXNzPgorICAgICAgICAgICAgPGVtYWlsPmFsZXhsQHJlZGhhdC5jb208L2VtYWlsPgorICAgICAgICAgIDwvYWRkcmVzcz4KKwk8L2FmZmlsaWF0aW9uPgorICAgICAgPC9hdXRob3I+CisgICAgICA8YXV0aG9yPgorCTxmaXJzdG5hbWU+U3ZlbjwvZmlyc3RuYW1lPgorCTxzdXJuYW1lPkhlcnpiZXJnPC9zdXJuYW1lPgorCTxhZmZpbGlhdGlvbj4KKwkgIDxvcmduYW1lPkltZW5kaW8gQUI8L29yZ25hbWU+CisJICA8YWRkcmVzcz4KKyAgICAgICAgICAgIDxlbWFpbD5zdmVuQGltZW5kaW8uY29tPC9lbWFpbD4KKyAgICAgICAgICA8L2FkZHJlc3M+CisJPC9hZmZpbGlhdGlvbj4KKyAgICAgIDwvYXV0aG9yPgorICAgICAgPGF1dGhvcj4KKyAgICAgICAgPGZpcnN0bmFtZT5TaW1vbjwvZmlyc3RuYW1lPgorICAgICAgICA8c3VybmFtZT5NY1ZpdHRpZTwvc3VybmFtZT4KKyAgICAgICAgPGFmZmlsaWF0aW9uPgorICAgICAgICAgIDxvcmduYW1lPkNvbGxhYm9yYSBMdGQuPC9vcmduYW1lPgorICAgICAgICAgIDxhZGRyZXNzPgorICAgICAgICAgICAgPGVtYWlsPnNpbW9uLm1jdml0dGllQGNvbGxhYm9yYS5jby51azwvZW1haWw+CisgICAgICAgICAgPC9hZGRyZXNzPgorICAgICAgICA8L2FmZmlsaWF0aW9uPgorICAgICAgPC9hdXRob3I+CisgICAgICA8YXV0aG9yPgorICAgICAgICA8Zmlyc3RuYW1lPkRhdmlkPC9maXJzdG5hbWU+CisgICAgICAgIDxzdXJuYW1lPlpldXRoZW48L3N1cm5hbWU+CisgICAgICAgIDxhZmZpbGlhdGlvbj4KKyAgICAgICAgICA8b3JnbmFtZT5SZWQgSGF0LCBJbmMuPC9vcmduYW1lPgorICAgICAgICAgIDxhZGRyZXNzPgorICAgICAgICAgICAgPGVtYWlsPmRhdmlkekByZWRoYXQuY29tPC9lbWFpbD4KKyAgICAgICAgICA8L2FkZHJlc3M+CisgICAgICAgIDwvYWZmaWxpYXRpb24+CisgICAgICA8L2F1dGhvcj4KKyAgICA8L2F1dGhvcmdyb3VwPgorICAgPHJldmhpc3Rvcnk+CisgICAgIDxyZXZpc2lvbj4KKyAgICAgICA8cmV2bnVtYmVyPmN1cnJlbnQ8L3Jldm51bWJlcj4KKyAgICAgICA8ZGF0ZT48dWxpbmsgdXJsPSdodHRwOi8vY2dpdC5mcmVlZGVza3RvcC5vcmcvZGJ1cy9kYnVzL2xvZy9kb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbCc+Y29tbWl0IGxvZzwvdWxpbms+PC9kYXRlPgorICAgICAgIDxhdXRob3Jpbml0aWFscz48L2F1dGhvcmluaXRpYWxzPgorICAgICAgIDxyZXZyZW1hcms+PC9yZXZyZW1hcms+CisgICAgIDwvcmV2aXNpb24+CisgICAgIDxyZXZpc2lvbj4KKyAgICAgICA8cmV2bnVtYmVyPjAuMTk8L3Jldm51bWJlcj4KKyAgICAgICA8ZGF0ZT4yMCBGZWJydWFyeSAyMDEyPC9kYXRlPgorICAgICAgIDxhdXRob3Jpbml0aWFscz5zbWN2L2xwPC9hdXRob3Jpbml0aWFscz4KKyAgICAgICA8cmV2cmVtYXJrPmZvcm1hbGx5IGRlZmluZSB1bmlxdWUgY29ubmVjdGlvbiBuYW1lcyBhbmQgd2VsbC1rbm93bgorICAgICAgICBidXMgbmFtZXM7IGRvY3VtZW50IGJlc3QgcHJhY3RpY2VzIGZvciBpbnRlcmZhY2UsIGJ1cywgbWVtYmVyIGFuZAorICAgICAgICBlcnJvciBuYW1lcywgYW5kIG9iamVjdCBwYXRoczsgZG9jdW1lbnQgdGhlIHNlYXJjaCBwYXRoIGZvciBzZXNzaW9uCisgICAgICAgIGFuZCBzeXN0ZW0gc2VydmljZXMgb24gVW5peDsgZG9jdW1lbnQgdGhlIHN5c3RlbWQgdHJhbnNwb3J0PC9yZXZyZW1hcms+CisgICAgIDwvcmV2aXNpb24+CisgICAgIDxyZXZpc2lvbj4KKyAgICAgICA8cmV2bnVtYmVyPjAuMTg8L3Jldm51bWJlcj4KKyAgICAgICA8ZGF0ZT4yOSBKdWx5IDIwMTE8L2RhdGU+CisgICAgICAgPGF1dGhvcmluaXRpYWxzPnNtY3Y8L2F1dGhvcmluaXRpYWxzPgorICAgICAgIDxyZXZyZW1hcms+ZGVmaW5lIGVhdmVzZHJvcHBpbmcsIHVuaWNhc3QsIGJyb2FkY2FzdDsgYWRkIGVhdmVzZHJvcAorICAgICAgICAgbWF0Y2gga2V5d29yZDsgcHJvbW90ZSB0eXBlIHN5c3RlbSB0byBhIHRvcC1sZXZlbCBzZWN0aW9uPC9yZXZyZW1hcms+CisgICAgIDwvcmV2aXNpb24+CisgICAgIDxyZXZpc2lvbj4KKyAgICAgICA8cmV2bnVtYmVyPjAuMTc8L3Jldm51bWJlcj4KKyAgICAgICA8ZGF0ZT4xIEp1bmUgMjAxMTwvZGF0ZT4KKyAgICAgICA8YXV0aG9yaW5pdGlhbHM+c21jdi9kYXZpZHo8L2F1dGhvcmluaXRpYWxzPgorICAgICAgIDxyZXZyZW1hcms+ZGVmaW5lIE9iamVjdE1hbmFnZXI7IHJlc2VydmUgZXh0cmEgcHNldWRvLXR5cGUtY29kZXMgdXNlZAorICAgICAgICAgYnkgR1ZhcmlhbnQ8L3JldnJlbWFyaz4KKyAgICAgPC9yZXZpc2lvbj4KKyAgICAgPHJldmlzaW9uPgorICAgICAgIDxyZXZudW1iZXI+MC4xNjwvcmV2bnVtYmVyPgorICAgICAgIDxkYXRlPjExIEFwcmlsIDIwMTE8L2RhdGU+CisgICAgICAgPGF1dGhvcmluaXRpYWxzPjwvYXV0aG9yaW5pdGlhbHM+CisgICAgICAgPHJldnJlbWFyaz5hZGQgcGF0aF9uYW1lc3BhY2UsIGFyZzBuYW1lc3BhY2U7IGFyZ05wYXRoIG1hdGNoZXMgb2JqZWN0CisgICAgICAgIHBhdGhzPC9yZXZyZW1hcms+CisgICAgIDwvcmV2aXNpb24+CisgICAgIDxyZXZpc2lvbj4KKyAgICAgICA8cmV2bnVtYmVyPjAuMTU8L3Jldm51bWJlcj4KKyAgICAgICA8ZGF0ZT4zIE5vdmVtYmVyIDIwMTA8L2RhdGU+CisgICAgICAgPGF1dGhvcmluaXRpYWxzPjwvYXV0aG9yaW5pdGlhbHM+CisgICAgICAgPHJldnJlbWFyaz48L3JldnJlbWFyaz4KKyAgICAgPC9yZXZpc2lvbj4KKyAgICAgPHJldmlzaW9uPgorICAgICAgIDxyZXZudW1iZXI+MC4xNDwvcmV2bnVtYmVyPgorICAgICAgIDxkYXRlPjEyIE1heSAyMDEwPC9kYXRlPgorICAgICAgIDxhdXRob3Jpbml0aWFscz48L2F1dGhvcmluaXRpYWxzPgorICAgICAgIDxyZXZyZW1hcms+PC9yZXZyZW1hcms+CisgICAgIDwvcmV2aXNpb24+CisgICAgIDxyZXZpc2lvbj4KKyAgICAgICA8cmV2bnVtYmVyPjAuMTM8L3Jldm51bWJlcj4KKyAgICAgICA8ZGF0ZT4yMyBEZXplbWJlciAyMDA5PC9kYXRlPgorICAgICAgIDxhdXRob3Jpbml0aWFscz48L2F1dGhvcmluaXRpYWxzPgorICAgICAgIDxyZXZyZW1hcms+PC9yZXZyZW1hcms+CisgICAgIDwvcmV2aXNpb24+CisgICAgIDxyZXZpc2lvbj4KKyAgICAgICA8cmV2bnVtYmVyPjAuMTI8L3Jldm51bWJlcj4KKyAgICAgICA8ZGF0ZT43IE5vdmVtYmVyLCAyMDA2PC9kYXRlPgorICAgICAgIDxhdXRob3Jpbml0aWFscz48L2F1dGhvcmluaXRpYWxzPgorICAgICAgIDxyZXZyZW1hcms+PC9yZXZyZW1hcms+CisgICAgIDwvcmV2aXNpb24+CisgICAgIDxyZXZpc2lvbj4KKyAgICAgICA8cmV2bnVtYmVyPjAuMTE8L3Jldm51bWJlcj4KKyAgICAgICA8ZGF0ZT42IEZlYnJ1YXJ5IDIwMDU8L2RhdGU+CisgICAgICAgPGF1dGhvcmluaXRpYWxzPjwvYXV0aG9yaW5pdGlhbHM+CisgICAgICAgPHJldnJlbWFyaz48L3JldnJlbWFyaz4KKyAgICAgPC9yZXZpc2lvbj4KKyAgICAgPHJldmlzaW9uPgorICAgICAgIDxyZXZudW1iZXI+MC4xMDwvcmV2bnVtYmVyPgorICAgICAgIDxkYXRlPjI4IEphbnVhcnkgMjAwNTwvZGF0ZT4KKyAgICAgICA8YXV0aG9yaW5pdGlhbHM+PC9hdXRob3Jpbml0aWFscz4KKyAgICAgICA8cmV2cmVtYXJrPjwvcmV2cmVtYXJrPgorICAgICA8L3JldmlzaW9uPgorICAgICA8cmV2aXNpb24+CisgICAgICAgPHJldm51bWJlcj4wLjk8L3Jldm51bWJlcj4KKyAgICAgICA8ZGF0ZT43IEphbnVhciAyMDA1PC9kYXRlPgorICAgICAgIDxhdXRob3Jpbml0aWFscz48L2F1dGhvcmluaXRpYWxzPgorICAgICAgIDxyZXZyZW1hcms+PC9yZXZyZW1hcms+CisgICAgIDwvcmV2aXNpb24+CisgICAgIDxyZXZpc2lvbj4KKyAgICAgICA8cmV2bnVtYmVyPjAuODwvcmV2bnVtYmVyPgorICAgICAgIDxkYXRlPjA2IFNlcHRlbWJlciAyMDAzPC9kYXRlPgorICAgICAgIDxhdXRob3Jpbml0aWFscz48L2F1dGhvcmluaXRpYWxzPgorICAgICAgIDxyZXZyZW1hcms+Rmlyc3QgcmVsZWFzZWQgZG9jdW1lbnQuPC9yZXZyZW1hcms+CisgICAgIDwvcmV2aXNpb24+CisgICA8L3Jldmhpc3Rvcnk+CisgIDwvYXJ0aWNsZWluZm8+CisKKyAgPHNlY3QxIGlkPSJpbnRyb2R1Y3Rpb24iPgorICAgIDx0aXRsZT5JbnRyb2R1Y3Rpb248L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgRC1CdXMgaXMgYSBzeXN0ZW0gZm9yIGxvdy1sYXRlbmN5LCBsb3ctb3ZlcmhlYWQsIGVhc3kgdG8gdXNlCisgICAgICBpbnRlcnByb2Nlc3MgY29tbXVuaWNhdGlvbiAoSVBDKS4gSW4gbW9yZSBkZXRhaWw6CisgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBELUJ1cyBpcyA8ZW1waGFzaXM+bG93LWxhdGVuY3k8L2VtcGhhc2lzPiBiZWNhdXNlIGl0IGlzIGRlc2lnbmVkIAorICAgICAgICAgICAgdG8gYXZvaWQgcm91bmQgdHJpcHMgYW5kIGFsbG93IGFzeW5jaHJvbm91cyBvcGVyYXRpb24sIG11Y2ggbGlrZSAKKyAgICAgICAgICAgIHRoZSBYIHByb3RvY29sLgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgRC1CdXMgaXMgPGVtcGhhc2lzPmxvdy1vdmVyaGVhZDwvZW1waGFzaXM+IGJlY2F1c2UgaXQgdXNlcyBhCisgICAgICAgICAgICBiaW5hcnkgcHJvdG9jb2wsIGFuZCBkb2VzIG5vdCBoYXZlIHRvIGNvbnZlcnQgdG8gYW5kIGZyb20gYSB0ZXh0CisgICAgICAgICAgICBmb3JtYXQgc3VjaCBhcyBYTUwuIEJlY2F1c2UgRC1CdXMgaXMgaW50ZW5kZWQgZm9yIHBvdGVudGlhbGx5CisgICAgICAgICAgICBoaWdoLXJlc29sdXRpb24gc2FtZS1tYWNoaW5lIElQQywgbm90IHByaW1hcmlseSBmb3IgSW50ZXJuZXQgSVBDLAorICAgICAgICAgICAgdGhpcyBpcyBhbiBpbnRlcmVzdGluZyBvcHRpbWl6YXRpb24uCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBELUJ1cyBpcyA8ZW1waGFzaXM+ZWFzeSB0byB1c2U8L2VtcGhhc2lzPiBiZWNhdXNlIGl0IHdvcmtzIGluIHRlcm1zCisgICAgICAgICAgICBvZiA8Zmlyc3R0ZXJtPm1lc3NhZ2VzPC9maXJzdHRlcm0+IHJhdGhlciB0aGFuIGJ5dGUgc3RyZWFtcywgYW5kCisgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgYSBsb3Qgb2YgdGhlIGhhcmQgSVBDIGlzc3Vlcy4gQWxzbywgdGhlIEQtQnVzCisgICAgICAgICAgICBsaWJyYXJ5IGlzIGRlc2lnbmVkIHRvIGJlIHdyYXBwZWQgaW4gYSB3YXkgdGhhdCBsZXRzIGRldmVsb3BlcnMgdXNlCisgICAgICAgICAgICB0aGVpciBmcmFtZXdvcmsncyBleGlzdGluZyBvYmplY3QvdHlwZSBzeXN0ZW0sIHJhdGhlciB0aGFuIGxlYXJuaW5nCisgICAgICAgICAgICBhIG5ldyBvbmUgc3BlY2lmaWNhbGx5IGZvciBJUEMuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBUaGUgYmFzZSBELUJ1cyBwcm90b2NvbCBpcyBhIG9uZS10by1vbmUgKHBlZXItdG8tcGVlciBvciBjbGllbnQtc2VydmVyKQorICAgICAgcHJvdG9jb2wsIHNwZWNpZmllZCBpbiA8eHJlZiBsaW5rZW5kPSJtZXNzYWdlLXByb3RvY29sIi8+LiBUaGF0IGlzLCBpdCBpcworICAgICAgYSBzeXN0ZW0gZm9yIG9uZSBhcHBsaWNhdGlvbiB0byB0YWxrIHRvIGEgc2luZ2xlIG90aGVyCisgICAgICBhcHBsaWNhdGlvbi4gSG93ZXZlciwgdGhlIHByaW1hcnkgaW50ZW5kZWQgYXBwbGljYXRpb24gb2YgdGhlIHByb3RvY29sIGlzIHRoZQorICAgICAgRC1CdXMgPGZpcnN0dGVybT5tZXNzYWdlIGJ1czwvZmlyc3R0ZXJtPiwgc3BlY2lmaWVkIGluIDx4cmVmCisgICAgICBsaW5rZW5kPSJtZXNzYWdlLWJ1cyIvPi4gVGhlIG1lc3NhZ2UgYnVzIGlzIGEgc3BlY2lhbCBhcHBsaWNhdGlvbiB0aGF0CisgICAgICBhY2NlcHRzIGNvbm5lY3Rpb25zIGZyb20gbXVsdGlwbGUgb3RoZXIgYXBwbGljYXRpb25zLCBhbmQgZm9yd2FyZHMKKyAgICAgIG1lc3NhZ2VzIGFtb25nIHRoZW0uCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBVc2VzIG9mIEQtQnVzIGluY2x1ZGUgbm90aWZpY2F0aW9uIG9mIHN5c3RlbSBjaGFuZ2VzIChub3RpZmljYXRpb24gb2Ygd2hlbgorICAgICAgYSBjYW1lcmEgaXMgcGx1Z2dlZCBpbiB0byBhIGNvbXB1dGVyLCBvciBhIG5ldyB2ZXJzaW9uIG9mIHNvbWUgc29mdHdhcmUKKyAgICAgIGhhcyBiZWVuIGluc3RhbGxlZCksIG9yIGRlc2t0b3AgaW50ZXJvcGVyYWJpbGl0eSwgZm9yIGV4YW1wbGUgYSBmaWxlCisgICAgICBtb25pdG9yaW5nIHNlcnZpY2Ugb3IgYSBjb25maWd1cmF0aW9uIHNlcnZpY2UuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBELUJ1cyBpcyBkZXNpZ25lZCBmb3IgdHdvIHNwZWNpZmljIHVzZSBjYXNlczoKKyAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEEgInN5c3RlbSBidXMiIGZvciBub3RpZmljYXRpb25zIGZyb20gdGhlIHN5c3RlbSB0byB1c2VyIHNlc3Npb25zLAorICAgICAgICAgICAgYW5kIHRvIGFsbG93IHRoZSBzeXN0ZW0gdG8gcmVxdWVzdCBpbnB1dCBmcm9tIHVzZXIgc2Vzc2lvbnMuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBBICJzZXNzaW9uIGJ1cyIgdXNlZCB0byBpbXBsZW1lbnQgZGVza3RvcCBlbnZpcm9ubWVudHMgc3VjaCBhcyAKKyAgICAgICAgICAgIEdOT01FIGFuZCBLREUuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICBELUJ1cyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgYSBnZW5lcmljIElQQyBzeXN0ZW0gZm9yIGFueSBwb3NzaWJsZSAKKyAgICAgIGFwcGxpY2F0aW9uLCBhbmQgaW50ZW50aW9uYWxseSBvbWl0cyBtYW55IGZlYXR1cmVzIGZvdW5kIGluIG90aGVyIAorICAgICAgSVBDIHN5c3RlbXMgZm9yIHRoaXMgcmVhc29uLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICAgQXQgdGhlIHNhbWUgdGltZSwgdGhlIGJ1cyBkYWVtb25zIG9mZmVyIGEgbnVtYmVyIG9mIGZlYXR1cmVzIG5vdCBmb3VuZCBpbgorICAgICAgb3RoZXIgSVBDIHN5c3RlbXMsIHN1Y2ggYXMgc2luZ2xlLW93bmVyICJidXMgbmFtZXMiIChzaW1pbGFyIHRvIFgKKyAgICAgIHNlbGVjdGlvbnMpLCBvbi1kZW1hbmQgc3RhcnR1cCBvZiBzZXJ2aWNlcywgYW5kIHNlY3VyaXR5IHBvbGljaWVzLgorICAgICAgSW4gbWFueSB3YXlzLCB0aGVzZSBmZWF0dXJlcyBhcmUgdGhlIHByaW1hcnkgbW90aXZhdGlvbiBmb3IgZGV2ZWxvcGluZyAKKyAgICAgIEQtQnVzOyBvdGhlciBzeXN0ZW1zIHdvdWxkIGhhdmUgc3VmZmljZWQgaWYgSVBDIHdlcmUgdGhlIG9ubHkgZ29hbC4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgIEQtQnVzIG1heSB0dXJuIG91dCB0byBiZSB1c2VmdWwgaW4gdW5hbnRpY2lwYXRlZCBhcHBsaWNhdGlvbnMsIGJ1dCBmdXR1cmUKKyAgICAgIHZlcnNpb25zIG9mIHRoaXMgc3BlYyBhbmQgdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBwcm9iYWJseSB3aWxsIG5vdAorICAgICAgaW5jb3Jwb3JhdGUgZmVhdHVyZXMgdGhhdCBpbnRlcmZlcmUgd2l0aCB0aGUgY29yZSB1c2UgY2FzZXMuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBUaGUga2V5IHdvcmRzICJNVVNUIiwgIk1VU1QgTk9UIiwgIlJFUVVJUkVEIiwgIlNIQUxMIiwgIlNIQUxMIE5PVCIsCisgICAgICAiU0hPVUxEIiwgIlNIT1VMRCBOT1QiLCAiUkVDT01NRU5ERUQiLCAiTUFZIiwgYW5kICJPUFRJT05BTCIgaW4gdGhpcworICAgICAgZG9jdW1lbnQgYXJlIHRvIGJlIGludGVycHJldGVkIGFzIGRlc2NyaWJlZCBpbiBSRkMgMjExOS4gSG93ZXZlciwgdGhlCisgICAgICBkb2N1bWVudCBjb3VsZCB1c2UgYSBzZXJpb3VzIGF1ZGl0IHRvIGJlIHN1cmUgaXQgbWFrZXMgc2Vuc2UgdG8gZG8KKyAgICAgIHNvLiBBbHNvLCB0aGV5IGFyZSBub3QgY2FwaXRhbGl6ZWQuCisgICAgPC9wYXJhPgorCisgICAgPHNlY3QyIGlkPSJzdGFiaWxpdHkiPgorICAgICAgPHRpdGxlPlByb3RvY29sIGFuZCBTcGVjaWZpY2F0aW9uIFN0YWJpbGl0eTwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIEQtQnVzIHByb3RvY29sIGlzIGZyb3plbiAob25seSBjb21wYXRpYmxlIGV4dGVuc2lvbnMgYXJlIGFsbG93ZWQpIGFzCisgICAgICAgIG9mIE5vdmVtYmVyIDgsIDIwMDYuICBIb3dldmVyLCB0aGlzIHNwZWNpZmljYXRpb24gY291bGQgc3RpbGwgdXNlIGEgZmFpcgorICAgICAgICBiaXQgb2Ygd29yayB0byBtYWtlIGludGVyb3BlcmFibGUgcmVpbXBsZW1lbnRhdGlvbiBwb3NzaWJsZSB3aXRob3V0CisgICAgICAgIHJlZmVyZW5jZSB0byB0aGUgRC1CdXMgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLiBUaHVzLCB0aGlzCisgICAgICAgIHNwZWNpZmljYXRpb24gaXMgbm90IG1hcmtlZCAxLjAuIFRvIG1hcmsgaXQgMS4wLCB3ZSdkIGxpa2UgdG8gc2VlCisgICAgICAgIHNvbWVvbmUgaW52ZXN0IHNpZ25pZmljYW50IGVmZm9ydCBpbiBjbGFyaWZ5aW5nIHRoZSBzcGVjaWZpY2F0aW9uCisgICAgICAgIGxhbmd1YWdlLCBhbmQgZ3Jvd2luZyB0aGUgc3BlY2lmaWNhdGlvbiB0byBjb3ZlciBtb3JlIGFzcGVjdHMgb2YgdGhlCisgICAgICAgIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbidzIGJlaGF2aW9yLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFVudGlsIHRoaXMgd29yayBpcyBjb21wbGV0ZSwgYW55IGF0dGVtcHQgdG8gcmVpbXBsZW1lbnQgRC1CdXMgd2lsbCAKKyAgICAgICAgcHJvYmFibHkgcmVxdWlyZSBsb29raW5nIGF0IHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gYW5kL29yIGFza2luZworICAgICAgICBxdWVzdGlvbnMgb24gdGhlIEQtQnVzIG1haWxpbmcgbGlzdCBhYm91dCBpbnRlbmRlZCBiZWhhdmlvci4gCisgICAgICAgIFF1ZXN0aW9ucyBvbiB0aGUgbGlzdCBhcmUgdmVyeSB3ZWxjb21lLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIE5vbmV0aGVsZXNzLCB0aGlzIGRvY3VtZW50IHNob3VsZCBiZSBhIHVzZWZ1bCBzdGFydGluZyBwb2ludCBhbmQgaXMgCisgICAgICAgIHRvIG91ciBrbm93bGVkZ2UgYWNjdXJhdGUsIHRob3VnaCBpbmNvbXBsZXRlLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgCisgIDwvc2VjdDE+CisKKyAgPHNlY3QxIGlkPSJ0eXBlLXN5c3RlbSI+CisgICAgPHRpdGxlPlR5cGUgU3lzdGVtPC90aXRsZT4KKworICAgIDxwYXJhPgorICAgICAgRC1CdXMgaGFzIGEgdHlwZSBzeXN0ZW0sIGluIHdoaWNoIHZhbHVlcyBvZiB2YXJpb3VzIHR5cGVzIGNhbiBiZQorICAgICAgc2VyaWFsaXplZCBpbnRvIGEgc2VxdWVuY2Ugb2YgYnl0ZXMgcmVmZXJyZWQgdG8gYXMgdGhlCisgICAgICA8Zmlyc3R0ZXJtPndpcmUgZm9ybWF0PC9maXJzdHRlcm0+IGluIGEgc3RhbmRhcmQgd2F5LgorICAgICAgQ29udmVydGluZyBhIHZhbHVlIGZyb20gc29tZSBvdGhlciByZXByZXNlbnRhdGlvbiBpbnRvIHRoZSB3aXJlCisgICAgICBmb3JtYXQgaXMgY2FsbGVkIDxmaXJzdHRlcm0+bWFyc2hhbGluZzwvZmlyc3R0ZXJtPiBhbmQgY29udmVydGluZworICAgICAgaXQgYmFjayBmcm9tIHRoZSB3aXJlIGZvcm1hdCBpcyA8Zmlyc3R0ZXJtPnVubWFyc2hhbGluZzwvZmlyc3R0ZXJtPi4KKyAgICA8L3BhcmE+CisKKyAgICA8c2VjdDIgaWQ9Im1lc3NhZ2UtcHJvdG9jb2wtc2lnbmF0dXJlcyI+CisgICAgICA8dGl0bGU+VHlwZSBTaWduYXR1cmVzPC90aXRsZT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBELUJ1cyBwcm90b2NvbCBkb2VzIG5vdCBpbmNsdWRlIHR5cGUgdGFncyBpbiB0aGUgbWFyc2hhbGVkIGRhdGE7IGEKKyAgICAgICAgYmxvY2sgb2YgbWFyc2hhbGVkIHZhbHVlcyBtdXN0IGhhdmUgYSBrbm93biA8Zmlyc3R0ZXJtPnR5cGUKKyAgICAgICAgc2lnbmF0dXJlPC9maXJzdHRlcm0+LiAgVGhlIHR5cGUgc2lnbmF0dXJlIGlzIG1hZGUgdXAgb2YgPGZpcnN0dGVybT50eXBlCisgICAgICAgIGNvZGVzPC9maXJzdHRlcm0+LiBBIHR5cGUgY29kZSBpcyBhbiBBU0NJSSBjaGFyYWN0ZXIgcmVwcmVzZW50aW5nIHRoZQorICAgICAgICB0eXBlIG9mIGEgdmFsdWUuIEJlY2F1c2UgQVNDSUkgY2hhcmFjdGVycyBhcmUgdXNlZCwgdGhlIHR5cGUgc2lnbmF0dXJlCisgICAgICAgIHdpbGwgYWx3YXlzIGZvcm0gYSB2YWxpZCBBU0NJSSBzdHJpbmcuIEEgc2ltcGxlIHN0cmluZyBjb21wYXJlIAorICAgICAgICBkZXRlcm1pbmVzIHdoZXRoZXIgdHdvIHR5cGUgc2lnbmF0dXJlcyBhcmUgZXF1aXZhbGVudC4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEFzIGEgc2ltcGxlIGV4YW1wbGUsIHRoZSB0eXBlIGNvZGUgZm9yIDMyLWJpdCBpbnRlZ2VyICg8bGl0ZXJhbD5JTlQzMjwvbGl0ZXJhbD4pIGlzCisgICAgICAgIHRoZSBBU0NJSSBjaGFyYWN0ZXIgJ2knLiBTbyB0aGUgc2lnbmF0dXJlIGZvciBhIGJsb2NrIG9mIHZhbHVlcyAKKyAgICAgICAgY29udGFpbmluZyBhIHNpbmdsZSA8bGl0ZXJhbD5JTlQzMjwvbGl0ZXJhbD4gd291bGQgYmU6CisgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAiaSIKKyAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgQSBibG9jayBvZiB2YWx1ZXMgY29udGFpbmluZyB0d28gPGxpdGVyYWw+SU5UMzI8L2xpdGVyYWw+IHdvdWxkIGhhdmUgdGhpcyBzaWduYXR1cmU6CisgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAiaWkiCisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+ICAgICAgICAKKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEFsbCA8Zmlyc3R0ZXJtPmJhc2ljPC9maXJzdHRlcm0+IHR5cGVzIHdvcmsgbGlrZSAKKyAgICAgICAgPGxpdGVyYWw+SU5UMzI8L2xpdGVyYWw+IGluIHRoaXMgZXhhbXBsZS4gVG8gbWFyc2hhbCBhbmQgdW5tYXJzaGFsIAorICAgICAgICBiYXNpYyB0eXBlcywgeW91IHNpbXBseSByZWFkIG9uZSB2YWx1ZSBmcm9tIHRoZSBkYXRhCisgICAgICAgIGJsb2NrIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCB0eXBlIGNvZGUgaW4gdGhlIHNpZ25hdHVyZS4KKyAgICAgICAgSW4gYWRkaXRpb24gdG8gYmFzaWMgdHlwZXMsIHRoZXJlIGFyZSBmb3VyIDxmaXJzdHRlcm0+Y29udGFpbmVyPC9maXJzdHRlcm0+IAorICAgICAgICB0eXBlczogPGxpdGVyYWw+U1RSVUNUPC9saXRlcmFsPiwgPGxpdGVyYWw+QVJSQVk8L2xpdGVyYWw+LCA8bGl0ZXJhbD5WQVJJQU5UPC9saXRlcmFsPiwgCisgICAgICAgIGFuZCA8bGl0ZXJhbD5ESUNUX0VOVFJZPC9saXRlcmFsPi4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIDxsaXRlcmFsPlNUUlVDVDwvbGl0ZXJhbD4gaGFzIGEgdHlwZSBjb2RlLCBBU0NJSSBjaGFyYWN0ZXIgJ3InLCBidXQgdGhpcyB0eXBlIAorICAgICAgICBjb2RlIGRvZXMgbm90IGFwcGVhciBpbiBzaWduYXR1cmVzLiBJbnN0ZWFkLCBBU0NJSSBjaGFyYWN0ZXJzCisgICAgICAgICcoJyBhbmQgJyknIGFyZSB1c2VkIHRvIG1hcmsgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSBzdHJ1Y3QuCisgICAgICAgIFNvIGZvciBleGFtcGxlLCBhIHN0cnVjdCBjb250YWluaW5nIHR3byBpbnRlZ2VycyB3b3VsZCBoYXZlIHRoaXMgCisgICAgICAgIHNpZ25hdHVyZToKKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICIoaWkpIgorICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICBTdHJ1Y3RzIGNhbiBiZSBuZXN0ZWQsIHNvIGZvciBleGFtcGxlIGEgc3RydWN0IGNvbnRhaW5pbmcgCisgICAgICAgIGFuIGludGVnZXIgYW5kIGFub3RoZXIgc3RydWN0OgorICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgIihpKGlpKSkiCisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIFRoZSB2YWx1ZSBibG9jayBzdG9yaW5nIHRoYXQgc3RydWN0IHdvdWxkIGNvbnRhaW4gdGhyZWUgaW50ZWdlcnM7IHRoZQorICAgICAgICB0eXBlIHNpZ25hdHVyZSBhbGxvd3MgeW91IHRvIGRpc3Rpbmd1aXNoICIoaShpaSkpIiBmcm9tICIoKGlpKWkpIiBvcgorICAgICAgICAiKGlpaSkiIG9yICJpaWkiLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIDxsaXRlcmFsPlNUUlVDVDwvbGl0ZXJhbD4gdHlwZSBjb2RlICdyJyBpcyBub3QgY3VycmVudGx5IHVzZWQgaW4gdGhlIEQtQnVzIHByb3RvY29sLAorICAgICAgICBidXQgaXMgdXNlZnVsIGluIGNvZGUgdGhhdCBpbXBsZW1lbnRzIHRoZSBwcm90b2NvbC4gVGhpcyB0eXBlIGNvZGUgCisgICAgICAgIGlzIHNwZWNpZmllZCB0byBhbGxvdyBzdWNoIGNvZGUgdG8gaW50ZXJvcGVyYXRlIGluIG5vbi1wcm90b2NvbCBjb250ZXh0cy4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEVtcHR5IHN0cnVjdHVyZXMgYXJlIG5vdCBhbGxvd2VkOyB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZQorICAgICAgICB0eXBlIGNvZGUgYmV0d2VlbiB0aGUgcGFyZW50aGVzZXMuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICA8bGl0ZXJhbD5BUlJBWTwvbGl0ZXJhbD4gaGFzIEFTQ0lJIGNoYXJhY3RlciAnYScgYXMgdHlwZSBjb2RlLiBUaGUgYXJyYXkgdHlwZSBjb2RlIG11c3QgYmUKKyAgICAgICAgZm9sbG93ZWQgYnkgYSA8Zmlyc3R0ZXJtPnNpbmdsZSBjb21wbGV0ZSB0eXBlPC9maXJzdHRlcm0+LiBUaGUgc2luZ2xlCisgICAgICAgIGNvbXBsZXRlIHR5cGUgZm9sbG93aW5nIHRoZSBhcnJheSBpcyB0aGUgdHlwZSBvZiBlYWNoIGFycmF5IGVsZW1lbnQuIFNvCisgICAgICAgIHRoZSBzaW1wbGUgZXhhbXBsZSBpczoKKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICJhaSIKKyAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgd2hpY2ggaXMgYW4gYXJyYXkgb2YgMzItYml0IGludGVnZXJzLiBCdXQgYW4gYXJyYXkgY2FuIGJlIG9mIGFueSB0eXBlLCAKKyAgICAgICAgc3VjaCBhcyB0aGlzIGFycmF5LW9mLXN0cnVjdC13aXRoLXR3by1pbnQzMi1maWVsZHM6CisgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAiYShpaSkiCisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIE9yIHRoaXMgYXJyYXkgb2YgYXJyYXkgb2YgaW50ZWdlcjoKKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICJhYWkiCisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgcGhyYXNlIDxmaXJzdHRlcm0+c2luZ2xlIGNvbXBsZXRlIHR5cGU8L2ZpcnN0dGVybT4gZGVzZXJ2ZXMgc29tZSAKKyAgICAgICAgZGVmaW5pdGlvbi4gQSBzaW5nbGUgY29tcGxldGUgdHlwZSBpcyBhIGJhc2ljIHR5cGUgY29kZSwgYSB2YXJpYW50IHR5cGUgY29kZSwgCisgICAgICAgIGFuIGFycmF5IHdpdGggaXRzIGVsZW1lbnQgdHlwZSwgb3IgYSBzdHJ1Y3Qgd2l0aCBpdHMgZmllbGRzLiAKKyAgICAgICAgU28gdGhlIGZvbGxvd2luZyBzaWduYXR1cmVzIGFyZSBub3Qgc2luZ2xlIGNvbXBsZXRlIHR5cGVzOgorICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgImFhIgorICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgIihpaSIKKyAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICJpaSkiCisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIEFuZCB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZXMgY29udGFpbiBtdWx0aXBsZSBjb21wbGV0ZSB0eXBlczoKKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICJpaSIKKyAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICJhaWFpIgorICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgIihpaSkoaWkpIgorICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICBOb3RlIGhvd2V2ZXIgdGhhdCBhIHNpbmdsZSBjb21wbGV0ZSB0eXBlIG1heSA8ZW1waGFzaXM+Y29udGFpbjwvZW1waGFzaXM+CisgICAgICAgIG11bHRpcGxlIG90aGVyIHNpbmdsZSBjb21wbGV0ZSB0eXBlcy4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIDxsaXRlcmFsPlZBUklBTlQ8L2xpdGVyYWw+IGhhcyBBU0NJSSBjaGFyYWN0ZXIgJ3YnIGFzIGl0cyB0eXBlIGNvZGUuIEEgbWFyc2hhbGVkIHZhbHVlIG9mCisgICAgICAgIHR5cGUgPGxpdGVyYWw+VkFSSUFOVDwvbGl0ZXJhbD4gd2lsbCBoYXZlIHRoZSBzaWduYXR1cmUgb2YgYSBzaW5nbGUgY29tcGxldGUgdHlwZSBhcyBwYXJ0CisgICAgICAgIG9mIHRoZSA8ZW1waGFzaXM+dmFsdWU8L2VtcGhhc2lzPi4gIFRoaXMgc2lnbmF0dXJlIHdpbGwgYmUgZm9sbG93ZWQgYnkgYQorICAgICAgICBtYXJzaGFsZWQgdmFsdWUgb2YgdGhhdCB0eXBlLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgQSA8bGl0ZXJhbD5ESUNUX0VOVFJZPC9saXRlcmFsPiB3b3JrcyBleGFjdGx5IGxpa2UgYSBzdHJ1Y3QsIGJ1dCByYXRoZXIKKyAgICAgICAgdGhhbiBwYXJlbnRoZXNlcyBpdCB1c2VzIGN1cmx5IGJyYWNlcywgYW5kIGl0IGhhcyBtb3JlIHJlc3RyaWN0aW9ucy4KKyAgICAgICAgVGhlIHJlc3RyaWN0aW9ucyBhcmU6IGl0IG9jY3VycyBvbmx5IGFzIGFuIGFycmF5IGVsZW1lbnQgdHlwZTsgaXQgaGFzCisgICAgICAgIGV4YWN0bHkgdHdvIHNpbmdsZSBjb21wbGV0ZSB0eXBlcyBpbnNpZGUgdGhlIGN1cmx5IGJyYWNlczsgdGhlIGZpcnN0CisgICAgICAgIHNpbmdsZSBjb21wbGV0ZSB0eXBlICh0aGUgImtleSIpIG11c3QgYmUgYSBiYXNpYyB0eXBlIHJhdGhlciB0aGFuIGEKKyAgICAgICAgY29udGFpbmVyIHR5cGUuIEltcGxlbWVudGF0aW9ucyBtdXN0IG5vdCBhY2NlcHQgZGljdCBlbnRyaWVzIG91dHNpZGUgb2YKKyAgICAgICAgYXJyYXlzLCBtdXN0IG5vdCBhY2NlcHQgZGljdCBlbnRyaWVzIHdpdGggemVybywgb25lLCBvciBtb3JlIHRoYW4gdHdvCisgICAgICAgIGZpZWxkcywgYW5kIG11c3Qgbm90IGFjY2VwdCBkaWN0IGVudHJpZXMgd2l0aCBub24tYmFzaWMtdHlwZWQga2V5cy4gQQorICAgICAgICBkaWN0IGVudHJ5IGlzIGFsd2F5cyBhIGtleS12YWx1ZSBwYWlyLgorICAgICAgPC9wYXJhPgorICAgICAgCisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIGZpcnN0IGZpZWxkIGluIHRoZSA8bGl0ZXJhbD5ESUNUX0VOVFJZPC9saXRlcmFsPiBpcyBhbHdheXMgdGhlIGtleS4KKyAgICAgICAgQSBtZXNzYWdlIGlzIGNvbnNpZGVyZWQgY29ycnVwdCBpZiB0aGUgc2FtZSBrZXkgb2NjdXJzIHR3aWNlIGluIHRoZSBzYW1lCisgICAgICAgIGFycmF5IG9mIDxsaXRlcmFsPkRJQ1RfRU5UUlk8L2xpdGVyYWw+LiBIb3dldmVyLCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucworICAgICAgICBpbXBsZW1lbnRhdGlvbnMgYXJlIG5vdCByZXF1aXJlZCB0byByZWplY3QgZGljdHMgd2l0aCBkdXBsaWNhdGUga2V5cy4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEluIG1vc3QgbGFuZ3VhZ2VzLCBhbiBhcnJheSBvZiBkaWN0IGVudHJ5IHdvdWxkIGJlIHJlcHJlc2VudGVkIGFzIGEgCisgICAgICAgIG1hcCwgaGFzaCB0YWJsZSwgb3IgZGljdCBvYmplY3QuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgZm9sbG93aW5nIHRhYmxlIHN1bW1hcml6ZXMgdGhlIEQtQnVzIHR5cGVzLgorICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5Db252ZW50aW9uYWwgTmFtZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkNvZGU8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+SU5WQUxJRDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4wIChBU0NJSSBOVUwpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Tm90IGEgdmFsaWQgdHlwZSBjb2RlLCB1c2VkIHRvIHRlcm1pbmF0ZSBzaWduYXR1cmVzPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKwkJPGVudHJ5PjxsaXRlcmFsPkJZVEU8L2xpdGVyYWw+PC9lbnRyeT4KKwkJPGVudHJ5PjEyMSAoQVNDSUkgJ3knKTwvZW50cnk+CisJCTxlbnRyeT44LWJpdCB1bnNpZ25lZCBpbnRlZ2VyPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKwkJPGVudHJ5PjxsaXRlcmFsPkJPT0xFQU48L2xpdGVyYWw+PC9lbnRyeT4KKwkJPGVudHJ5Pjk4IChBU0NJSSAnYicpPC9lbnRyeT4KKwkJPGVudHJ5PkJvb2xlYW4gdmFsdWUsIDAgaXMgPGxpdGVyYWw+RkFMU0U8L2xpdGVyYWw+IGFuZCAxIGlzIDxsaXRlcmFsPlRSVUU8L2xpdGVyYWw+LiBFdmVyeXRoaW5nIGVsc2UgaXMgaW52YWxpZC48L2VudHJ5PgorCSAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPklOVDE2PC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjExMCAoQVNDSUkgJ24nKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjE2LWJpdCBzaWduZWQgaW50ZWdlcjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlVJTlQxNjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xMTMgKEFTQ0lJICdxJyk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xNi1iaXQgdW5zaWduZWQgaW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+SU5UMzI8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTA1IChBU0NJSSAnaScpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MzItYml0IHNpZ25lZCBpbnRlZ2VyPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+VUlOVDMyPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjExNyAoQVNDSUkgJ3UnKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5JTlQ2NDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xMjAgKEFTQ0lJICd4Jyk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT42NC1iaXQgc2lnbmVkIGludGVnZXI8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5VSU5UNjQ8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTE2IChBU0NJSSAndCcpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+NjQtYml0IHVuc2lnbmVkIGludGVnZXI8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5ET1VCTEU8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTAwIChBU0NJSSAnZCcpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+SUVFRSA3NTQgZG91YmxlPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+U1RSSU5HPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjExNSAoQVNDSUkgJ3MnKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlVURi04IHN0cmluZyAoPGVtcGhhc2lzPm11c3Q8L2VtcGhhc2lzPiBiZSB2YWxpZCBVVEYtOCkuIE11c3QgYmUgbnVsIHRlcm1pbmF0ZWQgYW5kIGNvbnRhaW4gbm8gb3RoZXIgbnVsIGJ5dGVzLjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPk9CSkVDVF9QQVRIPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjExMSAoQVNDSUkgJ28nKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5Pk5hbWUgb2YgYW4gb2JqZWN0IGluc3RhbmNlPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+U0lHTkFUVVJFPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjEwMyAoQVNDSUkgJ2cnKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkEgdHlwZSBzaWduYXR1cmU8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5BUlJBWTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT45NyAoQVNDSUkgJ2EnKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkFycmF5PC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+U1RSVUNUPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjExNCAoQVNDSUkgJ3InKSwgNDAgKEFTQ0lJICcoJyksIDQxIChBU0NJSSAnKScpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+U3RydWN0OyB0eXBlIGNvZGUgMTE0ICdyJyBpcyByZXNlcnZlZCBmb3IgdXNlIGluCisgICAgICAgICAgICAgICAgICBiaW5kaW5ncyBhbmQgaW1wbGVtZW50YXRpb25zIHRvIHJlcHJlc2VudCB0aGUgZ2VuZXJhbAorICAgICAgICAgICAgICAgICAgY29uY2VwdCBvZiBhIHN0cnVjdCwgYW5kIG11c3Qgbm90IGFwcGVhciBpbiBzaWduYXR1cmVzCisgICAgICAgICAgICAgICAgICB1c2VkIG9uIEQtQnVzLjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlZBUklBTlQ8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTE4IChBU0NJSSAndicpIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlZhcmlhbnQgdHlwZSAodGhlIHR5cGUgb2YgdGhlIHZhbHVlIGlzIHBhcnQgb2YgdGhlIHZhbHVlIGl0c2VsZik8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5ESUNUX0VOVFJZPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjEwMSAoQVNDSUkgJ2UnKSwgMTIzIChBU0NJSSAneycpLCAxMjUgKEFTQ0lJICd9JykgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+RW50cnkgaW4gYSBkaWN0IG9yIG1hcCAoYXJyYXkgb2Yga2V5LXZhbHVlIHBhaXJzKS4KKyAgICAgICAgICAgICAgICAgIFR5cGUgY29kZSAxMDEgJ2UnIGlzIHJlc2VydmVkIGZvciB1c2UgaW4gYmluZGluZ3MgYW5kCisgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMgdG8gcmVwcmVzZW50IHRoZSBnZW5lcmFsIGNvbmNlcHQgb2YgYQorICAgICAgICAgICAgICAgICAgZGljdCBvciBkaWN0LWVudHJ5LCBhbmQgbXVzdCBub3QgYXBwZWFyIGluIHNpZ25hdHVyZXMKKyAgICAgICAgICAgICAgICAgIHVzZWQgb24gRC1CdXMuPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+VU5JWF9GRDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xMDQgKEFTQ0lJICdoJyk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5Vbml4IGZpbGUgZGVzY3JpcHRvcjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT4ocmVzZXJ2ZWQpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTA5IChBU0NJSSAnbScpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+UmVzZXJ2ZWQgZm9yIDx1bGluaworICAgICAgICAgICAgICAgICAgICB1cmw9Imh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTI3ODU3Ij5hCisgICAgICAgICAgICAgICAgICAnbWF5YmUnIHR5cGUgY29tcGF0aWJsZSB3aXRoIHRoZSBvbmUgaW4gR1ZhcmlhbnQ8L3VsaW5rPiwKKyAgICAgICAgICAgICAgICAgIGFuZCBtdXN0IG5vdCBhcHBlYXIgaW4gc2lnbmF0dXJlcyB1c2VkIG9uIEQtQnVzIHVudGlsCisgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgaGVyZTwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT4ocmVzZXJ2ZWQpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+NDIgKEFTQ0lJICcqJyk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5SZXNlcnZlZCBmb3IgdXNlIGluIGJpbmRpbmdzL2ltcGxlbWVudGF0aW9ucyB0bworICAgICAgICAgICAgICAgICAgcmVwcmVzZW50IGFueSA8Zmlyc3R0ZXJtPnNpbmdsZSBjb21wbGV0ZSB0eXBlPC9maXJzdHRlcm0+LAorICAgICAgICAgICAgICAgICAgYW5kIG11c3Qgbm90IGFwcGVhciBpbiBzaWduYXR1cmVzIHVzZWQgb24gRC1CdXMuPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PihyZXNlcnZlZCk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT42MyAoQVNDSUkgJz8nKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlJlc2VydmVkIGZvciB1c2UgaW4gYmluZGluZ3MvaW1wbGVtZW50YXRpb25zIHRvCisgICAgICAgICAgICAgICAgICByZXByZXNlbnQgYW55IDxmaXJzdHRlcm0+YmFzaWMgdHlwZTwvZmlyc3R0ZXJtPiwgYW5kIG11c3QKKyAgICAgICAgICAgICAgICAgIG5vdCBhcHBlYXIgaW4gc2lnbmF0dXJlcyB1c2VkIG9uIEQtQnVzLjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT4ocmVzZXJ2ZWQpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+NjQgKEFTQ0lJICdAJyksIDM4IChBU0NJSSAnJmFtcDsnKSwKKyAgICAgICAgICAgICAgICAgIDk0IChBU0NJSSAnXicpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+UmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZSBieSBiaW5kaW5ncy9pbXBsZW1lbnRhdGlvbnMsCisgICAgICAgICAgICAgICAgICBhbmQgbXVzdCBub3QgYXBwZWFyIGluIHNpZ25hdHVyZXMgdXNlZCBvbiBELUJ1cy4KKyAgICAgICAgICAgICAgICAgIEdWYXJpYW50IHVzZXMgdGhlc2UgdHlwZS1jb2RlcyB0byBlbmNvZGUgY2FsbGluZworICAgICAgICAgICAgICAgICAgY29udmVudGlvbnMuPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICA8L3BhcmE+CisKKyAgICA8L3NlY3QyPgorCisgICAgPHNlY3QyIGlkPSJtZXNzYWdlLXByb3RvY29sLW1hcnNoYWxpbmciPgorICAgICAgPHRpdGxlPk1hcnNoYWxpbmcgKFdpcmUgRm9ybWF0KTwvdGl0bGU+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBHaXZlbiBhIHR5cGUgc2lnbmF0dXJlLCBhIGJsb2NrIG9mIGJ5dGVzIGNhbiBiZSBjb252ZXJ0ZWQgaW50byB0eXBlZAorICAgICAgICB2YWx1ZXMuIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIGZvcm1hdCBvZiB0aGUgYmxvY2sgb2YgYnl0ZXMuICBCeXRlCisgICAgICAgIG9yZGVyIGFuZCBhbGlnbm1lbnQgaXNzdWVzIGFyZSBoYW5kbGVkIHVuaWZvcm1seSBmb3IgYWxsIEQtQnVzIHR5cGVzLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgQSBibG9jayBvZiBieXRlcyBoYXMgYW4gYXNzb2NpYXRlZCBieXRlIG9yZGVyLiBUaGUgYnl0ZSBvcmRlciAKKyAgICAgICAgaGFzIHRvIGJlIGRpc2NvdmVyZWQgaW4gc29tZSB3YXk7IGZvciBELUJ1cyBtZXNzYWdlcywgdGhlIAorICAgICAgICBieXRlIG9yZGVyIGlzIHBhcnQgb2YgdGhlIG1lc3NhZ2UgaGVhZGVyIGFzIGRlc2NyaWJlZCBpbiAKKyAgICAgICAgPHhyZWYgbGlua2VuZD0ibWVzc2FnZS1wcm90b2NvbC1tZXNzYWdlcyIvPi4gRm9yIG5vdywgYXNzdW1lIAorICAgICAgICB0aGF0IHRoZSBieXRlIG9yZGVyIGlzIGtub3duIHRvIGJlIGVpdGhlciBsaXR0bGUgZW5kaWFuIG9yIGJpZyAKKyAgICAgICAgICBlbmRpYW4uCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBFYWNoIHZhbHVlIGluIGEgYmxvY2sgb2YgYnl0ZXMgaXMgYWxpZ25lZCAibmF0dXJhbGx5LCIgZm9yIGV4YW1wbGUKKyAgICAgICAgNC1ieXRlIHZhbHVlcyBhcmUgYWxpZ25lZCB0byBhIDQtYnl0ZSBib3VuZGFyeSwgYW5kIDgtYnl0ZSB2YWx1ZXMgdG8gYW4KKyAgICAgICAgOC1ieXRlIGJvdW5kYXJ5LiBUbyBwcm9wZXJseSBhbGlnbiBhIHZhbHVlLCA8Zmlyc3R0ZXJtPmFsaWdubWVudAorICAgICAgICBwYWRkaW5nPC9maXJzdHRlcm0+IG1heSBiZSBuZWNlc3NhcnkuIFRoZSBhbGlnbm1lbnQgcGFkZGluZyBtdXN0IGFsd2F5cworICAgICAgICBiZSB0aGUgbWluaW11bSByZXF1aXJlZCBwYWRkaW5nIHRvIHByb3Blcmx5IGFsaWduIHRoZSBmb2xsb3dpbmcgdmFsdWU7CisgICAgICAgIGFuZCBpdCBtdXN0IGFsd2F5cyBiZSBtYWRlIHVwIG9mIG51bCBieXRlcy4gVGhlIGFsaWdubWVudCBwYWRkaW5nIG11c3QKKyAgICAgICAgbm90IGJlIGxlZnQgdW5pbml0aWFsaXplZCAoaXQgY2FuJ3QgY29udGFpbiBnYXJiYWdlKSwgYW5kIG1vcmUgcGFkZGluZworICAgICAgICB0aGFuIHJlcXVpcmVkIG11c3Qgbm90IGJlIHVzZWQuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBHaXZlbiBhbGwgdGhpcywgdGhlIHR5cGVzIGFyZSBtYXJzaGFsZWQgb24gdGhlIHdpcmUgYXMgZm9sbG93czoKKyAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Q29udmVudGlvbmFsIE5hbWU8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5FbmNvZGluZzwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkFsaWdubWVudDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+SU5WQUxJRDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5Ob3QgYXBwbGljYWJsZTsgY2Fubm90IGJlIG1hcnNoYWxlZC48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5OL0E8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5CWVRFPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkEgc2luZ2xlIDgtYml0IGJ5dGUuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPkJPT0xFQU48L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+QXMgZm9yIDxsaXRlcmFsPlVJTlQzMjwvbGl0ZXJhbD4sIGJ1dCBvbmx5IDAgYW5kIDEgYXJlIHZhbGlkIHZhbHVlcy48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT40PC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+SU5UMTY8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTYtYml0IHNpZ25lZCBpbnRlZ2VyIGluIHRoZSBtZXNzYWdlJ3MgYnl0ZSBvcmRlci48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4yPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+VUlOVDE2PC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGluIHRoZSBtZXNzYWdlJ3MgYnl0ZSBvcmRlci48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4yPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+SU5UMzI8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MzItYml0IHNpZ25lZCBpbnRlZ2VyIGluIHRoZSBtZXNzYWdlJ3MgYnl0ZSBvcmRlci48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT40PC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+VUlOVDMyPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGluIHRoZSBtZXNzYWdlJ3MgYnl0ZSBvcmRlci48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT40PC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+SU5UNjQ8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+NjQtYml0IHNpZ25lZCBpbnRlZ2VyIGluIHRoZSBtZXNzYWdlJ3MgYnl0ZSBvcmRlci48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT44PC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+VUlOVDY0PC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGluIHRoZSBtZXNzYWdlJ3MgYnl0ZSBvcmRlci48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT44PC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+RE9VQkxFPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjY0LWJpdCBJRUVFIDc1NCBkb3VibGUgaW4gdGhlIG1lc3NhZ2UncyBieXRlIG9yZGVyLjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5Pjg8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5TVFJJTkc8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+QSA8bGl0ZXJhbD5VSU5UMzI8L2xpdGVyYWw+IGluZGljYXRpbmcgdGhlIHN0cmluZydzIAorICAgICAgICAgICAgICAgICAgbGVuZ3RoIGluIGJ5dGVzIGV4Y2x1ZGluZyBpdHMgdGVybWluYXRpbmcgbnVsLCBmb2xsb3dlZCBieSAKKyAgICAgICAgICAgICAgICAgIG5vbi1udWwgc3RyaW5nIGRhdGEgb2YgdGhlIGdpdmVuIGxlbmd0aCwgZm9sbG93ZWQgYnkgYSB0ZXJtaW5hdGluZyBudWwgCisgICAgICAgICAgICAgICAgICBieXRlLgorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgNCAoZm9yIHRoZSBsZW5ndGgpCisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+T0JKRUNUX1BBVEg8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+RXhhY3RseSB0aGUgc2FtZSBhcyA8bGl0ZXJhbD5TVFJJTkc8L2xpdGVyYWw+IGV4Y2VwdCB0aGUgCisgICAgICAgICAgICAgICAgICBjb250ZW50IG11c3QgYmUgYSB2YWxpZCBvYmplY3QgcGF0aCAoc2VlIGJlbG93KS4KKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgIDQgKGZvciB0aGUgbGVuZ3RoKQorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlNJR05BVFVSRTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5UaGUgc2FtZSBhcyA8bGl0ZXJhbD5TVFJJTkc8L2xpdGVyYWw+IGV4Y2VwdCB0aGUgbGVuZ3RoIGlzIGEgc2luZ2xlIAorICAgICAgICAgICAgICAgICAgYnl0ZSAodGh1cyBzaWduYXR1cmVzIGhhdmUgYSBtYXhpbXVtIGxlbmd0aCBvZiAyNTUpCisgICAgICAgICAgICAgICAgICBhbmQgdGhlIGNvbnRlbnQgbXVzdCBiZSBhIHZhbGlkIHNpZ25hdHVyZSAoc2VlIGJlbG93KS4KKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgIDEKKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5BUlJBWTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgIEEgPGxpdGVyYWw+VUlOVDMyPC9saXRlcmFsPiBnaXZpbmcgdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkgZGF0YSBpbiBieXRlcywgZm9sbG93ZWQgYnkgCisgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQgcGFkZGluZyB0byB0aGUgYWxpZ25tZW50IGJvdW5kYXJ5IG9mIHRoZSBhcnJheSBlbGVtZW50IHR5cGUsIAorICAgICAgICAgICAgICAgICAgZm9sbG93ZWQgYnkgZWFjaCBhcnJheSBlbGVtZW50LiBUaGUgYXJyYXkgbGVuZ3RoIGlzIGZyb20gdGhlIAorICAgICAgICAgICAgICAgICAgZW5kIG9mIHRoZSBhbGlnbm1lbnQgcGFkZGluZyB0byB0aGUgZW5kIG9mIHRoZSBsYXN0IGVsZW1lbnQsCisgICAgICAgICAgICAgICAgICBpLmUuIGl0IGRvZXMgbm90IGluY2x1ZGUgdGhlIHBhZGRpbmcgYWZ0ZXIgdGhlIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgIG9yIGFueSBwYWRkaW5nIGFmdGVyIHRoZSBsYXN0IGVsZW1lbnQuCisgICAgICAgICAgICAgICAgICBBcnJheXMgaGF2ZSBhIG1heGltdW0gbGVuZ3RoIGRlZmluZWQgdG8gYmUgMiB0byB0aGUgMjZ0aCBwb3dlciBvcgorICAgICAgICAgICAgICAgICAgNjcxMDg4NjQuIEltcGxlbWVudGF0aW9ucyBtdXN0IG5vdCBzZW5kIG9yIGFjY2VwdCBhcnJheXMgZXhjZWVkaW5nIHRoaXMKKyAgICAgICAgICAgICAgICAgIGxlbmd0aC4KKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgIDQgKGZvciB0aGUgbGVuZ3RoKQorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlNUUlVDVDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgIEEgc3RydWN0IG11c3Qgc3RhcnQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IHJlZ2FyZGxlc3Mgb2YgdGhlCisgICAgICAgICAgICAgICAgICB0eXBlIG9mIHRoZSBzdHJ1Y3QgZmllbGRzLiBUaGUgc3RydWN0IHZhbHVlIGNvbnNpc3RzIG9mIGVhY2gKKyAgICAgICAgICAgICAgICAgIGZpZWxkIG1hcnNoYWxlZCBpbiBzZXF1ZW5jZSBzdGFydGluZyBmcm9tIHRoYXQgOC1ieXRlCisgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQgYm91bmRhcnkuCisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICA4CisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKwkgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5WQVJJQU5UPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgQSB2YXJpYW50IHR5cGUgaGFzIGEgbWFyc2hhbGVkCisgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5TSUdOQVRVUkU8L2xpdGVyYWw+IGZvbGxvd2VkIGJ5IGEgbWFyc2hhbGVkCisgICAgICAgICAgICAgICAgICB2YWx1ZSB3aXRoIHRoZSB0eXBlIGdpdmVuIGluIHRoZSBzaWduYXR1cmUuICBVbmxpa2UKKyAgICAgICAgICAgICAgICAgIGEgbWVzc2FnZSBzaWduYXR1cmUsIHRoZSB2YXJpYW50IHNpZ25hdHVyZSBjYW4KKyAgICAgICAgICAgICAgICAgIGNvbnRhaW4gb25seSBhIHNpbmdsZSBjb21wbGV0ZSB0eXBlLiAgU28gImkiLCAiYWkiCisgICAgICAgICAgICAgICAgICBvciAiKGlpKSIgaXMgT0ssIGJ1dCAiaWkiIGlzIG5vdC4gIFVzZSBvZiB2YXJpYW50cyBtYXkgbm90CisgICAgICAgICAgICAgICAgICBjYXVzZSBhIHRvdGFsIG1lc3NhZ2UgZGVwdGggdG8gYmUgbGFyZ2VyIHRoYW4gNjQsIGluY2x1ZGluZworCQkgIG90aGVyIGNvbnRhaW5lciB0eXBlcyBzdWNoIGFzIHN0cnVjdHVyZXMuCisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAxIChhbGlnbm1lbnQgb2YgdGhlIHNpZ25hdHVyZSkKKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorCSAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPkRJQ1RfRU5UUlk8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICBJZGVudGljYWwgdG8gU1RSVUNULgorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgOAorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlVOSVhfRkQ8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MzItYml0IHVuc2lnbmVkIGludGVnZXIgaW4gdGhlIG1lc3NhZ2UncyBieXRlCisgICAgICAgICAgICAgICAgb3JkZXIuIFRoZSBhY3R1YWwgZmlsZSBkZXNjcmlwdG9ycyBuZWVkIHRvIGJlCisgICAgICAgICAgICAgICAgdHJhbnNmZXJyZWQgb3V0LW9mLWJhbmQgdmlhIHNvbWUgcGxhdGZvcm0gc3BlY2lmaWMKKyAgICAgICAgICAgICAgICBtZWNoYW5pc20uIE9uIHRoZSB3aXJlLCB2YWx1ZXMgb2YgdGhpcyB0eXBlIHN0b3JlIHRoZSBpbmRleCB0byB0aGUKKyAgICAgICAgICAgICAgICBmaWxlIGRlc2NyaXB0b3IgaW4gdGhlIGFycmF5IG9mIGZpbGUgZGVzY3JpcHRvcnMgdGhhdAorICAgICAgICAgICAgICAgIGFjY29tcGFueSB0aGUgbWVzc2FnZS48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT40PC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgIDwvcGFyYT4KKyAgICAgIAorICAgICAgPHNlY3QzIGlkPSJtZXNzYWdlLXByb3RvY29sLW1hcnNoYWxpbmctb2JqZWN0LXBhdGgiPgorICAgICAgICA8dGl0bGU+VmFsaWQgT2JqZWN0IFBhdGhzPC90aXRsZT4KKyAgICAgICAgCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFuIG9iamVjdCBwYXRoIGlzIGEgbmFtZSB1c2VkIHRvIHJlZmVyIHRvIGFuIG9iamVjdCBpbnN0YW5jZS4KKyAgICAgICAgICBDb25jZXB0dWFsbHksIGVhY2ggcGFydGljaXBhbnQgaW4gYSBELUJ1cyBtZXNzYWdlIGV4Y2hhbmdlIG1heSBoYXZlCisgICAgICAgICAgYW55IG51bWJlciBvZiBvYmplY3QgaW5zdGFuY2VzICh0aGluayBvZiBDKysgb3IgSmF2YSBvYmplY3RzKSBhbmQgZWFjaAorICAgICAgICAgIHN1Y2ggaW5zdGFuY2Ugd2lsbCBoYXZlIGEgcGF0aC4gTGlrZSBhIGZpbGVzeXN0ZW0sIHRoZSBvYmplY3QKKyAgICAgICAgICBpbnN0YW5jZXMgaW4gYW4gYXBwbGljYXRpb24gZm9ybSBhIGhpZXJhcmNoaWNhbCB0cmVlLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIAorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgZm9sbG93aW5nIHJ1bGVzIGRlZmluZSBhIHZhbGlkIG9iamVjdCBwYXRoLiBJbXBsZW1lbnRhdGlvbnMgbXVzdCAKKyAgICAgICAgICBub3Qgc2VuZCBvciBhY2NlcHQgbWVzc2FnZXMgd2l0aCBpbnZhbGlkIG9iamVjdCBwYXRocy4KKyAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgcGF0aCBtYXkgYmUgb2YgYW55IGxlbmd0aC4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIHBhdGggbXVzdCBiZWdpbiB3aXRoIGFuIEFTQ0lJICcvJyAoaW50ZWdlciA0NykgY2hhcmFjdGVyLCAKKyAgICAgICAgICAgICAgICBhbmQgbXVzdCBjb25zaXN0IG9mIGVsZW1lbnRzIHNlcGFyYXRlZCBieSBzbGFzaCBjaGFyYWN0ZXJzLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBFYWNoIGVsZW1lbnQgbXVzdCBvbmx5IGNvbnRhaW4gdGhlIEFTQ0lJIGNoYXJhY3RlcnMgCisgICAgICAgICAgICAgICAgIltBLVpdW2Etel1bMC05XV8iCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIE5vIGVsZW1lbnQgbWF5IGJlIHRoZSBlbXB0eSBzdHJpbmcuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIE11bHRpcGxlICcvJyBjaGFyYWN0ZXJzIGNhbm5vdCBvY2N1ciBpbiBzZXF1ZW5jZS4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQSB0cmFpbGluZyAnLycgY2hhcmFjdGVyIGlzIG5vdCBhbGxvd2VkIHVubGVzcyB0aGUgCisgICAgICAgICAgICAgICAgcGF0aCBpcyB0aGUgcm9vdCBwYXRoIChhIHNpbmdsZSAnLycgY2hhcmFjdGVyKS4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIE9iamVjdCBwYXRocyBhcmUgb2Z0ZW4gbmFtZXNwYWNlZCBieSBzdGFydGluZyB3aXRoIGEgcmV2ZXJzZWQKKyAgICAgICAgICBkb21haW4gbmFtZSBhbmQgY29udGFpbmluZyBhbiBpbnRlcmZhY2UgdmVyc2lvbiBudW1iZXIsIGluIHRoZQorICAgICAgICAgIHNhbWUgd2F5IGFzCisgICAgICAgICAgPGxpbmsgbGlua2VuZD0ibWVzc2FnZS1wcm90b2NvbC1uYW1lcy1pbnRlcmZhY2UiPmludGVyZmFjZQorICAgICAgICAgICAgbmFtZXM8L2xpbms+IGFuZAorICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9Im1lc3NhZ2UtcHJvdG9jb2wtbmFtZXMtYnVzIj53ZWxsLWtub3duCisgICAgICAgICAgICBidXMgbmFtZXM8L2xpbms+LgorICAgICAgICAgIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gaW1wbGVtZW50IG1vcmUgdGhhbiBvbmUgc2VydmljZSwgb3IKKyAgICAgICAgICBtb3JlIHRoYW4gb25lIHZlcnNpb24gb2YgYSBzZXJ2aWNlLCBpbiB0aGUgc2FtZSBwcm9jZXNzLAorICAgICAgICAgIGV2ZW4gaWYgdGhlIHNlcnZpY2VzIHNoYXJlIGEgY29ubmVjdGlvbiBidXQgY2Fubm90IG90aGVyd2lzZQorICAgICAgICAgIGNvLW9wZXJhdGUgKGZvciBpbnN0YW5jZSwgaWYgdGhleSBhcmUgaW1wbGVtZW50ZWQgYnkgZGlmZmVyZW50CisgICAgICAgICAgcGx1Z2lucykuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICBGb3IgaW5zdGFuY2UsIGlmIHRoZSBvd25lciBvZiA8bGl0ZXJhbD5leGFtcGxlLmNvbTwvbGl0ZXJhbD4gaXMKKyAgICAgICAgICBkZXZlbG9waW5nIGEgRC1CdXMgQVBJIGZvciBhIG11c2ljIHBsYXllciwgdGhleSBtaWdodCB1c2UgdGhlCisgICAgICAgICAgaGllcmFyY2h5IG9mIG9iamVjdCBwYXRocyB0aGF0IHN0YXJ0IHdpdGgKKyAgICAgICAgICA8bGl0ZXJhbD4vY29tL2V4YW1wbGUvTXVzaWNQbGF5ZXIxPC9saXRlcmFsPiBmb3IgaXRzIG9iamVjdHMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisKKyAgICAgIDxzZWN0MyBpZD0ibWVzc2FnZS1wcm90b2NvbC1tYXJzaGFsaW5nLXNpZ25hdHVyZSI+CisgICAgICAgIDx0aXRsZT5WYWxpZCBTaWduYXR1cmVzPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQW4gaW1wbGVtZW50YXRpb24gbXVzdCBub3Qgc2VuZCBvciBhY2NlcHQgaW52YWxpZCBzaWduYXR1cmVzLgorICAgICAgICAgIFZhbGlkIHNpZ25hdHVyZXMgd2lsbCBjb25mb3JtIHRvIHRoZSBmb2xsb3dpbmcgcnVsZXM6CisgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIHNpZ25hdHVyZSBlbmRzIHdpdGggYSBudWwgYnl0ZS4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIHNpZ25hdHVyZSBpcyBhIGxpc3Qgb2Ygc2luZ2xlIGNvbXBsZXRlIHR5cGVzLiAKKyAgICAgICAgICAgICAgICBBcnJheXMgbXVzdCBoYXZlIGVsZW1lbnQgdHlwZXMsIGFuZCBzdHJ1Y3RzIG11c3QgCisgICAgICAgICAgICAgICAgaGF2ZSBib3RoIG9wZW4gYW5kIGNsb3NlIHBhcmVudGhlc2VzLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBPbmx5IHR5cGUgY29kZXMgYW5kIG9wZW4gYW5kIGNsb3NlIHBhcmVudGhlc2VzIGFyZSAKKyAgICAgICAgICAgICAgICBhbGxvd2VkIGluIHRoZSBzaWduYXR1cmUuIFRoZSA8bGl0ZXJhbD5TVFJVQ1Q8L2xpdGVyYWw+IHR5cGUgY29kZQorICAgICAgICAgICAgICAgIGlzIG5vdCBhbGxvd2VkIGluIHNpZ25hdHVyZXMsIGJlY2F1c2UgcGFyZW50aGVzZXMKKyAgICAgICAgICAgICAgICBhcmUgdXNlZCBpbnN0ZWFkLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgbWF4aW11bSBkZXB0aCBvZiBjb250YWluZXIgdHlwZSBuZXN0aW5nIGlzIDMyIGFycmF5IHR5cGUKKyAgICAgICAgICAgICAgICBjb2RlcyBhbmQgMzIgb3BlbiBwYXJlbnRoZXNlcy4gVGhpcyBpbXBsaWVzIHRoYXQgdGhlIG1heGltdW0KKyAgICAgICAgICAgICAgICB0b3RhbCBkZXB0aCBvZiByZWN1cnNpb24gaXMgNjQsIGZvciBhbiAiYXJyYXkgb2YgYXJyYXkgb2YgYXJyYXkKKyAgICAgICAgICAgICAgICBvZiAuLi4gc3RydWN0IG9mIHN0cnVjdCBvZiBzdHJ1Y3Qgb2YgLi4uIiAgd2hlcmUgdGhlcmUgYXJlIDMyCisgICAgICAgICAgICAgICAgYXJyYXkgYW5kIDMyIHN0cnVjdC4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgc2lnbmF0dXJlIGlzIDI1NS4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgU2lnbmF0dXJlcyBtdXN0IGJlIG51bC10ZXJtaW5hdGVkLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgICAgCisgICAgPC9zZWN0Mj4KKworICA8L3NlY3QxPgorCisgIDxzZWN0MSBpZD0ibWVzc2FnZS1wcm90b2NvbCI+CisgICAgPHRpdGxlPk1lc3NhZ2UgUHJvdG9jb2w8L3RpdGxlPgorCisgICAgPHBhcmE+CisgICAgICBBIDxmaXJzdHRlcm0+bWVzc2FnZTwvZmlyc3R0ZXJtPiBjb25zaXN0cyBvZiBhCisgICAgICA8Zmlyc3R0ZXJtPmhlYWRlcjwvZmlyc3R0ZXJtPiBhbmQgYSA8Zmlyc3R0ZXJtPmJvZHk8L2ZpcnN0dGVybT4uIElmIHlvdQorICAgICAgdGhpbmsgb2YgYSBtZXNzYWdlIGFzIGEgcGFja2FnZSwgdGhlIGhlYWRlciBpcyB0aGUgYWRkcmVzcywgYW5kIHRoZSBib2R5CisgICAgICBjb250YWlucyB0aGUgcGFja2FnZSBjb250ZW50cy4gVGhlIG1lc3NhZ2UgZGVsaXZlcnkgc3lzdGVtIHVzZXMgdGhlIGhlYWRlcgorICAgICAgaW5mb3JtYXRpb24gdG8gZmlndXJlIG91dCB3aGVyZSB0byBzZW5kIHRoZSBtZXNzYWdlIGFuZCBob3cgdG8gaW50ZXJwcmV0CisgICAgICBpdDsgdGhlIHJlY2lwaWVudCBpbnRlcnByZXRzIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlLgorICAgIDwvcGFyYT4KKyAgICAKKyAgICA8cGFyYT4KKyAgICAgIFRoZSBib2R5IG9mIHRoZSBtZXNzYWdlIGlzIG1hZGUgdXAgb2YgemVybyBvciBtb3JlCisgICAgICA8Zmlyc3R0ZXJtPmFyZ3VtZW50czwvZmlyc3R0ZXJtPiwgd2hpY2ggYXJlIHR5cGVkIHZhbHVlcywgc3VjaCBhcyBhbgorICAgICAgaW50ZWdlciBvciBhIGJ5dGUgYXJyYXkuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBCb3RoIGhlYWRlciBhbmQgYm9keSB1c2UgdGhlIEQtQnVzIDxsaW5rIGxpbmtlbmQ9InR5cGUtc3lzdGVtIj50eXBlCisgICAgICAgIHN5c3RlbTwvbGluaz4gYW5kIGZvcm1hdCBmb3Igc2VyaWFsaXppbmcgZGF0YS4KKyAgICA8L3BhcmE+CisKKyAgICA8c2VjdDIgaWQ9Im1lc3NhZ2UtcHJvdG9jb2wtbWVzc2FnZXMiPgorICAgICAgPHRpdGxlPk1lc3NhZ2UgRm9ybWF0PC90aXRsZT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEEgbWVzc2FnZSBjb25zaXN0cyBvZiBhIGhlYWRlciBhbmQgYSBib2R5LiBUaGUgaGVhZGVyIGlzIGEgYmxvY2sgb2YKKyAgICAgICAgdmFsdWVzIHdpdGggYSBmaXhlZCBzaWduYXR1cmUgYW5kIG1lYW5pbmcuICBUaGUgYm9keSBpcyBhIHNlcGFyYXRlIGJsb2NrCisgICAgICAgIG9mIHZhbHVlcywgd2l0aCBhIHNpZ25hdHVyZSBzcGVjaWZpZWQgaW4gdGhlIGhlYWRlci4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIGhlYWRlciBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCwgYWxsb3dpbmcgdGhlIGJvZHkgdG8KKyAgICAgICAgYmVnaW4gb24gYW4gOC1ieXRlIGJvdW5kYXJ5IHdoZW4gc3RvcmluZyB0aGUgZW50aXJlIG1lc3NhZ2UgaW4gYSBzaW5nbGUKKyAgICAgICAgYnVmZmVyLiBJZiB0aGUgaGVhZGVyIGRvZXMgbm90IG5hdHVyYWxseSBlbmQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICAgICAgICB1cCB0byA3IGJ5dGVzIG9mIG51bC1pbml0aWFsaXplZCBhbGlnbm1lbnQgcGFkZGluZyBtdXN0IGJlIGFkZGVkLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIG1lc3NhZ2UgYm9keSBuZWVkIG5vdCBlbmQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgbWVzc2FnZSwgaW5jbHVkaW5nIGhlYWRlciwgaGVhZGVyIGFsaWdubWVudCBwYWRkaW5nLCAKKyAgICAgICAgYW5kIGJvZHkgaXMgMiB0byB0aGUgMjd0aCBwb3dlciBvciAxMzQyMTc3MjguIEltcGxlbWVudGF0aW9ucyBtdXN0IG5vdCAKKyAgICAgICAgc2VuZCBvciBhY2NlcHQgbWVzc2FnZXMgZXhjZWVkaW5nIHRoaXMgc2l6ZS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIAorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBzaWduYXR1cmUgb2YgdGhlIGhlYWRlciBpczoKKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICJ5eXl5dXVhKHl2KSIKKyAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgV3JpdHRlbiBvdXQgbW9yZSByZWFkYWJseSwgdGhpcyBpczoKKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgIEJZVEUsIEJZVEUsIEJZVEUsIEJZVEUsIFVJTlQzMiwgVUlOVDMyLCBBUlJBWSBvZiBTVFJVQ1Qgb2YgKEJZVEUsVkFSSUFOVCkKKyAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFRoZXNlIHZhbHVlcyBoYXZlIHRoZSBmb2xsb3dpbmcgbWVhbmluZ3M6CisgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgIDx0Z3JvdXAgY29scz0iMiI+CisgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PlZhbHVlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjFzdCA8bGl0ZXJhbD5CWVRFPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkVuZGlhbm5lc3MgZmxhZzsgQVNDSUkgJ2wnIGZvciBsaXR0bGUtZW5kaWFuIAorICAgICAgICAgICAgICAgICAgb3IgQVNDSUkgJ0InIGZvciBiaWctZW5kaWFuLiBCb3RoIGhlYWRlciBhbmQgYm9keSBhcmUgCisgICAgICAgICAgICAgICAgaW4gdGhpcyBlbmRpYW5uZXNzLjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT4ybmQgPGxpdGVyYWw+QllURTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT48Zmlyc3R0ZXJtPk1lc3NhZ2UgdHlwZTwvZmlyc3R0ZXJtPi4gVW5rbm93biB0eXBlcyBtdXN0IGJlIGlnbm9yZWQuIAorICAgICAgICAgICAgICAgICAgQ3VycmVudGx5LWRlZmluZWQgdHlwZXMgYXJlIGRlc2NyaWJlZCBiZWxvdy4KKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+M3JkIDxsaXRlcmFsPkJZVEU8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Qml0d2lzZSBPUiBvZiBmbGFncy4gVW5rbm93biBmbGFncworICAgICAgICAgICAgICAgICAgbXVzdCBiZSBpZ25vcmVkLiBDdXJyZW50bHktZGVmaW5lZCBmbGFncyBhcmUgZGVzY3JpYmVkIGJlbG93LgorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT40dGggPGxpdGVyYWw+QllURTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5NYWpvciBwcm90b2NvbCB2ZXJzaW9uIG9mIHRoZSBzZW5kaW5nIGFwcGxpY2F0aW9uLiAgSWYKKyAgICAgICAgICAgICAgICB0aGUgbWFqb3IgcHJvdG9jb2wgdmVyc2lvbiBvZiB0aGUgcmVjZWl2aW5nIGFwcGxpY2F0aW9uIGRvZXMgbm90CisgICAgICAgICAgICAgICAgbWF0Y2gsIHRoZSBhcHBsaWNhdGlvbnMgd2lsbCBub3QgYmUgYWJsZSB0byBjb21tdW5pY2F0ZSBhbmQgdGhlCisgICAgICAgICAgICAgICAgRC1CdXMgY29ubmVjdGlvbiBtdXN0IGJlIGRpc2Nvbm5lY3RlZC4gVGhlIG1ham9yIHByb3RvY29sCisgICAgICAgICAgICAgICAgdmVyc2lvbiBmb3IgdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uIGlzIDEuCisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjFzdCA8bGl0ZXJhbD5VSU5UMzI8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+TGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBtZXNzYWdlIGJvZHksIHN0YXJ0aW5nIAorICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgZW5kIG9mIHRoZSBoZWFkZXIuIFRoZSBoZWFkZXIgZW5kcyBhZnRlciAKKyAgICAgICAgICAgICAgICAgIGl0cyBhbGlnbm1lbnQgcGFkZGluZyB0byBhbiA4LWJvdW5kYXJ5LgorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT4ybmQgPGxpdGVyYWw+VUlOVDMyPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlRoZSBzZXJpYWwgb2YgdGhpcyBtZXNzYWdlLCB1c2VkIGFzIGEgY29va2llIAorICAgICAgICAgICAgICAgICAgYnkgdGhlIHNlbmRlciB0byBpZGVudGlmeSB0aGUgcmVwbHkgY29ycmVzcG9uZGluZworICAgICAgICAgICAgICAgICAgdG8gdGhpcyByZXF1ZXN0LiBUaGlzIG11c3Qgbm90IGJlIHplcm8uCisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+ICAgICAgCisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPkFSUkFZPC9saXRlcmFsPiBvZiA8bGl0ZXJhbD5TVFJVQ1Q8L2xpdGVyYWw+IG9mICg8bGl0ZXJhbD5CWVRFPC9saXRlcmFsPiw8bGl0ZXJhbD5WQVJJQU5UPC9saXRlcmFsPik8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5BbiBhcnJheSBvZiB6ZXJvIG9yIG1vcmUgPGZpcnN0dGVybT5oZWFkZXIKKyAgICAgICAgICAgICAgICAgIGZpZWxkczwvZmlyc3R0ZXJtPiB3aGVyZSB0aGUgYnl0ZSBpcyB0aGUgZmllbGQgY29kZSwgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgdmFyaWFudCBpcyB0aGUgZmllbGQgdmFsdWUuIFRoZSBtZXNzYWdlIHR5cGUgZGV0ZXJtaW5lcyAKKyAgICAgICAgICAgICAgICAgIHdoaWNoIGZpZWxkcyBhcmUgcmVxdWlyZWQuCisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgPGZpcnN0dGVybT5NZXNzYWdlIHR5cGVzPC9maXJzdHRlcm0+IHRoYXQgY2FuIGFwcGVhciBpbiB0aGUgc2Vjb25kIGJ5dGUKKyAgICAgICAgb2YgdGhlIGhlYWRlciBhcmU6CisgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PkNvbnZlbnRpb25hbCBuYW1lPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+RGVjaW1hbCB2YWx1ZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5JTlZBTElEPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5UaGlzIGlzIGFuIGludmFsaWQgdHlwZS48L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+TUVUSE9EX0NBTEw8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5Pk1ldGhvZCBjYWxsLjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5NRVRIT0RfUkVUVVJOPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjI8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5NZXRob2QgcmVwbHkgd2l0aCByZXR1cm5lZCBkYXRhLjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5FUlJPUjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4zPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+RXJyb3IgcmVwbHkuIElmIHRoZSBmaXJzdCBhcmd1bWVudCBleGlzdHMgYW5kIGlzIGEKKyAgICAgICAgICAgICAgICBzdHJpbmcsIGl0IGlzIGFuIGVycm9yIG1lc3NhZ2UuPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlNJR05BTDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT40PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+U2lnbmFsIGVtaXNzaW9uLjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEZsYWdzIHRoYXQgY2FuIGFwcGVhciBpbiB0aGUgdGhpcmQgYnl0ZSBvZiB0aGUgaGVhZGVyOgorICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5Db252ZW50aW9uYWwgbmFtZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkhleCB2YWx1ZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5OT19SRVBMWV9FWFBFQ1RFRDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4weDE8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5UaGlzIG1lc3NhZ2UgZG9lcyBub3QgZXhwZWN0IG1ldGhvZCByZXR1cm4gcmVwbGllcyBvcgorICAgICAgICAgICAgICAgIGVycm9yIHJlcGxpZXM7IHRoZSByZXBseSBjYW4gYmUgb21pdHRlZCBhcyBhbgorICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbi4gSG93ZXZlciwgaXQgaXMgY29tcGxpYW50IHdpdGggdGhpcyBzcGVjaWZpY2F0aW9uCisgICAgICAgICAgICAgICAgdG8gcmV0dXJuIHRoZSByZXBseSBkZXNwaXRlIHRoaXMgZmxhZyBhbmQgdGhlIG9ubHkgaGFybSAKKyAgICAgICAgICAgICAgICAgIGZyb20gZG9pbmcgc28gaXMgZXh0cmEgbmV0d29yayB0cmFmZmljLgorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5OT19BVVRPX1NUQVJUPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjB4MjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlRoZSBidXMgbXVzdCBub3QgbGF1bmNoIGFuIG93bmVyCisgICAgICAgICAgICAgICAgICBmb3IgdGhlIGRlc3RpbmF0aW9uIG5hbWUgaW4gcmVzcG9uc2UgdG8gdGhpcyBtZXNzYWdlLgorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgPC9wYXJhPgorCisgICAgICA8c2VjdDMgaWQ9Im1lc3NhZ2UtcHJvdG9jb2wtaGVhZGVyLWZpZWxkcyI+CisgICAgICAgIDx0aXRsZT5IZWFkZXIgRmllbGRzPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgYXJyYXkgYXQgdGhlIGVuZCBvZiB0aGUgaGVhZGVyIGNvbnRhaW5zIDxmaXJzdHRlcm0+aGVhZGVyCisgICAgICAgICAgZmllbGRzPC9maXJzdHRlcm0+LCB3aGVyZSBlYWNoIGZpZWxkIGlzIGEgMS1ieXRlIGZpZWxkIGNvZGUgZm9sbG93ZWQKKyAgICAgICAgICBieSBhIGZpZWxkIHZhbHVlLiBBIGhlYWRlciBtdXN0IGNvbnRhaW4gdGhlIHJlcXVpcmVkIGhlYWRlciBmaWVsZHMgZm9yCisgICAgICAgICAgaXRzIG1lc3NhZ2UgdHlwZSwgYW5kIHplcm8gb3IgbW9yZSBvZiBhbnkgb3B0aW9uYWwgaGVhZGVyCisgICAgICAgICAgZmllbGRzLiBGdXR1cmUgdmVyc2lvbnMgb2YgdGhpcyBwcm90b2NvbCBzcGVjaWZpY2F0aW9uIG1heSBhZGQgbmV3CisgICAgICAgICAgZmllbGRzLiBJbXBsZW1lbnRhdGlvbnMgbXVzdCBpZ25vcmUgZmllbGRzIHRoZXkgZG8gbm90CisgICAgICAgICAgdW5kZXJzdGFuZC4gSW1wbGVtZW50YXRpb25zIG11c3Qgbm90IGludmVudCB0aGVpciBvd24gaGVhZGVyIGZpZWxkczsKKyAgICAgICAgICBvbmx5IGNoYW5nZXMgdG8gdGhpcyBzcGVjaWZpY2F0aW9uIG1heSBpbnRyb2R1Y2UgbmV3IGhlYWRlciBmaWVsZHMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBZ2FpbiwgaWYgYW4gaW1wbGVtZW50YXRpb24gc2VlcyBhIGhlYWRlciBmaWVsZCBjb2RlIHRoYXQgaXQgZG9lcyBub3QKKyAgICAgICAgICBleHBlY3QsIGl0IG11c3QgaWdub3JlIHRoYXQgZmllbGQsIGFzIGl0IHdpbGwgYmUgcGFydCBvZiBhIG5ldworICAgICAgICAgIChidXQgY29tcGF0aWJsZSkgdmVyc2lvbiBvZiB0aGlzIHNwZWNpZmljYXRpb24uIFRoaXMgYWxzbyBhcHBsaWVzIAorICAgICAgICAgIHRvIGtub3duIGhlYWRlciBmaWVsZHMgYXBwZWFyaW5nIGluIHVuZXhwZWN0ZWQgbWVzc2FnZXMsIGZvciAKKyAgICAgICAgICBleGFtcGxlOiBpZiBhIHNpZ25hbCBoYXMgYSByZXBseSBzZXJpYWwgaXQgbXVzdCBiZSBpZ25vcmVkCisgICAgICAgICAgZXZlbiB0aG91Z2ggaXQgaGFzIG5vIG1lYW5pbmcgYXMgb2YgdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSG93ZXZlciwgaW1wbGVtZW50YXRpb25zIG11c3Qgbm90IHNlbmQgb3IgYWNjZXB0IGtub3duIGhlYWRlciBmaWVsZHMKKyAgICAgICAgICB3aXRoIHRoZSB3cm9uZyB0eXBlIHN0b3JlZCBpbiB0aGUgZmllbGQgdmFsdWUuIFNvIGZvciBleGFtcGxlIGEKKyAgICAgICAgICBtZXNzYWdlIHdpdGggYW4gPGxpdGVyYWw+SU5URVJGQUNFPC9saXRlcmFsPiBmaWVsZCBvZiB0eXBlCisgICAgICAgICAgPGxpdGVyYWw+VUlOVDMyPC9saXRlcmFsPiB3b3VsZCBiZSBjb25zaWRlcmVkIGNvcnJ1cHQuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICBIZXJlIGFyZSB0aGUgY3VycmVudGx5LWRlZmluZWQgaGVhZGVyIGZpZWxkczoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iNSI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkNvbnZlbnRpb25hbCBOYW1lPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZWNpbWFsIENvZGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlJlcXVpcmVkIEluPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPklOVkFMSUQ8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5OL0E8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pm5vdCBhbGxvd2VkPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Ob3QgYSB2YWxpZCBmaWVsZCBuYW1lIChlcnJvciBpZiBpdCBhcHBlYXJzIGluIGEgbWVzc2FnZSk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+UEFUSDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjE8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPk9CSkVDVF9QQVRIPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+TUVUSE9EX0NBTEw8L2xpdGVyYWw+LCA8bGl0ZXJhbD5TSUdOQUw8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UaGUgb2JqZWN0IHRvIHNlbmQgYSBjYWxsIHRvLAorICAgICAgICAgICAgICAgICAgICBvciB0aGUgb2JqZWN0IGEgc2lnbmFsIGlzIGVtaXR0ZWQgZnJvbS4KKyAgICAgICAgICAgICAgICAgICAgVGhlIHNwZWNpYWwgcGF0aAorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD4vb3JnL2ZyZWVkZXNrdG9wL0RCdXMvTG9jYWw8L2xpdGVyYWw+IGlzIHJlc2VydmVkOworICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIG5vdCBzZW5kIG1lc3NhZ2VzIHdpdGggdGhpcyBwYXRoLAorICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYnVzIGRhZW1vbiB3aWxsCisgICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3QgYW55IGFwcGxpY2F0aW9uIHRoYXQgYXR0ZW1wdHMgdG8gZG8gc28uCisgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+SU5URVJGQUNFPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+U1RSSU5HPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+U0lHTkFMPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgIFRoZSBpbnRlcmZhY2UgdG8gaW52b2tlIGEgbWV0aG9kIGNhbGwgb24sIG9yIAorICAgICAgICAgICAgICAgICAgICB0aGF0IGEgc2lnbmFsIGlzIGVtaXR0ZWQgZnJvbS4gT3B0aW9uYWwgZm9yIAorICAgICAgICAgICAgICAgICAgICBtZXRob2QgY2FsbHMsIHJlcXVpcmVkIGZvciBzaWduYWxzLgorICAgICAgICAgICAgICAgICAgICBUaGUgc3BlY2lhbCBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuTG9jYWw8L2xpdGVyYWw+IGlzIHJlc2VydmVkOworICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIG5vdCBzZW5kIG1lc3NhZ2VzIHdpdGggdGhpcworICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UsIGFuZCB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBidXMKKyAgICAgICAgICAgICAgICAgICAgZGFlbW9uIHdpbGwgZGlzY29ubmVjdCBhbnkgYXBwbGljYXRpb24gdGhhdCBhdHRlbXB0cyB0bworICAgICAgICAgICAgICAgICAgICBkbyBzby4KKyAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5NRU1CRVI8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4zPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5TVFJJTkc8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5NRVRIT0RfQ0FMTDwvbGl0ZXJhbD4sIDxsaXRlcmFsPlNJR05BTDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlRoZSBtZW1iZXIsIGVpdGhlciB0aGUgbWV0aG9kIG5hbWUgb3Igc2lnbmFsIG5hbWUuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPkVSUk9SX05BTUU8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT40PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5TVFJJTkc8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5FUlJPUjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlRoZSBuYW1lIG9mIHRoZSBlcnJvciB0aGF0IG9jY3VycmVkLCBmb3IgZXJyb3JzPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlJFUExZX1NFUklBTDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlVJTlQzMjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPkVSUk9SPC9saXRlcmFsPiwgPGxpdGVyYWw+TUVUSE9EX1JFVFVSTjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlRoZSBzZXJpYWwgbnVtYmVyIG9mIHRoZSBtZXNzYWdlIHRoaXMgbWVzc2FnZSBpcyBhIHJlcGx5CisgICAgICAgICAgICAgICAgICAgIHRvLiAoVGhlIHNlcmlhbCBudW1iZXIgaXMgdGhlIHNlY29uZCA8bGl0ZXJhbD5VSU5UMzI8L2xpdGVyYWw+IGluIHRoZSBoZWFkZXIuKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5ERVNUSU5BVElPTjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjY8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlNUUklORzwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pm9wdGlvbmFsPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UaGUgbmFtZSBvZiB0aGUgY29ubmVjdGlvbiB0aGlzIG1lc3NhZ2UgaXMgaW50ZW5kZWQgZm9yLgorICAgICAgICAgICAgICAgICAgICBPbmx5IHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgbWVzc2FnZSBidXMsIHNlZSAKKyAgICAgICAgICAgICAgICAgICAgPHhyZWYgbGlua2VuZD0ibWVzc2FnZS1idXMiLz4uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlNFTkRFUjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pjc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlNUUklORzwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pm9wdGlvbmFsPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5VbmlxdWUgbmFtZSBvZiB0aGUgc2VuZGluZyBjb25uZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICBUaGUgbWVzc2FnZSBidXMgZmlsbHMgaW4gdGhpcyBmaWVsZCBzbyBpdCBpcyByZWxpYWJsZTsgdGhlIGZpZWxkIGlzCisgICAgICAgICAgICAgICAgICAgIG9ubHkgbWVhbmluZ2Z1bCBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBtZXNzYWdlIGJ1cy48L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+U0lHTkFUVVJFPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+ODwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+U0lHTkFUVVJFPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+b3B0aW9uYWw8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlRoZSBzaWduYXR1cmUgb2YgdGhlIG1lc3NhZ2UgYm9keS4KKyAgICAgICAgICAgICAgICAgIElmIG9taXR0ZWQsIGl0IGlzIGFzc3VtZWQgdG8gYmUgdGhlIAorICAgICAgICAgICAgICAgICAgZW1wdHkgc2lnbmF0dXJlICIiIChpLmUuIHRoZSBib2R5IG11c3QgYmUgMC1sZW5ndGgpLjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5VTklYX0ZEUzwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pjk8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlVJTlQzMjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pm9wdGlvbmFsPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UaGUgbnVtYmVyIG9mIFVuaXggZmlsZSBkZXNjcmlwdG9ycyB0aGF0CisgICAgICAgICAgICAgICAgICBhY2NvbXBhbnkgdGhlIG1lc3NhZ2UuICBJZiBvbWl0dGVkLCBpdCBpcyBhc3N1bWVkCisgICAgICAgICAgICAgICAgICB0aGF0IG5vIFVuaXggZmlsZSBkZXNjcmlwdG9ycyBhY2NvbXBhbnkgdGhlCisgICAgICAgICAgICAgICAgICBtZXNzYWdlLiBUaGUgYWN0dWFsIGZpbGUgZGVzY3JpcHRvcnMgbmVlZCB0byBiZQorICAgICAgICAgICAgICAgICAgdHJhbnNmZXJyZWQgdmlhIHBsYXRmb3JtIHNwZWNpZmljIG1lY2hhbmlzbQorICAgICAgICAgICAgICAgICAgb3V0LW9mLWJhbmQuIFRoZXkgbXVzdCBiZSBzZW50IGF0IHRoZSBzYW1lIHRpbWUgYXMKKyAgICAgICAgICAgICAgICAgIHBhcnQgb2YgdGhlIG1lc3NhZ2UgaXRzZWxmLiBUaGV5IG1heSBub3QgYmUgc2VudAorICAgICAgICAgICAgICAgICAgYmVmb3JlIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBtZXNzYWdlIGl0c2VsZiBpcworICAgICAgICAgICAgICAgICAgdHJhbnNmZXJyZWQgb3IgYWZ0ZXIgdGhlIGxhc3QgYnl0ZSBvZiB0aGUgbWVzc2FnZQorICAgICAgICAgICAgICAgICAgaXRzZWxmLjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0MiBpZD0ibWVzc2FnZS1wcm90b2NvbC1uYW1lcyI+CisgICAgICA8dGl0bGU+VmFsaWQgTmFtZXM8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSB2YXJpb3VzIG5hbWVzIGluIEQtQnVzIG1lc3NhZ2VzIGhhdmUgc29tZSByZXN0cmljdGlvbnMuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlcmUgaXMgYSA8Zmlyc3R0ZXJtPm1heGltdW0gbmFtZSBsZW5ndGg8L2ZpcnN0dGVybT4gCisgICAgICAgIG9mIDI1NSB3aGljaCBhcHBsaWVzIHRvIGJ1cyBuYW1lcywgaW50ZXJmYWNlcywgYW5kIG1lbWJlcnMuIAorICAgICAgPC9wYXJhPgorICAgICAgPHNlY3QzIGlkPSJtZXNzYWdlLXByb3RvY29sLW5hbWVzLWludGVyZmFjZSI+CisgICAgICAgIDx0aXRsZT5JbnRlcmZhY2UgbmFtZXM8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBJbnRlcmZhY2VzIGhhdmUgbmFtZXMgd2l0aCB0eXBlIDxsaXRlcmFsPlNUUklORzwvbGl0ZXJhbD4sIG1lYW5pbmcgdGhhdCAKKyAgICAgICAgICB0aGV5IG11c3QgYmUgdmFsaWQgVVRGLTguIEhvd2V2ZXIsIHRoZXJlIGFyZSBhbHNvIHNvbWUgCisgICAgICAgICAgYWRkaXRpb25hbCByZXN0cmljdGlvbnMgdGhhdCBhcHBseSB0byBpbnRlcmZhY2UgbmFtZXMgCisgICAgICAgICAgc3BlY2lmaWNhbGx5OgorICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+SW50ZXJmYWNlIG5hbWVzIGFyZSBjb21wb3NlZCBvZiAxIG9yIG1vcmUgZWxlbWVudHMgc2VwYXJhdGVkIGJ5CisgICAgICAgICAgICAgICAgYSBwZXJpb2QgKCcuJykgY2hhcmFjdGVyLiBBbGwgZWxlbWVudHMgbXVzdCBjb250YWluIGF0IGxlYXN0IAorICAgICAgICAgICAgICAgIG9uZSBjaGFyYWN0ZXIuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5FYWNoIGVsZW1lbnQgbXVzdCBvbmx5IGNvbnRhaW4gdGhlIEFTQ0lJIGNoYXJhY3RlcnMgCisgICAgICAgICAgICAgICAgIltBLVpdW2Etel1bMC05XV8iIGFuZCBtdXN0IG5vdCBiZWdpbiB3aXRoIGEgZGlnaXQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKworCSAgICA8bGlzdGl0ZW0+PHBhcmE+SW50ZXJmYWNlIG5hbWVzIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgJy4nIChwZXJpb2QpCisgICAgICAgICAgICAgIGNoYXJhY3RlciAoYW5kIHRodXMgYXQgbGVhc3QgdHdvIGVsZW1lbnRzKS4KKyAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisKKwkgICAgPGxpc3RpdGVtPjxwYXJhPkludGVyZmFjZSBuYW1lcyBtdXN0IG5vdCBiZWdpbiB3aXRoIGEgJy4nIChwZXJpb2QpIGNoYXJhY3Rlci48L3BhcmE+PC9saXN0aXRlbT4KKwkgICAgPGxpc3RpdGVtPjxwYXJhPkludGVyZmFjZSBuYW1lcyBtdXN0IG5vdCBleGNlZWQgdGhlIG1heGltdW0gbmFtZSBsZW5ndGguPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICBJbnRlcmZhY2UgbmFtZXMgc2hvdWxkIHN0YXJ0IHdpdGggdGhlIHJldmVyc2VkIEROUyBkb21haW4gbmFtZSBvZgorICAgICAgICAgIHRoZSBhdXRob3Igb2YgdGhlIGludGVyZmFjZSAoaW4gbG93ZXItY2FzZSksIGxpa2UgaW50ZXJmYWNlIG5hbWVzCisgICAgICAgICAgaW4gSmF2YS4gSXQgaXMgY29udmVudGlvbmFsIGZvciB0aGUgcmVzdCBvZiB0aGUgaW50ZXJmYWNlIG5hbWUKKyAgICAgICAgICB0byBjb25zaXN0IG9mIHdvcmRzIHJ1biB0b2dldGhlciwgd2l0aCBpbml0aWFsIGNhcGl0YWwgbGV0dGVycworICAgICAgICAgIG9uIGFsbCB3b3JkcyAoIkNhbWVsQ2FzZSIpLiBTZXZlcmFsIGxldmVscyBvZiBoaWVyYXJjaHkgY2FuIGJlIHVzZWQuCisgICAgICAgICAgSXQgaXMgYWxzbyBhIGdvb2QgaWRlYSB0byBpbmNsdWRlIHRoZSBtYWpvciB2ZXJzaW9uIG9mIHRoZSBpbnRlcmZhY2UKKyAgICAgICAgICBpbiB0aGUgbmFtZSwgYW5kIGluY3JlbWVudCBpdCBpZiBpbmNvbXBhdGlibGUgY2hhbmdlcyBhcmUgbWFkZTsKKyAgICAgICAgICB0aGlzIHdheSwgYSBzaW5nbGUgb2JqZWN0IGNhbiBpbXBsZW1lbnQgc2V2ZXJhbCB2ZXJzaW9ucyBvZiBhbgorICAgICAgICAgIGludGVyZmFjZSBpbiBwYXJhbGxlbCwgaWYgbmVjZXNzYXJ5LgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRm9yIGluc3RhbmNlLCBpZiB0aGUgb3duZXIgb2YgPGxpdGVyYWw+ZXhhbXBsZS5jb208L2xpdGVyYWw+IGlzCisgICAgICAgICAgZGV2ZWxvcGluZyBhIEQtQnVzIEFQSSBmb3IgYSBtdXNpYyBwbGF5ZXIsIHRoZXkgbWlnaHQgZGVmaW5lCisgICAgICAgICAgaW50ZXJmYWNlcyBjYWxsZWQgPGxpdGVyYWw+Y29tLmV4YW1wbGUuTXVzaWNQbGF5ZXIxPC9saXRlcmFsPiwKKyAgICAgICAgICA8bGl0ZXJhbD5jb20uZXhhbXBsZS5NdXNpY1BsYXllcjEuVHJhY2s8L2xpdGVyYWw+IGFuZAorICAgICAgICAgIDxsaXRlcmFsPmNvbS5leGFtcGxlLk11c2ljUGxheWVyMS5TZWVrYWJsZTwvbGl0ZXJhbD4uCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICBELUJ1cyBkb2VzIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSBjb25jZXB0cyB0aGF0IHdvdWxkIGJlCisgICAgICAgICAgY2FsbGVkIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgaW4gSmF2YTogZWl0aGVyIGNhbiBiZSBpZGVudGlmaWVkIG9uCisgICAgICAgICAgRC1CdXMgYnkgYW4gaW50ZXJmYWNlIG5hbWUuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgICA8c2VjdDMgaWQ9Im1lc3NhZ2UtcHJvdG9jb2wtbmFtZXMtYnVzIj4KKyAgICAgICAgPHRpdGxlPkJ1cyBuYW1lczwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIENvbm5lY3Rpb25zIGhhdmUgb25lIG9yIG1vcmUgYnVzIG5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGVtLgorICAgICAgICAgIEEgY29ubmVjdGlvbiBoYXMgZXhhY3RseSBvbmUgYnVzIG5hbWUgdGhhdCBpcyBhIDxmaXJzdHRlcm0+dW5pcXVlCisgICAgICAgICAgICBjb25uZWN0aW9uIG5hbWU8L2ZpcnN0dGVybT4uIFRoZSB1bmlxdWUgY29ubmVjdGlvbiBuYW1lIHJlbWFpbnMKKyAgICAgICAgICB3aXRoIHRoZSBjb25uZWN0aW9uIGZvciBpdHMgZW50aXJlIGxpZmV0aW1lLgorICAgICAgICAgIEEgYnVzIG5hbWUgaXMgb2YgdHlwZSA8bGl0ZXJhbD5TVFJJTkc8L2xpdGVyYWw+LAorICAgICAgICAgIG1lYW5pbmcgdGhhdCBpdCBtdXN0IGJlIHZhbGlkIFVURi04LiBIb3dldmVyLCB0aGVyZSBhcmUgYWxzbworICAgICAgICAgIHNvbWUgYWRkaXRpb25hbCByZXN0cmljdGlvbnMgdGhhdCBhcHBseSB0byBidXMgbmFtZXMgCisgICAgICAgICAgc3BlY2lmaWNhbGx5OgorICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+QnVzIG5hbWVzIHRoYXQgc3RhcnQgd2l0aCBhIGNvbG9uICgnOicpCisgICAgICAgICAgICAgICAgY2hhcmFjdGVyIGFyZSB1bmlxdWUgY29ubmVjdGlvbiBuYW1lcy4gT3RoZXIgYnVzIG5hbWVzCisgICAgICAgICAgICAgICAgYXJlIGNhbGxlZCA8Zmlyc3R0ZXJtPndlbGwta25vd24gYnVzIG5hbWVzPC9maXJzdHRlcm0+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+QnVzIG5hbWVzIGFyZSBjb21wb3NlZCBvZiAxIG9yIG1vcmUgZWxlbWVudHMgc2VwYXJhdGVkIGJ5CisgICAgICAgICAgICAgICAgYSBwZXJpb2QgKCcuJykgY2hhcmFjdGVyLiBBbGwgZWxlbWVudHMgbXVzdCBjb250YWluIGF0IGxlYXN0IAorICAgICAgICAgICAgICAgIG9uZSBjaGFyYWN0ZXIuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5FYWNoIGVsZW1lbnQgbXVzdCBvbmx5IGNvbnRhaW4gdGhlIEFTQ0lJIGNoYXJhY3RlcnMgCisgICAgICAgICAgICAgICAgIltBLVpdW2Etel1bMC05XV8tIi4gT25seSBlbGVtZW50cyB0aGF0IGFyZSBwYXJ0IG9mIGEgdW5pcXVlCisgICAgICAgICAgICAgICAgY29ubmVjdGlvbiBuYW1lIG1heSBiZWdpbiB3aXRoIGEgZGlnaXQsIGVsZW1lbnRzIGluCisgICAgICAgICAgICAgICAgb3RoZXIgYnVzIG5hbWVzIG11c3Qgbm90IGJlZ2luIHdpdGggYSBkaWdpdC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisJICAgIDxsaXN0aXRlbT48cGFyYT5CdXMgbmFtZXMgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSAnLicgKHBlcmlvZCkKKyAgICAgICAgICAgICAgY2hhcmFjdGVyIChhbmQgdGh1cyBhdCBsZWFzdCB0d28gZWxlbWVudHMpLgorICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKworCSAgICA8bGlzdGl0ZW0+PHBhcmE+QnVzIG5hbWVzIG11c3Qgbm90IGJlZ2luIHdpdGggYSAnLicgKHBlcmlvZCkgY2hhcmFjdGVyLjwvcGFyYT48L2xpc3RpdGVtPgorCSAgICA8bGlzdGl0ZW0+PHBhcmE+QnVzIG5hbWVzIG11c3Qgbm90IGV4Y2VlZCB0aGUgbWF4aW11bSBuYW1lIGxlbmd0aC48L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBOb3RlIHRoYXQgdGhlIGh5cGhlbiAoJy0nKSBjaGFyYWN0ZXIgaXMgYWxsb3dlZCBpbiBidXMgbmFtZXMgYnV0CisgICAgICAgICAgbm90IGluIGludGVyZmFjZSBuYW1lcy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIExpa2UgPGxpbmsgbGlua2VuZD0ibWVzc2FnZS1wcm90b2NvbC1uYW1lcy1pbnRlcmZhY2UiPmludGVyZmFjZQorICAgICAgICAgICAgbmFtZXM8L2xpbms+LCB3ZWxsLWtub3duIGJ1cyBuYW1lcyBzaG91bGQgc3RhcnQgd2l0aCB0aGUKKyAgICAgICAgICByZXZlcnNlZCBETlMgZG9tYWluIG5hbWUgb2YgdGhlIGF1dGhvciBvZiB0aGUgaW50ZXJmYWNlIChpbgorICAgICAgICAgIGxvd2VyLWNhc2UpLCBhbmQgaXQgaXMgY29udmVudGlvbmFsIGZvciB0aGUgcmVzdCBvZiB0aGUgd2VsbC1rbm93bgorICAgICAgICAgIGJ1cyBuYW1lIHRvIGNvbnNpc3Qgb2Ygd29yZHMgcnVuIHRvZ2V0aGVyLCB3aXRoIGluaXRpYWwKKyAgICAgICAgICBjYXBpdGFsIGxldHRlcnMuIEFzIHdpdGggaW50ZXJmYWNlIG5hbWVzLCBpbmNsdWRpbmcgYSB2ZXJzaW9uCisgICAgICAgICAgbnVtYmVyIGluIHdlbGwta25vd24gYnVzIG5hbWVzIGlzIGEgZ29vZCBpZGVhOyBpdCdzIHBvc3NpYmxlIHRvCisgICAgICAgICAgaGF2ZSB0aGUgd2VsbC1rbm93biBidXMgbmFtZSBmb3IgbW9yZSB0aGFuIG9uZSB2ZXJzaW9uCisgICAgICAgICAgc2ltdWx0YW5lb3VzbHkgaWYgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaXMgcmVxdWlyZWQuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICBJZiBhIHdlbGwta25vd24gYnVzIG5hbWUgaW1wbGllcyB0aGUgcHJlc2VuY2Ugb2YgYSAibWFpbiIgaW50ZXJmYWNlLAorICAgICAgICAgIHRoYXQgIm1haW4iIGludGVyZmFjZSBpcyBvZnRlbiBnaXZlbiB0aGUgc2FtZSBuYW1lIGFzCisgICAgICAgICAgdGhlIHdlbGwta25vd24gYnVzIG5hbWUsIGFuZCBzaXR1YXRlZCBhdCB0aGUgY29ycmVzcG9uZGluZyBvYmplY3QKKyAgICAgICAgICBwYXRoLiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBvd25lciBvZiA8bGl0ZXJhbD5leGFtcGxlLmNvbTwvbGl0ZXJhbD4KKyAgICAgICAgICBpcyBkZXZlbG9waW5nIGEgRC1CdXMgQVBJIGZvciBhIG11c2ljIHBsYXllciwgdGhleSBtaWdodCBkZWZpbmUKKyAgICAgICAgICB0aGF0IGFueSBhcHBsaWNhdGlvbiB0aGF0IHRha2VzIHRoZSB3ZWxsLWtub3duIG5hbWUKKyAgICAgICAgICA8bGl0ZXJhbD5jb20uZXhhbXBsZS5NdXNpY1BsYXllcjE8L2xpdGVyYWw+IHNob3VsZCBoYXZlIGFuIG9iamVjdAorICAgICAgICAgIGF0IHRoZSBvYmplY3QgcGF0aCA8bGl0ZXJhbD4vY29tL2V4YW1wbGUvTXVzaWNQbGF5ZXIxPC9saXRlcmFsPgorICAgICAgICAgIHdoaWNoIGltcGxlbWVudHMgdGhlIGludGVyZmFjZQorICAgICAgICAgIDxsaXRlcmFsPmNvbS5leGFtcGxlLk11c2ljUGxheWVyMTwvbGl0ZXJhbD4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgICA8c2VjdDMgaWQ9Im1lc3NhZ2UtcHJvdG9jb2wtbmFtZXMtbWVtYmVyIj4KKyAgICAgICAgPHRpdGxlPk1lbWJlciBuYW1lczwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIE1lbWJlciAoaS5lLiBtZXRob2Qgb3Igc2lnbmFsKSBuYW1lczoKKyAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorCSAgICA8bGlzdGl0ZW0+PHBhcmE+TXVzdCBvbmx5IGNvbnRhaW4gdGhlIEFTQ0lJIGNoYXJhY3RlcnMKKyAgICAgICAgICAgICAgICAiW0EtWl1bYS16XVswLTldXyIgYW5kIG1heSBub3QgYmVnaW4gd2l0aCBhCisgICAgICAgICAgICAgICAgZGlnaXQuPC9wYXJhPjwvbGlzdGl0ZW0+CisJICAgIDxsaXN0aXRlbT48cGFyYT5NdXN0IG5vdCBjb250YWluIHRoZSAnLicgKHBlcmlvZCkgY2hhcmFjdGVyLjwvcGFyYT48L2xpc3RpdGVtPgorCSAgICA8bGlzdGl0ZW0+PHBhcmE+TXVzdCBub3QgZXhjZWVkIHRoZSBtYXhpbXVtIG5hbWUgbGVuZ3RoLjwvcGFyYT48L2xpc3RpdGVtPgorCSAgICA8bGlzdGl0ZW0+PHBhcmE+TXVzdCBiZSBhdCBsZWFzdCAxIGJ5dGUgaW4gbGVuZ3RoLjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSXQgaXMgY29udmVudGlvbmFsIGZvciBtZW1iZXIgbmFtZXMgb24gRC1CdXMgdG8gY29uc2lzdCBvZgorICAgICAgICAgIGNhcGl0YWxpemVkIHdvcmRzIHdpdGggbm8gcHVuY3R1YXRpb24gKCJjYW1lbC1jYXNlIikuCisgICAgICAgICAgTWV0aG9kIG5hbWVzIHNob3VsZCB1c3VhbGx5IGJlIHZlcmJzLCBzdWNoIGFzCisgICAgICAgICAgPGxpdGVyYWw+R2V0SXRlbXM8L2xpdGVyYWw+LCBhbmQgc2lnbmFsIG5hbWVzIHNob3VsZCB1c3VhbGx5IGJlCisgICAgICAgICAgYSBkZXNjcmlwdGlvbiBvZiBhbiBldmVudCwgc3VjaCBhcyA8bGl0ZXJhbD5JdGVtc0NoYW5nZWQ8L2xpdGVyYWw+LgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgICAgPHNlY3QzIGlkPSJtZXNzYWdlLXByb3RvY29sLW5hbWVzLWVycm9yIj4KKyAgICAgICAgPHRpdGxlPkVycm9yIG5hbWVzPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRXJyb3IgbmFtZXMgaGF2ZSB0aGUgc2FtZSByZXN0cmljdGlvbnMgYXMgaW50ZXJmYWNlIG5hbWVzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRXJyb3IgbmFtZXMgaGF2ZSB0aGUgc2FtZSBuYW1pbmcgY29udmVudGlvbnMgYXMgaW50ZXJmYWNlCisgICAgICAgICAgbmFtZXMsIGFuZCBvZnRlbiBjb250YWluIDxsaXRlcmFsPi5FcnJvci48L2xpdGVyYWw+OyBmb3IgaW5zdGFuY2UsCisgICAgICAgICAgdGhlIG93bmVyIG9mIDxsaXRlcmFsPmV4YW1wbGUuY29tPC9saXRlcmFsPiBtaWdodCBkZWZpbmUgdGhlCisgICAgICAgICAgZXJyb3JzIDxsaXRlcmFsPmNvbS5leGFtcGxlLk11c2ljUGxheWVyLkVycm9yLkZpbGVOb3RGb3VuZDwvbGl0ZXJhbD4KKyAgICAgICAgICBhbmQgPGxpdGVyYWw+Y29tLmV4YW1wbGUuTXVzaWNQbGF5ZXIuRXJyb3IuT3V0T2ZNZW1vcnk8L2xpdGVyYWw+LgorICAgICAgICAgIFRoZSBlcnJvcnMgZGVmaW5lZCBieSBELUJ1cyBpdHNlbGYsIHN1Y2ggYXMKKyAgICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5GYWlsZWQ8L2xpdGVyYWw+LCBmb2xsb3cgYQorICAgICAgICAgIHNpbWlsYXIgcGF0dGVybi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKyAgICA8L3NlY3QyPgorCisgICAgPHNlY3QyIGlkPSJtZXNzYWdlLXByb3RvY29sLXR5cGVzIj4KKyAgICAgIDx0aXRsZT5NZXNzYWdlIFR5cGVzPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBFYWNoIG9mIHRoZSBtZXNzYWdlIHR5cGVzICg8bGl0ZXJhbD5NRVRIT0RfQ0FMTDwvbGl0ZXJhbD4sIDxsaXRlcmFsPk1FVEhPRF9SRVRVUk48L2xpdGVyYWw+LCA8bGl0ZXJhbD5FUlJPUjwvbGl0ZXJhbD4sIGFuZAorICAgICAgICA8bGl0ZXJhbD5TSUdOQUw8L2xpdGVyYWw+KSBoYXMgaXRzIG93biBleHBlY3RlZCB1c2FnZSBjb252ZW50aW9ucyBhbmQgaGVhZGVyIGZpZWxkcy4KKyAgICAgICAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGVzZSBjb252ZW50aW9ucy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxzZWN0MyBpZD0ibWVzc2FnZS1wcm90b2NvbC10eXBlcy1tZXRob2QiPgorICAgICAgICA8dGl0bGU+TWV0aG9kIENhbGxzPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgU29tZSBtZXNzYWdlcyBpbnZva2UgYW4gb3BlcmF0aW9uIG9uIGEgcmVtb3RlIG9iamVjdC4gIFRoZXNlIGFyZQorICAgICAgICAgIGNhbGxlZCBtZXRob2QgY2FsbCBtZXNzYWdlcyBhbmQgaGF2ZSB0aGUgdHlwZSB0YWcgPGxpdGVyYWw+TUVUSE9EX0NBTEw8L2xpdGVyYWw+LiBTdWNoCisgICAgICAgICAgbWVzc2FnZXMgbWFwIG5hdHVyYWxseSB0byBtZXRob2RzIG9uIG9iamVjdHMgaW4gYSB0eXBpY2FsIHByb2dyYW0uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQSBtZXRob2QgY2FsbCBtZXNzYWdlIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSA8bGl0ZXJhbD5NRU1CRVI8L2xpdGVyYWw+IGhlYWRlciBmaWVsZAorICAgICAgICAgIGluZGljYXRpbmcgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZC4gT3B0aW9uYWxseSwgdGhlIG1lc3NhZ2UgaGFzIGFuCisgICAgICAgICAgPGxpdGVyYWw+SU5URVJGQUNFPC9saXRlcmFsPiBmaWVsZCBnaXZpbmcgdGhlIGludGVyZmFjZSB0aGUgbWV0aG9kIGlzIGEgcGFydCBvZi4gSW4gdGhlCisgICAgICAgICAgYWJzZW5jZSBvZiBhbiA8bGl0ZXJhbD5JTlRFUkZBQ0U8L2xpdGVyYWw+IGZpZWxkLCBpZiB0d28gaW50ZXJmYWNlcyBvbiB0aGUgc2FtZSBvYmplY3QgaGF2ZQorICAgICAgICAgIGEgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSwgaXQgaXMgdW5kZWZpbmVkIHdoaWNoIG9mIHRoZSB0d28gbWV0aG9kcworICAgICAgICAgIHdpbGwgYmUgaW52b2tlZC4gSW1wbGVtZW50YXRpb25zIG1heSBhbHNvIGNob29zZSB0byByZXR1cm4gYW4gZXJyb3IgaW4KKyAgICAgICAgICB0aGlzIGFtYmlndW91cyBjYXNlLiBIb3dldmVyLCBpZiBhIG1ldGhvZCBuYW1lIGlzIHVuaXF1ZQorICAgICAgICAgIGltcGxlbWVudGF0aW9ucyBtdXN0IG5vdCByZXF1aXJlIGFuIGludGVyZmFjZSBmaWVsZC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBNZXRob2QgY2FsbCBtZXNzYWdlcyBhbHNvIGluY2x1ZGUgYSA8bGl0ZXJhbD5QQVRIPC9saXRlcmFsPiBmaWVsZAorICAgICAgICAgIGluZGljYXRpbmcgdGhlIG9iamVjdCB0byBpbnZva2UgdGhlIG1ldGhvZCBvbi4gSWYgdGhlIGNhbGwgaXMgcGFzc2luZworICAgICAgICAgIHRocm91Z2ggYSBtZXNzYWdlIGJ1cywgdGhlIG1lc3NhZ2Ugd2lsbCBhbHNvIGhhdmUgYQorICAgICAgICAgIDxsaXRlcmFsPkRFU1RJTkFUSU9OPC9saXRlcmFsPiBmaWVsZCBnaXZpbmcgdGhlIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24KKyAgICAgICAgICB0byByZWNlaXZlIHRoZSBtZXNzYWdlLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFdoZW4gYW4gYXBwbGljYXRpb24gaGFuZGxlcyBhIG1ldGhvZCBjYWxsIG1lc3NhZ2UsIGl0IGlzIHJlcXVpcmVkIHRvCisgICAgICAgICAgcmV0dXJuIGEgcmVwbHkuIFRoZSByZXBseSBpcyBpZGVudGlmaWVkIGJ5IGEgPGxpdGVyYWw+UkVQTFlfU0VSSUFMPC9saXRlcmFsPiBoZWFkZXIgZmllbGQKKyAgICAgICAgICBpbmRpY2F0aW5nIHRoZSBzZXJpYWwgbnVtYmVyIG9mIHRoZSA8bGl0ZXJhbD5NRVRIT0RfQ0FMTDwvbGl0ZXJhbD4gYmVpbmcgcmVwbGllZCB0by4gVGhlCisgICAgICAgICAgcmVwbHkgY2FuIGhhdmUgb25lIG9mIHR3byB0eXBlczsgZWl0aGVyIDxsaXRlcmFsPk1FVEhPRF9SRVRVUk48L2xpdGVyYWw+IG9yIDxsaXRlcmFsPkVSUk9SPC9saXRlcmFsPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBJZiB0aGUgcmVwbHkgaGFzIHR5cGUgPGxpdGVyYWw+TUVUSE9EX1JFVFVSTjwvbGl0ZXJhbD4sIHRoZSBhcmd1bWVudHMgdG8gdGhlIHJlcGx5IG1lc3NhZ2UgCisgICAgICAgICAgYXJlIHRoZSByZXR1cm4gdmFsdWUocykgb3IgIm91dCBwYXJhbWV0ZXJzIiBvZiB0aGUgbWV0aG9kIGNhbGwuIAorICAgICAgICAgIElmIHRoZSByZXBseSBoYXMgdHlwZSA8bGl0ZXJhbD5FUlJPUjwvbGl0ZXJhbD4sIHRoZW4gYW4gImV4Y2VwdGlvbiIgaGFzIGJlZW4gdGhyb3duLCAKKyAgICAgICAgICBhbmQgdGhlIGNhbGwgZmFpbHM7IG5vIHJldHVybiB2YWx1ZSB3aWxsIGJlIHByb3ZpZGVkLiBJdCBtYWtlcyAKKyAgICAgICAgICBubyBzZW5zZSB0byBzZW5kIG11bHRpcGxlIHJlcGxpZXMgdG8gdGhlIHNhbWUgbWV0aG9kIGNhbGwuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRXZlbiBpZiBhIG1ldGhvZCBjYWxsIGhhcyBubyByZXR1cm4gdmFsdWVzLCBhIDxsaXRlcmFsPk1FVEhPRF9SRVRVUk48L2xpdGVyYWw+IAorICAgICAgICAgIHJlcGx5IGlzIHJlcXVpcmVkLCBzbyB0aGUgY2FsbGVyIHdpbGwga25vdyB0aGUgbWV0aG9kIAorICAgICAgICAgIHdhcyBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSA8bGl0ZXJhbD5NRVRIT0RfUkVUVVJOPC9saXRlcmFsPiBvciA8bGl0ZXJhbD5FUlJPUjwvbGl0ZXJhbD4gcmVwbHkgbWVzc2FnZSBtdXN0IGhhdmUgdGhlIDxsaXRlcmFsPlJFUExZX1NFUklBTDwvbGl0ZXJhbD4gCisgICAgICAgICAgaGVhZGVyIGZpZWxkLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIElmIGEgPGxpdGVyYWw+TUVUSE9EX0NBTEw8L2xpdGVyYWw+IG1lc3NhZ2UgaGFzIHRoZSBmbGFnIDxsaXRlcmFsPk5PX1JFUExZX0VYUEVDVEVEPC9saXRlcmFsPiwgCisgICAgICAgICAgdGhlbiBhcyBhbiBvcHRpbWl6YXRpb24gdGhlIGFwcGxpY2F0aW9uIHJlY2VpdmluZyB0aGUgbWV0aG9kIAorICAgICAgICAgIGNhbGwgbWF5IGNob29zZSB0byBvbWl0IHRoZSByZXBseSBtZXNzYWdlIChyZWdhcmRsZXNzIG9mIAorICAgICAgICAgIHdoZXRoZXIgdGhlIHJlcGx5IHdvdWxkIGhhdmUgYmVlbiA8bGl0ZXJhbD5NRVRIT0RfUkVUVVJOPC9saXRlcmFsPiBvciA8bGl0ZXJhbD5FUlJPUjwvbGl0ZXJhbD4pLiAKKyAgICAgICAgICBIb3dldmVyLCBpdCBpcyBhbHNvIGFjY2VwdGFibGUgdG8gaWdub3JlIHRoZSA8bGl0ZXJhbD5OT19SRVBMWV9FWFBFQ1RFRDwvbGl0ZXJhbD4KKyAgICAgICAgICBmbGFnIGFuZCByZXBseSBhbnl3YXkuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVW5sZXNzIGEgbWVzc2FnZSBoYXMgdGhlIGZsYWcgPGxpdGVyYWw+Tk9fQVVUT19TVEFSVDwvbGl0ZXJhbD4sIGlmIHRoZQorICAgICAgICAgIGRlc3RpbmF0aW9uIG5hbWUgZG9lcyBub3QgZXhpc3QgdGhlbiBhIHByb2dyYW0gdG8gb3duIHRoZSBkZXN0aW5hdGlvbgorICAgICAgICAgIG5hbWUgd2lsbCBiZSBzdGFydGVkIGJlZm9yZSB0aGUgbWVzc2FnZSBpcyBkZWxpdmVyZWQuICBUaGUgbWVzc2FnZQorICAgICAgICAgIHdpbGwgYmUgaGVsZCB1bnRpbCB0aGUgbmV3IHByb2dyYW0gaXMgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQgb3IgaGFzCisgICAgICAgICAgZmFpbGVkIHRvIHN0YXJ0OyBpbiBjYXNlIG9mIGZhaWx1cmUsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuIFRoaXMKKyAgICAgICAgICBmbGFnIGlzIG9ubHkgcmVsZXZhbnQgaW4gdGhlIGNvbnRleHQgb2YgYSBtZXNzYWdlIGJ1cywgaXQgaXMgaWdub3JlZAorICAgICAgICAgIGR1cmluZyBvbmUtdG8tb25lIGNvbW11bmljYXRpb24gd2l0aCBubyBpbnRlcm1lZGlhdGUgYnVzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxzZWN0NCBpZD0ibWVzc2FnZS1wcm90b2NvbC10eXBlcy1tZXRob2QtYXBpcyI+CisgICAgICAgICAgPHRpdGxlPk1hcHBpbmcgbWV0aG9kIGNhbGxzIHRvIG5hdGl2ZSBBUElzPC90aXRsZT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEFQSXMgZm9yIEQtQnVzIG1heSBtYXAgbWV0aG9kIGNhbGxzIHRvIGEgbWV0aG9kIGNhbGwgaW4gYSBzcGVjaWZpYworICAgICAgICAgICAgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIHN1Y2ggYXMgQysrLCBvciBtYXkgbWFwIGEgbWV0aG9kIGNhbGwgd3JpdHRlbgorICAgICAgICAgICAgaW4gYW4gSURMIHRvIGEgRC1CdXMgbWVzc2FnZS4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJbiBBUElzIG9mIHRoaXMgbmF0dXJlLCBhcmd1bWVudHMgdG8gYSBtZXRob2QgYXJlIG9mdGVuIHRlcm1lZCAiaW4iCisgICAgICAgICAgICAod2hpY2ggaW1wbGllcyBzZW50IGluIHRoZSA8bGl0ZXJhbD5NRVRIT0RfQ0FMTDwvbGl0ZXJhbD4pLCBvciAib3V0IiAod2hpY2ggaW1wbGllcworICAgICAgICAgICAgcmV0dXJuZWQgaW4gdGhlIDxsaXRlcmFsPk1FVEhPRF9SRVRVUk48L2xpdGVyYWw+KS4gU29tZSBBUElzIHN1Y2ggYXMgQ09SQkEgYWxzbyBoYXZlCisgICAgICAgICAgICAiaW5vdXQiIGFyZ3VtZW50cywgd2hpY2ggYXJlIGJvdGggc2VudCBhbmQgcmVjZWl2ZWQsIGkuZS4gdGhlIGNhbGxlcgorICAgICAgICAgICAgcGFzc2VzIGluIGEgdmFsdWUgd2hpY2ggaXMgbW9kaWZpZWQuIE1hcHBlZCB0byBELUJ1cywgYW4gImlub3V0IgorICAgICAgICAgICAgYXJndW1lbnQgaXMgZXF1aXZhbGVudCB0byBhbiAiaW4iIGFyZ3VtZW50LCBmb2xsb3dlZCBieSBhbiAib3V0IgorICAgICAgICAgICAgYXJndW1lbnQuIFlvdSBjYW4ndCBwYXNzIHRoaW5ncyAiYnkgcmVmZXJlbmNlIiBvdmVyIHRoZSB3aXJlLCBzbworICAgICAgICAgICAgImlub3V0IiBpcyBwdXJlbHkgYW4gaWxsdXNpb24gb2YgdGhlIGluLXByb2Nlc3MgQVBJLgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEdpdmVuIGEgbWV0aG9kIHdpdGggemVybyBvciBvbmUgcmV0dXJuIHZhbHVlcywgZm9sbG93ZWQgYnkgemVybyBvciBtb3JlCisgICAgICAgICAgICBhcmd1bWVudHMsIHdoZXJlIGVhY2ggYXJndW1lbnQgbWF5IGJlICJpbiIsICJvdXQiLCBvciAiaW5vdXQiLCB0aGUKKyAgICAgICAgICAgIGNhbGxlciBjb25zdHJ1Y3RzIGEgbWVzc2FnZSBieSBhcHBlbmRpbmcgZWFjaCAiaW4iIG9yICJpbm91dCIgYXJndW1lbnQsCisgICAgICAgICAgICBpbiBvcmRlci4gIm91dCIgYXJndW1lbnRzIGFyZSBub3QgcmVwcmVzZW50ZWQgaW4gdGhlIGNhbGxlcidzIG1lc3NhZ2UuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIHJlY2lwaWVudCBjb25zdHJ1Y3RzIGEgcmVwbHkgYnkgYXBwZW5kaW5nIGZpcnN0IHRoZSByZXR1cm4gdmFsdWUgCisgICAgICAgICAgICBpZiBhbnksIHRoZW4gZWFjaCAib3V0IiBvciAiaW5vdXQiIGFyZ3VtZW50LCBpbiBvcmRlci4gCisgICAgICAgICAgICAiaW4iIGFyZ3VtZW50cyBhcmUgbm90IHJlcHJlc2VudGVkIGluIHRoZSByZXBseSBtZXNzYWdlLgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEVycm9yIHJlcGxpZXMgYXJlIG5vcm1hbGx5IG1hcHBlZCB0byBleGNlcHRpb25zIGluIGxhbmd1YWdlcyB0aGF0IGhhdmUKKyAgICAgICAgICAgIGV4Y2VwdGlvbnMuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSW4gY29udmVydGluZyBmcm9tIG5hdGl2ZSBBUElzIHRvIEQtQnVzLCBpdCBpcyBwZXJoYXBzIG5pY2UgdG8gCisgICAgICAgICAgICBtYXAgRC1CdXMgbmFtaW5nIGNvbnZlbnRpb25zICgiRm9vQmFyIikgdG8gbmF0aXZlIGNvbnZlbnRpb25zIAorICAgICAgICAgICAgc3VjaCBhcyAiZm9vQmFyIiBvciAiZm9vX2JhciIgYXV0b21hdGljYWxseS4gVGhpcyBpcyBPSyAKKyAgICAgICAgICAgIGFzIGxvbmcgYXMgeW91IGNhbiBzYXkgdGhhdCB0aGUgbmF0aXZlIEFQSSBpcyBvbmUgdGhhdCAKKyAgICAgICAgICAgIHdhcyBzcGVjaWZpY2FsbHkgd3JpdHRlbiBmb3IgRC1CdXMuIEl0IG1ha2VzIHRoZSBtb3N0IHNlbnNlCisgICAgICAgICAgICB3aGVuIHdyaXRpbmcgb2JqZWN0IGltcGxlbWVudGF0aW9ucyB0aGF0IHdpbGwgYmUgZXhwb3J0ZWQgCisgICAgICAgICAgICBvdmVyIHRoZSBidXMuIE9iamVjdCBwcm94aWVzIHVzZWQgdG8gaW52b2tlIHJlbW90ZSBELUJ1cyAKKyAgICAgICAgICAgIG9iamVjdHMgcHJvYmFibHkgbmVlZCB0aGUgYWJpbGl0eSB0byBjYWxsIGFueSBELUJ1cyBtZXRob2QsCisgICAgICAgICAgICBhbmQgdGh1cyBhIG1hZ2ljIG5hbWUgbWFwcGluZyBsaWtlIHRoaXMgY291bGQgYmUgYSBwcm9ibGVtLgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoaXMgc3BlY2lmaWNhdGlvbiBkb2Vzbid0IHJlcXVpcmUgYW55dGhpbmcgb2YgbmF0aXZlIEFQSSBiaW5kaW5nczsKKyAgICAgICAgICAgIHRoZSBwcmVjZWRpbmcgaXMgb25seSBhIHN1Z2dlc3RlZCBjb252ZW50aW9uIGZvciBjb25zaXN0ZW5jeSAKKyAgICAgICAgICAgIGFtb25nIGJpbmRpbmdzLgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0ND4KKyAgICAgIDwvc2VjdDM+CisKKyAgICAgIDxzZWN0MyBpZD0ibWVzc2FnZS1wcm90b2NvbC10eXBlcy1zaWduYWwiPgorICAgICAgICA8dGl0bGU+U2lnbmFsIEVtaXNzaW9uPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVW5saWtlIG1ldGhvZCBjYWxscywgc2lnbmFsIGVtaXNzaW9ucyBoYXZlIG5vIHJlcGxpZXMuIAorICAgICAgICAgIEEgc2lnbmFsIGVtaXNzaW9uIGlzIHNpbXBseSBhIHNpbmdsZSBtZXNzYWdlIG9mIHR5cGUgPGxpdGVyYWw+U0lHTkFMPC9saXRlcmFsPi4KKyAgICAgICAgICBJdCBtdXN0IGhhdmUgdGhyZWUgaGVhZGVyIGZpZWxkczogPGxpdGVyYWw+UEFUSDwvbGl0ZXJhbD4gZ2l2aW5nIHRoZSBvYmplY3QgCisgICAgICAgICAgdGhlIHNpZ25hbCB3YXMgZW1pdHRlZCBmcm9tLCBwbHVzIDxsaXRlcmFsPklOVEVSRkFDRTwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPk1FTUJFUjwvbGl0ZXJhbD4gZ2l2aW5nCisgICAgICAgICAgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBzaWduYWwuIFRoZSA8bGl0ZXJhbD5JTlRFUkZBQ0U8L2xpdGVyYWw+IGhlYWRlciBpcyByZXF1aXJlZAorICAgICAgICAgIGZvciBzaWduYWxzLCB0aG91Z2ggaXQgaXMgb3B0aW9uYWwgZm9yIG1ldGhvZCBjYWxscy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKworICAgICAgPHNlY3QzIGlkPSJtZXNzYWdlLXByb3RvY29sLXR5cGVzLWVycm9ycyI+CisgICAgICAgIDx0aXRsZT5FcnJvcnM8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBNZXNzYWdlcyBvZiB0eXBlIDxsaXRlcmFsPkVSUk9SPC9saXRlcmFsPiBhcmUgbW9zdCBjb21tb25seSByZXBsaWVzIAorICAgICAgICAgIHRvIGEgPGxpdGVyYWw+TUVUSE9EX0NBTEw8L2xpdGVyYWw+LCBidXQgbWF5IGJlIHJldHVybmVkIGluIHJlcGx5IAorICAgICAgICAgIHRvIGFueSBraW5kIG9mIG1lc3NhZ2UuIFRoZSBtZXNzYWdlIGJ1cyBmb3IgZXhhbXBsZQorICAgICAgICAgIHdpbGwgcmV0dXJuIGFuIDxsaXRlcmFsPkVSUk9SPC9saXRlcmFsPiBpbiByZXBseSB0byBhIHNpZ25hbCBlbWlzc2lvbiBpZiAKKyAgICAgICAgICB0aGUgYnVzIGRvZXMgbm90IGhhdmUgZW5vdWdoIG1lbW9yeSB0byBzZW5kIHRoZSBzaWduYWwuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQW4gPGxpdGVyYWw+RVJST1I8L2xpdGVyYWw+IG1heSBoYXZlIGFueSBhcmd1bWVudHMsIGJ1dCBpZiB0aGUgZmlyc3QgCisgICAgICAgICAgYXJndW1lbnQgaXMgYSA8bGl0ZXJhbD5TVFJJTkc8L2xpdGVyYWw+LCBpdCBtdXN0IGJlIGFuIGVycm9yIG1lc3NhZ2UuCisgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UgbWF5IGJlIGxvZ2dlZCBvciBzaG93biB0byB0aGUgdXNlcgorICAgICAgICAgIGluIHNvbWUgd2F5LgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorCisgICAgICA8c2VjdDMgaWQ9Im1lc3NhZ2UtcHJvdG9jb2wtdHlwZXMtbm90YXRpb24iPgorICAgICAgICA8dGl0bGU+Tm90YXRpb24gaW4gdGhpcyBkb2N1bWVudDwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoaXMgZG9jdW1lbnQgdXNlcyBhIHNpbXBsZSBwc2V1ZG8tSURMIHRvIGRlc2NyaWJlIHBhcnRpY3VsYXIgbWV0aG9kIAorICAgICAgICAgIGNhbGxzIGFuZCBzaWduYWxzLiBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBtZXRob2QgY2FsbDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBvcmcuZnJlZWRlc2t0b3AuREJ1cy5TdGFydFNlcnZpY2VCeU5hbWUgKGluIFNUUklORyBuYW1lLCBpbiBVSU5UMzIgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBVSU5UMzIgcmVzdWx0Y29kZSkKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIFRoaXMgbWVhbnMgPGxpdGVyYWw+SU5URVJGQUNFPC9saXRlcmFsPiA9IG9yZy5mcmVlZGVza3RvcC5EQnVzLCA8bGl0ZXJhbD5NRU1CRVI8L2xpdGVyYWw+ID0gU3RhcnRTZXJ2aWNlQnlOYW1lLCAKKyAgICAgICAgICA8bGl0ZXJhbD5NRVRIT0RfQ0FMTDwvbGl0ZXJhbD4gYXJndW1lbnRzIGFyZSA8bGl0ZXJhbD5TVFJJTkc8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5VSU5UMzI8L2xpdGVyYWw+LCA8bGl0ZXJhbD5NRVRIT0RfUkVUVVJOPC9saXRlcmFsPiBhcmd1bWVudAorICAgICAgICAgIGlzIDxsaXRlcmFsPlVJTlQzMjwvbGl0ZXJhbD4uIFJlbWVtYmVyIHRoYXQgdGhlIDxsaXRlcmFsPk1FTUJFUjwvbGl0ZXJhbD4gZmllbGQgY2FuJ3QgY29udGFpbiBhbnkgJy4nIChwZXJpb2QpCisgICAgICAgICAgY2hhcmFjdGVycyBzbyBpdCdzIGtub3duIHRoYXQgdGhlIGxhc3QgcGFydCBvZiB0aGUgbmFtZSBpbgorICAgICAgICAgIHRoZSAiSURMIiBpcyB0aGUgbWVtYmVyIG5hbWUuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSW4gQysrIHRoYXQgbWlnaHQgZW5kIHVwIGxvb2tpbmcgbGlrZSB0aGlzOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBvcmc6OmZyZWVkZXNrdG9wOjpEQnVzOjpTdGFydFNlcnZpY2VCeU5hbWUgKGNvbnN0IGNoYXIgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKTsKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIG9yIGVxdWFsbHkgdmFsaWQsIHRoZSByZXR1cm4gdmFsdWUgY291bGQgYmUgZG9uZSBhcyBhbiBhcmd1bWVudDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICB2b2lkIG9yZzo6ZnJlZWRlc2t0b3A6OkRCdXM6OlN0YXJ0U2VydmljZUJ5TmFtZSAoY29uc3QgY2hhciAgICpuYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqcmVzdWx0Y29kZSk7CisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBJdCdzIHJlYWxseSB1cCB0byB0aGUgQVBJIGRlc2lnbmVyIGhvdyB0aGV5IHdhbnQgdG8gbWFrZSAKKyAgICAgICAgICB0aGlzIGxvb2suIFlvdSBjb3VsZCBkZXNpZ24gYW4gQVBJIHdoZXJlIHRoZSBuYW1lc3BhY2Ugd2Fzbid0IHVzZWQgCisgICAgICAgICAgaW4gQysrLCB1c2luZyBTVEwgb3IgUXQsIHVzaW5nIHZhcmFyZ3MsIG9yIHdoYXRldmVyIHlvdSB3YW50ZWQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgU2lnbmFscyBhcmUgd3JpdHRlbiBhcyBmb2xsb3dzOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIG9yZy5mcmVlZGVza3RvcC5EQnVzLk5hbWVMb3N0IChTVFJJTkcgbmFtZSkKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIFNpZ25hbHMgZG9uJ3Qgc3BlY2lmeSAiaW4iIHZzLiAib3V0IiBiZWNhdXNlIG9ubHkgCisgICAgICAgICAgYSBzaW5nbGUgZGlyZWN0aW9uIGlzIHBvc3NpYmxlLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEl0IGlzbid0IGVzcGVjaWFsbHkgZW5jb3VyYWdlZCB0byB1c2UgdGhpcyBsYW1lIHBzZXVkby1JREwgaW4gYWN0dWFsCisgICAgICAgICAgQVBJIGltcGxlbWVudGF0aW9uczsgeW91IG1pZ2h0IHVzZSB0aGUgbmF0aXZlIG5vdGF0aW9uIGZvciB0aGUKKyAgICAgICAgICBsYW5ndWFnZSB5b3UncmUgdXNpbmcsIG9yIHlvdSBtaWdodCB1c2UgQ09NIG9yIENPUkJBIElETCwgZm9yIGV4YW1wbGUuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0MiBpZD0ibWVzc2FnZS1wcm90b2NvbC1oYW5kbGluZy1pbnZhbGlkIj4KKyAgICAgIDx0aXRsZT5JbnZhbGlkIFByb3RvY29sIGFuZCBTcGVjIEV4dGVuc2lvbnM8L3RpdGxlPgorICAgICAgCisgICAgICA8cGFyYT4KKyAgICAgICAgRm9yIHNlY3VyaXR5IHJlYXNvbnMsIHRoZSBELUJ1cyBwcm90b2NvbCBzaG91bGQgYmUgc3RyaWN0bHkgcGFyc2VkIGFuZAorICAgICAgICB2YWxpZGF0ZWQsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBkZWZpbmVkIGV4dGVuc2lvbiBwb2ludHMuIEFueSBpbnZhbGlkCisgICAgICAgIHByb3RvY29sIG9yIHNwZWMgdmlvbGF0aW9ucyBzaG91bGQgcmVzdWx0IGluIGltbWVkaWF0ZWx5IGRyb3BwaW5nIHRoZQorICAgICAgICBjb25uZWN0aW9uIHdpdGhvdXQgbm90aWNlIHRvIHRoZSBvdGhlciBlbmQuIEV4Y2VwdGlvbnMgc2hvdWxkIGJlCisgICAgICAgIGNhcmVmdWxseSBjb25zaWRlcmVkLCBlLmcuIGFuIGV4Y2VwdGlvbiBtYXkgYmUgd2FycmFudGVkIGZvciBhCisgICAgICAgIHdlbGwtdW5kZXJzdG9vZCBpZGlvc3luY3Jhc3kgb2YgYSB3aWRlbHktZGVwbG95ZWQgaW1wbGVtZW50YXRpb24uICBJbgorICAgICAgICBjYXNlcyB3aGVyZSB0aGUgb3RoZXIgZW5kIG9mIGEgY29ubmVjdGlvbiBpcyAxMDAlIHRydXN0ZWQgYW5kIGtub3duIHRvCisgICAgICAgIGJlIGZyaWVuZGx5LCBza2lwcGluZyB2YWxpZGF0aW9uIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIGNvdWxkIGFsc28gbWFrZQorICAgICAgICBzZW5zZSBpbiBjZXJ0YWluIGNhc2VzLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgR2VuZXJhbGx5IHNwZWFraW5nIHZpb2xhdGlvbnMgb2YgdGhlICJtdXN0IiByZXF1aXJlbWVudHMgaW4gdGhpcyBzcGVjIAorICAgICAgICBzaG91bGQgYmUgY29uc2lkZXJlZCBwb3NzaWJsZSBhdHRlbXB0cyB0byBleHBsb2l0IHNlY3VyaXR5LCBhbmQgdmlvbGF0aW9ucyAKKyAgICAgICAgb2YgdGhlICJzaG91bGQiIHN1Z2dlc3Rpb25zIHNob3VsZCBiZSBjb25zaWRlcmVkIGxlZ2l0aW1hdGUgKHRob3VnaCBwZXJoYXBzCisgICAgICAgIHRoZXkgc2hvdWxkIGdlbmVyYXRlIGFuIGVycm9yIGluIHNvbWUgY2FzZXMpLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIGZvbGxvd2luZyBleHRlbnNpb24gcG9pbnRzIGFyZSBidWlsdCBpbiB0byBELUJ1cyBvbiBwdXJwb3NlIGFuZCBtdXN0CisgICAgICAgIG5vdCBiZSB0cmVhdGVkIGFzIGludmFsaWQgcHJvdG9jb2wuIFRoZSBleHRlbnNpb24gcG9pbnRzIGFyZSBpbnRlbmRlZAorICAgICAgICBmb3IgdXNlIGJ5IGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGlzIHNwZWMsIHRoZXkgYXJlIG5vdCBpbnRlbmRlZCBmb3IgdGhpcmQKKyAgICAgICAgcGFydGllcy4gIEF0IHRoZSBtb21lbnQsIHRoZSBvbmx5IHdheSBhIHRoaXJkIHBhcnR5IGNvdWxkIGV4dGVuZCBELUJ1cworICAgICAgICB3aXRob3V0IGJyZWFraW5nIGludGVyb3BlcmFiaWxpdHkgd291bGQgYmUgdG8gaW50cm9kdWNlIGEgd2F5IHRvIG5lZ290aWF0ZSBuZXcKKyAgICAgICAgZmVhdHVyZSBzdXBwb3J0IGFzIHBhcnQgb2YgdGhlIGF1dGggcHJvdG9jb2wsIHVzaW5nIEVYVEVOU0lPTl8tcHJlZml4ZWQKKyAgICAgICAgY29tbWFuZHMuIFRoZXJlIGlzIG5vdCB5ZXQgYSBzdGFuZGFyZCB3YXkgdG8gbmVnb3RpYXRlIGZlYXR1cmVzLgorICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBJbiB0aGUgYXV0aGVudGljYXRpb24gcHJvdG9jb2wgKHNlZSA8eHJlZiBsaW5rZW5kPSJhdXRoLXByb3RvY29sIi8+KSB1bmtub3duIAorICAgICAgICAgICAgICAgIGNvbW1hbmRzIHJlc3VsdCBpbiBhbiBFUlJPUiByYXRoZXIgdGhhbiBhIGRpc2Nvbm5lY3QuIFRoaXMgZW5hYmxlcyAKKyAgICAgICAgICAgICAgICBmdXR1cmUgZXh0ZW5zaW9ucyB0byB0aGUgcHJvdG9jb2wuIENvbW1hbmRzIHN0YXJ0aW5nIHdpdGggRVhURU5TSU9OXyBhcmUgCisgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgZm9yIHRoaXJkIHBhcnRpZXMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgVGhlIGF1dGhlbnRpY2F0aW9uIHByb3RvY29sIHN1cHBvcnRzIHBsdWdnYWJsZSBhdXRoIG1lY2hhbmlzbXMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgVGhlIGFkZHJlc3MgZm9ybWF0IChzZWUgPHhyZWYgbGlua2VuZD0iYWRkcmVzc2VzIi8+KSBzdXBwb3J0cyBuZXcKKyAgICAgICAgICAgICAga2luZHMgb2YgdHJhbnNwb3J0LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIE1lc3NhZ2VzIHdpdGggYW4gdW5rbm93biB0eXBlIChzb21ldGhpbmcgb3RoZXIgdGhhbgorICAgICAgICAgICAgICA8bGl0ZXJhbD5NRVRIT0RfQ0FMTDwvbGl0ZXJhbD4sIDxsaXRlcmFsPk1FVEhPRF9SRVRVUk48L2xpdGVyYWw+LAorICAgICAgICAgICAgICA8bGl0ZXJhbD5FUlJPUjwvbGl0ZXJhbD4sIDxsaXRlcmFsPlNJR05BTDwvbGl0ZXJhbD4pIGFyZSBpZ25vcmVkLiAKKyAgICAgICAgICAgICAgVW5rbm93bi10eXBlIG1lc3NhZ2VzIG11c3Qgc3RpbGwgYmUgd2VsbC1mb3JtZWQgaW4gdGhlIHNhbWUgd2F5IAorICAgICAgICAgICAgICBhcyB0aGUga25vd24gbWVzc2FnZXMsIGhvd2V2ZXIuIFRoZXkgc3RpbGwgaGF2ZSB0aGUgbm9ybWFsIAorICAgICAgICAgICAgICBoZWFkZXIgYW5kIGJvZHkuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgSGVhZGVyIGZpZWxkcyB3aXRoIGFuIHVua25vd24gb3IgdW5leHBlY3RlZCBmaWVsZCBjb2RlIG11c3QgYmUgaWdub3JlZCwgCisgICAgICAgICAgICAgIHRob3VnaCBhZ2FpbiB0aGV5IG11c3Qgc3RpbGwgYmUgd2VsbC1mb3JtZWQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgTmV3IHN0YW5kYXJkIGludGVyZmFjZXMgKHdpdGggbmV3IG1ldGhvZHMgYW5kIHNpZ25hbHMpIGNhbiBvZiBjb3Vyc2UgYmUgYWRkZWQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICA8L3BhcmE+CisKKyAgICA8L3NlY3QyPgorCisgIDwvc2VjdDE+CisKKyAgPHNlY3QxIGlkPSJhdXRoLXByb3RvY29sIj4KKyAgICA8dGl0bGU+QXV0aGVudGljYXRpb24gUHJvdG9jb2w8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgQmVmb3JlIHRoZSBmbG93IG9mIG1lc3NhZ2VzIGJlZ2lucywgdHdvIGFwcGxpY2F0aW9ucyBtdXN0CisgICAgICBhdXRoZW50aWNhdGUuIEEgc2ltcGxlIHBsYWluLXRleHQgcHJvdG9jb2wgaXMgdXNlZCBmb3IKKyAgICAgIGF1dGhlbnRpY2F0aW9uOyB0aGlzIHByb3RvY29sIGlzIGEgU0FTTCBwcm9maWxlLCBhbmQgbWFwcyBmYWlybHkKKyAgICAgIGRpcmVjdGx5IGZyb20gdGhlIFNBU0wgc3BlY2lmaWNhdGlvbi4gVGhlIG1lc3NhZ2UgZW5jb2RpbmcgaXMKKyAgICAgIE5PVCB1c2VkIGhlcmUsIG9ubHkgcGxhaW4gdGV4dCBtZXNzYWdlcy4KKyAgICA8L3BhcmE+CisgICAgPHBhcmE+CisgICAgICBJbiBleGFtcGxlcywgIkM6IiBhbmQgIlM6IiBpbmRpY2F0ZSBsaW5lcyBzZW50IGJ5IHRoZSBjbGllbnQgYW5kCisgICAgICBzZXJ2ZXIgcmVzcGVjdGl2ZWx5LgorICAgIDwvcGFyYT4KKyAgICA8c2VjdDIgaWQ9ImF1dGgtcHJvdG9jb2wtb3ZlcnZpZXciPgorICAgICAgPHRpdGxlPlByb3RvY29sIE92ZXJ2aWV3PC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgcHJvdG9jb2wgaXMgYSBsaW5lLWJhc2VkIHByb3RvY29sLCB3aGVyZSBlYWNoIGxpbmUgZW5kcyB3aXRoCisgICAgICAgIFxyXG4uIEVhY2ggbGluZSBiZWdpbnMgd2l0aCBhbiBhbGwtY2FwcyBBU0NJSSBjb21tYW5kIG5hbWUgY29udGFpbmluZworICAgICAgICBvbmx5IHRoZSBjaGFyYWN0ZXIgcmFuZ2UgW0EtWl9dLCBhIHNwYWNlLCB0aGVuIGFueSBhcmd1bWVudHMgZm9yIHRoZQorICAgICAgICBjb21tYW5kLCB0aGVuIHRoZSBcclxuIGVuZGluZyB0aGUgbGluZS4gVGhlIHByb3RvY29sIGlzCisgICAgICAgIGNhc2Utc2Vuc2l0aXZlLiBBbGwgYnl0ZXMgbXVzdCBiZSBpbiB0aGUgQVNDSUkgY2hhcmFjdGVyIHNldC4KKworICAgICAgICBDb21tYW5kcyBmcm9tIHRoZSBjbGllbnQgdG8gdGhlIHNlcnZlciBhcmUgYXMgZm9sbG93czoKKworICAgICAgICA8aXRlbWl6ZWRsaXN0PgorCSAgPGxpc3RpdGVtPjxwYXJhPkFVVEggW21lY2hhbmlzbV0gW2luaXRpYWwtcmVzcG9uc2VdPC9wYXJhPjwvbGlzdGl0ZW0+CisJICA8bGlzdGl0ZW0+PHBhcmE+Q0FOQ0VMPC9wYXJhPjwvbGlzdGl0ZW0+CisJICA8bGlzdGl0ZW0+PHBhcmE+QkVHSU48L3BhcmE+PC9saXN0aXRlbT4KKwkgIDxsaXN0aXRlbT48cGFyYT5EQVRBICZsdDtkYXRhIGluIGhleCBlbmNvZGluZyZndDs8L3BhcmE+PC9saXN0aXRlbT4KKwkgIDxsaXN0aXRlbT48cGFyYT5FUlJPUiBbaHVtYW4tcmVhZGFibGUgZXJyb3IgZXhwbGFuYXRpb25dPC9wYXJhPjwvbGlzdGl0ZW0+CisJICA8bGlzdGl0ZW0+PHBhcmE+TkVHT1RJQVRFX1VOSVhfRkQ8L3BhcmE+PC9saXN0aXRlbT4KKwk8L2l0ZW1pemVkbGlzdD4KKworICAgICAgICBGcm9tIHNlcnZlciB0byBjbGllbnQgYXJlIGFzIGZvbGxvd3M6CisKKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKwkgIDxsaXN0aXRlbT48cGFyYT5SRUpFQ1RFRCAmbHQ7c3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgbWVjaGFuaXNtIG5hbWVzJmd0OzwvcGFyYT48L2xpc3RpdGVtPgorCSAgPGxpc3RpdGVtPjxwYXJhPk9LICZsdDtHVUlEIGluIGhleCZndDs8L3BhcmE+PC9saXN0aXRlbT4KKwkgIDxsaXN0aXRlbT48cGFyYT5EQVRBICZsdDtkYXRhIGluIGhleCBlbmNvZGluZyZndDs8L3BhcmE+PC9saXN0aXRlbT4KKwkgIDxsaXN0aXRlbT48cGFyYT5FUlJPUjwvcGFyYT48L2xpc3RpdGVtPgorCSAgPGxpc3RpdGVtPjxwYXJhPkFHUkVFX1VOSVhfRkQ8L3BhcmE+PC9saXN0aXRlbT4KKwk8L2l0ZW1pemVkbGlzdD4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBVbm9mZmljaWFsIGV4dGVuc2lvbnMgdG8gdGhlIGNvbW1hbmQgc2V0IG11c3QgYmVnaW4gd2l0aCB0aGUgbGV0dGVycyAKKyAgICAgICAgIkVYVEVOU0lPTl8iLCB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBmdXR1cmUgb2ZmaWNpYWwgY29tbWFuZHMuCisgICAgICAgIEZvciBleGFtcGxlLCAiRVhURU5TSU9OX0NPTV9NWURPTUFJTl9ET19TVFVGRiIuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9ImF1dGgtbnVsLWJ5dGUiPgorICAgICAgPHRpdGxlPlNwZWNpYWwgY3JlZGVudGlhbHMtcGFzc2luZyBudWwgYnl0ZTwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgSW1tZWRpYXRlbHkgYWZ0ZXIgY29ubmVjdGluZyB0byB0aGUgc2VydmVyLCB0aGUgY2xpZW50IG11c3Qgc2VuZCBhCisgICAgICAgIHNpbmdsZSBudWwgYnl0ZS4gVGhpcyBieXRlIG1heSBiZSBhY2NvbXBhbmllZCBieSBjcmVkZW50aWFscworICAgICAgICBpbmZvcm1hdGlvbiBvbiBzb21lIG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgdXNlIHNlbmRtc2coKSB3aXRoCisgICAgICAgIFNDTV9DUkVEUyBvciBTQ01fQ1JFREVOVElBTFMgdG8gcGFzcyBjcmVkZW50aWFscyBvdmVyIFVOSVggZG9tYWluCisgICAgICAgIHNvY2tldHMuIEhvd2V2ZXIsIHRoZSBudWwgYnl0ZSBtdXN0IGJlIHNlbnQgZXZlbiBvbiBvdGhlciBraW5kcyBvZgorICAgICAgICBzb2NrZXQsIGFuZCBldmVuIG9uIG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgZG8gbm90IHJlcXVpcmUgYSBieXRlIHRvIGJlCisgICAgICAgIHNlbnQgaW4gb3JkZXIgdG8gdHJhbnNtaXQgY3JlZGVudGlhbHMuIFRoZSB0ZXh0IHByb3RvY29sIGRlc2NyaWJlZCBpbgorICAgICAgICB0aGlzIGRvY3VtZW50IGJlZ2lucyBhZnRlciB0aGUgc2luZ2xlIG51bCBieXRlLiBJZiB0aGUgZmlyc3QgYnl0ZQorICAgICAgICByZWNlaXZlZCBmcm9tIHRoZSBjbGllbnQgaXMgbm90IGEgbnVsIGJ5dGUsIHRoZSBzZXJ2ZXIgbWF5IGRpc2Nvbm5lY3QgCisgICAgICAgIHRoYXQgY2xpZW50LgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEEgbnVsIGJ5dGUgaW4gYW55IGNvbnRleHQgb3RoZXIgdGhhbiB0aGUgaW5pdGlhbCBieXRlIGlzIGFuIGVycm9yOyAKKyAgICAgICAgdGhlIHByb3RvY29sIGlzIEFTQ0lJLW9ubHkuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIGNyZWRlbnRpYWxzIHNlbnQgYWxvbmcgd2l0aCB0aGUgbnVsIGJ5dGUgbWF5IGJlIHVzZWQgd2l0aCB0aGUgCisgICAgICAgIFNBU0wgbWVjaGFuaXNtIEVYVEVSTkFMLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJhdXRoLWNvbW1hbmQtYXV0aCI+CisgICAgICA8dGl0bGU+QVVUSCBjb21tYW5kPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBJZiBhbiBBVVRIIGNvbW1hbmQgaGFzIG5vIGFyZ3VtZW50cywgaXQgaXMgYSByZXF1ZXN0IHRvIGxpc3QKKyAgICAgICAgYXZhaWxhYmxlIG1lY2hhbmlzbXMuIFRoZSBzZXJ2ZXIgbXVzdCByZXNwb25kIHdpdGggYSBSRUpFQ1RFRAorICAgICAgICBjb21tYW5kIGxpc3RpbmcgdGhlIG1lY2hhbmlzbXMgaXQgdW5kZXJzdGFuZHMsIG9yIHdpdGggYW4gZXJyb3IuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgSWYgYW4gQVVUSCBjb21tYW5kIHNwZWNpZmllcyBhIG1lY2hhbmlzbSwgYW5kIHRoZSBzZXJ2ZXIgc3VwcG9ydHMKKyAgICAgICAgc2FpZCBtZWNoYW5pc20sIHRoZSBzZXJ2ZXIgc2hvdWxkIGJlZ2luIGV4Y2hhbmdpbmcgU0FTTAorICAgICAgICBjaGFsbGVuZ2UtcmVzcG9uc2UgZGF0YSB3aXRoIHRoZSBjbGllbnQgdXNpbmcgREFUQSBjb21tYW5kcy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBJZiB0aGUgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIG1lY2hhbmlzbSBnaXZlbiBpbiB0aGUgQVVUSAorICAgICAgICBjb21tYW5kLCBpdCBtdXN0IHNlbmQgZWl0aGVyIGEgUkVKRUNURUQgY29tbWFuZCBsaXN0aW5nIHRoZSBtZWNoYW5pc21zCisgICAgICAgIGl0IGRvZXMgc3VwcG9ydCwgb3IgYW4gZXJyb3IuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgSWYgdGhlIFtpbml0aWFsLXJlc3BvbnNlXSBhcmd1bWVudCBpcyBwcm92aWRlZCwgaXQgaXMgaW50ZW5kZWQgZm9yIHVzZQorICAgICAgICB3aXRoIG1lY2hhbmlzbXMgdGhhdCBoYXZlIG5vIGluaXRpYWwgY2hhbGxlbmdlIChvciBhbiBlbXB0eSBpbml0aWFsCisgICAgICAgIGNoYWxsZW5nZSksIGFzIGlmIGl0IHdlcmUgdGhlIGFyZ3VtZW50IHRvIGFuIGluaXRpYWwgREFUQSBjb21tYW5kLiBJZgorICAgICAgICB0aGUgc2VsZWN0ZWQgbWVjaGFuaXNtIGhhcyBhbiBpbml0aWFsIGNoYWxsZW5nZSBhbmQgW2luaXRpYWwtcmVzcG9uc2VdCisgICAgICAgIHdhcyBwcm92aWRlZCwgdGhlIHNlcnZlciBzaG91bGQgcmVqZWN0IGF1dGhlbnRpY2F0aW9uIGJ5IHNlbmRpbmcKKyAgICAgICAgUkVKRUNURUQuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgSWYgYXV0aGVudGljYXRpb24gc3VjY2VlZHMgYWZ0ZXIgZXhjaGFuZ2luZyBEQVRBIGNvbW1hbmRzLCAKKyAgICAgICAgYW4gT0sgY29tbWFuZCBtdXN0IGJlIHNlbnQgdG8gdGhlIGNsaWVudC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgZmlyc3Qgb2N0ZXQgcmVjZWl2ZWQgYnkgdGhlIHNlcnZlciBhZnRlciB0aGUgXHJcbiBvZiB0aGUgQkVHSU4KKyAgICAgICAgY29tbWFuZCBmcm9tIHRoZSBjbGllbnQgbXVzdCBiZSB0aGUgZmlyc3Qgb2N0ZXQgb2YgdGhlCisgICAgICAgIGF1dGhlbnRpY2F0ZWQvZW5jcnlwdGVkIHN0cmVhbSBvZiBELUJ1cyBtZXNzYWdlcy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBJZiBCRUdJTiBpcyByZWNlaXZlZCBieSB0aGUgc2VydmVyLCB0aGUgZmlyc3Qgb2N0ZXQgcmVjZWl2ZWQKKyAgICAgICAgYnkgdGhlIGNsaWVudCBhZnRlciB0aGUgXHJcbiBvZiB0aGUgT0sgY29tbWFuZCBtdXN0IGJlIHRoZQorICAgICAgICBmaXJzdCBvY3RldCBvZiB0aGUgYXV0aGVudGljYXRlZC9lbmNyeXB0ZWQgc3RyZWFtIG9mIEQtQnVzCisgICAgICAgIG1lc3NhZ2VzLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJhdXRoLWNvbW1hbmQtY2FuY2VsIj4KKyAgICAgIDx0aXRsZT5DQU5DRUwgQ29tbWFuZDwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgQXQgYW55IHRpbWUgdXAgdG8gc2VuZGluZyB0aGUgQkVHSU4gY29tbWFuZCwgdGhlIGNsaWVudCBtYXkgc2VuZCBhCisgICAgICAgIENBTkNFTCBjb21tYW5kLiBPbiByZWNlaXZpbmcgdGhlIENBTkNFTCBjb21tYW5kLCB0aGUgc2VydmVyIG11c3QKKyAgICAgICAgc2VuZCBhIFJFSkVDVEVEIGNvbW1hbmQgYW5kIGFib3J0IHRoZSBjdXJyZW50IGF1dGhlbnRpY2F0aW9uCisgICAgICAgIGV4Y2hhbmdlLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJhdXRoLWNvbW1hbmQtZGF0YSI+CisgICAgICA8dGl0bGU+REFUQSBDb21tYW5kPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgREFUQSBjb21tYW5kIG1heSBjb21lIGZyb20gZWl0aGVyIGNsaWVudCBvciBzZXJ2ZXIsIGFuZCBzaW1wbHkgCisgICAgICAgIGNvbnRhaW5zIGEgaGV4LWVuY29kZWQgYmxvY2sgb2YgZGF0YSB0byBiZSBpbnRlcnByZXRlZCAKKyAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBTQVNMIG1lY2hhbmlzbSBpbiB1c2UuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgU29tZSBTQVNMIG1lY2hhbmlzbXMgc3VwcG9ydCBzZW5kaW5nIGFuICJlbXB0eSBzdHJpbmciOyAKKyAgICAgICAgRklYTUUgd2UgbmVlZCBzb21lIHdheSB0byBkbyB0aGlzLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJhdXRoLWNvbW1hbmQtYmVnaW4iPgorICAgICAgPHRpdGxlPkJFR0lOIENvbW1hbmQ8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBCRUdJTiBjb21tYW5kIGFja25vd2xlZGdlcyB0aGF0IHRoZSBjbGllbnQgaGFzIHJlY2VpdmVkIGFuIAorICAgICAgICBPSyBjb21tYW5kIGZyb20gdGhlIHNlcnZlciwgYW5kIHRoYXQgdGhlIHN0cmVhbSBvZiBtZXNzYWdlcworICAgICAgICBpcyBhYm91dCB0byBiZWdpbi4gCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIGZpcnN0IG9jdGV0IHJlY2VpdmVkIGJ5IHRoZSBzZXJ2ZXIgYWZ0ZXIgdGhlIFxyXG4gb2YgdGhlIEJFR0lOCisgICAgICAgIGNvbW1hbmQgZnJvbSB0aGUgY2xpZW50IG11c3QgYmUgdGhlIGZpcnN0IG9jdGV0IG9mIHRoZQorICAgICAgICBhdXRoZW50aWNhdGVkL2VuY3J5cHRlZCBzdHJlYW0gb2YgRC1CdXMgbWVzc2FnZXMuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9ImF1dGgtY29tbWFuZC1yZWplY3RlZCI+CisgICAgICA8dGl0bGU+UkVKRUNURUQgQ29tbWFuZDwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIFJFSkVDVEVEIGNvbW1hbmQgaW5kaWNhdGVzIHRoYXQgdGhlIGN1cnJlbnQgYXV0aGVudGljYXRpb24KKyAgICAgICAgZXhjaGFuZ2UgaGFzIGZhaWxlZCwgYW5kIGZ1cnRoZXIgZXhjaGFuZ2Ugb2YgREFUQSBpcyBpbmFwcHJvcHJpYXRlLgorICAgICAgICBUaGUgY2xpZW50IHdvdWxkIG5vcm1hbGx5IHRyeSBhbm90aGVyIG1lY2hhbmlzbSwgb3IgdHJ5IHByb3ZpZGluZworICAgICAgICBkaWZmZXJlbnQgcmVzcG9uc2VzIHRvIGNoYWxsZW5nZXMuCisgICAgICA8L3BhcmE+PHBhcmE+CisgICAgICAgIE9wdGlvbmFsbHksIHRoZSBSRUpFQ1RFRCBjb21tYW5kIGhhcyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mCisgICAgICAgIGF2YWlsYWJsZSBhdXRoIG1lY2hhbmlzbXMgYXMgYXJndW1lbnRzLiBJZiBhIHNlcnZlciBldmVyIHByb3ZpZGVzCisgICAgICAgIGEgbGlzdCBvZiBzdXBwb3J0ZWQgbWVjaGFuaXNtcywgaXQgbXVzdCBwcm92aWRlIHRoZSBzYW1lIGxpc3QgCisgICAgICAgIGVhY2ggdGltZSBpdCBzZW5kcyBhIFJFSkVDVEVEIG1lc3NhZ2UuIENsaWVudHMgYXJlIGZyZWUgdG8gCisgICAgICAgIGlnbm9yZSBhbGwgbGlzdHMgcmVjZWl2ZWQgYWZ0ZXIgdGhlIGZpcnN0LgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJhdXRoLWNvbW1hbmQtb2siPgorICAgICAgPHRpdGxlPk9LIENvbW1hbmQ8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBPSyBjb21tYW5kIGluZGljYXRlcyB0aGF0IHRoZSBjbGllbnQgaGFzIGJlZW4KKyAgICAgICAgYXV0aGVudGljYXRlZC4gVGhlIGNsaWVudCBtYXkgbm93IHByb2NlZWQgd2l0aCBuZWdvdGlhdGluZworICAgICAgICBVbml4IGZpbGUgZGVzY3JpcHRvciBwYXNzaW5nLiBUbyBkbyB0aGF0IGl0IHNoYWxsIHNlbmQKKyAgICAgICAgTkVHT1RJQVRFX1VOSVhfRkQgdG8gdGhlIHNlcnZlci4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBPdGhlcndpc2UsIHRoZSBjbGllbnQgbXVzdCByZXNwb25kIHRvIHRoZSBPSyBjb21tYW5kIGJ5CisgICAgICAgIHNlbmRpbmcgYSBCRUdJTiBjb21tYW5kLCBmb2xsb3dlZCBieSBpdHMgc3RyZWFtIG9mIG1lc3NhZ2VzLAorICAgICAgICBvciBieSBkaXNjb25uZWN0aW5nLiAgVGhlIHNlcnZlciBtdXN0IG5vdCBhY2NlcHQgYWRkaXRpb25hbAorICAgICAgICBjb21tYW5kcyB1c2luZyB0aGlzIHByb3RvY29sIGFmdGVyIHRoZSBCRUdJTiBjb21tYW5kIGhhcyBiZWVuCisgICAgICAgIHJlY2VpdmVkLiBGdXJ0aGVyIGNvbW11bmljYXRpb24gd2lsbCBiZSBhIHN0cmVhbSBvZiBELUJ1cworICAgICAgICBtZXNzYWdlcyAob3B0aW9uYWxseSBlbmNyeXB0ZWQsIGFzIG5lZ290aWF0ZWQpIHJhdGhlciB0aGFuCisgICAgICAgIHRoaXMgcHJvdG9jb2wuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgSWYgYSBjbGllbnQgc2VuZHMgQkVHSU4gdGhlIGZpcnN0IG9jdGV0IHJlY2VpdmVkIGJ5IHRoZSBjbGllbnQKKyAgICAgICAgYWZ0ZXIgdGhlIFxyXG4gb2YgdGhlIE9LIGNvbW1hbmQgbXVzdCBiZSB0aGUgZmlyc3Qgb2N0ZXQgb2YKKyAgICAgICAgdGhlIGF1dGhlbnRpY2F0ZWQvZW5jcnlwdGVkIHN0cmVhbSBvZiBELUJ1cyBtZXNzYWdlcy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgT0sgY29tbWFuZCBoYXMgb25lIGFyZ3VtZW50LCB3aGljaCBpcyB0aGUgR1VJRCBvZiB0aGUgc2VydmVyLgorICAgICAgICBTZWUgPHhyZWYgbGlua2VuZD0iYWRkcmVzc2VzIi8+IGZvciBtb3JlIG9uIHNlcnZlciBHVUlEcy4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0iYXV0aC1jb21tYW5kLWVycm9yIj4KKyAgICAgIDx0aXRsZT5FUlJPUiBDb21tYW5kPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgRVJST1IgY29tbWFuZCBpbmRpY2F0ZXMgdGhhdCBlaXRoZXIgc2VydmVyIG9yIGNsaWVudCBkaWQgbm90CisgICAgICAgIGtub3cgYSBjb21tYW5kLCBkb2VzIG5vdCBhY2NlcHQgdGhlIGdpdmVuIGNvbW1hbmQgaW4gdGhlIGN1cnJlbnQKKyAgICAgICAgY29udGV4dCwgb3IgZGlkIG5vdCB1bmRlcnN0YW5kIHRoZSBhcmd1bWVudHMgdG8gdGhlIGNvbW1hbmQuIFRoaXMKKyAgICAgICAgYWxsb3dzIHRoZSBwcm90b2NvbCB0byBiZSBleHRlbmRlZDsgYSBjbGllbnQgb3Igc2VydmVyIGNhbiBzZW5kIGEKKyAgICAgICAgY29tbWFuZCBwcmVzZW50IG9yIHBlcm1pdHRlZCBvbmx5IGluIG5ldyBwcm90b2NvbCB2ZXJzaW9ucywgYW5kIGlmCisgICAgICAgIGFuIEVSUk9SIGlzIHJlY2VpdmVkIGluc3RlYWQgb2YgYW4gYXBwcm9wcmlhdGUgcmVzcG9uc2UsIGZhbGwgYmFjaworICAgICAgICB0byB1c2luZyBzb21lIG90aGVyIHRlY2huaXF1ZS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBJZiBhbiBFUlJPUiBpcyBzZW50LCB0aGUgc2VydmVyIG9yIGNsaWVudCB0aGF0IHNlbnQgdGhlCisgICAgICAgIGVycm9yIG11c3QgY29udGludWUgYXMgaWYgdGhlIGNvbW1hbmQgY2F1c2luZyB0aGUgRVJST1IgaGFkIG5ldmVyIGJlZW4KKyAgICAgICAgcmVjZWl2ZWQuIEhvd2V2ZXIsIHRoZSB0aGUgc2VydmVyIG9yIGNsaWVudCByZWNlaXZpbmcgdGhlIGVycm9yIAorICAgICAgICBzaG91bGQgdHJ5IHNvbWV0aGluZyBvdGhlciB0aGFuIHdoYXRldmVyIGNhdXNlZCB0aGUgZXJyb3I7IAorICAgICAgICBpZiBvbmx5IGNhbmNlbGluZy9yZWplY3RpbmcgdGhlIGF1dGhlbnRpY2F0aW9uLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIElmIHRoZSBELUJ1cyBwcm90b2NvbCBjaGFuZ2VzIGluY29tcGF0aWJseSBhdCBzb21lIGZ1dHVyZSB0aW1lLAorICAgICAgICBhcHBsaWNhdGlvbnMgaW1wbGVtZW50aW5nIHRoZSBuZXcgcHJvdG9jb2wgd291bGQgcHJvYmFibHkgYmUgYWJsZSB0bworICAgICAgICBjaGVjayBmb3Igc3VwcG9ydCBvZiB0aGUgbmV3IHByb3RvY29sIGJ5IHNlbmRpbmcgYSBuZXcgY29tbWFuZCBhbmQKKyAgICAgICAgcmVjZWl2aW5nIGFuIEVSUk9SIGZyb20gYXBwbGljYXRpb25zIHRoYXQgZG9uJ3QgdW5kZXJzdGFuZCBpdC4gVGh1cyB0aGUKKyAgICAgICAgRVJST1IgZmVhdHVyZSBvZiB0aGUgYXV0aCBwcm90b2NvbCBpcyBhbiBlc2NhcGUgaGF0Y2ggdGhhdCBsZXRzIHVzCisgICAgICAgIG5lZ290aWF0ZSBleHRlbnNpb25zIG9yIGNoYW5nZXMgdG8gdGhlIEQtQnVzIHByb3RvY29sIGluIHRoZSBmdXR1cmUuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9ImF1dGgtY29tbWFuZC1uZWdvdGlhdGUtdW5peC1mZCI+CisgICAgICA8dGl0bGU+TkVHT1RJQVRFX1VOSVhfRkQgQ29tbWFuZDwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIE5FR09USUFURV9VTklYX0ZEIGNvbW1hbmQgaW5kaWNhdGVzIHRoYXQgdGhlIGNsaWVudAorICAgICAgICBzdXBwb3J0cyBVbml4IGZpbGUgZGVzY3JpcHRvciBwYXNzaW5nLiBUaGlzIGNvbW1hbmQgbWF5IG9ubHkKKyAgICAgICAgYmUgc2VudCBhZnRlciB0aGUgY29ubmVjdGlvbiBpcyBhdXRoZW50aWNhdGVkLCBpLmUuIGFmdGVyIE9LCisgICAgICAgIHdhcyByZWNlaXZlZCBieSB0aGUgY2xpZW50LiBUaGlzIGNvbW1hbmQgbWF5IG9ubHkgYmUgc2VudCBvbgorICAgICAgICB0cmFuc3BvcnRzIHRoYXQgc3VwcG9ydCBVbml4IGZpbGUgZGVzY3JpcHRvciBwYXNzaW5nLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIE9uIHJlY2VpdmluZyBORUdPVElBVEVfVU5JWF9GRCB0aGUgc2VydmVyIG11c3QgcmVzcG9uZCB3aXRoCisgICAgICAgIGVpdGhlciBBR1JFRV9VTklYX0ZEIG9yIEVSUk9SLiBJdCBzaGFsbCByZXNwb25kIHRoZSBmb3JtZXIgaWYKKyAgICAgICAgdGhlIHRyYW5zcG9ydCBjaG9zZW4gc3VwcG9ydHMgVW5peCBmaWxlIGRlc2NyaXB0b3IgcGFzc2luZyBhbmQKKyAgICAgICAgdGhlIHNlcnZlciBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuIEl0IHNoYWxsIHJlc3BvbmQgdGhlIGxhdHRlcgorICAgICAgICBpZiB0aGUgdHJhbnNwb3J0IGRvZXMgbm90IHN1cHBvcnQgVW5peCBmaWxlIGRlc2NyaXB0b3IKKyAgICAgICAgcGFzc2luZywgdGhlIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSwgb3IgdGhlCisgICAgICAgIHNlcnZlciBkZWNpZGVzIG5vdCB0byBlbmFibGUgZmlsZSBkZXNjcmlwdG9yIHBhc3NpbmcgZHVlIHRvCisgICAgICAgIHNlY3VyaXR5IG9yIG90aGVyIHJlYXNvbnMuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9ImF1dGgtY29tbWFuZC1hZ3JlZS11bml4LWZkIj4KKyAgICAgIDx0aXRsZT5BR1JFRV9VTklYX0ZEIENvbW1hbmQ8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBBR1JFRV9VTklYX0ZEIGNvbW1hbmQgaW5kaWNhdGVzIHRoYXQgdGhlIHNlcnZlciBzdXBwb3J0cworICAgICAgICBVbml4IGZpbGUgZGVzY3JpcHRvciBwYXNzaW5nLiBUaGlzIGNvbW1hbmQgbWF5IG9ubHkgYmUgc2VudAorICAgICAgICBhZnRlciB0aGUgY29ubmVjdGlvbiBpcyBhdXRoZW50aWNhdGVkLCBhbmQgdGhlIGNsaWVudCBzZW50CisgICAgICAgIE5FR09USUFURV9VTklYX0ZEIHRvIGVuYWJsZSBVbml4IGZpbGUgZGVzY3JpcHRvciBwYXNzaW5nLiBUaGlzCisgICAgICAgIGNvbW1hbmQgbWF5IG9ubHkgYmUgc2VudCBvbiB0cmFuc3BvcnRzIHRoYXQgc3VwcG9ydCBVbml4IGZpbGUKKyAgICAgICAgZGVzY3JpcHRvciBwYXNzaW5nLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIE9uIHJlY2VpdmluZyBBR1JFRV9VTklYX0ZEIHRoZSBjbGllbnQgbXVzdCByZXNwb25kIHdpdGggQkVHSU4sCisgICAgICAgIGZvbGxvd2VkIGJ5IGl0cyBzdHJlYW0gb2YgbWVzc2FnZXMsIG9yIGJ5IGRpc2Nvbm5lY3RpbmcuICBUaGUKKyAgICAgICAgc2VydmVyIG11c3Qgbm90IGFjY2VwdCBhZGRpdGlvbmFsIGNvbW1hbmRzIHVzaW5nIHRoaXMgcHJvdG9jb2wKKyAgICAgICAgYWZ0ZXIgdGhlIEJFR0lOIGNvbW1hbmQgaGFzIGJlZW4gcmVjZWl2ZWQuIEZ1cnRoZXIKKyAgICAgICAgY29tbXVuaWNhdGlvbiB3aWxsIGJlIGEgc3RyZWFtIG9mIEQtQnVzIG1lc3NhZ2VzIChvcHRpb25hbGx5CisgICAgICAgIGVuY3J5cHRlZCwgYXMgbmVnb3RpYXRlZCkgcmF0aGVyIHRoYW4gdGhpcyBwcm90b2NvbC4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0iYXV0aC1jb21tYW5kLWZ1dHVyZSI+CisgICAgICA8dGl0bGU+RnV0dXJlIEV4dGVuc2lvbnM8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIEZ1dHVyZSBleHRlbnNpb25zIHRvIHRoZSBhdXRoZW50aWNhdGlvbiBhbmQgbmVnb3RpYXRpb24KKyAgICAgICAgcHJvdG9jb2wgYXJlIHBvc3NpYmxlLiBGb3IgdGhhdCBuZXcgY29tbWFuZHMgbWF5IGJlCisgICAgICAgIGludHJvZHVjZWQuIElmIGEgY2xpZW50IG9yIHNlcnZlciByZWNlaXZlcyBhbiB1bmtub3duIGNvbW1hbmQKKyAgICAgICAgaXQgc2hhbGwgcmVzcG9uZCB3aXRoIEVSUk9SIGFuZCBub3QgY29uc2lkZXIgdGhpcyBmYXRhbC4gTmV3CisgICAgICAgIGNvbW1hbmRzIG1heSBiZSBpbnRyb2R1Y2VkIGJvdGggYmVmb3JlLCBhbmQgYWZ0ZXIKKyAgICAgICAgYXV0aGVudGljYXRpb24sIGkuZS4gYm90aCBiZWZvcmUgYW5kIGFmdGVyIHRoZSBPSyBjb21tYW5kLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJhdXRoLWV4YW1wbGVzIj4KKyAgICAgIDx0aXRsZT5BdXRoZW50aWNhdGlvbiBleGFtcGxlczwvdGl0bGU+CisgICAgICAKKyAgICAgIDxwYXJhPgorICAgICAgICA8ZmlndXJlPgorCSAgPHRpdGxlPkV4YW1wbGUgb2Ygc3VjY2Vzc2Z1bCBtYWdpYyBjb29raWUgYXV0aGVudGljYXRpb248L3RpdGxlPgorCSAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgKE1BR0lDX0NPT0tJRSBpcyBhIG1hZGUgdXAgbWVjaGFuaXNtKQorCisgICAgICAgICAgICBDOiBBVVRIIE1BR0lDX0NPT0tJRSAzMTM4MzYzOTM1MzMzMTM3MzkzNjM1MzgzNjM0CisgICAgICAgICAgICBTOiBPSyAxMjM0ZGVhZGJlZWYKKyAgICAgICAgICAgIEM6IEJFR0lOCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKwk8L2ZpZ3VyZT4KKyAgICAgICAgPGZpZ3VyZT4KKwkgIDx0aXRsZT5FeGFtcGxlIG9mIGZpbmRpbmcgb3V0IG1lY2hhbmlzbXMgdGhlbiBwaWNraW5nIG9uZTwvdGl0bGU+CisJICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBDOiBBVVRICisgICAgICAgICAgICBTOiBSRUpFQ1RFRCBLRVJCRVJPU19WNCBTS0VZCisgICAgICAgICAgICBDOiBBVVRIIFNLRVkgN2FiODNmMzJlZQorICAgICAgICAgICAgUzogREFUQSA4Nzk5Y2FiYjJlYTkzZQorICAgICAgICAgICAgQzogREFUQSA4YWM4NzZlOGY2OGVlOTgwOWJmYTg3NmU2Zjk4NzZnOGZhOGU3NmU5OGYKKyAgICAgICAgICAgIFM6IE9LIDEyMzRkZWFkYmVlZgorICAgICAgICAgICAgQzogQkVHSU4KKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorCTwvZmlndXJlPgorICAgICAgICA8ZmlndXJlPgorCSAgPHRpdGxlPkV4YW1wbGUgb2YgY2xpZW50IHNlbmRzIHVua25vd24gY29tbWFuZCB0aGVuIGZhbGxzIGJhY2sgdG8gcmVndWxhciBhdXRoPC90aXRsZT4KKwkgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIEM6IEZPT0JBUgorICAgICAgICAgICAgUzogRVJST1IKKyAgICAgICAgICAgIEM6IEFVVEggTUFHSUNfQ09PS0lFIDM3MzYzNDM0MzUzMTMyMzAzMzMwMzkKKyAgICAgICAgICAgIFM6IE9LIDEyMzRkZWFkYmVlZgorICAgICAgICAgICAgQzogQkVHSU4KKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorCTwvZmlndXJlPgorICAgICAgICA8ZmlndXJlPgorCSAgPHRpdGxlPkV4YW1wbGUgb2Ygc2VydmVyIGRvZXNuJ3Qgc3VwcG9ydCBpbml0aWFsIGF1dGggbWVjaGFuaXNtPC90aXRsZT4KKwkgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIEM6IEFVVEggTUFHSUNfQ09PS0lFIDM3MzYzNDM0MzUzMTMyMzAzMzMwMzkKKyAgICAgICAgICAgIFM6IFJFSkVDVEVEIEtFUkJFUk9TX1Y0IFNLRVkKKyAgICAgICAgICAgIEM6IEFVVEggU0tFWSA3YWI4M2YzMmVlCisgICAgICAgICAgICBTOiBEQVRBIDg3OTljYWJiMmVhOTNlCisgICAgICAgICAgICBDOiBEQVRBIDhhYzg3NmU4ZjY4ZWU5ODA5YmZhODc2ZTZmOTg3Nmc4ZmE4ZTc2ZTk4ZgorICAgICAgICAgICAgUzogT0sgMTIzNGRlYWRiZWVmCisgICAgICAgICAgICBDOiBCRUdJTgorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisJPC9maWd1cmU+CisgICAgICAgIDxmaWd1cmU+CisJICA8dGl0bGU+RXhhbXBsZSBvZiB3cm9uZyBwYXNzd29yZCBvciB0aGUgbGlrZSBmb2xsb3dlZCBieSBzdWNjZXNzZnVsIHJldHJ5PC90aXRsZT4KKwkgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIEM6IEFVVEggTUFHSUNfQ09PS0lFIDM3MzYzNDM0MzUzMTMyMzAzMzMwMzkKKyAgICAgICAgICAgIFM6IFJFSkVDVEVEIEtFUkJFUk9TX1Y0IFNLRVkKKyAgICAgICAgICAgIEM6IEFVVEggU0tFWSA3YWI4M2YzMmVlCisgICAgICAgICAgICBTOiBEQVRBIDg3OTljYWJiMmVhOTNlCisgICAgICAgICAgICBDOiBEQVRBIDhhYzg3NmU4ZjY4ZWU5ODA5YmZhODc2ZTZmOTg3Nmc4ZmE4ZTc2ZTk4ZgorICAgICAgICAgICAgUzogUkVKRUNURUQKKyAgICAgICAgICAgIEM6IEFVVEggU0tFWSA3YWI4M2YzMmVlCisgICAgICAgICAgICBTOiBEQVRBIDg3OTljYWJiMmVhOTNlCisgICAgICAgICAgICBDOiBEQVRBIDhhYzg3NmU4ZjY4ZWU5ODA5YmZhODc2ZTZmOTg3Nmc4ZmE4ZTc2ZTk4ZgorICAgICAgICAgICAgUzogT0sgMTIzNGRlYWRiZWVmCisgICAgICAgICAgICBDOiBCRUdJTgorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisJPC9maWd1cmU+CisgICAgICAgIDxmaWd1cmU+CisJICA8dGl0bGU+RXhhbXBsZSBvZiBza2V5IGNhbmNlbGxlZCBhbmQgcmVzdGFydGVkPC90aXRsZT4KKwkgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIEM6IEFVVEggTUFHSUNfQ09PS0lFIDM3MzYzNDM0MzUzMTMyMzAzMzMwMzkKKyAgICAgICAgICAgIFM6IFJFSkVDVEVEIEtFUkJFUk9TX1Y0IFNLRVkKKyAgICAgICAgICAgIEM6IEFVVEggU0tFWSA3YWI4M2YzMmVlCisgICAgICAgICAgICBTOiBEQVRBIDg3OTljYWJiMmVhOTNlCisgICAgICAgICAgICBDOiBDQU5DRUwKKyAgICAgICAgICAgIFM6IFJFSkVDVEVECisgICAgICAgICAgICBDOiBBVVRIIFNLRVkgN2FiODNmMzJlZQorICAgICAgICAgICAgUzogREFUQSA4Nzk5Y2FiYjJlYTkzZQorICAgICAgICAgICAgQzogREFUQSA4YWM4NzZlOGY2OGVlOTgwOWJmYTg3NmU2Zjk4NzZnOGZhOGU3NmU5OGYKKyAgICAgICAgICAgIFM6IE9LIDEyMzRkZWFkYmVlZgorICAgICAgICAgICAgQzogQkVHSU4KKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorCTwvZmlndXJlPgorICAgICAgICA8ZmlndXJlPgorCSAgPHRpdGxlPkV4YW1wbGUgb2Ygc3VjY2Vzc2Z1bCBtYWdpYyBjb29raWUgYXV0aGVudGljYXRpb24gd2l0aCBzdWNjZXNzZnVsIG5lZ290aWF0aW9uIG9mIFVuaXggRkQgcGFzc2luZzwvdGl0bGU+CisJICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAoTUFHSUNfQ09PS0lFIGlzIGEgbWFkZSB1cCBtZWNoYW5pc20pCisKKyAgICAgICAgICAgIEM6IEFVVEggTUFHSUNfQ09PS0lFIDMxMzgzNjM5MzUzMzMxMzczOTM2MzUzODM2MzQKKyAgICAgICAgICAgIFM6IE9LIDEyMzRkZWFkYmVlZgorICAgICAgICAgICAgQzogTkVHT1RJQVRFX1VOSVhfRkQKKyAgICAgICAgICAgIFM6IEFHUkVFX1VOSVhfRkQKKyAgICAgICAgICAgIEM6IEJFR0lOCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKwk8L2ZpZ3VyZT4KKyAgICAgICAgPGZpZ3VyZT4KKwkgIDx0aXRsZT5FeGFtcGxlIG9mIHN1Y2Nlc3NmdWwgbWFnaWMgY29va2llIGF1dGhlbnRpY2F0aW9uIHdpdGggdW5zdWNjZXNzZnVsIG5lZ290aWF0aW9uIG9mIFVuaXggRkQgcGFzc2luZzwvdGl0bGU+CisJICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAoTUFHSUNfQ09PS0lFIGlzIGEgbWFkZSB1cCBtZWNoYW5pc20pCisKKyAgICAgICAgICAgIEM6IEFVVEggTUFHSUNfQ09PS0lFIDMxMzgzNjM5MzUzMzMxMzczOTM2MzUzODM2MzQKKyAgICAgICAgICAgIFM6IE9LIDEyMzRkZWFkYmVlZgorICAgICAgICAgICAgQzogTkVHT1RJQVRFX1VOSVhfRkQKKyAgICAgICAgICAgIFM6IEVSUk9SCisgICAgICAgICAgICBDOiBCRUdJTgorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisJPC9maWd1cmU+CisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9ImF1dGgtc3RhdGVzIj4KKyAgICAgIDx0aXRsZT5BdXRoZW50aWNhdGlvbiBzdGF0ZSBkaWFncmFtczwvdGl0bGU+CisgICAgICAKKyAgICAgIDxwYXJhPgorICAgICAgICBUaGlzIHNlY3Rpb24gZG9jdW1lbnRzIHRoZSBhdXRoIHByb3RvY29sIGluIHRlcm1zIG9mIAorICAgICAgICBhIHN0YXRlIG1hY2hpbmUgZm9yIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuIFRoaXMgaXMgCisgICAgICAgIHByb2JhYmx5IHRoZSBtb3N0IHJvYnVzdCB3YXkgdG8gaW1wbGVtZW50IHRoZSBwcm90b2NvbC4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHNlY3QzIGlkPSJhdXRoLXN0YXRlcy1jbGllbnQiPgorICAgICAgICA8dGl0bGU+Q2xpZW50IHN0YXRlczwvdGl0bGU+CisgICAgICAgIAorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUbyBtb3JlIHByZWNpc2VseSBkZXNjcmliZSB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUKKyAgICAgICAgICBwcm90b2NvbCBzdGF0ZSBtYWNoaW5lIGFuZCB0aGUgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyB0aGUKKyAgICAgICAgICBmb2xsb3dpbmcgbm90YXRpb24gaXMgdXNlZDogTUVDSChDSEFMTCkgbWVhbnMgdGhhdCB0aGUKKyAgICAgICAgICBzZXJ2ZXIgY2hhbGxlbmdlIENIQUxMIHdhcyBmZWQgdG8gdGhlIG1lY2hhbmlzbSBNRUNILCB3aGljaAorICAgICAgICAgIHJldHVybnMgb25lIG9mCisKKyAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBDT05USU5VRShSRVNQKSBtZWFucyBjb250aW51ZSB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAgICAgICAgICAgICAgICBhbmQgc2VuZCBSRVNQIGFzIHRoZSByZXNwb25zZSB0byB0aGUgc2VydmVyOworICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIE9LKFJFU1ApIG1lYW5zIHRoYXQgYWZ0ZXIgc2VuZGluZyBSRVNQIHRvIHRoZSBzZXJ2ZXIKKyAgICAgICAgICAgICAgICB0aGUgY2xpZW50IHNpZGUgb2YgdGhlIGF1dGggY29udmVyc2F0aW9uIGlzIGZpbmlzaGVkCisgICAgICAgICAgICAgICAgYW5kIHRoZSBzZXJ2ZXIgc2hvdWxkIHJldHVybiAiT0siOworICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEVSUk9SIG1lYW5zIHRoYXQgQ0hBTEwgd2FzIGludmFsaWQgYW5kIGNvdWxkIG5vdCBiZQorICAgICAgICAgICAgICAgIHByb2Nlc3NlZC4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAKKyAgICAgICAgICBCb3RoIFJFU1AgYW5kIENIQUxMIG1heSBiZSBlbXB0eS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICAKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlIENsaWVudCBzdGFydHMgYnkgZ2V0dGluZyBhbiBpbml0aWFsIHJlc3BvbnNlIGZyb20gdGhlCisgICAgICAgICAgZGVmYXVsdCBtZWNoYW5pc20gYW5kIHNlbmRzIEFVVEggTUVDSCBSRVNQLCBvciBBVVRIIE1FQ0ggaWYKKyAgICAgICAgICB0aGUgbWVjaGFuaXNtIGRpZCBub3QgcHJvdmlkZSBhbiBpbml0aWFsIHJlc3BvbnNlLiAgSWYgdGhlCisgICAgICAgICAgbWVjaGFuaXNtIHJldHVybnMgQ09OVElOVUUsIHRoZSBjbGllbnQgc3RhcnRzIGluIHN0YXRlCisgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JEYXRhPC9lbXBoYXNpcz4sIGlmIHRoZSBtZWNoYW5pc20KKyAgICAgICAgICByZXR1cm5zIE9LIHRoZSBjbGllbnQgc3RhcnRzIGluIHN0YXRlCisgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JPSzwvZW1waGFzaXM+LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIAorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgY2xpZW50IHNob3VsZCBrZWVwIHRyYWNrIG9mIGF2YWlsYWJsZSBtZWNoYW5pc21zIGFuZAorICAgICAgICAgIHdoaWNoIGl0IG1lY2hhbmlzbXMgaXQgaGFzIGFscmVhZHkgYXR0ZW1wdGVkLiBUaGlzIGxpc3QgaXMKKyAgICAgICAgICB1c2VkIHRvIGRlY2lkZSB3aGljaCBBVVRIIGNvbW1hbmQgdG8gc2VuZC4gV2hlbiB0aGUgbGlzdCBpcworICAgICAgICAgIGV4aGF1c3RlZCwgdGhlIGNsaWVudCBzaG91bGQgZ2l2ZSB1cCBhbmQgY2xvc2UgdGhlCisgICAgICAgICAgY29ubmVjdGlvbi4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxmb3JtYWxwYXJhPgorICAgICAgICAgIDx0aXRsZT48ZW1waGFzaXM+V2FpdGluZ0ZvckRhdGE8L2VtcGhhc2lzPjwvdGl0bGU+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIERBVEEgQ0hBTEwKKyAgICAgICAgICAgICAgICAgIDxzaW1wbGVsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bWVtYmVyPgorICAgICAgICAgICAgICAgICAgICAgIE1FQ0goQ0hBTEwpIHJldHVybnMgQ09OVElOVUUoUkVTUCkgJnJhcnI7IHNlbmQKKyAgICAgICAgICAgICAgICAgICAgICBEQVRBIFJFU1AsIGdvdG8KKyAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvckRhdGE8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L21lbWJlcj4KKworICAgICAgICAgICAgICAgICAgICA8bWVtYmVyPgorICAgICAgICAgICAgICAgICAgICAgIE1FQ0goQ0hBTEwpIHJldHVybnMgT0soUkVTUCkgJnJhcnI7IHNlbmQgREFUQQorICAgICAgICAgICAgICAgICAgICAgIFJFU1AsIGdvdG8gPGVtcGhhc2lzPldhaXRpbmdGb3JPSzwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvbWVtYmVyPgorCisgICAgICAgICAgICAgICAgICAgIDxtZW1iZXI+CisgICAgICAgICAgICAgICAgICAgICAgTUVDSChDSEFMTCkgcmV0dXJucyBFUlJPUiAmcmFycjsgc2VuZCBFUlJPUgorICAgICAgICAgICAgICAgICAgICAgIFttc2ddLCBnb3RvIDxlbXBoYXNpcz5XYWl0aW5nRm9yRGF0YTwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvbWVtYmVyPgorICAgICAgICAgICAgICAgICAgPC9zaW1wbGVsaXN0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIFJFSkVDVEVEIFttZWNoc10gJnJhcnI7CisgICAgICAgICAgICAgICAgICBzZW5kIEFVVEggW25leHQgbWVjaF0sIGdvdG8KKyAgICAgICAgICAgICAgICAgIFdhaXRpbmdGb3JEYXRhIG9yIDxlbXBoYXNpcz5XYWl0aW5nRm9yT0s8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBFUlJPUiAmcmFycjsgc2VuZAorICAgICAgICAgICAgICAgICAgQ0FOQ0VMLCBnb3RvCisgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvclJlamVjdDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIE9LICZyYXJyOyBzZW5kCisgICAgICAgICAgICAgICAgICBCRUdJTiwgdGVybWluYXRlIGF1dGgKKyAgICAgICAgICAgICAgICAgIGNvbnZlcnNhdGlvbiwgYXV0aGVudGljYXRlZAorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBhbnl0aGluZyBlbHNlICZyYXJyOyBzZW5kCisgICAgICAgICAgICAgICAgICBFUlJPUiwgZ290bworICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JEYXRhPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvZm9ybWFscGFyYT4KKworICAgICAgICA8Zm9ybWFscGFyYT4KKyAgICAgICAgICA8dGl0bGU+PGVtcGhhc2lzPldhaXRpbmdGb3JPSzwvZW1waGFzaXM+PC90aXRsZT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgT0sgJnJhcnI7IHNlbmQgQkVHSU4sIHRlcm1pbmF0ZSBhdXRoCisgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb24sIDxlbXBoYXNpcz5hdXRoZW50aWNhdGVkPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgUkVKRUNUIFttZWNoc10gJnJhcnI7IHNlbmQgQVVUSCBbbmV4dCBtZWNoXSwKKyAgICAgICAgICAgICAgICAgIGdvdG8gPGVtcGhhc2lzPldhaXRpbmdGb3JEYXRhPC9lbXBoYXNpcz4gb3IKKyAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yT0s8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIERBVEEgJnJhcnI7IHNlbmQgQ0FOQ0VMLCBnb3RvCisgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvclJlamVjdDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgRVJST1IgJnJhcnI7IHNlbmQgQ0FOQ0VMLCBnb3RvCisgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvclJlamVjdDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgYW55dGhpbmcgZWxzZSAmcmFycjsgc2VuZCBFUlJPUiwgZ290bworICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JPSzwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2Zvcm1hbHBhcmE+CisKKyAgICAgICAgPGZvcm1hbHBhcmE+CisgICAgICAgICAgPHRpdGxlPjxlbXBoYXNpcz5XYWl0aW5nRm9yUmVqZWN0PC9lbXBoYXNpcz48L3RpdGxlPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBSRUpFQ1QgW21lY2hzXSAmcmFycjsgc2VuZCBBVVRIIFtuZXh0IG1lY2hdLAorICAgICAgICAgICAgICAgICAgZ290byA8ZW1waGFzaXM+V2FpdGluZ0ZvckRhdGE8L2VtcGhhc2lzPiBvcgorICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JPSzwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgYW55dGhpbmcgZWxzZSAmcmFycjsgdGVybWluYXRlIGF1dGgKKyAgICAgICAgICAgICAgICAgIGNvbnZlcnNhdGlvbiwgZGlzY29ubmVjdAorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9mb3JtYWxwYXJhPgorCisgICAgICA8L3NlY3QzPgorCisgICAgICA8c2VjdDMgaWQ9ImF1dGgtc3RhdGVzLXNlcnZlciI+CisgICAgICAgIDx0aXRsZT5TZXJ2ZXIgc3RhdGVzPC90aXRsZT4KKyAKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRm9yIHRoZSBzZXJ2ZXIgTUVDSChSRVNQKSBtZWFucyB0aGF0IHRoZSBjbGllbnQgcmVzcG9uc2UKKyAgICAgICAgICBSRVNQIHdhcyBmZWQgdG8gdGhlIHRoZSBtZWNoYW5pc20gTUVDSCwgd2hpY2ggcmV0dXJucyBvbmUgb2YKKworICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIENPTlRJTlVFKENIQUxMKSBtZWFucyBjb250aW51ZSB0aGUgYXV0aCBjb252ZXJzYXRpb24gYW5kCisgICAgICAgICAgICAgICAgc2VuZCBDSEFMTCBhcyB0aGUgY2hhbGxlbmdlIHRvIHRoZSBjbGllbnQ7CisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgT0sgbWVhbnMgdGhhdCB0aGUgY2xpZW50IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseQorICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWQ7CisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgUkVKRUNUIG1lYW5zIHRoYXQgdGhlIGNsaWVudCBmYWlsZWQgdG8gYXV0aGVudGljYXRlIG9yCisgICAgICAgICAgICAgICAgdGhlcmUgd2FzIGFuIGVycm9yIGluIFJFU1AuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisKKyAgICAgICAgICBUaGUgc2VydmVyIHN0YXJ0cyBvdXQgaW4gc3RhdGUKKyAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvckF1dGg8L2VtcGhhc2lzPi4gIElmIHRoZSBjbGllbnQgaXMKKyAgICAgICAgICByZWplY3RlZCB0b28gbWFueSB0aW1lcyB0aGUgc2VydmVyIG11c3QgZGlzY29ubmVjdCB0aGUKKyAgICAgICAgICBjbGllbnQuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8Zm9ybWFscGFyYT4KKyAgICAgICAgICA8dGl0bGU+PGVtcGhhc2lzPldhaXRpbmdGb3JBdXRoPC9lbXBoYXNpcz48L3RpdGxlPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKworICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIEFVVEggJnJhcnI7IHNlbmQgUkVKRUNURUQgW21lY2hzXSwgZ290bworICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JBdXRoPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBBVVRIIE1FQ0ggUkVTUAorCisgICAgICAgICAgICAgICAgICA8c2ltcGxlbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPG1lbWJlcj4KKyAgICAgICAgICAgICAgICAgICAgICBNRUNIIG5vdCB2YWxpZCBtZWNoYW5pc20gJnJhcnI7IHNlbmQgUkVKRUNURUQKKyAgICAgICAgICAgICAgICAgICAgICBbbWVjaHNdLCBnb3RvCisgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JBdXRoPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9tZW1iZXI+CisKKyAgICAgICAgICAgICAgICAgICAgPG1lbWJlcj4KKyAgICAgICAgICAgICAgICAgICAgICBNRUNIKFJFU1ApIHJldHVybnMgQ09OVElOVUUoQ0hBTEwpICZyYXJyOyBzZW5kCisgICAgICAgICAgICAgICAgICAgICAgREFUQSBDSEFMTCwgZ290bworICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yRGF0YTwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvbWVtYmVyPgorCisgICAgICAgICAgICAgICAgICAgIDxtZW1iZXI+CisgICAgICAgICAgICAgICAgICAgICAgTUVDSChSRVNQKSByZXR1cm5zIE9LICZyYXJyOyBzZW5kIE9LLCBnb3RvCisgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JCZWdpbjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvbWVtYmVyPgorCisgICAgICAgICAgICAgICAgICAgIDxtZW1iZXI+CisgICAgICAgICAgICAgICAgICAgICAgTUVDSChSRVNQKSByZXR1cm5zIFJFSkVDVCAmcmFycjsgc2VuZCBSRUpFQ1RFRAorICAgICAgICAgICAgICAgICAgICAgIFttZWNoc10sIGdvdG8KKyAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvckF1dGg8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L21lbWJlcj4KKyAgICAgICAgICAgICAgICAgIDwvc2ltcGxlbGlzdD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBCRUdJTiAmcmFycjsgdGVybWluYXRlCisgICAgICAgICAgICAgICAgICBhdXRoIGNvbnZlcnNhdGlvbiwgZGlzY29ubmVjdAorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIEVSUk9SICZyYXJyOyBzZW5kIFJFSkVDVEVEIFttZWNoc10sIGdvdG8KKyAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yQXV0aDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgYW55dGhpbmcgZWxzZSAmcmFycjsgc2VuZAorICAgICAgICAgICAgICAgICAgRVJST1IsIGdvdG8KKyAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yQXV0aDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2Zvcm1hbHBhcmE+CisKKyAgICAgICAKKyAgICAgICAgPGZvcm1hbHBhcmE+CisgICAgICAgICAgPHRpdGxlPjxlbXBoYXNpcz5XYWl0aW5nRm9yRGF0YTwvZW1waGFzaXM+PC90aXRsZT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgREFUQSBSRVNQCisgICAgICAgICAgICAgICAgICA8c2ltcGxlbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPG1lbWJlcj4KKyAgICAgICAgICAgICAgICAgICAgICBNRUNIKFJFU1ApIHJldHVybnMgQ09OVElOVUUoQ0hBTEwpICZyYXJyOyBzZW5kCisgICAgICAgICAgICAgICAgICAgICAgREFUQSBDSEFMTCwgZ290bworICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yRGF0YTwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvbWVtYmVyPgorCisgICAgICAgICAgICAgICAgICAgIDxtZW1iZXI+CisgICAgICAgICAgICAgICAgICAgICAgTUVDSChSRVNQKSByZXR1cm5zIE9LICZyYXJyOyBzZW5kIE9LLCBnb3RvCisgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JCZWdpbjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvbWVtYmVyPgorCisgICAgICAgICAgICAgICAgICAgIDxtZW1iZXI+CisgICAgICAgICAgICAgICAgICAgICAgTUVDSChSRVNQKSByZXR1cm5zIFJFSkVDVCAmcmFycjsgc2VuZCBSRUpFQ1RFRAorICAgICAgICAgICAgICAgICAgICAgIFttZWNoc10sIGdvdG8KKyAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvckF1dGg8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L21lbWJlcj4KKyAgICAgICAgICAgICAgICAgIDwvc2ltcGxlbGlzdD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBCRUdJTiAmcmFycjsgdGVybWluYXRlIGF1dGggY29udmVyc2F0aW9uLAorICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdAorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIENBTkNFTCAmcmFycjsgc2VuZCBSRUpFQ1RFRCBbbWVjaHNdLCBnb3RvCisgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvckF1dGg8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIEVSUk9SICZyYXJyOyBzZW5kIFJFSkVDVEVEIFttZWNoc10sIGdvdG8KKyAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yQXV0aDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgYW55dGhpbmcgZWxzZSAmcmFycjsgc2VuZCBFUlJPUiwgZ290bworICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JEYXRhPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvZm9ybWFscGFyYT4KKworICAgICAgICA8Zm9ybWFscGFyYT4KKyAgICAgICAgICA8dGl0bGU+PGVtcGhhc2lzPldhaXRpbmdGb3JCZWdpbjwvZW1waGFzaXM+PC90aXRsZT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgQkVHSU4gJnJhcnI7IHRlcm1pbmF0ZSBhdXRoIGNvbnZlcnNhdGlvbiwKKyAgICAgICAgICAgICAgICAgIGNsaWVudCBhdXRoZW50aWNhdGVkCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgQ0FOQ0VMICZyYXJyOyBzZW5kIFJFSkVDVEVEIFttZWNoc10sIGdvdG8KKyAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yQXV0aDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgRVJST1IgJnJhcnI7IHNlbmQgUkVKRUNURUQgW21lY2hzXSwgZ290bworICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JBdXRoPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBhbnl0aGluZyBlbHNlICZyYXJyOyBzZW5kIEVSUk9SLCBnb3RvCisgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvckJlZ2luPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvZm9ybWFscGFyYT4KKworICAgICAgPC9zZWN0Mz4KKyAgICAgIAorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJhdXRoLW1lY2hhbmlzbXMiPgorICAgICAgPHRpdGxlPkF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXM8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgc29tZSBuZXcgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcy4KKyAgICAgICAgRC1CdXMgYWxzbyBhbGxvd3MgYW55IHN0YW5kYXJkIFNBU0wgbWVjaGFuaXNtIG9mIGNvdXJzZS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxzZWN0MyBpZD0iYXV0aC1tZWNoYW5pc21zLXNoYSI+CisgICAgICAgIDx0aXRsZT5EQlVTX0NPT0tJRV9TSEExPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlIERCVVNfQ09PS0lFX1NIQTEgbWVjaGFuaXNtIGlzIGRlc2lnbmVkIHRvIGVzdGFibGlzaCB0aGF0IGEgY2xpZW50CisgICAgICAgICAgaGFzIHRoZSBhYmlsaXR5IHRvIHJlYWQgYSBwcml2YXRlIGZpbGUgb3duZWQgYnkgdGhlIHVzZXIgYmVpbmcKKyAgICAgICAgICBhdXRoZW50aWNhdGVkLiBJZiB0aGUgY2xpZW50IGNhbiBwcm92ZSB0aGF0IGl0IGhhcyBhY2Nlc3MgdG8gYSBzZWNyZXQKKyAgICAgICAgICBjb29raWUgc3RvcmVkIGluIHRoaXMgZmlsZSwgdGhlbiB0aGUgY2xpZW50IGlzIGF1dGhlbnRpY2F0ZWQuIAorICAgICAgICAgIFRodXMgdGhlIHNlY3VyaXR5IG9mIERCVVNfQ09PS0lFX1NIQTEgZGVwZW5kcyBvbiBhIHNlY3VyZSBob21lIAorICAgICAgICAgIGRpcmVjdG9yeS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaHJvdWdob3V0IHRoaXMgZGVzY3JpcHRpb24sICJoZXggZW5jb2RpbmciIG11c3Qgb3V0cHV0IHRoZSBkaWdpdHMKKyAgICAgICAgICBmcm9tIGEgdG8gZiBpbiBsb3dlci1jYXNlOyB0aGUgZGlnaXRzIEEgdG8gRiBtdXN0IG5vdCBiZSB1c2VkCisgICAgICAgICAgaW4gdGhlIERCVVNfQ09PS0lFX1NIQTEgbWVjaGFuaXNtLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEF1dGhlbnRpY2F0aW9uIHByb2NlZWRzIGFzIGZvbGxvd3M6CisgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIGNsaWVudCBzZW5kcyB0aGUgdXNlcm5hbWUgaXQgd291bGQgbGlrZSB0byBhdXRoZW50aWNhdGUgCisgICAgICAgICAgICAgICAgYXMsIGhleC1lbmNvZGVkLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgc2VydmVyIHNlbmRzIHRoZSBuYW1lIG9mIGl0cyAiY29va2llIGNvbnRleHQiIChzZWUgYmVsb3cpOyBhCisgICAgICAgICAgICAgICAgc3BhY2UgY2hhcmFjdGVyOyB0aGUgaW50ZWdlciBJRCBvZiB0aGUgc2VjcmV0IGNvb2tpZSB0aGUgY2xpZW50CisgICAgICAgICAgICAgICAgbXVzdCBkZW1vbnN0cmF0ZSBrbm93bGVkZ2Ugb2Y7IGEgc3BhY2UgY2hhcmFjdGVyOyB0aGVuIGEKKyAgICAgICAgICAgICAgICByYW5kb21seS1nZW5lcmF0ZWQgY2hhbGxlbmdlIHN0cmluZywgYWxsIG9mIHRoaXMgaGV4LWVuY29kZWQgaW50bworICAgICAgICAgICAgICAgIG9uZSwgc2luZ2xlIHN0cmluZy4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIGNsaWVudCBsb2NhdGVzIHRoZSBjb29raWUgYW5kIGdlbmVyYXRlcyBpdHMgb3duCisgICAgICAgICAgICAgICAgcmFuZG9tbHktZ2VuZXJhdGVkIGNoYWxsZW5nZSBzdHJpbmcuIFRoZSBjbGllbnQgdGhlbiBjb25jYXRlbmF0ZXMKKyAgICAgICAgICAgICAgICB0aGUgc2VydmVyJ3MgZGVjb2RlZCBjaGFsbGVuZ2UsIGEgIjoiIGNoYXJhY3RlciwgaXRzIG93biBjaGFsbGVuZ2UsCisgICAgICAgICAgICAgICAgYW5vdGhlciAiOiIgY2hhcmFjdGVyLCBhbmQgdGhlIGNvb2tpZS4gSXQgY29tcHV0ZXMgdGhlIFNIQS0xIGhhc2gKKyAgICAgICAgICAgICAgICBvZiB0aGlzIGNvbXBvc2l0ZSBzdHJpbmcgYXMgYSBoZXggZGlnZXN0LiBJdCBjb25jYXRlbmF0ZXMgdGhlCisgICAgICAgICAgICAgICAgY2xpZW50J3MgY2hhbGxlbmdlIHN0cmluZywgYSBzcGFjZSBjaGFyYWN0ZXIsIGFuZCB0aGUgU0hBLTEgaGV4CisgICAgICAgICAgICAgICAgZGlnZXN0LCBoZXgtZW5jb2RlcyB0aGUgcmVzdWx0IGFuZCBzZW5kcyBpdCBiYWNrIHRvIHRoZSBzZXJ2ZXIuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSBzZXJ2ZXIgZ2VuZXJhdGVzIHRoZSBzYW1lIGNvbmNhdGVuYXRlZCBzdHJpbmcgdXNlZCBieSB0aGUKKyAgICAgICAgICAgICAgICBjbGllbnQgYW5kIGNvbXB1dGVzIGl0cyBTSEEtMSBoYXNoLiBJdCBjb21wYXJlcyB0aGUgaGFzaCB3aXRoCisgICAgICAgICAgICAgICAgdGhlIGhhc2ggcmVjZWl2ZWQgZnJvbSB0aGUgY2xpZW50OyBpZiB0aGUgdHdvIGhhc2hlcyBtYXRjaCwgdGhlCisgICAgICAgICAgICAgICAgY2xpZW50IGlzIGF1dGhlbnRpY2F0ZWQuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRWFjaCBzZXJ2ZXIgaGFzIGEgImNvb2tpZSBjb250ZXh0LCIgd2hpY2ggaXMgYSBuYW1lIHRoYXQgaWRlbnRpZmllcyBhCisgICAgICAgICAgc2V0IG9mIGNvb2tpZXMgdGhhdCBhcHBseSB0byB0aGF0IHNlcnZlci4gQSBzYW1wbGUgY29udGV4dCBtaWdodCBiZQorICAgICAgICAgICJvcmdfZnJlZWRlc2t0b3Bfc2Vzc2lvbl9idXMiLiBDb250ZXh0IG5hbWVzIG11c3QgYmUgdmFsaWQgQVNDSUksCisgICAgICAgICAgbm9uemVybyBsZW5ndGgsIGFuZCBtYXkgbm90IGNvbnRhaW4gdGhlIGNoYXJhY3RlcnMgc2xhc2ggKCIvIiksCisgICAgICAgICAgYmFja3NsYXNoICgiXCIpLCBzcGFjZSAoIiAiKSwgbmV3bGluZSAoIlxuIiksIGNhcnJpYWdlIHJldHVybiAoIlxyIiksCisgICAgICAgICAgdGFiICgiXHQiKSwgb3IgcGVyaW9kICgiLiIpLiBUaGVyZSBpcyBhIGRlZmF1bHQgY29udGV4dCwKKyAgICAgICAgICAib3JnX2ZyZWVkZXNrdG9wX2dlbmVyYWwiIHRoYXQncyB1c2VkIGJ5IHNlcnZlcnMgdGhhdCBkbyBub3Qgc3BlY2lmeQorICAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBDb29raWVzIGFyZSBzdG9yZWQgaW4gYSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnksIGluIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICA8ZmlsZW5hbWU+fi8uZGJ1cy1rZXlyaW5ncy88L2ZpbGVuYW1lPi4gVGhpcyBkaXJlY3RvcnkgbXVzdCAKKyAgICAgICAgICBub3QgYmUgcmVhZGFibGUgb3Igd3JpdGFibGUgYnkgb3RoZXIgdXNlcnMuIElmIGl0IGlzLCAKKyAgICAgICAgICBjbGllbnRzIGFuZCBzZXJ2ZXJzIG11c3QgaWdub3JlIGl0LiBUaGUgZGlyZWN0b3J5IAorICAgICAgICAgIGNvbnRhaW5zIGNvb2tpZSBmaWxlcyBuYW1lZCBhZnRlciB0aGUgY29va2llIGNvbnRleHQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQSBjb29raWUgZmlsZSBjb250YWlucyBvbmUgY29va2llIHBlciBsaW5lLiBFYWNoIGxpbmUgCisgICAgICAgICAgaGFzIHRocmVlIHNwYWNlLXNlcGFyYXRlZCBmaWVsZHM6CisgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIGNvb2tpZSBJRCBudW1iZXIsIHdoaWNoIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciBhbmQKKyAgICAgICAgICAgICAgICBtYXkgbm90IGJlIHVzZWQgdHdpY2UgaW4gdGhlIHNhbWUgZmlsZS4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIGNvb2tpZSdzIGNyZWF0aW9uIHRpbWUsIGluIFVOSVggc2Vjb25kcy1zaW5jZS10aGUtZXBvY2gKKyAgICAgICAgICAgICAgICBmb3JtYXQuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSBjb29raWUgaXRzZWxmLCBhIGhleC1lbmNvZGVkIHJhbmRvbSBibG9jayBvZiBieXRlcy4gVGhlIGNvb2tpZQorICAgICAgICAgICAgICAgIG1heSBiZSBvZiBhbnkgbGVuZ3RoLCB0aG91Z2ggb2J2aW91c2x5IHNlY3VyaXR5IGluY3JlYXNlcyAKKyAgICAgICAgICAgICAgICBhcyB0aGUgbGVuZ3RoIGluY3JlYXNlcy4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBPbmx5IHNlcnZlciBwcm9jZXNzZXMgbW9kaWZ5IHRoZSBjb29raWUgZmlsZS4KKyAgICAgICAgICBUaGV5IG11c3QgZG8gc28gd2l0aCB0aGlzIHByb2NlZHVyZToKKyAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBDcmVhdGUgYSBsb2NrZmlsZSBuYW1lIGJ5IGFwcGVuZGluZyAiLmxvY2siIHRvIHRoZSBuYW1lIG9mIHRoZQorICAgICAgICAgICAgICAgIGNvb2tpZSBmaWxlLiAgVGhlIHNlcnZlciBzaG91bGQgYXR0ZW1wdCB0byBjcmVhdGUgdGhpcyBmaWxlCisgICAgICAgICAgICAgICAgdXNpbmcgPGxpdGVyYWw+T19DUkVBVCB8IE9fRVhDTDwvbGl0ZXJhbD4uICBJZiBmaWxlIGNyZWF0aW9uCisgICAgICAgICAgICAgICAgZmFpbHMsIHRoZSBsb2NrIGZhaWxzLiBTZXJ2ZXJzIHNob3VsZCByZXRyeSBmb3IgYSByZWFzb25hYmxlCisgICAgICAgICAgICAgICAgcGVyaW9kIG9mIHRpbWUsIHRoZW4gdGhleSBtYXkgY2hvb3NlIHRvIGRlbGV0ZSBhbiBleGlzdGluZyBsb2NrCisgICAgICAgICAgICAgICAgdG8ga2VlcCB1c2VycyBmcm9tIGhhdmluZyB0byBtYW51YWxseSBkZWxldGUgYSBzdGFsZQorICAgICAgICAgICAgICAgIGxvY2suIDxmb290bm90ZT48cGFyYT5Mb2NrZmlsZXMgYXJlIHVzZWQgaW5zdGVhZCBvZiByZWFsIGZpbGUKKyAgICAgICAgICAgICAgICBsb2NraW5nIDxsaXRlcmFsPmZjbnRsKCk8L2xpdGVyYWw+IGJlY2F1c2UgcmVhbCBsb2NraW5nCisgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zIGFyZSBzdGlsbCBmbGFreSBvbiBuZXR3b3JrCisgICAgICAgICAgICAgICAgZmlsZXN5c3RlbXMuPC9wYXJhPjwvZm9vdG5vdGU+CisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIE9uY2UgdGhlIGxvY2tmaWxlIGhhcyBiZWVuIGNyZWF0ZWQsIHRoZSBzZXJ2ZXIgbG9hZHMgdGhlIGNvb2tpZQorICAgICAgICAgICAgICAgIGZpbGUuIEl0IHNob3VsZCB0aGVuIGRlbGV0ZSBhbnkgY29va2llcyB0aGF0IGFyZSBvbGQgKHRoZQorICAgICAgICAgICAgICAgIHRpbWVvdXQgY2FuIGJlIGZhaXJseSBzaG9ydCksIG9yIG1vcmUgdGhhbiBhIHJlYXNvbmFibGUKKyAgICAgICAgICAgICAgICB0aW1lIGluIHRoZSBmdXR1cmUgKHNvIHRoYXQgY29va2llcyBuZXZlciBhY2NpZGVudGFsbHkgCisgICAgICAgICAgICAgICAgYmVjb21lIHBlcm1hbmVudCwgaWYgdGhlIGNsb2NrIHdhcyBzZXQgZmFyIGludG8gdGhlIGZ1dHVyZSAKKyAgICAgICAgICAgICAgICBhdCBzb21lIHBvaW50KS4gSWYgbm8gcmVjZW50IGtleXMgcmVtYWluLCB0aGUgCisgICAgICAgICAgICAgICAgc2VydmVyIG1heSBnZW5lcmF0ZSBhIG5ldyBrZXkuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSBwcnVuZWQgYW5kIHBvc3NpYmx5IGFkZGVkLXRvIGNvb2tpZSBmaWxlIAorICAgICAgICAgICAgICAgIG11c3QgYmUgcmVzYXZlZCBhdG9taWNhbGx5ICh1c2luZyBhIHRlbXBvcmFyeSAKKyAgICAgICAgICAgICAgICBmaWxlIHdoaWNoIGlzIHJlbmFtZSgpJ2QpLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgbG9jayBtdXN0IGJlIGRyb3BwZWQgYnkgZGVsZXRpbmcgdGhlIGxvY2tmaWxlLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIENsaWVudHMgbmVlZCBub3QgbG9jayB0aGUgZmlsZSBpbiBvcmRlciB0byBsb2FkIGl0LCAKKyAgICAgICAgICBiZWNhdXNlIHNlcnZlcnMgYXJlIHJlcXVpcmVkIHRvIHNhdmUgdGhlIGZpbGUgYXRvbWljYWxseS4gICAgICAgICAgCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgPC9zZWN0Mj4KKyAgPC9zZWN0MT4KKyAgPHNlY3QxIGlkPSJhZGRyZXNzZXMiPgorICAgIDx0aXRsZT5TZXJ2ZXIgQWRkcmVzc2VzPC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgIFNlcnZlciBhZGRyZXNzZXMgY29uc2lzdCBvZiBhIHRyYW5zcG9ydCBuYW1lIGZvbGxvd2VkIGJ5IGEgY29sb24sIGFuZAorICAgICAgdGhlbiBhbiBvcHRpb25hbCwgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Yga2V5cyBhbmQgdmFsdWVzIGluIHRoZSBmb3JtIGtleT12YWx1ZS4KKyAgICAgIEVhY2ggdmFsdWUgaXMgZXNjYXBlZC4KKyAgICA8L3BhcmE+CisgICAgPHBhcmE+CisgICAgICBGb3IgZXhhbXBsZTogCisgICAgICA8cHJvZ3JhbWxpc3Rpbmc+dW5peDpwYXRoPS90bXAvZGJ1cy10ZXN0PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgIFdoaWNoIGlzIHRoZSBhZGRyZXNzIHRvIGEgdW5peCBzb2NrZXQgd2l0aCB0aGUgcGF0aCAvdG1wL2RidXMtdGVzdC4KKyAgICA8L3BhcmE+CisgICAgPHBhcmE+CisgICAgICBWYWx1ZSBlc2NhcGluZyBpcyBzaW1pbGFyIHRvIFVSSSBlc2NhcGluZyBidXQgc2ltcGxlci4KKyAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBzZXQgb2Ygb3B0aW9uYWxseS1lc2NhcGVkIGJ5dGVzIGlzOgorICAgICAgICAgICAgPGxpdGVyYWw+WzAtOUEtWmEtel8tLy5cXTwvbGl0ZXJhbD4uIFRvIGVzY2FwZSwgZWFjaAorICAgICAgICAgICAgPGVtcGhhc2lzPmJ5dGU8L2VtcGhhc2lzPiAobm90ZSwgbm90IGNoYXJhY3Rlcikgd2hpY2ggaXMgbm90IGluIHRoZQorICAgICAgICAgICAgc2V0IG9mIG9wdGlvbmFsbHktZXNjYXBlZCBieXRlcyBtdXN0IGJlIHJlcGxhY2VkIHdpdGggYW4gQVNDSUkKKyAgICAgICAgICAgIHBlcmNlbnQgKDxsaXRlcmFsPiU8L2xpdGVyYWw+KSBhbmQgdGhlIHZhbHVlIG9mIHRoZSBieXRlIGluIGhleC4KKyAgICAgICAgICAgIFRoZSBoZXggdmFsdWUgbXVzdCBhbHdheXMgYmUgdHdvIGRpZ2l0cywgZXZlbiBpZiB0aGUgZmlyc3QgZGlnaXQgaXMKKyAgICAgICAgICAgIHplcm8uIFRoZSBvcHRpb25hbGx5LWVzY2FwZWQgYnl0ZXMgbWF5IGJlIGVzY2FwZWQgaWYgZGVzaXJlZC4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRvIHVuZXNjYXBlLCBhcHBlbmQgZWFjaCBieXRlIGluIHRoZSB2YWx1ZTsgaWYgYSBieXRlIGlzIGFuIEFTQ0lJCisgICAgICAgICAgICBwZXJjZW50ICg8bGl0ZXJhbD4lPC9saXRlcmFsPikgY2hhcmFjdGVyIHRoZW4gYXBwZW5kIHRoZSBmb2xsb3dpbmcKKyAgICAgICAgICAgIGhleCB2YWx1ZSBpbnN0ZWFkLiBJdCBpcyBhbiBlcnJvciBpZiBhIDxsaXRlcmFsPiU8L2xpdGVyYWw+IGJ5dGUKKyAgICAgICAgICAgIGRvZXMgbm90IGhhdmUgdHdvIGhleCBkaWdpdHMgZm9sbG93aW5nLiBJdCBpcyBhbiBlcnJvciBpZiBhCisgICAgICAgICAgICBub24tb3B0aW9uYWxseS1lc2NhcGVkIGJ5dGUgaXMgc2VlbiB1bmVzY2FwZWQuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICBUaGUgc2V0IG9mIG9wdGlvbmFsbHktZXNjYXBlZCBieXRlcyBpcyBpbnRlbmRlZCB0byBwcmVzZXJ2ZSBhZGRyZXNzIAorICAgICAgcmVhZGFiaWxpdHkgYW5kIGNvbnZlbmllbmNlLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICAgQSBzZXJ2ZXIgbWF5IHNwZWNpZnkgYSBrZXktdmFsdWUgcGFpciB3aXRoIHRoZSBrZXkgPGxpdGVyYWw+Z3VpZDwvbGl0ZXJhbD4KKyAgICAgIGFuZCB0aGUgdmFsdWUgYSBoZXgtZW5jb2RlZCAxNi1ieXRlIHNlcXVlbmNlLiA8eHJlZiBsaW5rZW5kPSJ1dWlkcyIvPgorICAgICAgZGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgdGhlIDxsaXRlcmFsPmd1aWQ8L2xpdGVyYWw+IGZpZWxkLiAgSWYgcHJlc2VudCwKKyAgICAgIHRoaXMgVVVJRCBtYXkgYmUgdXNlZCB0byBkaXN0aW5ndWlzaCBvbmUgc2VydmVyIGFkZHJlc3MgZnJvbSBhbm90aGVyLiBBCisgICAgICBzZXJ2ZXIgc2hvdWxkIHVzZSBhIGRpZmZlcmVudCBVVUlEIGZvciBlYWNoIGFkZHJlc3MgaXQgbGlzdGVucyBvbi4gRm9yCisgICAgICBleGFtcGxlLCBpZiBhIG1lc3NhZ2UgYnVzIGRhZW1vbiBvZmZlcnMgYm90aCBVTklYIGRvbWFpbiBzb2NrZXQgYW5kIFRDUAorICAgICAgY29ubmVjdGlvbnMsIGJ1dCB0cmVhdHMgY2xpZW50cyB0aGUgc2FtZSByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IGNvbm5lY3QsCisgICAgICB0aG9zZSB0d28gY29ubmVjdGlvbnMgYXJlIGVxdWl2YWxlbnQgcG9zdC1jb25uZWN0aW9uIGJ1dCBzaG91bGQgaGF2ZQorICAgICAgZGlzdGluY3QgVVVJRHMgdG8gZGlzdGluZ3Vpc2ggdGhlIGtpbmRzIG9mIGNvbm5lY3Rpb24uCisgICAgPC9wYXJhPgorICAgIAorICAgIDxwYXJhPgorICAgICAgVGhlIGludGVudCBvZiB0aGUgYWRkcmVzcyBVVUlEIGZlYXR1cmUgaXMgdG8gYWxsb3cgYSBjbGllbnQgdG8gYXZvaWQKKyAgICAgIG9wZW5pbmcgbXVsdGlwbGUgaWRlbnRpY2FsIGNvbm5lY3Rpb25zIHRvIHRoZSBzYW1lIHNlcnZlciwgYnkgYWxsb3dpbmcgdGhlCisgICAgICBjbGllbnQgdG8gY2hlY2sgd2hldGhlciBhbiBhZGRyZXNzIGNvcnJlc3BvbmRzIHRvIGFuIGFscmVhZHktZXhpc3RpbmcKKyAgICAgIGNvbm5lY3Rpb24uICBDb21wYXJpbmcgdHdvIGFkZHJlc3NlcyBpcyBpbnN1ZmZpY2llbnQsIGJlY2F1c2UgYWRkcmVzc2VzCisgICAgICBjYW4gYmUgcmVjeWNsZWQgYnkgZGlzdGluY3Qgc2VydmVycywgYW5kIGVxdWl2YWxlbnQgYWRkcmVzc2VzIG1heSBsb29rCisgICAgICBkaWZmZXJlbnQgaWYgc2ltcGx5IGNvbXBhcmVkIGFzIHN0cmluZ3MgKGZvciBleGFtcGxlLCB0aGUgaG9zdCBpbiBhIFRDUAorICAgICAgYWRkcmVzcyBjYW4gYmUgZ2l2ZW4gYXMgYW4gSVAgYWRkcmVzcyBvciBhcyBhIGhvc3RuYW1lKS4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgIE5vdGUgdGhhdCB0aGUgYWRkcmVzcyBrZXkgaXMgPGxpdGVyYWw+Z3VpZDwvbGl0ZXJhbD4gZXZlbiB0aG91Z2ggdGhlIAorICAgICAgcmVzdCBvZiB0aGUgQVBJIGFuZCBkb2N1bWVudGF0aW9uIHNheXMgIlVVSUQsIiBmb3IgaGlzdG9yaWNhbCByZWFzb25zLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICAgW0ZJWE1FIGNsYXJpZnkgaWYgYXR0ZW1wdGluZyB0byBjb25uZWN0IHRvIGVhY2ggaXMgYSByZXF1aXJlbWVudCAKKyAgICAgIG9yIGp1c3QgYSBzdWdnZXN0aW9uXQorICAgICAgV2hlbiBjb25uZWN0aW5nIHRvIGEgc2VydmVyLCBtdWx0aXBsZSBzZXJ2ZXIgYWRkcmVzc2VzIGNhbiBiZQorICAgICAgc2VwYXJhdGVkIGJ5IGEgc2VtaS1jb2xvbi4gVGhlIGxpYnJhcnkgd2lsbCB0aGVuIHRyeSB0byBjb25uZWN0CisgICAgICB0byB0aGUgZmlyc3QgYWRkcmVzcyBhbmQgaWYgdGhhdCBmYWlscywgaXQnbGwgdHJ5IHRvIGNvbm5lY3QgdG8KKyAgICAgIHRoZSBuZXh0IG9uZSBzcGVjaWZpZWQsIGFuZCBzbyBmb3J0aC4gRm9yIGV4YW1wbGUKKyAgICAgIDxwcm9ncmFtbGlzdGluZz51bml4OnBhdGg9L3RtcC9kYnVzLXRlc3Q7dW5peDpwYXRoPS90bXAvZGJ1cy10ZXN0MjwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgPC9wYXJhPgorCisgIDwvc2VjdDE+CisgIAorICA8c2VjdDEgaWQ9InRyYW5zcG9ydHMiPgorICAgIDx0aXRsZT5UcmFuc3BvcnRzPC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgIFtGSVhNRSB3ZSBuZWVkIHRvIHNwZWNpZnkgaW4gZGV0YWlsIGVhY2ggdHJhbnNwb3J0IGFuZCBpdHMgcG9zc2libGUgYXJndW1lbnRzXQorICAgIAorICAgICAgQ3VycmVudCB0cmFuc3BvcnRzIGluY2x1ZGU6IHVuaXggZG9tYWluIHNvY2tldHMgKGluY2x1ZGluZyAKKyAgICAgIGFic3RyYWN0IG5hbWVzcGFjZSBvbiBsaW51eCksIGxhdW5jaGQsIHN5c3RlbWQsIFRDUC9JUCwgYW4gZXhlY3V0ZWQgc3VicHJvY2VzcyBhbmQgYSBkZWJ1Zy90ZXN0aW5nIHRyYW5zcG9ydAorICAgICAgdXNpbmcgaW4tcHJvY2VzcyBwaXBlcy4gRnV0dXJlIHBvc3NpYmxlIHRyYW5zcG9ydHMgaW5jbHVkZSBvbmUgdGhhdAorICAgICAgdHVubmVscyBvdmVyIFgxMSBwcm90b2NvbC4KKyAgICA8L3BhcmE+CisgIAorICAgIDxzZWN0MiBpZD0idHJhbnNwb3J0cy11bml4LWRvbWFpbi1zb2NrZXRzIj4KKyAgICAgIDx0aXRsZT5Vbml4IERvbWFpbiBTb2NrZXRzPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBVbml4IGRvbWFpbiBzb2NrZXRzIGNhbiBiZSBlaXRoZXIgcGF0aHMgaW4gdGhlIGZpbGUgc3lzdGVtIG9yIG9uIExpbnV4IAorCWtlcm5lbHMsIHRoZXkgY2FuIGJlIGFic3RyYWN0IHdoaWNoIGFyZSBzaW1pbGFyIHRvIHBhdGhzIGJ1dAorCWRvIG5vdCBzaG93IHVwIGluIHRoZSBmaWxlIHN5c3RlbS4gIAorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgV2hlbiBhIHNvY2tldCBpcyBvcGVuZWQgYnkgdGhlIEQtQnVzIGxpYnJhcnkgaXQgdHJ1bmNhdGVzIHRoZSBwYXRoIAorCW5hbWUgcmlnaHQgYmVmb3JlIHRoZSBmaXJzdCB0cmFpbGluZyBOdWwgYnl0ZS4gIFRoaXMgaXMgdHJ1ZSBmb3IgYm90aAorCW5vcm1hbCBwYXRocyBhbmQgYWJzdHJhY3QgcGF0aHMuICBOb3RlIHRoYXQgdGhpcyBpcyBhIGRlcGFydHVyZSBmcm9tCisJcHJldmlvdXMgdmVyc2lvbnMgb2YgRC1CdXMgdGhhdCB3b3VsZCBjcmVhdGUgc29ja2V0cyB3aXRoIGEgZml4ZWQgCisJbGVuZ3RoIHBhdGggbmFtZS4gIE5hbWVzIHdoaWNoIHdlcmUgc2hvcnRlciB0aGFuIHRoZSBmaXhlZCBsZW5ndGgKKwl3b3VsZCBiZSBwYWRkZWQgYnkgTnVsIGJ5dGVzLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFVuaXggZG9tYWluIHNvY2tldHMgYXJlIG5vdCBhdmFpbGFibGUgb24gV2luZG93cy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxzZWN0MyBpZD0idHJhbnNwb3J0cy11bml4LWRvbWFpbi1zb2NrZXRzLWFkZHJlc3NlcyI+CisgICAgICAgIDx0aXRsZT5TZXJ2ZXIgQWRkcmVzcyBGb3JtYXQ8L3RpdGxlPgorICAgICAgICA8cGFyYT4gCisgICAgICAgICAgVW5peCBkb21haW4gc29ja2V0IGFkZHJlc3NlcyBhcmUgaWRlbnRpZmllZCBieSB0aGUgInVuaXg6IiBwcmVmaXggCisgICAgICAgICAgYW5kIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBrZXkvdmFsdWUgcGFpcnM6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgIDxlbnRyeT5OYW1lPC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT5WYWx1ZXM8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICA8ZW50cnk+cGF0aDwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+KHBhdGgpPC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT5wYXRoIG9mIHRoZSB1bml4IGRvbWFpbiBzb2NrZXQuIElmIHNldCwgdGhlICJ0bXBkaXIiIGFuZCAiYWJzdHJhY3QiIGtleSBtdXN0IG5vdCBiZSBzZXQuPC9lbnRyeT4KKyAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICA8cm93PgorICAgICAgICAgICAgPGVudHJ5PnRtcGRpcjwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+KHBhdGgpPC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT50ZW1wb3JhcnkgZGlyZWN0b3J5IGluIHdoaWNoIGEgc29ja2V0IGZpbGUgd2l0aCBhIHJhbmRvbSBmaWxlIG5hbWUgc3RhcnRpbmcgd2l0aCAnZGJ1cy0nIHdpbGwgYmUgY3JlYXRlZCBieSB0aGUgc2VydmVyLiBUaGlzIGtleSBjYW4gb25seSBiZSB1c2VkIGluIHNlcnZlciBhZGRyZXNzZXMsIG5vdCBpbiBjbGllbnQgYWRkcmVzc2VzLiBJZiBzZXQsIHRoZSAicGF0aCIgYW5kICJhYnN0cmFjdCIga2V5IG11c3Qgbm90IGJlIHNldC48L2VudHJ5PgorICAgICAgICAgIDwvcm93PgorICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICA8ZW50cnk+YWJzdHJhY3Q8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PihzdHJpbmcpPC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT51bmlxdWUgc3RyaW5nIChwYXRoKSBpbiB0aGUgYWJzdHJhY3QgbmFtZXNwYWNlLiBJZiBzZXQsIHRoZSAicGF0aCIgb3IgInRlbXBkaXIiIGtleSBtdXN0IG5vdCBiZSBzZXQuPC9lbnRyeT4KKyAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgPC90Ym9keT4KKyAgICAgICAgPC90Z3JvdXA+CisgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgPC9zZWN0Mz4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0idHJhbnNwb3J0cy1sYXVuY2hkIj4KKyAgICAgIDx0aXRsZT5sYXVuY2hkPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBsYXVuY2hkIGlzIGFuIG9wZW4tc291cmNlIHNlcnZlciBtYW5hZ2VtZW50IHN5c3RlbSB0aGF0IHJlcGxhY2VzIGluaXQsIGluZXRkCisgICAgICAgIGFuZCBjcm9uIG9uIEFwcGxlIE1hYyBPUyBYIHZlcnNpb25zIDEwLjQgYW5kIGFib3ZlLiBJdCBwcm92aWRlcyBhIGNvbW1vbiBzZXNzaW9uCisgICAgICAgIGJ1cyBhZGRyZXNzIGZvciBlYWNoIHVzZXIgYW5kIGRlcHJlY2F0ZXMgdGhlIFgxMS1lbmFibGVkIEQtQnVzIGxhdW5jaGVyIG9uIE9TWC4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIGxhdW5jaGQgYWxsb2NhdGVzIGEgc29ja2V0IGFuZCBwcm92aWRlcyBpdCB3aXRoIHRoZSB1bml4IHBhdGggdGhyb3VnaCB0aGUKKyAgICAgICAgREJVU19MQVVOQ0hEX1NFU1NJT05fQlVTX1NPQ0tFVCB2YXJpYWJsZSBpbiBsYXVuY2hkJ3MgZW52aXJvbm1lbnQuIEV2ZXJ5IHByb2Nlc3MKKyAgICAgICAgc3Bhd25lZCBieSBsYXVuY2hkIChvciBkYnVzLWRhZW1vbiwgaWYgaXQgd2FzIHN0YXJ0ZWQgYnkgbGF1bmNoZCkgY2FuIGFjY2VzcworICAgICAgICBpdCB0aHJvdWdoIGl0cyBlbnZpcm9ubWVudC4KKyAgICAgICAgT3RoZXIgcHJvY2Vzc2VzIGNhbiBxdWVyeSBmb3IgdGhlIGxhdW5jaGQgc29ja2V0IGJ5IGV4ZWN1dGluZzoKKyAgICAgICAgJCBsYXVuY2hjdGwgZ2V0ZW52IERCVVNfTEFVTkNIRF9TRVNTSU9OX0JVU19TT0NLRVQKKyAgICAgICAgVGhpcyBpcyBub3JtYWxseSBkb25lIGJ5IHRoZSBELUJ1cyBjbGllbnQgbGlicmFyeSBzbyBkb2Vzbid0IGhhdmUgdG8gYmUgZG9uZQorICAgICAgICBtYW51YWxseS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBsYXVuY2hkIGlzIG5vdCBhdmFpbGFibGUgb24gTWljcm9zb2Z0IFdpbmRvd3MuCisgICAgICA8L3BhcmE+CisgICAgICA8c2VjdDMgaWQ9InRyYW5zcG9ydHMtbGF1bmNoZC1hZGRyZXNzZXMiPgorICAgICAgICA8dGl0bGU+U2VydmVyIEFkZHJlc3MgRm9ybWF0PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgbGF1bmNoZCBhZGRyZXNzZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlICJsYXVuY2hkOiIgcHJlZml4CisgICAgICAgICAgYW5kIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBrZXkvdmFsdWUgcGFpcnM6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgIDxlbnRyeT5OYW1lPC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT5WYWx1ZXM8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICA8ZW50cnk+ZW52PC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT4oZW52aXJvbm1lbnQgdmFyaWFibGUpPC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT5wYXRoIG9mIHRoZSB1bml4IGRvbWFpbiBzb2NrZXQgZm9yIHRoZSBsYXVuY2hkIGNyZWF0ZWQgZGJ1cy1kYWVtb24uPC9lbnRyeT4KKyAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgPC90Ym9keT4KKyAgICAgICAgPC90Z3JvdXA+CisgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgPC9zZWN0Mz4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0idHJhbnNwb3J0cy1zeXN0ZW1kIj4KKyAgICAgIDx0aXRsZT5zeXN0ZW1kPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBzeXN0ZW1kIGlzIGFuIG9wZW4tc291cmNlIHNlcnZlciBtYW5hZ2VtZW50IHN5c3RlbSB0aGF0CisgICAgICAgIHJlcGxhY2VzIGluaXQgYW5kIGluZXRkIG9uIG5ld2VyIExpbnV4IHN5c3RlbXMuIEl0IHN1cHBvcnRzCisgICAgICAgIHNvY2tldCBhY3RpdmF0aW9uLiBUaGUgRC1CdXMgc3lzdGVtZCB0cmFuc3BvcnQgaXMgdXNlZCB0byBhY3F1aXJlCisgICAgICAgIHNvY2tldCBhY3RpdmF0aW9uIGZpbGUgZGVzY3JpcHRvcnMgZnJvbSBzeXN0ZW1kIGFuZCB1c2UgdGhlbQorICAgICAgICBhcyBELUJ1cyB0cmFuc3BvcnQgd2hlbiB0aGUgY3VycmVudCBwcm9jZXNzIGlzIHNwYXduZWQgYnkKKyAgICAgICAgc29ja2V0IGFjdGl2YXRpb24gZnJvbSBpdC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgc3lzdGVtZCB0cmFuc3BvcnQgYWNjZXB0cyBvbmx5IG9uZSBvciBtb3JlIFVuaXggZG9tYWluIG9yCisgICAgICAgIFRDUCBzdHJlYW1zIHNvY2tldHMgcGFzc2VkIGluIHZpYSBzb2NrZXQgYWN0aXZhdGlvbi4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgc3lzdGVtZCB0cmFuc3BvcnQgaXMgbm90IGF2YWlsYWJsZSBvbiBub24tTGludXggb3BlcmF0aW5nIHN5c3RlbXMuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIHN5c3RlbWQgdHJhbnNwb3J0IGRlZmluZXMgbm8gcGFyYW1ldGVyIGtleXMuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9InRyYW5zcG9ydHMtdGNwLXNvY2tldHMiPgorICAgICAgPHRpdGxlPlRDUCBTb2NrZXRzPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgdGNwIHRyYW5zcG9ydCBwcm92aWRlcyBUQ1AvSVAgYmFzZWQgY29ubmVjdGlvbnMgYmV0d2VlbiBjbGllbnRzCisgICAgICAgIGxvY2F0ZWQgb24gdGhlIHNhbWUgb3IgZGlmZmVyZW50IGhvc3RzLiAKKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBVc2luZyB0Y3AgdHJhbnNwb3J0IHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgc2VjdXJlIGF1dGhlbnRpZmljYXRpb24gbWVjaGFuaXNtdXMgCisgICAgICAgIG92ZXIgYSBuZXR3b3JrIGlzIHVuc2VjdXJlLiAKKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPiAgCisgICAgICAgIFdpbmRvd3Mgbm90ZXM6IEJlY2F1c2Ugb2YgdGhlIHRjcCBzdGFjayBvbiBXaW5kb3dzIGRvZXMgbm90IHByb3ZpZGUgc2VuZGluZworICAgICAgICBjcmVkZW50aWFscyBvdmVyIGEgdGNwIGNvbm5lY3Rpb24sIHRoZSBFWFRFUk5BTCBhdXRoZW50aWZpY2F0aW9uIAorICAgICAgICBtZWNoYW5pc211cyBkb2VzIG5vdCB3b3JrLiAKKyAgICAgIDwvcGFyYT4KKyAgICAgIDxzZWN0MyBpZD0idHJhbnNwb3J0cy10Y3Atc29ja2V0cy1hZGRyZXNzZXMiPgorICAgICAgICA8dGl0bGU+U2VydmVyIEFkZHJlc3MgRm9ybWF0PC90aXRsZT4KKyAgICAgICAgPHBhcmE+IAorICAgICAgICAgVENQL0lQIHNvY2tldCBhZGRyZXNzZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlICJ0Y3A6IiBwcmVmaXggCisgICAgICAgICBhbmQgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGtleS92YWx1ZSBwYWlyczoKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgPGVudHJ5Pk5hbWU8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PlZhbHVlczwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgIDxlbnRyeT5ob3N0PC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT4oc3RyaW5nKTwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+ZG5zIG5hbWUgb3IgaXAgYWRkcmVzczwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgPGVudHJ5PnBvcnQ8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+KG51bWJlcik8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+VGhlIHRjcCBwb3J0IHRoZSBzZXJ2ZXIgd2lsbCBvcGVuLiBBIHplcm8gdmFsdWUgbGV0IHRoZSBzZXJ2ZXIgCisgICAgICAgICAgICBjaG9vc2UgYSBmcmVlIHBvcnQgcHJvdmlkZWQgZnJvbSB0aGUgdW5kZXJsYXlpbmcgb3BlcmF0aW5nIHN5c3RlbS4gCisgICAgICAgICAgICBsaWJkYnVzIGlzIGFibGUgdG8gcmV0cmlldmUgdGhlIHJlYWwgdXNlZCBwb3J0IGZyb20gdGhlIHNlcnZlci4gIAorICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgIDwvcm93PgorICAgICAgICAgIDxyb3c+CisgICAgICAgICAgIDxlbnRyeT5mYW1pbHk8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+KHN0cmluZyk8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+SWYgc2V0LCBwcm92aWRlIHRoZSB0eXBlIG9mIHNvY2tldCBmYW1pbHkgZWl0aGVyICJpcHY0IiBvciAiaXB2NiIuIElmIHVuc2V0LCB0aGUgZmFtaWx5IGlzIHVuc3BlY2lmaWVkLjwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgICA8L3Rib2R5PgorICAgICAgICA8L3Rncm91cD4KKyAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICA8L3NlY3QzPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJ0cmFuc3BvcnRzLW5vbmNlLXRjcC1zb2NrZXRzIj4KKyAgICAgIDx0aXRsZT5Ob25jZS1zZWN1cmVkIFRDUCBTb2NrZXRzPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgbm9uY2UtdGNwIHRyYW5zcG9ydCBwcm92aWRlcyBhIHNlY3VyZWQgVENQIHRyYW5zcG9ydCwgdXNpbmcgYQorICAgICAgICBzaW1wbGUgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtIHRvIGVuc3VyZSB0aGF0IG9ubHkgY2xpZW50cyB3aXRoIHJlYWQKKyAgICAgICAgYWNjZXNzIHRvIGEgY2VydGFpbiBsb2NhdGlvbiBpbiB0aGUgZmlsZXN5c3RlbSBjYW4gY29ubmVjdCB0byB0aGUgc2VydmVyLgorICAgICAgICBUaGUgc2VydmVyIHdyaXRlcyBhIHNlY3JldCwgdGhlIG5vbmNlLCB0byBhIGZpbGUgYW5kIGFuIGluY29taW5nIGNsaWVudAorICAgICAgICBjb25uZWN0aW9uIGlzIG9ubHkgYWNjZXB0ZWQgaWYgdGhlIGNsaWVudCBzZW5kcyB0aGUgbm9uY2UgcmlnaHQgYWZ0ZXIKKyAgICAgICAgdGhlIGNvbm5lY3QuIFRoZSBub25jZSBtZWNoYW5pc20gcmVxdWlyZXMgbm8gc2V0dXAgYW5kIGlzIG9ydGhvZ29uYWwgdG8KKyAgICAgICAgdGhlIGhpZ2hlci1sZXZlbCBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIGRlc2NyaWJlZCBpbiB0aGUKKyAgICAgICAgQXV0aGVudGljYXRpb24gc2VjdGlvbi4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIE9uIHN0YXJ0LCB0aGUgc2VydmVyIGdlbmVyYXRlcyBhIHJhbmRvbSAxNiBieXRlIG5vbmNlIGFuZCB3cml0ZXMgaXQKKyAgICAgICAgdG8gYSBmaWxlIGluIHRoZSB1c2VyJ3MgdGVtcG9yYXJ5IGRpcmVjdG9yeS4gVGhlIG5vbmNlIGZpbGUgbG9jYXRpb24KKyAgICAgICAgaXMgcHVibGlzaGVkIGFzIHBhcnQgb2YgdGhlIHNlcnZlcidzIEQtQnVzIGFkZHJlc3MgdXNpbmcgdGhlCisgICAgICAgICJub25jZWZpbGUiIGtleS12YWx1ZSBwYWlyLgorCisgICAgICAgIEFmdGVyIGFuIGFjY2VwdCwgdGhlIHNlcnZlciByZWFkcyAxNiBieXRlcyBmcm9tIHRoZSBzb2NrZXQuIElmIHRoZQorICAgICAgICByZWFkIGJ5dGVzIGRvIG5vdCBtYXRjaCB0aGUgbm9uY2Ugc3RvcmVkIGluIHRoZSBub25jZSBmaWxlLCB0aGUKKyAgICAgICAgc2VydmVyIE1VU1QgaW1tZWRpYXRlbHkgZHJvcCB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgSWYgdGhlIG5vbmNlIG1hdGNoIHRoZSByZWNlaXZlZCBieXRlIHNlcXVlbmNlLCB0aGUgY2xpZW50IGlzIGFjY2VwdGVkCisgICAgICAgIGFuZCB0aGUgdHJhbnNwb3J0IGJlaGF2ZXMgbGlrZSBhbiB1bnNlY3VyZWQgdGNwIHRyYW5zcG9ydC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBBZnRlciBhIHN1Y2Nlc3NmdWwgY29ubmVjdCB0byB0aGUgc2VydmVyIHNvY2tldCwgdGhlIGNsaWVudCBNVVNUIHJlYWQKKyAgICAgICAgdGhlIG5vbmNlIGZyb20gdGhlIGZpbGUgcHVibGlzaGVkIGJ5IHRoZSBzZXJ2ZXIgdmlhIHRoZSBub25jZWZpbGU9CisgICAgICAgIGtleS12YWx1ZSBwYWlyIGFuZCBzZW5kIGl0IG92ZXIgdGhlIHNvY2tldC4gQWZ0ZXIgdGhhdCwgdGhlCisgICAgICAgIHRyYW5zcG9ydCBiZWhhdmVzIGxpa2UgYW4gdW5zZWN1cmVkIHRjcCB0cmFuc3BvcnQuCisgICAgICA8L3BhcmE+CisgICAgICA8c2VjdDMgaWQ9InRyYW5zcG9ydHMtbm9uY2UtdGNwLXNvY2tldHMtYWRkcmVzc2VzIj4KKyAgICAgICAgPHRpdGxlPlNlcnZlciBBZGRyZXNzIEZvcm1hdDwvdGl0bGU+CisgICAgICAgIDxwYXJhPiAKKyAgICAgICAgIE5vbmNlIFRDUC9JUCBzb2NrZXQgYWRkcmVzc2VzIHVzZXMgdGhlICJub25jZS10Y3A6IiBwcmVmaXggCisgICAgICAgICBhbmQgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGtleS92YWx1ZSBwYWlyczoKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgPGVudHJ5Pk5hbWU8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PlZhbHVlczwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgIDxlbnRyeT5ob3N0PC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT4oc3RyaW5nKTwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+ZG5zIG5hbWUgb3IgaXAgYWRkcmVzczwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgPGVudHJ5PnBvcnQ8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+KG51bWJlcik8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+VGhlIHRjcCBwb3J0IHRoZSBzZXJ2ZXIgd2lsbCBvcGVuLiBBIHplcm8gdmFsdWUgbGV0IHRoZSBzZXJ2ZXIgCisgICAgICAgICAgICBjaG9vc2UgYSBmcmVlIHBvcnQgcHJvdmlkZWQgZnJvbSB0aGUgdW5kZXJsYXlpbmcgb3BlcmF0aW5nIHN5c3RlbS4gCisgICAgICAgICAgICBsaWJkYnVzIGlzIGFibGUgdG8gcmV0cmlldmUgdGhlIHJlYWwgdXNlZCBwb3J0IGZyb20gdGhlIHNlcnZlci4gIAorICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgIDwvcm93PgorICAgICAgICAgIDxyb3c+CisgICAgICAgICAgIDxlbnRyeT5mYW1pbHk8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+KHN0cmluZyk8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+SWYgc2V0LCBwcm92aWRlIHRoZSB0eXBlIG9mIHNvY2tldCBmYW1pbHkgZWl0aGVyICJpcHY0IiBvciAiaXB2NiIuIElmIHVuc2V0LCB0aGUgZmFtaWx5IGlzIHVuc3BlY2lmaWVkLjwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgPGVudHJ5Pm5vbmNlZmlsZTwvZW50cnk+CisgICAgICAgICAgIDxlbnRyeT4ocGF0aCk8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+ZmlsZSBsb2NhdGlvbiBjb250YWluaW5nIHRoZSBzZWNyZXQ8L2VudHJ5PgorICAgICAgICAgIDwvcm93PgorICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgPC90Z3JvdXA+CisgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgPC9zZWN0Mz4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0idHJhbnNwb3J0cy1leGVjIj4KKyAgICAgIDx0aXRsZT5FeGVjdXRlZCBTdWJwcm9jZXNzZXMgb24gVW5peDwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhpcyB0cmFuc3BvcnQgZm9ya3Mgb2ZmIGEgcHJvY2VzcyBhbmQgY29ubmVjdHMgaXRzIHN0YW5kYXJkCisgICAgICAgIGlucHV0IGFuZCBzdGFuZGFyZCBvdXRwdXQgd2l0aCBhbiBhbm9ueW1vdXMgVW5peCBkb21haW4KKyAgICAgICAgc29ja2V0LiBUaGlzIHNvY2tldCBpcyB0aGVuIHVzZWQgZm9yIGNvbW11bmljYXRpb24gYnkgdGhlCisgICAgICAgIHRyYW5zcG9ydC4gVGhpcyB0cmFuc3BvcnQgbWF5IGJlIHVzZWQgdG8gdXNlIG91dC1vZi1wcm9jZXNzCisgICAgICAgIGZvcndhcmRlciBwcm9ncmFtcyBhcyBiYXNpcyBmb3IgdGhlIEQtQnVzIHByb3RvY29sLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBmb3JrZWQgcHJvY2VzcyB3aWxsIGluaGVyaXQgdGhlIHN0YW5kYXJkIGVycm9yIG91dHB1dCBhbmQKKyAgICAgICAgcHJvY2VzcyBncm91cCBmcm9tIHRoZSBwYXJlbnQgcHJvY2Vzcy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBFeGVjdXRlZCBzdWJwcm9jZXNzZXMgYXJlIG5vdCBhdmFpbGFibGUgb24gV2luZG93cy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxzZWN0MyBpZD0idHJhbnNwb3J0cy1leGVjLWFkZHJlc3NlcyI+CisgICAgICAgIDx0aXRsZT5TZXJ2ZXIgQWRkcmVzcyBGb3JtYXQ8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBFeGVjdXRlZCBzdWJwcm9jZXNzIGFkZHJlc3NlcyBhcmUgaWRlbnRpZmllZCBieSB0aGUgInVuaXhleGVjOiIgcHJlZml4CisgICAgICAgICAgYW5kIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBrZXkvdmFsdWUgcGFpcnM6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgIDxlbnRyeT5OYW1lPC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT5WYWx1ZXM8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICA8ZW50cnk+cGF0aDwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+KHBhdGgpPC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT5QYXRoIG9mIHRoZSBiaW5hcnkgdG8gZXhlY3V0ZSwgZWl0aGVyIGFuIGFic29sdXRlCisgICAgICAgICAgICBwYXRoIG9yIGEgYmluYXJ5IG5hbWUgdGhhdCBpcyBzZWFyY2hlZCBmb3IgaW4gdGhlIGRlZmF1bHQKKyAgICAgICAgICAgIHNlYXJjaCBwYXRoIG9mIHRoZSBPUy4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgZmlyc3QKKyAgICAgICAgICAgIGFyZ3VtZW50IG9mIGV4ZWNscCgpLiBUaGlzIGtleSBpcyBtYW5kYXRvcnkuPC9lbnRyeT4KKyAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICA8cm93PgorICAgICAgICAgICAgPGVudHJ5PmFyZ3YwPC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT4oc3RyaW5nKTwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+VGhlIHByb2dyYW0gbmFtZSB0byB1c2Ugd2hlbiBleGVjdXRpbmcgdGhlCisgICAgICAgICAgICBiaW5hcnkuIElmIG9taXR0ZWQgdGhlIHNhbWUgdmFsdWUgYXMgc3BlY2lmaWVkIGZvciBwYXRoPQorICAgICAgICAgICAgd2lsbCBiZSB1c2VkLiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBzZWNvbmQgYXJndW1lbnQgb2YKKyAgICAgICAgICAgIGV4ZWNscCgpLjwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgIDxlbnRyeT5hcmd2MSwgYXJndjIsIC4uLjwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+KHN0cmluZyk8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBiaW5hcnkuIFRoaXMgY29ycmVzcG9uZHMKKyAgICAgICAgICAgIHRvIHRoZSB0aGlyZCBhbmQgbGF0ZXIgYXJndW1lbnRzIG9mIGV4ZWNscCgpLiBJZiBhCisgICAgICAgICAgICBzcGVjaWZpYyBhcmd2WCBpcyBub3Qgc3BlY2lmaWVkIG5vIGZ1cnRoZXIgYXJndlkgZm9yIFkgPiBYCisgICAgICAgICAgICBhcmUgdGFrZW4gaW50byBhY2NvdW50LjwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgIDwvdGJvZHk+CisgICAgICAgIDwvdGdyb3VwPgorICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgIDwvc2VjdDM+CisgICAgPC9zZWN0Mj4KKyAgIDwvc2VjdDE+CisgICA8c2VjdDEgaWQ9Im1ldGEtdHJhbnNwb3J0cyI+CisgICAgPHRpdGxlPk1ldGEgVHJhbnNwb3J0czwvdGl0bGU+CisgICAgPHBhcmE+CisgICAgICBNZXRhIHRyYW5zcG9ydHMgYXJlIGEga2luZCBvZiB0cmFuc3BvcnQgd2l0aCBzcGVjaWFsIGVuaGFuY2VtZW50cyBvcgorICAgICAgYmVoYXZpb3IuIEN1cnJlbnRseSBhdmFpbGFibGUgbWV0YSB0cmFuc3BvcnRzIGluY2x1ZGU6IGF1dG9sYXVuY2gKKyAgICA8L3BhcmE+CisKKyAgICA8c2VjdDIgaWQ9Im1ldGEtdHJhbnNwb3J0cy1hdXRvbGF1bmNoIj4KKyAgICAgPHRpdGxlPkF1dG9sYXVuY2g8L3RpdGxlPgorICAgICA8cGFyYT5UaGUgYXV0b2xhdW5jaCB0cmFuc3BvcnQgcHJvdmlkZXMgYSB3YXkgZm9yIGRidXMgY2xpZW50cyB0byBhdXRvZGV0ZWN0CisgICAgICAgYSBydW5uaW5nIGRidXMgc2Vzc2lvbiBidXMgYW5kIHRvIGF1dG9sYXVuY2ggYSBzZXNzaW9uIGJ1cyBpZiBub3QgcHJlc2VudC4KKyAgICAgPC9wYXJhPgorICAgICA8c2VjdDMgaWQ9Im1ldGEtdHJhbnNwb3J0cy1hdXRvbGF1bmNoLWFkZHJlc3NlcyI+CisgICAgICAgPHRpdGxlPlNlcnZlciBBZGRyZXNzIEZvcm1hdDwvdGl0bGU+CisgICAgICAgPHBhcmE+CisgICAgICAgICBBdXRvbGF1bmNoIGFkZHJlc3NlcyB1c2VzIHRoZSAiYXV0b2xhdW5jaDoiIHByZWZpeCBhbmQgc3VwcG9ydCB0aGUKKyAgICAgICAgIGZvbGxvd2luZyBrZXkvdmFsdWUgcGFpcnM6CisgICAgICAgPC9wYXJhPgorICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgPHRoZWFkPgorICAgICAgICAgIDxyb3c+CisgICAgICAgICAgIDxlbnRyeT5OYW1lPC9lbnRyeT4KKyAgICAgICAgICAgPGVudHJ5PlZhbHVlczwvZW50cnk+CisgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgPHRib2R5PgorICAgICAgICAgIDxyb3c+CisgICAgICAgICAgIDxlbnRyeT5zY29wZTwvZW50cnk+CisgICAgICAgICAgIDxlbnRyeT4oc3RyaW5nKTwvZW50cnk+CisgICAgICAgICAgIDxlbnRyeT5zY29wZSBvZiBhdXRvbGF1bmNoIChXaW5kb3dzIG9ubHkpCisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAiKmluc3RhbGwtcGF0aCIgLSBsaW1pdCBzZXNzaW9uIGJ1cyB0byBkYnVzIGluc3RhbGxhdGlvbiBwYXRoLgorICAgICAgICAgICAgICAgVGhlIGRidXMgaW5zdGFsbGF0aW9uIHBhdGggaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBsb2NhdGlvbiBvZgorICAgICAgICAgICAgICAgdGhlIHNoYXJlZCBkYnVzIGxpYnJhcnkuIElmIHRoZSBsaWJyYXJ5IGlzIGxvY2F0ZWQgaW4gYSAnYmluJworICAgICAgICAgICAgICAgc3ViZGlyZWN0b3J5IHRoZSBpbnN0YWxsYXRpb24gcm9vdCBpcyB0aGUgZGlyZWN0b3J5IGFib3ZlLAorICAgICAgICAgICAgICAgb3RoZXJ3aXNlIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGxpYnJhcnkgbGl2ZXMgaXMgdGFrZW4gYXMKKyAgICAgICAgICAgICAgIGluc3RhbGxhdGlvbiByb290LgorICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICZsdDtpbnN0YWxsLXJvb3QmZ3Q7L2Jpbi9bbGliXWRidXMtMS5kbGwKKyAgICAgICAgICAgICAgICAgICAmbHQ7aW5zdGFsbC1yb290Jmd0Oy9bbGliXWRidXMtMS5kbGwKKyAgICAgICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAiKnVzZXIiIC0gbGltaXQgc2Vzc2lvbiBidXMgdG8gdGhlIHJlY2VudCB1c2VyLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgb3RoZXIgdmFsdWVzIC0gc3BlY2lmeSBkZWRpY2F0ZWQgc2Vzc2lvbiBidXMgbGlrZSAicmVsZWFzZSIsCisgICAgICAgICAgICAgICAiZGVidWciIG9yIG90aGVyCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICA8L3Jvdz4KKyAgICAgICAgPC90Ym9keT4KKyAgICAgICA8L3Rncm91cD4KKyAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgPC9zZWN0Mz4KKworICAgICA8c2VjdDMgaWQ9Im1ldGEtdHJhbnNwb3J0cy1hdXRvbGF1bmNoLXdpbmRvd3MtaW1wbGVtZW50YXRpb24iPgorICAgICAgPHRpdGxlPldpbmRvd3MgaW1wbGVtZW50YXRpb248L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIE9uIHN0YXJ0LCB0aGUgc2VydmVyIG9wZW5zIGEgcGxhdGZvcm0gc3BlY2lmaWMgdHJhbnNwb3J0LCBjcmVhdGVzIGEgbXV0ZXgKKyAgICAgICAgYW5kIGEgc2hhcmVkIG1lbW9yeSBzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIHJlbGF0ZWQgc2Vzc2lvbiBidXMgYWRkcmVzcy4KKyAgICAgICAgVGhpcyBtdXRleCB3aWxsIGJlIGluc3BlY3RlZCBieSB0aGUgZGJ1cyBjbGllbnQgbGlicmFyeSB0byBkZXRlY3QgYQorICAgICAgICBydW5uaW5nIGRidXMgc2Vzc2lvbiBidXMuIFRoZSBhY2Nlc3MgdG8gdGhlIG11dGV4IGFuZCB0aGUgc2hhcmVkIG1lbW9yeQorICAgICAgICBzZWN0aW9uIGFyZSBwcm90ZWN0ZWQgYnkgZ2xvYmFsIGxvY2tzLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgSW4gdGhlIHJlY2VudCBpbXBsZW1lbnRhdGlvbiB0aGUgYXV0b2xhdW5jaCB0cmFuc3BvcnQgdXNlcyBhIHRjcCB0cmFuc3BvcnQKKyAgICAgICBvbiBsb2NhbGhvc3Qgd2l0aCBhIHBvcnQgY2hvb3NlbiBmcm9tIHRoZSBvcGVyYXRpbmcgc3lzdGVtLiBUaGlzIGRldGFpbCBtYXkKKyAgICAgICBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBEaXNjbGFpbWVyOiBUaGUgcmVjZW50IGltcGxlbWVudGF0aW9uIGlzIGluIGFuIGVhcmx5IHN0YXRlIGFuZCBtYXkgbm90CisgICAgICAgIHdvcmsgaW4gYWxsIGNpcnVtc3RhbmNlcyBhbmQvb3IgbWF5IGhhdmUgc2VjdXJpdHkgaXNzdWVzLiBCZWNhdXNlIG9mIHRoaXMKKyAgICAgICAgdGhlIGltcGxlbWVudGF0aW9uIGlzIG5vdCBkb2N1bWVudGF0ZWQgeWV0LgorICAgICAgPC9wYXJhPgorICAgICA8L3NlY3QzPgorICAgIDwvc2VjdDI+CisgICA8L3NlY3QxPgorCisgIDxzZWN0MSBpZD0idXVpZHMiPgorICAgIDx0aXRsZT5VVUlEczwvdGl0bGU+CisgICAgPHBhcmE+CisgICAgICBBIHdvcmtpbmcgRC1CdXMgaW1wbGVtZW50YXRpb24gdXNlcyB1bml2ZXJzYWxseS11bmlxdWUgSURzIGluIHR3byBwbGFjZXMuCisgICAgICBGaXJzdCwgZWFjaCBzZXJ2ZXIgYWRkcmVzcyBoYXMgYSBVVUlEIGlkZW50aWZ5aW5nIHRoZSBhZGRyZXNzLCAKKyAgICAgIGFzIGRlc2NyaWJlZCBpbiA8eHJlZiBsaW5rZW5kPSJhZGRyZXNzZXMiLz4uIFNlY29uZCwgZWFjaCBvcGVyYXRpbmcKKyAgICAgIHN5c3RlbSBrZXJuZWwgaW5zdGFuY2UgcnVubmluZyBhIEQtQnVzIGNsaWVudCBvciBzZXJ2ZXIgaGFzIGEgVVVJRAorICAgICAgaWRlbnRpZnlpbmcgdGhhdCBrZXJuZWwsIHJldHJpZXZlZCBieSBpbnZva2luZyB0aGUgbWV0aG9kCisgICAgICBvcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyLkdldE1hY2hpbmVJZCgpIChzZWUgPHhyZWYKKyAgICAgIGxpbmtlbmQ9InN0YW5kYXJkLWludGVyZmFjZXMtcGVlciIvPikuCisgICAgPC9wYXJhPgorICAgIDxwYXJhPgorICAgICAgVGhlIHRlcm0gIlVVSUQiIGluIHRoaXMgZG9jdW1lbnQgaXMgaW50ZW5kZWQgbGl0ZXJhbGx5LCBpLmUuIGFuCisgICAgICBpZGVudGlmaWVyIHRoYXQgaXMgdW5pdmVyc2FsbHkgdW5pcXVlLiBJdCBpcyBub3QgaW50ZW5kZWQgdG8gcmVmZXIgdG8KKyAgICAgIFJGQzQxMjIsIGFuZCBpbiBmYWN0IHRoZSBELUJ1cyBVVUlEIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhhdCBSRkMuCisgICAgPC9wYXJhPgorICAgIDxwYXJhPgorICAgICAgVGhlIFVVSUQgbXVzdCBjb250YWluIDEyOCBiaXRzIG9mIGRhdGEgYW5kIGJlIGhleC1lbmNvZGVkLiAgVGhlCisgICAgICBoZXgtZW5jb2RlZCBzdHJpbmcgbWF5IG5vdCBjb250YWluIGh5cGhlbnMgb3Igb3RoZXIgbm9uLWhleC1kaWdpdAorICAgICAgY2hhcmFjdGVycywgYW5kIGl0IG11c3QgYmUgZXhhY3RseSAzMiBjaGFyYWN0ZXJzIGxvbmcuICBUbyBnZW5lcmF0ZSBhCisgICAgICBVVUlELCB0aGUgY3VycmVudCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gY29uY2F0ZW5hdGVzIDk2IGJpdHMgb2YgcmFuZG9tCisgICAgICBkYXRhIGZvbGxvd2VkIGJ5IHRoZSAzMi1iaXQgdGltZSBpbiBzZWNvbmRzIHNpbmNlIHRoZSBVTklYIGVwb2NoIChpbiBiaWcKKyAgICAgIGVuZGlhbiBieXRlIG9yZGVyKS4KKyAgICA8L3BhcmE+CisgICAgPHBhcmE+CisgICAgICBJdCB3b3VsZCBhbHNvIGJlIGFjY2VwdGFibGUgYW5kIHByb2JhYmx5IGJldHRlciB0byBzaW1wbHkgZ2VuZXJhdGUgMTI4CisgICAgICBiaXRzIG9mIHJhbmRvbSBkYXRhLCBhcyBsb25nIGFzIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBpcyBvZiBoaWdoCisgICAgICBxdWFsaXR5LiBUaGUgdGltZXN0YW1wIGNvdWxkIGNvbmNlaXZhYmx5IGhlbHAgaWYgdGhlIHJhbmRvbSBiaXRzIGFyZSBub3QKKyAgICAgIHZlcnkgcmFuZG9tLiBXaXRoIGEgcXVhbGl0eSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciwgY29sbGlzaW9ucyBhcmUKKyAgICAgIGV4dHJlbWVseSB1bmxpa2VseSBldmVuIHdpdGggb25seSA5NiBiaXRzLCBzbyBpdCdzIHNvbWV3aGF0IGFjYWRlbWljLgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgIEltcGxlbWVudGF0aW9ucyBzaG91bGQsIGhvd2V2ZXIsIHN0aWNrIHRvIHJhbmRvbSBkYXRhIGZvciB0aGUgZmlyc3QgOTYgYml0cworICAgICAgb2YgdGhlIFVVSUQuCisgICAgPC9wYXJhPgorICA8L3NlY3QxPgorICAgIAorICA8c2VjdDEgaWQ9InN0YW5kYXJkLWludGVyZmFjZXMiPgorICAgIDx0aXRsZT5TdGFuZGFyZCBJbnRlcmZhY2VzPC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgIFNlZSA8eHJlZiBsaW5rZW5kPSJtZXNzYWdlLXByb3RvY29sLXR5cGVzLW5vdGF0aW9uIi8+IGZvciBkZXRhaWxzIG9uIAorICAgICAgIHRoZSBub3RhdGlvbiB1c2VkIGluIHRoaXMgc2VjdGlvbi4gVGhlcmUgYXJlIHNvbWUgc3RhbmRhcmQgaW50ZXJmYWNlcworICAgICAgdGhhdCBtYXkgYmUgdXNlZnVsIGFjcm9zcyB2YXJpb3VzIEQtQnVzIGFwcGxpY2F0aW9ucy4KKyAgICA8L3BhcmE+CisgICAgPHNlY3QyIGlkPSJzdGFuZGFyZC1pbnRlcmZhY2VzLXBlZXIiPgorICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXI8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlcjwvbGl0ZXJhbD4gaW50ZXJmYWNlIAorICAgICAgICBoYXMgdHdvIG1ldGhvZHM6CisgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBvcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyLlBpbmcgKCkKKyAgICAgICAgICBvcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyLkdldE1hY2hpbmVJZCAob3V0IFNUUklORyBtYWNoaW5lX3V1aWQpCisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgT24gcmVjZWlwdCBvZiB0aGUgPGxpdGVyYWw+TUVUSE9EX0NBTEw8L2xpdGVyYWw+IG1lc3NhZ2UKKyAgICAgICAgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlci5QaW5nPC9saXRlcmFsPiwgYW4gYXBwbGljYXRpb24gc2hvdWxkIGRvCisgICAgICAgIG5vdGhpbmcgb3RoZXIgdGhhbiByZXBseSB3aXRoIGEgPGxpdGVyYWw+TUVUSE9EX1JFVFVSTjwvbGl0ZXJhbD4gYXMKKyAgICAgICAgdXN1YWwuICBJdCBkb2VzIG5vdCBtYXR0ZXIgd2hpY2ggb2JqZWN0IHBhdGggYSBwaW5nIGlzIHNlbnQgdG8uICBUaGUKKyAgICAgICAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhbmRsZXMgdGhpcyBtZXRob2QgYXV0b21hdGljYWxseS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBPbiByZWNlaXB0IG9mIHRoZSA8bGl0ZXJhbD5NRVRIT0RfQ0FMTDwvbGl0ZXJhbD4gbWVzc2FnZQorICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyLkdldE1hY2hpbmVJZDwvbGl0ZXJhbD4sIGFuIGFwcGxpY2F0aW9uIHNob3VsZCAKKyAgICAgICAgcmVwbHkgd2l0aCBhIDxsaXRlcmFsPk1FVEhPRF9SRVRVUk48L2xpdGVyYWw+IGNvbnRhaW5pbmcgYSBoZXgtZW5jb2RlZCAKKyAgICAgICAgVVVJRCByZXByZXNlbnRpbmcgdGhlIGlkZW50aXR5IG9mIHRoZSBtYWNoaW5lIHRoZSBwcm9jZXNzIGlzIHJ1bm5pbmcgb24uCisgICAgICAgIFRoaXMgVVVJRCBtdXN0IGJlIHRoZSBzYW1lIGZvciBhbGwgcHJvY2Vzc2VzIG9uIGEgc2luZ2xlIHN5c3RlbSBhdCBsZWFzdAorICAgICAgICB1bnRpbCB0aGF0IHN5c3RlbSBuZXh0IHJlYm9vdHMuIEl0IHNob3VsZCBiZSB0aGUgc2FtZSBhY3Jvc3MgcmVib290cyAKKyAgICAgICAgaWYgcG9zc2libGUsIGJ1dCB0aGlzIGlzIG5vdCBhbHdheXMgcG9zc2libGUgdG8gaW1wbGVtZW50IGFuZCBpcyBub3QgCisgICAgICAgIGd1YXJhbnRlZWQuCisgICAgICAgIEl0IGRvZXMgbm90IG1hdHRlciB3aGljaCBvYmplY3QgcGF0aCBhIEdldE1hY2hpbmVJZCBpcyBzZW50IHRvLiAgVGhlCisgICAgICAgIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYW5kbGVzIHRoaXMgbWV0aG9kIGF1dG9tYXRpY2FsbHkuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIFVVSUQgaXMgaW50ZW5kZWQgdG8gYmUgcGVyLWluc3RhbmNlLW9mLXRoZS1vcGVyYXRpbmctc3lzdGVtLCBzbyBtYXkgcmVwcmVzZW50CisgICAgICAgIGEgdmlydHVhbCBtYWNoaW5lIHJ1bm5pbmcgb24gYSBoeXBlcnZpc29yLCByYXRoZXIgdGhhbiBhIHBoeXNpY2FsIG1hY2hpbmUuCisgICAgICAgIEJhc2ljYWxseSBpZiB0d28gcHJvY2Vzc2VzIHNlZSB0aGUgc2FtZSBVVUlELCB0aGV5IHNob3VsZCBhbHNvIHNlZSB0aGUgc2FtZQorICAgICAgICBzaGFyZWQgbWVtb3J5LCBVTklYIGRvbWFpbiBzb2NrZXRzLCBwcm9jZXNzIElEcywgYW5kIG90aGVyIGZlYXR1cmVzIHRoYXQgcmVxdWlyZSAKKyAgICAgICAgYSBydW5uaW5nIE9TIGtlcm5lbCBpbiBjb21tb24gYmV0d2VlbiB0aGUgcHJvY2Vzc2VzLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBVVUlEIGlzIG9mdGVuIHVzZWQgd2hlcmUgb3RoZXIgcHJvZ3JhbXMgbWlnaHQgdXNlIGEgaG9zdG5hbWUuIEhvc3RuYW1lcyAKKyAgICAgICAgY2FuIGNoYW5nZSB3aXRob3V0IHJlYm9vdGluZywgaG93ZXZlciwgb3IganVzdCBiZSAibG9jYWxob3N0IiAtIHNvIHRoZSBVVUlECisgICAgICAgIGlzIG1vcmUgcm9idXN0LgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIDx4cmVmIGxpbmtlbmQ9InV1aWRzIi8+IGV4cGxhaW5zIHRoZSBmb3JtYXQgb2YgdGhlIFVVSUQuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0MiBpZD0ic3RhbmRhcmQtaW50ZXJmYWNlcy1pbnRyb3NwZWN0YWJsZSI+CisgICAgICA8dGl0bGU+PGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuSW50cm9zcGVjdGFibGU8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGlzIGludGVyZmFjZSBoYXMgb25lIG1ldGhvZDoKKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgIG9yZy5mcmVlZGVza3RvcC5EQnVzLkludHJvc3BlY3RhYmxlLkludHJvc3BlY3QgKG91dCBTVFJJTkcgeG1sX2RhdGEpCisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgT2JqZWN0cyBpbnN0YW5jZXMgbWF5IGltcGxlbWVudAorICAgICAgICA8bGl0ZXJhbD5JbnRyb3NwZWN0PC9saXRlcmFsPiB3aGljaCByZXR1cm5zIGFuIFhNTCBkZXNjcmlwdGlvbiBvZgorICAgICAgICB0aGUgb2JqZWN0LCBpbmNsdWRpbmcgaXRzIGludGVyZmFjZXMgKHdpdGggc2lnbmFscyBhbmQgbWV0aG9kcyksIG9iamVjdHMKKyAgICAgICAgYmVsb3cgaXQgaW4gdGhlIG9iamVjdCBwYXRoIHRyZWUsIGFuZCBpdHMgcHJvcGVydGllcy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICA8eHJlZiBsaW5rZW5kPSJpbnRyb3NwZWN0aW9uLWZvcm1hdCIvPiBkZXNjcmliZXMgdGhlIGZvcm1hdCBvZiB0aGlzIFhNTCBzdHJpbmcuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9InN0YW5kYXJkLWludGVyZmFjZXMtcHJvcGVydGllcyI+CisgICAgICA8dGl0bGU+PGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllczwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIE1hbnkgbmF0aXZlIEFQSXMgd2lsbCBoYXZlIGEgY29uY2VwdCBvZiBvYmplY3QgPGZpcnN0dGVybT5wcm9wZXJ0aWVzPC9maXJzdHRlcm0+IAorICAgICAgICBvciA8Zmlyc3R0ZXJtPmF0dHJpYnV0ZXM8L2ZpcnN0dGVybT4uIFRoZXNlIGNhbiBiZSBleHBvc2VkIHZpYSB0aGUgCisgICAgICAgIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnRpZXM8L2xpdGVyYWw+IGludGVyZmFjZS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgIG9yZy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnRpZXMuR2V0IChpbiBTVFJJTkcgaW50ZXJmYWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBTVFJJTkcgcHJvcGVydHlfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBWQVJJQU5UIHZhbHVlKTsKKyAgICAgICAgICAgICAgb3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllcy5TZXQgKGluIFNUUklORyBpbnRlcmZhY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIFNUUklORyBwcm9wZXJ0eV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gVkFSSUFOVCB2YWx1ZSk7CisgICAgICAgICAgICAgIG9yZy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnRpZXMuR2V0QWxsIChpbiBTVFJJTkcgaW50ZXJmYWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgRElDVCZsdDtTVFJJTkcsVkFSSUFOVCZndDsgcHJvcHMpOworICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEl0IGlzIGNvbnZlbnRpb25hbCB0byBnaXZlIEQtQnVzIHByb3BlcnRpZXMgbmFtZXMgY29uc2lzdGluZyBvZgorICAgICAgICBjYXBpdGFsaXplZCB3b3JkcyB3aXRob3V0IHB1bmN0dWF0aW9uICgiQ2FtZWxDYXNlIiksIGxpa2UKKyAgICAgICAgPGxpbmsgbGlua2VuZD0ibWVzc2FnZS1wcm90b2NvbC1uYW1lcy1tZW1iZXIiPm1lbWJlciBuYW1lczwvbGluaz4uCisgICAgICAgIEZvciBpbnN0YW5jZSwgdGhlIEdPYmplY3QgcHJvcGVydHkKKyAgICAgICAgPGxpdGVyYWw+Y29ubmVjdGlvbi1zdGF0dXM8L2xpdGVyYWw+IG9yIHRoZSBRdCBwcm9wZXJ0eQorICAgICAgICA8bGl0ZXJhbD5jb25uZWN0aW9uU3RhdHVzPC9saXRlcmFsPiBjb3VsZCBiZSByZXByZXNlbnRlZCBvbiBELUJ1cworICAgICAgICBhcyA8bGl0ZXJhbD5Db25uZWN0aW9uU3RhdHVzPC9saXRlcmFsPi4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBTdHJpY3RseSBzcGVha2luZywgRC1CdXMgcHJvcGVydHkgbmFtZXMgYXJlIG5vdCByZXF1aXJlZCB0byBmb2xsb3cKKyAgICAgICAgdGhlIHNhbWUgbmFtaW5nIHJlc3RyaWN0aW9ucyBhcyBtZW1iZXIgbmFtZXMsIGJ1dCBELUJ1cyBwcm9wZXJ0eQorICAgICAgICBuYW1lcyB0aGF0IHdvdWxkIG5vdCBiZSB2YWxpZCBtZW1iZXIgbmFtZXMgKGluIHBhcnRpY3VsYXIsCisgICAgICAgIEdPYmplY3Qtc3R5bGUgZGFzaC1zZXBhcmF0ZWQgcHJvcGVydHkgbmFtZXMpIGNhbiBjYXVzZSBpbnRlcm9wZXJhYmlsaXR5CisgICAgICAgIHByb2JsZW1zIGFuZCBzaG91bGQgYmUgYXZvaWRlZC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgYXZhaWxhYmxlIHByb3BlcnRpZXMgYW5kIHdoZXRoZXIgdGhleSBhcmUgd3JpdGFibGUgY2FuIGJlIGRldGVybWluZWQKKyAgICAgICAgYnkgY2FsbGluZyA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5JbnRyb3NwZWN0YWJsZS5JbnRyb3NwZWN0PC9saXRlcmFsPiwKKyAgICAgICAgc2VlIDx4cmVmIGxpbmtlbmQ9InN0YW5kYXJkLWludGVyZmFjZXMtaW50cm9zcGVjdGFibGUiLz4uCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgQW4gZW1wdHkgc3RyaW5nIG1heSBiZSBwcm92aWRlZCBmb3IgdGhlIGludGVyZmFjZSBuYW1lOyBpbiB0aGlzIGNhc2UsIAorICAgICAgICBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgcHJvcGVydGllcyBvbiBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBuYW1lLCAKKyAgICAgICAgdGhlIHJlc3VsdHMgYXJlIHVuZGVmaW5lZCAocGlja2luZyBvbmUgYnkgYWNjb3JkaW5nIHRvIGFuIGFyYml0cmFyeSAKKyAgICAgICAgZGV0ZXJtaW5pc3RpYyBydWxlLCBvciByZXR1cm5pbmcgYW4gZXJyb3IsIGFyZSB0aGUgcmVhc29uYWJsZSAKKyAgICAgICAgcG9zc2liaWxpdGllcykuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgSWYgb25lIG9yIG1vcmUgcHJvcGVydGllcyBjaGFuZ2Ugb24gYW4gb2JqZWN0LCB0aGUKKyAgICAgICAgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllcy5Qcm9wZXJ0aWVzQ2hhbmdlZDwvbGl0ZXJhbD4KKyAgICAgICAgc2lnbmFsIG1heSBiZSBlbWl0dGVkICh0aGlzIHNpZ25hbCB3YXMgYWRkZWQgaW4gMC4xNCk6CisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICBvcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzLlByb3BlcnRpZXNDaGFuZ2VkIChTVFJJTkcgaW50ZXJmYWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJQ1QmbHQ7U1RSSU5HLFZBUklBTlQmZ3Q7IGNoYW5nZWRfcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVkmbHQ7U1RSSU5HJmd0OyBpbnZhbGlkYXRlZF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICB3aGVyZSA8bGl0ZXJhbD5jaGFuZ2VkX3Byb3BlcnRpZXM8L2xpdGVyYWw+IGlzIGEgZGljdGlvbmFyeQorICAgICAgICBjb250YWluaW5nIHRoZSBjaGFuZ2VkIHByb3BlcnRpZXMgd2l0aCB0aGUgbmV3IHZhbHVlcyBhbmQKKyAgICAgICAgPGxpdGVyYWw+aW52YWxpZGF0ZWRfcHJvcGVydGllczwvbGl0ZXJhbD4gaXMgYW4gYXJyYXkgb2YKKyAgICAgICAgcHJvcGVydGllcyB0aGF0IGNoYW5nZWQgYnV0IHRoZSB2YWx1ZSBpcyBub3QgY29udmV5ZWQuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgV2hldGhlciB0aGUgPGxpdGVyYWw+UHJvcGVydGllc0NoYW5nZWQ8L2xpdGVyYWw+IHNpZ25hbCBpcworICAgICAgICBzdXBwb3J0ZWQgY2FuIGJlIGRldGVybWluZWQgYnkgY2FsbGluZworICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5JbnRyb3NwZWN0YWJsZS5JbnRyb3NwZWN0PC9saXRlcmFsPi4gTm90ZQorICAgICAgICB0aGF0IHRoZSBzaWduYWwgbWF5IGJlIHN1cHBvcnRlZCBmb3IgYW4gb2JqZWN0IGJ1dCBpdCBtYXkKKyAgICAgICAgZGlmZmVyIGhvdyB3aGV0aGVyIGFuZCBob3cgaXQgaXMgdXNlZCBvbiBhIHBlci1wcm9wZXJ0eSBiYXNpcworICAgICAgICAoZm9yIGUuZy4gcGVyZm9ybWFuY2Ugb3Igc2VjdXJpdHkgcmVhc29ucykuIEVhY2ggcHJvcGVydHkgKG9yCisgICAgICAgIHRoZSBwYXJlbnQgaW50ZXJmYWNlKSBtdXN0IGJlIGFubm90YXRlZCB3aXRoIHRoZQorICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0eS5FbWl0c0NoYW5nZWRTaWduYWw8L2xpdGVyYWw+CisgICAgICAgIGFubm90YXRpb24gdG8gY29udmV5IHRoaXMgKHVzdWFsbHkgdGhlIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4gaXMgc3VmZmljaWVudCBtZWFuaW5nIHRoYXQgdGhlCisgICAgICAgIGFubm90YXRpb24gZG9lcyBub3QgbmVlZCB0byBiZSB1c2VkKS4gU2VlIDx4cmVmCisgICAgICAgIGxpbmtlbmQ9ImludHJvc3BlY3Rpb24tZm9ybWF0Ii8+IGZvciBkZXRhaWxzIG9uIHRoaXMKKyAgICAgICAgYW5ub3RhdGlvbi4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorCisgICAgPHNlY3QyIGlkPSJzdGFuZGFyZC1pbnRlcmZhY2VzLW9iamVjdG1hbmFnZXIiPgorICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLk9iamVjdE1hbmFnZXI8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBBbiBBUEkgY2FuIG9wdGlvbmFsbHkgbWFrZSB1c2Ugb2YgdGhpcyBpbnRlcmZhY2UgZm9yIG9uZSBvcgorICAgICAgICBtb3JlIHN1Yi10cmVlcyBvZiBvYmplY3RzLiBUaGUgcm9vdCBvZiBlYWNoIHN1Yi10cmVlIGltcGxlbWVudHMKKyAgICAgICAgdGhpcyBpbnRlcmZhY2Ugc28gb3RoZXIgYXBwbGljYXRpb25zIGNhbiBnZXQgYWxsIG9iamVjdHMsCisgICAgICAgIGludGVyZmFjZXMgYW5kIHByb3BlcnRpZXMgaW4gYSBzaW5nbGUgbWV0aG9kIGNhbGwuICBJdCBpcworICAgICAgICBhcHByb3ByaWF0ZSB0byB1c2UgdGhpcyBpbnRlcmZhY2UgaWYgdXNlcnMgb2YgdGhlIHRyZWUgb2YKKyAgICAgICAgb2JqZWN0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgaW50ZXJlc3RlZCBpbiBhbGwgaW50ZXJmYWNlcyBvZiBhbGwKKyAgICAgICAgb2JqZWN0cyBpbiB0aGUgdHJlZTsgYSBtb3JlIGdyYW51bGFyIEFQSSBzaG91bGQgYmUgdXNlZCBpZgorICAgICAgICB1c2VycyBvZiB0aGUgb2JqZWN0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgaW50ZXJlc3RlZCBpbiBhIHNtYWxsCisgICAgICAgIHN1YnNldCBvZiB0aGUgb2JqZWN0cywgYSBzbWFsbCBzdWJzZXQgb2YgdGhlaXIgaW50ZXJmYWNlcywgb3IKKyAgICAgICAgYm90aC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgbWV0aG9kIHRoYXQgYXBwbGljYXRpb25zIGNhbiB1c2UgdG8gZ2V0IGFsbCBvYmplY3RzIGFuZAorICAgICAgICBwcm9wZXJ0aWVzIGlzIDxsaXRlcmFsPkdldE1hbmFnZWRPYmplY3RzPC9saXRlcmFsPjoKKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgb3JnLmZyZWVkZXNrdG9wLkRCdXMuT2JqZWN0TWFuYWdlci5HZXRNYW5hZ2VkT2JqZWN0cyAob3V0IERJQ1QmbHQ7T0JKUEFUSCxESUNUJmx0O1NUUklORyxESUNUJmx0O1NUUklORyxWQVJJQU5UJmd0OyZndDsmZ3Q7IG9ianBhdGhfaW50ZXJmYWNlc19hbmRfcHJvcGVydGllcyk7CisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIG1ldGhvZCBpcyBhIGRpY3Qgd2hvc2Uga2V5cyBhcmUKKyAgICAgICAgb2JqZWN0IHBhdGhzLiBBbGwgcmV0dXJuZWQgb2JqZWN0IHBhdGhzIGFyZSBjaGlsZHJlbiBvZiB0aGUKKyAgICAgICAgb2JqZWN0IHBhdGggaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlLCBpLmUuIHRoZWlyIG9iamVjdAorICAgICAgICBwYXRocyBzdGFydCB3aXRoIHRoZSBPYmplY3RNYW5hZ2VyJ3Mgb2JqZWN0IHBhdGggcGx1cyAnLycuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgRWFjaCB2YWx1ZSBpcyBhIGRpY3Qgd2hvc2Uga2V5cyBhcmUgaW50ZXJmYWNlcyBuYW1lcy4gIEVhY2gKKyAgICAgICAgdmFsdWUgaW4gdGhpcyBpbm5lciBkaWN0IGlzIHRoZSBzYW1lIGRpY3QgdGhhdCB3b3VsZCBiZQorICAgICAgICByZXR1cm5lZCBieSB0aGUgPGxpbmsKKyAgICAgICAgbGlua2VuZD0ic3RhbmRhcmQtaW50ZXJmYWNlcy1wcm9wZXJ0aWVzIj5vcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzLkdldEFsbCgpPC9saW5rPgorICAgICAgICBtZXRob2QgZm9yIHRoYXQgY29tYmluYXRpb24gb2Ygb2JqZWN0IHBhdGggYW5kIGludGVyZmFjZS4gSWYKKyAgICAgICAgYW4gaW50ZXJmYWNlIGhhcyBubyBwcm9wZXJ0aWVzLCB0aGUgZW1wdHkgZGljdCBpcyByZXR1cm5lZC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBDaGFuZ2VzIGFyZSBlbWl0dGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgdHdvIHNpZ25hbHM6CisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgIG9yZy5mcmVlZGVza3RvcC5EQnVzLk9iamVjdE1hbmFnZXIuSW50ZXJmYWNlc0FkZGVkIChPQkpQQVRIIG9iamVjdF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUNUJmx0O1NUUklORyxESUNUJmx0O1NUUklORyxWQVJJQU5UJmd0OyZndDsgaW50ZXJmYWNlc19hbmRfcHJvcGVydGllcyk7CisgICAgICAgICAgb3JnLmZyZWVkZXNrdG9wLkRCdXMuT2JqZWN0TWFuYWdlci5JbnRlcmZhY2VzUmVtb3ZlZCAoT0JKUEFUSCBvYmplY3RfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWSZsdDtTVFJJTkcmZ3Q7IGludGVyZmFjZXMpOworICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSA8bGl0ZXJhbD5JbnRlcmZhY2VzQWRkZWQ8L2xpdGVyYWw+IHNpZ25hbCBpcyBlbWl0dGVkIHdoZW4KKyAgICAgICAgZWl0aGVyIGEgbmV3IG9iamVjdCBpcyBhZGRlZCBvciB3aGVuIGFuIGV4aXN0aW5nIG9iamVjdCBnYWlucworICAgICAgICBvbmUgb3IgbW9yZSBpbnRlcmZhY2VzLiBUaGUKKyAgICAgICAgPGxpdGVyYWw+SW50ZXJmYWNlc1JlbW92ZWQ8L2xpdGVyYWw+IHNpZ25hbCBpcyBlbWl0dGVkCisgICAgICAgIHdoZW5ldmVyIGFuIG9iamVjdCBpcyByZW1vdmVkIG9yIGl0IGxvc2VzIG9uZSBvciBtb3JlCisgICAgICAgIGludGVyZmFjZXMuIFRoZSBzZWNvbmQgcGFyYW1ldGVyIG9mIHRoZQorICAgICAgICA8bGl0ZXJhbD5JbnRlcmZhY2VzQWRkZWQ8L2xpdGVyYWw+IHNpZ25hbCBjb250YWlucyBhIGRpY3Qgd2l0aAorICAgICAgICB0aGUgaW50ZXJmYWNlcyBhbmQgcHJvcGVydGllcyAoaWYgYW55KSB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0bworICAgICAgICB0aGUgZ2l2ZW4gb2JqZWN0IHBhdGguIFNpbWlsYXJseSwgdGhlIHNlY29uZCBwYXJhbWV0ZXIgb2YgdGhlCisgICAgICAgIDxsaXRlcmFsPkludGVyZmFjZXNSZW1vdmVkPC9saXRlcmFsPiBzaWduYWwgY29udGFpbnMgYW4gYXJyYXkKKyAgICAgICAgb2YgdGhlIGludGVyZmFjZXMgdGhhdCB3ZXJlIHJlbW92ZWQuIE5vdGUgdGhhdCBjaGFuZ2VzIG9uCisgICAgICAgIHByb3BlcnRpZXMgb24gZXhpc3RpbmcgaW50ZXJmYWNlcyBhcmUgbm90IHJlcG9ydGVkIHVzaW5nIHRoaXMKKyAgICAgICAgaW50ZXJmYWNlIC0gYW4gYXBwbGljYXRpb24gc2hvdWxkIGFsc28gbW9uaXRvciB0aGUgZXhpc3RpbmcgPGxpbmsKKyAgICAgICAgbGlua2VuZD0ic3RhbmRhcmQtaW50ZXJmYWNlcy1wcm9wZXJ0aWVzIj5Qcm9wZXJ0aWVzQ2hhbmdlZDwvbGluaz4KKyAgICAgICAgc2lnbmFsIG9uIGVhY2ggb2JqZWN0LgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEFwcGxpY2F0aW9ucyBTSE9VTEQgTk9UIGV4cG9ydCBvYmplY3RzIHRoYXQgYXJlIGNoaWxkcmVuIG9mIGFuCisgICAgICAgIG9iamVjdCAoZGlyZWN0bHkgb3Igb3RoZXJ3aXNlKSBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgYnV0CisgICAgICAgIHdoaWNoIGFyZSBub3QgcmV0dXJuZWQgaW4gdGhlIHJlcGx5IGZyb20gdGhlCisgICAgICAgIDxsaXRlcmFsPkdldE1hbmFnZWRPYmplY3RzKCk8L2xpdGVyYWw+IG1ldGhvZCBvZiB0aGlzCisgICAgICAgIGludGVyZmFjZSBvbiB0aGUgZ2l2ZW4gb2JqZWN0LgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBpbnRlbnQgb2YgdGhlIDxsaXRlcmFsPk9iamVjdE1hbmFnZXI8L2xpdGVyYWw+IGludGVyZmFjZQorICAgICAgICBpcyB0byBtYWtlIGl0IGVhc3kgdG8gd3JpdGUgYSByb2J1c3QgY2xpZW50CisgICAgICAgIGltcGxlbWVudGF0aW9uLiBUaGUgdHJpdmlhbCBjbGllbnQgaW1wbGVtZW50YXRpb24gb25seSBuZWVkcworICAgICAgICB0byBtYWtlIHR3byBtZXRob2QgY2FsbHM6CisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgIG9yZy5mcmVlZGVza3RvcC5EQnVzLkFkZE1hdGNoIChidXNfcHJveHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlPSdzaWduYWwnLG5hbWU9J29yZy5leGFtcGxlLkFwcCcscGF0aF9uYW1lc3BhY2U9Jy9vcmcvZXhhbXBsZS9BcHAnIik7CisgICAgICAgICAgb2JqZWN0cyA9IG9yZy5mcmVlZGVza3RvcC5EQnVzLk9iamVjdE1hbmFnZXIuR2V0TWFuYWdlZE9iamVjdHMgKGFwcF9wcm94eSk7CisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgb24gdGhlIG1lc3NhZ2UgYnVzIGFuZCB0aGUgcmVtb3RlIGFwcGxpY2F0aW9uJ3MKKyAgICAgICAgPGxpdGVyYWw+T2JqZWN0TWFuYWdlcjwvbGl0ZXJhbD4sIHJlc3BlY3RpdmVseS4gV2hlbmV2ZXIgYSBuZXcKKyAgICAgICAgcmVtb3RlIG9iamVjdCBpcyBjcmVhdGVkIChvciBhbiBleGlzdGluZyBvYmplY3QgZ2FpbnMgYSBuZXcKKyAgICAgICAgaW50ZXJmYWNlKSwgdGhlIDxsaXRlcmFsPkludGVyZmFjZXNBZGRlZDwvbGl0ZXJhbD4gc2lnbmFsIGlzCisgICAgICAgIGVtaXR0ZWQsIGFuZCBzaW5jZSB0aGlzIHNpZ25hbCBjb250YWlucyBhbGwgcHJvcGVydGllcyBmb3IgdGhlCisgICAgICAgIGludGVyZmFjZXMsIG5vIGNhbGxzIHRvIHRoZQorICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuUHJvcGVydGllczwvbGl0ZXJhbD4gaW50ZXJmYWNlIG9uIHRoZQorICAgICAgICByZW1vdGUgb2JqZWN0IGFyZSBuZWVkZWQuIEFkZGl0aW9uYWxseSwgc2luY2UgdGhlIGluaXRpYWwKKyAgICAgICAgPGxpdGVyYWw+QWRkTWF0Y2goKTwvbGl0ZXJhbD4gcnVsZSBhbHJlYWR5IGluY2x1ZGVzIHNpZ25hbAorICAgICAgICBtZXNzYWdlcyBmcm9tIHRoZSBuZXdseSBjcmVhdGVkIGNoaWxkIG9iamVjdCwgbm8gbmV3CisgICAgICAgIDxsaXRlcmFsPkFkZE1hdGNoKCk8L2xpdGVyYWw+IGNhbGwgaXMgbmVlZGVkLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgPGVtcGhhc2lzPgorICAgICAgICAgIFRoZSA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5PYmplY3RNYW5hZ2VyPC9saXRlcmFsPgorICAgICAgICAgIGludGVyZmFjZSB3YXMgYWRkZWQgaW4gdmVyc2lvbiAwLjE3IG9mIHRoZSBELUJ1cworICAgICAgICAgIHNwZWNpZmljYXRpb24uCisgICAgICAgIDwvZW1waGFzaXM+CisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgPC9zZWN0MT4KKworICA8c2VjdDEgaWQ9ImludHJvc3BlY3Rpb24tZm9ybWF0Ij4KKyAgICA8dGl0bGU+SW50cm9zcGVjdGlvbiBEYXRhIEZvcm1hdDwvdGl0bGU+CisgICAgPHBhcmE+CisgICAgICBBcyBkZXNjcmliZWQgaW4gPHhyZWYgbGlua2VuZD0ic3RhbmRhcmQtaW50ZXJmYWNlcy1pbnRyb3NwZWN0YWJsZSIvPiwgCisgICAgICBvYmplY3RzIG1heSBiZSBpbnRyb3NwZWN0ZWQgYXQgcnVudGltZSwgcmV0dXJuaW5nIGFuIFhNTCBzdHJpbmcgCisgICAgICB0aGF0IGRlc2NyaWJlcyB0aGUgb2JqZWN0LiBUaGUgc2FtZSBYTUwgZm9ybWF0IG1heSBiZSB1c2VkIGluIAorICAgICAgb3RoZXIgY29udGV4dHMgYXMgd2VsbCwgZm9yIGV4YW1wbGUgYXMgYW4gIklETCIgZm9yIGdlbmVyYXRpbmcgCisgICAgICBzdGF0aWMgbGFuZ3VhZ2UgYmluZGluZ3MuCisgICAgPC9wYXJhPgorICAgIDxwYXJhPgorICAgICAgSGVyZSBpcyBhbiBleGFtcGxlIG9mIGludHJvc3BlY3Rpb24gZGF0YToKKyAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgJmx0OyFET0NUWVBFIG5vZGUgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIE9iamVjdCBJbnRyb3NwZWN0aW9uIDEuMC8vRU4iCisgICAgICAgICAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2ludHJvc3BlY3QuZHRkIiZndDsKKyAgICAgICAgJmx0O25vZGUgbmFtZT0iL29yZy9mcmVlZGVza3RvcC9zYW1wbGVfb2JqZWN0IiZndDsKKyAgICAgICAgICAmbHQ7aW50ZXJmYWNlIG5hbWU9Im9yZy5mcmVlZGVza3RvcC5TYW1wbGVJbnRlcmZhY2UiJmd0OworICAgICAgICAgICAgJmx0O21ldGhvZCBuYW1lPSJGcm9iYXRlIiZndDsKKyAgICAgICAgICAgICAgJmx0O2FyZyBuYW1lPSJmb28iIHR5cGU9ImkiIGRpcmVjdGlvbj0iaW4iLyZndDsKKyAgICAgICAgICAgICAgJmx0O2FyZyBuYW1lPSJiYXIiIHR5cGU9InMiIGRpcmVjdGlvbj0ib3V0Ii8mZ3Q7CisgICAgICAgICAgICAgICZsdDthcmcgbmFtZT0iYmF6IiB0eXBlPSJhe3VzfSIgZGlyZWN0aW9uPSJvdXQiLyZndDsKKyAgICAgICAgICAgICAgJmx0O2Fubm90YXRpb24gbmFtZT0ib3JnLmZyZWVkZXNrdG9wLkRCdXMuRGVwcmVjYXRlZCIgdmFsdWU9InRydWUiLyZndDsKKyAgICAgICAgICAgICZsdDsvbWV0aG9kJmd0OworICAgICAgICAgICAgJmx0O21ldGhvZCBuYW1lPSJCYXppZnkiJmd0OworICAgICAgICAgICAgICAmbHQ7YXJnIG5hbWU9ImJhciIgdHlwZT0iKGlpdSkiIGRpcmVjdGlvbj0iaW4iLyZndDsKKyAgICAgICAgICAgICAgJmx0O2FyZyBuYW1lPSJiYXIiIHR5cGU9InYiIGRpcmVjdGlvbj0ib3V0Ii8mZ3Q7CisgICAgICAgICAgICAmbHQ7L21ldGhvZCZndDsKKyAgICAgICAgICAgICZsdDttZXRob2QgbmFtZT0iTW9ncmlmeSImZ3Q7CisgICAgICAgICAgICAgICZsdDthcmcgbmFtZT0iYmFyIiB0eXBlPSIoaWlhdikiIGRpcmVjdGlvbj0iaW4iLyZndDsKKyAgICAgICAgICAgICZsdDsvbWV0aG9kJmd0OworICAgICAgICAgICAgJmx0O3NpZ25hbCBuYW1lPSJDaGFuZ2VkIiZndDsKKyAgICAgICAgICAgICAgJmx0O2FyZyBuYW1lPSJuZXdfdmFsdWUiIHR5cGU9ImIiLyZndDsKKyAgICAgICAgICAgICZsdDsvc2lnbmFsJmd0OworICAgICAgICAgICAgJmx0O3Byb3BlcnR5IG5hbWU9IkJhciIgdHlwZT0ieSIgYWNjZXNzPSJyZWFkd3JpdGUiLyZndDsKKyAgICAgICAgICAmbHQ7L2ludGVyZmFjZSZndDsKKyAgICAgICAgICAmbHQ7bm9kZSBuYW1lPSJjaGlsZF9vZl9zYW1wbGVfb2JqZWN0Ii8mZ3Q7CisgICAgICAgICAgJmx0O25vZGUgbmFtZT0iYW5vdGhlcl9jaGlsZF9vZl9zYW1wbGVfb2JqZWN0Ii8mZ3Q7CisgICAgICAgJmx0Oy9ub2RlJmd0OworICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICA8L3BhcmE+CisgICAgPHBhcmE+CisgICAgICBBIG1vcmUgZm9ybWFsIERURCBhbmQgc3BlYyBuZWVkcyB3cml0aW5nLCBidXQgaGVyZSBhcmUgc29tZSBxdWljayBub3Rlcy4KKyAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIE9ubHkgdGhlIHJvb3QgJmx0O25vZGUmZ3Q7IGVsZW1lbnQgY2FuIG9taXQgdGhlIG5vZGUgbmFtZSwgYXMgaXQncworICAgICAgICAgICAga25vd24gdG8gYmUgdGhlIG9iamVjdCB0aGF0IHdhcyBpbnRyb3NwZWN0ZWQuICBJZiB0aGUgcm9vdAorICAgICAgICAgICAgJmx0O25vZGUmZ3Q7IGRvZXMgaGF2ZSBhIG5hbWUgYXR0cmlidXRlLCBpdCBtdXN0IGJlIGFuIGFic29sdXRlCisgICAgICAgICAgICBvYmplY3QgcGF0aC4gSWYgY2hpbGQgJmx0O25vZGUmZ3Q7IGhhdmUgb2JqZWN0IHBhdGhzLCB0aGV5IG11c3QgYmUKKyAgICAgICAgICAgIHJlbGF0aXZlLgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSWYgYSBjaGlsZCAmbHQ7bm9kZSZndDsgaGFzIGFueSBzdWItZWxlbWVudHMsIHRoZW4gdGhleSAKKyAgICAgICAgICAgIG11c3QgcmVwcmVzZW50IGEgY29tcGxldGUgaW50cm9zcGVjdGlvbiBvZiB0aGUgY2hpbGQuCisgICAgICAgICAgICBJZiBhIGNoaWxkICZsdDtub2RlJmd0OyBpcyBlbXB0eSwgdGhlbiBpdCBtYXkgb3IgbWF5IAorICAgICAgICAgICAgbm90IGhhdmUgc3ViLWVsZW1lbnRzOyB0aGUgY2hpbGQgbXVzdCBiZSBpbnRyb3NwZWN0ZWQKKyAgICAgICAgICAgIGluIG9yZGVyIHRvIGZpbmQgb3V0LiBUaGUgaW50ZW50IGlzIHRoYXQgaWYgYW4gb2JqZWN0IAorICAgICAgICAgICAga25vd3MgdGhhdCBpdHMgY2hpbGRyZW4gYXJlICJmYXN0IiB0byBpbnRyb3NwZWN0CisgICAgICAgICAgICBpdCBjYW4gZ28gYWhlYWQgYW5kIHJldHVybiB0aGVpciBpbmZvcm1hdGlvbiwgYnV0IAorICAgICAgICAgICAgb3RoZXJ3aXNlIGl0IGNhbiBvbWl0IGl0LgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIGRpcmVjdGlvbiBlbGVtZW50IG9uICZsdDthcmcmZ3Q7IG1heSBiZSBvbWl0dGVkLCAKKyAgICAgICAgICAgIGluIHdoaWNoIGNhc2UgaXQgZGVmYXVsdHMgdG8gImluIiBmb3IgbWV0aG9kIGNhbGxzIAorICAgICAgICAgICAgYW5kICJvdXQiIGZvciBzaWduYWxzLiBTaWduYWxzIG9ubHkgYWxsb3cgIm91dCIgCisgICAgICAgICAgICBzbyB3aGlsZSBkaXJlY3Rpb24gbWF5IGJlIHNwZWNpZmllZCwgaXQncyBwb2ludGxlc3MuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgcG9zc2libGUgZGlyZWN0aW9ucyBhcmUgImluIiBhbmQgIm91dCIsIAorICAgICAgICAgICAgdW5saWtlIENPUkJBIHRoZXJlIGlzIG5vICJpbm91dCIKKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBwb3NzaWJsZSBwcm9wZXJ0eSBhY2Nlc3MgZmxhZ3MgYXJlIAorICAgICAgICAgICAgInJlYWR3cml0ZSIsICJyZWFkIiwgYW5kICJ3cml0ZSIKKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIE11bHRpcGxlIGludGVyZmFjZXMgY2FuIG9mIGNvdXJzZSBiZSBsaXN0ZWQgZm9yIAorICAgICAgICAgICAgb25lICZsdDtub2RlJmd0Oy4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSAibmFtZSIgYXR0cmlidXRlIG9uIGFyZ3VtZW50cyBpcyBvcHRpb25hbC4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICA8L3BhcmE+CisgICAgPHBhcmE+CisgICAgICAgIE1ldGhvZCwgaW50ZXJmYWNlLCBwcm9wZXJ0eSwgYW5kIHNpZ25hbCBlbGVtZW50cyBtYXkgaGF2ZQorICAgICAgICAiYW5ub3RhdGlvbnMiLCB3aGljaCBhcmUgZ2VuZXJpYyBrZXkvdmFsdWUgcGFpcnMgb2YgbWV0YWRhdGEuCisJVGhleSBhcmUgc2ltaWxhciBjb25jZXB0dWFsbHkgdG8gSmF2YSdzIGFubm90YXRpb25zIGFuZCBDIyBhdHRyaWJ1dGVzLgorICAgICAgICBXZWxsLWtub3duIGFubm90YXRpb25zOgorICAgICA8L3BhcmE+CisgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisJIDx0aGVhZD4KKwkgICA8cm93PgorCSAgICAgPGVudHJ5Pk5hbWU8L2VudHJ5PgorCSAgICAgPGVudHJ5PlZhbHVlcyAoc2VwYXJhdGVkIGJ5ICwpPC9lbnRyeT4KKwkgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisJICAgPC9yb3c+CisJIDwvdGhlYWQ+CisJIDx0Ym9keT4KKwkgICA8cm93PgorCSAgICAgPGVudHJ5Pm9yZy5mcmVlZGVza3RvcC5EQnVzLkRlcHJlY2F0ZWQ8L2VudHJ5PgorCSAgICAgPGVudHJ5PnRydWUsZmFsc2U8L2VudHJ5PgorCSAgICAgPGVudHJ5PldoZXRoZXIgb3Igbm90IHRoZSBlbnRpdHkgaXMgZGVwcmVjYXRlZDsgZGVmYXVsdHMgdG8gZmFsc2U8L2VudHJ5PgorCSAgIDwvcm93PgorCSAgIDxyb3c+CisJICAgICA8ZW50cnk+b3JnLmZyZWVkZXNrdG9wLkRCdXMuR0xpYi5DU3ltYm9sPC9lbnRyeT4KKwkgICAgIDxlbnRyeT4oc3RyaW5nKTwvZW50cnk+CisJICAgICA8ZW50cnk+VGhlIEMgc3ltYm9sOyBtYXkgYmUgdXNlZCBmb3IgbWV0aG9kcyBhbmQgaW50ZXJmYWNlczwvZW50cnk+CisJICAgPC9yb3c+CisJICAgPHJvdz4KKwkgICAgIDxlbnRyeT5vcmcuZnJlZWRlc2t0b3AuREJ1cy5NZXRob2QuTm9SZXBseTwvZW50cnk+CisJICAgICA8ZW50cnk+dHJ1ZSxmYWxzZTwvZW50cnk+CisJICAgICA8ZW50cnk+SWYgc2V0LCBkb24ndCBleHBlY3QgYSByZXBseSB0byB0aGUgbWV0aG9kIGNhbGw7IGRlZmF1bHRzIHRvIGZhbHNlLjwvZW50cnk+CisJICAgPC9yb3c+CisJICAgPHJvdz4KKwkgICAgIDxlbnRyeT5vcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0eS5FbWl0c0NoYW5nZWRTaWduYWw8L2VudHJ5PgorCSAgICAgPGVudHJ5PnRydWUsaW52YWxpZGF0ZXMsZmFsc2U8L2VudHJ5PgorCSAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgIElmIHNldCB0byA8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4sIHRoZQorICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzLlByb3BlcnRpZXNDaGFuZ2VkPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICBzaWduYWwsIHNlZSA8eHJlZgorICAgICAgICAgICAgICAgICBsaW5rZW5kPSJzdGFuZGFyZC1pbnRlcmZhY2VzLXByb3BlcnRpZXMiLz4gaXMgbm90CisgICAgICAgICAgICAgICAgIGd1YXJhbnRlZWQgdG8gYmUgZW1pdHRlZCBpZiB0aGUgcHJvcGVydHkgY2hhbmdlcy4KKyAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICBJZiBzZXQgdG8gPGxpdGVyYWw+aW52YWxpZGF0ZXM8L2xpdGVyYWw+IHRoZSBzaWduYWwKKyAgICAgICAgICAgICAgICAgaXMgZW1pdHRlZCBidXQgdGhlIHZhbHVlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUKKyAgICAgICAgICAgICAgICAgc2lnbmFsLgorICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgIElmIHNldCB0byA8bGl0ZXJhbD50cnVlPC9saXRlcmFsPiB0aGUgc2lnbmFsIGlzCisgICAgICAgICAgICAgICAgIGVtaXR0ZWQgd2l0aCB0aGUgdmFsdWUgaW5jbHVkZWQuCisgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIGZvciB0aGUgYW5ub3RhdGlvbiBkZWZhdWx0cyB0bworICAgICAgICAgICAgICAgICA8bGl0ZXJhbD50cnVlPC9saXRlcmFsPiBpZiB0aGUgZW5jbG9zaW5nIGludGVyZmFjZQorICAgICAgICAgICAgICAgICBlbGVtZW50IGRvZXMgbm90IHNwZWNpZnkgdGhlIGFubm90YXRpb24uIE90aGVyd2lzZSBpdAorICAgICAgICAgICAgICAgICBkZWZhdWx0cyB0byB0aGUgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSBlbmNsb3NpbmcKKyAgICAgICAgICAgICAgICAgaW50ZXJmYWNlIGVsZW1lbnQuCisgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgPC9lbnRyeT4KKwkgICA8L3Jvdz4KKwkgPC90Ym9keT4KKyAgICAgICA8L3Rncm91cD4KKyAgICAgPC9pbmZvcm1hbHRhYmxlPgorICA8L3NlY3QxPgorICA8c2VjdDEgaWQ9Im1lc3NhZ2UtYnVzIj4KKyAgICA8dGl0bGU+TWVzc2FnZSBCdXMgU3BlY2lmaWNhdGlvbjwvdGl0bGU+CisgICAgPHNlY3QyIGlkPSJtZXNzYWdlLWJ1cy1vdmVydmlldyI+CisgICAgICA8dGl0bGU+TWVzc2FnZSBCdXMgT3ZlcnZpZXc8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBtZXNzYWdlIGJ1cyBhY2NlcHRzIGNvbm5lY3Rpb25zIGZyb20gb25lIG9yIG1vcmUgYXBwbGljYXRpb25zLiAKKyAgICAgICAgT25jZSBjb25uZWN0ZWQsIGFwcGxpY2F0aW9ucyBjYW4gZXhjaGFuZ2UgbWVzc2FnZXMgd2l0aCBvdGhlciAKKyAgICAgICAgYXBwbGljYXRpb25zIHRoYXQgYXJlIGFsc28gY29ubmVjdGVkIHRvIHRoZSBidXMuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgSW4gb3JkZXIgdG8gcm91dGUgbWVzc2FnZXMgYW1vbmcgY29ubmVjdGlvbnMsIHRoZSBtZXNzYWdlIGJ1cyBrZWVwcyBhCisgICAgICAgIG1hcHBpbmcgZnJvbSBuYW1lcyB0byBjb25uZWN0aW9ucy4gRWFjaCBjb25uZWN0aW9uIGhhcyBvbmUKKyAgICAgICAgdW5pcXVlLWZvci10aGUtbGlmZXRpbWUtb2YtdGhlLWJ1cyBuYW1lIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQuCisgICAgICAgIEFwcGxpY2F0aW9ucyBtYXkgcmVxdWVzdCBhZGRpdGlvbmFsIG5hbWVzIGZvciBhIGNvbm5lY3Rpb24uIEFkZGl0aW9uYWwKKyAgICAgICAgbmFtZXMgYXJlIHVzdWFsbHkgIndlbGwta25vd24gbmFtZXMiIHN1Y2ggYXMKKyAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXh0RWRpdG9yIi4gV2hlbiBhIG5hbWUgaXMgYm91bmQgdG8gYSBjb25uZWN0aW9uLAorICAgICAgICB0aGF0IGNvbm5lY3Rpb24gaXMgc2FpZCB0byA8Zmlyc3R0ZXJtPm93bjwvZmlyc3R0ZXJtPiB0aGUgbmFtZS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgYnVzIGl0c2VsZiBvd25zIGEgc3BlY2lhbCBuYW1lLCA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1czwvbGl0ZXJhbD4uIAorICAgICAgICBUaGlzIG5hbWUgcm91dGVzIG1lc3NhZ2VzIHRvIHRoZSBidXMsIGFsbG93aW5nIGFwcGxpY2F0aW9ucyB0byBtYWtlIAorICAgICAgICBhZG1pbmlzdHJhdGl2ZSByZXF1ZXN0cy4gRm9yIGV4YW1wbGUsIGFwcGxpY2F0aW9ucyBjYW4gYXNrIHRoZSBidXMgCisgICAgICAgIHRvIGFzc2lnbiBhIG5hbWUgdG8gYSBjb25uZWN0aW9uLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEVhY2ggbmFtZSBtYXkgaGF2ZSA8Zmlyc3R0ZXJtPnF1ZXVlZCBvd25lcnM8L2ZpcnN0dGVybT4uICBXaGVuIGFuCisgICAgICAgIGFwcGxpY2F0aW9uIHJlcXVlc3RzIGEgbmFtZSBmb3IgYSBjb25uZWN0aW9uIGFuZCB0aGUgbmFtZSBpcyBhbHJlYWR5IGluCisgICAgICAgIHVzZSwgdGhlIGJ1cyB3aWxsIG9wdGlvbmFsbHkgYWRkIHRoZSBjb25uZWN0aW9uIHRvIGEgcXVldWUgd2FpdGluZyBmb3IgCisgICAgICAgIHRoZSBuYW1lLiBJZiB0aGUgY3VycmVudCBvd25lciBvZiB0aGUgbmFtZSBkaXNjb25uZWN0cyBvciByZWxlYXNlcworICAgICAgICB0aGUgbmFtZSwgdGhlIG5leHQgY29ubmVjdGlvbiBpbiB0aGUgcXVldWUgd2lsbCBiZWNvbWUgdGhlIG5ldyBvd25lci4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFRoaXMgZmVhdHVyZSBjYXVzZXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGhhcHBlbiBpZiB5b3Ugc3RhcnQgdHdvIHRleHQKKyAgICAgICAgZWRpdG9ycyBmb3IgZXhhbXBsZTsgdGhlIGZpcnN0IG9uZSBtYXkgcmVxdWVzdCAib3JnLmZyZWVkZXNrdG9wLlRleHRFZGl0b3IiLCAKKyAgICAgICAgYW5kIHRoZSBzZWNvbmQgd2lsbCBiZSBxdWV1ZWQgYXMgYSBwb3NzaWJsZSBvd25lciBvZiB0aGF0IG5hbWUuIFdoZW4gCisgICAgICAgIHRoZSBmaXJzdCBleGl0cywgdGhlIHNlY29uZCB3aWxsIHRha2Ugb3Zlci4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEFwcGxpY2F0aW9ucyBtYXkgc2VuZCA8Zmlyc3R0ZXJtPnVuaWNhc3QgbWVzc2FnZXM8L2ZpcnN0dGVybT4gdG8KKyAgICAgICAgYSBzcGVjaWZpYyByZWNpcGllbnQgb3IgdG8gdGhlIG1lc3NhZ2UgYnVzIGl0c2VsZiwgb3IKKyAgICAgICAgPGZpcnN0dGVybT5icm9hZGNhc3QgbWVzc2FnZXM8L2ZpcnN0dGVybT4gdG8gYWxsIGludGVyZXN0ZWQgcmVjaXBpZW50cy4KKyAgICAgICAgU2VlIDx4cmVmIGxpbmtlbmQ9Im1lc3NhZ2UtYnVzLXJvdXRpbmciLz4gZm9yIGRldGFpbHMuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0MiBpZD0ibWVzc2FnZS1idXMtbmFtZXMiPgorICAgICAgPHRpdGxlPk1lc3NhZ2UgQnVzIE5hbWVzPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBFYWNoIGNvbm5lY3Rpb24gaGFzIGF0IGxlYXN0IG9uZSBuYW1lLCBhc3NpZ25lZCBhdCBjb25uZWN0aW9uIHRpbWUgYW5kCisgICAgICAgIHJldHVybmVkIGluIHJlc3BvbnNlIHRvIHRoZQorICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5IZWxsbzwvbGl0ZXJhbD4gbWV0aG9kIGNhbGwuICBUaGlzCisgICAgICAgIGF1dG9tYXRpY2FsbHktYXNzaWduZWQgbmFtZSBpcyBjYWxsZWQgdGhlIGNvbm5lY3Rpb24ncyA8Zmlyc3R0ZXJtPnVuaXF1ZQorICAgICAgICBuYW1lPC9maXJzdHRlcm0+LiAgVW5pcXVlIG5hbWVzIGFyZSBuZXZlciByZXVzZWQgZm9yIHR3byBkaWZmZXJlbnQKKyAgICAgICAgY29ubmVjdGlvbnMgdG8gdGhlIHNhbWUgYnVzLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIE93bmVyc2hpcCBvZiBhIHVuaXF1ZSBuYW1lIGlzIGEgcHJlcmVxdWlzaXRlIGZvciBpbnRlcmFjdGlvbiB3aXRoIAorICAgICAgICB0aGUgbWVzc2FnZSBidXMuIEl0IGxvZ2ljYWxseSBmb2xsb3dzIHRoYXQgdGhlIHVuaXF1ZSBuYW1lIGlzIGFsd2F5cyAKKyAgICAgICAgdGhlIGZpcnN0IG5hbWUgdGhhdCBhbiBhcHBsaWNhdGlvbiBjb21lcyB0byBvd24sIGFuZCB0aGUgbGFzdCAKKyAgICAgICAgb25lIHRoYXQgaXQgbG9zZXMgb3duZXJzaGlwIG9mLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFVuaXF1ZSBjb25uZWN0aW9uIG5hbWVzIG11c3QgYmVnaW4gd2l0aCB0aGUgY2hhcmFjdGVyICc6JyAoQVNDSUkgY29sb24KKyAgICAgICAgY2hhcmFjdGVyKTsgYnVzIG5hbWVzIHRoYXQgYXJlIG5vdCB1bmlxdWUgbmFtZXMgbXVzdCBub3QgYmVnaW4KKyAgICAgICAgd2l0aCB0aGlzIGNoYXJhY3Rlci4gKFRoZSBidXMgbXVzdCByZWplY3QgYW55IGF0dGVtcHQgYnkgYW4gYXBwbGljYXRpb24KKyAgICAgICAgdG8gbWFudWFsbHkgcmVxdWVzdCBhIG5hbWUgYmVnaW5uaW5nIHdpdGggJzonLikgVGhpcyByZXN0cmljdGlvbgorICAgICAgICBjYXRlZ29yaWNhbGx5IHByZXZlbnRzICJzcG9vZmluZyI7IG1lc3NhZ2VzIHNlbnQgdG8gYSB1bmlxdWUgbmFtZQorICAgICAgICB3aWxsIGFsd2F5cyBnbyB0byB0aGUgZXhwZWN0ZWQgY29ubmVjdGlvbi4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBXaGVuIGEgY29ubmVjdGlvbiBpcyBjbG9zZWQsIGFsbCB0aGUgbmFtZXMgdGhhdCBpdCBvd25zIGFyZSBkZWxldGVkIChvcgorICAgICAgICB0cmFuc2ZlcnJlZCB0byB0aGUgbmV4dCBjb25uZWN0aW9uIGluIHRoZSBxdWV1ZSBpZiBhbnkpLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEEgY29ubmVjdGlvbiBjYW4gcmVxdWVzdCBhZGRpdGlvbmFsIG5hbWVzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBpdCB1c2luZworICAgICAgICB0aGUgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUmVxdWVzdE5hbWU8L2xpdGVyYWw+IG1lc3NhZ2UuIDx4cmVmCisgICAgICAgIGxpbmtlbmQ9Im1lc3NhZ2UtcHJvdG9jb2wtbmFtZXMtYnVzIi8+IGRlc2NyaWJlcyB0aGUgZm9ybWF0IG9mIGEgdmFsaWQKKyAgICAgICAgbmFtZS4gVGhlc2UgbmFtZXMgY2FuIGJlIHJlbGVhc2VkIGFnYWluIHVzaW5nIHRoZQorICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5SZWxlYXNlTmFtZTwvbGl0ZXJhbD4gbWVzc2FnZS4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtcmVxdWVzdC1uYW1lIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLlJlcXVlc3ROYW1lPC9saXRlcmFsPjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFzIGEgbWV0aG9kOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIFVJTlQzMiBSZXF1ZXN0TmFtZSAoaW4gU1RSSU5HIG5hbWUsIGluIFVJTlQzMiBmbGFncykKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5OYW1lIHRvIHJlcXVlc3Q8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorCSAgICAgICAgPHJvdz4KKwkJICA8ZW50cnk+MTwvZW50cnk+CisJCSAgPGVudHJ5PlVJTlQzMjwvZW50cnk+CisJCSAgPGVudHJ5PkZsYWdzPC9lbnRyeT4KKwkgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICAgIFJlcGx5IGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlVJTlQzMjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+UmV0dXJuIHZhbHVlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGlzIG1ldGhvZCBjYWxsIHNob3VsZCBiZSBzZW50IHRvCisgICAgICAgICAgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXM8L2xpdGVyYWw+IGFuZCBhc2tzIHRoZSBtZXNzYWdlIGJ1cyB0bworICAgICAgICAgIGFzc2lnbiB0aGUgZ2l2ZW4gbmFtZSB0byB0aGUgbWV0aG9kIGNhbGxlci4gRWFjaCBuYW1lIG1haW50YWlucyBhCisgICAgICAgICAgcXVldWUgb2YgcG9zc2libGUgb3duZXJzLCB3aGVyZSB0aGUgaGVhZCBvZiB0aGUgcXVldWUgaXMgdGhlIHByaW1hcnkKKyAgICAgICAgICBvciBjdXJyZW50IG93bmVyIG9mIHRoZSBuYW1lLiBFYWNoIHBvdGVudGlhbCBvd25lciBpbiB0aGUgcXVldWUKKyAgICAgICAgICBtYWludGFpbnMgdGhlIERCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UIGFuZAorICAgICAgICAgIERCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRSBzZXR0aW5ncyBmcm9tIGl0cyBsYXRlc3QgUmVxdWVzdE5hbWUKKyAgICAgICAgICBjYWxsLiAgV2hlbiBSZXF1ZXN0TmFtZSBpcyBpbnZva2VkIHRoZSBmb2xsb3dpbmcgb2NjdXJzOgorICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIElmIHRoZSBtZXRob2QgY2FsbGVyIGlzIGN1cnJlbnRseSB0aGUgcHJpbWFyeSBvd25lciBvZiB0aGUgbmFtZSwKKyAgICAgICAgICAgICAgICB0aGUgREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgYW5kIERCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRQorICAgICAgICAgICAgICAgIHZhbHVlcyBhcmUgdXBkYXRlZCB3aXRoIHRoZSB2YWx1ZXMgZnJvbSB0aGUgbmV3IFJlcXVlc3ROYW1lIGNhbGwsIAorICAgICAgICAgICAgICAgIGFuZCBub3RoaW5nIGZ1cnRoZXIgaGFwcGVucy4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBJZiB0aGUgY3VycmVudCBwcmltYXJ5IG93bmVyIChoZWFkIG9mIHRoZSBxdWV1ZSkgaGFzCisgICAgICAgICAgICAgICAgREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgc2V0LCBhbmQgdGhlIFJlcXVlc3ROYW1lCisgICAgICAgICAgICAgICAgaW52b2NhdGlvbiBoYXMgdGhlIERCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcgZmxhZywgdGhlbgorICAgICAgICAgICAgICAgIHRoZSBjYWxsZXIgb2YgUmVxdWVzdE5hbWUgcmVwbGFjZXMgdGhlIGN1cnJlbnQgcHJpbWFyeSBvd25lciBhdAorICAgICAgICAgICAgICAgIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSBhbmQgdGhlIGN1cnJlbnQgcHJpbWFyeSBvd25lciBtb3ZlcyB0byB0aGUKKyAgICAgICAgICAgICAgICBzZWNvbmQgcG9zaXRpb24gaW4gdGhlIHF1ZXVlLiBJZiB0aGUgY2FsbGVyIG9mIFJlcXVlc3ROYW1lIHdhcyAKKyAgICAgICAgICAgICAgICBpbiB0aGUgcXVldWUgcHJldmlvdXNseSBpdHMgZmxhZ3MgYXJlIHVwZGF0ZWQgd2l0aCB0aGUgdmFsdWVzIGZyb20gCisgICAgICAgICAgICAgICAgdGhlIG5ldyBSZXF1ZXN0TmFtZSBpbiBhZGRpdGlvbiB0byBtb3ZpbmcgaXQgdG8gdGhlIGhlYWQgb2YgdGhlIHF1ZXVlLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIElmIHJlcGxhY2VtZW50IGlzIG5vdCBwb3NzaWJsZSwgYW5kIHRoZSBtZXRob2QgY2FsbGVyIGlzCisgICAgICAgICAgICAgICAgY3VycmVudGx5IGluIHRoZSBxdWV1ZSBidXQgbm90IHRoZSBwcmltYXJ5IG93bmVyLCBpdHMgZmxhZ3MgYXJlCisgICAgICAgICAgICAgICAgdXBkYXRlZCB3aXRoIHRoZSB2YWx1ZXMgZnJvbSB0aGUgbmV3IFJlcXVlc3ROYW1lIGNhbGwuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSWYgcmVwbGFjZW1lbnQgaXMgbm90IHBvc3NpYmxlLCBhbmQgdGhlIG1ldGhvZCBjYWxsZXIgaXMKKyAgICAgICAgICAgICAgICBjdXJyZW50bHkgbm90IGluIHRoZSBxdWV1ZSwgdGhlIG1ldGhvZCBjYWxsZXIgaXMgYXBwZW5kZWQgdG8gdGhlCisgICAgICAgICAgICAgICAgcXVldWUuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSWYgYW55IGNvbm5lY3Rpb24gaW4gdGhlIHF1ZXVlIGhhcyBEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUKKyAgICAgICAgICAgICAgICBzZXQgYW5kIGlzIG5vdCB0aGUgcHJpbWFyeSBvd25lciwgaXQgaXMgcmVtb3ZlZCBmcm9tIHRoZQorICAgICAgICAgICAgICAgIHF1ZXVlLiBUaGlzIGNhbiBhcHBseSB0byB0aGUgcHJldmlvdXMgcHJpbWFyeSBvd25lciAoaWYgaXQKKyAgICAgICAgICAgICAgICB3YXMgcmVwbGFjZWQpIG9yIHRoZSBtZXRob2QgY2FsbGVyIChpZiBpdCB1cGRhdGVkIHRoZQorICAgICAgICAgICAgICAgIERCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRSBmbGFnIHdoaWxlIHN0aWxsIHN0dWNrIGluIHRoZQorICAgICAgICAgICAgICAgIHF1ZXVlLCBvciBpZiBpdCB3YXMganVzdCBhZGRlZCB0byB0aGUgcXVldWUgd2l0aCB0aGF0IGZsYWcgc2V0KS4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBOb3RlIHRoYXQgREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORyByZXN1bHRzIGluICJqdW1waW5nIHRoZQorICAgICAgICAgIHF1ZXVlLCIgZXZlbiBpZiBhbm90aGVyIGFwcGxpY2F0aW9uIGFscmVhZHkgaW4gdGhlIHF1ZXVlIGhhZCBzcGVjaWZpZWQKKyAgICAgICAgICBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HLiAgVGhpcyBjb21lcyB1cCBpZiBhIHByaW1hcnkgb3duZXIKKyAgICAgICAgICB0aGF0IGRvZXMgbm90IGFsbG93IHJlcGxhY2VtZW50IGdvZXMgYXdheSwgYW5kIHRoZSBuZXh0IHByaW1hcnkgb3duZXIKKyAgICAgICAgICBkb2VzIGFsbG93IHJlcGxhY2VtZW50LiBJbiB0aGlzIGNhc2UsIHF1ZXVlZCBpdGVtcyB0aGF0IHNwZWNpZmllZAorICAgICAgICAgIERCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcgPGVtcGhhc2lzPmRvIG5vdDwvZW1waGFzaXM+CisgICAgICAgICAgYXV0b21hdGljYWxseSByZXBsYWNlIHRoZSBuZXcgcHJpbWFyeSBvd25lci4gSW4gb3RoZXIgd29yZHMsCisgICAgICAgICAgREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORyBpcyBub3Qgc2F2ZWQsIGl0IGlzIG9ubHkgdXNlZCBhdCB0aGUKKyAgICAgICAgICB0aW1lIFJlcXVlc3ROYW1lIGlzIGNhbGxlZC4gVGhpcyBpcyBkZWxpYmVyYXRlIHRvIGF2b2lkIGFuIGluZmluaXRlIGxvb3AKKyAgICAgICAgICBhbnl0aW1lIHR3byBhcHBsaWNhdGlvbnMgYXJlIGJvdGggREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgCisgICAgICAgICAgYW5kIERCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlIGZsYWdzIGFyZ3VtZW50IGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyBsb2dpY2FsbHkgT1JlZAorICAgICAgICAgIHRvZ2V0aGVyOgorCisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Db252ZW50aW9uYWwgTmFtZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VmFsdWU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorCSAgICAgICAgPHJvdz4KKwkJICA8ZW50cnk+REJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQ8L2VudHJ5PgorCQkgIDxlbnRyeT4weDE8L2VudHJ5PgorCQkgIDxlbnRyeT4KKworICAgICAgICAgICAgICAgICAgICBJZiBhbiBhcHBsaWNhdGlvbiBBIHNwZWNpZmllcyB0aGlzIGZsYWcgYW5kIHN1Y2NlZWRzIGluCisgICAgICAgICAgICAgICAgICAgIGJlY29taW5nIHRoZSBvd25lciBvZiB0aGUgbmFtZSwgYW5kIGFub3RoZXIgYXBwbGljYXRpb24gQgorICAgICAgICAgICAgICAgICAgICBsYXRlciBjYWxscyBSZXF1ZXN0TmFtZSB3aXRoIHRoZQorICAgICAgICAgICAgICAgICAgICBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HIGZsYWcsIHRoZW4gYXBwbGljYXRpb24gQQorICAgICAgICAgICAgICAgICAgICB3aWxsIGxvc2Ugb3duZXJzaGlwIGFuZCByZWNlaXZlIGEKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuTmFtZUxvc3Q8L2xpdGVyYWw+IHNpZ25hbCwgYW5kCisgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIEIgd2lsbCBiZWNvbWUgdGhlIG5ldyBvd25lci4gSWYgREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQKKyAgICAgICAgICAgICAgICAgICAgaXMgbm90IHNwZWNpZmllZCBieSBhcHBsaWNhdGlvbiBBLCBvciBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HCisgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBzcGVjaWZpZWQgYnkgYXBwbGljYXRpb24gQiwgdGhlbiBhcHBsaWNhdGlvbiBCIHdpbGwgbm90IHJlcGxhY2UKKyAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gQSBhcyB0aGUgb3duZXIuCisKKyAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisJICAgICAgICA8L3Jvdz4KKwkgICAgICAgIDxyb3c+CisJCSAgPGVudHJ5PkRCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkc8L2VudHJ5PgorCQkgIDxlbnRyeT4weDI8L2VudHJ5PgorCQkgIDxlbnRyeT4KKworICAgICAgICAgICAgICAgICAgICBUcnkgdG8gcmVwbGFjZSB0aGUgY3VycmVudCBvd25lciBpZiB0aGVyZSBpcyBvbmUuIElmIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgZmxhZyBpcyBub3Qgc2V0IHRoZSBhcHBsaWNhdGlvbiB3aWxsIG9ubHkgYmVjb21lIHRoZSBvd25lciBvZgorICAgICAgICAgICAgICAgICAgICB0aGUgbmFtZSBpZiB0aGVyZSBpcyBubyBjdXJyZW50IG93bmVyLiBJZiB0aGlzIGZsYWcgaXMgc2V0LAorICAgICAgICAgICAgICAgICAgICB0aGUgYXBwbGljYXRpb24gd2lsbCByZXBsYWNlIHRoZSBjdXJyZW50IG93bmVyIGlmCisgICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IG93bmVyIHNwZWNpZmllZCBEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVC4KKworICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKwkgICAgICAgIDwvcm93PgorCSAgICAgICAgPHJvdz4KKwkJICA8ZW50cnk+REJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFPC9lbnRyeT4KKwkJICA8ZW50cnk+MHg0PC9lbnRyeT4KKwkJICA8ZW50cnk+CisKKyAgICAgICAgICAgICAgICAgICAgV2l0aG91dCB0aGlzIGZsYWcsIGlmIGFuIGFwcGxpY2F0aW9uIHJlcXVlc3RzIGEgbmFtZSB0aGF0IGlzCisgICAgICAgICAgICAgICAgICAgIGFscmVhZHkgb3duZWQsIHRoZSBhcHBsaWNhdGlvbiB3aWxsIGJlIHBsYWNlZCBpbiBhIHF1ZXVlIHRvCisgICAgICAgICAgICAgICAgICAgIG93biB0aGUgbmFtZSB3aGVuIHRoZSBjdXJyZW50IG93bmVyIGdpdmVzIGl0IHVwLiBJZiB0aGlzCisgICAgICAgICAgICAgICAgICAgIGZsYWcgaXMgZ2l2ZW4sIHRoZSBhcHBsaWNhdGlvbiB3aWxsIG5vdCBiZSBwbGFjZWQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgIHF1ZXVlLCB0aGUgcmVxdWVzdCBmb3IgdGhlIG5hbWUgd2lsbCBzaW1wbHkgZmFpbC4gIFRoaXMgZmxhZworICAgICAgICAgICAgICAgICAgICBhbHNvIGFmZmVjdHMgYmVoYXZpb3Igd2hlbiBhbiBhcHBsaWNhdGlvbiBpcyByZXBsYWNlZCBhcworICAgICAgICAgICAgICAgICAgICBuYW1lIG93bmVyOyBieSBkZWZhdWx0IHRoZSBhcHBsaWNhdGlvbiBtb3ZlcyBiYWNrIGludG8gdGhlCisgICAgICAgICAgICAgICAgICAgIHdhaXRpbmcgcXVldWUsIHVubGVzcyB0aGlzIGZsYWcgd2FzIHByb3ZpZGVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgIGJlY2FtZSB0aGUgbmFtZSBvd25lci4KKworICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKwkgICAgICAgIDwvcm93PgorCSAgICAgIDwvdGJvZHk+CisJICAgIDwvdGdyb3VwPgorCSAgPC9pbmZvcm1hbHRhYmxlPgorCisgICAgICAgICAgVGhlIHJldHVybiBjb2RlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkNvbnZlbnRpb25hbCBOYW1lPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5WYWx1ZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisJICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRCVVNfUkVRVUVTVF9OQU1FX1JFUExZX1BSSU1BUllfT1dORVI8L2VudHJ5PgorCQkgIDxlbnRyeT4xPC9lbnRyeT4gPGVudHJ5PlRoZSBjYWxsZXIgaXMgbm93IHRoZSBwcmltYXJ5IG93bmVyIG9mCisJCSAgdGhlIG5hbWUsIHJlcGxhY2luZyBhbnkgcHJldmlvdXMgb3duZXIuIEVpdGhlciB0aGUgbmFtZSBoYWQgbm8KKwkJICBvd25lciBiZWZvcmUsIG9yIHRoZSBjYWxsZXIgc3BlY2lmaWVkCisJCSAgREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORyBhbmQgdGhlIGN1cnJlbnQgb3duZXIgc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgICBEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVC48L2VudHJ5PgorCSAgICAgICAgPC9yb3c+CisJICAgICAgICA8cm93PgorCQkgIDxlbnRyeT5EQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9JTl9RVUVVRTwvZW50cnk+CisJCSAgPGVudHJ5PjI8L2VudHJ5PgorCisJCSAgPGVudHJ5PlRoZSBuYW1lIGFscmVhZHkgaGFkIGFuIG93bmVyLAorICAgICAgICAgICAgICAgICAgICBEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUgd2FzIG5vdCBzcGVjaWZpZWQsIGFuZCBlaXRoZXIKKyAgICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgb3duZXIgZGlkIG5vdCBzcGVjaWZ5CisgICAgICAgICAgICAgICAgICAgIERCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UIG9yIHRoZSByZXF1ZXN0aW5nCisgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGRpZCBub3Qgc3BlY2lmeSBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HLgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorCSAgICAgICAgPC9yb3c+CisJICAgICAgICA8cm93PgorCQkgIDxlbnRyeT5EQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9FWElTVFM8L2VudHJ5PiA8ZW50cnk+MzwvZW50cnk+CisJCSAgPGVudHJ5PlRoZSBuYW1lIGFscmVhZHkgaGFzIGFuIG93bmVyLAorCQkgIERCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRSB3YXMgc3BlY2lmaWVkLCBhbmQgZWl0aGVyCisJCSAgREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgd2FzIG5vdCBzcGVjaWZpZWQgYnkgdGhlCisJCSAgY3VycmVudCBvd25lciwgb3IgREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORyB3YXMgbm90CisJCSAgc3BlY2lmaWVkIGJ5IHRoZSByZXF1ZXN0aW5nIGFwcGxpY2F0aW9uLjwvZW50cnk+CisJICAgICAgICA8L3Jvdz4KKwkgICAgICAgIDxyb3c+CisJCSAgPGVudHJ5PkRCVVNfUkVRVUVTVF9OQU1FX1JFUExZX0FMUkVBRFlfT1dORVI8L2VudHJ5PgorCQkgIDxlbnRyeT40PC9lbnRyeT4KKwkJICA8ZW50cnk+VGhlIGFwcGxpY2F0aW9uIHRyeWluZyB0byByZXF1ZXN0IG93bmVyc2hpcCBvZiBhIG5hbWUgaXMgYWxyZWFkeSB0aGUgb3duZXIgb2YgaXQuPC9lbnRyeT4KKwkgICAgICAgIDwvcm93PgorCSAgICAgIDwvdGJvZHk+CisJICAgIDwvdGdyb3VwPgorCSAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgPC9zZWN0Mz4KKworICAgICAgIDxzZWN0MyBpZD0iYnVzLW1lc3NhZ2VzLXJlbGVhc2UtbmFtZSI+CisgICAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5SZWxlYXNlTmFtZTwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBVSU5UMzIgUmVsZWFzZU5hbWUgKGluIFNUUklORyBuYW1lKQorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgTWVzc2FnZSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5TVFJJTkc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pk5hbWUgdG8gcmVsZWFzZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgICAgUmVwbHkgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VUlOVDMyPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5SZXR1cm4gdmFsdWU8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoaXMgbWV0aG9kIGNhbGwgc2hvdWxkIGJlIHNlbnQgdG8KKyAgICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1czwvbGl0ZXJhbD4gYW5kIGFza3MgdGhlIG1lc3NhZ2UgYnVzIHRvCisgICAgICAgICAgcmVsZWFzZSB0aGUgbWV0aG9kIGNhbGxlcidzIGNsYWltIHRvIHRoZSBnaXZlbiBuYW1lLiBJZiB0aGUgY2FsbGVyIGlzCisgICAgICAgICAgdGhlIHByaW1hcnkgb3duZXIsIGEgbmV3IHByaW1hcnkgb3duZXIgd2lsbCBiZSBzZWxlY3RlZCBmcm9tIHRoZQorICAgICAgICAgIHF1ZXVlIGlmIGFueSBvdGhlciBvd25lcnMgYXJlIHdhaXRpbmcuIElmIHRoZSBjYWxsZXIgaXMgd2FpdGluZyBpbgorICAgICAgICAgIHRoZSBxdWV1ZSBmb3IgdGhlIG5hbWUsIHRoZSBjYWxsZXIgd2lsbCByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIGFuZAorICAgICAgICAgIHdpbGwgbm90IGJlIG1hZGUgYW4gb3duZXIgb2YgdGhlIG5hbWUgaWYgaXQgbGF0ZXIgYmVjb21lcyBhdmFpbGFibGUuCisgICAgICAgICAgSWYgdGhlcmUgYXJlIG5vIG90aGVyIG93bmVycyBpbiB0aGUgcXVldWUgZm9yIHRoZSBuYW1lLCBpdCB3aWxsIGJlCisgICAgICAgICAgcmVtb3ZlZCBmcm9tIHRoZSBidXMgZW50aXJlbHkuCisKKyAgICAgICAgICBUaGUgcmV0dXJuIGNvZGUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKworICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+Q29udmVudGlvbmFsIE5hbWU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlZhbHVlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKwkgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+REJVU19SRUxFQVNFX05BTUVfUkVQTFlfUkVMRUFTRUQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjE8L2VudHJ5PiA8ZW50cnk+VGhlIGNhbGxlciBoYXMgcmVsZWFzZWQgaGlzIGNsYWltIG9uCisgICAgICAgICAgICAgICAgICB0aGUgZ2l2ZW4gbmFtZS4gRWl0aGVyIHRoZSBjYWxsZXIgd2FzIHRoZSBwcmltYXJ5IG93bmVyIG9mCisgICAgICAgICAgICAgICAgICB0aGUgbmFtZSwgYW5kIHRoZSBuYW1lIGlzIG5vdyB1bnVzZWQgb3IgdGFrZW4gYnkgc29tZWJvZHkKKyAgICAgICAgICAgICAgICAgIHdhaXRpbmcgaW4gdGhlIHF1ZXVlIGZvciB0aGUgbmFtZSwgb3IgdGhlIGNhbGxlciB3YXMgd2FpdGluZworICAgICAgICAgICAgICAgICAgaW4gdGhlIHF1ZXVlIGZvciB0aGUgbmFtZSBhbmQgaGFzIG5vdyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgIHF1ZXVlLjwvZW50cnk+CisJICAgICAgICA8L3Jvdz4KKwkgICAgICAgIDxyb3c+CisJCSAgPGVudHJ5PkRCVVNfUkVMRUFTRV9OQU1FX1JFUExZX05PTl9FWElTVEVOVDwvZW50cnk+CisJCSAgPGVudHJ5PjI8L2VudHJ5PgorCQkgIDxlbnRyeT5UaGUgZ2l2ZW4gbmFtZSBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIGJ1cy48L2VudHJ5PgorCSAgICAgICAgPC9yb3c+CisJICAgICAgICA8cm93PgorCQkgIDxlbnRyeT5EQlVTX1JFTEVBU0VfTkFNRV9SRVBMWV9OT1RfT1dORVI8L2VudHJ5PgorCQkgIDxlbnRyeT4zPC9lbnRyeT4KKwkJICA8ZW50cnk+VGhlIGNhbGxlciB3YXMgbm90IHRoZSBwcmltYXJ5IG93bmVyIG9mIHRoaXMgbmFtZSwKKyAgICAgICAgICAgICAgICAgIGFuZCB3YXMgYWxzbyBub3Qgd2FpdGluZyBpbiB0aGUgcXVldWUgdG8gb3duIHRoaXMgbmFtZS48L2VudHJ5PgorCSAgICAgICAgPC9yb3c+CisJICAgICAgPC90Ym9keT4KKwkgICAgPC90Z3JvdXA+CisJICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICA8L3NlY3QzPgorCisgICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtbGlzdC1xdWV1ZWQtb3duZXJzIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkxpc3RRdWV1ZWRPd25lcnM8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQXMgYSBtZXRob2Q6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgQVJSQVkgb2YgU1RSSU5HIExpc3RRdWV1ZWRPd25lcnMgKGluIFNUUklORyBuYW1lKQorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgTWVzc2FnZSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5TVFJJTkc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlRoZSB3ZWxsLWtub3duIGJ1cyBuYW1lIHRvIHF1ZXJ5LCBzdWNoIGFzCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmNvbS5leGFtcGxlLmNhcHB1Y2Npbm88L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICBSZXBseSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5BUlJBWSBvZiBTVFJJTkc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlRoZSB1bmlxdWUgYnVzIG5hbWVzIG9mIGNvbm5lY3Rpb25zIGN1cnJlbnRseSBxdWV1ZWQKKyAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBuYW1lPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGlzIG1ldGhvZCBjYWxsIHNob3VsZCBiZSBzZW50IHRvCisgICAgICAgICAgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXM8L2xpdGVyYWw+IGFuZCBsaXN0cyB0aGUgY29ubmVjdGlvbnMKKyAgICAgICAgICBjdXJyZW50bHkgcXVldWVkIGZvciBhIGJ1cyBuYW1lIChzZWUKKyAgICAgICAgICA8eHJlZiBsaW5rZW5kPSJ0ZXJtLXF1ZXVlZC1vd25lciIvPikuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICA8L3NlY3QzPgorICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9Im1lc3NhZ2UtYnVzLXJvdXRpbmciPgorICAgICAgPHRpdGxlPk1lc3NhZ2UgQnVzIE1lc3NhZ2UgUm91dGluZzwvdGl0bGU+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBNZXNzYWdlcyBtYXkgaGF2ZSBhIDxsaXRlcmFsPkRFU1RJTkFUSU9OPC9saXRlcmFsPiBmaWVsZCAoc2VlIDx4cmVmCisgICAgICAgICAgbGlua2VuZD0ibWVzc2FnZS1wcm90b2NvbC1oZWFkZXItZmllbGRzIi8+KSwgcmVzdWx0aW5nIGluIGEKKyAgICAgICAgPGZpcnN0dGVybT51bmljYXN0IG1lc3NhZ2U8L2ZpcnN0dGVybT4uICBJZiB0aGUKKyAgICAgICAgPGxpdGVyYWw+REVTVElOQVRJT048L2xpdGVyYWw+IGZpZWxkIGlzIHByZXNlbnQsIGl0IHNwZWNpZmllcyBhIG1lc3NhZ2UKKyAgICAgICAgcmVjaXBpZW50IGJ5IG5hbWUuIE1ldGhvZCBjYWxscyBhbmQgcmVwbGllcyBub3JtYWxseSBzcGVjaWZ5IHRoaXMgZmllbGQuCisgICAgICAgIFRoZSBtZXNzYWdlIGJ1cyBtdXN0IHNlbmQgbWVzc2FnZXMgKG9mIGFueSB0eXBlKSB3aXRoIHRoZQorICAgICAgICA8bGl0ZXJhbD5ERVNUSU5BVElPTjwvbGl0ZXJhbD4gZmllbGQgc2V0IHRvIHRoZSBzcGVjaWZpZWQgcmVjaXBpZW50LAorICAgICAgICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHJlY2lwaWVudCBoYXMgc2V0IHVwIGEgbWF0Y2ggcnVsZSBtYXRjaGluZworICAgICAgICB0aGUgbWVzc2FnZS4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFdoZW4gdGhlIG1lc3NhZ2UgYnVzIHJlY2VpdmVzIGEgc2lnbmFsLCBpZiB0aGUKKyAgICAgICAgPGxpdGVyYWw+REVTVElOQVRJT048L2xpdGVyYWw+IGZpZWxkIGlzIGFic2VudCwgaXQgaXMgY29uc2lkZXJlZCB0bworICAgICAgICBiZSBhIDxmaXJzdHRlcm0+YnJvYWRjYXN0IHNpZ25hbDwvZmlyc3R0ZXJtPiwgYW5kIGlzIHNlbnQgdG8gYWxsCisgICAgICAgIGFwcGxpY2F0aW9ucyB3aXRoIDxmaXJzdHRlcm0+bWVzc2FnZSBtYXRjaGluZyBydWxlczwvZmlyc3R0ZXJtPiB0aGF0CisgICAgICAgIG1hdGNoIHRoZSBtZXNzYWdlLiBNb3N0IHNpZ25hbCBtZXNzYWdlcyBhcmUgYnJvYWRjYXN0cy4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFVuaWNhc3Qgc2lnbmFsIG1lc3NhZ2VzICh0aG9zZSB3aXRoIGEgPGxpdGVyYWw+REVTVElOQVRJT048L2xpdGVyYWw+CisgICAgICAgIGZpZWxkKSBhcmUgbm90IGNvbW1vbmx5IHVzZWQsIGJ1dCB0aGV5IGFyZSB0cmVhdGVkIGxpa2UgYW55IHVuaWNhc3QKKyAgICAgICAgbWVzc2FnZTogdGhleSBhcmUgZGVsaXZlcmVkIHRvIHRoZSBzcGVjaWZpZWQgcmVjZWlwaWVudCwKKyAgICAgICAgcmVnYXJkbGVzcyBvZiBpdHMgbWF0Y2ggcnVsZXMuICBPbmUgdXNlIGZvciB1bmljYXN0IHNpZ25hbHMgaXMgdG8KKyAgICAgICAgYXZvaWQgYSByYWNlIGNvbmRpdGlvbiBpbiB3aGljaCBhIHNpZ25hbCBpcyBlbWl0dGVkIGJlZm9yZSB0aGUgaW50ZW5kZWQKKyAgICAgICAgcmVjaXBpZW50IGNhbiBjYWxsIDx4cmVmIGxpbmtlbmQ9ImJ1cy1tZXNzYWdlcy1hZGQtbWF0Y2giLz4gdG8KKyAgICAgICAgcmVjZWl2ZSB0aGF0IHNpZ25hbDogaWYgdGhlIHNpZ25hbCBpcyBzZW50IGRpcmVjdGx5IHRvIHRoYXQgcmVjaXBpZW50CisgICAgICAgIHVzaW5nIGEgdW5pY2FzdCBtZXNzYWdlLCBpdCBkb2VzIG5vdCBuZWVkIHRvIGFkZCBhIG1hdGNoIHJ1bGUgYXQgYWxsLAorICAgICAgICBhbmQgdGhlcmUgaXMgbm8gcmFjZSBjb25kaXRpb24uICBBbm90aGVyIHVzZSBmb3IgdW5pY2FzdCBzaWduYWxzLAorICAgICAgICBvbiBtZXNzYWdlIGJ1c2VzIHdob3NlIHNlY3VyaXR5IHBvbGljeSBwcmV2ZW50cyBlYXZlc2Ryb3BwaW5nLCBpcyB0bworICAgICAgICBzZW5kIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiB3aGljaCBzaG91bGQgb25seSBiZSB2aXNpYmxlIHRvIG9uZQorICAgICAgICByZWNpcGllbnQuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBXaGVuIHRoZSBtZXNzYWdlIGJ1cyByZWNlaXZlcyBhIG1ldGhvZCBjYWxsLCBpZiB0aGUKKyAgICAgICAgPGxpdGVyYWw+REVTVElOQVRJT048L2xpdGVyYWw+IGZpZWxkIGlzIGFic2VudCwgdGhlIGNhbGwgaXMgdGFrZW4gdG8gYmUKKyAgICAgICAgYSBzdGFuZGFyZCBvbmUtdG8tb25lIG1lc3NhZ2UgYW5kIGludGVycHJldGVkIGJ5IHRoZSBtZXNzYWdlIGJ1cworICAgICAgICBpdHNlbGYuIEZvciBleGFtcGxlLCBzZW5kaW5nIGFuCisgICAgICAgIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIuUGluZzwvbGl0ZXJhbD4gbWVzc2FnZSB3aXRoIG5vCisgICAgICAgIDxsaXRlcmFsPkRFU1RJTkFUSU9OPC9saXRlcmFsPiB3aWxsIGNhdXNlIHRoZSBtZXNzYWdlIGJ1cyBpdHNlbGYgdG8KKyAgICAgICAgcmVwbHkgdG8gdGhlIHBpbmcgaW1tZWRpYXRlbHk7IHRoZSBtZXNzYWdlIGJ1cyB3aWxsIG5vdCBtYWtlIHRoaXMKKyAgICAgICAgbWVzc2FnZSB2aXNpYmxlIHRvIG90aGVyIGFwcGxpY2F0aW9ucy4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIENvbnRpbnVpbmcgdGhlIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIuUGluZzwvbGl0ZXJhbD4gZXhhbXBsZSwgaWYKKyAgICAgICAgdGhlIHBpbmcgbWVzc2FnZSB3ZXJlIHNlbnQgd2l0aCBhIDxsaXRlcmFsPkRFU1RJTkFUSU9OPC9saXRlcmFsPiBuYW1lIG9mCisgICAgICAgIDxsaXRlcmFsPmNvbS55b3lvZHluZS5TY3JlZW5zYXZlcjwvbGl0ZXJhbD4sIHRoZW4gdGhlIHBpbmcgd291bGQgYmUKKyAgICAgICAgZm9yd2FyZGVkLCBhbmQgdGhlIFlveW9keW5lIENvcnBvcmF0aW9uIHNjcmVlbnNhdmVyIGFwcGxpY2F0aW9uIHdvdWxkIGJlCisgICAgICAgIGV4cGVjdGVkIHRvIHJlcGx5IHRvIHRoZSBwaW5nLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgTWVzc2FnZSBidXMgaW1wbGVtZW50YXRpb25zIG1heSBpbXBvc2UgYSBzZWN1cml0eSBwb2xpY3kgd2hpY2gKKyAgICAgICAgcHJldmVudHMgY2VydGFpbiBtZXNzYWdlcyBmcm9tIGJlaW5nIHNlbnQgb3IgcmVjZWl2ZWQuCisgICAgICAgIFdoZW4gYSBtZXNzYWdlIGNhbm5vdCBiZSBzZW50IG9yIHJlY2VpdmVkIGR1ZSB0byBhIHNlY3VyaXR5CisgICAgICAgIHBvbGljeSwgdGhlIG1lc3NhZ2UgYnVzIHNob3VsZCBzZW5kIGFuIGVycm9yIHJlcGx5LCB1bmxlc3MgdGhlCisgICAgICAgIG9yaWdpbmFsIG1lc3NhZ2UgaGFkIHRoZSA8bGl0ZXJhbD5OT19SRVBMWTwvbGl0ZXJhbD4gZmxhZy4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHNlY3QzIGlkPSJtZXNzYWdlLWJ1cy1yb3V0aW5nLWVhdmVzZHJvcHBpbmciPgorICAgICAgICA8dGl0bGU+RWF2ZXNkcm9wcGluZzwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFJlY2VpdmluZyBhIHVuaWNhc3QgbWVzc2FnZSB3aG9zZSA8bGl0ZXJhbD5ERVNUSU5BVElPTjwvbGl0ZXJhbD4KKyAgICAgICAgICBpbmRpY2F0ZXMgYSBkaWZmZXJlbnQgcmVjaXBpZW50IGlzIGNhbGxlZAorICAgICAgICAgIDxmaXJzdHRlcm0+ZWF2ZXNkcm9wcGluZzwvZmlyc3R0ZXJtPi4gT24gYSBtZXNzYWdlIGJ1cyB3aGljaCBhY3RzIGFzCisgICAgICAgICAgYSBzZWN1cml0eSBib3VuZGFyeSAobGlrZSB0aGUgc3RhbmRhcmQgc3lzdGVtIGJ1cyksIHRoZSBzZWN1cml0eQorICAgICAgICAgIHBvbGljeSBzaG91bGQgdXN1YWxseSBwcmV2ZW50IGVhdmVzZHJvcHBpbmcsIHNpbmNlIHVuaWNhc3QgbWVzc2FnZXMKKyAgICAgICAgICBhcmUgbm9ybWFsbHkga2VwdCBwcml2YXRlIGFuZCBtYXkgY29udGFpbiBzZWN1cml0eS1zZW5zaXRpdmUKKyAgICAgICAgICBpbmZvcm1hdGlvbi4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEVhdmVzZHJvcHBpbmcgaXMgbWFpbmx5IHVzZWZ1bCBmb3IgZGVidWdnaW5nIHRvb2xzLCBzdWNoIGFzCisgICAgICAgICAgdGhlIDxsaXRlcmFsPmRidXMtbW9uaXRvcjwvbGl0ZXJhbD4gdG9vbCBpbiB0aGUgcmVmZXJlbmNlCisgICAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgRC1CdXMuIFRvb2xzIHdoaWNoIGVhdmVzZHJvcCBvbiB0aGUgbWVzc2FnZSBidXMKKyAgICAgICAgICBzaG91bGQgYmUgY2FyZWZ1bCB0byBhdm9pZCBzZW5kaW5nIGEgcmVwbHkgb3IgZXJyb3IgaW4gcmVzcG9uc2UgdG8KKyAgICAgICAgICBtZXNzYWdlcyBpbnRlbmRlZCBmb3IgYSBkaWZmZXJlbnQgY2xpZW50LgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQ2xpZW50cyBtYXkgYXR0ZW1wdCB0byBlYXZlc2Ryb3AgYnkgYWRkaW5nIG1hdGNoIHJ1bGVzCisgICAgICAgICAgKHNlZSA8eHJlZiBsaW5rZW5kPSJtZXNzYWdlLWJ1cy1yb3V0aW5nLW1hdGNoLXJ1bGVzIi8+KSBjb250YWluaW5nCisgICAgICAgICAgdGhlIDxsaXRlcmFsPmVhdmVzZHJvcD0ndHJ1ZSc8L2xpdGVyYWw+IG1hdGNoLiBJZiB0aGUgbWVzc2FnZSBidXMnCisgICAgICAgICAgc2VjdXJpdHkgcG9saWN5IGRvZXMgbm90IGFsbG93IGVhdmVzZHJvcHBpbmcsIHRoZSBtYXRjaCBydWxlIGNhbgorICAgICAgICAgIHN0aWxsIGJlIGFkZGVkLCBidXQgd2lsbCBub3QgaGF2ZSBhbnkgcHJhY3RpY2FsIGVmZmVjdC4gRm9yCisgICAgICAgICAgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIG1lc3NhZ2UgYnVzIGltcGxlbWVudGF0aW9ucywgaWYgYWRkaW5nIHN1Y2gKKyAgICAgICAgICBhIG1hdGNoIHJ1bGUgcmVzdWx0cyBpbiBhbiBlcnJvciByZXBseSwgdGhlIGNsaWVudCBtYXkgZmFsbCBiYWNrIHRvCisgICAgICAgICAgYWRkaW5nIHRoZSBzYW1lIHJ1bGUgd2l0aCB0aGUgPGxpdGVyYWw+ZWF2ZXNkcm9wPC9saXRlcmFsPiBtYXRjaAorICAgICAgICAgIG9taXR0ZWQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisKKyAgICAgIDxzZWN0MyBpZD0ibWVzc2FnZS1idXMtcm91dGluZy1tYXRjaC1ydWxlcyI+CisgICAgICAgIDx0aXRsZT5NYXRjaCBSdWxlczwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorCSAgQW4gaW1wb3J0YW50IHBhcnQgb2YgdGhlIG1lc3NhZ2UgYnVzIHJvdXRpbmcgcHJvdG9jb2wgaXMgbWF0Y2gKKyAgICAgICAgICBydWxlcy4gTWF0Y2ggcnVsZXMgZGVzY3JpYmUgdGhlIG1lc3NhZ2VzIHRoYXQgc2hvdWxkIGJlIHNlbnQgdG8gYQorICAgICAgICAgIGNsaWVudCwgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBtZXNzYWdlLiAgQnJvYWRjYXN0IHNpZ25hbHMKKyAgICAgICAgICBhcmUgb25seSBzZW50IHRvIGNsaWVudHMgd2hpY2ggaGF2ZSBhIHN1aXRhYmxlIG1hdGNoIHJ1bGU6IHRoaXMKKyAgICAgICAgICBhdm9pZHMgd2FraW5nIHVwIGNsaWVudCBwcm9jZXNzZXMgdG8gZGVhbCB3aXRoIHNpZ25hbHMgdGhhdCBhcmUKKyAgICAgICAgICBub3QgcmVsZXZhbnQgdG8gdGhhdCBjbGllbnQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgTWVzc2FnZXMgdGhhdCBsaXN0IGEgY2xpZW50IGFzIHRoZWlyIDxsaXRlcmFsPkRFU1RJTkFUSU9OPC9saXRlcmFsPgorICAgICAgICAgIGRvIG5vdCBuZWVkIHRvIG1hdGNoIHRoZSBjbGllbnQncyBtYXRjaCBydWxlcywgYW5kIGFyZSBzZW50IHRvIHRoYXQKKyAgICAgICAgICBjbGllbnQgcmVnYXJkbGVzcy4gQXMgYSByZXN1bHQsIG1hdGNoIHJ1bGVzIGFyZSBtYWlubHkgdXNlZCB0bworICAgICAgICAgIHJlY2VpdmUgYSBzdWJzZXQgb2YgYnJvYWRjYXN0IHNpZ25hbHMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgTWF0Y2ggcnVsZXMgY2FuIGFsc28gYmUgdXNlZCBmb3IgZWF2ZXNkcm9wcGluZworICAgICAgICAgIChzZWUgPHhyZWYgbGlua2VuZD0ibWVzc2FnZS1idXMtcm91dGluZy1lYXZlc2Ryb3BwaW5nIi8+KSwKKyAgICAgICAgICBpZiB0aGUgc2VjdXJpdHkgcG9saWN5IG9mIHRoZSBtZXNzYWdlIGJ1cyBhbGxvd3MgaXQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgTWF0Y2ggcnVsZXMgYXJlIGFkZGVkIHVzaW5nIHRoZSBBZGRNYXRjaCBidXMgbWV0aG9kIAorICAgICAgICAgIChzZWUgPHhyZWYgbGlua2VuZD0iYnVzLW1lc3NhZ2VzLWFkZC1tYXRjaCIvPikuICBSdWxlcyBhcmUKKyAgICAgICAgICBzcGVjaWZpZWQgYXMgYSBzdHJpbmcgb2YgY29tbWEgc2VwYXJhdGVkIGtleS92YWx1ZSBwYWlycy4gCisgICAgICAgICAgRXhjbHVkaW5nIGEga2V5IGZyb20gdGhlIHJ1bGUgaW5kaWNhdGVzIGEgd2lsZGNhcmQgbWF0Y2guICAKKyAgICAgICAgICBGb3IgaW5zdGFuY2UgZXhjbHVkaW5nIHRoZSB0aGUgbWVtYmVyIGZyb20gYSBtYXRjaCBydWxlIGJ1dCAKKyAgICAgICAgICBhZGRpbmcgYSBzZW5kZXIgd291bGQgbGV0IGFsbCBtZXNzYWdlcyBmcm9tIHRoYXQgc2VuZGVyIHRocm91Z2guCisgICAgICAgICAgQW4gZXhhbXBsZSBvZiBhIGNvbXBsZXRlIHJ1bGUgd291bGQgYmUgCisgICAgICAgICAgInR5cGU9J3NpZ25hbCcsc2VuZGVyPSdvcmcuZnJlZWRlc2t0b3AuREJ1cycsaW50ZXJmYWNlPSdvcmcuZnJlZWRlc2t0b3AuREJ1cycsbWVtYmVyPSdGb28nLHBhdGg9Jy9iYXIvZm9vJyxkZXN0aW5hdGlvbj0nOjQ1MjM0NS4zNCcsYXJnMj0nYmFyJyIKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgZm9sbG93aW5nIHRhYmxlIGRlc2NyaWJlcyB0aGUga2V5cyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSAKKyAgICAgICAgICBhIG1hdGNoIHJ1bGU6CisgICAgICAgICAgVGhlIGZvbGxvd2luZyB0YWJsZSBzdW1tYXJpemVzIHRoZSBELUJ1cyB0eXBlcy4KKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PktleTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+UG9zc2libGUgVmFsdWVzPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPnR5cGU8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4nc2lnbmFsJywgJ21ldGhvZF9jYWxsJywgJ21ldGhvZF9yZXR1cm4nLCAnZXJyb3InPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5NYXRjaCBvbiB0aGUgbWVzc2FnZSB0eXBlLiAgQW4gZXhhbXBsZSBvZiBhIHR5cGUgbWF0Y2ggaXMgdHlwZT0nc2lnbmFsJzwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5zZW5kZXI8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5BIGJ1cyBvciB1bmlxdWUgbmFtZSAoc2VlIDx4cmVmIGxpbmtlbmQ9InRlcm0tYnVzLW5hbWUiLz4KKyAgICAgICAgICAgICAgICAgIGFuZCA8eHJlZiBsaW5rZW5kPSJ0ZXJtLXVuaXF1ZS1uYW1lIi8+IHJlc3BlY3RpdmVseSkKKyAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+TWF0Y2ggbWVzc2FnZXMgc2VudCBieSBhIHBhcnRpY3VsYXIgc2VuZGVyLiAgQW4gZXhhbXBsZSBvZiBhIHNlbmRlciBtYXRjaAorICAgICAgICAgICAgICAgICAgaXMgc2VuZGVyPSdvcmcuZnJlZWRlc2t0b3AuSGFsJzwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5pbnRlcmZhY2U8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5BbiBpbnRlcmZhY2UgbmFtZSAoc2VlIDx4cmVmIGxpbmtlbmQ9Im1lc3NhZ2UtcHJvdG9jb2wtbmFtZXMtaW50ZXJmYWNlIi8+KTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+TWF0Y2ggbWVzc2FnZXMgc2VudCBvdmVyIG9yIHRvIGEgcGFydGljdWxhciBpbnRlcmZhY2UuICBBbiBleGFtcGxlIG9mIGFuCisgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UgbWF0Y2ggaXMgaW50ZXJmYWNlPSdvcmcuZnJlZWRlc2t0b3AuSGFsLk1hbmFnZXInLgorICAgICAgICAgICAgICAgICAgSWYgYSBtZXNzYWdlIG9taXRzIHRoZSBpbnRlcmZhY2UgaGVhZGVyLCBpdCBtdXN0IG5vdCBtYXRjaCBhbnkgcnVsZSAKKyAgICAgICAgICAgICAgICAgIHRoYXQgc3BlY2lmaWVzIHRoaXMga2V5LjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5tZW1iZXI8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5BbnkgdmFsaWQgbWV0aG9kIG9yIHNpZ25hbCBuYW1lPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5NYXRjaGVzIG1lc3NhZ2VzIHdoaWNoIGhhdmUgdGhlIGdpdmUgbWV0aG9kIG9yIHNpZ25hbCBuYW1lLiBBbiBleGFtcGxlIG9mCisgICAgICAgICAgICAgICAgICBhIG1lbWJlciBtYXRjaCBpcyBtZW1iZXI9J05hbWVPd25lckNoYW5nZWQnPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPnBhdGg8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5BbiBvYmplY3QgcGF0aCAoc2VlIDx4cmVmIGxpbmtlbmQ9Im1lc3NhZ2UtcHJvdG9jb2wtbWFyc2hhbGluZy1vYmplY3QtcGF0aCIvPik8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pk1hdGNoZXMgbWVzc2FnZXMgd2hpY2ggYXJlIHNlbnQgZnJvbSBvciB0byB0aGUgZ2l2ZW4gb2JqZWN0LiBBbiBleGFtcGxlIG9mIGEKKyAgICAgICAgICAgICAgICAgIHBhdGggbWF0Y2ggaXMgcGF0aD0nL29yZy9mcmVlZGVza3RvcC9IYWwvTWFuYWdlcic8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+cGF0aF9uYW1lc3BhY2U8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5BbiBvYmplY3QgcGF0aDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgIE1hdGNoZXMgbWVzc2FnZXMgd2hpY2ggYXJlIHNlbnQgZnJvbSBvciB0byBhbgorICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBmb3Igd2hpY2ggdGhlIG9iamVjdCBwYXRoIGlzIGVpdGhlciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICBnaXZlbiB2YWx1ZSwgb3IgdGhhdCB2YWx1ZSBmb2xsb3dlZCBieSBvbmUgb3IKKyAgICAgICAgICAgICAgICAgICAgICBtb3JlIHBhdGggY29tcG9uZW50cy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgIEZvciBleGFtcGxlLAorICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPnBhdGhfbmFtZXNwYWNlPScvY29tL2V4YW1wbGUvZm9vJzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICB3b3VsZCBtYXRjaCBzaWduYWxzIHNlbnQgYnkKKyAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD4vY29tL2V4YW1wbGUvZm9vPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgIG9yIGJ5CisgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+L2NvbS9leGFtcGxlL2Zvby9iYXI8L2xpdGVyYWw+LAorICAgICAgICAgICAgICAgICAgICAgIGJ1dCBub3QgYnkKKyAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD4vY29tL2V4YW1wbGUvZm9vYmFyPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgIFVzaW5nIGJvdGggPGxpdGVyYWw+cGF0aDwvbGl0ZXJhbD4gYW5kCisgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+cGF0aF9uYW1lc3BhY2U8L2xpdGVyYWw+IGluIHRoZSBzYW1lIG1hdGNoCisgICAgICAgICAgICAgICAgICAgICAgcnVsZSBpcyBub3QgYWxsb3dlZC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbWF0Y2gga2V5IHdhcyBhZGRlZCBpbiB2ZXJzaW9uIDAuMTYgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICBELUJ1cyBzcGVjaWZpY2F0aW9uIGFuZCBpbXBsZW1lbnRlZCBieSB0aGUgYnVzCisgICAgICAgICAgICAgICAgICAgICAgICBkYWVtb24gaW4gZGJ1cyAxLjUuMCBhbmQgbGF0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5kZXN0aW5hdGlvbjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkEgdW5pcXVlIG5hbWUgKHNlZSA8eHJlZiBsaW5rZW5kPSJ0ZXJtLXVuaXF1ZS1uYW1lIi8+KTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+TWF0Y2hlcyBtZXNzYWdlcyB3aGljaCBhcmUgYmVpbmcgc2VudCB0byB0aGUgZ2l2ZW4gdW5pcXVlIG5hbWUuIEFuCisgICAgICAgICAgICAgICAgICBleGFtcGxlIG9mIGEgZGVzdGluYXRpb24gbWF0Y2ggaXMgZGVzdGluYXRpb249JzoxLjAnPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmFyZ1swLCAxLCAyLCAzLCAuLi5dPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QW55IHN0cmluZzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJnIG1hdGNoZXMgYXJlIHNwZWNpYWwgYW5kIGFyZSB1c2VkIGZvciBmdXJ0aGVyIHJlc3RyaWN0aW5nIHRoZSAKKyAgICAgICAgICAgICAgICAgIG1hdGNoIGJhc2VkIG9uIHRoZSBhcmd1bWVudHMgaW4gdGhlIGJvZHkgb2YgYSBtZXNzYWdlLiBPbmx5IGFyZ3VtZW50cyBvZiB0eXBlCisgICAgICAgICAgICAgICAgICBTVFJJTkcgY2FuIGJlIG1hdGNoZWQgaW4gdGhpcyB3YXkuIEFuIGV4YW1wbGUgb2YgYW4gYXJndW1lbnQgbWF0Y2ggCisgICAgICAgICAgICAgICAgICB3b3VsZCBiZSBhcmczPSdGb28nLiBPbmx5IGFyZ3VtZW50IGluZGV4ZXMgZnJvbSAwIHRvIDYzIHNob3VsZCBiZSAKKyAgICAgICAgICAgICAgICAgIGFjY2VwdGVkLjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5hcmdbMCwgMSwgMiwgMywgLi4uXXBhdGg8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bbnkgc3RyaW5nPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+QXJndW1lbnQgcGF0aCBtYXRjaGVzIHByb3ZpZGUgYSBzcGVjaWFsaXNlZCBmb3JtIG9mIHdpbGRjYXJkIG1hdGNoaW5nIGZvcgorICAgICAgICAgICAgICAgICAgICAgIHBhdGgtbGlrZSBuYW1lc3BhY2VzLiBUaGV5IGNhbiBtYXRjaCBhcmd1bWVudHMgd2hvc2UgdHlwZSBpcyBlaXRoZXIgU1RSSU5HIG9yCisgICAgICAgICAgICAgICAgICAgICAgT0JKRUNUX1BBVEguIEFzIHdpdGggbm9ybWFsIGFyZ3VtZW50IG1hdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIGFyZ3VtZW50IGlzIGV4YWN0bHkgZXF1YWwgdG8gdGhlIHN0cmluZyBnaXZlbiBpbiB0aGUgbWF0Y2gKKyAgICAgICAgICAgICAgICAgICAgICBydWxlIHRoZW4gdGhlIHJ1bGUgaXMgc2F0aXNmaWVkLiBBZGRpdGlvbmFsbHksIHRoZXJlIGlzIGFsc28gYQorICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIHdoZW4gZWl0aGVyIHRoZSBzdHJpbmcgZ2l2ZW4gaW4gdGhlIG1hdGNoIHJ1bGUgb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgbWVzc2FnZSBhcmd1bWVudCBlbmRzIHdpdGggJy8nIGFuZCBpcyBhIHByZWZpeCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICBvdGhlci4gQW4gZXhhbXBsZSBhcmd1bWVudCBwYXRoIG1hdGNoIGlzIGFyZzBwYXRoPScvYWEvYmIvJy4gVGhpcworICAgICAgICAgICAgICAgICAgICAgIHdvdWxkIG1hdGNoIG1lc3NhZ2VzIHdpdGggZmlyc3QgYXJndW1lbnRzIG9mICcvJywgJy9hYS8nLAorICAgICAgICAgICAgICAgICAgICAgICcvYWEvYmIvJywgJy9hYS9iYi9jYy8nIGFuZCAnL2FhL2JiL2NjJy4gSXQgd291bGQgbm90IG1hdGNoCisgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMgd2l0aCBmaXJzdCBhcmd1bWVudHMgb2YgJy9hYS9iJywgJy9hYScgb3IgZXZlbiAnL2FhL2JiJy48L3BhcmE+CisKKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+VGhpcyBpcyBpbnRlbmRlZCBmb3IgbW9uaXRvcmluZyDigJxkaXJlY3Rvcmllc+KAnSBpbiBmaWxlIHN5c3RlbS1saWtlCisgICAgICAgICAgICAgICAgICAgICAgaGllcmFyY2hpZXMsIGFzIHVzZWQgaW4gdGhlIDxjaXRldGl0bGU+ZGNvbmY8L2NpdGV0aXRsZT4gY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbS4gQW4gYXBwbGljYXRpb24gaW50ZXJlc3RlZCBpbiBhbGwgbm9kZXMgaW4gYSBwYXJ0aWN1bGFyIGhpZXJhcmNoeSB3b3VsZAorICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IgPGxpdGVyYWw+YXJnMHBhdGg9Jy9jYS9leGFtcGxlL2Zvby8nPC9saXRlcmFsPi4gVGhlbiB0aGUgc2VydmljZSBjb3VsZAorICAgICAgICAgICAgICAgICAgICAgIGVtaXQgYSBzaWduYWwgd2l0aCB6ZXJvdGggYXJndW1lbnQgPGxpdGVyYWw+Ii9jYS9leGFtcGxlL2Zvby9iYXIiPC9saXRlcmFsPiB0bworICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudCBhIG1vZGlmaWNhdGlvbiB0byB0aGUg4oCcYmFy4oCdIHByb3BlcnR5LCBvciBhIHNpZ25hbCB3aXRoIHplcm90aAorICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50IDxsaXRlcmFsPiIvY2EvZXhhbXBsZS8iPC9saXRlcmFsPiB0byByZXByZXNlbnQgYXRvbWljIG1vZGlmaWNhdGlvbiBvZgorICAgICAgICAgICAgICAgICAgICAgIG1hbnkgcHJvcGVydGllcyB3aXRoaW4gdGhhdCBkaXJlY3RvcnksIGFuZCB0aGUgaW50ZXJlc3RlZCBhcHBsaWNhdGlvbiB3b3VsZCBiZQorICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWVkIGluIGJvdGggY2FzZXMuPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG1hdGNoIGtleSB3YXMgYWRkZWQgaW4gdmVyc2lvbiAwLjEyIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgRC1CdXMgc3BlY2lmaWNhdGlvbiwgaW1wbGVtZW50ZWQgZm9yIFNUUklORworICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzIGJ5IHRoZSBidXMgZGFlbW9uIGluIGRidXMgMS4yLjAgYW5kIGxhdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGltcGxlbWVudGVkIGZvciBPQkpFQ1RfUEFUSCBhcmd1bWVudHMgaW4gZGJ1cyAxLjUuMAorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGxhdGVyLgorICAgICAgICAgICAgICAgICAgICAgIDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5hcmcwbmFtZXNwYWNlPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+TGlrZSBhIGJ1cyBuYW1lLCBleGNlcHQgdGhhdCB0aGUgc3RyaW5nIGlzIG5vdAorICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCB0byBjb250YWluIGEgJy4nIChwZXJpb2QpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+TWF0Y2ggbWVzc2FnZXMgd2hvc2UgZmlyc3QgYXJndW1lbnQgaXMgb2YgdHlwZSBTVFJJTkcsIGFuZCBpcyBhIGJ1cyBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgb3IgaW50ZXJmYWNlIG5hbWUgd2l0aGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlLiBUaGlzIGlzIHByaW1hcmlseSBpbnRlbmRlZAorICAgICAgICAgICAgICAgICAgICAgIGZvciB3YXRjaGluZyBuYW1lIG93bmVyIGNoYW5nZXMgZm9yIGEgZ3JvdXAgb2YgcmVsYXRlZCBidXMgbmFtZXMsIHJhdGhlciB0aGFuCisgICAgICAgICAgICAgICAgICAgICAgZm9yIGEgc2luZ2xlIG5hbWUgb3IgYWxsIG5hbWUgY2hhbmdlcy48L3BhcmE+CisKKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+QmVjYXVzZSBldmVyeSB2YWxpZCBpbnRlcmZhY2UgbmFtZSBpcyBhbHNvIGEgdmFsaWQKKyAgICAgICAgICAgICAgICAgICAgICBidXMgbmFtZSwgdGhpcyBjYW4gYWxzbyBiZSB1c2VkIGZvciBtZXNzYWdlcyB3aG9zZQorICAgICAgICAgICAgICAgICAgICAgIGZpcnN0IGFyZ3VtZW50IGlzIGFuIGludGVyZmFjZSBuYW1lLjwvcGFyYT4KKworICAgICAgICAgICAgICAgICAgICA8cGFyYT5Gb3IgZXhhbXBsZSwgdGhlIG1hdGNoIHJ1bGUKKyAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5tZW1iZXI9J05hbWVPd25lckNoYW5nZWQnLGFyZzBuYW1lc3BhY2U9J2NvbS5leGFtcGxlLmJhY2tlbmQnPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMgbmFtZSBvd25lciBjaGFuZ2VzIGZvciBidXMgbmFtZXMgc3VjaCBhcworICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmNvbS5leGFtcGxlLmJhY2tlbmQuZm9vPC9saXRlcmFsPiwKKyAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5jb20uZXhhbXBsZS5iYWNrZW5kLmZvby5iYXI8L2xpdGVyYWw+LCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5jb20uZXhhbXBsZS5iYWNrZW5kPC9saXRlcmFsPiBpdHNlbGYuPC9wYXJhPgorCisgICAgICAgICAgICAgICAgICAgIDxwYXJhPlNlZSBhbHNvIDx4cmVmIGxpbmtlbmQ9J2J1cy1tZXNzYWdlcy1uYW1lLW93bmVyLWNoYW5nZWQnLz4uPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG1hdGNoIGtleSB3YXMgYWRkZWQgaW4gdmVyc2lvbiAwLjE2IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgRC1CdXMgc3BlY2lmaWNhdGlvbiBhbmQgaW1wbGVtZW50ZWQgYnkgdGhlIGJ1cworICAgICAgICAgICAgICAgICAgICAgICAgZGFlbW9uIGluIGRidXMgMS41LjAgYW5kIGxhdGVyLgorICAgICAgICAgICAgICAgICAgICAgIDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5lYXZlc2Ryb3A8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD4ndHJ1ZSc8L2xpdGVyYWw+LCA8bGl0ZXJhbD4nZmFsc2UnPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+U2luY2UgRC1CdXMgMS41LjYsIG1hdGNoIHJ1bGVzIGRvIG5vdAorICAgICAgICAgICAgICAgICAgICBtYXRjaCBtZXNzYWdlcyB3aGljaCBoYXZlIGEgPGxpdGVyYWw+REVTVElOQVRJT048L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIGZpZWxkIHVubGVzcyB0aGUgbWF0Y2ggcnVsZSBzcGVjaWZpY2FsbHkKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHMgdGhpcworICAgICAgICAgICAgICAgICAgICAoc2VlIDx4cmVmIGxpbmtlbmQ9Im1lc3NhZ2UtYnVzLXJvdXRpbmctZWF2ZXNkcm9wcGluZyIvPikKKyAgICAgICAgICAgICAgICAgICAgYnkgc3BlY2lmeWluZyA8bGl0ZXJhbD5lYXZlc2Ryb3A9J3RydWUnPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBpbiB0aGUgbWF0Y2ggcnVsZS4gIDxsaXRlcmFsPmVhdmVzZHJvcD0nZmFsc2UnPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICByZXN0b3JlcyB0aGUgZGVmYXVsdCBiZWhhdmlvdXIuIE1lc3NhZ2VzIGFyZQorICAgICAgICAgICAgICAgICAgICBkZWxpdmVyZWQgdG8gdGhlaXIgPGxpdGVyYWw+REVTVElOQVRJT048L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIHJlZ2FyZGxlc3Mgb2YgbWF0Y2ggcnVsZXMsIHNvIHRoaXMgbWF0Y2ggZG9lcyBub3QKKyAgICAgICAgICAgICAgICAgICAgYWZmZWN0IG5vcm1hbCBkZWxpdmVyeSBvZiB1bmljYXN0IG1lc3NhZ2VzLgorICAgICAgICAgICAgICAgICAgICBJZiB0aGUgbWVzc2FnZSBidXMgaGFzIGEgc2VjdXJpdHkgcG9saWN5IHdoaWNoIGZvcmJpZHMKKyAgICAgICAgICAgICAgICAgICAgZWF2ZXNkcm9wcGluZywgdGhpcyBtYXRjaCBtYXkgc3RpbGwgYmUgdXNlZCB3aXRob3V0IGVycm9yLAorICAgICAgICAgICAgICAgICAgICBidXQgd2lsbCBub3QgaGF2ZSBhbnkgcHJhY3RpY2FsIGVmZmVjdC4KKyAgICAgICAgICAgICAgICAgICAgSW4gb2xkZXIgdmVyc2lvbnMgb2YgRC1CdXMsIHRoaXMgbWF0Y2ggd2FzIG5vdCBhbGxvd2VkCisgICAgICAgICAgICAgICAgICAgIGluIG1hdGNoIHJ1bGVzLCBhbmQgYWxsIG1hdGNoIHJ1bGVzIGJlaGF2ZWQgYXMgaWYKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+ZWF2ZXNkcm9wPSd0cnVlJzwvbGl0ZXJhbD4gaGFkIGJlZW4gdXNlZC4KKyAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9Im1lc3NhZ2UtYnVzLXN0YXJ0aW5nLXNlcnZpY2VzIj4KKyAgICAgIDx0aXRsZT5NZXNzYWdlIEJ1cyBTdGFydGluZyBTZXJ2aWNlczwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIG1lc3NhZ2UgYnVzIGNhbiBzdGFydCBhcHBsaWNhdGlvbnMgb24gYmVoYWxmIG9mIG90aGVyIGFwcGxpY2F0aW9ucy4KKyAgICAgICAgSW4gQ09SQkEgdGVybXMsIHRoaXMgd291bGQgYmUgY2FsbGVkIDxmaXJzdHRlcm0+YWN0aXZhdGlvbjwvZmlyc3R0ZXJtPi4KKyAgICAgICAgQW4gYXBwbGljYXRpb24gdGhhdCBjYW4gYmUgc3RhcnRlZCBpbiB0aGlzIHdheSBpcyBjYWxsZWQgYQorICAgICAgICA8Zmlyc3R0ZXJtPnNlcnZpY2U8L2ZpcnN0dGVybT4uCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgV2l0aCBELUJ1cywgc3RhcnRpbmcgYSBzZXJ2aWNlIGlzIG5vcm1hbGx5IGRvbmUgYnkgbmFtZS4gVGhhdCBpcywKKyAgICAgICAgYXBwbGljYXRpb25zIGFzayB0aGUgbWVzc2FnZSBidXMgdG8gc3RhcnQgc29tZSBwcm9ncmFtIHRoYXQgd2lsbCBvd24gYQorICAgICAgICB3ZWxsLWtub3duIG5hbWUsIHN1Y2ggYXMgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLlRleHRFZGl0b3I8L2xpdGVyYWw+LgorICAgICAgICBUaGlzIGltcGxpZXMgYSBjb250cmFjdCBkb2N1bWVudGVkIGFsb25nIHdpdGggdGhlIG5hbWUgCisgICAgICAgIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5UZXh0RWRpdG9yPC9saXRlcmFsPiBmb3Igd2hpY2ggb2JqZWN0cyAKKyAgICAgICAgdGhlIG93bmVyIG9mIHRoYXQgbmFtZSB3aWxsIHByb3ZpZGUsIGFuZCB3aGF0IGludGVyZmFjZXMgdGhvc2UgCisgICAgICAgIG9iamVjdHMgd2lsbCBoYXZlLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRvIGZpbmQgYW4gZXhlY3V0YWJsZSBjb3JyZXNwb25kaW5nIHRvIGEgcGFydGljdWxhciBuYW1lLCB0aGUgYnVzIGRhZW1vbgorICAgICAgICBsb29rcyBmb3IgPGZpcnN0dGVybT5zZXJ2aWNlIGRlc2NyaXB0aW9uIGZpbGVzPC9maXJzdHRlcm0+LiAgU2VydmljZQorICAgICAgICBkZXNjcmlwdGlvbiBmaWxlcyBkZWZpbmUgYSBtYXBwaW5nIGZyb20gbmFtZXMgdG8gZXhlY3V0YWJsZXMuIERpZmZlcmVudAorICAgICAgICBraW5kcyBvZiBtZXNzYWdlIGJ1cyB3aWxsIGxvb2sgZm9yIHRoZXNlIGZpbGVzIGluIGRpZmZlcmVudCBwbGFjZXMsIHNlZQorICAgICAgICA8eHJlZiBsaW5rZW5kPSJtZXNzYWdlLWJ1cy10eXBlcyIvPi4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBTZXJ2aWNlIGRlc2NyaXB0aW9uIGZpbGVzIGhhdmUgdGhlICIuc2VydmljZSIgZmlsZQorICAgICAgICBleHRlbnNpb24uIFRoZSBtZXNzYWdlIGJ1cyB3aWxsIG9ubHkgbG9hZCBzZXJ2aWNlIGRlc2NyaXB0aW9uIGZpbGVzCisgICAgICAgIGVuZGluZyB3aXRoIC5zZXJ2aWNlOyBhbGwgb3RoZXIgZmlsZXMgd2lsbCBiZSBpZ25vcmVkLiAgVGhlIGZpbGUgZm9ybWF0CisgICAgICAgIGlzIHNpbWlsYXIgdG8gdGhhdCBvZiA8dWxpbmsKKyAgICAgICAgdXJsPSJodHRwOi8vc3RhbmRhcmRzLmZyZWVkZXNrdG9wLm9yZy9kZXNrdG9wLWVudHJ5LXNwZWMvZGVza3RvcC1lbnRyeS1zcGVjLWxhdGVzdC5odG1sIj5kZXNrdG9wCisgICAgICAgIGVudHJpZXM8L3VsaW5rPi4gQWxsIHNlcnZpY2UgZGVzY3JpcHRpb24gZmlsZXMgbXVzdCBiZSBpbiBVVEYtOAorICAgICAgICBlbmNvZGluZy4gVG8gZW5zdXJlIHRoYXQgdGhlcmUgd2lsbCBiZSBubyBuYW1lIGNvbGxpc2lvbnMsIHNlcnZpY2UgZmlsZXMKKyAgICAgICAgbXVzdCBiZSBuYW1lc3BhY2VkIHVzaW5nIHRoZSBzYW1lIG1lY2hhbmlzbSBhcyBtZXNzYWdlcyBhbmQgc2VydmljZQorICAgICAgICBuYW1lcy4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFtGSVhNRSB0aGUgZmlsZSBmb3JtYXQgc2hvdWxkIGJlIG11Y2ggYmV0dGVyIHNwZWNpZmllZCB0aGFuICJzaW1pbGFyIHRvCisgICAgICAgIC5kZXNrdG9wIGVudHJpZXMiIGVzcC4gc2luY2UgZGVza3RvcCBlbnRyaWVzIGFyZSBhbHJlYWR5CisgICAgICAgIGJhZGx5LXNwZWNpZmllZC4gOy0pXQorICAgICAgICBUaGVzZSBzZWN0aW9ucyBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGFwcGx5IHRvIHNlcnZpY2UgZmlsZXMgYXMgd2VsbDoKKworICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5HZW5lcmFsIHN5bnRheDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5Db21tZW50IGZvcm1hdDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKworICAgICAgICA8ZmlndXJlPgorCSAgPHRpdGxlPkV4YW1wbGUgc2VydmljZSBkZXNjcmlwdGlvbiBmaWxlPC90aXRsZT4KKwkgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICMgU2FtcGxlIHNlcnZpY2UgZGVzY3JpcHRpb24gZmlsZQorICAgICAgICAgICAgW0QtQlVTIFNlcnZpY2VdCisgICAgICAgICAgICBOYW1lcz1vcmcuZnJlZWRlc2t0b3AuQ29uZmlndXJhdGlvbkRhdGFiYXNlO29yZy5nbm9tZS5HQ29uZjsKKyAgICAgICAgICAgIEV4ZWM9L3Vzci9saWJleGVjL2djb25mZC0yCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKwk8L2ZpZ3VyZT4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBXaGVuIGFuIGFwcGxpY2F0aW9uIGFza3MgdG8gc3RhcnQgYSBzZXJ2aWNlIGJ5IG5hbWUsIHRoZSBidXMgZGFlbW9uIHRyaWVzIHRvCisgICAgICAgIGZpbmQgYSBzZXJ2aWNlIHRoYXQgd2lsbCBvd24gdGhhdCBuYW1lLiBJdCB0aGVuIHRyaWVzIHRvIHNwYXduIHRoZQorICAgICAgICBleGVjdXRhYmxlIGFzc29jaWF0ZWQgd2l0aCBpdC4gSWYgdGhpcyBmYWlscywgaXQgd2lsbCByZXBvcnQgYW4KKyAgICAgICAgZXJyb3IuIFtGSVhNRSB3aGF0IGhhcHBlbnMgaWYgdHdvIC5zZXJ2aWNlIGZpbGVzIG9mZmVyIHRoZSBzYW1lIHNlcnZpY2U7CisgICAgICAgIHdoYXQga2luZCBvZiBlcnJvciBpcyByZXBvcnRlZCwgc2hvdWxkIHdlIGhhdmUgYSB3YXkgZm9yIHRoZSBjbGllbnQgdG8KKyAgICAgICAgY2hvb3NlIG9uZT9dCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIGV4ZWN1dGFibGUgbGF1bmNoZWQgd2lsbCBoYXZlIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAgICAgICA8bGl0ZXJhbD5EQlVTX1NUQVJURVJfQUREUkVTUzwvbGl0ZXJhbD4gc2V0IHRvIHRoZSBhZGRyZXNzIG9mIHRoZQorICAgICAgICBtZXNzYWdlIGJ1cyBzbyBpdCBjYW4gY29ubmVjdCBhbmQgcmVxdWVzdCB0aGUgYXBwcm9wcmlhdGUgbmFtZXMuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIGV4ZWN1dGFibGUgYmVpbmcgbGF1bmNoZWQgbWF5IHdhbnQgdG8ga25vdyB3aGV0aGVyIHRoZSBtZXNzYWdlIGJ1cworICAgICAgICBzdGFydGluZyBpdCBpcyBvbmUgb2YgdGhlIHdlbGwta25vd24gbWVzc2FnZSBidXNlcyAoc2VlIDx4cmVmCisgICAgICAgIGxpbmtlbmQ9Im1lc3NhZ2UtYnVzLXR5cGVzIi8+KS4gVG8gZmFjaWxpdGF0ZSB0aGlzLCB0aGUgYnVzIG11c3QgYWxzbyBzZXQKKyAgICAgICAgdGhlIDxsaXRlcmFsPkRCVVNfU1RBUlRFUl9CVVNfVFlQRTwvbGl0ZXJhbD4gZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgaXQgaXMgb25lCisgICAgICAgIG9mIHRoZSB3ZWxsLWtub3duIGJ1c2VzLiBUaGUgY3VycmVudGx5LWRlZmluZWQgdmFsdWVzIGZvciB0aGlzIHZhcmlhYmxlCisgICAgICAgIGFyZSA8bGl0ZXJhbD5zeXN0ZW08L2xpdGVyYWw+IGZvciB0aGUgc3lzdGVtd2lkZSBtZXNzYWdlIGJ1cywKKyAgICAgICAgYW5kIDxsaXRlcmFsPnNlc3Npb248L2xpdGVyYWw+IGZvciB0aGUgcGVyLWxvZ2luLXNlc3Npb24gbWVzc2FnZQorICAgICAgICBidXMuIFRoZSBuZXcgZXhlY3V0YWJsZSBtdXN0IHN0aWxsIGNvbm5lY3QgdG8gdGhlIGFkZHJlc3MgZ2l2ZW4KKyAgICAgICAgaW4gPGxpdGVyYWw+REJVU19TVEFSVEVSX0FERFJFU1M8L2xpdGVyYWw+LCBidXQgbWF5IGFzc3VtZSB0aGF0IHRoZQorICAgICAgICByZXN1bHRpbmcgY29ubmVjdGlvbiBpcyB0byB0aGUgd2VsbC1rbm93biBidXMuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgW0ZJWE1FIHRoZXJlIHNob3VsZCBiZSBhIHRpbWVvdXQgc29tZXdoZXJlLCBlaXRoZXIgc3BlY2lmaWVkCisgICAgICAgIGluIHRoZSAuc2VydmljZSBmaWxlLCBieSB0aGUgY2xpZW50LCBvciBqdXN0IGEgZ2xvYmFsIHZhbHVlCisgICAgICAgIGFuZCBpZiB0aGUgY2xpZW50IGJlaW5nIGFjdGl2YXRlZCBmYWlscyB0byBjb25uZWN0IHdpdGhpbiB0aGF0CisgICAgICAgIHRpbWVvdXQsIGFuIGVycm9yIHNob3VsZCBiZSBzZW50IGJhY2suXQorICAgICAgPC9wYXJhPgorCisgICAgICA8c2VjdDMgaWQ9Im1lc3NhZ2UtYnVzLXN0YXJ0aW5nLXNlcnZpY2VzLXNjb3BlIj4KKyAgICAgICAgPHRpdGxlPk1lc3NhZ2UgQnVzIFNlcnZpY2UgU2NvcGU8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgInNjb3BlIiBvZiBhIHNlcnZpY2UgaXMgaXRzICJwZXItIiwgc3VjaCBhcyBwZXItc2Vzc2lvbiwKKyAgICAgICAgICBwZXItbWFjaGluZSwgcGVyLWhvbWUtZGlyZWN0b3J5LCBvciBwZXItZGlzcGxheS4gVGhlIHJlZmVyZW5jZQorICAgICAgICAgIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgeWV0IHN1cHBvcnQgc3RhcnRpbmcgc2VydmljZXMgaW4gYSBkaWZmZXJlbnQKKyAgICAgICAgICBzY29wZSBmcm9tIHRoZSBtZXNzYWdlIGJ1cyBpdHNlbGYuIFNvIGUuZy4gaWYgeW91IHN0YXJ0IGEgc2VydmljZQorICAgICAgICAgIG9uIHRoZSBzZXNzaW9uIGJ1cyBpdHMgc2NvcGUgaXMgcGVyLXNlc3Npb24uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgV2UgY291bGQgYWRkIGFuIG9wdGlvbmFsIHNjb3BlIHRvIGEgYnVzIG5hbWUuIEZvciBleGFtcGxlLCBmb3IKKyAgICAgICAgICBwZXItKGRpc3BsYXksc2Vzc2lvbiBwYWlyKSwgd2UgY291bGQgaGF2ZSBhIHVuaXF1ZSBJRCBmb3IgZWFjaCBkaXNwbGF5CisgICAgICAgICAgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYXQgbG9naW4gYW5kIHNldCBvbiBzY3JlZW4gMCBieSBleGVjdXRpbmcgYQorICAgICAgICAgIHNwZWNpYWwgInNldCBkaXNwbGF5IElEIiBiaW5hcnkuIFRoZSBJRCB3b3VsZCBiZSBzdG9yZWQgaW4gYQorICAgICAgICAgIDxsaXRlcmFsPl9EQlVTX0RJU1BMQVlfSUQ8L2xpdGVyYWw+IHByb3BlcnR5IGFuZCB3b3VsZCBiZSBhIHN0cmluZyBvZgorICAgICAgICAgIHJhbmRvbSBieXRlcy4gVGhpcyBJRCB3b3VsZCB0aGVuIGJlIHVzZWQgdG8gc2NvcGUgbmFtZXMuCisgICAgICAgICAgU3RhcnRpbmcvbG9jYXRpbmcgYSBzZXJ2aWNlIGNvdWxkIGJlIGRvbmUgYnkgSUQtbmFtZSBwYWlyIHJhdGhlciB0aGFuCisgICAgICAgICAgb25seSBieSBuYW1lLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIENvbnRyYXN0IHRoaXMgd2l0aCBhIHBlci1kaXNwbGF5IHNjb3BlLiBUbyBhY2hpZXZlIHRoYXQsIHdlIHdvdWxkIAorICAgICAgICAgIHdhbnQgYSBzaW5nbGUgYnVzIHNwYW5uaW5nIGFsbCBzZXNzaW9ucyB1c2luZyBhIGdpdmVuIGRpc3BsYXkuCisgICAgICAgICAgU28gd2UgbWlnaHQgc2V0IGEgPGxpdGVyYWw+X0RCVVNfRElTUExBWV9CVVNfQUREUkVTUzwvbGl0ZXJhbD4gCisgICAgICAgICAgcHJvcGVydHkgb24gc2NyZWVuIDAgb2YgdGhlIGRpc3BsYXksIHBvaW50aW5nIHRvIHRoaXMgYnVzLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9Im1lc3NhZ2UtYnVzLXR5cGVzIj4KKyAgICAgIDx0aXRsZT5XZWxsLWtub3duIE1lc3NhZ2UgQnVzIEluc3RhbmNlczwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVHdvIHN0YW5kYXJkIG1lc3NhZ2UgYnVzIGluc3RhbmNlcyBhcmUgZGVmaW5lZCBoZXJlLCBhbG9uZyB3aXRoIGhvdyAKKyAgICAgICAgdG8gbG9jYXRlIHRoZW0gYW5kIHdoZXJlIHRoZWlyIHNlcnZpY2UgZmlsZXMgbGl2ZS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxzZWN0MyBpZD0ibWVzc2FnZS1idXMtdHlwZXMtbG9naW4iPgorICAgICAgICA8dGl0bGU+TG9naW4gc2Vzc2lvbiBtZXNzYWdlIGJ1czwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEVhY2ggdGltZSBhIHVzZXIgbG9ncyBpbiwgYSA8Zmlyc3R0ZXJtPmxvZ2luIHNlc3Npb24gbWVzc2FnZQorICAgICAgICAgICAgYnVzPC9maXJzdHRlcm0+IG1heSBiZSBzdGFydGVkLiBBbGwgYXBwbGljYXRpb25zIGluIHRoZSB1c2VyJ3MgbG9naW4KKyAgICAgICAgICBzZXNzaW9uIG1heSBpbnRlcmFjdCB3aXRoIG9uZSBhbm90aGVyIHVzaW5nIHRoaXMgbWVzc2FnZSBidXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlIGFkZHJlc3Mgb2YgdGhlIGxvZ2luIHNlc3Npb24gbWVzc2FnZSBidXMgaXMgZ2l2ZW4gCisgICAgICAgICAgaW4gdGhlIDxsaXRlcmFsPkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUzwvbGl0ZXJhbD4gZW52aXJvbm1lbnQgCisgICAgICAgICAgdmFyaWFibGUuIElmIHRoYXQgdmFyaWFibGUgaXMgbm90IHNldCwgYXBwbGljYXRpb25zIG1heSAKKyAgICAgICAgICBhbHNvIHRyeSB0byByZWFkIHRoZSBhZGRyZXNzIGZyb20gdGhlIFggV2luZG93IFN5c3RlbSByb290IAorICAgICAgICAgIHdpbmRvdyBwcm9wZXJ0eSA8bGl0ZXJhbD5fREJVU19TRVNTSU9OX0JVU19BRERSRVNTPC9saXRlcmFsPi4KKyAgICAgICAgICBUaGUgcm9vdCB3aW5kb3cgcHJvcGVydHkgbXVzdCBoYXZlIHR5cGUgPGxpdGVyYWw+U1RSSU5HPC9saXRlcmFsPi4KKyAgICAgICAgICBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgc2hvdWxkIGhhdmUgcHJlY2VkZW5jZSBvdmVyIHRoZSAKKyAgICAgICAgICByb290IHdpbmRvdyBwcm9wZXJ0eS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT5UaGUgYWRkcmVzcyBvZiB0aGUgbG9naW4gc2Vzc2lvbiBtZXNzYWdlIGJ1cyBpcyBnaXZlbiBpbiB0aGUKKyAgICAgICAgPGxpdGVyYWw+REJVU19TRVNTSU9OX0JVU19BRERSRVNTPC9saXRlcmFsPiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gSWYKKyAgICAgICAgREJVU19TRVNTSU9OX0JVU19BRERSRVNTIGlzIG5vdCBzZXQsIG9yIGlmIGl0J3Mgc2V0IHRvIHRoZSBzdHJpbmcKKyAgICAgICAgImF1dG9sYXVuY2g6IiwgdGhlIHN5c3RlbSBzaG91bGQgdXNlIHBsYXRmb3JtLXNwZWNpZmljIG1ldGhvZHMgb2YKKyAgICAgICAgbG9jYXRpbmcgYSBydW5uaW5nIEQtQnVzIHNlc3Npb24gc2VydmVyLCBvciBzdGFydGluZyBvbmUgaWYgYSBydW5uaW5nCisgICAgICAgIGluc3RhbmNlIGNhbm5vdCBiZSBmb3VuZC4gTm90ZSB0aGF0IHRoaXMgbWVjaGFuaXNtIGlzIG5vdCByZWNvbW1lbmRlZAorICAgICAgICBmb3IgYXR0ZW1wdGluZyB0byBkZXRlcm1pbmUgaWYgYSBkYWVtb24gaXMgcnVubmluZy4gSXQgaXMgaW5oZXJlbnRseQorICAgICAgICByYWN5IHRvIGF0dGVtcHQgdG8gbWFrZSB0aGlzIGRldGVybWluYXRpb24sIHNpbmNlIHRoZSBidXMgZGFlbW9uIG1heQorICAgICAgICBiZSBzdGFydGVkIGp1c3QgYmVmb3JlIG9yIGp1c3QgYWZ0ZXIgdGhlIGRldGVybWluYXRpb24gaXMgbWFkZS4KKyAgICAgICAgVGhlcmVmb3JlLCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IGFwcGxpY2F0aW9ucyBkbyBub3QgdHJ5IHRvIG1ha2UgdGhpcworICAgICAgICBkZXRlcm1pbmF0aW9uIGZvciB0aGVpciBmdW5jdGlvbmFsaXR5IHB1cnBvc2VzLCBhbmQgaW5zdGVhZCB0aGV5CisgICAgICAgIHNob3VsZCBhdHRlbXB0IHRvIHN0YXJ0IHRoZSBzZXJ2ZXIuPC9wYXJhPgorCisgICAgICAgIDxzZWN0NCBpZD0ibWVzc2FnZS1idXMtdHlwZXMtbG9naW4teC13aW5kb3dzIj4KKyAgICAgICAgICA8dGl0bGU+WCBXaW5kb3dpbmcgU3lzdGVtPC90aXRsZT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEZvciB0aGUgWCBXaW5kb3dpbmcgU3lzdGVtLCB0aGUgYXBwbGljYXRpb24gbXVzdCBsb2NhdGUgdGhlCisgICAgICAgICAgICB3aW5kb3cgb3duZXIgb2YgdGhlIHNlbGVjdGlvbiByZXByZXNlbnRlZCBieSB0aGUgYXRvbSBmb3JtZWQgYnkKKyAgICAgICAgICAgIGNvbmNhdGVuYXRpbmc6CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+dGhlIGxpdGVyYWwgc3RyaW5nICJfREJVU19TRVNTSU9OX0JVU19TRUxFQ1RJT05fIjwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+dGhlIGN1cnJlbnQgdXNlcidzIHVzZXJuYW1lPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT50aGUgbGl0ZXJhbCBjaGFyYWN0ZXIgJ18nICh1bmRlcnNjb3JlKTwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+dGhlIG1hY2hpbmUncyBJRDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIGZvciB0aGUgd2luZG93IHRoYXQgb3ducworICAgICAgICAgICAgdGhpcyBYIHNlbGVjdGlvbjoKKyAgICAgICAgICAgIDxpbmZvcm1hbHRhYmxlIGZyYW1lPSJhbGwiPgorICAgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjIiPgorICAgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5BdG9tPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorCisgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5tZWFuaW5nPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPC9yb3c+CisKKyAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5fREJVU19TRVNTSU9OX0JVU19BRERSRVNTPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorCisgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICA8cGFyYT50aGUgYWN0dWFsIGFkZHJlc3Mgb2YgdGhlIHNlcnZlciBzb2NrZXQ8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8L3Jvdz4KKworICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPl9EQlVTX1NFU1NJT05fQlVTX1BJRDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKworICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+dGhlIFBJRCBvZiB0aGUgc2VydmVyIHByb2Nlc3M8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEF0IGxlYXN0IHRoZSBfREJVU19TRVNTSU9OX0JVU19BRERSRVNTIHByb3BlcnR5IE1VU1QgYmUKKyAgICAgICAgICAgIHByZXNlbnQgaW4gdGhpcyB3aW5kb3cuCisgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJZiB0aGUgWCBzZWxlY3Rpb24gY2Fubm90IGJlIGxvY2F0ZWQgb3IgaWYgcmVhZGluZyB0aGUKKyAgICAgICAgICAgIHByb3BlcnRpZXMgZnJvbSB0aGUgd2luZG93IGZhaWxzLCB0aGUgaW1wbGVtZW50YXRpb24gTVVTVCBjb25jbHVkZQorICAgICAgICAgICAgdGhhdCB0aGVyZSBpcyBubyBELUJ1cyBzZXJ2ZXIgcnVubmluZyBhbmQgcHJvY2VlZCB0byBzdGFydCBhIG5ldworICAgICAgICAgICAgc2VydmVyLiAoU2VlIGJlbG93IG9uIGNvbmN1cnJlbmN5IGlzc3VlcykKKyAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEZhaWx1cmUgdG8gY29ubmVjdCB0byB0aGUgRC1CdXMgc2VydmVyIGFkZHJlc3MgdGh1cyBvYnRhaW5lZAorICAgICAgICAgICAgTVVTVCBiZSB0cmVhdGVkIGFzIGEgZmF0YWwgY29ubmVjdGlvbiBlcnJvciBhbmQgc2hvdWxkIGJlIHJlcG9ydGVkCisgICAgICAgICAgICB0byB0aGUgYXBwbGljYXRpb24uCisgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBBcyBhbiBhbHRlcm5hdGl2ZSwgYW4gaW1wbGVtZW50YXRpb24gTUFZIGZpbmQgdGhlIGluZm9ybWF0aW9uCisgICAgICAgICAgICBpbiB0aGUgZm9sbG93aW5nIGZpbGUgbG9jYXRlZCBpbiB0aGUgY3VycmVudCB1c2VyJ3MgaG9tZSBkaXJlY3RvcnksCisgICAgICAgICAgICBpbiBzdWJkaXJlY3RvcnkgLmRidXMvc2Vzc2lvbi1idXMvOgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPnRoZSBtYWNoaW5lJ3MgSUQ8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPnRoZSBsaXRlcmFsIGNoYXJhY3RlciAnLScgKGRhc2gpPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT50aGUgWCBkaXNwbGF5IHdpdGhvdXQgdGhlIHNjcmVlbiBudW1iZXIsIHdpdGggdGhlCisgICAgICAgICAgICAgICAgZm9sbG93aW5nIHByZWZpeGVzIHJlbW92ZWQsIGlmIHByZXNlbnQ6ICI6IiwgImxvY2FsaG9zdDoiCisgICAgICAgICAgICAgICAgLiJsb2NhbGhvc3QubG9jYWxkb21haW46Ii4gVGhhdCBpcywgYSBkaXNwbGF5IG9mCisgICAgICAgICAgICAgICAgImxvY2FsaG9zdDoxMC4wIiBwcm9kdWNlcyBqdXN0IHRoZSBudW1iZXIgIjEwIjwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBOQU1FPXZhbHVlIGFzc2lnbm1lbnQgcGFpcnMgYW5kCisgICAgICAgICAgICBsaW5lcyBzdGFydGluZyB3aXRoICMgYXJlIGNvbW1lbnRzIChubyBjb21tZW50cyBhcmUgYWxsb3dlZAorICAgICAgICAgICAgb3RoZXJ3aXNlKS4gVGhlIGZvbGxvd2luZyB2YXJpYWJsZSBuYW1lcyBhcmUgZGVmaW5lZDoKKyAgICAgICAgICAgIDxpbmZvcm1hbHRhYmxlCisgICAgICAgICAgICAgIGZyYW1lPSJhbGwiPgorICAgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjIiPgorICAgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5WYXJpYWJsZTwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKworICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+bWVhbmluZzwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDwvcm93PgorCisgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+REJVU19TRVNTSU9OX0JVU19BRERSRVNTPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorCisgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICA8cGFyYT50aGUgYWN0dWFsIGFkZHJlc3Mgb2YgdGhlIHNlcnZlciBzb2NrZXQ8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8L3Jvdz4KKworICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPkRCVVNfU0VTU0lPTl9CVVNfUElEPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorCisgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICA8cGFyYT50aGUgUElEIG9mIHRoZSBzZXJ2ZXIgcHJvY2VzczwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDwvcm93PgorCisgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+REJVU19TRVNTSU9OX0JVU19XSU5ET1dJRDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKworICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+dGhlIHdpbmRvdyBJRDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQXQgbGVhc3QgdGhlIERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyB2YXJpYWJsZSBNVVNUIGJlIHByZXNlbnQKKyAgICAgICAgICAgIGluIHRoaXMgZmlsZS4KKyAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEZhaWx1cmUgdG8gb3BlbiB0aGlzIGZpbGUgTVVTVCBiZSBpbnRlcnByZXRlZCBhcyBhYnNlbmNlIG9mIGEKKyAgICAgICAgICAgIHJ1bm5pbmcgc2VydmVyLiBUaGVyZWZvcmUsIHRoZSBpbXBsZW1lbnRhdGlvbiBNVVNUIHByb2NlZWQgdG8KKyAgICAgICAgICAgIGF0dGVtcHRpbmcgdG8gbGF1bmNoIGEgbmV3IGJ1cyBzZXJ2ZXIgaWYgdGhlIGZpbGUgY2Fubm90IGJlCisgICAgICAgICAgICBvcGVuZWQuCisgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBIb3dldmVyLCBzdWNjZXNzIGluIG9wZW5pbmcgdGhpcyBmaWxlIE1VU1QgTk9UIGxlYWQgdG8gdGhlCisgICAgICAgICAgICBjb25jbHVzaW9uIHRoYXQgdGhlIHNlcnZlciBpcyBydW5uaW5nLiBUaHVzLCBhIGZhaWx1cmUgdG8gY29ubmVjdCB0bworICAgICAgICAgICAgdGhlIGJ1cyBhZGRyZXNzIG9idGFpbmVkIGJ5IHRoZSBhbHRlcm5hdGl2ZSBtZXRob2QgTVVTVCBOT1QgYmUKKyAgICAgICAgICAgIGNvbnNpZGVyZWQgYSBmYXRhbCBlcnJvci4gSWYgdGhlIGNvbm5lY3Rpb24gY2Fubm90IGJlIGVzdGFibGlzaGVkLAorICAgICAgICAgICAgdGhlIGltcGxlbWVudGF0aW9uIE1VU1QgcHJvY2VlZCB0byBjaGVjayB0aGUgWCBzZWxlY3Rpb24gc2V0dGluZ3Mgb3IKKyAgICAgICAgICAgIHRvIHN0YXJ0IHRoZSBzZXJ2ZXIgb24gaXRzIG93bi4KKyAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIElmIHRoZSBpbXBsZW1lbnRhdGlvbiBjb25jbHVkZXMgdGhhdCB0aGUgRC1CdXMgc2VydmVyIGlzIG5vdAorICAgICAgICAgICAgcnVubmluZyBpdCBNVVNUIGF0dGVtcHQgdG8gc3RhcnQgYSBuZXcgc2VydmVyIGFuZCBpdCBNVVNUIGFsc28KKyAgICAgICAgICAgIGVuc3VyZSB0aGF0IHRoZSBkYWVtb24gc3RhcnRlZCBhcyBhbiBlZmZlY3Qgb2YgdGhlICJhdXRvbGF1bmNoIgorICAgICAgICAgICAgbWVjaGFuaXNtIHByb3ZpZGVzIHRoZSBsb29rdXAgbWVjaGFuaXNtcyBkZXNjcmliZWQgYWJvdmUsIHNvCisgICAgICAgICAgICBzdWJzZXF1ZW50IGNhbGxzIGNhbiBsb2NhdGUgdGhlIG5ld2x5IHN0YXJ0ZWQgc2VydmVyLiBUaGUKKyAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIE1VU1QgYWxzbyBlbnN1cmUgdGhhdCBpZiB0d28gb3IgbW9yZSBjb25jdXJyZW50CisgICAgICAgICAgICBpbml0aWF0aW9ucyBoYXBwZW4sIG9ubHkgb25lIHNlcnZlciByZW1haW5zIHJ1bm5pbmcgYW5kIGFsbCBvdGhlcgorICAgICAgICAgICAgaW5pdGlhdGlvbnMgYXJlIGFibGUgdG8gb2J0YWluIHRoZSBhZGRyZXNzIG9mIHRoaXMgc2VydmVyIGFuZAorICAgICAgICAgICAgY29ubmVjdCB0byBpdC4gSW4gb3RoZXIgd29yZHMsIHRoZSBpbXBsZW1lbnRhdGlvbiBNVVNUIGVuc3VyZSB0aGF0CisgICAgICAgICAgICB0aGUgWCBzZWxlY3Rpb24gaXMgbm90IHByZXNlbnQgd2hlbiBpdCBhdHRlbXB0cyB0byBzZXQgaXQsIHdpdGhvdXQKKyAgICAgICAgICAgIGFsbG93aW5nIGFub3RoZXIgcHJvY2VzcyB0byBzZXQgdGhlIHNlbGVjdGlvbiBiZXR3ZWVuIHRoZQorICAgICAgICAgICAgdmVyaWZpY2F0aW9uIGFuZCB0aGUgc2V0dGluZyAoZS5nLiwgYnkgdXNpbmcgWEdyYWJTZXJ2ZXIgLworICAgICAgICAgICAgWHVuZ3JhYlNlcnZlcikuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Q0PgorICAgICAgICA8c2VjdDQ+CisgICAgICAgICAgPHRpdGxlPjwvdGl0bGU+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBPbiBVbml4IHN5c3RlbXMsIHRoZSBzZXNzaW9uIGJ1cyBzaG91bGQgc2VhcmNoIGZvciAuc2VydmljZSBmaWxlcworICAgICAgICAgICAgaW4gPGxpdGVyYWw+JFhER19EQVRBX0RJUlMvZGJ1cy0xL3NlcnZpY2VzPC9saXRlcmFsPiBhcyBkZWZpbmVkCisgICAgICAgICAgICBieSB0aGUKKyAgICAgICAgICAgIDx1bGluayB1cmw9Imh0dHA6Ly9zdGFuZGFyZHMuZnJlZWRlc2t0b3Aub3JnL2Jhc2VkaXItc3BlYy9iYXNlZGlyLXNwZWMtbGF0ZXN0Lmh0bWwiPlhERyBCYXNlIERpcmVjdG9yeSBTcGVjaWZpY2F0aW9uPC91bGluaz4uCisgICAgICAgICAgICBJbXBsZW1lbnRhdGlvbnMgbWF5IGFsc28gc2VhcmNoIGFkZGl0aW9uYWwgbG9jYXRpb25zLCB3aGljaAorICAgICAgICAgICAgc2hvdWxkIGJlIHNlYXJjaGVkIHdpdGggbG93ZXIgcHJpb3JpdHkgdGhhbiBhbnl0aGluZyBpbgorICAgICAgICAgICAgWERHX0RBVEFfSE9NRSwgWERHX0RBVEFfRElSUyBvciB0aGVpciByZXNwZWN0aXZlIGRlZmF1bHRzOworICAgICAgICAgICAgZm9yIGV4YW1wbGUsIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gYWxzbworICAgICAgICAgICAgbG9va3MgaW4gPGxpdGVyYWw+JHtkYXRhZGlyfS9kYnVzLTEvc2VydmljZXM8L2xpdGVyYWw+IGFzCisgICAgICAgICAgICBzZXQgYXQgY29tcGlsZSB0aW1lLgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEFzIGRlc2NyaWJlZCBpbiB0aGUgWERHIEJhc2UgRGlyZWN0b3J5IFNwZWNpZmljYXRpb24sIHNvZnR3YXJlCisgICAgICAgICAgICBwYWNrYWdlcyBzaG91bGQgaW5zdGFsbCB0aGVpciBzZXNzaW9uIC5zZXJ2aWNlIGZpbGVzIHRvIHRoZWlyCisgICAgICAgICAgICBjb25maWd1cmVkIDxsaXRlcmFsPiR7ZGF0YWRpcn0vZGJ1cy0xL3NlcnZpY2VzPC9saXRlcmFsPiwKKyAgICAgICAgICAgIHdoZXJlIDxsaXRlcmFsPiR7ZGF0YWRpcn08L2xpdGVyYWw+IGlzIGFzIGRlZmluZWQgYnkgdGhlIEdOVQorICAgICAgICAgICAgY29kaW5nIHN0YW5kYXJkcy4gU3lzdGVtIGFkbWluaXN0cmF0b3JzIG9yIHVzZXJzIGNhbiBhcnJhbmdlCisgICAgICAgICAgICBmb3IgdGhlc2Ugc2VydmljZSBmaWxlcyB0byBiZSByZWFkIGJ5IHNldHRpbmcgWERHX0RBVEFfRElSUyBvciBieQorICAgICAgICAgICAgc3ltbGlua2luZyB0aGVtIGludG8gdGhlIGRlZmF1bHQgbG9jYXRpb25zLgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0ND4KKyAgICAgIDwvc2VjdDM+CisgICAgICA8c2VjdDMgaWQ9Im1lc3NhZ2UtYnVzLXR5cGVzLXN5c3RlbSI+CisgICAgICAgIDx0aXRsZT5TeXN0ZW0gbWVzc2FnZSBidXM8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBIGNvbXB1dGVyIG1heSBoYXZlIGEgPGZpcnN0dGVybT5zeXN0ZW0gbWVzc2FnZSBidXM8L2ZpcnN0dGVybT4sCisgICAgICAgICAgYWNjZXNzaWJsZSB0byBhbGwgYXBwbGljYXRpb25zIG9uIHRoZSBzeXN0ZW0uIFRoaXMgbWVzc2FnZSBidXMgbWF5IGJlCisgICAgICAgICAgdXNlZCB0byBicm9hZGNhc3Qgc3lzdGVtIGV2ZW50cywgc3VjaCBhcyBhZGRpbmcgbmV3IGhhcmR3YXJlIGRldmljZXMsIAorICAgICAgICAgIGNoYW5nZXMgaW4gdGhlIHByaW50ZXIgcXVldWUsIGFuZCBzbyBmb3J0aC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgYWRkcmVzcyBvZiB0aGUgc3lzdGVtIG1lc3NhZ2UgYnVzIGlzIGdpdmVuIAorICAgICAgICAgIGluIHRoZSA8bGl0ZXJhbD5EQlVTX1NZU1RFTV9CVVNfQUREUkVTUzwvbGl0ZXJhbD4gZW52aXJvbm1lbnQgCisgICAgICAgICAgdmFyaWFibGUuIElmIHRoYXQgdmFyaWFibGUgaXMgbm90IHNldCwgYXBwbGljYXRpb25zIHNob3VsZCB0cnkgCisgICAgICAgICAgdG8gY29ubmVjdCB0byB0aGUgd2VsbC1rbm93biBhZGRyZXNzCisgICAgICAgICAgPGxpdGVyYWw+dW5peDpwYXRoPS92YXIvcnVuL2RidXMvc3lzdGVtX2J1c19zb2NrZXQ8L2xpdGVyYWw+LgorICAgICAgICAgIDxmb290bm90ZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBUaGUgRC1CdXMgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGFjdHVhbGx5IGhvbm9ycyB0aGUgCisgICAgICAgICAgICAgIDxsaXRlcmFsPiQobG9jYWxzdGF0ZWRpcik8L2xpdGVyYWw+IGNvbmZpZ3VyZSBvcHRpb24gCisgICAgICAgICAgICAgIGZvciB0aGlzIGFkZHJlc3MsIG9uIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIgc2lkZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2Zvb3Rub3RlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIE9uIFVuaXggc3lzdGVtcywgdGhlIHN5c3RlbSBidXMgc2hvdWxkIGRlZmF1bHQgdG8gc2VhcmNoaW5nCisgICAgICAgICAgZm9yIC5zZXJ2aWNlIGZpbGVzIGluCisgICAgICAgICAgPGxpdGVyYWw+L3Vzci9sb2NhbC9zaGFyZS9kYnVzLTEvc3lzdGVtLXNlcnZpY2VzPC9saXRlcmFsPiwKKyAgICAgICAgICA8bGl0ZXJhbD4vdXNyL3NoYXJlL2RidXMtMS9zeXN0ZW0tc2VydmljZXM8L2xpdGVyYWw+IGFuZAorICAgICAgICAgIDxsaXRlcmFsPi9saWIvZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlczwvbGl0ZXJhbD4sIHdpdGggdGhhdCBvcmRlcgorICAgICAgICAgIG9mIHByZWNlZGVuY2UuIEl0IG1heSBhbHNvIHNlYXJjaCBvdGhlciBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYworICAgICAgICAgIGxvY2F0aW9ucywgYnV0IHNob3VsZCBub3QgdmFyeSB0aGVzZSBsb2NhdGlvbnMgYmFzZWQgb24gZW52aXJvbm1lbnQKKyAgICAgICAgICB2YXJpYWJsZXMuCisgICAgICAgICAgPGZvb3Rub3RlPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIFRoZSBzeXN0ZW0gYnVzIGlzIHNlY3VyaXR5LXNlbnNpdGl2ZSBhbmQgaXMgdHlwaWNhbGx5IGV4ZWN1dGVkCisgICAgICAgICAgICAgIGJ5IGFuIGluaXQgc3lzdGVtIHdpdGggYSBjbGVhbiBlbnZpcm9ubWVudC4gSXRzIGxhdW5jaCBoZWxwZXIKKyAgICAgICAgICAgICAgcHJvY2VzcyBpcyBwYXJ0aWN1bGFybHkgc2VjdXJpdHktc2Vuc2l0aXZlLCBhbmQgc3BlY2lmaWNhbGx5CisgICAgICAgICAgICAgIGNsZWFycyBpdHMgb3duIGVudmlyb25tZW50LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvZm9vdG5vdGU+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgU29mdHdhcmUgcGFja2FnZXMgc2hvdWxkIGluc3RhbGwgdGhlaXIgc3lzdGVtIC5zZXJ2aWNlCisgICAgICAgICAgZmlsZXMgdG8gdGhlaXIgY29uZmlndXJlZAorICAgICAgICAgIDxsaXRlcmFsPiR7ZGF0YWRpcn0vZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlczwvbGl0ZXJhbD4sCisgICAgICAgICAgd2hlcmUgPGxpdGVyYWw+JHtkYXRhZGlyfTwvbGl0ZXJhbD4gaXMgYXMgZGVmaW5lZCBieSB0aGUgR05VCisgICAgICAgICAgY29kaW5nIHN0YW5kYXJkcy4gU3lzdGVtIGFkbWluaXN0cmF0b3JzIGNhbiBhcnJhbmdlCisgICAgICAgICAgZm9yIHRoZXNlIHNlcnZpY2UgZmlsZXMgdG8gYmUgcmVhZCBieSBlZGl0aW5nIHRoZSBzeXN0ZW0gYnVzJworICAgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZSBvciBieSBzeW1saW5raW5nIHRoZW0gaW50byB0aGUgZGVmYXVsdAorICAgICAgICAgIGxvY2F0aW9ucy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKyAgICA8L3NlY3QyPgorCisgICAgPHNlY3QyIGlkPSJtZXNzYWdlLWJ1cy1tZXNzYWdlcyI+CisgICAgICA8dGl0bGU+TWVzc2FnZSBCdXMgTWVzc2FnZXM8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBzcGVjaWFsIG1lc3NhZ2UgYnVzIG5hbWUgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXM8L2xpdGVyYWw+CisgICAgICAgIHJlc3BvbmRzIHRvIGEgbnVtYmVyIG9mIGFkZGl0aW9uYWwgbWVzc2FnZXMuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxzZWN0MyBpZD0iYnVzLW1lc3NhZ2VzLWhlbGxvIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkhlbGxvPC9saXRlcmFsPjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFzIGEgbWV0aG9kOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIFNUUklORyBIZWxsbyAoKQorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgUmVwbHkgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5VbmlxdWUgbmFtZSBhc3NpZ25lZCB0byB0aGUgY29ubmVjdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQmVmb3JlIGFuIGFwcGxpY2F0aW9uIGlzIGFibGUgdG8gc2VuZCBtZXNzYWdlcyB0byBvdGhlciBhcHBsaWNhdGlvbnMKKyAgICAgICAgICBpdCBtdXN0IHNlbmQgdGhlIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkhlbGxvPC9saXRlcmFsPiBtZXNzYWdlCisgICAgICAgICAgdG8gdGhlIG1lc3NhZ2UgYnVzIHRvIG9idGFpbiBhIHVuaXF1ZSBuYW1lLiBJZiBhbiBhcHBsaWNhdGlvbiB3aXRob3V0CisgICAgICAgICAgYSB1bmlxdWUgbmFtZSB0cmllcyB0byBzZW5kIGEgbWVzc2FnZSB0byBhbm90aGVyIGFwcGxpY2F0aW9uLCBvciBhCisgICAgICAgICAgbWVzc2FnZSB0byB0aGUgbWVzc2FnZSBidXMgaXRzZWxmIHRoYXQgaXNuJ3QgdGhlCisgICAgICAgICAgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuSGVsbG88L2xpdGVyYWw+IG1lc3NhZ2UsIGl0IHdpbGwgYmUKKyAgICAgICAgICBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgYnVzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgImRpc2Nvbm5lY3QiIHJlcXVlc3Q7IGlmIGEgY2xpZW50IHdpc2hlcyB0bworICAgICAgICAgIGRpc2Nvbm5lY3QgZnJvbSB0aGUgYnVzLCBpdCBzaW1wbHkgY2xvc2VzIHRoZSBzb2NrZXQgKG9yIG90aGVyIAorICAgICAgICAgIGNvbW11bmljYXRpb24gY2hhbm5lbCkuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgICA8c2VjdDMgaWQ9ImJ1cy1tZXNzYWdlcy1saXN0LW5hbWVzIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkxpc3ROYW1lczwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBBUlJBWSBvZiBTVFJJTkcgTGlzdE5hbWVzICgpCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBSZXBseSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5BUlJBWSBvZiBTVFJJTkc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFycmF5IG9mIHN0cmluZ3Mgd2hlcmUgZWFjaCBzdHJpbmcgaXMgYSBidXMgbmFtZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGN1cnJlbnRseS1vd25lZCBuYW1lcyBvbiB0aGUgYnVzLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtbGlzdC1hY3RpdmF0YWJsZS1uYW1lcyI+CisgICAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5MaXN0QWN0aXZhdGFibGVOYW1lczwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBBUlJBWSBvZiBTVFJJTkcgTGlzdEFjdGl2YXRhYmxlTmFtZXMgKCkKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIFJlcGx5IGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFSUkFZIG9mIFNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJyYXkgb2Ygc3RyaW5ncyB3aGVyZSBlYWNoIHN0cmluZyBpcyBhIGJ1cyBuYW1lPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgbmFtZXMgdGhhdCBjYW4gYmUgYWN0aXZhdGVkIG9uIHRoZSBidXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgICA8c2VjdDMgaWQ9ImJ1cy1tZXNzYWdlcy1uYW1lLWV4aXN0cyI+CisgICAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5OYW1lSGFzT3duZXI8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQXMgYSBtZXRob2Q6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgQk9PTEVBTiBOYW1lSGFzT3duZXIgKGluIFNUUklORyBuYW1lKQorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgTWVzc2FnZSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5TVFJJTkc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pk5hbWUgdG8gY2hlY2s8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICAgIFJlcGx5IGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkJPT0xFQU48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlJldHVybiB2YWx1ZSwgdHJ1ZSBpZiB0aGUgbmFtZSBleGlzdHM8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIG5hbWUgZXhpc3RzIChjdXJyZW50bHkgaGFzIGFuIG93bmVyKS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKworICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtbmFtZS1vd25lci1jaGFuZ2VkIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLk5hbWVPd25lckNoYW5nZWQ8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhpcyBpcyBhIHNpZ25hbDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBOYW1lT3duZXJDaGFuZ2VkIChTVFJJTkcgbmFtZSwgU1RSSU5HIG9sZF9vd25lciwgU1RSSU5HIG5ld19vd25lcikKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5OYW1lIHdpdGggYSBuZXcgb3duZXI8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorCSAgICAgICAgPHJvdz4KKwkJICA8ZW50cnk+MTwvZW50cnk+CisJCSAgPGVudHJ5PlNUUklORzwvZW50cnk+CisJCSAgPGVudHJ5Pk9sZCBvd25lciBvciBlbXB0eSBzdHJpbmcgaWYgbm9uZTwvZW50cnk+CisJICAgICAgICA8L3Jvdz4KKwkgICAgICAgIDxyb3c+CisJCSAgPGVudHJ5PjI8L2VudHJ5PgorCQkgIDxlbnRyeT5TVFJJTkc8L2VudHJ5PgorCQkgIDxlbnRyeT5OZXcgb3duZXIgb3IgZW1wdHkgc3RyaW5nIGlmIG5vbmU8L2VudHJ5PgorCSAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhpcyBzaWduYWwgaW5kaWNhdGVzIHRoYXQgdGhlIG93bmVyIG9mIGEgbmFtZSBoYXMgY2hhbmdlZC4KKyAgICAgICAgICBJdCdzIGFsc28gdGhlIHNpZ25hbCB0byB1c2UgdG8gZGV0ZWN0IHRoZSBhcHBlYXJhbmNlIG9mIAorICAgICAgICAgIG5ldyBuYW1lcyBvbiB0aGUgYnVzLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtbmFtZS1sb3N0Ij4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLk5hbWVMb3N0PC9saXRlcmFsPjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoaXMgaXMgYSBzaWduYWw6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgTmFtZUxvc3QgKFNUUklORyBuYW1lKQorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgTWVzc2FnZSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5TVFJJTkc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pk5hbWUgd2hpY2ggd2FzIGxvc3Q8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoaXMgc2lnbmFsIGlzIHNlbnQgdG8gYSBzcGVjaWZpYyBhcHBsaWNhdGlvbiB3aGVuIGl0IGxvc2VzCisgICAgICAgICAgb3duZXJzaGlwIG9mIGEgbmFtZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKworICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtbmFtZS1hY3F1aXJlZCI+CisgICAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5OYW1lQWNxdWlyZWQ8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhpcyBpcyBhIHNpZ25hbDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBOYW1lQWNxdWlyZWQgKFNUUklORyBuYW1lKQorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgTWVzc2FnZSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5TVFJJTkc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pk5hbWUgd2hpY2ggd2FzIGFjcXVpcmVkPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGlzIHNpZ25hbCBpcyBzZW50IHRvIGEgc3BlY2lmaWMgYXBwbGljYXRpb24gd2hlbiBpdCBnYWlucworICAgICAgICAgIG93bmVyc2hpcCBvZiBhIG5hbWUuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisKKyAgICAgIDxzZWN0MyBpZD0iYnVzLW1lc3NhZ2VzLXN0YXJ0LXNlcnZpY2UtYnktbmFtZSI+CisgICAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5TdGFydFNlcnZpY2VCeU5hbWU8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQXMgYSBtZXRob2Q6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgVUlOVDMyIFN0YXJ0U2VydmljZUJ5TmFtZSAoaW4gU1RSSU5HIG5hbWUsIGluIFVJTlQzMiBmbGFncykKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5OYW1lIG9mIHRoZSBzZXJ2aWNlIHRvIHN0YXJ0PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKwkgICAgICAgIDxyb3c+CisJCSAgPGVudHJ5PjE8L2VudHJ5PgorCQkgIDxlbnRyeT5VSU5UMzI8L2VudHJ5PgorCQkgIDxlbnRyeT5GbGFncyAoY3VycmVudGx5IG5vdCB1c2VkKTwvZW50cnk+CisJICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgUmVwbHkgYXJndW1lbnRzOgorICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlVJTlQzMjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlJldHVybiB2YWx1ZTwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICAgIFRyaWVzIHRvIGxhdW5jaCB0aGUgZXhlY3V0YWJsZSBhc3NvY2lhdGVkIHdpdGggYSBuYW1lLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDx4cmVmIGxpbmtlbmQ9Im1lc3NhZ2UtYnVzLXN0YXJ0aW5nLXNlcnZpY2VzIi8+LgorCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlIHJldHVybiB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+SWRlbnRpZmllcjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VmFsdWU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorCSAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EQlVTX1NUQVJUX1JFUExZX1NVQ0NFU1M8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjE8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlRoZSBzZXJ2aWNlIHdhcyBzdWNjZXNzZnVsbHkgc3RhcnRlZC48L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+REJVU19TVEFSVF9SRVBMWV9BTFJFQURZX1JVTk5JTkc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjI8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkEgY29ubmVjdGlvbiBhbHJlYWR5IG93bnMgdGhlIGdpdmVuIG5hbWUuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICA8L3BhcmE+CisKKyAgICAgIDwvc2VjdDM+CisKKyAgICAgIDxzZWN0MyBpZD0iYnVzLW1lc3NhZ2VzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50Ij4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLlVwZGF0ZUFjdGl2YXRpb25FbnZpcm9ubWVudDwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBVcGRhdGVBY3RpdmF0aW9uRW52aXJvbm1lbnQgKGluIEFSUkFZIG9mIERJQ1QmbHQ7U1RSSU5HLFNUUklORyZndDsgZW52aXJvbm1lbnQpCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBNZXNzYWdlIGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFSUkFZIG9mIERJQ1QmbHQ7U1RSSU5HLFNUUklORyZndDs8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkVudmlyb25tZW50IHRvIGFkZCBvciB1cGRhdGU8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgICAgICBOb3JtYWxseSwgc2Vzc2lvbiBidXMgYWN0aXZhdGVkIHNlcnZpY2VzIGluaGVyaXQgdGhlIGVudmlyb25tZW50IG9mIHRoZSBidXMgZGFlbW9uLiAgVGhpcyBtZXRob2QgYWRkcyB0byBvciBtb2RpZmllcyB0aGF0IGVudmlyb25tZW50IHdoZW4gYWN0aXZhdGluZyBzZXJ2aWNlcy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBTb21lIGJ1cyBpbnN0YW5jZXMsIHN1Y2ggYXMgdGhlIHN0YW5kYXJkIHN5c3RlbSBidXMsIG1heSBkaXNhYmxlIGFjY2VzcyB0byB0aGlzIG1ldGhvZCBmb3Igc29tZSBvciBhbGwgY2FsbGVycy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBOb3RlLCBib3RoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lcyBhbmQgdmFsdWVzIG11c3QgYmUgdmFsaWQgVVRGLTguICBUaGVyZSdzIG5vIHdheSB0byB1cGRhdGUgdGhlIGFjdGl2YXRpb24gZW52aXJvbm1lbnQgd2l0aCBkYXRhIHRoYXQgaXMgaW52YWxpZCBVVEYtOC4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICA8L3NlY3QzPgorCisgICAgICA8c2VjdDMgaWQ9ImJ1cy1tZXNzYWdlcy1nZXQtbmFtZS1vd25lciI+CisgICAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5HZXROYW1lT3duZXI8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQXMgYSBtZXRob2Q6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgU1RSSU5HIEdldE5hbWVPd25lciAoaW4gU1RSSU5HIG5hbWUpCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBNZXNzYWdlIGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+TmFtZSB0byBnZXQgdGhlIG93bmVyIG9mPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgUmVwbHkgYXJndW1lbnRzOgorICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlJldHVybiB2YWx1ZSwgYSB1bmlxdWUgY29ubmVjdGlvbiBuYW1lPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIFJldHVybnMgdGhlIHVuaXF1ZSBjb25uZWN0aW9uIG5hbWUgb2YgdGhlIHByaW1hcnkgb3duZXIgb2YgdGhlIG5hbWUKKyAgICAgICAgZ2l2ZW4uIElmIHRoZSByZXF1ZXN0ZWQgbmFtZSBkb2Vzbid0IGhhdmUgYW4gb3duZXIsIHJldHVybnMgYQorICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5OYW1lSGFzTm9Pd25lcjwvbGl0ZXJhbD4gZXJyb3IuCisgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKworICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtZ2V0LWNvbm5lY3Rpb24tdW5peC11c2VyIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkdldENvbm5lY3Rpb25Vbml4VXNlcjwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBVSU5UMzIgR2V0Q29ubmVjdGlvblVuaXhVc2VyIChpbiBTVFJJTkcgYnVzX25hbWUpCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBNZXNzYWdlIGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VW5pcXVlIG9yIHdlbGwta25vd24gYnVzIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24gdG8KKyAgICAgICAgICAgICAgICAgICAgcXVlcnksIHN1Y2ggYXMgPGxpdGVyYWw+OjEyLjM0PC9saXRlcmFsPiBvcgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5jb20uZXhhbXBsZS50ZWE8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgUmVwbHkgYXJndW1lbnRzOgorICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlVJTlQzMjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlVuaXggdXNlciBJRDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICBSZXR1cm5zIHRoZSBVbml4IHVzZXIgSUQgb2YgdGhlIHByb2Nlc3MgY29ubmVjdGVkIHRvIHRoZSBzZXJ2ZXIuIElmCisgICAgICAgIHVuYWJsZSB0byBkZXRlcm1pbmUgaXQgKGZvciBpbnN0YW5jZSwgYmVjYXVzZSB0aGUgcHJvY2VzcyBpcyBub3Qgb24gdGhlCisgICAgICAgIHNhbWUgbWFjaGluZSBhcyB0aGUgYnVzIGRhZW1vbiksIGFuIGVycm9yIGlzIHJldHVybmVkLgorICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisKKyAgICAgIDxzZWN0MyBpZD0iYnVzLW1lc3NhZ2VzLWdldC1jb25uZWN0aW9uLXVuaXgtcHJvY2Vzcy1pZCI+CisgICAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5HZXRDb25uZWN0aW9uVW5peFByb2Nlc3NJRDwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBVSU5UMzIgR2V0Q29ubmVjdGlvblVuaXhQcm9jZXNzSUQgKGluIFNUUklORyBidXNfbmFtZSkKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5VbmlxdWUgb3Igd2VsbC1rbm93biBidXMgbmFtZSBvZiB0aGUgY29ubmVjdGlvbiB0bworICAgICAgICAgICAgICAgICAgICBxdWVyeSwgc3VjaCBhcyA8bGl0ZXJhbD46MTIuMzQ8L2xpdGVyYWw+IG9yCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmNvbS5leGFtcGxlLnRlYTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICBSZXBseSBhcmd1bWVudHM6CisgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VUlOVDMyPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VW5peCBwcm9jZXNzIGlkPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIFJldHVybnMgdGhlIFVuaXggcHJvY2VzcyBJRCBvZiB0aGUgcHJvY2VzcyBjb25uZWN0ZWQgdG8gdGhlIHNlcnZlci4gSWYKKyAgICAgICAgdW5hYmxlIHRvIGRldGVybWluZSBpdCAoZm9yIGluc3RhbmNlLCBiZWNhdXNlIHRoZSBwcm9jZXNzIGlzIG5vdCBvbiB0aGUKKyAgICAgICAgc2FtZSBtYWNoaW5lIGFzIHRoZSBidXMgZGFlbW9uKSwgYW4gZXJyb3IgaXMgcmV0dXJuZWQuCisgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKworICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtYWRkLW1hdGNoIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkFkZE1hdGNoPC9saXRlcmFsPjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFzIGEgbWV0aG9kOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIEFkZE1hdGNoIChpbiBTVFJJTkcgcnVsZSkKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5NYXRjaCBydWxlIHRvIGFkZCB0byB0aGUgY29ubmVjdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIEFkZHMgYSBtYXRjaCBydWxlIHRvIG1hdGNoIG1lc3NhZ2VzIGdvaW5nIHRocm91Z2ggdGhlIG1lc3NhZ2UgYnVzIChzZWUgPHhyZWYgbGlua2VuZD0nbWVzc2FnZS1idXMtcm91dGluZy1tYXRjaC1ydWxlcycvPikuIAorCUlmIHRoZSBidXMgZG9lcyBub3QgaGF2ZSBlbm91Z2ggcmVzb3VyY2VzIHRoZSA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5PT008L2xpdGVyYWw+CisJZXJyb3IgaXMgcmV0dXJuZWQuCisgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKyAgICAgIDxzZWN0MyBpZD0iYnVzLW1lc3NhZ2VzLXJlbW92ZS1tYXRjaCI+CisgICAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5SZW1vdmVNYXRjaDwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBSZW1vdmVNYXRjaCAoaW4gU1RSSU5HIHJ1bGUpCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBNZXNzYWdlIGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+TWF0Y2ggcnVsZSB0byByZW1vdmUgZnJvbSB0aGUgY29ubmVjdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIFJlbW92ZXMgdGhlIGZpcnN0IHJ1bGUgdGhhdCBtYXRjaGVzIChzZWUgPHhyZWYgbGlua2VuZD0nbWVzc2FnZS1idXMtcm91dGluZy1tYXRjaC1ydWxlcycvPikuIAorCUlmIHRoZSBydWxlIGlzIG5vdCBmb3VuZCB0aGUgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuTWF0Y2hSdWxlTm90Rm91bmQ8L2xpdGVyYWw+CisJZXJyb3IgaXMgcmV0dXJuZWQuCisgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKworICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtZ2V0LWlkIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkdldElkPC9saXRlcmFsPjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFzIGEgbWV0aG9kOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIEdldElkIChvdXQgU1RSSU5HIGlkKQorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIFJlcGx5IGFyZ3VtZW50czoKKyAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5TVFJJTkc8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5VbmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIGJ1cyBkYWVtb248L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgR2V0cyB0aGUgdW5pcXVlIElEIG9mIHRoZSBidXMuIFRoZSB1bmlxdWUgSUQgaGVyZSBpcyBzaGFyZWQgYW1vbmcgYWxsIGFkZHJlc3NlcyB0aGUgCisgICAgICAgIGJ1cyBkYWVtb24gaXMgbGlzdGVuaW5nIG9uIChUQ1AsIFVOSVggZG9tYWluIHNvY2tldCwgZXRjLikgYW5kIGl0cyBmb3JtYXQgaXMgZGVzY3JpYmVkIGluIAorICAgICAgICA8eHJlZiBsaW5rZW5kPSJ1dWlkcyIvPi4gRWFjaCBhZGRyZXNzIHRoZSBidXMgaXMgbGlzdGVuaW5nIG9uIGFsc28gaGFzIGl0cyBvd24gdW5pcXVlIAorICAgICAgICBJRCwgYXMgZGVzY3JpYmVkIGluIDx4cmVmIGxpbmtlbmQ9ImFkZHJlc3NlcyIvPi4gVGhlIHBlci1idXMgYW5kIHBlci1hZGRyZXNzIElEcyBhcmUgbm90IHJlbGF0ZWQuCisgICAgICAgIFRoZXJlIGlzIGFsc28gYSBwZXItbWFjaGluZSBJRCwgZGVzY3JpYmVkIGluIDx4cmVmIGxpbmtlbmQ9InN0YW5kYXJkLWludGVyZmFjZXMtcGVlciIvPiBhbmQgcmV0dXJuZWQKKyAgICAgICAgYnkgb3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlci5HZXRNYWNoaW5lSWQoKS4KKyAgICAgICAgRm9yIGEgZGVza3RvcCBzZXNzaW9uIGJ1cywgdGhlIGJ1cyBJRCBjYW4gYmUgdXNlZCBhcyBhIHdheSB0byB1bmlxdWVseSBpZGVudGlmeSBhIHVzZXIncyBzZXNzaW9uLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorCisgICAgPC9zZWN0Mj4KKworICA8L3NlY3QxPgorPCEtLQorICA8YXBwZW5kaXggaWQ9ImltcGxlbWVudGF0aW9uLW5vdGVzIj4KKyAgICA8dGl0bGU+SW1wbGVtZW50YXRpb24gbm90ZXM8L3RpdGxlPgorICAgIDxzZWN0MSBpZD0iaW1wbGVtZW50YXRpb24tbm90ZXMtc3Vic2VjdGlvbiI+CisgICAgICA8dGl0bGU+PC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDE+CisgIDwvYXBwZW5kaXg+CistLT4KKworICA8Z2xvc3Nhcnk+PHRpdGxlPkdsb3NzYXJ5PC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgIFRoaXMgZ2xvc3NhcnkgZGVmaW5lcyBzb21lIG9mIHRoZSB0ZXJtcyB1c2VkIGluIHRoaXMgc3BlY2lmaWNhdGlvbi4KKyAgICA8L3BhcmE+CisKKyAgICA8Z2xvc3NlbnRyeSBpZD0idGVybS1idXMtbmFtZSI+PGdsb3NzdGVybT5CdXMgTmFtZTwvZ2xvc3N0ZXJtPgorICAgICAgPGdsb3NzZGVmPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgbWVzc2FnZSBidXMgbWFpbnRhaW5zIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gbmFtZXMgYW5kCisgICAgICAgICAgY29ubmVjdGlvbnMuIChOb3JtYWxseSwgdGhlcmUncyBvbmUgY29ubmVjdGlvbiBwZXIgYXBwbGljYXRpb24uKSAgQQorICAgICAgICAgIGJ1cyBuYW1lIGlzIHNpbXBseSBhbiBpZGVudGlmaWVyIHVzZWQgdG8gbG9jYXRlIGNvbm5lY3Rpb25zLiBGb3IKKyAgICAgICAgICBleGFtcGxlLCB0aGUgaHlwb3RoZXRpY2FsIDxsaXRlcmFsPmNvbS55b3lvZHluZS5TY3JlZW5zYXZlcjwvbGl0ZXJhbD4KKyAgICAgICAgICBuYW1lIG1pZ2h0IGJlIHVzZWQgdG8gc2VuZCBhIG1lc3NhZ2UgdG8gYSBzY3JlZW5zYXZlciBmcm9tIFlveW9keW5lCisgICAgICAgICAgQ29ycG9yYXRpb24uICBBbiBhcHBsaWNhdGlvbiBpcyBzYWlkIHRvIDxmaXJzdHRlcm0+b3duPC9maXJzdHRlcm0+IGEKKyAgICAgICAgICBuYW1lIGlmIHRoZSBtZXNzYWdlIGJ1cyBoYXMgYXNzb2NpYXRlZCB0aGUgYXBwbGljYXRpb24ncyBjb25uZWN0aW9uCisgICAgICAgICAgd2l0aCB0aGUgbmFtZS4gIE5hbWVzIG1heSBhbHNvIGhhdmUgPGZpcnN0dGVybT5xdWV1ZWQKKyAgICAgICAgICBvd25lcnM8L2ZpcnN0dGVybT4gKHNlZSA8eHJlZiBsaW5rZW5kPSJ0ZXJtLXF1ZXVlZC1vd25lciIvPikuCisgICAgICAgICAgICBUaGUgYnVzIGFzc2lnbnMgYSB1bmlxdWUgbmFtZSB0byBlYWNoIGNvbm5lY3Rpb24sIAorICAgICAgICAgICAgc2VlIDx4cmVmIGxpbmtlbmQ9InRlcm0tdW5pcXVlLW5hbWUiLz4uIE90aGVyIG5hbWVzIAorICAgICAgICAgICAgICBjYW4gYmUgdGhvdWdodCBvZiBhcyAid2VsbC1rbm93biBuYW1lcyIgYW5kIGFyZSAKKyAgICAgICAgICAgICAgdXNlZCB0byBmaW5kIGFwcGxpY2F0aW9ucyB0aGF0IG9mZmVyIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICBTZWUgPHhyZWYgbGlua2VuZD0ibWVzc2FnZS1wcm90b2NvbC1uYW1lcy1idXMiLz4gZm9yIGRldGFpbHMgb2YKKyAgICAgICAgICB0aGUgc3ludGF4IGFuZCBuYW1pbmcgY29udmVudGlvbnMgZm9yIGJ1cyBuYW1lcy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9nbG9zc2RlZj4KKyAgICA8L2dsb3NzZW50cnk+CisgICAgICAKKyAgICA8Z2xvc3NlbnRyeSBpZD0idGVybS1tZXNzYWdlIj48Z2xvc3N0ZXJtPk1lc3NhZ2U8L2dsb3NzdGVybT4KKyAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQSBtZXNzYWdlIGlzIHRoZSBhdG9taWMgdW5pdCBvZiBjb21tdW5pY2F0aW9uIHZpYSB0aGUgRC1CdXMKKyAgICAgICAgICBwcm90b2NvbC4gSXQgY29uc2lzdHMgb2YgYSA8Zmlyc3R0ZXJtPmhlYWRlcjwvZmlyc3R0ZXJtPiBhbmQgYQorICAgICAgICAgIDxmaXJzdHRlcm0+Ym9keTwvZmlyc3R0ZXJtPjsgdGhlIGJvZHkgaXMgbWFkZSB1cCBvZgorICAgICAgICAgIDxmaXJzdHRlcm0+YXJndW1lbnRzPC9maXJzdHRlcm0+LgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2dsb3NzZGVmPgorICAgIDwvZ2xvc3NlbnRyeT4KKworICAgIDxnbG9zc2VudHJ5IGlkPSJ0ZXJtLW1lc3NhZ2UtYnVzIj48Z2xvc3N0ZXJtPk1lc3NhZ2UgQnVzPC9nbG9zc3Rlcm0+CisgICAgICA8Z2xvc3NkZWY+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSBtZXNzYWdlIGJ1cyBpcyBhIHNwZWNpYWwgYXBwbGljYXRpb24gdGhhdCBmb3J3YXJkcyAKKyAgICAgICAgICBvciByb3V0ZXMgbWVzc2FnZXMgYmV0d2VlbiBhIGdyb3VwIG9mIGFwcGxpY2F0aW9ucworICAgICAgICAgIGNvbm5lY3RlZCB0byB0aGUgbWVzc2FnZSBidXMuIEl0IGFsc28gbWFuYWdlcyAKKyAgICAgICAgICA8Zmlyc3R0ZXJtPm5hbWVzPC9maXJzdHRlcm0+IHVzZWQgZm9yIHJvdXRpbmcKKyAgICAgICAgICBtZXNzYWdlcy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9nbG9zc2RlZj4KKyAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8Z2xvc3NlbnRyeSBpZD0idGVybS1uYW1lIj48Z2xvc3N0ZXJtPk5hbWU8L2dsb3NzdGVybT4KKyAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgU2VlIDx4cmVmIGxpbmtlbmQ9InRlcm0tYnVzLW5hbWUiLz4uICJOYW1lIiBtYXkgCisgICAgICAgICAgICBhbHNvIGJlIHVzZWQgdG8gcmVmZXIgdG8gc29tZSBvZiB0aGUgb3RoZXIgbmFtZXMKKyAgICAgICAgICAgIGluIEQtQnVzLCBzdWNoIGFzIGludGVyZmFjZSBuYW1lcy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9nbG9zc2RlZj4KKyAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8Z2xvc3NlbnRyeSBpZD0ibmFtZXNwYWNlIj48Z2xvc3N0ZXJtPk5hbWVzcGFjZTwvZ2xvc3N0ZXJtPgorICAgICAgPGdsb3NzZGVmPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBVc2VkIHRvIHByZXZlbnQgY29sbGlzaW9ucyB3aGVuIGRlZmluaW5nIG5ldyBpbnRlcmZhY2VzLCBidXMgbmFtZXMKKyAgICAgICAgICBldGMuIFRoZSBjb252ZW50aW9uIHVzZWQgaXMgdGhlIHNhbWUgb25lIEphdmEgdXNlcyBmb3IgZGVmaW5pbmcKKyAgICAgICAgICBjbGFzc2VzOiBhIHJldmVyc2VkIGRvbWFpbiBuYW1lLgorICAgICAgICAgIFNlZSA8eHJlZiBsaW5rZW5kPSJtZXNzYWdlLXByb3RvY29sLW5hbWVzLWJ1cyIvPiwKKyAgICAgICAgICA8eHJlZiBsaW5rZW5kPSJtZXNzYWdlLXByb3RvY29sLW5hbWVzLWludGVyZmFjZSIvPiwKKyAgICAgICAgICA8eHJlZiBsaW5rZW5kPSJtZXNzYWdlLXByb3RvY29sLW5hbWVzLWVycm9yIi8+LAorICAgICAgICAgIDx4cmVmIGxpbmtlbmQ9Im1lc3NhZ2UtcHJvdG9jb2wtbWFyc2hhbGluZy1vYmplY3QtcGF0aCIvPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9nbG9zc2RlZj4KKyAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8Z2xvc3NlbnRyeSBpZD0idGVybS1vYmplY3QiPjxnbG9zc3Rlcm0+T2JqZWN0PC9nbG9zc3Rlcm0+CisgICAgICA8Z2xvc3NkZWY+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEVhY2ggYXBwbGljYXRpb24gY29udGFpbnMgPGZpcnN0dGVybT5vYmplY3RzPC9maXJzdHRlcm0+LCB3aGljaCBoYXZlCisgICAgICAgICAgPGZpcnN0dGVybT5pbnRlcmZhY2VzPC9maXJzdHRlcm0+IGFuZAorICAgICAgICAgIDxmaXJzdHRlcm0+bWV0aG9kczwvZmlyc3R0ZXJtPi4gT2JqZWN0cyBhcmUgcmVmZXJyZWQgdG8gYnkgYSBuYW1lLAorICAgICAgICAgIGNhbGxlZCBhIDxmaXJzdHRlcm0+cGF0aDwvZmlyc3R0ZXJtPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9nbG9zc2RlZj4KKyAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8Z2xvc3NlbnRyeSBpZD0ib25lLXRvLW9uZSI+PGdsb3NzdGVybT5PbmUtdG8tT25lPC9nbG9zc3Rlcm0+CisgICAgICA8Z2xvc3NkZWY+CisJPHBhcmE+CisgICAgICAgICAgQW4gYXBwbGljYXRpb24gdGFsa2luZyBkaXJlY3RseSB0byBhbm90aGVyIGFwcGxpY2F0aW9uLCB3aXRob3V0IGdvaW5nCisgICAgICAgICAgdGhyb3VnaCBhIG1lc3NhZ2UgYnVzLiBPbmUtdG8tb25lIGNvbm5lY3Rpb25zIG1heSBiZSAicGVlciB0byBwZWVyIiBvcgorICAgICAgICAgICJjbGllbnQgdG8gc2VydmVyLiIgVGhlIEQtQnVzIHByb3RvY29sIGhhcyBubyBjb25jZXB0IG9mIGNsaWVudAorICAgICAgICAgIHZzLiBzZXJ2ZXIgYWZ0ZXIgYSBjb25uZWN0aW9uIGhhcyBhdXRoZW50aWNhdGVkOyB0aGUgZmxvdyBvZiBtZXNzYWdlcworICAgICAgICAgIGlzIHN5bW1ldHJpY2FsIChmdWxsIGR1cGxleCkuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvZ2xvc3NkZWY+CisgICAgPC9nbG9zc2VudHJ5PgorCisgICAgPGdsb3NzZW50cnkgaWQ9InRlcm0tcGF0aCI+PGdsb3NzdGVybT5QYXRoPC9nbG9zc3Rlcm0+CisgICAgICA8Z2xvc3NkZWY+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIE9iamVjdCByZWZlcmVuY2VzIChvYmplY3QgbmFtZXMpIGluIEQtQnVzIGFyZSBvcmdhbml6ZWQgaW50byBhCisgICAgICAgICAgZmlsZXN5c3RlbS1zdHlsZSBoaWVyYXJjaHksIHNvIGVhY2ggb2JqZWN0IGlzIG5hbWVkIGJ5IGEgcGF0aC4gQXMgaW4KKyAgICAgICAgICBMREFQLCB0aGVyZSdzIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiAiZmlsZXMiIGFuZCAiZGlyZWN0b3JpZXMiOyBhIHBhdGgKKyAgICAgICAgICBjYW4gcmVmZXIgdG8gYW4gb2JqZWN0LCB3aGlsZSBzdGlsbCBoYXZpbmcgY2hpbGQgb2JqZWN0cyBiZWxvdyBpdC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9nbG9zc2RlZj4KKyAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8Z2xvc3NlbnRyeSBpZD0idGVybS1xdWV1ZWQtb3duZXIiPjxnbG9zc3Rlcm0+UXVldWVkIE5hbWUgT3duZXI8L2dsb3NzdGVybT4KKyAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRWFjaCBidXMgbmFtZSBoYXMgYSBwcmltYXJ5IG93bmVyOyBtZXNzYWdlcyBzZW50IHRvIHRoZSBuYW1lIGdvIHRvIHRoZQorICAgICAgICAgIHByaW1hcnkgb3duZXIuIEhvd2V2ZXIsIGNlcnRhaW4gbmFtZXMgYWxzbyBtYWludGFpbiBhIHF1ZXVlIG9mCisgICAgICAgICAgc2Vjb25kYXJ5IG93bmVycyAid2FpdGluZyBpbiB0aGUgd2luZ3MuIiBJZiB0aGUgcHJpbWFyeSBvd25lciByZWxlYXNlcworICAgICAgICAgIHRoZSBuYW1lLCB0aGVuIHRoZSBmaXJzdCBzZWNvbmRhcnkgb3duZXIgaW4gdGhlIHF1ZXVlIGF1dG9tYXRpY2FsbHkKKyAgICAgICAgICBiZWNvbWVzIHRoZSBuZXcgb3duZXIgb2YgdGhlIG5hbWUuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvZ2xvc3NkZWY+CisgICAgPC9nbG9zc2VudHJ5PgorCisgICAgPGdsb3NzZW50cnkgaWQ9InRlcm0tc2VydmljZSI+PGdsb3NzdGVybT5TZXJ2aWNlPC9nbG9zc3Rlcm0+CisgICAgICA8Z2xvc3NkZWY+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEEgc2VydmljZSBpcyBhbiBleGVjdXRhYmxlIHRoYXQgY2FuIGJlIGxhdW5jaGVkIGJ5IHRoZSBidXMgZGFlbW9uLgorICAgICAgICAgIFNlcnZpY2VzIG5vcm1hbGx5IGd1YXJhbnRlZSBzb21lIHBhcnRpY3VsYXIgZmVhdHVyZXMsIGZvciBleGFtcGxlIHRoZXkKKyAgICAgICAgICBtYXkgZ3VhcmFudGVlIHRoYXQgdGhleSB3aWxsIHJlcXVlc3QgYSBzcGVjaWZpYyBuYW1lIHN1Y2ggYXMKKyAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLlNjcmVlbnNhdmVyIiwgaGF2ZSBhIHNpbmdsZXRvbiBvYmplY3QKKyAgICAgICAgICAiL29yZy9mcmVlZGVza3RvcC9BcHBsaWNhdGlvbiIsIGFuZCB0aGF0IG9iamVjdCB3aWxsIGltcGxlbWVudCB0aGUKKyAgICAgICAgICBpbnRlcmZhY2UgIm9yZy5mcmVlZGVza3RvcC5TY3JlZW5zYXZlckNvbnRyb2wiLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2dsb3NzZGVmPgorICAgIDwvZ2xvc3NlbnRyeT4KKworICAgIDxnbG9zc2VudHJ5IGlkPSJ0ZXJtLXNlcnZpY2UtZGVzY3JpcHRpb24tZmlsZXMiPjxnbG9zc3Rlcm0+U2VydmljZSBEZXNjcmlwdGlvbiBGaWxlczwvZ2xvc3N0ZXJtPgorICAgICAgPGdsb3NzZGVmPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAiLnNlcnZpY2UgZmlsZXMiIHRlbGwgdGhlIGJ1cyBhYm91dCBzZXJ2aWNlIGFwcGxpY2F0aW9ucyB0aGF0IGNhbiBiZQorICAgICAgICAgIGxhdW5jaGVkIChzZWUgPHhyZWYgbGlua2VuZD0idGVybS1zZXJ2aWNlIi8+KS4gTW9zdCBpbXBvcnRhbnRseSB0aGV5CisgICAgICAgICAgcHJvdmlkZSBhIG1hcHBpbmcgZnJvbSBidXMgbmFtZXMgdG8gc2VydmljZXMgdGhhdCB3aWxsIHJlcXVlc3QgdGhvc2UKKyAgICAgICAgICAgIG5hbWVzIHdoZW4gdGhleSBzdGFydCB1cC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9nbG9zc2RlZj4KKyAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8Z2xvc3NlbnRyeSBpZD0idGVybS11bmlxdWUtbmFtZSI+PGdsb3NzdGVybT5VbmlxdWUgQ29ubmVjdGlvbiBOYW1lPC9nbG9zc3Rlcm0+CisgICAgICA8Z2xvc3NkZWY+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSBzcGVjaWFsIG5hbWUgYXV0b21hdGljYWxseSBhc3NpZ25lZCB0byBlYWNoIGNvbm5lY3Rpb24gYnkgdGhlCisgICAgICAgICAgbWVzc2FnZSBidXMuIFRoaXMgbmFtZSB3aWxsIG5ldmVyIGNoYW5nZSBvd25lciwgYW5kIHdpbGwgYmUgdW5pcXVlCisgICAgICAgICAgKG5ldmVyIHJldXNlZCBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoZSBtZXNzYWdlIGJ1cykuCisgICAgICAgICAgSXQgd2lsbCBiZWdpbiB3aXRoIGEgJzonIGNoYXJhY3Rlci4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9nbG9zc2RlZj4KKyAgICA8L2dsb3NzZW50cnk+CisKKyAgPC9nbG9zc2FyeT4KKzwvYXJ0aWNsZT4KZGlmZiAtLWdpdCBhL2RidXMvZG9jL2RidXMtdGVzdC1wbGFuLnhtbCBiL2RidXMvZG9jL2RidXMtdGVzdC1wbGFuLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmFhZmI5Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kb2MvZGJ1cy10ZXN0LXBsYW4ueG1sCkBAIC0wLDAgKzEsMjMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+Cis8IURPQ1RZUEUgYXJ0aWNsZSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMS4yLy9FTiIKKyJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuMS4yL2RvY2Jvb2t4LmR0ZCIKK1sKK10+CisKKzxhcnRpY2xlIGlkPSJpbmRleCI+CisgIDxhcnRpY2xlaW5mbz4KKyAgICA8dGl0bGU+RC1CdXMgVGVzdCBQbGFuPC90aXRsZT4KKyAgICA8ZGF0ZT4xNCBGZWJydWFyeSAyMDAzPC9kYXRlPgorICAgIDxhdXRob3Jncm91cD4KKyAgICAgIDxhdXRob3I+CisJPGZpcnN0bmFtZT5BbmRlcnM8L2ZpcnN0bmFtZT4KKwk8c3VybmFtZT5DYXJsc3Nvbjwvc3VybmFtZT4KKwk8YWZmaWxpYXRpb24+CisJICA8b3JnbmFtZT5Db2RlRmFjdG9yeSBBQjwvb3JnbmFtZT4KKwkgIDxhZGRyZXNzPjxlbWFpbD5hbmRlcnNjYUBjb2RlZmFjdG9yeS5zZTwvZW1haWw+PC9hZGRyZXNzPgorCTwvYWZmaWxpYXRpb24+CisgICAgICA8L2F1dGhvcj4KKyAgICA8L2F1dGhvcmdyb3VwPgorICA8L2FydGljbGVpbmZvPgorICA8c2VjdDEgaWQ9ImludHJvZHVjdGlvbiI+CisgICAgPHRpdGxlPkludHJvZHVjdGlvbjwvdGl0bGU+CisgICAgPHBhcmE+CisgICAgICBUaGlzIGRvY3VtZW50IHRyaWVzIHRvIGV4cGxhaW4gdGhlIGRldGFpbHMgb2YgdGhlIHRlc3QgcGxhbiBmb3IgRC1CdXMKKyAgICA8L3BhcmE+CisgICAgPHNlY3QyIGlkPSJpbXBvcnRhbmNlLW9mLXRlc3RpbmciPgorICAgICAgPHRpdGxlPlRoZSBpbXBvcnRhbmNlIG9mIHRlc3Rpbmc8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIEFzIHdpdGggYW55IGJpZyBsaWJyYXJ5IG9yIHByb2dyYW0sIHRlc3RpbmcgaXMgaW1wb3J0YW50LiBJdAorICAgICAgICBjYW4gaGVscCBmaW5kIGJ1Z3MgYW5kIHJlZ3Jlc3Npb25zIGFuZCBtYWtlIHRoZSBjb2RlIGJldHRlcgorICAgICAgICBvdmVyYWxsLiAKKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBELUJ1cyBpcyBhIGxhcmdlIGFuZCBjb21wbGV4IHBpZWNlIG9mIHNvZnR3YXJlIChhYm91dCAyNSwwMDAKKyAgICAgICAgbGluZXMgb2YgY29kZSBmb3IgdGhlIGNsaWVudCBsaWJyYXJ5LCBhbmQgMiw1MDAgbGluZXMgb2YgY29kZQorICAgICAgICBmb3IgdGhlIGJ1cyBkYWVtb24pIGFuZCBpdCdzIHRoZXJlZm9yZSBpbXBvcnRhbnQgdG8gdHJ5IHRvIG1ha2Ugc3VyZQorICAgICAgICB0aGF0IGFsbCBwYXJ0cyBvZiB0aGUgc29mdHdhcmUgaXMgZnVuY3Rpb25pbmcgY29ycmVjdGx5LgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEQtQnVzIGNhbiBiZSBidWlsdCB3aXRoIHN1cHBvcnQgZm9yIHRlc3RpbmcgYnkgcGFzc2luZworICAgICAgICA8bGl0ZXJhbD4tLWVuYWJsZS10ZXN0czwvbGl0ZXJhbD4uIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0LiBJdAorICAgICAgICBpcyByZWNvbW1lbmRlZCB0aGF0IHByb2R1Y3Rpb24gc3lzdGVtcyBidWlsZCB3aXRob3V0IHRlc3RpbmcKKyAgICAgICAgc2luY2UgdGhhdCByZWR1Y2VzIHRoZSBELUJ1cyBjbGllbnQgbGlicmFyeSBzaXplLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgIDwvc2VjdDE+CisgIDxzZWN0MSBpZD0iY2xpZW50LWxpYnJhcnkiPgorICAgIDx0aXRsZT5UZXN0aW5nIHRoZSBELUJ1cyBjbGllbnQgbGlicmFyeTwvdGl0bGU+CisgICAgPHBhcmE+CisgICAgICBUaGUgdGVzdHMgZm9yIHRoZSBjbGllbnQgbGlicmFyeSBjb25zaXN0IG9mIHRoZSBkYnVzLXRlc3QKKyAgICAgIHByb2dyYW0gd2hpY2ggaXMgYSB1bml0IHRlc3QgZm9yIGFsbCBhc3BlY3RzIG9mIHRoZSBjbGllbnQKKyAgICAgIGxpYnJhcnkuIFdoZW5ldmVyIGEgYnVnIGluIHRoZSBjbGllbnQgbGlicmFyeSBpcyBmb3VuZCBhbmQKKyAgICAgIGZpeGVkLCBhIHRlc3QgaXMgYWRkZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1ZyB3b24ndCBvY2N1ciBhZ2Fpbi4KKyAgICA8L3BhcmE+CisgICAgPHNlY3QyIGlkPSJkYXRhLXN0cnVjdHVyZXMiPgorICAgICAgPHRpdGxlPkRhdGEgU3RydWN0dXJlczwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgIFRoZSBELUJ1cyBjbGllbnQgbGlicmFyeSBjb25zaXN0cyBvZiBzb21lIGRhdGEgc3RydWN0dXJlcyB0aGF0CisgICAgICBhcmUgdXNlZCBpbnRlcm5hbGx5OyBhIGxpbmtlZCBsaXN0IGNsYXNzLCBhIGhhc2h0YWJsZSBjbGFzcyBhbmQKKyAgICAgIGEgc3RyaW5nIGNsYXNzLiBBbGwgYXNwZWN0cyBvZiB0aG9zZSBhcmUgdGVzdGVkIGJ5IGRidXMtdGVzdC4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0ibWVzc2FnZS1sb2FkZXIiPgorICAgICAgPHRpdGxlPk1lc3NhZ2UgbG9hZGVyPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgbWVzc2FnZSBsb2FkZXIgaXMgdGhlIHBhcnQgb2YgRC1CdXMgdGhhdCB0YWtlcyBtZXNzYWdlcyBpbgorICAgICAgICByYXcgY2hhcmFjdGVyIGZvcm0gYW5kIHBhcnNlcyB0aGVtLCB0dXJuaW5nIHRoZW0gaW50byBEQnVzTWVzc2FnZXMuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhpcyBpcyBvbmUgb2YgdGhlIHBhcnRzIG9mIEQtQnVzIHRoYXQKKyAgICAgICAgPGVtcGhhc2lzPm11c3Q8L2VtcGhhc2lzPiBiZSBhYnNvbHV0ZWx5IGJ1Zy1mcmVlIGFuZAorICAgICAgICByb2J1c3QuIFRoZSBtZXNzYWdlIGxvYWRlciBzaG91bGQgYmUgYWJsZSB0byBoYW5kbGUgaW52YWxpZAorICAgICAgICBhbmQgaW5jb21wbGV0ZSBtZXNzYWdlcyB3aXRob3V0IGNyYXNoaW5nLiBOb3QgZG9pbmcgc28gaXMgYQorICAgICAgICBzZXJpb3VzIGlzc3VlIGFuZCBjYW4gZWFzaWx5IHJlc3VsdCBpbiBELUJ1cyBiZWluZyBleHBsb2l0YWJsZQorICAgICAgICB0byBEb1MgYXR0YWNrcy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUbyBzb2x2ZSB0aGVzZSBwcm9ibGVtcywgdGhlcmUgaXMgYSB0ZXN0aW5nIGZlYXR1cmUgY2FsbGVkIHRoZQorICAgICAgICBNZXNzYWdlIEJ1aWxkZXIuIFRoZSBtZXNzYWdlIGJ1aWxkZXIgY2FuIHRha2UgYSBzZXJpYWxpemVkCisgICAgICAgIG1lc3NhZ2UgaW4gc3RyaW5nLWZvcm0gYW5kIGNvbnZlcnQgaXQgaW50byBhIHJhdyBjaGFyYWN0ZXIKKyAgICAgICAgc3RyaW5nIHdoaWNoIGNhbiB0aGVuIGJlIGxvYWRlZCBieSB0aGUgbWVzc2FnZSBsb2FkZXIuIAorICAgICAgPC9wYXJhPgorICAgICAgPGZpZ3VyZT4KKwk8dGl0bGU+RXhhbXBsZSBvZiBhIG1lc3NhZ2UgaW4gc3RyaW5nIGZvcm08L3RpdGxlPgorCTxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAjIFN0YW5kYXJkIG9yZy5mcmVlZGVza3RvcC5EQnVzLkhlbGxvIG1lc3NhZ2UKKworICAgICAgICAgIFZBTElEX0hFQURFUgorICAgICAgICAgIEZJRUxEX05BTUUgbmFtZQorICAgICAgICAgIFRZUEUgU1RSSU5HCisgICAgICAgICAgU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuREJ1cy5IZWxsbycKKyAgICAgICAgICBGSUVMRF9OQU1FIHNydmMKKyAgICAgICAgICBUWVBFIFNUUklORworICAgICAgICAgIFNUUklORyAnb3JnLmZyZWVkZXNrdG9wLkRCdXMnCisgICAgICAgICAgQUxJR04gOAorICAgICAgICAgIEVORF9MRU5HVEggSGVhZGVyCisgICAgICAgICAgU1RBUlRfTEVOR1RIIEJvZHkKKyAgICAgICAgICBFTkRfTEVOR1RIIEJvZHkKKyAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgIDwvZmlndXJlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBmaWxlIGZvcm1hdCBvZiBtZXNzYWdlcyBpbiBzdHJpbmcgZm9ybSBpcyBkb2N1bWVudGVkIGluCisgICAgICAgIHRoZSBELUJ1cyBSZWZlcmVuY2UgTWFudWFsLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBtZXNzYWdlIHRlc3QgcGFydCBvZiBkYnVzLXRlc3QgaXMgdXNpbmcgdGhlIG1lc3NhZ2UKKyAgICAgICAgYnVpbGRlciB0byBidWlsZCBkaWZmZXJlbnQga2luZHMgb2YgbWVzc2FnZXMsIGJvdGggdmFsaWQsCisgICAgICAgIGludmFsaWQsIGFuZCBpbnZhbGlkIG9uZXMsIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBsb2FkZXIgd29uJ3QKKyAgICAgICAgY3Jhc2ggb3IgbGVhayBtZW1vcnkgb2YgYW55IG9mIHRob3NlLCBhbmQgdGhhdCB0aGUgbG9hZGVyCisgICAgICAgIGtub3dzIGlmIGEgbWVzc2FnZSBpcyB2YWxpZCBvciBub3QuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlcmUgaXMgYWxzbyBhIHRlc3QgcHJvZ3JhbSBjYWxsZWQKKyAgICAgICAgPGxpdGVyYWw+YnJlYWstbG9hZGVyPC9saXRlcmFsPiB0aGF0IGxvYWRzIGEgbWVzc2FnZSBpbgorICAgICAgICBzdHJpbmctZm9ybSBpbnRvIHJhdyBjaGFyYWN0ZXIgZm9ybSB1c2luZyB0aGUgbWVzc2FnZQorICAgICAgICBidWlsZGVyLiBJdCB0aGVuIHJhbmRvbWx5IGNoYW5nZXMgdGhlIG1lc3NhZ2UsIGl0IGNhbiBmb3IKKyAgICAgICAgZXhhbXBsZSByZXBsYWNlIHNpbmdsZSBieXRlcyBvZiBkYXRhIG9yIG1vZGlmeSB0aGUgbGVuZ3RoIG9mCisgICAgICAgIHRoZSBtZXNzYWdlLiBUaGlzIGlzIHRvIHNpbXVsYXRlIG5ldHdvcmsgZXJyb3JzLiBUaGUKKyAgICAgICAgYnJlYWstbG9hZGVyIHByb2dyYW0gc2F2ZXMgYWxsIHRoZSBtZXNzYWdlcyBsZWFkaW5nIHRvIGVycm9ycworICAgICAgICBzbyBpdCBjYW4gZWFzaWx5IGJlIHJ1biBmb3IgYSBsb25nIHBlcmlvZCBvZiB0aW1lLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJhdXRoZW50aWNhdGlvbiI+CisgICAgICA8dGl0bGU+QXV0aGVudGljYXRpb248L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIEZvciB0ZXN0aW5nIGF1dGhlbnRpY2F0aW9uLCB0aGVyZSBpcyBhIHRlc3RpbmcgZmVhdHVyZSB0aGF0CisgICAgICAgIGNhbiByZWFkIGF1dGhlbnRpY2F0aW9uIHNlcXVlbmNlcyBmcm9tIGEgZmlsZSBhbmQgcGxheSB0aGVtCisgICAgICAgIGJhY2sgdG8gYSBkdW1teSBzZXJ2ZXIgYW5kIGNsaWVudCB0byBtYWtlIHN1cmUgdGhhdAorICAgICAgICBhdXRoZW50aWNhdGlvbiBpcyB3b3JraW5nIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbi4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxmaWd1cmU+CisJPHRpdGxlPkV4YW1wbGUgb2YgYW4gYXV0aGVudGljYXRpb24gc2NyaXB0PC90aXRsZT4KKwk8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgIyMgdGhpcyB0ZXN0cyBhIHN1Y2Nlc3NmdWwgYXV0aCBvZiB0eXBlIEVYVEVSTkFMCisgICAgICAgICAgCisgICAgICAgICAgU0VSVkVSCisgICAgICAgICAgU0VORCAnQVVUSCBFWFRFUk5BTCBVU0VSTkFNRV9IRVgnCisgICAgICAgICAgRVhQRUNUX0NPTU1BTkQgT0sKKyAgICAgICAgICBFWFBFQ1RfU1RBVEUgV0FJVElOR19GT1JfSU5QVVQKKyAgICAgICAgICBTRU5EICdCRUdJTicKKyAgICAgICAgICBFWFBFQ1RfU1RBVEUgQVVUSEVOVElDQVRFRAorICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgPC9maWd1cmU+CisgICAgPC9zZWN0Mj4KKyAgPC9zZWN0MT4KKyAgPHNlY3QxIGlkPSJkYWVtb24iPgorICAgIDx0aXRsZT5UZXN0aW5nIHRoZSBELUJ1cyBidXMgZGFlbW9uPC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgIFNpbmNlIHRoZSBELUJ1cyBidXMgZGFlbW9uIGlzIHVzaW5nIHRoZSBELUJ1cyBjbGllbnQgbGlicmFyeSBpdAorICAgICAgd2lsbCBiZW5lZml0IGZyb20gYWxsIHRlc3RzIGRvbmUgb24gdGhlIGNsaWVudCBsaWJyYXJ5LCBidXQKKyAgICAgIHRoZXJlIGlzIHN0aWxsIHRoZSBpc3N1ZSBvZiB0ZXN0aW5nIGNsaWVudC1zZXJ2ZXIgY29tbXVuaWNhdGlvbi4KKyAgICAgIFRoaXMgaXMgbW9yZSBjb21wbGljYXRlZCBzaW5jZSBpdCBpdCBtYXkgcmVxdWlyZSBhbm90aGVyIHByb2Nlc3MKKyAgICAgIHJ1bm5pbmcuCisgICAgPC9wYXJhPgorICAgIDxzZWN0MiBpZD0iZGVidWctdHJhbnNwb3J0Ij4KKyAgICAgIDx0aXRsZT5UaGUgZGVidWcgdHJhbnNwb3J0PC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBJbiBELUJ1cywgYSA8ZW1waGFzaXM+dHJhbnNwb3J0PC9lbXBoYXNpcz4gaXMgYSBjbGFzcyB0aGF0CisgICAgICAgIGhhbmRsZXMgc2VuZGluZyBhbmQgcmVjZWl2aW5nIHJhdyBkYXRhIG92ZXIgYSBjZXJ0YWluCisgICAgICAgIG1lZGl1bS4gVGhlIHRyYW5zcG9ydCB0aGF0IGlzIHVzZWQgbW9zdCBpbiBELUJ1cyBpcyB0aGUgVU5JWAorICAgICAgICB0cmFuc3BvcnQgd2l0aCBzZW5kcyBhbmQgcmVjZXZpZXMgZGF0YSBvdmVyIGEgVU5JWCBzb2NrZXQuIEEKKyAgICAgICAgdHJhbnNwb3J0IHRoYXQgdHVubmVscyBkYXRhIHRocm91Z2ggWDExIGNsaWVudCBtZXNzYWdlcyBpcworICAgICAgICBhbHNvIHVuZGVyIGRldmVsb3BtZW50LgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBELUJ1cyBkZWJ1ZyB0cmFuc3BvcnQgaXMgYSBzcGVjaWFsaXplZCB0cmFuc3BvcnQgdGhhdAorICAgICAgICB3b3JrcyBpbi1wcm9jZXNzLiBUaGlzIG1lYW5zIHRoYXQgYSBjbGllbnQgYW5kIHNlcnZlciB0aGF0CisgICAgICAgIGV4aXN0cyBpbiB0aGUgc2FtZSBwcm9jZXNzIGNhbiB0YWxrIHRvIGVhY2hvdGhlciB3aXRob3V0IHVzaW5nCisgICAgICAgIGEgc29ja2V0LgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJidXMtdGVzdCI+CisgICAgICA8dGl0bGU+VGhlIGJ1cy10ZXN0IHByb2dyYW08L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBidXMtdGVzdCBwcm9ncmFtIGlzIGEgcHJvZ3JhbSB0aGF0IGlzIHVzZWQgdG8gdGVzdCB2YXJpb3VzCisgICAgICAgIHBhcnRzIG9mIHRoZSBELUJ1cyBidXMgZGFlbW9uOyByb2J1c3RuZXNzIGFuZCB0aGF0IGl0IGNvbmZvcm1zCisgICAgICAgIHRvIHRoZSBzcGVjaWZpY2F0aW9ucy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgdGVzdCBwcm9ncmFtIGhhcyB0aGUgbmVjZXNzYXJ5IGNvZGUgZnJvbSB0aGUgYnVzIGRhZW1vbgorICAgICAgICBsaW5rZWQgaW4sIGFuZCBpdCB1c2VzIHRoZSBkZWJ1ZyB0cmFuc3BvcnQgZm9yCisgICAgICAgIGNvbW11bmljYXRpb24uIFRoaXMgbWVhbnMgdGhhdCB0aGUgYnVzIGRhZW1vbiBjb2RlIGNhbiBiZQorICAgICAgICB0ZXN0ZWQgd2l0aG91dCB0aGUgcmVhbCBidXMgYWN0dWFsbHkgcnVubmluZywgd2hpY2ggbWFrZXMKKyAgICAgICAgdGVzdGluZyBlYXNpZXIuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIGJ1cy10ZXN0IHByb2dyYW0gc2hvdWxkIHRlc3QgYWxsIG1ham9yIGZlYXR1cmVzIG9mIHRoZQorICAgICAgICBidXMsIHN1Y2ggYXMgc2VydmljZSByZWdpc3RyYXRpb24sIG5vdGlmaWNhdGlvbiB3aGVuIHRoaW5ncworICAgICAgICBvY2N1cnMgYW5kIG1lc3NhZ2UgbWF0Y2hpbmcuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgPC9zZWN0MT4KKyAgPHNlY3QxIGlkPSJvdGhlci10ZXN0cyI+CisgICAgPHRpdGxlPk90aGVyIHRlc3RzPC90aXRsZT4KKworICAgIDxzZWN0MiBpZD0ib29tLXJvYnVzdG5lc3MiPgorICAgICAgPHRpdGxlPk91dC1PZi1NZW1vcnkgcm9idXN0bmVzczwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgU2luY2UgRC1CdXMgc2hvdWxkIGJlIGFibGUgdG8gYmUgdXNlZCBpbiBlbWJlZGRlZCBkZXZpY2VzLCBhbmQKKyAgICAgICAgYWxzbyBhcyBhIHN5c3RlbSBzZXJ2aWNlLCBpdCBzaG91bGQgYmUgYWJsZSB0byBjb3BlIHdpdGgKKyAgICAgICAgbG93LW1lbW9yeSBzaXR1YXRpb25zIHdpdGhvdXQgZXhpdGluZyBvciBjcmFzaGluZy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBJbiBwcmFjdGljZSwgdGhpcyBtZWFucyB0aGF0IGJvdGggdGhlIGNsaWVudCBhbmQgc2VydmVyIGNvZGUKKyAgICAgICAgbXVzdCBiZSBhYmxlIHRvIGhhbmRsZSBkYnVzX21hbGxvYyByZXR1cm5pbmcgTlVMTC4gCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVG8gdGVzdCB0aGlzLCB0d28gZW52aXJvbm1lbnQgdmFyaWFibGVzCisgICAgICAgIGV4aXN0LiA8bGl0ZXJhbD5EQlVTX01BTExPQ19GQUlMX05USDwvbGl0ZXJhbD4gd2lsbCBtYWtlIGV2ZXJ5CisgICAgICAgIG50aCBjYWxsIHRvIGRidXNfbWFsbG9jIHJldHVybiBOVUxMLCBhbmQKKyAgICAgICAgPGxpdGVyYWw+REJVU19NQUxMT0NfRkFJTF9HUkVBVEVSX1RIQU48L2xpdGVyYWw+IHdpbGwgbWFrZSBhbnkKKyAgICAgICAgZGJ1c19tYWxsb2MgY2FsbCB3aXRoIGEgcmVxdWVzdCBmb3IgbW9yZSB0aGFuIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIGZhaWwuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0MiBpZD0ibGVha3MtYW5kLW90aGVyLXN0dWZmIj4KKyAgICAgIDx0aXRsZT5NZW1vcnkgbGVha3MgYW5kIGNvZGUgcm9idXN0bmVzczwvdGl0bGU+IAorICAgICAgPHBhcmE+CisgICAgICAgIE5hdHVyYWxseSB0aGVyZSBhcmUgc29tZSB0aGluZ3MgdGhhdCB0ZXN0cyBjYW4ndCBiZSB3cml0dGVuCisgICAgICAgIGZvciwgZm9yIGV4YW1wbGUgdGhpbmdzIGxpa2UgbWVtb3J5IGxlYWtzIGFuZCBvdXQtb2YtYm91bmRzCisgICAgICAgIG1lbW9yeSByZWFkaW5nIG9yIHdyaXRpbmcuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgTHVja2lseSB0aGVyZSBleGlzdHMgZ29vZCB0b29scyBmb3IgY2F0Y2hpbmcgc3VjaCBlcnJvcnMuIE9uZQorICAgICAgICBmcmVlIGdvb2QgdG9vbCBpcyA8dWxpbmsgdXJsPSJodHRwOi8vZGV2ZWwtaG9tZS5rZGUub3JnL35zZXdhcmRqLyI+VmFsZ3JpbmQ8L3VsaW5rPiwgd2hpY2ggcnVucyB0aGUgcHJvZ3JhbSBpbiBhCisgICAgICAgIHZpcnR1YWwgQ1BVIHdoaWNoIG1ha2VzIGNhdGNoaW5nIGVycm9ycyBlYXN5LiBBbGwgdGVzdCBwcm9ncmFtcyBjYW4gYmUgcnVuIHVuZGVyIFZhbGdyaW5kLCAKKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICA8L3NlY3QxPgorPC9hcnRpY2xlPgpkaWZmIC0tZ2l0IGEvZGJ1cy9kb2MvZGJ1cy10dXRvcmlhbC54bWwgYi9kYnVzL2RvYy9kYnVzLXR1dG9yaWFsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzM4NWYwCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kb2MvZGJ1cy10dXRvcmlhbC54bWwKQEAgLTAsMCArMSwxNjY3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+Cis8IURPQ1RZUEUgYXJ0aWNsZSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMS4yLy9FTiIKKyJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuMS4yL2RvY2Jvb2t4LmR0ZCIKK1sKK10+CisKKzxhcnRpY2xlIGlkPSJpbmRleCI+CisgIDxhcnRpY2xlaW5mbz4KKyAgICA8dGl0bGU+RC1CdXMgVHV0b3JpYWw8L3RpdGxlPgorICAgIDxyZWxlYXNlaW5mbz5WZXJzaW9uIDAuNS4wPC9yZWxlYXNlaW5mbz4KKyAgICA8ZGF0ZT4yMCBBdWd1c3QgMjAwNjwvZGF0ZT4KKyAgICA8YXV0aG9yZ3JvdXA+CisgICAgICA8YXV0aG9yPgorCTxmaXJzdG5hbWU+SGF2b2M8L2ZpcnN0bmFtZT4KKwk8c3VybmFtZT5QZW5uaW5ndG9uPC9zdXJuYW1lPgorCTxhZmZpbGlhdGlvbj4KKwkgIDxvcmduYW1lPlJlZCBIYXQsIEluYy48L29yZ25hbWU+CisJICA8YWRkcmVzcz48ZW1haWw+aHBAcG9ib3guY29tPC9lbWFpbD48L2FkZHJlc3M+CisJPC9hZmZpbGlhdGlvbj4KKyAgICAgIDwvYXV0aG9yPgorICAgICAgPGF1dGhvcj4KKwk8Zmlyc3RuYW1lPkRhdmlkPC9maXJzdG5hbWU+CisJPHN1cm5hbWU+V2hlZWxlcjwvc3VybmFtZT4KKyAgICAgIDwvYXV0aG9yPgorICAgICAgPGF1dGhvcj4KKwk8Zmlyc3RuYW1lPkpvaG48L2ZpcnN0bmFtZT4KKwk8c3VybmFtZT5QYWxtaWVyaTwvc3VybmFtZT4KKwk8YWZmaWxpYXRpb24+CisJICA8b3JnbmFtZT5SZWQgSGF0LCBJbmMuPC9vcmduYW1lPgorCSAgPGFkZHJlc3M+PGVtYWlsPmpvaG5wQHJlZGhhdC5jb208L2VtYWlsPjwvYWRkcmVzcz4KKwk8L2FmZmlsaWF0aW9uPgorICAgICAgPC9hdXRob3I+CisgICAgICA8YXV0aG9yPgorCTxmaXJzdG5hbWU+Q29saW48L2ZpcnN0bmFtZT4KKwk8c3VybmFtZT5XYWx0ZXJzPC9zdXJuYW1lPgorCTxhZmZpbGlhdGlvbj4KKwkgIDxvcmduYW1lPlJlZCBIYXQsIEluYy48L29yZ25hbWU+CisJICA8YWRkcmVzcz48ZW1haWw+d2FsdGVyc0ByZWRoYXQuY29tPC9lbWFpbD48L2FkZHJlc3M+CisJPC9hZmZpbGlhdGlvbj4KKyAgICAgIDwvYXV0aG9yPgorICAgIDwvYXV0aG9yZ3JvdXA+CisgIDwvYXJ0aWNsZWluZm8+CisKKyAgPHNlY3QxIGlkPSJtZXRhIj4KKyAgICA8dGl0bGU+VHV0b3JpYWwgV29yayBJbiBQcm9ncmVzczwvdGl0bGU+CisgICAgCisgICAgPHBhcmE+CisgICAgICBUaGlzIHR1dG9yaWFsIGlzIG5vdCBjb21wbGV0ZTsgaXQgcHJvYmFibHkgY29udGFpbnMgc29tZSB1c2VmdWwgaW5mb3JtYXRpb24sIGJ1dCAKKyAgICAgIGFsc28gaGFzIHBsZW50eSBvZiBnYXBzLiBSaWdodCBub3csIHlvdSdsbCBhbHNvIG5lZWQgdG8gcmVmZXIgdG8gdGhlIEQtQnVzIHNwZWNpZmljYXRpb24sCisgICAgICBEb3h5Z2VuIHJlZmVyZW5jZSBkb2N1bWVudGF0aW9uLCBhbmQgbG9vayBhdCBzb21lIGV4YW1wbGVzIG9mIGhvdyBvdGhlciBhcHBzIHVzZSBELUJ1cy4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgIEVuaGFuY2luZyB0aGUgdHV0b3JpYWwgaXMgZGVmaW5pdGVseSBlbmNvdXJhZ2VkIC0gc2VuZCB5b3VyIHBhdGNoZXMgb3Igc3VnZ2VzdGlvbnMgdG8gdGhlCisgICAgICBtYWlsaW5nIGxpc3QuIElmIHlvdSBjcmVhdGUgYSBELUJ1cyBiaW5kaW5nLCBwbGVhc2UgYWRkIGEgc2VjdGlvbiB0byB0aGUgdHV0b3JpYWwgZm9yIHlvdXIgCisgICAgICBiaW5kaW5nLCBpZiBvbmx5IGEgc2hvcnQgc2VjdGlvbiB3aXRoIGEgY291cGxlIG9mIGV4YW1wbGVzLgorICAgIDwvcGFyYT4KKworICA8L3NlY3QxPgorCisgIDxzZWN0MSBpZD0id2hhdGlzIj4KKyAgICA8dGl0bGU+V2hhdCBpcyBELUJ1cz88L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgRC1CdXMgaXMgYSBzeXN0ZW0gZm9yIDxmaXJzdHRlcm0+aW50ZXJwcm9jZXNzIGNvbW11bmljYXRpb248L2ZpcnN0dGVybT4KKyAgICAgIChJUEMpLiBBcmNoaXRlY3R1cmFsbHksIGl0IGhhcyBzZXZlcmFsIGxheWVyczoKKworICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQSBsaWJyYXJ5LCA8Zmlyc3R0ZXJtPmxpYmRidXM8L2ZpcnN0dGVybT4sIHRoYXQgYWxsb3dzIHR3bworICAgICAgICAgICAgYXBwbGljYXRpb25zIHRvIGNvbm5lY3QgdG8gZWFjaCBvdGhlciBhbmQgZXhjaGFuZ2UgbWVzc2FnZXMuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBBIDxmaXJzdHRlcm0+bWVzc2FnZSBidXMgZGFlbW9uPC9maXJzdHRlcm0+IGV4ZWN1dGFibGUsIGJ1aWx0IG9uCisgICAgICAgICAgICBsaWJkYnVzLCB0aGF0IG11bHRpcGxlIGFwcGxpY2F0aW9ucyBjYW4gY29ubmVjdCB0by4gVGhlIGRhZW1vbiBjYW4KKyAgICAgICAgICAgIHJvdXRlIG1lc3NhZ2VzIGZyb20gb25lIGFwcGxpY2F0aW9uIHRvIHplcm8gb3IgbW9yZSBvdGhlcgorICAgICAgICAgICAgYXBwbGljYXRpb25zLgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGZpcnN0dGVybT5XcmFwcGVyIGxpYnJhcmllczwvZmlyc3R0ZXJtPiBvciA8Zmlyc3R0ZXJtPmJpbmRpbmdzPC9maXJzdHRlcm0+IAorICAgICAgICAgICAgYmFzZWQgb24gcGFydGljdWxhciBhcHBsaWNhdGlvbiBmcmFtZXdvcmtzLiAgRm9yIGV4YW1wbGUsIGxpYmRidXMtZ2xpYiBhbmQKKyAgICAgICAgICAgIGxpYmRidXMtcXQuIFRoZXJlIGFyZSBhbHNvIGJpbmRpbmdzIHRvIGxhbmd1YWdlcyBzdWNoIGFzCisgICAgICAgICAgICBQeXRob24uIFRoZXNlIHdyYXBwZXIgbGlicmFyaWVzIGFyZSB0aGUgQVBJIG1vc3QgcGVvcGxlIHNob3VsZCB1c2UsCisgICAgICAgICAgICBhcyB0aGV5IHNpbXBsaWZ5IHRoZSBkZXRhaWxzIG9mIEQtQnVzIHByb2dyYW1taW5nLiBsaWJkYnVzIGlzIAorICAgICAgICAgICAgaW50ZW5kZWQgdG8gYmUgYSBsb3ctbGV2ZWwgYmFja2VuZCBmb3IgdGhlIGhpZ2hlciBsZXZlbCBiaW5kaW5ncy4KKyAgICAgICAgICAgIE11Y2ggb2YgdGhlIGxpYmRidXMgQVBJIGlzIG9ubHkgdXNlZnVsIGZvciBiaW5kaW5nIGltcGxlbWVudGF0aW9uLgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICAgbGliZGJ1cyBvbmx5IHN1cHBvcnRzIG9uZS10by1vbmUgY29ubmVjdGlvbnMsIGp1c3QgbGlrZSBhIHJhdyBuZXR3b3JrCisgICAgICBzb2NrZXQuIEhvd2V2ZXIsIHJhdGhlciB0aGFuIHNlbmRpbmcgYnl0ZSBzdHJlYW1zIG92ZXIgdGhlIGNvbm5lY3Rpb24sIHlvdQorICAgICAgc2VuZCA8Zmlyc3R0ZXJtPm1lc3NhZ2VzPC9maXJzdHRlcm0+LiBNZXNzYWdlcyBoYXZlIGEgaGVhZGVyIGlkZW50aWZ5aW5nCisgICAgICB0aGUga2luZCBvZiBtZXNzYWdlLCBhbmQgYSBib2R5IGNvbnRhaW5pbmcgYSBkYXRhIHBheWxvYWQuIGxpYmRidXMgYWxzbworICAgICAgYWJzdHJhY3RzIHRoZSBleGFjdCB0cmFuc3BvcnQgdXNlZCAoc29ja2V0cyB2cy4gd2hhdGV2ZXIgZWxzZSksIGFuZAorICAgICAgaGFuZGxlcyBkZXRhaWxzIHN1Y2ggYXMgYXV0aGVudGljYXRpb24uCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBUaGUgbWVzc2FnZSBidXMgZGFlbW9uIGZvcm1zIHRoZSBodWIgb2YgYSB3aGVlbC4gRWFjaCBzcG9rZSBvZiB0aGUgd2hlZWwKKyAgICAgIGlzIGEgb25lLXRvLW9uZSBjb25uZWN0aW9uIHRvIGFuIGFwcGxpY2F0aW9uIHVzaW5nIGxpYmRidXMuICBBbgorICAgICAgYXBwbGljYXRpb24gc2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBidXMgZGFlbW9uIG92ZXIgaXRzIHNwb2tlLCBhbmQgdGhlIGJ1cworICAgICAgZGFlbW9uIGZvcndhcmRzIHRoZSBtZXNzYWdlIHRvIG90aGVyIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnMgYXMKKyAgICAgIGFwcHJvcHJpYXRlLiBUaGluayBvZiB0aGUgZGFlbW9uIGFzIGEgcm91dGVyLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICAgVGhlIGJ1cyBkYWVtb24gaGFzIG11bHRpcGxlIGluc3RhbmNlcyBvbiBhIHR5cGljYWwgY29tcHV0ZXIuICBUaGUKKyAgICAgIGZpcnN0IGluc3RhbmNlIGlzIGEgbWFjaGluZS1nbG9iYWwgc2luZ2xldG9uLCB0aGF0IGlzLCBhIHN5c3RlbSBkYWVtb24KKyAgICAgIHNpbWlsYXIgdG8gc2VuZG1haWwgb3IgQXBhY2hlLiBUaGlzIGluc3RhbmNlIGhhcyBoZWF2eSBzZWN1cml0eQorICAgICAgcmVzdHJpY3Rpb25zIG9uIHdoYXQgbWVzc2FnZXMgaXQgd2lsbCBhY2NlcHQsIGFuZCBpcyB1c2VkIGZvciBzeXN0ZW13aWRlCisgICAgICBjb21tdW5pY2F0aW9uLiBUaGUgb3RoZXIgaW5zdGFuY2VzIGFyZSBjcmVhdGVkIG9uZSBwZXIgdXNlciBsb2dpbiBzZXNzaW9uLgorICAgICAgVGhlc2UgaW5zdGFuY2VzIGFsbG93IGFwcGxpY2F0aW9ucyBpbiB0aGUgdXNlcidzIHNlc3Npb24gdG8gY29tbXVuaWNhdGUgCisgICAgICB3aXRoIG9uZSBhbm90aGVyLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICAgVGhlIHN5c3RlbXdpZGUgYW5kIHBlci11c2VyIGRhZW1vbnMgYXJlIHNlcGFyYXRlLiAgTm9ybWFsIHdpdGhpbi1zZXNzaW9uCisgICAgICBJUEMgZG9lcyBub3QgaW52b2x2ZSB0aGUgc3lzdGVtd2lkZSBtZXNzYWdlIGJ1cyBwcm9jZXNzIGFuZCB2aWNlIHZlcnNhLgorICAgIDwvcGFyYT4KKworICAgIDxzZWN0MiBpZD0idXNlcyI+CisgICAgICA8dGl0bGU+RC1CdXMgYXBwbGljYXRpb25zPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGVyZSBhcmUgbWFueSwgbWFueSB0ZWNobm9sb2dpZXMgaW4gdGhlIHdvcmxkIHRoYXQgaGF2ZSAiSW50ZXItcHJvY2VzcworICAgICAgICBjb21tdW5pY2F0aW9uIiBvciAibmV0d29ya2luZyIgaW4gdGhlaXIgc3RhdGVkIHB1cnBvc2U6IDx1bGluaworICAgICAgICB1cmw9Imh0dHA6Ly93d3cub21nLm9yZyI+Q09SQkE8L3VsaW5rPiwgPHVsaW5rCisgICAgICAgIHVybD0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL2RjZS8iPkRDRTwvdWxpbms+LCA8dWxpbmsKKyAgICAgICAgdXJsPSJodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vY29tLyI+RENPTTwvdWxpbms+LCA8dWxpbmsKKyAgICAgICAgdXJsPSJodHRwOi8vZGV2ZWxvcGVyLmtkZS5vcmcvZG9jdW1lbnRhdGlvbi9saWJyYXJ5L2tkZXF0L2Rjb3AuaHRtbCI+RENPUDwvdWxpbms+LCA8dWxpbmsKKyAgICAgICAgdXJsPSJodHRwOi8vd3d3LnhtbHJwYy5jb20iPlhNTC1SUEM8L3VsaW5rPiwgPHVsaW5rCisgICAgICAgIHVybD0iaHR0cDovL3d3dy53My5vcmcvVFIvU09BUC8iPlNPQVA8L3VsaW5rPiwgPHVsaW5rCisgICAgICAgIHVybD0iaHR0cDovL3d3dy5tYnVzLm9yZy8iPk1CVVM8L3VsaW5rPiwgPHVsaW5rCisgICAgICAgIHVybD0iaHR0cDovL3d3dy56ZXJvYy5jb20vaWNlLmh0bWwiPkludGVybmV0IENvbW11bmljYXRpb25zIEVuZ2luZSAoSUNFKTwvdWxpbms+LAorICAgICAgICBhbmQgcHJvYmFibHkgaHVuZHJlZHMgbW9yZS4KKyAgICAgICAgRWFjaCBvZiB0aGVzZSBpcyB0YWlsb3JlZCBmb3IgcGFydGljdWxhciBraW5kcyBvZiBhcHBsaWNhdGlvbi4KKyAgICAgICAgRC1CdXMgaXMgZGVzaWduZWQgZm9yIHR3byBzcGVjaWZpYyBjYXNlczoKKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgQ29tbXVuaWNhdGlvbiBiZXR3ZWVuIGRlc2t0b3AgYXBwbGljYXRpb25zIGluIHRoZSBzYW1lIGRlc2t0b3AKKyAgICAgICAgICAgICAgc2Vzc2lvbjsgdG8gYWxsb3cgaW50ZWdyYXRpb24gb2YgdGhlIGRlc2t0b3Agc2Vzc2lvbiBhcyBhIHdob2xlLAorICAgICAgICAgICAgICBhbmQgYWRkcmVzcyBpc3N1ZXMgb2YgcHJvY2VzcyBsaWZlY3ljbGUgKHdoZW4gZG8gZGVza3RvcCBjb21wb25lbnRzIAorICAgICAgICAgICAgICBzdGFydCBhbmQgc3RvcCBydW5uaW5nKS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBDb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIGRlc2t0b3Agc2Vzc2lvbiBhbmQgdGhlIG9wZXJhdGluZyBzeXN0ZW0sIAorICAgICAgICAgICAgICB3aGVyZSB0aGUgb3BlcmF0aW5nIHN5c3RlbSB3b3VsZCB0eXBpY2FsbHkgaW5jbHVkZSB0aGUga2VybmVsIAorICAgICAgICAgICAgICBhbmQgYW55IHN5c3RlbSBkYWVtb25zIG9yIHByb2Nlc3Nlcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBGb3IgdGhlIHdpdGhpbi1kZXNrdG9wLXNlc3Npb24gdXNlIGNhc2UsIHRoZSBHTk9NRSBhbmQgS0RFIGRlc2t0b3BzIAorICAgICAgICBoYXZlIHNpZ25pZmljYW50IHByZXZpb3VzIGV4cGVyaWVuY2Ugd2l0aCBkaWZmZXJlbnQgSVBDIHNvbHV0aW9ucworICAgICAgICBzdWNoIGFzIENPUkJBIGFuZCBEQ09QLiBELUJ1cyBpcyBidWlsdCBvbiB0aGF0IGV4cGVyaWVuY2UgYW5kIAorICAgICAgICBjYXJlZnVsbHkgdGFpbG9yZWQgdG8gbWVldCB0aGUgbmVlZHMgb2YgdGhlc2UgZGVza3RvcCBwcm9qZWN0cyAKKyAgICAgICAgaW4gcGFydGljdWxhci4gRC1CdXMgbWF5IG9yIG1heSBub3QgYmUgYXBwcm9wcmlhdGUgZm9yIG90aGVyIAorICAgICAgICBhcHBsaWNhdGlvbnM7IHRoZSBGQVEgaGFzIHNvbWUgY29tcGFyaXNvbnMgdG8gb3RoZXIgSVBDIHN5c3RlbXMuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIHByb2JsZW0gc29sdmVkIGJ5IHRoZSBzeXN0ZW13aWRlIG9yIGNvbW11bmljYXRpb24td2l0aC10aGUtT1MgY2FzZSAKKyAgICAgICAgaXMgZXhwbGFpbmVkIHdlbGwgYnkgdGhlIGZvbGxvd2luZyB0ZXh0IGZyb20gdGhlIExpbnV4IEhvdHBsdWcgcHJvamVjdDoKKyAgICAgICAgPGJsb2NrcXVvdGU+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgIEEgZ2FwIGluIGN1cnJlbnQgTGludXggc3VwcG9ydCBpcyB0aGF0IHBvbGljaWVzIHdpdGggYW55IHNvcnQgb2YKKyAgICAgICAgICAgZHluYW1pYyAiaW50ZXJhY3Qgd2l0aCB1c2VyIiBjb21wb25lbnQgYXJlbid0IGN1cnJlbnRseQorICAgICAgICAgICBzdXBwb3J0ZWQuIEZvciBleGFtcGxlLCB0aGF0J3Mgb2Z0ZW4gbmVlZGVkIHRoZSBmaXJzdCB0aW1lIGEgbmV0d29yaworICAgICAgICAgICBhZGFwdGVyIG9yIHByaW50ZXIgaXMgY29ubmVjdGVkLCBhbmQgdG8gZGV0ZXJtaW5lIGFwcHJvcHJpYXRlIHBsYWNlcworICAgICAgICAgICB0byBtb3VudCBkaXNrIGRyaXZlcy4gSXQgd291bGQgc2VlbSB0aGF0IHN1Y2ggYWN0aW9ucyBjb3VsZCBiZQorICAgICAgICAgICBzdXBwb3J0ZWQgZm9yIGFueSBjYXNlIHdoZXJlIGEgcmVzcG9uc2libGUgaHVtYW4gY2FuIGJlIGlkZW50aWZpZWQ6CisgICAgICAgICAgIHNpbmdsZSB1c2VyIHdvcmtzdGF0aW9ucywgb3IgYW55IHN5c3RlbSB3aGljaCBpcyByZW1vdGVseQorICAgICAgICAgICBhZG1pbmlzdGVyZWQuCisgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGlzIGlzIGEgY2xhc3NpYyAicmVtb3RlIHN5c2FkbWluIiBwcm9ibGVtLCB3aGVyZSBpbiB0aGlzIGNhc2UKKyAgICAgICAgICAgIGhvdHBsdWdnaW5nIG5lZWRzIHRvIGRlbGl2ZXIgYW4gZXZlbnQgZnJvbSBvbmUgc2VjdXJpdHkgZG9tYWluCisgICAgICAgICAgICAob3BlcmF0aW5nIHN5c3RlbSBrZXJuZWwsIGluIHRoaXMgY2FzZSkgdG8gYW5vdGhlciAoZGVza3RvcCBmb3IKKyAgICAgICAgICAgIGxvZ2dlZC1pbiB1c2VyLCBvciByZW1vdGUgc3lzYWRtaW4pLiBBbnkgZWZmZWN0aXZlIHJlc3BvbnNlIG11c3QgZ28KKyAgICAgICAgICAgIHRoZSBvdGhlciB3YXk6IHRoZSByZW1vdGUgZG9tYWluIHRha2luZyBzb21lIGFjdGlvbiB0aGF0IGxldHMgdGhlCisgICAgICAgICAgICBrZXJuZWwgZXhwb3NlIHRoZSBkZXNpcmVkIGRldmljZSBjYXBhYmlsaXRpZXMuIChUaGUgYWN0aW9uIGNhbiBvZnRlbgorICAgICAgICAgICAgYmUgdGFrZW4gYXN5bmNocm9ub3VzbHksIGZvciBleGFtcGxlIGxldHRpbmcgbmV3IGhhcmR3YXJlIGJlIGlkbGUKKyAgICAgICAgICAgIHVudGlsIGEgbWVldGluZyBmaW5pc2hlcy4pIEF0IHRoaXMgd3JpdGluZywgTGludXggZG9lc24ndCBoYXZlCisgICAgICAgICAgICB3aWRlbHkgYWRvcHRlZCBzb2x1dGlvbnMgdG8gc3VjaCBwcm9ibGVtcy4gSG93ZXZlciwgdGhlIG5ldyBELUJ1cworICAgICAgICAgICAgd29yayBtYXkgYmVnaW4gdG8gc29sdmUgdGhhdCBwcm9ibGVtLgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9ibG9ja3F1b3RlPgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEQtQnVzIG1heSBoYXBwZW4gdG8gYmUgdXNlZnVsIGZvciBwdXJwb3NlcyBvdGhlciB0aGFuIHRoZSBvbmUgaXQgd2FzCisgICAgICAgIGRlc2lnbmVkIGZvci4gSXRzIGdlbmVyYWwgcHJvcGVydGllcyB0aGF0IGRpc3Rpbmd1aXNoIGl0IGZyb20gCisgICAgICAgIG90aGVyIGZvcm1zIG9mIElQQyBhcmU6CisgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIEJpbmFyeSBwcm90b2NvbCBkZXNpZ25lZCB0byBiZSB1c2VkIGFzeW5jaHJvbm91c2x5IAorICAgICAgICAgICAgICAoc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIFggV2luZG93IFN5c3RlbSBwcm90b2NvbCkuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgU3RhdGVmdWwsIHJlbGlhYmxlIGNvbm5lY3Rpb25zIGhlbGQgb3BlbiBvdmVyIHRpbWUuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgVGhlIG1lc3NhZ2UgYnVzIGlzIGEgZGFlbW9uLCBub3QgYSAic3dhcm0iIG9yIAorICAgICAgICAgICAgICBkaXN0cmlidXRlZCBhcmNoaXRlY3R1cmUuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgTWFueSBpbXBsZW1lbnRhdGlvbiBhbmQgZGVwbG95bWVudCBpc3N1ZXMgYXJlIHNwZWNpZmllZCByYXRoZXIKKyAgICAgICAgICAgICAgdGhhbiBsZWZ0IGFtYmlndW91cy9jb25maWd1cmFibGUvcGx1Z2dhYmxlLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIFNlbWFudGljcyBhcmUgc2ltaWxhciB0byB0aGUgZXhpc3RpbmcgRENPUCBzeXN0ZW0sIGFsbG93aW5nIAorICAgICAgICAgICAgICBLREUgdG8gYWRvcHQgaXQgbW9yZSBlYXNpbHkuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgU2VjdXJpdHkgZmVhdHVyZXMgdG8gc3VwcG9ydCB0aGUgc3lzdGVtd2lkZSBtb2RlIG9mIHRoZSAKKyAgICAgICAgICAgICAgbWVzc2FnZSBidXMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgPC9zZWN0MT4KKyAgPHNlY3QxIGlkPSJjb25jZXB0cyI+CisgICAgPHRpdGxlPkNvbmNlcHRzPC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgIFNvbWUgYmFzaWMgY29uY2VwdHMgYXBwbHkgbm8gbWF0dGVyIHdoYXQgYXBwbGljYXRpb24gZnJhbWV3b3JrIHlvdSdyZQorICAgICAgdXNpbmcgdG8gd3JpdGUgYSBELUJ1cyBhcHBsaWNhdGlvbi4gVGhlIGV4YWN0IGNvZGUgeW91IHdyaXRlIHdpbGwgYmUKKyAgICAgIGRpZmZlcmVudCBmb3IgR0xpYiB2cy4gUXQgdnMuIFB5dGhvbiBhcHBsaWNhdGlvbnMsIGhvd2V2ZXIuCisgICAgPC9wYXJhPgorICAgIAorICAgIDxwYXJhPgorICAgICAgSGVyZSBpcyBhIGRpYWdyYW0gKDx1bGluayB1cmw9ImRpYWdyYW0ucG5nIj5wbmc8L3VsaW5rPiA8dWxpbmsKKyAgICAgIHVybD0iZGlhZ3JhbS5zdmciPnN2ZzwvdWxpbms+KSB0aGF0IG1heSBoZWxwIHlvdSB2aXN1YWxpemUgdGhlIGNvbmNlcHRzCisgICAgICB0aGF0IGZvbGxvdy4KKyAgICA8L3BhcmE+CisKKyAgICA8c2VjdDIgaWQ9Im9iamVjdHMiPgorICAgICAgPHRpdGxlPk5hdGl2ZSBPYmplY3RzIGFuZCBPYmplY3QgUGF0aHM8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFlvdXIgcHJvZ3JhbW1pbmcgZnJhbWV3b3JrIHByb2JhYmx5IGRlZmluZXMgd2hhdCBhbiAib2JqZWN0IiBpcyBsaWtlOworICAgICAgICB1c3VhbGx5IHdpdGggYSBiYXNlIGNsYXNzLiBGb3IgZXhhbXBsZTogamF2YS5sYW5nLk9iamVjdCwgR09iamVjdCwgUU9iamVjdCwKKyAgICAgICAgcHl0aG9uJ3MgYmFzZSBPYmplY3QsIG9yIHdoYXRldmVyLiBMZXQncyBjYWxsIHRoaXMgYSA8Zmlyc3R0ZXJtPm5hdGl2ZSBvYmplY3Q8L2ZpcnN0dGVybT4uCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIGxvdy1sZXZlbCBELUJ1cyBwcm90b2NvbCwgYW5kIGNvcnJlc3BvbmRpbmcgbGliZGJ1cyBBUEksIGRvZXMgbm90IGNhcmUgYWJvdXQgbmF0aXZlIG9iamVjdHMuIAorICAgICAgICBIb3dldmVyLCBpdCBwcm92aWRlcyBhIGNvbmNlcHQgY2FsbGVkIGFuIAorICAgICAgICA8Zmlyc3R0ZXJtPm9iamVjdCBwYXRoPC9maXJzdHRlcm0+LiBUaGUgaWRlYSBvZiBhbiBvYmplY3QgcGF0aCBpcyB0aGF0IAorICAgICAgICBoaWdoZXItbGV2ZWwgYmluZGluZ3MgY2FuIG5hbWUgbmF0aXZlIG9iamVjdCBpbnN0YW5jZXMsIGFuZCBhbGxvdyByZW1vdGUgYXBwbGljYXRpb25zIAorICAgICAgICB0byByZWZlciB0byB0aGVtLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBvYmplY3QgcGF0aAorICAgICAgICBsb29rcyBsaWtlIGEgZmlsZXN5c3RlbSBwYXRoLCBmb3IgZXhhbXBsZSBhbiBvYmplY3QgY291bGQgYmUgCisgICAgICAgIG5hbWVkIDxsaXRlcmFsPi9vcmcva2RlL2tzcHJlYWQvc2hlZXRzLzMvY2VsbHMvNC81PC9saXRlcmFsPi4gCisgICAgICAgIEh1bWFuLXJlYWRhYmxlIHBhdGhzIGFyZSBuaWNlLCBidXQgeW91IGFyZSBmcmVlIHRvIGNyZWF0ZSBhbiAKKyAgICAgICAgb2JqZWN0IG5hbWVkIDxsaXRlcmFsPi9jb20vbXljb21wYW55L2M1eW84MTd5MGMxeTFjNWI8L2xpdGVyYWw+IAorICAgICAgICBpZiBpdCBtYWtlcyBzZW5zZSBmb3IgeW91ciBhcHBsaWNhdGlvbi4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBOYW1lc3BhY2luZyBvYmplY3QgcGF0aHMgaXMgc21hcnQsIGJ5IHN0YXJ0aW5nIHRoZW0gd2l0aCB0aGUgY29tcG9uZW50cworICAgICAgICBvZiBhIGRvbWFpbiBuYW1lIHlvdSBvd24gKGUuZy4gPGxpdGVyYWw+L29yZy9rZGU8L2xpdGVyYWw+KS4gVGhpcyAKKyAgICAgICAga2VlcHMgZGlmZmVyZW50IGNvZGUgbW9kdWxlcyBpbiB0aGUgc2FtZSBwcm9jZXNzIGZyb20gc3RlcHBpbmcgCisgICAgICAgIG9uIG9uZSBhbm90aGVyJ3MgdG9lcy4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPiAgICAKKworICAgIDxzZWN0MiBpZD0ibWVtYmVycyI+CisgICAgICA8dGl0bGU+TWV0aG9kcyBhbmQgU2lnbmFsczwvdGl0bGU+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBFYWNoIG9iamVjdCBoYXMgPGZpcnN0dGVybT5tZW1iZXJzPC9maXJzdHRlcm0+OyB0aGUgdHdvIGtpbmRzIG9mIG1lbWJlcgorICAgICAgICBhcmUgPGZpcnN0dGVybT5tZXRob2RzPC9maXJzdHRlcm0+IGFuZAorICAgICAgICA8Zmlyc3R0ZXJtPnNpZ25hbHM8L2ZpcnN0dGVybT4uIE1ldGhvZHMgYXJlIG9wZXJhdGlvbnMgdGhhdCBjYW4gYmUKKyAgICAgICAgaW52b2tlZCBvbiBhbiBvYmplY3QsIHdpdGggb3B0aW9uYWwgaW5wdXQgKGFrYSBhcmd1bWVudHMgb3IgImluCisgICAgICAgIHBhcmFtZXRlcnMiKSBhbmQgb3V0cHV0IChha2EgcmV0dXJuIHZhbHVlcyBvciAib3V0IHBhcmFtZXRlcnMiKS4KKyAgICAgICAgU2lnbmFscyBhcmUgYnJvYWRjYXN0cyBmcm9tIHRoZSBvYmplY3QgdG8gYW55IGludGVyZXN0ZWQgb2JzZXJ2ZXJzIAorICAgICAgICBvZiB0aGUgb2JqZWN0OyBzaWduYWxzIG1heSBjb250YWluIGEgZGF0YSBwYXlsb2FkLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgQm90aCBtZXRob2RzIGFuZCBzaWduYWxzIGFyZSByZWZlcnJlZCB0byBieSBuYW1lLCBzdWNoIGFzIAorICAgICAgICAiRnJvYmF0ZSIgb3IgIk9uQ2xpY2tlZCIuCisgICAgICA8L3BhcmE+CisKKyAgICA8L3NlY3QyPgorCisgICAgPHNlY3QyIGlkPSJpbnRlcmZhY2VzIj4KKyAgICAgIDx0aXRsZT5JbnRlcmZhY2VzPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBFYWNoIG9iamVjdCBzdXBwb3J0cyBvbmUgb3IgbW9yZSA8Zmlyc3R0ZXJtPmludGVyZmFjZXM8L2ZpcnN0dGVybT4uCisgICAgICAgIFRoaW5rIG9mIGFuIGludGVyZmFjZSBhcyBhIG5hbWVkIGdyb3VwIG9mIG1ldGhvZHMgYW5kIHNpZ25hbHMsIAorICAgICAgICBqdXN0IGFzIGl0IGlzIGluIEdMaWIgb3IgUXQgb3IgSmF2YS4gSW50ZXJmYWNlcyBkZWZpbmUgdGhlIAorICAgICAgICA8ZW1waGFzaXM+dHlwZTwvZW1waGFzaXM+IG9mIGFuIG9iamVjdCBpbnN0YW5jZS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBEQnVzIGlkZW50aWZpZXMgaW50ZXJmYWNlcyB3aXRoIGEgc2ltcGxlIG5hbWVzcGFjZWQgc3RyaW5nLAorICAgICAgICBzb21ldGhpbmcgbGlrZSA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuSW50cm9zcGVjdGFibGU8L2xpdGVyYWw+LgorICAgICAgICBNb3N0IGJpbmRpbmdzIHdpbGwgbWFwIHRoZXNlIGludGVyZmFjZSBuYW1lcyBkaXJlY3RseSB0byAKKyAgICAgICAgdGhlIGFwcHJvcHJpYXRlIHByb2dyYW1taW5nIGxhbmd1YWdlIGNvbnN0cnVjdCwgZm9yIGV4YW1wbGUgCisgICAgICAgIHRvIEphdmEgaW50ZXJmYWNlcyBvciBDKysgcHVyZSB2aXJ0dWFsIGNsYXNzZXMuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0MiBpZD0icHJveGllcyI+CisgICAgICA8dGl0bGU+UHJveGllczwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgQSA8Zmlyc3R0ZXJtPnByb3h5IG9iamVjdDwvZmlyc3R0ZXJtPiBpcyBhIGNvbnZlbmllbnQgbmF0aXZlIG9iamVjdCBjcmVhdGVkIHRvIAorICAgICAgICByZXByZXNlbnQgYSByZW1vdGUgb2JqZWN0IGluIGFub3RoZXIgcHJvY2Vzcy4gVGhlIGxvdy1sZXZlbCBEQnVzIEFQSSBpbnZvbHZlcyBtYW51YWxseSBjcmVhdGluZyAKKyAgICAgICAgYSBtZXRob2QgY2FsbCBtZXNzYWdlLCBzZW5kaW5nIGl0LCB0aGVuIG1hbnVhbGx5IHJlY2VpdmluZyBhbmQgcHJvY2Vzc2luZyAKKyAgICAgICAgdGhlIG1ldGhvZCByZXBseSBtZXNzYWdlLiBIaWdoZXItbGV2ZWwgYmluZGluZ3MgcHJvdmlkZSBwcm94aWVzIGFzIGFuIGFsdGVybmF0aXZlLgorICAgICAgICBQcm94aWVzIGxvb2sgbGlrZSBhIG5vcm1hbCBuYXRpdmUgb2JqZWN0OyBidXQgd2hlbiB5b3UgaW52b2tlIGEgbWV0aG9kIG9uIHRoZSBwcm94eSAKKyAgICAgICAgb2JqZWN0LCB0aGUgYmluZGluZyBjb252ZXJ0cyBpdCBpbnRvIGEgREJ1cyBtZXRob2QgY2FsbCBtZXNzYWdlLCB3YWl0cyBmb3IgdGhlIHJlcGx5IAorICAgICAgICBtZXNzYWdlLCB1bnBhY2tzIHRoZSByZXR1cm4gdmFsdWUsIGFuZCByZXR1cm5zIGl0IGZyb20gdGhlIG5hdGl2ZSBtZXRob2QuLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEluIHBzZXVkb2NvZGUsIHByb2dyYW1taW5nIHdpdGhvdXQgcHJveGllcyBtaWdodCBsb29rIGxpa2UgdGhpczoKKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKCIvcmVtb3RlL29iamVjdC9wYXRoIiwgIk1ldGhvZE5hbWUiLCBhcmcxLCBhcmcyKTsKKyAgICAgICAgICBDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRCdXNDb25uZWN0aW9uKCk7CisgICAgICAgICAgY29ubmVjdGlvbi5zZW5kKG1lc3NhZ2UpOworICAgICAgICAgIE1lc3NhZ2UgcmVwbHkgPSBjb25uZWN0aW9uLndhaXRGb3JSZXBseShtZXNzYWdlKTsKKyAgICAgICAgICBpZiAocmVwbHkuaXNFcnJvcigpKSB7CisgICAgICAgICAgICAgCisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICBPYmplY3QgcmV0dXJuVmFsdWUgPSByZXBseS5nZXRSZXR1cm5WYWx1ZSgpOworICAgICAgICAgIH0KKyAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBQcm9ncmFtbWluZyB3aXRoIHByb3hpZXMgbWlnaHQgbG9vayBsaWtlIHRoaXM6CisgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBQcm94eSBwcm94eSA9IG5ldyBQcm94eShnZXRCdXNDb25uZWN0aW9uKCksICIvcmVtb3RlL29iamVjdC9wYXRoIik7CisgICAgICAgICAgT2JqZWN0IHJldHVyblZhbHVlID0gcHJveHkuTWV0aG9kTmFtZShhcmcxLCBhcmcyKTsKKyAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorCisgICAgPHNlY3QyIGlkPSJidXMtbmFtZXMiPgorICAgICAgPHRpdGxlPkJ1cyBOYW1lczwvdGl0bGU+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBXaGVuIGVhY2ggYXBwbGljYXRpb24gY29ubmVjdHMgdG8gdGhlIGJ1cyBkYWVtb24sIHRoZSBkYWVtb24gaW1tZWRpYXRlbHkKKyAgICAgICAgYXNzaWducyBpdCBhIG5hbWUsIGNhbGxlZCB0aGUgPGZpcnN0dGVybT51bmlxdWUgY29ubmVjdGlvbiBuYW1lPC9maXJzdHRlcm0+LgorICAgICAgICBBIHVuaXF1ZSBuYW1lIGJlZ2lucyB3aXRoIGEgJzonIChjb2xvbikgY2hhcmFjdGVyLiBUaGVzZSBuYW1lcyBhcmUgbmV2ZXIgCisgICAgICAgIHJldXNlZCBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoZSBidXMgZGFlbW9uIC0gdGhhdCBpcywgeW91IGtub3cgCisgICAgICAgIGEgZ2l2ZW4gbmFtZSB3aWxsIGFsd2F5cyByZWZlciB0byB0aGUgc2FtZSBhcHBsaWNhdGlvbi4KKyAgICAgICAgQW4gZXhhbXBsZSBvZiBhIHVuaXF1ZSBuYW1lIG1pZ2h0IGJlCisgICAgICAgIDxsaXRlcmFsPjozNC05MDc8L2xpdGVyYWw+LiBUaGUgbnVtYmVycyBhZnRlciB0aGUgY29sb24gaGF2ZSAKKyAgICAgICAgbm8gbWVhbmluZyBvdGhlciB0aGFuIHRoZWlyIHVuaXF1ZW5lc3MuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBXaGVuIGEgbmFtZSBpcyBtYXBwZWQgCisgICAgICAgIHRvIGEgcGFydGljdWxhciBhcHBsaWNhdGlvbidzIGNvbm5lY3Rpb24sIHRoYXQgYXBwbGljYXRpb24gaXMgc2FpZCB0byAKKyAgICAgICAgPGZpcnN0dGVybT5vd248L2ZpcnN0dGVybT4gdGhhdCBuYW1lLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgQXBwbGljYXRpb25zIG1heSBhc2sgdG8gb3duIGFkZGl0aW9uYWwgPGZpcnN0dGVybT53ZWxsLWtub3duCisgICAgICAgIG5hbWVzPC9maXJzdHRlcm0+LiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIHdyaXRlIGEgc3BlY2lmaWNhdGlvbiB0bworICAgICAgICBkZWZpbmUgYSBuYW1lIGNhbGxlZCA8bGl0ZXJhbD5jb20ubXljb21wYW55LlRleHRFZGl0b3I8L2xpdGVyYWw+LgorICAgICAgICBZb3VyIGRlZmluaXRpb24gY291bGQgc3BlY2lmeSB0aGF0IHRvIG93biB0aGlzIG5hbWUsIGFuIGFwcGxpY2F0aW9uCisgICAgICAgIHNob3VsZCBoYXZlIGFuIG9iamVjdCBhdCB0aGUgcGF0aAorICAgICAgICA8bGl0ZXJhbD4vY29tL215Y29tcGFueS9UZXh0RmlsZU1hbmFnZXI8L2xpdGVyYWw+IHN1cHBvcnRpbmcgdGhlCisgICAgICAgIGludGVyZmFjZSA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuRmlsZUhhbmRsZXI8L2xpdGVyYWw+LgorICAgICAgPC9wYXJhPgorICAgICAgCisgICAgICA8cGFyYT4KKyAgICAgICAgQXBwbGljYXRpb25zIGNvdWxkIHRoZW4gc2VuZCBtZXNzYWdlcyB0byB0aGlzIGJ1cyBuYW1lLCAKKyAgICAgICAgb2JqZWN0LCBhbmQgaW50ZXJmYWNlIHRvIGV4ZWN1dGUgbWV0aG9kIGNhbGxzLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgWW91IGNvdWxkIHRoaW5rIG9mIHRoZSB1bmlxdWUgbmFtZXMgYXMgSVAgYWRkcmVzc2VzLCBhbmQgdGhlCisgICAgICAgIHdlbGwta25vd24gbmFtZXMgYXMgZG9tYWluIG5hbWVzLiBTbworICAgICAgICA8bGl0ZXJhbD5jb20ubXljb21wYW55LlRleHRFZGl0b3I8L2xpdGVyYWw+IG1pZ2h0IG1hcCB0byBzb21ldGhpbmcgbGlrZQorICAgICAgICA8bGl0ZXJhbD46MzQtOTA3PC9saXRlcmFsPiBqdXN0IGFzIDxsaXRlcmFsPm15Y29tcGFueS5jb208L2xpdGVyYWw+IG1hcHMKKyAgICAgICAgdG8gc29tZXRoaW5nIGxpa2UgPGxpdGVyYWw+MTkyLjE2OC4wLjU8L2xpdGVyYWw+LgorICAgICAgPC9wYXJhPgorICAgICAgCisgICAgICA8cGFyYT4KKyAgICAgICAgTmFtZXMgaGF2ZSBhIHNlY29uZCBpbXBvcnRhbnQgdXNlLCBvdGhlciB0aGFuIHJvdXRpbmcgbWVzc2FnZXMuICBUaGV5CisgICAgICAgIGFyZSB1c2VkIHRvIHRyYWNrIGxpZmVjeWNsZS4gV2hlbiBhbiBhcHBsaWNhdGlvbiBleGl0cyAob3IgY3Jhc2hlcyksIGl0cworICAgICAgICBjb25uZWN0aW9uIHRvIHRoZSBtZXNzYWdlIGJ1cyB3aWxsIGJlIGNsb3NlZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbQorICAgICAgICBrZXJuZWwuIFRoZSBtZXNzYWdlIGJ1cyB0aGVuIHNlbmRzIG91dCBub3RpZmljYXRpb24gbWVzc2FnZXMgdGVsbGluZworICAgICAgICByZW1haW5pbmcgYXBwbGljYXRpb25zIHRoYXQgdGhlIGFwcGxpY2F0aW9uJ3MgbmFtZXMgaGF2ZSBsb3N0IHRoZWlyCisgICAgICAgIG93bmVyLiBCeSB0cmFja2luZyB0aGVzZSBub3RpZmljYXRpb25zLCB5b3VyIGFwcGxpY2F0aW9uIGNhbiByZWxpYWJseQorICAgICAgICBtb25pdG9yIHRoZSBsaWZldGltZSBvZiBvdGhlciBhcHBsaWNhdGlvbnMuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBCdXMgbmFtZXMgY2FuIGFsc28gYmUgdXNlZCB0byBjb29yZGluYXRlIHNpbmdsZS1pbnN0YW5jZSBhcHBsaWNhdGlvbnMuCisgICAgICAgIElmIHlvdSB3YW50IHRvIGJlIHN1cmUgb25seSBvbmUKKyAgICAgICAgPGxpdGVyYWw+Y29tLm15Y29tcGFueS5UZXh0RWRpdG9yPC9saXRlcmFsPiBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGZvcgorICAgICAgICBleGFtcGxlLCBoYXZlIHRoZSB0ZXh0IGVkaXRvciBhcHBsaWNhdGlvbiBleGl0IGlmIHRoZSBidXMgbmFtZSBhbHJlYWR5CisgICAgICAgIGhhcyBhbiBvd25lci4KKyAgICAgIDwvcGFyYT4KKworICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9ImFkZHJlc3NlcyI+CisgICAgICA8dGl0bGU+QWRkcmVzc2VzPC90aXRsZT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEFwcGxpY2F0aW9ucyB1c2luZyBELUJ1cyBhcmUgZWl0aGVyIHNlcnZlcnMgb3IgY2xpZW50cy4gIEEgc2VydmVyCisgICAgICAgIGxpc3RlbnMgZm9yIGluY29taW5nIGNvbm5lY3Rpb25zOyBhIGNsaWVudCBjb25uZWN0cyB0byBhIHNlcnZlci4gT25jZQorICAgICAgICB0aGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCwgaXQgaXMgYSBzeW1tZXRyaWMgZmxvdyBvZiBtZXNzYWdlczsgdGhlCisgICAgICAgIGNsaWVudC1zZXJ2ZXIgZGlzdGluY3Rpb24gb25seSBtYXR0ZXJzIHdoZW4gc2V0dGluZyB1cCB0aGUgCisgICAgICAgIGNvbm5lY3Rpb24uCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBJZiB5b3UncmUgdXNpbmcgdGhlIGJ1cyBkYWVtb24sIGFzIHlvdSBwcm9iYWJseSBhcmUsIHlvdXIgYXBwbGljYXRpb24gCisgICAgICAgIHdpbGwgYmUgYSBjbGllbnQgb2YgdGhlIGJ1cyBkYWVtb24uIFRoYXQgaXMsIHRoZSBidXMgZGFlbW9uIGxpc3RlbnMgCisgICAgICAgIGZvciBjb25uZWN0aW9ucyBhbmQgeW91ciBhcHBsaWNhdGlvbiBpbml0aWF0ZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBidXMgCisgICAgICAgIGRhZW1vbi4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEEgRC1CdXMgPGZpcnN0dGVybT5hZGRyZXNzPC9maXJzdHRlcm0+IHNwZWNpZmllcyB3aGVyZSBhIHNlcnZlciB3aWxsCisgICAgICAgIGxpc3RlbiwgYW5kIHdoZXJlIGEgY2xpZW50IHdpbGwgY29ubmVjdC4gIEZvciBleGFtcGxlLCB0aGUgYWRkcmVzcworICAgICAgICA8bGl0ZXJhbD51bml4OnBhdGg9L3RtcC9hYmNkZWY8L2xpdGVyYWw+IHNwZWNpZmllcyB0aGF0IHRoZSBzZXJ2ZXIgd2lsbAorICAgICAgICBsaXN0ZW4gb24gYSBVTklYIGRvbWFpbiBzb2NrZXQgYXQgdGhlIHBhdGgKKyAgICAgICAgPGxpdGVyYWw+L3RtcC9hYmNkZWY8L2xpdGVyYWw+IGFuZCB0aGUgY2xpZW50IHdpbGwgY29ubmVjdCB0byB0aGF0CisgICAgICAgIHNvY2tldC4gQW4gYWRkcmVzcyBjYW4gYWxzbyBzcGVjaWZ5IFRDUC9JUCBzb2NrZXRzLCBvciBhbnkgb3RoZXIKKyAgICAgICAgdHJhbnNwb3J0IGRlZmluZWQgaW4gZnV0dXJlIGl0ZXJhdGlvbnMgb2YgdGhlIEQtQnVzIHNwZWNpZmljYXRpb24uCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBXaGVuIHVzaW5nIEQtQnVzIHdpdGggYSBtZXNzYWdlIGJ1cyBkYWVtb24sCisgICAgICAgIGxpYmRidXMgYXV0b21hdGljYWxseSBkaXNjb3ZlcnMgdGhlIGFkZHJlc3Mgb2YgdGhlIHBlci1zZXNzaW9uIGJ1cyAKKyAgICAgICAgZGFlbW9uIGJ5IHJlYWRpbmcgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuIEl0IGRpc2NvdmVycyB0aGUgCisgICAgICAgIHN5c3RlbXdpZGUgYnVzIGRhZW1vbiBieSBjaGVja2luZyBhIHdlbGwta25vd24gVU5JWCBkb21haW4gc29ja2V0IHBhdGgKKyAgICAgICAgKHRob3VnaCB5b3UgY2FuIG92ZXJyaWRlIHRoaXMgYWRkcmVzcyB3aXRoIGFuIGVudmlyb25tZW50IHZhcmlhYmxlKS4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIElmIHlvdSdyZSB1c2luZyBELUJ1cyB3aXRob3V0IGEgYnVzIGRhZW1vbiwgaXQncyB1cCB0byB5b3UgdG8gCisgICAgICAgIGRlZmluZSB3aGljaCBhcHBsaWNhdGlvbiB3aWxsIGJlIHRoZSBzZXJ2ZXIgYW5kIHdoaWNoIHdpbGwgYmUgCisgICAgICAgIHRoZSBjbGllbnQsIGFuZCBzcGVjaWZ5IGEgbWVjaGFuaXNtIGZvciB0aGVtIHRvIGFncmVlIG9uIAorICAgICAgICB0aGUgc2VydmVyJ3MgYWRkcmVzcy4gVGhpcyBpcyBhbiB1bnVzdWFsIGNhc2UuCisgICAgICA8L3BhcmE+CisKKyAgICA8L3NlY3QyPgorCisgICAgPHNlY3QyIGlkPSJiaWdwaWN0dXJlIj4KKyAgICAgIDx0aXRsZT5CaWcgQ29uY2VwdHVhbCBQaWN0dXJlPC90aXRsZT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFB1bGxpbmcgYWxsIHRoZXNlIGNvbmNlcHRzIHRvZ2V0aGVyLCB0byBzcGVjaWZ5IGEgcGFydGljdWxhciAKKyAgICAgICAgbWV0aG9kIGNhbGwgb24gYSBwYXJ0aWN1bGFyIG9iamVjdCBpbnN0YW5jZSwgYSBudW1iZXIgb2YgCisgICAgICAgIG5lc3RlZCBjb21wb25lbnRzIGhhdmUgdG8gYmUgbmFtZWQ6CisgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBBZGRyZXNzIC0mZ3Q7IFtCdXMgTmFtZV0gLSZndDsgUGF0aCAtJmd0OyBJbnRlcmZhY2UgLSZndDsgTWV0aG9kCisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIFRoZSBidXMgbmFtZSBpcyBpbiBicmFja2V0cyB0byBpbmRpY2F0ZSB0aGF0IGl0J3Mgb3B0aW9uYWwgLS0geW91IG9ubHkKKyAgICAgICAgcHJvdmlkZSBhIG5hbWUgdG8gcm91dGUgdGhlIG1ldGhvZCBjYWxsIHRvIHRoZSByaWdodCBhcHBsaWNhdGlvbgorICAgICAgICB3aGVuIHVzaW5nIHRoZSBidXMgZGFlbW9uLiBJZiB5b3UgaGF2ZSBhIGRpcmVjdCBjb25uZWN0aW9uIHRvIGFub3RoZXIKKyAgICAgICAgYXBwbGljYXRpb24sIGJ1cyBuYW1lcyBhcmVuJ3QgdXNlZDsgdGhlcmUncyBubyBidXMgZGFlbW9uLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIGludGVyZmFjZSBpcyBhbHNvIG9wdGlvbmFsLCBwcmltYXJpbHkgZm9yIGhpc3RvcmljYWwgCisgICAgICAgIHJlYXNvbnM7IERDT1AgZG9lcyBub3QgcmVxdWlyZSBzcGVjaWZ5aW5nIHRoZSBpbnRlcmZhY2UsIAorICAgICAgICBpbnN0ZWFkIHNpbXBseSBmb3JiaWRkaW5nIGR1cGxpY2F0ZSBtZXRob2QgbmFtZXMgCisgICAgICAgIG9uIHRoZSBzYW1lIG9iamVjdCBpbnN0YW5jZS4gRC1CdXMgd2lsbCB0aHVzIGxldCB5b3UgCisgICAgICAgIG9taXQgdGhlIGludGVyZmFjZSwgYnV0IGlmIHlvdXIgbWV0aG9kIG5hbWUgaXMgYW1iaWd1b3VzIAorICAgICAgICBpdCBpcyB1bmRlZmluZWQgd2hpY2ggbWV0aG9kIHdpbGwgYmUgaW52b2tlZC4KKyAgICAgIDwvcGFyYT4KKworICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9Im1lc3NhZ2VzIj4KKyAgICAgIDx0aXRsZT5NZXNzYWdlcyAtIEJlaGluZCB0aGUgU2NlbmVzPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBELUJ1cyB3b3JrcyBieSBzZW5kaW5nIG1lc3NhZ2VzIGJldHdlZW4gcHJvY2Vzc2VzLiBJZiB5b3UncmUgdXNpbmcgCisgICAgICAgIGEgc3VmZmljaWVudGx5IGhpZ2gtbGV2ZWwgYmluZGluZywgeW91IG1heSBuZXZlciB3b3JrIHdpdGggbWVzc2FnZXMgZGlyZWN0bHkuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlcmUgYXJlIDQgbWVzc2FnZSB0eXBlczoKKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgTWV0aG9kIGNhbGwgbWVzc2FnZXMgYXNrIHRvIGludm9rZSBhIG1ldGhvZCAKKyAgICAgICAgICAgICAgb24gYW4gb2JqZWN0LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIE1ldGhvZCByZXR1cm4gbWVzc2FnZXMgcmV0dXJuIHRoZSByZXN1bHRzIAorICAgICAgICAgICAgICBvZiBpbnZva2luZyBhIG1ldGhvZC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBFcnJvciBtZXNzYWdlcyByZXR1cm4gYW4gZXhjZXB0aW9uIGNhdXNlZCBieSAKKyAgICAgICAgICAgICAgaW52b2tpbmcgYSBtZXRob2QuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgU2lnbmFsIG1lc3NhZ2VzIGFyZSBub3RpZmljYXRpb25zIHRoYXQgYSBnaXZlbiBzaWduYWwgCisgICAgICAgICAgICAgIGhhcyBiZWVuIGVtaXR0ZWQgKHRoYXQgYW4gZXZlbnQgaGFzIG9jY3VycmVkKS4gCisgICAgICAgICAgICAgIFlvdSBjb3VsZCBhbHNvIHRoaW5rIG9mIHRoZXNlIGFzICJldmVudCIgbWVzc2FnZXMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgQSBtZXRob2QgY2FsbCBtYXBzIHZlcnkgc2ltcGx5IHRvIG1lc3NhZ2VzOiB5b3Ugc2VuZCBhIG1ldGhvZCBjYWxsCisgICAgICAgIG1lc3NhZ2UsIGFuZCByZWNlaXZlIGVpdGhlciBhIG1ldGhvZCByZXR1cm4gbWVzc2FnZSBvciBhbiBlcnJvciBtZXNzYWdlCisgICAgICAgIGluIHJlcGx5LgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEVhY2ggbWVzc2FnZSBoYXMgYSA8Zmlyc3R0ZXJtPmhlYWRlcjwvZmlyc3R0ZXJtPiwgaW5jbHVkaW5nIDxmaXJzdHRlcm0+ZmllbGRzPC9maXJzdHRlcm0+LCAKKyAgICAgICAgYW5kIGEgPGZpcnN0dGVybT5ib2R5PC9maXJzdHRlcm0+LCBpbmNsdWRpbmcgPGZpcnN0dGVybT5hcmd1bWVudHM8L2ZpcnN0dGVybT4uIFlvdSBjYW4gdGhpbmsgCisgICAgICAgIG9mIHRoZSBoZWFkZXIgYXMgdGhlIHJvdXRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBtZXNzYWdlLCBhbmQgdGhlIGJvZHkgYXMgdGhlIHBheWxvYWQuCisgICAgICAgIEhlYWRlciBmaWVsZHMgbWlnaHQgaW5jbHVkZSB0aGUgc2VuZGVyIGJ1cyBuYW1lLCBkZXN0aW5hdGlvbiBidXMgbmFtZSwgbWV0aG9kIG9yIHNpZ25hbCBuYW1lLCAKKyAgICAgICAgYW5kIHNvIGZvcnRoLiBPbmUgb2YgdGhlIGhlYWRlciBmaWVsZHMgaXMgYSA8Zmlyc3R0ZXJtPnR5cGUgc2lnbmF0dXJlPC9maXJzdHRlcm0+IGRlc2NyaWJpbmcgdGhlIAorICAgICAgICB2YWx1ZXMgZm91bmQgaW4gdGhlIGJvZHkuIEZvciBleGFtcGxlLCB0aGUgbGV0dGVyICJpIiBtZWFucyAiMzItYml0IGludGVnZXIiIHNvIHRoZSBzaWduYXR1cmUgCisgICAgICAgICJpaSIgbWVhbnMgdGhlIHBheWxvYWQgaGFzIHR3byAzMi1iaXQgaW50ZWdlcnMuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0MiBpZD0iY2FsbHByb2NlZHVyZSI+CisgICAgICA8dGl0bGU+Q2FsbGluZyBhIE1ldGhvZCAtIEJlaGluZCB0aGUgU2NlbmVzPC90aXRsZT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEEgbWV0aG9kIGNhbGwgaW4gREJ1cyBjb25zaXN0cyBvZiB0d28gbWVzc2FnZXM7IGEgbWV0aG9kIGNhbGwgbWVzc2FnZSBzZW50IGZyb20gcHJvY2VzcyBBIHRvIHByb2Nlc3MgQiwgCisgICAgICAgIGFuZCBhIG1hdGNoaW5nIG1ldGhvZCByZXBseSBtZXNzYWdlIHNlbnQgZnJvbSBwcm9jZXNzIEIgdG8gcHJvY2VzcyBBLiBCb3RoIHRoZSBjYWxsIGFuZCB0aGUgcmVwbHkgbWVzc2FnZXMKKyAgICAgICAgYXJlIHJvdXRlZCB0aHJvdWdoIHRoZSBidXMgZGFlbW9uLiBUaGUgY2FsbGVyIGluY2x1ZGVzIGEgZGlmZmVyZW50IHNlcmlhbCBudW1iZXIgaW4gZWFjaCBjYWxsIG1lc3NhZ2UsIGFuZCB0aGUKKyAgICAgICAgcmVwbHkgbWVzc2FnZSBpbmNsdWRlcyB0aGlzIG51bWJlciB0byBhbGxvdyB0aGUgY2FsbGVyIHRvIG1hdGNoIHJlcGxpZXMgdG8gY2FsbHMuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgY2FsbCBtZXNzYWdlIHdpbGwgY29udGFpbiBhbnkgYXJndW1lbnRzIHRvIHRoZSBtZXRob2QuCisgICAgICAgIFRoZSByZXBseSBtZXNzYWdlIG1heSBpbmRpY2F0ZSBhbiBlcnJvciwgb3IgbWF5IGNvbnRhaW4gZGF0YSByZXR1cm5lZCBieSB0aGUgbWV0aG9kLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgQSBtZXRob2QgaW52b2NhdGlvbiBpbiBEQnVzIGhhcHBlbnMgYXMgZm9sbG93czoKKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgVGhlIGxhbmd1YWdlIGJpbmRpbmcgbWF5IHByb3ZpZGUgYSBwcm94eSwgc3VjaCB0aGF0IGludm9raW5nIGEgbWV0aG9kIG9uIAorICAgICAgICAgICAgICBhbiBpbi1wcm9jZXNzIG9iamVjdCBpbnZva2VzIGEgbWV0aG9kIG9uIGEgcmVtb3RlIG9iamVjdCBpbiBhbm90aGVyIHByb2Nlc3MuIElmIHNvLCB0aGUgCisgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGNhbGxzIGEgbWV0aG9kIG9uIHRoZSBwcm94eSwgYW5kIHRoZSBwcm94eQorICAgICAgICAgICAgICBjb25zdHJ1Y3RzIGEgbWV0aG9kIGNhbGwgbWVzc2FnZSB0byBzZW5kIHRvIHRoZSByZW1vdGUgcHJvY2Vzcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBGb3IgbW9yZSBsb3ctbGV2ZWwgQVBJcywgdGhlIGFwcGxpY2F0aW9uIG1heSBjb25zdHJ1Y3QgYSBtZXRob2QgY2FsbCBtZXNzYWdlIGl0c2VsZiwgd2l0aG91dAorICAgICAgICAgICAgICB1c2luZyBhIHByb3h5LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIEluIGVpdGhlciBjYXNlLCB0aGUgbWV0aG9kIGNhbGwgbWVzc2FnZSBjb250YWluczogYSBidXMgbmFtZSBiZWxvbmdpbmcgdG8gdGhlIHJlbW90ZSBwcm9jZXNzOyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kOyAKKyAgICAgICAgICAgICAgdGhlIGFyZ3VtZW50cyB0byB0aGUgbWV0aG9kOyBhbiBvYmplY3QgcGF0aCBpbnNpZGUgdGhlIHJlbW90ZSBwcm9jZXNzOyBhbmQgb3B0aW9uYWxseSB0aGUgbmFtZSBvZiB0aGUgCisgICAgICAgICAgICAgIGludGVyZmFjZSB0aGF0IHNwZWNpZmllcyB0aGUgbWV0aG9kLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIFRoZSBtZXRob2QgY2FsbCBtZXNzYWdlIGlzIHNlbnQgdG8gdGhlIGJ1cyBkYWVtb24uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgVGhlIGJ1cyBkYWVtb24gbG9va3MgYXQgdGhlIGRlc3RpbmF0aW9uIGJ1cyBuYW1lLiBJZiBhIHByb2Nlc3Mgb3ducyB0aGF0IG5hbWUsIAorICAgICAgICAgICAgICB0aGUgYnVzIGRhZW1vbiBmb3J3YXJkcyB0aGUgbWV0aG9kIGNhbGwgdG8gdGhhdCBwcm9jZXNzLiBPdGhlcndpc2UsIHRoZSBidXMgZGFlbW9uCisgICAgICAgICAgICAgIGNyZWF0ZXMgYW4gZXJyb3IgbWVzc2FnZSBhbmQgc2VuZHMgaXQgYmFjayBhcyB0aGUgcmVwbHkgdG8gdGhlIG1ldGhvZCBjYWxsIG1lc3NhZ2UuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgVGhlIHJlY2VpdmluZyBwcm9jZXNzIHVucGFja3MgdGhlIG1ldGhvZCBjYWxsIG1lc3NhZ2UuIEluIGEgc2ltcGxlIGxvdy1sZXZlbCBBUEkgc2l0dWF0aW9uLCBpdCAKKyAgICAgICAgICAgICAgbWF5IGltbWVkaWF0ZWx5IHJ1biB0aGUgbWV0aG9kIGFuZCBzZW5kIGEgbWV0aG9kIHJlcGx5IG1lc3NhZ2UgdG8gdGhlIGJ1cyBkYWVtb24uCisgICAgICAgICAgICAgIFdoZW4gdXNpbmcgYSBoaWdoLWxldmVsIGJpbmRpbmcgQVBJLCB0aGUgYmluZGluZyBtaWdodCBleGFtaW5lIHRoZSBvYmplY3QgcGF0aCwgaW50ZXJmYWNlLAorICAgICAgICAgICAgICBhbmQgbWV0aG9kIG5hbWUsIGFuZCBjb252ZXJ0IHRoZSBtZXRob2QgY2FsbCBtZXNzYWdlIGludG8gYW4gaW52b2NhdGlvbiBvZiBhIG1ldGhvZCBvbiAKKyAgICAgICAgICAgICAgYSBuYXRpdmUgb2JqZWN0IChHT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBRT2JqZWN0LCBldGMuKSwgdGhlbiBjb252ZXJ0IHRoZSByZXR1cm4gCisgICAgICAgICAgICAgIHZhbHVlIGZyb20gdGhlIG5hdGl2ZSBtZXRob2QgaW50byBhIG1ldGhvZCByZXBseSBtZXNzYWdlLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIFRoZSBidXMgZGFlbW9uIHJlY2VpdmVzIHRoZSBtZXRob2QgcmVwbHkgbWVzc2FnZSBhbmQgc2VuZHMgaXQgdG8gdGhlIHByb2Nlc3MgdGhhdCAKKyAgICAgICAgICAgICAgbWFkZSB0aGUgbWV0aG9kIGNhbGwuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgVGhlIHByb2Nlc3MgdGhhdCBtYWRlIHRoZSBtZXRob2QgY2FsbCBsb29rcyBhdCB0aGUgbWV0aG9kIHJlcGx5IGFuZCBtYWtlcyB1c2Ugb2YgYW55IAorICAgICAgICAgICAgICByZXR1cm4gdmFsdWVzIGluY2x1ZGVkIGluIHRoZSByZXBseS4gVGhlIHJlcGx5IG1heSBhbHNvIGluZGljYXRlIHRoYXQgYW4gZXJyb3Igb2NjdXJyZWQuCisgICAgICAgICAgICAgIFdoZW4gdXNpbmcgYSBiaW5kaW5nLCB0aGUgbWV0aG9kIHJlcGx5IG1lc3NhZ2UgbWF5IGJlIGNvbnZlcnRlZCBpbnRvIHRoZSByZXR1cm4gdmFsdWUgb2YgCisgICAgICAgICAgICAgIG9mIGEgcHJveHkgbWV0aG9kLCBvciBpbnRvIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBidXMgZGFlbW9uIG5ldmVyIHJlb3JkZXJzIG1lc3NhZ2VzLiBUaGF0IGlzLCBpZiB5b3Ugc2VuZCB0d28gbWV0aG9kIGNhbGwgbWVzc2FnZXMgdG8gdGhlIHNhbWUgcmVjaXBpZW50LCAKKyAgICAgICAgdGhleSB3aWxsIGJlIHJlY2VpdmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgc2VudC4gVGhlIHJlY2lwaWVudCBpcyBub3QgcmVxdWlyZWQgdG8gcmVwbHkgdG8gdGhlIGNhbGxzCisgICAgICAgIGluIG9yZGVyLCBob3dldmVyOyBmb3IgZXhhbXBsZSwgaXQgbWF5IHByb2Nlc3MgZWFjaCBtZXRob2QgY2FsbCBpbiBhIHNlcGFyYXRlIHRocmVhZCwgYW5kIHJldHVybiByZXBseSBtZXNzYWdlcworICAgICAgICBpbiBhbiB1bmRlZmluZWQgb3JkZXIgZGVwZW5kaW5nIG9uIHdoZW4gdGhlIHRocmVhZHMgY29tcGxldGUuIE1ldGhvZCBjYWxscyBoYXZlIGEgdW5pcXVlIHNlcmlhbCAKKyAgICAgICAgbnVtYmVyIHVzZWQgYnkgdGhlIG1ldGhvZCBjYWxsZXIgdG8gbWF0Y2ggcmVwbHkgbWVzc2FnZXMgdG8gY2FsbCBtZXNzYWdlcy4KKyAgICAgIDwvcGFyYT4KKworICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9InNpZ25hbHByb2NlZHVyZSI+CisgICAgICA8dGl0bGU+RW1pdHRpbmcgYSBTaWduYWwgLSBCZWhpbmQgdGhlIFNjZW5lczwvdGl0bGU+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBBIHNpZ25hbCBpbiBEQnVzIGNvbnNpc3RzIG9mIGEgc2luZ2xlIG1lc3NhZ2UsIHNlbnQgYnkgb25lIHByb2Nlc3MgdG8gYW55IG51bWJlciBvZiBvdGhlciBwcm9jZXNzZXMuIAorICAgICAgICBUaGF0IGlzLCBhIHNpZ25hbCBpcyBhIHVuaWRpcmVjdGlvbmFsIGJyb2FkY2FzdC4gVGhlIHNpZ25hbCBtYXkgY29udGFpbiBhcmd1bWVudHMgKGEgZGF0YSBwYXlsb2FkKSwgYnV0IAorICAgICAgICBiZWNhdXNlIGl0IGlzIGEgYnJvYWRjYXN0LCBpdCBuZXZlciBoYXMgYSAicmV0dXJuIHZhbHVlLiIgQ29udHJhc3QgdGhpcyB3aXRoIGEgbWV0aG9kIGNhbGwgCisgICAgICAgIChzZWUgPHhyZWYgbGlua2VuZD0iY2FsbHByb2NlZHVyZSIvPikgd2hlcmUgdGhlIG1ldGhvZCBjYWxsIG1lc3NhZ2UgaGFzIGEgbWF0Y2hpbmcgbWV0aG9kIHJlcGx5IG1lc3NhZ2UuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgZW1pdHRlciAoYWthIHNlbmRlcikgb2YgYSBzaWduYWwgaGFzIG5vIGtub3dsZWRnZSBvZiB0aGUgc2lnbmFsIHJlY2lwaWVudHMuIFJlY2lwaWVudHMgcmVnaXN0ZXIKKyAgICAgICAgd2l0aCB0aGUgYnVzIGRhZW1vbiB0byByZWNlaXZlIHNpZ25hbHMgYmFzZWQgb24gIm1hdGNoIHJ1bGVzIiAtIHRoZXNlIHJ1bGVzIHdvdWxkIHR5cGljYWxseSBpbmNsdWRlIHRoZSBzZW5kZXIgYW5kIAorICAgICAgICB0aGUgc2lnbmFsIG5hbWUuIFRoZSBidXMgZGFlbW9uIHNlbmRzIGVhY2ggc2lnbmFsIG9ubHkgdG8gcmVjaXBpZW50cyB3aG8gaGF2ZSBleHByZXNzZWQgaW50ZXJlc3QgaW4gdGhhdCAKKyAgICAgICAgc2lnbmFsLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgQSBzaWduYWwgaW4gREJ1cyBoYXBwZW5zIGFzIGZvbGxvd3M6CisgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIEEgc2lnbmFsIG1lc3NhZ2UgaXMgY3JlYXRlZCBhbmQgc2VudCB0byB0aGUgYnVzIGRhZW1vbi4gV2hlbiB1c2luZyB0aGUgbG93LWxldmVsIEFQSSB0aGlzIG1heSBiZSAKKyAgICAgICAgICAgICAgZG9uZSBtYW51YWxseSwgd2l0aCBjZXJ0YWluIGJpbmRpbmdzIGl0IG1heSBiZSBkb25lIGZvciB5b3UgYnkgdGhlIGJpbmRpbmcgd2hlbiBhIG5hdGl2ZSBvYmplY3QKKyAgICAgICAgICAgICAgZW1pdHMgYSBuYXRpdmUgc2lnbmFsIG9yIGV2ZW50LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIFRoZSBzaWduYWwgbWVzc2FnZSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlIHRoYXQgc3BlY2lmaWVzIHRoZSBzaWduYWw7CisgICAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBzaWduYWw7IHRoZSBidXMgbmFtZSBvZiB0aGUgcHJvY2VzcyBzZW5kaW5nIHRoZSBzaWduYWw7IGFuZCAKKyAgICAgICAgICAgICAgYW55IGFyZ3VtZW50cyAKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBBbnkgcHJvY2VzcyBvbiB0aGUgbWVzc2FnZSBidXMgY2FuIHJlZ2lzdGVyICJtYXRjaCBydWxlcyIgaW5kaWNhdGluZyB3aGljaCBzaWduYWxzIGl0IAorICAgICAgICAgICAgICBpcyBpbnRlcmVzdGVkIGluLiBUaGUgYnVzIGhhcyBhIGxpc3Qgb2YgcmVnaXN0ZXJlZCBtYXRjaCBydWxlcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBUaGUgYnVzIGRhZW1vbiBleGFtaW5lcyB0aGUgc2lnbmFsIGFuZCBkZXRlcm1pbmVzIHdoaWNoIHByb2Nlc3NlcyBhcmUgaW50ZXJlc3RlZCBpbiBpdC4KKyAgICAgICAgICAgICAgSXQgc2VuZHMgdGhlIHNpZ25hbCBtZXNzYWdlIHRvIHRoZXNlIHByb2Nlc3Nlcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBFYWNoIHByb2Nlc3MgcmVjZWl2aW5nIHRoZSBzaWduYWwgZGVjaWRlcyB3aGF0IHRvIGRvIHdpdGggaXQ7IGlmIHVzaW5nIGEgYmluZGluZywgCisgICAgICAgICAgICAgIHRoZSBiaW5kaW5nIG1heSBjaG9vc2UgdG8gZW1pdCBhIG5hdGl2ZSBzaWduYWwgb24gYSBwcm94eSBvYmplY3QuIElmIHVzaW5nIHRoZSAKKyAgICAgICAgICAgICAgbG93LWxldmVsIEFQSSwgdGhlIHByb2Nlc3MgbWF5IGp1c3QgbG9vayBhdCB0aGUgc2lnbmFsIHNlbmRlciBhbmQgbmFtZSBhbmQgZGVjaWRlCisgICAgICAgICAgICAgIHdoYXQgdG8gZG8gYmFzZWQgb24gdGhhdC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgIDwvcGFyYT4KKworICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9ImludHJvc3BlY3Rpb24iPgorICAgICAgPHRpdGxlPkludHJvc3BlY3Rpb248L3RpdGxlPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgRC1CdXMgb2JqZWN0cyBtYXkgc3VwcG9ydCB0aGUgaW50ZXJmYWNlIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkludHJvc3BlY3RhYmxlPC9saXRlcmFsPi4KKyAgICAgICAgVGhpcyBpbnRlcmZhY2UgaGFzIG9uZSBtZXRob2QgPGxpdGVyYWw+SW50cm9zcGVjdDwvbGl0ZXJhbD4gd2hpY2ggdGFrZXMgbm8gYXJndW1lbnRzIGFuZCByZXR1cm5zCisgICAgICAgIGFuIFhNTCBzdHJpbmcuIFRoZSBYTUwgc3RyaW5nIGRlc2NyaWJlcyB0aGUgaW50ZXJmYWNlcywgbWV0aG9kcywgYW5kIHNpZ25hbHMgb2YgdGhlIG9iamVjdC4KKyAgICAgICAgU2VlIHRoZSBELUJ1cyBzcGVjaWZpY2F0aW9uIGZvciBtb3JlIGRldGFpbHMgb24gdGhpcyBpbnRyb3NwZWN0aW9uIGZvcm1hdC4KKyAgICAgIDwvcGFyYT4KKworICAgIDwvc2VjdDI+CisKKyAgPC9zZWN0MT4KKworICA8c2VjdDEgaWQ9ImdsaWItY2xpZW50Ij4KKyAgICA8dGl0bGU+R0xpYiBBUEk6IFVzaW5nIFJlbW90ZSBPYmplY3RzPC90aXRsZT4KKworICAgIDxwYXJhPgorICAgICAgVGhlIEdMaWIgYmluZGluZyBpcyBkZWZpbmVkIGluIHRoZSBoZWFkZXIgZmlsZQorICAgICAgPGxpdGVyYWw+Jmx0O2RidXMvZGJ1cy1nbGliLmgmZ3Q7PC9saXRlcmFsPi4KKyAgICA8L3BhcmE+CisKKyAgICA8c2VjdDIgaWQ9ImdsaWItdHlwZW1hcHBpbmdzIj4KKyAgICAgIDx0aXRsZT5ELUJ1cyAtIEdMaWIgdHlwZSBtYXBwaW5nczwvdGl0bGU+CisgICAgICA8cGFyYT4KKwlUaGUgaGVhcnQgb2YgdGhlIEdMaWIgYmluZGluZ3MgZm9yIEQtQnVzIGlzIHRoZSBtYXBwaW5nIGl0CisJcHJvdmlkZXMgYmV0d2VlbiBELUJ1cyAidHlwZSBzaWduYXR1cmVzIiBhbmQgR0xpYiB0eXBlcworCSg8bGl0ZXJhbD5HVHlwZTwvbGl0ZXJhbD4pLiBUaGUgRC1CdXMgdHlwZSBzeXN0ZW0gaXMgY29tcG9zZWQgb2YKKwlhIG51bWJlciBvZiAiYmFzaWMiIHR5cGVzLCBhbG9uZyB3aXRoIHNldmVyYWwgImNvbnRhaW5lciIgdHlwZXMuCisgICAgICA8L3BhcmE+CisgICAgICA8c2VjdDMgaWQ9ImdsaWItYmFzaWMtdHlwZW1hcHBpbmdzIj4KKwk8dGl0bGU+QmFzaWMgdHlwZSBtYXBwaW5nczwvdGl0bGU+CisJPHBhcmE+CisJICBCZWxvdyBpcyBhIGxpc3Qgb2YgdGhlIGJhc2ljIHR5cGVzLCBhbG9uZyB3aXRoIHRoZWlyIGFzc29jaWF0ZWQKKwkgIG1hcHBpbmcgdG8gYSA8bGl0ZXJhbD5HVHlwZTwvbGl0ZXJhbD4uCisJICA8aW5mb3JtYWx0YWJsZT4KKwkgICAgPHRncm91cCBjb2xzPSI0Ij4KKwkgICAgICA8dGhlYWQ+CisJCTxyb3c+CisJCSAgPGVudHJ5PkQtQnVzIGJhc2ljIHR5cGU8L2VudHJ5PgorCQkgIDxlbnRyeT5HVHlwZTwvZW50cnk+CisJCSAgPGVudHJ5PkZyZWUgZnVuY3Rpb248L2VudHJ5PgorCQkgIDxlbnRyeT5Ob3RlczwvZW50cnk+CisJCTwvcm93PgorCSAgICAgIDwvdGhlYWQ+CisJICAgICAgPHRib2R5PgorCQk8cm93PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5CWVRFPC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PjxsaXRlcmFsPkdfVFlQRV9VQ0hBUjwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT48L2VudHJ5PgorCQkgIDxlbnRyeT48L2VudHJ5PgorCQkgIDwvcm93Pjxyb3c+CisJCSAgPGVudHJ5PjxsaXRlcmFsPkJPT0xFQU48L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+PGxpdGVyYWw+R19UWVBFX0JPT0xFQU48L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+PC9lbnRyeT4KKwkJICA8ZW50cnk+PC9lbnRyeT4KKwkJICA8L3Jvdz48cm93PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5JTlQxNjwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5HX1RZUEVfSU5UPC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PjwvZW50cnk+CisJCSAgPGVudHJ5PldpbGwgYmUgY2hhbmdlZCB0byBhIDxsaXRlcmFsPkdfVFlQRV9JTlQxNjwvbGl0ZXJhbD4gb25jZSBHTGliIGhhcyBpdDwvZW50cnk+CisJCSAgPC9yb3c+PHJvdz4KKwkJICA8ZW50cnk+PGxpdGVyYWw+VUlOVDE2PC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PjxsaXRlcmFsPkdfVFlQRV9VSU5UPC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PjwvZW50cnk+CisJCSAgPGVudHJ5PldpbGwgYmUgY2hhbmdlZCB0byBhIDxsaXRlcmFsPkdfVFlQRV9VSU5UMTY8L2xpdGVyYWw+IG9uY2UgR0xpYiBoYXMgaXQ8L2VudHJ5PgorCQkgIDwvcm93Pjxyb3c+CisJCSAgPGVudHJ5PjxsaXRlcmFsPklOVDMyPC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PjxsaXRlcmFsPkdfVFlQRV9JTlQ8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+PC9lbnRyeT4KKwkJICA8ZW50cnk+V2lsbCBiZSBjaGFuZ2VkIHRvIGEgPGxpdGVyYWw+R19UWVBFX0lOVDMyPC9saXRlcmFsPiBvbmNlIEdMaWIgaGFzIGl0PC9lbnRyeT4KKwkJICA8L3Jvdz48cm93PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5VSU5UMzI8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+PGxpdGVyYWw+R19UWVBFX1VJTlQ8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+PC9lbnRyeT4KKwkJICA8ZW50cnk+V2lsbCBiZSBjaGFuZ2VkIHRvIGEgPGxpdGVyYWw+R19UWVBFX1VJTlQzMjwvbGl0ZXJhbD4gb25jZSBHTGliIGhhcyBpdDwvZW50cnk+CisJCSAgPC9yb3c+PHJvdz4KKwkJICA8ZW50cnk+PGxpdGVyYWw+SU5UNjQ8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+PGxpdGVyYWw+R19UWVBFX0dJTlQ2NDwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT48L2VudHJ5PgorCQkgIDxlbnRyeT48L2VudHJ5PgorCQkgIDwvcm93Pjxyb3c+CisJCSAgPGVudHJ5PjxsaXRlcmFsPlVJTlQ2NDwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5HX1RZUEVfR1VJTlQ2NDwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT48L2VudHJ5PgorCQkgIDxlbnRyeT48L2VudHJ5PgorCQkgIDwvcm93Pjxyb3c+CisJCSAgPGVudHJ5PjxsaXRlcmFsPkRPVUJMRTwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5HX1RZUEVfRE9VQkxFPC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PjwvZW50cnk+CisJCSAgPGVudHJ5PjwvZW50cnk+CisJCSAgPC9yb3c+PHJvdz4KKwkJICA8ZW50cnk+PGxpdGVyYWw+U1RSSU5HPC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PjxsaXRlcmFsPkdfVFlQRV9TVFJJTkc8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+PGxpdGVyYWw+Z19mcmVlPC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PjwvZW50cnk+CisJCSAgPC9yb3c+PHJvdz4KKwkJICA8ZW50cnk+PGxpdGVyYWw+T0JKRUNUX1BBVEg8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+PGxpdGVyYWw+REJVU19UWVBFX0dfUFJPWFk8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+PGxpdGVyYWw+Z19vYmplY3RfdW5yZWY8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+VGhlIHJldHVybmVkIHByb3h5IGRvZXMgbm90IGhhdmUgYW4gaW50ZXJmYWNlIHNldDsgdXNlIDxsaXRlcmFsPmRidXNfZ19wcm94eV9zZXRfaW50ZXJmYWNlPC9saXRlcmFsPiB0byBpbnZva2UgbWV0aG9kczwvZW50cnk+CisJCTwvcm93PgorCSAgICAgIDwvdGJvZHk+CisJICAgIDwvdGdyb3VwPgorCSAgPC9pbmZvcm1hbHRhYmxlPgorCSAgQXMgeW91IGNhbiBzZWUsIHRoZSBiYXNpYyBtYXBwaW5nIGlzIGZhaXJseSBzdHJhaWdodGZvcndhcmQuCisJPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKyAgICAgIDxzZWN0MyBpZD0iZ2xpYi1jb250YWluZXItdHlwZW1hcHBpbmdzIj4KKwk8dGl0bGU+Q29udGFpbmVyIHR5cGUgbWFwcGluZ3M8L3RpdGxlPgorCTxwYXJhPgorCSAgVGhlIEQtQnVzIHR5cGUgc3lzdGVtIGFsc28gaGFzIGEgbnVtYmVyIG9mICJjb250YWluZXIiCisJICB0eXBlcywgc3VjaCBhcyA8bGl0ZXJhbD5EQlVTX1RZUEVfQVJSQVk8L2xpdGVyYWw+IGFuZAorCSAgPGxpdGVyYWw+REJVU19UWVBFX1NUUlVDVDwvbGl0ZXJhbD4uICBUaGUgRC1CdXMgdHlwZSBzeXN0ZW0KKwkgIGlzIGZ1bGx5IHJlY3Vyc2l2ZSwgc28gb25lIGNhbiBmb3IgZXhhbXBsZSBoYXZlIGFuIGFycmF5IG9mCisJICBhcnJheSBvZiBzdHJpbmdzIChpLmUuIHR5cGUgc2lnbmF0dXJlCisJICA8bGl0ZXJhbD5hYXM8L2xpdGVyYWw+KS4KKwk8L3BhcmE+CisJPHBhcmE+CisJICBIb3dldmVyLCBub3QgYWxsIG9mIHRoZXNlIHR5cGVzIGFyZSBpbiBjb21tb24gdXNlOyBmb3IKKwkgIGV4YW1wbGUsIGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZyB0aGUgYXV0aG9yIGtub3dzIG9mIG5vCisJICBvbmUgdXNpbmcgPGxpdGVyYWw+REJVU19UWVBFX1NUUlVDVDwvbGl0ZXJhbD4sIG9yIGEKKwkgIDxsaXRlcmFsPkRCVVNfVFlQRV9BUlJBWTwvbGl0ZXJhbD4gY29udGFpbmluZyBhbnkgbm9uLWJhc2ljCisJICB0eXBlLiAgVGhlIGFwcHJvYWNoIHRoZSBHTGliIGJpbmRpbmdzIHRha2UgaXMgcHJhZ21hdGljOyB0cnkKKwkgIHRvIG1hcCB0aGUgbW9zdCBjb21tb24gdHlwZXMgaW4gdGhlIG1vc3Qgb2J2aW91cyB3YXksIGFuZAorCSAgbGV0IHVzaW5nIGxlc3MgY29tbW9uIGFuZCBtb3JlIGNvbXBsZXggdHlwZXMgYmUgbGVzcworCSAgIm5hdHVyYWwiLgorCTwvcGFyYT4KKwk8cGFyYT4KKwkgIEZpcnN0LCBELUJ1cyB0eXBlIHNpZ25hdHVyZXMgd2hpY2ggaGF2ZSBhbiAib2J2aW91cyIKKwkgIGNvcnJlc3BvbmRpbmcgYnVpbHQtaW4gR0xpYiB0eXBlIGFyZSBtYXBwZWQgdXNpbmcgdGhhdCB0eXBlOgorCSAgPGluZm9ybWFsdGFibGU+CisJICAgIDx0Z3JvdXAgY29scz0iNiI+CisJICAgICAgPHRoZWFkPgorCQk8cm93PgorCQkgIDxlbnRyeT5ELUJ1cyB0eXBlIHNpZ25hdHVyZTwvZW50cnk+CisJCSAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKwkJICA8ZW50cnk+R1R5cGU8L2VudHJ5PgorCQkgIDxlbnRyeT5DIHR5cGVkZWY8L2VudHJ5PgorCQkgIDxlbnRyeT5GcmVlIGZ1bmN0aW9uPC9lbnRyeT4KKwkJICA8ZW50cnk+Tm90ZXM8L2VudHJ5PgorCQk8L3Jvdz4KKwkgICAgICA8L3RoZWFkPgorCSAgICAgIDx0Ym9keT4KKwkJPHJvdz4KKwkJICA8ZW50cnk+PGxpdGVyYWw+YXM8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+QXJyYXkgb2Ygc3RyaW5nczwvZW50cnk+CisJCSAgPGVudHJ5PjxsaXRlcmFsPkdfVFlQRV9TVFJWPC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PjxsaXRlcmFsPmNoYXIgKio8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+PGxpdGVyYWw+Z19zdHJmcmVldjwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT48L2VudHJ5PgorCQkgIDwvcm93Pjxyb3c+CisJCSAgPGVudHJ5PjxsaXRlcmFsPnY8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+R2VuZXJpYyB2YWx1ZSBjb250YWluZXI8L2VudHJ5PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5HX1RZUEVfVkFMVUU8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+PGxpdGVyYWw+R1ZhbHVlICo8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+PGxpdGVyYWw+Z192YWx1ZV91bnNldDwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT5UaGUgY2FsbGluZyBjb252ZW50aW9ucyBmb3IgdmFsdWVzIGV4cGVjdCB0aGF0IG1ldGhvZCBjYWxsZXJzIGhhdmUgYWxsb2NhdGVkIHJldHVybiB2YWx1ZXM7IHNlZSBiZWxvdy48L2VudHJ5PgorCQk8L3Jvdz4KKwkgICAgICA8L3Rib2R5PgorCSAgICA8L3Rncm91cD4KKwkgIDwvaW5mb3JtYWx0YWJsZT4KKwk8L3BhcmE+CisJPHBhcmE+CisJICBUaGUgbmV4dCBtb3N0IGNvbW1vbiByZWN1cnNpdmUgdHlwZSBzaWduYXR1cmVzIGFyZSBhcnJheXMgb2YKKwkgIGJhc2ljIHZhbHVlcy4gIFRoZSBtb3N0IG9idmlvdXMgbWFwcGluZyBmb3IgYXJyYXlzIG9mIGJhc2ljCisJICB0eXBlcyBpcyBhIDxsaXRlcmFsPkdBcnJheTwvbGl0ZXJhbD4uICBOb3csIEdMaWIgZG9lcyBub3QKKwkgIHByb3ZpZGUgYSBidWlsdGluIDxsaXRlcmFsPkdUeXBlPC9saXRlcmFsPiBmb3IKKwkgIDxsaXRlcmFsPkdBcnJheTwvbGl0ZXJhbD4uICBIb3dldmVyLCB3ZSBhY3R1YWxseSBuZWVkIG1vcmUgdGhhbgorCSAgdGhhdCAtIHdlIG5lZWQgYSAicGFyYW1ldGVyaXplZCIgdHlwZSB3aGljaCBpbmNsdWRlcyB0aGUKKwkgIGNvbnRhaW5lZCB0eXBlLiAgV2h5IHdlIG5lZWQgdGhpcyB3ZSB3aWxsIHNlZSBiZWxvdy4KKwk8L3BhcmE+CisJPHBhcmE+CisJICBUaGUgYXBwcm9hY2ggdGFrZW4gaXMgdG8gY3JlYXRlIHRoZXNlIHR5cGVzIGluIHRoZSBELUJ1cyBHTGliCisJICBiaW5kaW5nczsgaG93ZXZlciwgdGhlcmUgaXMgbm90aGluZyBELUJ1cyBzcGVjaWZpYyBhYm91dCB0aGVtLgorCSAgSW4gdGhlIGZ1dHVyZSwgd2UgaG9wZSB0byBpbmNsdWRlIHN1Y2ggImZ1bmRhbWVudGFsIiB0eXBlcyBpbiBHTGliCisJICBpdHNlbGYuCisJICA8aW5mb3JtYWx0YWJsZT4KKwkgICAgPHRncm91cCBjb2xzPSI2Ij4KKwkgICAgICA8dGhlYWQ+CisJCTxyb3c+CisJCSAgPGVudHJ5PkQtQnVzIHR5cGUgc2lnbmF0dXJlPC9lbnRyeT4KKwkJICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorCQkgIDxlbnRyeT5HVHlwZTwvZW50cnk+CisJCSAgPGVudHJ5PkMgdHlwZWRlZjwvZW50cnk+CisJCSAgPGVudHJ5PkZyZWUgZnVuY3Rpb248L2VudHJ5PgorCQkgIDxlbnRyeT5Ob3RlczwvZW50cnk+CisJCTwvcm93PgorCSAgICAgIDwvdGhlYWQ+CisJICAgICAgPHRib2R5PgorCQk8cm93PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5heTwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT5BcnJheSBvZiBieXRlczwvZW50cnk+CisJCSAgPGVudHJ5PjxsaXRlcmFsPkRCVVNfVFlQRV9HX0JZVEVfQVJSQVk8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+PGxpdGVyYWw+R0FycmF5ICo8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+Z19hcnJheV9mcmVlPC9lbnRyeT4KKwkJICA8ZW50cnk+PC9lbnRyeT4KKwkJPC9yb3c+CisJCTxyb3c+CisJCSAgPGVudHJ5PjxsaXRlcmFsPmF1PC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PkFycmF5IG9mIHVpbnQ8L2VudHJ5PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5EQlVTX1RZUEVfR19VSU5UX0FSUkFZPC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PjxsaXRlcmFsPkdBcnJheSAqPC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PmdfYXJyYXlfZnJlZTwvZW50cnk+CisJCSAgPGVudHJ5PjwvZW50cnk+CisJCTwvcm93PgorCQk8cm93PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5haTwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT5BcnJheSBvZiBpbnQ8L2VudHJ5PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5EQlVTX1RZUEVfR19JTlRfQVJSQVk8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+PGxpdGVyYWw+R0FycmF5ICo8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+Z19hcnJheV9mcmVlPC9lbnRyeT4KKwkJICA8ZW50cnk+PC9lbnRyeT4KKwkJPC9yb3c+CisJCTxyb3c+CisJCSAgPGVudHJ5PjxsaXRlcmFsPmF4PC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PkFycmF5IG9mIGludDY0PC9lbnRyeT4KKwkJICA8ZW50cnk+PGxpdGVyYWw+REJVU19UWVBFX0dfSU5UNjRfQVJSQVk8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+PGxpdGVyYWw+R0FycmF5ICo8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+Z19hcnJheV9mcmVlPC9lbnRyeT4KKwkJICA8ZW50cnk+PC9lbnRyeT4KKwkJPC9yb3c+CisJCTxyb3c+CisJCSAgPGVudHJ5PjxsaXRlcmFsPmF0PC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PkFycmF5IG9mIHVpbnQ2NDwvZW50cnk+CisJCSAgPGVudHJ5PjxsaXRlcmFsPkRCVVNfVFlQRV9HX1VJTlQ2NF9BUlJBWTwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5HQXJyYXkgKjwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT5nX2FycmF5X2ZyZWU8L2VudHJ5PgorCQkgIDxlbnRyeT48L2VudHJ5PgorCQk8L3Jvdz4KKwkJPHJvdz4KKwkJICA8ZW50cnk+PGxpdGVyYWw+YWQ8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+QXJyYXkgb2YgZG91YmxlPC9lbnRyeT4KKwkJICA8ZW50cnk+PGxpdGVyYWw+REJVU19UWVBFX0dfRE9VQkxFX0FSUkFZPC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PjxsaXRlcmFsPkdBcnJheSAqPC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PmdfYXJyYXlfZnJlZTwvZW50cnk+CisJCSAgPGVudHJ5PjwvZW50cnk+CisJCTwvcm93PgorCQk8cm93PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5hYjwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT5BcnJheSBvZiBib29sZWFuPC9lbnRyeT4KKwkJICA8ZW50cnk+PGxpdGVyYWw+REJVU19UWVBFX0dfQk9PTEVBTl9BUlJBWTwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5HQXJyYXkgKjwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT5nX2FycmF5X2ZyZWU8L2VudHJ5PgorCQkgIDxlbnRyeT48L2VudHJ5PgorCQk8L3Jvdz4KKwkgICAgICA8L3Rib2R5PgorCSAgICA8L3Rncm91cD4KKwkgIDwvaW5mb3JtYWx0YWJsZT4KKwk8L3BhcmE+CisJPHBhcmE+CisJICBELUJ1cyBhbHNvIGluY2x1ZGVzIGEgc3BlY2lhbCB0eXBlIERCVVNfVFlQRV9ESUNUX0VOVFJZIHdoaWNoCisJICBpcyBvbmx5IHZhbGlkIGluIGFycmF5cy4gIEl0J3MgaW50ZW5kZWQgdG8gYmUgbWFwcGVkIHRvIGEgImRpY3Rpb25hcnkiCisJICB0eXBlIGJ5IGJpbmRpbmdzLiAgVGhlIG9idmlvdXMgR0xpYiBtYXBwaW5nIGhlcmUgaXMgR0hhc2hUYWJsZS4gIEFnYWluLAorCSAgaG93ZXZlciwgdGhlcmUgaXMgbm8gYnVpbHRpbiA8bGl0ZXJhbD5HVHlwZTwvbGl0ZXJhbD4gZm9yIGEgR0hhc2hUYWJsZS4KKwkgIE1vcmVvdmVyLCBqdXN0IGxpa2UgZm9yIGFycmF5cywgd2UgbmVlZCBhIHBhcmFtZXRlcml6ZWQgdHlwZSBzbyB0aGF0CisJICB0aGUgYmluZGluZ3MgY2FuIGNvbW11bmlhdGUgd2hpY2ggdHlwZXMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgaGFzaCB0YWJsZS4KKwk8L3BhcmE+CisJPHBhcmE+CisJICBBdCBwcmVzZW50LCBvbmx5IHN0cmluZ3MgYXJlIHN1cHBvcnRlZC4gIFdvcmsgaXMgaW4gcHJvZ3Jlc3MgdG8KKwkgIGluY2x1ZGUgbW9yZSB0eXBlcy4KKwkgIDxpbmZvcm1hbHRhYmxlPgorCSAgICA8dGdyb3VwIGNvbHM9IjYiPgorCSAgICAgIDx0aGVhZD4KKwkJPHJvdz4KKwkJICA8ZW50cnk+RC1CdXMgdHlwZSBzaWduYXR1cmU8L2VudHJ5PgorCQkgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisJCSAgPGVudHJ5PkdUeXBlPC9lbnRyeT4KKwkJICA8ZW50cnk+QyB0eXBlZGVmPC9lbnRyeT4KKwkJICA8ZW50cnk+RnJlZSBmdW5jdGlvbjwvZW50cnk+CisJCSAgPGVudHJ5Pk5vdGVzPC9lbnRyeT4KKwkJPC9yb3c+CisJICAgICAgPC90aGVhZD4KKwkgICAgICA8dGJvZHk+CisJCTxyb3c+CisJCSAgPGVudHJ5PjxsaXRlcmFsPmF7c3N9PC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PkRpY3Rpb25hcnkgbWFwcGluZyBzdHJpbmdzIHRvIHN0cmluZ3M8L2VudHJ5PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5EQlVTX1RZUEVfR19TVFJJTkdfU1RSSU5HX0hBU0hUQUJMRTwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5HSGFzaFRhYmxlICo8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+Z19oYXNoX3RhYmxlX2Rlc3Ryb3k8L2VudHJ5PgorCQkgIDxlbnRyeT48L2VudHJ5PgorCQk8L3Jvdz4KKwkgICAgICA8L3Rib2R5PgorCSAgICA8L3Rncm91cD4KKwkgIDwvaW5mb3JtYWx0YWJsZT4KKwk8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgICAgPHNlY3QzIGlkPSJnbGliLWdlbmVyaWMtdHlwZW1hcHBpbmdzIj4KKwk8dGl0bGU+QXJiaXRyYXJpbHkgcmVjdXJzaXZlIHR5cGUgbWFwcGluZ3M8L3RpdGxlPgorCTxwYXJhPgorCSAgRmluYWxseSwgaXQgaXMgcG9zc2libGUgdXNlcnMgd2lsbCB3YW50IHRvIHdyaXRlIG9yIGludm9rZSBELUJ1cworCSAgbWV0aG9kcyB3aGljaCBoYXZlIGFyYml0cmFyaWx5IGNvbXBsZXggdHlwZSBzaWduYXR1cmVzIG5vdAorCSAgZGlyZWN0bHkgc3VwcG9ydGVkIGJ5IHRoZXNlIGJpbmRpbmdzLiAgRm9yIHRoaXMgY2FzZSwgd2UgaGF2ZSBhCisJICA8bGl0ZXJhbD5EQnVzR1ZhbHVlPC9saXRlcmFsPiB3aGljaCBhY3RzIGFzIGEga2luZCBvZiBzcGVjaWFsCisJICB2YXJpYW50IHZhbHVlIHdoaWNoIG1heSBiZSBpdGVyYXRlZCBvdmVyIG1hbnVhbGx5LiAgVGhlCisJICA8bGl0ZXJhbD5HVHlwZTwvbGl0ZXJhbD4gYXNzb2NpYXRlZCBpcworCSAgPGxpdGVyYWw+REJVU19UWVBFX0dfVkFMVUU8L2xpdGVyYWw+LgorCTwvcGFyYT4KKwk8cGFyYT4KKwkgIFRPRE8gaW5zZXJ0IHVzYWdlIG9mIDxsaXRlcmFsPkRCVVNfVFlQRV9HX1ZBTFVFPC9saXRlcmFsPiBoZXJlLgorCTwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9InNhbXBsZS1wcm9ncmFtLTEiPgorICAgICAgPHRpdGxlPkEgc2FtcGxlIHByb2dyYW08L3RpdGxlPgorICAgICAgPHBhcmE+SGVyZSBpcyBhIEQtQnVzIHByb2dyYW0gdXNpbmcgdGhlIEdMaWIgYmluZGluZ3MuCis8cHJvZ3JhbWxpc3Rpbmc+ICAgICAgCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgREJ1c0dDb25uZWN0aW9uICpjb25uZWN0aW9uOworICBHRXJyb3IgKmVycm9yOworICBEQnVzR1Byb3h5ICpwcm94eTsKKyAgY2hhciAqKm5hbWVfbGlzdDsKKyAgY2hhciAqKm5hbWVfbGlzdF9wdHI7CisgIAorICBnX3R5cGVfaW5pdCAoKTsKKworICBlcnJvciA9IE5VTEw7CisgIGNvbm5lY3Rpb24gPSBkYnVzX2dfYnVzX2dldCAoREJVU19CVVNfU0VTU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYW1wO2Vycm9yKTsKKyAgaWYgKGNvbm5lY3Rpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICBnX3ByaW50ZXJyICgiRmFpbGVkIHRvIG9wZW4gY29ubmVjdGlvbiB0byBidXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgZXJyb3ItJmd0O21lc3NhZ2UpOworICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgLyogQ3JlYXRlIGEgcHJveHkgb2JqZWN0IGZvciB0aGUgImJ1cyBkcml2ZXIiIChuYW1lICJvcmcuZnJlZWRlc2t0b3AuREJ1cyIpICovCisgIAorICBwcm94eSA9IGRidXNfZ19wcm94eV9uZXdfZm9yX25hbWUgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUyk7CisKKyAgLyogQ2FsbCBMaXN0TmFtZXMgbWV0aG9kLCB3YWl0IGZvciByZXBseSAqLworICBlcnJvciA9IE5VTEw7CisgIGlmICghZGJ1c19nX3Byb3h5X2NhbGwgKHByb3h5LCAiTGlzdE5hbWVzIiwgJmFtcDtlcnJvciwgR19UWVBFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdfVFlQRV9TVFJWLCAmYW1wO25hbWVfbGlzdCwgR19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIC8qIEp1c3QgZG8gZGVtb25zdHJhdGUgcmVtb3RlIGV4Y2VwdGlvbnMgdmVyc3VzIHJlZ3VsYXIgR0Vycm9yICovCisgICAgICBpZiAoZXJyb3ItPmRvbWFpbiA9PSBEQlVTX0dFUlJPUiAmYW1wOyZhbXA7IGVycm9yLT5jb2RlID09IERCVVNfR0VSUk9SX1JFTU9URV9FWENFUFRJT04pCisgICAgICAgIGdfcHJpbnRlcnIgKCJDYXVnaHQgcmVtb3RlIG1ldGhvZCBleGNlcHRpb24gJXM6ICVzIiwKKwkgICAgICAgICAgICBkYnVzX2dfZXJyb3JfZ2V0X25hbWUgKGVycm9yKSwKKwkgICAgICAgICAgICBlcnJvci0mZ3Q7bWVzc2FnZSk7CisgICAgICBlbHNlCisgICAgICAgIGdfcHJpbnRlcnIgKCJFcnJvcjogJXNcbiIsIGVycm9yLSZndDttZXNzYWdlKTsKKyAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIC8qIFByaW50IHRoZSByZXN1bHRzICovCisgCisgIGdfcHJpbnQgKCJOYW1lcyBvbiB0aGUgbWVzc2FnZSBidXM6XG4iKTsKKyAgCisgIGZvciAobmFtZV9saXN0X3B0ciA9IG5hbWVfbGlzdDsgKm5hbWVfbGlzdF9wdHI7IG5hbWVfbGlzdF9wdHIrKykKKyAgICB7CisgICAgICBnX3ByaW50ICgiICAlc1xuIiwgKm5hbWVfbGlzdF9wdHIpOworICAgIH0KKyAgZ19zdHJmcmVldiAobmFtZV9saXN0KTsKKworICBnX29iamVjdF91bnJlZiAocHJveHkpOworCisgIHJldHVybiAwOworfQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9ImdsaWItcHJvZ3JhbS1zZXR1cCI+CisgICAgICA8dGl0bGU+UHJvZ3JhbSBpbml0YWxpemF0aW9uPC90aXRsZT4KKyAgICAgIDxwYXJhPgorCUEgY29ubmVjdGlvbiB0byB0aGUgYnVzIGlzIGFjcXVpcmVkIHVzaW5nCisJPGxpdGVyYWw+ZGJ1c19nX2J1c19nZXQ8L2xpdGVyYWw+LiAgTmV4dCwgYSBwcm94eQorCWlzIGNyZWF0ZWQgZm9yIHRoZSBvYmplY3QgIi9vcmcvZnJlZWRlc2t0b3AvREJ1cyIgd2l0aAorCWludGVyZmFjZSA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1czwvbGl0ZXJhbD4KKwlvbiB0aGUgc2VydmljZSA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1czwvbGl0ZXJhbD4uCisJVGhpcyBpcyBhIHByb3h5IGZvciB0aGUgbWVzc2FnZSBidXMgaXRzZWxmLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJnbGliLW1ldGhvZC1pbnZvY2F0aW9uIj4KKyAgICAgIDx0aXRsZT5VbmRlcnN0YW5kaW5nIG1ldGhvZCBpbnZvY2F0aW9uPC90aXRsZT4KKyAgICAgIDxwYXJhPgorCVlvdSBoYXZlIGEgbnVtYmVyIG9mIGNob2ljZXMgZm9yIG1ldGhvZCBpbnZvY2F0aW9uLiAgRmlyc3QsIGFzCisJdXNlZCBhYm92ZSwgPGxpdGVyYWw+ZGJ1c19nX3Byb3h5X2NhbGw8L2xpdGVyYWw+IHNlbmRzIGEKKwltZXRob2QgY2FsbCB0byB0aGUgcmVtb3RlIG9iamVjdCwgYW5kIGJsb2NrcyB1bnRpbCBhIHJlcGx5IGlzCisJcmVjaWV2ZWQuICBUaGUgb3V0Z29pbmcgYXJndW1lbnRzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIHZhcmFyZ3MKKwlhcnJheSwgdGVybWluYXRlZCB3aXRoIDxsaXRlcmFsPkdfVFlQRV9JTlZBTElEPC9saXRlcmFsPi4KKwlOZXh0LCBwb2ludGVycyB0byByZXR1cm4gdmFsdWVzIGFyZSBzcGVjaWZpZWQsIGZvbGxvd2VkIGFnYWluCisJYnkgPGxpdGVyYWw+R19UWVBFX0lOVkFMSUQ8L2xpdGVyYWw+LgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisJVG8gaW52b2tlIGEgbWV0aG9kIGFzeW5jaHJvbm91c2x5LCB1c2UKKwk8bGl0ZXJhbD5kYnVzX2dfcHJveHlfYmVnaW5fY2FsbDwvbGl0ZXJhbD4uICBUaGlzIHJldHVybnMgYQorCTxsaXRlcmFsPkRCdXNHUGVuZGluZ0NhbGw8L2xpdGVyYWw+IG9iamVjdDsgeW91IG1heSB0aGVuIHNldCBhCisJbm90aWZpY2F0aW9uIGZ1bmN0aW9uIHVzaW5nCisJPGxpdGVyYWw+ZGJ1c19nX3BlbmRpbmdfY2FsbF9zZXRfbm90aWZ5PC9saXRlcmFsPi4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0iZ2xpYi1zaWduYWwtY29ubmVjdGlvbiI+CisgICAgICA8dGl0bGU+Q29ubmVjdGluZyB0byBvYmplY3Qgc2lnbmFsczwvdGl0bGU+CisgICAgICA8cGFyYT4KKwlZb3UgbWF5IGNvbm5lY3QgdG8gc2lnbmFscyB1c2luZworCTxsaXRlcmFsPmRidXNfZ19wcm94eV9hZGRfc2lnbmFsPC9saXRlcmFsPiBhbmQKKwk8bGl0ZXJhbD5kYnVzX2dfcHJveHlfY29ubmVjdF9zaWduYWw8L2xpdGVyYWw+LiAgWW91IG11c3QKKwlpbnZva2UgPGxpdGVyYWw+ZGJ1c19nX3Byb3h5X2FkZF9zaWduYWw8L2xpdGVyYWw+IHRvIHNwZWNpZnkKKwl0aGUgc2lnbmF0dXJlIG9mIHlvdXIgc2lnbmFsIGhhbmRsZXJzOyB5b3UgbWF5IHRoZW4gaW52b2tlCisJPGxpdGVyYWw+ZGJ1c19nX3Byb3h5X2Nvbm5lY3Rfc2lnbmFsPC9saXRlcmFsPiBtdWx0aXBsZSB0aW1lcy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorCU5vdGUgdGhhdCBpdCB3aWxsIG9mdGVuIGJlIHRoZSBjYXNlIHRoYXQgdGhlcmUgaXMgbm8gYnVpbHRpbgorCW1hcnNoYWxsZXIgZm9yIHRoZSB0eXBlIHNpZ25hdHVyZSBvZiBhIHJlbW90ZSBzaWduYWwuICBJbiB0aGF0CisJY2FzZSwgeW91IG11c3QgZ2VuZXJhdGUgYSBtYXJzaGFsbGVyIHlvdXJzZWxmIGJ5IHVzaW5nCisJPGFwcGxpY2F0aW9uPmdsaWItZ2VubWFyc2hhbDwvYXBwbGljYXRpb24+LCBhbmQgdGhlbiByZWdpc3RlcgorCWl0IHVzaW5nIDxsaXRlcmFsPmRidXNfZ19vYmplY3RfcmVnaXN0ZXJfbWFyc2hhbGxlcjwvbGl0ZXJhbD4uCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9ImdsaWItZXJyb3ItaGFuZGxpbmciPgorICAgICAgPHRpdGxlPkVycm9yIGhhbmRsaW5nIGFuZCByZW1vdGUgZXhjZXB0aW9uczwvdGl0bGU+CisgICAgICA8cGFyYT4KKwlBbGwgb2YgdGhlIEdMaWIgYmluZGluZyBtZXRob2RzIHN1Y2ggYXMKKwk8bGl0ZXJhbD5kYnVzX2dfcHJveHlfZW5kX2NhbGw8L2xpdGVyYWw+IHJldHVybiBhCisJPGxpdGVyYWw+R0Vycm9yPC9saXRlcmFsPi4gIFRoaXMgPGxpdGVyYWw+R0Vycm9yPC9saXRlcmFsPiBjYW4KKwlyZXByZXNlbnQgdHdvIGRpZmZlcmVudCB0aGluZ3M6CisgICAgICA8aXRlbWl6ZWRsaXN0PgorCTxsaXN0aXRlbT4KKwkgIDxwYXJhPgorCSAgICBBbiBpbnRlcm5hbCBELUJ1cyBlcnJvciwgc3VjaCBhcyBhbiBvdXQtb2YtbWVtb3J5CisJICAgIGNvbmRpdGlvbiwgYW4gSS9PIGVycm9yLCBvciBhIG5ldHdvcmsgdGltZW91dC4gIEVycm9ycworCSAgICBnZW5lcmF0ZWQgYnkgdGhlIEQtQnVzIGxpYnJhcnkgaXRzZWxmIGhhdmUgdGhlIGRvbWFpbgorCSAgICA8bGl0ZXJhbD5EQlVTX0dFUlJPUjwvbGl0ZXJhbD4sIGFuZCBhIGNvcnJlc3BvbmRpbmcgY29kZQorCSAgICBzdWNoIGFzIDxsaXRlcmFsPkRCVVNfR0VSUk9SX05PX01FTU9SWTwvbGl0ZXJhbD4uICBJdCB3aWxsCisJICAgIG5vdCBiZSB0eXBpY2FsIGZvciBhcHBsaWNhdGlvbnMgdG8gaGFuZGxlIHRoZXNlIGVycm9ycworCSAgICBzcGVjaWZpY2FsbHkuCisJICA8L3BhcmE+CisJPC9saXN0aXRlbT4KKwk8bGlzdGl0ZW0+CisJICA8cGFyYT4KKwkgICAgQSByZW1vdGUgRC1CdXMgZXhjZXB0aW9uLCB0aHJvd24gYnkgdGhlIHBlZXIsIGJ1cywgb3IKKwkgICAgc2VydmljZS4gIEQtQnVzIHJlbW90ZSBleGNlcHRpb25zIGhhdmUgYm90aCBhIHRleHR1YWwKKwkgICAgIm5hbWUiIGFuZCBhICJtZXNzYWdlIi4gIFRoZSBHTGliIGJpbmRpbmdzIHN0b3JlIHRoaXMKKwkgICAgaW5mb3JtYXRpb24gaW4gdGhlIDxsaXRlcmFsPkdFcnJvcjwvbGl0ZXJhbD4sIGJ1dCBzb21lCisJICAgIHNwZWNpYWwgcnVsZXMgYXBwbHkuCisJICA8L3BhcmE+CisJICA8cGFyYT4KKwkgICAgVGhlIHNldCBlcnJvciB3aWxsIGhhdmUgdGhlIGRvbWFpbgorCSAgICA8bGl0ZXJhbD5EQlVTX0dFUlJPUjwvbGl0ZXJhbD4gYXMgYWJvdmUsIGFuZCB3aWxsIGFsc28KKwkgICAgaGF2ZSB0aGUgY29kZQorCSAgICA8bGl0ZXJhbD5EQlVTX0dFUlJPUl9SRU1PVEVfRVhDRVBUSU9OPC9saXRlcmFsPi4gIEluIG9yZGVyCisJICAgIHRvIGFjY2VzcyB0aGUgcmVtb3RlIGV4Y2VwdGlvbiBuYW1lLCB5b3UgbXVzdCB1c2UgYQorCSAgICBzcGVjaWFsIGFjY2Vzc29yLCBzdWNoIGFzCisJICAgIDxsaXRlcmFsPmRidXNfZ19lcnJvcl9oYXNfbmFtZTwvbGl0ZXJhbD4gb3IKKwkgICAgPGxpdGVyYWw+ZGJ1c19nX2Vycm9yX2dldF9uYW1lPC9saXRlcmFsPi4gIFRoZSByZW1vdGUKKwkgICAgZXhjZXB0aW9uIGRldGFpbGVkIG1lc3NhZ2UgaXMgYWNjZXNzaWJsZSB2aWEgdGhlIHJlZ3VsYXIKKwkgICAgR0Vycm9yIDxsaXRlcmFsPm1lc3NhZ2U8L2xpdGVyYWw+IG1lbWJlci4KKwkgIDwvcGFyYT4KKwk8L2xpc3RpdGVtPgorICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9ImdsaWItbW9yZS1leGFtcGxlcyI+CisgICAgICA8dGl0bGU+TW9yZSBleGFtcGxlcyBvZiBtZXRob2QgaW52b2NhdGlvbjwvdGl0bGU+CisgICAgICA8c2VjdDMgaWQ9ImdsaWItc2VuZGluZy1zdHVmZiI+CisJPHRpdGxlPlNlbmRpbmcgYW4gaW50ZWdlciBhbmQgc3RyaW5nLCByZWNlaXZpbmcgYW4gYXJyYXkgb2YgYnl0ZXM8L3RpdGxlPgorCTxwYXJhPgorPHByb2dyYW1saXN0aW5nPgorICBHQXJyYXkgKmFycjsKKyAgCisgIGVycm9yID0gTlVMTDsKKyAgaWYgKCFkYnVzX2dfcHJveHlfY2FsbCAocHJveHksICJGb29iYXIiLCAmYW1wO2Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHX1RZUEVfSU5ULCA0MiwgR19UWVBFX1NUUklORywgImhlbGxvIiwKKwkJCSAgR19UWVBFX0lOVkFMSUQsCisJCQkgIERCVVNfVFlQRV9HX1VDSEFSX0FSUkFZLCAmYW1wO2FyciwgR19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIC8qIEhhbmRsZSBlcnJvciAqLworICAgIH0KKyAgIGdfYXNzZXJ0IChhcnIgIT0gTlVMTCk7CisgICBwcmludGYgKCJnb3QgYmFjayAldSB2YWx1ZXMiLCBhcnItPmxlbik7Cis8L3Byb2dyYW1saXN0aW5nPgorCTwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgICA8c2VjdDMgaWQ9ImdsaWItc2VuZGluZy1oYXNoIj4KKwk8dGl0bGU+U2VuZGluZyBhIEdIYXNoVGFibGU8L3RpdGxlPgorCTxwYXJhPgorPHByb2dyYW1saXN0aW5nPgorICBHSGFzaFRhYmxlICpoYXNoID0gZ19oYXNoX3RhYmxlX25ldyAoZ19zdHJfaGFzaCwgZ19zdHJfZXF1YWwpOworICBndWludDMyIHJldDsKKyAgCisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKGhhc2gsICJmb28iLCAiYmFyIik7CisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKGhhc2gsICJiYXoiLCAid2hlZSIpOworCisgIGVycm9yID0gTlVMTDsKKyAgaWYgKCFkYnVzX2dfcHJveHlfY2FsbCAocHJveHksICJIYXNoU2l6ZSIsICZhbXA7ZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9HX1NUUklOR19TVFJJTkdfSEFTSCwgaGFzaCwgR19UWVBFX0lOVkFMSUQsCisJCQkgIEdfVFlQRV9VSU5ULCAmYW1wO3JldCwgR19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIC8qIEhhbmRsZSBlcnJvciAqLworICAgIH0KKyAgZ19hc3NlcnQgKHJldCA9PSAyKTsKKyAgZ19oYXNoX3RhYmxlX2Rlc3Ryb3kgKGhhc2gpOworPC9wcm9ncmFtbGlzdGluZz4KKwk8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgICAgPHNlY3QzIGlkPSJnbGliLXJlY2VpdmluZy1ib29sLWludCI+CisJPHRpdGxlPlJlY2VpdmluZyBhIGJvb2xlYW4gYW5kIGEgc3RyaW5nPC90aXRsZT4KKwk8cGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KKyAgZ2Jvb2xlYW4gYm9vbHJldDsKKyAgY2hhciAqc3RycmV0OworICAKKyAgZXJyb3IgPSBOVUxMOworICBpZiAoIWRidXNfZ19wcm94eV9jYWxsIChwcm94eSwgIkdldFN0dWZmIiwgJmFtcDtlcnJvciwKKwkJCSAgR19UWVBFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdfVFlQRV9CT09MRUFOLCAmYW1wO2Jvb2xyZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdfVFlQRV9TVFJJTkcsICZhbXA7c3RycmV0LAorCQkJICBHX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgLyogSGFuZGxlIGVycm9yICovCisgICAgfQorICBwcmludGYgKCIlcyAlcyIsIGJvb2xyZXQgPyAiVFJVRSIgOiAiRkFMU0UiLCBzdHJyZXQpOworICBnX2ZyZWUgKHN0cnJldCk7Cis8L3Byb2dyYW1saXN0aW5nPgorCTwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgICA8c2VjdDMgaWQ9ImdsaWItc2VuZGluZy1zdHItYXJyYXlzIj4KKwk8dGl0bGU+U2VuZGluZyB0d28gYXJyYXlzIG9mIHN0cmluZ3M8L3RpdGxlPgorCTxwYXJhPgorPHByb2dyYW1saXN0aW5nPgorICAvKiBOVUxMIHRlcm1pbmF0ZSAqLworICBjaGFyICpzdHJzX3N0YXRpY1tdID0geyJmb28iLCAiYmFyIiwgImJheiIsIE5VTEx9OworICAvKiBUYWtlIHBvaW50ZXIgdG8gYXJyYXk7IGNhbm5vdCBwYXNzIGFycmF5IGRpcmVjdGx5ICovCisgIGNoYXIgKipzdHJzX3N0YXRpY19wID0gc3Ryc19zdGF0aWM7CisgIGNoYXIgKipzdHJzX2R5bmFtaWM7CisKKyAgc3Ryc19keW5hbWljID0gZ19uZXcgKGNoYXIgKiwgNCk7CisgIHN0cnNfZHluYW1pY1swXSA9IGdfc3RyZHVwICgiaGVsbG8iKTsKKyAgc3Ryc19keW5hbWljWzFdID0gZ19zdHJkdXAgKCJ3b3JsZCIpOworICBzdHJzX2R5bmFtaWNbMl0gPSBnX3N0cmR1cCAoIiEiKTsKKyAgLyogTlVMTCB0ZXJtaW5hdGUgKi8KKyAgc3Ryc19keW5hbWljWzNdID0gTlVMTDsKKyAgCisgIGVycm9yID0gTlVMTDsKKyAgaWYgKCFkYnVzX2dfcHJveHlfY2FsbCAocHJveHksICJUd29TdHJBcnJheXMiLCAmYW1wO2Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHX1RZUEVfU1RSViwgc3Ryc19zdGF0aWNfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR19UWVBFX1NUUlYsIHN0cnNfZHluYW1pYywKKwkJCSAgR19UWVBFX0lOVkFMSUQsCisJCQkgIEdfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICAvKiBIYW5kbGUgZXJyb3IgKi8KKyAgICB9CisgICBnX3N0cmZyZWV2IChzdHJzX2R5bmFtaWMpOworPC9wcm9ncmFtbGlzdGluZz4KKwk8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgICAgPHNlY3QzIGlkPSJnbGliLWdldHRpbmctc3RyLWFycmF5Ij4KKwk8dGl0bGU+U2VuZGluZyBhIGJvb2xlYW4sIHJlY2VpdmluZyBhbiBhcnJheSBvZiBzdHJpbmdzPC90aXRsZT4KKwk8cGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KKyAgY2hhciAqKnN0cnM7CisgIGNoYXIgKipzdHJzX3A7CisgIGdib29sZWFuIGJsYWg7CisKKyAgZXJyb3IgPSBOVUxMOworICBibGFoID0gVFJVRTsKKyAgaWYgKCFkYnVzX2dfcHJveHlfY2FsbCAocHJveHksICJHZXRTdHJzIiwgJmFtcDtlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR19UWVBFX0JPT0xFQU4sIGJsYWgsCisJCQkgIEdfVFlQRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICBHX1RZUEVfU1RSViwgJmFtcDtzdHJzLAorCQkJICBHX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgLyogSGFuZGxlIGVycm9yICovCisgICAgfQorICAgZm9yIChzdHJzX3AgPSBzdHJzOyAqc3Ryc19wOyBzdHJzX3ArKykKKyAgICAgcHJpbnRmICgiZ290IHN0cmluZzogXCIlc1wiIiwgKnN0cnNfcCk7CisgICBnX3N0cmZyZWV2IChzdHJzKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisJPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKyAgICAgIDxzZWN0MyBpZD0iZ2xpYi1zZW5kaW5nLXZhcmlhbnQiPgorCTx0aXRsZT5TZW5kaW5nIGEgdmFyaWFudDwvdGl0bGU+CisJPHBhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CisgIEdWYWx1ZSB2YWwgPSB7MCwgfTsKKworICBnX3ZhbHVlX2luaXQgKCZhbXA7dmFsLCBHX1RZUEVfU1RSSU5HKTsKKyAgZ192YWx1ZV9zZXRfc3RyaW5nICgmYW1wO3ZhbCwgImhlbGxvIHdvcmxkIik7CisgIAorICBlcnJvciA9IE5VTEw7CisgIGlmICghZGJ1c19nX3Byb3h5X2NhbGwgKHByb3h5LCAiU2VuZFZhcmlhbnQiLCAmYW1wO2Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHX1RZUEVfVkFMVUUsICZhbXA7dmFsLCBHX1RZUEVfSU5WQUxJRCwKKwkJCSAgR19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIC8qIEhhbmRsZSBlcnJvciAqLworICAgIH0KKyAgZ19hc3NlcnQgKHJldCA9PSAyKTsKKyAgZ192YWx1ZV91bnNldCAoJmFtcDt2YWwpOworPC9wcm9ncmFtbGlzdGluZz4KKwk8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgICAgPHNlY3QzIGlkPSJnbGliLXJlY2VpdmluZy12YXJpYW50Ij4KKwk8dGl0bGU+UmVjZWl2aW5nIGEgdmFyaWFudDwvdGl0bGU+CisJPHBhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CisgIEdWYWx1ZSB2YWwgPSB7MCwgfTsKKworICBlcnJvciA9IE5VTEw7CisgIGlmICghZGJ1c19nX3Byb3h5X2NhbGwgKHByb3h5LCAiR2V0VmFyaWFudCIsICZhbXA7ZXJyb3IsIEdfVFlQRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICBHX1RZUEVfVkFMVUUsICZhbXA7dmFsLCBHX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgLyogSGFuZGxlIGVycm9yICovCisgICAgfQorICBpZiAoR19WQUxVRV9UWVBFICgmYW1wO3ZhbCkgPT0gR19UWVBFX1NUUklORykKKyAgICBwcmludGYgKCIlc1xuIiwgZ192YWx1ZV9nZXRfc3RyaW5nICgmYW1wO3ZhbCkpOworICBlbHNlIGlmIChHX1ZBTFVFX1RZUEUgKCZhbXA7dmFsKSA9PSBHX1RZUEVfSU5UKQorICAgIHByaW50ZiAoIiVkXG4iLCBnX3ZhbHVlX2dldF9pbnQgKCZhbXA7dmFsKSk7CisgIGVsc2UKKyAgICAuLi4KKyAgZ192YWx1ZV91bnNldCAoJmFtcDt2YWwpOworPC9wcm9ncmFtbGlzdGluZz4KKwk8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9ImdsaWItZ2VuZXJhdGVkLWJpbmRpbmdzIj4KKyAgICAgIDx0aXRsZT5HZW5lcmF0ZWQgQmluZGluZ3M8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIEJ5IHVzaW5nIHRoZSBJbnRyb3NwZWN0aW9uIFhNTCBmaWxlcywgY29udmVuaWVudCBjbGllbnQtc2lkZSBiaW5kaW5ncworICAgICAgICBjYW4gYmUgYXV0b21hdGljYWxseSBjcmVhdGVkIHRvIGVhc2UgdGhlIHVzZSBvZiBhIHJlbW90ZSBEQnVzIG9iamVjdC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBIZXJlIGlzIGEgc2FtcGxlIFhNTCBmaWxlIHdoaWNoIGRlc2NyaWJlcyBhbiBvYmplY3QgdGhhdCBleHBvc2VzCisgICAgICAgIG9uZSBtZXRob2QsIG5hbWVkIDxsaXRlcmFsPk1hbnlBcmdzPC9saXRlcmFsPi4KKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8mZ3Q7CismbHQ7bm9kZSBuYW1lPSIvY29tL2V4YW1wbGUvTXlPYmplY3QiJmd0OworICAmbHQ7aW50ZXJmYWNlIG5hbWU9ImNvbS5leGFtcGxlLk15T2JqZWN0IiZndDsKKyAgICAmbHQ7bWV0aG9kIG5hbWU9Ik1hbnlBcmdzIiZndDsKKyAgICAgICZsdDthcmcgdHlwZT0idSIgbmFtZT0ieCIgZGlyZWN0aW9uPSJpbiIgLyZndDsKKyAgICAgICZsdDthcmcgdHlwZT0icyIgbmFtZT0ic3RyIiBkaXJlY3Rpb249ImluIiAvJmd0OworICAgICAgJmx0O2FyZyB0eXBlPSJkIiBuYW1lPSJ0cm91YmxlIiBkaXJlY3Rpb249ImluIiAvJmd0OworICAgICAgJmx0O2FyZyB0eXBlPSJkIiBuYW1lPSJkX3JldCIgZGlyZWN0aW9uPSJvdXQiIC8mZ3Q7CisgICAgICAmbHQ7YXJnIHR5cGU9InMiIG5hbWU9InN0cl9yZXQiIGRpcmVjdGlvbj0ib3V0IiAvJmd0OworICAgICZsdDsvbWV0aG9kJmd0OworICAmbHQ7L2ludGVyZmFjZSZndDsKKyZsdDsvbm9kZSZndDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgUnVuIDxsaXRlcmFsPmRidXMtYmluZGluZy10b29sIC0tbW9kZT1nbGliLWNsaWVudAorICAgICAgICAgIDxyZXBsYWNlYWJsZT5GSUxFTkFNRTwvcmVwbGFjZWFibGU+ICZndDsKKyAgICAgICAgICA8cmVwbGFjZWFibGU+SEVBREVSX05BTUU8L3JlcGxhY2VhYmxlPjwvbGl0ZXJhbD4gdG8gZ2VuZXJhdGUgdGhlIGhlYWRlcgorICAgICAgICBmaWxlLiAgRm9yIGV4YW1wbGU6IDxjb21tYW5kPmRidXMtYmluZGluZy10b29sIC0tbW9kZT1nbGliLWNsaWVudAorICAgICAgICAgIG15LW9iamVjdC54bWwgJmd0OyBteS1vYmplY3QtYmluZGluZ3MuaDwvY29tbWFuZD4uICBUaGlzIHdpbGwgZ2VuZXJhdGUKKyAgICAgICAgaW5saW5lIGZ1bmN0aW9ucyB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvdG90eXBlczoKKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorLyogVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwgKi8KK2dib29sZWFuCitjb21fZXhhbXBsZV9NeU9iamVjdF9tYW55X2FyZ3MgKERCdXNHUHJveHkgKnByb3h5LCBjb25zdCBndWludCBJTl94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogSU5fc3RyLCBjb25zdCBnZG91YmxlIElOX3Ryb3VibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkb3VibGUqIE9VVF9kX3JldCwgY2hhciAqKiBPVVRfc3RyX3JldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCisvKiBUaGlzIGlzIGEgbm9uLWJsb2NraW5nIGNhbGwgKi8KK0RCdXNHUHJveHlDYWxsKgorY29tX2V4YW1wbGVfTXlPYmplY3RfbWFueV9hcmdzX2FzeW5jIChEQnVzR1Byb3h5ICpwcm94eSwgY29uc3QgZ3VpbnQgSU5feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIElOX3N0ciwgY29uc3QgZ2RvdWJsZSBJTl90cm91YmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21fZXhhbXBsZV9NeU9iamVjdF9tYW55X2FyZ3NfcmVwbHkgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwb2ludGVyIHVzZXJkYXRhKTsKKworLyogVGhpcyBpcyB0aGUgdHlwZWRlZiBmb3IgdGhlIG5vbi1ibG9ja2luZyBjYWxsYmFjayAqLwordHlwZWRlZiB2b2lkCisoKmNvbV9leGFtcGxlX015T2JqZWN0X21hbnlfYXJnc19yZXBseSkKKyhEQnVzR1Byb3h5ICpwcm94eSwgZ2RvdWJsZSBPVVRfZF9yZXQsIGNoYXIgKiBPVVRfc3RyX3JldCwKKyBHRXJyb3IgKmVycm9yLCBncG9pbnRlciB1c2VyZGF0YSk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICBUaGUgZmlyc3QgYXJndW1lbnQgaW4gYWxsIGZ1bmN0aW9ucyBpcyBhIDxsaXRlcmFsPkRCdXNHUHJveHkKKyAgICAgICAgKjwvbGl0ZXJhbD4sIHdoaWNoIHlvdSBzaG91bGQgY3JlYXRlIHdpdGggdGhlIHVzdWFsCisgICAgICAgIDxsaXRlcmFsPmRidXNfZ19wcm94eV9uZXdfKjwvbGl0ZXJhbD4gZnVuY3Rpb25zLiAgRm9sbG93aW5nIHRoYXQgYXJlIHRoZQorICAgICAgICAiaW4iIGFyZ3VtZW50cywgYW5kIHRoZW4gZWl0aGVyIHRoZSAib3V0IiBhcmd1bWVudHMgYW5kIGEKKyAgICAgICAgPGxpdGVyYWw+R0Vycm9yICo8L2xpdGVyYWw+IGZvciB0aGUgc3luY2hyb25vdXMgKGJsb2NraW5nKSBmdW5jdGlvbiwgb3IKKyAgICAgICAgY2FsbGJhY2sgYW5kIHVzZXIgZGF0YSBhcmd1bWVudHMgZm9yIHRoZSBhc3luY2hyb25vdXMgKG5vbi1ibG9ja2luZykKKyAgICAgICAgZnVuY3Rpb24uICBUaGUgY2FsbGJhY2sgaW4gdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBwYXNzZXMgdGhlCisgICAgICAgIDxsaXRlcmFsPkRCdXNHUHJveHkgKjwvbGl0ZXJhbD4sIHRoZSByZXR1cm5lZCAib3V0IiBhcmd1bWVudHMsIGFuCisgICAgICAgIDxsaXRlcmFsPkdFcnJvciAqPC9saXRlcmFsPiB3aGljaCBpcyBzZXQgaWYgdGhlcmUgd2FzIGFuIGVycm9yIG90aGVyd2lzZQorICAgICAgICA8bGl0ZXJhbD5OVUxMPC9saXRlcmFsPiwgYW5kIHRoZSB1c2VyIGRhdGEuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgQXMgd2l0aCB0aGUgc2VydmVyLXNpZGUgYmluZGluZ3Mgc3VwcG9ydCAoc2VlIDx4cmVmCisgICAgICAgIGxpbmtlbmQ9ImdsaWItc2VydmVyIi8+KSwgdGhlIGV4YWN0IGJlaGF2aW91ciBvZiB0aGUgY2xpZW50LXNpZGUKKyAgICAgICAgYmluZGluZ3MgY2FuIGJlIG1hbmlwdWxhdGVkIHVzaW5nICJhbm5vdGF0aW9ucyIuICBDdXJyZW50bHkgdGhlIG9ubHkKKyAgICAgICAgYW5ub3RhdGlvbiB1c2VkIGJ5IHRoZSBjbGllbnQgYmluZGluZ3MgaXMKKyAgICAgICAgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuR0xpYi5Ob1JlcGx5PC9saXRlcmFsPiwgd2hpY2ggc2V0cyB0aGUKKyAgICAgICAgZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIGNsaWVudCBpc24ndCBleHBlY3RpbmcgYSByZXBseSB0byB0aGUgbWV0aG9kCisgICAgICAgIGNhbGwsIHNvIGEgcmVwbHkgc2hvdWxkbid0IGJlIHNlbnQuICBUaGlzIGlzIG9mdGVuIHVzZWQgdG8gc3BlZWQgdXAKKyAgICAgICAgcmFwaWQgbWV0aG9kIGNhbGxzIHdoZXJlIHRoZXJlIGFyZSBubyAib3V0IiBhcmd1bWVudHMsIGFuZCBub3Qga25vd2luZworICAgICAgICBpZiB0aGUgbWV0aG9kIHN1Y2NlZWRlZCBpcyBhbiBhY2NlcHRhYmxlIGNvbXByb21pc2UgdG8gaGFsZiB0aGUgdHJhZmZpYworICAgICAgICBvbiB0aGUgYnVzLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgIDwvc2VjdDE+CisKKyAgPHNlY3QxIGlkPSJnbGliLXNlcnZlciI+CisgICAgPHRpdGxlPkdMaWIgQVBJOiBJbXBsZW1lbnRpbmcgT2JqZWN0czwvdGl0bGU+CisgICAgPHBhcmE+CisgICAgICBBdCB0aGUgbW9tZW50LCB0byBleHBvc2UgYSBHT2JqZWN0IHZpYSBELUJ1cywgeW91IG11c3QKKyAgICAgIHdyaXRlIFhNTCBieSBoYW5kIHdoaWNoIGRlc2NyaWJlcyB0aGUgbWV0aG9kcyBleHBvcnRlZAorICAgICAgYnkgdGhlIG9iamVjdC4gIEluIHRoZSBmdXR1cmUsIHRoaXMgbWFudWFsIHN0ZXAgd2lsbAorICAgICAgYmUgb2J2aWF0ZWQgYnkgdGhlIHVwY29taW5nIEdMaWIgaW50cm9zcGVjdGlvbiBzdXBwb3J0LgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgIEhlcmUgaXMgYSBzYW1wbGUgWE1MIGZpbGUgd2hpY2ggZGVzY3JpYmVzIGFuIG9iamVjdCB0aGF0IGV4cG9zZXMKKyAgICAgIG9uZSBtZXRob2QsIG5hbWVkIDxsaXRlcmFsPk1hbnlBcmdzPC9saXRlcmFsPi4KKzxwcm9ncmFtbGlzdGluZz4KKyZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/Jmd0OworCismbHQ7bm9kZSBuYW1lPSIvY29tL2V4YW1wbGUvTXlPYmplY3QiJmd0OworCisgICZsdDtpbnRlcmZhY2UgbmFtZT0iY29tLmV4YW1wbGUuTXlPYmplY3QiJmd0OworICAgICZsdDthbm5vdGF0aW9uIG5hbWU9Im9yZy5mcmVlZGVza3RvcC5EQnVzLkdMaWIuQ1N5bWJvbCIgdmFsdWU9Im15X29iamVjdCIvJmd0OworICAgICZsdDttZXRob2QgbmFtZT0iTWFueUFyZ3MiJmd0OworICAgICAgJmx0OyEtLSBUaGlzIGlzIG9wdGlvbmFsLCBhbmQgaW4gdGhpcyBjYXNlIGlzIHJlZHVudW5kYW50IC0tJmd0OworICAgICAgJmx0O2Fubm90YXRpb24gbmFtZT0ib3JnLmZyZWVkZXNrdG9wLkRCdXMuR0xpYi5DU3ltYm9sIiB2YWx1ZT0ibXlfb2JqZWN0X21hbnlfYXJncyIvJmd0OworICAgICAgJmx0O2FyZyB0eXBlPSJ1IiBuYW1lPSJ4IiBkaXJlY3Rpb249ImluIiAvJmd0OworICAgICAgJmx0O2FyZyB0eXBlPSJzIiBuYW1lPSJzdHIiIGRpcmVjdGlvbj0iaW4iIC8mZ3Q7CisgICAgICAmbHQ7YXJnIHR5cGU9ImQiIG5hbWU9InRyb3VibGUiIGRpcmVjdGlvbj0iaW4iIC8mZ3Q7CisgICAgICAmbHQ7YXJnIHR5cGU9ImQiIG5hbWU9ImRfcmV0IiBkaXJlY3Rpb249Im91dCIgLyZndDsKKyAgICAgICZsdDthcmcgdHlwZT0icyIgbmFtZT0ic3RyX3JldCIgZGlyZWN0aW9uPSJvdXQiIC8mZ3Q7CisgICAgJmx0Oy9tZXRob2QmZ3Q7CisgICZsdDsvaW50ZXJmYWNlJmd0OworJmx0Oy9ub2RlJmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICA8L3BhcmE+CisgICAgPHBhcmE+CisgICAgICBUaGlzIFhNTCBpcyBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIEQtQnVzIGludHJvc3BlY3Rpb24gWE1MCisgICAgICBmb3JtYXQuIEV4Y2VwdCB3ZSBtdXN0IGluY2x1ZGUgYW4gImFubm90YXRpb24iIHdoaWNoIGdpdmUgdGhlIEMKKyAgICAgIHN5bWJvbHMgY29ycmVzcG9uZGluZyB0byB0aGUgb2JqZWN0IGltcGxlbWVudGF0aW9uIHByZWZpeAorICAgICAgKDxsaXRlcmFsPm15X29iamVjdDwvbGl0ZXJhbD4pLiAgSW4gYWRkaXRpb24sIGlmIHBhcnRpY3VsYXIKKyAgICAgIG1ldGhvZHMgc3ltYm9sIG5hbWVzIGRldmlhdGUgZnJvbSBDIGNvbnZlbnRpb24KKyAgICAgIChpLmUuIDxsaXRlcmFsPk1hbnlBcmdzPC9saXRlcmFsPiAtJmd0OworICAgICAgPGxpdGVyYWw+bWFueV9hcmdzPC9saXRlcmFsPiksIHlvdSBtYXkgc3BlY2lmeSBhbiBhbm5vdGF0aW9uCisgICAgICBnaXZpbmcgdGhlIEMgc3ltYm9sLgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgIE9uY2UgeW91IGhhdmUgd3JpdHRlbiB0aGlzIFhNTCwgcnVuIDxsaXRlcmFsPmRidXMtYmluZGluZy10b29sIC0tbW9kZT1nbGliLXNlcnZlciA8cmVwbGFjZWFibGU+RklMRU5BTUU8L3JlcGxhY2VhYmxlPiAmZ3Q7IDxyZXBsYWNlYWJsZT5IRUFERVJfTkFNRTwvcmVwbGFjZWFibGU+LjwvbGl0ZXJhbD4gdG8KKyAgICAgIGdlbmVyYXRlIGEgaGVhZGVyIGZpbGUuICBGb3IgZXhhbXBsZTogPGNvbW1hbmQ+ZGJ1cy1iaW5kaW5nLXRvb2wgLS1tb2RlPWdsaWItc2VydmVyIG15LW9iamVjdC54bWwgJmd0OyBteS1vYmplY3QtZ2x1ZS5oPC9jb21tYW5kPi4KKyAgICA8L3BhcmE+CisgICAgPHBhcmE+CisgICAgICBOZXh0LCBpbmNsdWRlIHRoZSBnZW5lcmF0ZWQgaGVhZGVyIGluIHlvdXIgcHJvZ3JhbSwgYW5kIGludm9rZQorICAgICAgPGxpdGVyYWw+ZGJ1c19nX29iamVjdF9jbGFzc19pbnN0YWxsX2luZm88L2xpdGVyYWw+IGluIHRoZSBjbGFzcworICAgICAgaW5pdGlhbGl6ZXIsIHBhc3NpbmcgdGhlIG9iamVjdCBjbGFzcyBhbmQgIm9iamVjdCBpbmZvIiBpbmNsdWRlZCBpbiB0aGUKKyAgICAgIGhlYWRlci4gIEZvciBleGFtcGxlOgorICAgICAgPHByb2dyYW1saXN0aW5nPgorCWRidXNfZ19vYmplY3RfdHlwZV9pbnN0YWxsX2luZm8gKENPTV9GT09fVFlQRV9NWV9PQkpFQ1QsICZhbXA7Y29tX2Zvb19teV9vYmplY3RfaW5mbyk7CisgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgVGhpcyBzaG91bGQgYmUgZG9uZSBleGFjdGx5IG9uY2UgcGVyIG9iamVjdCBjbGFzcy4KKyAgICA8L3BhcmE+CisgICAgPHBhcmE+CisgICAgICBUbyBhY3R1YWxseSBpbXBsZW1lbnQgdGhlIG1ldGhvZCwganVzdCBkZWZpbmUgYSBDIGZ1bmN0aW9uIG5hbWVkIGUuZy4KKyAgICAgIDxsaXRlcmFsPm15X29iamVjdF9tYW55X2FyZ3M8L2xpdGVyYWw+IGluIHRoZSBzYW1lIGZpbGUgYXMgdGhlIGluZm8KKyAgICAgIGhlYWRlciBpcyBpbmNsdWRlZC4gIEF0IHRoZSBtb21lbnQsIGl0IGlzIHJlcXVpcmVkIHRoYXQgdGhpcyBmdW5jdGlvbgorICAgICAgY29uZm9ybSB0byB0aGUgZm9sbG93aW5nIHJ1bGVzOgorICAgICAgPGl0ZW1pemVkbGlzdD4KKwk8bGlzdGl0ZW0+CisJICA8cGFyYT4KKwkgICAgVGhlIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGEgdmFsdWUgb2YgdHlwZSA8bGl0ZXJhbD5nYm9vbGVhbjwvbGl0ZXJhbD47CisJICAgIDxsaXRlcmFsPlRSVUU8L2xpdGVyYWw+IG9uIHN1Y2Nlc3MsIGFuZCA8bGl0ZXJhbD5GQUxTRTwvbGl0ZXJhbD4KKwkgICAgb3RoZXJ3aXNlLgorCSAgPC9wYXJhPgorCTwvbGlzdGl0ZW0+CisJPGxpc3RpdGVtPgorCSAgPHBhcmE+CisJICAgIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGFuIGluc3RhbmNlIG9mIHRoZSBvYmplY3QuCisJICA8L3BhcmE+CisJPC9saXN0aXRlbT4KKwk8bGlzdGl0ZW0+CisJICA8cGFyYT4KKwkgICAgRm9sbG93aW5nIHRoZSBvYmplY3QgaW5zdGFuY2UgcG9pbnRlciBhcmUgdGhlIG1ldGhvZAorCSAgICBpbnB1dCB2YWx1ZXMuCisJICA8L3BhcmE+CisJPC9saXN0aXRlbT4KKwk8bGlzdGl0ZW0+CisJICA8cGFyYT4KKwkgICAgRm9sbG93aW5nIHRoZSBpbnB1dCB2YWx1ZXMgYXJlIHBvaW50ZXJzIHRvIHJldHVybiB2YWx1ZXMuCisJICA8L3BhcmE+CisJPC9saXN0aXRlbT4KKwk8bGlzdGl0ZW0+CisJICA8cGFyYT4KKwkgICAgVGhlIGZpbmFsIHBhcmFtZXRlciBtdXN0IGJlIGEgPGxpdGVyYWw+R0Vycm9yICoqPC9saXRlcmFsPi4KKwkgICAgSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgPGxpdGVyYWw+RkFMU0U8L2xpdGVyYWw+IGZvciBhbgorCSAgICBlcnJvciwgdGhlIGVycm9yIHBhcmFtZXRlciBtdXN0IGJlIGluaXRhbGl6ZWQgd2l0aAorCSAgICA8bGl0ZXJhbD5nX3NldF9lcnJvcjwvbGl0ZXJhbD4uCisJICA8L3BhcmE+CisJPC9saXN0aXRlbT4KKyAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgIEZpbmFsbHksIHlvdSBjYW4gZXhwb3J0IGFuIG9iamVjdCB1c2luZyA8bGl0ZXJhbD5kYnVzX2dfY29ubmVjdGlvbl9yZWdpc3Rlcl9nX29iamVjdDwvbGl0ZXJhbD4uICBGb3IgZXhhbXBsZToKKyAgICAgIDxwcm9ncmFtbGlzdGluZz4KKwkgIGRidXNfZ19jb25uZWN0aW9uX3JlZ2lzdGVyX2dfb2JqZWN0IChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL2NvbS9mb28vTXlPYmplY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmopOworICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICA8L3BhcmE+CisKKyAgICA8c2VjdDIgaWQ9ImdsaWItYW5ub3RhdGlvbnMiPgorICAgICAgPHRpdGxlPlNlcnZlci1zaWRlIEFubm90YXRpb25zPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGVyZSBhcmUgc2V2ZXJhbCBhbm5vdGF0aW9ucyB0aGF0IGFyZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyB0aGUKKyAgICAgICAgc2VydmVyLXNpZGUgYmluZGluZ3MuICBUaGUgbW9zdCBjb21tb24gYW5ub3RhdGlvbiBpcworICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5HTGliLkNTeW1ib2w8L2xpdGVyYWw+IGJ1dCB0aGVyZSBhcmUgb3RoZXIKKyAgICAgICAgYW5ub3RhdGlvbnMgd2hpY2ggYXJlIG9mdGVuIHVzZWZ1bC4KKyAgICAgICAgPHZhcmlhYmxlbGlzdD4KKyAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgPHRlcm0+PGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuR0xpYi5DU3ltYm9sPC9saXRlcmFsPjwvdGVybT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhpcyBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgQyBzeW1ib2wgbmFtZXMgZm9yCisgICAgICAgICAgICAgICAgdGhlIHZhcmlvdXMgdHlwZXMgKGludGVyZmFjZSwgbWV0aG9kLCBldGMpLCBpZiBpdCBkaWZmZXJzIGZyb20gdGhlCisgICAgICAgICAgICAgICAgbmFtZSBEQnVzIGdlbmVyYXRlcy4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgPHRlcm0+PGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuR0xpYi5Bc3luYzwvbGl0ZXJhbD48L3Rlcm0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoaXMgYW5ub3RhdGlvbiBtYXJrcyB0aGUgbWV0aG9kIGltcGxlbWVudGF0aW9uIGFzIGFuCisgICAgICAgICAgICAgICAgYXN5bmNocm9ub3VzIGZ1bmN0aW9uLCB3aGljaCBkb2Vzbid0IHJldHVybiBhIHJlc3BvbnNlIHN0cmFpZ2h0CisgICAgICAgICAgICAgICAgYXdheSBidXQgd2lsbCBzZW5kIHRoZSByZXNwb25zZSBhdCBzb21lIGxhdGVyIHBvaW50IHRvIGNvbXBsZXRlCisgICAgICAgICAgICAgICAgdGhlIGNhbGwuICBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IG5vbi1ibG9ja2luZyBzZXJ2aWNlcyB3aGVyZQorICAgICAgICAgICAgICAgIG1ldGhvZCBjYWxscyBjYW4gdGFrZSB0aW1lLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFdoZW4gYSBtZXRob2QgaXMgYXN5bmNocm9ub3VzLCB0aGUgZnVuY3Rpb24gcHJvdG90eXBlIGlzCisgICAgICAgICAgICAgICAgZGlmZmVyZW50LiBJdCBpcyByZXF1aXJlZCB0aGF0IHRoZSBmdW5jdGlvbiBjb25mb3JtIHRvIHRoZQorICAgICAgICAgICAgICAgIGZvbGxvd2luZyBydWxlczoKKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICBUaGUgZnVuY3Rpb24gbXVzdCByZXR1cm4gYSB2YWx1ZSBvZiB0eXBlIDxsaXRlcmFsPmdib29sZWFuPC9saXRlcmFsPjsKKyAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5UUlVFPC9saXRlcmFsPiBvbiBzdWNjZXNzLCBhbmQgPGxpdGVyYWw+RkFMU0U8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlLiBUT0RPOiB0aGUgcmV0dXJuIHZhbHVlIGlzIGN1cnJlbnRseSBpZ25vcmVkLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhbiBpbnN0YW5jZSBvZiB0aGUgb2JqZWN0LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICBGb2xsb3dpbmcgdGhlIG9iamVjdCBpbnN0YW5jZSBwb2ludGVyIGFyZSB0aGUgbWV0aG9kCisgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgdmFsdWVzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICBUaGUgZmluYWwgcGFyYW1ldGVyIG11c3QgYmUgYQorICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkRCdXNHTWV0aG9kSW52b2NhdGlvbiAqPC9saXRlcmFsPi4gIFRoaXMgaXMgdXNlZAorICAgICAgICAgICAgICAgICAgICAgIHdoZW4gc2VuZGluZyB0aGUgcmVzcG9uc2UgbWVzc2FnZSBiYWNrIHRvIHRoZSBjbGllbnQsIGJ5CisgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZyA8bGl0ZXJhbD5kYnVzX2dfbWV0aG9kX3JldHVybjwvbGl0ZXJhbD4gb3IKKyAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5kYnVzX2dfbWV0aG9kX3JldHVybl9lcnJvcjwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgIDx0ZXJtPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkdMaWIuQ29uc3Q8L2xpdGVyYWw+PC90ZXJtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT5UaGlzIGF0dHJpYnV0ZSBjYW4gb25seSBiZSBhcHBsaWVkIHRvICJvdXQiCisgICAgICAgICAgICAgIDxsaXRlcmFsPiZsdDthcmcmZ3Q7PC9saXRlcmFsPiBub2RlcywgYW5kIHNwZWNpZmllcyB0aGF0IHRoZQorICAgICAgICAgICAgICBwYXJhbWV0ZXIgaXNuJ3QgYmVpbmcgY29waWVkIHdoZW4gcmV0dXJuZWQuICBGb3IgZXhhbXBsZSwgdGhpcworICAgICAgICAgICAgICB0dXJucyBhICdzJyBhcmd1bWVudCBmcm9tIGEgPGxpdGVyYWw+Y2hhciAqKjwvbGl0ZXJhbD4gdG8gYQorICAgICAgICAgICAgICA8bGl0ZXJhbD5jb25zdCBjaGFyICoqPC9saXRlcmFsPiwgYW5kIHJlc3VsdHMgaW4gdGhlIGFyZ3VtZW50IG5vdAorICAgICAgICAgICAgICBiZWluZyBmcmVlZCBieSBEQnVzIGFmdGVyIHRoZSBtZXNzYWdlIGlzIHNlbnQuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgIDx0ZXJtPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkdMaWIuUmV0dXJuVmFsPC9saXRlcmFsPjwvdGVybT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgY2FuIG9ubHkgYmUgYXBwbGllZCB0byAib3V0IgorICAgICAgICAgICAgICAgIDxsaXRlcmFsPiZsdDthcmcmZ3Q7PC9saXRlcmFsPiBub2RlcywgYW5kIGFsdGVycyB0aGUgZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiBzaWduYXR1cmUuICBJdCBjdXJyZW50bHkgY2FuIGJlIHNldCB0byB0d28gdmFsdWVzOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsPiIiPC9saXRlcmFsPiBvciA8bGl0ZXJhbD4iZXJyb3IiPC9saXRlcmFsPi4gIFRoZQorICAgICAgICAgICAgICAgIGFyZ3VtZW50IG1hcmtlZCB3aXRoIHRoaXMgYXR0cmlidXRlIGlzIG5vdCByZXR1cm5lZCB2aWEgYQorICAgICAgICAgICAgICAgIHBvaW50ZXIgYXJndW1lbnQsIGJ1dCBieSB0aGUgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUuICBJZiB0aGUKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUncyB2YWx1ZSBpcyB0aGUgZW1wdHkgc3RyaW5nLCB0aGUgPGxpdGVyYWw+R0Vycm9yCisgICAgICAgICAgICAgICAgKjwvbGl0ZXJhbD4gYXJndW1lbnQgaXMgYWxzbyBvbWl0dGVkIHNvIHRoZXJlIGlzIG5vIHN0YW5kYXJkIHdheQorICAgICAgICAgICAgICAgIHRvIHJldHVybiBhbiBlcnJvciB2YWx1ZS4gIFRoaXMgaXMgdmVyeSB1c2VmdWwgZm9yIGludGVyZmFjaW5nCisgICAgICAgICAgICAgICAgd2l0aCBleGlzdGluZyBjb2RlLCBhcyBpdCBpcyBwb3NzaWJsZSB0byBtYXRjaCBleGlzdGluZyBBUElzLgorICAgICAgICAgICAgICAgIElmIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZSBpcyA8bGl0ZXJhbD4iZXJyb3IiPC9saXRlcmFsPiwgdGhlbiB0aGUKKyAgICAgICAgICAgICAgICBmaW5hbCBhcmd1bWVudCBpcyBhIDxsaXRlcmFsPkdFcnJvciAqPC9saXRlcmFsPiBhcyB1c3VhbC4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBTb21lIGV4YW1wbGVzIHRvIGRlbW9uc3RyYXRlIHRoZSB1c2FnZS4gVGhpcyBpbnRyb3NwZWN0aW9uIFhNTDoKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CismbHQ7bWV0aG9kIG5hbWU9IkluY3JlbWVudCImZ3Q7CisgICZsdDthcmcgdHlwZT0idSIgbmFtZT0ieCIgLyZndDsKKyAgJmx0O2FyZyB0eXBlPSJ1IiBkaXJlY3Rpb249Im91dCIgLyZndDsKKyZsdDsvbWV0aG9kJmd0OworICAgICAgICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgRXhwZWN0cyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIGRlY2xhcmF0aW9uOgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KK2dib29sZWFuCitteV9vYmplY3RfaW5jcmVtZW50IChNeU9iamVjdCAqb2JqLCBnaW50MzIgeCwgZ2ludDMyICpyZXQsIEdFcnJvciAqKmVycm9yKTsKKyAgICAgICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoaXMgaW50cm9zcGVjdGlvbiBYTUw6CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorJmx0O21ldGhvZCBuYW1lPSJJbmNyZW1lbnRSZXR2YWwiJmd0OworICAmbHQ7YXJnIHR5cGU9InUiIG5hbWU9IngiIC8mZ3Q7CisgICZsdDthcmcgdHlwZT0idSIgZGlyZWN0aW9uPSJvdXQiICZndDsKKyAgICAmbHQ7YW5ub3RhdGlvbiBuYW1lPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5HTGliLlJldHVyblZhbCIgdmFsdWU9IiIvJmd0OworICAmbHQ7L2FyZyZndDsKKyZsdDsvbWV0aG9kJmd0OworICAgICAgICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgRXhwZWN0cyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIGRlY2xhcmF0aW9uOgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KK2dpbnQzMgorbXlfb2JqZWN0X2luY3JlbWVudF9yZXR2YWwgKE15T2JqZWN0ICpvYmosIGdpbnQzMiB4KQorICAgICAgICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhpcyBpbnRyb3NwZWN0aW9uIFhNTDoKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CismbHQ7bWV0aG9kIG5hbWU9IkluY3JlbWVudFJldHZhbEVycm9yIiZndDsKKyAgJmx0O2FyZyB0eXBlPSJ1IiBuYW1lPSJ4IiAvJmd0OworICAmbHQ7YXJnIHR5cGU9InUiIGRpcmVjdGlvbj0ib3V0IiAmZ3Q7CisgICAgJmx0O2Fubm90YXRpb24gbmFtZT0ib3JnLmZyZWVkZXNrdG9wLkRCdXMuR0xpYi5SZXR1cm5WYWwiIHZhbHVlPSJlcnJvciIvJmd0OworICAmbHQ7L2FyZyZndDsKKyZsdDsvbWV0aG9kJmd0OworICAgICAgICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgRXhwZWN0cyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIGRlY2xhcmF0aW9uOgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KK2dpbnQzMgorbXlfb2JqZWN0X2luY3JlbWVudF9yZXR2YWxfZXJyb3IgKE15T2JqZWN0ICpvYmosIGdpbnQzMiB4LCBHRXJyb3IgKiplcnJvcikKKyAgICAgICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgICA8L3ZhcmlhYmxlbGlzdD4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICA8L3NlY3QxPgorCisgIDxzZWN0MSBpZD0icHl0aG9uLWNsaWVudCI+CisgICAgPHRpdGxlPlB5dGhvbiBBUEk8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgVGhlIFB5dGhvbiBBUEksIGRidXMtcHl0aG9uLCBpcyBub3cgZG9jdW1lbnRlZCBzZXBhcmF0ZWx5IGluCisgICAgICA8dWxpbmsgdXJsPSJodHRwOi8vZGJ1cy5mcmVlZGVza3RvcC5vcmcvZG9jL2RidXMtcHl0aG9uL2RvYy90dXRvcmlhbC5odG1sIj50aGUgZGJ1cy1weXRob24gdHV0b3JpYWw8L3VsaW5rPiAoYWxzbyBhdmFpbGFibGUgaW4gZG9jL3R1dG9yaWFsLnR4dCwKKyAgICAgIGFuZCBkb2MvdHV0b3JpYWwuaHRtbCBpZiBidWlsdCB3aXRoIHB5dGhvbi1kb2N1dGlscywgaW4gdGhlIGRidXMtcHl0aG9uCisgICAgICBzb3VyY2UgZGlzdHJpYnV0aW9uKS4KKyAgICA8L3BhcmE+CisgIDwvc2VjdDE+CisKKyAgPHNlY3QxIGlkPSJxdC1jbGllbnQiPgorICAgIDx0aXRsZT5RdCBBUEk6IFVzaW5nIFJlbW90ZSBPYmplY3RzPC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgIAorICAgICAgVGhlIFF0IGJpbmRpbmdzIGFyZSBub3QgeWV0IGRvY3VtZW50ZWQuCisKKyAgICA8L3BhcmE+CisgIDwvc2VjdDE+CisKKyAgPHNlY3QxIGlkPSJxdC1zZXJ2ZXIiPgorICAgIDx0aXRsZT5RdCBBUEk6IEltcGxlbWVudGluZyBPYmplY3RzPC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgIFRoZSBRdCBiaW5kaW5ncyBhcmUgbm90IHlldCBkb2N1bWVudGVkLgorICAgIDwvcGFyYT4KKyAgPC9zZWN0MT4KKzwvYXJ0aWNsZT4KZGlmZiAtLWdpdCBhL2RidXMvZG9jL2RidXMtdXVpZGdlbi4xIGIvZGJ1cy9kb2MvZGJ1cy11dWlkZ2VuLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkOGRkMgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZG9jL2RidXMtdXVpZGdlbi4xCkBAIC0wLDAgKzEsODkgQEAKKy5cIiAKKy5cIiBkYnVzXC11dWlkZ2VuIG1hbnVhbCBwYWdlLgorLlwiIENvcHlyaWdodCAoQykgMjAwNiBSZWQgSGF0LCBJbmMuCisuXCIKKy5USCBkYnVzXC11dWlkZ2VuIDEKKy5TSCBOQU1FCitkYnVzXC11dWlkZ2VuIFwtIFV0aWxpdHkgdG8gZ2VuZXJhdGUgVVVJRHMKKy5TSCBTWU5PUFNJUworLlBQCisuQiBkYnVzXC11dWlkZ2VuIFtcLVwtdmVyc2lvbl0gW1wtXC1lbnN1cmVbPUZJTEVOQU1FXV0gW1wtXC1nZXRbPUZJTEVOQU1FXV0KKworLlNIIERFU0NSSVBUSU9OCisKK1RoZSBcZklkYnVzXC11dWlkZ2VuXGZQIGNvbW1hbmQgZ2VuZXJhdGVzIG9yIHJlYWRzIGEgdW5pdmVyc2FsbHkgdW5pcXVlIElELgorCisuUFAKK05vdGUgdGhhdCB0aGUgRFwtQnVzIFVVSUQgaGFzIG5vIHJlbGF0aW9uc2hpcCB0byBSRkMgNDEyMiBhbmQgZG9lcyBub3QgZ2VuZXJhdGUKK1VVSURzIGNvbXBhdGlibGUgd2l0aCB0aGF0IHNwZWMuIE1hbnkgc3lzdGVtcyBoYXZlIGEgc2VwYXJhdGUgY29tbWFuZAorZm9yIHRoYXQgKG9mdGVuIGNhbGxlZCAidXVpZGdlbiIpLgorCisuUFAKK1NlZSBodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyBmb3IgbW9yZSBpbmZvcm1hdGlvbgorYWJvdXQgRFwtQnVzLgorCisuUFAKK1RoZSBwcmltYXJ5IHVzYWdlIG9mIFxmSWRidXNcLXV1aWRnZW5cZlAgaXMgdG8gcnVuIGluIHRoZSBwb3N0XC1pbnN0YWxsCitzY3JpcHQgb2YgYSBEXC1CdXMgcGFja2FnZSBsaWtlIHRoaXM6CisubmYKKyAgZGJ1c1wtdXVpZGdlbiBcLVwtZW5zdXJlCisuZmkKKworLlBQCitUaGlzIHdpbGwgZW5zdXJlIHRoYXQgL3Zhci9saWIvZGJ1cy9tYWNoaW5lXC1pZCBleGlzdHMgYW5kIGhhcyB0aGUgdXVpZCBpbiBpdC4KK0l0IHdvbid0IG92ZXJ3cml0ZSBhbiBleGlzdGluZyB1dWlkLCBzaW5jZSB0aGlzIGlkIHNob3VsZCByZW1haW4gZml4ZWQKK2ZvciBhIHNpbmdsZSBtYWNoaW5lIHVudGlsIHRoZSBuZXh0IHJlYm9vdCBhdCBsZWFzdC4KKworLlBQCitUaGUgaW1wb3J0YW50IHByb3BlcnRpZXMgb2YgdGhlIG1hY2hpbmUgVVVJRCBhcmUgdGhhdCAxKSBpdCByZW1haW5zCit1bmNoYW5nZWQgdW50aWwgdGhlIG5leHQgcmVib290IGFuZCAyKSBpdCBpcyBkaWZmZXJlbnQgZm9yIGFueSB0d28gCitydW5uaW5nIGluc3RhbmNlcyBvZiB0aGUgT1Mga2VybmVsLiBUaGF0IGlzLCBpZiB0d28gcHJvY2Vzc2VzIHNlZSB0aGUgCitzYW1lIFVVSUQsIHRoZXkgc2hvdWxkIGFsc28gc2VlIHRoZSBzYW1lIHNoYXJlZCBtZW1vcnksIFVOSVggZG9tYWluCitzb2NrZXRzLCBsb2NhbCBYIGRpc3BsYXlzLCBsb2NhbGhvc3QubG9jYWxkb21haW4gcmVzb2x1dGlvbiwgcHJvY2VzcworSURzLCBhbmQgc28gZm9ydGguCisKKy5QUAorSWYgeW91IHJ1biBcZklkYnVzXC11dWlkZ2VuXGZQIHdpdGggbm8gb3B0aW9ucyBpdCBqdXN0IHByaW50cyBhIG5ldyB1dWlkIG1hZGUKK3VwIG91dCBvZiB0aGluIGFpci4KKworLlBQCitJZiB5b3UgcnVuIGl0IHdpdGggXC1cLWdldCwgaXQgcHJpbnRzIHRoZSBtYWNoaW5lIFVVSUQgYnkgZGVmYXVsdCwgb3IKK3RoZSBVVUlEIGluIHRoZSBzcGVjaWZpZWQgZmlsZSBpZiB5b3Ugc3BlY2lmeSBhIGZpbGUuCisKKy5QUAorSWYgeW91IHRyeSB0byBjaGFuZ2UgYW4gZXhpc3RpbmcgbWFjaGluZVwtaWQgb24gYSBydW5uaW5nIHN5c3RlbSwgaXQgd2lsbAorcHJvYmFibHkgcmVzdWx0IGluIGJhZCB0aGluZ3MgaGFwcGVuaW5nLiBEb24ndCB0cnkgdG8gY2hhbmdlIHRoaXMgZmlsZS4gQWxzbywKK2Rvbid0IG1ha2UgaXQgdGhlIHNhbWUgb24gdHdvIGRpZmZlcmVudCBzeXN0ZW1zOyBpdCBuZWVkcyB0byBiZSBkaWZmZXJlbnQKK2FueXRpbWUgdGhlcmUgYXJlIHR3byBkaWZmZXJlbnQga2VybmVscyBydW5uaW5nLgorCisuUFAKK1RoZSBVVUlEIHNob3VsZCBiZSBkaWZmZXJlbnQgb24gdHdvIGRpZmZlcmVudCB2aXJ0dWFsIG1hY2hpbmVzLAorYmVjYXVzZSB0aGVyZSBhcmUgdHdvIGRpZmZlcmVudCBrZXJuZWxzLgorCisuU0ggT1BUSU9OUworVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBzdXBwb3J0ZWQ6CisuVFAKKy5JICJcLVwtZ2V0Wz1GSUxFTkFNRV0iCitJZiBhIGZpbGVuYW1lIGlzIG5vdCBnaXZlbiwgZGVmYXVsdHMgdG8gbG9jYWxzdGF0ZWRpci9saWIvZGJ1cy9tYWNoaW5lXC1pZAorKGxvY2Fsc3RhdGVkaXIgaXMgdXN1YWxseSAvdmFyKS4gSWYgdGhpcyBmaWxlIGV4aXN0cyBhbmQgaXMgdmFsaWQsIHRoZQordXVpZCBpbiB0aGUgZmlsZSBpcyBwcmludGVkIG9uIHN0ZG91dC4gT3RoZXJ3aXNlLCB0aGUgY29tbWFuZCBleGl0cyAKK3dpdGggYSBub256ZXJvIHN0YXR1cy4KKworLlRQCisuSSAiXC1cLWVuc3VyZVs9RklMRU5BTUVdIgorSWYgYSBmaWxlbmFtZSBpcyBub3QgZ2l2ZW4sIGRlZmF1bHRzIHRvIGxvY2Fsc3RhdGVkaXIvbGliL2RidXMvbWFjaGluZVwtaWQKKyhsb2NhbHN0YXRlZGlyIGlzIHVzdWFsbHkgL3ZhcikuIElmIHRoaXMgZmlsZSBleGlzdHMgdGhlbiBpdCB3aWxsIGJlCit2YWxpZGF0ZWQsIGFuZCBhIGZhaWx1cmUgY29kZSByZXR1cm5lZCBpZiBpdCBjb250YWlucyB0aGUgd3JvbmcgdGhpbmcuCitJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkIHdpdGggYSBuZXcgdXVpZCBpbiBpdC4KK09uIHN1Y2Nlc3MsIHByaW50cyBubyBvdXRwdXQuCisKKy5UUAorLkkgIlwtXC12ZXJzaW9uIgorUHJpbnQgdGhlIHZlcnNpb24gb2YgZGJ1c1wtdXVpZGdlbgorCisuU0ggQVVUSE9SCitTZWUgaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy9kb2MvQVVUSE9SUworCisuU0ggQlVHUworUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgdG8gdGhlIERcLUJ1cyBtYWlsaW5nIGxpc3Qgb3IgYnVnIHRyYWNrZXIsCitzZWUgaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8KZGlmZiAtLWdpdCBhL2RidXMvZG9jL2Rjb3AtaG93dG8udHh0IGIvZGJ1cy9kb2MvZGNvcC1ob3d0by50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZkM2JjZgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZG9jL2Rjb3AtaG93dG8udHh0CkBAIC0wLDAgKzEsNTU5IEBACisJCURDT1A6IERlc2t0b3AgQ09tbXVuaWNhdGlvbnMgUHJvdG9jb2wKKworCQkgICAgUHJlc3RvbiBCcm93biA8cGJyb3duQGtkZS5vcmc+CisJCQkgICBPY3RvYmVyIDE0LCAxOTk5CisKKwkgUmV2aXNlZCBhbmQgZXh0ZW5kZWQgYnkgTWF0dGhpYXMgRXR0cmljaCA8ZXR0cmljaEBrZGUub3JnPgorCQkJICAgTWFyIDI5LCAyMDAwCisKKyAgICAgICAgRXh0ZW5kZWQgd2l0aCBEQ09QIFNpZ25hbHMgYnkgV2FsZG8gQmFzdGlhbiA8YmFzdGlhbkBrZGUub3JnPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRmViIDE5LCAyMDAxCisKKworTW90aXZhdGlvbiBhbmQgQmFja2dyb3VuZDoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBtb3RpdmF0aW9uIGJlaGluZCBidWlsZGluZyBhIHByb3RvY29sIGxpa2UgRENPUCBpcyBzaW1wbGUuICBGb3IKK3RoZSBwYXN0IHllYXIsIHdlIGhhdmUgYmVlbiBhdHRlbXB0aW5nIHRvIGVuYWJsZSBpbnRlcnByb2Nlc3MKK2NvbW11bmljYXRpb24gYmV0d2VlbiBLREUgYXBwbGljYXRpb25zLiBLREUgYWxyZWFkeSBoYXMgYW4gZXh0cmVtZWx5CitzaW1wbGUgSVBDIG1lY2hhbmlzbSBjYWxsZWQgS1dNY29tLCB3aGljaCBpcyAod2FzISkgdXNlZCBmb3IgY29tbXVuaWNhdGluZworYmV0d2VlbiB0aGUgcGFuZWwgYW5kIHRoZSB3aW5kb3cgbWFuYWdlciBmb3IgaW5zdGFuY2UuICBJdCBpcyBhYm91dCBhcworc2ltcGxlIGFzIGl0IGdldHMsIHBhc3NpbmcgbWVzc2FnZXMgdmlhIFggQXRvbXMuICBGb3IgdGhpcyByZWFzb24gaXQKK2lzIGxpbWl0ZWQgaW4gdGhlIHNpemUgYW5kIGNvbXBsZXhpdHkgb2YgdGhlIGRhdGEgdGhhdCBjYW4gYmUgcGFzc2VkCisoWCBhdG9tcyBtdXN0IGJlIHNtYWxsIHRvIHJlbWFpbiBlZmZpY2llbnQpIGFuZCBpdCBhbHNvIG1ha2VzIGl0IHNvCit0aGF0IFggaXMgcmVxdWlyZWQuICBDT1JCQSB3YXMgdGhvdWdodCB0byBiZSBhIG1vcmUgZWZmZWN0aXZlIElQQy9SUEMKK3NvbHV0aW9uLiAgSG93ZXZlciwgYWZ0ZXIgYSB5ZWFyIG9mIGF0dGVtcHRpbmcgdG8gbWFrZSBoZWF2eSB1c2Ugb2YKK0NPUkJBIGluIEtERSwgd2UgaGF2ZSByZWFsaXplZCB0aGF0IGl0IGlzIGEgYml0IHNsb3cgYW5kIG1lbW9yeQoraW50ZW5zaXZlIGZvciBzaW1wbGUgdXNlLiAgSXQgYWxzbyBoYXMgbm8gYXV0aGVudGljYXRpb24gYXZhaWxhYmxlLgorCitXaGF0IHdlIHJlYWxseSBuZWVkZWQgd2FzIGFuIGV4dHJlbWVseSBzaW1wbGUgcHJvdG9jb2wgd2l0aCBiYXNpYworYXV0aG9yaXphdGlvbiwgYWxvbmcgdGhlIGxpbmVzIG9mIE1JVC1NQUdJQy1DT09LSUUsIGFzIHVzZWQgYnkgWC4gIEl0Cit3b3VsZCBub3QgYmUgYWJsZSB0byBkbyBORUFSTFkgd2hhdCBDT1JCQSB3YXMgYWJsZSB0byBkbywgYnV0IGZvciB0aGUKK3NpbXBsZSB0YXNrcyByZXF1aXJlZCBpdCB3b3VsZCBiZSBzdWZmaWNpZW50LiBTb21lIGV4YW1wbGVzIG9mIHN1Y2gKK3Rhc2tzIG1pZ2h0IGJlIGFuIGFwcGxpY2F0aW9uIHNlbmRpbmcgYSBtZXNzYWdlIHRvIHRoZSBwYW5lbCBzYXlpbmcsCisiSSBoYXZlIHN0YXJ0ZWQsIHN0b3AgZGlzcGxheWluZyB0aGUgJ2FwcGxpY2F0aW9uIHN0YXJ0aW5nJyB3YWl0CitzdGF0ZSwiIG9yIGhhdmluZyBhIG5ldyBhcHBsaWNhdGlvbiB0aGF0IHN0YXJ0cyBxdWVyeSB0byBzZWUgaWYgYW55CitvdGhlciBhcHBsaWNhdGlvbnMgb2YgdGhlIHNhbWUgbmFtZSBhcmUgcnVubmluZy4gIElmIHRoZXkgYXJlLCBzaW1wbHkKK2NhbGwgYSBmdW5jdGlvbiBvbiB0aGUgcmVtb3RlIGFwcGxpY2F0aW9uIHRvIGNyZWF0ZSBhIG5ldyB3aW5kb3csCityYXRoZXIgdGhhbiBzdGFydGluZyBhIG5ldyBwcm9jZXNzLgorCitJbXBsZW1lbnRhdGlvbjoKKy0tLS0tLS0tLS0tLS0tLQorCitEQ09QIGlzIGEgc2ltcGxlIElQQy9SUEMgbWVjaGFuaXNtIGJ1aWx0IHRvIG9wZXJhdGUgb3ZlciBzb2NrZXRzLgorRWl0aGVyIHVuaXggZG9tYWluIHNvY2tldHMgb3IgdGNwL2lwIHNvY2tldHMgYXJlIHN1cHBvcnRlZC4gRENPUCBpcworYnVpbHQgb24gdG9wIG9mIHRoZSBJbnRlciBDbGllbnQgRXhjaGFuZ2UgKElDRSkgcHJvdG9jb2wsIHdoaWNoIGNvbWVzCitzdGFuZGFyZCBhcyBhIHBhcnQgb2YgWDExUjYgYW5kIGxhdGVyLiBJdCBhbHNvIGRlcGVuZHMgb24gUXQsIGJ1dAorYmV5b25kIHRoYXQgaXQgZG9lcyBub3QgcmVxdWlyZSBhbnkgb3RoZXIgbGlicmFyaWVzLiBCZWNhdXNlIG9mIHRoaXMsCitpdCBpcyBleHRyZW1lbHkgbGlnaHR3ZWlnaHQsIGVuYWJsaW5nIGl0IHRvIGJlIGxpbmtlZCBpbnRvIGFsbCBLREUKK2FwcGxpY2F0aW9ucyB3aXRoIGxvdyBvdmVyaGVhZC4KKworTW9kZWw6CistLS0tLS0KKworVGhlIG1vZGVsIGlzIHNpbXBsZS4gIEVhY2ggYXBwbGljYXRpb24gdXNpbmcgRENPUCBpcyBhIGNsaWVudC4gIFRoZXkKK2NvbW11bmljYXRlIHRvIGVhY2ggb3RoZXIgdGhyb3VnaCBhIERDT1Agc2VydmVyLCB3aGljaCBmdW5jdGlvbnMgbGlrZQorYSB0cmFmZmljIGRpcmVjdG9yLCBkaXNwYXRjaGluZyBtZXNzYWdlcy9jYWxscyB0byB0aGUgcHJvcGVyCitkZXN0aW5hdGlvbnMuICBBbGwgY2xpZW50cyBhcmUgcGVlcnMgb2YgZWFjaCBvdGhlci4KKworVHdvIHR5cGVzIG9mIGFjdGlvbnMgYXJlIHBvc3NpYmxlIHdpdGggRENPUDogInNlbmQgYW5kIGZvcmdldCIKK21lc3NhZ2VzLCB3aGljaCBkbyBub3QgYmxvY2ssIGFuZCAiY2FsbHMsIiB3aGljaCBibG9jayB3YWl0aW5nIGZvcgorc29tZSBkYXRhIHRvIGJlIHJldHVybmVkLgorCitBbnkgZGF0YSB0aGF0IHdpbGwgYmUgc2VudCBpcyBzZXJpYWxpemVkIChtYXJzaGFsbGVkLCBmb3IgeW91IENPUkJBCit0eXBlcykgdXNpbmcgdGhlIGJ1aWx0LWluIFFEYXRhU3RyZWFtIG9wZXJhdG9ycyBhdmFpbGFibGUgaW4gYWxsIG9mCit0aGUgUXQgY2xhc3Nlcy4gIFRoaXMgaXMgZmFzdCBhbmQgZWFzeS4gIEluIGZhY3QgaXQncyBzbyBsaXR0bGUgd29yawordGhhdCB5b3UgY2FuIGVhc2lseSB3cml0ZSB0aGUgbWFyc2hhbGxpbmcgY29kZSBieSBoYW5kLiBJbiBhZGRpdGlvbiwKK3RoZXJlJ3MgYSBzaW1wbGUgSURMLWxpa2UgY29tcGlsZXIgYXZhaWxhYmxlIChkY29waWRsIGFuZCBkY29waWRsMmNwcCkKK3RoYXQgZ2VuZXJhdGVzIHN0dWJzIGFuZCBza2VsZXRvbnMgZm9yIHlvdS4gVXNpbmcgdGhlIGRjb3BpZGwgY29tcGlsZXIKK2hhcyB0aGUgYWRkaXRpb25hbCBiZW5lZml0IG9mIHR5cGUgc2FmZXR5LgorCitUaGlzIEhPV1RPIGRlc2NyaWJlcyB0aGUgbWFudWFsIG1ldGhvZCBmaXJzdCBhbmQgY292ZXJzIHRoZSBkY29waWRsCitjb21waWxlciBsYXRlci4KKworRXN0YWJsaXNoaW5nIHRoZSBDb25uZWN0aW9uOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitLQXBwbGljYXRpb24gaGFzIGdhaW5lZCBhIG1ldGhvZCBjYWxsZWQgIktBcHBsaWNhdGlvbjo6ZGNvcENsaWVudCgpIgord2hpY2ggcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBEQ09QQ2xpZW50IGluc3RhbmNlLiAgVGhlIGZpcnN0IHRpbWUgdGhpcworbWV0aG9kIGlzIGNhbGxlZCwgdGhlIGNsaWVudCBjbGFzcyB3aWxsIGJlIGNyZWF0ZWQuICBEQ09QQ2xpZW50cyBoYXZlCit1bmlxdWUgaWRlbnRpZmllcnMgYXR0YWNoZWQgdG8gdGhlbSB3aGljaCBhcmUgYmFzZWQgb24gd2hhdAorS0FwcGxpY2F0aW9uOjpuYW1lKCkgcmV0dXJucy4gIEluIGZhY3QsIGlmIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUKK2luc3RhbmNlIG9mIHRoZSBwcm9ncmFtIHJ1bm5pbmcsIHRoZSBhcHBJZCB3aWxsIGJlIGVxdWFsIHRvCitLQXBwbGljYXRpb246Om5hbWUoKS4KKworVG8gYWN0dWFsbHkgZW5hYmxlIERDT1AgY29tbXVuaWNhdGlvbiB0byBiZWdpbiwgeW91IG11c3QgdXNlCitEQ09QQ2xpZW50OjphdHRhY2goKS4gIFRoaXMgd2lsbCBhdHRlbXB0IHRvIGF0dGFjaCB0byB0aGUgRENPUCBzZXJ2ZXIuCitJZiBubyBzZXJ2ZXIgaXMgZm91bmQgb3IgdGhlcmUgaXMgYW55IG90aGVyIHR5cGUgb2YgZXJyb3IsIGF0dGFjaCgpCit3aWxsIHJldHVybiBmYWxzZS4gS0FwcGxpY2F0aW9uIHdpbGwgY2F0Y2ggYSBkY29wIHNpZ25hbCBhbmQgZGlzcGxheSBhbgorYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZSBib3ggaW4gdGhhdCBjYXNlLgorCitBZnRlciBjb25uZWN0aW5nIHdpdGggdGhlIHNlcnZlciB2aWEgRENPUENsaWVudDo6YXR0YWNoKCksIHlvdSBuZWVkIHRvCityZWdpc3RlciB0aGlzIGFwcElkIHdpdGggdGhlIHNlcnZlciBzbyBpdCBrbm93cyBhYm91dCB5b3UuICBPdGhlcndpc2UsCit5b3UgYXJlIGNvbW11bmljYXRpbmcgYW5vbnltb3VzbHkuICBVc2UgdGhlCitEQ09QQ2xpZW50OjpyZWdpc3RlckFzKGNvbnN0IFFDU3RyaW5nICZuYW1lKSB0byBkbyBzby4gIEluIHRoZSBzaW1wbGUKK2Nhc2U6CisKKy8qCisgKiByZXR1cm5zIHRoZSBhcHBJZCB0aGF0IGlzIGFjdHVhbGx5IHJlZ2lzdGVyZWQsIHdoaWNoIF9tYXlfIGJlCisgKiBkaWZmZXJlbnQgZnJvbSB3aGF0IHlvdSBwYXNzZWQKKyAqLworYXBwSWQgPSBjbGllbnQtPnJlZ2lzdGVyQXMoa0FwcC0+bmFtZSgpKTsKKworSWYgeW91IG5ldmVyIHJldHJpZXZlIHRoZSBEQ09QQ2xpZW50IHBvaW50ZXIgZnJvbSBLQXBwbGljYXRpb24sIHRoZQorb2JqZWN0IHdpbGwgbm90IGJlIGNyZWF0ZWQgYW5kIHRodXMgdGhlcmUgd2lsbCBiZSBubyBtZW1vcnkgb3ZlcmhlYWQuCisKK1lvdSBtYXkgYWxzbyBkZXRhY2ggZnJvbSB0aGUgc2VydmVyIGJ5IGNhbGxpbmcgRENPUENsaWVudDo6ZGV0YWNoKCkuCitJZiB5b3Ugd2lzaCB0byBhdHRhY2ggYWdhaW4geW91IHdpbGwgbmVlZCB0byByZS1yZWdpc3RlciBhcyB3ZWxsLiAgSWYKK3lvdSBvbmx5IHdpc2ggdG8gY2hhbmdlIHRoZSBJRCB1bmRlciB3aGljaCB5b3UgYXJlIHJlZ2lzdGVyZWQsIHNpbXBseQorY2FsbCBEQ09QQ2xpZW50OjpyZWdpc3RlckFzKCkgd2l0aCB0aGUgbmV3IG5hbWUuCisKK0tVbmlxdWVBcHBsaWNhdGlvbiBhdXRvbWF0aWNhbGx5IHJlZ2lzdGVycyBpdHNlbGYgdG8gRENPUC4gSWYgeW91CithcmUgdXNpbmcgS1VuaXF1ZUFwcGxpY2F0aW9uIHlvdSBzaG91bGQgbm90IGF0dGFjaCBvciByZWdpc3RlcgoreW91cnNlbGYsIHRoaXMgaXMgYWxyZWFkeSBkb25lLiBUaGUgYXBwSWQgaXMgYnkgZGVmaW5pdGlvbgorZXF1YWwgdG8ga2FwcC0+bmFtZSgpLiBZb3UgY2FuIHJldHJpZXZlIHRoZSByZWdpc3RlcmVkIERDT1AgY2xpZW50CitieSBjYWxsaW5nIGthcHAtPmRjb3BDbGllbnQoKS4KKworU2VuZGluZyBEYXRhIHRvIGEgUmVtb3RlIEFwcGxpY2F0aW9uOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUbyBhY3R1YWxseSBjb21tdW5pY2F0ZSwgeW91IGhhdmUgb25lIG9mIHR3byBjaG9pY2VzLiAgWW91IG1heSBlaXRoZXIKK2NhbGwgdGhlICJzZW5kIiBvciB0aGUgImNhbGwiIG1ldGhvZC4gIEJvdGggbWV0aG9kcyByZXF1aXJlIHRocmVlCitpZGVudGlmaWNhdGlvbiBwYXJhbWV0ZXJzOiBhbiBhcHBsaWNhdGlvbiBpZGVudGlmaWVyLCBhIHJlbW90ZSBvYmplY3QsCithIHJlbW90ZSBmdW5jdGlvbi4gU2VuZGluZyBpcyBhc3luY2hyb25vdXMgKGkuZS4gaXQgcmV0dXJucyBpbW1lZGlhdGVseSkKK2FuZCBtYXkgb3IgbWF5IG5vdCByZXN1bHQgaW4geW91ciBvd24gYXBwbGljYXRpb24gYmVpbmcgc2VudCBhIG1lc3NhZ2UgYXQKK3NvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZS4gVGhlbiAic2VuZCIgcmVxdWlyZXMgb25lIGFuZCAiY2FsbCIgcmVxdWlyZXMKK3R3byBkYXRhIHBhcmFtZXRlcnMuCisKK1RoZSByZW1vdGUgb2JqZWN0IG11c3QgYmUgc3BlY2lmaWVkIGFzIGFuIG9iamVjdCBoaWVyYXJjaHkuICBUaGF0IGlzLAoraWYgdGhlIHRvcGxldmVsIG9iamVjdCBpcyBjYWxsZWQgImZvb09iamVjdCIgYW5kIGhhcyB0aGUgY2hpbGQKKyJiYXJPYmplY3QiLCB5b3Ugd291bGQgcmVmZXJlbmNlIHRoaXMgb2JqZWN0IGFzICJmb29PYmplY3QvYmFyT2JqZWN0Ii4KK0Z1bmN0aW9ucyBtdXN0IGJlIGRlc2NyaWJlZCBieSBhIGZ1bGwgZnVuY3Rpb24gc2lnbmF0dXJlLiAgSWYgdGhlCityZW1vdGUgZnVuY3Rpb24gaXMgY2FsbGVkICJkb0l0IiwgYW5kIGl0IHRha2VzIGFuIGludCwgaXQgd291bGQgYmUKK2Rlc2NyaWJlZCBhcyAiZG9JdChpbnQpIi4gIFBsZWFzZSBub3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIG5vdAorc3BlY2lmaWVkIGhlcmUsIGFzIGl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUgKG9yIGF0CitsZWFzdCB0aGUgQysrIHVuZGVyc3RhbmRpbmcgb2YgYSBmdW5jdGlvbiBzaWduYXR1cmUpLiAgWW91IHdpbGwgZ2V0Cit0aGUgcmV0dXJuIHR5cGUgb2YgYSBmdW5jdGlvbiBiYWNrIGFzIGFuIGV4dHJhIHBhcmFtZXRlciB0bworRENPUENsaWVudDo6Y2FsbCgpLiAgU2VlIHRoZSBzZWN0aW9uIG9uIGNhbGwoKSBmb3IgbW9yZSBkZXRhaWxzLgorCitJbiBvcmRlciB0byBhY3R1YWxseSBnZXQgdGhlIGRhdGEgdG8gdGhlIHJlbW90ZSBjbGllbnQsIGl0IG11c3QgYmUKKyJzZXJpYWxpemVkIiB2aWEgYSBRRGF0YVN0cmVhbSBvcGVyYXRpbmcgb24gYSBRQnl0ZUFycmF5LiBUaGlzIGlzIGhvdwordGhlIGRhdGEgcGFyYW1ldGVyIGlzICJidWlsdCIuIEEgZmV3IGV4YW1wbGVzIHdpbGwgbWFrZSBjbGVhciBob3cgdGhpcword29ya3MuCisKK1NheSB5b3Ugd2FudCB0byBjYWxsICJkb0l0IiBhcyBkZXNjcmliZWQgYWJvdmUsIGFuZCBub3QgYmxvY2sgKG9yIHdhaXQKK2ZvciBhIHJlc3BvbnNlKS4gIFlvdSB3aWxsIG5vdCByZWNlaXZlIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHJlbW90ZWx5CitjYWxsZWQgZnVuY3Rpb24sIGJ1dCB5b3Ugd2lsbCBub3QgaGFuZyB3aGlsZSB0aGUgUlBDIGlzIHByb2Nlc3NlZCBlaXRoZXIuCitUaGUgcmV0dXJuIHZhbHVlIG9mIHNlbmQoKSBpbmRpY2F0ZXMgd2hldGhlciBEQ09QIGNvbW11bmljYXRpb24gc3VjY2VlZGVkCitvciBub3QuCisKK1FCeXRlQXJyYXkgZGF0YTsKK1FEYXRhU3RyZWFtIGFyZyhkYXRhLCBJT19Xcml0ZU9ubHkpOworYXJnIDw8IDU7CitpZiAoIWNsaWVudC0+c2VuZCgic29tZUFwcElkIiwgImZvb09iamVjdC9iYXJPYmplY3QiLCAiZG9JdChpbnQpIiwKKwkgICAgICAgICAgZGF0YSkpCisgIHFEZWJ1ZygidGhlcmUgd2FzIHNvbWUgZXJyb3IgdXNpbmcgRENPUC4iKTsKKworT0ssIG5vdyBsZXQncyBzYXkgd2Ugd2FudGVkIHRvIGdldCB0aGUgZGF0YSBiYWNrIGZyb20gdGhlIHJlbW90ZWx5CitjYWxsZWQgZnVuY3Rpb24uICBZb3UgaGF2ZSB0byBleGVjdXRlIGEgY2FsbCgpIGluc3RlYWQgb2YgYSBzZW5kKCkuCitUaGUgcmV0dXJuZWQgdmFsdWUgd2lsbCB0aGVuIGJlIGF2YWlsYWJsZSBpbiB0aGUgZGF0YSBwYXJhbWV0ZXIgInJlcGx5Ii4KK1RoZSBhY3R1YWwgcmV0dXJuIHZhbHVlIG9mIGNhbGwoKSBpcyBzdGlsbCB3aGV0aGVyIG9yIG5vdCBEQ09QCitjb21tdW5pY2F0aW9uIHdhcyBzdWNjZXNzZnVsLgorCitRQnl0ZUFycmF5IGRhdGEsIHJlcGx5RGF0YTsKK1FDU3RyaW5nIHJlcGx5VHlwZTsKK1FEYXRhU3RyZWFtIGFyZyhkYXRhLCBJT19Xcml0ZU9ubHkpOworYXJnIDw8IDU7CitpZiAoIWNsaWVudC0+Y2FsbCgic29tZUFwcElkIiwgImZvb09iamVjdC9iYXJPYmplY3QiLCAiZG9JdChpbnQpIiwKKyAgICAgICAgICAgICAgICAgIGRhdGEsIHJlcGx5VHlwZSwgcmVwbHlEYXRhKSkKKyAgcURlYnVnKCJ0aGVyZSB3YXMgc29tZSBlcnJvciB1c2luZyBEQ09QLiIpOworZWxzZSB7CisgIFFEYXRhU3RyZWFtIHJlcGx5KHJlcGx5RGF0YSwgSU9fUmVhZE9ubHkpOworICBpZiAocmVwbHlUeXBlID09ICJRU3RyaW5nIikgeworICAgIFFTdHJpbmcgcmVzdWx0OworICAgIHJlcGx5ID4+IHJlc3VsdDsKKyAgICBwcmludCgidGhlIHJlc3VsdCBpczogJXMiLHJlc3VsdC5sYXRpbjEoKSk7CisgIH0gZWxzZQorICAgIHFEZWJ1ZygiZG9JdCByZXR1cm5lZCBhbiB1bmV4cGVjdGVkIHR5cGUgb2YgcmVwbHkhIik7Cit9CisKK04uQi46IFlvdSBjYW5ub3QgY2FsbCgpIGEgbWV0aG9kIGJlbG9uZ2luZyB0byBhbiBhcHBsaWNhdGlvbiB3aGljaCBoYXMKK3JlZ2lzdGVyZWQgd2l0aCBhbiB1bmlxdWUgbnVtZXJpYyBpZCBhcHBlbmRlZCB0byBpdHMgdGV4dHVhbCBuYW1lIChzZWUKK2Rjb3BjbGllbnQuaCBmb3IgbW9yZSBpbmZvKS4gSW4gdGhpcyBjYXNlLCBEQ09QIHdvdWxkIG5vdCBrbm93IHdoaWNoCithcHBsaWNhdGlvbiBpdCBzaG91bGQgY29ubmVjdCB3aXRoIHRvIGNhbGwgdGhlIG1ldGhvZC4gVGhpcyBpcyBub3QgYW4gaXNzdWUKK3dpdGggc2VuZCgpLCBhcyB5b3UgY2FuIGJyb2FkY2FzdCB0byBhbGwgYXBwbGljYXRpb25zIHRoYXQgaGF2ZSByZWdpc3RlcmVkCit3aXRoIGFwcG5hbWUtPG51bWVyaWNfaWQ+IGJ5IHVzaW5nIGEgd2lsZGNhcmQgKGUuZy4gJ2tvbnNvbGUtKicpLCB3aGljaAord2lsbCBzZW5kIHlvdXIgc2lnbmFsIHRvIGFsbCBhcHBsaWNhdGlvbnMgY2FsbGVkICdrb25zb2xlJy4KKworUmVjZWl2aW5nIERhdGEgdmlhIERDT1A6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ3VycmVudGx5IHRoZSBvbmx5IHJlYWwgd2F5IHRvIHJlY2VpdmUgZGF0YSBmcm9tIERDT1AgaXMgdG8gbXVsdGlwbHkKK2luaGVyaXQgZnJvbSB0aGUgbm9ybWFsIGNsYXNzIHRoYXQgeW91IGFyZSBpbmhlcml0aW5nICh1c3VhbGx5IHNvbWUKK3NvcnQgb2YgUVdpZGdldCBzdWJjbGFzcyBvciBRT2JqZWN0KSBhcyB3ZWxsIGFzIHRoZSBEQ09QT2JqZWN0IGNsYXNzLgorRENPUE9iamVjdCBwcm92aWRlcyBvbmUgdmVyeSBpbXBvcnRhbnQgbWV0aG9kOiBEQ09QT2JqZWN0Ojpwcm9jZXNzKCkuCitUaGlzIGlzIGEgcHVyZSB2aXJ0dWFsIG1ldGhvZCB0aGF0IHlvdSBtdXN0IGltcGxlbWVudCBpbiBvcmRlciB0bworcHJvY2VzcyBEQ09QIG1lc3NhZ2VzIHRoYXQgeW91IHJlY2VpdmUuICBJdCB0YWtlcyBhIGZ1bmN0aW9uCitzaWduYXR1cmUsIFFCeXRlQXJyYXkgb2YgcGFyYW1ldGVycywgYW5kIGEgcmVmZXJlbmNlIHRvIGEgUUJ5dGVBcnJheQorZm9yIHRoZSByZXBseSBkYXRhIHRoYXQgeW91IG11c3QgZmlsbCBpbi4KKworVGhpbmsgb2YgRENPUE9iamVjdDo6cHJvY2VzcygpIGFzIGEgc29ydCBvZiBkaXNwYXRjaCBhZ2VudC4gIEluIHRoZQorZnV0dXJlLCB0aGVyZSB3aWxsIHByb2JhYmx5IGJlIGEgcHJlY29tcGlsZXIgZm9yIHlvdXIgc291cmNlcyB0byB3cml0ZQordGhpcyBtZXRob2QgZm9yIHlvdS4gIEhvd2V2ZXIsIHVudGlsIHRoYXQgcG9pbnQgeW91IG5lZWQgdG8gZXhhbWluZQordGhlIGluY29taW5nIGZ1bmN0aW9uIHNpZ25hdHVyZSBhbmQgdGFrZSBhY3Rpb24gYWNjb3JkaW5nbHkuICBIZXJlIGlzCithbiBleGFtcGxlIGltcGxlbWVudGF0aW9uLgorCitib29sIEJhck9iamVjdDo6cHJvY2Vzcyhjb25zdCBRQ1N0cmluZyAmZnVuLCBjb25zdCBRQnl0ZUFycmF5ICZkYXRhLAorCQkgICAgICAgIFFDU3RyaW5nICZyZXBseVR5cGUsIFFCeXRlQXJyYXkgJnJlcGx5RGF0YSkKK3sKKyAgaWYgKGZ1biA9PSAiZG9JdChpbnQpIikgeworICAgIFFEYXRhU3RyZWFtIGFyZyhkYXRhLCBJT19SZWFkT25seSk7CisgICAgaW50IGk7IC8vIHBhcmFtZXRlcgorICAgIGFyZyA+PiBpOworICAgIFFTdHJpbmcgcmVzdWx0ID0gc2VsZi0+ZG9JdCAoaSk7CisgICAgUURhdGFTdHJlYW0gcmVwbHkocmVwbHlEYXRhLCBJT19Xcml0ZU9ubHkpOworICAgIHJlcGx5IDw8IHJlc3VsdDsKKyAgICByZXBseVR5cGUgPSAiUVN0cmluZyI7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgcURlYnVnKCJ1bmtub3duIGZ1bmN0aW9uIGNhbGwgdG8gQmFyT2JqZWN0Ojpwcm9jZXNzKCkiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworUmVjZWl2aW5nIENhbGxzIGFuZCBwcm9jZXNzaW5nIHRoZW06CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSWYgeW91ciBhcHBsaWNhdGlvbnMgaXMgYWJsZSB0byBwcm9jZXNzIGluY29taW5nIGZ1bmN0aW9uIGNhbGxzCityaWdodCBhd2F5IHRoZSBhYm92ZSBjb2RlIGlzIGFsbCB5b3UgbmVlZC4gV2hlbiB5b3VyIGFwcGxpY2F0aW9uCituZWVkcyB0byBkbyBtb3JlIGNvbXBsZXggdGFza3MgeW91IG1pZ2h0IHdhbnQgdG8gZG8gdGhlIHByb2Nlc3NpbmcKK291dCBvZiAncHJvY2VzcycgZnVuY3Rpb24gY2FsbCBhbmQgc2VuZCB0aGUgcmVzdWx0IGJhY2sgbGF0ZXIgd2hlbgoraXQgYmVjb21lcyBhdmFpbGFibGUuCisKK0ZvciB0aGlzIHlvdSBjYW4gYXNrIHlvdXIgRENPUENsaWVudCBmb3IgYSB0cmFuc2FjdGlvbklkLiBZb3UgY2FuCit0aGVuIHJldHVybiBmcm9tIHRoZSAncHJvY2VzcycgZnVuY3Rpb24gYW5kIHdoZW4gdGhlIHJlc3VsdCBpcworYXZhaWxhYmxlIGZpbmlzaCB0aGUgdHJhbnNhY3Rpb24uIEluIHRoZSBtZWFuIHRpbWUgeW91ciBhcHBsaWNhdGlvbgorY2FuIHJlY2VpdmUgaW5jb21pbmcgRENPUCBmdW5jdGlvbiBjYWxscyBmcm9tIG90aGVyIGNsaWVudHMuCisKK1N1Y2ggY29kZSBjb3VsZCBsaWtlIHRoaXM6CisKK2Jvb2wgQmFyT2JqZWN0Ojpwcm9jZXNzKGNvbnN0IFFDU3RyaW5nICZmdW4sIGNvbnN0IFFCeXRlQXJyYXkgJmRhdGEsCisJCSAgICAgICAgUUNTdHJpbmcgJiwgUUJ5dGVBcnJheSAmKQoreworICBpZiAoZnVuID09ICJkb0l0KGludCkiKSB7CisgICAgUURhdGFTdHJlYW0gYXJnKGRhdGEsIElPX1JlYWRPbmx5KTsKKyAgICBpbnQgaTsgLy8gcGFyYW1ldGVyCisgICAgYXJnID4+IGk7CisgICAgUVN0cmluZyByZXN1bHQgPSBzZWxmLT5kb0l0KGkpOworCisgICAgRENPUENsaWVudFRyYW5zYWN0aW9uICpteVRyYW5zYWN0aW9uOworICAgIG15VHJhbnNhY3Rpb24gPSBrYXBwLT5kY29wQ2xpZW50KCktPmJlZ2luVHJhbnNhY3Rpb24oKTsKKworICAgIC8vIHN0YXJ0IHByb2Nlc3NpbmcuLi4KKyAgICAvLyBDYWxscyBzbG90UHJvY2Vzc2luZ0RvbmUgd2hlbiBmaW5pc2hlZC4KKyAgICBzdGFydFByb2Nlc3NpbmcoIG15VHJhbnNhY3Rpb24sIGkpOworCisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgcURlYnVnKCJ1bmtub3duIGZ1bmN0aW9uIGNhbGwgdG8gQmFyT2JqZWN0Ojpwcm9jZXNzKCkiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworc2xvdFByb2Nlc3NpbmdEb25lKERDT1BDbGllbnRUcmFuc2FjdGlvbiAqbXlUcmFuc2FjdGlvbiwgY29uc3QgUVN0cmluZyAmcmVzdWx0KQoreworICAgIFFDU3RyaW5nIHJlcGx5VHlwZSA9ICJRU3RyaW5nIjsKKyAgICBRQnl0ZUFycmF5IHJlcGx5RGF0YTsKKyAgICBRRGF0YVN0cmVhbSByZXBseShyZXBseURhdGEsIElPX1dyaXRlT25seSk7CisgICAgcmVwbHkgPDwgcmVzdWx0OworICAgIGthcHAtPmRjb3BDbGllbnQoKS0+ZW5kVHJhbnNhY3Rpb24oIG15VHJhbnNhY3Rpb24sIHJlcGx5VHlwZSwgcmVwbHlEYXRhICk7Cit9CisKK0RDT1AgU2lnbmFscworLS0tLS0tLS0tLS0tCisKK1NvbWV0aW1lcyBhIGNvbXBvbmVudCB3YW50cyB0byBzZW5kIG5vdGlmaWNhdGlvbnMgdmlhIERDT1AgdG8gb3RoZXIKK2NvbXBvbmVudHMgYnV0IGRvZXMgbm90IGtub3cgd2hpY2ggY29tcG9uZW50cyB3aWxsIGJlIGludGVyZXN0ZWQgaW4gdGhlc2UKK25vdGlmaWNhdGlvbnMuIE9uZSBjb3VsZCB1c2UgYSBicm9hZGNhc3QgaW4gc3VjaCBhIGNhc2UgYnV0IHRoaXMgaXMgYSB2ZXJ5CitjcnVkZSBtZXRob2QuIEZvciBhIG1vcmUgc29waGlzdGljYXRlZCBtZXRob2QgRENPUCBzaWduYWxzIGhhdmUgYmVlbiBpbnZlbnRlZC4KKworRENPUCBzaWduYWxzIGFyZSB2ZXJ5IHNpbWlsYWlyIHRvIFF0IHNpZ25hbHMsIHRoZXJlIGFyZSBzb21lIGRpZmZlcmVuY2VzIAordGhvdWdoLiBBIERDT1Agc2lnbmFsIGNhbiBiZSBjb25uZWN0ZWQgdG8gYSBEQ09QIGZ1bmN0aW9uLiBXaGVuZXZlciB0aGUgRENPUAorc2lnbmFsIGdldHMgZW1pdHRlZCwgdGhlIERDT1AgZnVuY3Rpb25zIHRvIHdoaWNoIHRoZSBzaWduYWwgaXMgY29ubmVjdGVkIGFyZQorYmVpbmcgY2FsbGVkLiBEQ09QIHNpZ25hbHMgYXJlLCBqdXN0IGxpa2UgUXQgc2lnbmFscywgb25lIHdheS4gVGhleSBkbyBub3QKK3Byb3ZpZGUgYSByZXR1cm4gdmFsdWUuIAorCitBIERDT1Agc2lnbmFsIG9yaWdpbmF0ZXMgZnJvbSBhIERDT1AgT2JqZWN0L0RDT1AgQ2xpZW50IGNvbWJpbmF0aW9uIChzZW5kZXIpLiAKK0l0IGNhbiBiZSBjb25uZWN0ZWQgdG8gYSBmdW5jdGlvbiBvZiBhbm90aGVyIERDT1AgT2JqZWN0L0RDT1AgQ2xpZW50IAorY29tYmluYXRpb24gKHJlY2VpdmVyKS4KKworVGhlcmUgYXJlIHR3byBtYWpvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIGNvbm5lY3Rpb25zIG9mIFF0IHNpZ25hbHMgYW5kIAorY29ubmVjdGlvbnMgb2YgRENPUCBzaWduYWxzLiBJbiBEQ09QLCB1bmxpa2UgUXQsIGEgc2lnbmFsIGNvbm5lY3Rpb25zIGNhbgoraGF2ZSBhbiBhbm9ueW1vdXMgc2VuZGVyIGFuZCwgdW5saWtlIFF0LCBhIERDT1Agc2lnbmFsIGNvbm5lY3Rpb24gY2FuIGJlCitub24tdm9sYXRpbGUuCisKK1dpdGggRENPUCBvbmUgY2FuIGNvbm5lY3QgYSBzaWduYWwgd2l0aG91dCBzcGVjaWZ5aW5nIHRoZSBzZW5kaW5nIERDT1AgT2JqZWN0IAorb3IgRENPUCBDbGllbnQuIEluIHRoYXQgY2FzZSBzaWduYWxzIGZyb20gYW55IERDT1AgT2JqZWN0IGFuZC9vciBEQ09QIENsaWVudAord2lsbCBiZSBkZWxpdmVyZWQuIFRoaXMgYWxsb3dzIHRoZSBzcGVjaWZpY2F0aW9uIG9mIGNlcnRhaW4gZXZlbnRzIHdpdGhvdXQKK3R5aW5nIG9uZXNlbGYgdG8gYSBjZXJ0YWluIG9iamVjdCB0aGF0IGltcGxlbWVudGVzIHRoZSBldmVudHMuCisKK0Fub3RoZXIgRENPUCBmZWF0dXJlIGFyZSBzbyBjYWxsZWQgbm9uLXZvbGF0aWxlIGNvbm5lY3Rpb25zLiBXaXRoIFF0IHNpZ25hbAorY29ubmVjdGlvbnMsIHRoZSBjb25uZWN0aW9uIGdldHMgZGVsZXRlZCB3aGVuIGVpdGhlciBzZW5kZXIgb3IgcmVjZWl2ZXIgb2YKK3RoZSBzaWduYWwgZ2V0cyBkZWxldGVkLiBBIHZvbGF0aWxlIERDT1Agc2lnbmFsIGNvbm5lY3Rpb24gd2lsbCBiZWhhdmUgdGhlCitzYW1lLiBIb3dldmVyLCBhIG5vbi12b2xhdGlsZSBEQ09QIHNpZ25hbCBjb25uZWN0aW9uIHdpbGwgbm90IGdldCBkZWxldGVkIAord2hlbiB0aGUgc2VuZGluZyBvYmplY3QgZ2V0cyBkZWxldGVkLiBPbmNlIGEgbmV3IG9iamVjdCBnZXRzIGNyZWF0ZWQgd2l0aCAKK3RoZSBzYW1lIG5hbWUgYXMgdGhlIG9yaWdpbmFsIHNlbmRpbmcgb2JqZWN0LCB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIHJlc3RvcmVkLgorVGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gd2hlbiB0aGUgcmVjZWl2aW5nIG9iamVjdCBnZXRzIGRlbGV0ZWQsCitpbiB0aGF0IGNhc2UgdGhlIHNpZ25hbCBjb25uZWN0aW9uIHdpbGwgYWx3YXlzIGJlIGRlbGV0ZWQuCisKK0EgcmVjZWl2ZXIgY2FuIGNyZWF0ZSBhIG5vbi12b2xhdGlsZSBjb25uZWN0aW9uIHdoaWxlIHRoZSBzZW5kZXIgZG9lc24ndCAoeWV0KQorZXhpc3QuIEFuIGFub255bW91cyBEQ09QIGNvbm5lY3Rpb24gc2hvdWxkIGFsd2F5cyBiZSBub24tdm9sYXRpbGUuCisKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgS0xhdW5jaGVyIGVtaXRzIGEgc2lnbmFsIHdoZW5ldmVyIGl0IG5vdGljZXMKK3RoYXQgYW4gYXBwbGljYXRpb24gdGhhdCB3YXMgc3RhcnRlZCB2aWEgS0xhdW5jaGVyIHRlcm1pbmF0ZXMuCisKKyAgIFFCeXRlQXJyYXkgcGFyYW1zOworICAgUURhdGFTdHJlYW0gc3RyZWFtKHBhcmFtcywgSU9fV3JpdGVPbmx5KTsKKyAgIHN0cmVhbSA8PCBwaWQ7CisgICBrYXBwLT5kY29wQ2xpZW50KCktPmVtaXREQ09QU2lnbmFsKCJjbGllbnREaWVkKHBpZF90KSIsIHBhcmFtcyk7CisKK1RoZSB0YXNrIG1hbmFnZXIgb2YgdGhlIEtERSBwYW5lbCBjb25uZWN0cyB0byB0aGlzIHNpZ25hbC4gSXQgdXNlcyBhbiAKK2Fub255bW91cyBjb25uZWN0aW9uIChpdCBkb2Vzbid0IHJlcXVpcmUgdGhhdCB0aGUgc2lnbmFsIGlzIGJlaW5nIGVtaXR0ZWQKK2J5IEtMYXVuY2hlcikgdGhhdCBpcyBub24tdm9sYXRpbGU6CisKKyAgIGNvbm5lY3REQ09QU2lnbmFsKDAsIDAsICJjbGllbnREaWVkKHBpZF90KSIsICJjbGllbnREaWVkKHBpZF90KSIsIGZhbHNlKTsKKworSXQgY29ubmVjdHMgdGhlIGNsaWVudERpZWQocGlkX3QpIHNpZ25hbCB0byBpdHMgb3duIGNsaWVudERpZWQocGlkX3QpIERDT1AKK2Z1bmN0aW9uLiBJbiB0aGlzIGNhc2UgdGhlIHNpZ25hbCBhbmQgdGhlIGZ1bmN0aW9uIHRvIGNhbGwgaGF2ZSB0aGUgc2FtZSBuYW1lLgorVGhpcyBpc24ndCBuZWVkZWQgYXMgbG9uZyBhcyB0aGUgYXJndW1lbnRzIG9mIGJvdGggc2lnbmFsIGFuZCByZWNlaXZpbmcgZnVuY3Rpb24KK21hdGNoLiBUaGUgcmVjZWl2aW5nIGZ1bmN0aW9uIG1heSBpZ25vcmUgb25lIG9yIG1vcmUgb2YgdGhlIHRyYWlsaW5nIGFyZ3VtZW50cworb2YgdGhlIHNpZ25hbC4gRS5nLiBpdCBpcyBhbGxvd2VkIHRvIGNvbm5lY3QgdGhlIGNsaWVudERpZWQocGlkX3QpIHNpZ25hbCB0bworYSBjbGllbnREaWVkKHZvaWQpIERDT1AgZnVuY3Rpb24uCisKK1VzaW5nIHRoZSBkY29waWRsIGNvbXBpbGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGNvcGlkbCBtYWtlcyBzZXR0aW5nIHVwIGEgRENPUCBzZXJ2ZXIgZWFzeS4gSW5zdGVhZCBvZiBoYXZpbmcgdG8gaW1wbGVtZW50Cit0aGUgcHJvY2VzcygpIG1ldGhvZCBhbmQgdW5tYXJzaGFsbGluZyAocmV0cmlldmluZyBmcm9tIFFCeXRlQXJyYXkpIHBhcmFtZXRlcnMKK21hbnVhbGx5LCB5b3UgY2FuIGxldCBkY29waWRsIGNyZWF0ZSB0aGUgbmVjZXNzYXJ5IGNvZGUgb24geW91ciBiZWhhbGYuCisKK1RoaXMgYWxzbyBhbGxvd3MgeW91IHRvIGRlc2NyaWJlIHRoZSBpbnRlcmZhY2UgZm9yIHlvdXIgY2xhc3MgaW4gYQorc2luZ2xlLCBzZXBhcmF0ZSBoZWFkZXIgZmlsZS4KKworV3JpdGluZyBhbiBJREwgZmlsZSBpcyB2ZXJ5IHNpbWlsYXIgdG8gd3JpdGluZyBhIG5vcm1hbCBDKysgaGVhZGVyLiBBbgorZXhjZXB0aW9uIGlzIHRoZSBrZXl3b3JkICdBU1lOQycuIEl0IGluZGljYXRlcyB0aGF0IGEgY2FsbCB0byB0aGlzCitmdW5jdGlvbiBzaGFsbCBiZSBwcm9jZXNzZWQgYXN5bmNocm9ub3VzbHkuIEZvciB0aGUgQysrIGNvbXBpbGVyLCBpdAorZXhwYW5kcyB0byAndm9pZCcuCisKK0V4YW1wbGU6CisKKyNpZm5kZWYgTVlfSU5URVJGQUNFX0gKKyNkZWZpbmUgTVlfSU5URVJGQUNFX0gKKworI2luY2x1ZGUgPGRjb3BvYmplY3QuaD4KKworY2xhc3MgTXlJbnRlcmZhY2UgOiB2aXJ0dWFsIHB1YmxpYyBEQ09QT2JqZWN0Cit7CisgIEtfRENPUAorCisgIGtfZGNvcDoKKworICAgIHZpcnR1YWwgQVNZTkMgbXlBc3luY2hyb25vdXNNZXRob2QoUVN0cmluZyBzb21lUGFyYW1ldGVyKSA9IDA7CisgICAgdmlydHVhbCBRUmVjdCBteVN5bmNocm9ub3VzTWV0aG9kKCkgPSAwOworfTsKKworI2VuZGlmCisKK0FzIHlvdSBjYW4gc2VlLCB5b3UncmUgZXNzZW50aWFsbHkgZGVjbGFyaW5nIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MsIHdoaWNoCit2aXJ0dWFsbHkgaW5oZXJpdHMgZnJvbSBEQ09QT2JqZWN0LgorCitJZiB5b3UncmUgdXNpbmcgdGhlIHN0YW5kYXJkIEtERSBidWlsZCBzY3JpcHRzLCB0aGVuIHlvdSBjYW4gc2ltcGx5CithZGQgdGhpcyBmaWxlICh3aGljaCB5b3Ugd291bGQgY2FsbCBNeUludGVyZmFjZS5oKSB0byB5b3VyIHNvdXJjZXMKK2RpcmVjdG9yeS4gVGhlbiB5b3UgZWRpdCB5b3VyIE1ha2VmaWxlLmFtLCBhZGRpbmcgJ015SW50ZXJmYWNlLnNrZWwnCit0byB5b3VyIFNPVVJDRVMgbGlzdCBhbmQgTXlJbnRlcmZhY2UuaCB0byBpbmNsdWRlX0hFQURFUlMuCisKK1RoZSBidWlsZCBzY3JpcHRzIHdpbGwgdXNlIGRjb3BpZGwgdG8gcGFyc2UgTXlJbnRlcmZhY2UuaCwgY29udmVydGluZworaXQgdG8gYW4gWE1MIGRlc2NyaXB0aW9uIGluIE15SW50ZXJmYWNlLmtpZGwuIE5leHQsIGEgZmlsZSBjYWxsZWQKK015SW50ZXJmYWNlX3NrZWwuY3BwIHdpbGwgYXV0b21hdGljYWxseSBiZSBjcmVhdGVkLCBjb21waWxlZCBhbmQKK2xpbmtlZCB3aXRoIHlvdXIgYmluYXJ5LgorCitUaGUgbmV4dCB0aGluZyB5b3UgaGF2ZSB0byBkbyBpcyB0byBjaG9vc2Ugd2hpY2ggb2YgeW91ciBjbGFzc2VzIHdpbGwKK2ltcGxlbWVudCB0aGUgaW50ZXJmYWNlIGRlc2NyaWJlZCBpbiBNeUludGVyZmFjZS5oLiBBbHRlciB0aGUgaW5oZXJpdGFuY2UKK29mIHRoaXMgY2xhc3Mgc3VjaCB0aGF0IGl0IHZpcnR1YWxseSBpbmhlcml0cyBmcm9tIE15SW50ZXJmYWNlLiBUaGVuCithZGQgZGVjbGFyYXRpb25zIHRvIHlvdXIgY2xhc3MgaW50ZXJmYWNlIHNpbWlsYXIgdG8gdGhvc2Ugb24gTXlJbnRlcmZhY2UuaCwKK2J1dCB2aXJ0dWFsLCBub3QgcHVyZSB2aXJ0dWFsLgorCitFeGFtcGxlOgorCitjbGFzcyBNeUNsYXNzOiBwdWJsaWMgUU9iamVjdCwgdmlydHVhbCBwdWJsaWMgTXlJbnRlcmZhY2UKK3sKKyAgUV9PQkpFQ1QKKyAgCisgIHB1YmxpYzoKKyAgICBNeUNsYXNzKCk7IAorICAgIH5NeUNsYXNzKCk7CisKKyAgICBBU1lOQyBteUFzeW5jaHJvbm91c01ldGhvZChRU3RyaW5nIHNvbWVQYXJhbWV0ZXIpOworICAgIFFSZWN0IG15U3luY2hyb25vdXNNZXRob2QoKTsKK307CisKK05vdGU6IChRdCBpc3N1ZSkgUmVtZW1iZXIgdGhhdCBpZiB5b3UgYXJlIGluaGVyaXRpbmcgZnJvbSBRT2JqZWN0LCB5b3UgbXVzdAorcGxhY2UgaXQgZmlyc3QgaW4gdGhlIGxpc3Qgb2YgaW5oZXJpdGVkIGNsYXNzZXMuCisKK0luIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB5b3VyIGNsYXNzJyBjdG9yLCB5b3UgbXVzdCBleHBsaWNpdGx5IGluaXRpYWxpemUKK3Rob3NlIGNsYXNzZXMgZnJvbSB3aGljaCB5b3UgYXJlIGluaGVyaXRpbmcgZnJvbS4gVGhpcyBpcywgb2YgY291cnNlLCBnb29kCitwcmFjdGlzZSwgYnV0IGl0IGlzIGVzc2VudGlhbCBoZXJlIGFzIHlvdSBuZWVkIHRvIHRlbGwgRENPUE9iamVjdCB0aGUgbmFtZSBvZgordGhlIGludGVyZmFjZSB3aGljaCB5b3VyIGFyZSBpbXBsZW1lbnRpbmcuCisKK0V4YW1wbGU6CisKK015Q2xhc3M6Ok15Q2xhc3MoKQorICA6IFFPYmplY3QoKSwKKyAgICBEQ09QT2JqZWN0KCJNeUludGVyZmFjZSIpCit7CisgIC8vIHdoYXRldmVyLi4uCit9CisKK05vdyB5b3UgY2FuIHNpbXBseSBpbXBsZW1lbnQgdGhlIG1ldGhvZHMgeW91IGhhdmUgZGVjbGFyZWQgaW4geW91ciBpbnRlcmZhY2UsCitleGFjdGx5IHRoZSBzYW1lIGFzIHlvdSB3b3VsZCBub3JtYWxseS4KKworRXhhbXBsZToKKwordm9pZCBNeUNsYXNzOjpteUFzeW5jaHJvbm91c01ldGhvZChRU3RyaW5nIHNvbWVQYXJhbWV0ZXIpCit7CisgIHFEZWJ1ZygibXlBc3luY01ldGhvZCBjYWxsZWQgd2l0aCBwYXJhbSBgIiArIHNvbWVQYXJhbWV0ZXIgKyAiJyIpOworfQorCisKK0l0IGlzIG5vdCBuZWNlc3NhcnkgKHRob3VnaCB2ZXJ5IGNsZWFuKSB0byBkZWZpbmUgYW4gaW50ZXJmYWNlIGFzIGFuCithYnN0cmFjdCBjbGFzcyBvZiBpdHMgb3duLCBsaWtlIHdlIGRpZCBpbiB0aGUgZXhhbXBsZSBhYm92ZS4gV2UgY291bGQKK2p1c3QgYXMgd2VsbCBoYXZlIGRlZmluZWQgYSBrX2Rjb3Agc2VjdGlvbiBkaXJlY3RseSB3aXRoaW4gTXlDbGFzczoKKworY2xhc3MgTXlDbGFzczogcHVibGljIFFPYmplY3QsIHZpcnR1YWwgcHVibGljIERDT1BPYmplY3QKK3sKKyAgUV9PQkpFQ1QKKyAgS19EQ09QCisKKyAgcHVibGljOgorICAgIE15Q2xhc3MoKTsgCisgICAgfk15Q2xhc3MoKTsKKworICBrX2Rjb3A6CisgICAgQVNZTkMgbXlBc3luY2hyb25vdXNNZXRob2QoUVN0cmluZyBzb21lUGFyYW1ldGVyKTsKKyAgICBRUmVjdCBteVN5bmNocm9ub3VzTWV0aG9kKCk7Cit9OworCitJbiBhZGRpdGlvbiB0byBza2VsZXRvbnMsIGRjb3BpZGwyY3BwIGFsc28gZ2VuZXJhdGUgc3R1YnMuIFRob3NlIG1ha2UKK2l0IGVhc3kgdG8gY2FsbCBhIERDT1AgaW50ZXJmYWNlIHdpdGhvdXQgZG9pbmcgdGhlIG1hcnNoYWxsaW5nCittYW51YWxseS4gVG8gdXNlIGEgc3R1YiwgYWRkIE15SW50ZXJmYWNlLnN0dWIgdG8gdGhlIFNPVVJDRVMgbGlzdCBvZgoreW91ciBNYWtlZmlsZS5hbS4gVGhlIHN0dWIgY2xhc3Mgd2lsbCB0aGVuIGJlIGNhbGxlZCBNeUludGVyZmFjZV9zdHViLgorCitDb25jbHVzaW9uOgorLS0tLS0tLS0tLS0KKworSG9wZWZ1bGx5IHRoaXMgZG9jdW1lbnQgd2lsbCBnZXQgeW91IHdlbGwgb24geW91ciB3YXkgaW50byB0aGUgd29ybGQKK29mIGludGVyLXByb2Nlc3MgY29tbXVuaWNhdGlvbiB3aXRoIEtERSEgIFBsZWFzZSBkaXJlY3QgYWxsIGNvbW1lbnRzCithbmQvb3Igc3VnZ2VzdGlvbnMgdG8gUHJlc3RvbiBCcm93biA8cGJyb3duQGtkZS5vcmc+IGFuZCBNYXR0aGlhcworRXR0cmljaCA8ZXR0cmljaEBrZGUub3JnPi4KKworCitJbnRlci11c2VyIGNvbW11bmljYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTb21ldGltZXMgaXQgbWlnaHQgYmUgaW50ZXJlc3RpbmcgdG8gdXNlIERDT1AgYmV0d2VlbiBwcm9jZXNzZXMKK2JlbG9uZ2luZyB0byBkaWZmZXJlbnQgdXNlcnMsIGUuZy4gYSBmcm9udGVuZCBwcm9jZXNzIHJ1bm5pbmcKK3dpdGggdGhlIHVzZXIncyBpZCwgYW5kIGEgYmFja2VuZCBwcm9jZXNzIHJ1bm5pbmcgYXMgcm9vdC4KKworVG8gZG8gdGhpcywgdHdvIHN0ZXBzIGhhdmUgdG8gYmUgdGFrZW46CisKK2EpIGJvdGggcHJvY2Vzc2VzIG5lZWQgdG8gdGFsayB0byB0aGUgc2FtZSBEQ09QIHNlcnZlcgorYikgdGhlIGF1dGhlbnRpY2F0aW9uIG11c3QgYmUgZW5zdXJlZAorCitGb3IgdGhlIGZpcnN0IHN0ZXAsIHlvdSBzaW1wbHkgcGFzcyB0aGUgc2VydmVyIGFkZHJlc3MgKGFzCitmb3VuZCBpbiAuRENPUHNlcnZlcikgdG8gdGhlIHNlY29uZCBwcm9jZXNzLiBGb3IgdGhlIGF1dGhlbnRpY2F0aW9uLAoreW91IGNhbiB1c2UgdGhlIElDRUFVVEhPUklUWSBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0ZWxsIHRoZQorc2Vjb25kIHByb2Nlc3Mgd2hlcmUgdG8gZmluZCB0aGUgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24uCisoTm90ZSB0aGF0IHRoaXMgaW1wbGllcyB0aGF0IHRoZSBzZWNvbmQgcHJvY2VzcyBpcyBhYmxlIHRvCityZWFkIHRoZSBhdXRoZW50aWNhdGlvbiBmaWxlLCBzbyBpdCB3aWxsIHByb2JhYmx5IG9ubHkgd29yaworaWYgdGhlIHNlY29uZCBwcm9jZXNzIHJ1bnMgYXMgcm9vdC4gSWYgaXQgc2hvdWxkIHJ1biBhcyBhbm90aGVyCit1c2VyLCBhIHNpbWlsYXIgYXBwcm9hY2ggdG8gd2hhdCBrZGVzdSBkb2VzIHdpdGggeGF1dGggbXVzdAorYmUgdGFrZW4uIEluIGZhY3QsIGl0IHdvdWxkIGJlIGEgdmVyeSBnb29kIGlkZWEgdG8gYWRkIERDT1AKK3N1cHBvcnQgdG8ga2Rlc3UhKQorCitGb3IgZXhhbXBsZQorCitJQ0VBVVRIT1JJVFk9fnVzZXIvLklDRWF1dGhvcml0eSBrZGVzdSByb290IC1jIGtjbXJvb3QgLWRjb3BzZXJ2ZXIgYGNhdCB+dXNlci8uRENPUHNlcnZlcmAKKword2lsbCwgYWZ0ZXIga2Rlc3UgZ290IHRoZSByb290IHBhc3N3b3JkLCBleGVjdXRlIGtjbXJvb3QgYXMgcm9vdCwgdGFsa2luZwordG8gdGhlIHVzZXIncyBkY29wIHNlcnZlci4KKworCitOT1RFOiBEQ09QIGNvbW11bmljYXRpb24gaXMgbm90IGVuY3J5cHRlZCwgc28gcGxlYXNlIGRvIG5vdAorcGFzcyBpbXBvcnRhbnQgaW5mb3JtYXRpb24gYXJvdW5kIHRoaXMgd2F5LgorCisKK1BlcmZvcm1hbmNlIFRlc3RzOgorLS0tLS0tLS0tLS0tLS0tLS0tCitBIGZldyBiYWNrLW9mLXRoZS1uYXBraW4gdGVzdHMgZm9sa3M6CisKK0NvZGU6CisKKyNpbmNsdWRlIDxrYXBwbGljYXRpb24uaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBLQXBwbGljYXRpb24gKmFwcDsKKworICBhcHAgPSBuZXcgS0FwcGxpY2F0aW9uKGFyZ2MsIGFyZ3YsICJ0ZXN0aXQiKTsKKyAgcmV0dXJuIGFwcC0+ZXhlYygpOworfQorCitDb21waWxlZCB3aXRoOgorCitnKysgLU8yIC1vIHRlc3RpdCB0ZXN0aXQuY3BwIC1JJFFURElSL2luY2x1ZGUgLUwkUVRESVIvbGliIC1sa2RlY29yZQorCitvbiBMaW51eCB5aWVsZHMgdGhlIGZvbGxvd2luZyBtZW1vcnkgdXNlIHN0YXRpc3RpY3M6CisKK1ZtU2l6ZTogICAgIDgwNzYga0IKK1ZtTGNrOiAgICAgICAgIDAga0IKK1ZtUlNTOiAgICAgIDQ1MzIga0IKK1ZtRGF0YTogICAgICAyMDgga0IKK1ZtU3RrOiAgICAgICAgMjAga0IKK1ZtRXhlOiAgICAgICAgIDQga0IKK1ZtTGliOiAgICAgIDY1ODgga0IKKworSWYgSSBjcmVhdGUgdGhlIEtBcHBsaWNhdGlvbidzIERDT1BDbGllbnQsIGFuZCBjYWxsIGF0dGFjaCgpIGFuZAorcmVnaXN0ZXJBcygpLCBpdCBjaGFuZ2VzIHRvIHRoaXM6CisKK1ZtU2l6ZTogICAgIDgwODAga0IKK1ZtTGNrOiAgICAgICAgIDAga0IKK1ZtUlNTOiAgICAgIDQ2MjQga0IKK1ZtRGF0YTogICAgICAyMDgga0IKK1ZtU3RrOiAgICAgICAgMjAga0IKK1ZtRXhlOiAgICAgICAgIDQga0IKK1ZtTGliOiAgICAgIDY1ODgga0IKKworQmFzaWNhbGx5IGl0IGFwcGVhcnMgdGhhdCB1c2luZyBEQ09QIGNhdXNlcyAxMDBrIG1vcmUgbWVtb3J5IHRvIGJlCityZXNpZGVudCwgYnV0IG5vIG1vcmUgZGF0YSBvciBzdGFjay4gIFNvIHRoaXMgd2lsbCBiZSBzaGFyZWQgYmV0d2VlbiBhbGwKK3Byb2Nlc3NlcywgcmlnaHQ/ICAxMDBrIHRvIGVuYWJsZSBEQ09QIGluIGFsbCBhcHBzIGRvZXNuJ3Qgc2VlbSBiYWQgYXQKK2FsbC4gOikKKworT0sgbm93IGZvciBzb21lIHRpbWluZ3MuICBKdXN0IGNyZWF0aW5nIGEgS0FwcGxpY2F0aW9uIGFuZCB0aGVuIGV4aXRpbmcKKyhpLmUuIHJlbW92aW5nIHRoZSBjYWxsIHRvIEtBcHBsaWNhdGlvbjo6ZXhlYykgdGFrZXMgdGhpcyBtdWNoIHRpbWU6CisKKzAuMjh1c2VyIDAuMDJzeXN0ZW0gMDowMC4zMmVsYXBzZWQgOTIlQ1BVICgwYXZndGV4dCswYXZnZGF0YSAwbWF4cmVzaWRlbnQpaworMGlucHV0cyswb3V0cHV0cyAoMTA4NG1ham9yKzYybWlub3IpcGFnZWZhdWx0cyAwc3dhcHMKKworSS5lLiBhYm91dCAxLzMgb2YgYSBzZWNvbmQgb24gbXkgUElJLTIzMy4gIE5vdywgaWYgd2UgY3JlYXRlIG91ciBEQ09QCitvYmplY3QgYW5kIGF0dGFjaCB0byB0aGUgc2VydmVyLCBpdCB0YWtlcyB0aGlzIGxvbmc6CisKKzAuMjd1c2VyIDAuMDNzeXN0ZW0gMDowMC4zNGVsYXBzZWQgODclQ1BVICgwYXZndGV4dCswYXZnZGF0YSAwbWF4cmVzaWRlbnQpaworMGlucHV0cyswb3V0cHV0cyAoMTEwN21ham9yKzY1bWlub3IpcGFnZWZhdWx0cyAwc3dhcHMKKworSS5lLiBhYm91dCAxLzMgb2YgYSBzZWNvbmQuICBCYXNpY2FsbHkgRENPUENsaWVudCBjcmVhdGlvbiBhbmQgYXR0YWNoaW5nCitnZXRzIGxvc3QgaW4gdGhlIHN0YXRpc3RpY2FsIHZhcmlhdGlvbiAoIm5vaXNlIikuICBJIHdhcyBnZXR0aW5nIHRpbWVzCitiZXR3ZWVuIC4zMiBhbmQgLjQ4IG92ZXIgc2V2ZXJhbCBydW5zIGZvciBib3RoIG9mIHRoZSBleGFtcGxlIHByb2dyYW1zLCBzbworb2J2aW91c2x5IHN5c3RlbSBsb2FkIGlzIG1vcmUgcmVsZXZhbnQgdGhhbiB0aGUgZXh0cmEgdHdvIGNhbGxzIHRvCitEQ09QQ2xpZW50OjphdHRhY2ggYW5kIERDT1BDbGllbnQ6OnJlZ2lzdGVyQXMsIGFzIHdlbGwgYXMgdGhlIGFjdHVhbAorRENPUENsaWVudCBjb25zdHJ1Y3RvciB0aW1lLgorCmRpZmYgLS1naXQgYS9kYnVzL2RvYy9kaWFncmFtLnBuZyBiL2RidXMvZG9jL2RpYWdyYW0ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYjg0YTkKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RvYy9kaWFncmFtLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kYnVzL2RvYy9kaWFncmFtLnN2ZyBiL2RidXMvZG9jL2RpYWdyYW0uc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5M2M1NjcKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RvYy9kaWFncmFtLnN2ZwpAQCAtMCwwICsxLDU5MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMC8vRU4iCisiaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMtU1ZHLTIwMDEwOTA0L0RURC9zdmcxMC5kdGQiPgorPCEtLSBDcmVhdGVkIHdpdGggSW5rc2NhcGUgKGh0dHA6Ly93d3cuaW5rc2NhcGUub3JnLykgLS0+Cis8c3ZnCisgICBpZD0ic3ZnMSIKKyAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCisgICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjM5IgorICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgorICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgorICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCisgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKKyAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKKyAgIHhtbG5zOmNjPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy8iCisgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCisgICB3aWR0aD0iODQxLjg4OTc1cHQiCisgICBoZWlnaHQ9IjU5NS4yNzU1OXB0IgorICAgc29kaXBvZGk6ZG9jYmFzZT0iL2hvbWUvaHAvZGJ1cy1jdnMvZGJ1cy9kb2MiCisgICBzb2RpcG9kaTpkb2NuYW1lPSJkaWFncmFtLnN2ZyI+CisgIDxkZWZzCisgICAgIGlkPSJkZWZzMyI+CisgICAgPG1hcmtlcgorICAgICAgIHN0eWxlPSJvdmVyZmxvdzp2aXNpYmxlOyIKKyAgICAgICBpZD0iQXJyb3cxTSIKKyAgICAgICByZWZYPSIwLjAiCisgICAgICAgcmVmWT0iMC4wIgorICAgICAgIG9yaWVudD0iYXV0byIKKyAgICAgICBpbmtzY2FwZTpzdG9ja2lkPSJBcnJvdzFNIj4KKyAgICAgIDxwYXRoCisgICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNCkiCisgICAgICAgICBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMHB0O21hcmtlci1zdGFydDpub25lOyIKKyAgICAgICAgIGQ9Ik0gMC4wLDAuMCBMIDUuMCwtNS4wIEwgLTEyLjUsMC4wIEwgNS4wLDUuMCBMIDAuMCwwLjAgeiAiCisgICAgICAgICBpZD0icGF0aDM1MTkiCisgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIiAvPgorICAgIDwvbWFya2VyPgorICAgIDxtYXJrZXIKKyAgICAgICBzdHlsZT0ib3ZlcmZsb3c6dmlzaWJsZTsiCisgICAgICAgaWQ9IkFycm93MkwiCisgICAgICAgcmVmWD0iMC4wIgorICAgICAgIHJlZlk9IjAuMCIKKyAgICAgICBvcmllbnQ9ImF1dG8iCisgICAgICAgaW5rc2NhcGU6c3RvY2tpZD0iQXJyb3cyTCI+CisgICAgICA8cGF0aAorICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgxLjEpIHRyYW5zbGF0ZSgtNSwwKSIKKyAgICAgICAgIGQ9Ik0gOC43MTg1ODc4LDQuMDMzNzM1MiBMIC0yLjIwNzI4OTUsMC4wMTYwMTMyNTYgTCA4LjcxODU4ODQsLTQuMDAxNzA3OCBDIDYuOTczMDkwMCwtMS42Mjk2NDY5IDYuOTgzMTQ3NiwxLjYxNTc0NDEgOC43MTg1ODc4LDQuMDMzNzM1MiB6ICIKKyAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTIuMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2Utd2lkdGg6MC42MjUwMDAwMDtzdHJva2UtbGluZWpvaW46cm91bmQ7IgorICAgICAgICAgaWQ9InBhdGgzNTE1IgorICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjIiAvPgorICAgIDwvbWFya2VyPgorICA8L2RlZnM+CisgIDxzb2RpcG9kaTpuYW1lZHZpZXcKKyAgICAgaWQ9ImJhc2UiCisgICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKKyAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCisgICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKKyAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKKyAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKKyAgICAgaW5rc2NhcGU6em9vbT0iMC45MDIxMDMxOCIKKyAgICAgaW5rc2NhcGU6Y3g9IjQyMC45NDQ4NyIKKyAgICAgaW5rc2NhcGU6Y3k9IjI5Ny42Mzc3OSIKKyAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxMDI0IgorICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI3MDEiCisgICAgIHNob3dncmlkPSJmYWxzZSIKKyAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJmYWxzZSIKKyAgICAgaW5rc2NhcGU6Z3JpZC1wb2ludHM9InRydWUiCisgICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgorICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMjQiCisgICAgIGdyaWRzcGFjaW5neT0iMi41MDAwMDAwbW0iCisgICAgIGdyaWRzcGFjaW5neD0iMi41MDAwMDAwbW0iCisgICAgIHNob3dndWlkZXM9InRydWUiCisgICAgIGlua3NjYXBlOmd1aWRlLWJib3g9InRydWUiPgorICAgIDxzb2RpcG9kaTpndWlkZQorICAgICAgIG9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgIHBvc2l0aW9uPSIyNjguODU3OTciCisgICAgICAgaWQ9Imd1aWRlMzU2NiIgLz4KKyAgICA8c29kaXBvZGk6Z3VpZGUKKyAgICAgICBvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICBwb3NpdGlvbj0iMjk0LjMxMjIzIgorICAgICAgIGlkPSJndWlkZTQyMzUiIC8+CisgICAgPHNvZGlwb2RpOmd1aWRlCisgICAgICAgb3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgcG9zaXRpb249IjMwMC40MDkwOSIKKyAgICAgICBpZD0iZ3VpZGU0ODgyIiAvPgorICA8L3NvZGlwb2RpOm5hbWVkdmlldz4KKyAgPG1ldGFkYXRhCisgICAgIGlkPSJtZXRhZGF0YTQiPgorICAgIDxyZGY6UkRGCisgICAgICAgaWQ9IlJERjUiPgorICAgICAgPGNjOldvcmsKKyAgICAgICAgIHJkZjphYm91dD0iIgorICAgICAgICAgaWQ9Ildvcms2Ij4KKyAgICAgICAgPGRjOmZvcm1hdAorICAgICAgICAgICBpZD0iZm9ybWF0NyI+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgorICAgICAgICA8ZGM6dHlwZQorICAgICAgICAgICBpZD0idHlwZTkiCisgICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CisgICAgICA8L2NjOldvcms+CisgICAgPC9yZGY6UkRGPgorICA8L21ldGFkYXRhPgorICA8cmVjdAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozLjc1MDAwMDA7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NC4wMDAwMDAwO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDsiCisgICAgIGlkPSJyZWN0OTA4IgorICAgICB3aWR0aD0iMzI1LjIzMjAzIgorICAgICBoZWlnaHQ9IjM1NC4zMzA3MiIKKyAgICAgeD0iMTcuNzE2NTM2IgorICAgICB5PSIzNzIuMDQ3MjQiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTguMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6Ym9sZDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2Fuczt0ZXh0LWFuY2hvcjpzdGFydDt3cml0aW5nLW1vZGU6bHI7IgorICAgICB4PSI3MC43NzgyNTIiCisgICAgIHk9IjcxMi43MzkyMCIKKyAgICAgaWQ9InRleHQxNTMyIgorICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTAwJSI+PHRzcGFuCisgICAgICAgaWQ9InRzcGFuMTUzMyI+QXBwbGljYXRpb24gUHJvY2VzcyAxPC90c3Bhbj48L3RleHQ+CisgIDxyZWN0CisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuNTAwMDAwMDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0LjAwMDAwMDA7c3Ryb2tlLWRhc2hhcnJheToyLjUwMDAwMDAgMi41MDAwMDAwIDtzdHJva2UtZGFzaG9mZnNldDowLjAwMDAwMDA7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIKKyAgICAgaWQ9InJlY3QxNTM1IgorICAgICB3aWR0aD0iMTQ4LjQ2MjU5IgorICAgICBoZWlnaHQ9IjQ2LjY1Njg0OSIKKyAgICAgeD0iMTA2LjI5OTIxIgorICAgICB5PSIzNzguNTQwMDEiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOm1pZGRsZTt3cml0aW5nLW1vZGU6bHI7IgorICAgICB4PSIxODAuNjEzODkiCisgICAgIHk9IjQwMC40MDA0OCIKKyAgICAgaWQ9InRleHQyMTU4IgorICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTAwJSI+PHRzcGFuCisgICAgICAgaWQ9InRzcGFuMjE1OSI+REJ1c0Nvbm5lY3Rpb248L3RzcGFuPjx0c3BhbgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuMjE2MSIKKyAgICAgICB4PSIxODAuNjEzODkiCisgICAgICAgeT0iNDE0LjQwMDQ4Ij5JbnN0YW5jZTwvdHNwYW4+PC90ZXh0PgorICA8cmVjdAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjk5NTA5Mjk7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NC4wMDAwMDAwO3N0cm9rZS1kYXNoYXJyYXk6Mi45OTUwOTI4IDIuOTk1MDkyOCA7c3Ryb2tlLWRhc2hvZmZzZXQ6MC4wMDAwMDAwO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDsiCisgICAgIGlkPSJyZWN0MjE3MCIKKyAgICAgd2lkdGg9IjE0OC40NjI1OSIKKyAgICAgaGVpZ2h0PSI2Ni45NjYyNDAiCisgICAgIHg9IjI4LjcwMjc2OCIKKyAgICAgeT0iNTQ5LjIxMjU5IiAvPgorICA8dGV4dAorICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgorICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjAwMDAwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2Fuczt0ZXh0LWFuY2hvcjptaWRkbGU7d3JpdGluZy1tb2RlOmxyOyIKKyAgICAgeD0iMTAzLjAxNzQ1IgorICAgICB5PSI1NzcuNTY1ODYiCisgICAgIGlkPSJ0ZXh0MjE3MSIKKyAgICAgc29kaXBvZGk6bGluZXNwYWNpbmc9IjEwMCUiPjx0c3BhbgorICAgICAgIHg9IjEwMy4wMTc0NSIKKyAgICAgICB5PSI1NzcuNTY1ODYiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW4yMTc2Ij5DL0MrKy9QeXRob24vZXRjLjwvdHNwYW4+PHRzcGFuCisgICAgICAgeD0iMTAzLjAxNzQ1IgorICAgICAgIHk9IjU5MS41NjU4NiIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjIxNzgiPk9iamVjdCBJbnN0YW5jZTwvdHNwYW4+PC90ZXh0PgorICA8cGF0aAorICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDsiCisgICAgIGlkPSJwYXRoMzUzNSIKKyAgICAgZD0iTSA5OC45Mzg5NTIsNDA4LjYxNDc5IEMgOTguNzQ0NzUzLDQwOS4yMDMwMyA5Ny45MTc4ODYsNDA5LjY3Mjk1IDk3LjQ0MDk0NSw0MTAuMTE0MzUgQyA5NS41MzQ5NDcsNDExLjk0NzYzIDk0LjI2NjkzNCw0MTQuMTE1NTUgOTMuMTcyNjE0LDQxNi4zMzg1OCBDIDkxLjkwMjA1Niw0MTkuMDI3MjUgOTAuOTY5MjgxLDQyMS43OTk0NCA5MC4xMDcyNTIsNDI0LjU5MjI5IEMgODkuNTg5MTA1LDQyNi4yNzM3NCA4OC45ODM1MzQsNDI3LjkwNjM0IDg4LjI2NjkwNyw0MjkuNTM3MDAgQyA4Ny45MTk2NjcsNDMwLjMzNDM4IDg3LjYyMjU5Myw0MzEuMTc1OTggODcuMTIwNDY0LDQzMS45MTk3MCBDIDg2LjgzMjIyMiw0MzIuMzA2NjUgODYuNDY5NDIyLDQzMi42NTE0NSA4Ni4xNjc5ODUsNDMzLjAzMTg0IEMgODYuMDE1OTMxLDQzMy4yMjI1NCA4NS44Njg5OTcsNDMzLjQxNTYzIDg1LjcyMjEzMSw0MzMuNjA4OTggTCA4Mi45MTQzMzYsNDMzLjExNzQzIEMgODMuMDYzNDAyLDQzMi45MTg3OSA4My4yMTM0MjgsNDMyLjcyMDY5IDgzLjM2ODEyMSw0MzIuNTI0OTggQyA4My42NTQ2ODEsNDMyLjE1MzA4IDgzLjk4MDczNyw0MzEuODA4MzQgODQuMjg1Mzg5LDQzMS40NDczMSBDIDg0LjgxMTk1Nyw0MzAuNzcxNzUgODUuMTIyNTIzLDQyOS45NzkxNCA4NS40ODI0MDAsNDI5LjIzODcyIEMgODYuMjUzMDU2LDQyNy42NDkyOSA4Ni45MDMwODQsNDI2LjAzODYxIDg3LjQ3NDU3OCw0MjQuMzkzMjEgQyA4OC40Mzk1NDgsNDIxLjU4NTUyIDg5LjQ0Mjg0Myw0MTguNzg3OTIgOTAuNzAzOTM4LDQxNi4wNTg5OCBDIDkxLjgxMDk2Niw0MTMuNzc1MjUgOTIuOTk5MTkxLDQxMS40NTk2MSA5NC44NDk0NjQsNDA5LjUwNzQ4IEMgOTUuMDk0NzA0LDQwOS4yNDg3NiA5Ni4wOTE3ODksNDA3LjkwMTQ5IDk1Ljg2NTczNyw0MDguNjE0NzkgTCA5OC45Mzg5NTIsNDA4LjYxNDc5IHogIiAvPgorICA8dGV4dAorICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgorICAgICBzdHlsZT0iZm9udC1zaXplOjEyLjAwMDAwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zOyIKKyAgICAgeD0iMzQuMTA5NDk3IgorICAgICB5PSI0NDYuMTMzODIiCisgICAgIGlkPSJ0ZXh0MzUzNiI+PHRzcGFuCisgICAgICAgaWQ9InRzcGFuMzUzNyI+TG9jYXRlIE9iamVjdDwvdHNwYW4+PHRzcGFuCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW4zNTM5IgorICAgICAgIHg9IjM0LjEwOTQ5NyIKKyAgICAgICB5PSI0NTguMTMzODIiPnZpYSBPYmplY3QgUGF0aDwvdHNwYW4+PC90ZXh0PgorICA8cGF0aAorICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDsiCisgICAgIGlkPSJwYXRoMzU0MSIKKyAgICAgZD0iTSA2MC41MDk4NjcsNDYyLjc4NzY3IEMgNjAuNzA0MDY2LDQ2My4zNzU5MSA2MS41MzA5MzMsNDYzLjg0NTgzIDYyLjAwNzg3NCw0NjQuMjg3MjMgQyA2My45MTM4NzIsNDY2LjEyMDUxIDY1LjE4MTg4NSw0NjguMjg4NDMgNjYuMjc2MjA1LDQ3MC41MTE0NiBDIDY3LjU0Njc2Myw0NzMuMjAwMTMgNjguNDc5NTM4LDQ3NS45NzIzMiA2OS4zNDE1NjcsNDc4Ljc2NTE3IEMgNjkuODU5NzE0LDQ4MC40NDY2MiA3MC40NjUyODUsNDgyLjA3OTIyIDcxLjE4MTkxMiw0ODMuNzA5ODggQyA3MS41MjkxNTIsNDg0LjUwNzI2IDcxLjgyNjIyNiw0ODUuMzQ4ODYgNzIuMzI4MzU1LDQ4Ni4wOTI1OCBDIDcyLjYxNjU5Nyw0ODYuNDc5NTMgNzIuOTc5Mzk3LDQ4Ni44MjQzMyA3My4yODA4MzQsNDg3LjIwNDcyIEMgNzMuNDMyODg4LDQ4Ny4zOTU0MiA3My41Nzk4MjIsNDg3LjU4ODUxIDczLjcyNjY4OCw0ODcuNzgxODYgTCA3Ni41MzQ0ODMsNDg3LjI5MDMxIEMgNzYuMzg1NDE3LDQ4Ny4wOTE2NyA3Ni4yMzUzOTEsNDg2Ljg5MzU3IDc2LjA4MDY5OCw0ODYuNjk3ODYgQyA3NS43OTQxMzgsNDg2LjMyNTk2IDc1LjQ2ODA4Miw0ODUuOTgxMjIgNzUuMTYzNDMwLDQ4NS42MjAxOSBDIDc0LjYzNjg2Miw0ODQuOTQ0NjMgNzQuMzI2Mjk2LDQ4NC4xNTIwMiA3My45NjY0MTksNDgzLjQxMTYwIEMgNzMuMTk1NzYzLDQ4MS44MjIxNyA3Mi41NDU3MzUsNDgwLjIxMTQ5IDcxLjk3NDI0MSw0NzguNTY2MDkgQyA3MS4wMDkyNzEsNDc1Ljc1ODQwIDcwLjAwNTk3Niw0NzIuOTYwODAgNjguNzQ0ODgxLDQ3MC4yMzE4NiBDIDY3LjYzNzg1Myw0NjcuOTQ4MTMgNjYuNDQ5NjI4LDQ2NS42MzI0OSA2NC41OTkzNTUsNDYzLjY4MDM2IEMgNjQuMzU0MTE1LDQ2My40MjE2NCA2My4zNTcwMzAsNDYyLjA3NDM3IDYzLjU4MzA4Miw0NjIuNzg3NjcgTCA2MC41MDk4NjcsNDYyLjc4NzY3IHogIiAvPgorICA8dGV4dAorICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgorICAgICBzdHlsZT0iZm9udC1zaXplOjEyLjAwMDAwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2Fuczt0ZXh0LWFuY2hvcjpzdGFydDt3cml0aW5nLW1vZGU6bHI7IgorICAgICB4PSI0OS4xMDAzMTUiCisgICAgIHk9IjUwMS42MDk1OSIKKyAgICAgaWQ9InRleHQzNTQyIgorICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTAwJSI+PHRzcGFuCisgICAgICAgeD0iNDkuMTAwMzE1IgorICAgICAgIHk9IjUwMS42MDk1OSIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjM1NDciPkJpbmRpbmdzIE1hcnNoYWw8L3RzcGFuPjx0c3BhbgorICAgICAgIHg9IjQ5LjEwMDMxNSIKKyAgICAgICB5PSI1MTMuNjA5NTkiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW4zNTQ5Ij50byBNZXRob2QgQ2FsbDwvdHNwYW4+PC90ZXh0PgorICA8cGF0aAorICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDsiCisgICAgIGlkPSJwYXRoMzU1MSIKKyAgICAgZD0iTSA5NS4yOTUyMzksNTE5LjQzMjExIEMgOTUuMTAxMDM5LDUyMC4wMjAzNSA5NC4yNzQxNjksNTIwLjQ5MDI3IDkzLjc5NzIyOSw1MjAuOTMxNjcgQyA5MS44OTEyMzksNTIyLjc2NDk1IDkwLjYyMzIxOSw1MjQuOTMyODcgODkuNTI4ODk5LDUyNy4xNTU5MCBDIDg4LjI1ODMzOSw1MjkuODQ0NTcgODcuMzI1NTY5LDUzMi42MTY3NiA4Ni40NjM1MzksNTM1LjQwOTYxIEMgODUuOTQ1Mzg5LDUzNy4wOTEwNiA4NS4zMzk4MTksNTM4LjcyMzY2IDg0LjYyMzE5OSw1NDAuMzU0MzIgQyA4NC4yNzU5NTksNTQxLjE1MTcwIDgzLjk3ODg3OSw1NDEuOTkzMzAgODMuNDc2NzQ5LDU0Mi43MzcwMiBDIDgzLjE4ODUwOSw1NDMuMTIzOTcgODIuODI1NzA5LDU0My40Njg3NyA4Mi41MjQyNjksNTQzLjg0OTE2IEMgODIuMzcyMjE5LDU0NC4wMzk4NiA4Mi4yMjUyODksNTQ0LjIzMjk1IDgyLjA3ODQxOSw1NDQuNDI2MzAgTCA3OS4yNzA2MTksNTQzLjkzNDc1IEMgNzkuNDE5Njg5LDU0My43MzYxMSA3OS41Njk3MTksNTQzLjUzODAxIDc5LjcyNDQwOSw1NDMuMzQyMzAgQyA4MC4wMTA5NjksNTQyLjk3MDQwIDgwLjMzNzAyOSw1NDIuNjI1NjYgODAuNjQxNjc5LDU0Mi4yNjQ2MyBDIDgxLjE2ODI0OSw1NDEuNTg5MDcgODEuNDc4ODA5LDU0MC43OTY0NiA4MS44Mzg2ODksNTQwLjA1NjA0IEMgODIuNjA5MzM5LDUzOC40NjY2MSA4My4yNTkzNjksNTM2Ljg1NTkzIDgzLjgzMDg2OSw1MzUuMjEwNTMgQyA4NC43OTU4MzksNTMyLjQwMjg0IDg1Ljc5OTEyOSw1MjkuNjA1MjQgODcuMDYwMjI5LDUyNi44NzYzMCBDIDg4LjE2NzI0OSw1MjQuNTkyNTcgODkuMzU1NDc5LDUyMi4yNzY5MyA5MS4yMDU3NDksNTIwLjMyNDgwIEMgOTEuNDUwOTg5LDUyMC4wNjYwOCA5Mi40NDgwNzksNTE4LjcxODgxIDkyLjIyMjAyOSw1MTkuNDMyMTEgTCA5NS4yOTUyMzksNTE5LjQzMjExIHogIiAvPgorICA8cGF0aAorICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDsiCisgICAgIGlkPSJwYXRoMzU1MiIKKyAgICAgZD0iTSAyNjEuODM1MzMsNDA4LjYxNDc5IEMgMjYyLjAyOTUzLDQwOS4yMDMwMyAyNjIuODU2NDAsNDA5LjY3Mjk1IDI2My4zMzMzNCw0MTAuMTE0MzUgQyAyNjUuMjM5MzQsNDExLjk0NzYzIDI2Ni41MDczNSw0MTQuMTE1NTUgMjY3LjYwMTY3LDQxNi4zMzg1OCBDIDI2OC44NzIyMyw0MTkuMDI3MjUgMjY5LjgwNTAxLDQyMS43OTk0NCAyNzAuNjY3MDMsNDI0LjU5MjI5IEMgMjcxLjE4NTE4LDQyNi4yNzM3NCAyNzEuNzkwNzUsNDI3LjkwNjM0IDI3Mi41MDczOCw0MjkuNTM3MDAgQyAyNzIuODU0NjIsNDMwLjMzNDM4IDI3My4xNTE2OSw0MzEuMTc1OTggMjczLjY1MzgyLDQzMS45MTk3MCBDIDI3My45NDIwNiw0MzIuMzA2NjUgMjc0LjMwNDg2LDQzMi42NTE0NSAyNzQuNjA2MzAsNDMzLjAzMTg0IEMgMjc0Ljc1ODM2LDQzMy4yMjI1NCAyNzQuOTA1MjksNDMzLjQxNTYzIDI3NS4wNTIxNiw0MzMuNjA4OTggTCAyNzcuODU5OTUsNDMzLjExNzQzIEMgMjc3LjcxMDg4LDQzMi45MTg3OSAyNzcuNTYwODYsNDMyLjcyMDY5IDI3Ny40MDYxNyw0MzIuNTI0OTggQyAyNzcuMTE5NjEsNDMyLjE1MzA4IDI3Ni43OTM1NSw0MzEuODA4MzQgMjc2LjQ4ODkwLDQzMS40NDczMSBDIDI3NS45NjIzMyw0MzAuNzcxNzUgMjc1LjY1MTc2LDQyOS45NzkxNCAyNzUuMjkxODksNDI5LjIzODcyIEMgMjc0LjUyMTIzLDQyNy42NDkyOSAyNzMuODcxMjAsNDI2LjAzODYxIDI3My4yOTk3MSw0MjQuMzkzMjEgQyAyNzIuMzM0NzQsNDIxLjU4NTUyIDI3MS4zMzE0NCw0MTguNzg3OTIgMjcwLjA3MDM1LDQxNi4wNTg5OCBDIDI2OC45NjMzMiw0MTMuNzc1MjUgMjY3Ljc3NTEwLDQxMS40NTk2MSAyNjUuOTI0ODIsNDA5LjUwNzQ4IEMgMjY1LjY3OTU4LDQwOS4yNDg3NiAyNjQuNjgyNTAsNDA3LjkwMTQ5IDI2NC45MDg1NSw0MDguNjE0NzkgTCAyNjEuODM1MzMsNDA4LjYxNDc5IHogIiAvPgorICA8dGV4dAorICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgorICAgICBzdHlsZT0iZm9udC1zaXplOjEyLjAwMDAwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2Fuczt0ZXh0LWFuY2hvcjpzdGFydDt3cml0aW5nLW1vZGU6bHI7IgorICAgICB4PSIyMjMuOTg3NDkiCisgICAgIHk9IjQ0Ni4xMzM4MiIKKyAgICAgaWQ9InRleHQzNTUzIgorICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTAwJSI+PHRzcGFuCisgICAgICAgeD0iMjIzLjk4NzQ5IgorICAgICAgIHk9IjQ0Ni4xMzM4MiIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjM1NjIiPk1hcnNoYWwgTWV0aG9kPC90c3Bhbj48dHNwYW4KKyAgICAgICB4PSIyMjMuOTg3NDkiCisgICAgICAgeT0iNDU4LjEzMzgyIgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuMzU2NCI+Q2FsbCB0byBNZXNzYWdlPC90c3Bhbj48L3RleHQ+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIKKyAgICAgaWQ9InBhdGgzNTY3IgorICAgICBkPSJNIDI3OC45NjQ4NSw0NjMuMjk0NTMgQyAyNzguNzcwNjUsNDYzLjg4Mjc3IDI3Ny45NDM3OCw0NjQuMzUyNjkgMjc3LjQ2Njg0LDQ2NC43OTQwOSBDIDI3NS41NjA4NSw0NjYuNjI3MzcgMjc0LjI5MjgzLDQ2OC43OTUyOSAyNzMuMTk4NTEsNDcxLjAxODMyIEMgMjcxLjkyNzk1LDQ3My43MDY5OSAyNzAuOTk1MTgsNDc2LjQ3OTE4IDI3MC4xMzMxNSw0NzkuMjcyMDMgQyAyNjkuNjE1MDAsNDgwLjk1MzQ4IDI2OS4wMDk0Myw0ODIuNTg2MDggMjY4LjI5MjgxLDQ4NC4yMTY3NCBDIDI2Ny45NDU1Nyw0ODUuMDE0MTIgMjY3LjY0ODQ5LDQ4NS44NTU3MiAyNjcuMTQ2MzYsNDg2LjU5OTQ0IEMgMjY2Ljg1ODEyLDQ4Ni45ODYzOSAyNjYuNDk1MzIsNDg3LjMzMTE5IDI2Ni4xOTM4OCw0ODcuNzExNTggQyAyNjYuMDQxODMsNDg3LjkwMjI4IDI2NS44OTQ5MCw0ODguMDk1MzcgMjY1Ljc0ODAzLDQ4OC4yODg3MiBMIDI2Mi45NDAyMyw0ODcuNzk3MTcgQyAyNjMuMDg5MzAsNDg3LjU5ODUzIDI2My4yMzkzMyw0ODcuNDAwNDMgMjYzLjM5NDAyLDQ4Ny4yMDQ3MiBDIDI2My42ODA1OCw0ODYuODMyODIgMjY0LjAwNjY0LDQ4Ni40ODgwOCAyNjQuMzExMjksNDg2LjEyNzA1IEMgMjY0LjgzNzg2LDQ4NS40NTE0OSAyNjUuMTQ4NDIsNDg0LjY1ODg4IDI2NS41MDgzMCw0ODMuOTE4NDYgQyAyNjYuMjc4OTUsNDgyLjMyOTAzIDI2Ni45Mjg5OCw0ODAuNzE4MzUgMjY3LjUwMDQ4LDQ3OS4wNzI5NSBDIDI2OC40NjU0NSw0NzYuMjY1MjYgMjY5LjQ2ODc0LDQ3My40Njc2NiAyNzAuNzI5ODQsNDcwLjczODcyIEMgMjcxLjgzNjg2LDQ2OC40NTQ5OSAyNzMuMDI1MDksNDY2LjEzOTM1IDI3NC44NzUzNiw0NjQuMTg3MjIgQyAyNzUuMTIwNjAsNDYzLjkyODUwIDI3Ni4xMTc2OSw0NjIuNTgxMjMgMjc1Ljg5MTY0LDQ2My4yOTQ1MyBMIDI3OC45NjQ4NSw0NjMuMjk0NTMgeiAiIC8+CisgIDxyZWN0CisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuNzM3NzA4NjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0LjAwMDAwMDA7c3Ryb2tlLWRhc2hhcnJheToyLjczNzcwODQgMi43Mzc3MDg0IDtzdHJva2UtZGFzaG9mZnNldDowLjAwMDAwMDA7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIKKyAgICAgaWQ9InJlY3QzNTY4IgorICAgICB3aWR0aD0iMTI0LjAxNzQ2IgorICAgICBoZWlnaHQ9IjY2Ljk3OTgxMyIKKyAgICAgeD0iMTg5Ljc5MjY1IgorICAgICB5PSI0OTUuMDg5MDIiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOm1pZGRsZTt3cml0aW5nLW1vZGU6bHI7IgorICAgICB4PSIyNDguOTQwNDkiCisgICAgIHk9IjUyMy40NDIyMCIKKyAgICAgaWQ9InRleHQzNTY5IgorICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTAwJSI+PHRzcGFuCisgICAgICAgeD0iMjQ4Ljk0MDQ5IgorICAgICAgIHk9IjUyMy40NDIyMCIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjM1NzQiPkJpbmRpbmdzIFByb3h5PC90c3Bhbj48dHNwYW4KKyAgICAgICB4PSIyNDguOTQwNDkiCisgICAgICAgeT0iNTM3LjQ0MjIwIgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuMzU3NiI+T2JqZWN0IEluc3RhbmNlPC90c3Bhbj48L3RleHQ+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIKKyAgICAgaWQ9InBhdGgzNTc4IgorICAgICBkPSJNIDI1OS4wMzU0Nyw1NjYuOTI5MTMgQyAyNTkuMjI5NjcsNTY3LjUxNzM3IDI2MC4wNTY1Myw1NjcuOTg3MjkgMjYwLjUzMzQ4LDU2OC40Mjg2OSBDIDI2Mi40Mzk0Nyw1NzAuMjYxOTcgMjYzLjcwNzQ5LDU3Mi40Mjk4OSAyNjQuODAxODEsNTc0LjY1MjkyIEMgMjY2LjA3MjM2LDU3Ny4zNDE1OSAyNjcuMDA1MTQsNTgwLjExMzc4IDI2Ny44NjcxNyw1ODIuOTA2NjMgQyAyNjguMzg1MzIsNTg0LjU4ODA4IDI2OC45OTA4OSw1ODYuMjIwNjggMjY5LjcwNzUxLDU4Ny44NTEzNCBDIDI3MC4wNTQ3NSw1ODguNjQ4NzIgMjcwLjM1MTgzLDU4OS40OTAzMiAyNzAuODUzOTYsNTkwLjIzNDA0IEMgMjcxLjE0MjIwLDU5MC42MjA5OSAyNzEuNTA1MDAsNTkwLjk2NTc5IDI3MS44MDY0NCw1OTEuMzQ2MTggQyAyNzEuOTU4NDksNTkxLjUzNjg4IDI3Mi4xMDU0Miw1OTEuNzI5OTcgMjcyLjI1MjI5LDU5MS45MjMzMiBMIDI3NS4wNjAwOCw1OTEuNDMxNzcgQyAyNzQuOTExMDIsNTkxLjIzMzEzIDI3NC43NjA5OSw1OTEuMDM1MDMgMjc0LjYwNjMwLDU5MC44MzkzMiBDIDI3NC4zMTk3NCw1OTAuNDY3NDIgMjczLjk5MzY4LDU5MC4xMjI2OCAyNzMuNjg5MDMsNTg5Ljc2MTY1IEMgMjczLjE2MjQ2LDU4OS4wODYwOSAyNzIuODUxOTAsNTg4LjI5MzQ4IDI3Mi40OTIwMiw1ODcuNTUzMDYgQyAyNzEuNzIxMzYsNTg1Ljk2MzYzIDI3MS4wNzEzNCw1ODQuMzUyOTUgMjcwLjQ5OTg0LDU4Mi43MDc1NSBDIDI2OS41MzQ4Nyw1NzkuODk5ODYgMjY4LjUzMTU4LDU3Ny4xMDIyNiAyNjcuMjcwNDgsNTc0LjM3MzMyIEMgMjY2LjE2MzQ1LDU3Mi4wODk1OSAyNjQuOTc1MjMsNTY5Ljc3Mzk1IDI2My4xMjQ5Niw1NjcuODIxODIgQyAyNjIuODc5NzIsNTY3LjU2MzEwIDI2MS44ODI2Myw1NjYuMjE1ODMgMjYyLjEwODY4LDU2Ni45MjkxMyBMIDI1OS4wMzU0Nyw1NjYuOTI5MTMgeiAiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTIuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOnN0YXJ0O3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9IjIxNy40MDc0MSIKKyAgICAgeT0iNjA3LjkwODgxIgorICAgICBpZD0idGV4dDM1NzkiCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICB4PSIyMTcuNDA3NDEiCisgICAgICAgeT0iNjA3LjkwODgxIgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuMzU4NCI+QXBwbGljYXRpb24gQ29kZTwvdHNwYW4+PC90ZXh0PgorICA8cGF0aAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjk2MTcyMDI4cHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO21hcmtlci1lbmQ6dXJsKCNBcnJvdzFNKTsiCisgICAgIGQ9Ik0gMjYuNTc0ODAzLDQwOC42MDAwOSBDIDI2LjU3NDgwMyw1MzkuNjg5MTIgMjYuNTc0ODAzLDUzOS42ODkxMSAyNi41NzQ4MDMsNTMxLjQ5NjA2IgorICAgICBpZD0icGF0aDM1ODYiCisgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTIuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6Ym9sZDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2Fuczt0ZXh0LWFuY2hvcjpzdGFydDt3cml0aW5nLW1vZGU6bHI7IgorICAgICB4PSIyNS45NzcxNDYiCisgICAgIHk9IjM4Ni40NTIxMiIKKyAgICAgaWQ9InRleHQ0MjIwIgorICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTAwJSI+PHRzcGFuCisgICAgICAgaWQ9InRzcGFuNDIyMSI+SW5jb21pbmc8L3RzcGFuPjx0c3BhbgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuNDIyMyIKKyAgICAgICB4PSIyNS45NzcxNDYiCisgICAgICAgeT0iMzk4LjQ1MjEyIj5DYWxsPC90c3Bhbj48L3RleHQ+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTIuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6Ym9sZDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2Fuczt0ZXh0LWFuY2hvcjplbmQ7d3JpdGluZy1tb2RlOmxyOyIKKyAgICAgeD0iMzM1LjYxNDExIgorICAgICB5PSIzODYuNDUyMTIiCisgICAgIGlkPSJ0ZXh0NDIyNiIKKyAgICAgc29kaXBvZGk6bGluZXNwYWNpbmc9IjEwMCUiPjx0c3BhbgorICAgICAgIHg9IjMzNS42MTQxMSIKKyAgICAgICB5PSIzODYuNDUyMTIiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW40MjMxIj5PdXRnb2luZzwvdHNwYW4+PHRzcGFuCisgICAgICAgeD0iMzM1LjYxNDExIgorICAgICAgIHk9IjM5OC40NTIxMiIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjQyMzMiPkNhbGw8L3RzcGFuPjwvdGV4dD4KKyAgPHBhdGgKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC45NjE3MjAyOHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDttYXJrZXItc3RhcnQ6dXJsKCNBcnJvdzFNKTttYXJrZXItZW5kOm5vbmU7IgorICAgICBkPSJNIDMyNy43NTU5MSw0MTYuMzM4NTggQyAzMjcuNzU1OTEsNTQ3LjQyNzYxIDMyNy43NTU5MSw1NDcuNDI3NjAgMzI3Ljc1NTkxLDUzOS4yMzQ1NSIKKyAgICAgaWQ9InBhdGg0MjM2IgorICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgorICA8cmVjdAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDo1Ljc5MTQzMTA7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NC4wMDAwMDAwO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDsiCisgICAgIGlkPSJyZWN0NDg3MCIKKyAgICAgd2lkdGg9Ijg4NS44NjU5MSIKKyAgICAgaGVpZ2h0PSIzMTAuMjcyNTIiCisgICAgIHg9Ijg4LjU4MjY4MCIKKyAgICAgeT0iOC44NTgyNjIxIiAvPgorICA8dGV4dAorICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgorICAgICBzdHlsZT0iZm9udC1zaXplOjE4LjAwMDAwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7dGV4dC1hbmNob3I6bWlkZGxlO3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9IjUxNS40MjczNyIKKyAgICAgeT0iMzA1LjQ0NDg5IgorICAgICBpZD0idGV4dDQ4NzEiCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICB4PSI1MTUuNDI3MzciCisgICAgICAgeT0iMzA1LjQ0NDg5IgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuNDg3NCI+QnVzIERhZW1vbiBQcm9jZXNzPC90c3Bhbj48L3RleHQ+CisgIDxyZWN0CisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjMuNzUwMDAwMDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0LjAwMDAwMDA7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIKKyAgICAgaWQ9InJlY3Q0ODc2IgorICAgICB3aWR0aD0iMzI1LjIzMjAzIgorICAgICBoZWlnaHQ9IjM1NC4zMzA3MiIKKyAgICAgeD0iNzA4LjY2MTQ0IgorICAgICB5PSIzNzMuMDgzNTkiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTguMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6Ym9sZDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2Fuczt0ZXh0LWFuY2hvcjpzdGFydDt3cml0aW5nLW1vZGU6bHI7IgorICAgICB4PSI3NjEuNzIzMTQiCisgICAgIHk9IjcxMy43NzU1MSIKKyAgICAgaWQ9InRleHQ0ODc3IgorICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTAwJSI+PHRzcGFuCisgICAgICAgeD0iNzYxLjcyMzE0IgorICAgICAgIHk9IjcxMy43NzU1MSIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjQ4ODAiPkFwcGxpY2F0aW9uIFByb2Nlc3MgMjwvdHNwYW4+PC90ZXh0PgorICA8dGV4dAorICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgorICAgICBzdHlsZT0iZm9udC1zaXplOjEyLjAwMDAwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2Fuczt0ZXh0LWFuY2hvcjpzdGFydDt3cml0aW5nLW1vZGU6bHI7IgorICAgICB4PSI4MjMuNDk2NjQiCisgICAgIHk9IjUwNS4xODAxOCIKKyAgICAgaWQ9InRleHQ0ODgzIgorICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTAwJSI+PHRzcGFuCisgICAgICAgeD0iODIzLjQ5NjY0IgorICAgICAgIHk9IjUwNS4xODAxOCIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjQ4ODgiPlNhbWUgU3R1ZmYgYXMgaW48L3RzcGFuPjx0c3BhbgorICAgICAgIHg9IjgyMy40OTY2NCIKKyAgICAgICB5PSI1MTcuMTgwMTgiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW40ODkwIj5Qcm9jZXNzIDE8L3RzcGFuPjwvdGV4dD4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMi4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7dGV4dC1hbmNob3I6c3RhcnQ7d3JpdGluZy1tb2RlOmxyOyIKKyAgICAgeD0iNDcuODkxMDcxIgorICAgICB5PSI2MzguMDU0MjAiCisgICAgIGlkPSJ0ZXh0NDg5MiIKKyAgICAgc29kaXBvZGk6bGluZXNwYWNpbmc9IjEwMCUiPjx0c3BhbgorICAgICAgIHg9IjQ3Ljg5MTA3MSIKKyAgICAgICB5PSI2MzguMDU0MjAiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW40OTAxIj4oT2JqZWN0IEluc3RhbmNlIEhhczwvdHNwYW4+PHRzcGFuCisgICAgICAgeD0iNDcuODkxMDcxIgorICAgICAgIHk9IjY1MC4wNTQyMCIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjQ5MDMiPjEgb3IgTW9yZSBJbnRlcmZhY2VzKTwvdHNwYW4+PC90ZXh0PgorICA8cGF0aAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjI1MDAwMDA7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NC4wMDAwMDAwO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDttYXJrZXItc3RhcnQ6dXJsKCNBcnJvdzFNKTttYXJrZXItZW5kOnVybCgjQXJyb3cxTSk7c3Ryb2tlLWRhc2hhcnJheTpub25lOyIKKyAgICAgZD0iTSAxNjIuNTcyNjAsMzU4LjAyMDQxIEMgMTY1LjI1MjEzLDM1NC42MDUxNiAxODYuMDE4NTgsMzI4LjEzNjg4IDE4NC4wMDg5MywzMzAuNjk4MzIiCisgICAgIGlkPSJwYXRoNDkwNSIKKyAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMi4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2FuczsiCisgICAgIHg9IjE5MC41NzE3MCIKKyAgICAgeT0iMzQyLjYyMDE4IgorICAgICBpZD0idGV4dDU1MzkiPjx0c3BhbgorICAgICAgIGlkPSJ0c3BhbjU1NDAiPlNvY2tldDwvdHNwYW4+PHRzcGFuCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW41NTQ0IgorICAgICAgIHg9IjE5MC41NzE3MCIKKyAgICAgICB5PSIzNTQuNjIwMTgiPihCaWRpcmVjdGlvbmFsIE1lc3NhZ2UgU3RyZWFtKTwvdHNwYW4+PC90ZXh0PgorICA8cGF0aAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjI1MDAwMDA7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NC4wMDAwMDAwO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDttYXJrZXItc3RhcnQ6dXJsKCNBcnJvdzFNKTttYXJrZXItZW5kOnVybCgjQXJyb3cxTSk7IgorICAgICBkPSJNIDgyNy41Mzg3NiwzNjMuMTg4OTcgQyA4MjQuODU5MTYsMzU5Ljc3MzcyIDgwNC4wOTI3NiwzMzMuMzA1NDQgODA2LjEwMjM2LDMzNS44NjY4OCIKKyAgICAgaWQ9InBhdGg1NTQ2IgorICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgorICA8dGV4dAorICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgorICAgICBzdHlsZT0iZm9udC1zaXplOjEyLjAwMDAwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zOyIKKyAgICAgeD0iODQwLjc5MTUwIgorICAgICB5PSIzNDUuNzMxMzUiCisgICAgIGlkPSJ0ZXh0NTU0NyI+PHRzcGFuCisgICAgICAgaWQ9InRzcGFuNTU0OCI+U29ja2V0PC90c3Bhbj48dHNwYW4KKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjU1NTAiCisgICAgICAgeD0iODQwLjc5MTUwIgorICAgICAgIHk9IjM1Ny43MzEzNSI+KEJpZGlyZWN0aW9uYWwgTWVzc2FnZSBTdHJlYW0pPC90c3Bhbj48L3RleHQ+CisgIDxyZWN0CisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuNTAwMDAwMDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0LjAwMDAwMDA7c3Ryb2tlLWRhc2hhcnJheToyLjUwMDAwMDAgMi41MDAwMDAwIDtzdHJva2UtZGFzaG9mZnNldDowLjAwMDAwMDA7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIKKyAgICAgaWQ9InJlY3Q1NTUyIgorICAgICB3aWR0aD0iMTQ4LjQ2MjU5IgorICAgICBoZWlnaHQ9IjQ2LjY1Njg0OSIKKyAgICAgeD0iMTI0LjAxNTc1IgorICAgICB5PSIyNjMuMzgyNTEiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOm1pZGRsZTt3cml0aW5nLW1vZGU6bHI7IgorICAgICB4PSIxOTguMzMwNDMiCisgICAgIHk9IjI4NS4yNDI5OCIKKyAgICAgaWQ9InRleHQ1NTUzIgorICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTAwJSI+PHRzcGFuCisgICAgICAgaWQ9InRzcGFuNTU1NCI+REJ1c0Nvbm5lY3Rpb248L3RzcGFuPjx0c3BhbgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuNTU1NiIKKyAgICAgICB4PSIxOTguMzMwNDMiCisgICAgICAgeT0iMjk5LjI0Mjk4Ij5JbnN0YW5jZTwvdHNwYW4+PC90ZXh0PgorICA8cmVjdAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjUwMDAwMDA7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NC4wMDAwMDAwO3N0cm9rZS1kYXNoYXJyYXk6Mi41MDAwMDAwIDIuNTAwMDAwMCA7c3Ryb2tlLWRhc2hvZmZzZXQ6MC4wMDAwMDAwO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDsiCisgICAgIGlkPSJyZWN0NTU1OCIKKyAgICAgd2lkdGg9IjE0OC40NjI1OSIKKyAgICAgaGVpZ2h0PSI0Ni42NTY4NDkiCisgICAgIHg9IjcxOS42NDc2NCIKKyAgICAgeT0iMjYzLjM4MjUxIiAvPgorICA8dGV4dAorICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgorICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjAwMDAwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2Fuczt0ZXh0LWFuY2hvcjptaWRkbGU7d3JpdGluZy1tb2RlOmxyOyIKKyAgICAgeD0iNzkzLjk2MjM0IgorICAgICB5PSIyODUuMjQyOTgiCisgICAgIGlkPSJ0ZXh0NTU1OSIKKyAgICAgc29kaXBvZGk6bGluZXNwYWNpbmc9IjEwMCUiPjx0c3BhbgorICAgICAgIGlkPSJ0c3BhbjU1NjAiPkRCdXNDb25uZWN0aW9uPC90c3Bhbj48dHNwYW4KKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjU1NjIiCisgICAgICAgeD0iNzkzLjk2MjM0IgorICAgICAgIHk9IjI5OS4yNDI5OCI+SW5zdGFuY2U8L3RzcGFuPjwvdGV4dD4KKyAgPHJlY3QKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi41MDAwMDAwO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQuMDAwMDAwMDtzdHJva2UtZGFzaGFycmF5OjIuNTAwMDAwMCAyLjUwMDAwMDAgO3N0cm9rZS1kYXNob2Zmc2V0OjAuMDAwMDAwMDtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7IgorICAgICBpZD0icmVjdDU1NjQiCisgICAgIHdpZHRoPSIxNDguNDYyNTkiCisgICAgIGhlaWdodD0iNDYuNjU2ODQ5IgorICAgICB4PSI3NjMuNzcyMjIiCisgICAgIHk9IjM3OC41NDAwMSIgLz4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxNC4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7dGV4dC1hbmNob3I6bWlkZGxlO3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9IjgzOC4wODY5MSIKKyAgICAgeT0iNDAwLjQwMDQ4IgorICAgICBpZD0idGV4dDU1NjUiCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICBpZD0idHNwYW41NTY2Ij5EQnVzQ29ubmVjdGlvbjwvdHNwYW4+PHRzcGFuCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW41NTY4IgorICAgICAgIHg9IjgzOC4wODY5MSIKKyAgICAgICB5PSI0MTQuNDAwNDgiPkluc3RhbmNlPC90c3Bhbj48L3RleHQ+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDttYXJrZXItZW5kOnVybCgjQXJyb3cxTSk7IgorICAgICBkPSJNIDE4Ni4wMjM2MiwyNDguMDMxNDkgQyAxMDYuMjk5MjEsMjYuNTc0Nzk3IDM3Mi4wNDcyNCwyNi41NzQ3OTcgMzcyLjA0NzI0LDI2LjU3NDc5NyIKKyAgICAgaWQ9InBhdGg1NTcxIgorICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgorICA8cmVjdAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjE4NTQ5NjE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NC4wMDAwMDAwO3N0cm9rZS1kYXNoYXJyYXk6Mi4xODU0OTYwIDIuMTg1NDk2MCA7c3Ryb2tlLWRhc2hvZmZzZXQ6MC4wMDAwMDAwO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDsiCisgICAgIGlkPSJyZWN0NjIwNSIKKyAgICAgd2lkdGg9IjE0OC40NjI1OSIKKyAgICAgaGVpZ2h0PSIzNS42NTYyMjciCisgICAgIHg9IjM5MS44OTE3NSIKKyAgICAgeT0iMTcuNDkzMzc0IiAvPgorICA8dGV4dAorICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgorICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjAwMDAwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2Fuczt0ZXh0LWFuY2hvcjptaWRkbGU7d3JpdGluZy1tb2RlOmxyOyIKKyAgICAgeD0iNDY2LjIwNjQyIgorICAgICB5PSIzOS41NzcwMDMiCisgICAgIGlkPSJ0ZXh0NjIwNiIKKyAgICAgc29kaXBvZGk6bGluZXNwYWNpbmc9IjEwMCUiPjx0c3BhbgorICAgICAgIHg9IjQ2Ni4yMDY0MiIKKyAgICAgICB5PSIzOS41NzcwMDMiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW42MjExIj5NZXNzYWdlIERpc3BhdGNoZXI8L3RzcGFuPjwvdGV4dD4KKyAgPHBhdGgKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO21hcmtlci1lbmQ6dXJsKCNBcnJvdzFNKTsiCisgICAgIGQ9Ik0gODA2LjEwMjM2LDI0OC4wMzE0OSBDIDgxNC45NjA2MywxNy43MTY1MzAgNTQ5LjIxMjYwLDI2LjU3NDc5NyA1NTguMDcwODcsMjYuNTc0Nzk3IgorICAgICBpZD0icGF0aDYyMTMiCisgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTIuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOnN0YXJ0O3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9IjM4MC4yNDM0MSIKKyAgICAgeT0iNzEuMTI1MDUzIgorICAgICBpZD0idGV4dDYyMTQiCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICB4PSIzODAuMjQzNDEiCisgICAgICAgeT0iNzEuMTI1MDUzIgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuNjg2MCI+aWYgKG1lc3NhZ2UgaXMgc2lnbmFsKTwvdHNwYW4+PHRzcGFuCisgICAgICAgeD0iMzgwLjI0MzQxIgorICAgICAgIHk9IjgzLjEyNTA1MyIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjY4NjIiPiAgYnJvYWRjYXN0PC90c3Bhbj48dHNwYW4KKyAgICAgICB4PSIzODAuMjQzNDEiCisgICAgICAgeT0iOTUuMTI1MDUzIgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuNjg2NCI+ZWxzZTwvdHNwYW4+PHRzcGFuCisgICAgICAgeD0iMzgwLjI0MzQxIgorICAgICAgIHk9IjEwNy4xMjUwNSIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjY4NjYiPiAgZmluZCBkZXN0aW5hdGlvbiBuYW1lZCBieSBtZXNzYWdlPC90c3Bhbj48L3RleHQ+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDttYXJrZXItZW5kOnVybCgjQXJyb3cxTSk7IgorICAgICBkPSJNIDM4MC45MDU1MSw3OS43MjQ0MDQgQyAxNzcuMTY1MzYsNTMuMTQ5NjAxIDIwMy43NDAxNiwyNTYuODg5NzYgMjAzLjc0MDE2LDI0OC4wMzE0OSIKKyAgICAgaWQ9InBhdGg2ODY4IgorICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgorICA8cGF0aAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7bWFya2VyLWVuZDp1cmwoI0Fycm93MU0pOyIKKyAgICAgZD0iTSA0NTEuNzcxNjUsNzkuNzI0NDA0IEMgNzg4LjM4NTgzLDQ0LjI5MTMzMyA3NzkuNTI3NTYsMjU2Ljg4OTc2IDc3OS41Mjc1NiwyNDguMDMxNDkiCisgICAgIGlkPSJwYXRoNjg2OSIKKyAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KKyAgPHJlY3QKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzZhNmE2YTtzdHJva2Utd2lkdGg6Mi41MDAwMDAwO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2UtbWl0ZXJsaW1pdDo0LjAwMDAwMDA7c3Ryb2tlLWRhc2hhcnJheToxLjI1MDAwMDAsMS4yNTAwMDAwO3N0cm9rZS1kYXNob2Zmc2V0OjAuMDAwMDAwMDsiCisgICAgIGlkPSJyZWN0NzUwMyIKKyAgICAgd2lkdGg9IjMxOC44OTc2NCIKKyAgICAgaGVpZ2h0PSIxNjguMzA3MDgiCisgICAgIHg9IjM0NS40NzI0NCIKKyAgICAgeT0iMTE1LjE1NzQ4IiAvPgorICA8dGV4dAorICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgorICAgICBzdHlsZT0iZm9udC1zaXplOjEyLjAwMDAwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2Fuczt0ZXh0LWFuY2hvcjptaWRkbGU7d3JpdGluZy1tb2RlOmxyOyIKKyAgICAgeD0iNTA3LjEwMDE2IgorICAgICB5PSIxMzIuNzA0MDkiCisgICAgIGlkPSJ0ZXh0ODEzNyIKKyAgICAgc29kaXBvZGk6bGluZXNwYWNpbmc9IjEwMCUiPjx0c3BhbgorICAgICAgIGlkPSJ0c3BhbjgxMzgiPkRlc3RpbmF0aW9uIFRhYmxlPC90c3Bhbj48L3RleHQ+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTIuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7Zm9udC1zdHJldGNoOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO3RleHQtYW5jaG9yOnN0YXJ0O3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9IjQyMi43MTEyNCIKKyAgICAgeT0iMTU4LjM5MzY2IgorICAgICBpZD0idGV4dDgxNDAiCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMjAlIj48dHNwYW4KKyAgICAgICB4PSI0MjIuNzExMjQiCisgICAgICAgeT0iMTU4LjM5MzY2IgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuODgxOCI+Q29ubmVjdGlvbiAxPC90c3Bhbj48dHNwYW4KKyAgICAgICB4PSI0MjIuNzExMjQiCisgICAgICAgeT0iMTcyLjc5MzY2IgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuODgyMCI+Q29ubmVjdGlvbiAyPC90c3Bhbj48dHNwYW4KKyAgICAgICB4PSI0MjIuNzExMjQiCisgICAgICAgeT0iMTg3LjE5MzY2IgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuODgyMiI+JnF1b3Q7VGhlIFNlc3Npb24gTWFuYWdlciZxdW90OzwvdHNwYW4+PHRzcGFuCisgICAgICAgeD0iNDIyLjcxMTI0IgorICAgICAgIHk9IjIwMS41OTM2NiIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3Bhbjg4MjQiPiZxdW90O1RoZSBXaW5kb3cgTWFuYWdlciZxdW90OzwvdHNwYW4+PHRzcGFuCisgICAgICAgeD0iNDIyLjcxMTI0IgorICAgICAgIHk9IjIxNS45OTM2NiIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3Bhbjg4MjYiPiZxdW90O1RoZSBTY3JlZW5zYXZlciZxdW90OzwvdHNwYW4+PHRzcGFuCisgICAgICAgeD0iNDIyLjcxMTI0IgorICAgICAgIHk9IjIzMC4zOTM2NiIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3Bhbjg4MjgiPiZxdW90O1RoZSBUZXh0IEVkaXRvciZxdW90OzwvdHNwYW4+PHRzcGFuCisgICAgICAgeD0iNDIyLjcxMTI0IgorICAgICAgIHk9IjI0NC43OTM2NiIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3Bhbjg4MzAiPiZxdW90O1RoZSBIYXJkd2FyZSBEaXJlY3RvcnkmcXVvdDs8L3RzcGFuPjx0c3BhbgorICAgICAgIHg9IjQyMi43MTEyNCIKKyAgICAgICB5PSIyNTkuMTkzNjciCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW44ODMyIj4mcXVvdDtUaGUgQWRkcmVzcyBCb29rJnF1b3Q7PC90c3Bhbj48dHNwYW4KKyAgICAgICB4PSI0MjIuNzExMjQiCisgICAgICAgeT0iMjczLjU5MzY3IgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuODgzNCI+JnF1b3Q7VGhlIERpY3Rpb25hcnkmcXVvdDs8L3RzcGFuPjwvdGV4dD4KKyAgPHBhdGgKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO21hcmtlci1lbmQ6dXJsKCNBcnJvdzFNKTsiCisgICAgIGQ9Ik0gNDE2LjMzODU4LDE1MC41OTA1NSBDIDIzOS4xNzMyMyw5Ny40NDA5MzUgMjIxLjQ1NjY5LDI1Ni44ODk3NiAyMjEuNDU2NjksMjQ4LjAzMTQ5IgorICAgICBpZD0icGF0aDgxNzkiCisgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDttYXJrZXItZW5kOnVybCgjQXJyb3cxTSk7IgorICAgICBkPSJNIDUwNC45MjEyNiwxNjguMzA3MDggQyA3MjYuMzc3OTUsMTA2LjI5OTIxIDc3MC42NjkyOSwyNjUuNzQ4MDIgNzYxLjgxMTAyLDIzOS4xNzMyMiIKKyAgICAgaWQ9InBhdGg4MTgwIgorICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgorICA8cGF0aAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7IgorICAgICBkPSIiCisgICAgIGlkPSJwYXRoODE4MSIKKyAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSIiIC8+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDttYXJrZXItZW5kOnVybCgjQXJyb3cxTSk7IgorICAgICBkPSJNIDU4NC42NDU2NywyMzkuMTczMjIgQyA3MTcuNTE5NjksMTk0Ljg4MTg4IDc2MS44MTEwMiwyNTYuODg5NzYgNzUyLjk1Mjc2LDI0OC4wMzE0OSIKKyAgICAgaWQ9InBhdGg4MTgyIgorICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgorICA8cGF0aAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7bWFya2VyLWVuZDp1cmwoI0Fycm93MU0pOyIKKyAgICAgZD0iTSA0MTYuMzM4NTgsMTc3LjE2NTM1IEMgMzAxLjE4MTExLDEyNC4wMTU3NCAyMzAuMzE0OTYsMjY1Ljc0ODAzIDIzOS4xNzMyMywyNDguMDMxNDkiCisgICAgIGlkPSJwYXRoODE4NCIKKyAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvZGJ1cy9kb2MvZG94eWdlbl90b19kZXZoZWxwLnhzbCBiL2RidXMvZG9jL2RveHlnZW5fdG9fZGV2aGVscC54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIwOThmOQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZG9jL2RveHlnZW5fdG9fZGV2aGVscC54c2wKQEAgLTAsMCArMSw0MCBAQAorPHhzbDpzdHlsZXNoZWV0CisgICAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCisgICAgeG1sbnM6Zm89Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML0Zvcm1hdCIKKyAgICB2ZXJzaW9uPSIxLjAiPgorCis8eHNsOm91dHB1dCBtZXRob2Q9InhtbCIgdmVyc2lvbj0iMS4wIiBpbmRlbnQ9InllcyIvPgorCis8eHNsOnBhcmFtIG5hbWU9InByZWZpeCI+PC94c2w6cGFyYW0+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgorICA8Ym9vayB0aXRsZT0iRC1CdXM6IEEgc3lzdGVtIGZvciBpbnRlcnByb2Nlc3MgY29tbXVuaWNhdGlvbiIKKyAgICAgICAgbmFtZT0iZGJ1cyIKKyAgICAgICAgbGluaz0iZGJ1cy10dXRvcmlhbC5odG1sIj4KKyAgPGNoYXB0ZXJzPgorICAgICA8c3ViIG5hbWU9IlR1dG9yaWFsIiBsaW5rPSJ7JHByZWZpeH1kYnVzLXR1dG9yaWFsLmh0bWwiLz4KKyAgICAgPHN1YiBuYW1lPSJGQVEiIGxpbms9InskcHJlZml4fWRidXMtZmFxLmh0bWwiLz4KKyAgICAgPHN1YiBuYW1lPSJTcGVjaWZpY2F0aW9uIiBsaW5rPSJ7JHByZWZpeH1kYnVzLXNwZWNpZmljYXRpb24uaHRtbCIvPgorICAgICA8c3ViIG5hbWU9IkFQSSBSZWZlcmVuY2UiIGxpbms9InskcHJlZml4fWFwaS9pbmRleC5odG1sIi8+CisgIDwvY2hhcHRlcnM+CisKKyAgPGZ1bmN0aW9ucz4KKyAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImRveHlnZW5pbmRleC9jb21wb3VuZFtAa2luZD0nZ3JvdXAnXS9tZW1iZXJbQGtpbmQ9J2Z1bmN0aW9uJ10iLz4KKyAgPC9mdW5jdGlvbnM+CisgIDwvYm9vaz4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJtZW1iZXIiPgorICA8eHNsOnBhcmFtIG5hbWU9Im5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lIi8+PC94c2w6cGFyYW0+CisgIDx4c2w6cGFyYW0gbmFtZT0icmVmaWQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcmVmaWQiLz48L3hzbDpwYXJhbT4KKyAgPHhzbDpwYXJhbSBuYW1lPSJiZWZvcmUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCRyZWZpZCwnXzEnKSIvPjwveHNsOnBhcmFtPgorICA8eHNsOnBhcmFtIG5hbWU9ImFmdGVyIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKCRyZWZpZCwnXzEnKSIvPjwveHNsOnBhcmFtPgorICA8eHNsOnBhcmFtIG5hbWU9ImxpbmsiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmVmb3JlIi8+Lmh0bWwjPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhZnRlciIvPjwveHNsOnBhcmFtPgorICA8eHNsOmlmIHRlc3Q9InN0YXJ0cy13aXRoKCRuYW1lLCdkYnVzJykgb3Igc3RhcnRzLXdpdGgoJG5hbWUsICdEQnVzJykiPgorICAgIDx4c2w6aWYgdGVzdD0ic3RhcnRzLXdpdGgoJHJlZmlkLCdncm91cF9fJykgYW5kIGNvbnRhaW5zKCRyZWZpZCwgJ18xJykiPgorICAgICAgIDxmdW5jdGlvbiBuYW1lPSJ7JG5hbWV9IiBsaW5rPSJ7JHByZWZpeH1hcGkveyRsaW5rfSIvPgorICAgIDwveHNsOmlmPgorICA8L3hzbDppZj4KKzwveHNsOnRlbXBsYXRlPgorCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvZGJ1cy9kb2MvZmlsZS1ib2lsZXJwbGF0ZS5jIGIvZGJ1cy9kb2MvZmlsZS1ib2lsZXJwbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMzY1ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RvYy9maWxlLWJvaWxlcnBsYXRlLmMKQEAgLTAsMCArMSwyNyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBGSUxFTkFNRSAgQlJJRUYgRklMRSBERVNDUklQVElPTgorICoKKyAqIENvcHlyaWdodCAoQykgWUVBUiAgQ09QWVJJR0hUIEhPTERFUgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfRk9PX0gKKyNkZWZpbmUgREJVU19GT09fSAorCisjZW5kaWYgLyogREJVU19GT09fSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kb2MvaW50cm9zcGVjdC5kdGQgYi9kYnVzL2RvYy9pbnRyb3NwZWN0LmR0ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTI2M2QzCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kb2MvaW50cm9zcGVjdC5kdGQKQEAgLTAsMCArMSwzNyBAQAorPCEtLSBEVEQgZm9yIEQtQnVzIEludHJvc3BlY3Rpb24gZGF0YSAtLT4KKzwhLS0gKEMpIDIwMDUtMDItMDIgRGF2aWQgQS4gV2hlZWxlcjsgcmVsZWFzZWQgdW5kZXIgdGhlIEQtQnVzIGxpY2Vuc2VzLAorICAgICAgICAgR05VIEdQTCB2ZXJzaW9uIDIgKG9yIGdyZWF0ZXIpIGFuZCBBRkwgMS4xIChvciBncmVhdGVyKSAtLT4KKworPCEtLSBzZWUgRC1CdXMgc3BlY2lmaWNhdGlvbiBmb3IgZG9jdW1lbnRhdGlvbiAtLT4KKworPCFFTEVNRU5UIG5vZGUgKG5vZGV8aW50ZXJmYWNlKSo+Cis8IUFUVExJU1Qgbm9kZSBuYW1lIENEQVRBICNJTVBMSUVEPgorCis8IUVMRU1FTlQgaW50ZXJmYWNlIChtZXRob2R8c2lnbmFsfHByb3BlcnR5fGFubm90YXRpb24pKj4KKzwhQVRUTElTVCBpbnRlcmZhY2UgbmFtZSBDREFUQSAjUkVRVUlSRUQ+CisKKzwhRUxFTUVOVCBtZXRob2QgKGFyZ3xhbm5vdGF0aW9uKSo+Cis8IUFUVExJU1QgbWV0aG9kIG5hbWUgQ0RBVEEgI1JFUVVJUkVEPgorCis8IUVMRU1FTlQgc2lnbmFsIChhcmd8YW5ub3RhdGlvbikqPgorPCFBVFRMSVNUIHNpZ25hbCBuYW1lIENEQVRBICNSRVFVSVJFRD4KKworPCFFTEVNRU5UIGFyZyBFTVBUWT4KKzwhQVRUTElTVCBhcmcgbmFtZSBDREFUQSAjSU1QTElFRD4KKzwhQVRUTElTVCBhcmcgdHlwZSBDREFUQSAjUkVRVUlSRUQ+Cis8IS0tIE1ldGhvZCBhcmd1bWVudHMgU0hPVUxEIGluY2x1ZGUgImRpcmVjdGlvbiIsCisgICAgIHdoaWxlIHNpZ25hbCBhbmQgZXJyb3IgYXJndW1lbnRzIFNIT1VMRCBub3QgKHNpbmNlIHRoZXJlJ3Mgbm8gcG9pbnQpLgorICAgICBUaGUgRFREIGZvcm1hdCBjYW4ndCBleHByZXNzIHRoYXQgc3VidGxldHkuIC0tPgorPCFBVFRMSVNUIGFyZyBkaXJlY3Rpb24gKGlufG91dCkgImluIj4KKworPCEtLSBBS0EgImF0dHJpYnV0ZSIgLS0+Cis8IUVMRU1FTlQgcHJvcGVydHkgKGFubm90YXRpb24pKj4KKzwhQVRUTElTVCBwcm9wZXJ0eSBuYW1lIENEQVRBICNSRVFVSVJFRD4KKzwhQVRUTElTVCBwcm9wZXJ0eSB0eXBlIENEQVRBICNSRVFVSVJFRD4gCis8IUFUVExJU1QgcHJvcGVydHkgYWNjZXNzIChyZWFkfHdyaXRlfHJlYWR3cml0ZSkgI1JFUVVJUkVEPgorCis8IUVMRU1FTlQgYW5ub3RhdGlvbiBFTVBUWT4gIDwhLS0gR2VuZXJpYyBtZXRhZGF0YSAtLT4KKzwhQVRUTElTVCBhbm5vdGF0aW9uIG5hbWUgQ0RBVEEgI1JFUVVJUkVEPgorPCFBVFRMSVNUIGFubm90YXRpb24gdmFsdWUgQ0RBVEEgI1JFUVVJUkVEPgorCisKZGlmZiAtLWdpdCBhL2RidXMvZG9jL2ludHJvc3BlY3QueHNsIGIvZGJ1cy9kb2MvaW50cm9zcGVjdC54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEzNDQ3NAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZG9jL2ludHJvc3BlY3QueHNsCkBAIC0wLDAgKzEsMTA2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xNSI/PgorPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKworPCEtLSAKKyBDb3B5cmlnaHQgKEMpIDIwMDUgTGVubmFydCBQb2V0dGVyaW5nLgorCisgTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCistLT4KKworPCEtLSAkSWQkIC0tPgorCis8eHNsOm91dHB1dCBtZXRob2Q9InhtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMTUiIGRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiIGluZGVudD0ieWVzIi8+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgorICA8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgIDx0aXRsZT5EQlVTIEludHJvc3BlY3Rpb24gZGF0YTwvdGl0bGU+CisgICAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAgICAgICBib2R5IHsgY29sb3I6IGJsYWNrOyBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZSB9IAorICAgICAgICBoMSB7IGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmIH0KKyAgICAgICAgdWwgeyBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7IG1hcmdpbi1ib3R0b206IDEwcHggfQorICAgICAgICBsaSB7IGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmIH0KKyAgICAgICAgLmtleXdvcmQgeyBmb250LXN0eWxlOiBpdGFsaWMgfQorICAgICAgICAudHlwZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KKyAgICAgICAgLnN5bWJvbCB7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2UgfQorICAgICAgICAuaW50ZXJmYWNlIHsgcGFkZGluZzogMTBweDsgbWFyZ2luOiAxMHB4IH0KKyAgICAgIDwvc3R5bGU+CisgICAgPC9oZWFkPgorICAgIDxib2R5PgorICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im5vZGUvaW50ZXJmYWNlIj4KKyAgICAgICAgPGRpdiBjbGFzcz0iaW50ZXJmYWNlIj4KKyAgICAgICAgICA8aDE+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0ia2V5d29yZCI+aW50ZXJmYWNlPC9zcGFuPjx4c2w6dGV4dD4gPC94c2w6dGV4dD4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzeW1ib2wiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvc3Bhbj4KKyAgICAgICAgICA8L2gxPiAgIAorICAgICAgICAgIAorICAgICAgICAgIDx1bD4KKworICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJhbm5vdGF0aW9uIi8+IAorCisgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0aG9kfHNpZ25hbHxwcm9wZXJ0eSI+CisgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ia2V5d29yZCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUoKSIvPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8eHNsOnRleHQ+IDwveHNsOnRleHQ+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN5bWJvbCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9zcGFuPgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iYW5ub3RhdGlvbiIvPiAKKyAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJhcmciPgorICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImtleXdvcmQiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAZGlyZWN0aW9uICE9ICZxdW90OyZxdW90OyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBkaXJlY3Rpb24iLz4gCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJuYW1lKC4uKSA9ICZxdW90O3NpZ25hbCZxdW90OyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CisKKyAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+IDwveHNsOnRleHQ+CisgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwvc3Bhbj48eHNsOnRleHQ+IDwveHNsOnRleHQ+CisgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN5bWJvbCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9zcGFuPjx4c2w6dGV4dD4gPC94c2w6dGV4dD4KKyAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgorICAgICAgICAgICAgICAgIDwvdWw+CisKKyAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgorCisgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICA8L2JvZHk+CisgIDwvaHRtbD4KKzwveHNsOnRlbXBsYXRlPgorCisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9ImFubm90YXRpb24iPiAKKyAgPGxpPgorICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5hbm5vdGF0aW9uPC9zcGFuPgorICAgIDxjb2RlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvY29kZT48eHNsOnRleHQ+ID0gPC94c2w6dGV4dD4KKyAgICA8Y29kZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHZhbHVlIi8+PC9jb2RlPgorICA8L2xpPgorPC94c2w6dGVtcGxhdGU+CisKKzwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9kYnVzL2RvYy9zeXN0ZW0tYWN0aXZhdGlvbi50eHQgYi9kYnVzL2RvYy9zeXN0ZW0tYWN0aXZhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQxOTVmNwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZG9jL3N5c3RlbS1hY3RpdmF0aW9uLnR4dApAQCAtMCwwICsxLDgwIEBACitELUJVUyBTeXN0ZW0gQWN0aXZhdGlvbgorCitJbnRyb2R1Y3Rpb246CisKK1RoZSBkYnVzLWRhZW1vbiBydW5zIGFzIHRoZSBkYnVzIHVzZXIsIGFuZCBpcyB0aGVyZWZvcmUgdW5wcml2aWxlZ2VkLgorRWFybGllciBhdHRlbXB0cyBbMV0gYnkgRGF2aWQgWmV1dGhlbiBhdCBsYXVuY2hpbmcgc3lzdGVtIHNjcmlwdHMgdXNpbmcgYQorY3VzdG9tIERCVVMgcHJvdG9jb2wgd2VyZSByZXZpZXdlZCwgYnV0IGRlZW1lZCB0b28gZGlmZmljdWx0IHRvIGF1ZGl0LCBhbmQKK2Fsc28gZHVlIHRvIGEgbXVsdGktdGhyZWFkZWQgZGVzaWduLCB0b28gZGlmZmljdWx0IHRvIHRlc3QuCitJbiB0aGUgbmV4dCBmZXcgcGFyYWdyYXBocyBJIHdpbGwgb3V0bGluZSBhIHNpbXBsZXIgc2V0dWlkIGFwcHJvYWNoIGZvcgorbGF1bmNoaW5nIGRhZW1vbnMgYXMgYSBjb25maWd1cmVkIHVzZXIuCisKK1Njb3BlOgorCitMYXVuY2hpbmcgcHJvZ3JhbXMgdXNpbmcgZGJ1cyBoYXMgYmVlbiBhIHRvcGljIG9mIGludGVyZXN0IGZvciBtYW55IG1vbnRocy4KK1RoaXMgd291bGQgYWxsb3cgc2ltcGxlIHN5c3RlbXMgdG8gb25seSBzdGFydCBzZXJ2aWNlcyB0aGF0IGFyZSBuZWVkZWQsCithbmQgdGhhdCBhcmUgYXV0b21hdGljYWxseSBzdGFydGVkIG9ubHkgd2hlbiBmaXJzdCByZXF1ZXN0ZWQuCitUaGlzIHJlbW92ZXMgdGhlIG5lZWQgZm9yIGFuIGluaXQgc3lzdGVtLCBhbmQgbWVhbnMgdGhhdCB3ZSBjYW4gdHJpdmlhbGx5CitzdGFydHVwIHNlcnZpY2VzIGluIHBhcmFsbGVsLgorVGhpcyBoYXMgaW1tZWRpYXRlIHByZXNzaW5nIG5lZWQgZm9yIE9MUEMsIHdpdGggYSBsb25nZXIgdGVybSBldmFsdWF0aW9uIGZvcgorcGVyaGFwcyBGZWRvcmEgYW5kIFJIRUwuCisKK0RldGFpbHM6CisKK1NldHVpZCBhcHBsaWNhdGlvbnMgaGF2ZSB0byB1c2VkIG9ubHkgd2hlbiBhYnNvbHV0ZWx5IG5lY2Vzc2FyeS4KK0luIHRoaXMgaW1wbGVtZW50YXRpb24gSSBoYXZlIGFuIHNpbmdsZSBleGVjdXRhYmxlLAorZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlciwgd2l0aCB0aGUgb3duZXJzaGlwIHJvb3Q6ZGJ1cy4KK1RoaXMgaGFzIHRoZSBwZXJtaXNzaW9ucyA0NzUwLCBpLmUuIHUrcnd4IGcrcnggK3NldHVpZC4KK0l0IGlzIGxvY2F0ZWQgaW4gL3Vzci9saWJleGVjLyBhbmQgdGh1cyBpcyBub3QgZGVzaWduZWQgdG8gYmUgaW52b2tlZCBieSBhCit1c2VyIGRpcmVjdGx5LgorCitUaGUgaGVscGVyIG11c3Qgbm90IGJlIHBhc3NlZCBpbnB1dCB0aGF0IGNhbiBiZSBjaGFuZ2VkIG1hbGljaW91c2x5LCBhbmQKK3RoZXJlZm9yZSBwYXNzaW5nIGEgcmFuZG9tIHBhdGggd2l0aCB1c2VyIGlkIGlzIHRvdGFsbHkgb3V0IG9mIHRoZSBxdWVzdGlvbi4KK0luIHRoaXMgaW1wbGVtZW50YXRpb24gYSBzaW1pbGFyIGlkZWEgYXMgZGlzY3Vzc2VkIHdpdGggRGF2aWRzJyBwYXRjaCB3YXMKK3Rha2VuLCB0aGF0IHRvIHBhc3MgYSBzaW5nbGUgbmFtZSBhcmd1bWVudCB0byB0aGUgaGVscGVyLgorVGhlIHNlcnZpY2UgZmlsZW5hbWUgb2YgIm9yZy5tZS50ZXN0LnNlcnZpY2UiIGlzIHRoZW4gc2VhcmNoZWQgZm9yIGluCisvdXNyL3NoYXJlL2RidXMtMS9zeXN0ZW0tc2VydmljZXMgb3Igb3RoZXIgc3BlY2lmaWVkIGRpcmVjdG9yaWVzLgorCitJZiBhcHBsaWNhdGlvbnMgd2FudCB0byBiZSBhY3RpdmF0ZWQgb24gdGhlIHN5c3RlbSBfYW5kXyBzZXNzaW9uIGJ1c3NlcywgdGhlbgorc2VydmljZSBmaWxlcyBzaG91bGQgYmUgaW5zdGFsbGVkIGluIGJvdGggZGlyZWN0b3JpZXMuCisKK0EgdHlwaWNhbCBzZXJ2aWNlIGZpbGUgd291bGQgbG9vayBsaWtlOgorCitbRC1CVVMgU2VydmljZV0KK05hbWU9b3JnLm1lLnRlc3QKK0V4ZWM9L3Vzci9zYmluL2RidXMtdGVzdC1zZXJ2ZXIucHkKK1VzZXI9ZnRwCisKK1RoaXMgZ2l2ZXMgdGhlIHVzZXIgdG8gc3dpdGNoIHRvLCBhbmQgYWxzbyB0aGUgcGF0aCBvZiB0aGUgZXhlY3V0YWJsZS4KK1RoZSBzZXJ2aWNlIG5hbWUgbXVzdCBtYXRjaCB0aGF0IHNwZWNpZmllZCBpbiB0aGUgL2V0Yy9kYnVzLTEvc3lzdGVtLmQgY29uZiBmaWxlLgorCitQcmVjYXV0aW9ucyB0YWtlbjoKKworKiBPbmx5IHRoZSBidXMgbmFtZSBpcyBwYXNzZWQgdG8gdGhlIGhlbHBlciwgYW5kIHRoaXMgaXMgdmFsaWRhdGVkCisqIFdlIGFyZSBzdXBlciBwYXJhbm9pZCBhYm91dCB0aGUgdXNlciB0aGF0IGNhbGxlZCB1cywgYW5kIHdoYXQgcGVybWlzc2lvbnMgd2UgaGF2ZS4KKyogV2UgY2xlYXIgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlcyBleGNlcHQgZm9yIERCVVNfVkVSQk9TRSB3aGljaCBpcyB1c2VkIGZvciBkZWJ1Z2dpbmcKKyogQW55dGhpbmcgb3V0IG9mIHRoZSBvcmRpbmFyeSBjYXVzZXMgdGhlIGhlbHBlciB0byBhYm9ydC4KKworTGF1bmNoaW5nIHNlcnZpY2VzOgorCitUcml2aWFsIG1ldGhvZHMgb24gc2VydmljZXMgY2FuIGJlIGNhbGxlZCBkaXJlY3RseSBhbmQgdGhlIGxhdW5jaCBoZWxwZXIgd2lsbAorc3RhcnQgdGhlIHNlcnZpY2UgYW5kIGV4ZWN1dGUgdGhlIG1ldGhvZCBvbiB0aGUgc2VydmljZS4gVGhlIGxhdWNoaW5nIG9mIHRoZQorc2VydmljZSBpcyBjb21wbGV0ZWx5IHRyYW5zcGFyZW50IHRvIHRoZSBjYWxsZXIsIGUuZy46CisKK2RidXMtc2VuZCAtLXN5c3RlbSAtLXByaW50LXJlcGx5CQkJXAorCS0tZGVzdD1vcmcuZnJlZWRlc2t0b3AuSGFsCQkJXAorCS9vcmcvZnJlZWRlc2t0b3AvSGFsL01hbmFnZXIJCQlcCisJb3JnLmZyZWVkZXNrdG9wLkhhbC5NYW5hZ2VyLkRldmljZUV4aXN0cwlcCisJc3RyaW5nOi9vcmcvZnJlZWRlc2t0b3AvSGFsL2RldmljZXMvY29tcHV0ZXIKKworSWYgeW91IHdpc2ggdG8gYWN0aXZhdGUgdGhlIHNlcnZpY2Ugd2l0aG91dCBjYWxsaW5nIGEgd2VsbCBrbm93biBtZXRob2QsCit0aGUgc3RhbmRhcmQgZGJ1cyBtZXRob2QgU3RhcnRTZXJ2aWNlQnlOYW1lIGNhbiBiZSB1c2VkOgorCitkYnVzLXNlbmQgLS1zeXN0ZW0gLS1wcmludC1yZXBseQkJCVwKKwktLWRlc3Q9b3JnLmZyZWVkZXNrdG9wLkRCdXMJCQlcCisJL29yZy9mcmVlZGVza3RvcC9EQnVzCQkJCVwKKwlvcmcuZnJlZWRlc2t0b3AuREJ1cy5TdGFydFNlcnZpY2VCeU5hbWUJCVwKKwlzdHJpbmc6b3JnLmZyZWVkZXNrdG9wLkhhbCB1aW50MzI6MAorCitbMV0gaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9hcmNoaXZlcy9kYnVzLzIwMDYtT2N0b2Jlci8wMDYwOTYuaHRtbAorCmRpZmYgLS1naXQgYS9kYnVzL200L2FzLWFjLWV4cGFuZC5tNCBiL2RidXMvbTQvYXMtYWMtZXhwYW5kLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZWJkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL200L2FzLWFjLWV4cGFuZC5tNApAQCAtMCwwICsxLDQ5IEBACitkbmwgYXMtYWMtZXhwYW5kLm00IDAuMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gYXV0b2NvbmYgLSotCitkbmwgYXV0b3N0YXJzIG00IG1hY3JvIGZvciBleHBhbmRpbmcgZGlyZWN0b3JpZXMgdXNpbmcgY29uZmlndXJlJ3MgcHJlZml4CisKK2RubCAoQykgMjAwMywgMjAwNCwgMjAwNSBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKK2RubCBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorZG5sIGFyZSBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodAorZG5sIG5vdGljZSBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4KKworZG5sIEFTX0FDX0VYUEFORChWQVIsIENPTkZJR1VSRV9WQVIpCisKK2RubCBleGFtcGxlOgorZG5sIEFTX0FDX0VYUEFORChTWVNDT05GRElSLCAkc3lzY29uZmRpcikKK2RubCB3aWxsIHNldCBTWVNDT05GRElSIHRvIC91c3IvbG9jYWwvZXRjIGlmIHByZWZpeD0vdXNyL2xvY2FsCisKK0FDX0RFRlVOKFtBU19BQ19FWFBBTkRdLAorWworICBFWFBfVkFSPVskMV0KKyAgRlJPTV9WQVI9WyQyXQorCisgIGRubCBmaXJzdCBleHBhbmQgcHJlZml4IGFuZCBleGVjX3ByZWZpeCBpZiBuZWNlc3NhcnkKKyAgcHJlZml4X3NhdmU9JHByZWZpeAorICBleGVjX3ByZWZpeF9zYXZlPSRleGVjX3ByZWZpeAorCisgIGRubCBpZiBubyBwcmVmaXggZ2l2ZW4sIHRoZW4gdXNlIC91c3IvbG9jYWwsIHRoZSBkZWZhdWx0IHByZWZpeAorICBpZiB0ZXN0ICJ4JHByZWZpeCIgPSAieE5PTkUiOyB0aGVuCisgICAgcHJlZml4PSIkYWNfZGVmYXVsdF9wcmVmaXgiCisgIGZpCisgIGRubCBpZiBubyBleGVjX3ByZWZpeCBnaXZlbiwgdGhlbiB1c2UgcHJlZml4CisgIGlmIHRlc3QgIngkZXhlY19wcmVmaXgiID0gInhOT05FIjsgdGhlbgorICAgIGV4ZWNfcHJlZml4PSRwcmVmaXgKKyAgZmkKKworICBmdWxsX3Zhcj0iJEZST01fVkFSIgorICBkbmwgbG9vcCB1bnRpbCBpdCBkb2Vzbid0IGNoYW5nZSBhbnltb3JlCisgIHdoaWxlIHRydWU7IGRvCisgICAgbmV3X2Z1bGxfdmFyPSJgZXZhbCBlY2hvICRmdWxsX3ZhcmAiCisgICAgaWYgdGVzdCAieCRuZXdfZnVsbF92YXIiID0gIngkZnVsbF92YXIiOyB0aGVuIGJyZWFrOyBmaQorICAgIGZ1bGxfdmFyPSRuZXdfZnVsbF92YXIKKyAgZG9uZQorCisgIGRubCBjbGVhbiB1cAorICBmdWxsX3Zhcj0kbmV3X2Z1bGxfdmFyCisgIEFDX1NVQlNUKFskMV0sICIkZnVsbF92YXIiKQorCisgIGRubCByZXN0b3JlIHByZWZpeCBhbmQgZXhlY19wcmVmaXgKKyAgcHJlZml4PSRwcmVmaXhfc2F2ZQorICBleGVjX3ByZWZpeD0kZXhlY19wcmVmaXhfc2F2ZQorXSkKZGlmZiAtLWdpdCBhL2RidXMvbTQvY29tcGlsZXIubTQgYi9kYnVzL200L2NvbXBpbGVyLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZmY1ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL200L2NvbXBpbGVyLm00CkBAIC0wLDAgKzEsNjcgQEAKKyMgY29tcGlsZXIubTQgLSBhdXRvY29uZiBtYWNyb3MgZm9yIGNvbXBpbGVyIHNldHRpbmdzCisjCisjIENvcHlyaWdodCDCqSAyMDA1IFNjb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QG5ldHNwbGl0LmNvbT4uCisjCisjIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworIyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyMgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworIyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisjIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworIyBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyMgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIyAKKyMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisjIAorIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyMgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisjIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyMgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUgorIyBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRgorIyBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyMgV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKKworIyBDT01QSUxFUl9XQVJOSU5HUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFkZCBjb25maWd1cmUgb3B0aW9uIHRvIGVuYWJsZSBhZGRpdGlvbmFsIGNvbXBpbGVyIHdhcm5pbmdzIGFuZCB0cmVhdAorIyB0aGVtIGFzIGVycm9ycy4KK0FDX0RFRlVOKFtDT01QSUxFUl9XQVJOSU5HU10sCitbQUNfQVJHX0VOQUJMRShjb21waWxlci13YXJuaW5ncywKKwlBU19IRUxQX1NUUklORyhbLS1lbmFibGUtY29tcGlsZXItd2FybmluZ3NdLAorCSAgICAgICAgICAgICAgIFtFbmFibGUgYWRkaXRpb25hbCBjb21waWxlciB3YXJuaW5nc10pLAorW2lmIHRlc3QgIngkZW5hYmxlX2NvbXBpbGVyX3dhcm5pbmdzIiA9ICJ4eWVzIjsgdGhlbgorCWlmIHRlc3QgIngkR0NDIiA9ICJ4eWVzIjsgdGhlbgorICAgICAgICAgICAgICAgIENGTEFHUz0iLVdhbGwgLVdlcnJvciAkQ0ZMQUdTIgorICAgICAgICBmaQorCWlmIHRlc3QgIngkR1hYIiA9ICJ4eWVzIjsgdGhlbgorCQlDWFhGTEFHUz0iLVdhbGwgLVdlcnJvciAkQ1hYRkxBR1MiCisJZmkKK2ZpXSlkbmwKK10pIyBDT01QSUxFUl9XQVJOSU5HUworCisjIENPTVBJTEVSX09QVElNSVNBVElPTlMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFkZCBjb25maWd1cmUgb3B0aW9uIHRvIGRpc2FibGUgb3B0aW1pc2F0aW9ucy4KK0FDX0RFRlVOKFtDT01QSUxFUl9PUFRJTUlTQVRJT05TXSwKK1tBQ19BUkdfRU5BQkxFKGNvbXBpbGVyLW9wdGltaXNhdGlvbnMsCisJQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1jb21waWxlci1vcHRpbWlzYXRpb25zXSwKKwkJICAgICAgIFtEaXNhYmxlIGNvbXBpbGVyIG9wdGltaXNhdGlvbnNdKSwKK1tpZiB0ZXN0ICJ4JGVuYWJsZV9jb21waWxlcl9vcHRpbWlzYXRpb25zIiA9ICJ4bm8iOyB0aGVuCisJW0NGTEFHUz1gZWNobyAiJENGTEFHUyIgfCBzZWQgLWUgInMvIC1PWzEtOV0qXGIvIC1PMC9nImBdCitmaV0pZG5sCitdKSMgQ09NUElMRVJfT1BUSU1JU0FUSU9OUworCisjIENPTVBJTEVSX0NPVkVSQUdFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQWRkIGNvbmZpZ3VyZSBvcHRpb24gdG8gZW5hYmxlIGNvdmVyYWdlIGRhdGEuCitBQ19ERUZVTihbQ09NUElMRVJfQ09WRVJBR0VdLAorW0FDX0FSR19FTkFCTEUoY29tcGlsZXItY292ZXJhZ2UsCisJQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWNvbXBpbGVyLWNvdmVyYWdlXSwKKwkJICAgICAgIFtFbmFibGUgZ2VuZXJhdGlvbiBvZiBjb3ZlcmFnZSBkYXRhXSksCitbaWYgdGVzdCAieCRlbmFibGVfY29tcGlsZXJfY292ZXJhZ2UiID0gInh5ZXMiOyB0aGVuCisJaWYgdGVzdCAieCRHQ0MiID0gInh5ZXMiOyB0aGVuCisJCUNGTEFHUz0iJENGTEFHUyAtZnByb2ZpbGUtYXJjcyAtZnRlc3QtY292ZXJhZ2UiCisJZmkKK2ZpXSlkbmwKK10pIyBDT01QSUxFUl9DT1ZFUkFHRQpkaWZmIC0tZ2l0IGEvZGJ1cy9tNC9wa2cubTQgYi9kYnVzL200L3BrZy5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGJlNzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9tNC9wa2cubTQKQEAgLTAsMCArMSwxNTUgQEAKKyMgcGtnLm00IC0gTWFjcm9zIHRvIGxvY2F0ZSBhbmQgdXRpbGlzZSBwa2ctY29uZmlnLiAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKyMKKyMgQ29weXJpZ2h0IMKpIDIwMDQgU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAbmV0c3BsaXQuY29tPi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIFBLR19QUk9HX1BLR19DT05GSUcoW01JTi1WRVJTSU9OXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW1BLR19QUk9HX1BLR19DT05GSUddLAorW200X3BhdHRlcm5fZm9yYmlkKFteXz9QS0dfW0EtWl9dKyRdKQorbTRfcGF0dGVybl9hbGxvdyhbXlBLR19DT05GSUcoX1BBVEgpPyRdKQorQUNfQVJHX1ZBUihbUEtHX0NPTkZJR10sIFtwYXRoIHRvIHBrZy1jb25maWcgdXRpbGl0eV0pZG5sCitpZiB0ZXN0ICJ4JGFjX2N2X2Vudl9QS0dfQ09ORklHX3NldCIgIT0gInhzZXQiOyB0aGVuCisJQUNfUEFUSF9UT09MKFtQS0dfQ09ORklHXSwgW3BrZy1jb25maWddKQorZmkKK2lmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorCV9wa2dfbWluX3ZlcnNpb249bTRfZGVmYXVsdChbJDFdLCBbMC45LjBdKQorCUFDX01TR19DSEVDS0lORyhbcGtnLWNvbmZpZyBpcyBhdCBsZWFzdCB2ZXJzaW9uICRfcGtnX21pbl92ZXJzaW9uXSkKKwlpZiAkUEtHX0NPTkZJRyAtLWF0bGVhc3QtcGtnY29uZmlnLXZlcnNpb24gJF9wa2dfbWluX3ZlcnNpb247IHRoZW4KKwkJQUNfTVNHX1JFU1VMVChbeWVzXSkKKwllbHNlCisJCUFDX01TR19SRVNVTFQoW25vXSkKKwkJUEtHX0NPTkZJRz0iIgorCWZpCisKK2ZpW11kbmwKK10pIyBQS0dfUFJPR19QS0dfQ09ORklHCisKKyMgUEtHX0NIRUNLX0VYSVNUUyhNT0RVTEVTLCBbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQorIworIyBDaGVjayB0byBzZWUgd2hldGhlciBhIHBhcnRpY3VsYXIgc2V0IG9mIG1vZHVsZXMgZXhpc3RzLiAgU2ltaWxhcgorIyB0byBQS0dfQ0hFQ0tfTU9EVUxFUygpLCBidXQgZG9lcyBub3Qgc2V0IHZhcmlhYmxlcyBvciBwcmludCBlcnJvcnMuCisjCisjCisjIFNpbWlsYXIgdG8gUEtHX0NIRUNLX01PRFVMRVMsIG1ha2Ugc3VyZSB0aGF0IHRoZSBmaXJzdCBpbnN0YW5jZSBvZgorIyB0aGlzIG9yIFBLR19DSEVDS19NT0RVTEVTIGlzIGNhbGxlZCwgb3IgbWFrZSBzdXJlIHRvIGNhbGwKKyMgUEtHX0NIRUNLX0VYSVNUUyBtYW51YWxseQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW1BLR19DSEVDS19FWElTVFNdLAorW0FDX1JFUVVJUkUoW1BLR19QUk9HX1BLR19DT05GSUddKWRubAoraWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKKyAgICBBQ19SVU5fTE9HKFskUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAiJDEiXSk7IHRoZW4KKyAgbTRfaWZ2YWwoWyQyXSwgWyQyXSwgWzpdKQorbTRfaWZ2YWxuKFskM10sIFtlbHNlCisgICQzXSlkbmwKK2ZpXSkKKworCisjIF9QS0dfQ09ORklHKFtWQVJJQUJMRV0sIFtDT01NQU5EXSwgW01PRFVMRVNdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX1BLR19DT05GSUddLAorW2lmIHRlc3QgLW4gIiQkMSI7IHRoZW4KKyAgICBwa2dfY3ZfW10kMT0iJCQxIgorIGVsaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCisgICAgUEtHX0NIRUNLX0VYSVNUUyhbJDNdLAorICAgICAgICAgICAgICAgICAgICAgW3BrZ19jdl9bXSQxPWAkUEtHX0NPTkZJRyAtLVtdJDIgIiQzIiAyPi9kZXYvbnVsbGBdLAorCQkgICAgIFtwa2dfZmFpbGVkPXllc10pCisgZWxzZQorICAgIHBrZ19mYWlsZWQ9dW50cmllZAorZmlbXWRubAorXSkjIF9QS0dfQ09ORklHCisKKyMgX1BLR19TSE9SVF9FUlJPUlNfU1VQUE9SVEVECisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX1BLR19TSE9SVF9FUlJPUlNfU1VQUE9SVEVEXSwKK1tBQ19SRVFVSVJFKFtQS0dfUFJPR19QS0dfQ09ORklHXSkKK2lmICRQS0dfQ09ORklHIC0tYXRsZWFzdC1wa2djb25maWctdmVyc2lvbiAwLjIwOyB0aGVuCisgICAgICAgIF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZD15ZXMKK2Vsc2UKKyAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPW5vCitmaVtdZG5sCitdKSMgX1BLR19TSE9SVF9FUlJPUlNfU1VQUE9SVEVECisKKworIyBQS0dfQ0hFQ0tfTU9EVUxFUyhWQVJJQUJMRS1QUkVGSVgsIE1PRFVMRVMsIFtBQ1RJT04tSUYtRk9VTkRdLAorIyBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCisjCisjCisjIE5vdGUgdGhhdCBpZiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoZSBmaXJzdCBjYWxsIHRvCisjIFBLR19DSEVDS19NT0RVTEVTIG1pZ2h0IG5vdCBoYXBwZW4sIHlvdSBzaG91bGQgYmUgc3VyZSB0byBpbmNsdWRlIGFuCisjIGV4cGxpY2l0IGNhbGwgdG8gUEtHX1BST0dfUEtHX0NPTkZJRyBpbiB5b3VyIGNvbmZpZ3VyZS5hYworIworIworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW1BLR19DSEVDS19NT0RVTEVTXSwKK1tBQ19SRVFVSVJFKFtQS0dfUFJPR19QS0dfQ09ORklHXSlkbmwKK0FDX0FSR19WQVIoWyQxXVtfQ0ZMQUdTXSwgW0MgY29tcGlsZXIgZmxhZ3MgZm9yICQxLCBvdmVycmlkaW5nIHBrZy1jb25maWddKWRubAorQUNfQVJHX1ZBUihbJDFdW19MSUJTXSwgW2xpbmtlciBmbGFncyBmb3IgJDEsIG92ZXJyaWRpbmcgcGtnLWNvbmZpZ10pZG5sCisKK3BrZ19mYWlsZWQ9bm8KK0FDX01TR19DSEVDS0lORyhbZm9yICQxXSkKKworX1BLR19DT05GSUcoWyQxXVtfQ0ZMQUdTXSwgW2NmbGFnc10sIFskMl0pCitfUEtHX0NPTkZJRyhbJDFdW19MSUJTXSwgW2xpYnNdLCBbJDJdKQorCittNF9kZWZpbmUoW19QS0dfVEVYVF0sIFtBbHRlcm5hdGl2ZWx5LCB5b3UgbWF5IHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzICQxW11fQ0ZMQUdTCithbmQgJDFbXV9MSUJTIHRvIGF2b2lkIHRoZSBuZWVkIHRvIGNhbGwgcGtnLWNvbmZpZy4KK1NlZSB0aGUgcGtnLWNvbmZpZyBtYW4gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLl0pCisKK2lmIHRlc3QgJHBrZ19mYWlsZWQgPSB5ZXM7IHRoZW4KKyAgICAgICAgX1BLR19TSE9SVF9FUlJPUlNfU1VQUE9SVEVECisgICAgICAgIGlmIHRlc3QgJF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZCA9IHllczsgdGhlbgorCSAgICAgICAgJDFbXV9QS0dfRVJST1JTPWAkUEtHX0NPTkZJRyAtLXNob3J0LWVycm9ycyAtLXByaW50LWVycm9ycyAiJDIiIDI+JjFgCisgICAgICAgIGVsc2UKKwkgICAgICAgICQxW11fUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1wcmludC1lcnJvcnMgIiQyIiAyPiYxYAorICAgICAgICBmaQorCSMgUHV0IHRoZSBuYXN0eSBlcnJvciBtZXNzYWdlIGluIGNvbmZpZy5sb2cgd2hlcmUgaXQgYmVsb25ncworCWVjaG8gIiQkMVtdX1BLR19FUlJPUlMiID4mQVNfTUVTU0FHRV9MT0dfRkQKKworCWlmZWxzZShbJDRdLCAsIFtBQ19NU0dfRVJST1IoZG5sCitbUGFja2FnZSByZXF1aXJlbWVudHMgKCQyKSB3ZXJlIG5vdCBtZXQ6CisKKyQkMV9QS0dfRVJST1JTCisKK0NvbnNpZGVyIGFkanVzdGluZyB0aGUgUEtHX0NPTkZJR19QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIHlvdQoraW5zdGFsbGVkIHNvZnR3YXJlIGluIGEgbm9uLXN0YW5kYXJkIHByZWZpeC4KKworX1BLR19URVhUCitdKV0sCisJCVtBQ19NU0dfUkVTVUxUKFtub10pCisgICAgICAgICAgICAgICAgJDRdKQorZWxpZiB0ZXN0ICRwa2dfZmFpbGVkID0gdW50cmllZDsgdGhlbgorCWlmZWxzZShbJDRdLCAsIFtBQ19NU0dfRkFJTFVSRShkbmwKK1tUaGUgcGtnLWNvbmZpZyBzY3JpcHQgY291bGQgbm90IGJlIGZvdW5kIG9yIGlzIHRvbyBvbGQuICBNYWtlIHN1cmUgaXQKK2lzIGluIHlvdXIgUEFUSCBvciBzZXQgdGhlIFBLR19DT05GSUcgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIGZ1bGwKK3BhdGggdG8gcGtnLWNvbmZpZy4KKworX1BLR19URVhUCisKK1RvIGdldCBwa2ctY29uZmlnLCBzZWUgPGh0dHA6Ly9wa2ctY29uZmlnLmZyZWVkZXNrdG9wLm9yZy8+Ll0pXSwKKwkJWyQ0XSkKK2Vsc2UKKwkkMVtdX0NGTEFHUz0kcGtnX2N2X1tdJDFbXV9DRkxBR1MKKwkkMVtdX0xJQlM9JHBrZ19jdl9bXSQxW11fTElCUworICAgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCWlmZWxzZShbJDNdLCAsIDosIFskM10pCitmaVtdZG5sCitdKSMgUEtHX0NIRUNLX01PRFVMRVMKZGlmZiAtLWdpdCBhL2RidXMvbTQvdHAtY29tcGlsZXItZmxhZy5tNCBiL2RidXMvbTQvdHAtY29tcGlsZXItZmxhZy5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmRlYWJhCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9tNC90cC1jb21waWxlci1mbGFnLm00CkBAIC0wLDAgKzEsNDMgQEAKK2RubCBBIHZlcnNpb24gb2YgQVNfQ09NUElMRVJfRkxBRyB0aGF0IHN1cHBvcnRzIGJvdGggQyBhbmQgQysrLgorZG5sIEJhc2VkIG9uOgorCitkbmwgYXMtY29tcGlsZXItZmxhZy5tNCAwLjEuMAorZG5sIGF1dG9zdGFycyBtNCBtYWNybyBmb3IgZGV0ZWN0aW9uIG9mIGNvbXBpbGVyIGZsYWdzCitkbmwgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CitkbmwgJElkOiBhcy1jb21waWxlci1mbGFnLm00LHYgMS4xIDIwMDUvMDYvMTggMTg6MDI6NDYgYnVyZ2VybWFuIEV4cCAkCisKK2RubCBUUF9DT01QSUxFUl9GTEFHKENGTEFHUywgQUNUSU9OLUlGLUFDQ0VQVEVELCBbQUNUSU9OLUlGLU5PVC1BQ0NFUFRFRF0pCitkbmwgVHJpZXMgdG8gY29tcGlsZSB3aXRoIHRoZSBnaXZlbiBDRkxBR1MgYW5kIENYWEZMQUdTLgorZG5sCitkbmwgUnVucyBBQ1RJT04tSUYtQUNDRVBURUQgaWYgdGhlIGNvbXBpbGVyIGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkCitkbmwgQUNfTEFORyBjYW4gY29tcGlsZSB3aXRoIHRoZSBmbGFncywgYW5kIEFDVElPTi1JRi1OT1QtQUNDRVBURUQgb3RoZXJ3aXNlLgorCitBQ19ERUZVTihbVFBfQ09NUElMRVJfRkxBR10sCitbCisgIEFDX01TR19DSEVDS0lORyhbdG8gc2VlIGlmIGNvbXBpbGVyIHVuZGVyc3RhbmRzICQxXSkKKworICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgc2F2ZV9DWFhGTEFHUz0iJENYWEZMQUdTIgorICBDRkxBR1M9IiRDRkxBR1MgJDEiCisgIENYWEZMQUdTPSIkQ1hYRkxBR1MgJDEiCisKKyAgQUNfVFJZX0NPTVBJTEUoWyBdLCBbXSwgW2ZsYWdfb2s9eWVzXSwgW2ZsYWdfb2s9bm9dKQorICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKyAgQ1hYRkxBR1M9IiRzYXZlX0NYWEZMQUdTIgorCisgIGlmIHRlc3QgIlgkZmxhZ19vayIgPSBYeWVzIDsgdGhlbgorICAgICQyCisgICAgdHJ1ZQorICBlbHNlCisgICAgJDMKKyAgICB0cnVlCisgIGZpCisgIEFDX01TR19SRVNVTFQoWyRmbGFnX29rXSkKK10pCisKK2RubCBUUF9BRERfQ09NUElMRVJfRkxBRyhWQVJJQUJMRSwgQ0ZMQUdTKQorZG5sIEFwcGVuZCBDRkxBR1MgdG8gVkFSSUFCTEUgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIHRoZW0uCitBQ19ERUZVTihbVFBfQUREX0NPTVBJTEVSX0ZMQUddLAorWworICBUUF9DT01QSUxFUl9GTEFHKFskMl0sIFskMT0iWyRdJDEgJDIiXSkKK10pCmRpZmYgLS1naXQgYS9kYnVzL200L3RwLWNvbXBpbGVyLXdhcm5pbmdzLm00IGIvZGJ1cy9tNC90cC1jb21waWxlci13YXJuaW5ncy5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTRhZjMxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9tNC90cC1jb21waWxlci13YXJuaW5ncy5tNApAQCAtMCwwICsxLDQ5IEBACitkbmwgVFBfQ09NUElMRVJfV0FSTklOR1MoVkFSSUFCTEUsIFdFUlJPUl9CWV9ERUZBVUxULCBERVNJUkFCTEUsIFVOREVTSVJBQkxFKQorZG5sICQxIChWQVJJQUJMRSk6IHRoZSB2YXJpYWJsZSB0byBwdXQgZmxhZ3MgaW50bworZG5sICQyIChXRVJST1JfQllfREVGQVVMVCk6IGEgY29tbWFuZCByZXR1cm5pbmcgdHJ1ZSBpZiAtV2Vycm9yIHNob3VsZCBiZSB0aGUKK2RubCAgICAgZGVmYXVsdAorZG5sICQzIChERVNJUkFCTEUpOiB3YXJuaW5nIGZsYWdzIHdlIHdhbnQgKGUuZy4gYWxsIGV4dHJhIHNoYWRvdykKK2RubCAkNCAoVU5ERVNJUkFCTEUpOiB3YXJuaW5nIGZsYWdzIHdlIGRvbid0IHdhbnQgKGUuZy4KK2RubCAgIG1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIHVudXNlZC1wYXJhbWV0ZXIpCitBQ19ERUZVTihbVFBfQ09NUElMRVJfV0FSTklOR1NdLAorWworICBBQ19SRVFVSVJFKFtBQ19BUkdfRU5BQkxFXSlkbmwKKyAgQUNfUkVRVUlSRShbQUNfSEVMUF9TVFJJTkddKWRubAorICBBQ19SRVFVSVJFKFtUUF9DT01QSUxFUl9GTEFHXSlkbmwKKworICB0cF93YXJuaW5ncz0iIgorICBmb3IgdHBfZmxhZyBpbiAkMzsgZG8KKyAgICBUUF9DT01QSUxFUl9GTEFHKFstVyR0cF9mbGFnXSwgW3RwX3dhcm5pbmdzPSIkdHBfd2FybmluZ3MgLVckdHBfZmxhZyJdKQorICBkb25lCisKKyAgdHBfZXJyb3JfZmxhZ3M9Ii1XZXJyb3IiCisgIFRQX0NPTVBJTEVSX0ZMQUcoWy1XZXJyb3JdLCBbdHBfd2Vycm9yPXllc10sIFt0cF93ZXJyb3I9bm9dKQorCisgIGZvciB0cF9mbGFnIGluICQ0OyBkbworICAgIFRQX0NPTVBJTEVSX0ZMQUcoWy1Xbm8tJHRwX2ZsYWddLAorICAgICAgW3RwX3dhcm5pbmdzPSIkdHBfd2FybmluZ3MgLVduby0kdHBfZmxhZyJdKQorZG5sIFllcywgd2UgZG8gbmVlZCB0byB1c2UgYm90aCAtV25vLWZvbyBhbmQgLVduby1lcnJvcj1mb28uIFNpbW9uIHNheXM6CitkbmwgICAgIHNvbWUgd2FybmluZ3Mgd2UgZXhwbGljaXRseSBkb24ndCB3YW50LCBsaWtlIHVudXNlZC1wYXJhbWV0ZXIsIGJ1dAorZG5sICAgICB0aGV5J3JlIGluIC1XYWxsLiB3aGVuIGEgZGlzdHJvIHVzaW5nIGNkYnMgY29tcGlsZXMgdXMsIHdlIGhhdmU6CitkbmwgICAgICAgLVdlcnJvciAtV25vLXVudXNlZC1wYXJhbWV0ZXIgICAgICAtV2FsbAorZG5sICAgICAgICAgXiBmcm9tIHVzICAgICAgICAgICAgICAgICAgICAgICAgIF4gZnJvbSBjZGJzCitkbmwgICAgIHdoaWNoIHR1cm5zIC1XdW51c2VkLXBhcmFtZXRlciBiYWNrIG9uLCBpbiBlZmZlY3QKKyAgICBUUF9DT01QSUxFUl9GTEFHKFstV25vLWVycm9yPSR0cF9mbGFnXSwKKyAgICAgIFt0cF9lcnJvcl9mbGFncz0iJHRwX2Vycm9yX2ZsYWdzIC1Xbm8tZXJyb3I9JHRwX2ZsYWciXSwgW3RwX3dlcnJvcj1ub10pCisgIGRvbmUKKworICBBQ19BUkdfRU5BQkxFKFtXZXJyb3JdLAorICAgIEFDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtV2Vycm9yXSwKKyAgICAgIFtjb21waWxlIHdpdGhvdXQgLVdlcnJvciAobm9ybWFsbHkgZW5hYmxlZCBpbiBkZXZlbG9wbWVudCBidWlsZHMpXSksCisgICAgdHBfd2Vycm9yPSRlbmFibGV2YWwsIDopCisKKyAgaWYgdGVzdCAieCR0cF93ZXJyb3IiID0geHllcyAmJiAkMjsgdGhlbgorZG5sIFdlIHB1dCAtV25vLWVycm9yPWZvbyBiZWZvcmUgLVduby1mb28gYmVjYXVzZSBjbGFuZyBpbnRlcnByZXRzIC1XYWxsCitkbmwgLVdlcnJvciAtV25vLWZvbyAtV25vLWVycm9yPWZvbyBhcyDigJxtYWtlIGZvbyBhIG5vbi1mYXRhbCB3YXJuaW5n4oCdLCBidXQgZG9lcworZG5sIHdoYXQgd2Ugd2FudCBpZiB5b3UgcmV2ZXJzZSB0aGVtLgorICAgICQxPSIkdHBfZXJyb3JfZmxhZ3MgJHRwX3dhcm5pbmdzIgorICBlbHNlCisgICAgJDE9IiR0cF93YXJuaW5ncyIKKyAgZmkKKworXSkKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9NYWtlZmlsZS5hbSBiL2RidXMvdGVzdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTQ0ODk5Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzI3IEBACisjIyB0aGUgIm5hbWUtdGVzdCIgc3ViZGlyIGluIGZhY3QgY29udGFpbnMgYSBidW5jaCBvZiB0ZXN0cyBub3cgdGhhdCBuZWVkIGEgdGVtcG9yYXJ5IGJ1cyAKKyMjIHRvIGJlIHJ1bm5pbmcgdG8gZG8gc3R1ZmYgd2l0aC4gVGhlIGRpcmVjdG9yeSBzaG91bGQgYmUgcmVuYW1lZC4KKyMjIFdlIHdhbnQgdG8gYnVpbGQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGZpcnN0IHRvIHBpY2sgdXAgdGhlIHRlc3R1dGlscyBsaWIKK1NVQkRJUlM9IC4gbmFtZS10ZXN0IAorRElTVF9TVUJESVJTPW5hbWUtdGVzdAorCisjIENQUEZMQUdTIGZvciBiaW5hcmllcyB0aGF0IGFyZSBub3JtYWxseSBkeW5hbWljCitBTV9DUFBGTEFHUyA9IFwKKwktSSQodG9wX3NyY2RpcikgXAorCSQoREJVU19TVEFUSUNfQlVJTERfQ1BQRkxBR1MpIFwKKwkkKEdMSUJfQ0ZMQUdTKSBcCisJJChEQlVTX0dMSUJfQ0ZMQUdTKSBcCisJJChOVUxMKQorCisjIGltcHJvdmUgYmFja3RyYWNlcyBmcm9tIHRlc3Qgc3R1ZmYKK0FNX0xERkxBR1MgPSBAUl9EWU5BTUlDX0xERkxBR0AKKworIyBDUFBGTEFHUyBmb3IgYmluYXJpZXMgdGhhdCBhcmUgYWx3YXlzIHN0YXRpYworc3RhdGljX2NwcGZsYWdzID0gXAorCSQoQU1fQ1BQRkxBR1MpIFwKKwktRERCVVNfU1RBVElDX0JVSUxEIFwKKwkkKE5VTEwpCisKK2xpYmRidXNfdGVzdHV0aWxzX2xhX0NQUEZMQUdTID0gXAorCSQoc3RhdGljX2NwcGZsYWdzKQorbGliZGJ1c190ZXN0dXRpbHNfbGFfU09VUkNFUyA9IFwKKwl0ZXN0LXV0aWxzLmMgXAorCXRlc3QtdXRpbHMuaCBcCisJJChOVUxMKQorbGliZGJ1c190ZXN0dXRpbHNfbGFfTElCQUREID0gXAorCSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEgXAorCSQoTlVMTCkKKworbm9pbnN0X0xUTElCUkFSSUVTID0gbGliZGJ1cy10ZXN0dXRpbHMubGEKKworaWYgREJVU19CVUlMRF9URVNUUworIyMgYnJlYWstbG9hZGVyIHJlbW92ZWQgZm9yIG5vdworIyMgdGhlc2UgYmluYXJpZXMgYXJlIHVzZWQgaW4gdGVzdHMgYnV0IGFyZSBub3QgdGhlbXNlbHZlcyB0ZXN0cworVEVTVF9CSU5BUklFUyA9IFwKKwlzcGF3bi10ZXN0IFwKKwl0ZXN0LWV4aXQgXAorCXRlc3QtbmFtZXMgXAorCXRlc3Qtc2VnZmF1bHQgXAorCXRlc3Qtc2VydmljZSBcCisJdGVzdC1zaGVsbC1zZXJ2aWNlIFwKKwl0ZXN0LXNsZWVwLWZvcmV2ZXIgXAorCSQoTlVMTCkKKworIyMgVGhlc2UgYXJlIGNvbmNlcHR1YWxseSBwYXJ0IG9mIGRpcmVjdG9yaWVzIHRoYXQgY29tZSBlYXJsaWVyIGluIFNVQkRJUlMKKyMjIG9yZGVyLCBidXQgd2UgZG9uJ3Qgd2FudCB0byBydW4gdGhlbSB0aWwgd2UgYXJyaXZlIGluIHRoaXMgZGlyZWN0b3J5LAorIyMgc2luY2UgdGhleSBkZXBlbmQgb24gc3R1ZmYgZnJvbSB0aGlzIGRpcmVjdG9yeQorVEVTVFMgPSBcCisJLi4vYnVzL2J1cy10ZXN0JChFWEVFWFQpIFwKKwkuLi9idXMvYnVzLXRlc3Qtc3lzdGVtJChFWEVFWFQpIFwKKwkuLi9kYnVzL2RidXMtdGVzdCQoRVhFRVhUKSBcCisJJChOVUxMKQorCitpZiBEQlVTX1VOSVgKK1RFU1RTICs9IC4uL2J1cy9idXMtdGVzdC1sYXVuY2gtaGVscGVyJChFWEVFWFQpCitlbmRpZgorCitlbHNlICFEQlVTX0JVSUxEX1RFU1RTCisKK1RFU1RfQklOQVJJRVM9CitURVNUUz0KKworZW5kaWYgIURCVVNfQlVJTERfVEVTVFMKKworbm9pbnN0X1BST0dSQU1TPSAkKFRFU1RfQklOQVJJRVMpCisKK3Rlc3Rfc2VydmljZV9DUFBGTEFHUyA9ICQoc3RhdGljX2NwcGZsYWdzKQordGVzdF9zZXJ2aWNlX0xEQUREID0gbGliZGJ1cy10ZXN0dXRpbHMubGEKK3Rlc3RfbmFtZXNfQ1BQRkxBR1MgPSAkKHN0YXRpY19jcHBmbGFncykKK3Rlc3RfbmFtZXNfTERBREQgPSBsaWJkYnVzLXRlc3R1dGlscy5sYQorIyMgYnJlYWtfbG9hZGVyX0NQUEZMQUdTID0gJChzdGF0aWNfY3BwZmxhZ3MpCisjIyBicmVha19sb2FkZXJfTERBREQgPSAkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhCit0ZXN0X3NoZWxsX3NlcnZpY2VfQ1BQRkxBR1MgPSAkKHN0YXRpY19jcHBmbGFncykKK3Rlc3Rfc2hlbGxfc2VydmljZV9MREFERCA9IGxpYmRidXMtdGVzdHV0aWxzLmxhCitzaGVsbF90ZXN0X0NQUEZMQUdTID0gJChzdGF0aWNfY3BwZmxhZ3MpCitzaGVsbF90ZXN0X0xEQUREID0gbGliZGJ1cy10ZXN0dXRpbHMubGEKK3NwYXduX3Rlc3RfQ1BQRkxBR1MgPSAkKHN0YXRpY19jcHBmbGFncykKK3NwYXduX3Rlc3RfTERBREQgPSAkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhCisKK3Rlc3RfcmVmc19TT1VSQ0VTID0gaW50ZXJuYWxzL3JlZnMuYwordGVzdF9yZWZzX0NQUEZMQUdTID0gJChzdGF0aWNfY3BwZmxhZ3MpCit0ZXN0X3JlZnNfTERBREQgPSBsaWJkYnVzLXRlc3R1dGlscy5sYSAkKEdMSUJfTElCUykKKwordGVzdF9zeXNsb2dfU09VUkNFUyA9IGludGVybmFscy9zeXNsb2cuYwordGVzdF9zeXNsb2dfQ1BQRkxBR1MgPSAkKHN0YXRpY19jcHBmbGFncykKK3Rlc3Rfc3lzbG9nX0xEQUREID0gbGliZGJ1cy10ZXN0dXRpbHMubGEgJChHTElCX0xJQlMpCisKK0VYVFJBX0RJU1QgPSBkYnVzLXRlc3QtcnVubmVyCisKK3Rlc3RleGVjZGlyID0gJChsaWJkaXIpL2RidXMtMS4wL3Rlc3QKKwordGVzdGV4ZWNfUFJPR1JBTVMgPQorCitpbnN0YWxsYWJsZV90ZXN0cyA9IFwKKwlzaGVsbC10ZXN0IFwKKwkkKE5VTEwpCisKK2lmIERCVVNfV0lUSF9HTElCCitpbnN0YWxsYWJsZV90ZXN0cyArPSBcCisJdGVzdC1jb3JydXB0IFwKKwl0ZXN0LWRidXMtZGFlbW9uIFwKKwl0ZXN0LWRidXMtZGFlbW9uLWVhdmVzZHJvcCBcCisJdGVzdC1sb29wYmFjayBcCisJdGVzdC1tYXJzaGFsIFwKKwl0ZXN0LXJlZnMgXAorCXRlc3QtcmVsYXkgXAorCXRlc3Qtc3ludGF4IFwKKwl0ZXN0LXN5c2xvZyBcCisJJChOVUxMKQorZW5kaWYgREJVU19XSVRIX0dMSUIKKworaW5zdGFsbGNoZWNrX3Rlc3RzID0KK2luc3RhbGxjaGVja19lbnZpcm9ubWVudCA9IFwKKwlEQlVTX1RFU1RfREFFTU9OPSQoREVTVERJUikkKERCVVNfREFFTU9ORElSKS9kYnVzLWRhZW1vbiQoRVhFRVhUKSBcCisJREJVU19URVNUX0hPTUVESVI9QGFic190b3BfYnVpbGRkaXJAL2RidXMgXAorCURCVVNfVEVTVF9TWVNDT05GRElSPSQoREVTVERJUikkKHN5c2NvbmZkaXIpCisKK1RFU1RTX0VOVklST05NRU5UID0gXAorCURCVVNfQkxPQ0tfT05fQUJPUlQ9MSBcCisJREJVU19GQVRBTF9XQVJOSU5HUz0xIFwKKwlEQlVTX1RFU1RfREFFTU9OPUBhYnNfdG9wX2J1aWxkZGlyQC9idXMvZGJ1cy1kYWVtb24kKEVYRUVYVCkgXAorCURCVVNfVEVTVF9EQVRBPUBhYnNfdG9wX2J1aWxkZGlyQC90ZXN0L2RhdGEgXAorCURCVVNfVEVTVF9IT01FRElSPUBhYnNfdG9wX2J1aWxkZGlyQC9kYnVzIFwKKwkkKE5VTEwpCisKK3Rlc3RfY29ycnVwdF9TT1VSQ0VTID0gY29ycnVwdC5jCit0ZXN0X2NvcnJ1cHRfTERBREQgPSAkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLTEubGEgXAorICAgICQoR0xJQl9MSUJTKSBcCisgICAgJChEQlVTX0dMSUJfTElCUykKKwordGVzdF9sb29wYmFja19TT1VSQ0VTID0gbG9vcGJhY2suYwordGVzdF9sb29wYmFja19MREFERCA9ICQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtMS5sYSBcCisgICAgJChHTElCX0xJQlMpIFwKKyAgICAkKERCVVNfR0xJQl9MSUJTKQorCit0ZXN0X3JlbGF5X1NPVVJDRVMgPSByZWxheS5jCit0ZXN0X3JlbGF5X0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy0xLmxhIFwKKyAgICAkKEdMSUJfTElCUykgXAorICAgICQoREJVU19HTElCX0xJQlMpCisKK3Rlc3RfZGJ1c19kYWVtb25fU09VUkNFUyA9IGRidXMtZGFlbW9uLmMKK3Rlc3RfZGJ1c19kYWVtb25fTERBREQgPSAkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLTEubGEgXAorICAgICQoR0xJQl9MSUJTKSBcCisgICAgJChEQlVTX0dMSUJfTElCUykKKwordGVzdF9kYnVzX2RhZW1vbl9lYXZlc2Ryb3BfU09VUkNFUyA9IGRidXMtZGFlbW9uLWVhdmVzZHJvcC5jCit0ZXN0X2RidXNfZGFlbW9uX2VhdmVzZHJvcF9DUFBGTEFHUyA9ICQoR0xJQl9DRkxBR1MpICQoREJVU19HTElCX0NGTEFHUykKK3Rlc3RfZGJ1c19kYWVtb25fZWF2ZXNkcm9wX0xERkxBR1MgPSBAUl9EWU5BTUlDX0xERkxBR0AKK3Rlc3RfZGJ1c19kYWVtb25fZWF2ZXNkcm9wX0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy0xLmxhIFwKKyAgICAkKEdMSUJfTElCUykgXAorICAgICQoREJVU19HTElCX0xJQlMpCisKK3Rlc3RfbWFyc2hhbF9TT1VSQ0VTID0gbWFyc2hhbC5jCit0ZXN0X21hcnNoYWxfTERBREQgPSAkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLTEubGEgXAorICAgICQoR0xJQl9MSUJTKSBcCisgICAgJChEQlVTX0dMSUJfTElCUykKKwordGVzdF9zeW50YXhfU09VUkNFUyA9IHN5bnRheC5jCit0ZXN0X3N5bnRheF9MREFERCA9ICQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtMS5sYSBcCisgICAgJChHTElCX0xJQlMpCisKK2lmIERCVVNfRU5BQkxFX01PRFVMQVJfVEVTVFMKK1RFU1RTICs9ICQoaW5zdGFsbGFibGVfdGVzdHMpCitpbnN0YWxsY2hlY2tfdGVzdHMgKz0gJChpbnN0YWxsYWJsZV90ZXN0cykKKworaWYgREJVU19FTkFCTEVfSU5TVEFMTEVEX1RFU1RTCisgIHRlc3RleGVjX1BST0dSQU1TICs9ICQoaW5zdGFsbGFibGVfdGVzdHMpCitlbHNlICFEQlVTX0VOQUJMRV9JTlNUQUxMRURfVEVTVFMKKyAgbm9pbnN0X1BST0dSQU1TICs9ICQoaW5zdGFsbGFibGVfdGVzdHMpCitlbmRpZiAhREJVU19FTkFCTEVfSU5TVEFMTEVEX1RFU1RTCisKK2VuZGlmIERCVVNfRU5BQkxFX01PRFVMQVJfVEVTVFMKKworIyBJZiB3ZSdyZSBpbnN0YWxsaW5nIHRoZSB0ZXN0cyBpbnRvIGEgREVTVERJUiB3ZSBjYW4ndCBydW4gdGhlbQorIyBhZ2FpbiB1c2luZyB0aGUgaW5zdGFsbGVkIGNvcHksIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBob3cgdG8KKyMgZG8gYSBwb3J0YWJsZSBlcXVpdmFsZW50IG9mIHNldHRpbmcgTERfTElCUkFSWV9QQVRILgoraW5zdGFsbGNoZWNrLWxvY2FsOgorCSQoTUFLRSkgY2hlY2stVEVTVFMgVEVTVFM9JyQkKGluc3RhbGxjaGVja190ZXN0cyknIFwKKwkJVEVTVFNfRU5WSVJPTk1FTlQ9JyQkKGluc3RhbGxjaGVja19lbnZpcm9ubWVudCknCitpZiBEQlVTX0VOQUJMRV9JTlNUQUxMRURfVEVTVFMKKwl0ZXN0IC1uICIkKERFU1RESVIpIiB8fCBcCisJJChpbnN0YWxsY2hlY2tfZW52aXJvbm1lbnQpIFwKKwkJJChzcmNkaXIpL2RidXMtdGVzdC1ydW5uZXIgXAorCQkkKHRlc3RleGVjZGlyKSBcCisJCSQodGVzdGV4ZWNfUFJPR1JBTVMpCitlbmRpZiBEQlVTX0VOQUJMRV9JTlNUQUxMRURfVEVTVFMKKworaW5fZGF0YSA9IFwKKwlkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vZGVidWctYWxsb3ctYWxsLWZhaWwuY29uZi5pbiBcCisJZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtL2RlYnVnLWFsbG93LWFsbC1wYXNzLmNvbmYuaW4gXAorCWRhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2RlYnVnLWFsbG93LWFsbC1zaGExLmNvbmYuaW4gXAorCWRhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2RlYnVnLWFsbG93LWFsbC5jb25mLmluIFwKKwlkYXRhL2ludmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlTm9FeGVjLnNlcnZpY2UuaW4gXAorCWRhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb1NlcnZpY2Uuc2VydmljZS5pbiBcCisJZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vVXNlci5zZXJ2aWNlLmluIFwKKwlkYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlLnNlcnZpY2UuaW4gXAorCWRhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2VnZmF1bHRTZXJ2aWNlLnNlcnZpY2UuaW4gXAorCWRhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZUZhaWwuc2VydmljZS5pbiBcCisJZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlU3VjY2Vzcy5zZXJ2aWNlLmluIFwKKwlkYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlLlByaXZTZXJ2ZXIuc2VydmljZS5pbiBcCisJZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlLnNlcnZpY2UuaW4gXAorCWRhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVGb3JraW5nRWNob1NlcnZpY2Uuc2VydmljZS5pbiBcCisJZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNlZ2ZhdWx0U2VydmljZS5zZXJ2aWNlLmluIFwKKwlkYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZUZhaWwuc2VydmljZS5pbiBcCisJZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VTdWNjZXNzLnNlcnZpY2UuaW4gXAorCSQoTlVMTCkKKworRVhUUkFfRElTVCArPSAkKGluX2RhdGEpCisKK3N0YXRpY19kYXRhID0gXAorCW5hbWUtdGVzdC90bXAtc2Vzc2lvbi1saWtlLXN5c3RlbS5jb25mIFwKKwlkYXRhL2F1dGgvYW5vbnltb3VzLWNsaWVudC1zdWNjZXNzZnVsLmF1dGgtc2NyaXB0IFwKKwlkYXRhL2F1dGgvYW5vbnltb3VzLXNlcnZlci1zdWNjZXNzZnVsLmF1dGgtc2NyaXB0IFwKKwlkYXRhL2F1dGgvY2FuY2VsLmF1dGgtc2NyaXB0IFwKKwlkYXRhL2F1dGgvY2xpZW50LW91dC1vZi1tZWNoYW5pc21zLmF1dGgtc2NyaXB0IFwKKwlkYXRhL2F1dGgvZXh0ZXJuYWwtZmFpbGVkLmF1dGgtc2NyaXB0IFwKKwlkYXRhL2F1dGgvZXh0ZXJuYWwtcm9vdC5hdXRoLXNjcmlwdCBcCisJZGF0YS9hdXRoL2V4dGVybmFsLXNpbGx5LmF1dGgtc2NyaXB0IFwKKwlkYXRhL2F1dGgvZXh0ZXJuYWwtc3VjY2Vzc2Z1bC5hdXRoLXNjcmlwdCBcCisJZGF0YS9hdXRoL2V4dHJhLWJ5dGVzLmF1dGgtc2NyaXB0IFwKKwlkYXRhL2F1dGgvZmFpbC1hZnRlci1uLWF0dGVtcHRzLmF1dGgtc2NyaXB0IFwKKwlkYXRhL2F1dGgvZmFsbGJhY2suYXV0aC1zY3JpcHQgXAorCWRhdGEvYXV0aC9pbnZhbGlkLWNvbW1hbmQtY2xpZW50LmF1dGgtc2NyaXB0IFwKKwlkYXRhL2F1dGgvaW52YWxpZC1jb21tYW5kLmF1dGgtc2NyaXB0IFwKKwlkYXRhL2F1dGgvaW52YWxpZC1oZXgtZW5jb2RpbmcuYXV0aC1zY3JpcHQgXAorCWRhdGEvYXV0aC9tZWNoYW5pc21zLmF1dGgtc2NyaXB0IFwKKwlkYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9iYXNpYy9iYXNpYy0xLmNvbmYgXAorCWRhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2Jhc2ljL2Jhc2ljLTIuY29uZiBcCisJZGF0YS9lcXVpdi1jb25maWctZmlsZXMvYmFzaWMvYmFzaWMuZC9iYXNpYy5jb25mIFwKKwlkYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9lbnRpdGllcy9iYXNpYy5kL2Jhc2ljLmNvbmYgXAorCWRhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2VudGl0aWVzL2VudGl0aWVzLTEuY29uZiBcCisJZGF0YS9lcXVpdi1jb25maWctZmlsZXMvZW50aXRpZXMvZW50aXRpZXMtMi5jb25mIFwKKwlkYXRhL2luY29tcGxldGUtbWVzc2FnZXMvbWlzc2luZy1ib2R5Lm1lc3NhZ2UgXAorCWRhdGEvaW52YWxpZC1jb25maWctZmlsZXMvYmFkc2VsaW51eC0xLmNvbmYgXAorCWRhdGEvaW52YWxpZC1jb25maWctZmlsZXMvYmFkc2VsaW51eC0yLmNvbmYgXAorCWRhdGEvaW52YWxpZC1jb25maWctZmlsZXMvY2lyY3VsYXItMS5jb25mIFwKKwlkYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL2NpcmN1bGFyLTIuY29uZiBcCisJZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9jaXJjdWxhci0zLmNvbmYgXAorCWRhdGEvaW52YWxpZC1jb25maWctZmlsZXMvbm90LXdlbGwtZm9ybWVkLmNvbmYgXAorCWRhdGEvaW52YWxpZC1jb25maWctZmlsZXMvdHJ1bmNhdGVkLWZpbGUuY29uZiBcCisJZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2FycmF5LW9mLW5pbC5tZXNzYWdlIFwKKwlkYXRhL2ludmFsaWQtbWVzc2FnZXMvYXJyYXktd2l0aC1taXhlZC10eXBlcy5tZXNzYWdlIFwKKwlkYXRhL2ludmFsaWQtbWVzc2FnZXMvYmFkLWJvb2xlYW4tYXJyYXkubWVzc2FnZSBcCisJZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1ib29sZWFuLm1lc3NhZ2UgXAorCWRhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtZW5kaWFuLm1lc3NhZ2UgXAorCWRhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtaGVhZGVyLWZpZWxkLWFsaWdubWVudC5tZXNzYWdlIFwKKwlkYXRhL2ludmFsaWQtbWVzc2FnZXMvYm9vbGVhbi1oYXMtbm8tdmFsdWUubWVzc2FnZS1yYXcgXAorCWRhdGEvaW52YWxpZC1tZXNzYWdlcy9sb2NhbC1uYW1lc3BhY2UubWVzc2FnZSBcCisJZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL25vLWRvdC1pbi1uYW1lLm1lc3NhZ2UgXAorCWRhdGEvaW52YWxpZC1tZXNzYWdlcy9ub3QtbnVsLWhlYWRlci1wYWRkaW5nLm1lc3NhZ2UgXAorCWRhdGEvaW52YWxpZC1tZXNzYWdlcy9vdmVybG9uZy1uYW1lLm1lc3NhZ2UgXAorCWRhdGEvaW52YWxpZC1tZXNzYWdlcy90b28tbGl0dGxlLWhlYWRlci1wYWRkaW5nLm1lc3NhZ2UgXAorCWRhdGEvaW52YWxpZC1tZXNzYWdlcy90b28tbXVjaC1oZWFkZXItcGFkZGluZy1ieS1mYXIubWVzc2FnZSBcCisJZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL3Rvby1tdWNoLWhlYWRlci1wYWRkaW5nLm1lc3NhZ2UgXAorCWRhdGEvaW52YWxpZC1tZXNzYWdlcy90b28tc2hvcnQtZGljdC5tZXNzYWdlIFwKKwlkYXRhL3NoYS0xL1JlYWRtZS50eHQgXAorCWRhdGEvc2hhLTEvYml0LWhhc2hlcy5zaGExIFwKKwlkYXRhL3NoYS0xL2JpdC1tZXNzYWdlcy5zaGExIFwKKwlkYXRhL3NoYS0xL2J5dGUtaGFzaGVzLnNoYTEgXAorCWRhdGEvc2hhLTEvYnl0ZS1tZXNzYWdlcy5zaGExIFwKKwlkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9iYXNpYy5jb25mIFwKKwlkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9iYXNpYy5kL2Jhc2ljLmNvbmYgXAorCWRhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2VudGl0aWVzLmNvbmYgXAorCWRhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2luY29taW5nLWxpbWl0LmNvbmYgXAorCWRhdGEvdmFsaWQtY29uZmlnLWZpbGVzL21hbnktcnVsZXMuY29uZiBcCisJZGF0YS92YWxpZC1jb25maWctZmlsZXMvc3lzdGVtLmQvdGVzdC5jb25mIFwKKwlkYXRhL3ZhbGlkLW1lc3NhZ2VzL2FycmF5LW9mLWFycmF5LW9mLXVpbnQzMi5tZXNzYWdlIFwKKwlkYXRhL3ZhbGlkLW1lc3NhZ2VzL2RpY3Qtc2ltcGxlLm1lc3NhZ2UgXAorCWRhdGEvdmFsaWQtbWVzc2FnZXMvZGljdC5tZXNzYWdlIFwKKwlkYXRhL3ZhbGlkLW1lc3NhZ2VzL2VtcHRpbmVzcy5tZXNzYWdlIFwKKwlkYXRhL3ZhbGlkLW1lc3NhZ2VzL2xvdHMtb2YtYXJndW1lbnRzLm1lc3NhZ2UgXAorCWRhdGEvdmFsaWQtbWVzc2FnZXMvbm8tcGFkZGluZy5tZXNzYWdlIFwKKwlkYXRhL3ZhbGlkLW1lc3NhZ2VzL29wcG9zaXRlLWVuZGlhbi5tZXNzYWdlIFwKKwlkYXRhL3ZhbGlkLW1lc3NhZ2VzL3JlY3Vyc2l2ZS10eXBlcy5tZXNzYWdlIFwKKwlkYXRhL3ZhbGlkLW1lc3NhZ2VzL3NpbXBsZXN0LW1hbnVhbC5tZXNzYWdlIFwKKwlkYXRhL3ZhbGlkLW1lc3NhZ2VzL3NpbXBsZXN0Lm1lc3NhZ2UgXAorCWRhdGEvdmFsaWQtbWVzc2FnZXMvc3RhbmRhcmQtYWNxdWlyZS1zZXJ2aWNlLm1lc3NhZ2UgXAorCWRhdGEvdmFsaWQtbWVzc2FnZXMvc3RhbmRhcmQtaGVsbG8ubWVzc2FnZSBcCisJZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC1saXN0LXNlcnZpY2VzLm1lc3NhZ2UgXAorCWRhdGEvdmFsaWQtbWVzc2FnZXMvc3RhbmRhcmQtc2VydmljZS1leGlzdHMubWVzc2FnZSBcCisJZGF0YS92YWxpZC1tZXNzYWdlcy91bmtub3duLWhlYWRlci1maWVsZC5tZXNzYWdlIFwKKwkkKE5VTEwpCisKK0VYVFJBX0RJU1QgKz0gJChzdGF0aWNfZGF0YSkKKworIyMgY29weSB0ZXN0cyB0byBidWlsZGRpciBzbyB0aGF0IGdlbmVyYXRlZCB0ZXN0cyBhbmQgc3RhdGljIHRlc3RzCisjIyBhcmUgYWxsIGluIG9uZSBwbGFjZS4KK2FsbC1sb2NhbDoKKwkkKEFNX1ZfYXQpJChNS0RJUl9QKSBkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9zZXNzaW9uLmQKKwkkKEFNX1ZfYXQpc2V0IC1lICYmIFwKKwlpZiB0ZXN0ICQoc3JjZGlyKSA9IC4gfHwgdGVzdCAkKHNyY2RpcikgLWVmIC47IHRoZW4gXAorCQllY2hvICctLSBObyBuZWVkIHRvIGNvcHkgdGVzdCBkYXRhIGFzIHNyY2RpciA9IGJ1aWxkZGlyJzsgXAorCWVsc2UgXAorCQlmb3IgRiBpbiAkKHN0YXRpY19kYXRhKTsgZG8gXAorCQkJJChNS0RJUl9QKSAkJHtGJS8qfTsgXAorCQkJcm0gLWYgJCRGOyBcCisJCQljcCAkKHNyY2RpcikvJCRGICQkRjsgXAorCQlkb25lOyBcCisJZmkKKworIyMgdGhpcyBkb2Vzbid0IGNsZWFuIG1vc3QgY29waWVkIHRlc3QgZGF0YSBmaWxlcyB3aGVuIHNyY2Rpcj1idWlsZGRpcgorY2xlYW4tbG9jYWw6CisJJChBTV9WX2F0KWlmIHRlc3QgJChzcmNkaXIpID0gLiB8fCB0ZXN0ICQoc3JjZGlyKSAtZWYgLjsgdGhlbiBcCisJCWVjaG8gJy0tIE5vIG5lZWQgdG8gY2xlYW4gdGVzdCBkYXRhIGFzIHNyY2RpciA9IGJ1aWxkZGlyJzsgXAorCWVsc2UgXAorCQlybSAtZiAkKHN0YXRpY19kYXRhKTsgXAorCWZpCisKK2ltcG9ydGVkX2RhdGEgPSBcCisJZGF0YS92YWxpZC1jb25maWctZmlsZXMvc2Vzc2lvbi5jb25mIFwKKwlkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9zeXN0ZW0uY29uZiBcCisJJChOVUxMKQorCitub2luc3RfREFUQSA9ICQoaW1wb3J0ZWRfZGF0YSkKK0NMRUFORklMRVMgPSAkKG5vaW5zdF9EQVRBKQorCitkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9zZXNzaW9uLmNvbmY6ICQodG9wX2J1aWxkZGlyKS9idXMvc2Vzc2lvbi5jb25mCisJJChBTV9WX2F0KSQoTUtESVJfUCkgZGF0YS92YWxpZC1jb25maWctZmlsZXMKKwkkKEFNX1ZfR0VOKWNwICQ8ICRACisKK2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL3N5c3RlbS5jb25mOiAkKHRvcF9idWlsZGRpcikvYnVzL3N5c3RlbS5jb25mCisJJChBTV9WX2F0KSQoTUtESVJfUCkgZGF0YS92YWxpZC1jb25maWctZmlsZXMKKwkkKEFNX1ZfR0VOKWNwICQ8ICRACmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvYnJlYWstbG9hZGVyLmMgYi9kYnVzL3Rlc3QvYnJlYWstbG9hZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYyYjhjMgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9icmVhay1sb2FkZXIuYwpAQCAtMCwwICsxLDc2NCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWJyZWFrLWxvYWRlci5jICBQcm9ncmFtIHRvIGZpbmQgYnl0ZSBzdHJlYW1zIHRoYXQgYnJlYWsgdGhlIG1lc3NhZ2UgbG9hZGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgREJVU19DT01QSUxBVElPTiAKKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10ZXN0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hcnNoYWwtYmFzaWMuaD4KKyN1bmRlZiBEQlVTX0NPTVBJTEFUSU9OCisKK3N0YXRpYyBEQnVzU3RyaW5nIGZhaWx1cmVfZGlyOworc3RhdGljIGludCB0b3RhbF9hdHRlbXB0czsKK3N0YXRpYyBpbnQgZmFpbHVyZXNfdGhpc19pdGVyYXRpb247CisKK3N0YXRpYyBpbnQKK3JhbmRvbV9pbnRfaW5fcmFuZ2UgKGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBlbmQpCit7CisgIC8qIHN1Y2ggZWxlZ2FudCBtYXRoICovCisgIGRvdWJsZSBnYXA7CisgIGRvdWJsZSB2X2RvdWJsZTsKKyAgaW50IHY7CisKKyAgaWYgKHN0YXJ0ID09IGVuZCkKKyAgICByZXR1cm4gc3RhcnQ7CisKKyAgX2RidXNfYXNzZXJ0IChlbmQgPiBzdGFydCk7CisgIAorICBnYXAgPSBlbmQgLSBzdGFydCAtIDE7IC8qIC0xIHRvIG5vdCBpbmNsdWRlICJlbmQiICovCisgIHZfZG91YmxlID0gKChkb3VibGUpc3RhcnQpICsgKCgoZG91YmxlKXJhbmQgKCkpL1JBTkRfTUFYKSAqIGdhcDsKKyAgaWYgKHZfZG91YmxlIDwgMC4wKQorICAgIHYgPSAodl9kb3VibGUgLSAwLjUpOworICBlbHNlCisgICAgdiA9ICh2X2RvdWJsZSArIDAuNSk7CisgIAorICBpZiAodiA8IHN0YXJ0KQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgInJhbmRvbV9pbnRfaW5fcmFuZ2UoKSBnZW5lcmF0ZWQgJWQgZm9yIHJhbmdlIFslZCwlZClcbiIsCisgICAgICAgICAgICAgICB2LCBzdGFydCwgZW5kKTsKKyAgICAgIHYgPSBzdGFydDsKKyAgICB9CisgIGVsc2UgaWYgKHYgPj0gZW5kKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgInJhbmRvbV9pbnRfaW5fcmFuZ2UoKSBnZW5lcmF0ZWQgJWQgZm9yIHJhbmdlIFslZCwlZClcbiIsCisgICAgICAgICAgICAgICB2LCBzdGFydCwgZW5kKTsKKyAgICAgIHYgPSBlbmQgLSAxOworICAgIH0KKworICAvKiBwcmludGYgKCIgICVkIG9mIFslZCwlZClcbiIsIHYsIHN0YXJ0LCBlbmQpOyAqLworICAKKyAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAordHJ5X211dGF0ZWRfZGF0YSAoY29uc3QgREJ1c1N0cmluZyAqZGF0YSkKK3sKKyAgaW50IHBpZDsKKworICB0b3RhbF9hdHRlbXB0cyArPSAxOworICAvKiBwcmludGYgKCIgIGF0dGVtcHQgJWRcbiIsIHRvdGFsX2F0dGVtcHRzKTsgKi8KKyAgCisgIHBpZCA9IGZvcmsgKCk7CisKKyAgaWYgKHBpZCA8IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZm9yaygpIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGV4aXQgKDEpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAocGlkID09IDApCisgICAgeworICAgICAgLyogQ2hpbGQsIHRyeSBsb2FkaW5nIHRoZSBkYXRhICovCisgICAgICBpZiAoIWRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV90cnlfbWVzc2FnZV9kYXRhIChkYXRhLCBfREJVU19NRVNTQUdFX1VOS05PV04pKQorICAgICAgICBleGl0ICgxKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZXhpdCAoMCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogUGFyZW50LCB3YWl0IGZvciBjaGlsZCAqLworICAgICAgaW50IHN0YXR1czsKKyAgICAgIERCdXNTdHJpbmcgZmlsZW5hbWU7CisgICAgICBkYnVzX2Jvb2xfdCBmYWlsZWQ7CisKKyAgICAgIGlmICh3YWl0cGlkIChwaWQsICZzdGF0dXMsIDApIDwgMCkKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIndhaXRwaWQoKSBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgZmFpbGVkID0gRkFMU0U7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmaWxlbmFtZSkgfHwKKyAgICAgICAgICAhX2RidXNfc3RyaW5nX2NvcHkgKCZmYWlsdXJlX2RpciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlbmFtZSwgMCkgfHwKKyAgICAgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmZmlsZW5hbWUsICcvJykpCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJvdXQgb2YgbWVtb3J5XG4iKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kX2ludCAoJmZpbGVuYW1lLCB0b3RhbF9hdHRlbXB0cyk7CisKKyAgICAgIGlmIChXSUZFWElURUQgKHN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoV0VYSVRTVEFUVVMgKHN0YXR1cykgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZCAoJmZpbGVuYW1lLCAiLWV4aXRlZC0iKTsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZF9pbnQgKCZmaWxlbmFtZSwgV0VYSVRTVEFUVVMgKHN0YXR1cykpOworICAgICAgICAgICAgICBmYWlsZWQgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChXSUZTSUdOQUxFRCAoc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19hcHBlbmQgKCZmaWxlbmFtZSwgInNpZ25hbGVkLSIpOworICAgICAgICAgIF9kYnVzX3N0cmluZ19hcHBlbmRfaW50ICgmZmlsZW5hbWUsIFdURVJNU0lHIChzdGF0dXMpKTsKKyAgICAgICAgICBmYWlsZWQgPSBUUlVFOworICAgICAgICB9CisKKyAgICAgIGlmIChmYWlsZWQpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kICgmZmlsZW5hbWUsICIubWVzc2FnZS1yYXciKTsKKyAgICAgICAgICAKKyAgICAgICAgICBwcmludGYgKCJDaGlsZCBmYWlsZWQsIHdyaXRpbmcgJXNcbiIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVuYW1lKSk7CisKKyAgICAgICAgICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfc2F2ZV90b19maWxlIChkYXRhLCAmZmlsZW5hbWUsIEZBTFNFLCAmZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJGYWlsZWQgdG8gc2F2ZSBmYWlsZWQgbWVzc2FnZSBkYXRhOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgZXhpdCAoMSk7IC8qIHNvIHdlIGNhbiBzZWUgdGhlIHNlZWQgdGhhdCB3YXMgcHJpbnRlZCBvdXQgKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGZhaWx1cmVzX3RoaXNfaXRlcmF0aW9uICs9IDE7CisKKwkgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworCSAgCisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlCisJeworCSAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CSAgCisJICByZXR1cm4gVFJVRTsKKwl9CisgICAgfQorCisgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNob3VsZCBub3QgYmUgcmVhY2hlZCIpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3JhbmRvbWx5X3Nob3J0ZW5fb3JfbGVuZ3RoZW4gKGNvbnN0IERCdXNTdHJpbmcgKm9yaWdfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKm11dGF0ZWQpCit7CisgIGludCBkZWx0YTsKKworICBpZiAob3JpZ19kYXRhICE9IG11dGF0ZWQpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKG11dGF0ZWQsIDApOworICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5IChvcmlnX2RhdGEsIDAsIG11dGF0ZWQsIDApKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvdXQgb2YgbWVtIik7CisgICAgfQorCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAobXV0YXRlZCkgPT0gMCkKKyAgICBkZWx0YSA9IHJhbmRvbV9pbnRfaW5fcmFuZ2UgKDAsIDEwKTsKKyAgZWxzZQorICAgIGRlbHRhID0gcmFuZG9tX2ludF9pbl9yYW5nZSAoLSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAobXV0YXRlZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAobXV0YXRlZCkgKiAzKTsKKyAgCisgIGlmIChkZWx0YSA8IDApCisgICAgX2RidXNfc3RyaW5nX3Nob3J0ZW4gKG11dGF0ZWQsIC0gZGVsdGEpOworICBlbHNlIGlmIChkZWx0YSA+IDApCisgICAgeworICAgICAgaW50IGkgPSAwOworCisgICAgICBpID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKG11dGF0ZWQpOworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfbGVuZ3RoZW4gKG11dGF0ZWQsIGRlbHRhKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgbGVuZ3RoZW4gc3RyaW5nIik7CisKKyAgICAgIHdoaWxlIChpIDwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKG11dGF0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChtdXRhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9pbnRfaW5fcmFuZ2UgKDAsIDI1NikpOworICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK3JhbmRvbWx5X2NoYW5nZV9vbmVfYnl0ZSAoY29uc3QgREJ1c1N0cmluZyAqb3JpZ19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICptdXRhdGVkKQoreworICBpbnQgaTsKKworICBpZiAob3JpZ19kYXRhICE9IG11dGF0ZWQpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKG11dGF0ZWQsIDApOworICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5IChvcmlnX2RhdGEsIDAsIG11dGF0ZWQsIDApKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvdXQgb2YgbWVtIik7CisgICAgfQorCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAobXV0YXRlZCkgPT0gMCkKKyAgICByZXR1cm47CisgIAorICBpID0gcmFuZG9tX2ludF9pbl9yYW5nZSAoMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKG11dGF0ZWQpKTsKKworICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKG11dGF0ZWQsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2ludF9pbl9yYW5nZSAoMCwgMjU2KSk7Cit9CisKK3N0YXRpYyB2b2lkCityYW5kb21seV9yZW1vdmVfb25lX2J5dGUgKGNvbnN0IERCdXNTdHJpbmcgKm9yaWdfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqbXV0YXRlZCkKK3sKKyAgaW50IGk7CisKKyAgaWYgKG9yaWdfZGF0YSAhPSBtdXRhdGVkKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChtdXRhdGVkLCAwKTsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAob3JpZ19kYXRhLCAwLCBtdXRhdGVkLCAwKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib3V0IG9mIG1lbSIpOworICAgIH0KKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKG11dGF0ZWQpID09IDApCisgICAgcmV0dXJuOworICAKKyAgaSA9IHJhbmRvbV9pbnRfaW5fcmFuZ2UgKDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChtdXRhdGVkKSk7CisKKyAgX2RidXNfc3RyaW5nX2RlbGV0ZSAobXV0YXRlZCwgaSwgMSk7Cit9CisKKworc3RhdGljIHZvaWQKK3JhbmRvbWx5X2FkZF9vbmVfYnl0ZSAoY29uc3QgREJ1c1N0cmluZyAqb3JpZ19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICptdXRhdGVkKQoreworICBpbnQgaTsKKworICBpZiAob3JpZ19kYXRhICE9IG11dGF0ZWQpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKG11dGF0ZWQsIDApOworICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5IChvcmlnX2RhdGEsIDAsIG11dGF0ZWQsIDApKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvdXQgb2YgbWVtIik7CisgICAgfQorCisgIGkgPSByYW5kb21faW50X2luX3JhbmdlICgwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAobXV0YXRlZCkpOworCisgIF9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZXMgKG11dGF0ZWQsIGksIDEsCisJCQkgICAgIHJhbmRvbV9pbnRfaW5fcmFuZ2UgKDAsIDI1NikpOworfQorCitzdGF0aWMgdm9pZAorcmFuZG9tbHlfbW9kaWZ5X2xlbmd0aCAoY29uc3QgREJ1c1N0cmluZyAqb3JpZ19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqbXV0YXRlZCkKK3sKKyAgaW50IGk7CisgIGludCBieXRlX29yZGVyOworICBjb25zdCBjaGFyICpkOworICBkYnVzX3VpbnQzMl90IG9yaWc7CisgIGludCBkZWx0YTsKKyAgCisgIGlmIChvcmlnX2RhdGEgIT0gbXV0YXRlZCkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAobXV0YXRlZCwgMCk7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKG9yaWdfZGF0YSwgMCwgbXV0YXRlZCwgMCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm91dCBvZiBtZW0iKTsKKyAgICB9CisKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChtdXRhdGVkKSA8IDEyKQorICAgIHJldHVybjsKKyAgCisgIGQgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKG11dGF0ZWQpOworCisgIGlmICghKCpkID09IERCVVNfTElUVExFX0VORElBTiB8fAorICAgICAgICAqZCA9PSBEQlVTX0JJR19FTkRJQU4pKQorICAgIHJldHVybjsKKworICBieXRlX29yZGVyID0gKmQ7CisgIAorICBpID0gcmFuZG9tX2ludF9pbl9yYW5nZSAoNCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKG11dGF0ZWQpIC0gOCk7CisgIGkgPSBfREJVU19BTElHTl9WQUxVRSAoaSwgNCk7CisKKyAgb3JpZyA9IF9kYnVzX2RlbWFyc2hhbF91aW50MzIgKG11dGF0ZWQsIGJ5dGVfb3JkZXIsIGksIE5VTEwpOworCisgIGRlbHRhID0gcmFuZG9tX2ludF9pbl9yYW5nZSAoLTEwLCAxMCk7ICAKKyAgCisgIF9kYnVzX21hcnNoYWxfc2V0X3VpbnQzMiAobXV0YXRlZCwgYnl0ZV9vcmRlciwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpIChvcmlnICsgZGVsdGEpKTsKK30KKworc3RhdGljIHZvaWQKK3JhbmRvbWx5X3NldF9leHRyZW1lX2ludHMgKGNvbnN0IERCdXNTdHJpbmcgKm9yaWdfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKm11dGF0ZWQpCit7CisgIGludCBpOworICBpbnQgYnl0ZV9vcmRlcjsKKyAgY29uc3QgY2hhciAqZDsKKyAgZGJ1c191aW50MzJfdCBvcmlnOworICBzdGF0aWMgaW50IHdoaWNoID0gMDsKKyAgdW5zaWduZWQgaW50IGV4dHJlbWVfaW50c1tdID0geworICAgIF9EQlVTX0lOVF9NQVgsCisgICAgX0RCVVNfVUlOVF9NQVgsCisgICAgX0RCVVNfSU5UX01BWCAtIDEsCisgICAgX0RCVVNfVUlOVF9NQVggLSAxLAorICAgIF9EQlVTX0lOVF9NQVggLSAyLAorICAgIF9EQlVTX1VJTlRfTUFYIC0gMiwKKyAgICBfREJVU19JTlRfTUFYIC0gMTcsCisgICAgX0RCVVNfVUlOVF9NQVggLSAxNywKKyAgICBfREJVU19JTlRfTUFYIC8gMiwKKyAgICBfREJVU19JTlRfTUFYIC8gMywKKyAgICBfREJVU19VSU5UX01BWCAvIDIsCisgICAgX0RCVVNfVUlOVF9NQVggLyAzLAorICAgIDAsIDEsIDIsIDMsCisgICAgKHVuc2lnbmVkIGludCkgLTEsCisgICAgKHVuc2lnbmVkIGludCkgLTIsCisgICAgKHVuc2lnbmVkIGludCkgLTMKKyAgfTsKKyAgICAKKyAgaWYgKG9yaWdfZGF0YSAhPSBtdXRhdGVkKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChtdXRhdGVkLCAwKTsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAob3JpZ19kYXRhLCAwLCBtdXRhdGVkLCAwKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib3V0IG9mIG1lbSIpOworICAgIH0KKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKG11dGF0ZWQpIDwgMTIpCisgICAgcmV0dXJuOworICAKKyAgZCA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAobXV0YXRlZCk7CisKKyAgaWYgKCEoKmQgPT0gREJVU19MSVRUTEVfRU5ESUFOIHx8CisgICAgICAgICpkID09IERCVVNfQklHX0VORElBTikpCisgICAgcmV0dXJuOworCisgIGJ5dGVfb3JkZXIgPSAqZDsKKyAgCisgIGkgPSByYW5kb21faW50X2luX3JhbmdlICg0LCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAobXV0YXRlZCkgLSA4KTsKKyAgaSA9IF9EQlVTX0FMSUdOX1ZBTFVFIChpLCA0KTsKKworICBvcmlnID0gX2RidXNfZGVtYXJzaGFsX3VpbnQzMiAobXV0YXRlZCwgYnl0ZV9vcmRlciwgaSwgTlVMTCk7CisKKyAgd2hpY2ggPSByYW5kb21faW50X2luX3JhbmdlICgwLCBfREJVU19OX0VMRU1FTlRTIChleHRyZW1lX2ludHMpKTsKKworICBfZGJ1c19hc3NlcnQgKHdoaWNoID49IDApOworICBfZGJ1c19hc3NlcnQgKHdoaWNoIDwgX0RCVVNfTl9FTEVNRU5UUyAoZXh0cmVtZV9pbnRzKSk7CisgIAorICBfZGJ1c19tYXJzaGFsX3NldF91aW50MzIgKG11dGF0ZWQsIGJ5dGVfb3JkZXIsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmVtZV9pbnRzW3doaWNoXSk7Cit9CisKK3N0YXRpYyBpbnQKK3JhbmRvbV90eXBlICh2b2lkKQoreworICBjb25zdCBjaGFyIHR5cGVzW10gPSB7CisgICAgREJVU19UWVBFX0lOVkFMSUQsCisgICAgREJVU19UWVBFX05JTCwKKyAgICBEQlVTX1RZUEVfQllURSwKKyAgICBEQlVTX1RZUEVfQk9PTEVBTiwKKyAgICBEQlVTX1RZUEVfSU5UMzIsCisgICAgREJVU19UWVBFX1VJTlQzMiwKKyAgICBEQlVTX1RZUEVfSU5UNjQsCisgICAgREJVU19UWVBFX1VJTlQ2NCwKKyAgICBEQlVTX1RZUEVfRE9VQkxFLAorICAgIERCVVNfVFlQRV9TVFJJTkcsCisgICAgREJVU19UWVBFX0NVU1RPTSwKKyAgICBEQlVTX1RZUEVfQVJSQVksCisgICAgREJVU19UWVBFX0RJQ1QsCisgICAgREJVU19UWVBFX09CSkVDVF9QQVRICisgIH07CisKKyAgX2RidXNfYXNzZXJ0IChfREJVU19OX0VMRU1FTlRTICh0eXBlcykgPT0gREJVU19OVU1CRVJfT0ZfVFlQRVMgKyAxKTsKKworICByZXR1cm4gdHlwZXNbIHJhbmRvbV9pbnRfaW5fcmFuZ2UgKDAsIF9EQlVTX05fRUxFTUVOVFMgKHR5cGVzKSkgXTsKK30KKworc3RhdGljIHZvaWQKK3JhbmRvbWx5X2NoYW5nZV9vbmVfdHlwZSAoY29uc3QgREJ1c1N0cmluZyAqb3JpZ19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICptdXRhdGVkKQoreworICBpbnQgaTsKKyAgaW50IGxlbjsKKyAgCisgIGlmIChvcmlnX2RhdGEgIT0gbXV0YXRlZCkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAobXV0YXRlZCwgMCk7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKG9yaWdfZGF0YSwgMCwgbXV0YXRlZCwgMCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm91dCBvZiBtZW0iKTsKKyAgICB9CisKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChtdXRhdGVkKSA9PSAwKQorICAgIHJldHVybjsKKworICBsZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAobXV0YXRlZCk7CisgIGkgPSByYW5kb21faW50X2luX3JhbmdlICgwLCBsZW4pOworCisgIC8qIExvb2sgZm9yIGEgdHlwZSBzdGFydGluZyBhdCBhIHJhbmRvbSBsb2NhdGlvbiwKKyAgICogYW5kIHJlcGxhY2Ugd2l0aCBhIGRpZmZlcmVudCB0eXBlCisgICAqLworICB3aGlsZSAoaSA8IGxlbikKKyAgICB7CisgICAgICBpbnQgYjsKKyAgICAgIGIgPSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKG11dGF0ZWQsIGkpOworICAgICAgaWYgKGRidXNfdHlwZV9pc192YWxpZCAoYikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKG11dGF0ZWQsIGksIHJhbmRvbV90eXBlICgpKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICsraTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgdGltZXNfd2VfZGlkX2VhY2hfdGhpbmdbN10gPSB7IDAsIH07CisKK3N0YXRpYyB2b2lkCityYW5kb21seV9kb19uX3RoaW5ncyAoY29uc3QgREJ1c1N0cmluZyAqb3JpZ19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKm11dGF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbikKK3sKKyAgaW50IGk7CisgIHZvaWQgKCogZnVuY3Rpb25zW10pIChjb25zdCBEQnVzU3RyaW5nICpvcmlnX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICptdXRhdGVkKSA9CisgICAgeworICAgICAgcmFuZG9tbHlfc2hvcnRlbl9vcl9sZW5ndGhlbiwKKyAgICAgIHJhbmRvbWx5X2NoYW5nZV9vbmVfYnl0ZSwKKyAgICAgIHJhbmRvbWx5X2FkZF9vbmVfYnl0ZSwKKyAgICAgIHJhbmRvbWx5X3JlbW92ZV9vbmVfYnl0ZSwKKyAgICAgIHJhbmRvbWx5X21vZGlmeV9sZW5ndGgsCisgICAgICByYW5kb21seV9zZXRfZXh0cmVtZV9pbnRzLAorICAgICAgcmFuZG9tbHlfY2hhbmdlX29uZV90eXBlCisgICAgfTsKKworICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAobXV0YXRlZCwgMCk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAob3JpZ19kYXRhLCAwLCBtdXRhdGVkLCAwKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvdXQgb2YgbWVtIik7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbikKKyAgICB7CisgICAgICBpbnQgd2hpY2g7CisKKyAgICAgIHdoaWNoID0gcmFuZG9tX2ludF9pbl9yYW5nZSAoMCwgX0RCVVNfTl9FTEVNRU5UUyAoZnVuY3Rpb25zKSk7CisKKyAgICAgICgqIGZ1bmN0aW9uc1t3aGljaF0pIChtdXRhdGVkLCBtdXRhdGVkKTsKKyAgICAgIHRpbWVzX3dlX2RpZF9lYWNoX3RoaW5nW3doaWNoXSArPSAxOworICAgICAgCisgICAgICArK2k7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ZpbmRfYnJlYWtzX2Jhc2VkX29uIChjb25zdCBEQnVzU3RyaW5nICAgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgaXNfcmF3LAorICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlVmFsaWRpdHkgZXhwZWN0ZWRfdmFsaWRpdHksCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICpkYXRhKQoreworICBEQnVzU3RyaW5nIG9yaWdfZGF0YTsKKyAgREJ1c1N0cmluZyBtdXRhdGVkOworICBjb25zdCBjaGFyICpmaWxlbmFtZV9jOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGludCBpOworCisgIGZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmb3JpZ19kYXRhKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgYWxsb2NhdGUgc3RyaW5nXG4iKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmbXV0YXRlZCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFsbG9jYXRlIHN0cmluZ1xuIik7CisKKyAgaWYgKCFkYnVzX2ludGVybmFsX2RvX25vdF91c2VfbG9hZF9tZXNzYWdlX2ZpbGUgKGZpbGVuYW1lLCBpc19yYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3JpZ19kYXRhKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJjb3VsZCBub3QgbG9hZCBmaWxlICVzXG4iLCBmaWxlbmFtZV9jKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBwcmludGYgKCIgICAgICAgIGNoYW5naW5nIG9uZSByYW5kb20gYnl0ZSAxMDAgdGltZXNcbiIpOworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAxMDApCisgICAgeworICAgICAgcmFuZG9tbHlfY2hhbmdlX29uZV9ieXRlICgmb3JpZ19kYXRhLCAmbXV0YXRlZCk7CisgICAgICB0cnlfbXV0YXRlZF9kYXRhICgmbXV0YXRlZCk7CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgcHJpbnRmICgiICAgICAgICBjaGFuZ2luZyBsZW5ndGggNTAgdGltZXNcbiIpOworICBpID0gMDsKKyAgd2hpbGUgKGkgPCA1MCkKKyAgICB7CisgICAgICByYW5kb21seV9tb2RpZnlfbGVuZ3RoICgmb3JpZ19kYXRhLCAmbXV0YXRlZCk7CisgICAgICB0cnlfbXV0YXRlZF9kYXRhICgmbXV0YXRlZCk7CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgcHJpbnRmICgiICAgICAgICByZW1vdmluZyBvbmUgYnl0ZSA1MCB0aW1lc1xuIik7CisgIGkgPSAwOworICB3aGlsZSAoaSA8IDUwKQorICAgIHsKKyAgICAgIHJhbmRvbWx5X3JlbW92ZV9vbmVfYnl0ZSAoJm9yaWdfZGF0YSwgJm11dGF0ZWQpOworICAgICAgdHJ5X211dGF0ZWRfZGF0YSAoJm11dGF0ZWQpOworCisgICAgICArK2k7CisgICAgfQorCisgIHByaW50ZiAoIiAgICAgICAgYWRkaW5nIG9uZSBieXRlIDUwIHRpbWVzXG4iKTsKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgNTApCisgICAgeworICAgICAgcmFuZG9tbHlfYWRkX29uZV9ieXRlICgmb3JpZ19kYXRhLCAmbXV0YXRlZCk7CisgICAgICB0cnlfbXV0YXRlZF9kYXRhICgmbXV0YXRlZCk7CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgcHJpbnRmICgiICAgICAgICBjaGFuZ2luZyBpbnRzIHRvIGJvdW5kYXJ5IHZhbHVlcyA1MCB0aW1lc1xuIik7CisgIGkgPSAwOworICB3aGlsZSAoaSA8IDUwKQorICAgIHsKKyAgICAgIHJhbmRvbWx5X3NldF9leHRyZW1lX2ludHMgKCZvcmlnX2RhdGEsICZtdXRhdGVkKTsKKyAgICAgIHRyeV9tdXRhdGVkX2RhdGEgKCZtdXRhdGVkKTsKKworICAgICAgKytpOworICAgIH0KKworICBwcmludGYgKCIgICAgICAgIGNoYW5naW5nIHR5cGVjb2RlcyA1MCB0aW1lc1xuIik7CisgIGkgPSAwOworICB3aGlsZSAoaSA8IDUwKQorICAgIHsKKyAgICAgIHJhbmRvbWx5X2NoYW5nZV9vbmVfdHlwZSAoJm9yaWdfZGF0YSwgJm11dGF0ZWQpOworICAgICAgdHJ5X211dGF0ZWRfZGF0YSAoJm11dGF0ZWQpOworCisgICAgICArK2k7CisgICAgfQorCisgIHByaW50ZiAoIiAgICAgICAgY2hhbmdpbmcgbWVzc2FnZSBsZW5ndGggMTUgdGltZXNcbiIpOworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAxNSkKKyAgICB7CisgICAgICByYW5kb21seV9zaG9ydGVuX29yX2xlbmd0aGVuICgmb3JpZ19kYXRhLCAmbXV0YXRlZCk7CisgICAgICB0cnlfbXV0YXRlZF9kYXRhICgmbXV0YXRlZCk7CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgcHJpbnRmICgiICAgICAgICByYW5kb21seSBtYWtpbmcgMiBvZiBhYm92ZSBtb2RpZmljYXRpb25zIDQyIHRpbWVzXG4iKTsKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgNDIpCisgICAgeworICAgICAgcmFuZG9tbHlfZG9fbl90aGluZ3MgKCZvcmlnX2RhdGEsICZtdXRhdGVkLCAyKTsKKyAgICAgIHRyeV9tdXRhdGVkX2RhdGEgKCZtdXRhdGVkKTsKKworICAgICAgKytpOworICAgIH0KKworICBwcmludGYgKCIgICAgICAgIHJhbmRvbWx5IG1ha2luZyAzIG9mIGFib3ZlIG1vZGlmaWNhdGlvbnMgNDIgdGltZXNcbiIpOworICBpID0gMDsKKyAgd2hpbGUgKGkgPCA0MikKKyAgICB7CisgICAgICByYW5kb21seV9kb19uX3RoaW5ncyAoJm9yaWdfZGF0YSwgJm11dGF0ZWQsIDMpOworICAgICAgdHJ5X211dGF0ZWRfZGF0YSAoJm11dGF0ZWQpOworCisgICAgICArK2k7CisgICAgfQorCisgIHByaW50ZiAoIiAgICAgICAgcmFuZG9tbHkgbWFraW5nIDQgb2YgYWJvdmUgbW9kaWZpY2F0aW9ucyA0MiB0aW1lc1xuIik7CisgIGkgPSAwOworICB3aGlsZSAoaSA8IDQyKQorICAgIHsKKyAgICAgIHJhbmRvbWx5X2RvX25fdGhpbmdzICgmb3JpZ19kYXRhLCAmbXV0YXRlZCwgNCk7CisgICAgICB0cnlfbXV0YXRlZF9kYXRhICgmbXV0YXRlZCk7CisKKyAgICAgICsraTsKKyAgICB9CisgIAorICByZXR2YWwgPSBUUlVFOworICAKKyBmYWlsZWQ6CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZvcmlnX2RhdGEpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJm11dGF0ZWQpOworCisgIC8qIEZBTFNFIG1lYW5zIGVuZCB0aGUgd2hvbGUgcHJvY2VzcyAqLworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CitnZXRfcmFuZG9tX3NlZWQgKHZvaWQpCit7CisgIERCdXNTdHJpbmcgYnl0ZXM7CisgIHVuc2lnbmVkIGludCBzZWVkOworICBpbnQgZmQ7CisgIGNvbnN0IGNoYXIgKnM7CisKKyAgc2VlZCA9IDA7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmJ5dGVzKSkKKyAgICBleGl0ICgxKTsKKworICBmZCA9IG9wZW4gKCIvZGV2L3VyYW5kb20iLCBPX1JET05MWSk7CisgIGlmIChmZCA8IDApCisgICAgZ290byB1c2VfZmFsbGJhY2s7CisKKyAgaWYgKF9kYnVzX3JlYWQgKGZkLCAmYnl0ZXMsIDQpICE9IDQpCisgICAgZ290byB1c2VfZmFsbGJhY2s7CisKKyAgY2xvc2UgKGZkKTsKKworICBzID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmYnl0ZXMpOworCisgIHNlZWQgPSAqICh1bnNpZ25lZCBpbnQqKSBzOworICBnb3RvIG91dDsKKworIHVzZV9mYWxsYmFjazoKKyAgeworICAgIGxvbmcgdHZfdXNlYzsKKworICAgIGZwcmludGYgKHN0ZGVyciwgImNvdWxkIG5vdCBvcGVuL3JlYWQgL2Rldi91cmFuZG9tLCB1c2luZyBjdXJyZW50IHRpbWUgZm9yIHNlZWRcbiIpOworCisgICAgX2RidXNfZ2V0X21vbm90b25pY190aW1lIChOVUxMLCAmdHZfdXNlYyk7CisKKyAgICBzZWVkID0gdHZfdXNlYzsKKyAgfQorCisgb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmJ5dGVzKTsKKworICByZXR1cm4gc2VlZDsKK30KKworaW50CittYWluIChpbnQgICAgYXJnYywKKyAgICAgIGNoYXIgKiphcmd2KQoreworICBjb25zdCBjaGFyICp0ZXN0X2RhdGFfZGlyOworICBjb25zdCBjaGFyICpmYWlsdXJlX2Rpcl9jOworICBpbnQgdG90YWxfZmFpbHVyZXNfZm91bmQ7CisgIAorICBpZiAoYXJnYyA+IDEpCisgICAgdGVzdF9kYXRhX2RpciA9IGFyZ3ZbMV07CisgIGVsc2UKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJNdXN0IHNwZWNpZnkgYSB0b3Bfc3JjZGlyL3Rlc3QvZGF0YSBkaXJlY3RvcnlcbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIHRvdGFsX2ZhaWx1cmVzX2ZvdW5kID0gMDsKKyAgdG90YWxfYXR0ZW1wdHMgPSAwOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmYWlsdXJlX2RpcikpCisgICAgcmV0dXJuIDE7CisKKyAgLyogc28geW91IGNhbiBsZWF2ZSBpdCBvdmVybmlnaHQgc2FmZWx5ICovCisjZGVmaW5lIE1BWF9GQUlMVVJFUyAxMDAwCisKKyAgd2hpbGUgKHRvdGFsX2ZhaWx1cmVzX2ZvdW5kIDwgTUFYX0ZBSUxVUkVTKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBzZWVkOworCisgICAgICBmYWlsdXJlc190aGlzX2l0ZXJhdGlvbiA9IDA7CisKKyAgICAgIHNlZWQgPSBnZXRfcmFuZG9tX3NlZWQgKCk7CisKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmZmFpbHVyZV9kaXIsIDApOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZmYWlsdXJlX2RpciwgImZhaWx1cmVzLSIpKQorICAgICAgICByZXR1cm4gMTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3VpbnQgKCZmYWlsdXJlX2Rpciwgc2VlZCkpCisgICAgICAgIHJldHVybiAxOworCisgICAgICBmYWlsdXJlX2Rpcl9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZmFpbHVyZV9kaXIpOworCisgICAgICBpZiAobWtkaXIgKGZhaWx1cmVfZGlyX2MsIDA3MDApIDwgMCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChlcnJubyAhPSBFRVhJU1QpCisgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJkaWRuJ3QgbWtkaXIgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZV9kaXJfYywgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgIH0KKworICAgICAgcHJpbnRmICgibmV4dCBzZWVkID0gJXUgXHR0b3RhbCBmYWlsdXJlcyAlZCBvZiAlZCBhdHRlbXB0c1xuIiwKKyAgICAgICAgICAgICAgc2VlZCwgdG90YWxfZmFpbHVyZXNfZm91bmQsIHRvdGFsX2F0dGVtcHRzKTsKKworICAgICAgc3JhbmQgKHNlZWQpOworCisgICAgICBpZiAoIWRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9mb3JlYWNoX21lc3NhZ2VfZmlsZSAodGVzdF9kYXRhX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kX2JyZWFrc19iYXNlZF9vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgImZhdGFsIGVycm9yIGl0ZXJhdGluZyBvdmVyIG1lc3NhZ2UgZmlsZXNcbiIpOworICAgICAgICAgIHJtZGlyIChmYWlsdXJlX2Rpcl9jKTsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICBwcmludGYgKCIgIGRpZCAlZCByYW5kb20gbXV0YXRpb25zOiAlZCAlZCAlZCAlZCAlZCAlZCAlZFxuIiwKKyAgICAgICAgICAgICAgX0RCVVNfTl9FTEVNRU5UUyAodGltZXNfd2VfZGlkX2VhY2hfdGhpbmcpLAorICAgICAgICAgICAgICB0aW1lc193ZV9kaWRfZWFjaF90aGluZ1swXSwKKyAgICAgICAgICAgICAgdGltZXNfd2VfZGlkX2VhY2hfdGhpbmdbMV0sCisgICAgICAgICAgICAgIHRpbWVzX3dlX2RpZF9lYWNoX3RoaW5nWzJdLAorICAgICAgICAgICAgICB0aW1lc193ZV9kaWRfZWFjaF90aGluZ1szXSwKKyAgICAgICAgICAgICAgdGltZXNfd2VfZGlkX2VhY2hfdGhpbmdbNF0sCisgICAgICAgICAgICAgIHRpbWVzX3dlX2RpZF9lYWNoX3RoaW5nWzVdLAorICAgICAgICAgICAgICB0aW1lc193ZV9kaWRfZWFjaF90aGluZ1s2XSk7CisgICAgICAKKyAgICAgIHByaW50ZiAoIkZvdW5kICVkIGZhaWx1cmVzIHdpdGggc2VlZCAldSBzdG9yZWQgaW4gJXNcbiIsCisgICAgICAgICAgICAgIGZhaWx1cmVzX3RoaXNfaXRlcmF0aW9uLCBzZWVkLCBmYWlsdXJlX2Rpcl9jKTsKKworICAgICAgdG90YWxfZmFpbHVyZXNfZm91bmQgKz0gZmFpbHVyZXNfdGhpc19pdGVyYXRpb247CisKKyAgICAgIHJtZGlyIChmYWlsdXJlX2Rpcl9jKTsgLyogZG9lcyBub3RoaW5nIGlmIG5vbi1lbXB0eSAqLworICAgIH0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9jb3JydXB0LmMgYi9kYnVzL3Rlc3QvY29ycnVwdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNDk1OTAKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvY29ycnVwdC5jCkBAIC0wLDAgKzEsMzc2IEBACisvKiBSZWdyZXNzaW9uIHRlc3QgZm9yIGJlaW5nIGRpc2Nvbm5lY3RlZCBieSBhIGNvcnJ1cHQgbWVzc2FnZSAoZmQubyAjMTU1NzgpCisgKgorICogQXV0aG9yOiBTaW1vbiBNY1ZpdHRpZSA8c2ltb24ubWN2aXR0aWVAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IMKpIDIwMTAtMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcworICogKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKKyAqIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsCisgKiBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLAorICogYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnaW8vZ2lvLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZ2xpYi1sb3dsZXZlbC5oPgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgREJ1c0Vycm9yIGU7CisKKyAgICBEQnVzU2VydmVyICpzZXJ2ZXI7CisgICAgREJ1c0Nvbm5lY3Rpb24gKnNlcnZlcl9jb25uOworICAgIC8qIHF1ZXVlIG9mIERCdXNNZXNzYWdlICovCisgICAgR1F1ZXVlIGNsaWVudF9tZXNzYWdlczsKKworICAgIERCdXNDb25uZWN0aW9uICpjbGllbnRfY29ubjsKK30gRml4dHVyZTsKKworc3RhdGljIHZvaWQKK2Fzc2VydF9ub19lcnJvciAoY29uc3QgREJ1c0Vycm9yICplKQoreworICBpZiAoR19VTkxJS0VMWSAoZGJ1c19lcnJvcl9pc19zZXQgKGUpKSkKKyAgICBnX2Vycm9yICgiZXhwZWN0ZWQgc3VjY2VzcyBidXQgZ290IGVycm9yOiAlczogJXMiLCBlLT5uYW1lLCBlLT5tZXNzYWdlKTsKK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitjbGllbnRfbWVzc2FnZV9jYiAoREJ1c0Nvbm5lY3Rpb24gKmNsaWVudF9jb25uLAorICAgIERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgIHZvaWQgKmRhdGEpCit7CisgIEZpeHR1cmUgKmYgPSBkYXRhOworCisgIGdfYXNzZXJ0IChjbGllbnRfY29ubiA9PSBmLT5jbGllbnRfY29ubik7CisgIGdfcXVldWVfcHVzaF90YWlsICgmZi0+Y2xpZW50X21lc3NhZ2VzLCBkYnVzX21lc3NhZ2VfcmVmIChtZXNzYWdlKSk7CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQKK25ld19jb25uX2NiIChEQnVzU2VydmVyICpzZXJ2ZXIsCisgICAgREJ1c0Nvbm5lY3Rpb24gKnNlcnZlcl9jb25uLAorICAgIHZvaWQgKmRhdGEpCit7CisgIEZpeHR1cmUgKmYgPSBkYXRhOworCisgIGdfYXNzZXJ0IChmLT5zZXJ2ZXJfY29ubiA9PSBOVUxMKTsKKyAgZi0+c2VydmVyX2Nvbm4gPSBkYnVzX2Nvbm5lY3Rpb25fcmVmIChzZXJ2ZXJfY29ubik7CisgIGRidXNfY29ubmVjdGlvbl9zZXR1cF93aXRoX2dfbWFpbiAoc2VydmVyX2Nvbm4sIE5VTEwpOworfQorCitzdGF0aWMgdm9pZAorc2V0dXAgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBhZGRyKQoreworICBkYnVzX2Vycm9yX2luaXQgKCZmLT5lKTsKKyAgZ19xdWV1ZV9pbml0ICgmZi0+Y2xpZW50X21lc3NhZ2VzKTsKKworICBmLT5zZXJ2ZXIgPSBkYnVzX3NlcnZlcl9saXN0ZW4gKGFkZHIsICZmLT5lKTsKKyAgYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisgIGdfYXNzZXJ0IChmLT5zZXJ2ZXIgIT0gTlVMTCk7CisKKyAgZGJ1c19zZXJ2ZXJfc2V0X25ld19jb25uZWN0aW9uX2Z1bmN0aW9uIChmLT5zZXJ2ZXIsCisgICAgICBuZXdfY29ubl9jYiwgZiwgTlVMTCk7CisgIGRidXNfc2VydmVyX3NldHVwX3dpdGhfZ19tYWluIChmLT5zZXJ2ZXIsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jb25uZWN0IChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgYWRkciBHX0dOVUNfVU5VU0VEKQoreworICBkYnVzX2Jvb2xfdCBoYXZlX21lbTsKKworICBnX2Fzc2VydCAoZi0+c2VydmVyX2Nvbm4gPT0gTlVMTCk7CisKKyAgZi0+Y2xpZW50X2Nvbm4gPSBkYnVzX2Nvbm5lY3Rpb25fb3Blbl9wcml2YXRlICgKKyAgICAgIGRidXNfc2VydmVyX2dldF9hZGRyZXNzIChmLT5zZXJ2ZXIpLCAmZi0+ZSk7CisgIGFzc2VydF9ub19lcnJvciAoJmYtPmUpOworICBnX2Fzc2VydCAoZi0+Y2xpZW50X2Nvbm4gIT0gTlVMTCk7CisgIGRidXNfY29ubmVjdGlvbl9zZXR1cF93aXRoX2dfbWFpbiAoZi0+Y2xpZW50X2Nvbm4sIE5VTEwpOworCisgIHdoaWxlIChmLT5zZXJ2ZXJfY29ubiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGdfcHJpbnQgKCIuIik7CisgICAgICBnX21haW5fY29udGV4dF9pdGVyYXRpb24gKE5VTEwsIFRSVUUpOworICAgIH0KKworICBoYXZlX21lbSA9IGRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChmLT5jbGllbnRfY29ubiwKKyAgICAgIGNsaWVudF9tZXNzYWdlX2NiLCBmLCBOVUxMKTsKKyAgZ19hc3NlcnQgKGhhdmVfbWVtKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfbWVzc2FnZSAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGFkZHIpCit7CisgIGRidXNfYm9vbF90IGhhdmVfbWVtOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgREJ1c01lc3NhZ2UgKm91dGdvaW5nLCAqaW5jb21pbmc7CisKKyAgdGVzdF9jb25uZWN0IChmLCBhZGRyKTsKKworICBvdXRnb2luZyA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2NvbS9leGFtcGxlL0hlbGxvIiwKKyAgICAgICJjb20uZXhhbXBsZS5IZWxsbyIsICJHcmVldGluZyIpOworICBnX2Fzc2VydCAob3V0Z29pbmcgIT0gTlVMTCk7CisKKyAgaGF2ZV9tZW0gPSBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+c2VydmVyX2Nvbm4sIG91dGdvaW5nLCAmc2VyaWFsKTsKKyAgZ19hc3NlcnQgKGhhdmVfbWVtKTsKKyAgZ19hc3NlcnQgKHNlcmlhbCAhPSAwKTsKKworICB3aGlsZSAoZ19xdWV1ZV9pc19lbXB0eSAoJmYtPmNsaWVudF9tZXNzYWdlcykpCisgICAgeworICAgICAgZ19wcmludCAoIi4iKTsKKyAgICAgIGdfbWFpbl9jb250ZXh0X2l0ZXJhdGlvbiAoTlVMTCwgVFJVRSk7CisgICAgfQorCisgIGdfYXNzZXJ0X2NtcHVpbnQgKGdfcXVldWVfZ2V0X2xlbmd0aCAoJmYtPmNsaWVudF9tZXNzYWdlcyksID09LCAxKTsKKworICBpbmNvbWluZyA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5jbGllbnRfbWVzc2FnZXMpOworCisgIGdfYXNzZXJ0ICghZGJ1c19tZXNzYWdlX2NvbnRhaW5zX3VuaXhfZmRzIChpbmNvbWluZykpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKGluY29taW5nKSwgPT0sIE5VTEwpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAoaW5jb21pbmcpLCA9PSwgTlVMTCk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKGluY29taW5nKSwgPT0sCisgICAgICAiY29tLmV4YW1wbGUuSGVsbG8iKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAoaW5jb21pbmcpLCA9PSwgIkdyZWV0aW5nIik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKGluY29taW5nKSwgPT0sIE5VTEwpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChpbmNvbWluZyksID09LCAiIik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9wYXRoIChpbmNvbWluZyksID09LCAiL2NvbS9leGFtcGxlL0hlbGxvIik7CisgIGdfYXNzZXJ0X2NtcHVpbnQgKGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsIChpbmNvbWluZyksID09LCBzZXJpYWwpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAoaW5jb21pbmcpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAob3V0Z29pbmcpOworfQorCitzdGF0aWMgdm9pZAorc2VuZF9uX2J5dGVzIChHU29ja2V0ICpzb2NrZXQsCisgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpibG9iLAorICAgICAgICAgICAgICBnc3NpemUgYmxvYl9sZW4pCit7CisgIGdzc2l6ZSBsZW4sIHRvdGFsX3NlbnQ7CisgIEdFcnJvciAqZ2Vycm9yID0gTlVMTDsKKworICB0b3RhbF9zZW50ID0gMDsKKworICB3aGlsZSAodG90YWxfc2VudCA8IGJsb2JfbGVuKQorICAgIHsKKyAgICAgIGxlbiA9IGdfc29ja2V0X3NlbmQgKHNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2IgKyB0b3RhbF9zZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvYl9sZW4gLSB0b3RhbF9zZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJmdlcnJvcik7CisKKyAgICAgIC8qIHRoaXMgaXMgTlVMTC1zYWZlOiBhIE5VTEwgZXJyb3IgZG9lcyBub3QgbWF0Y2ggKi8KKyAgICAgIGlmIChnX2Vycm9yX21hdGNoZXMgKGdlcnJvciwgR19JT19FUlJPUiwgR19JT19FUlJPUl9XT1VMRF9CTE9DSykpCisgICAgICAgIHsKKyAgICAgICAgICAvKiB3ZSBjb3VsZCB3YWl0IGZvciBHX0lPX09VVCwgYnV0IGxpZmUncyB0b28gc2hvcnQ7IGp1c3Qgc2xlZXAgKi8KKyAgICAgICAgICBnX2NsZWFyX2Vycm9yICgmZ2Vycm9yKTsKKyAgICAgICAgICBnX3VzbGVlcCAoR19VU0VDX1BFUl9TRUMgLyAxMCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgZ19hc3NlcnRfbm9fZXJyb3IgKGdlcnJvcik7CisgICAgICBnX2Fzc2VydCAobGVuID49IDApOworICAgICAgdG90YWxfc2VudCArPSBsZW47CisgICAgfQorfQorCisvKiBFbm91Z2ggYnl0ZXMgZm9yIGl0IHRvIGJlIG9idmlvdXMgdGhhdCB0aGlzIGNvbm5lY3Rpb24gaXMgYnJva2VuICovCisjZGVmaW5lIENPUlJVUFRfTEVOIDEwMjQKKworLyogQWxsLXplcm8gaXMgbm90IGEgdmFsaWQgRC1CdXMgbWVzc2FnZSBoZWFkZXIgLSBmb3IgYSBzdGFydCwgdGhpcyBpcworICogcHJvdG9jb2wgdmVyc2lvbiAxLCBub3QgMCAqLworc3RhdGljIGNvbnN0IGdjaGFyIG5vdF9hX2RidXNfbWVzc2FnZVtDT1JSVVBUX0xFTl0gPSB7IDAgfTsKKworc3RhdGljIHZvaWQKK3Rlc3RfY29ycnVwdCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGFkZHIpCit7CisgIEdTb2NrZXQgKnNvY2tldDsKKyAgR0Vycm9yICpnZXJyb3IgPSBOVUxMOworICBpbnQgZmQ7CisgIERCdXNNZXNzYWdlICppbmNvbWluZzsKKworICB0ZXN0X21lc3NhZ2UgKGYsIGFkZHIpOworCisgIGRidXNfY29ubmVjdGlvbl9mbHVzaCAoZi0+c2VydmVyX2Nvbm4pOworCisgIC8qIE9LLCBub3cgdGhlIGNvbm5lY3Rpb24gaXMgd29ya2luZywgbGV0J3MgYnJlYWsgaXQhIERvbid0IHRyeSB0aGlzCisgICAqIGF0IGhvbWU7IHNwbGljaW5nIGFyYml0cmFyeSBieXRlcyBpbnRvIHRoZSBtaWRkbGUgb2YgdGhlIHN0cmVhbSBpcworICAgKiBzcGVjaWZpY2FsbHkgZG9jdW1lbnRlZCBhcyBub3QgYSB2YWxpZCB0aGluZyB0byBkby4gV2hvJ2QgaGF2ZSB0aG91Z2h0PyAqLworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfc29ja2V0IChmLT5zZXJ2ZXJfY29ubiwgJmZkKSkKKyAgICBnX2Vycm9yICgiZmFpbGVkIHRvIHN0ZWFsIGZkIGZyb20gc2VydmVyIGNvbm5lY3Rpb24iKTsKKworICBzb2NrZXQgPSBnX3NvY2tldF9uZXdfZnJvbV9mZCAoZmQsICZnZXJyb3IpOworICBnX2Fzc2VydF9ub19lcnJvciAoZ2Vycm9yKTsKKyAgZ19hc3NlcnQgKHNvY2tldCAhPSBOVUxMKTsKKworICBzZW5kX25fYnl0ZXMgKHNvY2tldCwgbm90X2FfZGJ1c19tZXNzYWdlLCBDT1JSVVBUX0xFTik7CisKKyAgLyogTm93IHNwaW4gb24gdGhlIGNsaWVudCBjb25uZWN0aW9uOiB0aGUgc2VydmVyIGp1c3Qgc2VudCBpdCBjb21wbGV0ZQorICAgKiBydWJiaXNoLCBzbyBpdCBzaG91bGQgZGlzY29ubmVjdCAqLworICB3aGlsZSAoZ19xdWV1ZV9pc19lbXB0eSAoJmYtPmNsaWVudF9tZXNzYWdlcykpCisgICAgeworICAgICAgZ19wcmludCAoIi4iKTsKKyAgICAgIGdfbWFpbl9jb250ZXh0X2l0ZXJhdGlvbiAoTlVMTCwgVFJVRSk7CisgICAgfQorCisgIGluY29taW5nID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPmNsaWVudF9tZXNzYWdlcyk7CisKKyAgZ19hc3NlcnQgKCFkYnVzX21lc3NhZ2VfY29udGFpbnNfdW5peF9mZHMgKGluY29taW5nKSk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAoaW5jb21pbmcpLCA9PSwgTlVMTCk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChpbmNvbWluZyksID09LCBOVUxMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAoaW5jb21pbmcpLCA9PSwKKyAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5Mb2NhbCIpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChpbmNvbWluZyksID09LCAiRGlzY29ubmVjdGVkIik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKGluY29taW5nKSwgPT0sIE5VTEwpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChpbmNvbWluZyksID09LCAiIik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9wYXRoIChpbmNvbWluZyksID09LAorICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvREJ1cy9Mb2NhbCIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAoaW5jb21pbmcpOworICBnX29iamVjdF91bnJlZiAoc29ja2V0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfYnl0ZV9vcmRlciAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGFkZHIpCit7CisgIEdTb2NrZXQgKnNvY2tldDsKKyAgR0Vycm9yICpnZXJyb3IgPSBOVUxMOworICBpbnQgZmQ7CisgIGNoYXIgKmJsb2I7CisgIGNvbnN0IGdjaGFyICphcmcgPSBub3RfYV9kYnVzX21lc3NhZ2U7CisgIGNvbnN0IGdjaGFyICogY29uc3QgKmFyZ3MgPSAmYXJnOworICBpbnQgYmxvYl9sZW47CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX2Jvb2xfdCBtZW07CisKKyAgdGVzdF9tZXNzYWdlIChmLCBhZGRyKTsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKCIvIiwgImEuYiIsICJjIik7CisgIGdfYXNzZXJ0IChtZXNzYWdlICE9IE5VTEwpOworICAvKiBBcHBlbmQgMHhGRiBieXRlcywgc28gdGhhdCB0aGUgbGVuZ3RoIG9mIHRoZSBib2R5IHdoZW4gYnl0ZS1zd2FwcGVkCisgICAqIGlzIDB4RkYwMDAwMDAsIHdoaWNoIGlzIGludmFsaWQgKi8KKyAgbWVtID0gZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfQllURSwgJmFyZ3MsIDB4RkYsCisgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisgIGdfYXNzZXJ0IChtZW0pOworICBtZW0gPSBkYnVzX21lc3NhZ2VfbWFyc2hhbCAobWVzc2FnZSwgJmJsb2IsICZibG9iX2xlbik7CisgIGdfYXNzZXJ0IChtZW0pOworICBnX2Fzc2VydF9jbXB1aW50IChibG9iX2xlbiwgPiwgMHhGRik7CisgIGdfYXNzZXJ0IChibG9iICE9IE5VTEwpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgLyogQnJlYWsgdGhlIG1lc3NhZ2UgYnkgY2hhbmdpbmcgaXRzIGNsYWltZWQgYnl0ZSBvcmRlciwgd2l0aG91dCBhY3R1YWxseQorICAgKiBieXRlc3dhcHBpbmcgYW55dGhpbmcuIFdlIGhhcHBlbiB0byBrbm93IHRoYXQgYnl0ZSBvcmRlciBpcyB0aGUgZmlyc3QKKyAgICogYnl0ZS4gKi8KKyAgaWYgKGJsb2JbMF0gPT0gJ0InKQorICAgIGJsb2JbMF0gPSAnbCc7CisgIGVsc2UKKyAgICBibG9iWzBdID0gJ0InOworCisgIC8qIE9LLCBub3cgdGhlIGNvbm5lY3Rpb24gaXMgd29ya2luZywgbGV0J3MgYnJlYWsgaXQgKi8KKworICBkYnVzX2Nvbm5lY3Rpb25fZmx1c2ggKGYtPnNlcnZlcl9jb25uKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfc29ja2V0IChmLT5zZXJ2ZXJfY29ubiwgJmZkKSkKKyAgICBnX2Vycm9yICgiZmFpbGVkIHRvIHN0ZWFsIGZkIGZyb20gc2VydmVyIGNvbm5lY3Rpb24iKTsKKworICBzb2NrZXQgPSBnX3NvY2tldF9uZXdfZnJvbV9mZCAoZmQsICZnZXJyb3IpOworICBnX2Fzc2VydF9ub19lcnJvciAoZ2Vycm9yKTsKKyAgZ19hc3NlcnQgKHNvY2tldCAhPSBOVUxMKTsKKworICBzZW5kX25fYnl0ZXMgKHNvY2tldCwgYmxvYiwgYmxvYl9sZW4pOworCisgIGRidXNfZnJlZSAoYmxvYik7CisKKyAgLyogTm93IHNwaW4gb24gdGhlIGNsaWVudCBjb25uZWN0aW9uOiB0aGUgc2VydmVyIGp1c3Qgc2VudCBpdCBhIGZhdWx0eQorICAgKiBtZXNzYWdlLCBzbyBpdCBzaG91bGQgZGlzY29ubmVjdCAqLworICB3aGlsZSAoZ19xdWV1ZV9pc19lbXB0eSAoJmYtPmNsaWVudF9tZXNzYWdlcykpCisgICAgeworICAgICAgZ19wcmludCAoIi4iKTsKKyAgICAgIGdfbWFpbl9jb250ZXh0X2l0ZXJhdGlvbiAoTlVMTCwgVFJVRSk7CisgICAgfQorCisgIG1lc3NhZ2UgPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+Y2xpZW50X21lc3NhZ2VzKTsKKworICBnX2Fzc2VydCAoIWRidXNfbWVzc2FnZV9jb250YWluc191bml4X2ZkcyAobWVzc2FnZSkpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKG1lc3NhZ2UpLCA9PSwgTlVMTCk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSwgPT0sIE5VTEwpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSwgPT0sCisgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuTG9jYWwiKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSksID09LCAiRGlzY29ubmVjdGVkIik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpLCA9PSwgTlVMTCk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG1lc3NhZ2UpLCA9PSwgIiIpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobWVzc2FnZSksID09LAorICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvREJ1cy9Mb2NhbCIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIGdfb2JqZWN0X3VucmVmIChzb2NrZXQpOworfQorCitzdGF0aWMgdm9pZAordGVhcmRvd24gKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBhZGRyIEdfR05VQ19VTlVTRUQpCit7CisgIGlmIChmLT5jbGllbnRfY29ubiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+Y2xpZW50X2Nvbm4pOworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChmLT5jbGllbnRfY29ubik7CisgICAgICBmLT5jbGllbnRfY29ubiA9IE5VTEw7CisgICAgfQorCisgIGlmIChmLT5zZXJ2ZXJfY29ubiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+c2VydmVyX2Nvbm4pOworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChmLT5zZXJ2ZXJfY29ubik7CisgICAgICBmLT5zZXJ2ZXJfY29ubiA9IE5VTEw7CisgICAgfQorCisgIGlmIChmLT5zZXJ2ZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NlcnZlcl9kaXNjb25uZWN0IChmLT5zZXJ2ZXIpOworICAgICAgZGJ1c19zZXJ2ZXJfdW5yZWYgKGYtPnNlcnZlcik7CisgICAgICBmLT5zZXJ2ZXIgPSBOVUxMOworICAgIH0KK30KKworaW50CittYWluIChpbnQgYXJnYywKKyAgICBjaGFyICoqYXJndikKK3sKKyAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CisgIGdfdHlwZV9pbml0ICgpOworCisgIGdfdGVzdF9hZGQgKCIvY29ycnVwdC90Y3AiLCBGaXh0dXJlLCAidGNwOmhvc3Q9MTI3LjAuMC4xIiwgc2V0dXAsCisgICAgICB0ZXN0X2NvcnJ1cHQsIHRlYXJkb3duKTsKKworI2lmZGVmIERCVVNfVU5JWAorICBnX3Rlc3RfYWRkICgiL2NvcnJ1cHQvdW5peCIsIEZpeHR1cmUsICJ1bml4OnRtcGRpcj0vdG1wIiwgc2V0dXAsCisgICAgICB0ZXN0X2NvcnJ1cHQsIHRlYXJkb3duKTsKKyNlbmRpZgorCisgIGdfdGVzdF9hZGQgKCIvY29ycnVwdC9ieXRlLW9yZGVyL3RjcCIsIEZpeHR1cmUsICJ0Y3A6aG9zdD0xMjcuMC4wLjEiLCBzZXR1cCwKKyAgICAgIHRlc3RfYnl0ZV9vcmRlciwgdGVhcmRvd24pOworCisgIHJldHVybiBnX3Rlc3RfcnVuICgpOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvYXV0aC9hbm9ueW1vdXMtY2xpZW50LXN1Y2Nlc3NmdWwuYXV0aC1zY3JpcHQgYi9kYnVzL3Rlc3QvZGF0YS9hdXRoL2Fub255bW91cy1jbGllbnQtc3VjY2Vzc2Z1bC5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTE2MjBiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvYXV0aC9hbm9ueW1vdXMtY2xpZW50LXN1Y2Nlc3NmdWwuYXV0aC1zY3JpcHQKQEAgLTAsMCArMSwxNiBAQAorIyMgdGhpcyB0ZXN0cyB0aGF0IGEgY2xpZW50IGNhbiBsb2dpbiBhbm9ueW1vdXNseQorCitDTElFTlQKKworIyMgUmVqZWN0IHdoYXRldmVyIG1lY2hhbmlzbSB0aGUgY2xpZW50IHBpY2tzIGZpcnN0CitFWFBFQ1RfQ09NTUFORCBBVVRICitTRU5EICdSRUpFQ1RFRCBEQlVTX1RFU1RfTk9ORVhJU1RFTlRfTUVDSDEgQU5PTllNT1VTIERCVVNfVEVTVF9OT05FWElTVEVOVF9NRUNIMicKKworIyMgQW5kIHRoaXMgdGltZSB3ZSBnZXQgQU5PTllNT1VTCisKK0VYUEVDVF9DT01NQU5EIEFVVEgKKyMjIG9mIGNvdXJzZSByZWFsIERCVVNfQ09PS0lFX1NIQTEgd291bGQgbm90IHNlbmQgdGhpcyBoZXJlLi4uCitTRU5EICdPSyAxMjM0ZGVhZGJlZWYnCisKK0VYUEVDVF9DT01NQU5EIEJFR0lOCitFWFBFQ1RfU1RBVEUgQVVUSEVOVElDQVRFRApkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvYXV0aC9hbm9ueW1vdXMtc2VydmVyLXN1Y2Nlc3NmdWwuYXV0aC1zY3JpcHQgYi9kYnVzL3Rlc3QvZGF0YS9hdXRoL2Fub255bW91cy1zZXJ2ZXItc3VjY2Vzc2Z1bC5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzJhZTlkCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvYXV0aC9hbm9ueW1vdXMtc2VydmVyLXN1Y2Nlc3NmdWwuYXV0aC1zY3JpcHQKQEAgLTAsMCArMSwxMyBAQAorIyMgdGhpcyB0ZXN0cyB0aGUgc2VydmVyIHNpZGUgaW4gYSBzdWNjZXNzZnVsIGF1dGggb2YgdHlwZSBBTk9OWU1PVVMgCisKK1NFUlZFUgorIyMgdmVyaWZ5IHRoYXQgcHJpb3IgdG8gZG9pbmcgYW55dGhpbmcsIHdlIGhhdmVuJ3QgYXV0aGVkIGFzIGFueW9uZQorRVhQRUNUX0hBVkVfTk9fQ1JFREVOVElBTFMKK1NFTkQgJ0FVVEggQU5PTllNT1VTIDQ0MmQ0Mjc1NzMyMDMxMmUzMTJlMzEnCitFWFBFQ1RfQ09NTUFORCBPSworRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCitTRU5EICdCRUdJTicKK0VYUEVDVF9TVEFURSBBVVRIRU5USUNBVEVECisjIyB2ZXJpZnkgdGhhdCB3ZSBhcmUgc3RpbGwgYW5vbnltb3VzCitFWFBFQ1RfSEFWRV9OT19DUkVERU5USUFMUworCmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS9hdXRoL2NhbmNlbC5hdXRoLXNjcmlwdCBiL2RidXMvdGVzdC9kYXRhL2F1dGgvY2FuY2VsLmF1dGgtc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYzUxOWEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS9hdXRoL2NhbmNlbC5hdXRoLXNjcmlwdApAQCAtMCwwICsxLDE5IEBACisjIyB0aGlzIHRlc3RzIGNhbmNlbGluZyBFWFRFUk5BTAorCitTRVJWRVIKK1NFTkQgJ0FVVEggRVhURVJOQUwgVVNFUklEX0hFWCcKK0VYUEVDVF9DT01NQU5EIE9LCitFWFBFQ1RfU1RBVEUgV0FJVElOR19GT1JfSU5QVVQKK1NFTkQgJ0NBTkNFTCcKK0VYUEVDVF9DT01NQU5EIFJFSkVDVEVECitFWFBFQ1RfU1RBVEUgV0FJVElOR19GT1JfSU5QVVQKKworIyMgbm93IHN0YXJ0IG92ZXIgYW5kIHNlZSBpZiBpdCB3b3JrcworU0VORCAnQVVUSCBFWFRFUk5BTCBVU0VSSURfSEVYJworRVhQRUNUX0NPTU1BTkQgT0sKK0VYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVAorU0VORCAnQkVHSU4nCitFWFBFQ1RfU1RBVEUgQVVUSEVOVElDQVRFRAorCisKKwpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvYXV0aC9jbGllbnQtb3V0LW9mLW1lY2hhbmlzbXMuYXV0aC1zY3JpcHQgYi9kYnVzL3Rlc3QvZGF0YS9hdXRoL2NsaWVudC1vdXQtb2YtbWVjaGFuaXNtcy5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTZkM2FkCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvYXV0aC9jbGllbnQtb3V0LW9mLW1lY2hhbmlzbXMuYXV0aC1zY3JpcHQKQEAgLTAsMCArMSw3IEBACisjIyB0aGlzIHRlc3RzIHRoYXQgdGVzdHMgdGhhdCB0aGUgY2xpZW50IGRpc2Nvbm5lY3RzIHdoZW4gaXQncyBvdXQgb2YKKyMjIGtub3duIG1lY2hhbmlzbXMKKworQ0xJRU5UCitFWFBFQ1RfQ09NTUFORCBBVVRICitTRU5EICdSRUpFQ1RFRCBCT05HT19NRDUnCitFWFBFQ1RfU1RBVEUgTkVFRF9ESVNDT05ORUNUCmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS9hdXRoL2V4dGVybmFsLWZhaWxlZC5hdXRoLXNjcmlwdCBiL2RidXMvdGVzdC9kYXRhL2F1dGgvZXh0ZXJuYWwtZmFpbGVkLmF1dGgtc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNGU5MDAKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS9hdXRoL2V4dGVybmFsLWZhaWxlZC5hdXRoLXNjcmlwdApAQCAtMCwwICsxLDExIEBACisjIyB0aGlzIHRlc3RzIHRoYXQgYXV0aCBvZiB0eXBlIEVYVEVSTkFMIHdpdGhvdXQgY3JlZGVudGlhbHMgd2lsbCBmYWlsCisKK1NFUlZFUgorTk9fQ1JFREVOVElBTFMKKyMjIHZlcmlmeSB0aGF0IHByaW9yIHRvIGRvaW5nIGFueXRoaW5nLCB3ZSBoYXZlbid0IGF1dGhlZCBhcyBhbnlvbmUKK0VYUEVDVF9IQVZFX05PX0NSRURFTlRJQUxTCitTRU5EICdBVVRIIEVYVEVSTkFMIFVTRVJJRF9IRVgnCitFWFBFQ1RfQ09NTUFORCBSRUpFQ1RFRAorRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCisjIyB2ZXJpZnkgdGhhdCB3ZSBzdGlsbCBoYXZlbid0IGF1dGhlZCBhcyBhbnlvbmUKK0VYUEVDVF9IQVZFX05PX0NSRURFTlRJQUxTCmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS9hdXRoL2V4dGVybmFsLXJvb3QuYXV0aC1zY3JpcHQgYi9kYnVzL3Rlc3QvZGF0YS9hdXRoL2V4dGVybmFsLXJvb3QuYXV0aC1zY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRjNGI0MwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9kYXRhL2F1dGgvZXh0ZXJuYWwtcm9vdC5hdXRoLXNjcmlwdApAQCAtMCwwICsxLDExIEBACisjIyB0aGlzIHRlc3RzIHdlIGNhbiBhdXRoIEVYVEVSTkFMIGFzIG91cnNlbHZlcywgd2l0aCByb290IGNyZWRlbnRpYWxzCitVTklYX09OTFkKK1NFUlZFUgorUk9PVF9DUkVERU5USUFMUworIyMgMzAgaXMgQVNDSUkgJzAnIGluIGhleAorU0VORCAnQVVUSCBFWFRFUk5BTCAzMCcKK0VYUEVDVF9DT01NQU5EIE9LCitFWFBFQ1RfU1RBVEUgV0FJVElOR19GT1JfSU5QVVQKK1NFTkQgJ0JFR0lOJworRVhQRUNUX1NUQVRFIEFVVEhFTlRJQ0FURUQKKwpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvYXV0aC9leHRlcm5hbC1zaWxseS5hdXRoLXNjcmlwdCBiL2RidXMvdGVzdC9kYXRhL2F1dGgvZXh0ZXJuYWwtc2lsbHkuYXV0aC1zY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUxOGVlOAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9kYXRhL2F1dGgvZXh0ZXJuYWwtc2lsbHkuYXV0aC1zY3JpcHQKQEAgLTAsMCArMSwxMiBAQAorIyMgdGhpcyB0ZXN0cyB3ZSBjYW4ndCBhdXRoIGlmIHNvY2tldCByZXBvcnRzIHNpbGx5IGNyZWRlbnRpYWxzIGJ1dCB3ZSBhc2sgZm9yIG91ciBvd24gdWlkCisKK1NFUlZFUgorIyMgdmVyaWZ5IHRoYXQgcHJpb3IgdG8gZG9pbmcgYW55dGhpbmcsIHdlIGhhdmVuJ3QgYXV0aGVkIGFzIGFueW9uZQorRVhQRUNUX0hBVkVfTk9fQ1JFREVOVElBTFMKK1NJTExZX0NSRURFTlRJQUxTCitTRU5EICdBVVRIIEVYVEVSTkFMIFVTRVJJRF9IRVgnCitFWFBFQ1RfQ09NTUFORCBSRUpFQ1RFRAorRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCisjIyB2ZXJpZnkgdGhhdCB3ZSBzdGlsbCBoYXZlbid0IGF1dGhlZCBhcyBhbnlvbmUKK0VYUEVDVF9IQVZFX05PX0NSRURFTlRJQUxTCisKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL2F1dGgvZXh0ZXJuYWwtc3VjY2Vzc2Z1bC5hdXRoLXNjcmlwdCBiL2RidXMvdGVzdC9kYXRhL2F1dGgvZXh0ZXJuYWwtc3VjY2Vzc2Z1bC5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjI5MzhjCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvYXV0aC9leHRlcm5hbC1zdWNjZXNzZnVsLmF1dGgtc2NyaXB0CkBAIC0wLDAgKzEsMTIgQEAKKyMjIHRoaXMgdGVzdHMgYSBzdWNjZXNzZnVsIGF1dGggb2YgdHlwZSBFWFRFUk5BTAorCitTRVJWRVIKKyMjIHZlcmlmeSB0aGF0IHByaW9yIHRvIGRvaW5nIGFueXRoaW5nLCB3ZSBoYXZlbid0IGF1dGhlZCBhcyBhbnlvbmUKK0VYUEVDVF9IQVZFX05PX0NSRURFTlRJQUxTCitTRU5EICdBVVRIIEVYVEVSTkFMIFVTRVJJRF9IRVgnCitFWFBFQ1RfQ09NTUFORCBPSworRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCitTRU5EICdCRUdJTicKK0VYUEVDVF9TVEFURSBBVVRIRU5USUNBVEVECisjIyB2ZXJpZnkgdGhhdCB3ZSBub3cgaGF2ZSBzb21lIGNyZWRlbnRpYWxzCitFWFBFQ1RfSEFWRV9TT01FX0NSRURFTlRJQUxTCmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS9hdXRoL2V4dHJhLWJ5dGVzLmF1dGgtc2NyaXB0IGIvZGJ1cy90ZXN0L2RhdGEvYXV0aC9leHRyYS1ieXRlcy5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDFlMDFkCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvYXV0aC9leHRyYS1ieXRlcy5hdXRoLXNjcmlwdApAQCAtMCwwICsxLDEwIEBACisjIyB0aGlzIHRlc3RzIHRoYXQgd2UgaGF2ZSB0aGUgZXhwZWN0ZWQgZXh0cmEgYnl0ZXMgYXQgdGhlIGVuZAorCitTRVJWRVIKK1NFTkQgJ0FVVEggRVhURVJOQUwgVVNFUklEX0hFWCcKK0VYUEVDVF9DT01NQU5EIE9LCitFWFBFQ1RfU1RBVEUgV0FJVElOR19GT1JfSU5QVVQKK1NFTkQgJ0JFR0lOXHJcbkhlbGxvJworRVhQRUNUX1NUQVRFIEFVVEhFTlRJQ0FURURfV0lUSF9VTlVTRURfQllURVMKK0VYUEVDVF9VTlVTRUQgJ0hlbGxvXHJcbicKK0VYUEVDVF9TVEFURSBBVVRIRU5USUNBVEVECmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS9hdXRoL2ZhaWwtYWZ0ZXItbi1hdHRlbXB0cy5hdXRoLXNjcmlwdCBiL2RidXMvdGVzdC9kYXRhL2F1dGgvZmFpbC1hZnRlci1uLWF0dGVtcHRzLmF1dGgtc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZWQzODYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS9hdXRoL2ZhaWwtYWZ0ZXItbi1hdHRlbXB0cy5hdXRoLXNjcmlwdApAQCAtMCwwICsxLDM0IEBACisjIyB0aGlzIHRlc3RzIHRoYXQgYWZ0ZXIgcmV0cnlpbmcgdG9vIG9mdGVuIHdlIGZhaWwKKworU0VSVkVSCitOT19DUkVERU5USUFMUworCisjIDEKK1NFTkQgJ0FVVEggRVhURVJOQUwgVVNFUklEX0hFWCcKK0VYUEVDVF9DT01NQU5EIFJFSkVDVEVECitFWFBFQ1RfU1RBVEUgV0FJVElOR19GT1JfSU5QVVQKKworIyAyCitTRU5EICdBVVRIIEVYVEVSTkFMIFVTRVJJRF9IRVgnCitFWFBFQ1RfQ09NTUFORCBSRUpFQ1RFRAorRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCisKKyMgMworU0VORCAnQVVUSCBFWFRFUk5BTCBVU0VSSURfSEVYJworRVhQRUNUX0NPTU1BTkQgUkVKRUNURUQKK0VYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVAorCisjIDQKK1NFTkQgJ0FVVEggRVhURVJOQUwgVVNFUklEX0hFWCcKK0VYUEVDVF9DT01NQU5EIFJFSkVDVEVECitFWFBFQ1RfU1RBVEUgV0FJVElOR19GT1JfSU5QVVQKKworIyA1CitTRU5EICdBVVRIIEVYVEVSTkFMIFVTRVJJRF9IRVgnCitFWFBFQ1RfQ09NTUFORCBSRUpFQ1RFRAorRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCisKKyMgNgorU0VORCAnQVVUSCBFWFRFUk5BTCBVU0VSSURfSEVYJworRVhQRUNUX0NPTU1BTkQgUkVKRUNURUQKK0VYUEVDVF9TVEFURSBORUVEX0RJU0NPTk5FQ1QKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL2F1dGgvZmFsbGJhY2suYXV0aC1zY3JpcHQgYi9kYnVzL3Rlc3QvZGF0YS9hdXRoL2ZhbGxiYWNrLmF1dGgtc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkODgwYzAKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS9hdXRoL2ZhbGxiYWNrLmF1dGgtc2NyaXB0CkBAIC0wLDAgKzEsMTcgQEAKKyMjIHRoaXMgdGVzdHMgdGhhdCBhIGNsaWVudCBjYW4gZmFsbGJhY2sgdG8gYSBzZWNvbmRhcnkgYXV0aCBtZWNoIAorCitDTElFTlQKKworIyMgV2lsbCB0cnkgRVhURVJOQUwgYnkgZGVmYXVsdCBmaXJzdCB3aXRob3V0IGZpcnN0IGNhbGxpbmcgQVVUSCBhbG9uZS4KKworRVhQRUNUX0NPTU1BTkQgQVVUSAorU0VORCAnUkVKRUNURUQgRVhURVJOQUwgREJVU19DT09LSUVfU0hBMSBEQlVTX1RFU1RfTk9ORVhJU1RFTlRfTUVDSCcKKworIyMgQW5kIHRoaXMgdGltZSB3ZSBnZXQgREJVU19DT09LSUVfU0hBMQorCitFWFBFQ1RfQ09NTUFORCBBVVRICisjIyBvZiBjb3Vyc2UgcmVhbCBEQlVTX0NPT0tJRV9TSEExIHdvdWxkIG5vdCBzZW5kIHRoaXMgaGVyZS4uLgorU0VORCAnT0sgMTIzNGRlYWRiZWVmJworCitFWFBFQ1RfQ09NTUFORCBCRUdJTgorRVhQRUNUX1NUQVRFIEFVVEhFTlRJQ0FURUQKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL2F1dGgvaW52YWxpZC1jb21tYW5kLWNsaWVudC5hdXRoLXNjcmlwdCBiL2RidXMvdGVzdC9kYXRhL2F1dGgvaW52YWxpZC1jb21tYW5kLWNsaWVudC5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzE3ZTdiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvYXV0aC9pbnZhbGlkLWNvbW1hbmQtY2xpZW50LmF1dGgtc2NyaXB0CkBAIC0wLDAgKzEsOCBAQAorIyMgdGhpcyB0ZXN0cyB0aGF0IHJlY2VpdmluZyBhIG5vbmV4aXN0ZW50IGNvbW1hbmQgaXMgaGFuZGxlZCBwcm9wZXJseQorIyMgYnkgYSBjbGllbnQKKworQ0xJRU5UCitFWFBFQ1RfQ09NTUFORCBBVVRICitTRU5EICdOT05FWElTVEVOVF9DT01NQU5EIGZvbyBiYXIgYmF6IGJsYWggYmxhaCcKK0VYUEVDVF9DT01NQU5EIEVSUk9SCitFWFBFQ1RfU1RBVEUgV0FJVElOR19GT1JfSU5QVVQKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL2F1dGgvaW52YWxpZC1jb21tYW5kLmF1dGgtc2NyaXB0IGIvZGJ1cy90ZXN0L2RhdGEvYXV0aC9pbnZhbGlkLWNvbW1hbmQuYXV0aC1zY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ5Y2I4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9kYXRhL2F1dGgvaW52YWxpZC1jb21tYW5kLmF1dGgtc2NyaXB0CkBAIC0wLDAgKzEsNyBAQAorIyMgdGhpcyB0ZXN0cyB0aGF0IHJlY2VpdmluZyBhIG5vbmV4aXN0ZW50IGNvbW1hbmQgaXMgaGFuZGxlZCBwcm9wZXJseQorIyMgYnkgYSBzZXJ2ZXIKKworU0VSVkVSCitTRU5EICdOT05FWElTVEVOVF9DT01NQU5EIGZvbyBiYXIgYmF6IGJsYWggYmxhaCcKK0VYUEVDVF9DT01NQU5EIEVSUk9SCitFWFBFQ1RfU1RBVEUgV0FJVElOR19GT1JfSU5QVVQKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL2F1dGgvaW52YWxpZC1oZXgtZW5jb2RpbmcuYXV0aC1zY3JpcHQgYi9kYnVzL3Rlc3QvZGF0YS9hdXRoL2ludmFsaWQtaGV4LWVuY29kaW5nLmF1dGgtc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMTVjNDMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS9hdXRoL2ludmFsaWQtaGV4LWVuY29kaW5nLmF1dGgtc2NyaXB0CkBAIC0wLDAgKzEsNiBAQAorIyMgdGhpcyB0ZXN0cyBhbiBpbnZhbGlkIGhleCBlbmNvZGluZyBmb2xsb3dlZCBieSBzdWNjZXNzZnVsIGF1dGhlbnRpY2F0aW9uCisKK1NFUlZFUgorU0VORCAnQVVUSCBFWFRFUk5BTCB3aWxseScKK0VYUEVDVF9DT01NQU5EIEVSUk9SCitFWFBFQ1RfU1RBVEUgV0FJVElOR19GT1JfSU5QVVQKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL2F1dGgvbWVjaGFuaXNtcy5hdXRoLXNjcmlwdCBiL2RidXMvdGVzdC9kYXRhL2F1dGgvbWVjaGFuaXNtcy5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTQ0NzkxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvYXV0aC9tZWNoYW5pc21zLmF1dGgtc2NyaXB0CkBAIC0wLDAgKzEsOCBAQAorIyMgdGhpcyB0ZXN0cyB0aGF0IHRoZSBzZXJ2ZXIgc2VuZHMgYSBsaXN0IG9mIG1lY2hhbmlzbXMKKyMjIGluIHJlc3BvbnNlIHRvIGJsYW5rIEFVVEgKKworU0VSVkVSCitTRU5EIEFVVEgKK0VYUEVDVF9DT01NQU5EIFJFSkVDVEVECitFWFBFQ1RfU1RBVEUgV0FJVElOR19GT1JfSU5QVVQKKwpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2Jhc2ljL2Jhc2ljLTEuY29uZiBiL2RidXMvdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9iYXNpYy9iYXNpYy0xLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlmNDFlOAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9iYXNpYy9iYXNpYy0xLmNvbmYKQEAgLTAsMCArMSwyNSBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPHVzZXI+bXlidXN1c2VyPC91c2VyPgorICA8bGlzdGVuPnVuaXg6cGF0aD0vZm9vL2JhcjwvbGlzdGVuPgorICA8bGlzdGVuPnRjcDpwb3J0PTEyMzQ8L2xpc3Rlbj4KKyAgPGluY2x1ZGVkaXI+YmFzaWMuZDwvaW5jbHVkZWRpcj4KKyAgPHNlcnZpY2VkaXI+L3Vzci9zaGFyZS9mb288L3NlcnZpY2VkaXI+CisgIDxpbmNsdWRlIGlnbm9yZV9taXNzaW5nPSJ5ZXMiPm5vbmV4aXN0ZW50LmNvbmY8L2luY2x1ZGU+CisgIDxwb2xpY3kgY29udGV4dD0iZGVmYXVsdCI+CisgICAgPGFsbG93IHVzZXI9IioiLz4KKyAgPC9wb2xpY3k+CisKKyAgPGxpbWl0IG5hbWU9Im1heF9pbmNvbWluZ19ieXRlcyI+NTAwMDwvbGltaXQ+ICAgCisgIDxsaW1pdCBuYW1lPSJtYXhfb3V0Z29pbmdfYnl0ZXMiPjUwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X21lc3NhZ2Vfc2l6ZSI+MzAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9InNlcnZpY2Vfc3RhcnRfdGltZW91dCI+NTAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJhdXRoX3RpbWVvdXQiPjYwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyI+NTA8L2xpbWl0PiAgCisgIDxsaW1pdCBuYW1lPSJtYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyI+ODA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyIj42NDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfcGVuZGluZ19zZXJ2aWNlX3N0YXJ0cyI+NjQ8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X25hbWVzX3Blcl9jb25uZWN0aW9uIj4yNTY8L2xpbWl0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2Jhc2ljL2Jhc2ljLTIuY29uZiBiL2RidXMvdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9iYXNpYy9iYXNpYy0yLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDllNzA3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9iYXNpYy9iYXNpYy0yLmNvbmYKQEAgLTAsMCArMSw1IEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorPGluY2x1ZGU+YmFzaWMtMS5jb25mPC9pbmNsdWRlPgorPC9idXNjb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2Jhc2ljL2Jhc2ljLmQvYmFzaWMuY29uZiBiL2RidXMvdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9iYXNpYy9iYXNpYy5kL2Jhc2ljLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEwOWQ3MQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9iYXNpYy9iYXNpYy5kL2Jhc2ljLmNvbmYKQEAgLTAsMCArMSwxMyBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPHVzZXI+bXlidXN1c2VyPC91c2VyPgorICA8bGlzdGVuPnVuaXg6cGF0aD0vZm9vL2JhcjwvbGlzdGVuPgorICA8bGlzdGVuPnRjcDpwb3J0PTEyMzQ8L2xpc3Rlbj4KKyAgPGluY2x1ZGVkaXI+YmFzaWMuZDwvaW5jbHVkZWRpcj4KKyAgPHNlcnZpY2VkaXI+L3Vzci9zaGFyZS9mb288L3NlcnZpY2VkaXI+CisgIDxpbmNsdWRlIGlnbm9yZV9taXNzaW5nPSJ5ZXMiPm5vbmV4aXN0ZW50LmNvbmY8L2luY2x1ZGU+CisgIDxwb2xpY3kgY29udGV4dD0iZGVmYXVsdCI+CisgICAgPGFsbG93IHVzZXI9IioiLz4KKyAgPC9wb2xpY3k+Cis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9lbnRpdGllcy9iYXNpYy5kL2Jhc2ljLmNvbmYgYi9kYnVzL3Rlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvZW50aXRpZXMvYmFzaWMuZC9iYXNpYy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMDlkNzEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvZW50aXRpZXMvYmFzaWMuZC9iYXNpYy5jb25mCkBAIC0wLDAgKzEsMTMgQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDx1c2VyPm15YnVzdXNlcjwvdXNlcj4KKyAgPGxpc3Rlbj51bml4OnBhdGg9L2Zvby9iYXI8L2xpc3Rlbj4KKyAgPGxpc3Rlbj50Y3A6cG9ydD0xMjM0PC9saXN0ZW4+CisgIDxpbmNsdWRlZGlyPmJhc2ljLmQ8L2luY2x1ZGVkaXI+CisgIDxzZXJ2aWNlZGlyPi91c3Ivc2hhcmUvZm9vPC9zZXJ2aWNlZGlyPgorICA8aW5jbHVkZSBpZ25vcmVfbWlzc2luZz0ieWVzIj5ub25leGlzdGVudC5jb25mPC9pbmNsdWRlPgorICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDxhbGxvdyB1c2VyPSIqIi8+CisgIDwvcG9saWN5PgorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvZW50aXRpZXMvZW50aXRpZXMtMS5jb25mIGIvZGJ1cy90ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2VudGl0aWVzL2VudGl0aWVzLTEuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDNjZWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2VudGl0aWVzL2VudGl0aWVzLTEuY29uZgpAQCAtMCwwICsxLDE0IEBACis8IS0tIFRoaXMgY29uZmlnIGZpbGUgY29udGFpbnMgWE1MIGVudGl0aWVzIC0tPgorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPHVzZXI+bXlidXN1c2VyPC91c2VyPgorICA8bGlzdGVuPnVuaXg6cGF0aD0vZm9vLyZsdDtiYXImZ3Q7PC9saXN0ZW4+CisgIDxsaXN0ZW4+dGNwOnBvcnQ9MTIzNDwvbGlzdGVuPgorICA8aW5jbHVkZWRpcj5iYXNpYy4mIzEwMDs8L2luY2x1ZGVkaXI+CisgIDxzZXJ2aWNlZGlyPi91c3IvJmFtcDtzaGFyZS9mb288L3NlcnZpY2VkaXI+CisgIDxpbmNsdWRlIGlnbm9yZV9taXNzaW5nPSJ5ZSYjMTE1OyI+bm9uZXhpc3RlbnQuY29uZiYjMTEwOzwvaW5jbHVkZT4KKyAgPHBvbGljeSBjb250ZXh0PSImIzEwMDtlZmF1bHQiPgorICAgIDxhbGxvdyB1c2VyPSIqIi8+CisgIDwvcG9saWN5PgorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvZW50aXRpZXMvZW50aXRpZXMtMi5jb25mIGIvZGJ1cy90ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2VudGl0aWVzL2VudGl0aWVzLTIuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmZhYmVhCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2VudGl0aWVzL2VudGl0aWVzLTIuY29uZgpAQCAtMCwwICsxLDUgQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+Cis8aW5jbHVkZT5lbnRpdGllcy0xLmNvbmY8L2luY2x1ZGU+Cis8L2J1c2NvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS9pbmNvbXBsZXRlLW1lc3NhZ2VzL21pc3NpbmctYm9keS5tZXNzYWdlIGIvZGJ1cy90ZXN0L2RhdGEvaW5jb21wbGV0ZS1tZXNzYWdlcy9taXNzaW5nLWJvZHkubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzhlOWVhCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvaW5jb21wbGV0ZS1tZXNzYWdlcy9taXNzaW5nLWJvZHkubWVzc2FnZQpAQCAtMCwwICsxLDE5IEBACisjIyBtZXNzYWdlIHRoYXQncyBtaXNzaW5nIGFuIGV4cGVjdGVkIGJvZHkKKworVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCitIRUFERVJfRklFTEQgSU5URVJGQUNFCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuRm9vJworSEVBREVSX0ZJRUxEIE1FTUJFUgorVFlQRSBTVFJJTkcKK1NUUklORyAnQmFyJworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKKworIyMgY3JlYXRlIHRoZSBib2R5LCB0aGVuIGNob3AgaXQgb2ZmCitTVEFSVF9MRU5HVEggQm9keQorVFlQRSBJTlQzMgorSU5UMzIgMzcKK0VORF9MRU5HVEggQm9keQorCitDSE9QIDgKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL2JhZHNlbGludXgtMS5jb25mIGIvZGJ1cy90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvYmFkc2VsaW51eC0xLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg1MmRlZAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL2JhZHNlbGludXgtMS5jb25mCkBAIC0wLDAgKzEsMTAgQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDx1c2VyPm15YnVzdXNlcjwvdXNlcj4KKyAgPGxpc3Rlbj51bml4OnBhdGg9L2Zvby9iYXI8L2xpc3Rlbj4KKyAgPGxpc3Rlbj50Y3A6cG9ydD0xMjM0PC9saXN0ZW4+CisgIDxpbmNsdWRlZGlyPmJhc2ljLmQ8L2luY2x1ZGVkaXI+CisgIDxzZXJ2aWNlZGlyPi91c3Ivc2hhcmUvZm9vPC9zZXJ2aWNlZGlyPgorICA8aW5jbHVkZSBzZWxpbnV4X3Jvb3RfcmVsYXRpdmU9ImpvbW9tYSI+YmxhaDwvaW5jbHVkZT4KKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvYmFkc2VsaW51eC0yLmNvbmYgYi9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9iYWRzZWxpbnV4LTIuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzNiOTVjCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvYmFkc2VsaW51eC0yLmNvbmYKQEAgLTAsMCArMSwxMCBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPHVzZXI+bXlidXN1c2VyPC91c2VyPgorICA8bGlzdGVuPnVuaXg6cGF0aD0vZm9vL2JhcjwvbGlzdGVuPgorICA8bGlzdGVuPnRjcDpwb3J0PTEyMzQ8L2xpc3Rlbj4KKyAgPGluY2x1ZGVkaXI+YmFzaWMuZDwvaW5jbHVkZWRpcj4KKyAgPHNlcnZpY2VkaXI+L3Vzci9zaGFyZS9mb288L3NlcnZpY2VkaXI+CisgIDxpbmNsdWRlIGlmX3NlbGludXhfZW5hYmxlZD0ibW9vIj5ibGFoPC9pbmNsdWRlPgorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9jaXJjdWxhci0xLmNvbmYgYi9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9jaXJjdWxhci0xLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFhODk1YQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL2NpcmN1bGFyLTEuY29uZgpAQCAtMCwwICsxLDQgQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorPGluY2x1ZGU+Y2lyY3VsYXItMS5jb25mPC9pbmNsdWRlPgorPC9idXNjb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvY2lyY3VsYXItMi5jb25mIGIvZGJ1cy90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvY2lyY3VsYXItMi5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YTdlNzgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9jaXJjdWxhci0yLmNvbmYKQEAgLTAsMCArMSw0IEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIiAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKzxpbmNsdWRlPmNpcmN1bGFyLTMuY29uZjwvaW5jbHVkZT4KKzwvYnVzY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL2NpcmN1bGFyLTMuY29uZiBiL2RidXMvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL2NpcmN1bGFyLTMuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2UzNTRkCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvY2lyY3VsYXItMy5jb25mCkBAIC0wLDAgKzEsNCBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+Cis8aW5jbHVkZT5jaXJjdWxhci0yLmNvbmY8L2luY2x1ZGU+Cis8L2J1c2NvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9ub3Qtd2VsbC1mb3JtZWQuY29uZiBiL2RidXMvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL25vdC13ZWxsLWZvcm1lZC5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNTljYmMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9ub3Qtd2VsbC1mb3JtZWQuY29uZgpAQCAtMCwwICsxLDUgQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDx1c2VyPm15YnVzdXNlcjwvZm9vPgorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy90cnVuY2F0ZWQtZmlsZS5jb25mIGIvZGJ1cy90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvdHJ1bmNhdGVkLWZpbGUuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGQ2MDg4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvdHJ1bmNhdGVkLWZpbGUuY29uZgpAQCAtMCwwICsxLDkgQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDx1c2VyPm15YnVzdXNlcjwvdXNlcj4KKyAgPGxpc3Rlbj51bml4OnBhdGg9L2Zvby9iYXI8L2xpc3Rlbj4KKyAgPGxpc3Rlbj50Y3A6cG9ydD0xMjM0PC9saXN0ZW4+CisgIDxpbmNsdWRlZGlyPmJhc2ljLmQ8L2luY2x1ZGVkaXI+CisgIDxzZXJ2aWNlZGlyPi91c3Ivc2hhcmUvZm9vPC9zZXJ2aWNlZGlyPgorICA8aW5jbHVkZSBpZ25vcmVfbWlzc2luZz0ieQpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9hcnJheS1vZi1uaWwubWVzc2FnZSBiL2RidXMvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYXJyYXktb2YtbmlsLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE5N2ExMwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYXJyYXktb2YtbmlsLm1lc3NhZ2UKQEAgLTAsMCArMSwzMSBAQAorIyBNZXNzYWdlIHdpdGggYW4gYXJyYXkgb2YgTklMIChub3QgYWxsb3dlZCkKKworVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCisKK0hFQURFUl9GSUVMRCBJTlRFUkZBQ0UKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5Gb28nCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdCYXInCitIRUFERVJfRklFTEQgUEFUSAorVFlQRSBPQkpFQ1RfUEFUSCAKK09CSkVDVF9QQVRIICcvZm9vJworCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorCitTVEFSVF9MRU5HVEggQm9keQorVFlQRSBBUlJBWQorVFlQRSBOSUwKK1VJTlQzMiA1CisKKyMjIHdlIHdhbnQgaXQgdG8gZmFpbCBiZWNhdXNlIG9mIHR5cGUgbmlsLCBub3QgYmVjYXVzZSB0aGUgbGVuZ3RoIGlzIG5vIGdvb2QKKyMjIHNvIHBhZCBvdXQgdGhlIG1lc3NhZ2Ugd2l0aCA1IGJ5dGVzCitCWVRFIDEKK0JZVEUgMgorQllURSAzCitCWVRFIDQKK0JZVEUgNQorCitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYXJyYXktd2l0aC1taXhlZC10eXBlcy5tZXNzYWdlIGIvZGJ1cy90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9hcnJheS13aXRoLW1peGVkLXR5cGVzLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVhMmQxZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYXJyYXktd2l0aC1taXhlZC10eXBlcy5tZXNzYWdlCkBAIC0wLDAgKzEsNTIgQEAKKyMgTWVzc2FnZSB3aXRoIGFuIGFycmF5IG9mIGFycmF5IHdoZXJlIHRoZSBjaGlsZCBhcnJheXMgYXJlIG9mCisjIGRpZmZlcmVudCB0eXBlcworCitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKKworSEVBREVSX0ZJRUxEIElOVEVSRkFDRQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkZvbycKK0hFQURFUl9GSUVMRCBNRU1CRVIKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ0JhcicKK0hFQURFUl9GSUVMRCBQQVRICitUWVBFIE9CSkVDVF9QQVRICitPQkpFQ1RfUEFUSCAnL2ZvbycKKworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKKworU1RBUlRfTEVOR1RIIEJvZHkKKworVFlQRSBBUlJBWQorVFlQRSBBUlJBWQorVFlQRSBVSU5UMzIKKworTEVOR1RIIEFycmF5CitTVEFSVF9MRU5HVEggQXJyYXkKKworIyMgYXJyYXkgb2YgdWludDMyCitMRU5HVEggU3ViQXJyYXkxCitTVEFSVF9MRU5HVEggU3ViQXJyYXkxCitVSU5UMzIgMQorVUlOVDMyIDIKK1VJTlQzMiAzCitFTkRfTEVOR1RIIFN1YkFycmF5MQorCisjIyBhcnJheSBvZiB1aW50MzIKK0xFTkdUSCBTdWJBcnJheTIKK1NUQVJUX0xFTkdUSCBTdWJBcnJheTIKK1VJTlQzMiA0CitVSU5UMzIgNQorRU5EX0xFTkdUSCBTdWJBcnJheTIKKworIyMgYXJyYXkgb2YgYm9vbGVhbgorTEVOR1RIIFN1YkFycmF5MworU1RBUlRfTEVOR1RIIFN1YkFycmF5MworQk9PTEVBTiBmYWxzZQorQk9PTEVBTiB0cnVlCitFTkRfTEVOR1RIIFN1YkFycmF5MworCitFTkRfTEVOR1RIIEFycmF5CisKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtYm9vbGVhbi1hcnJheS5tZXNzYWdlIGIvZGJ1cy90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtYm9vbGVhbi1hcnJheS5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MDAwYWYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1ib29sZWFuLWFycmF5Lm1lc3NhZ2UKQEAgLTAsMCArMSwyNyBAQAorIyMgYSBtZXNzYWdlIHdpdGggYW4gaW52YWxpZCBib29sZWFuIGFycmF5CisKKyMjIFZBTElEX0hFQURFUiBpbmNsdWRlcyBhIExFTkdUSCBIZWFkZXIgYW5kIExFTkdUSCBCb2R5CitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKKworSEVBREVSX0ZJRUxEIElOVEVSRkFDRQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkZvbycKK0hFQURFUl9GSUVMRCBNRU1CRVIKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ0JhcicKK0hFQURFUl9GSUVMRCBQQVRICitUWVBFIE9CSkVDVF9QQVRICitPQkpFQ1RfUEFUSCAnL2ZvbycKKworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKKworU1RBUlRfTEVOR1RIIEJvZHkKK1RZUEUgQVJSQVkKK1RZUEUgQk9PTEVBTgorQUxJR04gNAorSU5UMzIgMworQllURSAwCitCWVRFIDEKK0JZVEUgMworRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1ib29sZWFuLm1lc3NhZ2UgYi9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1ib29sZWFuLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkwMjZkYgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYmFkLWJvb2xlYW4ubWVzc2FnZQpAQCAtMCwwICsxLDIyIEBACisjIyBhIG1lc3NhZ2Ugd2l0aCBhbiBpbnZhbGlkIGJvb2xlYW4gdmFsdWUKKworIyMgVkFMSURfSEVBREVSIGluY2x1ZGVzIGEgTEVOR1RIIEhlYWRlciBhbmQgTEVOR1RIIEJvZHkKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorCitIRUFERVJfRklFTEQgSU5URVJGQUNFCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuRm9vJworSEVBREVSX0ZJRUxEIE1FTUJFUgorVFlQRSBTVFJJTkcKK1NUUklORyAnQmFyJworSEVBREVSX0ZJRUxEIFBBVEgKK1RZUEUgT0JKRUNUX1BBVEgKK09CSkVDVF9QQVRIICcvZm9vJworCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorCitTVEFSVF9MRU5HVEggQm9keQorVFlQRSBCT09MRUFOCitCWVRFIDMKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtZW5kaWFuLm1lc3NhZ2UgYi9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1lbmRpYW4ubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTc5YmFhCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtZW5kaWFuLm1lc3NhZ2UKQEAgLTAsMCArMSwyNSBAQAorIyMgbWVzc2FnZSB3aXRoIGludmFsaWQgZW5kaWFubmVzcyB0YWcKKworQllURSAnaScKK0JZVEUgMQorQllURSAwCitCWVRFIDAKKworTEVOR1RIIEhlYWRlcgorTEVOR1RIIEJvZHkKKworSEVBREVSX0ZJRUxEIElOVEVSRkFDRQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkZvbycKK0hFQURFUl9GSUVMRCBNRU1CRVIKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ0JhcicKK0hFQURFUl9GSUVMRCBQQVRICitUWVBFIE9CSkVDVF9QQVRICitPQkpFQ1RfUEFUSCAnL2ZvbycKKworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKKworU1RBUlRfTEVOR1RIIEJvZHkKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtaGVhZGVyLWZpZWxkLWFsaWdubWVudC5tZXNzYWdlIGIvZGJ1cy90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtaGVhZGVyLWZpZWxkLWFsaWdubWVudC5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYzBkN2UKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1oZWFkZXItZmllbGQtYWxpZ25tZW50Lm1lc3NhZ2UKQEAgLTAsMCArMSwzOCBAQAorIyMgbGFzdCBmaWVsZCBpbmNvcnJlY3RseSBhbGlnbmVkIHRvIDQgYnl0ZXMKKworIyMgVkFMSURfSEVBREVSIGluY2x1ZGVzIGEgTEVOR1RIIEhlYWRlciBhbmQgTEVOR1RIIEJvZHkKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorCitIRUFERVJfRklFTEQgSU5URVJGQUNFCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuRm9vJworCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdCYXInCisKK0hFQURFUl9GSUVMRCBQQVRICitUWVBFIE9CSkVDVF9QQVRICitPQkpFQ1RfUEFUSCAnL2ZvbycKKworSEVBREVSX0ZJRUxEIFVOS05PV04KK1RZUEUgU1RSSU5HCitTVFJJTkcgJ2EnCisKK0FMSUdOIDQKKworSEVBREVSX0ZJRUxEIFVOS05PV04KK1RZUEUgQVJSQVkKK1RZUEUgQllURQorQUxJR04gNAorTEVOR1RIIFRoaXNCeXRlQXJyYXkKK1NUQVJUX0xFTkdUSCBUaGlzQnl0ZUFycmF5CitCWVRFIDEKK0JZVEUgMgorRU5EX0xFTkdUSCBUaGlzQnl0ZUFycmF5CisKKworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKK1NUQVJUX0xFTkdUSCBCb2R5CitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYm9vbGVhbi1oYXMtbm8tdmFsdWUubWVzc2FnZS1yYXcgYi9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2Jvb2xlYW4taGFzLW5vLXZhbHVlLm1lc3NhZ2UtcmF3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYjE1YzgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2Jvb2xlYW4taGFzLW5vLXZhbHVlLm1lc3NhZ2UtcmF3CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvbG9jYWwtbmFtZXNwYWNlLm1lc3NhZ2UgYi9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2xvY2FsLW5hbWVzcGFjZS5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNzIwMTgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2xvY2FsLW5hbWVzcGFjZS5tZXNzYWdlCkBAIC0wLDAgKzEsMjEgQEAKKyMjIGEgbWVzc2FnZSB0aGF0IGlzIGluIHRoZSBvcmcuZnJlZWRlc2t0b3AuTG9jYWwuIG5hbWVzcGFjZSBhbmQgdGh1cworIyMgaW52YWxpZAorCisjIyBWQUxJRF9IRUFERVIgaW5jbHVkZXMgYSBMRU5HVEggSGVhZGVyIGFuZCBMRU5HVEggQm9keQorVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCisKK0hFQURFUl9GSUVMRCBJTlRFUkZBQ0UKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5EQnVzLkxvY2FsJworSEVBREVSX0ZJRUxEIE1FTUJFUgorVFlQRSBTVFJJTkcKK1NUUklORyAnRGlzY29ubmVjdGVkJworSEVBREVSX0ZJRUxEIFBBVEgKK1RZUEUgT0JKRUNUX1BBVEgKK09CSkVDVF9QQVRIICcvZm9vJworCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorCitTVEFSVF9MRU5HVEggQm9keQorRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL25vLWRvdC1pbi1uYW1lLm1lc3NhZ2UgYi9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL25vLWRvdC1pbi1uYW1lLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ2MzE3YQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvbm8tZG90LWluLW5hbWUubWVzc2FnZQpAQCAtMCwwICsxLDE5IEBACisjIyBhIG1lc3NhZ2Ugd2l0aCBkb3RsZXNzIGludGVyZmFjZQorCisjIyBWQUxJRF9IRUFERVIgaW5jbHVkZXMgYSBMRU5HVEggSGVhZGVyIGFuZCBMRU5HVEggQm9keQorVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCisKK0hFQURFUl9GSUVMRCBJTlRFUkZBQ0UKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ05vRG90SW5IZXJlJworSEVBREVSX0ZJRUxEIE1FTUJFUgorVFlQRSBTVFJJTkcKK1NUUklORyAnQmFyJworSEVBREVSX0ZJRUxEIFBBVEgKK1RZUEUgT0JKRUNUX1BBVEgKK09CSkVDVF9QQVRIICcvZm9vJworCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9ub3QtbnVsLWhlYWRlci1wYWRkaW5nLm1lc3NhZ2UgYi9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL25vdC1udWwtaGVhZGVyLXBhZGRpbmcubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTg0NmRhCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9ub3QtbnVsLWhlYWRlci1wYWRkaW5nLm1lc3NhZ2UKQEAgLTAsMCArMSwyNSBAQAorIyMgaGFzIG9uZSBub24tbnVsIGJ5dGUgaW4gaGVhZGVyIHBhZGRpbmcKKworIyMgVkFMSURfSEVBREVSIGluY2x1ZGVzIGEgTEVOR1RIIEhlYWRlciBhbmQgTEVOR1RIIEJvZHkKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorCitIRUFERVJfRklFTEQgSU5URVJGQUNFCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuRm9vJworSEVBREVSX0ZJRUxEIE1FTUJFUgorVFlQRSBTVFJJTkcKK1NUUklORyAnQmFyJworSEVBREVSX0ZJRUxEIFBBVEgKK1RZUEUgT0JKRUNUX1BBVEgKK09CSkVDVF9QQVRIICcvZm9vJworCitIRUFERVJfRklFTEQgVU5LTk9XTgorVFlQRSBTVFJJTkcKK1NUUklORyAnYScKK0FMSUdOIDgKKyMjIGtpbGwgYSBwYWRkaW5nIGJ5dGUgYW5kIHJlcGxhY2UgaXQKK0NIT1AgMQorQllURSAncScKK0VORF9MRU5HVEggSGVhZGVyCitTVEFSVF9MRU5HVEggQm9keQorRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL292ZXJsb25nLW5hbWUubWVzc2FnZSBiL2RidXMvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvb3ZlcmxvbmctbmFtZS5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZjkwNzkKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL292ZXJsb25nLW5hbWUubWVzc2FnZQpAQCAtMCwwICsxLDIwIEBACisjIyBhIG1lc3NhZ2Ugd2l0aCB0b28tbG9uZyBuYW1lIGZpZWxkCisKKyMjIFZBTElEX0hFQURFUiBpbmNsdWRlcyBhIExFTkdUSCBIZWFkZXIgYW5kIExFTkdUSCBCb2R5CitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKK0hFQURFUl9GSUVMRCBJTlRFUkZBQ0UKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mb28uYmFyLnRoaXMuaXMucmVhbGx5LmxvbmcgMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgMTggMTkgMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcgMjggMjkgMzAgMzEgMzIgMzMgMzQgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNDUgNDYgNDcgNDggNDkgNTAgNTEgNTIgNTMgNTQgNTUgNTYgNTcgNTggNTkgNjAgNjEgNjIgNjMgNjQgNjUgNjYgNjcgNjggNjkgNzAgNzEgNzIgNzMgNzQgNzUgNzYgNzcgNzggNzkgODAgODEgODIgODMgODQgODUgODYgODcgODggODkgOTAgOTEgOTIgOTMgOTQgOTUgOTYgOTcgOTggOTkgMTAwIDEwMSAxMDIgMTAzIDEwNCAxMDUgMTA2IDEwNyAxMDggMTA5IDExMCAxMTEgMTEyIDExMyAxMTQgMTE1IDExNiAxMTcgMTE4IDExOSAxMjAgMTIxIDEyMiAxMjMgMTI0IDEyNSAxMjYgMTI3IDEyOCAxMjkgMTMwIDEzMSAxMzIgMTMzIDEzNCAxMzUgMTM2IDEzNyAxMzggMTM5IDE0MCAxNDEgMTQyIDE0MyAxNDQgMTQ1IDE0NiAxNDcgMTQ4IDE0OSAxNTAgMTUxIDE1MiAxNTMgMTU0IDE1NSAxNTYgMTU3IDE1OCAxNTkgMTYwIDE2MSAxNjIgMTYzIDE2NCAxNjUgMTY2IDE2NyAxNjggMTY5IDE3MCAxNzEgMTcyIDE3MyAxNzQgMTc1IDE3NiAxNzcgMTc4IDE3OSAxODAgMTgxIDE4MiAxODMgMTg0IDE4NSAxODYgMTg3IDE4OCAxODkgMTkwIDE5MSAxOTIgMTkzIDE5NCAxOTUgMTk2IDE5NyAxOTggMTk5IDIwMCcKKworSEVBREVSX0ZJRUxEIE1FTUJFUgorVFlQRSBTVFJJTkcKK1NUUklORyAnQmFyJworCitIRUFERVJfRklFTEQgUEFUSAorVFlQRSBPQkpFQ1RfUEFUSAorT0JKRUNUX1BBVEggJy9mb28nCisKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCitTVEFSVF9MRU5HVEggQm9keQorRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL3Rvby1saXR0bGUtaGVhZGVyLXBhZGRpbmcubWVzc2FnZSBiL2RidXMvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvdG9vLWxpdHRsZS1oZWFkZXItcGFkZGluZy5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ODgxNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL3Rvby1saXR0bGUtaGVhZGVyLXBhZGRpbmcubWVzc2FnZQpAQCAtMCwwICsxLDI0IEBACisjIyBoYXMgb25lIGJ5dGUgbWlzc2luZyBmcm9tIGhlYWRlciBwYWRkaW5nCisKKyMjIFZBTElEX0hFQURFUiBpbmNsdWRlcyBhIExFTkdUSCBIZWFkZXIgYW5kIExFTkdUSCBCb2R5CitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKKworSEVBREVSX0ZJRUxEIElOVEVSRkFDRQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkZvbycKK0hFQURFUl9GSUVMRCBNRU1CRVIKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ0JhcicKK0hFQURFUl9GSUVMRCBQQVRICitUWVBFIE9CSkVDVF9QQVRICitPQkpFQ1RfUEFUSCAnL2ZvbycKKworSEVBREVSX0ZJRUxEIFVOS05PV04KK1RZUEUgU1RSSU5HCitTVFJJTkcgJ2EnCitBTElHTiA4CisjIyBraWxsIGEgcGFkZGluZyBieXRlCitDSE9QIDEKK0VORF9MRU5HVEggSGVhZGVyCitTVEFSVF9MRU5HVEggQm9keQorRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL3Rvby1tdWNoLWhlYWRlci1wYWRkaW5nLWJ5LWZhci5tZXNzYWdlIGIvZGJ1cy90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy90b28tbXVjaC1oZWFkZXItcGFkZGluZy1ieS1mYXIubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDJiZTNhCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy90b28tbXVjaC1oZWFkZXItcGFkZGluZy1ieS1mYXIubWVzc2FnZQpAQCAtMCwwICsxLDI2IEBACisjIyBoYXMgb25lIGJ5dGUgZXh0cmEgaGVhZGVyIHBhZGRpbmcKKworIyMgVkFMSURfSEVBREVSIGluY2x1ZGVzIGEgTEVOR1RIIEhlYWRlciBhbmQgTEVOR1RIIEJvZHkKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorCitIRUFERVJfRklFTEQgSU5URVJGQUNFCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuRm9vJworSEVBREVSX0ZJRUxEIE1FTUJFUgorVFlQRSBTVFJJTkcKK1NUUklORyAnQmFyJworSEVBREVSX0ZJRUxEIFBBVEgKK1RZUEUgT0JKRUNUX1BBVEgKK09CSkVDVF9QQVRIICcvZm9vJworCitIRUFERVJfRklFTEQgVU5LTk9XTgorVFlQRSBTVFJJTkcKK1NUUklORyAnYScKK0FMSUdOIDgKK0JZVEUgMAorQUxJR04gOAorQllURSAwCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy90b28tbXVjaC1oZWFkZXItcGFkZGluZy5tZXNzYWdlIGIvZGJ1cy90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy90b28tbXVjaC1oZWFkZXItcGFkZGluZy5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMWMyOTQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL3Rvby1tdWNoLWhlYWRlci1wYWRkaW5nLm1lc3NhZ2UKQEAgLTAsMCArMSwyMyBAQAorIyMgaGFzIG9uZSBieXRlIGV4dHJhIGhlYWRlciBwYWRkaW5nCisKKyMjIFZBTElEX0hFQURFUiBpbmNsdWRlcyBhIExFTkdUSCBIZWFkZXIgYW5kIExFTkdUSCBCb2R5CitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKKworSEVBREVSX0ZJRUxEIElOVEVSRkFDRQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkZvbycKK0hFQURFUl9GSUVMRCBNRU1CRVIKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ0JhcicKK0hFQURFUl9GSUVMRCBQQVRICitUWVBFIE9CSkVDVF9QQVRICitPQkpFQ1RfUEFUSCAnL2ZvbycKKworSEVBREVSX0ZJRUxEIFVOS05PV04KK1RZUEUgU1RSSU5HCitTVFJJTkcgJ2EnCitBTElHTiA4CitCWVRFIDAKK0VORF9MRU5HVEggSGVhZGVyCitTVEFSVF9MRU5HVEggQm9keQorRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL3Rvby1zaG9ydC1kaWN0Lm1lc3NhZ2UgYi9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL3Rvby1zaG9ydC1kaWN0Lm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZjM2NjNQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvdG9vLXNob3J0LWRpY3QubWVzc2FnZQpAQCAtMCwwICsxLDI4IEBACisjIE1lc3NhZ2Ugd2l0aCBsb3RzIG9mIGRpZmZlcmVudCBhcmd1bWVudCB0eXBlcworCitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKKworSEVBREVSX0ZJRUxEIElOVEVSRkFDRQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkZvbycKK0hFQURFUl9GSUVMRCBNRU1CRVIKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ0JhcicKK0hFQURFUl9GSUVMRCBQQVRICitUWVBFIE9CSkVDVF9QQVRICitPQkpFQ1RfUEFUSCAnL2ZvbycKKworQUxJR04gOAorCitFTkRfTEVOR1RIIEhlYWRlcgorCitTVEFSVF9MRU5HVEggQm9keQorVFlQRSBESUNUCitMRU5HVEggRGljdAorU1RBUlRfTEVOR1RIIERpY3QKK1NUUklORyAndWludDMyJworVFlQRSBVSU5UMzIKK1VJTlQzMiAweDg3NjU0MzIKK1NUUklORyAndWludDMyJworRU5EX0xFTkdUSCBEaWN0CitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL2ludmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlTm9FeGVjLnNlcnZpY2UuaW4gYi9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vRXhlYy5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OTIxNGUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vRXhlYy5zZXJ2aWNlLmluCkBAIC0wLDAgKzEsNCBAQAorW0QtQlVTIFNlcnZpY2VdCitOYW1lPW9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vRXhlYworVXNlcj1hbnlyYW5kb211c2VyCisKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL2ludmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlTm9TZXJ2aWNlLnNlcnZpY2UuaW4gYi9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vU2VydmljZS5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MjJmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vU2VydmljZS5zZXJ2aWNlLmluCkBAIC0wLDAgKzEsNCBAQAorW0QtQlVTIFNlcnZpY2VdCitFeGVjPUBEQlVTX1RFU1RfRVhFQ0AvdGVzdC1zZXJ2aWNlQEVYRUVYVEAKK1VzZXI9YW55cmFuZG9tdXNlcgorCmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vVXNlci5zZXJ2aWNlLmluIGIvZGJ1cy90ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb1VzZXIuc2VydmljZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTFlMDA5Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb1VzZXIuc2VydmljZS5pbgpAQCAtMCwwICsxLDMgQEAKK1tELUJVUyBTZXJ2aWNlXQorTmFtZT1vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb1VzZXIKK0V4ZWM9QERCVVNfVEVTVF9FWEVDQC90ZXN0LXNlcnZpY2VARVhFRVhUQApkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvc2hhLTEvUmVhZG1lLnR4dCBiL2RidXMvdGVzdC9kYXRhL3NoYS0xL1JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZjYTNmOQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9kYXRhL3NoYS0xL1JlYWRtZS50eHQKQEAgLTAsMCArMSw4MyBAQAorVGVzdCBzdWl0ZSBmcm9tIGh0dHA6Ly9jc3JjLm5pc3QuZ292L2NyeXB0dmFsL3Nocy5odG1sCisKKwkJCQlTYW1wbGUgVmVjdG9ycyBmb3IgU0hBLTEgVGVzdGluZworCisJVGhpcyBmaWxlIGRlc2NyaWJlcyB0ZXN0cyBhbmQgdmVjdG9ycyB0aGF0IGNhbiBiZSB1c2VkIGluIHZlcmlmeWluZyB0aGUgY29ycmVjdG5lc3Mgb2YgCithbiBTSEEtMSBpbXBsZW1lbnRhdGlvbi4gIEhvd2V2ZXIsIHVzZSBvZiB0aGVzZSB2ZWN0b3JzIGRvZXMgbm90IHRha2UgdGhlIHBsYWNlIG9mIHZhbGlkYXRpb24gCitvYnRhaW5lZCB0aHJvdWdoIHRoZSBDcnlwdG9ncmFwaGljIE1vZHVsZSBWYWxpZGF0aW9uIFByb2dyYW0uCisKKwlUaGVyZSBhcmUgdGhyZWUgYXJlYXMgb2YgdGhlIFNlY3VyZSBIYXNoIFN0YW5kYXJkIGZvciB3aGljaCB0ZXN0IHZlY3RvcnMgYXJlIHN1cHBsaWVkOgorc2hvcnQgbWVzc2FnZXMgb2YgdmFyeWluZyBsZW5ndGgsIHNlbGVjdGVkIGxvbmcgbWVzc2FnZXMsIGFuZCBwc2V1ZG9yYW5kb21seSBnZW5lcmF0ZWQgbWVzc2FnZXMuCitTaW5jZSBpdCBpcyBwb3NzaWJsZSBmb3IgYW4gaW1wbGVtZW50YXRpb24gdG8gY29ycmVjdGx5IGhhbmRsZSB0aGUgaGFzaGluZyBvZiBieXRlLW9yaWVudGVkCittZXNzYWdlcyAoYW5kIG5vdCBtZXNzYWdlcyBvZiBhIG5vbi1ieXRlIGxlbmd0aCksIHRoZSBTSFMgdGVzdHMgZWFjaCBjb21lIGluIHR3byBmbGF2b3JzLiAgRm9yCitib3RoIGJ5dGUgb3JpZW50ZWQgYW5kIGJpdCBvcmllbnRlZCBtZXNzYWdlcywgdGhlIG1lc3NhZ2UgbGVuZ3RocyBhcmUgZ2l2ZW4gaW4gYml0cy4KKworVHlwZSBJIFRlc3Q6IE1lc3NhZ2VzIG9mIFZhcnlpbmcgTGVuZ3RoCisKKwlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU0hTIG11c3QgYmUgYWJsZSB0byBjb3JyZWN0bHkgZ2VuZXJhdGUgbWVzc2FnZSBkaWdlc3RzIGZvcgorbWVzc2FnZXMgb2YgYXJiaXRyYXJ5IGxlbmd0aC4gIFRoaXMgZnVuY3Rpb25hbGl0eSBjYW4gYmUgdGVzdGVkIGJ5IHN1cHBseWluZyB0aGUgaW1wbGVtZW50YXRpb24KK3dpdGggMTAyNSBwc2V1ZG9yYW5kb21seSBnZW5lcmF0ZWQgbWVzc2FnZXMgd2l0aCBsZW5ndGhzIGZyb20gMCB0byAxMDI0IGJpdHMgKGZvciBhbiBpbXBsZW1lbnRhdGlvbgordGhhdCBvbmx5IGhhc2hlcyBieXRlLW9yaWVudGVkIGRhdGEgY29ycmVjdGx5LCAxMjkgbWVzc2FnZXMgb2YgbGVuZ3RoIDAsIDgsIDE2LCAyNCwuLi4sMTAyNCBiaXRzCit3aWxsIGJlIHN1cHBsaWVkKS4KKworVHlwZSBJSSBUZXN0OiBTZWxlY3RlZCBMb25nIE1lc3NhZ2VzCisKKwlBZGRpdGlvbmFsIHRlc3Rpbmcgb2YgYW4gaW1wbGVtZW50YXRpb24gY2FuIGJlIHBlcmZvcm1lZCBieSB0ZXN0aW5nIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uCitjYW4gY29ycmVjdGx5IGdlbmVyYXRlIGRpZ2VzdHMgZm9yIGxvbmdlciBtZXNzYWdlcy4gIEEgbGlzdCBvZiAxMDAgbWVzc2FnZXMsIGVhY2ggb2YgbGVuZ3RoID4gMTAyNCwKK2lzIHN1cHBsaWVkLiAgVGhlc2UgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoZSBoYXNoaW5nIG9mIGxvbmdlciBtZXNzYWdlIGxlbmd0aHMuICBGb3IgYml0IG9yaWVudGVkCit0ZXN0aW5nIHRoZSBtZXNzYWdlcyBhcmUgZnJvbSAxMDI1IHRvIDEwMzQyNSBiaXRzIGxvbmcgKGxlbmd0aD0xMDI1K2kqMTAyNCwgd2hlcmUgMDw9aTwxMDApLiAgRm9yCitieXRlIG9yaWVudGVkIHRlc3RpbmcgdGhlIG1lc3NhZ2VzIGFyZSBmcm9tIDEwMzIgdG8gMTAzNDMyIChsZW5ndGg9MTAzMitpKjEwMjQsIHdoZXJlIDA8PWk8MTAwKS4KKworVHlwZSBJSUkgVGVzdDogUHNldWRvcmFuZG9tbHkgR2VuZXJhdGVkIE1lc3NhZ2VzCisKKwlUaGlzIHRlc3QgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBpbXBsZW1lbnRhdGlvbiBjYW4gY29tcHV0ZSBtZXNzYWdlIGRpZ2VzdHMgZm9yIG1lc3NhZ2VzCit0aGF0IGFyZSBnZW5lcmF0ZWQgdXNpbmcgYSBnaXZlbiBzZWVkLiAgQSBzZXF1ZW5jZSBvZiAxMDAgbWVzc2FnZSBkaWdlc3RzIGlzIGdlbmVyYXRlZCB1c2luZyB0aGlzCitzZWVkLiAgVGhlIGRpZ2VzdHMgYXJlIGdlbmVyYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBwc2V1ZG9jb2RlOgorCitwcm9jZWR1cmUgTW9udGVDYXJsbyhzdHJpbmcgU0VFRCkKK3sKKwlpbnRlZ2VyIGksIGosIGE7CisJc3RyaW5nCU07CisKKwlNIDo9IFNFRUQ7CisJZm9yIGogPSAwIHRvIDk5IGRvIHsKKwkJZm9yIGkgPSAxIHRvIDUwMDAwIGRvIHsKKwkJCWZvciBhID0gMSB0byAoai80KjggKyAyNCkgZG8gTSA6PSBNIHx8IJIwkjsJLyqRMCcgaXMgdGhlIGJpbmFyeSB6ZXJvIGJpdC4gKi8KKwkJCU0gOj0gTSB8fCBpOyAJLyogSGVyZSwgdGhlIHZhbHVlIGZvciCRaZIgaXMgZXhwcmVzc2VkIGFzIGEgMzItYml0IHdvcmQKKwkJCQkJICAgYW5kIGNvbmNhdGVuYXRlZCB3aXRoIJFNki4gVGhlIGZpcnN0IGJpdAorCQkJCQkgICBjb25jYXRlbmF0ZWQgd2l0aCCRTZIgaXMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mCisJCQkJCSAgIHRoaXMgMzItYml0IHdvcmQuICovCisJCQlNIDo9IFNIQShNKTsKKwkJCX0KKwkJcHJpbnQoTSk7CisJCX0KKwl9CisKK05PVEU6IEluIHRoZSBhYm92ZSBwcm9jZWR1cmUsIHx8IGRlbm90ZXMgY29uY2F0ZW5hdGlvbi4gQWxzbywgTSB8fCBpIGRlbm90ZXMgYXBwZW5kaW5nIHRoZSAzMi1iaXQKK3dvcmQgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSCRaZIsIGFzIGRlZmluZWQgaW4gc2VjdGlvbiAyIG9mIHRoZSBTSFMuICBXaXRoaW4gdGhlIHByb2NlZHVyZSwgTSBpcyBhIHN0cmluZworb2YgdmFyaWFibGUgbGVuZ3RoLiBUaGUgaW5pdGlhbCBsZW5ndGggb2YgNDE2IGJpdHMgZW5zdXJlcyB0aGF0IHRoZSBsZW5ndGggb2YgTSBuZXZlciBleGNlZWRzIDUxMiBiaXRzCitkdXJpbmcgZXhlY3V0aW9uIG9mIHRoZSBhYm92ZSBwcm9jZWR1cmUsIGFuZCBpdCBlbnN1cmVzIHRoYXQgbWVzc2FnZXMgd2lsbCBiZSBvZiBhIGJ5dGUgbGVuZ3RoLiAgRWFjaAorZWxlbWVudCBwcmludGVkIHNob3VsZCBiZSAxNjAgYml0cyBpbiBsZW5ndGguCisKKworRmlsZSBmb3JtYXRzOgorCitUaGVyZSBhcmUgdHdvIGZpbGVzIGluY2x1ZGVkIGZvciBlYWNoIHRlc3QgdHlwZSAoYml0LW9yaWVudGVkIGFuZCBieXRlLW9yaWVudGVkKS4gIE9uZSBmaWxlIGNvbnRhaW5zCit0aGUgbWVzc2FnZXMgYW5kIHRoZSBvdGhlciBmaWxlIGNvbnRhaW5zIHRoZSBoYXNoZXMuCisKK1RoZSBtZXNzYWdlIGZpbGVzIHByb3ZpZGVkIHVzZSAiY29tcGFjdCBzdHJpbmdzIiB0byBzdG9yZSB0aGUgbWVzc2FnZSB2YWx1ZXMuICBDb21wYWN0IHN0cmluZ3MgYXJlIAordXNlZCB0byByZXByZXNlbnRlZCB0aGUgbWVzc2FnZXMgaW4gYSBjb21wYWN0IGZvcm0uICBBIGNvbXBhY3Qgc3RyaW5nIGhhcyB0aGUgZm9ybQorCXogfHwgYiB8fCBuKDEpIHx8IG4oMikgfHwgLi4uIHx8IG4oeikKK3doZXJlIHo+PTAgdGhhdCByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgbiwgYiBpcyBlaXRoZXIgMCBvciAxLCBhbmQgZWFjaCBuKGkpIGlzIGEgZGVjaW1hbCBpbnRlZ2VyCityZXByZXNlbnRpbmcgYSBwb3NpdGl2ZSBudW1iZXIuICBUaGUgbGVuZ3RoIG9mIHRoZSBjb21wYWN0IHN0cmluZyBpcyBnaXZlbiBieSB0aGUgc3VtbWF0aW9uIG9mIHRoZSBuKGkpLgorCitUaGUgY29tcGFjdCBzdHJpbmcgaXMgaW50ZXJwcmV0ZWQgYXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiaXQgc3RyaW5nIGNvbnNpc3Rpbmcgb2YgYiByZXBlYXRlZCBuKDEpIHRpbWVzLAorZm9sbG93ZWQgYnkgMS1iIHJlcGVhdGVkIG4oMikgdGltZXMsIGZvbGxvd2VkIGJ5IGIgcmVwZWF0ZWQgbigzKSB0aW1lcywgYW5kIHNvIG9uLgorCitFeGFtcGxlOgorCU0gPSA1IDEgNyAxMyA1IDEgMgorCXdoZXJlIHogPSA1IGFuZCBiID0gMS4gIFRoZW4gdGhlIGNvbXBhY3Qgc3RyaW5nIE0gcmVwcmVzZW50cyB0aGUgYml0IHN0cmluZworCTExMTExMTEwMDAwMDAwMDAwMDAwMTExMTEwMTEKKwl3aGVyZSAxIGlzIHJlcGVhdGVkIDcgdGltZXMsIDAgaXMgcmVwZWF0ZWQgMTMgdGltZXMsIDEgaXMgcmVwZWF0ZWQgNSB0aW1lcywKKwkwIGlzIHJlcGVhdGVkIDEgdGltZSwgYW5kIDEgaXMgcmVwZWF0ZWQgMiB0aW1lcy4KKwpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvc2hhLTEvYml0LWhhc2hlcy5zaGExIGIvZGJ1cy90ZXN0L2RhdGEvc2hhLTEvYml0LWhhc2hlcy5zaGExCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMGU5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS9zaGEtMS9iaXQtaGFzaGVzLnNoYTEKQEAgLTAsMCArMSwxMjM5IEBACisjICBDb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciAiU0hBLTEgVGVzdCIKKyMgIFNIQSB0ZXN0cyBhcmUgY29uZmlndXJlZCBmb3IgQklUIG9yaWVudGVkIGltcGxlbWVudGF0aW9ucworSD5TSFMgVHlwZSAxIEhhc2hlczxICitEPgorREEzOUEzRUU1RTZCNEIwRDMyNTVCRkVGOTU2MDE4OTBBRkQ4MDcwOSBeCis1OUM0NTI2QUEyQ0M1OUY5QTVGNTZCNTU3OUJBNzEwOEU3Q0NCNjFBIF4KKzZFNDJGQjg0MDY3Q0ZGMDU2QzQzQTQ5RTQ4NDk5N0FGMjMxOTA4NzkgXgorQzYzRkJCOUE4NzE3MUExNzZFNkUwNTQ4OTBFMjlBOEM1RjEyNUY2QyBeCiszMTA5RTMzQzFDNEI5QTAxNjlEMTU5OTE2OUQwRTVBNTIwQTFFNzFDIF4KKzkxOTVFMUU3M0NDNjhENzE3MEY0NEJEMUQ4M0NCNjI0QkM4N0ZBMEIgXgorNjRGN0MzNzQ1MjcyNzhDMDQzNkRCQzhERTVBQUJFQzJCQkY2MzRCQyBeCisxNTRCNjIyRUE0MjZGQjE1MUIxRkYxQkUxQ0U4NzE3NTJCOUVERUI0IF4KKzEyQkREMDBGRDQwMzg3NTZDQkNGOEVDREFEMUIwQ0Q4NjI2MDNDRDggXgorNjcwMEY5M0UxNjkxRTgzNzM1Mjc5RTE2N0Y2N0FGNjFGRUU5ODEzQiBeCis4NEFGMjBBMDY3OTlGMzY2NDM1QkEyMEY5OUI5QTEwOTU1QjZEMjc2IF4KK0M2MjJGRTAwM0ZEMTYyMjAzNTdGODhGQzZCOURFNDc4OUU3N0MzMjEgXgorQzhERUE1QTk4REFEQTFGOTY2MkQ1QzE1MDYxODE0MEExNTBFQ0E0NiBeCitGQkI3MTI3RTc3QTM5RDg1NkVDODQ5RDc1NUM4NjhDQTdCOUYxMUU5IF4KK0I3RDhBN0EzOUFCMzNFRDhDM0FGRDhGNzYyMDFCRjA5MDQxNDk0MzcgXgorMTU0NTM1NDYwQTEyQjlFMTAwRTI1MUJCM0E0RDREQkNEODBBMzA5QSBeCis4MkZDNjAyMEM3QTlCNjJGMzM0RjcxNTZBREE2MDg1MzJEQ0E2QTNCIF4KKzlERDk4MEI4MDczQjMyRDIxRTlCMjMyNEY5ODIwMjQzNzVDMjk1MUYgXgorNDE5Rjk3QTk4OTk0ODZEQzUzQzU4Qzc2MUNFQjU2NDMxNEZENDdCRCBeCitBMjEyRTQzRUJGQjMxMzg4RjY0QzBDMEIwQjFDQzcwMTk3MDRCNzQ0IF4KK0Q4RjE2MjNDMTg2QTU2MTVGNThFODQ2QzlEMTY0RjM1QTg5NTZFNDQgXgorQUEzMjg0OERFMTQ5OTM2NTczMEEzNjUwQTNBNzcwM0ZENDA0MjU5QSBeCis3OUJEQjAxRTU1QjYxQThDMUFGQkY2M0QzQ0UyRENDQUI4Q0YzREZCIF4KKzIzQkYzMTY0QTQ0OEE3MjdCQTcxNDU3RUJBOUZDRkFCRkJBQzRGNzAgXgorQkEyNkU4NDZFQkVGNzQzNEI2M0Y1ODYyRkRBMDA1QTFDRUI1NjU2RSBeCis5ODYyMjg2OUE0NzRFQTg1RkU1NzVDRDk3OTM1NDI0ODE0MUExNEE3IF4KKzVDOUU3RTY5NTFEMzg2MjA1NTQyREEwNjgwRTA3RTYwRUM2MUQ2NEUgXgorOEVGMDdBMDJBNzAyM0FBMEU2RUU0QkUxNTE4NjI3QTUyMUQxRjlENSBeCitDREVBMzgyQTVERkRBMUM2MzNGOEJCQzc3RjI5MUY0MEU4ODAxQ0UzIF4KKzNDMEE3MDlGRUY4NUREQkNDMUIzNjJBQTE2MjAxMDQ2MUYzMUFFQ0QgXgorMTBBQkQ2QjhEOTdFNjg4QUY1Q0RBNzk1NUNEM0NDMDg1MEE0QTc1RiBeCiswRUM1MzEzM0Y3RkY5NTVDQTM3RDI1NDkxQjU5MkRGQzAyNTZCRjIzIF4KKzFBNDZBNjdGRUVEMTYwNDUyM0MwNjJBQUNDMjQ1NTIyM0IzNjZEMDUgXgorRkEzREQ3NDlFOEYzRDkwMjlEOTI2MUYyNTE1N0IzQzBFMkRGNjgzNCBeCis0M0RDQUMyQ0YyMEU3Q0NCMURFRDZFMzc5Q0MzMDJGMzAyNjU1RjNCIF4KKzhCQTI1QkRGMzMxNjcxQ0NCNEI2MDk2MUU0QUYzNTYyMjQwMjc4NjIgXgorQUMzQTNFQTBGQjg3MjczMzRBNDQ3OEVEMTY1MTI4NTgxQkJDNUJFQSBeCitDQTQ0MDZBMjMxRUEyQ0EwNkNEMUQ4RjNDNzdGRUY5MTE4QjE1MDFBIF4KKzVCODM0NjVCOEVFRDE0ODcxRkI1MUQ5RTZDRTQ5OUZCMkU0QjQyMDkgXgorOTQ0NUY1MjE4NjE5NDZENDA2M0UwQ0EzRjQxRjU4MDg1NUE3NDU0RSBeCitDMjQxMDE0MDgxODk2MkY5NTUwNkI0MDdBRTg1MTRGMTFGODkyQUVDIF4KK0Y4RjgyNkZFMEQ5M0Y0MTU0MjZBREI2OTU2MjQyMTE2Q0JBQjI0MjYgXgorQzgwM0Y3NTM5QUEwMzZDQkIzMUI3MzUyMzgxMjBGQjg1MTgwRDhDOCBeCisxNjJFQjUxNjM2OTJEOUJDN0I0NTI5RDIxNEJCQjkzMjE1NzM2MUI2IF4KK0Q0QjBEODc2QTE5NTJBREI1RDI3QTFBNkJGNzFCQ0YyMjczMUE0QzUgXgorQ0I1Q0QyNkFBMzlFNDVGMjQ4NzA2NjA0RURCOUEyREI4RURDMUJGNiBeCitGMUFDOTg3RjMwRkYwMzc1RjYxMTVDMENDRDZFMjJEREZEMEZBRkU3IF4KKzY5MkUyMDlEM0E2QTAyMjhFQjk4MjNEQ0I3MzhCMTZCREY5N0E0RTkgXgorRkI5RTFFNzFGNzY0NUVFRUVCM0RERTY2NzE2REM0NDQ0NENENjU3QyBeCitENTFGMDcxRTM2MEQ5NjEyNERBNDlBRDM3RTM3REUxN0I1NjQ5MjBEIF4KKzA2NjdBRkNEQkI4MkI0MjEzNDQ3RDBCMjIwMDZEQzRBMTMyMENEMjEgXgorOEZCRkM2NUZFQjI1NjVGMkZCOEE5OTY2Qjc0NzAyMzUwQzg3Q0Y0MCBeCis4QThCQkNENkFGNzZFNzEwNjdFQjBBRjU0RjkwRUU1QUMyQjU4ODJGIF4KKzhEODMxRUYyMzQ0RTMzNkNDMjcyODEyMjcxODVBMzQzNTZCODU2QTYgXgorREU3QUE3NDI0RjkyQ0JDNTA5NjZGQzRFNkE1NzdGOTg5MDU5OThGQyBeCisxMDY0RUU2QkVGNzA0RjNBNjE4Q0I5QzU4RjI5OUIyMkE0RDM0MjkzIF4KKzk1RjhDRjdFODY0RkVCQkY3N0U0NjA2NzA2M0QwOEQ1MTc1RkM1MDggXgorNzkzODFGMjMwOTcwRjEyMEQxOUIxMTVCRjg2NEM3OTQ4NzhFNzc5NyBeCitEODJBMzBGNDk1Mzg1NjFENUE3RDEzMjRFQ0FEMzIxREQwNUUxMjAyIF4KKzU5MjZDRUVBRTQzRDI5QTdCRTRDMEVEQ0E2MjZDNDNBQkUwMDQxNkEgXgorNTYzNDU4QzlGMkMxNkM1QUY5NjkxNUZDRDkzMDZGMUQ5QkE1NzlDOSBeCitDOTJCMEJENjA0RTQ1RDc0NzlBRTE5RjY0MUIyREIwNjdFNENBNzc0IF4KK0Q2OUQwMTNFRTVDODcxRDNBRTNFMzg4MDkwQkMxQUFGOTg1MkE4M0MgXgorN0MzNDFFQ0RFRTcyOTg2MDU5MzM0NjVFQTlBREJFN0UwNDRDOEE3OSBeCis4M0VDNjg3RDIyQTEzRUREQ0Q0NzBDNTJDNDUyNzZBNkUxNTU0OTgyIF4KKzZEMjc5MjhGMDE0MjY5Q0VDNEU4NzQ1RUI3M0ZBNzE0QkUyREM2MkUgXgorNzVDMEJGMzEyQzA1MjMxREFGN0U5Q0Q0Q0EzM0FDQTc4QkNBQTU5QSBeCiswMTVENzk5QzYwMkRENEUzMEQyQzAxMDRBNTdCMUUyMTRBNDIzRDY2IF4KK0QyRjQzRUNBRDIwRjBCNEM1N0REMDdEM0NFQ0U1NjJCNkI3MkM3RkIgXgorMjc5NDhDRTVBNTZENTcyNDhENERGNjgzREMzRkUwMjNEMkI5QjQzQSBeCisyRDVBOTg0QkYzMkRFMjgyNDI3NDQ0MDY0NjlFMThCN0E1MTc4QTk3IF4KK0ZGQzVDNEVDRjBDQzA1MTMyMEUwNzFEMTRDN0RDQTRBNEREQTMwNUEgXgorQ0VEOEE1NDg3QUQxM0FGMDAwMzEyOTY1OURFMjU1NjE4MzgzNkM1NCBeCis1OTlCQjUwOTg2M0NDNUQyNzU0MTZGNkRCNkM1RDJCRDgyN0RDMzQ3IF4KKzM5ODFEQUM4OTVEREI5Mjk0RDkzM0MxQ0U3ODgyOEUzQTU1OEIxNTIgXgorOTFFQjcxNTkwNDEyM0QzMjZCMjNBQ0Q2ODRERkJENzIwM0NBQkVDQiBeCis1QTlBQzhDMzcwNUFGMTREREU1MEU2Q0YyRkU1QjBDMTVDNEJEMjgyIF4KK0UyNjIwREZCNDJCNUVDQUY4NUY1OTBBNzFERjY5NjkwNkFDNDFDNEQgXgorQ0JBQUREQTdCNURCMzg5QkYxNzc1QUU1MDA0MDA4MUEwNUEwRUU0OCBeCitBQUY4MEQwNzlGM0Y5ODBCRjlENTM2NkM1QjE5OTFBM0UzRDlGRENFIF4KKzJBODYxRjYxNjYwNEM1MjZBQ0IxNTc3MzJEQzQzMUU4MUJDOUExRjYgXgorRkJEQjIyQUEwQjg3NzE4RjQ2NEMwRDFBQTM5Njk1QTFCRENFMDUzRiBeCis0MzMxQkEzMzE1MjJENEY5Q0Q2MTM3ODU4REI5QUExNkFDOTUzMTZFIF4KKzMzRjZCRkUyM0E0QzBFMDRCOEJGNjQyQ0Q5NjQzN0VGMDA1NUFBRjcgXgorMjA0NjEzOEY3ODk5RkRCMjA2M0NEODRCODRFODIxNTI1MTcyQzAzQiBeCitFNEZEQzgxMkM1RjdBMzdGQzdBODEwMDVGMUU3OEJGRjU5NjY2ODg3IF4KKzY0NzdGOTMxQUMyMEIyRkNFMUM5MjE3MUZBNERDRjJEMjY2QjNEQzUgXgorRUQwREQ1MTZGQTdGRTJEQjdBRkNDM0RCRUVEMDg3OUEwQzEwRjFDMiBeCitGQ0VEQTAzMTFDMDg1MzY4QTU3NTFCQ0FEOEVBRUQyMDYzQzJENDBBIF4KKzIzRUIwOEI1MTAwQzhGQkFGN0IzMDQ5ODg3QTExQ0M1MzFCNkNENzggXgorQTZDNDJCNzU3REYwNzhBNjlGRkY2ODE5QThBQkM0NkUxQjA5RjQzNSBeCiswNjE1RUU0ODQwQjFGMUNENjI4NjM2RDFCNEY0NDk1NjM5REVERUJDIF4KK0UyMjg4MTEwMDA3QUU2REJDQ0ZDNzRCNzczNUY0RDk0QjBBQTEwQTEgXgorMTU5RTAxREMzNDhFQjA2N0U5MEE2M0JDNkZFRkJGNEM0NUEwMUY5QSBeCitBMTYyODY0NTlDQzk4OUFFNjYyQzczMUYzRDdEMENENDg3RENDQjNCIF4KKzhGREFGRTJERTM3MjE1RTE0MkUyN0E2NUE4ODFGODBFMDQzMEJGNDkgXgorMUJGOTc4QjU4RDk4RkMxNTczMUY0MTExRTdDN0E0OUY5Q0ZEN0M2NSBeCitDMUY2MUNENEI0REIxNEFBNjBDNjQ0OEMwMzk4RUVDNzIxMDc4MjZDIF4KKzVDRjBBN0Y2RjQ2QTczMENEOTEwM0E1NEYxRUM4QTc1NDlGQTU3ODggXgorRkRDMTA0MjE3OTQwQkU1QTdBRDFDMDJEMTI4QjMxNzQ3Qzk3MkE1QyBeCitERkY1OEJFRjRGRjQxOEQyNkEzNUI1NTIxNUNFNDE5RDM1NzlBMTk0IF4KKzNBMkVGRDQ0NEY0QUE3QTNEQjk3NjVFMDI3Q0U1RDgyQjUxRjY3MzcgXgorRUI2MTZCNkY5N0M1QkZEMDJDMUI5RTRBRkJBOEE1MTUxREQ0MTY3RiBeCis2MkYzMUY5QTI4RDA1ODdCRDgyNTM2MDFBN0VGQjY5OEIwMzIwNUZBIF4KK0U4NzY0NUIyQ0I3REY2NkRBMjc3MUFCRTBDRURBMEY2MjVGQzhBRkEgXgorRTgwMUMzMDcxQ0E2QUVFMjc4QjIyMjc0N0JGQTgxOUMxMThBMkRERCBeCitFQzcwMjIzQkQ5NjNDMTIyRTRGQ0UyOTI4OTM0REREMkQ3NjYxQ0JDIF4KKzgyMjYxRDI2Mzc3QTVBNURDNjlFMEYzOUQwQkJGNTlBMUIyQjIyNDggXgorMkU0REU3ODFFNDQwN0FFNTM2RjcwREM1QTVEQkVCMTc4REJBMkZDMyBeCitBRDNEOTU4Qjg4NENBQTI4RDU4NThEQTEwMzQ2M0MzMDA4NjJERUU2IF4KKzJBNkE1NjNDN0ZFMzMxMjk2MzdGQUJCNEQ0MEY1RjBFRThCNUM1MDAgXgorN0VBNjAwM0E4QkVGNEQ1QkZBNkJGRUZCQ0I2QTVCM0IxQTNCNzk5MSBeCis2RERDNjIwREIxNDg4MjU3NUQ1QkExMjE5Mjg0Q0YxQzMwNjgwOTRGIF4KKzkxQUQ3RTU4OEVDODI5NzM5QzM2MzI2NTZERTE5MTVBQzIzQzhDRjUgXgorMzExQTQ5MUMxQjVEOEEyNkVBMkE3N0EzNkI1RDUzRkRBQkExRkIyQSBeCis5RDRCNzUyQUE4RkRBRjkyODk3QjAzQzRENjVCNjVFQUJCREYwNjJDIF4KK0M1NjlGRjZGMDU5MjY2NEY2OTBCMDA4RUU3QTEyRURBNTc0MEYwQzcgXgorMUFFMzVFOUNEM0QwQThBMTY1QjI3NThFMURDNEY5RDFDRDMwRkJGOSBeCis4MTlBODMzMTg3MDBFQTg2MUNCNjlGNkNEOEVENEVDRDc4Q0MzQ0I3IF4KKzk4MDk5QjU1MEE4MkNFMjJFRkFFNDhCNTkzNUY2MzZENTgxNEZEQjQgXgorQ0ZBREI5OTgxNjdEQjI4OUE3QzE3QkE5NERGN0VEQTAwQjI5MDg1RSBeCiszRjVBOTBBOEY3NTc5MzY5ODc5MzhERkI5NUYxMDIzOUY5MUFDMjY0IF4KKzc0MDIyNjU5MDhFRUE1REExODM0OTBGRUYyRUEyRTU1QzlGQzI4NjIgXgorRUE2RUYwRjcwNTBFREE2Qjc4RjM1NTk3RTg1QjdBODVBRTAwOTdFNCBeCis3M0YyNzgwNTQ4RjdDNzlFMTU5NDVEN0VFMkEzRTAzQjMwREYzNUNBIF4KKzhFQzNDOTNDNzMwN0UxNEU5QzY1RjI2REQ4NDdDRUIxOTVERTI3N0EgXgorQ0ZCQzU3MUEzNUI4MkZCMEI3Q0I1OTc1M0M0RThERTM2QTc1MTE5NSBeCiszQzQ4MDJBOTU2Q0Y5M0ExNDhCOTAzNEZCOEYwNDFFQ0Q4REQ0NTMyIF4KKzVEQTI2OUMxRDVDQ0VFM0M3QTY2RTMxQkQ5RjVFMEI4M0JBMDZDRTEgXgorNzA2RDkwQzAwODAwREI5NzkwQUY2Njc4OEQxQjNEQzgxRTNGRjdBMSBeCis1OUFDODU2NDQ3RkREMjc0MjFDNTJFQTY2RTQ2NUM2NEM1MDMzNzIyIF4KK0VBQ0E5RTgyRDA0M0YyQjZFMTJFNjRDRjAzRDgyRUQ5MkZENkE2NEQgXgorODE2MDc1NUJBMDlDNzRGNzlERThGOTQ5NkJGMEM5MjQ4REI3RDQ1RSBeCis4Q0U0MzkwQzE4NUJERkM4QkM5QzREM0JFQjFBQjc1N0M0NEY2NDM0IF4KKzFBMUFEQjYyOEVCN0I5Q0FBODIxQUU5REU0MTdFMDlBNDJBOTcxMTMgXgorOTdDNEY5MkE0NkVGM0Y5MTY5QTk3N0UxNjQzQzEwNzQ1RUNEQUE0RSBeCis0MDhFNTNDMDNEMTBFMkIzMjIyMkYyQjU0RDExOEFDNEQ2NUE5Mzg2IF4KKzcxMDYyOEU4MTFDMjA3Nzg0RTMyNTVEQTg0MzJDRTZFMTRCNjFGRTcgXgorNEY2REI2MjI3NzhGNEIxQjYyMDNCRDIzOTMxMkQ4NjU4OUYxQjI2MSBeCis4ODhBRDhGQzFDQTVCODkzMjk0RkRCOEZDOTRBQjc3NjIwMThDMUY4IF4KK0FFMzZDMkY1NDIyM0JDMDgyRERBMEQ1MjhCNzBCMkFFQTE5MDc3OUMgXgorNEJEMkJGOTE0MjIzRENEMENCQkNDNDQ0MzIzRkJGMEU0ODdGMjdCNiBeCis3NTI2RDVERjdCMkVDRkFDN0JGRjYyREQ3QTRCNUYzODQ2MzMwNUY4IF4KKzBFRDdDODdCNjhGNTA4MTNBQUQ1RTUwMTU5Q0JFMEJCRjlCRjA1RDIgXgorNEQ1Q0Q0RTQwQTY2Njg4OTNFRUExNUYwMjVFQ0I4MTg3NDc1REY0RiBeCitEMzg0NDZFODQyQzBBOTRGMTc1Qjc3MkJEQzcwN0NEMkVFNzlEMDk4IF4KK0REQTg2OEJDMjkwM0M1NUNGMjczRjQ4RTlCOTJDMDlEOTBDRDAxNzkgXgorMDg0MTI2OEI5NUVDRkFBQjlGRTM3ODdCQTcyNjEyMjdBMUYyMzI5NCBeCitEM0RERjIwQjRDMERCNjY4NDIxREUxRjI0MkI2NUE4QzgzRkE4NjdCIF4KKzExMkYzQ0Y3REFDQTc1Mjc4MTlEMTY3MDRFQjQxMzAyQTRFRTUyQUEgXgorOTYwNzJBM0VBNDQ2M0ExNTZCM0JEOUVBRUMxNkFEQjA5MDUxNjBDOSBeCis3MTVGMTk1RjA5RTNFQUQzRDcwQUU1MURFRjFDOTcwOTUwMEMwQTZBIF4KKzhBMTEyQ0E4MkNGRUI1RjMwMDFCN0EwMDU5MTQ2MkY0MTIwRERDMDIgXgorNTBGQzkxRTkxNTI3MEQxMjAyRjZGQzg3OTJCRTE2RUNCNzNDRTQwNSBeCis5MDc3MzZFQzQ1QkU3QkVEQTFCMTU0RUEyODJDNTFCNTc5NTk5MUY4IF4KKzA1RDQ5NDYyOTkxMjc4NzIwRUI0NEJFQTY1NkFCNDQ0MkM4ODQ1QzMgXgorNkZENTZEMDhBMkQ0NjMwRjcyQUM5N0UzQzk0QTk1NzVGMzA0NjcyOSBeCitERDE4ODMzNzZDRjcxM0M4RDdBRUJGRUM2MEQ1MUZGOEUyQTgwNkU4IF4KK0UwNDU3RkUwMEY5REVFRTk1OERENkFEOTQ4RURGOUNEOTQxMkY3M0EgXgorQkE2NTM4RTkxQjI3NjUwNEM4NEUyMTNCMzI1QjRBNzcwM0U5MjRCNCBeCitDMjBBOUI4NDg1MDM2NTBERTk0NjNCOTk5MkVCOTc3NDIyQkI1M0RGIF4KK0JBNEE1NjVFNUMwRjlGQUM4OUQ1NUEyQjc4NEYyOTFDN0JBRDQyNTUgXgorNjUxMEUwOUFBRDgyODhBQjgxQ0E1NERENTY1NkRGNTdEMEVBQkJFNiBeCiszMzk5NkM5QzVBRDA0ODgzQkNFQjk3NzFBNUM0QTI3MkY4ODU1MEIxIF4KKzdCOTZGM0MxMjcyQUQ3NjVEQkRDMzVBNTkyNDNGNkE4Rjc1RkEzNTEgXgorNUFBNzZCMTZFQTRERkIyNjdEODhGRjdEQkU0RjA1NTE4NEE1NkU1NiBeCiszM0I5Q0NFQjFBNkVEQzhDOTFGNjAzNDI0NUIyRTNBQUM4OThDNjc4IF4KKzcwMUEzMkZDMEIxMTYzQkM1NURCNzZGQTQ2RjY5QjU3NEIzODAzQTAgXgorNUQ2RjQ0QTRCNTE3NUJBODczQkZBMzM2OURDOEJGQjBBRDFBQzI2QyBeCiswNzI3RjEyRDhFNTU0RURDQjQzNUFFM0JENjQyNUIxOTdERjZFRTJFIF4KKzZFMUY0NkRDNEZBRDY3MTc1OUFDOTY5OTk4Njk0QkQ3OTMyNjI0NkUgXgorODUyMzNGOUNGRDA3ODBCRDYwMjQwQTIyRTAzN0MxNEVCODI4NkMzMyBeCitCNjZDQzczMzIzNDFGQTkyNjFEOTYzNjJGMEJCRDdCNjc2Rjk1RTAyIF4KKzc4MkE3OEYyRkMzMkUwQjYyNzcwMkM1NDEzNDFFRDI4QjAwOUJCNkYgXgorNkI3OTM1MjY1QzUyOTg4MERBNUIxNjZFREQ2NjBCQUUxNEE3NzBBOSBeCis0OUMyOThCMUMxMEQzODBCQUNFMjZFOTA3QzIxM0M5MDA1MkQ3NTIzIF4KKzQ5Q0U0RDRGRjlGRkY2NzI0REEwMzJGRjMzRjhDNUE3NzkyRDI0RTIgXgorQ0QyQzRGMTlDMTJCMDg2QzA3MUJCNkIyMEU4RTgyMTBBRkREMkQ1MCBeCiszOTcxMEY3N0JFNTY0QzQxN0M4MENCNkU0Qjg3QkU3MkZBODA1QTQwIF4KK0Y3NEE2QTQ1RjVCMjk3OUI1RTc3MzAwN0I5MDgwNEYzMjJGMTNBRDggXgorNkZENkEzNDMzOTA0N0NGMTNGNzc3QzRCN0Q5RTI4N0Y0OTlGQjE5QyBeCitGREIwNEYwNEQzQjM2NEE2OTUzQzM0MUUzNDNFMzEwRjIzODNBNjU1IF4KKzk4MUU4NzE3NTM4Q0U5ODk5OEU5NTBFQUQyODU5NkI1Mjc3MzY4NDEgXgorRTA5OTk4N0RCMENDNjFDRjYwN0M5ODUyMzM2Q0RBRjQ3OERFRTMzRiBeCitFOUM0MkYyNUEzRTM1NDJEMTUxMEREMDlCRjUxNkFEODA5RDQyNzAyIF4KK0Y3RTU4MEZCMjFDNzI1Q0JFQTU2M0IxOTM4OTY4NjJCOUJFRjdGMjQgXgorRDc3OEEzMjg3RjY4RjQ3QjBBQTQyMTQxMDI5MkQ0NzgwNTk5N0E5NCBeCis1MzRERkU3NTk3MzU3MjM2NDlFREM4OUJDQjA2M0MwQ0NGRUVDMzRGIF4KKzkzODFGQjVCRDI2Njc3QTc3NjBGQzAyODg1MzI3NTUwNjI5ODZERjEgXgorMjdFOTdFRTgyOTgyMDM5OTU5NURBMEEwMDQ3Qjc0RDNDNEUwREJGMSBeCitEMzg0NTAwNzFEMUIwNzlBOUZENTE4RDJGMzE3QzgzQzMzMDk0RjQzIF4KKzAyMjFCOEU0RDJGQTY2RDJFQkUxQjA0RTY3OTY2MkNFNDE0MDVFNDggXgorQjlCQzRGREM0QTVDRTAwRUZCOTExQzMwNjJENkYzMzMwNDcwMUMyOCBeCis0NjFCNDIwNjYxOEI3NjZDODlFNkQ5QUIyRjhEQjA3OTAzODYwMjM0IF4KKzEyMkE5MzA2QjEwMkYyQzUwQjczNjRFMUQyNEZFQ0IwNjYyRTI5NTggXgorNjFFOTFGNUQxNjcwNjZFQzkwNDEzNEFCMUM0RjlEMTE2QzlEM0U4MCBeCis2Qjc1NThCRDhGNEQzQzU5MTRBOUFCNUQ3NDE4RjdEQjc3NTgzQjU1IF4KK0NFNDhFQTk0ODQzODU0NTU1REM0OEQyNEQzMjQwNURBQjlEQkE2MTIgXgorNUE3MjJBQUM1NzZGNDA3OEMwMDFEMDZEQTkxQzI4MTMxQTRGOTJDNSBeCis5QjhGRTBGMUU2NTczQ0M2ODMyQkE2OURFQzlGNkU2NDYyMjhBMzc0IF4KK0Y5ODQyOUNBMjc5OUU1Q0FBRURERkIxNjhCNzgyQTU0Mzg0RUYwQTggXgorMTQyODc3NzU0QUI5NUY1N0FBNTQxQ0I5NzhCQTQwMEU4MTJBRUNDOSBeCis2RDg0RDA1M0NDRDlFNjhDQUM1NzgwODkyNDA5RjYxQjM5RERGRDQ4IF4KK0I1OENDOUNFMEFFM0RBQUEwMkUzQzA0MDEwMEQ0QjU2OEQyOUUwRkEgXgorMTdGQjE4RkEzMkE4MjM3RDMyQ0Y4M0E5NjY0QjFCMkU0MERDNUIxMSBeCitDN0Y2NUU1NEU2MDhDRUYxQzdBMTIwQkU4QTI5RkE2Qzk0QjY4MEQyIF4KKzlDNDYzMjlCQTM0MDc3Mzk0QjQzOUM1NDc2QjkxRDlERjAxOUJBNzYgXgorMzYxMkIzODFCODBBMURGNkRBNzVBQjI2NTZCRDVCQThERTY5OTZCNSBeCitFREQ5QkNBMUM0MzEyMDBEMzIzNEMwOTk3OTFDODFEODYwNTA5MUFCIF4KK0MxOTUxRERFQ0I5Nzk2QzBEMzlFRDlBRkNDQkI2NTIwMEFFQUIwQ0IgXgorNTVFNEY3ODQ2RDlCOTBEOEIzMUVBQTVCOTM3MUQzOTU1OTBCNjUyOCBeCis1RDQwQjQzMkFEQkRGM0EwMTM1NUZGRkREQkE0NzU4NkIzREM3QzUyIF4KK0FGNUM2NzVEMjI0OUY0Q0QyMEU3MERDOUUxOEI4OEQzQUNGQkQ2QkYgXgorQjBFQjY3OTZBMjE4NzZGQUFGNTBGQ0RCQTJFQjEyMUM0Qjc0MjE2NiBeCiszQzU3N0M3MEI3NjgxMERERjlBRDU3OTkxMDM0NzMxMkI4ODFDMzBGIF4KKzBDMTY4OTdEMjBDNUYzNTJGQTYxMTBDNzBGOUE4QzMzQ0EzNUNBMjEgXgorREJFMEI0MzQxNTI2MDYwQzVCMzc1NzZGNkI5NzJBMUVCODk1NDA1OSBeCisxNTY3QjEwRTMzRkJCRTIwMDMzRjVBNTJFQjgxMDM0OEVEMTU0RjE5IF4KK0MxRTQ3Mjg5NDEyRDNBQ0MyMDg2MjBBMUVBNjc2Q0UyODE1REQ0RkIgXgorQUJDMjI3RUZGRENFMzc1ODA2MUM3Nzk3MTg2MDI0N0U4NTAzODJBRCBeCitCMjlFQUNFQzkwM0JCOEFGN0NDMUE2MzUxNjE2MzY0MEZGRTYyODIyIF4KKzVDODk3NkExQTRGQ0M2QjZGQUI1RUU2MzFFM0NEQzU2MUVENUZCMTAgXgorMUExRUE1MTA3Q0M0NkJFOTA5REY4MTY1QzNFRkVFODY3NjE2MTk5MSBeCisyNjhFODZCQTNBODFGQUREQjIwRjc0REQ0NEM1QkM3MUE5OEMzRDA4IF4KKzA1MDU3RTVFNzkzNEFDOUE5MTQxRDM5QjhENEY1RUE2QUExNEY3NEYgXgorQzAzRUE3MkM0RDY4OTQ1NzI2REY2MzgwMzU2NEU0MzQ0MjYzMDJCQSBeCis1NEFGMjBCRkJGRUFENkJCMkRENjhFNjVEMzlENDI3REY3RTE3RkQ5IF4KK0ZERTkzOERCMDg0M0E4NDREQzBGNjYwMTQ5N0EzOUFDRjE2N0Q2REQgXgorRUQwMjkyRDBCRDg2OUI2NkU4MDAxNDgyNEEzRDc4ODZDRDZEMzU5MCBeCis3NDlCNjk5NjRGNUMwRDlEMDJCRjVDRjkwM0IyRTU2RDA5Q0YxQjlDIF4KKzZCMTQzRDMwMzY2QzQ1RjE1OUI4M0E4RDFBRThBQUVDODhFNDQxMzYgXgorMDExNjlENjVFNzEwMTQ5NDZEMEJGNjRCRjQzOTA2ODk3OEFBNUIzQSBeCis0QzM2RTBBOEMxOUMwQUE2QzgwREYwNjExQkEzNDA0QzEwMjVFOUNDIF4KK0E0REE5RUVDMkY2ODJBRjVCMkVFN0NDODUyNUVCMDdERjY2RTU5NDUgXgorRjEzNDlBRDAxMjREMTE2MTNDRkE0NkQ0OTg2NzE0ODRFNUYzNzc5MCBeCis2QThFODJEMkQyN0QzRURENkU4QjExOUY3NDY3NjFCOEZFODMxODJBIF4KKzUyRTdDN0M0QUUwMjY1OTk1MzA3OURBRTIwRjQ0MjM1M0VFMkJCMjkgXgorNDlDOEQ4MjI3MjQyNzRCODVERTYyRDlERjU4NkZFODgwQUYzOTZFNiBeCis1Nzg2NkMwQkI5NzZCNEY4QUFBN0FDRjNDOUEwRjcwMEU3MzIxNkRBIF4KKzU0MUE2NzVERDM3QzVENkYyQ0YyNDIxNjNBNUNGNkI3MjhERjk5OTUgXgorNTVCMjZEOTM0NEQ0RDY0NENCQjY5QzQ3ODk0NzM1NDMyNjJFOEI5MSBeCiszQThGM0YwQTk2Mjk3MDIwRUVBNTgzRTlBMjgwRDUzRTAyNDhERTI2IF4KK0QxRkY3QTBDRDBCNjlBNzZCNUI4MEQyQkI1NzM2Qjg0NDBEQTdGN0IgXgorNTNFNzE1RkEzOUQzNzMyRjM4RkI0NzQ4RDQ2NDA5RDk5OEQ2Nzk3MyBeCiszNzc3ODFBQkI0QUI0RTk3NEI5QzE2NzA4NjdFNzRGODdBQjQ5NTBBIF4KKzhFN0RBOTY5NzEyNjVBQ0MwRkY3QzM4MTEyN0M5NjZERjlGOUYxM0EgXgorMjgwMzg3MTNBMzNBQ0FBQzczMEZCNEREQzNBNzA3ODg2RTU5OERENSBeCis1RjZCRDQ0RDA3QTFDODExRDVCNzU2NjFBNjFCQjY5QTgxNDQ0RUUyIF4KK0Q0NjVFNkM3NjdCRDAyRDQ1N0Q2MDE3NjVERDBGRTU1MjFCQTJBQzcgXgorNDg3RDlFMDI5MTIwMDRFOTYxOTY4RjM4N0MyMUE2NUEwRTY1M0FFNyBeCisxRjU0REYwMDA1MkIzNzQwMzAxQzQzNDIwQ0MyQ0I4NUIyNzcwMDk1IF4KKzdDNUJCNjc4MDgzODY4RUI4MTdFNjE2QkQwOTQyMUI5MTAwMjE2NDkgXgorNEQzMTUyNkU0RTJGRTNCRDZERDRCM0Y1OURDMkVFMkE1MkE5RkI0MiBeCis2NjlGOUZBOUQ3MUZCOTJENTFBREUxNUM3MDc0MkZCMzFCMDEzOTAxIF4KKzM4RDFFNzRGRTI2QUE0M0Q0NURBQkMxNjBERUZGMTEzQjc3NDAyMTEgXgorMzcyNEVGNTBDREVBRUI4NTYxMjNCRUJCMTkwRjM4ODM0NDYxNjY0RCBeCitFMjYzNDExMkQyOTc3QTE3OUQ0QzlBRjM1RjIyMEQzQTYyNkFBMDRDIF4KK0YxNENGODEzM0ZGNjZBM0UyMEQyNUU1RENGRjcwNjA1RjZCOEEwQkMgXgorODA5RTA0QTM4MzQwRDAxMEI3OEI1Mjg3QzhGREQyMEMzOTFGQjYxQiBeCitFNTM0OUQ0RDZFQzMxRTJDRjQxMDAxREZDNDQwQURGRjZEMjVCNEY3IF4KKzEzOUYyNUZEQzM0NEVDMjQ1NkY2RTRERDk5MzhGNjU2OTNGMENCMkQgXgorN0M2MjhCMDk1NEQ0MzQwQjA4NTFDODlGMTEwNjU4OUM1QzY0NjVDNiBeCitFNjVFNjVENzA1MDI1OEI2QjZCNUIzNTg2Njg0MEI1QUNFMERCRjBEIF4KKzc3RDMzQjg3RTBDMTM1MjlEM0FBQzRENjYwNjIxM0VGRTgxRkYzOTggXgorNUJBNDU2QkE0OUFCRTUwQkJDQjc3MkZBQUNCNzFENEYzQUVDQkQ0NSBeCis4MDFBMjFGN0FCNzM1ODVBRTM1MzEwNThEQjk1MTJCRDY5QkE1Q0IxIF4KKzE5MkFDNEQ1MjEwRUM4NjM2MDRGQzFCQTM4OEFFQTg0NTVENDE3NUQgXgorRkQ5RjEwM0VERkM0Q0M5RjlDNDI0MjY2RUU1NEE3OUMxQzk4N0Y5RSBeCiszNjFBQzQ2RDk2QTY5REQ2RTQxNkQ0NTYzRDdDNjlEM0I0ODdFRkMxIF4KKzNBNzYyOTA0NUMwMTkzRkUwODkyOEY3RDQxQjgwMTgyNzU5MzExNkIgXgorNTQ1QjJGNUZEMDE1RjgxQkRFMURBRkFGQ0ExODREMjU1OTA1NjBDOSBeCitGRUYyQzUwREEzMzYyMTIwNjQ1MEUyMUQ5Mjk1MUIyNTM4NTk5MUEzIF4KKzkxM0E0MTdBQzFFQ0UwODk1MkE2MEUwMDM1RjcwOTkzRjE2MUVGMDUgXgorNEZGQzk1NDgxRjZGNjI1QjFCOEU2N0IxMzNGMTE2MTlDRTVDMTQ2MCBeCis1RDZEMDc2NUIxNTZGRTAyODc4MDMzMUI2QTUzRjg0REZCMTMwRjBBIF4KKzJDNUVDODlGMTAxOEQzNEFCMTFFMENCNkZEQzgxMkY4MjQ3MEIxNjggXgorMzRENjJDREZGOTU1MjMzRkU3QTUzMDg5MjVDMjRDQkNEQzA1NzlCOCBeCisxMTQ4OTk0RDMwRjgwQzU2ODlEN0JCMTlDRkJFMzM1NDY4NzJCNEZDIF4KKzA3NEZDQTIyQThBNjNGNDQ2QzhEMTk2NjEyRjdDODEyQzIyQ0NEOEIgXgorMjI4RkUyOUZEMTM5MjhEOEZGMEI4NTBFNTBEQjQxREI0MDZFRkNCQiBeCitFRkY3QkJGOEYyRjdERjM2QUQ1MUVGM0Q3NDhBQUI4RDhEQUI3QjdEIF4KK0MzQUVBNkFBMTc5NzFDMEExNDNBQ0U1NEE4Q0Y1MTVGOUVFQjBCRDYgXgorNEMzQTk4MEU0MDYwMkQ0NjIxQzJBRjFCRUIxQ0FFMjdERjE5QUQzMiBeCitFNUNFMkE0MUM3MjIyOUQ1ODRFNDBGQkE2N0M2OTdFRkEwOEY0NTFEIF4KKzY0QTUzNjgyNjQ5NTlDNzNGQjBBMTJGODVENEZBMTZGOEUyNUZGMDggXgorOEZCNzcwQUVDMTY1QTkzQTZEOTlBMERDNTJGMzg0NDRFMDMxMzA3MyBeCitCQ0ZGM0M1RTVDNTY4NzZBM0REOEM0QzkwRDRFODE5QjY3RDcxMzk0IF4KKzBFRjIwNTIzNzU3RTI1NjExQzQ5QzFGMjU5RDk0MzgxQjA4RkI5MEEgXgorNUQ5RjA1REFCOTFDNDZBRERDRTRCMTYzQzZGQ0RGQjUyMzBCREZGQSBeCisxMUIzQkRDNUYzQkUwOTE0OERBMDdDRDQyRUM5QzI4QzcxOEQ2QTVCIF4KKzFFQUQ3NkVGMTg4NDBCMzE3NjI5NkZBNTc3OTFEODMyQjdFNDAzNUMgXgorQUY4RUJDQkJERjVCOENGQzIwM0ZCRDg2NDRCMTU0NDQ1NjkwQjAyRSBeCiswQTE1NkRBRDM1QTEwQUE3RTQxQzVDQjNCMzA0M0EwNTFCNzE4MEI2IF4KKzlCM0U1Rjc5N0JBMjQ2RTVERTY2MEI5QTM2RTUyQzIwNEJBQ0U4MjIgXgorNzg3ODAzNTlDRDI0QTJCNzE1N0ZENkQ1NUNERkE2RjlERTE0OUZGNSBeCitGMkRBREFCNDI3NTYzM0Y3RUNERkE5NzFEODI0QTMxQjFDOEQ2NjQzIF4KK0VBNjhCQThGMTZEODM2OEU2NjczQTVDNUFFRTg2QkE1QzM2RjJEOTcgXgorNzg4QUE5NDUxMTk2RTJCREQwMzFFNzQ3QjA5OEQ3M0JFMTEzQzA5MyBeCisxOEZFMjU5QjM1NzNGNTJGMjNEQUQzM0YwNUQ5QzkxOTQyQjUxNkREIF4KKzBFNDc4N0Y0NkFFOEQ1RDdDQzk1ODlCNzZEMDBENjA5ODMwNzlENzUgXgorMTQ4RTRGREYwMzFDQUZCNzI2MDk5RENEMUVCNTkxQkMyRjI0RDE3OSBeCiszOTgxREY4NjU4QUMyRkE1QzMxNTFBNDI0MjYyMzI0RDQxOTQwREJBIF4KKzNDNTBBMzgwMDYzNkVGODc3RDg5MDU5RjY2Q0Q2OTdBOURGNDRCRDEgXgorRDlCQUIwNDcxRTJEQjk3RkQ1RjNBNDI4ODRERkM3MDg3NjhGNjJGOSBeCis1MkREMTA2MzMyNkUyNTUwQjZFRjQwRDVFRTRFMUFENjdDN0JCNkJBIF4KKzEzQ0EyNzgyNzEyN0M2OTg4MTBBRUNBMTU4RENBQTc4OTRGMEM5MTIgXgorMDg2QkRCMTdFQzFCOENBQzY4MDMwQTU2RkJENEM3NDFENEY5NURCQSBeCitGN0YzODlCQzVFRDIyNUJENjM5OUNDNDNFRjIyQUZENzdFODk1RDA2IF4KKzY3RjE3M0FEM0EyNEMyNkU5NUUyRUE4QjM3RkMwMjU5QjFERTk1NUMgXgorQTdGMzQ4QTNCNkY2N0NDRjdDN0M2OUVEMDY1QjNGQkZBODMyQThBMiBeCitFQ0VDQkIyNTM1NDQ2OEZCNjJBQzg3RDVDRUI2ODhFNEE2NzFEQzQyIF4KKzYyMzMwQkM0MDAxMDhERkFGRjI5OEVGQjc2QkRDMjhDREMxNTNBQzEgXgorQkIwRUNGOUNCM0NFNDQ4QjRFQTlDNTdDRjVGMUY5OTdGODEwODJCNCBeCisxMkM5NzQxNjcyQ0U4REJBMTRDQzY2QUYzMzM4QjYxRTIzNEY5RTY4IF4KK0RCNENCNTk2MUEyRkY2OTY0Q0VERUNBRUQzREEwM0QxNDAxMTJFQTQgXgorNDVFNEQyQkUzRDk3MjlCRTlGNjlBREIyNDVBNUE5Q0M3NTA2NDUzNCBeCitFMzUyNTM1NTBDODRCRUZDMjZDMkU5N0YwQzIzNkNGRjFEODVDMzZGIF4KKzdENkQ5NTBBMTY4MTA3NzAyQ0UzQjZCQ0VGOTI5OEY5QzhGQzhGM0MgXgorODEyRjQ1OUFCNTg4NzM2NEQxRjJBOUEwMENCRUU1RkMzNTJDMzlBMiBeCis3RUUyN0YzM0M1OUI2OEMzNDYwNDQxNkQzODYwNkJEM0Y1Q0I2QjA2IF4KK0Q1N0UyQTRGMTVERjVDNTBGMjQ4NTkwOUVFMzE0OTczNUM2REZCODQgXgorM0QxMkQ4OEI2MUVGMDk3MjgwOEQ4Q0FENDFEOEExNkFBN0VDQ0M4NyBeCitDRjlBN0NFQTlCMTA1QURBQjZCQkEzQ0ZCNkQwOTBCNzY2MDNGN0NFIF4KKzFENDNDQTE2NENBRDBCNjE2QkU1NzYzRDdGNUVBODgzNTU5NTNGNEIgXgorMzYwMEYwODVBNTNGQjAxMTVDMjZEQTkwRDExODBGRDM0RUVCNjMwMSBeCitFOUY5QzA4OEMzMEEzN0U2Q0RGMDY3RjcyNEJFNkM0Nzg2RjI3QzlFIF4KKzJCQjg2QjQ3RUEzNDQwMEQ0MzRGOEY0Rjk0ODMwQ0JEQTlENEU1NzMgXgorMzI1NUE3RDlBN0EwQjU2RDBEOUM2NjVFQzEzRjdBOEM4RjA1REE3QiBeCis0NTM1OTc1MDBBN0Q1QkVDOENGQjk1MDkyNkEyQkZDMEY5MkUxNDlCIF4KK0ExNUVDNDUyNDc2ODcwQUM0NTlCOTQyRjZBNkI3MzgyMkEwNzg5OUMgXgorNUIxODIxQkZBRjkxN0JBQjNEQjEyODRBMUQxRkQ0MEVBMDExQkNCQyBeCis4RERDMjVDN0NBMzMwQTE4Q0YzOTgyN0I3Q0JFQzAwQjg3NEFGMTkzIF4KKzI4MzgzMkY0NUJCNUU2OTY0OUZDMTBERDYwN0JBRjhCQUQ2MTc4M0UgXgorRjM5NDI2RjlDMDQ3NDU5NkIwMjUxRjBDQkI1RjkyMzg1RDg2MkQyNCBeCis3MTRFMzJERDVCQjhGQ0M3NUIxMDEzRTZGMUY1NkY5NkQ5N0IzNkYyIF4KKzk4OEFDNDU5MkQ1MDExM0IxM0Y2RURCNUMxMTNBMjJFNEQwRjUxOEUgXgorOTNCRjE0NjM3ODhCN0Y0QTRBMDZBRDRDMTc0ODJEQzI2MDc5N0EzRiBeCis1NTMyNTM1QUNDOEFDNTY2ODk3N0IyQTJGMzIyQjIzQUVCNDQzREIyIF4KKzg1Q0M3QUYwOTI5RjIwNkZBNDRGQ0FBQ0RDMjRDNEU3ODM0NUJEODAgXgorMzkyMTk2RTNGMkY0MDc0RDFENDg1QTUyMTE5MDEyRDhDMDU3NDBCNiBeCiszQkE4OEI5MUYxRUExOEU3MTIyOTIzMDFGQkJDMzc1RTlCNDhCRkM2IF4KKzNEQUFEMURBQjE3OTVGMkMxQzhDNUNGNTMwNUI1NDlBQkZCODUzOTggXgorNkVDOTNBRkEzQUI2MTc3MDgyNzZFOTkwNjZGREMzMzFDODRGMDI4RCBeCitDREEyMTkzMDNCOTFBRjNDM0ZCRDBCOTI2NzU4OTE0OTg0QUQ3QzhEIF4KKzU5OUNFMjQ3NDVFQjU0MDg1NTQwNzczNTRCRDEwQTY1RjZCQzMwMzcgXgorMDc5OEMxQjUzRjk0OUQ2NDNGN0JENjZDMTk0NzE1RTdDQUZDNkUxOSBeCitBMTcyMzBGMTY0RTk4QUI4M0FDMTE0MTczMEIyMzM4OUYwRUI0NzNEIF4KKzJDMkI5NTE3M0YxQjA2MTY1RTE3RUFFMzZBNTNDN0FCNjQxMjY3QzMgXgorQTdGNDA4RUY0NDlEQzkyOTYxNjE3RDRDNTFCNTVBRTRFNDUzNkU5NyBeCisyMjY2QzUxMzNCNkQ2QjA4QTA5ODk3QUVGQTM1NUM3NjhGNzE4QzZDIF4KKzM0M0YxMEVFNkVCMzRERjAwNUU3NDlEMUM0QTk4RjY0NTM3MjcyQjEgXgorOTBFRUI3NkIxMjZFNjMyMzA4Rjg2NTVGRDQ5QzUyMDAwMDI3QUE0OCBeCitDN0VBM0M3RDRBQThEQ0JFOTU4MEM0NDM0MDc1MDE3OTM0MjY4NDE5IF4KKzQ1NUQ0RTdDOTg4MzU2QTU2NTg4QzQwMzEzRDI4RTQyNUFFMjE5RjkgXgorNUMwRjMwOTA5OTIxMzhEMzRCNEUzMzAyOUNGODNBNjRFRDhBQjAzRCBeCitDQjNDNTI4ODgzOUQ2RkU3OUVCMkU1MEQzQUMzNEJCQzRBOTQyRTQ2IF4KK0U2MDU4NDIyMDUwNzlEODNCREQ0ODlEQ0Y2RjhBMkQxRUUwNzRDNjAgXgorQUJDQkVDNTZFQTIwQjZCMzY5Qzg1QTkzMUIyMjAxRkVDQjgyNkY0QSBeCis0ODBDMUNCOTdDMzQxOURBNjEwRDk3ODNFNjA0N0U2QzlBNjEwMUE0IF4KKzg3NDgxODQ2NERBMTc1M0QzQUVEREI3RDNCNDZFMkQwNDYxNEQ3RTYgXgorQzk1QjY1RTNBMzdFRDRBMkZFMkIyN0EyRDUyQkYxQkZEMzA3RUQyMCBeCis1RTE4OEE0RjYyNUMwNTQ4MkJGMTYxQzQ1RjUwOTQ4NDRDRTcwNDYxIF4KKzZCMkVCQ0ZFNzRFMEJGMzI0ODBENEJDRjlBNTY5OEE1MjdBRUJFQUQgXgorQUJEM0UyOEEyQTUyOEI3OTYzRUE4RDg4OTY2NTFBMTczMzczMDREOSBeCitCODczRkRFMkMzMTJDMjI3OUVDODk1MEVDMkMyRTlERjk5MEYwMDZGIF4KKzRGMUExODcxNDY4OUJEQjc2NkFGNjg2NjIzQkVGMDhEQUZERkUxRjUgXgorQkE4ODY3OTNBODlFN0VDNjI2OTJBODY5MDE2NEJGMDcyRUFGN0FBNCBeCitBMTVDOEREQUEwNDQ4REU3QjM2MTU1MkZDNTFBRjBENzJDMDczN0ZBIF4KKzZGQjUxNkNCQjRDQ0U5NjgxQzQ0RUZBQkFCQzdBMjZDNzlDNzlDQjUgXgorQzZEQTg5RDNGN0VDNEQyRkNEQjM2NDMyMDQyQTc4RUFDOUYwNERDNiBeCisyQTk0QTkwMjNGN0Q1NERCMjZDOEMyQTZBNEM5NTExMjY3MTJDMkU1IF4KK0IwRjExNUI4QkYwQTE0NjRBMzc4NDIwQTFGMUY1NzRBQTE4NjlGQzggXgorQTNDMTc5NEY1OEZGREMzNjFCQ0FENDc3OUI1REVGNDhFMDJBQkQxQSBeCisyREJBNUQ4MEM0QjE3MTY3RTcxNUE4MDEyODc2MDk1NTc3MDMwRDVDIF4KKzA2MkMzQ0I3QTA1OTc2NjEyNUIzNjhBRDZDMTlCRThGQUE5ODE5NTAgXgorRUNFQTk2RUI2MjM5MTlERjRFMjJGQjEwNjYxNkVGMUZCMkFDRjVBRiBeCitDMENENUU1NTU4NjFGRkJDQjJGRjQwNDVBNDZDRTMwQUU2Q0ExNzU4IF4KK0EwMTUwRDkzMTk4MEUxRDgyQTIxOTI4ODM3RjdFOUUxOThFNUQxQjkgXgorQkY4NzdCMjAyODEyMTg0Q0E3NERFNjFGRTM0REI5NUJBMkFDNUQwQiBeCitDODYzQTBEMjIzMkU5MDE5MjA3NTJGMkFGOTJDMjAxRkM3MzYwOUI1IF4KK0M1NEU2NzYyMDlEODFDRkVEMkU3RUNFQTZGN0UzNUE1NDU5QTU4QUUgXgorQ0JGMzc2RTg1NzFGODE3OTJBQUM0OUJBN0UxRDdGNDE3MTNBQ0RDRSBeCis5Q0QyNDhDMDdFRUY2MzAzQzcxOTAxQUM0ODRGMzA3ODhEOTI2OUY5IF4KK0FFQTQxQzVCMjI2MEUwREM1NzA5NEM1RTFGODBBNzBCODVFNzlFNzcgXgorQjEwMTZGMjZFMzI2MjRDNTMyODU2NkIyNDMzMjlBMkY3NUEzNkQwNiBeCiszRURFMTE4RjdFMjc2NENDNDlGQkMzODczNTA4RDM4QTJDNkE0NTkyIF4KKzAzREYwQzg4MkZFRUQ3MkY4MUIzMDM0MTQxNzg5NzZBQkQwODlFRUYgXgorMkE4RTM2QjZBNTQ1RDFBQkU3QjAyRDZEREQ3ODJBRTAzMkY3RUQ0MSBeCitEOTA1ODhFNjA2RkJERjNDQzYwMzA3NTZERjkyRkIzNzI5NDQxRTZGIF4KK0JDQzQxMzEzM0I2RDg0NjIxQjQ4MkE3RDIxNjNFQTk1NUFDNzMzQkYgXgorQkUxRjM2RDM0REVDNTQzMDZFRjIwRDgzMjZGRjYwM0E3MTZGNDMzMSBeCitBMkJBRTQxRUEwMUU4QUU5RDU5RjVFOEU2NjNEMjJDOUY0MTRCMEY2IF4KK0QyMjk1RkUyNjIwNkRFOUVEMTY5RkVBNDg3QjE5OEU3Q0EwREU3OEIgXgorMDZCMTMxMzBERDEwQzk0QTI0Q0I1MERFNkE2MTI4NjdGODVFMTdGQSBeCisyQ0Y0QzRGMkYyNzBBRjYzRDcwMzU5MDMyMzFDRjdFNzE4MEU2NkU1IF4KKzBBOUVFMzI5M0EyQzlCMkFDQzJGOUI5OUJGMTdBQUM2MTgzNDc4NTcgXgorQzMzOEYxNEMxNTZEODc3N0VDRkMzNkFERjE4NTBCNjRFRTlFNjE3OSBeCitFOUJDNkRBMzVBRUIxQ0MzOTk3MzNDRDBBRDNCMjJFNEUyQzgzRTkyIF4KKzdBNDJGODIwMjEwMTU4QUQzMzkzNUNCNzdENzhDMjhGOUZFN0E5NDAgXgorRUNERUZBNzgxN0E0MzZFNDNDM0RGQTM1MDY5Rjg3OTQ4MTgxQTU4QSBeCis3NjFFQkYzMzZGMTIyOUJGODA3MDJDOUM3Nzk4REFDMzdBQ0YzMDg2IF4KKzE5NzVCNzE2ODgwQjQ5QkEwODYzMTM2NzM2OTQyRTY4OEM5RUVDN0MgXgorQTQyMzJDMzIyN0RCQjkxNTgxQjg2RkFCQjFDNUFCMEEyOTgwMURGQyBeCis0OTk0N0FGMUQ5NDg4RjE0NkJFNEM3Nzc4MkNCMkZDRjZFQjEzRkM5IF4KK0EzNDAyQUUxN0RCOUU2RUM4OTlCMEUxNTk3MzA3M0NGOTQwNEEyREYgXgorRENBRkMyREM1QkFCMzg2MjlERkEwREUxNDU0QzMwMEU1QjlBMkQ2NiBeCitBN0Y5MTVGNzQ1RTMwRTRDRjZBRkZBQkYyMTRBQjZEOTUwQzY2RkFFIF4KKzc2NDUxNTI3N0Q0QUY3M0ExNEZBRTJEOUNGQTRGOUJBRjMwNkNDQjUgXgorQjAyMUVCMDhBNDM2QjAyNjU4RUFBN0JBM0M4OEQ0OUYxMjE5QzAzNSBeCitCOTdGRTlFMUM1OTE4RkVGQkVERDk4NkI3NTdDQ0Y0RUM0QUZBNzVEIF4KKzY5MTczNTM1OTZCRkFGMUE1QTA2MTE5RUNEQUJCMzdDQjAxN0Q3MUUgXgorRkNCNEJDRUJFQkJBQjY2MTQyQUQyQTVCMzVBQjVEQkY3OEM2QTQ2MyBeCitCQ0E0NTRCNjlGNDQ4Njk2MEM2MzNEMkM0NDUzRkQwMUQ2NzU4QkNFIF4KKzVDRDI1RTYyQUQ5N0FBNURCM0E5Q0VFOTlDNTg0MzlERkJGNjA3M0IgXgorRTg0MDVFNTgzRDMxQjNCOEU4QjM2NTA4N0YyQUIzOTE3NTMzMjRBNCBeCiszOUUzMkFFNDA1NDIwREVCMDcyNzUyMjQ4MTdCNTcxODcwNzk4ODZGIF4KKzYzQUMyMEFGQUVEQUZCRkMwMTg3NTVGNENFQjEzQTA0MkJERUZERkUgXgorMjcyNDVDNzRCNjFEMTlFQTI4RkVEODFFNTlBQTQ4RUZDMjI5NDZDOSBeCis3MjU0QzhGNUEyREYwRTc0Nzc2MEUyRUIzNTNDNEFCMjRFMjUzNjAyIF4KKzMyREQ0OUI3OTZBQkNBNzYzNTZBQTlBQjA3RDY2OUNCN0JDN0Y4OTkgXgorQjgzRjNGQkU2REIzODIyMzI1MzM0NEU2OUMzOTlDNDc0RTRDNjRBNSBeCitCM0UwRUI0ODRBRTVCMTBCMDE3RjUwOTczMEYzNTA0ODFBNjBGNjM0IF4KK0E5OUZDMjQ3QzE3N0Q2NkNCQzZDMjFDMTBDMjFFMTBGQjJGMzNFRjkgXgorQTdEMDMzQTk0NkFBMDMxNUNEMkU0QjcwMjUxNjRCNzdFNTk3OUNCRSBeCitGMkRFNUNEOTEyRDVDRkU3MjdCMzUzQURFQ0I2QjdGRDExRTgwMTg5IF4KKzExMUJBOTA1ODJFMTdDQjVFMUJCNzBBQjcyQzk5RkNGNjQ3ODc2QTAgXgorOUFGN0YxQTc0MjIzNUMwRTM5NkY2RDEzMTlCRDExMDQ1MThGODQ3NSBeCis5MjNCM0U1MjQ2RkI1MEZCNTQ0ODc0MkI4RUE4Q0Y0OTIwRTcwNzAyIF4KK0NCRkM0NTYzMzM0RDEwNEU0REYyNDQ0M0EyOTVGNEU5QTdEN0Q0QUEgXgorNDhGNEJFREU3NkM2RERFOUI3MkE5RkVENTBEMEJEQkQwREY3RTdBRSBeCisyQTIxRTc4MjhDMDY0REIwRDY4NDU2MTYyMjgwMkM4NkE1MDRERDM3IF4KKzJENTk5NTcyRDZFNTdBNDM3QTJBODQ1NTQ2RkJFRjlGMkZBMTFBRDggXgorQ0I0Q0ZEOTJGRkVGRkRERkQ4N0E0Nzg2RDYwRTI4Qzc2MjJDNzFERiBeCitGQTZEQjlEMUVCOTI0NjE0NTRFN0RBREMzNkM5Q0U3QTFGMzBDNjNFIF4KKzk4QzI2NEI3Q0RGNzc0QzdEODJGNERBNUUxMTYwQUU0MzcwNjY1Q0IgXgorRDUwM0QzQzVDQUY3QTJEMTI0QTdGOUYwRTdEOEQwRjVFMjlCNkYxOSBeCitBRUZGNUFGMDAyMzg2OEVGNkUzQUQ0OUYyQzMwRDY1RTk2M0I2MzA4IF4KKzczQjE0NjRCOUQwNTUwOUJFNzJFODNDODE5RjlENjE4QjMxMjEzMzYgXgorNzkxNzc0NjY2RDI2MjlENDMwNEJDODExMzhCNEQ4QTc1OTlFNzdENiBeCiszNjJBMkQ0MTlCQUYyNjNGMUU3N0M1Njg5RjYxMUFFMzAxQzA0NEYyIF4KK0I0RDQ3OTZEMUJDMTg1MUREQjc1RjVEM0JBMzA4OUQxRDBFMEExNUQgXgorQjdDNEZENDA0QTczQzBBRTQzRkFCQUVCNDcxRkRCNkY5QjI0QTI3QyBeCitCOURDMTE4MzQ5RERBQjM3REQ4MkI2NUUwOTIyNzdDMUUyRjIwQzVGIF4KKzE0NDc4MjkxM0RGMkZBOEY3NkQyMTBBN0EzMjFGMzYyRkE1REE3NzkgXgorMjlENjQzNTFBMTc4RTUyRUREQTlBNEIyRjUyNzlCNzBGM0ZFRjM5QyBeCiszMTA5OEE3MEZCOTUxMjhCRUNDMkM3MjlDRTVBMkE0QkNBMTIxODQ1IF4KKzlDMDVENkIxNzFDNjBDMzc4MjJDREJEN0U4QzFDNTcyODZFMjc0NjEgXgorNkZGN0M0OTYwRTM1NDYzQThGREI3Nzg0NEEyOUREQUQxRkYwNEY1MyBeCisyRTA4QjkwODg2NDY3Mzc2MjBGMUI0NDhFODFFQTVFNDJDNDBDNTk1IF4KK0FGMjM0MkQ4RjRCRjEyRjlFNTI0RTQ0QkNENDIwNjZGODQ2MjA3MjcgXgorNTQzQTFBOTlCNDk3REJCNzc3NjQwM0YzMjUyQTlCMkUxMUEwNjEwQSBeCitBMkE0NkJFRjA5RDIxQTlCQTMyQUFFNEZDRjdBODQ2RDEyOEYwMzU4IF4KKzgxOTYwQTIwQTc1NUY4NEIzNjIzRDFFMkEzOTVFREIxMkRGREU3M0YgXgorQjAxNkM5MEIzNTBBNUE5QUQ0QzFGM0FGRTQ5RTNFQjIxQUFFOEI3QSBeCis0MUQwM0E4RDc5RThCQUFFMTE2QzJGNTU3M0Q4NjlEOTdEN0Y2RTBCIF4KKzgzMTIzN0Y1QkRBQzM3QzU4QkEzMUY2MTMxOTgyQUZFNjgwQkFDMUYgXgorMkU4QUNGNUZERTE4NTQyQkRDMkQwQjk1RDNBRUQ3RkM0OEI1OTkzQiBeCisxNzE3NjNEODgwRDQ1ODg1RUE2MUY1RUQwNEJCNTFCNzlDNkEyNzI0IF4KKzQwNUFEMjgyQTIxNDFDMzhEM0Q3MzFGOURGNjMwNjY3MDY0QjlFRDAgXgorMDdGMkVDQjk0NEQwMURERjlDNjhBQTY4NzYyQkYwN0YzODVFN0U2RCBeCitFQjVGRUJCODEzRTRERDdCRjg1MkZCMzI0NjYwMjVGN0Q0RTc5REQ5IF4KKzUyREUwOTBEQjAyNzM4NUYxN0M5RkQ0MUY2MTI3MjUyNUZFMTA4QjEgXgorMTAzRTM1MkEyNjExMzRFMTE1NEVEM0MzMTJEODkwNjQ2RkVEMzhBRSBeCis2NUM3Mzk2OUUzNUU4RjMwN0I1MThBQkJERTg1NjU0Q0FEMTNEMEM3IF4KK0ZCMzgwQzAwOTlFQURFRDlFRDhERDQ4RDcwRTE1QzdBMjZFMkY0MTcgXgorRUY5RTEyMkUwQjhGOTY4RUYyNjJFMUE5OEJCRkVEN0I0NjE4NDZCOSBeCis3NzFBMTYyQkRFM0NDNEMwN0JFN0ExREQyNTQ3MDI4NkYxMzMwMjBFIF4KKzVGODkyMzUzREM1QzY1QTFEOEM5NTEwQUNFQzQzREQ5NkY0MzI3NDIgXgorNEU2NThCODc0M0Q1MTAyMjFCOTY4RjJDNzhDNzJBNTg4QTVERjZENiBeCis1RDUyOTVBQ0VDMjRGOEE1MkVDQzVCMTc0RTQ4ODQ3MzJCRDIxNkUyIF4KKzc3OTFCRDBFMUM0MTM2RDk3QzQ2Q0NENjZEMzZFOTg0NDNDNDE4MkEgXgorNTE1NDE5QUU1OUJFNEU4MjRFNTc1RTQ5N0YzNjFDMzM4MkMyMTc4MyBeCis3NjY5RDBEMDgzQjNBMEE3QjYzMUVFNDg3MUFEMkEyQUY4QzUxMkY5IF4KKzkwQTFBOUJEOTM1MDFEOUFGRTUwNDBEREVFMzk1Rjk0RTU1OTRFRTQgXgorQjhFNDhGNzk2MThDREU5NTEyOTZGMUQyOEI4NzY1M0MzQ0RBNkZEQiBeCitGRTk0RDUzNzNFRjAwOUVEMkMwNkY2MzJDNzM5NzE3NzkxRUI2QkI2IF4KK0I1QzM4NzFEQTI0NjZFNDYzNUREM0JDRDA4NUEyQjhFMjIyQ0U4RjQgXgorNDMwMzJEMDIyRDI0QjY1Mzk0RjdBNzA3Qzg0NDFDMkE3RjNDRDk4MCBeCis4N0MxMzQ0ODAxN0RCM0I2QzU1MzI1MEM1OURGNEQzRDU3Njc2Nzg4IF4KK0YzOEZDQTQ1ODk1NDMwNTE5MzVENEYxNTI1NzEwQUIzNjYxNjFGMjIgXgorOTIxRTNDM0RFNzczRjk4NzQ1MkNBRTI4RDNDMTBERjk4MDQ2MzJEQiBeCiszMjMwOEQ1QkNBMzNFNjk0MDcxQjhDMTc0NzBDNjQ2OUVEQzFEQ0NFIF4KK0FDNTI1ODI5N0JBMjJGRTYwQjQ2NERFRTIyMzQ5QzcwRkRGQUIyMTkgXgorNTk5MzIyQkMyMTRENzI0ODIxNkYwQzZFQ0YwMENDMzRDNzkyQzVGQiBeCis5OUVCQTkxRkFGQzI3Mjg4QjNGRjMyREU1NUJGMTdCQzZENzZCMTZDIF4KKzg5OURGN0MyMTc3OUNDMEY1NEVEQ0Q0NDEwNTFDQUNCRDJCMDY5NDEgXgorRTVFMEJBMThCRjNDOTkwNjJCQTQ0NDg0Nzg3NkM1Q0EyREI4RjlDNCBeCis5NEI4QjkwNTY2QjJFM0JEREE4RkY4RDM3QkREOUY5NUNGOUJFMEIyIF4KKzg2NDIyQkFENjVDNUUwQjIyRjAyQjlEMTUxMEI5RDI0RjQyMjdBQzkgXgorNDI3Njk0Qjc3MkEwODQwMDM4MUQ0NzI4NTRGQTVGRDRENENDMUQ2MiBeCiszNzMyREE4RUJBODRDQjQ1OTFERDRBODdCQUU5NTg2MzVDODVERDcxIF4KK0Q0MUMyOEMwMjhFNDJBRDFERjUwNTdDOTdCQjk1M0IwM0FFOEY2QUUgXgorNEM0NDI4NkY1OTc5RDQ0QUI0Q0E1RTM3NzZGMzBDQTA0Q0U1MzlFQyBeCitFNjk1RDlCMDQ5QTE0OTdBODY3NjUxOTVCQTc4ODRFODg2OTE0MkRFIF4KKzJBNURFOUM1NDg5Mzc1QjhFRkRCMDlDQTI5RDMyRkRBREFBMDc0MDIgXgorMDEyMzU2RUI0NkE1ODc3NjNFQ0QxRUM5RjMxMTRCOEI4Qjc5ODdCNyBeCis2QjgwM0RGMDdFNUE0N0ZCQkU0MTIxNDlEODI1OEI1MjZEMkJFOTZCIF4KKzE0QTEwOTBDM0IzODI0ODJBQUQ1RUY0OUIzMEQ4NDIzMTc3OTI3NDUgXgorQzJBNTc2REUzODUwMTdGQTg0ODU1Mzg4RUU2Q0IxRjUxRjQzQTZDNCBeCis1NzQ2QjhDODhDRTU0MDMxM0EwNDI5RTY0ODQxRUNEMEFENTY5Mjk5IF4KKzI5OEVGQjg3RTlDMDkyOTlERUMxNzE3MTkwMjY4MkQ5MTk4OTlDOUQgXgorNTVBRUI3OTMwQ0Q2MjAyQ0Q1MkU2NTEzRUQ0QzM1ODI0QjU3NDE5OCBeCitFQ0RBQTg0MDRGODgzMzRFOUMyQzZGQ0M5MjA5Nzk1NTgxNjU0QzI1IF4KKzA2MUZGRkNFOEY2OUJFMEQwQzlCNjNFMzBCQjA2NUM2Q0M3M0RGMzMgXgorMjI5RjNBOEJEMkY2RkZCNUNFMkRCMzMwQUNGQkM0QzRENzc5NkQ3RiBeCiswQkFCRTYwODAzMjQ4MDU5RjNCMDVFMDZFMjczQjVGNDFBNjE5QzlBIF4KKzVGNDk2QTVBQUExRkMzOEI3NjA2OUJGOUYwOEM2Mzc3N0VFNzUzMEMgXgorOTFGQzg5OTRGQUEwM0U5QTJEOUQ1NjVGMDQ0NzhDNkRGMDM1QUZFMyBeCitBNjg1NTJCOTA0OUUxOTJCQkY5OEU4MkUyQTY5RTQwNUZGQzJEOTNGIF4KKzc5MTAzOTNEMUQ5RDhCODc2RUM4OUZFOTEwMDMyMEQzNzE3ODlDMjMgXgorOUI5MjNGOTdGMkQyQjA1Nzk1MERDM0MwRTg5OTgxRjIyRjk2RUMyRiBeCisxRUFEOUMyMzdDRjNCMUNCOTVFN0VENzlFRjJFNTg0MkU5MjYzNDQ3IF4KK0Y1MUU1QzIwMkQ2OThDNzVGOEYwQzI5MjYwODFENEMyOEY2NDE4MTIgXgorODg0MkQ5Q0Q5Nzg2ODE5NkIzMUYzNEMwMkJBNjNDRTM0NDkzRENBMiBeCisyNkM4OTc3QkMzNkMzMjk4NTgyQ0U2NzAzRjYyREZFNDQ4OEUwRERFIF4KKzk1NUJFRjM1OEFDQTRENDRFMzNGMzEwNTFBM0I5MkQ5NkJBNjY5RTMgXgorNjhEODQxQjI5REEyODVEQTUzQTMxRTgyMzQ2MkU3OTRCMzEyNjkxNCBeCitCQjUyQzE4MDY2MDVERDM3MTEzMDM1MzkwRDk3MDM2RUZCM0ZFMkJGIF4KK0JDNTU3NzJCQzlCNjA2NjExMjUxMkUxQThCNjMzNDExQjk1MDhGQTIgXgorQkREMkNBNEI0MzE1N0MwNENFNzA0M0Y1N0I3RTI2MTBEM0UxNzVEOSBeCis4RTQ5M0YyNUUxMTBGNjI0NEZCRDc1ODVDRjE4RjI4NTkzMzk1MEVDIF4KKzY1MDI0MkRGOTlFOTg1REUyM0E1Q0ZDMjVDOENBNzJDODBEN0YyM0UgXgorNTZBMDYxRkU0OUI0Mjg3OThDMzI5MzM2RDRCMTg0QkZFNjlDNDEwMiBeCis1OUZGODE3Q0VFOTQ2Q0I5NDgwNTYyMjc2MDdBMTE5RjRDN0REQTg5IF4KK0JENEYwM0YxODc4Q0VBODZFMkFEOTgxQzZBODA3MDFFMEFEMzBCNEEgXgorQTYzNUY1MjhDQzQwMjg4NzcxODRFODkxOENGNzNFMUFFRTZGNzc3RiBeCisxNURDQUU4N0Y3RTQwQ0E1NzdDNjFDMkFBNUI2RDkwRjBDQkU2RENFIF4KK0Q2N0JEODVBMzUzQ0VCQjk5QURFNENEODZCNTQ2NzNERDZENjQzNjAgXgorMTYxOURFNzIyOTAzMjgwMENERjA3MTgzMENCQ0MzMjA4QjFFREIwOSBeCiswOURDMThCRUUwQzJERDlBMkM3MTg5QUE2RDNERUI4QjdDQzQxQ0U1IF4KKzQxNjVFRDQ3MEQ4NUZFREQ5NTkzNTc3QTkxMDEzMDZDMzE4MjVFMDAgXgorQzUyOTQyREFCRjRGOUQ3MkIzMUIyQjMyOTE3MDVFRjUyMDFCMzM0MyBeCis4ODI5NjAzNUJFNzlGNTI4MUI5MUMwRjEwMDZFNTdDMjg2NzFDQkYzIF4KKzgyNTkzODA0ODgwRjE2OEI5RkY1MEQ4OUNEMTQ5RTlGMjYzRUI1NTcgXgorNTJFNEY0MkZDMkVDMkVCN0MwQTcyOEQyMjUxQTE0QTZDNUVBNUEwMCBeCitDOTFCMjQzQ0JBMjAzMUIyOUYzNjVCQTQ0NTFGRUZENkE5MDIyOThBIF4KKzkwRjZGNUE2NUU2QkM5NDMwQTM0QzA2NjMxMjA4QUFFOEI3NTU1RjUgXgorNzUzNUQ3N0M4ODA5QjRFQTIxNjc4QkY5Njg2NzkxNDE4RkM3MTkzMSBeCiswMjcwNzBBQzZCNUQ3N0JGQTAzOThCOEFENTU2QTIzQUI4RTk5RUJGIF4KK0I0ODMzNUY2RkI2RUEyN0NFMjE1NkExRDNFMDBFNDJEM0UzQTg0ODkgXgorQjY3MzAzRDcxQkYxMjVGMjQ0MUJGQzU5OTEwNjE3N0EzMkU0M0JBQSBeCis0NkU5OEQ0OUJEQzVBNDYwNEY2MkFBRjc2RTk2NDgzODI5MUJGQUY0IF4KK0YxQUNDNTYyRDk2OTk5NDkzRUVCRDI1MzFBMjg5MjY0QzNFMUJFRjYgXgorMEIyNjE3MTJDM0Y0RDBENzRFQkRERDA1MkUxQTA1OEJDRkY0MTJEMCBeCis1MDQ0NkFBN0ExQTgxQTk3QjFERDUyNEFEMERCNEQwOTk3MUQzODNDIF4KK0UzQTUxQjZBQTVBQTU4NjgwM0VGMjE4M0RFQ0EwQ0I1Q0E4NjlCMTEgXgorQzgxQjUyRkQ2MEFCRUE4Q0Q1RTMxODRFMjA2RjY5MzIxMUYwMDhFNCBeCisxOTcyNzBDMERGNjkzNjIyREZFODcxODU3QTdDODdCN0JFMkU0MzlGIF4KKzQzNDUzREY3NjIwRDcxQ0FENTZERUY5Q0VFNjE2QUQ5RTdDNzNFQkEgXgorM0UzQzZFRTExNDFBQjNEN0VBNTIxNUFDRUY0RTg3NkVGQTg5RDAzQiBeCis1NzczQzI4MjYwQzJCMkQzMjU4ODNBRTczQjA0RDI4QkZEMkU4ODg0IF4KK0VCNkYyNkEwRTc3NDAyMjc3M0NEODZFMUM4REZFQTQ2MUNFNkY4RjggXgorNkMyNjQxMEIxMUEwQ0ZDOTc4NDlGNkU0M0U3N0I4RTQ4RDVDNTM2MyBeCitGMDIzNkNFRjIyOThFRDNEODZBOTVFOUY1MjQ3QzE3NDk5QTc3MkREIF4KKzcwNEI1NDk2Q0UwQUZGNDI4OUYzRDkxNTIzMEY2OUFEQzdBMUVEN0IgXgorQjBENEZGNkI1MEYwOUZCQkExOUY3NjY5M0FDOUNBODc3NjhFMjc1OCBeCisxMERFNEY2ODc1NzdDQ0FEOUUxNkFFREM5OTU4MDIxRDkwREU4NzI2IF4KKzc4NTc0MTk0OTA1OUU4NTA4REI4RDEzMkE5QjA1M0VCNDI3NzExOUEgXgorQ0IwNDFCQUYxM0FEMjI3NzhBMUM3M0E4QUFBQjc0NThCNjY0QjFDNSBeCitCNEIwQUREQkVGQTA3OEFBNDk3MDQ1NjI5ODQwRkQ5NjVCRUVDMzNEIF4KKzY4RjBFNDNCN0RGODlGNDg0RjNDQkQ2OTg0Qzk1MTY4MTQyRTRBODIgXgorRDA0MkJFMTRBMjNEMENBMUEwNDY2MTc5QzExOUYyQTk1OUUxRTExOCBeCitERDIzQ0MyODI0QTg4MUZEQjY1NjZBRTZBNTdCMUEyRDE2MjRFODk1IF4KKzE1Qjc1RTdFMTNCMzc0MDM5QjhDOUZCNEExMTIyQkI4QTIyRkFENkYgXgorODQ5RjBEMzc5QTI3NzVDQ0I1RUJCMEE4ODgzOTUxNkYzMEE2NjVGQiBeCis4QjQxMjVGRjJFQkZBOTQ1OTA3NTQ1OUMxRUUxNDlENjhDNEY5OEY2IF4KKzFENjMyRDNFRUM2M0QxODI0M0ZGNDg3MDJBQjg5NEVBMDVBMUFFRDMgXgorRjJDMkUxMDgyMDA0RURDQkUzREY5NkMyNUQ4ODYwQzBGNUI0MzJCRCBeCis0Qjk2QzNDMjg0RTlFMTJDM0QyRjE4QUI4QzhGQzY3NzZGMzBDNkRCIF4KK0Y0MERDOEI5NEQ5RkU5OTEwMTE3QkNENjZGM0ZGQjIyRjY5Nzc0NDcgXgorRDY1RDEyNkRGNjA0REUzMDZBRUI0MUE2NDFERTBCMjE0NDQ5RDY5QyBeCis5MEZCRUZGMDU4RTgyNUVCOTQwMTIyQjZEOEI3NDkyRkM1NzRCMzJBIF4KK0FFNDQxNEFENDcyMTZEQTBBRkQ5QUQxRTIyQzg4MkY2NjU0MjlDNTQgXgorNUY5RDk3RTkxQjdFNDgxMEFFNzY1QTA5ODAzQUJGQTUwQjZGNjRFNCBeCitBMkQ0RTZBRjdBRkQ4N0UzMDNFODY3RDBFMDNFMTk0NUEwRjBCNzJDIF4KKzE0QUJGNzEzOTgyRDREQzdDMUNDRkNFN0E0ODY4MDU3NjA4MkRDQUMgXgorQkVCOEY3N0E3RDIxMUQ5NDUxQjY5OEQ2NUZCQzBCNUUzOEQyNjA4NiBeCitCMzVGNjYwNjI5OTYyRDVGMUY4NTI5MjAzOTk5RkNBMDE2OUYyNjc1IF4KKzA3QUM1QjA0MTY2RTczOUE5RkI4N0ZDQ0E3NDExMkFEOTNBMDgxMjggXgorMkQ4MjcyQzlENjIwQTczMDU2MUVERkRBRjJBMTI5NjY2Q0VCQjVDOSBeCitDMjVDMTk3MUVBQjI2NEY0NENFRTFGNDQ2MTQ1NzlFRTZEOEM3ODU4IF4KKzc2RjgyMzRFMkYwQTUzM0U4MTA1NDVGNzlBRTI4QTdDNDYwNTZBRjMgXgorMzUwMjVFQTA5RUExMTFFMjk5ODE0RkJDOTU4OTc3RERCQzNBMjM4NyBeCiswQTJFRjU0OEEzOEQ4NEY2QTFDQkIyQUUwMUQ0OEQyOTZENkNEOEZEIF4KKzZGNTQ2REQxNjIzRTkyRERBMTg1QkRBMDE2MThERjdFN0U3QjgyRjYgXgorQTBDMUMyQUVEOEMzRjQzNkRFMjAwRTJBM0Y0QzJBOUQyREE4REQ3RCBeCis4REMxMDE5NUI5NjdGQzdGRTU3QjMzODQ5NEMyQzQyRkI0MzU5OUQ1IF4KKzBEOTE5MkIyNzg1MUNBQTc2NkQ5MEE1Mzc2Q0UyNTVCMkZERTkwNkEgXgorNzc5OTQ1MEQwMDM4MjQzNTZFREZFRTFCNDA4QUE1OUU4MzAxNzVBOCBeCisyRUE2RjMxODhEMzAxMEVERjRFQkI1NUUwMDlDQzREOTkyOTZGNTc4IF4KKzJBNzNBQ0I4M0ZCOEUyNUQ2NUZCQzFCODA4NUJFNjczNDJGNTg1OEUgXgorNjdGOTkyOEEyNzExOEVDQzM4RUUyMzFFMDU5NzdBNjk0QUQwRjdBQSBeCisyN0UyMDc4Q0M5RkRERjVDNURENkNFNjI5RjNFRjA3MUIyMTA3OTM2IF4KK0Y1MDU0MEI0REVFMDcxQzY0RDg2MTg3MkYxRTBCQzRDN0RFNzVCNTIgXgorODdEQzlBRjc3MUYyRUU1NDNGOTZEQjBDOTI0QUU2NTBBMDYzRjg1NCBeCis3NkRCODg1REQ3OTcyNDlBNEUyRjc5NDE3MURENTU5RkYwNTZBOUZCIF4KKzlBQzJFOUNEMzg4MUJGMTRENzU4QTdGRUJEQTgxQkM5REREMzE2NTIgXgorRDNEODU5NUQ3NUFGNEQxRUVFQkVBODE2NkNBRkIxNTZFODI3REU5MCBeCis1RjdEOUQ5QkQwRERDNUEyQUQ0NzcyNjEwRkUyQTQ5MjNBODI2NDg2IF4KK0Y0MzdCQjZDRkFBOTEzOUExMjAxRkVCNTg4NDFCMThDMzgwOUYwMEUgXgorOEMzRUI0MDJEOTJFNjU0M0Q4ODVBOUZERTJGQzgwQjlENDM0MEU4RSBeCisxMzQzMDdDNTBDMjRCQkQ3ODIyREJBMzBGNjQ0Qjg3NEVCQjU0RjBBIF4KKzI0Nzc0REE0NjY5QzIwMzdGN0IyQTQzQkNEMUM4RDU3NDcxNUYwNzEgXgorNjlGRUY4RkJDOTAzNEQwNUYzQzlCRDlDNjYzRDIxOThBQjQ4RkEzMCBeCiswMzkwRjFDNDk0MjE4MDZCMTlERjFGODg2OTAyRjM3MDg4REY3N0RGIF4KK0RENTM1QjEyOUY0ODIyNTY1MDNBRDI3NDRCNzEyQkZFQjhCRjIxNkIgXgorQUJFQzU1MkU0MTAyMDE0NEVGRTA2ODU0MTQ5QkUwM0YxQkQ3RjZGNiBeCiszRkM4QzhBMTREMTQ1MjcxM0U3NkVERDVFRjk1QzIzOUYzRjhBNEU0IF4KKzg4NjFBODQ0MjlFMjM4RDk0RTc1RDNDQzE5MUZCNEQxMjgyMTVGN0QgXgorREJBNjM3N0MzNzZBRUQ0RDFFNzlDMTk4RUE4NjRCNkU2RDkwQzQ5NCBeCis0RTVEQkY4MjNEQzVCRkY1NkM5OTlBMUZEMEFCQkM1MTE1NTAxN0QzIF4KKzY2OTk0MjBDNkZGNTEyQkU1Q0FCRkUxRUJBRUZCMEFFNDBDREQ5MDIgXgorNzdDQUUwRDdFREZEMkQxMzUwNkQwOTZENjZBMzJCOTkwN0FCOUIyMyBeCitGNjAyMkYyQTE1NDU4NDI5MTUwMjlCMzQ0QjE5RjRDNjk3NTc5MjVEIF4KKzZFQ0QwODVGRjM0MDMyNjM2RTdCRTcyNjlEMjlEQTYyQkM0QkZCNUIgXgorNjBDQzUxMkJFNTA2QkUxQTU4MENFRUFEMkEwMDlEQjhEN0ExQkJDNiBeCiswRjM0REZEN0VERkE2QTVERDEzMkIyRUU3N0I1MkVFQUQ5OERDNzAxIF4KKzFCRDU0MjU4NUFCMzNBMEEzNjk0QkU0NUQ2QzdFRUJDMjY2RDQ4MDYgXgorMTUyNEYyMDM4OUVCQzJEN0RFNzc3Rjk2MTU2REY5QjJBODY1MjM3MyBeCis0NTEyODJFNkRBNzA3NjY4ODg2QUY3RTc3REI0QzU4RjczQ0E2RUMyIF4KK0JCN0Q1OTg5MEJDMzlGN0Y4N0Q0REQ3RTI1ODNDNzM3QjJCNDBCODYgXgorMjU1RDY3RTNBRjY1Mzc2QTFENzFGRkNDRjUwNTgxMjQ4MUFGMTgyQiBeCis0RDU1OUJDMTcxNTE2Rjc5RTIyOTM4REU5OTk2ODVGOUZGMDUzODNEIF4KKzJGN0VCMTYwODFCMjMzOEQ2MzExNTNENUI3MERFNjdGMDUwRTM0OEYgXgorNTkwMkNFNkNGNzcwMEQyRTIzQ0VERUU3NDJFMjczRjRBNkEzOUY2RCBeCis3RDM3QTc1MTVEMUUwNEQ0NENBMEYzMTQzMDY5MTlDMDMwN0ZGNEFEIF4KKzE4QzIxNUE1QjhBQTlDQTVDNTVERjhCQ0ZDNzk2ODNFOTk4MkIxNTkgXgorNjM1MjBDOUREMkNGMzIxMzg4REM4OUNDNjlEMEQ5RjY3NzJBMzU1MyBeCis1RkExM0U2Njk3MTk2RUJEMEU0MEZFQUVENEI5NDVDQzkzMzc1REFEIF4KK0JGOENBNjBEMDdEMUI2OTc2NzA1NkIyRjgwQTlBQzRCMUY5RkE5OUQgXgorNkNERDEzNDMxRUI3MEQ5RTM0NjEwMkI3MDhFOUY4QUIyMzNDRjk1OSBeCis0Q0I0NDhCNDEzMURFQjhGMUFDMzA4NTc2NTMwM0NGMjE0NDM2QTI2IF4KKzFGREM5Q0M1OEE3NDhBOTQ3OEE5RTU1QzY2QzY0NDY3NzUzODJFQ0QgXgorMEVEQzVDQzdDRjhDNkNCMzE4NjE2RDYyQ0MwOENEMTQ0OTk2MDMxNSBeCitENUQwRDU0MDI4N0QyMUFBNTE5Q0U5MEI2RTNEODE5NThBMkUzMDdEIF4KK0JBNUNDRDMyM0I5ODdGNTRFMDZBRTA0QTA5OTU3QkM0MTdBREE2MTEgXgorMjY4NDZGRDY4QkE5NTZDRUIyODk5RERDMTgzMjQ4NDNEQzIxMTQ4NSBeCisxMkJENzA1NjVGNzAxQkIzNUI4NzM2NEI0N0Y3M0M5MzI4N0U3NjcyIF4KK0M1N0EwRjk2OTU5QzdERUREMzUzNDYyMDk5RUZFMzgwQ0IyNzNFOTAgXgorOTkwMEQ1MjY4Qjk5MTY1QkUxQUEyQTZCNDFCOUZCNjY0NTVCODY1QyBeCitENUFDMkMyQkYzNkIwNEVBRUY5NUU4QjkzOTU4QkUyOEI1QTRDODM2IF4KKzgyNzg4REFBN0Y5NTI5MkIyNjZDQTE3RTg2NjMxRDg2NkQ2OEZENDcgXgorMzdCOUU2Mzg2MTA0MThDNENFNENGOUFBQzBEM0U2NEYwMzNEM0Q3NCBeCis5ODQ1QTE1NjI0MENFODQ3NTA4QTFEMzc2MjM2MkZBOTAyMTZFNTlEIF4KKzlFNTlEQzc2RUEwMTU2NzE4M0E0QjRBRDY1Q0QzMUYxNjk3MDZDQTkgXgorQjJCNEExNTAwQTE3NkM4ODMyNjg0NDdBMDlERTkyMEYwQ0Y3N0Y3NiBeCitFMTRGQTExQjYwQjkzODlEM0I5QjJDMUU3QzQ1OTMxOTkyRjY2NkFFIF4KKzkyMkQxNjlDNjI0RTc5REFCREI3OUI3NkU3NzdGNjk5NEMzMzlFRjkgXgorQUU5OUMyRjQ2QTM5MzlDQzVFRTNGOENGNjhENkVBNDg2MzkyQzIzRCBeCisxNTRGOTE1RjkwMzQwQ0JCMDNCOTUxNDgxMEZEMzk5RUVEMDZDRTNCIF4KK0M0NDBFMUU3NEM3NTI2NjgyMjkxOTA4MDk2NkFCNzREOTZGRjQzRTIgXgorNDA1MTU1RkE5OUVGNUU0QTBGNEU5M0QxMDdDQUVDODlBODBCOTRBMiBeCiswQUE5NjI1NDU1QTBDQ0RGMzdENDg2QjQ1MzhFNzkwQkU0MDdBNTlDIF4KKzQ2RDYzM0Y3RjJFQzU2NDk2RDUzMTM4QTU2RDExRDlBQkRCNzAxRTEgXgorNzVDMUJENTczOEVCNTM4MEUyNUVDNEZDRkNDN0JCM0ZEODE2NDQ2MCBeCitCNjE4QzlFNTIzMDM5MTlCRjc2MkQ0NTJGNTY4MUQyM0FCRkYyM0I2IF4KK0QwOEJFMUY1NDg1OTM5Njc3RDI5NEM0MTk4RkExNUIxMTg5MzhCM0YgXgorRjkzMTQ0MTI1OUI3OTNEQUJBRjA4MkQxQjAwMjRBQ0FEM0NCNDhBNiBeCiswOTZFMjA2RTM3NTNCQkVFQzhGMEYwRDNGOTdFQkYyRUIzMDYzQjFEIF4KKzEzQUEzOTdEMDNDNjBBQTQ0MTQyNzFEMzNDQUMyMzYxQzEzODQyMkIgXgorNzc3RTI5Nzk4MzRFOEM2RTg5RDIxOUU5MTA5RjBBMjg1Mjk2MUVGQSBeCisxMzk2MEE2NDhEQjhCN0NGNTQxQTU2QjkwMDlBNUY3RkJDQzFBQkFCIF4KK0IzNDQ3QTNDNDYyQjUzOTQ1RjgyOTUwMzJGQzlBMDU3QkMzMDFGQjcgXgorOEM0MjM4NkEyNDM2REU4M0UxOTU5RTkyQjQ0RUJGNjFFNkM4RDA5MyBeCitEOUVGOTFCMDRERDQzNzE5NjhFMTk3OENCRkVEQjUwQzJCQUJCRTY3IF4KK0U4NDA0MjQ3OUQxRDY2OUFCNTg3MUI3MUQxMzQyQUQ2RDE1MTA1QzIgXgorNEFDRDExMkNEOENBQzcyREYyRDREQTc2OTEwQzJDRDNCRTFFQzI1RCBeCitBQTIwOTgyRTJCMTM4RkIyNDA3RUY5OTUwOTA3NUNFODM2NkYxMEJDIF4KKzVFM0JDNTM1QkJGRjQ3MTY4Njg4NTMzMUNEOTgzMUM4MEZFQjE4Q0QgXgorNTNDNTVDODBENjQ0MTEyMjFDNzMxMTY1NDkyMTUyM0QyQkQwRTIyNyBeCiszRkI4Qzg1MEI5QkM3QTkyMzc2N0QwMzY5OTJBRDc5RUQ3RjBFMUFEIF4KK0FGMEJDQTRENDQwRDY1OTlCQjkxMzk2QTA4MjNERTY0NzY0QzIxMTIgXgorMzBCMTM3MDNBNzAyNTcyMjU3RDU0REMwOTQ2Mzc2OEY1QUFFRjc1OSBeCis1OUM0NEI5OUVEQzI5N0I0NzY0MDIzMTAwNDQ1NTRCM0YyOUY5Q0NGIF4KK0ZFRDA3ODU5NkM1ODQ4MTBFNTMzNjU0NUY2RjZCOTMwMjdEOUNCRDYgXgorNjQ5OUU3MEU1NDU1RjlDOEZGRDJENUY2MDAwMDlBNDNGQUU3MTBFRCBeCitEMjZDMDcxOEE5QzgyMjJGMzBEMDIxRThGQTY1MDg5MzVFODBCQzg1IF4KKzFGNDE1MjQ0N0VDQjhEN0NENzI1QjU3QjY1RTMwRjc5QjQ2NkJCREUgXgorNkM0OTU4NjY1RERERkM4MjhDMTQyN0U1N0QyMzM1OUU5QzVEMTE5MCBeCitCODhFQUQ4NDNDNDg5N0IyQTY5MTYxMkI4MzdFNUE1RDlGNTgxNzJDIF4KK0E1MTA5N0RDMTg4M0IxNjBBQjc5OUQyRDEwM0M0NDMzMzZFQUMyQ0EgXgorNURBMUI4NUJCRjRGMzkxMkM1RTk2NDI0MkE2MUVCRTgzQTNEQTVCOCBeCis0RTlBNDVDMDQxMEYwMjExREQ0RDkxMjNCRkI4QzI5QzUzQTVFMDNBIF4KK0MyQjdDODlGN0RFQTZFNUE2Q0Y5MDkzODg0NzFERUM0Q0EzNjIyNTUgXgorNEVGM0I3RTc4NDYxMTUyMTJCM0U3N0MyOUFBQ0E2MTk4NDIyQkVGMiBeCis3OEM3NDU2M0JCMkNGODE5RjgzRTczQ0MwMDA3MjM3OEMxMTQ2MzlGIF4KK0ZBRjk2RTgzNkMzODFFQzgwRkUxRUE4QUY3NkU5RDhEOEFEOTVGQkQgXgorM0IzMEEyQkJGODRBQjcwRTgyMjAzNDlDQkEyNDlEQjg3RkZEQ0JGRiBeCis2Q0UwQ0MyOThEMTI1OTdGODAxRTBGMUJERTY2Q0E5RERGNkFFNjZBIF4KKzgyNzRCMURCOEMwQzczOTBDMzgzQzgzN0ZEQUJERUJCRUREMUE4QzEgXgorRDBGOTBENjNBQ0QwMTI2Qzg0RDcxNEFEN0M5RUI2NzNERkI0NTlCMiBeCitEMUU2M0VCNUMzNzNDNzhFREY5NjhFMDY1MURDMTE3MTkwNzI1OEY3IF4KKzE1MzBEQzk5NTY1QkUyQjVBRTkxRDFENzBCMDI3RURGRDRFQzZFOTMgXgorRkVDMDk0NkZCOUNDMDQ3MTNDNjdCQTM2RkEzNkVBOTIxMTEzMTI4MSBeCitCRDJCQTY4MEQyMjAwQUZDNUNBRkIzNjJBNTUxN0JFOURBQjdFNTkzIF4KKzVGQjU3RTFBQUQ1QkQ5QzFEMTc2RTFDQTAzQzFBNUE4RTMzRERFMkQgXgorRjZENUU3QjFCMjhDOTA3MDExNURCNjY2NTMwOUI4RERGNUY4MTI4MSBeCitCRkU4OEY3QTBGRDVGNkExQjI2QTVFMTVEMEExMDlBMURBN0MxRkMxIF4KK0U1NjY4QUE0MDM3NUM4Q0EzNUZCMzA0NkVERDhBRDlFREJBODJGRTMgXgorQzg1NEQ1QzVBMEExMDA0MTFGQ0M5MTg5RDYzMDdDNDdCNTcyMjhDRiBeCisxRUUzODQwNzYzMDhBQzZCODBGQjY2ODU2RDVGQTE5OTUyQjNENkQ1IF4KK0NBQTREQ0ZFRTA1OEQyMkQ3MjYyOTJCMkM3MjJEMzE0N0YxRENENjMgXgorMTg4N0M3NjA5MkM5Mjc1QjJERTMzMzAxNEM5OUZEMTNFNUU1MzNCQSBeCitBRUFDNkFDQjQ1NjE5ODVEQ0ZGNkM5Njk2QkU4MzZGQkY3NUUyNEU5IF4KK0NBNDZGMjM3NzNCMzBCRjBBQkY1QzM4RUI5RDBFRTAyMUQ3MTNGOEMgXgorMkVGMDA3OTg4QjIxNjFGRUQwN0U1MTgxQzM0MkU3MjREM0Y2NDBBMyBeCitGMEYxNDIyREZEMzRFREUwMEE4QjA3NDFGNEYzOTUyMzQ0ODBGREI4IF4KKzJDNDcxQkY4NjdGNUEwMkNDMjQxRTM1RDk1Qzk3QjQzRDY1MzZFN0QgXgorRDQ5MDZDODgwNEIyNDFFMjhGM0YyRTYzODAwMTlGQjczOUVDODUwMyBeCis2MzIxODNFRUY4QzZFQzhFQUEzMDE2QTQzRTU2OERDMzhFMjkzNzlDIF4KKzE4MDgxMjBENDYxQTg2N0M5MDIyMjQ2OTk4NTc2OUFGMTc1NkVFNUIgXgorMDhDMkY5N0I2RkE2RTE0MzNEQUY1NjQwM0NERkU4Q0VFQ0Y2QkNGRSBeCisyNzY3RTExMTk3N0EyMEQzMThFQUUxOUQ1OUUxRTU1MUE0QUE3RjFFIF4KK0IxQTcxNThDRTU2NjY2QkNEMUZERTdEQzg3QjQwQzkyNzA1QkZERTUgXgorN0NFOTA1MTRBRDczNDM5MEY2RkU1OEJBRThGRkNENjYzOTFFOTU5NSBeCitDNTdGNEMyRDhCNzhEQjg0NjRFRjFGNzE5QjhCMURBMjcwODY3NDgwIF4KK0M5NzkzOEYzNEM2REYyNkJGRDUwOTY1ODgzOEY3QzM1RkRCMEM1OEIgXgorQTVDQUE2OTQ2MzAwQjFDNEI1RjUzQTY5QUFBRDY3OTYxQzRDNjgyMSBeCitEREY2ODQ5NDdCMTY2N0E3N0EyMkM3REZFOEI2QTBBODQ4NEUyNTA5IF4KKzhGQjEzMTBGMUYyMTVFNEVGNjJDNDE1NjZDNTIzMjc1QkM5Mjk2NzAgXgorMTU3M0NDNDQ3QjM5ODUzMkJGQjlBMkU1QUIzODgwRjIzQ0E3QzI3RCBeCitENkUwQjY3NEI5RTREMjgzQzBBQUMzNTU5ODlDQzBFOEJCRjA5Njc4IF4KKzdEMDgzQkI5QzNFMDA1QjQxRkUzMjYyOUY4NEI5RTI5MkQ4MEZDNjcgXgorRDNFMjU5MUI3RDdDRDI5RTlBQ0U2MURGNjAxOUQ4Nzg3QUM5M0JFNiBeCis3MTU5QjEwQUFDQTlFNzYxMEM3NDA0REU5NjFBQkZEQjE3Qjg5MTU2IF4KK0I0QTAyNDgwODhFODUwRkZDNUNDQTk5RUEyRjI4RUNBQ0JGRjE5NjAgXgorQ0E2M0Y1NEZEQjZDNDZFODc3NzYwRUY0RTUwRTU2RjMxNjRBNDE3RiBeCitDNDFERjUyRUIyNTI5NjE2MTlCRDQ4NjFDNEFBQ0NGMUFCMzkyQjY5IF4KK0ZFM0VGRTQ1M0M4NzA1RTFDRUREMDZGMTVERjVCMzVBNzMxMURCMzIgXgorNUUyRThCQjA0QjMyN0U5MTU3Mjk5MkE4QTYxMDYzRjdBNzZBOTNGRiBeCis4RUEwMTkxRTg0OTE0MDAwMzhDQzVCMTQxNkU1QTU2NjIyRUYxRThGIF4KKzQ3NzI3RDREN0U4RDk3Mzg2MDhBRUVERUIwRTEyQzlGMjQyN0VCQ0IgXgorNzM0MEY0MDVCQzQyOERBNTE0RTdCMkYzOTcyOENENzdGQTIxNzdGOSBeCis1RTQ1MUM3QTUxQUVCQUJDRUY5RkRGQkYzNTM4QUZFQ0I5Njg4NzJCIF4KKzUyODAzODI3NDgwM0Q2REI0MTlGNjkyMzk5M0E0NUM5OTk0MzMzMzYgXgorMjgxRDMwRkQzQzcyNUE0NjQ2QTYyODczMjkxNDBCRUE0QUM3QTVCOCBeCis5MjJBNTdEQkY2MkMwMURBMTlCODlGOTBGMzZDNDMzODE3RjA4OUIwIF4KK0M3OUFCMjI1QkJEMDMxNDVBOTgxREJFN0JGNkZERDE2QTVFOTVEOEEgXgorMzAxQjREMEUyNzBGMkFFQzZFMTM3MjU2MDM4NUQzNzg3NUVCNjgyQyBeCisxRUYyRUM2QTM2NDJDN0ZENjFDNEYxQzNERkM1NTMwMjUzNTI1NEI3IF4KKzFEOTRFQ0YyOUQyMzEwQjFBNUEyMDQyQ0ZBNjE2QkEwRDE5RTdDNDEgXgorNTJEREE5QkVFRkFBQUU2NjdBNkQxMkJFNDE0RkFEODYxOTc1MDA0MCBeCitCMTQ0ODZEMTZEMTUyMUQxMjgzNjk4RTY1MUExMEZDMTRBRkY4OTk2IF4KKzRCQkZCRDAyNDRCRkVFNDQwREJFREM4MzYxODA2Q0FERkY2NzMyNTMgXgorNjYyRTBFNDY2QzlENzAwQzUwQzVGOThDRDc3Q0ZFQ0Y4Mjc4RDcwOCBeCisxQUM1QjgxOTdCMDY4OTY4MUIwRjQ3NDgzMkYzMTZDRDI1MTQ3QUYzIF4KKzg3MjBFMDEyRjE2NTg4QTNDMzY4Njg5MTEzOTAyMTE5Qzk3OTFGRjIgXgorRDg5MkMxRTI1N0E5OTdBOERGOTVCMjI5QzlEMjRDOTlGNjBFRjIwNSBeCis1N0Y1QzQ1Mjg2RUMzRDI5Q0VDMTk5MzlDMDQwNDVEOUMzOEU3NjFFIF4KKzA3MTUxRDJFQzg4OUQyNDczMEFBQTUyODJGQTRERkM0OUE2NkU0MzkgXgorNkFDOTQ2OTBFQTZEQjRBOERDOTgyMjcxNDkwRUUxODI4MkEzQjMzRCBeCiszMkREMTlGMTJBQzA4NTQ5OThDN0IxNEQxRDk2QzE1RkE4OTk1REJEIF4KKzc4MTdBMjVDNkNGMUVCRkFBOERFRDdBODAwNjNEMUEyOTlBRjhCMTggXgorMDFDNUVBQzE4MzBEMUY1QTdGMTg2RTAzOTY2M0NFOTI1RkNCQUNERiBeCitCOUYzMkY2N0ZGNDkzN0Y0NDA5NENCNEE2MkJFMTI0NzRBQzNFMUFBIF4KKzA1QkUyQ0Q2ODgyNDQ3NDcyQUQyRTAyQjA4NTkwRURFRDYyQzc2MzggXgorQ0VGMTQ5RjZENkZDODk4N0MzNjkzRDVGNUNDQUMwQ0RERDNEMDc4NyBeCis2QTdDQzk5REFEODZEQTk3OTdCMUY4MzM2MzU2Qzk4NjRGMjc5RDM1IF4KKzNBNzJGOEVGRTY0Q0Y2MEQ0OTU4OUFCOTJENDgzMDE2MjBDRUMwRUQgXgorRjFGNTkzOTQxOUUzNzUxODJBMkFBOTI4REFFM0NGNkMzNzhFNDU4OSBeCiszRUMxQzFCNzRCODg4MUY4NkMxRDNFREU0MkY2Njg5QzYxMTMyNzEwIF4KKzcxNjRBNUI0QTY5QTAwNEZENzZFQTRDNkNERkUwMjczRDM1Q0ZGNzEgXgorMjI0MzI1QTMwOUZERjIzNzhDNTc3NkIxNzUxQkIwNjk0RUQzMEMyOCBeCis2NEUwRkVDQkY1Rjk0NTE3RUE5RTBGNEUxRTE2RkM3MDBFRTI3NUI4IF4KKzY5Q0RGMzMyMTg1MEJCNjQwRDUyMzFEM0IzNDU4RjgzNzM4Q0NFNkMgXgorMDY4NDM0OUEyQUJFQzA2Q0UwNTEwMEVCNjlEMDFDRDRGQjdBQjE5MyBeCisxREZBNDkyMjVDMEZENzI1MDQ2QUZDQUZFRDE3QjFBQkE2ODcxRkI3IF4KK0VDRjRCMUI5Qzc4QTgwMkY3NDhENThCRjZFMjdGQUYxQjI3NEVFQzMgXgorQTQ0QjY3RUY5MUYyQUFBOUVCMkRBOEIxNjZBMUEzMTY4ODZFODkwOSBeCitDRjM4QjBGN0RERDJGNzJBODkxQjQxQUQwMjZGQ0MzMjgyMjE4NzQ3IF4KK0Y5MTcwMzNENDQ5NEExQ0NDODU4MEMxREJFRDZGMjhGRUIzRTJFNTcgXgorM0MzMjZGNTUwMDM5RjgxNUVDRjVFMjM2RjZEREU1REIwRTJFOUY2NSBeCis3MzMyMDAxMDAyQTExRkRBRjUwMTkxNEE4NjczOTg2MjUzOThENUNEIF4KK0RFQTE4OURDNDFBRjY5NTEwOUFEQ0Q5MzkwNkVCNTM3MkI1MTJBNTcgXgorRTBGMTRCQ0E5MjQwQjI3RTQ0NjQ3RUNFQjRBNDA0MDhFMjg4MERCOSBeCis3NzU0NUVGODQxNDZGOTUyMjEyRDlFMUZEQkFGNjIyNDNDREE2MzBBIF4KK0QxNjJGNjU0REVCNUJCMEQ1NDE3OTMxOUQ4REY5RjFCQjZEOEExM0IgXgorM0JGNzkwMDcyNTI1MzdDQzJFQjExRTE0ODg0MkU3QUM0NDNDQTkxQSBeCis2Q0IyRjI5MUM3MTk4QzlFNDExMkI5OTFGRDREODI5REJBRDdFRkIxIF4KK0M4NTAyNTgwMzY3ODFDMEFFOEEwODNENkE3OTFEM0ZBRUM5NDZDOTkgXgorREM2NEM1MDM3QkRDOTNBM0QzODYxM0QyMDNGQjNEN0M4MkExOEEyNCBeCis2MjBCNzcxNDI4OUZEODJBQkI5RkM3NzZCNjQ0NTcxRjcyQTk1NTdGIF4KKzRCRUJDMUVGNDRDMzBCMEIwMzMxNTNGODgzRDVDNThFNEFFNjg3NkQgXgorRTM4MTVBNEU2QkYzQjUwRUUzMTJFNUE3OTVCM0U5QUEyRDc4MzJBRCBeCis5Q0IxM0QxOUM2NDc1MjIwOUQ1RDRENzAzM0ZBRjlERTg5NjBDMTQ3IF4KKzMxODJCOUYwM0QwQUJBM0JEOTFBMUVCOENERDBGNDY1RkQ5Q0NCNTEgXgorNzNEOEU4QjlFNkEwNEU4OEUyOTc5N0NDNUUyRjQ4OTM1MEQ5NzhBNyBeCis3MzI3MzRDQ0VDMTg5NDRCQ0E3ODRCOTUzRENDMEU1ODIyMjVBQjg5IF4KK0EyMTUyREIwMzA0OEFFMjdCNDdDMjVEREY5OUQyNDk1MDRBOEFERjEgXgorQUI3MEIzMkEyOEQ5QkZBQUUxQ0E4NjhDNEExNjFCNkQ0QjNBOTJFNSBeCitBQjhCOTAwODVCNDcwNTBCODdGNEJEQUZERjk3MTc5MEI3OTUwOTAwIF4KK0IzMTVBOEM4NzAxMUJBQ0E5NjlBMUI3OUVCQUM4MEE3MzQzNzQyRTYgXgorQjc4QTA0NDkwOENEQTk2NDA2MzNEQzhCRTgyOEUyMkY5MEU2RDdGMyBeCitBQzJCQzUyNDZDMUJEOTkyMzFDRENDRjNDRUNERUY1Njg4RTU4RDcxIF4KKzA2NzlGODg4RjhDMzUzQjgwN0Y1NDRDMjM3OUJCNUE0QUU4RUI5QTQgXgorNDY0QjU3NTRFM0Q0Mjg2NENDMEE5OEI0RTY5NkM4MjdFMzI1NDMxNyBeCis3RTUzODVDOEExQkZGMEZGNDc2OTA1QkI2Qjc1MTVCNkQ0MzhDQzBEIF4KKzBGNUM5NjhDQTJGQ0I0QTE3RTBBRjBCOTQ2ODJCM0FDMzQ3QzJEMTIgXgorNEY1RTM1MzUwMEQ2M0M5OUY1OEEyOEY1ODcwMDY0RkEyNzhGQzdCQSBeCitFN0ExMDQ2NTFDNEQ2REZEMDc3OEVDOEFDOEU0RjAwMUJDN0I5REQzIF4KKzIzRENGOUE4NTREMUQ1QjU1OTlCMTRBMEU5QTE5QUI0RjJFM0JCNzcgXgorNTg4RTQyOUZBMUMzMDU1QzREQ0M5OUVFNTQwN0E2NDExNUI1NDM0NSBeCiszOTIxNUFDRTAxNjY5Q0FERkI4MUU5RkIwODU3MTBFQjVCOTc0NjFCIF4KKzIzNTY2NDQ5REQyOUEzMTVENDEzNjA0QTJEQkNGQUUwRDQwNTc5QTIgXgorMUVBODdDMTNEQTM4RkU0QzU5NjkxRDk2QUY1OTBFQUYzOTA4QzBGMSBeCis1QTYxNzBGQzZCRDdFOEMwMTE0MEUxNkYyNDhDNTY4OTBCNTEzMjNBIF4KK0ZGMzI4REZCNTA2QjcyRkRCOERGNTcxNkUyOTFBMTgzMEJDNTM5RDQgXgorN0I0REE4NDZGOTA3NDI1NEM2NzZGMDA5NDhCRDRDOTY5ODE0OEM0RCBeCisyQUMzMTAzOTNFRTFFQ0M1ODQ0QTRCRUMxNUE5Q0ZDMUI1MDIyMjk0IF4KKzNBRTM2MzE2RkE5NEIzNjlENzMyMEE4QjcxMzA0Q0U2NDkwRkVDQ0QgXgorNzA3OEM3MDQxMjc1QkNCRTg0MDNERTI0RDE2QTY0NkI0NDYyODgyQiBeCis4MzI1QTg3MTZBMkM4Nzk4ODhCQTlGNjc0Qzg2OUIxRkYzMUJGMzYzIF4KKzU4NjIwMEI1NUI1RDUzN0I1OUI1RTBCQzZGRDlCQUNFMUU3MkM2RUUgXgorMEI2NzVFN0Y0MzQ3NTZGNUUzMTBCODBCNThGODYxRTc4OTQ5NUY1RCBeCis3NDlDNEMwODU2Q0M0NjI5REMzOTc2NzhDMEU4QkRDQkQ2NDlBNkUyIF4KKzI1MzI3QzY2RkY0NkM0NDY2RjgxRUU2MzVFOEVDMDJDNUNBNjBGMkEgXgorQkQ5REZCNTlFQjVFNTNCQTY5ODg3MzRGQkUwODk0MTk0QTExOUQzMyBeCiszMDg0MDQwRTVFQ0E1RTc3NDA2QjRERjNDQjdGMzI0QUNDOTZCNTA2IF4KKzFFMTRBMDlGRURCNjFDRUJFMjU1Qjk0RjUzM0M0MDE4RTVBRjRCQUUgXgorQzg4NDBDMDUxQTIwNEY4QTEzNDIwQ0YxN0ZFNzdFRUUyRkQ3OTQ1RCBeCis0NzkwMjY1QjUyMzFGOUExNzM4Q0I5Rjg0MjNCRUVGMjE5REYxMTBEIF4KKzM1NDk0N0MwRjJGMjVFQjQ5MUQyMUJEMEJEMUQ4MDlGREQxNDBBNjYgXgorMjM3NjJCRjNDREYzRjQ4NEM3MEQyMDAzQjU1RTZGNDQ3QkFGNDZGQSBeCitFNUJGQzk5NTU1Q0VENUMxNzQzQjE1MkE2NEFFMDhDOUVEMTM2NUQ2IF4KKzRDQjQ0REM1MDdGNzE2QkVENEI0Q0FDNzQyRTc5RTFBMkRGQTMwOEYgXgorNjI3OTBFQzE0RThDRkQxQTBENkZBRjkzRDc5ODRBMUU5NDE2RkQ1QyBeCis1QzJEM0VEOTg4RjVCRDk1NzlEMkY3MTBENURENjhCMTE1ODQyOTVDIF4KK0NGODQxNEVEODVGQTAxMzVFNDRCMzdBOEY4QjQwNzU2QkFFRDIzREYgXgorMDM0MzIwNjRDMUMwNUQyODM5M0M5QUM1ODc4QzlBOUJBQTZFNUM3RSBeCitDMzdBNkQ2NENGODFDREY3REJCMUI4MTUwOUE2N0EwQTFCQjVGMjc4IF4KK0YzNDFEODlCNzVFNTk5MDQ4QTkxMUQwQUU3NTZFMDA2NTY2OUI0RkIgXgorMjY5RTE1MjkyODU0MTRBNzRCNzY1ODZFQTRGQ0VDQTg5NUM3RDFFQyBeCitGRjlCQjM5RjlGRUExRUE2M0Q5NDRCRjEyQURDOThEMUQ0MjU1MDk2IF4KK0REMTE0RjJERjNEOTI5NzdGOURCOThBRUMwNEYzNjdDRkY5RkJBMkQgXgorNjlCNTNCQjEzMzc1RjlFMTIzRkMzMDA5OENEOUVEQjNDMUExRkRGOCBeCisyQTYwOTg0REM3OTY4MkU5NkMyOUNDNzA1MEUxQUNGOTg4RDlFNEQ2IF4KKzA5QUM0Q0ExQTQwQTdEODNBNDYzQUYwODA0QzRFREEyMDhFMDlEMzYgXgorQTJFRTI0NzNDMjcwQTA2MzdGQUFGMTdEQTU0MjM3RDM3RTBDNjk2MCBeCitCM0E3ODE3QURFOTYyRENFRUE3RkI2Rjk2MEVCRTJCQzFGOUJDQkE3IF4KKzg1QTQ2Q0NFMDFBNzk2ODEwNDQ5NjIyNTQ4M0VDRTJDMTk4RjJBMjcgXgorQkMwMjhGNUVDRDg3NzNBRTQ3NTYzRjEyMTZFMEJDMzZBOUUzN0U0RSBeCitDNjVDNDBDQ0MzREQ4MDA0NUQ2QTRFRkYzRTlDN0Q2RTRFMEU1NTgzIF4KK0JEOUMxODlBNjM5RkQzRDcwMTY3MzY3REY2MUYxNDg2OENFN0UzMTMgXgorQzY4OTlBODRCOEU2NjU0OEJGQjUwNzgxNjMyQ0MzRDJEMUJFOEI5RSBeCis5MkYzQzhFNDM2MjI3OTc2RjMyRjAwNTQ2OURFOTFCMjM2MzE1MERDIF4KKzdEMkE4MEE1QzVDQzg4OTg4RjM4MzM0QUZGRTMxQzA0QUExQUZDOUMgXgorRDYwRkFDRkE1N0Y2NjNDNEEzOTlCMUZEREQ3NTk3MzkxMEYyNzI5NCBeCitDRUVCOTY2MUJFRDJFODlEREIwN0EyMUVFQkY1OTBCQjFBRDY0NEEwIF4KKzA0NjVDOURGMkUwODg2QUM3OUY0NkJCQkVCMEEyNDNERjdENkJBQUEgXgorOTgwNzMwMTM1OTdCN0FFODRDQjg4NEJEOTMyRTIwRTZDQjQ3NzA5QyBeCiszQ0I0Rjc2QjYwMkJGNkI1OEIzMTZBMkQ4RDE2OUQ0MzJGMDJDRTIzIF4KKzVDRDRFQjA1RTg2MTI5NzRCRDlDM0IxOUU0OEQxOTJCRThCOTZBMDkgXgorQkIxODhENUZERTgwNkJEMzA2NDhCNjA1ODE0M0YxODAyRjE1RkExMCBeCis4NEVGMUQzREU1QzExNDRDMkM5MjhDRDREOTA3MEE2RTc5NTQzNDE3IF4KKzczQkUyQUE2NkY1RkQ2QkY2MzI3M0VBMTM2MzUwRDI5NDkxQTMzMDUgXgorNTNDRjNCQjA3NzYxOTEwQkJCNDg2QzNDMEM2NDM5NDNENUJGMTdDMyBeCis5QTc3NEJEQkQyN0MzNzA0ODcxQjUyQ0Q1RjdGOTI0QzhFRTRBNjdEIF4KK0IxMDZCNjU4MkYwRjZDOUUyRUZCQzQ4NjBDRkM3MDI4RjJDNDdGNzQgXgorRkVBRkY0NDI5OENCQjc1MTdCMTRCODFBNkFBRDUwMTgyOEM3NzNBMCBeCitCNUJCNDhCRUQ5NjlGMTVEMTYyMzAxOTY2QzUzN0E4MUM0MENGNEIzIF4KKzM0OTVEN0UzNjc0N0I4MjREMzM0NjVCNURCNzJENkM2MjNFREE3MkYgXgorRDdGNDkxNzhCNDM4NDdEOTk4NEI5MjNERUFBNkRFOTU3MTY5MEI5MiBeCiszQUI3RTI2QkRCMDQwOUU1NTA2M0FGRkY0NTZCN0EyOUNGMDk4QUYwIF4KKzc5ODRFMTU2NUJBRENEMjI0OUVEQ0EwQTNBQURCNDM0NjEwNEE1NTYgXgorNDJERDk5QjQxODAxQjBDMzQ3NTgwREYxRkRGQjIzOTdENTVEMkE4NSBeCis4RDU5QzAwNDAxRUZCMzE0QTBERkE0RDgyRTFEODU3MTFDNzdFMjQ2IF4KKzUwQ0Y3NDg5NEY3Q0Y1QTlGMzdDMzdCNDczMjcwNDdFOTEwRDg4QTEgXgorMUZDNDBFMjg0MEM0QjY4RjQwQzIwNUI2QkIwNkMzRTEwNkI2QjhEOCBeCitBNDlGNTZERkMyOTM0MTE3MzZGMjdDMTlGQTJBMzYyQTU0NUM3NjFFIF4KKzIyMUU0ODg0NUZFOEIzRDJDNzlBRkVEMzc0MTRDMEQ3MzJBNjlGNEYgXgorQUZDMTJFN0JERjlGNDhGQUIxQjU5NUZENjU2Nzc2QTM5RjBGNkNBOCBeCis1RUFBMTE0NDkxRTg4OTM4Mjc2RkMzQUNDREU2NTk2MjNDMDI0QkQ3IF4KKzUwODE0NDRDM0Y4MUUxODExNEIyODkwMjBEOUFFQzc1RkIyMDU1OTcgXgorRDRGNjkxNTZERTg1QzYxRTlCNDE1MEFDOUY2RjZBNTRGOEUxOTNBNiBeCiszRDdDN0VGNEQzNjJERTEzN0FGMDYyNTkyNUIzNjgzN0MxRkM3NTcyIF4KKzU3NUQ3NzJGOUMxQ0JDQThGRjM4MjQzMzQ4RTBERkUwMjY0M0MyOEMgXgorMEM4MjFGMjdGRDgyQzU1Q0I0RDc2RDM4NkY0MUREQzkyRjc5NDkzRSBeCitDM0QwMTAxRERGNTUyQTExQzhFMUVFNkJGQURCNzJBOTgzRjM4NTcxIF4KK0Y0RDY1MDQ0MDEyNzM5MEYzQTNDMkVFOTkxQzE4NUNFNzY1MEZBRUIgXgorNTQ0NjBGREFGRUYzMDIyQkMyQzdEMUQ0OTdDQkU1Q0VENzM2MjRDMiBeCis5QjNGN0I5RDU5NEFBRjZBMjZGNUMyMUJENkU0NzE3RjQ2MjY3NDE4IF4KKzE0RTJCMzRGMEIyQzg5REFFMTczMjQwMEMwMkUyQ0ExOUE3NjdGOEUgXgorMTA3MkFCQzRERkQyRkRDNkMxMTQzMTREM0MwODQ1Nzc3MjQyMTcxMyBeCitDOUVBNEIwMjBDMTFERUI3OTREMUQwNTk1NzQ3M0E0NkE5MDZCNDcyIF4KKzkwQkE0MjcyNDY0QTAyMDYxMkYwMDg1QjdEQjkzNjdCN0JBOEUxNUUgXgorODcxM0EzOTk3QTNDRDVEQTg3RTk3QUI5NDg1MUI2OEU3NDgyNjhDRiBeCiszNzAzNThENTRDODE5NzAzRTIwRUY2M0EyNDk4Qzg1ODZCNDhENDRFIF4KKzBERTQwMjQ5QThCMjE1RTk4RTg0OTAwOEZCN0NBRTgwRUMyM0Y0QTYgXgorQkJEQjk2MzA2NTk0RDEzNTk4QkIwMTA5MjU4RTQ4OEQ0ODZEOThFNCBeCitERjdEQjlDQjJGRDhBODY4NTRDNURFRkNFNTlDNEUyRjAyNDVGNTgyIF4KKzg0REUzMkVEODhCM0QyQkQ1RjRFMzNCQTMzOThDRDJFQzFFOUJERjMgXgorRDIwOTY3ODQ0RkVEMTFDQTcxRDI4RDcyQjI4QUNGREIxNEE3REJCMiBeCitCMTNBMEE2QTc3MjNCQ0Q5MDk4RTJCMDRGQTA0MzIwQzRBMEU2MDVEIF4KK0JFNjZCRTM4Rjk3RTdEREIwMkVEQzhFMEFDRTk3Q0RGODNGMDM0RkUgXgorMjhFQ0MyNUZGQjM5NEFBOERFMThGOEFERThCMzU3Nzk1NTM0NkZCQiBeCis0NTA2OEI2QTBGNjFEMEFFRjcwOEFGN0Q4NDg2ODNEQUJFODE3QzJDIF4KK0VBQUQ4MjlDMzJDM0FENEVBRUE4QjdFNjA5MEE1Q0Y2QjJGQ0FBODIgXgorRjQ0NUZFQjIyREY1QTlFNDlFMkNGN0FBRDdDQzFGNUY3MkYxOEI3NyBeCis3M0M0MjRGQTBCNzg2M0YxRjE3MEE4NTBGNkEwRjg1Qzg3ODIwODQxIF4KKzcxRjAxNTVENDBDQzU1RjNENjRCRUE2NDU2MDhGRDE4NEUyNTQzRjIgXgorNDU0MkZGQ0Y1MDI2N0I3NzUwMkQxQTBFRDBDMkE1MDUwQ0FENTIwMCBeCitGQjQ4RjI2RjMyMEQ3QTRCODAzRUQ0NTlCREY5MkJDMUY4NzAzNjMxIF4KK0M5RjlBMzdFMzRCRUE2MjIwQkVCQzE2N0UzNEIwQkFDNkI1NUE2QjYgXgorQjBDODM2Q0MyODMxRkI4QkZFNTk4ODM2MENDMzlGQUE2QTkwNEE4OSBeCitCMENGNzgzRDg0QkY1MzgzRUYzMEVGMjA3MUUwRkJBOUFCQjU1M0VBIF4KKzg0MTFDOEQxQTRGQzNGMTMwMTQzREVDNTIzMkI1OUJCRERGMTFCN0MgXgorQUNCNkQ5RUIyMkQ0NzRDRkQ1ODM2QzhDRTIyRjM4N0UxMkRDMjBCNyBeCitENTgyRkEzREUxREM0MjVBRTZBMzk0RkU1QUMzMjFERkU5NkI5MzA1IF4KKzE1Q0EzMkQwRTI0NkYzOTVERTIyRkFGOEYwRkQ5MDAzNkM0MDE2QzggXgorRjE4MzJGRUVDQkZGRjEzMzBDN0E2QUM0N0Q2RkMxODgwRTc5NTUwRCBeCitDNDg0NkJFQTE1OUQxRDQzNDI3Q0I1ODAyQzQ2RTQ3OUY5MTU3MzkyIF4KK0M4NEZGMDlCQTZBMkVFOUJEMTk3MkI4QzBCRjI1MjQwRjVBN0VFNzIgXgorNEU2QjRGMzYzRDdGREI0MDgzQUE2RjVFNzk3OTk2NkZCOEZGNkM1QSBeCis3QTU0M0I4MUNCNERDOTMwODFEOENCNkFFRDQzNkEzMUM0MDE4QTg0IF4KKzg1OTkwQTFDMzVCODZCQTI0NEY2MEJBMEVCRDZGNkU4MDE1NTJGRDQgXgorRDNFMDdGNUQxNEFFMjE5RDNDQjU5QjAzNDc2NEM0MDA1NkJBOTVGNCBeCitGNEM0RENDQzYzRThGQzU0MDJFOTNDRjUwNTMzRTUxRDFCRUNFRDQzIF4KKzM4MDZBRkY5QUQzODU5QjE1MEYxRTJBNDBGQkMwNDdGQjYyNENCMTQgXgorQjUxQTRFNEZBMjEzRDIyNTQ4Q0ZGMjgzMjNDNjY3OUQyNjkzMTEwQSBeCitBN0M3MEMxOUJBQzEwNDA2OThDN0FFNkEyM0IwNjg4QjU4NDA1MTUzIF4KK0U3NEZEOEM0NTc1ODFDRDA5Rjc1RUUzRDQzNDg1MTMwNjA5RkE5QjcgXgorODZFRDFFNDlENENBODY4OTM0RDdDMjU0RDNBRTBENUJGNzMyM0NENyBeCitBMTY1MDdEQUJDM0EwQ0Y3MTM3MTUwQzRFNkY4OEQ1QUM5QTBBQTNDIF4KK0REQzc2RDdCQTU0MzU0MTEyQzJEN0QzMUUxQTgwRjAwNDg1NTFFNUUgXgorRDk0M0Y2MDI4MTQ2RUVCMDM4NkJCMzA4NEZEMzU0Q0U4NkFCQ0YwMCBeCis0QUJDQUI2NUM3REFBNTJCREJEMTNCQ0M5MDk4NjQzRjVBMTY1MzI5IF4KK0Q3NUZFMjIxNjJDNTM4QkExRTI2ODdENjZFMjkyM0NFQzczNzVFMDEgXgorMUExMUEyQjEyRDkzRkIwMzBCMEMzNDQxRDdBQUMwNkRBRDZGQjUyNyBeCitGOEYzRDQxNEMyNkQwOUM2Q0ExQjg4QkU0NEJFNjlBQzg3OUQzQzVDIF4KK0QyRDBCQzk4Nzk1NzQwMDAyQjJFQjZFQTZBRUNBNTU1OTM0MEI1NEIgXgorQThBMzgzOEJBNDVBQjZCMDVEMUQ0NjRFODY4MUFENjFCMTM2QjZBNSBeCis1QjE2MjkyMzIwMDQzOUQ4NzBGNTdBRUM1ODRBNjdDQTJFODkzOUI5IF4KK0E4RkUwQjU1Q0ZCMTVEOTc3RTg3MTE1MjkwNUQ4RkRCMThBQTZCNTkgXgorMDJENUQ0OTI4OTY5QzdBODUyQjVBOEFDNzcyQTNEMUVCNDI0QzlBMyBeCis0RUNFMDhERkYxRkRFMTI1OEIxQkYwNDIzRTFFMzFEODNDNTc1NTdGIF4KK0Y3MDE0MzBFRjZDQjU0QkYwRDEzOEI1NEZCMTNBMUI1ODZBMUNEQ0MgXgorRTMyNDJBNzExMDZDQjc3RDI1QTYwRDE2NEJEMTdGRTA3RUFDNDk1MSBeCitEOEIxOERFODYxMzI2NzJFREIzMzAxOTBCRTg5NUUzMTA2RjkyRDJDIF4KKzhDRjA1RkYxMzg3QzYxQThDQzM3MjRCQjEyODNBQUQzRTJGODVFRUYgXgorNzk3QjMxMURDMkI1RDE0QjUyNzdFNDlBMzhBNzg3RDNENkE1OEMyRCBeCis2NDcyQkM1ODgxQTYyQkE5NTY1MURCQjNERkY5QjM4ODU5NDlDOUI2IF4KKzg2QUVENEI1M0Q4NjE3RkMxMzVEMEUxRkNCNzYyMjcxQjI1NDVBNDUgXgorRTNDODg4QTFDMDAzMDFBQTdDRTIwM0E1NTkwRDgyQzFDRTc3QzZENCBeCis4QTA4MUE3QTY3MkY5MTQ5M0FDMDlEOTVCMjlGQUJEMDQzREE4M0REIF4KK0Q0N0Y4NzAyMkRCNEZBRTU1MUZGM0ZBMDlGRkYwMkQ5MkQxMTI1MjcgXgorQjIyNzFFMzc3RTlCMTU4QUNCQ0ExRURBRTBFRDZCQTRDNTlDQjcyMiBeCis3MUVERTBDOTQ4OEEyMUU2MjQ1NkQwNkVFMzkzRjM5MDQ3OEMzRjMxIF4KKzQzN0ExQjcwOTE3NjU5ODAyMEVCQTFFOTIzODZDMzk3OUExODkxNUQgXgorRTNGNEFDNDM4NDg0ODA3MUM4QTlGOTg2ODM3NkQ5NDFERUMyQTlGQiBeCiswMDQ0NENBRjZBM0Y0MjEwRkQ5N0RDQjhGMTBGNDNCMjhEODkwNjAwIF4KKzlCNkJCMzUwRTMwQ0VFMjA5Qzc3QTNFMjBCQjZBQ0U4Njc1NDYzMTMgXgorOTM1RDI2ODhBRTJCMTZCNzlCNTE3QkZCNzlENDhDRTdFNEYwRjRFOSBeCisxNkIyMUYxOUFERTdCNkRFRTY2NUQ0NUE4NDc0OTFCN0YwNTVDNDZEIF4KKzg1MzM5N0MzNTY1QzgwN0FFNzJFREZBMzdGNDE5OEU4MDExMDNGRDQgXgorMTA5OTJDMkZGRTUxMjcwMDZCQUZCMjE3MjM1OTcwMUFCMTBGQTRCRSBeCitDODJENkJBNEJBNjIxRTM2ODcyQUNFRTRBRTNCREYzM0MyMzgxQjA3IF4KK0Q3ODUyREJDOEZGNTkyRTA4QTFGMUVFNTdBNzBCRUZGMzI3RDhFQkQgXgorQ0Y2NzMwODQyMkYwNzI0MTVFRkI3NUI0M0Q1QjY3QzdGNTM2MkIwRCBeCiszMERERjM1RTFFOTkyNDNGODUzMTFBMDk5NEQ5MUI4QUE1NDNGNzI5IF4KK0RCMkZFMzQwRjYyQTg5NDAwQUU0QTE2QjYxNDM1MjA0NDA1MzUwRDMgXgorNzQ0OTgwRkEyNkRFNTAzNzQzRUVEMjk4Qjk2NkVENUZBODQ3MURGNiBeCitEMkM4QjgwM0QzRERCNTRDREU2NDY0RDEyNkNFMzAwOUE5RjBGQjczIF4KKzg4NTcwMEVDQzA0RUI5Nzk0M0E5QzEwMEVCNkVDNEFDRkU1OURGODEgXgorNzcwRjlDQUM1RDRFOUM4NzhBNjYzNkVCMDMwNkVFOERERjBDRjkxNSBeCiswM0MzRjA1NTNEN0NGMTZDRkUzRDNGMDFDMEE0Q0UyNkE5MTQ1MTJDIF4KKzkzQjMwNEJEQjEzOERCNjc5MERGRjhBODRGRkYzRDM1MDY3NzBDREMgXgorRDVDNUZBMDQ4OEM1QTZFMTQ3NzBGMjE2QjU3NTk5Nzk1MEE5NDE4NCBeCisyRjY5NUI4RUIxOEMyODI1MEQ3QzhCMzVCQTAwMDA0MkVBQkRCMjQ1IF4KKzAzNTNGRkE3RjcwODVEM0I3ODg4Rjk2Qjg0OTg0ODZFRTdERTE2Q0QgXgorMjM5RkUzQUFDMEQzNzM5RjVFRUVDODJCMkJGNkY1RjQ3RDA1ODU0OCBeCisxNkRFODY4NDM5NUNDQThBNURCQUM3MkVDRkFGQTRCQzNEQkZDNUQ2IF4KK0FFQjJCQTc0MjcwOERCQzA0OEIwMUZENzdCMTU2MENEM0EyM0U3MDcgXgorRkFBRTE3OEI5NzE3NUE3QTY4RTUxQkQ3RUVDMDYyMzQ3MjNCNjcwQSBeCitCM0YxMzExMjQ3RDkyMDExMDk3Mjc3MkMzREMzMEY3ODlEM0ZEQkFCIF4KKzQ2NkY2ODI4NDJDMDdEMkM3NzBCNDFCNjZBNjZCRTlGNjY1MUMwNDYgXgorMzk3MjRCRDI5MTM4Rjc3NkVEMjA2MzNCNjZBM0EyNDFGQUNEODE3RSBeCis1OTMxRjE5QTE5ODVDRDVGNzE3MUE1RDJCODFDRTFDQjNCQThFQkJCIF4KKzI3REU1QzMzQTE4REYxQTczMTA1MUQ2NjQ0REU4OTAwRTMwRTI0MkUgXgorQTRFMUM0RjIwQTM0QzAzMzU4OUVEMDk4NUU4MDE2OEEyOEMyMzc3QSBeCis5QkU4MjBCMTM0NDc1Q0EzMTUxM0VFMUM3OUQwNkUyOTlENzBFMDE3IF4KKzk4RjM5NkQxNDdFREYzRDMwNzlBNkIyRENEREU5MkQ0OEM5Q0M1MkIgXgorRDYxMDg5MDE5MDk0MThDRjdFN0FFQ0Q5RTREMUNBMTIxRTk5MkU5MCBeCitGMkU4RjBGRjFDNjUyMzU2RTYwNTY2NDRCODFGRjgyNzBBMDdGNTZBIF4KK0VBMTY2OUVENTA5MTIwRjJCNDJDRkE1NDdBM0ZENjAwMkZGQjg2MkQgXgorMjE5QkFCNTU2NTNCMDNBM0NBNzg4NjIxMkRGMjdCMjNDMDgyQjJFMCBeCitCQkU5NUY4QkJFRUI2RjlBMDA2MkQxNTFBNzE1NTYzMEYyMDEwQjg4IF4KK0ZGNkJGQzkwRkUzRUFCMjk5ODkyQTVEOUNBNEQxN0RGMkM2QzYwNEUgXgorOEQwRTFEQkZDQzQxOUFFQjFDNzgyN0M3NjQ5MzMzRTM0QUM3RTMwQyBeCitFRjM4NDdGN0ZFQTA1NEYwRTA4MDgzNkQwRjJCRkI2NzZFMzU3M0VFIF4KK0Y2MEExNUU2QTI4QTVDQ0M5QzRFRkIxQjMxMDdBNTRDOUFBRUMyNkMgXgorNzYzMjhDREU1RUZFNjk2MUIyQ0VENEUzNDU3RDIxOTIyOUUxNjFGNyBeCitGRkFGMDNGQjYzMkEwNDJCODM3Rjg2NjA0MTJCNzJCMTA5OTM5NEIxIF4KKzIxMUJBNjY3NUM1MkNCRDlFN0Y1RjVCMzY2QTY0QTI0NjY1MzJBQTcgXgorNTFFMDVCNzQ4MTM4MTM1ODc4MkZERjczQ0I5NThFMTQzNENGMzMzMCBeCitCQjVDRUFEMUYzQjY4MjI3Q0IwMzJCMkI4RTVCNjI3NDYxMDcxNjM3IF4KKzNFQkNGMUQ3ODk5OEQ0RDExQzA5NEJGMjhGRDUyMkVBOUY1QTFFMzcgXgorM0U3MTg2Q0IxRDM5QzY0Q0VGRDI4QkRBMkNDQUEwNzNFNzFBNTMyNyBeCis0MTVCNkEwMDgzMzg2MDU0RDNCNzcwMjZBMzg2NTRENDVEM0JBMTA2IF4KKzIyOTczNzIyNTY0NzlFMzFFMTM5QUExNkU2M0MyN0MyMDc1MTlDMEMgXgorNjVBNzlGQzRCMzIyRjY1NUFEQ0Y2MzQzMkQyOTUzNDlGRENBOUU3QiBeCisyRDExMzBFRTZFNDE1NjE1MUM2MzdCNDY1MjdGQUM1NEQ5RTc5REY3IF4KKzgwRTE4REU3Qzc5OEYwNDBDMDA4QjNCRkUzMDU0MjYxNzQwRTE0NDQgXgorMDcxMEEzQTMwMDI5MENDMUMzQkFCNTZDRjAwQTY4MkMxQjcxMUJCNyBeCitDNkJFNUUzMzdBMUE5NzZDMjUzQ0JGMzU2Njg3RjM1OTU0OEI2QTNFIF4KKzNENkU0RTUxNDI3NzIyM0JBREU2QTMxN0M0NzhGMTdFQTZFQkM5REMgXgorMjVDNjZDOTA0QzM1RUJBRDI2MTNBMzBCNzMyODNFMEZDMjNDQ0MxMCBeCisxMjU3MDlGREZENTExMTgwQjA4REI3NzM2NkRDN0U1QTJCNDZGMENCIF4KK0FGQjVDNTNCQjI3MjgyNkRCN0ExQzAzMEI4OUM3RjNBRTk1NkY2NUEgXgorRDE2NkU3MUQ4MTQyRTI2RTU4RTBGN0E2OUM1MENGMTlDRkUyMjVGQyBeCis0MjYwMDcyMzVEOEYwNkZEQ0ZGMjBDRTdGRDAwRTk5NEYyRkM0MjJDIF4KKzhDQTI3MzAxNjNFQTgxNkJGOUI2M0NDNjUzQjQ0M0E4RThCRDc2NTYgXgorQkIyREE2MjNCNUZEMTAwMzJCQUZBMUEyRjlGQjFFMTNGNzRBQzRFQiBeCis4MjIzOEVDM0M5MEJBRjMyMjc4ODVCRTc4NTM0QTFCMDgyMTM2NjBDIF4KKzY0QkEyNzVFRTk0MjIzNTZFQUMxOUE0NkE0QzVDOUJEQjRENjNDMDUgXgorNDk5NTMyM0I4NUZEMzg3OTYzMUI0MzlCRjRGOEQ3RDM5NjM5QTdGQSBeCis0MUY5NUI1MTI5OTFBNEUwNUIyMTk0Nzk4NDIyODU5MDBERjg0MjVFIF4KKzNDRUJFOTI5QUM3NjNGMkZEODVGMjEzNTRDOTE1OEU1MTY5QTg0NEUgXgorQkFENUQ1M0Q2N0NCQ0Q3NzY3QjYwMDk1NDZBOTFENTkxODhERTk5RCBeCitFOUMyOTA5RjZGMEEzMDc5ODkwMTkzQzg3NzJFNzQ1QTMxN0M0OEIwIF4KK0JCOTdFMzFFOUI4RUFBOENFNzU4REQ3NzVEODMyNkY5NDcyMEUxOTggXgorMTA5NDcxQTFDM0E0MjdDNjVDNEJCQUY4Qzc4NURCOTlDNzQ4RTVGQSBeCis3NTFEOUNDNjRGMDAxNzZFNDI0QTFGMzMxQzYzRUFGMjkxMEE3NUNCIF4KKzI3RUMzOTVCMDdGQzc0MDU2OTYxMjc0MUU1Q0YxM0E5QTYwNDgwMTAgXgorRjY3NEJEODc1NTZGRDBGNzFEOUJGMjNBMEVDQ0U5RjM5QUM4MjA5OSBeCis5M0IyRjkxMDlBMjVDNTExODY1RDE1RTE2ODNDMDY4MzU1NUZGQzAxIF4KKzxECisKK0g+U0hTIFR5cGUgMiBIYXNoZXM8SAorRD4KK0VGQTNFQzg5Nzk3RUUzRjFBNUJFNEI4RDM0NzQ3MTM2Q0E3REZCOTkgXgorRDE0NkQ0NjdFMzIxRTRFQTRDNzNFODQyNDAyOUJFQTQ2MUYzRDkwQiBeCisyNUFDRDMyREVEMzM0QUQyMEREQ0NGMDEwNTlCNkI4Qjg2NEU4RDdBIF4KKzI1NDE2RDY5NjY1MDA3QzNFREQyNDE2MUYzREYwRjZBQ0JEMEU4NTkgXgorNTQyQTI5RTVDMDRBNUI3OUFEMDk4NkZBRDQ5QkU3NDFGMDk5NDJCOSBeCis1QjE5N0UxMDExMjg2RTVDMTMwRjkzNzk4NDNERTg5Nzc2QzM3QzU5IF4KKzQ2NzI3N0VCODg4N0VERTBGMjM2OUM2RTdEMTIyODFFRTNCNTE4NTcgXgorQkMxNjEwMjA0RTE1QTM3RDUzM0I3NDQxMjY4Mzc2Nzg5OEIzNURGRiBeCiszREM3QzQ3MjZCM0VGNzVBQjg5MTkzNzAxQzk5MEY4NkFBNkRFODBGIF4KKzRBRDQzNDhFNTAyMjY4NUM3MEEyQjk4MDY2OTg2NjRDMjgxRTcxMjMgXgorQTMzRTQ5OTZCRDk5ODBFRDUwNUY4QUFBRjBGNkQ2NEU5N0Q3RTYxOSBeCiswNjI4MEFDQzJEMERBMTVFQUQ3Qzk2MzI1MzM0OUM4NkE2QzNDNkM0IF4KKzMzQkUyOTc3OUY0MkVFNTA0QTNDREFFMDQyMkY3QjlDNUNDOTk0REUgXgorNDEyOTQxMjcyQzVDRTM0NEFDMTQ0QjY5RDRCQTVGNjFGMTQ3NEY0RSBeCitDMzNFQ0FDMUZBNzRENTQ2ODU2NjlGOEI5Rjg1OTE4NDcxQTg4RDYwIF4KK0M0ODI3MkU0MkY5MjFBMjc0OUQ2MDQxODk2NUQ4QTdDQjFDN0JGMEQgXgorNDRBQkVFQUQyQzI3ODA5ODA2MkQ5MzQ0NjBFNTY1RUQzQzY0Njg4MCBeCiswOERGMTg1MDA3ODE2RTNFRjAxRDYyMjZDNzJCMDMyNTY0NzhGMjNGIF4KKzI4OUU4OUY4RjE1REQ3MDk3MDFBQTIyQjEyQzY5RThGOTBDOTNGMUQgXgorNUI5M0NBQjM2OUM5OUI4NUVFRTMxMzBGODMzQjdCQjA2RDRGQzA0MSBeCis3QjI4NzJDNThGQjM0MEM5QTFEMDY4QjYxOEU0OTgwQjA0RkRGRjJEIF4KKzYyNzgzNDIxQ0Y1OEVBNjYzNjZBRERDQkZBOTY5NjhGQjEzNjk5MTggXgorQzhCRDczMkQwMTgxMDUxNjk4MTYwQjJGQkMyMDI1NDc2Mjk3Qzk2QiBeCiswMzhENTg3Q0MwNjlDOUI4OURCQzJGRTlEODZBOThDMDMxRDM0MEI5IF4KKzMwNTkwMzFBNjg1ODVEQThGMDlCODdCMEJFMzQxMzk4N0VCMzkwQkYgXgorMUI3NEE0QTk1NzEzMDgzNjA5QjI3RTY3MTQwNzA4RURBMTVGODBCMSBeCis2RUFDRUE2OTkyMkM3QUNFMzhFMDU2MEE5MURBNDU5QzBDQzg5QjU1IF4KKzYwRTIxRjUyOTlFQzcxOUQyODMyQTgyMjY4QjI0QUY2QjI4MTVERUIgXgorM0Q3RDUxNzgyQTUzMkY0RjQxMEFBMkFCM0RDOTE3OEMyMUE1NUYwQSBeCitCMjQyM0Q5NjAwOEZCODAwRTVFMzVFMTlEQTZCRUEyNzQ4NzU4NUUwIF4KKzUwMzhGRTlBRUFDODI5NjZBNEVFNUNDNjlBQ0M4QUNDRjU1RTYzREMgXgorOTBCRjBBOTBGODhGNUYxREE1MUU0NDk0RTJENUQ0QzYyNTBEMkQ0QiBeCitGODU4NDM0RTBBNUZENjFBMjIwQ0M3OTIzODA4MDFEMTlFMEQ5Rjc3IF4KK0MzMUUwQkI0NUZGMURDMERFNDRDNzdDNTNDNTlCMTVDM0JERTlFQjQgXgorREY1NjI4Q0Y2NDQ1QzQwOUI1MUY0NkE4NjQ4OEE5NUREMzRBM0RBNSBeCis3NDRDRENDOUE1MUIxQUQxNEZBRkQ2NzNENDEwNDQzM0I3QTI0NzM5IF4KK0NFQTVFN0I5MTc3M0RGRTEzNjQ5QUNBNzg5MDc3NjlCNUJFQkNBMUYgXgorREMyM0VDMUEwNEY3NDE3RDk3MDRCODQ0RTlGMzlGMzlFQUFCRTZEOCBeCitEMzlEREU5NzI5N0I3RDFDOUZGRDZCNjczMzM0OUQwQjhFODAyNjg4IF4KKzY1MjE5RTc5RjVBM0M2MUZDMDc1NjYwMjU4QTlDNUYxM0ExNTkyNzEgXgorRDJBODYxNjREMTM2NkI2MEYxNDY2NTE0NjQ3NjFCMDEzNTNGOTAyOCBeCis4RTNEMUU0RTA0MzhFQUJDNThBQjk2N0IxQ0REREFFM0NERDlCMDc4IF4KK0VFOUJFRUM3M0QwRTc2MENGRDA1Q0Y2MjM4MkE0NjFDN0RFM0NFMkEgXgorNUM0RkRENjA0NzUxNTk2QkU1NDE5RDRBQzI1NkMzRDk4MjAxMjE0OSBeCis0M0VDRDBERTgzRjA4NzgxNUNGMjU3OTgyOTE0NjExRTRCRkY2OThDIF4KKzFBMUJDQTQxQkExMjdERjQyNjREMzc5NUUyRUJDRURDRDFCRDhFQzcgXgorRkY4MkJDNjkwNDUyMEUxODY4MDNGRkU4NjFEQ0U3RTU2NkQ3NUYwMyBeCis3NjQ1NDZGRkEwMTRERjgyNzg5NzRCRTY2RDAxNDg1MjUxQjhCMENGIF4KK0EwNkJDOTdEQUNCMDdFRjIwNzgwODY4NDk3ODg0MUM0MjVBRTEyMzggXgorNkM3RTZFMEU4OUYyQTA3MEVERjNDNDMzMzM1Mzg2OTk0MkYzRDg4MyBeCis1NzI0MzdCMkIzNUM1QkEwMEVCQzc0NTIxQjEyRDIwRTZGMTRBQ0JDIF4KKzA4NzAzMTg2RTc0QTkzOTdDRUJCMUIyMDM0QTY3NzA5OTVBRjNEMEYgXgorRTRGOTA1NTM1NkFBQkE5MzNFRUYwQzBCMDdCNkZDRTkwMzYxRDIwOCBeCisyMDIwMjAzRUZENEM1RkZBMDJFNTkzQjdBNjU4MDI0QjMzRkIzNjhFIF4KKzJCQjJGMzJENjRBREE1NkEzRTUzQTZENzUwQTA1RjhEMkI1RDdBN0QgXgorQzcxOUFFRTQ3MDhFN0EyNDI0NDBDOTQyOUI3MjM2REZERUMwMkI0QiBeCis5MjRBMjZCNDY2NDkyODcxOTdFMTQyQ0I0MjUwNkM5NkUzMDlFQjI2IF4KKzA0NjNGOTRCNTQ1MkEyRDhCQTNBMERCRkU5QzQ5MEEzNzFDMTk5NzUgXgorOUZCMkZFNTM5MzIzOEVBQUY1ODAzNEJDOTM0QjE5MDc4NEExMEREMyBeCitBRDRBNjk2MkE2QTU5Q0EzMjc4OUFDM0JCQTM2ODU4M0I5MTIyQUY0IF4KKzJBODk0NTk2NTdGOUUyNjg1RDc5NEU3QUVBRjMwQTA1QjA2QUE1NzMgXgorOUI2NUNCOTFEMEEyNDc3M0FDODY3NUZFOTg2MkUyOEE3Qjg0OTU0RiBeCis5Q0I3Q0FERUREMzkxQTM2ODlCMDQ0MjdCNDYxQzQxMTM3MTdCNkM4IF4KK0YxQjkyMkQ3RUMyNDBGQzk5NjkyRUMyOEMxQTZDQzdEOTA3QjEwMTggXgorREUzMDFBMTQxM0MzNkE1Q0I4OTFGQkNEOUNGOTI1OERGNEVGMTRBNCBeCitCMzMwNzM4RDJBRDUzNDQ4QzI4N0JFRUZFNUM1NTgzRjJCODE3QTAzIF4KK0I4MEVCRTAxMDRBMjU4NDBDQUVGNkFENzRDNDY3NkQ1MjQ1NzFBMjkgXgorM0I1Q0QwMTY2MUEyNzlCQTcyREZDMTI3MkU2ODM1NzNCNEYxNkRDRCBeCisxNDEyRDZBMkRCQkM5RDAwNjQxQTcxMTY0QTY5MEM2NDA4NTJCNTZFIF4KKzBFRjUxNDQyOUNBQzk1Q0RDQkU4QTJFNjBDMkFBOEI4OTJBQzVCMzMgXgorNUYzMkNGRjNCMDdENDdFQzEzRUI1NEU3QzM5RTRGNTIxNkZEQkRDNSBeCitCOTMxOTY2MTY5RDE3MURFOEY5NDg4RThCNUUwOTYwMTI0QkM3NDUxIF4KK0U1MDM0RDNBNUE1NzM0NDI3ODFFRjBDNkVFQTdCRDM5RkFEMEI5NEEgXgorRjk3Q0FDNTAxMzEzNTk0NEZERjhCRENGMDJCNENDNjEyNDFCRUE2QSBeCitGRjc0QzkzQ0YzMjUwNkI0RTE3QTBCNTk2QUI1NjQ5ODlGMjBGMUQ0IF4KKzVDQTQyRTMzQkNFNDMwMUI4RkJDRTU2QkZCREI0M0VGNzlFOTU2RDggXgorODdGNUQ5ODFFREZBMDFBMkU5ODg1QkQ1MkNDNEU2NDlBMjMzMDYyMSBeCis2M0Y0Mzg0NEVDRERGMzM4MjAzREZCMTE2RkE3OUNCQUY0RTVDOTJCIF4KKzkyQzVFMkE1RDM4MEQyQkI1RTE5RTlFNjVEQzlBNzdGNEI4QjI1RjQgXgorRTNENzg1MDE5NjlBQ0RENzhBNzEwNDJFN0IwQkQwQzE0ODgyRTQwMiBeCis0RTFGRDZGNUNGRTI5QTBFMzMyNDhGMkUyRUZCNzRFN0UwQTk5NzY1IF4KKzVGRjVEQURDOTNCMkU0NTJBNjA2NzdDOENEMENCQUY3QkQ0ODk1RTQgXgorQ0E0OTBGQUEyRDY3MjNGOUY2ODJENUM5NjU4NjQ2MEQwQzhCMjAxMCBeCis5NEYwOTlDMkZGN0RCNjk0RkQyRENGNUE5QTZCMDY4NTVCMkE5OTQ4IF4KK0NGM0IxRTBEQTdCRTg3MTgwQkYxODQ3REVCRUM3MDY3ODhDNTNCOEIgXgorRjg1MzA1QzRCRjE0OUI5MjA2OEQzNjNFRjE5QjkxNERCOTA2MThEQSBeCitCNEJBRkNBMzE3NkI4MEU5ODAwRTMxOUZCM0JCNzRFNUQ2NUJFQjY0IF4KKzM4Q0NGNTE5MTVBMzg1NTlBOTZFNkYzMjU4MTQ4RDVFNjMyMzA5ODQgXgorNkZGNDNCMEQyNUM3MTcxRkYxNzhERUFCMTNEN0Y0ODhEMjFDNDIxNiBeCiszRTRBMDM0MTUyRDg2RTQ1NjhBMjE5N0E1MzI4RThFOTczNjMyODdFIF4KK0YyMzFENEMzQUJCRTBGREY3N0M3MUVCMkMyOEU1MEFDRDk1ODQ1MzcgXgorMjNFMUE0RjczRjI4ODIzMzg0N0U2NDdDRjg2MjMyODlGMUY4OUU1NSBeCis3MjZEQUVBRTcyNEU3OTIzMjYxMUNCQjIxNkI3NzIyNTk0RTgxNEZCIF4KKzBFNUZFNTEyQjBBRjUyQjQxODMxMTk1MDhDQjAxQUY1MzM4QzYzRTMgXgorNEE1RDNFMTJFQjI5QjIyNDIwMkMwQjMxOUIwODY1MzVFOTlGNUUzMiBeCiszNjM1NzRBOTEwODMwRURDRkRBRUQxMDU1OTc1RjA2MTNEMUI1Qzk1IF4KKzQ4MjBCRTZDNzRBRDM0RDhBNDNBNUREMDEzMENCREUzRjg5MEM1M0IgXgorRkVCNkU1QkY3QTY2RUQ5QjgzOEExMDMwNUY4NTAwNTJEREY5MjA3RSBeCitENTBCMzMxQUQ2OTI1NTQ1MjY0QjY2MTRDM0I0QzM5Mzc1QUIxRjY1IF4KKzM2QjFCRjM5QkY0QUVGMDVGQjA1NEJEMDJGQUQ5MDYyRDIzMzcyMzkgXgorPEQKKworSD5TSFMgVHlwZSAzIEhhc2hlczxICitEPgorOUIzMENBRkREN0Y1RTUyNTIyMUVDMDM2RDU1QTlDOEQ3ODI5NERCRCBeCis5QkNBMzNCM0RBRDIyMDFEMEYxOTgxQ0NEMEFGNDg3NEUxNjJBNkRCIF4KKzhCMDY2OTdFNEE3NURBNUYwMjBDRUI4NjBBMjkwNDBCM0RGNkVGMjEgXgorRjBENDg0MDFBRTIyNDk4RTI4MUNEQUFGMDQ1RkZFQkFBODdBOTc3NiBeCis2MjQ3REY2MkRGNUQ0ODU3QTc5NTk5NjAzOUI1QTYyNzFGN0EyMDMxIF4KK0Q5ODQzM0MzMzcyRjE0MDVGQ0MyNDc1OTU5QjlGMzVERjI3RDMyRTkgXgorQzREMTRCMjg3M0IwQkRGMDFDQTdDMTYyOEVFMDFENjE2ODJDRjFDOCBeCitDMDI3QTlDMDEwRjhFQkU4OUZDODhDMUM5RkI2OERBQjA5QTBDRkNEIF4KKzREOEQxOUYzNUZBRUNERUIwMTVFMTE2MTMwQTBBNEM4MzZBNDJBNkEgXgorOTI4RTJFOTVEM0YwOUQ4RUU2M0NCOEYxMDI5NkVFNkVGNzQ1NUZGRiBeCis1NUYzRTc3MERDQTI4Q0ZCNzExRDA1OTE3NENDN0E5RUMyQjJERDdCIF4KKzQ1MDA5ODcwODZGRDhDMjc1MzMwRTBGMjdFOEEzRUQ4NTk2RDAxQUEgXgorNjBCQzU3RDE2RjUwRTJBREQxNzI0RTBDN0RERDVFNDdEREY4RTMwMCBeCis1OUQxNzQyNzJBRTYwMkFDMDkyRUU3RUYzOTNBQzE5Qjg3QjhFODY1IF4KKzhDMjU2MTRFNkU0RDgyNUQ2QUVERDkzQTYyRDFBMDQ1ODU4M0VFODQgXgorNjk1MzkwRDFFNTdCQ0M0Q0RENDQyODc5RjA5NzhCRDgyMzMyMkU1QyBeCis2RjM1M0VFNkI1RjRCODI3MkU0QTBEM0Q0QkJDQzgzQjFCOTQyNTE2IF4KKzRCM0Y2NzE4NzQyMjBEQ0NGNDlCNTgwMTg5RTZCMTNGRkYwRjUzMUQgXgorQkM2QzQ3M0I0ODI0RDhFMkZBMDREREE4NkE1ODY1RDRBMzZFOEU5MSBeCisxQkZFQzI2OUZEMThEMjVEQzVDNTZBQ0Q4MzgxMDAyMjc3NUYzRUM4IF4KKzNFOTkyMUUyRjY4NTQxM0MwQUVBNjQ4MDE5NDVCNDhDQjc2RTE5NUUgXgorRUVDNzIyMUZCQUM1RjI3QjU2Q0Y2OEMzOTZCN0VCQkNBQTNDMEIwNSBeCitGODZEREQyQTgyMjk1MzJDM0YxODNFQTk5MDNBRDIyOEEyNTIxNTkzIF4KK0ZBMTdCNURGMzNFNDMyNkJDRENCMjdGMUNFOEI4M0JFOEI4RUY4OTAgXgorQTRBRkMwQjQxRDMwQ0U3OTZDMkI0QjA2RTM2OEE1RDM5MDczNTg4OSBeCis3NDVBRjEyQjRFRjk4NUU0RDJGODQ4RDdDN0FEQjZCMzI0MDRCNkU2IF4KKzVDRTRCNjU3NDA5MDMzQkY2N0RCN0IwQ0E0ODBFQzJBQ0NBODAxRUMgXgorMEI1QUFCQzlEM0E4RTg2MTEwM0Q2QjVCOUI5OTRGOUM3NDNCRjA1OCBeCis4NkExMTk4OTgzQTczMjk4QkY0RUI0MUE2MUVBQUMzRTRCMDZCNDA4IF4KKzQ2MEExMDdBNkFGMzI5QjMzMERFOTQyNUIzMDc3NzU1NTUzQUQzNzAgXgorNjJDODFEMDZBRkU4QzhGM0U2NDJBRDQyMzc0RkZFNDg2REU4NkYyRiBeCitGQzFFRUNBMzJGN0U0MzRCQkM3NEY0MzYwODA4RURCMTQxMDg3QkRDIF4KK0JGNDk0QjRFOEQzMzExRjE2N0IxRUFBRTU4QTMzNDM2ODNGMzM3RUUgXgorOTYxMjQ3RDAxRTFDNENDMEQ3MTMwNzYzN0NENTU5RDUzMDUyMUZENSBeCitCMzRGODQ2NDExQkU2MUUxNTM2MTkyMkUwRTJBRjgzRjNGMDNCMjkxIF4KK0NEODQ1QjI0MEZDMjU1MURDQjJDRTQ4NzY0NjY0OENGMjQ5QUU4RjAgXgorNUMxMjRCNjE1RkFDNTQ4REFBMzVBRDAyODdFMDMyRUM3N0QyMjBCRCBeCiszQzc0NzcxRDgzOENDRjdGQUUyREFCMTAwQ0VBN0I0NkJFMkZGRjNGIF4KKzYyODYwREI4QzBDODk3QzczNjlBMUFCNjE3NDdCMDRDMEFFOUY4QTYgXgorQzk4NDAwQ0REN0ZFNzFDN0IzNTQ4OEMxNkQzMzk1QzA0MzAwRURGQSBeCis5NTE2N0UyQkJGQzAzNDlDMERCN0NCN0JEMjAzMEJDMzBGOUYyODZBIF4KKzlGODM1REJCMjcwNzZCNUYwRDg4ODA2MDNGNDE3Q0U4M0EwRDIyNDIgXgorMDg0NDJCNzE1Qzg0QjdBOEIyQzdGRkI0NjAxMEFFNTZBMEM4QzA1RCBeCitCNzEzMkRCQTUyMkM1NEY0MjkwM0NBRUI3MDUxNjc0ODVBQUQzMEIwIF4KKzlFOTlGMDNFRDA4Mzc0RUZBNEY5QTI2NTUxQTkwOUY0MEJFRTUwM0MgXgorOTk5OTc3RTZBRkZBRTA0NTFFOTNFN0Y3N0M3RDE3N0RFMTIxNDAyQyBeCiszMEUwQkI3RjIxNDMzQTM0OEUzQjQ0NkYwOEQ4MENFQUFFMDZEQjcxIF4KK0IzQTQxRUVERjAxN0RBN0IyMEZCRDkxMTFCQTZFMkU1OTg0MkNFRDIgXgorNUI5Q0EzMzFCRDAzRDk3RThEMDU3REZEMzVDOUU2MDBGOTBDNTdEQyBeCis1MzM4QTI1QjMxQ0M5QzY0NTUyQjZGNjc0MkY5RkVCREMxM0Q5NzMzIF4KKzFCM0E1NUJGNkZENzQ4QjNCNjUwRUE1QkU4MzlCNjE1MzBDODcxQzAgXgorMTUwM0YyMTUyM0NFOEJDNUExOUU2QTdGNUNCMEVDMzRBN0U5Rjc1QyBeCis3RjZBMTZCMzAzNzdEM0QwMDE0QjBCMEI0Qzg2MzkxNjBDNzIxRERCIF4KKzhGNjIxRjhDRkI2QUYyMTY3NDZEOEI5OUM5MTMyNjdEQjE0QURCMDggXgorNDJFOTE3N0M0ODdCNEI3MTFBNDQ1MUMzNjBCRDdFMkM2REE3MzQ0NiBeCis1QjI0OTdDQTZFQzI0MjZCMTI2NTNENzExRTZCRkRCRUVGRDRBMzg5IF4KKzMwRjQ2OTBGRDRGMDlBQzhFMjlCOTI2RjY0QzY3MzUzOUQ3RkI2NUQgXgorQ0UxMkQxQUE0OTYxMjQ1RTYwNjA5N0I2NzJFQzNFMTYxMDNEMEQxNiBeCis5QkU1RDY5M0JDMENDNTZCMzRCOEREQjkyRkFDRUMyRjhGNEI2MzhBIF4KK0QyMDQwMDA1QUUyMzBFRkRBRTk1OTQyMzcyNjA3NTc3RUZBNURCQzIgXgorOEE5MjBGOTQwN0M3NEZBMzdEOUM5M0MzNjA2Qjk5NkRCOTQ1ODQxRCBeCitGMjY5MTVDMDhEQzFEM0QzMUQ5Q0E3M0YxOEYwNERCQjU3RThBNjcyIF4KK0U0NDkzODFDODE0ODgzN0I5RTQ0MjUxQjE3ODI1NTMwRDg3NTRDOTQgXgorQkQ4NDAyQjIxNTIwRTQwRTMxRDFFQUZEOUM5OUE5RTQwOUMzQTc3RCBeCis2MjRDQ0U1MzhBNzhDRjBGRjc4OEI5QkU0MzNBMDA4RkE3Nzc5MjgwIF4KK0I3OTZCNTIxQjkwRDU1Mzk2RThFQzAyQUQ5QjY5QjdFOTEwOTNFNEMgXgorNUM0RDU4NEY5N0MxRDhGQUY4MTBDRUYzQTRDQTA5MTVGQjBCNjMwQSBeCitBMTc5RkVBRjM0MUJBOTdCMUQwMjc4ODIyQUNDQUU1RkNGOEY0QURFIF4KKzY5M0RDRjg1OTE5RTA2QTU0MjNGOTI3ODBFNzlDMkMwQzQ1MjhENjcgXgorREI5NEJFQURGRUEzNjgyMDUxRDYyMjUxOUFGOUY4N0JBQjI4QzVGOSBeCisyRTIwRDE5MjVGQkQ0NjBFN0E1RTZCNDhBOTI5NjRBN0REQ0I4NzRGIF4KKzg2NjUxRkQ3MTg2MkNGNzJGMDFGMDk5RjY4Q0MxNjRERUYwRTk2MjUgXgorRDU5NDhCRENBOTFENjcwNzAxNUM3OUJCQzJCQzc0QzFCNjA1NzNGNSBeCis4ODcwQjhBNjg4NEZGNTRFMEU0MDA0NDFGQjJFQzc0RjI0NTJGMzlDIF4KKzdERjFDM0MwNTJFODM5NkQyNTFFOUQ1MjJDNDIyNzM0NERGOTJDMTEgXgorNTlBMjkwQTBCRDQxQjk3M0RFRTM1OTQ3Q0IyNDAwMDZEQkNFQzU4MiBeCitERDBFREIzQUE2MENERUJCODVEQzAxMjU4QjlGNDlGM0E1RTgzNTg5IF4KK0ZDNjc5NEU0QjRGMjczNTc3M0ExOTVGOUJCMjAyMkM3MEFBNEM3NTQgXgorOEJCQzQwQTAyRDg3QThDRjE0RDZDQkEwQTJDOTg1N0Q5M0VGREVGQSBeCitEMjhGRjZFMjM2NjA5NzEzNUVFNTY1RjEwMjYzRTg3OTgxNDBDNURDIF4KKzJFNDI4OUVCRTAyRTc1RTUzQjUyRDY3MjRDREMxNkI4OUVDRjNEQzYgXgorRjJFNzE2ODMxQ0MwQ0I1Q0IyQTYyMzE5N0QxNEMyQzlGQzI1QTkxNCBeCis0N0I5MjZBMTNENjUzNzdBOEUyQUYyN0E4NEUxNzVCRTkzNzM5RTM4IF4KK0QzNjhCOEFDQzUwMzUzRUM4MDcwOTM2QzczMjQyQTJCRjZDRUMzQUEgXgorODU1NjAyNUJFRDY5NUI5NzVDQjkyNERERkIzNzJGNjg5OUE3QjA5RCBeCis5QjRFRDg5RTYzRDE3QjcyMTBBM0ZDMUJCRjBGREE2MDc2OTRGNUQ5IF4KKzBEMjIyMUY1Q0RBMTg0RUM3RjZDQ0EyOUE3NUY1MDJGQ0EyNTY3M0EgXgorM0MxNTJDQ0I4MTFERDlCQzE2NTI5QjIzREZBMTc1N0Q3NDRGRTY3NiBeCis0OEQxODA4Q0Q2MkY4NjhGQjZGNDU1NjAxMzdDRkIxREZEODU2MjY2IF4KKzhBM0ZBNDJBOTg0Qzk1Q0E3NUQ2QUU1MTM5MUFBQUMwNjg4QzJBQkQgXgorQUI1NzBEOTFFOUI2RjNGMTE4OERDODYzOUEzQjE0NDgzN0VGMUVEOCBeCis2NzNGNjJBN0QyMDVENUM5MEI3NDU0RTgxQTVFREE5QTYwNjUwRDkxIF4KK0QwMDU3NUU0NUZBMzI0RkEwNTE0MjM1OUJDM0EwN0M4MDM4MzZFRTQgXgorQjkwOEJFNDRBMkE2NkY3MzcwRENDMDIyMzc4QTlDMkY5QkE3MEIzOCBeCisxRUY3OTAyOUY4OEU3QTA5MUQ2RjJGQTJGNDRBOTY4MjlDMTIwQzYyIF4KKzQ5MUNCMkVFMDk5NEVFNkE0RkFDNTlDNEI5RkJDOUNGODE4M0RFOEMgXgorQ0VBQUM0RTIxMUU3REREQ0UzOTMxQzQ3QUNBM0Q2MjZCNjJFNTA1NCBeCitCRTIwNDFDQjU1QTQ4ODJBODMzNUE0NkI3NDRFQ0I4NjExMzM2RjVEIF4KK0U0QzBCQzY4NTdBRkZFMEMyQjc3QjM4RkMwMTgyOUI0NDI0N0I2Q0MgXgorMTIyQTZBRjExREVCNkMzQjk3RTZBREY1RTA3N0I1RDYzNjM4ODdFMyBeCis8RAorCmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS9zaGEtMS9iaXQtbWVzc2FnZXMuc2hhMSBiL2RidXMvdGVzdC9kYXRhL3NoYS0xL2JpdC1tZXNzYWdlcy5zaGExCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYzZiZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS9zaGEtMS9iaXQtbWVzc2FnZXMuc2hhMQpAQCAtMCwwICsxLDQwMDkgQEAKKyMgIENvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yICJTSEEtMSBUZXN0IgorIyAgU0hBIHRlc3RzIGFyZSBjb25maWd1cmVkIGZvciBCSVQgb3JpZW50ZWQgaW1wbGVtZW50YXRpb25zCitIPlNIUyBUeXBlIDEgU3RyaW5nczxICitEPgorMCAxIF4KKzEgMSAxIF4KKzIgMSAxIDEgXgorMyAwIDEgMSAxIF4KKzIgMCAyIDIgXgorNCAxIDEgMSAyIDEgXgorMyAwIDIgMiAyIF4KKzQgMSAxIDIgMiAyIF4KKzUgMSAyIDIgMSAxIDIgXgorNSAwIDIgMiAxIDEgMyBeCis0IDAgMyAzIDMgMSBeCis1IDAgMiAyIDMgMiAyIF4KKzUgMSAyIDMgMyAxIDMgXgorNSAwIDMgMyAzIDIgMiBeCis2IDAgMiAzIDEgMiAzIDMgXgorNyAxIDMgMyAzIDEgMSAxIDMgXgorNyAwIDIgMyAxIDIgMyAyIDMgXgorNiAxIDIgNCAzIDMgMyAyIF4KKzcgMCAyIDQgMyAzIDEgMSA0IF4KKzggMCAyIDMgMSAxIDIgMiA0IDQgXgorNyAwIDIgNCAyIDMgMSA0IDQgXgorOSAwIDQgMSAyIDEgMSAyIDQgNCAyIF4KKzggMSA0IDQgMSAxIDQgMiAyIDQgXgorNyAwIDMgMyA0IDMgNCA0IDIgXgorMTEgMCAxIDMgMSAxIDIgMSAyIDQgNCA0IDEgXgorNiAwIDQgMyA0IDUgNSA0IF4KKzcgMSAyIDUgMiA0IDUgNCA0IF4KKzEyIDEgMSAyIDMgMyAxIDEgMSA0IDIgMSA1IDMgXgorMTEgMCAyIDMgMyAzIDEgMiAyIDQgMSA1IDIgXgorOCAxIDMgMyA1IDUgMiA1IDIgNCBeCis5IDEgNSA0IDUgMSAyIDEgNSAzIDQgXgorOSAxIDUgMSA1IDIgMyA0IDQgNCAzIF4KKzEyIDEgMSAyIDUgMSAxIDUgNSAxIDQgMSA1IDEgXgorMTIgMSA1IDMgMiAxIDMgMiAyIDIgMSA0IDUgMyBeCisxMCAwIDUgMSA0IDUgNSA0IDEgMSAzIDUgXgorMTIgMSAxIDUgMiAzIDEgNSAxIDMgMyA1IDEgNSBeCisxMiAwIDEgMSAyIDMgMiA1IDEgMyAzIDYgNCA1IF4KKzExIDEgMyAxIDUgMSAzIDQgMyAxIDUgNSA2IF4KKzggMSA0IDYgNCA1IDQgNCA1IDYgXgorMTAgMSA2IDUgNCAzIDMgMyAyIDYgMiA1IF4KKzEwIDEgMiAzIDQgNCA1IDUgMiA1IDYgNCBeCisxMyAxIDMgMSAzIDEgNCAxIDYgNiA1IDEgMiA2IDIgXgorMTAgMSA0IDMgMyA2IDYgNiAzIDIgNiAzIF4KKzEzIDAgMyA1IDMgMSA0IDEgNCAzIDUgMyA0IDEgNiBeCisxMCAwIDIgNSA1IDIgNiA2IDUgMiA2IDUgXgorMTIgMSAyIDIgNSAzIDYgNiA0IDMgMiA0IDMgNSBeCisxMyAxIDIgNiAzIDYgNSAyIDMgMiAxIDIgMyA1IDYgXgorMTMgMSAzIDUgNiAyIDEgMSA2IDIgNCA1IDQgNSAzIF4KKzE2IDEgMiAxIDQgMyAyIDMgMiA1IDMgNCAxIDQgMSA1IDMgNSBeCisxMSAxIDMgMSAzIDYgNyA3IDQgMSA2IDUgNiBeCisxMiAwIDIgNSAyIDcgNSA1IDQgMiAyIDYgNyAzIF4KKzEzIDEgNiA0IDQgMSA0IDIgNSAyIDQgMiA3IDQgNiBeCisxMiAxIDMgNCA3IDYgNyAxIDQgNCAzIDIgNSA2IF4KKzE2IDAgMyAyIDQgNSA2IDEgMSAxIDUgMyA0IDEgNCA0IDUgNCBeCisxNCAxIDUgMSAzIDcgNiAzIDEgMyA3IDMgMSA1IDcgMiBeCisxNCAwIDEgNSAzIDIgNyAxIDUgNSA0IDYgNSAzIDYgMiBeCisxNCAwIDQgNyA2IDYgMiAzIDUgMSAxIDMgNiAyIDMgNyBeCisxMyAxIDYgNCA2IDMgNyA1IDEgNCA1IDEgNyA0IDQgXgorMTMgMCA3IDUgMyAxIDQgNyA0IDIgMiA3IDUgNCA3IF4KKzE1IDEgNyAzIDYgMSAxIDIgNyA1IDEgNSA0IDYgMSA2IDQgXgorMTYgMCAyIDUgMyAyIDcgMiAzIDUgMiAxIDMgMyAzIDcgNSA3IF4KKzE4IDEgMyA3IDIgNCAxIDcgMyA0IDEgNSAxIDUgMSAxIDYgMSAyIDcgXgorMTcgMCAyIDEgNyAzIDcgMSAyIDEgNCAzIDYgNiA2IDIgMiA1IDQgXgorMjIgMSAyIDIgMSAxIDIgNiAyIDQgMSAxIDMgNSAyIDMgNCA1IDYgMSAxIDIgNiAzIF4KKzEyIDEgNyA4IDcgMiAxIDMgNSA3IDggNyA0IDUgXgorMTUgMSAzIDUgNSAyIDIgMiA3IDQgMiA4IDcgNCA1IDUgNCBeCisxNiAwIDEgNCA0IDYgMSAyIDcgMSA2IDQgMSA4IDQgNyA0IDYgXgorMTYgMCA4IDcgNyAyIDUgMiAxIDUgNiAxIDEgNSAxIDUgNiA1IF4KKzE0IDAgNyAzIDIgMyA4IDMgMyA4IDIgOCAzIDcgNyA0IF4KKzE0IDAgNCAyIDYgNSA0IDUgMyA4IDggNCA4IDIgNiA0IF4KKzE0IDAgOCA3IDEgMyA1IDggMiA4IDEgNCA1IDIgOCA4IF4KKzE2IDAgNSA1IDIgMiA0IDIgNCA3IDYgMSA1IDggMyA4IDcgMiBeCisxNiAwIDEgNiA2IDYgNiA0IDIgMiA2IDQgMiA0IDQgNiA3IDYgXgorMTYgMSAyIDMgNyA0IDEgNyA3IDUgNyAyIDQgNyAyIDYgNiAzIF4KKzEzIDAgNyA0IDggNiA1IDcgNiAzIDUgNyA1IDggMyBeCisxNiAxIDQgMSAxIDUgNCAzIDYgNSA1IDggNSA0IDggNSAzIDggXgorMTMgMCA3IDQgNCA1IDggMyA4IDMgOCA2IDYgNiA4IF4KKzE0IDEgNSA0IDcgNSA4IDQgNiAxIDYgMiA3IDggNiA4IF4KKzE4IDEgMyA0IDQgNSAzIDQgMSA2IDMgNyA2IDcgMyAzIDIgOCA0IDUgXgorMTkgMCA1IDggMSAyIDEgMyA1IDMgMSA2IDYgMyA3IDQgNSA3IDEgNCA3IF4KKzE3IDAgNSA3IDcgMiAyIDYgNCA3IDEgNyA4IDEgNSAzIDIgNyA2IF4KKzE0IDAgOSAzIDYgOSAzIDQgNyA2IDkgMSA3IDIgOSA2IF4KKzIxIDEgOCA2IDUgMiAyIDQgMyAxIDEgNiAyIDggNCAyIDUgNCA1IDEgMiA1IDYgXgorMTYgMSAyIDYgNSA0IDkgOCAxIDggMSA3IDYgNyA3IDEgMiA5IF4KKzE1IDAgNiA5IDUgNCA3IDEgNyAzIDkgNCA3IDcgNSAyIDggXgorMTYgMCAxIDcgOCAyIDcgMiA5IDggOCAzIDQgNSAyIDQgOCA3IF4KKzE2IDEgMSA2IDggMiA4IDEgNiA3IDcgNSA5IDIgOSAyIDggNSBeCisxNiAwIDQgMiA5IDYgMiA2IDYgNyA5IDkgMSA5IDQgMSA1IDcgXgorMTggMSA2IDkgMiA3IDIgOCA1IDggNCAzIDQgNCA2IDYgMyAxIDYgNCBeCisxOSAwIDEgNyA0IDQgNCA2IDEgNiAzIDkgNSA2IDQgNyAyIDIgNSA1IDggXgorMTcgMSA4IDUgMyA3IDMgNSA2IDQgMSA5IDIgNiA1IDcgOSAxIDkgXgorMTggMCA4IDggNiAzIDUgMyAzIDUgNSAzIDggMyAyIDUgNSA0IDcgOCBeCisxNiAxIDQgNyA3IDIgNyAzIDggNSA3IDUgNiA4IDUgMiA4IDggXgorMTkgMCAzIDcgMiAzIDkgNSA5IDcgNyA2IDUgMyAxIDEgNSAyIDMgOSA2IF4KKzE4IDAgMiA0IDYgNyA4IDEgMiA5IDcgMiAzIDUgOCA5IDEgNyA5IDQgXgorMjEgMSA0IDEgOCAzIDMgMSA3IDMgNSA3IDQgMSA4IDMgNiAzIDUgNyA2IDggMiBeCisxNyAwIDQgOCAzIDcgOSA4IDYgOCA0IDIgOCA3IDIgNCA0IDUgNyBeCisxOCAxIDMgOSA3IDEgNCA1IDYgOSAyIDkgMSAzIDggNCA3IDggNyA0IF4KKzI1IDEgMiA0IDggMSA3IDIgNyA1IDUgMyAyIDMgMiAxIDIgMSAxIDIgNCAyIDggNyA4IDcgNCBeCisyNSAwIDkgNCA2IDUgOCAxIDEgMSAzIDIgMSAzIDEgMSAxIDUgMyAzIDYgNSA3IDQgNSA2IDggXgorMTkgMSA3IDUgNiA2IDggMiA0IDEgOCA3IDEgNiAzIDQgOCA1IDggNSA2IF4KKzE5IDAgNiAxIDIgMSA3IDEgMTAgNyA0IDUgMSA2IDQgNiA4IDcgMTAgOSA2IF4KKzE2IDAgMTAgMTAgNSA1IDkgNyAyIDUgNCAzIDYgMyAxMCAxMCA1IDggXgorMTggMSAyIDMgNSA5IDggNSAxMCA2IDggNCAyIDIgNCA3IDkgNiA5IDQgXgorMTggMCA1IDEwIDMgMSA0IDUgNCA2IDggMyA3IDcgNyA1IDkgMiA5IDkgXgorMTggMSA0IDkgNyA1IDQgNCAxMCA2IDkgMyA2IDYgOCA2IDIgNCA2IDYgXgorMTcgMCA1IDcgNCA4IDUgOSAxMCA0IDkgMSA0IDggNiA2IDUgOSA2IF4KKzE3IDEgMyA0IDggOSAxIDUgOCAxMCA1IDEwIDMgOCAxIDYgOCA5IDkgXgorMTggMCA4IDMgNiAxIDMgMTAgMyA3IDYgNSA5IDMgMTAgOSA0IDYgMTAgNSBeCisxNiAxIDkgMSA5IDYgNSA3IDcgMTAgOSA2IDEgNSA3IDEwIDggOSBeCisyMCAwIDYgNCAxMCAxMCA0IDMgOSA4IDEwIDMgMyA1IDIgMSA4IDEgMyAyIDkgOSBeCisxNyAxIDEwIDYgMTAgNiA4IDMgNiA3IDMgMTAgOCA2IDYgNCA0IDkgNSBeCisxOSAxIDkgNCAzIDQgNyAzIDggMTAgMiA0IDEwIDcgNiAxMCAxIDMgNSA3IDkgXgorMjEgMSAyIDIgMiAzIDkgMiA4IDMgOSAzIDcgNyA0IDkgOSA1IDQgMiA2IDEwIDcgXgorMTcgMSA1IDkgOCA4IDkgMTAgOSAxIDggMyAxMCAyIDcgMiAxMCA0IDkgXgorMjMgMCA1IDQgMTAgNCAxMCA3IDggMyAxIDEgMyA0IDIgMSAxIDEwIDIgMSA0IDEwIDEwIDEwIDQgXgorMTkgMCA5IDIgNSA3IDkgNiA3IDEgOCA5IDEgMiAxIDEwIDggMTAgNCA3IDEwIF4KKzIyIDEgMiA2IDggOCA5IDcgMiAxIDMgMyAxMCA2IDIgNiAyIDYgNSAyIDUgMTAgNSA5IF4KKzIyIDEgOCA3IDggMTAgMSA2IDMgNyA0IDUgNSA1IDEgOSAyIDIgNSA1IDIgMTAgOSA0IF4KKzIxIDAgMSAxMCAyIDYgMTAgOSA0IDMgMyA3IDEwIDIgOSA2IDEwIDIgMSA1IDYgMyAxMCBeCisyMSAxIDggNSA3IDEwIDUgNiA3IDMgMyAxIDIgOSA0IDggNiAzIDkgMSA3IDcgOSBeCisyMiAwIDUgNSA2IDUgMiAzIDUgMyAxMSA0IDUgMSAxMCA2IDQgMTEgOCAzIDYgNSA2IDcgXgorMjAgMCAyIDEgOSA5IDMgNiAxIDggMTEgNiA3IDExIDYgMSAxMCA2IDcgNSA1IDggXgorMTkgMCA0IDEgNyAxMCA0IDggMTAgOCAxMCA0IDExIDkgNiAxIDQgNSA2IDExIDQgXgorMTkgMSA5IDIgNCAxMSAxMSAxMSA3IDEgMSA2IDggMSA5IDggNSAxMSA1IDQgMTAgXgorMjAgMCA4IDMgMTAgMSA3IDYgMTAgOCAyIDkgMyA4IDYgOCA5IDMgNyA1IDEgMTEgXgorMjIgMCA0IDUgOCA0IDEwIDYgNSA0IDUgMyAzIDQgMSA1IDkgNCAxMCA5IDYgNyAzIDExIF4KKzIxIDAgNiA1IDggNyA4IDExIDIgMSAxMSAxMCAzIDMgMiA5IDEgMyA2IDkgMTAgMTAgMiBeCisyNCAxIDMgMSAxIDkgNCAyIDUgNyAzIDEwIDExIDUgNiA3IDEgNyA3IDggNyAyIDIgNyA0IDkgXgorMjMgMSA5IDQgNiAzIDcgNSAxMCA5IDggOSAzIDIgMSA3IDIgMiA3IDYgMiA4IDMgNiAxMCBeCisyMiAxIDcgMTAgMiAxMCA1IDEgOCA3IDcgMyA4IDYgNiA4IDMgMiAxMSA2IDMgNCA3IDYgXgorMjAgMSAxMSAzIDcgMiAxMCAxMCA3IDUgMiA0IDMgNSAxMSAzIDExIDggOSA1IDUgMTAgXgorMTkgMCA2IDIgNiA4IDUgOSA0IDkgMTAgOSA4IDMgMiAxMCAxMSAyIDYgMTEgMTEgXgorMjAgMSA4IDIgNCAyIDcgMyA5IDkgMTEgOCAyIDExIDQgOCA0IDggMTAgNiA5IDggXgorMjEgMCA2IDEwIDEwIDcgOSAyIDUgMTEgOSAxMCA3IDMgMSA0IDUgNCAxMCAxIDIgOCAxMCBeCisxOCAxIDggMTEgNiAxMCA4IDkgMTEgNiA3IDcgMiA2IDIgNiAxMCA2IDkgMTEgXgorMjEgMCA1IDExIDEgNiA4IDExIDggMTAgNSAxMCAzIDcgOCA5IDkgMSAxIDEgMTAgMiAxMCBeCisyNSAxIDUgMTAgMiA5IDkgOSA3IDIgMiA0IDYgMSAxMSA3IDMgMyA1IDUgMiAxMSAyIDUgNSAxMCAyIF4KKzIxIDEgMSA4IDEgMTEgNiA5IDMgNiAxMSA3IDExIDggNiA5IDQgNCAxMCA3IDEgOCA3IF4KKzIzIDEgNyA3IDUgMTEgMSA0IDcgMTEgMTEgMTEgOSAyIDEgMyA4IDIgOCA3IDQgNSAyIDUgOCBeCisyNCAxIDQgMTEgNSAxMCA3IDcgOSA1IDEgNSA2IDIgOSAxIDUgNyA5IDkgMTEgMSAxIDMgMSAxMSBeCisyNyAxIDEwIDQgNiA4IDUgNyAxMSA0IDEwIDggNiA0IDMgNCA0IDIgMSAxIDMgMyAxIDExIDIgMyA0IDEwIDYgXgorMjEgMSA3IDExIDIgNyAxMCAxMCA5IDEwIDEgMyAxMCA0IDMgMTEgMTAgMiA1IDMgOSAxMSA0IF4KKzIyIDAgNyA5IDEwIDkgNSAyIDYgNiA5IDIgNyA0IDkgOCA0IDkgMiA1IDkgOCAxMCAzIF4KKzIxIDAgMTIgMiA2IDEyIDcgOSAzIDUgMTEgNiAxMSAzIDUgNCA0IDExIDEwIDIgMSAxMCAxMCBeCisyNyAxIDEgNCAxMiAyIDEwIDEgNiA1IDUgNCAxIDEwIDMgMSAxMiAzIDIgMTEgNSAxIDQgNiA0IDYgMTEgMTEgNCBeCisyMiAxIDggOSA0IDggMTIgNSA1IDkgMyA1IDIgMyA0IDEyIDEyIDggNSAzIDEgOSAxMCA5IF4KKzI0IDAgNSAxMiA4IDYgMiA0IDExIDExIDIgNyAxMSA5IDQgNSAyIDEgOCAzIDEwIDIgNSAyIDggOSBeCisyMSAwIDMgNyA3IDcgNSA5IDExIDUgOSAxMSAyIDkgNyA1IDYgMTEgMiAxMiA0IDkgNyBeCisyNiAwIDQgNCA2IDQgNyAyIDQgMiA1IDcgMiA2IDExIDUgOSA4IDIgNSAxMCAyIDEwIDggOCA1IDIgMTEgXgorMjMgMSAzIDMgMiA2IDkgMTAgNSA2IDggNSA4IDExIDMgNiAxMCA0IDYgOSAyIDExIDEwIDMgMTAgXgorMjUgMSAxIDMgMTIgMyA3IDQgNSA1IDMgOCA5IDIgNCA4IDcgNyA5IDEgOSAxMSA0IDUgNyA3IDEwIF4KKzIwIDEgMTEgOSA4IDEwIDExIDEgNyAxMiA2IDcgNCAyIDEyIDEyIDIgMyA5IDEwIDggOCBeCisyMCAwIDEyIDExIDEgNCAxMCA2IDEwIDMgOSA3IDEyIDQgMTEgOCA0IDYgMTIgNCA3IDEyIF4KKzI0IDAgOCA2IDQgOCAyIDIgOSAyIDkgNiAzIDYgMyAzIDEwIDEyIDIgNyA4IDcgOCAxMiAxMCA3IF4KKzI2IDAgNSAxMSAxMSA3IDMgMyA5IDEwIDMgOSAzIDMgNyAyIDkgOSAxIDIgNCAxMiAyIDUgNSA2IDEwIDQgXgorMjIgMSAxMiA5IDEwIDEwIDEyIDEyIDcgOCAyIDcgMSA2IDggMiA4IDcgNiAzIDEgMSAxMiAxMiBeCisyMiAxIDExIDEwIDIgMTEgMTAgOCAxIDIgOCAxMiA4IDMgOSA1IDcgOSA4IDcgMTEgMSAxMCA0IF4KKzIyIDAgMTAgMSA4IDYgMTIgMiAxMSA3IDEwIDQgMTAgNiA1IDcgMTAgMTEgMyAzIDggOCA0IDEyIF4KKzI2IDAgOCA1IDUgMTIgMSA4IDYgNyA2IDExIDggMTAgNCAzIDcgNiAxIDUgMSAxIDkgMSA1IDggOSAxMiBeCisyMSAwIDEgMTIgNCAxMSAxMiA5IDIgMTIgMTIgMyAxMiA1IDQgMTIgNCAxIDUgOCAxMiA5IDEwIF4KKzI2IDEgNSAzIDggMSAxMSA0IDcgMyAzIDEwIDQgOSA2IDYgNCAzIDkgMTEgMSAzIDcgMTAgNyA5IDYgMTEgXgorMjMgMCA3IDEyIDMgNSA4IDkgNyAxMCA4IDExIDEwIDExIDYgMSA4IDEgMSA2IDMgOSA4IDEyIDYgXgorMjUgMCAxIDUgNSA2IDUgMTIgMSAxIDEgMTEgOSA5IDMgMTEgOSA2IDEgMTEgMyAxIDEyIDggMTEgMTEgMTAgXgorMjIgMSAxMCA5IDcgMyAxMCAyIDYgNCAxMSAzIDExIDYgNCA1IDUgMTEgMTIgOSA3IDggMTIgOSBeCisyMiAwIDggNSAxMCA3IDEyIDggMyA0IDQgNSA4IDkgMTIgNiA4IDEwIDYgNyAxMSA0IDggMTAgXgorMjYgMCAzIDUgMyAxMSAxMSAyIDEgOSAxIDEwIDQgNCA2IDkgNCA3IDYgNSAxMCAxMCAxIDggOSA5IDYgMTIgXgorMjQgMCAxMiAxMSA0IDEwIDEgMyA3IDUgMTEgOSAxMSA3IDIgMTEgNSA0IDcgOCAxIDYgMTIgNyA0IDkgXgorMjggMCAxIDEyIDEwIDIgMiAyIDQgOSAxMSA0IDExIDcgMiA0IDMgMTEgNyAxMCA1IDEwIDUgNSAzIDUgMiA3IDUgOSBeCisyNiAxIDQgMSA0IDIgMTMgNiAxMSA1IDYgOCA1IDEgNSA2IDMgOCAxIDUgOCA5IDkgMTAgMTIgMTMgMTIgMiBeCisyNiAwIDEyIDMgMSAxMSAyIDEyIDYgOCA2IDggMTEgNCAxMSAxMCA5IDYgMyAzIDIgMiAyIDEzIDIgMSAxMyA5IF4KKzIyIDAgMyAzIDEyIDEzIDEzIDcgMTIgMiA4IDExIDkgMTAgMTAgMSAxIDEzIDExIDEzIDQgMSAxMSAzIF4KKzI2IDEgMiA2IDIgOCAxMiAzIDcgMTIgOCA5IDggMyAxMiA3IDQgOSAyIDYgNCA5IDkgNCA4IDIgNCAxMiBeCisyNCAxIDggMTEgMTEgMyAxMyAyIDEwIDMgMTAgOCA2IDYgNCA0IDEzIDQgMiA0IDggMSAxMSAxMiA5IDEwIF4KKzI5IDEgMSAyIDUgMSAxIDEwIDMgMiA0IDkgMTEgOCAyIDUgMiA4IDEwIDIgMTAgMTEgNyA4IDEyIDYgMSA5IDggNCAxMiBeCisyMyAwIDYgMTIgNyAxMCA3IDcgMTMgMiAyIDcgMTAgMiA4IDEzIDEwIDcgMTEgMiA1IDkgMTEgMTMgMSBeCisyNSAxIDMgMTEgMiAxMCA1IDExIDUgNyAxMCA4IDEwIDEgMTAgMyAxMSA3IDkgNSAzIDMgNCA1IDEzIDEyIDggXgorMjYgMSA1IDEzIDkgNCAzIDMgNCAzIDEzIDEgNiAxMSAxMCA4IDEzIDMgNCAxMSA5IDEgOSAxIDcgOCA3IDExIF4KKzIyIDEgMSAzIDEzIDggMTEgMyA0IDEwIDEwIDEyIDcgMiAxMSA0IDcgNyA2IDEzIDEzIDkgMTMgMTEgXgorMjYgMSA3IDkgNyA4IDkgOSA1IDEgMTMgMyAzIDQgOSAyIDEgOCA5IDMgOSAxMiA4IDEwIDEwIDYgMTEgMyBeCisyMyAxIDMgOCAxMiA4IDEwIDQgMyA4IDUgNSA3IDExIDEzIDExIDEyIDExIDQgMTIgMyA2IDUgMTEgOCBeCisyNyAwIDMgMTAgOSA2IDkgNyAyIDEwIDQgNCA1IDUgMiAxMiAxMyA1IDMgMSAxMCAxIDQgNyA4IDEzIDEzIDEyIDMgXgorMzAgMCAyIDYgNSA0IDcgMyAxMCA2IDEzIDYgMyA5IDYgMiAxMCA1IDMgOCA0IDEgMTEgMyA1IDMgNyAxMSAxIDEyIDkgNyBeCisyOSAwIDUgMiAxMyA2IDUgMiA2IDMgMiA5IDUgMyA2IDYgNCAxMCAyIDQgNyA3IDEwIDEzIDkgNiAxMCA2IDUgOSA4IF4KKzMxIDEgOSA4IDIgNyAzIDUgMTEgMyA3IDcgNSA2IDIgMSAxIDYgMiAxMSA1IDQgNSA3IDkgMSAxMSAxMCAyIDMgOSAxMiAxMCBeCisyOCAwIDExIDEgNCAxIDEyIDEwIDUgNSAxIDcgMiAzIDEwIDcgMTIgOSAyIDggMiA2IDEwIDUgMTIgMTIgNCA5IDIgMTMgXgorMjYgMSAxMSA5IDggMTIgNCAxMiA3IDMgNCA0IDYgMSAyIDcgMTIgNCA2IDggMTAgMTEgMTEgMSAxMCAyIDkgMTIgXgorMjggMCAxMCA5IDcgMTAgMSAxMCA5IDEyIDcgMTAgNyA2IDYgNSAzIDIgMyAxIDMgMTIgMSA0IDEzIDMgOSA3IDkgOCBeCisyNyAxIDQgMTEgMSA1IDYgOSAxMiAxMiAxMyAxMyAxMyAxIDIgMTMgMSAyIDEgMTIgMTIgMyAyIDIgOCAzIDEzIDcgNyBeCisyOSAwIDYgNSA1IDIgNCAyIDExIDQgNCAxMyA5IDEzIDcgMyAxMiA4IDMgNyA2IDQgMTIgMyAxIDggMTEgMSA2IDEzIDYgXgorMjMgMSAxMSA2IDYgMTEgNyAxMyAxMSA2IDcgNCA0IDEyIDIgMTMgNSAxMiA1IDcgOSA2IDExIDExIDExIF4KKzIzIDAgMTEgMTMgMTEgNyA0IDMgNiAxMiAxMyAxMCAxMSA1IDEyIDEzIDExIDYgMSAxIDQgNyAxMyAxMCA3IF4KKzI3IDEgNyA1IDEzIDUgNCA4IDcgMyA5IDYgNyAxMSA3IDEgOSAzIDggNSA4IDggMiAxMyAxMyA4IDUgMTMgNCBeCiszMCAxIDIgNSA4IDQgMTMgMTAgNiA0IDIgNiAxIDEgMTIgNCAxMyA1IDEwIDQgMTAgOCA1IDcgMSA1IDUgMTIgNCA4IDYgMTIgXgorMjggMSAxMiAxIDEyIDExIDEwIDIgMyAxMCAxIDIgNiAxMSAxMiA5IDExIDEyIDIgMSA5IDQgMSA1IDcgMiAxMiAxMSA0IDExIF4KKzI5IDAgNiA4IDcgOCA4IDEyIDIgNyA0IDEyIDExIDUgNSAzIDUgMTMgNCAxMSA4IDggOSAyIDIgMSA2IDIgOCA2IDEyIF4KKzI4IDEgNyAxMyA1IDcgMTEgMyAxIDkgMiA1IDEyIDggNiAyIDUgOSAxMCAxMCAxMSA0IDUgMTIgNSA0IDYgNSA2IDEzIF4KKzI1IDEgMTQgNCA4IDIgOSAxMSA3IDQgMyAyIDggMTQgNiAxNCA3IDEzIDUgNSAxNCA2IDUgMTEgNiA2IDEzIF4KKzI2IDEgMyA1IDEyIDEgMTEgMTMgMSAzIDMgMTAgMTEgNSA2IDEyIDExIDEyIDcgMTQgNCAzIDYgNiAxMCAxMSAxNCA0IF4KKzI3IDAgNCAyIDMgMTAgNyAxMiAxMyA4IDggMTIgMTAgMTMgMSA3IDEwIDIgNyAyIDEzIDEwIDIgMyAzIDYgNCAxMyAxNCBeCisyNCAxIDExIDEgOSAxNCA0IDE0IDE0IDggMTAgMTMgNCAzIDIgNyA2IDYgOCAxNCA1IDExIDcgMTQgMTQgMSBeCisyMiAxIDEzIDEzIDEwIDkgMTMgOCAxNCA5IDMgMTQgMyAxMSA5IDkgMTIgMTMgMiAxMCAxIDUgOCAxMiBeCisyNSAwIDkgMTAgOSA4IDQgMTQgNiA5IDMgMTMgMTAgMTEgMyAxIDQgNiAxMCAzIDQgMyAxMiAxMiAxNCAxMSAxMyBeCisyNiAxIDExIDggMTEgNyA4IDEwIDkgMTIgMTEgNiAxMCA2IDMgOSA5IDEgNyA1IDYgNyA3IDEyIDQgNSA4IDExIF4KKzI2IDEgMTIgMTAgOCAxNCA3IDQgMTMgMTMgOCA0IDUgMyAyIDQgNyAxNCAzIDEwIDYgOSAxMyA5IDIgMSA5IDE0IF4KKzI4IDAgNiAxMiAyIDQgNyA4IDExIDEwIDEyIDIgMTQgMyAxIDEgMSAxMiA1IDEzIDkgMTIgNSA5IDEwIDUgMSAxMiAxMCA4IF4KKzI5IDEgMiA2IDUgMTQgMTQgMyA2IDEzIDEgMiA2IDIgMTIgMSAyIDEwIDEgNCA1IDE0IDEwIDEyIDExIDIgMyAxNCAxNCAxMiA1IF4KKzMwIDEgNSAyIDMgNSAxMSAxMiAzIDcgMTIgNyA5IDggMyAzIDE0IDEwIDUgMiA5IDMgOCA2IDExIDggNyA4IDEgNiAxMiA3IF4KKzI4IDEgMTQgNSAyIDE0IDcgOCAxIDUgNCAxMiA5IDYgMTIgMSAxIDcgOSA1IDE0IDExIDkgNCAxIDEwIDEgMTQgMTAgMTIgXgorMjcgMCA3IDIgOCA1IDMgMTQgOCA5IDQgNiAxMSAzIDExIDYgMTIgMSA3IDE0IDkgMTQgNiAxMCA2IDEgOCAxNCAxMCBeCisyNiAxIDYgMTQgMiAyIDEyIDEwIDUgMTAgMTAgOCAzIDcgMTMgMTAgMSAxNCAxIDE0IDcgMTEgMTIgOSAxIDggOCAxMiBeCiszMCAwIDYgMTMgNSAxMyAzIDUgOCA4IDggMiA1IDUgNCAyIDEzIDE0IDcgMiAxMiAxMiAzIDMgNSA3IDUgMTEgMyA3IDEzIDcgXgorMjYgMCAxMyA3IDIgOCA0IDEwIDE0IDIgNyAxIDEwIDggMTEgMTEgMiAxMyA5IDExIDIgOSAxMSA3IDEzIDExIDIgMTQgXgorMzEgMSA3IDcgOCA1IDEzIDQgMSAxMiAxNCAxIDkgMTEgMyA1IDMgMTMgMTEgNyAzIDIgOSAxIDMgMTMgNiAzIDEwIDEyIDEgMTMgMyBeCisyMyAwIDkgOCA4IDcgMTQgMTMgNiAxMyAxNCAxMiAxMyAxMiA3IDQgMTQgMTAgMSAzIDkgNyAxMSAxNCA1IF4KKzI3IDEgMSAxMCA0IDEyIDQgMTEgNSAxMyAxMyA0IDEyIDEzIDcgMTIgMTIgNCAxMyA2IDIgNyA1IDIgOCA3IDEzIDEyIDMgXgorMjYgMSA3IDYgMTEgMTIgMTQgMTIgMyAxMiA4IDcgNCA5IDE0IDEgOCAxMSA2IDUgMTAgMTAgNiA4IDUgMiAxMSAxNCBeCiszMyAxIDEgMTEgMSA1IDMgOCAxIDEyIDE0IDUgMSAzIDcgMiAzIDkgMyA0IDE0IDQgNCAxMCA4IDUgMTQgMSAxMSAxMiAxMiAxMCA0IDEzIAorMiBeCiszMiAwIDExIDQgNCA5IDUgNSA4IDkgNSAxMCA0IDIgNCA3IDkgOSA2IDMgNSAxIDggMyAyIDEzIDMgMTQgOSA4IDkgMTAgMTQgNSBeCisyOCAwIDEyIDkgNSA4IDcgMiAxNCAxMiAzIDggMTQgNiA2IDQgNyA1IDcgMTAgNyAxMSAxMCAxIDkgNiA3IDEyIDggOSBeCisyNSAwIDkgOSAyIDExIDEzIDEyIDExIDExIDYgMTQgMTMgMTAgNSA2IDggMTAgNCAzIDExIDExIDE0IDUgNSAxMCA3IF4KKzMwIDAgMTMgOSAxNCAxMSA0IDggMTIgOSA1IDkgMSAyIDkgMTMgMTIgNiAxIDE0IDExIDEwIDcgOCA2IDEgNCAzIDIgMiAyIDEzIF4KKzMzIDEgMTMgNSA5IDYgMTMgOSAxIDEzIDIgNiA4IDkgMSAzIDEyIDEzIDMgNCA0IDEyIDUgMiAxIDEyIDEgNiAyIDEgOCAyIDE0IDEzIDkgCiteCiszMiAxIDggNiA3IDEgNCA0IDYgMSAxMyAzIDMgMSAxMyA3IDYgMTEgNiA0IDkgMTAgNCA4IDEzIDEgOSAxMCAxMiA3IDEwIDExIDEwIDUgXgorMzAgMCAxMiA2IDYgMyA0IDEzIDEgNCAxMSAxMCAyIDYgMTQgNiA5IDEyIDYgMiAyIDExIDkgMTMgNCA3IDkgMTQgMiAxMSA4IDcgXgorMjYgMSAyIDExIDEzIDIgOSAxMSA4IDExIDExIDE1IDEzIDEzIDMgMTUgMiAxMiAxIDE1IDMgOCA0IDkgMTMgMSAxMyA3IF4KKzMyIDEgOSA2IDEgMiAyIDEgMTUgMyAxNSAxIDEwIDEgNCAxMSAxNCAxNCA2IDEwIDIgNSA5IDEwIDEwIDkgMSAyIDE0IDEwIDEyIDEgMSAKKzE1IF4KKzI5IDEgMTMgMiAzIDggMTIgNSAxNCA5IDggOSAyIDE0IDEgNCA2IDE1IDEwIDkgMiA3IDkgNCA4IDcgOSAxMCAxMSAxMSA1IF4KKzM0IDEgMTIgMiA3IDIgMTIgOCAyIDggNiAzIDEyIDQgNCAxMCAxIDE0IDEyIDExIDUgMTUgMyAzIDMgMTQgMTMgMiAyIDMgOCAyIDEgOCAKKzggOCBeCiszMSAwIDYgMiA3IDEwIDEgMTMgMTAgNiA2IDYgMiA4IDcgNiA3IDE0IDMgMTIgNiA4IDkgMyAxMSAxIDMgMTAgMTIgMTEgMTEgOSA5IF4KKzI0IDEgMTMgMTUgNCA3IDExIDEzIDEwIDE0IDE0IDEzIDQgMTEgNSA2IDExIDggMTIgMTMgOSAxIDEwIDkgMTAgNyBeCiszMyAwIDMgMSAzIDMgNCAxMyAxIDYgMTQgOCAzIDQgMyAyIDEgMTQgMTQgMTQgNSAxMyAxMyAxMSAxMCAxMyA0IDMgMTAgMTEgMyA2IDEgCisxMCA3IF4KKzI4IDAgNyA5IDEzIDkgMTUgMiA0IDEyIDEwIDEwIDQgMTIgMyA4IDUgNiAxMyAxIDYgMTUgMSA4IDkgNiAxMiAxMSA3IDE0IF4KKzMyIDEgMyAxIDEzIDYgNCAxIDkgNCA1IDcgMSA4IDggMTEgMTAgNSAxNSAxNCAyIDggMTQgOSA3IDEyIDIgNCAxMyA3IDQgMyA5IDE0IF4KKzMxIDEgMTQgMTIgMTMgOCA0IDEyIDIgNiA1IDEyIDkgMyAxMSA4IDUgMTMgNSAxMCA1IDIgMyA3IDEyIDE0IDQgMSA3IDMgNiA5IDkgXgorMzIgMSAxMCAxNSA3IDIgMTMgNSA3IDIgNSAyIDEwIDcgMTEgNSA1IDkgOCAyIDkgMyAzIDYgMyAxMyAxMCAzIDUgNyAxNSAxMSAxMCAxMiAKK14KKzM4IDAgMiAzIDcgMSA2IDMgMyAxMiA1IDIgOSA0IDUgMTEgMiAxIDcgNiAxNCA3IDE0IDEwIDQgMTEgNiAzIDExIDIgMTAgNiA0IDggMSAKKzQgOSA0IDE1IDQgXgorMjcgMCA3IDcgNCAxNCAyIDMgMTQgMTUgMTAgNyAxMiA3IDUgOCA3IDE1IDE1IDE0IDEwIDIgMyAxIDEwIDEyIDE1IDkgOSBeCiszMSAxIDE1IDMgOSA5IDUgNCAyIDYgMTQgNCA5IDUgMTIgOCAxIDYgMSA0IDggNyAxMCAxNCAzIDEwIDE0IDggMTEgOSA4IDEwIDkgXgorMjggMCAxNCAxMSA4IDMgNSA1IDcgMiAxMSA0IDQgNCA2IDE0IDEzIDEwIDE0IDEwIDMgOSA2IDkgNyA1IDEwIDE1IDE1IDE1IF4KKzMwIDEgOCAxMyA0IDIgMTMgNiA0IDcgNCA0IDE1IDIgMiAxMiAxMyAzIDE0IDEyIDcgMTEgNiAyIDE0IDIgNiA2IDkgMTQgMTMgMTIgXgorMjcgMSAxMyAxNCAxNSAxMiAxNCA1IDE0IDE1IDExIDQgMSAxIDkgNSAxMyAxMCA2IDUgNSA2IDE0IDEzIDEgNSAzIDE0IDEzIF4KKzI5IDAgNCAyIDEzIDEyIDE1IDcgMyAxNSA1IDEgNiA3IDYgMTMgMSAxNCAxMSA5IDUgMTUgNiAxMyAzIDYgMTEgNyAxNSA4IDkgXgorMzEgMCA1IDQgNCAxNCAzIDEzIDggMTMgMyA3IDEzIDcgOSAxMiAzIDExIDE1IDExIDUgMTQgMSAzIDQgMTAgMTIgNyAxMiAxIDIgMTMgNCAKK14KKzI4IDEgMTIgNyAxMyAxNCA3IDcgMSA5IDEzIDggNSAxNCAyIDUgOSA5IDE1IDkgMTMgNyA4IDkgOCAxIDEyIDMgOSAxNSBeCiszNCAxIDYgMTIgNCAxNCAxMiA1IDMgMTUgNCA0IDYgOCAyIDExIDggNCAyIDUgMSAxNSAxNSAxIDE1IDIgMTEgNCAxMCA5IDQgNyAzIDIgCisxNSA2IF4KKzI2IDAgMTQgNSA2IDUgMTEgMTIgMTQgMTIgMTIgMTEgMTUgMiAxNCA5IDE1IDEgNyAxMiAxMSAxMiAxMyAxNCAxIDEgMTIgNSBeCiszMiAwIDIgMiA0IDUgMiAxMSAxMiA1IDQgMTIgOSAxNCA1IDUgOCA2IDIgMTUgMTUgNiAxMyAxMSAzIDUgMTUgNSAxMSAzIDEyIDcgMTAgCis4IF4KKzI2IDEgMiAxNSAxNCA5IDE0IDcgNiAxNSA5IDMgNCA4IDggMTIgMTQgMiA5IDExIDE0IDYgMTEgMTUgMTAgOCAxNCA4IF4KKzM0IDEgMTUgNyA0IDUgMTAgMSAxMyA3IDEgMSA4IDMgMTMgMTEgMiA4IDE1IDExIDEyIDYgNiAxIDMgMiAyIDExIDMgMTMgOSAxMCAzIDYgCisxMiAxNSBeCisyNSAwIDE1IDcgMTAgMiAxMCAxNSA1IDEwIDEzIDEyIDggMTUgMyAxIDExIDE0IDE1IDggMTUgMTIgOSA2IDggMTMgMTMgXgorMjcgMCAxMCA4IDEzIDEwIDE1IDEzIDUgOCA0IDEwIDEwIDYgNyAxMyA2IDEyIDEyIDkgMTIgMiA1IDEwIDEyIDEwIDggMTUgNiBeCisyOCAwIDUgMyA4IDEyIDE1IDggMTQgMTUgOSAxMiAxMiAzIDEwIDEzIDYgMTEgMTAgNCAxMyAxNCA4IDkgMSA4IDEgNSAxMSAxMiBeCisyOSAwIDkgMTIgNCAxMyAxNSA1IDkgMTEgNyAxNCAxMSAxIDExIDcgOCA4IDExIDEgMTMgMTUgMTIgMSA1IDggMyA4IDEwIDcgMTQgXgorMzAgMCAxIDUgMTMgMTIgMTQgNSAzIDYgNCAxMiAxNSA2IDYgMTAgMTEgMTMgOSAxIDExIDYgMTAgMyA3IDE0IDQgMTQgMTEgNyA4IDEzIF4KKzM0IDEgMSAxMiA1IDEgNyA0IDYgNyA1IDExIDEgNCA3IDEyIDEwIDEwIDggMTUgMTMgNCAxMSAxNSAxMSA2IDkgMSAyIDE1IDUgMSA1IAorMTIgNiAxMyBeCiszNSAxIDEyIDE1IDQgMTEgMTMgMyA2IDUgMTAgOCAxIDMgOSAzIDExIDEgMiAxNiAxMiAxMCA2IDEgOSAxIDE2IDUgNiAxNSAxIDEyIDQgCis0IDIgMTUgNCBeCisyNyAwIDE1IDExIDE1IDUgMTEgOSA3IDE1IDE2IDYgMTYgMTIgMyAyIDEwIDE2IDUgNSA3IDEgNyAxMSAxMyA3IDkgMTEgMTIgXgorMzEgMSA1IDUgNSA0IDEzIDEzIDE0IDQgNyAxMiA2IDQgOCAyIDkgOSAxMyAxMyAzIDMgNiA3IDE2IDcgNiAxNSA1IDggMTUgNiAxNSBeCiszMCAxIDYgMTYgMTUgMTEgMTQgMTQgNCA3IDEwIDMgNCAxMCAzIDYgNyAxNCA0IDYgNiA1IDIgNyA4IDE2IDIgMTIgMTYgMTAgMTQgNyBeCiszNiAxIDIgMyA3IDE0IDYgOSA0IDQgNSA5IDcgMTIgMyA5IDIgNSAxIDMgMTAgMTEgMTEgNiAxMiA3IDEgNyAxMiAyIDEgMiA4IDEyIDE1IAorMTYgOSAxMyBeCiszNCAxIDYgMyAxMiAxMSAxNiAxNSA4IDggOCAxNCAxMyA3IDcgOCAyIDcgNiAyIDIgMTQgNyAxIDQgMiA0IDExIDExIDUgNyAyIDEyIDEgCisxNCAxMSBeCisyOSAwIDEyIDExIDIgOSA4IDUgNiAxNCAxMCAxMiA1IDExIDUgMyAxIDEzIDE1IDkgMTIgMTEgMTMgNCAxNCA1IDE2IDMgNSAxMyAxNSBeCiszMCAxIDUgMTYgMTEgMiA2IDEzIDE2IDMgNiA0IDkgMTAgOSA4IDYgMTQgOCA5IDUgMTMgNiA1IDE0IDIgOCAxNSA4IDcgMTQgMTEgXgorMjggMSAxNCAxMCAxMyAxMyAxMSAxMCAxMyA5IDggNCAxMSAxNCAxMSA2IDEwIDEwIDEgOSAxMyAxNiA1IDMgNCA3IDkgMTIgMTAgOCBeCiszNiAxIDEwIDE1IDEyIDggOCAxMCAxMyA1IDYgMTEgNCA2IDIgMyA1IDYgMTEgMSAxIDggNiAxMyAxNSA2IDMgMTUgNSAxMCAxIDYgMiA1IAorMiAxMSAxMCAxMCBeCiszMSAxIDQgMTQgNyAyIDE0IDMgMSAxMiA3IDE1IDEzIDEgNSA5IDggMyAzIDE0IDEyIDEzIDIgMTUgMTIgNyAxNiAxMiAzIDggMTEgNSAKKzE1IF4KKzM0IDAgMTAgMiAxMCAxNiA0IDE2IDcgOCAxIDE2IDYgMTQgOSA1IDEyIDE2IDggOSA0IDQgNCAxIDcgMTMgMTAgMSA3IDEwIDUgNyA0IDEgCis1IDE1IF4KKzMwIDAgMTYgMyA4IDcgMyA4IDggMTEgOCAxMyA0IDE2IDggMTYgMSA0IDE2IDExIDQgMTIgMSAxNCA1IDEgMTYgMTEgOCAxNCAxMiA5IF4KKzMzIDAgNyA5IDkgMTYgMTEgNyA2IDEgMTEgMTQgMTIgMTQgMTAgOSAxMSA4IDExIDcgNSAxMCAxNSAyIDYgOSAzIDkgNCAyIDEgMSA5IAorMTQgNiBeCiszMiAwIDUgOCAxNCAxNSA0IDEgNiAxIDEwIDggMSAxNSAxNSAzIDEwIDcgOCAxMCAxMiA0IDMgMTEgMTUgOCA1IDMgMyAxNiAxNSA3IDE0IAorMTMgXgorMzYgMCAzIDEwIDEyIDIgMTEgOSAyIDEgNCAzIDggMTAgMTQgMiAxMSAzIDIgNCAxNSAxNCA1IDIgOCAxNiAxNiAxIDUgNyA1IDkgNSAxNSAKKzkgMTEgMyAxNCBeCiszMSAxIDUgNCAxNCA0IDggMyAzIDEgMTAgNCAxNSAxNSAxMyAyIDEzIDkgNyAxMyAxMSA5IDEgMTUgMTUgMTUgMTYgNyA3IDYgNSAxMyA5IAorXgorMzAgMCAxNCAxNiAxMiAxIDExIDExIDcgMyA3IDMgMyAxMyA0IDEzIDE0IDUgMTUgMTIgNSAxNCAxNiAxNCA0IDUgOSA2IDYgMyAxNiAxMSAKK14KKzI4IDEgMTAgMTYgMTAgMTQgMTMgNiAxNiAxNCAzIDE0IDE1IDcgMTMgMTIgNCAxIDggNCAxMCA2IDEgMTMgNiAxNCAxMSAzIDE2IDE0IF4KKzMzIDAgMTUgMTEgMTMgOCAxMSAxIDE1IDIgMTAgOSA5IDE0IDggMTMgMiAxMyA4IDEgMiAxIDMgMTIgOCA1IDQgMTEgMTAgMTQgOCA5IDQgCis1IDE2IF4KKzM0IDEgMTIgMTIgNiA3IDEzIDEzIDEyIDEgMTMgMTQgMSAxIDYgMyAxMyAyIDE2IDMgMSAxNiA5IDkgMTUgMyAxMyAxIDggMyAyIDYgMTIgCis4IDkgMTMgXgorMjcgMCAxMSAxMiAxNSAxNCAxMiAxMCA4IDE1IDkgMTUgMiA3IDUgMTEgOCA5IDcgMTYgNiAxNSA0IDE1IDcgMTEgMTUgNCAxNCBeCisyOSAxIDkgMSAxNCA3IDQgMTQgMTYgMTEgMTAgMTEgMTIgMTQgNiAxMiAxMSAxNSA3IDE0IDMgMTUgNiAxIDEyIDUgMTIgMTMgMyA2IDE0IAorXgorMjggMCA2IDEwIDcgNyA5IDEwIDcgMTEgMTIgMTYgOSA2IDkgMTQgMTAgMTAgMiA3IDQgMTUgMTYgMTMgMTEgOCAxMCAxNSAxMCAxNSBeCiszMiAxIDggMTIgMSAxMCAzIDcgMTUgMTQgOSAxNiAxNCAxIDE1IDMgMTQgOSAyIDIgMTIgMTQgNyAzIDUgMTQgNSAxNSAxMCAyIDE0IDEgCisxNSA4IF4KKzMzIDAgOSAxNiAxMCAxNiA2IDEzIDEgNiAyIDggMTMgNSA3IDIgMTUgMTEgMTIgNiA4IDcgMSA1IDggMTMgOSA0IDggMTIgOSAxNSAxIAorMTAgMTMgXgorMzAgMCAxMCA0IDE2IDQgMTMgMTIgMiA0IDE0IDYgMTEgMyAxNSA4IDQgMTIgMyAxMSAxNiAxNiAxNiAyIDEzIDcgMTAgMiAxMyAxMCAxNSAKKzEwIF4KKzMzIDEgMTYgMiAxNSAxMCA0IDEgMTMgMTIgMTIgOSAxMiA3IDE2IDQgMTIgNCAyIDE2IDQgOSAxNiA4IDIgNiAxNSAyIDMgNCA5IDEyIDYgCis4IDEyIF4KKzM0IDEgMTMgMTEgMTEgNCA5IDEzIDE0IDIgOSA2IDggNiAxMCAxMSA5IDMgMTIgOSAxMyA0IDEwIDMgNSAxIDE0IDExIDExIDE2IDEgMiAKKzIgMTEgNiAxNCBeCiszMyAxIDE1IDEyIDYgNSAxNiAyIDE0IDIgMTAgMTIgMiA1IDUgNiAxMCAxMyAxMiAzIDEwIDggMTYgOSA1IDEyIDE1IDQgMTEgMTMgMyA2IAorNSAxMCA4IF4KKzM1IDEgMSAzIDkgMyAxMSAxIDIgMTYgMTIgMTAgNiAxIDkgMSAxNiA1IDYgMTUgMSAxMiA0IDQgMiAxNSAxMyAxNSAxMSAxNSA1IDExIDkgCis3IDE1IDE2IDQgXgorMzYgMCAxNiAxMiAzIDIgMTAgMTYgNSA1IDcgMSA3IDExIDEzIDcgOSAxMSAyIDUgNSA1IDQgMTMgMTMgMTQgNCA3IDEyIDYgNCA4IDIgOSAKKzkgMTMgMTMgNCBeCiszNSAwIDMgNiA3IDE2IDcgNiAxNSA1IDggMTUgNiA0IDYgMTYgMTUgMTEgMTQgMTQgNCA3IDEwIDMgNCAxMCAzIDYgNyAxNCA0IDYgNiA1IAorMiA3IDE2IF4KKzMxIDAgNyA0IDggMTcgMTYgMTYgMTEgMTQgMiAxMCAxNCAxNSAxMCA5IDEgMTQgMTAgMTQgNiA2IDE2IDMgMiAzIDggMyAxMiA4IDExIAorMTcgMiBeCiszMCAxIDkgNyAxNiAxNCA0IDExIDE1IDUgMTMgOSA1IDEyIDE3IDE3IDEzIDggMiA2IDggMTYgMSAxMiA1IDE3IDIgOSA4IDEwIDEzIDYgXgorMjcgMCAxMSAxNyAxMiA1IDE0IDkgMTEgOSAxMSA0IDExIDEzIDE2IDYgMTAgNSA4IDMgMTcgMTYgMTQgMSAxNSAxNSAxNSA2IDE3IF4KKzI5IDEgMiAxMSA2IDEzIDExIDEzIDQgNiA3IDExIDExIDEyIDE2IDEzIDEgMTYgMTYgMTQgMTYgMiA0IDE2IDExIDYgMTUgNyA0IDE3IAorMTEgXgorMzIgMCA1IDcgNiAzIDE0IDE2IDUgMTcgMTEgMTMgMSAxIDE0IDEzIDMgNiAxNCA1IDE3IDUgNCA4IDE0IDMgMTYgNyAxMyA0IDE0IDggOSAKKzE3IF4KKzMxIDEgOCAxMiA4IDE1IDkgNiA2IDEgNSAxMyAxNiA1IDggNCA2IDEwIDYgMTEgMTYgMTcgMTUgMTUgMTIgNCAxMyA1IDMgNCAxMCAxNSAKKzE2IF4KKzMzIDAgNyAxNSAxNiAxMiAxMiAxMSA4IDEzIDE0IDUgOCAxIDExIDEwIDkgMyAxNCAzIDEgOSA2IDE1IDEyIDE2IDQgNSA5IDcgMSA5IDQgCis4IDE3IF4KKzM2IDEgNyA5IDE2IDExIDExIDYgMTMgNyAxIDcgOCAxIDE0IDEyIDIgNyA0IDUgMTUgMTYgMTIgMyAxIDYgMTEgNCAxNSA4IDkgOSAyIDEgCisxMyAyIDE0IDE0IF4KKzI5IDEgNiA4IDggMTUgMTMgMTMgMTAgMiAxNiAxMiAxNyA2IDcgMTQgMTMgMTIgMTMgMyAxNCAxMiAxMiAyIDE1IDIgNSAxNSAxMCA3IAorMTUgXgorMzggMSA1IDE1IDcgOCAxMCAxMCAxIDExIDIgNCAzIDExIDExIDMgNSAyIDMgMTEgNSAxMiAxMiA4IDYgMiAxNyAxNSA2IDE2IDE1IDQgMyAKKzE0IDYgMyAyIDEwIDUgMTUgXgorMzAgMCAxMiAxMSAxNSAxNCAyIDE2IDE0IDcgNiAxNSA5IDMgMTEgOCA4IDUgMTYgMiAxNiAyIDE2IDYgOSA2IDEyIDEwIDE2IDcgMTUgCisxMCBeCiszNiAwIDExIDUgMyAxNiAxIDE1IDcgMTAgMTcgMTAgMTAgMTMgMiAyIDE3IDYgMiA1IDYgNiAxMCAxMiAyIDkgMTEgMTIgNiAxIDEgOCAKKzEyIDIgNiAxNiAxMiAxNiBeCiszMCAxIDEwIDE3IDUgMSA2IDE0IDE3IDggMTIgMTAgMTEgMTYgMTUgMSA4IDMgOSAxMyA3IDcgMTYgOCAxMyAxMSAxMCA4IDE1IDMgMTUgCisxMiBeCiszMSAxIDE0IDggNCAxMiAxIDYgNSAxMyAxNSAzIDUgMTEgMTQgMTEgMTQgMTcgNSAxMCAxNyA3IDggMTMgNSAxMiAxNSAzIDYgMTcgNyAKKzE3IDcgXgorMzEgMCAxMiAzIDEwIDEwIDQgMTMgMTMgOCAxMSAxMyA3IDE3IDExIDEgMTAgMSA1IDExIDExIDkgMTQgMTMgMTUgOCAxNCAyIDcgMTYgCisxMSA4IDE1IF4KKzMyIDEgNyAxNiAxNyAxNyA0IDEgMTMgMTUgNSAxIDUgNiAxNCAxNSAxIDUgMSA5IDkgMTcgMTIgMTMgMTIgNyAxMiAzIDcgMTUgNCAxNiAKKzEyIDEzIF4KKzM2IDAgOCAxNyAxIDExIDQgMTAgMiA2IDEwIDMgMTYgMTYgMiA3IDEzIDkgMTUgNyAxNyAxNCAzIDEwIDE2IDEzIDYgNyA1IDIgMSA0IAorMTYgMyAxMCAxIDE1IDUgXgorMzIgMCA0IDYgNCAxNSAxMSA0IDIgMTcgOSAxNSA1IDEwIDcgMTIgMTUgMTYgMTUgMTcgMTIgMTQgOSAyIDEzIDQgOSAyIDQgMTUgMiAxMSAKKzkgMTYgXgorMjkgMCA0IDQgMyAxNyAyIDE0IDE3IDE3IDEgMTcgMTMgMTEgMTUgMTcgNCA5IDE1IDggMTEgMTYgOSAxMCA4IDkgMTIgMTUgMSAxNyAxMSAKK14KKzM1IDAgMTYgNCAyIDE0IDE0IDE1IDEgMiAxMiA5IDEgMTAgMTYgMTAgMTEgNyAxIDEyIDE3IDggMiAxNSAxMSAxIDcgMTcgMTIgNyAzIDcgCis2IDkgOSAxNCA2IF4KKzM2IDAgMiAxNSAxNyAxMCAxMSA5IDUgOSA0IDE3IDE2IDMgMTEgMiAxMCAxMiAxMSA1IDMgOCAxNyAxNSAzIDMgNCA3IDIgMSAxMCA3IAorMTQgNCAxNiA2IDEyIDggXgorMzYgMSAxMiAxNCA2IDkgMyAxNyAxMSAxMCA2IDggMTQgNiAxMSA3IDEwIDggNiAxNyA0IDQgOSA4IDIgOCAxNCA4IDcgMTQgMSAzIDYgOCAKKzExIDEwIDE3IDEgXgorMzkgMSAxMiAxNCA5IDQgMTEgNyA2IDYgMTMgMTQgMiAxMyAxIDE0IDkgNyA3IDE1IDIgMiA1IDE1IDEzIDE3IDMgMTUgMTYgOSAxIDEgMiAKKzMgMiAxMiAxIDMgMyAxMyA5IF4KKzM0IDAgMTMgMTAgMTUgNSA4IDEwIDE1IDEwIDggNyA1IDUgMTQgNCAxMyAxMSAxMiA0IDQgMTIgMTAgMTMgMTIgNCAxMCAzIDMgNyA5IAorMTMgMTYgOSAxNyAxIF4KKzM2IDAgNCAxMiAxIDkgMTIgMTMgNSAxMCAxIDMgMTUgNCAxIDEzIDE3IDEgOCA5IDYgMTIgNCA3IDcgMTAgMTcgMTMgMTcgNiAxNyA5IDYgCis5IDMgNSAxNyAxMCBeCiszNCAwIDEgNCAxMCAxMiAxNyAxNCAxMSA4IDUgMTYgNSA1IDIgMTMgMTMgMTYgOSAxMyAxMCA5IDkgNSAzIDEzIDYgNCAzIDkgMTUgMTQgCisxNCA3IDMgMTYgXgorMzggMSA5IDE3IDMgNiA1IDE2IDEwIDE0IDkgMSAxNiA3IDMgNSA0IDE3IDE0IDcgMTIgNiAyIDggOCAxNyA3IDIgNCA1IDcgMTIgMiAxIAorNyAxMSAzIDE0IDkgMTUgXgorNDEgMCAyIDEyIDMgNCAxIDQgMSAxNiAxMCA1IDE2IDggNyAyIDEwIDMgNSA5IDE2IDggMTYgMTMgMyAxMiA1IDUgMTEgMiAyIDcgNCAyIAorOCAxNiA0IDE0IDUgMTQgMTAgNCAxNyBeCiszNiAwIDYgMSAyIDcgMSAxNSAxMyAxIDE3IDQgNyA0IDggMTcgMTYgMTYgMTEgMTQgMiAxMCAxNCAxNSAxMCA5IDEgMTQgMTAgMTQgNiA2IAorMTYgMyAyIDMgOCAxNCBeCiszMiAxIDEyIDggMTEgMTcgMyA5IDcgMTYgMTQgNCAxMSAxNSA1IDEzIDkgNSAxMiAxNyAxNyAxMyA4IDIgNiA4IDE2IDEgMTIgNSAxNyAyIAorOSAxNCBeCisyOSAwIDEwIDEzIDE0IDExIDE3IDEyIDUgMTQgOSAxMSA5IDExIDQgMTEgMTMgMTYgNiAxMCA1IDggMyAxNyAxNiAxNCAxIDE1IDE1IDE1IAorMTQgXgorMzIgMCAxMyAyIDExIDYgMTMgMTEgMTMgNCA2IDcgMTEgMTEgMTIgMTYgMTMgMSAxNiAxNiAxNCAxNiAyIDQgMTYgMTEgNiAxNSA3IDQgCisxNyA2IDUgMTUgXgorMzUgMSA2IDMgMTQgMTYgNSAxNyAxMSAxMyAxIDEgMTQgMTMgMyA2IDE0IDUgMTcgNSA0IDggMTQgMyAxNiA3IDEzIDQgMTQgOCA5IDMgOCAKKzEyIDggMTUgMTEgXgorMzMgMSA2IDYgMSA1IDEzIDE2IDUgOCA0IDYgMTAgNiAxMSAxNiAxNyAxNSAxNSAxMiA0IDEzIDUgMyA0IDEwIDE1IDEyIDcgMTUgMTYgCisxMiAxMiAxMSAxMSBeCis0MCAwIDEzIDE0IDUgOCAxIDExIDEwIDkgMyAxNCAzIDEgOSA2IDE1IDEyIDE2IDQgNSA5IDcgMSA5IDQgOCA1IDcgOSAxNiAxMSAxMSA2IAorMTMgNyAxIDcgOCAxIDE0IDEwIF4KKzM0IDAgMiAxMCAxNSAxMCAxNCA4IDE4IDkgOSAxMiAxMiAzIDEzIDEyIDYgNCA5IDE3IDEzIDEzIDUgNyAzIDIgMSAxNyAxNCA0IDE2IDYgCisxMyAxIDEzIDEzIF4KKzM1IDEgNiAxMCAxIDMgMTggMyAxMSA3IDkgNSA3IDExIDE3IDEgOSAxNiA1IDE1IDEwIDE3IDMgOCAxNSAxNyA4IDE1IDExIDMgMTUgMTcgCisxMSAxIDEgNCAxNSBeCiszNiAxIDE0IDE4IDQgMiAxOCA4IDE1IDYgNCA2IDMgMTUgMTEgMTYgMTAgMTcgMTcgOSA2IDMgMiA2IDE2IDQgOSAxMiA2IDggMSAxMSAzIAorMiAxMiAyIDE0IDE2IF4KKzM3IDAgNCAxIDUgMTEgMTYgMTggMTYgOCAxMSAxNSAyIDE4IDcgNSAxNCA1IDE1IDEzIDMgMyA1IDQgMyAxMSA0IDQgNSAxMCAzIDEyIAorMTcgMSA0IDE3IDEwIDEwIDE3IF4KKzM1IDAgMSAzIDQgMiAxIDEyIDUgMTQgMTEgMTAgNCA2IDE0IDkgMSA1IDggMiA5IDE1IDEyIDEzIDcgMTYgMiAxMyAxNyAxNSA5IDE4IAorMTUgOSAxMyAxNiAxNyBeCiszNCAxIDE4IDEwIDQgMTEgMTMgOSA2IDEgMTcgNiA4IDYgNSAxMSA1IDE0IDE2IDkgMTMgMTEgMTAgOSAxNSA0IDE0IDcgMTQgMyAxIDE1IAorNSA1IDE4IDE2IF4KKzM0IDAgMTMgOCAxMyAxNiA1IDE3IDUgMTAgMSA4IDggMTIgNiAxMyAxOCA5IDYgMTcgMyAxNiAyIDggOSA4IDcgMiAxNCAxNCA4IDEwIAorMTMgOSAxMSAxMSBeCis0MCAwIDcgMTEgNCA2IDkgMTAgMTEgMTIgMiAxNCAxIDEzIDEgNyAxIDE1IDcgOSA4IDIgMSA0IDkgMTQgMTcgOCAxNyAxNSAzIDQgMTUgCisxNSAyIDIgMyAxNiAxMyAyIDkgMTIgXgorMzMgMCAxNCA2IDYgNSAyIDEzIDQgMTYgMTEgMyAxMCAxOCAyIDE1IDUgOSA0IDggNCAxOCAxOCAxNyAxOCAzIDE0IDEyIDkgMTEgMTUgCisxNiAxIDkgMTYgXgorMzIgMSAxOCA1IDEwIDYgNyAxNyA3IDEyIDMgMTMgOCAxMiAzIDggOSAzIDE3IDEyIDggMTggNiAxNCAzIDYgMTQgMTQgMTAgMTQgMTMgCisxNyAxOCA4IF4KKzM2IDEgMTggMTIgMTcgOSAxNyAyIDEyIDUgOSAxMiAxIDE4IDEwIDUgNSAyIDE4IDMgNiAxNiAxOCAzIDEgMiAxMCAxNSAyIDUgOCAxNiAKKzEwIDE0IDMgOSA4IDEzIF4KKzMzIDEgMTYgMTQgMSAxNiAxNSAxNiAxNyA0IDEyIDEyIDE2IDUgMyA5IDE0IDUgNyAxNyAxMiAxMSAxMiAxOCAxNCAyIDcgNyAxNSA4IDMgCis1IDEgOCAxMyBeCiszNCAxIDcgNiA3IDE0IDkgMTUgMTUgMTggMTYgMyAxMCA1IDE2IDYgOCAxMSA0IDEgMTAgMSAxNiA0IDEyIDE3IDE1IDE0IDggNSA0IDYgCis0IDE3IDE2IDE2IF4KKzM4IDAgNCA1IDE4IDE4IDEyIDkgMyA5IDYgOSA3IDYgMTAgMTUgNCA5IDE3IDUgMTcgNSA2IDEgNiAyIDggMTcgNyA3IDQgNCAxMyAxNiAKKzMgNCAxMCAxNiAxMiAxMyBeCiszMyAwIDE2IDcgMTggMyAzIDExIDkgMTMgMTQgMTUgMTggMiAxMiAxMCAzIDE1IDMgMSAxMCA2IDE1IDEzIDE3IDEzIDUgOSA3IDExIDkgCis1IDE4IDE1IDEyIF4KKzMzIDEgMTYgMTEgMSA2IDE4IDEzIDggMSAxOCA4IDEgNSAxMyAxIDE4IDUgMTUgMTUgMTYgMTIgMTMgMiAxNyAxMiAxNCAxNyA4IDEgMTAgCisxMiAxMCA0IDE4IF4KKzM0IDAgNSA2IDE4IDE4IDcgMTAgMTMgMTQgMTAgMTIgNyA0IDEwIDggMTYgMTYgMTUgNSAxMyAxNCA0IDE0IDIgNCAxMiA2IDExIDUgMTcgCis4IDUgMSAxNCAxNiBeCiszMSAxIDE3IDkgMTEgMiAxMSAxMSAzIDEzIDEzIDExIDEyIDEzIDUgMTIgMTIgMTEgNiAxMyA0IDE4IDE1IDEyIDE4IDYgNiA3IDE1IDEzIAorMTIgMTQgMTYgXgorMzggMSA0IDExIDIgNSA2IDEyIDEwIDIgNyAxNSAxMSA4IDE0IDcgMTYgMTYgMSA0IDMgOSAxNCAxNiAzIDE4IDEgNyAxNyAxIDcgMyAxNiAKKzE3IDYgMTYgMTIgNSAzIDE3IF4KKzQwIDEgMTAgMTUgMTggMTAgOCAxMCAyIDUgMTEgMiA3IDMgNSA2IDcgMSAxMiAyIDkgMiA0IDE1IDEgMTEgMTEgMTcgMyAzIDE2IDggMyAKKzExIDE4IDE2IDExIDYgMTUgOCA4IDEzIF4KKzQwIDEgMTAgMyAxNyA3IDEwIDE4IDEzIDE0IDggNyA4IDE0IDIgMiA4IDYgMyA3IDUgNiA5IDUgMTIgMTAgNyA2IDUgMTYgNCAxNCAyIAorMTUgMyAxNSA5IDE1IDEgOSA3IDEyIF4KKzM1IDAgMTQgMTUgMTIgNyAyIDE2IDE4IDggMTggMSAxMyAxMiAxIDEgMTQgMTQgMTMgMyAxNCA3IDIgMTAgMTAgMTEgMTQgMyAxMiA1IAorMTMgNiAxNyAxNCAxIDExIDEzIF4KKzM0IDAgNyAxMiA4IDEyIDE3IDE3IDE4IDE3IDEzIDIgNCA3IDUgMSAxNSA3IDE0IDE3IDExIDYgMTAgOSAxOCA5IDE0IDEzIDMgOCA0IAorMTMgOCA3IDEzIDcgXgorMzUgMCA0IDE2IDggMTcgMTAgMiAxMyAxMCAyIDIgNiAyIDMgMTggMTcgMiAxNyA0IDE4IDcgMTYgMTggMTQgNCAxMSA3IDQgMTUgMTcgNiAKKzExIDExIDE0IDE3IDQgXgorMzcgMCAxMCAxNyAxNiAxMyAxNSAxNCA2IDEgMTQgMTEgOCAxNiA2IDIgMTYgMTMgNyA4IDYgMiAxNSAxIDkgMTIgNCA0IDExIDEzIDcgMiAKKzExIDkgMTggNCA1IDQgMTggXgorMzkgMCAyIDE0IDkgOSAxIDggMTMgMTEgMTUgOCA1IDkgMTAgMTYgOSAyIDcgMSAxIDE3IDEzIDYgMTEgMTAgOCA1IDEyIDE1IDYgMTUgCisxMCAxMiA0IDE4IDEgMiA4IDExIDE1IF4KKzMyIDEgMTYgMTAgMTIgMTggMTEgMTYgMTIgMTEgMTcgMTcgNCA3IDEzIDcgMTAgNyAxMCA2IDEgMTIgNyAxOCAxMSAxOCAyIDEwIDE1IAorMTAgMTQgOCAxOCAyIF4KKzQwIDEgOSAxMiAxMiAzIDEzIDEyIDYgNCA5IDE3IDEzIDEzIDUgNyAzIDIgMSAxNyAxNCA0IDE2IDYgMTMgMSAxMyA2IDYgMTAgMSAzIAorMTggMyAxMSA3IDkgNSA3IDExIDE3IDEyIF4KKzM2IDEgOSAxNiA1IDE1IDEwIDE3IDMgOCAxNSAxNyA4IDE1IDExIDMgMTUgMTcgMTEgMSAxIDQgMyAxNCAxOCA0IDIgMTggOCAxNSA2IDQgCis2IDMgMTUgMTEgMTYgOCBeCiszOSAxIDE3IDE3IDkgNiAzIDIgNiAxNiA0IDkgMTIgNiA4IDEgMTEgMyAyIDEyIDIgMTQgMTIgNCAxIDUgMTEgMTYgMTggMTYgOCAxMSAKKzE1IDIgMTggNyA1IDE0IDUgMTUgMTAgXgorNDcgMSAzIDMgNSA0IDMgMTEgNCA0IDUgMTAgMyAxMiAxNyAxIDQgMTcgMTAgMTAgOSAxIDMgNCAyIDEgMTIgNSAxNCAxMSAxMCA0IDYgCisxNCA5IDEgNSA4IDIgOSAxNSAxMiAxMyA3IDE2IDIgMTMgMTcgMyBeCiszNCAxIDkgMTggMTUgOSAxMyAxNiAxOCAxMCA0IDExIDEzIDkgNiAxIDE3IDYgOCA2IDUgMTEgNSAxNCAxNiA5IDEzIDExIDEwIDkgMTUgCis0IDE0IDcgMTQgOSBeCiszNyAxIDEgMTUgNSA1IDE4IDEzIDEzIDggMTMgMTYgNSAxNyA1IDEwIDEgOCA4IDEyIDYgMTMgMTggOSA2IDE3IDMgMTYgMiA4IDkgOCA3IAorMiAxNCAxNCA4IDEwIDEzIF4KKzQyIDAgOSAxMSAxMCA3IDExIDQgNiA5IDEwIDExIDEyIDIgMTQgMSAxMyAxIDcgMSAxNSA3IDkgOCAyIDEgNCA5IDE0IDE3IDggMTcgMTUgCiszIDQgMTUgMTUgMiAyIDMgMTYgMTMgMiAxNyBeCiszNiAwIDE2IDE0IDYgNiA1IDIgMTMgNCAxNiAxMSAzIDEwIDE4IDIgMTUgNSA5IDQgOCA0IDE4IDE4IDE3IDE4IDMgMTQgMTIgOSAxMSAKKzE1IDE2IDEgOSAyIDE4IDYgXgorMzMgMSAxMCA2IDcgMTcgNyAxMiAzIDEzIDggMTIgMyA4IDkgMyAxNyAxMiA4IDE4IDYgMTQgMyA2IDE0IDE0IDEwIDE0IDEzIDE3IDE4IAorMTQgMTggMTIgMTMgXgorMzkgMSA5IDE3IDIgMTIgNSA5IDEyIDEgMTggMTAgNSA1IDIgMTggMyA2IDE2IDE4IDMgMSAyIDEwIDE1IDIgNSA4IDE2IDEwIDE0IDMgOSAKKzggMTAgMTYgMTQgMSAxNiAxNSAxNCBeCiszMCAxIDE3IDE5IDUgNyAxNCA0IDExIDMgNiAxOCAxMyA3IDE4IDE4IDE5IDE5IDEzIDkgMTAgMTkgMTQgMTIgNCAxNSAxNSAxOCAyIDEwIAorNyAxNSBeCiszNCAxIDIgMTMgOCAxOSAxNSAxIDExIDE0IDcgNyAxNyA2IDE2IDQgMTYgMTcgMiAxOCAxMiA1IDE0IDE5IDE3IDEgOCAxMiA2IDYgNiAKKzE5IDEzIDEwIDE2IDUgXgorMzYgMSAxNCAxMyA2IDE2IDE0IDE1IDQgMTMgMTUgNCA0IDExIDQgMTAgMyAxNyA0IDE5IDYgMTcgMTQgMyAyIDE2IDEgMTQgMTYgNSAxNyAKKzggMSAxIDE5IDEzIDEyIDEyIF4KKzM0IDAgMTcgMTEgMTMgNSAxOSAxMSAxOCAxOSAxIDMgMTIgMTEgOCA0IDExIDEzIDE3IDMgOCA5IDQgNSAxMiAxNSAxMiA2IDcgMTYgMTYgCisxMiAxIDEzIDE3IDE1IF4KKzQwIDAgMTggOSAzIDE2IDIgMTYgNCAxOSA2IDYgMTggMyAxMyAxIDUgMyAyIDYgMTUgMTEgNiA0IDE0IDE1IDE1IDkgMTMgOCAxIDkgMTUgCisyIDcgNSAxMSA1IDEyIDcgMTYgMTUgXgorMzcgMCAxOCA0IDMgMSA0IDExIDE1IDcgNiA5IDEgMTQgNyAxIDE3IDE3IDE2IDE0IDEzIDE0IDEyIDE0IDkgMTIgMTEgMTggNyAxNCAzIAorMSA2IDEgMTUgOCAxNSAxOSA5IF4KKzMyIDAgMyA5IDkgNyA3IDEwIDEyIDEzIDcgMTEgMTIgMTYgOSA5IDkgMTcgMTMgMTMgMiAxNyAxMCA0IDE4IDE3IDE5IDE2IDExIDExIAorMTMgMTggMTMgMTIgXgorMzUgMCA4IDE1IDE4IDEwIDYgMTAgMTggMTcgOSAyIDE0IDEgMTcgMTggNiAxNCAxMiA1IDUgMTUgMTcgMTAgMyA4IDggMSAxMCA1IDEgCisxOCAxOCA5IDE2IDEwIDE0IF4KKzM4IDEgNiAxNiAxIDYgMyA1IDggMTYgOCA3IDUgMTggMTEgMTUgMTcgNiAxMSAxMCA0IDggMTQgMTYgNiA3IDggMTIgMTIgMTggMSAxMCAKKzQgNyAxIDE5IDcgMTkgMTUgMTIgXgorMzQgMCAxIDE0IDYgMTEgMTggNSA0IDEyIDYgMTQgMiAxOSAyIDUgMTMgMTAgMTAgMiAxNiAxMCAxOCAxNiAxOSAyIDE1IDEwIDcgMTggCisxNiAxNyAxNSAxNSA5IDEzIF4KKzM4IDEgMTAgMTYgNCAxNSA3IDUgMTkgMSAxNSAxNiAxMSAxOSA5IDE4IDIgNCA2IDEyIDkgOCA3IDEzIDE0IDExIDQgMTIgMTMgNSA5IDYgCis1IDYgMTYgMTEgOSAzIDE1IDYgXgorNDAgMCAxNiAxIDEzIDYgOCAxOCAxMSAxMSAyIDEgMiAyIDE0IDkgMTMgMSAxNSA2IDUgMTYgMTkgMTQgMTkgNyAxOCA1IDIgMiAzIDEzIAorMTMgMTIgMTMgMTEgMiAxMiAyIDEyIDE4IDUgXgorMzUgMCA3IDggMTMgNiA5IDggMTcgMTAgMTEgMSA5IDE0IDQgMTkgMTkgMyAxNSAxMyA5IDE4IDEyIDE3IDEgMTYgOCA5IDE1IDEgMTIgNCAKKzQgMTkgMTggMTMgMTEgXgorMzYgMSAxNCAxOCA4IDE0IDkgMyA0IDE4IDE2IDkgMTkgMTIgMyAxNyA1IDEwIDE2IDUgOCA0IDQgMTAgMTQgMTMgNCA5IDExIDE5IDggOCAKKzUgMSAxMyAxNiAxNCAxMyBeCis0MSAxIDEwIDE1IDMgNCA4IDIgMTIgOSAxNiAzIDE2IDMgNiAxNyAzIDEwIDE5IDcgNiAxIDUgMTEgMTggOSA0IDYgMiAxNSAxMSAxNyAKKzE3IDE3IDQgMTAgMTMgMyA3IDEwIDMgOSAxNCBeCis0MiAwIDcgOSAzIDMgOCAxOSAxMCA4IDIgMTkgMTIgMTkgMTMgNiAxOSAzIDQgMTcgNiA5IDEgNyAyIDkgNyAxOCA2IDE1IDIgMiA0IDMgCisxMCAxMSAxMSA2IDEyIDEwIDE4IDQgMTIgMTAgXgorMzUgMSA0IDUgMTEgMTIgMTUgMTkgMTIgMTAgNiAxNSAxNCAxOSAxOCAxMSA4IDExIDE3IDE2IDcgNyAxMSAyIDEwIDYgMTkgNSAxNCA3IAorMSA3IDMgMTkgNCAxNyAxNSBeCiszNiAxIDUgMTAgMiAxOCAxIDE3IDggMTIgMTcgMiA5IDggOCAzIDE0IDEwIDE1IDIgMTQgOCAzIDEgMTYgMTggMTIgMTggMTEgMTYgNyAKKzE3IDUgMTkgMiAxOSAxMiAxOSBeCiszNyAwIDE2IDE0IDIgOSAxNiAyIDYgNiA3IDkgMTAgOSAxMSA5IDE0IDExIDE1IDUgMTYgOSAyIDE3IDIgOCAxNSA4IDQgMyAxNCAxNCAKKzE2IDE2IDEzIDExIDEwIDE2IDE0IF4KKzQwIDAgMTEgNyAxNCAxNCAxNCA2IDEwIDEwIDEgNiAxMyAxOSA1IDYgNCA3IDEyIDEyIDEwIDUgMTAgMTUgMTUgOCA1IDEzIDE3IDEzIDUgCis2IDE0IDEgOSAyIDYgNSAxNyA5IDExIDEzIF4KKzM4IDAgMTggOCA2IDEzIDE1IDMgMyAxNSA1IDEzIDE4IDMgMiA1IDUgMTQgNyAxMyA0IDE3IDcgMiAxNyAzIDE4IDE1IDcgMTUgMTYgMTggCis1IDEyIDggNiAzIDE3IDEyIDEzIF4KKzM4IDEgMTkgMTUgOSA3IDE3IDE2IDE1IDMgMTEgMTEgNSAyIDEzIDE5IDE2IDIgNCAxNiA3IDggMSAyIDkgMTcgMTIgMyA1IDE4IDE5IAorMTEgMTcgOSAxIDQgMSAxOCAxMCAxMCBeCis0MSAxIDEzIDEgNyAxMyA1IDcgNCAxIDggMTMgMTYgMyA1IDcgNiA4IDggMTQgOCAxMyA3IDE5IDggMTYgMTggNCAyIDggNyAxMiA0IDE0IAorNSAxIDMgMTkgMTcgMTEgMTQgMTUgMTkgXgorMzkgMCAxMCA5IDEyIDE5IDExIDEwIDMgMTggMTQgMTcgMTggMTcgNyAxMiAxNCA4IDExIDcgMiAxMCAxNyAxNSA1IDMgMTIgMyAxMiAxIAorMiAxIDEgMTIgMTQgMTAgMiA4IDE3IDE4IDIgXgorNDUgMSA0IDkgNCAxNiA1IDE4IDEgMSAxMCAxMCAxMSAzIDEwIDEyIDEgMyAxMSAxIDExIDUgMyAzIDE2IDE1IDEwIDE3IDE0IDE1IDYgCisxMyAxMiAyIDMgMTQgMyA5IDE5IDQgNCA4IDEwIDE0IDUgMTEgOSBeCiszNSAwIDIgNyAxNSAxNCA4IDIgMTEgMTkgMTkgNCA1IDEwIDggOSA1IDE1IDkgMTcgMTkgNSA3IDE0IDQgMTEgMyA2IDE4IDEzIDcgMTggCisxOCAxOSAxOSAxMyAxMyBeCiszNSAxIDEwIDE5IDE0IDEyIDQgMTUgMTUgMTggMiAxMCA3IDkgMiAxMyA4IDE5IDE1IDEgMTEgMTQgNyA3IDE3IDYgMTYgNCAxNiAxNyAyIAorMTggMTIgNSAxNCAxOSA5IF4KKzM4IDEgMSA4IDEyIDYgNiA2IDE5IDEzIDEwIDE2IDEzIDE0IDEzIDYgMTYgMTQgMTUgNCAxMyAxNSA0IDQgMTEgNCAxMCAzIDE3IDQgMTkgCis2IDE3IDE0IDMgMiAxNiAxIDE0IDE5IF4KKzM4IDAgNSAxNyA4IDEgMSAxOSAxMyAxMiAxMiAxNyAxMSAxMyA1IDE5IDExIDE4IDE5IDEgMyAxMiAxMSA4IDQgMTEgMTMgMTcgMyA4IDkgCis0IDUgMTIgMTUgMTIgNiA3IDE2IDExIF4KKzQzIDAgMTIgMSAxMyAxNyA0IDE4IDkgMyAxNiAyIDE2IDQgMTkgNiA2IDE4IDMgMTMgMSA1IDMgMiA2IDE1IDExIDYgNCAxNCAxNSAxNSAKKzkgMTMgOCAxIDkgMTUgMiA3IDUgMTEgNSAxMiAxNiBeCiszOSAxIDE2IDYgMTggNCAzIDEgNCAxMSAxNSA3IDYgOSAxIDE0IDcgMSAxNyAxNyAxNiAxNCAxMyAxNCAxMiAxNCA5IDEyIDExIDE4IDcgCisxNCAzIDEgNiAxIDE1IDggMTUgMTkgMTIgXgorMzUgMCAzIDkgOSA3IDcgMTAgMTIgMTMgNyAxMSAxMiAxNiA5IDkgOSAxNyAxMyAxMyAyIDE3IDEwIDQgMTggMTcgMTkgMTYgMTEgMTEgCisxMyAxOCAxMyA4IDggMTUgNiBeCis0MCAwIDEwIDYgMTAgMTggMTcgOSAyIDE0IDEgMTcgMTggNiAxNCAxMiA1IDUgMTUgMTcgMTAgMyA4IDggMSAxMCA1IDEgMTggMTggOSAKKzE2IDEwIDE5IDYgMTYgMSA2IDMgNSA4IDE2IF4KKzQwIDAgOCA3IDUgMTggMTEgMTUgMTcgNiAxMSAxMCA0IDggMTQgMTYgNiA3IDggMTIgMTIgMTggMSAxMCA0IDcgMSAxOSA3IDE5IDE1IDIgCisxIDE0IDYgMTEgMTggNSA0IDEyIDYgMTkgXgorMzUgMCAyIDE5IDIgNSAxMyAxMCAxMCAyIDE2IDEwIDE4IDE2IDE5IDIgMTUgMTAgNyAxOCAxNiAxNyAxNSAxNSA5IDE1IDEwIDE2IDQgCisxNSA3IDUgMTkgMSAxNSAxNiA2IF4KKzQzIDEgMTkgOSAxOCAyIDQgNiAxMiA5IDggNyAxMyAxNCAxMSA0IDEyIDEzIDUgOSA2IDUgNiAxNiAxMSA5IDMgMTUgMTIgMTYgMSAxMyAKKzYgOCAxOCAxMSAxMSAyIDEgMiAyIDE0IDkgMTMgMTEgXgorMzkgMSAxNSA2IDUgMTYgMTkgMTQgMTkgNyAxOCA1IDIgMiAzIDEzIDEzIDEyIDEzIDExIDIgMTIgMiAxMiAxOCA3IDggMTMgNiA5IDggCisxNyAxMCAxMSAxIDkgMTQgNCAxOSAxOSAzIF4KKzM0IDEgMTUgMTMgOSAxOCAxMiAxNyAxIDE2IDggOSAxNSAxIDEyIDQgNCAxOSAxOCAxMyAxNSAxNCAxOCA4IDE0IDkgMyA0IDE4IDE2IDkgCisxOSAxMiAzIDE3IDE1IF4KKzQ1IDEgMTAgMTYgNSA4IDQgNCAxMCAxNCAxMyA0IDkgMTEgMTkgOCA4IDUgMSAxMyAxNiAxNCAxIDEwIDE1IDMgNCA4IDIgMTIgOSAxNiAKKzMgMTYgMyA2IDE3IDMgMTAgMTkgNyA2IDEgNSAxMSAxOCAyIF4KKzQzIDEgMTUgNCAxMyAxNCAzIDQgMSAzIDEgNSAxMSA0IDkgNyAyMCA4IDE1IDQgMTYgNyAxOSAxMSAxIDExIDIgMTMgMTMgMTEgMTIgMTMgCisxNSAxMiAxIDUgMTMgMyA4IDE1IDEyIDggMTYgMTYgNiBeCis0NCAwIDUgMTMgMTIgMTQgNSAzIDEgNCAxNiAxMiAyMCAxIDYgMTUgMTEgMTggNCAxNyAxNiA2IDEwIDMgMiA5IDkgMTQgNiAyIDggNiA3IAorMTAgMTcgMTIgMjAgNiA3IDUgMTYgMSA0IDIgMTcgOSBeCiszOCAwIDE1IDggMjAgMTggMjAgMTEgMTUgMTEgMTEgOSA2IDIgMTUgNSAxNyAxMiAxIDkgMSAzIDUgMTEgNyAyIDIgNiAxOCAyIDkgMTEgCis4IDE2IDExIDE2IDE1IDE4IDE4IDE4IF4KKzM1IDEgMjAgMiAxNyAxNyAxMCA4IDEzIDIwIDQgMTggNiAxOCA5IDQgMSAxIDE4IDUgMiAxNyAxNSAxNiAxOSAxNSAxIDEwIDE3IDE2IDQgCisxNiAxNCAxNCAxMSAxNSAxMCBeCiszOCAwIDUgOSAxNSAxMCA5IDE3IDE4IDE0IDE1IDEyIDYgMSAxNiA4IDE4IDggMTMgMTIgMTAgMTQgMTQgMTMgOSAyIDE0IDE3IDkgMSAKKzIwIDEwIDQgMiAxMiA5IDQgMTMgMTYgNSBeCiszNiAwIDE0IDEwIDExIDE2IDE3IDEyIDE4IDEyIDcgMTcgOCA3IDMgMSAzIDE3IDQgOSA1IDE3IDE0IDE3IDExIDUgMjAgMTkgOCAxOSAKKzE0IDEzIDIgMTggMyAzIDE4IDEzIF4KKzQxIDEgMTMgOCAxNCA2IDE4IDcgMTAgMSAxMyAxMCAxMSAxMSAxNiAxIDIgOCA3IDEgNyAxNCA4IDE3IDYgOCA0IDMgMTEgMTcgMyA1IDcgCisxNiAxMSAxMSAxNCA3IDEzIDIwIDIwIDcgMjAgXgorNDAgMSAxMyAxNSAxNCAxNiAxNCA4IDkgMTYgNSAxIDYgMyAxNyAxOCAxNiA5IDEgMTUgOSAxMCA5IDE5IDEgMyAzIDIwIDExIDEzIDE3IAorMSAxOSA4IDMgNCAzIDcgMSAxNCAxOSAxNyBeCiszNyAxIDE4IDEzIDExIDUgMTggNCAxOSAxMCA2IDE5IDExIDE3IDEwIDEwIDcgOSAxMyAxNiA5IDEwIDE4IDQgMTIgNSAxNiA1IDIwIDEyIAorMyA4IDEwIDEgMTggMSA2IDIwIDE0IF4KKzM2IDAgOCA5IDYgMTIgMTEgNyA3IDMgMTcgMTMgNiAyMCAxNyA5IDIwIDE2IDEwIDEyIDE3IDggMTEgOCAxMSAxMCA1IDEwIDE0IDE4IDggCisxOSA5IDEyIDEyIDIgMjAgMTIgXgorMzggMCAxMiAxNiAyMCAzIDkgOSAxOSAxNyAxMyAxMyA0IDE3IDIgMTEgNyAxNCAzIDYgMTYgMTMgMTAgMTMgNSAxNiAxMCAyIDggMiAxNyAKKzE5IDQgMTcgNyAxOSA2IDkgMTUgNyBeCis0MSAxIDIwIDcgMiAxOCA1IDcgMTggNSAyIDE1IDcgMTEgMTAgOSAzIDIgMTQgMTkgMyAxMSA4IDE4IDE1IDUgMyA1IDEyIDE1IDE2IDEwIAorMTcgNyAxOSAxNiAyIDEgMTYgNiAzIDE5IDEwIF4KKzQ2IDAgNSAxOCA5IDkgMTEgMiAxIDEyIDExIDE0IDEyIDE0IDEwIDQgMTEgNiA4IDE2IDcgNSAxMSAyMCA4IDE3IDQgMTQgNCAxNSAzIDIgCisyIDQgMyAyIDMgMTQgMTUgMTAgMiAxMiA3IDMgNyAyMCAyMCA1IF4KKzQxIDEgMTAgMiAzIDEgMTAgMTIgMTUgMTQgMTEgMjAgMyAxNiAxNCA5IDQgMTggMSAxOSAyMCA5IDUgMTIgMTMgNiA2IDEgOSAxMyA3IAorMTUgOSA4IDUgMTkgMyAxNiA5IDggMTAgMjAgOCBeCiszOSAxIDExIDEzIDE5IDUgNyAxNiAxOCAxNiA0IDQgNCA2IDkgMTMgMTAgMTkgMTUgMyAxNCA2IDQgMTIgMTAgMTUgMTUgNCA4IDEzIDEzIAorOSAxOCAxMyA2IDQgNyAyMCA0IDIwIDcgXgorMzEgMSAxOCAxOCAxMiAxNiAxMyAxOSAxOSA1IDcgMiA2IDExIDE4IDkgMTggNiAxMSAxNCAxNCAxOCAxMCAxMyAxOSAyMCAxNyAxMSAxNCAKKzUgMTkgMjAgMTMgXgorNDYgMSAyMCAxIDEgNCAxMyAxMCA2IDUgNiAxOSAxOCAxIDMgOSAxNCAyMCA3IDE4IDcgMTUgMiAzIDE1IDUgMSAxIDIgNiAxMyAxIDE5IAorNiAxNCAxNiA1IDE1IDExIDEzIDMgNiAxMSAyIDIwIDggMSAyMCBeCiszNyAwIDQgMjAgMTkgMyAxOCAzIDggMTkgNyA4IDEyIDE0IDEyIDE5IDExIDE1IDYgMTkgMSAxOSA0IDEwIDE2IDE3IDcgMTcgMSAyIDEzIAorMTggMTIgMiAxOCAxOSAyIDcgMTUgXgorNDIgMSA5IDE4IDggNSAxNCAyIDUgNCA0IDIwIDE0IDEzIDcgOCAxNCA4IDEgNyAxOSA5IDcgMTEgMTIgNCAxOSAxMiAxMCAxOSAyMCA0IAorNCAxIDggMiAxNiAxNiA4IDIwIDIgMSAyMCAxMyBeCiszNyAxIDEgMTUgNyA2IDIwIDEwIDE0IDkgMTIgMTkgMTggMjAgNiAxNCA2IDUgNiAxNyAxNCAxMiAxMiAxNiA0IDIgMTkgMTQgMTUgMTcgCis3IDEyIDExIDEyIDggMTQgMSAxNyA3IF4KKzM5IDAgMTUgMTggMiA0IDEwIDE4IDExIDE3IDUgOSAxNyA0IDE5IDUgNSA4IDYgMiAyMCAxNSA2IDUgMTggMTEgMyAxMCAyMCAxMCAxNiAKKzMgMTIgNyA1IDE0IDE4IDE1IDE0IDkgMTQgXgorNDQgMCAxNCA3IDYgMTUgOSAzIDQgOCA4IDEyIDE5IDIgOSAxNiAxOSA2IDE2IDIwIDUgMyAxOSA3IDQgNyA0IDUgMTAgNSAxIDE4IDcgCisxNyA2IDMgMyAxMyAxNiAyIDMgMjAgMTYgMTIgNiAxNiBeCiszOCAwIDE3IDE5IDIgMiAxMSAxOSAxMyA0IDE1IDggMSAxMiA5IDIwIDIgNSAyIDEwIDIwIDUgMTUgMTMgNyAxMyAxNSAxOSAxNyAxMSA5IAorMTUgOCAxNSAxNyA5IDYgMTYgOCAxMyBeCiszOCAxIDE4IDEwIDggOCAxMCAxNSAxMyA4IDQgNSAxNSA2IDEyIDEzIDEgMTcgMTIgNCA3IDE4IDEwIDEyIDEwIDMgMTUgMjAgNSAxOSA4IAorMTcgMjAgMTMgMTQgMTAgOSAxMiAxNyA1IF4KKzQ2IDEgMTAgMTggNiA2IDE1IDQgMTMgMTQgMyA0IDEgMyAxIDUgMTEgNCA5IDcgMjAgOCAxNSA0IDE2IDcgMTkgMTEgMSAxMSAyIDEzIAorMTMgMTEgMTIgMTMgMTUgMTIgMSA1IDEzIDMgOCAxNSAxMiA4IDE2IDYgXgorNDUgMSAxNyA1IDEzIDEyIDE0IDUgMyAxIDQgMTYgMTIgMjAgMSA2IDE1IDExIDE4IDQgMTcgMTYgNiAxMCAzIDIgOSA5IDE0IDYgMiA4IAorNiA3IDEwIDE3IDEyIDIwIDYgNyA1IDE2IDEgNCAyIDE3IDE2IF4KKzQwIDAgMTUgOCAyMCAxOCAyMCAxMSAxNSAxMSAxMSA5IDYgMiAxNSA1IDE3IDEyIDEgOSAxIDMgNSAxMSA3IDIgMiA2IDE4IDIgOSAxMSAKKzggMTYgMTEgMTYgMTUgMTggMTggMyAyMCAxOSBeCiszOCAwIDE3IDE3IDEwIDggMTMgMjAgNCAxOCA2IDE4IDkgNCAxIDEgMTggNSAyIDE3IDE1IDE2IDE5IDE1IDEgMTAgMTcgMTYgNCAxNiAKKzE0IDE0IDExIDE1IDIgNSA5IDE1IDEwIDE1IF4KKzM4IDAgMTcgMTggMTQgMTUgMTIgNiAxIDE2IDggMTggOCAxMyAxMiAxMCAxNCAxNCAxMyA5IDIgMTQgMTcgOSAxIDIwIDEwIDQgMiAxMiAKKzkgNCAxMyAxNiA3IDE0IDEwIDExIDE2IDE5IF4KKzM5IDAgMTIgMTggMTIgNyAxNyA4IDcgMyAxIDMgMTcgNCA5IDUgMTcgMTQgMTcgMTEgNSAyMCAxOSA4IDE5IDE0IDEzIDIgMTggMyAzIAorMTggMTcgMTMgOCAxNCA2IDE4IDcgMTAgMTIgXgorNDEgMCAxMyAxMCAxMSAxMSAxNiAxIDIgOCA3IDEgNyAxNCA4IDE3IDYgOCA0IDMgMTEgMTcgMyA1IDcgMTYgMTEgMTEgMTQgNyAxMyAyMCAKKzIwIDcgMTYgMTMgMTUgMTQgMTYgMTQgOCA5IDE2IF4KKzQzIDEgNSAxIDYgMyAxNyAxOCAxNiA5IDEgMTUgOSAxMCA5IDE5IDEgMyAzIDIwIDExIDEzIDE3IDEgMTkgOCAzIDQgMyA3IDEgMTQgMTkgCisxOSAxOCAxMyAxMSA1IDE4IDQgMTkgMTAgNiAxOSA0IF4KKzQxIDEgMTcgMTAgMTAgNyA5IDEzIDE2IDkgMTAgMTggNCAxMiA1IDE2IDUgMjAgMTIgMyA4IDEwIDEgMTggMSA2IDIwIDEyIDggOSA2IAorMTIgMTEgNyA3IDMgMTcgMTMgNiAyMCAxNyA5IDE1IF4KKzM3IDAgMTYgMTAgMTIgMTcgOCAxMSA4IDExIDEwIDUgMTAgMTQgMTggOCAxOSA5IDEyIDEyIDIgMjAgMTMgMTIgMTYgMjAgMyA5IDkgMTkgCisxNyAxMyAxMyA0IDE3IDIgMTEgNyAxNiBeCis0MyAwIDMgNiAxNiAxMyAxMCAxMyA1IDE2IDEwIDIgOCAyIDE3IDE5IDQgMTcgNyAxOSA2IDkgMTUgMTUgMjAgNyAyIDE4IDUgNyAxOCA1IAorMiAxNSA3IDExIDEwIDkgMyAyIDE0IDE5IDMgMTEgMTQgXgorNDMgMSAxOCAxNSA1IDMgNSAxMiAxNSAxNiAxMCAxNyA3IDE5IDE2IDIgMSAxNiA2IDMgMTkgMTIgNSAxOCA5IDkgMTEgMiAxIDEyIDExIAorMTQgMTIgMTQgMTAgNCAxMSA2IDggMTYgNyA1IDExIDIwIDIgXgorNDUgMCAxNyA0IDE0IDQgMTUgMyAyIDIgNCAzIDIgMyAxNCAxNSAxMCAyIDEyIDcgMyA3IDIwIDIwIDE5IDEwIDIgMyAxIDEwIDEyIDE1IAorMTQgMTEgMjAgMyAxNiAxNCA5IDQgMTggMSAxOSAyMCA5IDUgMTggXgorNDIgMCAxMyA2IDYgMSA5IDEzIDcgMTUgOSA4IDUgMTkgMyAxNiA5IDggMTAgMjAgMTQgMTEgMTMgMTkgNSA3IDE2IDE4IDE2IDQgNCA0IAorNiA5IDEzIDEwIDE5IDE1IDMgMTQgNiA0IDEyIDE4IF4KKzM2IDEgMTUgMTUgNCA4IDEzIDEzIDkgMTggMTMgNiA0IDcgMjAgNCAyMCAxOCAxOCAxMiAxNiAxMyAxOSAxOSA1IDcgMiA2IDExIDE4IDkgCisxOCA2IDExIDE0IDE0IDE4IDE1IF4KKzQzIDEgMTMgMTkgMjAgMTcgMTEgMTQgNSAxOSAyMCAxMSAyMCAxIDEgNCAxMyAxMCA2IDUgNiAxOSAxOCAxIDMgOSAxNCAyMCA3IDE4IDcgCisxNSAyIDMgMTUgNSAxIDEgMiA2IDEzIDEgMTkgNiAxOSBeCis0MCAxIDE2IDUgMTUgMTEgMTMgMyA2IDExIDIgMjAgOCAxIDUgNCAyMCAxOSAzIDE4IDMgOCAxOSA3IDggMTIgMTQgMTIgMTkgMTEgMTUgCis2IDE5IDEgMTkgNCAxMCAxNiAxNyA3IDE3IDE2IF4KKzM5IDEgMTIgMTkgMjAgMSAxMyAxMiAxMCA4IDIxIDE1IDcgMTkgMTMgNiA4IDE5IDIwIDE4IDIgMTIgMTQgMyAxMCA2IDIgNiAyIDE3IAorMTYgMiA1IDIxIDUgMTcgMTkgNyA4IDExIDE1IF4KKzMzIDAgMTIgMTcgMTQgMTggMTUgMTYgMTYgMTYgMTIgMjAgMTMgMiA1IDUgMiAxMCAyMCAxNiAxMiAxMCAyIDE3IDIxIDIwIDE1IDE0IAorMTQgMTggMjEgMTMgOSAxNyAxMCBeCis0MCAxIDIgMTIgMTYgMTcgMyA5IDE5IDUgNyAxMCA1IDExIDE3IDE4IDE0IDE0IDEyIDIgMjAgMTUgOCAxNyAzIDIwIDExIDEyIDE4IDcgCisxMiA3IDkgOCAzIDE4IDE0IDMgNSAxNyA5IDE0IF4KKzQzIDAgOCAyMSAxMSA4IDggMTYgMjEgMTIgNSA4IDcgMjAgMTAgMTQgNyAxIDkgNSA0IDUgMiAyMSAxMiAxIDEgOSAyMCAxNCAxMSA5IAorMTkgMTYgMyAxIDE0IDEwIDIgOCAyMCAxOCA3IDggMTggXgorNDAgMSAyIDE5IDYgMTEgMTggMTEgMTUgNiA1IDE2IDE0IDkgNyAyMSAzIDE1IDIxIDE2IDggNyAzIDYgMTQgMTcgMTcgNSAxMCAyMCAxMCAKKzE1IDEwIDEgMTUgMTggNiAxMCA5IDcgMTYgNiBeCiszOSAwIDExIDE1IDEyIDIgOSAxIDEgNiA2IDEzIDggMjAgNiAxOCA4IDUgOCAxIDEgMTcgMjAgMjAgMTkgMTcgMTMgMTQgMTcgMTIgNSAzIAorMTggMjAgMjAgMTEgMTggMTUgMTMgMTYgNyBeCis0OCAxIDcgMTAgMSAxOSAxMCA3IDE3IDcgMTYgMyA4IDQgNCAxNSAxNyAxMyA5IDExIDIgMiAxMSA3IDEzIDQgMTcgNyAxIDUgMTMgMTkgCisxNiA1IDE0IDE2IDIgMTEgMTggNSAxMSA2IDQgNyAzIDE3IDIgMSAxOCAxMiBeCis0MSAxIDIxIDE4IDMgNSAxNiA2IDExIDIgOCA4IDcgMTQgMTMgMjEgNiAxNCAxMiA2IDEyIDE5IDE0IDMgMTYgMyAyIDcgMTEgMTQgOCAKKzE2IDEwIDE5IDEyIDE5IDQgNSA2IDEzIDE5IDEyIDEzIF4KKzQ0IDEgNyA1IDEyIDQgMTMgMjEgMiA1IDE3IDE1IDE1IDEgMTMgNSAyMSA2IDQgMTIgMTQgMTUgNSAxOCAxMiAxIDE5IDIgMTQgMSA4IDggCisxMSA2IDIwIDEwIDMgMjEgOCAyMCAyIDQgMSAxNiAxMSAyMSBeCis0MiAxIDUgMyA4IDE2IDE1IDggMTIgMTQgMjAgMTYgMTggNyAyIDE4IDIgMTggMTkgNyA0IDE5IDMgMSAyMCA3IDE1IDEgNCA1IDEyIDEwIAorMTkgNiAxMSA0IDQgOSAyMCAyMCA4IDIgMjAgMTggXgorNDIgMSAxOSAyIDggNCAxNSA3IDIgMiA2IDE4IDIwIDE2IDEgMTggMTcgMTMgMyAxNCAyIDEgMiAxMCAxNCAxOSAxMiA5IDE1IDIwIDEgNyAKKzE1IDE3IDcgMTIgMTggMSAxNSAxNCA4IDIxIDIxIDUgXgorNDMgMSA3IDIwIDEwIDExIDEwIDEgOSAyMSA3IDUgMSAxMiAxNSAyIDkgMTcgNCAxMyA1IDQgMTEgMjEgMTQgMTMgMyAyMCAyMSAxIDMgCisxMiAxOCAxMSA0IDE0IDIwIDUgMyAxNCAxMyAxNSA5IDIxIDMgXgorNDAgMSAxOSA4IDEgNSA5IDUgOSAxNiAxNyA5IDYgMTIgNiAxNiA3IDQgMyAxIDIxIDE2IDE5IDE1IDE4IDE3IDE3IDE3IDIxIDEzIDIwIAorOSA2IDYgOSAxIDEzIDE3IDIxIDEgOSAxNCBeCiszNiAwIDExIDEyIDEzIDE4IDE5IDE5IDE1IDEyIDIwIDIgMTYgMTIgOSAyMSAxNyAxNiA4IDIgMTQgNiA0IDEgNiAxNiAxNSAxOSAxOSAKKzIxIDkgMTMgMTggMyAxNiA4IDEzIDExIF4KKzQ3IDAgMjEgMTUgNCAyMSA0IDIgMyA4IDE1IDE5IDggNiAxNiAyIDE1IDMgMTIgMyAxMSAzIDE3IDEyIDIxIDYgMyA0IDEzIDEgMTIgNCAKKzEwIDIgNiA3IDYgOSAxMiAyMSAxMCAxMCAxMSAyIDEzIDE5IDIgMTQgMTcgXgorNDQgMSAxMSA4IDEwIDE5IDEgMTEgMTEgOSAzIDEzIDE1IDQgMyAxOCA5IDE0IDUgMTUgMTggNSA2IDE3IDExIDE5IDIgNCAxMiA4IDE4IAorMTIgMTcgMyA0IDggNSAxOSAxNiAxNiA2IDEgMTMgMSAxOCAxOCBeCiszOSAxIDEwIDE4IDE1IDExIDUgMSAxNyA0IDE3IDE5IDExIDE4IDIxIDkgMiAxMCAxMCA1IDUgMjAgMTggMTMgNSAxNSAzIDYgMyAxMCAKKzEwIDE2IDEzIDEzIDE0IDE2IDIwIDE5IDExIDE2IDggXgorNDIgMSA2IDggMTUgMTMgMTEgMTMgMTUgMTggMTEgMjAgMTcgMjAgNCAxNiAxMCAxNCAxIDQgMTYgNCAxNyA4IDMgNyA3IDE4IDE2IDIwIAorMiA5IDkgNCAyMCA3IDE2IDQgMTEgNCAxMCA2IDIwIDQgXgorNDEgMCAxNyA2IDE5IDE3IDIgMTUgNiA1IDcgNCA4IDExIDE2IDkgMTAgMTUgMjAgMTIgMTUgOCA2IDE3IDUgOSAzIDMgNCAxOSAyMCAxMiAKKzUgMTkgMjEgNSAyMSAxMSAxNCAxOSAxIDE3IDYgXgorMzkgMCA5IDQgMTkgMyAxNyAxIDE0IDIxIDE0IDcgNiA1IDIwIDE0IDIxIDIwIDQgNiAyMSA3IDExIDIwIDEyIDkgMTEgNiAxNiAxOCAxOCAKKzEwIDExIDIwIDYgMTIgMTEgNSA3IDIxIDMgXgorNDMgMSAxOCA2IDE1IDIxIDEwIDQgMTQgOSAxOSAxMCAzIDMgNSAxMyAxIDggMTIgMyAxMyA5IDcgMTAgMTcgMTAgNiA4IDMgMTcgMTggMyAKKzIxIDE5IDYgMTcgMTUgNCA5IDE1IDkgMTUgMTQgNCAxOCBeCis0NSAxIDE0IDggMTAgMTMgNCAxMSAxMCA3IDYgMjEgMSAxNCA1IDExIDcgNyAyIDEzIDEzIDMgOSAxMyA4IDE0IDkgMyA3IDE4IDQgOSA5IAorNSAxNSAxMyAxNyAxMCAxNSAxNiAyMCA4IDE5IDkgMTAgOSAxMyBeCis0MCAxIDE5IDE0IDIxIDIgMTggMTMgMTAgNCAxOCAxNiA0IDIxIDE1IDEwIDE4IDE5IDMgMTIgMTIgMTQgNCAxMyAxMSAxIDExIDEgMTAgCisyIDEyIDQgMjEgMTAgMjEgMTggOSAyIDE2IDcgMjAgNyBeCis0MSAwIDcgMTIgMTkgMjAgMSAxMyAxMiAxMCA4IDIxIDE1IDcgMTkgMTMgNiA4IDE5IDIwIDE4IDIgMTIgMTQgMyAxMCA2IDIgNiAyIDE3IAorMTYgMiA1IDIxIDUgMTcgMTkgNyA4IDExIDEwIDIxIF4KKzM1IDAgMTcgMTQgMTggMTUgMTYgMTYgMTYgMTIgMjAgMTMgMiA1IDUgMiAxMCAyMCAxNiAxMiAxMCAyIDE3IDIxIDIwIDE1IDE0IDE0IAorMTggMjEgMTMgOSAxNyAyMSAyIDEyIDEwIF4KKzQwIDAgMTcgMyA5IDE5IDUgNyAxMCA1IDExIDE3IDE4IDE0IDE0IDEyIDIgMjAgMTUgOCAxNyAzIDIwIDExIDEyIDE4IDcgMTIgNyA5IDggCiszIDE4IDE0IDMgNSAxNyA5IDE4IDggMjEgMjAgXgorNDYgMSA4IDggMTYgMjEgMTIgNSA4IDcgMjAgMTAgMTQgNyAxIDkgNSA0IDUgMiAyMSAxMiAxIDEgOSAyMCAxNCAxMSA5IDE5IDE2IDMgMSAKKzE0IDEwIDIgOCAyMCAxOCA3IDggMTUgMiAxOSA2IDExIDE4IDEwIF4KKzQ0IDEgMTUgNiA1IDE2IDE0IDkgNyAyMSAzIDE1IDIxIDE2IDggNyAzIDYgMTQgMTcgMTcgNSAxMCAyMCAxMCAxNSAxMCAxIDE1IDE4IDYgCisxMCA5IDcgMTYgMTQgMTEgMTUgMTIgMiA5IDEgMSA2IDYgMTkgXgorMzggMSA4IDIwIDYgMTggOCA1IDggMSAxIDE3IDIwIDIwIDE5IDE3IDEzIDE0IDE3IDEyIDUgMyAxOCAyMCAyMCAxMSAxOCAxNSAxMyAxNiAKKzEzIDcgMTAgMSAxOSAxMCA3IDE3IDcgMTUgXgorNTAgMCAzIDggNCA0IDE1IDE3IDEzIDkgMTEgMiAyIDExIDcgMTMgNCAxNyA3IDEgNSAxMyAxOSAxNiA1IDE0IDE2IDIgMTEgMTggNSAxMSAKKzYgNCA3IDMgMTcgMiAxIDE4IDEzIDIxIDE4IDMgNSAxNiA2IDExIDIgOCA4IDE4IF4KKzQyIDEgMTQgMTMgMjEgNiAxNCAxMiA2IDEyIDE5IDE0IDMgMTYgMyAyIDcgMTEgMTQgOCAxNiAxMCAxOSAxMiAxOSA0IDUgNiAxMyAxOSAKKzEyIDEzIDcgNSAxMiA0IDEzIDIxIDIgNSAxNyAxNSAxNSAxMiBeCis0NSAxIDEzIDUgMjEgNiA0IDEyIDE0IDE1IDUgMTggMTIgMSAxOSAyIDE0IDEgOCA4IDExIDYgMjAgMTAgMyAyMSA4IDIwIDIgNCAxIDE2IAorMTEgMSA1IDMgOCAxNiAxNSA4IDEyIDE0IDIwIDE2IDE4IDcgMTggXgorNDYgMCAxOCAyIDE4IDE5IDcgNCAxOSAzIDEgMjAgNyAxNSAxIDQgNSAxMiAxMCAxOSA2IDExIDQgNCA5IDIwIDIwIDggMiAyMCAzIDE5IAorMiA4IDQgMTUgNyAyIDIgNiAxOCAyMCAxNiAxIDE4IDE3IDEzIDE0IF4KKzQzIDEgMTQgMiAxIDIgMTAgMTQgMTkgMTIgOSAxNSAyMCAxIDcgMTUgMTcgNyAxMiAxOCAxIDE1IDE0IDggMjEgMjEgMTkgNyAyMCAxMCAKKzExIDEwIDEgOSAyMSA3IDUgMSAxMiAxNSAyIDkgMTcgNCAxOSBeCis0NSAxIDUgNCAxMSAyMSAxNCAxMyAzIDIwIDIxIDEgMyAxMiAxOCAxMSA0IDE0IDIwIDUgMyAxNCAxMyAxNSA5IDIxIDExIDE5IDggMSA1IAorOSA1IDkgMTYgMTcgOSA2IDEyIDYgMTYgNyA0IDMgMSAyMSAxNSBeCiszNSAwIDE5IDE1IDE4IDE3IDE3IDE3IDIxIDEzIDIwIDkgNiA2IDkgMSAxMyAxNyAyMSAxIDkgMTYgMTEgMTIgMTMgMTggMTkgMTkgMTUgCisxMiAyMCAyIDE2IDEyIDkgMjEgMTIgXgorNDQgMSAxNiA4IDIgMTQgNiA0IDEgNiAxNiAxNSAxOSAxOSAyMSA5IDEzIDE4IDMgMTYgOCAxMyAyMSAxNSA0IDIxIDQgMiAzIDggMTUgCisxOSA4IDYgMTYgMiAxNSAzIDEyIDMgMTEgMyAxNyAxMiAyMSA5IF4KKzQ4IDAgMyA0IDEzIDEgMTIgNCAxMCAyIDYgNyA2IDkgMTIgMjEgMTAgMTAgMTEgMiAxMyAxOSAyIDE0IDE3IDExIDggMTAgMTkgMSAxMSAKKzExIDkgMyAxMyAxNSA0IDMgMTggOSAxNCA1IDE1IDE4IDUgNiAxNyAxMSAxOSAxNSBeCis0NCAwIDQgMTIgOCAxOCAxMiAxNyAzIDQgOCA1IDE5IDE2IDE2IDYgMSAxMyAxIDE4IDEgMTAgMTggMTUgMTEgNSAxIDE3IDQgMTcgMTkgCisxMSAxOCAyMSA5IDIgMTAgMTAgNSA1IDIwIDE4IDEzIDUgMTUgMTggXgorMzkgMSA2IDMgMTAgMTAgMTYgMTMgMTMgMTQgMTYgMjAgMTkgMTEgMTYgMjEgNiA4IDE1IDEzIDExIDEzIDE1IDE4IDExIDIwIDE3IDIwIAorNCAxNiAxMCAxNCAxIDQgMTYgNCAxNyA4IDMgNyAyMSBeCis0NiAxIDE4IDE2IDIwIDIgOSA5IDQgMjAgNyAxNiA0IDExIDQgMTAgNiAyMCAxNCAxNyA2IDE5IDE3IDIgMTUgNiA1IDcgNCA4IDExIDE2IAorOSAxMCAxNSAyMCAxMiAxNSA4IDYgMTcgNSA5IDMgMyA0IDE5IDMgXgorNDAgMCAxMiA1IDE5IDIxIDUgMjEgMTEgMTQgMTkgMSAxNyA4IDkgNCAxOSAzIDE3IDEgMTQgMjEgMTQgNyA2IDUgMjAgMTQgMjEgMjAgNCAKKzYgMjEgNyAxMSAyMCAxMiA5IDExIDYgMTYgMTEgXgorNDQgMCAxOCAxMCAxMSAyMCA2IDEyIDExIDUgNyAyMSAxOSAxOCA2IDE1IDIxIDEwIDQgMTQgOSAxOSAxMCAzIDMgNSAxMyAxIDggMTIgMyAKKzEzIDkgNyAxMCAxNyAxMCA2IDggMyAxNyAxOCAzIDIxIDE5IDggXgorNDcgMCA0IDEyIDIyIDUgMTEgMjAgMTYgMTUgNCAxNyAyMiAxIDggMTYgMTEgNiAxMyAxOCAzIDE0IDggMTMgMiAxOSAxNiAxIDE5IDEgNSAKKzMgMTYgOSA4IDIwIDcgNSAxIDExIDE1IDIgMyAxNyAzIDEyIDcgNCAxOSBeCis0MiAwIDE4IDE2IDEzIDcgMSAxOSA1IDEyIDE4IDEyIDYgMTUgMTkgNCA0IDkgMTMgMTMgOCAxNyAxMyAxOCAxMiAyIDggNCA3IDE3IDE3IAorMTQgMTEgMTMgMSAxNiAxMSAyIDIxIDMgMjIgMTcgMTYgMTEgXgorMzkgMCAxOCAyMiAxMiAyMCAxNyAxMyAxIDcgMTAgNyAyMCAxMSAxIDcgOCAxNCAxNCAxMiAxNSAxMyAxNSAxOCAxNSAxMSAxOCAxIDE3IAorMTQgMTUgMjAgMTYgMjAgOCAyIDE3IDEwIDQgMjEgMiBeCis0NCAxIDE5IDE5IDE0IDIyIDIxIDE4IDEzIDE0IDEgMyAxMiAxMSAxMSA0IDIyIDEzIDUgMTggNyAyMSA5IDIyIDE5IDEyIDggMTYgNSAKKzE3IDUgOSAxIDIgOSA2IDEyIDYgMSA3IDQgMyAxNSAxIDE0IDE2IF4KKzQyIDEgMTIgMyAxMCAyIDEwIDE0IDIxIDEzIDE3IDYgNiAxNyAxIDIxIDIgMTQgMTYgMTcgOSAxMSAyMCAyMSAxMSAxMiAxMiA4IDIwIAorMTMgMiA5IDIwIDkgMTQgMTAgMSAxNiAyIDIyIDYgNCAxNiAxOCBeCis1MSAwIDE1IDEgMTIgNCAxNCA5IDIxIDMgMyA5IDggMjEgMTUgMTQgOCA0IDE0IDQgMiAzIDggMTIgOCA2IDEgMiAxOCAyMCAxNSAzIDE5IAorMyAxMCAyMCAxNCA2IDMgNCAyMSAxIDEyIDQgMTggMiA2IDcgNiA5IDIwIDE0IDEzIF4KKzQwIDEgMTAgMTkgMTcgMjEgMTIgMTUgMTcgNyAxMCAxMSA4IDEwIDEyIDEgMTkgMTkgOSAxOCAyMSA0IDE4IDExIDkgMjIgNSAxNSA4IAorMTUgMyA1IDYgMiAxOSAxMiAxNyA0IDIwIDggMTEgMjAgXgorNDUgMCAyIDE4IDQgMTYgMjAgMTIgOSA5IDYgMTYgMjEgMTYgMyAxNiAxOCAzIDE5IDUgMTYgMiA0IDIgMTIgMTEgMTUgMTEgMTQgMTcgMiAKKzEwIDE4IDUgNSAxMyAzIDIxIDUgMyA2IDE4IDE4IDEwIDEgMjEgMTUgXgorNDUgMSA3IDEgMTMgMTIgMTkgMSAxNCA2IDggMjEgMTkgMjEgMTEgMTkgMTMgMiAxMyA0IDEgMTAgMjIgMTYgNCA5IDQgMTAgMTYgMyA3IAorMTUgMTEgOSAxMyAxNyAxNSA5IDkgMTUgNCAxMyAxNSA5IDQgMTkgOSBeCis0NiAwIDE4IDYgMTMgMjIgMTAgNiAxMiAyIDE3IDE1IDYgNSA3IDQgOCAxMSAxIDkgMTAgOCA1IDIwIDE2IDYgMTAgNSAxNyAzIDMgMTkgCisxMiAxMyAyMCA1IDEyIDE0IDUgMTQgMTEgMjIgMTIgMTYgMTAgOCA5IDE2IF4KKzM5IDAgMTUgMTIgMyAyIDE2IDIyIDE0IDIyIDcgNiA1IDEzIDIyIDE0IDEzIDQgNiAxNCA3IDExIDEzIDIwIDkgMTkgNiA5IDExIDExIAorMTggMTkgMTMgNiAyMCAxOSAyMCA3IDIyIDEyIDEyIF4KKzQxIDAgNiAxNCAxOCAxOSA3IDE3IDEyIDEwIDMgMTggMTUgNSAyMSAxNiA4IDIwIDMgMjEgOSAxNSAxOCAxMCAxNSAxMCA2IDggMTggMiAKKzExIDMgMTQgNCA2IDEwIDE5IDkgOCAxNyA4IDIyIDIwIF4KKzM2IDEgNyAyMiAxNiAxOCAyMSA0IDExIDEwIDE1IDYgMjIgMTYgMjIgNSAxOSAxNSA3IDcgMiAyMSAyMSAzIDE3IDIxIDE2IDIyIDkgMyAKKzcgMTEgNCAxNyAxNyAyMCAyMSAyMSBeCiszNyAxIDE4IDkgNSA4IDEyIDE3IDE4IDE3IDE2IDEyIDIyIDE0IDE3IDExIDIxIDEwIDQgMyAxIDQgMTQgMTAgMTEgNCAzIDIwIDIwIDIyIAorMTkgMjEgMTkgMTYgMTkgMTYgMTAgMTcgMTcgXgorNDAgMSAxOSAxNCAxOCAxNCAzIDkgMTcgMSA3IDEzIDYgNyAxNSAyMCAxMiAxMyAxNiAyMSAyMCAxMCA4IDIyIDcgMTIgMjEgNiAxNiA0IAorMTMgMTEgMiAxMiAxNSAyMiAzIDE4IDYgMTcgNiAyMiBeCis0MiAwIDEwIDkgMiA1IDIyIDUgMTAgNCA3IDggMTkgMTAgMjAgMTAgMjIgMTEgOCAxIDkgMSAyMCAxMyAyMSAxNyA1IDUgMTcgMTAgMTMgCis5IDIwIDE4IDE3IDIgMTQgMTMgMjIgMjIgMyAxNCAyMSAxMCBeCis0NiAwIDIgMTQgMiAyMCAxIDEwIDE4IDkgMTIgNSA3IDE4IDIwIDE5IDEwIDExIDIyIDcgMTIgMiAxMyA4IDggMiAzIDEzIDE5IDIwIDMgCis3IDIwIDcgOSA4IDMgMTEgMjIgMyA1IDEwIDkgMTEgMTYgMTQgMTkgMTYgXgorNDYgMSAxNSA4IDEgMTQgMjAgNSA4IDcgMTMgMTAgMjIgNyAxNiA5IDUgNCA1IDIgMTQgMjAgMSAxIDE1IDE3IDEzIDIyIDE5IDE3IDQgMSAKKzMgMSAyMiAxMCAxNSAxNSAyIDE2IDEzIDExIDcgMTYgMTcgMTIgNiAyMCBeCis0MCAxIDMgMTkgOCA2IDUgOSAxNSAyMiAxNyA3IDE0IDE4IDE0IDkgMTYgNyAxOCAxNCAyMiAyIDIgNSAxOCAxMyAxOCA4IDE4IDE2IDggCisxMSAxNSA2IDE4IDkgNyA5IDIyIDE5IDIwIDE1IF4KKzQ0IDAgOSAxNiAxNiA2IDYgMjEgOCAxMyA2IDExIDggNSAxNiAxNiAxIDEwIDEzIDEzIDQgMTAgMjEgMjIgMTUgMTAgMjAgNSAzIDMgMTMgCisxNSAxMyAxMSAxMSAxNSAyMSAxIDIxIDcgMTAgMSAxMiAxOCA3IDIwIF4KKzUxIDAgNyAxIDE4IDggNCAxOSAyIDIxIDE3IDE5IDIgMiAxOSA3IDIxIDE5IDIgNyAxNSAxNSAxNiA1IDIxIDEyIDEgNSAyMiAxIDE3IAorMTkgMTEgNSAxMSA2IDQgNyAzIDEwIDIgMSAzIDYgMTQgMTEgMTggNSAxIDYgMTEgMTcgOCBeCiszOSAxIDggMTUgMjIgMjEgMTQgNiAyMiAyMCA2IDIwIDEyIDIyIDE4IDEgMyAyIDcgMTkgMjIgOCA5IDE4IDQgMjAgMTIgNCA1IDYgMjEgCisxMiAyMCAyMSA3IDUgMjAgNCAyMSAxNCAxNCBeCis0NSAwIDE1IDUgMiAxNiAxNSAyMSA1IDE0IDE1IDYgNCAxMiAyMiA1IDExIDIwIDE2IDE1IDQgMTcgMjIgMSA4IDE2IDExIDYgMTMgMTggCiszIDE0IDggMTMgMiAxOSAxNiAxIDE5IDEgNSAzIDE2IDkgOCAyMCAxNCBeCis0OCAxIDUgMSAxMSAxNSAyIDMgMTcgMyAxMiA3IDQgMTIgMTggMTYgMTMgNyAxIDE5IDUgMTIgMTggMTIgNiAxNSAxOSA0IDQgOSAxMyAKKzEzIDggMTcgMTMgMTggMTIgMiA4IDQgNyAxNyAxNyAxNCAxMSAxMyAxIDE2IDExIDIyIF4KKzM4IDAgMjEgMyAyMiAxNyAxNiAxNyAxOCAyMiAxMiAyMCAxNyAxMyAxIDcgMTAgNyAyMCAxMSAxIDcgOCAxNCAxNCAxMiAxNSAxMyAxNSAKKzE4IDE1IDExIDE4IDEgMTcgMTQgMTUgMjAgMTYgMTAgXgorNDMgMCA4IDIgMTcgMTAgNCAyMSA1IDE5IDE5IDE0IDIyIDIxIDE4IDEzIDE0IDEgMyAxMiAxMSAxMSA0IDIyIDEzIDUgMTggNyAyMSA5IAorMjIgMTkgMTIgOCAxNiA1IDE3IDUgOSAxIDIgOSA2IDEyIDIyIF4KKzQ3IDEgMSA3IDQgMyAxNSAxIDE0IDEgMTIgMyAxMCAyIDEwIDE0IDIxIDEzIDE3IDYgNiAxNyAxIDIxIDIgMTQgMTYgMTcgOSAxMSAyMCAKKzIxIDExIDEyIDEyIDggMjAgMTMgMiA5IDIwIDkgMTQgMTAgMSAxNiAyIDIyIDIwIF4KKzUzIDAgNCAxNiAxNCAxNSAxIDEyIDQgMTQgOSAyMSAzIDMgOSA4IDIxIDE1IDE0IDggNCAxNCA0IDIgMyA4IDEyIDggNiAxIDIgMTggMjAgCisxNSAzIDE5IDMgMTAgMjAgMTQgNiAzIDQgMjEgMSAxMiA0IDE4IDIgNiA3IDYgOSAyMCAxNSBeCis0MiAxIDEwIDEwIDE5IDE3IDIxIDEyIDE1IDE3IDcgMTAgMTEgOCAxMCAxMiAxIDE5IDE5IDkgMTggMjEgNCAxOCAxMSA5IDIyIDUgMTUgCis4IDE1IDMgNSA2IDIgMTkgMTIgMTcgNCAyMCA4IDExIDIwIDEyIF4KKzQ1IDAgMTggNCAxNiAyMCAxMiA5IDkgNiAxNiAyMSAxNiAzIDE2IDE4IDMgMTkgNSAxNiAyIDQgMiAxMiAxMSAxNSAxMSAxNCAxNyAyIAorMTAgMTggNSA1IDEzIDMgMjEgNSAzIDYgMTggMTggMTAgMSAyMSAyMSAxOCBeCis0NSAwIDEgMTMgMTIgMTkgMSAxNCA2IDggMjEgMTkgMjEgMTEgMTkgMTMgMiAxMyA0IDEgMTAgMjIgMTYgNCA5IDQgMTAgMTYgMyA3IDE1IAorMTEgOSAxMyAxNyAxNSA5IDkgMTUgNCAxMyAxNSA5IDQgMTkgMTkgMTkgXgorNDkgMCA2IDEzIDIyIDEwIDYgMTIgMiAxNyAxNSA2IDUgNyA0IDggMTEgMSA5IDEwIDggNSAyMCAxNiA2IDEwIDUgMTcgMyAzIDE5IDEyIAorMTMgMjAgNSAxMiAxNCA1IDE0IDExIDIyIDEyIDE2IDEwIDggOSA0IDE1IDEyIDMgMjIgXgorMzkgMCAxNiAyMiAxNCAyMiA3IDYgNSAxMyAyMiAxNCAxMyA0IDYgMTQgNyAxMSAxMyAyMCA5IDE5IDYgOSAxMSAxMSAxOCAxOSAxMyA2IAorMjAgMTkgMjAgNyAyMiAxMiAxMSA2IDE0IDE4IDE3IF4KKzQzIDEgNyAxNyAxMiAxMCAzIDE4IDE1IDUgMjEgMTYgOCAyMCAzIDIxIDkgMTUgMTggMTAgMTUgMTAgNiA4IDE4IDIgMTEgMyAxNCA0IDYgCisxMCAxOSA5IDggMTcgOCAyMiA0IDcgMjIgMTYgMTggMjEgMTEgXgorMzkgMCAxMSAxMCAxNSA2IDIyIDE2IDIyIDUgMTkgMTUgNyA3IDIgMjEgMjEgMyAxNyAyMSAxNiAyMiA5IDMgNyAxMSA0IDE3IDE3IDIwIAorMjEgMTAgMTggOSA1IDggMTIgMTcgMTggMTcgMTcgXgorNDAgMSAxMiAyMiAxNCAxNyAxMSAyMSAxMCA0IDMgMSA0IDE0IDEwIDExIDQgMyAyMCAyMCAyMiAxOSAyMSAxOSAxNiAxOSAxNiAxMCAxNyAKKzIwIDE5IDE0IDE4IDE0IDMgOSAxNyAxIDcgMTMgNiAxOCBeCis0NCAxIDE1IDIwIDEyIDEzIDE2IDIxIDIwIDEwIDggMjIgNyAxMiAyMSA2IDE2IDQgMTMgMTEgMiAxMiAxNSAyMiAzIDE4IDYgMTcgNiAyIAorMTAgOSAyIDUgMjIgNSAxMCA0IDcgOCAxOSAxMCAyMCAxMCAyMiA3IF4KKzQzIDAgOCAxIDkgMSAyMCAxMyAyMSAxNyA1IDUgMTcgMTAgMTMgOSAyMCAxOCAxNyAyIDE0IDEzIDIyIDIyIDMgMTQgMjEgOSAyIDE0IDIgCisyMCAxIDEwIDE4IDkgMTIgNSA3IDE4IDIwIDE5IDEwIDExIDE5IF4KKzUzIDEgNyAxMiAyIDEzIDggOCAyIDMgMTMgMTkgMjAgMyA3IDIwIDcgOSA4IDMgMTEgMjIgMyA1IDEwIDkgMTEgMTYgMTQgMTkgOCAxNSAKKzggMSAxNCAyMCA1IDggNyAxMyAxMCAyMiA3IDE2IDkgNSA0IDUgMiAxNCAyMCAxIDEgMTUgOCBeCis0MiAwIDEzIDIyIDE5IDE3IDQgMSAzIDEgMjIgMTAgMTUgMTUgMiAxNiAxMyAxMSA3IDE2IDE3IDEyIDYgMTkgMyAxOSA4IDYgNSA5IDE1IAorMjIgMTcgNyAxNCAxOCAxNCA5IDE2IDcgMTggMTQgMjIgMTkgXgorNDMgMCAyIDUgMTggMTMgMTggOCAxOCAxNiA4IDExIDE1IDYgMTggOSA3IDkgMjIgMTkgMjAgMTcgOSAxNiAxNiA2IDYgMjEgOCAxMyA2IAorMTEgOCA1IDE2IDE2IDEgMTAgMTMgMTMgNCAxMCAyMSAyMiAxNCBeCis0OCAwIDEwIDIwIDUgMyAzIDEzIDE1IDEzIDExIDExIDE1IDIxIDEgMjEgNyAxMCAxIDEyIDE4IDcgMiA3IDEgMTggOCA0IDE5IDIgMjEgCisxNyAxOSAyIDIgMTkgNyAyMSAxOSAyIDcgMTUgMTUgMTYgNSAyMSAxMiAxIDUgMjEgXgorNDkgMSAxIDE3IDE5IDExIDUgMTEgNiA0IDcgMyAxMCAyIDEgMyA2IDE0IDExIDE4IDUgMSA2IDExIDE3IDggOCAxNSAyMiAyMSAxNCA2IAorMjIgMjAgNiAyMCAxMiAyMiAxOCAxIDMgMiA3IDE5IDIyIDggOSAxOCA0IDIwIDEwIF4KKzQ1IDEgNCA1IDYgMjEgMTIgMjAgMjEgNyA1IDIwIDQgMjEgMTQgMiAxNSA1IDIgMTYgMTUgMjEgNSAxNCAxNSA2IDQgMTIgMjIgNSAxMSAKKzIwIDE2IDE1IDQgMTcgMjIgMSA4IDE2IDExIDYgMTMgMTggMyAxNCAxMyBeCis1MiAwIDEzIDIgMTkgMTYgMSAxOSAxIDUgMyAxNiA5IDggMjAgNyA1IDEgMTEgMTUgMiAzIDE3IDMgMTIgNyA0IDEyIDE4IDE2IDEzIDcgCisxIDE5IDUgMTIgMTggMTIgNiAxNSAxOSA0IDQgOSAxMyAxMyA4IDE3IDEzIDE4IDEyIDIgOCAxNSBeCis0NiAwIDIwIDEgMSAxMSAyMSAyIDMgMTYgOCAxMiAyMSAyMiAxIDE2IDEgMTAgMjIgMTcgNCAxNCA3IDIgMTYgOSAxOCAyMyA5IDQgOCAKKzE2IDcgOSAxOCAxMSAxMSAxNyAyMCAyIDcgMTAgMjAgOCAxMCAxNiAxNCAxNCBeCis0MSAxIDIwIDQgMTYgNCAxOCAxIDE0IDEyIDE5IDEzIDE1IDE5IDE5IDExIDIyIDEzIDEwIDIgMTEgMTYgMTAgMTcgOCA4IDYgMjIgMiAKKzE1IDEwIDkgMTMgMTggMTQgMjIgOCA2IDE4IDE2IDE1IDE0IDIwIF4KKzQzIDEgMTQgMyAxMiAxNCAxNyAxMSAzIDkgMTkgMTAgMjAgMTYgMTEgMyAxNyA3IDIxIDIzIDEyIDIzIDExIDEzIDIgMTQgMTQgMTYgMTMgCisxMiAxMSA1IDE0IDMgOCA0IDEzIDggMTcgMTcgMTggMTcgMiAxMiAyMiBeCis0MyAxIDE3IDMgMTEgMTIgMTYgNSAxIDIyIDYgMTYgMTEgMjAgMyAxOCAxNyA2IDIyIDE0IDEzIDIxIDIxIDMgMTggMTMgMjAgMTEgMTggCisxOSAxMSA2IDEgMTAgMTggNyAxNyA1IDE2IDEgNyAxMCA0IDIwIDIyIF4KKzQ2IDAgOCAxMCAxMiA0IDExIDIxIDYgMTMgMTYgMTcgNiAyMyAxIDkgMTQgNCAxMSAyMyAyMyAxOSAxIDEzIDYgMjAgMSA5IDEyIDggNSAKKzIzIDE3IDE2IDggOCAzIDEwIDEzIDcgNiAxMCA4IDE0IDkgMTUgMjAgMjAgXgorNDYgMCAyMCAyMSAxNSAxMiAxOSAxNyAxIDYgNCA1IDggNCAxMiAxMCA2IDUgNCAxNyAzIDMgMTYgMTMgNSAyMSAxNiAxMCAyMSAxOCAxOSAKKzE1IDE2IDEyIDYgMTIgMTcgOCA3IDggMTEgMTQgMSAyMyAxMCAxNSAxNSAxMyBeCis0MyAwIDIxIDEzIDE1IDE4IDIxIDEwIDEwIDIzIDMgMTMgMTMgOSAxNiAyIDE3IDE5IDMgMjIgMTEgNSAxOCAxOSAxMyA3IDcgOCAxOSAyIAorMTIgMiAxOSAxNiAyMyA5IDE2IDYgMyAxOSAxMiA1IDEwIDkgMTcgXgorNDcgMCAyMSAzIDIgMSA3IDE0IDE0IDcgNiAyIDIwIDMgNiAxOSAxOSAxMCAyIDIyIDEyIDE3IDEyIDEgMjAgNyA3IDE1IDIwIDYgMTggOCAKKzMgMTQgMjMgMTggMTUgNCA3IDUgMjMgMTUgNyAxNCAxMCAxMCAxOSAxNyAxMSBeCis0NCAwIDQgMTUgMTcgMTEgMTUgMTEgOCA5IDE3IDUgMTIgMTggMTQgNiAyMCAxNyAyMSAxMiAxNiA5IDIyIDkgMjAgMTUgMiAyMiAxMSAyIAorNiAxMSA5IDggMiA0IDE0IDE5IDMgMjEgMjEgMjMgOCAyIDExIDE1IF4KKzM3IDAgOCA0IDIwIDIyIDYgMjEgMTggMjIgMTAgMTkgOSAxNCAxNyAyMyAyMSAxMCA3IDE1IDEzIDE2IDUgNCAxMCAxMyAxNCAyMCAyMyAKKzEyIDIwIDIzIDE4IDEwIDEyIDggMjEgMTEgMTkgXgorMzkgMCAxMiA3IDE5IDE0IDE4IDE0IDE4IDIyIDYgOSAyMiA1IDIzIDEzIDYgOCAyMyAyMCAyMiA1IDIyIDE1IDE5IDIwIDkgOSAxIDEzIAorMTMgMTAgMTQgMTMgNSAyMiAxNCAyMSA5IDIxIDMgXgorNDUgMSAxNCAxNCA0IDE4IDEzIDEyIDIzIDcgMyAxNSA1IDE3IDE0IDIzIDE0IDUgMTcgMjIgMTEgMSA4IDEzIDIzIDYgMjEgMyA2IDExIAorNyAyMyA4IDYgMjEgNCA0IDIyIDE5IDEzIDggNSAxOSA3IDUgMjMgMyBeCis1MCAxIDQgMTkgMTEgMjMgMTEgMjEgMTQgMSAzIDIwIDIgMjAgNyA0IDE3IDIgNSAxMyA0IDIzIDUgMjIgNyA3IDkgMTcgMTMgNSA2IDIgCisyMSAxIDE3IDcgOSAyMSAyMyAxIDEgMTIgMyAxIDE1IDIyIDQgMTIgNiAyMCA1IDIzIF4KKzQ2IDEgMjMgNCAxMiAyMiA4IDE4IDE2IDMgMTYgNCAyIDEzIDEgMTUgMTUgMSAyMyAyIDMgNCAxMCAxIDEyIDcgMTEgMiA3IDIyIDIyIAorMjEgMjIgMTMgMyAxMiAyMiAxMiA0IDMgMjMgMTAgMTQgMTcgMTUgOSAyMyAyMCBeCis0NCAwIDE5IDEyIDIxIDIyIDkgMTcgMTIgMiAxOCAxOCAxMiAyMSAyIDE5IDQgMjEgMjAgNCA5IDE0IDUgMjEgOCAyMiAxMCAxNSAyMyAKKzE0IDggNSAxMSAxOSA1IDcgNSAzIDExIDQgMTUgMTggOSAyIDIzIDQgXgorNDYgMCA5IDE2IDE0IDE1IDYgMTUgMSAxMSA0IDE2IDE2IDIwIDE0IDIgOSAxOSAxNCA2IDMgNyAxMCAxNiAyMiAyMyA3IDcgMTIgNSAyIAorOCA5IDUgNyAxIDE3IDE5IDIxIDE5IDE4IDE1IDMgMjAgMjIgMTQgOSAxNiBeCis0NCAxIDEwIDE4IDExIDMgNSA5IDEwIDExIDIyIDEyIDEyIDE1IDIzIDIgMTAgMTggMjMgNSAxOCAyMSAyMCAyMyAzIDkgMyAyMiA3IDggCis3IDQgMSAxNCAxNiAxNiAxMyAxOCAyIDIxIDE4IDE1IDUgNSAxNiAyMSBeCis0NiAwIDIgMiA2IDIzIDEzIDIyIDIwIDEyIDE3IDQgMTAgMjEgMiAyMCAyIDggOCA3IDIwIDEzIDMgMjAgMjMgMTYgNiAyMyA5IDEyIDIwIAorMyAxMCA1IDYgMTkgMTggMTIgMTMgMTQgOCAxIDEgOCA5IDEzIDE5IDIzIF4KKzQ3IDAgOSAyMCAyMCA1IDE1IDEzIDE3IDMgMTUgMjIgMyAxIDE5IDggMTUgOCAxOSA5IDIxIDcgMTIgMSAxNiAyMSAxMSA4IDEwIDE1IAorMTYgOCAxIDUgNSAyMCAyMiAxMyAxMSAyMiA0IDQgNyA2IDIyIDEwIDMgMjEgNCBeCis0NSAxIDkgMTkgMjIgMTggMyAyMyA2IDQgNiAxOSAxNSAxMyAxNyA0IDEzIDkgMTUgNCA2IDcgMTMgMTEgMSAyMCAxNSAxMiAxOCAxOCAKKzE2IDcgMTMgNCAxMSA3IDExIDYgMTcgOSAxOCAxNSAyMSAxNyA1IDIwIDExIF4KKzQ5IDAgMSAyMiAxNiAxOCA1IDggMTEgMiAyMyAxMCAxMSA1IDIgMSAxOSAxNiAzIDE5IDE2IDE1IDIxIDUgMyA3IDE4IDQgOSAxNSAzIDggCisyMCAxIDIxIDEgMjEgMTcgOSA2IDE3IDEwIDE2IDIgOSA3IDE2IDE5IDE1IDE3IDkgXgorNTEgMCAxNyAyMCAxOSA2IDYgMTQgMiAyIDUgMSAyIDEwIDE3IDEgMTggNiAxOCAyMCAxIDEgMTEgMjEgMiAzIDE2IDggMTIgMjEgMjIgMSAKKzE2IDEgMTAgMjIgMTcgNCAxNCA3IDIgMTYgOSAxOCAyMyA5IDQgOCAxNiA3IDkgMTggMTcgXgorNDUgMSAxMSAxNyAyMCAyIDcgMTAgMjAgOCAxMCAxNiAxNCAxMSAyMCA0IDE2IDQgMTggMSAxNCAxMiAxOSAxMyAxNSAxOSAxOSAxMSAyMiAKKzEzIDEwIDIgMTEgMTYgMTAgMTcgOCA4IDYgMjIgMiAxNSAxMCA5IDEzIDE4IDggXgorNDQgMCAyMiA4IDYgMTggMTYgMTUgMTQgMTUgMTQgMyAxMiAxNCAxNyAxMSAzIDkgMTkgMTAgMjAgMTYgMTEgMyAxNyA3IDIxIDIzIDEyIAorMjMgMTEgMTMgMiAxNCAxNCAxNiAxMyAxMiAxMSA1IDE0IDMgOCA0IDEzIDIwIF4KKzQzIDAgMTcgMTcgMTggMTcgMiAxMiAzIDE3IDMgMTEgMTIgMTYgNSAxIDIyIDYgMTYgMTEgMjAgMyAxOCAxNyA2IDIyIDE0IDEzIDIxIAorMjEgMyAxOCAxMyAyMCAxMSAxOCAxOSAxMSA2IDEgMTAgMTggNyAxNyAyMCBeCis1MCAxIDE2IDEgNyAxMCA0IDIwIDEwIDggMTAgMTIgNCAxMSAyMSA2IDEzIDE2IDE3IDYgMjMgMSA5IDE0IDQgMTEgMjMgMjMgMTkgMSAKKzEzIDYgMjAgMSA5IDEyIDggNSAyMyAxNyAxNiA4IDggMyAxMCAxMyA3IDYgMTAgOCAxNCAxNyBeCis0NiAxIDE1IDIwIDE4IDIwIDIxIDE1IDEyIDE5IDE3IDEgNiA0IDUgOCA0IDEyIDEwIDYgNSA0IDE3IDMgMyAxNiAxMyA1IDIxIDE2IDEwIAorMjEgMTggMTkgMTUgMTYgMTIgNiAxMiAxNyA4IDcgOCAxMSAxNCAxIDIzIDIxIF4KKzQ1IDAgMTUgMTUgMiAyMSAxMyAxNSAxOCAyMSAxMCAxMCAyMyAzIDEzIDEzIDkgMTYgMiAxNyAxOSAzIDIyIDExIDUgMTggMTkgMTMgNyAKKzcgOCAxOSAyIDEyIDIgMTkgMTYgMjMgOSAxNiA2IDMgMTkgMTIgNSAxMCAxNSBeCis0OCAxIDIwIDIxIDMgMiAxIDcgMTQgMTQgNyA2IDIgMjAgMyA2IDE5IDE5IDEwIDIgMjIgMTIgMTcgMTIgMSAyMCA3IDcgMTUgMjAgNiAKKzE4IDggMyAxNCAyMyAxOCAxNSA0IDcgNSAyMyAxNSA3IDE0IDEwIDEwIDE5IDE3IDEyIF4KKzQ3IDAgNCAxNSAxNyAxMSAxNSAxMSA4IDkgMTcgNSAxMiAxOCAxNCA2IDIwIDE3IDIxIDEyIDE2IDkgMjIgOSAyMCAxNSAyIDIyIDExIDIgCis2IDExIDkgOCAyIDQgMTQgMTkgMyAyMSAyMSAyMyA4IDIgMTEgNCA4IDQgMjAgXgorMzkgMCAyMiA2IDIxIDE4IDIyIDEwIDE5IDkgMTQgMTcgMjMgMjEgMTAgNyAxNSAxMyAxNiA1IDQgMTAgMTMgMTQgMjAgMjMgMTIgMjAgCisyMyAxOCAxMCAxMiA4IDIxIDExIDYgMTIgNyAxOSAxNCAxNCBeCis0MCAwIDE0IDE4IDIyIDYgOSAyMiA1IDIzIDEzIDYgOCAyMyAyMCAyMiA1IDIyIDE1IDE5IDIwIDkgOSAxIDEzIDEzIDEwIDE0IDEzIDUgCisyMiAxNCAyMSA5IDIxIDE5IDE0IDE0IDQgMTggMTMgMTIgXgorNDYgMCAyMyA3IDMgMTUgNSAxNyAxNCAyMyAxNCA1IDE3IDIyIDExIDEgOCAxMyAyMyA2IDIxIDMgNiAxMSA3IDIzIDggNiAyMSA0IDQgCisyMiAxOSAxMyA4IDUgMTkgNyA1IDIzIDEgNCAxOSAxMSAyMyAxMSAyMSA5IF4KKzUyIDAgMSAzIDIwIDIgMjAgNyA0IDE3IDIgNSAxMyA0IDIzIDUgMjIgNyA3IDkgMTcgMTMgNSA2IDIgMjEgMSAxNyA3IDkgMjEgMjMgMSAKKzEgMTIgMyAxIDE1IDIyIDQgMTIgNiAyMCA1IDE5IDIzIDQgMTIgMjIgOCAxOCAxNiAzIDIyIF4KKzQ4IDAgNCAyIDEzIDEgMTUgMTUgMSAyMyAyIDMgNCAxMCAxIDEyIDcgMTEgMiA3IDIyIDIyIDIxIDIyIDEzIDMgMTIgMjIgMTIgNCAzIAorMjMgMTAgMTQgMTcgMTUgOSAyMyA0IDE5IDEyIDIxIDIyIDkgMTcgMTIgMiAxOCAxOCA5IF4KKzQ2IDAgMjEgMiAxOSA0IDIxIDIwIDQgOSAxNCA1IDIxIDggMjIgMTAgMTUgMjMgMTQgOCA1IDExIDE5IDUgNyA1IDMgMTEgNCAxNSAxOCAKKzkgMiAyMyAyMiA5IDE2IDE0IDE1IDYgMTUgMSAxMSA0IDE2IDE2IDIwIDIyIF4KKzQ3IDAgMiA5IDE5IDE0IDYgMyA3IDEwIDE2IDIyIDIzIDcgNyAxMiA1IDIgOCA5IDUgNyAxIDE3IDE5IDIxIDE5IDE4IDE1IDMgMjAgMjIgCisxNCA5IDExIDEwIDE4IDExIDMgNSA5IDEwIDExIDIyIDEyIDEyIDE1IDIzIDIyIF4KKzQ1IDAgMTAgMTggMjMgNSAxOCAyMSAyMCAyMyAzIDkgMyAyMiA3IDggNyA0IDEgMTQgMTYgMTYgMTMgMTggMiAyMSAxOCAxNSA1IDUgMTYgCisxMiAyIDIgNiAyMyAxMyAyMiAyMCAxMiAxNyA0IDEwIDIxIDIgMjAgMTkgXgorNDcgMCA4IDggNyAyMCAxMyAzIDIwIDIzIDE2IDYgMjMgOSAxMiAyMCAzIDEwIDUgNiAxOSAxOCAxMiAxMyAxNCA4IDEgMSA4IDkgMTMgCisxOSAxMiA5IDIwIDIwIDUgMTUgMTMgMTcgMyAxNSAyMiAzIDEgMTkgOCAxNSAyMyBeCis0OCAwIDE5IDkgMjEgNyAxMiAxIDE2IDIxIDExIDggMTAgMTUgMTYgOCAxIDUgNSAyMCAyMiAxMyAxMSAyMiA0IDQgNyA2IDIyIDEwIDMgCisyMSAxIDkgMTkgMjIgMTggMyAyMyA2IDQgNiAxOSAxNSAxMyAxNyA0IDEzIDkgMTcgXgorNDkgMSA0IDYgNyAxMyAxMSAxIDIwIDE1IDEyIDE4IDE4IDE2IDcgMTMgNCAxMSA3IDExIDYgMTcgOSAxOCAxNSAyMSAxNyA1IDIwIDYgMSAKKzIyIDE2IDE4IDUgOCAxMSAyIDIzIDEwIDExIDUgMiAxIDE5IDE2IDMgMTkgMTYgMTUgMTggXgorNTUgMSA1IDMgNyAxOCA0IDkgMTUgMyA4IDIwIDEgMjEgMSAyMSAxNyA5IDYgMTcgMTAgMTYgMiA5IDcgMTYgMTkgMTUgMTcgMTAgMTcgCisyMCAxOSA2IDYgMTQgMiAyIDUgMSAyIDEwIDE3IDEgMTggNiAxOCAyMCAxIDEgMTEgMjEgMiAzIDE2IDggMTcgXgorNDcgMCAyMSAyMiAxIDE2IDEgMTAgMjIgMTcgNCAxNCA3IDIgMTYgOSAxOCAyMyA5IDQgOCAxNiA3IDkgMTggMTEgMTEgMTcgMjAgMiA3IAorMTAgMjAgOCAxMCAxNiAxNCAxMSAyMCA0IDE2IDQgMTggMSAxNCAxMiAxOSAxMyAxOSBeCis0NSAxIDE5IDE5IDExIDIyIDEzIDEwIDIgMTEgMTYgMTAgMTcgOCA4IDYgMjIgMiAxNSAxMCA5IDEzIDE4IDE0IDIyIDggNiAxOCAxNiAKKzE1IDE0IDE1IDE0IDMgMTIgMTQgMTcgMTEgMyA5IDE5IDEwIDIwIDE2IDExIDMgMjEgXgorNDcgMSA3IDIxIDIzIDEyIDIzIDExIDEzIDIgMTQgMTQgMTYgMTMgMTIgMTEgNSAxNCAzIDggNCAxMyA4IDE3IDE3IDE4IDE3IDIgMTIgMyAKKzE3IDMgMTEgMTIgMTYgNSAxIDIyIDYgMTYgMTEgMjAgMyAxOCAxNyA2IDIyIDE0IDIwIF4KKzQ3IDEgMjEgMjEgMyAxOCAxMyAyMCAxMSAxOCAxOSAxMSA2IDEgMTAgMTggNyAxNyA1IDE2IDEgNyAxMCA0IDIwIDEwIDggMTAgMTIgNCAKKzExIDIxIDYgMTMgMTYgMTcgNiAyMyAxIDkgMTQgNCAxMSAyMyAyMyAxOSAxIDEzIDIyIF4KKzUxIDAgMjAgMSA5IDEyIDggNSAyMyAxNyAxNiA4IDggMyAxMCAxMyA3IDYgMTAgOCAxNCA5IDE1IDIwIDE4IDIwIDIxIDE1IDEyIDE5IAorMTcgMSA2IDQgNSA4IDQgMTIgMTAgNiA1IDQgMTcgMyAzIDE2IDEzIDUgMjEgMTYgMTAgMjEgMjEgXgorNTIgMCAxNSAxMyA0IDggMTIgMjIgOSA2IDMgMSAxMyAxNiAxMiAyMyAxMCAxNCAyIDEgNiAxMSA4IDE5IDI0IDE2IDIgNSAyMSAyIDcgCisyMiA0IDUgMjMgMyAxMiAyMCA4IDQgNSAxNyA5IDE4IDE4IDE4IDQgMTAgMTMgMiA0IDcgMjQgMjEgXgorNTEgMSAxMCAyMSA0IDggMjQgMiA2IDE5IDEwIDYgMjIgMjIgMTQgMjIgMTMgMjEgNSAyMiAyIDQgMTggNSAxMSAyMSAxIDcgOCA0IDE3IAorNSAxNCAxIDIgMTAgOSAxMiA1IDExIDEwIDIwIDQgMTQgMyAxIDMgMjEgMTIgMTEgMTcgMjIgMjEgXgorNDMgMSA3IDUgMjEgMTQgMTUgMTkgMjAgMTIgNiAxMiAxOCAxOSA0IDcgMTIgMTAgNSAyMiAzIDE1IDIxIDcgMjMgNyAyIDIyIDQgMTggCisxOCAzIDI0IDEwIDE3IDI0IDIzIDE4IDYgMTEgMTggMjIgOCA2IDIwIF4KKzQ1IDAgMiAxMiAxMCAxNCAxMiA5IDIgMjMgMTYgMjAgMTQgMTcgOSAxNiA3IDIxIDYgMjIgMjQgMTkgMTEgOSAxOSAyMSAxNSAxMSAxOSAKKzIgMiA3IDggMTAgOCA5IDggMTUgOSAxNCA2IDE2IDggMjEgMjEgMjIgMTMgXgorNTAgMSAxNyA5IDQgMjQgMjEgMTUgMTUgMTYgMTYgMTMgOSAxMCAxNiAxNCAxMiA3IDEyIDE1IDE1IDUgMTAgMTAgMjMgNSAxMyAyMiAzIAorNSAxIDQgMTEgMTQgNyA2IDEwIDE3IDE0IDYgMyAxMyAxOCAxNiAzIDUgMTUgMjMgOCA1IDMgMjIgXgorNDcgMCA4IDEyIDIwIDIwIDkgMiAxMyAyNCAxNyAyIDIgMTcgMyAxMyAyMCAyIDYgMyAxNSA3IDEzIDEgMTggNyAyMiAxOCAyNCAyMCAxNCAKKzcgMTcgMTYgMjAgMyAxMSA2IDUgMiAxOCAxNCAxNiAyMiAxNCAxMSA3IDE4IDIyIF4KKzQ4IDEgMTcgMjQgMTIgMTIgMyAxMyAxOSAxNiAyMiA0IDE2IDQgNiAyMyA4IDE4IDExIDIgMyAyMCAyMiA5IDIxIDggMjMgMSAyMyAyMCAKKzcgMTYgMTMgMjMgNCAxMyAzIDcgNCAyMyA2IDEzIDE5IDIgMyA3IDIgOSA5IDE5IF4KKzQ1IDEgNiAxMyA0IDIyIDYgMTkgMjAgMSA5IDcgMTQgMSAxNSAzIDIzIDI0IDIyIDE4IDEyIDEyIDE3IDE5IDEwIDggMTEgMjIgMTIgMTAgCisyIDIwIDE1IDE4IDE3IDE4IDcgMTEgMTIgMjEgNiAxMiA0IDcgMTggMTcgMTggXgorNDQgMCAyIDE0IDI0IDE0IDEgMjMgMSAxMSAxNSAxMCA2IDE4IDIwIDcgMSA4IDEgMTYgNiAyMCAyMyAyMyAyMSAxMCAxMCAxMiAyNCAxMCAKKzExIDIzIDIgMTIgMjMgOSAzIDI0IDI0IDE5IDE0IDEwIDE4IDE1IDE0IDEyIF4KKzUwIDEgMTYgMTEgMjIgMiAxNSAyNCA4IDIyIDEgNCAyNCA5IDEwIDE1IDMgOSA1IDQgMTcgMTUgOSAxMiAxOSAxOSAxIDMgMTAgNiA4IDMgCisxNyA4IDE4IDI0IDE5IDMgNCAxNSA0IDkgMiAyNCA1IDIwIDEzIDcgMjAgMTcgMTkgMTEgXgorNDMgMCAxMyA4IDEwIDE5IDE1IDExIDEgMTQgMTcgMjAgMjIgMTAgNyAxMSAxNiA5IDIxIDIyIDE3IDIzIDEyIDE1IDQgMjQgNyAyMSAxOCAKKzIgMjEgMTYgMSAxOSAxOCAyMCAxMSAzIDE1IDE5IDE4IDEgNiAxNCAxNSBeCis0NSAwIDUgNSAxOSAxMyAxMCAyNCAxOSAxNiAyNCAxNSAxMyAyIDE5IDE1IDI0IDIxIDE3IDQgMTMgMTcgMSAxIDkgMSAxMCAyIDE4IDEgCisyMSAxOSA1IDE4IDEyIDIgMjIgMTYgMjMgMTUgMTkgNiAxOCA5IDEgMjMgMjAgXgorNDkgMCAyMSAxMyAxNCAxMSAxOCAxMiAxMyAzIDE5IDkgMjAgMjIgMjAgMiAxMSAxMiA2IDEgMTIgMTYgMTggMiA5IDggNCAzIDExIDE3IAorMTEgNSA0IDE5IDE2IDExIDIzIDEzIDE4IDEgMjAgOCAyIDE2IDE2IDIxIDQgMTkgNSA1IDI0IF4KKzQ2IDAgMjQgMTMgMjMgNiAyNCA1IDE3IDEyIDUgMSAxNSAxNyAxNyAyMSAxMSAxMyA5IDIzIDExIDE0IDIxIDcgNiA5IDYgMTQgNyAxNiAKKzIgMTcgMSAyNCAyMyA0IDEyIDE0IDQgMiAxMSAyMyAxMiA0IDIzIDIxIDIxIDQgXgorNDkgMSAxNSAxMyAxNSAxNCAxNSA4IDE0IDkgMTcgNyAxNSAyIDIzIDIgMSAxNyA2IDE0IDE5IDI0IDIgOCA4IDcgNyAxMCAxNCAxMyA3IAorOSAxMSAxNiAxMSA4IDggMTggMTMgMTMgMTggMTAgMSAyMCAxOCAyMiAxOSAxMiA5IDE2IDEyIF4KKzQzIDEgMTMgNiA5IDE3IDIwIDEwIDUgNyAyMCAxOCA4IDE1IDIzIDIxIDIwIDUgMTUgMTEgMyAzIDE0IDIxIDEwIDI0IDYgMjEgMjEgNiAKKzIzIDEwIDMgMjEgMjMgMTcgMjAgOCAxNiAxMCAyMiA1IDE2IDEgMjQgXgorNTAgMCAyNCAzIDkgMTYgNiA3IDMgMjAgMTIgMTcgMTggMjEgNSA5IDcgMSA5IDEyIDE5IDUgNyA2IDI0IDExIDExIDIwIDIzIDEwIDQgNyAKKzEgMTkgNyAxOSAxNyAyMyAxNSA1IDEyIDIxIDIwIDMgMSAxNCAyIDE1IDIyIDMgMTYgMTEgXgorNDUgMSAxMCAxOSAxMCAyMCAxNiAxOSAxNyAxMCA0IDIxIDIwIDE2IDIxIDE0IDE0IDggMTcgMTAgMTkgMSAxNyA0IDMgMjIgMjMgMTQgCisxNiA5IDIyIDggMjAgMjQgMSA1IDExIDExIDYgNCAxMyAxNSAxMiAxIDExIDEzIDIyIF4KKzQ1IDAgMyA4IDUgNiA1IDE2IDEyIDExIDIgMTcgMTQgMTkgMjMgMTYgNSA2IDIwIDIxIDkgMjQgOSAyMiAyMyAyMiAxMiA4IDEzIDIzIAorMTcgNSAzIDE2IDIyIDE1IDIyIDcgMTcgMyAyIDEzIDEzIDExIDI0IDEzIDE3IF4KKzQyIDEgMjEgMTEgMTQgMjAgMjQgMjQgNCA5IDEzIDUgOCA5IDE4IDcgMTIgMSAyMSA4IDI0IDE1IDEgMjIgMTkgMjQgMTQgMTMgOCAyMCAKKzE0IDE4IDIzIDE5IDkgOCAxNCAyMyAxMSA0IDQgMjIgMjAgMTcgXgorNDkgMSAxNyAxNSAyMCA2IDE1IDggMjQgNCAyMCAxOSA4IDE5IDE0IDIxIDI0IDE4IDMgMTAgMTYgMyA2IDQgMSAxMCAxNSAxMyA0IDggCisxMiAyMiA5IDYgMyAxIDEzIDE2IDEyIDIzIDEwIDE0IDIgMSA2IDExIDggMTkgMjQgMTYgMjMgXgorNTAgMCA1IDIxIDIgNyAyMiA0IDUgMjMgMyAxMiAyMCA4IDQgNSAxNyA5IDE4IDE4IDE4IDQgMTAgMTMgMiA0IDcgMjQgOCAxMCAyMSA0IAorOCAyNCAyIDYgMTkgMTAgNiAyMiAyMiAxNCAyMiAxMyAyMSA1IDIyIDIgNCAxOCA1IDI0IF4KKzUzIDEgMjEgMSA3IDggNCAxNyA1IDE0IDEgMiAxMCA5IDEyIDUgMTEgMTAgMjAgNCAxNCAzIDEgMyAyMSAxMiAxMSAxNyAyMiAxMSA3IDUgCisyMSAxNCAxNSAxOSAyMCAxMiA2IDEyIDE4IDE5IDQgNyAxMiAxMCA1IDIyIDMgMTUgMjEgNyAyMyA3IDE4IF4KKzQzIDEgMjIgNCAxOCAxOCAzIDI0IDEwIDE3IDI0IDIzIDE4IDYgMTEgMTggMjIgOCA2IDYgMiAxMiAxMCAxNCAxMiA5IDIgMjMgMTYgMjAgCisxNCAxNyA5IDE2IDcgMjEgNiAyMiAyNCAxOSAxMSA5IDE5IDIxIDYgXgorNDkgMSAxMSAxOSAyIDIgNyA4IDEwIDggOSA4IDE1IDkgMTQgNiAxNiA4IDIxIDIxIDIyIDYgMTcgOSA0IDI0IDIxIDE1IDE1IDE2IDE2IAorMTMgOSAxMCAxNiAxNCAxMiA3IDEyIDE1IDE1IDUgMTAgMTAgMjMgNSAxMyAyMiAzIDUgMjIgXgorNTIgMCA0IDExIDE0IDcgNiAxMCAxNyAxNCA2IDMgMTMgMTggMTYgMyA1IDE1IDIzIDggNSAzIDE4IDggMTIgMjAgMjAgOSAyIDEzIDI0IAorMTcgMiAyIDE3IDMgMTMgMjAgMiA2IDMgMTUgNyAxMyAxIDE4IDcgMjIgMTggMjQgMjAgMTQgNyAyMyBeCis0NSAxIDE2IDIwIDMgMTEgNiA1IDIgMTggMTQgMTYgMjIgMTQgMTEgNyAxOCAxNiAxNyAyNCAxMiAxMiAzIDEzIDE5IDE2IDIyIDQgMTYgCis0IDYgMjMgOCAxOCAxMSAyIDMgMjAgMjIgOSAyMSA4IDIzIDEgMjMgMjAgMjMgXgorNTEgMSAxNiAxMyAyMyA0IDEzIDMgNyA0IDIzIDYgMTMgMTkgMiAzIDcgMiA5IDkgMTUgNiAxMyA0IDIyIDYgMTkgMjAgMSA5IDcgMTQgMSAKKzE1IDMgMjMgMjQgMjIgMTggMTIgMTIgMTcgMTkgMTAgOCAxMSAyMiAxMiAxMCAyIDIwIDE1IDE1IF4KKzQ4IDEgMTcgMTggNyAxMSAxMiAyMSA2IDEyIDQgNyAxOCAxNyAzIDIgMTQgMjQgMTQgMSAyMyAxIDExIDE1IDEwIDYgMTggMjAgNyAxIDggCisxIDE2IDYgMjAgMjMgMjMgMjEgMTAgMTAgMTIgMjQgMTAgMTEgMjMgMiAxMiAyMyA5IDIwIF4KKzQ5IDEgMjQgMjQgMTkgMTQgMTAgMTggMTUgMTQgNSAxNiAxMSAyMiAyIDE1IDI0IDggMjIgMSA0IDI0IDkgMTAgMTUgMyA5IDUgNCAxNyAKKzE1IDkgMTIgMTkgMTkgMSAzIDEwIDYgOCAzIDE3IDggMTggMjQgMTkgMyA0IDE1IDQgMjQgXgorNDMgMCAyIDI0IDUgMjAgMTMgNyAyMCAxNyAxOSAyMiAxMyA4IDEwIDE5IDE1IDExIDEgMTQgMTcgMjAgMjIgMTAgNyAxMSAxNiA5IDIxIAorMjIgMTcgMjMgMTIgMTUgNCAyNCA3IDIxIDE4IDIgMjEgMTYgMSAxOSAxMSBeCis0OCAxIDIwIDExIDMgMTUgMTkgMTggMSA2IDE0IDUgNSA1IDE5IDEzIDEwIDI0IDE5IDE2IDI0IDE1IDEzIDIgMTkgMTUgMjQgMjEgMTcgCis0IDEzIDE3IDEgMSA5IDEgMTAgMiAxOCAxIDIxIDE5IDUgMTggMTIgMiAyMiAxNiAyMyAxOSBeCis1MCAxIDE5IDYgMTggOSAxIDIzIDIyIDIxIDEzIDE0IDExIDE4IDEyIDEzIDMgMTkgOSAyMCAyMiAyMCAyIDExIDEyIDYgMSAxMiAxNiAKKzE4IDIgOSA4IDQgMyAxMSAxNyAxMSA1IDQgMTkgMTYgMTEgMjMgMTMgMTggMSAyMCA4IDIgMTYgMTYgXgorNDggMSAxNiAyMSA0IDE5IDUgNSAyMCAyNCAxMyAyMyA2IDI0IDUgMTcgMTIgNSAxIDE1IDE3IDE3IDIxIDExIDEzIDkgMjMgMTEgMTQgCisyMSA3IDYgOSA2IDE0IDcgMTYgMiAxNyAxIDI0IDIzIDQgMTIgMTQgNCAyIDExIDIzIDE1IF4KKzUwIDEgNCAyMyAyMSAyMSAxNiAxNSAxMyAxNSAxNCAxNSA4IDE0IDkgMTcgNyAxNSAyIDIzIDIgMSAxNyA2IDE0IDE5IDI0IDIgOCA4IDcgCis3IDEwIDE0IDEzIDcgOSAxMSAxNiAxMSA4IDggMTggMTMgMTMgMTggMTAgMSAyMCAxOCAyMiAzIF4KKzQ0IDEgMTIgOSAxNiAxNyAxMyA2IDkgMTcgMjAgMTAgNSA3IDIwIDE4IDggMTUgMjMgMjEgMjAgNSAxNSAxMSAzIDMgMTQgMjEgMTAgMjQgCis2IDIxIDIxIDYgMjMgMTAgMyAyMSAyMyAxNyAyMCA4IDE2IDEwIDIyIDEyIF4KKzUzIDAgMTYgMSA1IDI0IDMgOSAxNiA2IDcgMyAyMCAxMiAxNyAxOCAyMSA1IDkgNyAxIDkgMTIgMTkgNSA3IDYgMjQgMTEgMTEgMjAgMjMgCisxMCA0IDcgMSAxOSA3IDE5IDE3IDIzIDE1IDUgMTIgMjEgMjAgMyAxIDE0IDIgMTUgMjIgMyAxNiA5IF4KKzQ2IDEgMTAgMTkgMTAgMjAgMTYgMTkgMTcgMTAgNCAyMSAyMCAxNiAyMSAxNCAxNCA4IDE3IDEwIDE5IDEgMTcgNCAzIDIyIDIzIDE0IAorMTYgOSAyMiA4IDIwIDI0IDEgNSAxMSAxMSA2IDQgMTMgMTUgMTIgMSAxMSAxMyAyMSAyMSBeCis0NiAwIDggNSA2IDUgMTYgMTIgMTEgMiAxNyAxNCAxOSAyMyAxNiA1IDYgMjAgMjEgOSAyNCA5IDIyIDIzIDIyIDEyIDggMTMgMjMgMTcgCis1IDMgMTYgMjIgMTUgMjIgNyAxNyAzIDIgMTMgMTMgMTEgMjQgMTMgMTIgMjEgNyBeCis0MyAxIDE0IDIwIDI0IDI0IDQgOSAxMyA1IDggOSAxOCA3IDEyIDEgMjEgOCAyNCAxNSAxIDIyIDE5IDI0IDE0IDEzIDggMjAgMTQgMTggCisyMyAxOSA5IDggMTQgMjMgMTEgNCA0IDIyIDIwIDEzIDE3IDE1IDI0IF4KKzU1IDAgNiAxNSA4IDI0IDQgMjAgMTkgOCAxOSAxNCAyMSAyNCAxOCAzIDEwIDE2IDMgNiA0IDEgMTAgMTUgMTMgNCA4IDEyIDIyIDkgNiAKKzMgMSAxMyAxNiAxMiAyMyAxMCAxNCAyIDEgNiAxMSA4IDE5IDI0IDE2IDIgNSAyMSAyIDcgMjIgNCA1IDIzIDQgXgorNTUgMSAxMiAyMCA4IDQgNSAxNyA5IDE4IDE4IDE4IDQgMTAgMTMgMiA0IDcgMjQgOCAxMCAyMSA0IDggMjQgMiA2IDE5IDEwIDYgMjIgCisyMiAxNCAyMiAxMyAyMSA1IDIyIDIgNCAxOCA1IDExIDIxIDEgNyA4IDQgMTcgNSAxNCAxIDIgMTAgOSAxMiAxNCBeCis0OSAwIDExIDEwIDIwIDQgMTQgMyAxIDMgMjEgMTIgMTEgMTcgMjIgMTEgNyA1IDIxIDE0IDE1IDE5IDIwIDEyIDYgMTIgMTggMTkgNCA3IAorMTIgMTAgNSAyMiAzIDE1IDIxIDcgMjMgNyAyIDIyIDQgMTggMTggMyAyNCAxMCAxNyAyNCAxMiBeCis1MCAwIDE4IDYgMTEgMTggMjIgOCA2IDYgMiAxMiAxMCAxNCAxMiA5IDIgMjMgMTYgMjAgMTQgMTcgOSAxNiA3IDIxIDYgMjIgMjQgMTkgCisxMSA5IDE5IDIxIDE1IDExIDE5IDIgMiA3IDggMTAgOCA5IDggMTUgOSAxNCA2IDE2IDggMjIgXgorNTEgMSAyMSAyMiA2IDE3IDkgNCAyNCAyMSAxNSAxNSAxNiAxNiAxMyA5IDEwIDE2IDE0IDEyIDcgMTIgMTUgMTUgNSAxMCAxMCAyMyA1IAorMTMgMjIgMyA1IDEgNCAxMSAxNCA3IDYgMTAgMTcgMTQgNiAzIDEzIDE4IDE2IDMgNSAxNSAyMyA4IDIxIF4KKzUxIDEgNSAzIDE4IDggMTIgMjAgMjAgOSAyIDEzIDI0IDE3IDIgMiAxNyAzIDEzIDIwIDIgNiAzIDE1IDcgMTMgMSAxOCA3IDIyIDE4IAorMjQgMjAgMTQgNyAxNyAxNiAyMCAzIDExIDYgNSAyIDE4IDE0IDE2IDIyIDE0IDExIDcgMTggMTYgMjAgXgorNTIgMCAyNCAxMiAxMiAzIDEzIDE5IDE2IDIyIDQgMTYgNCA2IDIzIDggMTggMTEgMiAzIDIwIDIyIDkgMjEgOCAyMyAxIDIzIDIwIDcgCisxNiAxMyAyMyA0IDEzIDMgNyA0IDIzIDYgMTMgMTkgMiAzIDcgMiA5IDkgMTUgNiAxMyA0IDIyIDE2IF4KKzQ5IDEgMTkgMjAgMSA5IDcgMTQgMSAxNSAzIDIzIDI0IDIyIDE4IDEyIDEyIDE3IDE5IDEwIDggMTEgMjIgMTIgMTAgMiAyMCAxNSAxOCAKKzE3IDE4IDcgMTEgMTIgMjEgNiAxMiA0IDcgMTggMTcgMyAyIDE0IDI0IDE0IDEgMjMgMSAxMSAxNiBeCis0NyAwIDEwIDYgMTggMjAgNyAxIDggMSAxNiA2IDIwIDIzIDIzIDIxIDEwIDEwIDEyIDI0IDEwIDExIDIzIDIgMTIgMjMgOSAzIDI0IDI0IAorMTkgMTQgMTAgMTggMTUgMTQgNSAxNiAxMSAyMiAyIDE1IDI0IDggMjIgMSA0IDI0IDMgXgorNDUgMCAxNyA2IDI0IDExIDcgMjEgOSAxNyA4IDI1IDUgNSAyMiAxNiAxMyA1IDIgMTYgNCAyNSAyNSA4IDE4IDEzIDEzIDMgMSAyMiAyMyAKKzI0IDE4IDEyIDIxIDE5IDIgNCAyNCAxMyAxMSAyIDcgMjQgMjIgMTcgMjEgXgorNDYgMSAxNSAxIDggMyAxMCAxNSAxOCAxNSA4IDEwIDE2IDIwIDIwIDcgMTggMjIgMTEgMTggOSAxMSAxNSAyMiAyMCAxOCA2IDI0IDE1IAorMjUgNCAyMiAxMiAxNyA0IDYgMTcgMjAgMiA0IDIgNSAyMCAxNSAxOSAyNCAxOCAxNSBeCis1MiAxIDggMiA1IDIzIDIgMTAgMjEgOCA1IDIgOSAxNiAxNiAxNSA2IDIyIDIzIDUgNiAyMSA1IDIxIDI0IDMgNiAxMCAxNyAxOSA5IDE1IAorMTEgMjMgMTYgMTcgMSAzIDEyIDMgMjAgNCA1IDUgMyAyMSAyMiAxNSA0IDIxIDIwIDcgMjIgMTggXgorNDMgMCA5IDI0IDQgMTggNyA3IDI1IDI0IDIyIDIxIDIzIDI0IDE0IDIwIDEyIDYgNyA0IDIgMTIgMjUgMTUgMyA5IDIzIDggMTYgMjUgCisxMSAxNCA0IDEwIDE5IDIzIDE2IDEzIDkgMjAgMjUgMTcgMTEgOCAxOSBeCis1NSAwIDE5IDI1IDE3IDcgMTYgMjEgNiA0IDggMiAxNSA5IDIgOSAxOSAzIDYgMyAzIDEwIDI1IDEzIDE1IDcgOCAyMCAyMSAxMiAxMCAKKzEyIDUgMjQgMTEgMjAgMyAxMyAxMyAxNiA5IDEzIDEwIDMgOSAxNiAzIDcgMTUgOSA5IDE0IDIgMTMgMTcgMjUgMyBeCis0NiAwIDE4IDUgMTkgMjMgOSAyNSA5IDEwIDIzIDEyIDEyIDcgMTMgOCAxNSA3IDEgNiAyMSAyIDggNyA2IDE2IDE0IDE0IDEyIDE1IDEzIAorMjQgMTAgMTUgMTEgMTAgOCAxNCAxNSAyMSAyNSAyMSAxNiA5IDE4IDIwIDIyIDIxIF4KKzUwIDEgMjAgMTEgMTQgMjMgMjIgMTAgMTMgMTQgOCAxOSAxMiAyIDExIDIwIDIzIDEzIDQgMTAgNiA1IDcgMjMgMTEgMyAxNiA4IDIxIDQgCis4IDE4IDUgMTIgMTQgOCA2IDIwIDE5IDI0IDggMjMgMTcgMyA3IDE5IDEgMTggMSAxNCAyMiAxMSBeCis0NCAxIDE0IDUgOCAyMiAxOCAxNCAyNSAxNyAxMSAxMiAyMiAyIDEyIDEyIDE2IDEyIDEzIDE4IDE3IDEyIDE3IDE0IDE4IDggMjUgOSAKKzIzIDUgMyA4IDE0IDI0IDE3IDcgMyAzIDIzIDE3IDIyIDE5IDE5IDE3IDE2IDE5IF4KKzUxIDAgMjQgMTQgMTYgMjAgMjMgMjAgOSAxOSAxNiA3IDEyIDE2IDUgOCA5IDcgMTAgMjEgMjQgMTAgMTEgMTkgMSAyMSAxNCAxNCAxOSAKKzMgMjIgOCAxMiAyMCAxIDE4IDUgNiA1IDEyIDE0IDEgMSAxMSA5IDIyIDMgMjQgOSA2IDEgMTEgMjAgXgorNDcgMCAxIDEyIDggMTEgMTEgMTcgMTAgMjIgNyAzIDEwIDIgNiA0IDI0IDE2IDI0IDE5IDQgNSAxOCAxMSAxMiA5IDIwIDIxIDI1IDIgCisyMSAxOCAxMCAyMCAyNSAyMSAzIDE3IDE3IDUgOCAyMiAyNSAxOSA4IDEwIDE5IDcgMjUgXgorNTUgMSA0IDggMTggMyAxOCAzIDExIDI0IDIgMTQgOSAxIDEwIDQgNCAxMyAxOSAyMiA0IDcgMTkgNSAxMCAxMCAxIDggMjIgMjIgNiA4IAorMTMgMTIgMTEgMTcgMjMgMTQgMTYgNyA1IDExIDIyIDI0IDcgMiAxMSAxMyAxOCA0IDIwIDggMSA2IDI1IDIwIDE2IF4KKzUxIDEgMjAgMSAyNSAxMCAxNSAxNSAyIDE3IDEzIDkgMjQgMTcgMjQgMjAgMTMgMTUgMTcgMyAxMSAyMCAxMCA1IDEzIDIzIDE4IDUgMyAKKzE4IDE1IDcgNSA3IDQgMTUgMjAgMTYgMiAxNyAxIDcgNCAxMiA3IDI1IDE0IDEgNCA3IDE5IDE5IDIyIF4KKzUyIDAgMyAxMyAxMiA0IDMgMTQgNCAxNCAxMSA2IDMgMjUgMTggMTYgMjAgMjQgMTIgMTkgMTggMjUgNiAyMyA2IDE1IDUgNCA0IDYgMTQgCisxMyAyMCA1IDE0IDE1IDIgMTMgMjEgMTEgNSAxNyAyIDIgMTAgMTEgMTMgMTQgMTIgMTEgMjEgMTUgMjMgMjAgXgorNTAgMSAyIDUgNyAyMyAxMCAyMCA2IDEyIDEgMTkgMTAgMjQgMjEgMjIgMjUgMTYgMTIgMTkgMjIgMTUgMTAgMTggMjQgMSA1IDE2IDEwIAorMTggMiAxOSAxNCAzIDUgMSA3IDIwIDcgMTYgNiAyMCA2IDYgMjUgMTAgMjIgMjAgMiAxIDE1IDE4IF4KKzQ4IDAgMjMgMjUgMjMgNCAxMSAxNSAxNSA2IDkgMjIgMjIgMTkgMjIgMjUgNiAxOSA2IDIgMjAgMjEgNyAyMiAxOCAxMCA3IDE3IDQgMTYgCisxMiAxMCAyNSAxMiAyMyAyMyA5IDIgMjIgMSAyMCAyIDggMyAxNCA3IDEgMiAzIDI0IF4KKzM4IDEgMjEgMjEgMjMgMjAgMjIgMTEgMjUgMjAgMjQgMjUgMSA5IDIxIDIwIDE0IDEwIDE0IDE5IDkgMTcgMTUgMTMgNSAxNSAyNCAyMSAKKzEyIDEzIDI1IDIyIDIxIDEgMTYgMjMgNyAyNCAxNSAyMiBeCis1NCAxIDIyIDUgMjUgMyA0IDIgOSAxMiAyNCA2IDE5IDEgMTQgOSA1IDkgMSAxNyA5IDQgMjMgMjEgMSAzIDE1IDE2IDExIDEgMTIgMTggCis2IDIgNyA4IDE3IDggMjEgMTMgMjIgOSAyMSA0IDkgMSAxMyAxNyAyMSAxMCA5IDE4IDI0IDIzIDEzIDI0IF4KKzQzIDEgMjMgMjMgMTkgMjMgMjIgMTcgMTggMjMgMTggMjEgMTcgMSAxMCAxMiA0IDYgMSAyMSAxMSAxOCAyIDYgNiAxMiAxOCAxMyAxNiAKKzE2IDE4IDE5IDEzIDExIDIxIDE5IDE1IDEyIDE1IDE2IDE5IDIgMjMgMTkgMjMgXgorNDggMCAxIDIgMjUgMTQgMTEgMjUgMjQgMTYgOCAxNCAyMSAyMSAxNiA2IDEzIDEgMjMgMTUgOCAxNyA0IDMgNCA5IDIzIDEyIDggOCAyNCAKKzEzIDYgMTEgMyA4IDI0IDE5IDggMjMgMSAyNCAyNCAxOCAyNSAxMyAyIDYgMjUgMTQgXgorNTEgMSA5IDMgNSAxMSAxOSAxMSAxNiA1IDQgMTcgMjQgMjMgMTUgMTQgMTAgNyAxNCAxNyAyNSAxNSAxMCAxNCA2IDE4IDE4IDQgMSAxMyAKKzEwIDE2IDEgMjUgMTYgMiAyNCA1IDEgMTcgNiAxNyA2IDI0IDExIDcgMjEgOSAxNyA4IDI1IDUgMjMgXgorNDggMSAyMiAxNiAxMyA1IDIgMTYgNCAyNSAyNSA4IDE4IDEzIDEzIDMgMSAyMiAyMyAyNCAxOCAxMiAyMSAxOSAyIDQgMjQgMTMgMTEgMiAKKzcgMjQgMjIgMTcgNSAxNSAxIDggMyAxMCAxNSAxOCAxNSA4IDEwIDE2IDIwIDIwIDcgMjUgXgorNDkgMCAyMiAxMSAxOCA5IDExIDE1IDIyIDIwIDE4IDYgMjQgMTUgMjUgNCAyMiAxMiAxNyA0IDYgMTcgMjAgMiA0IDIgNSAyMCAxNSAxOSAKKzI0IDE4IDkgOCAyIDUgMjMgMiAxMCAyMSA4IDUgMiA5IDE2IDE2IDE1IDYgMjIgMjMgMTcgXgorNDcgMSA2IDIxIDUgMjEgMjQgMyA2IDEwIDE3IDE5IDkgMTUgMTEgMjMgMTYgMTcgMSAzIDEyIDMgMjAgNCA1IDUgMyAyMSAyMiAxNSA0IAorMjEgMjAgNyAyMiAxNCA5IDI0IDQgMTggNyA3IDI1IDI0IDIyIDIxIDIzIDI0IDE0IF4KKzUzIDAgMjAgMTIgNiA3IDQgMiAxMiAyNSAxNSAzIDkgMjMgOCAxNiAyNSAxMSAxNCA0IDEwIDE5IDIzIDE2IDEzIDkgMjAgMjUgMTcgMTEgCis4IDQgMTkgMjUgMTcgNyAxNiAyMSA2IDQgOCAyIDE1IDkgMiA5IDE5IDMgNiAzIDMgMTAgMjUgMTMgMTUgXgorNTQgMSA3IDggMjAgMjEgMTIgMTAgMTIgNSAyNCAxMSAyMCAzIDEzIDEzIDE2IDkgMTMgMTAgMyA5IDE2IDMgNyAxNSA5IDkgMTQgMiAxMyAKKzE3IDI1IDIgMTggNSAxOSAyMyA5IDI1IDkgMTAgMjMgMTIgMTIgNyAxMyA4IDE1IDcgMSA2IDIxIDIgOCAyNSBeCis0NCAxIDYgMTYgMTQgMTQgMTIgMTUgMTMgMjQgMTAgMTUgMTEgMTAgOCAxNCAxNSAyMSAyNSAyMSAxNiA5IDE4IDIwIDIyIDIxIDIwIDExIAorMTQgMjMgMjIgMTAgMTMgMTQgOCAxOSAxMiAyIDExIDIwIDIzIDEzIDQgMTAgNiAyNSBeCis0OSAxIDcgMjMgMTEgMyAxNiA4IDIxIDQgOCAxOCA1IDEyIDE0IDggNiAyMCAxOSAyNCA4IDIzIDE3IDMgNyAxOSAxIDE4IDEgMTQgMjIgCisxMyAxNCA1IDggMjIgMTggMTQgMjUgMTcgMTEgMTIgMjIgMiAxMiAxMiAxNiAxMiAxMyAxOCAyNSBeCis0NSAxIDEyIDE3IDE0IDE4IDggMjUgOSAyMyA1IDMgOCAxNCAyNCAxNyA3IDMgMyAyMyAxNyAyMiAxOSAxOSAxNyAxNiAyMiAyNCAxNCAKKzE2IDIwIDIzIDIwIDkgMTkgMTYgNyAxMiAxNiA1IDggOSA3IDEwIDIxIDI0IDcgXgorNTggMCAxMSAxOSAxIDIxIDE0IDE0IDE5IDMgMjIgOCAxMiAyMCAxIDE4IDUgNiA1IDEyIDE0IDEgMSAxMSA5IDIyIDMgMjQgOSA2IDEgCisxMSAxNiAxIDEyIDggMTEgMTEgMTcgMTAgMjIgNyAzIDEwIDIgNiA0IDI0IDE2IDI0IDE5IDQgNSAxOCAxMSAxMiA5IDIwIDIxIDcgXgorNTQgMSAyIDIxIDE4IDEwIDIwIDI1IDIxIDMgMTcgMTcgNSA4IDIyIDI1IDE5IDggMTAgMTkgNyAxMSA0IDggMTggMyAxOCAzIDExIDI0IAorMiAxNCA5IDEgMTAgNCA0IDEzIDE5IDIyIDQgNyAxOSA1IDEwIDEwIDEgOCAyMiAyMiA2IDggMTMgMTIgMTEgMjEgXgorNDcgMSAyMyAxNCAxNiA3IDUgMTEgMjIgMjQgNyAyIDExIDEzIDE4IDQgMjAgOCAxIDYgMjUgMjAgMTcgMjAgMSAyNSAxMCAxNSAxNSAyIAorMTcgMTMgOSAyNCAxNyAyNCAyMCAxMyAxNSAxNyAzIDExIDIwIDEwIDUgMTMgMjMgMTggMjEgXgorNTcgMSAzIDE4IDE1IDcgNSA3IDQgMTUgMjAgMTYgMiAxNyAxIDcgNCAxMiA3IDI1IDE0IDEgNCA3IDE5IDE5IDIwIDMgMTMgMTIgNCAzIAorMTQgNCAxNCAxMSA2IDMgMjUgMTggMTYgMjAgMjQgMTIgMTkgMTggMjUgNiAyMyA2IDE1IDUgNCA0IDYgMTQgMTMgMjAgNyBeCis1MSAxIDE0IDE1IDIgMTMgMjEgMTEgNSAxNyAyIDIgMTAgMTEgMTMgMTQgMTIgMTEgMjEgMTUgMjMgMyAyIDUgNyAyMyAxMCAyMCA2IDEyIAorMSAxOSAxMCAyNCAyMSAyMiAyNSAxNiAxMiAxOSAyMiAxNSAxMCAxOCAyNCAxIDUgMTYgMTAgMTggMiAxOSA4IF4KKzQ5IDAgMyA1IDEgNyAyMCA3IDE2IDYgMjAgNiA2IDI1IDEwIDIyIDIwIDIgMSAxNSAxNCAyMyAyNSAyMyA0IDExIDE1IDE1IDYgOSAyMiAKKzIyIDE5IDIyIDI1IDYgMTkgNiAyIDIwIDIxIDcgMjIgMTggMTAgNyAxNyA0IDE2IDEyIDI0IF4KKzQ2IDAgMTAgMjUgMTIgMjMgMjMgOSAyIDIyIDEgMjAgMiA4IDMgMTQgNyAxIDIgMyAxOSAyMSAyMSAyMyAyMCAyMiAxMSAyNSAyMCAyNCAKKzI1IDEgOSAyMSAyMCAxNCAxMCAxNCAxOSA5IDE3IDE1IDEzIDUgMTUgMjQgMjEgMTQgXgorNTUgMCAxMyAyNSAyMiAyMSAxIDE2IDIzIDcgMjQgMTUgMyAyMiA1IDI1IDMgNCAyIDkgMTIgMjQgNiAxOSAxIDE0IDkgNSA5IDEgMTcgOSAKKzQgMjMgMjEgMSAzIDE1IDE2IDExIDEgMTIgMTggNiAyIDcgOCAxNyA4IDIxIDEzIDIyIDkgMjEgNCA5IDIyIF4KKzQ1IDEgMTMgMTcgMjEgMTAgOSAxOCAyNCAyMyAxMyA3IDIzIDIzIDE5IDIzIDIyIDE3IDE4IDIzIDE4IDIxIDE3IDEgMTAgMTIgNCA2IDEgCisyMSAxMSAxOCAyIDYgNiAxMiAxOCAxMyAxNiAxNiAxOCAxOSAxMyAxMSAyMSAxOSA4IF4KKzUwIDEgMTIgMTUgMTYgMTkgMiAyMyAxOSA0IDEgMiAyNSAxNCAxMSAyNSAyNCAxNiA4IDE0IDIxIDIxIDE2IDYgMTMgMSAyMyAxNSA4IAorMTcgNCAzIDQgOSAyMyAxMiA4IDggMjQgMTMgNiAxMSAzIDggMjQgMTkgOCAyMyAxIDI0IDI0IDEyIF4KKzUzIDAgMjUgMTMgMiA2IDI1IDcgOSAzIDUgMTEgMTkgMTEgMTYgNSA0IDE3IDI0IDIzIDE1IDE0IDEwIDcgMTQgMTcgMjUgMTUgMTAgMTQgCis2IDE4IDE4IDQgMSAxMyAxMCAxNiAxIDI1IDE2IDIgMjQgNSAxIDE3IDYgMTcgNiAyNCAxMSA3IDIxIDkgMTkgXgorNTEgMSA4IDI1IDUgNSAyMiAxNiAxMyA1IDIgMTYgNCAyNSAyNSA4IDE4IDEzIDEzIDMgMSAyMiAyMyAyNCAxOCAxMiAyMSAxOSAyIDQgCisyNCAxMyAxMSAyIDcgMjQgMjIgMTcgNSAxNSAxIDggMyAxMCAxNSAxOCAxNSA4IDEwIDE2IDIwIDIwIDggXgorNTAgMSAxOCAyMiAxMSAxOCA5IDExIDE1IDIyIDIwIDE4IDYgMjQgMTUgMjUgNCAyMiAxMiAxNyA0IDYgMTcgMjAgMiA0IDIgNSAyMCAxNSAKKzE5IDI0IDE4IDkgOCAyIDUgMjMgMiAxMCAyMSA4IDUgMiA5IDE2IDE2IDE1IDYgMjIgMjMgMTggXgorNDggMSA2IDIxIDUgMjEgMjQgMyA2IDEwIDE3IDE5IDkgMTUgMTEgMjMgMTYgMTcgMSAzIDEyIDMgMjAgNCA1IDUgMyAyMSAyMiAxNSA0IAorMjEgMjAgNyAyMiAxNCA5IDI0IDQgMTggNyA3IDI1IDI0IDIyIDIxIDIzIDI0IDE0IDE5IF4KKzU1IDAgMTIgNiA3IDQgMiAxMiAyNSAxNSAzIDkgMjMgOCAxNiAyNSAxMSAxNCA0IDEwIDE5IDIzIDE2IDEzIDkgMjAgMjUgMTcgMTEgOCAKKzQgMTkgMjUgMTcgNyAxNiAyMSA2IDQgOCAyIDE1IDkgMiA5IDE5IDMgNiAzIDMgMTAgMjUgMTMgMTUgNyA4IDI0IF4KKzU2IDAgMjEgMTIgMTAgMTIgNSAyNCAxMSAyMCAzIDEzIDEzIDE2IDkgMTMgMTAgMyA5IDE2IDMgNyAxNSA5IDkgMTQgMiAxMyAxNyAyNSAKKzIgMTggNSAxOSAyMyA5IDI1IDkgMTAgMjMgMTIgMTIgNyAxMyA4IDE1IDcgMSA2IDIxIDIgOCA3IDYgMTYgMTQgMTQgMjIgXgorNDcgMCAxNSAxMyAyNCAxMCAxNSAxMSAxMCA4IDE0IDE1IDIxIDI1IDIxIDE2IDkgMTggMjAgMjIgMjEgMjAgMTEgMTQgMjMgMjIgMTAgCisxMyAxNCA4IDE5IDEyIDIgMTEgMjAgMjMgMTMgNCAxMCA2IDUgNyAyMyAxMSAzIDE2IDggMjEgMTIgXgorNDkgMCA0IDggMTggNSAxMiAxNCA4IDYgMjAgMTkgMjQgOCAyMyAxNyAzIDcgMTkgMSAxOCAxIDE0IDIyIDEzIDE0IDUgOCAyMiAxOCAxNCAKKzI1IDE3IDExIDEyIDIyIDIgMTIgMTIgMTYgMTIgMTMgMTggMTcgMTIgMTcgMTQgMTggOCAyNSAyMiBeCis0NiAxIDIzIDUgMyA4IDE0IDI0IDE3IDcgMyAzIDIzIDE3IDIyIDE5IDE5IDE3IDE2IDIyIDI0IDE0IDE2IDIwIDIzIDIwIDkgMTkgMTYgCis3IDEyIDE2IDUgOCA5IDcgMTAgMjEgMjQgMTAgMTEgMTkgMSAyMSAxNCAxNCAxOSAyMCBeCis1NyAxIDIyIDggMTIgMjAgMSAxOCA1IDYgNSAxMiAxNCAxIDEgMTEgOSAyMiAzIDI0IDkgNiAxIDExIDE2IDEgMTIgOCAxMSAxMSAxNyAKKzEwIDIyIDcgMyAxMCAyIDYgNCAyNCAxNiAyNCAxOSA0IDUgMTggMTEgMTIgOSAyMCAyMSAyNSAyIDIxIDE4IDEwIDIwIDI1IDcgXgorNTYgMSAzIDE3IDE3IDUgOCAyMiAyNSAxOSA4IDEwIDE5IDcgMTEgNCA4IDE4IDMgMTggMyAxMSAyNCAyIDE0IDkgMSAxMCA0IDQgMTMgCisxOSAyMiA0IDcgMTkgNSAxMCAxMCAxIDggMjIgMjIgNiA4IDEzIDEyIDExIDE3IDIzIDE0IDE2IDcgNSAxMSAyMiAyNCAxOCBeCis1NCAxIDIgMTEgMTMgMTggNCAyMCA4IDEgNiAyNSAyMCAxNyAyMCAxIDI1IDEwIDE1IDE1IDIgMTcgMTMgOSAyNCAxNyAyNCAyMCAxMyAKKzE1IDE3IDMgMTEgMjAgMTAgNSAxMyAyMyAxOCA1IDMgMTggMTUgNyA1IDcgNCAxNSAyMCAxNiAyIDE3IDEgNyA0IDIzIF4KKzU2IDAgNyAyNSAxNCAxIDQgNyAxOSAxOSAyMCAzIDEzIDEyIDQgMyAxNCA0IDE0IDExIDYgMyAyNSAxOCAxNiAyMCAyNCAxMiAxOSAxOCAKKzI1IDYgMjMgNiAxNSA1IDQgNCA2IDE0IDEzIDIwIDUgMTQgMTUgMiAxMyAyMSAxMSA1IDE3IDIgMiAxMCAxMSAxMyAxNCAyNCBeCis0OSAwIDEyIDExIDIwIDMgMTQgMiAzIDIgMjMgMTIgMTIgMTcgMjQgMTEgOCA2IDI0IDE2IDE1IDIyIDIxIDE0IDYgMTIgMjAgMTkgNSA1IAorMTIgMTEgNiAyMyAyIDE2IDIzIDcgMjQgNiAyMSAyIDE3IDE3IDUgMjUgMTEgMjUgMjAgMjUgMTkgXgorNTQgMCAxOCA2IDEyIDE5IDI1IDcgNiA1IDIgMTQgMTIgMTYgMSAxNSA3IDEgMjYgMTkgMTkgMTMgMjAgMTEgMTcgNiAyMCA1IDI0IDI0IAorMSAyMSAxMSA5IDIwIDIxIDE1IDEwIDE5IDI2IDMgMiA2IDcgMTIgOSAxMCA4IDE0IDEwIDE1IDUgMTcgOCAyMSA3IF4KKzU2IDAgMjAgMjUgNiAxOSA4IDMgMjIgMTYgMTYgMTYgMTcgMTMgMTEgMTAgMTcgMTUgMTIgNiAxMyAxNCAxNyA0IDEyIDEwIDI0IDUgMTMgCisyNCAzIDUgMiA1IDExIDE0IDggNSAxMCAxNyAxNiA4IDQgMTQgMjEgMTUgMyA2IDE3IDI1IDggMiAzIDMgMTkgMTAgMTMgMjMgXgorNTEgMSAyMiA4IDIgMTMgMjUgMTcgMiAxIDE5IDEgMTQgMjAgMiA1IDQgMTUgOCAxNCAyMCA3IDI1IDIwIDI2IDIwIDE2IDcgMTcgMTcgCisyMiAxIDEzIDYgNSAxIDE4IDE0IDE1IDIzIDE1IDEwIDUgMTkgMTggMTggMjYgMTIgMTMgMyAyNSAxMiAxOCBeCis1MSAxIDE2IDI0IDQgMTYgMyA2IDI2IDI2IDEwIDIwIDEzIDEgMjAgMjQgMTAgMjEgNyAyNSAyIDI1IDIyIDkgMTUgMTYgMjYgNSAxMiAxIAorNyA0IDI0IDcgMTQgMjAgMSA0IDcgMyAxMCAxMCAxNSA2IDEzIDYgMjIgNiAyMCAyMiAyIDI2IDI2IF4KKzQ3IDEgNiAxNCAxIDE2IDMgMjQgMjUgMjQgMTcgMTIgMTQgMTggMTggOSA5IDExIDIyIDEzIDkgMiAyMiAxNSAyMCAyMCAxOCA4IDEzIAorMTMgMjEgOCAxMSA1IDI2IDggMTkgMTcgNCAyIDE1IDI2IDEzIDI0IDI2IDExIDE2IDkgMjQgXgorNTIgMCA4IDE4IDIxIDYgMSA4IDEgMTYgNCAyMCAyMyAyMyAyNCAxMCAxMSAxMiAxMCAxMCAyNSAxIDExIDI1IDEwIDMgMjYgMjYgMjAgCisxNSAxMSAxOSAxNiAxNyAzIDE2IDEyIDI1IDE1IDkgMjMgMSAyIDI0IDggMTAgMTggMiA5IDUgNCAxNyAxNiAxMiBeCis1MCAwIDEyIDIwIDIwIDEgMyAxMSA1IDkgMyAxNyA5IDE3IDI0IDIxIDMgNCAxNiAyIDEwIDEgMjUgNSAyMiAxNiA2IDIxIDE5IDIxIDIzIAorMTUgOSA5IDIxIDE3IDExIDEgMTUgMTcgMjMgMjQgMTEgNyAxMCAyNiAxNSA4IDIyIDIyIDE4IDE2IF4KKzQ4IDAgMTEgMTcgNSAyNiA3IDIzIDE5IDMgMjQgMTcgMiAxOSAxOCAyNiAyMSAxMiA1IDE4IDIyIDIwIDcgMTUgNiA0IDUgMjAgMTMgMTAgCisyMyAxOCAxNiAyNSAxOCAxNSAyIDIwIDE0IDI0IDIyIDE3IDMgMTUgMTYgMSAxMCAyIDEyIDE2IF4KKzQ3IDAgMjEgMSAyMSAyMSA0IDE4IDEzIDEgMjQgMTggMjMgMTcgMTkgNiAxOSA5IDI2IDI1IDIzIDIzIDE0IDEzIDEzIDIwIDEyIDEzIDQgCisyMSAxMCAyMiAyMSAyMiAxIDEyIDEyIDcgMTMgMTYgMTggOCA5IDQgMyAxMCAxOCAxMiAyNSBeCis0NyAxIDUgMTkgMTkgMTIgMjQgMTMgMTggMSAyMiA4IDEgMTcgMTggMjQgMyAyMiA3IDcgMTkgMjYgMTMgMjYgNiAyNiA2IDE4IDEyIDUgCisyNiAxNyAxOCAxOSAyMiAxMCAxMiA4IDIzIDExIDE3IDIzIDI1IDUgNSAxMSA0IDEzIDIwIF4KKzUyIDAgMTggNCAxOSAyMyAzIDEzIDE1IDQgMyA5IDI0IDE0IDUgMjUgMjEgMjIgMTggMTcgMTIgMTUgMTQgMTYgMTAgMTQgOSAxOSA3IAorMTYgMyAyMyA0IDI2IDE4IDUgMTYgMjEgMjQgMiA4IDggOCA3IDExIDEzIDE0IDcgOSAxMiAxOCAxMSAxMCAyMCBeCis0NyAxIDIwIDEyIDE0IDE5IDExIDIxIDIxIDIyIDE5IDEzIDEwIDE2IDE5IDE0IDcgOCAxNiAyMCAxMCAzIDkgMjMgMTggNyAyNiAxNiAKKzIyIDIxIDIxIDUgMTQgMTEgMiAyIDE2IDIyIDExIDI2IDcgMjIgMjMgNSAyMyAxMCA0IDIyIDUgXgorNTAgMCAxOSAyMCA5IDE2IDEwIDI0IDQgMTkgMjYgNCAyNSA0IDggMTcgNyA3IDIgMjMgMTEgMTggMTkgMjMgNiAxMCA5IDEgOSAxNCAxOSAKKzUgNiA2IDI1IDEyIDExIDIxIDI2IDEyIDMgOCAyMCA4IDIxIDE4IDI1IDI1IDE0IDQgMTEgMjUgXgorNDUgMSAyMyA0IDE0IDMgMTcgMjYgMjIgMjYgMiAxNSA5IDggMjUgMTkgMTIgMjMgMTcgMjAgMTcgMTAgNCAyMyAyMCAxNyAyMSAxNCAxNCAKKzkgMTggMTEgMTggMiAxOCA0IDIgMjIgMjUgMTUgMTggMTAgMjMgOCAyMSAyNiAxNSBeCis1NCAwIDcgMTQgMTAgNiA2IDE1IDE1IDEzIDIgMTEgMTUgMjIgMiA5IDQgNCA2IDE2IDExIDExIDMgMTYgMTMgMTkgMjUgMTYgNSA3IDIwIAorMjIgOSAyNSAxMSAyNCAyNCAyNSAxMyA4IDE1IDIzIDE2IDYgMyAxOCAyMyAxNiAyMyA4IDIwIDQgMSAxIDE0IDE2IF4KKzQzIDEgMTIgMjQgMTQgMTQgMjYgMjMgMTMgMjYgMTQgMjEgMjUgMjUgNCA5IDEzIDUgOCA5IDIxIDggMTIgMjYgMjQgOSAyNCAxNSAxIAorMjMgMjIgMTYgMTQgOCAyMiAxNSAxOSAyNCAyMCA3IDggMTUgMjQgMTIgMTggXgorNTcgMCA0IDIzIDIxIDEzIDE5IDE1IDIxIDcgMTUgNyAzIDIxIDIwIDggMjIgMTQgMjMgMjYgMTkgMiAxMCAxOCAzIDUgMyAxIDkgMTUgCisxNSAzIDcgMTMgMjMgOSA3IDEgMTMgMTcgMTQgMjUgOSAxNiAyIDIgNiAxMyA3IDE5IDI1IDE3IDEgNSAyMSAyIDcgMjIgNSBeCis1NSAxIDYgMjUgMyAxMiAxOSA2IDIgNCAyNCAxNyA5IDE4IDIwIDE5IDQgMTEgMTQgMSA2IDggMjYgNiA5IDIyIDQgMTAgMiA3IDIxIDkgCis4IDI0IDI1IDE0IDIyIDEyIDIyIDMgMjMgMyAzIDIwIDYgMTEgMjMgNiAxIDcgNSAxOCA1IDE1IDI1IDI2IDIzIF4KKzUzIDAgMSAxMCAxMSAxMSA0IDEyIDExIDIwIDMgMTQgMiAzIDIgMjMgMTIgMTIgMTcgMjQgMTEgOCA2IDI0IDE2IDE1IDIyIDIxIDE0IDYgCisxMiAyMCAxOSA1IDUgMTIgMTEgNiAyMyAyIDE2IDIzIDcgMjQgNiAyMSAyIDE3IDE3IDUgMjUgMTEgMjUgMjAgMjYgXgorNTQgMCAyNCAxOCA2IDEyIDE5IDI1IDcgNiA1IDIgMTQgMTIgMTYgMSAxNSA3IDEgMjYgMTkgMTkgMTMgMjAgMTEgMTcgNiAyMCA1IDI0IAorMjQgMSAyMSAxMSA5IDIwIDIxIDE1IDEwIDE5IDI2IDMgMiA2IDcgMTIgOSAxMCA4IDE0IDEwIDE1IDUgMTcgOCAyMyBeCis1OCAwIDEgMjAgMjUgNiAxOSA4IDMgMjIgMTYgMTYgMTYgMTcgMTMgMTEgMTAgMTcgMTUgMTIgNiAxMyAxNCAxNyA0IDEyIDEwIDI0IDUgCisxMyAyNCAzIDUgMiA1IDExIDE0IDggNSAxMCAxNyAxNiA4IDQgMTQgMjEgMTUgMyA2IDE3IDI1IDggMiAzIDMgMTkgMTAgMTMgMjIgMTkgXgorNTIgMSA4IDIgMTMgMjUgMTcgMiAxIDE5IDEgMTQgMjAgMiA1IDQgMTUgOCAxNCAyMCA3IDI1IDIwIDI2IDIwIDE2IDcgMTcgMTcgMjIgMSAKKzEzIDYgNSAxIDE4IDE0IDE1IDIzIDE1IDEwIDUgMTkgMTggMTggMjYgMTIgMTMgMyAyNSAxMiAyMSAxNiAyMiBeCis1NiAxIDQgMTYgMyA2IDI2IDI2IDEwIDIwIDEzIDEgMjAgMjQgMTAgMjEgNyAyNSAyIDI1IDIyIDkgMTUgMTYgMjYgNSAxMiAxIDcgNCAKKzI0IDcgMTQgMjAgMSA0IDcgMyAxMCAxMCAxNSA2IDEzIDYgMjIgNiAyMCAyMiAyIDI2IDkgNiAxNCAxIDE2IDMgMjQgMTIgXgorNTIgMCAyNCAxNyAxMiAxNCAxOCAxOCA5IDkgMTEgMjIgMTMgOSAyIDIyIDE1IDIwIDIwIDE4IDggMTMgMTMgMjEgOCAxMSA1IDI2IDggCisxOSAxNyA0IDIgMTUgMjYgMTMgMjQgMjYgMTEgMTYgOSAxIDggMTggMjEgNiAxIDggMSAxNiA0IDIwIDIzIDUgXgorNTQgMCAyNCAxMCAxMSAxMiAxMCAxMCAyNSAxIDExIDI1IDEwIDMgMjYgMjYgMjAgMTUgMTEgMTkgMTYgMTcgMyAxNiAxMiAyNSAxNSA5IAorMjMgMSAyIDI0IDggMTAgMTggMiA5IDUgNCAxNyAxNiA5IDEyIDIwIDIwIDEgMyAxMSA1IDkgMyAxNyA5IDE3IDI0IDIwIF4KKzQ5IDEgMyA0IDE2IDIgMTAgMSAyNSA1IDIyIDE2IDYgMjEgMTkgMjEgMjMgMTUgOSA5IDIxIDE3IDExIDEgMTUgMTcgMjMgMjQgMTEgNyAKKzEwIDI2IDE1IDggMjIgMjIgMTggMjYgMTEgMTcgNSAyNiA3IDIzIDE5IDMgMjQgMTcgMiAxOSA4IF4KKzQ5IDAgMjYgMjEgMTIgNSAxOCAyMiAyMCA3IDE1IDYgNCA1IDIwIDEzIDEwIDIzIDE4IDE2IDI1IDE4IDE1IDIgMjAgMTQgMjQgMjIgMTcgCiszIDE1IDE2IDEgMTAgMiAxMiAyIDIxIDEgMjEgMjEgNCAxOCAxMyAxIDI0IDE4IDIzIDE3IDE5IDIzIF4KKzUwIDEgMTkgOSAyNiAyNSAyMyAyMyAxNCAxMyAxMyAyMCAxMiAxMyA0IDIxIDEwIDIyIDIxIDIyIDEgMTIgMTIgNyAxMyAxNiAxOCA4IDkgCis0IDMgMTAgMTggMTIgNCA1IDE5IDE5IDEyIDI0IDEzIDE4IDEgMjIgOCAxIDE3IDE4IDI0IDMgMjIgMjEgXgorNDggMSA3IDE5IDI2IDEzIDI2IDYgMjYgNiAxOCAxMiA1IDI2IDE3IDE4IDE5IDIyIDEwIDEyIDggMjMgMTEgMTcgMjMgMjUgNSA1IDExIAorNCAxMyA3IDE4IDQgMTkgMjMgMyAxMyAxNSA0IDMgOSAyNCAxNCA1IDI1IDIxIDIyIDE4IDI1IF4KKzUzIDEgMTIgMTUgMTQgMTYgMTAgMTQgOSAxOSA3IDE2IDMgMjMgNCAyNiAxOCA1IDE2IDIxIDI0IDIgOCA4IDggNyAxMSAxMyAxNCA3IDkgCisxMiAxOCAxMSAxMCA3IDIwIDEyIDE0IDE5IDExIDIxIDIxIDIyIDE5IDEzIDEwIDE2IDE5IDE0IDcgOCAxNiAyMCA3IF4KKzQ5IDAgMyA5IDIzIDE4IDcgMjYgMTYgMjIgMjEgMjEgNSAxNCAxMSAyIDIgMTYgMjIgMTEgMjYgNyAyMiAyMyA1IDIzIDEwIDQgMjIgMjQgCisxOSAyMCA5IDE2IDEwIDI0IDQgMTkgMjYgNCAyNSA0IDggMTcgNyA3IDIgMjMgMTEgMTggMTkgXgorNDkgMCAyMyA2IDEwIDkgMSA5IDE0IDE5IDUgNiA2IDI1IDEyIDExIDIxIDI2IDEyIDMgOCAyMCA4IDIxIDE4IDI1IDI1IDE0IDQgMTEgCisyNCAyMyA0IDE0IDMgMTcgMjYgMjIgMjYgMiAxNSA5IDggMjUgMTkgMTIgMjMgMTcgMjAgMTcgMTAgXgorNTQgMCA0IDIzIDIwIDE3IDIxIDE0IDE0IDkgMTggMTEgMTggMiAxOCA0IDIgMjIgMjUgMTUgMTggMTAgMjMgOCAyMSAyNiA3IDE0IDEwIAorNiA2IDE1IDE1IDEzIDIgMTEgMTUgMjIgMiA5IDQgNCA2IDE2IDExIDExIDMgMTYgMTMgMTkgMjUgMTYgNSA3IDIwIDIzIF4KKzQ3IDAgOSAyNSAxMSAyNCAyNCAyNSAxMyA4IDE1IDIzIDE2IDYgMyAxOCAyMyAxNiAyMyA4IDIwIDQgMSAxIDE0IDEzIDEyIDI0IDE0IAorMTQgMjYgMjMgMTMgMjYgMTQgMjEgMjUgMjUgNCA5IDEzIDUgOCA5IDIxIDggMTIgMjYgMTUgXgorNTEgMSA5IDI0IDE1IDEgMjMgMjIgMTYgMTQgOCAyMiAxNSAxOSAyNCAyMCA3IDggMTUgMjQgMTIgNCA0IDIzIDIxIDEzIDE5IDE1IDIxIAorNyAxNSA3IDMgMjEgMjAgOCAyMiAxNCAyMyAyNiAxOSAyIDEwIDE4IDMgNSAzIDEgOSAxNSAxNSAzIDI0IF4KKzYwIDAgMTMgMjMgOSA3IDEgMTMgMTcgMTQgMjUgOSAxNiAyIDIgNiAxMyA3IDE5IDI1IDE3IDEgNSAyMSAyIDcgMjIgNSA2IDI1IDMgMTIgCisxOSA2IDIgNCAyNCAxNyA5IDE4IDIwIDE5IDQgMTEgMTQgMSA2IDggMjYgNiA5IDIyIDQgMTAgMiA3IDIxIDkgOCAyNCAyNSAxMCBeCis1OSAwIDIyIDEyIDIyIDMgMjMgMyAzIDIwIDYgMTEgMjMgNiAxIDcgNSAxOCA1IDE1IDI1IDI2IDEgMSAxMCAxMSAxMSA0IDEyIDExIDIwIAorMyAxNCAyIDMgMiAyMyAxMiAxMiAxNyAyNCAxMSA4IDYgMjQgMTYgMTUgMjIgMjEgMTQgNiAxMiAyMCAxOSA1IDUgMTIgMTEgNiAyMyA4IF4KKzUwIDAgMTYgMjMgNyAyNCA2IDIxIDIgMTcgMTcgNSAyNSAxMSAyNSAyMCAyNSAyNCAxOCA2IDEyIDE5IDI1IDcgNiA1IDIgMTQgMTIgMTYgCisxIDE1IDcgMSAyNiAxOSAxOSAxMyAyMCAxMSAxNyA2IDIwIDUgMjQgMjQgMSAyMSAxMSA5IDIwIDE0IF4KKzYwIDAgMTUgMTAgMTkgMjYgMyAyIDYgNyAxMiA5IDEwIDggMTQgMTAgMTUgNSAxNyA4IDIxIDEgMjAgMjUgNiAxOSA4IDMgMjIgMTYgMTYgCisxNiAxNyAxMyAxMSAxMCAxNyAxNSAxMiA2IDEzIDE0IDE3IDQgMTIgMTAgMjQgNSAxMyAyNCAzIDUgMiA1IDExIDE0IDggNSAxMCAxNyAKKzE2IDEzIF4KKzU3IDAgNCAxNCAyMSAxNSAzIDYgMTcgMjUgOCAyIDMgMyAxOSAxMCAxMyAyMiAyMiA4IDIgMTMgMjUgMTcgMiAxIDE5IDEgMTQgMjAgMiAKKzUgNCAxNSA4IDE0IDIwIDcgMjUgMjAgMjYgMjAgMTYgNyAxNyAxNyAyMiAxIDEzIDYgNSAxIDE4IDE0IDE1IDIzIDE1IDEwIDIxIF4KKzUyIDEgMTkgMTggMTggMjYgMTIgMTMgMyAyNSAxMiAyMSAxNiAyNCA0IDE2IDMgNiAyNiAyNiAxMCAyMCAxMyAxIDIwIDI0IDEwIDIxIDcgCisyNSAyIDI1IDIyIDkgMTUgMTYgMjYgNSAxMiAxIDcgNCAyNCA3IDE0IDIwIDEgNCA3IDMgMTAgMTAgMTUgMTkgXgorNTEgMCAxMyA2IDIyIDYgMjAgMjIgMiAyNiA5IDYgMTQgMSAxNiAzIDI0IDI1IDI0IDE3IDEyIDE0IDE4IDE4IDkgOSAxMSAyMiAxMyA5IAorMiAyMiAxNSAyMCAyMCAxOCA4IDEzIDEzIDIxIDggMTEgNSAyNiA4IDE5IDE3IDQgMiAxNSAyNiAxMyAyMSBeCis1MiAxIDI0IDI2IDExIDE2IDkgMSA4IDE4IDIxIDYgMSA4IDEgMTYgNCAyMCAyMyAyMyAyNCAxMCAxMSAxMiAxMCAxMCAyNSAxIDExIDI1IAorMTAgMyAyNiAyNiAyMCAxNSAxMSAxOSAxNiAxNyAzIDE2IDEyIDI1IDE1IDkgMjMgMSAyIDI0IDggMTAgMTggMTUgXgorNTUgMSA5IDUgNCAxNyAxNiA5IDEyIDIwIDIwIDEgMyAxMSA1IDkgMyAxNyA5IDE3IDI0IDIxIDMgNCAxNiAyIDEwIDEgMjUgNSAyMiAxNiAKKzYgMjEgMTkgMjEgMjMgMTUgOSA5IDIxIDE3IDExIDEgMTUgMTcgMjMgMjQgMTEgNyAxMCAyNiAxNSA4IDIyIDIyIDExIF4KKzUwIDEgMjYgMTEgMTcgNSAyNiA3IDIzIDE5IDMgMjQgMTcgMiAxOSAxOCAyNiAyMSAxMiA1IDE4IDIyIDIwIDcgMTUgNiA0IDUgMjAgMTMgCisxMCAyMyAxOCAxNiAyNSAxOCAxNSAyIDIwIDE0IDI0IDIyIDE3IDMgMTUgMTYgMSAxMCAyIDEyIDIgMjUgXgorNTEgMCAxIDIxIDIxIDQgMTggMTMgMSAyNCAxOCAyMyAxNyAxOSA2IDE5IDkgMjYgMjUgMjMgMjMgMTQgMTMgMTMgMjAgMTIgMTMgNCAyMSAKKzEwIDIyIDIxIDIyIDEgMTIgMTIgNyAxMyAxNiAxOCA4IDkgNCAzIDEwIDE4IDEyIDQgNSAxOSAxOSAxMiAyNCBeCis1MyAxIDEzIDE4IDEgMjIgOCAxIDE3IDE4IDI0IDMgMjIgNyA3IDE5IDI2IDEzIDI2IDYgMjYgNiAxOCAxMiA1IDI2IDE3IDE4IDE5IDIyIAorMTAgMTIgOCAyMyAxMSAxNyAyMyAyNSA1IDUgMTEgNCAxMyA3IDE4IDQgMTkgMjMgMyAxMyAxNSA0IDMgOSAxOCBeCis1MSAxIDE0IDUgMjUgMjEgMjIgMTggMTcgMTIgMTUgMTQgMTYgMTAgMTQgOSAxOSA3IDE2IDMgMjMgNCAyNiAxOCA1IDE2IDIxIDI0IDIgCis4IDggOCA3IDExIDEzIDE0IDcgOSAxMiAxOCAxMSAxMCA3IDIwIDEyIDE0IDE5IDExIDIxIDIxIDIyIDE5IDI2IF4KKzQ5IDAgMTAgMTYgMTkgMTQgNyA4IDE2IDIwIDEwIDMgOSAyMyAxOCA3IDI2IDE2IDIyIDIxIDIxIDUgMTQgMTEgMiAyIDE2IDIyIDExIAorMjYgNyAyMiAyMyA1IDIzIDEwIDQgMjIgMjQgMTkgMjAgOSAxNiAxMCAyNCA0IDE5IDI2IDQgMjUgMTQgXgorNTIgMCA4IDE3IDcgNyAyIDIzIDExIDE4IDE5IDIzIDYgMTAgOSAxIDkgMTQgMTkgNSA2IDYgMjUgMTIgMTEgMjEgMjYgMTIgMyA4IDIwIAorOCAyMSAxOCAyNSAyNSAxNCA0IDExIDI0IDIzIDQgMTQgMyAxNyAyNiAyMiAyNiAyIDE1IDkgOCAyNSAyNCBeCis1NSAxIDEyIDIzIDE3IDIwIDE3IDEwIDQgMjMgMjAgMTcgMjEgMTQgMTQgOSAxOCAxMSAxOCAyIDE4IDQgMiAyMiAyNSAxNSAxOCAxMCAKKzIzIDggMjEgMjYgNyAxNCAxMCA2IDYgMTUgMTUgMTMgMiAxMSAxNSAyMiAyIDkgNCA0IDYgMTYgMTEgMTEgMyAxNiAxMyAxOSAxNSBeCis0OSAwIDE2IDUgNyAyMCAyMiA5IDI1IDExIDI0IDI0IDI1IDEzIDggMTUgMjMgMTYgNiAzIDE4IDIzIDE2IDIzIDggMjAgNCAxIDEgMTQgCisxMyAxMiAyNCAxNCAxNCAyNiAyMyAxMyAyNiAxNCAyMSAyNSAyNSA0IDkgMTMgNSA4IDkgMjEgOSBeCis1NSAwIDIyIDI0IDkgMjcgMjMgMSAxMyAxOCAyNCAxIDggMjQgOCA2IDE0IDEgNCA1IDE1IDI3IDEyIDIwIDEgMTcgNSA0IDE0IDI1IDE0IAorMyAxOSAyNCAyNCAxNCA4IDEzIDEyIDE5IDggMyA2IDEzIDcgMTAgMjMgMTkgMTAgMTcgMTcgMTEgNiAxMyA4IDE4IDE4IF4KKzUxIDAgNyAzIDI1IDEgMTcgOCAyNiAyNSAxMSAyMyAxNCAyNyAxIDIyIDExIDkgNyAxOSA0IDE1IDE4IDIgMjcgMjAgMTEgNSAyMCAyMiAKKzE5IDE1IDUgNiAxNyA4IDEgMTkgMjIgOSAyMyAxMCAyNiAyNyAyNiAxNCAxMiAzIDE0IDE1IDExIDIgMjYgXgorNTAgMCA2IDIyIDIwIDggMjUgNCAyNSAyNCAyMyAyMCAzIDMgMTYgMiAyIDI3IDIgMTUgMTQgMjcgMyAxNyAxMiAyNyAyNyA3IDI2IDIgCisyMiAxMSA5IDEwIDI0IDE1IDEgMjcgMTEgMjcgNCAxIDI1IDI1IDE2IDYgMiAyMiAxMiAxNyAyMSAxNCBeCis1MiAwIDggOSAyMiAxNyAxMiA3IDE4IDE0IDIzIDIgNiA0IDIzIDkgNCAyMiAxNiAxOCAyMyA4IDExIDI1IDE3IDI3IDE2IDEwIDMgMjQgCis4IDIwIDIwIDE4IDE4IDEzIDQgMiAxOCAyMiAxNSAyNSAyNiA5IDMgMSAyIDE5IDE1IDEgMjQgMTcgMTYgMTggXgorNDkgMCA5IDE0IDExIDggMTYgMTkgMTYgMjIgMTAgMTYgMjQgMjUgNyAyMiAxMiAyMCAxNSAyMyAyMiAxOCAyMiAxNCA2IDI2IDIxIDEwIAorMjEgNyAxMyAyIDE2IDcgMjQgMTYgMjIgMTMgMTAgNyAxMSAxNiA1IDkgMjUgMTMgOSAxNCAxNCAxNyAxNCBeCis1NCAxIDIgMTAgNSAyNSA1IDcgMTAgMjIgMTAgMSAyNCAzIDExIDcgMjMgNSAxNyAxNCAzIDE4IDUgMTMgMjYgMTUgNSAxMyAyMyAxOCAKKzE3IDMgMTggMyAyNyAxNSA2IDI1IDI0IDIyIDI3IDE3IDQgMjUgMjMgMTUgOSAxNSAyMSA4IDcgNyAxNSAzIDEzIDI1IF4KKzQ3IDAgMjUgMyA0IDEwIDI0IDEyIDcgMTYgMjUgMTggMjEgMjEgMjAgMjcgMTMgMTQgMjMgMjcgMSAyMSA5IDIxIDE0IDIyIDkgOSA1IAorMTUgMTMgMTcgMyA0IDkgMTYgMSA4IDIzIDE3IDIzIDI2IDggMjQgMTAgMjAgMjUgMjcgMjUgXgorNTggMSA4IDI2IDggMTAgNCAzIDggMTQgNSA1IDcgMTEgMTMgMTEgMjYgMTEgNCAyNiAxNyAyMCAxOSAxMSAxMCAzIDEwIDE0IDkgNiA5IAorNyAxNiAxMCA0IDQgMTkgMTkgMiAyNiAxMyAxOSAxNyAxNSAyNCAxNSA0IDIxIDIyIDEzIDEzIDEyIDIyIDIgMTQgMjAgNSAxOCA3IDI1IF4KKzU4IDAgMTcgMjQgMjAgMTMgNiAxNyA5IDIwIDIgMTAgMTkgMyAyMiA0IDEgMTEgMyA1IDMgMjEgMTEgMTUgMTIgMjMgMjYgNSAyIDI3IDYgCis1IDE2IDYgMyAyIDIzIDUgMyAyMCAyMCA0IDI0IDIgMTggMjEgNyAxNCAxMCAyNyAyMyA2IDI0IDYgMTkgMjMgMyA5IDIyIDE1IF4KKzU0IDAgMjEgMTcgMTkgMjUgMTcgNyAyMSAxOSA2IDE2IDE1IDE1IDIwIDE0IDIgMjUgMTkgMTQgMTggMTkgNyA5IDEgMTQgMTEgMTAgMTYgCiszIDIzIDE0IDI2IDEwIDExIDEgMTggMSAxMiAyNCAxOSAxOSAxIDcgMiAzIDI0IDcgMTIgOSAyIDggMTYgMjAgMjQgMjUgXgorNDkgMSAyNiAyNiA0IDkgMiA3IDI1IDkgOCAxMiAxOCAxNCAyNiA3IDE3IDE4IDQgMjAgMSAxNiAxNCAyMSAyNiA0IDYgOCAyNCAxMSAyNSAKKzE1IDI0IDE2IDIzIDQgMTAgMjMgMjEgMjQgMTUgMTAgOSAyNiA3IDE0IDI0IDIxIDYgMjAgMTkgXgorNTYgMSAxNyAxNiAxNyAxIDMgMTIgMSA0IDEzIDMgOSAyMSAyMyA3IDE4IDExIDEgMTkgMjAgMjMgMTIgMTIgMjcgMTMgMTMgMTUgMTYgCisxMyAxIDE2IDE1IDEyIDI2IDMgMTYgMTYgOCAxNyAxMyAyMSA0IDYgNSAxOSAxNCAxNiA0IDE2IDExIDE0IDE4IDE4IDI3IDkgMTMgMjIgXgorNTEgMSAzIDI2IDIyIDMgNyA2IDQgMjYgMyAxNSA4IDI1IDEgMjAgMTMgOSAxMSAyMCA2IDExIDIxIDI3IDI1IDIwIDcgNCAxOCAyNiAxNiAKKzI3IDUgMTIgMTkgNyAyMyA2IDI1IDI1IDIgMTEgMTMgMjUgMjEgMTggMTcgNiAxMiAxNCAxMyAyNCAxMyBeCis0OCAxIDE0IDE5IDI2IDI3IDI1IDYgMSAxNSA0IDcgMjcgMjQgMjcgMjEgNSAyNyAxOSAxOCA4IDIxIDMgMjMgMjAgMjEgMjUgMjEgMSA5IAorMTcgMjIgNSAyMiA4IDIgMTMgMjcgOCAxOSAyNyAyMSAyIDUgOCA0IDI3IDEwIDYgMjUgXgorNTIgMCAyIDYgMSAxIDI2IDE4IDEzIDUgMTAgMTggMTAgOCA1IDIxIDE1IDUgMTQgMTkgMTIgNCA4IDIwIDIxIDI2IDEgMTIgMjUgMTAgMiAKKzE3IDEwIDE1IDIgMjAgMjUgMjYgMjMgMjUgMTIgMTYgMTUgOSAxOCAxNSAxOSAyMSAxNiAyNiAxMSAxOCAyMCAyNiBeCis1MyAwIDYgMjIgNyA4IDggMTIgMiAyMSAxOCAxMiAxMSA1IDE5IDMgMTkgMjcgMTggMjUgMjIgMjIgMjMgMTYgMiAxIDIwIDE2IDE0IDIyIAorNiAxNSAyMiAxIDIxIDYgNiAxMCAyIDI2IDEyIDExIDYgMjcgMTQgNyAyMCAyNiAyMCAxNyA3IDE5IDUgMjMgMTQgXgorNjEgMCAxNiAxMiA3IDE1IDE3IDcgNSAxMSAxMiAxNSA3IDEgMTAgMTAgOCA0IDIgNCAxNyA0IDExIDE3IDI2IDIzIDI0IDQgNSAxMiA1IAorMSA2IDkgNiA4IDI3IDUgMTEgMTEgMjQgMjQgMTMgMTcgMiAyNCAyNiAxOSAxMSAyMiAyMSAyIDIgMTQgMjEgMTMgMSAyMyAxMCAyNSA4IAorMTUgMTMgXgorNTIgMCAxOSAyMyAyIDkgMjYgNiAyMyAxMyA1IDI0IDEyIDIxIDExIDE0IDQgMTIgMTAgMTIgMjIgNCAzIDIwIDE3IDEwIDEzIDE2IDkgCisxMCAyNyA5IDEyIDEzIDIwIDEwIDEyIDIzIDIzIDExIDE5IDEzIDI1IDIyIDggMSA1IDE2IDIwIDkgMTkgOSAyNCAyNiBeCis1MSAwIDEyIDE1IDYgMjEgMjcgMjIgMjYgMjQgMTggOSAxNSA4IDIyIDI0IDkgMjcgMjMgMSAxMyAxOCAyNCAxIDggMjQgOCA2IDE0IDEgCis0IDUgMTUgMjcgMTIgMjAgMSAxNyA1IDQgMTQgMjUgMTQgMyAxOSAyNCAyNCAxNCA4IDEzIDEyIDE5IDIyIF4KKzU2IDAgMyA2IDEzIDcgMTAgMjMgMTkgMTAgMTcgMTcgMTEgNiAxMyA4IDE4IDYgNyAzIDI1IDEgMTcgOCAyNiAyNSAxMSAyMyAxNCAyNyAKKzEgMjIgMTEgOSA3IDE5IDQgMTUgMTggMiAyNyAyMCAxMSA1IDIwIDIyIDE5IDE1IDUgNiAxNyA4IDEgMTkgMjIgOSAyMyAxNyBeCis1MCAwIDI2IDI3IDI2IDE0IDEyIDMgMTQgMTUgMTEgMiAxMiA2IDIyIDIwIDggMjUgNCAyNSAyNCAyMyAyMCAzIDMgMTYgMiAyIDI3IDIgCisxNSAxNCAyNyAzIDE3IDEyIDI3IDI3IDcgMjYgMiAyMiAxMSA5IDEwIDI0IDE1IDEgMjcgMTEgMjcgMjEgXgorNTIgMCAxIDI1IDI1IDE2IDYgMiAyMiAxMiAxNyAyMSAxMiA4IDkgMjIgMTcgMTIgNyAxOCAxNCAyMyAyIDYgNCAyMyA5IDQgMjIgMTYgCisxOCAyMyA4IDExIDI1IDE3IDI3IDE2IDEwIDMgMjQgOCAyMCAyMCAxOCAxOCAxMyA0IDIgMTggMjIgMTUgMjUgMTAgXgorNTIgMCA5IDMgMSAyIDE5IDE1IDEgMjQgMTcgMTYgMTggOSAxNCAxMSA4IDE2IDE5IDE2IDIyIDEwIDE2IDI0IDI1IDcgMjIgMTIgMjAgCisxNSAyMyAyMiAxOCAyMiAxNCA2IDI2IDIxIDEwIDIxIDcgMTMgMiAxNiA3IDI0IDE2IDIyIDEzIDEwIDcgMTEgMTYgMTMgXgorNTMgMSA5IDI1IDEzIDkgMTQgMTQgMTcgMjUgMiAxMCA1IDI1IDUgNyAxMCAyMiAxMCAxIDI0IDMgMTEgNyAyMyA1IDE3IDE0IDMgMTggNSAKKzEzIDI2IDE1IDUgMTMgMjMgMTggMTcgMyAxOCAzIDI3IDE1IDYgMjUgMjQgMjIgMjcgMTcgNCAyNSAyMyAxNSAxNSBeCis1MiAxIDE1IDIxIDggNyA3IDE1IDMgMTMgMjIgMjUgMyA0IDEwIDI0IDEyIDcgMTYgMjUgMTggMjEgMjEgMjAgMjcgMTMgMTQgMjMgMjcgCisxIDIxIDkgMjEgMTQgMjIgOSA5IDUgMTUgMTMgMTcgMyA0IDkgMTYgMSA4IDIzIDE3IDIzIDI2IDggMjQgMTQgXgorNTggMCAyMCAyNSAyNyAzIDggMjYgOCAxMCA0IDMgOCAxNCA1IDUgNyAxMSAxMyAxMSAyNiAxMSA0IDI2IDE3IDIwIDE5IDExIDEwIDMgCisxMCAxNCA5IDYgOSA3IDE2IDEwIDQgNCAxOSAxOSAyIDI2IDEzIDE5IDE3IDE1IDI0IDE1IDQgMjEgMjIgMTMgMTMgMTIgMjIgMiAxNCAKKzE4IF4KKzYwIDAgNSAxOCA3IDE3IDI0IDIwIDEzIDYgMTcgOSAyMCAyIDEwIDE5IDMgMjIgNCAxIDExIDMgNSAzIDIxIDExIDE1IDEyIDIzIDI2IDUgCisyIDI3IDYgNSAxNiA2IDMgMiAyMyA1IDMgMjAgMjAgNCAyNCAyIDE4IDIxIDcgMTQgMTAgMjcgMjMgNiAyNCA2IDE5IDIzIDMgOSAyNSBeCis1NSAwIDE2IDIxIDE3IDE5IDI1IDE3IDcgMjEgMTkgNiAxNiAxNSAxNSAyMCAxNCAyIDI1IDE5IDE0IDE4IDE5IDcgOSAxIDE0IDExIDEwIAorMTYgMyAyMyAxNCAyNiAxMCAxMSAxIDE4IDEgMTIgMjQgMTkgMTkgMSA3IDIgMyAyNCA3IDEyIDkgMiA4IDE2IDIwIDI0IDI3IF4KKzUxIDEgMjYgMjYgNCA5IDIgNyAyNSA5IDggMTIgMTggMTQgMjYgNyAxNyAxOCA0IDIwIDEgMTYgMTQgMjEgMjYgNCA2IDggMjQgMTEgMjUgCisxNSAyNCAxNiAyMyA0IDEwIDIzIDIxIDI0IDE1IDEwIDkgMjYgNyAxNCAyNCAyMSA2IDIwIDUgMTcgMTUgXgorNTcgMCAxNyAxIDMgMTIgMSA0IDEzIDMgOSAyMSAyMyA3IDE4IDExIDEgMTkgMjAgMjMgMTIgMTIgMjcgMTMgMTMgMTUgMTYgMTMgMSAxNiAKKzE1IDEyIDI2IDMgMTYgMTYgOCAxNyAxMyAyMSA0IDYgNSAxOSAxNCAxNiA0IDE2IDExIDE0IDE4IDE4IDI3IDkgMTMgMjEgMyAyNiAyMyBeCis1MiAwIDMgNyA2IDQgMjYgMyAxNSA4IDI1IDEgMjAgMTMgOSAxMSAyMCA2IDExIDIxIDI3IDI1IDIwIDcgNCAxOCAyNiAxNiAyNyA1IDEyIAorMTkgNyAyMyA2IDI1IDI1IDIgMTEgMTMgMjUgMjEgMTggMTcgNiAxMiAxNCAxMyAyNCAxMSAxNCAxOSAyNiAxMiBeCis1NSAxIDI1IDYgMSAxNSA0IDcgMjcgMjQgMjcgMjEgNSAyNyAxOSAxOCA4IDIxIDMgMjMgMjAgMjEgMjUgMjEgMSA5IDE3IDIyIDUgMjIgCis4IDIgMTMgMjcgOCAxOSAyNyAyMSAyIDUgOCA0IDI3IDEwIDYgMTggMiA2IDEgMSAyNiAxOCAxMyA1IDEwIDE4IDExIF4KKzUyIDAgOCA1IDIxIDE1IDUgMTQgMTkgMTIgNCA4IDIwIDIxIDI2IDEgMTIgMjUgMTAgMiAxNyAxMCAxNSAyIDIwIDI1IDI2IDIzIDI1IAorMTIgMTYgMTUgOSAxOCAxNSAxOSAyMSAxNiAyNiAxMSAxOCAyMCA2IDIyIDcgOCA4IDEyIDIgMjEgMTggMTIgMTEgMjcgXgorNTMgMSAxOSAzIDE5IDI3IDE4IDI1IDIyIDIyIDIzIDE2IDIgMSAyMCAxNiAxNCAyMiA2IDE1IDIyIDEgMjEgNiA2IDEwIDIgMjYgMTIgCisxMSA2IDI3IDE0IDcgMjAgMjYgMjAgMTcgNyAxOSA1IDIzIDE4IDE2IDEyIDcgMTUgMTcgNyA1IDExIDEyIDE1IDcgMjIgXgorNTcgMSAxMCAxMCA4IDQgMiA0IDE3IDQgMTEgMTcgMjYgMjMgMjQgNCA1IDEyIDUgMSA2IDkgNiA4IDI3IDUgMTEgMTEgMjQgMjQgMTMgCisxNyAyIDI0IDI2IDE5IDExIDIyIDIxIDIgMiAxNCAyMSAxMyAxIDIzIDEwIDI1IDggMTUgMjYgMTkgMjMgMiA5IDI2IDYgMjMgMjIgXgorNTIgMSA1IDI0IDEyIDIxIDExIDE0IDQgMTIgMTAgMTIgMjIgNCAzIDIwIDE3IDEwIDEzIDE2IDkgMTAgMjcgOSAxMiAxMyAyMCAxMCAxMiAKKzIzIDIzIDExIDE5IDEzIDI1IDIyIDggMSA1IDE2IDIwIDkgMTkgOSAyNCAyMCAxMiAxNSA2IDIxIDI3IDIyIDI2IDE2IF4KKzU4IDAgMTggOSAxNSA4IDIyIDI0IDkgMjcgMjMgMSAxMyAxOCAyNCAxIDggMjQgOCA2IDE0IDEgNCA1IDE1IDI3IDEyIDIwIDEgMTcgNSAKKzQgMTQgMjUgMTQgMyAxOSAyNCAyNCAxNCA4IDEzIDEyIDE5IDggMyA2IDEzIDcgMTAgMjMgMTkgMTAgMTcgMTcgMTEgNiAxMyA4IDIyIF4KKzU1IDAgNiA3IDMgMjUgMSAxNyA4IDI2IDI1IDExIDIzIDE0IDI3IDEgMjIgMTEgOSA3IDE5IDQgMTUgMTggMiAyNyAyMCAxMSA1IDIwIAorMjIgMTkgMTUgNSA2IDE3IDggMSAxOSAyMiA5IDIzIDEwIDI2IDI3IDI2IDE0IDEyIDMgMTQgMTUgMTEgMiAxMiA2IDIyIDE2IF4KKzUzIDAgOCAyNSA0IDI1IDI0IDIzIDIwIDMgMyAxNiAyIDIgMjcgMiAxNSAxNCAyNyAzIDE3IDEyIDI3IDI3IDcgMjYgMiAyMiAxMSA5IAorMTAgMjQgMTUgMSAyNyAxMSAyNyA0IDEgMjUgMjUgMTYgNiAyIDIyIDEyIDE3IDIxIDEyIDggOSAyMiAxNyAxMiAxOCBeCis1NCAwIDcgMTggMTQgMjMgMiA2IDQgMjMgOSA0IDIyIDE2IDE4IDIzIDggMTEgMjUgMTcgMjcgMTYgMTAgMyAyNCA4IDIwIDIwIDE4IDE4IAorMTMgNCAyIDE4IDIyIDE1IDI1IDI2IDkgMyAxIDIgMTkgMTUgMSAyNCAxNyAxNiAxOCA5IDE0IDExIDggMTYgMTkgMjcgXgorNTIgMCAyMiAxMCAxNiAyNCAyNSA3IDIyIDEyIDIwIDE1IDIzIDIyIDE4IDIyIDE0IDYgMjYgMjEgMTAgMjEgNyAxMyAyIDE2IDcgMjQgCisxNiAyMiAxMyAxMCA3IDExIDE2IDUgOSAyNSAxMyA5IDE0IDE0IDE3IDI1IDIgMTAgNSAyNSA1IDcgMTAgMjIgMTAgMjIgXgorNTQgMSAyNCAzIDExIDcgMjMgNSAxNyAxNCAzIDE4IDUgMTMgMjYgMTUgNSAxMyAyMyAxOCAxNyAzIDE4IDMgMjcgMTUgNiAyNSAyNCAyMiAKKzI3IDE3IDQgMjUgMjMgMTUgOSAxNSAyMSA4IDcgNyAxNSAzIDEzIDIyIDI1IDMgNCAxMCAyNCAxMiA3IDE2IDI1IDEwIF4KKzU2IDAgMjEgMjEgMjAgMjcgMTMgMTQgMjMgMjcgMSAyMSA5IDIxIDE0IDIyIDkgOSA1IDE1IDEzIDE3IDMgNCA5IDE2IDEgOCAyMyAxNyAKKzIzIDI2IDggMjQgMTAgMjAgMjUgMjcgMyA4IDI2IDggMTAgNCAzIDggMTQgNSA1IDcgMTEgMTMgMTEgMjYgMTEgNCAyNiAyIF4KKzYxIDEgMjAgMTkgMTEgMTAgMyAxMCAxNCA5IDYgOSA3IDE2IDEwIDQgNCAxOSAxOSAyIDI2IDEzIDE5IDE3IDE1IDI0IDE1IDQgMjEgMjIgCisxMyAxMyAxMiAyMiAyIDE0IDIwIDUgMTggNyAxNyAyNCAyMCAxMyA2IDE3IDkgMjAgMiAxMCAxOSAzIDIyIDQgMSAxMSAzIDUgMyAyMSAKKzExIDE1IDIyIF4KKzUzIDAgMjMgMjYgNSAyIDI3IDYgNSAxNiA2IDMgMiAyMyA1IDMgMjAgMjAgNCAyNCAyIDE4IDIxIDcgMTQgMTAgMjcgMjMgNiAyNCA2IAorMTkgMjMgMyA5IDIyIDE2IDIxIDE3IDE5IDI1IDE3IDcgMjEgMTkgNiAxNiAxNSAxNSAyMCAxNCAyIDI1IDE5IDI1IF4KKzYwIDAgMTggMTkgNyA5IDEgMTQgMTEgMTAgMTYgMyAyMyAxNCAyNiAxMCAxMSAxIDE4IDEgMTIgMjQgMTkgMTkgMSA3IDIgMyAyNCA3IAorMTIgOSAyIDggMTYgMjAgMjQgNSAyNiAyNiA0IDkgMiA3IDI1IDkgOCAxMiAxOCAxNCAyNiA3IDE3IDE4IDQgMjAgMSAxNiAxNCAyMSAyNiAKKzE4IF4KKzU0IDAgNiA4IDI0IDExIDI1IDE1IDI0IDE2IDIzIDQgMTAgMjMgMjEgMjQgMTUgMTAgOSAyNiA3IDE0IDI0IDIxIDYgMjAgNSAxNyAxNiAKKzE3IDEgMyAxMiAxIDQgMTMgMyA5IDIxIDIzIDcgMTggMTEgMSAxOSAyMCAyMyAxMiAxMiAyNyAxMyAxMyAxNSAxNiAxMyAyNCBeCis1NyAwIDEgMTYgMTUgMTIgMjYgMyAxNiAxNiA4IDE3IDEzIDIxIDQgNiA1IDE5IDE0IDE2IDQgMTYgMTEgMTQgMTggMTggMjcgOSAxMyAKKzIxIDMgMjYgMjIgMyA3IDYgNCAyNiAzIDE1IDggMjUgMSAyMCAxMyA5IDExIDIwIDYgMTEgMjEgMjcgMjUgMjAgNyA0IDE4IDI2IDEwIF4KKzQ4IDAgMjcgNSAxMiAxOSA3IDIzIDYgMjUgMjUgMiAxMSAxMyAyNSAyMSAxOCAxNyA2IDEyIDE0IDEzIDI0IDExIDE0IDE5IDI2IDI3IAorMjUgNiAxIDE1IDQgNyAyNyAyNCAyNyAyMSA1IDI3IDE5IDE4IDggMjEgMyAyMyAyMCAyMSAyNSA4IF4KKzYwIDEgMSA5IDE3IDIyIDUgMjIgOCAyIDEzIDI3IDggMTkgMjcgMjEgMiA1IDggNCAyNyAxMCA2IDE4IDIgNiAxIDEgMjYgMTggMTMgNSAKKzEwIDE4IDEwIDggNSAyMSAxNSA1IDE0IDE5IDEyIDQgOCAyMCAyMSAyNiAxIDEyIDI1IDEwIDIgMTcgMTAgMTUgMiAyMCAyNSAyNiAyMyAKKzIxIF4KKzU0IDEgMTIgMTYgMTUgOSAxOCAxNSAxOSAyMSAxNiAyNiAxMSAxOCAyMCA2IDIyIDcgOCA4IDEyIDIgMjEgMTggMTIgMTEgNSAxOSAzIAorMTkgMjcgMTggMjUgMjIgMjIgMjMgMTYgMiAxIDIwIDE2IDE0IDIyIDYgMTUgMjIgMSAyMSA2IDYgMTAgMiAyNiAxMiAxMSAyNCBeCis2MCAwIDI3IDE0IDcgMjAgMjYgMjAgMTcgNyAxOSA1IDIzIDE4IDE2IDEyIDcgMTUgMTcgNyA1IDExIDEyIDE1IDcgMSAxMCAxMCA4IDQgCisyIDQgMTcgNCAxMSAxNyAyNiAyMyAyNCA0IDUgMTIgNSAxIDYgOSA2IDggMjcgNSAxMSAxMSAyNCAyNCAxMyAxNyAyIDI0IDI2IDE5IDExIAorMjIgXgorNTUgMCAyMSAyIDIgMTQgMjEgMTMgMSAyMyAxMCAyNSA4IDE1IDI2IDE5IDIzIDIgOSAyNiA2IDIzIDEzIDUgMjQgMTIgMjEgMTEgMTQgNCAKKzEyIDEwIDEyIDIyIDQgMyAyMCAxNyAxMCAxMyAxNiA5IDEwIDI3IDkgMTIgMTMgMjAgMTAgMTIgMjMgMjMgMTEgMTkgMTMgMjUgMTMgXgorNTUgMCA4IDEgNSAxNiAyMCA5IDE5IDkgMjQgMjAgMTIgMTUgNiAyMSAyNyAyMiAyNiAyNCAxOCA5IDE1IDggMjIgMjQgOSAyNyAyMyAxIAorMTMgMTggMjQgMSA4IDI0IDggNiAxNCAxIDQgNSAxNSAyNyAxMiAyMCAxIDE3IDUgNCAxNCAyNSAxNCAzIDE5IDI0IDE2IF4KKzYwIDAgMTQgOCAxMyAxMiAxOSA4IDMgNiAxMyA3IDEwIDIzIDE5IDEwIDE3IDE3IDExIDYgMTMgOCAxOCA2IDcgMyAyNSAxIDE3IDggMjYgCisyNSAxMSAyMyAxNCAyNyAxIDIyIDExIDkgNyAxOSA0IDE1IDE4IDIgMjcgMjAgMTEgNSAyMCAyMiAxOSAxNSA1IDYgMTcgOCAxIDE5IDIyIAorMTAgXgorNTUgMSAxNSA5IDExIDI2IDE5IDIyIDI3IDIgMjEgOCAyMCAyMyAyNiAxMiAxMCAyMSA5IDE1IDEzIDI1IDcgMjYgMSAxMyA1IDkgMSAzIAorOSAyMSAyMiA3IDEgMjMgMjggMSAyIDggMjIgMTIgMTggMjggNSAxOCAxNCA3IDExIDE3IDIwIDIwIDcgMjEgMTMgOCAyMiBeCis1MiAxIDIxIDIyIDIgMTYgMjAgMTUgMjggOSAzIDIyIDEzIDEwIDIzIDQgMTYgMTEgMTQgMSAxMCA4IDE0IDE0IDE1IDE4IDEzIDEyIDIxIAorMTggMjUgMTUgMjcgMTcgNSAxIDIzIDcgMTcgMjAgMTEgMTQgMTAgNCAyMSAxNyAxOSAyNSAxNyAyMiAxOCAyMSAxOSAxNyBeCis1NyAwIDEwIDE1IDI2IDIwIDggMTMgMTkgNyA4IDE4IDcgMTIgMTQgNiA4IDIyIDIxIDExIDEwIDE0IDIzIDI1IDkgMTUgMjIgMTggNiAKKzE3IDI0IDcgMTMgNiAxMiA3IDIgMTggMTggMjYgMTMgMTMgMTYgOCAyNCAxMCAzIDI2IDkgMjAgMSAxMiAyIDE0IDEzIDIzIDEyIDI1IDUgCiteCis1NyAwIDI0IDExIDYgMyA4IDI3IDggMjEgMjYgMyAxMSAxOSAxOCA1IDUgMjUgMjYgMjQgNCAyMyAxNSAxNSAyMyAyMSAyNCA1IDE1IDIxIAorMyAzIDE4IDIgMjQgMjcgMTEgMjAgMTAgMTEgNCA1IDEyIDIgMjMgNiA1IDMgMSAxNCAyNiAxNSAxMiA2IDI4IDEyIDE5IDIwIDkgXgorNTUgMCA2IDIzIDQgNyA3IDMgMTAgMjQgMjggNiAxMCA5IDYgMjAgMTQgMjcgMTAgMTkgMTEgMSAxNSAyMSA1IDEwIDcgMTEgOCAxNiA5IAorMjcgNSAyIDYgNiAyNyAyMCAyNCAyMSAyIDIwIDE2IDE0IDI0IDE3IDE1IDMgMiAyNiAyNSAyNSAxNCAyNCAyMCAyOCAyOCBeCis1OSAxIDE3IDUgOSAxMCAyNSAyMCAxMiA5IDE4IDMgMTYgNCAxMCA3IDE4IDIzIDE3IDIgOCAxIDI4IDcgMiAxNSA1IDE4IDExIDIzIDIgCisxIDE4IDIyIDE0IDcgMjAgMjEgMiAxMSAxMiAzIDE1IDEyIDQgMSAyNyAyMSAxNiAyNyAxOSAxOCAxMyAyMSAxNCA1IDIwIDkgMTkgMjcgCisyNSBeCis1NSAwIDMgNSAxNiAxNiAyMiAyIDEzIDcgNCAxMyAxOSAyNyAxNSA3IDE2IDI1IDMgNCA0IDE3IDEyIDEzIDExIDEyIDI2IDYgMSAxMCAKKzE1IDE4IDQgMTkgMTAgMjcgOSA0IDI1IDEzIDIxIDI1IDI2IDIxIDIwIDEyIDI1IDIxIDcgMTcgMjggMjcgMyAxMyAxNCAxOSAxOCBeCis1MyAxIDIzIDE5IDQgMjggMyAyMCAxOCA5IDcgMTUgNCAyNiA1IDYgMjAgNSAyMyAyOCAxMCAyNCAxOSAxMyAyOCAxIDkgMTIgMjMgMTYgCisxMCAxMyAyIDE5IDIxIDYgMjUgMjIgMjggMjMgMTYgNyAyMCA0IDIgMjIgMTEgMjYgMjIgNiA5IDE3IDExIDIxIDEwIF4KKzQ3IDAgMSAzIDI4IDExIDI3IDI1IDEyIDggMjYgMjYgMjggMjQgMTMgMjIgMTcgNiA0IDI0IDE1IDE3IDE4IDQgMjIgMjMgOSAyNCAxMiAKKzI3IDI3IDI1IDkgMTMgMTUgMTEgOSAyMiAyOCAyNiAxMSAxOCAxNSAxMCA2IDE2IDE3IDE0IDI0IF4KKzU1IDEgMjUgMjcgMTYgMjggMjIgMjQgMSAxIDExIDcgMjQgMyAyOCA3IDUgMjggMTYgMTUgMSA3IDE0IDkgNyA2IDE1IDI1IDE5IDkgMyAKKzE5IDIzIDEgMjYgMjAgMTcgMTcgMSAxNiAyNCA5IDE2IDggMTUgNiAyMSAxNyAyMiA5IDI4IDggOCA1IDQgMjQgMjYgXgorNDcgMSAxNCA0IDIxIDI2IDIzIDcgOCAyNyAyMyAyMyAyMiAxOSAyNCAyNSAxNiAxOSAxMiAyMiAxMCAyMCAzIDcgMTQgMSAyMCA2IDI2IAorMjMgMjcgNCAxNiAyMCAxOCAxMiAyMCAxNSAxOSAxNiAxOCAyMCAyNyAxMSAxMSAxNyAyNCAxOCAxNiBeCis1MCAwIDE5IDEgMjUgMjMgMiAxNSAxNiAyNiAyNyAyMyAxNCAxMiAyOCAyMiAxNSA4IDE5IDIgMjAgMTMgMSAyNCAyIDI1IDEgNiAxOSAKKzE5IDggMTEgMjQgMjQgMjEgMTMgMjcgNSAxMSAyOCAxNyA3IDI1IDYgMjMgMjQgMTQgMjUgMTIgNSAxMyAyNSBeCis2MCAwIDIgNSA4IDEwIDE2IDExIDUgMjYgMTggMTkgMjEgMyAxMiAxMSAxMyA0IDE0IDIyIDIyIDE0IDE2IDEzIDMgMjIgMTYgMjMgNSAKKzE5IDYgMTMgMTAgMjYgMTcgMjcgMjYgNCAzIDI1IDYgMTQgMiAzIDUgNyAyMyAxMSAyMiA4IDI1IDIgOSAyNSAxOCAxNyA4IDIgMTQgNCAKKzE5IDIyIF4KKzU0IDEgNSAyNyAxMyA5IDIgMjcgMjggMiAxNyAyMyAxMCAyNyAxOCAyNiA3IDIyIDE2IDMgMjcgMSAyNiAyMSAyOCAxMCAzIDYgMiAyIAorMTAgMTcgMTMgMTYgNiAxNyAyMSAyMyAxMyAyMCAyMiA1IDYgMTEgMTIgMTIgOCAyMyAxMyAxNyA5IDIzIDIwIDMgMjggMjEgXgorNTYgMCAxMiAxNyAyNSAyOCAxOSA1IDIxIDQgMjcgOCAxIDE5IDE0IDIwIDYgNyA5IDEgNiAyMiAzIDE5IDI2IDE0IDggNiA3IDE5IDE1IAorMjMgMSAxNyAxNiA2IDI2IDE0IDUgMjIgMjUgNCA3IDEwIDE2IDIxIDEwIDE4IDE5IDI0IDE2IDIzIDggMyAxNyAyOCAxOCAxMyBeCis1OCAwIDIgNSAzIDIxIDIxIDE1IDYgMjQgMSA0IDI0IDE4IDEwIDIyIDEgMjEgMTIgNSA0IDQgMjAgMjUgMjQgMjYgOCAyNSAxMSAyIDcgCisyNyAyMiAxOSA0IDE4IDI3IDEwIDI4IDQgMTIgMjQgOCAxNiAxMiAxMSAxNiAxNyAyNSA4IDEyIDE2IDEgOSA5IDEwIDUgMjQgMjMgMTEgXgorNjIgMSA1IDE0IDE4IDggNCA5IDUgMTcgOCAyOCAxIDIyIDQgMTEgMyAyIDE3IDMgMTQgOSAyNyAxMyAxOCAyNCA5IDggNyAyOCAyNSAxNCAKKzIxIDI3IDI0IDYgMTggMTYgMiAxMiAxNSA5IDE0IDEwIDEgOCAxNyA0IDYgMTUgMjYgMTEgMTUgMiAyOCAyMCAyNiAxNiAzIDcgNSA4IDkgCisyNCBeCis1MCAxIDEwIDEyIDI1IDExIDkgMTMgMjQgMTUgMjAgMiA0IDggMiAyMiAyMCAxOSA0IDE1IDE0IDI4IDEzIDI1IDEwIDEwIDEyIDI4IDI0IAorMjIgMjYgMjggMTUgOSAxMSAyNiAxOSAyMiAyNyAyIDIxIDggMjAgMjMgMjYgMTIgMTAgMjEgOSAxNSAxMyAxNyBeCis2MCAxIDcgMjYgMSAxMyA1IDkgMSAzIDkgMjEgMjIgNyAxIDIzIDI4IDEgMiA4IDIyIDEyIDE4IDI4IDUgMTggMTQgNyAxMSAxNyAyMCAKKzIwIDcgMjEgMTMgOCAyOCAyMSAyMiAyIDE2IDIwIDE1IDI4IDkgMyAyMiAxMyAxMCAyMyA0IDE2IDExIDE0IDEgMTAgOCAxNCAxNCAxNSAKKzE4IDE3IF4KKzUyIDAgMTIgMjEgMTggMjUgMTUgMjcgMTcgNSAxIDIzIDcgMTcgMjAgMTEgMTQgMTAgNCAyMSAxNyAxOSAyNSAxNyAyMiAxOCAyMSAxOSAKKzE3IDEwIDE1IDI2IDIwIDggMTMgMTkgNyA4IDE4IDcgMTIgMTQgNiA4IDIyIDIxIDExIDEwIDE0IDIzIDI1IDkgMTUgMTkgXgorNTcgMSAxOCA2IDE3IDI0IDcgMTMgNiAxMiA3IDIgMTggMTggMjYgMTMgMTMgMTYgOCAyNCAxMCAzIDI2IDkgMjAgMSAxMiAyIDE0IDEzIAorMjMgMTIgMjUgMyAyNCAxMSA2IDMgOCAyNyA4IDIxIDI2IDMgMTEgMTkgMTggNSA1IDI1IDI2IDI0IDQgMjMgMTUgMTUgMjMgMjEgMTIgXgorNjcgMSA1IDE1IDIxIDMgMyAxOCAyIDI0IDI3IDExIDIwIDEwIDExIDQgNSAxMiAyIDIzIDYgNSAzIDEgMTQgMjYgMTUgMTIgNiAyOCAxMiAKKzE5IDIwIDYgMjMgNCA3IDcgMyAxMCAyNCAyOCA2IDEwIDkgNiAyMCAxNCAyNyAxMCAxOSAxMSAxIDE1IDIxIDUgMTAgNyAxMSA4IDE2IDkgCisyNyA1IDIgNiA2IDI3IDIgXgorNTYgMSAyNCAyMSAyIDIwIDE2IDE0IDI0IDE3IDE1IDMgMiAyNiAyNSAyNSAxNCAyNCAyMCAyOCAxNCAxNyA1IDkgMTAgMjUgMjAgMTIgOSAKKzE4IDMgMTYgNCAxMCA3IDE4IDIzIDE3IDIgOCAxIDI4IDcgMiAxNSA1IDE4IDExIDIzIDIgMSAxOCAyMiAxNCA3IDIwIDIxIDI0IF4KKzYwIDEgMTEgMTIgMyAxNSAxMiA0IDEgMjcgMjEgMTYgMjcgMTkgMTggMTMgMjEgMTQgNSAyMCA5IDE5IDI3IDYgMyA1IDE2IDE2IDIyIDIgCisxMyA3IDQgMTMgMTkgMjcgMTUgNyAxNiAyNSAzIDQgNCAxNyAxMiAxMyAxMSAxMiAyNiA2IDEgMTAgMTUgMTggNCAxOSAxMCAyNyA5IDQgCisyNSAyNyBeCis1MSAwIDIxIDI1IDI2IDIxIDIwIDEyIDI1IDIxIDcgMTcgMjggMjcgMyAxMyAxNCAxOSAzIDIzIDE5IDQgMjggMyAyMCAxOCA5IDcgMTUgCis0IDI2IDUgNiAyMCA1IDIzIDI4IDEwIDI0IDE5IDEzIDI4IDEgOSAxMiAyMyAxNiAxMCAxMyAyIDE5IDIxIDIzIF4KKzQ5IDEgMjUgMjIgMjggMjMgMTYgNyAyMCA0IDIgMjIgMTEgMjYgMjIgNiA5IDE3IDExIDIxIDUgMSAzIDI4IDExIDI3IDI1IDEyIDggMjYgCisyNiAyOCAyNCAxMyAyMiAxNyA2IDQgMjQgMTUgMTcgMTggNCAyMiAyMyA5IDI0IDEyIDI3IDI3IDkgXgorNTYgMCA5IDEzIDE1IDExIDkgMjIgMjggMjYgMTEgMTggMTUgMTAgNiAxNiAxNyAxNCAxMSAyNSAyNyAxNiAyOCAyMiAyNCAxIDEgMTEgNyAKKzI0IDMgMjggNyA1IDI4IDE2IDE1IDEgNyAxNCA5IDcgNiAxNSAyNSAxOSA5IDMgMTkgMjMgMSAyNiAyMCAxNyAxNyAxIDE2IDE2IF4KKzUxIDAgOSAxNiA4IDE1IDYgMjEgMTcgMjIgOSAyOCA4IDggNSA0IDI0IDI3IDE0IDQgMjEgMjYgMjMgNyA4IDI3IDIzIDIzIDIyIDE5IAorMjQgMjUgMTYgMTkgMTIgMjIgMTAgMjAgMyA3IDE0IDEgMjAgNiAyNiAyMyAyNyA0IDE2IDIwIDE4IDEyIDIyIF4KKzUxIDAgMTUgMTkgMTYgMTggMjAgMjcgMTEgMTEgMTcgMjQgMTggMSAxOSAxIDI1IDIzIDIgMTUgMTYgMjYgMjcgMjMgMTQgMTIgMjggMjIgCisxNSA4IDE5IDIgMjAgMTMgMSAyNCAyIDI1IDEgNiAxOSAxOSA4IDExIDI0IDI0IDIxIDEzIDI3IDUgMTEgMjggMTYgXgorNTkgMCA3IDI1IDYgMjMgMjQgMTQgMjUgMTIgNSAxMyAyNiAyIDUgOCAxMCAxNiAxMSA1IDI2IDE4IDE5IDIxIDMgMTIgMTEgMTMgNCAxNCAKKzIyIDIyIDE0IDE2IDEzIDMgMjIgMTYgMjMgNSAxOSA2IDEzIDEwIDI2IDE3IDI3IDI2IDQgMyAyNSA2IDE0IDIgMyA1IDcgMjMgMTEgMjIgCisxMCBeCis1OSAwIDI1IDIgOSAyNSAxOCAxNyA4IDIgMTQgNCAxOSAxIDUgMjcgMTMgOSAyIDI3IDI4IDIgMTcgMjMgMTAgMjcgMTggMjYgNyAyMiAKKzE2IDMgMjcgMSAyNiAyMSAyOCAxMCAzIDYgMiAyIDEwIDE3IDEzIDE2IDYgMTcgMjEgMjMgMTMgMjAgMjIgNSA2IDExIDEyIDEyIDggMjMgCis3IF4KKzU2IDEgMTcgOSAyMyAyMCAzIDI4IDI3IDEyIDE3IDI1IDI4IDE5IDUgMjEgNCAyNyA4IDEgMTkgMTQgMjAgNiA3IDkgMSA2IDIyIDMgMTkgCisyNiAxNCA4IDYgNyAxOSAxNSAyMyAxIDE3IDE2IDYgMjYgMTQgNSAyMiAyNSA0IDcgMTAgMTYgMjEgMTAgMTggMTkgMjQgMTYgXgorNTcgMSAyMyA4IDMgMTcgMjggMTggMTAgMiA1IDMgMjEgMjEgMTUgNiAyNCAxIDQgMjQgMTggMTAgMjIgMSAyMSAxMiA1IDQgNCAyMCAyNSAKKzI0IDI2IDggMjUgMTEgMiA3IDI3IDIyIDE5IDQgMTggMjcgMTAgMjggNCAxMiAyNCA4IDE2IDEyIDExIDE2IDE3IDI1IDggMTIgMTggXgorNjMgMCAxIDkgOSAxMCA1IDI0IDIzIDE4IDUgMTQgMTggOCA0IDkgNSAxNyA4IDI4IDEgMjIgNCAxMSAzIDIgMTcgMyAxNCA5IDI3IDEzIAorMTggMjQgOSA4IDcgMjggMjUgMTQgMjEgMjcgMjQgNiAxOCAxNiAyIDEyIDE1IDkgMTQgMTAgMSA4IDE3IDQgNiAxNSAyNiAxMSAxNSAyIAorMjggMjAgMTYgXgorNTIgMSAxNiAzIDcgNSA4IDkgMjYgMTAgMTIgMjUgMTEgOSAxMyAyNCAxNSAyMCAyIDQgOCAyIDIyIDIwIDE5IDQgMTUgMTQgMjggMTMgCisyNSAxMCAxMCAxMiAyOCAyNCAyMiAyNiAyOCAxNSA5IDExIDI2IDE5IDIyIDI3IDIgMjEgOCAyMCAyMyAyNiAxMiAyOCBeCis2MCAwIDIxIDkgMTUgMTMgMjUgNyAyNiAxIDEzIDUgOSAxIDMgOSAyMSAyMiA3IDEgMjMgMjggMSAyIDggMjIgMTIgMTggMjggNSAxOCAKKzE0IDcgMTEgMTcgMjAgMjAgNyAyMSAxMyA4IDI4IDIxIDIyIDIgMTYgMjAgMTUgMjggOSAzIDIyIDEzIDEwIDIzIDQgMTYgMTEgMTQgMSAKKzEwIDIwIF4KKzU0IDEgMTQgMTQgMTUgMTggMTMgMTIgMjEgMTggMjUgMTUgMjcgMTcgNSAxIDIzIDcgMTcgMjAgMTEgMTQgMTAgNCAyMSAxNyAxOSAyNSAKKzE3IDIyIDE4IDIxIDE5IDE3IDEwIDE1IDI2IDIwIDggMTMgMTkgNyA4IDE4IDcgMTIgMTQgNiA4IDIyIDIxIDExIDEwIDE0IDIzIDExIF4KKzU4IDAgOSAxNSAyMiAxOCA2IDE3IDI0IDcgMTMgNiAxMiA3IDIgMTggMTggMjYgMTMgMTMgMTYgOCAyNCAxMCAzIDI2IDkgMjAgMSAxMiAKKzIgMTQgMTMgMjMgMTIgMjUgMyAyNCAxMSA2IDMgOCAyNyA4IDIxIDI2IDMgMTEgMTkgMTggNSA1IDI1IDI2IDI0IDQgMjMgMTUgMTUgMjcgCiteCis2NCAxIDIxIDI0IDUgMTUgMjEgMyAzIDE4IDIgMjQgMjcgMTEgMjAgMTAgMTEgNCA1IDEyIDIgMjMgNiA1IDMgMSAxNCAyNiAxNSAxMiA2IAorMjggMTIgMTkgMjAgNiAyMyA0IDcgNyAzIDEwIDI0IDI4IDYgMTAgOSA2IDIwIDE0IDI3IDEwIDE5IDExIDEgMTUgMjEgNSAxMCA3IDExIAorOCAxNiA5IDI3IDIwIF4KKzU4IDEgMiA2IDYgMjcgMjAgMjQgMjEgMiAyMCAxNiAxNCAyNCAxNyAxNSAzIDIgMjYgMjUgMjUgMTQgMjQgMjAgMjggMTQgMTcgNSA5IAorMTAgMjUgMjAgMTIgOSAxOCAzIDE2IDQgMTAgNyAxOCAyMyAxNyAyIDggMSAyOCA3IDIgMTUgNSAxOCAxMSAyMyAyIDEgMTggMjIgMTQgCisyOCBeCis2MiAwIDIwIDIxIDIgMTEgMTIgMyAxNSAxMiA0IDEgMjcgMjEgMTYgMjcgMTkgMTggMTMgMjEgMTQgNSAyMCA5IDE5IDI3IDYgMyA1IDE2IAorMTYgMjIgMiAxMyA3IDQgMTMgMTkgMjcgMTUgNyAxNiAyNSAzIDQgNCAxNyAxMiAxMyAxMSAxMiAyNiA2IDEgMTAgMTUgMTggNCAxOSAxMCAKKzI3IDkgNCAyNiBeCis1MiAwIDEzIDIxIDI1IDI2IDIxIDIwIDEyIDI1IDIxIDcgMTcgMjggMjcgMyAxMyAxNCAxOSAzIDIzIDE5IDQgMjggMyAyMCAxOCA5IDcgCisxNSA0IDI2IDUgNiAyMCA1IDIzIDI4IDEwIDI0IDE5IDEzIDI4IDEgOSAxMiAyMyAxNiAxMCAxMyAyIDE5IDIxIDI3IF4KKzQ5IDEgMjUgMjIgMjggMjMgMTYgNyAyMCA0IDIgMjIgMTEgMjYgMjIgNiA5IDE3IDExIDIxIDUgMSAzIDI4IDExIDI3IDI1IDEyIDggMjYgCisyNiAyOCAyNCAxMyAyMiAxNyA2IDQgMjQgMTUgMTcgMTggNCAyMiAyMyA5IDI0IDEyIDI3IDI3IDI2IF4KKzU3IDAgOSAxMyAxNSAxMSA5IDIyIDI4IDI2IDExIDE4IDE1IDEwIDYgMTYgMTcgMTQgMTEgMjUgMjcgMTYgMjggMjIgMjQgMSAxIDExIDcgCisyNCAzIDI4IDcgNSAyOCAxNiAxNSAxIDcgMTQgOSA3IDYgMTUgMjUgMTkgOSAzIDE5IDIzIDEgMjYgMjAgMTcgMTcgMSAxNiAyNCA5IF4KKzUyIDEgOSAxNiA4IDE1IDYgMjEgMTcgMjIgOSAyOCA4IDggNSA0IDI0IDI3IDE0IDQgMjEgMjYgMjMgNyA4IDI3IDIzIDIzIDIyIDE5IAorMjQgMjUgMTYgMTkgMTIgMjIgMTAgMjAgMyA3IDE0IDEgMjAgNiAyNiAyMyAyNyA0IDE2IDIwIDE4IDEyIDIwIDE5IF4KKzUyIDEgMTkgMTYgMTggMjAgMjcgMTEgMTEgMTcgMjQgMTggMSAxOSAxIDI1IDIzIDIgMTUgMTYgMjYgMjcgMjMgMTQgMTIgMjggMjIgMTUgCis4IDE5IDIgMjAgMTMgMSAyNCAyIDI1IDEgNiAxOSAxOSA4IDExIDI0IDI0IDIxIDEzIDI3IDUgMTEgMjggMTcgNyAyNCBeCis1OSAwIDYgMjMgMjQgMTQgMjUgMTIgNSAxMyAyNiAyIDUgOCAxMCAxNiAxMSA1IDI2IDE4IDE5IDIxIDMgMTIgMTEgMTMgNCAxNCAyMiAKKzIyIDE0IDE2IDEzIDMgMjIgMTYgMjMgNSAxOSA2IDEzIDEwIDI2IDE3IDI3IDI2IDQgMyAyNSA2IDE0IDIgMyA1IDcgMjMgMTEgMjIgOCAKKzI1IDI2IF4KKzU5IDAgOSAyNSAxOCAxNyA4IDIgMTQgNCAxOSAxIDUgMjcgMTMgOSAyIDI3IDI4IDIgMTcgMjMgMTAgMjcgMTggMjYgNyAyMiAxNiAzIAorMjcgMSAyNiAyMSAyOCAxMCAzIDYgMiAyIDEwIDE3IDEzIDE2IDYgMTcgMjEgMjMgMTMgMjAgMjIgNSA2IDExIDEyIDEyIDggMjMgMTMgCisxNyAyMSBeCis1NiAxIDIzIDIwIDMgMjggMjcgMTIgMTcgMjUgMjggMTkgNSAyMSA0IDI3IDggMSAxOSAxNCAyMCA2IDcgOSAxIDYgMjIgMyAxOSAyNiAKKzE0IDggNiA3IDE5IDE1IDIzIDEgMTcgMTYgNiAyNiAxNCA1IDIyIDI1IDQgNyAxMCAxNiAyMSAxMCAxOCAxOSAyNCAxNiAyMyAyMCBeCis2MCAwIDMgMTcgMjggMTggMTAgMiA1IDMgMjEgMjEgMTUgNiAyNCAxIDQgMjQgMTggMTAgMjIgMSAyMSAxMiA1IDQgNCAyMCAyNSAyNCAKKzI2IDggMjUgMTEgMiA3IDI3IDIyIDE5IDQgMTggMjcgMTAgMjggNCAxMiAyNCA4IDE2IDEyIDExIDE2IDE3IDI1IDggMTIgMTYgMSA5IDkgCisxMCAyMSBeCis2MCAwIDI0IDIzIDE4IDUgMTQgMTggOCA0IDkgNSAxNyA4IDI4IDEgMjIgNCAxMSAzIDIgMTcgMyAxNCA5IDI3IDEzIDE4IDI0IDkgOCA3IAorMjggMjUgMTQgMjEgMjcgMjQgNiAxOCAxNiAyIDEyIDE1IDkgMTQgMTAgMSA4IDE3IDQgNiAxNSAyNiAxMSAxNSAyIDI4IDIwIDI2IDE2IAorMjUgXgorNTMgMSA3IDUgOCA5IDI2IDEwIDEyIDI1IDExIDkgMTMgMjQgMTUgMjAgMiA0IDggMiAyMiAyMCAxOSA0IDE1IDE0IDI4IDEzIDI1IDEwIAorMTAgMTIgMjggMjQgMjIgMjYgMjggMTUgOSAxMSAyNiAxOSAyMiAyNyAyIDIxIDggMjAgMjMgMjYgMTIgMTAgMjEgOSAyNCBeCis2MiAxIDEzIDI1IDcgMjYgMSAxMyA1IDkgMSAzIDkgMjEgMjIgNyAxIDIzIDI4IDEgMiA4IDIyIDEyIDE4IDI4IDUgMTggMTQgNyAxMSAKKzE3IDIwIDIwIDcgMjEgMTMgOCAyOCAyMSAyMiAyIDE2IDIwIDE1IDI4IDkgMyAyMiAxMyAxMCAyMyA0IDE2IDExIDE0IDEgMTAgOCAxNCAKKzE0IDE1IDE4IDEzIF4KKzU0IDAgMTIgMjEgMTggMjUgMTUgMjcgMTcgNSAxIDIzIDcgMTcgMjAgMTEgMTQgMTAgNCAyMSAxNyAxOSAyNSAxNyAyMiAxOCAyMSAxOSAKKzE3IDEwIDE1IDI2IDIwIDggMTMgMTkgNyA4IDE4IDcgMTIgMTQgNiA4IDIyIDIxIDExIDEwIDE0IDIzIDI1IDkgMTUgMjIgMTggMTMgXgorNTggMCAxNyAyNCA3IDEzIDYgMTIgNyAyIDE4IDE4IDI2IDEzIDEzIDE2IDggMjQgMTAgMyAyNiA5IDIwIDEgMTIgMiAxNCAxMyAyMyAxMiAKKzI1IDMgMjQgMTEgNiAzIDggMjcgOCAyMSAyNiAzIDExIDE5IDE4IDUgNSAyNSAyNiAyNCA0IDIzIDE1IDE1IDIzIDIxIDI0IDUgMTUgMjYgCiteCis2NyAxIDMgMyAxOCAyIDI0IDI3IDExIDIwIDEwIDExIDQgNSAxMiAyIDIzIDYgNSAzIDEgMTQgMjYgMTUgMTIgNiAyOCAxMiAxOSAyMCA2IAorMjMgNCA3IDcgMyAxMCAyNCAyOCA2IDEwIDkgNiAyMCAxNCAyNyAxMCAxOSAxMSAxIDE1IDIxIDUgMTAgNyAxMSA4IDE2IDkgMjcgNSAyIAorNiA2IDI3IDIwIDI0IDIxIDEyIF4KKzYyIDAgMjAgMTYgMTQgMjQgMTcgMTUgMyAyIDI2IDI1IDI1IDE0IDI0IDIwIDI4IDE0IDE3IDUgOSAxMCAyNSAyMCAxMiA5IDE4IDMgMTYgCis0IDEwIDcgMTggMjMgMTcgMiA4IDEgMjggNyAyIDE1IDUgMTggMTEgMjMgMiAxIDE4IDIyIDE0IDcgMjAgMjEgMiAxMSAxMiAzIDE1IDEyIAorNCAxIDI3IDE4IF4KKzYxIDEgNCA5IDE0IDE2IDE1IDggMTEgMjEgMjAgMTAgMTAgMjEgMjMgMjAgMiAxMSAyMyAxIDExIDEgNSAzIDIzIDE2IDE1IDI3IDE0IDUgCisxNiAzIDIyIDIgMyAyNCAzIDE5IDI5IDQgNCAxMCA4IDIwIDE0IDE1IDEgMjYgMTIgMjcgMjUgNCAyOCAyMiAxMSAxOSAxOSAyNCA1IDIwIAorOCA5IDI2IF4KKzU1IDEgMjUgMTkgMTcgMTkgMTUgNyAyNCAyNCAyMSAzIDIwIDE2IDggMyAxNyAyOCAxOCAyOSA5IDIzIDkgMTAgMjkgNCAxMiAyNCAxNSAKKzUgOCAyMiAxNyAyOSAxMiAzIDggMjkgMTUgMjEgMjEgNCA3IDIwIDcgMTAgNyAyNiAxMCAxNiAyNCA2IDcgMTIgOCAxMiAyOCBeCis1MiAxIDI0IDkgMTcgMTEgMjggMTIgMjYgMjYgNiAyOSAxMyAxMCAyMCA2IDIzIDEwIDQgMyAyNiAyNiAxNCAyMCAyMCAyNSAxNCAxMyAKKzE1IDI0IDE0IDExIDQgMjMgMjcgMjQgMjAgOSAxNiAxNyAyNCAxMyAxMiA2IDEgMTQgMjYgMjUgNyA4IDIxIDEgMTkgMjcgXgorNjUgMCAzIDIgMiAxNyAyMSAxMyA1IDkgMjEgMjggOSAxIDEzIDIgMjEgOCAyNCAxIDMgMjcgMTMgMTggMTkgNCAxNSAxMiA1IDIgMTYgCisyNyAxNiA2IDIgMSAyMyAxNyAxNCAyOCAxOSAyMyA2IDIyIDE2IDQgMTkgNiAxNiAyOCAzIDMgMSAxNSAxMyAyMiA2IDE1IDExIDYgNCAKKzI0IDI1IDE1IDE5IDIzIDEyIF4KKzU1IDAgMSA5IDE1IDEwIDEyIDcgMjUgMTEgMjUgMiAyNyA2IDYgMTggNCAxMyAxIDQgMTEgMjUgMTcgNiAyOSAyMSAyNCAyNyAyMSAxNyAKKzE3IDI2IDI0IDEzIDQgMjIgMjQgMjkgMiAxMSA4IDE3IDQgMjMgMTEgMjYgMSAyNSAyOCAxNSAxOSAxMCAzIDkgMjkgMjcgMjQgXgorNTMgMSAyMiAzIDI3IDIxIDIgMjYgMTkgOSAxOSAyNyAyMyAzIDEyIDE3IDEwIDQgOCAyNyAxOSAxNiAxIDIxIDIzIDI4IDIzIDE4IDggCisyNSAxOCAyNiAyMCA4IDE3IDE5IDIgNCAxMSA3IDE4IDYgMjQgMiAyNSAyNSA1IDI3IDIwIDMgMjggMjAgMTggMjEgMTEgXgorNTUgMCAyNSAxMCAxIDI4IDI4IDI5IDE2IDIwIDE5IDI2IDE2IDIxIDYgMjMgMTUgMjggMjYgMjggNyAxNSAxOCAxMSA1IDE3IDIwIDI2IAorMSAxMCAxNCA4IDQgMTYgMjYgMTcgOCAxMCAyMiAyMiAxOCAxIDIwIDI0IDcgMSA5IDcgMTkgNSAyMiAxIDQgMjYgMTEgMTAgMjAgXgorNTggMCA1IDE0IDIgNiA0IDIgOSAyMiAxNSAxMyAyMCAyMiAyNiAxOCAxNiA5IDIgMTUgMjAgMjcgOCA2IDE3IDUgMTUgOSAyNSAxMCAyNiAKKzQgNSAyNyA1IDE5IDIxIDUgNiAxMSAyOSAxOSA4IDIgMjQgMjYgMjIgMTkgMTggMTcgMjMgMTQgMjEgMTQgMjIgMTMgMjAgNSAyOSAxMiBeCis1NCAwIDUgMjYgNiAyMSAyOSAzIDUgMTIgMTYgMTEgMTMgMTYgMTggMTggMTAgMTEgMjAgMjEgMTIgMTEgMTIgMjIgMTQgMTkgMyAyMSAKKzE1IDYgMjUgMjYgMjkgMjQgMTkgMTcgMTggMjUgMjIgMTIgMTMgMjMgMjMgMTIgMTAgMTMgMSAyMiAxMCAyIDIyIDIgMjggMTAgMTcgMjggCiteCis1NiAwIDMgNiAxOSAyOCAxNyAxMSAxIDkgMTQgNCAyOSAyOSAyMyAyNSAxMyAxOSAxOCAyIDcgMjEgNiA4IDI5IDUgMTEgMjIgMTQgMTQgCis5IDI4IDEzIDI1IDI0IDI4IDggMTQgOSAzIDE0IDE4IDI2IDkgOSAxMiAxMyAxNyAyNSAxNiA1IDggNCAyNCAxMCAyNCAyMyAyNSBeCis0OSAwIDI5IDIxIDkgMTggMjggMjUgMTEgMyAxNiA0IDIxIDI1IDMgNCAxOCAxMiAxMiAyOSAyNiAxMyAyNiAyMyAyNiA3IDIzIDEwIDkgCisyNyAyNiAyMSAyNSAyMSAxOCA5IDI0IDE2IDIyIDUgMjEgNyA3IDI3IDQgMjAgMjMgMTMgMjcgMTAgMjcgXgorNTggMSAyOSA3IDE5IDEzIDEzIDggMTkgMjAgMTggMiAxOSAyMiAyOSAzIDEwIDYgOSAxMyAyNCAxNyAxNiA5IDIwIDIxIDI3IDIgMTkgNyAKKzggMjYgMjUgMTIgMiAxNCAzIDEgMSAxNiAxMiAyMCAyOCAyNCAxMiA1IDI0IDI1IDIwIDEgMTIgMjUgOSAyIDYgMjAgMTUgMTQgMjkgMjAgCiteCis1NiAwIDIxIDI4IDEgMTcgNiAxNyAyNyAxIDIgMTAgMTYgMTkgNSAxNCAxMCAyNyAxMSAxNyAzIDI5IDE0IDI3IDE3IDUgMiAxOCAyMCAKKzExIDI3IDE4IDIyIDI3IDIyIDkgOCAxOCAzIDE0IDEwIDUgMiAyNCAxOCAyMyAyMSAyNiA4IDIyIDggMSA2IDI3IDI3IDE1IDI5IDE4IF4KKzY0IDAgMiAyOSAyMiA4IDE2IDIwIDQgMTIgOSA2IDEyIDE2IDE2IDcgOSAyMCAyOSAxMSA5IDQgMSAxNSAyNSAxNiAyOSAxMCAyMiA3IDIgCis4IDUgMTggMTQgMjMgMjQgNCA2IDI2IDMgMTEgNiAxMiAxIDcgMTQgMjQgMTQgNiAxMCAyMSAxNiAyMyAyOSAyNSA2IDE0IDE3IDIgMTIgCisxMCA1IDEwIDE1IDI1IF4KKzYyIDEgOCAxNSAzIDcgMTMgMjUgMTYgMTQgMSAyOSAyMiAyNiAxNSAyNyA5IDEgOCA4IDI4IDYgMTMgNSAxMyAzIDE1IDUgMjMgOCAyMyAKKzIgNSA1IDQgMTcgMTMgMTQgNyAxNyAxMiAyNyAzIDE4IDUgNyA1IDI2IDE4IDE1IDIyIDI4IDE2IDEzIDcgMiAyMyAxOSAyNSAyOSAxNyAKKzcgMTYgMjIgXgorNTUgMSAyMyAxMSAxMSAxNSAyIDEzIDkgMjYgMiAyNCAyNiA3IDI4IDExIDIgMjkgNyAyMiAyMyA1IDI4IDE5IDEgMjcgMjkgMSAyNCAxMSAKKzE4IDIwIDMgMTMgMTEgNyAzIDE1IDE3IDI0IDEgMTggMTMgNiAzIDI1IDI3IDE2IDI4IDE4IDI0IDggMjMgNyAyOSAyOCAxNSBeCis1MiAwIDI4IDE0IDEyIDI4IDI3IDIyIDQgMTQgMjUgMSAzIDkgNyAxMSAxNCAxNSAxNiAxMCAxOSAxMiAxOSAxMSAyMCAxMyAyOCA0IDI3IAorMjggNyAyNyAxMiA0IDI4IDIxIDE3IDIyIDIwIDE3IDE1IDE1IDIzIDIyIDEzIDEyIDIxIDIyIDIxIDExIDEyIDE0IDEyIDI4IF4KKzYyIDAgMjcgOCA3IDQgOSAxNCAxNiAxNSA4IDExIDIxIDIwIDEwIDEwIDIxIDIzIDIwIDIgMTEgMjMgMSAxMSAxIDUgMyAyMyAxNiAxNSAKKzI3IDE0IDUgMTYgMyAyMiAyIDMgMjQgMyAxOSAyOSA0IDQgMTAgOCAyMCAxNCAxNSAxIDI2IDEyIDI3IDI1IDQgMjggMjIgMTEgMTkgMTkgCisyNCA1IDIwIDE4IF4KKzU4IDAgOSA1IDI1IDE5IDE3IDE5IDE1IDcgMjQgMjQgMjEgMyAyMCAxNiA4IDMgMTcgMjggMTggMjkgOSAyMyA5IDEwIDI5IDQgMTIgMjQgCisxNSA1IDggMjIgMTcgMjkgMTIgMyA4IDI5IDE1IDIxIDIxIDQgNyAyMCA3IDEwIDcgMjYgMTAgMTYgMjQgNiA3IDEyIDggMTIgMTUgMTYgXgorNTYgMCA5IDE3IDExIDI4IDEyIDI2IDI2IDYgMjkgMTMgMTAgMjAgNiAyMyAxMCA0IDMgMjYgMjYgMTQgMjAgMjAgMjUgMTQgMTMgMTUgCisyNCAxNCAxMSA0IDIzIDI3IDI0IDIwIDkgMTYgMTcgMjQgMTMgMTIgNiAxIDE0IDI2IDI1IDcgOCAyMSAxIDE5IDMgMiAyIDE3IDIxIDIzIAorXgorNjQgMSA1IDkgMjEgMjggOSAxIDEzIDIgMjEgOCAyNCAxIDMgMjcgMTMgMTggMTkgNCAxNSAxMiA1IDIgMTYgMjcgMTYgNiAyIDEgMjMgCisxNyAxNCAyOCAxOSAyMyA2IDIyIDE2IDQgMTkgNiAxNiAyOCAzIDMgMSAxNSAxMyAyMiA2IDE1IDExIDYgNCAyNCAyNSAxNSAxOSAyMyAKKzI4IDEgOSAxNSAxMCAyNCBeCis1NCAwIDcgMjUgMTEgMjUgMiAyNyA2IDYgMTggNCAxMyAxIDQgMTEgMjUgMTcgNiAyOSAyMSAyNCAyNyAyMSAxNyAxNyAyNiAyNCAxMyA0IAorMjIgMjQgMjkgMiAxMSA4IDE3IDQgMjMgMTEgMjYgMSAyNSAyOCAxNSAxOSAxMCAzIDkgMjkgMjcgNyAyMiAzIDI3IDI5IF4KKzU0IDEgMiAyNiAxOSA5IDE5IDI3IDIzIDMgMTIgMTcgMTAgNCA4IDI3IDE5IDE2IDEgMjEgMjMgMjggMjMgMTggOCAyNSAxOCAyNiAyMCAKKzggMTcgMTkgMiA0IDExIDcgMTggNiAyNCAyIDI1IDI1IDUgMjcgMjAgMyAyOCAyMCAxOCAyMSAxMCAyNSAxMCAxIDI4IDI3IF4KKzYwIDAgMjkgMTYgMjAgMTkgMjYgMTYgMjEgNiAyMyAxNSAyOCAyNiAyOCA3IDE1IDE4IDExIDUgMTcgMjAgMjYgMSAxMCAxNCA4IDQgMTYgCisyNiAxNyA4IDEwIDIyIDIyIDE4IDEgMjAgMjQgNyAxIDkgNyAxOSA1IDIyIDEgNCAyNiAxMSAxMCAyOCA1IDE0IDIgNiA0IDIgOSAyMiAKKzE1IDIyIF4KKzU0IDEgMjAgMjIgMjYgMTggMTYgOSAyIDE1IDIwIDI3IDggNiAxNyA1IDE1IDkgMjUgMTAgMjYgNCA1IDI3IDUgMTkgMjEgNSA2IDExIAorMjkgMTkgOCAyIDI0IDI2IDIyIDE5IDE4IDE3IDIzIDE0IDIxIDE0IDIyIDEzIDIwIDUgMjkgNiA1IDI2IDYgMjEgMjkgMjggXgorNTcgMSA1IDEyIDE2IDExIDEzIDE2IDE4IDE4IDEwIDExIDIwIDIxIDEyIDExIDEyIDIyIDE0IDE5IDMgMjEgMTUgNiAyNSAyNiAyOSAyNCAKKzE5IDE3IDE4IDI1IDIyIDEyIDEzIDIzIDIzIDEyIDEwIDEzIDEgMjIgMTAgMiAyMiAyIDI4IDEwIDE3IDE4IDMgNiAxOSAyOCAxNyAxMSAKKzEgOSAyMyBeCis1NCAwIDE0IDQgMjkgMjkgMjMgMjUgMTMgMTkgMTggMiA3IDIxIDYgOCAyOSA1IDExIDIyIDE0IDE0IDkgMjggMTMgMjUgMjQgMjggOCAKKzE0IDkgMyAxNCAxOCAyNiA5IDkgMTIgMTMgMTcgMjUgMTYgNSA4IDQgMjQgMTAgMjQgMjMgNCAyOSAyMSA5IDE4IDI4IDI3IF4KKzUyIDEgMTEgMyAxNiA0IDIxIDI1IDMgNCAxOCAxMiAxMiAyOSAyNiAxMyAyNiAyMyAyNiA3IDIzIDEwIDkgMjcgMjYgMjEgMjUgMjEgMTggCis5IDI0IDE2IDIyIDUgMjEgNyA3IDI3IDQgMjAgMjMgMTMgMjcgMTAgMjMgMjkgNyAxOSAxMyAxMyA4IDE5IDIwIDIzIF4KKzYxIDAgMiAxOSAyMiAyOSAzIDEwIDYgOSAxMyAyNCAxNyAxNiA5IDIwIDIxIDI3IDIgMTkgNyA4IDI2IDI1IDEyIDIgMTQgMyAxIDEgMTYgCisxMiAyMCAyOCAyNCAxMiA1IDI0IDI1IDIwIDEgMTIgMjUgOSAyIDYgMjAgMTUgMTQgMjkgMTggMjEgMjggMSAxNyA2IDE3IDI3IDEgMiAKKzEwIDE2IDE5IF4KKzU3IDEgNSAxNCAxMCAyNyAxMSAxNyAzIDI5IDE0IDI3IDE3IDUgMiAxOCAyMCAxMSAyNyAxOCAyMiAyNyAyMiA5IDggMTggMyAxNCAxMCAKKzUgMiAyNCAxOCAyMyAyMSAyNiA4IDIyIDggMSA2IDI3IDI3IDE1IDI5IDIwIDIgMjkgMjIgOCAxNiAyMCA0IDEyIDkgNiAxMiAxNiAyNCBeCis2NCAwIDcgOSAyMCAyOSAxMSA5IDQgMSAxNSAyNSAxNiAyOSAxMCAyMiA3IDIgOCA1IDE4IDE0IDIzIDI0IDQgNiAyNiAzIDExIDYgMTIgCisxIDcgMTQgMjQgMTQgNiAxMCAyMSAxNiAyMyAyOSAyNSA2IDE0IDE3IDIgMTIgMTAgNSAxMCAxNSAyNSA4IDE1IDMgNyAxMyAyNSAxNiAKKzE0IDEgMjkgMjIgMjYgMTAgXgorNjMgMSAyNyA5IDEgOCA4IDI4IDYgMTMgNSAxMyAzIDE1IDUgMjMgOCAyMyAyIDUgNSA0IDE3IDEzIDE0IDcgMTcgMTIgMjcgMyAxOCA1IAorNyA1IDI2IDE4IDE1IDIyIDI4IDE2IDEzIDcgMiAyMyAxOSAyNSAyOSAxNyA3IDE2IDI1IDIzIDExIDExIDE1IDIgMTMgOSAyNiAyIDI0IAorMjYgNyAyOCAxMSBeCis1NiAxIDIgMjkgNyAyMiAyMyA1IDI4IDE5IDEgMjcgMjkgMSAyNCAxMSAxOCAyMCAzIDEzIDExIDcgMyAxNSAxNyAyNCAxIDE4IDEzIDYgCiszIDI1IDI3IDE2IDI4IDE4IDI0IDggMjMgNyAyOSAyOCA2IDI4IDE0IDEyIDI4IDI3IDIyIDQgMTQgMjUgMSAzIDkgNyAxMSAyOSBeCis1NCAwIDE1IDE2IDEwIDE5IDEyIDE5IDExIDIwIDEzIDI4IDQgMjcgMjggNyAyNyAxMiA0IDI4IDIxIDE3IDIyIDIwIDE3IDE1IDE1IDIzIAorMjIgMTMgMTIgMjEgMjIgMjEgMTEgMTIgMTQgMTIgMTggMjcgOCA3IDQgOSAxNCAxNiAxNSA4IDExIDIxIDIwIDEwIDEwIDIxIDIzIDIyIF4KKzYzIDAgMiAxMSAyMyAxIDExIDEgNSAzIDIzIDE2IDE1IDI3IDE0IDUgMTYgMyAyMiAyIDMgMjQgMyAxOSAyOSA0IDQgMTAgOCAyMCAxNCAKKzE1IDEgMjYgMTIgMjcgMjUgNCAyOCAyMiAxMSAxOSAxOSAyNCA1IDIwIDggOSA1IDI1IDE5IDE3IDE5IDE1IDcgMjQgMjQgMjEgMyAyMCAKKzE2IDggMyAxNyAxOSBeCis1OSAwIDE4IDI5IDkgMjMgOSAxMCAyOSA0IDEyIDI0IDE1IDUgOCAyMiAxNyAyOSAxMiAzIDggMjkgMTUgMjEgMjEgNCA3IDIwIDcgMTAgCis3IDI2IDEwIDE2IDI0IDYgNyAxMiA4IDEyIDE1IDI0IDkgMTcgMTEgMjggMTIgMjYgMjYgNiAyOSAxMyAxMCAyMCA2IDIzIDEwIDQgMyAKKzI2IDEwIF4KKzYyIDAgMTQgMjAgMjAgMjUgMTQgMTMgMTUgMjQgMTQgMTEgNCAyMyAyNyAyNCAyMCA5IDE2IDE3IDI0IDEzIDEyIDYgMSAxNCAyNiAyNSAKKzcgOCAyMSAxIDE5IDMgMiAyIDE3IDIxIDEzIDUgOSAyMSAyOCA5IDEgMTMgMiAyMSA4IDI0IDEgMyAyNyAxMyAxOCAxOSA0IDE1IDEyIDUgCisyIDE2IDI3IDI5IF4KKzYyIDAgNiAyIDEgMjMgMTcgMTQgMjggMTkgMjMgNiAyMiAxNiA0IDE5IDYgMTYgMjggMyAzIDEgMTUgMTMgMjIgNiAxNSAxMSA2IDQgMjQgCisyNSAxNSAxOSAyMyAyOCAxIDkgMTUgMTAgMTIgNyAyNSAxMSAyNSAyIDI3IDYgNiAxOCA0IDEzIDEgNCAxMSAyNSAxNyA2IDI5IDIxIDI0IAorMjcgMjEgMTggXgorNTQgMSAxNyAyNiAyNCAxMyA0IDIyIDI0IDI5IDIgMTEgOCAxNyA0IDIzIDExIDI2IDEgMjUgMjggMTUgMTkgMTAgMyA5IDI5IDI3IDcgCisyMiAzIDI3IDIxIDIgMjYgMTkgOSAxOSAyNyAyMyAzIDEyIDE3IDEwIDQgOCAyNyAxOSAxNiAxIDIxIDIzIDI4IDIzIDE4IDE3IF4KKzUyIDAgMjUgMTggMjYgMjAgOCAxNyAxOSAyIDQgMTEgNyAxOCA2IDI0IDIgMjUgMjUgNSAyNyAyMCAzIDI4IDIwIDE4IDIxIDEwIDI1IAorMTAgMSAyOCAyOCAyOSAxNiAyMCAxOSAyNiAxNiAyMSA2IDIzIDE1IDI4IDI2IDI4IDcgMTUgMTggMTEgNSAxNyAyMCAxMyBeCis2OCAwIDEgMTAgMTQgOCA0IDE2IDI2IDE3IDggMTAgMjIgMjIgMTggMSAyMCAyNCA3IDEgOSA3IDE5IDUgMjIgMSA0IDI2IDExIDEwIDI4IAorNSAxNCAyIDYgNCAyIDkgMjIgMTUgMTMgMjAgMjIgMjYgMTggMTYgOSAyIDE1IDIwIDI3IDggNiAxNyA1IDE1IDkgMjUgMTAgMjYgNCA1IAorMjcgNSAxOSAyMSA1IDYgMTEgMTkgXgorNTQgMSAxOSA4IDIgMjQgMjYgMjIgMTkgMTggMTcgMjMgMTQgMjEgMTQgMjIgMTMgMjAgNSAyOSA2IDUgMjYgNiAyMSAyOSAzIDUgMTIgCisxNiAxMSAxMyAxNiAxOCAxOCAxMCAxMSAyMCAyMSAxMiAxMSAxMiAyMiAxNCAxOSAzIDIxIDE1IDYgMjUgMjYgMjkgMjQgMTkgMTcgMjQgXgorNTkgMCAyNSAyMiAxMiAxMyAyMyAyMyAxMiAxMCAxMyAxIDIyIDEwIDIgMjIgMiAyOCAxMCAxNyAxOCAzIDYgMTkgMjggMTcgMTEgMSA5IAorMTQgNCAyOSAyOSAyMyAyNSAxMyAxOSAxOCAyIDcgMjEgNiA4IDI5IDUgMTEgMjIgMTQgMTQgOSAyOCAxMyAyNSAyNCAyOCA4IDE0IDkgMyAKKzE0IDE2IF4KKzUzIDAgMjYgOSA5IDEyIDEzIDE3IDI1IDE2IDUgOCA0IDI0IDEwIDI0IDIzIDQgMjkgMjEgOSAxOCAyOCAyNSAxMSAzIDE2IDQgMjEgMjUgCiszIDQgMTggMTIgMTIgMjkgMjYgMTMgMjYgMjMgMjYgNyAyMyAxMCA5IDI3IDI2IDIxIDI1IDIxIDE4IDkgMjQgMTYgMTcgXgorNTkgMCA1IDIxIDcgNyAyNyA0IDIwIDIzIDEzIDI3IDEwIDIzIDI5IDcgMTkgMTMgMTMgOCAxOSAyMCAxOCAyIDE5IDIyIDI5IDMgMTAgNiAKKzkgMTMgMjQgMTcgMTYgOSAyMCAyMSAyNyAyIDE5IDcgOCAyNiAyNSAxMiAyIDE0IDMgMSAxIDE2IDEyIDIwIDI4IDI0IDEyIDUgMjQgMjUgCisxOSBeCis2MCAwIDEgMTIgMjUgOSAyIDYgMjAgMTUgMTQgMjkgMTggMjEgMjggMSAxNyA2IDE3IDI3IDEgMiAxMCAxNiAxOSA1IDE0IDEwIDI3IDExIAorMTcgMyAyOSAxNCAyNyAxNyA1IDIgMTggMjAgMTEgMjcgMTggMjIgMjcgMjIgOSA4IDE4IDMgMTQgMTAgNSAyIDI0IDE4IDIzIDIxIDI2IAorOCAyMiAxMyBeCis2MiAwIDEgNiAyNyAyNyAxNSAyOSAyMCAyIDI5IDIyIDggMTYgMjAgNCAxMiA5IDYgMTIgMTYgMTYgNyA5IDIwIDI5IDExIDkgNCAxIDE1IAorMjUgMTYgMjkgMTAgMjIgNyAyIDggNSAxOCAxNCAyMyAyNCA0IDYgMjYgMyAxMSA2IDEyIDEgNyAxNCAyNCAxNCA2IDEwIDIxIDE2IDIzIAorMjkgMjUgMjQgXgorNjcgMCAxNCAxNyAyIDEyIDEwIDUgMTAgMTUgMjUgOCAxNSAzIDcgMTMgMjUgMTYgMTQgMSAyOSAyMiAyNiAxNSAyNyA5IDEgOCA4IDI4IAorNiAxMyA1IDEzIDMgMTUgNSAyMyA4IDIzIDIgNSA1IDQgMTcgMTMgMTQgNyAxNyAxMiAyNyAzIDE4IDUgNyA1IDI2IDE4IDE1IDIyIDI4IAorMTYgMTMgNyAyIDIzIDE5IDI1IDE0IF4KKzU4IDEgMTcgNyAxNiAyNSAyMyAxMSAxMSAxNSAyIDEzIDkgMjYgMiAyNCAyNiA3IDI4IDExIDIgMjkgNyAyMiAyMyA1IDI4IDE5IDEgMjcgCisyOSAxIDI0IDExIDE4IDIwIDMgMTMgMTEgNyAzIDE1IDE3IDI0IDEgMTggMTMgNiAzIDI1IDI3IDE2IDI4IDE4IDI0IDggMjMgNyAyOSAKKzExIF4KKzU1IDAgNiAyOCAxNCAxMiAyOCAyNyAyMiA0IDE0IDI1IDEgMyA5IDcgMTEgMTQgMTUgMTYgMTAgMTkgMTIgMTkgMTEgMjAgMTMgMjggNCAKKzI3IDI4IDcgMjcgMTIgNCAyOCAyMSAxNyAyMiAyMCAxNyAxNSAxNSAyMyAyMiAxMyAxMiAyMSAyMiAyMSAxMSAxMiAxNCAxMiAxOCAyNyAKKzEwIF4KKzY1IDAgNyA0IDkgMTQgMTYgMTUgOCAxMSAyMSAyMCAxMCAxMCAyMSAyMyAyMCAyIDExIDIzIDEgMTEgMSA1IDMgMjMgMTYgMTUgMjcgMTQgCis1IDE2IDMgMjIgMiAzIDI0IDMgMTkgMjkgNCA0IDEwIDggMjAgMTQgMTUgMSAyNiAxMiAyNyAyNSA0IDI4IDIyIDExIDE5IDE5IDI0IDUgCisyMCA4IDkgNSAyNSAxOSAyMCBeCis1OSAxIDE5IDE1IDcgMjQgMjQgMjEgMyAyMCAxNiA4IDMgMTcgMjggMTggMjkgOSAyMyA5IDEwIDI5IDQgMTIgMjQgMTUgNSA4IDIyIDE3IAorMjkgMTIgMyA4IDI5IDE1IDIxIDIxIDQgNyAyMCA3IDEwIDcgMjYgMTAgMTYgMjQgNiA3IDEyIDggMTIgMTUgMjQgOSAxNyAxMSAyOCAxMiAKKzIzIF4KKzYxIDAgMjYgNiAyOSAxMyAxMCAyMCA2IDIzIDEwIDQgMyAyNiAyNiAxNCAyMCAyMCAyNSAxNCAxMyAxNSAyNCAxNCAxMSA0IDIzIDI3IAorMjQgMjAgOSAxNiAxNyAyNCAxMyAxMiA2IDEgMTQgMjYgMjUgNyA4IDIxIDEgMTkgMyAyIDIgMTcgMjEgMTMgNSA5IDIxIDI4IDkgMSAxMyAKKzIgMjEgOCAyOSBeCis2OCAwIDEgMyAyNyAxMyAxOCAxOSA0IDE1IDEyIDUgMiAxNiAyNyAxNiA2IDIgMSAyMyAxNyAxNCAyOCAxOSAyMyA2IDIyIDE2IDQgMTkgCis2IDE2IDI4IDMgMyAxIDE1IDEzIDIyIDYgMTUgMTEgNiA0IDI0IDI1IDE1IDE5IDIzIDI4IDEgOSAxNSAxMCAxMiA3IDI1IDExIDI1IDIgCisyNyA2IDYgMTggNCAxMyAxIDQgMTEgMjYgXgorNTQgMSAxNyA2IDI5IDIxIDI0IDI3IDIxIDE3IDE3IDI2IDI0IDEzIDQgMjIgMjQgMjkgMiAxMSA4IDE3IDQgMjMgMTEgMjYgMSAyNSAyOCAKKzE1IDE5IDEwIDMgOSAyOSAyNyA3IDIyIDMgMjcgMjEgMiAyNiAxOSA5IDE5IDI3IDIzIDMgMTIgMTcgMTAgNCA4IDI3IDIwIF4KKzUyIDEgMTYgMSAyMSAyMyAyOCAyMyAxOCA4IDI1IDE4IDI2IDIwIDggMTcgMTkgMiA0IDExIDcgMTggNiAyNCAyIDI1IDI1IDUgMjcgMjAgCiszIDI4IDIwIDE4IDIxIDEwIDI1IDEwIDEgMjggMjggMjkgMTYgMjAgMTkgMjYgMTYgMjEgNiAyMyAxNSAyOCAyNiAxMiBeCis2NyAwIDcgMTUgMTggMTEgNSAxNyAyMCAyNiAxIDEwIDE0IDggNCAxNiAyNiAxNyA4IDEwIDIyIDIyIDE4IDEgMjAgMjQgNyAxIDkgNyAKKzE5IDUgMjIgMSA0IDI2IDExIDEwIDI4IDUgMTQgMiA2IDQgMiA5IDIyIDE1IDEzIDIwIDIyIDI2IDE4IDE2IDkgMiAxNSAyMCAyNyA4IDYgCisxNyA1IDE1IDkgMjUgMTAgMjYgMTkgXgorNTggMCA1IDI3IDUgMTkgMjEgNSA2IDExIDI5IDE5IDggMiAyNCAyNiAyMiAxOSAxOCAxNyAyMyAxNCAyMSAxNCAyMiAxMyAyMCA1IDI5IAorNiA1IDI2IDYgMjEgMjkgMyA1IDEyIDE2IDExIDEzIDE2IDE4IDE4IDEwIDExIDIwIDIxIDEyIDExIDEyIDIyIDE0IDE5IDMgMjEgMTUgNiAKKzI1IDI3IF4KKzU3IDAgMjkgMjQgMTkgMTcgMTggMjUgMjIgMTIgMTMgMjMgMjMgMTIgMTAgMTMgMSAyMiAxMCAyIDIyIDIgMjggMTAgMTcgMTggMyA2IAorMTkgMjggMTcgMTEgMSA5IDE0IDQgMjkgMjkgMjMgMjUgMTMgMTkgMTggMiA3IDIxIDYgOCAyOSA1IDExIDIyIDE0IDE0IDkgMjggMTMgCisyNSAyNSBeCis1MiAwIDE1IDI5IDkgMjggMjAgMiAzMCAyNiAyMSAxNyA4IDI4IDE3IDIyIDI5IDI0IDggMTEgMTggMjkgMTUgNiA3IDI3IDI3IDE3IDI0IAorMTggMjMgMTEgMTkgOCAzMCA1IDI0IDIyIDEyIDI1IDE1IDI4IDIzIDUgMTAgMjEgNSA4IDcgMyAxMCAxOSAxNyAxOCBeCis2MiAwIDkgMTUgMjkgMTAgNyA0IDEgMTYgMjEgMTYgMjkgMTMgMTggNSAzIDggMTUgOCAyMSAyOSAyMCA1IDI3IDIgMTMgMjcgNyA3IDMwIAorMiAxOCAyNiAxMCAyIDUgMjkgMjEgMTUgMjUgMjYgMjQgOCAxMiAyMCAzIDkgMTAgMzAgNyAxMiAyNCA1IDEzIDEgNiAxMCAyNSAxMyA5IAorMjkgMzAgNyBeCis2MiAwIDI5IDE3IDI2IDYgMjUgNCA3IDI1IDggMTUgMjYgMzAgMTEgMiA5IDYgMjIgNiAyMSAyOCAzIDMgNiAxMiAxMyAxNSA3IDE3IDE2IAorMjYgMyAxOSAzIDUgMiAyOSAxNiAxNiAyMiAyNiAxMyAxMiA5IDE5IDE2IDI3IDI1IDE2IDcgMTUgMjIgMjIgNSA2IDEzIDQgMTIgMTEgCisyNyA1IDE5IDE1IF4KKzU3IDAgOSAzMCA5IDEgMjggMyAyMSAyMiA3IDE3IDIgMjUgMSAyOCAyMSAxMSAxNyAyMCAyOCAxMiAxMCAxMCAzIDE1IDEzIDIwIDEgMjAgCisxMSAxIDMwIDIyIDIzIDE1IDI2IDEyIDIxIDcgMjcgOSAyNyAyOSA1IDI2IDE2IDExIDIzIDI4IDE4IDEgMTMgMjMgMzAgNiAzIDExIDI1IAorXgorNjEgMSAxNiAxMCAxMyAxMyAxOSAxNSAxOCA3IDIyIDEwIDI5IDMgMjUgMzAgOCAyMiAxMyA0IDQgMjcgMjIgMTggMjEgMjMgMTcgMTUgCisxNiAxOSAyMCAxNyAxMCAxNyAyMSAyMCA2IDE0IDE0IDEgMTAgMTggNCA1IDUgOSAxNyAxOCAxNCA1IDEyIDIyIDIyIDExIDggMTggMjQgCisyMSAzIDcgMjEgOSAyMiBeCis1OCAxIDMgNCAyMyAxNCAxNyAyNSAyNyAxMCA1IDE2IDMwIDIzIDIgNCAyNSAzIDE2IDI4IDQgNiA2IDE3IDEyIDE4IDIgMjMgNyAyOSAKKzIzIDI5IDI3IDE5IDcgMjAgMjEgMjUgNSAxNyA5IDcgMSAyMSAyMCAxOSAyOSAxOSAxNCA4IDIzIDIzIDE5IDMgMTggMTcgMyAyOSAxNCAKKzE3IF4KKzYyIDEgMjMgMjggNSAyMiA4IDEwIDEgMSAxMSAyNyAxOCAzIDIgMjIgMjggMTQgMjQgMTIgMSAzIDMwIDI5IDExIDIyIDE5IDcgMTYgMSAKKzExIDQgMjggOCAyMCAyNSAyIDYgOCA1IDE0IDExIDIxIDkgMTYgOCAyNSA2IDI2IDI3IDEgMjkgMTIgOCAxNiA0IDE3IDUgMzAgMzAgMjQgCisxMiAxOSAyMSBeCis1NyAxIDI1IDExIDEzIDEyIDI3IDE2IDE0IDMgMjQgMjAgMjQgMjMgMjIgOSAxNCAxOSAyNiA4IDEzIDYgMTMgMjUgMTkgNSAxIDE5IDEgCisxNyAyOCAzMCAxMyAyMSAxMSA0IDEwIDIzIDI1IDcgNSAxMSAyMCA3IDI0IDI5IDI3IDEzIDE2IDE3IDEgMTUgMTIgMjkgNCAxNiAyNyAKKzEyIDIxIF4KKzY1IDAgMiAyIDI0IDE3IDEzIDIyIDIwIDIyIDQgMjAgMTYgMiAxNyAzIDExIDI5IDEgNSAxMCAxNCAyMyAzIDE0IDkgMiA3IDE4IDIwIAorMTMgMiAxNiAyNSAyNCA0IDQgMTQgNyAxMyA4IDIwIDEyIDIzIDEgMjYgNyA5IDE5IDYgMTYgMyA4IDI2IDIxIDEwIDI2IDIzIDI0IDI4IAorMTYgMTIgMTQgMjUgMjIgMTYgMTUgXgorNTMgMCAyMSAyNCAyNyAzMCAxNSAxMCAxNSAyIDE4IDEzIDI2IDI4IDIzIDE2IDIzIDEwIDIgMTEgMjYgMjYgNCAyOSAxOCA0IDI0IDI0IAorMSAyNCAxMyA1IDIxIDI5IDI2IDIgMTAgMTYgNiA1IDcgMjMgMTkgMTEgMjggMjIgMjEgMSAyNCAxOSA3IDI2IDE4IDMwIDI2IF4KKzU4IDAgMjEgNiAxOCAyMiAyIDEgMTQgMiAxNCA1IDI1IDEgMjcgMjQgNiAyMyAxNiA1IDEgMjAgMjkgMjIgMjUgOSAyNSAxMCAzIDI4IAorMjggMjUgMTkgMTggMTYgMjQgMTQgMTUgNSAyOCAxMiAyOCAyNiAyOSAyIDE1IDE1IDkgNSAxOCAxOSAyMiAxMiAxNSA0IDYgMTUgMjQgCisxNiAyMiBeCis1OSAwIDQgMjYgMjUgMTggMjcgMTkgMjAgNCAyNiAxMiAzIDIyIDEgMjIgMzAgMyAyOCAxMCA5IDI0IDE0IDI5IDYgMzAgMyAxMCAyMCAKKzE0IDYgMyAxOSAyMSAyMSAyOCAxNiAxOCAxMSAzMCAxMSAyMCAzMCAxIDkgOCAxMSA1IDE5IDEwIDI0IDQgMjIgNCAyIDI2IDUgMTUgMjAgCis4IDI1IF4KKzU1IDEgMTMgMzAgMTggOCAxIDI1IDI4IDIwIDIwIDE1IDIxIDE4IDE4IDEyIDE2IDEzIDI0IDkgMjEgMiAyOCA2IDEgMjMgOSAxOCAyNyAKKzI3IDQgOSAxMyAxMCA4IDE0IDE2IDE1IDEyIDExIDE0IDIxIDE0IDEwIDExIDI1IDE3IDE3IDMwIDIxIDEzIDI3IDI2IDI2IDIyIDE0IAorMjEgXgorNTcgMCAxNyAyMSAxOSA5IDkgMjAgMjMgMTMgNyAxMCAyOCAyNCAxMCAyMiAyNyAyMyAyNyA4IDE3IDE0IDYgNCAyMSAyNiAxNSAxIDggCisyOSAyNyA2IDI4IDE1IDMgMjcgMjUgMjUgMTQgMTkgMTMgMjkgOCAyNCAyIDggMiA0IDEyIDE5IDExIDEwIDYgMjYgMTQgMjIgMjQgMzAgCisyIF4KKzU2IDEgMTEgMTIgMiAxMiAxNyAyMyA4IDggMTIgMjggMTMgMTQgMjggMiAxNyA0IDggMyAyNiA5IDIzIDIxIDMwIDMwIDIwIDQgMTMgMjggCisyOSA5IDMgMTcgNyAxOSAzMCAyOCAxIDIgMjAgOSAxMiAyNCAxNSAzMCAyMCAyNyAzIDIzIDExIDYgMjkgMjUgMjMgMjYgMTcgMjMgXgorNjEgMSAxMCAyMiAxNSAyMyA2IDI1IDUgNCAzMCAyIDE5IDIzIDE1IDI3IDE0IDI2IDEgMSA3IDE5IDEyIDcgNiAyMCAxOCAxNCA0IDE1IAorMTcgMjggNyAxMSA3IDggOSAyMiAxNyAxMiA1IDIzIDE4IDI1IDE4IDYgMTIgMjYgMzAgMTIgMzAgMTQgMyAxIDE4IDEwIDIwIDI3IDIxIAorOCA2IDI0IDMwIF4KKzU0IDAgMjAgMTEgMjQgNyAyIDQgMTggMTUgMTQgMzAgMTYgMTkgMiAyNyAxNSA0IDE5IDI1IDI5IDI5IDcgMTQgMTggOSAxMSA5IDI3IAorMTEgMTUgMjkgOSAyOCAyMCAyIDMwIDI2IDIxIDE3IDggMjggMTcgMjIgMjkgMjQgOCAxMSAxOCAyOSAxNSA2IDcgMjcgMjcgNyBeCis2MyAxIDI0IDE4IDIzIDExIDE5IDggMzAgNSAyNCAyMiAxMiAyNSAxNSAyOCAyMyA1IDEwIDIxIDUgOCA3IDMgMTAgMTkgMTcgNiA5IDE1IAorMjkgMTAgNyA0IDEgMTYgMjEgMTYgMjkgMTMgMTggNSAzIDggMTUgOCAyMSAyOSAyMCA1IDI3IDIgMTMgMjcgNyA3IDMwIDIgMTggMjYgCisxMCAyIDUgMjkgMTIgXgorNjMgMSAxNSAyNSAyNiAyNCA4IDEyIDIwIDMgOSAxMCAzMCA3IDEyIDI0IDUgMTMgMSA2IDEwIDI1IDEzIDkgMjkgMzAgMTcgMjkgMTcgCisyNiA2IDI1IDQgNyAyNSA4IDE1IDI2IDMwIDExIDIgOSA2IDIyIDYgMjEgMjggMyAzIDYgMTIgMTMgMTUgNyAxNyAxNiAyNiAzIDE5IDMgCis1IDIgMjkgMTYgMTcgXgorNjAgMSAyMiAyNiAxMyAxMiA5IDE5IDE2IDI3IDI1IDE2IDcgMTUgMjIgMjIgNSA2IDEzIDQgMTIgMTEgMjcgNSAxOSAyOCA5IDMwIDkgMSAKKzI4IDMgMjEgMjIgNyAxNyAyIDI1IDEgMjggMjEgMTEgMTcgMjAgMjggMTIgMTAgMTAgMyAxNSAxMyAyMCAxIDIwIDExIDEgMzAgMjIgMjMgCisxNSAyNiA2IF4KKzU2IDAgMjEgNyAyNyA5IDI3IDI5IDUgMjYgMTYgMTEgMjMgMjggMTggMSAxMyAyMyAzMCA2IDMgMTEgMTEgMTYgMTAgMTMgMTMgMTkgMTUgCisxOCA3IDIyIDEwIDI5IDMgMjUgMzAgOCAyMiAxMyA0IDQgMjcgMjIgMTggMjEgMjMgMTcgMTUgMTYgMTkgMjAgMTcgMTAgMTcgMjEgMjAgCisxMSBeCis2NCAxIDE0IDE0IDEgMTAgMTggNCA1IDUgOSAxNyAxOCAxNCA1IDEyIDIyIDIyIDExIDggMTggMjQgMjEgMyA3IDIxIDkgNCAzIDQgMjMgCisxNCAxNyAyNSAyNyAxMCA1IDE2IDMwIDIzIDIgNCAyNSAzIDE2IDI4IDQgNiA2IDE3IDEyIDE4IDIgMjMgNyAyOSAyMyAyOSAyNyAxOSA3IAorMjAgMjEgMjUgNSAzMCBeCis2MyAxIDkgNyAxIDIxIDIwIDE5IDI5IDE5IDE0IDggMjMgMjMgMTkgMyAxOCAxNyAzIDI5IDE0IDI3IDIzIDI4IDUgMjIgOCAxMCAxIDEgCisxMSAyNyAxOCAzIDIgMjIgMjggMTQgMjQgMTIgMSAzIDMwIDI5IDExIDIyIDE5IDcgMTYgMSAxMSA0IDI4IDggMjAgMjUgMiA2IDggNSAKKzE0IDExIDIxIDkgMjkgXgorNTcgMCA4IDI1IDYgMjYgMjcgMSAyOSAxMiA4IDE2IDQgMTcgNSAzMCAzMCAyNCAxMiAxOSAyNCAyNSAxMSAxMyAxMiAyNyAxNiAxNCAzIAorMjQgMjAgMjQgMjMgMjIgOSAxNCAxOSAyNiA4IDEzIDYgMTMgMjUgMTkgNSAxIDE5IDEgMTcgMjggMzAgMTMgMjEgMTEgNCAxMCAyMyAyNSAKKzYgXgorNjggMCA1IDExIDIwIDcgMjQgMjkgMjcgMTMgMTYgMTcgMSAxNSAxMiAyOSA0IDE2IDI3IDEyIDYgMiAyIDI0IDE3IDEzIDIyIDIwIDIyIAorNCAyMCAxNiAyIDE3IDMgMTEgMjkgMSA1IDEwIDE0IDIzIDMgMTQgOSAyIDcgMTggMjAgMTMgMiAxNiAyNSAyNCA0IDQgMTQgNyAxMyA4IAorMjAgMTIgMjMgMSAyNiA3IDkgMTkgNiAzMCBeCis1NCAxIDMgOCAyNiAyMSAxMCAyNiAyMyAyNCAyOCAxNiAxMiAxNCAyNSAyMiAxNiAyIDIxIDI0IDI3IDMwIDE1IDEwIDE1IDIgMTggMTMgCisyNiAyOCAyMyAxNiAyMyAxMCAyIDExIDI2IDI2IDQgMjkgMTggNCAyNCAyNCAxIDI0IDEzIDUgMjEgMjkgMjYgMiAxMCAxNiA2IDI3IF4KKzU2IDAgNyAyMyAxOSAxMSAyOCAyMiAyMSAxIDI0IDE5IDcgMjYgMTggMzAgMjUgMjEgNiAxOCAyMiAyIDEgMTQgMiAxNCA1IDI1IDEgMjcgCisyNCA2IDIzIDE2IDUgMSAyMCAyOSAyMiAyNSA5IDI1IDEwIDMgMjggMjggMjUgMTkgMTggMTYgMjQgMTQgMTUgNSAyOCAxMiAyOCA5IF4KKzU4IDAgMjkgMiAxNSAxNSA5IDUgMTggMTkgMjIgMTIgMTUgNCA2IDE1IDI0IDE2IDkgNCAyNiAyNSAxOCAyNyAxOSAyMCA0IDI2IDEyIDMgCisyMiAxIDIyIDMwIDMgMjggMTAgOSAyNCAxNCAyOSA2IDMwIDMgMTAgMjAgMTQgNiAzIDE5IDIxIDIxIDI4IDE2IDE4IDExIDMwIDExIDIwIAorMjkgXgorNjUgMCAxIDkgOCAxMSA1IDE5IDEwIDI0IDQgMjIgNCAyIDI2IDUgMTUgMjAgOCAzIDEzIDMwIDE4IDggMSAyNSAyOCAyMCAyMCAxNSAyMSAKKzE4IDE4IDEyIDE2IDEzIDI0IDkgMjEgMiAyOCA2IDEgMjMgOSAxOCAyNyAyNyA0IDkgMTMgMTAgOCAxNCAxNiAxNSAxMiAxMSAxNCAyMSAKKzE0IDEwIDExIDI1IDE3IDE3IDIwIF4KKzU1IDAgMjEgMTMgMjcgMjYgMjYgMjIgMTQgMTMgMTcgMjEgMTkgOSA5IDIwIDIzIDEzIDcgMTAgMjggMjQgMTAgMjIgMjcgMjMgMjcgOCAKKzE3IDE0IDYgNCAyMSAyNiAxNSAxIDggMjkgMjcgNiAyOCAxNSAzIDI3IDI1IDI1IDE0IDE5IDEzIDI5IDggMjQgMiA4IDIgNCAzMCBeCis1NyAxIDE5IDExIDEwIDYgMjYgMTQgMjIgMjQgMzAgMTAgMTEgMTIgMiAxMiAxNyAyMyA4IDggMTIgMjggMTMgMTQgMjggMiAxNyA0IDggCiszIDI2IDkgMjMgMjEgMzAgMzAgMjAgNCAxMyAyOCAyOSA5IDMgMTcgNyAxOSAzMCAyOCAxIDIgMjAgOSAxMiAyNCAxNSAzMCAyMCAyNyAKKzMwIF4KKzU5IDAgMjMgMTEgNiAyOSAyNSAyMyAyNiAxNyAyMCAxMCAyMiAxNSAyMyA2IDI1IDUgNCAzMCAyIDE5IDIzIDE1IDI3IDE0IDI2IDEgMSAKKzcgMTkgMTIgNyA2IDIwIDE4IDE0IDQgMTUgMTcgMjggNyAxMSA3IDggOSAyMiAxNyAxMiA1IDIzIDE4IDI1IDE4IDYgMTIgMjYgMzAgMTIgCiszMCAxOCBeCis1NiAwIDMgMSAxOCAxMCAyMCAyNyAyMSA4IDYgMjQgMjYgMjAgMTEgMjQgNyAyIDQgMTggMTUgMTQgMzAgMTYgMTkgMiAyNyAxNSA0IDE5IAorMjUgMjkgMjkgNyAxNCAxOCA5IDExIDkgMjcgMTEgMTUgMjkgOSAyOCAyMCAyIDMwIDI2IDIxIDE3IDggMjggMTcgMjIgMjkgMjQgNyBeCis2MiAwIDExIDE4IDI5IDE1IDYgNyAyNyAyNyAxNyAyNCAxOCAyMyAxMSAxOSA4IDMwIDUgMjQgMjIgMTIgMjUgMTUgMjggMjMgNSAxMCAKKzIxIDUgOCA3IDMgMTAgMTkgMTcgNiA5IDE1IDI5IDEwIDcgNCAxIDE2IDIxIDE2IDI5IDEzIDE4IDUgMyA4IDE1IDggMjEgMjkgMjAgNSAKKzI3IDIgMTMgMjcgNyBeCis2MiAxIDcgMzAgMiAxOCAyNiAxMCAyIDUgMjkgMjEgMTUgMjUgMjYgMjQgOCAxMiAyMCAzIDkgMTAgMzAgNyAxMiAyNCA1IDEzIDEgNiAKKzEwIDI1IDEzIDkgMjkgMzAgMTcgMjkgMTcgMjYgNiAyNSA0IDcgMjUgOCAxNSAyNiAzMCAxMSAyIDkgNiAyMiA2IDIxIDI4IDMgMyA2IAorMTIgMTMgMTUgMjYgXgorNjIgMCAxNyAxNiAyNiAzIDE5IDMgNSAyIDI5IDE2IDE2IDIyIDI2IDEzIDEyIDkgMTkgMTYgMjcgMjUgMTYgNyAxNSAyMiAyMiA1IDYgCisxMyA0IDEyIDExIDI3IDUgMTkgMjggOSAzMCA5IDEgMjggMyAyMSAyMiA3IDE3IDIgMjUgMSAyOCAyMSAxMSAxNyAyMCAyOCAxMiAxMCAKKzEwIDMgMTUgMTMgMjAgMTkgXgorNTYgMSAyMCAxMSAxIDMwIDIyIDIzIDE1IDI2IDEyIDIxIDcgMjcgOSAyNyAyOSA1IDI2IDE2IDExIDIzIDI4IDE4IDEgMTMgMjMgMzAgNiAKKzMgMTEgMTEgMTYgMTAgMTMgMTMgMTkgMTUgMTggNyAyMiAxMCAyOSAzIDI1IDMwIDggMjIgMTMgNCA0IDI3IDIyIDE4IDIxIDIzIDE3IAorMjIgXgorNjYgMSAxNiAxOSAyMCAxNyAxMCAxNyAyMSAyMCA2IDE0IDE0IDEgMTAgMTggNCA1IDUgOSAxNyAxOCAxNCA1IDEyIDIyIDIyIDExIDggCisxOCAyNCAyMSAzIDcgMjEgOSA0IDMgNCAyMyAxNCAxNyAyNSAyNyAxMCA1IDE2IDMwIDIzIDIgNCAyNSAzIDE2IDI4IDQgNiA2IDE3IDEyIAorMTggMiAyMyA3IDI5IDIzIDI5IDI0IF4KKzYyIDAgMTkgNyAyMCAyMSAyNSA1IDE3IDkgNyAxIDIxIDIwIDE5IDI5IDE5IDE0IDggMjMgMjMgMTkgMyAxOCAxNyAzIDI5IDE0IDI3IAorMjMgMjggNSAyMiA4IDEwIDEgMSAxMSAyNyAxOCAzIDIgMjIgMjggMTQgMjQgMTIgMSAzIDMwIDI5IDExIDIyIDE5IDcgMTYgMSAxMSA0IAorMjggOCAyMCAyNSA3IF4KKzU5IDAgNiA4IDUgMTQgMTEgMjEgOSAxNiA4IDI1IDYgMjYgMjcgMSAyOSAxMiA4IDE2IDQgMTcgNSAzMCAzMCAyNCAxMiAxOSAyNCAyNSAKKzExIDEzIDEyIDI3IDE2IDE0IDMgMjQgMjAgMjQgMjMgMjIgOSAxNCAxOSAyNiA4IDEzIDYgMTMgMjUgMTkgNSAxIDE5IDEgMTcgMjggMzAgCisxMyAyNiBeCis3MCAwIDExIDQgMTAgMjMgMjUgNyA1IDExIDIwIDcgMjQgMjkgMjcgMTMgMTYgMTcgMSAxNSAxMiAyOSA0IDE2IDI3IDEyIDYgMiAyIDI0IAorMTcgMTMgMjIgMjAgMjIgNCAyMCAxNiAyIDE3IDMgMTEgMjkgMSA1IDEwIDE0IDIzIDMgMTQgOSAyIDcgMTggMjAgMTMgMiAxNiAyNSAyNCAKKzQgNCAxNCA3IDEzIDggMjAgMTIgMjMgMSAyNiA3IF4KKzU0IDEgOSAxOSA2IDE2IDMgOCAyNiAyMSAxMCAyNiAyMyAyNCAyOCAxNiAxMiAxNCAyNSAyMiAxNiAyIDIxIDI0IDI3IDMwIDE1IDEwIAorMTUgMiAxOCAxMyAyNiAyOCAyMyAxNiAyMyAxMCAyIDExIDI2IDI2IDQgMjkgMTggNCAyNCAyNCAxIDI0IDEzIDUgMjEgMjkgMjYgMjcgXgorNTggMSAxMCAxNiA2IDUgNyAyMyAxOSAxMSAyOCAyMiAyMSAxIDI0IDE5IDcgMjYgMTggMzAgMjUgMjEgNiAxOCAyMiAyIDEgMTQgMiAxNCAKKzUgMjUgMSAyNyAyNCA2IDIzIDE2IDUgMSAyMCAyOSAyMiAyNSA5IDI1IDEwIDMgMjggMjggMjUgMTkgMTggMTYgMjQgMTQgMTUgNSAyOCAKKzI4IF4KKzU4IDEgMjggMjYgMjkgMiAxNSAxNSA5IDUgMTggMTkgMjIgMTIgMTUgNCA2IDE1IDI0IDE2IDkgNCAyNiAyNSAxOCAyNyAxOSAyMCA0IAorMjYgMTIgMyAyMiAxIDIyIDMwIDMgMjggMTAgOSAyNCAxNCAyOSA2IDMwIDMgMTAgMjAgMTQgNiAzIDE5IDIxIDIxIDI4IDE2IDE4IDExIAorMzAgMjIgXgorNjUgMSAyMCAzMCAxIDkgOCAxMSA1IDE5IDEwIDI0IDQgMjIgNCAyIDI2IDUgMTUgMjAgOCAzIDEzIDMwIDE4IDggMSAyNSAyOCAyMCAyMCAKKzE1IDIxIDE4IDE4IDEyIDE2IDEzIDI0IDkgMjEgMiAyOCA2IDEgMjMgOSAxOCAyNyAyNyA0IDkgMTMgMTAgOCAxNCAxNiAxNSAxMiAxMSAKKzE0IDIxIDE0IDEwIDExIDI1IDIwIF4KKzUzIDAgMTcgMzAgMjEgMTMgMjcgMjYgMjYgMjIgMTQgMTMgMTcgMjEgMTkgOSA5IDIwIDIzIDEzIDcgMTAgMjggMjQgMTAgMjIgMjcgMjMgCisyNyA4IDE3IDE0IDYgNCAyMSAyNiAxNSAxIDggMjkgMjcgNiAyOCAxNSAzIDI3IDI1IDI1IDE0IDE5IDEzIDI5IDggMjQgMTUgXgorNjEgMCA4IDIgNCAxMiAxOSAxMSAxMCA2IDI2IDE0IDIyIDI0IDMwIDEwIDExIDEyIDIgMTIgMTcgMjMgOCA4IDEyIDI4IDEzIDE0IDI4IAorMiAxNyA0IDggMyAyNiA5IDIzIDIxIDMwIDMwIDIwIDQgMTMgMjggMjkgOSAzIDE3IDcgMTkgMzAgMjggMSAyIDIwIDkgMTIgMjQgMTUgCiszMCAyMCAyNyAyMCBeCis2MCAwIDIzIDExIDYgMjkgMjUgMjMgMjYgMTcgMjAgMTAgMjIgMTUgMjMgNiAyNSA1IDQgMzAgMiAxOSAyMyAxNSAyNyAxNCAyNiAxIDEgCis3IDE5IDEyIDcgNiAyMCAxOCAxNCA0IDE1IDE3IDI4IDcgMTEgNyA4IDkgMjIgMTcgMTIgNSAyMyAxOCAyNSAxOCA2IDEyIDI2IDMwIDEyIAorMzAgMTQgMjAgXgorNTYgMCAzIDEgMTggMTAgMjAgMjcgMjEgOCA2IDI0IDI2IDIwIDExIDI0IDcgMiA0IDE4IDE1IDE0IDMwIDE2IDE5IDIgMjcgMTUgNCAxOSAKKzI1IDI5IDI5IDcgMTQgMTggOSAxMSA5IDI3IDExIDE1IDI5IDkgMjggMjAgMiAzMCAyNiAyMSAxNyA4IDI4IDE3IDIyIDI5IDI0IDIzIF4KKzYyIDAgMTEgMTggMjkgMTUgNiA3IDI3IDI3IDE3IDI0IDE4IDIzIDExIDE5IDggMzAgNSAyNCAyMiAxMiAyNSAxNSAyOCAyMyA1IDEwIAorMjEgNSA4IDcgMyAxMCAxOSAxNyA2IDkgMTUgMjkgMTAgNyA0IDEgMTYgMjEgMTYgMjkgMTMgMTggNSAzIDggMTUgOCAyMSAyOSAyMCA1IAorMjcgMiAxMyAyNyAyMyBeCis2NCAxIDcgMzAgMiAxOCAyNiAxMCAyIDUgMjkgMjEgMTUgMjUgMjYgMjQgOCAxMiAyMCAzIDkgMTAgMzAgNyAxMiAyNCA1IDEzIDEgNiAKKzEwIDI1IDEzIDkgMjkgMzAgMTcgMjkgMTcgMjYgNiAyNSA0IDcgMjUgOCAxNSAyNiAzMCAxMSAyIDkgNiAyMiA2IDIxIDI4IDMgMyA2IAorMTIgMTMgMTUgNyAxNyAxOCBeCis2NSAwIDI2IDMgMTkgMyA1IDIgMjkgMTYgMTYgMjIgMjYgMTMgMTIgOSAxOSAxNiAyNyAyNSAxNiA3IDE1IDIyIDIyIDUgNiAxMyA0IDEyIAorMTEgMjcgNSAxOSAyOCA5IDMwIDkgMSAyOCAzIDIxIDIyIDcgMTcgMiAyNSAxIDI4IDIxIDExIDE3IDIwIDI4IDEyIDEwIDEwIDMgMTUgCisxMyAyMCAxIDIwIDExIDEgMzAgNSBeCis1NyAwIDIzIDE1IDI2IDEyIDIxIDcgMjcgOSAyNyAyOSA1IDI2IDE2IDExIDIzIDI4IDE4IDEgMTMgMjMgMzAgNiAzIDExIDExIDE2IDEwIAorMTMgMTMgMTkgMTUgMTggNyAyMiAxMCAyOSAzIDI1IDMwIDggMjIgMTMgNCA0IDI3IDIyIDE4IDIxIDIzIDE3IDE1IDE2IDE5IDIwIDE3IAorMTAgMjUgXgorNjYgMSAyMSAyMCA2IDE0IDE0IDEgMTAgMTggNCA1IDUgOSAxNyAxOCAxNCA1IDEyIDIyIDIyIDExIDggMTggMjQgMjEgMyA3IDIxIDkgNCAKKzMgNCAyMyAxNCAxNyAyNSAyNyAxMCA1IDE2IDMwIDIzIDIgNCAyNSAzIDE2IDI4IDQgNiA2IDE3IDEyIDE4IDIgMjMgNyAyOSAyMyAyOSAKKzI3IDE5IDcgMjAgMjEgMjUgMjAgXgorNjUgMSAxNyA5IDcgMSAyMSAyMCAxOSAyOSAxOSAxNCA4IDIzIDIzIDE5IDMgMTggMTcgMyAyOSAxNCAyNyAyMyAyOCA1IDIyIDggMTAgMSAKKzEgMTEgMjcgMTggMyAyIDIyIDI4IDE0IDI0IDEyIDEgMyAzMCAyOSAxMSAyMiAxOSA3IDE2IDEgMTEgNCAyOCA4IDIwIDI1IDIgNiA4IDUgCisxNCAxMSAyMSA5IDE2IDI4IF4KKzU5IDEgMjUgNiAyNiAyNyAxIDI5IDEyIDggMTYgNCAxNyA1IDMwIDMwIDI0IDEyIDE5IDI0IDI1IDExIDEzIDEyIDI3IDE2IDE0IDMgMjQgCisyMCAyNCAyMyAyMiA5IDE0IDE5IDI2IDggMTMgNiAxMyAyNSAxOSA1IDEgMTkgMSAxNyAyOCAzMCAxMyAyMSAxMSA0IDEwIDIzIDI1IDcgCis1IDExIDIzIF4KKzcwIDAgMjAgNyAyNCAyOSAyNyAxMyAxNiAxNyAxIDE1IDEyIDI5IDQgMTYgMjcgMTIgNiAyIDIgMjQgMTcgMTMgMjIgMjAgMjIgNCAyMCAKKzE2IDIgMTcgMyAxMSAyOSAxIDUgMTAgMTQgMjMgMyAxNCA5IDIgNyAxOCAyMCAxMyAyIDE2IDI1IDI0IDQgNCAxNCA3IDEzIDggMjAgMTIgCisyMyAxIDI2IDcgOSAxOSA2IDE2IDMgOCAyNiAyNSBeCis1NiAwIDEwIDI2IDIzIDI0IDI4IDE2IDEyIDE0IDI1IDIyIDE2IDIgMjEgMjQgMjcgMzAgMTUgMTAgMTUgMiAxOCAxMyAyNiAyOCAyMyAKKzE2IDIzIDEwIDIgMTEgMjYgMjYgNCAyOSAxOCA0IDI0IDI0IDEgMjQgMTMgNSAyMSAyOSAyNiAyIDEwIDE2IDYgNSA3IDIzIDE5IDExIAorMjggMjQgXgorNTkgMSAyMSAxIDI0IDE5IDcgMjYgMTggMzAgMjUgMjEgNiAxOCAyMiAyIDEgMTQgMiAxNCA1IDI1IDEgMjcgMjQgNiAyMyAxNiA1IDEgCisyMCAyOSAyMiAyNSA5IDI1IDEwIDMgMjggMjggMjUgMTkgMTggMTYgMjQgMTQgMTUgNSAyOCAxMiAyOCAyNiAyOSAyIDE1IDE1IDkgNSAKKzE4IDE5IDEzIF4KKzYzIDEgMTIgMTUgNCA2IDE1IDI0IDE2IDkgNCAyNiAyNSAxOCAyNyAxOSAyMCA0IDI2IDEyIDMgMjIgMSAyMiAzMCAzIDI4IDEwIDkgMjQgCisxNCAyOSA2IDMwIDMgMTAgMjAgMTQgNiAzIDE5IDIxIDIxIDI4IDE2IDE4IDExIDMwIDExIDIwIDMwIDEgOSA4IDExIDUgMTkgMTAgMjQgCis0IDIyIDQgMiAyNiAyMCBeCis1OSAxIDE1IDIwIDggMyAxMyAzMCAxOCA4IDEgMjUgMjggMjAgMjAgMTUgMjEgMTggMTggMTIgMTYgMTMgMjQgOSAyMSAyIDI4IDYgMSAKKzIzIDkgMTggMjcgMjcgNCA5IDEzIDEwIDggMTQgMTYgMTUgMTIgMTEgMTQgMjEgMTQgMTAgMTEgMjUgMTcgMTcgMzAgMjEgMTMgMjcgMjYgCisyNiAyMiAxNCAyMyBeCis2MSAwIDE2IDIxIDMwIDI1IDggOSAxOCAzMCAxNyA0IDYgMzEgMjYgMTYgMjUgMTggMjMgOSAyMCA4IDcgMjUgMjYgMTEgMjcgMTcgMjggCisyIDIzIDIgMTIgMjQgMiA4IDYgMyAxMiAyMCAxNiA0IDEwIDE3IDMwIDEyIDExIDUgMzEgMTkgMTkgMTkgMzAgMTMgMTggMiAzIDggMiAKKzE3IDggMjQgMjggXgorNjkgMCAyMiAyIDcgMjYgMSAxMyAyNiA2IDYgNiAxOCAyNCA3IDYgNyAzMCAxOSAxMiAyMiAyNCAyNSAzIDExIDE3IDMgMTAgMTIgMTEgCisxMSAyNSA3IDEzIDMxIDQgNyAyNyAxMyAxMCAzMCAxNiAzMCAxNiAyOSA0IDI3IDUgNiAyNyA4IDEyIDI5IDkgMSAxMCA5IDI2IDQgMTkgCisxIDMgMyA0IDE2IDEzIDE3IDYgMTYgMTQgMjggXgorNjIgMCAzIDIwIDMgMiAxIDMwIDE0IDE0IDIxIDI5IDEzIDExIDEwIDI5IDIwIDE5IDI2IDI3IDE5IDYgMTcgMjYgMjYgNyA5IDEzIDE2IAorOSAzMSAyIDIwIDI4IDEwIDEwIDQgMjggMyAyNCAyMSA2IDI5IDE2IDEgMjIgMzEgMSAyNCA5IDE2IDIyIDI4IDExIDcgNyAzIDE3IDEzIAorMjIgNCAxNyA5IDI3IF4KKzYwIDAgMjEgMjMgMTcgMjQgMTYgMjQgMTEgMjYgNSAzMSAzMCAyIDI0IDE0IDkgMjMgMjggMTggNCAxMyAyMyA0IDMgOSA5IDE0IDEyIAorMTMgOCAyMCAxMiAxOCA2IDIxIDEyIDI1IDMgMjcgOCAyMSAxMyA1IDI2IDIxIDE4IDE5IDIzIDE2IDEyIDE0IDIwIDE3IDE2IDcgMTYgCisxOSAyMiA5IDE1IDI1IF4KKzY0IDAgMzEgNyAxOCAyOSA1IDcgMiA1IDE2IDE4IDEwIDcgMTEgMjEgMjEgOSA4IDE4IDI1IDE5IDMgNiAxOSAyOSAxMCAzIDUgMjMgMTUgCisxNiAyNyAyNiAxMiAyIDE5IDIzIDEgMjIgMyAxOSAyOCA1IDIgOSA0IDIxIDExIDE4IDEgMjMgNiAzMCAyMyAzMCAyNiAyMCAxMSAyMiAKKzE5IDI3IDIgMTYgMTAgMzEgXgorNjAgMCA0IDI0IDE3IDIwIDI1IDIwIDE1IDggMjMgMjMgMjAgMzAgMTggMTYgMyAzMCAxNSAyNiAyMyAyOCA3IDIxIDggNyAzMSAzMSAxNCAKKzI2IDE4IDMgMSAyNiAyOCAxNSAyNSAxMSAzMSAzIDI1IDkgMjEgMjAgMiA2IDE0IDQgOSA1IDI4IDggMTcgMjIgMSA0IDggNyAxMCAxNCAKKzE5IDE5IF4KKzYyIDAgMTQgOCAyNyA5IDI0IDI2IDQgMzAgMTEgOCAxOSA1IDIxIDcgMiAyNyAyMCAxNiAyMCAyMCAyMiAxNCAxMyAxNiAyNiAxNCAxMCAKKzMgMjUgMjIgMjUgMjMgMjEgMTAgMTUgMTUgMjkgOCAxMyA0IDIgMTMgMjIgMjAgNyA0IDIwIDMxIDE2IDIgMiAyOCAxMyAxOSAxNCAxMiAKKzIzIDI3IDYgMiAxNCAyNCBeCis2MiAwIDIyIDYgMjUgMzAgMjkgMzEgMTMgMTQgMTYgMzEgMTIgMTYgMzAgNSAxNCAzMSAxMSA0IDEgMSAyNSAyMSAxMyAyNiAyMiAyMSA1IAorMjIgMTQgMjkgMSAyMSAzIDE0IDMwIDQgMiAyOSAxMiAxNSAyMyAzIDE1IDUgMSA2IDIzIDIyIDEzIDEgMTQgMjcgMjUgNSAxNSA2IDEzIAorMyAyMiAxMSAyMyAyMSBeCis1NiAxIDI0IDYgNSAyMCA0IDE0IDMgMjkgOCAyOSAxOSA3IDI5IDIzIDI1IDI4IDE5IDExIDE1IDI3IDIxIDE0IDEgMTkgMjAgMjYgMTIgCis3IDEyIDEgMTggMTMgMjkgMjggMjMgMjkgMTQgMjMgNyAxIDkgMjkgMjQgNSAzMCAxOCA1IDI1IDI1IDMxIDI1IDEzIDcgMjQgMjUgMTEgXgorNTQgMCAxIDEyIDE5IDkgNyA2IDI4IDIwIDE0IDI4IDIxIDE5IDMxIDIwIDIwIDYgMjQgMTggMjcgMjQgNCAxOCAyMSAxIDMxIDE1IDEgCisxNSAyIDI3IDQgMjYgMjUgNCAyMyAxOSAyIDMxIDIyIDMwIDIxIDIyIDUgMjcgMTIgMzAgMjggMjggMjcgMTUgMTggMTQgMjUgMjMgXgorNTkgMSAxNyA3IDI4IDExIDI4IDI5IDMwIDEgMTcgMTIgMTAgMiAxOCAyMCAyMSAyIDExIDEyIDUgNCAxMiAyNSAxNCA1IDUgMjQgMjIgCisxOCAzMSAxNSAyMiAyOSAxMSAzIDIxIDMxIDIxIDI3IDMgMjggNyAxMCAyNSAyIDE1IDMwIDkgMzAgNyAyMiAxNSA5IDMgMjAgMjQgMjQgCisyOCAxNCAyNSBeCis1OCAwIDkgMjcgMTQgMjIgMjcgMzEgMTAgOCAxNCA3IDE1IDcgMjAgNSAyNiAxIDI5IDcgMTcgMTcgOCAzIDEzIDI3IDE4IDggMzEgMjcgCisyOCAyMiAyMiAxNyAxOSAxOCAxOCAxMSAxOSAxMyAyNSAxMCAxOSA2IDI4IDQgMzEgMjMgMTAgMTggMjYgMzEgNSAxMCAxMyAxMiA4IDE1IAorMTkgMjQgXgorNTYgMSAxMSAxNCAxNSAyNCAxNSAxMiA5IDIyIDE2IDE2IDI0IDEzIDIgMjYgMjQgMjkgMjYgMTUgMTMgMjEgMjQgMjAgMTAgMTAgMjIgCisyMyAxMyA2IDEyIDI4IDI1IDEyIDIgMjEgMjYgMjggMjYgOCAxNiAxNSA0IDUgMTkgMjQgMTIgMzEgOCAzMCAzMSA5IDI4IDEyIDMgMjYgCisyOSA4IF4KKzY1IDAgMjcgMTAgMjAgMTMgMzAgOCAyNSAxIDggMSA1IDExIDIwIDkgMTIgNCAyOSAxNSAyMSAyNSAyNyA3IDE0IDExIDEgMTEgMTYgMjMgCis4IDggMTEgMSAxMyAxNSAyOCAxIDE2IDUgOCAzIDI0IDEwIDIzIDI0IDE3IDUgMTMgMjggMzAgNSAzIDE2IDYgMjAgMjggMzEgNiAyMiAKKzEwIDExIDI5IDI1IDE3IDI3IDIzIF4KKzYwIDAgMjYgMyAyMyAxNCA0IDMwIDI3IDIzIDI0IDIxIDE3IDEyIDIxIDE3IDIzIDQgMjIgNyA1IDI3IDEgMjAgMjMgMTIgMjYgMTAgMjQgCiszMSAyOSA0IDExIDE1IDExIDYgOSAxNyAxOCAxNSA1IDE3IDIxIDI4IDYgOSA2IDggMTAgMjEgMTYgMTEgMiAyMyAxOCAyNyAyOSAxOCA5IAorMTEgMjQgMjQgXgorNTggMSAxMSAxNSAyOSAyOSAzIDMxIDE4IDEyIDE3IDMxIDE5IDggNCAyNSAyOSAxNyAyOSA5IDI1IDYgMSAyIDE4IDE3IDE1IDE5IDE1IAorMSAyNiAxNyAyMCAyNyAzMCAzMCA2IDEwIDE4IDUgOSAxMCAyNiA5IDE3IDIgMzAgMTAgMjggMTcgMSAyNyAyOSAyIDE5IDE2IDggMjggCisxNiAyOCBeCis2MSAxIDMwIDI1IDggOSAxOCAzMCAxNyA0IDYgMzEgMjYgMTYgMjUgMTggMjMgOSAyMCA4IDcgMjUgMjYgMTEgMjcgMTcgMjggMiAyMyAyIAorMTIgMjQgMiA4IDYgMyAxMiAyMCAxNiA0IDEwIDE3IDMwIDEyIDExIDUgMzEgMTkgMTkgMTkgMzAgMTMgMTggMiAzIDggMiAxNyA4IDI0IAorMzAgMjIgMjkgXgorNzAgMCA3IDI2IDEgMTMgMjYgNiA2IDYgMTggMjQgNyA2IDcgMzAgMTkgMTIgMjIgMjQgMjUgMyAxMSAxNyAzIDEwIDEyIDExIDExIDI1IAorNyAxMyAzMSA0IDcgMjcgMTMgMTAgMzAgMTYgMzAgMTYgMjkgNCAyNyA1IDYgMjcgOCAxMiAyOSA5IDEgMTAgOSAyNiA0IDE5IDEgMyAzIAorNCAxNiAxMyAxNyA2IDE2IDE0IDI0IDMgMjAgMjEgXgorNjIgMSAyIDEgMzAgMTQgMTQgMjEgMjkgMTMgMTEgMTAgMjkgMjAgMTkgMjYgMjcgMTkgNiAxNyAyNiAyNiA3IDkgMTMgMTYgOSAzMSAyIAorMjAgMjggMTAgMTAgNCAyOCAzIDI0IDIxIDYgMjkgMTYgMSAyMiAzMSAxIDI0IDkgMTYgMjIgMjggMTEgNyA3IDMgMTcgMTMgMjIgNCAxNyAKKzkgNCAyMSAyMyAyMSBeCis2MiAxIDI0IDE2IDI0IDExIDI2IDUgMzEgMzAgMiAyNCAxNCA5IDIzIDI4IDE4IDQgMTMgMjMgNCAzIDkgOSAxNCAxMiAxMyA4IDIwIDEyIAorMTggNiAyMSAxMiAyNSAzIDI3IDggMjEgMTMgNSAyNiAyMSAxOCAxOSAyMyAxNiAxMiAxNCAyMCAxNyAxNiA3IDE2IDE5IDIyIDkgMTUgCisxMCAzMSA3IDE4IDI5IDcgXgorNjYgMSA3IDIgNSAxNiAxOCAxMCA3IDExIDIxIDIxIDkgOCAxOCAyNSAxOSAzIDYgMTkgMjkgMTAgMyA1IDIzIDE1IDE2IDI3IDI2IDEyIAorMiAxOSAyMyAxIDIyIDMgMTkgMjggNSAyIDkgNCAyMSAxMSAxOCAxIDIzIDYgMzAgMjMgMzAgMjYgMjAgMTEgMjIgMTkgMjcgMiAxNiAxMCAKKzYgNCAyNCAxNyAyMCAyNSAyMCAyMSBeCis2MiAxIDggMjMgMjMgMjAgMzAgMTggMTYgMyAzMCAxNSAyNiAyMyAyOCA3IDIxIDggNyAzMSAzMSAxNCAyNiAxOCAzIDEgMjYgMjggMTUgCisyNSAxMSAzMSAzIDI1IDkgMjEgMjAgMiA2IDE0IDQgOSA1IDI4IDggMTcgMjIgMSA0IDggNyAxMCAxNCAxOSAxMCAxNCA4IDI3IDkgMjQgCisyNiA0IDMwIDggXgorNjIgMSA4IDE5IDUgMjEgNyAyIDI3IDIwIDE2IDIwIDIwIDIyIDE0IDEzIDE2IDI2IDE0IDEwIDMgMjUgMjIgMjUgMjMgMjEgMTAgMTUgCisxNSAyOSA4IDEzIDQgMiAxMyAyMiAyMCA3IDQgMjAgMzEgMTYgMiAyIDI4IDEzIDE5IDE0IDEyIDIzIDI3IDYgMiAxNCAyIDIyIDYgMjUgCiszMCAyOSAzMSAxMyAxNCAyMSBeCis2NSAwIDMxIDEyIDE2IDMwIDUgMTQgMzEgMTEgNCAxIDEgMjUgMjEgMTMgMjYgMjIgMjEgNSAyMiAxNCAyOSAxIDIxIDMgMTQgMzAgNCAyIAorMjkgMTIgMTUgMjMgMyAxNSA1IDEgNiAyMyAyMiAxMyAxIDE0IDI3IDI1IDUgMTUgNiAxMyAzIDIyIDExIDIzIDMxIDI0IDYgNSAyMCA0IAorMTQgMyAyOSA4IDI5IDE5IDMxIF4KKzU1IDEgMjkgMjMgMjUgMjggMTkgMTEgMTUgMjcgMjEgMTQgMSAxOSAyMCAyNiAxMiA3IDEyIDEgMTggMTMgMjkgMjggMjMgMjkgMTQgMjMgCis3IDEgOSAyOSAyNCA1IDMwIDE4IDUgMjUgMjUgMzEgMjUgMTMgNyAyNCAyNSAyNCAxIDEyIDE5IDkgNyA2IDI4IDIwIDE0IDI4IDI3IF4KKzUzIDEgMTkgMzEgMjAgMjAgNiAyNCAxOCAyNyAyNCA0IDE4IDIxIDEgMzEgMTUgMSAxNSAyIDI3IDQgMjYgMjUgNCAyMyAxOSAyIDMxIAorMjIgMzAgMjEgMjIgNSAyNyAxMiAzMCAyOCAyOCAyNyAxNSAxOCAxNCAyNSAxNSAxNyA3IDI4IDExIDI4IDI5IDMwIDEgMTcgMjEgXgorNjEgMCAxMCAyIDE4IDIwIDIxIDIgMTEgMTIgNSA0IDEyIDI1IDE0IDUgNSAyNCAyMiAxOCAzMSAxNSAyMiAyOSAxMSAzIDIxIDMxIDIxIAorMjcgMyAyOCA3IDEwIDI1IDIgMTUgMzAgOSAzMCA3IDIyIDE1IDkgMyAyMCAyNCAyNCAyOCAxNCAxOCA5IDI3IDE0IDIyIDI3IDMxIDEwIAorOCAxNCA3IDE1IDE5IF4KKzU5IDEgMjAgNSAyNiAxIDI5IDcgMTcgMTcgOCAzIDEzIDI3IDE4IDggMzEgMjcgMjggMjIgMjIgMTcgMTkgMTggMTggMTEgMTkgMTMgMjUgCisxMCAxOSA2IDI4IDQgMzEgMjMgMTAgMTggMjYgMzEgNSAxMCAxMyAxMiA4IDE1IDE5IDE3IDExIDE0IDE1IDI0IDE1IDEyIDkgMjIgMTYgCisxNiAyNCAxMyAyMyBeCis1NyAwIDI2IDI0IDI5IDI2IDE1IDEzIDIxIDI0IDIwIDEwIDEwIDIyIDIzIDEzIDYgMTIgMjggMjUgMTIgMiAyMSAyNiAyOCAyNiA4IDE2IAorMTUgNCA1IDE5IDI0IDEyIDMxIDggMzAgMzEgOSAyOCAxMiAzIDI2IDI5IDIyIDI3IDEwIDIwIDEzIDMwIDggMjUgMSA4IDEgNSAxMSAyMCAKKzE2IF4KKzYxIDEgMTIgNCAyOSAxNSAyMSAyNSAyNyA3IDE0IDExIDEgMTEgMTYgMjMgOCA4IDExIDEgMTMgMTUgMjggMSAxNiA1IDggMyAyNCAxMCAKKzIzIDI0IDE3IDUgMTMgMjggMzAgNSAzIDE2IDYgMjAgMjggMzEgNiAyMiAxMCAxMSAyOSAyNSAxNyAyNyAyMiAyNiAzIDIzIDE0IDQgMzAgCisyNyAyMyAyNCAzMSBeCis2MSAxIDE3IDEyIDIxIDE3IDIzIDQgMjIgNyA1IDI3IDEgMjAgMjMgMTIgMjYgMTAgMjQgMzEgMjkgNCAxMSAxNSAxMSA2IDkgMTcgMTggCisxNSA1IDE3IDIxIDI4IDYgOSA2IDggMTAgMjEgMTYgMTEgMiAyMyAxOCAyNyAyOSAxOCA5IDExIDI0IDI3IDExIDE1IDI5IDI5IDMgMzEgCisxOCAxMiAxNyAzMSAxMiBeCis2MCAxIDggNCAyNSAyOSAxNyAyOSA5IDI1IDYgMSAyIDE4IDE3IDE1IDE5IDE1IDEgMjYgMTcgMjAgMjcgMzAgMzAgNiAxMCAxOCA1IDkgCisxMCAyNiA5IDE3IDIgMzAgMTAgMjggMTcgMSAyNyAyOSAyIDE5IDE2IDggMjggMTYgMjEgMzAgMjUgOCA5IDE4IDMwIDE3IDQgNiAzMSAKKzI2IDE2IDE4IF4KKzY3IDEgMTggMjMgOSAyMCA4IDcgMjUgMjYgMTEgMjcgMTcgMjggMiAyMyAyIDEyIDI0IDIgOCA2IDMgMTIgMjAgMTYgNCAxMCAxNyAzMCAKKzEyIDExIDUgMzEgMTkgMTkgMTkgMzAgMTMgMTggMiAzIDggMiAxNyA4IDI0IDMwIDIyIDIgNyAyNiAxIDEzIDI2IDYgNiA2IDE4IDI0IDcgCis2IDcgMzAgMTkgMTIgMjIgMjQgMjggXgorNjkgMSAzIDExIDE3IDMgMTAgMTIgMTEgMTEgMjUgNyAxMyAzMSA0IDcgMjcgMTMgMTAgMzAgMTYgMzAgMTYgMjkgNCAyNyA1IDYgMjcgOCAKKzEyIDI5IDkgMSAxMCA5IDI2IDQgMTkgMSAzIDMgNCAxNiAxMyAxNyA2IDE2IDE0IDI0IDMgMjAgMyAyIDEgMzAgMTQgMTQgMjEgMjkgMTMgCisxMSAxMCAyOSAyMCAxOSAyNiAyNyAxOSA2IDI4IF4KKzYyIDEgMjYgMjYgNyA5IDEzIDE2IDkgMzEgMiAyMCAyOCAxMCAxMCA0IDI4IDMgMjQgMjEgNiAyOSAxNiAxIDIyIDMxIDEgMjQgOSAxNiAKKzIyIDI4IDExIDcgNyAzIDE3IDEzIDIyIDQgMTcgOSA0IDIxIDIzIDE3IDI0IDE2IDI0IDExIDI2IDUgMzEgMzAgMiAyNCAxNCA5IDIzIAorMjggMTggNCAxMyAyNiBeCis3MCAxIDQgMyA5IDkgMTQgMTIgMTMgOCAyMCAxMiAxOCA2IDIxIDEyIDI1IDMgMjcgOCAyMSAxMyA1IDI2IDIxIDE4IDE5IDIzIDE2IDEyIAorMTQgMjAgMTcgMTYgNyAxNiAxOSAyMiA5IDE1IDEwIDMxIDcgMTggMjkgNSA3IDIgNSAxNiAxOCAxMCA3IDExIDIxIDIxIDkgOCAxOCAyNSAKKzE5IDMgNiAxOSAyOSAxMCAzIDUgMjMgMTUgMTYgMTcgXgorNjAgMSAyNiAxMiAyIDE5IDIzIDEgMjIgMyAxOSAyOCA1IDIgOSA0IDIxIDExIDE4IDEgMjMgNiAzMCAyMyAzMCAyNiAyMCAxMSAyMiAxOSAKKzI3IDIgMTYgMTAgNiA0IDI0IDE3IDIwIDI1IDIwIDE1IDggMjMgMjMgMjAgMzAgMTggMTYgMyAzMCAxNSAyNiAyMyAyOCA3IDIxIDggNyAKKzMxIDMxIDcgXgorNjYgMCAyNiAxOCAzIDEgMjYgMjggMTUgMjUgMTEgMzEgMyAyNSA5IDIxIDIwIDIgNiAxNCA0IDkgNSAyOCA4IDE3IDIyIDEgNCA4IDcgCisxMCAxNCAxOSAxMCAxNCA4IDI3IDkgMjQgMjYgNCAzMCAxMSA4IDE5IDUgMjEgNyAyIDI3IDIwIDE2IDIwIDIwIDIyIDE0IDEzIDE2IDI2IAorMTQgMTAgMyAyNSAyMiAyNSAyMyAxNyBeCis2NCAxIDEwIDE1IDE1IDI5IDggMTMgNCAyIDEzIDIyIDIwIDcgNCAyMCAzMSAxNiAyIDIgMjggMTMgMTkgMTQgMTIgMjMgMjcgNiAyIDE0IAorMiAyMiA2IDI1IDMwIDI5IDMxIDEzIDE0IDE2IDMxIDEyIDE2IDMwIDUgMTQgMzEgMTEgNCAxIDEgMjUgMjEgMTMgMjYgMjIgMjEgNSAyMiAKKzE0IDI5IDEgMjEgMyAxNCAyNyBeCis2NCAwIDQgMiAyOSAxMiAxNSAyMyAzIDE1IDUgMSA2IDIzIDIyIDEzIDEgMTQgMjcgMjUgNSAxNSA2IDEzIDMgMjIgMTEgMjMgMzEgMjQgCis2IDUgMjAgNCAxNCAzIDI5IDggMjkgMTkgNyAyOSAyMyAyNSAyOCAxOSAxMSAxNSAyNyAyMSAxNCAxIDE5IDIwIDI2IDEyIDcgMTIgMSAKKzE4IDEzIDI5IDI4IDIzIDI5IDEzIF4KKzU4IDAgMjMgNyAxIDkgMjkgMjQgNSAzMCAxOCA1IDI1IDI1IDMxIDI1IDEzIDcgMjQgMjUgMjQgMSAxMiAxOSA5IDcgNiAyOCAyMCAxNCAKKzI4IDIxIDE5IDMxIDIwIDIwIDYgMjQgMTggMjcgMjQgNCAxOCAyMSAxIDMxIDE1IDEgMTUgMiAyNyA0IDI2IDI1IDQgMjMgMTkgMiAzMSAKKzI4IF4KKzU3IDAgMzAgMjEgMjIgNSAyNyAxMiAzMCAyOCAyOCAyNyAxNSAxOCAxNCAyNSAxNSAxNyA3IDI4IDExIDI4IDI5IDMwIDEgMTcgMTIgMTAgCisyIDE4IDIwIDIxIDIgMTEgMTIgNSA0IDEyIDI1IDE0IDUgNSAyNCAyMiAxOCAzMSAxNSAyMiAyOSAxMSAzIDIxIDMxIDIxIDI3IDMgMjggCis3IDI2IF4KKzU5IDAgMjUgMiAxNSAzMCA5IDMwIDcgMjIgMTUgOSAzIDIwIDI0IDI0IDI4IDE0IDE4IDkgMjcgMTQgMjIgMjcgMzEgMTAgOCAxNCA3IAorMTUgNyAyMCA1IDI2IDEgMjkgNyAxNyAxNyA4IDMgMTMgMjcgMTggOCAzMSAyNyAyOCAyMiAyMiAxNyAxOSAxOCAxOCAxMSAxOSAxMyAyNSAKKzEwIDE5IDE5IF4KKzU5IDAgMjggNCAzMSAyMyAxMCAxOCAyNiAzMSA1IDEwIDEzIDEyIDggMTUgMTkgMTcgMTEgMTQgMTUgMjQgMTUgMTIgOSAyMiAxNiAxNiAKKzI0IDEzIDIgMjYgMjQgMjkgMjYgMTUgMTMgMjEgMjQgMjAgMTAgMTAgMjIgMjMgMTMgNiAxMiAyOCAyNSAxMiAyIDIxIDI2IDI4IDI2IDggCisxNiAxNSA0IDUgMzEgXgorNjYgMSAyNCAxMiAzMSA4IDMwIDMxIDkgMjggMTIgMyAyNiAyOSAyMiAyNyAxMCAyMCAxMyAzMCA4IDI1IDEgOCAxIDUgMTEgMjAgOSAxMiAKKzQgMjkgMTUgMjEgMjUgMjcgNyAxNCAxMSAxIDExIDE2IDIzIDggOCAxMSAxIDEzIDE1IDI4IDEgMTYgNSA4IDMgMjQgMTAgMjMgMjQgMTcgCis1IDEzIDI4IDMwIDUgMyAxNiAyMSBeCis1OSAwIDIwIDI4IDMxIDYgMjIgMTAgMTEgMjkgMjUgMTcgMjcgMjIgMjYgMyAyMyAxNCA0IDMwIDI3IDIzIDI0IDIxIDE3IDEyIDIxIDE3IAorMjMgNCAyMiA3IDUgMjcgMSAyMCAyMyAxMiAyNiAxMCAyNCAzMSAyOSA0IDExIDE1IDExIDYgOSAxNyAxOCAxNSA1IDE3IDIxIDI4IDYgOSAKKzYgOCAyNiBeCis1OSAwIDIxIDE2IDExIDIgMjMgMTggMjcgMjkgMTggOSAxMSAyNCAyNyAxMSAxNSAyOSAyOSAzIDMxIDE4IDEyIDE3IDMxIDE5IDggNCAKKzI1IDI5IDE3IDI5IDkgMjUgNiAxIDIgMTggMTcgMTUgMTkgMTUgMSAyNiAxNyAyMCAyNyAzMCAzMCA2IDEwIDE4IDUgOSAxMCAyNiA5IAorMTcgMiAzMCAyNCBeCis2MSAwIDI4IDE3IDEgMjcgMjkgMiAxOSAxNiA4IDI4IDE2IDIxIDMwIDI1IDggOSAxOCAzMCAxNyA0IDYgMzEgMjYgMTYgMjUgMTggMjMgCis5IDIwIDggNyAyNSAyNiAxMSAyNyAxNyAyOCAyIDIzIDIgMTIgMjQgMiA4IDYgMyAxMiAyMCAxNiA0IDEwIDE3IDMwIDEyIDExIDUgMzEgCisxOSAxOSAxOSAyNSBeCis3NCAwIDEzIDE4IDIgMyA4IDIgMTcgOCAyNCAzMCAyMiAyIDcgMjYgMSAxMyAyNiA2IDYgNiAxOCAyNCA3IDYgNyAzMCAxOSAxMiAyMiAKKzI0IDI1IDMgMTEgMTcgMyAxMCAxMiAxMSAxMSAyNSA3IDEzIDMxIDQgNyAyNyAxMyAxMCAzMCAxNiAzMCAxNiAyOSA0IDI3IDUgNiAyNyAKKzggMTIgMjkgOSAxIDEwIDkgMjYgNCAxOSAxIDMgMyA0IDE2IDE2IF4KKzY0IDEgMTcgNiAxNiAxNCAyNCAzIDIwIDMgMiAxIDMwIDE0IDE0IDIxIDI5IDEzIDExIDEwIDI5IDIwIDE5IDI2IDI3IDE5IDYgMTcgMjYgCisyNiA3IDkgMTMgMTYgOSAzMSAyIDIwIDI4IDEwIDEwIDQgMjggMyAyNCAyMSA2IDI5IDE2IDEgMjIgMzEgMSAyNCA5IDE2IDIyIDI4IDExIAorNyA3IDMgMTcgMTMgMjIgMjcgXgorNjUgMCAxNyA5IDQgMjEgMjMgMTcgMjQgMTYgMjQgMTEgMjYgNSAzMSAzMCAyIDI0IDE0IDkgMjMgMjggMTggNCAxMyAyMyA0IDMgOSA5IAorMTQgMTIgMTMgOCAyMCAxMiAxOCA2IDIxIDEyIDI1IDMgMjcgOCAyMSAxMyA1IDI2IDIxIDE4IDE5IDIzIDE2IDEyIDE0IDIwIDE3IDE2IAorNyAxNiAxOSAyMiA5IDE1IDEwIDMxIDEgXgorNjggMSAxOCAyOSA1IDcgMiA1IDE2IDE4IDEwIDcgMTEgMjEgMjEgOSA4IDE4IDI1IDE5IDMgNiAxOSAyOSAxMCAzIDUgMjMgMTUgMTYgCisyNyAyNiAxMiAyIDE5IDIzIDEgMjIgMyAxOSAyOCA1IDIgOSA0IDIxIDExIDE4IDEgMjMgNiAzMCAyMyAzMCAyNiAyMCAxMSAyMiAxOSAKKzI3IDIgMTYgMTAgNiA0IDI0IDE3IDIwIDI1IDIwIF4KKzYzIDAgMTUgOCAyMyAyMyAyMCAzMCAxOCAxNiAzIDMwIDE1IDI2IDIzIDI4IDcgMjEgOCA3IDMxIDMxIDE0IDI2IDE4IDMgMSAyNiAyOCAKKzE1IDI1IDExIDMxIDMgMjUgOSAyMSAyMCAyIDYgMTQgNCA5IDUgMjggOCAxNyAyMiAxIDQgOCA3IDEwIDE0IDE5IDEwIDE0IDggMjcgOSAKKzI0IDI2IDQgMzAgMjQgXgorNjQgMSA4IDE5IDUgMjEgNyAyIDI3IDIwIDE2IDIwIDIwIDIyIDE0IDEzIDE2IDI2IDE0IDEwIDMgMjUgMjIgMjUgMjMgMjEgMTAgMTUgCisxNSAyOSA4IDEzIDQgMiAxMyAyMiAyMCA3IDQgMjAgMzEgMTYgMiAyIDI4IDEzIDE5IDE0IDEyIDIzIDI3IDYgMiAxNCAyIDIyIDYgMjUgCiszMCAyOSAzMSAxMyAxNCAxNiAzMSA1IF4KKzY3IDAgMTYgMzAgNSAxNCAzMSAxMSA0IDEgMSAyNSAyMSAxMyAyNiAyMiAyMSA1IDIyIDE0IDI5IDEgMjEgMyAxNCAzMCA0IDIgMjkgMTIgCisxNSAyMyAzIDE1IDUgMSA2IDIzIDIyIDEzIDEgMTQgMjcgMjUgNSAxNSA2IDEzIDMgMjIgMTEgMjMgMzEgMjQgNiA1IDIwIDQgMTQgMyAKKzI5IDggMjkgMTkgNyAyOSAyMyAyNSAyMSBeCis1OCAwIDE5IDExIDE1IDI3IDIxIDE0IDEgMTkgMjAgMjYgMTIgNyAxMiAxIDE4IDEzIDI5IDI4IDIzIDI5IDE0IDIzIDcgMSA5IDI5IDI0IAorNSAzMCAxOCA1IDI1IDI1IDMxIDI1IDEzIDcgMjQgMjUgMjQgMSAxMiAxOSA5IDcgNiAyOCAyMCAxNCAyOCAyMSAxOSAzMSAyMCAyMCA2IAorMjQgMjIgXgorNjAgMCAyNyAyNCA0IDE4IDIxIDEgMzEgMTUgMSAxNSAyIDI3IDQgMjYgMjUgNCAyMyAxOSAyIDMxIDIyIDMwIDIxIDIyIDUgMjcgMTIgCiszMCAyOCAyOCAyNyAxNSAxOCAxNCAyNSAxNSAxNyA3IDI4IDExIDI4IDI5IDMwIDEgMTcgMTIgMTAgMiAxOCAyMCAyMSAyIDExIDEyIDUgCis0IDEyIDI1IDE0IDIyIF4KKzYwIDEgNSAyNCAyMiAxOCAzMSAxNSAyMiAyOSAxMSAzIDIxIDMxIDIxIDI3IDMgMjggNyAxMCAyNSAyIDE1IDMwIDkgMzAgNyAyMiAxNSAKKzkgMyAyMCAyNCAyNCAyOCAxNCAxOCA5IDI3IDE0IDIyIDI3IDMxIDEwIDggMTQgNyAxNSA3IDIwIDUgMjYgMSAyOSA3IDE3IDE3IDggMyAKKzEzIDI3IDMxIF4KKzU4IDAgOCAzMSAyNyAyOCAyMiAyMiAxNyAxOSAxOCAxOCAxMSAxOSAxMyAyNSAxMCAxOSA2IDI4IDQgMzEgMjMgMTAgMTggMjYgMzEgNSAKKzEwIDEzIDEyIDggMTUgMTkgMTcgMTEgMTQgMTUgMjQgMTUgMTIgOSAyMiAxNiAxNiAyNCAxMyAyIDI2IDI0IDI5IDI2IDE1IDEzIDIxIAorMjQgMjAgMTAgMTAgMjUgXgorNjUgMCAyMyAxMyA2IDEyIDI4IDI1IDEyIDIgMjEgMjYgMjggMjYgOCAxNiAxNSA0IDUgMTkgMjQgMTIgMzEgOCAzMCAzMSA5IDI4IDEyIAorMyAyNiAyOSAyMiAyNyAxMCAyMCAxMyAzMCA4IDI1IDEgOCAxIDUgMTEgMjAgOSAxMiA0IDI5IDE1IDIxIDI1IDI3IDcgMTQgMTEgMSAxMSAKKzE2IDIzIDggOCAxMSAxIDEzIDIxIF4KKzYwIDEgMjggMSAxNiA1IDggMyAyNCAxMCAyMyAyNCAxNyA1IDEzIDI4IDMwIDUgMyAxNiA2IDIwIDI4IDMxIDYgMjIgMTAgMTEgMjkgMjUgCisxNyAyNyAyMiAyNiAzIDIzIDE0IDQgMzAgMjcgMjMgMjQgMjEgMTcgMTIgMjEgMTcgMjMgNCAyMiA3IDUgMjcgMSAyMCAyMyAxMiAyNiAKKzEwIDI0IDMxIDExIF4KKzY0IDEgNCAxMSAxNSAxMSA2IDkgMTcgMTggMTUgNSAxNyAyMSAyOCA2IDkgNiA4IDEwIDIxIDE2IDExIDIgMjMgMTggMjcgMjkgMTggOSAKKzExIDI0IDI3IDExIDE1IDI5IDI5IDMgMzEgMTggMTIgMTcgMzEgMTkgOCA0IDI1IDI5IDE3IDI5IDkgMjUgNiAxIDIgMTggMTcgMTUgMTkgCisxNSAxIDI2IDE3IDIwIDI3IDI1IF4KKzY0IDAgMzAgNiAxMCAxOCA1IDkgMTAgMjYgOSAxNyAyIDMwIDEwIDI4IDE3IDEgMjcgMjkgMiAxOSAxNiA4IDI4IDE2IDIxIDMwIDI1IDggCis5IDE4IDMwIDE3IDQgNiAzMSAyNiAxNiAyNSAxOCAyMyA5IDIwIDggNyAyNSAyNiAxMSAyNyAxNyAyOCAyIDIzIDIgMTIgMjQgMiA4IDYgCiszIDEyIDIwIDE2IDQgMzEgXgorNjAgMCAyOCA1IDI0IDE2IDEwIDI3IDI4IDE5IDI5IDE5IDIyIDEwIDIzIDE3IDI1IDcgMjYgNSA1IDI3IDEgMjAgMjQgMTMgMjcgMTYgCisyNCAzMiAzMSA1IDEyIDIxIDEzIDYgMTEgMjEgMjAgMTUgMyAxNCAxOCAzMiAyIDkgNiAxMCAxMyAyMyAxNiAxNyAzIDIwIDE5IDI3IDI5IAorMjEgNSAxMSAyOCAxNCBeCis8RAorCitIPlNIUyBUeXBlIDIgU3RyaW5nczxICitEPgorNjAgMSAxNiAxMyAxOSA1IDE2IDE0IDI3IDIgMjIgNyA1IDI4IDE1IDE4IDI1IDE3IDEzIDEyIDI5IDI0IDIxIDI5IDI1IDE2IDUgMTcgCisyMiAyNCA4IDggMTggMyAxMyAxMCAyOCAzIDIzIDI4IDEyIDggMyAyNSA1IDI1IDI0IDcgMTQgMzAgMjcgMzIgMzAgMjMgOCAxNSAyNyAKKzI4IDEzIDggMTIgMjEgXgorODYgMSAzMyA1IDQwIDI2IDMgMTkgMTIgMzYgNDMgNSAzNSAzNyA1IDE0IDExIDQ1IDM1IDE2IDEwIDggMzIgNCAxNSAzNSAyNiAyIDM5IAorMjIgMzcgMjIgMzAgMjkgMjggMzYgNDUgMTQgMzYgNCAyOSAzNyAzMCAzNCAzNiAyMCA5IDQyIDI5IDkgMTEgMTEgMTggNDIgMTMgNiAyMCAKKzQyIDIwIDMwIDIyIDM1IDM0IDYgMTQgNDEgMTkgMzAgMTcgMzUgMzMgMjYgNDEgMTUgNSA0NCAzOSA4IDIwIDMgNDQgMzIgMTUgMTggMTAgCisxNSAxMCAzNiBeCisxMTIgMCAxMCA0NCAyNCA1MyAzNSAyMiA0MCAyMCAxNSA1MSAyMiAxOCAyMiA0MiA2IDU0IDQ5IDM4IDIxIDcgMTMgMzAgMTYgNyA1MiAKKzE2IDIyIDEzIDM4IDcgMTEgNDQgMzMgOSAyNSAxMyAzNyA0MiAxNCA0NSA1MyAzMCAzOCA1IDI1IDUgMzUgMzggMjIgMjggMTAgMjkgNTIgCiszMSAzOSAzNSAyMyA1IDE3IDE0IDMxIDQ2IDUgNDEgNTQgNDMgMzMgMTMgMjMgNDYgNDUgMyA0NiAzIDU1IDE1IDYgNTMgMjggNTIgMjIgCisyNyA0NSAzMiA1MyA1MSAxNSAzNyAxNSA0OSAzNiAzNSAzNSAxNSAzIDEzIDIyIDI1IDMgNCAxMCAyNCAxMiA3IDQ0IDI1IDE4IDIxIDIxIAorMjAgNTUgMjQgXgorMTIzIDEgNDMgOSAxIDUyIDQgMjEgNDkgNjEgMTggNTAgMjMgMTMgNDYgNjIgMjMgNDUgNjIgOSA1NiAxOCAyMyAzMSA4IDMwIDI3IDM2IAorMTMgMzggNCA1OCA1MyA0NyAyNCAxOCA0MSA1OCAxOSAxMiAxOCA1MiA0MiAyOSA0NCA0NSAyNiA2MyAzNCAzMiA0MSA2NCAxNSAyNiA1NSAKKzE5IDIgNDkgNiAzMCA1MyAxMyA1NCAxMiA1MyAzNyAxMiAzNyAyOSA2MCA1MyAyMSA0NyA0MiA0NSA1MiA0MCAxMCAyOCA0NyA0MyAxNyAKKzE2IDE3IDYxIDM2IDEyIDM0IDYwIDM3IDEzIDUyIDU4IDM3IDM5IDI5IDM0IDExIDQ1IDggMzYgMSA1MCA1MCA1IDUxIDEzIDE1IDMyIAorNTEgMzMgNjEgMTYgMzEgNTAgNTggNjMgMTYgNSAzMCAxNyAyNCAxMCAyNiA1MiBeCisxNDQgMSA2NCA2MiA2MyAzMCAxNSAxIDM1IDI4IDE2IDQwIDIwIDE0IDUwIDMzIDE5IDM4IDMwIDI3IDU1IDEwIDE2IDQ2IDQ3IDcgNTUgCisxMiA1MyAyNiA1NiAzMyAyOSA1NSAyNSAxNyA0OCA0MyAyMSA0MyAxOCAyNCA2MyAyNyA2OCA0NiAzOCAzMyAzNSAxMCAxOCAxMSAyNyA1IAorOSA1OCAzNSA3MCAzNiAzNiAzOSA0NyAyIDEwIDY2IDQ3IDUgMTggMjEgNDQgNzEgNTEgNTcgMyAyMiA3IDU2IDU1IDI4IDI1IDE0IDQwIAorMTYgMjQgNDggMzcgNjYgNTAgMjQgNDUgMTggMzkgNTMgMjkgNjQgNjAgMjYgNTAgNiA0NyA2MSA0NiA0NCA2MCAxNyA0IDU4IDQ1IDI2IAorMjAgMjYgMzIgOCA3IDY4IDM3IDMgMjQgNDQgNDcgNjQgNTQgNzEgNTcgMTIgNjggMjcgNTggMjkgNTQgNDMgNDIgNjAgMTMgMTQgNTYgCis0OSAxIDMyIDkgNjEgNDMgMzYgMzMgMjAgNTkgXgorMTY2IDAgNyAzOCA1NyAzMyA2MSA3MyA3IDY0IDEgNDkgMzUgNzYgMTQgMjcgMjEgNDUgNjggMzggNTggNzMgMTMgNzIgNDcgNzMgMzMgOCAKKzY2IDIzIDM4IDQgNTYgNzcgNDcgMTAgNzEgMTMgMjAgMzEgNDEgNiA1MSAzIDE4IDE3IDYxIDQ3IDE0IDQ4IDc2IDQ2IDI4IDM0IDQzIDEgCis1NiA0IDI1IDcgNjUgNDEgMSAzNCAzNyAyMyA1OSA1OSAyNyAyNiAxMyAxNSAxNCA3NSA2MCAxNCAxIDI4IDU5IDI2IDY1IDYxIDE2IDIzIAorMTcgMjggNiAxOSAyIDM1IDQ5IDMwIDI5IDQ4IDIgNjMgNzMgNTkgMSAzIDc2IDQxIDExIDE5IDE4IDQzIDU0IDYzIDY3IDUxIDQgOSA3OCAKKzYwIDggNzIgMzEgMzUgNzcgNTQgNTggMjAgMzYgNTggNTEgNzYgNDAgMjAgMzcgNDkgMyA3NSAxIDI5IDIwIDU3IDY0IDIyIDI1IDYgMjUgCis1OSAzMiA0MyA1OCA0MCA1MSA3NyAxIDIgMzYgMTAgMTIgMjggMzkgMTEgNDYgMiA0MSAyNyAyNyA1MyA3NiAxMyA2NiA2OSA3NiAyOCBeCisxODYgMSA1IDczIDM4IDMwIDMwIDQ4IDIxIDc1IDgwIDQwIDIxIDggNTMgOSAyNiAzMCAzNCA4MSA3MSA3MSA1MSAyMyA3NSAzMyA0MSAKKzIzIDMyIDUgOCA2NiA0MCA3MiA0MCAxNiA2NiA0NSAxNCA0OCAzNCAyMSA0MSAyNyAzIDU1IDI3IDM3IDIzIDQxIDY1IDQgNTcgNTEgNzQgCisyMiAxOSA3NSA0MiAxNiAxOSA0NiAxNiAxMCA0OCAyMCAxOSAzNyA0MSAxNCA1NyA5IDE3IDU1IDM4IDUgNjAgNyA0NiAyMCA0MyAzNiAKKzM5IDUyIDIwIDEwIDYyIDQ1IDIzIDQ2IDcgMzUgNzUgMjkgNzAgMzUgMzYgMzQgMjUgMTIgMTUgODQgMjYgMTAgNiA3MSAyOSA3OSAzMyAKKzMyIDI1IDU5IDc2IDgyIDY0IDU4IDcgOCAxOSA0MSA3NCAyIDUzIDY1IDI0IDEgNTUgNTEgMzYgMjEgNzkgMjggNSAxNyA0MSAzNiA2MyAKKzUxIDE4IDQ4IDI1IDQ2IDQ1IDM2IDc3IDc2IDIyIDU3IDE0IDQ0IDYzIDU2IDQ1IDU2IDIwIDEgNjQgNDkgOSAxMiAyOCAzMCA3MiA4MiAKKzczIDMzIDMgMjIgMzAgNDMgNTYgNjcgNjIgMiA1NyAxMyA1MCAyMCA1NyAzOCA0MyA2MSA5IDggNTcgNjUgNzYgOSBeCisxODMgMSA1NCAzNCA4MyAxMCAzMyA1MSA4NiA4MSA4MiA2OSAxOCA4IDIyIDY0IDE5IDg2IDYyIDU4IDMzIDM3IDE3IDM0IDUgMjkgODMgCis0MiA3NiA1MCA1NCA2NiAzOSA5IDEgMzYgNDMgMTcgNjUgNiAzNSA1NiA3MiA3MSA4MyA4OCAxMCAxIDggODcgMjIgNiAyMSA3OCAyNSAKKzg5IDQzIDYyIDQwIDU1IDg1IDMxIDg5IDc0IDYzIDQ2IDI4IDI0IDI2IDMxIDE3IDcgOCAyNyAxOSAxMiA4NSAxNyAyMCAyNyA3NyAxMCAKKzIgNTQgODAgMTcgNTIgNzQgNzYgNjkgNzggMTEgMjAgODAgNCAyOSAyNCA4NSA3NSAxOCAzOSAyMyA3MCA4MyAyOSA1NyA2NyA3MiA3MCAKKzMzIDQgMTUgNDYgNDIgMiA2OSAxMyA1MyAzMyA2OSA2NCAzMyA2NCAxNCA0MCA2OSA1OSA3OCA3MSAxOSA4NSAxNiA2NSAzOCA4MiA1NSAKKzQwIDU2IDQwIDI0IDg0IDI5IDI1IDQ0IDY4IDEzIDg1IDc2IDY0IDMyIDE4IDI1IDQ1IDIzIDYgODAgMzEgMzAgMzAgNTggMTQgMTMgNzIgCis1NyAxNCA0MSAyOCA1MiA3MyAyNiA3NiA4MyA1NiA1NCAyIDM2IDExIDY1IDY2IDM4IDUwIDggNDEgODggNzcgXgorMjAwIDEgMjUgNTcgNDAgNDYgNzggNTcgMzQgNzggNjEgMzYgNjYgNTcgMzggODAgMjIgMzIgNjggNzEgMzAgNzQgMzcgODEgNjYgNzcgCis2NiA1NSAyIDUxIDI0IDkzIDYxIDQwIDY4IDQ1IDYxIDEyIDYzIDI0IDg5IDU5IDUyIDcyIDQzIDIwIDIwIDY5IDM2IDQwIDg4IDQ2IDkgCis2MiA1NSA3NyA4NCAyMCAxOCA2IDc3IDE1IDUyIDM5IDc1IDMgMjYgNCA4NSAxNyA2MiAyOSAxMSA5MiA0NiA1OCAyOSA1OSAyOCA0MiAKKzgwIDcxIDk2IDIgNDkgODUgMzcgNjMgNCA2MSAxNCAyIDUzIDg3IDI1IDg2IDYgNzUgNzYgOTMgNDEgMzkgOTMgOTIgNDIgNTYgNDEgNjMgCisyNiAyOCAxOCA3NyAxMSA1MCA3OCA3OSAxIDEyIDEyIDkxIDI5IDEzIDU4IDUgNTYgOTIgNjYgNTkgNCAzOSA0NyA5NSA1IDUgNjIgMzMgCisxMyA4MCA2OSA2MCA0MyA1MSAyMiAzMCAzMiA0MiA1IDM4IDMgNTAgNyA0OCA5MCA1NiA5NiA2OCA0NyA0MSA2MSA2MCA5NiAyMCAxNCA0IAorMTkgMTkgMjMgMjUgMTMgOSAzOCA1MiAxNyAxMSA5NiA0OCAxOSAyNSA4OCA0MiA3IDc0IDU5IDQ4IDcwIDU1IDI0IDE4IDI4IDQ0IDQ2IAorMyAyNCAzOCA1NiAxOSA5NiAyMiA1MCA2MCAxNyA5NiBeCisxOTUgMSAyNSA1MSA0NSAzNSA2NiAxOSA2MSA2MCA5IDMxIDkzIDY0IDcwIDMwIDQyIDg2IDUzIDEgNzEgNDYgNDIgMjIgMzggOTYgMTAgCis5OSAzNCA3NiAyNiA1NSA3MyA2MyA2MyA5NyAyMyA5MiA4MSA2NCA0NiAxIDMwIDMxIDM1IDg2IDkxIDg4IDY0IDg3IDE2IDM3IDY5IDg0IAorOTQgNjAgMTAwIDMgNDcgNTIgOCA3MSA4NyA1NyAyOSA3NiA0MyAxOCA0NSA0NiAxNSA2NSAxMiA0NCA0MiA2NiA2MCAxNSA2OCAxOSA1OCAKKzM5IDYyIDc2IDkgOTIgMTAxIDU3IDMyIDQgMzQgMTUgNDEgNjIgMzIgODkgNzEgNDMgMzUgMzEgNDEgMjEgMTcgODIgMzMgOTYgMjcgNjIgCisyOSA4MiA1NyA0NiA2MiAxNSAyNCA5OSAzNyA4MyA0MCA1MiA0NiA1NiA4MCA5OCAzIDkxIDc0IDYgMjcgNyA1OCA5NCAxMCA0MSA3OSAKKzk3IDg0IDc3IDc0IDI2IDk5IDk1IDYxIDE5IDE3IDI0IDU1IDE1IDg1IDg0IDMwIDQ1IDkzIDQ0IDEwMCA0NCAzOSA1OSA0NiAxOCA5NSAKKzMgNDEgMTUgODIgNzcgMTYgNDggMTggNTEgODMgMjAgODIgNjAgNTMgNTMgMTIgOTkgOTIgNTQgNSA5OSA1MSAzOSAxMDAgNjEgMiAzMSAKKzUyIDQ5IDg2IDk0IDE2IDc4IDg0IDkxIDQyIF4KKzIxMiAwIDU2IDk4IDE2IDk4IDc4IDIyIDcyIDMzIDEwMyAxMDQgNTIgODQgMTIgNjUgMTUgODUgMTAxIDk3IDg0IDMxIDUxIDI2IDEwMCAKKzEwMCAzOCA4MCAxMyAyIDc4IDcgMjQgNDQgODQgMTAzIDI3IDcgMjggMTYgMzMgOTkgMjUgMTAzIDU0IDE0IDQyIDYyIDg3IDkyIDI3IAorMjIgNDIgNSA1MiAxMDAgODQgNzMgNzIgNjMgMjQgNDggNTYgNTIgMjMgNSAxNyA3NiAzMSAxIDk1IDU4IDQzIDYwIDUwIDYyIDMwIDIzIAorMzUgNzkgMjAgMzUgMyA3MiAzMiA0NSA1MSA4NyA0MSA4NCAyNyA3OSA3NyA3MCAxMDIgMTUgNTQgMTUgMTAwIDggNTIgNjkgMTA1IDMgCiszMCA4NCA0MiA5MyA2NiA4OSA2OSA3NCAyNCAzMyA0MiA5NyA0IDM4IDk5IDEwNiAxMyA5MyA2IDEwNiA3NCAxMDAgNTQgNDUgMjEgNTkgCis1NiAzNyA5IDUwIDMyIDc1IDc5IDMxIDc3IDkgNjEgMSA4IDY4IDYgNjAgODEgNyAxMDAgOTkgMTQgNjEgNDggMjUgNzMgMjYgNzAgNzIgCis5NCAzIDExIDk4IDMxIDUgNjcgNyAzOSA5MiA3MyA4OCAxMDEgMzIgMTA1IDM0IDgyIDgxIDExIDcyIDQ4IDEwIDU5IDcxIDUxIDcxIDM1IAorMzMgMjcgNDkgNDkgMTkgOTggNDcgNDMgNzUgNjQgMTcgMTUgMjQgOTQgNDkgNCA4NCA1OCA1OCA3NCAzOSA0NyAxMDQgODIgNSA2MyA2OSAKKzkwIDE5IF4KKzIzNiAxIDI5IDc5IDQxIDQwIDcyIDUxIDEyIDkyIDM0IDUyIDQ0IDY5IDEwNCAyMSA5NyA4OSA5NiA0OCAyMSA0IDYxIDQwIDI4IDY3IAorMzQgMjMgODUgNDQgMjIgNjIgNTIgMzMgODQgMjMgMzAgNzMgNzQgNCA3OSAxMiA4MSA0NyA4MCA1MyA0NyA4OSA0MCAxOSA4MCA2MiAzNCAKKzYxIDI5IDQxIDk1IDQzIDEgNzAgNjMgNTUgNTMgMTggMTkgMTMgNDggMTAgMTkgODkgNDkgNCA1MiA1MyA1NiA3NiAxMCA4IDEwNCA3NyAKKzE1IDI4IDM4IDc1IDEwOSAzIDg1IDkwIDggNDAgOCA5MyA5MCA0MyAzOSAxNCA2MCAxNyAzNiA3OCA1NiAxMDUgODAgMzUgNzUgMzYgNTggCis4MiA1MCAxMDAgOTggNDUgNzQgMTMgNjYgOTUgNzIgNzEgOTUgMzQgMTQgOTggNzIgMzMgMzggMzcgNTIgNiAxNCAxMDcgNTkgMyAyOSAKKzYxIDY3IDk4IDkyIDUgOTMgMTcgOTggMzYgODcgNDEgNzUgNzEgNTcgODggMTcgMjUgOTEgODQgMyA1OCAyMCA5MiA2OSA1MSA1MCAzNiAKKzMxIDE0IDI1IDE4IDMwIDE4IDEgNDEgMTA0IDMwIDgyIDU5IDg3IDcwIDM0IDk2IDI4IDQ3IDYyIDgxIDEwMyAxMDkgMTAzIDEwMCA3IAorMTcgMTYgMTA0IDEgMTIgMzQgNSAxMDIgNDIgMTYgMjIgNzEgMzkgNSA3MyA0NSA0NSA1NCA0MSAxMyAyIDI2IDQxIDIyIDEwMCAxMDkgCiszMCA0NCA0IDkwIDEwOCA1MyAzOCAxMDQgNjggMjggNTYgNDcgNTEgOTQgMjIgNyA4MSA4NSAyNiA1MCA5IDcyIDk4IDU0IDU5IDk2IDUyIAorXgorMjMyIDEgOTIgNzIgNDcgMzcgMzMgMzggOTIgMTcgOCAyOCA4OCAyMiA2MiA2OSAzMiA4OSA3NSAzIDcyIDk2IDg1IDEzIDEwNSAyNCAzOCAKKzM3IDk0IDExNSA4MyA3MiAxMDggMTE0IDI0IDkzIDc2IDEwMyA2MCA5OSAxMDIgOSA0MyAxMCA1OSA5NSA0NiAzMyA5MyAxNSAyNiA2OSAKKzQ0IDIgODYgMTA3IDU1IDQ1IDYxIDY1IDkyIDY2IDkgNTUgMzkgNzAgODMgMjkgOTggNjcgMTMgMTExIDE1IDIwIDMxIDYyIDggMiA1MSAKKzIwIDE5IDMzIDQ0IDE0IDExNSA3MSAxMTIgOTcgMTAgNDEgMjggNTMgNTEgMjYgNTcgMTUgMzggOTggNTUgMTA2IDIyIDU2IDMxIDUwIAorOTUgMTA3IDExMCA4NCA3MCAxMCAxMDggOTYgNzMgMTAwIDI1IDM2IDU1IDg4IDcxIDYzIDk2IDMwIDkwIDk2IDc5IDIyIDcgMzAgMjMgCisyOCA1OSA4OSA4IDUxIDk5IDQ3IDg2IDM0IDE4IDQzIDY1IDk4IDEwNCAxMDcgNDkgNyA3OSA3MSA4IDU3IDIxIDI5IDgwIDIgNzQgNzggCis0NCA1NyA5IDYxIDIyIDEzIDY4IDUyIDkxIDc0IDk4IDQzIDMwIDU4IDY4IDk1IDEwMSA3MiAxMDIgNzYgNDIgOTkgMTA4IDQ3IDI1IDczIAorMjcgMTA0IDM0IDU5IDUyIDM2IDEwNCAyMCA5OCAxNCA5NyA0IDUwIDQ2IDEwNiA4MyAxNyAyMiAxMDUgNzkgNzcgNDYgMzkgMTUgMTEzIAorMjAgMzcgMTAwIDEwNiA2NSA2NiA3NiA3IDEyIDcyIDM1IDggMjIgNTAgNDAgNjggMTAxIDIzIDU0IDk2IDQ0IDUxIDg3IDE4IDYgNDYgCisxMTAgXgorMjQ1IDAgNzAgMzAgODEgNDYgNTMgMTE5IDg1IDYgMTA0IDQ3IDkyIDcyIDcwIDUgNzAgMTUgMTE1IDY4IDEwNSAzMyA5NyAxMyA4NSAKKzEwNiAxNCA2MSAyOSAyMiA4NiA0NSA1NyA2OSA5MSAzOCAzOCAyOCA2NiAxMyA2MCA5NSAxMDMgMyAxNSA1IDExMyAzOCAyMyA2MiA1IAorNjUgOTQgMTA3IDczIDEwNCAzNyA0NyAxMDIgMTE3IDMgNzggMzUgNyA5NSA1NiA3OCA0NSA1MiAyOCA0NiA0MyAzNyAzMiA1MyAxOSA1NSAKKzI5IDQ3IDk3IDc2IDExNSA4MyA3MSAxMSA0NSA2MiA3MyA5OSAxMTYgMiAyNCAxMTYgNyAyOCA0MSAyIDI5IDM3IDUyIDIzIDUgMTE4IAorNzkgMzEgNTcgODkgNjEgMjQgMTAxIDc4IDUwIDkzIDczIDQxIDcgMzMgNDUgNDcgMjQgMSA0OCA3MyAzNiAzIDI1IDg3IDQ2IDI4IDEwOCAKKzU0IDY4IDUzIDY3IDExOSAyOCAzNiAxMTggMTA0IDQyIDg4IDI3IDExMiA0IDc0IDg1IDEgNjMgMzkgOTcgNzEgNzQgNzUgNzYgMTAgNDkgCisxMiA3OSAxMSA1MCAxMDMgMTE4IDk0IDExNyAxMTggMzcgMjcgMTIgOTQgNjAgMjggNTEgNDcgODIgMTEwIDE3IDE1IDEwNSAyMyA1MiAKKzQzIDEyIDIxIDIyIDgxIDQxIDEyIDc0IDkwIDQyIDEwOCAxMTcgOTggNjcgNCA2OSA0NCA3NiAxMDUgMzggMTAxIDIxIDgwIDcwIDEwIAorMTExIDIzIDExMCAzMiAxMDEgODMgOTEgMTAxIDMxIDUgMyA4MyA3NiAxNSA5MCA1NyA3NCA5NSA0NiAzMyAxMTIgNjIgNjMgNTQgNjMgCis0OSA1OSA0IDY0IDQwIDY4IDExMCA3NCAxMDUgOTEgODYgMTAyIDI3IDU1IDM0IDg4IDU1IF4KKzI0MCAwIDU1IDc5IDc1IDg0IDExMyAyMiA0IDExMyAxMDkgMzEgMzMgMTcgOTYgMTEgMjkgNjMgOTggMTAzIDEwNyAxMTYgMzQgMTQgOSAKKzk1IDM4IDE4IDUxIDc1IDMzIDEwOSAxMTggNTUgNjYgNCA3NiA3IDc1IDcwIDgyIDc0IDIzIDEgMjYgNjkgNDAgMTEyIDk5IDQ3IDY1IAorMzEgNzAgMTE5IDUyIDEwMyA4OCA4NSA4NiAyOCAxNiAxMiA3NiAyNSAyMiA3OCA2NCAyMSA4NiAyNyA2MSA3NyA3MiAxMDggMiAxOCAKKzEwNiAxMTkgMTIxIDU0IDE2IDg1IDcyIDIgNzMgMjYgODggNjYgNjAgODAgMzUgMjQgMTE3IDYzIDI0IDQ0IDY3IDUyIDEyMiAxMTkgMzMgCis3MiAxNiA5OSA5OCA2OSA1NCAxOSA0MiAyOCA1MyAxMTQgMzIgMTE3IDgxIDEwMCA1NyA0OSAxMjMgNTYgMjEgNjggODAgNTMgOTUgMSAKKzQ1IDk1IDEwNyA5OCA4NyAxIDI3IDI0IDk5IDExNiAxNiA2NyAxIDExMyA5MSA4NCAyNSA0MCAyNSA3MiAzIDI4IDkwIDg3IDExMiA4MCAKKzE2IDExNyA0NSA3NyAzNiA5MCAxMDUgNTkgODggMTIyIDY0IDEwOCAxMDggNzEgOTggMTggNTAgMTE1IDkzIDEwNSA3NyAzNSA2IDQ2IAorNTUgNDcgMTAyIDQgMjYgODcgMTExIDEyMCA4MSAxMTMgNCA1NyAxMDUgMyA4NCA5NCAxMTUgNjEgMyAxMjEgNzIgNzEgMjQgNjIgMTQgCis2MCA5OSA2MSA5NiAxMDMgNTEgMTA3IDYgNjUgODEgMTE0IDgzIDEyMSAxMDkgNDkgMTA0IDMwIDczIDgyIDkyIDk0IDkgOCAxMSA5OCAKKzE5IDEwIDU1IDk3IDIyIDk3IDk1IDg4IDY3IDE1IDIwIDM5IDY1IDEzIDEyMyA3NyBeCisyNTMgMSA0NSA3IDE1IDI0IDUxIDUgOTggMTE1IDI0IDQ5IDkwIDEwNCAxMTcgNjYgMTI4IDk0IDY0IDgwIDEyIDQzIDkxIDQ2IDExMSAKKzU5IDU4IDc3IDMwIDE0IDg4IDYwIDEyMyA2OCA0MSA0NCA2OCA0MCAxMDQgMTE4IDQxIDQzIDkzIDkwIDEwNSA5MiAxNiAxMjcgMjYgNTQgCisxMjUgMTE0IDc5IDcxIDI0IDQ4IDIxIDI1IDExOCA0MCAxMDMgNDkgOTEgNDQgNjcgNjUgMjUgMTE5IDEwOSAxOCA0OCAyMyA2OSAxMTIgCiszOCA2MSA2NCA4NyA4NCAxMDQgMTE5IDExMCAxMjIgOTIgMjIgMSA4IDgzIDM0IDEwMCAzMiA2MiA0MSA0NiAxMTIgMzQgMTAyIDc2IDU2IAorMzkgNCAxMjcgMzAgMTMgMTkgMTEwIDEyNCA3IDE2IDEyOCA5NSA0IDEyNCAxMSAxMDQgMTE2IDEyNiA0OSA5NSAzIDU1IDk2IDcwIDkwIAorMTAxIDQgMTIyIDk2IDc1IDExOCAzOSAxMjggOTkgOTIgMTggNDIgMjAgODcgODMgMzUgNzUgMTExIDYxIDY3IDcxIDI4IDEwMSA5IDU2IAorMzQgMTA1IDk1IDcxIDIzIDczIDcxIDI2IDU3IDE1IDIzIDc2IDU1IDk5IDg5IDEyOCA5OCAxMTcgNjggNDMgODggNjIgMzggNjIgMzkgMiAKKzgzIDM2IDE1IDI2IDYwIDEyOCA5NiA3MyA3NCAxMCAxIDEyIDQyIDIyIDIgNzcgMzMgMzMgMzIgNTcgMTMgMTQgODIgNTcgMTIgMzkgMyAKKzU4IDgwIDE0IDg3IDg1IDQ0IDY5IDEwOSAxOSAxMTcgNjcgNjggNDQgNjMgMTA2IDM3IDg4IDY0IDgyIDU2IDM3IDg5IDQgMTI2IDU1IAorOTggMTE0IDg0IDk5IDkxIDQzIDkyIDIxIDI2IDU4IDg0IDEwMiA3NSAxMTYgMTI0IDUgMTAxIDUgOTcgNDYgMTA5IDE1IDI5IDc5IDcyIAorOTMgOTIgMTEwIF4KKzI4OSAxIDgzIDUgNzYgMjAgMzIgMTUgMTAgMSAxMDMgMTggMjIgMTE2IDk4IDkgNTEgMTA0IDEwMiA0NCAzMyAxNSAxMiAyNCAzMSA4OSAKKzEgNiAyOCAxMDEgOCA2NCA3MiAxMDYgMzAgNSA1MiA4OSAxMTEgMzkgMTA4IDY0IDg1IDE3IDU3IDEyNCAyMiAxMDUgNzggMTE1IDMgNDAgCisxMDggNjYgMTA4IDc3IDEyOCAxMDMgNDQgMzUgMzggMTMgOTUgMTAgMTExIDYzIDk4IDExNyA2MSA1MSAxMjYgNjkgOTYgNzAgNzAgNTkgCiszOSAxMyA5NyAzMyAxMTIgMiA3NyA3IDEyMyA3MCA4MyAyOSA2NiA2NyA0OSA3OSAxOSAxMDQgMTE1IDE0IDYwIDIgNTUgNDAgNzEgMzMgCisyOCAxMTQgNTEgOTEgMTcgNDYgNDUgMTI4IDU3IDg3IDYyIDI1IDExNSAzOCA1MCA1NSA5MCA3NCA4IDUxIDEwMiA3OSA0MyA5NCAzNiAKKzEyMiA5NCAxMiA0MSAzNiAyNSAxMDQgOTEgMjQgNyA5OSA4MCAzMCAxMjYgMzIgNjMgMTIyIDEwNyAxMTQgMjcgMjggNzkgNDEgMTIgMzUgCis1MSAxMTUgMTIyIDcwIDIyIDc5IDY1IDIgODggMjcgMTcgNTkgMTUgMjMgNDQgNTcgNSA2NSA2IDI2IDc4IDgwIDEyNSA5MyA4NCAxMDAgCis0NSAyMiAxMjkgNjggMzYgMTExIDc0IDExOCAxMSA1MCA0MiAxMjAgNDcgMjEgOCA4NiAxMTIgMjYgNjcgNjAgOTkgNDUgOTMgNDcgOCAKKzM4IDU5IDUyIDU2IDEyNCAyMCA4MiAxOCAxMTcgMjQgMTggNDYgMTA2IDE5IDExNyAyNiA0MSA0NyA0NSAxMzAgNyAxNSAxIDQgNSAxMDAgCisxMCA4NSA1MCA0NCAxMSA0OCA5MiAxMTkgMTA4IDQyIDExOCAyNCAyMCA2OSAxMDcgOTAgOTYgNDggMTAzIDcgMiA5MCA1MCAxOCAxMzAgCisxMjYgNDUgMTA2IDE3IDM1IDI1IDEwMiA2OCAyMyA2OCAxMjAgNTggNDEgMzQgNzUgMTAzIDIwIDQ1IDExNyAzNyA2MSA3MyAzNCA2MiAxIAorMTI1IDU4IDc0IDIxIDIxIDEyOSA3IDg2IDExMCA3NiA2NiAxMjQgXgorMjYzIDEgMTAwIDEzNSA3IDc1IDIzIDUgODEgMTEwIDMxIDExOCAyOSAxIDYyIDExIDQxIDg4IDEwOSAxMTkgMTAyIDM3IDMgMzAgMTIzIAorNDcgMzEgNTYgMTM0IDI5IDEyNCAxMTYgMTE4IDk5IDIxIDU2IDc3IDkxIDIzIDM3IDEzNSA4MSA0NCA1MSA2NyA5NSA1MSAxMzMgMzAgCis1NyA2NyAxMTYgMTIyIDQ4IDEwMCA3IDEzMiA5NyAxMDYgNjkgOTMgNCA5NSAxMjUgMTAyIDEwMyAxMTkgODEgNTcgMTMzIDk2IDM3IAorMTE4IDUwIDExNyAxMTMgODEgMTI3IDE3IDQ1IDEwMyAzMiAxMjEgMTI5IDYwIDQzIDY1IDEyNyAzMCAzNiAxMzIgMTEwIDUyIDUzIDM1IAorNzEgMTIgNzYgMjIgNzIgMTMwIDExMiA5OSA3NiAyNiAyMSA3MyA2MyA2MyA5NyAyMyA1OCAxMTUgMTMyIDExNCAxIDEzMiAzMSAzNSAxOCAKKzIzIDU0IDMwIDUzIDExOCAzNyAzNSA4NCA5NCA2MCAxMDAgMyA0NyAxOCAxMTAgMTA1IDg3IDU3IDYzIDc2IDQzIDUyIDQ1IDQ2IDQ5IAorNjUgMTIgMTAgNDIgNjYgNjAgMTE3IDM0IDE5IDkyIDUgMjggNzYgOSAxMjYgMTAxIDEyNSAzMiAzOCAzNCAxNSA3IDYyIDMyIDIxIDMgCis0MyA2OSAzMSAxMDkgMTIzIDUxIDExNiAxMzUgMTMwIDEyOSAxMzAgNjMgMTQgNTcgODAgNjIgMTUgMTI2IDMxIDEwNSA4MyAxMDggMTIwIAorODAgMTI0IDQ2IDk4IDEwNSA5MSA2IDYgMjcgNyA1OCAxMjggNzggNyA3OSA2MyA4NCA3NyA3NCAxMjggNjUgNjEgOTUgMTIxIDE3IDI0IAorMTIzIDExNyA1MSA1MCA2NCA3OSA1OSA0NCAxMzQgNzggNzMgNTkgMTE0IDE4IDI3IDMgMTA5IDQ5IDgyIDQzIDExOCAxMTYgNTIgMTE5IAorMTUgMTIyIDgyIDI2IDg3IDUzIDExNCAxMzMgOTIgODggMzkgOTkgMTcgMTA3IDEzNCA5NSAxMDQgMzEgNTIgNDkgOTQgXgorMjg2IDAgMTIwIDE2IDEwNCAxMzYgMTE3IDgyIDEzOCAzMiA2NSAxMTQgMTE5IDEzNyAxMjEgOCAxMiA0NiAxMjYgMjYgMTE5IDczIDEzMCAKKzYwIDc2IDExMyAxMDAgMTQgMTMzIDI2IDExNiAzNCAxMjAgODAgOTUgODQgNTMgMTUgMjQgNDQgNTEgNCAxMCAyMyA3NyAyNCA5OSA2NiAKKzM3IDU0IDYzIDQyIDEzNiAyMSAzNCA3NiA1IDE3IDEyOCAxMDEgMSA1OSA0MCAxMTMgMTEyIDMyIDk3IDMxIDkzIDEwNSA3OSA5MSAxOCAKKzM5IDEgMTAzIDEzMiA1MSA2OCAxMjQgMTExIDEzIDk3IDQzIDEyOCA2OSA4NCA4NSA3MiAxNSAxMiAyNiA4NyAxNiAxNiA5MiAxMDEgMTMgCis3NyA0IDExOCA4OSAxMDMgNTYgNDIgMTYgNjAgNDQgMzkgMTI2IDQ2IDE4IDgzIDkzIDQxIDEwNSAzIDgyIDEwNiAxMTUgOTEgNiA0IDU0IAorMTE1IDE1IDEyMCAxMDkgMTEzIDQ4IDQxIDkgOTUgMjAgNjIgNjcgMTA1IDExMSAyNSAxMzIgNyAxMTYgNDYgMTM4IDQ0IDgzIDYxIDEyNCAKKzEzMSAzNSAxMDcgNiAxMDkgODEgMTE0IDY3IDQxIDEzNyA3NyA1NiA3NCA3MyAzNCAxMiAxNCA2OSA1MiAxMSA5OCA0NyA1NCA4MyA4MSAKKzYgMSAxNSA4OCAzNSAxMzkgODAgODMgNDkgODkgMjcgNDcgMTMwIDkyIDEzMyA4NyA1MSAxMTIgNzYgNDkgMTA5IDQ5IDU3IDkzIDczIAorMjIgMTE3IDUwIDY0IDU4IDk3IDEzOSAzNiAxMzEgMTExIDEzMyA1OCAzMyA4IDg4IDU1IDM4IDkwIDQ2IDMwIDExOCA1NyAyOSA4MiA3NCAKKzQxIDExNyAzOCA0NiA5NCA5MiA1IDEwNSAxNSAxMTcgNzAgMTAzIDY4IDYwIDEyMCA0OCAyMSAxMTAgODUgNDAgODEgMzggNTggMTI5IAorNTYgMTAgOTkgODYgNzYgODEgMjYgMjMgMjUgNjggMTYgMjggMTI3IDY1IDE4IDcxIDc1IDc3IDEwMCAyNiAxMSAxMzAgMTA0IDI4IDM0IAorNTYgMTA2IDcgOCAxMjAgMTEyIDEyIDU4IDIxIDEzMCAxMjQgNjcgNjEgMTkgODcgMTE5IF4KKzI4NiAxIDM1IDk0IDYxIDEzMCA5OCAzNSA4OCAzNCA2NSAxMDQgNTYgMTI2IDExOCA1MCA4NyAxMCA4MSAxMDkgOTAgODYgMTE4IDMyIDYgCisxMTQgODggMzkgMzggMzkgNjIgMyAxMiAxMzQgNzIgMTM3IDM1IDc1IDgxIDExNSAxMDYgMTQwIDExMiAxMSAxMjMgNDEgMTAzIDQ1IDk1IAorODQgNzEgMTA3IDEzIDI2IDExMCA5NiA2MiAxNiAxMDkgODQgNTkgNTMgMzggMjcgOCAyOCAxMyAzMiAxMzcgMTcgMTM4IDQxIDEyMiAzNiAKKzk5IDY1IDk5IDgzIDM2IDExMiAyOSA0OSA3MCA5NiAxMjYgMTM2IDEzMSAxMTYgMyAxOCAxNyAxMjYgMTQyIDE0IDM3IDE0MSAxNDEgCisxMjMgNDIgMTMgMjAgODMgNDIgMTM5IDgzIDU0IDQ5IDU4IDQyIDcgMTM3IDI5IDQ4IDE2IDEyMSAxMjcgMzQgNTIgMTQwIDEwNiAxMjggCis1OCAzNiAxMjQgODMgMjQgNjkgNTQgNjEgMTEyIDE3IDYgOTUgOTcgMjQgNTcgODYgMTI0IDU5IDcxIDExOSA2NyAxIDEwOSA1NCA2OCAKKzQ5IDU3IDEzMiAzMiA1IDcxIDExMyA0MCA4MCAxMDQgNzUgMTA2IDEzMyAzMSAxMjYgMTMwIDEwNCA2MiA5IDM5IDQ0IDY2IDExNiAxNDEgCisxMzUgOTYgMTMyIDE5IDQxIDEyMSAxMjYgMTI0IDc3IDggNCA2MCA4MiA2IDEwMSAxMjQgODkgNTEgMTIzIDQ4IDQwIDg1IDc3IDIxIAorMTEyIDEwIDY5IDY2IDExNSA4NyAxNiAxMDggMzAgODQgNjUgODAgMTAzIDMyIDEzMSAxMzQgNzMgNDcgMTAgNjMgMzkgNTAgOTMgMzcgCisxMzUgMTE0IDY5IDQ4IDM0IDU4IDIzIDI3IDEzMyAzNyA5IDQwIDk4IDQxIDExNSA5OSA3MCA4MyAyOSA0MiA2NyAxMzMgNTUgNzkgODAgCis5MSAxMjIgMTIgMiAxMTUgMTEyIDIzIDMzIDE2IDEwMiAzIDE5IDYwIDEwMSAxMzAgMTA1IDExNiAxMTcgMjcgMiAxIDEwMyAzOCAxNCAKKzU1IDc4IDI2IDExNiAxMjMgNTQgNjcgMTM5IDgyIDc0IDcwIDg0IDcyIDE3IDEzMiAyNSA2OCAzMSAxMjAgMTAzIDE0MCBeCisyODUgMSA2NSAzMCA1MSAxMTkgNDggMTA3IDkyIDg0IDY5IDI4IDEzNiAxNDMgNTQgMjAgNiA3MCA0NyAxNDIgNjQgNCA2NSA1OSA3MyAKKzk5IDEzNCAxNDYgMTAyIDEyNSAxMTYgNTcgMTM3IDEzNyA3MiA0OCAxMjggNzggNSA4MCA2MyA1NCA4NSAzMCAyMiAxMjkgNjggMjEgMjEgCis3NCAyOCAxMjggMTA3IDI3IDYwIDIgOTMgOTUgNzEgMzcgMTEgMzcgMTUgMzkgMTAyIDMgMTA0IDY1IDgwIDU5IDUyIDExMyAzNCAyMCAKKzY3IDYwIDI3IDgxIDEzNSA0NiAxMDYgMTA2IDEwMiA2OCAxMjggMTcgMTUgMTAwIDEyNCAxNSA0MyAxMzYgMTIyIDEwMCA2NyAxNDIgMzUgCisxNCA1MyAxMjAgMiA4OSA5MyA5OSA3MyA5IDEyMiAzOSA3NyAxNSA5NiA5MCA0MyA3OSAxMzQgNjAgOTIgMTA1IDU1IDk2IDMxIDExOSAKKzc3IDk3IDcyIDIzIDE0MCAzOCAzMCA0MyA4MyAxMzYgODggMTA3IDExNyA3MiAxMDkgMTE4IDU4IDkxIDExOSA3MyA5NSAxMDAgNTkgCisxMzggMTIzIDU0IDQ5IDE0MyA1MCAxMzMgNjYgMTA2IDQ1IDgwIDg4IDQyIDkzIDUgNTkgNzcgMTAxIDc0IDExMCAxMDQgNDAgOTIgMTkgCis3NyA3NiA4NiAxMDIgMTI5IDMgMTQ0IDEwMSAxMzkgMTM0IDU2IDkwIDE4IDkxIDk0IDg1IDU1IDEwIDEzNyAxMSA1OCAxIDEwNyAxMTMgCis3MCAyMiA3IDU2IDI5IDE0MyAxMTEgOCA0NiA0NSAxMTYgMTIyIDEyOSA4OSA3IDEyMSA1MyA5NSAxNCA0OSAxMTggNjIgMTI1IDkxIDM3IAorOTcgMTUgMzUgMTAwIDYzIDE0MCA2MyA1MCA1MSA1OCAyNiAxMjcgNiA0NSA1OSAxMDIgMTIxIDExNCA4NSAxNDEgMTM1IDEwIDcyIDE5IAorMTA2IDY2IDY2IDQxIDUzIDEzIDM4IDEgMjEgMTAzIDUwIDEwOCA0NiA2NiA3MCA0MyAxNDAgMTI0IDQwIDYzIDE0NCA5NyAxMzcgNDcgCis2MCA4OCAxMDMgMTE1IDEzMiAxNDUgMTE2IDE0MyAxMTUgMTAgMTMzIDkgMTE4IDM3IDEwNSA1MSA5NCA2MCA2NyAxMTcgMTE2IF4KKzMwNSAxIDEwOSAxMTAgNzUgNDIgMTIgMTM5IDEzNyA0MyAxMjggMTA2IDEwNyAxOSAxMjYgMTIgMTAxIDE0OCAxMjcgMTUgMTE3IDEyNSAKKzEyNSA2MiA5NiAxMyA3NiA3MCA5NiAxMDEgMTEwIDEzOCA4IDk1IDc2IDE0MyAxNyAzMiA5NyA3OSAxNDkgMzkgMzEgOTQgMTIzIDIxIAorNDEgMTM1IDU1IDg0IDcwIDMzIDEzNSAxMTggNTAgNjIgMTIxIDgxIDEgNDUgMTQ0IDkzIDYwIDUgNjQgMTM3IDggMTA1IDkxIDgyIDY3IAorMjcgMTEzIDExOSA1MyAxOCA5OCA3OSA0OCA4NCAzMiAxMzUgMTI4IDUgMSAyMCA3NiAxNyA4NSAxMDggNzIgMzYgMTQxIDE0MCA0OSAKKzE1MCAxMDUgMTA0IDMgMTQ5IDE0IDU0IDE4IDE0OCA2NCA0OSAxMjUgMzcgMjggMjggMTAxIDIyIDEwNCA5MSAzMiA4MiAxMTcgMTIgCisxMTQgNjkgNTggMiA1OCAxMTUgOSAxMDggNDcgNTkgNjUgMTQgOTIgNyA0IDg2IDk4IDE2IDgyIDkyIDk1IDM4IDk0IDEwIDEwIDQ4IDk3IAorMTA0IDY2IDExNSA5NyAxNDIgMTE1IDEyMiAxMTkgNDAgOTcgMTYgMzIgNDcgMzQgODggODkgMjYgNTAgMTIgNzYgODAgNTEgNDAgOSAKKzEzMyAyNCA0NCA0MCAxMjIgODQgMTA4IDIyIDE0MiAxNDAgOTkgNDQgMTUgNTQgOCA0MiAxMjUgMTUwIDEzMCAyMSA3OSAxMjQgNjIgNDYgCisxMTkgMTUgMjkgOTEgNTcgMTUwIDQyIDEzOCA3MSA2MSA2OCA4MCAxMTQgNiAxIDcwIDEyMSAxOCAzNSAxMTMgNTYgODcgODYgMTAgNzMgCisxNCAyOSA0MSA3MiA4OSAxIDEzMyA4NyAxMDEgMTIzIDU5IDkwIDE0MiA3NyAxMzMgNTIgNzggNDggMzQgMTM4IDEzNCAyNyAxNyA2MCAKKzEzMSAxNDcgNjEgOTMgMTQ4IDM5IDEzMiA0OSA2MiA3MSAzNiA5MSA0IDEzOSA0OSAxMDAgMTIwIDQzIDExMyAxNDQgMzAgOTQgNzMgCisxMjcgNDAgMzQgNTAgMTAwIDExMCA4OCAxMTQgOTQgMzUgMTM4IDMzIDcyIDYxIDU4IDY1IDI0IDEwNyA2IDU0IDgxIDExNCA1NiAxMzcgCis3MSAxMSAyMyAxOSA3MyAxIDEwOCAxMTAgMjUgMTQ4IDExIDk4IDEzMiAxNTAgMTcgNzAgMTQ2IDUwIF4KKzMxNCAxIDk5IDg4IDcgMTM5IDI0IDEzIDM1IDQ3IDk3IDE0NSA3NCAzNiAxMTkgMyA1MSA4NCA0OCAxMTkgNTMgNDkgMTUgNzkgMTcgCisxMjAgMTAzIDE0OCA2NCAzMCA0MSA5NyAxMjAgNzUgMTExIDYzIDU4IDEzMSAxMzQgMTggMTMgMTAgNDggMTggMTYgNDggNDMgMTUgNTQgCisxOCA0MSA0NyAxMjIgMTQ0IDgwIDkyIDE0NSA3NyAxIDMzIDg5IDU0IDQ2IDc4IDQ4IDIxIDU0IDQzIDQwIDUzIDI0IDE2IDczIDQyIDk0IAorMjkgNDQgMzQgMTUxIDE1MiAyMyAxMjMgMTIgMTQyIDE0MCA0MyAzNyA4OCAyOSAxOSAzNSA3MiA5NiAxNTEgMTMwIDYyIDExMiAzNCAzNiAKKzkxIDEyMCA1MCAxMTIgMTM4IDIgMTA1IDYwIDY4IDEzNyAxMzEgNSAxNyAxOSAxMzkgNzQgMTEgMTIwIDc4IDE0OSA1OCAxMjggMTUgCisxMDQgMTYgMTI2IDc4IDIwIDU3IDEzNCA3MSA0OSA5MCA3NiAxMDggMTI2IDEwMCA1NCA2OCAzOSAxMzIgMTUzIDQyIDE0NyAxNDYgMTI0IAorNjIgODcgMzUgNzUgNjEgNjUgNDYgMTAwIDgyIDEwNSAxMTMgMzEgNjMgNSA5NSA1NCA3MSA3NyAxMjcgMTUwIDgwIDM2IDE0NCAyIDEzMCAKKzU5IDc0IDM5IDMgMTUyIDEyMSAxMjIgMTggMTE3IDEyIDExNyAxNDEgMTE4IDEzNSA2MiAzNiA2OSA1IDM5IDUzIDE1MCA1MiAxNTMgCisxNDMgMzAgNjYgOTYgMTI2IDEzMSA1NiAxMzcgOCA3IDg2IDE0MiAxNCA3IDExMSAxNDEgOTMgMTM2IDEzNyAxMzQgNDMgMTIgODkgMjMgCis0NCA5IDE1MiAxNDYgMTIxIDk3IDE5IDM4IDExMCA5MSA2NyAxNCAzMiAxMTAgNjYgNjggOCAxMzAgODQgNzMgMTE4IDU5IDI0IDQxIDcyIAorMTIxIDE1MCA1NSAzNyAxMzggMjcgMTA0IDY2IDEyNCA5IDUxIDEwOSA0NyAxMjUgMTA5IDE0OCA4IDI5IDQ3IDcyIDE0NiAxNDkgNjEgCis5MyAxMCAyMCA1NCAxNSA3NiAxMzMgMTI1IDEwNiAxMTAgOTQgMzIgOSAyOSAxNDggMzYgNjYgMTIxIDEyNSA1NiAxMTIgOSAxIDExMSAKKzExNiA5NCA1NyA4IDEwOCA1MCA2MiAxNDAgNzEgNzQgODkgMSA4MyAxNTIgMjAgODUgMTcgMTQ1IDEwMiAzOSA1NiAxMTUgNDcgMTUwIAorMTA4IDY0IDk4IF4KKzMzNSAxIDI4IDEwMyAxOSA5MiA5NSAxNTIgMTUyIDEwIDExIDEzIDE1NSA2NyAxMSA4MyAxMDEgNjkgMTUzIDE1MiA0NSAxNDEgMTQgCisxMjAgMTI5IDE0MCAxMTkgNTkgMiA4OSA3MyA3MCA4MyAyOSAxNiA2NyA4MSAyOSAxIDU0IDY1IDk2IDExNyAyIDM3IDQ3IDEyOCAzMyAzIAorODkgMTA4IDk4IDEzOSA0OSA3OCAyNyAxMDMgMzkgMTE5IDk0IDEzMiA5MCAzOCAxMzIgNTUgNjUgMTMxIDkwIDU4IDIgNTQgMTAwIDY5IAorMTE4IDIyIDQ0IDE5IDcgMTQ4IDkzIDI1IDI5IDEyMyA4MSA2NCAxMzEgNTUgMzAgMSA4OSAzOCA5NyA4MiA2NCA5IDI4IDg2IDEyMyAKKzE1MSAxMCAxMzMgNDAgMTU0IDEwMiA0IDExMSA2NSA5IDYzIDU5IDEyNCAxMTYgNzIgMTA1IDc2IDU3IDEzNyA5NyAzMiAxNDUgMTA4IAorNzggMTEyIDUwIDQzIDM0IDc1IDIwIDIyIDEyOSA2OCAxMSAxMTggNzQgMTI1IDExOCA1NyAxNyAyMCAxMjkgNTMgNjUgNjEgMTQ0IDEgCisxNyAxNDIgMTU2IDUyIDEwMCA1NCAxNSAyMCA1OSA1MiA2MyAxMzEgMjAgNTcgMTI0IDMxIDEyNSA0NiAxMDYgNzYgOTIgOCA5OCAxNTQgCisxNTIgODAgMTE0IDE1IDE0MCAxMzYgMTEyIDEwMCAxNyA5MiAyNSAxNTEgMTUwIDgwIDk5IDY5IDgzIDQ5IDQzIDE1NiAxMDIgMTkgNTcgCisxMjIgOTYgMzAgMyAzOSAxMzQgNDAgMzIgNzUgNSA3NiAxMjcgMTM4IDk5IDE3IDU3IDUyIDE1MCAxMzAgMTggMTI3IDMzIDIzIDExNiAKKzEwNyA3OCA3NyA3NyA0MiA2OSA2OCA0OCA0MSA2OSAzMyA3NSA0MCA0OSAxMjggMTAzIDQgMTQ2IDkzIDEwIDgzIDY2IDk2IDE1MiAzMCAKKzM4IDEyIDMzIDUgMzkgNDcgNDEgMzQgNjAgNzQgMjAgNDIgMTU2IDY3IDQ2IDU2IDEwMiA4OSAzIDEyNCA4MSA5OSAxMDQgNTYgNTAgOCAKKzYxIDc0IDU1IDE1IDg3IDEwOCAyOCAxMzggNDcgOTMgNjAgMiAxMjQgNDYgMTI2IDEwMyA5MSAxNDUgMzYgMjUgMTE2IDEyMiA3OSA3OSAKKzcgMTExIDEzIDg1IDEyMSA5IDk4IDMyIDEyNSA4MSAxMzQgNzcgMTEyIDE1IDcwIDMzIDExMCAxMyA1MCAxNDggOCAxMzMgMTI3IDE1MyAKKzQ1IDE5IDQyIDEyMSA5NCA0NSA5MSA5NSAxMTcgMjIgOSA0NiA2IDI2IDMxIDUzIDE1MCA4IDE0OCAxMjggNTMgMTQxIF4KKzMyNiAwIDgwIDEyMyAyNCAxNDcgMSAxMTIgODIgMTU5IDYzIDc0IDk3IDEwOSAzMyAxNTEgMzIgODkgODcgMTMyIDExNyA0NiAxMjkgNTkgCisxMTUgOTEgMTE0IDExOCAzNyAyMSA5IDk0IDYwIDI1IDg5IDQ3IDc5IDExMCA1NSAxMiAxNDMgOTkgODcgNDMgODggNTYgNTcgMTYwIDc2IAorMTIgNzEgMTI4IDc3IDE0NiAxMTcgOTUgMTA1IDQyIDY2IDMgNzYgMjAgNzYgMTAxIDEwMCAxMTggMTQ5IDQ1IDI2IDE0MyAxNDggMzIgCis1NyAzOSAxMjkgMTkgMzEgODQgMTIzIDEgMTUyIDEzNSA1IDU0IDMwIDEzIDEyNSA2OCAzMCA2MiAxMDEgNTEgMTQyIDUgOTQgODMgMjAgCisxMTYgMjQgMTA3IDEwOSAxMDUgOTEgNDIgMTcgMjcgOTMgNjkgMyAxMzkgNjggNzkgMzggODQgMiA4NSAxMjggMTI2IDEyMiAxMzEgNDYgCisxNyAzNSA5OCA0MiAyNiAxMTEgMTAwIDI5IDEyMCA1NSA4NCAxMTQgMTA5IDE0NSAxNCAxOCAxMzggMTQgOSA4NSA3IDE4IDEyOSA5MSAyIAorOTQgNTEgMTMzIDgyIDg3IDEyMyA2NCAzOSA4IDEwMyAzOCA3NSAxMTAgNzggNyA5IDQ1IDExNSA0MiAxMzggMTM1IDg2IDc4IDE2IDYyIAorNTIgNzUgMTU5IDU0IDE1MSAxMjEgMTQ5IDc3IDc0IDE2IDg1IDQ3IDEwMiAxMDUgODIgMTE5IDEwIDY3IDEzNyAxNTMgMTQ4IDEzNSAyOCAKKzQ5IDI2IDE1MSAxNTMgMzYgODAgMTEgMTMwIDExMyAyNCA0NCAzMCAxMDIgMjQgNTggMTMzIDEyMiAxNDAgOTkgMjQgMTU2IDU0IDExOSAKKzQyIDExNSAxNDAgOTAgMTMyIDE5IDk0IDIgMTU3IDk5IDEzNiAxOSA3MSA3IDEzMCAxNTMgMTA4IDUxIDIxIDU4IDcwIDc0IDEzNyAxIAorNDAgMTExIDE0OSA1IDEwMyA2IDI3IDc2IDE0MSAyMyAxMjUgMTQwIDEgNzIgMjkgMTUyIDEwMyA4NyA1MSA5MyAyOSA4MCAxMzIgNzcgCisxMjMgMTUzIDY4IDE1OSAxNCA5OCAxMTQgMTU4IDEyMSAxNTggODEgMTM3IDQxIDkzIDExOCAxNDAgMTIyIDE5IDIyIDMxIDE0NyA0MSA0IAorODkgMTUwIDUwIDEyMCAxNDQgMTEzIDEwNCAyMCA0NCA1MyA5NyAyMCA0IDkwIDYwIDQ4IDg0IDc0IDI1IDEzOCAyMyA2MiA2MSAxNTkgNSAKKzE0IDEwNyA2IDQgODEgMTE0IDQ2IDk3IDExIDExMiAxNTQgMTMwIDczIDEzMiA2MCBeCiszMjUgMCA1OCAxMzcgOTYgMTEgOTggNjcgOTggMTAzIDU3IDE0NiAyMSA1OSA4OCAxNTEgMTM5IDE0OCAxMjcgMjUgMTcgNDcgMTE1IDM0IAorMTYwIDEwOSAxMDcgNTEgNjQgMjggNjkgMTMgNDkgMTQ5IDY5IDE0MSA5MCA5MyAxMTggNjQgMTAgMSA2NyA4MCAzNSAxMTEgMTMgNTggCisxMDEgMTI0IDEzMiAxNDcgMTU0IDE4IDE2MiA2IDE2MiAzMyA1IDM0IDE0MiA0MSAxNjEgODIgMTE0IDcwIDkyIDE0NSA1NyAxNTUgMTM3IAorMTE0IDc5IDQ0IDM2IDQ4IDQ4IDIxIDE0IDEzIDQwIDMzIDE0IDE1MCAzMyAzMiA1NCAxNDMgMTQgNCAxMDEgMTQyIDIzIDkzIDEzNiAKKzEzMiAxMjAgMTQ3IDE3IDM4IDE2MyAxNDMgNSA1MiA0NiAxNTEgMTMwIDMyIDcyIDM0IDEyNCAxNTAgNTEgMTAwIDExMiAxMjggMTI2IAorNjUgMTAgMjggODcgODEgMTU5IDEzMSAxOSA5OSA1NCAxMjUgMTEwIDU4IDExOSAyOCA3OCAxMjkgMTA0IDE0MCAxMjYgMzggMTU0IDI3IAorMTE0IDYxIDE1MyA5MCA2NiA5OCA3NiA1MCAxNTggNDggMzkgODIgMTIzIDIyIDE0NyAxMzYgMTE0IDUyIDM3IDM1IDc1IDQxIDE1IDE1MCAKKzYwIDUyIDU1IDEwMyAyMSAyMyAxMjkgOTUgMjQgNzEgNDcgOTcgMTMwIDUwIDE0MCAxNDQgMTA2IDEwMCA5IDY0IDE5IDExNyAxMjIgNzEgCis5MiA4IDc3IDE1NiA5NyAxMjEgOTggODUgMiAzNiAzOSAxMDkgMTQzIDIzIDEyMCAxNTYgMTMzIDkzIDE1NCAzNiA2NiAxMTYgMTMxIAorMTYwIDEyNyAxNjIgMTYxIDQ2IDE0MiAxNCAxNDEgODEgMTQxIDYzIDg2IDExNyAxMDQgMyAxNDYgMzkgMTI3IDM0IDEzMyAxMDIgMTA2IAorOTEgNTcgOSAyOCA2MCA2MSA3IDE1OCAxMiA4MCAyNiA4IDEyMiA4MCA0NCA2MyA2OCA0OSAxNTggMjEgMzIgODEgMTUwIDE1IDE0MSAKKzEwOCAxNjEgNjQgNDYgMTI0IDEyMyAzMSA5OSAyNyAxMDUgMTA5IDk4IDExMiA5IDM3IDEyIDExNiAxNDkgNTEgNzMgMTQ0IDEyNCA0IAorMTE5IDQ2IDEzMyA3NSA4NiA5MCA4NCAyIDkgMTkgMTA4IDYgMTYgMTAxIDExNSAxNiA5MiAxNjMgMTI1IDEwMSAxMDYgNjQgMzcgOCA2OCAKKzQwIDQyIDEzMCA0MSAyNCA4OSAxMTUgNDMgMTEyIDg1IDEyMSAxMjUgOTIgMTU0IDkgNDYgMTE1IDcgMTQwIDEwOCAxNTggXgorMzM2IDAgMzggNDIgMTU1IDEwMyA5IDYyIDY1IDEwMiAxMjIgMTAgMTM4IDE2MCAxMjUgNDcgMTU4IDQzIDkxIDY5IDEyMyAxMzIgMzUgCisxMjEgNCAxMTAgODkgMTMwIDY5IDI5IDEzOSA2OSA1MyA3MCA4MyAyOSAxNjMgNjcgNDEgOSAxMDggMzQgNDUgNzYgODcgMiAxNDQgMTY0IAorOTggMzMgMTYwIDc5IDc4IDQ4IDg5IDkgMzggMTM0IDkzIDE0NiA3OSA1NCAxMjIgODAgMzggMTEyIDU1IDU1IDEwMSA3MCA4IDEyOSA0NCAKKzcwIDU5IDk4IDE0OSAyNCAxMzYgMTI0IDEzOCA2MyAyNSAxNjYgODMgNTEgMzQgOTEgNDUgMzAgMTE4IDU5IDI4IDg3IDcyIDQ0IDExNiAKKzI4IDM2IDEwMyAxMDEgMTEzIDEwIDExNCA2MiAxMTEgNzEgNjUgMTI2IDUzIDE5IDExNCA4NiA0MiA4NSAzNiA1NyAxMzcgNTcgMTU5IAorOTUgODggNzggNzIgMjAgMjMgMTQgNjUgMTAgMjIgMTI5IDY4IDEgNjggNzQgNzUgMTA4IDcgNyAxNDcgMTA5IDEzIDM1IDUxIDEwNCAKKzE1OCAxNjQgMTIyIDEyNiAyIDUwIDQgMTMyIDEyNyA1OSA1MiAxMyA4MSAyMCA0NyAxMDcgNzQgMTQ4IDExNSA0NiAxMDYgNDYgODIgCisxMTUgNjggMTQ0IDE0MiA2MCAxMDQgMTUgOTAgMTM2IDEwMiAxMDAgMTM0IDQyIDE1IDE0MSAxMDAgNDAgNDkgNDkgNzMgMTY2IDEzIAorMTU2IDgyIDE2NiAzNyA4MiA5NiAxMzcgMTMwIDE2NiAxMzQgMjAgMTM5IDQ1IDEyMiA1NiAxMDcgOTggNzkgMTI0IDE3IDMyIDEzMCAKKzEyMCAxNjUgNzcgMjMgMTMwIDk2IDY3IDY4IDQ3IDM3IDEyIDI5IDE4IDM4IDE1OCAxOSAxNjAgNTUgMTQ3IDM5IDExOCA4MyAxMjEgOTYgCis0MyAxMzcgMzMgNjYgODYgMTEyIDE0NyAxNTUgMTQ5IDE0MCA1IDE5IDE3IDE0OCAxNjEgMTAgNDQgMTU5IDE0NiA1NyAxNiAyNiAxMDIgCis0OSAzIDEwNCA2MSA1OSA3NCA1NiAxMCAxNjUgMzEgNTQgMjUgMTQyIDE1NyAzNyA1OCAxNjUgMTI4IDE1NCA3MyA1MCAxNDkgOTQgMzYgCis3NiA2MyA3MSAxMzUgMjYgNSAxMTYgMTIyIDI5IDY5IDcgMTAxIDE0MCA3NSA4MSAxMzYgNzggMiAxMjUgNzEgODQgNTcgNjIgMTYyIDQwIAorMyA4MCAxMzAgNTAgOTggMTI1IDkzIDEyNyAxNTMgNDUgMTQ2IDE0OSAxMjEgNzQgNSA0MSA1NSA3NyAxMzkgMTY2IDE1MyAxMTMgMTUzIAorMjEgNTMgMTQwIDE0NSAxNDggODggMTYyIF4KKzM0MSAwIDQgNjIgNzggMTY3IDEwMiAxNDQgOTQgNTUgMTQxIDYzIDI5IDk3IDkxIDI0IDExNSAxNjYgODAgNjkgMTMyIDk5IDEgMTIwIAorMjMgODggNjQgODcgMTE4IDM3IDEzNyAxNTIgOTQgNjAgMTY4IDcxIDQ3IDUyIDExMCAzNyAxNTUgMTI1IDYzIDQyIDQzIDUyIDExIDEyIAorMTUxIDMxIDEyIDQ0IDExMCAzMiAxMjggMTE3IDY4IDg3IDI0IDM5IDE2NCA3NiAxNDUgNTggMTAxIDkxIDEwMCAxNDAgMTUxIDE0MyAKKzEzMCAzMiAyMSAzIDExMSAxIDMxIDc1IDEyMyAxNTMgMTE2IDEzNSAxMzAgMjcgMTY0IDE2NSAxMTYgMjMgMTIgNjIgODMgMjQgMTMzIAorMTM5IDQ5IDc0IDE1NCA4MCAxNTggODAgNjQgMTA1IDkxIDYgMTQyIDI3IDc1IDI0IDEyOCAxMTIgNDEgNzkgMjkgODQgMTQ1IDQwIDEyOCAKKzk5IDk1IDk1IDE5IDE3IDE2MCA4OSAxNSAxNyA4NCA2NCAxMSA5MyAxMCA2NiA3OCA3MyAxMjcgMTQ4IDE4IDEyOSAxMzkgMTQzIDQ5IAorMTUwIDkgODQgODIgMTU0IDg1IDE1IDg4IDgyIDYwIDg3IDE5IDEyIDEzMyA1OCAyMCAzOSA2NSA1MSAxNDEgMTM0IDI3IDcwIDE2NyAKKzEyMCAxMTcgODYgNjAgMTYgNDQgMTYgNTcgMTMyIDE4IDE0MiA4NSAxMDQgNTkgNDcgMTQxIDU4IDIgNjYgOTYgNDYgMTE5IDE1MyA0MCAKKzExMCAxMjYgMTAzIDkwIDE0NCAxMyAyNiAxMDYgMTQ0IDgwIDE0NSAxMzQgMTAzIDk1IDI0IDQ0IDIxIDg0IDE0MCAxMyA5NyAxMDQgCisxNDAgOTkgNiAxNDcgNTQgODMgNDIgMTA2IDEzMSA1NCA5NiAxMzUgNjcgMTE4IDEyMSA4MSAxMDkgMTAgNTMgMTMyIDExMiAxMTcgODEgCiszMyAxNTUgNDkgNjEgMzggMTE5IDEgMTMgMTAyIDEzMSAxNDggOTQgMTMxIDE0MyA2NyAxMjMgMTQ4IDg5IDEwNCAxMzUgNzIgMTQ1IAorMTUyIDc2IDg3IDYgNjYgMiA3MSAxMjMgNzcgMTE0IDEwOCA1OSAxMjMgMTY2IDYyIDk2IDE0MCA5NCAxNDkgMTE2IDM2IDEyOCAyMyA5MyAKKzkxIDk1IDExMyAxNjIgMTU2IDE2NSAxMTEgMTY2IDQgNDQgMTA1IDUgMTIwIDk5IDExMyA2OCAxMSAxNjkgMzUgNzAgMiAxNDcgMTI1IAorODEgMTUgMTIgNTcgNTYgMTYgMTM4IDE0IDUzIDYxIDExNCAxMjEgNSAxMDcgNiAxMjkgODEgMTE0IDM3IDYxIDEyNyA2NyAxMzYgOTQgCis3MyAxMTQgMzIgMzQgMTE5IDcyIDExIDk4IDM3IDc0IDczIDUxIDE0NiAxNjEgMzUgMTQ2IF4KKzM0OSAwIDE0MiAxMzkgMTIxIDkxIDE2IDE2MyAyIDg4IDE3MSAxMzMgMTAwIDYyIDUxIDQ2IDEwIDI0IDE1MCA0OSAxMzEgNjAgMTE0IAorNjMgODQgOTEgNjQgMTY1IDEzOCA0MCA0NCAxNzIgMTExIDE0MSA1OCA3NCAxMTUgOTYgMTI5IDE0NSAxNjQgMTUzIDE3MCAxMjYgMjQgCisxNjkgMTYgMTE1IDQxIDEyNSA0NiA4NyA2MSA5MiAxNDUgMzkgMTU1IDkyIDc4IDcwIDM1IDI3IDIxIDQ4IDIxIDE1MSAxNTkgNDAgMTUgCis1IDEzMiAxNzAgMjMgMTggMTA3IDE2MCAxNTAgNTYgMTMzIDIzIDY2IDEwOSAxMjMgMTAyIDEwMiAxNzIgMTY2IDE0NSAxMTYgMTUxIDM0IAorMSAxNTEgMTMwIDUgMzYgMzQgOTcgMTE0IDE1IDgyIDEyOCAxMTIgMTE5IDk5IDI5IDEzOCAxNjUgNDIgMzYgMTU5IDk1IDE5IDYzIDM2IAorODkgMTAxIDQwIDkyIDEgMzMgOTMgMTA0IDExMyAxMjYgMiAxMzYgOTYgNTIgMTA4IDkwIDU3IDg5IDMxIDUgMTEzIDMwIDM5IDM3IDk2IAorNCAxNDcgMTI3IDEwNSA0MyAxNjUgMzUgNzUgMjMgMTQzIDEwNSAyNCAyNSAxMCA5NCAxMiAxNjAgMTAyIDk1IDE3MCA3MSAyMCA3MCAKKzExMiAyMyA5NSAxNDQgNjEgNzMgMTM3IDU1IDEgODEgOTUgMjYgNjUgMTcyIDQxIDE0NyA3OSAxMDMgODAgNDAgMTIxIDM2IDEyIDY0IAorOTggMTY5IDkzIDExMSAxMTUgNDggMTI3IDkgMzkgMTA3IDEzMSAxMTUgMTE4IDE2MiAxNjEgMTAgMTQyIDE0IDEyMyA1NCAxNDEgMzYgCis0MSA5OSA3NyAxNDAgMTI4IDE2NyA4MiAyNSAxMDYgNTcgNzAgNjQgMjEgMTkgMTUgMzQgMTI2IDE0OSAxNjcgNTMgMTYzIDEyNyA4NiAKKzM1IDggNTQgMjMgNDAgMTQwIDMgMTY5IDQ1IDE1MCAxNTIgOTYgODEgMTQzIDI4IDI4IDEyNCA4NyAxMyA5MCA5IDg3IDEwOSA1MyA2NyAKKzE2NCAyOCAxMzEgODkgMTQ5IDQyIDU1IDEyNiA3OSAxMzIgNzQgMTkgMTMzIDMwIDY4IDcyIDc1IDE0OCA5IDEwIDcyIDE1MiAxNDQgODMgCisxMDYgMTUzIDc0IDE2MyA5OCA5MiA5NyAzNyAxOSA4IDMyIDMxIDI0IDEyMSAxNCAxNTIgODkgNzkgNyA3NiAxNTUgODUgNzYgMTA3IDgzIAorMTU0IDE1NSAzNyAxMTUgMTQ0IDEzMSAxMDggMTE2IDI2IDM2IDEzNyAxMDMgMyA0NCA0NyA3MiAxMDQgMTAgMTIwIDE1NCAxMDcgMzUgCisxNTIgMTkgODUgNjkgMTA1IDEyMCAyOSAxMDkgMTcxIDEwNCA2NSAxMjQgMzkgMTEgMTI3IDU3IDQxIDcwIDgzIDI5IDE1NyA2NyAxNjQgXgorMzcwIDEgMTY3IDYzIDE2IDI3IDU4IDYwIDIgOTkgMTI4IDcxIDMzIDE2MCA3MCA1MSAzIDQ0IDE0OSAyIDg5IDg0IDEwMSA0MyAxOCAKKzExMyA3MSAzOCA5NCA1NSA0NiA3NCA1MiAxMzkgMTAyIDM1IDQzIDUwIDgwIDEyMiA2IDEwMCA4OCAxMjkgMzYgMjUgMTQ4IDQ3IDI0IDcgCis1NSAzNiAzMCA4MiAzMiAxOSA3OCA2MyAyNiA3MSAyOCAxNjcgODUgNTYgMTY3IDk1IDE1OSA3OCAyNiA2NiAzNSA2NSA5MCA0NCAxNTkgCisxMDUgNTkgMTUgNjcgNTcgMTM3IDIxIDEzMiA1MCA3MCA3OCAzNiAxNjkgNSAxNzIgNTYgMSAyMiAxMjkgNjggMTY4IDIzIDc0IDMwIDk5IAorMTM4IDE3NCAxMjAgOTEgMTUzIDggNDIgNjggMTU4IDE1NSAxMDQgOTkgMTMzIDUgMTM1IDk2IDgyIDU5IDUyIDE0NCAzNiAyMCAzOCA2MiAKKzI5IDExMiAxMDYgNDYgMTA2IDE5IDczIDcwIDQxIDEzNSAxMzMgNDIgOTUgMTUgNDUgMTM2IDkzIDEwMCA5OCAxNzMgNiAxMzIgNTUgNCAKKzQgMzEgNjQgMTMwIDE2MiAxNTYgNjQgMTU3IDE5IDQ2IDk2IDkyIDEwMyAxMzkgMTM0IDIgOTQgMTggODYgMzggODkgNjIgNjEgNzkgCisxNTcgMTQgMTEyIDExMSAxNTYgMzIgMTQgODUgNzggMzEgNTkgMjAgMSAxNjEgMTY5IDE0OSAyOSAxMjIgMTUwIDEzMyAzNyAxMDIgMzAgCisxMDkgNjUgODUgNTEgMTc0IDExMCAxNjQgNjYgNzcgNzYgMTExIDExOSAxMzEgOTUgNSAxIDE2NiAxMDMgMTM0IDE0MSAxNyAxNTggMTIzIAorMTM3IDQ4IDE2NSAxNzUgMTAyIDEzIDMgODYgNDMgMjMgNDcgNTYgMTUwIDE2NSA0IDM2IDE3NCAxMTUgMTU3IDE2OCAxMyAxNDcgMTE5IAorMTA5IDU1IDQxIDE0MCA2NyAyNyAzMSAyNyA1MyAxMjYgMTcgMTYzIDExNiAxMjIgMTYwIDYwIDcgOTIgMTEzIDY2IDQ1IDEwOSA2MCAKKzE1MSAxMjUgNjIgMzkgMzkgMTcgMTUzIDEzIDE1MiA1MyA5NCA1MCA1MyA4OSA1NyAxMjcgMTUzIDQ1IDExOSAxMDQgMTIxIDU2IDE0NSAKKzE3MiAxOSA0MSAxMDMgMTY2IDEwOCA2OCAxMjYgMTIgNTMgMTMxIDEyNyAxNDggNTIgMTM0IDE2OCA1MCA0OCAxNTUgNzIgMTMyIDgyIAorMzcgMTI5IDYzIDE3NSA5NyA3OSAxOCA5MSAxNDggNzQgNTcgMTMyIDg3IDE0NyAxMTQgMTc1IDcwIDQ2IDY5IDExOCAzNyAxMDcgMTQwIAorOTQgNjAgMTU2IDU5IDQ3IDM0IDExMCAyNSAxNDMgMTEzIDM5IDEyIDQzIDI4IDE1NyAxNTggMTQ1IDEgMTIgMjYgOTggMiAxMTYgMTE3IAorNTAgNzUgMTIgMjEgMTY0IDc2IDEyMSA0NiAxMDEgODUgODggMTM0IDE0NiAxMjcgMTQzIDc5IF4KKzM2NCAwIDMyIDE2NCAxNDYgOTMgMTYyIDMxIDY2IDEyMyAxNDQgODAgMTM1IDk0IDEzNyAxNTYgMTA3IDE1NyAxNzMgNjIgNjUgMTc2IAorMTI0IDExMiA0IDY1IDEyNyA0NCAxMzEgNTMgMTkgMTA1IDkxIDE0OSAxMDYgMjcgNTcgMTU4IDkyIDg1IDE0IDc5IDIwIDg0IDEyNyAKKzE3NCAxMjggNzIgNjggNTkgMTcxIDE3IDEyNCA4MCAxNjcgOCA1NyAyOCAxNzIgNjYgMTQ0IDQ4IDQyIDM3IDEwOSAxMjEgMTggMTIwIAorMTAzIDExNiAxMyAxMzIgMzkgNzMgMTQ1IDc2IDE1OCA0MyA4MiAzMyA1MSAxNTMgMTY0IDk3IDEzIDIgMyAyMCAyNCAxMTQgOTggOSAyNSAKKzEzMSAxMDIgOTkgODYgNDIgMTYgMjYgMTU5IDM5IDEwNSAxNjEgMTMzIDQ5IDU5IDQxIDIwIDEwNSAzMSAxMzYgMzAgODcgMTAgMTE5IAorMTM1IDEzIDgzIDk5IDU4IDQ1IDk5IDE1NiAyNiA2MSAxMzUgMTQzIDgwIDExOCAxMDcgNzYgNzcgMjQgNDQgMTIgNjYgOTUgMTQ3IDYxIAorODYgMTQwIDk5IDE2NyAxMzggNTQgNDcgNDIgOTcgMTIyIDE4IDYwIDkwIDQwIDczIDg1IDYzIDgyIDEgMzUgOTYgOTQgODEgNTQgMTUgCisxMjggNDAgNTIgMiAxMDEgMSAxNjUgOTMgMTEzIDEzMCA4NSA5NSA5OCA1OCAxMDUgMTEyIDUzIDY4IDEwOCA3MiAxMDAgMTUyIDQ5IDg3IAorMTQwIDM5IDE1NCA2MiAxMTQgNzcgMTA1IDYzIDUwIDg3IDE1NyAyNiA3OCAxMjIgNjcgMTQwIDcxIDE3MCAxMTkgNSA5MyA2NCA1MCAKKzEwNCAxNDQgMTI5IDEzOCA3NSAxMzAgNCAxNzggNjAgMTM5IDEyMCA1NCAxMTMgMzIgMiAxMzMgMTcgNDMgMTYzIDEyOSA4OSA3MiAxNDkgCisxNTUgMzAgMzggNyAxMzggNSA0NCA2MSA2OSA3NiAxNzUgMTA3IDYgOTMgODEgMTE0IDI4IDI1IDgyIDIyIDExOCA1OCA3MyA5NiAxNzUgCisxNzcgOTIgMzYgMTEgOTggMTcxIDM4IDI4IDQyIDE0NiAxMjUgMTc4IDg4IDEzNiAxMzkgMTAzIDY3IDEwIDE1MSAxNTEgNzAgMTUzIAorMTE1IDk0IDMyIDUxIDM0IDE3NyAxNzMgMTMyIDQ5IDExOSA1NCA5NiA0NSA3OCA3MyA2NCAxNTkgMTIwIDIyIDIwIDE1NCAxMTEgMTE3IAorNTggNTYgMTA5IDcyIDExNyAxMzkgMTUyIDE0NyAxNzAgMTAyIDE4IDE2OSA0IDk3IDQxIDEwMSAyMiA2OSA1NSA5MiAxNDUgMjcgMTU1IAorNjIgNTQgNjQgMjkgMjEgMyA0OCAyMSAxMzMgMTQ3IDQwIDMgMTc4IDEyMCAxNTIgMTcgMTczIDgzIDE0OCAxMzggMjYgMTI3IDIzIDQ4IAorOTEgMTE3IDkwIDcyIDE2NiAxNDIgMTMzIDk4IDEzOSAyMiAxNTAgMTUxIDEzMCAxNDAgXgorMzcyIDAgMzQgNzAgNzggMTYxIDY0IDkyIDExMiAxMTAgNzIgMTc1IDEwMiAxMzggMTc5IDE3MyAxNTkgNTkgMTkgMjcgMTggNTMgOTIgCisyMiA2NSAxNTYgMTcwIDU3IDEwNCA4NiAxMjYgMTQ4IDExOCAxNTUgNzggNDMgNjMgOTAgNDggODAgMTY4IDE0MiA2OCAxMiAzOSAxNzQgCis2OSAxNjggMTQ3IDExOCA5NiAzNCAxMjkgMzUgNzUgNSAxMDcgNjAgMTcwIDE4MCAxNDcgODUgMyAxMzMgNzUgOTUgMTUyIDcxIDE3NSAKKzQzIDk0IDE3OCA1MCAxNDQgMTYgNDYgMTAxIDQ2IDE2NSA0NSA2OCAxNjMgMzggMTcyIDUgMTM4IDYxIDg1IDYyIDE3NyA3NiAzNiAxNjcgCisxOSA1MyAxNTEgNjYgNjYgOTcgMyAxMDAgMTY0IDEyIDk4IDEzMSA3MCAxMDkgMTYyIDE2MSAxNTYgMTQyIDE0IDEwNSAyNyAxNDEgOSAKKzE3OCA4MSA1MCAxMTMgMTEwIDEzMSAzNyAxNiA3OSAxMiAzNCAzNyAxNjcgMTczIDEwIDE1MiA3IDgxIDE0MCAxNTggMjYgMTM2IDgyIAorNTAgMTcyIDE1NCA0NSAxNjAgMzEgMTIyIDE2NyAxNDIgOSAxNTAgMTI1IDUxIDU0IDEyNSAxNzQgMTAgMTI0IDUxIDE3NyA4MSAxNzMgCis2OSAxMDkgOCAyMiAxNTUgMTkgODYgNjIgMTQ5IDMzIDM3IDEwOCAzNCA5NiAyOSAxNzQgMTMzIDE2NyA1MCA1NCA2NiAxMzAgOSAxIDM2IAorMTM0IDEwOCA2NSA5NyAxMjYgNTYgMTYzIDcxIDgzIDg4IDEwIDEgOCAxNzggMjIgNiAxMTIgMTY5IDExNiA4OSA0MyAxNTMgNDAgMTQ2IAorODUgMzEgODkgNzQgMTU0IDEzNyAyOCAxMTUgMTE3IDEyMiAxMDggOTggOCAyNyAxMTAgMTAzIDE3NiAxNyAyMCAyNyA3NyAxMCA5MyAKKzE0NSA4MCAxNyAxNDMgMTY1IDc2IDY5IDc4IDEwMiAyMCA5MSAxNzEgOTUgMjkgMTE1IDE3NiAxNjYgMTA5IDM5IDIzIDcwIDgzIDI5IAorMTQ4IDY3IDE2MyAxNjEgMzMgNCAxNSA0NiA0MiAyIDY5IDEwNCA1MyAzMyAxNjAgNjQgMzMgMTU1IDE0IDEzMSAxNjAgNTkgNzggNzEgCisxOSAxNzYgMTA3IDY1IDM4IDgyIDU1IDQwIDU2IDQwIDExNSA4NCAyOSAyNSA0NCA2OCAxMDQgMTc2IDc2IDY0IDEyMyAxOCAyNSAxMzYgCisyMyA2IDE3MSAzMSAzMCAzMCA1OCAxNCAxMyA3MiA1NyAxNCA0MSAyOCAxNDMgNzMgMjYgMTY3IDgzIDE0NyA1NCAyIDM2IDExIDY1IDY2IAorMzggMTQxIDk5IDQxIDE3OSA1NSAxNTggNTcgMTM3IDE3OSAxMTQgMjAgNTggNzggMTIgMTU3IDE3NSAxNjYgNTAgMTc3IDIyIDEyOSA2OCAKKzE2OCAxNzUgNzQgOTMgMTE0IDE3NCAxMDIgNzkgMTM1IDE3MiAzNiA0NCAxNTggMTQ5IDkyIDgxIDEwOSAxNTcgMTExIDcyIDExOSBeCiszNzIgMCA1OSA1MiAxMTIgMTgwIDIwIDMwIDIyIDE3MyA4MCA5OCA0NiAxMDYgMTc5IDY1IDMwIDE3IDEyNyAxMjUgMjYgODcgMTUgNSAKKzEzNiA4NSAxMDAgNjYgMTQxIDE4MiAxMjQgMTUgMTU2IDE0OCAxNSA1NiA5OCAxNDYgMTU2IDQ4IDE0OSAzIDE0IDk2IDUyIDc5IDExNSAKKzEzNCAxNzAgNTQgMTc4IDU0IDIyIDczIDMwIDQ1IDM5IDEzMyAxODIgOTYgMTAzIDE0OCAxNzYgNiA0NSA2MiAxODMgNTEgMTgwIDE1MyAKKzE0NSAxNDUgMTE3IDIxIDkwIDExOCAxMDkgMjEgNjIgMjIgMTAxIDQ5IDUzIDExIDE0MiA4NiAxMzIgNjYgNjkgNDQgNzkgODcgMTE1IAorNTUgNSAxNjkgMTUwIDYzIDExMCAxMDkgMTc3IDE1MCA5MSAxMjkgNDAgMTQ5IDE1OSAxMDIgMTY1IDMgNzAgMjcgMTc1IDIzIDU2IDEyNiAKKzE2NSAxNjQgMjAgMTU4IDkxIDE1NyAxMzYgMTU3IDEzMSAxMTEgNjkgMzkgMzMgMTMyIDQzIDE5IDE3NSAxNzkgMzcgMTE4IDkgMTU1IAorMTE2IDEyMiAxMjggNTIgNyA4NCA4OSA1OCAxMyA4NSA0NCAxMzUgMTI1IDU0IDE4MyAyMyAxNjEgMTQ1IDE3MyAxMzYgMjkgNjIgNTAgCisxMyA1NyAyNSAxMjcgMTUzIDQ1IDk1IDY0IDEyMSA0MCAxMjEgMTQwIDE3MSA5IDcxIDE2NiA2OCAyOCAxMDIgNCA1MyAxMjMgMTExIAorMTQ4IDIwIDEwMiAxNjAgMzQgOCAxMzkgMzIgMTE2IDY2IDEzIDExMyA2MyAxNDMgOTcgNjMgMTAgNTkgMTI0IDY2IDQxIDEzMiA3MSAKKzExNSAxMDYgMTUxIDQ2IDIyIDQ1IDExOCAzNyA2NyAxMjQgOTQgNjAgMTQwIDQzIDQ3IDEwIDExMCA5IDEyNyA5NyA3IDE1NiA0MyAxODAgCisxMjUgMTI2IDEzNyAxNDUgMTIgMiA4MiAxNDYgMTAwIDExNyAyNiA1OSAxODAgMTgxIDE2NCA3NiA4OSAzMCAxMDEgNzcgNzIgMTI2IAorMTE0IDk1IDE0MyAxMDIgMzIgMTQ5IDEzMSA4MyAxNTcgMzEgNjEgMTIzIDEzOSA2MCAxMzUgNzQgMTY5IDEyMiAxNTEgMTAyIDEzNyAKKzE2OCA2MiA1NSAxNjYgMTE5IDk3IDE2MyA2MCAxMTIgMjQgMTE2IDM4IDE3OCAxMDUgOTEgMTM0IDg2IDI3IDQ3IDEzOCA3MiA3MCAxODMgCis3OSAxNSA4NCAxMTcgMTU0IDEyOCA1NyA1MyAzOSAxNjEgMTcgMTA0IDc1IDE1NyAzIDQyIDggMTY3IDUxIDEyNCAzOCAyMiAxNyA5OSAKKzEwNiAxOCAxMTUgODMgMTAxIDE3NyAxMjIgMTc5IDE0IDY4IDE0MCA3MSAxNDMgMTggODIgMTggMzEgMTMzIDE1NCA3NyAxNzIgMTc2IAorMTY3IDE3OSA5IDk5IDc4IDE4MyAxMTEgOTIgODkgODYgMzIgMTYgMTYgMTQ0IDI5IDkwIDE0NiAxMjggMjkgMzQgMzEgNSA4NSAxNiAKKzExNiAxMCA4MiAxNzQgMTE5IDEyNSA3OSBeCiszOTEgMCA1OSA3NSAxOCA1IDU5IDEzMiAyNiAyMSAxMjcgMTE5IDgwIDk0IDgzIDUyIDYxIDI0IDQ0IDQgNTAgNTUgMTE1IDI5IDcwIAorMTQwIDk5IDE1OSAxMzAgNTQgMTUgNDIgODkgMTE0IDE3MyAyOCA1MCAxNiAzMyA1MyA0NyA1OCAxODAgMTkgNjQgNzggNDkgMzAgMTg2IAorMTA0IDMyIDQ0IDE1NyA4NSAxIDE0OSA4NSA5NyAxMTQgNzcgNjMgNTggNTAgODkgODAgMjEgMzYgODQgNzIgNjAgMTUyIDI1IDg3IDEwOCAKKzE1IDEzOCA1NCAxMDYgNzcgOTcgMjMgNDIgNTUgMTQ5IDE4MSA2MiAxMDYgNDMgMTMyIDMxIDEzOCAxMTEgMTc2IDkzIDQwIDEwIDk2IAorMTI4IDEwNSAxMTQgNDMgOTggNCAxNDYgMjAgMTA3IDEyMCAxNCAxMTMgMTgxIDEwMSAxIDE5IDE1NSAxMTMgNTcgNjQgMTE3IDEzMSA2IAorMjIgMTg2IDEzOCAxODQgMzYgNjEgMjkgMzYgMTc1IDEwNyA2IDYxIDgxIDExNCAyMCAxODAgNDIgMTY5IDEwMiAyNiA3MyA4MCAxNTEgCisxNTMgNjggNCAxMSA5OCAxMzkgNiAxNzUgMzQgMTQ2IDkzIDE1NCA4OCAxMjggMTM5IDc5IDM1IDIgMTM1IDExOSA0NiAxMjkgOTEgODYgCisxNzkgNTEgMTggMTY5IDE0MSAxMDggNDkgMTAzIDQ2IDcyIDIxIDcwIDQ5IDY0IDE1MSA5NiAxODUgMTc1IDEzMCAxMTEgODUgNTggMzIgCisxMDEgNDAgMTAxIDEzMSAxMzYgMTM5IDE3MCA3MCAxMCAxNjkgMTc1IDczIDQxIDY5IDE3NyA0NSA0NyA5MiAxNDUgMTEgMTU1IDIyIDIyIAorNTYgMjEgMTMgMTY2IDQ4IDIxIDEwOSAxMzEgNDAgMTc0IDE3OCAxMDQgMTI4IDkgMTQ5IDUxIDEzMiAxMjIgMTczIDExOSAyMyAyNCA2NyAKKzEwOSA3NCAzMiAxNTggMTEwIDExNyA3NCAxMjMgNiAxMTggMTUxIDEzMCAxNTAgMTY3IDM0IDU1IDU4IDE0NiA1NCA3MiAxMTIgMTA1IAorNTcgMTYwIDgyIDEyMyAxNTkgMTUzIDE1OSAzOSAxOSA3IDggMzMgODcgMTIgNTAgMTQ2IDE1MCAzNyAxMDQgNzEgMTI2IDEzMyAxMDggCisxNDUgNjggMzggMzggOTAgNDMgNzUgMTQ4IDEyMiA0MyAyIDM5IDE1NCA1NCAxNjMgMTQ3IDExMyA5MSAyOSAxMDkgMzUgNzUgMTgyIDg3IAorMzUgMTU1IDE3MCAxMjcgODAgMTg1IDExOCA2MCA5NSAxNDIgNzEgMTY1IDI4IDg0IDE2OCAyNSAxNDQgMTc4IDMxIDgxIDQxIDE2MCAyNSAKKzUzIDE0MyAyMyAxNzIgMTcyIDEzMyA1MSA3NSA1MiAxNTcgNTEgMzYgMTU3IDE4MSAyOCAxNDEgNTEgNDEgODcgMTY1IDg1IDE1NCAxODQgCis5MyAxMzEgNDUgMTA0IDE2MiAxNjEgMTQxIDE0MiAxNCA5NSAxMiAxNDEgMTgxIDE1OCA3MSAzNSA5OCAxMDAgMTExIDEyIDExIDY0IAorMTc0IDE0IDIyIDE1MiAxNzMgNSAxMzIgMTc5IDU2IDEzNSAxNTMgMTEgMTIxIDU3IDMwIDE1MiAxMzkgNDAgMTQwIDUzIF4KKzM4NCAxIDEwNiAxNTkgMTE4IDE2NyAxNTAgMTAxIDExIDMwIDEwOSAxNTAgMTg0IDEyNCAxOSAxNjkgNzMgMTY1IDUzIDEwOSAxNTggCisxNzIgMTQ3IDExIDQ2IDM4IDE0OSAyNSAyMSA5MiAxODQgNjQgMTc5IDE1OCAxMzMgMTM1IDM0IDM4IDU4IDExNCA5IDE4MyA0IDExOCAKKzc2IDQ5IDg5IDEwMiA0MCAxNjMgNDcgNzUgODAgMTc2IDE3NSA4IDE1NCAxNCAxODAgMTA0IDE1MyA4NCA4OSAxMSAxMjkgOCAxMzggODUgCisxODEgNzMgNjYgMTU0IDEyMSAyMCAxMTUgOTMgMTE0IDEwOCA4MiAxODIgMTkgODYgMTAzIDE3NiAxODMgMTg2IDE3NyA1MyAxMCA2OSAKKzEzNyA1NiAxIDEzNSAxNDEgNjggNjkgNTQgODYgMTIgNzUgMTcxIDg3IDE4NyAxMDcgMTQ0IDE1MCA5MyAyMyA3IDcwIDgzIDI5IDE0MCAKKzY3IDEzOSAxNTMgMTgzIDE3OCAxODkgMzAgMTggMiAyOSA3MiAyOSAzMyAxNjAgNTYgOSAxMjMgMTY0IDEwNyAxMzYgMTkgNzAgMzEgCisxNzcgMTUyIDk5IDU3IDM4IDY2IDU1IDMyIDMyIDI0IDgzIDYwIDIxIDEgMzYgNTIgODAgMTY4IDQ0IDMyIDExNSAxODQgMjUgMTIwIAorMTgxIDE3MiAxNTUgMTg5IDIyIDMwIDI2IDE4MCA1IDY0IDQ5IDE4OCAxIDI4IDExMSA1NyAxNzYgMTY3IDY3IDEzMSAyMiAxNjAgMTg2IAorMTY5IDY1IDM0IDMwIDExNyA5MSAxNyAxNjMgMzkgMTM0IDU3IDEzNyAxNTUgOTAgMTcwIDQyIDc4IDE3MCAxNDEgMTY3IDE1OCA0MiAKKzE3NyAyMiAxMjkgNjggMTY4IDE0MyA3NCAxNTAgODUgODIgMTc0IDc4IDYzIDExMSAxNTYgMjggMTIgMTU4IDE0MSA3NiA1NyA3NyAxMjUgCis3OSA0MCAxMiA1OSA1MiA4OCAxNTYgMjAgMjQgMTgyIDE0OSA1NiA5MiA0NiAxMDYgMTY3IDU5IDE4OSAxMjEgMTE5IDE0IDgxIDE1IAorMTY1IDEzNiA3OSAxMDAgNDIgMTE3IDE4MiAxMTggMTc1IDEzOCAxMjQgMyA1MCA3NCAxMzQgMTU2IDM2IDE0MyAxODEgMTgwIDk2IDIyIAorNjEgOTcgMTM0IDE2NCAyNCAxNjYgMzAgMTAgNjEgNiAzMyA5IDExNSAxNzYgODQgOTcgMTQyIDE1MiAxNSA1MCAxNjUgNDUgMTY4IDEzNSAKKzEzMyAxMjcgOTMgMTUgNjYgOTQgOTEgOSAzMiAxNiA5NSAzNyAyOSAxNzEgMTE4IDY4IDEwOCA2NiA2MyAyMCA1NSA2MyAxMDMgMjUgNSAKKzE2MyAxMzggMzMgOTIgODUgMTY1IDE0NCA2NyAxMjMgMzQgMTM3IDE0NyAxMDIgMTQ3IDMgNTggMTUgMTU3IDUgNTYgMTA4IDE2NSAxNTIgCis4IDE0NiA3MyAxNTcgMTEyIDEzMyAxMTkgMTA1IDM5IDI3IDI3IDEyNiAyNSAxMyAxNTEgMTYxIDI1IDExMiAzIDE0OSAxMTYgMTIyIAorMTA0IDQ2IDcgNzggNzEgNTIgMTc5IDY3IDMyIDEyMyAxMjUgNDggMTU5IDExIDEzNyAxMzkgMTYxIDExMCBeCiszOTQgMCAyIDI2IDUwIDE2MSAyMSAxODIgMTI3IDE1MyA0NSA2OCAxOSAxMjEgMjIgOTQgMTA0IDE0NCAxNjYgMzUgMTY2IDIzIDE3NiAKKzc1IDE4OCA1MyAxMTQgOTMgMTQ4IDE3NyA2NiAxNTEgMTYgMTU2IDEyMSAxODAgOTggNDggMTc5IDk1IDYzIDEwNyA5NyA0NSAxIDIzIAorOTcgNTcgMjMgMTMyIDUzIDc5IDk3IDEyNCAxOSAxODggMTggMTE4IDM3IDIyIDEwNiA5NCA2MCAxMjIgMjUgNDcgMTc2IDExMCAxODQgCisxMDkgNzkgMTY0IDEyMCA0MyAxNTMgODkgOTAgMTI4IDEwOSAxMiAxNjggNjQgMTEwIDgyIDExNyAxOTIgNDEgMTcxIDE2MyAxNjQgNzYgCis1MyAxMiAxMDEgNjggNTQgMTE3IDc4IDU5IDE0MyA4NCAzMiAxMjIgMTA0IDY1IDE0OCAzMSA1MiAxMjMgMTMwIDI0IDEzNSAzOCAxNTEgCis5NSAxNDIgOTMgMTAxIDE1OSA2MiAzNyAxNDggMTEwIDcwIDEyNyA1MSA4NSAxODEgODkgMTEgMTQyIDEwNSA5MSAxMDcgNTAgMjcgMjkgCisxMDIgMzYgNDMgMTY1IDc5IDYgODQgOTkgMTE4IDEyOCAzMCAyNiAzIDE0MyAxNyA2OCA2NiAxMzkgMTg3IDE1IDE2NSAxNTggMjQgODggCisyMCAxNzkgMTc0IDgxIDc5IDE4IDEwNiA0NyA3NCAxNTAgMTA0IDE3OSAxNjIgNTkgMTMxIDYyIDExNiAxNjYgODIgMTg0IDE4OCA5NyAKKzEzNiA0MSAxMzYgMTY3IDE0MCAxNDMgMTc1IDcyIDQyIDE3NCAxNDggNzUgNzQgNzEgODYgMTQgMTYgMTkxIDExNyAxMSA2MyAxMTkgCisxMTkgMTg2IDE4MiAxMyAxNzEgNDkgMTgyIDgwIDE2NyA3MyAxNDcgMTE5IDEwNyAxNjQgNDEgNTcgMTgxIDE2OCAyOSAxMTQgMjYgMTg0IAorMTIxIDEwMSA4MCA3NiA2NSAzNCA0OSAyNCA0NCAxOTEgMzggMjUgOTEgNSA1OCAxNDAgOTkgMTUzIDEyNCA1NCAxODQgNDIgODMgMTA4IAorMTU1IDQgMjAgMTkxIDMgMjkgMzUgNDAgMTgwIDcgNDAgNjYgMjUgMTIgMTgwIDg2IDI2IDM4IDEzOSA3MyAxIDEzNyA3OSA4NSAxMDIgCis3MSAzOSAyOCA0NCA3NyA1NiAxOTAgMTIgNjYgNzIgMzAgMTUyIDcgODcgODQgMTkwIDEyNiA0OCAxMDAgNzcgOTEgMTg2IDM2IDMxIAorMTQzIDE2MyA1MCA5NCAyNSAxMjYgMSAxMTQgMTA1IDE3MCA5MyAyMiAxNzMgOTAgMTE2IDg3IDk2IDE5IDc0IDQgMTIyIDE4MyA4MyAKKzEyMCAxNzcgMTEzIDE2OSAxODEgNzcgMTgyIDEgMTQ5IDEwMSAzMyA1OCA5MyAxMTMgMTgxIDEwIDE4NiAxMzggMTg0IDMwIDYxIDE5MiAKKzYgMTc1IDEwNyA2IDM3IDgxIDExNCAxNCAxNjIgMTIgMTQ1IDkwIDIgNzMgNjggMTMzIDEzNSA1MCAxNzMgMTEgOTggMTE1IDE3NSAxNTEgCisyOCAxNDYgNjkgMTM2IDg4IDEyMiAxMzkgNjEgMTEgMTg5IDEyMyA5NSAyOCAxMTEgNzMgODAgMTU1IDUxIDYgMTYzIDExNyA5MCA0OSAKKzkxIDQwIDU0IDE4OSBeCiszOTAgMCA2MiAyNSA2NCAxNDMgNzIgMTY5IDE1MSAxMDYgMTExIDUzIDU4IDggOTMgOCA4NSAxMjMgMTIwIDEzMSAxNzAgMzggMiAxNjkgCisxNjcgNDkgNDEgMzcgMTUzIDIxIDM5IDkyIDE0NSAxOTAgMTU1IDE3NyAxODUgNDggMTMgNSAxNTAgNDggMjEgODUgMTE1IDQwIDE2NiAKKzE3OCA4OCAxMDQgMSAxMjUgMTkgMTE2IDEwNiAxNDEgMTExIDIzIDQzIDEwMSA1OCAxODcgMTUwIDc4IDEwMSA1MCAxMDcgMTg1IDg2IAorMTUxIDEzMCAxMzQgMTQzIDM0IDMxIDI2IDEyMiAzOCA0MCAxMTIgOTcgMzMgMTM2IDUwIDk5IDEyNyAxMjEgMTU5IDcgMTkgMTcwIDE4NyAKKzEgNzkgMTkxIDI2IDEzMCAxMTggNSAxMDQgNDcgMTI2IDEwOSA5MiAxMjkgNTIgMzAgMTkzIDkwIDM1IDY3IDExNiA5MCAzIDE4MSAzOSAKKzEyMiAzMCAxNTUgMTQ3IDEwNSA4MyAyMSA3NyAzNSA3NSAxNzQgNTUgMTkwIDEzMSAxNTQgOTUgNzIgMTg1IDk0IDM2IDk1IDEyNiA3MSAKKzE0OSA0IDY4IDE1MiAxODAgMTQ0IDE0NiA3IDQ5IDMzIDE1MiAxODggMjkgMTExIDE5NCAxNzIgMTQ4IDEyNSAzNSA1OSAzNiAxMjUgMTEgCiszNiAxNDEgMTQ5IDE4MyAxMjUgMjcgMSA3MSAxMzMgNjEgMTM4IDE2OCA4NSAxMzEgNSA5NiAxNjIgMTYxIDExNyAxNDIgMTQgNzkgMTgzIAorMTQxIDE2NSAxMjYgNTUgMTEgNzQgODQgNzkgMTY3IDMgNDAgMTQyIDE3NyAxOTMgMTI4IDE3MyAxOTIgMTAwIDE2MyAxNiAxMjcgMTQ1IAorMTgyIDk3IDE3IDE5MyAxMjAgMTE1IDMyIDEwOCAxOCA5NiAxNTQgMTAzIDE1MiAxNTAgODYgMTgxIDE1IDk5IDEzNSAxNzkgMTI0IDE5NCAKKzE2NCA2OCAxNjAgNDMgMTA5IDEzOCAxNTIgMTQyIDYgMjEgMjMgMTQ5IDIwIDExIDgyIDE2NCA0NCAxNTkgMTQ4IDEzMyAxMTUgMjQgMjggCis1MyAxMDQgOSAxODMgMTc5IDEwOCA1NiAzOSA4NCA4NyAzMCAxNjMgMzIgNzAgNzUgMTY2IDE3MCA4IDEzOSA5IDE3NSA5OSAxNDMgNjQgCis4OSAxODYgMTE0IDE4MyAxMzMgODUgMTYxIDYzIDYxIDE1NCAxMTEgMTUgMTE1IDc4IDEwOSAxMDggNzIgMTc3IDE0IDcxIDEwMyAxNzYgCisxNzMgMTc2IDE1NyAzOCAxMCA1NCAxMzIgNDEgMTg2IDEzMCAxMjYgNjMgNjkgMzkgNzYgNyA2NSAxNzEgODIgMTcyIDEwMiAxMjQgMTQwIAorODMgMTMgMTkyIDcwIDgzIDI5IDEzNSA2NyAxMjQgMTQ4IDE2MyAxNzMgMTg0IDIwIDMgMiA0IDUyIDE0IDMzIDE2MCA1MSAxODkgMTAzIAorMTQ0IDkyIDEyMSAxODkgNjUgNiAxNjIgMTM3IDk0IDUyIDM4IDU2IDU1IDI3IDE3IDE0IDYzIDQ1IDE2IDE4MSAzMSA0MiA2NSAxNjMgCisyNCAxMiAxMTAgMTc0IDI1IDExMCAxNjYgMTYyIDE0NSAxNzQgMTcgMzAgNiAxNzAgNTkgNDQgMTgzIDE3MSAyOCA5MSA0NyAxNTYgMTcyIAorXgorNDAwIDEgNTEgMTE1IDE4OCAxMzYgMTU0IDE0NSA2NSAyIDIyIDkzIDgzIDE5MSAxNDcgMjMgMTEwIDU3IDEzNyAxMzEgNjYgMTM4IDI2IAorNzggMTQ2IDEyNSAxNTkgMTUwIDM0IDE3NyAyMiAxMjkgNjggMTY4IDExMSA3NCAxMTggNzcgNTAgMTc0IDU0IDQ3IDg3IDE0MCAyMCAKKzE3OCAxNTggMTMzIDYwIDMzIDQ1IDkzIDQ3IDggMTcwIDU5IDUyIDU2IDEyNCAyMCAxNiAxNTAgMTE3IDI0IDg0IDQ2IDEwNiAxNTEgNTEgCisxNTggMTczIDExMyAxMTEgMTk2IDczIDE1IDEzMyAxMzYgNzEgMTAwIDEwIDg1IDE4MiAxMTAgMTQzIDExNCA5MiAxODUgNDIgNDIgMTE4IAorMTU2IDIwIDEzNSAxNzMgMTU2IDk2IDE4MCAzNyA3MyAxMzQgMTU2IDE4MiAxNTAgMTk2IDE5MiA0NSAxNzIgMTcgMTY3IDkxIDE2OCA2OCAKKzg5IDEzNCAxMjAgMTkwIDE3MyAzNCAxNDEgMzcgMTUyIDExMSAxMTcgMTAzIDYxIDcgMzQgNjIgNjcgMTkxIDE5MCA4IDg3IDIxIDE5NSAKKzEzOSA4NiA0NCA3NiA2NiA1NSAxODYgMjMgMzEgODcgMTgzIDUgMTU1IDEyMiAxOTEgNjggNTMgMTQ5IDEzNiAzNSAxMTUgMjYgMTIxIAorMTMxIDEwMiAxMjMgMyA0MiAxOTcgMTMzIDE3OSA1NiA4NCAxNjUgMTM2IDE5MCAxMzAgNDkgMTU3IDgwIDEwMSAxMDMgOTcgMTk3IDExIAorMTkgMTE4IDEgNSAxMTkgMTM3IDkgMTA0IDE5MyAxNDEgMTE2IDEyMiA3MiAzOCA3IDcwIDQ3IDQ0IDE1NSA0MyAxNiAxMDcgMTI1IDQwIAorMTI3IDE5MyAxMDUgMTMxIDE0NSAxMDggMTg1IDYgNTAgMTQxIDEgMTY3IDEyNyAxNTMgNDUgNTMgMTkyIDEyMSAxMiA3OSA4NCAxMjkgCisxNTEgMTUgMTY2IDE5NiAxNTYgNjAgMTg4IDUzIDEwOSA4MyAxNDggMTYyIDQ2IDE0NiA2IDEzNiAxMTEgMTYwIDg4IDM4IDE2OSA4NSAKKzYzIDg3IDk3IDM1IDE5NCAzIDgyIDUyIDEzIDEzMiA0MyA1OSA5MiAxMDkgNCAxNzggMyAxMTggMzcgMTk1IDk2IDk0IDYwIDExMiAxNSAKKzQ3IDE2NiAxMTAgMTc5IDk5IDY5IDE0OSAxMDAgNDMgMTM4IDY5IDcwIDEyMyA4OSAxMiAxNTggNTQgOTAgNzIgMTE3IDE4MiAzMSAxNjYgCisxNTMgMTY0IDc2IDMzIDIgMTAxIDYzIDQ0IDExMiA1OCAzOSAxNDMgNzQgMzIgMTA3IDg5IDU1IDE0MyAzMSA0NyAxMjMgMTI1IDQgMTM1IAorMTggMTQxIDgwIDEzNyA4OCA4MSAxNTQgNjIgMjcgMTM4IDEwNSA1NSAxMDcgNDYgNzAgMTY2IDc0IDE5NCAxMjIgMTA1IDkxIDkyIDMwIAorMjcgMTkgODIgMTYgMjggMTU1IDc5IDEgODQgODkgOTggMTI4IDE1IDExIDE4MSAxMzMgMTcgNDggNjEgMTI5IDE4NyAxNTAgMTUzIDkgCis2OCAxMCAxNjQgMTU5IDcxIDY0IDE4IDEwMSAyNyA1OSAxMzUgOTQgMTc5IDE0MiA1NCAxMjYgNTcgMTAxIDE0NiA4MiAxNzQgMTczIDc3IAorMTI2IDIxIDExNiAxNjIgMTI1IDEyMyAxNjUgNTcgMjIgMTY5IDE1MyBeCiszOTQgMCA0NyA2MCA1NyA4NiAxNiAxODQgOTYgMTk3IDQyIDk4IDExMiAxNjUgMTU0IDE5OSAxNTcgMjEgMTY4IDUyIDE0NiA2NiAxMjYgCisxMTkgOTMgMTUwIDIwIDM2IDE1MyAxNDAgMTk0IDkzIDI2IDE1NiAxMTQgODAgODAgNTUgNDQgMTMgMzUgMjQgNDQgMTkxIDI0IDE5MCAKKzYzIDE3NyA0NCAxNDAgOTkgMTQ2IDExNyA1NCAxNjMgNDIgNzYgMTAxIDEzNCAxNzYgMTg1IDE3NyAxNjggMSAyMSAxOSAxODAgMTkzIAorMTIgNTIgMTk3IDE5MSAxNzMgNjUgMTkgMzEgMTE4IDU5IDEgMTIzIDcyIDcxIDg4IDY0IDExIDE5MyAzNyA2MyAyOCAxNjkgMTg0IDQ1IAorNzIgMTk1IDE1MiAxODYgODcgNTYgMTc2IDExMiA0MSA5MyA3NyA4NCAxNTggMjkgMyAxMzYgMTQyIDM2IDgwIDQgMTE5IDE2NiA4NiA5OCAKKzE2MyA5MyAxIDE0NSA4MyAxMDIgNjYgNzUgMTkxIDQ2IDQgOTQgMTU1IDU1IDEyMCAxNDkgMTEzIDE0OCAxODEgNDkgMTc1IDE4MCAxNDIgCis4NyA1IDUxIDY1IDkyIDE2NyAxOTYgMTg2IDEzOCAxODQgMjMgNjEgMTY0IDE3MSAxNzUgMTA3IDYgOSA4MSAxMTQgNyAxNDEgMTc3IAorMTE3IDc2IDE3NCA3MyA1NCAxMTIgMTE0IDI5IDE1MiAxMSA5OCA4NyAxNTQgMTIzIDIxIDE0NiA0MSAxMTUgODggMTE1IDEzOSA0MCAKKzE4MyAxODkgMTA5IDY3IDcgOTAgNTIgNzMgMTI3IDUxIDE5MiAxNTYgODkgNjkgNDkgNzcgMzMgMzMgMTgyIDU3IDEwIDY0IDEzOCA1NyAKKzE1OSAxMzYgOTEgMTExIDMzIDU4IDE5MyA4OCAxODggNzUgMTE4IDExMCAxMjYgMTcwIDE4IDE5NyAxNjkgMTYyIDM0IDQxIDE3IDEzOCAKKzYgMzQgOTIgMTQ1IDE4NSAxNTUgMTU3IDE3MCA0MyA4IDE0MCA0OCAyMSA3MCAxMDUgNDAgMTYxIDE3OCA3OCA4OSAxOTYgMTEwIDE5OSAKKzEwNiA5NiAxMjEgMTA2IDIzIDE4NSAyOCA5NiA0OCAxNjcgMTQ1IDU4IDkxIDM1IDk3IDE4MCA2NiAxNTEgMTMwIDEyNCAxMjggMzQgMTYgCis2IDEwNyAyOCAyMCAxMTIgOTIgMTggMTIxIDMwIDg0IDEwNyAxMDEgMTU5IDE4NyAxOSAxNTUgMTgyIDE4MSA3NCAxODYgMTEgMTIwIDk4IAorMTg1IDEwNCAzMiAxMjYgOTQgODIgMTE5IDQyIDI1IDE3MyA5MCAzMCA2MiA5NiA3MCAxNzggMTc2IDM5IDEwMiAxNSAxNTAgMTQ3IDEwMCAKKzc4IDE2IDU3IDM1IDc1IDE2OSAzNSAxNzAgMTE2IDE0NCA3NSA2NyAxODUgNzkgMjEgOTUgMTE2IDcxIDEzOSAxODkgNTggMTQyIDE2MCAKKzE0NCAxMjYgMTkyIDI5IDI4IDE0NyAxNzMgMTQgOTEgMTg0IDE3MiAxMzMgMTIwIDI1IDQ5IDI2IDEwNSAxODYgMzYgMTMxIDEyOSAxNjMgCisxMTUgMTIgMTc2IDYxIDExMyA0NiAxMjggMTU4IDgwIDEzMSAxODAgOTEgMTYyIDE2MSAxMDIgMTQyIDE0IDY5IDE3MyAxNDEgMTU1IAorMTA2IDQ1IDE5NiA1OSA3NCA1OSAxNDcgMTk1IF4KKzQxMiAwIDE2IDExMCAxNTMgMTc3IDEwNCAxNzMgMTkyIDY4IDE0NyAxNzkgMTE5IDEzNyAxNjYgNzMgMTgwIDE2OSA4OCA5MSAyNCA3NiAKKzEwIDgwIDE0NiA3OSAxMjggMTUwIDYyIDE0OSAxOTQgODMgMTExIDE3MSAxMjQgMTcwIDE1NiA2MCAxNTIgMjcgMTA5IDEwNiAxMjAgCisxMzQgMjAxIDE4NCAyMDIgMTQ5IDEyIDE5OCA2NiAxMzIgMTIgMTI3IDEzMiAxMzMgODMgOCAxMiA0NSA4OCA5IDE4MyAxNTUgOTIgMjQgCisyMyA3NiA2MyAxNCAxNjMgOCA2MiA2NyAxNTAgMTYyIDggMTE1IDEgMTY3IDkxIDEyNyAzMiA4OSAxNjIgOTAgMTU5IDEyNSA4NSAxMjkgCis0NyA1MyAxNTQgOTUgNyAxMTUgNTQgMTAxIDEwOCA1NiAxNjkgNiA0NyAxMDMgMTc2IDE1NyAxNjAgMTI1IDE0IDEwIDMwIDEyNCAxNyAKKzE3OCAxMjIgMTAyIDU1IDY5IDE1IDYwIDIwMiA0OSAxNzEgNzQgMTQ4IDk0IDkyIDEyNCA2NyAyMDAgMTg0IDcwIDgzIDI5IDEyNyA2NyAKKzEwMCAxNDAgMTMxIDE2NSAxNzYgNCAxODIgMiAxNjcgMjAgMTkzIDMzIDE2MCA0MyAxNzMgNzEgMTEyIDY4IDk3IDE1NyA1NyAxNjkgCisxMzggMTEzIDg2IDQ0IDM4IDQwIDU1IDE5IDE5NiAyMDEgMzEgMjEgOCAxNjUgMjMgMjYgNDEgMTU1IDE5NSAxODMgMTAyIDE1OCAyNSAKKzk0IDE0MiAxNDYgMTI5IDE1MCA5IDMwIDE3NyAxNTQgMTk1IDUxIDM2IDE3NSAxMzkgMjggNTkgMzEgMTI0IDE2NyA0MSAxMDUgMTczIAorMTIxIDEzNCAxMzAgNjUgMTg1IDE3IDc4IDc4IDE4MSAxMzcgMTMgOTUgNTcgMTM3IDExNiA1MSAxMTggMTYgNzggMTMxIDExNSAxNTQgCisxNDUgMjkgMTc3IDIyIDEyOSA2OCAxNjggOTEgNzQgOTggNzIgMzAgMTc0IDM5IDM3IDcyIDEzMCAxNSAxNjMgMTU4IDEyOCA1MCAxOCAKKzI1IDczIDI3IDE5MSAxNTAgNTkgNTIgMzYgMTA0IDIwIDExIDEzMCA5NyA0IDc5IDQ2IDEwNiAxNDEgNDYgMTM4IDE2MyAxMDggMTA2IAorMTkxIDY4IDE1IDExMyAxMzYgNjYgMTAwIDE5MyA2NSAxODIgMTA1IDEyMyA5OSA3MiAxODAgMzcgMjIgMTA4IDE1NiAxMCAxMzAgMTY4IAorMTQxIDk2IDE2MCAyMiA1OCAxMzQgMTUxIDE2MiAxNDAgMTgxIDE4NyAzNSAxNTcgNyAxNDcgNzYgMTYzIDU4IDg0IDEyOSAxMDAgMTkwIAorMTUzIDI0IDEyNiAzMiAxNDIgOTYgMTA3IDg4IDQxIDIgMTQgNDIgNTIgMTg2IDE3MCAzIDgyIDExIDE4MCAxMTkgNjYgMjkgNTYgNjYgCis1MCAxNzEgMyAxMSA3NyAxNjMgNSAxNTAgMTEyIDE3MSA1MyAzMyAxMzkgMTMxIDE1IDExMCAyMSAxMTEgMTIxIDEwMiAxMDggMyAzMiAKKzE5MiAxMTggMTY5IDU2IDY5IDE2NSAxMjYgMTg1IDEyMCAzNCAxNTcgNjAgODEgOTMgOTIgMTc3IDEgMTQgMTEzIDE4OSA5OSAxMjIgCisyMDIgOTkgMTkzIDEzNiAxMTYgMTIyIDUyIDMzIDcgNjUgMzIgMzkgMTQwIDI4IDYgOTcgMTI1IDM1IDEwNyAxODggODUgMTI2IDEzNSAKKzk4IDE3NSAxODkgNTAgMTIxIDE4NCAxMTYgXgorNDEzIDEgMTI3IDE1MyA0NSAzMiAxNjQgMTIxIDIwMyA1OCA1NiAxMDggMTMwIDE5MiAxNjYgMTY4IDEyOCAzOSAxODggNTMgMTAyIDY5IAorMTQ4IDE0MSAxOCAxMzkgMTk3IDEwOCA5NyAxMzIgNzQgMjQgMTU1IDcxIDYzIDU5IDk3IDIxIDE5NCAxODAgNjEgNDUgMjA0IDEzMiAyOSAKKzMxIDg1IDg4IDE4OCAxNjQgMTg3IDExOCAzNyAxNjcgODIgOTQgNjAgOTggMSA0NyAxNTIgMTEwIDE3MiA4NSA1NSAxMjggNzIgNDMgCisxMTcgNDEgNDIgMTE2IDYxIDEyIDE0NCA0MCA2MiA1OCAxMTcgMTY4IDE3IDE1OSAxMzkgMTY0IDc2IDUgMTkzIDEwMSA1NiAzMCAxMDUgCiszMCAxMSAxNDMgNjAgMzIgODYgNjggNDEgMTM2IDMxIDQwIDEyMyAxMTggMTgxIDEzNSAxOTUgMTI3IDU5IDEzMCA4MSA1MyAxNDcgNjIgCisxMyAxMjQgOTggMzQgNzkgMzkgNDkgMTQ1IDUzIDE4MCA5NCAxMDUgOTEgNzEgMiAyNyA1IDU0IDE5MyA3IDE0MSA3OSAxOTkgODQgNzUgCis3MCAxMjggMTk5IDE5NSAxNjAgMTE5IDE3IDIwIDU0IDExNSAxODcgMTg0IDEyOSAxNDYgMTkzIDQwIDIwMSAxNDMgMTM4IDU3IDQzIDE4IAorOTQgMjA0IDM4IDExNCA4MCAxNzkgMTE0IDQ3IDExOSA1MCA4MCAxMTggODIgMTYwIDE1MiA0OSAxMTIgMTk4IDg4IDE1NSAxMDQgOTUgCisxNTEgMzYgMTk5IDE2MiAxMDAgMjcgNTAgNDcgODYgMTk1IDE2IDE3OSA4MSAxOTIgMjcgODMgMTA3IDE1MCAxMzQgMTk0IDE0NyAxIAorMTU4IDMyIDEzMSA2MSAxMTEgMTE5IDgzIDE0MCA1IDIxIDEzMyAxMjAgMTc0IDc4IDI2IDEzNiAxMDkgNjUgODAgNDAgMjkgMjAzIDI1IAorMjQgNDQgMTkxIDE0IDE3MCA0MyAxNjIgMzQgMTQwIDk5IDE0MSAxMTIgNTQgMTQ4IDQyIDcxIDk2IDExOSAxNjEgMTY1IDE2NyAxNDggCisxODYgMTEgNCAxODAgMTg4IDE5NyA0MiAxODIgMTgxIDE2OCA1MCAxNCAyNiAxMDMgNDkgMSAxMTMgNjcgNjEgNzggNTkgMTk2IDE3MyAKKzMyIDUzIDggMTU0IDE2OSAzMCA3MiAxNzUgMTUyIDE3NiA4NyAzNiAxNjYgMTAyIDM2IDg4IDc3IDc5IDEzOCAyNCAxODggMTMxIDEyNyAKKzI2IDcwIDE5NCAxMTQgMTQ2IDY2IDkzIDE1OCA5MyAxOTEgMTI1IDc4IDkyIDUxIDYwIDE3NiAyNiA0IDc0IDEzNSAzNSAxMjAgMTI5IAorMTEzIDEzMyAxODEgMjkgMTcwIDE3MCAxMzcgNzcgMTkwIDQ2IDQ1IDc3IDE1NyAxOTEgMTg2IDEzOCAxODQgMTggNjEgMTQ0IDE1MSAKKzE3NSAxMDcgNiAxOTQgODEgMTE0IDIgMTI2IDE1NyA5NyA2NiAxNTkgNzMgNDQgOTcgOTkgMTQgMTM3IDExIDk4IDY3IDEzOSAxMDMgMTYgCisxNDYgMjEgMTAwIDg4IDExMCAxMzkgMjUgMTY4IDE4OSA5OSA0NyAxOTcgNzUgMzcgNjggMTA3IDUxIDE4NyAxNTEgNjkgNTQgNDkgNjcgCisyOCAxOCAxNzIgNTIgMjAwIDY0IDEzMyA0MiAxNDkgMTIxIDc2IDExMSAxMyA1OCAxODMgODMgMTczIDY1IDExMyAxMDAgMTIxIDE3MCAKKzIwMyAxOTcgMTY5IDE1NyAxOSAyMDIgXgorNDM0IDEgMTkzIDExNCAxOTAgMjYgOTIgMTQ1IDE3NyAxNTUgMTI1IDE0NiAzNSAyMDAgMTI0IDQ4IDIxIDQ2IDg5IDQwIDE1MyAxNzggCis2MiA2NSAxOTYgODYgMTc1IDkwIDgwIDg5IDk4IDIzIDE2OSA0IDg4IDMyIDEzNSAxMzcgMjYgNzUgMTEgODEgMTcyIDM0IDE1MSAxMzAgCisxMDggMTA0IDM0IDIwMCAxODIgODMgMTIgMTk2IDExMiA4NCAyMDIgOTcgMjA2IDYwIDc1IDY5IDE1OSAxNjMgMTkgMTMxIDE3NCAxNTcgCis2NiAxNzggMTk1IDEwNCA2NiAxNjEgMTA0IDggMTI2IDcwIDY2IDEwMyAyNiAxNyAxNDEgOTAgMjIgNTQgNjQgMzggMTQ2IDE2OCAzOSAKKzcwIDE5OSAxNDIgMTQ3IDkyIDcwIDggMjUgMzUgNzUgMTYxIDMgMTM4IDkyIDEyOCA0MyA1OSAxODUgNTUgMjA1IDk1IDEwMCA3MSAxMjMgCisxNzMgNDIgMTI2IDEyOCAxNDQgOTQgMTc2IDIwNSAyMCAxMzkgMTQ5IDE5OCA1OSAxNjggMTcyIDEwOSAxMTIgOSAzMyAxMCA3MyAxNTQgCiszNiAxMTUgOTcgMTMxIDk5IDE5NiAxNDQgNDUgODEgMjIgMTEyIDE0MiA3MiAxMzEgMTQ4IDgzIDE2MiAxNjEgNzggMTQyIDE0IDUzIAorMTU3IDE0MSAxMzkgNzQgMjkgMTgwIDM1IDU4IDI3IDExNSAxOTggMSA5MCAxMzggMTY3IDg5IDE3MyAxOTIgNDggMTM3IDE1OSAxMTQgCisxMzIgMTU2IDU4IDE2MCAxNTQgNjggNzYgMTkgNTYgNSA3MCAxNDEgNjQgMTEzIDE1MCA0NyAxMjkgMTg0IDczIDk2IDE2NiAxMjQgMTU1IAorMTUxIDU1IDE0NyAxNyAxMDkgODYgMTAwIDEyOSAyMDEgMTY0IDE5MiAxNDkgNyAxOTMgNTYgMTEyIDIwMCAxMDcgMTIyIDEzMyA2MyAKKzIwNiAyIDQwIDc4IDkgMTgzIDE0MCA4MiA0IDEzIDcxIDQ4IDQgMTYzIDIwMSA1NyA2MiAxNDAgMTU3IDggMTAwIDIwNCAxNjIgODYgCisxMTcgMTIgODkgMTQ3IDc1IDE0NCAxMjAgODUgMTA5IDM3IDQ4IDE1NCA4NSAyIDExNSAzOSA5NiAxMDggNDYgMTY0IDEgMzIgMTAzIAorMTc2IDE0NyAxNTAgMTA1IDIwNyAxMCAxNSAxMTkgMiAxNzMgMTE3IDg3IDUwIDY5IDUwIDIwMiAzOSAxNzEgNjkgMTMzIDg5IDcyIDExNCAKKzU3IDE5NSAxNzkgNzAgODMgMjkgMTIyIDY3IDg1IDEzNSAxMTEgMTYwIDE3MSAyMDIgMTcyIDIgMTQ3IDE4MyAzMyAxNjAgMzggMTYzIAorNTEgOTIgNTMgODIgMTM3IDUyIDE0OSAxMjMgOTggODEgMzkgMzggMzAgNTUgMTQgMTg2IDE5NiAxMSA2IDMgMTU1IDE4IDE2IDI2IDE1MCAKKzE4MCAxNjggOTcgMTQ4IDI1IDg0IDEyNyAxMzYgMTE5IDEzNSA0IDMwIDE2MiAxNDQgMTk1IDQ2IDMxIDE3MCAxMTkgMjggMzkgMjEgCisxMDQgMTY3IDMxIDk1IDE1OCAxMDYgMTE0IDExNSA2NSAxNzAgMTIgNjMgNzMgMTcxIDEyNyAzIDgwIDU3IDEzNyAxMDEgMzYgOTggNiAKKzc4IDExNiAxMDUgMTQ5IDE0MCAyNCAxNzcgMjIgMTI5IDY4IDE2OCA3MSA3NCA3OCA2NyAxMCAxNzQgMjQgMjcgNTcgMTIwIDEwIDE0OCAKKzE1OCAxMjMgNDAgMyA1IDUzIDcgMTc2IDEzMCA1OSA1MiAxNiA4NCAyMCA2IDExMCA3NyAxOTIgNzQgNDYgMTA2IDEzMSA0MSAxMTggCisxNTMgMTQ0IF4KKzQzOCAxIDk5IDE4NCA2MSAxNSA4NSAxMzYgNTkgMTAwIDE3MiAzNyAxODIgOTggOTUgNzggNDQgMTczIDMwIDIwNCA5NCAxNTYgMjA2IAorMTIzIDE2MSAxMjAgOTYgMTMyIDEgMzcgMTM0IDE0NCAxMzQgMTI2IDE2MCAxODAgMjEgMTM2IDIwMyAxMTkgNTUgMTU2IDQ0IDc3IDEyMiAKKzcyIDE5MCAxMjUgMTAgMTA1IDI1IDEyOCA3NSA5MyA2NyAxMyAyMDUgMTk2IDE0IDMxIDE3OSAxNDIgMjA2IDc1IDIwNyAxNTkgOTEgMzggCis4IDI4IDY2IDQzIDE1MCAxODUgMTkzIDYzIDEzNSA1IDE0MyA5OCAxNDMgMzIgNSAxMjUgMTI0IDE5NyAxMDMgMTQgOTcgMTA3IDEwMiAKKzg3IDMgMTggMTg1IDk3IDE1NSA1NiA0OCAxNjUgMTEyIDE3OCAxMDYgMTMgMTU3IDMyIDUzIDc5IDg1IDE0OSAxOTcgNyAxMDYgMTc1IAorMjAzIDcxIDEwMSAxOTUgOTIgMTkzIDEyOSAxMTYgMTIyIDI0IDI2IDcgNTggMTEgMzIgMTE5IDcgMjAyIDgzIDEyNSAyOCA3OSAxODEgCis1NyAxMTkgMTIxIDg0IDE2MSAxNjggNTAgOTMgMTYzIDEzMSAxMjcgMTUzIDQ1IDE3IDE0NCAxMjEgMTk4IDQzIDM2IDkzIDExNSAxNzcgCisxNjYgMTQ4IDEwOCAyNCAxODggNTMgOTcgNTkgMTQ4IDEyNiAyMDggMTM0IDE5MiA4OCA4NyAxMTIgNjQgMTQgMTQ1IDYxIDYzIDM5IDk3IAorMTEgMTk0IDE2NSA0NiA0MCAxOTkgMTMyIDE5IDExIDgwIDczIDE3OCAxNTQgMTc3IDExOCAzNyAxNDcgNzIgOTQgNjAgODggMjAxIDQ3IAorMTQyIDExMCAxNjcgNzUgNDUgMTEzIDUyIDQzIDEwMiAyMSAyMiAxMTEgNDEgMTIgMTM0IDMwIDQyIDQ4IDExNyAxNTggNyAxNTQgMTI5IAorMTY0IDc2IDE5NSAxODggMTAxIDUxIDIwIDEwMCAxMCAyMDEgMTQzIDUwIDMyIDcxIDUzIDMxIDEzMSAzMSAzNSAxMjMgMTEzIDE2NiAKKzEzNSAxODAgMTE3IDQ0IDEyNSA3NiAzMyAxNDIgNjIgMyAxMTQgOTMgMTkgNTkgMzQgMzQgMTMwIDM4IDE3MCA3NCAxMDUgOTEgNTYgCisxOTIgMjcgMjA1IDM0IDE3OCAyMDIgMTMxIDc5IDE5OSA4NCA2NSA1MCAxMjggMTg5IDE4NSAxNDUgMTA5IDE3IDQ5IDEwNSAxODcgMTc0IAorMTE0IDE0MSAxODMgMjAgMTk2IDEyOCAxMjMgNDcgMjggMTggODkgMTg5IDIzIDk5IDcwIDE3OSA5NCA0MiAxMTQgNDUgNjUgOTggODIgCisxNTAgMTM3IDI5IDEwMiAxODMgNjggMTUwIDg5IDc1IDE0MSAyMSAxODQgMTU3IDgwIDcgNDAgMzcgODYgMTkwIDE2IDE3NCA2NiAxODcgCisxMiA2OCAxMDIgMTM1IDExNCAxODkgMTM3IDE5MSAxNDggMTIgMTE2IDU2IDk2IDExOSA3MyAxMzAgMjAwIDYgMTEzIDEwMCAxNTQgNjMgCisyNiAxMTYgMTA0IDUwIDgwIDI1IDE0IDE5MyAxNSAyNCA0NCAxOTEgNCAxNTAgMjMgMTQ3IDI0IDE0MCA5OSAxMzYgMTA3IDU0IDEzMyAKKzQyIDY2IDkxIDEwNCAxNDYgMTQ1IDE1NyAxMjggMTcxIDEgMTk5IDE4MCAxODMgMTgyIDMyIDE2NyAxNzEgMTYzIDM1IDkgMjEgODggMzkgCisxIDEwMyA2MiA1MSA2OCA1NCAxODEgMTUzIDI3IDQzIDE5OCAxMzkgMTU0IDE1IDcyIDE1NSAxNTIgMTY2IDg3IDE2IDE1NiA5MiAzMSAKKzgzIDc3IDc0IDExOCAxOSAxNzMgMTI2IDIwMiBeCis0MzEgMCAxMCA1NCAxNzggMTA2IDExNCAzNCA4NSAxNTAgOTMgMTc1IDkzIDcwIDc2IDI3IDM2IDE1MiAyMDcgNCA0MiAxMDMgMyAxMjAgCis5NyAxMTMgMTA5IDE4MSAyMTAgMTYyIDE1NCAxMjkgNjEgMTY2IDM4IDEzIDUzIDE0MSAxODMgMTg2IDEzOCAxODQgMTAgNjEgMTEyIAorMTE5IDE3NSAxMDcgNiAxNzAgODEgMTE0IDIwNyAxMDIgMTI1IDY1IDUwIDEzNSA3MyAyOCA3MyA3NSAyMDMgMTEzIDExIDk4IDM1IDExNSAKKzcxIDggMTQ2IDIwMiA3NiA4OCAxMDIgMTM5IDEgMTQ0IDE4OSA4MyAxNSAxODEgNTEgMTMgNjAgNzUgNTEgMTc5IDE0MyAzNyAzMCA0OSAKKzUxIDIwIDIwNyAxNTYgNDQgMTg0IDY0IDEyNSAxOCAxMzMgOTcgNTIgMTExIDE5NCA1OCAxNjcgNzUgMTQ5IDQ5IDEwNSA4NCAxMTMgCisxNzAgMTc5IDE5NyAxNjkgMTQ5IDIwOCA0MSAxNzggOTkgMTgwIDIxIDkyIDE0NSAxNzIgMTU1IDEwNSAxMzEgMzAgMjA4IDIwMCAxMTQgCis0OCAyMSAzMSA3OSA0MCAxNDggMTc4IDUyIDUwIDE5NiA3MSAxNjAgODAgNzAgNjkgOTMgMjMgMTU5IDIwMiA4MyAyMiAxMTUgMTMyIDYgCis2NSAyMDkgNzEgMTY3IDE0IDE1MSAxMzAgOTggODkgMzQgMTkwIDE2NyA2OCAyIDE4MSAxMTIgNzkgMTkyIDgyIDE5MSA0NSA1NSA0OSAKKzE1OSAxNDggMTkgMTE2IDE2OSAxNDIgNjEgMTczIDE4NSA5NCA0NiAxNDYgMTA0IDIwNiAxMjYgNTUgNTYgOTMgMTYgMTIgMTIxIDkwIAorMTcgNDkgNDQgMTggMTI2IDE2MyAzOSA1MCAxODkgMTM3IDE0NyA4NyA2NSAzIDUgMzUgNzUgMTU2IDE5NiAxMTggNzcgMTE4IDIzIDU0IAorMTg1IDQwIDE5NSA5NSA5MCA3MSAxMTMgMTYzIDMyIDExNiAxMDggMTQ0IDc0IDE2NiAxOTAgMTUgMTM0IDEzNCAxODggMzkgMTU4IDE3MiAKKzk0IDEwNyAyMTIgMjMgNTMgMTM0IDM2IDEwNSA3NyAxMTEgODkgMTg2IDEyNCAzNSA2MSA3IDEwMiAxMzIgNjcgMTMxIDEyOCA3OCAxNjIgCisxNjEgNjMgMTQyIDE0IDQzIDE0NyAxNDEgMTI5IDU0IDE5IDE3MCAyMCA0OCA3IDk1IDE5OCAxOTkgNzAgMTIzIDE1NyA3NCAxNzMgMTkyIAorMjggMTI3IDEzOSAxMDkgMTI3IDE0NiA0MyAxNDAgMTM5IDQ4IDYxIDE0IDM2IDYwIDEzNiA0OSA5OCAxNTAgMzIgMTA5IDE3NCA2MyA4MSAKKzE2MSAxMjQgMTQwIDE0NiA1MCAxNDIgNyAxMDkgNjYgODAgMTI0IDIwMSAxNDQgMTgyIDE0OSAyIDE4OCA0NiA5MiAxODUgODcgMTEyIAorMTMzIDQzIDIwMSAyMDUgMzUgNjggOSAxODMgMTI1IDcyIDE5NyAzIDY2IDMzIDIwNyAxNjMgMTkxIDUyIDU3IDEzMCAxNTIgOCA4NSAKKzIwNCAxNTcgODEgMTA3IDIwNSA4OSAxMzIgNjAgMTI5IDExNSA4NSA4OSAyNyA0MyAxNTQgNzUgMjEwIDExNSAyNCA5MSAxMDggMzYgCisxNTkgMjA5IDE3IDEwMyAxNzYgMTM3IDE0MCA4NSAxOTcgMTAgMTE0IDIwMCAxNjggMTEyIDcyIDQ1IDY5IDE5OCA0MCAyMDIgMjkgMTcxIAorNjQgMTE4IDg0IDUyIDEwNCA0NyAxOTAgMTc0IDcwIDgzIDI5IDExNyA2NyA3MCAxMzAgOTEgMTU1IDE2NiAxOTcgMTYyIDIgMTI3IDE5MyAKKzE3MyA4MiBeCis0NjQgMSAxNjAgMzEgMTQ5IDIzIDY0IDMyIDYxIDEwOSA0NSAxMjEgMTAyIDc3IDc0IDMyIDM4IDE2IDU1IDcgMTcyIDE4OSAxOTggMjAwIAorMjExIDE0MSAxMSAyIDUgMTQzIDE1OSAxNDcgOTAgMTM0IDI1IDcwIDEwNiAxMjIgMTA1IDExNCAyMTIgMzAgMTQxIDEzMCAxOTUgMzkgCisyNCAxNjMgOTEgMjggMTEgNyA3NiAxNjcgMTcgODEgMTM3IDg1IDg2IDk0IDY1IDE0OSA1IDQyIDY2IDE1NyAxMTMgMjA0IDU5IDU3IAorMTM3IDgwIDE1IDcwIDIwNyA3OCA5NSA5MSAxNDIgMTMzIDE3IDE3NyAyMiAxMjkgNjggMTY4IDQzIDc0IDUwIDYwIDE5NyAxNzQgMyAxMyAKKzM2IDEwNiAzIDEyNyAxNTggMTE2IDI2IDE5NyAxOTIgMjUgMTk0IDE1NSAxMDIgNTkgNTIgMjAzIDU2IDIwIDIxNCA4MiA0OSAxNzEgNjcgCis0NiAxMDYgMTE3IDM0IDkwIDEzOSA5NiA5NCAxNzkgNTYgMTUgNjUgMTM2IDU0IDEwMCAxNTcgMTcgMTgyIDkzIDc1IDYzIDI0IDE2OCAKKzI1IDE4OSA4NCAxNTYgMjAxIDExOCAxNTYgMTA1IDk2IDExMiAyMDEgMjIgMTM0IDEzOSAxMTQgMTE2IDE0NSAxNzUgMTEgMTIxIDE5OCAKKzk5IDQwIDE1MSAzNCA3MiAxMTcgNTIgMTkwIDEwNSA5MCAyMCAxMTggNjAgODMgNTIgMjA4IDIwNSAxODEgMjA5IDE2IDE3NCAxMjIgCisyMDYgNzAgMjAyIDE0NCA3MSAxOCAyMDggOCA2NiAzOCAxMzUgMTcwIDE3OCA1MyAxMTUgNSAxMzggODggMTIzIDE3IDIwMCAxMTUgMTE5IAorMTgyIDk4IDkgODcgOTcgMTAyIDcyIDMgOCAxODAgODIgMTQ1IDU2IDMzIDE2NSAxMDIgMTczIDk2IDIxMyAxNTcgMTIgMzMgNjkgODAgCisxMjkgMTkyIDIgMTAxIDE2NSAyMDMgNTEgODYgMTkwIDg3IDE5MyAxMjQgMTE2IDEyMiA0IDIxIDcgNTMgMjExIDI3IDEwNCAyMDcgMTk3IAorNzMgMTI1IDIzIDU5IDE3NiAzNyAxMTQgMTExIDc0IDE1MSAxNTMgNTAgNzMgMTQ4IDExNiAxMjcgMTUzIDQ1IDIgMTI0IDEyMSAxOTMgCisyOCAxNiA3OCAxMDAgMTYyIDE2NiAxMjggODggOSAxODggNTMgOTIgNDkgMTQ4IDExMSAxOTMgMTI5IDE4NyA2OCA3NyA5MiA1NCA0IAorMTM1IDUxIDYzIDE5IDk3IDEgMTk0IDE1MCAzMSAzNSAxOTQgMTMyIDkgMjA2IDc1IDU4IDE2OCAxNDQgMTY3IDExOCAzNyAxMjcgNjIgCis5NCA2MCA3OCAxOTYgNDcgMTMyIDExMCAxNjIgNjUgMzUgOTggMzIgNDMgODcgMSAyIDEwNiAyMSAxMiAxMjQgMjAgMjIgMzggMTE3IAorMTQ4IDIxMiAxNDkgMTE5IDE2NCA3NiAxODAgMTgzIDEwMSA0NiAxMCA5NSAyMDUgMTg2IDE0MyA0MCAzMiA1NiAzOCAyMSAxMjYgMzEgCiszMCAxMjMgMTA4IDE1MSAxMzUgMTY1IDEwNyAyOSAxMjAgNzEgMTMgMTM3IDYyIDIwOCAxMDQgODggNCAzOSAyOSAxOSAxMTUgMjMgMTYwIAorNTQgMTA1IDkxIDQxIDE3NyAyNyAyMDAgMTQgMTYzIDE5MiAxMjEgNzkgMTk5IDg0IDU1IDMwIDEyOCAxNzkgMTc1IDEzMCA5OSAxNyAKKzE5NSA0NCA5NSAxODcgMTY0IDk5IDEzNiAxNzMgMTkxIDExMyAxMDggMzcgMTMgMTggODQgMTc0IDggODQgNjAgMTc5IDc0IDM3IDEwOSAKKzQwIDUwIDc4IDgyIDE0MCAxMjIgOSA5MiAxNjggNDggMTQ1IDc0IDU1IDEzMSA2IDE2OSAxNTIgNjAgMjAyIDMwIDI3IDg2IDE4NSAxNiAKKzE2OSA1MSAxODIgMjEyIDUzIDk3IDE4NSBeCis0NTIgMSA4MiAxODEgMTIxIDE2NyAxMzIgMTk4IDkyIDQ4IDcyIDExOSA1NyAxMTQgMTg0IDIwMCA4MSA2OCAxMjIgMzkgMjYgODQgOTYgCisyNiA4MCAxIDIwOCAxNzcgMjE3IDI0IDQ0IDE5MSAyMDYgMTE4IDIwOSAxMjMgOCAxNDAgOTkgMTI4IDk5IDU0IDEwOSA0MiA1OCA4MyAKKzgwIDEyMiAxMTMgMTQxIDk2IDE0NyAyMDMgMTgzIDE4MCAxNzUgMTU4IDE2IDE0MyAxNTUgMTU1IDExIDEgMTMgNjQgMjMgMSA4NyA1NCAKKzM1IDUyIDQ2IDE1NyAxMjEgMTkgMjcgMTc0IDExNSAxMzAgMjA5IDcyIDEyMyAxNTIgMTUwIDg3IDIwMiAxNDAgNzYgMjMgNzUgNzcgNjYgCis4NiAxMSAxNDkgMTE4IDg4IDQ0IDE2OCAxMDEgOTQgMTQgODAgMTQ1IDkzIDE2NSA3MyA2NSA2NiAxMiAyMSAxMzcgMTkyIDQgMjIgODMgCisyMDEgMTIwIDc3IDExMyA5NCAxODEgMTk1IDE1NyAxNDQgMTI0IDUxIDE1MSAzMyAyMTEgMzggMTMxIDE3OCAxODYgMTM4IDE4NCA1IDYxIAorOTIgOTkgMTc1IDEwNyA2IDE1NSA4MSAxMTQgMjA3IDg3IDEwNSA0NSA0MCAxMjAgNzMgMTggNTggNjAgMTkzIDk4IDExIDk4IDE1IDEwMCAKKzUxIDMgMTQ2IDE4NyA2MSA4OCA5NyAxMzkgMjA0IDEyOSAxODkgNzMgMjEzIDE3MSAzNiAyMTYgNTUgNTUgNTEgMTc0IDEzOCAxNyAxNSAKKzQ5IDQxIDE1IDE5NyAxNDYgMzkgMTc0IDY0IDEyMCAzIDEyMyA4MiAzNyAxMTEgMTc5IDU4IDE1NyA3MCAxMzQgMzkgMTAwIDc0IDEwOCAKKzE3MCAxNjQgMTk3IDE2OSAxNDQgMTk4IDQxIDE2MyA4NCAxNzAgMTYgOTIgMTQ1IDE2NyAxNTUgODUgMTE2IDI1IDIwOCAyMDAgMTA0IAorNDggMjEgMTYgNjkgNDAgMTQzIDE3OCA0MiAzNSAxOTYgNTYgMTQ1IDcwIDYwIDQ5IDg4IDIzIDE0OSAxOTIgNzggMTIgOTUgMTI3IDIwNCAKKzU1IDE5OSA2MSAxNjIgMjEyIDE1MSAxMzAgODggNzQgMzQgMTgwIDE1MiA1MyAyMTAgMTY2IDExMiA3NCAxODIgNjcgMTc2IDMwIDM1IAorMjkgMTU5IDEzMyAxOSAxMDEgMTY0IDEyNyA1NiAxNjggMTc1IDg0IDI2IDEzMSAxMDQgMTk2IDEyNiA0MCA0NiA4MyA2IDcgMTAxIDkwIAorMTIgNDQgMjQgMjE2IDEwNiAxNTggMzkgMzAgMTc5IDEzMiAxNDcgODIgNjAgMjE2IDIwMyAzNSA3NSAxNTEgMTgxIDk4IDYyIDEwOCAzIAorNDkgMTg1IDI1IDE4NSA5NSA4MCA3MSAxMDMgMTUzIDIyIDEwNiA4OCAxNDQgNTQgMTU2IDE3NSAxMCAxMjkgMTE5IDE3OCAxOSAxNDggCisxNzIgNzkgMTAyIDIwNyAxMyAyMDggMzMgMTE0IDM2IDk1IDU3IDkxIDc5IDE3NiAxMDQgMjUgNDEgMjEwIDkyIDEyMiA2MiAxMzEgMTA4IAorNzMgMTYyIDE2MSA0OCAxNDIgMTQgMzMgMTM3IDE0MSAxMTkgMzQgOSAxNjAgNSAzOCAyMDUgNzUgMTk4IDE4OSA1MCAxMDggMTQ3IDU5IAorMTczIDE5MiA4IDExNyAxMTkgMTA0IDEyMiAxMzYgMjggMTIwIDEyNCAyOCA0NiA5IDE2IDIxMyA1MCAxMzEgMzQgODMgMTUwIDE3IDg5IAorMTY0IDUzIDY2IDE1NiAxMjQgMTI1IDE0MSA0NSAxMzcgMjE1IDEwOSA0NiA2MCAxMTkgMjAxIDEyNCAxNzIgMTQ5IDIxNSAxODMgMzYgCis3MiAxNzAgNjcgMTAyIDEzMyAyMyAxOTYgMjAwIDMwIDU4IDkgMTgzIDExMCA2MiAxODIgMjExIDYxIDE4IDIwMiAxNjMgOTcgXgorNDYzIDEgNDUgNTAgMTE2IDE0NSA4IDY0IDIwNCAxNTAgNzQgOTMgMTg0IDg5IDExMSAzOSAxMDggMTA4IDg1IDYxIDEzIDM2IDE1NCA2MSAKKzIxMCAxMTUgMyA4NCAxMDggMjIgMTUyIDIwOSAyMTYgMTAzIDE3NiAxMjMgMTI2IDU3IDE4MyAxMCAxOTkgMTA3IDE4NiAxNjEgMTA1IAorNTEgMzggNjkgMTg0IDI2IDIwMiAxNSAxNzEgNTcgOTcgNzcgMjQgOTAgMzMgMTgzIDE2NyA3MCA4MyAyOSAxMTAgNjcgNDkgMTIzIDYzIAorMTQ4IDE1OSAxOTAgMTQ4IDIgOTkgMTcyIDE1OSAzMyAxNjAgMjYgMTM5IDMgNDQgMTcgNDYgODkgNDAgMTAxIDg3IDYyIDY5IDI3IDM4IAorNiA1NSAyIDE2MiAxODQgMTgzIDE5MCAyMTEgMTMxIDYgMjEyIDIxMCAxMzggMTQ0IDEzMiA4NSAxMjQgMjUgNjAgOTEgMTEyIDk1IDk5IAorMjEyIDMwIDEyNiAxMjAgMTk1IDM0IDE5IDE1OCA3MSAyOCAyMTEgMjE3IDU2IDE2NyA3IDcxIDEyMiA3MCA2NiA3OSA2NSAxMzQgMjcgCis2MSAxNDcgMTAzIDE5OSA0NCA1NyAxMzcgNjUgNTAgMjAyIDc4IDgwIDgxIDEzNyAxMjggMTIgMTc3IDIyIDEyOSA2OCAxNjggMjMgNzQgCiszMCA1NSAxODIgMTc0IDIwOCAzIDIxIDk2IDIxOCAxMTIgMTU4IDExMSAxNiAxODcgMTc3IDUgMTc5IDE0MCA4MiA1OSA1MiAxODggMzYgCisyMCAyMTQgNjIgMjkgMTU2IDYyIDQ2IDEwNiAxMDcgMjkgNzAgMTI5IDkxIDg5IDE3NCA1MSAxNSA0NSAxMzYgNDkgMTAwIDE0MiAyMTcgCisxODIgODggNTUgNDggNCAxNjMgMjAgMTc0IDc0IDE1NiAxOTYgMTEzIDE1MSA5MCA5NiA5MiAxOTEgNyAxMzQgMTM0IDk0IDEwNiAxMzAgCisxNzAgMSAxMDYgMTkzIDc5IDI1IDE0NiAyNCA2NyAxMTIgMzIgMTkwIDg1IDIxMCA3NSAxNSAxMDggNDUgNzMgMzcgMTkzIDIwNSAxNjYgCisxOTQgMSAxNjkgMTAyIDIwNiA2NSAxOTcgMTI5IDUxIDIxOCAxOTggMjA4IDY2IDMzIDEyMCAxNTUgMTYzIDQzIDk1IDUgMTMzIDc4IAorMTAzIDIgMTg1IDEwNSAxMTQgMTY3IDkzIDQgNzcgODcgMTAyIDU3IDMgMjE4IDE3NSA2NyAxMzUgNTYgMTggMTY1IDkyIDE2OCA4NiAKKzIwMyAxNTcgMjEyIDEzIDU5IDc1IDEwOSAxODcgMjE3IDk2IDE1NSAyMDMgMzEgNzEgMTg1IDgyIDE5MyAxMTkgMTE2IDEyMiAyMDQgMTYgCis3IDQ4IDIwMSAyMiA4OSAxOTcgMTkyIDYzIDEyNSAxOCAzOSAxNzEgMTcgMTA5IDEwMSA2NCAxNDEgMTM4IDUwIDUzIDEzMyAxMDEgMTI3IAorMTUzIDQ1IDIwNyAxMDQgMTIxIDE4OCAxMyAyMTYgNjMgODUgMTQ3IDE2NiAxMDggNjggMjE0IDE4OCA1MyA4NyAzOSAxNDggOTYgMTc4IAorMTI0IDE4MiA0OCA2NyA3MiA0NCAyMTQgMTI1IDQxIDYzIDIxOSA5NyAyMTEgMTk0IDEzNSAxNiAzMCAxODkgMTMyIDIxOSAxOTEgNzAgCis0MyAxNTggMTM0IDE1NyAxMTggMzcgMTA3IDUyIDk0IDYwIDY4IDE5MSA0NyAxMjIgMTEwIDE1NyA1NSAyNSA4MyAxMiA0MyA3MiAyMDEgCisyMDIgMTAxIDEgMTIgMTE0IDEwIDIgMjggMTE3IDEzOCAyMDcgMTQ0IDEwOSAxNjQgNzYgMTY1IDE3OCAxMDEgNDEgOTAgMTkwIDE3MSAKKzE0MyAzMCAzMiA0MSAyMyAxMSAxMjEgMzEgMjUgMTIzIDEwMyAxMzYgMTM1IDE1MCA5NyAxNCAxMTUgNjYgMjEzIDEzMiA2MiAyMDMgOTQgCis4MyAyMDkgMTkgMjQgNCAxMDAgOCAxNTAgMTYwIF4KKzQ3NCAwIDEwNSA5MSAyMCAxNTYgMjcgMTkzIDIwOCAxNDIgMTc4IDEwNyA3OSAxOTkgODQgNDEgMiAxMjggMTY1IDE2MSAxMDkgODUgMTcgCisxNzQgMzcgODEgMTg3IDE1MCA3OCAxMjkgMTU5IDE5NCAxODQgOTIgODcgMjMgMjE0IDE4IDc3IDE1MyAyMDkgNjMgNDYgMTc5IDQ2IDMwIAorMTAyIDMzIDI5IDUwIDgyIDEyNiAxMDEgMjAzIDc4IDE0NyAyMCAxMzggNTMgMjcgMTE3IDIwNyAxNDggMTQ1IDMyIDE4MSAxNiAxMyA4NiAKKzE3OCAxNiAxNjIgMzAgMTc1IDE5OCAzMiA5MCA5OSA2NiAxNzcgMTEzIDE1NSAxMjQgMTg2IDgwIDQ0IDYwIDExOSA0OSAxMDYgMTc2IAorMTkyIDY1IDUyIDEwNiAyNyAyNiA2OCA5MiAxNCA4MCAyMTEgMjAwIDE2OSAyMTMgMjQgNDQgMTkxIDIwMiAxMDIgMTk3IDExMSAxNDAgCis5OSAxMjQgOTUgNTQgOTcgNDIgNTQgNzkgNjggMTEwIDk3IDEzMyA4MCAxMzUgMTk5IDE3NSAxODAgMTcxIDE0NiA4IDEzMSAxNDcgMTUxIAorMjIxIDIxOSA5IDUyIDE1IDEgNzkgNTAgMjcgNDQgNDIgMTQ1IDEwNSAxNSAxOSAxNjIgMTAzIDExOCAyMDEgNzIgMTA3IDE1MiAxNDIgCis4NyAxOTAgMTMyIDY4IDE5IDcxIDc3IDYyIDcwIDcgMTM3IDExNCA3NiAyMTQgMzYgMTYwIDk3IDc4IDIyMCA3NiAxNDEgOTMgMTU3IDU3IAorNjEgNTggOSAxMjUgMTgwIDQgNiA2NyAxODkgMTIwIDYxIDExMyA4MiAxODEgMTgzIDE1MyAxMzYgMTIwIDQzIDEzOSAyOSAxOTkgMjYgCisxMjMgMTc0IDE4NiAxMzggMTg0IDEgNjEgNzYgODMgMTc1IDEwNyA2IDE0MyA4MSAxMTQgMjA3IDc1IDg5IDI5IDMyIDEwOCA3MyAxMCAKKzQ2IDQ4IDE4NSA4NiAxMSA5OCAyMjEgODggMzUgMjIxIDE0NiAxNzUgNDkgODggOTMgMTM5IDE5NiAxMTcgMTg5IDY1IDIwMSAxNjMgMjQgCisyMDggNTEgMzkgNTEgMTcwIDEzNCAxIDMgNDkgMzMgMTEgMTg5IDEzOCAzNSAxNjYgNjQgMTE2IDIxMyAxMTUgNzAgMjUgMTExIDE2NyAKKzU4IDE0OSA2NiAxMjIgMzEgOTYgNjYgMTA0IDE3MCAxNTIgMTk3IDE2OSAxNDAgMTkwIDQxIDE1MSA3MiAxNjIgMTIgOTIgMTQ1IDE2MyAKKzE1NSA2OSAxMDQgMjEgMjA4IDIwMCA5NiA0OCAyMSA0IDYxIDQwIDEzOSAxNzggMzQgMjMgMTk2IDQ0IDEzMyA2MiA1MiAzMyA4NCAyMyAKKzE0MSAxODQgNzQgNCA3OSAxMjMgMTkyIDQ3IDE5MSA1MyAxNTggMjAwIDE1MSAxMzAgODAgNjIgMzQgMTcyIDE0MCA0MSAyMDYgMTU0IAorMTEyIDcwIDE3NCA1NSAxNjQgMTggMTkgMTMgMTU5IDEyMSAxOSA4OSAxNjAgMTE1IDUyIDE2NCAxNjcgNzYgMTAgMTE5IDEwNCAxODggCisxMjYgMjggMzggNzUgMjIwIDMgODUgOTAgOCA0MCA4IDIwNCA5MCAxNTQgMzkgMTQgMTcxIDEyOCAxNDcgNzggNTYgMjE2IDE5MSAzNSAKKzc1IDE0NyAxNjkgODIgNTAgMTAwIDIwOSA0NSAxODUgMTMgMTc3IDk1IDcyIDcxIDk1IDE0NSAxNCA5OCA3MiAxNDQgMzggMTQ4IDE2MyAKKzYgMTI1IDEwNyAxNzAgMyAxNDAgMTcyIDY3IDk4IDIwMyA1IDIwNCAxNyA5OCAzNiA4NyA0MSA3NSA3MSAxNjggODggMTcgMjUgMjAyIAorODQgMTE0IDU4IDEzMSA5MiA2OSAxNjIgMTYxIDM2IDE0MiAxNCAyNSAxMjkgMTQxIDExMSAxOCAxIDE1MiAyMTUgMzAgMTkzIDU5IDE5OCAKKzE4MSAzNCA5NiAxMzkgNDcgMTczIDE5MiAyMTQgMTA5IDEwMyAxMDAgMTE4IDEyOCAxNiAxMDQgMTEyIDE5OCBeCis0NjYgMCAyNSAyIDIxMyAyMTMgMzYgMTI0IDEzIDYyIDE1MCAyMjEgNjEgMTUwIDM5IDQ1IDE0OSAxMjQgMTA0IDEzNCAzOCAxMzAgMjA4IAorMTA5IDE4IDMyIDExMiAyMDEgOTYgMTU4IDE0OSAyMTUgMTc2IDIyIDQ0IDE0OSAzOSA4OCAxMzMgMjIwIDE4OSAxOTMgMjMgNDQgOSAKKzE4MyA4OSA0OCAxNjEgMjA0IDU0IDIyMiAxOTUgMTYzIDE2NyA0MCA0NSAxMDYgMTQwIDggNDkgMjA0IDE0NSA2OSA4MyAxNjkgODkgOTYgCisyNCA5MyAxMDMgODUgNDEgMyAzMSAxNTQgNTEgMjEwIDExNSAyMTMgNzkgMTA4IDEyIDE0NyAyMDkgMjA2IDEwMyAxNzYgMTEzIDExNiAKKzM3IDE3MyAxMCAxODkgMTAyIDE3NiAxNTYgMTAwIDM2IDMzIDY5IDE3NCAxNiAyMDIgNSAxNzEgNTIgODIgNzIgNCA4MCAyMyAxNzggCisxNjIgNzAgODMgMjkgMTA1IDY3IDM0IDExOCA0MyAxNDMgMTU0IDE4NSAxMzggMiA3OSAxNTcgMTQ5IDMzIDE2MCAyMSAxMjkgMjA4IDI0IAorMiAzMSA2OSAzNSA4MSA3MiA0NyA2NCAyMiAzOCAyMjEgNTUgMjIyIDE1MiAxNzkgMTY4IDE4MCAyMTEgMTIxIDEgMjA3IDIwMCAxMzMgCisxMjkgMTE3IDgwIDExNCAyNSA1MCA3NiAxMDIgODUgODQgMjEyIDMwIDExMSAxMTAgMTk1IDI5IDE0IDE1MyA1MSAyOCAxOTYgMjEyIDM2IAorMTY3IDIyMiA2MSAxMDcgNTUgNDYgNjQgNjUgMTE5IDIyMCAxMiA1NiAxMzcgOTMgMTk0IDI5IDU3IDEzNyA1MCAyMTAgMzAgMTk3IDc4IAorNjUgNzEgMTMyIDEyMyA3IDE3NyAyMiAxMjkgNjggMTY4IDMgNzQgMTAgNTAgMTY3IDE3NCAxOTggMjE4IDYgODYgMjE4IDk3IDE1OCAKKzEwNiA2IDE3NyAxNjIgMjEwIDE2NCAxMjUgNjIgNTkgNTIgMTczIDE2IDIwIDIxNCA0MiA5IDE0MSA1NyA0NiAxMDYgOTcgMjQgNTAgCisxMTkgODYgODQgMTY5IDQ2IDE1IDI1IDEzNiA0NCAxMDAgMTI3IDIwMiAxODIgODMgMzUgMzMgMjA5IDE1OCAxNSAxNTkgNjQgMTU2IAorMTkxIDEwOCAxNDYgNzUgOTYgNzIgMTgxIDIxNyAxMzQgMTI5IDc0IDk2IDExNSAxNjUgMjE2IDkxIDE4OCA1OSAxMCAxNDEgMTQgNjIgCisxMDcgMTIgMTkwIDY1IDIwNSA2MCAxMCA5OCAzMCA2MyAyMiAxNzggMjA1IDE1MSAxNzkgMjExIDE2NCA4MiAyMDYgNjAgMTkyIDExNCAKKzMxIDIwMyAxODggMTkzIDY2IDI4IDEwNSAxNDAgMTQ4IDMzIDc1IDUgMTI4IDY4IDgzIDIxMiAxNzAgOTUgMTA5IDE1MiA4OCAyMjQgNjcgCis3NyAxMDIgNDIgMyAyMTMgMTcwIDUyIDEyNSA1NiAzIDE2NSA4MiAxNjMgNzYgMTkzIDE1NyAxOTcgMjE4IDQ5IDcwIDg5IDE4MiAyMTcgCis5MSAxNDUgMjAzIDExIDU2IDE4MCA3NyAxOTMgMTE0IDExNiAxMjIgMTg5IDExIDcgNDMgMTkxIDE3IDc0IDE4NyAxODcgNTMgMTI1IDEzIAorMTkgMTY2IDIyMiAxMDQgOTEgNTQgMTMxIDEyMyA1MCAzMyAxMTggODYgMTI3IDE1MyA0NSAxOTcgODQgMTIxIDE4MyAyMjMgMjAxIDQ4IAorNzAgMTMyIDE2NiA4OCA0OCAyMDQgMTg4IDUzIDgyIDI5IDE0OCA4MSAxNjMgMTE5IDE3NyAyOCA1NyA1MiAzNCAyMDkgMTE1IDMxIDYzIAorMjA0IDk3IDIwNiAxOTQgMTIwIDEgMjUgMTg0IDEzMiAyMTQgMTc2IDY1IDI4IDE0OCAxMjQgMTQ3IDExOCAzNyA4NyA0MiA5NCA2MCA1OCAKKzE4NiA0NyAxMTIgMTEwIDE1MiA0NSAxNSA2OCAyMTcgNDMgNTcgMTg2IDE4NyAyMTggXgorNDc3IDEgMjAwIDEyIDEwMCAyMjMgMjAxIDE0IDExNyAxMjQgMjAwIDEzNyA5NSAxNjQgNzYgMTQ0IDE3MSAxMDEgMzQgMjEzIDgzIDE2OSAKKzE1MCAxNDMgMTYgMzIgMjAgMiAyMjQgMTE0IDMxIDE4IDEyMyA5NiAxMTUgMTM1IDEyOSA4MyAyMjAgMTA4IDU5IDE5MiAxMjUgNjIgCisxOTYgODAgNzYgMTk1IDIxOCAxNyAyMTAgNzkgMjE0IDEzNiA2IDEwNSA5MSA1IDE0MSAyNyAxODggMTkzIDEyNyAxNjggOTcgNzkgMTk5IAorODQgMzEgMjA5IDEyOCAxNTUgMTUxIDk0IDc1IDE3IDE1OSAzMiA3MSAxODcgMTQwIDYzIDEyNCAxNDkgMTc5IDE3OSA3NyA3MiAxMyAKKzIwNCAxOCA3MiAxMzggMTk5IDQ4IDM2IDE3OSAyNiAyNSA5NyAyOCAxNCAzMCA4MiAxMTYgODYgMTg4IDY4IDEzMiAxMzMgMzggNyAxMDcgCisxOTcgMTMzIDE0MCAxMiAxNjYgNiAzIDg2IDE3MyAxNiAxNTcgMTUgMTcwIDE4OCAxNyA4NSA4NCA0NiAxNzIgMTAzIDE0MCAxMTQgMTcxIAorNjUgMzkgNDUgMTE5IDM5IDk2IDE2NiAxODIgNDUgMzIgODYgMTIgMjYgNDggODcgMjI2IDgwIDIwMSAxOTAgMTU5IDIwOCAyNCA0NCAKKzE5MSAxOTcgODIgMTgyIDk2IDIxNyAxNDAgOTkgMTE5IDkwIDU0IDgyIDQyIDQ5IDc0IDUzIDk1IDc3IDEyMyA2MCAxMjAgMTk0IDE2NSAKKzE4MCAxNjYgMTMxIDIyNSAxMTYgMTM3IDE0NiAyMTEgMjE5IDQgMzcgNSAxIDY5IDQ1IDE3IDM0IDM3IDEzMCA4NSAxMCA5IDE0NyA4OCAKKzEwMyAxOTEgNzIgODcgMTUyIDEzMiA4NyAxNzUgMTIyIDU4IDE0IDY2IDc3IDU3IDUwIDIgMTIyIDEwOSA2MSAyMDkgMjYgMTUwIDkyIAorNTggMjA1IDcxIDEzNiA5MyAxNDcgMzcgNTYgNDggMjEyIDIyMSAxMTAgMTY1IDQgMjEzIDQ3IDE3NCAxMjAgNDEgMTEzIDY3IDE4MSAKKzE2OCAxNDggMTI2IDExNSAzMyAxMjQgMjQgMTg0IDExIDExMyAxNjkgMTg2IDEzOCAxODQgMjIzIDYxIDU2IDYzIDE3NSAxMDcgNiAxMjggCis4MSAxMTQgMjA3IDYwIDY5IDkgMjIgOTMgNzMgMzEgMzMgMTc1IDcxIDExIDk4IDIwNiA3MyAxNSAyMjEgMTQ2IDE2MCAzNCA4OCA4OCAKKzEzOSAxODYgMTAyIDE4OSA1NSAxODYgMTUzIDkgMTk4IDQ2IDE5IDUxIDE2NSAxMjkgMjA4IDIxNSA0OSAyMyA2IDE3OSAxMjggMzAgCisxNTYgNjQgMTExIDIwMyAxMDUgNTUgMTAgMTExIDE1MiA1OCAxMzkgNjEgMTA3IDIxIDkxIDU2IDk5IDE3MCAxMzcgMTk3IDE2OSAxMzUgCisxODAgNDEgMTM2IDU3IDE1MiA3IDkyIDE0NSAxNTggMTU1IDQ5IDg5IDE2IDIwOCAyMDAgODYgNDggMjEgMjE2IDUxIDQwIDEzNCAxNzggCisyNCA4IDE5NiAyOSAxMTggNTIgNDIgMTMgNzkgMjMgMTMxIDE3NCA2OSAyMjEgNTkgMTE4IDE3NyAzNyAxODEgNDMgMTUzIDE4NSAxNTEgCisxMzAgNzAgNDcgMzQgMTYyIDEyNSAyNiAyMDEgMTM5IDExMiA2NSAxNjQgNDAgMTQ5IDMgMjI2IDIyMCAxNTkgMTA2IDE5IDc0IDE1NSAKKzEwMCA0NyAxNTkgMTU3IDY2IDIxNyAxMDQgMTA0IDE3OCAxMjYgMTMgMjggNjUgMjE1IDIyNSA2NSA5MCAzIDM1IDIxNSAxODkgNzAgCisxNDkgMzkgMjIxIDE2MSAxMjMgMTQ3IDczIDUxIDIxNiAxNzYgMzUgNzUgMTQyIDE1NCA2MiAzNSA5MCAxOTQgNDAgMTg1IDIyNSAxNjcgCis5NSA2MiA3MSA4NSAxMzUgNCA4OCA1MiAxNDQgMTggMTM4IDE0OCAxIDEyMCA5MiAxNjAgMjEwIDEzMCAxNzIgNTIgOTMgMTk4IDIyMiAKKzE5OSAyMjQgMTkgXgorNDc5IDAgMzYgNzMgMTMgNDcgNTcgMTU0IDYwIDMgMjI2IDE4OCA3MCAxMDAgNTEgMTMxIDY0IDYyIDE2MiAxNjEgMTUgMTQyIDE0IDExIAorMTE1IDE0MSA5NyAyMTkgMjE2IDEzOCAyMDEgMTYgMTcyIDMxIDE5OCAxNjcgNiA3NSAxMjUgMjYgMTczIDE5MiAxOTMgOTUgNzUgOTMgCisxMTEgMTE0IDIyNCA3NiA5MSAyMTMgMTMgMjI3IDIwMSAyMTMgMjggMTIwIDEgNTAgMTUwIDIxMyA0NSAxNDIgMzEgMzMgMTQ1IDEyNCAKKzkyIDEzMCAzNCAxMjYgMjA0IDEwOSAyIDE2IDEwOCAyMDEgODAgMTUwIDE0OSAyMTUgMTcyIDE0IDI4IDEzNyAyMyA4MCAxMzMgMjA4IAorMTg1IDE4OSAxOSAzNiA5IDE4MyA3NyA0MCAxNDkgMjAwIDUwIDIxNCAxOTEgMTYzIDE1OSAzNiA0MSA5OCAxMzYgOCAzNyAyMDQgMTQxIAorNjUgNzUgMTU3IDg5IDg0IDEyIDgxIDk5IDg1IDI1IDIyNCAyNyAxNTQgNDMgMjEwIDExNSAyMDUgNzUgMTA4IDQgMTQzIDIwOSAxOTggCisxMDMgMTc2IDEwNSAxMDggMjEgMTY1IDEwIDE4MSA5OCAxNjggMTUyIDk2IDI0IDI5IDY5IDE2NiA4IDIwMiAyMjYgMTcxIDQ4IDcwIDY4IAorMjE3IDcyIDE1IDE3NCAxNTggNzAgODMgMjkgMTAxIDY3IDIyIDExNCAyNyAxMzkgMTUwIDE4MSAxMzAgMiA2MyAxNDUgMTQxIDMzIDE2MCAKKzE3IDEyMSAxOTYgOCAyMTkgMTkgNTMgMzEgNjUgNjAgMzUgNjAgMTggMzggMjE3IDU1IDIyMiAxNDQgMTc1IDE1NiAxNzIgMjExIDExMyAKKzIyNiAyMDMgMTkyIDEyOSAxMTcgMTA1IDc2IDEwNiAyNSA0MiA2NCA5NCA3NyA3MiAyMTIgMzAgOTkgMTAyIDE5NSAyNSAxMCAxNDkgMzUgCisyOCAxODQgMjA4IDIwIDE2NyAyMTggNTMgOTUgNDMgMzAgNTIgNjUgMTA3IDIyMCA1MiAxMjkgODUgMTkwIDE3IDU3IDEzNyAzOCAyMDIgCisxNCAxOTMgNzggNTMgNjMgMTI4IDExOSAzIDE3NyAyMiAxMjkgNjggMTY4IDIxNiA3NCAyMjMgNDYgMTU1IDE3NCAxOTAgMjE0IDIyMyAKKzc4IDIxOCA4NSAxNTggMTAyIDIyNyAxNjkgMTUwIDE5OCAxNTIgMTEzIDQ2IDU5IDUyIDE2MSAyMCAyMTQgMjYgMjIyIDEyOSA1MyA0NiAKKzEwNiA4OSAyMCAzNCAxMTEgODIgODAgMTY1IDQyIDE1IDkgMTM2IDQwIDEwMCAxMTUgMTkwIDE4MiA3OSAxOSAyMSAxOTcgMTU0IDExIAorMTQ3IDU2IDE1NiAxODcgMTA0IDE0MiA2MyA5NiA1NiAxNzMgMjA5IDEzNCAxMjUgNTggODggMTAzIDE2MSAyMTIgNzkgMTg0IDQzIDIyNyAKKzEzNyA2IDU4IDEwMyAyMjUgMTkwIDQ5IDIwMSA0OCA2IDkwIDE4IDU1IDEwIDE2NiAyMDUgMTM5IDE2NyAyMDMgMTYwIDY2IDIwNiA1NiAKKzE4OCAxMDIgMTUgMTkxIDE4MCAxODEgNjYgMjQgOTMgMTI4IDEzNiAyNSA1OSA1IDEyNCA2MCA2NyAyMDQgMTU4IDg3IDEwNSAxNDAgODQgCisyMjQgNTkgNjkgMTAyIDMwIDMgMjA5IDE2NiA0MCAxMTcgNTYgMjIwIDE2NSA3NCAxNTkgNjggMTg1IDE1NyAxODUgMjA2IDQxIDY2IDczIAorMTc4IDIxNyA4NyAxMzcgMjAzIDIyNCA0NCAxNzYgNzMgMTkzIDExMCAxMTYgMTIyIDE3NyA3IDcgMzkgMTgzIDEzIDYyIDE3OSAxODMgCis0NSAxMjUgOSAzIDE2MiAyMTAgMTAwIDgzIDQ2IDEyMyAxMTEgNTAgMTcgMTA2IDc0IDEyNyAxNTMgNDUgMTg5IDY4IDEyMSAxNzkgMjE1IAorMTg5IDM2IDU4IDEyMCAxNjYgNzIgMzIgMTk2IDE4OCA1MyA3OCAyMSAxNDggNjkgMTUxIDExNSAxNzMgMTIgNDkgMzYgMjYgMjA1IDEwNyAKKzIzIDYzIDE5MiAxMTIgXgorNDg1IDEgMjAwIDE5NCAxMDIgMjE0IDE5IDE3OCAxMzIgMjA4IDE1OCA1OSAxMCAxMzYgMTEyIDEzNSAxMTggMzcgNjMgMzAgOTQgNjAgCis0NiAxODAgNDcgMTAwIDExMCAxNDYgMzMgMyA1MCAxOTkgNDMgMzkgMTY4IDE2OSA5MCAxODggMTIgOTIgMjE5IDE4OSA2IDExNyAxMTYgCisxOTYgMTMzIDg3IDE2NCA3NiAxMzIgMTY3IDEwMSAzMCAyMDkgNzkgMTU3IDEzOCAxNDMgOCAzMiA4IDIyMSAyMjAgMTEwIDMxIDE0IAorMTIzIDkyIDEwMyAxMzUgMTE3IDc1IDIxMiAxMDQgNTUgMTgwIDEyMSA2MiAxOTIgNzIgNzIgMTg3IDIwNiAxMyAyMDIgNjcgMjA2IDEyOCAKKzIyMSAxMDUgOTEgMjI0IDEyOSAyNyAxODQgMTgxIDExNSAxNjAgODkgNzkgMTk5IDg0IDIzIDE5NyAxMjggMTQ3IDE0MyA4MiA2NyAxNyAKKzE0NyAyOCA2MyAxODcgMTMyIDUxIDEyMCAxNDEgMTY3IDE3NSA2NSA2MCA1IDE5NiAxOCA2OCAxMjYgMTkxIDM2IDI4IDE3OSAxMCAyMSAKKzkzIDI0IDIgMTQgODIgMTA4IDc0IDE3NiA2MCAxMjAgMjE1IDEyOSAyNiAyMjIgOTkgMTg5IDEyMSAxMzYgMjI3IDE1NCAyMjkgMjI2IAorODYgMTY5IDE2IDE1MyAzIDE2NiAxODAgNSA4MSA3MiAzMCAxNjggOTUgMTI4IDEwNiAxNTkgNTMgMzUgMzMgMTE5IDMxIDg4IDE1OCAKKzE3NCAyOSAxNiA3MCAyNiAzMiA4MyAyMTggODAgMTkzIDE4MiAxNTEgMjA0IDI0IDQ0IDE5MSAxOTMgNjYgMTcwIDg0IDIxMyAxNDAgOTkgCisxMTUgODYgNTQgNzAgNDIgNDUgNzAgNDEgODMgNjEgMTE1IDQ0IDEwOCAxOTAgMTU3IDE4MCAxNjIgMTE5IDIyMSAxMDQgMTI5IDE0MiAKKzIwMyAyMTkgMjUgMjI4IDEgNjEgNDEgOSAyNiAzMyAxMTggNjkgNiAxIDEzNSA3NiA5MSAxODMgNzIgNzEgMTUyIDEyNCA4NyAxNjMgCisxMTQgNTAgMTAgNjIgNzcgNTMgMzQgMjI5IDExMCAxMDUgNDkgMjA1IDE4IDE0MiA4OCA0MiAxOTMgNjcgMTMyIDkzIDEzOSAyMSA1MiAKKzQwIDIwNCAyMTMgOTggMTUzIDQgMjAxIDMxIDE2MiAxMjAgMjUgMTEzIDU1IDE4MSAxNTYgMTQ0IDExOCAxMTEgMjUgMTEyIDIwIDE3MiAKKzIzMCAxMDUgMTY1IDE4NiAxMzggMTg0IDIyMyA2MSA0MCA0NyAxNzUgMTA3IDYgMTE2IDgxIDExNCAyMDcgNDggNTMgMjI0IDE0IDgxIAorNzMgMjIzIDE5IDIxIDE2NyA1OSAxMSA5OCAxOTQgNjEgMjMwIDIyMSAxNDYgMTQ4IDIyIDg4IDg0IDEzOSAxNzggOTAgMTg5IDQ3IDE3NCAKKzE0NSAyMjggMTkwIDQyIDMgNTEgMTYxIDEyNSAxOTYgMjA3IDQ5IDE1IDIgMTcxIDEyMCAyNiAxNDggNjQgMTA3IDE5NSA5NyA0MyAyMjkgCisxMTEgMTQwIDU4IDEzMSA1NyA5NSAxMyA4NyA0OCA5NSAxNzAgMTI1IDE5NyAxNjkgMTMxIDE3MiA0MSAxMjQgNDUgMTQ0IDMgOTIgMTQ1IAorMTU0IDE1NSAzMyA3NyAxMiAyMDggMjAwIDc4IDQ4IDIxIDIwOCA0MyA0MCAxMzAgMTc4IDE2IDIyNyAxOTYgMTcgMTA2IDQ0IDM0IDIyOCAKKzc1IDIzIDEyMyAxNjYgNjUgMjE3IDQzIDExNCAxNjUgMjkgMTczIDM1IDE0OSAxNzMgMTUxIDEzMCA2MiAzNSAzNCAxNTQgMTEzIDE0IAorMTk3IDEyNyAxMTIgNjEgMTU2IDI4IDEzNyAyMjIgMjE0IDIwOCAxNTkgOTQgMTkgNjIgMTUxIDg4IDQzIDE1NSAxNDkgNTggMjA1IDkyIAorMTA0IDE3MCAxMjYgMSAyMCA1NyAyMTEgMjI1IDQ5IDkwIDIzMCAzMSAyMDMgMTc3IDU0IDE0NSAzOSAyMDkgMTUzIDExOSAxNDcgNjkgCis0NyAyMTYgMTY0IDM1IDc1IDEzOCAxNDIgNDYgMjMgODIgMTgyIDM2IDE4NSAxOTggXgorNDgzIDEgMTU1IDk1IDUwIDcxIDczIDEyMyAyMjUgNzYgMjggMTQ0IDIyNyAxMjYgMTMwIDIyOCAxMTQgNzQgMTQ4IDE5MiAxMTggMTcyIAorMzQgODcgMTkyIDIxNiAxOTMgMjA2IDU0IDM2IDY1IDIzMCAzMSA0OSAxNDYgNDQgMjI4IDIxNCAxODAgNjIgOTIgNDcgMTMxIDQ4IDU4IAorMTYyIDE2MSAzIDE0MiAxNCAzIDEwNyAxNDEgODkgMjA3IDIxMiAxMzAgMTkzIDggMTYwIDE1IDE5OCAxNTkgMjIzIDYzIDExNyAxNCAKKzE3MyAxOTIgMTgxIDg3IDU5IDg5IDEwNyAxMDYgMjE2IDYwIDc5IDIwMSAxIDIyNyAxODkgMjEzIDIwIDExNiAyMjIgMzggMTUwIDIwNSAKKzI5IDEzNCAyMyAyMSAxNDEgMTI0IDgwIDEyNiAzMCAxMjIgMjAwIDEwOSAyMTkgMTA0IDIwMSA2NCAxNDIgMTQ5IDIxNSAxNjggNiAxMiAKKzEyNSA3IDcyIDEzMyAxOTYgMTgxIDE4NSAxNSAyOCA5IDE4MyA2NSAzMiAxMzcgMTk2IDQ2IDIwNiAxODcgMTYzIDE1MSAzMiAzNyA5MCAKKzEzMiA4IDI1IDIwNCAxMzcgNjEgNjcgMTQ1IDg5IDcyIDY5IDk1IDg1IDkgMjIwIDIzIDE1NCAzNSAyMTAgMTE1IDE5NyA3MSAxMDggCisyMjkgMTM5IDIwOSAxOTAgMTAzIDE3NiA5NyAxMDAgNSAxNTcgMTAgMTczIDk0IDE2MCAxNDggOTIgMTIgMjUgNjkgMTU4IDIwMiAyMjIgCisxNzEgNDQgNTggNjQgMjA1IDY0IDcgMTcwIDE1NCA3MCA4MyAyOSA5NyA2NyAxMCAxMTAgMTEgMTM1IDE0NiAxNzcgMTIyIDIgNDcgMTMzIAorMTMzIDMzIDE2MCAxMyAxMTMgMTg0IDIyNSAyMTEgNyAzNyAyNyA0OSA0OCAyMyA1NiAxNCAzOCAyMTMgNTUgMjIyIDEzNiAxNzEgMTQ0IAorMTY0IDIxMSAxMDUgMjI2IDE5OSAxODQgMTI1IDEwNSA5MyA3MiA5OCAyNSAzNCA1MiA4NiA2OSA2MCAyMTIgMzAgODcgOTQgMTk1IDIxIAorNiAxNDUgMTkgMjggMTcyIDIwNCA0IDE2NyAyMTQgNDUgODMgMzEgMTQgNDAgNjUgOTUgMjIwIDIyMSA0OCAxMjEgNzcgMTg2IDUgNTcgCisxMzcgMjYgMTk0IDIzMSAxODkgNzggNDEgNTUgMTI0IDExNSAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMjA0IDc0IDIxMSA0MiAxNDMgMTc0IAorMTgyIDIxMCAyMTUgNzAgMjE4IDczIDE1OCA5OCAyMjMgMTYxIDEzOCAxODYgMTQwIDEwMSAzMCA1OSA1MiAxNDkgMjE3IDIwIDIxNCAxMCAKKzIxMCAxMTcgNDkgNDYgMTA2IDgxIDE2IDE4IDEwMyA3OCA3NiAxNjEgMzggMTUgMjI2IDEzNiAzNiAxMDAgMTAzIDE3OCAxODIgNzUgMyAKKzkgMTg1IDE1MCA3IDEzNSA0OCAxNTYgMTgzIDEwMCAxMzggNTEgOTYgNDAgMTY1IDIwMSAxMzQgMTIxIDQyIDgwIDkxIDE1NyAyMDggNjcgCisxODAgMjcgMjE5IDEzMyAyMzEgNTQgOTkgMjEzIDE5MCAzMyAxOTcgMzYgMiA4MiA2IDQ3IDIzMSAxNTQgMjA1IDEyNyAxNTUgMTk1IAorMTU2IDUwIDIwNiA1MiAxODQgOTAgMjMyIDE3OSAxNzIgMTY5IDY2IDIwIDgxIDExNiAxMjQgMTcgNDMgNSAxMjAgNTIgNTEgMTk2IDE0NiAKKzc5IDEwMSAxMjggODAgMjI0IDUxIDYxIDEwMiAxOCAzIDIwNSAxNjIgMjggMTA5IDU2IDIxMiAxNjUgNjYgMTU1IDYwIDE3NyAxNTcgCisxNzMgMTk0IDMzIDYyIDU3IDE3NCAyMTcgODMgMTI5IDIwMyAyMTIgMzIgMTcyIDY5IDE5MyAxMDYgMTE2IDEyMiAxNjUgMyA3IDM1IAorMTc1IDkgNTAgMTcxIDE3OSAzNyAxMjUgNSAyMjAgMTU4IDE5OCA5NiA3NSAzOCAxMTUgOTkgNTAgMSA5NCA2MiAxMjcgMTUzIDQ1IDE4MSAKKzUyIDEyMSAxNzUgMjA3IDE3NyAyNCA0NiAxMDggMTY0IF4KKzQ5OSAwIDQ0IDQgMTgyIDE4OCA1MyA3MSA3IDE0OCA0OCAxMzAgMTA4IDE2NiAyMjAgMzUgOCAxMiAxOTggOTMgOSA2MyAxNzEgOTcgCisxOTUgMTk0IDg3IDIwNCAxNCAxNzMgMTMyIDIwMyAxNDMgNTQgMjMxIDEyNiAxMDIgMTI1IDExOCAzNyA0MyAyMCA5NCA2MCAzNiAxNzUgCis0NyA5MCAxMTAgMTQxIDIzIDIyOSAzNSAxODQgNDMgMjQgMTUzIDE1NCA4NSAxNzMgMTIgODIgMjE0IDE3NCAyMzIgMTE3IDEwNiAxOTEgCisxMjggNzcgMTY0IDc2IDExNyAxNjIgMTAxIDI1IDIwNCA3NCAxNDIgMTIzIDE0MyAyMzQgMzIgMjI5IDIxMSAyMTUgMTA1IDMxIDkgMTIzIAorODcgODggMTM1IDEwMiA2NSAyMDIgOTkgNTAgMTY1IDExNiA2MiAxODcgNjIgNjcgMTc3IDE5MSA4IDE5MiA1MiAxOTYgMTE4IDIwNiAKKzEwNSA5MSAyMTQgMTE0IDI3IDE3OSAxNjYgMTAwIDE1MCA3OSA3OSAxOTkgODQgMTMgMTgyIDEyOCAxMzcgMTMzIDY3IDU3IDE3IDEzMiAKKzIzIDUzIDE4NyAxMjIgMzYgMTE1IDEzMSAxNTIgMTcwIDUwIDQ1IDIzMSAxODYgMTggNjMgMTExIDE4MSAyMSAxOCAxNzkgMjI2IDE2IAorODggMTkgMjIzIDIzMCA4MiA5OCA1OSAxNjEgNTAgMTA1IDIwMCAxMjQgMTEgMjA3IDg5IDE3OSAxMDYgMTMxIDIxMiAxMzkgMjI0IDIyMSAKKzg2IDE2NCAxNiAxNDggMjI0IDE2MSAxNzAgMjI2IDc2IDU3IDEwIDE2MyA4NSAxMTMgOTYgMTQ0IDM4IDMwIDE4IDExOSAyMSA3OCAxNDggCisxNjQgOSAyMzIgNTAgMjIxIDI2IDEyIDc4IDIwOCA4MCAxODMgMTcyIDE0MSAxOTkgMjQgNDQgMTkxIDE4OCA0NiAxNTUgNjkgMjA4IAorMTQwIDk5IDExMCA4MSA1NCA1NSA0MiA0MCA2NSAyNiA2OCA0MSAxMDUgMjQgOTMgMTg1IDE0NyAxODAgMTU3IDEwNCAyMTYgODkgMTE5IAorMTM3IDE5MyAyMTkgMjMxIDEwIDIyMyAxIDUxIDM2IDIzNSAxNiAyOCAxMDMgNDkgMSAyMjcgMTIwIDYxIDc2IDE3MyA3MiA1MSAxNTIgCisxMTQgODcgMTQ4IDEwNCA0MCA1IDU3IDc3IDQ4IDE0IDIyOSA5NSAxMDAgMzQgMjAwIDggMTMyIDgzIDIyIDE3OCA2MiAxMjcgOTMgMTI5IAorMSA0NyAzMCAxOTQgMjAzIDgzIDEzOCA0IDE4NiAxMSAxNDcgMTIwIDUgMTEzIDQwIDE4MSAxNDEgMTM5IDEwOCAxMDYgMTUgOTcgMTUgCisxNTcgMjIwIDk1IDE2MCAxODYgMTM4IDE4NCAyMjMgNjEgMjAgMjcgMTc1IDEwNyA2IDEwMSA4MSAxMTQgMjA3IDMzIDMzIDIwOSA0IDY2IAorNzMgMjE4IDQgNiAxNTcgNDQgMTEgOTggMTc5IDQ2IDIxNSAyMjEgMTQ2IDEzMyA3IDg4IDc5IDEzOSAxNjggNzUgMTg5IDM3IDE1OSAKKzEzNSAyMTggMTgwIDM3IDIxOSA1MSAxNTYgMTIwIDE4MSAxOTcgNDkgNSAyMzMgMTYxIDExMCAyMSAxMzggNjQgMTAyIDE4NSA4NyAyOCAKKzIxOSAxMTEgMTI1IDU4IDEyMSA1MiA4MCAzIDgyIDM4IDkwIDE3MCAxMTAgMTk3IDE2OSAxMjYgMTYyIDQxIDEwOSAzMCAxMzQgMjM0IAorOTIgMTQ1IDE0OSAxNTUgMTMgNjIgNyAyMDggMjAwIDY4IDQ4IDIxIDE5OCAzMyA0MCAxMjUgMTc4IDYgMjE3IDE5NiAyIDkxIDM0IDI0IAorMjEzIDcwIDIzIDExMyAxNTYgNjAgMjEyIDIzIDEwOSAxNTAgMTkgMTYzIDI1IDE0NCAxNTggMTUxIDEzMCA1MiAyMCAzNCAxNDQgOTggCisyMzUgMTkyIDExMiAxMTIgNTYgMTQ2IDEzIDEyMiAyMTIgMTk5IDE5MyAxNTkgNzkgMTkgNDcgMTQ2IDczIDM4IDE1MCAxMzkgNDggMTkwIAorNzcgMTA0IDE2MCAxMjYgMjIyIDEwIDQ3IDIwNiAyMjUgMjkgOTAgMjMwIDI2IDE4OCAxNjIgMzQgMTQwIDM5IDE5NCAxNDMgMTE0IDE0NyAKKzY0IDQyIDIxNiAxNDkgMTc0IF4KKzQ3MyAxIDc1IDEzMSAxMjEgMTggMiA2OCAxNjEgMjkgMTg1IDIwMyAxNDUgOTUgNDAgNzEgNjMgMTEzIDIyMCA2NiA4IDE0NCAyMTIgCisxMTYgMTE1IDIyOCAxMDkgNTkgMTM4IDE3NyAxMDggMTcyIDE5IDgyIDE4NyAyMTEgMTg4IDE5MSAzNCAzNiA1NSAyMTUgMTEgMzkgMTM2IAorMjQgMjIzIDE5OSAxNzAgNTIgODIgNDIgMTMxIDI4IDUzIDE2MiAxNjEgMjI2IDE0MiAxNCAyMzEgOTcgMTQxIDc5IDE5MiAyMDcgMTIwIAorMTgzIDIzNiAxNDUgMjMzIDE5OCAxNDkgMjA4IDQ4IDEwNyAyMzcgMTczIDE5MiAxNjYgNzcgMzkgODQgMTAyIDk2IDIwNiA0MCA2NCAKKzE4NiAyMjQgMjI3IDE3NCAyMTMgMTAgMTExIDIxMiAyMyAxNTAgMTk1IDkgMTI0IDEzIDYgMTM2IDEyNCA2NSAxMjEgMjUgMTE3IDE5NSAKKzEwOSAyMDQgMjE4IDk5IDIwMSA0NCAxMzIgMTQ5IDIxNSAxNjMgMjM0IDIzMCAxMTAgMjI1IDYyIDEzMyAxODEgMTc2IDE4MCAxMCAxOCAKKzkgMTgzIDUwIDIyIDEyMiAxOTEgNDEgMTk2IDE4MiAxNjMgMTQxIDI3IDMyIDgwIDEyNyA4IDEwIDIwNCAxMzIgNTYgNTcgMTMwIDg5IAorNTcgMjIzIDU0IDkwIDg1IDIyNyAyMTUgMTggMTU0IDI1IDIxMCAxMTUgMTg3IDY2IDEwOCAyMjQgMTM0IDIwOSAxODAgMTAzIDE3NiA4NyAKKzkwIDIyMyAxNDcgMTAgMTYzIDg5IDE1MCAxNDMgODcgMjM1IDIwIDY5IDE0OCAyMjggMjAyIDIxNyAxNzEgMzkgNDMgNTkgMTkwIDU0IAorMjM1IDE2NSAxNDkgNzAgODMgMjkgOTIgNjcgMjMzIDEwNSAyMjkgMTMwIDE0MSAxNzIgMTEyIDIgMjcgMTE4IDEyMyAzMyAxNjAgOCAKKzEwMyAxNjkgMjEwIDIwMSAyMzAgMTcgMjIgMjkgMzMgOCA1MSA5IDM4IDIwOCA1NSAyMjIgMTI2IDE2NiAxMjkgMTU0IDIxMSA5NSAyMjYgCisxOTQgMTc0IDEyMCA5MCA3OCA2NyA4OCAyNSAyNCAzNyA3NiA1OSA0NSAyMTIgMzAgNzIgODQgMTk1IDE2IDEgMTQwIDIzNyAyOCAxNTcgCisxOTkgMjIyIDE2NyAyMDkgMzUgNjggMTYgMjMyIDI1IDY1IDgwIDIyMCAyMTEgNDMgMTExIDY3IDE4MSAyMjggNTcgMTM3IDExIDE4NCAKKzIxNiAxODQgNzggMjYgNDUgMTE5IDExMCAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMTg5IDc0IDE5NiAzNyAxMjggMTc0IDE3MiAyMDUgCisyMDUgNjAgMjE4IDU4IDE1OCA5MyAyMTggMTUxIDEyMyAxNzEgMTI1IDg2IDEwIDU5IDUyIDEzNCAyMDIgMjAgMjE0IDIyOCAxOTUgMTAyIAorNDQgNDYgMTA2IDcxIDExIDIzNiA5MyA3MyA3MSAxNTYgMzMgMTUgMjExIDEzNiAzMSAxMDAgODggMTYzIDE4MiA3MCAyMjEgMjMyIDE3MCAKKzE0NSAyIDEyMCAzOCAxNTYgMTc4IDk1IDEzMyAzNiA5NiAyMCAxNTUgMTkxIDEzNCAxMTYgMjIgNzAgNzYgMTUyIDIwMyA1MiAxNzUgNyAKKzIwOSAxMjggMjI2IDQ5IDk0IDE5OCAxOTAgMTMgMTkyIDIxIDIzNSA3MiAyMjkgMzcgMjIxIDEzOSAyMDUgMTEyIDE0MCAxODUgMTUxIAorMzAgMjA2IDQ3IDE3OSA3NSAyMTcgMTY0IDE2MiAxNTQgNjYgMTUgNjYgMTAxIDEwOSA3IDIzIDUgMTE1IDQyIDMxIDE4NiAxMzEgNjkgCis5NiAxMTMgNzUgMjI0IDQxIDUxIDEwMiAzIDMgMjAwIDE1NyAxMyA5OSA1NiAyMDIgMTY1IDU2IDE1MCA1MCAxNjcgMTU3IDE1OCAxNzkgCisyMyA1NyAzNyAxNjkgMjE3IDc4IDExOSAyMDMgMTk3IDE3IDE2NyA2NCAxOTMgMTAxIDExNiAxMjIgMTUwIDIzNiA3IDMwIDE2NSA0IDM1IAorMTYxIDE3NCAyNyAxMjUgMjA1IDE1MyAxNDggXgorNTAyIDEgODkgNjEgMjQgMTAxIDc4IDUwIDIxMyA3MyA0MSAxMjcgMTUzIDQ1IDE2NyAyNCAxMjEgMTY4IDE5MyAxNTYgMyAyNSA4NyAKKzE2NiAyOCAyMjggMTc0IDE4OCA1MyA2NyAyMzkgMTQ4IDM2IDExOCAxMDQgMTYyIDIwOCAyNyAyMzIgNCAxOTQgODUgMSA2MyAxNTkgOTcgCisxOTEgMTk0IDc1IDE5NiAxMCAxNjkgMTMyIDE5OSAxMzEgNTAgMjIzIDExOCA5NCAxMTcgMTE4IDM3IDI3IDEyIDk0IDYwIDI4IDE3MSAKKzQ3IDgyIDExMCAxMzcgMTUgMjI1IDIzIDE3MiA0MyAxMiAxNDEgMTQyIDgxIDE2MSAxMiA3NCAyMTAgMTYyIDIyOCAxMTcgOTggMTg3IAorMTI0IDY5IDE2NCA3NiAxMDUgMTU4IDEwMSAyMSAyMDAgNzAgMTMwIDExMSAxNDMgMjMwIDMyIDIyMSAyMDMgMjExIDEwMSAzMSA1IDEyMyAKKzgzIDc2IDEzNSA5MCA1NyAxOTQgOTUgNDYgMTUzIDExMiA2MiAxODMgNTQgNjMgMTY5IDE3OSA0IDE4NCA0MCAxODggMTEwIDE5NCAxMDUgCis5MSAyMDYgMTAyIDI3IDE3NSAxNTQgODggMTQyIDcxIDc5IDE5OSA4NCA1IDE3MCAxMjggMTI5IDEyNSA1NSA0OSAxNyAxMjAgMTkgNDUgCisxODcgMTE0IDI0IDExMSAxMjMgMTQwIDE2NiAzOCAzMyAyMjcgMTc4IDE4IDU5IDk5IDE3MyA5IDEwIDE3OSAyMTQgMTIgODQgMTUgMjE1IAorMjE4IDgyIDkwIDQ3IDE0OSA0MiA5MyAxODggMTIwIDIzOSAxOTUgODEgMTcxIDk0IDEyNyAyMDAgMTI3IDIyMCAyMTcgODYgMTYwIDE2IAorMTQ0IDIxNiAxNTcgMTYyIDIxOCA3MiA0NSAyMzQgMTU5IDc3IDEwMSA4OCAxMzIgMjYgMjYgNiAxMTkgMTMgNzAgMTQwIDE1NiAyMzMgCisyMjAgMzQgMjEzIDI2IDIzNiA3NCAyMDAgODAgMTc1IDE2NCAxMzMgMTk1IDI0IDQ0IDE5MSAxODQgMzAgMTQzIDU3IDIwNCAxNDAgOTkgCisxMDYgNzcgNTQgNDMgNDIgMzYgNjEgMTQgNTYgMjUgOTcgOCA4MSAxODEgMTM5IDE4MCAxNTMgOTIgMjEyIDc3IDExMSAxMzMgMTg1IAorMjE5IDIzMSAyMzggMjE5IDEgNDMgMzIgMjMxIDggMjQgOTEgMzMgMjM3IDIyMyAxMDggNDkgNjQgMTY1IDcyIDM1IDE1MiAxMDYgODcgCisxMzYgOTYgMzIgMSA1MyA3NyA0NCAyMzggMjI5IDgzIDk2IDIyIDE5NiAxMjQgNzkgNiAxNjYgNTggMTIzIDkzIDEyMSAyMjUgNDMgMjIgCisxODYgMTk1IDcxIDEyNiA0IDE3NCAyMzUgMTM1IDEyMCAyMjkgMTEzIDI4IDE4MSAxMjkgMTM1IDEwMCAxMDIgNyA4NSAxMSAxNDUgMjEyIAorODcgMTU2IDE4NiAxMzggMTg0IDIyMyA2MSA0IDExIDE3NSAxMDcgNiA4OSA4MSAxMTQgMjA3IDIxIDE3IDE5NyAyMzYgNTQgNzMgMjE0IAorMjMyIDIzNCAxNDkgMzIgMTEgOTggMTY3IDM0IDIwMyAyMjEgMTQ2IDEyMSAyMzUgODggNzUgMTM5IDE2MCA2MyAxODkgMjkgMTQ3IDEyNyAKKzIxMCAxNzIgMzMgMjA3IDUxIDE1MiAxMTYgMTY5IDE4OSA0OSAyMzcgMjMzIDE1MyAxMDIgMTcgMTMwIDY0IDk4IDE3NyA3OSAxNiAyMTEgCisxMTEgMTEzIDU4IDExMyA0OCA2OCAyMzUgNzggMzAgODYgMTcwIDk4IDE5NyAxNjkgMTIyIDE1NCA0MSA5NyAxOCAxMjYgMjM0IDkyIAorMTQ1IDE0NSAxNTUgMjM3IDUwIDMgMjA4IDIwMCA2MCA0OCAyMSAxOTAgMjUgNDAgMTIxIDE3OCAyMzggMjA5IDE5NiAyMzAgNzkgMjYgCisxNiAyMDEgNjYgMjMgMTA1IDE0OCA1NiAyMDggNyAxMDUgMTM4IDExIDE1NSAxNyAxNDAgMTQ2IDE1MSAxMzAgNDQgOCAzNCAxMzYgODYgCisyMjcgMTg4IDEwMCAxMTIgNTIgMTM4IDEgMTEwIDIwNCAxODcgMTgxIDE1OSA2NyAxOSAzNSAxNDIgNjEgMzQgMTQ2IDEzMSA0MCAxNzggCis2NSAxMDQgMTUyIDEyNiAyMTQgMiAzOSAyMDIgMTczIF4KKzQ4NiAxIDUgOTAgMjMwIDIwIDE3MCAxNDQgMTAgMTM0IDM5IDE3NiAxMzEgMTA4IDE0NyA1OCAzNiAyMTYgMTMxIDM1IDc1IDEyNyAxMDkgCisyIDIzMiA2MCAxNDkgMjUgMTg1IDE5NSAxMzcgOTUgMzIgNzEgNTUgMTA1IDIxNiA1OCAyMzQgMTQ0IDIwMCAxMDggMTAzIDIyOCAxMDUgCis0NyAxMzAgMTY1IDEwMCAxNzIgNyA3OCAxODMgMjA3IDE4NCAxNzkgMTggMzYgNDcgMjAzIDIzNyAzMSAxMjggOCAyMTkgMTg3IDE2MiAKKzQ0IDc0IDM4IDEzMSAxMiA0OSAxNjIgMTYxIDIxOCAxNDIgMTQgMjI3IDg5IDE0MSA3MSAxODAgMjAzIDExMiAxNzUgMjMyIDEzMyAyMjEgCisxOTggMTQxIDE5NiAzNiA5OSAyMjkgMTczIDE5MiAxNTQgNjkgMjMgODAgOTggODggMTk4IDI0IDUyIDE3NCAyMTYgMjI3IDE2MiAyMTMgCisyIDEwNyAyMDQgMTEgMTUwIDE4NyAyMzUgMTE2IDUgMjM2IDEzMiAxMjQgNTMgMTE3IDIxIDExMyAxOTEgMTA5IDE5MiAyMDYgOTUgMjAxIAorMjggMTI0IDE0OSAyMTUgMTU5IDIzMCAyMTggOTggMjEzIDU0IDEzMyAxNjkgMTcyIDE3NiA2IDEwIDkgMTgzIDM4IDE0IDExMCAxODcgCiszNyAxODggMTc4IDE2MyAxMzMgMjMgMjggNzIgMTIzIDggMjQwIDIwNCAxMjggNTIgNDkgMTE4IDg5IDQ1IDIxNSA0MiA4NiA4NSAyMTUgCisyMTEgMTQgMTU0IDE3IDIxMCAxMTUgMTc5IDYyIDEwOCAyMjAgMTMwIDIwOSAxNzIgMTAzIDE3NiA3OSA4MiAyMTEgMTM5IDEwIDE1NSAKKzg1IDE0MiAxMzkgODMgMjI3IDE2IDY5IDE0MCAyMjQgMjAyIDIxMyAxNzEgMzUgMzEgNTUgMTc4IDQ2IDIzMSAxNjEgMTQ1IDcwIDgzIAorMjkgODggNjcgMjI1IDEwMSAyMTcgMTI2IDEzNyAxNjggMTA0IDIgMTEgMTA2IDExNSAzMyAxNjAgNCA5NSAxNTcgMTk4IDE5MyAyMjIgMSAKKzE4IDEzIDIxIDIzOCA0NyA1IDM4IDIwNCA1NSAyMjIgMTE4IDE2MiAxMTcgMTQ2IDIxMSA4NyAyMjYgMTkwIDE2NiAxMTYgNzggNjYgNjMgCis4MCAyNSAxNiAyNSA2OCA1MSAzMyAyMTIgMzAgNjAgNzYgMTk1IDEyIDIzOSAxMzYgMjI1IDI4IDE0NSAxOTUgMjEwIDE2NyAyMDUgMjcgCis1NiA0IDIyMCAxMyA2NSA2OCAyMjAgMjAzIDM5IDEwMyA1OSAxNzcgMjIwIDU3IDEzNyAyNDEgMTc2IDIwNCAxODAgNzggMTQgMzcgMTE1IAorMTA2IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAxNzcgNzQgMTg0IDMzIDExNiAxNzQgMTY0IDIwMSAxOTcgNTIgMjE4IDQ2IDE1OCA4OSAKKzIxNCAxNDMgMTExIDE1OSAxMTMgNzQgMjM2IDU5IDUyIDEyMiAxOTAgMjAgMjE0IDIxNiAxODMgOTAgNDAgNDYgMTA2IDYzIDcgMjI0IAorODUgNjkgNjcgMTUyIDI5IDE1IDE5OSAxMzYgMjcgMTAwIDc2IDE1MSAxODIgNjYgMjA5IDIyNCAxNTggMTQxIDI0MCAxMDggMzAgMTU2IAorMTc0IDkxIDEyOSAyNCA5NiA0IDE0NyAxODMgMTM0IDExMiA2IDYyIDY0IDE0OCAxOTkgNDAgMTcxIDIzMyAyMDEgMTI0IDIyMiA0NSA5MCAKKzE4NiAxOTAgMjM5IDE4OCA5IDIzNSA2NCAyMjEgMjkgMjEzIDEyNyAyMDUgMTAwIDEyOCAxNzcgMTQ3IDE0IDIwNiA0MyAxNzUgNjMgCisyMDUgMTUyIDE1NCAxNDIgNjYgMTEgNTQgODkgOTcgMjQxIDcgNSAxMTEgMzQgMTUgMTc4IDExOSA2MSA5MiAxMDEgNzEgMjI0IDMzIDQzIAorMTAyIDIzMyAzIDE5NiAxNTMgMSA5MSA1NiAxOTQgMTY1IDQ4IDE0NiA0MiAxNTkgMTU3IDE0NiAxNjcgMTUgNTMgMjEgMTY1IDIxNyA3NCAKKzExMSAyMDMgMTg1IDUgMTYzIDYwIDE5MyA5NyAxMTYgMTIyIDEzOCAyMzYgNyAyNiAxNTcgMjMgMTUzIDE3MCAxODQgXgorNTA1IDEgMTI1IDIzOCAxODcgMTQ3IDE2NSA4NSA1MyAxNiA5MyA2NiA1MCAyMDEgNjEgMjkgMTI3IDE1MyA0NSAxNTkgOCAxMjEgMTY0IAorMTg1IDE0NCAyMzUgMTMgNzUgMTY2IDEyIDIxNiAxNjYgMTg4IDUzIDYzIDIzNSAxNDggMjQgMTA2IDEwMCAxNTggMTk2IDE5IDIyMCAKKzI0MCAxOTAgNzcgMjM3IDYzIDE0NyA5NyAxODcgMTk0IDYzIDE4OCA2IDE2NSAxMzIgMTk1IDExOSA0NiAyMTUgMTEwIDg2IDEwOSAxMTggCiszNyAxMSA0IDk0IDYwIDIwIDE2NyA0NyA3NCAxMTAgMTMzIDcgMjIxIDExIDE2MCA0MyAxMjkgMTMwIDc3IDE0OSAxMiA2NiAyMDYgMTUwIAorMjI0IDExNyA5MCAxODMgMTIwIDYxIDE2NCA3NiA5MyAxNTQgMTAxIDE3IDE5NiA2NiAxMTggOTkgMTQzIDIyNiAzMiAyMTMgMTk1IDIwNyAKKzk3IDMxIDEgMTIzIDc5IDY0IDEzNSA3OCA0OSAxODYgOTEgNDIgMTQxIDEwOCA2MiAxNzkgNDYgNTkgMTYxIDE2NyAxNzYgMjggMTgwIAorMTAyIDE4MiAxMDUgOTEgMTk4IDkwIDI3IDE3MSAxNDIgNzYgMTM0IDYzIDc5IDE5OSA4NCAyNDEgMTU4IDEyOCAxMjEgMTE3IDQzIDQxIAorMTcgMTA4IDE1IDM3IDE4NyAxMDYgMTIgMTA3IDExNSAxMjggMTYyIDI2IDIxIDIyMyAxNzAgMTggNTUgODcgMTY1IDI0MSAyIDE3OSAKKzIwMiA4IDgwIDExIDIwNyAyMDYgODIgODIgMzUgMTM3IDM0IDgxIDE3NiAxMTYgMjMxIDE4MyA3MyAxNjMgODIgMTIzIDE4OCAxMTUgCisyMTYgMjEzIDg2IDE1NiAxNiAxNDAgMjA4IDE1MyAxNTQgMjEwIDY4IDMzIDIyMiAxNTUgNjkgODkgODAgMTIwIDE0IDIyIDIzOCAxMTkgCis1IDYyIDEzMiAxNDggMjIxIDIwOCAxOCAyMDUgMjYgMjI0IDcwIDE5MiA4MCAxNjcgMTU2IDEyNSAxOTEgMjQgNDQgMTkxIDE4MCAxNCAKKzEzMSA0NSAyMDAgMTQwIDk5IDEwMiA3MyA1NCAzMSA0MiAzMiA1NyAyIDQ0IDkgODkgMjM2IDY5IDE3NyAxMzEgMTgwIDE0OSA4MCAyMDggCis2NSAxMDMgMTI5IDE3NyAyMTkgMjMxIDIzMCAyMTUgMSAzNSAyOCAyMjcgMjAgNzkgMTcgMjM3IDIxOSA5NiAzNyA1MiAxNTcgNzIgMTkgCisxNTIgOTggODcgMTI0IDg4IDI0IDI0MSA0OSA3NyA0MCAyMjYgMjI5IDcxIDkyIDEwIDE5MiAyMzYgMTE2IDc1IDIzNCAxNTQgNTQgMTE5IAorOTMgMTEzIDIxMyAzOSAxNCAxNzggMTg3IDU5IDExNCA0IDE2MiAyMjMgMTIzIDEyMCAyMTcgMTEzIDE2IDE4MSAxMTcgMTMxIDkyIDk4IAorMjQzIDczIDcgMTMzIDIwNCA3OSAxNTIgMTg2IDEzOCAxODQgMjIzIDYxIDIzMiAyMzkgMTc1IDEwNyA2IDc3IDgxIDExNCAyMDcgOSAxIAorMTg1IDIzMiA0MiA3MyAyMTAgMjI0IDIyNiAxNDEgMjAgMTEgOTggMTU1IDIyIDE5MSAyMjEgMTQ2IDEwOSAyMjcgODggNzEgMTM5IDE1MiAKKzUxIDE4OSAyMSAxMzUgMTE5IDIwMiAxNjQgMjkgMTk1IDUxIDE0OCAxMTIgMTU3IDE4MSA0OSAyMzMgMjMzIDE0NSA5NCAxMyAxMjIgNjQgCis5NCAxNjkgNzEgNCAyMDMgMTExIDEwMSA1OCAxMDUgNDQgNTYgMjMxIDc0IDIyIDgyIDE3MCA4NiAxOTcgMTY5IDExOCAxNDYgNDEgODUgCis2IDExOCAyMzQgOTIgMTQ1IDE0MSAxNTUgMjI1IDM4IDI0MyAyMDggMjAwIDUyIDQ4IDIxIDE4MiAxNyA0MCAxMTcgMTc4IDIzNCAyMDEgCisxOTYgMjIyIDY3IDE4IDggMTg5IDYyIDIzIDk3IDE0MCA1MiAyMDQgMjM1IDEwMSAxMjYgMyAxNDcgOSAxMzYgMTM0IDE1MSAxMzAgMzYgCisyNDAgMzQgMTI4IDc0IDIxOSAxODQgODggMTEyIDQ4IDEzMCAyMzMgOTggMTk2IDE3NSAxNjkgMTU5IDU1IDE5IDIzIDEzOCA0OSAzMCAKKzE0MiAxMjMgMzIgMTY2IDUzIDEwNCAxNDQgMTI2IDIwNiAyMzggMzEgMTk4IDIwMyBeCis0ODMgMSAyMzUgOTAgMjMwIDE2IDE1OCAxMzIgMjQwIDEzMCAzOSAxNjQgMTIzIDEwNCAxNDcgNTQgMzIgMjE2IDExOSAzNSA3NSAxMjMgCis5NyAyMzIgMjI0IDUyIDEzNyAyMSAxODUgMTg3IDEyOSA5NSAyNCA3MSA0NyA5NyAyMTIgNTAgMjIyIDE0NCAxODggMTAwIDkxIDIyOCAKKzEwMSAzNSAxMjIgMTUzIDkyIDE3MiAyNDEgNzQgMTc5IDIwMyAxODAgMTY3IDIgMzYgMzkgMTkxIDIyNSAyMyAxMjAgMjM4IDIxNSAxNzUgCisxNTQgMzYgNjYgMzQgMTMxIDI0MiA0NSAxNjIgMTYxIDIxMCAxNDIgMTQgMjIzIDgxIDE0MSA2MyAxNjggMTk5IDEwNCAxNjcgMjI4IAorMTIxIDIwOSAxOTggMTMzIDE4NCAyNCA5MSAyMjEgMTczIDE5MiAxNDIgNjEgNyA3NiA5NCA4MCAxOTAgOCA0MCAxNjIgMjA4IDIyNyAKKzE1MCAyMTMgMjQwIDEwMyAxOTYgMjQ1IDE1MCAxNzkgMjIzIDEwOCAyNDMgMjI4IDEyOCAxMjQgNDEgMTEzIDE3IDEwOSAxODcgMTA5IAorMTgwIDE5NCA5MSAyMDEgMTIgMTE2IDE0OSAyMTUgMTU1IDIyNiAyMDYgODYgMjAxIDQ2IDEzMyAxNTcgMTY4IDE3MiAyIDIgOSAxODMgCisyNiA2IDk4IDE4MyAzMyAxODAgMTc0IDE2MyAxMjUgMTkgMjQgNjQgMTE5IDggMjMyIDIwNCAxMjQgNDggNDEgMTA2IDg5IDMzIDIwNyAKKzMwIDgyIDg1IDIwMyAyMDcgMTAgMTU0IDkgMjEwIDExNSAxNzEgNTggMTA4IDIxNiAxMjYgMjA5IDE2NCAxMDMgMTc2IDcxIDc0IDE5OSAKKzEzMSAxMCAxNDcgODEgMTM0IDEzNSA3OSAyMTkgMTIgNjkgMTMyIDIyMCAyMDIgMjA5IDE3MSAzMSAxOSA1MSAxNjYgMzggMjI3IDE1NyAKKzE0MSA3MCA4MyAyOSA4NCA2NyAyMTcgOTcgMjA1IDEyMiAxMzMgMTY0IDk2IDIgMjQxIDk0IDEwNyAzMyAxNjAgODcgMTQ1IDE4NiAxODUgCisyMTQgMjMxIDE0IDI0MyA5IDIzMCA0MyAxIDM4IDIwMCA1NSAyMjIgMTEwIDE1OCAxMDUgMTM4IDIxMSA3OSAyMjYgMTg2IDE1OCAxMTIgCis2NiA1NCA1OSA3MiAyNSA4IDEzIDYwIDQzIDIxIDIxMiAzMCA0OCA2OCAxOTUgOCAyMzkgMTMyIDIxMyAyOCAxMzMgMTkxIDE5OCAxNjcgCisyMDEgMTkgNDQgMjM4IDIwOCAxIDY1IDU2IDIyMCAxOTUgMzUgOTUgNTEgMTczIDIxMiA1NyAxMzcgMjMzIDE2OCAxOTIgMTc2IDc4IDIgCisyOSAxMTEgMTAyIDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAxNjUgNzQgMTcyIDI5IDEwNCAxNzQgMTU2IDE5NyAxODkgNDQgMjE4IDM0IAorMTU4IDg1IDIxMCAxMzUgOTkgMTQ3IDEwMSA2MiAyMjQgNTkgNTIgMTEwIDE3OCAyMCAyMTQgMjA0IDE3MSA3OCAzNiA0NiAxMDYgNTUgMyAKKzIxMiA3NyA2NSA2MyAxNDggMjUgMTUgMTg3IDEzNiAyMyAxMDAgNjQgMTM5IDE4MiA2MiAxOTcgMjE2IDE0NiAxMzcgMjQwIDk2IDIyIAorMTU2IDE3MCA4NyAxMjUgMTIgOTYgMjM0IDEzOSAxNzUgMTM0IDEwOCAyMzYgNTQgNTIgMTQ0IDE5NSAyOCAxNjcgMjIxIDE5MyAxMjAgCisyMTggNDEgODYgMTc0IDE5MCAyMjcgMTg0IDI0MyAyMzUgNTYgMjEzIDIxIDIwNSAxMTUgMjA1IDg4IDExNiAxNjkgMTQzIDI0NCAyMDYgCiszOSAxNzEgNTEgMTkzIDE0MCAxNDYgMTMwIDY2IDcgNDIgNzcgODUgMjM3IDIzNyA1IDEwNyAyNiAyNDUgMTcwIDEwNyA1MyA4OCA4OSAKKzY3IDIyNCAyNSAzNSAxMDIgMjI1IDMgMTkyIDE0OSAyMzUgODMgNTYgMTg2IDE2NSA0MCAxNDIgMzQgMTUxIDE1NyAxMzQgMTU1IDcgNDkgCis1IDE2MSAyMTcgNzAgMTAzIDIwMyAxNzMgMjM5IDE1OSA1NiAxOTMgOTMgMTE2IDEyMiAxMjYgMjM2IDcgMjIgMTQ5IDI0MiAxNzggXgorNTA3IDEgMTQxIDE2NCA3IDEyNSAyMzggMTc1IDE0MyAxNTMgODEgNDUgOCA4NSA1NCA1MCAxODkgNDkgMTcgMTI3IDE1MyA0NSAxNTEgCisyNDAgMTIxIDE2MCAxNzcgMTMyIDIyNyAxIDYzIDE2NiAyNDQgMjA0IDE1OCAxODggNTMgNTkgMjMxIDE0OCAxMiA5NCA5NiAxNTQgMTg0IAorMTEgMjA4IDIzNiAxODYgNjkgMjMzIDYzIDEzNSA5NyAxODMgMTk0IDUxIDE4MCAyIDE2MSAxMzIgMTkxIDEwNyA0MiAyMDcgMTAyIDc4IAorMTAxIDExOCAzNyAyNDMgMjQ0IDk0IDYwIDEyIDE2MyA0NyA2NiAxMTAgMTI5IDI0NyAyMTcgMjQ3IDE0OCA0MyAyMzYgMTE3IDExOCA3MyAKKzEzNyAxMiA1OCAyMDIgMTM4IDIyMCAxMTcgODIgMTc5IDExNiA1MyAxNjQgNzYgODEgMTUwIDEwMSAxMyAxOTIgNjIgMTA2IDg3IDE0MyAKKzIyMiAzMiAyMDUgMTg3IDIwMyA5MyAzMSAyNDUgMTIzIDc1IDUyIDEzNSA2NiA0MSAxNzggODcgMzggMTI5IDEwNCA2MiAxNzUgMzggNTUgCisxNTMgMTU1IDI0NCAxNjggMTYgMTcyIDk0IDE3MCAxMDUgOTEgMTkwIDc4IDI3IDE2NyAxMzAgNjQgMTI2IDU1IDc5IDE5OSA4NCAyMzcgCisxNDYgMTI4IDExMyAxMDkgMzEgMzMgMTcgOTYgMTEgMjkgMTg3IDk4IDEwMyAxMDcgMTE2IDE1OCAxNCA5IDIxOSAxNjIgMTggNTEgNzUgCisxNTcgMjMzIDI0MiAxNzkgMTkwIDQgNzYgNyAxOTkgMTk0IDgyIDc0IDIzIDEyNSAyNiA2OSAxNjQgMTEyIDIyMyAxNzEgNjUgMTU1IDcwIAorMTE5IDE3NiAxMDMgMjEyIDIwOSA4NiAxNTIgMTYgMTM2IDIwMCAxNDkgMTQ2IDIwMiA2NCAyMSAyMTAgMTUxIDYxIDc3IDcyIDEwOCAyIAorMTggMjMwIDExOSAyNDUgNTQgMTI0IDE0MCAyMDkgMTk2IDIgMTk3IDI2IDIxMiA2NiAxODQgODAgMTU5IDE0OCAxMTcgMTg3IDI0IDQ0IAorMTkxIDE3NiAyNDYgMTE5IDMzIDE5NiAxNDAgOTkgOTggNjkgNTQgMTkgNDIgMjggNTMgMjM4IDMyIDI0MSA4MSAyMjQgNTcgMTczIDEyMyAKKzE4MCAxNDUgNjggMjA0IDUzIDk1IDEyNSAxNjkgMjE5IDIzMSAyMjIgMjExIDEgMjcgMjQgMjIzIDI0MCAxNiA2NyAxIDIzNyAyMTUgODQgCisyNSA0MCAxNDkgNzIgMyAxNTIgOTAgODcgMTEyIDgwIDE2IDI0MSA0NSA3NyAzNiAyMTQgMjI5IDU5IDg4IDI0NiAxODggMjMyIDEwOCAKKzcxIDIyMiAxNDIgNTAgMTE1IDkzIDEwNSAyMDEgMzUgNiAxNzAgMTc5IDQ3IDEwMiA0IDE1MCAyMTEgMTExIDEyMCAyMDUgMTEzIDQgCisxODEgMTA1IDEyNyA4NCA5NCAyMzkgNjEgMyAxMjEgMTk2IDcxIDE0OCAxODYgMTM4IDE4NCAyMjMgNjEgMjIwIDIyNyAxNzUgMTA3IDYgCis2NSA4MSAxMTQgMjA3IDI0NSAyMzMgMTczIDIyOCAzMCA3MyAyMDYgMjE2IDIxOCAxMzMgOCAxMSA5OCAxNDMgMTAgMTc5IDIyMSAxNDYgCis5NyAyMTkgODggNjcgMTM5IDE0NCAzOSAxODkgMTMgMTIzIDExMSAxOTQgMTU2IDI1IDE4MyA1MSAxNDQgMTA4IDE0NSAxNzMgNDkgMjI5IAorMjMzIDEzNyA4NiA5IDExNCA2NCA5MCAxNjEgNjMgMjQwIDE5NSAxMTEgODkgNTggOTcgNDAgNDQgMjI3IDcwIDE0IDc4IDE3MCA3NCAKKzE5NyAxNjkgMTE0IDEzOCA0MSA3MyAyNDIgMTEwIDIzNCA5MiAxNDUgMTM3IDE1NSAyMTMgMjYgMjQzIDIwOCAyMDAgNDQgNDggMjEgCisxNzQgOSA0MCAxMTMgMTc4IDIzMCAxOTMgMTk2IDIxNCA1NSAxMCAxNzcgNTggMjMgODkgMTMyIDQ4IDIwMCAyMjMgOTcgMTE0IDI0MyAKKzEzOSAxIDEzMiAxMjIgMTUxIDEzMCAyOCAyMzIgMzQgMTIwIDYyIDIxMSAxODAgNzYgMTEyIDQ0IDEyMiAyMjUgODYgMTg4IDE2MyAxNTcgCisxNTkgNDMgMTkgMTEgMTM0IDM3IDI2IDEzOCAxMTUgMjQgMTU0IDQxIDEwNCAxMzYgMTI2IDE5OCAyMzQgMTQwIF4KKzQ5MCAxIDE5MiAyMjUgMjIzIDkwIDIzMCAxMiAxNDYgMTIwIDIyOCAxMjYgMzkgMTUyIDExNSAxMDAgMTQ3IDUwIDI4IDIxNiAxMDcgMzUgCis3NSAxMTkgODUgMjIwIDIxNiA0NCAxMjUgMTcgMTg1IDE3OSAxMjEgOTUgMTYgNzEgMzkgODkgMjA4IDQyIDIxMCAxNDQgMTc2IDkyIDc5IAorMjI4IDk3IDIzIDExNCAxNDEgODQgMTcyIDIzMyA3MCAxNzUgMTk5IDE3NiAxNTUgMjM2IDM2IDMxIDE3OSAyMTMgMTUgMTEyIDIyNiAKKzIxMSAxNjMgMTQ2IDI4IDU4IDMwIDEzMSAyMzAgNDEgMTYyIDE2MSAyMDIgMTQyIDE0IDIxOSA3MyAxNDEgNTUgMTU2IDE5NSA5NiAxNTkgCisyMjQgMTA5IDE5NyAxOTggMTI1IDE3MiAxMiA4MyAyMTMgMTczIDE5MiAxMzAgNTMgMjQxIDcyIDkwIDcyIDE4MiAyNDIgMjggMTUwIAorMjAwIDIyNyAxMzggMjEzIDIzNiA5OSAxODggMjM3IDE1MCAxNzEgMjExIDEwMCAyMzkgMjIwIDEyNCAxMjQgMjkgMTA5IDEzIDEwNSAKKzE4MyAxMDkgMTY4IDE4MiA4NyAyMDEgMjQ2IDEwOCAxNDkgMjE1IDE1MSAyMjIgMTk0IDc0IDE4OSAzOCAxMzMgMTQ1IDE2NCAxNjggCisyNDggMjQ0IDkgMTgzIDE0IDI0OCA4NiAxNzkgMjkgMTcyIDE3MCAxNjMgMTE3IDE1IDIwIDU2IDExNSA4IDIyNCAyMDQgMTIwIDQ0IDMzIAorOTQgODkgMjEgMTk5IDE4IDc4IDg1IDE5MSAyMDMgNiAxNTQgMSAyMTAgMTE1IDE2MyA1NCAxMDggMjEyIDEyMiAyMDkgMTU2IDEwMyAKKzE3NiA2MyA2NiAxODcgMTIzIDEwIDEzOSA3NyAxMjYgMTMxIDc1IDIxMSA4IDY5IDEyNCAyMTYgMjAyIDIwNSAxNzEgMjcgNyA0NyAxNTQgCiszMCAyMjMgMTUzIDEzNyA3MCA4MyAyOSA4MCA2NyAyMDkgOTMgMTkzIDExOCAxMjkgMTYwIDg4IDIgMjI5IDgyIDk5IDMzIDE2MCAyNDYgCis3OSAxMzMgMTc0IDE3NyAyMDYgMjE5IDEwIDIzMSAyNDcgMjIyIDM5IDI0NyAzOCAxOTYgNTUgMjIyIDEwMiAxNTQgOTMgMTMwIDIxMSAKKzcxIDIyNiAxODIgMTUwIDEwOCA1NCA0MiA1NSA2NCAyNSAxIDUyIDM1IDkgMjEyIDMwIDM2IDYwIDE5NSA0IDIzOSAxMjggMjAxIDI4IAorMTIxIDE4NyAxODYgMTY3IDE5NyAxMSAzMiAyMzAgMTk2IDIzOSA2NSA0NCAyMjAgMTg3IDMxIDg3IDQzIDE2OSAyMDQgNTcgMTM3IDIyNSAKKzE2MCAxODAgMTcyIDc4IDI0MCAyMSAxMDcgOTggMjMyIDE3NyAyMiAxMjkgNjggMTY4IDE1MyA3NCAxNjAgMjUgOTIgMTc0IDE0OCAxOTMgCisxODEgMzYgMjE4IDIyIDE1OCA4MSAyMDYgMTI3IDg3IDEzNSA4OSA1MCAyMTIgNTkgNTIgOTggMTY2IDIwIDIxNCAxOTIgMTU5IDY2IDMyIAorNDYgMTA2IDQ3IDI0OSAyMDAgNjkgNjEgNTkgMTQ0IDIxIDE1IDE3NSAxMzYgMTkgMTAwIDUyIDEyNyAxODIgNTggMTg1IDIwOCAxMzQgCisxMzMgMjQwIDg0IDE0IDE1NiAxNjYgODMgMTIxIDk2IDIyMiAxMzEgMTY3IDEzNCAxMDQgMjI0IDQ2IDQwIDE0MCAxOTEgMTYgMTYzIAorMjA5IDE4NSAxMTYgMjE0IDM3IDgyIDE2MiAxOTAgMjE1IDE4MCAyMzUgMjM1IDQ4IDIwNSAxMyAxOTcgMTAzIDIwNSA3NiAxMDQgMTYxIAorMTM5IDIzMiAyMDYgMzUgMTY3IDM5IDE4MSAxMjggMTM4IDExOCA2NiAzIDMwIDY1IDczIDIzMyAyMjUgNSAxMDMgMTggMjMzIDE2MiA5NSAKKzQ1IDg0IDc3IDYzIDIyNCAxNyAyNyAxMDIgMjE3IDMgMTg4IDE0NSAyMjcgNzUgNTYgMTc4IDE2NSAzMiAxMzggMjYgMTQzIDE1NyAxMjIgCisxNDMgMjQ5IDQ1IDIzOSAxNTcgMjE3IDY2IDk1IDIwMyAxNjEgMjMxIDE1NSA1MiAxOTMgODkgMTE2IDEyMiAxMTQgMjM2IDcgMTggMTQxIAorMjQyIDI0OSAxMzcgMTYyIDMgMTI1IDIzOCA2OSBeCis1MTQgMSAxMzkgMTQxIDc3IDM3IDc3IDQyIDUwIDE3NyAzNyA1IDEyNyAxNTMgNDUgMTQzIDIyOCAxMjEgMTU2IDE2OSAxMjAgMjE5IAorMjQxIDUxIDE2NiAyMzIgMTkyIDE1MCAxODggNTMgNTUgMjI3IDE0OCA4MiA5MiAxNTAgMTcyIDMgMTk2IDIzMiAxODIgNjEgMjI5IDYzIAorMTIzIDk3IDE3OSAxOTQgMzkgMTcyIDI1MCAxNTcgMTMyIDE4NyA5NSAzOCAxOTkgOTQgNzAgOTMgMTE4IDM3IDIzMSAyNDAgOTQgNjAgNCAKKzE1OSA0NyA1OCAxMTAgMTI1IDI0MyAyMTMgMjM5IDEzNiA0MyAyMjggMTA1IDEwNiA2OSAxMjUgMTIgNTAgMTk4IDEyNiAyMTYgMTE3IAorNzQgMTc1IDExMiA0NSAxNjQgNzYgNjkgMTQ2IDEwMSA5IDE4OCA1OCA5NCA3NSAxNDMgMjE4IDMyIDE5NyAxNzkgMTk5IDg5IDMxIDI0NSAKKzEyMyA3MSA0MCAxMzUgNTQgMzMgMTcwIDgzIDM0IDExNyAxMDAgNjIgMTcxIDMwIDUxIDE0NSAxNDMgMjQ0IDE2MCA0IDE2NCA4NiAxNTggCisxMDUgOTEgMTgyIDY2IDI3IDE2MyAxMTggNTIgMTE4IDQ3IDc5IDE5OSA4NCAyMzMgMTM0IDEyOCAxMDUgMTAxIDE5IDI1IDE3IDg0IDcgCisyMSAxODcgOTAgMjQwIDk5IDk5IDEwNCAxNTQgMiAyNDkgMjE1IDE1NCAxOCA0NyA2MyAxNDkgMjI1IDIzOCAxNzkgMTc4IDcyIDMgMTkxIAorMTgyIDgyIDY2IDExIDExMyAxOCA1NyAxNTIgMTA4IDIxNSAxNTkgNTcgMTQ3IDU4IDExNSAxNjQgOTEgMjA4IDIwNSA4NiAxNDggMTYgCisxMzIgMTkyIDE0NSAxMzggMTk0IDYwIDkgMTk4IDE0NyA1MyA2NSA2NCA5NiAyNDIgMTQgMjIyIDExOSAyNDEgNDYgMTE2IDEzMiAxOTcgCisxODQgMjM4IDE4OSAyNiAyMDAgNjIgMTc2IDgwIDE1MSAxNDAgMTA5IDE4MyAyNCA0NCAxOTEgMTcyIDIzNCAxMDcgMjEgMTkyIDE0MCAKKzk5IDk0IDY1IDU0IDcgNDIgMjQgNDkgMjMwIDIwIDIyOSA3MyAyMTIgNDUgMTY5IDExNSAxODAgMTQxIDU2IDIwMCA0MSA4NyAxMjEgCisxNjEgMjE5IDIzMSAyMTQgMjA3IDEgMTkgMjAgMjE5IDIzNiAxMiA1NSAyMzcgMjM3IDIxMSA3MiAxMyAyOCAxNDEgNzIgMjM5IDE1MiAKKzgyIDg3IDEwMCA3MiA4IDI0MSA0MSA3NyAzMiAyMDIgMjI5IDQ3IDg0IDIzOCAxODQgMjI4IDEwMCA2NyAyMTAgMTMwIDQ2IDExMSA5MyAKKzk3IDE4OSAzMSAyNTAgMTYyIDE3MSAzNSA5MCA0IDEzOCAxOTkgOTkgMTIwIDE5MyAxMTMgMjQ0IDE4MSA5MyAxMjMgNzYgOTAgMjM1IAorNDkgMjUxIDEwOSAxODggNjMgMTQ0IDE4NiAxMzggMTg0IDIyMyA2MSAyMDggMjE1IDE3NSAxMDcgNiA1MyA4MSAxMTQgMjA3IDIzNyAKKzIyMSAxNjEgMjI0IDE4IDczIDIwMiAyMDggMjEwIDEyNSAyNDggMTEgOTggMTMxIDI1MCAxNjcgMjIxIDE0NiA4NSAyMTEgODggNjMgCisxMzkgMTM2IDI3IDE4OSA1IDExMSAxMDMgMTg2IDE0OCAyMSAxNzEgNTEgMTQwIDEwNCAxMzMgMTY1IDQ5IDIyNSAyMzMgMTI5IDc4IDUgCisxMDYgNjQgODYgMTUzIDU1IDIzMiAxODcgMTExIDc3IDU4IDg5IDM2IDMyIDIyMyA2NiA2IDc0IDE3MCA2MiAxOTcgMTY5IDExMCAxMzAgCis0MSA2MSAyMzQgMTAyIDIzNCA5MiAxNDUgMTMzIDE1NSAyMDEgMTQgMjQzIDIwOCAyMDAgMzYgNDggMjEgMTY2IDEgNDAgMTA5IDE3OCAKKzIyNiAxODUgMTk2IDIwNiA0MyAyIDI0NCAxNjUgNTQgMjMgODEgMTI0IDQ0IDE5NiAyMTEgOTMgMTAyIDIzOSAxMzEgMjQ1IDEyOCAxMTAgCisxNTEgMTMwIDIwIDIyNCAzNCAxMTIgNTAgMjAzIDE3NiA2NCAxMTIgNDAgMTE0IDIxNyA3NCAxODAgMTUxIDE0NSAxNTkgMzEgMTkgMjUxIAorMTMwIDI1IDIyIDEzNCAxMDcgMTYgMTQyIDI5IDEwNCAxMjggMTI2IDE5MCAyMzAgMTUgMTkwIDIyNSAyMTcgOTAgMjMwIDEwIDE0MCAKKzExNCAyMjIgMTI0IDM5IDE0NiAxMTEgMjE3IF4KKzUxMCAwIDE0NyA0NiAyNCAyMTYgOTUgMzUgNzUgMTE1IDczIDIwOCAyMDggMzYgMTEzIDEzIDE4NSAxNzEgMTEzIDk1IDggNzEgMzEgODEgCisyMDQgMzQgMTk4IDE0NCAxNjQgODQgNjcgMjI4IDkzIDExIDEwNiAxMjkgNzYgMTcyIDIyNSA2NiAxNzEgMTk1IDE3MiAxNDMgMjI0IDM2IAorMjMgMTY3IDIwMSA3IDEwNCAyMTQgMjA3IDE1MSAxMzggMjAgNTAgMjYgMTMxIDIxOCAzNyAxNjIgMTYxIDE5NCAxNDIgMTQgMjE1IDY1IAorMTQxIDQ3IDE0NCAxOTEgODggMTUxIDIyMCA5NyAxODUgMTk4IDExNyAxNjAgNzUgMjA1IDE3MyAxOTIgMTE4IDQ1IDIyOSA2OCA4NiA2NCAKKzE3NCAyMzAgMTYgMTM4IDE5MiAyMjcgMTI2IDIxMyAyMzIgOTUgMTgwIDIyOSAxNTAgMTYzIDE5OSA5MiAyMzUgMjEyIDEyMCAxMjQgMTcgCisxMDUgOSAxMDEgMTc5IDEwOSAxNTYgMTcwIDgzIDIwMSAyMzQgMTAwIDE0OSAyMTUgMTQ3IDIxOCAxODIgNjIgMTc3IDMwIDEzMyAxMzMgCisxNjAgMTY0IDI0OCAyNDAgOSAxODMgMiAyNDQgNzQgMTc1IDI1IDE2NCAxNjYgMTYzIDEwOSAxMSAxNiA0OCAxMTEgOCAyMTYgMjA0IAorMTE2IDQwIDI1IDgyIDg5IDkgMTkxIDYgNzQgODUgMTc5IDE5OSAyIDE1NCAyNDcgMjEwIDExNSAxNTUgNTAgMTA4IDIwOCAxMTggMjA5IAorMTQ4IDEwMyAxNzYgNTUgNTggMTc1IDExNSAxMCAxMzEgNzMgMTE4IDEyNyA3MSAyMDMgNCA2OSAxMTYgMjEyIDIwMiAyMDEgMTcxIDIzIAorMjQ5IDQzIDE0MiAyMiAyMTkgMTQ5IDEzMyA3MCA4MyAyOSA3NiA2NyAyMDEgODkgMTgxIDExNCAxMjUgMTU2IDgwIDIgMjE3IDcwIDkxIAorMzMgMTYwIDI0NiA3MSAxMjEgMTYyIDE2OSAxOTggMjA3IDYgMjE5IDIzOSAyMTQgMzUgMjQ3IDM4IDE5MiA1NSAyMjIgOTQgMTUwIDgxIAorMTIyIDIxMSA2MyAyMjYgMTc4IDE0MiAxMDQgNDIgMzAgNTEgNTYgMjUgMjQ2IDI0MyA0NCAyNyAyNTEgMjEyIDMwIDI0IDUyIDE5NSAKKzIzOSAxMjQgMTg5IDI4IDEwOSAxODMgMTc0IDE2NyAxOTMgMyAyMCAyMjIgMTg0IDIzMSA2NSAzMiAyMjAgMTc5IDI3IDc5IDM1IDE2NSAKKzE5NiA1NyAxMzcgMjE3IDE1MiAxNjggMTY4IDc4IDIzMiAxMyAxMDMgOTQgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDE0MSA3NCAxNDggMjEgCis4MCAxNzQgMTQwIDE4OSAxNzMgMjggMjE4IDEwIDE1OCA3NyAyMDIgMTE5IDc1IDEyMyA3NyAzOCAyMDAgNTkgNTIgODYgMTU0IDIwIAorMjE0IDE4MCAxNDcgNTQgMjggNDYgMTA2IDM5IDI0OSAxODggNjEgNTcgNTUgMTQwIDE3IDE1IDE2MyAxMzYgMTUgMTAwIDQwIDExNSAKKzE4MiA1NCAxNzMgMjAwIDEyMiAxMjkgMjQwIDcyIDYgMTU2IDE2MiA3OSAxMTcgMjQyIDk2IDIxMCAxMjMgMTU5IDEzNCAxMDAgMjEyIAorMzggMjggMTM2IDE4NyA0IDE1OSAxOTcgMTc3IDExMiAyMTAgMzMgNzggMTUwIDE5MCAyMDMgMTc2IDIyNyAyMzUgNDAgMTk3IDUgMTg5IAorOTEgMjA1IDY0IDkyIDE1MyAxMzUgMjIwIDIwNiAzMSAxNjMgMjcgMTY5IDExNiAxMzAgMTA2IDY2IDI1MyAxOCA1MyA2MSAyMjkgMjEzIAorNSA5OSAxMCAyMjEgMTU0IDgzIDM3IDgwIDY1IDU5IDIyNCA5IDE5IDEwMiAyMDkgMyAxODQgMTQxIDIxOSA2NyA1NiAxNzAgMTY1IDI0IAorMTM0IDE4IDEzNSAxNTcgMTEwIDEzMSAyNDUgNDEgMjI3IDE1MyAyMTcgNjIgODcgMjAzIDE0OSAyMjMgMTUxIDQ4IDE5MyA4NSAxMTYgCisxMjIgMTAyIDIzNiA3IDE0IDEzMyAyNDIgMjQxIDEyOSAxNTggMjQ5IDEyNSAyMzggMTU3IDEzNyAxMzUgNzUgMzMgMjUwIDczIDM2IDUwIAorMTcxIDMxIDI1MyAxMjcgMTUzIDQ1IDEzOSAyMjIgMTIxIDE1NCAxNjUgMTE0IDIxNSAyMzcgNDUgMTY2IDIyNiAxODYgMTQ2IDE4OCA1MyAKKzUzIDIyNSAxNDggMjQ4IDExOCBeCis1MzMgMCA4NyAxNDUgMTU3IDI1MCAxODEgMjI3IDE3NyA1MSAyMjQgNjMgMTA4IDk3IDE3NCAxOTQgMjQgMTYyIDI1MCAxNTIgMTMyIAorMTgyIDgwIDMzIDE4OSA4NCA2MCA4MyAxMTggMzcgMjE2IDIzNSA5NCA2MCAyNTEgMTU0IDQ3IDQ4IDExMCAxMjAgMjM4IDIwOCAyMjkgCisxMjEgNDMgMjE4IDkwIDkxIDY0IDExMCAxMiA0MCAxOTMgMTExIDIxMSAxMTcgNjQgMTcwIDEwNyAzNSAxNjQgNzYgNTQgMTQxIDEwMSA0IAorMTgzIDUzIDc5IDYwIDE0MyAyMTMgMzIgMTg3IDE2OSAxOTQgODQgMzEgMjQ1IDEyMyA2NiAyNSAxMzUgMzkgMjMgMTYwIDc4IDI5IDEwMiAKKzk1IDYyIDE2NiAyMCA0NiAxMzUgMTI4IDI0NCAxNTAgMjQ2IDE1NCA3NiAxNDMgMTA1IDkxIDE3MiA1MSAyNyAxNTggMTAzIDM3IDEwOCAKKzM3IDc5IDE5OSA4NCAyMjggMTE5IDEyOCA5NSA5MSA0IDE1IDE3IDY5IDIgMTEgMTg3IDgwIDIzMCA5NCA4OSA4OSAxNDkgMjQ0IDIzOSAKKzIxMCAxNDQgMTggNDIgNDggMTM5IDIxNSAyMzMgMTc5IDE2MyAyNTIgNjcgMjU1IDE4MSAxNjcgODIgNTYgMjUzIDk4IDggNDIgMTM3IAorMTAzIDIwNSAxNDQgNDcgMTM3IDQzIDExMCAxNDkgNzYgMjAzIDIwMCA4NiAxNDMgMTYgMTI3IDE4MiAxNDAgMTI4IDE4NCA1NSAyNTEgCisxODMgMTQyIDQzIDUwIDU0IDgxIDIzMiA5IDIxMiAxMTkgMjM2IDM2IDEwNiAxMjIgMTgyIDE2OSAyMjMgMTc5IDI2IDE4NSA1NyAxNjYgCis4MCAxNDEgMTMwIDk5IDE3OCAyNCA0NCAxOTEgMTY3IDIxOSA5MiA2IDE4NyAxNDAgOTkgODkgNjAgNTQgMjQ5IDQyIDE5IDQ0IDIyMCA1IAorMjE0IDYzIDE5NyAzMCAxNjQgMTA1IDE4MCAxMzYgNDEgMTk1IDI2IDc3IDExNiAxNTEgMjE5IDIzMSAyMDQgMjAyIDEgOSAxNSAyMTQgCisyMzEgNyA0MCAyMjIgMjM3IDIwNiA1NyAyNTUgMTMgMTMxIDcyIDIyNCAxNTIgNzIgODcgODUgNjIgMjU1IDI0MSAzNiA3NyAyNyAxODcgCisyMjkgMzIgNzkgMjI4IDE3OSAyMjMgOTAgNjIgMTk1IDExNSA0MSAxMDYgOTMgODcgMTc0IDI2IDI0NSAxNTIgMTYxIDIwIDc1IDQgMTIzIAorMTg0IDg0IDEyMCAxNzggMTEzIDIzNCAxODEgNzggMTE4IDY2IDg1IDIzMCAzNCAyNTEgOTQgMTc4IDUzIDEzOSAxODYgMTM4IDE4NCAKKzIyMyA2MSAxOTMgMjAwIDE3NSAxMDcgNiAzOCA4MSAxMTQgMjA3IDIyNyAyMDYgMTQ2IDIxOSAzIDczIDE5NyAxOTggMjAwIDExNSAyMzggCisxMSA5OCAxMTYgMjQwIDE1MiAyMjEgMTQ2IDcwIDIwMSA4OCA1OCAxMzkgMTI2IDEyIDE4OSAyNTIgOTYgOTMgMTc2IDEzOCAxNiAxNTYgCis1MSAxMzUgOTkgMTE4IDE1NSA0OSAyMjAgMjMzIDExOSA2OCA5NiA2NCA4MSAxNDMgNDUgMjIyIDE3NyAxMTEgNjIgNTggNzkgMzEgMTcgCisyMTggNjEgMjUzIDY5IDE3MCA0NyAxOTcgMTY5IDEwNSAxMjAgNDEgNDYgMjI0IDkyIDIzNCA5MiAxNDUgMTI4IDE1NSAxODYgMjU2IAorMjQzIDIwOCAyMDAgMjYgNDggMjEgMTU2IDI0OCA0MCAxMDQgMTc4IDIyMSAxNzUgMTk2IDE5NiAyOCAyNDkgMjM5IDE1MCA0OSAyMyA3MSAKKzExNCAzOSAxOTEgMTk2IDg4IDg3IDIzNCAxMjEgMjQwIDEyMyA5NSAxNTEgMTMwIDEwIDIxNCAzNCAxMDIgMzUgMTkzIDE3MSA0OSAxMTIgCiszNSAxMDQgMjA3IDU5IDE3MCAxMzYgMTMwIDE1OSAxNiAxOSAyNDEgMTI1IDEwIDE3IDEyOSA5NyA2IDEyNyAxNCAxMDQgMTE4IDEyNiAKKzE4MCAyMjUgNSAxODUgMjI1IDIwMiA5MCAyMzAgNSAxMjUgOTkgMjA3IDExOSAzOSAxMzEgMTAxIDkzIDE0NyA0MyAyMSAyMTYgODYgMzUgCis3NSAxMTIgNjQgMTk5IDIwMiAzMCAxMDQgMTAgMTg1IDE2NSAxMDcgOTUgMiA3MSAyNSA3NSAyMDEgMjggMTg5IDE0NCAxNTUgNzggNTggCisyMjggOTAgMiAxMDAgMTIwIDcwIDE3MiAyMTkgNjMgMTY4IDE5MiAxNjkgMTM0IDIxNSAzNiAxNyAxNTggMTkyIDEgOTggMjA1IDEzNyBeCis1MjIgMSAxMzkgMTMwIDEyIDQyIDIyIDEzMSAyMDYgMzMgMTYyIDE2MSAxODYgMTQyIDE0IDIxMSA1NyAxNDEgMzkgMTMyIDE4NyA4MCAKKzE0MyAyMTYgODUgMTczIDE5OCAxMDkgMTQ4IDI0NiA2NyAxOTcgMTczIDE5MiAxMDYgMzcgMjE3IDY0IDgyIDU2IDE2NiAyMTggNCAxMjYgCisxODQgMjI3IDExNCAyMTMgMjI4IDkxIDE3MiAyMjEgMTUwIDE1NSAxODcgODQgMjMxIDIwNCAxMTYgMTI0IDUgMTAxIDUgOTcgMTc1IAorMTA5IDE0NCAxNTggNzkgMjAxIDIyMiA5MiAxNDkgMjE1IDE0MyAyMTQgMTcwIDUwIDE2NSAyMiAxMzMgMTIxIDE1NiAxNjAgMjQ4IDIzNiAKKzkgMTgzIDI0OCAyNDAgNjIgMTcxIDIxIDE1NiAxNjIgMTYzIDEwMSA3IDEyIDQwIDEwNyA4IDIwOCAyMDQgMTEyIDM2IDE3IDcwIDg5IAorMjU1IDE4MyAyNTIgNzAgODUgMTY3IDE5NSAyNTYgMTU0IDI0MyAyMTAgMTE1IDE0NyA0NiAxMDggMjA0IDExNCAyMDkgMTQwIDEwMyAKKzE3NiA0NyA1MCAxNjMgMTA3IDEwIDEyMyA2OSAxMTAgMTIzIDY3IDE5NSA2OSAxMDggMjA4IDIwMiAxOTcgMTcxIDE5IDI0MSAzOSAxMzAgCisxNCAyMTUgMTQ1IDEyOSA3MCA4MyAyOSA3MiA2NyAxOTMgODUgMTY5IDExMCAxMjEgMTUyIDcyIDIgMjA1IDU4IDgzIDMzIDE2MCAyNDYgCis2MyAxMDkgMTUwIDE2MSAxOTAgMTk1IDIgMjA3IDIzMSAyMDYgMzEgMjQ3IDM4IDE4OCA1NSAyMjIgODYgMTQ2IDY5IDExNCAyMTEgNTUgCisyMjYgMTc0IDEzNCAxMDAgMzAgMTggNDcgNDggMjUgMjQyIDIzNSAzNiAxOSAyNDMgMjEyIDMwIDEyIDQ0IDE5NSAyNTQgMjM5IDEyMCAKKzE3NyAyOCA5NyAxNzkgMTYyIDE2NyAxODkgMjUzIDggMjE0IDE3MiAyMjMgNjUgMjAgMjIwIDE3MSAyMyA3MSAyNyAxNjEgMTg4IDU3IAorMTM3IDIwOSAxNDQgMTU2IDE2NCA3OCAyMjQgNSA5OSA5MCAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMTI5IDc0IDEzNiAxNyA2OCAxNzQgCisxMzIgMTg1IDE2NSAyMCAyMTggMjU2IDE1OCA3MyAxOTggMTExIDYzIDExMSA2NSAyNiAxODggNTkgNTIgNzQgMTQyIDIwIDIxNCAxNjggCisxMzUgNDIgMjQgNDYgMTA2IDMxIDI0OSAxNzYgNTMgNTMgNTEgMTM2IDEzIDE1IDE1MSAxMzYgMTEgMTAwIDI4IDEwMyAxODIgNTAgMTYxIAorMTkyIDExMCAxMjUgMjQwIDYwIDI1NiAxNTYgMTU4IDc1IDExMyAyMzQgOTYgMTk4IDExNSAxNTEgMTM0IDk2IDIwMCAzMCAxNiAxMzIgCisxODMgMjUwIDE1NSAxODUgMTY5IDEwOCAyMDYgMjkgNzQgMTM4IDE5MCAxOTEgMTcyIDIxOSAyMzUgMzIgMTg5IDI1NSAxODEgNzkgMjA1IAorNTIgODAgMTQ1IDEzMSAyMDggMjA2IDI3IDE1OSAxNSAxNTcgMTA0IDEyMiA5NCA2NiAyNTMgNiA0MSA0OSAyMjUgMjAxIDUgOTUgMiAKKzIwOSAxNDYgNzEgMjkgNzYgNTMgNTUgMjI0IDEgMTEgMTAyIDIwMSAzIDE4MCAxMzcgMjExIDU5IDU2IDE2MiAxNjUgMTYgMTMwIDEwIAorMTI3IDE1NyA5OCAxMTkgMjQxIDM3IDIxNSAxNDkgMjE3IDU4IDc5IDIwMyAxMzcgMjE1IDE0NyA0NCAxOTMgODEgMTE2IDEyMiA5MCAKKzIzNiA3IDEwIDEyNSAyNDIgMjMzIDEyMSAxNTQgMjQ1IDEyNSAyMzggMTQ1IDEzMyAxMjMgNzEgMjUgMjQ2IDY1IDI0IDUwIDE1OSAxOSAKKzI0NSAxMjcgMTUzIDQ1IDEzMSAyMTAgMTIxIDE1MCAxNTcgMTAyIDIwNyAyMjkgMzMgMTY2IDIxNCAxNzQgMTM4IDE4OCA1MyA0OSAyMjEgCisxNDggMjQwIDY0IDg2IDE0NCAxNTQgMjQ5IDE3OCAyMjYgMTc2IDQ5IDIyMyA2MyAxMDUgOTcgMTczIDE5NCAyMSAxNjAgMjUwIDE1MSAKKzEzMiAxODEgNzcgMzIgMTg3IDgyIDU4IDgxIDExOCAzNyAyMTMgMjM0IDk0IDYwIDI1MCAxNTMgNDcgNDYgMTEwIDExOSAyMzcgMjA3IAorMjI3IDExOCA0MyAyMTYgODcgODggNjMgMTA3IDEyIDM4IDE5MiAxMDggMjEwIDExNyA2MiAxNjkgMTA2IDMzIDE2NCA3NiA1MSAyMTEgXgorNTQwIDAgMTAxIDEgMTgwIDUwIDcwIDUxIDE0MyAyMTAgMzIgMTgxIDE2MyAxOTEgODEgMzEgMjQ1IDEyMyA2MyAxNiAxMzUgMzAgMTcgCisxNTQgNzUgMjYgOTMgOTIgNjIgMTYzIDE0IDQzIDEyOSAxMTkgMjQ0IDE0NCAyNDAgMTQ4IDcwIDEzNCAxMDUgOTEgMTY2IDQyIDI3IAorMTU1IDk0IDI4IDEwMiAzMSA3OSAxOTkgODQgMjI1IDExMCAxMjggODkgODUgMjU1IDkgMTcgNjAgMjU5IDUgMTg3IDc0IDIyNCA5MSA4MyAKKzgwIDE0NiAyMzggMjMzIDIwNyAxMzggMTggMzkgMzkgMTMzIDIwOSAyMzAgMTc5IDE1NCAyNTIgNjQgMjU1IDE3NSAxNTggODIgNTAgCisyNDcgODkgMiAzMyAxMjggMTAwIDE5OSAxMzUgNDEgMTMxIDM0IDEwNyAxNDAgNjcgMjAwIDE5NyA4NiAxNDAgMTYgMTI0IDE3NiAxMzcgCisxMjIgMTc4IDUyIDI0NSAxNzQgMTM5IDM3IDQxIDQ4IDcyIDIyNiA2IDIwNiAxMTkgMjMzIDMwIDEwMCAxMTYgMTczIDE2MCAyMTQgMTczIAorMjYgMTc2IDU0IDE2MCA4MCAxMzUgMTI0IDkzIDE3NSAyNCA0NCAxOTEgMTY0IDIxMCA4MyAyNTcgMTg0IDE0MCA5OSA4NiA1NyA1NCAKKzI0MyA0MiAxNiA0MSAyMTQgMjU2IDIwNSA1NyAxODggMjEgMTYxIDk5IDE4MCAxMzMgMzIgMTkyIDE3IDcxIDExMyAxNDUgMjE5IDIzMSAKKzE5OCAxOTkgMSAzIDEyIDIxMSAyMjggNCAzMSAyMTMgMjM3IDIwMyA0OCAyNDkgNCAxMjUgNzIgMjE1IDE1MiA2NiA4NyA3NiA1NiAyNTIgCisyNDEgMzMgNzcgMjQgMTc4IDIyOSAyMyA3NiAyMjIgMTc2IDIyMCA4NCA1OSAxODYgMTA2IDM4IDEwMyA5MyA4MSAxNjUgMjMgMjQyIAorMTQ2IDE1NSAxMSA2NiA0IDExNCAxNzUgNzUgMTIwIDE2OSAxMTMgMjI4IDE4MSA2OSAxMTUgNjAgODIgMjI3IDI1IDI1MSA4NSAxNzIgCis0NyAxMzYgMTg2IDEzOCAxODQgMjIzIDYxIDE4NCAxOTEgMTc1IDEwNyA2IDI5IDgxIDExNCAyMDcgMjIxIDE5NyAxMzcgMjE2IDI1NCAKKzczIDE5NCAxOTIgMTk0IDEwOSAyMzIgMTEgOTggMTA3IDIzNCAxNDMgMjIxIDE0NiA2MSAxOTUgODggNTUgMTM5IDEyMCAzIDE4OSAyNDkgCis4NyA4NyAxNzAgMTMyIDEzIDE0NyA1MSAxMzIgOTYgMTA5IDE0OSA0OSAyMTcgMjMzIDExMyA2MiAyNTcgOTAgNjQgNzggMTM3IDM5IAorMjE2IDE3MSAxMTEgNTMgNTggNzMgMjggOCAyMTUgNTggMjUwIDY2IDE3MCAzOCAxOTcgMTY5IDEwMiAxMTQgNDEgMzcgMjE4IDg2IDIzNCAKKzkyIDE0NSAxMjUgMTU1IDE3NyAyNTAgMjQzIDIwOCAyMDAgMjAgNDggMjEgMTUwIDI0NSA0MCAxMDEgMTc4IDIxOCAxNjkgMTk2IDE5MCAKKzE5IDI0NiAyMzYgMTQxIDQ2IDIzIDY1IDEwOCAzNiAxODggMTg3IDg1IDc4IDIzMSAxMTUgMjM3IDEyMCA4NiAxNTEgMTMwIDQgMjA4IAorMzQgOTYgMjYgMTg3IDE2OCA0MCAxMTIgMzIgOTggMjAxIDUwIDE2NCAxMjcgMTIxIDE1OSA3IDE5IDIzNSAxMjIgMSAxNCAxMjYgOTEgCisxMTggNSAxMDQgMTEyIDEyNiAxNzQgMjIyIDI1OSAxODIgMjI1IDE5MyA5MCAyMzAgMiAxMTYgOTAgMTk4IDExNiAzOSAxMjIgOTUgOTAgCisxNDcgNDAgMTggMjE2IDc3IDM1IDc1IDEwOSA1NSAxOTAgMTk2IDI0IDk1IDcgMTg1IDE1OSAxMDEgOTUgMjU2IDcxIDE5IDY5IDE5OCAKKzIyIDE4MCAxNDQgMTQ2IDcyIDQ5IDIyOCA4NyAyNTMgOTQgMTExIDY0IDE3MiAyMTMgNjAgMTY1IDE4OSAxNjYgMTI1IDIwNiAzNiAxMSAKKzE0OSAxODMgMjU1IDkyIDE5NiAyMDEgMTMzIDEyNiA4IDM4IDIwIDEzMSAyMDAgMzEgMTYyIDE2MSAxODIgMTQyIDE0IDIwOSA1MyAxNDEgCiszNSAxMjYgMTg1IDc2IDEzOSAyMTQgNzkgMTY3IDE5OCAxMDUgMTQyIDI0MiA2MyAxOTMgMTczIDE5MiAxMDAgMzMgMjExIDYyIDgwIDUyIAorMTYyIDIxMiAyNTggMTIwIDE4MCAyMjcgMTA4IDIxMyAyMjYgODkgMTY4IDIxNyAxNTAgMTUxIDE4MSA4MCAyMjkgMjAwIDExNCAxMjQgCisyNTkgOTkgMyA5NSAxNzMgMTA5IDEzOCAxNTIgNzcgMjAxIDEyOSBeCis1NTUgMCA4NCAxNDkgMjE1IDEzOSAyMTAgMTU4IDM4IDE1MyAxNCAxMzMgMTA5IDE1MiAxNTYgMjQ4IDIzMiA5IDE4MyAyNDAgMjM2IDUwIAorMTY3IDE3IDE0OCAxNTggMTYzIDkzIDMgOCAzMiAxMDMgOCAyMDAgMjA0IDEwOCAzMiA5IDU4IDg5IDI0NyAxNzUgMjQ0IDY2IDg1IDE1NSAKKzE5MSAyNTYgMTU0IDIzOSAyMTAgMTE1IDEzOSA0MiAxMDggMjAwIDExMCAyMDkgMTMyIDEwMyAxNzYgMzkgNDIgMTUxIDk5IDEwIDExNSAKKzY1IDEwMiAxMTkgNjMgMTg3IDI1OCA2OSAxMDAgMjA0IDIwMiAxOTMgMTcxIDE1IDIzMyAzNSAxMTggNiAyMTEgMTQxIDEyNSA3MCA4MyAKKzI5IDY4IDY3IDE4NSA4MSAxNTcgMTA2IDExNyAxNDggNjQgMiAxOTMgNDYgNzUgMzMgMTYwIDI0NiA1NSA5NyAxMzggMTUzIDE4MiAxODMgCisyNjAgMTk1IDIyMyAxOTggMjcgMjQ3IDM4IDE4NCA1NSAyMjIgNzggMTQyIDU3IDEwNiAyMTEgNDcgMjI2IDE3MCAxMjYgOTYgMTggNiAKKzQzIDQwIDI1IDIzOCAyMjcgMjggMTEgMjM1IDIxMiAzMCAzNiAxOTUgMjU0IDIzOSAxMTYgMTY1IDI4IDg1IDE3NSAxNTAgMTY3IDE4NSAKKzI0OSAyNTggMjA2IDE2MCAyMTUgNjUgOCAyMjAgMTYzIDE5IDYzIDE5IDE1NyAxODAgNTcgMTM3IDIwMSAxMzYgMTQ0IDE2MCA3OCAyMTYgCisyNTkgOTUgODYgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDExNyA3NCAxMjQgMTMgNTYgMTc0IDEyNCAxODEgMTU3IDEyIDIxOCAyNDggMTU4IAorNjkgMTk0IDEwMyA1MSA5OSA1MyAxNCAxNzYgNTkgNTIgNjIgMTMwIDIwIDIxNCAxNTYgMTIzIDMwIDIwIDQ2IDEwNiAyMyAyNDkgMTY0IAorNDUgNDkgNDcgMTMyIDkgMTUgMTM5IDEzNiA3IDEwMCAxNiA5MSAxODIgNDYgMTQ5IDE4NCA5OCAxMjEgMjQwIDQ4IDI1MiAxNTYgMTU0IAorNzEgMTA5IDIyNiA5NiAxODYgMTA3IDE0MyAxMzQgOTIgMTg4IDIyIDQgMTI4IDE3OSAyNDIgMTUxIDE3MyAxNjEgMTA0IDIwMiAyNSA3MCAKKzEyNiAxOTAgMTc5IDE2OCAyMTEgMjM1IDI0IDE4MSAyNTEgMTczIDY3IDIwNSA0MCA2OCAxMzcgMTI3IDE5NiAyMDYgMjMgMTU1IDMgCisxNDUgOTIgMTE0IDgyIDY2IDI1MyAyNTYgMjkgMzcgMjIxIDE4OSA1IDkxIDI1NiAxOTcgMTM4IDU5IDIxIDcyIDQxIDUxIDIyNCAyNTUgCiszIDEwMiAxOTMgMyAxNzYgMTMzIDIwMyA1MSA1NiAxNTQgMTY1IDggMTI2IDIgMTE5IDE1NyA4NiAxMDcgMjM3IDMzIDIwMyAxNDUgMjE3IAorNTQgNzEgMjAzIDEyNSAyMDcgMTQzIDQwIDE5MyA3NyAxMTYgMTIyIDc4IDIzNiA3IDYgMTE3IDI0MiAyMjUgMTEzIDE1MCAyNDEgMTI1IAorMjM4IDEzMyAxMjkgMTExIDY3IDE3IDI0MiA1NyAxMiA1MCAxNDcgNyAyMzcgMTI3IDE1MyA0NSAxMjMgMTk4IDEyMSAxNDYgMTQ5IDkwIAorMTk5IDIyMSAyMSAxNjYgMjAyIDE2MiAxMzAgMTg4IDUzIDQ1IDIxNyAxNDggMjMyIDUyIDgyIDE0MCAxNDIgMjQ1IDE2NiAyMjIgMTcyIAorNDEgMjE5IDYzIDkzIDk3IDE2OSAxOTQgOSAxNTIgMjUwIDE0NyAxMzIgMTc3IDY1IDI4IDE3OSA3NCA1MCA3MyAxMTggMzcgMjAxIDIzMCAKKzk0IDYwIDI0NiAxNDkgNDcgMzggMTEwIDExNSAyMzMgMjAzIDIxOSAxMDYgNDMgMjA4IDc1IDc2IDU5IDk1IDEyIDMwIDE4OCA5NiAyMDYgCisxMTcgNTQgMTY1IDEwMiAyNSAxNjQgNzYgMzkgMTM2IDEwMSAyNjEgMTc4IDQ4IDY0IDQ1IDE0MyAyMDggMzIgMTc3IDE1OSAxODkgNzkgCiszMSAyNDUgMTIzIDYxIDEwIDEzNSAyNCAxMyAxNTAgNzMgMjQgODcgOTAgNjIgMTYxIDEwIDQxIDEyNSAxMTMgMjQ0IDE0MCAyMzYgMTQ0IAorNjYgMTI4IDEwNSA5MSAxNjIgMzYgMjcgMTUzIDg4IDIyIDk4IDI3IDc5IDE5OSA4NCAyMjMgMTA0IDEyOCA4NSA4MSAyNTEgNSAxNyA1NCAKKzI1OSAxIDE4NyA3MCAyMjAgODkgNzkgNzQgMTQ0IDIzNCAyMjkgMjA1IDEzNCAxOCAzNyAzMyAxMjkgMjA1IDIyOCAxNzkgMTQ4IDI1MiAKKzYyIDI1NSAxNzEgMTUyIDgyIDQ2IDI0MyA4MyAyNjAgMjcgMTIyIDk4IDE5NSAxMjkgMzcgMTI3IDI4IDEwNSAxMzQgMjA3IF4KKzU0NSAxIDE5NiAxOTMgODYgMTM2IDE2IDEyMCAxNjggMTMzIDExNCAxNzAgNDggMjM3IDE2MiAxMzUgMjkgMjkgNDAgNjAgMjE4IDIgCisxOTggMTE5IDIyOSAyMiA5MiAxMDggMTYxIDE0OCAyMDIgMTY1IDI2IDE2NCA1MCAxNTIgODAgMTI3IDExNiA4NSAxNzEgMjQgNDQgMTkxIAorMTYwIDE5OCA3MSAyNDkgMTgwIDE0MCA5OSA4MiA1MyA1NCAyMzUgNDIgMTIgMzcgMjA2IDI0OCAxOTMgNDkgMTc2IDkgMTU3IDkxIDE4MCAKKzEyOSAyMCAxODggNSA2MyAxMDkgMTM3IDIxOSAyMzEgMTkwIDE5NSAxIDI1OSA4IDIwNyAyMjQgMTkgMjAxIDIzNyAxOTkgMzYgMjQxIAorMjU2IDExNyA3MiAyMDMgMTUyIDU4IDg3IDY0IDQ4IDI0OCAyNDEgMjkgNzcgMjAgMTY2IDIyOSAxMSA3MiAyMTQgMTcyIDIxNiA3NiA1NSAKKzE3NCA5NCAzNCA5OSA5MyA3MyAxNTMgMTkgMjM4IDEzOCAxNDcgMjYzIDU0IDQgMTAyIDE2MyA2MyAxMjAgMTU3IDExMyAyMjAgMTgxIAorNTcgMTExIDUyIDc4IDIyMyAxMyAyNTEgNzMgMTY0IDM5IDEzMiAxODYgMTM4IDE4NCAyMjMgNjEgMTcyIDE3OSAxNzUgMTA3IDYgMTcgCis4MSAxMTQgMjA3IDIxMyAxODUgMTI1IDIxMiAyNDYgNzMgMTkwIDE4NCAxODYgMTAxIDIyNCAxMSA5OCA5NSAyMjYgMTMxIDIyMSAxNDYgCis0OSAxODcgODggNTEgMTM5IDExMiAyNTUgMTg5IDI0NSA3NSA3OSAxNjIgMTI0IDkgMTM1IDUxIDEyOCA5MiA5NyAxNDEgNDkgMjEzIAorMjMzIDEwNSA1NCAyNTcgODIgNjQgNzQgMTI5IDMxIDIwOCAxNjMgMTExIDQxIDU4IDY1IDI0IDI2MCAyMTEgNTQgMjQ2IDYyIDE3MCAyNiAKKzE5NyAxNjkgOTggMTA2IDQxIDI1IDIxMCA3OCAyMzQgOTIgMTQ1IDEyMSAxNTUgMTY1IDI0MiAyNDMgMjA4IDIwMCAxMiA0OCAyMSAxNDIgCisyNDEgNDAgOTcgMTc4IDIxNCAxNjEgMTk2IDE4MiA3IDI0MiAyMzIgMTI5IDQyIDIzIDU3IDEwMCAzMiAxODQgMTc1IDgxIDY2IDIyNyAKKzEwNyAyMzMgMTE2IDc0IDE1MSAxMzAgMjYwIDIwMCAzNCA4OCAxNCAxNzkgMTY0IDI4IDExMiAyOCA5MCAxOTMgMzggMTU2IDExNSAxMDkgCisxNTkgMjU5IDE5IDIyNyAxMTggMjUzIDEwIDEyMiA4MyAyNTYgMTA2IDI1NyAxMDQgMTA0IDEyNiAxNjYgMjE4IDI1NSAxNzggMjI1IAorMTgxIDkwIDIzMCAyNjIgMTA0IDc4IDE4NiAxMTIgMzkgMTEwIDg3IDg2IDE0NyAzNiAxNCAyMTYgNjUgMzUgNzUgMTA1IDQzIDE3OCAKKzE4OCAxNiA4MyAzIDE4NSAxNTEgOTMgOTUgMjUyIDcxIDExIDYxIDE5NCAxNCAxNjggMTQ0IDEzNCA2NCAzNyAyMjggODMgMjQ1IDg2IAorOTkgNTYgMTcyIDIwNSA1NiAxNjEgMTg1IDE2MiAxMTMgMTk0IDM2IDMgMTM3IDE3MSAyNTEgODQgMTg0IDE5NyAxMjEgMTE4IDMwIDE2IAorMTMxIDE4OCAyNyAxNjIgMTYxIDE3NCAxNDIgMTQgMjA1IDQ1IDE0MSAyNyAxMTQgMTgxIDY4IDEzMSAyMTAgNjcgMTU1IDE5OCA5NyAKKzEzMCAyMzQgNTUgMTg1IDE3MyAxOTIgODggMjUgMTk5IDU4IDc2IDQ0IDE1NCAyMDAgMjUwIDEwOCAxNzIgMjI3IDk2IDIxMyAyMjIgODUgCisxNjAgMjA5IDE1MCAxNDMgMTY5IDcyIDIyNSAxOTIgMTEwIDEyNCAyNTEgOTUgMjYzIDkxIDE2OSAxMDkgMTI2IDE0MCA3MyAyMDEgMjA0IAorODAgMTQ5IDIxNSAxMzcgMjA4IDE1MiAzMiAxNDcgMTAgMTMzIDEwMyAxNTAgMTU0IDI0OCAyMzAgOSAxODMgMjM2IDIzNCA0NCAxNjUgCisxNSAxNDQgMTU2IDE2MyA4OSAxIDYgMjggMTAxIDggMTk2IDIwNCAxMDYgMzAgNSA1MiA4OSAyNDMgMTcxIDI0MCA2NCA4NSAxNDkgMTg5IAorMjU2IDE1NCAyMzcgMjEwIDExNSAxMzUgNDAgMTA4IDE5OCAxMDggMjA5IDEyOCAxMDMgMTc2IDM1IDM4IDE0NSA5NSAxMCAxMTEgNjMgCis5OCAxMTcgNjEgMTgzIDI1OCA2OSA5NiAyMDIgMjAyIDE5MSAxNzEgMTMgMjI5IDMzIDExMiAyIDIwOSAxMzkgMTIzIDcwIDgzIDI5IDY2IAorNjcgMTgxIDc5IDE1MSAxMDQgMTE1IDE0NiA2MCAyIDE4NyA0MCA3MSAzMyAxNjAgMjQ2IDUxIDkxIDEzMiAxNzggXgorNTYzIDEgMTc0IDE3MSAyNjAgMTgzIDIxNSAxOTAgMjMgMjQ3IDM4IDE4MCA1NSAyMjIgNzAgMTM4IDQ1IDk4IDIxMSAzOSAyMjYgMTY2IAorMTE4IDkyIDYgMjYwIDM5IDMyIDI1IDIzNCAyMTkgMjAgMyAyMjcgMjEyIDMwIDI1NCAyOCAxOTUgMjU0IDIzOSAxMTIgMTUzIDI4IDczIAorMTcxIDEzOCAxNjcgMTgxIDI0NSAyNTAgMTk4IDE0OCAyMDcgNjUgMjYyIDIyMCAxNTUgMTUgNTUgMTEgMTUzIDE3MiA1NyAxMzcgMTkzIAorMTI4IDEzMiAxNTYgNzggMjA4IDI1NSA5MSA4MiAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMTA1IDc0IDExMiA5IDQ0IDE3NCAxMTYgMTc3IAorMTQ5IDQgMjE4IDI0MCAxNTggNjUgMTkwIDk1IDM5IDg3IDQxIDIgMTY0IDU5IDUyIDUwIDExOCAyMCAyMTQgMTQ0IDExMSAxOCAxNiA0NiAKKzEwNiAxNSAyNDkgMTUyIDM3IDQ1IDQzIDEyOCA1IDE1IDEyNyAxMzYgMyAxMDAgNCA3OSAxODIgNDIgMTM3IDE3NiA4NiAxMTcgMjQwIAorMzYgMjQ4IDE1NiAxNTAgNjcgMTA1IDIxOCA5NiAxNzQgOTkgMTM1IDEzNCA4OCAxNzYgMTQgMjU4IDEyNCAxNzUgMjM0IDE0NyAxNjEgCisxNTMgMTAwIDE5OCAyMSA2NiAxMTQgMTkwIDE2NyAxNjQgMjAzIDIzNSAxNiAxNzMgMjQ3IDE2NSA1NSAyMDUgMjggNTYgMTI5IDEyMyAKKzE4NCAyMDYgMTkgMTUxIDI1NyAxMzMgODAgMTA2IDcwIDY2IDI1MyAyNDggMTcgMjUgMjE3IDE3NyA1IDg3IDI1MiAxODUgMTMwIDQ3IAorMTMgNjggMjkgNDcgMjI0IDI1MSAyNjEgMTAyIDE4NSAzIDE3MiAxMjkgMTk1IDQzIDU2IDE0NiAxNjUgMTIyIDI2MCAxMTEgMTU3IDc0IAorOTUgMjMzIDI5IDE5MSAxNDEgMjE3IDUwIDYzIDIwMyAxMTMgMTk5IDEzOSAzNiAxOTMgNzMgMTE2IDEyMiA2NiAyMzYgNyAyIDEwOSAKKzI0MiAyMTcgMTA1IDE0NiAyMzcgMTI1IDIzOCAxMjEgMTI1IDk5IDYzIDkgMjM4IDQ5IDUwIDEzNSAyNjEgMjI5IDEyNyAxNTMgNDUgCisxMTUgMTg2IDEyMSAxNDIgMTQxIDc4IDE5MSAyMTMgOSAxNjYgMTkwIDE1MCAxMjIgMTg4IDUzIDQxIDIxMyAxNDggMjI0IDQwIDc4IAorMTM2IDEzMCAyNDEgMTU0IDIxOCAxNjggMzMgMjE1IDYzIDgxIDk3IDE2NSAxOTQgMjYzIDE0NCAyNTAgMTQzIDEzMiAxNzMgNTMgMjQgCisxNzEgNjYgNDIgNjUgMTE4IDM3IDE4OSAyMjYgOTQgNjAgMjQyIDE0NSA0NyAzMCAxMTAgMTExIDIyOSAxOTkgMjExIDk0IDQzIDIwMCAKKzYzIDY0IDU1IDgzIDEyIDIyIDE4NCA4NCAyMDIgMTE3IDQ2IDE2MSA5OCAxNyAxNjQgNzYgMjcgMTMyIDEwMSAyNjEgMTc0IDQ0IDUyIAorMzMgMTQzIDIwNCAzMiAxNjkgMTUxIDE4NSA3NSAzMSAyNDUgMTIzIDU3IDI2NCAxMzUgMTIgNSAxNDIgNjkgMjAgNzUgODYgNjIgMTU3IAorMiAzNyAxMTcgMTAxIDI0NCAxMzIgMjI4IDEzNiA1OCAxMTYgMTA1IDkxIDE1NCAyNCAyNyAxNDkgNzYgMTAgOTAgMTkgNzkgMTk5IDg0IAorMjE5IDkyIDEyOCA3NyA3MyAyNDMgMjYzIDE3IDQyIDI1OSAyNTkgMTg3IDYyIDIxMiA4NSA3MSA2MiAxNDAgMjI2IDIyMSAyMDEgMTI2IAorMTggMzMgMjEgMTIxIDE5NyAyMjQgMTc5IDEzNiAyNTIgNTggMjU1IDE2MyAxNDAgODIgMzggMjM1IDcxIDI1NiAxNSAxMTAgOTQgMTg3IAorMTE3IDI5IDExOSAxNiAxMDEgMTIyIDQ5IDE5NCAxOTEgODYgMTM0IDE2IDExOCAxNjQgMTMxIDExMCAxNjYgNDYgMjMzIDE1NiAxMzMgCisyNSAyMyAzNiA1NCAyMTQgMTk0IDExOSAyMjcgMTggODggMTA0IDE1NSAxNDIgMTk2IDE2MSAyNiAxNTggNDggMTQ4IDgwIDEyMyAxMTIgCis4MSAxNjkgMjQgNDQgMTkxIDE1OCAxOTIgNjUgMjQ1IDE3OCAxNDAgOTkgODAgNTEgNTQgMjMxIDQyIDEwIDM1IDIwMiAyNDQgMTg3IDQ1IAorMTcwIDMgMTU1IDg3IDE4MCAxMjcgMTQgMTg2IDI2NSA1OSAxMDcgMTMzIDIxOSAyMzEgMTg2IDE5MyAxIDI1NyA2IDIwNSAyMjIgMjY0IAorMTMgMTk1IDIzNyAxOTcgMzAgMjM3IDI1MiAxMTMgNzIgMTk3IDE1MiA1NCA4NyA1OCA0NCAyNDYgMjQxIDI3IDc3IDE4IDE2MCAyMjkgNSAKKzcwIDIxMCAxNzAgMjE0IDcyIDUzIDE2OCA4OCAzMiA5NyA5MyA2OSAyNjEgXgorNTYzIDEgMTUgMjM0IDEzMCAxMzkgMjU1IDQyIDQgOTAgMTUxIDUxIDEyMCAxNDUgMTEzIDIxMiAxODEgNDUgMTA3IDQ0IDc0IDIxOSAxIAorMjUxIDYxIDE1NiAzMSAxMjggMTg2IDEzOCAxODQgMjIzIDYxIDE2MCAxNjcgMTc1IDEwNyA2IDUgODEgMTE0IDIwNyAyMDUgMTczIDExMyAKKzIwOCAyMzggNzMgMTg2IDE3NiAxNzggOTMgMjE2IDExIDk4IDgzIDIxOCAxMTkgMjIxIDE0NiAzNyAxNzkgODggNDcgMTM5IDEwNCAyNDcgCisxODkgMjQxIDYzIDcxIDE1NCAxMTYgNSAxMjMgNTEgMTI0IDg4IDg1IDEzMyA0OSAyMDkgMjMzIDk3IDQ2IDI1NyA3NCA2NCA3MCAxMjEgCisyMyAyMDAgMTU1IDExMSAyOSA1OCA1NyAyMCAyNTIgMjA3IDUwIDI0MiA1OCAxNzAgMTQgMTk3IDE2OSA5NCA5OCA0MSAxMyAyMDIgNzAgCisyMzQgOTIgMTQ1IDExNyAxNTUgMTUzIDIzNCAyNDMgMjA4IDIwMCA0IDQ4IDIxIDEzNCAyMzcgNDAgOTMgMTc4IDIxMCAxNTMgMTk2IAorMTc0IDI2MyAyMzggMjI4IDExNyAzOCAyMyA0OSA5MiAyOCAxODAgMTYzIDc3IDU0IDIyMyA5OSAyMjkgMTEyIDYyIDE1MSAxMzAgMjU2IAorMTkyIDM0IDgwIDIgMTcxIDE2MCAxNiAxMTIgMjQgODIgMTg1IDI2IDE0OCAxMDMgOTcgMTU5IDI1MSAxOSAyMTkgMTE0IDI0NSA2IDExOCAKKzc1IDI1MiA5NCAyNDkgMTA0IDk2IDEyNiAxNTggMjE0IDI1MSAxNzQgMjI1IDE2OSA5MCAyMzAgMjYyIDkyIDY2IDE3NCAxMDggMzkgOTggCis3OSA4MiAxNDcgMzIgMTAgMjE2IDUzIDM1IDc1IDEwMSAzMSAxNjYgMTgwIDggNzEgMjY3IDE4NSAxNDMgODUgOTUgMjQ4IDcxIDMgNTMgCisxOTAgNiAxNTYgMTQ0IDEyMiA1NiAyNSAyMjggNzkgMjM3IDc4IDg3IDQ4IDE3MiAxOTcgNTIgMTU3IDE4MSAxNTggMTAxIDE4MiAzNiAKKzI2MyAxMjUgMTU5IDI0NyA3NiAxNzIgMTkzIDEwOSAxMTAgMjYwIDIyIDEyIDEzMSAxNzYgMjMgMTYyIDE2MSAxNjYgMTQyIDE0IDIwMSAKKzM3IDE0MSAxOSAxMDIgMTc3IDYwIDEyMyAyMDYgNTUgMTQzIDE5OCA4OSAxMTggMjI2IDQ3IDE3NyAxNzMgMTkyIDc2IDE3IDE4NyA1NCAKKzcyIDM2IDE0NiAxODggMjQyIDk2IDE2NCAyMjcgODQgMjEzIDIxOCA4MSAxNTIgMjAxIDE1MCAxMzUgMTU3IDY0IDIyMSAxODQgMTA2IAorMTI0IDI0MyA5MSAyNjMgODcgMTY1IDEwOSAxMTQgMTI4IDY5IDIwMSAxOTIgNzIgMTQ5IDIxNSAxMzMgMjA0IDE0MCAyMCAxMzUgMiAKKzEzMyA5MSAxNDYgMTUwIDI0OCAyMjYgOSAxODMgMjI4IDIzMCAzMiAxNjEgMTEgMTM2IDE1MiAxNjMgODEgMjY1IDIgMjAgOTcgOCAxODggCisyMDQgMTAyIDI2IDI2NSA0MCA4OSAyMzUgMTYzIDIzMiA2MCA4NSAxMzcgMTg1IDI1NiAxNTQgMjMzIDIxMCAxMTUgMTI3IDM2IDEwOCAKKzE5NCAxMDQgMjA5IDEyMCAxMDMgMTc2IDI3IDMwIDEzMyA4NyAxMCAxMDMgNTkgOTAgMTEzIDU3IDE3NSAyNTggNjkgODggMTk4IDIwMiAKKzE4NyAxNzEgOSAyMjEgMjkgMTAwIDI2MiAyMDUgMTM1IDExOSA3MCA4MyAyOSA2MiA2NyAxNzMgNzUgMTM5IDEwMCAxMTEgMTQyIDUyIDIgCisxNzUgMjggNjMgMzMgMTYwIDI0NiA0MyA3OSAxMjAgMTQxIDE3MCAxNjUgMjYwIDE3NyAyMTEgMTg2IDIxIDI0NyAzOCAxNzggNTUgMjIyIAorNjYgMTM2IDM5IDk0IDIxMSAzNSAyMjYgMTY0IDExNCA5MCAyNTYgMzcgMjggMjUgMjMyIDIxNSAxNiAyNjcgMjIzIDIxMiAzMCAyNTAgCisyNCAxOTUgMjU0IDIzOSAxMTAgMTQ3IDI4IDY3IDE2OSAxMzIgMTY3IDE3OSAyNDMgMjQ2IDE5NCAxNDIgMjAzIDY1IDI1OCAyMjAgMTUxIAorMTMgNTEgNyAxNTEgMTY4IDU3IDEzNyAxODkgMTI0IDEyNiAxNTQgNzggMjA0IDI1MyA4OSA4MCAyMzIgMTc3IDIyIDEyOSA2OCAxNjggCis5OSA3NCAxMDYgNyAzOCAxNzQgMTEyIDE3NSAxNDUgMjE4IDIzNiAxNTggNjMgMTg4IDkxIDMzIDgxIDM1IDI2NCAxNTggNTkgNTIgNDQgCisxMTIgMjAgMjE0IDEzOCAxMDUgMTIgMTQgNDYgMTA2IDExIDI0OSAxNDYgMzMgNDMgNDEgMTI2IDMgMTUgMTIxIDEzNiAxIDEwMCAyNjYgCis3MyAxODIgNDAgMTMxIDE3MiA4MCAxMTUgMjQwIDMwIDI0NiAxODYgXgorNTczIDAgMTQ2IDYzIDEwMSAyMTAgOTYgMTYyIDkxIDEyNyAxMzQgODQgMTY0IDYgMjUwIDEyMCAxNzEgMjI2IDE0MyAxNDkgMTQ1IDk2IAorMTk0IDE3IDYyIDEwMiAxOTAgMTU1IDE2MCAxOTUgMjM1IDggMTY1IDI0MyAxNTcgNDMgMjA1IDE2IDQ0IDEyMSAxMTkgMTcyIDIwNiAxNSAKKzE0NyAyNDkgMTIxIDY4IDk4IDU4IDY2IDI1MyAyNDAgNSAxMyAyMTMgMTY1IDUgODMgMjQ4IDE3MyAxMjIgMzUgNSA2NCAxNyA0MyAyMjQgCisyNDcgMjU3IDEwMiAxNzcgMyAxNjggMTI1IDE4NyAzNSA1NiAxMzggMTY1IDI2MiAxMTggMjU2IDEwMyAxNTcgNjIgODMgMjI5IDI1IAorMTc5IDEzNyAyMTcgNDYgNTUgMjAzIDEwMSAxOTEgMTM1IDMyIDE5MyA2OSAxMTYgMTIyIDU0IDIzNiA3IDI2OCAxMDEgMjQyIDIwOSA5NyAKKzE0MiAyMzMgMTI1IDIzOCAxMDkgMTIxIDg3IDU5IDEgMjM0IDQxIDI1OCA1MCAxMjMgMjUzIDIyMSAxMjcgMTUzIDQ1IDEwNyAxNzQgCisxMjEgMTM4IDEzMyA2NiAxODMgMjA1IDI2NyAxNjYgMTc4IDEzOCAxMTQgMTg4IDUzIDM3IDIwOSAxNDggMjE2IDI4IDc0IDEzMiAxMTggCisyMzcgMTQyIDIxNCAxNjQgMjUgMjExIDYzIDY5IDk3IDE2MSAxOTQgMjU1IDEzNiAyNTAgMTM5IDEzMiAxNjkgNDEgMjAgMTYzIDU4IDM0IAorNTcgMTE4IDM3IDE3NyAyMjIgOTQgNjAgMjM4IDE0MSA0NyAyMiAxMTAgMTA3IDIyNSAxOTUgMjAzIDgyIDQzIDE5MiA1MSA1MiA1MSA3MSAKKzEyIDE0IDE4MCA3MiAxOTggMTE3IDM4IDE1NyA5NCA5IDE2NCA3NiAxNSAxMjggMTAxIDI2MSAxNzAgNDAgNDAgMjEgMTQzIDIwMCAzMiAKKzE2MSAxNDMgMTgxIDcxIDMxIDI0NSAxMjMgNTMgMjU2IDEzNSAyNjcgMTM0IDY1IDE2IDYzIDgyIDYyIDE1MyAyNjQgMzMgMTA5IDg5IAorMjQ0IDEyNCAyMjAgMTI4IDUwIDEwNCAxMDUgOTEgMTQ2IDEyIDI3IDE0NSA2NCAyNjggODIgMTEgNzkgMTk5IDg0IDIxNSA4MCAxMjggCis2OSA2NSAyMzUgMjU5IDE3IDMwIDI1OSAyNTUgMTg3IDU0IDIwNCA4MSA2MyA1MCAxMzYgMjE4IDIxMyAxOTcgMTE4IDE4IDI5IDkgMTEzIAorMTg5IDIyMCAxNzkgMTI0IDI1MiA1NCAyNTUgMTU1IDEyOCA4MiAzMCAyMjcgNTkgMjUyIDMgOTggOTAgMTc5IDEwNSAyMSAxMTEgNCA5NyAKKzExMCAzNyAxOTAgMTg3IDg2IDEzMCAxNiAxMTQgMTU2IDEyNyAxMDIgMTU4IDQyIDIyNSAxNDQgMTI5IDE3IDExIDI4IDQyIDIwNiAyNjYgCisxODYgMTE5IDIyMyAxMCA4MCA5NiAxNDMgMTMwIDE4NCAxNTMgMjYgMTQ2IDQ0IDE0MCA4MCAxMTUgMTA0IDczIDE2NSAyNCA0NCAxOTEgCisxNTQgMTgwIDUzIDIzNyAxNzQgMTQwIDk5IDc2IDQ3IDU0IDIyMyA0MiA2IDMxIDE5NCAyMzYgMTc1IDM3IDE1OCAyNjEgMTUxIDc5IAorMTgwIDEyMyAyIDE4MiAyNTcgNTEgMTAzIDEyNSAyMTkgMjMxIDE3OCAxODkgMSAyNTMgMiAyMDEgMjE4IDI2NCAxIDE4MyAyMzcgMTkzIAorMTggMjI5IDI0NCAxMDUgNzIgMTg1IDE1MiA0NiA4NyA0NiAzNiAyNDIgMjQxIDIzIDc3IDE0IDE0OCAyMjkgMjYzIDY2IDIwMiAxNjYgCisyMTAgNjQgNDkgMTU2IDc2IDI4IDkzIDkzIDYxIDEzNSAxMyAyMzIgMTI2IDEzNSAyNTEgMzYgNCA4NCAxNDUgNDUgMTIwIDEzOSAxMTMgCisyMDggMTgxIDM5IDEwNSA0MCA3MiAyMTcgMjY1IDI1MSA1NSAxNTIgMjcgMTI2IDE4NiAxMzggMTg0IDIyMyA2MSAxNTQgMTYxIDE3NSAKKzEwNyA2IDI2OSA4MSAxMTQgMjA3IDIwMSAxNjcgMTA3IDIwNiAyMzQgNzMgMTg0IDE3MiAxNzQgODkgMjEyIDExIDk4IDc3IDIxNCAxMTMgCisyMjEgMTQ2IDMxIDE3NSA4OCA0NSAxMzkgMTAwIDI0MyAxODkgMjM5IDU3IDY3IDE1MCAxMTIgMyAxMTcgNTEgMTIyIDg2IDc5IDEyOSAKKzQ5IDIwNyAyMzMgOTMgNDIgMjU3IDcwIDY0IDY4IDExNyAxOSAxOTYgMTUxIDExMSAyMyA1OCA1MyAxOCAyNDggMjA1IDQ4IDI0MCA1NiAKKzE3MCA4IDE5NyAxNjkgOTIgOTQgNDEgNyAxOTggNjYgMjM0IDkyIDE0NSAxMTUgMTU1IDE0NyAyMzAgMjQzIDIwOCAyMDAgNDggMjEgCisxMzAgMjM1IDQwIDkxIDE3OCAyMDggMTQ5IDE5NiAxNzAgMjU5IDIzNiAyMjYgMTExIDM2IDIzIDQ1IDg4IDI2IDE3OCAxNTcgMjA3IF4KKzU2NiAxIDQyIDIxOSA5MSAyMjUgMTA4IDUwIDE1MSAxMzAgMjUyIDE4NCAzNCA3MiAyNjIgMTYzIDE1NiA0IDExMiAyMCA3NCAxNzcgMTQgCisxNDAgOTEgODUgMTU5IDI0MyAxOSAyMTEgMTEwIDIzNyAyIDExNCA2NyAyNDggODIgMjQxIDEwNCA4OCAxMjYgMTUwIDIxMCAyNDcgMTcwIAorMjI1IDE1NyA5MCAyMzAgMjYyIDgwIDU0IDE2MiAxMDQgMzkgODYgNzEgNzggMTQ3IDI4IDYgMjE2IDQxIDM1IDc1IDk3IDE5IDE1NCAKKzE3MiA1OSAyNjcgMTg1IDEzNSA3NyA5NSAyNDQgNzEgMjY3IDQ1IDE4NiAyNzAgMTQ0IDE0NCAxMTAgNDggMTMgMjI4IDc1IDIyOSA3MCAKKzc1IDQwIDE3MiAxODkgNDggMTUzIDE3NyAxNTQgODkgMTcwIDM2IDI1OSAxMTMgMTQ3IDI0MyA2OCAxNjAgMTg5IDk3IDEwMiAyNTYgMTQgCis4IDEzMSAxNjQgMTkgMTYyIDE2MSAxNTggMTQyIDE0IDE5NyAyOSAxNDEgMTEgOTAgMTczIDUyIDExNSAyMDIgNDMgMTMxIDE5OCA4MSAKKzEwNiAyMTggMzkgMTY5IDE3MyAxOTIgNjQgOSAxNzUgNTAgNjggMjggMTM4IDE3NiAyMzQgODQgMTU2IDIyNyA3MiAyMTMgMjE0IDc3IAorMTQ0IDE5MyAxNTAgMTI3IDE0NSA1NiAyMTcgMTc2IDEwMiAxMjQgMjM1IDg3IDI2MyA4MyAxNjEgMTA5IDEwMiAxMTYgNjUgMjAxIDE4MCAKKzY0IDE0OSAyMTUgMTI5IDIwMCAxMjggOCAxMjMgMjY2IDEzMyA3OSAxNDIgMTQ2IDI0OCAyMjIgOSAxODMgMjIwIDIyNiAyMCAxNTcgNyAKKzEyOCAxNDggMTYzIDczIDI2NSAyNzAgMTIgOTMgOCAxODAgMjA0IDk4IDIyIDI2MSAyOCA4OSAyMjcgMTU1IDIyNCA1NiA4NSAxMjUgCisxODEgMjU2IDE1NCAyMjkgMjEwIDExNSAxMTkgMzIgMTA4IDE5MCAxMDAgMjA5IDExMiAxMDMgMTc2IDE5IDIyIDEyMSA3OSAxMCA5NSAKKzU1IDgyIDEwOSA1MyAxNjcgMjU4IDY5IDgwIDE5NCAyMDIgMTgzIDE3MSA1IDIxMyAyNSA4OCAyNTggMjAxIDEzMSAxMTUgNzAgODMgMjkgCis1OCA2NyAxNjUgNzEgMTI3IDk2IDEwNyAxMzggNDQgMiAxNjMgMTYgNTUgMzMgMTYwIDI0NiAzNSA2NyAxMDggMTMzIDE2MiAxNTMgMjYwIAorMTY1IDIwMyAxNzggMTcgMjQ3IDM4IDE3NCA1NSAyMjIgNTggMTMyIDI3IDg2IDIxMSAyNyAyMjYgMTYwIDEwNiA4NiAyNjAgMjQ4IDMzIAorMjAgMjUgMjI4IDIwNyA4IDI2MyAyMTUgMjEyIDMwIDI0MiAxNiAxOTUgMjU0IDIzOSAxMDYgMTM1IDI4IDU1IDE2NSAxMjAgMTY3IDE3NSAKKzIzOSAyMzggMTg2IDEzMCAxOTUgNjUgMjUwIDIyMCAxNDMgOSA0MyAyNzEgMTQ3IDE2MCA1NyAxMzcgMTgxIDExNiAxMTQgMTUwIDc4IAorMTk2IDI0OSA4NSA3NiAyMzIgMTc3IDIyIDEyOSA2OCAxNjggODcgNzQgOTQgMyAyNiAxNzQgMTA0IDE3MSAxMzcgMjY0IDIxOCAyMjggCisxNTggNTkgMTg0IDgzIDIxIDY5IDIzIDI1NiAxNDYgNTkgNTIgMzIgMTAwIDIwIDIxNCAxMjYgOTMgMTAgNDYgMTA2IDMgMjQ5IDEzNCAKKzI1IDM5IDM3IDEyMiAyNzEgMTUgMTA5IDEzNiAyNjkgMTAwIDI1OCA2MSAxODIgMzYgMTE5IDE2NCA2OCAxMTEgMjQwIDE4IDI0MiAxNTYgCisxNDQgNjEgOTkgMjA2IDk2IDE1NiA4NyAxMjMgMTM0IDgyIDE1OCAyIDI0NiAxMTggMTY5IDIyMiAxNDEgMTQzIDE0MSA5NCAxOTIgMTUgCis2MCA5NiAxOTAgMTQ5IDE1OCAxOTEgMjM1IDQgMTYxIDI0MSAxNTMgMzcgMjA1IDEwIDM4IDExNyAxMTcgMTY2IDIwNiAxMyAxNDUgMjQ1IAorMTE1IDYyIDk0IDUyIDY2IDI1MyAyMzYgMjcxIDcgMjExIDE1OSA1IDgxIDI0NiAxNjcgMTE4IDI5IDEgNjIgMTEgNDEgMjI0IDI0NSAKKzI1NSAxMDIgMTczIDMgMTY2IDEyMyAxODMgMzEgNTYgMTM0IDE2NSAyNjAgMTE2IDI1NCA5OSAxNTcgNTYgNzcgMjI3IDIzIDE3MyAxMzUgCisyMTcgNDQgNTEgMjAzIDk1IDE4NyAxMzMgMzAgMTkzIDY3IDExNiAxMjIgNDggMjM2IDcgMjY4IDk3IDI0MiAyMDUgOTMgMTQwIDIzMSAKKzEyNSAyMzggMTAzIDExOSA4MSA1NyAyNjkgMjMyIDM3IDI1NCA1MCAxMTcgMjQ5IDIxNyAxMjcgMTUzIDQ1IDEwMyAxNjggMTIxIDEzNiAKKzEyOSA2MCAxNzkgMjAxIDI2MyAxNjYgMTcyIDEzMiAxMTAgMTg4IDUzIDM1IDIwNyAxNDggMjEyIDI2MiBeCis1ODkgMCA3MCAxMjggMTA2IDIzMyAxMzAgMjEwIDE2MCAxNyAyMDcgNjMgNTcgOTcgMTU3IDE5NCAyNDcgMTI4IDI1MCAxMzUgMTMyIAorMTY1IDI5IDE2IDE1NSA1MCAyNiA0OSAxMTggMzcgMTY1IDIxOCA5NCA2MCAyMzQgMTM3IDQ3IDE0IDExMCAxMDMgMjIxIDE5MSAxOTUgCis3MCA0MyAxODQgMzkgNDAgNDcgNTkgMTIgNiAxNzYgNjAgMTk0IDExNyAzMCAxNTMgOTAgMSAxNjQgNzYgMyAxMjQgMTAxIDI2MSAxNjYgCiszNiAyOCA5IDE0MyAxOTYgMzIgMTUzIDEzNSAxNzcgNjcgMzEgMjQ1IDEyMyA0OSAyNDggMTM1IDI2MiAyNjMgMTI2IDYxIDEyIDUxIDc4IAorNjIgMTQ5IDI2MCAyOSAxMDEgNzcgMjQ0IDExNiAyMTIgMTIwIDQyIDkyIDEwNSA5MSAxMzggMjcgMTQxIDUyIDI2MCA3NCAzIDc5IDE5OSAKKzg0IDIxMSA2OCAxMjggNjEgNTcgMjI3IDI1NSAxNyAxOCAyNTkgMjUxIDE4NyA0NiAxOTYgNzcgNTUgMzggMTMyIDIxMCAyMDUgMTkzIAorMTEwIDE4IDI1IDI3MSAxMDUgMTgxIDIxNiAxNzkgMTEyIDI1MiA1MCAyNTUgMTQ3IDExNiA4MiAyMiAyMTkgNDcgMjQ4IDI2NSA4NiA4NiAKKzE3MSA5MyAxMyAxMDMgMjY2IDkzIDk4IDI1IDE4NiAxODMgODYgMTI2IDE2IDExMCAxNDggMTIzIDk0IDE1MCAzOCAyMTcgMTMyIDEyNSAKKzkgMjczIDIwIDMwIDE5OCAyNjYgMTc4IDExOSAyMTkgMiA3MiA4OCAxMzEgMTE4IDE3MiAxNDUgMjYgMTM0IDQwIDEzMiA4MCAxMDcgOTYgCis2NSAxNjEgMjQgNDQgMTkxIDE1MCAxNjggNDEgMjI5IDE3MCAxNDAgOTkgNzIgNDMgNTQgMjE1IDQyIDIgMjcgMTg2IDIyOCAxNjMgMjkgCisxNDYgMjUzIDE0NyA3MSAxODAgMTE5IDI2NCAxNzggMjQ5IDQzIDk5IDExNyAyMTkgMjMxIDE3MCAxODUgMSAyNDkgMjcyIDE5NyAyMTQgCisyNjQgMjYzIDE3MSAyMzcgMTg5IDYgMjIxIDIzNiA5NyA3MiAxNzMgMTUyIDM4IDg3IDM0IDI4IDIzOCAyNDEgMTkgNzcgMTAgMTM2IAorMjI5IDI1NSA2MiAxOTQgMTYyIDIwNiA1NiA0NSAxNDQgNjQgMjQgODkgOTMgNTMgMTIzIDkgMjI4IDExOCAxMjcgMjQzIDI0IDQgNzIgCisxMzMgMzMgMTIwIDEyNyAxMTMgMjAwIDE4MSAyNyAxMDEgMzIgNjggMjEzIDI1NyAyNTEgNDMgMTQ0IDE5IDEyMiAxODYgMTM4IDE4NCAKKzIyMyA2MSAxNDIgMTQ5IDE3NSAxMDcgNiAyNjEgODEgMTE0IDIwNyAxOTMgMTU1IDk1IDIwMiAyMjYgNzMgMTgwIDE2NCAxNjYgODEgCisyMDQgMTEgOTggNjUgMjA2IDEwMSAyMjEgMTQ2IDE5IDE2NyA4OCA0MSAxMzkgOTIgMjM1IDE4OSAyMzUgNDUgNTkgMTQyIDEwNCAyNzMgCisxMDUgNTEgMTE4IDgyIDY3IDEyMSA0OSAyMDMgMjMzIDg1IDM0IDI1NyA2MiA2NCA2NCAxMDkgMTEgMTg4IDE0MyAxMTEgMTEgNTggNDUgCisxNCAyNDAgMjAxIDQ0IDIzNiA1MiAxNzAgMjcwIDE5NyAxNjkgODggODYgNDEgMjY5IDE5MCA1OCAyMzQgOTIgMTQ1IDExMSAxNTUgMTM1IAorMjIyIDI0MyAyMDggMjAwIDI2NiA0OCAyMSAxMjIgMjMxIDQwIDg3IDE3OCAyMDQgMTQxIDE5NiAxNjIgMjUxIDIzMiAyMjIgOTkgMzIgCisyMyAzNyA4MCAyMiAxNzQgMTQ1IDcxIDM2IDIxNyA4NyAyMjMgMTA2IDQ0IDE1MSAxMzAgMjUwIDE4MCAzNCA2OCAyNTggMTU5IDE1NCAKKzI3MiAxMTIgMTggNzAgMTczIDggMTM2IDg1IDc5IDE1OSAyMzkgMTkgMjA3IDEwOCAyMzMgMTEyIDYzIDI0NiA3NiAyMzcgMTA0IDg0IAorMTI2IDE0NiAyMDggMjQ1IDE2OCAyMjUgMTUxIDkwIDIzMCAyNjIgNzQgNDggMTU2IDEwMiAzOSA4MCA2NyA3NiAxNDcgMjYgNCAyMTYgCiszNSAzNSA3NSA5NSAxMyAxNDggMTY4IDI3MCA1MyAyNjcgMTg1IDEzMSA3MyA5NSAyNDIgNzEgMjY1IDQxIDE4NCAyNjggMTM4IDE0NCAKKzEwNCA0NCA3IDIyOCA3MyAyMjUgNjYgNjkgMzYgMTcyIDE4NSA0NiAxNTEgMTc1IDE1MiA4MyAxNjQgMzYgMjU3IDEwNyAxNDEgMjQxIAorNjQgMTU0IDE4NyA5MSA5OCAyNTQgMTAgNiAxMzEgMTU4IDE3IDE2MiAxNjEgMTU0IDE0MiAxNCAxOTUgMjUgMTQxIDcgODQgMTcxIDQ4IAorMTExIDIwMCAzNyAxMjUgMTk4IDc3IDEwMCAyMTQgMzUgMTY1IDE3MyAxOTIgNTggNSAxNjkgNDggNjYgMjQgMTM0IDE3MCAyMzAgNzggCisxNTIgMjI3IDY2IDIxMyAyMTIgNzUgMTQwIDE4OSAxNTAgMTIzIDEzOSA1MiAyMTUgMTcyIDEyNCBeCis1ODQgMCAxMjQgMjI3IDgzIDI2MyA3OSAxNTcgMTA5IDkwIDEwNCA2MSAyMDEgMTY4IDU2IDE0OSAyMTUgMTI1IDE5NiAxMTYgMjcyIAorMTExIDI2MiAxMzMgNjcgMTM4IDE0MiAyNDggMjE4IDkgMTgzIDIxMiAyMjIgOCAxNTMgMyAxMjAgMTQ0IDE2MyA2NSAyNjUgMjcwIDQgCis4OSA4IDE3MiAyMDQgOTQgMTggMjU3IDE2IDg5IDIxOSAxNDcgMjE2IDUyIDg1IDExMyAxNzcgMjU2IDE1NCAyMjUgMjEwIDExNSAxMTEgCisyOCAxMDggMTg2IDk2IDIwOSAxMDQgMTAzIDE3NiAxMSAxNCAxMDkgNzEgMTAgODcgNTEgNzQgMTA1IDQ5IDE1OSAyNTggNjkgNzIgMTkwIAorMjAyIDE3OSAxNzEgMSAyMDUgMjEgNzYgMjU0IDE5NyAxMjcgMTExIDcwIDgzIDI5IDU0IDY3IDE1NyA2NyAxMTUgOTIgMTAzIDEzNCAzNiAKKzIgMTUxIDQgNDcgMzMgMTYwIDI0NiAyNyA1NSA5NiAxMjUgMTU0IDE0MSAyNjAgMTUzIDE5NSAxNzAgMTMgMjQ3IDM4IDE3MCA1NSAyMjIgCis1MCAxMjggMTUgNzggMjExIDE5IDIyNiAxNTYgOTggODIgMjUyIDI0MCAyOSAxMiAyNSAyMjQgMTk5IDI1OSAyMDcgMjEyIDMwIDIzNCA4IAorMTk1IDI1NCAyMzkgMTAyIDEyMyAyOCA0MyAxNjEgMTA4IDE2NyAxNzEgMjM1IDIzMCAxNzggMTE4IDE4NyA2NSAyNDIgMjIwIDEzNSA1IAorMzUgMjY3IDE0MyAxNTIgNTcgMTM3IDE3MyAxMDggMTAyIDE0NiA3OCAxODggMjQ1IDgxIDcyIDIzMiAxNzcgMjIgMTI5IDY4IDE2OCA3NSAKKzc0IDgyIDI3NSAxNCAxNzQgOTYgMTY3IDEyOSAyNjAgMjE4IDIyMCAxNTggNTUgMTgwIDc1IDkgNTcgMTEgMjQ4IDEzNCA1OSA1MiAyMCAKKzg4IDIwIDIxNCAxMTQgODEgMjY0IDYgNDYgMTA2IDI3MSAyNDkgMTIyIDE3IDM1IDMzIDExOCAyNzEgMTUgOTcgMTM2IDI2OSAxMDAgCisyNTAgNDkgMTgyIDMyIDEwNyAxNTYgNTYgMTA3IDI0MCA2IDIzOCAxNTYgMTQwIDU3IDk1IDE5OCA5NiAxNDQgNzkgMTE1IDEzNCA3OCAKKzE0NiAyNzAgMjM4IDExNCAxNjUgMjE0IDEzNyAxMzEgMTMzIDkwIDE4OCAxMSA1NiA4NCAxOTAgMTM3IDE1NCAxODMgMjM1IDI3MiAxNTMgCisyMzcgMTQ1IDI1IDIwNSAyNzQgMjYgMTA5IDExMyAxNTQgMjA2IDkgMTQxIDIzNyAxMDMgNTAgODYgNDAgNjYgMjUzIDIyOCAyNjMgMjcxIAorMjA3IDE0NyA1IDc3IDI0MiAxNTUgMTEwIDE3IDI2OSA1OCAyNzUgMzcgMjI0IDI0MSAyNTEgMTAyIDE2NSAzIDE2MiAxMTkgMTc1IDIzIAorNTYgMTI2IDE2NSAyNTYgMTEyIDI1MCA5MSAxNTcgNDQgNjUgMjIzIDE5IDE2MSAxMzEgMjE3IDQwIDQzIDIwMyA4MyAxNzkgMTI5IDI2IAorMTkzIDYzIDExNiAxMjIgMzYgMjM2IDcgMjY4IDg5IDI0MiAxOTcgODUgMTM2IDIyNyAxMjUgMjM4IDkxIDExNSA2OSA1MyAyNjUgMjI4IAorMjkgMjQ2IDUwIDEwNSAyNDEgMjA5IDEyNyAxNTMgNDUgOTUgMTU2IDEyMSAxMzIgMTIxIDQ4IDE3MSAxOTMgMjU1IDE2NiAxNjAgMTIwIAorMTAyIDE4OCA1MyAzMSAyMDMgMTQ4IDIwNCAxMCA2OCAxMjYgMTAwIDIzMSAxMjQgMjA4IDE1OCAxMyAyMDUgNjMgNTEgOTcgMTU1IDE5NCAKKzI0MyAxMjQgMjUwIDEzMyAxMzIgMTYzIDIzIDE0IDE1MSA0NiAyMiA0NSAxMTggMzcgMTU5IDIxNiA5NCA2MCAyMzIgMTM1IDQ3IDEwIAorMTEwIDEwMSAyMTkgMTg5IDE5MSA2NCA0MyAxODAgMzMgMzQgNDUgNTMgMTIgMiAxNzQgNTQgMTkyIDExNyAyNiAxNTEgODggMjczIDE2NCAKKzc2IDI3MyAxMjIgMTAxIDI2MSAxNjQgMzQgMjIgMyAxNDMgMTk0IDMyIDE0OSAxMzEgMTc1IDY1IDMxIDI0NSAxMjMgNDcgMjQ0IDEzNSAKKzI1OCAyNjEgMTIyIDU5IDEwIDQ1IDc2IDYyIDE0NyAyNTggMjcgOTcgNzEgMjQ0IDExMiAyMDggMTE2IDM4IDg2IDEwNSA5MSAxMzQgCisyNzAgMjcgMTM5IDQ2IDI1NiA3MCAyNzUgNzkgMTk5IDg0IDIwOSA2MiAxMjggNTcgNTMgMjIzIDI1MyAxNyAxMiAyNTkgMjQ5IDE4NyAKKzQyIDE5MiA3NSA1MSAzMiAxMzAgMjA2IDIwMSAxOTEgMTA2IDE4IDIzIDI2NyAxMDEgMTc3IDIxNCAxNzkgMTA2IDI1MiA0OCAyNTUgCisxNDMgMTEwIDgyIDE4IDIxNSA0MSAyNDYgMjYxIDgwIDg0IDE2NyA4NyA5IDk5IDI2MiA5MSA5MiAxOSAxODQgMTgxIDg2IDEyNCAxNiAKKzEwOCAxNDQgMTIxIDkwIDE0NiAzNiAyMTMgMTI2IDEyMyA1IDI2OSAyMzAgXgorNTg3IDAgMTggMTkwIDI2NiAxNzAgMTE5IDIxNSAyNzIgNjQgODAgMTE5IDEwNiAxNjAgMTM3IDI2IDEyMiAzNiAxMjQgODAgOTkgODggCis1NyAxNTcgMjQgNDQgMTkxIDE0NiAxNTYgMjkgMjIxIDE2NiAxNDAgOTkgNjggMzkgNTQgMjA3IDQyIDI3NiAyMyAxNzggMjIwIDE1MSAKKzIxIDEzNCAyNDUgMTQzIDYzIDE4MCAxMTUgMjU2IDE3NCAyNDEgMzUgOTUgMTA5IDIxOSAyMzEgMTYyIDE4MSAxIDI0NSAyNzIgMTkzIAorMjEwIDI2NCAyNTUgMTU5IDIzNyAxODUgMjcyIDIxMyAyMjggODkgNzIgMTYxIDE1MiAzMCA4NyAyMiAyMCAyMzQgMjQxIDE1IDc3IDYgCisxMjQgMjI5IDI0NyA1OCAxODYgMTU4IDIwMiA0OCA0MSAxMzIgNTIgMjAgODUgOTMgNDUgMTExIDUgMjI0IDExMCAxMTkgMjM1IDEyIDQgCis2MCAxMjEgMjEgMTIwIDExNSAxMTMgMTkyIDE4MSAxNSA5NyAyNCA2NCAyMDkgMjQ5IDI1MSAzMSAxMzYgMTEgMTE4IDE4NiAxMzggMTg0IAorMjIzIDYxIDEzMCAxMzcgMTc1IDEwNyA2IDI1MyA4MSAxMTQgMjA3IDE4NSAxNDMgODMgMTk4IDIxOCA3MyAxNzYgMTU2IDE1OCA3MyAKKzE5NiAxMSA5OCA1MyAxOTggODkgMjIxIDE0NiA3IDE1OSA4OCAzNyAxMzkgODQgMjI3IDE4OSAyMzEgMzMgNTEgMTM0IDk2IDI3MyA5MyAKKzUxIDExNCA3OCA1NSAxMTMgNDkgMTk5IDIzMyA3NyAyNiAyNTcgNTQgNjQgNjAgMTAxIDMgMTgwIDEzNSAxMTEgMjc3IDU4IDM3IDEwIAorMjMyIDE5NyA0MCAyMzIgNDggMTcwIDI2MiAxOTcgMTY5IDg0IDc4IDQxIDI2MSAxODIgNTAgMjM0IDkyIDE0NSAxMDcgMTU1IDEyMyAKKzIxNCAyNDMgMjA4IDIwMCAyNjIgNDggMjEgMTE0IDIyNyA0MCA4MyAxNzggMjAwIDEzMyAxOTYgMTU0IDI0MyAyMjggMjE4IDg3IDI4IAorMjMgMjkgNzIgMTggMTcwIDEzMyA2NyAyNCAyMTMgNzkgMjE5IDEwMiAzMiAxNTEgMTMwIDI0NiAxNzIgMzQgNjAgMjUwIDE1MSAxNTAgCisyNjQgMTEyIDE0IDYyIDE2NSAyNzQgMTI4IDczIDY3IDE1OSAyMzEgMTkgMTk5IDEwNCAyMjUgMjc0IDEwOCA1NSAyNDIgNjQgMjI5IAorMTA0IDc2IDEyNiAxMzggMjA0IDI0MSAxNjQgMjI1IDEzOSA5MCAyMzAgMjYyIDYyIDM2IDE0NCA5OCAzOSA2OCA1OSA3MiAxNDcgMjIgCisyMTYgMjMgMzUgNzUgOTEgMSAxMzYgMTYwIDI2NiA0MSAyNjcgMTg1IDEyMyA2NSA5NSAyMzggNzEgMjYxIDMzIDE4MCAyNjQgMTI2IAorMTQ0IDkyIDM2IDI3MyAyMjggNjkgMjE3IDU4IDU3IDI4IDE3MiAxNzcgNDIgMTQ3IDE3MSAxNDggNzEgMTUyIDM2IDI1MyA5NSAxMjkgCisyMzcgNTYgMTQyIDE4MyA3OSA5MCAyNTAgMiAyIDEzMSAxNDYgMTMgMTYyIDE2MSAxNDYgMTQyIDE0IDE5MSAxNyAxNDEgMjc3IDcyIAorMTY3IDQwIDEwMyAxOTYgMjUgMTEzIDE5OCA2OSA4OCAyMDYgMjcgMTU3IDE3MyAxOTIgNDYgMjc1IDE1NyA0NCA2MiAxNiAxMjYgMTU4IAorMjIyIDY2IDE0NCAyMjcgNTQgMjEzIDIwOCA3MSAxMzIgMTgxIDE1MCAxMTUgMTI3IDQ0IDIxMSAxNjQgOTYgMTI0IDIyMyA4MSAyNjMgCis3NyAxNTUgMTA5IDg0IDk4IDU5IDIwMSAxNjIgNTIgMTQ5IDIxNSAxMjMgMTk0IDExMCAyNjggMTA1IDI2MCAxMzMgNjEgMTM2IDE0MCAKKzI0OCAyMTYgOSAxODMgMjA4IDIyMCAyIDE1MSAxIDExNiAxNDIgMTYzIDYxIDI2NSAyNzAgODcgOCAxNjggMjA0IDkyIDE2IDI1NSAxMCAKKzg5IDIxNSAxNDMgMjEyIDUwIDg1IDEwNyAxNzUgMjU2IDE1NCAyMjMgMjEwIDExNSAxMDcgMjYgMTA4IDE4NCA5NCAyMDkgMTAwIDEwMyAKKzE3NiA3IDEwIDEwMyA2NyAxMCA4MyA0OSA3MCAxMDMgNDcgMTU1IDI1OCA2OSA2OCAxODggMjAyIDE3NyAxNzEgMjc3IDIwMSAxOSA3MCAKKzI1MiAxOTUgMTI1IDEwOSA3MCA4MyAyOSA1MiA2NyAxNTMgNjUgMTA5IDkwIDEwMSAxMzIgMzIgMiAxNDUgMjc2IDQzIDMzIDE2MCAyNDYgCisyMyA0OSA5MCAxMjEgMTUwIDEzNSAyNjAgMTQ3IDE5MSAxNjYgMTEgMjQ3IDM4IDE2OCA1NSAyMjIgNDYgMTI2IDkgNzQgMjExIDE1IAorMjI2IDE1NCA5NCA4MCAyNDggMjM2IDI3IDggMjUgMjIyIDE5NSAyNzQgMjU3IDIwMyAyMTIgMzAgMjMwIDQgMTk1IDI1NCAyMzkgMTAwIAorMTE3IDI4IDM3IDE1OSAxMDIgMTY3IDE2OSAyMzMgMjI2IDE3NCAxMTIgMTgzIDY1IDIzOCAyMjAgMTMxIDMgMzEgMjcwIF4KKzYwOSAxIDE0MCAxNDYgNTcgMTM3IDE2NyAxMDIgOTMgMTQzIDc4IDE4MiAyNDIgNzggNjkgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDY2IAorNzQgNzMgMjc1IDUgMTc0IDkwIDE2NCAxMjMgMjU3IDIxOCAyMTQgMTU4IDUyIDE3NyA2OSA0OCAyIDI0MiAxMjUgNTkgNTIgMTEgNzkgCisyMCAyMTQgMTA1IDcyIDI1OCAzIDQ2IDEwNiAyNjggMjQ5IDExMyAxMSAzMiAzMCAxMTUgMjcxIDE1IDg4IDEzNiAyNjkgMTAwIDI0NCAKKzQwIDE4MiAyOSA5OCAxNTAgNDcgMTA0IDI0MCAyNzYgMjM1IDE1NiAxMzcgNTQgOTIgMTkyIDk2IDEzNSA3MyAxMDkgMTM0IDc1IDEzNyAKKzI2NyAyMzIgMTExIDE2MiAyMDggMTM0IDEyMiAxMjcgODcgMTg1IDggNTMgNzUgMTkwIDEyOCAxNTEgMTc3IDIzNSAyNjkgMTQ3IDIzNCAKKzEzOSAxNiAyMDUgMjY4IDE3IDEwMyAxMTAgMTQ1IDIwNiA2IDEzOCAyMzEgOTQgNDEgODAgMzEgNjYgMjUzIDIyMiAyNTcgMjY1IDIwNCAKKzEzOCA1IDc0IDIzOSAxNDYgMTA0IDggMjY2IDU1IDI2OSAzNCAyMjQgMjM4IDI0OCAxMDIgMTU5IDMgMTU5IDExNiAxNjkgMTcgNTYgCisxMjAgMTY1IDI1MyAxMDkgMjQ3IDg1IDE1NyAzNSA1NiAyMjAgMTYgMTUyIDEyOCAyMTcgMzcgMzcgMjAzIDc0IDE3MyAxMjYgMjMgMTkzIAorNjAgMTE2IDEyMiAyNyAyMzYgNyAyNjggODMgMjQyIDE5MSA3OSAxMzMgMjI0IDEyNSAyMzggODIgMTEyIDYwIDUwIDI2MiAyMjUgMjMgCisyNDAgNTAgOTYgMjM1IDIwMyAxMjcgMTUzIDQ1IDg5IDE0NyAxMjEgMTI5IDExNSAzOSAxNjUgMTg3IDI0OSAxNjYgMTUxIDExMSA5NiAKKzE4OCA1MyAyOCAyMDAgMTQ4IDE5OCAxIDY1IDEyMyA5MSAyMjggMTE1IDIwNSAxNTUgNyAyMDIgNjMgNDIgOTcgMTUyIDE5NCAyMzcgCisxMTggMjUwIDEzMCAxMzIgMTYwIDE0IDExIDE0NSA0MCAxNiAzOSAxMTggMzcgMTUwIDIxMyA5NCA2MCAyMjkgMTMyIDQ3IDQgMTEwIDk4IAorMjE2IDE4NiAxODUgNTUgNDMgMTc0IDI0IDI1IDQyIDQ0IDEyIDI3NSAxNzEgNDUgMTg5IDExNyAyMCAxNDggODUgMjcwIDE2NCA3NiAKKzI2NyAxMTkgMTAxIDI2MSAxNjEgMzEgMTMgMjczIDE0MyAxOTEgMzIgMTQzIDEyNSAxNzIgNjIgMzEgMjQ1IDEyMyA0NCAyMzggMTM1IAorMjUyIDI1OCAxMTYgNTYgNyAzNiA3MyA2MiAxNDQgMjU1IDI0IDkxIDYyIDI0NCAxMDYgMjAyIDExMCAzMiA3NyAxMDUgOTEgMTI4IDI2NCAKKzI3IDEzNiAzNyAyNTAgNjQgMjcyIDc5IDE5OSA4NCAyMDYgNTMgMTI4IDUxIDQ3IDIxNyAyNTAgMTcgMyAyNTkgMjQ2IDE4NyAzNiAxODYgCis3MiA0NSAyMyAxMjcgMjAwIDE5NSAxODggMTAwIDE4IDIwIDI2MSA5NSAxNzEgMjExIDE3OSA5NyAyNTIgNDUgMjU1IDEzNyAxMDEgODIgCisxMiAyMDkgMzIgMjQzIDI1NSA3MSA4MSAxNjEgNzggMyA5MyAyNTYgODggODMgMTAgMTgxIDE3OCA4NiAxMjEgMTYgMTA1IDEzOCAxMTggCis4NCAxNDAgMzMgMjA3IDExNyAxMjAgMjc4IDI2MyAxMCAxNSAxODggMjY2IDE2OCAxMTkgMjE0IDI3MSA2MiA3OCAxMTYgMTAzIDE1NyAKKzEzNSAyNiAxMTkgMzUgMTIyIDgwIDk3IDg2IDU1IDE1NiAyNCA0NCAxOTEgMTQ1IDE1MyAyNiAyMTkgMTY1IDE0MCA5OSA2NyAzOCA1NCAKKzIwNSA0MiAyNzYgMjIgMTc2IDIxOCAxNDggMTkgMTMxIDI0MyAxNDIgNjEgMTgwIDExNCAyNTQgMTczIDIzOSAzMyA5NCAxMDcgMjE5IAorMjMxIDE2MCAxODAgMSAyNDQgMjcyIDE5MiAyMDkgMjY0IDI1MyAxNTYgMjM3IDE4NCAyNzAgMjExIDIyNiA4NyA3MiAxNTggMTUyIDI4IAorODcgMTkgMTggMjMzIDI0MSAxNCA3NyA1IDEyMSAyMjkgMjQ1IDU3IDE4NCAxNTcgMjAxIDQ2IDQwIDEyOSA0OSAxOSA4NCA5MyA0MyAKKzEwOCA0IDIyMyAxMDggMTE3IDIzMyA5IDQgNTcgMTE4IDE4IDEyMCAxMTIgMTEzIDE5MCAxODEgMTIgOTYgMjIgNjMgMjA4IDI0NyAyNTEgCisyOCAxMzQgOSAxMTcgMTg2IDEzOCAxODQgMjIzIDYxIDEyNyAxMzQgMTc1IDEwNyA2IDI1MSA4MSAxMTQgMjA3IDE4MyAxNDAgODAgMTk3IAorMjE2IDczIDE3NSAxNTQgMTU2IDcxIDE5NCAxMSA5OCA1MCAxOTYgODYgMjIxIDE0NiA0IDE1NyA4OCAzNiAxMzkgODIgMjI1IDE4OSAKKzIzMCAzMCA0OSAxMzIgOTQgMjczIDkwIDUxIDExMyA3NyA1MiAxMTEgNDkgMTk4IDIzMyA3NSAyNCAyNTcgNTIgNjQgNTkgOTkgMSAxNzggCisxMzMgMTExIDI3NSA1OCAzNSA5IDIzMCAxOTYgMzkgMjMxIDQ3IDE3MCAyMTYgXgorNTg5IDAgMTk3IDE2OSA4MSA3MiA0MSAyNTUgMTc2IDQ0IDIzNCA5MiAxNDUgMTA0IDE1NSAxMTQgMjA4IDI0MyAyMDggMjAwIDI1OSA0OCAKKzIxIDEwOCAyMjQgNDAgODAgMTc4IDE5NyAxMjcgMTk2IDE0OCAyMzcgMjI1IDIxNSA3OCAyNSAyMyAyMyA2NiAxNSAxNjcgMTI0IDY0IAorMTUgMjEwIDczIDIxNiA5OSAyMyAxNTEgMTMwIDI0MyAxNjYgMzQgNTQgMjQ0IDE0NSAxNDcgMjU4IDExMiAxMSA1NiAxNTkgMjY4IDEyMiAKKzY0IDU4IDE1OSAyMjUgMTkgMTkzIDEwMSAyMTkgMjc0IDEwNSA0OSAyMzkgNTUgMjIzIDEwNCA3MCAxMjYgMTMyIDIwMSAyMzggMTYxIAorMjI1IDEzMCA5MCAyMzAgMjYyIDUzIDI3IDEzNSA5NSAzOSA1OSA1MyA2OSAxNDcgMTkgMjc4IDIxNiAxNCAzNSA3NSA4OCAyNzMgMTI3IAorMTU0IDI2MyAzMiAyNjcgMTg1IDExNyA1OSA5NSAyMzUgNzEgMjU4IDI3IDE3NyAyNjEgMTE3IDE0NCA4MyAzMCAyNjcgMjI4IDY2IDIxMSAKKzUyIDQ4IDIyIDE3MiAxNzEgMzkgMTQ0IDE2OCAxNDUgNjIgMTQzIDM2IDI1MCA4NiAxMjAgMjM0IDUwIDEzMyAxODAgNzAgODQgMjQ3IAorMjc3IDI4MCAxMzEgMTM3IDEwIDE2MiAxNjEgMTQwIDE0MiAxNCAxODggMTEgMTQxIDI3NCA2MyAxNjQgMzQgOTcgMTkzIDE2IDEwNCAKKzE5OCA2MyA3OSAyMDAgMjEgMTUxIDE3MyAxOTIgMzcgMjcyIDE0OCA0MSA1OSAxMCAxMjAgMTQ5IDIxNiA1NyAxMzggMjI3IDQ1IDIxMyAKKzIwNSA2OCAxMjYgMTc1IDE1MCAxMDkgMTE4IDM4IDIwOCAxNTggOTMgMTI0IDIxNyA3OCAyNjMgNzQgMTUyIDEwOSA3NSA4OSA1NiAyMDEgCisxNTMgNDYgMTQ5IDIxNSAxMjAgMTkxIDEwMSAyNjIgOTYgMjU3IDEzMyA1MiAxMzMgMTM3IDI0OCAyMTMgOSAxODMgMjAyIDIxNyAyNzQgCisxNDggMjc5IDExMCAxMzkgMTYzIDU1IDI2NSAyNzAgMjc1IDg0IDggMTYyIDIwNCA4OSAxMyAyNTIgMSA4OSAyMDkgMTM3IDIwNiA0NyAKKzg1IDk4IDE3MiAyNTYgMTU0IDIyMCAyMTAgMTE1IDEwMSAyMyAxMDggMTgxIDkxIDIwOSA5NCAxMDMgMTc2IDEgNCA5NCA2MSAxMCA3NyAKKzQ2IDY0IDEwMCA0NCAxNDkgMjU4IDY5IDYyIDE4NSAyMDIgMTc0IDE3MSAyNzcgMTk1IDE2IDYxIDI0OSAxOTIgMTIyIDEwNiA3MCA4MyAKKzI5IDQ5IDY3IDE0NyA2MiAxMDAgODcgOTggMTI5IDI2IDIgMTM2IDI3MCAzNyAzMyAxNjAgMjQ2IDE3IDQwIDgxIDExNSAxNDQgMTI2IAorMjYwIDEzOCAxODUgMTYwIDggMjQ3IDM4IDE2NSA1NSAyMjIgNDAgMTIzIDY4IDIxMSA5IDIyNiAxNTEgODggNzcgMjQyIDIzMCAyNCAyIAorMjUgMjE5IDE4OSAyNzEgMjU0IDE5NyAyMTIgMzAgMjI0IDI3OSAxOTUgMjU0IDIzOSA5NyAxMDggMjggMjggMTU2IDkzIDE2NyAxNjYgCisyMzAgMjIwIDE2OCAxMDMgMTc3IDY1IDIzMiAyMjAgMTI1IDI1IDI2MiAxMzggMTQyIDU3IDEzNyAxNjMgOTggODcgMTQxIDc4IDE3OCAKKzI0MCA3NiA2NyAyMzIgMTc3IDIyIDEyOSA2OCAxNjggNjAgNzQgNjcgMjc1IDI4MCAxNzQgODYgMTYyIDExOSAyNTUgMjE4IDIxMCAxNTggCis1MCAxNzUgNjUgMjc1IDQyIDI3NyAyMzggMTE5IDU5IDUyIDUgNzMgMjAgMjE0IDk5IDY2IDI1NCAxIDQ2IDEwNiAyNjYgMjQ5IDEwNyA3IAorMzAgMjggMTEzIDI3MSAxNSA4MiAxMzYgMjY5IDEwMCAyNDAgMzQgMTgyIDI3IDkyIDE0NiA0MSAxMDIgMjQwIDI3MiAyMzMgMTU2IDEzNSAKKzUyIDkwIDE4OCA5NiAxMjkgNjkgMTA1IDEzNCA3MyAxMzEgMjY1IDIyOCAxMDkgMTYwIDIwNCAxMzIgMTE2IDEyMyA4NSAxODMgNiA1MSAKKzY5IDE5MCAxMjIgMTQ5IDE3MyAyMzUgMjY3IDE0MyAyMzIgMTM1IDEwIDIwNSAyNjQgMTEgOTkgMTA4IDEzOSAyMDYgNCAxMzYgMjI3IAorODggMzUgNzYgMjUgNjYgMjUzIDIxOCAyNTMgMjYxIDIwMiAxMzIgNSA3MiAyMzcgMTQwIDEwMCAyIDI2NCA1MyAyNjUgMzIgMjI0IDIzNiAKKzI0NiAxMDIgMTU1IDMgMTU3IDExNCAxNjUgMTMgNTYgMTE2IDE2NSAyNTEgMTA3IDI0NSA4MSAxNTcgMjkgNTAgMjE4IDE0IDE0NiAxMjYgCisyMTcgMzUgMzMgMjAzIDY4IDE2OSAxMjQgMjEgMTkzIDU4IDExNiAxMjIgMjEgMjM2IDcgMjY4IDc5IDI0MiAxODcgNzUgMTMxIDIyMiAKKzEyNSAyMzggNzYgMTEwIDU0IDQ4IDI2MCAyMjMgMTkgMjM2IDUwIDkwIDIzMSAxOTkgMTI3IDE1MyA0NSAyNzAgXgorNjIzIDEgMTM1IDEyMSAxMjUgMTA3IDI3IDE1NyAxNzkgMjQxIDE2NiAxMzkgOTkgODggMTg4IDUzIDI0IDE5NiAxNDggMTkwIDI3MiA2MSAKKzExOSA3OSAyMjQgMTAzIDIwMSAxNTEgMjgyIDE5OCA2MyAzMCA5NyAxNDggMTk0IDIyOSAxMTAgMjUwIDEyNiAxMzIgMTU2IDIgNyAxMzcgCiszMiA4IDMxIDExOCAzNyAxMzggMjA5IDk0IDYwIDIyNSAxMjggNDcgMjc5IDExMCA5NCAyMTIgMTgyIDE3NyA0MyA0MyAxNjYgMTIgMTMgCiszOCAzMiAxMiAyNzEgMTY3IDMzIDE4NSAxMTcgMTIgMTQ0IDgxIDI2NiAxNjQgNzYgMjU5IDExNSAxMDEgMjYxIDE1NyAyNyAxIDI2NSAKKzE0MyAxODcgMzIgMTM1IDExNyAxNjggNTggMzEgMjQ1IDEyMyA0MCAyMzAgMTM1IDI0NCAyNTQgMTA4IDUyIDMgMjQgNjkgNjIgMTQwIAorMjUxIDIwIDgzIDUwIDI0NCA5OCAxOTQgMTAyIDI0IDY1IDEwNSA5MSAxMjAgMjU2IDI3IDEzMiAyNSAyNDIgNTYgMjY4IDc5IDE5OSA4NCAKKzIwMiA0MSAxMjggNDMgMzkgMjA5IDI0NiAxNyAyNzQgMjU5IDI0MiAxODcgMjggMTc4IDY4IDM3IDExIDEyMyAxOTIgMTg3IDE4NCA5MiAKKzE4IDE2IDI1MyA4NyAxNjMgMjA3IDE3OSA4NSAyNTIgNDEgMjU1IDEyOSA4OSA4MiA0IDIwMSAyMCAyMzkgMjQ3IDU5IDc3IDE1MyA2NiAKKzI3OCA4NSAyNDggODQgNzEgMjgxIDE3NyAxNzQgODYgMTE3IDE2IDEwMSAxMzAgMTE0IDc2IDEzMiAyOSAxOTkgMTA1IDExNiAyNzQgCisyNTUgMiAzIDE4MCAyNjYgMTYwIDExOSAyMTAgMjY3IDU0IDcwIDEwNCA5MSAxNDUgMTI3IDI2IDEwNyAzMSAxMTQgODAgODkgNzggNDcgCisxNTIgMjQgNDQgMTkxIDE0MSAxNDEgMTQgMjExIDE2MSAxNDAgOTkgNjMgMzQgNTQgMTk3IDQyIDI3NiAxOCAxNjggMjEwIDEzNiAxMSAKKzExOSAyMzUgMTM4IDUzIDE4MCAxMTAgMjQ2IDE2OSAyMzEgMjUgOTAgOTkgMjE5IDIzMSAxNTIgMTc2IDEgMjQwIDI3MiAxODggMjA1IAorMjY0IDI0NSAxNDQgMjM3IDE4MCAyNjIgMjAzIDIxOCA3OSA3MiAxNDYgMTUyIDIwIDg3IDcgMTAgMjI5IDI0MSAxMCA3NyAxIDEwOSAKKzIyOSAyMzcgNTMgMTc2IDE1MyAxOTcgMzggMzYgMTE3IDM3IDE1IDgwIDkzIDM1IDk2IDIxOSAxMDAgMTA5IDIyNSAyODAgNCA0NSAxMDYgCis2IDEyMCAxMDAgMTEzIDE4MiAxODEgOTIgMTQgNTkgMjA0IDIzOSAyNTEgMTYgMTI2IDEgMTEzIDE4NiAxMzggMTg0IDIyMyA2MSAxMTUgCisxMjIgMTc1IDEwNyA2IDI0MyA4MSAxMTQgMjA3IDE3NSAxMjggNjggMTkzIDIwOCA3MyAxNzEgMTQ2IDE0OCA2MyAxODYgMTEgOTggMzggCisxODggNzQgMjIxIDE0NiAyNzUgMTQ5IDg4IDMyIDEzOSA3NCAyMTcgMTg5IDIyNiAxOCA0MSAxMjQgODYgMjczIDc4IDUxIDEwOSA3MyAKKzQwIDEwMyA0OSAxOTQgMjMzIDY3IDE2IDI1NyA0NCA2NCA1NSA5MSAyNzYgMTcwIDEyNSAxMTEgMjY3IDU4IDI3IDUgMjIyIDE5MiAzNSAKKzIyNyA0MyAxNzAgMjUyIDE5NyAxNjkgNzkgNjggNDEgMjUxIDE3MiA0MCAyMzQgOTIgMTQ1IDEwMiAxNTUgMTA4IDIwNCAyNDMgMjA4IAorMjAwIDI1NyA0OCAyMSAxMDQgMjIyIDQwIDc4IDE3OCAxOTUgMTIzIDE5NiAxNDQgMjMzIDIyMyAyMTMgNzIgMjMgMjMgMTkgNjIgMTMgCisxNjUgMTE4IDYyIDkgMjA4IDY5IDIxNCA5NyAxNyAxNTEgMTMwIDI0MSAxNjIgMzQgNTAgMjQwIDE0MSAxNDUgMjU0IDExMiA5IDUyIAorMTU1IDI2NCAxMTggNTggNTIgMTU5IDIyMSAxOSAxODkgOTkgMjE1IDI3NCAxMDMgNDUgMjM3IDQ5IDIxOSAxMDQgNjYgMTI2IDEyOCAKKzE5OSAyMzYgMTU5IDIyNSAxMjQgOTAgMjMwIDI2MiA0NyAyMSAxMjkgOTMgMzkgNTMgNDkgNjcgMTQ3IDE3IDI3OCAyMTYgOCAzNSA3NSAKKzg2IDI2OSAxMjEgMTUwIDI2MSAyNiAyNjcgMTg1IDExMyA1NSA5NSAyMzMgNzEgMjU2IDIzIDE3NSAyNTkgMTExIDE0NCA3NyAyNiAyNjMgCisyMjggNjQgMjA3IDQ4IDQyIDE4IDE3MiAxNjcgMzcgMTQyIDE2NiAxNDMgNTYgMTM3IDM2IDI0OCA4MCAxMTQgMjMyIDQ2IDEyNyAxNzggCis2NCA4MCAyNDUgMjc1IDI4MCAxMzEgMTMxIDggMTYyIDE2MSAxMzYgMTQyIDE0IDE4NiA3IDE0MSAyNzIgNTcgMTYyIDMwIDkzIDE5MSAKKzEwIDk4IDE5OCA1OSA3MyAxOTYgMTcgMTQ3IDE3MyAxOTIgMzEgMjcwIDE0MiAzOSA1NyA2IDExNiAxNDMgMjEyIDUxIDEzNCAyMjcgMzkgCisyMTMgMjAzIDY2IDEyMiAxNzEgMTUwIDEwNSAxMTIgMzQgMjA2IDE1NCA5MSAxMjQgMjEzIDc2IDI2MyA3MiAxNTAgMTA5IDY5IDgzIDU0IAorMjAxIDE0NyA0MiAxNDkgMjAyIF4KKzYwMiAxIDExNiAxODcgODkgMjU0IDg0IDI1MyAxMzMgNDAgMTI5IDEzMyAyNDggMjA5IDkgMTgzIDE5NCAyMTMgMjY2IDE0NCAyNzkgCisxMDIgMTM1IDE2MyA0NyAyNjUgMjcwIDI3MSA4MCA4IDE1NCAyMDQgODUgOSAyNDggMjc0IDg5IDIwMSAxMjkgMTk4IDQzIDg1IDg2IAorMTY4IDI1NiAxNTQgMjE2IDIxMCAxMTUgOTMgMTkgMTA4IDE3NyA4NyAyMDkgODYgMTAzIDE3NiAyNzggMjgxIDgyIDUzIDEwIDY5IDQyIAorNTYgOTYgNDAgMTQxIDI1OCA2OSA1NCAxODEgMjAyIDE3MCAxNzEgMjc3IDE4NyAxMiA0OSAyNDUgMTg4IDExOCAxMDIgNzAgODMgMjkgCis0NSA2NyAxMzkgNTggODggODMgOTQgMTI1IDE4IDIgMTI0IDI2MiAyOSAzMyAxNjAgMjQ2IDkgMjggNjkgMTA3IDEzNiAxMTQgMjYwIAorMTI2IDE3NyAxNTIgNCAyNDcgMzggMTYxIDU1IDIyMiAzMiAxMTkgMjczIDYwIDIxMSAxIDIyNiAxNDcgODAgNzMgMjM0IDIyMiAyMCAKKzI3OSAyNSAyMTUgMTgxIDI2NyAyNTAgMTg5IDIxMiAzMCAyMTYgMjc1IDE5NSAyNTQgMjM5IDkzIDk2IDI4IDE2IDE1MiA4MSAxNjcgCisxNjIgMjI2IDIxMiAxNjAgOTEgMTY5IDY1IDIyNCAyMjAgMTE3IDI4MSAxNyAyNTggMTM0IDEzNCA1NyAxMzcgMTU1IDkwIDc1IDEzNyAKKzc4IDE3MCAyMzYgNzIgNjMgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDQ4IDc0IDU1IDI3NSAyNzIgMTc0IDc4IDE1OCAxMTEgMjUxIDIxOCAKKzIwMiAxNTggNDYgMTcxIDU3IDI2NyAzMCAyNjkgMjMwIDEwNyA1OSA1MiAyNzggNjEgMjAgMjE0IDg3IDU0IDI0NiAyODIgNDYgMTA2IAorMjYyIDI0OSA5NSAyODQgMjYgMjQgMTA5IDI3MSAxNSA3MCAxMzYgMjY5IDEwMCAyMzIgMjIgMTgyIDIzIDgwIDEzOCAyOSA5OCAyNDAgCisyNjQgMjI5IDE1NiAxMzEgNDggODYgMTgwIDk2IDExNyA2MSA5NyAxMzQgNjkgMTE5IDI2MSAyMjAgMTA1IDE1NiAxOTYgMTI4IDEwNCAKKzExNSA4MSAxNzkgMiA0NyA1NyAxOTAgMTEwIDE0NSAxNjUgMjM1IDI2MyAxMzUgMjI4IDEyNyAyODMgMjA1IDI1NiAyODQgOTEgMTA0IAorMTI3IDIwNiAxMzIgMjE5IDc2IDIzIDY4IDEzIDY2IDI1MyAyMTAgMjQ1IDI1MyAxOTggMTIwIDUgNjggMjMzIDEyOCA5MiAyNzUgMjYwIAorNDkgMjU3IDI4IDIyNCAyMzIgMjQyIDEwMiAxNDcgMyAxNTMgMTEwIDE1NyA1IDU2IDEwOCAxNjUgMjQ3IDEwMyAyNDEgNzMgMTU3IDE3IAorMzggMjE0IDEwIDEzNCAxMjIgMjE3IDMxIDI1IDIwMyA1NiAxNjEgMTIwIDE3IDE5MyA1NCAxMTYgMTIyIDkgMjM2IDcgMjY4IDcxIDI0MiAKKzE3OSA2NyAxMjcgMjE4IDEyNSAyMzggNjQgMTA2IDQyIDQ0IDI1NiAyMTkgMTEgMjI4IDUwIDc4IDIyMyAxOTEgMTI3IDE1MyA0NSA3NyAKKzEyOSAxMjEgMTIzIDEwMyAyMSAxNTMgMTc1IDIzNyAxNjYgMTMzIDkzIDg0IDE4OCA1MyAyMiAxOTQgMTQ4IDE4NiAyNjggNTkgMTE3IAorNzMgMjIyIDk3IDE5OSAxNDkgMjgwIDE5NiA2MyAyNCA5NyAxNDYgMTk0IDIyNSAxMDYgMjUwIDEyNCAxMzIgMTU0IDI4MSA1IDEzMyAyOCAKKzQgMjcgMTE4IDM3IDEzMiAyMDcgOTQgNjAgMjIzIDEyNiA0NyAyNzcgMTEwIDkyIDIxMCAxODAgMTczIDM3IDQzIDE2MiA2IDcgMzYgMjYgCisxMiAyNjkgMTY1IDI3IDE4MyAxMTcgOCAxNDIgNzkgMjY0IDE2NCA3NiAyNTUgMTEzIDEwMSAyNjEgMTU1IDI1IDI4MCAyNjEgMTQzIAorMTg1IDMyIDEzMSAxMTMgMTY2IDU2IDMxIDI0NSAxMjMgMzggMjI2IDEzNSAyNDAgMjUyIDEwNCA1MCAxIDE4IDY3IDYyIDEzOCAyNDkgCisxOCA3OSA0NCAyNDQgOTQgMTkwIDk4IDIwIDU5IDEwNSA5MSAxMTYgMjUyIDI3IDEzMCAxOSAyMzggNTIgMjY2IDc5IDE5OSA4NCAyMDAgCiszNSAxMjggMzkgMzUgMjA1IDI0NCAxNyAyNzAgMjU5IDI0MCAxODcgMjQgMTc0IDY2IDMzIDUgMTIxIDE4OCAxODMgMTgyIDg4IDE4IDE0IAorMjQ5IDgzIDE1OSAyMDUgMTc5IDc5IDI1MiAzOSAyNTUgMTI1IDgzIDgyIDE5NyAxNCAyMzcgMjQzIDUzIDc1IDE0OSA2MCAyNzYgODEgCisyNDQgODIgNjUgMjc3IDE3NSAxNzIgODYgMTE1IDE2IDk5IDEyNiAxMTIgNzIgMTI4IDI3IDE5NSA5OSAxMTQgMjcyIDI1MSAyODMgMjgyIAorMTc2IDI2NiAxNTYgMTE5IDIwOCAyNjUgNTAgNjYgOTggODUgMTM5IDEyMyAyNiAxMDEgMjkgMTEwIDgwIDg1IDc0IDQzIDE1MCAyNCA0NCAKKzE5MSAxMzkgMTM1IDggMjA3IDE1OSAxNDAgOTkgNjEgMjQ4IF4KKzYwOSAxIDU0IDE4OSA0MiAyNzYgMTQgMTYwIDIwMiAxMjQgMyAxMDcgMjI3IDEzNCA0NSAxODAgMTA2IDIzOCAxNjUgMjIzIDE3IDg2IAorOTEgMjE5IDIzMSAxNDQgMTcyIDEgMjM2IDI3MiAxODQgMjAxIDI2NCAyMzcgMTMyIDIzNyAxNzYgMjU0IDE5NSAyMTAgNzEgNzIgMTM0IAorMTUyIDEyIDg3IDI4MiAyIDIyNSAyNDEgNiA3NyAyODQgOTcgMjI5IDIyOSA0OSAxNjggMTQ5IDE5MyAzMCAzMiAxMDUgMjUgMTEgNzYgCis5MyAyNyA4NCAyODMgMjE1IDkyIDEwMSAyMTcgMjcyIDQgMzMgOTQgMjgxIDEyMCA4OCAxMTMgMTc0IDE4MSAyNzUgODggNiA1NSAyMDAgCisyMzEgMjUxIDQgMTE4IDI4MCAxMDkgMTg2IDEzOCAxODQgMjIzIDYxIDEwMyAxMTAgMTc1IDEwNyA2IDIzNSA4MSAxMTQgMjA3IDE2NyAKKzExNiA1NiAxODkgMjAwIDczIDE2NyAxMzggMTQwIDU1IDE3OCAxMSA5OCAyNiAxODAgNjIgMjIxIDE0NiAyNjcgMTQxIDg4IDI4IDEzOSAKKzY2IDIwOSAxODkgMjIyIDYgMzMgMTE2IDc4IDI3MyA2NiA1MSAxMDUgNjkgMjggOTUgNDkgMTkwIDIzMyA1OSA4IDI1NyAzNiA2NCA1MSAKKzgzIDI3MiAxNjIgMTE3IDExMSAyNTkgNTggMTkgMSAyMTQgMTg4IDMxIDIyMyAzOSAxNzAgMjQ0IDE5NyAxNjkgNzUgNjAgNDEgMjQzIAorMTY0IDMyIDIzNCA5MiAxNDUgOTggMTU1IDk2IDE5NiAyNDMgMjA4IDIwMCAyNTMgNDggMjEgOTYgMjE4IDQwIDc0IDE3OCAxOTEgMTE1IAorMTk2IDEzNiAyMjUgMjE5IDIwOSA2MCAxOSAyMyAxMSA1NCA5IDE2MSAxMDYgNTggMjg0IDIwNCA2MSAyMTAgOTMgNSAxNTEgMTMwIDIzNyAKKzE1NCAzNCA0MiAyMzIgMTMzIDE0MSAyNDYgMTEyIDUgNDQgMTQ3IDI1NiAxMTAgNDYgNDAgMTU5IDIxMyAxOSAxODEgOTUgMjA3IDI3NCAKKzk5IDM3IDIzMyAzNyAyMTEgMTA0IDU4IDEyNiAxMjAgMTk1IDIzMiAxNTUgMjI1IDExMiA5MCAyMzAgMjYyIDM1IDkgMTE3IDg5IDM5IAorNDEgNDEgNjMgMTQ3IDEzIDI3OCAyMTYgMjgzIDM1IDc1IDgyIDI2MSAxMDkgMTQyIDI1NyAxNCAyNjcgMTg1IDEwNSA0NyA5NSAyMjkgCis3MSAyNTIgMTUgMTcxIDI1NSA5OSAxNDQgNjUgMTggMjU1IDIyOCA2MCAxOTkgNDAgMzAgMTAgMTcyIDE1OSAzMyAxMzggMTYyIDEzOSAKKzQ0IDEyNSAzNiAyNDQgNjggMTAyIDIyOCAzOCAxMTUgMTc0IDUyIDcyIDI0MSAyNzEgMjgwIDEzMSAxMTkgNCAxNjIgMTYxIDEyOCAxNDIgCisxNCAxODIgMjg2IDE0MSAyNjggNDUgMTU4IDIyIDg1IDE4NyAyODUgODYgMTk4IDUxIDYxIDE4OCA5IDEzOSAxNzMgMTkyIDE5IDI2NiAKKzEzMCAzNSA1MyAyODUgMTA4IDEzMSAyMDQgMzkgMTI2IDIyNyAyNyAyMTMgMTk5IDYyIDExNCAxNjMgMTUwIDk3IDEwMCAyNiAyMDIgCisxNDYgODcgMTI0IDIwNSA3MiAyNjMgNjggMTQ2IDEwOSA1NyA3MSA1MCAyMDEgMTM1IDM0IDE0OSAyMTUgMTE0IDE4NSA4MyAyNTAgNzggCisyNTEgMTMzIDM0IDEyNyAxMzEgMjQ4IDIwNyA5IDE4MyAxOTAgMjExIDI2MiAxNDIgMjc5IDk4IDEzMyAxNjMgNDMgMjY1IDI3MCAyNjkgCis3OCA4IDE1MCAyMDQgODMgNyAyNDYgMjcwIDg5IDE5NyAxMjUgMTk0IDQxIDg1IDgwIDE2NiAyNTYgMTU0IDIxNCAyMTAgMTE1IDg5IDE3IAorMTA4IDE3NSA4NSAyMDkgODIgMTAzIDE3NiAyNzYgMjc5IDc2IDQ5IDEwIDY1IDQwIDUyIDk0IDM4IDEzNyAyNTggNjkgNTAgMTc5IDIwMiAKKzE2OCAxNzEgMjc3IDE4MyAxMCA0MyAyNDMgMTg2IDExNiAxMDAgNzAgODMgMjkgNDMgNjcgMTM1IDU2IDgyIDgxIDkyIDEyMyAxNCAyIAorMTE4IDI1OCAyNSAzMyAxNjAgMjQ2IDUgMjIgNjMgMTAzIDEzMiAxMDggMjYwIDEyMCAxNzMgMTQ4IDIgMjQ3IDM4IDE1OSA1NSAyMjIgCisyOCAxMTcgMjY5IDU2IDIxMSAyODQgMjI2IDE0NSA3NiA3MSAyMzAgMjE4IDE4IDI3NyAyNSAyMTMgMTc3IDI2NSAyNDggMTg1IDIxMiAKKzMwIDIxMiAyNzMgMTk1IDI1NCAyMzkgOTEgOTAgMjggMTAgMTUwIDc1IDE2NyAxNjAgMjI0IDIwOCAxNTYgODUgMTY1IDY1IDIyMCAyMjAgCisxMTMgMjgxIDEzIDI1NiAxMzIgMTMwIDU3IDEzNyAxNTEgODYgNjkgMTM1IDc4IDE2NiAyMzQgNzAgNjEgMjMyIDE3NyAyMiAxMjkgNjggCisxNjggNDIgNzQgNDkgMjc1IDI2OCAxNzQgNzQgMTU2IDEwNyAyNDkgMjE4IDE5OCAxNTggNDQgMTY5IDUzIDI2MyAyNCAyNjUgMjI2IAorMTAxIDU5IDUyIDI3NCA1NSAyMCAyMTQgODEgNDggMjQyIDI4MiA0NiAxMDYgMjYwIDE0NSBeCis2MTQgMSA4MyAyODAgMjIgMjAgMTA1IDI3MSAxNSA1OCAxMzYgMjY5IDEwMCAyMjQgMTAgMTgyIDE5IDY4IDEzMCAxNyA5NCAyNDAgMjU2IAorMjI1IDE1NiAxMjcgNDQgODIgMTcyIDk2IDEwNSA1MyA4OSAxMzQgNjUgMTA3IDI1NyAyMTIgMTAxIDE1MiAxODggMTI0IDkyIDEwNyA3NyAKKzE3NSAyODcgNDMgNDUgMTkwIDk4IDE0MSAxNTcgMjM1IDI1OSAxMjcgMjI0IDExOSAyNzUgMjA1IDI0OCAyNzYgODMgMTAwIDExNSAyMDYgCisyODUgMTI4IDIxMSA2NCAxMSA2MCAxIDY2IDI1MyAyMDIgMjM3IDI0NSAxOTQgMTA4IDUgNjQgMjI5IDExNiA4NCAyNjcgMjU2IDQ1IAorMjQ5IDI0IDIyNCAyMjggMjM4IDEwMiAxMzkgMyAxNDkgMTA2IDE0OSAyODYgNTYgMTAwIDE2NSAyNDMgOTkgMjM3IDY1IDE1NyA1IDI2IAorMjEwIDYgMTIyIDExOCAyMTcgMjcgMTcgMjAzIDQ0IDE1MyAxMTYgMTMgMTkzIDUwIDExNiAxMjIgMjg2IDIzNiA3IDI2OCA2MyAyNDIgCisxNzEgNTkgMTIzIDIxNCAxMjUgMjM4IDUyIDEwMiAzMCA0MCAyNTIgMjE1IDMgMjIwIDUwIDY2IDIxNSAxODMgMTI3IDE1MyA0NSA2OSAKKzExNyAxMjEgMTE5IDk1IDkgMTQ1IDE2NyAyMjkgMTY2IDEyMSA4MSA3NiAxODggNTMgMTggMTkwIDE0OCAxNzggMjYwIDU1IDExMyA2MSAKKzIxOCA4NSAxOTUgMTQ1IDI3NiAxOTIgNjMgMTIgOTcgMTQyIDE5NCAyMTcgOTggMjUwIDEyMCAxMzIgMTUwIDI3MyAxIDEyNSAyMCAyODUgCisxOSAxMTggMzcgMTIwIDIwMyA5NCA2MCAyMTkgMTIyIDQ3IDI3MyAxMTAgODggMjA2IDE3NiAxNjUgMjUgNDMgMTU0IDI4MyAyODQgMzIgCisxNCAxMiAyNjUgMTYxIDE1IDE3OSAxMTcgMTM4IDc1IDI2MCAxNjQgNzYgMjQ3IDEwOSAxMDEgMjYxIDE1MSAyMSAyNzIgMjUzIDE0MyAKKzE4MSAzMiAxMjMgMTA1IDE2MiA1MiAzMSAyNDUgMTIzIDM0IDIxOCAxMzUgMjMyIDI0OCA5NiA0NiAyODYgNiA2MyA2MiAxMzQgMjQ1IAorMTQgNzEgMzIgMjQ0IDg2IDE4MiA5MCAxMiA0NyAxMDUgOTEgMTA4IDI0NCAyNyAxMjYgNyAyMzAgNDQgMjYyIDc5IDE5OSA4NCAxOTYgCisyMyAxMjggMzEgMjcgMTk3IDI0MCAxNyAyNjIgMjU5IDIzNiAxODcgMTYgMTY2IDYyIDI1IDI4MiAxMTcgMTgwIDE3NSAxNzggODAgMTggCisxMCAyNDEgNzUgMTUxIDIwMSAxNzkgNjcgMjUyIDM1IDI1NSAxMTcgNzEgODIgMjgxIDE4OSAyIDIzMyAyMzUgNDEgNzEgMTQxIDQ4IAorMjcyIDczIDIzNiA3OCA1MyAyNjkgMTcxIDE2OCA4NiAxMTEgMTYgOTUgMTE4IDEwOCA2NCAxMjAgMjMgMTg3IDg3IDExMCAyNjggMjQzIAorMjc5IDI3NCAxNjggMjY2IDE0OCAxMTkgMjA0IDI2MSA0MiA1OCA4NiA3MyAxMjcgMTE1IDI2IDg5IDI1IDEwMiA4MCA3NyA2NiAzNSAKKzE0NiAyNCA0NCAxOTEgMTM1IDEyMyAyODUgMTk5IDE1NSAxNDAgOTkgNTcgMjggNTQgMTg1IDQyIDI3NiAxMiAxNTYgMTk4IDExOCAyODggCisxMDEgMjIzIDEzMiA0MSAxODAgMTA0IDIzNCAxNjMgMjE5IDEzIDg0IDg3IDIxOSAyMzEgMTQwIDE3MCAxIDIzNCAyNzIgMTgyIDE5OSAKKzI2NCAyMzMgMTI2IDIzNyAxNzQgMjUwIDE5MSAyMDYgNjcgNzIgMTI4IDE1MiA4IDg3IDI3OCAyODcgMjIzIDI0MSA0IDc3IDI4NCA5MSAKKzIyOSAyMjUgNDcgMTY0IDE0NyAxOTEgMjYgMzAgOTkgMTkgOSA3NCA5MyAyMyA3OCAyODMgMjEzIDg4IDk3IDIxMyAyNjggNCAyNyA4OCAKKzI3NyAxMjAgODIgMTEzIDE3MCAxODEgMjcxIDg2IDIgNTMgMTk4IDIyNyAyNTEgMjg3IDExNCAyNzggMTA3IDE4NiAxMzggMTg0IDIyMyAKKzYxIDk3IDEwNCAxNzUgMTA3IDYgMjMxIDgxIDExNCAyMDcgMTYzIDExMCA1MCAxODcgMTk2IDczIDE2NSAxMzQgMTM2IDUxIDE3NCAxMSAKKzk4IDIwIDE3NiA1NiAyMjEgMTQ2IDI2MyAxMzcgODggMjYgMTM5IDYyIDIwNSAxODkgMjIwIDI5IDExMiA3NCAyNzMgNjAgNTEgMTAzIAorNjcgMjIgOTEgNDkgMTg4IDIzMyA1NSA0IDI1NyAzMiA2NCA0OSA3OSAyNzAgMTU4IDExMyAxMTEgMjU1IDU4IDE1IDI4OCAyMTAgMTg2IAorMjkgMjIxIDM3IDE3MCAyNDAgMTk3IDE2OSA3MyA1NiA0MSAyMzkgMTYwIDI4IDIzNCA5MiAxNDUgOTYgMTU1IDkwIDE5MiAyNDMgMjA4IAorMjAwIDI1MSA0OCAyMSA5MiAyMTYgNDAgNzIgMTc4IDE4OSAxMTEgMTk2IDEzMiAyMjEgMjE3IDIwNyA1NCAxNyAyMyA3IDUwIDcgMTU5IAorMTAwIDU2IDI4MCAyMDIgNTcgMjA4IDkxIDI4OCAxNTEgMTMwIDIzNSAxNTAgMzQgMzggMjI4IDEyOSAxMzkgMjQyIDExMiAyMjYgXgorNjE5IDAgMzggMTQxIDI1MCAxMDQgMzcgMzEgMTU5IDIwNyAxOSAxNzUgOTIgMjAxIDI3NCA5NiAzMSAyMzAgMjggMjA1IDEwNCA1MiAKKzEyNiAxMTQgMTkyIDIyOSAxNTIgMjI1IDEwMyA5MCAyMzAgMjYyIDI2IDEwOCA4NiAzOSAzMiAzNSA2MCAxNDcgMTAgMjc4IDIxNiAyNzcgCiszNSA3NSA3OSAyNTUgMTAwIDEzNiAyNTQgNSAyNjcgMTg1IDk5IDQxIDk1IDIyNiA3MSAyNDkgOSAxNjggMjUyIDkwIDE0NCA1NiAxMiAKKzI0OSAyMjggNTcgMTkzIDM0IDIxIDQgMTcyIDE1MyAzMCAxMzUgMTU5IDEzNiAzNSAxMTYgMzYgMjQxIDU5IDkzIDIyNSAzMiAxMDYgCisxNzEgNDMgNjYgMjM4IDI2OCAyODAgMTMxIDExMCAxIDE2MiAxNjEgMTIyIDE0MiAxNCAxNzkgMjgzIDE0MSAyNjUgMzYgMTU1IDE2IDc5IAorMTg0IDI3OSA3NyAxOTggNDUgNTIgMTgyIDMgMTMzIDE3MyAxOTIgMTAgMjYzIDEyMSAzMiA1MCAyODIgMTAyIDEyMiAxOTggMzAgMTIwIAorMjI3IDE4IDIxMyAxOTYgNTkgMTA4IDE1NyAxNTAgOTEgOTEgMjAgMTk5IDE0MCA4NCAxMjQgMTk5IDY5IDI2MyA2NSAxNDMgMTA5IDQ4IAorNjIgNDcgMjAxIDEyNiAyOCAxNDkgMjE1IDExMSAxODIgNzQgMjQ0IDY5IDI0OCAxMzMgMjUgMTI0IDEyOCAyNDggMjA0IDkgMTgzIDE4NCAKKzIwOCAyNTYgMTM5IDI3OSA5MiAxMzAgMTYzIDM3IDI2NSAyNzAgMjY2IDc1IDggMTQ0IDIwNCA4MCA0IDI0MyAyNjQgODkgMTkxIDExOSAKKzE4OCAzOCA4NSA3MSAxNjMgMjU2IDE1NCAyMTEgMjEwIDExNSA4MyAxNCAxMDggMTcyIDgyIDIwOSA3NiAxMDMgMTc2IDI3MyAyNzYgNjcgCis0MyAxMCA1OSAzNyA0NiA5MSAzNSAxMzEgMjU4IDY5IDQ0IDE3NiAyMDIgMTY1IDE3MSAyNzcgMTc3IDcgMzQgMjQwIDE4MyAxMTMgOTcgCis3MCA4MyAyOSA0MCA2NyAxMjkgNTMgNzMgNzggODkgMTIwIDggMiAxMDkgMjUyIDE5IDMzIDE2MCAyNDYgMjg5IDEzIDU0IDk3IDEyNiAKKzk5IDI2MCAxMTEgMTY3IDE0MiAyODkgMjQ3IDM4IDE1NiA1NSAyMjIgMjIgMTE0IDI2MyA1MCAyMTEgMjgxIDIyNiAxNDIgNzAgNjggCisyMjQgMjEyIDE1IDI3NCAyNSAyMTAgMTcxIDI2MiAyNDUgMTc5IDIxMiAzMCAyMDYgMjcwIDE5NSAyNTQgMjM5IDg4IDgxIDI4IDEgMTQ3IAorNjYgMTY3IDE1NyAyMjEgMjAyIDE1MCA3NiAxNTkgNjUgMjE0IDIyMCAxMDcgMjgxIDcgMjUzIDEyOSAxMjQgNTcgMTM3IDE0NSA4MCA2MCAKKzEzMiA3OCAxNjAgMjMxIDY3IDU4IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAzMyA3NCA0MCAyNzUgMjYyIDE3NCA2OCAxNTMgMTAxIDI0NiAKKzIxOCAxOTIgMTU4IDQxIDE2NiA0NyAyNTcgMTUgMjU5IDIyMCA5MiA1OSA1MiAyNjggNDYgMjAgMjE0IDcyIDM5IDIzNiAyODIgNDYgCisxMDYgMjU3IDI0OSA4MCAyNzkgMjEgMTkgMTA0IDI3MSAxNSA1NSAxMzYgMjY5IDEwMCAyMjIgNyAxODIgMTggNjUgMTI4IDE0IDkzIAorMjQwIDI1NCAyMjQgMTU2IDEyNiA0MyA4MSAxNzAgOTYgMTAyIDUxIDg3IDEzNCA2NCAxMDQgMjU2IDIxMCAxMDAgMTUxIDE4NiAxMjMgCis4OSAxMDUgNzYgMTc0IDI4NyA0MiA0MiAxOTAgOTUgMTQwIDE1NSAyMzUgMjU4IDEyNSAyMjMgMTE3IDI3MyAyMDUgMjQ2IDI3NCA4MSAKKzk5IDExMiAyMDYgMjg1IDEyNyAyMDkgNjEgOCA1OCAyODggNjYgMjUzIDIwMCAyMzUgMjQzIDE5MyAxMDUgNSA2MyAyMjggMTEzIDgyIAorMjY1IDI1NSA0NCAyNDcgMjMgMjI0IDIyNyAyMzcgMTAyIDEzNyAzIDE0OCAxMDUgMTQ3IDI4NSA1NiA5OCAxNjUgMjQyIDk4IDIzNiA2MyAKKzE1NyAyIDIzIDIwOSA1IDExOSAxMTcgMjE3IDI2IDE1IDIwMyA0MSAxNTEgMTE1IDEyIDE5MyA0OSAxMTYgMTIyIDI4NCAyMzYgNyAyNjggCis2MSAyNDIgMTY5IDU3IDEyMiAyMTMgMTI1IDIzOCA0OSAxMDEgMjcgMzkgMjUxIDIxNCAxIDIxOCA1MCA2MyAyMTMgMTgxIDEyNyAxNTMgCis0NSA2NyAxMTQgMTIxIDExOCA5MyA2IDE0MyAxNjUgMjI3IDE2NiAxMTggNzggNzQgMTg4IDUzIDE3IDE4OSAxNDggMTc2IDI1OCA1NCAKKzExMiA1OCAyMTcgODIgMTk0IDE0NCAyNzUgMTkxIDYzIDkgOTcgMTQxIDE5NCAyMTUgOTYgMjUwIDExOSAxMzIgMTQ5IDI3MSAxMjMgMTggCisyODQgMTcgMTE4IDM3IDExNyAyMDIgOTQgNjAgMjE4IDEyMSA0NyAyNzIgMTEwIDg3IDIwNSAxNzUgMTYzIDIyIDQzIDE1MiAyODEgMjgyIAorMzEgMTEgMTIgMjY0IDE2MCAxMiAxNzggMTE3IDI4OCAxMzcgNzQgMjU5IDE2NCA3NiAyNDUgMTA4IDEwMSAyNjEgMTUwIDIwIDI3MCAKKzI1MSAxNDMgMTgwIDI2NCBeCis2MzkgMCAxMTcgOTkgMTU5IDQ5IDMxIDI0NSAxMjMgMzEgMjEyIDEzNSAyMjYgMjQ1IDkwIDQzIDI4NiAyODkgNjAgNjIgMTMxIDI0MiAKKzExIDY1IDIzIDI0NCA4MCAxNzYgODQgNiAzOCAxMDUgOTEgMTAyIDIzOCAyNyAxMjMgMjkwIDIyNCAzOCAyNTkgNzkgMTk5IDg0IDE5MyAKKzE0IDEyOCAyNSAyMSAxOTEgMjM3IDE3IDI1NiAyNTkgMjMzIDE4NyAxMCAxNjAgNTkgMTkgMjc2IDExNCAxNzQgMTY5IDE3NSA3NCAxOCAKKzcgMjM1IDY5IDE0NSAxOTggMTc5IDU4IDI1MiAzMiAyNTUgMTExIDYyIDgyIDI3OCAxODMgMjg1IDIzMCAyMjkgMzIgNjggMTM1IDM5IAorMjY5IDY3IDIzMCA3NSA0NCAyNjMgMTY4IDE2NSA4NiAxMDggMTYgOTIgMTEyIDEwNSA1OCAxMTQgMjAgMTgxIDc4IDEwNyAyNjUgMjM3IAorMjc2IDI2OCAxNjIgMjY2IDE0MiAxMTkgMjAxIDI1OCAzNiA1MiA3NyA2NCAxMTggMTA5IDI2IDgwIDIyIDk2IDgwIDcxIDYwIDI5IDE0MyAKKzI0IDQ0IDE5MSAxMzIgMTE0IDI3OSAxOTMgMTUyIDE0MCA5OSA1NCAyNSA1NCAxNzkgNDIgMjc2IDkgMTUwIDE5MiAxMDkgMjg1IDkyIAorMjE3IDEyOSAzNSAxODAgMTAxIDIyOCAxNjAgMjEzIDcgODEgODEgMjE5IDIzMSAxMzQgMTY3IDEgMjMxIDI3MiAxNzkgMTk2IDI2NCAKKzIyNyAxMTcgMjM3IDE3MSAyNDQgMTg1IDIwMCA2MSA3MiAxMTkgMTUyIDIgODcgMjcyIDI4NCAyMjAgMjQxIDEgNzcgMjg0IDgyIDIyOSAKKzIxOSA0NCAxNTggMTQ0IDE4OCAyMCAyNyA5MCAxMCA2IDcxIDkzIDE3IDY5IDI4MyAyMTAgODIgOTEgMjA3IDI2MiA0IDE4IDc5IDI3MSAKKzEyMCA3MyAxMTMgMTY0IDE4MSAyNjUgODMgMjg4IDUwIDE5NSAyMjEgMjUxIDI4MSAxMDggMjc1IDEwNCAxODYgMTM4IDE4NCAyMjMgNjEgCis4OCA5NSAxNzUgMTA3IDYgMjI1IDgxIDExNCAyMDcgMTU3IDEwMSA0MSAxODQgMTkwIDczIDE2MiAxMjggMTMwIDQ1IDE2OCAxMSA5OCAKKzExIDE3MCA0NyAyMjEgMTQ2IDI1NyAxMzEgODggMjMgMTM5IDU2IDE5OSAxODkgMjE3IDI4MyAyMyAxMDYgNjggMjczIDUxIDUxIDEwMCAKKzY0IDEzIDg1IDQ5IDE4NSAyMzMgNDkgMjkwIDI1NyAyNiA2NCA0NiA3MyAyNjcgMTUyIDEwNyAxMTEgMjQ5IDU4IDkgMjg4IDIwNCAxODMgCisyNiAyMTggMzQgMTcwIDIzNCAxOTcgMTY5IDcwIDUwIDQxIDIzMyAxNTQgMjIgMjM0IDkyIDE0NSA5MyAxNTUgODEgMTg2IDI0MyAyMDggCisyMDAgMjQ4IDQ4IDIxIDg2IDIxMyA0MCA2OSAxNzggMTg2IDEwNSAxOTYgMTI2IDIxNSAyMTQgMjA0IDQ1IDE0IDIzIDEgNDQgNCAxNTYgCis5MSA1MyAyNzQgMTk5IDUxIDIwNSA4OCAyODIgMTUxIDEzMCAyMzIgMTQ0IDM0IDMyIDIyMiAxMjMgMTM2IDIzNiAxMTIgMzQgMTM3IAorMjQ2IDEwMCAzMSAyNSAxNTkgMjAzIDE5IDE3MSA5MCAxOTcgMjc0IDk0IDI3IDIyOCAyMiAyMDEgMTA0IDQ4IDEyNiAxMTAgMTkwIDIyNyAKKzE1MCAyMjUgOTcgOTAgMjMwIDI2MiAyMCAyODYgMTAyIDg0IDM5IDI2IDMxIDU4IDE0NyA4IDI3OCAyMTYgMjczIDM1IDc1IDc3IDI1MSAKKzk0IDEzMiAyNTIgMjkxIDI2NyAxODUgOTUgMzcgOTUgMjI0IDcxIDI0NyA1IDE2NiAyNTAgODQgMTQ0IDUwIDggMjQ1IDIyOCA1NSAxODkgCiszMCAxNSAxNzIgMTQ5IDI4IDEzMyAxNTcgMTM0IDI5IDExMCAzNiAyMzkgNTMgODcgMjIzIDI4IDEwMCAxNjkgMzcgNjIgMjM2IDI2NiAKKzI4MCAxMzEgMTA0IDI5MSAxNjIgMTYxIDExOCAxNDIgMTQgMTc3IDI4MSAxNDEgMjYzIDMwIDE1MyAxMiA3NSAxODIgMjc1IDcxIDE5OCAKKzQxIDQ2IDE3OCAyOTEgMTI5IDE3MyAxOTIgNCAyNjEgMTE1IDMwIDQ4IDI4MCA5OCAxMTYgMTk0IDI0IDExNiAyMjcgMTIgMjEzIDE5NCAKKzU3IDEwNCAxNTMgMTUwIDg3IDg1IDE2IDE5NyAxMzYgODIgMTI0IDE5NSA2NyAyNjMgNjMgMTQxIDEwOSA0MiA1NiA0NSAyMDEgMTIwIAorMjQgMTQ5IDIxNSAxMDkgMTgwIDY4IDI0MCA2MyAyNDYgMTMzIDE5IDEyMiAxMjYgMjQ4IDIwMiA5IDE4MyAxODAgMjA2IDI1MiAxMzcgCisyNzkgODggMTI4IDE2MyAzMyAyNjUgMjcwIDI2NCA3MyA4IDE0MCAyMDQgNzggMiAyNDEgMjYwIDg5IDE4NyAxMTUgMTg0IDM2IDg1IDY1IAorMTYxIDI1NiAxNTQgMjA5IDIxMCAxMTUgNzkgMTIgMTA4IDE3MCA4MCAyMDkgNzIgMTAzIDE3NiAyNzEgMjc0IDYxIDM5IDEwIDU1IDM1IAorNDIgODkgMzMgMTI3IDI1OCA2OSA0MCAxNzQgMjAyIDE2MyAxNzEgMjc3IDE3MyA1IDI4IDIzOCAxODEgMTExIDk1IDcwIDgzIDI5IDM4IAorNjcgMTI1IDUxIDY3IDc2IDg3IDExOCA0IDIgMTAzIDI0OCAxNSAzMyAxNjAgMjQ2IDI4NyA3IDQ4IDkzIDI4MyBeCis2MTEgMCA4NyAyNjAgOTkgMTU5IDEzNCAyODkgMjQ3IDM4IDE1MiA1NSAyMjIgMTQgMTEwIDI1NSA0MiAyMTEgMjc3IDIyNiAxMzggNjIgCis2NCAyMTYgMjA0IDExIDI3MCAyNSAyMDYgMTYzIDI1OCAyNDEgMTcxIDIxMiAzMCAxOTggMjY2IDE5NSAyNTQgMjM5IDg0IDY5IDI4IAorMjgzIDE0MyA1NCAxNjcgMTUzIDIxNyAxOTQgMTQyIDY0IDE1MSA2NSAyMDYgMjIwIDk5IDI4MSAyOTMgMjQ5IDEyNSAxMTYgNTcgMTM3IAorMTM3IDcyIDQ4IDEyOCA3OCAxNTIgMjI3IDYzIDU0IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAyMSA3NCAyOCAyNzUgMjU0IDE3NCA2MCAKKzE0OSA5MyAyNDIgMjE4IDE4NCAxNTggMzcgMTYyIDM5IDI0OSAzIDI1MSAyMTIgODAgNTkgNTIgMjYwIDM0IDIwIDIxNCA2MCAyNyAyMjggCisyODIgNDYgMTA2IDI1MyAyNDkgNjggMjc1IDE3IDE1IDEwMCAyNzEgMTUgNDMgMTM2IDI2OSAxMDAgMjE0IDI4OSAxODIgMTQgNTMgMTIwIAorMiA4OSAyNDAgMjQ2IDIyMCAxNTYgMTIyIDM5IDc3IDE2MiA5NiA5MCA0MyA3OSAxMzQgNjAgOTIgMjUyIDIwMiA5NiAxNDcgMTc4IDExOSAKKzc3IDk3IDcyIDE3MCAyODcgMzggMzAgMTkwIDgzIDEzNiAxNDcgMjM1IDI1NCAxMTcgMjE5IDEwOSAyNjUgMjA1IDIzOCAyNjYgNzMgOTUgCisxMDAgMjA2IDI4NSAxMjMgMjAxIDQ5IDI5MCA1MCAyODAgNjYgMjUzIDE5MiAyMjcgMjM1IDE4OSA5MyA1IDU5IDIyNCAxMDEgNzQgMjU3IAorMjUxIDQwIDIzOSAxOSAyMjQgMjIzIDIzMyAxMDIgMTI5IDMgMTQ0IDEwMSAxMzkgMjgxIDU2IDkwIDE2NSAyMzggOTQgMjMyIDU1IDE1NyAKKzI4NCAxMSAyMDUgMSAxMDcgMTEzIDIxNyAyMiA3IDIwMyAyOSAxNDMgMTExIDggMTkzIDQ1IDExNiAxMjIgMjc2IDIzNiA3IDI2OCA1MyAKKzI0MiAxNjEgNDkgMTE4IDIwOSAxMjUgMjM4IDM3IDk3IDE1IDM1IDI0NyAyMTAgMjg3IDIxMCA1MCA1MSAyMDUgMTczIDEyNyAxNTMgNDUgCis1OSAxMDIgMTIxIDExNCA4NSAyODggMTM1IDE1NyAyMTkgMTY2IDEwNiA2NiA2NiAxODggNTMgMTMgMTg1IDE0OCAxNjggMjUwIDUwIAorMTA4IDQ2IDIxMyA3MCAxOTAgMTQwIDI3MSAxODcgNjMgMjkxIDk3IDEzNyAxOTQgMjA3IDg4IDI1MCAxMTUgMTMyIDE0NSAyNjMgMjkwIAorMTE1IDEwIDI4MCA5IDExOCAzNyAxMDUgMTk4IDk0IDYwIDIxNCAxMTcgNDcgMjY4IDExMCA4MyAyMDEgMTcxIDE1NSAxMCA0MyAxNDQgCisyNzMgMjc0IDI3IDI5MyAxMiAyNjAgMTU2IDE3NCAxMTcgMjg0IDEzMyA3MCAyNTUgMTY0IDc2IDIzNyAxMDQgMTAxIDI2MSAxNDYgMTYgCisyNjIgMjQzIDE0MyAxNzYgMzIgMTEzIDk1IDE1NyA0NyAzMSAyNDUgMTIzIDI5IDIwOCAxMzUgMjIyIDI0MyA4NiA0MSAyODYgMjg1IDU4IAorNjIgMTI5IDI0MCA5IDYxIDE3IDI0NCA3NiAxNzIgODAgMiAzMiAxMDUgOTEgOTggMjM0IDI3IDEyMSAyODYgMjIwIDM0IDI1NyA3OSAKKzE5OSA4NCAxOTEgOCAxMjggMjEgMTcgMTg3IDIzNSAxNyAyNTIgMjU5IDIzMSAxODcgNiAxNTYgNTcgMTUgMjcyIDExMiAxNzAgMTY1IAorMTczIDcwIDE4IDUgMjMxIDY1IDE0MSAxOTYgMTc5IDUyIDI1MiAzMCAyNTUgMTA3IDU2IDgyIDI3NiAxNzkgMjgxIDIyOCAyMjUgMjYgCis2NiAxMzEgMzMgMjY3IDYzIDIyNiA3MyAzOCAyNTkgMTY2IDE2MyA4NiAxMDYgMTYgOTAgMTA4IDEwMyA1NCAxMTAgMTggMTc3IDcyIAorMTA1IDI2MyAyMzMgMjc0IDI2NCAxNTggMjY2IDEzOCAxMTkgMTk5IDI1NiAzMiA0OCA3MSA1OCAxMTIgMTA1IDI2IDc0IDIwIDkyIDgwIAorNjcgNTYgMjUgMTQxIDI0IDQ0IDE5MSAxMzAgMTA4IDI3NSAxODkgMTUwIDE0MCA5OSA1MiAyMyA1NCAxNzUgNDIgMjc2IDcgMTQ2IDE4OCAKKzEwMyAyODMgODYgMjEzIDEyNyAzMSAxODAgOTkgMjI0IDE1OCAyMDkgMyA3OSA3NyAyMTkgMjMxIDEzMCAxNjUgMSAyMjkgMjcyIDE3NyAKKzE5NCAyNjQgMjIzIDExMSAyMzcgMTY5IDI0MCAxODEgMTk2IDU3IDcyIDExMyAxNTIgMjkyIDg3IDI2OCAyODIgMjE4IDI0MSAyOTMgNzcgCisyODQgNzYgMjI5IDIxNSA0MiAxNTQgMTQyIDE4NiAxNiAyNSA4NCA0IDQgNjkgOTMgMTMgNjMgMjgzIDIwOCA3OCA4NyAyMDMgMjU4IDQgCisxMiA3MyAyNjcgMTIwIDY3IDExMyAxNjAgMTgxIDI2MSA4MSAyODYgNDggMTkzIDIxNyAyNTEgMjc3IDEwNCAyNzMgMTAyIDE4NiAxMzggCisxODQgMjIzIDYxIDgyIDg5IDE3NSAxMDcgNiAyMjEgODEgMTE0IDIwNyAxNTMgOTUgMzUgMTgyIDE4NiA3MyAyNzUgXgorNjM0IDAgMTIwIDEyMiAzNyAxNjAgMTEgOTggMjk1IDE2MiAzNSAyMjEgMTQ2IDI0OSAxMjMgODggMTkgMTM5IDQ4IDE5MSAxODkgMjEzIAorMjc1IDE1IDk4IDYwIDI3MyAzOSA1MSA5NiA2MCAxIDc3IDQ5IDE4MSAyMzMgNDEgMjg2IDI1NyAxOCA2NCA0MiA2NSAyNjMgMTQ0IDk5IAorMTExIDI0MSA1OCAxIDI4OCAxOTYgMTc5IDIyIDIxNCAzMCAxNzAgMjI2IDE5NyAxNjkgNjYgNDIgNDEgMjI1IDE0NiAxNCAyMzQgOTIgCisxNDUgODkgMTU1IDY5IDE3OCAyNDMgMjA4IDIwMCAyNDQgNDggMjEgNzggMjA5IDQwIDY1IDE3OCAxODIgOTcgMTk2IDExOCAyMDcgMjEwIAorMjAwIDMzIDEwIDIzIDI4OSAzNiAxNTIgNzkgNDkgMjY2IDE5NSA0MyAyMDEgODQgMjc0IDE1MSAxMzAgMjI4IDEzNiAzNCAyNCAyMTQgCisxMTUgMTMyIDIyOCAxMTIgMjkyIDI2IDEyOSAyMzggOTIgMTkgMTMgMTU5IDE5NSAxOSAxNjMgODYgMTg5IDI3NCA5MCAxOSAyMjQgMTAgCisxOTMgMTA0IDQwIDEyNiAxMDIgMTg2IDIyMyAxNDYgMjI1IDg1IDkwIDIzMCAyNjIgOCAyNzggOTAgODAgMzkgMTQgMjMgNTQgMTQ3IDQgCisyNzggMjE2IDI2NSAzNSA3NSA3MyAyNDMgODIgMTI0IDI0OCAyODMgMjY3IDE4NSA4NyAyOSA5NSAyMjAgNzEgMjQzIDI5MyAxNjIgMjQ2IAorNzIgMTQ0IDM4IDIzNyAyMjggNTEgMTgxIDIyIDMgMjg4IDE3MiAxNDEgMjQgMTI5IDE1MyAxMzAgMTcgOTggMzYgMjM1IDQxIDc1IDIxOSAKKzIwIDg4IDE2NSAyNSA1NCAyMzIgMjYyIDI4MCAxMzEgOTIgMjkxIDE2MiAxNjEgMTEwIDE0MiAxNCAxNzMgMjc3IDE0MSAyNTkgMTggCisxNDkgNCA2NyAxNzggMjY3IDU5IDE5OCAzMyAzNCAxNzAgMjg3IDEyMSAxNzMgMTkyIDI4OCAyNTcgMTAzIDI2IDQ0IDI3NiA5MCAxMDQgCisxODYgMTIgMTA4IDIyNyAyMTMgMTkwIDUzIDk2IDE0NSAxNTAgNzkgNzMgOCAxOTMgMTI4IDc4IDEyNCAxODcgNjMgMjYzIDU5IDEzNyAKKzEwOSAzMCA0NCA0MSAyMDEgMTA4IDE2IDE0OSAyMTUgMTA1IDE3NiA1NiAyMzIgNTEgMjQyIDEzMyA3IDExOCAxMjIgMjQ4IDE5OCA5IAorMTgzIDE3MiAyMDIgMjQ0IDEzMyAyNzkgODAgMTI0IDE2MyAyNSAyNjUgMjcwIDI2MCA2OSA4IDEzMiAyMDQgNzQgMjk0IDIzNyAyNTIgCis4OSAxNzkgMTA3IDE3NiAzMiA4NSA1MyAxNTcgMjU2IDE1NCAyMDUgMjEwIDExNSA3MSA4IDEwOCAxNjYgNzYgMjA5IDY0IDEwMyAxNzYgCisyNjcgMjcwIDQ5IDMxIDEwIDQ3IDMxIDM0IDg1IDI5IDExOSAyNTggNjkgMzIgMTcwIDIwMiAxNTkgMTcxIDI3NyAxNjUgMSAxNiAyMzQgCisxNzcgMTA3IDkxIDcwIDgzIDI5IDM0IDY3IDExNyA0NyA1NSA3MiA4MyAxMTQgMjkyIDIgOTEgMjQwIDcgMzMgMTYwIDI0NiAyODMgMjkxIAorMzYgODUgMTE0IDgxIDI2MCA5MyAxNTUgMTMwIDI4OSAyNDcgMzggMTUwIDU1IDIyMiAxMCAxMDggMjUxIDM4IDIxMSAyNzUgMjI2IDEzNiAKKzU4IDYyIDIxMiAyMDAgOSAyNjggMjUgMjA0IDE1OSAyNTYgMjM5IDE2NyAyMTIgMzAgMTk0IDI2NCAxOTUgMjU0IDIzOSA4MiA2MyAyOCAKKzI3OSAxNDEgNDggMTY3IDE1MSAyMTUgMTkwIDEzOCA1OCAxNDcgNjUgMjAyIDIyMCA5NSAyODEgMjkxIDI0NyAxMjMgMTEyIDU3IDEzNyAKKzEzMyA2OCA0MiAxMjYgNzggMTQ4IDIyNSA2MSA1MiAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMTUgNzQgMjIgMjc1IDI1MCAxNzQgNTYgCisxNDcgODkgMjQwIDIxOCAxODAgMTU4IDM1IDE2MCAzNSAyNDUgMjkzIDI0NyAyMDggNzQgNTkgNTIgMjU2IDI4IDIwIDIxNCA1NCAyMSAKKzIyNCAyODIgNDYgMTA2IDI1MSAyNDkgNjIgMjczIDE1IDEzIDk4IDI3MSAxNSAzNyAxMzYgMjY5IDEwMCAyMTAgMjg1IDE4MiAxMiA0NyAKKzExNiAyOTIgODcgMjQwIDI0MiAyMTggMTU2IDEyMCAzNyA3NSAxNTggOTYgODQgMzkgNzUgMTM0IDU4IDg2IDI1MCAxOTggOTQgMTQ1IAorMTc0IDExNyA3MSA5MyA3MCAxNjggMjg3IDM2IDI0IDE5MCA3NyAxMzQgMTQzIDIzNSAyNTIgMTEzIDIxNyAxMDUgMjYxIDIwNSAyMzQgCisyNjIgNjkgOTMgOTQgMjA2IDI4NSAxMjEgMTk3IDQzIDI4NiA0NiAyNzYgNjYgMjUzIDE4OCAyMjMgMjMxIDE4NyA4NyA1IDU3IDIyMiAKKzk1IDcwIDI1MyAyNDkgMzggMjM1IDE3IDIyNCAyMjEgMjMxIDEwMiAxMjUgMyAxNDIgOTkgMTM1IDI3OSA1NiA4NiAxNjUgMjM2IDkyIAorMjMwIDUxIDE1NyAyODAgNSAyMDMgMjk1IDEwMSAxMTEgMjE3IDIwIDMgMjAzIDIzIDEzOSAxMDkgNiAxOTMgNDMgMTE2IDEyMiAyNzIgCisyMzYgNyAyNjggNDkgMjQyIDE1NyA0NSAxMTYgMjA3IDEyNSAyMzggMzEgOTUgOSAzMyAyNDUgMjIwIF4KKzYzOCAwIDI4NCAyMDQgNTAgNDIgMTk5IDE2NyAxMjcgMTUzIDQ1IDUzIDkzIDEyMSAxMTEgNzkgMjgyIDEyOSAxNTEgMjEzIDE2NiA5NyAKKzU3IDYwIDE4OCA1MyAxMCAxODIgMTQ4IDE2MiAyNDQgNDcgMTA1IDM3IDIxMCA2MSAxODcgMTM3IDI2OCAxODQgNjMgMjg1IDk3IDEzNCAKKzE5NCAyMDEgODIgMjUwIDExMiAxMzIgMTQyIDI1NyAyOTAgMTA5IDQgMjc3IDMgMTE4IDM3IDk2IDE5NSA5NCA2MCAyMTEgMTE0IDQ3IAorMjY1IDExMCA4MCAxOTggMTY4IDE0OSAxIDQzIDEzOCAyNjcgMjY4IDI0IDI4NyAxMiAyNTcgMTUzIDI4OCAxNzEgMTE3IDI4MSAxMzAgCis2NyAyNTIgMTY0IDc2IDIzMSAxMDEgMTAxIDI2MSAxNDMgMTMgMjU2IDIzNyAxNDMgMTczIDMyIDEwNyA4OSAxNTQgNDQgMzEgMjQ1IAorMTIzIDI2IDIwMiAxMzUgMjE2IDI0MCA4MCAzOCAyODYgMjc5IDU1IDYyIDEyNiAyMzcgNiA1NSA4IDI0NCA3MCAxNjYgNzQgMjkzIDIzIAorMTA1IDkxIDkyIDIyOCAyNyAxMTggMjgwIDIxNCAyOCAyNTQgNzkgMTk5IDg0IDE4OCAyOTYgMTI4IDE1IDExIDE4MSAyMzIgMTcgMjQ2IAorMjU5IDIyOCAxODcgMTUwIDU0IDkgMjY2IDEwOSAxNjQgMTU5IDE3MCA2NCAxOCAyIDIyNSA1OSAxMzUgMTkzIDE3OSA0MyAyNTIgMjcgCisyNTUgMTAxIDQ3IDgyIDI3MyAxNzMgMjc1IDIyNSAyMTkgMTcgNjMgMTI1IDI0IDI2NCA1NyAyMjAgNzAgMjkgMjUzIDE2MyAxNjAgODYgCisxMDMgMTYgODcgMTAyIDEwMCA0OCAxMDQgMTUgMTcxIDYzIDEwMiAyNjAgMjI3IDI3MSAyNTggMTUyIDI2NiAxMzIgMTE5IDE5NiAyNTMgCisyNiA0MiA2MiA0OSAxMDMgOTkgMjYgNjUgMTcgODYgODAgNjEgNTAgMTkgMTM4IDI0IDQ0IDE5MSAxMjcgOTkgMjY5IDE4MyAxNDcgMTQwIAorOTkgNDkgMjAgNTQgMTY5IDQyIDI3NiA0IDE0MCAxODIgOTQgMjgwIDc3IDIwNyAxMjQgMjUgMTgwIDk2IDIxOCAxNTUgMjAzIDI5NCA3NiAKKzcxIDIxOSAyMzEgMTI0IDE2MiAxIDIyNiAyNzIgMTc0IDE5MSAyNjQgMjE3IDEwMiAyMzcgMTY2IDIzNCAxNzUgMTkwIDUxIDcyIDEwNCAKKzE1MiAyODkgODcgMjYyIDI3OSAyMTUgMjQxIDI5MyA3NyAyODQgNjcgMjI5IDIwOSAzOSAxNDggMTM5IDE4MyAxMCAyMiA3NSAyOTIgMSAKKzY2IDkzIDcgNTQgMjgzIDIwNSA3MiA4MSAxOTcgMjUyIDQgMyA2NCAyNjEgMTIwIDU4IDExMyAxNTQgMTgxIDI1NSA3OCAyODMgNDUgCisxOTAgMjExIDI1MSAyNzEgOTggMjcwIDk5IDE4NiAxMzggMTg0IDIyMyA2MSA3MyA4MCAxNzUgMTA3IDYgMjE1IDgxIDExNCAyMDcgMTQ3IAorODYgMjYgMTc5IDE4MCA3MyAxNTcgMTE4IDEyMCAzNSAxNTggMTEgOTggMjkzIDE2MCAzMiAyMjEgMTQ2IDI0NyAxMjEgODggMTggMTM5IAorNDYgMTg5IDE4OSAyMTIgMjczIDEzIDk2IDU4IDI3MyAzNiA1MSA5NSA1OSAyOTUgNzUgNDkgMTgwIDIzMyAzOSAyODUgMjU3IDE2IDY0IAorNDEgNjMgMjYyIDE0MiA5NyAxMTEgMjM5IDU4IDI5NiAyODggMTk0IDE3OCAyMSAyMTMgMjkgMTcwIDIyNCAxOTcgMTY5IDY1IDQwIDQxIAorMjIzIDE0NCAxMiAyMzQgOTIgMTQ1IDg4IDE1NSA2NiAxNzYgMjQzIDIwOCAyMDAgMjQzIDQ4IDIxIDc2IDIwOCA0MCA2NCAxNzggMTgxIAorOTUgMTk2IDExNiAyMDUgMjA5IDE5OSAzMCA5IDIzIDI4OCAzNCAyOTYgMTUxIDc2IDQ4IDI2NCAxOTQgNDEgMjAwIDgzIDI3MiAxNTEgCisxMzAgMjI3IDEzNCAzNCAyMiAyMTIgMTEzIDEzMSAyMjYgMTEyIDI5MiAyNCAxMjcgMjM2IDkwIDE2IDEwIDE1OSAxOTMgMTkgMTYxIDg1IAorMTg3IDI3NCA4OSAxNyAyMjMgNyAxOTEgMTA0IDM4IDEyNiAxMDAgMTg1IDIyMiAxNDUgMjI1IDgyIDkwIDIzMCAyNjIgNSAyNzYgODcgCis3OSAzOSAxMSAyMSA1MyAxNDcgMyAyNzggMjE2IDI2MyAzNSA3NSA3MiAyNDEgNzkgMTIyIDI0NyAyODEgMjY3IDE4NSA4NSAyNyA5NSAKKzIxOSA3MSAyNDIgMjkyIDE2MSAyNDUgNjkgMTQ0IDM1IDI5NSAyMzUgMjI4IDUwIDE3OSAyMCAyODcgMTcyIDEzOSAyMyAxMjggMTUyIAorMTI5IDE0IDk1IDM2IDIzNCAzOCA3MiAyMTggMTggODUgMTY0IDIyIDUyIDIzMSAyNjEgMjgwIDEzMSA4OSAyOTEgMTYyIDE2MSAxMDggCisxNDIgMTQgMTcyIDI3NiAxNDEgMjU4IDE1IDE0OCAyIDY1IDE3NyAyNjUgNTYgMTk4IDMxIDMxIDE2OCAyODYgMTE5IDE3MyAxOTIgMjg2IAorMjU2IDEwMCAyNSA0MyAyNzUgODggMTAxIDE4NCA5IDEwNiAyMjcgMjk0IDIxMyAxODkgNTIgOTQgMTQzIDE1MCA3NyA3MCA2IDE5MiAKKzEyNiA3NyAxMjQgMTg1IDYyIDI2MyA1OCAxMzYgMTA5IDI3IDQxIDQwIDIwMSAxMDUgMTQgMTQ5IDIxNSAxMDQgMTc1IDUzIDIzMCAyMTkgCiteCis2MzUgMSAyMzkgMTMzIDI5NyAxMTUgMTE5IDI0OCAxOTUgOSAxODMgMTY2IDE5OSAyMzggMTMwIDI3OSA3NCAxMjEgMTYzIDE5IDI2NSAKKzI3MCAyNTcgNjYgOCAxMjYgMjA0IDcxIDI5NCAyMzQgMjQ2IDg5IDE3MyAxMDEgMTcwIDI5IDg1IDQ0IDE1NCAyNTYgMTU0IDIwMiAyMTAgCisxMTUgNjUgNSAxMDggMTYzIDczIDIwOSA1OCAxMDMgMTc2IDI2NCAyNjcgNDAgMjUgMTAgNDEgMjggMjggODIgMjYgMTEzIDI1OCA2OSAKKzI2IDE2NyAyMDIgMTU2IDE3MSAyNzcgMTU5IDI5NyA3IDIzMSAxNzQgMTA0IDg4IDcwIDgzIDI5IDMxIDY3IDExMSA0NCA0NiA2OSA4MCAKKzExMSAyODkgMiA4MiAyMzQgMSAzMyAxNjAgMjQ2IDI4MCAyODUgMjcgNzkgMTA4IDcyIDI2MCA4NCAxNDkgMTI0IDI4OSAyNDcgMzggCisxNDcgNTUgMjIyIDQgMTA1IDI0NSAzMiAyMTEgMjcyIDIyNiAxMzMgNTIgNTkgMjA2IDE5NCA2IDI2NSAyNSAyMDEgMTUzIDI1MyAyMzYgCisxNjEgMjEyIDMwIDE4OCAyNjEgMTk1IDI1NCAyMzkgNzkgNTQgMjggMjczIDEzOCAzOSAxNjcgMTQ4IDIxMiAxODQgMTMyIDQ5IDE0MSAKKzY1IDE5NiAyMjAgODkgMjgxIDI4OCAyNDQgMTIwIDEwNiA1NyAxMzcgMTI3IDYyIDMzIDEyMyA3OCAxNDIgMjIyIDU4IDQ5IDIzMiAxNzcgCisyMiAxMjkgNjggMTY4IDYgNzQgMTMgMjc1IDI0NCAxNzQgNTAgMTQ0IDgzIDIzNyAyMTggMTc0IDE1OCAzMiAxNTcgMjkgMjM5IDI4NyAKKzI0MSAyMDIgNjUgNTkgNTIgMjUwIDE5IDIwIDIxNCA0NSAxMiAyMTggMjgyIDQ2IDEwNiAyNDggMjQ5IDUzIDI3MCAxMiAxMCA5NSAyNzEgCisxNSAyOCAxMzYgMjY5IDEwMCAyMDQgMjc5IDE4MiA5IDM4IDExMCAyODYgODQgMjQwIDIzNiAyMTUgMTU2IDExNyAzNCA3MiAxNTIgOTYgCis3NSAzMyA2OSAxMzQgNTUgNzcgMjQ3IDE5MiA5MSAxNDIgMTY4IDExNCA2MiA4NyA2NyAxNjUgMjg3IDMzIDE1IDE5MCA2OCAxMzEgMTM3IAorMjM1IDI0OSAxMDcgMjE0IDk5IDI1NSAyMDUgMjI4IDI1NiA2MyA5MCA4NSAyMDYgMjg1IDExOCAxOTEgMzQgMjgwIDQwIDI3MCA2NiAKKzI1MyAxODIgMjE3IDIyNSAxODQgNzggNSA1NCAyMTkgODYgNjQgMjQ3IDI0NiAzNSAyMjkgMTQgMjI0IDIxOCAyMjggMTAyIDExOSAzIAorMTM5IDk2IDEyOSAyNzYgNTYgODAgMTY1IDIzMyA4OSAyMjcgNDUgMTU3IDI3NCAyOTUgMjAwIDI5NSA5MiAxMDggMjE3IDE3IDI5NiAKKzIwMyAxNCAxMzMgMTA2IDMgMTkzIDQwIDExNiAxMjIgMjY2IDIzNiA3IDI2OCA0MyAyNDIgMTUxIDM5IDExMyAyMDQgMTI1IDIzOCAyMiAKKzkyIDMwIDI0MiAyMDUgMjgyIDIwMCA1MCAzNiAxOTUgMTYzIDEyNyAxNTMgNDUgNDkgODcgMTIxIDEwOSA3NSAyNzggMTI1IDE0NyAyMDkgCisxNjYgOTEgNTEgNTYgMTg4IDUzIDggMTgwIDE0OCAxNTggMjQwIDQ1IDEwMyAzMSAyMDggNTUgMTg1IDEzNSAyNjYgMTgyIDYzIDI4MSAKKzk3IDEzMiAxOTQgMTk3IDc4IDI1MCAxMTAgMTMyIDE0MCAyNTMgMjkwIDEwNSAyNzUgMjk4IDExOCAzNyA5MCAxOTMgOTQgNjAgMjA5IAorMTEyIDQ3IDI2MyAxMTAgNzggMTk2IDE2NiAxNDUgMjk0IDQzIDEzNCAyNjMgMjY0IDIyIDI4MyAxMiAyNTUgMTUxIDI4NCAxNjkgMTE3IAorMjc5IDEyOCA2NSAyNTAgMTY0IDc2IDIyNyA5OSAxMDEgMjYxIDE0MSAxMSAyNTIgMjMzIDE0MyAxNzEgMzIgMTAzIDg1IDE1MiA0MiAzMSAKKzI0NSAxMjMgMjQgMTk4IDEzNSAyMTIgMjM4IDc2IDM2IDI4NiAyNzUgNTMgNjIgMTI0IDIzNSA0IDUxIDIgMjQ0IDY2IDE2MiA3MCAyOTEgCisxNyAxMDUgOTEgODggMjI0IDI3IDExNiAyNzYgMjEwIDI0IDI1MiA3OSAxOTkgODQgMTg2IDI5MiAxMjggMTEgNyAxNzcgMjMwIDE3IAorMjQyIDI1OSAyMjYgMTg3IDI5NSAxNDYgNTIgNSAyNjIgMTA3IDE2MCAxNTUgMTY4IDYwIDE4IDIyMSA1NSAxMzEgMTkxIDE3OSAzNyAKKzI1MiAyNSAyNTUgOTcgNDEgODIgMjcxIDE2OSAyNzEgMjIzIDIxNSAxMSA2MSAxMjEgMTggMjYyIDUzIDIxNiA2OCAyMyAyNDkgMTYxIAorMTU4IDg2IDEwMSAxNiA4NSA5OCA5OCA0NCAxMDAgMTMgMTY3IDU3IDEwMCAyNTggMjIzIDI2OSAyNTQgMTQ4IDI2NiAxMjggMTE5IDE5NCAKKzI1MSAyMiAzOCA1NiA0MyA5NyA5NSAyNiA1OSAxNSA4MiA4MCA1NyA0NiAxNSAxMzYgMjQgNDQgMTkxIDEyNSA5MyAyNjUgMTc5IDE0NSAKKzE0MCA5OSA0NyAxOCA1NCAxNjUgNDIgMjc2IDIgMTM2IDE3OCA4OCAyNzggNzEgMjAzIDEyMiAyMSAxODAgOTQgMjE0IDE1MyAxOTkgCisyOTIgNzQgNjcgMjE5IDIzMSAxMjAgMTYwIDEgMjI0IDI3MiAxNzIgMTg5IDI2NCAyMTMgOTYgMjM3IDE2NCAyMzAgMTcxIDE4NiAxNTMgXgorNjM4IDEgNzIgOTIgMTUyIDI4NSA4NyAyNTQgMjc1IDIxMSAyNDEgMjkzIDc3IDI4NCA1NSAyMjkgMjAxIDM1IDE0MCAxMzUgMTc5IDIgCisxOCA2MyAyODQgMjk4IDYyIDkzIDMwMCA0MiAyODMgMjAxIDY0IDczIDE4OSAyNDQgNCAyOTIgNTIgMjUzIDEyMCA0NiAxMTMgMTQ2IAorMTgxIDI0NyA3NCAyNzkgNDEgMTg2IDIwMyAyNTEgMjYzIDkwIDI2NiA5NSAxODYgMTM4IDE4NCAyMjMgNjEgNjEgNjggMTc1IDEwNyA2IAorMjA3IDgxIDExNCAyMDcgMTM5IDc0IDE0IDE3NSAxNzIgNzMgMTUzIDExMCAxMTIgMjcgMTUwIDExIDk4IDI4NSAxNTIgMjAgMjIxIDE0NiAKKzIzOSAxMTMgODggMTQgMTM5IDM4IDE4MSAxODkgMjA4IDI2NSA1IDg4IDUwIDI3MyAyNCA1MSA5MSA1NSAyODcgNjcgNDkgMTc2IDIzMyAKKzMxIDI4MSAyNTcgOCA2NCAzNyA1NSAyNTggMTM0IDg5IDExMSAyMzEgNTggMjkyIDI4OCAxODYgMTc0IDE3IDIwOSAyNSAxNzAgMjE2IAorMTk3IDE2OSA2MSAzMiA0MSAyMTUgMTM2IDQgMjM0IDkyIDE0NSA4NCAxNTUgNTQgMTY4IDI0MyAyMDggMjAwIDIzOSA0OCAyMSA2OCAKKzIwNCA0MCA2MCAxNzggMTc3IDg3IDE5NiAxMDggMTk3IDIwNSAxOTUgMTggNSAyMyAyODQgMjYgMjk2IDE0NyA2NCA0NCAyNTYgMTkwIAorMzMgMTk2IDc5IDI2NCAxNTEgMTMwIDIyMyAxMjYgMzQgMTQgMjA0IDEwNSAxMjcgMjE4IDExMiAyOTIgMTYgMTE5IDIyOCA4MiA0IDI5OSAKKzE1OSAxODUgMTkgMTUzIDgxIDE3OSAyNzQgODUgOSAyMTkgMjk2IDE4MyAxMDQgMzAgMTI2IDkyIDE4MSAyMTggMTQxIDIyNSA3MCA5MCAKKzIzMCAyNjIgMjk0IDI2OCA3NSA3NSAzOSAzMDAgMTMgNDkgMTQ3IDMwMCAyNzggMjE2IDI1NSAzNSA3NSA2OCAyMzMgNjcgMTE0IDI0MyAKKzI3MyAyNjcgMTg1IDc3IDE5IDk1IDIxNSA3MSAyMzggMjg4IDE1NyAyNDEgNTcgMTQ0IDIzIDI5MSAyMjcgMjI4IDQ2IDE3MSAxMiAyODkgCisyODMgMTcyIDEzMSAxOSAxMjQgMTQ4IDEyNSAyIDgzIDM2IDIzMCAyNiA2MCAyMTQgMTAgNzMgMTYwIDEwIDQ0IDIyNyAyNTcgMjgwIAorMTMxIDc3IDI5MSAxNjIgMTYxIDEwMCAxNDIgMTQgMTY4IDI3MiAxNDEgMjU0IDMgMTQ0IDI5NSA1NyAxNzMgMjU3IDQ0IDE5OCAyMyAxOSAKKzE2MCAyODIgMTExIDE3MyAxOTIgMjc4IDI1MiA4OCAyMSAzOSAyNzEgODAgODkgMTc2IDI5OCA5OCAyMjcgMjg2IDIxMyAxODUgNDggODYgCisxMzUgMTUwIDY5IDU4IDI5OSAxODggMTE4IDczIDEyNCAxNzcgNTggMjYzIDU0IDEzMiAxMDkgMTUgMjkgMzYgMjAxIDkzIDYgMTQ5IAorMjE1IDEwMCAxNzEgNDEgMjIyIDM2IDIzNyAxMzMgMjkzIDExMyAxMTcgMjQ4IDE5MyA5IDE4MyAxNjIgMTk3IDIzNCAxMjggMjc5IDcwIAorMTE5IDE2MyAxNSAyNjUgMjcwIDI1NSA2NCA4IDEyMiAyMDQgNjkgMjk0IDIzMiAyNDIgODkgMTY5IDk3IDE2NiAyNyA4NSAzOCAxNTIgCisyNTYgMTU0IDIwMCAyMTAgMTE1IDYxIDMgMTA4IDE2MSA3MSAyMDkgNTQgMTAzIDE3NiAyNjIgMjY1IDM0IDIxIDEwIDM3IDI2IDI0IDgwIAorMjQgMTA5IDI1OCA2OSAyMiAxNjUgMjAyIDE1NCAxNzEgMjc3IDE1NSAyOTcgMSAyMjkgMTcyIDEwMiA4NiA3MCA4MyAyOSAyOSA2NyAKKzEwNyA0MiA0MCA2NyA3OCAxMDkgMjg3IDIgNzYgMjMwIDI5OCAzMyAxNjAgMjQ2IDI3OCAyODEgMjEgNzUgMTA0IDY2IDI2MCA3OCAxNDUgCisxMjAgMjg5IDI0NyAzOCAxNDUgNTUgMjIyIDEwMyAyNDEgMjggMjExIDI3MCAyMjYgMTMxIDQ4IDU3IDIwMiAxOTAgNCAyNjMgMjUgMTk5IAorMTQ5IDI1MSAyMzQgMTU3IDIxMiAzMCAxODQgMjU5IDE5NSAyNTQgMjM5IDc3IDQ4IDI4IDI2OSAxMzYgMzMgMTY3IDE0NiAyMTAgMTgwIAorMTI4IDQzIDEzNyA2NSAxOTIgMjIwIDg1IDI4MSAyODYgMjQyIDExOCAxMDIgNTcgMTM3IDEyMyA1OCAyNyAxMjEgNzggMTM4IDIyMCA1NiAKKzQ3IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCA3NCA3IDI3NSAyNDAgMTc0IDQ2IDE0MiA3OSAyMzUgMjE4IDE3MCAxNTggMzAgMTU1IDI1IAorMjM1IDI4MyAyMzcgMTk4IDU5IDU5IDUyIDI0NiAxMyAyMCAyMTQgMzkgNiAyMTQgMjgyIDQ2IDEwNiAyNDYgMjQ5IDQ3IDI2OCAxMCA4IAorOTMgMjcxIDE1IDIyIDEzNiAyNjkgMTAwIDIwMCAyNzUgMTgyIDcgMzIgMTA2IDI4MiA4MiAyNDAgMjMyIDIxMyAxNTYgMTE1IDMyIDcwIAorMTQ4IDk2IDY5IDI5IDY1IDEzNCA1MyA3MSAyNDUgMTg4IDg5IDE0MCAxNjQgMTEyIDU2IDgzIDY1IDE2MyAyODcgMzEgOSAxOTAgNjIgCisxMjkgMTMzIDIzNSAyNDcgMTAzIDIxMiA5NSAyNTEgMjA1IDIyNCAyNTIgNTkgODggNzkgMjA2IDI4NSAxMTYgMTg3IDI4IDI3NiAyNjMgXgorNjQwIDAgMjY0IDY2IDI1MyAxNzYgMjExIDIxOSAxODEgNjkgNSA1MSAyMTYgNzcgNTggMjQxIDI0MyAzMiAyMjMgMTEgMjI0IDIxNSAKKzIyNSAxMDIgMTEzIDMgMTM2IDkzIDEyMyAyNzMgNTYgNzQgMTY1IDIzMCA4NiAyMjQgMzkgMTU3IDI2OCAyODkgMTk3IDI5NSA4MyAxMDUgCisyMTcgMTQgMjkzIDIwMyA1IDEyNyAxMDMgMTkzIDM3IDExNiAxMjIgMjYwIDIzNiA3IDI2OCAzNyAyNDIgMTQ1IDMzIDExMCAyMDEgMTI1IAorMjM4IDEzIDg5IDI5MyAyNyAyMzkgMjAyIDI3OSAxOTQgNTAgMjcgMTg5IDE1NyAxMjcgMTUzIDQ1IDQzIDc4IDEyMSAxMDYgNjkgMjcyIAorMTE5IDE0MSAyMDMgMTY2IDgyIDQyIDUwIDE4OCA1MyA1IDE3NyAxNDggMTUyIDIzNCA0MiAxMDAgMjIgMjA1IDQ2IDE4MiAxMzIgMjYzIAorMTc5IDYzIDI3NSA5NyAxMjkgMTk0IDE5MSA3MiAyNTAgMTA3IDEzMiAxMzcgMjQ3IDI5MCA5OSAyOTYgMjcyIDI5NSAxMTggMzcgODEgCisxOTAgOTQgNjAgMjA2IDEwOSA0NyAyNjAgMTEwIDc1IDE5MyAxNjMgMTM5IDI4OCA0MyAxMjggMjU3IDI1OCAxOSAyNzcgMTIgMjUyIAorMTQ4IDI3OCAxNjYgMTE3IDI3NiAxMjUgNjIgMjQ3IDE2NCA3NiAyMjEgOTYgMTAxIDI2MSAxMzggOCAyNDYgMjI3IDE0MyAxNjggMzIgCis5NyA3OSAxNDkgMzkgMzEgMjQ1IDEyMyAyMSAxOTIgMTM1IDIwNiAyMzUgNzAgMzMgMjg2IDI2OSA1MCA2MiAxMjEgMjMyIDEgNDUgMjk1IAorMjQ0IDYwIDE1NiA2NCAyODggOCAxMDUgOTEgODIgMjE4IDI3IDExMyAyNzAgMjA0IDE4IDI0OSA3OSAxOTkgODQgMTgzIDI4NiAxMjggNSAKKzEgMTcxIDIyNyAxNyAyMzYgMjU5IDIyMyAxODcgMjkyIDE0MCA0OSAzMDEgMjU2IDEwNCAxNTQgMTQ5IDE2NSA1NCAxOCAyOTkgMjE1IAorNDkgMTI1IDE4OCAxNzkgMjggMjUyIDIyIDI1NSA5MSAzMiA4MiAyNjggMTYzIDI2NSAyMjAgMjA5IDIgNTggMTE1IDkgMjU5IDQ3IDIxMCAKKzY1IDE0IDI0MyAxNTggMTU1IDg2IDk4IDE2IDgyIDkyIDk1IDM4IDk0IDEwIDE2MSA0OCA5NyAyNTUgMjE3IDI2NiAyNDggMTQyIDI2NiAKKzEyMiAxMTkgMTkxIDI0OCAxNiAzMiA0NyAzNCA4OCA4OSAyNiA1MCAxMiA3NiA4MCA1MSA0MCA5IDEzMyAyNCA0NCAxOTEgMTIyIDg0IAorMjU5IDE3MyAxNDIgMTQwIDk5IDQ0IDE1IDU0IDE1OSA0MiAyNzYgMzAxIDEzMCAxNzIgNzkgMjc1IDYyIDE5NyAxMTkgMTUgMTgwIDkxIAorMjA4IDE1MCAxOTMgMjg5IDcxIDYxIDIxOSAyMzEgMTE0IDE1NyAxIDIyMSAyNzIgMTY5IDE4NiAyNjQgMjA3IDg3IDIzNyAxNjEgMjI0IAorMTY1IDE4MCA0MSA3MiA4OSAxNTIgMjg0IDg3IDI1MiAyNzQgMjEwIDI0MSAyOTMgNzcgMjg0IDUyIDIyOSAxOTkgMzQgMTM4IDEzNCAKKzE3OCAxNyA2MCAyODIgMjk4IDYxIDkzIDI5OSAzOSAyODMgMjAwIDYyIDcxIDE4NyAyNDIgNCAyOTAgNDkgMjUxIDEyMCA0MyAxMTMgCisxNDQgMTgxIDI0NSA3MyAyNzggNDAgMTg1IDIwMSAyNTEgMjYxIDg4IDI2NSA5NCAxODYgMTM4IDE4NCAyMjMgNjEgNTggNjUgMTc1IAorMTA3IDYgMjA1IDgxIDExNCAyMDcgMTM3IDcxIDExIDE3NCAxNzAgNzMgMTUyIDEwOCAxMTAgMjUgMTQ4IDExIDk4IDI4MyAxNTAgMTcgCisyMjEgMTQ2IDIzNyAxMTEgODggMTMgMTM5IDM2IDE3OSAxODkgMjA3IDI2MyAzIDg2IDQ4IDI3MyAyMSA1MSA5MCA1NCAyODUgNjUgNDkgCisxNzUgMjMzIDI5IDI4MCAyNTcgNiA2NCAzNiA1MyAyNTcgMTMyIDg3IDExMSAyMjkgNTggMjkxIDI4OCAxODQgMTczIDE2IDIwOCAyNCAKKzE3MCAyMTQgMTk3IDE2OSA2MCAzMCA0MSAyMTMgMTM0IDIgMjM0IDkyIDE0NSA4MyAxNTUgNTEgMTY2IDI0MyAyMDggMjAwIDIzOCA0OCAKKzIxIDY2IDIwMyA0MCA1OSAxNzggMTc2IDg1IDE5NiAxMDYgMTk1IDIwNCAxOTQgMTUgNCAyMyAyODMgMjQgMjk2IDE0NiA2MSA0MyAyNTQgCisxODkgMzEgMTk1IDc4IDI2MiAxNTEgMTMwIDIyMiAxMjQgMzQgMTIgMjAyIDEwMyAxMjYgMjE2IDExMiAyOTIgMTQgMTE3IDIyNiA4MCAxIAorMjk3IDE1OSAxODMgMTkgMTUxIDgwIDE3NyAyNzQgODQgNyAyMTggMjk0IDE4MSAxMDQgMjggMTI2IDkwIDE4MCAyMTcgMTQwIDIyNSA2NyAKKzkwIDIzMCAyNjIgMjkyIDI2NiA3MiA3NCAzOSAyOTggMTEgNDggMTQ3IDMwMCAyNzggMjE2IDI1MyAzNSA3NSA2NyAyMzEgNjQgMTEyIAorMjQyIDI3MSAyNjcgMTg1IDc1IDE3IDk1IDIxNCA3MSAyMzcgMjg3IDE1NiAyNDAgNTQgMTQ0IDIwIDI5MCAyMjUgMjI4IDQ1IDE2OSAxMCAKKzI4NyAyODIgMTcyIDEyOSAxOCAxMjMgMTQ3IDEyNCAzMDEgODAgMzYgMjI5IDIzIDU3IDIxMyA4IDcwIDE1OSA3IDQyIDIyNiAyNTYgCisyODAgMTMxIDIxMyBeCis2NDAgMCAyOTEgMTYyIDE2MSA5NCAxNDIgMTQgMTY1IDI2OSAxNDEgMjUxIDI5OCAxNDEgMjkyIDUxIDE3MCAyNTEgMzUgMTk4IDE3IDEwIAorMTU0IDI3OSAxMDUgMTczIDE5MiAyNzIgMjQ5IDc5IDE4IDM2IDI2OCA3NCA4MCAxNzAgMjkyIDkyIDIyNyAyODAgMjEzIDE4MiA0NSA4MCAKKzEyOSAxNTAgNjMgNDkgMjk2IDE4NSAxMTIgNzAgMTI0IDE3MSA1NSAyNjMgNTEgMTI5IDEwOSA2IDIwIDMzIDIwMSA4NCAxNDkgMjE1IAorOTcgMTY4IDMyIDIxNiAyNyAyMzQgMTMzIDI4NyAxMTAgMTE0IDI0OCAxOTAgOSAxODMgMTU2IDE5NCAyMjggMTI1IDI3OSA2NCAxMTYgCisxNjMgOSAyNjUgMjcwIDI1MiA2MSA4IDExNiAyMDQgNjYgMjk0IDIyOSAyMzYgODkgMTYzIDkxIDE2MCAyNCA4NSAyOSAxNDkgMjU2IAorMTU0IDE5NyAyMTAgMTE1IDU1IDEwOCAxNTggNjggMjA5IDQ4IDEwMyAxNzYgMjU5IDI2MiAyNSAxNSAxMCAzMSAyMyAxOCA3NyAyMSAKKzEwMyAyNTggNjkgMTYgMTYyIDIwMiAxNTEgMTcxIDI3NyAxNDkgMjk3IDI5NiAyMjYgMTY5IDk5IDgzIDcwIDgzIDI5IDI2IDY3IDEwMSAKKzM5IDMxIDY0IDc1IDEwNiAyODQgMiA2NyAyMjQgMjk1IDMzIDE2MCAyNDYgMjc1IDI3NSAxMiA2OSA5OCA1NyAyNjAgNjkgMTM5IDExNCAKKzI4OSAyNDcgMzggMTQyIDU1IDIyMiAyOTggMTAwIDIzNSAyMiAyMTEgMjY3IDIyNiAxMjggNDIgNTQgMTk2IDE4NCAxIDI2MCAyNSAxOTYgCisxNDMgMjQ4IDIzMSAxNTEgMjEyIDMwIDE3OCAyNTYgMTk1IDI1NCAyMzkgNzQgMzkgMjggMjYzIDEzMyAyNCAxNjcgMTQzIDIwNyAxNzQgCisxMjIgMzQgMTMxIDY1IDE4NiAyMjAgNzkgMjgxIDI4MyAyMzkgMTE1IDk2IDU3IDEzNyAxMTcgNTIgMTggMTE4IDc4IDEzMiAyMTcgNTMgCis0NCAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMjk1IDc0IDMwMiAyNzUgMjM0IDE3NCA0MCAxMzkgNzMgMjMyIDIxOCAxNjQgMTU4IDI3IAorMTUyIDE5IDIyOSAyNzcgMjMxIDE5MiA1MCA1OSA1MiAyNDAgNCAyMCAyMTQgMzAgMzAxIDIwOCAyODIgNDYgMTA2IDI0MyAyNDkgMzggCisyNjUgNyA1IDkwIDI3MSAxNSAxMyAxMzYgMjY5IDEwMCAxOTQgMjY5IDE4MiA0IDIzIDEwMCAyNzYgNzkgMjQwIDIyNiAyMTAgMTU2IAorMTEyIDI5IDY3IDE0MiA5NiA2MCAyMyA1OSAxMzQgNTAgNjIgMjQyIDE4MiA4NiAxMzcgMTU4IDEwOSA0NyA3NyA2MiAxNjAgMjg3IDI4IAorMTkwIDUzIDEyNiAxMjcgMjM1IDI0NCA5NyAyMDkgODkgMjQ1IDIwNSAyMTggMjQ2IDUzIDg1IDcwIDIwNiAyODUgMTEzIDE4MSAxOSAKKzI3MCAzMCAyNjAgNjYgMjUzIDE3MiAyMDcgMjE1IDE3OSA2MyA1IDQ5IDIxNCA3MSA1NCAyMzcgMjQxIDMwIDIxOSA5IDIyNCAyMTMgCisyMjMgMTAyIDEwOSAzIDEzNCA5MSAxMTkgMjcxIDU2IDcwIDE2NSAyMjggODQgMjIyIDM1IDE1NyAyNjQgMjg1IDE5NSAyOTUgNzcgMTAzIAorMjE3IDEyIDI5MSAyMDMgMzAzIDEyMyAxMDEgMzAyIDE5MyAzNSAxMTYgMTIyIDI1NiAyMzYgNyAyNjggMzMgMjQyIDE0MSAyOSAxMDggCisxOTkgMTI1IDIzOCA3IDg3IDI4OSAyNSAyMzcgMjAwIDI3NyAxOTAgNTAgMjEgMTg1IDE1MyAxMjcgMTUzIDQ1IDM5IDcyIDEyMSAxMDQgCis2NSAyNjggMTE1IDEzNyAxOTkgMTY2IDc2IDM2IDQ2IDE4OCA1MyAzIDE3NSAxNDggMTQ4IDIzMCA0MCA5OCAxNiAyMDMgNDAgMTgwIAorMTMwIDI2MSAxNzcgNjMgMjcxIDk3IDEyNyAxOTQgMTg3IDY4IDI1MCAxMDUgMTMyIDEzNSAyNDMgMjkwIDk1IDI5NCAyNzAgMjkzIDExOCAKKzM3IDc1IDE4OCA5NCA2MCAyMDQgMTA3IDQ3IDI1OCAxMTAgNzMgMTkxIDE2MSAxMzUgMjg0IDQzIDEyNCAyNTMgMjU0IDE3IDI3MyAxMiAKKzI1MCAxNDYgMjc0IDE2NCAxMTcgMjc0IDEyMyA2MCAyNDUgMTY0IDc2IDIxNyA5NCAxMDEgMjYxIDEzNiA2IDI0MiAyMjMgMTQzIDE2NiAKKzMyIDkzIDc1IDE0NyAzNyAzMSAyNDUgMTIzIDE5IDE4OCAxMzUgMjAyIDIzMyA2NiAzMSAyODYgMjY1IDQ4IDYyIDExOSAyMzAgMzAzIAorNDEgMjkxIDI0NCA1NiAxNTIgNjAgMjg2IDIgMTA1IDkxIDc4IDIxNCAyNyAxMTEgMjY2IDIwMCAxNCAyNDcgNzkgMTk5IDg0IDE4MSAKKzI4MiAxMjggMSAzMDEgMTY3IDIyNSAxNyAyMzIgMjU5IDIyMSAxODcgMjkwIDEzNiA0NyAyOTkgMjUyIDEwMiAxNTAgMTQ1IDE2MyA1MCAKKzE4IDI5OSAyMTEgNDUgMTIxIDE4NiAxNzkgMjIgMjUyIDIwIDI1NSA4NyAyNiA4MiAyNjYgMTU5IDI2MSAyMTggMjA1IDMwMCA1NiAxMTEgCiszIDI1NyA0MyAyMDYgNjMgOCAyMzkgMTU2IDE1MyA4NiA5NiAxNiA4MCA4OCA5MyAzNCA5MCA4IDE1NyA0MiA5NSAyNTMgMjEzIDI2NCAKKzI0NCAxMzggMjY2IDExOCAxMTkgMTg5IDI0NiA3OSBeCis2NTAgMCAyNCAzNSAyMiA3NiA4MSAyNiAzOCA4IDY4IDgwIDQzIDMyIDEgMTI5IDI0IDQ0IDE5MSAxMTggNzIgMjUxIDE2NSAxMzggMTQwIAorOTkgNDAgMTEgNTQgMTUxIDQyIDI3NiAzMDEgMTIyIDE2NCA2NyAyNzEgNTAgMTg5IDExNSA3IDE4MCA4NyAyMDAgMTQ2IDE4NSAyODUgCis2NyA1MyAyMTkgMjMxIDEwNiAxNTMgMSAyMTcgMjcyIDE2NSAxODIgMjY0IDE5OSA3NSAyMzcgMTU3IDIxNiAxNTcgMTcyIDMzIDcyIDc3IAorMTUyIDI4MCA4NyAyNDQgMjcwIDIwNiAyNDEgMjkzIDc3IDI4NCA0MCAyMjkgMTkxIDMwIDEzMCAxMzAgMTc0IDI5OCAxMyA0OCAyNzQgCisyOTggNTcgOTMgMjk1IDI3IDI4MyAxOTYgNTQgNjMgMTc5IDIzNCA0IDI4MiAzNyAyNDMgMTIwIDMxIDExMyAxMzYgMTgxIDIzNyA2OSAKKzI3NCAzNiAxODEgMTkzIDI1MSAyNTMgODAgMjYxIDkwIDE4NiAxMzggMTg0IDIyMyA2MSA0NiA1MyAxNzUgMTA3IDYgMTk3IDgxIDExNCAKKzIwNyAxMjkgNTkgMzA1IDE3MCAxNjIgNzMgMTQ4IDEwMCAxMDIgMTcgMTQwIDExIDk4IDI3NSAxNDIgNSAyMjEgMTQ2IDIyOSAxMDMgODggCis5IDEzOSAyOCAxNzEgMTg5IDIwMyAyNTUgMzAxIDc4IDQwIDI3MyA5IDUxIDg2IDUwIDI3NyA1NyA0OSAxNzEgMjMzIDIxIDI3NiAyNTcgCiszMDQgNjQgMzIgNDUgMjUzIDEyNCA3OSAxMTEgMjIxIDU4IDI4NyAyODggMTc2IDE2OSAxMiAyMDQgMjAgMTcwIDIwNiAxOTcgMTY5IDU2IAorMjIgNDEgMjA1IDEyNiAzMDAgMjM0IDkyIDE0NSA3OSAxNTUgMzkgMTU4IDI0MyAyMDggMjAwIDIzNCA0OCAyMSA1OCAxOTkgNDAgNTUgCisxNzggMTcyIDc3IDE5NiA5OCAxODcgMjAwIDE5MCAzIDIzIDI3OSAxNiAyOTYgMTQyIDQ5IDM5IDI0NiAxODUgMjMgMTkxIDc0IDI1NCAKKzE1MSAxMzAgMjE4IDExNiAzNCA0IDE5NCA5NSAxMjIgMjA4IDExMiAyOTIgNiAxMDkgMjE4IDcyIDI5NSAyODkgMTU5IDE3NSAxOSAxNDMgCis3NiAxNjkgMjc0IDgwIDMwNSAyMTQgMjg2IDE3MyAxMDQgMjAgMTI2IDgyIDE3NiAyMTMgMTM2IDIyNSA1NSA5MCAyMzAgMjYyIDI4NCAKKzI1OCA2MCA3MCAzOSAyOTAgMyA0NCAxNDcgMzAwIDI3OCAyMTYgMjQ1IDM1IDc1IDYzIDIyMyA1MiAxMDQgMjM4IDI2MyAyNjcgMTg1IAorNjcgOSA5NSAyMTAgNzEgMjMzIDI4MyAxNTIgMjM2IDQyIDE0NCA4IDI4NiAyMTcgMjI4IDQxIDE2MSAyIDI3OSAyNzggMTcyIDEyMSAxNCAKKzExOSAxNDMgMTIwIDI5MyA2OCAzNiAyMjUgMTEgNDUgMjA5IDU4IDE1NSAzMDEgMzQgMjIyIDI1MiAyODAgMTMxIDYyIDI5MSAxNjIgCisxNjEgOTAgMTQyIDE0IDE2MyAyNjcgMTQxIDI0OSAyOTQgMTM5IDI5MCA0NyAxNjggMjQ3IDI5IDE5OCAxMyA0IDE1MCAyNzcgMTAxIAorMTczIDE5MiAyNjggMjQ3IDczIDE2IDM0IDI2NiA3MCA3NCAxNjYgMjg4IDg4IDIyNyAyNzYgMjEzIDE4MCA0MyA3NiAxMjUgMTUwIDU5IAorNDMgMjk0IDE4MyAxMDggNjggMTI0IDE2NyA1MyAyNjMgNDkgMTI3IDEwOSAxNCAzMSAyMDEgNzggMzAyIDE0OSAyMTUgOTUgMTY2IDI2IAorMjEyIDIxIDIzMiAxMzMgMjgzIDEwOCAxMTIgMjQ4IDE4OCA5IDE4MyAxNTIgMTkyIDIyNCAxMjMgMjc5IDYwIDExNCAxNjMgNSAyNjUgCisyNzAgMjUwIDU5IDggMTEyIDIwNCA2NCAyOTQgMjI3IDIzMiA4OSAxNTkgODcgMTU2IDIyIDg1IDIzIDE0NyAyNTYgMTU0IDE5NSAyMTAgCisxMTUgNTEgMzA0IDEwOCAxNTYgNjYgMjA5IDQ0IDEwMyAxNzYgMjU3IDI2MCAxOSAxMSAxMCAyNyAyMSAxNCA3NSAxOSA5OSAyNTggNjkgCisxMiAxNjAgMjAyIDE0OSAxNzEgMjc3IDE0NSAyOTcgMjkyIDIyNCAxNjcgOTcgODEgNzAgODMgMjkgMjQgNjcgOTcgMzcgMjUgNjIgNzMgCisxMDQgMjgyIDIgNjEgMjIwIDI5MyAzMyAxNjAgMjQ2IDI3MyAyNzEgNiA2NSA5NCA1MSAyNjAgNjMgMTM1IDExMCAyODkgMjQ3IDM4IAorMTQwIDU1IDIyMiAyOTYgOTggMjMxIDE4IDIxMSAyNjUgMjI2IDEyNiAzOCA1MiAxOTIgMTgwIDMwNSAyNTggMjUgMTk0IDEzOSAyNDYgCisyMjkgMTQ3IDIxMiAzMCAxNzQgMjU0IDE5NSAyNTQgMjM5IDcyIDMzIDI4IDI1OSAxMzEgMTggMTY3IDE0MSAyMDUgMTcwIDExOCAyOCAKKzEyNyA2NSAxODIgMjIwIDc1IDI4MSAyODEgMjM3IDExMyA5MiA1NyAxMzcgMTEzIDQ4IDEyIDExNiA3OCAxMjggMjE1IDUxIDQyIDIzMiAKKzE3NyAyMiAxMjkgNjggMTY4IDI5MSA3NCAyOTggMjc1IDIzMCAxNzQgMzYgMTM3IDY5IDIzMCAyMTggMTYwIDE1OCAyNSAxNTAgMTUgCisyMjUgMjczIDIyNyAxODggNDQgNTkgNTIgMjM2IDMwNCAyMCAyMTQgMjQgMjk3IDIwNCAyODIgNDYgMTA2IDI0MSAyNDkgMzIgMjYzIDUgCiszIDg4IDI3MSAxNSA3IDEzNiAyNjkgMTAwIDE5MCAyNjUgMTgyIDIgMTcgOTYgMjgzIF4KKzY0OSAwIDc2IDI0MCAyMjAgMjA3IDE1NiAxMDkgMjYgNjQgMTM2IDk2IDUxIDE3IDUzIDEzNCA0NyA1MyAyMzkgMTc2IDgzIDEzNCAxNTIgCisxMDYgMzggNzEgNTkgMTU3IDI4NyAyNSAyOTggMTkwIDQ0IDEyMyAxMjEgMjM1IDI0MSA5MSAyMDYgODMgMjM5IDIwNSAyMTIgMjQwIDQ3IAorODIgNjEgMjA2IDI4NSAxMTAgMTc1IDEwIDI2NCAyNCAyNTQgNjYgMjUzIDE2NiAyMDEgMjA5IDE3NiA1NCA1IDQ2IDIxMSA2MiA0OCAKKzIzMSAyMzggMjcgMjEzIDYgMjI0IDIxMCAyMjAgMTAyIDEwMyAzIDEzMSA4OCAxMTMgMjY4IDU2IDY0IDE2NSAyMjUgODEgMjE5IDI5IAorMTU3IDI1OCAyNzkgMTkyIDI5NSA2OCAxMDAgMjE3IDkgMjg4IDIwMyAyOTcgMTE3IDk4IDMwMiAxOTMgMzIgMTE2IDEyMiAyNTAgMjM2IAorNyAyNjggMjcgMjQyIDEzNSAyMyAxMDUgMTk2IDEyNSAyMzggMzA1IDg0IDI4MyAyMiAyMzQgMTk3IDI3NCAxODQgNTAgMTIgMTc5IDE0NyAKKzEyNyAxNTMgNDUgMzMgNjMgMTIxIDEwMSA1OSAyNjIgMTA5IDEzMSAxOTMgMTY2IDY3IDI3IDQwIDE4OCA1MyAxNzIgMTQ4IDE0MiAyMjQgCiszNyA5NSA3IDIwMCAzMSAxNzcgMTI3IDI1OCAxNzQgNjMgMjY1IDk3IDEyNCAxOTQgMTgxIDYyIDI1MCAxMDIgMTMyIDEzMiAyMzcgMjkwIAorODkgMjkxIDI2NyAyOTAgMTE4IDM3IDY2IDE4NSA5NCA2MCAyMDEgMTA0IDQ3IDI1NSAxMTAgNzAgMTg4IDE1OCAxMjkgMjc4IDQzIDExOCAKKzI0NyAyNDggMTQgMjY3IDEyIDI0NyAxNDMgMjY4IDE2MSAxMTcgMjcxIDEyMCA1NyAyNDIgMTY0IDc2IDIxMSA5MSAxMDEgMjYxIDEzMyAKKzMgMjM2IDIxNyAxNDMgMTYzIDMyIDg3IDY5IDE0NCAzNCAzMSAyNDUgMTIzIDE2IDE4MiAxMzUgMTk2IDIzMCA2MCAyOCAyODYgMjU5IAorNDUgNjIgMTE2IDIyNyAzMDMgMzUgMjg1IDI0NCA1MCAxNDYgNTQgMjgzIDMwMCAxMDUgOTEgNzIgMjA4IDI3IDEwOCAyNjAgMTk0IDggCisyNDQgNzkgMTk5IDg0IDE3OCAyNzYgMTI4IDMwMiAyOTggMTYxIDIyMiAxNyAyMjYgMjU5IDIxOCAxODcgMjg3IDEzMCA0NCAyOTYgMjQ2IAorOTkgMTQ0IDEzOSAxNjAgNDQgMTggMjk5IDIwNSAzOSAxMTUgMTgzIDE3OSAxMyAyNTIgMTcgMjU1IDgxIDE3IDgyIDI2MyAxNTMgMjU1IAorMjE1IDE5OSAyOTQgNTMgMTA1IDMwMSAyNTQgMzcgMjAwIDYwIDMwNiAyMzMgMTUzIDE1MCA4NiA5MyAxNiA3NyA4MiA5MCAyOCA4NCA1IAorMTUxIDMzIDkyIDI1MCAyMDcgMjYxIDIzOCAxMzIgMjY2IDExMiAxMTkgMTg2IDI0MyA2IDIyIDMyIDE5IDczIDc5IDI2IDM1IDcgNjYgCis4MCA0MSAzMCAzMDYgMTI4IDI0IDQ0IDE5MSAxMTcgNjkgMjQ5IDE2MyAxMzcgMTQwIDk5IDM5IDEwIDU0IDE0OSA0MiAyNzYgMzAxIAorMTIwIDE2MiA2NCAyNzAgNDcgMTg3IDExNCA1IDE4MCA4NiAxOTggMTQ1IDE4MyAyODQgNjYgNTEgMjE5IDIzMSAxMDQgMTUyIDEgMjE2IAorMjcyIDE2NCAxODEgMjY0IDE5NyA3MiAyMzcgMTU2IDIxNCAxNTUgMTcwIDMxIDcyIDc0IDE1MiAyNzkgODcgMjQyIDI2OSAyMDUgMjQxIAorMjkzIDc3IDI4NCAzNyAyMjkgMTg5IDI5IDEyOCAxMjkgMTczIDI5NyAxMiA0NSAyNzIgMjk4IDU2IDkzIDI5NCAyNCAyODMgMTk1IDUyIAorNjEgMTc3IDIzMiA0IDI4MCAzNCAyNDEgMTIwIDI4IDExMyAxMzQgMTgxIDIzNSA2OCAyNzMgMzUgMTgwIDE5MSAyNTEgMjUxIDc4IDI2MCAKKzg5IDE4NiAxMzggMTg0IDIyMyA2MSA0MyA1MCAxNzUgMTA3IDYgMTk1IDgxIDExNCAyMDcgMTI3IDU2IDMwMyAxNjkgMTYwIDczIDE0NyAKKzk4IDEwMCAxNSAxMzggMTEgOTggMjczIDE0MCAyIDIyMSAxNDYgMjI3IDEwMSA4OCA4IDEzOSAyNiAxNjkgMTg5IDIwMiAyNTMgMzAwIAorNzYgMzggMjczIDYgNTEgODUgNDkgMjc1IDU1IDQ5IDE3MCAyMzMgMTkgMjc1IDI1NyAzMDMgNjQgMzEgNDMgMjUyIDEyMiA3NyAxMTEgCisyMTkgNTggMjg2IDI4OCAxNzQgMTY4IDExIDIwMyAxOSAxNzAgMjA0IDE5NyAxNjkgNTUgMjAgNDEgMjAzIDEyNCAyOTkgMjM0IDkyIAorMTQ1IDc4IDE1NSAzNiAxNTYgMjQzIDIwOCAyMDAgMjMzIDQ4IDIxIDU2IDE5OCA0MCA1NCAxNzggMTcxIDc1IDE5NiA5NiAxODUgMTk5IAorMTg5IDMwNiAyMyAyNzggMTQgMjk2IDE0MSA0NiAzOCAyNDQgMTg0IDIxIDE5MCA3MyAyNTIgMTUxIDEzMCAyMTcgMTE0IDM0IDIgMTkyIAorOTMgMTIxIDIwNiAxMTIgMjkyIDQgMTA3IDIxNiA3MCAyOTMgMjg3IDE1OSAxNzMgMTkgMTQxIDc1IDE2NyAyNzQgNzkgMzA0IDIxMyAKKzI4NCAxNzEgMTA0IDE4IDEyNiA4MCAxNzUgMjEyIDEzNSAyMjUgNTIgOTAgMjMwIDI2MiAyODIgMjU2IDU3IDY5IDM5IDI4OCAxIDQzIAorMTQ3IDMwMCAyNzggMjE2IDI0MyAzNSA3NSA2MiAyMjEgNDkgMTAyIDIzNyAyNjEgMjY3IDE0MCBeCis2NDkgMSA2MSAzIDk1IDIwNyA3MSAyMzAgMjgwIDE0OSAyMzMgMzMgMTQ0IDMwOCAyODMgMjExIDIyOCAzOCAxNTUgMzA1IDI3MyAyNzUgCisxNzIgMTE1IDExIDExNiAxNDAgMTE3IDI4NyA1OSAzNiAyMjIgMiAzNiAyMDYgMzAzIDQ5IDE1MiAyOTUgMjggMjE5IDI0OSAyODAgMTMxIAorNTMgMjkxIDE2MiAxNjEgODQgMTQyIDE0IDE2MCAyNjQgMTQxIDI0NiAyODggMTM2IDI4NyA0MSAxNjUgMjQxIDIwIDE5OCA3IDMwNCAKKzE0NCAyNzQgOTUgMTczIDE5MiAyNjIgMjQ0IDY0IDEzIDMxIDI2MyA2NCA2NSAxNjAgMjgyIDgyIDIyNyAyNzAgMjEzIDE3NyA0MCA3MCAKKzExOSAxNTAgNTMgMzQgMjkxIDE4MCAxMDIgNjUgMTI0IDE2MSA1MCAyNjMgNDYgMTI0IDEwOSAzMDAgNSAyOCAyMDEgNjkgMjk5IDE0OSAKKzIxNSA5MiAxNjMgMTcgMjA2IDEyIDIyOSAxMzMgMjc3IDEwNSAxMDkgMjQ4IDE4NSA5IDE4MyAxNDYgMTg5IDIxOCAxMjAgMjc5IDU0IAorMTExIDE2MyAzMDggMjY1IDI3MCAyNDcgNTYgOCAxMDYgMjA0IDYxIDI5NCAyMjQgMjI2IDg5IDE1MyA4MSAxNTAgMTkgODUgMTQgMTQ0IAorMjU2IDE1NCAxOTIgMjEwIDExNSA0NSAzMDQgMTA4IDE1MyA2MyAyMDkgMzggMTAzIDE3NiAyNTQgMjU3IDEwIDUgMTAgMjEgMTggOCA3MiAKKzE2IDkzIDI1OCA2OSA2IDE1NyAyMDIgMTQ2IDE3MSAyNzcgMTM5IDI5NyAyODYgMjIxIDE2NCA5NCA3OCA3MCA4MyAyOSAyMSA2NyA5MSAKKzM0IDE2IDU5IDcwIDEwMSAyNzkgMiA1MiAyMTQgMjkwIDMzIDE2MCAyNDYgMjcwIDI2NSAzMDYgNTkgODggNDIgMjYwIDU0IDEyOSAxMDQgCisyODkgMjQ3IDM4IDEzNyA1NSAyMjIgMjkzIDk1IDIyNSAxMiAyMTEgMjYyIDIyNiAxMjMgMzIgNDkgMTg2IDE3NCAzMDUgMjU1IDI1IAorMTkxIDEzMyAyNDMgMjI2IDE0MSAyMTIgMzAgMTY4IDI1MSAxOTUgMjU0IDIzOSA2OSAyNCAyOCAyNTMgMTI4IDkgMTY3IDEzOCAyMDIgCisxNjQgMTEyIDE5IDEyMSA2NSAxNzYgMjIwIDY5IDI4MSAyNzggMjM0IDExMCA4NiA1NyAxMzcgMTA3IDQyIDMgMTEzIDc4IDEyMiAyMTIgCis0OCAzOSAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMjg1IDc0IDI5MiAyNzUgMjI0IDE3NCAzMCAxMzQgNjMgMjI3IDIxOCAxNTQgMTU4IDIyIAorMTQ3IDkgMjE5IDI2NyAyMjEgMTgyIDM1IDU5IDUyIDIzMCAyOTggMjAgMjE0IDE1IDI5MSAxOTggMjgyIDQ2IDEwNiAyMzggMjQ5IDIzIAorMjYwIDIgODUgMjcxIDE1IDMwNyAxMzYgMjY5IDEwMCAxODQgMjU5IDE4MiAzMDggOCA5MCAyNjYgNzQgMjQwIDIxNiAyMDUgMTU2IDEwNyAKKzI0IDYyIDEzMiA5NiA0NSAxMyA0OSAxMzQgNDUgNDcgMjM3IDE3MiA4MSAxMzIgMTQ4IDEwNCAzMiA2NyA1NyAxNTUgMjg3IDIzIDI5NCAKKzE5MCAzOCAxMjEgMTE3IDIzNSAyMzkgODcgMjA0IDc5IDIzNSAyMDUgMjA4IDIzNiA0MyA4MCA1NSAyMDYgMjg1IDEwOCAxNzEgNCAyNjAgCisyMCAyNTAgNjYgMjUzIDE2MiAxOTcgMjA1IDE3NCA0OCA1IDQ0IDIwOSA1NiA0NCAyMjcgMjM2IDI1IDIwOSA0IDIyNCAyMDggMjE4IAorMTAyIDk5IDMgMTI5IDg2IDEwOSAyNjYgNTYgNjAgMTY1IDIyMyA3OSAyMTcgMjUgMTU3IDI1NCAyNzUgMTkwIDI5NSA2MiA5OCAyMTcgNyAKKzI4NiAyMDMgMjkzIDExMyA5NiAzMDIgMTkzIDMwIDExNiAxMjIgMjQ2IDIzNiA3IDI2OCAyMyAyNDIgMTMxIDE5IDEwMyAxOTQgMTI1IAorMjM4IDMwMSA4MiAyNzkgMjAgMjMyIDE5NSAyNzIgMTgwIDUwIDYgMTc1IDE0MyAxMjcgMTUzIDQ1IDI5IDU3IDEyMSA5OSA1NSAyNTggCisxMDUgMTI3IDE4OSAxNjYgNjEgMjEgMzYgMTg4IDUzIDMwNyAxNzAgMTQ4IDEzOCAyMjAgMzUgOTMgMSAxOTggMjUgMTc1IDEyNSAyNTYgCisxNzIgNjMgMjYxIDk3IDEyMiAxOTQgMTc3IDU4IDI1MCAxMDAgMTMyIDEzMCAyMzMgMjkwIDg1IDI4OSAyNjUgMjg4IDExOCAzNyA2MCAKKzE4MyA5NCA2MCAxOTkgMTAyIDQ3IDI1MyAxMTAgNjggMTg2IDE1NiAxMjUgMjc0IDQzIDExNCAyNDMgMjQ0IDEyIDI2MyAxMiAyNDUgCisxNDEgMjY0IDE1OSAxMTcgMjY5IDExOCA1NSAyNDAgMTY0IDc2IDIwNyA4OSAxMDEgMjYxIDEzMSAxIDIzMiAyMTMgMTQzIDE2MSAzMiAKKzgzIDY1IDE0MiAzMiAzMSAyNDUgMTIzIDE0IDE3OCAxMzUgMTkyIDIyOCA1NiAyNiAyODYgMjU1IDQzIDYyIDExNCAyMjUgMzAzIDMxIAorMjgxIDI0NCA0NiAxNDIgNTAgMjgxIDI5NiAxMDUgOTEgNjggMjA0IDI3IDEwNiAyNTYgMTkwIDQgMjQyIDc5IDE5OSA4NCAxNzYgMjcyIAorMTI4IDMwMCAyOTYgMTU3IDIyMCAxNyAyMjIgMjU5IDIxNiAxODcgMjg1IDEyNiA0MiAyOTQgMjQyIDk3IDE0MCAxMzUgMTU4IDQwIDE4IAorMjk5IDIwMSAzNSAxMTEgMTgxIDE3OSA3IDI1MiAxNSAyNTUgNzcgMTEgODIgMjYxIDE0OSAyNTEgNjkgXgorNjU1IDAgMTkxIDI4NiA0OSA5NyAyOTMgMjUwIDI5IDE5MiA1NiAyOTggMjI1IDE0OSAxNDYgODYgODkgMTYgNzMgNzQgODYgMjAgNzYgMSAKKzE0MyAyMSA4OCAyNDYgMTk5IDI1NyAyMzAgMTI0IDI2NiAxMDQgMTE5IDE4MiAyMzkgMzA5IDE0IDIwIDcgNjEgNzEgMjYgMjMgMyA1OCAKKzgwIDMzIDIyIDMwMiAxMjQgMjQgNDQgMTkxIDExMyA1NyAyNDEgMTU1IDEzMyAxNDAgOTkgMzUgNiA1NCAxNDEgNDIgMjc2IDMwMSAxMTIgCisxNTQgNTIgMjY2IDM1IDE3OSAxMTAgMzA4IDE4MCA4MiAxOTAgMTQxIDE3NSAyODAgNjIgNDMgMjE5IDIzMSA5NiAxNDggMSAyMTIgMjcyIAorMTYwIDE3NyAyNjQgMTg5IDYwIDIzNyAxNTIgMjA2IDE0NyAxNjIgMjMgNzIgNjIgMTUyIDI3NSA4NyAyMzQgMjY1IDIwMSAyNDEgMjkzIAorNzcgMjg0IDI1IDIyOSAxODEgMjUgMTIwIDEyNSAxNjkgMjkzIDggMzMgMjY0IDI5OCA1MiA5MyAyOTAgMTIgMjgzIDE5MSA0NCA1MyAKKzE2OSAyMjQgNCAyNzIgMjIgMjMzIDEyMCAxNiAxMTMgMTI2IDE4MSAyMjcgNjQgMjY5IDMxIDE3NiAxODMgMjUxIDI0MyA3MCAyNTYgODUgCisxODYgMTM4IDE4NCAyMjMgNjEgMzEgMzggMTc1IDEwNyA2IDE4NyA4MSAxMTQgMjA3IDExOSA0NCAyOTUgMTY1IDE1MiA3MyAxNDMgOTAgCis5MiA3IDEzMCAxMSA5OCAyNjUgMTMyIDMwMSAyMjEgMTQ2IDIxOSA5MyA4OCA0IDEzOSAxOCAxNjEgMTg5IDE5OCAyNDUgMjk2IDY4IDMwIAorMjczIDMwNSA1MSA4MSA0NSAyNjcgNDcgNDkgMTY2IDIzMyAxMSAyNzEgMjU3IDI5OSA2NCAyNyAzNSAyNDggMTE0IDY5IDExMSAyMTEgCis1OCAyODIgMjg4IDE2NiAxNjQgNyAxOTkgMTUgMTcwIDE5NiAxOTcgMTY5IDUxIDEyIDQxIDE5NSAxMTYgMjk1IDIzNCA5MiAxNDUgNzQgCisxNTUgMjQgMTQ4IDI0MyAyMDggMjAwIDIyOSA0OCAyMSA0OCAxOTQgNDAgNTAgMTc4IDE2NyA2NyAxOTYgODggMTc3IDE5NSAxODUgMjk5IAorMzA2IDIzIDI3NCA2IDI5NiAxMzcgMzQgMzQgMjM2IDE4MCAxMyAxODYgNjkgMjQ0IDE1MSAxMzAgMjEzIDEwNiAzNCAzMDUgMTg0IDg1IAorMTE3IDE5OCAxMTIgMjkyIDMwNyA5OSAyMDggNjIgMjg1IDI3OSAxNTkgMTY1IDE5IDEzMyA3MSAxNTkgMjc0IDc1IDMwMCAyMDkgMjc2IAorMTYzIDEwNCAxMCAxMjYgNzIgMTcxIDIwOCAxMzEgMjI1IDQwIDkwIDIzMCAyNjIgMjc0IDI0OCA0NSA2NSAzOSAyODAgMzA0IDM5IDE0NyAKKzMwMCAyNzggMjE2IDIzNSAzNSA3NSA1OCAyMTMgMzcgOTQgMjMzIDI1MyAyNjcgMTg1IDU3IDMxMCA5NSAyMDUgNzEgMjI4IDI3OCAxNDcgCisyMzEgMjcgMTQ0IDMwNCAyODEgMjA3IDIyOCAzNiAxNTEgMzAzIDI2OSAyNzMgMTcyIDExMSA5IDExNCAxMzggMTE1IDI4MyA1MyAzNiAKKzIyMCAzMDcgMzAgMjA0IDMwMSA0MyAxNTAgMjkxIDI0IDIxNyAyNDcgMjgwIDEzMSA0NyAyOTEgMTYyIDE2MSA4MCAxNDIgMTQgMTU4IAorMjYyIDE0MSAyNDQgMjg0IDEzNCAyODUgMzcgMTYzIDIzNyAxNCAxOTggMyAzMDAgMTQwIDI3MiA5MSAxNzMgMTkyIDI1OCAyNDIgNTggCisxMSAyOSAyNjEgNjAgNTkgMTU2IDI3OCA3OCAyMjcgMjY2IDIxMyAxNzUgMzggNjYgMTE1IDE1MCA0OSAyOCAyODkgMTc4IDk4IDYzIAorMTI0IDE1NyA0OCAyNjMgNDQgMTIyIDEwOSAyOTYgMzEwIDI2IDIwMSA2MyAyOTcgMTQ5IDIxNSA5MCAxNjEgMTEgMjAyIDYgMjI3IDEzMyAKKzI3MyAxMDMgMTA3IDI0OCAxODMgOSAxODMgMTQyIDE4NyAyMTQgMTE4IDI3OSA1MCAxMDkgMTYzIDMwNiAyNjUgMjcwIDI0NSA1NCA4IAorMTAyIDIwNCA1OSAyOTQgMjIyIDIyMiA4OSAxNDkgNzcgMTQ2IDE3IDg1IDggMTQyIDI1NiAxNTQgMTkwIDIxMCAxMTUgNDEgMzA0IDEwOCAKKzE1MSA2MSAyMDkgMzQgMTAzIDE3NiAyNTIgMjU1IDQgMSAxMCAxNyAxNiA0IDcwIDE0IDg5IDI1OCA2OSAyIDE1NSAyMDIgMTQ0IDE3MSAKKzI3NyAxMzUgMjk3IDI4MiAyMTkgMTYyIDkyIDc2IDcwIDgzIDI5IDE5IDY3IDg3IDMyIDEwIDU3IDY4IDk5IDI3NyAyIDQ2IDIxMCAyODggCiszMyAxNjAgMjQ2IDI2OCAyNjEgMzAyIDU1IDg0IDM2IDI2MCA0OCAxMjUgMTAwIDI4OSAyNDcgMzggMTM1IDU1IDIyMiAyOTEgOTMgMjIxIAorOCAyMTEgMjYwIDIyNiAxMjEgMjggNDcgMTgyIDE3MCAzMDUgMjUzIDI1IDE4OSAxMjkgMjQxIDIyNCAxMzcgMjEyIDMwIDE2NCAyNDkgCisxOTUgMjU0IDIzOSA2NyAxOCAyOCAyNDkgMTI2IDMgMTY3IDEzNiAyMDAgMTYwIDEwOCAxMyAxMTcgNjUgMTcyIDIyMCA2NSAyODEgMjc2IAorMjMyIDEwOCA4MiA1NyAxMzcgMTAzIDM4IDMwOCAxMTEgNzggMTE4IDIxMCA0NiAzNyAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMjgxIDc0IAorMjg4IDI3NSAyMjAgMTc0IDI2IDEzMiA1OSAyMjUgMjE4IDE1MCAxNTggMjAgMTQ1IDUgMjE1IDI2MyAxMDAgXgorNjYxIDEgMTc2IDI2IDU5IDUyIDIyNCAyOTIgMjAgMjE0IDYgMjg1IDE5MiAyODIgNDYgMTA2IDIzNSAyNDkgMTQgMjU3IDMxMSAzMDkgCis4MiAyNzEgMTUgMzAxIDEzNiAyNjkgMTAwIDE3OCAyNTMgMTgyIDMwOCAzMTEgODQgMjYwIDcxIDI0MCAyMTAgMjAyIDE1NiAxMDQgMjEgCis1OSAxMjYgOTYgMzYgNyA0MyAxMzQgNDIgMzggMjM0IDE2NiA3OCAxMjkgMTQyIDEwMSAyMyA2MSA1NCAxNTIgMjg3IDIwIDI4OCAxOTAgCisyOSAxMTggMTExIDIzNSAyMzYgODEgMjAxIDczIDIyOSAyMDUgMjAyIDIzMCAzNyA3NyA0NiAyMDYgMjg1IDEwNSAxNjUgMzA3IDI1NCAKKzE0IDI0NCA2NiAyNTMgMTU2IDE5MSAxOTkgMTcxIDM5IDUgNDEgMjA2IDQ3IDM4IDIyMSAyMzMgMjIgMjAzIDEgMjI0IDIwNSAyMTUgCisxMDIgOTMgMyAxMjYgODMgMTAzIDI2MyA1NiA1NCAxNjUgMjIwIDc2IDIxNCAxOSAxNTcgMjQ4IDI2OSAxODcgMjk1IDUzIDk1IDIxNyA0IAorMjgzIDIwMyAyODcgMTA3IDkzIDMwMiAxOTMgMjcgMTE2IDEyMiAyNDAgMjM2IDcgMjY4IDE3IDI0MiAxMjUgMTMgMTAwIDE5MSAxMjUgCisyMzggMjk1IDc5IDI3MyAxNyAyMjkgMTkyIDI2OSAxNzQgNTAgMzA5IDE2OSAxMzcgMTI3IDE1MyA0NSAyMyA0OCAxMjEgOTYgNDkgMjUyIAorOTkgMTIxIDE4MyAxNjYgNTIgMTIgMzAgMTg4IDUzIDMwNyAxNjcgMTQ4IDEzMiAyMTQgMzIgOTAgMzA0IDE5NSAxNiAxNzIgMTIyIDI1MyAKKzE2OSA2MyAyNTUgOTcgMTE5IDE5NCAxNzEgNTIgMjUwIDk3IDEzMiAxMjcgMjI3IDI5MCA3OSAyODYgMjYyIDI4NSAxMTggMzcgNTEgCisxODAgOTQgNjAgMTk2IDk5IDQ3IDI1MCAxMTAgNjUgMTgzIDE1MyAxMTkgMjY4IDQzIDEwOCAyMzcgMjM4IDkgMjU3IDEyIDI0MiAxMzggCisyNTggMTU2IDExNyAyNjYgMTE1IDUyIDIzNyAxNjQgNzYgMjAxIDg2IDEwMSAyNjEgMTI4IDMxMCAyMjYgMjA3IDE0MyAxNTggMzIgNzcgCis1OSAxMzkgMjkgMzEgMjQ1IDEyMyAxMSAxNzIgMTM1IDE4NiAyMjUgNTAgMjMgMjg2IDI0OSA0MCA2MiAxMTEgMjIyIDMwMyAyNSAyNzUgCisyNDQgNDAgMTM2IDQ0IDI3OCAyOTAgMTA1IDkxIDYyIDE5OCAyNyAxMDMgMjUwIDE4NCAzMTAgMjM5IDc5IDE5OSA4NCAxNzMgMjY2IAorMTI4IDI5NyAyOTMgMTUxIDIxNyAxNyAyMTYgMjU5IDIxMyAxODcgMjgyIDEyMCAzOSAyOTEgMjM2IDk0IDEzNCAxMjkgMTU1IDM0IDE4IAorMjk5IDE5NSAyOSAxMDUgMTc4IDE3OSAzMTAgMjUyIDEyIDI1NSA3MSAyIDgyIDI1OCAxNDMgMjQ1IDIxMCAxODkgMjg0IDQ4IDk1IDI5MSAKKzI0OSAyNyAxOTAgNTUgMjk2IDIyMyAxNDggMTQ1IDg2IDg4IDE2IDcyIDcyIDg1IDE4IDc0IDE0MSAxOCA4NyAyNDUgMTk3IDI1NiAyMjggCisxMjIgMjY2IDEwMiAxMTkgMTgxIDIzOCAzMDggMTIgMTcgNCA1OCA2OSAyNiAyMCAyIDU2IDgwIDMxIDIwIDMwMSAxMjMgMjQgNDQgMTkxIAorMTEyIDU0IDIzOSAxNTMgMTMyIDE0MCA5OSAzNCA1IDU0IDEzOSA0MiAyNzYgMzAxIDExMCAxNTIgNDkgMjY1IDMyIDE3NyAxMDkgMzA3IAorMTgwIDgxIDE4OCAxNDAgMTczIDI3OSA2MSA0MSAyMTkgMjMxIDk0IDE0NyAxIDIxMSAyNzIgMTU5IDE3NiAyNjQgMTg3IDU3IDIzNyAKKzE1MSAyMDQgMTQ1IDE2MCAyMSA3MiA1OSAxNTIgMjc0IDg3IDIzMiAyNjQgMjAwIDI0MSAyOTMgNzcgMjg0IDIyIDIyOSAxNzkgMjQgCisxMTggMTI0IDE2OCAyOTIgNyAzMCAyNjIgMjk4IDUxIDkzIDI4OSA5IDI4MyAxOTAgNDIgNTEgMTY3IDIyMiA0IDI3MCAxOSAyMzEgMTIwIAorMTMgMTEzIDEyNCAxODEgMjI1IDYzIDI2OCAzMCAxNzUgMTgxIDI1MSAyNDEgNjggMjU1IDg0IDE4NiAxMzggMTg0IDIyMyA2MSAyOCAzNSAKKzE3NSAxMDcgNiAxODUgODEgMTE0IDIwNyAxMTcgNDEgMjkzIDE2NCAxNTAgNzMgMTQyIDg4IDkwIDUgMTI4IDExIDk4IDI2MyAxMzAgCisyOTkgMjIxIDE0NiAyMTcgOTEgODggMyAxMzkgMTYgMTU5IDE4OSAxOTcgMjQzIDI5NSA2NiAyOCAyNzMgMzAzIDUxIDgwIDQ0IDI2NSAKKzQ1IDQ5IDE2NSAyMzMgOSAyNzAgMjU3IDI5OCA2NCAyNiAzMyAyNDcgMTEyIDY3IDExMSAyMDkgNTggMjgxIDI4OCAxNjQgMTYzIDYgCisxOTggMTQgMTcwIDE5NCAxOTcgMTY5IDUwIDEwIDQxIDE5MyAxMTQgMjk0IDIzNCA5MiAxNDUgNzMgMTU1IDIxIDE0NiAyNDMgMjA4IAorMjAwIDIyOCA0OCAyMSA0NiAxOTMgNDAgNDkgMTc4IDE2NiA2NSAxOTYgODYgMTc1IDE5NCAxODQgMjk3IDMwNiAyMyAyNzMgNCAyOTYgCisxMzYgMzEgMzMgMjM0IDE3OSAxMSAxODUgNjggMjQyIDE1MSAxMzAgMjEyIDEwNCAzNCAzMDQgMTgyIDgzIDExNiAxOTYgMTEyIDI5MiAKKzMwNiA5NyAyMDYgNjAgMjgzIDI3NyAxNTkgMTYzIDE5IDEzMSA3MCAxNTcgMjc0IDc0IDI5OSAyMDggMjc0IDE2MSAxMDQgOCAxMjYgNzAgCisxNzAgMjA3IDEzMCAyMjUgMzcgOTAgMjMwIDE5NCBeCis2NDMgMCAyNjggMjQyIDM2IDYyIDM5IDI3NCAzMDEgMzYgMTQ3IDMwMCAyNzggMjE2IDIyOSAzNSA3NSA1NSAyMDcgMjggODggMjMwIAorMjQ3IDI2NyAxODUgNTEgMzA3IDk1IDIwMiA3MSAyMjUgMjc1IDE0NCAyMjggMTggMTQ0IDI5OCAyNzggMjAxIDIyOCAzMyAxNDUgMzAwIAorMjYzIDI3MCAxNzIgMTA1IDYgMTExIDEzNSAxMTIgMjc3IDQ0IDM2IDIxNyAzMDEgMjEgMjAxIDI5OCAzNCAxNDcgMjg1IDE4IDIxNCAKKzI0NCAyODAgMTMxIDM4IDI5MSAxNjIgMTYxIDc0IDE0MiAxNCAxNTUgMjU5IDE0MSAyNDEgMjc4IDEzMSAyODIgMzEgMTYwIDIzMSA1IAorMTk4IDMxMSAyOTQgMTM0IDI2OSA4NSAxNzMgMTkyIDI1MiAyMzkgNDkgOCAyNiAyNTggNTQgNTAgMTUwIDI3MiA3MiAyMjcgMjYwIDIxMyAKKzE3MiAzNSA2MCAxMDkgMTUwIDQzIDE5IDI4NiAxNzUgOTIgNjAgMTI0IDE1MSA0NSAyNjMgNDEgMTE5IDEwOSAyOTAgMzA0IDIzIDIwMSAKKzU0IDI5NCAxNDkgMjE1IDg3IDE1OCAyIDE5NiAzMTEgMjI0IDEzMyAyNjcgMTAwIDEwNCAyNDggMTgwIDkgMTgzIDEzNiAxODQgMjA4IAorMTE1IDI3OSA0NCAxMDYgMTYzIDMwMyAyNjUgMjcwIDI0MiA1MSA4IDk2IDIwNCA1NiAyOTQgMjE5IDIxNiA4OSAxNDMgNzEgMTQwIDE0IAorODUgMzEzIDEzOSAyNTYgMTU0IDE4NyAyMTAgMTE1IDM1IDMwNCAxMDggMTQ4IDU4IDIwOSAyOCAxMDMgMTc2IDI0OSAyNTIgMzA5IDMwOSAKKzEwIDExIDEzIDMxMiA2NyAxMSA4MyAyNTggNjkgMzEwIDE1MiAyMDIgMTQxIDE3MSAyNzcgMTI5IDI5NyAyNzYgMjE2IDE1OSA4OSA3MyAKKzcwIDgzIDI5IDE2IDY3IDgxIDI5IDEgNTQgNjUgOTYgMjc0IDIgMzcgMjA0IDI4NSAzMyAxNjAgMjQ2IDI2NSAyNTUgMjk2IDQ5IDc4IAorMjcgMjYwIDM5IDExOSA5NCAyODkgMjQ3IDM4IDEzMiA1NSAyMjIgMjg4IDkwIDIxNSAyIDIxMSAyNTcgMjI2IDExOCAyMiA0NCAxNzYgCisxNjQgMzA1IDI1MCAyNSAxODYgMTIzIDIzOCAyMjEgMTMxIDIxMiAzMCAxNTggMjQ2IDE5NSAyNTQgMjM5IDY0IDkgMjggMjQzIDEyMyAKKzMwOCAxNjcgMTMzIDE5NyAxNTQgMTAyIDQgMTExIDY1IDE2NiAyMjAgNTkgMjgxIDI3MyAyMjkgMTA1IDc2IDU3IDEzNyA5NyAzMiAzMDIgCisxMDggNzggMTEyIDIwNyA0MyAzNCAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMjc1IDc0IDI4MiAyNzUgMjE0IDE3NCAyMCAxMjkgNTMgMjIyIAorMjE4IDE0NCAxNTggMTcgMTQyIDMxMyAyMDkgMjU3IDIxMSAxNzIgMjAgNTkgNTIgMjIwIDI4OCAyMCAyMTQgMjgxIDE4OCAyODIgNDYgCisxMDYgMjMzIDI0OSA4IDI1NSAzMTEgMzA5IDgwIDI3MSAxNSAyOTcgMTM2IDI2OSAxMDAgMTc0IDI0OSAxODIgMzA4IDMwNyA4MCAyNTYgCis2OSAyNDAgMjA2IDIwMCAxNTYgMTAyIDE5IDU3IDEyMiA5NiAzMCAzIDM5IDEzNCA0MCAzMiAyMzIgMTYyIDc2IDEyNyAxMzggOTkgMTcgCis1NyA1MiAxNTAgMjg3IDE4IDI4NCAxOTAgMjMgMTE2IDEwNyAyMzUgMjM0IDc3IDE5OSA2OSAyMjUgMjA1IDE5OCAyMjYgMzMgNzUgNDAgCisyMDYgMjg1IDEwMyAxNjEgMzAzIDI1MCAxMCAyNDAgNjYgMjUzIDE1MiAxODcgMTk1IDE2OSAzMyA1IDM5IDIwNCA0MSAzNCAyMTcgMjMxIAorMjAgMTk5IDMxMyAyMjQgMjAzIDIxMyAxMDIgODkgMyAxMjQgODEgOTkgMjYxIDU2IDUwIDE2NSAyMTggNzQgMjEyIDE1IDE1NyAyNDQgCisyNjUgMTg1IDI5NSA0NyA5MyAyMTcgMiAyODEgMjAzIDI4MyAxMDMgOTEgMzAyIDE5MyAyNSAxMTYgMTIyIDIzNiAyMzYgNyAyNjggMTMgCisyNDIgMTIxIDkgOTggMTg5IDEyNSAyMzggMjkxIDc3IDI2OSAxNSAyMjcgMTkwIDI2NyAxNzAgNTAgMzA1IDE2NSAxMzMgMTI3IDE1MyAKKzQ1IDE5IDQyIDEyMSA5NCA0NSAyNDggOTUgMTE3IDE3OSAxNjYgNDYgNiAyNiAxODggNTMgMzA3IDE2NSAxNDggMTI4IDIxMCAzMCA4OCAKKzMwMCAxOTMgMTAgMTcwIDEyMCAyNTEgMTY3IDYzIDI1MSA5NyAxMTcgMTk0IDE2NyA0OCAyNTAgOTUgMTMyIDEyNSAyMjMgMjkwIDc1IAorMjg0IDI2MCAyODMgMTE4IDM3IDQ1IDE3OCA5NCA2MCAxOTQgOTcgNDcgMjQ4IDExMCA2MyAxODEgMTUxIDExNSAyNjQgNDMgMTA0IDIzMyAKKzIzNCA3IDI1MyAxMiAyNDAgMTM2IDI1NCAxNTQgMTE3IDI2NCAxMTMgNTAgMjM1IDE2NCA3NiAxOTcgODQgMTAxIDI2MSAxMjYgMzEwIAorMjIyIDIwMyAxNDMgMTU2IDMyIDczIDU1IDEzNyAyNyAzMSAyNDUgMTIzIDkgMTY4IDEzNSAxODIgMjIzIDQ2IDIxIDI4NiAyNDUgMzggCis2MiAxMDkgMjIwIDMwMyAyMSAyNzEgMjQ0IDM2IDEzMiA0MCAyNzYgMjg2IDEwNSA5MSA1OCAxOTQgMjcgMTAxIDI0NiAxODAgMzA4IAorMjM3IDc5IDE5OSA4NCAxNzEgMjYyIDEyOCAyOTUgMjkxIDE0NyAyMTUgMTcgMjEyIDI1OSAyMTkgXgorNjUyIDEgMTg3IDI3OCAxMTIgMzUgMjg3IDIyOCA5MCAxMjYgMTIxIDE1MSAyNiAxOCAyOTkgMTg3IDIxIDk3IDE3NCAxNzkgMzAyIDI1MiAKKzggMjU1IDYzIDMwNiA4MiAyNTQgMTM1IDIzNyAyMDYgMTgxIDI3NiA0NCA4NyAyODMgMjQ1IDE5IDE4MiA1MSAyODggMjE1IDE0NCAxNDEgCis4NiA4NCAxNiA2OCA2NCA4MSAxMCA2NiAzMTIgMTMzIDYgODMgMjQxIDE4OSAyNTIgMjIwIDExNCAyNjYgOTQgMTE5IDE3NyAyMzQgMzA0IAorNCA1IDMwOCA0NiA2MSAyNiA4IDMxNCA0OCA4MCAyMyAxMiAyOTcgMTE5IDI0IDQ0IDE5MSAxMDggNDIgMjMxIDE0NSAxMjggMTQwIDk5IAorMzAgMSA1NCAxMzEgNDIgMjc2IDMwMSAxMDIgMTQ0IDM3IDI2MSAyMCAxNjkgMTA1IDMwMyAxODAgNzcgMTgwIDEzNiAxNjUgMjc1IDU3IAorMzMgMjE5IDIzMSA4NiAxNDMgMSAyMDcgMjcyIDE1NSAxNzIgMjY0IDE3OSA0NSAyMzcgMTQ3IDE5NiAxMzcgMTUyIDEzIDcyIDQ3IDE1MiAKKzI3MCA4NyAyMjQgMjYwIDE5NiAyNDEgMjkzIDc3IDI4NCAxMCAyMjkgMTcxIDIwIDExMCAxMjAgMTY0IDI4OCAzIDE4IDI1NCAyOTggNDcgCis5MyAyODUgMzEzIDI4MyAxODYgMzQgNDMgMTU5IDIxNCA0IDI2MiA3IDIyMyAxMjAgMSAxMTMgMTE2IDE4MSAyMTcgNTkgMjY0IDI2IAorMTcxIDE3MyAyNTEgMjMzIDYwIDI1MSA4MCAxODYgMTM4IDE4NCAyMjMgNjEgMTYgMjMgMTc1IDEwNyA2IDE3NyA4MSAxMTQgMjA3IDEwOSAKKzI5IDI4NSAxNjAgMTQyIDczIDEzOCA4MCA4MiAzMTMgMTIwIDExIDk4IDI1NSAxMjIgMjkxIDIyMSAxNDYgMjA5IDgzIDg4IDMxNSAxMzkgCis4IDE1MSAxODkgMTkzIDIzNSAyOTEgNTggMjAgMjczIDI5NSA1MSA3NiA0MCAyNTcgMzcgNDkgMTYxIDIzMyAxIDI2NiAyNTcgMjk0IDY0IAorMjIgMjUgMjQzIDEwNCA1OSAxMTEgMjAxIDU4IDI3NyAyODggMTU2IDE1OSAyIDE5NCAxMCAxNzAgMTg2IDE5NyAxNjkgNDYgMiA0MSAKKzE4NSAxMDYgMjkwIDIzNCA5MiAxNDUgNjkgMTU1IDkgMTM4IDI0MyAyMDggMjAwIDIyNCA0OCAyMSAzOCAxODkgNDAgNDUgMTc4IDE2MiAKKzU3IDE5NiA3OCAxNjcgMTkwIDE4MCAyODkgMzA2IDIzIDI2OSAzMTIgMjk2IDEzMiAxOSAyOSAyMjYgMTc1IDMgMTgxIDY0IDIzNCAxNTEgCisxMzAgMjA4IDk2IDM0IDMwMCAxNzQgNzUgMTEyIDE4OCAxMTIgMjkyIDMwMiA4OSAxOTggNTIgMjc1IDI2OSAxNTkgMTU1IDE5IDEyMyAKKzY2IDE0OSAyNzQgNzAgMjk1IDIwNCAyNjYgMTUzIDEwNCAxMjYgNjIgMTY2IDIwMyAxMjYgMjI1IDI1IDkwIDIzMCAyNjIgMjY0IDIzOCAKKzMwIDYwIDM5IDI3MCAyOTkgMzQgMTQ3IDMwMCAyNzggMjE2IDIyNSAzNSA3NSA1MyAyMDMgMjIgODQgMjI4IDI0MyAyNjcgMTg1IDQ3IAorMzA1IDk1IDIwMCA3MSAyMjMgMjczIDE0MiAyMjYgMTIgMTQ0IDI5NCAyNzYgMTk3IDIyOCAzMSAxNDEgMjk4IDI1OSAyNjggMTcyIDEwMSAKKzQgMTA5IDEzMyAxMTAgMjczIDM4IDM2IDIxNSAyOTcgMTUgMTk5IDI5NiAyOCAxNDUgMjgxIDE0IDIxMiAyNDIgMjgwIDEzMSAzMiAyOTEgCisxNjIgMTYxIDcwIDE0MiAxNCAxNTMgMjU3IDE0MSAyMzkgMjc0IDEyOSAyODAgMjcgMTU4IDIyNyAzMTUgMTk4IDMwOSAyOTAgMTMwIAorMjY3IDgxIDE3MyAxOTIgMjQ4IDIzNyA0MyA2IDI0IDI1NiA1MCA0NCAxNDYgMjY4IDY4IDIyNyAyNTYgMjEzIDE3MCAzMyA1NiAxMDUgCisxNTAgMzkgMTMgMjg0IDE3MyA4OCA1OCAxMjQgMTQ3IDQzIDI2MyAzOSAxMTcgMTA5IDI4NiAzMDAgMjEgMjAxIDQ4IDI5MiAxNDkgMjE1IAorODUgMTU2IDMxMiAxOTIgMzA3IDIyMiAxMzMgMjYzIDk4IDEwMiAyNDggMTc4IDkgMTgzIDEzMiAxODIgMjA0IDExMyAyNzkgNDAgMTA0IAorMTYzIDMwMSAyNjUgMjcwIDI0MCA0OSA4IDkyIDIwNCA1NCAyOTQgMjE3IDIxMiA4OSAxMzkgNjcgMTM2IDEyIDg1IDMwOSAxMzcgMjU2IAorMTU0IDE4NSAyMTAgMTE1IDMxIDMwNCAxMDggMTQ2IDU2IDIwOSAyNCAxMDMgMTc2IDI0NyAyNTAgMzA1IDMwNyAxMCA3IDExIDMxMCA2NSAKKzkgNzkgMjU4IDY5IDMwOCAxNTAgMjAyIDEzOSAxNzEgMjc3IDEyNSAyOTcgMjcyIDIxNCAxNTcgODcgNzEgNzAgODMgMjkgMTQgNjcgNzcgCisyNyAzMTEgNTIgNjMgOTQgMjcyIDIgMzEgMjAwIDI4MyAzMyAxNjAgMjQ2IDI2MyAyNTEgMjkyIDQ1IDc0IDIxIDI2MCAzMyAxMTUgOTAgCisyODkgMjQ3IDM4IDEzMCA1NSAyMjIgMjg2IDg4IDIxMSAzMTQgMjExIDI1NSAyMjYgMTE2IDE4IDQyIDE3MiAxNjAgMzA1IDI0OCAyNSAKKzE4NCAxMTkgMjM2IDIxOSAxMjcgMjEyIDMwIDE1NCAyNDQgMTk1IDI1NCAyMzkgNjIgMyAyOCAyMzkgMTIxIDMwNCAxNjcgMTMxIDE5NSAKKzE1MCA5OCAzMTQgMTA3IDY1IDE2MiAyMjAgNTUgMjgxIDI3MSAyMjcgMTAzIDcyIDU3IDEzNyA5MyAyOCAzMDggXgorNjcwIDAgMTA1IDc4IDEwNiAyMDQgNDAgMzEgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDI2OSA3NCAyNzYgMjc1IDIwOCAxNzQgMTQgMTI2IAorNDcgMjE5IDIxOCAxMzggMTU4IDE0IDEzOSAzMTAgMjAzIDI1MSAyMDUgMTY2IDExIDU5IDUyIDIxNCAyODIgMjAgMjE0IDMwOCAyNzUgCisxODIgMjgyIDQ2IDEwNiAyMzAgMjQ5IDMxNiAyNTIgMzExIDMwOSA3NyAyNzEgMTUgMjkxIDEzNiAyNjkgMTAwIDE2OCAyNDMgMTgyIAorMzA4IDMwMSA3NCAyNTAgNjYgMjQwIDIwMCAxOTcgMTU2IDk5IDE2IDU0IDExNiA5NiAyMSAzMTQgMzMgMTM0IDM3IDIzIDIyOSAxNTYgCis3MyAxMjQgMTMyIDk2IDggNTEgNDkgMTQ3IDI4NyAxNSAyNzggMTkwIDE0IDExMyAxMDEgMjM1IDIzMSA3MSAxOTYgNjMgMjE5IDIwNSAKKzE5MiAyMjAgMjcgNzIgMzEgMjA2IDI4NSAxMDAgMTU1IDI5NyAyNDQgNCAyMzQgNjYgMjUzIDE0NiAxODEgMTg5IDE2NiAyNCA1IDM2IAorMjAxIDMyIDI4IDIxMSAyMjggMTcgMTkzIDMxMyAyMjQgMjAwIDIxMCAxMDIgODMgMyAxMjEgNzggOTMgMjU4IDU2IDQ0IDE2NSAyMTUgCis3MSAyMDkgOSAxNTcgMjM4IDI1OSAxODIgMjk1IDM4IDkwIDIxNyAzMTYgMjc4IDIwMyAyNzcgOTcgODggMzAyIDE5MyAyMiAxMTYgMTIyIAorMjMwIDIzNiA3IDI2OCA3IDI0MiAxMTUgMyA5NSAxODYgMTI1IDIzOCAyODUgNzQgMjYzIDEyIDIyNCAxODcgMjY0IDE2NCA1MCAyOTkgCisxNTkgMTI3IDEyNyAxNTMgNDUgMTMgMzMgMTIxIDkxIDM5IDI0MiA4OSAxMTEgMTczIDE2NiAzNyAzMTQgMjAgMTg4IDUzIDMwNyAxNjIgCisxNDggMTIyIDIwNCAyNyA4NSAyOTQgMTkwIDEgMTY3IDExNyAyNDggMTY0IDYzIDI0NSA5NyAxMTQgMTk0IDE2MSA0MiAyNTAgOTIgMTMyIAorMTIyIDIxNyAyOTAgNjkgMjgxIDI1NyAyODAgMTE4IDM3IDM2IDE3NSA5NCA2MCAxOTEgOTQgNDcgMjQ1IDExMCA2MCAxNzggMTQ4IDEwOSAKKzI1OCA0MyA5OCAyMjcgMjI4IDQgMjQ3IDEyIDIzNyAxMzMgMjQ4IDE1MSAxMTcgMjYxIDExMCA0NyAyMzIgMTY0IDc2IDE5MSA4MSAxMDEgCisyNjEgMTIzIDMxMCAyMTYgMTk3IDE0MyAxNTMgMzIgNjcgNDkgMTM0IDI0IDMxIDI0NSAxMjMgNiAxNjIgMTM1IDE3NiAyMjAgNDAgMTggCisyODYgMjM5IDM1IDYyIDEwNiAyMTcgMzAzIDE1IDI2NSAyNDQgMzAgMTI2IDM0IDI3MyAyODAgMTA1IDkxIDUyIDE4OCAyNyA5OCAyNDAgCisxNzQgMzA1IDIzNCA3OSAxOTkgODQgMTY4IDI1NiAxMjggMjkyIDI4OCAxNDEgMjEyIDE3IDIwNiAyNTkgMjA4IDE4NyAyNzcgMTEwIDM0IAorMjg2IDIyNiA4OSAxMjQgMTE5IDE1MCAyNCAxOCAyOTkgMTg1IDE5IDk1IDE3MyAxNzkgMzAwIDI1MiA3IDI1NSA2MSAzMDQgODIgMjUzIAorMTMzIDIzNSAyMDUgMTc5IDI3NCA0MyA4NSAyODEgMjQ0IDE3IDE4MCA1MCAyODYgMjEzIDE0MyAxNDAgODYgODMgMTYgNjcgNjIgODAgOCAKKzY0IDMxMiAxMzEgMyA4MiAyNDAgMTg3IDI1MSAyMTggMTEyIDI2NiA5MiAxMTkgMTc2IDIzMyAzMDMgMiAyIDMwNiA0MyA1OSAyNiA1IAorMzE0IDQ2IDgwIDIxIDEwIDI5NiAxMTggMjQgNDQgMTkxIDEwNyAzOSAyMjkgMTQzIDEyNyAxNDAgOTkgMjkgNTQgMTI5IDQyIDI3NiAKKzMwMSAxMDAgMTQyIDM0IDI2MCAxNyAxNjcgMTA0IDMwMiAxODAgNzYgMTc4IDEzNSAxNjMgMjc0IDU2IDMxIDIxOSAyMzEgODQgMTQyIDEgCisyMDYgMjcyIDE1NCAxNzEgMjY0IDE3NyA0MiAyMzcgMTQ2IDE5NCAxMzUgMTUwIDExIDcyIDQ0IDE1MiAyNjkgODcgMjIyIDI1OSAxOTUgCisyNDEgMjkzIDc3IDI4NCA3IDIyOSAxNjkgMTkgMTA4IDExOSAxNjMgMjg3IDIgMTUgMjUyIDI5OCA0NiA5MyAyODQgMzExIDI4MyAxODUgCiszMiA0MSAxNTcgMjEyIDQgMjYwIDQgMjIxIDEyMCAzMTUgMTEzIDExNCAxODEgMjE1IDU4IDI2MyAyNSAxNzAgMTcxIDI1MSAyMzEgNTggCisyNTAgNzkgMTg2IDEzOCAxODQgMjIzIDYxIDEzIDIwIDE3NSAxMDcgNiAxNzUgODEgMTE0IDIwNyAxMDcgMjYgMjgzIDE1OSAxNDAgNzMgCisxMzcgNzggODAgMzEyIDExOCAxMSA5OCAyNTMgMTIwIDI4OSAyMjEgMTQ2IDIwNyA4MSA4OCAzMTUgMTM5IDYgMTQ5IDE4OSAxOTIgMjMzIAorMjkwIDU2IDE4IDI3MyAyOTMgNTEgNzUgMzkgMjU1IDM1IDQ5IDE2MCAyMzMgMzE2IDI2NSAyNTcgMjkzIDY0IDIxIDIzIDI0MiAxMDIgCis1NyAxMTEgMTk5IDU4IDI3NiAyODggMTU0IDE1OCAxIDE5MyA5IDE3MCAxODQgMTk3IDE2OSA0NSA0MSAxODMgMTA0IDI4OSAyMzQgOTIgCisxNDUgNjggMTU1IDYgMTM2IDI0MyAyMDggMjAwIDIyMyA0OCAyMSAzNiAxODggNDAgNDQgMTc4IDE2MSA1NSAxOTYgNzYgMTY1IDE4OSAKKzE3OSAyODcgMzA2IDIzIDI2OCAzMTEgMjk2IDEzMSAxNiAyOCAyMjQgMTc0IDEgMTgwIDYzIDIzMiAxNTEgMTMwIDIwNyA5NCAzNCAyOTkgCisxNzIgNzMgMTExIDE4NiAxMTIgMjkyIDMwMSA4NyAxOTYgNTAgMjczIDI2NyAxNTkgMTUzIDIzNSBeCis2NTggMSAxMTcgNjMgMTQzIDI3NCA2NyAyOTIgMjAxIDI2MCAxNDcgMTA0IDMxMyAxMjYgNTYgMTYzIDIwMCAxMjMgMjI1IDE2IDkwIAorMjMwIDI2MiAyNTggMjMyIDIxIDU3IDM5IDI2NCAyOTYgMzEgMTQ3IDMwMCAyNzggMjE2IDIxOSAzNSA3NSA1MCAxOTcgMTMgNzggMjI1IAorMjM3IDI2NyAxODUgNDEgMzAyIDk1IDE5NyA3MSAyMjAgMjcwIDEzOSAyMjMgMyAxNDQgMjg4IDI3MyAxOTEgMjI4IDI4IDEzNSAyOTUgCisyNTMgMjY1IDE3MiA5NSAxIDEwNiAxMzAgMTA3IDI2NyAyOSAzNiAyMTIgMjkxIDYgMTk2IDI5MyAxOSAxNDIgMjc1IDggMjA5IDIzOSAKKzI4MCAxMzEgMjMgMjkxIDE2MiAxNjEgNjQgMTQyIDE0IDE1MCAyNTQgMTQxIDIzNiAyNjggMTI2IDI3NyAyMSAxNTUgMjIxIDMwOSAxOTggCiszMDYgMjg0IDEyNCAyNjQgNzUgMTczIDE5MiAyNDIgMjM0IDM0IDMgMjEgMjUzIDQ0IDM1IDE0MCAyNjIgNjIgMjI3IDI1MCAyMTMgMTY3IAorMzAgNTAgOTkgMTUwIDMzIDQgMjgxIDE3MCA4MiA1NSAxMjQgMTQxIDQwIDI2MyAzNiAxMTQgMTA5IDI4MCAyOTQgMTggMjAxIDM5IDI4OSAKKzE0OSAyMTUgODIgMTUzIDMwNiAxODYgMzAxIDIxOSAxMzMgMjU3IDk1IDk5IDI0OCAxNzUgOSAxODMgMTI2IDE3OSAxOTggMTEwIDI3OSAKKzM0IDEwMSAxNjMgMjk4IDI2NSAyNzAgMjM3IDQ2IDggODYgMjA0IDUxIDI5NCAyMTQgMjA2IDg5IDEzMyA2MSAxMzAgOSA4NSAzMDMgCisxMzQgMjU2IDE1NCAxODIgMjEwIDExNSAyNSAzMDQgMTA4IDE0MyA1MyAyMDkgMTggMTAzIDE3NiAyNDQgMjQ3IDI5OSAzMDQgMTAgMSA4IAorMzA3IDYyIDYgNzMgMjU4IDY5IDMwNSAxNDcgMjAyIDEzNiAxNzEgMjc3IDExOSAyOTcgMjY2IDIxMSAxNTQgODQgNjggNzAgODMgMjkgCisxMSA2NyA3MSAyNCAzMDUgNDkgNjAgOTEgMjY5IDIgMjIgMTk0IDI4MCAzMyAxNjAgMjQ2IDI2MCAyNDUgMjg2IDM5IDY4IDEyIDI2MCAKKzI0IDEwOSA4NCAyODkgMjQ3IDM4IDEyNyA1NSAyMjIgMjgzIDg1IDIwNSAzMTEgMjExIDI1MiAyMjYgMTEzIDEyIDM5IDE2NiAxNTQgCiszMDUgMjQ1IDI1IDE4MSAxMTMgMjMzIDIxNiAxMjEgMjEyIDMwIDE0OCAyNDEgMTk1IDI1NCAyMzkgNTkgMzEzIDI4IDIzMyAxMTggMjk4IAorMTY3IDEyOCAxOTIgMTQ0IDkyIDMwOCAxMDEgNjUgMTU2IDIyMCA0OSAyODEgMjY4IDIyNCAxMDAgNjYgNTcgMTM3IDg3IDIyIDI5MiAKKzEwMyA3OCAxMDIgMjAyIDM4IDI5IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAyNjUgNzQgMjcyIDI3NSAyMDQgMTc0IDEwIDEyNCA0MyAyMTcgCisyMTggMTM0IDE1OCAxMiAxMzcgMzA4IDE5OSAyNDcgMjAxIDE2MiA1IDU5IDUyIDIxMCAyNzggMjAgMjE0IDMwNCAyNzEgMTc4IDI4MiAKKzQ2IDEwNiAyMjggMjQ5IDMxMiAyNTAgMzExIDMwOSA3NSAyNzEgMTUgMjg3IDEzNiAyNjkgMTAwIDE2NCAyMzkgMTgyIDMwOCAyOTcgNzAgCisyNDYgNjQgMjQwIDE5NiAxOTUgMTU2IDk3IDE0IDUyIDExMiA5NiAxNSAzMTIgMjkgMTM0IDM1IDE3IDIyNyAxNTIgNzEgMTIyIDEyOCAKKzk0IDIgNDcgNDcgMTQ1IDI4NyAxMyAyNzQgMTkwIDggMTExIDk3IDIzNSAyMjkgNjcgMTk0IDU5IDIxNSAyMDUgMTg4IDIxNiAyMyA3MCAKKzI1IDIwNiAyODUgOTggMTUxIDI5MyAyNDAgMjMwIDY2IDI1MyAxNDIgMTc3IDE4NSAxNjQgMTggNSAzNCAxOTkgMjYgMjQgMjA3IDIyNiAKKzE1IDE4OSAzMTMgMjI0IDE5OCAyMDggMTAyIDc5IDMgMTE5IDc2IDg5IDI1NiA1NiA0MCAxNjUgMjEzIDY5IDIwNyA1IDE1NyAyMzQgCisyNTUgMTgwIDI5NSAzMiA4OCAyMTcgMzE2IDI3NiAyMDMgMjczIDkzIDg2IDMwMiAxOTMgMjAgMTE2IDEyMiAyMjYgMjM2IDcgMjY4IDMgCisyNDIgMTExIDMxOCA5MyAxODQgMTI1IDIzOCAyODEgNzIgMjU5IDEwIDIyMiAxODUgMjYyIDE2MCA1MCAyOTUgMTU1IDEyMyAxMjcgMTUzIAorNDUgOSAyNyAxMjEgODkgMzUgMjM4IDg1IDEwNyAxNjkgMTY2IDMxIDMxMCAxNiAxODggNTMgMzA3IDE2MCAxNDggMTE4IDIwMCAyNSA4MyAKKzI5MCAxODggMzE0IDE2NSAxMTUgMjQ2IDE2MiA2MyAyNDEgOTcgMTEyIDE5NCAxNTcgMzggMjUwIDkwIDEzMiAxMjAgMjEzIDI5MCA2NSAKKzI3OSAyNTUgMjc4IDExOCAzNyAzMCAxNzMgOTQgNjAgMTg5IDkyIDQ3IDI0MyAxMTAgNTggMTc2IDE0NiAxMDUgMjU0IDQzIDk0IDIyMyAKKzIyNCAyIDI0MyAxMiAyMzUgMTMxIDI0NCAxNDkgMTE3IDI1OSAxMDggNDUgMjMwIDE2NCA3NiAxODcgNzkgMTAxIDI2MSAxMjEgMzEwIAorMjEyIDE5MyAxNDMgMTUxIDMyIDYzIDQ1IDEzMiAyMiAzMSAyNDUgMTIzIDQgMTU4IDEzNSAxNzIgMjE4IDM2IDE2IDI4NiAyMzUgMzMgCis2MiAxMDQgMjE1IDMwMyAxMSAyNjEgMjQ0IDI2IDEyMiAzMCAyNzEgMjc2IDEwNSA5MSA0OCAxODQgMjcgOTYgMjM2IDE3MCAzMDMgMjMyIAorNzkgMTk5IDg0IDE2NiAyNTIgMTI4IDI5MCAyODMgXgorNjQ5IDEgMTMzIDIwOCAxNyAxOTggMjU5IDIwNCAxODcgMjczIDEwMiAzMCAyODIgMjE4IDg1IDExNiAxMTEgMTQ2IDE2IDE4IDI5OSAKKzE3NyAxMSA4NyAxNjkgMTc5IDI5MiAyNTIgMyAyNTUgNTMgMjk2IDgyIDI0OSAxMjUgMjI3IDIwMSAxNzEgMjY2IDM5IDc3IDI3MyAyNDAgCis5IDE3MiA0NiAyNzggMjA1IDEzOSAxMzYgODYgNzkgMTYgNjMgNTQgNzYgNTYgMzEyIDEyMyAzMTIgNzggMjM2IDE3OSAyNDcgMjEwIAorMTA0IDI2NiA4NCAxMTkgMTcyIDIyOSAyOTkgMzE1IDMxMSAyOTggMzEgNTEgMjYgMzE0IDMxNCAzOCA4MCAxMyAyIDI5MiAxMTQgMjQgCis0NCAxOTEgMTAzIDI3IDIyMSAxMzUgMTIzIDE0MCA5OSAyNSAzMTcgNTQgMTIxIDQyIDI3NiAzMDEgOTIgMTM0IDIyIDI1NiA1IDE1OSAKKzEwMCAyOTggMTgwIDcyIDE3MCAxMzEgMTU1IDI3MCA1MiAyMyAyMTkgMjMxIDc2IDEzOCAxIDIwMiAyNzIgMTUwIDE2NyAyNjQgMTY5IAorMzAgMjM3IDE0MiAxODYgMTI3IDE0MiAzIDcyIDMyIDE1MiAyNjUgODcgMjE0IDI1NSAxOTEgMjQxIDI5MyA3NyAyODQgMzE2IDIyOSAKKzE2MSAxNSAxMDAgMTE1IDE1OSAyODMgMzE5IDMgMjQ0IDI5OCA0MiA5MyAyODAgMzAzIDI4MyAxODEgMjQgMzMgMTQ5IDIwNCA0IDI1MiAKKzMxMyAyMTMgMTIwIDMwNyAxMTMgMTA2IDE4MSAyMDcgNTQgMjU5IDIxIDE2NiAxNjMgMjUxIDIyMyA1MCAyNDYgNzUgMTg2IDEzOCAxODQgCisyMjMgNjEgMSA4IDE3NSAxMDcgNiAxNjcgODEgMTE0IDIwNyA5OSAxNCAyNzUgMTU1IDEzMiA3MyAxMzMgNzAgNzIgMzA4IDExMCAxMSAKKzk4IDI0NSAxMTIgMjgxIDIyMSAxNDYgMTk5IDczIDg4IDMxNSAxMzkgMzE5IDE0MSAxODkgMTg4IDIyNSAyODYgNDggMTAgMjczIDI4NSAKKzUxIDcxIDM1IDI0NyAyNyA0OSAxNTYgMjMzIDMxMiAyNjEgMjU3IDI4OSA2NCAxNyAxNSAyMzggOTQgNDkgMTExIDE5MSA1OCAyNzIgCisyODggMTQ2IDE1NCAzMTggMTg5IDUgMTcwIDE3NiAxOTcgMTY5IDQxIDMxMyA0MSAxNzUgOTYgMjg1IDIzNCA5MiAxNDUgNjQgMTU1IAorMzE1IDEyOCAyNDMgMjA4IDIwMCAyMTkgNDggMjEgMjggMTg0IDQwIDQwIDE3OCAxNTcgNDcgMTk2IDY4IDE1NyAxODUgMTc1IDI3OSAKKzMwNiAyMyAyNjQgMzA3IDI5NiAxMjcgNCAyNCAyMTYgMTcwIDMxNCAxNzYgNTkgMjI0IDE1MSAxMzAgMjAzIDg2IDM0IDI5NSAxNjQgNjUgCisxMDcgMTc4IDExMiAyOTIgMjk3IDc5IDE4OCA0MiAyNjUgMjU5IDE1OSAxNDUgMTkgMTEzIDYxIDEzOSAyNzQgNjUgMjkwIDE5OSAyNTYgCisxNDMgMTA0IDMxMSAxMjYgNTIgMTYxIDE5OCAxMjEgMjI1IDEwIDkwIDIzMCAyNjIgMjU0IDIyOCAxNSA1NSAzOSAyNjAgMjk0IDI5IAorMTQ3IDMwMCAyNzggMjE2IDIxNSAzNSA3NSA0OCAxOTMgNyA3NCAyMjMgMjMzIDI2NyAxODUgMzcgMzAwIDk1IDE5NSA3MSAyMTggMjY4IAorMTM3IDIyMSAzMTggMTQ0IDI4NCAyNzEgMTg3IDIyOCAyNiAxMzEgMjkzIDI0OSAyNjMgMTcyIDkxIDMyMCAxMDQgMTI4IDEwNSAyNjMgCisyMyAzNiAyMTAgMjg3IDE5NCAyOTEgMTMgMTQwIDI3MSA0IDIwNyAyMzcgMjgwIDEzMSAxNyAyOTEgMTYyIDE2MSA2MCAxNDIgMTQgMTQ4IAorMjUyIDE0MSAyMzQgMjY0IDEyNCAyNzUgMTcgMTUzIDIxNyAzMDUgMTk4IDMwNCAyODAgMTIwIDI2MiA3MSAxNzMgMTkyIDIzOCAyMzIgCisyOCAxIDE5IDI1MSA0MCAyOSAxMzYgMjU4IDU4IDIyNyAyNDYgMjEzIDE2NSAyOCA0NiA5NSAxNTAgMjkgMzE5IDI3OSAxNjggNzggNTMgCisxMjQgMTM3IDM4IDI2MyAzNCAxMTIgMTA5IDI3NiAyOTAgMTYgMjAxIDMzIDI4NyAxNDkgMjE1IDgwIDE1MSAzMDIgMTgyIDI5NyAyMTcgCisxMzMgMjUzIDkzIDk3IDI0OCAxNzMgOSAxODMgMTIyIDE3NyAxOTQgMTA4IDI3OSAzMCA5OSAxNjMgMjk2IDI2NSAyNzAgMjM1IDQ0IDggCis4MiAyMDQgNDkgMjk0IDIxMiAyMDIgODkgMTI5IDU3IDEyNiA3IDg1IDI5OSAxMzIgMjU2IDE1NCAxODAgMjEwIDExNSAyMSAzMDQgMTA4IAorMTQxIDUxIDIwOSAxNCAxMDMgMTc2IDI0MiAyNDUgMjk1IDMwMiAxMCAzMTggNiAzMDUgNjAgNCA2OSAyNTggNjkgMzAzIDE0NSAyMDIgCisxMzQgMTcxIDI3NyAxMTUgMjk3IDI2MiAyMDkgMTUyIDgyIDY2IDcwIDgzIDI5IDkgNjcgNjcgMjIgMzAxIDQ3IDU4IDg5IDI2NyAyIDE2IAorMTkwIDI3OCAzMyAxNjAgMjQ2IDI1OCAyNDEgMjgyIDM1IDY0IDYgMjYwIDE4IDEwNSA4MCAyODkgMjQ3IDM4IDEyNSA1NSAyMjIgMjgxIAorODMgMjAxIDMwOSAyMTEgMjUwIDIyNiAxMTEgOCAzNyAxNjIgMTUwIDMwNSAyNDMgMjUgMTc5IDEwOSAyMzEgMjE0IDExNyAyMTIgMzAgCisxNDQgMjM5IDE5NSAyNTQgMjM5IDU3IDMwOSAyOCAyMjkgMTE2IDI5NCAxNjcgMTI2IDE5MCAxNDAgODggMzA0IDk3IDY1IDE1MiAyMjAgCis0NSAyODEgMTc4IF4KKzxECisKK0g+U0hTIFR5cGUgMyBTdHJpbmdzPEgKK0Q+Cis0MCAxIDE4IDIwIDExIDE1IDExIDExIDkgNiAyIDE1IDUgMTcgMTIgMSA5IDEgMyA1IDExIDcgMiAyIDYgMTggMiA5IDExIDggMTYgMTEgCisxNiAxNSAxOCAxOCAzIDIwIDIgMTcgMTcgMTYgXgorPEQKKwpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvc2hhLTEvYnl0ZS1oYXNoZXMuc2hhMSBiL2RidXMvdGVzdC9kYXRhL3NoYS0xL2J5dGUtaGFzaGVzLnNoYTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYzM2MyYgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9kYXRhL3NoYS0xL2J5dGUtaGFzaGVzLnNoYTEKQEAgLTAsMCArMSwzNDMgQEAKKyMgIENvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yICJTSEEtMSBUZXN0IgorIyAgU0hBIHRlc3RzIGFyZSBjb25maWd1cmVkIGZvciBCWVRFIG9yaWVudGVkIGltcGxlbWVudGF0aW9ucworSD5TSFMgVHlwZSAxIEhhc2hlczxICitEPgorREEzOUEzRUU1RTZCNEIwRDMyNTVCRkVGOTU2MDE4OTBBRkQ4MDcwOSBeCiszQ0RGMjkzNkRBMkZDNTU2QkZBNTMzQUIxRUI1OUNFNzEwQUM4MEU1IF4KKzE5QzFFMjA0OEZBNzM5M0NGQkYyRDMxMEFEODIwOUVDMTFEOTk2RTUgXgorQ0E3NzVEOEM4MEZBQTZGODdGQTYyQkVDQTZDQTYwODlENjNCNTZFNSBeCis3MUFDOTczRDBFNEI1MEFFOUU1MDQzRkY0RDYxNTM4MTEyMEEyNUEwIF4KK0E2QjVCOUY4NTRDRkI3NjcwMUMzQkREQkYzNzRCMzA5NEVBNDlDQkEgXgorRDg3QTBFRTc0RTRCOUFENzJFNjg0N0M4N0JERUVCM0QwNzg0NDM4MCBeCisxOTc2QjhERDUwOUZFNjZCRjA5QzlBOEQzMzUzNEQ0RUY0RjYzQkZEIF4KKzVBNzhGNDM5QjZEQjg0NUJCOEE1NThFNENFQjEwNkNEN0I3RkY3ODMgXgorRjg3MUJDRTYyNDM2QzFFMjgwMzU3NDE2Njk1RUUyRUY5QjgzNjk1QyBeCis2MkIyNDNEMUI3ODBFMUQzMUNGMUJBMkRFM0YwMUM3MkFFRUEwRTQ3IF4KKzE2OTg5OTRBMjczNDA0ODQ4RTU2RTdGREE0NDU3QjU5MDBERTEzNDIgXgorMDU2RjRDREMwMjc5MURBN0VEMUVCMjMwMzMxNEY3NjY3NTE4REVFRiBeCis5RkUyREE5NjdCRDg0NDFFRUExQzMyREY2OEREQUE5REMxRkM4RTRCIF4KKzczQTMxNzc3QjRBQ0U5Mzg0RUZBOEJCRUFENDVDNTFBNzFBQkE2REQgXgorM0Y5RDdDNEUyMzg0RUREQUJGRjVERDhBMzFFMjNERTNEMDNGNDJBQyBeCis0ODE0OTA4RjcyQjkzRkZEMDExMTM1QkVFMzQ3REU5QTA4REE4MzhGIF4KKzA5NzgzNzRCNjdBNDEyQTMxMDJDNUFBMEIxMEUxQTY1OTZGQzY4RUIgXgorNDRBRDZDQjYxOEJEOTM1NDYwRDQ2RDNGOTIxRDg3Qjk5QUI5MUMxRSBeCiswMkRDOTg5QUYyNjVCMDlDRjg0ODU2NDA4NDIxMjhEQ0Y5NUU5RjM5IF4KKzY3NTA3QjhENDk3QjM1RDZFOTlGQzAxOTc2RDczRjU0QUVDQTc1Q0YgXgorMUVBRTAzNzNDMTMxN0NCNjBDMzZBNDJBODY3QjcxNjAzOUQ0NDFGNSBeCis5QzM4MzQ1ODlFNUJGRkFDOUY1MDk1MEUwMTk5QjNFQzI2MjBCRUM4IF4KKzIwOUY3QUJDN0YzQjg3OEVFNDZDREYzQTFGQkI5QzIxQzM0NzRGMzIgXgorMDVGQzA1NEIwMEQ5Nzc1M0E5QjNFMkRBOEZCQkEzRUU4MDhDRUYyMiBeCiswQzQ5ODBFQTNBNDZDNzU3REZCRkM1QkFBMzhBQzZDOEU3MkREQ0U3IF4KKzk2QTQ2MEQyOTcyRDI3NjkyOEI2OTg2NDQ0NUJFQTM1M0JEQ0ZGRDIgXgorRjNFRjA0RDhGQThDNkZBOTg1MEYzOTRBNDU1NEMwODA5NTZGQTY0QiBeCitGMkEzMUQ4NzVEMUQ3QjMwODc0RDQxNkM0RDJFQTZCQUYwRkZCQUZFIF4KK0Y0OTQyRDNCOUU5NTg4RENGREM2MzEyQTg0REY3NUQwNUYxMTFDMjAgXgorMzEwMjA3REYzNUIwMTRFNDY3NkQzMDgwNkZBMzQ0MjQ4MTM3MzRERCBeCis0REExOTU1QjJGQTdDN0U3NEUzRjQ3RDczNjBDRTUzMEJCRjU3Q0EzIF4KKzc0QzRCQzVCMjZGQjRBMDg2MDJENDBDQ0VDNkM2MTYxQjZDMTE0NzggXgorMEIxMDNDRTI5NzMzOERGQzczOTVGNzcxNUVFNDc1MzlCNTU2RERCNiBeCitFRkM3MkQ5OUUzRDIzMTFDRTE0MTkwQzBCNzI2QkRDNjhGNEIwODIxIF4KKzY2MEVEQUMwQThGNENFMzNEQTBEOERCQUU1OTc2NTBFOTc2ODcyNTAgXgorRkUwQTU1QTk4OEIzQjkzOTQ2QTYzRUIzNkIyMzc4NUE1RTZFRkMzRSBeCiswQ0JERjJBNTc4MUM1OUY5MDc1MTMxNDdBMERFM0NDNzc0QjU0QkYzIF4KKzY2M0U0MEZFRTVBNDRCRkNCMUM5OUVBNTkzNUE2QjVCQzlGNTgzQjAgXgorMDAxNjIxMzQyNTY5NTJERDlBRTZCNTFFRkIxNTlCMzVDM0MxMzhDNyBeCitDRUI4OEU0NzM2RTM1NDQxNkUyMDEwRkMxMDYxQjNCNTNCODE2NjRCIF4KK0E2QTJDNEI2QkNDNDFEREM2NzI3OEYzREY0RDhEMEI5REQ3Nzg0RUYgXgorQzIzRDA4M0NEODgyMEI1NzgwMEE4NjlGNUYyNjFENDVFMDJEQzU1RCBeCitFOEFDMzE5MjdCNzhEREVDNDFBMzFDQTdBNDRFQjcxNzcxNjVFN0FCIF4KK0U4NjRFQzVEQkFCMEY5RkY2OTg0QUI2QUQ0M0E4QzlCODFDQzlGOUMgXgorQ0ZFRDYyNjkwNjk0MTdBODRENkRFMjM0NzIyMEY0Qjg1OEJDRDUzMCBeCitEOTIxN0JGQjQ2Qzk2MzQ4NzIyQzM3ODNEMjlENEIxQTNGRURBMzhDIF4KK0RFQzI0RTU1NTRGNzk2OTcyMThEMzE3MzE1RkE5ODYyMjlDRTMzNTAgXgorODNBMDk5REY3MDcxNDM3QkE1NDk1QTVCMEJGQkZFRkUxQzBFRjdGMyBeCitBQTMxOThFMzA4OTFBODNFMzNDRTNCRkEwNTg3RDg2QTE5N0Q0RjgwIF4KKzlCNkFDQkVCNDk4OUNCRUU3MDE1QzdENTE1QTc1NjcyRkZERTM0NDIgXgorQjAyMUVCMDhBNDM2QjAyNjU4RUFBN0JBM0M4OEQ0OUYxMjE5QzAzNSBeCitDQUUzNkRBQjhBRUEyOUY2MkUwODU1RDlDQjNDRDhFN0QzOTA5NEIxIF4KKzAyREU4QkE2OTlGM0MxQjBDQjVBRDg5QTAxRjIzNDZFNjMwNDU5RDcgXgorODgwMjE0NTg4NDdERDM5QjQ0OTUzNjhGNzI1NDk0MTg1OUZBRDQ0QiBeCis5MUExNjUyOTVDNjY2RkU4NUMyQURCQzVBMTAzMjlEQUYwQ0I4MUEwIF4KKzRCMzEzMTJFQUY4QjUwNjgxMTE1MUE5REJEMTYyOTYxRjc1NDhDNEIgXgorM0ZFNzA5NzFCMjA1NThGN0U5QkFDMzAzRUQyQkMxNEJERTY1OUE2MiBeCis5M0ZCNzY5RDVCRjQ5RDZDNTYzNjg1OTU0RTJBRUNDMDI0REMwMkQ2IF4KK0JDODgyN0MzRTYxNEQ1MTVFODNERUE1MDM5ODlERUE0RkRBNkVBMTMgXgorRTgzODY4REJFNEEzODlBQjQ4RTYxQ0ZDNEVEODk0RjMyQUUxMTJBQyBeCis1NUM5NTQ1OUNERTRCMzM3OTFCNEIyQkNBQUY4NDA5MzBBRjNGM0JEIF4KKzM2QkIwRTJCQTQzOEEzRTAzMjE0RDlFRDJCMjhBNEQ1QzU3OEZDQUEgXgorM0FDQkY4NzQxOTk3NjNFQkEyMEYzNzg5REZDNTk1NzJBQ0E0Q0YzMyBeCis4NkJFMDM3QzRENTA5QzkyMDIwMjA3NjdEODYwREFCMDM5Q0FEQUNFIF4KKzUxQjU3RDcwODBBODczOTRFRUMzRUIyRTBCMjQyRTU1M0YyODI3QzkgXgorMUVGQkZBNzg4NjYzMTVDRTZBNzFFNDU3RjNBNzUwQTM4RkFDQUI0MSBeCis1N0Q2Q0I0MUFFRUMyMDIzNkYzNjVCM0E0OTBDNjFEMENGQTM5NjExIF4KK0M1MzJDQjY0QjRCQTgyNjM3MkJDQ0YyQjRCNTc5M0Q1Qjg4QkI3MTUgXgorMTU4MzNCNTYzMTAzMjY2M0U3ODM2ODZBMjA5QzZBMkI0N0ExMDgwRSBeCitEMDRGMjA0M0M5NkUxMENEODNCNTc0QjFFMUMyMTcwNTJDRDRBNkIyIF4KK0U4ODgyNjI3QzY0REI3NDNGN0RCOEI0NDEzREQwMzNGQzYzQkVCMjAgXgorQ0QyRDMyMjg2Qjg4NjdCQzEyNEEwQUYyMjM2RkM3NEJFMzYyMjE5OSBeCiswMTlCNzBENzQ1Mzc1MDkxRUQ1QzdCMjE4NDQ1RUM5ODZEMEY1QTgyIF4KK0U1RkY1RkVDMURBREJBRUQwMkJGMkRBRDQwMjZCRTZBOTZCM0YyQUYgXgorNkY0RTIzQjNGMkUyQzA2OEQxMzkyMUZFNEU1RTA1M0ZGRUQ0RTE0NiBeCisyNUUxNzk2MDJBNTc1QzkxNTA2NzU2NkZCQTZEQTkzMEU5N0Y4Njc4IF4KKzY3REVEMEU2OEUyMzVDOEE1MjNFMDUxRTg2MTA4RUVCNzU3RUZCRkQgXgorQUY3ODUzNkVBODNDODIyNzk2NzQ1NTU2RDYyQTNFRTgyQzdCRTA5OCBeCis2NEQ3QUM1MkU0NzgzNEJFNzI0NTVGNkM2NDMyNUY5QzM1OEI2MTBEIF4KKzlENDg2NkJBQTM2MzlDMTNFNTQxRjI1MEZGQTNEOEJDMTU3QTQ5MUYgXgorMkUyNTg4MTE5NjFEM0VCODc2RjMwRTcwMTkyNDFBMDFGOTUxN0JFQyBeCis4RTBFQkM0ODcxNDZGODNCQzkwNzdBMTYzMEUwRkIzQUIzQzg5RTYzIF4KK0NFODk1Mzc0MUZGRjM0MjVEMjMxMUZCQkY0QUI0ODFCNjY5REVGNzAgXgorNzg5RDFEMkRBQjUyMDg2QkQ5MEMwRTEzN0UyNTE1RUQ5QzZCNTlCNSBeCitCNzZDRTc0NzI3MDBERDY4RDYzMjhCN0FBODQzN0ZCMDUxRDE1NzQ1IF4KK0YyMTg2NjlCNTk2QzVGRkIwQjFDMTRCRDAzQzQ2N0ZDODczMjMwQTAgXgorMUZGM0JEQkUwRDUwNENCMENERkFCMTdFNkMzN0FCQTZCM0NGRkRFRCBeCisyRjNDQkFDQkIxNDQwNUE0NjUyRUQ1Mjc5M0MxODE0RkQ4QzRGQ0UwIF4KKzk4MkM4QUI2Q0UxNjRGNDgxOTE1QUY1OUFBRUQ5RkZGMkEzOTE3NTIgXgorNUNEOTIwMTJENDg4QTA3RUNFMEU0NzkwMUQwRTA4M0I2QkQ5M0UzRiBeCis2OTYwM0ZFQzAyOTIwODUxRDRCM0I4NzgyRTA3QjkyQkIyOTYzMDA5IF4KKzNFOTBGNzY0MzdCMUVBNDRDRjk4QTA4RDgzRUEyNENFQ0Y2RTYxOTEgXgorMzRDMDlGMTA3QzQyRDk5MEVCNDg4MUQ0QkYyREREQ0FCMDE1NjNBRSBeCis0NzRCRTBFNTg5MkVCMjM4MjEwOUJGQzVFM0M4MjQ5QTkyODNCMDNEIF4KK0EwNEI0Rjc1MDUxNzg2NjgyNDgzMjUyNDM4RjZBNzVCRjQ3MDVFQzYgXgorQkU4OEE2NzE2MDgzRUI1MEVEOTQxNjcxOUQ2QTI0NzY2MTI5OTM4MyBeCitDNjdFMzg3MTdGRUUxQTVGNjVFQzZDN0M3QzQyQUZDMDBDRDM3RjA0IF4KKzk1OUFDNDA4MjM4OEUxOUU5QkU1REU1NzFDMDQ3RUYxMEMxNzRBOEQgXgorQkFBN0FBN0I3NzUzRkEwQUJEQzRBNTQxODQyQjVEMjM4RDk0OUYwQSBeCiszNTEzOTREQ0VCQzA4MTU1RDEwMEZDRDQ4ODU3OEU2QUU3MUQwRTlDIF4KK0FCOEJFOTRDNUFGNjBEOTQ3N0VGMTI1MkQ2MDRFNThFMjdCMkE5RUUgXgorMzQyOUVDNzRBNjk1RkREMzIyOEYxNTI1NjQ5NTIzMDhBRkUwNjgwQSBeCis5MDdGQTQ2QzAyOUJDNjdFQUE4RTRGNDZFM0MyQTIzMkY4NUJEMTIyIF4KKzI2NDRDODdEMUZCQkJDMEZDOEQ2NUY2NEJDQTI0OTJEQTE1QkFBRTQgXgorMTEwQTNFRUI0MDg3NTZFMkU4MUFCQUY0QzVEQ0Q0RDRDNkFGQ0Y2RCBeCitDRDRGREMzNUZBQzdFMUFEQjVERTQwRjQ3RjI1NkVGNzRENTg0OTU5IF4KKzhFNkUyNzMyMDhBQzI1NkY5RUNDRjI5NkYzRjVBMzdCQzhBMEY5RjcgXgorRkUwNjA2MTAwQkRCQzI2OERCMzlCNTAzRTBGREZFMzc2NjE4NTgyOCBeCis2QzYzQzNFNTgwNDdCQ0RCMzVBMTdGNzRFRUJBNEU5QjE0NDIwODA5IF4KK0JDQzJCRDMwNUYwQkNEQThDRjJENDc4RUY5RkUwODA0ODZDQjI2NUYgXgorQ0U1MjIzRkQzREQ5MjBBM0I2NjY0ODFENTYyNUIxNjQ1N0RDQjVFOCBeCis5NDg4ODY3NzZFNDJFNEY1RkFFMUIyRDBDOTA2QUMzNzU5RTNGOEIwIF4KKzRDMTJBNTFGQ0ZFMjQyRjgzMkUzRDczMjkzMDRCMTFCNzUxNjFFRkIgXgorQzU0QkREMjA1MDUwNEQ5MkY1NTFEMzc4QUQ1RkM3MkM5RUQwMzkzMiBeCis4RjUzRThGQTc5RUEwOUZEMUI2ODJBRjVFRDE1MTVFQ0E5NjU2MDRDIF4KKzJEN0UxN0Y2Mjk0NTI0Q0U3OEIzM0VBQjcyQ0REMDhFNUZGNkUzMTMgXgorNjQ1ODJCNEI1N0Y3ODJDOTMwMkJGRTdEMDdGNzRBQTE3NjYyN0EzQSBeCis2RDg4Nzk1QjcxRDNFMzg2QkJEMUVCODMwRkI5RjE2MUJBOTg4NjlGIF4KKzg2QUQzNEE2NDYzRjEyQ0VFNkRFOTU5NkFCQTcyRjBERjEzOTdGRDEgXgorN0VCNDY2ODVBNTdDMEQ0NjYxNTJEQzMzOUM4MTIyNTQ4Qzc1N0VEMSBeCitFN0E5OEZCMDY5MjY4NDA1NDQwN0NDMjIxQUJDNjBDMTk5RDZGNTJBIF4KKzM0REYxMzA2NjYyMjA2RkQwQTVGQzI5NjlBNEJFRUM0RUIwMTk3RjcgXgorNTZDRjdFQkYwOEQxMEYwQ0I5RkU3RUUzQjYzQTVDM0EwMkJDQjQ1MCBeCiszQkFFNUNCODIyNjY0MjA4OERBNzYwQTZGNzhCMENGOEVEREVBOUYxIF4KKzY0NzVERjY4MUUwNjFGQTUwNjY3MkMyN0NCQUJGQTlBQTZEREZGNjIgXgorNzlEODE5OTFGQTRFNDk1N0M4MDYyNzUzNDM5REJGRDQ3QkJCMjc3RCBeCitCQUUyMjQ0NzdCMjAzMDJFODgxRjUyNDlGNTJFQzZDMzREQThFQ0VGIF4KK0VERTRERUI0MjkzQ0ZFNDEzOEMyQzA1NkI3QzQ2RkY4MjFDQzBBQ0MgXgorPEQKKworSD5TSFMgVHlwZSAyIEhhc2hlczxICitEPgorQTc3MUZBNUM4MTJCRDBDOTU5NkQ4NjlFQzk5RTRGNEFDOTg4QjEzRiBeCitFOTlENTY2MjEyQkJCQ0VFRTkwMzk0NkY2MTAwQzlDOTYwMzlBOEY0IF4KK0I0OENFNkIxRDEzOTAzRTM5MjVBRTBDODhDQjkzMTM4OEMwMTNGOUMgXgorRTY0N0Q1QkFGNjcwRDRCRjNBRkMwQTZCNzJBMjQyNEIwQzY0RjE5NCBeCis2NUMxQ0Q5MzJBMDZCMDVDRDBCNDNBRkIzQkM3ODkxRjZCQ0VGNDVDIF4KKzcwRkZBRTM1M0E1Q0QwRjhBNjVBOEIyNzQ2RDBGMTYyODFCMjVFQzcgXgorQ0M4MjIxRjJCODI5QjhDRjM5NjQ2QkY0Njg4ODMxN0MzRUIzNzhFQSBeCisyNkFDQ0MyRDZENTFGRjdCRjNFNTg5NTU4ODkwNzc2NTExMUJCNjlCIF4KKzAxMDcyOTE1QjhFODY4RDlCMjhFNzU5Q0YyQkMxQUVBNEJCOTIxNjUgXgorMzAxNjExNTcxMUQ3NDIzNkFERjBDMzcxRTQ3OTkyRjg3QTQyODU5OCBeCitCRjMwNDE3OTk5QzEzNjhGMDA4QzFGMTlGRUNBNEQxOEE1RTFDM0M5IF4KKzYyQkE0OTA4NzE4NUYyNzQyQzI2RTFDMUY0ODQ0MTEyMTc4QkY2NzMgXgorRTFGNkI5NTM2RjM4NEREMzA5ODI4NUJCRkQ0OTVBNDc0MTQwREM1QSBeCitCNTIyREFFMUQ2NzcyNkVCQTdDNDEzNkQ0RTJGNkQ2RDY0NUFDNDNFIF4KK0U5QTAyMUMzRUIwQjlGMkM3MTA1NTRENEJGMjFCMTlGNzhFMDk0NzggXgorREYxMzU3MzE4OEYzQkY3MDVFNjk3QTNFMUY1ODAxNDVGMjE4MzM3NyBeCisxODg4MzVDRkU1MkVDRkEwQzQxMzVDMjgyNUYyNDVEQzI5OTczOTcwIF4KKzQxQjYxNUEzNEVFMkNFQzlEODRBOTFCMTQxQ0ZBQjExNTgyMTk1MEIgXgorQUIzREQ2MjIxRDJBRkU2NjEzQjgxNURBMUMzODlFRUM3NEFBMDMzNyBeCiswNzA2RDQxNEI0QUE3RkI0QTkwNTFBQTcwRDY4NTZBNzI2NDA1NEZCIF4KKzNDQkY4MTUxRjNBMDBCMUQ1QTgwOUNCQjhDNEYzMTM1MDU1QTZCRDEgXgorREE1RDZBMDMxOTI3MkJCQ0NFQTYzQUNGQTY3OTk3NTZGRkRBNjg0MCBeCitGQjQ0MjlDOTVGNjI3N0IzNDZEM0IzODk0MTM3NThERkZGRUVEQzk4IF4KKzJDNkUzMEQ5Qzg5NUI0MkRDQ0NGQzg0QzkwNkVDODhDMDlCMjBERTEgXgorM0RFMzE4OUE1RTE5RjIyNUNEQ0UyNTRERkYyM0RBQ0QyMkM2MTM2MyBeCis5MzUzMEE5QkM5QTgxN0Y2OTIyNTE4QTczQTE1MDVDNDExRDA1REEyIF4KK0UzMTM1NDM0NUY4MzJEMzFFMDVDMUI4NDJENDA1RDRCRDQ1ODhFQzggXgorM0ZGNzY5NTdFODBCNjBDRjc0RDAxNUFENDMxRkNBMTQ3QjNBRjIzMiBeCiszNEFFM0I4MDZCRTE0M0E4NERDRTgyRTRCODMwRUI3RDNEMkJBQzY5IF4KK0Q3NDQ3RTUzRDY2QkI1RTRDMjZFOEI0MUY4M0VGRDEwN0JGNEFEREEgXgorNzdERDJBNDQ4MjcwNUJDMkU5REM5NkVDMEExMzM5NTc3MUFDODUwQyBeCitFQUExNDY1REIxRjU5REUzRjI1RUI4NjI5NjAyQjU2OEU2OTNCQjU3IF4KKzkzMjlENUI0MEUwREM0M0FBMjVGRUQ2OUEwRkE5QzIxMUE5NDg0MTEgXgorRTk0QzBCNkFBNjJBQTA4QzYyNUZBRjgxN0RERjhGNTFFQzY0NTI3MyBeCis3RkYwMkI5MDlEODJBRDY2OEUzMUU1NDdFMEZCNjZDQjhFMjEzNzcxIF4KKzVCQjM1NzA4NThGQTE3NDQxMjNCQUMyODczQjBCQjk4MTBGNTNGQTEgXgorOTA1RjQzOTQwQjM1OTFDRTM5RDExNDVBQ0IxRUNBODBBQjVFNDNDRCBeCiszMzZDNzlGQkQ4MkYzM0U0OTBDNTc3RTNGNzkxQzNDQkZFODQyQUZGIF4KKzVDNkQwN0E2QjQ0RjdBNzVBNjRGNkNFNTkyRjNCQUU5MUUwMjIyMTAgXgorN0UwRDNFOUQzMzEyN0Y0QTMwRUI4RDlDMTM0QTU4NDA5RkE4Njk1QiBeCis5QTVGNTBERkNGQjE5Mjg2MjA2QzIyOTAxOUYwQUJGMjUyODMwMjhDIF4KK0RDQTczN0UyNjlGOUQ4NjI2RDQ4ODk4OEM5OTZFMDZCMzUyQzA3MDggXgorQjhGRkMxRDQ5NzJGQ0U2MzI0MUUwRTc3ODUwQUM0NkRERTc1REJGQSBeCitFOUM5QkY0MUM4NTQ5MzU0MTUxQjk3NzAwM0NFMUQ4MzBCRTY2N0RCIF4KKzA5NDI5MDg5NjBCNTRGOTZDQjQzNDUyRTU4M0Y0RjlDQjY2RTM5OEEgXgorRkNFMzQwNTFDMzRENEI4MUI4NUREQzRCNTQzQ0RFODAwN0UyODRCMyBeCis2MUU4OTE2NTMyNTAzNjI3RjQwMjREMTM4ODQ2NDBBNDZGMUQ2MUQ0IF4KK0YwMDhENUQ3ODUzQjZBMTdCNzQ2NkNEOUUxOEJEMTM1RTUyMEZBRjQgXgorQkQ4RDJFODczQ0Y2NTlCNUM3N0FBQzE2MTY4MjdFRjhBM0IxQTNCMyBeCitCMjVBMDRERDQyNTMwMkVEMjExQTFDMjQxMkQyNDEwRkExMEM2M0I2IF4KK0E0MDRFMjE1ODgxMjNFMDg5MzcxOEI0QjQ0RTkxNDE0QTc4NUI5MUYgXgorQTFFMTNCQzU1QkY2REFEODNDRjNBQUJEQTMyODdBRDY4NjgxRUE2NCBeCitENUZEMzVGRkFCRUQ2NzMzQzkyMzY1OTI5REYwRkI0Q0FFODY0RDE1IF4KK0MxMkU5QzI4MEVFOUMwNzlFMDUwNkZGODlGOUIyMDUzNkUwQTgzRUYgXgorRTIyNzY5REMwMDc0OEE5QkJENkMwNUJCQzhFODFGMkNEMURDNEUyRCBeCitGMjk4MzVBOTM0NzU3NDBFODg4RThDMTQzMThGM0NBNDVBM0M4NjA2IF4KKzFBMUQ3N0M2RDBGOTdDNEI2MjBGQUE5MEYzRjg2NDQ0MDhFNEIxM0QgXgorNEVDODQ4NzBFOUJERDI1RjUyM0M2REZCNkVERDYwNTA1MkNBNEVBQSBeCitENjg5NTEzRkVEMDhCODBDMzlCNjczNzE5NTlCQzRFM0ZFQ0IwNTM3IF4KK0M0RkVENThGMjA5RkMzQzM0QUQxOUY4NkE2REFDQURDODZDMDREMzMgXgorMDUxODg4QzZEMDAwMjlDMTc2REU3OTJCODRERUNFMkRDMUM3NEIwMCBeCisxQTM1NDBCRUUwNTUxODUwNTgyNzk1NEY1OEI3NTFDNDc1QUVFQ0UwIF4KK0RGQTE5MTgwMzU5RDVBN0EzOEU4NDJGMTcyMzU5Q0FGNDIwOEZDMDUgXgorN0IwRkE4NEVCQkNGRjdEN0Y0NTAwRjczRDc5NjYwQzRBMzQzMUI2NyBeCis5RTg4NjA4MUM5QUNBQUQwRjk3QjEwODEwRDFERTZGQ0RDRTZCNUY0IF4KK0E0RDQ2RTRCQTBBRTRCMDEyRjc1QjFCNTBEMDUzNEQ1NzhBRTlDQjYgXgorNjM0MkIxOTlFRTY0QzdCMkM5Q0JDRDRGMkRDQjY1QUNFRjUxNTE2RiBeCitBQUJGRDYzNjg4RUI2NzgzNTc4NjkxMzAwODNFMUI1MkY2RUE4NjFEIF4KK0Y3MzJCNzM3MkRBRjQ0ODAxRjgxRUZGRTMxMDg3MjYyMzk4Mzc5MzYgXgorNUU5MzQ3RkU0NTc0Q0RDQjgwMjgxRUQwOTIxOTExOTlCQUREN0I0MiBeCitENTc3NkI3REZGRjc1QzEzNThBQkRCQkIzRjI3QTIwQkI2Q0E3QzU1IF4KKzAyMkI3QURBNDcyRkI3QTlEQTkyMTk2MjFDOUM1RjU2M0QzNzkyRjYgXgorN0YxREU0RUNBMjAzNjJEQTYyNDY1M0QyMjVBNUIzRjc5NjRBOUZGMiBeCitDQTBGMkIxQkZCNDQ2OUMxMUVEMDA2QTk5NDczNEYwRjJGNUVGRDE3IF4KKzgzM0Q2M0Y1QzJFQTBDRDQzRUMxNUYyQjlERDk3RkYxMkIwMzA0NzkgXgorMTRGRDM1NjE5MDQxNkMwMDU5MkI4NkZGN0NBNTBCNjIyRjg1NTkzQSBeCis0QUI2QjU3RURERUYxQ0U5MzU2MjJGOTM1QzE2MTlBRTdDMTY2N0Q2IF4KK0I0NTZBNkE5NjhBQ0Q2NkNBQTk3NEY5NkE5QTkxNkU3MDBBQTNDNUQgXgorRkQxQzI1N0ZFMDQ2QjJBMjdFMkYwQ0Q1NUVEMkRFQ0E4NDVGMDFENyBeCis2NkUwRDAxNzgwRjEwNjNFMjkyOUVBQUQ3NDgyNkJDNjQwNjBFMzhDIF4KK0E4NDc4REY0MDZGMTc5RkQ0RUY5N0Y0NTc0RDdGOTlFQTFDRTlFQjggXgorMjQ4RTU4Q0YwOUEzNzIxMTRGQzJGOTNCMDlDNUZDMTRGM0QwMDU5RSBeCitGMTU3NjdERTkxNzk2QTY4MTY5NzdFRkE0RkNFRDRCN0ZEOUI4QTU3IF4KKzM2QTZCQzVFNjgwRTE1Njc1RDk2OTYzMzhDODhCMzYyNDhCQkJBRjQgXgorNERFQTYyNTFCMkE2REYwMTdBODA5M0FCMDY2RUUzODYzQTRFQzM2OSBeCitEMzBFNzBFMzU3RDU3RTNEODJDQTU1NEI4QTNENThERkY1MjhGQTk0IF4KKzcwQ0E4NEQ4MjdGN0ZENjE0NDYyMzNGODhDRjJGOTkwQjBGM0UyQUEgXgorOEQ1MDBDOUNGREUwMjg4NTMwQTIxMDZCNzBCRUQzOTMyNkM1MkMzQyBeCitGM0Q0RDEzOUVERkMyNDU5NjM3N0JDOTdBOTZGQjc2MjFGMjdGRkM3IF4KKzU1MDlCQUZGQUM2RDUwNzg2MENFRkM1QUI1ODMyQ0I2M0NENEI2ODcgXgorMEMwQUVBMEMyRkQ3QTYyMEM3Nzg2NkIxQTE3NzQ4MUUyNkI0RjU5MiBeCisxNDkxNzYwMDdGRUU1OEE1OTFFM0YwMEY4REI2NThCNjA1RjgzOTBDIF4KKzE3QzBEN0IwMjU2MTU5RjM2MjY3ODZGRkRCMjAyMzdBRTE1NEZBODQgXgorNzQxQTU4NjE4QUJFQjFEOTgzRDY3QUZEQ0JDNDlBQTM5N0EzQjhFMCBeCitCNzM4RDZCMzQwOUVCOUVEMkYxNzE5Qjg0RDEzRjdDMzYxNjlDREVDIF4KKzNEMzNERTMxRjY0MDU1RDNCMTI4QUM5QTZBQTNGOTJERkQ0RjUzMzAgXgorQjY5MjVGNERGOTQ5NDlCODg0NEM4Njc0MjhCQTNERURGNENGMkI1MSBeCitDRjVFNzI1NjI5MkFCRUM0MzFEOEU4QjlDQkVBRjIyQUYwNzIzNzdFIF4KKzk3NURDRTk0OTAyOTIzOTc3RjEyOUMwRTRBQ0Y0MEFEMjhEREI5QUEgXgorMzMzQjAyNTlCMThDRTY0RDZCNTJDRjU2M0REMzA0MUU1RjYzQTUxNiBeCis8RAorCitIPlNIUyBUeXBlIDMgSGFzaGVzPEgKK0Q+Cis4MEUwNDQ3MDNBODgwQzIwRUM0MUY2NDUxMjBBOEE1QjVEMTk0RUNFIF4KK0UxNDI4MjlDQTA4RkM5Nzg3RjE3QUExNkNFNzI3Mzk2MTY5QjI3MTMgXgorNkEyQkFGNjI0NjlEMzExRjkyNTdBMDcyN0Y1MkM3RUFBODdDQ0VCNCBeCiszNjJFM0U3MTM2Q0E2MTFEN0ZCRjY4N0QzQkJEQzU0Q0RBNjQ4NDNGIF4KK0Y1OTAwQURDNjIyM0E1RDI0QTc1MjZBQkZDNjBGQThFMkQ1OUE1QUIgXgorQUQwQ0FDNkEyMUQ1QjEwODMzRERFN0ZBODU5MjdENzRFREExNDJBOSBeCis0N0FEMzM3RUFGRkRDMTc3QUFGN0NCRDAzNUJFNkYzOThCOUQwNTM2IF4KKzlDRjU4NTk1REY4MDg3MjUzNUJDQzdDMDU2RTIyMzU0NkYwQkI0RUUgXgorNzE1MUNFQjE5MTgyNzhDRUQyOTAyQjFENjYzRDU5NkY4RDFCOTg2RiBeCitBRERDOUYwOUFBNDAyNkVGNkM0QjdGMUE4NEQzQTEzQjRDREM2NUIzIF4KKzkyMUZFNzhBODYzQTMxN0IxRkExRkIzQ0EzQkUxOTQ4REU3RUY3NTQgXgorNjRCRTEwNzMyRDcxRDUyQ0U4QTQ4NkRBMjNFNkI0NTNERjdDNkZCRCBeCis0QTQ1MDY1OTQ3MERENzU5QUJGQUUxRDczOTcyQTZEMkU2M0FDMTZDIF4KKzBENjY1RTRCQkYzMEI3RUFCOTU1QkRFODQ3NTlFMTg1RUVDQUI0Q0IgXgorMEMxQjhFRTk0RDYxQ0REMDgzN0VBRUQ5RkUzM0RFNEE4MzM0QjU5NiBeCitEOTNCRkUyQTYyMjdBNEJGOUI3QzYxRUJDRTRBOENERTEzMTU5M0ZFIF4KK0JEQTg4M0Y4MDRCNDcwQzkwQkQ2QUM0OTBERkMzNEVCQzI3Rjk2NDggXgorNDZBMDk2OTM3MzU1MjIxMzYzMjU5MUM1MjAzMEMzOEU1REJEQzQ5RSBeCis0NzgxMjg5RTQ4QjkxMEM1NTBEQzIzQ0E3RDNBRjUzMjRDMDM1MzJEIF4KKzY5M0EzNENGQ0RERUQwRjNBQzcyRTcxOTdGQ0U5QkI2NkE4RTM5ODEgXgorQUUwODhBRjFEODg2NTE0MDk2M0IzQUJGQjYzRTMyRTA0Q0QxNTA2RiBeCitBREYwRjhGMUQ4NUNBOTc1ODZGNURDNkRDNUZEMTFGQTM5MjcwRjU1IF4KK0U0ODRGNUFEODZDNUY0RDA5RTM2NkFERjZFMERFNzM0NDlGOTdCMjggXgorODFDNDk4NDJCQTNENzA3MkZCNDIyODhFMDNDRTczN0EyNjcyQzA5MSBeCitGNkNDNzFBRDg5N0MyM0ExNjgzNTQ5MERFRDI4OUJGRDQ1NTAwQUIwIF4KKzIzRTcxQUVENjJGRThFMjhGMzRGNThFN0ZFNTU5NEVDNUVCMDQ4NkMgXgorOTJCQTc5MzRBQTU4NjdFRTUyOTYwRjRFMEVERkI5MEFBN0I2OTMwNSBeCitDM0QxQ0M4Q0JEMUI2RkZFRTBEOTBDRTk2MkNEOUMwOUFCMTU0OEFBIF4KKzNDRTM3QTU4M0I3MUE2QTc3QkUzMjUwNjZBMEYwMEM1RDExREZDM0UgXgorNzZFRjVEMjM2RTEwNDJEMzU2QTMyMzRBNDIyQzA5MkY4NjAwMzA2NCBeCis4QzNGNzAzNDM2QzZDODgyRTYwMjYzNTQwQThFNEMzRTU2NDZEQzE1IF4KKzYxMzhGOUYzQUI0M0I5ODhERDM4NTc0MjJDQ0IzMDQzNTI0NTlGNDAgXgorQjgxMkRFOTg3NzVCNDY5MEI0RkMyRUNGQ0FCNjFDNzNDNzI3MURDNyBeCiswNjY2MDk4NUNEODBENDhFN0I5Rjg4NDU1QjQyMzM5MjRDM0I2NEJCIF4KKzc2QUI0QjYzNzhENkY2MzQ5OUE5NEVCNjdFQjFDQjMxQUZGOEQ3NzUgXgorRjMxRjZCMEJFN0FCMDU5QTFGNTlBNDY0ODE5NjdFODgzOTI5NzlFNiBeCiswQzE2Mzg0OThGQkI3REI5NjAwQjk4QjRCMjJFRjg1RTBGRTI0NUZCIF4KKzU2MDdDNkFGNjAwOTM5NzM2Nzk1QUM1MjNGQTQzQjczNkY0MUExMTggXgorOEEwMzI0NDg2NkJERDIxQjlEOEE4MkU5ODQzNkM4OTRGQUQ4NkVDQyBeCis4QTc1QkZEOTExQUY4NzMwM0I5QjhGQjdBMUE0N0NDQTUyRDNEOThBIF4KKzE2RjBGM0I1RDM3NDExMjM2QTFFM0Q2QjFFREFCNzRDREEyNUVENEIgXgorQUM3MkJGNDU0Nzc0ODFGNThBMzAyNjI4REM1Mjk5RkZBMzJFN0M5RiBeCis3NENGRkQ1ODgxRjc1QUMyMDcyNkUxNDQ3RENGN0Y0NzAyNDM4MEVGIF4KKzVCRkJFQ0VFQ0JDMjdEQTA1NzI5QzREMUFDOEMxMjg2RUE2RENFQzkgXgorMDEyQUFDQkMwNTc5RkE0Q0I0RjEwN0U5QTlBRDFBODZBRDJGNkE0RCBeCitGN0Q1NTJDQkM1RUY5MEYxQTU3OTM4OEI1QThBOUVDNzFFQjY3NjgxIF4KKzEwQzcwMTE1QzRDMzQ3NTMyNzRCRkVENDc3REYwMTQ0MEE2N0EzNjEgXgorMDc4RDJGQUNEMjkzQjZCNjIxOUQ4OTg5OUMxNkFBMUFBOEUzREU4MiBeCis4M0M2QkY5RkIwRDMwOTFBREYzNzRFQkZBMEE2OTkxNkYxN0U2RDI2IF4KKzJDREIxOTI0REE2MkFCNjRDMDA3QzY1MDVGRjY1N0U0QURERUE5QzEgXgorRTk1RDIwOUJDQjk4NjRCMDc2RkY0REZDQThGOEJENzVENjJEMUI0OCBeCis2MzI4MjRDRjUwMjVGOEY5MEFEMjkyM0JEREY0NDk1NTBENjRDMEY1IF4KKzAyQjFDMEI0MUZDMjdFQzVBMzJFNTg2RjFBQzQ4MEJGMDA2MUU1NkEgXgorMjgxNTZCQzY3NjlBRTM5MEJGMzJDNjUxMkM0NjE2OTE4MUUxNTM2RCBeCitGNzMwRTZFMjg3RDk5MkU3RjNFMDEzQjZGMUUwODhGMEI5QzQxNTk4IF4KK0IwNTZBNkE4MzJGQTVGRTk2NEVGNzdGRjNFMEJFMUMzMkUwRDU4QzAgXgorRDVCM0QxOUFGQkI0OEZCNTZCQTZENDRBODJERTZCRDA4REIyMDhERSBeCiswMjE1QUQ3OUJENkI4MDIzQzA1RkQyRjg5NjYyMTE4OTdERjYzMzdBIF4KK0VDNENGMzhDMjQ0RUI2NTI2QTQ0RjcwNTcwOTI1MjQ3MTQ1REE4Q0EgXgorQzBEOTMxMjYyRUNFOTNEQTVBNkFCQzg5Q0Q2QUQzMTYyRUE2QjA5RSBeCis2QkI0OEZBQzI2QUEyQjQ4NTlCQkRFRkNGQjUzQUU0RDFEOUEwMzQwIF4KKzU4NjExRDQzNzQxRTY3QTdGMERBOUNCMzM3QTU5RENEMUVCRTc1OEUgXgorN0MyQUVDMjE2QUYyMzE1MDlFNDdCN0VFRDA2QkIxNzg1OTgxMkI3RSBeCitGNjBFRTVEQkY0QTdBNjc2RUM5OEIzRERCMUNERDZDREYzQ0RBMzNCIF4KKzA0OTJFNTlCMUY0Qzk0RTk3RjI5QTI2QzNFRTdENTdFMUIwRkRENzIgXgorNEZDRjU0OUQ5MDJEOUJFMTEwMUE3NTZEQjlFNDU0MTVGQjYxQkNEMiBeCis5NUM3MUQyNkFENkIzOENDNzcxMzc2QjRBNEY5NjJGMTJFMUUzRDRGIF4KK0Y2QTI0NDlFNzczQzcyRkI4ODZCM0M0M0UyQjMwRUMyQTFCNzQ1NEEgXgorQ0RFODY2OTVFMDBBRUM5QTVEQjZGRERCNUQ1QTU5MzQ0NDhENThFMCBeCis1MDIzMThBNzU4RkFCRkY2QUM1Mzg0NEU5RTJCQ0QxNTlDNjc4NTEwIF4KKzU4OUQyOTUxNDhGOTVGNzVEQUU5NjRERDc0M0ZFOTgxRkEyMzZENEUgXgorNzk3M0REMzNBRTM1OTlBNTU2QkFDQzc3RTg2NTZFNzgyRTAyOUVGRiBeCis5RjVCRTQzQUFERDQzQzZEQjM4ODNDOURBNEI1MkUxQTUwMjU3QUVFIF4KKzQ1NDI4OUQ4RkZCMjM3QTU2RDUyMTRFQUU4OEYwQTlEMzI4RkVBMUEgXgorN0U2ODZCMzY1OTVCRUI0QzBENDUyOEZGOTYwRURCNTUwODhBMDI4RCBeCitGOTc4OUQxRUYxOUEwMDg0QUMwRTlGNDNBNEJDMEVFMDQ3ODkzOUVGIF4KKzJGMzJCMEU3Q0M4QkUxOUMzMjU1NDVDODE2RTc3MDU2RDdCQkU3MEYgXgorNkIxNjE3NzQ2RjA3M0NGQ0QyQ0VCQ0FGQkJFNkZEMEUyOEVEMkQ1NiBeCitDRjhEMkVBMzg4OEFENzY3NjE3OTkzODNFNUExNTk3OUY2REI3QTg4IF4KKzU1N0FGNkQ5RDU5NDcyMDNDNjBFOThDOUE3OUI5MkI4QkQwODVFMkIgXgorQzYxQTIxNzQyM0RFNjhFRDZDRDM0QzkxNzU2QzhERDNBNjUwQTJBMiBeCis3M0YzRjc5QzE1MUI2QzFCRDkzNjlFREIyNkI5MzJDMjM2MkIwNTkzIF4KKzM2NDE0MUU1RkJDREU4M0YyMTBDNUJCQkVCNjgxMEY2Mjk5REUxNEIgXgorRjgwNkJFQ0QwMjVEMjY0RkQ1OUU5M0Q5RTM2MDZBNjc0QzQwRjIxNiBeCitFMEM3NjFBNTdGMDBDQkZCMDdENDlCQ0IwMzRDMzZBNzEyMkY0QzVCIF4KKzVEMzgzMTA0NEI5RTAwMzJGQkUzQzM0MjVGRkQxMzY5OEY0MTNCMzMgXgorN0VCMUFCNDFFOTk5Nzc1M0M1RDUzMERGMTE4RTcxRTcyRDdCODZGQyBeCitDQzA1M0VBMTU1NjI2OUQ3RThCQ0JBMzBCMjA4RkNCRjBFRTJFRTY0IF4KK0E1NzczOUIxREQ0MUU3REMwQzQwRDZCNjE1OUE3RTczQ0UyNzQ4QUEgXgorOTBEQTUyN0M5REI5QUNDMkZENTMwRDU2MEEyRjExOTFBODBEMDU2NyBeCis2QUMxRjJBMEI4Q0EwRTVBQkM5RkRGMUFEQ0U1ODhGQkRGNUNDNTNFIF4KKzQzQzFBMEEwRUU0MTYzRUM5Mjk3MjY5ODlGOTJCMDM2MzlCMjMzQUIgXgorODkyN0YyOTk0NjI0MTNBQzI5QTc0MDgwRTU0RDhFRTJEQjcxNjVFNyBeCiswQzhEN0UyMjIyNkQ5MUI0MjNFNzgxQjUwOEYzMTUxN0VBQUI2MDdCIF4KKzcyODZFMjBEN0YwOEQxOEE4OTMyNTRGQkQzQ0M4MzNGNzk3M0RDQUYgXgorMENCOEMyMzU5MjhCOEU5MzZDNDNCOEYyOUVGMzc1OEI5RkQ1NEE3QiBeCitGNjdDMjRDQzIzRTQ0MENBM0YyMDZDRUVCNTUwNEVDQTU0Q0Q1Q0EzIF4KK0Q3OEEyNURFQUExRTdBREFEREIzQzE0NUVEMEU1MjYzQkE0RjI5MTAgXgorMDBBQTY4MTc0RDI5NDkyQzU3OEFDODUzRkZDRDU1OTA4MjkyRDQxQSBeCitENTU3MEVFREIwOUE2MkE1OTQ4RjdGMzExRjdFRDVFRjI0N0Y5QUQ5IF4KKzxECisKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL3NoYS0xL2J5dGUtbWVzc2FnZXMuc2hhMSBiL2RidXMvdGVzdC9kYXRhL3NoYS0xL2J5dGUtbWVzc2FnZXMuc2hhMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWQ5MDc4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvc2hhLTEvYnl0ZS1tZXNzYWdlcy5zaGExCkBAIC0wLDAgKzEsMjI5NCBAQAorIyAgQ29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgIlNIQS0xIFRlc3QiCisjICBTSEEgdGVzdHMgYXJlIGNvbmZpZ3VyZWQgZm9yIEJZVEUgb3JpZW50ZWQgaW1wbGVtZW50YXRpb25zCitIPlNIUyBUeXBlIDEgU3RyaW5nczxICitEPgorMCAxIF4KKzUgMCAyIDEgMiAxIDIgXgorNSAwIDEgMyA0IDQgNCBeCis3IDAgNCAzIDQgNCAxIDQgNCBeCisxMCAwIDQgMSA1IDMgNCA0IDMgMSAzIDQgXgorMTAgMCAzIDEgNiA1IDUgMSAzIDYgNiA0IF4KKzEzIDEgMyAyIDUgMyAzIDMgNCA2IDYgMSA0IDYgMiBeCisxNiAxIDMgNSA1IDEgMiAxIDMgMyA2IDMgNSAyIDMgNSA3IDIgXgorMTUgMSA4IDEgNSAzIDIgNyA0IDUgNiA3IDMgMyAxIDYgMyBeCisxNSAxIDQgNiA4IDIgMSA0IDIgNSAxIDYgOCA4IDYgNCA3IF4KKzE4IDEgMSAyIDcgMyA4IDYgNyA1IDQgMyA0IDMgNSAzIDMgMiA2IDggXgorMTYgMCA5IDggMSA4IDEgNyA2IDcgNyAxIDIgNiA5IDUgNCA3IF4KKzE4IDAgNyAxIDcgMyA5IDQgNyA3IDUgMiA4IDEgNyA4IDIgNyAyIDkgXgorMTkgMSAyIDMgMSA4IDggNiA5IDEwIDMgMTAgOCA5IDIgNCAxIDUgMSA1IDkgXgorMTkgMSA4IDUgNCA4IDEgMyA5IDUgNyA3IDIgNyAyIDcgOCA3IDQgOCAxMCBeCisyMCAxIDEgOSA3IDQgMSA0IDUgMSAxMCA4IDYgNCA0IDkgOSA5IDggMiA5IDEwIF4KKzE5IDEgMTEgNiA3IDcgMiA2IDIgNiAxMCA2IDkgMTAgNSAxMSAxIDYgOCAxMSA0IF4KKzIyIDAgMTAgNSAxMCAzIDcgOCA5IDkgMSAxIDEgMTAgMiAxIDUgMTAgMiA5IDkgOSA3IDggXgorMjEgMCAxIDEwIDEgNiA5IDQgMiA1IDIgMTEgOCAxMiAxMiA5IDggMSAzIDEwIDcgMTEgMTIgXgorMjQgMSAzIDkgNSAxMiAzIDQgMiA5IDEyIDExIDYgNiAxIDEgOSA1IDkgMSA0IDkgNCAxMCA4IDkgXgorMjUgMSAzIDIgMyAxMSAxIDEyIDUgNiAyIDcgOCA0IDggOCA5IDkgOCA0IDkgMSA0IDggMTAgOSA5IF4KKzIzIDAgMTEgMTAgNyAxMCAxMCA2IDEwIDkgNCA1IDEwIDUgOCA0IDEgMTAgMTIgNCA2IDEgOCAxMSA2IF4KKzIyIDAgMTIgOCAxMCA0IDMgOCA1IDUgNyAxMSAxMyAxMSAxMiAxMSA0IDEyIDMgNiA1IDExIDEwIDUgXgorMjYgMSAxMCA5IDYgOSA3IDIgMTAgNCA0IDUgNSAyIDEyIDEzIDUgMyAxIDEwIDEgNCA3IDggMTMgMTMgMTIgOSBeCiszMSAwIDIgNiA1IDQgNyAzIDEwIDYgMTMgNiAzIDkgNiAyIDEwIDUgMyA4IDQgMSAxMSAzIDUgMyA3IDExIDEgMTIgOSAxMiA1IF4KKzI3IDEgMTQgNSAxIDMgNyAyIDMgOSAzIDQgMTQgNCA0IDEwIDggNSAxNCAxIDExIDEyIDEyIDEwIDQgMTMgNyAxMSA5IF4KKzMwIDEgNCA5IDUgNSA4IDkgNSAxMCA0IDIgNCA3IDkgOSA2IDMgNSAxIDggMyAyIDEzIDMgMTQgOSA4IDkgMTAgMTQgMTAgXgorMjcgMCAxMiA5IDUgOCA3IDIgMTQgMTIgMyA4IDE0IDYgNiA0IDcgNSA3IDEwIDcgMTEgMTAgMSA5IDYgNyAxMiAxNCBeCisyNCAwIDEyIDkgOSAyIDExIDEzIDEyIDExIDExIDYgMTQgMTMgMTAgNSA2IDggMTAgNCAzIDExIDExIDE0IDUgMTQgXgorMjQgMCAxNSA0IDUgMyA4IDEyIDE1IDggMTQgMTUgOSAxMiAxMiAzIDEwIDEzIDYgMTEgMTAgNCAxMyAxNCA4IDggXgorMjggMSAxIDggMSA1IDExIDQgOSAxMiA0IDEzIDE1IDUgOSAxMSA3IDE0IDExIDEgMTEgNyA4IDggMTEgMSAxMyAxNSAxMiAxMyBeCiszMiAxIDUgOCAzIDggMTAgNyA4IDEgNSAxMyAxMiAxNCA1IDMgNiA0IDEyIDE1IDYgNiAxMCAxMSAxMyA5IDEgMTEgNiAxMCAzIDcgMTQgCisyIF4KKzMxIDAgMTAgMyA1IDEgMTQgMTEgMTEgMTYgMSAyIDIgMTEgNiAxMyAxNSAxMiA2IDUgMTYgMiAxNCAyIDEwIDEyIDIgNSA1IDYgMTAgMTMgCisxNSBeCiszNCAwIDMgMTAgOCAxNiA5IDUgMTIgMTUgNCAxMSAxMyAzIDYgNSAxMCA4IDEgMyA5IDMgMTEgMSAyIDE2IDEyIDEwIDYgMSA5IDEgMTYgCis1IDYgMTQgXgorMzAgMSAxIDEyIDQgNCAyIDE1IDEzIDE1IDExIDE1IDUgMTEgOSA3IDE1IDE2IDYgMTYgMTIgMyAyIDEwIDE2IDUgNSA3IDEgNyAxMSAxNiAKK14KKzM0IDAgNyA5IDExIDIgNSA1IDUgNCAxMyAxMyAxNCA0IDcgMTIgNiA0IDggMiA5IDkgMTMgMTMgMyAzIDYgNyAxNiA3IDYgMTUgNSA4IAorMTUgMTQgXgorMzYgMSA0IDYgMTYgMTUgMTEgMTQgMTQgNCA3IDEwIDMgNCAxMCAzIDYgNyAxNCA0IDYgNiA1IDIgNyA4IDE2IDIgMTIgMTYgMTAgMTQgMyAKKzIgMyA3IDE0IDMgXgorMzIgMCAxNSAxMCA5IDEgMTQgMTAgMTQgNiA2IDE2IDMgMiAzIDggMyAxMiA4IDExIDE3IDMgOSA3IDE2IDE0IDQgMTEgMTUgNSAxMyA5IAorNSAxNyBeCiszMCAwIDE3IDE3IDEzIDggMiA2IDggMTYgMSAxMiA1IDE3IDIgOSA4IDEwIDEzIDE0IDExIDE3IDEyIDUgMTQgOSAxMSA5IDExIDQgMTEgCisxMiBeCiszMCAxIDE2IDYgMTAgNSA4IDMgMTcgMTYgMTQgMSAxNSAxNSAxNSA2IDEzIDIgMTEgNiAxMyAxMSAxMyA0IDYgNyAxMSAxMSAxMiAxNiAKKzEzIDE2IF4KKzMzIDEgMTYgMTYgMTQgMTYgMiA0IDE2IDExIDYgMTUgNyA0IDE3IDYgNSA3IDYgMyAxNCAxNiA1IDE3IDExIDEzIDEgMSAxNCAxMyAzIDYgCisxNCA1IDE2IF4KKzM5IDEgMiAxNiAxMyA3IDggNiAyIDE1IDEgOSAxMiA0IDQgMTEgMTMgNyAyIDExIDkgMTggNCA1IDQgOCAyIDE0IDkgOSAxIDggMTMgMTEgCisxNSA4IDUgOSAxMCAxNiA3IF4KKzM0IDAgMiA3IDEgMSAxNyAxMyA2IDExIDEwIDggNSAxMiAxNSA2IDE1IDEwIDEyIDQgMTggMSAyIDggMTEgMTIgMTYgMTAgMTIgMTggMTEgCisxNiAxMiAxMSAxNyA2IF4KKzM0IDEgNCA3IDEzIDcgMTAgNyAxMCA2IDEgMTIgNyAxOCAxMSAxOCAyIDEwIDE1IDEwIDE0IDggMTggOSA5IDEyIDEyIDMgMTMgMTIgNiAKKzQgOSAxNyAxMyAxNyBeCis0MCAwIDUgNyAzIDIgMSAxNyAxNCA0IDE2IDYgMTMgMSAxMyA2IDYgMTAgMSAzIDE4IDMgMTEgNyA5IDUgNyAxMSAxNyAxIDkgMTYgNSAKKzE1IDEwIDE3IDMgOCAxNSAxNyA4IDEyIF4KKzQwIDAgMTEgMyAxNSAxNyAxMSAxIDEgNCAzIDE0IDE4IDQgMiAxOCA4IDE1IDYgNCA2IDMgMTUgMTEgMTYgMTAgMTcgMTcgOSA2IDMgMiAKKzYgMTYgNCA5IDEyIDYgOCAxIDExIDE3IF4KKzM3IDEgMiAxOSAxMiA4IDE2IDE0IDIgOSAxNiAyIDYgNiA3IDkgMTAgOSAxMSA5IDE0IDExIDE1IDUgMTYgOSAyIDE3IDIgOCAxNSA4IDQgCiszIDE0IDE0IDE2IDE2IDEyIF4KKzM3IDEgMTEgMTAgMTYgMTIgMTEgNyAxNCAxNCAxNCA2IDEwIDEwIDEgNiAxMyAxOSA1IDYgNCA3IDEyIDEyIDEwIDUgMTAgMTUgMTUgOCAKKzUgMTMgMTcgMTMgNSA2IDE0IDEgMTkgXgorMzggMSAyIDYgNSAxNyA5IDExIDE4IDE4IDggNiAxMyAxNSAzIDMgMTUgNSAxMyAxOCAzIDIgNSA1IDE0IDcgMTMgNCAxNyA3IDIgMTcgMyAKKzE4IDE1IDcgMTUgMTYgMTggMTEgXgorMzggMSAxMiA4IDYgMyAxNyAxMiAxMyAxOSAxNSA5IDcgMTcgMTYgMTUgMyAxMSAxMSA1IDIgMTMgMTkgMTYgMiA0IDE2IDcgOCAxIDIgOSAKKzE3IDEyIDMgNSAxOCAxOSAxMSA5IF4KKzM5IDEgMTQgMTYgMTQgOCA5IDE2IDUgMSA2IDMgMTcgMTggMTYgOSAxIDE1IDkgMTAgOSAxOSAxIDMgMyAyMCAxMSAxMyAxNyAxIDE5IDggCiszIDQgMyA3IDEgMTQgMTkgMTkgMTkgXgorMzcgMSAxOCAxMyAxMSA1IDE4IDQgMTkgMTAgNiAxOSAxMSAxNyAxMCAxMCA3IDkgMTMgMTYgOSAxMCAxOCA0IDEyIDUgMTYgNSAyMCAxMiAKKzMgOCAxMCAxIDE4IDEgNiAyMCAxNCBeCiszNiAwIDggOSA2IDEyIDExIDcgNyAzIDE3IDEzIDYgMjAgMTcgOSAyMCAxNiAxMCAxMiAxNyA4IDExIDggMTEgMTAgNSAxMCAxNCAxOCA4IAorMTkgOSAxMiAxMiAyIDIwIDE5IF4KKzM5IDAgMTIgMTYgMjAgMyA5IDkgMTkgMTcgMTMgMTMgNCAxNyAyIDExIDcgMTQgMyA2IDE2IDEzIDEwIDEzIDUgMTYgMTAgMiA4IDIgMTcgCisxOSA0IDE3IDcgMTkgNiA5IDE1IDE1IDYgXgorNDMgMCA3IDIgMTggNSA3IDE4IDUgMiAxNSA3IDExIDEwIDkgMyAyIDE0IDE5IDMgMTEgOCAxOCAxNSA1IDMgNSAxMiAxNSAxNiAxMCAxNyAKKzcgMTkgMTYgMiAxIDE2IDYgMyAxOSAxMiA1IDE4IDE2IF4KKzQ5IDEgOSAxMSAyIDEgMTIgMTEgMTQgMTIgMTQgMTAgNCAxMSA2IDggMTYgNyA1IDExIDIwIDggMTcgNCAxNCA0IDE1IDMgMiAyIDQgMyAKKzIgMyAxNCAxNSAxMCAyIDEyIDcgMyA3IDIwIDIwIDE5IDEwIDIgMyAxIDEwIDIwIF4KKzM2IDAgMTkgMjAgMTIgNSAxOSAyMSA1IDIxIDExIDE0IDE5IDEgMTcgOCA5IDQgMTkgMyAxNyAxIDE0IDIxIDE0IDcgNiA1IDIwIDE0IAorMjEgMjAgNCA2IDIxIDcgMTEgMTIgXgorNDEgMCAxMiA5IDExIDYgMTYgMTggMTggMTAgMTEgMjAgNiAxMiAxMSA1IDcgMjEgMTkgMTggNiAxNSAyMSAxMCA0IDE0IDkgMTkgMTAgMyAKKzMgNSAxMyAxIDggMTIgMyAxMyA5IDcgMTAgMTcgMTQgXgorNDUgMCAxMCA2IDggMyAxNyAxOCAzIDIxIDE5IDYgMTcgMTUgNCA5IDE1IDkgMTUgMTQgNCA3IDE0IDggMTAgMTMgNCAxMSAxMCA3IDYgCisyMSAxIDE0IDUgMTEgNyA3IDIgMTMgMTMgMyA5IDEzIDggMTQgMjAgXgorMzkgMSAzIDcgMTggNCA5IDkgNSAxNSAxMyAxNyAxMCAxNSAxNiAyMCA4IDE5IDkgMTAgOSAxIDE5IDE0IDIxIDIgMTggMTMgMTAgNCAxOCAKKzE2IDQgMjEgMTUgMTAgMTggMTkgMyAxMiAxOCBeCis0MSAwIDE0IDQgMTMgMTEgMSAxMSAxIDEwIDIgMTIgNCAyMSAxMCAyMSAxOCA5IDIgMTYgNyAyMCA2IDcgMTIgMTkgMjAgMSAxMyAxMiAKKzEwIDggMjEgMTUgNyAxOSAxMyA2IDggMTkgMjAgMTggMTkgXgorMzcgMCAxMSAxOCAxIDE3IDE0IDE1IDIwIDE2IDIwIDggMiAxNyAxMCA0IDIxIDUgMTkgMTkgMTQgMjIgMjEgMTggMTMgMTQgMSAzIDEyIAorMTEgMTEgNCAyMiAxMyA1IDE4IDcgMjEgMjEgXgorNDggMCA5IDIyIDE5IDEyIDggMTYgNSAxNyA1IDkgMSAyIDkgNiAxMiA2IDEgNyA0IDMgMTUgMSAxNCAxIDEyIDMgMTAgMiAxMCAxNCAyMSAKKzEzIDE3IDYgNiAxNyAxIDIxIDIgMTQgMTYgMTcgOSAxMSAyMCAyMSAxMSAxOCBeCis1MCAxIDEyIDggMjAgMTMgMiA5IDIwIDkgMTQgMTAgMSAxNiAyIDIyIDYgNCAxNiAxNCAxNSAxIDEyIDQgMTQgOSAyMSAzIDMgOSA4IDIxIAorMTUgMTQgOCA0IDE0IDQgMiAzIDggMTIgOCA2IDEgMiAxOCAyMCAxNSAzIDE5IDEwIF4KKzQ0IDAgMTAgMjAgMTQgNiAzIDQgMjEgMSAxMiA0IDE4IDIgNiA3IDYgOSAyMCAxNCAxMCAxMCAxOSAxNyAyMSAxMiAxNSAxNyA3IDEwIAorMTEgOCAxMCAxMiAxIDE5IDE5IDkgMTggMjEgNCAxOCAxMSA5IDIyIDUgXgorNDcgMCAxNSA4IDE1IDMgNSA2IDIgMTkgMTIgMTcgNCAyMCA4IDExIDIwIDIgMTggNCAxNiAyMCAxMiA5IDkgNiAxNiAyMSAxNiAzIDE2IAorMTggMyAxOSA1IDE2IDIgNCAyIDEyIDExIDE1IDExIDE0IDE3IDIgMTAgMTggOCBeCis0OCAxIDUgMTMgMyAyMSA1IDMgNiAxOCAxOCAxMCAxIDIxIDIxIDcgMSAxMyAxMiAxOSAxIDE0IDYgOCAyMSAxOSAyMSAxMSAxOSAxMyAyIAorMTMgNCAxIDEwIDIyIDE2IDQgOSA0IDEwIDE2IDMgNyAxNSAxMSA5IDEzIDE3IDEyIF4KKzQ1IDAgMTQgNyA2IDIgMjAgMyA2IDE5IDE5IDEwIDIgMjIgMTIgMTcgMTIgMSAyMCA3IDcgMTUgMjAgNiAxOCA4IDMgMTQgMjMgMTggMTUgCis0IDcgNSAyMyAxNSA3IDE0IDEwIDEwIDE5IDE3IDIgNCAxNSAxNyAyMSBeCis0NSAxIDE1IDExIDggOSAxNyA1IDEyIDE4IDE0IDYgMjAgMTcgMjEgMTIgMTYgOSAyMiA5IDIwIDE1IDIgMjIgMTEgMiA2IDExIDkgOCAyIAorNCAxNCAxOSAzIDIxIDIxIDIzIDggMiAxMSA0IDggNCAyMCAyMiAxMSBeCiszOCAwIDIxIDE4IDIyIDEwIDE5IDkgMTQgMTcgMjMgMjEgMTAgNyAxNSAxMyAxNiA1IDQgMTAgMTMgMTQgMjAgMjMgMTIgMjAgMjMgMTggCisxMCAxMiA4IDIxIDExIDYgMTIgNyAxOSAxNCAxOCAxNyBeCis0MCAwIDE4IDIyIDYgOSAyMiA1IDIzIDEzIDYgOCAyMyAyMCAyMiA1IDIyIDE1IDE5IDIwIDkgOSAxIDEzIDEzIDEwIDE0IDEzIDUgMjIgCisxNCAyMSA5IDIxIDE5IDE0IDE0IDQgMTggMTMgMTIgMTQgXgorNDggMSA3IDMgMTUgNSAxNyAxNCAyMyAxNCA1IDE3IDIyIDExIDEgOCAxMyAyMyA2IDIxIDMgNiAxMSA3IDIzIDggNiAyMSA0IDQgMjIgCisxOSAxMyA4IDUgMTkgNyA1IDIzIDEgNCAxOSAxMSAyMyAxMSAyMSAxNCAxIDMgMjEgXgorNDMgMCAyMiAxNCAxMSA3IDE4IDE2IDE3IDI0IDEyIDEyIDMgMTMgMTkgMTYgMjIgNCAxNiA0IDYgMjMgOCAxOCAxMSAyIDMgMjAgMjIgOSAKKzIxIDggMjMgMSAyMyAyMCA3IDE2IDEzIDIzIDQgMTMgMyA3IDIyIF4KKzQ3IDEgMjMgNiAxMyAxOSAyIDMgNyAyIDkgOSAxNSA2IDEzIDQgMjIgNiAxOSAyMCAxIDkgNyAxNCAxIDE1IDMgMjMgMjQgMjIgMTggMTIgCisxMiAxNyAxOSAxMCA4IDExIDIyIDEyIDEwIDIgMjAgMTUgMTggMTcgMTggNyAxOSBeCis0NyAxIDEyIDIxIDYgMTIgNCA3IDE4IDE3IDMgMiAxNCAyNCAxNCAxIDIzIDEgMTEgMTUgMTAgNiAxOCAyMCA3IDEgOCAxIDE2IDYgMjAgCisyMyAyMyAyMSAxMCAxMCAxMiAyNCAxMCAxMSAyMyAyIDEyIDIzIDkgMyAyNCAyNCAxMCBeCis1MiAwIDE0IDEwIDE4IDE1IDE0IDUgMTYgMTEgMjIgMiAxNSAyNCA4IDIyIDEgNCAyNCA5IDEwIDE1IDMgOSA1IDQgMTcgMTUgOSAxMiAKKzE5IDE5IDEgMyAxMCA2IDggMyAxNyA4IDE4IDI0IDE5IDMgNCAxNSA0IDkgMiAyNCA1IDIwIDEzIDEzIF4KKzQyIDAgMjAgMTcgMTkgMjIgMTMgOCAxMCAxOSAxNSAxMSAxIDE0IDE3IDIwIDIyIDEwIDcgMTEgMTYgOSAyMSAyMiAxNyAyMyAxMiAxNSAKKzQgMjQgNyAyMSAxOCAyIDIxIDE2IDEgMTkgMTggMjAgMTEgMyAxNSAxNyBeCis1MCAwIDE4IDEgNiAxNCA1IDUgNSAxOSAxMyAxMCAyNCAxOSAxNiAyNCAxNSAxMyAyIDE5IDE1IDI0IDIxIDE3IDQgMTMgMTcgMSAxIDkgCisxIDEwIDIgMTggMSAyMSAxOSA1IDE4IDEyIDIgMjIgMTYgMjMgMTUgMTkgNiAxOCA5IDEgMjMgNSBeCis1MSAwIDIxIDEzIDE0IDExIDE4IDEyIDEzIDMgMTkgOSAyMCAyMiAyMCAyIDExIDEyIDYgMSAxMiAxNiAxOCAyIDkgOCA0IDMgMTEgMTcgCisxMSA1IDQgMTkgMTYgMTEgMjMgMTMgMTggMSAyMCA4IDIgMTYgMTYgMjEgNCAxOSA1IDUgMjAgMjQgMTYgXgorNTMgMSAyMCAyNSAxNyAxMSA4IDQgMTkgMjUgMTcgNyAxNiAyMSA2IDQgOCAyIDE1IDkgMiA5IDE5IDMgNiAzIDMgMTAgMjUgMTMgMTUgNyAKKzggMjAgMjEgMTIgMTAgMTIgNSAyNCAxMSAyMCAzIDEzIDEzIDE2IDkgMTMgMTAgMyA5IDE2IDMgNyAyNSBeCis0OSAxIDkgOSAxNCAyIDEzIDE3IDI1IDIgMTggNSAxOSAyMyA5IDI1IDkgMTAgMjMgMTIgMTIgNyAxMyA4IDE1IDcgMSA2IDIxIDIgOCA3IAorNiAxNiAxNCAxNCAxMiAxNSAxMyAyNCAxMCAxNSAxMSAxMCA4IDE0IDE1IDIxIDI1IDIxIDI1IF4KKzQ3IDAgOSAxOCAyMCAyMiAyMSAyMCAxMSAxNCAyMyAyMiAxMCAxMyAxNCA4IDE5IDEyIDIgMTEgMjAgMjMgMTMgNCAxMCA2IDUgNyAyMyAKKzExIDMgMTYgOCAyMSA0IDggMTggNSAxMiAxNCA4IDYgMjAgMTkgMjQgOCAyMyAxNyAyMyBeCis0OCAxIDcgMTkgMSAxOCAxIDE0IDIyIDEzIDE0IDUgOCAyMiAxOCAxNCAyNSAxNyAxMSAxMiAyMiAyIDEyIDEyIDE2IDEyIDEzIDE4IDE3IAorMTIgMTcgMTQgMTggOCAyNSA5IDIzIDUgMyA4IDE0IDI0IDE3IDcgMyAzIDIzIDE3IDIyIDE5IF4KKzUxIDEgMTkgMTcgMTYgMjIgMjQgMTQgMTYgMjAgMjMgMjAgOSAxOSAxNiA3IDEyIDE2IDUgOCA5IDcgMTAgMjEgMjQgMTAgMTEgMTkgMSAKKzIxIDE0IDE0IDE5IDMgMjIgOCAxMiAyMCAxIDE4IDUgNiA1IDEyIDE0IDEgMSAxMSA5IDIyIDMgMjQgNCBeCis1MiAxIDYgMSAxMSAxNiAxIDEyIDggMTEgMTEgMTcgMTAgMjIgNyAzIDEwIDIgNiA0IDI0IDE2IDI0IDE5IDQgNSAxOCAxMSAxMiA5IDIwIAorMjEgMjUgMiAyMSAxOCAxMCAyMCAyNSAyMSAzIDE3IDE3IDUgOCAyMiAyNSAxOSA4IDEwIDE5IDcgMTEgMTggXgorNDQgMCAyNiAxNCAyMSAyNSAyNSA0IDkgMTMgNSA4IDkgMjEgOCAxMiAyNiAyNCA5IDI0IDE1IDEgMjMgMjIgMTYgMTQgOCAyMiAxNSAxOSAKKzI0IDIwIDcgOCAxNSAyNCAxMiA0IDQgMjMgMjEgMTMgMTkgMTUgMjEgMTIgXgorNTkgMSAxNSA3IDMgMjEgMjAgOCAyMiAxNCAyMyAyNiAxOSAyIDEwIDE4IDMgNSAzIDEgOSAxNSAxNSAzIDcgMTMgMjMgOSA3IDEgMTMgCisxNyAxNCAyNSA5IDE2IDIgMiA2IDEzIDcgMTkgMjUgMTcgMSA1IDIxIDIgNyAyMiA1IDYgMjUgMyAxMiAxOSA2IDIgNCAyNCAxNyBeCis2MCAwIDkgMTggMjAgMTkgNCAxMSAxNCAxIDYgOCAyNiA2IDkgMjIgNCAxMCAyIDcgMjEgOSA4IDI0IDI1IDE0IDIyIDEyIDIyIDMgMjMgCiszIDMgMjAgNiAxMSAyMyA2IDEgNyA1IDE4IDUgMTUgMjUgMjYgMSAxIDEwIDExIDExIDQgMTIgMTEgMjAgMyAxNCAyIDMgMiAyMyAxNSBeCis0OSAwIDEyIDE3IDI0IDExIDggNiAyNCAxNiAxNSAyMiAyMSAxNCA2IDEyIDIwIDE5IDUgNSAxMiAxMSA2IDIzIDIgMTYgMjMgNyAyNCA2IAorMjEgMiAxNyAxNyA1IDI1IDExIDI1IDIwIDI1IDI0IDE4IDYgMTIgMTkgMjUgNyA2IDUgMiAyNSBeCis1NCAxIDEyIDE2IDEgMTUgNyAxIDI2IDE5IDE5IDEzIDIwIDExIDE3IDYgMjAgNSAyNCAyNCAxIDIxIDExIDkgMjAgMjEgMTUgMTAgMTkgCisyNiAzIDIgNiA3IDEyIDkgMTAgOCAxNCAxMCAxNSA1IDE3IDggMjEgMSAyMCAyNSA2IDE5IDggMyAyMiAxNiAxNiAyMCBeCis2MyAwIDE3IDEzIDExIDEwIDE3IDE1IDEyIDYgMTMgMTQgMTcgNCAxMiAxMCAyNCA1IDEzIDI0IDMgNSAyIDUgMTEgMTQgOCA1IDEwIDE3IAorMTYgOCA0IDE0IDIxIDE1IDMgNiAxNyAyNSA4IDIgMyAzIDE5IDEwIDEzIDIyIDIyIDggMiAxMyAyNSAxNyAyIDEgMTkgMSAxNCAyMCAyIAorNSA0IDE1IDI0IF4KKzQ5IDAgMTQgMjAgNyAyNSAyMCAyNiAyMCAxNiA3IDE3IDE3IDIyIDEgMTMgNiA1IDEgMTggMTQgMTUgMjMgMTUgMTAgNSAxOSAxOCAxOCAKKzI2IDEyIDEzIDMgMjUgMTIgMjEgMTYgMjQgNCAxNiAzIDYgMjYgMjYgMTAgMjAgMTMgMSAyMCAyNCAxNSBeCis1NiAwIDMgOCAxNCA1IDUgNyAxMSAxMyAxMSAyNiAxMSA0IDI2IDE3IDIwIDE5IDExIDEwIDMgMTAgMTQgOSA2IDkgNyAxNiAxMCA0IDQgCisxOSAxOSAyIDI2IDEzIDE5IDE3IDE1IDI0IDE1IDQgMjEgMjIgMTMgMTMgMTIgMjIgMiAxNCAyMCA1IDE4IDcgMTcgMjQgMjAgMjAgXgorNTggMSA2IDE3IDkgMjAgMiAxMCAxOSAzIDIyIDQgMSAxMSAzIDUgMyAyMSAxMSAxNSAxMiAyMyAyNiA1IDIgMjcgNiA1IDE2IDYgMyAyIAorMjMgNSAzIDIwIDIwIDQgMjQgMiAxOCAyMSA3IDE0IDEwIDI3IDIzIDYgMjQgNiAxOSAyMyAzIDkgMjIgMTYgMjEgMTcgMTkgMjMgXgorNTggMSAxNyA3IDIxIDE5IDYgMTYgMTUgMTUgMjAgMTQgMiAyNSAxOSAxNCAxOCAxOSA3IDkgMSAxNCAxMSAxMCAxNiAzIDIzIDE0IDI2IAorMTAgMTEgMSAxOCAxIDEyIDI0IDE5IDE5IDEgNyAyIDMgMjQgNyAxMiA5IDIgOCAxNiAyMCAyNCA1IDI2IDI2IDQgOSAyIDcgMjUgMTcgXgorNTQgMSA4IDEyIDE4IDE0IDI2IDcgMTcgMTggNCAyMCAxIDE2IDE0IDIxIDI2IDQgNiA4IDI0IDExIDI1IDE1IDI0IDE2IDIzIDQgMTAgCisyMyAyMSAyNCAxNSAxMCA5IDI2IDcgMTQgMjQgMjEgNiAyMCA1IDE3IDE2IDE3IDEgMyAxMiAxIDQgMTMgMyA5IDIxIDI2IF4KKzU2IDEgNyAxOCAxMSAxIDE5IDIwIDIzIDEyIDEyIDI3IDEzIDEzIDE1IDE2IDEzIDEgMTYgMTUgMTIgMjYgMyAxNiAxNiA4IDE3IDEzIAorMjEgNCA2IDUgMTkgMTQgMTYgNCAxNiAxMSAxNCAxOCAxOCAyNyA5IDEzIDIxIDMgMjYgMjIgMyA3IDYgNCAyNiAzIDE1IDggMjUgMjEgXgorNTAgMSAyMCAxMyA5IDExIDIwIDYgMTEgMjEgMjcgMjUgMjAgNyA0IDE4IDI2IDE2IDI3IDUgMTIgMTkgNyAyMyA2IDI1IDI1IDIgMTEgCisxMyAyNSAyMSAxOCAxNyA2IDEyIDE0IDEzIDI0IDExIDE0IDE5IDI2IDI3IDI1IDYgMSAxNSA0IDcgMjcgMTUgXgorNTEgMCAxNSAxNiAyNiAyNyAyMyAxNCAxMiAyOCAyMiAxNSA4IDE5IDIgMjAgMTMgMSAyNCAyIDI1IDEgNiAxOSAxOSA4IDExIDI0IDI0IAorMjEgMTMgMjcgNSAxMSAyOCAxNyA3IDI1IDYgMjMgMjQgMTQgMjUgMTIgNSAxMyAyNiAyIDUgOCAxMCAxNiAxNyBeCis1OCAxIDUgMjYgMTggMTkgMjEgMyAxMiAxMSAxMyA0IDE0IDIyIDIyIDE0IDE2IDEzIDMgMjIgMTYgMjMgNSAxOSA2IDEzIDEwIDI2IDE3IAorMjcgMjYgNCAzIDI1IDYgMTQgMiAzIDUgNyAyMyAxMSAyMiA4IDI1IDIgOSAyNSAxOCAxNyA4IDIgMTQgNCAxOSAxIDUgMjcgMTMgMjQgXgorNTMgMCAyIDI3IDI4IDIgMTcgMjMgMTAgMjcgMTggMjYgNyAyMiAxNiAzIDI3IDEgMjYgMjEgMjggMTAgMyA2IDIgMiAxMCAxNyAxMyAxNiAKKzYgMTcgMjEgMjMgMTMgMjAgMjIgNSA2IDExIDEyIDEyIDggMjMgMTMgMTcgOSAyMyAyMCAzIDI4IDI3IDEyIDE3IDIyIF4KKzU5IDAgMjggMTkgNSAyMSA0IDI3IDggMSAxOSAxNCAyMCA2IDcgOSAxIDYgMjIgMyAxOSAyNiAxNCA4IDYgNyAxOSAxNSAyMyAxIDE3IAorMTYgNiAyNiAxNCA1IDIyIDI1IDQgNyAxMCAxNiAyMSAxMCAxOCAxOSAyNCAxNiAyMyA4IDMgMTcgMjggMTggMTAgMiA1IDMgMjEgMjEgCisxNSBeCis1OCAwIDYgMjQgMSA0IDI0IDE4IDEwIDIyIDEgMjEgMTIgNSA0IDQgMjAgMjUgMjQgMjYgOCAyNSAxMSAyIDcgMjcgMjIgMTkgNCAxOCAKKzI3IDEwIDI4IDQgMTIgMjQgOCAxNiAxMiAxMSAxNiAxNyAyNSA4IDEyIDE2IDEgOSA5IDEwIDUgMjQgMjMgMTggNSAxNCAxOCA4IDQgMjggCiteCis2MSAwIDUgMTcgOCAyOCAxIDIyIDQgMTEgMyAyIDE3IDMgMTQgOSAyNyAxMyAxOCAyNCA5IDggNyAyOCAyNSAxNCAyMSAyNyAyNCA2IDE4IAorMTYgMiAxMiAxNSA5IDE0IDEwIDEgOCAxNyA0IDYgMTUgMjYgMTEgMTUgMiAyOCAyMCAyNiAxNiAzIDcgNSA4IDkgMjYgMTAgMTIgMjUgCisxMSAyMiBeCis1MyAwIDkgMTMgMjQgMTUgMjAgMiA0IDggMiAyMiAyMCAxOSA0IDE1IDE0IDI4IDEzIDI1IDEwIDEwIDEyIDI4IDI0IDIyIDI2IDI4IDE1IAorOSAxMSAyNiAxOSAyMiAyNyAyIDIxIDggMjAgMjMgMjYgMTIgMTAgMjEgOSAxNSAxMyAyNSA3IDI2IDEgMTMgNSA5IDIwIF4KKzU4IDAgMyA5IDIxIDIyIDcgMSAyMyAyOCAxIDIgOCAyMiAxMiAxOCAyOCA1IDE4IDE0IDcgMTEgMTcgMjAgMjAgNyAyMSAxMyA4IDI4IAorMjEgMjIgMiAxNiAyMCAxNSAyOCA5IDMgMjIgMTMgMTAgMjMgNCAxNiAxMSAxNCAxIDEwIDggMTQgMTQgMTUgMTggMTMgMTIgMjEgMTggCisyNSAyOCBeCis2MCAxIDI5IDIwIDIgMjkgMjIgOCAxNiAyMCA0IDEyIDkgNiAxMiAxNiAxNiA3IDkgMjAgMjkgMTEgOSA0IDEgMTUgMjUgMTYgMjkgMTAgCisyMiA3IDIgOCA1IDE4IDE0IDIzIDI0IDQgNiAyNiAzIDExIDYgMTIgMSA3IDE0IDI0IDE0IDYgMTAgMjEgMTYgMjMgMjkgMjUgNiAxNCAKKzE3IDI0IF4KKzY0IDAgMTIgMTAgNSAxMCAxNSAyNSA4IDE1IDMgNyAxMyAyNSAxNiAxNCAxIDI5IDIyIDI2IDE1IDI3IDkgMSA4IDggMjggNiAxMyA1IAorMTMgMyAxNSA1IDIzIDggMjMgMiA1IDUgNCAxNyAxMyAxNCA3IDE3IDEyIDI3IDMgMTggNSA3IDUgMjYgMTggMTUgMjIgMjggMTYgMTMgNyAKKzIgMjMgMTkgMjUgMTUgXgorNTYgMSAxNyA3IDE2IDI1IDIzIDExIDExIDE1IDIgMTMgOSAyNiAyIDI0IDI2IDcgMjggMTEgMiAyOSA3IDIyIDIzIDUgMjggMTkgMSAyNyAKKzI5IDEgMjQgMTEgMTggMjAgMyAxMyAxMSA3IDMgMTUgMTcgMjQgMSAxOCAxMyA2IDMgMjUgMjcgMTYgMjggMTggMjQgOCAyMyAyMiBeCis1MSAxIDI5IDI4IDYgMjggMTQgMTIgMjggMjcgMjIgNCAxNCAyNSAxIDMgOSA3IDExIDE0IDE1IDE2IDEwIDE5IDEyIDE5IDExIDIwIDEzIAorMjggNCAyNyAyOCA3IDI3IDEyIDQgMjggMjEgMTcgMjIgMjAgMTcgMTUgMTUgMjMgMjIgMTMgMTIgMjEgMjIgMjEgMjkgXgorNjQgMSAxMiAxNCAxMiAxOCAyNyA4IDcgNCA5IDE0IDE2IDE1IDggMTEgMjEgMjAgMTAgMTAgMjEgMjMgMjAgMiAxMSAyMyAxIDExIDEgNSAKKzMgMjMgMTYgMTUgMjcgMTQgNSAxNiAzIDIyIDIgMyAyNCAzIDE5IDI5IDQgNCAxMCA4IDIwIDE0IDE1IDEgMjYgMTIgMjcgMjUgNCAyOCAKKzIyIDExIDE5IDE5IDI0IDkgXgorNjAgMSAyMCA4IDkgNSAyNSAxOSAxNyAxOSAxNSA3IDI0IDI0IDIxIDMgMjAgMTYgOCAzIDE3IDI4IDE4IDI5IDkgMjMgOSAxMCAyOSA0IAorMTIgMjQgMTUgNSA4IDIyIDE3IDI5IDEyIDMgOCAyOSAxNSAyMSAyMSA0IDcgMjAgNyAxMCA3IDI2IDEwIDE2IDI0IDYgNyAxMiA4IDEyIAorMTUgMTcgXgorNjAgMCA5IDE3IDExIDI4IDEyIDI2IDI2IDYgMjkgMTMgMTAgMjAgNiAyMyAxMCA0IDMgMjYgMjYgMTQgMjAgMjAgMjUgMTQgMTMgMTUgCisyNCAxNCAxMSA0IDIzIDI3IDI0IDIwIDkgMTYgMTcgMjQgMTMgMTIgNiAxIDE0IDI2IDI1IDcgOCAyMSAxIDE5IDMgMiAyIDE3IDIxIDEzIAorNSA5IDIxIDExIF4KKzU0IDAgMjUgMSAyNyAyNCA2IDIzIDE2IDUgMSAyMCAyOSAyMiAyNSA5IDI1IDEwIDMgMjggMjggMjUgMTkgMTggMTYgMjQgMTQgMTUgNSAKKzI4IDEyIDI4IDI2IDI5IDIgMTUgMTUgOSA1IDE4IDE5IDIyIDEyIDE1IDQgNiAxNSAyNCAxNiA5IDQgMjYgMjUgMTggMjcgMTIgXgorNjEgMSAyMCA0IDI2IDEyIDMgMjIgMSAyMiAzMCAzIDI4IDEwIDkgMjQgMTQgMjkgNiAzMCAzIDEwIDIwIDE0IDYgMyAxOSAyMSAyMSAyOCAKKzE2IDE4IDExIDMwIDExIDIwIDMwIDEgOSA4IDExIDUgMTkgMTAgMjQgNCAyMiA0IDIgMjYgNSAxNSAyMCA4IDMgMTMgMzAgMTggOCAxIAorMjUgMjggMTkgXgorNTYgMSAyMCAxNSAyMSAxOCAxOCAxMiAxNiAxMyAyNCA5IDIxIDIgMjggNiAxIDIzIDkgMTggMjcgMjcgNCA5IDEzIDEwIDggMTQgMTYgCisxNSAxMiAxMSAxNCAyMSAxNCAxMCAxMSAyNSAxNyAxNyAzMCAyMSAxMyAyNyAyNiAyNiAyMiAxNCAxMyAxNyAyMSAxOSA5IDkgMjAgMjMgCisxMyAyOCBeCis1OSAxIDEwIDI4IDI0IDEwIDIyIDI3IDIzIDI3IDggMTcgMTQgNiA0IDIxIDI2IDE1IDEgOCAyOSAyNyA2IDI4IDE1IDMgMjcgMjUgMjUgCisxNCAxOSAxMyAyOSA4IDI0IDIgOCAyIDQgMTIgMTkgMTEgMTAgNiAyNiAxNCAyMiAyNCAzMCAxMCAxMSAxMiAyIDEyIDE3IDIzIDggOCAKKzEyIDI4IDEyIF4KKzU2IDAgMTQgMjggMiAxNyA0IDggMyAyNiA5IDIzIDIxIDMwIDMwIDIwIDQgMTMgMjggMjkgOSAzIDE3IDcgMTkgMzAgMjggMSAyIDIwIDkgCisxMiAyNCAxNSAzMCAyMCAyNyAzIDIzIDExIDYgMjkgMjUgMjMgMjYgMTcgMjAgMTAgMjIgMTUgMjMgNiAyNSA1IDQgMzAgMiAyOSBeCis2MyAxIDIzIDE1IDI3IDE0IDI2IDEgMSA3IDE5IDEyIDcgNiAyMCAxOCAxNCA0IDE1IDE3IDI4IDcgMTEgNyA4IDkgMjIgMTcgMTIgNSAKKzIzIDE4IDI1IDE4IDYgMTIgMjYgMzAgMTIgMzAgMTQgMyAxIDE4IDEwIDIwIDI3IDIxIDggNiAyNCAyNiAyMCAxMSAyNCA3IDIgNCAxOCAKKzE1IDE0IDMwIDE2IDE5IDE0IF4KKzUyIDAgMjcgMTUgNCAxOSAyNSAyOSAyOSA3IDE0IDE4IDkgMTEgOSAyNyAxMSAxNSAyOSA5IDI4IDIwIDIgMzAgMjYgMjEgMTcgOCAyOCAKKzE3IDIyIDI5IDI0IDggMTEgMTggMjkgMTUgNiA3IDI3IDI3IDE3IDI0IDE4IDIzIDExIDE5IDggMzAgNSAyNCAyMiAyNCBeCis2NiAxIDI1IDE1IDI4IDIzIDUgMTAgMjEgNSA4IDcgMyAxMCAxOSAxNyA2IDkgMTUgMjkgMTAgNyA0IDEgMTYgMjEgMTYgMjkgMTMgMTggCis1IDMgOCAxNSA4IDIxIDI5IDIwIDUgMjcgMiAxMyAyNyA3IDcgMzAgMiAxOCAyNiAxMCAyIDUgMjkgMjEgMTUgMjUgMjYgMjQgOCAxMiAKKzIwIDMgOSAxMCAzMCA3IDEyIDI5IF4KKzUzIDEgMzAgMjYgMjAgMTEgMjIgMTkgMjcgMiAxNiAxMCA2IDQgMjQgMTcgMjAgMjUgMjAgMTUgOCAyMyAyMyAyMCAzMCAxOCAxNiAzIAorMzAgMTUgMjYgMjMgMjggNyAyMSA4IDcgMzEgMzEgMTQgMjYgMTggMyAxIDI2IDI4IDE1IDI1IDExIDMxIDMgMjUgOSAyMSAzMCBeCis2NyAwIDIgNiAxNCA0IDkgNSAyOCA4IDE3IDIyIDEgNCA4IDcgMTAgMTQgMTkgMTAgMTQgOCAyNyA5IDI0IDI2IDQgMzAgMTEgOCAxOSA1IAorMjEgNyAyIDI3IDIwIDE2IDIwIDIwIDIyIDE0IDEzIDE2IDI2IDE0IDEwIDMgMjUgMjIgMjUgMjMgMjEgMTAgMTUgMTUgMjkgOCAxMyA0IAorMiAxMyAyMiAyMCA3IDQgMjAgMzEgMjMgXgorNjUgMCAyIDIgMjggMTMgMTkgMTQgMTIgMjMgMjcgNiAyIDE0IDIgMjIgNiAyNSAzMCAyOSAzMSAxMyAxNCAxNiAzMSAxMiAxNiAzMCA1IAorMTQgMzEgMTEgNCAxIDEgMjUgMjEgMTMgMjYgMjIgMjEgNSAyMiAxNCAyOSAxIDIxIDMgMTQgMzAgNCAyIDI5IDEyIDE1IDIzIDMgMTUgNSAKKzEgNiAyMyAyMiAxMyAxIDE0IDIzIF4KKzU5IDEgMjUgNSAxNSA2IDEzIDMgMjIgMTEgMjMgMzEgMjQgNiA1IDIwIDQgMTQgMyAyOSA4IDI5IDE5IDcgMjkgMjMgMjUgMjggMTkgMTEgCisxNSAyNyAyMSAxNCAxIDE5IDIwIDI2IDEyIDcgMTIgMSAxOCAxMyAyOSAyOCAyMyAyOSAxNCAyMyA3IDEgOSAyOSAyNCA1IDMwIDE4IDUgCisyNSAzMCBeCis1NSAxIDMxIDI1IDEzIDcgMjQgMjUgMjQgMSAxMiAxOSA5IDcgNiAyOCAyMCAxNCAyOCAyMSAxOSAzMSAyMCAyMCA2IDI0IDE4IDI3IDI0IAorNCAxOCAyMSAxIDMxIDE1IDEgMTUgMiAyNyA0IDI2IDI1IDQgMjMgMTkgMiAzMSAyMiAzMCAyMSAyMiA1IDI3IDEyIDMwIDI4IDMxIF4KKzYyIDAgMjcgMTUgMTggMTQgMjUgMTUgMTcgNyAyOCAxMSAyOCAyOSAzMCAxIDE3IDEyIDEwIDIgMTggMjAgMjEgMiAxMSAxMiA1IDQgMTIgCisyNSAxNCA1IDUgMjQgMjIgMTggMzEgMTUgMjIgMjkgMTEgMyAyMSAzMSAyMSAyNyAzIDI4IDcgMTAgMjUgMiAxNSAzMCA5IDMwIDcgMjIgCisxNSA5IDMgMjAgMjQgMTQgXgorNjAgMCAyOCAxNCAxOCA5IDI3IDE0IDIyIDI3IDMxIDEwIDggMTQgNyAxNSA3IDIwIDUgMjYgMSAyOSA3IDE3IDE3IDggMyAxMyAyNyAxOCAKKzggMzEgMjcgMjggMjIgMjIgMTcgMTkgMTggMTggMTEgMTkgMTMgMjUgMTAgMTkgNiAyOCA0IDMxIDIzIDEwIDE4IDI2IDMxIDUgMTAgMTMgCisxMiA4IDE1IDI3IF4KKzYwIDEgMjQgMjIgNCAyOSAyMiAzMSAyOCAyMCA0IDE2IDIxIDMgMSAxNSA1IDE1IDYgMzAgMyAyOSAyOSA3IDI3IDIwIDIgMjAgMzEgMjIgCisyNiA5IDI5IDE2IDQgMjYgMzIgMTcgMjAgMTQgMjggMTcgMTkgNiAyNCAxMSAyNiAyOCA1IDE4IDE1IDggMTYgMjAgMjEgNCA5IDEyIDQgCis4IDE3IDI5IF4KKzxECisKK0g+U0hTIFR5cGUgMiBTdHJpbmdzPEgKK0Q+Cis2OSAxIDUgMyAxMSAxNSAxMiAyNCAzMSAyMyAxIDYgMjggMiA4IDMxIDYgNyAzMCA1IDE5IDIzIDEyIDYgOSAzMSAxOSAxNyAyNCAyNSAKKzIyIDYgMTIgMTYgMyA3IDkgOSAxMSAyOSA0IDExIDIgNSAxMyAyOSAxMCAxMiAzMCAzMiAxOCAyOCAxOCAyNyAzIDMwIDQgNCAyNiA2IAorMTMgMzEgMTMgMiAxMSA3IDI0IDQgMTcgMjkgMTIgXgorOTUgMCAyMSAxOSAyMSAyMyAxMSA0MiAzNiAyIDEzIDQgMSAzMyAyMiAxNiAyNyA5IDQgMzMgMTYgMyAzMCAxNSAxMSAzMiAxMyAxNyAzOCAKKzMyIDkgMzggNCAzNiAxNSAzMiAyNyAxOSA0MiAxOCA2IDM2IDIyIDEwIDI5IDEyIDI1IDQwIDE1IDI5IDIzIDI4IDMwIDQgOCAxMSAyNCAKKzkgMTAgMzEgMjggNDMgMjMgMTYgMjkgMzMgNSA0MCAyNiAzIDE5IDEyIDM2IDQzIDUgMzUgMzcgNSAxNCAxMSA0NSAzNSAxNiAxMCA4IAorMzIgNCAxNSAzNSAyNiAyIDM5IDIyIDM3IDIyIDMwIDI5IF4KKzEwNiAxIDE4IDE0IDUxIDIgNiAzMiA1MSA5IDMyIDUwIDQ0IDQ2IDUxIDggMTEgNTMgNDUgNTUgMTYgMTAgMyA1MiA4IDIwIDIwIDQ2IAorNDYgMTMgMzIgMiA0NiA1MCA0MyAyNSA1NCA5IDMxIDI5IDIgNDcgMTUgMjkgMjQgNDUgNDQgMTggMzcgMTQgMjggMzkgMzYgNDQgNDcgCisxNiA1MCAxMCA0NCAyNCA1MyAzNSAyMiA0MCAyMCAxNSA1MSAyMiAxOCAyMiA0MiA2IDU0IDQ5IDM4IDIxIDcgMTMgMzAgMTYgNyA1MiAKKzE2IDIyIDEzIDM4IDcgMTEgNDQgMzMgOSAyNSAxMyAzNyA0MiAxNCA0NSA1MyAzMCAzOCA1IDI1IDUgMzUgMzggMjIgMjggNTMgXgorMTI3IDAgNTggMzUgNDMgMjggNSAyOCA2MyA4IDEyIDI1IDkgNDcgNTMgMjkgNjIgNyAzNyAyIDMgNDggNSAxMiA1NSA1NiAyOCAzNSAxMiAKKzYzIDYgNTggMjcgMjcgNDggNDQgMzUgMTQgMTcgMjIgNTYgMTAgOCAxIDE2IDE1IDQyIDYzIDE0IDUxIDU3IDE5IDQxIDcgOCA1NiA0NyAKKzM0IDUyIDIyIDQ4IDYwIDQzIDkgMSA1MiA0IDIxIDQ5IDYxIDE4IDUwIDIzIDEzIDQ2IDYyIDIzIDQ1IDYyIDkgNTYgMTggMjMgMzEgOCAKKzMwIDI3IDM2IDEzIDM4IDQgNTggNTMgNDcgMjQgMTggNDEgNTggMTkgMTIgMTggNTIgNDIgMjkgNDQgNDUgMjYgNjMgMzQgMzIgNDEgNjQgCisxNSAyNiA1NSAxOSAyIDQ5IDYgMzAgNTMgMTMgNTQgMTIgNTMgMzcgMTIgMzcgNDMgXgorMTQ4IDAgNjAgNCA1MSA0NyA1OCAzOCAxNyA2MyAzMyAyMyAyOCA0MyAxMiA2OSA3MCAzMyAxNyAxMiA1MCAxOCAxOCAzNiA0NSAyIDY3IAorNCA0NSAyMCA0IDMzIDM4IDI5IDQ1IDggMjIgNTggMzkgNzEgMzggMzIgNTMgMzUgMTkgNTMgMzEgMjkgNTEgMzUgNCA2MyAxOCAzMyAyNiAKKzQ3IDcwIDkgNjQgNjIgNjMgMzAgMTUgMSAzNSAyOCAxNiA0MCAyMCAxNCA1MCAzMyAxOSAzOCAzMCAyNyA1NSAxMCAxNiA0NiA0NyA3IAorNTUgMTIgNTMgMjYgNTYgMzMgMjkgNTUgMjUgMTcgNDggNDMgMjEgNDMgMTggMjQgNjMgMjcgNjggNDYgMzggMzMgMzUgMTAgMTggMTEgCisyNyA1IDkgNTggMzUgNzAgMzYgMzYgMzkgNDcgMiAxMCA2NiA0NyA1IDE4IDIxIDQ0IDcxIDUxIDU3IDMgMjIgNyA1NiA1NSAyOCAyNSAKKzE0IDQwIDE2IDI0IDQ4IDM3IDY2IDUwIDI0IDQ1IDE4IDM5IDUzIDU1IF4KKzE2NSAxIDE1IDYyIDM1IDI5IDE1IDQwIDE5IDc2IDY3IDQgNSA3MSA0NiA2MSAyNiA4IDc3IDQ4IDEgMjMgMTIgNjAgNDAgMjQgNDQgMzMgCisyOSA0MiA3MyA2NiA0OSA2MSAyMCAzMCAxIDU0IDUyIDQyIDM5IDY0IDIzIDY1IDM3IDI0IDIwIDExIDI2IDY2IDIyIDc3IDIyIDU3IDcgCiszOCA1NyAzMyA2MSA3MyA3IDY0IDEgNDkgMzUgNzYgMTQgMjcgMjEgNDUgNjggMzggNTggNzMgMTMgNzIgNDcgNzMgMzMgOCA2NiAyMyAKKzM4IDQgNTYgNzcgNDcgMTAgNzEgMTMgMjAgMzEgNDEgNiA1MSAzIDE4IDE3IDYxIDQ3IDE0IDQ4IDc2IDQ2IDI4IDM0IDQzIDEgNTYgNCAKKzI1IDcgNjUgNDEgMSAzNCAzNyAyMyA1OSA1OSAyNyAyNiAxMyAxNSAxNCA3NSA2MCAxNCAxIDI4IDU5IDI2IDY1IDYxIDE2IDIzIDE3IAorMjggNiAxOSAyIDM1IDQ5IDMwIDI5IDQ4IDIgNjMgNzMgNTkgMSAzIDc2IDQxIDExIDE5IDE4IDQzIDU0IDYzIDY3IDUxIDQgOSA3OCA2MCAKKzY2IF4KKzE4MSAwIDE4IDE5IDg0IDE3IDEyIDEwIDU3IDE4IDc3IDUxIDUyIDE2IDM5IDc0IDQ5IDUyIDYzIDM4IDcyIDIgMTUgNjQgODMgNjIgNDkgCis1NiAxMSAyNiA2OCA1OCA4MyAzMyAyMyA1MCA2MyA3MSA1MyAyNyA4NCAyMiAzOSA0MSA1MiA1OCAxMSA2NCA3IDYwIDQ1IDcwIDIyIDUgCis3MyAzOCAzMCAzMCA0OCAyMSA3NSA4MCA0MCAyMSA4IDUzIDkgMjYgMzAgMzQgODEgNzEgNzEgNTEgMjMgNzUgMzMgNDEgMjMgMzIgNSA4IAorNjYgNDAgNzIgNDAgMTYgNjYgNDUgMTQgNDggMzQgMjEgNDEgMjcgMyA1NSAyNyAzNyAyMyA0MSA2NSA0IDU3IDUxIDc0IDIyIDE5IDc1IAorNDIgMTYgMTkgNDYgMTYgMTAgNDggMjAgMTkgMzcgNDEgMTQgNTcgOSAxNyA1NSAzOCA1IDYwIDcgNDYgMjAgNDMgMzYgMzkgNTIgMjAgCisxMCA2MiA0NSAyMyA0NiA3IDM1IDc1IDI5IDcwIDM1IDM2IDM0IDI1IDEyIDE1IDg0IDI2IDEwIDYgNzEgMjkgNzkgMzMgMzIgMjUgNTkgCis3NiA4MiA2NCA1OCA3IDggMTkgNDEgNzQgMiA1MyA2NSAyNCAxIDU1IDUxIDM2IDIxIDc5IDcgXgorMTg0IDEgNjAgNjYgNjYgNiAzIDkgNzMgMTIgNyA0MCA3MCAxOCA3MSA3MCA2NSA1MSAxNCAxNCAyNyA1MCA5IDg3IDgxIDUwIDIyIDE5IAorNDAgMzcgMTYgNzkgMTIgMzQgMzcgNzYgODIgMTAgNjEgNyA4MSA0OSA2NyAyNiA0NSA4MiA1MCA4MSA2MyA0NSA2OSAzMSAzMSA3NiA1MSAKKzkgNTkgMzQgNTEgNTQgMzQgODMgMTAgMzMgNTEgODYgODEgODIgNjkgMTggOCAyMiA2NCAxOSA4NiA2MiA1OCAzMyAzNyAxNyAzNCA1IAorMjkgODMgNDIgNzYgNTAgNTQgNjYgMzkgOSAxIDM2IDQzIDE3IDY1IDYgMzUgNTYgNzIgNzEgODMgODggMTAgMSA4IDg3IDIyIDYgMjEgCis3OCAyNSA4OSA0MyA2MiA0MCA1NSA4NSAzMSA4OSA3NCA2MyA0NiAyOCAyNCAyNiAzMSAxNyA3IDggMjcgMTkgMTIgODUgMTcgMjAgMjcgCis3NyAxMCAyIDU0IDgwIDE3IDUyIDc0IDc2IDY5IDc4IDExIDIwIDgwIDQgMjkgMjQgODUgNzUgMTggMzkgMjMgNzAgODMgMjkgNTcgNjcgCis3MiA3MCAzMyA0IDE1IDQ2IDQyIDIgNjkgMTMgNTMgMzMgNjkgNjQgMzMgNjQgMTQgNDAgNjkgNTkgNzggNTQgXgorMTkzIDEgNjggNDMgOTUgNTMgMzggNTggNTUgMjggMjAgMTYgNjcgNDggMTcgODYgMzIgNDQgNjggNjcgMjggMTYgMTQgNzkgMjUgMTUgCis3MiA2NyA1MCA4MCAxOCAzMCAxMCA3NSAxIDYwIDQ1IDg3IDc4IDI4IDk1IDQ5IDYzIDcwIDU5IDI2IDYgNTEgNzMgNjAgNjUgMTggMjYgCis4IDg3IDUgNTggMzEgMjUgNTcgNDAgNDYgNzggNTcgMzQgNzggNjEgMzYgNjYgNTcgMzggODAgMjIgMzIgNjggNzEgMzAgNzQgMzcgODEgCis2NiA3NyA2NiA1NSAyIDUxIDI0IDkzIDYxIDQwIDY4IDQ1IDYxIDEyIDYzIDI0IDg5IDU5IDUyIDcyIDQzIDIwIDIwIDY5IDM2IDQwIDg4IAorNDYgOSA2MiA1NSA3NyA4NCAyMCAxOCA2IDc3IDE1IDUyIDM5IDc1IDMgMjYgNCA4NSAxNyA2MiAyOSAxMSA5MiA0NiA1OCAyOSA1OSAyOCAKKzQyIDgwIDcxIDk2IDIgNDkgODUgMzcgNjMgNCA2MSAxNCAyIDUzIDg3IDI1IDg2IDYgNzUgNzYgOTMgNDEgMzkgOTMgOTIgNDIgNTYgNDEgCis2MyAyNiAyOCAxOCA3NyAxMSA1MCA3OCA3OSAxIDEyIDEyIDkxIDI5IDEzIDU4IDUgNTYgOTIgNjYgNTkgNCAzOSA0NyA5NSA1IDUgNjIgCiszMyAxMyA4MCAyNyBeCisyMDMgMSAzNSAyOCAxMSA3IDIwIDcgMTcgMyAzIDMwIDg5IDEzIDY1IDU2IDY2IDYzIDIyIDgyIDE2IDMxIDU1IDU2IDc3IDkxIDkxIDcxIAorMTAxIDEzIDEwIDg1IDEwMSA5NSAxNyA5OSA5OCA5MSAzMyAxNCAyMCA0OCAzMiA3IDY0IDI5IDM4IDM1IDI1IDQgOTUgMjMgMzQgMSA4NSAKKzgxIDIzIDMxIDk2IDcxIDg0IDUwIDE1IDc5IDQ3IDI1IDUxIDQ1IDM1IDY2IDE5IDYxIDYwIDkgMzEgOTMgNjQgNzAgMzAgNDIgODYgNTMgCisxIDcxIDQ2IDQyIDIyIDM4IDk2IDEwIDk5IDM0IDc2IDI2IDU1IDczIDYzIDYzIDk3IDIzIDkyIDgxIDY0IDQ2IDEgMzAgMzEgMzUgODYgCis5MSA4OCA2NCA4NyAxNiAzNyA2OSA4NCA5NCA2MCAxMDAgMyA0NyA1MiA4IDcxIDg3IDU3IDI5IDc2IDQzIDE4IDQ1IDQ2IDE1IDY1IDEyIAorNDQgNDIgNjYgNjAgMTUgNjggMTkgNTggMzkgNjIgNzYgOSA5MiAxMDEgNTcgMzIgNCAzNCAxNSA0MSA2MiAzMiA4OSA3MSA0MyAzNSAzMSAKKzQxIDIxIDE3IDgyIDMzIDk2IDI3IDYyIDI5IDgyIDU3IDQ2IDYyIDE1IDI0IDk5IDM3IDgzIDQwIDUyIDQ2IDU2IDgwIDk4IDMgOTEgNzQgCis2IDI3IDcgNTggOTQgMTAgNDEgNzkgOTcgODQgNzcgNzQgMjYgOTkgMzUgXgorMjEyIDEgMjYgMTAxIDE3IDkxIDQ1IDk3IDgwIDU5IDEwMiAzMCA2OCA0IDg1IDkgNCAzOSAxNiAxOCA4NSA3MCAxMSA4NyA2MiA3MiA3OCAKKzM4IDMgNDEgNTMgODIgODIgMzUgMTggMTMgOTQgNjQgNTIgMzkgNzcgNTkgMjYgOSA2NSA0NiA2NCA5OCAzMiAyOSA4NiA3OSAxNiA2MyAKKzU0IDc2IDU2IDk4IDE2IDk4IDc4IDIyIDcyIDMzIDEwMyAxMDQgNTIgODQgMTIgNjUgMTUgODUgMTAxIDk3IDg0IDMxIDUxIDI2IDEwMCAKKzEwMCAzOCA4MCAxMyAyIDc4IDcgMjQgNDQgODQgMTAzIDI3IDcgMjggMTYgMzMgOTkgMjUgMTAzIDU0IDE0IDQyIDYyIDg3IDkyIDI3IAorMjIgNDIgNSA1MiAxMDAgODQgNzMgNzIgNjMgMjQgNDggNTYgNTIgMjMgNSAxNyA3NiAzMSAxIDk1IDU4IDQzIDYwIDUwIDYyIDMwIDIzIAorMzUgNzkgMjAgMzUgMyA3MiAzMiA0NSA1MSA4NyA0MSA4NCAyNyA3OSA3NyA3MCAxMDIgMTUgNTQgMTUgMTAwIDggNTIgNjkgMTA1IDMgCiszMCA4NCA0MiA5MyA2NiA4OSA2OSA3NCAyNCAzMyA0MiA5NyA0IDM4IDk5IDEwNiAxMyA5MyA2IDEwNiA3NCAxMDAgNTQgNDUgMjEgNTkgCis1NiAzNyA5IDUwIDMyIDc1IDc5IDMxIDc3IDkgNjEgMSA4IDY4IDYgNjAgODEgNyAxMDAgOTkgMTQgNjEgNDggMjUgNzMgMjYgNzAgNzIgCis5NCAzNCBeCisyMzMgMCAxMSA5OCAxMTAgODggMzUgMTEwIDM1IDY0IDQ5IDg4IDkzIDI4IDg1IDYgNzggNjUgOTAgNTIgMjQgOTcgNTEgMzkgNTEgNTkgCisyMyAxIDMgNDkgMzMgMTEgNzggMjcgMzUgNTUgNjQgNSAxMDIgNCA3MCAyNSA1NiA1OCAzOCA2NiAxMSAzMSA5NiA2NiAxMDQgNTkgNDEgCis4NiA1OCAyOSA3OSA0MSA0MCA3MiA1MSAxMiA5MiAzNCA1MiA0NCA2OSAxMDQgMjEgOTcgODkgOTYgNDggMjEgNCA2MSA0MCAyOCA2NyAKKzM0IDIzIDg1IDQ0IDIyIDYyIDUyIDMzIDg0IDIzIDMwIDczIDc0IDQgNzkgMTIgODEgNDcgODAgNTMgNDcgODkgNDAgMTkgODAgNjIgMzQgCis2MSAyOSA0MSA5NSA0MyAxIDcwIDYzIDU1IDUzIDE4IDE5IDEzIDQ4IDEwIDE5IDg5IDQ5IDQgNTIgNTMgNTYgNzYgMTAgOCAxMDQgNzcgCisxNSAyOCAzOCA3NSAxMDkgMyA4NSA5MCA4IDQwIDggOTMgOTAgNDMgMzkgMTQgNjAgMTcgMzYgNzggNTYgMTA1IDgwIDM1IDc1IDM2IDU4IAorODIgNTAgMTAwIDk4IDQ1IDc0IDEzIDY2IDk1IDcyIDcxIDk1IDM0IDE0IDk4IDcyIDMzIDM4IDM3IDUyIDYgMTQgMTA3IDU5IDMgMjkgCis2MSA2NyA5OCA5MiA1IDkzIDE3IDk4IDM2IDg3IDQxIDc1IDcxIDU3IDg4IDE3IDI1IDkxIDg0IDMgNTggMjAgOTIgNjkgNTEgNTAgMzYgCiszMSAxNCAyNSAxOCAzMCAxOCAxIDQxIDEwNCAzMCA4MiA1OSA4NyA3MCAzNCA5NiAyOCA0NyA2MiA4MSAxMDMgNDggXgorMjM0IDEgNjMgOTAgMTA4IDEwOCAxMDIgNjQgODIgODggNCAxMTEgNzYgOTcgMjIgMSAxMDggNDEgMzQgOTEgMzMgMjAgMjUgMjQgMjYgOCAKKzgzIDExIDMxIDcgODUgMTA5IDEwNiA0IDEwNSA4NSA2OCAyOCAzMyA5OSA1MyA4IDE2IDEyIDExIDc0IDE3IDgzIDY2IDcwIDE2IDMwIDkgCis2NyA2OCAzNCAyNCA4MSA0NyA5MiA3MiA0NyAzNyAzMyAzOCA5MiAxNyA4IDI4IDg4IDIyIDYyIDY5IDMyIDg5IDc1IDMgNzIgOTYgODUgCisxMyAxMDUgMjQgMzggMzcgOTQgMTE1IDgzIDcyIDEwOCAxMTQgMjQgOTMgNzYgMTAzIDYwIDk5IDEwMiA5IDQzIDEwIDU5IDk1IDQ2IDMzIAorOTMgMTUgMjYgNjkgNDQgMiA4NiAxMDcgNTUgNDUgNjEgNjUgOTIgNjYgOSA1NSAzOSA3MCA4MyAyOSA5OCA2NyAxMyAxMTEgMTUgMjAgCiszMSA2MiA4IDIgNTEgMjAgMTkgMzMgNDQgMTQgMTE1IDcxIDExMiA5NyAxMCA0MSAyOCA1MyA1MSAyNiA1NyAxNSAzOCA5OCA1NSAxMDYgCisyMiA1NiAzMSA1MCA5NSAxMDcgMTEwIDg0IDcwIDEwIDEwOCA5NiA3MyAxMDAgMjUgMzYgNTUgODggNzEgNjMgOTYgMzAgOTAgOTYgNzkgCisyMiA3IDMwIDIzIDI4IDU5IDg5IDggNTEgOTkgNDcgODYgMzQgMTggNDMgNjUgOTggMTA0IDEwNyA0OSA3IDc5IDcxIDggNTcgMjEgMjkgCis4MCAyIDc0IDc4IDQ0IDU3IDkgNjEgMjIgMTMgNjggNTIgOTEgNzQgOTggNDMgMzAgNTggNjggOTUgMTAxIDcyIDEwMiA3NiA0MiA5OSAKKzYxIF4KKzI0OSAwIDI3IDExNyA0NSAxMTkgODAgMiA1OSA1MiA4IDc2IDIwIDk0IDEwMiA2OSA5NiA0MiA0NiAxMDYgNjcgOSAxMTAgODkgNzEgNjkgCiszNCAzMSAxNSA4NSAxNiAyOSAxMDAgODIgMzcgNjIgNjggOTUgMTA4IDQ0IDIzIDExNCAzNCAzNiA1NiA5MyAxMSAzMCA5NiAxMiAzMSAKKzY3IDE0IDExNCAxNCA2NiA3MCAzMCA4MSA0NiA1MyAxMTkgODUgNiAxMDQgNDcgOTIgNzIgNzAgNSA3MCAxNSAxMTUgNjggMTA1IDMzIAorOTcgMTMgODUgMTA2IDE0IDYxIDI5IDIyIDg2IDQ1IDU3IDY5IDkxIDM4IDM4IDI4IDY2IDEzIDYwIDk1IDEwMyAzIDE1IDUgMTEzIDM4IAorMjMgNjIgNSA2NSA5NCAxMDcgNzMgMTA0IDM3IDQ3IDEwMiAxMTcgMyA3OCAzNSA3IDk1IDU2IDc4IDQ1IDUyIDI4IDQ2IDQzIDM3IDMyIAorNTMgMTkgNTUgMjkgNDcgOTcgNzYgMTE1IDgzIDcxIDExIDQ1IDYyIDczIDk5IDExNiAyIDI0IDExNiA3IDI4IDQxIDIgMjkgMzcgNTIgCisyMyA1IDExOCA3OSAzMSA1NyA4OSA2MSAyNCAxMDEgNzggNTAgOTMgNzMgNDEgNyAzMyA0NSA0NyAyNCAxIDQ4IDczIDM2IDMgMjUgODcgCis0NiAyOCAxMDggNTQgNjggNTMgNjcgMTE5IDI4IDM2IDExOCAxMDQgNDIgODggMjcgMTEyIDQgNzQgODUgMSA2MyAzOSA5NyA3MSA3NCAKKzc1IDc2IDEwIDQ5IDEyIDc5IDExIDUwIDEwMyAxMTggOTQgMTE3IDExOCAzNyAyNyAxMiA5NCA2MCAyOCA1MSA0NyA4MiAxMTAgMTcgMTUgCisxMDUgMjMgNTIgNDMgMTIgMjEgMjIgODEgNDEgMTIgNzQgOTAgNDIgMTA4IDExNyA5OCA2NyA0IDY5IDg1IF4KKzI0MyAwIDc2IDgxIDI2IDEwMSAxMyA2OCA2MiAxMDYgODcgMTkgOTggMzIgODEgNjMgNzkgOTMgMzEgMTIxIDEyMyA3NSA1MiAxMSA2NiAKKzQxIDU0IDg3IDM4IDUgMTA0IDYyIDUxIDM4IDU1IDI5IDMxIDEyMCA0NCAxNiA0OCA5NCA0NiAxMDUgOTEgNjYgNzggMjcgNDMgNiA2NCAKKzIgNTUgNzkgNzUgODQgMTEzIDIyIDQgMTEzIDEwOSAzMSAzMyAxNyA5NiAxMSAyOSA2MyA5OCAxMDMgMTA3IDExNiAzNCAxNCA5IDk1IAorMzggMTggNTEgNzUgMzMgMTA5IDExOCA1NSA2NiA0IDc2IDcgNzUgNzAgODIgNzQgMjMgMSAyNiA2OSA0MCAxMTIgOTkgNDcgNjUgMzEgCis3MCAxMTkgNTIgMTAzIDg4IDg1IDg2IDI4IDE2IDEyIDc2IDI1IDIyIDc4IDY0IDIxIDg2IDI3IDYxIDc3IDcyIDEwOCAyIDE4IDEwNiAKKzExOSAxMjEgNTQgMTYgODUgNzIgMiA3MyAyNiA4OCA2NiA2MCA4MCAzNSAyNCAxMTcgNjMgMjQgNDQgNjcgNTIgMTIyIDExOSAzMyA3MiAKKzE2IDk5IDk4IDY5IDU0IDE5IDQyIDI4IDUzIDExNCAzMiAxMTcgODEgMTAwIDU3IDQ5IDEyMyA1NiAyMSA2OCA4MCA1MyA5NSAxIDQ1IAorOTUgMTA3IDk4IDg3IDEgMjcgMjQgOTkgMTE2IDE2IDY3IDEgMTEzIDkxIDg0IDI1IDQwIDI1IDcyIDMgMjggOTAgODcgMTEyIDgwIDE2IAorMTE3IDQ1IDc3IDM2IDkwIDEwNSA1OSA4OCAxMjIgNjQgMTA4IDEwOCA3MSA5OCAxOCA1MCAxMTUgOTMgMTA1IDc3IDM1IDYgNDYgNTUgCis0NyAxMDIgNCAyNiA4NyAxMTEgMTIwIDgxIDExMyA0IDU3IDEwNSAzIDg0IDk0IDExNSA2MSA3MyBeCisyNTUgMSA5MSA0NyA1MSA5IDU3IDkgNTUgOTQgNjEgNjEgNjggNDYgMTA3IDYgMzUgODEgMTE0IDc4IDk2IDc0IDE0IDg5IDczIDY3IDY3IAorNjkgMTEzIDEwNyAxMSA5OCAxMTMgMTA5IDIwIDkyIDE3IDY3IDcwIDg4IDU3IDEwIDEyNCA5IDYwIDEyMiA5MyA5MSA0NSA3IDE1IDI0IAorNTEgNSA5OCAxMTUgMjQgNDkgOTAgMTA0IDExNyA2NiAxMjggOTQgNjQgODAgMTIgNDMgOTEgNDYgMTExIDU5IDU4IDc3IDMwIDE0IDg4IAorNjAgMTIzIDY4IDQxIDQ0IDY4IDQwIDEwNCAxMTggNDEgNDMgOTMgOTAgMTA1IDkyIDE2IDEyNyAyNiA1NCAxMjUgMTE0IDc5IDcxIDI0IAorNDggMjEgMjUgMTE4IDQwIDEwMyA0OSA5MSA0NCA2NyA2NSAyNSAxMTkgMTA5IDE4IDQ4IDIzIDY5IDExMiAzOCA2MSA2NCA4NyA4NCAKKzEwNCAxMTkgMTEwIDEyMiA5MiAyMiAxIDggODMgMzQgMTAwIDMyIDYyIDQxIDQ2IDExMiAzNCAxMDIgNzYgNTYgMzkgNCAxMjcgMzAgMTMgCisxOSAxMTAgMTI0IDcgMTYgMTI4IDk1IDQgMTI0IDExIDEwNCAxMTYgMTI2IDQ5IDk1IDMgNTUgOTYgNzAgOTAgMTAxIDQgMTIyIDk2IDc1IAorMTE4IDM5IDEyOCA5OSA5MiAxOCA0MiAyMCA4NyA4MyAzNSA3NSAxMTEgNjEgNjcgNzEgMjggMTAxIDkgNTYgMzQgMTA1IDk1IDcxIDIzIAorNzMgNzEgMjYgNTcgMTUgMjMgNzYgNTUgOTkgODkgMTI4IDk4IDExNyA2OCA0MyA4OCA2MiAzOCA2MiAzOSAyIDgzIDM2IDE1IDI2IDYwIAorMTI4IDk2IDczIDc0IDEwIDEgMTIgNDIgMjIgMiA3NyAzMyAzMyAzMiA1NyAxMyAxNCA4MiA1NyAxMiAzOSAzIDU4IDgwIDE0IDg3IDg1IAorNDQgNjkgMTA5IDExOSBeCisyODMgMCAxMDIgNTUgNTMgNDEgNjAgODggMjUgNjcgNTggNzYgNDQgMjIgNjggMTE4IDEwOCA0MCA5NSA5NiA4MSA5MCA4NSAyOCA3NyAKKzE4IDExIDM3IDcyIDkzIDYwIDExMCAxMjQgMTE5IDk1IDEzMSA5MSAzNyAxMDkgMTI2IDggNzMgNjkgNzIgODAgMTcgODMgNSA3NiAyMCAKKzMyIDE1IDEwIDEgMTAzIDE4IDIyIDExNiA5OCA5IDUxIDEwNCAxMDIgNDQgMzMgMTUgMTIgMjQgMzEgODkgMSA2IDI4IDEwMSA4IDY0IAorNzIgMTA2IDMwIDUgNTIgODkgMTExIDM5IDEwOCA2NCA4NSAxNyA1NyAxMjQgMjIgMTA1IDc4IDExNSAzIDQwIDEwOCA2NiAxMDggNzcgCisxMjggMTAzIDQ0IDM1IDM4IDEzIDk1IDEwIDExMSA2MyA5OCAxMTcgNjEgNTEgMTI2IDY5IDk2IDcwIDcwIDU5IDM5IDEzIDk3IDMzIAorMTEyIDIgNzcgNyAxMjMgNzAgODMgMjkgNjYgNjcgNDkgNzkgMTkgMTA0IDExNSAxNCA2MCAyIDU1IDQwIDcxIDMzIDI4IDExNCA1MSA5MSAKKzE3IDQ2IDQ1IDEyOCA1NyA4NyA2MiAyNSAxMTUgMzggNTAgNTUgOTAgNzQgOCA1MSAxMDIgNzkgNDMgOTQgMzYgMTIyIDk0IDEyIDQxIAorMzYgMjUgMTA0IDkxIDI0IDcgOTkgODAgMzAgMTI2IDMyIDYzIDEyMiAxMDcgMTE0IDI3IDI4IDc5IDQxIDEyIDM1IDUxIDExNSAxMjIgCis3MCAyMiA3OSA2NSAyIDg4IDI3IDE3IDU5IDE1IDIzIDQ0IDU3IDUgNjUgNiAyNiA3OCA4MCAxMjUgOTMgODQgMTAwIDQ1IDIyIDEyOSAKKzY4IDM2IDExMSA3NCAxMTggMTEgNTAgNDIgMTIwIDQ3IDIxIDggODYgMTEyIDI2IDY3IDYwIDk5IDQ1IDkzIDQ3IDggMzggNTkgNTIgNTYgCisxMjQgMjAgODIgMTggMTE3IDI0IDE4IDQ2IDEwNiAxOSAxMTcgMjYgNDEgNDcgNDUgMTMwIDcgMTUgMSA0IDUgMTAwIDEwIDg1IDUwIDQ0IAorMTEgNDggOTIgMTE5IDEwOCA0MiAxMTggMTI1IF4KKzI3MiAwIDggNjEgOTkgNzAgOTYgMjAgODcgMTIzIDEzNCA4MiAyMiAyIDExMCAxMTggMzMgODYgNSA3IDUgOTQgNTYgMTUgNjAgOTYgNTQgCisxMyAyMiA1NSA5OSA0IDI1IDEwNSAxNyAzNyA2OSAxMCAzOCAxMTcgMTE3IDMwIDcwIDEzIDkgMTA5IDExNSA2MiA5NCA1MiA2NiAxMTcgCisxMDAgMTM1IDcgNzUgMjMgNSA4MSAxMTAgMzEgMTE4IDI5IDEgNjIgMTEgNDEgODggMTA5IDExOSAxMDIgMzcgMyAzMCAxMjMgNDcgMzEgCis1NiAxMzQgMjkgMTI0IDExNiAxMTggOTkgMjEgNTYgNzcgOTEgMjMgMzcgMTM1IDgxIDQ0IDUxIDY3IDk1IDUxIDEzMyAzMCA1NyA2NyAKKzExNiAxMjIgNDggMTAwIDcgMTMyIDk3IDEwNiA2OSA5MyA0IDk1IDEyNSAxMDIgMTAzIDExOSA4MSA1NyAxMzMgOTYgMzcgMTE4IDUwIAorMTE3IDExMyA4MSAxMjcgMTcgNDUgMTAzIDMyIDEyMSAxMjkgNjAgNDMgNjUgMTI3IDMwIDM2IDEzMiAxMTAgNTIgNTMgMzUgNzEgMTIgCis3NiAyMiA3MiAxMzAgMTEyIDk5IDc2IDI2IDIxIDczIDYzIDYzIDk3IDIzIDU4IDExNSAxMzIgMTE0IDEgMTMyIDMxIDM1IDE4IDIzIDU0IAorMzAgNTMgMTE4IDM3IDM1IDg0IDk0IDYwIDEwMCAzIDQ3IDE4IDExMCAxMDUgODcgNTcgNjMgNzYgNDMgNTIgNDUgNDYgNDkgNjUgMTIgCisxMCA0MiA2NiA2MCAxMTcgMzQgMTkgOTIgNSAyOCA3NiA5IDEyNiAxMDEgMTI1IDMyIDM4IDM0IDE1IDcgNjIgMzIgMjEgMyA0MyA2OSAKKzMxIDEwOSAxMjMgNTEgMTE2IDEzNSAxMzAgMTI5IDEzMCA2MyAxNCA1NyA4MCA2MiAxNSAxMjYgMzEgMTA1IDgzIDEwOCAxMjAgODAgCisxMjQgNDYgOTggMTA1IDkxIDYgNiAyNyA3IDU4IDEyOCA3OCA3IDc5IDYzIDg0IDc3IDc0IDEyOCA2NSA2MSA5NSAxMjEgMTcgMjQgMTIzIAorMTE3IDUxIDEyMiBeCisyODQgMCA0NCA3MSA0MyAyMCAxMjYgNTggNTMgNDcgOTggMTggMTkgMTE5IDkzIDI5IDcwIDM5IDk0IDExMiA0NCAxMTUgMTM1IDk4IDgyIAorMTAgNjcgMjkgMTAyIDExMyA2OCA4MCAxOSA3NSAxIDkxIDExNCA4NyA4MCA3IDQwIDM3IDg2IDEyMCAxNiAxMDQgMTM2IDExNyA4MiAKKzEzOCAzMiA2NSAxMTQgMTE5IDEzNyAxMjEgOCAxMiA0NiAxMjYgMjYgMTE5IDczIDEzMCA2MCA3NiAxMTMgMTAwIDE0IDEzMyAyNiAxMTYgCiszNCAxMjAgODAgOTUgODQgNTMgMTUgMjQgNDQgNTEgNCAxMCAyMyA3NyAyNCA5OSA2NiAzNyA1NCA2MyA0MiAxMzYgMjEgMzQgNzYgNSAKKzE3IDEyOCAxMDEgMSA1OSA0MCAxMTMgMTEyIDMyIDk3IDMxIDkzIDEwNSA3OSA5MSAxOCAzOSAxIDEwMyAxMzIgNTEgNjggMTI0IDExMSAKKzEzIDk3IDQzIDEyOCA2OSA4NCA4NSA3MiAxNSAxMiAyNiA4NyAxNiAxNiA5MiAxMDEgMTMgNzcgNCAxMTggODkgMTAzIDU2IDQyIDE2IAorNjAgNDQgMzkgMTI2IDQ2IDE4IDgzIDkzIDQxIDEwNSAzIDgyIDEwNiAxMTUgOTEgNiA0IDU0IDExNSAxNSAxMjAgMTA5IDExMyA0OCA0MSAKKzkgOTUgMjAgNjIgNjcgMTA1IDExMSAyNSAxMzIgNyAxMTYgNDYgMTM4IDQ0IDgzIDYxIDEyNCAxMzEgMzUgMTA3IDYgMTA5IDgxIDExNCAKKzY3IDQxIDEzNyA3NyA1NiA3NCA3MyAzNCAxMiAxNCA2OSA1MiAxMSA5OCA0NyA1NCA4MyA4MSA2IDEgMTUgODggMzUgMTM5IDgwIDgzIAorNDkgODkgMjcgNDcgMTMwIDkyIDEzMyA4NyA1MSAxMTIgNzYgNDkgMTA5IDQ5IDU3IDkzIDczIDIyIDExNyA1MCA2NCA1OCA5NyAxMzkgCiszNiAxMzEgMTExIDEzMyA1OCAzMyA4IDg4IDU1IDM4IDkwIDQ2IDMwIDExOCA1NyAyOSA4MiA3NCA0MSAxMTcgMzggNDYgOTQgOTIgNSAKKzEwNSAxNSAxMTcgNzAgMTAzIDY4IDYwIDEyMCA0OCAyMSAxMTAgODUgNDAgODEgNjYgXgorMjkxIDAgNDYgMTEzIDUyIDEzNCA3OSA3NCA2NCA1NyAxOCAyMyA5IDUyIDggMTYgMTAzIDU3IDEzOCA1OSA1OSA2NSA5MiAyIDcgMTMwIAorOTIgOCAzNCA0MCA4NiAxMzEgMTQwIDEwMCAxMTIgNCA0MiAxIDExMCAxMDggNDMgMzcgMTUgNjcgMTkgMzUgOTQgNjEgMTMwIDk4IDM1IAorODggMzQgNjUgMTA0IDU2IDEyNiAxMTggNTAgODcgMTAgODEgMTA5IDkwIDg2IDExOCAzMiA2IDExNCA4OCAzOSAzOCAzOSA2MiAzIDEyIAorMTM0IDcyIDEzNyAzNSA3NSA4MSAxMTUgMTA2IDE0MCAxMTIgMTEgMTIzIDQxIDEwMyA0NSA5NSA4NCA3MSAxMDcgMTMgMjYgMTEwIDk2IAorNjIgMTYgMTA5IDg0IDU5IDUzIDM4IDI3IDggMjggMTMgMzIgMTM3IDE3IDEzOCA0MSAxMjIgMzYgOTkgNjUgOTkgODMgMzYgMTEyIDI5IAorNDkgNzAgOTYgMTI2IDEzNiAxMzEgMTE2IDMgMTggMTcgMTI2IDE0MiAxNCAzNyAxNDEgMTQxIDEyMyA0MiAxMyAyMCA4MyA0MiAxMzkgCis4MyA1NCA0OSA1OCA0MiA3IDEzNyAyOSA0OCAxNiAxMjEgMTI3IDM0IDUyIDE0MCAxMDYgMTI4IDU4IDM2IDEyNCA4MyAyNCA2OSA1NCAKKzYxIDExMiAxNyA2IDk1IDk3IDI0IDU3IDg2IDEyNCA1OSA3MSAxMTkgNjcgMSAxMDkgNTQgNjggNDkgNTcgMTMyIDMyIDUgNzEgMTEzIAorNDAgODAgMTA0IDc1IDEwNiAxMzMgMzEgMTI2IDEzMCAxMDQgNjIgOSAzOSA0NCA2NiAxMTYgMTQxIDEzNSA5NiAxMzIgMTkgNDEgMTIxIAorMTI2IDEyNCA3NyA4IDQgNjAgODIgNiAxMDEgMTI0IDg5IDUxIDEyMyA0OCA0MCA4NSA3NyAyMSAxMTIgMTAgNjkgNjYgMTE1IDg3IDE2IAorMTA4IDMwIDg0IDY1IDgwIDEwMyAzMiAxMzEgMTM0IDczIDQ3IDEwIDYzIDM5IDUwIDkzIDM3IDEzNSAxMTQgNjkgNDggMzQgNTggMjMgCisyNyAxMzMgMzcgOSA0MCA5OCA0MSAxMTUgOTkgNzAgODMgMjkgNDIgNjcgMTMzIDU1IDc5IDgwIDkxIDEyMiAxMiAyIDExNSAxMTIgNDcgXgorMjkzIDEgMzMgMTMgOTkgMTM4IDEgNDIgODkgMTE4IDg3IDExMyA5OSAxMiAxMzQgMTQyIDEwMCAzOCA1IDU1IDc1IDE0IDExMCAxMDggCis0MiA2NCAxMzAgNzkgMTM4IDYyIDY0IDY5IDU3IDExIDEyMyAyNSA1OSAxNiAxMTEgOTQgMjQgNjUgMzAgNTEgMTE5IDQ4IDEwNyA5MiAKKzg0IDY5IDI4IDEzNiAxNDMgNTQgMjAgNiA3MCA0NyAxNDIgNjQgNCA2NSA1OSA3MyA5OSAxMzQgMTQ2IDEwMiAxMjUgMTE2IDU3IDEzNyAKKzEzNyA3MiA0OCAxMjggNzggNSA4MCA2MyA1NCA4NSAzMCAyMiAxMjkgNjggMjEgMjEgNzQgMjggMTI4IDEwNyAyNyA2MCAyIDkzIDk1IAorNzEgMzcgMTEgMzcgMTUgMzkgMTAyIDMgMTA0IDY1IDgwIDU5IDUyIDExMyAzNCAyMCA2NyA2MCAyNyA4MSAxMzUgNDYgMTA2IDEwNiAKKzEwMiA2OCAxMjggMTcgMTUgMTAwIDEyNCAxNSA0MyAxMzYgMTIyIDEwMCA2NyAxNDIgMzUgMTQgNTMgMTIwIDIgODkgOTMgOTkgNzMgOSAKKzEyMiAzOSA3NyAxNSA5NiA5MCA0MyA3OSAxMzQgNjAgOTIgMTA1IDU1IDk2IDMxIDExOSA3NyA5NyA3MiAyMyAxNDAgMzggMzAgNDMgODMgCisxMzYgODggMTA3IDExNyA3MiAxMDkgMTE4IDU4IDkxIDExOSA3MyA5NSAxMDAgNTkgMTM4IDEyMyA1NCA0OSAxNDMgNTAgMTMzIDY2IAorMTA2IDQ1IDgwIDg4IDQyIDkzIDUgNTkgNzcgMTAxIDc0IDExMCAxMDQgNDAgOTIgMTkgNzcgNzYgODYgMTAyIDEyOSAzIDE0NCAxMDEgCisxMzkgMTM0IDU2IDkwIDE4IDkxIDk0IDg1IDU1IDEwIDEzNyAxMSA1OCAxIDEwNyAxMTMgNzAgMjIgNyA1NiAyOSAxNDMgMTExIDggNDYgCis0NSAxMTYgMTIyIDEyOSA4OSA3IDEyMSA1MyA5NSAxNCA0OSAxMTggNjIgMTI1IDkxIDM3IDk3IDE1IDM1IDEwMCA2MyAxNDAgNjMgNTAgCis1MSA1OCAyNiAxMjcgNiA0NSA1OSAxMDIgMTIxIDExNCA4NSAxNDEgMTM1IDEwIDcyIDE5IDEwNiA2NiA2NiA0MSA1MyAxMyAzOCAxIDIxIAorMTAzIDUwIDEwOCA0NiAxMTkgXgorMjk3IDEgNDYgMzEgMTMyIDExMiAyOCA2MyAxMjQgOTcgMTI5IDQzIDQwIDcyIDk5IDEwNyAxMzIgMTM3IDk2IDEzOSA5OSAxNDUgMTIxIAorMTQ0IDExOCAzNyA4MSAzOSA5NCA2MCA1NSAxMDkgNDcgMTA5IDExMCA3NSA0MiAxMiAxMzkgMTM3IDQzIDEyOCAxMDYgMTA3IDE5IDEyNiAKKzEyIDEwMSAxNDggMTI3IDE1IDExNyAxMjUgMTI1IDYyIDk2IDEzIDc2IDcwIDk2IDEwMSAxMTAgMTM4IDggOTUgNzYgMTQzIDE3IDMyIAorOTcgNzkgMTQ5IDM5IDMxIDk0IDEyMyAyMSA0MSAxMzUgNTUgODQgNzAgMzMgMTM1IDExOCA1MCA2MiAxMjEgODEgMSA0NSAxNDQgOTMgCis2MCA1IDY0IDEzNyA4IDEwNSA5MSA4MiA2NyAyNyAxMTMgMTE5IDUzIDE4IDk4IDc5IDQ4IDg0IDMyIDEzNSAxMjggNSAxIDIwIDc2IDE3IAorODUgMTA4IDcyIDM2IDE0MSAxNDAgNDkgMTUwIDEwNSAxMDQgMyAxNDkgMTQgNTQgMTggMTQ4IDY0IDQ5IDEyNSAzNyAyOCAyOCAxMDEgCisyMiAxMDQgOTEgMzIgODIgMTE3IDEyIDExNCA2OSA1OCAyIDU4IDExNSA5IDEwOCA0NyA1OSA2NSAxNCA5MiA3IDQgODYgOTggMTYgODIgCis5MiA5NSAzOCA5NCAxMCAxMCA0OCA5NyAxMDQgNjYgMTE1IDk3IDE0MiAxMTUgMTIyIDExOSA0MCA5NyAxNiAzMiA0NyAzNCA4OCA4OSAKKzI2IDUwIDEyIDc2IDgwIDUxIDQwIDkgMTMzIDI0IDQ0IDQwIDEyMiA4NCAxMDggMjIgMTQyIDE0MCA5OSA0NCAxNSA1NCA4IDQyIDEyNSAKKzE1MCAxMzAgMjEgNzkgMTI0IDYyIDQ2IDExOSAxNSAyOSA5MSA1NyAxNTAgNDIgMTM4IDcxIDYxIDY4IDgwIDExNCA2IDEgNzAgMTIxIAorMTggMzUgMTEzIDU2IDg3IDg2IDEwIDczIDE0IDI5IDQxIDcyIDg5IDEgMTMzIDg3IDEwMSAxMjMgNTkgOTAgMTQyIDc3IDEzMyA1MiA3OCAKKzQ4IDM0IDEzOCAxMzQgMjcgMTcgNjAgMTMxIDE0NyA2MSA5MyAxNDggMzkgMTMyIDQ5IDYyIDcxIDM2IDkxIDQgMTM5IDQ5IDEwMCAxMjAgCis0MyAxMTMgMTQ0IDMwIDk0IDczIDEyNyA0MCAxMjUgXgorMzEzIDEgMzUgOTcgOTUgNzYgMTA1IDg4IDMyIDEzOCAzMCA2OSA2MSA0MCA0NyAyMSAxMDcgNiAzOSA4MSAxMTQgNTMgMTI1IDUzIDE0NyAKKzE0IDQgNzMgMTQ2IDk2IDk4IDEzIDEzNiAxMSA5OCAxMTcgMTM4IDE1MyA2NyAxNDYgNzEgOTkgODggNyAxMzkgMjQgMTMgMzUgNDcgOTcgCisxNDUgNzQgMzYgMTE5IDMgNTEgODQgNDggMTE5IDUzIDQ5IDE1IDc5IDE3IDEyMCAxMDMgMTQ4IDY0IDMwIDQxIDk3IDEyMCA3NSAxMTEgCis2MyA1OCAxMzEgMTM0IDE4IDEzIDEwIDQ4IDE4IDE2IDQ4IDQzIDE1IDU0IDE4IDQxIDQ3IDEyMiAxNDQgODAgOTIgMTQ1IDc3IDEgMzMgCis4OSA1NCA0NiA3OCA0OCAyMSA1NCA0MyA0MCA1MyAyNCAxNiA3MyA0MiA5NCAyOSA0NCAzNCAxNTEgMTUyIDIzIDEyMyAxMiAxNDIgMTQwIAorNDMgMzcgODggMjkgMTkgMzUgNzIgOTYgMTUxIDEzMCA2MiAxMTIgMzQgMzYgOTEgMTIwIDUwIDExMiAxMzggMiAxMDUgNjAgNjggMTM3IAorMTMxIDUgMTcgMTkgMTM5IDc0IDExIDEyMCA3OCAxNDkgNTggMTI4IDE1IDEwNCAxNiAxMjYgNzggMjAgNTcgMTM0IDcxIDQ5IDkwIDc2IAorMTA4IDEyNiAxMDAgNTQgNjggMzkgMTMyIDE1MyA0MiAxNDcgMTQ2IDEyNCA2MiA4NyAzNSA3NSA2MSA2NSA0NiAxMDAgODIgMTA1IDExMyAKKzMxIDYzIDUgOTUgNTQgNzEgNzcgMTI3IDE1MCA4MCAzNiAxNDQgMiAxMzAgNTkgNzQgMzkgMyAxNTIgMTIxIDEyMiAxOCAxMTcgMTIgCisxMTcgMTQxIDExOCAxMzUgNjIgMzYgNjkgNSAzOSA1MyAxNTAgNTIgMTUzIDE0MyAzMCA2NiA5NiAxMjYgMTMxIDU2IDEzNyA4IDcgODYgCisxNDIgMTQgNyAxMTEgMTQxIDkzIDEzNiAxMzcgMTM0IDQzIDEyIDg5IDIzIDQ0IDkgMTUyIDE0NiAxMjEgOTcgMTkgMzggMTEwIDkxIDY3IAorMTQgMzIgMTEwIDY2IDY4IDggMTMwIDg0IDczIDExOCA1OSAyNCA0MSA3MiAxMjEgMTUwIDU1IDM3IDEzOCAyNyAxMDQgNjYgMTI0IDkgCis1MSAxMDkgNDcgMTI1IDEwOSAxNDggOCAyOSA0NyA3MiAxNDYgMTQ5IDYxIDkzIDEwIDIwIDU0IDE1IDc2IDEzMyAxMjUgMTA2IDExMCAKKzY3IF4KKzMzMCAwIDIzIDkgMjYgMTM2IDI3IDUxIDExNSAxMjIgNDQgMTA2IDYgMTQ2IDEwOCAxMTMgODUgNTEgOCA5NiA0NyA1NiAxMzcgNjIgNTkgCis4OSAxNDMgNzEgMTQwIDE0IDg1IDE1NiAxMzkgOTkgMTU0IDMwIDUzIDExNSAzNSAxNDcgMTA4IDE0OCA1OCA1MiAyOCAxMDMgMTkgOTIgCis5NSAxNTIgMTUyIDEwIDExIDEzIDE1NSA2NyAxMSA4MyAxMDEgNjkgMTUzIDE1MiA0NSAxNDEgMTQgMTIwIDEyOSAxNDAgMTE5IDU5IDIgCis4OSA3MyA3MCA4MyAyOSAxNiA2NyA4MSAyOSAxIDU0IDY1IDk2IDExNyAyIDM3IDQ3IDEyOCAzMyAzIDg5IDEwOCA5OCAxMzkgNDkgNzggCisyNyAxMDMgMzkgMTE5IDk0IDEzMiA5MCAzOCAxMzIgNTUgNjUgMTMxIDkwIDU4IDIgNTQgMTAwIDY5IDExOCAyMiA0NCAxOSA3IDE0OCAKKzkzIDI1IDI5IDEyMyA4MSA2NCAxMzEgNTUgMzAgMSA4OSAzOCA5NyA4MiA2NCA5IDI4IDg2IDEyMyAxNTEgMTAgMTMzIDQwIDE1NCAxMDIgCis0IDExMSA2NSA5IDYzIDU5IDEyNCAxMTYgNzIgMTA1IDc2IDU3IDEzNyA5NyAzMiAxNDUgMTA4IDc4IDExMiA1MCA0MyAzNCA3NSAyMCAKKzIyIDEyOSA2OCAxMSAxMTggNzQgMTI1IDExOCA1NyAxNyAyMCAxMjkgNTMgNjUgNjEgMTQ0IDEgMTcgMTQyIDE1NiA1MiAxMDAgNTQgMTUgCisyMCA1OSA1MiA2MyAxMzEgMjAgNTcgMTI0IDMxIDEyNSA0NiAxMDYgNzYgOTIgOCA5OCAxNTQgMTUyIDgwIDExNCAxNSAxNDAgMTM2IAorMTEyIDEwMCAxNyA5MiAyNSAxNTEgMTUwIDgwIDk5IDY5IDgzIDQ5IDQzIDE1NiAxMDIgMTkgNTcgMTIyIDk2IDMwIDMgMzkgMTM0IDQwIAorMzIgNzUgNSA3NiAxMjcgMTM4IDk5IDE3IDU3IDUyIDE1MCAxMzAgMTggMTI3IDMzIDIzIDExNiAxMDcgNzggNzcgNzcgNDIgNjkgNjggCis0OCA0MSA2OSAzMyA3NSA0MCA0OSAxMjggMTAzIDQgMTQ2IDkzIDEwIDgzIDY2IDk2IDE1MiAzMCAzOCAxMiAzMyA1IDM5IDQ3IDQxIDM0IAorNjAgNzQgMjAgNDIgMTU2IDY3IDQ2IDU2IDEwMiA4OSAzIDEyNCA4MSA5OSAxMDQgNTYgNTAgOCA2MSA3NCA1NSAxNSA4NyAxMDggMjggCisxMzggNDcgOTMgNjAgMiAxMjQgNDYgMTI2IDEwMyA5MSAxNDUgMzYgMjUgMTE2IDEyMiA1MSBeCiszMjIgMCA3NSA3IDEwNyAxNTggODEgMTA1IDE1NCA5MCAyMCAxMjUgNzcgMTE0IDY5IDkyIDcgNTggMjEgOTggMTU0IDUwIDEyOCAxNDkgCisxMTcgMTI3IDE1MyA0NSAzIDE4IDEyMSA4NiAyOSA3MSA3OSAxMDEgMiA1IDIyIDE0MyAxMCAyNyA1MyAxNDYgMTU3IDE0OCAxMTIgMzMgCisyMiA4MCAxMjMgMjQgMTQ3IDEgMTEyIDgyIDE1OSA2MyA3NCA5NyAxMDkgMzMgMTUxIDMyIDg5IDg3IDEzMiAxMTcgNDYgMTI5IDU5IAorMTE1IDkxIDExNCAxMTggMzcgMjEgOSA5NCA2MCAyNSA4OSA0NyA3OSAxMTAgNTUgMTIgMTQzIDk5IDg3IDQzIDg4IDU2IDU3IDE2MCA3NiAKKzEyIDcxIDEyOCA3NyAxNDYgMTE3IDk1IDEwNSA0MiA2NiAzIDc2IDIwIDc2IDEwMSAxMDAgMTE4IDE0OSA0NSAyNiAxNDMgMTQ4IDMyIAorNTcgMzkgMTI5IDE5IDMxIDg0IDEyMyAxIDE1MiAxMzUgNSA1NCAzMCAxMyAxMjUgNjggMzAgNjIgMTAxIDUxIDE0MiA1IDk0IDgzIDIwIAorMTE2IDI0IDEwNyAxMDkgMTA1IDkxIDQyIDE3IDI3IDkzIDY5IDMgMTM5IDY4IDc5IDM4IDg0IDIgODUgMTI4IDEyNiAxMjIgMTMxIDQ2IAorMTcgMzUgOTggNDIgMjYgMTExIDEwMCAyOSAxMjAgNTUgODQgMTE0IDEwOSAxNDUgMTQgMTggMTM4IDE0IDkgODUgNyAxOCAxMjkgOTEgMiAKKzk0IDUxIDEzMyA4MiA4NyAxMjMgNjQgMzkgOCAxMDMgMzggNzUgMTEwIDc4IDcgOSA0NSAxMTUgNDIgMTM4IDEzNSA4NiA3OCAxNiA2MiAKKzUyIDc1IDE1OSA1NCAxNTEgMTIxIDE0OSA3NyA3NCAxNiA4NSA0NyAxMDIgMTA1IDgyIDExOSAxMCA2NyAxMzcgMTUzIDE0OCAxMzUgMjggCis0OSAyNiAxNTEgMTUzIDM2IDgwIDExIDEzMCAxMTMgMjQgNDQgMzAgMTAyIDI0IDU4IDEzMyAxMjIgMTQwIDk5IDI0IDE1NiA1NCAxMTkgCis0MiAxMTUgMTQwIDkwIDEzMiAxOSA5NCAyIDE1NyA5OSAxMzYgMTkgNzEgNyAxMzAgMTUzIDEwOCA1MSAyMSA1OCA3MCA3NCAxMzcgMSAKKzQwIDExMSAxNDkgNSAxMDMgNiAyNyA3NiAxNDEgMjMgMTI1IDE0MCAxIDcyIDI5IDE1MiAxMDMgODcgNTEgOTMgMjkgODAgMTMyIDc3IAorMTIzIDE1MyA2OCAxNTkgMTQgOTggMTE0IDE1OCAxMjEgMTU4IDgxIDEzMSBeCiszMjIgMCAzNSA5MyAxMDkgMTI1IDExOSAxMCAxMCAxOSAxMzUgMjYgNCA3NCAxMzUgMzUgMTIwIDEyOSAxMTMgOTIgMTcgMjkgNDcgODggCisxNCAxNTkgMTQ5IDg3IDQ1IDM2IDc1IDY4IDIyIDEzOCAyMCA1OSA2MSAxNDQgMTUxIDExIDEwNyA2IDE1MyA4MSAxMTQgNDMgODUgMTU3IAorOTcgMTQ4IDExOCA3MyAxMjYgNTYgNTggMTM3IDk2IDExIDk4IDY3IDk4IDEwMyA1NyAxNDYgMjEgNTkgODggMTUxIDEzOSAxNDggMTI3IAorMjUgMTcgNDcgMTE1IDM0IDE2MCAxMDkgMTA3IDUxIDY0IDI4IDY5IDEzIDQ5IDE0OSA2OSAxNDEgOTAgOTMgMTE4IDY0IDEwIDEgNjcgCis4MCAzNSAxMTEgMTMgNTggMTAxIDEyNCAxMzIgMTQ3IDE1NCAxOCAxNjIgNiAxNjIgMzMgNSAzNCAxNDIgNDEgMTYxIDgyIDExNCA3MCAKKzkyIDE0NSA1NyAxNTUgMTM3IDExNCA3OSA0NCAzNiA0OCA0OCAyMSAxNCAxMyA0MCAzMyAxNCAxNTAgMzMgMzIgNTQgMTQzIDE0IDQgCisxMDEgMTQyIDIzIDkzIDEzNiAxMzIgMTIwIDE0NyAxNyAzOCAxNjMgMTQzIDUgNTIgNDYgMTUxIDEzMCAzMiA3MiAzNCAxMjQgMTUwIDUxIAorMTAwIDExMiAxMjggMTI2IDY1IDEwIDI4IDg3IDgxIDE1OSAxMzEgMTkgOTkgNTQgMTI1IDExMCA1OCAxMTkgMjggNzggMTI5IDEwNCAKKzE0MCAxMjYgMzggMTU0IDI3IDExNCA2MSAxNTMgOTAgNjYgOTggNzYgNTAgMTU4IDQ4IDM5IDgyIDEyMyAyMiAxNDcgMTM2IDExNCA1MiAKKzM3IDM1IDc1IDQxIDE1IDE1MCA2MCA1MiA1NSAxMDMgMjEgMjMgMTI5IDk1IDI0IDcxIDQ3IDk3IDEzMCA1MCAxNDAgMTQ0IDEwNiAxMDAgCis5IDY0IDE5IDExNyAxMjIgNzEgOTIgOCA3NyAxNTYgOTcgMTIxIDk4IDg1IDIgMzYgMzkgMTA5IDE0MyAyMyAxMjAgMTU2IDEzMyA5MyAKKzE1NCAzNiA2NiAxMTYgMTMxIDE2MCAxMjcgMTYyIDE2MSA0NiAxNDIgMTQgMTQxIDgxIDE0MSA2MyA4NiAxMTcgMTA0IDMgMTQ2IDM5IAorMTI3IDM0IDEzMyAxMDIgMTA2IDkxIDU3IDkgMjggNjAgNjEgNyAxNTggMTIgODAgMjYgOCAxMjIgODAgNDQgNjMgNjggNDkgMTU4IDIxIAorMzIgODEgMTUwIDE1IDE0MSAxMDggMTYxIDY0IDQ2IDEyNCAxMjMgMzEgOTkgMjcgMTA1IDEwOSA5OCAxMTIgMTQ0IF4KKzMzNiAxIDM0IDE2MSAxMDcgMTQ5IDQ4IDY3IDEzOCAxMDkgMTU2IDEwNCAzNyAxMzMgNjAgODAgODQgODEgMTYwIDkgMTYgOTYgMTY0IDEgCis5NSAxMTIgNCA4NiAxNjMgMTE2IDk4IDEwMyA1NSAzMSA4IDU2IDM3IDM2IDEyNyAzMiA5IDg5IDEwMyAzMSAxMDAgMTYxIDg1IDEwNiAKKzExOSA4OSAxNTQgNDMgMTE1IDE2MiAxMzcgMTA4IDEyOCAzOCA0MiAxNTUgMTAzIDkgNjIgNjUgMTAyIDEyMiAxMCAxMzggMTYwIDEyNSAKKzQ3IDE1OCA0MyA5MSA2OSAxMjMgMTMyIDM1IDEyMSA0IDExMCA4OSAxMzAgNjkgMjkgMTM5IDY5IDUzIDcwIDgzIDI5IDE2MyA2NyA0MSAKKzkgMTA4IDM0IDQ1IDc2IDg3IDIgMTQ0IDE2NCA5OCAzMyAxNjAgNzkgNzggNDggODkgOSAzOCAxMzQgOTMgMTQ2IDc5IDU0IDEyMiA4MCAKKzM4IDExMiA1NSA1NSAxMDEgNzAgOCAxMjkgNDQgNzAgNTkgOTggMTQ5IDI0IDEzNiAxMjQgMTM4IDYzIDI1IDE2NiA4MyA1MSAzNCA5MSAKKzQ1IDMwIDExOCA1OSAyOCA4NyA3MiA0NCAxMTYgMjggMzYgMTAzIDEwMSAxMTMgMTAgMTE0IDYyIDExMSA3MSA2NSAxMjYgNTMgMTkgCisxMTQgODYgNDIgODUgMzYgNTcgMTM3IDU3IDE1OSA5NSA4OCA3OCA3MiAyMCAyMyAxNCA2NSAxMCAyMiAxMjkgNjggMSA2OCA3NCA3NSAKKzEwOCA3IDcgMTQ3IDEwOSAxMyAzNSA1MSAxMDQgMTU4IDE2NCAxMjIgMTI2IDIgNTAgNCAxMzIgMTI3IDU5IDUyIDEzIDgxIDIwIDQ3IAorMTA3IDc0IDE0OCAxMTUgNDYgMTA2IDQ2IDgyIDExNSA2OCAxNDQgMTQyIDYwIDEwNCAxNSA5MCAxMzYgMTAyIDEwMCAxMzQgNDIgMTUgCisxNDEgMTAwIDQwIDQ5IDQ5IDczIDE2NiAxMyAxNTYgODIgMTY2IDM3IDgyIDk2IDEzNyAxMzAgMTY2IDEzNCAyMCAxMzkgNDUgMTIyIDU2IAorMTA3IDk4IDc5IDEyNCAxNyAzMiAxMzAgMTIwIDE2NSA3NyAyMyAxMzAgOTYgNjcgNjggNDcgMzcgMTIgMjkgMTggMzggMTU4IDE5IDE2MCAKKzU1IDE0NyAzOSAxMTggODMgMTIxIDk2IDQzIDEzNyAzMyA2NiA4NiAxMTIgMTQ3IDE1NSAxNDkgMTQwIDUgMTkgMTcgMTQ4IDE2MSAxMCAKKzQ0IDE1OSAxNDYgNTcgMTYgMjYgMTAyIDQ5IDMgMTA0IDYxIDU5IDc0IDU2IDEwIDE2NSAzMSA1NCAyNSAxNDIgMTU3IDM3IDU4IDE2NSAKKzEyOCAxNTQgNzMgNTAgMTQ5IDk0IDEzNyBeCiszMzAgMSA2MSA1MSA2NSAxMzIgMjMgMTY5IDExNiAxMjIgMTQgNjYgNyA5OCAxMzEgNzIgNjkgMTI3IDcyIDE2MyAxMjUgNjggNjkgNTEgCis0NyAxNTkgMzEgMTY0IDcxIDExOCA1MCA4MyAxMTMgODEgMTI3IDE1MyA0NSAxMzcgMTM0IDEyMSA2OCAxNjMgMjYgNDMgNjUgMTI3IAorMTY2IDEzOCA5OCAxNDQgMTggNTMgMTM3IDEzOSAxNDggNzYgMTU4IDQgNjIgNzggMTY3IDEwMiAxNDQgOTQgNTUgMTQxIDYzIDI5IDk3IAorOTEgMjQgMTE1IDE2NiA4MCA2OSAxMzIgOTkgMSAxMjAgMjMgODggNjQgODcgMTE4IDM3IDEzNyAxNTIgOTQgNjAgMTY4IDcxIDQ3IDUyIAorMTEwIDM3IDE1NSAxMjUgNjMgNDIgNDMgNTIgMTEgMTIgMTUxIDMxIDEyIDQ0IDExMCAzMiAxMjggMTE3IDY4IDg3IDI0IDM5IDE2NCA3NiAKKzE0NSA1OCAxMDEgOTEgMTAwIDE0MCAxNTEgMTQzIDEzMCAzMiAyMSAzIDExMSAxIDMxIDc1IDEyMyAxNTMgMTE2IDEzNSAxMzAgMjcgCisxNjQgMTY1IDExNiAyMyAxMiA2MiA4MyAyNCAxMzMgMTM5IDQ5IDc0IDE1NCA4MCAxNTggODAgNjQgMTA1IDkxIDYgMTQyIDI3IDc1IDI0IAorMTI4IDExMiA0MSA3OSAyOSA4NCAxNDUgNDAgMTI4IDk5IDk1IDk1IDE5IDE3IDE2MCA4OSAxNSAxNyA4NCA2NCAxMSA5MyAxMCA2NiA3OCAKKzczIDEyNyAxNDggMTggMTI5IDEzOSAxNDMgNDkgMTUwIDkgODQgODIgMTU0IDg1IDE1IDg4IDgyIDYwIDg3IDE5IDEyIDEzMyA1OCAyMCAKKzM5IDY1IDUxIDE0MSAxMzQgMjcgNzAgMTY3IDEyMCAxMTcgODYgNjAgMTYgNDQgMTYgNTcgMTMyIDE4IDE0MiA4NSAxMDQgNTkgNDcgCisxNDEgNTggMiA2NiA5NiA0NiAxMTkgMTUzIDQwIDExMCAxMjYgMTAzIDkwIDE0NCAxMyAyNiAxMDYgMTQ0IDgwIDE0NSAxMzQgMTAzIDk1IAorMjQgNDQgMjEgODQgMTQwIDEzIDk3IDEwNCAxNDAgOTkgNiAxNDcgNTQgODMgNDIgMTA2IDEzMSA1NCA5NiAxMzUgNjcgMTE4IDEyMSA4MSAKKzEwOSAxMCA1MyAxMzIgMTEyIDExNyA4MSAzMyAxNTUgNDkgNjEgMzggMTE5IDEgMTMgMTAyIDEzMSAxNDggOTQgMTMxIDE0MyA2NyAxMjMgCisxNDggODkgMTA0IDEzNSA3MiAxNDUgMTUyIDc2IDg3IDYgNjYgMiA3MSAxMjMgNzcgMTE0IDEwOCA1OSAxMjMgMTY2IDYyIDk2IDE0MCAKKzk0IDE0OSAxMTYgMTY5IF4KKzM0OSAwIDEyNSAxNyA5MyA4MiA4MCAxMTAgMTU2IDE0NyAxNTYgOTkgMTU0IDQgMjkgOTAgMTYzIDEyMCA4NCAxMTMgNTYgOCAxNTcgMjkgCis2MSAxNjkgMTQxIDExMyA3OCA0OCA1MCAxMyAxMzggMTEgNTAgNjEgOTkgMTA2IDIgMTA3IDYgMTE3IDgxIDExNCAzNCA0OSAxMTIgNTIgCisxMzAgODIgNzMgMTA4IDIwIDIyIDExMCA2MCAxMSA5OCAyMiA2MiA1OCA0OCAxNDYgMTQ5IDIzIDg4IDE0MiAxMzkgMTIxIDkxIDE2IAorMTYzIDIgODggMTcxIDEzMyAxMDAgNjIgNTEgNDYgMTAgMjQgMTUwIDQ5IDEzMSA2MCAxMTQgNjMgODQgOTEgNjQgMTY1IDEzOCA0MCA0NCAKKzE3MiAxMTEgMTQxIDU4IDc0IDExNSA5NiAxMjkgMTQ1IDE2NCAxNTMgMTcwIDEyNiAyNCAxNjkgMTYgMTE1IDQxIDEyNSA0NiA4NyA2MSAKKzkyIDE0NSAzOSAxNTUgOTIgNzggNzAgMzUgMjcgMjEgNDggMjEgMTUxIDE1OSA0MCAxNSA1IDEzMiAxNzAgMjMgMTggMTA3IDE2MCAxNTAgCis1NiAxMzMgMjMgNjYgMTA5IDEyMyAxMDIgMTAyIDE3MiAxNjYgMTQ1IDExNiAxNTEgMzQgMSAxNTEgMTMwIDUgMzYgMzQgOTcgMTE0IDE1IAorODIgMTI4IDExMiAxMTkgOTkgMjkgMTM4IDE2NSA0MiAzNiAxNTkgOTUgMTkgNjMgMzYgODkgMTAxIDQwIDkyIDEgMzMgOTMgMTA0IDExMyAKKzEyNiAyIDEzNiA5NiA1MiAxMDggOTAgNTcgODkgMzEgNSAxMTMgMzAgMzkgMzcgOTYgNCAxNDcgMTI3IDEwNSA0MyAxNjUgMzUgNzUgMjMgCisxNDMgMTA1IDI0IDI1IDEwIDk0IDEyIDE2MCAxMDIgOTUgMTcwIDcxIDIwIDcwIDExMiAyMyA5NSAxNDQgNjEgNzMgMTM3IDU1IDEgODEgCis5NSAyNiA2NSAxNzIgNDEgMTQ3IDc5IDEwMyA4MCA0MCAxMjEgMzYgMTIgNjQgOTggMTY5IDkzIDExMSAxMTUgNDggMTI3IDkgMzkgMTA3IAorMTMxIDExNSAxMTggMTYyIDE2MSAxMCAxNDIgMTQgMTIzIDU0IDE0MSAzNiA0MSA5OSA3NyAxNDAgMTI4IDE2NyA4MiAyNSAxMDYgNTcgCis3MCA2NCAyMSAxOSAxNSAzNCAxMjYgMTQ5IDE2NyA1MyAxNjMgMTI3IDg2IDM1IDggNTQgMjMgNDAgMTQwIDMgMTY5IDQ1IDE1MCAxNTIgCis5NiA4MSAxNDMgMjggMjggMTI0IDg3IDEzIDkwIDkgODcgMTA5IDUzIDY3IDE2NCAyOCAxMzEgODkgMTQ5IDQyIDU1IDEyNiA3OSAxMzIgCis3NCAxOSAxMzMgMzAgNjggNzIgNzUgMTQ4IDkgMTAgNzIgMTUyIDE0NCA4MyAxMDYgMTUzIDc0IDE2MyA5OCAxNTIgXgorMzc1IDEgOTQgMjggMTMgOCAyMCAyOCAxOCAxMTggNSAxNDAgODkgNjcgMTcxIDY0IDE1MiA4NSA2MSAxMDEgODAgMTU0IDE0OSAzNCAKKzExNSAxMzUgMTI4IDEwOCAxMTAgMjAgMzMgMTI4IDEwMyAzNSAzOCA1NyA5NSAxMCAxMTEgMTUxIDk4IDI5IDE0OSA3IDgyIDY5IDk2IAorMTE0IDI2IDEwMyAxNzEgMTAxIDUzIDEyMSAyNCAyIDEyMSA1MSAzNSA3MCA4MyAyOSAxNTQgNjcgNSAxNjcgNjMgMTYgMjcgNTggNjAgMiAKKzk5IDEyOCA3MSAzMyAxNjAgNzAgNTEgMyA0NCAxNDkgMiA4OSA4NCAxMDEgNDMgMTggMTEzIDcxIDM4IDk0IDU1IDQ2IDc0IDUyIDEzOSAKKzEwMiAzNSA0MyA1MCA4MCAxMjIgNiAxMDAgODggMTI5IDM2IDI1IDE0OCA0NyAyNCA3IDU1IDM2IDMwIDgyIDMyIDE5IDc4IDYzIDI2IAorNzEgMjggMTY3IDg1IDU2IDE2NyA5NSAxNTkgNzggMjYgNjYgMzUgNjUgOTAgNDQgMTU5IDEwNSA1OSAxNSA2NyA1NyAxMzcgMjEgMTMyIAorNTAgNzAgNzggMzYgMTY5IDUgMTcyIDU2IDEgMjIgMTI5IDY4IDE2OCAyMyA3NCAzMCA5OSAxMzggMTc0IDEyMCA5MSAxNTMgOCA0MiA2OCAKKzE1OCAxNTUgMTA0IDk5IDEzMyA1IDEzNSA5NiA4MiA1OSA1MiAxNDQgMzYgMjAgMzggNjIgMjkgMTEyIDEwNiA0NiAxMDYgMTkgNzMgNzAgCis0MSAxMzUgMTMzIDQyIDk1IDE1IDQ1IDEzNiA5MyAxMDAgOTggMTczIDYgMTMyIDU1IDQgNCAzMSA2NCAxMzAgMTYyIDE1NiA2NCAxNTcgCisxOSA0NiA5NiA5MiAxMDMgMTM5IDEzNCAyIDk0IDE4IDg2IDM4IDg5IDYyIDYxIDc5IDE1NyAxNCAxMTIgMTExIDE1NiAzMiAxNCA4NSAKKzc4IDMxIDU5IDIwIDEgMTYxIDE2OSAxNDkgMjkgMTIyIDE1MCAxMzMgMzcgMTAyIDMwIDEwOSA2NSA4NSA1MSAxNzQgMTEwIDE2NCA2NiAKKzc3IDc2IDExMSAxMTkgMTMxIDk1IDUgMSAxNjYgMTAzIDEzNCAxNDEgMTcgMTU4IDEyMyAxMzcgNDggMTY1IDE3NSAxMDIgMTMgMyA4NiAKKzQzIDIzIDQ3IDU2IDE1MCAxNjUgNCAzNiAxNzQgMTE1IDE1NyAxNjggMTMgMTQ3IDExOSAxMDkgNTUgNDEgMTQwIDY3IDI3IDMxIDI3IAorNTMgMTI2IDE3IDE2MyAxMTYgMTIyIDE2MCA2MCA3IDkyIDExMyA2NiA0NSAxMDkgNjAgMTUxIDEyNSA2MiAzOSAzOSAxNyAxNTMgMTMgCisxNTIgNTMgOTQgNTAgNTMgODkgNTcgMTI3IDE1MyA0NSAxMTkgMTA0IDEyMSA1NiAxNDUgMTcyIDE5IDQxIDEwMyAxNjYgMTA4IDY4IAorMTI2IDEyIDUzIDEzMSAxMjcgMTQ4IDUyIDEzNCAxNjggNTAgNDggMTU1IDcyIDEzMiA4MiAzNyAxMjkgNjMgMTc1IDE2MCBeCiszNjYgMSA3MyAxNSA3OSAxMzkgNzEgNTEgMTMyIDgxIDEzNSAxMTEgMTY2IDYxIDM3IDYwIDExOCAzNyA5MiAxMzQgOTQgNjAgMTUwIDUzIAorNDcgMjUgMTEwIDE5IDEzNyAxMDcgMjcgMTc2IDQzIDE2IDE0NSAxNDYgMTQyIDE2NSAxMiAxNyA5MiAxNjYgMTEwIDExNyA0MSA2OSA2IAorMTIgMTY0IDc2IDEwOSA0MCAxMDEgODIgODIgMTMxIDEzNCAxMTUgMTQzIDExMiAzMiAxNjQgMTQ2IDkzIDE2MiAzMSA2NiAxMjMgMTQ0IAorODAgMTM1IDk0IDEzNyAxNTYgMTA3IDE1NyAxNzMgNjIgNjUgMTc2IDEyNCAxMTIgNCA2NSAxMjcgNDQgMTMxIDUzIDE5IDEwNSA5MSAKKzE0OSAxMDYgMjcgNTcgMTU4IDkyIDg1IDE0IDc5IDIwIDg0IDEyNyAxNzQgMTI4IDcyIDY4IDU5IDE3MSAxNyAxMjQgODAgMTY3IDggNTcgCisyOCAxNzIgNjYgMTQ0IDQ4IDQyIDM3IDEwOSAxMjEgMTggMTIwIDEwMyAxMTYgMTMgMTMyIDM5IDczIDE0NSA3NiAxNTggNDMgODIgMzMgCis1MSAxNTMgMTY0IDk3IDEzIDIgMyAyMCAyNCAxMTQgOTggOSAyNSAxMzEgMTAyIDk5IDg2IDQyIDE2IDI2IDE1OSAzOSAxMDUgMTYxIAorMTMzIDQ5IDU5IDQxIDIwIDEwNSAzMSAxMzYgMzAgODcgMTAgMTE5IDEzNSAxMyA4MyA5OSA1OCA0NSA5OSAxNTYgMjYgNjEgMTM1IDE0MyAKKzgwIDExOCAxMDcgNzYgNzcgMjQgNDQgMTIgNjYgOTUgMTQ3IDYxIDg2IDE0MCA5OSAxNjcgMTM4IDU0IDQ3IDQyIDk3IDEyMiAxOCA2MCAKKzkwIDQwIDczIDg1IDYzIDgyIDEgMzUgOTYgOTQgODEgNTQgMTUgMTI4IDQwIDUyIDIgMTAxIDEgMTY1IDkzIDExMyAxMzAgODUgOTUgOTggCis1OCAxMDUgMTEyIDUzIDY4IDEwOCA3MiAxMDAgMTUyIDQ5IDg3IDE0MCAzOSAxNTQgNjIgMTE0IDc3IDEwNSA2MyA1MCA4NyAxNTcgMjYgCis3OCAxMjIgNjcgMTQwIDcxIDE3MCAxMTkgNSA5MyA2NCA1MCAxMDQgMTQ0IDEyOSAxMzggNzUgMTMwIDQgMTc4IDYwIDEzOSAxMjAgNTQgCisxMTMgMzIgMiAxMzMgMTcgNDMgMTYzIDEyOSA4OSA3MiAxNDkgMTU1IDMwIDM4IDcgMTM4IDUgNDQgNjEgNjkgNzYgMTc1IDEwNyA2IDkzIAorODEgMTE0IDI4IDI1IDgyIDIyIDExOCA1OCA3MyA5NiAxNzUgMTc3IDkyIDM2IDExIDk4IDE3MSAzOCAyOCA0MiAxNDYgMTI1IDE3OCA4OCAKKzEzNiAxMzkgMTAzIDY3IDEwIDE1MSAxNTEgNzAgMTUzIDExNSA5NCAzMiA1MSAzNCAxNzcgMTczIDEzMiA0OSAxMTkgNTQgOTYgNDUgNzggCis3MyA2NCAxNTkgMTIwIDIyIDIwIDE1NCAxMTEgMTE3IDU4IDU2IDEwOSA3MiAxNDMgXgorMzcyIDEgMTM2IDE0NiAxNDQgMTcwIDkwIDE1IDE2OSAxODAgODggNDEgODkgMTAgNjAgNTIgOTIgMTQ1IDIxIDE1NSA0NyA0MiA2MSAyNiAKKzE4IDE3NiA0OCAyMSAxMjQgMTQxIDQwIDE3OSAxNzggMTE0IDE0MyAxNCAxNjQgNzEgMTQyIDEzMiAxMSAxMjQgMjMgMzkgODIgMTE0IAorODQgNTcgMTYzIDEzMCAxMjcgODkgMTMzIDE2IDEzOCAxNTEgMTMwIDE2MCAzNCA3MCA3OCAxNjEgNjQgOTIgMTEyIDExMCA3MiAxNzUgCisxMDIgMTM4IDE3OSAxNzMgMTU5IDU5IDE5IDI3IDE4IDUzIDkyIDIyIDY1IDE1NiAxNzAgNTcgMTA0IDg2IDEyNiAxNDggMTE4IDE1NSAKKzc4IDQzIDYzIDkwIDQ4IDgwIDE2OCAxNDIgNjggMTIgMzkgMTc0IDY5IDE2OCAxNDcgMTE4IDk2IDM0IDEyOSAzNSA3NSA1IDEwNyA2MCAKKzE3MCAxODAgMTQ3IDg1IDMgMTMzIDc1IDk1IDE1MiA3MSAxNzUgNDMgOTQgMTc4IDUwIDE0NCAxNiA0NiAxMDEgNDYgMTY1IDQ1IDY4IAorMTYzIDM4IDE3MiA1IDEzOCA2MSA4NSA2MiAxNzcgNzYgMzYgMTY3IDE5IDUzIDE1MSA2NiA2NiA5NyAzIDEwMCAxNjQgMTIgOTggMTMxIAorNzAgMTA5IDE2MiAxNjEgMTU2IDE0MiAxNCAxMDUgMjcgMTQxIDkgMTc4IDgxIDUwIDExMyAxMTAgMTMxIDM3IDE2IDc5IDEyIDM0IDM3IAorMTY3IDE3MyAxMCAxNTIgNyA4MSAxNDAgMTU4IDI2IDEzNiA4MiA1MCAxNzIgMTU0IDQ1IDE2MCAzMSAxMjIgMTY3IDE0MiA5IDE1MCAKKzEyNSA1MSA1NCAxMjUgMTc0IDEwIDEyNCA1MSAxNzcgODEgMTczIDY5IDEwOSA4IDIyIDE1NSAxOSA4NiA2MiAxNDkgMzMgMzcgMTA4IAorMzQgOTYgMjkgMTc0IDEzMyAxNjcgNTAgNTQgNjYgMTMwIDkgMSAzNiAxMzQgMTA4IDY1IDk3IDEyNiA1NiAxNjMgNzEgODMgODggMTAgMSAKKzggMTc4IDIyIDYgMTEyIDE2OSAxMTYgODkgNDMgMTUzIDQwIDE0NiA4NSAzMSA4OSA3NCAxNTQgMTM3IDI4IDExNSAxMTcgMTIyIDEwOCAKKzk4IDggMjcgMTEwIDEwMyAxNzYgMTcgMjAgMjcgNzcgMTAgOTMgMTQ1IDgwIDE3IDE0MyAxNjUgNzYgNjkgNzggMTAyIDIwIDkxIDE3MSAKKzk1IDI5IDExNSAxNzYgMTY2IDEwOSAzOSAyMyA3MCA4MyAyOSAxNDggNjcgMTYzIDE2MSAzMyA0IDE1IDQ2IDQyIDIgNjkgMTA0IDUzIAorMzMgMTYwIDY0IDMzIDE1NSAxNCAxMzEgMTYwIDU5IDc4IDcxIDE5IDE3NiAxMDcgNjUgMzggODIgNTUgNDAgNTYgNDAgMTE1IDg0IDI5IAorMjUgNDQgNjggMTA0IDE3NiA3NiA2NCAxMjMgMTggMjUgMTM2IDIzIDYgMTcxIDMxIDMwIDMwIDU4IDE0IDEzIDcyIDU3IDE0IDQxIDE3NyAKK14KKzM2MyAwIDEzNSA2OSAxNiAxNjcgNzkgMTQzIDQ2IDE3OCAyNiAzIDY1IDU4IDM2IDEzNSA5NyAzNSAxNzUgNTEgMTUyIDU3IDEzNyAxNzMgCisxMDggMTAgNTQgNzggNCAxNTMgMTczIDE2NCA0OCAxNzcgMjIgMTI5IDY4IDE2OCAxNjcgNzQgMTc0IDkxIDEwNiAxNzQgOTYgNzUgMTI5IAorMTY4IDM0IDM2IDE1OCAxNDcgODggNzUgMTAxIDE0OSAxMDMgNjQgNDIgNTkgNTIgMTEyIDE4MCAyMCAzMCAyMiAxNzMgODAgOTggNDYgCisxMDYgMTc5IDY1IDMwIDE3IDEyNyAxMjUgMjYgODcgMTUgNSAxMzYgODUgMTAwIDY2IDE0MSAxODIgMTI0IDE1IDE1NiAxNDggMTUgNTYgCis5OCAxNDYgMTU2IDQ4IDE0OSAzIDE0IDk2IDUyIDc5IDExNSAxMzQgMTcwIDU0IDE3OCA1NCAyMiA3MyAzMCA0NSAzOSAxMzMgMTgyIDk2IAorMTAzIDE0OCAxNzYgNiA0NSA2MiAxODMgNTEgMTgwIDE1MyAxNDUgMTQ1IDExNyAyMSA5MCAxMTggMTA5IDIxIDYyIDIyIDEwMSA0OSA1MyAKKzExIDE0MiA4NiAxMzIgNjYgNjkgNDQgNzkgODcgMTE1IDU1IDUgMTY5IDE1MCA2MyAxMTAgMTA5IDE3NyAxNTAgOTEgMTI5IDQwIDE0OSAKKzE1OSAxMDIgMTY1IDMgNzAgMjcgMTc1IDIzIDU2IDEyNiAxNjUgMTY0IDIwIDE1OCA5MSAxNTcgMTM2IDE1NyAxMzEgMTExIDY5IDM5IAorMzMgMTMyIDQzIDE5IDE3NSAxNzkgMzcgMTE4IDkgMTU1IDExNiAxMjIgMTI4IDUyIDcgODQgODkgNTggMTMgODUgNDQgMTM1IDEyNSA1NCAKKzE4MyAyMyAxNjEgMTQ1IDE3MyAxMzYgMjkgNjIgNTAgMTMgNTcgMjUgMTI3IDE1MyA0NSA5NSA2NCAxMjEgNDAgMTIxIDE0MCAxNzEgOSAKKzcxIDE2NiA2OCAyOCAxMDIgNCA1MyAxMjMgMTExIDE0OCAyMCAxMDIgMTYwIDM0IDggMTM5IDMyIDExNiA2NiAxMyAxMTMgNjMgMTQzIAorOTcgNjMgMTAgNTkgMTI0IDY2IDQxIDEzMiA3MSAxMTUgMTA2IDE1MSA0NiAyMiA0NSAxMTggMzcgNjcgMTI0IDk0IDYwIDE0MCA0MyA0NyAKKzEwIDExMCA5IDEyNyA5NyA3IDE1NiA0MyAxODAgMTI1IDEyNiAxMzcgMTQ1IDEyIDIgODIgMTQ2IDEwMCAxMTcgMjYgNTkgMTgwIDE4MSAKKzE2NCA3NiA4OSAzMCAxMDEgNzcgNzIgMTI2IDExNCA5NSAxNDMgMTAyIDMyIDE0OSAxMzEgODMgMTU3IDMxIDYxIDEyMyAxMzkgNjAgCisxMzUgNzQgMTY5IDEyMiAxNTEgMTAyIDEzNyAxNjggNjIgNTUgMTY2IDExOSA5NyAxNjMgNjAgMTEyIDI0IDExNiAzOCAxNzggMTA1IDkxIAorMTM0IDg2IDI3IDQ3IDEzOCA3MiA3MCAxODMgNzkgMTUgODQgMTE3IDE1NCAxMjggNTcgNTMgMzkgMTYxIDg4IF4KKzM5MyAxIDkyIDcyIDE1MSAzMyAxODMgMTY0IDQyIDExMiAzMiAxMCA1IDkzIDk3IDE4IDExMiA3MSA5MiAxNjggMTE2IDE3OSAxODYgNjUgCisxMzcgNjggMTM0IDMgODIgOSAxOSAxMjEgMTQ4IDY1IDE2MCAxNzMgMTU4IDE2NyA5MCA2NiAxODAgMTcyIDk5IDg2IDgzIDg2IDI2IDE2IAorMTAgMTM1IDIzIDgxIDEzNyAxMjUgMTcgMTkgMjUgMTgzIDczIDcgMTA0IDE4NSA3OSAxNjUgMTE5IDExOSAxNzYgNTkgNzUgMTggNSA1OSAKKzEzMiAyNiAyMSAxMjcgMTE5IDgwIDk0IDgzIDUyIDYxIDI0IDQ0IDQgNTAgNTUgMTE1IDI5IDcwIDE0MCA5OSAxNTkgMTMwIDU0IDE1IAorNDIgODkgMTE0IDE3MyAyOCA1MCAxNiAzMyA1MyA0NyA1OCAxODAgMTkgNjQgNzggNDkgMzAgMTg2IDEwNCAzMiA0NCAxNTcgODUgMSAKKzE0OSA4NSA5NyAxMTQgNzcgNjMgNTggNTAgODkgODAgMjEgMzYgODQgNzIgNjAgMTUyIDI1IDg3IDEwOCAxNSAxMzggNTQgMTA2IDc3IAorOTcgMjMgNDIgNTUgMTQ5IDE4MSA2MiAxMDYgNDMgMTMyIDMxIDEzOCAxMTEgMTc2IDkzIDQwIDEwIDk2IDEyOCAxMDUgMTE0IDQzIDk4IAorNCAxNDYgMjAgMTA3IDEyMCAxNCAxMTMgMTgxIDEwMSAxIDE5IDE1NSAxMTMgNTcgNjQgMTE3IDEzMSA2IDIyIDE4NiAxMzggMTg0IDM2IAorNjEgMjkgMzYgMTc1IDEwNyA2IDYxIDgxIDExNCAyMCAxODAgNDIgMTY5IDEwMiAyNiA3MyA4MCAxNTEgMTUzIDY4IDQgMTEgOTggMTM5IAorNiAxNzUgMzQgMTQ2IDkzIDE1NCA4OCAxMjggMTM5IDc5IDM1IDIgMTM1IDExOSA0NiAxMjkgOTEgODYgMTc5IDUxIDE4IDE2OSAxNDEgCisxMDggNDkgMTAzIDQ2IDcyIDIxIDcwIDQ5IDY0IDE1MSA5NiAxODUgMTc1IDEzMCAxMTEgODUgNTggMzIgMTAxIDQwIDEwMSAxMzEgMTM2IAorMTM5IDE3MCA3MCAxMCAxNjkgMTc1IDczIDQxIDY5IDE3NyA0NSA0NyA5MiAxNDUgMTEgMTU1IDIyIDIyIDU2IDIxIDEzIDE2NiA0OCAyMSAKKzEwOSAxMzEgNDAgMTc0IDE3OCAxMDQgMTI4IDkgMTQ5IDUxIDEzMiAxMjIgMTczIDExOSAyMyAyNCA2NyAxMDkgNzQgMzIgMTU4IDExMCAKKzExNyA3NCAxMjMgNiAxMTggMTUxIDEzMCAxNTAgMTY3IDM0IDU1IDU4IDE0NiA1NCA3MiAxMTIgMTA1IDU3IDE2MCA4MiAxMjMgMTU5IAorMTUzIDE1OSAzOSAxOSA3IDggMzMgODcgMTIgNTAgMTQ2IDE1MCAzNyAxMDQgNzEgMTI2IDEzMyAxMDggMTQ1IDY4IDM4IDM4IDkwIDQzIAorNzUgMTQ4IDEyMiA0MyAyIDM5IDE1NCA1NCAxNjMgMTQ3IDExMyA5MSAyOSAxMDkgMzUgNzUgMTgyIDg3IDM1IDE1NSAxNzAgMTI3IDgwIAorMTg1IDExOCA2MCA5NSAxNDIgNzEgMTY1IDI4IDg0IDE2OCAyNSAxNDQgMTc4IDMxIDgxIDQxIDE2MCAyNSA1MyAxNDMgXgorMzgxIDEgMTQgMTcyIDE2MyAxMzAgNDUgNjkgNDYgMTQ1IDM2IDM2IDE1MSAxNjkgMTMgMTM1IDQyIDI2IDgxIDE1MyA3NiAxNDggMTc4IAorOTAgMTMxIDMwIDEwMSAxNjIgMTYxIDEzMiAxNDIgMTQgODkgMyAxNDEgMTc1IDE0NiA2NSAyNiA4OSA5NCA5OSAxODcgOCA1NSAxNjIgMiAKKzEzIDE0MyAxNzMgMiAxMjAgMTczIDQxIDEzMiAxNTAgMiAxMTIgNDIgMTggMTQwIDEzMCAzNyAxMjggMjMgMTA2IDE1OSAxMTggMTY3IAorMTUwIDEwMSAxMSAzMCAxMDkgMTUwIDE4NCAxMjQgMTkgMTY5IDczIDE2NSA1MyAxMDkgMTU4IDE3MiAxNDcgMTEgNDYgMzggMTQ5IDI1IAorMjEgOTIgMTg0IDY0IDE3OSAxNTggMTMzIDEzNSAzNCAzOCA1OCAxMTQgOSAxODMgNCAxMTggNzYgNDkgODkgMTAyIDQwIDE2MyA0NyA3NSAKKzgwIDE3NiAxNzUgOCAxNTQgMTQgMTgwIDEwNCAxNTMgODQgODkgMTEgMTI5IDggMTM4IDg1IDE4MSA3MyA2NiAxNTQgMTIxIDIwIDExNSAKKzkzIDExNCAxMDggODIgMTgyIDE5IDg2IDEwMyAxNzYgMTgzIDE4NiAxNzcgNTMgMTAgNjkgMTM3IDU2IDEgMTM1IDE0MSA2OCA2OSA1NCAKKzg2IDEyIDc1IDE3MSA4NyAxODcgMTA3IDE0NCAxNTAgOTMgMjMgNyA3MCA4MyAyOSAxNDAgNjcgMTM5IDE1MyAxODMgMTc4IDE4OSAzMCAKKzE4IDIgMjkgNzIgMjkgMzMgMTYwIDU2IDkgMTIzIDE2NCAxMDcgMTM2IDE5IDcwIDMxIDE3NyAxNTIgOTkgNTcgMzggNjYgNTUgMzIgMzIgCisyNCA4MyA2MCAyMSAxIDM2IDUyIDgwIDE2OCA0NCAzMiAxMTUgMTg0IDI1IDEyMCAxODEgMTcyIDE1NSAxODkgMjIgMzAgMjYgMTgwIDUgCis2NCA0OSAxODggMSAyOCAxMTEgNTcgMTc2IDE2NyA2NyAxMzEgMjIgMTYwIDE4NiAxNjkgNjUgMzQgMzAgMTE3IDkxIDE3IDE2MyAzOSAKKzEzNCA1NyAxMzcgMTU1IDkwIDE3MCA0MiA3OCAxNzAgMTQxIDE2NyAxNTggNDIgMTc3IDIyIDEyOSA2OCAxNjggMTQzIDc0IDE1MCA4NSAKKzgyIDE3NCA3OCA2MyAxMTEgMTU2IDI4IDEyIDE1OCAxNDEgNzYgNTcgNzcgMTI1IDc5IDQwIDEyIDU5IDUyIDg4IDE1NiAyMCAyNCAxODIgCisxNDkgNTYgOTIgNDYgMTA2IDE2NyA1OSAxODkgMTIxIDExOSAxNCA4MSAxNSAxNjUgMTM2IDc5IDEwMCA0MiAxMTcgMTgyIDExOCAxNzUgCisxMzggMTI0IDMgNTAgNzQgMTM0IDE1NiAzNiAxNDMgMTgxIDE4MCA5NiAyMiA2MSA5NyAxMzQgMTY0IDI0IDE2NiAzMCAxMCA2MSA2IDMzIAorOSAxMTUgMTc2IDg0IDk3IDE0MiAxNTIgMTUgNTAgMTY1IDQ1IDE2OCAxMzUgMTMzIDEyNyA5MyAxNSA2NiA5NCA5MSA5IDMyIDE2IDk1IAorMzcgMjkgMTcxIDExOCA2OCAxMDggNjYgNjMgMjAgNTUgMTg2IF4KKzM5NiAxIDk3IDEwIDUgMTYwIDEzMiAxOCA4MyA3MyAxNTkgMTQxIDU1IDEyMCAzMSAxMzEgMTQxIDEwMiAxMzggMyA1MiA5IDE0OCAxODkgCis1NiA5OSAxNjUgMTQ2IDIgMTQwIDY0IDE1NyAxMDAgMTIxIDExMyAxMDIgMjQgMjEgMjQgMTIzIDE2IDEwIDEzOSAxNTIgMTkgMTA5IAorMTQ2IDExNiAxMjIgOTIgNDMgNyA3NSA2MiA0OSAxNzAgNTggMjYgMTE3IDEyNSA0NSAxNDcgNSAxMjUgMTM2IDE1NSAxMTggMiAyNiA1MCAKKzE2MSAyMSAxODIgMTI3IDE1MyA0NSA2OCAxOSAxMjEgMjIgOTQgMTA0IDE0NCAxNjYgMzUgMTY2IDIzIDE3NiA3NSAxODggNTMgMTE0IAorOTMgMTQ4IDE3NyA2NiAxNTEgMTYgMTU2IDEyMSAxODAgOTggNDggMTc5IDk1IDYzIDEwNyA5NyA0NSAxIDIzIDk3IDU3IDIzIDEzMiA1MyAKKzc5IDk3IDEyNCAxOSAxODggMTggMTE4IDM3IDIyIDEwNiA5NCA2MCAxMjIgMjUgNDcgMTc2IDExMCAxODQgMTA5IDc5IDE2NCAxMjAgNDMgCisxNTMgODkgOTAgMTI4IDEwOSAxMiAxNjggNjQgMTEwIDgyIDExNyAxOTIgNDEgMTcxIDE2MyAxNjQgNzYgNTMgMTIgMTAxIDY4IDU0IAorMTE3IDc4IDU5IDE0MyA4NCAzMiAxMjIgMTA0IDY1IDE0OCAzMSA1MiAxMjMgMTMwIDI0IDEzNSAzOCAxNTEgOTUgMTQyIDkzIDEwMSAKKzE1OSA2MiAzNyAxNDggMTEwIDcwIDEyNyA1MSA4NSAxODEgODkgMTEgMTQyIDEwNSA5MSAxMDcgNTAgMjcgMjkgMTAyIDM2IDQzIDE2NSAKKzc5IDYgODQgOTkgMTE4IDEyOCAzMCAyNiAzIDE0MyAxNyA2OCA2NiAxMzkgMTg3IDE1IDE2NSAxNTggMjQgODggMjAgMTc5IDE3NCA4MSAKKzc5IDE4IDEwNiA0NyA3NCAxNTAgMTA0IDE3OSAxNjIgNTkgMTMxIDYyIDExNiAxNjYgODIgMTg0IDE4OCA5NyAxMzYgNDEgMTM2IDE2NyAKKzE0MCAxNDMgMTc1IDcyIDQyIDE3NCAxNDggNzUgNzQgNzEgODYgMTQgMTYgMTkxIDExNyAxMSA2MyAxMTkgMTE5IDE4NiAxODIgMTMgCisxNzEgNDkgMTgyIDgwIDE2NyA3MyAxNDcgMTE5IDEwNyAxNjQgNDEgNTcgMTgxIDE2OCAyOSAxMTQgMjYgMTg0IDEyMSAxMDEgODAgNzYgCis2NSAzNCA0OSAyNCA0NCAxOTEgMzggMjUgOTEgNSA1OCAxNDAgOTkgMTUzIDEyNCA1NCAxODQgNDIgODMgMTA4IDE1NSA0IDIwIDE5MSAzIAorMjkgMzUgNDAgMTgwIDcgNDAgNjYgMjUgMTIgMTgwIDg2IDI2IDM4IDEzOSA3MyAxIDEzNyA3OSA4NSAxMDIgNzEgMzkgMjggNDQgNzcgCis1NiAxOTAgMTIgNjYgNzIgMzAgMTUyIDcgODcgODQgMTkwIDEyNiA0OCAxMDAgNzcgOTEgMTg2IDM2IDMxIDE0MyAxNjMgNTAgOTQgMjUgCisxMjYgMSAxMTQgMTA1IDE3MCA5MyAyMiAxNzMgOTAgMTE2IDg3IDk2IDE5IDc0IDQgMTIyIDE4MyA4MyAxMjAgMTc3IDExMyAxNjkgMTgxIAorNzcgMTgyIDEgMTQ5IDE4NiBeCiszODQgMSAyNSA1NiA4NSAxMDcgMTc3IDYgMTg2IDEzOCAxODQgMjggNjEgMTg0IDE5MSAxNzUgMTA3IDYgMjkgODEgMTE0IDEyIDE1NiAyIAorMTM3IDg2IDE4OSA3MyA2NCAxMjcgMTI5IDQ0IDE2NyAxMSA5OCAxMDcgMTY5IDE0MyAyNiAxNDYgNjEgMTMwIDg4IDEyMCAxMzkgNTUgMyAKKzE4OSAxMTkgODcgMjIgMTA1IDY3IDc4IDE0NyA1MSAyIDE2MSAxMDkgODQgNDkgODcgMzggNDggMTkyIDYyIDI1IDY0IDE0MyA3MiAxNjkgCisxNTEgMTA2IDExMSA1MyA1OCA4IDkzIDggODUgMTIzIDEyMCAxMzEgMTcwIDM4IDIgMTY5IDE2NyA0OSA0MSAzNyAxNTMgMjEgMzkgOTIgCisxNDUgMTkwIDE1NSAxNzcgMTg1IDQ4IDEzIDUgMTUwIDQ4IDIxIDg1IDExNSA0MCAxNjYgMTc4IDg4IDEwNCAxIDEyNSAxOSAxMTYgMTA2IAorMTQxIDExMSAyMyA0MyAxMDEgNTggMTg3IDE1MCA3OCAxMDEgNTAgMTA3IDE4NSA4NiAxNTEgMTMwIDEzNCAxNDMgMzQgMzEgMjYgMTIyIAorMzggNDAgMTEyIDk3IDMzIDEzNiA1MCA5OSAxMjcgMTIxIDE1OSA3IDE5IDE3MCAxODcgMSA3OSAxOTEgMjYgMTMwIDExOCA1IDEwNCA0NyAKKzEyNiAxMDkgOTIgMTI5IDUyIDMwIDE5MyA5MCAzNSA2NyAxMTYgOTAgMyAxODEgMzkgMTIyIDMwIDE1NSAxNDcgMTA1IDgzIDIxIDc3IAorMzUgNzUgMTc0IDU1IDE5MCAxMzEgMTU0IDk1IDcyIDE4NSA5NCAzNiA5NSAxMjYgNzEgMTQ5IDQgNjggMTUyIDE4MCAxNDQgMTQ2IDcgCis0OSAzMyAxNTIgMTg4IDI5IDExMSAxOTQgMTcyIDE0OCAxMjUgMzUgNTkgMzYgMTI1IDExIDM2IDE0MSAxNDkgMTgzIDEyNSAyNyAxIDcxIAorMTMzIDYxIDEzOCAxNjggODUgMTMxIDUgOTYgMTYyIDE2MSAxMTcgMTQyIDE0IDc5IDE4MyAxNDEgMTY1IDEyNiA1NSAxMSA3NCA4NCA3OSAKKzE2NyAzIDQwIDE0MiAxNzcgMTkzIDEyOCAxNzMgMTkyIDEwMCAxNjMgMTYgMTI3IDE0NSAxODIgOTcgMTcgMTkzIDEyMCAxMTUgMzIgCisxMDggMTggOTYgMTU0IDEwMyAxNTIgMTUwIDg2IDE4MSAxNSA5OSAxMzUgMTc5IDEyNCAxOTQgMTY0IDY4IDE2MCA0MyAxMDkgMTM4IAorMTUyIDE0MiA2IDIxIDIzIDE0OSAyMCAxMSA4MiAxNjQgNDQgMTU5IDE0OCAxMzMgMTE1IDI0IDI4IDUzIDEwNCA5IDE4MyAxNzkgMTA4IAorNTYgMzkgODQgODcgMzAgMTYzIDMyIDcwIDc1IDE2NiAxNzAgOCAxMzkgOSAxNzUgOTkgMTQzIDY0IDg5IDE4NiAxMTQgMTgzIDEzMyA4NSAKKzE2MSA2MyA2MSAxNTQgMTExIDE1IDExNSA3OCAxMDkgMTA4IDcyIDE3NyAxNCA3MSAxMDMgMTc2IDE3MyAxNzYgMTU3IDM4IDEwIDU0IAorMTMyIDQxIDE4NiAxMzAgMTI2IDYzIDY5IDM5IDc2IDcgNjUgMTcxIDgyIDE3MiAxMDIgMTI0IDE0MCA4MyAxMTMgXgorMzk2IDEgMTg5IDcwIDgzIDI5IDEzMiA2NyAxMTUgMTQ1IDE1MSAxNzAgMTgxIDE0IDE5MiAyIDE4NyA0MCA1IDMzIDE2MCA0OCAxODMgCis5MSAxMzIgODMgMTEyIDE3NyA2MiAxODkgMTUzIDEyOCA5MSA0OSAzOCA1MCA1NSAyNCA4IDggNTEgMzYgMTMgMTc1IDI4IDM2IDU2IAorMTYwIDEyIDEwNyAxNjggMjUgMTA0IDE1NyAxNTYgMTM5IDE2NSAxNCAzMCAxOTIgMTY0IDE5NSA1NiA0MSAxODAgMTU5IDI4IDc5IDQxIAorMTQ0IDE2NyA1MSAxMTUgMTg4IDEzNiAxNTQgMTQ1IDY1IDIgMjIgOTMgODMgMTkxIDE0NyAyMyAxMTAgNTcgMTM3IDEzMSA2NiAxMzggCisyNiA3OCAxNDYgMTI1IDE1OSAxNTAgMzQgMTc3IDIyIDEyOSA2OCAxNjggMTExIDc0IDExOCA3NyA1MCAxNzQgNTQgNDcgODcgMTQwIDIwIAorMTc4IDE1OCAxMzMgNjAgMzMgNDUgOTMgNDcgOCAxNzAgNTkgNTIgNTYgMTI0IDIwIDE2IDE1MCAxMTcgMjQgODQgNDYgMTA2IDE1MSA1MSAKKzE1OCAxNzMgMTEzIDExMSAxOTYgNzMgMTUgMTMzIDEzNiA3MSAxMDAgMTAgODUgMTgyIDExMCAxNDMgMTE0IDkyIDE4NSA0MiA0MiAxMTggCisxNTYgMjAgMTM1IDE3MyAxNTYgOTYgMTgwIDM3IDczIDEzNCAxNTYgMTgyIDE1MCAxOTYgMTkyIDQ1IDE3MiAxNyAxNjcgOTEgMTY4IDY4IAorODkgMTM0IDEyMCAxOTAgMTczIDM0IDE0MSAzNyAxNTIgMTExIDExNyAxMDMgNjEgNyAzNCA2MiA2NyAxOTEgMTkwIDggODcgMjEgMTk1IAorMTM5IDg2IDQ0IDc2IDY2IDU1IDE4NiAyMyAzMSA4NyAxODMgNSAxNTUgMTIyIDE5MSA2OCA1MyAxNDkgMTM2IDM1IDExNSAyNiAxMjEgCisxMzEgMTAyIDEyMyAzIDQyIDE5NyAxMzMgMTc5IDU2IDg0IDE2NSAxMzYgMTkwIDEzMCA0OSAxNTcgODAgMTAxIDEwMyA5NyAxOTcgMTEgCisxOSAxMTggMSA1IDExOSAxMzcgOSAxMDQgMTkzIDE0MSAxMTYgMTIyIDcyIDM4IDcgNzAgNDcgNDQgMTU1IDQzIDE2IDEwNyAxMjUgNDAgCisxMjcgMTkzIDEwNSAxMzEgMTQ1IDEwOCAxODUgNiA1MCAxNDEgMSAxNjcgMTI3IDE1MyA0NSA1MyAxOTIgMTIxIDEyIDc5IDg0IDEyOSAKKzE1MSAxNSAxNjYgMTk2IDE1NiA2MCAxODggNTMgMTA5IDgzIDE0OCAxNjIgNDYgMTQ2IDYgMTM2IDExMSAxNjAgODggMzggMTY5IDg1IAorNjMgODcgOTcgMzUgMTk0IDMgODIgNTIgMTMgMTMyIDQzIDU5IDkyIDEwOSA0IDE3OCAzIDExOCAzNyAxOTUgOTYgOTQgNjAgMTEyIDE1IAorNDcgMTY2IDExMCAxNzkgOTkgNjkgMTQ5IDEwMCA0MyAxMzggNjkgNzAgMTIzIDg5IDEyIDE1OCA1NCA5MCA3MiAxMTcgMTgyIDMxIDE2NiAKKzE1MyAxNjQgNzYgMzMgMiAxMDEgNjMgNDQgMTEyIDU4IDM5IDE0MyA3NCAzMiAxMDcgODkgNTUgMTQzIDMxIDQ3IDEyMyAxMjUgNCAxMzUgCisxOCAxNDEgODAgMTM3IDg4IDgxIDE1NCAxODcgXgorNDA2IDAgMjMgMTM0IDEwMyA0OSA5OSA0NCA2NCAxNjAgNjggMTkwIDExNCAxMDUgOTEgODYgMjIgMjcgMTUgNzQgOCAyMiAxNTEgNzkgCisxOTkgODQgODUgOTAgMTI4IDkgNSAxNzUgMTI5IDE3IDQwIDU5IDEyNSAxODcgMTk0IDE0NCAxNTEgMyA2MCA2IDE1OCAxNTMgNjcgNTggCisxOCA5OSAxOSA1MyAxMjkgOTAgMTc5IDEzNCA1MiAxMjQgNTUgOTUgMTM4IDgyIDE3MCAxNjcgNjkgMTIyIDEzIDEwOCAxNjAgMTE5IAorMTE1IDE2MSA1MSAxNCAxNjcgMTIwIDQ3IDYwIDU3IDg2IDE2IDE4NCA5NiAxOTcgNDIgOTggMTEyIDE2NSAxNTQgMTk5IDE1NyAyMSAKKzE2OCA1MiAxNDYgNjYgMTI2IDExOSA5MyAxNTAgMjAgMzYgMTUzIDE0MCAxOTQgOTMgMjYgMTU2IDExNCA4MCA4MCA1NSA0NCAxMyAzNSAKKzI0IDQ0IDE5MSAyNCAxOTAgNjMgMTc3IDQ0IDE0MCA5OSAxNDYgMTE3IDU0IDE2MyA0MiA3NiAxMDEgMTM0IDE3NiAxODUgMTc3IDE2OCAKKzEgMjEgMTkgMTgwIDE5MyAxMiA1MiAxOTcgMTkxIDE3MyA2NSAxOSAzMSAxMTggNTkgMSAxMjMgNzIgNzEgODggNjQgMTEgMTkzIDM3IAorNjMgMjggMTY5IDE4NCA0NSA3MiAxOTUgMTUyIDE4NiA4NyA1NiAxNzYgMTEyIDQxIDkzIDc3IDg0IDE1OCAyOSAzIDEzNiAxNDIgMzYgCis4MCA0IDExOSAxNjYgODYgOTggMTYzIDkzIDEgMTQ1IDgzIDEwMiA2NiA3NSAxOTEgNDYgNCA5NCAxNTUgNTUgMTIwIDE0OSAxMTMgMTQ4IAorMTgxIDQ5IDE3NSAxODAgMTQyIDg3IDUgNTEgNjUgOTIgMTY3IDE5NiAxODYgMTM4IDE4NCAyMyA2MSAxNjQgMTcxIDE3NSAxMDcgNiA5IAorODEgMTE0IDcgMTQxIDE3NyAxMTcgNzYgMTc0IDczIDU0IDExMiAxMTQgMjkgMTUyIDExIDk4IDg3IDE1NCAxMjMgMjEgMTQ2IDQxIDExNSAKKzg4IDExNSAxMzkgNDAgMTgzIDE4OSAxMDkgNjcgNyA5MCA1MiA3MyAxMjcgNTEgMTkyIDE1NiA4OSA2OSA0OSA3NyAzMyAzMyAxODIgNTcgCisxMCA2NCAxMzggNTcgMTU5IDEzNiA5MSAxMTEgMzMgNTggMTkzIDg4IDE4OCA3NSAxMTggMTEwIDEyNiAxNzAgMTggMTk3IDE2OSAxNjIgCiszNCA0MSAxNyAxMzggNiAzNCA5MiAxNDUgMTg1IDE1NSAxNTcgMTcwIDQzIDggMTQwIDQ4IDIxIDcwIDEwNSA0MCAxNjEgMTc4IDc4IDg5IAorMTk2IDExMCAxOTkgMTA2IDk2IDEyMSAxMDYgMjMgMTg1IDI4IDk2IDQ4IDE2NyAxNDUgNTggOTEgMzUgOTcgMTgwIDY2IDE1MSAxMzAgCisxMjQgMTI4IDM0IDE2IDYgMTA3IDI4IDIwIDExMiA5MiAxOCAxMjEgMzAgODQgMTA3IDEwMSAxNTkgMTg3IDE5IDE1NSAxODIgMTgxIDc0IAorMTg2IDExIDEyMCA5OCAxODUgMTA0IDMyIDEyNiA5NCA4MiAxMTkgNDIgMjUgMTczIDkwIDMwIDYyIDk2IDcwIDE3OCAxNzYgMzkgMTAyIAorMTUgMTUwIDE0NyAxMDAgNzggMTYgNTcgMzUgNzUgMTY5IDM1IDE3MCAxMTYgMTQ0IDc1IDE0NiBeCis0MDkgMSAxODUgNzAgMTIgOTUgMTEwIDcxIDEzMyAxODMgNTIgMTM2IDE0OCAxNDQgMTE0IDE4NiAxNyAyNSAxNDQgMTY0IDUgNzkgMTc4IAorMTcyIDEyNCAxMTcgMTkgNDMgMjAgOTMgMTc0IDM2IDEyNSAxMTcgMTUxIDEwOSAzIDE2NCA1NSAxMDEgMzcgMTIyIDE1MiA3NyAxMzEgCisxNjggODggMTYyIDE2MSA5MyAxNDIgMTQgNjMgMTY3IDE0MSAxNDkgOTQgMzkgMTkwIDUwIDY4IDQ3IDEzNSAxOTggMTYgMTEwIDE1MyAKKzE3NyAxMDQgMTczIDE5MiA2OCAxNDcgMTc5IDExOSAxMzcgMTY2IDczIDE4MCAxNjkgODggOTEgMjQgNzYgMTAgODAgMTQ2IDc5IDEyOCAKKzE1MCA2MiAxNDkgMTk0IDgzIDExMSAxNzEgMTI0IDE3MCAxNTYgNjAgMTUyIDI3IDEwOSAxMDYgMTIwIDEzNCAyMDEgMTg0IDIwMiAxNDkgCisxMiAxOTggNjYgMTMyIDEyIDEyNyAxMzIgMTMzIDgzIDggMTIgNDUgODggOSAxODMgMTU1IDkyIDI0IDIzIDc2IDYzIDE0IDE2MyA4IDYyIAorNjcgMTUwIDE2MiA4IDExNSAxIDE2NyA5MSAxMjcgMzIgODkgMTYyIDkwIDE1OSAxMjUgODUgMTI5IDQ3IDUzIDE1NCA5NSA3IDExNSA1NCAKKzEwMSAxMDggNTYgMTY5IDYgNDcgMTAzIDE3NiAxNTcgMTYwIDEyNSAxNCAxMCAzMCAxMjQgMTcgMTc4IDEyMiAxMDIgNTUgNjkgMTUgNjAgCisyMDIgNDkgMTcxIDc0IDE0OCA5NCA5MiAxMjQgNjcgMjAwIDE4NCA3MCA4MyAyOSAxMjcgNjcgMTAwIDE0MCAxMzEgMTY1IDE3NiA0IAorMTgyIDIgMTY3IDIwIDE5MyAzMyAxNjAgNDMgMTczIDcxIDExMiA2OCA5NyAxNTcgNTcgMTY5IDEzOCAxMTMgODYgNDQgMzggNDAgNTUgCisxOSAxOTYgMjAxIDMxIDIxIDggMTY1IDIzIDI2IDQxIDE1NSAxOTUgMTgzIDEwMiAxNTggMjUgOTQgMTQyIDE0NiAxMjkgMTUwIDkgMzAgCisxNzcgMTU0IDE5NSA1MSAzNiAxNzUgMTM5IDI4IDU5IDMxIDEyNCAxNjcgNDEgMTA1IDE3MyAxMjEgMTM0IDEzMCA2NSAxODUgMTcgNzggCis3OCAxODEgMTM3IDEzIDk1IDU3IDEzNyAxMTYgNTEgMTE4IDE2IDc4IDEzMSAxMTUgMTU0IDE0NSAyOSAxNzcgMjIgMTI5IDY4IDE2OCAKKzkxIDc0IDk4IDcyIDMwIDE3NCAzOSAzNyA3MiAxMzAgMTUgMTYzIDE1OCAxMjggNTAgMTggMjUgNzMgMjcgMTkxIDE1MCA1OSA1MiAzNiAKKzEwNCAyMCAxMSAxMzAgOTcgNCA3OSA0NiAxMDYgMTQxIDQ2IDEzOCAxNjMgMTA4IDEwNiAxOTEgNjggMTUgMTEzIDEzNiA2NiAxMDAgCisxOTMgNjUgMTgyIDEwNSAxMjMgOTkgNzIgMTgwIDM3IDIyIDEwOCAxNTYgMTAgMTMwIDE2OCAxNDEgOTYgMTYwIDIyIDU4IDEzNCAxNTEgCisxNjIgMTQwIDE4MSAxODcgMzUgMTU3IDcgMTQ3IDc2IDE2MyA1OCA4NCAxMjkgMTAwIDE5MCAxNTMgMjQgMTI2IDMyIDE0MiA5NiAxMDcgCis4OCA0MSAyIDE0IDQyIDUyIDE4NiAxNzAgMyA4MiAxMSAxODAgMTE5IDY2IDI5IDU2IDY2IDUwIDE3MSAzIDExIDc3IDE2MyA1IDE1MCAKKzExMiAxMjggXgorNDEzIDEgNDcgMjUgMTM1IDEyOSA3IDEwOCAxOSAxMDcgMTE3IDEwMiAxMDIgMyAyOCAxOTAgMTEyIDE2NSA1NiA2MyAxNjUgMTIyIDE4MyAKKzExNiAyOCAxNTcgNTIgNzMgODkgOTAgMTY5IDIwMiAxMiAxMTEgMTg1IDIwMyA5MSAxMTYgMjAwIDk3IDE5MyAxMzQgMTE2IDEyMiA0NCAKKzMxIDcgNjMgMjYgMzcgMTM0IDIyIDIgOTMgMTI1IDMzIDk5IDE4NiA3NyAxMjQgMTMxIDk0IDE3MSAxODMgNTAgMTEzIDE3OCAxNDYgCisxMjcgMTUzIDQ1IDMyIDE2NCAxMjEgMjAzIDU4IDU2IDEwOCAxMzAgMTkyIDE2NiAxNjggMTI4IDM5IDE4OCA1MyAxMDIgNjkgMTQ4IAorMTQxIDE4IDEzOSAxOTcgMTA4IDk3IDEzMiA3NCAyNCAxNTUgNzEgNjMgNTkgOTcgMjEgMTk0IDE4MCA2MSA0NSAyMDQgMTMyIDI5IDMxIAorODUgODggMTg4IDE2NCAxODcgMTE4IDM3IDE2NyA4MiA5NCA2MCA5OCAxIDQ3IDE1MiAxMTAgMTcyIDg1IDU1IDEyOCA3MiA0MyAxMTcgCis0MSA0MiAxMTYgNjEgMTIgMTQ0IDQwIDYyIDU4IDExNyAxNjggMTcgMTU5IDEzOSAxNjQgNzYgNSAxOTMgMTAxIDU2IDMwIDEwNSAzMCAKKzExIDE0MyA2MCAzMiA4NiA2OCA0MSAxMzYgMzEgNDAgMTIzIDExOCAxODEgMTM1IDE5NSAxMjcgNTkgMTMwIDgxIDUzIDE0NyA2MiAxMyAKKzEyNCA5OCAzNCA3OSAzOSA0OSAxNDUgNTMgMTgwIDk0IDEwNSA5MSA3MSAyIDI3IDUgNTQgMTkzIDcgMTQxIDc5IDE5OSA4NCA3NSA3MCAKKzEyOCAxOTkgMTk1IDE2MCAxMTkgMTcgMjAgNTQgMTE1IDE4NyAxODQgMTI5IDE0NiAxOTMgNDAgMjAxIDE0MyAxMzggNTcgNDMgMTggOTQgCisyMDQgMzggMTE0IDgwIDE3OSAxMTQgNDcgMTE5IDUwIDgwIDExOCA4MiAxNjAgMTUyIDQ5IDExMiAxOTggODggMTU1IDEwNCA5NSAxNTEgCiszNiAxOTkgMTYyIDEwMCAyNyA1MCA0NyA4NiAxOTUgMTYgMTc5IDgxIDE5MiAyNyA4MyAxMDcgMTUwIDEzNCAxOTQgMTQ3IDEgMTU4IDMyIAorMTMxIDYxIDExMSAxMTkgODMgMTQwIDUgMjEgMTMzIDEyMCAxNzQgNzggMjYgMTM2IDEwOSA2NSA4MCA0MCAyOSAyMDMgMjUgMjQgNDQgCisxOTEgMTQgMTcwIDQzIDE2MiAzNCAxNDAgOTkgMTQxIDExMiA1NCAxNDggNDIgNzEgOTYgMTE5IDE2MSAxNjUgMTY3IDE0OCAxODYgMTEgCis0IDE4MCAxODggMTk3IDQyIDE4MiAxODEgMTY4IDUwIDE0IDI2IDEwMyA0OSAxIDExMyA2NyA2MSA3OCA1OSAxOTYgMTczIDMyIDUzIDggCisxNTQgMTY5IDMwIDcyIDE3NSAxNTIgMTc2IDg3IDM2IDE2NiAxMDIgMzYgODggNzcgNzkgMTM4IDI0IDE4OCAxMzEgMTI3IDI2IDcwIAorMTk0IDExNCAxNDYgNjYgOTMgMTU4IDkzIDE5MSAxMjUgNzggOTIgNTEgNjAgMTc2IDI2IDQgNzQgMTM1IDM1IDEyMCAxMjkgMTEzIDEzMyAKKzE4MSAyOSAxNzAgMTcwIDEzNyA3NyAxOTAgNDYgNDUgNzcgMTU3IDE5MSAxODYgMTM4IDE4NCAxOCA2MSAxNDQgMTUxIDE3NSAxMDcgNiAKKzE5NCA4MSAxMTQgMiAxMjYgMTEwIF4KKzQyNyAxIDg1IDYwIDE1MCA3MyAzOCA4OCA5MCA1IDEyOCAxMSA5OCA1NSAxMzAgOTEgMTMgMTQ2IDkgOTEgODggMTA3IDEzOSAxNiAxNTkgCisxODkgOTMgMzUgMTkxIDY2IDI4IDY1IDk1IDUxIDE4NCAxNDggNTcgNDUgNDkgNjEgMjUgOSAxNjYgNDkgMTk0IDY0IDEzMCAzMyAxNDMgCisxMTIgNjcgMTExIDEgNTggMTc3IDgwIDE2NCA1OSAxMTAgOTQgMTE4IDE3MCAxOTQgMTk3IDE2OSAxNTQgMTAgNDEgMTkzIDExNCAxOTAgCisyNiA5MiAxNDUgMTc3IDE1NSAxMjUgMTQ2IDM1IDIwMCAxMjQgNDggMjEgNDYgODkgNDAgMTUzIDE3OCA2MiA2NSAxOTYgODYgMTc1IDkwIAorODAgODkgOTggMjMgMTY5IDQgODggMzIgMTM1IDEzNyAyNiA3NSAxMSA4MSAxNzIgMzQgMTUxIDEzMCAxMDggMTA0IDM0IDIwMCAxODIgCis4MyAxMiAxOTYgMTEyIDg0IDIwMiA5NyAyMDYgNjAgNzUgNjkgMTU5IDE2MyAxOSAxMzEgMTc0IDE1NyA2NiAxNzggMTk1IDEwNCA2NiAKKzE2MSAxMDQgOCAxMjYgNzAgNjYgMTAzIDI2IDE3IDE0MSA5MCAyMiA1NCA2NCAzOCAxNDYgMTY4IDM5IDcwIDE5OSAxNDIgMTQ3IDkyIAorNzAgOCAyNSAzNSA3NSAxNjEgMyAxMzggOTIgMTI4IDQzIDU5IDE4NSA1NSAyMDUgOTUgMTAwIDcxIDEyMyAxNzMgNDIgMTI2IDEyOCAKKzE0NCA5NCAxNzYgMjA1IDIwIDEzOSAxNDkgMTk4IDU5IDE2OCAxNzIgMTA5IDExMiA5IDMzIDEwIDczIDE1NCAzNiAxMTUgOTcgMTMxIAorOTkgMTk2IDE0NCA0NSA4MSAyMiAxMTIgMTQyIDcyIDEzMSAxNDggODMgMTYyIDE2MSA3OCAxNDIgMTQgNTMgMTU3IDE0MSAxMzkgNzQgCisyOSAxODAgMzUgNTggMjcgMTE1IDE5OCAxIDkwIDEzOCAxNjcgODkgMTczIDE5MiA0OCAxMzcgMTU5IDExNCAxMzIgMTU2IDU4IDE2MCAKKzE1NCA2OCA3NiAxOSA1NiA1IDcwIDE0MSA2NCAxMTMgMTUwIDQ3IDEyOSAxODQgNzMgOTYgMTY2IDEyNCAxNTUgMTUxIDU1IDE0NyAxNyAKKzEwOSA4NiAxMDAgMTI5IDIwMSAxNjQgMTkyIDE0OSA3IDE5MyA1NiAxMTIgMjAwIDEwNyAxMjIgMTMzIDYzIDIwNiAyIDQwIDc4IDkgCisxODMgMTQwIDgyIDQgMTMgNzEgNDggNCAxNjMgMjAxIDU3IDYyIDE0MCAxNTcgOCAxMDAgMjA0IDE2MiA4NiAxMTcgMTIgODkgMTQ3IDc1IAorMTQ0IDEyMCA4NSAxMDkgMzcgNDggMTU0IDg1IDIgMTE1IDM5IDk2IDEwOCA0NiAxNjQgMSAzMiAxMDMgMTc2IDE0NyAxNTAgMTA1IDIwNyAKKzEwIDE1IDExOSAyIDE3MyAxMTcgODcgNTAgNjkgNTAgMjAyIDM5IDE3MSA2OSAxMzMgODkgNzIgMTE0IDU3IDE5NSAxNzkgNzAgODMgMjkgCisxMjIgNjcgODUgMTM1IDExMSAxNjAgMTcxIDIwMiAxNzIgMiAxNDcgMTgzIDMzIDE2MCAzOCAxNjMgNTEgOTIgNTMgODIgMTM3IDUyIAorMTQ5IDEyMyA5OCA4MSAzOSAzOCAzMCA1NSAxNCAxODYgMTk2IDExIDYgMyAxNTUgMTggMTYgMjYgMTUwIDE4MCAxNjggOTcgMTQ4IDI1IAorODQgMTI3IDEzNiAxMTkgMTM1IDQgMzAgMTYyIDE0NCAxOTUgNDYgMzEgMTcwIDExOSAyOCAxOTAgXgorNDQzIDEgMTcgOTYgMTY3IDI3IDkxIDE1MiAxMDAgMTA2IDEwOSA2NSAxNjQgMTAgNTcgNzEgMTY3IDEyMyAyMDkgNzQgNTcgMTM3IDk1IAorMzAgOTAgMiA3OCAxMTAgMTAxIDE0NyAxMzggMjIgMTc3IDIyIDEyOSA2OCAxNjggNjMgNzQgNzAgNjUgMiAxNzQgMTggMjMgNTEgMTE2IAorOCAxNDIgMTU4IDEyMSAzNiAyMDcgMjA3IDQ1IDIwOSAxNzAgMTIyIDU5IDUyIDggNzYgMjAgNCAxMDIgNjkgMTg2IDcyIDQ2IDEwNiAKKzEyNyAzOSAxMTAgMTQ5IDEwMSA5OSAxODQgNjEgMTUgODUgMTM2IDU5IDEwMCAxNzIgMzcgMTgyIDk4IDk1IDc4IDQ0IDE3MyAzMCAyMDQgCis5NCAxNTYgMjA2IDEyMyAxNjEgMTIwIDk2IDEzMiAxIDM3IDEzNCAxNDQgMTM0IDEyNiAxNjAgMTgwIDIxIDEzNiAyMDMgMTE5IDU1IAorMTU2IDQ0IDc3IDEyMiA3MiAxOTAgMTI1IDEwIDEwNSAyNSAxMjggNzUgOTMgNjcgMTMgMjA1IDE5NiAxNCAzMSAxNzkgMTQyIDIwNiA3NSAKKzIwNyAxNTkgOTEgMzggOCAyOCA2NiA0MyAxNTAgMTg1IDE5MyA2MyAxMzUgNSAxNDMgOTggMTQzIDMyIDUgMTI1IDEyNCAxOTcgMTAzIAorMTQgOTcgMTA3IDEwMiA4NyAzIDE4IDE4NSA5NyAxNTUgNTYgNDggMTY1IDExMiAxNzggMTA2IDEzIDE1NyAzMiA1MyA3OSA4NSAxNDkgCisxOTcgNyAxMDYgMTc1IDIwMyA3MSAxMDEgMTk1IDkyIDE5MyAxMjkgMTE2IDEyMiAyNCAyNiA3IDU4IDExIDMyIDExOSA3IDIwMiA4MyAKKzEyNSAyOCA3OSAxODEgNTcgMTE5IDEyMSA4NCAxNjEgMTY4IDUwIDkzIDE2MyAxMzEgMTI3IDE1MyA0NSAxNyAxNDQgMTIxIDE5OCA0MyAKKzM2IDkzIDExNSAxNzcgMTY2IDE0OCAxMDggMjQgMTg4IDUzIDk3IDU5IDE0OCAxMjYgMjA4IDEzNCAxOTIgODggODcgMTEyIDY0IDE0IAorMTQ1IDYxIDYzIDM5IDk3IDExIDE5NCAxNjUgNDYgNDAgMTk5IDEzMiAxOSAxMSA4MCA3MyAxNzggMTU0IDE3NyAxMTggMzcgMTQ3IDcyIAorOTQgNjAgODggMjAxIDQ3IDE0MiAxMTAgMTY3IDc1IDQ1IDExMyA1MiA0MyAxMDIgMjEgMjIgMTExIDQxIDEyIDEzNCAzMCA0MiA0OCAKKzExNyAxNTggNyAxNTQgMTI5IDE2NCA3NiAxOTUgMTg4IDEwMSA1MSAyMCAxMDAgMTAgMjAxIDE0MyA1MCAzMiA3MSA1MyAzMSAxMzEgMzEgCiszNSAxMjMgMTEzIDE2NiAxMzUgMTgwIDExNyA0NCAxMjUgNzYgMzMgMTQyIDYyIDMgMTE0IDkzIDE5IDU5IDM0IDM0IDEzMCAzOCAxNzAgCis3NCAxMDUgOTEgNTYgMTkyIDI3IDIwNSAzNCAxNzggMjAyIDEzMSA3OSAxOTkgODQgNjUgNTAgMTI4IDE4OSAxODUgMTQ1IDEwOSAxNyAKKzQ5IDEwNSAxODcgMTc0IDExNCAxNDEgMTgzIDIwIDE5NiAxMjggMTIzIDQ3IDI4IDE4IDg5IDE4OSAyMyA5OSA3MCAxNzkgOTQgNDIgCisxMTQgNDUgNjUgOTggODIgMTUwIDEzNyAyOSAxMDIgMTgzIDY4IDE1MCA4OSA3NSAxNDEgMjEgMTg0IDE1NyA4MCA3IDQwIDM3IDg2IAorMTkwIDE2IDE3NCA2NiAxODcgMTIgNjggMTAyIDEzNSAxMTQgMTg5IDEzNyAxOTEgMTQ4IDEyIDExNiA1NiA5NiAxMTkgNzMgMTMwIDIwMCAKKzYgMTEzIDEwMCAxNTQgNjMgMjYgMTE2IDEwNCA1MCA4MCAyNSAxNCAxOTMgODMgXgorNDM2IDEgMjQgNDQgMTkxIDIxMSAxMzggMTEgMTM4IDE4IDE0MCA5OSAxMzMgMTA0IDU0IDEyNCA0MiA2MyA4OCA5NSAxMzcgMTMzIDE1MSAKKzExNiAxNjIgMjA4IDE5MyAxODAgMTgwIDE3MyAyNiAxNTggMTY1IDE2MCAyNiA2IDE4IDc5IDMzIDEgOTcgNTkgNDUgNjIgNTEgMTcyIAorMTQxIDI0IDM3IDE4OSAxMzAgMTQ1IDYgNzIgMTQzIDE1MiAxNjAgODcgNCAxNTAgODYgMjggODAgNzcgNzEgMTA2IDE2IDE2NCAxMjMgCisxMDMgMTAgNTQgMTc4IDEwNiAxMTQgMzQgODUgMTUwIDkzIDE3NSA5MyA3MCA3NiAyNyAzNiAxNTIgMjA3IDQgNDIgMTAzIDMgMTIwIDk3IAorMTEzIDEwOSAxODEgMjEwIDE2MiAxNTQgMTI5IDYxIDE2NiAzOCAxMyA1MyAxNDEgMTgzIDE4NiAxMzggMTg0IDEwIDYxIDExMiAxMTkgCisxNzUgMTA3IDYgMTcwIDgxIDExNCAyMDcgMTAyIDEyNSA2NSA1MCAxMzUgNzMgMjggNzMgNzUgMjAzIDExMyAxMSA5OCAzNSAxMTUgNzEgCis4IDE0NiAyMDIgNzYgODggMTAyIDEzOSAxIDE0NCAxODkgODMgMTUgMTgxIDUxIDEzIDYwIDc1IDUxIDE3OSAxNDMgMzcgMzAgNDkgNTEgCisyMCAyMDcgMTU2IDQ0IDE4NCA2NCAxMjUgMTggMTMzIDk3IDUyIDExMSAxOTQgNTggMTY3IDc1IDE0OSA0OSAxMDUgODQgMTEzIDE3MCAKKzE3OSAxOTcgMTY5IDE0OSAyMDggNDEgMTc4IDk5IDE4MCAyMSA5MiAxNDUgMTcyIDE1NSAxMDUgMTMxIDMwIDIwOCAyMDAgMTE0IDQ4IAorMjEgMzEgNzkgNDAgMTQ4IDE3OCA1MiA1MCAxOTYgNzEgMTYwIDgwIDcwIDY5IDkzIDIzIDE1OSAyMDIgODMgMjIgMTE1IDEzMiA2IDY1IAorMjA5IDcxIDE2NyAxNCAxNTEgMTMwIDk4IDg5IDM0IDE5MCAxNjcgNjggMiAxODEgMTEyIDc5IDE5MiA4MiAxOTEgNDUgNTUgNDkgMTU5IAorMTQ4IDE5IDExNiAxNjkgMTQyIDYxIDE3MyAxODUgOTQgNDYgMTQ2IDEwNCAyMDYgMTI2IDU1IDU2IDkzIDE2IDEyIDEyMSA5MCAxNyA0OSAKKzQ0IDE4IDEyNiAxNjMgMzkgNTAgMTg5IDEzNyAxNDcgODcgNjUgMyA1IDM1IDc1IDE1NiAxOTYgMTE4IDc3IDExOCAyMyA1NCAxODUgNDAgCisxOTUgOTUgOTAgNzEgMTEzIDE2MyAzMiAxMTYgMTA4IDE0NCA3NCAxNjYgMTkwIDE1IDEzNCAxMzQgMTg4IDM5IDE1OCAxNzIgOTQgMTA3IAorMjEyIDIzIDUzIDEzNCAzNiAxMDUgNzcgMTExIDg5IDE4NiAxMjQgMzUgNjEgNyAxMDIgMTMyIDY3IDEzMSAxMjggNzggMTYyIDE2MSA2MyAKKzE0MiAxNCA0MyAxNDcgMTQxIDEyOSA1NCAxOSAxNzAgMjAgNDggNyA5NSAxOTggMTk5IDcwIDEyMyAxNTcgNzQgMTczIDE5MiAyOCAxMjcgCisxMzkgMTA5IDEyNyAxNDYgNDMgMTQwIDEzOSA0OCA2MSAxNCAzNiA2MCAxMzYgNDkgOTggMTUwIDMyIDEwOSAxNzQgNjMgODEgMTYxIAorMTI0IDE0MCAxNDYgNTAgMTQyIDcgMTA5IDY2IDgwIDEyNCAyMDEgMTQ0IDE4MiAxNDkgMiAxODggNDYgOTIgMTg1IDg3IDExMiAxMzMgCis0MyAyMDEgMjA1IDM1IDY4IDkgMTgzIDEyNSA3MiAxOTcgMyA2NiAzMyAyMDcgMTYzIDE5MSA1MiA1NyAxMzAgMTUyIDggODUgMjA0IAorMTU3IDgxIDEwNyAyMDUgMTg3IF4KKzQ2MiAxIDEyNiA1NCAxMjMgMTEzIDg1IDgxIDIzIDQxIDE1NCA3MSAyMTAgMTE1IDE4IDg5IDEwOCAzMiAxNTcgMjA5IDExIDEwMyAxNzYgCisxMzMgMTM2IDc3IDE5MyAxMCAyMDkgMTEyIDE5NiAxNjYgMTEwIDY2IDQzIDY5IDE5NCAzNiAyMDIgMjUgMTcxIDYyIDExMiA4MiA0NCAKKzEwMCA0MyAxODggMTcyIDcwIDgzIDI5IDExNSA2NyA2NCAxMjggODMgMTUzIDE2NCAxOTUgMTU4IDIgMTE5IDE4NyAxNjkgMzMgMTYwIAorMzEgMTQ5IDIzIDY0IDMyIDYxIDEwOSA0NSAxMjEgMTAyIDc3IDc0IDMyIDM4IDE2IDU1IDcgMTcyIDE4OSAxOTggMjAwIDIxMSAxNDEgCisxMSAyIDUgMTQzIDE1OSAxNDcgOTAgMTM0IDI1IDcwIDEwNiAxMjIgMTA1IDExNCAyMTIgMzAgMTQxIDEzMCAxOTUgMzkgMjQgMTYzIDkxIAorMjggMTEgNyA3NiAxNjcgMTcgODEgMTM3IDg1IDg2IDk0IDY1IDE0OSA1IDQyIDY2IDE1NyAxMTMgMjA0IDU5IDU3IDEzNyA4MCAxNSA3MCAKKzIwNyA3OCA5NSA5MSAxNDIgMTMzIDE3IDE3NyAyMiAxMjkgNjggMTY4IDQzIDc0IDUwIDYwIDE5NyAxNzQgMyAxMyAzNiAxMDYgMyAxMjcgCisxNTggMTE2IDI2IDE5NyAxOTIgMjUgMTk0IDE1NSAxMDIgNTkgNTIgMjAzIDU2IDIwIDIxNCA4MiA0OSAxNzEgNjcgNDYgMTA2IDExNyAKKzM0IDkwIDEzOSA5NiA5NCAxNzkgNTYgMTUgNjUgMTM2IDU0IDEwMCAxNTcgMTcgMTgyIDkzIDc1IDYzIDI0IDE2OCAyNSAxODkgODQgCisxNTYgMjAxIDExOCAxNTYgMTA1IDk2IDExMiAyMDEgMjIgMTM0IDEzOSAxMTQgMTE2IDE0NSAxNzUgMTEgMTIxIDE5OCA5OSA0MCAxNTEgCiszNCA3MiAxMTcgNTIgMTkwIDEwNSA5MCAyMCAxMTggNjAgODMgNTIgMjA4IDIwNSAxODEgMjA5IDE2IDE3NCAxMjIgMjA2IDcwIDIwMiAKKzE0NCA3MSAxOCAyMDggOCA2NiAzOCAxMzUgMTcwIDE3OCA1MyAxMTUgNSAxMzggODggMTIzIDE3IDIwMCAxMTUgMTE5IDE4MiA5OCA5IAorODcgOTcgMTAyIDcyIDMgOCAxODAgODIgMTQ1IDU2IDMzIDE2NSAxMDIgMTczIDk2IDIxMyAxNTcgMTIgMzMgNjkgODAgMTI5IDE5MiAyIAorMTAxIDE2NSAyMDMgNTEgODYgMTkwIDg3IDE5MyAxMjQgMTE2IDEyMiA0IDIxIDcgNTMgMjExIDI3IDEwNCAyMDcgMTk3IDczIDEyNSAyMyAKKzU5IDE3NiAzNyAxMTQgMTExIDc0IDE1MSAxNTMgNTAgNzMgMTQ4IDExNiAxMjcgMTUzIDQ1IDIgMTI0IDEyMSAxOTMgMjggMTYgNzggCisxMDAgMTYyIDE2NiAxMjggODggOSAxODggNTMgOTIgNDkgMTQ4IDExMSAxOTMgMTI5IDE4NyA2OCA3NyA5MiA1NCA0IDEzNSA1MSA2MyAKKzE5IDk3IDEgMTk0IDE1MCAzMSAzNSAxOTQgMTMyIDkgMjA2IDc1IDU4IDE2OCAxNDQgMTY3IDExOCAzNyAxMjcgNjIgOTQgNjAgNzggCisxOTYgNDcgMTMyIDExMCAxNjIgNjUgMzUgOTggMzIgNDMgODcgMSAyIDEwNiAyMSAxMiAxMjQgMjAgMjIgMzggMTE3IDE0OCAyMTIgMTQ5IAorMTE5IDE2NCA3NiAxODAgMTgzIDEwMSA0NiAxMCA5NSAyMDUgMTg2IDE0MyA0MCAzMiA1NiAzOCAyMSAxMjYgMzEgMzAgMTIzIDEwOCAKKzE1MSAxMzUgMTY1IDEwNyAyOSAxMjAgNzEgMTMgMTM3IDYyIDIwOCAxMDQgODggNCAzOSAyOSAxOSAxMTUgMjMgMTYwIDU0IDEwNSA5MSAKKzQxIDE3NyAyNyAyMDAgMTQgMTYzIDEyNCBeCis0NTMgMCAxMTUgNzkgMTk5IDg0IDQ5IDE4IDEyOCAxNzMgMTY5IDEyMSA5MyAxNyAxODYgNDEgODkgMTg3IDE1OCA5MCAxMzMgMTY3IAorMjA2IDE4OCAxMDQgOTkgMzEgNCAxOCA4MSAxNjUgMjE3IDc1IDU0IDE3OSA2MiAzNCAxMDYgMzcgNDEgNjYgODIgMTM0IDExMyAyMTUgCis4NiAxNTkgMzYgMTQyIDY1IDQzIDEyNSAyMTUgMTYwIDE0OSA0OCAxOTMgMjQgMjEgODYgMTgyIDE2IDE2NiA0MiAxNzkgMjA2IDQ0IDk0IAorMTExIDgyIDE4MSAxMjEgMTY3IDEzMiAxOTggOTIgNDggNzIgMTE5IDU3IDExNCAxODQgMjAwIDgxIDY4IDEyMiAzOSAyNiA4NCA5NiAyNiAKKzgwIDEgMjA4IDE3NyAyMTcgMjQgNDQgMTkxIDIwNiAxMTggMjA5IDEyMyA4IDE0MCA5OSAxMjggOTkgNTQgMTA5IDQyIDU4IDgzIDgwIAorMTIyIDExMyAxNDEgOTYgMTQ3IDIwMyAxODMgMTgwIDE3NSAxNTggMTYgMTQzIDE1NSAxNTUgMTEgMSAxMyA2NCAyMyAxIDg3IDU0IDM1IAorNTIgNDYgMTU3IDEyMSAxOSAyNyAxNzQgMTE1IDEzMCAyMDkgNzIgMTIzIDE1MiAxNTAgODcgMjAyIDE0MCA3NiAyMyA3NSA3NyA2NiA4NiAKKzExIDE0OSAxMTggODggNDQgMTY4IDEwMSA5NCAxNCA4MCAxNDUgOTMgMTY1IDczIDY1IDY2IDEyIDIxIDEzNyAxOTIgNCAyMiA4MyAyMDEgCisxMjAgNzcgMTEzIDk0IDE4MSAxOTUgMTU3IDE0NCAxMjQgNTEgMTUxIDMzIDIxMSAzOCAxMzEgMTc4IDE4NiAxMzggMTg0IDUgNjEgOTIgCis5OSAxNzUgMTA3IDYgMTU1IDgxIDExNCAyMDcgODcgMTA1IDQ1IDQwIDEyMCA3MyAxOCA1OCA2MCAxOTMgOTggMTEgOTggMTUgMTAwIDUxIAorMyAxNDYgMTg3IDYxIDg4IDk3IDEzOSAyMDQgMTI5IDE4OSA3MyAyMTMgMTcxIDM2IDIxNiA1NSA1NSA1MSAxNzQgMTM4IDE3IDE1IDQ5IAorNDEgMTUgMTk3IDE0NiAzOSAxNzQgNjQgMTIwIDMgMTIzIDgyIDM3IDExMSAxNzkgNTggMTU3IDcwIDEzNCAzOSAxMDAgNzQgMTA4IDE3MCAKKzE2NCAxOTcgMTY5IDE0NCAxOTggNDEgMTYzIDg0IDE3MCAxNiA5MiAxNDUgMTY3IDE1NSA4NSAxMTYgMjUgMjA4IDIwMCAxMDQgNDggMjEgCisxNiA2OSA0MCAxNDMgMTc4IDQyIDM1IDE5NiA1NiAxNDUgNzAgNjAgNDkgODggMjMgMTQ5IDE5MiA3OCAxMiA5NSAxMjcgMjA0IDU1IAorMTk5IDYxIDE2MiAyMTIgMTUxIDEzMCA4OCA3NCAzNCAxODAgMTUyIDUzIDIxMCAxNjYgMTEyIDc0IDE4MiA2NyAxNzYgMzAgMzUgMjkgCisxNTkgMTMzIDE5IDEwMSAxNjQgMTI3IDU2IDE2OCAxNzUgODQgMjYgMTMxIDEwNCAxOTYgMTI2IDQwIDQ2IDgzIDYgNyAxMDEgOTAgMTIgCis0NCAyNCAyMTYgMTA2IDE1OCAzOSAzMCAxNzkgMTMyIDE0NyA4MiA2MCAyMTYgMjAzIDM1IDc1IDE1MSAxODEgOTggNjIgMTA4IDMgNDkgCisxODUgMjUgMTg1IDk1IDgwIDcxIDEwMyAxNTMgMjIgMTA2IDg4IDE0NCA1NCAxNTYgMTc1IDEwIDEyOSAxMTkgMTc4IDE5IDE0OCAxNzIgCis3OSAxMDIgMjA3IDEzIDIwOCAzMyAxMTQgMzYgOTUgNTcgOTEgNzkgMTc2IDEwNCAyNSA0MSAyMTAgOTIgMTIyIDYyIDEzMSAxMDggNzMgCisxNjIgMTYxIDQ4IDE0MiAxNCAzMyAxMzcgMTQxIDExOSAzNCA5IDE2MCA1IDM4IDIwNSA3NSAxOTggMTg5IDUwIDEwOCAxMTIgXgorNDU0IDEgNTMgMTczIDE5MiAxMTMgMTExIDEwMiAxMjAgMTMyIDIyIDExMiAxMTggMjAgNDAgNyA4IDIxMyA0NiAxMjkgMjggNzcgMTUwIAorMTEgODEgMTYwIDQ5IDYwIDE1NCAxMjQgMTE5IDEzOSA0MyAxMzUgMjEzIDEwOSAzOCA1MiAxMTcgMjAxIDExNiAxNjggMTQ5IDIxNSAKKzE4MSAzMiA2NCAxNjQgNTkgOTggMTMzIDE1IDE5NCAxOTggMjggNTQgOSAxODMgMTA0IDU4IDE3NiAyMDkgNTkgMTIgMjAwIDE2MyAxNzcgCis0NSA1MCAxMTYgMTQ1IDggNjQgMjA0IDE1MCA3NCA5MyAxODQgODkgMTExIDM5IDEwOCAxMDggODUgNjEgMTMgMzYgMTU0IDYxIDIxMCAKKzExNSAzIDg0IDEwOCAyMiAxNTIgMjA5IDIxNiAxMDMgMTc2IDEyMyAxMjYgNTcgMTgzIDEwIDE5OSAxMDcgMTg2IDE2MSAxMDUgNTEgMzggCis2OSAxODQgMjYgMjAyIDE1IDE3MSA1NyA5NyA3NyAyNCA5MCAzMyAxODMgMTY3IDcwIDgzIDI5IDExMCA2NyA0OSAxMjMgNjMgMTQ4IAorMTU5IDE5MCAxNDggMiA5OSAxNzIgMTU5IDMzIDE2MCAyNiAxMzkgMyA0NCAxNyA0NiA4OSA0MCAxMDEgODcgNjIgNjkgMjcgMzggNiA1NSAKKzIgMTYyIDE4NCAxODMgMTkwIDIxMSAxMzEgNiAyMTIgMjEwIDEzOCAxNDQgMTMyIDg1IDEyNCAyNSA2MCA5MSAxMTIgOTUgOTkgMjEyIAorMzAgMTI2IDEyMCAxOTUgMzQgMTkgMTU4IDcxIDI4IDIxMSAyMTcgNTYgMTY3IDcgNzEgMTIyIDcwIDY2IDc5IDY1IDEzNCAyNyA2MSAKKzE0NyAxMDMgMTk5IDQ0IDU3IDEzNyA2NSA1MCAyMDIgNzggODAgODEgMTM3IDEyOCAxMiAxNzcgMjIgMTI5IDY4IDE2OCAyMyA3NCAzMCAKKzU1IDE4MiAxNzQgMjA4IDMgMjEgOTYgMjE4IDExMiAxNTggMTExIDE2IDE4NyAxNzcgNSAxNzkgMTQwIDgyIDU5IDUyIDE4OCAzNiAyMCAKKzIxNCA2MiAyOSAxNTYgNjIgNDYgMTA2IDEwNyAyOSA3MCAxMjkgOTEgODkgMTc0IDUxIDE1IDQ1IDEzNiA0OSAxMDAgMTQyIDIxNyAxODIgCis4OCA1NSA0OCA0IDE2MyAyMCAxNzQgNzQgMTU2IDE5NiAxMTMgMTUxIDkwIDk2IDkyIDE5MSA3IDEzNCAxMzQgOTQgMTA2IDEzMCAxNzAgCisxIDEwNiAxOTMgNzkgMjUgMTQ2IDI0IDY3IDExMiAzMiAxOTAgODUgMjEwIDc1IDE1IDEwOCA0NSA3MyAzNyAxOTMgMjA1IDE2NiAxOTQgCisxIDE2OSAxMDIgMjA2IDY1IDE5NyAxMjkgNTEgMjE4IDE5OCAyMDggNjYgMzMgMTIwIDE1NSAxNjMgNDMgOTUgNSAxMzMgNzggMTAzIDIgCisxODUgMTA1IDExNCAxNjcgOTMgNCA3NyA4NyAxMDIgNTcgMyAyMTggMTc1IDY3IDEzNSA1NiAxOCAxNjUgOTIgMTY4IDg2IDIwMyAxNTcgCisyMTIgMTMgNTkgNzUgMTA5IDE4NyAyMTcgOTYgMTU1IDIwMyAzMSA3MSAxODUgODIgMTkzIDExOSAxMTYgMTIyIDIwNCAxNiA3IDQ4IAorMjAxIDIyIDg5IDE5NyAxOTIgNjMgMTI1IDE4IDM5IDE3MSAxNyAxMDkgMTAxIDY0IDE0MSAxMzggNTAgNTMgMTMzIDEwMSAxMjcgMTUzIAorNDUgMjA3IDEwNCAxMjEgMTg4IDEzIDIxNiA2MyA4NSAxNDcgMTY2IDEwOCA2OCAyMTQgMTg4IDUzIDg3IDM5IDE0OCA5NiAxNzggMTI0IAorMTgyIDQ4IDY3IDcyIDQ0IDIxNCAxMjUgNDEgNjMgMjE5IDk3IDIxMSAxOTQgMTM1IDE2IDMwIDE4OSAxMzIgMjE5IDE5MSA3MCA0MyAKKzE1OCAxODEgXgorNDc1IDAgMTUzIDExOCAzNyA5OSA0OCA5NCA2MCA2NCAxODkgNDcgMTE4IDExMCAxNTUgNTEgMjEgNzcgNCA0MyA2NiAxOTUgMTk2IDk5IAorMjE1IDEyIDExMCA2IDIxNiAyNCAxMTcgMTM0IDIwNSAxNDIgMTA1IDE2NCA3NiAxNTkgMTc2IDEwMSAzOSAyMTggODggMTg0IDE2NSAKKzE0MyAyNiAzMiAzNSAxNyA3IDExOSAzMSAyMyAxMjMgMTAxIDEzMCAxMzUgMTQ0IDkzIDggMTEzIDY0IDIwNyAxMzAgNjIgMjAxIDkwIAorODEgMjA1IDExIDIyIDIyMCA5NCAyIDE0NiAyNiAxMDUgOTEgMjAgMTU2IDI3IDE5MyAyMDggMTQyIDE3OCAxMDcgNzkgMTk5IDg0IDQxIAorMiAxMjggMTY1IDE2MSAxMDkgODUgMTcgMTc0IDM3IDgxIDE4NyAxNTAgNzggMTI5IDE1OSAxOTQgMTg0IDkyIDg3IDIzIDIxNCAxOCA3NyAKKzE1MyAyMDkgNjMgNDYgMTc5IDQ2IDMwIDEwMiAzMyAyOSA1MCA4MiAxMjYgMTAxIDIwMyA3OCAxNDcgMjAgMTM4IDUzIDI3IDExNyAyMDcgCisxNDggMTQ1IDMyIDE4MSAxNiAxMyA4NiAxNzggMTYgMTYyIDMwIDE3NSAxOTggMzIgOTAgOTkgNjYgMTc3IDExMyAxNTUgMTI0IDE4NiAKKzgwIDQ0IDYwIDExOSA0OSAxMDYgMTc2IDE5MiA2NSA1MiAxMDYgMjcgMjYgNjggOTIgMTQgODAgMjExIDIwMCAxNjkgMjEzIDI0IDQ0IAorMTkxIDIwMiAxMDIgMTk3IDExMSAxNDAgOTkgMTI0IDk1IDU0IDk3IDQyIDU0IDc5IDY4IDExMCA5NyAxMzMgODAgMTM1IDE5OSAxNzUgCisxODAgMTcxIDE0NiA4IDEzMSAxNDcgMTUxIDIyMSAyMTkgOSA1MiAxNSAxIDc5IDUwIDI3IDQ0IDQyIDE0NSAxMDUgMTUgMTkgMTYyIAorMTAzIDExOCAyMDEgNzIgMTA3IDE1MiAxNDIgODcgMTkwIDEzMiA2OCAxOSA3MSA3NyA2MiA3MCA3IDEzNyAxMTQgNzYgMjE0IDM2IDE2MCAKKzk3IDc4IDIyMCA3NiAxNDEgOTMgMTU3IDU3IDYxIDU4IDkgMTI1IDE4MCA0IDYgNjcgMTg5IDEyMCA2MSAxMTMgODIgMTgxIDE4MyAxNTMgCisxMzYgMTIwIDQzIDEzOSAyOSAxOTkgMjYgMTIzIDE3NCAxODYgMTM4IDE4NCAxIDYxIDc2IDgzIDE3NSAxMDcgNiAxNDMgODEgMTE0IAorMjA3IDc1IDg5IDI5IDMyIDEwOCA3MyAxMCA0NiA0OCAxODUgODYgMTEgOTggMjIxIDg4IDM1IDIyMSAxNDYgMTc1IDQ5IDg4IDkzIDEzOSAKKzE5NiAxMTcgMTg5IDY1IDIwMSAxNjMgMjQgMjA4IDUxIDM5IDUxIDE3MCAxMzQgMSAzIDQ5IDMzIDExIDE4OSAxMzggMzUgMTY2IDY0IAorMTE2IDIxMyAxMTUgNzAgMjUgMTExIDE2NyA1OCAxNDkgNjYgMTIyIDMxIDk2IDY2IDEwNCAxNzAgMTUyIDE5NyAxNjkgMTQwIDE5MCA0MSAKKzE1MSA3MiAxNjIgMTIgOTIgMTQ1IDE2MyAxNTUgNjkgMTA0IDIxIDIwOCAyMDAgOTYgNDggMjEgNCA2MSA0MCAxMzkgMTc4IDM0IDIzIAorMTk2IDQ0IDEzMyA2MiA1MiAzMyA4NCAyMyAxNDEgMTg0IDc0IDQgNzkgMTIzIDE5MiA0NyAxOTEgNTMgMTU4IDIwMCAxNTEgMTMwIDgwIAorNjIgMzQgMTcyIDE0MCA0MSAyMDYgMTU0IDExMiA3MCAxNzQgNTUgMTY0IDE4IDE5IDEzIDE1OSAxMjEgMTkgODkgMTYwIDExNSA1MiAKKzE2NCAxNjcgNzYgMTAgMTE5IDEwNCAxODggMTI2IDI4IDM4IDc1IDIyMCAzIDg1IDkwIDggNDAgOCAyMDQgOTAgMTU0IDM5IDE0IDE3MSAKKzEyOCAxNDcgNzggNTYgMjE2IDE5MSAzNSA3NSAxNDcgMTY5IDgyIDUwIDEwMCAyMDkgNDUgMTg1IDEzIDE3NyA5NSAxNTAgXgorNDcxIDAgNzEgODkgMTM5IDggOTIgNjAgMTQ0IDI2IDE0MiAxNTQgMyAxMjIgOTggMTY0IDIxNiAxMzQgMTcyIDU4IDk1IDIwMCAyMjQgCisyMDEgNSA4NiAzNiA4MSAyOSA2MyA2NSAxNjIgNzYgMTEgMTMgMTk2IDc4IDEwOCA1NSAxMzEgODAgNjYgMTYyIDE2MSAyNyAxNDIgMTQgCisxOSAxMjMgMTQxIDEwNSA2IDIyMCAxNDYgMjA5IDI0IDE4NCA0NyAxOTggMTc1IDIyIDg3IDEzMyAzOCAxNzMgMTkyIDIwNSAxMDMgOTEgCis5NyAxMTUgMTIyIDcgOTIgMTAzIDI1IDIgMjEzIDIxMyAzNiAxMjQgMTMgNjIgMTUwIDIyMSA2MSAxNTAgMzkgNDUgMTQ5IDEyNCAxMDQgCisxMzQgMzggMTMwIDIwOCAxMDkgMTggMzIgMTEyIDIwMSA5NiAxNTggMTQ5IDIxNSAxNzYgMjIgNDQgMTQ5IDM5IDg4IDEzMyAyMjAgMTg5IAorMTkzIDIzIDQ0IDkgMTgzIDg5IDQ4IDE2MSAyMDQgNTQgMjIyIDE5NSAxNjMgMTY3IDQwIDQ1IDEwNiAxNDAgOCA0OSAyMDQgMTQ1IDY5IAorODMgMTY5IDg5IDk2IDI0IDkzIDEwMyA4NSA0MSAzIDMxIDE1NCA1MSAyMTAgMTE1IDIxMyA3OSAxMDggMTIgMTQ3IDIwOSAyMDYgMTAzIAorMTc2IDExMyAxMTYgMzcgMTczIDEwIDE4OSAxMDIgMTc2IDE1NiAxMDAgMzYgMzMgNjkgMTc0IDE2IDIwMiA1IDE3MSA1MiA4MiA3MiA0IAorODAgMjMgMTc4IDE2MiA3MCA4MyAyOSAxMDUgNjcgMzQgMTE4IDQzIDE0MyAxNTQgMTg1IDEzOCAyIDc5IDE1NyAxNDkgMzMgMTYwIDIxIAorMTI5IDIwOCAyNCAyIDMxIDY5IDM1IDgxIDcyIDQ3IDY0IDIyIDM4IDIyMSA1NSAyMjIgMTUyIDE3OSAxNjggMTgwIDIxMSAxMjEgMSAKKzIwNyAyMDAgMTMzIDEyOSAxMTcgODAgMTE0IDI1IDUwIDc2IDEwMiA4NSA4NCAyMTIgMzAgMTExIDExMCAxOTUgMjkgMTQgMTUzIDUxIAorMjggMTk2IDIxMiAzNiAxNjcgMjIyIDYxIDEwNyA1NSA0NiA2NCA2NSAxMTkgMjIwIDEyIDU2IDEzNyA5MyAxOTQgMjkgNTcgMTM3IDUwIAorMjEwIDMwIDE5NyA3OCA2NSA3MSAxMzIgMTIzIDcgMTc3IDIyIDEyOSA2OCAxNjggMyA3NCAxMCA1MCAxNjcgMTc0IDE5OCAyMTggNiA4NiAKKzIxOCA5NyAxNTggMTA2IDYgMTc3IDE2MiAyMTAgMTY0IDEyNSA2MiA1OSA1MiAxNzMgMTYgMjAgMjE0IDQyIDkgMTQxIDU3IDQ2IDEwNiAKKzk3IDI0IDUwIDExOSA4NiA4NCAxNjkgNDYgMTUgMjUgMTM2IDQ0IDEwMCAxMjcgMjAyIDE4MiA4MyAzNSAzMyAyMDkgMTU4IDE1IDE1OSAKKzY0IDE1NiAxOTEgMTA4IDE0NiA3NSA5NiA3MiAxODEgMjE3IDEzNCAxMjkgNzQgOTYgMTE1IDE2NSAyMTYgOTEgMTg4IDU5IDEwIDE0MSAKKzE0IDYyIDEwNyAxMiAxOTAgNjUgMjA1IDYwIDEwIDk4IDMwIDYzIDIyIDE3OCAyMDUgMTUxIDE3OSAyMTEgMTY0IDgyIDIwNiA2MCAxOTIgCisxMTQgMzEgMjAzIDE4OCAxOTMgNjYgMjggMTA1IDE0MCAxNDggMzMgNzUgNSAxMjggNjggODMgMjEyIDE3MCA5NSAxMDkgMTUyIDg4IAorMjI0IDY3IDc3IDEwMiA0MiAzIDIxMyAxNzAgNTIgMTI1IDU2IDMgMTY1IDgyIDE2MyA3NiAxOTMgMTU3IDE5NyAyMTggNDkgNzAgODkgCisxODIgMjE3IDkxIDE0NSAyMDMgMTEgNTYgMTgwIDc3IDE5MyAxMTQgMTE2IDEyMiAxODkgMTEgNyA0MyAxOTEgMTcgNzQgMTg3IDE4NyAKKzUzIDEyNSAxMyAxOSAxNjYgMjIyIDEwNCA5MSA1NCAxMzEgMTIzIDUwIDMzIDExOCA4NiAxMjcgMTY3IF4KKzQ4MCAxIDQ1IDE5MyA3NiAxMjEgMTgxIDIxOSAxOTUgNDIgNjQgMTI2IDE2NiA4MCA0MCAyMDAgMTg4IDUzIDgwIDI1IDE0OCA3NSAxNTcgCisxMTcgMTc1IDIwIDUzIDQ0IDMwIDIwNyAxMTEgMjcgNjMgMTk4IDk3IDIwNCAxOTQgMTE0IDIyMiAyMyAxODIgMTMyIDIxMiAxNzAgNjMgCisyMiAxNDQgMTIwIDE0MyAxMTggMzcgNzkgMzggOTQgNjAgNTQgMTg0IDQ3IDEwOCAxMTAgMTUwIDQxIDExIDYyIDIxMSA0MyA1MSAxODAgCisxODEgOTQgMjAwIDEyIDEwMCAyMjMgMjAxIDE0IDExNyAxMjQgMjAwIDEzNyA5NSAxNjQgNzYgMTQ0IDE3MSAxMDEgMzQgMjEzIDgzIAorMTY5IDE1MCAxNDMgMTYgMzIgMjAgMiAyMjQgMTE0IDMxIDE4IDEyMyA5NiAxMTUgMTM1IDEyOSA4MyAyMjAgMTA4IDU5IDE5MiAxMjUgCis2MiAxOTYgODAgNzYgMTk1IDIxOCAxNyAyMTAgNzkgMjE0IDEzNiA2IDEwNSA5MSA1IDE0MSAyNyAxODggMTkzIDEyNyAxNjggOTcgNzkgCisxOTkgODQgMzEgMjA5IDEyOCAxNTUgMTUxIDk0IDc1IDE3IDE1OSAzMiA3MSAxODcgMTQwIDYzIDEyNCAxNDkgMTc5IDE3OSA3NyA3MiAKKzEzIDIwNCAxOCA3MiAxMzggMTk5IDQ4IDM2IDE3OSAyNiAyNSA5NyAyOCAxNCAzMCA4MiAxMTYgODYgMTg4IDY4IDEzMiAxMzMgMzggNyAKKzEwNyAxOTcgMTMzIDE0MCAxMiAxNjYgNiAzIDg2IDE3MyAxNiAxNTcgMTUgMTcwIDE4OCAxNyA4NSA4NCA0NiAxNzIgMTAzIDE0MCAxMTQgCisxNzEgNjUgMzkgNDUgMTE5IDM5IDk2IDE2NiAxODIgNDUgMzIgODYgMTIgMjYgNDggODcgMjI2IDgwIDIwMSAxOTAgMTU5IDIwOCAyNCAKKzQ0IDE5MSAxOTcgODIgMTgyIDk2IDIxNyAxNDAgOTkgMTE5IDkwIDU0IDgyIDQyIDQ5IDc0IDUzIDk1IDc3IDEyMyA2MCAxMjAgMTk0IAorMTY1IDE4MCAxNjYgMTMxIDIyNSAxMTYgMTM3IDE0NiAyMTEgMjE5IDQgMzcgNSAxIDY5IDQ1IDE3IDM0IDM3IDEzMCA4NSAxMCA5IDE0NyAKKzg4IDEwMyAxOTEgNzIgODcgMTUyIDEzMiA4NyAxNzUgMTIyIDU4IDE0IDY2IDc3IDU3IDUwIDIgMTIyIDEwOSA2MSAyMDkgMjYgMTUwIAorOTIgNTggMjA1IDcxIDEzNiA5MyAxNDcgMzcgNTYgNDggMjEyIDIyMSAxMTAgMTY1IDQgMjEzIDQ3IDE3NCAxMjAgNDEgMTEzIDY3IDE4MSAKKzE2OCAxNDggMTI2IDExNSAzMyAxMjQgMjQgMTg0IDExIDExMyAxNjkgMTg2IDEzOCAxODQgMjIzIDYxIDU2IDYzIDE3NSAxMDcgNiAxMjggCis4MSAxMTQgMjA3IDYwIDY5IDkgMjIgOTMgNzMgMzEgMzMgMTc1IDcxIDExIDk4IDIwNiA3MyAxNSAyMjEgMTQ2IDE2MCAzNCA4OCA4OCAKKzEzOSAxODYgMTAyIDE4OSA1NSAxODYgMTUzIDkgMTk4IDQ2IDE5IDUxIDE2NSAxMjkgMjA4IDIxNSA0OSAyMyA2IDE3OSAxMjggMzAgCisxNTYgNjQgMTExIDIwMyAxMDUgNTUgMTAgMTExIDE1MiA1OCAxMzkgNjEgMTA3IDIxIDkxIDU2IDk5IDE3MCAxMzcgMTk3IDE2OSAxMzUgCisxODAgNDEgMTM2IDU3IDE1MiA3IDkyIDE0NSAxNTggMTU1IDQ5IDg5IDE2IDIwOCAyMDAgODYgNDggMjEgMjE2IDUxIDQwIDEzNCAxNzggCisyNCA4IDE5NiAyOSAxMTggNTIgNDIgMTMgNzkgMjMgMTMxIDE3NCA2OSAyMjEgNTkgMTE4IDE3NyAzNyAxODEgNDMgMTUzIDE4NSAxNTEgCisxMzAgNzAgNDcgMzQgMTYyIDEyNSAyNiAyMDEgMTM5IDExMiA2NSAxNjQgNDAgMTQ5IDMgMjI2IDIyMCAxNTkgMTA2IDE5IDc0IDE1NSAKKzEwMCA0NyAxNTkgMTU3IDE5MyBeCis0NzEgMCAyMTEgOTggMTA0IDE3NCAxMjYgNyAyNCA2MSAyMTMgMjI1IDU3IDkwIDEgMzMgMjA5IDE4MyA2MiAxNDcgMzkgMjE1IDE1NyAKKzEyMSAxNDcgNzEgNDkgMjE2IDE3MCAzNSA3NSAxNDAgMTQ4IDU0IDI5IDg2IDE4OCAzOCAxODUgMjIxIDE2MyA5NSA1OCA3MSA4MSAxMzEgCis4NCA0NCAxNDQgMTAgMTM0IDE0MiAyMjggMTE4IDg2IDE1NiAyMDQgMTI2IDE3MiA0NiA5MSAxOTYgMjIwIDE5NyAyMTggNzAgMzYgNzMgCisxMyA0NyA1NyAxNTQgNjAgMyAyMjYgMTg4IDcwIDEwMCA1MSAxMzEgNjQgNjIgMTYyIDE2MSAxNSAxNDIgMTQgMTEgMTE1IDE0MSA5NyAKKzIxOSAyMTYgMTM4IDIwMSAxNiAxNzIgMzEgMTk4IDE2NyA2IDc1IDEyNSAyNiAxNzMgMTkyIDE5MyA5NSA3NSA5MyAxMTEgMTE0IDIyNCAKKzc2IDkxIDIxMyAxMyAyMjcgMjAxIDIxMyAyOCAxMjAgMSA1MCAxNTAgMjEzIDQ1IDE0MiAzMSAzMyAxNDUgMTI0IDkyIDEzMCAzNCAxMjYgCisyMDQgMTA5IDIgMTYgMTA4IDIwMSA4MCAxNTAgMTQ5IDIxNSAxNzIgMTQgMjggMTM3IDIzIDgwIDEzMyAyMDggMTg1IDE4OSAxOSAzNiA5IAorMTgzIDc3IDQwIDE0OSAyMDAgNTAgMjE0IDE5MSAxNjMgMTU5IDM2IDQxIDk4IDEzNiA4IDM3IDIwNCAxNDEgNjUgNzUgMTU3IDg5IDg0IAorMTIgODEgOTkgODUgMjUgMjI0IDI3IDE1NCA0MyAyMTAgMTE1IDIwNSA3NSAxMDggNCAxNDMgMjA5IDE5OCAxMDMgMTc2IDEwNSAxMDggCisyMSAxNjUgMTAgMTgxIDk4IDE2OCAxNTIgOTYgMjQgMjkgNjkgMTY2IDggMjAyIDIyNiAxNzEgNDggNzAgNjggMjE3IDcyIDE1IDE3NCAKKzE1OCA3MCA4MyAyOSAxMDEgNjcgMjIgMTE0IDI3IDEzOSAxNTAgMTgxIDEzMCAyIDYzIDE0NSAxNDEgMzMgMTYwIDE3IDEyMSAxOTYgOCAKKzIxOSAxOSA1MyAzMSA2NSA2MCAzNSA2MCAxOCAzOCAyMTcgNTUgMjIyIDE0NCAxNzUgMTU2IDE3MiAyMTEgMTEzIDIyNiAyMDMgMTkyIAorMTI5IDExNyAxMDUgNzYgMTA2IDI1IDQyIDY0IDk0IDc3IDcyIDIxMiAzMCA5OSAxMDIgMTk1IDI1IDEwIDE0OSAzNSAyOCAxODQgMjA4IAorMjAgMTY3IDIxOCA1MyA5NSA0MyAzMCA1MiA2NSAxMDcgMjIwIDUyIDEyOSA4NSAxOTAgMTcgNTcgMTM3IDM4IDIwMiAxNCAxOTMgNzggCis1MyA2MyAxMjggMTE5IDMgMTc3IDIyIDEyOSA2OCAxNjggMjE2IDc0IDIyMyA0NiAxNTUgMTc0IDE5MCAyMTQgMjIzIDc4IDIxOCA4NSAKKzE1OCAxMDIgMjI3IDE2OSAxNTAgMTk4IDE1MiAxMTMgNDYgNTkgNTIgMTYxIDIwIDIxNCAyNiAyMjIgMTI5IDUzIDQ2IDEwNiA4OSAyMCAKKzM0IDExMSA4MiA4MCAxNjUgNDIgMTUgOSAxMzYgNDAgMTAwIDExNSAxOTAgMTgyIDc5IDE5IDIxIDE5NyAxNTQgMTEgMTQ3IDU2IDE1NiAKKzE4NyAxMDQgMTQyIDYzIDk2IDU2IDE3MyAyMDkgMTM0IDEyNSA1OCA4OCAxMDMgMTYxIDIxMiA3OSAxODQgNDMgMjI3IDEzNyA2IDU4IAorMTAzIDIyNSAxOTAgNDkgMjAxIDQ4IDYgOTAgMTggNTUgMTAgMTY2IDIwNSAxMzkgMTY3IDIwMyAxNjAgNjYgMjA2IDU2IDE4OCAxMDIgCisxNSAxOTEgMTgwIDE4MSA2NiAyNCA5MyAxMjggMTM2IDI1IDU5IDUgMTI0IDYwIDY3IDIwNCAxNTggODcgMTA1IDE0MCA4NCAyMjQgNTkgCis2OSAxMDIgMzAgMyAyMDkgMTY2IDQwIDExNyA1NiAyMjAgMTY1IDc0IDE1OSA2OCAxODUgMTU3IDE4NSAyMDYgNDEgNjYgMTY3IF4KKzQ5MCAxIDE3NiAyMTcgODUgMTMzIDIwMyAyMTggMzggMTc0IDcxIDE5MyAxMDggMTE2IDEyMiAxNzEgNSA3IDM3IDE3OSAxMSA1NiAxNzUgCisxODEgNDEgMTI1IDcgMjI2IDE2MCAyMDQgOTggNzkgNDIgMTE5IDEwNSA1MCA5IDEwMCA2OCAxMjcgMTUzIDQ1IDE4NSA2MCAxMjEgMTc3IAorMjExIDE4MyAzMCA1MiAxMTQgMTY2IDY0IDI0IDE5MiAxODggNTMgNzYgMTcgMTQ4IDYzIDE0NSAxMTMgMTcxIDQgNDUgMjggMjIgMjAzIAorMTAzIDE5IDYzIDE4NiA5NyAyMDAgMTk0IDEwMiAyMTQgMTkgMTc4IDEzMiAyMDggMTU4IDU5IDEwIDEzNiAxMTIgMTM1IDExOCAzNyA2MyAKKzMwIDk0IDYwIDQ2IDE4MCA0NyAxMDAgMTEwIDE0NiAzMyAzIDUwIDE5OSA0MyAzOSAxNjggMTY5IDkwIDE4OCAxMiA5MiAyMTkgMTg5IDYgCisxMTcgMTE2IDE5NiAxMzMgODcgMTY0IDc2IDEzMiAxNjcgMTAxIDMwIDIwOSA3OSAxNTcgMTM4IDE0MyA4IDMyIDggMjIxIDIyMCAxMTAgCiszMSAxNCAxMjMgOTIgMTAzIDEzNSAxMTcgNzUgMjEyIDEwNCA1NSAxODAgMTIxIDYyIDE5MiA3MiA3MiAxODcgMjA2IDEzIDIwMiA2NyAKKzIwNiAxMjggMjIxIDEwNSA5MSAyMjQgMTI5IDI3IDE4NCAxODEgMTE1IDE2MCA4OSA3OSAxOTkgODQgMjMgMTk3IDEyOCAxNDcgMTQzIAorODIgNjcgMTcgMTQ3IDI4IDYzIDE4NyAxMzIgNTEgMTIwIDE0MSAxNjcgMTc1IDY1IDYwIDUgMTk2IDE4IDY4IDEyNiAxOTEgMzYgMjggCisxNzkgMTAgMjEgOTMgMjQgMiAxNCA4MiAxMDggNzQgMTc2IDYwIDEyMCAyMTUgMTI5IDI2IDIyMiA5OSAxODkgMTIxIDEzNiAyMjcgMTU0IAorMjI5IDIyNiA4NiAxNjkgMTYgMTUzIDMgMTY2IDE4MCA1IDgxIDcyIDMwIDE2OCA5NSAxMjggMTA2IDE1OSA1MyAzNSAzMyAxMTkgMzEgCis4OCAxNTggMTc0IDI5IDE2IDcwIDI2IDMyIDgzIDIxOCA4MCAxOTMgMTgyIDE1MSAyMDQgMjQgNDQgMTkxIDE5MyA2NiAxNzAgODQgMjEzIAorMTQwIDk5IDExNSA4NiA1NCA3MCA0MiA0NSA3MCA0MSA4MyA2MSAxMTUgNDQgMTA4IDE5MCAxNTcgMTgwIDE2MiAxMTkgMjIxIDEwNCAKKzEyOSAxNDIgMjAzIDIxOSAyNSAyMjggMSA2MSA0MSA5IDI2IDMzIDExOCA2OSA2IDEgMTM1IDc2IDkxIDE4MyA3MiA3MSAxNTIgMTI0IAorODcgMTYzIDExNCA1MCAxMCA2MiA3NyA1MyAzNCAyMjkgMTEwIDEwNSA0OSAyMDUgMTggMTQyIDg4IDQyIDE5MyA2NyAxMzIgOTMgMTM5IAorMjEgNTIgNDAgMjA0IDIxMyA5OCAxNTMgNCAyMDEgMzEgMTYyIDEyMCAyNSAxMTMgNTUgMTgxIDE1NiAxNDQgMTE4IDExMSAyNSAxMTIgCisyMCAxNzIgMjMwIDEwNSAxNjUgMTg2IDEzOCAxODQgMjIzIDYxIDQwIDQ3IDE3NSAxMDcgNiAxMTYgODEgMTE0IDIwNyA0OCA1MyAyMjQgCisxNCA4MSA3MyAyMjMgMTkgMjEgMTY3IDU5IDExIDk4IDE5NCA2MSAyMzAgMjIxIDE0NiAxNDggMjIgODggODQgMTM5IDE3OCA5MCAxODkgCis0NyAxNzQgMTQ1IDIyOCAxOTAgNDIgMyA1MSAxNjEgMTI1IDE5NiAyMDcgNDkgMTUgMiAxNzEgMTIwIDI2IDE0OCA2NCAxMDcgMTk1IDk3IAorNDMgMjI5IDExMSAxNDAgNTggMTMxIDU3IDk1IDEzIDg3IDQ4IDk1IDE3MCAxMjUgMTk3IDE2OSAxMzEgMTcyIDQxIDEyNCA0NSAxNDQgMyAKKzkyIDE0NSAxNTQgMTU1IDMzIDc3IDEyIDIwOCAyMDAgNzggNDggMjEgMjA4IDQzIDQwIDEzMCAxNzggMTYgMjI3IDE5NiAxNyAxMDYgNDQgCiszNCAyMjggNzUgMjMgMTIzIDE2NiA2NSAyMTcgNDMgMTE0IDE2NSAyOSAxNzMgMzUgMjAwIF4KKzQ3OSAwIDE2NyAxNTEgMTMwIDU4IDI5IDM0IDE1MCAxMDcgOCAxOTUgMTIxIDExMiA1OSAxNTIgMjIgMTMxIDIxOCAyMDggMjAyIDE1OSAKKzg4IDE5IDU2IDE0OSA4MiA0MSAxNTMgMTQ1IDU0IDE5OSA4NiAxMDQgMTY2IDEyNiAyMjggMTYgNTMgMjA5IDIyNSA0MSA5MCAyMzAgMjkgCisxOTcgMTcxIDQ2IDE0MyAzOSAyMDMgMTQ5IDExNyAxNDcgNjcgNDUgMjE2IDE1OCAzNSA3NSAxMzYgMTM2IDM4IDE3IDc4IDE3NiAzNCAKKzE4NSAyMTMgMTU1IDk1IDUwIDcxIDczIDEyMyAyMjUgNzYgMjggMTQ0IDIyNyAxMjYgMTMwIDIyOCAxMTQgNzQgMTQ4IDE5MiAxMTggCisxNzIgMzQgODcgMTkyIDIxNiAxOTMgMjA2IDU0IDM2IDY1IDIzMCAzMSA0OSAxNDYgNDQgMjI4IDIxNCAxODAgNjIgOTIgNDcgMTMxIDQ4IAorNTggMTYyIDE2MSAzIDE0MiAxNCAzIDEwNyAxNDEgODkgMjA3IDIxMiAxMzAgMTkzIDggMTYwIDE1IDE5OCAxNTkgMjIzIDYzIDExNyAxNCAKKzE3MyAxOTIgMTgxIDg3IDU5IDg5IDEwNyAxMDYgMjE2IDYwIDc5IDIwMSAxIDIyNyAxODkgMjEzIDIwIDExNiAyMjIgMzggMTUwIDIwNSAKKzI5IDEzNCAyMyAyMSAxNDEgMTI0IDgwIDEyNiAzMCAxMjIgMjAwIDEwOSAyMTkgMTA0IDIwMSA2NCAxNDIgMTQ5IDIxNSAxNjggNiAxMiAKKzEyNSA3IDcyIDEzMyAxOTYgMTgxIDE4NSAxNSAyOCA5IDE4MyA2NSAzMiAxMzcgMTk2IDQ2IDIwNiAxODcgMTYzIDE1MSAzMiAzNyA5MCAKKzEzMiA4IDI1IDIwNCAxMzcgNjEgNjcgMTQ1IDg5IDcyIDY5IDk1IDg1IDkgMjIwIDIzIDE1NCAzNSAyMTAgMTE1IDE5NyA3MSAxMDggCisyMjkgMTM5IDIwOSAxOTAgMTAzIDE3NiA5NyAxMDAgNSAxNTcgMTAgMTczIDk0IDE2MCAxNDggOTIgMTIgMjUgNjkgMTU4IDIwMiAyMjIgCisxNzEgNDQgNTggNjQgMjA1IDY0IDcgMTcwIDE1NCA3MCA4MyAyOSA5NyA2NyAxMCAxMTAgMTEgMTM1IDE0NiAxNzcgMTIyIDIgNDcgMTMzIAorMTMzIDMzIDE2MCAxMyAxMTMgMTg0IDIyNSAyMTEgNyAzNyAyNyA0OSA0OCAyMyA1NiAxNCAzOCAyMTMgNTUgMjIyIDEzNiAxNzEgMTQ0IAorMTY0IDIxMSAxMDUgMjI2IDE5OSAxODQgMTI1IDEwNSA5MyA3MiA5OCAyNSAzNCA1MiA4NiA2OSA2MCAyMTIgMzAgODcgOTQgMTk1IDIxIAorNiAxNDUgMTkgMjggMTcyIDIwNCA0IDE2NyAyMTQgNDUgODMgMzEgMTQgNDAgNjUgOTUgMjIwIDIyMSA0OCAxMjEgNzcgMTg2IDUgNTcgCisxMzcgMjYgMTk0IDIzMSAxODkgNzggNDEgNTUgMTI0IDExNSAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMjA0IDc0IDIxMSA0MiAxNDMgMTc0IAorMTgyIDIxMCAyMTUgNzAgMjE4IDczIDE1OCA5OCAyMjMgMTYxIDEzOCAxODYgMTQwIDEwMSAzMCA1OSA1MiAxNDkgMjE3IDIwIDIxNCAxMCAKKzIxMCAxMTcgNDkgNDYgMTA2IDgxIDE2IDE4IDEwMyA3OCA3NiAxNjEgMzggMTUgMjI2IDEzNiAzNiAxMDAgMTAzIDE3OCAxODIgNzUgMyAKKzkgMTg1IDE1MCA3IDEzNSA0OCAxNTYgMTgzIDEwMCAxMzggNTEgOTYgNDAgMTY1IDIwMSAxMzQgMTIxIDQyIDgwIDkxIDE1NyAyMDggNjcgCisxODAgMjcgMjE5IDEzMyAyMzEgNTQgOTkgMjEzIDE5MCAzMyAxOTcgMzYgMiA4MiA2IDQ3IDIzMSAxNTQgMjA1IDEyNyAxNTUgMTk1IAorMTU2IDUwIDIwNiA1MiAxODQgOTAgMjMyIDE3OSAxNzIgMTY5IDY2IDIwIDgxIDExNiAxMjQgMTcgNDMgNSAxMjAgNTIgNTEgMTk2IDE0NiAKKzc5IDEwMSAxMjggODAgMjI0IDY1IF4KKzUwMyAxIDU1IDEwMiA5IDMgMjAyIDE1OSAxOSAxMDMgNTYgMjA2IDE2NSA2MCAxNTIgNTQgMTcxIDE1NyAxNjQgMTg1IDI3IDU5IDQ1IAorMTcxIDIxNyA4MCAxMjMgMjAzIDIwMyAyMyAxNjkgNjYgMTkzIDEwMyAxMTYgMTIyIDE1NiA3IDMyIDE2OSA2IDQxIDE2NSAxNzYgMzEgCisxMjUgMiAyMTEgMTU1IDE4OSA5MyA2OSAzMiAxMDkgOTAgNTAgMjI1IDg1IDUzIDEyNyAxNTMgNDUgMTc1IDQwIDEyMSAxNzIgMjAxIAorMTY4IDE1IDM3IDk5IDE2NiA0NCA0IDE4MiAxODggNTMgNzEgNyAxNDggNDggMTMwIDEwOCAxNjYgMjIwIDM1IDggMTIgMTk4IDkzIDkgCis2MyAxNzEgOTcgMTk1IDE5NCA4NyAyMDQgMTQgMTczIDEzMiAyMDMgMTQzIDU0IDIzMSAxMjYgMTAyIDEyNSAxMTggMzcgNDMgMjAgOTQgCis2MCAzNiAxNzUgNDcgOTAgMTEwIDE0MSAyMyAyMjkgMzUgMTg0IDQzIDI0IDE1MyAxNTQgODUgMTczIDEyIDgyIDIxNCAxNzQgMjMyIAorMTE3IDEwNiAxOTEgMTI4IDc3IDE2NCA3NiAxMTcgMTYyIDEwMSAyNSAyMDQgNzQgMTQyIDEyMyAxNDMgMjM0IDMyIDIyOSAyMTEgMjE1IAorMTA1IDMxIDkgMTIzIDg3IDg4IDEzNSAxMDIgNjUgMjAyIDk5IDUwIDE2NSAxMTYgNjIgMTg3IDYyIDY3IDE3NyAxOTEgOCAxOTIgNTIgCisxOTYgMTE4IDIwNiAxMDUgOTEgMjE0IDExNCAyNyAxNzkgMTY2IDEwMCAxNTAgNzkgNzkgMTk5IDg0IDEzIDE4MiAxMjggMTM3IDEzMyAKKzY3IDU3IDE3IDEzMiAyMyA1MyAxODcgMTIyIDM2IDExNSAxMzEgMTUyIDE3MCA1MCA0NSAyMzEgMTg2IDE4IDYzIDExMSAxODEgMjEgMTggCisxNzkgMjI2IDE2IDg4IDE5IDIyMyAyMzAgODIgOTggNTkgMTYxIDUwIDEwNSAyMDAgMTI0IDExIDIwNyA4OSAxNzkgMTA2IDEzMSAyMTIgCisxMzkgMjI0IDIyMSA4NiAxNjQgMTYgMTQ4IDIyNCAxNjEgMTcwIDIyNiA3NiA1NyAxMCAxNjMgODUgMTEzIDk2IDE0NCAzOCAzMCAxOCAKKzExOSAyMSA3OCAxNDggMTY0IDkgMjMyIDUwIDIyMSAyNiAxMiA3OCAyMDggODAgMTgzIDE3MiAxNDEgMTk5IDI0IDQ0IDE5MSAxODggNDYgCisxNTUgNjkgMjA4IDE0MCA5OSAxMTAgODEgNTQgNTUgNDIgNDAgNjUgMjYgNjggNDEgMTA1IDI0IDkzIDE4NSAxNDcgMTgwIDE1NyAxMDQgCisyMTYgODkgMTE5IDEzNyAxOTMgMjE5IDIzMSAxMCAyMjMgMSA1MSAzNiAyMzUgMTYgMjggMTAzIDQ5IDEgMjI3IDEyMCA2MSA3NiAxNzMgCis3MiA1MSAxNTIgMTE0IDg3IDE0OCAxMDQgNDAgNSA1NyA3NyA0OCAxNCAyMjkgOTUgMTAwIDM0IDIwMCA4IDEzMiA4MyAyMiAxNzggNjIgCisxMjcgOTMgMTI5IDEgNDcgMzAgMTk0IDIwMyA4MyAxMzggNCAxODYgMTEgMTQ3IDEyMCA1IDExMyA0MCAxODEgMTQxIDEzOSAxMDggMTA2IAorMTUgOTcgMTUgMTU3IDIyMCA5NSAxNjAgMTg2IDEzOCAxODQgMjIzIDYxIDIwIDI3IDE3NSAxMDcgNiAxMDEgODEgMTE0IDIwNyAzMyAzMyAKKzIwOSA0IDY2IDczIDIxOCA0IDYgMTU3IDQ0IDExIDk4IDE3OSA0NiAyMTUgMjIxIDE0NiAxMzMgNyA4OCA3OSAxMzkgMTY4IDc1IDE4OSAKKzM3IDE1OSAxMzUgMjE4IDE4MCAzNyAyMTkgNTEgMTU2IDEyMCAxODEgMTk3IDQ5IDUgMjMzIDE2MSAxMTAgMjEgMTM4IDY0IDEwMiAxODUgCis4NyAyOCAyMTkgMTExIDEyNSA1OCAxMjEgNTIgODAgMyA4MiAzOCA5MCAxNzAgMTEwIDE5NyAxNjkgMTI2IDE2MiA0MSAxMDkgMzAgMTM0IAorMjM0IDkyIDE0NSAxNDkgMTU1IDEzIDYyIDcgMjA4IDIwMCA2OCA0OCAyMSAxOTggMzMgNDAgMTI1IDE3OCA2IDIxNyAxOTYgMiA5MSAzNCAKKzI0IDIxMyA3MCAyMyAxMTMgMTYxIF4KKzQ3MCAwIDU4IDIxMCAxNSAxMDcgMTQ0IDE1IDE1OSAyMSAxNDIgMTUyIDE1MSAxMzAgNDggMTQgMzQgMTQwIDkyIDIzMSAxOTAgMTA2IAorMTEyIDU0IDE0MiA3IDExNiAyMDggMTkzIDE4NyAxNTkgNzMgMTkgNDEgMTQ0IDY3IDM2IDE0OCAxMzUgNDQgMTg0IDcxIDEwNCAxNTYgCisxMjYgMjE4IDYgNDMgMjA0IDIyNSAyMSA5MCAyMzAgMjQgMTgyIDE1NiAyNiAxMzggMzkgMTg4IDEzOSAxMTIgMTQ3IDYyIDQwIDIxNiAKKzE0MyAzNSA3NSAxMzEgMTIxIDE4IDIgNjggMTYxIDI5IDE4NSAyMDMgMTQ1IDk1IDQwIDcxIDYzIDExMyAyMjAgNjYgOCAxNDQgMjEyIAorMTE2IDExNSAyMjggMTA5IDU5IDEzOCAxNzcgMTA4IDE3MiAxOSA4MiAxODcgMjExIDE4OCAxOTEgMzQgMzYgNTUgMjE1IDExIDM5IDEzNiAKKzI0IDIyMyAxOTkgMTcwIDUyIDgyIDQyIDEzMSAyOCA1MyAxNjIgMTYxIDIyNiAxNDIgMTQgMjMxIDk3IDE0MSA3OSAxOTIgMjA3IDEyMCAKKzE4MyAyMzYgMTQ1IDIzMyAxOTggMTQ5IDIwOCA0OCAxMDcgMjM3IDE3MyAxOTIgMTY2IDc3IDM5IDg0IDEwMiA5NiAyMDYgNDAgNjQgCisxODYgMjI0IDIyNyAxNzQgMjEzIDEwIDExMSAyMTIgMjMgMTUwIDE5NSA5IDEyNCAxMyA2IDEzNiAxMjQgNjUgMTIxIDI1IDExNyAxOTUgCisxMDkgMjA0IDIxOCA5OSAyMDEgNDQgMTMyIDE0OSAyMTUgMTYzIDIzNCAyMzAgMTEwIDIyNSA2MiAxMzMgMTgxIDE3NiAxODAgMTAgMTggCis5IDE4MyA1MCAyMiAxMjIgMTkxIDQxIDE5NiAxODIgMTYzIDE0MSAyNyAzMiA4MCAxMjcgOCAxMCAyMDQgMTMyIDU2IDU3IDEzMCA4OSAKKzU3IDIyMyA1NCA5MCA4NSAyMjcgMjE1IDE4IDE1NCAyNSAyMTAgMTE1IDE4NyA2NiAxMDggMjI0IDEzNCAyMDkgMTgwIDEwMyAxNzYgODcgCis5MCAyMjMgMTQ3IDEwIDE2MyA4OSAxNTAgMTQzIDg3IDIzNSAyMCA2OSAxNDggMjI4IDIwMiAyMTcgMTcxIDM5IDQzIDU5IDE5MCA1NCAKKzIzNSAxNjUgMTQ5IDcwIDgzIDI5IDkyIDY3IDIzMyAxMDUgMjI5IDEzMCAxNDEgMTcyIDExMiAyIDI3IDExOCAxMjMgMzMgMTYwIDggCisxMDMgMTY5IDIxMCAyMDEgMjMwIDE3IDIyIDI5IDMzIDggNTEgOSAzOCAyMDggNTUgMjIyIDEyNiAxNjYgMTI5IDE1NCAyMTEgOTUgMjI2IAorMTk0IDE3NCAxMjAgOTAgNzggNjcgODggMjUgMjQgMzcgNzYgNTkgNDUgMjEyIDMwIDcyIDg0IDE5NSAxNiAxIDE0MCAyMzcgMjggMTU3IAorMTk5IDIyMiAxNjcgMjA5IDM1IDY4IDE2IDIzMiAyNSA2NSA4MCAyMjAgMjExIDQzIDExMSA2NyAxODEgMjI4IDU3IDEzNyAxMSAxODQgCisyMTYgMTg0IDc4IDI2IDQ1IDExOSAxMTAgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDE4OSA3NCAxOTYgMzcgMTI4IDE3NCAxNzIgMjA1IAorMjA1IDYwIDIxOCA1OCAxNTggOTMgMjE4IDE1MSAxMjMgMTcxIDEyNSA4NiAxMCA1OSA1MiAxMzQgMjAyIDIwIDIxNCAyMjggMTk1IDEwMiAKKzQ0IDQ2IDEwNiA3MSAxMSAyMzYgOTMgNzMgNzEgMTU2IDMzIDE1IDIxMSAxMzYgMzEgMTAwIDg4IDE2MyAxODIgNzAgMjIxIDIzMiAxNzAgCisxNDUgMiAxMjAgMzggMTU2IDE3OCA5NSAxMzMgMzYgOTYgMjAgMTU1IDE5MSAxMzQgMTE2IDIyIDcwIDc2IDE1MiAyMDMgNTIgMTc1IDcgCisyMDkgMTI4IDIyNiA0OSA5NCAxOTggMTkwIDEzIDE5MiAyMSAyMzUgNzIgMjI5IDM3IDIyMSAxMzkgMjA1IDExMiAxNDAgMTg1IDE1MSAKKzMwIDIwNiA0NyAxNzkgNzUgMjE3IDEwMSBeCis1MDIgMCAxNTggMTQ4IDY2IDEzIDYwIDk1IDEwMyAzIDE1IDUgMTEzIDM4IDIzIDE4MiAxMjUgNjUgOTQgMTA3IDczIDIyNCAzNyA0NyAKKzEwMiAyMzcgMyAxOTggMTU1IDcgOTUgNTYgMTk4IDE2NSA1MiAxNDggNDYgMTYzIDE1NyAxNTIgMTczIDE5IDU1IDI5IDE2NyAyMTcgNzYgCisxMTUgMjAzIDE5MSAxMSAxNjUgNjIgMTkzIDk5IDExNiAxMjIgMTQ0IDIzNiA3IDI4IDE2MSAyIDI5IDE1NyAxNzIgMjMgMTI1IDIzOCAKKzE5OSAxNTEgMTc3IDg5IDYxIDI0IDEwMSA3OCA1MCAyMTMgNzMgNDEgMTI3IDE1MyA0NSAxNjcgMjQgMTIxIDE2OCAxOTMgMTU2IDMgMjUgCis4NyAxNjYgMjggMjI4IDE3NCAxODggNTMgNjcgMjM5IDE0OCAzNiAxMTggMTA0IDE2MiAyMDggMjcgMjMyIDQgMTk0IDg1IDEgNjMgMTU5IAorOTcgMTkxIDE5NCA3NSAxOTYgMTAgMTY5IDEzMiAxOTkgMTMxIDUwIDIyMyAxMTggOTQgMTE3IDExOCAzNyAyNyAxMiA5NCA2MCAyOCAKKzE3MSA0NyA4MiAxMTAgMTM3IDE1IDIyNSAyMyAxNzIgNDMgMTIgMTQxIDE0MiA4MSAxNjEgMTIgNzQgMjEwIDE2MiAyMjggMTE3IDk4IAorMTg3IDEyNCA2OSAxNjQgNzYgMTA1IDE1OCAxMDEgMjEgMjAwIDcwIDEzMCAxMTEgMTQzIDIzMCAzMiAyMjEgMjAzIDIxMSAxMDEgMzEgNSAKKzEyMyA4MyA3NiAxMzUgOTAgNTcgMTk0IDk1IDQ2IDE1MyAxMTIgNjIgMTgzIDU0IDYzIDE2OSAxNzkgNCAxODQgNDAgMTg4IDExMCAxOTQgCisxMDUgOTEgMjA2IDEwMiAyNyAxNzUgMTU0IDg4IDE0MiA3MSA3OSAxOTkgODQgNSAxNzAgMTI4IDEyOSAxMjUgNTUgNDkgMTcgMTIwIDE5IAorNDUgMTg3IDExNCAyNCAxMTEgMTIzIDE0MCAxNjYgMzggMzMgMjI3IDE3OCAxOCA1OSA5OSAxNzMgOSAxMCAxNzkgMjE0IDEyIDg0IDE1IAorMjE1IDIxOCA4MiA5MCA0NyAxNDkgNDIgOTMgMTg4IDEyMCAyMzkgMTk1IDgxIDE3MSA5NCAxMjcgMjAwIDEyNyAyMjAgMjE3IDg2IDE2MCAKKzE2IDE0NCAyMTYgMTU3IDE2MiAyMTggNzIgNDUgMjM0IDE1OSA3NyAxMDEgODggMTMyIDI2IDI2IDYgMTE5IDEzIDcwIDE0MCAxNTYgCisyMzMgMjIwIDM0IDIxMyAyNiAyMzYgNzQgMjAwIDgwIDE3NSAxNjQgMTMzIDE5NSAyNCA0NCAxOTEgMTg0IDMwIDE0MyA1NyAyMDQgMTQwIAorOTkgMTA2IDc3IDU0IDQzIDQyIDM2IDYxIDE0IDU2IDI1IDk3IDggODEgMTgxIDEzOSAxODAgMTUzIDkyIDIxMiA3NyAxMTEgMTMzIDE4NSAKKzIxOSAyMzEgMjM4IDIxOSAxIDQzIDMyIDIzMSA4IDI0IDkxIDMzIDIzNyAyMjMgMTA4IDQ5IDY0IDE2NSA3MiAzNSAxNTIgMTA2IDg3IAorMTM2IDk2IDMyIDEgNTMgNzcgNDQgMjM4IDIyOSA4MyA5NiAyMiAxOTYgMTI0IDc5IDYgMTY2IDU4IDEyMyA5MyAxMjEgMjI1IDQzIDIyIAorMTg2IDE5NSA3MSAxMjYgNCAxNzQgMjM1IDEzNSAxMjAgMjI5IDExMyAyOCAxODEgMTI5IDEzNSAxMDAgMTAyIDcgODUgMTEgMTQ1IDIxMiAKKzg3IDE1NiAxODYgMTM4IDE4NCAyMjMgNjEgNCAxMSAxNzUgMTA3IDYgODkgODEgMTE0IDIwNyAyMSAxNyAxOTcgMjM2IDU0IDczIDIxNCAKKzIzMiAyMzQgMTQ5IDMyIDExIDk4IDE2NyAzNCAyMDMgMjIxIDE0NiAxMjEgMjM1IDg4IDc1IDEzOSAxNjAgNjMgMTg5IDI5IDE0NyAxMjcgCisyMTAgMTcyIDMzIDIwNyA1MSAxNTIgMTE2IDE2OSAxODkgNDkgMjM3IDIzMyAxNTMgMTAyIDE3IDEzMCA2NCA5OCAxNzcgNzkgMTYgMjExIAorMTExIDExMyA1OCAxMTMgNDggNjggMjM1IDc4IDMwIDg2IDE3MCA5OCAxOTcgMTY5IDEyMiAxNTQgNDEgOTcgMTggMTI2IDIzNCA5MiAKKzE0NSAxNDUgMTU1IDIzNyA1MCAyMDkgXgorNDgxIDEgMjA4IDIwMCA1NiA0OCAyMSAxODYgMjEgNDAgMTE5IDE3OCAyMzYgMjA1IDE5NiAyMjYgNzMgMjIgMTIgMTk1IDY0IDIzIDEwMSAKKzE0NCA1NCAyMDYgMjQxIDEwMyAxMzIgNyAxNTEgMTMgMTM4IDE0MCAxNTEgMTMwIDQwIDIgMzQgMTMyIDgwIDIyMyAxODYgOTQgMTEyIAorNTAgMTM0IDIzNyAxMDQgMjAwIDE4MSAxNzUgMTU5IDYxIDE5IDI5IDE0MCA1NSAzMiAxNDQgMTI3IDM2IDE3MiA1OSAxMDQgMTQ4IDEyNiAKKzIxMCAyNDAgMzUgMjAwIDIyNSA1IDkwIDIzMCAyMCAxNzAgMTQ0IDEwIDEzNCAzOSAxNzYgMTMxIDEwOCAxNDcgNTggMzYgMjE2IDEzMSAKKzM1IDc1IDEyNyAxMDkgMiAyMzIgNjAgMTQ5IDI1IDE4NSAxOTUgMTM3IDk1IDMyIDcxIDU1IDEwNSAyMTYgNTggMjM0IDE0NCAyMDAgCisxMDggMTAzIDIyOCAxMDUgNDcgMTMwIDE2NSAxMDAgMTcyIDcgNzggMTgzIDIwNyAxODQgMTc5IDE4IDM2IDQ3IDIwMyAyMzcgMzEgMTI4IAorOCAyMTkgMTg3IDE2MiA0NCA3NCAzOCAxMzEgMTIgNDkgMTYyIDE2MSAyMTggMTQyIDE0IDIyNyA4OSAxNDEgNzEgMTgwIDIwMyAxMTIgCisxNzUgMjMyIDEzMyAyMjEgMTk4IDE0MSAxOTYgMzYgOTkgMjI5IDE3MyAxOTIgMTU0IDY5IDIzIDgwIDk4IDg4IDE5OCAyNCA1MiAxNzQgCisyMTYgMjI3IDE2MiAyMTMgMiAxMDcgMjA0IDExIDE1MCAxODcgMjM1IDExNiA1IDIzNiAxMzIgMTI0IDUzIDExNyAyMSAxMTMgMTkxIAorMTA5IDE5MiAyMDYgOTUgMjAxIDI4IDEyNCAxNDkgMjE1IDE1OSAyMzAgMjE4IDk4IDIxMyA1NCAxMzMgMTY5IDE3MiAxNzYgNiAxMCA5IAorMTgzIDM4IDE0IDExMCAxODcgMzcgMTg4IDE3OCAxNjMgMTMzIDIzIDI4IDcyIDEyMyA4IDI0MCAyMDQgMTI4IDUyIDQ5IDExOCA4OSA0NSAKKzIxNSA0MiA4NiA4NSAyMTUgMjExIDE0IDE1NCAxNyAyMTAgMTE1IDE3OSA2MiAxMDggMjIwIDEzMCAyMDkgMTcyIDEwMyAxNzYgNzkgODIgCisyMTEgMTM5IDEwIDE1NSA4NSAxNDIgMTM5IDgzIDIyNyAxNiA2OSAxNDAgMjI0IDIwMiAyMTMgMTcxIDM1IDMxIDU1IDE3OCA0NiAyMzEgCisxNjEgMTQ1IDcwIDgzIDI5IDg4IDY3IDIyNSAxMDEgMjE3IDEyNiAxMzcgMTY4IDEwNCAyIDExIDEwNiAxMTUgMzMgMTYwIDQgOTUgMTU3IAorMTk4IDE5MyAyMjIgMSAxOCAxMyAyMSAyMzggNDcgNSAzOCAyMDQgNTUgMjIyIDExOCAxNjIgMTE3IDE0NiAyMTEgODcgMjI2IDE5MCAKKzE2NiAxMTYgNzggNjYgNjMgODAgMjUgMTYgMjUgNjggNTEgMzMgMjEyIDMwIDYwIDc2IDE5NSAxMiAyMzkgMTM2IDIyNSAyOCAxNDUgCisxOTUgMjEwIDE2NyAyMDUgMjcgNTYgNCAyMjAgMTMgNjUgNjggMjIwIDIwMyAzOSAxMDMgNTkgMTc3IDIyMCA1NyAxMzcgMjQxIDE3NiAKKzIwNCAxODAgNzggMTQgMzcgMTE1IDEwNiAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMTc3IDc0IDE4NCAzMyAxMTYgMTc0IDE2NCAyMDEgCisxOTcgNTIgMjE4IDQ2IDE1OCA4OSAyMTQgMTQzIDExMSAxNTkgMTEzIDc0IDIzNiA1OSA1MiAxMjIgMTkwIDIwIDIxNCAyMTYgMTgzIDkwIAorNDAgNDYgMTA2IDYzIDcgMjI0IDg1IDY5IDY3IDE1MiAyOSAxNSAxOTkgMTM2IDI3IDEwMCA3NiAxNTEgMTgyIDY2IDIwOSAyMjQgMTU4IAorMTQxIDI0MCAxMDggMzAgMTU2IDE3NCA5MSAxMjkgMjQgOTYgNCAxNDcgMTgzIDEzNCAxMTIgNiA2MiA2NCAxNDggMTk5IDQwIDE3MSAKKzIzMyAyMDEgMTI0IDIyMiA0NSA5MCAxODYgMTkwIDIzOSAxODggOSAyMzUgNjQgMjIxIDI5IDIxMyAxMjcgMTc4IF4KKzUwOCAxIDk0IDEyMiAxNzMgMTQ1IDYgMjA2IDQxIDE3MyA1NyAxOTkgMTQ2IDE1MCAxMzYgNjYgOSA0OCA4MyA5MSAyMzkgMjQzIDUgCisxMDkgMzAgNyAxNzQgMTEzIDU3IDkwIDk1IDY5IDIyNCAyOSAzOSAxMDIgMjI5IDMgMTk0IDE1MSAyMzkgODcgNTYgMTkwIDE2NSA0NCAKKzE0NCAzOCAxNTUgMTU3IDE0MCAxNjEgMTEgNTEgMTMgMTYzIDIxNyA3MiAxMDcgMjAzIDE3OSAyNDMgMTYxIDU4IDE5MyA5NSAxMTYgCisxMjIgMTMyIDIzNiA3IDI0IDE1MyAyNDIgMTcgMTQ5IDE2OCAxNSAxMjUgMjM4IDE4NyAxNDcgMTY1IDg1IDUzIDE2IDkzIDY2IDUwIAorMjAxIDYxIDI5IDEyNyAxNTMgNDUgMTU5IDggMTIxIDE2NCAxODUgMTQ0IDIzNSAxMyA3NSAxNjYgMTIgMjE2IDE2NiAxODggNTMgNjMgCisyMzUgMTQ4IDI0IDEwNiAxMDAgMTU4IDE5NiAxOSAyMjAgMjQwIDE5MCA3NyAyMzcgNjMgMTQ3IDk3IDE4NyAxOTQgNjMgMTg4IDYgMTY1IAorMTMyIDE5NSAxMTkgNDYgMjE1IDExMCA4NiAxMDkgMTE4IDM3IDExIDQgOTQgNjAgMjAgMTY3IDQ3IDc0IDExMCAxMzMgNyAyMjEgMTEgCisxNjAgNDMgMTI5IDEzMCA3NyAxNDkgMTIgNjYgMjA2IDE1MCAyMjQgMTE3IDkwIDE4MyAxMjAgNjEgMTY0IDc2IDkzIDE1NCAxMDEgMTcgCisxOTYgNjYgMTE4IDk5IDE0MyAyMjYgMzIgMjEzIDE5NSAyMDcgOTcgMzEgMSAxMjMgNzkgNjQgMTM1IDc4IDQ5IDE4NiA5MSA0MiAxNDEgCisxMDggNjIgMTc5IDQ2IDU5IDE2MSAxNjcgMTc2IDI4IDE4MCAxMDIgMTgyIDEwNSA5MSAxOTggOTAgMjcgMTcxIDE0MiA3NiAxMzQgNjMgCis3OSAxOTkgODQgMjQxIDE1OCAxMjggMTIxIDExNyA0MyA0MSAxNyAxMDggMTUgMzcgMTg3IDEwNiAxMiAxMDcgMTE1IDEyOCAxNjIgMjYgCisyMSAyMjMgMTcwIDE4IDU1IDg3IDE2NSAyNDEgMiAxNzkgMjAyIDggODAgMTEgMjA3IDIwNiA4MiA4MiAzNSAxMzcgMzQgODEgMTc2IAorMTE2IDIzMSAxODMgNzMgMTYzIDgyIDEyMyAxODggMTE1IDIxNiAyMTMgODYgMTU2IDE2IDE0MCAyMDggMTUzIDE1NCAyMTAgNjggMzMgCisyMjIgMTU1IDY5IDg5IDgwIDEyMCAxNCAyMiAyMzggMTE5IDUgNjIgMTMyIDE0OCAyMjEgMjA4IDE4IDIwNSAyNiAyMjQgNzAgMTkyIDgwIAorMTY3IDE1NiAxMjUgMTkxIDI0IDQ0IDE5MSAxODAgMTQgMTMxIDQ1IDIwMCAxNDAgOTkgMTAyIDczIDU0IDMxIDQyIDMyIDU3IDIgNDQgOSAKKzg5IDIzNiA2OSAxNzcgMTMxIDE4MCAxNDkgODAgMjA4IDY1IDEwMyAxMjkgMTc3IDIxOSAyMzEgMjMwIDIxNSAxIDM1IDI4IDIyNyAyMCAKKzc5IDE3IDIzNyAyMTkgOTYgMzcgNTIgMTU3IDcyIDE5IDE1MiA5OCA4NyAxMjQgODggMjQgMjQxIDQ5IDc3IDQwIDIyNiAyMjkgNzEgOTIgCisxMCAxOTIgMjM2IDExNiA3NSAyMzQgMTU0IDU0IDExOSA5MyAxMTMgMjEzIDM5IDE0IDE3OCAxODcgNTkgMTE0IDQgMTYyIDIyMyAxMjMgCisxMjAgMjE3IDExMyAxNiAxODEgMTE3IDEzMSA5MiA5OCAyNDMgNzMgNyAxMzMgMjA0IDc5IDE1MiAxODYgMTM4IDE4NCAyMjMgNjEgMjMyIAorMjM5IDE3NSAxMDcgNiA3NyA4MSAxMTQgMjA3IDkgMSAxODUgMjMyIDQyIDczIDIxMCAyMjQgMjI2IDE0MSAyMCAxMSA5OCAxNTUgMjIgCisxOTEgMjIxIDE0NiAxMDkgMjI3IDg4IDcxIDEzOSAxNTIgNTEgMTg5IDIxIDEzNSAxMTkgMjAyIDE2NCAyOSAxOTUgNTEgMTQ4IDExMiAKKzE1NyAxODEgNDkgMjMzIDIzMyAxNDUgOTQgMTMgMTIyIDY0IDk0IDE2OSA3MSA0IDIwMyAxMTEgMTAxIDU4IDEwNSA0NCA1NiAyMzEgNzQgCisyMiA4MiAxNzAgODYgMTk3IDE2OSAxMTggMTQ2IDQxIDg1IDYgMTE4IDIzNCA5MiAxNDUgMTQxIDE0OSBeCis0ODQgMSAyMTkgMzIgMjQzIDIwOCAyMDAgNDggNDggMjEgMTc4IDEzIDQwIDExNSAxNzggMjMyIDE5NyAxOTYgMjE4IDYxIDE0IDQgMTgzIAorNjAgMjMgOTMgMTM2IDUwIDIwMiAyMjkgOTkgMTIwIDI0NSAxNDMgNSAxMzQgMTI4IDE1MSAxMzAgMzIgMjM2IDM0IDEyNCA2OCAyMTUgCisxODIgODIgMTEyIDQ2IDEyNiAyMjkgOTIgMTkyIDE2OSAxNjMgMTU5IDQ5IDE5IDE3IDEzNiA0MyAyOCAxNDAgMTE5IDI4IDE2MCA0NyAKKzEwNCAxNDAgMTI2IDIwMiAyMzYgMjcgMTk2IDIyNSAyMzUgOTAgMjMwIDE2IDE1OCAxMzIgMjQwIDEzMCAzOSAxNjQgMTIzIDEwNCAxNDcgCis1NCAzMiAyMTYgMTE5IDM1IDc1IDEyMyA5NyAyMzIgMjI0IDUyIDEzNyAyMSAxODUgMTg3IDEyOSA5NSAyNCA3MSA0NyA5NyAyMTIgNTAgCisyMjIgMTQ0IDE4OCAxMDAgOTEgMjI4IDEwMSAzNSAxMjIgMTUzIDkyIDE3MiAyNDEgNzQgMTc5IDIwMyAxODAgMTY3IDIgMzYgMzkgMTkxIAorMjI1IDIzIDEyMCAyMzggMjE1IDE3NSAxNTQgMzYgNjYgMzQgMTMxIDI0MiA0NSAxNjIgMTYxIDIxMCAxNDIgMTQgMjIzIDgxIDE0MSA2MyAKKzE2OCAxOTkgMTA0IDE2NyAyMjggMTIxIDIwOSAxOTggMTMzIDE4NCAyNCA5MSAyMjEgMTczIDE5MiAxNDIgNjEgNyA3NiA5NCA4MCAxOTAgCis4IDQwIDE2MiAyMDggMjI3IDE1MCAyMTMgMjQwIDEwMyAxOTYgMjQ1IDE1MCAxNzkgMjIzIDEwOCAyNDMgMjI4IDEyOCAxMjQgNDEgMTEzIAorMTcgMTA5IDE4NyAxMDkgMTgwIDE5NCA5MSAyMDEgMTIgMTE2IDE0OSAyMTUgMTU1IDIyNiAyMDYgODYgMjAxIDQ2IDEzMyAxNTcgMTY4IAorMTcyIDIgMiA5IDE4MyAyNiA2IDk4IDE4MyAzMyAxODAgMTc0IDE2MyAxMjUgMTkgMjQgNjQgMTE5IDggMjMyIDIwNCAxMjQgNDggNDEgCisxMDYgODkgMzMgMjA3IDMwIDgyIDg1IDIwMyAyMDcgMTAgMTU0IDkgMjEwIDExNSAxNzEgNTggMTA4IDIxNiAxMjYgMjA5IDE2NCAxMDMgCisxNzYgNzEgNzQgMTk5IDEzMSAxMCAxNDcgODEgMTM0IDEzNSA3OSAyMTkgMTIgNjkgMTMyIDIyMCAyMDIgMjA5IDE3MSAzMSAxOSA1MSAKKzE2NiAzOCAyMjcgMTU3IDE0MSA3MCA4MyAyOSA4NCA2NyAyMTcgOTcgMjA1IDEyMiAxMzMgMTY0IDk2IDIgMjQxIDk0IDEwNyAzMyAxNjAgCis4NyAxNDUgMTg2IDE4NSAyMTQgMjMxIDE0IDI0MyA5IDIzMCA0MyAxIDM4IDIwMCA1NSAyMjIgMTEwIDE1OCAxMDUgMTM4IDIxMSA3OSAKKzIyNiAxODYgMTU4IDExMiA2NiA1NCA1OSA3MiAyNSA4IDEzIDYwIDQzIDIxIDIxMiAzMCA0OCA2OCAxOTUgOCAyMzkgMTMyIDIxMyAyOCAKKzEzMyAxOTEgMTk4IDE2NyAyMDEgMTkgNDQgMjM4IDIwOCAxIDY1IDU2IDIyMCAxOTUgMzUgOTUgNTEgMTczIDIxMiA1NyAxMzcgMjMzIAorMTY4IDE5MiAxNzYgNzggMiAyOSAxMTEgMTAyIDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAxNjUgNzQgMTcyIDI5IDEwNCAxNzQgMTU2IDE5NyAKKzE4OSA0NCAyMTggMzQgMTU4IDg1IDIxMCAxMzUgOTkgMTQ3IDEwMSA2MiAyMjQgNTkgNTIgMTEwIDE3OCAyMCAyMTQgMjA0IDE3MSA3OCAKKzM2IDQ2IDEwNiA1NSAzIDIxMiA3NyA2NSA2MyAxNDggMjUgMTUgMTg3IDEzNiAyMyAxMDAgNjQgMTM5IDE4MiA2MiAxOTcgMjE2IDE0NiAKKzEzNyAyNDAgOTYgMjIgMTU2IDE3MCA4NyAxMjUgMTIgOTYgMjM0IDEzOSAxNzUgMTM0IDEwOCAyMzYgNTQgNTIgMTQ0IDE5NSAyOCAxNjcgCisyMjEgMTkzIDEyMCAyMTggNDEgODYgMTc0IDE5MCAyMjcgMTg0IDI0MyAyMzUgNTYgMjEzIDIxIDIwNSAxMTUgMjA1IDcxIF4KKzUwNiAwIDExMCAxNjUgMTQxIDIzOCAyMDYgMzcgMTY5IDQ1IDE4NyAxMzQgMTQyIDEyNCA2NiA1IDM2IDcxIDc5IDIzNSAyMzEgNSAxMDUgCisyMiAyMzkgMTY2IDEwMSA0OSA4NiA4MyA2NSAyMjQgMjEgMzEgMTAyIDIyMSAzIDE5MCAxNDcgMjMxIDc5IDU2IDE4MiAxNjUgMzYgMTQwIAorMzAgMTQ3IDE1NyAxMjggMTQ5IDMgNDcgMjQ1IDE1OSAyMTcgNjggOTkgMjAzIDE2NyAyMzUgMTU3IDU0IDE5MyA5MSAxMTYgMTIyIDEyMCAKKzIzNiA3IDIwIDE0NSAyNDIgNSAxNDEgMTY0IDcgMTI1IDIzOCAxNzUgMTQzIDE1MyA4MSA0NSA4IDg1IDU0IDUwIDE4OSA0OSAxNyAxMjcgCisxNTMgNDUgMTUxIDI0MCAxMjEgMTYwIDE3NyAxMzIgMjI3IDEgNjMgMTY2IDI0NCAyMDQgMTU4IDE4OCA1MyA1OSAyMzEgMTQ4IDEyIDk0IAorOTYgMTU0IDE4NCAxMSAyMDggMjM2IDE4NiA2OSAyMzMgNjMgMTM1IDk3IDE4MyAxOTQgNTEgMTgwIDIgMTYxIDEzMiAxOTEgMTA3IDQyIAorMjA3IDEwMiA3OCAxMDEgMTE4IDM3IDI0MyAyNDQgOTQgNjAgMTIgMTYzIDQ3IDY2IDExMCAxMjkgMjQ3IDIxNyAyNDcgMTQ4IDQzIDIzNiAKKzExNyAxMTggNzMgMTM3IDEyIDU4IDIwMiAxMzggMjIwIDExNyA4MiAxNzkgMTE2IDUzIDE2NCA3NiA4MSAxNTAgMTAxIDEzIDE5MiA2MiAKKzEwNiA4NyAxNDMgMjIyIDMyIDIwNSAxODcgMjAzIDkzIDMxIDI0NSAxMjMgNzUgNTIgMTM1IDY2IDQxIDE3OCA4NyAzOCAxMjkgMTA0IAorNjIgMTc1IDM4IDU1IDE1MyAxNTUgMjQ0IDE2OCAxNiAxNzIgOTQgMTcwIDEwNSA5MSAxOTAgNzggMjcgMTY3IDEzMCA2NCAxMjYgNTUgCis3OSAxOTkgODQgMjM3IDE0NiAxMjggMTEzIDEwOSAzMSAzMyAxNyA5NiAxMSAyOSAxODcgOTggMTAzIDEwNyAxMTYgMTU4IDE0IDkgMjE5IAorMTYyIDE4IDUxIDc1IDE1NyAyMzMgMjQyIDE3OSAxOTAgNCA3NiA3IDE5OSAxOTQgODIgNzQgMjMgMTI1IDI2IDY5IDE2NCAxMTIgMjIzIAorMTcxIDY1IDE1NSA3MCAxMTkgMTc2IDEwMyAyMTIgMjA5IDg2IDE1MiAxNiAxMzYgMjAwIDE0OSAxNDYgMjAyIDY0IDIxIDIxMCAxNTEgCis2MSA3NyA3MiAxMDggMiAxOCAyMzAgMTE5IDI0NSA1NCAxMjQgMTQwIDIwOSAxOTYgMiAxOTcgMjYgMjEyIDY2IDE4NCA4MCAxNTkgMTQ4IAorMTE3IDE4NyAyNCA0NCAxOTEgMTc2IDI0NiAxMTkgMzMgMTk2IDE0MCA5OSA5OCA2OSA1NCAxOSA0MiAyOCA1MyAyMzggMzIgMjQxIDgxIAorMjI0IDU3IDE3MyAxMjMgMTgwIDE0NSA2OCAyMDQgNTMgOTUgMTI1IDE2OSAyMTkgMjMxIDIyMiAyMTEgMSAyNyAyNCAyMjMgMjQwIDE2IAorNjcgMSAyMzcgMjE1IDg0IDI1IDQwIDE0OSA3MiAzIDE1MiA5MCA4NyAxMTIgODAgMTYgMjQxIDQ1IDc3IDM2IDIxNCAyMjkgNTkgODggCisyNDYgMTg4IDIzMiAxMDggNzEgMjIyIDE0MiA1MCAxMTUgOTMgMTA1IDIwMSAzNSA2IDE3MCAxNzkgNDcgMTAyIDQgMTUwIDIxMSAxMTEgCisxMjAgMjA1IDExMyA0IDE4MSAxMDUgMTI3IDg0IDk0IDIzOSA2MSAzIDEyMSAxOTYgNzEgMTQ4IDE4NiAxMzggMTg0IDIyMyA2MSAyMjAgCisyMjcgMTc1IDEwNyA2IDY1IDgxIDExNCAyMDcgMjQ1IDIzMyAxNzMgMjI4IDMwIDczIDIwNiAyMTYgMjE4IDEzMyA4IDExIDk4IDE0MyAKKzEwIDE3OSAyMjEgMTQ2IDk3IDIxOSA4OCA2NyAxMzkgMTQ0IDM5IDE4OSAxMyAxMjMgMTExIDE5NCAxNTYgMjUgMTgzIDUxIDE0NCAxMDggCisxNDUgMTczIDQ5IDIyOSAyMzMgMTM3IDg2IDkgMTE0IDY0IDkwIDE2MSA2MyAyNDAgMTk1IDExMSA4OSA1OCA5NyA0MCA0NCAyMjcgNzAgCisxNCA3OCAxNzAgNzQgMTk3IDE2OSAxMTQgMTM4IDQxIDczIDI0MiAxMTAgMjM0IDE3NyBeCis0OTEgMCAxNDUgMTM1IDE1NSAyMDcgMjAgMjQzIDIwOCAyMDAgNDAgNDggMjEgMTcwIDUgNDAgMTExIDE3OCAyMjggMTg5IDE5NiAyMTAgCis0OSA2IDI0NiAxNzEgNTYgMjMgODUgMTI4IDQ2IDE5OCAyMTcgOTUgMTA4IDI0MSAxMzUgMjQ3IDEzMCAxMTYgMTUxIDEzMCAyNCAyMjggCiszNCAxMTYgNTYgMjA3IDE3OCA3MCAxMTIgNDIgMTE4IDIyMSA4MCAxODQgMTU3IDE1MSAxNTkgMzcgMTkgNSAxMzIgMzEgMjQgMTM2IAorMTExIDIwIDE0OCAzNSAxMDQgMTMyIDEyNiAxOTQgMjMyIDE5IDE5MiAyMjUgMjIzIDkwIDIzMCAxMiAxNDYgMTIwIDIyOCAxMjYgMzkgCisxNTIgMTE1IDEwMCAxNDcgNTAgMjggMjE2IDEwNyAzNSA3NSAxMTkgODUgMjIwIDIxNiA0NCAxMjUgMTcgMTg1IDE3OSAxMjEgOTUgMTYgCis3MSAzOSA4OSAyMDggNDIgMjEwIDE0NCAxNzYgOTIgNzkgMjI4IDk3IDIzIDExNCAxNDEgODQgMTcyIDIzMyA3MCAxNzUgMTk5IDE3NiAKKzE1NSAyMzYgMzYgMzEgMTc5IDIxMyAxNSAxMTIgMjI2IDIxMSAxNjMgMTQ2IDI4IDU4IDMwIDEzMSAyMzAgNDEgMTYyIDE2MSAyMDIgCisxNDIgMTQgMjE5IDczIDE0MSA1NSAxNTYgMTk1IDk2IDE1OSAyMjQgMTA5IDE5NyAxOTggMTI1IDE3MiAxMiA4MyAyMTMgMTczIDE5MiAKKzEzMCA1MyAyNDEgNzIgOTAgNzIgMTgyIDI0MiAyOCAxNTAgMjAwIDIyNyAxMzggMjEzIDIzNiA5OSAxODggMjM3IDE1MCAxNzEgMjExIAorMTAwIDIzOSAyMjAgMTI0IDEyNCAyOSAxMDkgMTMgMTA1IDE4MyAxMDkgMTY4IDE4MiA4NyAyMDEgMjQ2IDEwOCAxNDkgMjE1IDE1MSAKKzIyMiAxOTQgNzQgMTg5IDM4IDEzMyAxNDUgMTY0IDE2OCAyNDggMjQ0IDkgMTgzIDE0IDI0OCA4NiAxNzkgMjkgMTcyIDE3MCAxNjMgCisxMTcgMTUgMjAgNTYgMTE1IDggMjI0IDIwNCAxMjAgNDQgMzMgOTQgODkgMjEgMTk5IDE4IDc4IDg1IDE5MSAyMDMgNiAxNTQgMSAyMTAgCisxMTUgMTYzIDU0IDEwOCAyMTIgMTIyIDIwOSAxNTYgMTAzIDE3NiA2MyA2NiAxODcgMTIzIDEwIDEzOSA3NyAxMjYgMTMxIDc1IDIxMSA4IAorNjkgMTI0IDIxNiAyMDIgMjA1IDE3MSAyNyA3IDQ3IDE1NCAzMCAyMjMgMTUzIDEzNyA3MCA4MyAyOSA4MCA2NyAyMDkgOTMgMTkzIDExOCAKKzEyOSAxNjAgODggMiAyMjkgODIgOTkgMzMgMTYwIDI0NiA3OSAxMzMgMTc0IDE3NyAyMDYgMjE5IDEwIDIzMSAyNDcgMjIyIDM5IDI0NyAKKzM4IDE5NiA1NSAyMjIgMTAyIDE1NCA5MyAxMzAgMjExIDcxIDIyNiAxODIgMTUwIDEwOCA1NCA0MiA1NSA2NCAyNSAxIDUyIDM1IDkgCisyMTIgMzAgMzYgNjAgMTk1IDQgMjM5IDEyOCAyMDEgMjggMTIxIDE4NyAxODYgMTY3IDE5NyAxMSAzMiAyMzAgMTk2IDIzOSA2NSA0NCAKKzIyMCAxODcgMzEgODcgNDMgMTY5IDIwNCA1NyAxMzcgMjI1IDE2MCAxODAgMTcyIDc4IDI0MCAyMSAxMDcgOTggMjMyIDE3NyAyMiAxMjkgCis2OCAxNjggMTUzIDc0IDE2MCAyNSA5MiAxNzQgMTQ4IDE5MyAxODEgMzYgMjE4IDIyIDE1OCA4MSAyMDYgMTI3IDg3IDEzNSA4OSA1MCAKKzIxMiA1OSA1MiA5OCAxNjYgMjAgMjE0IDE5MiAxNTkgNjYgMzIgNDYgMTA2IDQ3IDI0OSAyMDAgNjkgNjEgNTkgMTQ0IDIxIDE1IDE3NSAKKzEzNiAxOSAxMDAgNTIgMTI3IDE4MiA1OCAxODUgMjA4IDEzNCAxMzMgMjQwIDg0IDE0IDE1NiAxNjYgODMgMTIxIDk2IDIyMiAxMzEgCisxNjcgMTM0IDEwNCAyMjQgNDYgNDAgMTQwIDE5MSAxNiAxNjMgMjA5IDE4NSAxMTYgMjE0IDM3IDgyIDE2MiAxOTAgMjE1IDE4MCAyMzUgCisyMzUgNDggMjA1IDEzIDE5NyAxMDMgMjA1IDc2IDEwNCAxNjEgMTM5IDIzMiAxNDYgXgorNTE2IDAgMzMgMTY1IDMzIDE3NSAxMjIgMTM0IDExMiA2NiAxIDI0IDU5IDY3IDIzMSAyMTkgNSAxMDEgMTQgMjI3IDE1OCA4OSA0MSA4MiAKKzcxIDYxIDIyNCAxMyAyMyAxMDIgMjEzIDMgMTg2IDE0MyAyMjMgNzEgNTYgMTc0IDE2NSAyOCAxMzYgMjIgMTM5IDE1NyAxMTYgMTM3IAorMjQ3IDQzIDIzMyAxNTUgMjE3IDY0IDkxIDIwMyAxNTUgMjI3IDE1MyA1MCAxOTMgODcgMTE2IDEyMiAxMDggMjM2IDcgMTYgMTM3IDI0MiAKKzI0NSAxMzMgMTYwIDI1MSAxMjUgMjM4IDE2MyAxMzkgMTQxIDc3IDM3IDc3IDQyIDUwIDE3NyAzNyA1IDEyNyAxNTMgNDUgMTQzIDIyOCAKKzEyMSAxNTYgMTY5IDEyMCAyMTkgMjQxIDUxIDE2NiAyMzIgMTkyIDE1MCAxODggNTMgNTUgMjI3IDE0OCA4MiA5MiAxNTAgMTcyIDMgCisxOTYgMjMyIDE4MiA2MSAyMjkgNjMgMTIzIDk3IDE3OSAxOTQgMzkgMTcyIDI1MCAxNTcgMTMyIDE4NyA5NSAzOCAxOTkgOTQgNzAgOTMgCisxMTggMzcgMjMxIDI0MCA5NCA2MCA0IDE1OSA0NyA1OCAxMTAgMTI1IDI0MyAyMTMgMjM5IDEzNiA0MyAyMjggMTA1IDEwNiA2OSAxMjUgCisxMiA1MCAxOTggMTI2IDIxNiAxMTcgNzQgMTc1IDExMiA0NSAxNjQgNzYgNjkgMTQ2IDEwMSA5IDE4OCA1OCA5NCA3NSAxNDMgMjE4IDMyIAorMTk3IDE3OSAxOTkgODkgMzEgMjQ1IDEyMyA3MSA0MCAxMzUgNTQgMzMgMTcwIDgzIDM0IDExNyAxMDAgNjIgMTcxIDMwIDUxIDE0NSAKKzE0MyAyNDQgMTYwIDQgMTY0IDg2IDE1OCAxMDUgOTEgMTgyIDY2IDI3IDE2MyAxMTggNTIgMTE4IDQ3IDc5IDE5OSA4NCAyMzMgMTM0IAorMTI4IDEwNSAxMDEgMTkgMjUgMTcgODQgNyAyMSAxODcgOTAgMjQwIDk5IDk5IDEwNCAxNTQgMiAyNDkgMjE1IDE1NCAxOCA0NyA2MyAKKzE0OSAyMjUgMjM4IDE3OSAxNzggNzIgMyAxOTEgMTgyIDgyIDY2IDExIDExMyAxOCA1NyAxNTIgMTA4IDIxNSAxNTkgNTcgMTQ3IDU4IAorMTE1IDE2NCA5MSAyMDggMjA1IDg2IDE0OCAxNiAxMzIgMTkyIDE0NSAxMzggMTk0IDYwIDkgMTk4IDE0NyA1MyA2NSA2NCA5NiAyNDIgCisxNCAyMjIgMTE5IDI0MSA0NiAxMTYgMTMyIDE5NyAxODQgMjM4IDE4OSAyNiAyMDAgNjIgMTc2IDgwIDE1MSAxNDAgMTA5IDE4MyAyNCAKKzQ0IDE5MSAxNzIgMjM0IDEwNyAyMSAxOTIgMTQwIDk5IDk0IDY1IDU0IDcgNDIgMjQgNDkgMjMwIDIwIDIyOSA3MyAyMTIgNDUgMTY5IAorMTE1IDE4MCAxNDEgNTYgMjAwIDQxIDg3IDEyMSAxNjEgMjE5IDIzMSAyMTQgMjA3IDEgMTkgMjAgMjE5IDIzNiAxMiA1NSAyMzcgMjM3IAorMjExIDcyIDEzIDI4IDE0MSA3MiAyMzkgMTUyIDgyIDg3IDEwMCA3MiA4IDI0MSA0MSA3NyAzMiAyMDIgMjI5IDQ3IDg0IDIzOCAxODQgCisyMjggMTAwIDY3IDIxMCAxMzAgNDYgMTExIDkzIDk3IDE4OSAzMSAyNTAgMTYyIDE3MSAzNSA5MCA0IDEzOCAxOTkgOTkgMTIwIDE5MyAKKzExMyAyNDQgMTgxIDkzIDEyMyA3NiA5MCAyMzUgNDkgMjUxIDEwOSAxODggNjMgMTQ0IDE4NiAxMzggMTg0IDIyMyA2MSAyMDggMjE1IAorMTc1IDEwNyA2IDUzIDgxIDExNCAyMDcgMjM3IDIyMSAxNjEgMjI0IDE4IDczIDIwMiAyMDggMjEwIDEyNSAyNDggMTEgOTggMTMxIDI1MCAKKzE2NyAyMjEgMTQ2IDg1IDIxMSA4OCA2MyAxMzkgMTM2IDI3IDE4OSA1IDExMSAxMDMgMTg2IDE0OCAyMSAxNzEgNTEgMTQwIDEwNCAxMzMgCisxNjUgNDkgMjI1IDIzMyAxMjkgNzggNSAxMDYgNjQgODYgMTUzIDU1IDIzMiAxODcgMTExIDc3IDU4IDg5IDM2IDMyIDIyMyA2NiA2IDc0IAorMTcwIDYyIDE5NyAxNjkgMTEwIDEzMCA0MSA2MSAyMzQgMTAyIDIzNCA5MiAxNDUgMTMzIDE1NSAyMDEgMTQgMjQzIDIwOCAyMDAgMzYgCis0OCAyMSAxNjYgMSA0MCAxMDkgMTc4IDE0NyBeCis1MjIgMCAxNzkgMTk2IDIwMCAzNCAyNTEgMjQxIDE1NiA1MSAyMyA3NSAxMTggNDEgMTkzIDIwMiA5MCA5MyAyMzYgMTI1IDI0MiAxMjUgCisxMDEgMTUxIDEzMCAxNCAyMTggMzQgMTA2IDQxIDE5NyAxNzMgNTUgMTEyIDM3IDEwOCAyMTEgNjUgMTc0IDE0MiAxMzYgMTU5IDIyIDE5IAorMjQ1IDEyNyAxNiAxOSAxMzEgMTAxIDEwIDEzMyAyMCAxMDQgMTIyIDEyNiAxODQgMjI3IDkgMTg3IDIyNSAyMDggOTAgMjMwIDcgMTMxIAorMTA1IDIxMyAxMjEgMzkgMTM3IDEwNSA5NSAxNDcgNDUgMjMgMjE2IDkyIDM1IDc1IDExNCA3MCAyMDUgMjA2IDM0IDExMCAxMiAxODUgCisxNjkgMTExIDk1IDYgNzEgMjkgNzkgMjAzIDMyIDE5NSAxNDQgMTYxIDgyIDY0IDIyOCA5MiA4IDEwNCAxMjYgNzQgMTcyIDIyMyA2NSAKKzE3MCAxOTQgMTcxIDE0MCAyMjEgMzYgMjEgMTY0IDE5OCA1IDEwMiAyMTEgMjA2IDE0OCAxMzYgMTggNDggMjUgMTMxIDIxNSAzNiAxNjIgCisxNjEgMTkyIDE0MiAxNCAyMTQgNjMgMTQxIDQ1IDE0MSAxOTAgODYgMTQ5IDIxOSA5NCAxODIgMTk4IDExNSAxNTcgMjUyIDczIDIwMyAKKzE3MyAxOTIgMTE1IDQzIDIyNiA2NyA4NSA2MiAxNzIgMjI3IDEzIDEzNSAxOTAgMjI3IDEyMyAyMTMgMjMxIDk0IDE3OCAyMjcgMTUwIAorMTYxIDE5NiA5MCAyMzQgMjEwIDExOSAxMjQgMTQgMTA0IDggMTAwIDE3OCAxMDkgMTUzIDE2NyA4MiAyMDEgMjMxIDk4IDE0OSAyMTUgCisxNDYgMjE3IDE3OSA1OSAxNzQgMjggMTMzIDEzMCAxNTkgMTYzIDI0OCAyMzkgOSAxODMgMjU0IDI0MyA3MSAxNzQgMjQgMTYyIDE2NSAKKzE2MyAxMDcgMTAgMTUgNDYgMTEwIDggMjE0IDIwNCAxMTUgMzkgMjMgNzkgODkgNiAxODkgMyA3MyA4NSAxNzYgMTk4IDEgMTU0IDI0NiAKKzIxMCAxMTUgMTUzIDQ5IDEwOCAyMDcgMTE3IDIwOSAxNDYgMTAzIDE3NiA1MyA1NiAxNzIgMTEzIDEwIDEyOSA3MiAxMTYgMTI2IDcwIAorMjAxIDMgNjkgMTE0IDIxMSAyMDIgMjAwIDE3MSAyMiAyNDcgNDIgMTM5IDIwIDIxOCAxNDggMTMyIDcwIDgzIDI5IDc1IDY3IDE5OSA4OCAKKzE3OCAxMTMgMTI0IDE1NSA3OCAyIDIxNCA2NyA4OSAzMyAxNjAgMjQ2IDY5IDExOCAxNTkgMTY3IDE5NiAyMDQgNSAyMTYgMjM3IDIxMiAKKzM0IDI0NyAzOCAxOTEgNTUgMjIyIDkyIDE0OSA3OCAxMjAgMjExIDYxIDIyNiAxNzcgMTQwIDEwMyAzOSAyNyA1MCA1NCAyNSAyNDUgCisyNDEgNDIgMjUgMjQ5IDIxMiAzMCAyMSA1MCAxOTUgMjU0IDIzOSAxMjMgMTg2IDI4IDEwNiAxODIgMTcxIDE2NyAxOTIgMSAxNyAyMjAgCisxODEgMjI5IDY1IDI5IDIyMCAxNzcgMjYgNzcgMzMgMTY0IDE5NCA1NyAxMzcgMjE1IDE1MCAxNjUgMTY3IDc4IDIzMCAxMSAxMDIgOTMgCisyMzIgMTc3IDIyIDEyOSA2OCAxNjggMTM4IDc0IDE0NSAyMCA3NyAxNzQgMTM4IDE4OCAxNzEgMjYgMjE4IDcgMTU4IDc2IDIwMSAxMTcgCis3MiAxMjAgNzQgMzUgMTk3IDU5IDUyIDgzIDE1MSAyMCAyMTQgMTc3IDE0NCA1MSAyNyA0NiAxMDYgMzcgMjQ5IDE4NSA1OSA1NiA1NCAKKzEzOSAxNiAxNSAxNjAgMTM2IDE0IDEwMCAzNyAxMTIgMTgyIDUzIDE3MCAxOTggMTE5IDEyOCAyNDAgNjkgNCAxNTYgMTYxIDc4IDExNiAKKzI0MCA5NiAyMDcgMTIxIDE1NyAxMzQgOTkgMjA5IDM2IDI1IDEzNSAxODYgMSAxNTggMTk0IDE3NSAxMTEgMjA5IDMyIDc3IDE0NyAxOTAgCisyMDAgMTc1IDIyNSAyMzUgMzggMTk1IDMgMTg3IDg4IDIwNSA2MSA4OSAxNTEgMTM0IDIxNyAyMDYgMzAgMTYyIDI0IDE2NiAxMTMgMTI4IAorMTAzIDY2IDI1MyAxNSA1MCA1OCAyMjggMjEwIDUgOTggOCAyMTggMTUyIDgwIDM1IDc5IDYyIDU4IDIyNCA3IDE3IDEwMiAyMDcgMyAKKzE4MyAxNDAgMjE3IDY1IDU2IDE2OCAxNjUgMjIgMTMzIDE2IDEzMyAxNTcgMTA3IDEyOCAyNDQgMTIgXgorNTE3IDEgMjE4IDE1MCAyMTcgNTkgODEgMjAzIDE0MCAyMTcgMTQ4IDQ1IDE5MyA4MiAxMTYgMTIyIDkzIDIzNiA3IDExIDEyNyAyNDIgCisyMzUgMTIzIDE1NSAyNDYgMTI1IDIzOCAxNDggMTM0IDEyNiA3MiAyNyAyNDcgNjcgMjcgNTAgMTYyIDIyIDI0NyAxMjcgMTUzIDQ1IAorMTMzIDIxMyAxMjEgMTUxIDE1OSAxMDUgMjA5IDIzMSAzNiAxNjYgMjE3IDE3NyAxNDAgMTg4IDUzIDUwIDIyMiAxNDggMjQyIDY3IDg3IAorMTQ1IDE1NyAyNTAgMTgxIDIyNyAxNzcgNTEgMjI0IDYzIDEwOCA5NyAxNzQgMTk0IDI0IDE2MiAyNTAgMTUyIDEzMiAxODIgODAgMzMgCisxODkgODQgNjAgODMgMTE4IDM3IDIxNiAyMzUgOTQgNjAgMjUxIDE1NCA0NyA0OCAxMTAgMTIwIDIzOCAyMDggMjI5IDEyMSA0MyAyMTggCis5MCA5MSA2NCAxMTAgMTIgNDAgMTkzIDExMSAyMTEgMTE3IDY0IDE3MCAxMDcgMzUgMTY0IDc2IDU0IDE0MSAxMDEgNCAxODMgNTMgNzkgCis2MCAxNDMgMjEzIDMyIDE4NyAxNjkgMTk0IDg0IDMxIDI0NSAxMjMgNjYgMjUgMTM1IDM5IDIzIDE2MCA3OCAyOSAxMDIgOTUgNjIgMTY2IAorMjAgNDYgMTM1IDEyOCAyNDQgMTUwIDI0NiAxNTQgNzYgMTQzIDEwNSA5MSAxNzIgNTEgMjcgMTU4IDEwMyAzNyAxMDggMzcgNzkgMTk5IAorODQgMjI4IDExOSAxMjggOTUgOTEgNCAxNSAxNyA2OSAyIDExIDE4NyA4MCAyMzAgOTQgODkgODkgMTQ5IDI0NCAyMzkgMjEwIDE0NCAxOCAKKzQyIDQ4IDEzOSAyMTUgMjMzIDE3OSAxNjMgMjUyIDY3IDI1NSAxODEgMTY3IDgyIDU2IDI1MyA5OCA4IDQyIDEzNyAxMDMgMjA1IDE0NCAKKzQ3IDEzNyA0MyAxMTAgMTQ5IDc2IDIwMyAyMDAgODYgMTQzIDE2IDEyNyAxODIgMTQwIDEyOCAxODQgNTUgMjUxIDE4MyAxNDIgNDMgNTAgCis1NCA4MSAyMzIgOSAyMTIgMTE5IDIzNiAzNiAxMDYgMTIyIDE4MiAxNjkgMjIzIDE3OSAyNiAxODUgNTcgMTY2IDgwIDE0MSAxMzAgOTkgCisxNzggMjQgNDQgMTkxIDE2NyAyMTkgOTIgNiAxODcgMTQwIDk5IDg5IDYwIDU0IDI0OSA0MiAxOSA0NCAyMjAgNSAyMTQgNjMgMTk3IDMwIAorMTY0IDEwNSAxODAgMTM2IDQxIDE5NSAyNiA3NyAxMTYgMTUxIDIxOSAyMzEgMjA0IDIwMiAxIDkgMTUgMjE0IDIzMSA3IDQwIDIyMiAKKzIzNyAyMDYgNTcgMjU1IDEzIDEzMSA3MiAyMjQgMTUyIDcyIDg3IDg1IDYyIDI1NSAyNDEgMzYgNzcgMjcgMTg3IDIyOSAzMiA3OSAyMjggCisxNzkgMjIzIDkwIDYyIDE5NSAxMTUgNDEgMTA2IDkzIDg3IDE3NCAyNiAyNDUgMTUyIDE2MSAyMCA3NSA0IDEyMyAxODQgODQgMTIwIAorMTc4IDExMyAyMzQgMTgxIDc4IDExOCA2NiA4NSAyMzAgMzQgMjUxIDk0IDE3OCA1MyAxMzkgMTg2IDEzOCAxODQgMjIzIDYxIDE5MyAKKzIwMCAxNzUgMTA3IDYgMzggODEgMTE0IDIwNyAyMjcgMjA2IDE0NiAyMTkgMyA3MyAxOTcgMTk4IDIwMCAxMTUgMjM4IDExIDk4IDExNiAKKzI0MCAxNTIgMjIxIDE0NiA3MCAyMDEgODggNTggMTM5IDEyNiAxMiAxODkgMjUyIDk2IDkzIDE3NiAxMzggMTYgMTU2IDUxIDEzNSA5OSAKKzExOCAxNTUgNDkgMjIwIDIzMyAxMTkgNjggOTYgNjQgODEgMTQzIDQ1IDIyMiAxNzcgMTExIDYyIDU4IDc5IDMxIDE3IDIxOCA2MSAyNTMgCis2OSAxNzAgNDcgMTk3IDE2OSAxMDUgMTIwIDQxIDQ2IDIyNCA5MiAyMzQgOTIgMTQ1IDEyOCAxNTUgMTg2IDI1NiAyNDMgMjA4IDIwMCAKKzI2IDQ4IDIxIDE1NiAyNDggNDAgMTA0IDE3OCAyMjEgMTc1IDE5NiAxOTYgMjggMjQ5IDIzOSAxNTAgNDkgMjMgNzEgMTE0IDM5IDE5MSAKKzE5NiA4OCA4NyAyMzQgMTIxIDI0MCAxMjMgOTUgMTUxIDEzMCAxMCAyMTQgMzQgMTAyIDM1IDE5MyAxNzEgNDkgMTEyIDM1IDEwNCAyMDcgCis1OSAxNzAgMTM2IDEzMCAxNTkgMTYgMTkgMjQxIDEyNSAyMTMgXgorNTI5IDEgMTUgMTI3IDkzIDIgMTIxIDggMTA0IDExNCAxMjYgMTc2IDIyMyAxIDE4MyAyMjUgMTk2IDkwIDIzMCAzIDExOSA5MyAyMDEgCisxMTcgMzkgMTI1IDk3IDkxIDE0NyA0MSAxOSAyMTYgODAgMzUgNzUgMTEwIDU4IDE5MyAxOTggMjYgOTggOCAxODUgMTYxIDEwMyA5NSAKKzI1NyA3MSAyMSA3MSAxOTkgMjQgMTgzIDE0NCAxNDkgNzQgNTIgMjI4IDg4IDI1NSA5NiAxMTQgNjYgMTcyIDIxNSA2MSAxNjYgMTkwIAorMTY3IDEyOCAyMDkgMzYgMTMgMTUyIDE4NiAyNTYgOTQgMTk5IDIwMiAxMzYgMTI4IDEwIDQwIDIxIDEzMSAyMDMgMzIgMTYyIDE2MSAKKzE4NCAxNDIgMTQgMjEwIDU1IDE0MSAzNyAxMjkgMTg2IDc4IDE0MSAyMTUgODIgMTcwIDE5OCAxMDcgMTQ1IDI0NCA2NSAxOTUgMTczIAorMTkyIDEwMyAzNSAyMTQgNjMgODEgNTQgMTY0IDIxNSAxIDEyMyAxODIgMjI3IDExMSAyMTMgMjI3IDkwIDE3MCAyMTkgMTUwIDE1MyAKKzE4NCA4MiAyMzAgMjAyIDExNSAxMjQgMiAxMDAgNCA5NiAxNzQgMTA5IDE0MSAxNTUgNzggMjAxIDIxOSA5MCAxNDkgMjE1IDE0MiAyMTMgCisxNjcgNDcgMTYyIDIwIDEzMyAxMTggMTU1IDE1OSAyNDggMjM1IDkgMTgzIDI0NiAyMzkgNTkgMTcwIDIwIDE1NCAxNjEgMTYzIDk5IDYgCisxMSAzOCAxMDYgOCAyMDYgMjA0IDExMSAzNSAxNSA2NyA4OSAyNTMgMTgxIDI1MCA2OSA4NSAxNjQgMTk0IDI1NiAxNTQgMjQyIDIxMCAKKzExNSAxNDUgNDUgMTA4IDIwMyAxMTMgMjA5IDEzOCAxMDMgMTc2IDQ1IDQ4IDE2MCAxMDUgMTAgMTIxIDY4IDEwOCAxMjIgNjYgMTkzIAorMjU4IDY5IDEwNiAyMDcgMjAyIDE5NiAxNzEgMTggMjM5IDM4IDEyNyAxMiAyMTQgMTQ0IDEyOCA3MCA4MyAyOSA3MSA2NyAxOTEgODQgCisxNjYgMTA5IDEyMCAxNTEgNzAgMiAyMDIgNTUgODEgMzMgMTYwIDI0NiA2MSAxMDYgMTQ3IDE1OSAxODggMTkyIDEgMjA0IDIyOSAyMDQgCiszMCAyNDcgMzggMTg3IDU1IDIyMiA4NCAxNDUgNjYgMTEyIDIxMSA1MyAyMjYgMTczIDEzMiA5OSAyNyAxNSA0NiA0NiAyNSAyNDEgMjMzIAorMzQgMTcgMjQxIDIxMiAzMCA5IDQyIDE5NSAyNTQgMjM5IDExOSAxNzQgMjggOTQgMTc4IDE1OSAxNjcgMTg4IDI1MiA1IDIxMiAxNjkgCisyMjEgNjUgMTcgMjIwIDE2OSAyMiA2OSAyNSAxNjAgMTg2IDU3IDEzNyAyMDcgMTQyIDE1MyAxNjMgNzggMjIyIDMgOTggODkgMjMyIAorMTc3IDIyIDEyOSA2OCAxNjggMTI2IDc0IDEzMyAxNiA2NSAxNzQgMTMwIDE4NCAxNjMgMTggMjE4IDI1NCAxNTggNzIgMTk3IDEwOSA2MCAKKzEwOCA2MiAyMyAxODUgNTkgNTIgNzEgMTM5IDIwIDIxNCAxNjUgMTMyIDM5IDIzIDQ2IDEwNiAyOSAyNDkgMTczIDUxIDUyIDUwIDEzNSAKKzEyIDE1IDE0OCAxMzYgMTAgMTAwIDI1IDEwMCAxODIgNDkgMTU4IDE5MCAxMDcgMTI0IDI0MCA1NyAyNTUgMTU2IDE1NyA3NCAxMTIgCisyMzIgOTYgMTk1IDExMyAxNDkgMTM0IDk1IDE5NyAyOCAxMyAxMzEgMTgyIDI0OCAxNTQgMTgyIDE2NyAxMDcgMjA1IDI4IDczIDEzNSAKKzE5MCAxODggMTcxIDIxNyAyMzUgMzAgMTg3IDI1NCAxNzkgNzYgMjA1IDQ5IDc3IDE0MyAxMzAgMjA1IDIwNiAyNiAxNTggMTIgMTU0IAorMTAxIDEyMCA5MSA2NiAyNTMgMyAzOCA0NiAyMjQgMTk4IDUgOTQgMjA2IDE0NCA2OCAyNyA3NSA1MCA1NCAyMjQgMjU4IDkgMTAyIDE5OSAKKzMgMTc5IDEzNiAyMDkgNTcgNTYgMTYwIDE2NSAxNCAxMjkgOCAxMjUgMTU3IDk1IDExNiAyNDAgMzYgMjEyIDE0OCAyMTcgNTcgNzcgCisyMDMgMTM0IDIxMyAxNDYgNDMgMTkzIDgwIDExNiAxMjIgODcgMjM2IDcgOSAxMjMgMjQyIDIzMSAxMTkgMTUzIDI0NCAxMjUgMjM4IAorMTQyIDEzMiAxMjAgNzAgMjMgMjQ1IDYzIDIxIDUwIDE1NiAxNiAyNDMgMTI3IDE1MyA0NSAxMjkgMjA3IDEyMSAxNDkgMTU1IDk5IDIwNSAKKzIyNyAzMCAxNjYgMjExIDU3IF4KKzU0OCAwIDEzNCAxODggNTMgNDcgMjE5IDE0OCAyMzYgNTggODQgMTQyIDE0OCAyNDcgMTcyIDIyNCAxNzQgNDUgMjIxIDYzIDk5IDk3IAorMTcxIDE5NCAxNSAxNTYgMjUwIDE0OSAxMzIgMTc5IDcxIDMwIDE4MyA3OCA1NCA3NyAxMTggMzcgMjA3IDIzMiA5NCA2MCAyNDggMTUxIAorNDcgNDIgMTEwIDExNyAyMzUgMjA1IDIyMyAxMTIgNDMgMjEyIDgxIDgyIDYxIDEwMSAxMiAzNCAxOTAgMTAyIDIwOCAxMTcgNTggMTY3IAorMTA0IDI5IDE2NCA3NiA0NSAxMzggMTAxIDEgMTgwIDUwIDcwIDUxIDE0MyAyMTAgMzIgMTgxIDE2MyAxOTEgODEgMzEgMjQ1IDEyMyA2MyAKKzE2IDEzNSAzMCAxNyAxNTQgNzUgMjYgOTMgOTIgNjIgMTYzIDE0IDQzIDEyOSAxMTkgMjQ0IDE0NCAyNDAgMTQ4IDcwIDEzNCAxMDUgOTEgCisxNjYgNDIgMjcgMTU1IDk0IDI4IDEwMiAzMSA3OSAxOTkgODQgMjI1IDExMCAxMjggODkgODUgMjU1IDkgMTcgNjAgMjU5IDUgMTg3IDc0IAorMjI0IDkxIDgzIDgwIDE0NiAyMzggMjMzIDIwNyAxMzggMTggMzkgMzkgMTMzIDIwOSAyMzAgMTc5IDE1NCAyNTIgNjQgMjU1IDE3NSAKKzE1OCA4MiA1MCAyNDcgODkgMiAzMyAxMjggMTAwIDE5OSAxMzUgNDEgMTMxIDM0IDEwNyAxNDAgNjcgMjAwIDE5NyA4NiAxNDAgMTYgCisxMjQgMTc2IDEzNyAxMjIgMTc4IDUyIDI0NSAxNzQgMTM5IDM3IDQxIDQ4IDcyIDIyNiA2IDIwNiAxMTkgMjMzIDMwIDEwMCAxMTYgMTczIAorMTYwIDIxNCAxNzMgMjYgMTc2IDU0IDE2MCA4MCAxMzUgMTI0IDkzIDE3NSAyNCA0NCAxOTEgMTY0IDIxMCA4MyAyNTcgMTg0IDE0MCA5OSAKKzg2IDU3IDU0IDI0MyA0MiAxNiA0MSAyMTQgMjU2IDIwNSA1NyAxODggMjEgMTYxIDk5IDE4MCAxMzMgMzIgMTkyIDE3IDcxIDExMyAxNDUgCisyMTkgMjMxIDE5OCAxOTkgMSAzIDEyIDIxMSAyMjggNCAzMSAyMTMgMjM3IDIwMyA0OCAyNDkgNCAxMjUgNzIgMjE1IDE1MiA2NiA4NyAKKzc2IDU2IDI1MiAyNDEgMzMgNzcgMjQgMTc4IDIyOSAyMyA3NiAyMjIgMTc2IDIyMCA4NCA1OSAxODYgMTA2IDM4IDEwMyA5MyA4MSAxNjUgCisyMyAyNDIgMTQ2IDE1NSAxMSA2NiA0IDExNCAxNzUgNzUgMTIwIDE2OSAxMTMgMjI4IDE4MSA2OSAxMTUgNjAgODIgMjI3IDI1IDI1MSAKKzg1IDE3MiA0NyAxMzYgMTg2IDEzOCAxODQgMjIzIDYxIDE4NCAxOTEgMTc1IDEwNyA2IDI5IDgxIDExNCAyMDcgMjIxIDE5NyAxMzcgCisyMTYgMjU0IDczIDE5NCAxOTIgMTk0IDEwOSAyMzIgMTEgOTggMTA3IDIzNCAxNDMgMjIxIDE0NiA2MSAxOTUgODggNTUgMTM5IDEyMCAzIAorMTg5IDI0OSA4NyA4NyAxNzAgMTMyIDEzIDE0NyA1MSAxMzIgOTYgMTA5IDE0OSA0OSAyMTcgMjMzIDExMyA2MiAyNTcgOTAgNjQgNzggCisxMzcgMzkgMjE2IDE3MSAxMTEgNTMgNTggNzMgMjggOCAyMTUgNTggMjUwIDY2IDE3MCAzOCAxOTcgMTY5IDEwMiAxMTQgNDEgMzcgMjE4IAorODYgMjM0IDkyIDE0NSAxMjUgMTU1IDE3NyAyNTAgMjQzIDIwOCAyMDAgMjAgNDggMjEgMTUwIDI0NSA0MCAxMDEgMTc4IDIxOCAxNjkgCisxOTYgMTkwIDE5IDI0NiAyMzYgMTQxIDQ2IDIzIDY1IDEwOCAzNiAxODggMTg3IDg1IDc4IDIzMSAxMTUgMjM3IDEyMCA4NiAxNTEgMTMwIAorNCAyMDggMzQgOTYgMjYgMTg3IDE2OCA0MCAxMTIgMzIgOTggMjAxIDUwIDE2NCAxMjcgMTIxIDE1OSA3IDE5IDIzNSAxMjIgMSAxNCAKKzEyNiA5MSAxMTggNSAxMDQgMTEyIDEyNiAxNzQgMjIyIDI1OSAxODIgMjI1IDE5MyA5MCAyMzAgMiAxMTYgOTAgMTk4IDExNiAzOSAxMjIgCis5NSA5MCAxNDcgNDAgMTggMjE2IDc3IDM1IDc1IDEwOSA1NSAxOTAgMTk2IDI0IDk1IDcgMTg1IDE1OSAxMDEgOTUgMjU2IDcxIDE5IDY5IAorMTk4IDIyIDE4MCAxNDQgMTQ2IDcyIDQ5IDIyOCA4NyAyNTMgOTQgMTExIDY0IDE3MiAyMTMgNjAgMTY1IDE4OSAxNjYgMTI1IDIwNiAzNiAKKzExIDE0OSAxODMgMjU1IDkyIDE5NiAyMDEgMTMzIDEyNiA4IDM4IDIwIDEzMSAyMTMgXgorNTQ3IDAgMjkgMTYyIDE2MSAxNzggMTQyIDE0IDIwNyA0OSAxNDEgMzEgMTIwIDE4MyA3MiAxMzUgMjEyIDczIDE2MSAxOTggMTAxIDEzNiAKKzIzOCA1OSAxODkgMTczIDE5MiA5NCAyOSAyMDUgNjAgNzggNDggMTU4IDIwNiAyNTQgMTE0IDE3NiAyMjcgMTAyIDIxMyAyMjQgODcgCisxNjQgMjEzIDE1MCAxNDcgMTc1IDc2IDIyNyAxOTYgMTEyIDEyNCAyNTUgOTcgMSA5MyAxNzEgMTA5IDEzMiAxNDYgNzUgMjAxIDIxMCAKKzg0IDE0OSAyMTUgMTM5IDIxMCAxNTggMzggMTUzIDE0IDEzMyAxMDkgMTUyIDE1NiAyNDggMjMyIDkgMTgzIDI0MCAyMzYgNTAgMTY3IAorMTcgMTQ4IDE1OCAxNjMgOTMgMyA4IDMyIDEwMyA4IDIwMCAyMDQgMTA4IDMyIDkgNTggODkgMjQ3IDE3NSAyNDQgNjYgODUgMTU1IDE5MSAKKzI1NiAxNTQgMjM5IDIxMCAxMTUgMTM5IDQyIDEwOCAyMDAgMTEwIDIwOSAxMzIgMTAzIDE3NiAzOSA0MiAxNTEgOTkgMTAgMTE1IDY1IAorMTAyIDExOSA2MyAxODcgMjU4IDY5IDEwMCAyMDQgMjAyIDE5MyAxNzEgMTUgMjMzIDM1IDExOCA2IDIxMSAxNDEgMTI1IDcwIDgzIDI5IAorNjggNjcgMTg1IDgxIDE1NyAxMDYgMTE3IDE0OCA2NCAyIDE5MyA0NiA3NSAzMyAxNjAgMjQ2IDU1IDk3IDEzOCAxNTMgMTgyIDE4MyAKKzI2MCAxOTUgMjIzIDE5OCAyNyAyNDcgMzggMTg0IDU1IDIyMiA3OCAxNDIgNTcgMTA2IDIxMSA0NyAyMjYgMTcwIDEyNiA5NiAxOCA2IAorNDMgNDAgMjUgMjM4IDIyNyAyOCAxMSAyMzUgMjEyIDMwIDM2IDE5NSAyNTQgMjM5IDExNiAxNjUgMjggODUgMTc1IDE1MCAxNjcgMTg1IAorMjQ5IDI1OCAyMDYgMTYwIDIxNSA2NSA4IDIyMCAxNjMgMTkgNjMgMTkgMTU3IDE4MCA1NyAxMzcgMjAxIDEzNiAxNDQgMTYwIDc4IDIxNiAKKzI1OSA5NSA4NiAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMTE3IDc0IDEyNCAxMyA1NiAxNzQgMTI0IDE4MSAxNTcgMTIgMjE4IDI0OCAxNTggCis2OSAxOTQgMTAzIDUxIDk5IDUzIDE0IDE3NiA1OSA1MiA2MiAxMzAgMjAgMjE0IDE1NiAxMjMgMzAgMjAgNDYgMTA2IDIzIDI0OSAxNjQgCis0NSA0OSA0NyAxMzIgOSAxNSAxMzkgMTM2IDcgMTAwIDE2IDkxIDE4MiA0NiAxNDkgMTg0IDk4IDEyMSAyNDAgNDggMjUyIDE1NiAxNTQgCis3MSAxMDkgMjI2IDk2IDE4NiAxMDcgMTQzIDEzNCA5MiAxODggMjIgNCAxMjggMTc5IDI0MiAxNTEgMTczIDE2MSAxMDQgMjAyIDI1IDcwIAorMTI2IDE5MCAxNzkgMTY4IDIxMSAyMzUgMjQgMTgxIDI1MSAxNzMgNjcgMjA1IDQwIDY4IDEzNyAxMjcgMTk2IDIwNiAyMyAxNTUgMyAKKzE0NSA5MiAxMTQgODIgNjYgMjUzIDI1NiAyOSAzNyAyMjEgMTg5IDUgOTEgMjU2IDE5NyAxMzggNTkgMjEgNzIgNDEgNTEgMjI0IDI1NSAKKzMgMTAyIDE5MyAzIDE3NiAxMzMgMjAzIDUxIDU2IDE1NCAxNjUgOCAxMjYgMiAxMTkgMTU3IDg2IDEwNyAyMzcgMzMgMjAzIDE0NSAyMTcgCis1NCA3MSAyMDMgMTI1IDIwNyAxNDMgNDAgMTkzIDc3IDExNiAxMjIgNzggMjM2IDcgNiAxMTcgMjQyIDIyNSAxMTMgMTUwIDI0MSAxMjUgCisyMzggMTMzIDEyOSAxMTEgNjcgMTcgMjQyIDU3IDEyIDUwIDE0NyA3IDIzNyAxMjcgMTUzIDQ1IDEyMyAxOTggMTIxIDE0NiAxNDkgOTAgCisxOTkgMjIxIDIxIDE2NiAyMDIgMTYyIDEzMCAxODggNTMgNDUgMjE3IDE0OCAyMzIgNTIgODIgMTQwIDE0MiAyNDUgMTY2IDIyMiAxNzIgCis0MSAyMTkgNjMgOTMgOTcgMTY5IDE5NCA5IDE1MiAyNTAgMTQ3IDEzMiAxNzcgNjUgMjggMTc5IDc0IDUwIDczIDExOCAzNyAyMDEgMjMwIAorOTQgNjAgMjQ2IDE0OSA0NyAzOCAxMTAgMTE1IDIzMyAyMDMgMjE5IDEwNiA0MyAyMDggNzUgNzYgNTkgOTUgMTIgMzAgMTg4IDk2IDIwNiAKKzExNyA1NCAxNjUgMTAyIDI1IDE2NCA3NiAzOSAxMzYgMTAxIDI2MSAxNzggNDggNjQgNDUgMTQzIDIwOCAzMiAxNzcgMTU5IDE4OSA3OSAKKzMxIDI0NSAxMjMgNjEgMTAgMTM1IDI0IDEzIDE1MCA3MyAyNCA4NyA5MCA2MiAxNjEgMTAgNDEgMTI1IDIwOSBeCis1NDIgMSAyNDQgMTM2IDIzMiAxNDAgNjIgMTIyIDEwNSA5MSAxNTggMzAgMjcgMTUxIDgyIDE2IDk0IDIzIDc5IDE5OSA4NCAyMjEgOTggCisxMjggODEgNzcgMjQ3IDEgMTcgNDggMjU5IDI2MSAxODcgNjYgMjE2IDg3IDc1IDY4IDE0MiAyMzAgMjI1IDIwMyAxMzAgMTggMzUgMjcgCisxMjUgMjAxIDIyNiAxNzkgMTQyIDI1MiA2MCAyNTUgMTY3IDE0NiA4MiA0MiAyMzkgNzcgMjU4IDIxIDExNiA5NiAxOTEgMTIzIDMzIAorMTIzIDIyIDEwMyAxMjggNTUgMTk2IDE5MyA4NiAxMzYgMTYgMTIwIDE2OCAxMzMgMTE0IDE3MCA0OCAyMzcgMTYyIDEzNSAyOSAyOSA0MCAKKzYwIDIxOCAyIDE5OCAxMTkgMjI5IDIyIDkyIDEwOCAxNjEgMTQ4IDIwMiAxNjUgMjYgMTY0IDUwIDE1MiA4MCAxMjcgMTE2IDg1IDE3MSAKKzI0IDQ0IDE5MSAxNjAgMTk4IDcxIDI0OSAxODAgMTQwIDk5IDgyIDUzIDU0IDIzNSA0MiAxMiAzNyAyMDYgMjQ4IDE5MyA0OSAxNzYgOSAKKzE1NyA5MSAxODAgMTI5IDIwIDE4OCA1IDYzIDEwOSAxMzcgMjE5IDIzMSAxOTAgMTk1IDEgMjU5IDggMjA3IDIyNCAxOSAyMDEgMjM3IAorMTk5IDM2IDI0MSAyNTYgMTE3IDcyIDIwMyAxNTIgNTggODcgNjQgNDggMjQ4IDI0MSAyOSA3NyAyMCAxNjYgMjI5IDExIDcyIDIxNCAKKzE3MiAyMTYgNzYgNTUgMTc0IDk0IDM0IDk5IDkzIDczIDE1MyAxOSAyMzggMTM4IDE0NyAyNjMgNTQgNCAxMDIgMTYzIDYzIDEyMCAxNTcgCisxMTMgMjIwIDE4MSA1NyAxMTEgNTIgNzggMjIzIDEzIDI1MSA3MyAxNjQgMzkgMTMyIDE4NiAxMzggMTg0IDIyMyA2MSAxNzIgMTc5IAorMTc1IDEwNyA2IDE3IDgxIDExNCAyMDcgMjEzIDE4NSAxMjUgMjEyIDI0NiA3MyAxOTAgMTg0IDE4NiAxMDEgMjI0IDExIDk4IDk1IDIyNiAKKzEzMSAyMjEgMTQ2IDQ5IDE4NyA4OCA1MSAxMzkgMTEyIDI1NSAxODkgMjQ1IDc1IDc5IDE2MiAxMjQgOSAxMzUgNTEgMTI4IDkyIDk3IAorMTQxIDQ5IDIxMyAyMzMgMTA1IDU0IDI1NyA4MiA2NCA3NCAxMjkgMzEgMjA4IDE2MyAxMTEgNDEgNTggNjUgMjQgMjYwIDIxMSA1NCAKKzI0NiA2MiAxNzAgMjYgMTk3IDE2OSA5OCAxMDYgNDEgMjUgMjEwIDc4IDIzNCA5MiAxNDUgMTIxIDE1NSAxNjUgMjQyIDI0MyAyMDggCisyMDAgMTIgNDggMjEgMTQyIDI0MSA0MCA5NyAxNzggMjE0IDE2MSAxOTYgMTgyIDcgMjQyIDIzMiAxMjkgNDIgMjMgNTcgMTAwIDMyIAorMTg0IDE3NSA4MSA2NiAyMjcgMTA3IDIzMyAxMTYgNzQgMTUxIDEzMCAyNjAgMjAwIDM0IDg4IDE0IDE3OSAxNjQgMjggMTEyIDI4IDkwIAorMTkzIDM4IDE1NiAxMTUgMTA5IDE1OSAyNTkgMTkgMjI3IDExOCAyNTMgMTAgMTIyIDgzIDI1NiAxMDYgMjU3IDEwNCAxMDQgMTI2IDE2NiAKKzIxOCAyNTUgMTc4IDIyNSAxODEgOTAgMjMwIDI2MiAxMDQgNzggMTg2IDExMiAzOSAxMTAgODcgODYgMTQ3IDM2IDE0IDIxNiA2NSAzNSAKKzc1IDEwNSA0MyAxNzggMTg4IDE2IDgzIDMgMTg1IDE1MSA5MyA5NSAyNTIgNzEgMTEgNjEgMTk0IDE0IDE2OCAxNDQgMTM0IDY0IDM3IAorMjI4IDgzIDI0NSA4NiA5OSA1NiAxNzIgMjA1IDU2IDE2MSAxODUgMTYyIDExMyAxOTQgMzYgMyAxMzcgMTcxIDI1MSA4NCAxODQgMTk3IAorMTIxIDExOCAzMCAxNiAxMzEgMTg4IDI3IDE2MiAxNjEgMTc0IDE0MiAxNCAyMDUgNDUgMTQxIDI3IDExNCAxODEgNjggMTMxIDIxMCA2NyAKKzE1NSAxOTggOTcgMTMwIDIzNCA1NSAxODUgMTczIDE5MiA4OCAyNSAxOTkgNTggNzYgNDQgMTU0IDIwMCAyNTAgMTA4IDE3MiAyMjcgOTYgCisyMTMgMjIyIDg1IDE2MCAyMDkgMTUwIDE0MyAxNjkgNzIgMjI1IDE5MiAxMTAgMTI0IDI1MSA5NSAyNjMgOTEgMTY5IDEwOSAxMjYgMTQwIAorNzMgMjAxIDIwNCA4MCAxNDkgMjE1IDEzNyAyMDggMTUyIDMyIDE0NyAxMCAxMzMgMTAzIDE1MCAxNTQgMjQ4IDIzMCA5IDE4MyAyMzYgCisyMzQgNDQgMTY1IDE1IDE0NCAxNTYgMTYzIDg5IDEgNiAyOCAxMDEgOCAxOTYgMjA0IDEwNiAxNjQgXgorNTY3IDAgMSA0NiA4OSAyMzkgMTY3IDIzNiA2MiA4NSAxNDMgMTg3IDI1NiAxNTQgMjM1IDIxMCAxMTUgMTMxIDM4IDEwOCAxOTYgMTA2IAorMjA5IDEyNCAxMDMgMTc2IDMxIDM0IDEzOSA5MSAxMCAxMDcgNjEgOTQgMTE1IDU5IDE3OSAyNTggNjkgOTIgMjAwIDIwMiAxODkgMTcxIAorMTEgMjI1IDMxIDEwNiAyNjQgMjA3IDEzNyAxMjEgNzAgODMgMjkgNjQgNjcgMTc3IDc3IDE0NSAxMDIgMTEzIDE0NCA1NiAyIDE4MSAzNCAKKzY3IDMzIDE2MCAyNDYgNDcgODUgMTI2IDE0NSAxNzQgMTcxIDI2MCAxODMgMjE1IDE5MCAyMyAyNDcgMzggMTgwIDU1IDIyMiA3MCAxMzggCis0NSA5OCAyMTEgMzkgMjI2IDE2NiAxMTggOTIgNiAyNjAgMzkgMzIgMjUgMjM0IDIxOSAyMCAzIDIyNyAyMTIgMzAgMjU0IDI4IDE5NSAKKzI1NCAyMzkgMTEyIDE1MyAyOCA3MyAxNzEgMTM4IDE2NyAxODEgMjQ1IDI1MCAxOTggMTQ4IDIwNyA2NSAyNjIgMjIwIDE1NSAxNSA1NSAKKzExIDE1MyAxNzIgNTcgMTM3IDE5MyAxMjggMTMyIDE1NiA3OCAyMDggMjU1IDkxIDgyIDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAxMDUgNzQgCisxMTIgOSA0NCAxNzQgMTE2IDE3NyAxNDkgNCAyMTggMjQwIDE1OCA2NSAxOTAgOTUgMzkgODcgNDEgMiAxNjQgNTkgNTIgNTAgMTE4IDIwIAorMjE0IDE0NCAxMTEgMTggMTYgNDYgMTA2IDE1IDI0OSAxNTIgMzcgNDUgNDMgMTI4IDUgMTUgMTI3IDEzNiAzIDEwMCA0IDc5IDE4MiA0MiAKKzEzNyAxNzYgODYgMTE3IDI0MCAzNiAyNDggMTU2IDE1MCA2NyAxMDUgMjE4IDk2IDE3NCA5OSAxMzUgMTM0IDg4IDE3NiAxNCAyNTggCisxMjQgMTc1IDIzNCAxNDcgMTYxIDE1MyAxMDAgMTk4IDIxIDY2IDExNCAxOTAgMTY3IDE2NCAyMDMgMjM1IDE2IDE3MyAyNDcgMTY1IDU1IAorMjA1IDI4IDU2IDEyOSAxMjMgMTg0IDIwNiAxOSAxNTEgMjU3IDEzMyA4MCAxMDYgNzAgNjYgMjUzIDI0OCAxNyAyNSAyMTcgMTc3IDUgCis4NyAyNTIgMTg1IDEzMCA0NyAxMyA2OCAyOSA0NyAyMjQgMjUxIDI2MSAxMDIgMTg1IDMgMTcyIDEyOSAxOTUgNDMgNTYgMTQ2IDE2NSAKKzEyMiAyNjAgMTExIDE1NyA3NCA5NSAyMzMgMjkgMTkxIDE0MSAyMTcgNTAgNjMgMjAzIDExMyAxOTkgMTM5IDM2IDE5MyA3MyAxMTYgCisxMjIgNjYgMjM2IDcgMiAxMDkgMjQyIDIxNyAxMDUgMTQ2IDIzNyAxMjUgMjM4IDEyMSAxMjUgOTkgNjMgOSAyMzggNDkgNTAgMTM1IAorMjYxIDIyOSAxMjcgMTUzIDQ1IDExNSAxODYgMTIxIDE0MiAxNDEgNzggMTkxIDIxMyA5IDE2NiAxOTAgMTUwIDEyMiAxODggNTMgNDEgCisyMTMgMTQ4IDIyNCA0MCA3OCAxMzYgMTMwIDI0MSAxNTQgMjE4IDE2OCAzMyAyMTUgNjMgODEgOTcgMTY1IDE5NCAyNjMgMTQ0IDI1MCAKKzE0MyAxMzIgMTczIDUzIDI0IDE3MSA2NiA0MiA2NSAxMTggMzcgMTg5IDIyNiA5NCA2MCAyNDIgMTQ1IDQ3IDMwIDExMCAxMTEgMjI5IAorMTk5IDIxMSA5NCA0MyAyMDAgNjMgNjQgNTUgODMgMTIgMjIgMTg0IDg0IDIwMiAxMTcgNDYgMTYxIDk4IDE3IDE2NCA3NiAyNyAxMzIgCisxMDEgMjYxIDE3NCA0NCA1MiAzMyAxNDMgMjA0IDMyIDE2OSAxNTEgMTg1IDc1IDMxIDI0NSAxMjMgNTcgMjY0IDEzNSAxMiA1IDE0MiAKKzY5IDIwIDc1IDg2IDYyIDE1NyAyIDM3IDExNyAxMDEgMjQ0IDEzMiAyMjggMTM2IDU4IDExNiAxMDUgOTEgMTU0IDI0IDI3IDE0OSA3NiAKKzEwIDkwIDE5IDc5IDE5OSA4NCAyMTkgOTIgMTI4IDc3IDczIDI0MyAyNjMgMTcgNDIgMjU5IDI1OSAxODcgNjIgMjEyIDg1IDcxIDYyIAorMTQwIDIyNiAyMjEgMjAxIDEyNiAxOCAzMyAyMSAxMjEgMTk3IDIyNCAxNzkgMTM2IDI1MiA1OCAyNTUgMTYzIDE0MCA4MiAzOCAyMzUgCis3MSAyNTYgMTUgMTEwIDk0IDE4NyAxMTcgMjkgMTE5IDE2IDEwMSAxMjIgNDkgMTk0IDE5MSA4NiAxMzQgMTYgMTE4IDE2NCAxMzEgMTEwIAorMTY2IDQ2IDIzMyAxNTYgMTMzIDI1IDIzIDM2IDU0IDIxNCAxOTQgMTE5IDIyNyAxOCA4OCAxMDQgMTU1IDE0MiAxOTYgMTYxIDI2IDE1OCAKKzQ4IDE0OCA4MCAxMjMgMTEyIDgxIDE2OSAyNCA0NCAxOTEgMTU4IDE5MiA2NSAyNDUgMTc4IDE0MCAyMjMgXgorNTUxIDEgNzggNDkgNTQgMjI3IDQyIDggMzMgMTk4IDI0MCAxODEgNDEgMTY0IDI2NSAxNTMgODMgMTgwIDEyNSA4IDE4NCAyNjEgNTUgCisxMDUgMTI5IDIxOSAyMzEgMTgyIDE5MSAxIDI1NSA0IDIwMyAyMjAgMjY0IDcgMTg5IDIzNyAxOTUgMjQgMjMzIDI0OCAxMDkgNzIgMTkxIAorMTUyIDUwIDg3IDUyIDQwIDI0NCAyNDEgMjUgNzcgMTYgMTU0IDIyOSAyNjcgNjggMjA2IDE2OCAyMTIgNjggNTEgMTYyIDgyIDMwIDk1IAorOTMgNjUgMTQxIDE1IDIzNCAxMzAgMTM5IDI1NSA0MiA0IDkwIDE1MSA1MSAxMjAgMTQ1IDExMyAyMTIgMTgxIDQ1IDEwNyA0NCA3NCAKKzIxOSAxIDI1MSA2MSAxNTYgMzEgMTI4IDE4NiAxMzggMTg0IDIyMyA2MSAxNjAgMTY3IDE3NSAxMDcgNiA1IDgxIDExNCAyMDcgMjA1IAorMTczIDExMyAyMDggMjM4IDczIDE4NiAxNzYgMTc4IDkzIDIxNiAxMSA5OCA4MyAyMTggMTE5IDIyMSAxNDYgMzcgMTc5IDg4IDQ3IDEzOSAKKzEwNCAyNDcgMTg5IDI0MSA2MyA3MSAxNTQgMTE2IDUgMTIzIDUxIDEyNCA4OCA4NSAxMzMgNDkgMjA5IDIzMyA5NyA0NiAyNTcgNzQgNjQgCis3MCAxMjEgMjMgMjAwIDE1NSAxMTEgMjkgNTggNTcgMjAgMjUyIDIwNyA1MCAyNDIgNTggMTcwIDE0IDE5NyAxNjkgOTQgOTggNDEgMTMgCisyMDIgNzAgMjM0IDkyIDE0NSAxMTcgMTU1IDE1MyAyMzQgMjQzIDIwOCAyMDAgNCA0OCAyMSAxMzQgMjM3IDQwIDkzIDE3OCAyMTAgMTUzIAorMTk2IDE3NCAyNjMgMjM4IDIyOCAxMTcgMzggMjMgNDkgOTIgMjggMTgwIDE2MyA3NyA1NCAyMjMgOTkgMjI5IDExMiA2MiAxNTEgMTMwIAorMjU2IDE5MiAzNCA4MCAyIDE3MSAxNjAgMTYgMTEyIDI0IDgyIDE4NSAyNiAxNDggMTAzIDk3IDE1OSAyNTEgMTkgMjE5IDExNCAyNDUgNiAKKzExOCA3NSAyNTIgOTQgMjQ5IDEwNCA5NiAxMjYgMTU4IDIxNCAyNTEgMTc0IDIyNSAxNjkgOTAgMjMwIDI2MiA5MiA2NiAxNzQgMTA4IAorMzkgOTggNzkgODIgMTQ3IDMyIDEwIDIxNiA1MyAzNSA3NSAxMDEgMzEgMTY2IDE4MCA4IDcxIDI2NyAxODUgMTQzIDg1IDk1IDI0OCA3MSAKKzMgNTMgMTkwIDYgMTU2IDE0NCAxMjIgNTYgMjUgMjI4IDc5IDIzNyA3OCA4NyA0OCAxNzIgMTk3IDUyIDE1NyAxODEgMTU4IDEwMSAxODIgCiszNiAyNjMgMTI1IDE1OSAyNDcgNzYgMTcyIDE5MyAxMDkgMTEwIDI2MCAyMiAxMiAxMzEgMTc2IDIzIDE2MiAxNjEgMTY2IDE0MiAxNCAKKzIwMSAzNyAxNDEgMTkgMTAyIDE3NyA2MCAxMjMgMjA2IDU1IDE0MyAxOTggODkgMTE4IDIyNiA0NyAxNzcgMTczIDE5MiA3NiAxNyAxODcgCis1NCA3MiAzNiAxNDYgMTg4IDI0MiA5NiAxNjQgMjI3IDg0IDIxMyAyMTggODEgMTUyIDIwMSAxNTAgMTM1IDE1NyA2NCAyMjEgMTg0IAorMTA2IDEyNCAyNDMgOTEgMjYzIDg3IDE2NSAxMDkgMTE0IDEyOCA2OSAyMDEgMTkyIDcyIDE0OSAyMTUgMTMzIDIwNCAxNDAgMjAgMTM1IAorMiAxMzMgOTEgMTQ2IDE1MCAyNDggMjI2IDkgMTgzIDIyOCAyMzAgMzIgMTYxIDExIDEzNiAxNTIgMTYzIDgxIDI2NSAyIDIwIDk3IDggCisxODggMjA0IDEwMiAyNiAyNjUgNDAgODkgMjM1IDE2MyAyMzIgNjAgODUgMTM3IDE4NSAyNTYgMTU0IDIzMyAyMTAgMTE1IDEyNyAzNiAKKzEwOCAxOTQgMTA0IDIwOSAxMjAgMTAzIDE3NiAyNyAzMCAxMzMgODcgMTAgMTAzIDU5IDkwIDExMyA1NyAxNzUgMjU4IDY5IDg4IDE5OCAKKzIwMiAxODcgMTcxIDkgMjIxIDI5IDEwMCAyNjIgMjA1IDEzNSAxMTkgNzAgODMgMjkgNjIgNjcgMTczIDc1IDEzOSAxMDAgMTExIDE0MiAKKzUyIDIgMTc1IDI4IDYzIDMzIDE2MCAyNDYgNDMgNzkgMTIwIDE0MSAxNzAgMTY1IDI2MCAxNzcgMjExIDE4NiAyMSAyNDcgMzggMTc4IAorNTUgMjIyIDY2IDEzNiAzOSA5NCAyMTEgMzUgMjI2IDE2NCAxMTQgOTAgMjU2IDM3IDI4IDI1IDIzMiAyMTUgMTYgMjY3IDIyMyAyMTIgCiszMCAyNTAgMjQgMTk1IDI1NCAyMzkgMTEwIDE0NyAyOCA2NyAxNjkgMTMyIDE2NyAxNzkgMjQzIDI0NiAxOTQgMTQyIDIwMyA2NSAyNjMgXgorNTc4IDAgMjIwIDE0NyAxMSA0NyAzIDE0OSAxNjQgNTcgMTM3IDE4NSAxMjAgMTIwIDE1MiA3OCAyMDAgMjUxIDg3IDc4IDIzMiAxNzcgCisyMiAxMjkgNjggMTY4IDkzIDc0IDEwMCA1IDMyIDE3NCAxMDggMTczIDE0MSAyNjYgMjE4IDIzMiAxNTggNjEgMTg2IDg3IDI3IDc1IDI5IAorMjYwIDE1MiA1OSA1MiAzOCAxMDYgMjAgMjE0IDEzMiA5OSA2IDEyIDQ2IDEwNiA3IDI0OSAxNDAgMjkgNDEgMzkgMTI0IDEgMTUgMTE1IAorMTM2IDI2OSAxMDAgMjYyIDY3IDE4MiAzOCAxMjUgMTY4IDc0IDExMyAyNDAgMjQgMjQ0IDE1NiAxNDYgNjMgMTAxIDIxMCA5NiAxNjIgCis5MSAxMjcgMTM0IDg0IDE2NCA2IDI1MCAxMjAgMTcxIDIyNiAxNDMgMTQ5IDE0NSA5NiAxOTQgMTcgNjIgMTAyIDE5MCAxNTUgMTYwIAorMTk1IDIzNSA4IDE2NSAyNDMgMTU3IDQzIDIwNSAxNiA0NCAxMjEgMTE5IDE3MiAyMDYgMTUgMTQ3IDI0OSAxMjEgNjggOTggNTggNjYgCisyNTMgMjQwIDUgMTMgMjEzIDE2NSA1IDgzIDI0OCAxNzMgMTIyIDM1IDUgNjQgMTcgNDMgMjI0IDI0NyAyNTcgMTAyIDE3NyAzIDE2OCAKKzEyNSAxODcgMzUgNTYgMTM4IDE2NSAyNjIgMTE4IDI1NiAxMDMgMTU3IDYyIDgzIDIyOSAyNSAxNzkgMTM3IDIxNyA0NiA1NSAyMDMgCisxMDEgMTkxIDEzNSAzMiAxOTMgNjkgMTE2IDEyMiA1NCAyMzYgNyAyNjggMTAxIDI0MiAyMDkgOTcgMTQyIDIzMyAxMjUgMjM4IDEwOSAKKzEyMSA4NyA1OSAxIDIzNCA0MSAyNTggNTAgMTIzIDI1MyAyMjEgMTI3IDE1MyA0NSAxMDcgMTc0IDEyMSAxMzggMTMzIDY2IDE4MyAyMDUgCisyNjcgMTY2IDE3OCAxMzggMTE0IDE4OCA1MyAzNyAyMDkgMTQ4IDIxNiAyOCA3NCAxMzIgMTE4IDIzNyAxNDIgMjE0IDE2NCAyNSAyMTEgCis2MyA2OSA5NyAxNjEgMTk0IDI1NSAxMzYgMjUwIDEzOSAxMzIgMTY5IDQxIDIwIDE2MyA1OCAzNCA1NyAxMTggMzcgMTc3IDIyMiA5NCAKKzYwIDIzOCAxNDEgNDcgMjIgMTEwIDEwNyAyMjUgMTk1IDIwMyA4MiA0MyAxOTIgNTEgNTIgNTEgNzEgMTIgMTQgMTgwIDcyIDE5OCAxMTcgCiszOCAxNTcgOTQgOSAxNjQgNzYgMTUgMTI4IDEwMSAyNjEgMTcwIDQwIDQwIDIxIDE0MyAyMDAgMzIgMTYxIDE0MyAxODEgNzEgMzEgMjQ1IAorMTIzIDUzIDI1NiAxMzUgMjY3IDEzNCA2NSAxNiA2MyA4MiA2MiAxNTMgMjY0IDMzIDEwOSA4OSAyNDQgMTI0IDIyMCAxMjggNTAgMTA0IAorMTA1IDkxIDE0NiAxMiAyNyAxNDUgNjQgMjY4IDgyIDExIDc5IDE5OSA4NCAyMTUgODAgMTI4IDY5IDY1IDIzNSAyNTkgMTcgMzAgMjU5IAorMjU1IDE4NyA1NCAyMDQgODEgNjMgNTAgMTM2IDIxOCAyMTMgMTk3IDExOCAxOCAyOSA5IDExMyAxODkgMjIwIDE3OSAxMjQgMjUyIDU0IAorMjU1IDE1NSAxMjggODIgMzAgMjI3IDU5IDI1MiAzIDk4IDkwIDE3OSAxMDUgMjEgMTExIDQgOTcgMTEwIDM3IDE5MCAxODcgODYgMTMwIAorMTYgMTE0IDE1NiAxMjcgMTAyIDE1OCA0MiAyMjUgMTQ0IDEyOSAxNyAxMSAyOCA0MiAyMDYgMjY2IDE4NiAxMTkgMjIzIDEwIDgwIDk2IAorMTQzIDEzMCAxODQgMTUzIDI2IDE0NiA0NCAxNDAgODAgMTE1IDEwNCA3MyAxNjUgMjQgNDQgMTkxIDE1NCAxODAgNTMgMjM3IDE3NCAKKzE0MCA5OSA3NiA0NyA1NCAyMjMgNDIgNiAzMSAxOTQgMjM2IDE3NSAzNyAxNTggMjYxIDE1MSA3OSAxODAgMTIzIDIgMTgyIDI1NyA1MSAKKzEwMyAxMjUgMjE5IDIzMSAxNzggMTg5IDEgMjUzIDIgMjAxIDIxOCAyNjQgMSAxODMgMjM3IDE5MyAxOCAyMjkgMjQ0IDEwNSA3MiAxODUgCisxNTIgNDYgODcgNDYgMzYgMjQyIDI0MSAyMyA3NyAxNCAxNDggMjI5IDI2MyA2NiAyMDIgMTY2IDIxMCA2NCA0OSAxNTYgNzYgMjggOTMgCis5MyA2MSAxMzUgMTMgMjMyIDEyNiAxMzUgMjUxIDM2IDQgODQgMTQ1IDQ1IDEyMCAxMzkgMTEzIDIwOCAxODEgMzkgMTA1IDQwIDcyIAorMjE3IDI2NSAyNTEgNTUgMTUyIDI3IDEyNiAxODYgMTM4IDE4NCAyMjMgNjEgMTU0IDE2MSAxNzUgMTA3IDYgMjY5IDgxIDExNCAyMDcgCisyMDEgMTY3IDEwNyAyMDYgMjM0IDczIDE4NCAxNzIgMTc0IDg5IDIxMiAxMSA5OCA3NyAyMTQgMTEzIDIyMSAxNDYgMzEgMTc1IDg4IDQ1IAorMTM5IDEwMCAyNDMgMTg5IDIxMyBeCis1NzggMSA1MSA2MyAxNDYgMTA4IDEgMTExIDUxIDEyMCA4NCA3MyAxMjUgNDkgMjA1IDIzMyA4OSAzOCAyNTcgNjYgNjQgNjYgMTEzIDE1IAorMTkyIDE0NyAxMTEgMTcgNTggNDkgMTYgMjQ0IDIwMyA0NiAyMzggNTQgMTcwIDIgMTk3IDE2OSA5MCA5MCA0MSAxIDE5NCA2MiAyMzQgCis5MiAxNDUgMTEzIDE1NSAxNDEgMjI2IDI0MyAyMDggMjAwIDI2OCA0OCAyMSAxMjYgMjMzIDQwIDg5IDE3OCAyMDYgMTQ1IDE5NiAxNjYgCisyNTUgMjM0IDIyNCAxMDUgMzQgMjMgNDEgODQgMjQgMTc2IDE1MSA3MyA0MiAyMTkgOTEgMjI1IDEwOCA1MCAxNTEgMTMwIDI1MiAxODQgCiszNCA3MiAyNjIgMTYzIDE1NiA0IDExMiAyMCA3NCAxNzcgMTQgMTQwIDkxIDg1IDE1OSAyNDMgMTkgMjExIDExMCAyMzcgMiAxMTQgNjcgCisyNDggODIgMjQxIDEwNCA4OCAxMjYgMTUwIDIxMCAyNDcgMTcwIDIyNSAxNTcgOTAgMjMwIDI2MiA4MCA1NCAxNjIgMTA0IDM5IDg2IDcxIAorNzggMTQ3IDI4IDYgMjE2IDQxIDM1IDc1IDk3IDE5IDE1NCAxNzIgNTkgMjY3IDE4NSAxMzUgNzcgOTUgMjQ0IDcxIDI2NyA0NSAxODYgCisyNzAgMTQ0IDE0NCAxMTAgNDggMTMgMjI4IDc1IDIyOSA3MCA3NSA0MCAxNzIgMTg5IDQ4IDE1MyAxNzcgMTU0IDg5IDE3MCAzNiAyNTkgCisxMTMgMTQ3IDI0MyA2OCAxNjAgMTg5IDk3IDEwMiAyNTYgMTQgOCAxMzEgMTY0IDE5IDE2MiAxNjEgMTU4IDE0MiAxNCAxOTcgMjkgMTQxIAorMTEgOTAgMTczIDUyIDExNSAyMDIgNDMgMTMxIDE5OCA4MSAxMDYgMjE4IDM5IDE2OSAxNzMgMTkyIDY0IDkgMTc1IDUwIDY4IDI4IDEzOCAKKzE3NiAyMzQgODQgMTU2IDIyNyA3MiAyMTMgMjE0IDc3IDE0NCAxOTMgMTUwIDEyNyAxNDUgNTYgMjE3IDE3NiAxMDIgMTI0IDIzNSA4NyAKKzI2MyA4MyAxNjEgMTA5IDEwMiAxMTYgNjUgMjAxIDE4MCA2NCAxNDkgMjE1IDEyOSAyMDAgMTI4IDggMTIzIDI2NiAxMzMgNzkgMTQyIAorMTQ2IDI0OCAyMjIgOSAxODMgMjIwIDIyNiAyMCAxNTcgNyAxMjggMTQ4IDE2MyA3MyAyNjUgMjcwIDEyIDkzIDggMTgwIDIwNCA5OCAyMiAKKzI2MSAyOCA4OSAyMjcgMTU1IDIyNCA1NiA4NSAxMjUgMTgxIDI1NiAxNTQgMjI5IDIxMCAxMTUgMTE5IDMyIDEwOCAxOTAgMTAwIDIwOSAKKzExMiAxMDMgMTc2IDE5IDIyIDEyMSA3OSAxMCA5NSA1NSA4MiAxMDkgNTMgMTY3IDI1OCA2OSA4MCAxOTQgMjAyIDE4MyAxNzEgNSAyMTMgCisyNSA4OCAyNTggMjAxIDEzMSAxMTUgNzAgODMgMjkgNTggNjcgMTY1IDcxIDEyNyA5NiAxMDcgMTM4IDQ0IDIgMTYzIDE2IDU1IDMzIAorMTYwIDI0NiAzNSA2NyAxMDggMTMzIDE2MiAxNTMgMjYwIDE2NSAyMDMgMTc4IDE3IDI0NyAzOCAxNzQgNTUgMjIyIDU4IDEzMiAyNyA4NiAKKzIxMSAyNyAyMjYgMTYwIDEwNiA4NiAyNjAgMjQ4IDMzIDIwIDI1IDIyOCAyMDcgOCAyNjMgMjE1IDIxMiAzMCAyNDIgMTYgMTk1IDI1NCAKKzIzOSAxMDYgMTM1IDI4IDU1IDE2NSAxMjAgMTY3IDE3NSAyMzkgMjM4IDE4NiAxMzAgMTk1IDY1IDI1MCAyMjAgMTQzIDkgNDMgMjcxIAorMTQ3IDE2MCA1NyAxMzcgMTgxIDExNiAxMTQgMTUwIDc4IDE5NiAyNDkgODUgNzYgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDg3IDc0IDk0IAorMyAyNiAxNzQgMTA0IDE3MSAxMzcgMjY0IDIxOCAyMjggMTU4IDU5IDE4NCA4MyAyMSA2OSAyMyAyNTYgMTQ2IDU5IDUyIDMyIDEwMCAyMCAKKzIxNCAxMjYgOTMgMTAgNDYgMTA2IDMgMjQ5IDEzNCAyNSAzOSAzNyAxMjIgMjcxIDE1IDEwOSAxMzYgMjY5IDEwMCAyNTggNjEgMTgyIAorMzYgMTE5IDE2NCA2OCAxMTEgMjQwIDE4IDI0MiAxNTYgMTQ0IDYxIDk5IDIwNiA5NiAxNTYgODcgMTIzIDEzNCA4MiAxNTggMiAyNDYgCisxMTggMTY5IDIyMiAxNDEgMTQzIDE0MSA5NCAxOTIgMTUgNjAgOTYgMTkwIDE0OSAxNTggMTkxIDIzNSA0IDE2MSAyNDEgMTUzIDM3IAorMjA1IDEwIDM4IDExNyAxMTcgMTY2IDIwNiAxMyAxNDUgMjQ1IDExNSA2MiA5NCA1MiA2NiAyNTMgMjM2IDI3MSA3IDIxMSAxNTkgNSA4MSAKKzI0NiAxNjcgMTE4IDI5IDEgNjIgMTEgNDEgMjI0IDI0NSAyNTUgMTAyIDE3MyAzIDE2NiAxMjMgMTgzIDMxIDU2IDEzNCAxNjUgMjYwIAorMTE2IDI1NCA4MSBeCis1ODMgMSAxNTcgNTAgNzEgMjI1IDIxIDE2NyAxMzMgMjE3IDQyIDQ3IDIwMyA4OSAxODMgMTMxIDI4IDE5MyA2NSAxMTYgMTIyIDQyIAorMjM2IDcgMjY4IDkzIDI0MiAyMDEgODkgMTM4IDIyOSAxMjUgMjM4IDk3IDExNyA3NSA1NSAyNjcgMjMwIDMzIDI1MCA1MCAxMTEgMjQ1IAorMjEzIDEyNyAxNTMgNDUgOTkgMTYyIDEyMSAxMzQgMTI1IDU0IDE3NSAxOTcgMjU5IDE2NiAxNjYgMTI2IDEwNiAxODggNTMgMzMgMjA1IAorMTQ4IDIwOCAxNiA3MCAxMjggMTA2IDIzMyAxMzAgMjEwIDE2MCAxNyAyMDcgNjMgNTcgOTcgMTU3IDE5NCAyNDcgMTI4IDI1MCAxMzUgCisxMzIgMTY1IDI5IDE2IDE1NSA1MCAyNiA0OSAxMTggMzcgMTY1IDIxOCA5NCA2MCAyMzQgMTM3IDQ3IDE0IDExMCAxMDMgMjIxIDE5MSAKKzE5NSA3MCA0MyAxODQgMzkgNDAgNDcgNTkgMTIgNiAxNzYgNjAgMTk0IDExNyAzMCAxNTMgOTAgMSAxNjQgNzYgMyAxMjQgMTAxIDI2MSAKKzE2NiAzNiAyOCA5IDE0MyAxOTYgMzIgMTUzIDEzNSAxNzcgNjcgMzEgMjQ1IDEyMyA0OSAyNDggMTM1IDI2MiAyNjMgMTI2IDYxIDEyIAorNTEgNzggNjIgMTQ5IDI2MCAyOSAxMDEgNzcgMjQ0IDExNiAyMTIgMTIwIDQyIDkyIDEwNSA5MSAxMzggMjcgMTQxIDUyIDI2MCA3NCAzIAorNzkgMTk5IDg0IDIxMSA2OCAxMjggNjEgNTcgMjI3IDI1NSAxNyAxOCAyNTkgMjUxIDE4NyA0NiAxOTYgNzcgNTUgMzggMTMyIDIxMCAKKzIwNSAxOTMgMTEwIDE4IDI1IDI3MSAxMDUgMTgxIDIxNiAxNzkgMTEyIDI1MiA1MCAyNTUgMTQ3IDExNiA4MiAyMiAyMTkgNDcgMjQ4IAorMjY1IDg2IDg2IDE3MSA5MyAxMyAxMDMgMjY2IDkzIDk4IDI1IDE4NiAxODMgODYgMTI2IDE2IDExMCAxNDggMTIzIDk0IDE1MCAzOCAKKzIxNyAxMzIgMTI1IDkgMjczIDIwIDMwIDE5OCAyNjYgMTc4IDExOSAyMTkgMiA3MiA4OCAxMzEgMTE4IDE3MiAxNDUgMjYgMTM0IDQwIAorMTMyIDgwIDEwNyA5NiA2NSAxNjEgMjQgNDQgMTkxIDE1MCAxNjggNDEgMjI5IDE3MCAxNDAgOTkgNzIgNDMgNTQgMjE1IDQyIDIgMjcgCisxODYgMjI4IDE2MyAyOSAxNDYgMjUzIDE0NyA3MSAxODAgMTE5IDI2NCAxNzggMjQ5IDQzIDk5IDExNyAyMTkgMjMxIDE3MCAxODUgMSAKKzI0OSAyNzIgMTk3IDIxNCAyNjQgMjYzIDE3MSAyMzcgMTg5IDYgMjIxIDIzNiA5NyA3MiAxNzMgMTUyIDM4IDg3IDM0IDI4IDIzOCAyNDEgCisxOSA3NyAxMCAxMzYgMjI5IDI1NSA2MiAxOTQgMTYyIDIwNiA1NiA0NSAxNDQgNjQgMjQgODkgOTMgNTMgMTIzIDkgMjI4IDExOCAxMjcgCisyNDMgMjQgNCA3MiAxMzMgMzMgMTIwIDEyNyAxMTMgMjAwIDE4MSAyNyAxMDEgMzIgNjggMjEzIDI1NyAyNTEgNDMgMTQ0IDE5IDEyMiAKKzE4NiAxMzggMTg0IDIyMyA2MSAxNDIgMTQ5IDE3NSAxMDcgNiAyNjEgODEgMTE0IDIwNyAxOTMgMTU1IDk1IDIwMiAyMjYgNzMgMTgwIAorMTY0IDE2NiA4MSAyMDQgMTEgOTggNjUgMjA2IDEwMSAyMjEgMTQ2IDE5IDE2NyA4OCA0MSAxMzkgOTIgMjM1IDE4OSAyMzUgNDUgNTkgCisxNDIgMTA0IDI3MyAxMDUgNTEgMTE4IDgyIDY3IDEyMSA0OSAyMDMgMjMzIDg1IDM0IDI1NyA2MiA2NCA2NCAxMDkgMTEgMTg4IDE0MyAKKzExMSAxMSA1OCA0NSAxNCAyNDAgMjAxIDQ0IDIzNiA1MiAxNzAgMjcwIDE5NyAxNjkgODggODYgNDEgMjY5IDE5MCA1OCAyMzQgOTIgCisxNDUgMTExIDE1NSAxMzUgMjIyIDI0MyAyMDggMjAwIDI2NiA0OCAyMSAxMjIgMjMxIDQwIDg3IDE3OCAyMDQgMTQxIDE5NiAxNjIgMjUxIAorMjMyIDIyMiA5OSAzMiAyMyAzNyA4MCAyMiAxNzQgMTQ1IDcxIDM2IDIxNyA4NyAyMjMgMTA2IDQ0IDE1MSAxMzAgMjUwIDE4MCAzNCA2OCAKKzI1OCAxNTkgMTU0IDI3MiAxMTIgMTggNzAgMTczIDggMTM2IDg1IDc5IDE1OSAyMzkgMTkgMjA3IDEwOCAyMzMgMTEyIDYzIDI0NiA3NiAKKzIzNyAxMDQgODQgMTI2IDE0NiAyMDggMjQ1IDE2OCAyMjUgMTUxIDkwIDIzMCAyNjIgNzQgNDggMTU2IDEwMiAzOSA4MCA2NyA3NiAxNDcgCisyNiA0IDIxNiAzNSAzNSA3NSA5NSAxMyAxNDggMTY4IDI3MCA1MyAyNjcgMTg1IDEzMSA3MyA5NSAyNDIgNzEgMjY1IDQxIDE4NCAyNjggCisxMzggMTQ0IDEwNCA0NCA3IDIyOCA3MyAyMjUgNjYgNjkgMzYgMjcyIF4KKzU4OCAwIDE4MSA0NCAxNDkgMTczIDE1MCA3NyAxNTggMzYgMjU1IDEwMSAxMzUgMjM5IDYwIDE0OCAxODUgODUgOTQgMjUyIDYgNCAxMzEgCisxNTIgMTUgMTYyIDE2MSAxNTAgMTQyIDE0IDE5MyAyMSAxNDEgMyA3OCAxNjkgNDQgMTA3IDE5OCAzMSAxMTkgMTk4IDczIDk0IDIxMCAKKzMxIDE2MSAxNzMgMTkyIDUyIDEgMTYzIDQ2IDY0IDIwIDEzMCAxNjQgMjI2IDcyIDE0OCAyMjcgNjAgMjEzIDIxMCA3MyAxMzYgMTg1IAorMTUwIDExOSAxMzMgNDggMjEzIDE2OCA5OCAxMjQgMjI3IDgzIDI2MyA3OSAxNTcgMTA5IDkwIDEwNCA2MSAyMDEgMTY4IDU2IDE0OSAKKzIxNSAxMjUgMTk2IDExNiAyNzIgMTExIDI2MiAxMzMgNjcgMTM4IDE0MiAyNDggMjE4IDkgMTgzIDIxMiAyMjIgOCAxNTMgMyAxMjAgCisxNDQgMTYzIDY1IDI2NSAyNzAgNCA4OSA4IDE3MiAyMDQgOTQgMTggMjU3IDE2IDg5IDIxOSAxNDcgMjE2IDUyIDg1IDExMyAxNzcgMjU2IAorMTU0IDIyNSAyMTAgMTE1IDExMSAyOCAxMDggMTg2IDk2IDIwOSAxMDQgMTAzIDE3NiAxMSAxNCAxMDkgNzEgMTAgODcgNTEgNzQgMTA1IAorNDkgMTU5IDI1OCA2OSA3MiAxOTAgMjAyIDE3OSAxNzEgMSAyMDUgMjEgNzYgMjU0IDE5NyAxMjcgMTExIDcwIDgzIDI5IDU0IDY3IDE1NyAKKzY3IDExNSA5MiAxMDMgMTM0IDM2IDIgMTUxIDQgNDcgMzMgMTYwIDI0NiAyNyA1NSA5NiAxMjUgMTU0IDE0MSAyNjAgMTUzIDE5NSAxNzAgCisxMyAyNDcgMzggMTcwIDU1IDIyMiA1MCAxMjggMTUgNzggMjExIDE5IDIyNiAxNTYgOTggODIgMjUyIDI0MCAyOSAxMiAyNSAyMjQgMTk5IAorMjU5IDIwNyAyMTIgMzAgMjM0IDggMTk1IDI1NCAyMzkgMTAyIDEyMyAyOCA0MyAxNjEgMTA4IDE2NyAxNzEgMjM1IDIzMCAxNzggMTE4IAorMTg3IDY1IDI0MiAyMjAgMTM1IDUgMzUgMjY3IDE0MyAxNTIgNTcgMTM3IDE3MyAxMDggMTAyIDE0NiA3OCAxODggMjQ1IDgxIDcyIDIzMiAKKzE3NyAyMiAxMjkgNjggMTY4IDc1IDc0IDgyIDI3NSAxNCAxNzQgOTYgMTY3IDEyOSAyNjAgMjE4IDIyMCAxNTggNTUgMTgwIDc1IDkgNTcgCisxMSAyNDggMTM0IDU5IDUyIDIwIDg4IDIwIDIxNCAxMTQgODEgMjY0IDYgNDYgMTA2IDI3MSAyNDkgMTIyIDE3IDM1IDMzIDExOCAyNzEgCisxNSA5NyAxMzYgMjY5IDEwMCAyNTAgNDkgMTgyIDMyIDEwNyAxNTYgNTYgMTA3IDI0MCA2IDIzOCAxNTYgMTQwIDU3IDk1IDE5OCA5NiAKKzE0NCA3OSAxMTUgMTM0IDc4IDE0NiAyNzAgMjM4IDExNCAxNjUgMjE0IDEzNyAxMzEgMTMzIDkwIDE4OCAxMSA1NiA4NCAxOTAgMTM3IAorMTU0IDE4MyAyMzUgMjcyIDE1MyAyMzcgMTQ1IDI1IDIwNSAyNzQgMjYgMTA5IDExMyAxNTQgMjA2IDkgMTQxIDIzNyAxMDMgNTAgODYgCis0MCA2NiAyNTMgMjI4IDI2MyAyNzEgMjA3IDE0NyA1IDc3IDI0MiAxNTUgMTEwIDE3IDI2OSA1OCAyNzUgMzcgMjI0IDI0MSAyNTEgMTAyIAorMTY1IDMgMTYyIDExOSAxNzUgMjMgNTYgMTI2IDE2NSAyNTYgMTEyIDI1MCA5MSAxNTcgNDQgNjUgMjIzIDE5IDE2MSAxMzEgMjE3IDQwIAorNDMgMjAzIDgzIDE3OSAxMjkgMjYgMTkzIDYzIDExNiAxMjIgMzYgMjM2IDcgMjY4IDg5IDI0MiAxOTcgODUgMTM2IDIyNyAxMjUgMjM4IAorOTEgMTE1IDY5IDUzIDI2NSAyMjggMjkgMjQ2IDUwIDEwNSAyNDEgMjA5IDEyNyAxNTMgNDUgOTUgMTU2IDEyMSAxMzIgMTIxIDQ4IDE3MSAKKzE5MyAyNTUgMTY2IDE2MCAxMjAgMTAyIDE4OCA1MyAzMSAyMDMgMTQ4IDIwNCAxMCA2OCAxMjYgMTAwIDIzMSAxMjQgMjA4IDE1OCAxMyAKKzIwNSA2MyA1MSA5NyAxNTUgMTk0IDI0MyAxMjQgMjUwIDEzMyAxMzIgMTYzIDIzIDE0IDE1MSA0NiAyMiA0NSAxMTggMzcgMTU5IDIxNiAKKzk0IDYwIDIzMiAxMzUgNDcgMTAgMTEwIDEwMSAyMTkgMTg5IDE5MSA2NCA0MyAxODAgMzMgMzQgNDUgNTMgMTIgMiAxNzQgNTQgMTkyIAorMTE3IDI2IDE1MSA4OCAyNzMgMTY0IDc2IDI3MyAxMjIgMTAxIDI2MSAxNjQgMzQgMjIgMyAxNDMgMTk0IDMyIDE0OSAxMzEgMTc1IDY1IAorMzEgMjQ1IDEyMyA0NyAyNDQgMTM1IDI1OCAyNjEgMTIyIDU5IDEwIDQ1IDc2IDYyIDE0NyAyNTggMjcgOTcgNzEgMjQ0IDExMiAyMDggCisxMTYgMzggODYgMTA1IDkxIDEzNCAyNzAgMjcgMTM5IDQ2IDI1NiA3MCAyNzUgNzkgMTk5IDE2MCBeCis1OTQgMCAyMDcgNTYgMTI4IDUzIDQ5IDIxOSAyNTEgMTcgNiAyNTkgMjQ3IDE4NyAzOCAxODggNzMgNDcgMjYgMTI4IDIwMiAxOTcgMTg5IAorMTAyIDE4IDIxIDI2MyA5NyAxNzMgMjEyIDE3OSAxMDAgMjUyIDQ2IDI1NSAxMzkgMTA0IDgyIDE0IDIxMSAzNSAyNDQgMjU3IDc0IDgyIAorMTYzIDgxIDUgOTUgMjU4IDg5IDg2IDEzIDE4MiAxNzkgODYgMTIyIDE2IDEwNiAxNDAgMTE5IDg2IDE0MiAzNCAyMDkgMTIwIDEyMSAxIAorMjY1IDEyIDE4IDE5MCAyNjYgMTcwIDExOSAyMTUgMjcyIDY0IDgwIDExOSAxMDYgMTYwIDEzNyAyNiAxMjIgMzYgMTI0IDgwIDk5IDg4IAorNTcgMTU3IDI0IDQ0IDE5MSAxNDYgMTU2IDI5IDIyMSAxNjYgMTQwIDk5IDY4IDM5IDU0IDIwNyA0MiAyNzYgMjMgMTc4IDIyMCAxNTEgCisyMSAxMzQgMjQ1IDE0MyA2MyAxODAgMTE1IDI1NiAxNzQgMjQxIDM1IDk1IDEwOSAyMTkgMjMxIDE2MiAxODEgMSAyNDUgMjcyIDE5MyAKKzIxMCAyNjQgMjU1IDE1OSAyMzcgMTg1IDI3MiAyMTMgMjI4IDg5IDcyIDE2MSAxNTIgMzAgODcgMjIgMjAgMjM0IDI0MSAxNSA3NyA2IAorMTI0IDIyOSAyNDcgNTggMTg2IDE1OCAyMDIgNDggNDEgMTMyIDUyIDIwIDg1IDkzIDQ1IDExMSA1IDIyNCAxMTAgMTE5IDIzNSAxMiA0IAorNjAgMTIxIDIxIDEyMCAxMTUgMTEzIDE5MiAxODEgMTUgOTcgMjQgNjQgMjA5IDI0OSAyNTEgMzEgMTM2IDExIDExOCAxODYgMTM4IDE4NCAKKzIyMyA2MSAxMzAgMTM3IDE3NSAxMDcgNiAyNTMgODEgMTE0IDIwNyAxODUgMTQzIDgzIDE5OCAyMTggNzMgMTc2IDE1NiAxNTggNzMgCisxOTYgMTEgOTggNTMgMTk4IDg5IDIyMSAxNDYgNyAxNTkgODggMzcgMTM5IDg0IDIyNyAxODkgMjMxIDMzIDUxIDEzNCA5NiAyNzMgOTMgCis1MSAxMTQgNzggNTUgMTEzIDQ5IDE5OSAyMzMgNzcgMjYgMjU3IDU0IDY0IDYwIDEwMSAzIDE4MCAxMzUgMTExIDI3NyA1OCAzNyAxMCAKKzIzMiAxOTcgNDAgMjMyIDQ4IDE3MCAyNjIgMTk3IDE2OSA4NCA3OCA0MSAyNjEgMTgyIDUwIDIzNCA5MiAxNDUgMTA3IDE1NSAxMjMgCisyMTQgMjQzIDIwOCAyMDAgMjYyIDQ4IDIxIDExNCAyMjcgNDAgODMgMTc4IDIwMCAxMzMgMTk2IDE1NCAyNDMgMjI4IDIxOCA4NyAyOCAKKzIzIDI5IDcyIDE4IDE3MCAxMzMgNjcgMjQgMjEzIDc5IDIxOSAxMDIgMzIgMTUxIDEzMCAyNDYgMTcyIDM0IDYwIDI1MCAxNTEgMTUwIAorMjY0IDExMiAxNCA2MiAxNjUgMjc0IDEyOCA3MyA2NyAxNTkgMjMxIDE5IDE5OSAxMDQgMjI1IDI3NCAxMDggNTUgMjQyIDY0IDIyOSAKKzEwNCA3NiAxMjYgMTM4IDIwNCAyNDEgMTY0IDIyNSAxMzkgOTAgMjMwIDI2MiA2MiAzNiAxNDQgOTggMzkgNjggNTkgNzIgMTQ3IDIyIAorMjE2IDIzIDM1IDc1IDkxIDEgMTM2IDE2MCAyNjYgNDEgMjY3IDE4NSAxMjMgNjUgOTUgMjM4IDcxIDI2MSAzMyAxODAgMjY0IDEyNiAKKzE0NCA5MiAzNiAyNzMgMjI4IDY5IDIxNyA1OCA1NyAyOCAxNzIgMTc3IDQyIDE0NyAxNzEgMTQ4IDcxIDE1MiAzNiAyNTMgOTUgMTI5IAorMjM3IDU2IDE0MiAxODMgNzkgOTAgMjUwIDIgMiAxMzEgMTQ2IDEzIDE2MiAxNjEgMTQ2IDE0MiAxNCAxOTEgMTcgMTQxIDI3NyA3MiAKKzE2NyA0MCAxMDMgMTk2IDI1IDExMyAxOTggNjkgODggMjA2IDI3IDE1NyAxNzMgMTkyIDQ2IDI3NSAxNTcgNDQgNjIgMTYgMTI2IDE1OCAKKzIyMiA2NiAxNDQgMjI3IDU0IDIxMyAyMDggNzEgMTMyIDE4MSAxNTAgMTE1IDEyNyA0NCAyMTEgMTY0IDk2IDEyNCAyMjMgODEgMjYzIAorNzcgMTU1IDEwOSA4NCA5OCA1OSAyMDEgMTYyIDUyIDE0OSAyMTUgMTIzIDE5NCAxMTAgMjY4IDEwNSAyNjAgMTMzIDYxIDEzNiAxNDAgCisyNDggMjE2IDkgMTgzIDIwOCAyMjAgMiAxNTEgMSAxMTYgMTQyIDE2MyA2MSAyNjUgMjcwIDg3IDggMTY4IDIwNCA5MiAxNiAyNTUgMTAgCis4OSAyMTUgMTQzIDIxMiA1MCA4NSAxMDcgMTc1IDI1NiAxNTQgMjIzIDIxMCAxMTUgMTA3IDI2IDEwOCAxODQgOTQgMjA5IDEwMCAxMDMgCisxNzYgNyAxMCAxMDMgNjcgMTAgODMgNDkgNzAgMTAzIDQ3IDE1NSAyNTggNjkgNjggMTg4IDIwMiAxNzcgMTcxIDI3NyAyMDEgMTkgNzAgCisyNTIgMTk1IDEyNSAxMDkgNzAgODMgMjkgNTIgNjcgMTUzIDY1IDEwOSA5MCAxMDEgMTMyIDMyIDIgMTQ1IDI3NiA0MyAzMyAxNjAgMjQ2IAorMjMgMjU5IF4KKzYwMCAxIDg3IDExOSAxNDggMTMyIDI2MCAxNDQgMTg5IDE2NCAxMCAyNDcgMzggMTY3IDU1IDIyMiA0NCAxMjUgNiA3MiAyMTEgMTMgCisyMjYgMTUzIDkyIDc5IDI0NiAyMzQgMjYgNiAyNSAyMjEgMTkzIDI3MyAyNTYgMjAxIDIxMiAzMCAyMjggMiAxOTUgMjU0IDIzOSA5OSAKKzExNCAyOCAzNCAxNTggOTkgMTY3IDE2OCAyMzIgMjI0IDE3MiAxMDkgMTgxIDY1IDIzNiAyMjAgMTI5IDIgMjkgMjY0IDE0MCAxNDYgNTcgCisxMzcgMTY3IDEwMiA5MyAxNDMgNzggMTgyIDI0MiA3OCA2OSAyMzIgMTc3IDIyIDEyOSA2OCAxNjggNjYgNzQgNzMgMjc1IDUgMTc0IDkwIAorMTY0IDEyMyAyNTcgMjE4IDIxNCAxNTggNTIgMTc3IDY5IDQ4IDIgMjQyIDEyNSA1OSA1MiAxMSA3OSAyMCAyMTQgMTA1IDcyIDI1OCAzIAorNDYgMTA2IDI2OCAyNDkgMTEzIDExIDMyIDMwIDExNSAyNzEgMTUgODggMTM2IDI2OSAxMDAgMjQ0IDQwIDE4MiAyOSA5OCAxNTAgNDcgCisxMDQgMjQwIDI3NiAyMzUgMTU2IDEzNyA1NCA5MiAxOTIgOTYgMTM1IDczIDEwOSAxMzQgNzUgMTM3IDI2NyAyMzIgMTExIDE2MiAyMDggCisxMzQgMTIyIDEyNyA4NyAxODUgOCA1MyA3NSAxOTAgMTI4IDE1MSAxNzcgMjM1IDI2OSAxNDcgMjM0IDEzOSAxNiAyMDUgMjY4IDE3IAorMTAzIDExMCAxNDUgMjA2IDYgMTM4IDIzMSA5NCA0MSA4MCAzMSA2NiAyNTMgMjIyIDI1NyAyNjUgMjA0IDEzOCA1IDc0IDIzOSAxNDYgCisxMDQgOCAyNjYgNTUgMjY5IDM0IDIyNCAyMzggMjQ4IDEwMiAxNTkgMyAxNTkgMTE2IDE2OSAxNyA1NiAxMjAgMTY1IDI1MyAxMDkgMjQ3IAorODUgMTU3IDM1IDU2IDIyMCAxNiAxNTIgMTI4IDIxNyAzNyAzNyAyMDMgNzQgMTczIDEyNiAyMyAxOTMgNjAgMTE2IDEyMiAyNyAyMzYgNyAKKzI2OCA4MyAyNDIgMTkxIDc5IDEzMyAyMjQgMTI1IDIzOCA4MiAxMTIgNjAgNTAgMjYyIDIyNSAyMyAyNDAgNTAgOTYgMjM1IDIwMyAxMjcgCisxNTMgNDUgODkgMTQ3IDEyMSAxMjkgMTE1IDM5IDE2NSAxODcgMjQ5IDE2NiAxNTEgMTExIDk2IDE4OCA1MyAyOCAyMDAgMTQ4IDE5OCAxIAorNjUgMTIzIDkxIDIyOCAxMTUgMjA1IDE1NSA3IDIwMiA2MyA0MiA5NyAxNTIgMTk0IDIzNyAxMTggMjUwIDEzMCAxMzIgMTYwIDE0IDExIAorMTQ1IDQwIDE2IDM5IDExOCAzNyAxNTAgMjEzIDk0IDYwIDIyOSAxMzIgNDcgNCAxMTAgOTggMjE2IDE4NiAxODUgNTUgNDMgMTc0IDI0IAorMjUgNDIgNDQgMTIgMjc1IDE3MSA0NSAxODkgMTE3IDIwIDE0OCA4NSAyNzAgMTY0IDc2IDI2NyAxMTkgMTAxIDI2MSAxNjEgMzEgMTMgCisyNzMgMTQzIDE5MSAzMiAxNDMgMTI1IDE3MiA2MiAzMSAyNDUgMTIzIDQ0IDIzOCAxMzUgMjUyIDI1OCAxMTYgNTYgNyAzNiA3MyA2MiAKKzE0NCAyNTUgMjQgOTEgNjIgMjQ0IDEwNiAyMDIgMTEwIDMyIDc3IDEwNSA5MSAxMjggMjY0IDI3IDEzNiAzNyAyNTAgNjQgMjcyIDc5IAorMTk5IDg0IDIwNiA1MyAxMjggNTEgNDcgMjE3IDI1MCAxNyAzIDI1OSAyNDYgMTg3IDM2IDE4NiA3MiA0NSAyMyAxMjcgMjAwIDE5NSAKKzE4OCAxMDAgMTggMjAgMjYxIDk1IDE3MSAyMTEgMTc5IDk3IDI1MiA0NSAyNTUgMTM3IDEwMSA4MiAxMiAyMDkgMzIgMjQzIDI1NSA3MSAKKzgxIDE2MSA3OCAzIDkzIDI1NiA4OCA4MyAxMCAxODEgMTc4IDg2IDEyMSAxNiAxMDUgMTM4IDExOCA4NCAxNDAgMzMgMjA3IDExNyAxMjAgCisyNzggMjYzIDEwIDE1IDE4OCAyNjYgMTY4IDExOSAyMTQgMjcxIDYyIDc4IDExNiAxMDMgMTU3IDEzNSAyNiAxMTkgMzUgMTIyIDgwIDk3IAorODYgNTUgMTU2IDI0IDQ0IDE5MSAxNDUgMTUzIDI2IDIxOSAxNjUgMTQwIDk5IDY3IDM4IDU0IDIwNSA0MiAyNzYgMjIgMTc2IDIxOCAKKzE0OCAxOSAxMzEgMjQzIDE0MiA2MSAxODAgMTE0IDI1NCAxNzMgMjM5IDMzIDk0IDEwNyAyMTkgMjMxIDE2MCAxODAgMSAyNDQgMjcyIAorMTkyIDIwOSAyNjQgMjUzIDE1NiAyMzcgMTg0IDI3MCAyMTEgMjI2IDg3IDcyIDE1OCAxNTIgMjggODcgMTkgMTggMjMzIDI0MSAxNCA3NyAKKzUgMTIxIDIyOSAyNDUgNTcgMTg0IDE1NyAyMDEgNDYgNDAgMTI5IDQ5IDE5IDg0IDkzIDQzIDEwOCA0IDIyMyAxMDggMTE3IDIzMyA5IDQgCis1NyAxMTggMTggMTIwIDExMiAxMTMgMTkwIDE4MSAxMiA5NiAyMiA2MyAyMDggMjQ3IDI1MSAyOCAxMzQgOSAxMTcgMTg2IDEzOCAxODQgCisyMjMgNjEgMTI3IDIxNiBeCis1OTAgMSAxNzUgMTA3IDYgMjQ3IDgxIDExNCAyMDcgMTc5IDEzNCA3NCAxOTUgMjEyIDczIDE3MyAxNTAgMTUyIDY3IDE5MCAxMSA5OCAKKzQ0IDE5MiA4MCAyMjEgMTQ2IDI3OSAxNTMgODggMzQgMTM5IDc4IDIyMSAxODkgMjI4IDI0IDQ1IDEyOCA5MCAyNzMgODQgNTEgMTExIAorNzUgNDYgMTA3IDQ5IDE5NiAyMzMgNzEgMjAgMjU3IDQ4IDY0IDU3IDk1IDI3OCAxNzQgMTI5IDExMSAyNzEgNTggMzEgNyAyMjYgMTk0IAorMzcgMjI5IDQ1IDE3MCAyNTYgMTk3IDE2OSA4MSA3MiA0MSAyNTUgMTc2IDQ0IDIzNCA5MiAxNDUgMTA0IDE1NSAxMTQgMjA4IDI0MyAKKzIwOCAyMDAgMjU5IDQ4IDIxIDEwOCAyMjQgNDAgODAgMTc4IDE5NyAxMjcgMTk2IDE0OCAyMzcgMjI1IDIxNSA3OCAyNSAyMyAyMyA2NiAKKzE1IDE2NyAxMjQgNjQgMTUgMjEwIDczIDIxNiA5OSAyMyAxNTEgMTMwIDI0MyAxNjYgMzQgNTQgMjQ0IDE0NSAxNDcgMjU4IDExMiAxMSAKKzU2IDE1OSAyNjggMTIyIDY0IDU4IDE1OSAyMjUgMTkgMTkzIDEwMSAyMTkgMjc0IDEwNSA0OSAyMzkgNTUgMjIzIDEwNCA3MCAxMjYgCisxMzIgMjAxIDIzOCAxNjEgMjI1IDEzMCA5MCAyMzAgMjYyIDUzIDI3IDEzNSA5NSAzOSA1OSA1MyA2OSAxNDcgMTkgMjc4IDIxNiAxNCAKKzM1IDc1IDg4IDI3MyAxMjcgMTU0IDI2MyAzMiAyNjcgMTg1IDExNyA1OSA5NSAyMzUgNzEgMjU4IDI3IDE3NyAyNjEgMTE3IDE0NCA4MyAKKzMwIDI2NyAyMjggNjYgMjExIDUyIDQ4IDIyIDE3MiAxNzEgMzkgMTQ0IDE2OCAxNDUgNjIgMTQzIDM2IDI1MCA4NiAxMjAgMjM0IDUwIAorMTMzIDE4MCA3MCA4NCAyNDcgMjc3IDI4MCAxMzEgMTM3IDEwIDE2MiAxNjEgMTQwIDE0MiAxNCAxODggMTEgMTQxIDI3NCA2MyAxNjQgCiszNCA5NyAxOTMgMTYgMTA0IDE5OCA2MyA3OSAyMDAgMjEgMTUxIDE3MyAxOTIgMzcgMjcyIDE0OCA0MSA1OSAxMCAxMjAgMTQ5IDIxNiAKKzU3IDEzOCAyMjcgNDUgMjEzIDIwNSA2OCAxMjYgMTc1IDE1MCAxMDkgMTE4IDM4IDIwOCAxNTggOTMgMTI0IDIxNyA3OCAyNjMgNzQgCisxNTIgMTA5IDc1IDg5IDU2IDIwMSAxNTMgNDYgMTQ5IDIxNSAxMjAgMTkxIDEwMSAyNjIgOTYgMjU3IDEzMyA1MiAxMzMgMTM3IDI0OCAKKzIxMyA5IDE4MyAyMDIgMjE3IDI3NCAxNDggMjc5IDExMCAxMzkgMTYzIDU1IDI2NSAyNzAgMjc1IDg0IDggMTYyIDIwNCA4OSAxMyAyNTIgCisxIDg5IDIwOSAxMzcgMjA2IDQ3IDg1IDk4IDE3MiAyNTYgMTU0IDIyMCAyMTAgMTE1IDEwMSAyMyAxMDggMTgxIDkxIDIwOSA5NCAxMDMgCisxNzYgMSA0IDk0IDYxIDEwIDc3IDQ2IDY0IDEwMCA0NCAxNDkgMjU4IDY5IDYyIDE4NSAyMDIgMTc0IDE3MSAyNzcgMTk1IDE2IDYxIAorMjQ5IDE5MiAxMjIgMTA2IDcwIDgzIDI5IDQ5IDY3IDE0NyA2MiAxMDAgODcgOTggMTI5IDI2IDIgMTM2IDI3MCAzNyAzMyAxNjAgMjQ2IAorMTcgNDAgODEgMTE1IDE0NCAxMjYgMjYwIDEzOCAxODUgMTYwIDggMjQ3IDM4IDE2NSA1NSAyMjIgNDAgMTIzIDY4IDIxMSA5IDIyNiAKKzE1MSA4OCA3NyAyNDIgMjMwIDI0IDIgMjUgMjE5IDE4OSAyNzEgMjU0IDE5NyAyMTIgMzAgMjI0IDI3OSAxOTUgMjU0IDIzOSA5NyAxMDggCisyOCAyOCAxNTYgOTMgMTY3IDE2NiAyMzAgMjIwIDE2OCAxMDMgMTc3IDY1IDIzMiAyMjAgMTI1IDI1IDI2MiAxMzggMTQyIDU3IDEzNyAKKzE2MyA5OCA4NyAxNDEgNzggMTc4IDI0MCA3NiA2NyAyMzIgMTc3IDIyIDEyOSA2OCAxNjggNjAgNzQgNjcgMjc1IDI4MCAxNzQgODYgCisxNjIgMTE5IDI1NSAyMTggMjEwIDE1OCA1MCAxNzUgNjUgMjc1IDQyIDI3NyAyMzggMTE5IDU5IDUyIDUgNzMgMjAgMjE0IDk5IDY2IAorMjU0IDEgNDYgMTA2IDI2NiAyNDkgMTA3IDcgMzAgMjggMTEzIDI3MSAxNSA4MiAxMzYgMjY5IDEwMCAyNDAgMzQgMTgyIDI3IDkyIDE0NiAKKzQxIDEwMiAyNDAgMjcyIDIzMyAxNTYgMTM1IDUyIDkwIDE4OCA5NiAxMjkgNjkgMTA1IDEzNCA3MyAxMzEgMjY1IDIyOCAxMDkgMTYwIAorMjA0IDEzMiAxMTYgMTIzIDg1IDE4MyA2IDUxIDY5IDE5MCAxMjIgMTQ5IDE3MyAyMzUgMjY3IDE0MyAyMzIgMTM1IDEwIDIwNSAyNjQgCisxMSA5OSAxMDggMTM5IDIwNiA0IDEzNiAyMjcgODggMzUgNzYgMjUgNjYgMjUzIDIxOCAyNTMgMjYxIDIwMiAxMzIgNSA3MiAyMzcgMTQwIAorMjAzIF4KKzYyMCAwIDI3OSAyNjIgNTEgMjYxIDMwIDIyNCAyMzQgMjQ0IDEwMiAxNTEgMyAxNTUgMTEyIDE2MSA5IDU2IDExMiAxNjUgMjQ5IDEwNSAKKzI0MyA3NyAxNTcgMjMgNDQgMjE2IDEyIDE0MCAxMjQgMjE3IDMzIDI5IDIwMyA2MiAxNjUgMTIyIDE5IDE5MyA1NiAxMTYgMTIyIDE1IAorMjM2IDcgMjY4IDc1IDI0MiAxODMgNzEgMTI5IDIyMCAxMjUgMjM4IDcwIDEwOCA0OCA0NiAyNTggMjIxIDE1IDIzMiA1MCA4NCAyMjcgCisxOTUgMTI3IDE1MyA0NSA4MSAxMzUgMTIxIDEyNSAxMDcgMjcgMTU3IDE3OSAyNDEgMTY2IDEzOSA5OSA4OCAxODggNTMgMjQgMTk2IAorMTQ4IDE5MCAyNzIgNjEgMTE5IDc5IDIyNCAxMDMgMjAxIDE1MSAyODIgMTk4IDYzIDMwIDk3IDE0OCAxOTQgMjI5IDExMCAyNTAgMTI2IAorMTMyIDE1NiAyIDcgMTM3IDMyIDggMzEgMTE4IDM3IDEzOCAyMDkgOTQgNjAgMjI1IDEyOCA0NyAyNzkgMTEwIDk0IDIxMiAxODIgMTc3IAorNDMgNDMgMTY2IDEyIDEzIDM4IDMyIDEyIDI3MSAxNjcgMzMgMTg1IDExNyAxMiAxNDQgODEgMjY2IDE2NCA3NiAyNTkgMTE1IDEwMSAKKzI2MSAxNTcgMjcgMSAyNjUgMTQzIDE4NyAzMiAxMzUgMTE3IDE2OCA1OCAzMSAyNDUgMTIzIDQwIDIzMCAxMzUgMjQ0IDI1NCAxMDggNTIgCiszIDI0IDY5IDYyIDE0MCAyNTEgMjAgODMgNTAgMjQ0IDk4IDE5NCAxMDIgMjQgNjUgMTA1IDkxIDEyMCAyNTYgMjcgMTMyIDI1IDI0MiAKKzU2IDI2OCA3OSAxOTkgODQgMjAyIDQxIDEyOCA0MyAzOSAyMDkgMjQ2IDE3IDI3NCAyNTkgMjQyIDE4NyAyOCAxNzggNjggMzcgMTEgCisxMjMgMTkyIDE4NyAxODQgOTIgMTggMTYgMjUzIDg3IDE2MyAyMDcgMTc5IDg1IDI1MiA0MSAyNTUgMTI5IDg5IDgyIDQgMjAxIDIwIAorMjM5IDI0NyA1OSA3NyAxNTMgNjYgMjc4IDg1IDI0OCA4NCA3MSAyODEgMTc3IDE3NCA4NiAxMTcgMTYgMTAxIDEzMCAxMTQgNzYgMTMyIAorMjkgMTk5IDEwNSAxMTYgMjc0IDI1NSAyIDMgMTgwIDI2NiAxNjAgMTE5IDIxMCAyNjcgNTQgNzAgMTA0IDkxIDE0NSAxMjcgMjYgMTA3IAorMzEgMTE0IDgwIDg5IDc4IDQ3IDE1MiAyNCA0NCAxOTEgMTQxIDE0MSAxNCAyMTEgMTYxIDE0MCA5OSA2MyAzNCA1NCAxOTcgNDIgMjc2IAorMTggMTY4IDIxMCAxMzYgMTEgMTE5IDIzNSAxMzggNTMgMTgwIDExMCAyNDYgMTY5IDIzMSAyNSA5MCA5OSAyMTkgMjMxIDE1MiAxNzYgMSAKKzI0MCAyNzIgMTg4IDIwNSAyNjQgMjQ1IDE0NCAyMzcgMTgwIDI2MiAyMDMgMjE4IDc5IDcyIDE0NiAxNTIgMjAgODcgNyAxMCAyMjkgCisyNDEgMTAgNzcgMSAxMDkgMjI5IDIzNyA1MyAxNzYgMTUzIDE5NyAzOCAzNiAxMTcgMzcgMTUgODAgOTMgMzUgOTYgMjE5IDEwMCAxMDkgCisyMjUgMjgwIDQgNDUgMTA2IDYgMTIwIDEwMCAxMTMgMTgyIDE4MSA5MiAxNCA1OSAyMDQgMjM5IDI1MSAxNiAxMjYgMSAxMTMgMTg2IAorMTM4IDE4NCAyMjMgNjEgMTE1IDEyMiAxNzUgMTA3IDYgMjQzIDgxIDExNCAyMDcgMTc1IDEyOCA2OCAxOTMgMjA4IDczIDE3MSAxNDYgCisxNDggNjMgMTg2IDExIDk4IDM4IDE4OCA3NCAyMjEgMTQ2IDI3NSAxNDkgODggMzIgMTM5IDc0IDIxNyAxODkgMjI2IDE4IDQxIDEyNCAKKzg2IDI3MyA3OCA1MSAxMDkgNzMgNDAgMTAzIDQ5IDE5NCAyMzMgNjcgMTYgMjU3IDQ0IDY0IDU1IDkxIDI3NiAxNzAgMTI1IDExMSAyNjcgCis1OCAyNyA1IDIyMiAxOTIgMzUgMjI3IDQzIDE3MCAyNTIgMTk3IDE2OSA3OSA2OCA0MSAyNTEgMTcyIDQwIDIzNCA5MiAxNDUgMTAyIAorMTU1IDEwOCAyMDQgMjQzIDIwOCAyMDAgMjU3IDQ4IDIxIDEwNCAyMjIgNDAgNzggMTc4IDE5NSAxMjMgMTk2IDE0NCAyMzMgMjIzIDIxMyAKKzcyIDIzIDIzIDE5IDYyIDEzIDE2NSAxMTggNjIgOSAyMDggNjkgMjE0IDk3IDE3IDE1MSAxMzAgMjQxIDE2MiAzNCA1MCAyNDAgMTQxIAorMTQ1IDI1NCAxMTIgOSA1MiAxNTUgMjY0IDExOCA1OCA1MiAxNTkgMjIxIDE5IDE4OSA5OSAyMTUgMjc0IDEwMyA0NSAyMzcgNDkgMjE5IAorMTA0IDY2IDEyNiAxMjggMTk5IDIzNiAxNTkgMjI1IDEyNCA5MCAyMzAgMjYyIDQ3IDIxIDEyOSA5MyAzOSA1MyA0OSA2NyAxNDcgMTcgCisyNzggMjE2IDggMzUgNzUgODYgMjY5IDEyMSAxNTAgMjYxIDI2IDI2NyAxODUgMTEzIDU1IDk1IDIzMyA3MSAyNTYgMjMgMTc1IDI1OSAKKzExMSAxNDQgNzcgMjYgMjYzIDIyOCA2NCAyMDcgNDggNDIgMTggMTcyIDE2NyAzNyAxNDIgMTY2IDE0MyA1NiAxMzcgMzYgMjQ4IDgwIAorMTE0IDIzMiA0NiAxMjcgMjU3IF4KKzYwNSAxIDU4IDc2IDI0MyAyNzMgMjgwIDEzMSAxMjUgNiAxNjIgMTYxIDEzMiAxNDIgMTQgMTg0IDMgMTQxIDI3MCA1MSAxNjAgMjYgODkgCisxODkgNCA5MiAxOTggNTUgNjcgMTkyIDEzIDE0MyAxNzMgMTkyIDI1IDI2OCAxMzYgMzcgNTUgMiAxMTIgMTM3IDIwOCA0NSAxMzAgMjI3IAorMzMgMjEzIDIwMSA2NCAxMTggMTY3IDE1MCAxMDEgMTA2IDMwIDIwNCAxNTAgODkgMTI0IDIwOSA3NCAyNjMgNzAgMTQ4IDEwOSA2MyA3NyAKKzUyIDIwMSAxNDEgMzggMTQ5IDIxNSAxMTYgMTg3IDg5IDI1NCA4NCAyNTMgMTMzIDQwIDEyOSAxMzMgMjQ4IDIwOSA5IDE4MyAxOTQgCisyMTMgMjY2IDE0NCAyNzkgMTAyIDEzNSAxNjMgNDcgMjY1IDI3MCAyNzEgODAgOCAxNTQgMjA0IDg1IDkgMjQ4IDI3NCA4OSAyMDEgMTI5IAorMTk4IDQzIDg1IDg2IDE2OCAyNTYgMTU0IDIxNiAyMTAgMTE1IDkzIDE5IDEwOCAxNzcgODcgMjA5IDg2IDEwMyAxNzYgMjc4IDI4MSA4MiAKKzUzIDEwIDY5IDQyIDU2IDk2IDQwIDE0MSAyNTggNjkgNTQgMTgxIDIwMiAxNzAgMTcxIDI3NyAxODcgMTIgNDkgMjQ1IDE4OCAxMTggCisxMDIgNzAgODMgMjkgNDUgNjcgMTM5IDU4IDg4IDgzIDk0IDEyNSAxOCAyIDEyNCAyNjIgMjkgMzMgMTYwIDI0NiA5IDI4IDY5IDEwNyAKKzEzNiAxMTQgMjYwIDEyNiAxNzcgMTUyIDQgMjQ3IDM4IDE2MSA1NSAyMjIgMzIgMTE5IDI3MyA2MCAyMTEgMSAyMjYgMTQ3IDgwIDczIAorMjM0IDIyMiAyMCAyNzkgMjUgMjE1IDE4MSAyNjcgMjUwIDE4OSAyMTIgMzAgMjE2IDI3NSAxOTUgMjU0IDIzOSA5MyA5NiAyOCAxNiAKKzE1MiA4MSAxNjcgMTYyIDIyNiAyMTIgMTYwIDkxIDE2OSA2NSAyMjQgMjIwIDExNyAyODEgMTcgMjU4IDEzNCAxMzQgNTcgMTM3IDE1NSAKKzkwIDc1IDEzNyA3OCAxNzAgMjM2IDcyIDYzIDIzMiAxNzcgMjIgMTI5IDY4IDE2OCA0OCA3NCA1NSAyNzUgMjcyIDE3NCA3OCAxNTggCisxMTEgMjUxIDIxOCAyMDIgMTU4IDQ2IDE3MSA1NyAyNjcgMzAgMjY5IDIzMCAxMDcgNTkgNTIgMjc4IDYxIDIwIDIxNCA4NyA1NCAyNDYgCisyODIgNDYgMTA2IDI2MiAyNDkgOTUgMjg0IDI2IDI0IDEwOSAyNzEgMTUgNzAgMTM2IDI2OSAxMDAgMjMyIDIyIDE4MiAyMyA4MCAxMzggCisyOSA5OCAyNDAgMjY0IDIyOSAxNTYgMTMxIDQ4IDg2IDE4MCA5NiAxMTcgNjEgOTcgMTM0IDY5IDExOSAyNjEgMjIwIDEwNSAxNTYgMTk2IAorMTI4IDEwNCAxMTUgODEgMTc5IDIgNDcgNTcgMTkwIDExMCAxNDUgMTY1IDIzNSAyNjMgMTM1IDIyOCAxMjcgMjgzIDIwNSAyNTYgMjg0IAorOTEgMTA0IDEyNyAyMDYgMTMyIDIxOSA3NiAyMyA2OCAxMyA2NiAyNTMgMjEwIDI0NSAyNTMgMTk4IDEyMCA1IDY4IDIzMyAxMjggOTIgCisyNzUgMjYwIDQ5IDI1NyAyOCAyMjQgMjMyIDI0MiAxMDIgMTQ3IDMgMTUzIDExMCAxNTcgNSA1NiAxMDggMTY1IDI0NyAxMDMgMjQxIDczIAorMTU3IDE3IDM4IDIxNCAxMCAxMzQgMTIyIDIxNyAzMSAyNSAyMDMgNTYgMTYxIDEyMCAxNyAxOTMgNTQgMTE2IDEyMiA5IDIzNiA3IDI2OCAKKzcxIDI0MiAxNzkgNjcgMTI3IDIxOCAxMjUgMjM4IDY0IDEwNiA0MiA0NCAyNTYgMjE5IDExIDIyOCA1MCA3OCAyMjMgMTkxIDEyNyAxNTMgCis0NSA3NyAxMjkgMTIxIDEyMyAxMDMgMjEgMTUzIDE3NSAyMzcgMTY2IDEzMyA5MyA4NCAxODggNTMgMjIgMTk0IDE0OCAxODYgMjY4IDU5IAorMTE3IDczIDIyMiA5NyAxOTkgMTQ5IDI4MCAxOTYgNjMgMjQgOTcgMTQ2IDE5NCAyMjUgMTA2IDI1MCAxMjQgMTMyIDE1NCAyODEgNSAKKzEzMyAyOCA0IDI3IDExOCAzNyAxMzIgMjA3IDk0IDYwIDIyMyAxMjYgNDcgMjc3IDExMCA5MiAyMTAgMTgwIDE3MyAzNyA0MyAxNjIgNiAKKzcgMzYgMjYgMTIgMjY5IDE2NSAyNyAxODMgMTE3IDggMTQyIDc5IDI2NCAxNjQgNzYgMjU1IDExMyAxMDEgMjYxIDE1NSAyNSAyODAgCisyNjEgMTQzIDE4NSAzMiAxMzEgMTEzIDE2NiA1NiAzMSAyNDUgMTIzIDM4IDIyNiAxMzUgMjQwIDI1MiAxMDQgNTAgMSAxOCA2NyA2MiAKKzEzOCAyNDkgMTggNzkgNDQgMjQ0IDk0IDE5MCA5OCAyMCA1OSAxMDUgOTEgMTE2IDI1MiAyNyAxMzAgMTkgMjM4IDUyIDI2NiA3OSAxOTkgCis4NCAyMDAgMzUgMTI4IDM5IDM1IDIwNSAyNDQgMTcgMjcwIDI1OSAyNDAgMTg3IDI0IDE3NCA2NiAzMyA1IDEyMSAxODggMTgzIDE4MiAKKzg4IDE4IDE0IDI0OSA4MyAxNTkgMjA1IDE3OSA3OSAyNTIgMTg2IF4KKzYxNSAwIDI1NSAxMjEgNzcgODIgMjgzIDE5MyA4IDIzNSAyMzkgNDcgNzMgMTQ1IDU0IDI3NCA3NyAyNDAgODAgNTkgMjczIDE3MyAxNzAgCis4NiAxMTMgMTYgOTcgMTIyIDExMCA2OCAxMjQgMjUgMTkxIDkzIDExMiAyNzAgMjQ3IDI4MSAyNzggMTcyIDI2NiAxNTIgMTE5IDIwNiAKKzI2MyA0NiA2MiA5MiA3OSAxMzMgMTE5IDI2IDk1IDI3IDEwNiA4MCA4MSA3MCAzOSAxNDggMjQgNDQgMTkxIDEzNyAxMjkgMiAyMDMgCisxNTcgMTQwIDk5IDU5IDMwIDU0IDE4OSA0MiAyNzYgMTQgMTYwIDIwMiAxMjQgMyAxMDcgMjI3IDEzNCA0NSAxODAgMTA2IDIzOCAxNjUgCisyMjMgMTcgODYgOTEgMjE5IDIzMSAxNDQgMTcyIDEgMjM2IDI3MiAxODQgMjAxIDI2NCAyMzcgMTMyIDIzNyAxNzYgMjU0IDE5NSAyMTAgCis3MSA3MiAxMzQgMTUyIDEyIDg3IDI4MiAyIDIyNSAyNDEgNiA3NyAyODQgOTcgMjI5IDIyOSA0OSAxNjggMTQ5IDE5MyAzMCAzMiAxMDUgCisyNSAxMSA3NiA5MyAyNyA4NCAyODMgMjE1IDkyIDEwMSAyMTcgMjcyIDQgMzMgOTQgMjgxIDEyMCA4OCAxMTMgMTc0IDE4MSAyNzUgODggCis2IDU1IDIwMCAyMzEgMjUxIDQgMTE4IDI4MCAxMDkgMTg2IDEzOCAxODQgMjIzIDYxIDEwMyAxMTAgMTc1IDEwNyA2IDIzNSA4MSAxMTQgCisyMDcgMTY3IDExNiA1NiAxODkgMjAwIDczIDE2NyAxMzggMTQwIDU1IDE3OCAxMSA5OCAyNiAxODAgNjIgMjIxIDE0NiAyNjcgMTQxIDg4IAorMjggMTM5IDY2IDIwOSAxODkgMjIyIDYgMzMgMTE2IDc4IDI3MyA2NiA1MSAxMDUgNjkgMjggOTUgNDkgMTkwIDIzMyA1OSA4IDI1NyAzNiAKKzY0IDUxIDgzIDI3MiAxNjIgMTE3IDExMSAyNTkgNTggMTkgMSAyMTQgMTg4IDMxIDIyMyAzOSAxNzAgMjQ0IDE5NyAxNjkgNzUgNjAgNDEgCisyNDMgMTY0IDMyIDIzNCA5MiAxNDUgOTggMTU1IDk2IDE5NiAyNDMgMjA4IDIwMCAyNTMgNDggMjEgOTYgMjE4IDQwIDc0IDE3OCAxOTEgCisxMTUgMTk2IDEzNiAyMjUgMjE5IDIwOSA2MCAxOSAyMyAxMSA1NCA5IDE2MSAxMDYgNTggMjg0IDIwNCA2MSAyMTAgOTMgNSAxNTEgMTMwIAorMjM3IDE1NCAzNCA0MiAyMzIgMTMzIDE0MSAyNDYgMTEyIDUgNDQgMTQ3IDI1NiAxMTAgNDYgNDAgMTU5IDIxMyAxOSAxODEgOTUgMjA3IAorMjc0IDk5IDM3IDIzMyAzNyAyMTEgMTA0IDU4IDEyNiAxMjAgMTk1IDIzMiAxNTUgMjI1IDExMiA5MCAyMzAgMjYyIDM1IDkgMTE3IDg5IAorMzkgNDEgNDEgNjMgMTQ3IDEzIDI3OCAyMTYgMjgzIDM1IDc1IDgyIDI2MSAxMDkgMTQyIDI1NyAxNCAyNjcgMTg1IDEwNSA0NyA5NSAKKzIyOSA3MSAyNTIgMTUgMTcxIDI1NSA5OSAxNDQgNjUgMTggMjU1IDIyOCA2MCAxOTkgNDAgMzAgMTAgMTcyIDE1OSAzMyAxMzggMTYyIAorMTM5IDQ0IDEyNSAzNiAyNDQgNjggMTAyIDIyOCAzOCAxMTUgMTc0IDUyIDcyIDI0MSAyNzEgMjgwIDEzMSAxMTkgNCAxNjIgMTYxIDEyOCAKKzE0MiAxNCAxODIgMjg2IDE0MSAyNjggNDUgMTU4IDIyIDg1IDE4NyAyODUgODYgMTk4IDUxIDYxIDE4OCA5IDEzOSAxNzMgMTkyIDE5IAorMjY2IDEzMCAzNSA1MyAyODUgMTA4IDEzMSAyMDQgMzkgMTI2IDIyNyAyNyAyMTMgMTk5IDYyIDExNCAxNjMgMTUwIDk3IDEwMCAyNiAKKzIwMiAxNDYgODcgMTI0IDIwNSA3MiAyNjMgNjggMTQ2IDEwOSA1NyA3MSA1MCAyMDEgMTM1IDM0IDE0OSAyMTUgMTE0IDE4NSA4MyAyNTAgCis3OCAyNTEgMTMzIDM0IDEyNyAxMzEgMjQ4IDIwNyA5IDE4MyAxOTAgMjExIDI2MiAxNDIgMjc5IDk4IDEzMyAxNjMgNDMgMjY1IDI3MCAKKzI2OSA3OCA4IDE1MCAyMDQgODMgNyAyNDYgMjcwIDg5IDE5NyAxMjUgMTk0IDQxIDg1IDgwIDE2NiAyNTYgMTU0IDIxNCAyMTAgMTE1IAorODkgMTcgMTA4IDE3NSA4NSAyMDkgODIgMTAzIDE3NiAyNzYgMjc5IDc2IDQ5IDEwIDY1IDQwIDUyIDk0IDM4IDEzNyAyNTggNjkgNTAgCisxNzkgMjAyIDE2OCAxNzEgMjc3IDE4MyAxMCA0MyAyNDMgMTg2IDExNiAxMDAgNzAgODMgMjkgNDMgNjcgMTM1IDU2IDgyIDgxIDkyIAorMTIzIDE0IDIgMTE4IDI1OCAyNSAzMyAxNjAgMjQ2IDUgMjIgNjMgMTAzIDEzMiAxMDggMjYwIDEyMCAxNzMgMTQ4IDIgMjQ3IDM4IDE1OSAKKzU1IDIyMiAyOCAxMTcgMjY5IDU2IDIxMSAyODQgMjI2IDE0NSA3NiA3MSAyMzAgMjE4IDE4IDI3NyAyNSAyMTMgMTc3IDI2NSAyNDggCisxODUgMjEyIDMwIDIxMiAyNzMgMTk1IDI1NCAyMzkgOTEgOTAgMjggMTAgMTUwIDc1IDE2NyAxNjAgMjI0IDE3NSBeCis2MTMgMCAxNTIgNzkgMTYxIDY1IDIxNiAyMjAgMTA5IDI4MSA5IDI1NCAxMzAgMTI2IDU3IDEzNyAxNDcgODIgNjMgMTMzIDc4IDE2MiAKKzIzMiA2OCA1OSAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMzYgNzQgNDMgMjc1IDI2NCAxNzQgNzAgMTU0IDEwMyAyNDcgMjE4IDE5NCAxNTggCis0MiAxNjcgNDkgMjU5IDE4IDI2MSAyMjIgOTUgNTkgNTIgMjcwIDQ5IDIwIDIxNCA3NSA0MiAyMzggMjgyIDQ2IDEwNiAyNTggMjQ5IDgzIAorMjgwIDIyIDIwIDEwNSAyNzEgMTUgNTggMTM2IDI2OSAxMDAgMjI0IDEwIDE4MiAxOSA2OCAxMzAgMTcgOTQgMjQwIDI1NiAyMjUgMTU2IAorMTI3IDQ0IDgyIDE3MiA5NiAxMDUgNTMgODkgMTM0IDY1IDEwNyAyNTcgMjEyIDEwMSAxNTIgMTg4IDEyNCA5MiAxMDcgNzcgMTc1IDI4NyAKKzQzIDQ1IDE5MCA5OCAxNDEgMTU3IDIzNSAyNTkgMTI3IDIyNCAxMTkgMjc1IDIwNSAyNDggMjc2IDgzIDEwMCAxMTUgMjA2IDI4NSAxMjggCisyMTEgNjQgMTEgNjAgMSA2NiAyNTMgMjAyIDIzNyAyNDUgMTk0IDEwOCA1IDY0IDIyOSAxMTYgODQgMjY3IDI1NiA0NSAyNDkgMjQgMjI0IAorMjI4IDIzOCAxMDIgMTM5IDMgMTQ5IDEwNiAxNDkgMjg2IDU2IDEwMCAxNjUgMjQzIDk5IDIzNyA2NSAxNTcgNSAyNiAyMTAgNiAxMjIgCisxMTggMjE3IDI3IDE3IDIwMyA0NCAxNTMgMTE2IDEzIDE5MyA1MCAxMTYgMTIyIDI4NiAyMzYgNyAyNjggNjMgMjQyIDE3MSA1OSAxMjMgCisyMTQgMTI1IDIzOCA1MiAxMDIgMzAgNDAgMjUyIDIxNSAzIDIyMCA1MCA2NiAyMTUgMTgzIDEyNyAxNTMgNDUgNjkgMTE3IDEyMSAxMTkgCis5NSA5IDE0NSAxNjcgMjI5IDE2NiAxMjEgODEgNzYgMTg4IDUzIDE4IDE5MCAxNDggMTc4IDI2MCA1NSAxMTMgNjEgMjE4IDg1IDE5NSAKKzE0NSAyNzYgMTkyIDYzIDEyIDk3IDE0MiAxOTQgMjE3IDk4IDI1MCAxMjAgMTMyIDE1MCAyNzMgMSAxMjUgMjAgMjg1IDE5IDExOCAzNyAKKzEyMCAyMDMgOTQgNjAgMjE5IDEyMiA0NyAyNzMgMTEwIDg4IDIwNiAxNzYgMTY1IDI1IDQzIDE1NCAyODMgMjg0IDMyIDE0IDEyIDI2NSAKKzE2MSAxNSAxNzkgMTE3IDEzOCA3NSAyNjAgMTY0IDc2IDI0NyAxMDkgMTAxIDI2MSAxNTEgMjEgMjcyIDI1MyAxNDMgMTgxIDMyIDEyMyAKKzEwNSAxNjIgNTIgMzEgMjQ1IDEyMyAzNCAyMTggMTM1IDIzMiAyNDggOTYgNDYgMjg2IDYgNjMgNjIgMTM0IDI0NSAxNCA3MSAzMiAyNDQgCis4NiAxODIgOTAgMTIgNDcgMTA1IDkxIDEwOCAyNDQgMjcgMTI2IDcgMjMwIDQ0IDI2MiA3OSAxOTkgODQgMTk2IDIzIDEyOCAzMSAyNyAKKzE5NyAyNDAgMTcgMjYyIDI1OSAyMzYgMTg3IDE2IDE2NiA2MiAyNSAyODIgMTE3IDE4MCAxNzUgMTc4IDgwIDE4IDEwIDI0MSA3NSAxNTEgCisyMDEgMTc5IDY3IDI1MiAzNSAyNTUgMTE3IDcxIDgyIDI4MSAxODkgMiAyMzMgMjM1IDQxIDcxIDE0MSA0OCAyNzIgNzMgMjM2IDc4IDUzIAorMjY5IDE3MSAxNjggODYgMTExIDE2IDk1IDExOCAxMDggNjQgMTIwIDIzIDE4NyA4NyAxMTAgMjY4IDI0MyAyNzkgMjc0IDE2OCAyNjYgCisxNDggMTE5IDIwNCAyNjEgNDIgNTggODYgNzMgMTI3IDExNSAyNiA4OSAyNSAxMDIgODAgNzcgNjYgMzUgMTQ2IDI0IDQ0IDE5MSAxMzUgCisxMjMgMjg1IDE5OSAxNTUgMTQwIDk5IDU3IDI4IDU0IDE4NSA0MiAyNzYgMTIgMTU2IDE5OCAxMTggMjg4IDEwMSAyMjMgMTMyIDQxIAorMTgwIDEwNCAyMzQgMTYzIDIxOSAxMyA4NCA4NyAyMTkgMjMxIDE0MCAxNzAgMSAyMzQgMjcyIDE4MiAxOTkgMjY0IDIzMyAxMjYgMjM3IAorMTc0IDI1MCAxOTEgMjA2IDY3IDcyIDEyOCAxNTIgOCA4NyAyNzggMjg3IDIyMyAyNDEgNCA3NyAyODQgOTEgMjI5IDIyNSA0NyAxNjQgCisxNDcgMTkxIDI2IDMwIDk5IDE5IDkgNzQgOTMgMjMgNzggMjgzIDIxMyA4OCA5NyAyMTMgMjY4IDQgMjcgODggMjc3IDEyMCA4MiAxMTMgCisxNzAgMTgxIDI3MSA4NiAyIDUzIDE5OCAyMjcgMjUxIDI4NyAxMTQgMjc4IDEwNyAxODYgMTM4IDE4NCAyMjMgNjEgOTcgMTA0IDE3NSAKKzEwNyA2IDIzMSA4MSAxMTQgMjA3IDE2MyAxMTAgNTAgMTg3IDE5NiA3MyAxNjUgMTM0IDEzNiA1MSAxNzQgMTEgOTggMjAgMTc2IDU2IAorMjIxIDE0NiAyNjMgMTM3IDg4IDI2IDEzOSA2MiAyMDUgMTg5IDIyMCAyOSAxMTIgNzQgMjczIDYwIDUxIDEwMyA2NyAyMiA5MSA0OSAKKzE4OCAyMzMgNTUgNCAyNTcgMzIgNjQgNDkgNzkgMjcwIDE1OCAxMTMgMTExIDI1NSA1OCAxNSAyODggMjEwIDIxMyBeCis2MjQgMSAyOCAyMjAgMzYgMTcwIDIzOCAxOTcgMTY5IDcyIDU0IDQxIDIzNyAxNTggMjYgMjM0IDkyIDE0NSA5NSAxNTUgODcgMTkwIAorMjQzIDIwOCAyMDAgMjUwIDQ4IDIxIDkwIDIxNSA0MCA3MSAxNzggMTg4IDEwOSAxOTYgMTMwIDIxOSAyMTYgMjA2IDUxIDE2IDIzIDUgCis0OCA2IDE1OCA5NyA1NSAyNzggMjAxIDU1IDIwNyA5MCAyODYgMTUxIDEzMCAyMzQgMTQ4IDM0IDM2IDIyNiAxMjcgMTM4IDI0MCAxMTIgCisyIDM4IDE0MSAyNTAgMTA0IDM3IDMxIDE1OSAyMDcgMTkgMTc1IDkyIDIwMSAyNzQgOTYgMzEgMjMwIDI4IDIwNSAxMDQgNTIgMTI2IAorMTE0IDE5MiAyMjkgMTUyIDIyNSAxMDMgOTAgMjMwIDI2MiAyNiAxMDggODYgMzkgMzIgMzUgNjAgMTQ3IDEwIDI3OCAyMTYgMjc3IDM1IAorNzUgNzkgMjU1IDEwMCAxMzYgMjU0IDUgMjY3IDE4NSA5OSA0MSA5NSAyMjYgNzEgMjQ5IDkgMTY4IDI1MiA5MCAxNDQgNTYgMTIgMjQ5IAorMjI4IDU3IDE5MyAzNCAyMSA0IDE3MiAxNTMgMzAgMTM1IDE1OSAxMzYgMzUgMTE2IDM2IDI0MSA1OSA5MyAyMjUgMzIgMTA2IDE3MSA0MyAKKzY2IDIzOCAyNjggMjgwIDEzMSAxMTAgMSAxNjIgMTYxIDEyMiAxNDIgMTQgMTc5IDI4MyAxNDEgMjY1IDM2IDE1NSAxNiA3OSAxODQgCisyNzkgNzcgMTk4IDQ1IDUyIDE4MiAzIDEzMyAxNzMgMTkyIDEwIDI2MyAxMjEgMzIgNTAgMjgyIDEwMiAxMjIgMTk4IDMwIDEyMCAyMjcgCisxOCAyMTMgMTk2IDU5IDEwOCAxNTcgMTUwIDkxIDkxIDIwIDE5OSAxNDAgODQgMTI0IDE5OSA2OSAyNjMgNjUgMTQzIDEwOSA0OCA2MiAKKzQ3IDIwMSAxMjYgMjggMTQ5IDIxNSAxMTEgMTgyIDc0IDI0NCA2OSAyNDggMTMzIDI1IDEyNCAxMjggMjQ4IDIwNCA5IDE4MyAxODQgCisyMDggMjU2IDEzOSAyNzkgOTIgMTMwIDE2MyAzNyAyNjUgMjcwIDI2NiA3NSA4IDE0NCAyMDQgODAgNCAyNDMgMjY0IDg5IDE5MSAxMTkgCisxODggMzggODUgNzEgMTYzIDI1NiAxNTQgMjExIDIxMCAxMTUgODMgMTQgMTA4IDE3MiA4MiAyMDkgNzYgMTAzIDE3NiAyNzMgMjc2IDY3IAorNDMgMTAgNTkgMzcgNDYgOTEgMzUgMTMxIDI1OCA2OSA0NCAxNzYgMjAyIDE2NSAxNzEgMjc3IDE3NyA3IDM0IDI0MCAxODMgMTEzIDk3IAorNzAgODMgMjkgNDAgNjcgMTI5IDUzIDczIDc4IDg5IDEyMCA4IDIgMTA5IDI1MiAxOSAzMyAxNjAgMjQ2IDI4OSAxMyA1NCA5NyAxMjYgCis5OSAyNjAgMTExIDE2NyAxNDIgMjg5IDI0NyAzOCAxNTYgNTUgMjIyIDIyIDExNCAyNjMgNTAgMjExIDI4MSAyMjYgMTQyIDcwIDY4IAorMjI0IDIxMiAxNSAyNzQgMjUgMjEwIDE3MSAyNjIgMjQ1IDE3OSAyMTIgMzAgMjA2IDI3MCAxOTUgMjU0IDIzOSA4OCA4MSAyOCAxIDE0NyAKKzY2IDE2NyAxNTcgMjIxIDIwMiAxNTAgNzYgMTU5IDY1IDIxNCAyMjAgMTA3IDI4MSA3IDI1MyAxMjkgMTI0IDU3IDEzNyAxNDUgODAgNjAgCisxMzIgNzggMTYwIDIzMSA2NyA1OCAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMzMgNzQgNDAgMjc1IDI2MiAxNzQgNjggMTUzIDEwMSAyNDYgCisyMTggMTkyIDE1OCA0MSAxNjYgNDcgMjU3IDE1IDI1OSAyMjAgOTIgNTkgNTIgMjY4IDQ2IDIwIDIxNCA3MiAzOSAyMzYgMjgyIDQ2IAorMTA2IDI1NyAyNDkgODAgMjc5IDIxIDE5IDEwNCAyNzEgMTUgNTUgMTM2IDI2OSAxMDAgMjIyIDcgMTgyIDE4IDY1IDEyOCAxNCA5MyAKKzI0MCAyNTQgMjI0IDE1NiAxMjYgNDMgODEgMTcwIDk2IDEwMiA1MSA4NyAxMzQgNjQgMTA0IDI1NiAyMTAgMTAwIDE1MSAxODYgMTIzIAorODkgMTA1IDc2IDE3NCAyODcgNDIgNDIgMTkwIDk1IDE0MCAxNTUgMjM1IDI1OCAxMjUgMjIzIDExNyAyNzMgMjA1IDI0NiAyNzQgODEgCis5OSAxMTIgMjA2IDI4NSAxMjcgMjA5IDYxIDggNTggMjg4IDY2IDI1MyAyMDAgMjM1IDI0MyAxOTMgMTA1IDUgNjMgMjI4IDExMyA4MiAKKzI2NSAyNTUgNDQgMjQ3IDIzIDIyNCAyMjcgMjM3IDEwMiAxMzcgMyAxNDggMTA1IDE0NyAyODUgNTYgOTggMTY1IDI0MiA5OCAyMzYgNjMgCisxNTcgMiAyMyAyMDkgNSAxMTkgMTE3IDIxNyAyNiAxNSAyMDMgNDEgMTUxIDExNSAxMiAxOTMgNDkgMTE2IDEyMiAyODQgMjM2IDcgMjY4IAorNjEgMjQyIDE2OSA1NyAxMjIgMjEzIDEyNSAyMzggNDkgMTAxIDI3IDM5IDI1MSAyMTQgMSAyMTggNTAgNjMgMjEzIDE4MSAxMjcgMTUzIAorNDUgNjcgMTE0IDEyMSAxMTggOTMgNiAxNDMgMTY1IDIyNyAxNjYgMTE4IDc4IDc0IDE4OCA1MyAxNyAxODkgMTQ4IDE3NiAyNTggNTQgCisxMTIgNTggMjE3IDgyIDE5NCAxNDQgMjc1IDE5MSAxNDEgXgorNjI4IDEgMyA5NyAxMzkgMTk0IDIxMSA5MiAyNTAgMTE3IDEzMiAxNDcgMjY3IDI5MCAxMTkgMTQgMjgyIDEzIDExOCAzNyAxMTEgMjAwIAorOTQgNjAgMjE2IDExOSA0NyAyNzAgMTEwIDg1IDIwMyAxNzMgMTU5IDE2IDQzIDE0OCAyNzcgMjc4IDI5IDUgMTIgMjYyIDE1OCA2IDE3NiAKKzExNyAyODYgMTM1IDcyIDI1NyAxNjQgNzYgMjQxIDEwNiAxMDEgMjYxIDE0OCAxOCAyNjYgMjQ3IDE0MyAxNzggMzIgMTE3IDk5IDE1OSAKKzQ5IDMxIDI0NSAxMjMgMzEgMjEyIDEzNSAyMjYgMjQ1IDkwIDQzIDI4NiAyODkgNjAgNjIgMTMxIDI0MiAxMSA2NSAyMyAyNDQgODAgCisxNzYgODQgNiAzOCAxMDUgOTEgMTAyIDIzOCAyNyAxMjMgMjkwIDIyNCAzOCAyNTkgNzkgMTk5IDg0IDE5MyAxNCAxMjggMjUgMjEgMTkxIAorMjM3IDE3IDI1NiAyNTkgMjMzIDE4NyAxMCAxNjAgNTkgMTkgMjc2IDExNCAxNzQgMTY5IDE3NSA3NCAxOCA3IDIzNSA2OSAxNDUgMTk4IAorMTc5IDU4IDI1MiAzMiAyNTUgMTExIDYyIDgyIDI3OCAxODMgMjg1IDIzMCAyMjkgMzIgNjggMTM1IDM5IDI2OSA2NyAyMzAgNzUgNDQgCisyNjMgMTY4IDE2NSA4NiAxMDggMTYgOTIgMTEyIDEwNSA1OCAxMTQgMjAgMTgxIDc4IDEwNyAyNjUgMjM3IDI3NiAyNjggMTYyIDI2NiAKKzE0MiAxMTkgMjAxIDI1OCAzNiA1MiA3NyA2NCAxMTggMTA5IDI2IDgwIDIyIDk2IDgwIDcxIDYwIDI5IDE0MyAyNCA0NCAxOTEgMTMyIAorMTE0IDI3OSAxOTMgMTUyIDE0MCA5OSA1NCAyNSA1NCAxNzkgNDIgMjc2IDkgMTUwIDE5MiAxMDkgMjg1IDkyIDIxNyAxMjkgMzUgMTgwIAorMTAxIDIyOCAxNjAgMjEzIDcgODEgODEgMjE5IDIzMSAxMzQgMTY3IDEgMjMxIDI3MiAxNzkgMTk2IDI2NCAyMjcgMTE3IDIzNyAxNzEgCisyNDQgMTg1IDIwMCA2MSA3MiAxMTkgMTUyIDIgODcgMjcyIDI4NCAyMjAgMjQxIDEgNzcgMjg0IDgyIDIyOSAyMTkgNDQgMTU4IDE0NCAKKzE4OCAyMCAyNyA5MCAxMCA2IDcxIDkzIDE3IDY5IDI4MyAyMTAgODIgOTEgMjA3IDI2MiA0IDE4IDc5IDI3MSAxMjAgNzMgMTEzIDE2NCAKKzE4MSAyNjUgODMgMjg4IDUwIDE5NSAyMjEgMjUxIDI4MSAxMDggMjc1IDEwNCAxODYgMTM4IDE4NCAyMjMgNjEgODggOTUgMTc1IDEwNyAKKzYgMjI1IDgxIDExNCAyMDcgMTU3IDEwMSA0MSAxODQgMTkwIDczIDE2MiAxMjggMTMwIDQ1IDE2OCAxMSA5OCAxMSAxNzAgNDcgMjIxIAorMTQ2IDI1NyAxMzEgODggMjMgMTM5IDU2IDE5OSAxODkgMjE3IDI4MyAyMyAxMDYgNjggMjczIDUxIDUxIDEwMCA2NCAxMyA4NSA0OSAKKzE4NSAyMzMgNDkgMjkwIDI1NyAyNiA2NCA0NiA3MyAyNjcgMTUyIDEwNyAxMTEgMjQ5IDU4IDkgMjg4IDIwNCAxODMgMjYgMjE4IDM0IAorMTcwIDIzNCAxOTcgMTY5IDcwIDUwIDQxIDIzMyAxNTQgMjIgMjM0IDkyIDE0NSA5MyAxNTUgODEgMTg2IDI0MyAyMDggMjAwIDI0OCA0OCAKKzIxIDg2IDIxMyA0MCA2OSAxNzggMTg2IDEwNSAxOTYgMTI2IDIxNSAyMTQgMjA0IDQ1IDE0IDIzIDEgNDQgNCAxNTYgOTEgNTMgMjc0IAorMTk5IDUxIDIwNSA4OCAyODIgMTUxIDEzMCAyMzIgMTQ0IDM0IDMyIDIyMiAxMjMgMTM2IDIzNiAxMTIgMzQgMTM3IDI0NiAxMDAgMzEgCisyNSAxNTkgMjAzIDE5IDE3MSA5MCAxOTcgMjc0IDk0IDI3IDIyOCAyMiAyMDEgMTA0IDQ4IDEyNiAxMTAgMTkwIDIyNyAxNTAgMjI1IDk3IAorOTAgMjMwIDI2MiAyMCAyODYgMTAyIDg0IDM5IDI2IDMxIDU4IDE0NyA4IDI3OCAyMTYgMjczIDM1IDc1IDc3IDI1MSA5NCAxMzIgMjUyIAorMjkxIDI2NyAxODUgOTUgMzcgOTUgMjI0IDcxIDI0NyA1IDE2NiAyNTAgODQgMTQ0IDUwIDggMjQ1IDIyOCA1NSAxODkgMzAgMTUgMTcyIAorMTQ5IDI4IDEzMyAxNTcgMTM0IDI5IDExMCAzNiAyMzkgNTMgODcgMjIzIDI4IDEwMCAxNjkgMzcgNjIgMjM2IDI2NiAyODAgMTMxIDEwNCAKKzI5MSAxNjIgMTYxIDExOCAxNDIgMTQgMTc3IDI4MSAxNDEgMjYzIDMwIDE1MyAxMiA3NSAxODIgMjc1IDcxIDE5OCA0MSA0NiAxNzggCisyOTEgMTI5IDE3MyAxOTIgNCAyNjEgMTE1IDMwIDQ4IDI4MCA5OCAxMTYgMTk0IDI0IDExNiAyMjcgMTIgMjEzIDE5NCA1NyAxMDQgMTUzIAorMTUwIDg3IDg1IDE2IDE5NyAxMzYgODIgMTI0IDE5NSA2NyAyNjMgNjMgMTQxIDEwOSA0MiA1NiA0NSAyMDEgMTIwIDI0IDE0OSAyMTUgCisxMDkgMTgwIDY4IDI0MCA2MyAyNDYgMTMzIDE5IDEyMiAxMjYgMjQ4IDIwMiA5IDE4MyAxODAgMjA2IDI1MiAxMzcgMjc5IDg4IDEyOCAKKzE2MyAzMyAyNjUgMjcwIDI2NCA3MyA4IDE0MCAyMDQgNzggMiAyNDEgNzYgXgorNjIyIDAgODkgMTgzIDExMSAxODAgMzQgODUgNTkgMTU5IDI1NiAxNTQgMjA3IDIxMCAxMTUgNzUgMTAgMTA4IDE2OCA3OCAyMDkgNjggCisxMDMgMTc2IDI2OSAyNzIgNTUgMzUgMTAgNTEgMzMgMzggODcgMzEgMTIzIDI1OCA2OSAzNiAxNzIgMjAyIDE2MSAxNzEgMjc3IDE2OSAzIAorMjIgMjM2IDE3OSAxMDkgOTMgNzAgODMgMjkgMzYgNjcgMTIxIDQ5IDYxIDc0IDg1IDExNiAyIDk3IDI0NCAxMSAzMyAxNjAgMjQ2IDI4NSAKKzEgNDIgODkgMTE4IDg3IDI2MCA5OSAxNTkgMTM0IDI4OSAyNDcgMzggMTUyIDU1IDIyMiAxNCAxMTAgMjU1IDQyIDIxMSAyNzcgMjI2IAorMTM4IDYyIDY0IDIxNiAyMDQgMTEgMjcwIDI1IDIwNiAxNjMgMjU4IDI0MSAxNzEgMjEyIDMwIDE5OCAyNjYgMTk1IDI1NCAyMzkgODQgCis2OSAyOCAyODMgMTQzIDU0IDE2NyAxNTMgMjE3IDE5NCAxNDIgNjQgMTUxIDY1IDIwNiAyMjAgOTkgMjgxIDI5MyAyNDkgMTI1IDExNiAKKzU3IDEzNyAxMzcgNzIgNDggMTI4IDc4IDE1MiAyMjcgNjMgNTQgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDIxIDc0IDI4IDI3NSAyNTQgCisxNzQgNjAgMTQ5IDkzIDI0MiAyMTggMTg0IDE1OCAzNyAxNjIgMzkgMjQ5IDMgMjUxIDIxMiA4MCA1OSA1MiAyNjAgMzQgMjAgMjE0IDYwIAorMjcgMjI4IDI4MiA0NiAxMDYgMjUzIDI0OSA2OCAyNzUgMTcgMTUgMTAwIDI3MSAxNSA0MyAxMzYgMjY5IDEwMCAyMTQgMjg5IDE4MiAxNCAKKzUzIDEyMCAyIDg5IDI0MCAyNDYgMjIwIDE1NiAxMjIgMzkgNzcgMTYyIDk2IDkwIDQzIDc5IDEzNCA2MCA5MiAyNTIgMjAyIDk2IDE0NyAKKzE3OCAxMTkgNzcgOTcgNzIgMTcwIDI4NyAzOCAzMCAxOTAgODMgMTM2IDE0NyAyMzUgMjU0IDExNyAyMTkgMTA5IDI2NSAyMDUgMjM4IAorMjY2IDczIDk1IDEwMCAyMDYgMjg1IDEyMyAyMDEgNDkgMjkwIDUwIDI4MCA2NiAyNTMgMTkyIDIyNyAyMzUgMTg5IDkzIDUgNTkgMjI0IAorMTAxIDc0IDI1NyAyNTEgNDAgMjM5IDE5IDIyNCAyMjMgMjMzIDEwMiAxMjkgMyAxNDQgMTAxIDEzOSAyODEgNTYgOTAgMTY1IDIzOCA5NCAKKzIzMiA1NSAxNTcgMjg0IDExIDIwNSAxIDEwNyAxMTMgMjE3IDIyIDcgMjAzIDI5IDE0MyAxMTEgOCAxOTMgNDUgMTE2IDEyMiAyNzYgCisyMzYgNyAyNjggNTMgMjQyIDE2MSA0OSAxMTggMjA5IDEyNSAyMzggMzcgOTcgMTUgMzUgMjQ3IDIxMCAyODcgMjEwIDUwIDUxIDIwNSAKKzE3MyAxMjcgMTUzIDQ1IDU5IDEwMiAxMjEgMTE0IDg1IDI4OCAxMzUgMTU3IDIxOSAxNjYgMTA2IDY2IDY2IDE4OCA1MyAxMyAxODUgCisxNDggMTY4IDI1MCA1MCAxMDggNDYgMjEzIDcwIDE5MCAxNDAgMjcxIDE4NyA2MyAyOTEgOTcgMTM3IDE5NCAyMDcgODggMjUwIDExNSAKKzEzMiAxNDUgMjYzIDI5MCAxMTUgMTAgMjgwIDkgMTE4IDM3IDEwNSAxOTggOTQgNjAgMjE0IDExNyA0NyAyNjggMTEwIDgzIDIwMSAxNzEgCisxNTUgMTAgNDMgMTQ0IDI3MyAyNzQgMjcgMjkzIDEyIDI2MCAxNTYgMTc0IDExNyAyODQgMTMzIDcwIDI1NSAxNjQgNzYgMjM3IDEwNCAKKzEwMSAyNjEgMTQ2IDE2IDI2MiAyNDMgMTQzIDE3NiAzMiAxMTMgOTUgMTU3IDQ3IDMxIDI0NSAxMjMgMjkgMjA4IDEzNSAyMjIgMjQzIAorODYgNDEgMjg2IDI4NSA1OCA2MiAxMjkgMjQwIDkgNjEgMTcgMjQ0IDc2IDE3MiA4MCAyIDMyIDEwNSA5MSA5OCAyMzQgMjcgMTIxIDI4NiAKKzIyMCAzNCAyNTcgNzkgMTk5IDg0IDE5MSA4IDEyOCAyMSAxNyAxODcgMjM1IDE3IDI1MiAyNTkgMjMxIDE4NyA2IDE1NiA1NyAxNSAyNzIgCisxMTIgMTcwIDE2NSAxNzMgNzAgMTggNSAyMzEgNjUgMTQxIDE5NiAxNzkgNTIgMjUyIDMwIDI1NSAxMDcgNTYgODIgMjc2IDE3OSAyODEgCisyMjggMjI1IDI2IDY2IDEzMSAzMyAyNjcgNjMgMjI2IDczIDM4IDI1OSAxNjYgMTYzIDg2IDEwNiAxNiA5MCAxMDggMTAzIDU0IDExMCAKKzE4IDE3NyA3MiAxMDUgMjYzIDIzMyAyNzQgMjY0IDE1OCAyNjYgMTM4IDExOSAxOTkgMjU2IDMyIDQ4IDcxIDU4IDExMiAxMDUgMjYgNzQgCisyMCA5MiA4MCA2NyA1NiAyNSAxNDEgMjQgNDQgMTkxIDEzMCAxMDggMjc1IDE4OSAxNTAgMTQwIDk5IDUyIDIzIDU0IDE3NSA0MiAyNzYgCis3IDE0NiAxODggMTAzIDI4MyA4NiAyMTMgMTI3IDMxIDE4MCA5OSAyMjQgMTU4IDIwOSAzIDc5IDc3IDIxOSAyMzEgMTMwIDE2NSAxIAorMjI5IDI3MiAxNzcgMTk0IDI2NCAyMjMgMTExIDIzNyAxNjkgMjQwIDE4MSAxOTYgNTcgNzIgMTEzIDE1MiAyOTIgODcgMjY4IDI4MiAKKzIxOCAyNDEgMjkzIDc3IDI4NCA3NiAyMjkgODAgXgorNjM1IDEgNDAgMTUwIDE0MCAxODQgMTIgMjMgNzggMjk0IDIgNjcgOTMgOSA1NyAyODMgMjA2IDc0IDgzIDE5OSAyNTQgNCA2IDY3IDI2MyAKKzEyMCA2MSAxMTMgMTU2IDE4MSAyNTcgNzkgMjg0IDQ2IDE5MSAyMTMgMjUxIDI3MyAxMDAgMjcxIDEwMCAxODYgMTM4IDE4NCAyMjMgNjEgCis3NiA4MyAxNzUgMTA3IDYgMjE3IDgxIDExNCAyMDcgMTQ5IDg5IDI5IDE4MCAxODIgNzMgMTU4IDEyMCAxMjIgMzcgMTYwIDExIDk4IAorMjk1IDE2MiAzNSAyMjEgMTQ2IDI0OSAxMjMgODggMTkgMTM5IDQ4IDE5MSAxODkgMjEzIDI3NSAxNSA5OCA2MCAyNzMgMzkgNTEgOTYgCis2MCAxIDc3IDQ5IDE4MSAyMzMgNDEgMjg2IDI1NyAxOCA2NCA0MiA2NSAyNjMgMTQ0IDk5IDExMSAyNDEgNTggMSAyODggMTk2IDE3OSAKKzIyIDIxNCAzMCAxNzAgMjI2IDE5NyAxNjkgNjYgNDIgNDEgMjI1IDE0NiAxNCAyMzQgOTIgMTQ1IDg5IDE1NSA2OSAxNzggMjQzIDIwOCAKKzIwMCAyNDQgNDggMjEgNzggMjA5IDQwIDY1IDE3OCAxODIgOTcgMTk2IDExOCAyMDcgMjEwIDIwMCAzMyAxMCAyMyAyODkgMzYgMTUyIAorNzkgNDkgMjY2IDE5NSA0MyAyMDEgODQgMjc0IDE1MSAxMzAgMjI4IDEzNiAzNCAyNCAyMTQgMTE1IDEzMiAyMjggMTEyIDI5MiAyNiAKKzEyOSAyMzggOTIgMTkgMTMgMTU5IDE5NSAxOSAxNjMgODYgMTg5IDI3NCA5MCAxOSAyMjQgMTAgMTkzIDEwNCA0MCAxMjYgMTAyIDE4NiAKKzIyMyAxNDYgMjI1IDg1IDkwIDIzMCAyNjIgOCAyNzggOTAgODAgMzkgMTQgMjMgNTQgMTQ3IDQgMjc4IDIxNiAyNjUgMzUgNzUgNzMgCisyNDMgODIgMTI0IDI0OCAyODMgMjY3IDE4NSA4NyAyOSA5NSAyMjAgNzEgMjQzIDI5MyAxNjIgMjQ2IDcyIDE0NCAzOCAyMzcgMjI4IDUxIAorMTgxIDIyIDMgMjg4IDE3MiAxNDEgMjQgMTI5IDE1MyAxMzAgMTcgOTggMzYgMjM1IDQxIDc1IDIxOSAyMCA4OCAxNjUgMjUgNTQgMjMyIAorMjYyIDI4MCAxMzEgOTIgMjkxIDE2MiAxNjEgMTEwIDE0MiAxNCAxNzMgMjc3IDE0MSAyNTkgMTggMTQ5IDQgNjcgMTc4IDI2NyA1OSAKKzE5OCAzMyAzNCAxNzAgMjg3IDEyMSAxNzMgMTkyIDI4OCAyNTcgMTAzIDI2IDQ0IDI3NiA5MCAxMDQgMTg2IDEyIDEwOCAyMjcgMjEzIAorMTkwIDUzIDk2IDE0NSAxNTAgNzkgNzMgOCAxOTMgMTI4IDc4IDEyNCAxODcgNjMgMjYzIDU5IDEzNyAxMDkgMzAgNDQgNDEgMjAxIDEwOCAKKzE2IDE0OSAyMTUgMTA1IDE3NiA1NiAyMzIgNTEgMjQyIDEzMyA3IDExOCAxMjIgMjQ4IDE5OCA5IDE4MyAxNzIgMjAyIDI0NCAxMzMgCisyNzkgODAgMTI0IDE2MyAyNSAyNjUgMjcwIDI2MCA2OSA4IDEzMiAyMDQgNzQgMjk0IDIzNyAyNTIgODkgMTc5IDEwNyAxNzYgMzIgODUgCis1MyAxNTcgMjU2IDE1NCAyMDUgMjEwIDExNSA3MSA4IDEwOCAxNjYgNzYgMjA5IDY0IDEwMyAxNzYgMjY3IDI3MCA0OSAzMSAxMCA0NyAKKzMxIDM0IDg1IDI5IDExOSAyNTggNjkgMzIgMTcwIDIwMiAxNTkgMTcxIDI3NyAxNjUgMSAxNiAyMzQgMTc3IDEwNyA5MSA3MCA4MyAyOSAKKzM0IDY3IDExNyA0NyA1NSA3MiA4MyAxMTQgMjkyIDIgOTEgMjQwIDcgMzMgMTYwIDI0NiAyODMgMjkxIDM2IDg1IDExNCA4MSAyNjAgOTMgCisxNTUgMTMwIDI4OSAyNDcgMzggMTUwIDU1IDIyMiAxMCAxMDggMjUxIDM4IDIxMSAyNzUgMjI2IDEzNiA1OCA2MiAyMTIgMjAwIDkgMjY4IAorMjUgMjA0IDE1OSAyNTYgMjM5IDE2NyAyMTIgMzAgMTk0IDI2NCAxOTUgMjU0IDIzOSA4MiA2MyAyOCAyNzkgMTQxIDQ4IDE2NyAxNTEgCisyMTUgMTkwIDEzOCA1OCAxNDcgNjUgMjAyIDIyMCA5NSAyODEgMjkxIDI0NyAxMjMgMTEyIDU3IDEzNyAxMzMgNjggNDIgMTI2IDc4IAorMTQ4IDIyNSA2MSA1MiAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMTUgNzQgMjIgMjc1IDI1MCAxNzQgNTYgMTQ3IDg5IDI0MCAyMTggMTgwIAorMTU4IDM1IDE2MCAzNSAyNDUgMjkzIDI0NyAyMDggNzQgNTkgNTIgMjU2IDI4IDIwIDIxNCA1NCAyMSAyMjQgMjgyIDQ2IDEwNiAyNTEgCisyNDkgNjIgMjczIDE1IDEzIDk4IDI3MSAxNSAzNyAxMzYgMjY5IDEwMCAyMTAgMjg1IDE4MiAxMiA0NyAxMTYgMjkyIDg3IDI0MCAyNDIgCisyMTggMTU2IDEyMCAzNyA3NSAxNTggOTYgODQgMzkgNzUgMTM0IDU4IDg2IDI1MCAxOTggOTQgMTQ1IDE3NCAxMTcgNzEgOTMgNzAgMTY4IAorMjg3IDM2IDI0IDE5MCA3NyAxMzQgMTQzIDIzNSAyNTIgMTEzIDIxNyAxMDUgMjYxIDIwNSAyMzQgMjYyIDY5IDkzIDk0IDIwNiAyODUgCisxMjEgMTk3IDQzIDI4NiA0NiAyNzYgNjYgMjUzIDE4OCAyMjMgMjMxIDE4NyA4NyA1IDU3IDIyMiA5NSAyODUgXgorNjM2IDAgMjUxIDI0OCAzNyAyMzMgMTYgMjI0IDIyMCAyMzAgMTAyIDEyMyAzIDE0MSA5OCAxMzMgMjc4IDU2IDg0IDE2NSAyMzUgOTEgCisyMjkgNDkgMTU3IDI3OCAyIDIwMiAyOTUgOTggMTEwIDIxNyAxOSAxIDIwMyAyMCAxMzcgMTA4IDUgMTkzIDQyIDExNiAxMjIgMjcwIAorMjM2IDcgMjY4IDQ3IDI0MiAxNTUgNDMgMTE1IDIwNiAxMjUgMjM4IDI4IDk0IDYgMzIgMjQ0IDIwNyAyODQgMjA0IDUwIDQyIDE5OSAKKzE2NyAxMjcgMTUzIDQ1IDUzIDkzIDEyMSAxMTEgNzkgMjgyIDEyOSAxNTEgMjEzIDE2NiA5NyA1NyA2MCAxODggNTMgMTAgMTgyIDE0OCAKKzE2MiAyNDQgNDcgMTA1IDM3IDIxMCA2MSAxODcgMTM3IDI2OCAxODQgNjMgMjg1IDk3IDEzNCAxOTQgMjAxIDgyIDI1MCAxMTIgMTMyIAorMTQyIDI1NyAyOTAgMTA5IDQgMjc3IDMgMTE4IDM3IDk2IDE5NSA5NCA2MCAyMTEgMTE0IDQ3IDI2NSAxMTAgODAgMTk4IDE2OCAxNDkgMSAKKzQzIDEzOCAyNjcgMjY4IDI0IDI4NyAxMiAyNTcgMTUzIDI4OCAxNzEgMTE3IDI4MSAxMzAgNjcgMjUyIDE2NCA3NiAyMzEgMTAxIDEwMSAKKzI2MSAxNDMgMTMgMjU2IDIzNyAxNDMgMTczIDMyIDEwNyA4OSAxNTQgNDQgMzEgMjQ1IDEyMyAyNiAyMDIgMTM1IDIxNiAyNDAgODAgMzggCisyODYgMjc5IDU1IDYyIDEyNiAyMzcgNiA1NSA4IDI0NCA3MCAxNjYgNzQgMjkzIDIzIDEwNSA5MSA5MiAyMjggMjcgMTE4IDI4MCAyMTQgCisyOCAyNTQgNzkgMTk5IDg0IDE4OCAyOTYgMTI4IDE1IDExIDE4MSAyMzIgMTcgMjQ2IDI1OSAyMjggMTg3IDE1MCA1NCA5IDI2NiAxMDkgCisxNjQgMTU5IDE3MCA2NCAxOCAyIDIyNSA1OSAxMzUgMTkzIDE3OSA0MyAyNTIgMjcgMjU1IDEwMSA0NyA4MiAyNzMgMTczIDI3NSAyMjUgCisyMTkgMTcgNjMgMTI1IDI0IDI2NCA1NyAyMjAgNzAgMjkgMjUzIDE2MyAxNjAgODYgMTAzIDE2IDg3IDEwMiAxMDAgNDggMTA0IDE1IAorMTcxIDYzIDEwMiAyNjAgMjI3IDI3MSAyNTggMTUyIDI2NiAxMzIgMTE5IDE5NiAyNTMgMjYgNDIgNjIgNDkgMTAzIDk5IDI2IDY1IDE3IAorODYgODAgNjEgNTAgMTkgMTM4IDI0IDQ0IDE5MSAxMjcgOTkgMjY5IDE4MyAxNDcgMTQwIDk5IDQ5IDIwIDU0IDE2OSA0MiAyNzYgNCAKKzE0MCAxODIgOTQgMjgwIDc3IDIwNyAxMjQgMjUgMTgwIDk2IDIxOCAxNTUgMjAzIDI5NCA3NiA3MSAyMTkgMjMxIDEyNCAxNjIgMSAyMjYgCisyNzIgMTc0IDE5MSAyNjQgMjE3IDEwMiAyMzcgMTY2IDIzNCAxNzUgMTkwIDUxIDcyIDEwNCAxNTIgMjg5IDg3IDI2MiAyNzkgMjE1IAorMjQxIDI5MyA3NyAyODQgNjcgMjI5IDIwOSAzOSAxNDggMTM5IDE4MyAxMCAyMiA3NSAyOTIgMSA2NiA5MyA3IDU0IDI4MyAyMDUgNzIgCis4MSAxOTcgMjUyIDQgMyA2NCAyNjEgMTIwIDU4IDExMyAxNTQgMTgxIDI1NSA3OCAyODMgNDUgMTkwIDIxMSAyNTEgMjcxIDk4IDI3MCAKKzk5IDE4NiAxMzggMTg0IDIyMyA2MSA3MyA4MCAxNzUgMTA3IDYgMjE1IDgxIDExNCAyMDcgMTQ3IDg2IDI2IDE3OSAxODAgNzMgMTU3IAorMTE4IDEyMCAzNSAxNTggMTEgOTggMjkzIDE2MCAzMiAyMjEgMTQ2IDI0NyAxMjEgODggMTggMTM5IDQ2IDE4OSAxODkgMjEyIDI3MyAxMyAKKzk2IDU4IDI3MyAzNiA1MSA5NSA1OSAyOTUgNzUgNDkgMTgwIDIzMyAzOSAyODUgMjU3IDE2IDY0IDQxIDYzIDI2MiAxNDIgOTcgMTExIAorMjM5IDU4IDI5NiAyODggMTk0IDE3OCAyMSAyMTMgMjkgMTcwIDIyNCAxOTcgMTY5IDY1IDQwIDQxIDIyMyAxNDQgMTIgMjM0IDkyIDE0NSAKKzg4IDE1NSA2NiAxNzYgMjQzIDIwOCAyMDAgMjQzIDQ4IDIxIDc2IDIwOCA0MCA2NCAxNzggMTgxIDk1IDE5NiAxMTYgMjA1IDIwOSAxOTkgCiszMCA5IDIzIDI4OCAzNCAyOTYgMTUxIDc2IDQ4IDI2NCAxOTQgNDEgMjAwIDgzIDI3MiAxNTEgMTMwIDIyNyAxMzQgMzQgMjIgMjEyIAorMTEzIDEzMSAyMjYgMTEyIDI5MiAyNCAxMjcgMjM2IDkwIDE2IDEwIDE1OSAxOTMgMTkgMTYxIDg1IDE4NyAyNzQgODkgMTcgMjIzIDcgCisxOTEgMTA0IDM4IDEyNiAxMDAgMTg1IDIyMiAxNDUgMjI1IDgyIDkwIDIzMCAyNjIgNSAyNzYgODcgNzkgMzkgMTEgMjEgNTMgMTQ3IDMgCisyNzggMjE2IDI2MyAzNSA3NSA3MiAyNDEgNzkgMTIyIDI0NyAyODEgMjY3IDE4NSA4NSAyNyA5NSAyMTkgNzEgMjQyIDI5MiAxNjEgMjQ1IAorNjkgMTQ0IDM1IDI5NSAyMzUgMjI4IDUwIDE3OSAyMCAyODcgMTcyIDEzOSAyMyAxMjggMTUyIDEyOSAxNCA5NSAzNiAyMzQgMzggNzIgCisyMTggMTggODUgMTY0IDIyIDUyIDIzMSAyNjEgMjgwIDEzMSA4OSAyOTEgMTYyIDE2MSAxMDggMTQyIDE0IDE3MiAyNzYgOTEgXgorNjM1IDEgMjU2IDkgMTQ2IDI5NyA2MSAxNzUgMjYxIDUwIDE5OCAyNyAyNSAxNjQgMjg0IDExNSAxNzMgMTkyIDI4MiAyNTQgOTQgMjMgCis0MSAyNzMgODQgOTUgMTgwIDMgMTAyIDIyNyAyOTAgMjEzIDE4NyA1MCA5MCAxMzkgMTUwIDczIDY0IDIgMTkwIDEyMiA3NSAxMjQgMTgxIAorNjAgMjYzIDU2IDEzNCAxMDkgMjEgMzUgMzggMjAxIDk5IDEwIDE0OSAyMTUgMTAyIDE3MyA0NyAyMjYgNDIgMjM5IDEzMyAyOTcgMTE1IAorMTE5IDI0OCAxOTUgOSAxODMgMTY2IDE5OSAyMzggMTMwIDI3OSA3NCAxMjEgMTYzIDE5IDI2NSAyNzAgMjU3IDY2IDggMTI2IDIwNCA3MSAKKzI5NCAyMzQgMjQ2IDg5IDE3MyAxMDEgMTcwIDI5IDg1IDQ0IDE1NCAyNTYgMTU0IDIwMiAyMTAgMTE1IDY1IDUgMTA4IDE2MyA3MyAyMDkgCis1OCAxMDMgMTc2IDI2NCAyNjcgNDAgMjUgMTAgNDEgMjggMjggODIgMjYgMTEzIDI1OCA2OSAyNiAxNjcgMjAyIDE1NiAxNzEgMjc3IAorMTU5IDI5NyA3IDIzMSAxNzQgMTA0IDg4IDcwIDgzIDI5IDMxIDY3IDExMSA0NCA0NiA2OSA4MCAxMTEgMjg5IDIgODIgMjM0IDEgMzMgCisxNjAgMjQ2IDI4MCAyODUgMjcgNzkgMTA4IDcyIDI2MCA4NCAxNDkgMTI0IDI4OSAyNDcgMzggMTQ3IDU1IDIyMiA0IDEwNSAyNDUgMzIgCisyMTEgMjcyIDIyNiAxMzMgNTIgNTkgMjA2IDE5NCA2IDI2NSAyNSAyMDEgMTUzIDI1MyAyMzYgMTYxIDIxMiAzMCAxODggMjYxIDE5NSAKKzI1NCAyMzkgNzkgNTQgMjggMjczIDEzOCAzOSAxNjcgMTQ4IDIxMiAxODQgMTMyIDQ5IDE0MSA2NSAxOTYgMjIwIDg5IDI4MSAyODggCisyNDQgMTIwIDEwNiA1NyAxMzcgMTI3IDYyIDMzIDEyMyA3OCAxNDIgMjIyIDU4IDQ5IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCA2IDc0IDEzIAorMjc1IDI0NCAxNzQgNTAgMTQ0IDgzIDIzNyAyMTggMTc0IDE1OCAzMiAxNTcgMjkgMjM5IDI4NyAyNDEgMjAyIDY1IDU5IDUyIDI1MCAxOSAKKzIwIDIxNCA0NSAxMiAyMTggMjgyIDQ2IDEwNiAyNDggMjQ5IDUzIDI3MCAxMiAxMCA5NSAyNzEgMTUgMjggMTM2IDI2OSAxMDAgMjA0IAorMjc5IDE4MiA5IDM4IDExMCAyODYgODQgMjQwIDIzNiAyMTUgMTU2IDExNyAzNCA3MiAxNTIgOTYgNzUgMzMgNjkgMTM0IDU1IDc3IDI0NyAKKzE5MiA5MSAxNDIgMTY4IDExNCA2MiA4NyA2NyAxNjUgMjg3IDMzIDE1IDE5MCA2OCAxMzEgMTM3IDIzNSAyNDkgMTA3IDIxNCA5OSAyNTUgCisyMDUgMjI4IDI1NiA2MyA5MCA4NSAyMDYgMjg1IDExOCAxOTEgMzQgMjgwIDQwIDI3MCA2NiAyNTMgMTgyIDIxNyAyMjUgMTg0IDc4IDUgCis1NCAyMTkgODYgNjQgMjQ3IDI0NiAzNSAyMjkgMTQgMjI0IDIxOCAyMjggMTAyIDExOSAzIDEzOSA5NiAxMjkgMjc2IDU2IDgwIDE2NSAKKzIzMyA4OSAyMjcgNDUgMTU3IDI3NCAyOTUgMjAwIDI5NSA5MiAxMDggMjE3IDE3IDI5NiAyMDMgMTQgMTMzIDEwNiAzIDE5MyA0MCAxMTYgCisxMjIgMjY2IDIzNiA3IDI2OCA0MyAyNDIgMTUxIDM5IDExMyAyMDQgMTI1IDIzOCAyMiA5MiAzMCAyNDIgMjA1IDI4MiAyMDAgNTAgMzYgCisxOTUgMTYzIDEyNyAxNTMgNDUgNDkgODcgMTIxIDEwOSA3NSAyNzggMTI1IDE0NyAyMDkgMTY2IDkxIDUxIDU2IDE4OCA1MyA4IDE4MCAKKzE0OCAxNTggMjQwIDQ1IDEwMyAzMSAyMDggNTUgMTg1IDEzNSAyNjYgMTgyIDYzIDI4MSA5NyAxMzIgMTk0IDE5NyA3OCAyNTAgMTEwIAorMTMyIDE0MCAyNTMgMjkwIDEwNSAyNzUgMjk4IDExOCAzNyA5MCAxOTMgOTQgNjAgMjA5IDExMiA0NyAyNjMgMTEwIDc4IDE5NiAxNjYgCisxNDUgMjk0IDQzIDEzNCAyNjMgMjY0IDIyIDI4MyAxMiAyNTUgMTUxIDI4NCAxNjkgMTE3IDI3OSAxMjggNjUgMjUwIDE2NCA3NiAyMjcgCis5OSAxMDEgMjYxIDE0MSAxMSAyNTIgMjMzIDE0MyAxNzEgMzIgMTAzIDg1IDE1MiA0MiAzMSAyNDUgMTIzIDI0IDE5OCAxMzUgMjEyIAorMjM4IDc2IDM2IDI4NiAyNzUgNTMgNjIgMTI0IDIzNSA0IDUxIDIgMjQ0IDY2IDE2MiA3MCAyOTEgMTcgMTA1IDkxIDg4IDIyNCAyNyAKKzExNiAyNzYgMjEwIDI0IDI1MiA3OSAxOTkgODQgMTg2IDI5MiAxMjggMTEgNyAxNzcgMjMwIDE3IDI0MiAyNTkgMjI2IDE4NyAyOTUgCisxNDYgNTIgNSAyNjIgMTA3IDE2MCAxNTUgMTY4IDYwIDE4IDIyMSA1NSAxMzEgMTkxIDE3OSAzNyAyNTIgMjUgMjU1IDk3IDQxIDgyIAorMjcxIDE2OSAyNzEgMjIzIDIxNSAxMSA2MSAxMjEgMTggMjYyIDUzIDIxNiA2OCAyMyAyNDkgMTYxIDE1OCA4NiAxMDEgMTYgODUgOTggCis5OCA0NCAxMDAgMTMgMTY3IDU3IDEwMCAyNTggMjIzIDI2OSAyNTQgMTQ4IDI2NiAxMjggMTE5IDE5NCAyNTEgMjIgMzggNTYgNDMgMjc1IAorXgorNjQyIDAgOTEgMjYgNTMgMTMgNzggODAgNTMgNDIgMTEgMTM0IDI0IDQ0IDE5MSAxMjMgODcgMjYxIDE3NSAxNDMgMTQwIDk5IDQ1IDE2IAorNTQgMTYxIDQyIDI3NiAxMzIgMTc0IDgyIDI3NiA2NSAxOTkgMTIwIDE3IDE4MCA5MiAyMTAgMTUxIDE5NSAyOTAgNzIgNjMgMjE5IDIzMSAKKzExNiAxNTggMSAyMjIgMjcyIDE3MCAxODcgMjY0IDIwOSA5MCAyMzcgMTYyIDIyNiAxNjcgMTgyIDQzIDcyIDkyIDE1MiAyODUgODcgCisyNTQgMjc1IDIxMSAyNDEgMjkzIDc3IDI4NCA1NSAyMjkgMjAxIDM1IDE0MCAxMzUgMTc5IDIgMTggNjMgMjg0IDI5OCA2MiA5MyAzMDAgCis0MiAyODMgMjAxIDY0IDczIDE4OSAyNDQgNCAyOTIgNTIgMjUzIDEyMCA0NiAxMTMgMTQ2IDE4MSAyNDcgNzQgMjc5IDQxIDE4NiAyMDMgCisyNTEgMjYzIDkwIDI2NiA5NSAxODYgMTM4IDE4NCAyMjMgNjEgNjEgNjggMTc1IDEwNyA2IDIwNyA4MSAxMTQgMjA3IDEzOSA3NCAxNCAKKzE3NSAxNzIgNzMgMTUzIDExMCAxMTIgMjcgMTUwIDExIDk4IDI4NSAxNTIgMjAgMjIxIDE0NiAyMzkgMTEzIDg4IDE0IDEzOSAzOCAxODEgCisxODkgMjA4IDI2NSA1IDg4IDUwIDI3MyAyNCA1MSA5MSA1NSAyODcgNjcgNDkgMTc2IDIzMyAzMSAyODEgMjU3IDggNjQgMzcgNTUgMjU4IAorMTM0IDg5IDExMSAyMzEgNTggMjkyIDI4OCAxODYgMTc0IDE3IDIwOSAyNSAxNzAgMjE2IDE5NyAxNjkgNjEgMzIgNDEgMjE1IDEzNiA0IAorMjM0IDkyIDE0NSA4NCAxNTUgNTQgMTY4IDI0MyAyMDggMjAwIDIzOSA0OCAyMSA2OCAyMDQgNDAgNjAgMTc4IDE3NyA4NyAxOTYgMTA4IAorMTk3IDIwNSAxOTUgMTggNSAyMyAyODQgMjYgMjk2IDE0NyA2NCA0NCAyNTYgMTkwIDMzIDE5NiA3OSAyNjQgMTUxIDEzMCAyMjMgMTI2IAorMzQgMTQgMjA0IDEwNSAxMjcgMjE4IDExMiAyOTIgMTYgMTE5IDIyOCA4MiA0IDI5OSAxNTkgMTg1IDE5IDE1MyA4MSAxNzkgMjc0IDg1IAorOSAyMTkgMjk2IDE4MyAxMDQgMzAgMTI2IDkyIDE4MSAyMTggMTQxIDIyNSA3MCA5MCAyMzAgMjYyIDI5NCAyNjggNzUgNzUgMzkgMzAwIAorMTMgNDkgMTQ3IDMwMCAyNzggMjE2IDI1NSAzNSA3NSA2OCAyMzMgNjcgMTE0IDI0MyAyNzMgMjY3IDE4NSA3NyAxOSA5NSAyMTUgNzEgCisyMzggMjg4IDE1NyAyNDEgNTcgMTQ0IDIzIDI5MSAyMjcgMjI4IDQ2IDE3MSAxMiAyODkgMjgzIDE3MiAxMzEgMTkgMTI0IDE0OCAxMjUgCisyIDgzIDM2IDIzMCAyNiA2MCAyMTQgMTAgNzMgMTYwIDEwIDQ0IDIyNyAyNTcgMjgwIDEzMSA3NyAyOTEgMTYyIDE2MSAxMDAgMTQyIDE0IAorMTY4IDI3MiAxNDEgMjU0IDMgMTQ0IDI5NSA1NyAxNzMgMjU3IDQ0IDE5OCAyMyAxOSAxNjAgMjgyIDExMSAxNzMgMTkyIDI3OCAyNTIgCis4OCAyMSAzOSAyNzEgODAgODkgMTc2IDI5OCA5OCAyMjcgMjg2IDIxMyAxODUgNDggODYgMTM1IDE1MCA2OSA1OCAyOTkgMTg4IDExOCAKKzczIDEyNCAxNzcgNTggMjYzIDU0IDEzMiAxMDkgMTUgMjkgMzYgMjAxIDkzIDYgMTQ5IDIxNSAxMDAgMTcxIDQxIDIyMiAzNiAyMzcgCisxMzMgMjkzIDExMyAxMTcgMjQ4IDE5MyA5IDE4MyAxNjIgMTk3IDIzNCAxMjggMjc5IDcwIDExOSAxNjMgMTUgMjY1IDI3MCAyNTUgNjQgCis4IDEyMiAyMDQgNjkgMjk0IDIzMiAyNDIgODkgMTY5IDk3IDE2NiAyNyA4NSAzOCAxNTIgMjU2IDE1NCAyMDAgMjEwIDExNSA2MSAzIAorMTA4IDE2MSA3MSAyMDkgNTQgMTAzIDE3NiAyNjIgMjY1IDM0IDIxIDEwIDM3IDI2IDI0IDgwIDI0IDEwOSAyNTggNjkgMjIgMTY1IDIwMiAKKzE1NCAxNzEgMjc3IDE1NSAyOTcgMSAyMjkgMTcyIDEwMiA4NiA3MCA4MyAyOSAyOSA2NyAxMDcgNDIgNDAgNjcgNzggMTA5IDI4NyAyIAorNzYgMjMwIDI5OCAzMyAxNjAgMjQ2IDI3OCAyODEgMjEgNzUgMTA0IDY2IDI2MCA3OCAxNDUgMTIwIDI4OSAyNDcgMzggMTQ1IDU1IDIyMiAKKzEwMyAyNDEgMjggMjExIDI3MCAyMjYgMTMxIDQ4IDU3IDIwMiAxOTAgNCAyNjMgMjUgMTk5IDE0OSAyNTEgMjM0IDE1NyAyMTIgMzAgCisxODQgMjU5IDE5NSAyNTQgMjM5IDc3IDQ4IDI4IDI2OSAxMzYgMzMgMTY3IDE0NiAyMTAgMTgwIDEyOCA0MyAxMzcgNjUgMTkyIDIyMCAKKzg1IDI4MSAyODYgMjQyIDExOCAxMDIgNTcgMTM3IDEyMyA1OCAyNyAxMjEgNzggMTM4IDIyMCA1NiA0NyAyMzIgMTc3IDIyIDEyOSA2OCAKKzE2OCA3NCA3IDI3NSAyNDAgMTc0IDQ2IDE0MiA3OSAyMzUgMjE4IDE3MCAxNTggMzAgMTU1IDI1IDIzNSAyODMgMjM3IDE5OCA1OSA1OSAKKzUyIDI0NiAxMyAyMCAyMTQgMzkgNiAyMTQgMjgyIDQ2IDEwNiAyNDYgMjQ5IDQ3IDI2OCAxMCA4IDkzIDI3MSAxNSAyMiAxMzYgMjY5IAorMTAwIDIwMCAyNzUgNDIgXgorNjQ0IDAgNiAyOSAxMDQgMjgwIDgxIDI0MCAyMzAgMjEyIDE1NiAxMTQgMzEgNjkgMTQ2IDk2IDY2IDI3IDYzIDEzNCA1MiA2OCAyNDQgCisxODYgODggMTM5IDE2MiAxMTEgNTMgODEgNjQgMTYyIDI4NyAzMCA2IDE5MCA1OSAxMjggMTMxIDIzNSAyNDYgMTAxIDIxMSA5MyAyNDkgCisyMDUgMjIyIDI1MCA1NyA4NyA3NiAyMDYgMjg1IDExNSAxODUgMjUgMjc0IDM0IDI2NCA2NiAyNTMgMTc2IDIxMSAyMTkgMTgxIDY5IDUgCis1MSAyMTYgNzcgNTggMjQxIDI0MyAzMiAyMjMgMTEgMjI0IDIxNSAyMjUgMTAyIDExMyAzIDEzNiA5MyAxMjMgMjczIDU2IDc0IDE2NSAKKzIzMCA4NiAyMjQgMzkgMTU3IDI2OCAyODkgMTk3IDI5NSA4MyAxMDUgMjE3IDE0IDI5MyAyMDMgNSAxMjcgMTAzIDE5MyAzNyAxMTYgCisxMjIgMjYwIDIzNiA3IDI2OCAzNyAyNDIgMTQ1IDMzIDExMCAyMDEgMTI1IDIzOCAxMyA4OSAyOTMgMjcgMjM5IDIwMiAyNzkgMTk0IDUwIAorMjcgMTg5IDE1NyAxMjcgMTUzIDQ1IDQzIDc4IDEyMSAxMDYgNjkgMjcyIDExOSAxNDEgMjAzIDE2NiA4MiA0MiA1MCAxODggNTMgNSAKKzE3NyAxNDggMTUyIDIzNCA0MiAxMDAgMjIgMjA1IDQ2IDE4MiAxMzIgMjYzIDE3OSA2MyAyNzUgOTcgMTI5IDE5NCAxOTEgNzIgMjUwIAorMTA3IDEzMiAxMzcgMjQ3IDI5MCA5OSAyOTYgMjcyIDI5NSAxMTggMzcgODEgMTkwIDk0IDYwIDIwNiAxMDkgNDcgMjYwIDExMCA3NSAKKzE5MyAxNjMgMTM5IDI4OCA0MyAxMjggMjU3IDI1OCAxOSAyNzcgMTIgMjUyIDE0OCAyNzggMTY2IDExNyAyNzYgMTI1IDYyIDI0NyAxNjQgCis3NiAyMjEgOTYgMTAxIDI2MSAxMzggOCAyNDYgMjI3IDE0MyAxNjggMzIgOTcgNzkgMTQ5IDM5IDMxIDI0NSAxMjMgMjEgMTkyIDEzNSAKKzIwNiAyMzUgNzAgMzMgMjg2IDI2OSA1MCA2MiAxMjEgMjMyIDEgNDUgMjk1IDI0NCA2MCAxNTYgNjQgMjg4IDggMTA1IDkxIDgyIDIxOCAKKzI3IDExMyAyNzAgMjA0IDE4IDI0OSA3OSAxOTkgODQgMTgzIDI4NiAxMjggNSAxIDE3MSAyMjcgMTcgMjM2IDI1OSAyMjMgMTg3IDI5MiAKKzE0MCA0OSAzMDEgMjU2IDEwNCAxNTQgMTQ5IDE2NSA1NCAxOCAyOTkgMjE1IDQ5IDEyNSAxODggMTc5IDI4IDI1MiAyMiAyNTUgOTEgMzIgCis4MiAyNjggMTYzIDI2NSAyMjAgMjA5IDIgNTggMTE1IDkgMjU5IDQ3IDIxMCA2NSAxNCAyNDMgMTU4IDE1NSA4NiA5OCAxNiA4MiA5MiAKKzk1IDM4IDk0IDEwIDE2MSA0OCA5NyAyNTUgMjE3IDI2NiAyNDggMTQyIDI2NiAxMjIgMTE5IDE5MSAyNDggMTYgMzIgNDcgMzQgODggODkgCisyNiA1MCAxMiA3NiA4MCA1MSA0MCA5IDEzMyAyNCA0NCAxOTEgMTIyIDg0IDI1OSAxNzMgMTQyIDE0MCA5OSA0NCAxNSA1NCAxNTkgNDIgCisyNzYgMzAxIDEzMCAxNzIgNzkgMjc1IDYyIDE5NyAxMTkgMTUgMTgwIDkxIDIwOCAxNTAgMTkzIDI4OSA3MSA2MSAyMTkgMjMxIDExNCAKKzE1NyAxIDIyMSAyNzIgMTY5IDE4NiAyNjQgMjA3IDg3IDIzNyAxNjEgMjI0IDE2NSAxODAgNDEgNzIgODkgMTUyIDI4NCA4NyAyNTIgCisyNzQgMjEwIDI0MSAyOTMgNzcgMjg0IDUyIDIyOSAxOTkgMzQgMTM4IDEzNCAxNzggMTcgNjAgMjgyIDI5OCA2MSA5MyAyOTkgMzkgMjgzIAorMjAwIDYyIDcxIDE4NyAyNDIgNCAyOTAgNDkgMjUxIDEyMCA0MyAxMTMgMTQ0IDE4MSAyNDUgNzMgMjc4IDQwIDE4NSAyMDEgMjUxIDI2MSAKKzg4IDI2NSA5NCAxODYgMTM4IDE4NCAyMjMgNjEgNTggNjUgMTc1IDEwNyA2IDIwNSA4MSAxMTQgMjA3IDEzNyA3MSAxMSAxNzQgMTcwIAorNzMgMTUyIDEwOCAxMTAgMjUgMTQ4IDExIDk4IDI4MyAxNTAgMTcgMjIxIDE0NiAyMzcgMTExIDg4IDEzIDEzOSAzNiAxNzkgMTg5IDIwNyAKKzI2MyAzIDg2IDQ4IDI3MyAyMSA1MSA5MCA1NCAyODUgNjUgNDkgMTc1IDIzMyAyOSAyODAgMjU3IDYgNjQgMzYgNTMgMjU3IDEzMiA4NyAKKzExMSAyMjkgNTggMjkxIDI4OCAxODQgMTczIDE2IDIwOCAyNCAxNzAgMjE0IDE5NyAxNjkgNjAgMzAgNDEgMjEzIDEzNCAyIDIzNCA5MiAKKzE0NSA4MyAxNTUgNTEgMTY2IDI0MyAyMDggMjAwIDIzOCA0OCAyMSA2NiAyMDMgNDAgNTkgMTc4IDE3NiA4NSAxOTYgMTA2IDE5NSAyMDQgCisxOTQgMTUgNCAyMyAyODMgMjQgMjk2IDE0NiA2MSA0MyAyNTQgMTg5IDMxIDE5NSA3OCAyNjIgMTUxIDEzMCAyMjIgMTI0IDM0IDEyIAorMjAyIDEwMyAxMjYgMjE2IDExMiAyOTIgMTQgMTE3IDIyNiA4MCAxIDI5NyAxNTkgMTgzIDE5IDE1MSA4MCAxNzcgMjc0IDg0IDcgMjE4IAorMjk0IDE4MSAxMDQgMjggMTI2IDkwIDE4MCAyMTcgMTQwIDIyNSA2NyA5MCAyMzAgMjYyIDI5MiAyNjYgNzIgNzQgMzkgMjk4IDExIDQ4IAorMTQ3IDMwMCAyNzggMjE2IDI1MyAyNjUgXgorNjM4IDEgNzUgNjUgMjI3IDU4IDEwOCAyNDAgMjY3IDI2NyAxODUgNzEgMTMgOTUgMjEyIDcxIDIzNSAyODUgMTU0IDIzOCA0OCAxNDQgCisxNCAyODggMjIxIDIyOCA0MyAxNjUgNiAyODMgMjgwIDE3MiAxMjUgMTYgMTIxIDE0NSAxMjIgMjk3IDc0IDM2IDIyNyAxNyA1MSAyMTEgCis0IDY0IDE1NyAxIDM4IDIyNCAyNTQgMjgwIDEzMSA2OCAyOTEgMTYyIDE2MSA5NCAxNDIgMTQgMTY1IDI2OSAxNDEgMjUxIDI5OCAxNDEgCisyOTIgNTEgMTcwIDI1MSAzNSAxOTggMTcgMTAgMTU0IDI3OSAxMDUgMTczIDE5MiAyNzIgMjQ5IDc5IDE4IDM2IDI2OCA3NCA4MCAxNzAgCisyOTIgOTIgMjI3IDI4MCAyMTMgMTgyIDQ1IDgwIDEyOSAxNTAgNjMgNDkgMjk2IDE4NSAxMTIgNzAgMTI0IDE3MSA1NSAyNjMgNTEgMTI5IAorMTA5IDYgMjAgMzMgMjAxIDg0IDE0OSAyMTUgOTcgMTY4IDMyIDIxNiAyNyAyMzQgMTMzIDI4NyAxMTAgMTE0IDI0OCAxOTAgOSAxODMgCisxNTYgMTk0IDIyOCAxMjUgMjc5IDY0IDExNiAxNjMgOSAyNjUgMjcwIDI1MiA2MSA4IDExNiAyMDQgNjYgMjk0IDIyOSAyMzYgODkgMTYzIAorOTEgMTYwIDI0IDg1IDI5IDE0OSAyNTYgMTU0IDE5NyAyMTAgMTE1IDU1IDEwOCAxNTggNjggMjA5IDQ4IDEwMyAxNzYgMjU5IDI2MiAyNSAKKzE1IDEwIDMxIDIzIDE4IDc3IDIxIDEwMyAyNTggNjkgMTYgMTYyIDIwMiAxNTEgMTcxIDI3NyAxNDkgMjk3IDI5NiAyMjYgMTY5IDk5IAorODMgNzAgODMgMjkgMjYgNjcgMTAxIDM5IDMxIDY0IDc1IDEwNiAyODQgMiA2NyAyMjQgMjk1IDMzIDE2MCAyNDYgMjc1IDI3NSAxMiA2OSAKKzk4IDU3IDI2MCA2OSAxMzkgMTE0IDI4OSAyNDcgMzggMTQyIDU1IDIyMiAyOTggMTAwIDIzNSAyMiAyMTEgMjY3IDIyNiAxMjggNDIgNTQgCisxOTYgMTg0IDEgMjYwIDI1IDE5NiAxNDMgMjQ4IDIzMSAxNTEgMjEyIDMwIDE3OCAyNTYgMTk1IDI1NCAyMzkgNzQgMzkgMjggMjYzIAorMTMzIDI0IDE2NyAxNDMgMjA3IDE3NCAxMjIgMzQgMTMxIDY1IDE4NiAyMjAgNzkgMjgxIDI4MyAyMzkgMTE1IDk2IDU3IDEzNyAxMTcgCis1MiAxOCAxMTggNzggMTMyIDIxNyA1MyA0NCAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMjk1IDc0IDMwMiAyNzUgMjM0IDE3NCA0MCAxMzkgCis3MyAyMzIgMjE4IDE2NCAxNTggMjcgMTUyIDE5IDIyOSAyNzcgMjMxIDE5MiA1MCA1OSA1MiAyNDAgNCAyMCAyMTQgMzAgMzAxIDIwOCAKKzI4MiA0NiAxMDYgMjQzIDI0OSAzOCAyNjUgNyA1IDkwIDI3MSAxNSAxMyAxMzYgMjY5IDEwMCAxOTQgMjY5IDE4MiA0IDIzIDEwMCAyNzYgCis3OSAyNDAgMjI2IDIxMCAxNTYgMTEyIDI5IDY3IDE0MiA5NiA2MCAyMyA1OSAxMzQgNTAgNjIgMjQyIDE4MiA4NiAxMzcgMTU4IDEwOSAKKzQ3IDc3IDYyIDE2MCAyODcgMjggMTkwIDUzIDEyNiAxMjcgMjM1IDI0NCA5NyAyMDkgODkgMjQ1IDIwNSAyMTggMjQ2IDUzIDg1IDcwIAorMjA2IDI4NSAxMTMgMTgxIDE5IDI3MCAzMCAyNjAgNjYgMjUzIDE3MiAyMDcgMjE1IDE3OSA2MyA1IDQ5IDIxNCA3MSA1NCAyMzcgMjQxIAorMzAgMjE5IDkgMjI0IDIxMyAyMjMgMTAyIDEwOSAzIDEzNCA5MSAxMTkgMjcxIDU2IDcwIDE2NSAyMjggODQgMjIyIDM1IDE1NyAyNjQgCisyODUgMTk1IDI5NSA3NyAxMDMgMjE3IDEyIDI5MSAyMDMgMzAzIDEyMyAxMDEgMzAyIDE5MyAzNSAxMTYgMTIyIDI1NiAyMzYgNyAyNjggCiszMyAyNDIgMTQxIDI5IDEwOCAxOTkgMTI1IDIzOCA3IDg3IDI4OSAyNSAyMzcgMjAwIDI3NyAxOTAgNTAgMjEgMTg1IDE1MyAxMjcgMTUzIAorNDUgMzkgNzIgMTIxIDEwNCA2NSAyNjggMTE1IDEzNyAxOTkgMTY2IDc2IDM2IDQ2IDE4OCA1MyAzIDE3NSAxNDggMTQ4IDIzMCA0MCA5OCAKKzE2IDIwMyA0MCAxODAgMTMwIDI2MSAxNzcgNjMgMjcxIDk3IDEyNyAxOTQgMTg3IDY4IDI1MCAxMDUgMTMyIDEzNSAyNDMgMjkwIDk1IAorMjk0IDI3MCAyOTMgMTE4IDM3IDc1IDE4OCA5NCA2MCAyMDQgMTA3IDQ3IDI1OCAxMTAgNzMgMTkxIDE2MSAxMzUgMjg0IDQzIDEyNCAKKzI1MyAyNTQgMTcgMjczIDEyIDI1MCAxNDYgMjc0IDE2NCAxMTcgMjc0IDEyMyA2MCAyNDUgMTY0IDc2IDIxNyA5NCAxMDEgMjYxIDEzNiAKKzYgMjQyIDIyMyAxNDMgMTY2IDMyIDkzIDc1IDE0NyAzNyAzMSAyNDUgMTIzIDE5IDE4OCAxMzUgMjAyIDIzMyA2NiAzMSAyODYgMjY1IAorNDggNjIgMTE5IDIzMCAzMDMgNDEgMjkxIDI0NCA1NiAxNTIgNjAgMjg2IDIgMTA1IDkxIDc4IDIxNCAyNyAxMTEgMjY2IDIwMCAxNCAKKzI0NyA3OSAxOTkgODQgMTgxIDI4MiAxMjggMSAzMDEgMTY3IDIyNSAxNyAyMzIgMjU5IDIyMSAxODcgMjkwIDEzNiA0NyAyOTkgMjUyIAorMTAyIDE1MCAxNDUgMTYzIDE1NyBeCis2NTMgMCAxOCAyOTkgMjA3IDQxIDExNyAxODQgMTc5IDE2IDI1MiAxOCAyNTUgODMgMjAgODIgMjY0IDE1NSAyNTcgMjE2IDIwMSAyOTYgCis1NCAxMDcgMzAzIDI1NSAzOSAyMDIgNjEgMiAyMzUgMTU0IDE1MSA4NiA5NCAxNiA3OCA4NCA5MSAzMCA4NiA2IDE1MyAzNiA5MyAyNTEgCisyMDkgMjYyIDI0MCAxMzQgMjY2IDExNCAxMTkgMTg3IDI0NCA4IDI0IDM1IDIyIDc2IDgxIDI2IDM4IDggNjggODAgNDMgMzIgMSAxMjkgCisyNCA0NCAxOTEgMTE4IDcyIDI1MSAxNjUgMTM4IDE0MCA5OSA0MCAxMSA1NCAxNTEgNDIgMjc2IDMwMSAxMjIgMTY0IDY3IDI3MSA1MCAKKzE4OSAxMTUgNyAxODAgODcgMjAwIDE0NiAxODUgMjg1IDY3IDUzIDIxOSAyMzEgMTA2IDE1MyAxIDIxNyAyNzIgMTY1IDE4MiAyNjQgCisxOTkgNzUgMjM3IDE1NyAyMTYgMTU3IDE3MiAzMyA3MiA3NyAxNTIgMjgwIDg3IDI0NCAyNzAgMjA2IDI0MSAyOTMgNzcgMjg0IDQwIAorMjI5IDE5MSAzMCAxMzAgMTMwIDE3NCAyOTggMTMgNDggMjc0IDI5OCA1NyA5MyAyOTUgMjcgMjgzIDE5NiA1NCA2MyAxNzkgMjM0IDQgCisyODIgMzcgMjQzIDEyMCAzMSAxMTMgMTM2IDE4MSAyMzcgNjkgMjc0IDM2IDE4MSAxOTMgMjUxIDI1MyA4MCAyNjEgOTAgMTg2IDEzOCAKKzE4NCAyMjMgNjEgNDYgNTMgMTc1IDEwNyA2IDE5NyA4MSAxMTQgMjA3IDEyOSA1OSAzMDUgMTcwIDE2MiA3MyAxNDggMTAwIDEwMiAxNyAKKzE0MCAxMSA5OCAyNzUgMTQyIDUgMjIxIDE0NiAyMjkgMTAzIDg4IDkgMTM5IDI4IDE3MSAxODkgMjAzIDI1NSAzMDEgNzggNDAgMjczIDkgCis1MSA4NiA1MCAyNzcgNTcgNDkgMTcxIDIzMyAyMSAyNzYgMjU3IDMwNCA2NCAzMiA0NSAyNTMgMTI0IDc5IDExMSAyMjEgNTggMjg3IAorMjg4IDE3NiAxNjkgMTIgMjA0IDIwIDE3MCAyMDYgMTk3IDE2OSA1NiAyMiA0MSAyMDUgMTI2IDMwMCAyMzQgOTIgMTQ1IDc5IDE1NSAzOSAKKzE1OCAyNDMgMjA4IDIwMCAyMzQgNDggMjEgNTggMTk5IDQwIDU1IDE3OCAxNzIgNzcgMTk2IDk4IDE4NyAyMDAgMTkwIDMgMjMgMjc5IAorMTYgMjk2IDE0MiA0OSAzOSAyNDYgMTg1IDIzIDE5MSA3NCAyNTQgMTUxIDEzMCAyMTggMTE2IDM0IDQgMTk0IDk1IDEyMiAyMDggMTEyIAorMjkyIDYgMTA5IDIxOCA3MiAyOTUgMjg5IDE1OSAxNzUgMTkgMTQzIDc2IDE2OSAyNzQgODAgMzA1IDIxNCAyODYgMTczIDEwNCAyMCAKKzEyNiA4MiAxNzYgMjEzIDEzNiAyMjUgNTUgOTAgMjMwIDI2MiAyODQgMjU4IDYwIDcwIDM5IDI5MCAzIDQ0IDE0NyAzMDAgMjc4IDIxNiAKKzI0NSAzNSA3NSA2MyAyMjMgNTIgMTA0IDIzOCAyNjMgMjY3IDE4NSA2NyA5IDk1IDIxMCA3MSAyMzMgMjgzIDE1MiAyMzYgNDIgMTQ0IDggCisyODYgMjE3IDIyOCA0MSAxNjEgMiAyNzkgMjc4IDE3MiAxMjEgMTQgMTE5IDE0MyAxMjAgMjkzIDY4IDM2IDIyNSAxMSA0NSAyMDkgNTggCisxNTUgMzAxIDM0IDIyMiAyNTIgMjgwIDEzMSA2MiAyOTEgMTYyIDE2MSA5MCAxNDIgMTQgMTYzIDI2NyAxNDEgMjQ5IDI5NCAxMzkgMjkwIAorNDcgMTY4IDI0NyAyOSAxOTggMTMgNCAxNTAgMjc3IDEwMSAxNzMgMTkyIDI2OCAyNDcgNzMgMTYgMzQgMjY2IDcwIDc0IDE2NiAyODggCis4OCAyMjcgMjc2IDIxMyAxODAgNDMgNzYgMTI1IDE1MCA1OSA0MyAyOTQgMTgzIDEwOCA2OCAxMjQgMTY3IDUzIDI2MyA0OSAxMjcgMTA5IAorMTQgMzEgMjAxIDc4IDMwMiAxNDkgMjE1IDk1IDE2NiAyNiAyMTIgMjEgMjMyIDEzMyAyODMgMTA4IDExMiAyNDggMTg4IDkgMTgzIDE1MiAKKzE5MiAyMjQgMTIzIDI3OSA2MCAxMTQgMTYzIDUgMjY1IDI3MCAyNTAgNTkgOCAxMTIgMjA0IDY0IDI5NCAyMjcgMjMyIDg5IDE1OSA4NyAKKzE1NiAyMiA4NSAyMyAxNDcgMjU2IDE1NCAxOTUgMjEwIDExNSA1MSAzMDQgMTA4IDE1NiA2NiAyMDkgNDQgMTAzIDE3NiAyNTcgMjYwIAorMTkgMTEgMTAgMjcgMjEgMTQgNzUgMTkgOTkgMjU4IDY5IDEyIDE2MCAyMDIgMTQ5IDE3MSAyNzcgMTQ1IDI5NyAyOTIgMjI0IDE2NyA5NyAKKzgxIDcwIDgzIDI5IDI0IDY3IDk3IDM3IDI1IDYyIDczIDEwNCAyODIgMiA2MSAyMjAgMjkzIDMzIDE2MCAyNDYgMjczIDI3MSA2IDY1IAorOTQgNTEgMjYwIDYzIDEzNSAxMTAgMjg5IDI0NyAzOCAxNDAgNTUgMjIyIDI5NiA5OCAyMzEgMTggMjExIDI2NSAyMjYgMTI2IDM4IDUyIAorMTkyIDE4MCAzMDUgMjU4IDI1IDE5NCAxMzkgMjQ2IDIyOSAxNDcgMjEyIDMwIDE3NCAyNTQgMTk1IDI1NCAyMzkgNzIgMzMgMjggMjU5IAorMTMxIDE4IDE2NyAxNDEgMjA1IDE3MCAxMTggMjggMTI3IDY1IDE4MiAyMjAgNzUgMjgxIDI4MSAyMzcgMTEzIDkyIDU3IDEzNyAxMTMgCis0OCAxMiAxMTYgNzggMTI4IDIxNSA1MSA0MiAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMjkxIDE2MSBeCis2NTMgMCAyOTYgMjc1IDIyOCAxNzQgMzQgMTM2IDY3IDIyOSAyMTggMTU4IDE1OCAyNCAxNDkgMTMgMjIzIDI3MSAyMjUgMTg2IDQxIDU5IAorNTIgMjM0IDMwMiAyMCAyMTQgMjEgMjk1IDIwMiAyODIgNDYgMTA2IDI0MCAyNDkgMjkgMjYyIDQgMiA4NyAyNzEgMTUgNCAxMzYgMjY5IAorMTAwIDE4OCAyNjMgMTgyIDEgMTQgOTQgMjcwIDc2IDI0MCAyMjAgMjA3IDE1NiAxMDkgMjYgNjQgMTM2IDk2IDUxIDE3IDUzIDEzNCA0NyAKKzUzIDIzOSAxNzYgODMgMTM0IDE1MiAxMDYgMzggNzEgNTkgMTU3IDI4NyAyNSAyOTggMTkwIDQ0IDEyMyAxMjEgMjM1IDI0MSA5MSAyMDYgCis4MyAyMzkgMjA1IDIxMiAyNDAgNDcgODIgNjEgMjA2IDI4NSAxMTAgMTc1IDEwIDI2NCAyNCAyNTQgNjYgMjUzIDE2NiAyMDEgMjA5IAorMTc2IDU0IDUgNDYgMjExIDYyIDQ4IDIzMSAyMzggMjcgMjEzIDYgMjI0IDIxMCAyMjAgMTAyIDEwMyAzIDEzMSA4OCAxMTMgMjY4IDU2IAorNjQgMTY1IDIyNSA4MSAyMTkgMjkgMTU3IDI1OCAyNzkgMTkyIDI5NSA2OCAxMDAgMjE3IDkgMjg4IDIwMyAyOTcgMTE3IDk4IDMwMiAKKzE5MyAzMiAxMTYgMTIyIDI1MCAyMzYgNyAyNjggMjcgMjQyIDEzNSAyMyAxMDUgMTk2IDEyNSAyMzggMzA1IDg0IDI4MyAyMiAyMzQgCisxOTcgMjc0IDE4NCA1MCAxMiAxNzkgMTQ3IDEyNyAxNTMgNDUgMzMgNjMgMTIxIDEwMSA1OSAyNjIgMTA5IDEzMSAxOTMgMTY2IDY3IDI3IAorNDAgMTg4IDUzIDE3MiAxNDggMTQyIDIyNCAzNyA5NSA3IDIwMCAzMSAxNzcgMTI3IDI1OCAxNzQgNjMgMjY1IDk3IDEyNCAxOTQgMTgxIAorNjIgMjUwIDEwMiAxMzIgMTMyIDIzNyAyOTAgODkgMjkxIDI2NyAyOTAgMTE4IDM3IDY2IDE4NSA5NCA2MCAyMDEgMTA0IDQ3IDI1NSAKKzExMCA3MCAxODggMTU4IDEyOSAyNzggNDMgMTE4IDI0NyAyNDggMTQgMjY3IDEyIDI0NyAxNDMgMjY4IDE2MSAxMTcgMjcxIDEyMCA1NyAKKzI0MiAxNjQgNzYgMjExIDkxIDEwMSAyNjEgMTMzIDMgMjM2IDIxNyAxNDMgMTYzIDMyIDg3IDY5IDE0NCAzNCAzMSAyNDUgMTIzIDE2IAorMTgyIDEzNSAxOTYgMjMwIDYwIDI4IDI4NiAyNTkgNDUgNjIgMTE2IDIyNyAzMDMgMzUgMjg1IDI0NCA1MCAxNDYgNTQgMjgzIDMwMCAKKzEwNSA5MSA3MiAyMDggMjcgMTA4IDI2MCAxOTQgOCAyNDQgNzkgMTk5IDg0IDE3OCAyNzYgMTI4IDMwMiAyOTggMTYxIDIyMiAxNyAyMjYgCisyNTkgMjE4IDE4NyAyODcgMTMwIDQ0IDI5NiAyNDYgOTkgMTQ0IDEzOSAxNjAgNDQgMTggMjk5IDIwNSAzOSAxMTUgMTgzIDE3OSAxMyAKKzI1MiAxNyAyNTUgODEgMTcgODIgMjYzIDE1MyAyNTUgMjE1IDE5OSAyOTQgNTMgMTA1IDMwMSAyNTQgMzcgMjAwIDYwIDMwNiAyMzMgCisxNTMgMTUwIDg2IDkzIDE2IDc3IDgyIDkwIDI4IDg0IDUgMTUxIDMzIDkyIDI1MCAyMDcgMjYxIDIzOCAxMzIgMjY2IDExMiAxMTkgMTg2IAorMjQzIDYgMjIgMzIgMTkgNzMgNzkgMjYgMzUgNyA2NiA4MCA0MSAzMCAzMDYgMTI4IDI0IDQ0IDE5MSAxMTcgNjkgMjQ5IDE2MyAxMzcgCisxNDAgOTkgMzkgMTAgNTQgMTQ5IDQyIDI3NiAzMDEgMTIwIDE2MiA2NCAyNzAgNDcgMTg3IDExNCA1IDE4MCA4NiAxOTggMTQ1IDE4MyAKKzI4NCA2NiA1MSAyMTkgMjMxIDEwNCAxNTIgMSAyMTYgMjcyIDE2NCAxODEgMjY0IDE5NyA3MiAyMzcgMTU2IDIxNCAxNTUgMTcwIDMxIAorNzIgNzQgMTUyIDI3OSA4NyAyNDIgMjY5IDIwNSAyNDEgMjkzIDc3IDI4NCAzNyAyMjkgMTg5IDI5IDEyOCAxMjkgMTczIDI5NyAxMiA0NSAKKzI3MiAyOTggNTYgOTMgMjk0IDI0IDI4MyAxOTUgNTIgNjEgMTc3IDIzMiA0IDI4MCAzNCAyNDEgMTIwIDI4IDExMyAxMzQgMTgxIDIzNSAKKzY4IDI3MyAzNSAxODAgMTkxIDI1MSAyNTEgNzggMjYwIDg5IDE4NiAxMzggMTg0IDIyMyA2MSA0MyA1MCAxNzUgMTA3IDYgMTk1IDgxIAorMTE0IDIwNyAxMjcgNTYgMzAzIDE2OSAxNjAgNzMgMTQ3IDk4IDEwMCAxNSAxMzggMTEgOTggMjczIDE0MCAyIDIyMSAxNDYgMjI3IDEwMSAKKzg4IDggMTM5IDI2IDE2OSAxODkgMjAyIDI1MyAzMDAgNzYgMzggMjczIDYgNTEgODUgNDkgMjc1IDU1IDQ5IDE3MCAyMzMgMTkgMjc1IAorMjU3IDMwMyA2NCAzMSA0MyAyNTIgMTIyIDc3IDExMSAyMTkgNTggMjg2IDI4OCAxNzQgMTY4IDExIDIwMyAxOSAxNzAgMjA0IDE5NyAKKzE2OSA1NSAyMCA0MSAyMDMgMTI0IDI5OSAyMzQgOTIgMTQ1IDc4IDE1NSAzNiAxNTYgMjQzIDIwOCAyMDAgMjMzIDQ4IDIxIDU2IDE5OCAKKzQwIDU0IDE3OCAxNzEgNzUgMTk2IDk2IDE4NSAxOTkgMTg5IDMwNiAyMyAyNzggMTQgMjk2IDE0MSA0NiAzOCAyNDQgMTg0IDIxIDE5MCAKKzczIDI1MiAxNTEgMTMwIDIxNyAxMTQgMzQgMiAxOTIgOTMgMTIxIDIwNiAxMTIgMjkyIDQgMTA3IDIxNiA3MCAyOTMgMTEyIF4KKzY0NiAxIDE1OSAxNjkgMTkgMTM3IDczIDE2MyAyNzQgNzcgMzAyIDIxMSAyODAgMTY3IDEwNCAxNCAxMjYgNzYgMTczIDIxMCAxMzMgCisyMjUgNDYgOTAgMjMwIDI2MiAyNzggMjUyIDUxIDY3IDM5IDI4NCAzMDYgNDEgMTQ3IDMwMCAyNzggMjE2IDIzOSAzNSA3NSA2MCAyMTcgCis0MyA5OCAyMzUgMjU3IDI2NyAxODUgNjEgMyA5NSAyMDcgNzEgMjMwIDI4MCAxNDkgMjMzIDMzIDE0NCAzMDggMjgzIDIxMSAyMjggMzggCisxNTUgMzA1IDI3MyAyNzUgMTcyIDExNSAxMSAxMTYgMTQwIDExNyAyODcgNTkgMzYgMjIyIDIgMzYgMjA2IDMwMyA0OSAxNTIgMjk1IDI4IAorMjE5IDI0OSAyODAgMTMxIDUzIDI5MSAxNjIgMTYxIDg0IDE0MiAxNCAxNjAgMjY0IDE0MSAyNDYgMjg4IDEzNiAyODcgNDEgMTY1IDI0MSAKKzIwIDE5OCA3IDMwNCAxNDQgMjc0IDk1IDE3MyAxOTIgMjYyIDI0NCA2NCAxMyAzMSAyNjMgNjQgNjUgMTYwIDI4MiA4MiAyMjcgMjcwIAorMjEzIDE3NyA0MCA3MCAxMTkgMTUwIDUzIDM0IDI5MSAxODAgMTAyIDY1IDEyNCAxNjEgNTAgMjYzIDQ2IDEyNCAxMDkgMzAwIDUgMjggCisyMDEgNjkgMjk5IDE0OSAyMTUgOTIgMTYzIDE3IDIwNiAxMiAyMjkgMTMzIDI3NyAxMDUgMTA5IDI0OCAxODUgOSAxODMgMTQ2IDE4OSAKKzIxOCAxMjAgMjc5IDU0IDExMSAxNjMgMzA4IDI2NSAyNzAgMjQ3IDU2IDggMTA2IDIwNCA2MSAyOTQgMjI0IDIyNiA4OSAxNTMgODEgCisxNTAgMTkgODUgMTQgMTQ0IDI1NiAxNTQgMTkyIDIxMCAxMTUgNDUgMzA0IDEwOCAxNTMgNjMgMjA5IDM4IDEwMyAxNzYgMjU0IDI1NyAKKzEwIDUgMTAgMjEgMTggOCA3MiAxNiA5MyAyNTggNjkgNiAxNTcgMjAyIDE0NiAxNzEgMjc3IDEzOSAyOTcgMjg2IDIyMSAxNjQgOTQgNzggCis3MCA4MyAyOSAyMSA2NyA5MSAzNCAxNiA1OSA3MCAxMDEgMjc5IDIgNTIgMjE0IDI5MCAzMyAxNjAgMjQ2IDI3MCAyNjUgMzA2IDU5IDg4IAorNDIgMjYwIDU0IDEyOSAxMDQgMjg5IDI0NyAzOCAxMzcgNTUgMjIyIDI5MyA5NSAyMjUgMTIgMjExIDI2MiAyMjYgMTIzIDMyIDQ5IDE4NiAKKzE3NCAzMDUgMjU1IDI1IDE5MSAxMzMgMjQzIDIyNiAxNDEgMjEyIDMwIDE2OCAyNTEgMTk1IDI1NCAyMzkgNjkgMjQgMjggMjUzIDEyOCAKKzkgMTY3IDEzOCAyMDIgMTY0IDExMiAxOSAxMjEgNjUgMTc2IDIyMCA2OSAyODEgMjc4IDIzNCAxMTAgODYgNTcgMTM3IDEwNyA0MiAzIAorMTEzIDc4IDEyMiAyMTIgNDggMzkgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDI4NSA3NCAyOTIgMjc1IDIyNCAxNzQgMzAgMTM0IDYzIDIyNyAKKzIxOCAxNTQgMTU4IDIyIDE0NyA5IDIxOSAyNjcgMjIxIDE4MiAzNSA1OSA1MiAyMzAgMjk4IDIwIDIxNCAxNSAyOTEgMTk4IDI4MiA0NiAKKzEwNiAyMzggMjQ5IDIzIDI2MCAyIDg1IDI3MSAxNSAzMDcgMTM2IDI2OSAxMDAgMTg0IDI1OSAxODIgMzA4IDggOTAgMjY2IDc0IDI0MCAKKzIxNiAyMDUgMTU2IDEwNyAyNCA2MiAxMzIgOTYgNDUgMTMgNDkgMTM0IDQ1IDQ3IDIzNyAxNzIgODEgMTMyIDE0OCAxMDQgMzIgNjcgNTcgCisxNTUgMjg3IDIzIDI5NCAxOTAgMzggMTIxIDExNyAyMzUgMjM5IDg3IDIwNCA3OSAyMzUgMjA1IDIwOCAyMzYgNDMgODAgNTUgMjA2IAorMjg1IDEwOCAxNzEgNCAyNjAgMjAgMjUwIDY2IDI1MyAxNjIgMTk3IDIwNSAxNzQgNDggNSA0NCAyMDkgNTYgNDQgMjI3IDIzNiAyNSAKKzIwOSA0IDIyNCAyMDggMjE4IDEwMiA5OSAzIDEyOSA4NiAxMDkgMjY2IDU2IDYwIDE2NSAyMjMgNzkgMjE3IDI1IDE1NyAyNTQgMjc1IAorMTkwIDI5NSA2MiA5OCAyMTcgNyAyODYgMjAzIDI5MyAxMTMgOTYgMzAyIDE5MyAzMCAxMTYgMTIyIDI0NiAyMzYgNyAyNjggMjMgMjQyIAorMTMxIDE5IDEwMyAxOTQgMTI1IDIzOCAzMDEgODIgMjc5IDIwIDIzMiAxOTUgMjcyIDE4MCA1MCA2IDE3NSAxNDMgMTI3IDE1MyA0NSAyOSAKKzU3IDEyMSA5OSA1NSAyNTggMTA1IDEyNyAxODkgMTY2IDYxIDIxIDM2IDE4OCA1MyAzMDcgMTcwIDE0OCAxMzggMjIwIDM1IDkzIDEgCisxOTggMjUgMTc1IDEyNSAyNTYgMTcyIDYzIDI2MSA5NyAxMjIgMTk0IDE3NyA1OCAyNTAgMTAwIDEzMiAxMzAgMjMzIDI5MCA4NSAyODkgCisyNjUgMjg4IDExOCAzNyA2MCAxODMgOTQgNjAgMTk5IDEwMiA0NyAyNTMgMTEwIDY4IDE4NiAxNTYgMTI1IDI3NCA0MyAxMTQgMjQzIAorMjQ0IDEyIDI2MyAxMiAyNDUgMTQxIDI2NCAxNTkgMTE3IDI2OSAxMTggNTUgMjQwIDE2NCA3NiAyMDcgODkgMTAxIDI2MSAxMzEgMSAKKzIzMiAyMTMgMTQzIDE2MSAzMiA4MyA2NSAxNDIgMzIgMzEgMjQ1IDEyMyAxNCAxNzggMTM1IDE5MiAyMjggNTYgMjYgMjg2IDI1NSA0MyAKKzYyIDExNCAyMjUgMzAzIDMxIDI4MSAyNDQgNDYgMTQyIDUwIDI4MSAyOTYgMTA1IDkxIDIzOCBeCis2NDcgMCAyMDAgMjcgMTA0IDI1MiAxODYgMjQwIDc5IDE5OSA4NCAxNzQgMjY4IDEyOCAyOTggMjk0IDE1MyAyMTggMTcgMjE4IDI1OSAKKzIxNCAxODcgMjgzIDEyMiA0MCAyOTIgMjM4IDk1IDEzNiAxMzEgMTU2IDM2IDE4IDI5OSAxOTcgMzEgMTA3IDE3OSAxNzkgMSAyNTIgMTMgCisyNTUgNzMgNSA4MiAyNTkgMTQ1IDI0NyAyMTEgMTkxIDI4NiA0OSA5NyAyOTMgMjUwIDI5IDE5MiA1NiAyOTggMjI1IDE0OSAxNDYgODYgCis4OSAxNiA3MyA3NCA4NiAyMCA3NiAxIDE0MyAyMSA4OCAyNDYgMTk5IDI1NyAyMzAgMTI0IDI2NiAxMDQgMTE5IDE4MiAyMzkgMzA5IDE0IAorMjAgNyA2MSA3MSAyNiAyMyAzIDU4IDgwIDMzIDIyIDMwMiAxMjQgMjQgNDQgMTkxIDExMyA1NyAyNDEgMTU1IDEzMyAxNDAgOTkgMzUgNiAKKzU0IDE0MSA0MiAyNzYgMzAxIDExMiAxNTQgNTIgMjY2IDM1IDE3OSAxMTAgMzA4IDE4MCA4MiAxOTAgMTQxIDE3NSAyODAgNjIgNDMgCisyMTkgMjMxIDk2IDE0OCAxIDIxMiAyNzIgMTYwIDE3NyAyNjQgMTg5IDYwIDIzNyAxNTIgMjA2IDE0NyAxNjIgMjMgNzIgNjIgMTUyIAorMjc1IDg3IDIzNCAyNjUgMjAxIDI0MSAyOTMgNzcgMjg0IDI1IDIyOSAxODEgMjUgMTIwIDEyNSAxNjkgMjkzIDggMzMgMjY0IDI5OCA1MiAKKzkzIDI5MCAxMiAyODMgMTkxIDQ0IDUzIDE2OSAyMjQgNCAyNzIgMjIgMjMzIDEyMCAxNiAxMTMgMTI2IDE4MSAyMjcgNjQgMjY5IDMxIAorMTc2IDE4MyAyNTEgMjQzIDcwIDI1NiA4NSAxODYgMTM4IDE4NCAyMjMgNjEgMzEgMzggMTc1IDEwNyA2IDE4NyA4MSAxMTQgMjA3IDExOSAKKzQ0IDI5NSAxNjUgMTUyIDczIDE0MyA5MCA5MiA3IDEzMCAxMSA5OCAyNjUgMTMyIDMwMSAyMjEgMTQ2IDIxOSA5MyA4OCA0IDEzOSAxOCAKKzE2MSAxODkgMTk4IDI0NSAyOTYgNjggMzAgMjczIDMwNSA1MSA4MSA0NSAyNjcgNDcgNDkgMTY2IDIzMyAxMSAyNzEgMjU3IDI5OSA2NCAKKzI3IDM1IDI0OCAxMTQgNjkgMTExIDIxMSA1OCAyODIgMjg4IDE2NiAxNjQgNyAxOTkgMTUgMTcwIDE5NiAxOTcgMTY5IDUxIDEyIDQxIAorMTk1IDExNiAyOTUgMjM0IDkyIDE0NSA3NCAxNTUgMjQgMTQ4IDI0MyAyMDggMjAwIDIyOSA0OCAyMSA0OCAxOTQgNDAgNTAgMTc4IDE2NyAKKzY3IDE5NiA4OCAxNzcgMTk1IDE4NSAyOTkgMzA2IDIzIDI3NCA2IDI5NiAxMzcgMzQgMzQgMjM2IDE4MCAxMyAxODYgNjkgMjQ0IDE1MSAKKzEzMCAyMTMgMTA2IDM0IDMwNSAxODQgODUgMTE3IDE5OCAxMTIgMjkyIDMwNyA5OSAyMDggNjIgMjg1IDI3OSAxNTkgMTY1IDE5IDEzMyAKKzcxIDE1OSAyNzQgNzUgMzAwIDIwOSAyNzYgMTYzIDEwNCAxMCAxMjYgNzIgMTcxIDIwOCAxMzEgMjI1IDQwIDkwIDIzMCAyNjIgMjc0IAorMjQ4IDQ1IDY1IDM5IDI4MCAzMDQgMzkgMTQ3IDMwMCAyNzggMjE2IDIzNSAzNSA3NSA1OCAyMTMgMzcgOTQgMjMzIDI1MyAyNjcgMTg1IAorNTcgMzEwIDk1IDIwNSA3MSAyMjggMjc4IDE0NyAyMzEgMjcgMTQ0IDMwNCAyODEgMjA3IDIyOCAzNiAxNTEgMzAzIDI2OSAyNzMgMTcyIAorMTExIDkgMTE0IDEzOCAxMTUgMjgzIDUzIDM2IDIyMCAzMDcgMzAgMjA0IDMwMSA0MyAxNTAgMjkxIDI0IDIxNyAyNDcgMjgwIDEzMSA0NyAKKzI5MSAxNjIgMTYxIDgwIDE0MiAxNCAxNTggMjYyIDE0MSAyNDQgMjg0IDEzNCAyODUgMzcgMTYzIDIzNyAxNCAxOTggMyAzMDAgMTQwIAorMjcyIDkxIDE3MyAxOTIgMjU4IDI0MiA1OCAxMSAyOSAyNjEgNjAgNTkgMTU2IDI3OCA3OCAyMjcgMjY2IDIxMyAxNzUgMzggNjYgMTE1IAorMTUwIDQ5IDI4IDI4OSAxNzggOTggNjMgMTI0IDE1NyA0OCAyNjMgNDQgMTIyIDEwOSAyOTYgMzEwIDI2IDIwMSA2MyAyOTcgMTQ5IDIxNSAKKzkwIDE2MSAxMSAyMDIgNiAyMjcgMTMzIDI3MyAxMDMgMTA3IDI0OCAxODMgOSAxODMgMTQyIDE4NyAyMTQgMTE4IDI3OSA1MCAxMDkgCisxNjMgMzA2IDI2NSAyNzAgMjQ1IDU0IDggMTAyIDIwNCA1OSAyOTQgMjIyIDIyMiA4OSAxNDkgNzcgMTQ2IDE3IDg1IDggMTQyIDI1NiAKKzE1NCAxOTAgMjEwIDExNSA0MSAzMDQgMTA4IDE1MSA2MSAyMDkgMzQgMTAzIDE3NiAyNTIgMjU1IDQgMSAxMCAxNyAxNiA0IDcwIDE0IAorODkgMjU4IDY5IDIgMTU1IDIwMiAxNDQgMTcxIDI3NyAxMzUgMjk3IDI4MiAyMTkgMTYyIDkyIDc2IDcwIDgzIDI5IDE5IDY3IDg3IDMyIAorMTAgNTcgNjggOTkgMjc3IDIgNDYgMjEwIDI4OCAzMyAxNjAgMjQ2IDI2OCAyNjEgMzAyIDU1IDg0IDM2IDI2MCA0OCAxMjUgMTAwIDI4OSAKKzI0NyAzOCAxMzUgNTUgMjIyIDI5MSA5MyAyMjEgOCAyMTEgMjYwIDIyNiAxMjEgMjggNDcgMTgyIDE3MCAzMDUgMjUzIDI1IDE4OSAxMjkgCisyNDEgMjI0IDEzNyAyMTIgMzAgMTY0IDI0OSAxOTUgMjU0IDIzOSA4NiBeCis2NjUgMCAxNSAyOCAyNDcgMTI1IDE2NyAxMzUgMTk5IDE1OCAxMDYgMTAgMTE1IDY1IDE3MCAyMjAgNjMgMjgxIDI3NSAyMzEgMTA3IDgwIAorNTcgMTM3IDEwMSAzNiAzMDYgMTEwIDc4IDExNiAyMDkgNDUgMzYgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDI3OSA3NCAyODYgMjc1IDIxOCAKKzE3NCAyNCAxMzEgNTcgMjI0IDIxOCAxNDggMTU4IDE5IDE0NCAzIDIxMyAyNjEgMjE1IDE3NiAyNiA1OSA1MiAyMjQgMjkyIDIwIDIxNCAKKzYgMjg1IDE5MiAyODIgNDYgMTA2IDIzNSAyNDkgMTQgMjU3IDMxMSAzMDkgODIgMjcxIDE1IDMwMSAxMzYgMjY5IDEwMCAxNzggMjUzIAorMTgyIDMwOCAzMTEgODQgMjYwIDcxIDI0MCAyMTAgMjAyIDE1NiAxMDQgMjEgNTkgMTI2IDk2IDM2IDcgNDMgMTM0IDQyIDM4IDIzNCAKKzE2NiA3OCAxMjkgMTQyIDEwMSAyMyA2MSA1NCAxNTIgMjg3IDIwIDI4OCAxOTAgMjkgMTE4IDExMSAyMzUgMjM2IDgxIDIwMSA3MyAyMjkgCisyMDUgMjAyIDIzMCAzNyA3NyA0NiAyMDYgMjg1IDEwNSAxNjUgMzA3IDI1NCAxNCAyNDQgNjYgMjUzIDE1NiAxOTEgMTk5IDE3MSAzOSA1IAorNDEgMjA2IDQ3IDM4IDIyMSAyMzMgMjIgMjAzIDEgMjI0IDIwNSAyMTUgMTAyIDkzIDMgMTI2IDgzIDEwMyAyNjMgNTYgNTQgMTY1IDIyMCAKKzc2IDIxNCAxOSAxNTcgMjQ4IDI2OSAxODcgMjk1IDUzIDk1IDIxNyA0IDI4MyAyMDMgMjg3IDEwNyA5MyAzMDIgMTkzIDI3IDExNiAxMjIgCisyNDAgMjM2IDcgMjY4IDE3IDI0MiAxMjUgMTMgMTAwIDE5MSAxMjUgMjM4IDI5NSA3OSAyNzMgMTcgMjI5IDE5MiAyNjkgMTc0IDUwIAorMzA5IDE2OSAxMzcgMTI3IDE1MyA0NSAyMyA0OCAxMjEgOTYgNDkgMjUyIDk5IDEyMSAxODMgMTY2IDUyIDEyIDMwIDE4OCA1MyAzMDcgCisxNjcgMTQ4IDEzMiAyMTQgMzIgOTAgMzA0IDE5NSAxNiAxNzIgMTIyIDI1MyAxNjkgNjMgMjU1IDk3IDExOSAxOTQgMTcxIDUyIDI1MCAKKzk3IDEzMiAxMjcgMjI3IDI5MCA3OSAyODYgMjYyIDI4NSAxMTggMzcgNTEgMTgwIDk0IDYwIDE5NiA5OSA0NyAyNTAgMTEwIDY1IDE4MyAKKzE1MyAxMTkgMjY4IDQzIDEwOCAyMzcgMjM4IDkgMjU3IDEyIDI0MiAxMzggMjU4IDE1NiAxMTcgMjY2IDExNSA1MiAyMzcgMTY0IDc2IAorMjAxIDg2IDEwMSAyNjEgMTI4IDMxMCAyMjYgMjA3IDE0MyAxNTggMzIgNzcgNTkgMTM5IDI5IDMxIDI0NSAxMjMgMTEgMTcyIDEzNSAKKzE4NiAyMjUgNTAgMjMgMjg2IDI0OSA0MCA2MiAxMTEgMjIyIDMwMyAyNSAyNzUgMjQ0IDQwIDEzNiA0NCAyNzggMjkwIDEwNSA5MSA2MiAKKzE5OCAyNyAxMDMgMjUwIDE4NCAzMTAgMjM5IDc5IDE5OSA4NCAxNzMgMjY2IDEyOCAyOTcgMjkzIDE1MSAyMTcgMTcgMjE2IDI1OSAyMTMgCisxODcgMjgyIDEyMCAzOSAyOTEgMjM2IDk0IDEzNCAxMjkgMTU1IDM0IDE4IDI5OSAxOTUgMjkgMTA1IDE3OCAxNzkgMzEwIDI1MiAxMiAKKzI1NSA3MSAyIDgyIDI1OCAxNDMgMjQ1IDIxMCAxODkgMjg0IDQ4IDk1IDI5MSAyNDkgMjcgMTkwIDU1IDI5NiAyMjMgMTQ4IDE0NSA4NiAKKzg4IDE2IDcyIDcyIDg1IDE4IDc0IDE0MSAxOCA4NyAyNDUgMTk3IDI1NiAyMjggMTIyIDI2NiAxMDIgMTE5IDE4MSAyMzggMzA4IDEyIAorMTcgNCA1OCA2OSAyNiAyMCAyIDU2IDgwIDMxIDIwIDMwMSAxMjMgMjQgNDQgMTkxIDExMiA1NCAyMzkgMTUzIDEzMiAxNDAgOTkgMzQgNSAKKzU0IDEzOSA0MiAyNzYgMzAxIDExMCAxNTIgNDkgMjY1IDMyIDE3NyAxMDkgMzA3IDE4MCA4MSAxODggMTQwIDE3MyAyNzkgNjEgNDEgCisyMTkgMjMxIDk0IDE0NyAxIDIxMSAyNzIgMTU5IDE3NiAyNjQgMTg3IDU3IDIzNyAxNTEgMjA0IDE0NSAxNjAgMjEgNzIgNTkgMTUyIAorMjc0IDg3IDIzMiAyNjQgMjAwIDI0MSAyOTMgNzcgMjg0IDIyIDIyOSAxNzkgMjQgMTE4IDEyNCAxNjggMjkyIDcgMzAgMjYyIDI5OCA1MSAKKzkzIDI4OSA5IDI4MyAxOTAgNDIgNTEgMTY3IDIyMiA0IDI3MCAxOSAyMzEgMTIwIDEzIDExMyAxMjQgMTgxIDIyNSA2MyAyNjggMzAgCisxNzUgMTgxIDI1MSAyNDEgNjggMjU1IDg0IDE4NiAxMzggMTg0IDIyMyA2MSAyOCAzNSAxNzUgMTA3IDYgMTg1IDgxIDExNCAyMDcgMTE3IAorNDEgMjkzIDE2NCAxNTAgNzMgMTQyIDg4IDkwIDUgMTI4IDExIDk4IDI2MyAxMzAgMjk5IDIyMSAxNDYgMjE3IDkxIDg4IDMgMTM5IDE2IAorMTU5IDE4OSAxOTcgMjQzIDI5NSA2NiAyOCAyNzMgMzAzIDUxIDgwIDQ0IDI2NSA0NSA0OSAxNjUgMjMzIDkgMjcwIDI1NyAyOTggNjQgCisyNiAzMyAyNDcgMTEyIDY3IDExMSAyMDkgNTggMjgxIDI4OCAxNjQgMTYzIDYgMTk4IDE0IDE3MCAxOTQgMTk3IDE2OSA1MCAxMCA0MSAKKzE5MyAxMTQgMjk0IDIzNCA5MiAxNDUgNzMgMTU1IDIxIDE0NiAyNDMgMjA4IDIwMCAyMjggNDggMjEgNDYgMTkzIDQwIDQ5IDE3OCAxNjYgCis2NSAxOTYgODYgMTc1IDE5NCAxODQgMjk3IDMwNiAyMyAyNzMgMjA2IF4KKzY0MSAwIDI5NiAxMzQgMjUgMzEgMjMwIDE3NyA3IDE4MyA2NiAyMzggMTUxIDEzMCAyMTAgMTAwIDM0IDMwMiAxNzggNzkgMTE0IDE5MiAKKzExMiAyOTIgMzA0IDkzIDIwMiA1NiAyNzkgMjczIDE1OSAxNTkgMTkgMTI3IDY4IDE1MyAyNzQgNzIgMjk3IDIwNiAyNzAgMTU3IDEwNCAKKzQgMTI2IDY2IDE2OCAyMDUgMTI4IDIyNSAzMSA5MCAyMzAgMjYyIDI2OCAyNDIgMzYgNjIgMzkgMjc0IDMwMSAzNiAxNDcgMzAwIDI3OCAKKzIxNiAyMjkgMzUgNzUgNTUgMjA3IDI4IDg4IDIzMCAyNDcgMjY3IDE4NSA1MSAzMDcgOTUgMjAyIDcxIDIyNSAyNzUgMTQ0IDIyOCAxOCAKKzE0NCAyOTggMjc4IDIwMSAyMjggMzMgMTQ1IDMwMCAyNjMgMjcwIDE3MiAxMDUgNiAxMTEgMTM1IDExMiAyNzcgNDQgMzYgMjE3IDMwMSAKKzIxIDIwMSAyOTggMzQgMTQ3IDI4NSAxOCAyMTQgMjQ0IDI4MCAxMzEgMzggMjkxIDE2MiAxNjEgNzQgMTQyIDE0IDE1NSAyNTkgMTQxIAorMjQxIDI3OCAxMzEgMjgyIDMxIDE2MCAyMzEgNSAxOTggMzExIDI5NCAxMzQgMjY5IDg1IDE3MyAxOTIgMjUyIDIzOSA0OSA4IDI2IDI1OCAKKzU0IDUwIDE1MCAyNzIgNzIgMjI3IDI2MCAyMTMgMTcyIDM1IDYwIDEwOSAxNTAgNDMgMTkgMjg2IDE3NSA5MiA2MCAxMjQgMTUxIDQ1IAorMjYzIDQxIDExOSAxMDkgMjkwIDMwNCAyMyAyMDEgNTQgMjk0IDE0OSAyMTUgODcgMTU4IDIgMTk2IDMxMSAyMjQgMTMzIDI2NyAxMDAgCisxMDQgMjQ4IDE4MCA5IDE4MyAxMzYgMTg0IDIwOCAxMTUgMjc5IDQ0IDEwNiAxNjMgMzAzIDI2NSAyNzAgMjQyIDUxIDggOTYgMjA0IDU2IAorMjk0IDIxOSAyMTYgODkgMTQzIDcxIDE0MCAxNCA4NSAzMTMgMTM5IDI1NiAxNTQgMTg3IDIxMCAxMTUgMzUgMzA0IDEwOCAxNDggNTggCisyMDkgMjggMTAzIDE3NiAyNDkgMjUyIDMwOSAzMDkgMTAgMTEgMTMgMzEyIDY3IDExIDgzIDI1OCA2OSAzMTAgMTUyIDIwMiAxNDEgMTcxIAorMjc3IDEyOSAyOTcgMjc2IDIxNiAxNTkgODkgNzMgNzAgODMgMjkgMTYgNjcgODEgMjkgMSA1NCA2NSA5NiAyNzQgMiAzNyAyMDQgMjg1IAorMzMgMTYwIDI0NiAyNjUgMjU1IDI5NiA0OSA3OCAyNyAyNjAgMzkgMTE5IDk0IDI4OSAyNDcgMzggMTMyIDU1IDIyMiAyODggOTAgMjE1IAorMiAyMTEgMjU3IDIyNiAxMTggMjIgNDQgMTc2IDE2NCAzMDUgMjUwIDI1IDE4NiAxMjMgMjM4IDIyMSAxMzEgMjEyIDMwIDE1OCAyNDYgCisxOTUgMjU0IDIzOSA2NCA5IDI4IDI0MyAxMjMgMzA4IDE2NyAxMzMgMTk3IDE1NCAxMDIgNCAxMTEgNjUgMTY2IDIyMCA1OSAyODEgMjczIAorMjI5IDEwNSA3NiA1NyAxMzcgOTcgMzIgMzAyIDEwOCA3OCAxMTIgMjA3IDQzIDM0IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAyNzUgNzQgCisyODIgMjc1IDIxNCAxNzQgMjAgMTI5IDUzIDIyMiAyMTggMTQ0IDE1OCAxNyAxNDIgMzEzIDIwOSAyNTcgMjExIDE3MiAyMCA1OSA1MiAKKzIyMCAyODggMjAgMjE0IDI4MSAxODggMjgyIDQ2IDEwNiAyMzMgMjQ5IDggMjU1IDMxMSAzMDkgODAgMjcxIDE1IDI5NyAxMzYgMjY5IAorMTAwIDE3NCAyNDkgMTgyIDMwOCAzMDcgODAgMjU2IDY5IDI0MCAyMDYgMjAwIDE1NiAxMDIgMTkgNTcgMTIyIDk2IDMwIDMgMzkgMTM0IAorNDAgMzIgMjMyIDE2MiA3NiAxMjcgMTM4IDk5IDE3IDU3IDUyIDE1MCAyODcgMTggMjg0IDE5MCAyMyAxMTYgMTA3IDIzNSAyMzQgNzcgCisxOTkgNjkgMjI1IDIwNSAxOTggMjI2IDMzIDc1IDQwIDIwNiAyODUgMTAzIDE2MSAzMDMgMjUwIDEwIDI0MCA2NiAyNTMgMTUyIDE4NyAKKzE5NSAxNjkgMzMgNSAzOSAyMDQgNDEgMzQgMjE3IDIzMSAyMCAxOTkgMzEzIDIyNCAyMDMgMjEzIDEwMiA4OSAzIDEyNCA4MSA5OSAyNjEgCis1NiA1MCAxNjUgMjE4IDc0IDIxMiAxNSAxNTcgMjQ0IDI2NSAxODUgMjk1IDQ3IDkzIDIxNyAyIDI4MSAyMDMgMjgzIDEwMyA5MSAzMDIgCisxOTMgMjUgMTE2IDEyMiAyMzYgMjM2IDcgMjY4IDEzIDI0MiAxMjEgOSA5OCAxODkgMTI1IDIzOCAyOTEgNzcgMjY5IDE1IDIyNyAxOTAgCisyNjcgMTcwIDUwIDMwNSAxNjUgMTMzIDEyNyAxNTMgNDUgMTkgNDIgMTIxIDk0IDQ1IDI0OCA5NSAxMTcgMTc5IDE2NiA0NiA2IDI2IAorMTg4IDUzIDMwNyAxNjUgMTQ4IDEyOCAyMTAgMzAgODggMzAwIDE5MyAxMCAxNzAgMTIwIDI1MSAxNjcgNjMgMjUxIDk3IDExNyAxOTQgCisxNjcgNDggMjUwIDk1IDEzMiAxMjUgMjIzIDI5MCA3NSAyODQgMjYwIDI4MyAxMTggMzcgNDUgMTc4IDk0IDYwIDE5NCA5NyA0NyAyNDggCisxMTAgNjMgMTgxIDE1MSAxMTUgMjY0IDQzIDEwNCAyMzMgMjM0IDcgMjUzIDEyIDI0MCAxMzYgMjU0IDE1NCAxMTcgMjY0IDExMyA1MCAKKzIzNSAxNjQgNzYgMTk3IDg0IDEwMSAyNjEgMTI2IDMxMCAyMjIgMjAzIDE0MyAyNzYgXgorNjU2IDAgMzIgNjkgNTEgMTM1IDI1IDMxIDI0NSAxMjMgNyAxNjQgMTM1IDE3OCAyMjEgNDIgMTkgMjg2IDI0MSAzNiA2MiAxMDcgMjE4IAorMzAzIDE3IDI2NyAyNDQgMzIgMTI4IDM2IDI3NCAyODIgMTA1IDkxIDU0IDE5MCAyNyA5OSAyNDIgMTc2IDMwNiAyMzUgNzkgMTk5IDg0IAorMTY5IDI1OCAxMjggMjkzIDI4OSAxNDMgMjEzIDE3IDIwOCAyNTkgMjA5IDE4NyAyNzggMTEyIDM1IDI4NyAyMjggOTAgMTI2IDEyMSAKKzE1MSAyNiAxOCAyOTkgMTg3IDIxIDk3IDE3NCAxNzkgMzAyIDI1MiA4IDI1NSA2MyAzMDYgODIgMjU0IDEzNSAyMzcgMjA2IDE4MSAyNzYgCis0NCA4NyAyODMgMjQ1IDE5IDE4MiA1MSAyODggMjE1IDE0NCAxNDEgODYgODQgMTYgNjggNjQgODEgMTAgNjYgMzEyIDEzMyA2IDgzIAorMjQxIDE4OSAyNTIgMjIwIDExNCAyNjYgOTQgMTE5IDE3NyAyMzQgMzA0IDQgNSAzMDggNDYgNjEgMjYgOCAzMTQgNDggODAgMjMgMTIgCisyOTcgMTE5IDI0IDQ0IDE5MSAxMDggNDIgMjMxIDE0NSAxMjggMTQwIDk5IDMwIDEgNTQgMTMxIDQyIDI3NiAzMDEgMTAyIDE0NCAzNyAKKzI2MSAyMCAxNjkgMTA1IDMwMyAxODAgNzcgMTgwIDEzNiAxNjUgMjc1IDU3IDMzIDIxOSAyMzEgODYgMTQzIDEgMjA3IDI3MiAxNTUgCisxNzIgMjY0IDE3OSA0NSAyMzcgMTQ3IDE5NiAxMzcgMTUyIDEzIDcyIDQ3IDE1MiAyNzAgODcgMjI0IDI2MCAxOTYgMjQxIDI5MyA3NyAKKzI4NCAxMCAyMjkgMTcxIDIwIDExMCAxMjAgMTY0IDI4OCAzIDE4IDI1NCAyOTggNDcgOTMgMjg1IDMxMyAyODMgMTg2IDM0IDQzIDE1OSAKKzIxNCA0IDI2MiA3IDIyMyAxMjAgMSAxMTMgMTE2IDE4MSAyMTcgNTkgMjY0IDI2IDE3MSAxNzMgMjUxIDIzMyA2MCAyNTEgODAgMTg2IAorMTM4IDE4NCAyMjMgNjEgMTYgMjMgMTc1IDEwNyA2IDE3NyA4MSAxMTQgMjA3IDEwOSAyOSAyODUgMTYwIDE0MiA3MyAxMzggODAgODIgCiszMTMgMTIwIDExIDk4IDI1NSAxMjIgMjkxIDIyMSAxNDYgMjA5IDgzIDg4IDMxNSAxMzkgOCAxNTEgMTg5IDE5MyAyMzUgMjkxIDU4IDIwIAorMjczIDI5NSA1MSA3NiA0MCAyNTcgMzcgNDkgMTYxIDIzMyAxIDI2NiAyNTcgMjk0IDY0IDIyIDI1IDI0MyAxMDQgNTkgMTExIDIwMSA1OCAKKzI3NyAyODggMTU2IDE1OSAyIDE5NCAxMCAxNzAgMTg2IDE5NyAxNjkgNDYgMiA0MSAxODUgMTA2IDI5MCAyMzQgOTIgMTQ1IDY5IDE1NSAKKzkgMTM4IDI0MyAyMDggMjAwIDIyNCA0OCAyMSAzOCAxODkgNDAgNDUgMTc4IDE2MiA1NyAxOTYgNzggMTY3IDE5MCAxODAgMjg5IDMwNiAKKzIzIDI2OSAzMTIgMjk2IDEzMiAxOSAyOSAyMjYgMTc1IDMgMTgxIDY0IDIzNCAxNTEgMTMwIDIwOCA5NiAzNCAzMDAgMTc0IDc1IDExMiAKKzE4OCAxMTIgMjkyIDMwMiA4OSAxOTggNTIgMjc1IDI2OSAxNTkgMTU1IDE5IDEyMyA2NiAxNDkgMjc0IDcwIDI5NSAyMDQgMjY2IDE1MyAKKzEwNCAxMjYgNjIgMTY2IDIwMyAxMjYgMjI1IDI1IDkwIDIzMCAyNjIgMjY0IDIzOCAzMCA2MCAzOSAyNzAgMjk5IDM0IDE0NyAzMDAgCisyNzggMjE2IDIyNSAzNSA3NSA1MyAyMDMgMjIgODQgMjI4IDI0MyAyNjcgMTg1IDQ3IDMwNSA5NSAyMDAgNzEgMjIzIDI3MyAxNDIgMjI2IAorMTIgMTQ0IDI5NCAyNzYgMTk3IDIyOCAzMSAxNDEgMjk4IDI1OSAyNjggMTcyIDEwMSA0IDEwOSAxMzMgMTEwIDI3MyAzOCAzNiAyMTUgCisyOTcgMTUgMTk5IDI5NiAyOCAxNDUgMjgxIDE0IDIxMiAyNDIgMjgwIDEzMSAzMiAyOTEgMTYyIDE2MSA3MCAxNDIgMTQgMTUzIDI1NyAKKzE0MSAyMzkgMjc0IDEyOSAyODAgMjcgMTU4IDIyNyAzMTUgMTk4IDMwOSAyOTAgMTMwIDI2NyA4MSAxNzMgMTkyIDI0OCAyMzcgNDMgNiAKKzI0IDI1NiA1MCA0NCAxNDYgMjY4IDY4IDIyNyAyNTYgMjEzIDE3MCAzMyA1NiAxMDUgMTUwIDM5IDEzIDI4NCAxNzMgODggNTggMTI0IAorMTQ3IDQzIDI2MyAzOSAxMTcgMTA5IDI4NiAzMDAgMjEgMjAxIDQ4IDI5MiAxNDkgMjE1IDg1IDE1NiAzMTIgMTkyIDMwNyAyMjIgMTMzIAorMjYzIDk4IDEwMiAyNDggMTc4IDkgMTgzIDEzMiAxODIgMjA0IDExMyAyNzkgNDAgMTA0IDE2MyAzMDEgMjY1IDI3MCAyNDAgNDkgOCA5MiAKKzIwNCA1NCAyOTQgMjE3IDIxMiA4OSAxMzkgNjcgMTM2IDEyIDg1IDMwOSAxMzcgMjU2IDE1NCAxODUgMjEwIDExNSAzMSAzMDQgMTA4IAorMTQ2IDU2IDIwOSAyNCAxMDMgMTc2IDI0NyAyNTAgMzA1IDMwNyAxMCA3IDExIDMxMCA2NSA5IDc5IDI1OCA2OSAzMDggMTUwIDIwMiAKKzEzOSAxNzEgMjc3IDEyNSAyOTcgMjcyIDIxNCAxNTcgODcgNzEgNzAgODMgMjkgMTQgNjcgNzcgMjcgMzExIDUyIDYzIDk0IDI3MiAyIAorMzEgMjAwIDI4MyAzMyAxNjAgMjQ2IDI2MyAyNTEgMjkyIDQ1IDc0IDIxIDI2MCAzMyAxMTUgOTAgMjg5IDI0NyAzOCAxMzAgNTUgMjIyIAorMjg2IDg4IDIxMSAyMjcgXgorNjY4IDAgMjExIDI1NCAyMjYgMTE1IDE2IDQxIDE3MCAxNTggMzA1IDI0NyAyNSAxODMgMTE3IDIzNSAyMTggMTI1IDIxMiAzMCAxNTIgCisyNDMgMTk1IDI1NCAyMzkgNjEgMjggMjM3IDEyMCAzMDIgMTY3IDEzMCAxOTQgMTQ4IDk2IDMxMiAxMDUgNjUgMTYwIDIyMCA1MyAyODEgCisyNzAgMjI2IDEwMiA3MCA1NyAxMzcgOTEgMjYgMjk2IDEwNSA3OCAxMDYgMjA0IDQwIDMxIDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAyNjkgCis3NCAyNzYgMjc1IDIwOCAxNzQgMTQgMTI2IDQ3IDIxOSAyMTggMTM4IDE1OCAxNCAxMzkgMzEwIDIwMyAyNTEgMjA1IDE2NiAxMSA1OSAKKzUyIDIxNCAyODIgMjAgMjE0IDMwOCAyNzUgMTgyIDI4MiA0NiAxMDYgMjMwIDI0OSAzMTYgMjUyIDMxMSAzMDkgNzcgMjcxIDE1IDI5MSAKKzEzNiAyNjkgMTAwIDE2OCAyNDMgMTgyIDMwOCAzMDEgNzQgMjUwIDY2IDI0MCAyMDAgMTk3IDE1NiA5OSAxNiA1NCAxMTYgOTYgMjEgCiszMTQgMzMgMTM0IDM3IDIzIDIyOSAxNTYgNzMgMTI0IDEzMiA5NiA4IDUxIDQ5IDE0NyAyODcgMTUgMjc4IDE5MCAxNCAxMTMgMTAxIAorMjM1IDIzMSA3MSAxOTYgNjMgMjE5IDIwNSAxOTIgMjIwIDI3IDcyIDMxIDIwNiAyODUgMTAwIDE1NSAyOTcgMjQ0IDQgMjM0IDY2IDI1MyAKKzE0NiAxODEgMTg5IDE2NiAyNCA1IDM2IDIwMSAzMiAyOCAyMTEgMjI4IDE3IDE5MyAzMTMgMjI0IDIwMCAyMTAgMTAyIDgzIDMgMTIxIAorNzggOTMgMjU4IDU2IDQ0IDE2NSAyMTUgNzEgMjA5IDkgMTU3IDIzOCAyNTkgMTgyIDI5NSAzOCA5MCAyMTcgMzE2IDI3OCAyMDMgMjc3IAorOTcgODggMzAyIDE5MyAyMiAxMTYgMTIyIDIzMCAyMzYgNyAyNjggNyAyNDIgMTE1IDMgOTUgMTg2IDEyNSAyMzggMjg1IDc0IDI2MyAxMiAKKzIyNCAxODcgMjY0IDE2NCA1MCAyOTkgMTU5IDEyNyAxMjcgMTUzIDQ1IDEzIDMzIDEyMSA5MSAzOSAyNDIgODkgMTExIDE3MyAxNjYgMzcgCiszMTQgMjAgMTg4IDUzIDMwNyAxNjIgMTQ4IDEyMiAyMDQgMjcgODUgMjk0IDE5MCAxIDE2NyAxMTcgMjQ4IDE2NCA2MyAyNDUgOTcgMTE0IAorMTk0IDE2MSA0MiAyNTAgOTIgMTMyIDEyMiAyMTcgMjkwIDY5IDI4MSAyNTcgMjgwIDExOCAzNyAzNiAxNzUgOTQgNjAgMTkxIDk0IDQ3IAorMjQ1IDExMCA2MCAxNzggMTQ4IDEwOSAyNTggNDMgOTggMjI3IDIyOCA0IDI0NyAxMiAyMzcgMTMzIDI0OCAxNTEgMTE3IDI2MSAxMTAgCis0NyAyMzIgMTY0IDc2IDE5MSA4MSAxMDEgMjYxIDEyMyAzMTAgMjE2IDE5NyAxNDMgMTUzIDMyIDY3IDQ5IDEzNCAyNCAzMSAyNDUgMTIzIAorNiAxNjIgMTM1IDE3NiAyMjAgNDAgMTggMjg2IDIzOSAzNSA2MiAxMDYgMjE3IDMwMyAxNSAyNjUgMjQ0IDMwIDEyNiAzNCAyNzMgMjgwIAorMTA1IDkxIDUyIDE4OCAyNyA5OCAyNDAgMTc0IDMwNSAyMzQgNzkgMTk5IDg0IDE2OCAyNTYgMTI4IDI5MiAyODggMTQxIDIxMiAxNyAKKzIwNiAyNTkgMjA4IDE4NyAyNzcgMTEwIDM0IDI4NiAyMjYgODkgMTI0IDExOSAxNTAgMjQgMTggMjk5IDE4NSAxOSA5NSAxNzMgMTc5IAorMzAwIDI1MiA3IDI1NSA2MSAzMDQgODIgMjUzIDEzMyAyMzUgMjA1IDE3OSAyNzQgNDMgODUgMjgxIDI0NCAxNyAxODAgNTAgMjg2IDIxMyAKKzE0MyAxNDAgODYgODMgMTYgNjcgNjIgODAgOCA2NCAzMTIgMTMxIDMgODIgMjQwIDE4NyAyNTEgMjE4IDExMiAyNjYgOTIgMTE5IDE3NiAKKzIzMyAzMDMgMiAyIDMwNiA0MyA1OSAyNiA1IDMxNCA0NiA4MCAyMSAxMCAyOTYgMTE4IDI0IDQ0IDE5MSAxMDcgMzkgMjI5IDE0MyAxMjcgCisxNDAgOTkgMjkgNTQgMTI5IDQyIDI3NiAzMDEgMTAwIDE0MiAzNCAyNjAgMTcgMTY3IDEwNCAzMDIgMTgwIDc2IDE3OCAxMzUgMTYzIAorMjc0IDU2IDMxIDIxOSAyMzEgODQgMTQyIDEgMjA2IDI3MiAxNTQgMTcxIDI2NCAxNzcgNDIgMjM3IDE0NiAxOTQgMTM1IDE1MCAxMSA3MiAKKzQ0IDE1MiAyNjkgODcgMjIyIDI1OSAxOTUgMjQxIDI5MyA3NyAyODQgNyAyMjkgMTY5IDE5IDEwOCAxMTkgMTYzIDI4NyAyIDE1IDI1MiAKKzI5OCA0NiA5MyAyODQgMzExIDI4MyAxODUgMzIgNDEgMTU3IDIxMiA0IDI2MCA0IDIyMSAxMjAgMzE1IDExMyAxMTQgMTgxIDIxNSA1OCAKKzI2MyAyNSAxNzAgMTcxIDI1MSAyMzEgNTggMjUwIDc5IDE4NiAxMzggMTg0IDIyMyA2MSAxMyAyMCAxNzUgMTA3IDYgMTc1IDgxIDExNCAKKzIwNyAxMDcgMjYgMjgzIDE1OSAxNDAgNzMgMTM3IDc4IDgwIDMxMiAxMTggMTEgOTggMjUzIDEyMCAyODkgMjIxIDE0NiAyMDcgODEgODggCiszMTUgMTM5IDYgMTQ5IDE4OSAxOTIgMjMzIDI5MCA1NiAxOCAyNzMgMjkzIDUxIDc1IDM5IDI1NSAzNSA0OSAxNjAgMjMzIDMxNiAyNjUgCisyNTcgMjkzIDY0IDIxIDIzIDI0MiAxMDIgNTcgMTExIDE5OSA1OCAyNzYgMjg4IDE1NCAxNTggMSAxOTMgOSAxNzAgMTg0IDE5NyAxNjkgCis0NSA0MSAxODMgMTA0IDI4OSAyMzQgOTIgMTQ1IDY4IDE1NSA2IDEzNiAyNDMgMjA4IDIwMyBeCis2NTYgMCAyMjEgNDggMjEgMzIgMTg2IDQwIDQyIDE3OCAxNTkgNTEgMTk2IDcyIDE2MSAxODcgMTc3IDI4MyAzMDYgMjMgMjY2IDMwOSAKKzI5NiAxMjkgMTAgMjYgMjIwIDE3MiAzMTYgMTc4IDYxIDIyOCAxNTEgMTMwIDIwNSA5MCAzNCAyOTcgMTY4IDY5IDEwOSAxODIgMTEyIAorMjkyIDI5OSA4MyAxOTIgNDYgMjY5IDI2MyAxNTkgMTQ5IDE5IDExNyA2MyAxNDMgMjc0IDY3IDI5MiAyMDEgMjYwIDE0NyAxMDQgMzEzIAorMTI2IDU2IDE2MyAyMDAgMTIzIDIyNSAxNiA5MCAyMzAgMjYyIDI1OCAyMzIgMjEgNTcgMzkgMjY0IDI5NiAzMSAxNDcgMzAwIDI3OCAKKzIxNiAyMTkgMzUgNzUgNTAgMTk3IDEzIDc4IDIyNSAyMzcgMjY3IDE4NSA0MSAzMDIgOTUgMTk3IDcxIDIyMCAyNzAgMTM5IDIyMyAzIAorMTQ0IDI4OCAyNzMgMTkxIDIyOCAyOCAxMzUgMjk1IDI1MyAyNjUgMTcyIDk1IDEgMTA2IDEzMCAxMDcgMjY3IDI5IDM2IDIxMiAyOTEgNiAKKzE5NiAyOTMgMTkgMTQyIDI3NSA4IDIwOSAyMzkgMjgwIDEzMSAyMyAyOTEgMTYyIDE2MSA2NCAxNDIgMTQgMTUwIDI1NCAxNDEgMjM2IAorMjY4IDEyNiAyNzcgMjEgMTU1IDIyMSAzMDkgMTk4IDMwNiAyODQgMTI0IDI2NCA3NSAxNzMgMTkyIDI0MiAyMzQgMzQgMyAyMSAyNTMgCis0NCAzNSAxNDAgMjYyIDYyIDIyNyAyNTAgMjEzIDE2NyAzMCA1MCA5OSAxNTAgMzMgNCAyODEgMTcwIDgyIDU1IDEyNCAxNDEgNDAgMjYzIAorMzYgMTE0IDEwOSAyODAgMjk0IDE4IDIwMSAzOSAyODkgMTQ5IDIxNSA4MiAxNTMgMzA2IDE4NiAzMDEgMjE5IDEzMyAyNTcgOTUgOTkgCisyNDggMTc1IDkgMTgzIDEyNiAxNzkgMTk4IDExMCAyNzkgMzQgMTAxIDE2MyAyOTggMjY1IDI3MCAyMzcgNDYgOCA4NiAyMDQgNTEgMjk0IAorMjE0IDIwNiA4OSAxMzMgNjEgMTMwIDkgODUgMzAzIDEzNCAyNTYgMTU0IDE4MiAyMTAgMTE1IDI1IDMwNCAxMDggMTQzIDUzIDIwOSAxOCAKKzEwMyAxNzYgMjQ0IDI0NyAyOTkgMzA0IDEwIDEgOCAzMDcgNjIgNiA3MyAyNTggNjkgMzA1IDE0NyAyMDIgMTM2IDE3MSAyNzcgMTE5IAorMjk3IDI2NiAyMTEgMTU0IDg0IDY4IDcwIDgzIDI5IDExIDY3IDcxIDI0IDMwNSA0OSA2MCA5MSAyNjkgMiAyMiAxOTQgMjgwIDMzIDE2MCAKKzI0NiAyNjAgMjQ1IDI4NiAzOSA2OCAxMiAyNjAgMjQgMTA5IDg0IDI4OSAyNDcgMzggMTI3IDU1IDIyMiAyODMgODUgMjA1IDMxMSAyMTEgCisyNTIgMjI2IDExMyAxMiAzOSAxNjYgMTU0IDMwNSAyNDUgMjUgMTgxIDExMyAyMzMgMjE2IDEyMSAyMTIgMzAgMTQ4IDI0MSAxOTUgMjU0IAorMjM5IDU5IDMxMyAyOCAyMzMgMTE4IDI5OCAxNjcgMTI4IDE5MiAxNDQgOTIgMzA4IDEwMSA2NSAxNTYgMjIwIDQ5IDI4MSAyNjggMjI0IAorMTAwIDY2IDU3IDEzNyA4NyAyMiAyOTIgMTAzIDc4IDEwMiAyMDIgMzggMjkgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDI2NSA3NCAyNzIgCisyNzUgMjA0IDE3NCAxMCAxMjQgNDMgMjE3IDIxOCAxMzQgMTU4IDEyIDEzNyAzMDggMTk5IDI0NyAyMDEgMTYyIDUgNTkgNTIgMjEwIAorMjc4IDIwIDIxNCAzMDQgMjcxIDE3OCAyODIgNDYgMTA2IDIyOCAyNDkgMzEyIDI1MCAzMTEgMzA5IDc1IDI3MSAxNSAyODcgMTM2IDI2OSAKKzEwMCAxNjQgMjM5IDE4MiAzMDggMjk3IDcwIDI0NiA2NCAyNDAgMTk2IDE5NSAxNTYgOTcgMTQgNTIgMTEyIDk2IDE1IDMxMiAyOSAxMzQgCiszNSAxNyAyMjcgMTUyIDcxIDEyMiAxMjggOTQgMiA0NyA0NyAxNDUgMjg3IDEzIDI3NCAxOTAgOCAxMTEgOTcgMjM1IDIyOSA2NyAxOTQgCis1OSAyMTUgMjA1IDE4OCAyMTYgMjMgNzAgMjUgMjA2IDI4NSA5OCAxNTEgMjkzIDI0MCAyMzAgNjYgMjUzIDE0MiAxNzcgMTg1IDE2NCAKKzE4IDUgMzQgMTk5IDI2IDI0IDIwNyAyMjYgMTUgMTg5IDMxMyAyMjQgMTk4IDIwOCAxMDIgNzkgMyAxMTkgNzYgODkgMjU2IDU2IDQwIAorMTY1IDIxMyA2OSAyMDcgNSAxNTcgMjM0IDI1NSAxODAgMjk1IDMyIDg4IDIxNyAzMTYgMjc2IDIwMyAyNzMgOTMgODYgMzAyIDE5MyAyMCAKKzExNiAxMjIgMjI2IDIzNiA3IDI2OCAzIDI0MiAxMTEgMzE4IDkzIDE4NCAxMjUgMjM4IDI4MSA3MiAyNTkgMTAgMjIyIDE4NSAyNjIgCisxNjAgNTAgMjk1IDE1NSAxMjMgMTI3IDE1MyA0NSA5IDI3IDEyMSA4OSAzNSAyMzggODUgMTA3IDE2OSAxNjYgMzEgMzEwIDE2IDE4OCAKKzUzIDMwNyAxNjAgMTQ4IDExOCAyMDAgMjUgODMgMjkwIDE4OCAzMTQgMTY1IDExNSAyNDYgMTYyIDYzIDI0MSA5NyAxMTIgMTk0IDE1NyAKKzM4IDI1MCA5MCAxMzIgMTIwIDIxMyAyOTAgNjUgMjc5IDI1NSAyNzggMTE4IDM3IDMwIDE3MyA5NCA2MCAxODkgOTIgNDcgMjQzIDExMCAKKzU4IDE3NiAxNDYgMTA1IDI1NCA0MyA5NCAyMjMgMjI0IDIgMjQzIDEyIDIzNSAxMzEgMjQ0IDE0OSAxMTcgMjU5IDEwOCA0NSAyMzAgCisxNjQgNzYgMTg3IDc5IDEwMSAyNjEgMTA5IF4KKzY1NiAwIDMxMCAyMDggMTg5IDE0MyAxNDkgMzIgNTkgNDEgMTMwIDIwIDMxIDI0NSAxMjMgMiAxNTQgMTM1IDE2OCAyMTYgMzIgMTQgCisyODYgMjMxIDMxIDYyIDEwMiAyMTMgMzAzIDcgMjU3IDI0NCAyMiAxMTggMjYgMjY5IDI3MiAxMDUgOTEgNDQgMTgwIDI3IDk0IDIzMiAKKzE2NiAzMDEgMjMwIDc5IDE5OSA4NCAxNjQgMjQ4IDEyOCAyODggMjg0IDEzMyAyMDggMTcgMTk4IDI1OSAyMDQgMTg3IDI3MyAxMDIgMzAgCisyODIgMjE4IDg1IDExNiAxMTEgMTQ2IDE2IDE4IDI5OSAxNzcgMTEgODcgMTY5IDE3OSAyOTIgMjUyIDMgMjU1IDUzIDI5NiA4MiAyNDkgCisxMjUgMjI3IDIwMSAxNzEgMjY2IDM5IDc3IDI3MyAyNDAgOSAxNzIgNDYgMjc4IDIwNSAxMzkgMTM2IDg2IDc5IDE2IDYzIDU0IDc2IDU2IAorMzEyIDEyMyAzMTIgNzggMjM2IDE3OSAyNDcgMjEwIDEwNCAyNjYgODQgMTE5IDE3MiAyMjkgMjk5IDMxNSAzMTEgMjk4IDMxIDUxIDI2IAorMzE0IDMxNCAzOCA4MCAxMyAyIDI5MiAxMTQgMjQgNDQgMTkxIDEwMyAyNyAyMjEgMTM1IDEyMyAxNDAgOTkgMjUgMzE3IDU0IDEyMSA0MiAKKzI3NiAzMDEgOTIgMTM0IDIyIDI1NiA1IDE1OSAxMDAgMjk4IDE4MCA3MiAxNzAgMTMxIDE1NSAyNzAgNTIgMjMgMjE5IDIzMSA3NiAxMzggCisxIDIwMiAyNzIgMTUwIDE2NyAyNjQgMTY5IDMwIDIzNyAxNDIgMTg2IDEyNyAxNDIgMyA3MiAzMiAxNTIgMjY1IDg3IDIxNCAyNTUgMTkxIAorMjQxIDI5MyA3NyAyODQgMzE2IDIyOSAxNjEgMTUgMTAwIDExNSAxNTkgMjgzIDMxOSAzIDI0NCAyOTggNDIgOTMgMjgwIDMwMyAyODMgCisxODEgMjQgMzMgMTQ5IDIwNCA0IDI1MiAzMTMgMjEzIDEyMCAzMDcgMTEzIDEwNiAxODEgMjA3IDU0IDI1OSAyMSAxNjYgMTYzIDI1MSAKKzIyMyA1MCAyNDYgNzUgMTg2IDEzOCAxODQgMjIzIDYxIDEgOCAxNzUgMTA3IDYgMTY3IDgxIDExNCAyMDcgOTkgMTQgMjc1IDE1NSAxMzIgCis3MyAxMzMgNzAgNzIgMzA4IDExMCAxMSA5OCAyNDUgMTEyIDI4MSAyMjEgMTQ2IDE5OSA3MyA4OCAzMTUgMTM5IDMxOSAxNDEgMTg5IAorMTg4IDIyNSAyODYgNDggMTAgMjczIDI4NSA1MSA3MSAzNSAyNDcgMjcgNDkgMTU2IDIzMyAzMTIgMjYxIDI1NyAyODkgNjQgMTcgMTUgCisyMzggOTQgNDkgMTExIDE5MSA1OCAyNzIgMjg4IDE0NiAxNTQgMzE4IDE4OSA1IDE3MCAxNzYgMTk3IDE2OSA0MSAzMTMgNDEgMTc1IDk2IAorMjg1IDIzNCA5MiAxNDUgNjQgMTU1IDMxNSAxMjggMjQzIDIwOCAyMDAgMjE5IDQ4IDIxIDI4IDE4NCA0MCA0MCAxNzggMTU3IDQ3IDE5NiAKKzY4IDE1NyAxODUgMTc1IDI3OSAzMDYgMjMgMjY0IDMwNyAyOTYgMTI3IDQgMjQgMjE2IDE3MCAzMTQgMTc2IDU5IDIyNCAxNTEgMTMwIAorMjAzIDg2IDM0IDI5NSAxNjQgNjUgMTA3IDE3OCAxMTIgMjkyIDI5NyA3OSAxODggNDIgMjY1IDI1OSAxNTkgMTQ1IDE5IDExMyA2MSAKKzEzOSAyNzQgNjUgMjkwIDE5OSAyNTYgMTQzIDEwNCAzMTEgMTI2IDUyIDE2MSAxOTggMTIxIDIyNSAxMCA5MCAyMzAgMjYyIDI1NCAyMjggCisxNSA1NSAzOSAyNjAgMjk0IDI5IDE0NyAzMDAgMjc4IDIxNiAyMTUgMzUgNzUgNDggMTkzIDcgNzQgMjIzIDIzMyAyNjcgMTg1IDM3IAorMzAwIDk1IDE5NSA3MSAyMTggMjY4IDEzNyAyMjEgMzE4IDE0NCAyODQgMjcxIDE4NyAyMjggMjYgMTMxIDI5MyAyNDkgMjYzIDE3MiA5MSAKKzMyMCAxMDQgMTI4IDEwNSAyNjMgMjMgMzYgMjEwIDI4NyAxOTQgMjkxIDEzIDE0MCAyNzEgNCAyMDcgMjM3IDI4MCAxMzEgMTcgMjkxIAorMTYyIDE2MSA2MCAxNDIgMTQgMTQ4IDI1MiAxNDEgMjM0IDI2NCAxMjQgMjc1IDE3IDE1MyAyMTcgMzA1IDE5OCAzMDQgMjgwIDEyMCAKKzI2MiA3MSAxNzMgMTkyIDIzOCAyMzIgMjggMSAxOSAyNTEgNDAgMjkgMTM2IDI1OCA1OCAyMjcgMjQ2IDIxMyAxNjUgMjggNDYgOTUgCisxNTAgMjkgMzE5IDI3OSAxNjggNzggNTMgMTI0IDEzNyAzOCAyNjMgMzQgMTEyIDEwOSAyNzYgMjkwIDE2IDIwMSAzMyAyODcgMTQ5IAorMjE1IDgwIDE1MSAzMDIgMTgyIDI5NyAyMTcgMTMzIDI1MyA5MyA5NyAyNDggMTczIDkgMTgzIDEyMiAxNzcgMTk0IDEwOCAyNzkgMzAgCis5OSAxNjMgMjk2IDI2NSAyNzAgMjM1IDQ0IDggODIgMjA0IDQ5IDI5NCAyMTIgMjAyIDg5IDEyOSA1NyAxMjYgNyA4NSAyOTkgMTMyIAorMjU2IDE1NCAxODAgMjEwIDExNSAyMSAzMDQgMTA4IDE0MSA1MSAyMDkgMTQgMTAzIDE3NiAyNDIgMjQ1IDI5NSAzMDIgMTAgMzE4IDYgCiszMDUgNjAgNCA2OSAyNTggNjkgMzAzIDE0NSAyMDIgMTM0IDE3MSAyNzcgMTE1IDI5NyAyNjIgMjA5IDE1MiA4MiA2NiA3MCA4MyAyOSA5IAorNjcgNjcgMjIgMzAxIDQ3IDU4IDg5IDI2NyAyIDE2IDE5MCAyNzggMzMgMTYwIDI0NiAyNTggMjQxIDI4MiAzNSA2NCA2IDI2MCAxOCAKKzEwNSA4MCAyODkgMjQ3IDM4IDEyNSA1NSAyOTIgXgorPEQKKworSD5TSFMgVHlwZSAzIFN0cmluZ3M8SAorRD4KKzQ1IDAgMTQgNSAzIDEgNCAxNiAxMiAyMCAxIDYgMTUgMTEgMTggNCAxNyAxNiA2IDEwIDMgMiA5IDkgMTQgNiAyIDggNiA3IDEwIDE3IAorMTIgMjAgNiA3IDUgMTYgMSA0IDIgMTcgMTAgMTUgOCAyMCAxIF4KKzxECisKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vZGVidWctYWxsb3ctYWxsLWZhaWwuY29uZi5pbiBiL2RidXMvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vZGVidWctYWxsb3ctYWxsLWZhaWwuY29uZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWIxNzhmCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbS9kZWJ1Zy1hbGxvdy1hbGwtZmFpbC5jb25mLmluCkBAIC0wLDAgKzEsMTcgQEAKKzwhLS0gQnVzIHRoYXQgbGlzdGVucyBvbiBhIGRlYnVnIHBpcGUgYW5kIGRvZXNuJ3QgY3JlYXRlIGFueSByZXN0cmljdGlvbnMgLS0+CisKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDxsaXN0ZW4+ZGVidWctcGlwZTpuYW1lPXRlc3Qtc2VydmVyPC9saXN0ZW4+CisgIDxsaXN0ZW4+QFRFU1RfTElTVEVOQDwvbGlzdGVuPgorICA8dHlwZT5zeXN0ZW08L3R5cGU+CisgIDxzZXJ2aWNlaGVscGVyPkBURVNUX0xBVU5DSF9IRUxQRVJfQklOQVJZQDwvc2VydmljZWhlbHBlcj4KKyAgPHNlcnZpY2VkaXI+QERCVVNfVEVTVF9EQVRBQC9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtPC9zZXJ2aWNlZGlyPgorICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDxhbGxvdyBzZW5kX2ludGVyZmFjZT0iKiIvPgorICAgIDxhbGxvdyByZWNlaXZlX2ludGVyZmFjZT0iKiIvPgorICAgIDxhbGxvdyBvd249IioiLz4KKyAgICA8YWxsb3cgdXNlcj0iKiIvPgorICA8L3BvbGljeT4KKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbS9kZWJ1Zy1hbGxvdy1hbGwtcGFzcy5jb25mLmluIGIvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbS9kZWJ1Zy1hbGxvdy1hbGwtcGFzcy5jb25mLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MzY2NzMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtL2RlYnVnLWFsbG93LWFsbC1wYXNzLmNvbmYuaW4KQEAgLTAsMCArMSwxNyBAQAorPCEtLSBCdXMgdGhhdCBsaXN0ZW5zIG9uIGEgZGVidWcgcGlwZSBhbmQgZG9lc24ndCBjcmVhdGUgYW55IHJlc3RyaWN0aW9ucyAtLT4KKworPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPGxpc3Rlbj5kZWJ1Zy1waXBlOm5hbWU9dGVzdC1zZXJ2ZXI8L2xpc3Rlbj4KKyAgPGxpc3Rlbj5AVEVTVF9MSVNURU5APC9saXN0ZW4+CisgIDx0eXBlPnN5c3RlbTwvdHlwZT4KKyAgPHNlcnZpY2VoZWxwZXI+QFRFU1RfTEFVTkNIX0hFTFBFUl9CSU5BUllAPC9zZXJ2aWNlaGVscGVyPgorICA8c2VydmljZWRpcj5AREJVU19URVNUX0RBVEFAL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtPC9zZXJ2aWNlZGlyPgorICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDxhbGxvdyBzZW5kX2ludGVyZmFjZT0iKiIvPgorICAgIDxhbGxvdyByZWNlaXZlX2ludGVyZmFjZT0iKiIvPgorICAgIDxhbGxvdyBvd249IioiLz4KKyAgICA8YWxsb3cgdXNlcj0iKiIvPgorICA8L3BvbGljeT4KKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2Jhc2ljLmNvbmYgYi9kYnVzL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvYmFzaWMuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mjk3MDk3Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2Jhc2ljLmNvbmYKQEAgLTAsMCArMSwzMiBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPHVzZXI+bXlidXN1c2VyPC91c2VyPgorICA8bGlzdGVuPnVuaXg6cGF0aD0vZm9vL2JhcjwvbGlzdGVuPgorICA8bGlzdGVuPnRjcDpwb3J0PTEyMzQ8L2xpc3Rlbj4KKyAgPGluY2x1ZGVkaXI+YmFzaWMuZDwvaW5jbHVkZWRpcj4KKyAgPHNlcnZpY2VkaXI+L3Vzci9zaGFyZS9mb288L3NlcnZpY2VkaXI+CisgIDxpbmNsdWRlIGlnbm9yZV9taXNzaW5nPSJ5ZXMiPm5vbmV4aXN0ZW50LmNvbmY8L2luY2x1ZGU+CisgIDxwb2xpY3kgY29udGV4dD0iZGVmYXVsdCI+CisgICAgPGFsbG93IHVzZXI9IioiLz4KKyAgPC9wb2xpY3k+CisKKyAgPGxpbWl0IG5hbWU9Im1heF9pbmNvbWluZ19ieXRlcyI+NTAwMDwvbGltaXQ+ICAgCisgIDxsaW1pdCBuYW1lPSJtYXhfb3V0Z29pbmdfYnl0ZXMiPjUwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X21lc3NhZ2Vfc2l6ZSI+MzAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9InNlcnZpY2Vfc3RhcnRfdGltZW91dCI+NTAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJhdXRoX3RpbWVvdXQiPjYwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyI+NTA8L2xpbWl0PiAgCisgIDxsaW1pdCBuYW1lPSJtYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyI+ODA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyIj42NDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfcGVuZGluZ19zZXJ2aWNlX3N0YXJ0cyI+NjQ8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X25hbWVzX3Blcl9jb25uZWN0aW9uIj4yNTY8L2xpbWl0PgorCisgIDxzZWxpbnV4PgorICAgICAgICA8YXNzb2NpYXRlIG93bj0ib3JnLmZyZWVkZXNrdG9wLkZyb2JhdGlvbmFyeU1lYXN1cmVzIgorICAgICAgICAgY29udGV4dD0ibXlfc2VsaW51eF9jb250ZXh0X3QiLz4KKyAgICAgICAgPGFzc29jaWF0ZSBvd249Im9yZy5mcmVlZGVza3RvcC5CbGFoQmxhaEJsYWgiCisgICAgICAgICBjb250ZXh0PSJmb29fdCIvPgorICA8L3NlbGludXg+CisKKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2Jhc2ljLmQvYmFzaWMuY29uZiBiL2RidXMvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9iYXNpYy5kL2Jhc2ljLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEwOWQ3MQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9iYXNpYy5kL2Jhc2ljLmNvbmYKQEAgLTAsMCArMSwxMyBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPHVzZXI+bXlidXN1c2VyPC91c2VyPgorICA8bGlzdGVuPnVuaXg6cGF0aD0vZm9vL2JhcjwvbGlzdGVuPgorICA8bGlzdGVuPnRjcDpwb3J0PTEyMzQ8L2xpc3Rlbj4KKyAgPGluY2x1ZGVkaXI+YmFzaWMuZDwvaW5jbHVkZWRpcj4KKyAgPHNlcnZpY2VkaXI+L3Vzci9zaGFyZS9mb288L3NlcnZpY2VkaXI+CisgIDxpbmNsdWRlIGlnbm9yZV9taXNzaW5nPSJ5ZXMiPm5vbmV4aXN0ZW50LmNvbmY8L2luY2x1ZGU+CisgIDxwb2xpY3kgY29udGV4dD0iZGVmYXVsdCI+CisgICAgPGFsbG93IHVzZXI9IioiLz4KKyAgPC9wb2xpY3k+Cis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9jaGVjay1vd24tcnVsZXMuY29uZiBiL2RidXMvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9jaGVjay1vd24tcnVsZXMuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzJmNDE1Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2NoZWNrLW93bi1ydWxlcy5jb25mCkBAIC0wLDAgKzEsMTQgQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDx1c2VyPm15YnVzdXNlcjwvdXNlcj4KKyAgPGxpc3Rlbj51bml4OnBhdGg9L2Zvby9iYXI8L2xpc3Rlbj4KKyAgPGxpc3Rlbj50Y3A6cG9ydD0xMjM0PC9saXN0ZW4+CisgIDxzZXJ2aWNlZGlyPi91c3Ivc2hhcmUvZm9vPC9zZXJ2aWNlZGlyPgorICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDxhbGxvdyB1c2VyPSIqIi8+CisgICAgPGRlbnkgb3duPSIqIi8+CisgICAgPGFsbG93IG93bl9wcmVmaXg9Im9yZy5mcmVlZGVza3RvcC5NYW55U3lzdGVtcyIvPgorICA8L3BvbGljeT4KKworPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvZGVidWctYWxsb3ctYWxsLXNoYTEuY29uZi5pbiBiL2RidXMvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwtc2hhMS5jb25mLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYWVlN2QKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvZGVidWctYWxsb3ctYWxsLXNoYTEuY29uZi5pbgpAQCAtMCwwICsxLDE2IEBACis8IS0tIEJ1cyB0aGF0IGxpc3RlbnMgb24gYSBkZWJ1ZyBwaXBlIGFuZCByZXF1aXJlcyBTSEExIGF1dGgsIHVzZWQgdG8gdGVzdCBTSEExIC0tPgorCis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8bGlzdGVuPmRlYnVnLXBpcGU6bmFtZT10ZXN0LXNlcnZlcjwvbGlzdGVuPgorICA8bGlzdGVuPkBURVNUX0xJU1RFTkA8L2xpc3Rlbj4KKyAgPHNlcnZpY2VkaXI+QERCVVNfVEVTVF9EQVRBQC92YWxpZC1zZXJ2aWNlLWZpbGVzPC9zZXJ2aWNlZGlyPgorICA8YXV0aD5EQlVTX0NPT0tJRV9TSEExPC9hdXRoPgorICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDxhbGxvdyBzZW5kX2ludGVyZmFjZT0iKiIvPgorICAgIDxhbGxvdyByZWNlaXZlX2ludGVyZmFjZT0iKiIvPgorICAgIDxhbGxvdyBvd249IioiLz4KKyAgICA8YWxsb3cgdXNlcj0iKiIvPgorICA8L3BvbGljeT4KKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2RlYnVnLWFsbG93LWFsbC5jb25mLmluIGIvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2RlYnVnLWFsbG93LWFsbC5jb25mLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZGYyMGQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvZGVidWctYWxsb3ctYWxsLmNvbmYuaW4KQEAgLTAsMCArMSwxNSBAQAorPCEtLSBCdXMgdGhhdCBsaXN0ZW5zIG9uIGEgZGVidWcgcGlwZSBhbmQgZG9lc24ndCBjcmVhdGUgYW55IHJlc3RyaWN0aW9ucyAtLT4KKworPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPGxpc3Rlbj5kZWJ1Zy1waXBlOm5hbWU9dGVzdC1zZXJ2ZXI8L2xpc3Rlbj4KKyAgPGxpc3Rlbj5AVEVTVF9MSVNURU5APC9saXN0ZW4+CisgIDxzZXJ2aWNlZGlyPkBEQlVTX1RFU1RfREFUQUAvdmFsaWQtc2VydmljZS1maWxlczwvc2VydmljZWRpcj4KKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8YWxsb3cgc2VuZF9pbnRlcmZhY2U9IioiLz4KKyAgICA8YWxsb3cgcmVjZWl2ZV9pbnRlcmZhY2U9IioiLz4KKyAgICA8YWxsb3cgb3duPSIqIi8+CisgICAgPGFsbG93IHVzZXI9IioiLz4KKyAgPC9wb2xpY3k+Cis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9lbnRpdGllcy5jb25mIGIvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2VudGl0aWVzLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzY2VhNwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9lbnRpdGllcy5jb25mCkBAIC0wLDAgKzEsMTQgQEAKKzwhLS0gVGhpcyBjb25maWcgZmlsZSBjb250YWlucyBYTUwgZW50aXRpZXMgLS0+Cis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8dXNlcj5teWJ1c3VzZXI8L3VzZXI+CisgIDxsaXN0ZW4+dW5peDpwYXRoPS9mb28vJmx0O2JhciZndDs8L2xpc3Rlbj4KKyAgPGxpc3Rlbj50Y3A6cG9ydD0xMjM0PC9saXN0ZW4+CisgIDxpbmNsdWRlZGlyPmJhc2ljLiYjMTAwOzwvaW5jbHVkZWRpcj4KKyAgPHNlcnZpY2VkaXI+L3Vzci8mYW1wO3NoYXJlL2Zvbzwvc2VydmljZWRpcj4KKyAgPGluY2x1ZGUgaWdub3JlX21pc3Npbmc9InllJiMxMTU7Ij5ub25leGlzdGVudC5jb25mJiMxMTA7PC9pbmNsdWRlPgorICA8cG9saWN5IGNvbnRleHQ9IiYjMTAwO2VmYXVsdCI+CisgICAgPGFsbG93IHVzZXI9IioiLz4KKyAgPC9wb2xpY3k+Cis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9pbmNvbWluZy1saW1pdC5jb25mIGIvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2luY29taW5nLWxpbWl0LmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJmYWIzZgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9pbmNvbWluZy1saW1pdC5jb25mCkBAIC0wLDAgKzEsMTggQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQnVzIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDwhLS0gT3VyIHdlbGwta25vd24gYnVzIHR5cGUsIGRvbid0IGNoYW5nZSB0aGlzIC0tPgorICA8dHlwZT5zZXNzaW9uPC90eXBlPgorICA8bGlzdGVuPnVuaXg6dG1wZGlyPS90bXA8L2xpc3Rlbj4KKworICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDwhLS0gQWxsb3cgZXZlcnl0aGluZyB0byBiZSBzZW50IC0tPgorICAgIDxhbGxvdyBzZW5kX2Rlc3RpbmF0aW9uPSIqIiBlYXZlc2Ryb3A9InRydWUiLz4KKyAgICA8IS0tIEFsbG93IGV2ZXJ5dGhpbmcgdG8gYmUgcmVjZWl2ZWQgLS0+CisgICAgPGFsbG93IGVhdmVzZHJvcD0idHJ1ZSIvPgorICAgIDwhLS0gQWxsb3cgYW55b25lIHRvIG93biBhbnl0aGluZyAtLT4KKyAgICA8YWxsb3cgb3duPSIqIi8+CisgIDwvcG9saWN5PgorCisgIDxsaW1pdCBuYW1lPSJtYXhfaW5jb21pbmdfYnl0ZXMiPjE8L2xpbWl0PgorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvbWFueS1ydWxlcy5jb25mIGIvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL21hbnktcnVsZXMuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzkzMTYyCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL21hbnktcnVsZXMuY29uZgpAQCAtMCwwICsxLDYxIEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8dXNlcj5teWJ1c3VzZXI8L3VzZXI+CisgIDxsaXN0ZW4+dW5peDpwYXRoPS9mb28vYmFyPC9saXN0ZW4+CisgIDxsaXN0ZW4+dGNwOnBvcnQ9MTIzNDwvbGlzdGVuPgorICA8aW5jbHVkZWRpcj5iYXNpYy5kPC9pbmNsdWRlZGlyPgorICA8c3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycyAvPgorICA8c2VydmljZWRpcj4vdXNyL3NoYXJlL2Zvbzwvc2VydmljZWRpcj4KKyAgPGluY2x1ZGUgaWdub3JlX21pc3Npbmc9InllcyI+bm9uZXhpc3RlbnQuY29uZjwvaW5jbHVkZT4KKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8YWxsb3cgdXNlcj0iKiIvPgorICAgIDxkZW55IHNlbmRfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuU3lzdGVtIiBzZW5kX21lbWJlcj0iUmVib290Ii8+IAorICAgIDxkZW55IHJlY2VpdmVfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuU3lzdGVtIiByZWNlaXZlX21lbWJlcj0iUmVib290Ii8+CisgICAgPGRlbnkgc2VuZF9wYXRoPSIvZm9vL2Jhci9TeXN0ZW1PYmplY3RUaGluZyIgc2VuZF9tZW1iZXI9IlJlYm9vdCIvPiAKKyAgICA8ZGVueSBvd249Im9yZy5mcmVlZGVza3RvcC5TeXN0ZW0iLz4KKyAgICA8ZGVueSBvd25fcHJlZml4PSJvcmcuZnJlZWRlc2t0b3AuTWFueVN5c3RlbXMiLz4KKyAgICA8ZGVueSBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuU3lzdGVtIi8+CisgICAgPGRlbnkgcmVjZWl2ZV9zZW5kZXI9Im9yZy5mcmVlZGVza3RvcC5TeXN0ZW0iLz4KKyAgICA8ZGVueSB1c2VyPSJyb290Ii8+CisgICAgPGRlbnkgZ3JvdXA9ImJpbiIvPgorICAgIDxhbGxvdyBzZW5kX3R5cGU9ImVycm9yIi8+CisgICAgPGFsbG93IHNlbmRfdHlwZT0ibWV0aG9kX2NhbGwiLz4KKyAgICA8YWxsb3cgc2VuZF90eXBlPSJtZXRob2RfcmV0dXJuIi8+CisgICAgPGFsbG93IHNlbmRfdHlwZT0ic2lnbmFsIi8+CisgICAgPGRlbnkgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLkJhciIgc2VuZF9pbnRlcmZhY2U9Im9yZy5mcmVlZGVza3RvcC5Gb28iLz4KKyAgICA8ZGVueSBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuQmFyIiBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLkZvbyIgc2VuZF90eXBlPSJtZXRob2RfY2FsbCIvPgorICA8L3BvbGljeT4KKworICA8cG9saWN5IGNvbnRleHQ9Im1hbmRhdG9yeSI+CisgICAgPGFsbG93IHVzZXI9IioiLz4KKyAgICA8ZGVueSBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLlN5c3RlbSIgc2VuZF9tZW1iZXI9IlJlYm9vdCIvPiAKKyAgICA8ZGVueSByZWNlaXZlX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLlN5c3RlbSIgcmVjZWl2ZV9tZW1iZXI9IlJlYm9vdCIvPgorICAgIDxkZW55IHNlbmRfcGF0aD0iL2Zvby9iYXIvU3lzdGVtT2JqZWN0VGhpbmciIHNlbmRfbWVtYmVyPSJSZWJvb3QiLz4gCisgICAgPGRlbnkgb3duPSJvcmcuZnJlZWRlc2t0b3AuU3lzdGVtIi8+CisgICAgPGRlbnkgb3duX3ByZWZpeD0ib3JnLmZyZWVkZXNrdG9wLk1hbnlTeXN0ZW1zIi8+CisgICAgPGRlbnkgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLlN5c3RlbSIvPgorICAgIDxkZW55IHJlY2VpdmVfc2VuZGVyPSJvcmcuZnJlZWRlc2t0b3AuU3lzdGVtIi8+CisgICAgPGRlbnkgdXNlcj0icm9vdCIvPgorICAgIDxkZW55IGdyb3VwPSJiaW4iLz4KKyAgICA8YWxsb3cgc2VuZF90eXBlPSJlcnJvciIvPgorICAgIDxhbGxvdyBzZW5kX3R5cGU9Im1ldGhvZF9jYWxsIi8+CisgICAgPGFsbG93IHNlbmRfdHlwZT0ibWV0aG9kX3JldHVybiIvPgorICAgIDxhbGxvdyBzZW5kX3R5cGU9InNpZ25hbCIvPgorICAgIDxkZW55IHNlbmRfZGVzdGluYXRpb249Im9yZy5mcmVlZGVza3RvcC5CYXIiIHNlbmRfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuRm9vIi8+CisgICAgPGRlbnkgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLkJhciIgc2VuZF9pbnRlcmZhY2U9Im9yZy5mcmVlZGVza3RvcC5Gb28iIHNlbmRfdHlwZT0ibWV0aG9kX2NhbGwiLz4KKyAgPC9wb2xpY3k+CisKKyAgPGxpbWl0IG5hbWU9Im1heF9pbmNvbWluZ19ieXRlcyI+NTAwMDwvbGltaXQ+ICAgCisgIDxsaW1pdCBuYW1lPSJtYXhfb3V0Z29pbmdfYnl0ZXMiPjUwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X21lc3NhZ2Vfc2l6ZSI+MzAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9InNlcnZpY2Vfc3RhcnRfdGltZW91dCI+NTAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJhdXRoX3RpbWVvdXQiPjYwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyI+NTA8L2xpbWl0PiAgCisgIDxsaW1pdCBuYW1lPSJtYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyI+ODA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyIj42NDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfcGVuZGluZ19zZXJ2aWNlX3N0YXJ0cyI+NjQ8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X25hbWVzX3Blcl9jb25uZWN0aW9uIj4yNTY8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X21hdGNoX3J1bGVzX3Blcl9jb25uZWN0aW9uIj41MTI8L2xpbWl0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL3N5c3RlbS5kL3Rlc3QuY29uZiBiL2RidXMvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9zeXN0ZW0uZC90ZXN0LmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2MGExZgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9zeXN0ZW0uZC90ZXN0LmNvbmYKQEAgLTAsMCArMSwyMCBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPCEtLSBUaGUgZm9sbG93aW5nIGRlbW9uc3RyYXRlcyBob3cgdG8gcHVuY2ggaG9sZXMgaW4gYSBkZWZhdWx0IGRlbnktYWxsIAorICAgICAgIHBvbGljeSBzbyB0aGF0IGEgcGFydGljdWxhciB1c2VyIGNhbiBvd24gYSBzZXJ2aWNlLCBhbmQgb3RoZXIgCisgICAgICAgY29ubmVjdGlvbnMgY2FuIGdldCBtZXNzYWdlcyBmcm9tIGl0IC0tPgorCisgIDwhLS0gT25seSByb290IGNhbiBvd24gdGhlIEZvb1NlcnZpY2Ugc2VydmljZSwgYW5kIAorICAgICAgIHRoaXMgdXNlciBjYW4gb25seSBzZW5kIHRoZSBvbmUga2luZCBvZiBtZXNzYWdlIC0tPgorICA8cG9saWN5IHVzZXI9InJvb3QiPgorICAgIDxhbGxvdyBvd249Im9yZy5mb28uRm9vU2VydmljZSIvPgorICAgIDxhbGxvdyBzZW5kX2ludGVyZmFjZT0ib3JnLmZvby5Gb29Ccm9hZGNhc3RJbnRlcmZhY2UiLz4KKyAgPC9wb2xpY3k+CisKKyAgPCEtLSBBbGxvdyBhbnkgY29ubmVjdGlvbiB0byByZWNlaXZlIHRoZSBtZXNzYWdlLCBidXQgCisgICAgICAgb25seSBpZiB0aGUgbWVzc2FnZSBpcyBzZW50IGJ5IHRoZSBvd25lciBvZiBGb29TZXJ2aWNlIC0tPgorICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDxhbGxvdyByZWNlaXZlX2ludGVyZmFjZT0ib3JnLmZvby5Gb29Ccm9hZGNhc3RJbnRlcmZhY2UiIHJlY2VpdmVfc2VuZGVyPSJvcmcuZm9vLkZvb1NlcnZpY2UiLz4KKyAgPC9wb2xpY3k+Cis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL3ZhbGlkLWludHJvc3BlY3Rpb24tZmlsZXMvbG90cy1vZi10eXBlcy54bWwgYi9kYnVzL3Rlc3QvZGF0YS92YWxpZC1pbnRyb3NwZWN0aW9uLWZpbGVzL2xvdHMtb2YtdHlwZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMGU2MDUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS92YWxpZC1pbnRyb3NwZWN0aW9uLWZpbGVzL2xvdHMtb2YtdHlwZXMueG1sCkBAIC0wLDAgKzEsOTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iPz4KKzwhRE9DVFlQRSBub2RlIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBJbnRyb3NwZWN0aW9uIDAuMS8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvaW50cm9zcGVjdGlvbi5kdGQiPgorPG5vZGU+CisKKyAgPGludGVyZmFjZSBuYW1lPSJvcmcuZnJlZWRlc2t0b3AuTG90c09mVHlwZXNJbnRlcmZhY2UiPgorCisgICAgPG1ldGhvZCBuYW1lPSJTZXRJbnQzMlZhbHVlIj4KKyAgICAgIDxhcmcgbmFtZT0idGhlSW50MzIiIHR5cGU9ImludDMyIi8+CisgICAgPC9tZXRob2Q+CisgICAgPG1ldGhvZCBuYW1lPSJHZXRJbnQzMlZhbHVlIj4KKyAgICAgIDxhcmcgbmFtZT0idGhlSW50MzIiIHR5cGU9ImludDMyIiBkaXJlY3Rpb249Im91dCIvPgorICAgIDwvbWV0aG9kPgorICAgIDxzaWduYWwgbmFtZT0iSW50MzJWYWx1ZUNoYW5nZWQiPgorICAgICAgPGFyZyBuYW1lPSJuZXdJbnQzMlZhbHVlIiB0eXBlPSJpbnQzMiIvPgorICAgIDwvc2lnbmFsPgorCisgICAgPG1ldGhvZCBuYW1lPSJTZXRVaW50MzJWYWx1ZSI+CisgICAgICA8YXJnIG5hbWU9InRoZVVpbnQzMiIgdHlwZT0idWludDMyIi8+CisgICAgPC9tZXRob2Q+CisgICAgPG1ldGhvZCBuYW1lPSJHZXRVaW50MzJWYWx1ZSI+CisgICAgICA8YXJnIG5hbWU9InRoZVVpbnQzMiIgdHlwZT0idWludDMyIiBkaXJlY3Rpb249Im91dCIvPgorICAgIDwvbWV0aG9kPgorICAgIDxzaWduYWwgbmFtZT0iVWludDMyVmFsdWVDaGFuZ2VkIj4KKyAgICAgIDxhcmcgbmFtZT0ibmV3VWludDMyVmFsdWUiIHR5cGU9InVpbnQzMiIvPgorICAgIDwvc2lnbmFsPgorCisgICAgPG1ldGhvZCBuYW1lPSJTZXRJbnQ2NFZhbHVlIj4KKyAgICAgIDxhcmcgbmFtZT0idGhlSW50NjQiIHR5cGU9ImludDY0Ii8+CisgICAgPC9tZXRob2Q+CisgICAgPG1ldGhvZCBuYW1lPSJHZXRJbnQ2NFZhbHVlIj4KKyAgICAgIDxhcmcgbmFtZT0idGhlSW50NjQiIHR5cGU9ImludDY0IiBkaXJlY3Rpb249Im91dCIvPgorICAgIDwvbWV0aG9kPgorICAgIDxzaWduYWwgbmFtZT0iSW50NjRWYWx1ZUNoYW5nZWQiPgorICAgICAgPGFyZyBuYW1lPSJuZXdJbnQ2NFZhbHVlIiB0eXBlPSJpbnQ2NCIvPgorICAgIDwvc2lnbmFsPgorCisgICAgPG1ldGhvZCBuYW1lPSJTZXRVaW50NjRWYWx1ZSI+CisgICAgICA8YXJnIG5hbWU9InRoZVVpbnQ2NCIgdHlwZT0idWludDY0Ii8+CisgICAgPC9tZXRob2Q+CisgICAgPG1ldGhvZCBuYW1lPSJHZXRVaW50NjRWYWx1ZSI+CisgICAgICA8YXJnIG5hbWU9InRoZVVpbnQ2NCIgdHlwZT0idWludDY0IiBkaXJlY3Rpb249Im91dCIvPgorICAgIDwvbWV0aG9kPgorICAgIDxzaWduYWwgbmFtZT0iVWludDY0VmFsdWVDaGFuZ2VkIj4KKyAgICAgIDxhcmcgbmFtZT0ibmV3VWludDY0VmFsdWUiIHR5cGU9InVpbnQ2NCIvPgorICAgIDwvc2lnbmFsPgorCisgICAgPG1ldGhvZCBuYW1lPSJTZXRCb29sZWFuVmFsdWUiPgorICAgICAgPGFyZyBuYW1lPSJ0aGVCb29sZWFuIiB0eXBlPSJib29sZWFuIi8+CisgICAgPC9tZXRob2Q+CisgICAgPG1ldGhvZCBuYW1lPSJHZXRCb29sZWFuVmFsdWUiPgorICAgICAgPGFyZyBuYW1lPSJ0aGVCb29sZWFuIiB0eXBlPSJib29sZWFuIiBkaXJlY3Rpb249Im91dCIvPgorICAgIDwvbWV0aG9kPgorICAgIDxzaWduYWwgbmFtZT0iQm9vbGVhblZhbHVlQ2hhbmdlZCI+CisgICAgICA8YXJnIG5hbWU9Im5ld0Jvb2xlYW5WYWx1ZSIgdHlwZT0iYm9vbGVhbiIvPgorICAgIDwvc2lnbmFsPgorCisgICAgPG1ldGhvZCBuYW1lPSJTZXRTdHJpbmdWYWx1ZSI+CisgICAgICA8YXJnIG5hbWU9InRoZVN0cmluZyIgdHlwZT0ic3RyaW5nIi8+CisgICAgPC9tZXRob2Q+CisgICAgPG1ldGhvZCBuYW1lPSJHZXRTdHJpbmdWYWx1ZSI+CisgICAgICA8YXJnIG5hbWU9InRoZVN0cmluZyIgdHlwZT0ic3RyaW5nIiBkaXJlY3Rpb249Im91dCIvPgorICAgIDwvbWV0aG9kPgorICAgIDxzaWduYWwgbmFtZT0iU3RyaW5nVmFsdWVDaGFuZ2VkIj4KKyAgICAgIDxhcmcgbmFtZT0ibmV3U3RyaW5nVmFsdWUiIHR5cGU9InN0cmluZyIvPgorICAgIDwvc2lnbmFsPgorCisgICAgPG1ldGhvZCBuYW1lPSJTZXREb3VibGVWYWx1ZSI+CisgICAgICA8YXJnIG5hbWU9InRoZURvdWJsZSIgdHlwZT0iZG91YmxlIi8+CisgICAgPC9tZXRob2Q+CisgICAgPG1ldGhvZCBuYW1lPSJHZXREb3VibGVWYWx1ZSI+CisgICAgICA8YXJnIG5hbWU9InRoZURvdWJsZSIgdHlwZT0iZG91YmxlIiBkaXJlY3Rpb249Im91dCIvPgorICAgIDwvbWV0aG9kPgorICAgIDxzaWduYWwgbmFtZT0iRG91YmxlVmFsdWVDaGFuZ2VkIj4KKyAgICAgIDxhcmcgbmFtZT0ibmV3RG91YmxlVmFsdWUiIHR5cGU9ImRvdWJsZSIvPgorICAgIDwvc2lnbmFsPgorCisgIDwvaW50ZXJmYWNlPgorCisgIDxpbnRlcmZhY2UgbmFtZT0ib3JnLmZyZWVkZXNrdG9wLkFTZWNvbmRJbnRlcmZhY2UiPgorICAgIDxtZXRob2QgbmFtZT0iUmFuZG9tRnJvYmF0ZSI+CisgICAgICA8YXJnIHR5cGU9ImJvb2xlYW4iIGRpcmVjdGlvbj0iaW4iLz4KKyAgICAgIDxhcmcgdHlwZT0ic3RyaW5nIiBkaXJlY3Rpb249Im91dCIvPgorICAgICAgPGFyZyB0eXBlPSJzdHJpbmciIGRpcmVjdGlvbj0ib3V0Ii8+CisgICAgICA8YXJnIHR5cGU9ImludDY0Ii8+IDwhLS0gZGlyZWN0aW9uIGRlZmF1bHRzIHRvICJpbiIgLS0+CisgICAgICA8YXJnIHR5cGU9InN0cmluZyIgZGlyZWN0aW9uPSJvdXQiLz4KKyAgICAgIDxhcmcgdHlwZT0ic3RyaW5nIiBkaXJlY3Rpb249Im91dCIvPgorICAgICAgPGFyZyB0eXBlPSJpbnQzMiIgZGlyZWN0aW9uPSJpbiIvPgorICAgIDwvbWV0aG9kPgorICA8L2ludGVyZmFjZT4KKworPC9ub2RlPgorCmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9hcnJheS1vZi1hcnJheS1vZi11aW50MzIubWVzc2FnZSBiL2RidXMvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2FycmF5LW9mLWFycmF5LW9mLXVpbnQzMi5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMjE4NmIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9hcnJheS1vZi1hcnJheS1vZi11aW50MzIubWVzc2FnZQpAQCAtMCwwICsxLDMzIEBACisjIE1lc3NhZ2Ugd2l0aCBhbiBhcnJheSBvZiBhcnJheSBvZiB1aW50MzIKKworVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCitSRVFVSVJFRF9GSUVMRFMKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCitTVEFSVF9MRU5HVEggQm9keQorCitUWVBFIEFSUkFZCitUWVBFIEFSUkFZCitUWVBFIFVJTlQzMgorCitMRU5HVEggQXJyYXkKK1NUQVJUX0xFTkdUSCBBcnJheQorCisjIyBhcnJheSBvZiB1aW50MzIKK0xFTkdUSCBTdWJBcnJheTEKK1NUQVJUX0xFTkdUSCBTdWJBcnJheTEKK1VJTlQzMiAxCitVSU5UMzIgMgorVUlOVDMyIDMKK0VORF9MRU5HVEggU3ViQXJyYXkxCisKKyMjIGFycmF5IG9mIHVpbnQzMgorTEVOR1RIIFN1YkFycmF5MgorU1RBUlRfTEVOR1RIIFN1YkFycmF5MgorVUlOVDMyIDQKK1VJTlQzMiA1CitFTkRfTEVOR1RIIFN1YkFycmF5MgorCitFTkRfTEVOR1RIIEFycmF5CisKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvZGljdC1zaW1wbGUubWVzc2FnZSBiL2RidXMvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2RpY3Qtc2ltcGxlLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE2OTI3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2RpY3Qtc2ltcGxlLm1lc3NhZ2UKQEAgLTAsMCArMSwxNSBAQAorIyBBIHNpbXBsZSBkaWN0CisKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorUkVRVUlSRURfRklFTERTCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK1RZUEUgRElDVAorTEVOR1RIIERpY3QKK1NUQVJUX0xFTkdUSCBEaWN0CitTVFJJTkcgJ2ludDMyJworVFlQRSBJTlQzMgorSU5UMzIgMHgxMjM0NTY3OAorRU5EX0xFTkdUSCBEaWN0CitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2RpY3QubWVzc2FnZSBiL2RidXMvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2RpY3QubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjk5N2IxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvZGljdC5tZXNzYWdlCkBAIC0wLDAgKzEsNDcgQEAKKyMgRGljdCB3aXRoIGRpZmZlcmVudCB2YWx1ZXMKKworVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCitSRVFVSVJFRF9GSUVMRFMKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCitTVEFSVF9MRU5HVEggQm9keQorVFlQRSBESUNUCitMRU5HVEggRGljdAorU1RBUlRfTEVOR1RIIERpY3QKK1NUUklORyAnYm9vbGVhbicKK1RZUEUgQk9PTEVBTgorQllURSAxCitTVFJJTkcgJ2ludDMyJworVFlQRSBJTlQzMgorSU5UMzIgMHgxMjM0NTY3OAorU1RSSU5HICd1aW50MzInCitUWVBFIFVJTlQzMgorVUlOVDMyIDB4ODc2NTQzMgorU1RSSU5HICdkb3VibGUnCitUWVBFIERPVUJMRQorRE9VQkxFIDMuMTQxNTkyNjUzNTg5CitTVFJJTkcgJ3N0cmluZycKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ1RoaXMgaXMgYSBzdHJpbmcnCitTVFJJTkcgJ2Jvb2xlYW5fYXJyYXknCitUWVBFIEFSUkFZCitUWVBFIEJPT0xFQU4KK0JPT0xFQU5fQVJSQVkgeyB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlIH0KK1NUUklORyAnaW50MzJfYXJyYXknCitUWVBFIEFSUkFZCitUWVBFIElOVDMyCitJTlQzMl9BUlJBWSB7IDEsIC0yLCAzLCAtNCwgNSwgLTYsIDcsIC04LCA5LCAtMTAgfQorU1RSSU5HICd1aW50MzJfYXJyYXknCitUWVBFIEFSUkFZCitUWVBFIFVJTlQzMgorVUlOVDMyX0FSUkFZIHsgMTEsIDEyLCAzMTQsIDE5MTEsIDU3NjkyLCAxMjM3LCAyODM0IH0KK1NUUklORyAnZG91YmxlX2FycmF5JworVFlQRSBBUlJBWQorVFlQRSBET1VCTEUKK0RPVUJMRV9BUlJBWSB7IDAuMSwgMC4yLCAzLjE0MTU5MjYsIDIuNzE4MywgMTAuMCwgOS45OSB9CitTVFJJTkcgJ3N0cmluZ19hcnJheScKK1RZUEUgQVJSQVkKK1RZUEUgU1RSSU5HCitTVFJJTkdfQVJSQVkgeyAnSGVsbG8nLCAnVGhpcycsICdJcycsICdBJywgJ1N0cmluZycsICdBcnJheSEnIH0KK0VORF9MRU5HVEggRGljdAorRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9lbXB0aW5lc3MubWVzc2FnZSBiL2RidXMvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2VtcHRpbmVzcy5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMDQyYzAKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9lbXB0aW5lc3MubWVzc2FnZQpAQCAtMCwwICsxLDYzIEBACisjIEVtcHR5IGFycmF5cyBhbmQgc3RyaW5ncworCitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKK1JFUVVJUkVEX0ZJRUxEUworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKK1NUQVJUX0xFTkdUSCBCb2R5CitUWVBFIFNUUklORworSU5UMzIgMAorQllURSAwICMgU3RyaW5ncyBuZWVkIHRvIGJlIE5VTEwtdGVybWluYXRlZAorVFlQRSBBUlJBWQorVFlQRSBCT09MRUFOCitJTlQzMiAwCitUWVBFIEFSUkFZCitUWVBFIElOVDMyCitJTlQzMiAwCitUWVBFIEFSUkFZCitUWVBFIFVJTlQzMgorSU5UMzIgMAorVFlQRSBBUlJBWQorVFlQRSBET1VCTEUKK0lOVDMyIDAKK1RZUEUgQVJSQVkKK1RZUEUgQllURQorSU5UMzIgMAorVFlQRSBBUlJBWQorVFlQRSBTVFJJTkcKK0lOVDMyIDAKK1RZUEUgRElDVAorSU5UMzIgMAorCisjIEEgZGljdCB3aXRoIGVtcHR5IGFycmF5cworVFlQRSBESUNUCitMRU5HVEggRGljdAorU1RBUlRfTEVOR1RIIERpY3QKK1NUUklORyAnYm9vbGVhbl9hcnJheScKK1RZUEUgQVJSQVkKK1RZUEUgQk9PTEVBTgorSU5UMzIgMAorU1RSSU5HICdpbnQzMl9hcnJheScKK1RZUEUgQVJSQVkKK1RZUEUgSU5UMzIKK0lOVDMyIDAKK1NUUklORyAndWludDMyX2FycmF5JworVFlQRSBBUlJBWQorVFlQRSBVSU5UMzIKK0lOVDMyIDAKK1NUUklORyAnZG91YmxlX2FycmF5JworVFlQRSBBUlJBWQorVFlQRSBET1VCTEUKK0lOVDMyIDAKK1NUUklORyAnYnl0ZV9hcnJheScKK1RZUEUgQVJSQVkgCitUWVBFIEJZVEUKK0lOVDMyIDAKK1NUUklORyAnc3RyaW5nX2FycmF5JyB9CitUWVBFIEFSUkFZCitUWVBFIFNUUklORworSU5UMzIgMAorRU5EX0xFTkdUSCBEaWN0CisKK0VORF9MRU5HVEggQm9keQorCmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9sb3RzLW9mLWFyZ3VtZW50cy5tZXNzYWdlIGIvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvbG90cy1vZi1hcmd1bWVudHMubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGFhZTBmCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvbG90cy1vZi1hcmd1bWVudHMubWVzc2FnZQpAQCAtMCwwICsxLDY1IEBACisjIE1lc3NhZ2Ugd2l0aCBsb3RzIG9mIGRpZmZlcmVudCBhcmd1bWVudCB0eXBlcworCitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKK1JFUVVJUkVEX0ZJRUxEUworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKK1NUQVJUX0xFTkdUSCBCb2R5CitUWVBFIE5JTAorVFlQRSBCWVRFCitCWVRFIDQyCitUWVBFIElOVDMyCitJTlQzMiAweDEyMzQ1Njc4CitUWVBFIFVJTlQzMgorVUlOVDMyIDB4ODc2NTQzMgorVFlQRSBET1VCTEUKK0RPVUJMRSAzLjE0MTU5MjY1MzU4OQorVFlQRSBTVFJJTkcKK1NUUklORyAnVGhpcyBpcyBhIHN0cmluZycKK1RZUEUgQVJSQVkKK1RZUEUgQk9PTEVBTgorQk9PTEVBTl9BUlJBWSB7IHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UgfQorVFlQRSBBUlJBWQorVFlQRSBJTlQzMgorSU5UMzJfQVJSQVkgeyAxLCAtMiwgMywgLTQsIDUsIC02LCA3LCAtOCwgOSwgLTEwIH0KK1RZUEUgQVJSQVkKK1RZUEUgVUlOVDMyCitVSU5UMzJfQVJSQVkgeyAxMSwgMTIsIDMxNCwgMTkxMSwgNTc2OTIsIDEyMzcsIDI4MzQgfQorVFlQRSBBUlJBWQorVFlQRSBET1VCTEUKK0RPVUJMRV9BUlJBWSB7IDAuMSwgMC4yLCAzLjE0MTU5MjYsIDIuNzE4MywgMTAuMCwgOS45OSB9CitUWVBFIEFSUkFZCitUWVBFIFNUUklORworU1RSSU5HX0FSUkFZIHsgJ0hlbGxvJywgJ1RoaXMnLCAnSXMnLCAnQScsICdTdHJpbmcnLCAnQXJyYXkhJyB9CitUWVBFIENVU1RPTQorU1RSSU5HICduYW1lZCB0eXBlJworQllURV9BUlJBWSB7ICdiJywgJ2knLCAnbicsICdhJywgJ3InLCAneScsICdkJywgJ2EnLCAndCcsICdhJyB9CisKK1RZUEUgQVJSQVkKK1RZUEUgRElDVAorTEVOR1RIIEFycmF5CitTVEFSVF9MRU5HVEggQXJyYXkKKworTEVOR1RIIERpY3QxCitTVEFSVF9MRU5HVEggRGljdDEKK1NUUklORyAna2V5MScKK1RZUEUgSU5UMzIKK0lOVDMyIDB4MTIzNDU2NzgKK1NUUklORyAna2V5MicKK1RZUEUgVUlOVDMyCitVSU5UMzIgMHg4NzY1NDMyCitFTkRfTEVOR1RIIERpY3QxCisKK0xFTkdUSCBEaWN0MgorU1RBUlRfTEVOR1RIIERpY3QyCitTVFJJTkcgJ2tleTEnCitUWVBFIElOVDMyCitJTlQzMiAweDEyMzQ1Njc4CitTVFJJTkcgJ2tleTInCitUWVBFIFVJTlQzMgorVUlOVDMyIDB4ODc2NTQzMgorRU5EX0xFTkdUSCBEaWN0MgorCitFTkRfTEVOR1RIIEFycmF5CisKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvbm8tcGFkZGluZy5tZXNzYWdlIGIvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvbm8tcGFkZGluZy5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZGY0ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9uby1wYWRkaW5nLm1lc3NhZ2UKQEAgLTAsMCArMSwyMiBAQAorIyMgTWVzc2FnZSB3aXRoIG5vIGhlYWRlciBwYWRkaW5nCisKKyMjIFZBTElEX0hFQURFUiBpbmNsdWRlcyBhIExFTkdUSCBIZWFkZXIgYW5kIExFTkdUSCBCb2R5CitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKKworUkVRVUlSRURfRklFTERTCisKKyMjIHRoaXMgYnl0ZSBhcnJheSBpcyBmaWxsZWQgd2l0aCB6ZXJvcyB0byB0aGUgbmF0dXJhbCBsZW5ndGggCisjIyBvZiB0aGUgaGVhZGVyCitIRUFERVJfRklFTEQgVU5LTk9XTgorVFlQRSBBUlJBWQorVFlQRSBCWVRFCitBTElHTiA0CitMRU5HVEggVGhpc0J5dGVBcnJheQorU1RBUlRfTEVOR1RIIFRoaXNCeXRlQXJyYXkKK0JZVEUgMQorQUxJR04gOCAxCitFTkRfTEVOR1RIIFRoaXNCeXRlQXJyYXkKKworRU5EX0xFTkdUSCBIZWFkZXIKK1NUQVJUX0xFTkdUSCBCb2R5CitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL29wcG9zaXRlLWVuZGlhbi5tZXNzYWdlIGIvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvb3Bwb3NpdGUtZW5kaWFuLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA5NDlkZAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL29wcG9zaXRlLWVuZGlhbi5tZXNzYWdlCkBAIC0wLDAgKzEsMzAgQEAKKyMjIE1lc3NhZ2Ugb2Ygb3Bwb3NpdGUgZW5kaWFubmVzcywgd2l0aCBsb3RzIG9mIHJhbmRvbSBmaWVsZHMgaW4gaXQKKworT1BQT1NJVEVfRU5ESUFOCisKKyMjIFZBTElEX0hFQURFUiBpbmNsdWRlcyBhIExFTkdUSCBIZWFkZXIgYW5kIExFTkdUSCBCb2R5CitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKKworUkVRVUlSRURfRklFTERTCisKK0hFQURFUl9GSUVMRCBVTktOT1dOCitUWVBFIElOVDMyCitJTlQzMiAweGZlZWIKKworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKKworU1RBUlRfTEVOR1RIIEJvZHkKKworVFlQRSBJTlQzMgorSU5UMzIgODk3NjU0MzIKK1RZUEUgVUlOVDMyCitVSU5UMzIgMHhmZmZmZmZmCitUWVBFIFNUUklORworU1RSSU5HICdIZWxsbyB0aGlzIGlzIGEgc3RyaW5nJworVFlQRSBET1VCTEUKK0RPVUJMRSAzLjE0MTU5CisKK1RZUEUgTklMCisKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvcmVjdXJzaXZlLXR5cGVzLm1lc3NhZ2UgYi9kYnVzL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9yZWN1cnNpdmUtdHlwZXMubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzA2ZmQxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvcmVjdXJzaXZlLXR5cGVzLm1lc3NhZ2UKQEAgLTAsMCArMSw5OSBAQAorIyMgTWVzc2FnZSB3aXRoIHJlY3Vyc2l2ZSB0eXBlcworCisjIyBWQUxJRF9IRUFERVIgaW5jbHVkZXMgYSBMRU5HVEggSGVhZGVyIGFuZCBMRU5HVEggQm9keQorVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCisKK1JFUVVJUkVEX0ZJRUxEUworCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKKworIyBFdmVyeXRoaW5nIGlzIGluc2lkZSBhIGRpY3QKK1RZUEUgRElDVAorTEVOR1RIIERpY3QxCitTVEFSVF9MRU5HVEggRGljdDEKKworIyBmaXJzdCBkaWN0IGVudHJ5IGlzIGFuIGFycmF5IG9mIGFycmF5IG9mIHVpbnQzMgorU1RSSU5HICdtZWdhLXVpbnQtYXJyYXknCitUWVBFIEFSUkFZCitUWVBFIEFSUkFZCitUWVBFIEFSUkFZCitUWVBFIFVJTlQzMgorTEVOR1RIIEFycmF5MQorU1RBUlRfTEVOR1RIIEFycmF5MQorCitMRU5HVEggQXJyYXkxXzEKK1NUQVJUX0xFTkdUSCBBcnJheTFfMQorVUlOVDMyX0FSUkFZIHsgMSwgMiwgMywgNCwgNX0KK1VJTlQzMl9BUlJBWSB7IDIsIDMsIDQsIDUsIDF9CitVSU5UMzJfQVJSQVkgeyAzLCA0LCA1LCAxLCAyfQorRU5EX0xFTkdUSCBBcnJheTFfMQorCitMRU5HVEggQXJyYXkxXzIKK1NUQVJUX0xFTkdUSCBBcnJheTFfMgorVUlOVDMyX0FSUkFZIHsgNCwgNSwgNiwgNywgOH0KK1VJTlQzMl9BUlJBWSB7IDUsIDYsIDcsIDgsIDR9CitFTkRfTEVOR1RIIEFycmF5MV8yCisKK0VORF9MRU5HVEggQXJyYXkxCisKKyMgc2Vjb25kIGRpY3QgZW50cnkgaXMgYW4gYXJyYXkgb2Ygc3RyaW5ncworU1RSSU5HICdzdHJpbmctYXJyYXknCitUWVBFIEFSUkFZCitUWVBFIFNUUklORworU1RSSU5HX0FSUkFZIHsgJ2EnLCAnc3RyaW5nJywgJ2FycmF5J30KKworIyB0aGlyZCBkaWN0IGVudHJ5IGlzIGFub3RoZXIgZGljdAorU1RSSU5HICduZXN0ZWQtZGljdCcKK1RZUEUgRElDVAorTEVOR1RIIERpY3QyCitTVEFSVF9MRU5HVEggRGljdDIKKworU1RSSU5HICdzdHJpbmcnCitUWVBFIFNUUklORworU1RSSU5HICdhIGRlZXBseSBuZXN0ZWQgc3RyaW5nJyAgICAgCisKK1NUUklORyAnc3VwZXItbmVzdGVkLWRpY3QnCitUWVBFIERJQ1QKK0xFTkdUSCBEaWN0MworU1RBUlRfTEVOR1RIIERpY3QzCisKK1NUUklORyAnZG91YmxlLWFycmF5JworVFlQRSBBUlJBWQorVFlQRSBET1VCTEUKK0RPVUJMRV9BUlJBWSB7MS4wLCAyLjAsIDMuMH0KKworU1RSSU5HICdkaWN0LWFycmF5JworVFlQRSBBUlJBWQorVFlQRSBESUNUCitMRU5HVEggQXJyYXkyCitTVEFSVF9MRU5HVEggQXJyYXkyCisKK0xFTkdUSCBEaWN0NAorU1RBUlRfTEVOR1RIIERpY3Q0CitTVFJJTkcgJ2tleTQnCitUWVBFIEJZVEUKK0JZVEUgJzQnCitFTkRfTEVOR1RIIERpY3Q0CisKK0xFTkdUSCBEaWN0NQorU1RBUlRfTEVOR1RIIERpY3Q1CitTVFJJTkcgJ2tleTUnCitUWVBFIEJZVEUKK0JZVEUgJzUnCitFTkRfTEVOR1RIIERpY3Q1CisKK0VORF9MRU5HVEggQXJyYXkyCisKK1NUUklORyAnYm9vbGVhbicKK1RZUEUgQk9PTEVBTgorQk9PTEVBTiBmYWxzZQorCitFTkRfTEVOR1RIIERpY3QzCisKK0VORF9MRU5HVEggRGljdDIKKworRU5EX0xFTkdUSCBEaWN0MQorCitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3NpbXBsZXN0LW1hbnVhbC5tZXNzYWdlIGIvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc2ltcGxlc3QtbWFudWFsLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZhOTYwZAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3NpbXBsZXN0LW1hbnVhbC5tZXNzYWdlCkBAIC0wLDAgKzEsMzAgQEAKKyMjIGxpa2Ugc2ltcGxlc3QubWVzc2FnZSwgYnV0IGRvZXNuJ3QgdXNlIFZBTElEX0hFQURFUgorIyMgY29udmVuaWVuY2UgY29tbWFuZC4gbW9zdGx5IHRvIHRlc3QgdGhlIHRlc3QgZnJhbWV3b3JrLgorCitMSVRUTEVfRU5ESUFOCitCWVRFICdsJworQllURSAxCitCWVRFIDAKK0JZVEUgMAorTEVOR1RIIEhlYWRlcgorTEVOR1RIIEJvZHkKKyMjIGNsaWVudCBzZXJpYWwKK0lOVDMyIDcKKworSEVBREVSX0ZJRUxEIFBBVEgKK1RZUEUgT0JKRUNUX1BBVEgKK09CSkVDVF9QQVRIICcvZm9vJworSEVBREVSX0ZJRUxEIElOVEVSRkFDRQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkZvbycKK0hFQURFUl9GSUVMRCBNRU1CRVIKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ0JhcicKK0hFQURFUl9GSUVMRCBTSUdOQVRVUkUKK1RZUEUgU1RSSU5HCitTVFJJTkcgJycKKworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKK1NUQVJUX0xFTkdUSCBCb2R5CitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3NpbXBsZXN0Lm1lc3NhZ2UgYi9kYnVzL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zaW1wbGVzdC5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZGRhZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zaW1wbGVzdC5tZXNzYWdlCkBAIC0wLDAgKzEsMTAgQEAKKyMjIHNpbXBsZXN0IHBvc3NpYmxlIHZhbGlkIG1lc3NhZ2UKKworIyMgVkFMSURfSEVBREVSIGluY2x1ZGVzIGEgTEVOR1RIIEhlYWRlciBhbmQgTEVOR1RIIEJvZHkKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorUkVRVUlSRURfRklFTERTCisKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCitTVEFSVF9MRU5HVEggQm9keQorRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC1hY3F1aXJlLXNlcnZpY2UubWVzc2FnZSBiL2RidXMvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3N0YW5kYXJkLWFjcXVpcmUtc2VydmljZS5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OWYzYmIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC1hY3F1aXJlLXNlcnZpY2UubWVzc2FnZQpAQCAtMCwwICsxLDI2IEBACisjIFN0YW5kYXJkIG9yZy5mcmVlZGVza3RvcC5EQnVzLkFjcXVpcmVTZXJ2aWNlIG1lc3NhZ2UKKworVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCitIRUFERVJfRklFTEQgUEFUSAorVFlQRSBPQkpFQ1RfUEFUSAorT0JKRUNUX1BBVEggJy9vcmcvZnJlZWRlc2t0b3AvREJ1cycKK0hFQURFUl9GSUVMRCBJTlRFUkZBQ0UKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5EQnVzJworSEVBREVSX0ZJRUxEIE1FTUJFUgorVFlQRSBTVFJJTkcKK1NUUklORyAnQWNxdWlyZVNlcnZpY2UnCitIRUFERVJfRklFTEQgREVTVElOQVRJT04KK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5EQnVzJworSEVBREVSX0ZJRUxEIFNJR05BVFVSRQorVFlQRSBTVFJJTkcKK1NUUklORyAnc3UnCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5EQnVzLlNhbXBsZScKK1RZUEUgVUlOVDMyCitVSU5UMzIgMAorRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC1oZWxsby5tZXNzYWdlIGIvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc3RhbmRhcmQtaGVsbG8ubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDg4MzVlCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc3RhbmRhcmQtaGVsbG8ubWVzc2FnZQpAQCAtMCwwICsxLDIyIEBACisjIFN0YW5kYXJkIG9yZy5mcmVlZGVza3RvcC5EQnVzLkhlbGxvIG1lc3NhZ2UKKworVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCitIRUFERVJfRklFTEQgUEFUSAorVFlQRSBPQkpFQ1RfUEFUSAorT0JKRUNUX1BBVEggJy9vcmcvZnJlZWRlc2t0b3AvREJ1cycKK0hFQURFUl9GSUVMRCBJTlRFUkZBQ0UKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5EQnVzJworSEVBREVSX0ZJRUxEIE1FTUJFUgorVFlQRSBTVFJJTkcKK1NUUklORyAnSGVsbG8nCitIRUFERVJfRklFTEQgREVTVElOQVRJT04KK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5EQnVzJworSEVBREVSX0ZJRUxEIFNJR05BVFVSRQorVFlQRSBTVFJJTkcKK1NUUklORyAnJworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKK1NUQVJUX0xFTkdUSCBCb2R5CitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3N0YW5kYXJkLWxpc3Qtc2VydmljZXMubWVzc2FnZSBiL2RidXMvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3N0YW5kYXJkLWxpc3Qtc2VydmljZXMubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTEwYWViCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc3RhbmRhcmQtbGlzdC1zZXJ2aWNlcy5tZXNzYWdlCkBAIC0wLDAgKzEsMjIgQEAKKyMgU3RhbmRhcmQgb3JnLmZyZWVkZXNrdG9wLkRCdXMuTGlzdFNlcnZpY2VzIG1lc3NhZ2UKKworVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCitIRUFERVJfRklFTEQgUEFUSAorVFlQRSBPQkpFQ1RfUEFUSAorT0JKRUNUX1BBVEggJy9vcmcvZnJlZWRlc2t0b3AvREJ1cycKK0hFQURFUl9GSUVMRCBJTlRFUkZBQ0UKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5EQnVzJworSEVBREVSX0ZJRUxEIE1FTUJFUgorVFlQRSBTVFJJTkcKK1NUUklORyAnTGlzdFNlcnZpY2VzJworSEVBREVSX0ZJRUxEIERFU1RJTkFUSU9OCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuREJ1cycKK0hFQURFUl9GSUVMRCBTSUdOQVRVUkUKK1RZUEUgU1RSSU5HCitTVFJJTkcgJycKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCitTVEFSVF9MRU5HVEggQm9keQorRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC1zZXJ2aWNlLWV4aXN0cy5tZXNzYWdlIGIvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc3RhbmRhcmQtc2VydmljZS1leGlzdHMubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjU3ZWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc3RhbmRhcmQtc2VydmljZS1leGlzdHMubWVzc2FnZQpAQCAtMCwwICsxLDI0IEBACisjIFN0YW5kYXJkIG9yZy5mcmVlZGVza3RvcC5EQnVzLlNlcnZpY2VFeGlzdHMgbWVzc2FnZQorCitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKK0hFQURFUl9GSUVMRCBQQVRICitUWVBFIE9CSkVDVF9QQVRICitPQkpFQ1RfUEFUSCAnL29yZy9mcmVlZGVza3RvcC9EQnVzJworSEVBREVSX0ZJRUxEIElOVEVSRkFDRQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkRCdXMnCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdTZXJ2aWNlRXhpc3RzJworSEVBREVSX0ZJRUxEIERFU1RJTkFUSU9OCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuREJ1cycKK0hFQURFUl9GSUVMRCBTSUdOQVRVUkUKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ3MnCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5EQnVzLlNhbXBsZScKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvdW5rbm93bi1oZWFkZXItZmllbGQubWVzc2FnZSBiL2RidXMvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3Vua25vd24taGVhZGVyLWZpZWxkLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM3ZDYyNAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3Vua25vd24taGVhZGVyLWZpZWxkLm1lc3NhZ2UKQEAgLTAsMCArMSwxOSBAQAorIyMgbWVzc2FnZSB3aXRoIGEgJ25hbWUnIGhlYWRlciBmaWVsZCBhbmQgdW5rbm93biAndW5rbicgZmllbGQKKworIyMgVkFMSURfSEVBREVSIGluY2x1ZGVzIGEgTEVOR1RIIEhlYWRlciBhbmQgTEVOR1RIIEJvZHkKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorUkVRVUlSRURfRklFTERTCisKK0hFQURFUl9GSUVMRCBVTktOT1dOCitUWVBFIERJQ1QKK0xFTkdUSCBEaWN0CitTVEFSVF9MRU5HVEggRGljdAorU1RSSU5HICdpbnQzMicKK1RZUEUgSU5UMzIKK0lOVDMyIDB4MTIzNDU2NzgKK0VORF9MRU5HVEggRGljdAorCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2Uuc2VydmljZS5pbiBiL2RidXMvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlLnNlcnZpY2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA3NmYzYgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlLnNlcnZpY2UuaW4KQEAgLTAsMCArMSw1IEBACitbRC1CVVMgU2VydmljZV0KK05hbWU9b3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2UKK0V4ZWM9QERCVVNfVEVTVF9FWEVDQC90ZXN0LXNlcnZpY2VARVhFRVhUQAorVXNlcj1hbnlyYW5kb211c2VyCisKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNlZ2ZhdWx0U2VydmljZS5zZXJ2aWNlLmluIGIvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2VnZmF1bHRTZXJ2aWNlLnNlcnZpY2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA1ZDcxNAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNlZ2ZhdWx0U2VydmljZS5zZXJ2aWNlLmluCkBAIC0wLDAgKzEsNSBAQAorW0QtQlVTIFNlcnZpY2VdCitOYW1lPW9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNlZ2ZhdWx0U2VydmljZQorRXhlYz1AREJVU19URVNUX0VYRUNAL3Rlc3Qtc2VnZmF1bHRARVhFRVhUQAorVXNlcj1hbnlyYW5kb211c2VyCisKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VGYWlsLnNlcnZpY2UuaW4gYi9kYnVzL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlRmFpbC5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MDgzNWUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlRmFpbC5zZXJ2aWNlLmluCkBAIC0wLDAgKzEsNSBAQAorW0QtQlVTIFNlcnZpY2VdCitOYW1lPW9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VGYWlsCitFeGVjPUBEQlVTX1RFU1RfRVhFQ0AvdGVzdC1zaGVsbC1zZXJ2aWNlQEVYRUVYVEAgInRoaXMgc2hvdWxkICdmYWlsJyBiZWNhdXNlIG9mIGFuIHVudGVybWluYXRlZCBxdW90ZQorVXNlcj1hbnlyYW5kb211c2VyCisKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VTdWNjZXNzLnNlcnZpY2UuaW4gYi9kYnVzL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlU3VjY2Vzcy5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NDcyNjEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlU3VjY2Vzcy5zZXJ2aWNlLmluCkBAIC0wLDAgKzEsNSBAQAorW0QtQlVTIFNlcnZpY2VdCitOYW1lPW9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VTdWNjZXNzCitFeGVjPUBEQlVTX1RFU1RfRVhFQ0AvdGVzdC1zaGVsbC1zZXJ2aWNlQEVYRUVYVEAgLXRlc3QgInRoYXQiICd3ZSBnZXQnIGJhY2sgLS13aGF0ICJ3ZSBwdXQgaW4iCitVc2VyPWFueXJhbmRvbXVzZXIKKwpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGUuUHJpdlNlcnZlci5zZXJ2aWNlLmluIGIvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGUuUHJpdlNlcnZlci5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZGZlYWQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZS5Qcml2U2VydmVyLnNlcnZpY2UuaW4KQEAgLTAsMCArMSw0IEBACitbRC1CVVMgU2VydmljZV0KK05hbWU9b3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlLlByaXZTZXJ2ZXIKK0V4ZWM9QERCVVNfVEVTVF9FWEVDQC9uYW1lLXRlc3QvdGVzdC1wcml2c2VydmVyQEVYRUVYVEAKKwpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZS5zZXJ2aWNlLmluIGIvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZS5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMmE3N2QKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlLnNlcnZpY2UuaW4KQEAgLTAsMCArMSwzIEBACitbRC1CVVMgU2VydmljZV0KK05hbWU9b3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2UKK0V4ZWM9QERCVVNfVEVTVF9FWEVDQC90ZXN0LXNlcnZpY2VARVhFRVhUQApkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVGb3JraW5nRWNob1NlcnZpY2Uuc2VydmljZS5pbiBiL2RidXMvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRm9ya2luZ0VjaG9TZXJ2aWNlLnNlcnZpY2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMzODYyYwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRm9ya2luZ0VjaG9TZXJ2aWNlLnNlcnZpY2UuaW4KQEAgLTAsMCArMSwzIEBACitbRC1CVVMgU2VydmljZV0KK05hbWU9b3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRm9ya2luZ0VjaG9TZXJ2aWNlCitFeGVjPUBEQlVTX1RFU1RfRVhFQ0AvdGVzdC1zZXJ2aWNlQEVYRUVYVEAgb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRm9ya2luZ0VjaG9TZXJ2aWNlIGZvcmsKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2VnZmF1bHRTZXJ2aWNlLnNlcnZpY2UuaW4gYi9kYnVzL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNlZ2ZhdWx0U2VydmljZS5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MjU0MjcKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNlZ2ZhdWx0U2VydmljZS5zZXJ2aWNlLmluCkBAIC0wLDAgKzEsNCBAQAorW0QtQlVTIFNlcnZpY2VdCitOYW1lPW9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNlZ2ZhdWx0U2VydmljZQorRXhlYz1AREJVU19URVNUX0VYRUNAL3Rlc3Qtc2VnZmF1bHRARVhFRVhUQAorCmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VGYWlsLnNlcnZpY2UuaW4gYi9kYnVzL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VGYWlsLnNlcnZpY2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY1OTY0YQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZUZhaWwuc2VydmljZS5pbgpAQCAtMCwwICsxLDMgQEAKK1tELUJVUyBTZXJ2aWNlXQorTmFtZT1vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlRmFpbAorRXhlYz1AREJVU19URVNUX0VYRUNAL3Rlc3Qtc2hlbGwtc2VydmljZUBFWEVFWFRAICJ0aGlzIHNob3VsZCAnZmFpbCcgYmVjYXVzZSBvZiBhbiB1bnRlcm1pbmF0ZWQgcXVvdGUKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZVN1Y2Nlc3Muc2VydmljZS5pbiBiL2RidXMvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZVN1Y2Nlc3Muc2VydmljZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTI4ODdlCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlU3VjY2Vzcy5zZXJ2aWNlLmluCkBAIC0wLDAgKzEsNCBAQAorW0QtQlVTIFNlcnZpY2VdCitOYW1lPW9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VTdWNjZXNzCitFeGVjPUBEQlVTX1RFU1RfRVhFQ0AvdGVzdC1zaGVsbC1zZXJ2aWNlQEVYRUVYVEAgLXRlc3QgInRoYXQiICd3ZSBnZXQnIGJhY2sgLS13aGF0ICJ3ZSBwdXQgaW4iCisKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9kYnVzLWRhZW1vbi1lYXZlc2Ryb3AuYyBiL2RidXMvdGVzdC9kYnVzLWRhZW1vbi1lYXZlc2Ryb3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmQ5MjNkCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RidXMtZGFlbW9uLWVhdmVzZHJvcC5jCkBAIC0wLDAgKzEsNTU1IEBACisvKiBJbnRlZ3JhdGlvbiB0ZXN0cyBmb3IgdGhlIGVhdmVzZHJvcD10cnVlfGZhbHNlIGtleXdvcmQgaW4gREJ1c01hdGNoUnVsZQorICoKKyAqIEF1dGhvcjogQ29zaW1vIEFsZmFyYW5vIDxjb3NpbW8uYWxmYXJhbm9AY29sbGFib3JhLmNvLnVrPgorICogQmFzZWQgb246IHRlc3RzL2RidXMtZGFlbW9uLmMgYnkgU2ltb24gTWNWaXR0aWUKKyAqIENvcHlyaWdodCDCqSAyMDEwLTIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyAqICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCisgKiBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorICogcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZ2xpYi1sb3dsZXZlbC5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBEQlVTX1dJTgorIyBpbmNsdWRlIDxpby5oPgorIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxzaWduYWwuaD4KKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2RlZmluZSBTRU5ERVJfTkFNRSAidGVzdC5lYXZlc2Ryb3Auc2VuZGVyIgorI2RlZmluZSBTRU5ERVJfUEFUSCAiL3Rlc3QvZWF2ZXNkcm9wL3NlbmRlciIKKyNkZWZpbmUgU0VOREVSX0lGQUNFIFNFTkRFUl9OQU1FCisjZGVmaW5lIFNFTkRFUl9TSUdOQUxfTkFNRSAiU2lnbmFsIgorI2RlZmluZSBTRU5ERVJfU1RPUFBFUl9OQU1FICJTdG9wcGVyIgorCisvKiBUaGlzIHJ1bGUgaXMgZXF1aXZhbGVudCB0byB0aGUgb25lIGFkZGVkIHRvIGEgcHJveHkgY29ubmVjdGluZyB0bworICogU0VOREVSX05BTUUrU0VOREVSX0lGQUNFLCBwbHVzIHJlc3RyaWN0aW5nIG9uIHNpZ25hbCBuYW1lLgorICogQmVpbmcgbW9yZSByZXN0cmljdGl2ZSwgaWYgdGhlIGNvbm5lY3Rpb24gcmVjZWl2ZXMgd2hhdCB3ZSBuZWVkLCBmb3Igc3VyZQorICogdGhlIG9yaWdpbmFsIHByb3h5IHJ1bGUgd2lsbCBtYXRjaCBpdCAqLworI2RlZmluZSBSRUNFSVZFUl9SVUxFICJzZW5kZXI9JyIgU0VOREVSX05BTUUgIicsIiBcCisgICJpbnRlcmZhY2U9JyIgU0VOREVSX0lGQUNFICInLCIgXAorICAidHlwZT0nc2lnbmFsJywiIFwKKyAgIm1lbWJlcj0nIiBTRU5ERVJfU0lHTkFMX05BTUUgIiciCisjZGVmaW5lIFBPTElURUxJU1RFTkVSX1JVTEUgUkVDRUlWRVJfUlVMRQorI2RlZmluZSBFQVZFU0RST1BQRVJfUlVMRSBSRUNFSVZFUl9SVUxFICIsZWF2ZXNkcm9wPXRydWUiCisKKyNkZWZpbmUgU1RPUFBFUl9SVUxFICJzZW5kZXI9JyIgU0VOREVSX05BTUUgXAorICAiJyxpbnRlcmZhY2U9JyIgU0VOREVSX0lGQUNFICInLHR5cGU9J3NpZ25hbCcsbWVtYmVyPSciIFNFTkRFUl9TVE9QUEVSX05BTUUgIiciCisKKy8qIGEgY29ubmVjdGlvbiByZWNlaXZlZCBhIHNpZ25hbCB0byB3aG9tPyAqLwordHlwZWRlZiBlbnVtIHsKKyAgTk9ORV9ZRVQgPSAwLAorICBUT19NRSwKKyAgVE9fT1RIRVIsCisgIEJST0FEQ0FTVCwKK30gU2lnbmFsRHN0OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgREJ1c0Vycm9yIGU7CisgICAgR0Vycm9yICpnZTsKKworICAgIEdQaWQgZGFlbW9uX3BpZDsKKworICAgIC8qIGVhdmVkcm9wIGtleXdvcmQgdGVzdHMgKi8KKyAgICBEQnVzQ29ubmVjdGlvbiAqc2VuZGVyOworICAgIERCdXNDb25uZWN0aW9uICpyZWNlaXZlcjsKKyAgICBTaWduYWxEc3QgcmVjZWl2ZXJfZHN0OworICAgIGRidXNfYm9vbF90IHJlY2VpdmVyX2dvdF9zdG9wcGVyOworICAgIERCdXNDb25uZWN0aW9uICplYXZlc2Ryb3BwZXI7CisgICAgU2lnbmFsRHN0IGVhdmVzZHJvcHBlcl9kc3Q7CisgICAgZGJ1c19ib29sX3QgZWF2ZXNkcm9wcGVyX2dvdF9zdG9wcGVyOworICAgIERCdXNDb25uZWN0aW9uICpwb2xpdGVsaXN0ZW5lcjsKKyAgICBTaWduYWxEc3QgcG9saXRlbGlzdGVuZXJfZHN0OworICAgIGRidXNfYm9vbF90IHBvbGl0ZWxpc3RlbmVyX2dvdF9zdG9wcGVyOworfSBGaXh0dXJlOworCisjZGVmaW5lIGFzc2VydF9ub19lcnJvcihlKSBfYXNzZXJ0X25vX2Vycm9yIChlLCBfX0ZJTEVfXywgX19MSU5FX18pCitzdGF0aWMgdm9pZAorX2Fzc2VydF9ub19lcnJvciAoY29uc3QgREJ1c0Vycm9yICplLAorICAgIGNvbnN0IGNoYXIgKmZpbGUsCisgICAgaW50IGxpbmUpCit7CisgIGlmIChHX1VOTElLRUxZIChkYnVzX2Vycm9yX2lzX3NldCAoZSkpKQorICAgIGdfZXJyb3IgKCIlczolZDogZXhwZWN0ZWQgc3VjY2VzcyBidXQgZ290IGVycm9yOiAlczogJXMiLAorICAgICAgICBmaWxlLCBsaW5lLCBlLT5uYW1lLCBlLT5tZXNzYWdlKTsKK30KKworc3RhdGljIGdjaGFyICoKK3NwYXduX2RidXNfZGFlbW9uIChnY2hhciAqYmluYXJ5LAorICAgIGdjaGFyICpjb25maWd1cmF0aW9uLAorICAgIEdQaWQgKmRhZW1vbl9waWQpCit7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworICBHU3RyaW5nICphZGRyZXNzOworICBnaW50IGFkZHJlc3NfZmQ7CisgIGdjaGFyICphcmd2W10gPSB7CisgICAgICBiaW5hcnksCisgICAgICBjb25maWd1cmF0aW9uLAorICAgICAgIi0tbm9mb3JrIiwKKyAgICAgICItLXByaW50LWFkZHJlc3M9MSIsIC8qIHN0ZG91dCAqLworICAgICAgTlVMTAorICB9OworCisgIGdfc3Bhd25fYXN5bmNfd2l0aF9waXBlcyAoTlVMTCwgLyogd29ya2luZyBkaXJlY3RvcnkgKi8KKyAgICAgIGFyZ3YsCisgICAgICBOVUxMLCAvKiBlbnZwICovCisgICAgICBHX1NQQVdOX0RPX05PVF9SRUFQX0NISUxEIHwgR19TUEFXTl9TRUFSQ0hfUEFUSCwKKyAgICAgIE5VTEwsIC8qIGNoaWxkX3NldHVwICovCisgICAgICBOVUxMLCAvKiB1c2VyIGRhdGEgKi8KKyAgICAgIGRhZW1vbl9waWQsCisgICAgICBOVUxMLCAvKiBjaGlsZCdzIHN0ZGluID0gL2Rldi9udWxsICovCisgICAgICAmYWRkcmVzc19mZCwKKyAgICAgIE5VTEwsIC8qIGNoaWxkJ3Mgc3RkZXJyID0gb3VyIHN0ZGVyciAqLworICAgICAgJmVycm9yKTsKKyAgZ19hc3NlcnRfbm9fZXJyb3IgKGVycm9yKTsKKworICBhZGRyZXNzID0gZ19zdHJpbmdfbmV3IChOVUxMKTsKKworICAvKiBwb2xsaW5nIHVudGlsIHRoZSBkYnVzLWRhZW1vbiB3cml0ZXMgb3V0IGl0cyBhZGRyZXNzIGlzIGEgYml0IHN0dXBpZCwKKyAgICogYnV0IGF0IGxlYXN0IGl0J3Mgc2ltcGxlLCB1bmxpa2UgZGJ1cy1sYXVuY2guLi4gaW4gcHJpbmNpcGxlIHdlIGNvdWxkCisgICAqIHVzZSBzZWxlY3QoKSBoZXJlLCBidXQgbGlmZSdzIHRvbyBzaG9ydCAqLworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBnc3NpemUgYnl0ZXM7CisgICAgICBnY2hhciBidWZbNDA5Nl07CisgICAgICBnY2hhciAqbmV3bGluZTsKKworICAgICAgYnl0ZXMgPSByZWFkIChhZGRyZXNzX2ZkLCBidWYsIHNpemVvZiAoYnVmKSk7CisKKyAgICAgIGlmIChieXRlcyA+IDApCisgICAgICAgIGdfc3RyaW5nX2FwcGVuZF9sZW4gKGFkZHJlc3MsIGJ1ZiwgYnl0ZXMpOworCisgICAgICBuZXdsaW5lID0gc3RyY2hyIChhZGRyZXNzLT5zdHIsICdcbicpOworCisgICAgICBpZiAobmV3bGluZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZ19zdHJpbmdfdHJ1bmNhdGUgKGFkZHJlc3MsIG5ld2xpbmUgLSBhZGRyZXNzLT5zdHIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgIGdfdXNsZWVwIChHX1VTRUNfUEVSX1NFQyAvIDEwKTsKKyAgICB9CisKKyAgcmV0dXJuIGdfc3RyaW5nX2ZyZWUgKGFkZHJlc3MsIEZBTFNFKTsKK30KKworc3RhdGljIERCdXNDb25uZWN0aW9uICoKK2Nvbm5lY3RfdG9fYnVzIChjb25zdCBnY2hhciAqYWRkcmVzcykKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm47CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgZGJ1c19ib29sX3Qgb2s7CisKKyAgY29ubiA9IGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKGFkZHJlc3MsICZlcnJvcik7CisgIGFzc2VydF9ub19lcnJvciAoJmVycm9yKTsKKyAgZ19hc3NlcnQgKGNvbm4gIT0gTlVMTCk7CisKKyAgb2sgPSBkYnVzX2J1c19yZWdpc3RlciAoY29ubiwgJmVycm9yKTsKKyAgYXNzZXJ0X25vX2Vycm9yICgmZXJyb3IpOworICBnX2Fzc2VydCAob2spOworICBnX2Fzc2VydCAoZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lIChjb25uKSAhPSBOVUxMKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fc2V0dXBfd2l0aF9nX21haW4gKGNvbm4sIE5VTEwpOworICByZXR1cm4gY29ubjsKK30KKworLyogc2VuZCBhIHVuaWNhc3Qgc2lnbmFsIHRvIDxzZWxmPiB0byBlbnN1cmUgdGhhdCBubyBvdGhlciBjb25uZWN0aW9uCisgKiBsaXN0ZW5pbmcgaXMgdGhlIGFjdHVhbCByZWNpcGllbnQgZm9yIHRoZSBzaWduYWwgKi8KK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorc2VuZGVyX3NlbmRfdW5pY2FzdF90b19zZW5kZXIgKEZpeHR1cmUgKmYpCit7CisgIERCdXNNZXNzYWdlICpzaWduYWw7CisKKyAgc2lnbmFsID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKFNFTkRFUl9QQVRILCBTRU5ERVJfSUZBQ0UsCisgICAgICBTRU5ERVJfU0lHTkFMX05BTUUpOworICBkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChzaWduYWwsIGRidXNfYnVzX2dldF91bmlxdWVfbmFtZSAoZi0+c2VuZGVyKSk7CisKKyAgaWYgKHNpZ25hbCA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5zZW5kZXIsIHNpZ25hbCwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAoc2lnbmFsKTsKKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworfQorCisvKiBzZW5kIGEgdW5pY2FzdCBzaWduYWwgdG8gPHJlY2VpdmVyPiwgbWFraW5nIDxwb2xpdGVsaXN0ZW5lcj4gYW5kCisgKiA8ZWF2ZXNkcm9wcGVyPiBub3QgYSBhY3R1YWwgcmVjaXBpZW50IGZvciBpdCAqLworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitzZW5kZXJfc2VuZF91bmljYXN0X3RvX3JlY2VpdmVyIChGaXh0dXJlICpmKQoreworICBEQnVzTWVzc2FnZSAqc2lnbmFsOworCisgIHNpZ25hbCA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsIChTRU5ERVJfUEFUSCwgU0VOREVSX0lGQUNFLCBTRU5ERVJfU0lHTkFMX05BTUUpOworICBkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChzaWduYWwsIGRidXNfYnVzX2dldF91bmlxdWVfbmFtZSAoZi0+cmVjZWl2ZXIpKTsKKworICBpZiAoc2lnbmFsID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgc2lnbmFsLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChzaWduYWwpOworCisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorc2VuZGVyX3NlbmRfYnJvYWRjYXN0IChGaXh0dXJlICpmKQoreworICBEQnVzTWVzc2FnZSAqc2lnbmFsOworCisgIHNpZ25hbCA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsIChTRU5ERVJfUEFUSCwgU0VOREVSX0lGQUNFLCBTRU5ERVJfU0lHTkFMX05BTUUpOworICBkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChzaWduYWwsIE5VTEwpOworCisgIGlmIChzaWduYWwgPT0gTlVMTCkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+c2VuZGVyLCBzaWduYWwsIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHNpZ25hbCk7CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKK30KKworLyogU2VuZCBzcGVjaWFsIGJyb2FkY2FzdCBzaWduYWwgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY29ubmVjdGlvbnMgY2FuICJzdG9wIgorICogbGlzdGVuaW5nIGFuZCBjaGVjayB0aGVpciByZXN1bHRzLgorICogREJ1cyBkb2VzIG5vdCByZS1vcmRlciBtZXNzYWdlcywgc28gd2hlbiB0aGUgdGhyZWUgY29ubmVjdGlvbnMgaGF2ZSByZWNlaXZlZAorICogdGhpcyBzaWduYWwsIHdlIGFyZSBzdXJlIHRoYXQgYW55IG1lc3NhZ2Ugc2VudCBiZWZvcmUgaXQgaGFzIGFsc28gYmVlbgorICogZGlzcGF0Y2hlZC4gKi8KK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorc2VuZGVyX3NlbmRfc3RvcHBlciAoRml4dHVyZSAqZikKK3sKKyAgREJ1c01lc3NhZ2UgKnNpZ25hbDsKKworICBzaWduYWwgPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoU0VOREVSX1BBVEgsIFNFTkRFUl9JRkFDRSwgU0VOREVSX1NUT1BQRVJfTkFNRSk7CisgIGRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24gKHNpZ25hbCwgTlVMTCk7CisKKyAgaWYgKHNpZ25hbCA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5zZW5kZXIsIHNpZ25hbCwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAoc2lnbmFsKTsKKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworfQorCisvKiBJZ25vcmUgTmFtZUFjcXVpcmVkLCB0aGVuIGRlcGVuZGluZyBvbiB0aGUgc2lnbmFsIHJlY2VpdmVkOgorICogLSB1cGRhdGVzIGYtPjxjb25uPl9kc3QgYmFzZWQgb24gdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBtZXNzYWdlCisgKiAtIGFzc2VydHMgdGhhdCA8Y29ubj4gcmVjZWl2ZWQgdGhlIHN0b3Agc2lnbmFsCisgKi8KK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorc2lnbmFsX2ZpbHRlciAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgdm9pZCAqdXNlcl9kYXRhKQoreworICBGaXh0dXJlICpmID0gdXNlcl9kYXRhOworICBTaWduYWxEc3QgKmRzdCA9IE5VTEw7CisgIERCdXNDb25uZWN0aW9uICoqY29ubjsKKyAgZGJ1c19ib29sX3QgKmdvdF9zdG9wcGVyOworCisgIGlmICgwID09IHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpLCAiTmFtZUFjcXVpcmVkIikpCisgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworCisgIGlmIChjb25uZWN0aW9uID09IGYtPnJlY2VpdmVyKQorICAgIHsKKyAgICAgIGRzdCA9ICYoZi0+cmVjZWl2ZXJfZHN0KTsKKyAgICAgIGNvbm4gPSAmKGYtPnJlY2VpdmVyKTsKKyAgICAgIGdvdF9zdG9wcGVyID0gJihmLT5yZWNlaXZlcl9nb3Rfc3RvcHBlcik7CisgICAgfQorICBlbHNlIGlmIChjb25uZWN0aW9uID09IGYtPmVhdmVzZHJvcHBlcikKKyAgICB7CisgICAgICBkc3QgPSAmKGYtPmVhdmVzZHJvcHBlcl9kc3QpOworICAgICAgY29ubiA9ICYoZi0+ZWF2ZXNkcm9wcGVyKTsKKyAgICAgIGdvdF9zdG9wcGVyID0gJihmLT5lYXZlc2Ryb3BwZXJfZ290X3N0b3BwZXIpOworICAgIH0KKyAgZWxzZSBpZiAoY29ubmVjdGlvbiA9PSBmLT5wb2xpdGVsaXN0ZW5lcikKKyAgICB7CisgICAgICBkc3QgPSAmKGYtPnBvbGl0ZWxpc3RlbmVyX2RzdCk7CisgICAgICBjb25uID0gJihmLT5wb2xpdGVsaXN0ZW5lcik7CisgICAgICBnb3Rfc3RvcHBlciA9ICYoZi0+cG9saXRlbGlzdGVuZXJfZ290X3N0b3BwZXIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGdfZXJyb3IgKCJjb25uZWN0aW9uIG5vdCBtYXRjaGluZyIpOworICAgIH0KKworICBpZiAoMCA9PSBzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSwgU0VOREVSX1NJR05BTF9OQU1FKSkKKyAgICB7CisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSkgPT0gTlVMTCkKKyAgICAgICAgKmRzdCA9IEJST0FEQ0FTVDsKKyAgICAgIGVsc2UgaWYgKDAgPT0gc3RyY21wIChkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChtZXNzYWdlKSwgZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lICgqY29ubikpKQorICAgICAgICAqZHN0ID0gVE9fTUU7CisgICAgICBlbHNlIC8qIGlmIChkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChtZXNzYWdlKSAhPSBOVUxMKSAqLworICAgICAgICAqZHN0ID0gVE9fT1RIRVI7CisgICAgfQorICBlbHNlIGlmICgwID09IHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpLCBTRU5ERVJfU1RPUFBFUl9OQU1FKSkKKyAgICB7CisgICAgICAqZ290X3N0b3BwZXIgPSBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGdfZXJyb3IgKCJnb3QgdW5rbm93biBtZW1iZXIgZnJvbSBtZXNzYWdlOiAlcyIsCisgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpKTsKKyAgICB9CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZAorYWRkX3JlY2VpdmVyX2ZpbHRlciAoRml4dHVyZSAqZikKK3sKKyAgREJ1c0Vycm9yIGUgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgZGJ1c19idXNfYWRkX21hdGNoIChmLT5yZWNlaXZlciwgUkVDRUlWRVJfUlVMRSwgJmUpOworICBhc3NlcnRfbm9fZXJyb3IgKCZlKTsKKyAgZGJ1c19idXNfYWRkX21hdGNoIChmLT5yZWNlaXZlciwgU1RPUFBFUl9SVUxFLCAmZSk7CisgIGFzc2VydF9ub19lcnJvciAoJmUpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKGYtPnJlY2VpdmVyLAorICAgICAgICBzaWduYWxfZmlsdGVyLCBmLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7Cit9CisKK3N0YXRpYyB2b2lkCithZGRfZWF2ZXNkcm9wcGVyX2ZpbHRlciAoRml4dHVyZSAqZikKK3sKKyAgREJ1c0Vycm9yIGUgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgZGJ1c19idXNfYWRkX21hdGNoIChmLT5lYXZlc2Ryb3BwZXIsIEVBVkVTRFJPUFBFUl9SVUxFLCAmZSk7CisgIGFzc2VydF9ub19lcnJvciAoJmUpOworICBkYnVzX2J1c19hZGRfbWF0Y2ggKGYtPmVhdmVzZHJvcHBlciwgU1RPUFBFUl9SVUxFLCAmZSk7CisgIGFzc2VydF9ub19lcnJvciAoJmUpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKGYtPmVhdmVzZHJvcHBlciwKKyAgICAgICAgc2lnbmFsX2ZpbHRlciwgZiwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworfQorCitzdGF0aWMgdm9pZAorYWRkX3BvbGl0ZWxpc3RlbmVyX2ZpbHRlciAoRml4dHVyZSAqZikKK3sKKyAgREJ1c0Vycm9yIGUgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgZGJ1c19idXNfYWRkX21hdGNoIChmLT5wb2xpdGVsaXN0ZW5lciwgUE9MSVRFTElTVEVORVJfUlVMRSwgJmUpOworICBhc3NlcnRfbm9fZXJyb3IgKCZlKTsKKyAgZGJ1c19idXNfYWRkX21hdGNoIChmLT5wb2xpdGVsaXN0ZW5lciwgU1RPUFBFUl9SVUxFLCAmZSk7CisgIGFzc2VydF9ub19lcnJvciAoJmUpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKGYtPnBvbGl0ZWxpc3RlbmVyLAorICAgICAgICBzaWduYWxfZmlsdGVyLCBmLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7Cit9CisKK3N0YXRpYyB2b2lkCitzZXR1cCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQgR19HTlVDX1VOVVNFRCkKK3sKKyAgZ2NoYXIgKmRidXNfZGFlbW9uOworICBnY2hhciAqY29uZmlnOworICBnY2hhciAqYWRkcmVzczsKKworICBmLT5nZSA9IE5VTEw7CisgIGRidXNfZXJyb3JfaW5pdCAoJmYtPmUpOworCisgIGRidXNfZGFlbW9uID0gZ19zdHJkdXAgKGdfZ2V0ZW52ICgiREJVU19URVNUX0RBRU1PTiIpKTsKKworICBpZiAoZGJ1c19kYWVtb24gPT0gTlVMTCkKKyAgICBkYnVzX2RhZW1vbiA9IGdfc3RyZHVwICgiZGJ1cy1kYWVtb24iKTsKKworICBpZiAoZ19nZXRlbnYgKCJEQlVTX1RFU1RfU1lTQ09ORkRJUiIpICE9IE5VTEwpCisgICAgeworICAgICAgY29uZmlnID0gZ19zdHJkdXBfcHJpbnRmICgiLS1jb25maWctZmlsZT0lcy9kYnVzLTEvc2Vzc2lvbi5jb25mIiwKKyAgICAgICAgICBnX2dldGVudiAoIkRCVVNfVEVTVF9TWVNDT05GRElSIikpOworICAgIH0KKyAgZWxzZSBpZiAoZ19nZXRlbnYgKCJEQlVTX1RFU1RfREFUQSIpICE9IE5VTEwpCisgICAgeworICAgICAgY29uZmlnID0gZ19zdHJkdXBfcHJpbnRmICgKKyAgICAgICAgICAiLS1jb25maWctZmlsZT0lcy92YWxpZC1jb25maWctZmlsZXMvc2Vzc2lvbi5jb25mIiwKKyAgICAgICAgICBnX2dldGVudiAoIkRCVVNfVEVTVF9EQVRBIikpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNvbmZpZyA9IGdfc3RyZHVwICgiLS1zZXNzaW9uIik7CisgICAgfQorCisgIGFkZHJlc3MgPSBzcGF3bl9kYnVzX2RhZW1vbiAoZGJ1c19kYWVtb24sIGNvbmZpZywgJmYtPmRhZW1vbl9waWQpOworCisgIGdfZnJlZSAoZGJ1c19kYWVtb24pOworICBnX2ZyZWUgKGNvbmZpZyk7CisKKyAgZi0+c2VuZGVyID0gY29ubmVjdF90b19idXMgKGFkZHJlc3MpOworICBkYnVzX2J1c19yZXF1ZXN0X25hbWUgKGYtPnNlbmRlciwgU0VOREVSX05BTUUsIERCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRSwKKyAgICAgICYoZi0+ZSkpOworICBmLT5yZWNlaXZlciA9IGNvbm5lY3RfdG9fYnVzIChhZGRyZXNzKTsKKyAgZi0+ZWF2ZXNkcm9wcGVyID0gY29ubmVjdF90b19idXMgKGFkZHJlc3MpOworICBmLT5wb2xpdGVsaXN0ZW5lciA9IGNvbm5lY3RfdG9fYnVzIChhZGRyZXNzKTsKKyAgYWRkX3JlY2VpdmVyX2ZpbHRlciAoZik7CisgIGFkZF9wb2xpdGVsaXN0ZW5lcl9maWx0ZXIgKGYpOworICBhZGRfZWF2ZXNkcm9wcGVyX2ZpbHRlciAoZik7CisKKyAgZ19mcmVlIChhZGRyZXNzKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfZWF2ZXNkcm9wX2Jyb2FkY2FzdCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQgR19HTlVDX1VOVVNFRCkKK3sKKyAgc2VuZGVyX3NlbmRfYnJvYWRjYXN0IChmKTsKKyAgc2VuZGVyX3NlbmRfc3RvcHBlciAoZik7CisKKyAgd2hpbGUgKCFmLT5yZWNlaXZlcl9nb3Rfc3RvcHBlciB8fAorICAgICAgIWYtPnBvbGl0ZWxpc3RlbmVyX2dvdF9zdG9wcGVyIHx8CisgICAgICAhZi0+ZWF2ZXNkcm9wcGVyX2dvdF9zdG9wcGVyKQorICAgIGdfbWFpbl9jb250ZXh0X2l0ZXJhdGlvbiAoTlVMTCwgVFJVRSk7CisKKyAgLyogYWxsIHRoZSB0aHJlZSBjb25uZWN0aW9uIGNhbiByZWNlaXZlIGEgYnJvYWRjYXN0ICovCisgIGdfYXNzZXJ0X2NtcGludCAoZi0+cmVjZWl2ZXJfZHN0LCA9PSwgQlJPQURDQVNUKTsKKyAgZ19hc3NlcnRfY21waW50IChmLT5wb2xpdGVsaXN0ZW5lcl9kc3QsID09LCBCUk9BRENBU1QpOworICBnX2Fzc2VydF9jbXBpbnQgKGYtPmVhdmVzZHJvcHBlcl9kc3QsID09LCBCUk9BRENBU1QpOworfQorCisvKiBhIHdheSB0byBzYXkgdGhhdCBub25lIG9mIHRoZSBsaXN0ZW5pbmcgY29ubmVjdGlvbiBhcmUgZGVzdGluYXRpb24gb2YgdGhlCisgKiBzaWduYWwgKi8KK3N0YXRpYyB2b2lkCit0ZXN0X2VhdmVzZHJvcF91bmljYXN0X3RvX3NlbmRlciAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQgR19HTlVDX1VOVVNFRCkKK3sKKyAgc2VuZGVyX3NlbmRfdW5pY2FzdF90b19zZW5kZXIgKGYpOworICBzZW5kZXJfc2VuZF9zdG9wcGVyIChmKTsKKworICB3aGlsZSAoIWYtPnJlY2VpdmVyX2dvdF9zdG9wcGVyIHx8CisgICAgICAhZi0+cG9saXRlbGlzdGVuZXJfZ290X3N0b3BwZXIgfHwKKyAgICAgICFmLT5lYXZlc2Ryb3BwZXJfZ290X3N0b3BwZXIpCisgICAgZ19tYWluX2NvbnRleHRfaXRlcmF0aW9uIChOVUxMLCBUUlVFKTsKKworICAvKiBub3QgZGlyZWN0ZWQgdG8gaXQgYW5kIG5vdCBicm9hZGNhc3RlZCwgdGhleSBjYW5ub3QgcmVjZWl2ZSBpdCAqLworICBnX2Fzc2VydF9jbXBpbnQgKGYtPnJlY2VpdmVyX2RzdCwgPT0sIE5PTkVfWUVUKTsKKyAgZ19hc3NlcnRfY21waW50IChmLT5wb2xpdGVsaXN0ZW5lcl9kc3QsID09LCBOT05FX1lFVCk7CisgIC8qIGVhdmVzZHJvcD10cnVlLCBpdCB3aWxsIHJlY2VpdmUgdGhlIHNpZ25hbCBldmVuIHRob3VnaCBpdCdzIG5vdCBkaXJlY3RlZAorICAgKiB0byBpdCAqLworICBnX2Fzc2VydF9jbXBpbnQgKGYtPmVhdmVzZHJvcHBlcl9kc3QsID09LCBUT19PVEhFUik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2VhdmVzZHJvcF91bmljYXN0X3RvX3JlY2VpdmVyIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCBHX0dOVUNfVU5VU0VEKQoreworICBzZW5kZXJfc2VuZF91bmljYXN0X3RvX3JlY2VpdmVyIChmKTsKKyAgc2VuZGVyX3NlbmRfc3RvcHBlciAoZik7CisKKyAgd2hpbGUgKCFmLT5yZWNlaXZlcl9nb3Rfc3RvcHBlciB8fAorICAgICAgIWYtPnBvbGl0ZWxpc3RlbmVyX2dvdF9zdG9wcGVyIHx8CisgICAgICAhZi0+ZWF2ZXNkcm9wcGVyX2dvdF9zdG9wcGVyKQorICAgIGdfbWFpbl9jb250ZXh0X2l0ZXJhdGlvbiAoTlVMTCwgVFJVRSk7CisKKyAgLyogZGlyZWN0IHRvIGhpbSAqLworICBnX2Fzc2VydF9jbXBpbnQgKGYtPnJlY2VpdmVyX2RzdCwgPT0sIFRPX01FKTsKKyAgLyogbm90IGRpcmVjdGVkIHRvIGl0IGFuZCBub3QgYnJvYWRjYXN0ZWQsIGl0IGNhbm5vdCByZWNlaXZlIGl0ICovCisgIGdfYXNzZXJ0X2NtcGludCAoZi0+cG9saXRlbGlzdGVuZXJfZHN0LCA9PSwgTk9ORV9ZRVQpOworICAvKiBlYXZlc2Ryb3A9dHJ1ZSwgaXQgd2lsbCByZWNlaXZlIHRoZSBzaWduYWwgZXZlbiB0aG91Z2ggaXQncyBub3QgZGlyZWN0ZWQKKyAgICogdG8gaXQgKi8KKyAgZ19hc3NlcnRfY21waW50IChmLT5lYXZlc2Ryb3BwZXJfZHN0LCA9PSwgVE9fT1RIRVIpOworfQorCitzdGF0aWMgdm9pZAordGVhcmRvd24gKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0IEdfR05VQ19VTlVTRUQpCit7CisgIGRidXNfZXJyb3JfZnJlZSAoJmYtPmUpOworICBnX2NsZWFyX2Vycm9yICgmZi0+Z2UpOworCisgIGlmIChmLT5zZW5kZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPnNlbmRlcik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPnNlbmRlcik7CisgICAgICBmLT5zZW5kZXIgPSBOVUxMOworICAgIH0KKworICBpZiAoZi0+cmVjZWl2ZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX2ZpbHRlciAoZi0+cmVjZWl2ZXIsCisgICAgICAgICAgc2lnbmFsX2ZpbHRlciwgZik7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+cmVjZWl2ZXIpOworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChmLT5yZWNlaXZlcik7CisgICAgICBmLT5yZWNlaXZlciA9IE5VTEw7CisgICAgfQorCisgIGlmIChmLT5wb2xpdGVsaXN0ZW5lciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9yZW1vdmVfZmlsdGVyIChmLT5wb2xpdGVsaXN0ZW5lciwKKyAgICAgICAgICBzaWduYWxfZmlsdGVyLCBmKTsKKworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChmLT5wb2xpdGVsaXN0ZW5lcik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPnBvbGl0ZWxpc3RlbmVyKTsKKyAgICAgIGYtPnBvbGl0ZWxpc3RlbmVyID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGYtPmVhdmVzZHJvcHBlciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9yZW1vdmVfZmlsdGVyIChmLT5lYXZlc2Ryb3BwZXIsCisgICAgICAgICAgc2lnbmFsX2ZpbHRlciwgZik7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+ZWF2ZXNkcm9wcGVyKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZi0+ZWF2ZXNkcm9wcGVyKTsKKyAgICAgIGYtPmVhdmVzZHJvcHBlciA9IE5VTEw7CisgICAgfQorCisjaWZkZWYgREJVU19XSU4KKyAgVGVybWluYXRlUHJvY2VzcyAoZi0+ZGFlbW9uX3BpZCwgMSk7CisjZWxzZQorICBraWxsIChmLT5kYWVtb25fcGlkLCBTSUdURVJNKTsKKyNlbmRpZgorCisgIGdfc3Bhd25fY2xvc2VfcGlkIChmLT5kYWVtb25fcGlkKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywKKyAgICBjaGFyICoqYXJndikKK3sKKyAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CisgIGdfdGVzdF9idWdfYmFzZSAoImh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPSIpOworCisgIGdfdGVzdF9hZGQgKCIvZWF2ZWRyb3AvbWF0Y2hfa2V5d29yZC9icm9hZGNhc3QiLCBGaXh0dXJlLCBOVUxMLAorICAgICAgc2V0dXAsIHRlc3RfZWF2ZXNkcm9wX2Jyb2FkY2FzdCwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL2VhdmVkcm9wL21hdGNoX2tleXdvcmQvdW5pY2FzdF90b19yZWNlaXZlciIsIEZpeHR1cmUsIE5VTEwsCisgICAgICBzZXR1cCwgdGVzdF9lYXZlc2Ryb3BfdW5pY2FzdF90b19yZWNlaXZlciwKKyAgICAgIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9lYXZlZHJvcC9tYXRjaF9rZXl3b3JkL3VuaWNhc3RfdG9fc2VuZGVyIiwgRml4dHVyZSwgTlVMTCwKKyAgICAgIHNldHVwLCB0ZXN0X2VhdmVzZHJvcF91bmljYXN0X3RvX3NlbmRlciwgdGVhcmRvd24pOworCisgIHJldHVybiBnX3Rlc3RfcnVuICgpOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2RidXMtZGFlbW9uLmMgYi9kYnVzL3Rlc3QvZGJ1cy1kYWVtb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzg3MTUzCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L2RidXMtZGFlbW9uLmMKQEAgLTAsMCArMSwzNjggQEAKKy8qIEludGVncmF0aW9uIHRlc3RzIGZvciB0aGUgZGJ1cy1kYWVtb24KKyAqCisgKiBBdXRob3I6IFNpbW9uIE1jVml0dGllIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CisgKiBDb3B5cmlnaHQgwqkgMjAxMC0yMDExIE5va2lhIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzCisgKiAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAorICogaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyAqIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWdsaWItbG93bGV2ZWwuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgREJVU19XSU4KKyMgaW5jbHVkZSA8aW8uaD4KKyMgaW5jbHVkZSA8d2luZG93cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8c2lnbmFsLmg+CisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBnYm9vbGVhbiBza2lwOworCisgICAgREJ1c0Vycm9yIGU7CisgICAgR0Vycm9yICpnZTsKKworICAgIEdQaWQgZGFlbW9uX3BpZDsKKworICAgIERCdXNDb25uZWN0aW9uICpsZWZ0X2Nvbm47CisKKyAgICBEQnVzQ29ubmVjdGlvbiAqcmlnaHRfY29ubjsKKyAgICBnYm9vbGVhbiByaWdodF9jb25uX2VjaG87Cit9IEZpeHR1cmU7CisKKyNkZWZpbmUgYXNzZXJ0X25vX2Vycm9yKGUpIF9hc3NlcnRfbm9fZXJyb3IgKGUsIF9fRklMRV9fLCBfX0xJTkVfXykKK3N0YXRpYyB2b2lkCitfYXNzZXJ0X25vX2Vycm9yIChjb25zdCBEQnVzRXJyb3IgKmUsCisgICAgY29uc3QgY2hhciAqZmlsZSwKKyAgICBpbnQgbGluZSkKK3sKKyAgaWYgKEdfVU5MSUtFTFkgKGRidXNfZXJyb3JfaXNfc2V0IChlKSkpCisgICAgZ19lcnJvciAoIiVzOiVkOiBleHBlY3RlZCBzdWNjZXNzIGJ1dCBnb3QgZXJyb3I6ICVzOiAlcyIsCisgICAgICAgIGZpbGUsIGxpbmUsIGUtPm5hbWUsIGUtPm1lc3NhZ2UpOworfQorCitzdGF0aWMgZ2NoYXIgKgorc3Bhd25fZGJ1c19kYWVtb24gKGdjaGFyICpiaW5hcnksCisgICAgZ2NoYXIgKmNvbmZpZ3VyYXRpb24sCisgICAgR1BpZCAqZGFlbW9uX3BpZCkKK3sKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisgIEdTdHJpbmcgKmFkZHJlc3M7CisgIGdpbnQgYWRkcmVzc19mZDsKKyAgZ2NoYXIgKmFyZ3ZbXSA9IHsKKyAgICAgIGJpbmFyeSwKKyAgICAgIGNvbmZpZ3VyYXRpb24sCisgICAgICAiLS1ub2ZvcmsiLAorICAgICAgIi0tcHJpbnQtYWRkcmVzcz0xIiwgLyogc3Rkb3V0ICovCisgICAgICBOVUxMCisgIH07CisKKyAgZ19zcGF3bl9hc3luY193aXRoX3BpcGVzIChOVUxMLCAvKiB3b3JraW5nIGRpcmVjdG9yeSAqLworICAgICAgYXJndiwKKyAgICAgIE5VTEwsIC8qIGVudnAgKi8KKyAgICAgIEdfU1BBV05fRE9fTk9UX1JFQVBfQ0hJTEQgfCBHX1NQQVdOX1NFQVJDSF9QQVRILAorICAgICAgTlVMTCwgLyogY2hpbGRfc2V0dXAgKi8KKyAgICAgIE5VTEwsIC8qIHVzZXIgZGF0YSAqLworICAgICAgZGFlbW9uX3BpZCwKKyAgICAgIE5VTEwsIC8qIGNoaWxkJ3Mgc3RkaW4gPSAvZGV2L251bGwgKi8KKyAgICAgICZhZGRyZXNzX2ZkLAorICAgICAgTlVMTCwgLyogY2hpbGQncyBzdGRlcnIgPSBvdXIgc3RkZXJyICovCisgICAgICAmZXJyb3IpOworICBnX2Fzc2VydF9ub19lcnJvciAoZXJyb3IpOworCisgIGFkZHJlc3MgPSBnX3N0cmluZ19uZXcgKE5VTEwpOworCisgIC8qIHBvbGxpbmcgdW50aWwgdGhlIGRidXMtZGFlbW9uIHdyaXRlcyBvdXQgaXRzIGFkZHJlc3MgaXMgYSBiaXQgc3R1cGlkLAorICAgKiBidXQgYXQgbGVhc3QgaXQncyBzaW1wbGUsIHVubGlrZSBkYnVzLWxhdW5jaC4uLiBpbiBwcmluY2lwbGUgd2UgY291bGQKKyAgICogdXNlIHNlbGVjdCgpIGhlcmUsIGJ1dCBsaWZlJ3MgdG9vIHNob3J0ICovCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGdzc2l6ZSBieXRlczsKKyAgICAgIGdjaGFyIGJ1Zls0MDk2XTsKKyAgICAgIGdjaGFyICpuZXdsaW5lOworCisgICAgICBieXRlcyA9IHJlYWQgKGFkZHJlc3NfZmQsIGJ1Ziwgc2l6ZW9mIChidWYpKTsKKworICAgICAgaWYgKGJ5dGVzID4gMCkKKyAgICAgICAgZ19zdHJpbmdfYXBwZW5kX2xlbiAoYWRkcmVzcywgYnVmLCBieXRlcyk7CisKKyAgICAgIG5ld2xpbmUgPSBzdHJjaHIgKGFkZHJlc3MtPnN0ciwgJ1xuJyk7CisKKyAgICAgIGlmIChuZXdsaW5lICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBnX3N0cmluZ190cnVuY2F0ZSAoYWRkcmVzcywgbmV3bGluZSAtIGFkZHJlc3MtPnN0cik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgZ191c2xlZXAgKEdfVVNFQ19QRVJfU0VDIC8gMTApOworICAgIH0KKworICByZXR1cm4gZ19zdHJpbmdfZnJlZSAoYWRkcmVzcywgRkFMU0UpOworfQorCitzdGF0aWMgREJ1c0Nvbm5lY3Rpb24gKgorY29ubmVjdF90b19idXMgKGNvbnN0IGdjaGFyICphZGRyZXNzKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubjsKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworICBkYnVzX2Jvb2xfdCBvazsKKworICBjb25uID0gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAoYWRkcmVzcywgJmVycm9yKTsKKyAgYXNzZXJ0X25vX2Vycm9yICgmZXJyb3IpOworICBnX2Fzc2VydCAoY29ubiAhPSBOVUxMKTsKKworICBvayA9IGRidXNfYnVzX3JlZ2lzdGVyIChjb25uLCAmZXJyb3IpOworICBhc3NlcnRfbm9fZXJyb3IgKCZlcnJvcik7CisgIGdfYXNzZXJ0IChvayk7CisgIGdfYXNzZXJ0IChkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgKGNvbm4pICE9IE5VTEwpOworCisgIGRidXNfY29ubmVjdGlvbl9zZXR1cF93aXRoX2dfbWFpbiAoY29ubiwgTlVMTCk7CisgIHJldHVybiBjb25uOworfQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK2VjaG9fZmlsdGVyIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICBEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICB2b2lkICp1c2VyX2RhdGEpCit7CisgIERCdXNNZXNzYWdlICpyZXBseTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSAhPSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCkKKyAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisKKyAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworCisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCByZXBseSwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7Cit9CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICpidWdfcmVmOworICAgIGd1aW50IG1pbl9tZXNzYWdlczsKKyAgICBjb25zdCBjaGFyICpjb25maWdfZmlsZTsKK30gQ29uZmlnOworCitzdGF0aWMgdm9pZAorc2V0dXAgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBjb25zdCBDb25maWcgKmNvbmZpZyA9IGNvbnRleHQ7CisgIGdjaGFyICpkYnVzX2RhZW1vbjsKKyAgZ2NoYXIgKmFyZzsKKyAgZ2NoYXIgKmFkZHJlc3M7CisKKyAgZi0+Z2UgPSBOVUxMOworICBkYnVzX2Vycm9yX2luaXQgKCZmLT5lKTsKKworICBpZiAoY29uZmlnICE9IE5VTEwgJiYgY29uZmlnLT5jb25maWdfZmlsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChnX2dldGVudiAoIkRCVVNfVEVTVF9EQVRBIikgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGdfbWVzc2FnZSAoIlNLSVA6IHNldCBEQlVTX1RFU1RfREFUQSB0byBhIGRpcmVjdG9yeSBjb250YWluaW5nICVzIiwKKyAgICAgICAgICAgICAgY29uZmlnLT5jb25maWdfZmlsZSk7CisgICAgICAgICAgZi0+c2tpcCA9IFRSVUU7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgIGFyZyA9IGdfc3RyZHVwX3ByaW50ZiAoCisgICAgICAgICAgIi0tY29uZmlnLWZpbGU9JXMvJXMiLAorICAgICAgICAgIGdfZ2V0ZW52ICgiREJVU19URVNUX0RBVEEiKSwgY29uZmlnLT5jb25maWdfZmlsZSk7CisgICAgfQorICBlbHNlIGlmIChnX2dldGVudiAoIkRCVVNfVEVTVF9TWVNDT05GRElSIikgIT0gTlVMTCkKKyAgICB7CisgICAgICBhcmcgPSBnX3N0cmR1cF9wcmludGYgKCItLWNvbmZpZy1maWxlPSVzL2RidXMtMS9zZXNzaW9uLmNvbmYiLAorICAgICAgICAgIGdfZ2V0ZW52ICgiREJVU19URVNUX1NZU0NPTkZESVIiKSk7CisgICAgfQorICBlbHNlIGlmIChnX2dldGVudiAoIkRCVVNfVEVTVF9EQVRBIikgIT0gTlVMTCkKKyAgICB7CisgICAgICBhcmcgPSBnX3N0cmR1cF9wcmludGYgKAorICAgICAgICAgICItLWNvbmZpZy1maWxlPSVzL3ZhbGlkLWNvbmZpZy1maWxlcy9zZXNzaW9uLmNvbmYiLAorICAgICAgICAgIGdfZ2V0ZW52ICgiREJVU19URVNUX0RBVEEiKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYXJnID0gZ19zdHJkdXAgKCItLXNlc3Npb24iKTsKKyAgICB9CisKKyAgZGJ1c19kYWVtb24gPSBnX3N0cmR1cCAoZ19nZXRlbnYgKCJEQlVTX1RFU1RfREFFTU9OIikpOworCisgIGlmIChkYnVzX2RhZW1vbiA9PSBOVUxMKQorICAgIGRidXNfZGFlbW9uID0gZ19zdHJkdXAgKCJkYnVzLWRhZW1vbiIpOworCisgIGFkZHJlc3MgPSBzcGF3bl9kYnVzX2RhZW1vbiAoZGJ1c19kYWVtb24sIGFyZywgJmYtPmRhZW1vbl9waWQpOworCisgIGdfZnJlZSAoZGJ1c19kYWVtb24pOworICBnX2ZyZWUgKGFyZyk7CisKKyAgZi0+bGVmdF9jb25uID0gY29ubmVjdF90b19idXMgKGFkZHJlc3MpOworICBmLT5yaWdodF9jb25uID0gY29ubmVjdF90b19idXMgKGFkZHJlc3MpOworICBnX2ZyZWUgKGFkZHJlc3MpOworfQorCitzdGF0aWMgdm9pZAorYWRkX2VjaG9fZmlsdGVyIChGaXh0dXJlICpmKQoreworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChmLT5yaWdodF9jb25uLCBlY2hvX2ZpbHRlciwgTlVMTCwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGYtPnJpZ2h0X2Nvbm5fZWNobyA9IFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitwY19jb3VudCAoREJ1c1BlbmRpbmdDYWxsICpwYywKKyAgICB2b2lkICpkYXRhKQoreworICBndWludCAqcmVjZWl2ZWRfcCA9IGRhdGE7CisKKyAgKCpyZWNlaXZlZF9wKSsrOworfQorCitzdGF0aWMgdm9pZAordGVzdF9lY2hvIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCkKK3sKKyAgY29uc3QgQ29uZmlnICpjb25maWcgPSBjb250ZXh0OworICBndWludCBjb3VudCA9IDIwMDA7CisgIGd1aW50IHNlbnQ7CisgIGd1aW50IHJlY2VpdmVkID0gMDsKKyAgZG91YmxlIGVsYXBzZWQ7CisKKyAgaWYgKGYtPnNraXApCisgICAgcmV0dXJuOworCisgIGlmIChjb25maWcgIT0gTlVMTCAmJiBjb25maWctPmJ1Z19yZWYgIT0gTlVMTCkKKyAgICBnX3Rlc3RfYnVnIChjb25maWctPmJ1Z19yZWYpOworCisgIGlmIChnX3Rlc3RfcGVyZiAoKSkKKyAgICBjb3VudCA9IDEwMDAwMDsKKworICBpZiAoY29uZmlnICE9IE5VTEwpCisgICAgY291bnQgPSBNQVggKGNvbmZpZy0+bWluX21lc3NhZ2VzLCBjb3VudCk7CisKKyAgYWRkX2VjaG9fZmlsdGVyIChmKTsKKworICBnX3Rlc3RfdGltZXJfc3RhcnQgKCk7CisKKyAgZm9yIChzZW50ID0gMDsgc2VudCA8IGNvdW50OyBzZW50KyspCisgICAgeworICAgICAgREJ1c01lc3NhZ2UgKm0gPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsICgKKyAgICAgICAgICBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgKGYtPnJpZ2h0X2Nvbm4pLCAiLyIsCisgICAgICAgICAgImNvbS5leGFtcGxlIiwgIlNwYW0iKTsKKyAgICAgIERCdXNQZW5kaW5nQ2FsbCAqcGM7CisKKyAgICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIGdfZXJyb3IgKCJPT00iKTsKKworICAgICAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5IChmLT5sZWZ0X2Nvbm4sIG0sICZwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19USU1FT1VUX0lORklOSVRFKSB8fAorICAgICAgICAgIHBjID09IE5VTEwpCisgICAgICAgIGdfZXJyb3IgKCJPT00iKTsKKworICAgICAgaWYgKGRidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWQgKHBjKSkKKyAgICAgICAgcGNfY291bnQgKHBjLCAmcmVjZWl2ZWQpOworICAgICAgZWxzZSBpZiAoIWRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkgKHBjLCBwY19jb3VudCwgJnJlY2VpdmVkLAorICAgICAgICAgICAgTlVMTCkpCisgICAgICAgIGdfZXJyb3IgKCJPT00iKTsKKworICAgICAgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYgKHBjKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisgICAgfQorCisgIHdoaWxlIChyZWNlaXZlZCA8IGNvdW50KQorICAgIGdfbWFpbl9jb250ZXh0X2l0ZXJhdGlvbiAoTlVMTCwgVFJVRSk7CisKKyAgZWxhcHNlZCA9IGdfdGVzdF90aW1lcl9lbGFwc2VkICgpOworCisgIGdfdGVzdF9tYXhpbWl6ZWRfcmVzdWx0IChjb3VudCAvIGVsYXBzZWQsICIldSBtZXNzYWdlcyAvICVmIHNlY29uZHMiLAorICAgICAgY291bnQsIGVsYXBzZWQpOworfQorCitzdGF0aWMgdm9pZAordGVhcmRvd24gKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0IEdfR05VQ19VTlVTRUQpCit7CisgIGRidXNfZXJyb3JfZnJlZSAoJmYtPmUpOworICBnX2NsZWFyX2Vycm9yICgmZi0+Z2UpOworCisgIGlmIChmLT5sZWZ0X2Nvbm4gIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPmxlZnRfY29ubik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPmxlZnRfY29ubik7CisgICAgICBmLT5sZWZ0X2Nvbm4gPSBOVUxMOworICAgIH0KKworICBpZiAoZi0+cmlnaHRfY29ubiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChmLT5yaWdodF9jb25uX2VjaG8pCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX2ZpbHRlciAoZi0+cmlnaHRfY29ubiwgZWNob19maWx0ZXIsIE5VTEwpOworICAgICAgICAgIGYtPnJpZ2h0X2Nvbm5fZWNobyA9IEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+cmlnaHRfY29ubik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPnJpZ2h0X2Nvbm4pOworICAgICAgZi0+cmlnaHRfY29ubiA9IE5VTEw7CisgICAgfQorCisgIGlmIChmLT5kYWVtb25fcGlkICE9IDApCisgICAgeworI2lmZGVmIERCVVNfV0lOCisgICAgICBUZXJtaW5hdGVQcm9jZXNzIChmLT5kYWVtb25fcGlkLCAxKTsKKyNlbHNlCisgICAgICBraWxsIChmLT5kYWVtb25fcGlkLCBTSUdURVJNKTsKKyNlbmRpZgorCisgICAgICBnX3NwYXduX2Nsb3NlX3BpZCAoZi0+ZGFlbW9uX3BpZCk7CisgICAgICBmLT5kYWVtb25fcGlkID0gMDsKKyAgICB9Cit9CisKK3N0YXRpYyBDb25maWcgbGltaXRlZF9jb25maWcgPSB7CisgICAgIjM0MzkzIiwgMTAwMDAsICJ2YWxpZC1jb25maWctZmlsZXMvaW5jb21pbmctbGltaXQuY29uZiIKK307CisKK2ludAorbWFpbiAoaW50IGFyZ2MsCisgICAgY2hhciAqKmFyZ3YpCit7CisgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOworICBnX3Rlc3RfYnVnX2Jhc2UgKCJodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD0iKTsKKworICBnX3Rlc3RfYWRkICgiL2VjaG8vc2Vzc2lvbiIsIEZpeHR1cmUsIE5VTEwsIHNldHVwLCB0ZXN0X2VjaG8sIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9lY2hvL2xpbWl0ZWQiLCBGaXh0dXJlLCAmbGltaXRlZF9jb25maWcsCisgICAgICBzZXR1cCwgdGVzdF9lY2hvLCB0ZWFyZG93bik7CisKKyAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9CmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvZGJ1cy10ZXN0LXJ1bm5lciBiL2RidXMvdGVzdC9kYnVzLXRlc3QtcnVubmVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZGMzOTYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvZGJ1cy10ZXN0LXJ1bm5lcgpAQCAtMCwwICsxLDQzIEBACisjIS9iaW4vc2gKKworc2V0IC1lCisKK2Rpcj0iJDEiCitzaGlmdAorCitpZiAhIHRlc3QgLWQgIiRkaXIiOyB0aGVuCisgIGVjaG8gIlVzYWdlOiBkYnVzLXRlc3QtcnVubmVyIGRpcmVjdG9yeSBbZXhlY3V0YWJsZS4uLl0iCisgIGV4aXQgMAorZmkKKworcGFzc2VkPTAKK2ZhaWxlZD0wCitza2lwcGVkPTAKKworZm9yIHByb2cgaW4gIiRAIjsgZG8KKyAgZT0wCisgICIkZGlyLyRwcm9nIiB8fCBlPSQ/CisgIGNhc2UgJGUgaW4KKyAgICAoMCkKKyAgICAgIGVjaG8gIlBBU1M6ICRwcm9nIgorICAgICAgcGFzc2VkPWBleHByICRwYXNzZWQgKyAxYAorICAgICAgOzsKKyAgICAoNzcpCisgICAgICBlY2hvICJTS0lQOiAkcHJvZyIKKyAgICAgIHNraXBwZWQ9YGV4cHIgJHNraXBwZWQgKyAxYAorICAgICAgOzsKKyAgICAoKikKKyAgICAgIGVjaG8gIkZBSUw6ICRwcm9nIgorICAgICAgZmFpbGVkPWBleHByICRmYWlsZWQgKyAxYAorICAgICAgOzsKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0ICRmYWlsZWQgPSAwOyB0aGVuCisgICMgYXZvaWQgc2F5aW5nICJGQUlMIiwgdG8gbWFrZSBpdCBlYXN5IHRvIGdyZXAgcmVzdWx0cyEKKyAgZWNobyAiUEFTU0VEICRwYXNzZWQgLyBTS0lQUEVEICRza2lwcGVkIgorICBleGl0IDAKK2Vsc2UKKyAgZWNobyAiUEFTU0VEICRwYXNzZWQgLyBGQUlMRUQgJGZhaWxlZCAvIFNLSVBQRUQgJHNraXBwZWQiCisgIGV4aXQgMQorZmkKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9pbnRlcm5hbHMvcmVmcy5jIGIvZGJ1cy90ZXN0L2ludGVybmFscy9yZWZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI0M2E0ZAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9pbnRlcm5hbHMvcmVmcy5jCkBAIC0wLDAgKzEsNjA4IEBACisvKiBSZWdyZXNzaW9uIHRlc3QgZm9yIHRocmVhZC1zYWZlIHJlZmVyZW5jZS1jb3VudGluZworICoKKyAqIEF1dGhvcjogU2ltb24gTWNWaXR0aWUgPHNpbW9uLm1jdml0dGllQGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCDCqSAyMDExIE5va2lhIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzCisgKiAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAorICogaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyAqIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNkZWZpbmUgREJVU19DT01QSUxBVElPTiAgICAvKiB0aGlzIHRlc3QgdXNlcyBsaWJkYnVzLWludGVybmFsICovCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFpbmxvb3AuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVzc2FnZS1pbnRlcm5hbC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1wZW5kaW5nLWNhbGwtaW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc2VydmVyLXByb3RlY3RlZC5oPgorI2luY2x1ZGUgInRlc3QtdXRpbHMuaCIKKworc3RhdGljIHZvaWQKK2Fzc2VydF9ub19lcnJvciAoY29uc3QgREJ1c0Vycm9yICplKQoreworICBpZiAoR19VTkxJS0VMWSAoZGJ1c19lcnJvcl9pc19zZXQgKGUpKSkKKyAgICBnX2Vycm9yICgiZXhwZWN0ZWQgc3VjY2VzcyBidXQgZ290IGVycm9yOiAlczogJXMiLCBlLT5uYW1lLCBlLT5tZXNzYWdlKTsKK30KKworI2RlZmluZSBOX1RIUkVBRFMgMjAwCisjZGVmaW5lIE5fUkVGUyAxMDAwMAorR19TVEFUSUNfQVNTRVJUICgoKHVuc2lnbmVkKSBOX1RIUkVBRFMgKiAodW5zaWduZWQpIE5fUkVGUykgPCBHX01BWElOVDMyKTsKKworc3RhdGljIGRidXNfaW50MzJfdCBjb25uZWN0aW9uX3Nsb3QgPSAtMTsKK3N0YXRpYyBkYnVzX2ludDMyX3Qgc2VydmVyX3Nsb3QgPSAtMTsKK3N0YXRpYyBkYnVzX2ludDMyX3QgbWVzc2FnZV9zbG90ID0gLTE7CitzdGF0aWMgZGJ1c19pbnQzMl90IHBlbmRpbmdfY2FsbF9zbG90ID0gLTE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgREJ1c0Vycm9yIGU7CisgIERCdXNMb29wICpsb29wOworICBEQnVzU2VydmVyICpzZXJ2ZXI7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICBEQnVzQ29ubmVjdGlvbiAqc2VydmVyX2Nvbm5lY3Rpb247CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBHVGhyZWFkICp0aHJlYWRzW05fVEhSRUFEU107CisgIGdib29sZWFuIGxhc3RfdW5yZWY7Cit9IEZpeHR1cmU7CisKK3R5cGVkZWYgdm9pZCAqKCpSZWZGdW5jKSAodm9pZCAqKTsKK3R5cGVkZWYgdm9pZCAoKlZvaWRGdW5jKSAodm9pZCAqKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB2b2lkICp0aGluZzsKKyAgUmVmRnVuYyByZWY7CisgIFZvaWRGdW5jIHJlZl92b2lkOworICBWb2lkRnVuYyB1bnJlZjsKKyAgdm9pZCAqbXV0ZXg7CisgIFZvaWRGdW5jIGxvY2s7CisgIFZvaWRGdW5jIHVubG9jazsKK30gVGhyZWFkOworCisvKiBwcm92aWRlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHNoaW0gd2hlbiBidWlsZGluZyB3aXRoIGEgZ2xpYiA8PSAyLjMwLnggKi8KKyNpZiAhR0xJQl9DSEVDS19WRVJTSU9OKDIsMzEsMCkKKyNkZWZpbmUgZ190aHJlYWRfbmV3KG5hbWUsZnVuYyxkYXRhKSBnX3RocmVhZF9jcmVhdGUoZnVuYyxkYXRhLFRSVUUsTlVMTCkKKyNlbmRpZgorCitzdGF0aWMgZ3BvaW50ZXIKK3JlZl90aHJlYWQgKGdwb2ludGVyIGRhdGEpCit7CisgIFRocmVhZCAqdGhyZWFkID0gZGF0YTsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IE5fUkVGUzsgaSsrKQorICAgIHsKKyAgICAgIGlmICh0aHJlYWQtPmxvY2sgIT0gTlVMTCkKKyAgICAgICAgKHRocmVhZC0+bG9jaykgKHRocmVhZC0+bXV0ZXgpOworCisgICAgICBpZiAodGhyZWFkLT5yZWYgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGdwb2ludGVyIHJldCA9ICh0aHJlYWQtPnJlZikgKHRocmVhZC0+dGhpbmcpOworCisgICAgICAgICAgZ19hc3NlcnQgKHJldCA9PSB0aHJlYWQtPnRoaW5nKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgKHRocmVhZC0+cmVmX3ZvaWQpICh0aHJlYWQtPnRoaW5nKTsKKyAgICAgICAgfQorCisgICAgICBpZiAodGhyZWFkLT51bmxvY2sgIT0gTlVMTCkKKyAgICAgICAgKHRocmVhZC0+dW5sb2NrKSAodGhyZWFkLT5tdXRleCk7CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgZ3BvaW50ZXIKK2N5Y2xlX3RocmVhZCAoZ3BvaW50ZXIgZGF0YSkKK3sKKyAgVGhyZWFkICp0aHJlYWQgPSBkYXRhOworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgTl9SRUZTOyBpKyspCisgICAgeworICAgICAgaWYgKHRocmVhZC0+bG9jayAhPSBOVUxMKQorICAgICAgICAodGhyZWFkLT5sb2NrKSAodGhyZWFkLT5tdXRleCk7CisKKyAgICAgIGlmICh0aHJlYWQtPnJlZiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZ3BvaW50ZXIgcmV0ID0gKHRocmVhZC0+cmVmKSAodGhyZWFkLT50aGluZyk7CisKKyAgICAgICAgICBnX2Fzc2VydCAocmV0ID09IHRocmVhZC0+dGhpbmcpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAodGhyZWFkLT5yZWZfdm9pZCkgKHRocmVhZC0+dGhpbmcpOworICAgICAgICB9CisKKyAgICAgICh0aHJlYWQtPnVucmVmKSAodGhyZWFkLT50aGluZyk7CisKKyAgICAgIGlmICh0aHJlYWQtPnVubG9jayAhPSBOVUxMKQorICAgICAgICAodGhyZWFkLT51bmxvY2spICh0aHJlYWQtPm11dGV4KTsKKyAgICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBncG9pbnRlcgordW5yZWZfdGhyZWFkIChncG9pbnRlciBkYXRhKQoreworICBUaHJlYWQgKnRocmVhZCA9IGRhdGE7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBOX1JFRlM7IGkrKykKKyAgICB7CisgICAgICBpZiAodGhyZWFkLT5sb2NrICE9IE5VTEwpCisgICAgICAgICh0aHJlYWQtPmxvY2spICh0aHJlYWQtPm11dGV4KTsKKworICAgICAgKHRocmVhZC0+dW5yZWYpICh0aHJlYWQtPnRoaW5nKTsKKworICAgICAgaWYgKHRocmVhZC0+dW5sb2NrICE9IE5VTEwpCisgICAgICAgICh0aHJlYWQtPnVubG9jaykgKHRocmVhZC0+bXV0ZXgpOworICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2xhc3RfdW5yZWYgKHZvaWQgKmRhdGEpCit7CisgIEZpeHR1cmUgKmYgPSBkYXRhOworCisgIGdfYXNzZXJ0ICghZi0+bGFzdF91bnJlZik7CisgIGYtPmxhc3RfdW5yZWYgPSBUUlVFOworfQorCitzdGF0aWMgdm9pZAord2FpdF9mb3JfYWxsX3RocmVhZHMgKEZpeHR1cmUgKmYpCit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBOX1RIUkVBRFM7IGkrKykKKyAgICBnX3RocmVhZF9qb2luIChmLT50aHJlYWRzW2ldKTsKK30KKworc3RhdGljIHZvaWQKK25ld19jb25uX2NiIChEQnVzU2VydmVyICpzZXJ2ZXIsCisgICAgREJ1c0Nvbm5lY3Rpb24gKnNlcnZlcl9jb25uZWN0aW9uLAorICAgIHZvaWQgKmRhdGEpCit7CisgIEZpeHR1cmUgKmYgPSBkYXRhOworCisgIGdfYXNzZXJ0IChmLT5zZXJ2ZXJfY29ubmVjdGlvbiA9PSBOVUxMKTsKKyAgZi0+c2VydmVyX2Nvbm5lY3Rpb24gPSBkYnVzX2Nvbm5lY3Rpb25fcmVmIChzZXJ2ZXJfY29ubmVjdGlvbik7CisKKyAgdGVzdF9jb25uZWN0aW9uX3NldHVwIChmLT5sb29wLCBmLT5zZXJ2ZXJfY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkCitzZXR1cCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGRhdGEpCit7CisgIGlmICghZGJ1c190aHJlYWRzX2luaXRfZGVmYXVsdCAoKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZi0+bG9vcCA9IF9kYnVzX2xvb3BfbmV3ICgpOworICBnX2Fzc2VydCAoZi0+bG9vcCAhPSBOVUxMKTsKKworICBkYnVzX2Vycm9yX2luaXQgKCZmLT5lKTsKKworICBmLT5zZXJ2ZXIgPSBkYnVzX3NlcnZlcl9saXN0ZW4gKCJ0Y3A6aG9zdD0xMjcuMC4wLjEiLCAmZi0+ZSk7CisgIGFzc2VydF9ub19lcnJvciAoJmYtPmUpOworICBnX2Fzc2VydCAoZi0+c2VydmVyICE9IE5VTEwpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FsbG9jYXRlX2RhdGFfc2xvdCAoJmNvbm5lY3Rpb25fc2xvdCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGlmICghZGJ1c19zZXJ2ZXJfYWxsb2NhdGVfZGF0YV9zbG90ICgmc2VydmVyX3Nsb3QpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9hbGxvY2F0ZV9kYXRhX3Nsb3QgKCZtZXNzYWdlX3Nsb3QpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBpZiAoIWRidXNfcGVuZGluZ19jYWxsX2FsbG9jYXRlX2RhdGFfc2xvdCAoJnBlbmRpbmdfY2FsbF9zbG90KSkKKyAgICBnX2Vycm9yICgiT09NIik7Cit9CisKK3N0YXRpYyB2b2lkCitzZXR1cF9jb25uZWN0aW9uIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSkKK3sKKyAgY2hhciAqYWRkcmVzczsKKworICBzZXR1cCAoZiwgZGF0YSk7CisKKyAgZGJ1c19zZXJ2ZXJfc2V0X25ld19jb25uZWN0aW9uX2Z1bmN0aW9uIChmLT5zZXJ2ZXIsCisgICAgICBuZXdfY29ubl9jYiwgZiwgTlVMTCk7CisKKyAgaWYgKCF0ZXN0X3NlcnZlcl9zZXR1cCAoZi0+bG9vcCwgZi0+c2VydmVyKSkKKyAgICBnX2Vycm9yICgiZmFpbGVkIHRvIHNldCB1cCBzZXJ2ZXIiKTsKKworICBhZGRyZXNzID0gZGJ1c19zZXJ2ZXJfZ2V0X2FkZHJlc3MgKGYtPnNlcnZlcik7CisgIGdfYXNzZXJ0IChhZGRyZXNzICE9IE5VTEwpOworICBmLT5jb25uZWN0aW9uID0gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAoYWRkcmVzcywgJmYtPmUpOworICBhc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnQgKGYtPmNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIGRidXNfZnJlZSAoYWRkcmVzcyk7CisKKyAgaWYgKCF0ZXN0X2Nvbm5lY3Rpb25fc2V0dXAgKGYtPmxvb3AsIGYtPmNvbm5lY3Rpb24pKQorICAgIGdfZXJyb3IgKCJmYWlsZWQgdG8gc2V0IHVwIGNvbm5lY3Rpb24iKTsKKworICB3aGlsZSAoZi0+c2VydmVyX2Nvbm5lY3Rpb24gPT0gTlVMTCkKKyAgICBfZGJ1c19sb29wX2l0ZXJhdGUgKGYtPmxvb3AsIFRSVUUpOworCisgIHRlc3RfY29ubmVjdGlvbl9zaHV0ZG93biAoZi0+bG9vcCwgZi0+Y29ubmVjdGlvbik7CisgIHRlc3Rfc2VydmVyX3NodXRkb3duIChmLT5sb29wLCBmLT5zZXJ2ZXIpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jb25uZWN0aW9uIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSkKK3sKKyAgVGhyZWFkIHB1YmxpY19hcGkgPSB7IGYtPmNvbm5lY3Rpb24sCisgICAgKFJlZkZ1bmMpIGRidXNfY29ubmVjdGlvbl9yZWYsCisgICAgTlVMTCwKKyAgICAoVm9pZEZ1bmMpIGRidXNfY29ubmVjdGlvbl91bnJlZiwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCB9OworICBUaHJlYWQgaW50ZXJuYWxfYXBpID0geyBmLT5jb25uZWN0aW9uLAorICAgIChSZWZGdW5jKSBfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCwKKyAgICBOVUxMLAorICAgIChWb2lkRnVuYykgX2RidXNfY29ubmVjdGlvbl91bnJlZl91bmxvY2tlZCwKKyAgICBmLT5jb25uZWN0aW9uLAorICAgIChWb2lkRnVuYykgX2RidXNfY29ubmVjdGlvbl9sb2NrLAorICAgIChWb2lkRnVuYykgX2RidXNfY29ubmVjdGlvbl91bmxvY2sgfTsKKyAgaW50IGk7CisKKyAgLyogVXNlIGEgc2xvdCBhcyBhIHBzZXVkby13ZWFrcmVmICovCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NldF9kYXRhIChmLT5jb25uZWN0aW9uLCBjb25uZWN0aW9uX3Nsb3QsIGYsCisgICAgICAgIGxhc3RfdW5yZWYpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBmb3IgKGkgPSAwOyBpIDwgTl9USFJFQURTOyBpKyspCisgICAgeworICAgICAgaWYgKChpICUgMikgPT0gMCkKKyAgICAgICAgZi0+dGhyZWFkc1tpXSA9IGdfdGhyZWFkX25ldyAoTlVMTCwgcmVmX3RocmVhZCwgJnB1YmxpY19hcGkpOworICAgICAgZWxzZQorICAgICAgICBmLT50aHJlYWRzW2ldID0gZ190aHJlYWRfbmV3IChOVUxMLCByZWZfdGhyZWFkLCAmaW50ZXJuYWxfYXBpKTsKKworICAgICAgZ19hc3NlcnQgKGYtPnRocmVhZHNbaV0gIT0gTlVMTCk7CisgICAgfQorCisgIHdhaXRfZm9yX2FsbF90aHJlYWRzIChmKTsKKworICBmb3IgKGkgPSAwOyBpIDwgTl9USFJFQURTOyBpKyspCisgICAgeworICAgICAgaWYgKChpICUgMikgPT0gMCkKKyAgICAgICAgZi0+dGhyZWFkc1tpXSA9IGdfdGhyZWFkX25ldyAoTlVMTCwgY3ljbGVfdGhyZWFkLCAmcHVibGljX2FwaSk7CisgICAgICBlbHNlCisgICAgICAgIGYtPnRocmVhZHNbaV0gPSBnX3RocmVhZF9uZXcgKE5VTEwsIGN5Y2xlX3RocmVhZCwgJmludGVybmFsX2FwaSk7CisKKyAgICAgIGdfYXNzZXJ0IChmLT50aHJlYWRzW2ldICE9IE5VTEwpOworICAgIH0KKworICB3YWl0X2Zvcl9hbGxfdGhyZWFkcyAoZik7CisKKyAgZm9yIChpID0gMDsgaSA8IE5fVEhSRUFEUzsgaSsrKQorICAgIHsKKyAgICAgIGlmICgoaSAlIDIpID09IDApCisgICAgICAgIGYtPnRocmVhZHNbaV0gPSBnX3RocmVhZF9uZXcgKE5VTEwsIHVucmVmX3RocmVhZCwgJnB1YmxpY19hcGkpOworICAgICAgZWxzZQorICAgICAgICBmLT50aHJlYWRzW2ldID0gZ190aHJlYWRfbmV3IChOVUxMLCB1bnJlZl90aHJlYWQsICZpbnRlcm5hbF9hcGkpOworCisgICAgICBnX2Fzc2VydCAoZi0+dGhyZWFkc1tpXSAhPSBOVUxMKTsKKyAgICB9CisKKyAgd2FpdF9mb3JfYWxsX3RocmVhZHMgKGYpOworCisgIC8qIERlc3Ryb3kgdGhlIGNvbm5lY3Rpb24uIFRoaXMgc2hvdWxkIGJlIHRoZSBsYXN0LXVucmVmLiAqLworICBnX2Fzc2VydCAoIWYtPmxhc3RfdW5yZWYpOworICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPmNvbm5lY3Rpb24pOworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPmNvbm5lY3Rpb24pOworICBmLT5jb25uZWN0aW9uID0gTlVMTDsKKyAgZ19hc3NlcnQgKGYtPmxhc3RfdW5yZWYpOworfQorCitzdGF0aWMgdm9pZAorc2VydmVyX2xvY2sgKHZvaWQgKnNlcnZlcikKK3sKKyAgU0VSVkVSX0xPQ0sgKCgoREJ1c1NlcnZlciAqKSBzZXJ2ZXIpKTsKK30KKworc3RhdGljIHZvaWQKK3NlcnZlcl91bmxvY2sgKHZvaWQgKnNlcnZlcikKK3sKKyAgU0VSVkVSX1VOTE9DSyAoKChEQnVzU2VydmVyICopIHNlcnZlcikpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zZXJ2ZXIgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBkYXRhKQoreworICBUaHJlYWQgcHVibGljX2FwaSA9IHsgZi0+c2VydmVyLAorICAgIChSZWZGdW5jKSBkYnVzX3NlcnZlcl9yZWYsCisgICAgTlVMTCwKKyAgICAoVm9pZEZ1bmMpIGRidXNfc2VydmVyX3VucmVmLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMIH07CisgIFRocmVhZCBpbnRlcm5hbF9hcGkgPSB7IGYtPnNlcnZlciwKKyAgICBOVUxMLAorICAgIChWb2lkRnVuYykgX2RidXNfc2VydmVyX3JlZl91bmxvY2tlZCwKKyAgICAoVm9pZEZ1bmMpIF9kYnVzX3NlcnZlcl91bnJlZl91bmxvY2tlZCwKKyAgICBmLT5zZXJ2ZXIsCisgICAgc2VydmVyX2xvY2ssCisgICAgc2VydmVyX3VubG9jayB9OworICBpbnQgaTsKKworICBpZiAoIWRidXNfc2VydmVyX3NldF9kYXRhIChmLT5zZXJ2ZXIsIHNlcnZlcl9zbG90LCBmLCBsYXN0X3VucmVmKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZm9yIChpID0gMDsgaSA8IE5fVEhSRUFEUzsgaSsrKQorICAgIHsKKyAgICAgIGlmICgoaSAlIDIpID09IDApCisgICAgICAgIGYtPnRocmVhZHNbaV0gPSBnX3RocmVhZF9uZXcgKE5VTEwsIHJlZl90aHJlYWQsICZwdWJsaWNfYXBpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZi0+dGhyZWFkc1tpXSA9IGdfdGhyZWFkX25ldyAoTlVMTCwgcmVmX3RocmVhZCwgJmludGVybmFsX2FwaSk7CisKKyAgICAgIGdfYXNzZXJ0IChmLT50aHJlYWRzW2ldICE9IE5VTEwpOworICAgIH0KKworICB3YWl0X2Zvcl9hbGxfdGhyZWFkcyAoZik7CisKKyAgZm9yIChpID0gMDsgaSA8IE5fVEhSRUFEUzsgaSsrKQorICAgIHsKKyAgICAgIGlmICgoaSAlIDIpID09IDApCisgICAgICAgIGYtPnRocmVhZHNbaV0gPSBnX3RocmVhZF9uZXcgKE5VTEwsIGN5Y2xlX3RocmVhZCwgJnB1YmxpY19hcGkpOworICAgICAgZWxzZQorICAgICAgICBmLT50aHJlYWRzW2ldID0gZ190aHJlYWRfbmV3IChOVUxMLCBjeWNsZV90aHJlYWQsICZpbnRlcm5hbF9hcGkpOworCisgICAgICBnX2Fzc2VydCAoZi0+dGhyZWFkc1tpXSAhPSBOVUxMKTsKKyAgICB9CisKKyAgd2FpdF9mb3JfYWxsX3RocmVhZHMgKGYpOworCisgIGZvciAoaSA9IDA7IGkgPCBOX1RIUkVBRFM7IGkrKykKKyAgICB7CisgICAgICBpZiAoKGkgJSAyKSA9PSAwKQorICAgICAgICBmLT50aHJlYWRzW2ldID0gZ190aHJlYWRfbmV3IChOVUxMLCB1bnJlZl90aHJlYWQsICZwdWJsaWNfYXBpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZi0+dGhyZWFkc1tpXSA9IGdfdGhyZWFkX25ldyAoTlVMTCwgdW5yZWZfdGhyZWFkLCAmaW50ZXJuYWxfYXBpKTsKKworICAgICAgZ19hc3NlcnQgKGYtPnRocmVhZHNbaV0gIT0gTlVMTCk7CisgICAgfQorCisgIHdhaXRfZm9yX2FsbF90aHJlYWRzIChmKTsKKworICAvKiBEZXN0cm95IHRoZSBzZXJ2ZXIuIFRoaXMgc2hvdWxkIGJlIHRoZSBsYXN0LXVucmVmLiAqLworICBnX2Fzc2VydCAoIWYtPmxhc3RfdW5yZWYpOworICBkYnVzX3NlcnZlcl9kaXNjb25uZWN0IChmLT5zZXJ2ZXIpOworICBkYnVzX3NlcnZlcl91bnJlZiAoZi0+c2VydmVyKTsKKyAgZi0+c2VydmVyID0gTlVMTDsKKyAgZ19hc3NlcnQgKGYtPmxhc3RfdW5yZWYpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9tZXNzYWdlIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9mb28iLCAiZm9vLmJhci5iYXoiLAorICAgICAgIkZvbyIpOworICBUaHJlYWQgcHVibGljX2FwaSA9IHsgbWVzc2FnZSwKKyAgICAoUmVmRnVuYykgZGJ1c19tZXNzYWdlX3JlZiwKKyAgICBOVUxMLAorICAgIChWb2lkRnVuYykgZGJ1c19tZXNzYWdlX3VucmVmLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMIH07CisgIGludCBpOworCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9kYXRhIChtZXNzYWdlLCBtZXNzYWdlX3Nsb3QsIGYsIGxhc3RfdW5yZWYpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBmb3IgKGkgPSAwOyBpIDwgTl9USFJFQURTOyBpKyspCisgICAgeworICAgICAgZi0+dGhyZWFkc1tpXSA9IGdfdGhyZWFkX25ldyAoTlVMTCwgcmVmX3RocmVhZCwgJnB1YmxpY19hcGkpOworICAgICAgZ19hc3NlcnQgKGYtPnRocmVhZHNbaV0gIT0gTlVMTCk7CisgICAgfQorCisgIHdhaXRfZm9yX2FsbF90aHJlYWRzIChmKTsKKworICBmb3IgKGkgPSAwOyBpIDwgTl9USFJFQURTOyBpKyspCisgICAgeworICAgICAgZi0+dGhyZWFkc1tpXSA9IGdfdGhyZWFkX25ldyAoTlVMTCwgY3ljbGVfdGhyZWFkLCAmcHVibGljX2FwaSk7CisgICAgICBnX2Fzc2VydCAoZi0+dGhyZWFkc1tpXSAhPSBOVUxMKTsKKyAgICB9CisKKyAgd2FpdF9mb3JfYWxsX3RocmVhZHMgKGYpOworCisgIGZvciAoaSA9IDA7IGkgPCBOX1RIUkVBRFM7IGkrKykKKyAgICB7CisgICAgICBmLT50aHJlYWRzW2ldID0gZ190aHJlYWRfbmV3IChOVUxMLCB1bnJlZl90aHJlYWQsICZwdWJsaWNfYXBpKTsKKyAgICAgIGdfYXNzZXJ0IChmLT50aHJlYWRzW2ldICE9IE5VTEwpOworICAgIH0KKworICB3YWl0X2Zvcl9hbGxfdGhyZWFkcyAoZik7CisKKyAgLyogRGVzdHJveSB0aGUgc2VydmVyLiBUaGlzIHNob3VsZCBiZSB0aGUgbGFzdC11bnJlZi4gKi8KKyAgZ19hc3NlcnQgKCFmLT5sYXN0X3VucmVmKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgZ19hc3NlcnQgKGYtPmxhc3RfdW5yZWYpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9wZW5kaW5nX2NhbGwgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBkYXRhKQoreworICBUaHJlYWQgcHVibGljX2FwaSA9IHsgTlVMTCwKKyAgICAoUmVmRnVuYykgZGJ1c19wZW5kaW5nX2NhbGxfcmVmLAorICAgIE5VTEwsCisgICAgKFZvaWRGdW5jKSBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCB9OworICBUaHJlYWQgaW50ZXJuYWxfYXBpID0geyBOVUxMLAorICAgIChSZWZGdW5jKSBfZGJ1c19wZW5kaW5nX2NhbGxfcmVmX3VubG9ja2VkLAorICAgIE5VTEwsCisgICAgKFZvaWRGdW5jKSBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiwKKyAgICBmLT5jb25uZWN0aW9uLAorICAgIChWb2lkRnVuYykgX2RidXNfY29ubmVjdGlvbl9sb2NrLAorICAgIChWb2lkRnVuYykgX2RidXNfY29ubmVjdGlvbl91bmxvY2sgfTsKKyAgLyogVGhpcyBvbmUgY2FuJ3QgYmUgdXNlZCB0byByZWYsIG9ubHkgdG8gY3ljbGUgb3IgdW5yZWYuICovCisgIFRocmVhZCB1bnJlZl9hbmRfdW5sb2NrX2FwaSA9IHsgTlVMTCwKKyAgICAoUmVmRnVuYykgX2RidXNfcGVuZGluZ19jYWxsX3JlZl91bmxvY2tlZCwKKyAgICBOVUxMLAorICAgIChWb2lkRnVuYykgX2RidXNfcGVuZGluZ19jYWxsX3VucmVmX2FuZF91bmxvY2ssCisgICAgZi0+Y29ubmVjdGlvbiwKKyAgICAoVm9pZEZ1bmMpIF9kYnVzX2Nvbm5lY3Rpb25fbG9jaywKKyAgICBOVUxMIH07CisgIGludCBpOworICBEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmdfY2FsbDsKKworICBfZGJ1c19jb25uZWN0aW9uX2xvY2sgKGYtPmNvbm5lY3Rpb24pOworICBwZW5kaW5nX2NhbGwgPSBfZGJ1c19wZW5kaW5nX2NhbGxfbmV3X3VubG9ja2VkIChmLT5jb25uZWN0aW9uLAorICAgICAgREJVU19USU1FT1VUX0lORklOSVRFLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHBlbmRpbmdfY2FsbCAhPSBOVUxMKTsKKyAgX2RidXNfY29ubmVjdGlvbl91bmxvY2sgKGYtPmNvbm5lY3Rpb24pOworCisgIHB1YmxpY19hcGkudGhpbmcgPSBwZW5kaW5nX2NhbGw7CisgIGludGVybmFsX2FwaS50aGluZyA9IHBlbmRpbmdfY2FsbDsKKyAgdW5yZWZfYW5kX3VubG9ja19hcGkudGhpbmcgPSBwZW5kaW5nX2NhbGw7CisKKyAgaWYgKCFkYnVzX3BlbmRpbmdfY2FsbF9zZXRfZGF0YSAocGVuZGluZ19jYWxsLCBwZW5kaW5nX2NhbGxfc2xvdCwgZiwKKyAgICAgICAgbGFzdF91bnJlZikpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGZvciAoaSA9IDA7IGkgPCBOX1RIUkVBRFM7IGkrKykKKyAgICB7CisgICAgICBpZiAoKGkgJSAyKSA9PSAwKQorICAgICAgICBmLT50aHJlYWRzW2ldID0gZ190aHJlYWRfbmV3IChOVUxMLCByZWZfdGhyZWFkLCAmcHVibGljX2FwaSk7CisgICAgICBlbHNlCisgICAgICAgIGYtPnRocmVhZHNbaV0gPSBnX3RocmVhZF9uZXcgKE5VTEwsIHJlZl90aHJlYWQsICZpbnRlcm5hbF9hcGkpOworCisgICAgICBnX2Fzc2VydCAoZi0+dGhyZWFkc1tpXSAhPSBOVUxMKTsKKyAgICB9CisKKyAgd2FpdF9mb3JfYWxsX3RocmVhZHMgKGYpOworCisgIGZvciAoaSA9IDA7IGkgPCBOX1RIUkVBRFM7IGkrKykKKyAgICB7CisgICAgICBzd2l0Y2ggKGkgJSAzKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZi0+dGhyZWFkc1tpXSA9IGdfdGhyZWFkX25ldyAoTlVMTCwgY3ljbGVfdGhyZWFkLCAmcHVibGljX2FwaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBmLT50aHJlYWRzW2ldID0gZ190aHJlYWRfbmV3IChOVUxMLCBjeWNsZV90aHJlYWQsICZpbnRlcm5hbF9hcGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGYtPnRocmVhZHNbaV0gPSBnX3RocmVhZF9uZXcgKE5VTEwsIGN5Y2xlX3RocmVhZCwKKyAgICAgICAgICAgICAgICAmdW5yZWZfYW5kX3VubG9ja19hcGkpOworICAgICAgICB9CisKKyAgICAgIGdfYXNzZXJ0IChmLT50aHJlYWRzW2ldICE9IE5VTEwpOworICAgIH0KKworICB3YWl0X2Zvcl9hbGxfdGhyZWFkcyAoZik7CisKKyAgZm9yIChpID0gMDsgaSA8IE5fVEhSRUFEUzsgaSsrKQorICAgIHsKKyAgICAgIHN3aXRjaCAoaSAlIDMpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBmLT50aHJlYWRzW2ldID0gZ190aHJlYWRfbmV3IChOVUxMLCB1bnJlZl90aHJlYWQsICZwdWJsaWNfYXBpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGYtPnRocmVhZHNbaV0gPSBnX3RocmVhZF9uZXcgKE5VTEwsIHVucmVmX3RocmVhZCwgJmludGVybmFsX2FwaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZi0+dGhyZWFkc1tpXSA9IGdfdGhyZWFkX25ldyAoTlVMTCwgdW5yZWZfdGhyZWFkLAorICAgICAgICAgICAgICAgICZ1bnJlZl9hbmRfdW5sb2NrX2FwaSk7CisgICAgICAgIH0KKworICAgICAgZ19hc3NlcnQgKGYtPnRocmVhZHNbaV0gIT0gTlVMTCk7CisgICAgfQorCisgIHdhaXRfZm9yX2FsbF90aHJlYWRzIChmKTsKKworICAvKiBEZXN0cm95IHRoZSBwZW5kaW5nIGNhbGwuIFRoaXMgc2hvdWxkIGJlIHRoZSBsYXN0LXVucmVmLiAqLworICBnX2Fzc2VydCAoIWYtPmxhc3RfdW5yZWYpOworICBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiAocGVuZGluZ19jYWxsKTsKKyAgZ19hc3NlcnQgKGYtPmxhc3RfdW5yZWYpOworfQorCitzdGF0aWMgdm9pZAordGVhcmRvd24gKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBkYXRhKQoreworICBpZiAoZi0+c2VydmVyX2Nvbm5lY3Rpb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPnNlcnZlcl9jb25uZWN0aW9uKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZi0+c2VydmVyX2Nvbm5lY3Rpb24pOworICAgIH0KKworICBpZiAoZi0+Y29ubmVjdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+Y29ubmVjdGlvbik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPmNvbm5lY3Rpb24pOworICAgIH0KKworICBpZiAoZi0+c2VydmVyICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXJ2ZXJfZGlzY29ubmVjdCAoZi0+c2VydmVyKTsKKyAgICAgIGRidXNfc2VydmVyX3VucmVmIChmLT5zZXJ2ZXIpOworICAgIH0KKworICBkYnVzX2Nvbm5lY3Rpb25fZnJlZV9kYXRhX3Nsb3QgKCZjb25uZWN0aW9uX3Nsb3QpOworICBkYnVzX3NlcnZlcl9mcmVlX2RhdGFfc2xvdCAoJnNlcnZlcl9zbG90KTsKKyAgZGJ1c19tZXNzYWdlX2ZyZWVfZGF0YV9zbG90ICgmbWVzc2FnZV9zbG90KTsKKyAgZGJ1c19wZW5kaW5nX2NhbGxfZnJlZV9kYXRhX3Nsb3QgKCZwZW5kaW5nX2NhbGxfc2xvdCk7CisKKyAgX2RidXNfbG9vcF91bnJlZiAoZi0+bG9vcCk7CisgIGRidXNfZXJyb3JfZnJlZSAoJmYtPmUpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLAorICAgIGNoYXIgKiphcmd2KQoreworICAvKiBJbiBHTGliID49IDIuMjQsIDwgMi4zMSB0aGlzIGFjdHMgbGlrZSBnX3RocmVhZF9pbml0KCkgYnV0IGF2b2lkcworICAgKiB0aGUgZGVwcmVjYXRpb24gb2YgdGhhdCBmdW5jdGlvbi4gSW4gR0xpYiA+PSAyLjMyIHRoaXMgaXMgbm90CisgICAqIG5lY2Vzc2FyeSBhdCBhbGwuCisgICAqLworICBnX3R5cGVfaW5pdCAoKTsKKworICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKyAgZ190ZXN0X2J1Z19iYXNlICgiaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Iik7CisKKyAgZ190ZXN0X2FkZCAoIi9yZWZzL2Nvbm5lY3Rpb24iLCBGaXh0dXJlLCBOVUxMLCBzZXR1cF9jb25uZWN0aW9uLAorICAgICAgdGVzdF9jb25uZWN0aW9uLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvcmVmcy9tZXNzYWdlIiwgRml4dHVyZSwgTlVMTCwgc2V0dXAsCisgICAgICB0ZXN0X21lc3NhZ2UsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9yZWZzL3BlbmRpbmctY2FsbCIsIEZpeHR1cmUsIE5VTEwsIHNldHVwX2Nvbm5lY3Rpb24sCisgICAgICB0ZXN0X3BlbmRpbmdfY2FsbCwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL3JlZnMvc2VydmVyIiwgRml4dHVyZSwgTlVMTCwgc2V0dXAsCisgICAgICB0ZXN0X3NlcnZlciwgdGVhcmRvd24pOworCisgIHJldHVybiBnX3Rlc3RfcnVuICgpOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L2ludGVybmFscy9zeXNsb2cuYyBiL2RidXMvdGVzdC9pbnRlcm5hbHMvc3lzbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY2YjdjMgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9pbnRlcm5hbHMvc3lzbG9nLmMKQEAgLTAsMCArMSwxMDAgQEAKKy8qIE1hbnVhbCByZWdyZXNzaW9uIHRlc3QgZm9yIHN5c2xvZyBzdXBwb3J0CisgKgorICogQXV0aG9yOiBTaW1vbiBNY1ZpdHRpZSA8c2ltb24ubWN2aXR0aWVAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IMKpIDIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyAqICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCisgKiBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorICogcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGdsaWIuaD4KKworI2RlZmluZSBEQlVTX0NPTVBJTEFUSU9OICAgIC8qIHRoaXMgdGVzdCB1c2VzIGxpYmRidXMtaW50ZXJuYWwgKi8KKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGR1bW15OworfSBGaXh0dXJlOworCitzdGF0aWMgdm9pZAorc2V0dXAgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBkYXRhKQoreworfQorCisvKiBob3BlZnVsbHkgY2xlYXIgZW5vdWdoIHRoYXQgcGVvcGxlIGRvbid0IHRoaW5rIHRoZXNlIG1lc3NhZ2VzIGluIHN5c2xvZworICogYXJlIGEgYnVnICovCisjZGVmaW5lIE1FU1NBR0UgInJlZ3Jlc3Npb24gdGVzdCBmb3IgX2RidXNfc3lzdGVtX2xvZygpOiAiCisKK3N0YXRpYyB2b2lkCit0ZXN0X3N5c2xvZyAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGRhdGEpCit7CisgIGlmIChnX3Rlc3RfdHJhcF9mb3JrICgwLCAwKSkKKyAgICB7CisgICAgICBfZGJ1c19pbml0X3N5c3RlbV9sb2cgKCk7CisgICAgICBfZGJ1c19zeXN0ZW1fbG9nIChEQlVTX1NZU1RFTV9MT0dfRkFUQUwsIE1FU1NBR0UgIiVkIiwgMjMpOworICAgICAgLyogc2hvdWxkIG5vdCBiZSByZWFjaGVkOiBleGl0IDAgc28gdGhlIGFzc2VydGlvbiBpbiB0aGUgbWFpbiBwcm9jZXNzCisgICAgICAgKiB3aWxsIGZhaWwgKi8KKyAgICAgIGV4aXQgKDApOworICAgIH0KKworICBnX3Rlc3RfdHJhcF9hc3NlcnRfZmFpbGVkICgpOworICBnX3Rlc3RfdHJhcF9hc3NlcnRfc3RkZXJyICgiKiIgTUVTU0FHRSAiMjNcbioiKTsKKworICBpZiAoZ190ZXN0X3RyYXBfZm9yayAoMCwgMCkpCisgICAgeworICAgICAgX2RidXNfaW5pdF9zeXN0ZW1fbG9nICgpOworICAgICAgX2RidXNfc3lzdGVtX2xvZyAoREJVU19TWVNURU1fTE9HX0lORk8sIE1FU1NBR0UgIiVkIiwgNDIpOworICAgICAgX2RidXNfc3lzdGVtX2xvZyAoREJVU19TWVNURU1fTE9HX1NFQ1VSSVRZLCBNRVNTQUdFICIlZCIsIDY2Nik7CisgICAgICBleGl0ICgwKTsKKyAgICB9CisKKyAgZ190ZXN0X3RyYXBfYXNzZXJ0X3Bhc3NlZCAoKTsKKyAgZ190ZXN0X3RyYXBfYXNzZXJ0X3N0ZGVyciAoIioiIE1FU1NBR0UgIjQyXG4qIiBNRVNTQUdFICI2NjZcbioiKTsKKworICAvKiBtYW51YWwgdGVzdCAodGhpcyBpcyB0aGUgYmVzdCB3ZSBjYW4gZG8gb24gV2luZG93cykgKi8KKyAgX2RidXNfaW5pdF9zeXN0ZW1fbG9nICgpOworICBfZGJ1c19zeXN0ZW1fbG9nIChEQlVTX1NZU1RFTV9MT0dfSU5GTywgTUVTU0FHRSAiJWQiLCA0Mik7CisgIF9kYnVzX3N5c3RlbV9sb2cgKERCVVNfU1lTVEVNX0xPR19TRUNVUklUWSwgTUVTU0FHRSAiJWQiLCA2NjYpOworfQorCitzdGF0aWMgdm9pZAordGVhcmRvd24gKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBkYXRhKQoreworfQorCitpbnQKK21haW4gKGludCBhcmdjLAorICAgIGNoYXIgKiphcmd2KQoreworICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKyAgZ190ZXN0X2J1Z19iYXNlICgiaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Iik7CisKKyAgZ190ZXN0X2FkZCAoIi9zeXNsb2ciLCBGaXh0dXJlLCBOVUxMLCBzZXR1cCwgdGVzdF9zeXNsb2csIHRlYXJkb3duKTsKKworICByZXR1cm4gZ190ZXN0X3J1biAoKTsKK30KZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9sb29wYmFjay5jIGIvZGJ1cy90ZXN0L2xvb3BiYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBkNjljOAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9sb29wYmFjay5jCkBAIC0wLDAgKzEsMjExIEBACisvKiBTaW1wbGUgc2FuaXR5LWNoZWNrIGZvciBsb29wYmFjayB0aHJvdWdoIFRDUCBhbmQgVW5peCBzb2NrZXRzLgorICoKKyAqIEF1dGhvcjogU2ltb24gTWNWaXR0aWUgPHNpbW9uLm1jdml0dGllQGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCDCqSAyMDEwLTIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyAqICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCisgKiBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorICogcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZ2xpYi1sb3dsZXZlbC5oPgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgREJ1c0Vycm9yIGU7CisKKyAgICBEQnVzU2VydmVyICpzZXJ2ZXI7CisgICAgREJ1c0Nvbm5lY3Rpb24gKnNlcnZlcl9jb25uOworICAgIC8qIHF1ZXVlIG9mIERCdXNNZXNzYWdlICovCisgICAgR1F1ZXVlIHNlcnZlcl9tZXNzYWdlczsKKworICAgIERCdXNDb25uZWN0aW9uICpjbGllbnRfY29ubjsKK30gRml4dHVyZTsKKworc3RhdGljIHZvaWQKK2Fzc2VydF9ub19lcnJvciAoY29uc3QgREJ1c0Vycm9yICplKQoreworICBpZiAoR19VTkxJS0VMWSAoZGJ1c19lcnJvcl9pc19zZXQgKGUpKSkKKyAgICBnX2Vycm9yICgiZXhwZWN0ZWQgc3VjY2VzcyBidXQgZ290IGVycm9yOiAlczogJXMiLCBlLT5uYW1lLCBlLT5tZXNzYWdlKTsKK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitzZXJ2ZXJfbWVzc2FnZV9jYiAoREJ1c0Nvbm5lY3Rpb24gKnNlcnZlcl9jb25uLAorICAgIERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgIHZvaWQgKmRhdGEpCit7CisgIEZpeHR1cmUgKmYgPSBkYXRhOworCisgIGdfYXNzZXJ0IChzZXJ2ZXJfY29ubiA9PSBmLT5zZXJ2ZXJfY29ubik7CisgIGdfcXVldWVfcHVzaF90YWlsICgmZi0+c2VydmVyX21lc3NhZ2VzLCBkYnVzX21lc3NhZ2VfcmVmIChtZXNzYWdlKSk7CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQKK25ld19jb25uX2NiIChEQnVzU2VydmVyICpzZXJ2ZXIsCisgICAgREJ1c0Nvbm5lY3Rpb24gKnNlcnZlcl9jb25uLAorICAgIHZvaWQgKmRhdGEpCit7CisgIEZpeHR1cmUgKmYgPSBkYXRhOworICBkYnVzX2Jvb2xfdCBoYXZlX21lbTsKKworICBnX2Fzc2VydCAoZi0+c2VydmVyX2Nvbm4gPT0gTlVMTCk7CisgIGYtPnNlcnZlcl9jb25uID0gZGJ1c19jb25uZWN0aW9uX3JlZiAoc2VydmVyX2Nvbm4pOworICBkYnVzX2Nvbm5lY3Rpb25fc2V0dXBfd2l0aF9nX21haW4gKHNlcnZlcl9jb25uLCBOVUxMKTsKKworICBoYXZlX21lbSA9IGRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChzZXJ2ZXJfY29ubiwKKyAgICAgIHNlcnZlcl9tZXNzYWdlX2NiLCBmLCBOVUxMKTsKKyAgZ19hc3NlcnQgKGhhdmVfbWVtKTsKK30KKworc3RhdGljIHZvaWQKK3NldHVwIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgYWRkcikKK3sKKyAgZGJ1c19lcnJvcl9pbml0ICgmZi0+ZSk7CisgIGdfcXVldWVfaW5pdCAoJmYtPnNlcnZlcl9tZXNzYWdlcyk7CisKKyAgZi0+c2VydmVyID0gZGJ1c19zZXJ2ZXJfbGlzdGVuIChhZGRyLCAmZi0+ZSk7CisgIGFzc2VydF9ub19lcnJvciAoJmYtPmUpOworICBnX2Fzc2VydCAoZi0+c2VydmVyICE9IE5VTEwpOworCisgIGRidXNfc2VydmVyX3NldF9uZXdfY29ubmVjdGlvbl9mdW5jdGlvbiAoZi0+c2VydmVyLAorICAgICAgbmV3X2Nvbm5fY2IsIGYsIE5VTEwpOworICBkYnVzX3NlcnZlcl9zZXR1cF93aXRoX2dfbWFpbiAoZi0+c2VydmVyLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY29ubmVjdCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGFkZHIgR19HTlVDX1VOVVNFRCkKK3sKKyAgZ19hc3NlcnQgKGYtPnNlcnZlcl9jb25uID09IE5VTEwpOworCisgIGYtPmNsaWVudF9jb25uID0gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAoCisgICAgICBkYnVzX3NlcnZlcl9nZXRfYWRkcmVzcyAoZi0+c2VydmVyKSwgJmYtPmUpOworICBhc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnQgKGYtPmNsaWVudF9jb25uICE9IE5VTEwpOworICBkYnVzX2Nvbm5lY3Rpb25fc2V0dXBfd2l0aF9nX21haW4gKGYtPmNsaWVudF9jb25uLCBOVUxMKTsKKworICB3aGlsZSAoZi0+c2VydmVyX2Nvbm4gPT0gTlVMTCkKKyAgICB7CisgICAgICBnX3ByaW50ICgiLiIpOworICAgICAgZ19tYWluX2NvbnRleHRfaXRlcmF0aW9uIChOVUxMLCBUUlVFKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X21lc3NhZ2UgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBhZGRyKQoreworICBkYnVzX2Jvb2xfdCBoYXZlX21lbTsKKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisgIERCdXNNZXNzYWdlICpvdXRnb2luZywgKmluY29taW5nOworCisgIHRlc3RfY29ubmVjdCAoZiwgYWRkcik7CisKKyAgb3V0Z29pbmcgPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9jb20vZXhhbXBsZS9IZWxsbyIsCisgICAgICAiY29tLmV4YW1wbGUuSGVsbG8iLCAiR3JlZXRpbmciKTsKKyAgZ19hc3NlcnQgKG91dGdvaW5nICE9IE5VTEwpOworCisgIGhhdmVfbWVtID0gZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPmNsaWVudF9jb25uLCBvdXRnb2luZywgJnNlcmlhbCk7CisgIGdfYXNzZXJ0IChoYXZlX21lbSk7CisgIGdfYXNzZXJ0IChzZXJpYWwgIT0gMCk7CisKKyAgd2hpbGUgKGdfcXVldWVfaXNfZW1wdHkgKCZmLT5zZXJ2ZXJfbWVzc2FnZXMpKQorICAgIHsKKyAgICAgIGdfcHJpbnQgKCIuIik7CisgICAgICBnX21haW5fY29udGV4dF9pdGVyYXRpb24gKE5VTEwsIFRSVUUpOworICAgIH0KKworICBnX2Fzc2VydF9jbXB1aW50IChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5zZXJ2ZXJfbWVzc2FnZXMpLCA9PSwgMSk7CisKKyAgaW5jb21pbmcgPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+c2VydmVyX21lc3NhZ2VzKTsKKworICBnX2Fzc2VydCAoIWRidXNfbWVzc2FnZV9jb250YWluc191bml4X2ZkcyAoaW5jb21pbmcpKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChpbmNvbWluZyksID09LCBOVUxMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKGluY29taW5nKSwgPT0sIE5VTEwpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChpbmNvbWluZyksID09LAorICAgICAgImNvbS5leGFtcGxlLkhlbGxvIik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKGluY29taW5nKSwgPT0sICJHcmVldGluZyIpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChpbmNvbWluZyksID09LCBOVUxMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAoaW5jb21pbmcpLCA9PSwgIiIpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfcGF0aCAoaW5jb21pbmcpLCA9PSwgIi9jb20vZXhhbXBsZS9IZWxsbyIpOworICBnX2Fzc2VydF9jbXB1aW50IChkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAoaW5jb21pbmcpLCA9PSwgc2VyaWFsKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKGluY29taW5nKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG91dGdvaW5nKTsKK30KKworc3RhdGljIHZvaWQKK3RlYXJkb3duIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgYWRkciBHX0dOVUNfVU5VU0VEKQoreworICBpZiAoZi0+Y2xpZW50X2Nvbm4gIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPmNsaWVudF9jb25uKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZi0+Y2xpZW50X2Nvbm4pOworICAgICAgZi0+Y2xpZW50X2Nvbm4gPSBOVUxMOworICAgIH0KKworICBpZiAoZi0+c2VydmVyX2Nvbm4gIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPnNlcnZlcl9jb25uKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZi0+c2VydmVyX2Nvbm4pOworICAgICAgZi0+c2VydmVyX2Nvbm4gPSBOVUxMOworICAgIH0KKworICBpZiAoZi0+c2VydmVyICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXJ2ZXJfZGlzY29ubmVjdCAoZi0+c2VydmVyKTsKKyAgICAgIGRidXNfc2VydmVyX3VucmVmIChmLT5zZXJ2ZXIpOworICAgICAgZi0+c2VydmVyID0gTlVMTDsKKyAgICB9Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsCisgICAgY2hhciAqKmFyZ3YpCit7CisgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOworCisgIGdfdGVzdF9hZGQgKCIvY29ubmVjdC90Y3AiLCBGaXh0dXJlLCAidGNwOmhvc3Q9MTI3LjAuMC4xIiwgc2V0dXAsCisgICAgICB0ZXN0X2Nvbm5lY3QsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9tZXNzYWdlL3RjcCIsIEZpeHR1cmUsICJ0Y3A6aG9zdD0xMjcuMC4wLjEiLCBzZXR1cCwKKyAgICAgIHRlc3RfbWVzc2FnZSwgdGVhcmRvd24pOworCisgIGdfdGVzdF9hZGQgKCIvY29ubmVjdC9ub25jZS10Y3AiLCBGaXh0dXJlLCAibm9uY2UtdGNwOmhvc3Q9MTI3LjAuMC4xIiwgc2V0dXAsCisgICAgICB0ZXN0X2Nvbm5lY3QsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9tZXNzYWdlL25vbmNlLXRjcCIsIEZpeHR1cmUsICJub25jZS10Y3A6aG9zdD0xMjcuMC4wLjEiLCBzZXR1cCwKKyAgICAgIHRlc3RfbWVzc2FnZSwgdGVhcmRvd24pOworCisjaWZkZWYgREJVU19VTklYCisgIGdfdGVzdF9hZGQgKCIvY29ubmVjdC91bml4IiwgRml4dHVyZSwgInVuaXg6dG1wZGlyPS90bXAiLCBzZXR1cCwKKyAgICAgIHRlc3RfY29ubmVjdCwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL21lc3NhZ2UvdW5peCIsIEZpeHR1cmUsICJ1bml4OnRtcGRpcj0vdG1wIiwgc2V0dXAsCisgICAgICB0ZXN0X21lc3NhZ2UsIHRlYXJkb3duKTsKKyNlbmRpZgorCisgIHJldHVybiBnX3Rlc3RfcnVuICgpOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L21hcnNoYWwuYyBiL2RidXMvdGVzdC9tYXJzaGFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlhYzdlMwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9tYXJzaGFsLmMKQEAgLTAsMCArMSwyNTcgQEAKKy8qIFNpbXBsZSBzYW5pdHktY2hlY2sgZm9yIEQtQnVzIG1lc3NhZ2Ugc2VyaWFsaXphdGlvbi4KKyAqCisgKiBBdXRob3I6IFNpbW9uIE1jVml0dGllIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CisgKiBDb3B5cmlnaHQgwqkgMjAxMC0yMDExIE5va2lhIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzCisgKiAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAorICogaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyAqIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWdsaWItbG93bGV2ZWwuaD4KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIERCdXNFcnJvciBlOworfSBGaXh0dXJlOworCitzdGF0aWMgdm9pZAorYXNzZXJ0X25vX2Vycm9yIChjb25zdCBEQnVzRXJyb3IgKmUpCit7CisgIGlmIChHX1VOTElLRUxZIChkYnVzX2Vycm9yX2lzX3NldCAoZSkpKQorICAgIGdfZXJyb3IgKCJleHBlY3RlZCBzdWNjZXNzIGJ1dCBnb3QgZXJyb3I6ICVzOiAlcyIsIGUtPm5hbWUsIGUtPm1lc3NhZ2UpOworfQorCitzdGF0aWMgdm9pZAorc2V0dXAgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBhcmcgR19HTlVDX1VOVVNFRCkKK3sKKyAgZGJ1c19lcnJvcl9pbml0ICgmZi0+ZSk7Cit9CisKKy8qIHRoaXMgaXMgbWVhbnQgdG8gYmUgb2J2aW91c2x5IGNvcnJlY3QsIG5vdCBlZmZpY2llbnQhICovCitzdGF0aWMgZ3VpbnQzMgorZ2V0X3VpbnQzMiAoY29uc3QgZ2NoYXIgKmJsb2IsCisgICAgZ3NpemUgb2Zmc2V0LAorICAgIGNoYXIgZW5kaWFuKQoreworICBpZiAoZW5kaWFuID09ICdsJykKKyAgICB7CisgICAgICByZXR1cm4KKyAgICAgICAgYmxvYltvZmZzZXRdIHwKKyAgICAgICAgKGJsb2Jbb2Zmc2V0ICsgMV0gPDwgOCkgfAorICAgICAgICAoYmxvYltvZmZzZXQgKyAyXSA8PCAxNikgfAorICAgICAgICAoYmxvYltvZmZzZXQgKyAzXSA8PCAyNCk7CisgICAgfQorICBlbHNlIGlmIChlbmRpYW4gPT0gJ0InKQorICAgIHsKKyAgICAgIHJldHVybgorICAgICAgICAoYmxvYltvZmZzZXRdIDw8IDI0KSB8CisgICAgICAgIChibG9iW29mZnNldCArIDFdIDw8IDE2KSB8CisgICAgICAgIChibG9iW29mZnNldCArIDJdIDw8IDgpIHwKKyAgICAgICAgYmxvYltvZmZzZXQgKyAzXTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICB9Cit9CisKKyNkZWZpbmUgQkxPQl9MRU5HVEggKHNpemVvZiAobGVfYmxvYikgLSAxKQorI2RlZmluZSBPRkZTRVRfQk9EWV9MRU5HVEggKDQpCisjZGVmaW5lIE9GRlNFVF9TRVJJQUwgKDgpCisKK2NvbnN0IGdjaGFyIGxlX2Jsb2JbXSA9CisgICAgLyogYnl0ZSAwICovCisgICAgLyogeXl5eXV1IGZpeGVkIGhlYWRlcnMgKi8KKyAgICAibCIgICAgICAgICAgICAgICAgICAgICAvKiBsaXR0bGUtZW5kaWFuICovCisgICAgIlwyIiAgICAgICAgICAgICAgICAgICAgLyogcmVwbHkgKHdoaWNoIGlzIHRoZSBzaW1wbGVzdCBtZXNzYWdlKSAqLworICAgICJcMiIgICAgICAgICAgICAgICAgICAgIC8qIG5vIGF1dG8tc3RhcnRpbmcgKi8KKyAgICAiXDEiICAgICAgICAgICAgICAgICAgICAvKiBELUJ1cyB2ZXJzaW9uID0gMSAqLworICAgIC8qIGJ5dGUgNCAqLworICAgICJcNFwwXDBcMCIgICAgICAgICAgICAgIC8qIGJ5dGVzIGluIGJvZHkgPSA0ICovCisgICAgLyogYnl0ZSA4ICovCisgICAgIlx4NzhceDU2XHgzNFx4MTIiICAgICAgLyogc2VyaWFsIG51bWJlciA9IDB4MTIzNDU2NzggKi8KKyAgICAvKiBieXRlIDEyICovCisgICAgLyogYSh1dikgdmFyaWFibGUgaGVhZGVycyBzdGFydCBoZXJlICovCisgICAgIlx4MGZcMFwwXDAiICAgICAgICAgICAgLyogYnl0ZXMgaW4gYXJyYXkgb2YgdmFyaWFibGUgaGVhZGVycyA9IDE1ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGFkIHRvIDgtYnl0ZSBib3VuZGFyeSA9IG5vdGhpbmcgKi8KKyAgICAvKiBieXRlIDE2ICovCisgICAgIlw1IiAgICAgICAgICAgICAgICAgICAgLyogaW4gcmVwbHkgdG86ICovCisgICAgICAgICJcMXVcMCIgICAgICAgICAgICAgLyogdmFyaWFudCBzaWduYXR1cmUgPSB1ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGFkIHRvIDQtYnl0ZSBib3VuZGFyeSA9IG5vdGhpbmcgKi8KKyAgICAgICAgIlx4MTJceGVmXHhjZFx4YWIiICAvKiAweGFiY2RlZjEyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGFkIHRvIDgtYnl0ZSBib3VuZGFyeSA9IG5vdGhpbmcgKi8KKyAgICAvKiBieXRlIDI0ICovCisgICAgIlx4MDgiICAgICAgICAgICAgICAgICAgLyogc2lnbmF0dXJlOiAqLworICAgICAgICAiXDFnXDAiICAgICAgICAgICAgIC8qIHZhcmlhbnQgc2lnbmF0dXJlID0gZyAqLworICAgICAgICAiXDF1XDAiICAgICAgICAgICAgIC8qIDEgYnl0ZSwgdSwgTlVMIChubyBhbGlnbm1lbnQgbmVlZGVkKSAqLworICAgICAgICAiXDAiICAgICAgICAgICAgICAgIC8qIHBhZCB0byA4LWJ5dGUgYm91bmRhcnkgZm9yIGJvZHkgKi8KKyAgICAvKiBib2R5OyBieXRlIDMyICovCisgICAgIlx4ZWZceGJlXHhhZFx4ZGUiICAgICAgLyogMHhkZWFkYmVlZiAqLworICAgIDsKKworY29uc3QgZ2NoYXIgYmVfYmxvYltdID0KKyAgICAvKiBieXRlIDAgKi8KKyAgICAvKiB5eXl5dXUgZml4ZWQgaGVhZGVycyAqLworICAgICJCIiAgICAgICAgICAgICAgICAgICAgIC8qIGJpZy1lbmRpYW4gKi8KKyAgICAiXDIiICAgICAgICAgICAgICAgICAgICAvKiByZXBseSAod2hpY2ggaXMgdGhlIHNpbXBsZXN0IG1lc3NhZ2UpICovCisgICAgIlwyIiAgICAgICAgICAgICAgICAgICAgLyogbm8gYXV0by1zdGFydGluZyAqLworICAgICJcMSIgICAgICAgICAgICAgICAgICAgIC8qIEQtQnVzIHZlcnNpb24gPSAxICovCisgICAgLyogYnl0ZSA0ICovCisgICAgIlwwXDBcMFw0IiAgICAgICAgICAgICAgLyogYnl0ZXMgaW4gYm9keSA9IDQgKi8KKyAgICAvKiBieXRlIDggKi8KKyAgICAiXHgxMlx4MzRceDU2XHg3OCIgICAgICAvKiBzZXJpYWwgbnVtYmVyID0gMHgxMjM0NTY3OCAqLworICAgIC8qIGJ5dGUgMTIgKi8KKyAgICAvKiBhKHV2KSB2YXJpYWJsZSBoZWFkZXJzIHN0YXJ0IGhlcmUgKi8KKyAgICAiXDBcMFwwXHgwZiIgICAgICAgICAgICAvKiBieXRlcyBpbiBhcnJheSBvZiB2YXJpYWJsZSBoZWFkZXJzID0gMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwYWQgdG8gOC1ieXRlIGJvdW5kYXJ5ID0gbm90aGluZyAqLworICAgIC8qIGJ5dGUgMTYgKi8KKyAgICAiXDUiICAgICAgICAgICAgICAgICAgICAvKiBpbiByZXBseSB0bzogKi8KKyAgICAgICAgIlwxdVwwIiAgICAgICAgICAgICAvKiB2YXJpYW50IHNpZ25hdHVyZSA9IHUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwYWQgdG8gNC1ieXRlIGJvdW5kYXJ5ID0gbm90aGluZyAqLworICAgICAgICAiXHhhYlx4Y2RceGVmXHgxMiIgIC8qIDB4YWJjZGVmMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwYWQgdG8gOC1ieXRlIGJvdW5kYXJ5ID0gbm90aGluZyAqLworICAgIC8qIGJ5dGUgMjQgKi8KKyAgICAiXHgwOCIgICAgICAgICAgICAgICAgICAvKiBzaWduYXR1cmU6ICovCisgICAgICAgICJcMWdcMCIgICAgICAgICAgICAgLyogdmFyaWFudCBzaWduYXR1cmUgPSBnICovCisgICAgICAgICJcMXVcMCIgICAgICAgICAgICAgLyogMSBieXRlLCB1LCBOVUwgKG5vIGFsaWdubWVudCBuZWVkZWQpICovCisgICAgICAgICJcMCIgICAgICAgICAgICAgICAgLyogcGFkIHRvIDgtYnl0ZSBib3VuZGFyeSBmb3IgYm9keSAqLworICAgIC8qIGJvZHk7IGJ5dGUgMzIgKi8KKyAgICAiXHhkZVx4YWRceGJlXHhlZiIgICAgICAvKiAweGRlYWRiZWVmICovCisgICAgOworCitzdGF0aWMgdm9pZAordGVzdF9lbmRpYW4gKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBhcmcpCit7CisgIGNvbnN0IGdjaGFyICpibG9iID0gYXJnOworICBjaGFyICpvdXRwdXQ7CisgIERCdXNNZXNzYWdlICptOworICBpbnQgbGVuOworICBkYnVzX3VpbnQzMl90IHU7CisgIGRidXNfYm9vbF90IG9rOworCisgIGdfYXNzZXJ0X2NtcHVpbnQgKChndWludCkgc2l6ZW9mIChsZV9ibG9iKSwgPT0sIChndWludCkgc2l6ZW9mIChiZV9ibG9iKSk7CisKKyAgZ19hc3NlcnRfY21wdWludCAoZ2V0X3VpbnQzMiAoYmxvYiwgT0ZGU0VUX0JPRFlfTEVOR1RILCBibG9iWzBdKSwgPT0sIDQpOworICBnX2Fzc2VydF9jbXB1aW50IChnZXRfdWludDMyIChibG9iLCBPRkZTRVRfU0VSSUFMLCBibG9iWzBdKSwgPT0sCisgICAgICAweDEyMzQ1Njc4dSk7CisKKyAgbGVuID0gZGJ1c19tZXNzYWdlX2RlbWFyc2hhbF9ieXRlc19uZWVkZWQgKGJsb2IsIHNpemVvZiAobGVfYmxvYikpOworICAvKiBldmVyeXRoaW5nIGluIHRoZSBzdHJpbmcgZXhjZXB0IHRoZSBpbXBsaWNpdCAiXDAiIGF0IHRoZSBlbmQgaXMgcGFydCBvZgorICAgKiB0aGUgbWVzc2FnZSAqLworICBnX2Fzc2VydF9jbXBpbnQgKGxlbiwgPT0sIEJMT0JfTEVOR1RIKTsKKworICBtID0gZGJ1c19tZXNzYWdlX2RlbWFyc2hhbCAoYmxvYiwgc2l6ZW9mIChsZV9ibG9iKSwgJmYtPmUpOworICBhc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnQgKG0gIT0gTlVMTCk7CisKKyAgZ19hc3NlcnRfY21wdWludCAoZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKG0pLCA9PSwgMHgxMjM0NTY3OHUpOworICBnX2Fzc2VydF9jbXB1aW50IChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobSksID09LCAweGFiY2RlZjEydSk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG0pLCA9PSwgInUiKTsKKworICAvKiBJbXBsZW1lbnRhdGlvbiBkZXRhaWw6IGFwcGVuZGluZyB0byB0aGUgbWVzc2FnZSByZXN1bHRzIGluIGl0IGJlaW5nCisgICAqIGJ5dGVzd2FwcGVkIGludG8gY29tcGlsZXIgYnl0ZSBvcmRlciwgd2hpY2ggZXhwb3NlZCBhIGJ1ZyBpbiBsaWJkYnVzLAorICAgKiBmZC5vICMzODEyMC4gKElmIHRoYXQgY2hhbmdlcywgdGhpcyB0ZXN0IG1pZ2h0IG5vdCBleGVyY2lzZSB0aGF0CisgICAqIHBhcnRpY3VsYXIgYnVnIGJ1dCB3aWxsIHN0aWxsIGJlIHZhbGlkLikgKi8KKyAgdSA9IDB4ZGVjYWZiYWR1OworICBvayA9IGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobSwKKyAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZ1LAorICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworICBnX2Fzc2VydCAob2spOworCisgIGRidXNfbWVzc2FnZV9tYXJzaGFsIChtLCAmb3V0cHV0LCAmbGVuKTsKKworICBnX2Fzc2VydCAob3V0cHV0WzBdID09ICdsJyB8fCBvdXRwdXRbMF0gPT0gJ0InKTsKKyAgLyogdGhlIHNpbmdsZS1ieXRlIGZpZWxkcyBhcmUgdW5hZmZlY3RlZCwgZXZlbiBpZiB0aGUgZW5kaWFubmVzcyB3YXMKKyAgICogc3dhcHBlZCAqLworICBnX2Fzc2VydF9jbXBpbnQgKG91dHB1dFsxXSwgPT0sIGJsb2JbMV0pOworICBnX2Fzc2VydF9jbXBpbnQgKG91dHB1dFsyXSwgPT0sIGJsb2JbMl0pOworICBnX2Fzc2VydF9jbXBpbnQgKG91dHB1dFszXSwgPT0sIGJsb2JbM10pOworICAvKiB0aGUgbGVuZ3RoIGFuZCBzZXJpYWwgYXJlIGluIHRoZSBuZXcgZW5kaWFubmVzcywgdGhlIGxlbmd0aCBoYXMgZXhwYW5kZWQKKyAgICogdG8gOCwgYW5kIHRoZSBzZXJpYWwgaXMgY29ycmVjdCAqLworICBnX2Fzc2VydF9jbXB1aW50IChnZXRfdWludDMyIChvdXRwdXQsIE9GRlNFVF9CT0RZX0xFTkdUSCwgb3V0cHV0WzBdKSwgPT0sIDgpOworICBnX2Fzc2VydF9jbXB1aW50IChnZXRfdWludDMyIChvdXRwdXQsIE9GRlNFVF9TRVJJQUwsIG91dHB1dFswXSksID09LAorICAgICAgMHgxMjM0NTY3OHUpOworICAvKiB0aGUgc2Vjb25kICJ1IiBpbiB0aGUgc2lnbmF0dXJlIHJlcGxhY2VkIGEgcGFkZGluZyBieXRlLCBzbyBvbmx5CisgICAqIHRoZSBsZW5ndGggb2YgdGhlIGJvZHkgY2hhbmdlZCAqLworICBnX2Fzc2VydF9jbXBpbnQgKGxlbiwgPT0sIEJMT0JfTEVOR1RIICsgNCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X25lZWRlZCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGFyZykKK3sKKyAgY29uc3QgZ2NoYXIgKmJsb2IgPSBhcmc7CisKKyAgLyogV2UgbmVlZCBhdCBsZWFzdCAxNiBieXRlcyB0byBrbm93IGhvdyBsb25nIHRoZSBtZXNzYWdlIGlzIC0gdGhhdCdzIGp1c3QKKyAgICogYSBmYWN0IG9mIHRoZSBELUJ1cyBwcm90b2NvbC4gKi8KKyAgZ19hc3NlcnRfY21waW50ICgKKyAgICAgIGRidXNfbWVzc2FnZV9kZW1hcnNoYWxfYnl0ZXNfbmVlZGVkIChibG9iLCAwKSwgPT0sIDApOworICBnX2Fzc2VydF9jbXBpbnQgKAorICAgICAgZGJ1c19tZXNzYWdlX2RlbWFyc2hhbF9ieXRlc19uZWVkZWQgKGJsb2IsIDE1KSwgPT0sIDApOworICAvKiBUaGlzIGlzIGVub3VnaCB0aGF0IHdlIHNob3VsZCBiZSBhYmxlIHRvIHRlbGwgaG93IG11Y2ggd2UgbmVlZC4gKi8KKyAgZ19hc3NlcnRfY21waW50ICgKKyAgICAgIGRidXNfbWVzc2FnZV9kZW1hcnNoYWxfYnl0ZXNfbmVlZGVkIChibG9iLCAxNiksID09LCBCTE9CX0xFTkdUSCk7CisgIC8qIFRoZSBoZWFkZXIgaXMgMzIgYnl0ZXMgbG9uZyAoaGVyZSksIHNvIHRoYXQncyBhbm90aGVyIGludGVyZXN0aW5nCisgICAqIGJvdW5kYXJ5LiAqLworICBnX2Fzc2VydF9jbXBpbnQgKAorICAgICAgZGJ1c19tZXNzYWdlX2RlbWFyc2hhbF9ieXRlc19uZWVkZWQgKGJsb2IsIDMxKSwgPT0sIEJMT0JfTEVOR1RIKTsKKyAgZ19hc3NlcnRfY21waW50ICgKKyAgICAgIGRidXNfbWVzc2FnZV9kZW1hcnNoYWxfYnl0ZXNfbmVlZGVkIChibG9iLCAzMiksID09LCBCTE9CX0xFTkdUSCk7CisgIGdfYXNzZXJ0X2NtcGludCAoCisgICAgICBkYnVzX21lc3NhZ2VfZGVtYXJzaGFsX2J5dGVzX25lZWRlZCAoYmxvYiwgMzMpLCA9PSwgQkxPQl9MRU5HVEgpOworICBnX2Fzc2VydF9jbXBpbnQgKAorICAgICAgZGJ1c19tZXNzYWdlX2RlbWFyc2hhbF9ieXRlc19uZWVkZWQgKGJsb2IsIEJMT0JfTEVOR1RIIC0gMSksID09LAorICAgICAgQkxPQl9MRU5HVEgpOworICBnX2Fzc2VydF9jbXBpbnQgKAorICAgICAgZGJ1c19tZXNzYWdlX2RlbWFyc2hhbF9ieXRlc19uZWVkZWQgKGJsb2IsIEJMT0JfTEVOR1RIKSwgPT0sCisgICAgICBCTE9CX0xFTkdUSCk7CisgIGdfYXNzZXJ0X2NtcGludCAoCisgICAgICBkYnVzX21lc3NhZ2VfZGVtYXJzaGFsX2J5dGVzX25lZWRlZCAoYmxvYiwgc2l6ZW9mIChiZV9ibG9iKSksID09LAorICAgICAgQkxPQl9MRU5HVEgpOworfQorCitzdGF0aWMgdm9pZAordGVhcmRvd24gKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBhcmcgR19HTlVDX1VOVVNFRCkKK3sKKyAgZGJ1c19lcnJvcl9mcmVlICgmZi0+ZSk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsCisgICAgY2hhciAqKmFyZ3YpCit7CisgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOworCisgIGdfdGVzdF9hZGQgKCIvZGVtYXJzaGFsL2xlIiwgRml4dHVyZSwgbGVfYmxvYiwgc2V0dXAsIHRlc3RfZW5kaWFuLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvZGVtYXJzaGFsL2JlIiwgRml4dHVyZSwgYmVfYmxvYiwgc2V0dXAsIHRlc3RfZW5kaWFuLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvZGVtYXJzaGFsL25lZWRlZC9sZSIsIEZpeHR1cmUsIGxlX2Jsb2IsIHNldHVwLCB0ZXN0X25lZWRlZCwKKyAgICAgIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9kZW1hcnNoYWwvbmVlZGVkL2JlIiwgRml4dHVyZSwgYmVfYmxvYiwgc2V0dXAsIHRlc3RfbmVlZGVkLAorICAgICAgdGVhcmRvd24pOworCisgIHJldHVybiBnX3Rlc3RfcnVuICgpOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L25hbWUtdGVzdC9NYWtlZmlsZS5hbSBiL2RidXMvdGVzdC9uYW1lLXRlc3QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFhZjE3OAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9uYW1lLXRlc3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzOSBAQAorIyBFdmVyeXRoaW5nIGluIHRoaXMgZGlyZWN0b3J5IGlzIHN0YXRpY2FsbHktbGlua2VkIHRvIGxpYmRidXMtaW50ZXJuYWwKK0FNX0NQUEZMQUdTID0gXAorCS1JJCh0b3Bfc3JjZGlyKSBcCisJLUREQlVTX0NPTVBJTEFUSU9OIFwKKwktRERCVVNfU1RBVElDX0JVSUxEIFwKKwkkKE5VTEwpCisKKyMgaWYgYXNzZXJ0aW9ucyBhcmUgZW5hYmxlZCwgaW1wcm92ZSBiYWNrdHJhY2VzCitBTV9MREZMQUdTID0gQFJfRFlOQU1JQ19MREZMQUdACisKKyMjIG5vdGUgdGhhdCBURVNUUyBoYXMgc3BlY2lhbCBtZWFuaW5nIChzdHVmZiB0byB1c2UgaW4gbWFrZSBjaGVjaykKKyMjIHNvIGlmIGFkZGluZyB0ZXN0cyBub3QgdG8gYmUgcnVuIGluIG1ha2UgY2hlY2ssIGRvbid0IGFkZCB0aGVtIHRvIAorIyMgVEVTVFMKK2lmIERCVVNfQlVJTERfVEVTVFMKK1RFU1RTX0VOVklST05NRU5UPURCVVNfVE9QX0JVSUxERElSPUBhYnNfdG9wX2J1aWxkZGlyQCBEQlVTX1RPUF9TUkNESVI9QGFic190b3Bfc3JjZGlyQCBQWVRIT049QFBZVEhPTkAKK1RFU1RTPXJ1bi10ZXN0LnNoIHJ1bi10ZXN0LXN5c3RlbXNlcnZlci5zaAorZWxzZQorVEVTVFM9CitlbmRpZgorCitFWFRSQV9ESVNUPXJ1bi10ZXN0LnNoIHJ1bi10ZXN0LXN5c3RlbXNlcnZlci5zaCB0ZXN0LXdhaXQtZm9yLWVjaG8ucHkgdGVzdC1hY3RpdmF0aW9uLWZvcmtpbmcucHkKKworaWYgREJVU19CVUlMRF9URVNUUworCisjIyB3ZSB1c2Ugbm9pbnN0X1BST0dSQU1TIG5vdCBjaGVja19QUk9HUkFNUyBmb3IgVEVTVFMgc28gdGhhdCB3ZQorIyMgYnVpbGQgZXZlbiB3aGVuIG5vdCBkb2luZyAibWFrZSBjaGVjayIKK25vaW5zdF9QUk9HUkFNUz10ZXN0LXBlbmRpbmctY2FsbC1kaXNwYXRjaCB0ZXN0LXBlbmRpbmctY2FsbC10aW1lb3V0IHRlc3QtdGhyZWFkcy1pbml0IHRlc3QtaWRzIHRlc3Qtc2h1dGRvd24gdGVzdC1wcml2c2VydmVyIHRlc3QtcHJpdnNlcnZlci1jbGllbnQgdGVzdC1hdXRvbGF1bmNoCisKK3Rlc3RfcGVuZGluZ19jYWxsX2Rpc3BhdGNoX0xEQUREPSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEKK3Rlc3RfcGVuZGluZ19jYWxsX3RpbWVvdXRfTERBREQ9JCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy1pbnRlcm5hbC5sYQordGVzdF90aHJlYWRzX2luaXRfTERBREQ9JCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy1pbnRlcm5hbC5sYQordGVzdF9pZHNfTERBREQ9JCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy1pbnRlcm5hbC5sYQorCit0ZXN0X3NodXRkb3duX0xEQUREPS4uL2xpYmRidXMtdGVzdHV0aWxzLmxhCit0ZXN0X3ByaXZzZXJ2ZXJfTERBREQ9Li4vbGliZGJ1cy10ZXN0dXRpbHMubGEKK3Rlc3RfcHJpdnNlcnZlcl9jbGllbnRfTERBREQ9Li4vbGliZGJ1cy10ZXN0dXRpbHMubGEKK3Rlc3RfYXV0b2xhdW5jaF9MREFERD0uLi9saWJkYnVzLXRlc3R1dGlscy5sYQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L25hbWUtdGVzdC9ydW4tdGVzdC1zeXN0ZW1zZXJ2ZXIuc2ggYi9kYnVzL3Rlc3QvbmFtZS10ZXN0L3J1bi10ZXN0LXN5c3RlbXNlcnZlci5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZmQxZjA0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L25hbWUtdGVzdC9ydW4tdGVzdC1zeXN0ZW1zZXJ2ZXIuc2gKQEAgLTAsMCArMSw1MSBAQAorIyEgL2Jpbi9zaAorZGllKCkKK3sKKyAgICBpZiAhIHRlc3QgLXogIiREQlVTX1NFU1NJT05fQlVTX1BJRCIgOyB0aGVuCisgICAgICAgIGVjaG8gImtpbGxpbmcgbWVzc2FnZSBidXMgIiREQlVTX1NFU1NJT05fQlVTX1BJRCA+JjIKKyAgICAgICAga2lsbCAtOSAkREJVU19TRVNTSU9OX0JVU19QSUQKKyAgICBmaQorICAgIGVjaG8gJFNDUklQVE5BTUU6ICQqID4mMgorCisgICAgZXhpdCAxCit9CisKK1NDUklQVE5BTUU9JDAKK01PREU9JDEKKworIyMgc28gdGhlIHRlc3RzIGNhbiBjb21wbGFpbiBpZiB5b3UgZmFpbCB0byB1c2UgdGhlIHNjcmlwdCB0byBsYXVuY2ggdGhlbQorREJVU19URVNUX05BTUVfUlVOX1RFU1RfU0NSSVBUPTEKK2V4cG9ydCBEQlVTX1RFU1RfTkFNRV9SVU5fVEVTVF9TQ1JJUFQKKworU09VUkNFX0NPTkZJR19GSUxFPSREQlVTX1RPUF9TUkNESVIvdGVzdC9uYW1lLXRlc3QvdG1wLXNlc3Npb24tbGlrZS1zeXN0ZW0uY29uZgorZXhwb3J0IFNPVVJDRV9DT05GSUdfRklMRQorIyBSZXJ1biBvdXJzZWx2ZXMgd2l0aCB0bXAgc2Vzc2lvbiBidXMgaWYgd2UncmUgbm90IGFscmVhZHkKK2lmIHRlc3QgLXogIiREQlVTX1RFU1RfTkFNRV9JTl9TWVNfUlVOX1RFU1QiOyB0aGVuCisgIERCVVNfVEVTVF9OQU1FX0lOX1NZU19SVU5fVEVTVD0xCisgIGV4cG9ydCBEQlVTX1RFU1RfTkFNRV9JTl9TWVNfUlVOX1RFU1QKKyAgZXhlYyAkREJVU19UT1BfU1JDRElSL3Rvb2xzL3J1bi13aXRoLXRtcC1zZXNzaW9uLWJ1cy5zaCAkU0NSSVBUTkFNRSAkTU9ERQorZmkgCisKK2lmIHRlc3QgLW4gIiREQlVTX1RFU1RfTU9OSVRPUiI7IHRoZW4KKyAgZGJ1cy1tb25pdG9yIC0tc2Vzc2lvbiAmCitmaQorCitlY2hvICJydW5uaW5nIHRlc3QtZXhwZWN0ZWQtZWNoby1mYWlsIgorJHtEQlVTX1RPUF9CVUlMRERJUn0vbGlidG9vbCAtLW1vZGU9ZXhlY3V0ZSAkREVCVUcgJERCVVNfVE9QX0JVSUxERElSL3Rvb2xzL2RidXMtc2VuZCAtLXByaW50LXJlcGx5IC0tZGVzdD1vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZSAvb3JnL2ZyZWVkZXNrdG9wL1Rlc3RTdWl0ZSBvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlLkVjaG8gc3RyaW5nOmhpID5lY2hvLWVycm9yLW91dHB1dC50bXAgMj4mMQoraWYgISBncmVwIC1xICdEQnVzLkVycm9yJyBlY2hvLWVycm9yLW91dHB1dC50bXA7IHRoZW4KKyAgZWNobyAiRGlkbid0IGdldCBleHBlY3RlZCBmYWlsdXJlOyBvdXRwdXQgd2FzOiIKKyAgZWNobyAiPT09PT0iCisgIGNhdCBlY2hvLWVycm9yLW91dHB1dC50bXAKKyAgZWNobyAiPT09PT0iCisgIGV4aXQgMQorZmkKKworZWNobyAicnVubmluZyB0ZXN0IGVjaG8gc2lnbmFsIgoraWYgdGVzdCAieCRQWVRIT04iID0gIng6IjsgdGhlbgorICBlY2hvICJTa2lwcGVkIHRlc3QtZWNoby1zaWduYWw6IFB5dGhvbiBpbnRlcnByZXRlciBub3QgZm91bmQiCitlbGlmICEgJFBZVEhPTiAkREJVU19UT1BfU1JDRElSL3Rlc3QvbmFtZS10ZXN0L3Rlc3Qtd2FpdC1mb3ItZWNoby5weTsgdGhlbgorICBlY2hvICJGYWlsZWQgdGVzdC13YWl0LWZvci1lY2hvIgorICBleGl0IDEKK2ZpCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L25hbWUtdGVzdC9ydW4tdGVzdC5zaCBiL2RidXMvdGVzdC9uYW1lLXRlc3QvcnVuLXRlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FkNTkzNwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9uYW1lLXRlc3QvcnVuLXRlc3Quc2gKQEAgLTAsMCArMSw2MCBAQAorIyEgL2Jpbi9zaAorCitkaWUoKQoreworICAgIGlmICEgdGVzdCAteiAiJERCVVNfU0VTU0lPTl9CVVNfUElEIiA7IHRoZW4KKyAgICAgICAgZWNobyAia2lsbGluZyBtZXNzYWdlIGJ1cyAiJERCVVNfU0VTU0lPTl9CVVNfUElEID4mMgorICAgICAgICBraWxsIC05ICREQlVTX1NFU1NJT05fQlVTX1BJRAorICAgIGZpCisgICAgZWNobyAkU0NSSVBUTkFNRTogJCogPiYyCisKKyAgICBleGl0IDEKK30KKworCitTQ1JJUFROQU1FPSQwCitNT0RFPSQxCisKKyMjIHNvIHRoZSB0ZXN0cyBjYW4gY29tcGxhaW4gaWYgeW91IGZhaWwgdG8gdXNlIHRoZSBzY3JpcHQgdG8gbGF1bmNoIHRoZW0KK0RCVVNfVEVTVF9OQU1FX1JVTl9URVNUX1NDUklQVD0xCitleHBvcnQgREJVU19URVNUX05BTUVfUlVOX1RFU1RfU0NSSVBUCisKKyMgUmVydW4gb3Vyc2VsdmVzIHdpdGggdG1wIHNlc3Npb24gYnVzIGlmIHdlJ3JlIG5vdCBhbHJlYWR5CitpZiB0ZXN0IC16ICIkREJVU19URVNUX05BTUVfSU5fUlVOX1RFU1QiOyB0aGVuCisgIERCVVNfVEVTVF9OQU1FX0lOX1JVTl9URVNUPTEKKyAgZXhwb3J0IERCVVNfVEVTVF9OQU1FX0lOX1JVTl9URVNUCisgIGV4ZWMgJERCVVNfVE9QX1NSQ0RJUi90b29scy9ydW4td2l0aC10bXAtc2Vzc2lvbi1idXMuc2ggJFNDUklQVE5BTUUgJE1PREUKK2ZpIAorCitpZiB0ZXN0IC1uICIkREJVU19URVNUX01PTklUT1IiOyB0aGVuCisgIGRidXMtbW9uaXRvciAtLXNlc3Npb24gJgorZmkKKworZWNobyAicnVubmluZyB0ZXN0LWlkcyIKKyR7REJVU19UT1BfQlVJTERESVJ9L2xpYnRvb2wgLS1tb2RlPWV4ZWN1dGUgJERFQlVHICREQlVTX1RPUF9CVUlMRERJUi90ZXN0L25hbWUtdGVzdC90ZXN0LWlkcyB8fCBkaWUgInRlc3QtaWRzIGZhaWxlZCIKKworZWNobyAicnVubmluZyB0ZXN0LXBlbmRpbmctY2FsbC1kaXNwYXRjaCIKKyR7REJVU19UT1BfQlVJTERESVJ9L2xpYnRvb2wgLS1tb2RlPWV4ZWN1dGUgJERFQlVHICREQlVTX1RPUF9CVUlMRERJUi90ZXN0L25hbWUtdGVzdC90ZXN0LXBlbmRpbmctY2FsbC1kaXNwYXRjaCB8fCBkaWUgInRlc3QtcGVuZGluZy1jYWxsLWRpc3BhdGNoIGZhaWxlZCIKKworZWNobyAicnVubmluZyB0ZXN0LXBlbmRpbmctY2FsbC10aW1lb3V0IgorJHtEQlVTX1RPUF9CVUlMRERJUn0vbGlidG9vbCAtLW1vZGU9ZXhlY3V0ZSAkREVCVUcgJERCVVNfVE9QX0JVSUxERElSL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtcGVuZGluZy1jYWxsLXRpbWVvdXQgfHwgZGllICJ0ZXN0LXBlbmRpbmctY2FsbC10aW1lb3V0IGZhaWxlZCIKKworZWNobyAicnVubmluZyB0ZXN0LXRocmVhZHMtaW5pdCIKKyR7REJVU19UT1BfQlVJTERESVJ9L2xpYnRvb2wgLS1tb2RlPWV4ZWN1dGUgJERFQlVHICREQlVTX1RPUF9CVUlMRERJUi90ZXN0L25hbWUtdGVzdC90ZXN0LXRocmVhZHMtaW5pdCB8fCBkaWUgInRlc3QtdGhyZWFkcy1pbml0IGZhaWxlZCIKKworZWNobyAicnVubmluZyB0ZXN0LXByaXZzZXJ2ZXItY2xpZW50IgorJHtEQlVTX1RPUF9CVUlMRERJUn0vbGlidG9vbCAtLW1vZGU9ZXhlY3V0ZSAkREVCVUcgJERCVVNfVE9QX0JVSUxERElSL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtcHJpdnNlcnZlci1jbGllbnQgfHwgZGllICJ0ZXN0LXByaXZzZXJ2ZXItY2xpZW50IGZhaWxlZCIKKworZWNobyAicnVubmluZyB0ZXN0LXNodXRkb3duIgorJHtEQlVTX1RPUF9CVUlMRERJUn0vbGlidG9vbCAtLW1vZGU9ZXhlY3V0ZSAkREVCVUcgJERCVVNfVE9QX0JVSUxERElSL3Rlc3QvbmFtZS10ZXN0L3Rlc3Qtc2h1dGRvd24gfHwgZGllICJ0ZXN0LXNodXRkb3duIGZhaWxlZCIKKworZWNobyAicnVubmluZyB0ZXN0IGFjdGl2YXRpb24gZm9ya2luZyIKK2lmIHRlc3QgIngkUFlUSE9OIiA9ICJ4OiI7IHRoZW4KKyAgZWNobyAiU2tpcHBlZCB0ZXN0LWFjdGl2YXRpb24tZm9ya2luZzogUHl0aG9uIGludGVycHJldGVyIG5vdCBmb3VuZCIKK2VsaWYgISAkUFlUSE9OICREQlVTX1RPUF9TUkNESVIvdGVzdC9uYW1lLXRlc3QvdGVzdC1hY3RpdmF0aW9uLWZvcmtpbmcucHk7IHRoZW4KKyAgZWNobyAiRmFpbGVkIHRlc3QtYWN0aXZhdGlvbi1mb3JraW5nIgorICBleGl0IDEKK2ZpCisKK2VjaG8gInJ1bm5pbmcgdGVzdC1hdXRvbGF1bmNoIgorJHtEQlVTX1RPUF9CVUlMRERJUn0vbGlidG9vbCAtLW1vZGU9ZXhlY3V0ZSAkREVCVUcgJERCVVNfVE9QX0JVSUxERElSL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtYXV0b2xhdW5jaCB8fCBkaWUgInRlc3QtYXV0b2xhdW5jaCBmYWlsZWQiCmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtYWN0aXZhdGlvbi1mb3JraW5nLnB5IGIvZGJ1cy90ZXN0L25hbWUtdGVzdC90ZXN0LWFjdGl2YXRpb24tZm9ya2luZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDgyMDc1Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L25hbWUtdGVzdC90ZXN0LWFjdGl2YXRpb24tZm9ya2luZy5weQpAQCAtMCwwICsxLDYwIEBACisjIS91c3IvYmluL2VudiBweXRob24KKworaW1wb3J0IG9zLHN5cworCit0cnk6CisgICAgaW1wb3J0IGdvYmplY3QKKyAgICBpbXBvcnQgZGJ1cworICAgIGltcG9ydCBkYnVzLm1haW5sb29wLmdsaWIKK2V4Y2VwdDoKKyAgICBwcmludCAiRmFpbGVkIGltcG9ydCwgYWJvcnRpbmcgdGVzdCIKKyAgICBzeXMuZXhpdCgwKQorCitkYnVzLm1haW5sb29wLmdsaWIuREJ1c0dNYWluTG9vcChzZXRfYXNfZGVmYXVsdD1UcnVlKQorbG9vcCA9IGdvYmplY3QuTWFpbkxvb3AoKQorCitleGl0Y29kZSA9IDAKKworYnVzID0gZGJ1cy5TZXNzaW9uQnVzKCkKK2J1c19pZmFjZSA9IGRidXMuSW50ZXJmYWNlKGJ1cy5nZXRfb2JqZWN0KCdvcmcuZnJlZWRlc2t0b3AuREJ1cycsICcvb3JnL2ZyZWVkZXNrdG9wL0RCdXMnKSwgJ29yZy5mcmVlZGVza3RvcC5EQnVzJykKKworbyA9IGJ1cy5nZXRfb2JqZWN0KCdvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVGb3JraW5nRWNob1NlcnZpY2UnLCAnL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUnKQoraSA9IGRidXMuSW50ZXJmYWNlKG8sICdvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlJykKKworIyBTdGFydCBpdCB1cAorcmVwbHkgPSBpLkVjaG8oImhlbGxvIHdvcmxkIikKK3ByaW50ICJUZXN0U3VpdGVGb3JraW5nRWNob1NlcnZpY2UgaW5pdGlhbCByZXBseSBPSyIKKworZGVmIGlnbm9yZSgqYXJncywgKiprd2FyZ3MpOgorICAgIHBhc3MKKworIyBOb3cgbW9uaXRvciBmb3IgZXhpdHMsIHdoZW4gdGhhdCBoYXBwZW5zLCBzdGFydCBpdCB1cCBhZ2Fpbi4KKyMgVGhlIGdvYWwgaGVyZSBpcyB0byB0cnkgdG8gaGl0IGFueSByYWNlIGNvbmRpdGlvbnMgaW4gYWN0aXZhdGlvbi4KK2NvdW50ZXIgPSAwCitkZWYgb25fZm9ya2luZ19lY2hvX293bmVyX2NoYW5nZWQobmFtZSwgb2xkLCBuZXcpOgorICAgIGdsb2JhbCBjb3VudGVyCisgICAgZ2xvYmFsIG8KKyAgICBnbG9iYWwgaQorICAgIGlmIGNvdW50ZXIgPiAxMDoKKyAgICAgICAgcHJpbnQgIkFjdGl2YXRlZCAxMCB0aW1lcyBPSywgVGVzdFN1aXRlRm9ya2luZ0VjaG9TZXJ2aWNlIHBhc3MiCisgICAgICAgIGxvb3AucXVpdCgpCisgICAgICAgIHJldHVybgorICAgIGNvdW50ZXIgKz0gMQorICAgIGlmIG5ldyA9PSAnJzoKKyAgICAgICAgbyA9IGJ1cy5nZXRfb2JqZWN0KCdvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVGb3JraW5nRWNob1NlcnZpY2UnLCAnL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUnKQorICAgICAgICBpID0gZGJ1cy5JbnRlcmZhY2UobywgJ29yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUnKQorICAgICAgICBpLkVjaG8oImNvdW50ZXIgJXIiICUgY291bnRlcikKKyAgICAgICAgaS5FeGl0KHJlcGx5X2hhbmRsZXI9aWdub3JlLCBlcnJvcl9oYW5kbGVyPWlnbm9yZSkKKworYnVzX2lmYWNlLmNvbm5lY3RfdG9fc2lnbmFsKCdOYW1lT3duZXJDaGFuZ2VkJywgb25fZm9ya2luZ19lY2hvX293bmVyX2NoYW5nZWQsIGFyZzA9J29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUZvcmtpbmdFY2hvU2VydmljZScpCisKK2kuRXhpdChyZXBseV9oYW5kbGVyPWlnbm9yZSwgZXJyb3JfaGFuZGxlcj1pZ25vcmUpCisKK2RlZiBjaGVja19jb3VudGVyKCk6CisgICAgaWYgY291bnRlciA9PSAwOgorICAgICAgICBwcmludCAiRmFpbGVkIHRvIGdldCBOYW1lT3duZXJDaGFuZ2VkIGZvciBUZXN0U3VpdGVGb3JraW5nRWNob1NlcnZpY2UiCisgICAgICAgIHN5cy5leGl0KDEpCitnb2JqZWN0LnRpbWVvdXRfYWRkKDE1MDAwLCBjaGVja19jb3VudGVyKQorCitsb29wLnJ1bigpCitzeXMuZXhpdCgwKQpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L25hbWUtdGVzdC90ZXN0LWF1dG9sYXVuY2guYyBiL2RidXMvdGVzdC9uYW1lLXRlc3QvdGVzdC1hdXRvbGF1bmNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU1MTk4OQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9uYW1lLXRlc3QvdGVzdC1hdXRvbGF1bmNoLmMKQEAgLTAsMCArMSw1MCBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlICJkYnVzL2RidXMtc3lzZGVwcy5oIgorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uID0gTlVMTDsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIF9kYnVzX3NldGVudiAoIkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyIsIE5VTEwpOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBjb25uID0gZGJ1c19idXNfZ2V0IChEQlVTX0JVU19TRVNTSU9OLCAmZXJyb3IpOworCisjaWZkZWYgREJVU19FTkFCTEVfWDExX0FVVE9MQVVOQ0gKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIioqKiBGYWlsZWQgdG8gYXV0b2xhdW5jaCBzZXNzaW9uIGJ1czogJXNcbiIsCisgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyNlbHNlCisgIC8qIFdlIGRvbid0IG5lY2Vzc2FyaWx5IGV4cGVjdCBpdCB0byAqd29yayogd2l0aG91dCBYIChhbHRob3VnaCBpdCBtaWdodCAtCisgICAqIGZvciBpbnN0YW5jZSBvbiBNYWMgT1MgaXQgbWlnaHQgaGF2ZSB1c2VkIGxhdW5jaGQpLiBKdXN0IGNoZWNrIHRoYXQgdGhlCisgICAqIHJlc3VsdHMgYXJlIGNvbnNpc3RlbnQuICovCisKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpICYmIGNvbm4gIT0gTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIqKiogQXV0b2xhdW5jaGVkIHNlc3Npb24gYnVzLCBidXQgYW4gZXJyb3Igd2FzIHNldCFcbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorI2VuZGlmCisKKyAgaWYgKCFkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSAmJiBjb25uID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiKioqIEZhaWxlZCB0byBhdXRvbGF1bmNoIHNlc3Npb24gYnVzIGJ1dCBubyBlcnJvciB3YXMgc2V0XG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9uYW1lLXRlc3QvdGVzdC1pZHMuYyBiL2RidXMvdGVzdC9uYW1lLXRlc3QvdGVzdC1pZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjYzZDA0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L25hbWUtdGVzdC90ZXN0LWlkcy5jCkBAIC0wLDAgKzEsNTYgQEAKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisgIGZwcmludGYgKHN0ZGVyciwgIioqKiB0ZXN0LWlkczogJXMiLCBtZXNzYWdlKTsKKyAgZXhpdCAoMSk7Cit9CisKK2ludAorbWFpbiAoaW50ICAgIGFyZ2MsCisgICAgICBjaGFyICoqYXJndikKK3sKKyAgREJ1c0Vycm9yIGVycm9yOworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgY2hhciAqaWQ7CisgIGNoYXIgKnNlcnZlcl9pZDsKKyAgCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgY29ubmVjdGlvbiA9IGRidXNfYnVzX2dldCAoREJVU19CVVNfU0VTU0lPTiwgJmVycm9yKTsKKyAgaWYgKGNvbm5lY3Rpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIqKiogRmFpbGVkIHRvIG9wZW4gY29ubmVjdGlvbiB0byBzeXN0ZW0gYnVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIHNlcnZlcl9pZCA9IGRidXNfY29ubmVjdGlvbl9nZXRfc2VydmVyX2lkIChjb25uZWN0aW9uKTsKKyAgaWYgKHNlcnZlcl9pZCA9PSBOVUxMKQorICAgIGRpZSAoIk5vIGJ1cyBzZXJ2ZXIgSUQgcmV0cmlldmVkXG4iKTsKKyAgLyogcHJpbnRmKCInJXMnXG4iLCBzZXJ2ZXJfaWQpOyAqLworICBpZiAoc3RybGVuIChzZXJ2ZXJfaWQpICE9IDMyKQorICAgIGRpZSAoIkJ1cyBzZXJ2ZXIgaWQgc2hvdWxkIGhhdmUgbGVuZ3RoIDMyXG4iKTsKKyAgZGJ1c19mcmVlIChzZXJ2ZXJfaWQpOworCisgIGlkID0gZGJ1c19idXNfZ2V0X2lkIChjb25uZWN0aW9uLCBOVUxMKTsKKyAgaWYgKGlkID09IE5VTEwpCisgICAgZGllICgiTm8gYnVzIElEIHJldHJpZXZlZFxuIik7CisgIC8qIHByaW50ZigiJyVzJ1xuIiwgaWQpOyAqLworICBpZiAoc3RybGVuIChpZCkgIT0gMzIpCisgICAgZGllICgiQnVzIElEIHNob3VsZCBoYXZlIGxlbmd0aCAzMlxuIik7CisgIGRidXNfZnJlZSAoaWQpOyAgCisgIAorICBfZGJ1c192ZXJib3NlICgiKioqIFRlc3QgSURzIGV4aXRpbmdcbiIpOworICAKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtcGVuZGluZy1jYWxsLWRpc3BhdGNoLmMgYi9kYnVzL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtcGVuZGluZy1jYWxsLWRpc3BhdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiNWE0NgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9uYW1lLXRlc3QvdGVzdC1wZW5kaW5nLWNhbGwtZGlzcGF0Y2guYwpAQCAtMCwwICsxLDEyNCBAQAorLyoqCisqIFRlc3QgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGdldCBzdHVjayBwb2xsaW5nIGEgZGJ1cyBjb25uZWN0aW9uCisqIHdoaWNoIGhhcyBubyBkYXRhIG9uIHRoZSBzb2NrZXQuICBUaGlzIHdhcyBhbiBpc3N1ZSB3aGVyZQorKiBvbmUgcGVuZGluZyBjYWxsIHdvdWxkIHJlYWQgYWxsIHRoZSBkYXRhIG9mZiB0aGUgYnVzCisqIGFuZCB0aGUgc2Vjb25kIHBlbmRpbmcgY2FsbCB3b3VsZCBub3QgY2hlY2sgdG8gc2VlCisqIGlmIGl0cyBkYXRhIGhhZCBhbHJlYWR5IGJlZW4gcmVhZCBiZWZvcmUgcG9sbGluZyB0aGUgY29ubmVjdGlvbgorKiBhbmQgYmxvY2tpbmcuCisqKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RhdGljIHZvaWQKK19ydW5faXRlcmF0aW9uIChEQnVzQ29ubmVjdGlvbiAqY29ubikKK3sKKyAgREJ1c1BlbmRpbmdDYWxsICplY2hvX3BlbmRpbmc7CisgIERCdXNQZW5kaW5nQ2FsbCAqZGJ1c19wZW5kaW5nOworICBEQnVzTWVzc2FnZSAqbWV0aG9kOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIGNoYXIgKmVjaG8gPSAiZWNobyI7CisKKyAgLyogc2VuZCB0aGUgZmlyc3QgbWVzc2FnZSAqLworICBtZXRob2QgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsICgib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY2hvIik7CisKKyAgZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXRob2QsIERCVVNfVFlQRV9TVFJJTkcsICZlY2hvLCBOVUxMKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoY29ubiwgbWV0aG9kLCAmZWNob19wZW5kaW5nLCAtMSk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobWV0aG9kKTsKKyAgCisgIC8qIHNlbmQgdGhlIHNlY29uZCBtZXNzYWdlICovCisgIG1ldGhvZCA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5JbnRyb3NwZWN0YWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnRyb3NwZWN0Iik7CisKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoY29ubiwgbWV0aG9kLCAmZGJ1c19wZW5kaW5nLCAtMSk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobWV0aG9kKTsKKworICAvKiBibG9jayBvbiB0aGUgc2Vjb25kIG1lc3NhZ2UgKHNob3VsZCByZXR1cm4gaW1tZWRpYXRlbHkpICovCisgIGRidXNfcGVuZGluZ19jYWxsX2Jsb2NrIChkYnVzX3BlbmRpbmcpOworCisgIC8qIGJsb2NrIG9uIHRoZSBmaXJzdCBtZXNzYWdlICovCisgIC8qIGlmIGl0IGRvZXMgbm90IHJldHVybiBpbW1lZGlhdGVseSBjaGFuY2VzIAorICAgICBhcmUgd2UgaGl0IHRoZSBibG9jayBpbiBwb2xsIGJ1ZyAqLworICBkYnVzX3BlbmRpbmdfY2FsbF9ibG9jayAoZWNob19wZW5kaW5nKTsKKworICAvKiBjaGVjayB0aGUgcmVwbHkgb25seSB0byBtYWtlIHN1cmUgd2UKKyAgICAgYXJlIG5vdCBnZXR0aW5nIGVycm9ycyB1bnJlbGF0ZWQKKyAgICAgdG8gdGhlIGJsb2NrIGluIHBvbGwgYnVnICovCisgIHJlcGx5ID0gZGJ1c19wZW5kaW5nX2NhbGxfc3RlYWxfcmVwbHkgKGVjaG9fcGVuZGluZyk7CisKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiRmFpbGVkOiBSZXBseSBpcyBOVUxMICoqKlxuIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAocmVwbHkpID09IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKQorICAgIHsKKyAgICAgIHByaW50ZiAoIkZhaWxlZDogUmVwbHkgaXMgZXJyb3I6ICVzICoqKlxuIiwgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChyZXBseSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfSAKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYgKGRidXNfcGVuZGluZyk7CisgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChlY2hvX3BlbmRpbmcpOworICAKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBsb25nIHN0YXJ0X3R2X3NlYywgc3RhcnRfdHZfdXNlYzsKKyAgbG9uZyBlbmRfdHZfc2VjLCBlbmRfdHZfdXNlYzsKKyAgaW50IGk7CisgIERCdXNNZXNzYWdlICptZXRob2Q7CisgIERCdXNDb25uZWN0aW9uICpjb25uOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgLyogVGltZSBlYWNoIGl0ZXJhdGlvbiBhbmQgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgdGFrZSBtb3JlIHRoYW4gNSBzZWNvbmRzCisgICAgIHRvIGNvbXBsZXRlLiAgT3V0c2lkZSBpbmZsdWVuY2VzIG1heSBjYXVzZSBjb25uZWN0aW9ucyB0byB0YWtlIGxvbmdlcgorICAgICBidXQgaWYgaXQgZG9lcyBhbmQgd2UgYXJlIHN0dWNrIGluIGEgcG9sbCBjYWxsIHRoZW4gd2Uga25vdyB0aGUgCisgICAgIHN0dWNrIGluIHBvbGwgYnVnIGhhcyBjb21lIGJhY2sgdG8gaGF1bnQgdXMgKi8KKworICBwcmludGYgKCIqKiogVGVzdGluZyBzdHVjayBpbiBwb2xsXG4iKTsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgY29ubiA9IGRidXNfYnVzX2dldCAoREJVU19CVVNfU0VTU0lPTiwgJmVycm9yKTsKKworICAvKiBydW4gMTAwIHRpbWVzIHRvIG1ha2Ugc3VyZSAqLworICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspCisgICAgeworICAgICAgbG9uZyBkZWx0YTsKKyAgICAgIAorICAgICAgX2RidXNfZ2V0X21vbm90b25pY190aW1lICgmc3RhcnRfdHZfc2VjLCAmc3RhcnRfdHZfdXNlYyk7CisgICAgICBfcnVuX2l0ZXJhdGlvbiAoY29ubik7CisgICAgICBfZGJ1c19nZXRfbW9ub3RvbmljX3RpbWUgKCZlbmRfdHZfc2VjLCAmZW5kX3R2X3VzZWMpOworCisgICAgICAvKiB3ZSBqdXN0IGNhcmUgYWJvdXQgc2Vjb25kcyAqLworICAgICAgZGVsdGEgPSBlbmRfdHZfc2VjIC0gc3RhcnRfdHZfc2VjOworICAgICAgcHJpbnRmICgiSXRlciAlaTogJWxpc1xuIiwgaSwgZGVsdGEpOworICAgICAgaWYgKGRlbHRhID49IDUpCisgICAgICAgIHsKKwkgIHByaW50ZiAoIkZhaWxlZDogbG9va3MgbGlrZSB3ZSBtaWdodCBoYXZlIGJlZW4gYmUgc3R1Y2sgaW4gcG9sbCAqKipcbiIpOworCSAgZXhpdCAoMSk7CisJfQorICAgIH0KKyAKKyAgbWV0aG9kID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGVFY2hvU2VydmljZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL1Rlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4aXQiKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm4sIG1ldGhvZCwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobWV0aG9kKTsKKworICBwcmludGYgKCJTdWNjZXNzICoqKlxuIik7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L25hbWUtdGVzdC90ZXN0LXBlbmRpbmctY2FsbC10aW1lb3V0LmMgYi9kYnVzL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtcGVuZGluZy1jYWxsLXRpbWVvdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDUxZmFiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L25hbWUtdGVzdC90ZXN0LXBlbmRpbmctY2FsbC10aW1lb3V0LmMKQEAgLTAsMCArMSwxMDMgQEAKKy8qKgorKiBUZXN0IHRvIG1ha2Ugc3VyZSB0aGF0IHBlbmRpbmcgY2FsbHMgc3VjY2VlZCB3aGVuIGdpdmVuIGEgZGVmYXVsdCwKKyogc3BlY2lmaWMgYW5kIGluZmluaXRlIHRpbWVvdXQuCisqKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RhdGljIHZvaWQKK19tZXRob2RfY2FsbCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm4sCisJICAgICAgaW50ICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKQoreworICBEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmc7CisgIERCdXNNZXNzYWdlICptZXRob2Q7CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgY2hhciAqZWNobyA9ICJlY2hvIjsKKworICAvKiBzZW5kIHRoZSBtZXNzYWdlICovCisgIG1ldGhvZCA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKCJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL1Rlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlbGF5RWNobyIpOworCisgIGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWV0aG9kLCBEQlVTX1RZUEVfU1RSSU5HLCAmZWNobywgTlVMTCk7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGNvbm4sIG1ldGhvZCwgJnBlbmRpbmcsIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXRob2QpOworICAKKyAgLyogYmxvY2sgb24gdGhlIG1lc3NhZ2UgKi8KKyAgZGJ1c19wZW5kaW5nX2NhbGxfYmxvY2sgKHBlbmRpbmcpOworCisgIC8qIGNoZWNrIHRoZSByZXBseSBvbmx5IHRvIG1ha2Ugc3VyZSB3ZQorICAgICBhcmUgbm90IGdldHRpbmcgZXJyb3JzIHVucmVsYXRlZAorICAgICB0byB0aGUgYmxvY2sgaW4gcG9sbCBidWcgKi8KKyAgcmVwbHkgPSBkYnVzX3BlbmRpbmdfY2FsbF9zdGVhbF9yZXBseSAocGVuZGluZyk7CisKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiRmFpbGVkOiBSZXBseSBpcyBOVUxMICoqKlxuIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAocmVwbHkpID09IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKQorICAgIHsKKyAgICAgIHByaW50ZiAoIkZhaWxlZDogUmVwbHkgaXMgZXJyb3I6ICVzICoqKlxuIiwgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChyZXBseSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfSAKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYgKHBlbmRpbmcpOworfQorCitzdGF0aWMgdm9pZAorX3J1bl9pdGVyYXRpb24gKERCdXNDb25uZWN0aW9uICpjb25uKQoreworICBfbWV0aG9kX2NhbGwgKGNvbm4sIC0xKTsKKyAgX21ldGhvZF9jYWxsIChjb25uLCAxMDAwMCk7CisgIF9tZXRob2RfY2FsbCAoY29ubiwgSU5UX01BWCk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgbG9uZyBzdGFydF90dl9zZWMsIHN0YXJ0X3R2X3VzZWM7CisgIGxvbmcgZW5kX3R2X3NlYywgZW5kX3R2X3VzZWM7CisgIGludCBpOworICBEQnVzTWVzc2FnZSAqbWV0aG9kOworICBEQnVzQ29ubmVjdGlvbiAqY29ubjsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIHByaW50ZiAoIioqKiBUZXN0aW5nIHBlbmRpbmcgY2FsbCB0aW1lb3V0c1xuIik7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIGNvbm4gPSBkYnVzX2J1c19nZXQgKERCVVNfQlVTX1NFU1NJT04sICZlcnJvcik7CisKKyAgLyogcnVuIDEwMCB0aW1lcyB0byBtYWtlIHN1cmUgKi8KKyAgZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKQorICAgIHsKKyAgICAgIGxvbmcgZGVsdGE7CisgICAgICAKKyAgICAgIF9kYnVzX2dldF9tb25vdG9uaWNfdGltZSAoJnN0YXJ0X3R2X3NlYywgJnN0YXJ0X3R2X3VzZWMpOworICAgICAgX3J1bl9pdGVyYXRpb24gKGNvbm4pOworICAgICAgX2RidXNfZ2V0X21vbm90b25pY190aW1lICgmZW5kX3R2X3NlYywgJmVuZF90dl91c2VjKTsKKworICAgICAgLyogd2UganVzdCBjYXJlIGFib3V0IHNlY29uZHMgKi8KKyAgICAgIGRlbHRhID0gZW5kX3R2X3NlYyAtIHN0YXJ0X3R2X3NlYzsKKyAgICAgIHByaW50ZiAoIkl0ZXIgJWk6ICVsaXNcbiIsIGksIGRlbHRhKTsKKyAgICB9CisgCisgIG1ldGhvZCA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKCJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlRWNob1NlcnZpY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeGl0Iik7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uLCBtZXRob2QsIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1ldGhvZCk7CisKKyAgcHJpbnRmICgiU3VjY2VzcyAqKipcbiIpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9uYW1lLXRlc3QvdGVzdC1wcml2c2VydmVyLWNsaWVudC5jIGIvZGJ1cy90ZXN0L25hbWUtdGVzdC90ZXN0LXByaXZzZXJ2ZXItY2xpZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdmNDg5NgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9uYW1lLXRlc3QvdGVzdC1wcml2c2VydmVyLWNsaWVudC5jCkBAIC0wLDAgKzEsMTY4IEBACisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiLi4vdGVzdC11dGlscy5oIgorCitzdGF0aWMgdm9pZAorZGllIChjb25zdCBjaGFyICptZXNzYWdlLCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgdmFfc3RhcnQgKGFyZ3MsIG1lc3NhZ2UpOworICB2ZnByaW50ZiAoc3RkZXJyLCBtZXNzYWdlLCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKyAgZXhpdCAoMSk7Cit9CisKKyNkZWZpbmUgUFJJVlNFUlZFUl9TRVJWSUNFICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGUuUHJpdlNlcnZlciIKKyNkZWZpbmUgUFJJVlNFUlZFUl9JTlRFUkZBQ0UgUFJJVlNFUlZFUl9TRVJWSUNFCisjZGVmaW5lIFBSSVZTRVJWRVJfRElFRF9SVUxFIFwKKyAgICAgICJ0eXBlPSdzaWduYWwnLHNlbmRlcj0nIiBEQlVTX1NFUlZJQ0VfREJVUyAiJywiIFwKKyAgICAgICJpbnRlcmZhY2U9JyIgREJVU19JTlRFUkZBQ0VfREJVUyAiJyxtZW1iZXI9J05hbWVPd25lckNoYW5nZWQnLCIgXAorICAgICAgImFyZzA9JyIgUFJJVlNFUlZFUl9TRVJWSUNFICInLGFyZzI9JyciCisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorZmlsdGVyX3Nlc3Npb25fbWVzc2FnZSAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIGRidXNfYm9vbF90ICpzZXJ2aWNlX2RpZWRfcCA9IHVzZXJfZGF0YTsKKyAgY29uc3QgY2hhciAqbmFtZSwgKm9sZF9vd25lciwgKm5ld19vd25lcjsKKworICBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmFtZU93bmVyQ2hhbmdlZCIpICYmCisgICAgICBkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwgREJVU19TRVJWSUNFX0RCVVMpICYmCisgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmb2xkX293bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmbmV3X293bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkgJiYKKyAgICAgIHN0cmNtcCAobmFtZSwgUFJJVlNFUlZFUl9TRVJWSUNFKSA9PSAwICYmCisgICAgICBvbGRfb3duZXJbMF0gIT0gJ1wwJyAmJgorICAgICAgbmV3X293bmVyWzBdID09ICdcMCcpCisgICAgeworICAgICAgKnNlcnZpY2VfZGllZF9wID0gVFJVRTsKKyAgICB9CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworfQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQgCitmaWx0ZXJfcHJpdmF0ZV9tZXNzYWdlIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgZGJ1c19ib29sX3QgKnByaXZhdGVfY29ubl9sb3N0X3AgPSB1c2VyX2RhdGE7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9pc19zaWduYWwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9MT0NBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXNjb25uZWN0ZWQiKSkKKyAgICB7CisgICAgICAqcHJpdmF0ZV9jb25uX2xvc3RfcCA9IFRSVUU7CisgICAgfQorICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkCitvcGVuX3NodXRkb3duX3ByaXZhdGVfY29ubmVjdGlvbiAoZGJ1c19ib29sX3QgdXNlX2d1aWQpCit7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgREJ1c0xvb3AgKmxvb3A7CisgIERCdXNDb25uZWN0aW9uICpzZXNzaW9uOworICBEQnVzTWVzc2FnZSAqbXNnOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIERCdXNDb25uZWN0aW9uICpwcml2Y29ubjsKKyAgY2hhciAqYWRkcjsKKyAgZGJ1c19ib29sX3Qgc2VydmljZV9kaWVkOworICBkYnVzX2Jvb2xfdCBwcml2YXRlX2Nvbm5fbG9zdDsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIHNlcnZpY2VfZGllZCA9IEZBTFNFOworICBwcml2YXRlX2Nvbm5fbG9zdCA9IEZBTFNFOworCisgIGxvb3AgPSBfZGJ1c19sb29wX25ldyAoKTsKKworICBzZXNzaW9uID0gZGJ1c19idXNfZ2V0IChEQlVTX0JVU19TRVNTSU9OLCAmZXJyb3IpOworICBpZiAoIXNlc3Npb24pCisgICAgZGllICgiY291bGRuJ3QgYWNjZXNzIHNlc3Npb24gYnVzXG4iKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9leGl0X29uX2Rpc2Nvbm5lY3QgKHNlc3Npb24sIEZBTFNFKTsKKyAgdGVzdF9jb25uZWN0aW9uX3NldHVwIChsb29wLCBzZXNzaW9uKTsKKworICBkYnVzX2J1c19hZGRfbWF0Y2ggKHNlc3Npb24sIFBSSVZTRVJWRVJfRElFRF9SVUxFLCAmZXJyb3IpOworICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgZGllICgiY291bGRuJ3QgYWRkIG1hdGNoIHJ1bGUgXCIlc1wiOiAlczogJXMiLCBQUklWU0VSVkVSX0RJRURfUlVMRSwKKyAgICAgICAgIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKHNlc3Npb24sIGZpbHRlcl9zZXNzaW9uX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2aWNlX2RpZWQsIE5VTEwpKQorICAgIGRpZSAoImNvdWxkbid0IGFkZCBmaWx0ZXIgdG8gc2Vzc2lvbiBidXNcbiIpOworCisgIG1zZyA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKFBSSVZTRVJWRVJfU0VSVklDRSwgIi8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklWU0VSVkVSX0lOVEVSRkFDRSwgIkdldFByaXZhdGVBZGRyZXNzIik7CisgIGlmICghKHJlcGx5ID0gZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2sgKHNlc3Npb24sIG1zZywgLTEsICZlcnJvcikpKQorICAgIGRpZSAoImNvdWxkbid0IHNlbmQgbWVzc2FnZTogJXNcbiIsIGVycm9yLm1lc3NhZ2UpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1zZyk7CisgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChyZXBseSwgJmVycm9yLCBEQlVTX1RZUEVfU1RSSU5HLCAmYWRkciwgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIGRpZSAoImNvdWxkbid0IHBhcnNlIG1lc3NhZ2UgcmVwbHltXG4iKTsKKyAgcHJpbnRmICgiZ290IHByaXZhdGUgdGVtcCBhZGRyZXNzICVzXG4iLCBhZGRyKTsKKyAgYWRkciA9IHN0cmR1cCAoYWRkcik7CisgIGlmICghdXNlX2d1aWQpCisgICAgeworICAgICAgY2hhciAqY29tbWEgPSBzdHJyY2hyIChhZGRyLCAnLCcpOworICAgICAgaWYgKGNvbW1hKQorICAgICAgICAqY29tbWEgPSAnXDAnOworICAgIH0KKyAgcHJpdmNvbm4gPSBkYnVzX2Nvbm5lY3Rpb25fb3BlbiAoYWRkciwgJmVycm9yKTsKKyAgZnJlZSAoYWRkcik7CisgIGlmICghcHJpdmNvbm4pCisgICAgZGllICgiY291bGRuJ3QgY29ubmVjdCB0byBzZXJ2ZXIgZGlyZWN0IGNvbm5lY3Rpb246ICVzXG4iLCBlcnJvci5tZXNzYWdlKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9leGl0X29uX2Rpc2Nvbm5lY3QgKHByaXZjb25uLCBGQUxTRSk7CisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKHByaXZjb25uLCBmaWx0ZXJfcHJpdmF0ZV9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJpdmF0ZV9jb25uX2xvc3QsIE5VTEwpKQorICAgIGRpZSAoImNvdWxkbid0IGFkZCBmaWx0ZXIgdG8gcHJpdmF0ZSBjb25uZWN0aW9uXG4iKTsKKyAgdGVzdF9jb25uZWN0aW9uX3NldHVwIChsb29wLCBwcml2Y29ubik7CisKKyAgbXNnID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoUFJJVlNFUlZFUl9TRVJWSUNFLCAiLyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSVZTRVJWRVJfSU5URVJGQUNFLCAiUXVpdCIpOworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChzZXNzaW9uLCBtc2csIE5VTEwpKQorICAgIGRpZSAoImNvdWxkbid0IHNlbmQgUXVpdCBtZXNzYWdlXG4iKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtc2cpOworCisgIHdoaWxlICghc2VydmljZV9kaWVkIHx8ICFwcml2YXRlX2Nvbm5fbG9zdCkKKyAgICBfZGJ1c19sb29wX2l0ZXJhdGUgKGxvb3AsIFRSVUUpOworCisgIGRidXNfY29ubmVjdGlvbl9yZW1vdmVfZmlsdGVyIChzZXNzaW9uLCBmaWx0ZXJfc2Vzc2lvbl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcnZpY2VfZGllZCk7CisgIGRidXNfYnVzX3JlbW92ZV9tYXRjaCAoc2Vzc2lvbiwgUFJJVlNFUlZFUl9ESUVEX1JVTEUsIE5VTEwpOworICB0ZXN0X2Nvbm5lY3Rpb25fc2h1dGRvd24gKGxvb3AsIHNlc3Npb24pOworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKHNlc3Npb24pOworCisgIHRlc3RfY29ubmVjdGlvbl9zaHV0ZG93biAobG9vcCwgcHJpdmNvbm4pOworICBkYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX2ZpbHRlciAocHJpdmNvbm4sIGZpbHRlcl9wcml2YXRlX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJpdmF0ZV9jb25uX2xvc3QpOworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKHByaXZjb25uKTsKKworICBfZGJ1c19sb29wX3VucmVmIChsb29wKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBvcGVuX3NodXRkb3duX3ByaXZhdGVfY29ubmVjdGlvbiAoVFJVRSk7CisKKyAgZGJ1c19zaHV0ZG93biAoKTsKKworICBvcGVuX3NodXRkb3duX3ByaXZhdGVfY29ubmVjdGlvbiAoVFJVRSk7CisKKyAgZGJ1c19zaHV0ZG93biAoKTsKKworICBvcGVuX3NodXRkb3duX3ByaXZhdGVfY29ubmVjdGlvbiAoRkFMU0UpOworCisgIGRidXNfc2h1dGRvd24gKCk7CisKKyAgb3Blbl9zaHV0ZG93bl9wcml2YXRlX2Nvbm5lY3Rpb24gKEZBTFNFKTsKKworICBkYnVzX3NodXRkb3duICgpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L25hbWUtdGVzdC90ZXN0LXByaXZzZXJ2ZXIuYyBiL2RidXMvdGVzdC9uYW1lLXRlc3QvdGVzdC1wcml2c2VydmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlhOThiNwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9uYW1lLXRlc3QvdGVzdC1wcml2c2VydmVyLmMKQEAgLTAsMCArMSwxMjMgQEAKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICIuLi90ZXN0LXV0aWxzLmgiCisKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKm1lc3NhZ2UsIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworICB2YV9zdGFydCAoYXJncywgbWVzc2FnZSk7CisgIHZmcHJpbnRmIChzdGRlcnIsIG1lc3NhZ2UsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworICBleGl0ICgxKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgVGVzdFNlcnZpY2VEYXRhIFRlc3RTZXJ2aWNlRGF0YTsKKworc3RydWN0IFRlc3RTZXJ2aWNlRGF0YQoreworICBEQnVzTG9vcCAqbG9vcDsKKyAgY2hhciAqcHJpdmF0ZV9hZGRyOworfTsKKworc3RhdGljIHZvaWQKK25ld19jb25uZWN0aW9uX2NhbGxiYWNrIChEQnVzU2VydmVyICAgICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpuZXdfY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSkKK3sKKyAgVGVzdFNlcnZpY2VEYXRhICp0ZXN0ZGF0YSA9IGRhdGE7CisKKyAgaWYgKCF0ZXN0X2Nvbm5lY3Rpb25fc2V0dXAgKHRlc3RkYXRhLT5sb29wLCBuZXdfY29ubmVjdGlvbikpCisgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChuZXdfY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdCAKK2ZpbHRlcl9zZXNzaW9uX21lc3NhZ2UgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAqdXNlcl9kYXRhKQoreworICBUZXN0U2VydmljZURhdGEgKnRlc3RkYXRhID0gdXNlcl9kYXRhOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGUuUHJpdlNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZXRQcml2YXRlQWRkcmVzcyIpKQorICAgIHsKKyAgICAgICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgICAgICAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICAgICAgIGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAocmVwbHksIERCVVNfVFlQRV9TVFJJTkcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJih0ZXN0ZGF0YS0+cHJpdmF0ZV9hZGRyKSwgREJVU19UWVBFX0lOVkFMSUQpOworICAgICAgIGRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCByZXBseSwgTlVMTCk7CisgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKKyAgICB9CisgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9pc19tZXRob2RfY2FsbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZS5Qcml2U2VydmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlF1aXQiKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJzZXJ2ZXIgZXhpdGluZyBsb29wXG4iKTsKKyAgICAgIF9kYnVzX2xvb3BfcXVpdCAodGVzdGRhdGEtPmxvb3ApOworICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKKyAgICB9CisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBEQnVzU2VydmVyICpzZXJ2ZXI7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgREJ1c0xvb3AgKmxvb3A7CisgIERCdXNDb25uZWN0aW9uICpzZXNzaW9uOworICBUZXN0U2VydmljZURhdGEgKnRlc3RkYXRhOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBsb29wID0gX2RidXNfbG9vcF9uZXcgKCk7CisKKyAgdGVzdGRhdGEgPSBkYnVzX25ldyAoVGVzdFNlcnZpY2VEYXRhLCAxKTsKKyAgdGVzdGRhdGEtPmxvb3AgPSBsb29wOworCisgIHNlc3Npb24gPSBkYnVzX2J1c19nZXQgKERCVVNfQlVTX1NFU1NJT04sICZlcnJvcik7CisgIGlmICghc2Vzc2lvbikKKyAgICBkaWUgKCJjb3VsZG4ndCBhY2Nlc3Mgc2Vzc2lvbiBidXMiKTsKKworICB0ZXN0X2Nvbm5lY3Rpb25fc2V0dXAgKGxvb3AsIHNlc3Npb24pOworCisgIGRidXNfYnVzX3JlcXVlc3RfbmFtZSAoc2Vzc2lvbiwgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZS5Qcml2U2VydmVyIiwgMCwgJmVycm9yKTsKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIGRpZSAoImNvdWxkbid0IHJlcXVlc3QgbmFtZTogJXMiLCBlcnJvci5tZXNzYWdlKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChzZXNzaW9uLCBmaWx0ZXJfc2Vzc2lvbl9tZXNzYWdlLCB0ZXN0ZGF0YSwgTlVMTCkpCisgICAgZGllICgiY291bGRuJ3QgYWRkIGZpbHRlciIpOworCisjaWZkZWYgREJVU19DTUFLRQorICBzZXJ2ZXIgPSBkYnVzX3NlcnZlcl9saXN0ZW4gKFRFU1RfTElTVEVOLCAmZXJyb3IpOworI2Vsc2UKKyAgc2VydmVyID0gZGJ1c19zZXJ2ZXJfbGlzdGVuICgidW5peDp0bXBkaXI9L3RtcCIsICZlcnJvcik7CisjZW5kaWYKKyAgaWYgKCFzZXJ2ZXIpCisgICAgZGllIChlcnJvci5tZXNzYWdlKTsKKyAgdGVzdGRhdGEtPnByaXZhdGVfYWRkciA9IGRidXNfc2VydmVyX2dldF9hZGRyZXNzIChzZXJ2ZXIpOworICBwcmludGYgKCJ0ZXN0IHNlcnZlciBsaXN0ZW5pbmcgb24gJXNcbiIsIHRlc3RkYXRhLT5wcml2YXRlX2FkZHIpOworCisgIGRidXNfc2VydmVyX3NldF9uZXdfY29ubmVjdGlvbl9mdW5jdGlvbiAoc2VydmVyLCBuZXdfY29ubmVjdGlvbl9jYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ZGF0YSwgTlVMTCk7CisKKyAgaWYgKCF0ZXN0X3NlcnZlcl9zZXR1cCAobG9vcCwgc2VydmVyKSkKKyAgICBkaWUgKCJzZXJ2ZXIgc2V0dXAgZmFpbGVkIik7CisKKyAgZnByaW50ZiAoc3RkZXJyLCAic2VydmVyIHJ1bm5pbmcgbWFpbmxvb3BcbiIpOworICBfZGJ1c19sb29wX3J1biAobG9vcCk7CisgIGZwcmludGYgKHN0ZGVyciwgInNlcnZlciBtYWlubG9vcCBxdWl0XG4iKTsKKworICB0ZXN0X3NlcnZlcl9zaHV0ZG93biAobG9vcCwgc2VydmVyKTsKKworICB0ZXN0X2Nvbm5lY3Rpb25fc2h1dGRvd24gKGxvb3AsIHNlc3Npb24pOworCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoc2Vzc2lvbik7CisKKyAgX2RidXNfbG9vcF91bnJlZiAobG9vcCk7CisKKyAgZGJ1c19mcmVlICh0ZXN0ZGF0YSk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvbmFtZS10ZXN0L3Rlc3Qtc2h1dGRvd24uYyBiL2RidXMvdGVzdC9uYW1lLXRlc3QvdGVzdC1zaHV0ZG93bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNmMxY2IKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvbmFtZS10ZXN0L3Rlc3Qtc2h1dGRvd24uYwpAQCAtMCwwICsxLDY4IEBACisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICIuLi90ZXN0LXV0aWxzLmgiCisKK3N0YXRpYyBEQnVzTG9vcCAqbG9vcDsKKworc3RhdGljIHZvaWQKK2RpZSAoY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiKioqIHRlc3Qtc2h1dGRvd246ICVzIiwgbWVzc2FnZSk7CisgIGV4aXQgKDEpOworfQorCitzdGF0aWMgdm9pZAorb3Blbl9kZXN0cm95X3NoYXJlZF9zZXNzaW9uX2J1c19jb25uZWN0aW9uICh2b2lkKQoreworICBEQnVzRXJyb3IgZXJyb3I7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICBjaGFyICpzZXNzaW9uX2FkZHJfbm9fZ3VpZDsKKyAgY2hhciAqY29tbWE7CisgIAorICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgc2Vzc2lvbl9hZGRyX25vX2d1aWQgPSBzdHJkdXAgKGdldGVudiAoIkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyIpKTsKKyAgY29tbWEgPSBzdHJjaHIgKHNlc3Npb25fYWRkcl9ub19ndWlkLCAnLCcpOworICBpZiAoY29tbWEgPT0gTlVMTCkKKyAgICBkaWUgKCJDb3VsZG4ndCBmaW5kIEdVSUQgaW4gc2Vzc2lvbiBidXMgYWRkcmVzcyIpOworICAqY29tbWEgPSAnXDAnOworICAgIAorICBjb25uZWN0aW9uID0gZGJ1c19jb25uZWN0aW9uX29wZW4gKHNlc3Npb25fYWRkcl9ub19ndWlkLCAmZXJyb3IpOworICBmcmVlIChzZXNzaW9uX2FkZHJfbm9fZ3VpZCk7CisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgZGllICgiRmFpbGVkIHRvIG9wZW4gY29ubmVjdGlvbiB0byB0ZW1wIHNlc3Npb24gYnVzXG4iKTsKKworICBsb29wID0gX2RidXNfbG9vcF9uZXcgKCk7CisgIGlmIChsb29wID09IE5VTEwpCisgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKyAgCisgIGlmICghdGVzdF9jb25uZWN0aW9uX3NldHVwIChsb29wLCBjb25uZWN0aW9uKSkKKyAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgIHRlc3RfY29ubmVjdGlvbl9zaHV0ZG93biAobG9vcCwgY29ubmVjdGlvbik7CisgCisgIF9kYnVzX2xvb3BfdW5yZWYgKGxvb3ApOworCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7IAorfQorCitpbnQKK21haW4gKGludCAgICBhcmdjLAorICAgICAgY2hhciAqKmFyZ3YpCit7CisgIG9wZW5fZGVzdHJveV9zaGFyZWRfc2Vzc2lvbl9idXNfY29ubmVjdGlvbiAoKTsKKworICBkYnVzX3NodXRkb3duICgpOworCisgIG9wZW5fZGVzdHJveV9zaGFyZWRfc2Vzc2lvbl9idXNfY29ubmVjdGlvbiAoKTsKKworICBkYnVzX3NodXRkb3duICgpOworCisgIG9wZW5fZGVzdHJveV9zaGFyZWRfc2Vzc2lvbl9idXNfY29ubmVjdGlvbiAoKTsKKworICBkYnVzX3NodXRkb3duICgpOworCisgIF9kYnVzX3ZlcmJvc2UgKCIqKiogVGVzdCBzaHV0ZG93biBleGl0aW5nXG4iKTsKKyAgCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L25hbWUtdGVzdC90ZXN0LXRocmVhZHMtaW5pdC5jIGIvZGJ1cy90ZXN0L25hbWUtdGVzdC90ZXN0LXRocmVhZHMtaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMjI4NTIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtdGhyZWFkcy1pbml0LmMKQEAgLTAsMCArMSwxODAgQEAKKy8qKgorICogVGVzdCB0byBtYWtlIHN1cmUgbGF0ZSB0aHJlYWQgaW5pdGlhbGl6YXRpb24gd29ya3MKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmg+CisKK3N0YXRpYyB2b2lkCitfcnVuX2l0ZXJhdGlvbiAoREJ1c0Nvbm5lY3Rpb24gKmNvbm4pCit7CisgIERCdXNQZW5kaW5nQ2FsbCAqZWNob19wZW5kaW5nOworICBEQnVzUGVuZGluZ0NhbGwgKmRidXNfcGVuZGluZzsKKyAgREJ1c01lc3NhZ2UgKm1ldGhvZDsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBjaGFyICplY2hvID0gImVjaG8iOworCisgIC8qIHNlbmQgdGhlIGZpcnN0IG1lc3NhZ2UgKi8KKyAgbWV0aG9kID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWNobyIpOworCisgIGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWV0aG9kLCBEQlVTX1RZUEVfU1RSSU5HLCAmZWNobywgTlVMTCk7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGNvbm4sIG1ldGhvZCwgJmVjaG9fcGVuZGluZywgLTEpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1ldGhvZCk7CisgIAorICAvKiBzZW5kIHRoZSBzZWNvbmQgbWVzc2FnZSAqLworICBtZXRob2QgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuSW50cm9zcGVjdGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50cm9zcGVjdCIpOworCisgIGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGNvbm4sIG1ldGhvZCwgJmRidXNfcGVuZGluZywgLTEpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1ldGhvZCk7CisKKyAgLyogYmxvY2sgb24gdGhlIHNlY29uZCBtZXNzYWdlIChzaG91bGQgcmV0dXJuIGltbWVkaWF0ZWx5KSAqLworICBkYnVzX3BlbmRpbmdfY2FsbF9ibG9jayAoZGJ1c19wZW5kaW5nKTsKKworICAvKiBibG9jayBvbiB0aGUgZmlyc3QgbWVzc2FnZSAqLworICAvKiBpZiBpdCBkb2VzIG5vdCByZXR1cm4gaW1tZWRpYXRlbHkgY2hhbmNlcyAKKyAgICAgYXJlIHdlIGhpdCB0aGUgYmxvY2sgaW4gcG9sbCBidWcgKi8KKyAgZGJ1c19wZW5kaW5nX2NhbGxfYmxvY2sgKGVjaG9fcGVuZGluZyk7CisKKyAgLyogY2hlY2sgdGhlIHJlcGx5IG9ubHkgdG8gbWFrZSBzdXJlIHdlCisgICAgIGFyZSBub3QgZ2V0dGluZyBlcnJvcnMgdW5yZWxhdGVkCisgICAgIHRvIHRoZSBibG9jayBpbiBwb2xsIGJ1ZyAqLworICByZXBseSA9IGRidXNfcGVuZGluZ19jYWxsX3N0ZWFsX3JlcGx5IChlY2hvX3BlbmRpbmcpOworCisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoIkZhaWxlZDogUmVwbHkgaXMgTlVMTCAqKipcbiIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKHJlcGx5KSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBwcmludGYgKCJGYWlsZWQ6IFJlcGx5IGlzIGVycm9yOiAlcyAqKipcbiIsIGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAocmVwbHkpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0gCisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChkYnVzX3BlbmRpbmcpOworICBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiAoZWNob19wZW5kaW5nKTsKKyAgCit9CitzdGF0aWMgdm9pZAorY2hlY2tfbXV0ZXhfbG9jayAoREJ1c011dGV4ICptdXRleDEsIAorICAgICAgICAgICAgICAgICAgREJ1c011dGV4ICptdXRleDIsIAorICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgaXNfc2FtZSkKK3sKKyAgX2RidXNfYXNzZXJ0IChtdXRleDEgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAobXV0ZXgyICE9IE5VTEwpOworICAKKyAgaWYgKGlzX3NhbWUpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChtdXRleDEgPT0gbXV0ZXgyKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKG11dGV4MSAhPSBtdXRleDIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2NvbmR2YXJfbG9jayAoREJ1c0NvbmRWYXIgKmNvbmR2YXIxLCAgCisgICAgICAgICAgICAgICAgICAgIERCdXNDb25kVmFyICpjb25kdmFyMiwgICAKKyAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgaXNfc2FtZSkKK3sKKyAgX2RidXNfYXNzZXJ0IChjb25kdmFyMSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChjb25kdmFyMiAhPSBOVUxMKTsKKworICBpZiAoaXNfc2FtZSkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKGNvbmR2YXIxID09IGNvbmR2YXIyKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKGNvbmR2YXIxICE9IGNvbmR2YXIyKTsKKyAgICB9Cit9CisKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBEQnVzTWVzc2FnZSAqbWV0aG9kOworICBEQnVzQ29ubmVjdGlvbiAqY29ubjsKKyAgREJ1c0Vycm9yIGVycm9yOworICBEQnVzTXV0ZXggKm11dGV4MSwgKmRpc3BhdGNoX211dGV4MSwgKmlvX3BhdGhfbXV0ZXgxOworICBEQnVzQ29uZFZhciAqZGlzcGF0Y2hfY29uZDEsICppb19wYXRoX2NvbmQxOworICBEQnVzTXV0ZXggKm11dGV4MiwgKmRpc3BhdGNoX211dGV4MiwgKmlvX3BhdGhfbXV0ZXgyOworICBEQnVzQ29uZFZhciAqZGlzcGF0Y2hfY29uZDIsICppb19wYXRoX2NvbmQyOworCisgIHByaW50ZiAoIioqKiBUZXN0aW5nIGxhdGUgdGhyZWFkIGluaXRcbiIpOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBjb25uID0gZGJ1c19idXNfZ2V0IChEQlVTX0JVU19TRVNTSU9OLCAmZXJyb3IpOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fdGVzdF9nZXRfbG9ja3MgKGNvbm4sICZtdXRleDEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcGF0Y2hfbXV0ZXgxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlvX3BhdGhfbXV0ZXgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcGF0Y2hfY29uZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpb19wYXRoX2NvbmQxKTsKKyAgX3J1bl9pdGVyYXRpb24gKGNvbm4pOworICBfZGJ1c19jb25uZWN0aW9uX3Rlc3RfZ2V0X2xvY2tzIChjb25uLCAmbXV0ZXgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcGF0Y2hfbXV0ZXgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW9fcGF0aF9tdXRleDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXNwYXRjaF9jb25kMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlvX3BhdGhfY29uZDIpOworCisgIGNoZWNrX211dGV4X2xvY2sgKG11dGV4MSwgbXV0ZXgyLCBUUlVFKTsKKyAgY2hlY2tfbXV0ZXhfbG9jayAoZGlzcGF0Y2hfbXV0ZXgxLCBkaXNwYXRjaF9tdXRleDIsIFRSVUUpOworICBjaGVja19tdXRleF9sb2NrIChpb19wYXRoX211dGV4MSwgaW9fcGF0aF9tdXRleDIsIFRSVUUpOworICBjaGVja19jb25kdmFyX2xvY2sgKGRpc3BhdGNoX2NvbmQxLCBkaXNwYXRjaF9jb25kMiwgVFJVRSk7CisgIGNoZWNrX2NvbmR2YXJfbG9jayAoaW9fcGF0aF9jb25kMSwgaW9fcGF0aF9jb25kMiwgVFJVRSk7CisKKyAgZGJ1c190aHJlYWRzX2luaXRfZGVmYXVsdCAoKTsKKworICBfZGJ1c19jb25uZWN0aW9uX3Rlc3RfZ2V0X2xvY2tzIChjb25uLCAmbXV0ZXgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcGF0Y2hfbXV0ZXgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW9fcGF0aF9tdXRleDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXNwYXRjaF9jb25kMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlvX3BhdGhfY29uZDEpOworCisgIGNoZWNrX211dGV4X2xvY2sgKG11dGV4MSwgbXV0ZXgyLCBGQUxTRSk7CisgIGNoZWNrX211dGV4X2xvY2sgKGRpc3BhdGNoX211dGV4MSwgZGlzcGF0Y2hfbXV0ZXgyLCBGQUxTRSk7CisgIGNoZWNrX211dGV4X2xvY2sgKGlvX3BhdGhfbXV0ZXgxLCBpb19wYXRoX211dGV4MiwgRkFMU0UpOworICBjaGVja19jb25kdmFyX2xvY2sgKGRpc3BhdGNoX2NvbmQxLCBkaXNwYXRjaF9jb25kMiwgRkFMU0UpOworICBjaGVja19jb25kdmFyX2xvY2sgKGlvX3BhdGhfY29uZDEsIGlvX3BhdGhfY29uZDIsIEZBTFNFKTsKKworICBfcnVuX2l0ZXJhdGlvbiAoY29ubik7CisgIF9kYnVzX2Nvbm5lY3Rpb25fdGVzdF9nZXRfbG9ja3MgKGNvbm4sICZtdXRleDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXNwYXRjaF9tdXRleDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpb19wYXRoX211dGV4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3BhdGNoX2NvbmQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW9fcGF0aF9jb25kMik7CisKKyAgY2hlY2tfbXV0ZXhfbG9jayAobXV0ZXgxLCBtdXRleDIsIFRSVUUpOworICBjaGVja19tdXRleF9sb2NrIChkaXNwYXRjaF9tdXRleDEsIGRpc3BhdGNoX211dGV4MiwgVFJVRSk7CisgIGNoZWNrX211dGV4X2xvY2sgKGlvX3BhdGhfbXV0ZXgxLCBpb19wYXRoX211dGV4MiwgVFJVRSk7CisgIGNoZWNrX2NvbmR2YXJfbG9jayAoZGlzcGF0Y2hfY29uZDEsIGRpc3BhdGNoX2NvbmQyLCBUUlVFKTsKKyAgY2hlY2tfY29uZHZhcl9sb2NrIChpb19wYXRoX2NvbmQxLCBpb19wYXRoX2NvbmQyLCBUUlVFKTsKKworICBtZXRob2QgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsICgib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhpdCIpOworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubiwgbWV0aG9kLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXRob2QpOworCisgIHByaW50ZiAoIlN1Y2Nlc3MgKioqXG4iKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvbmFtZS10ZXN0L3Rlc3Qtd2FpdC1mb3ItZWNoby5weSBiL2RidXMvdGVzdC9uYW1lLXRlc3QvdGVzdC13YWl0LWZvci1lY2hvLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJkMDllNDUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvbmFtZS10ZXN0L3Rlc3Qtd2FpdC1mb3ItZWNoby5weQpAQCAtMCwwICsxLDQxIEBACisjIS91c3IvYmluL2VudiBweXRob24KKworaW1wb3J0IG9zLHN5cworCit0cnk6CisgICAgaW1wb3J0IGdvYmplY3QKKyAgICBpbXBvcnQgZGJ1cworICAgIGltcG9ydCBkYnVzLm1haW5sb29wLmdsaWIKK2V4Y2VwdDoKKyAgICBwcmludCAiRmFpbGVkIGltcG9ydCwgYWJvcnRpbmcgdGVzdCIKKyAgICBzeXMuZXhpdCgwKQorCitkYnVzLm1haW5sb29wLmdsaWIuREJ1c0dNYWluTG9vcChzZXRfYXNfZGVmYXVsdD1UcnVlKQorbG9vcCA9IGdvYmplY3QuTWFpbkxvb3AoKQorCitleGl0Y29kZSA9IDAKKworZGVmIGhhbmRsZV9ub3JlY2VpcHQoKToKKyAgICBwcmludCAiRmFpbGVkIHRvIGdldCBzaWduYWwiCisgICAgZ2xvYmFsIGV4aXRjb2RlCisgICAgZXhpdGNvZGUgPSAxCisgICAgbG9vcC5xdWl0KCkKKworZ29iamVjdC50aW1lb3V0X2FkZCg3MDAwLCBoYW5kbGVfbm9yZWNlaXB0KQorCitidXMgPSBkYnVzLlNlc3Npb25CdXMoKQorCitkZWYgc2lnaGFuZGxlcigqYXJncywgKiprd2FyZ3MpOgorICAgIHByaW50ICJnb3Qgc2lnbmFsIgorICAgIGxvb3AucXVpdCgpICAgCisKK2J1cy5hZGRfc2lnbmFsX3JlY2VpdmVyKHNpZ2hhbmRsZXIsIGRidXNfaW50ZXJmYWNlPSdvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlJywgc2lnbmFsX25hbWU9J0ZvbycpCisKK28gPSBidXMuZ2V0X29iamVjdCgnb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2UnLCAnL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUnKQoraSA9IGRidXMuSW50ZXJmYWNlKG8sICdvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlJykKK2RlZiBudWxsaGFuZGxlcigqYXJncywgKiprd2FyZ3MpOgorICAgIHBhc3MKK2kuRW1pdEZvbyhyZXBseV9oYW5kbGVyPW51bGxoYW5kbGVyLCBlcnJvcl9oYW5kbGVyPW51bGxoYW5kbGVyKQorCitsb29wLnJ1bigpCitzeXMuZXhpdChleGl0Y29kZSkKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9uYW1lLXRlc3QvdG1wLXNlc3Npb24tbGlrZS1zeXN0ZW0uY29uZiBiL2RidXMvdGVzdC9uYW1lLXRlc3QvdG1wLXNlc3Npb24tbGlrZS1zeXN0ZW0uY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWFiMTE1Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L25hbWUtdGVzdC90bXAtc2Vzc2lvbi1saWtlLXN5c3RlbS5jb25mCkBAIC0wLDAgKzEsOTEgQEAKKzwhLS0gVGhpcyBjb25maWd1cmF0aW9uIGZpbGUgY29udHJvbHMgdGhlIHBlci11c2VyLWxvZ2luLXNlc3Npb24gbWVzc2FnZSBidXMuCisgICAgIEFkZCBhIHNlc3Npb24tbG9jYWwuY29uZiBhbmQgZWRpdCB0aGF0IHJhdGhlciB0aGFuIGNoYW5naW5nIHRoaXMgCisgICAgIGZpbGUgZGlyZWN0bHkuIC0tPgorCis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJ1cyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8IS0tIE91ciB3ZWxsLWtub3duIGJ1cyB0eXBlLCBkb24ndCBjaGFuZ2UgdGhpcyAtLT4KKyAgPHR5cGU+c2Vzc2lvbjwvdHlwZT4KKworICA8IS0tIElmIHdlIGZvcmssIGtlZXAgdGhlIHVzZXIncyBvcmlnaW5hbCB1bWFzayB0byBhdm9pZCBhZmZlY3RpbmcKKyAgICAgICB0aGUgYmVoYXZpb3Igb2YgY2hpbGQgcHJvY2Vzc2VzLiAtLT4KKyAgPGtlZXBfdW1hc2svPgorCisgIDxzeXNsb2cvPgorCisgIDxsaXN0ZW4+dW5peDp0bXBkaXI9L3RtcDwvbGlzdGVuPgorCisgIDxzdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzIC8+CisKKyAgPCEtLSBpbnRlbmRlZCB0byBtYXRjaCBzeXN0ZW0gYnVzIC0tPgorICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDwhLS0gQWxsIHVzZXJzIGNhbiBjb25uZWN0IHRvIHN5c3RlbSBidXMgLS0+CisgICAgPGFsbG93IHVzZXI9IioiLz4KKworICAgIDwhLS0gSG9sZXMgbXVzdCBiZSBwdW5jaGVkIGluIHNlcnZpY2UgY29uZmlndXJhdGlvbiBmaWxlcyBmb3IKKyAgICAgICAgIG5hbWUgb3duZXJzaGlwIGFuZCBzZW5kaW5nIG1ldGhvZCBjYWxscyAtLT4KKyAgICA8ZGVueSBvd249IioiLz4KKyAgICA8ZGVueSBzZW5kX3R5cGU9Im1ldGhvZF9jYWxsIi8+CisKKyAgICA8IS0tIFNpZ25hbHMgYW5kIHJlcGx5IG1lc3NhZ2VzIChtZXRob2QgcmV0dXJucywgZXJyb3JzKSBhcmUgYWxsb3dlZAorICAgICAgICAgYnkgZGVmYXVsdCAtLT4KKyAgICA8YWxsb3cgc2VuZF90eXBlPSJzaWduYWwiLz4KKyAgICA8YWxsb3cgc2VuZF9yZXF1ZXN0ZWRfcmVwbHk9InRydWUiIHNlbmRfdHlwZT0ibWV0aG9kX3JldHVybiIvPgorICAgIDxhbGxvdyBzZW5kX3JlcXVlc3RlZF9yZXBseT0idHJ1ZSIgc2VuZF90eXBlPSJlcnJvciIvPgorCisgICAgPCEtLSBBbGwgbWVzc2FnZXMgbWF5IGJlIHJlY2VpdmVkIGJ5IGRlZmF1bHQgLS0+CisgICAgPGFsbG93IHJlY2VpdmVfdHlwZT0ibWV0aG9kX2NhbGwiLz4KKyAgICA8YWxsb3cgcmVjZWl2ZV90eXBlPSJtZXRob2RfcmV0dXJuIi8+CisgICAgPGFsbG93IHJlY2VpdmVfdHlwZT0iZXJyb3IiLz4KKyAgICA8YWxsb3cgcmVjZWl2ZV90eXBlPSJzaWduYWwiLz4KKworICAgIDwhLS0gQWxsb3cgYW55b25lIHRvIHRhbGsgdG8gdGhlIG1lc3NhZ2UgYnVzIC0tPgorICAgIDxhbGxvdyBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuREJ1cyIvPgorICAgIDwhLS0gQnV0IGRpc2FsbG93IHNvbWUgc3BlY2lmaWMgYnVzIHNlcnZpY2VzIC0tPgorICAgIDxkZW55IHNlbmRfZGVzdGluYXRpb249Im9yZy5mcmVlZGVza3RvcC5EQnVzIgorICAgICAgICAgIHNlbmRfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuREJ1cyIKKyAgICAgICAgICBzZW5kX21lbWJlcj0iVXBkYXRlQWN0aXZhdGlvbkVudmlyb25tZW50Ii8+CisKKyAgICA8IS0tIFNwZWNpZmljIHRvIHRoZSB0ZXN0IHN1aXRlIC0tPgorICAgIDxhbGxvdyBvd249Im9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIi8+CisgICAgPGFsbG93IHNlbmRfZGVzdGluYXRpb249Im9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIgorICAgICAgICAgICBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLkRCdXMuSW50cm9zcGVjdGFibGUiLz4KKyAgICA8YWxsb3cgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2UiCisgICAgICAgICAgIHNlbmRfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIgorICAgICAgICAgICBzZW5kX21lbWJlcj0iRW1pdEZvbyIvPgorICA8L3BvbGljeT4KKworICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgICA8YWxsb3cgb3duPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZSIvPgorICAgICA8YWxsb3cgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2UiCisgICAgICAgICAgICBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLkRCdXMuSW50cm9zcGVjdGFibGUiLz4KKyAgICAgPGFsbG93IHNlbmRfZGVzdGluYXRpb249Im9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIgorICAgICAgICAgICAgc2VuZF9pbnRlcmZhY2U9Im9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiCisgICAgICAgICAgICBzZW5kX21lbWJlcj0iRW1pdEZvbyIvPgorICA8L3BvbGljeT4KKworICA8IS0tIEZvciB0aGUgc2Vzc2lvbiBidXMsIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHJlbGF0aXZlbHktbG93IGxpbWl0cyAKKyAgICAgICB3aXRoIGVzc2VudGlhbGx5IGluZmluaXRlIGxpbWl0cywgc2luY2UgdGhlIGJ1cyBpcyBqdXN0IHJ1bm5pbmcgCisgICAgICAgYXMgdGhlIHVzZXIgYW55d2F5LCB1c2luZyB1cCBidXMgcmVzb3VyY2VzIGlzIG5vdCBzb21ldGhpbmcgd2UgbmVlZCAKKyAgICAgICB0byB3b3JyeSBhYm91dC4gSW4gc29tZSBjYXNlcywgd2UgZG8gc2V0IHRoZSBsaW1pdHMgbG93ZXIgdGhhbiAKKyAgICAgICAiYWxsIGF2YWlsYWJsZSBtZW1vcnkiIGlmIGV4Y2VlZGluZyB0aGUgbGltaXQgaXMgYWxtb3N0IGNlcnRhaW5seSBhIGJ1ZywgCisgICAgICAgaGF2aW5nIHRoZSBidXMgZW5mb3JjZSBhIGxpbWl0IGlzIG5pY2VyIHRoYW4gYSBodWdlIG1lbW9yeSBsZWFrLiBCdXQgdGhlIAorICAgICAgIGludGVudCBpcyB0aGF0IHRoZXNlIGxpbWl0cyBzaG91bGQgbmV2ZXIgYmUgaGl0LiAtLT4KKworICA8IS0tIHRoZSBtZW1vcnkgbGltaXRzIGFyZSAxRyBpbnN0ZWFkIG9mIHNheSA0RyBiZWNhdXNlIHRoZXkgY2FuJ3QgZXhjZWVkIDMyLWJpdCBzaWduZWQgaW50IG1heCAtLT4KKyAgPGxpbWl0IG5hbWU9Im1heF9pbmNvbWluZ19ieXRlcyI+MTAwMDAwMDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfb3V0Z29pbmdfYnl0ZXMiPjEwMDAwMDAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X21lc3NhZ2Vfc2l6ZSI+MTAwMDAwMDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJzZXJ2aWNlX3N0YXJ0X3RpbWVvdXQiPjEyMDAwMDwvbGltaXQ+ICAKKyAgPGxpbWl0IG5hbWU9ImF1dGhfdGltZW91dCI+MjQwMDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9jb21wbGV0ZWRfY29ubmVjdGlvbnMiPjEwMDAwMDwvbGltaXQ+ICAKKyAgPGxpbWl0IG5hbWU9Im1heF9pbmNvbXBsZXRlX2Nvbm5lY3Rpb25zIj4xMDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfY29ubmVjdGlvbnNfcGVyX3VzZXIiPjEwMDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfcGVuZGluZ19zZXJ2aWNlX3N0YXJ0cyI+MTAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X25hbWVzX3Blcl9jb25uZWN0aW9uIj41MDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfbWF0Y2hfcnVsZXNfcGVyX2Nvbm5lY3Rpb24iPjUwMDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9yZXBsaWVzX3Blcl9jb25uZWN0aW9uIj41MDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJyZXBseV90aW1lb3V0Ij4zMDAwMDA8L2xpbWl0PgorCis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL2RidXMvdGVzdC9yZWxheS5jIGIvZGJ1cy90ZXN0L3JlbGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQxMjlkMAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9yZWxheS5jCkBAIC0wLDAgKzEsMzIyIEBACisvKiBSZWdyZXNzaW9uIHRlc3QgZm9yIHBhc3NpbmcgdW5tb2RpZmllZCBtZXNzYWdlcyBiZXR3ZWVuIGNvbm5lY3Rpb25zCisgKgorICogQXV0aG9yOiBTaW1vbiBNY1ZpdHRpZSA8c2ltb24ubWN2aXR0aWVAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IMKpIDIwMTAtMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcworICogKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKKyAqIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsCisgKiBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLAorICogYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgPGdsaWIuaD4KKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1nbGliLWxvd2xldmVsLmg+CisKKy8qIFRoaXMgaXMgYmFzaWNhbGx5IGEgbWluaWF0dXJlIGRidXMtZGFlbW9uLiBXZSByZWxheSBtZXNzYWdlcyBmcm9tIHRoZSBjbGllbnQKKyAqIG9uIHRoZSBsZWZ0IHRvIHRoZSBjbGllbnQgb24gdGhlIHJpZ2h0LgorICoKKyAqIGxlZnQgICAgICBzb2NrZXQgICAgIGxlZnQgICAgICBkaXNwYXRjaCAgICAgcmlnaHQgICAgc29ja2V0ICAgICByaWdodAorICogY2xpZW50ID09PT09PT09PT09PiAgc2VydmVyIC0tLS0tLS0tLS0tLS0tPiBzZXJ2ZXIgPT09PT09PT09PT0+IGNsaWVudAorICogY29ubiAgICAgICAgICAgICAgICAgY29ubiAgICAgICAgICAgICAgICAgICBjb25uICAgICAgICAgICAgICAgIGNvbm4KKyAqCisgKiBJbiB0aGUgcmVhbCBkYnVzLWRhZW1vbiwgdGhlIGNsaWVudCBjb25uZWN0aW9ucyB3b3VsZCBiZSBvdXQtb2YtcHJvY2VzcywKKyAqIGJ1dCBoZXJlIHdlJ3JlIGNoZWF0aW5nIGFuZCBkb2luZyBldmVyeXRoaW5nIGluLXByb2Nlc3MuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIERCdXNFcnJvciBlOworCisgICAgREJ1c1NlcnZlciAqc2VydmVyOworCisgICAgREJ1c0Nvbm5lY3Rpb24gKmxlZnRfY2xpZW50X2Nvbm47CisgICAgREJ1c0Nvbm5lY3Rpb24gKmxlZnRfc2VydmVyX2Nvbm47CisKKyAgICBEQnVzQ29ubmVjdGlvbiAqcmlnaHRfc2VydmVyX2Nvbm47CisgICAgREJ1c0Nvbm5lY3Rpb24gKnJpZ2h0X2NsaWVudF9jb25uOworICAgIC8qIHF1ZXVlIG9mIERCdXNNZXNzYWdlIHJlY2VpdmVkIGJ5IHJpZ2h0X2NsaWVudF9jb25uICovCisgICAgR1F1ZXVlIG1lc3NhZ2VzOworfSBGaXh0dXJlOworCitzdGF0aWMgdm9pZAorYXNzZXJ0X25vX2Vycm9yIChjb25zdCBEQnVzRXJyb3IgKmUpCit7CisgIGlmIChHX1VOTElLRUxZIChkYnVzX2Vycm9yX2lzX3NldCAoZSkpKQorICAgIGdfZXJyb3IgKCJleHBlY3RlZCBzdWNjZXNzIGJ1dCBnb3QgZXJyb3I6ICVzOiAlcyIsIGUtPm5hbWUsIGUtPm1lc3NhZ2UpOworfQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK3NlcnZlcl9tZXNzYWdlX2NiIChEQnVzQ29ubmVjdGlvbiAqc2VydmVyX2Nvbm4sCisgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgdm9pZCAqZGF0YSkKK3sKKyAgRml4dHVyZSAqZiA9IGRhdGE7CisKKyAgZ19hc3NlcnQgKHNlcnZlcl9jb25uID09IGYtPmxlZnRfc2VydmVyX2Nvbm4pOworICBnX2Fzc2VydCAoZi0+cmlnaHRfc2VydmVyX2Nvbm4gIT0gTlVMTCk7CisKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnJpZ2h0X3NlcnZlcl9jb25uLCBtZXNzYWdlLCBOVUxMKTsKKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworfQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK3JpZ2h0X2NsaWVudF9tZXNzYWdlX2NiIChEQnVzQ29ubmVjdGlvbiAqY2xpZW50X2Nvbm4sCisgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgdm9pZCAqZGF0YSkKK3sKKyAgRml4dHVyZSAqZiA9IGRhdGE7CisKKyAgZ19hc3NlcnQgKGNsaWVudF9jb25uID09IGYtPnJpZ2h0X2NsaWVudF9jb25uKTsKKyAgZ19xdWV1ZV9wdXNoX3RhaWwgKCZmLT5tZXNzYWdlcywgZGJ1c19tZXNzYWdlX3JlZiAobWVzc2FnZSkpOworCisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkCituZXdfY29ubl9jYiAoREJ1c1NlcnZlciAqc2VydmVyLAorICAgIERCdXNDb25uZWN0aW9uICpzZXJ2ZXJfY29ubiwKKyAgICB2b2lkICpkYXRhKQoreworICBGaXh0dXJlICpmID0gZGF0YTsKKyAgZGJ1c19ib29sX3QgaGF2ZV9tZW07CisKKyAgaWYgKGYtPmxlZnRfc2VydmVyX2Nvbm4gPT0gTlVMTCkKKyAgICB7CisgICAgICBmLT5sZWZ0X3NlcnZlcl9jb25uID0gZGJ1c19jb25uZWN0aW9uX3JlZiAoc2VydmVyX2Nvbm4pOworCisgICAgICBoYXZlX21lbSA9IGRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChzZXJ2ZXJfY29ubiwKKyAgICAgICAgICBzZXJ2ZXJfbWVzc2FnZV9jYiwgZiwgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoaGF2ZV9tZW0pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGdfYXNzZXJ0IChmLT5yaWdodF9zZXJ2ZXJfY29ubiA9PSBOVUxMKTsKKyAgICAgIGYtPnJpZ2h0X3NlcnZlcl9jb25uID0gZGJ1c19jb25uZWN0aW9uX3JlZiAoc2VydmVyX2Nvbm4pOworICAgIH0KKworICBkYnVzX2Nvbm5lY3Rpb25fc2V0dXBfd2l0aF9nX21haW4gKHNlcnZlcl9jb25uLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK3NldHVwIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSBHX0dOVUNfVU5VU0VEKQoreworICBkYnVzX2Vycm9yX2luaXQgKCZmLT5lKTsKKyAgZ19xdWV1ZV9pbml0ICgmZi0+bWVzc2FnZXMpOworCisgIGYtPnNlcnZlciA9IGRidXNfc2VydmVyX2xpc3RlbiAoInRjcDpob3N0PTEyNy4wLjAuMSIsICZmLT5lKTsKKyAgYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisgIGdfYXNzZXJ0IChmLT5zZXJ2ZXIgIT0gTlVMTCk7CisKKyAgZGJ1c19zZXJ2ZXJfc2V0X25ld19jb25uZWN0aW9uX2Z1bmN0aW9uIChmLT5zZXJ2ZXIsCisgICAgICBuZXdfY29ubl9jYiwgZiwgTlVMTCk7CisgIGRidXNfc2VydmVyX3NldHVwX3dpdGhfZ19tYWluIChmLT5zZXJ2ZXIsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jb25uZWN0IChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSBHX0dOVUNfVU5VU0VEKQoreworICBkYnVzX2Jvb2xfdCBoYXZlX21lbTsKKyAgY2hhciAqYWRkcmVzczsKKworICBnX2Fzc2VydCAoZi0+bGVmdF9zZXJ2ZXJfY29ubiA9PSBOVUxMKTsKKyAgZ19hc3NlcnQgKGYtPnJpZ2h0X3NlcnZlcl9jb25uID09IE5VTEwpOworCisgIGFkZHJlc3MgPSBkYnVzX3NlcnZlcl9nZXRfYWRkcmVzcyAoZi0+c2VydmVyKTsKKyAgZ19hc3NlcnQgKGFkZHJlc3MgIT0gTlVMTCk7CisKKyAgZi0+bGVmdF9jbGllbnRfY29ubiA9IGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKGFkZHJlc3MsICZmLT5lKTsKKyAgYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisgIGdfYXNzZXJ0IChmLT5sZWZ0X2NsaWVudF9jb25uICE9IE5VTEwpOworICBkYnVzX2Nvbm5lY3Rpb25fc2V0dXBfd2l0aF9nX21haW4gKGYtPmxlZnRfY2xpZW50X2Nvbm4sIE5VTEwpOworCisgIHdoaWxlIChmLT5sZWZ0X3NlcnZlcl9jb25uID09IE5VTEwpCisgICAgeworICAgICAgZ19wcmludCAoIi4iKTsKKyAgICAgIGdfbWFpbl9jb250ZXh0X2l0ZXJhdGlvbiAoTlVMTCwgVFJVRSk7CisgICAgfQorCisgIGYtPnJpZ2h0X2NsaWVudF9jb25uID0gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAoYWRkcmVzcywgJmYtPmUpOworICBhc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnQgKGYtPnJpZ2h0X2NsaWVudF9jb25uICE9IE5VTEwpOworICBkYnVzX2Nvbm5lY3Rpb25fc2V0dXBfd2l0aF9nX21haW4gKGYtPnJpZ2h0X2NsaWVudF9jb25uLCBOVUxMKTsKKworICBkYnVzX2ZyZWUgKGFkZHJlc3MpOworCisgIHdoaWxlIChmLT5yaWdodF9zZXJ2ZXJfY29ubiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGdfcHJpbnQgKCIuIik7CisgICAgICBnX21haW5fY29udGV4dF9pdGVyYXRpb24gKE5VTEwsIFRSVUUpOworICAgIH0KKworICBoYXZlX21lbSA9IGRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChmLT5yaWdodF9jbGllbnRfY29ubiwKKyAgICAgIHJpZ2h0X2NsaWVudF9tZXNzYWdlX2NiLCBmLCBOVUxMKTsKKyAgZ19hc3NlcnQgKGhhdmVfbWVtKTsKK30KKworc3RhdGljIGRidXNfdWludDMyX3QKK3NlbmRfb25lIChGaXh0dXJlICpmLAorICAgIGNvbnN0IGNoYXIgKm1lbWJlcikKK3sKKyAgZGJ1c19ib29sX3QgaGF2ZV9tZW07CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBEQnVzTWVzc2FnZSAqb3V0Z29pbmc7CisKKyAgb3V0Z29pbmcgPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9jb20vZXhhbXBsZS9IZWxsbyIsCisgICAgICAiY29tLmV4YW1wbGUuSGVsbG8iLCBtZW1iZXIpOworICBnX2Fzc2VydCAob3V0Z29pbmcgIT0gTlVMTCk7CisKKyAgaGF2ZV9tZW0gPSBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+bGVmdF9jbGllbnRfY29ubiwgb3V0Z29pbmcsICZzZXJpYWwpOworICBnX2Fzc2VydCAoaGF2ZV9tZW0pOworICBnX2Fzc2VydCAoc2VyaWFsICE9IDApOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAob3V0Z29pbmcpOworICByZXR1cm4gc2VyaWFsOworfQorCitzdGF0aWMgdm9pZAordGVzdF9yZWxheSAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGRhdGEpCit7CisgIERCdXNNZXNzYWdlICppbmNvbWluZzsKKworICB0ZXN0X2Nvbm5lY3QgKGYsIGRhdGEpOworCisgIHNlbmRfb25lIChmLCAiRmlyc3QiKTsKKyAgc2VuZF9vbmUgKGYsICJTZWNvbmQiKTsKKworICB3aGlsZSAoZ19xdWV1ZV9nZXRfbGVuZ3RoICgmZi0+bWVzc2FnZXMpIDwgMikKKyAgICB7CisgICAgICBnX3ByaW50ICgiLiIpOworICAgICAgZ19tYWluX2NvbnRleHRfaXRlcmF0aW9uIChOVUxMLCBUUlVFKTsKKyAgICB9CisKKyAgZ19hc3NlcnRfY21wdWludCAoZ19xdWV1ZV9nZXRfbGVuZ3RoICgmZi0+bWVzc2FnZXMpLCA9PSwgMik7CisKKyAgaW5jb21pbmcgPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bWVzc2FnZXMpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChpbmNvbWluZyksID09LCAiRmlyc3QiKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChpbmNvbWluZyk7CisKKyAgaW5jb21pbmcgPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bWVzc2FnZXMpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChpbmNvbWluZyksID09LCAiU2Vjb25kIik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAoaW5jb21pbmcpOworfQorCisvKiBBbiBhcmJpdHJhcnkgbnVtYmVyIG9mIG1lc3NhZ2VzICovCisjZGVmaW5lIE1BTlkgODE5MgorCitzdGF0aWMgdm9pZAordGVzdF9saW1pdCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGRhdGEpCit7CisgIERCdXNNZXNzYWdlICppbmNvbWluZzsKKyAgZ3VpbnQgaTsKKworICB0ZXN0X2Nvbm5lY3QgKGYsIGRhdGEpOworCisgIC8qIFRoaXMgd2FzIGFuIGF0dGVtcHQgdG8gcmVwcm9kdWNlIGZkLm8gIzM0MzkzLiBJdCBkaWRuJ3Qgd29yay4gKi8KKyAgZ190ZXN0X2J1ZyAoIjM0MzkzIik7CisgIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X3JlY2VpdmVkX3NpemUgKGYtPmxlZnRfc2VydmVyX2Nvbm4sIDEpOworICBnX21haW5fY29udGV4dF9pdGVyYXRpb24gKE5VTEwsIFRSVUUpOworCisgIGZvciAoaSA9IDA7IGkgPCBNQU5ZOyBpKyspCisgICAgeworICAgICAgZ2NoYXIgKmJ1ZiA9IGdfc3RyZHVwX3ByaW50ZiAoIk1lc3NhZ2UldSIsIGkpOworCisgICAgICBzZW5kX29uZSAoZiwgYnVmKTsKKyAgICAgIGdfZnJlZSAoYnVmKTsKKyAgICB9CisKKyAgaSA9IDA7CisKKyAgd2hpbGUgKGkgPCBNQU5ZKQorICAgIHsKKyAgICAgIHdoaWxlIChnX3F1ZXVlX2lzX2VtcHR5ICgmZi0+bWVzc2FnZXMpKQorICAgICAgICB7CisgICAgICAgICAgZ19tYWluX2NvbnRleHRfaXRlcmF0aW9uIChOVUxMLCBUUlVFKTsKKyAgICAgICAgfQorCisgICAgICB3aGlsZSAoKGluY29taW5nID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1lc3NhZ2VzKSkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGkrKzsKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKGluY29taW5nKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK3RlYXJkb3duIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSBHX0dOVUNfVU5VU0VEKQoreworICBpZiAoZi0+bGVmdF9jbGllbnRfY29ubiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+bGVmdF9jbGllbnRfY29ubik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPmxlZnRfY2xpZW50X2Nvbm4pOworICAgICAgZi0+bGVmdF9jbGllbnRfY29ubiA9IE5VTEw7CisgICAgfQorCisgIGlmIChmLT5yaWdodF9jbGllbnRfY29ubiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+cmlnaHRfY2xpZW50X2Nvbm4pOworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChmLT5yaWdodF9jbGllbnRfY29ubik7CisgICAgICBmLT5yaWdodF9jbGllbnRfY29ubiA9IE5VTEw7CisgICAgfQorCisgIGlmIChmLT5sZWZ0X3NlcnZlcl9jb25uICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChmLT5sZWZ0X3NlcnZlcl9jb25uKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZi0+bGVmdF9zZXJ2ZXJfY29ubik7CisgICAgICBmLT5sZWZ0X3NlcnZlcl9jb25uID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGYtPnJpZ2h0X3NlcnZlcl9jb25uICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChmLT5yaWdodF9zZXJ2ZXJfY29ubik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPnJpZ2h0X3NlcnZlcl9jb25uKTsKKyAgICAgIGYtPnJpZ2h0X3NlcnZlcl9jb25uID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGYtPnNlcnZlciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2VydmVyX2Rpc2Nvbm5lY3QgKGYtPnNlcnZlcik7CisgICAgICBkYnVzX3NlcnZlcl91bnJlZiAoZi0+c2VydmVyKTsKKyAgICAgIGYtPnNlcnZlciA9IE5VTEw7CisgICAgfQorfQorCitpbnQKK21haW4gKGludCBhcmdjLAorICAgIGNoYXIgKiphcmd2KQoreworICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKyAgZ190ZXN0X2J1Z19iYXNlICgiaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Iik7CisKKyAgZ190ZXN0X2FkZCAoIi9jb25uZWN0IiwgRml4dHVyZSwgTlVMTCwgc2V0dXAsCisgICAgICB0ZXN0X2Nvbm5lY3QsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9yZWxheSIsIEZpeHR1cmUsIE5VTEwsIHNldHVwLAorICAgICAgdGVzdF9yZWxheSwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL2xpbWl0IiwgRml4dHVyZSwgTlVMTCwgc2V0dXAsCisgICAgICB0ZXN0X2xpbWl0LCB0ZWFyZG93bik7CisKKyAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9CmRpZmYgLS1naXQgYS9kYnVzL3Rlc3Qvc2hlbGwtdGVzdC5jIGIvZGJ1cy90ZXN0L3NoZWxsLXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDc5YTljCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L3NoZWxsLXRlc3QuYwpAQCAtMCwwICsxLDEwOSBAQAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjZGVmaW5lIERCVVNfQ09NUElMQVRJT04KKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVtb3J5Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXNoZWxsLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAordGVzdF9jb21tYW5kX2xpbmUgKGNvbnN0IGNoYXIgKmFyZzEsIC4uLikKK3sKKyAgaW50IGksIG9yaWdpbmFsX2FyZ2MsIHNoZWxsX2FyZ2M7CisgIGNoYXIgKipzaGVsbF9hcmd2OworICBjaGFyICoqb3JpZ2luYWxfYXJndjsKKyAgY2hhciAqY29tbWFuZF9saW5lLCAqdG1wOworICBEQnVzU3RyaW5nIHN0cjsKKyAgREJ1c0xpc3QgKmxpc3QgPSBOVUxMLCAqbm9kZTsKKyAgdmFfbGlzdCB2YXJfYXJnczsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIHZhX3N0YXJ0ICh2YXJfYXJncywgYXJnMSk7CisgIF9kYnVzX2xpc3RfYXBwZW5kICgmbGlzdCwgKGNoYXIgKilhcmcxKTsKKyAgZG8KKyAgICB7CisgICAgICB0bXAgPSB2YV9hcmcgKHZhcl9hcmdzLCBjaGFyICopOworICAgICAgaWYgKCF0bXApCisgICAgICAgIGJyZWFrOworICAgICAgX2RidXNfbGlzdF9hcHBlbmQgKCZsaXN0LCB0bXApOworICAgIH0gd2hpbGUgKHRtcCk7CisgIHZhX2VuZCAodmFyX2FyZ3MpOworCisgIG9yaWdpbmFsX2FyZ2MgPSBfZGJ1c19saXN0X2dldF9sZW5ndGggKCZsaXN0KTsKKyAgb3JpZ2luYWxfYXJndiA9IGRidXNfbmV3IChjaGFyICosIG9yaWdpbmFsX2FyZ2MpOworICBfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cik7CisgIGZvciAoaSA9IDAsIG5vZGUgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmbGlzdCk7IGkgPCBvcmlnaW5hbF9hcmdjICYmIG5vZGU7CisgICAgICAgaSsrLCBub2RlID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmbGlzdCwgbm9kZSkpCisgICAgeworICAgICAgb3JpZ2luYWxfYXJndltpXSA9IG5vZGUtPmRhdGE7CisgICAgICBpZiAoaSA+IDApCisgICAgICAgIF9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJnN0ciwgJyAnKTsKKyAgICAgIF9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsIG9yaWdpbmFsX2FyZ3ZbaV0pOworICAgIH0KKyAgCisgIF9kYnVzX2xpc3RfY2xlYXIgKCZsaXN0KTsKKyAgY29tbWFuZF9saW5lID0gX2RidXNfc3RyaW5nX2dldF9kYXRhICgmc3RyKTsKKyAgcHJpbnRmICgiXG5cblRlc3RpbmcgY29tbWFuZCBsaW5lICclcydcbiIsIGNvbW1hbmRfbGluZSk7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBpZiAoIV9kYnVzX3NoZWxsX3BhcnNlX2FyZ3YgKGNvbW1hbmRfbGluZSwgJnNoZWxsX2FyZ2MsICZzaGVsbF9hcmd2LCAmZXJyb3IpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIHBhcnNpbmcgY29tbWFuZCBsaW5lOiAlc1xuIiwgZXJyb3IubWVzc2FnZSA/IGVycm9yLm1lc3NhZ2UgOiAiIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKHNoZWxsX2FyZ2MgIT0gb3JpZ2luYWxfYXJnYykKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIk51bWJlciBvZiBhcmd1bWVudHMgcmV0dXJuZWQgKCVkKSBkb24ndCBtYXRjaCBvcmlnaW5hbCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgc2hlbGxfYXJnYywgb3JpZ2luYWxfYXJnYyk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9IAorICAgICAgcHJpbnRmICgiTnVtYmVyIG9mIGFyZ3VtZW50czogJWRcbiIsIHNoZWxsX2FyZ2MpOworICAgICAgZm9yIChpID0gMDsgaSA8IHNoZWxsX2FyZ2M7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIGNoYXIgKnVucXVvdGVkOworICAgICAgICAgIAorICAgICAgICAgIHVucXVvdGVkID0gX2RidXNfc2hlbGxfdW5xdW90ZSAob3JpZ2luYWxfYXJndltpXSk7CisgICAgICAgICAgaWYgKHN0cmNtcCAodW5xdW90ZWQgPyB1bnF1b3RlZCA6ICIiLAorICAgICAgICAgICAgICAgICAgICAgIHNoZWxsX2FyZ3ZbaV0gPyBzaGVsbF9hcmd2W2ldIDogIiIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwcmludGYgKCJQb3NpdGlvbiAlZCwgcmV0dXJuZWQgYXJndW1lbnQgKCVzKSBkb2VzIG5vdCBtYXRjaCBvcmlnaW5hbCAoJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGksIHNoZWxsX2FyZ3ZbaV0sIHVucXVvdGVkKTsKKyAgICAgICAgICAgICAgZGJ1c19mcmVlICh1bnF1b3RlZCk7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBkYnVzX2ZyZWUgKHVucXVvdGVkKTsKKyAgICAgICAgICBpZiAoc2hlbGxfYXJndltpXSkKKyAgICAgICAgICAgIHByaW50ZiAoIkFyZ3VtZW50ICVkID0gJXNcbiIsIGksIHNoZWxsX2FyZ3ZbaV0pOworICAgICAgICB9CisgICAgICAKKyAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKHNoZWxsX2FyZ3YpOworICAgIH0KKyAgCisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaWYgKCF0ZXN0X2NvbW1hbmRfbGluZSAoImNvbW1hbmQiLCAiLXMiLCAiLS1mb3JjZS1zaHV0ZG93biIsICJcImEgc3RyaW5nXCIiLCAiMTIzIiwgTlVMTCkKKyAgICAgIHx8ICF0ZXN0X2NvbW1hbmRfbGluZSAoImNvbW1hbmQiLCAiLXMiLCBOVUxMKQorICAgICAgfHwgIXRlc3RfY29tbWFuZF9saW5lICgiL29wdC9nbm9tZS9iaW4vc2VydmljZS1zdGFydCIsIE5VTEwpCisgICAgICB8fCAhdGVzdF9jb21tYW5kX2xpbmUgKCJncmVwIiwgIi1sIiwgIi1yIiwgIi1pIiwgIid3aGF0ZXZlciciLCAiZmlsZXMqLmMiLCBOVUxMKQorICAgICAgfHwgIXRlc3RfY29tbWFuZF9saW5lICgiL2hvbWUvYm9zdG9uL2pvaG5wL2RldmVsLWxvY2FsL2RidXMvdGVzdC90ZXN0LXNlZ2ZhdWx0IiwgTlVMTCkKKyAgICAgIHx8ICF0ZXN0X2NvbW1hbmRfbGluZSAoImxzIiwgIi1sIiwgIi1hIiwgIi0tY29sb3JzIiwgX2RidXNfZ2V0X3RtcGRpcigpLCBOVUxMKQorICAgICAgfHwgIXRlc3RfY29tbWFuZF9saW5lICgicnN5bmMtdG8tc2VydmVyIiwgTlVMTCkKKyAgICAgIHx8ICF0ZXN0X2NvbW1hbmRfbGluZSAoInRlc3Qtc2VnZmF1bHQiLCAiLS1uby1zZWdmYXVsdCIsIE5VTEwpCisgICAgICB8fCAhdGVzdF9jb21tYW5kX2xpbmUgKCJldm9sdXRpb24iLCAibWFpbHRvOnBlcGVAY3Vjby5jb20iLCBOVUxMKQorICAgICAgfHwgIXRlc3RfY29tbWFuZF9saW5lICgicnVuIiwgIlwiYSBcbiBtdWx0aWxpbmVcIiIsIE5VTEwpCisgICAgICB8fCB0ZXN0X2NvbW1hbmRfbGluZSAoImxzIiwgIlwiYSB3cm9uZyBzdHJpbmcnIiwgTlVMTCkgLyogaW52YWxpZCBjb21tYW5kIGxpbmUgKi8gKQorICAgIHJldHVybiAtMTsKKyAgCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L3NwYXduLXRlc3QuYyBiL2RidXMvdGVzdC9zcGF3bi10ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFhNTUwNQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC9zcGF3bi10ZXN0LmMKQEAgLTAsMCArMSw0NCBAQAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorCisjZGVmaW5lIERCVVNfQ09NUElMQVRJT04gLyogY2hlYXQgYW5kIHVzZSBkYnVzLXN5c2RlcHMgKi8KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zcGF3bi5oPgorI3VuZGVmIERCVVNfQ09NUElMQVRJT04KKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgdm9pZAorc2V0dXBfZnVuYyAodm9pZCAqZGF0YSkKK3sKKyAgcHJpbnRmICgiZW50ZXJpbmcgc2V0dXAgZnVuYy5cbiIpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgY2hhciAqKmFyZ3ZfY29weTsKKyAgaW50IGk7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgCisgIGlmIChhcmdjIDwgMikKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJZb3UgbmVlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSB0byBsYXVuY2guXG4iKTsKKworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBhcmd2X2NvcHkgPSBkYnVzX25ldyAoY2hhciAqLCBhcmdjKTsKKyAgZm9yIChpID0gMDsgaSA8IGFyZ2MgLSAxOyBpKyspCisgICAgYXJndl9jb3B5IFtpXSA9IGFyZ3ZbaSArIDFdOworICBhcmd2X2NvcHlbYXJnYyAtIDFdID0gTlVMTDsKKyAgCisgIGlmICghX2RidXNfc3Bhd25fYXN5bmNfd2l0aF9iYWJ5c2l0dGVyIChOVUxMLCBhcmd2X2NvcHksIE5VTEwsIHNldHVwX2Z1bmMsIE5VTEwsICZlcnJvcikpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQ291bGQgbm90IGxhdW5jaCBhcHBsaWNhdGlvbjogXCIlc1wiXG4iLAorCSAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICB9CisKKyAgZGJ1c19mcmVlKGFyZ3ZfY29weSk7CisgCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L3N5bnRheC5jIGIvZGJ1cy90ZXN0L3N5bnRheC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZGI5NjMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3Qvc3ludGF4LmMKQEAgLTAsMCArMSwyODkgQEAKKy8qIFNpbXBsZSBzYW5pdHktY2hlY2sgZm9yIEQtQnVzIHN5bnRheCB2YWxpZGF0aW9uLgorICoKKyAqIEF1dGhvcjogU2ltb24gTWNWaXR0aWUgPHNpbW9uLm1jdml0dGllQGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCDCqSAyMDEwLTIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyAqICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCisgKiBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorICogcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIERCdXNFcnJvciBlOworfSBGaXh0dXJlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZGJ1c19ib29sX3QgKCpmdW5jdGlvbikgKGNvbnN0IGNoYXIgKiwgREJ1c0Vycm9yICopOworICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqIHZhbGlkOworICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqIGludmFsaWQ7Cit9IFRlc3Q7CisKK1Rlc3QgcGF0aHMsIGludGVyZmFjZXMsIG1lbWJlcnMsIGVycm9ycywgYnVzX25hbWVzLCBzaWduYXR1cmVzLAorICAgICBzaW5nbGVfc2lnbmF0dXJlcywgc3RyaW5nczsKKworY29uc3QgY2hhciAqIGNvbnN0IHZhbGlkX3BhdGhzW10gPSB7CisgICAgIi8iLAorICAgICIvYSIsCisgICAgIi9fIiwKKyAgICAiL2EvYi9jIiwKKyAgICAiL2NvbS9leGFtcGxlLzEyMyIsCisgICAgIi9vcmcvZnJlZWRlc2t0b3AvREJ1cyIsCisgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVsZXBhdGh5L0FjY291bnRNYW5hZ2VyIiwKKyAgICBOVUxMCit9OworCitjb25zdCBjaGFyICogY29uc3QgaW52YWxpZF9wYXRoc1tdID0geworICAgICIiLAorICAgICIuIiwKKyAgICAiLy8iLAorICAgICIvYS8iLAorICAgICIvLSIsCisgICAgIi9jb20vL2V4YW1wbGUvTXlBcHAiLAorICAgICIvJCIsCisgICAgIi9ceGE5IiwgICAgICAvKiDCqSBpbiBsYXRpbi0xICovCisgICAgIi9ceGMyXHhhOSIsICAvKiDCqSBpbiBVVEYtOCAqLworICAgIE5VTEwKK307CisKK2NvbnN0IGNoYXIgKiBjb25zdCB2YWxpZF9pbnRlcmZhY2VzW10gPSB7CisgICAgImNvbS5leGFtcGxlIiwKKyAgICAiY29tLmV4YW1wbGUuYTAiLAorICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cyIsCisgICAgTlVMTAorfTsKKworY29uc3QgY2hhciAqIGNvbnN0IGludmFsaWRfaW50ZXJmYWNlc1tdID0geworICAgIiIsCisgICAgImNvbSIsCisgICAgImNvbS5leGFtcGxlLiIsCisgICAgImNvbS5leGFtcGxlLi5hMCIsCisgICAgImNvbS5leGFtcGxlLjBhIiwKKyAgICAiY29tLmV4YW1wbGUuYSQiLAorICAgICJjb20uZXhhbXBsZS5hXHhhOSIsCisgICAgImNvbS5leGFtcGxlLmFceGMyXHhhOSIsCisgICAgTlVMTAorfTsKKworY29uc3QgY2hhciAqIGNvbnN0IHZhbGlkX21lbWJlcnNbXSA9IHsKKyAgICAiXyIsCisgICAgImEiLAorICAgICJhMCIsCisgICAgIkdldEFsbCIsCisgICAgIkJhZGdlck11c2hyb29tU25ha2UiLAorICAgIE5VTEwKK307CisKK2NvbnN0IGNoYXIgKiBjb25zdCBpbnZhbGlkX21lbWJlcnNbXSA9IHsKKyAgICAiIiwKKyAgICAiLSIsCisgICAgImEtIiwKKyAgICAiMCIsCisgICAgIjBfIiwKKyAgICAiQmFkZ2VyLk11c2hyb29tIiwKKyAgICAiYSQiLAorICAgICJhXHhhOSIsCisgICAgImFceGMyXHhhOSIsCisgICAgTlVMTAorfTsKKworY29uc3QgY2hhciAqIGNvbnN0IHZhbGlkX2Vycm9yc1tdID0geworICAgICJjb20uZXhhbXBsZSIsCisgICAgImNvbS5leGFtcGxlLmEwIiwKKyAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuTmFtZUhhc05vT3duZXIiLAorICAgIE5VTEwKK307CisKK2NvbnN0IGNoYXIgKiBjb25zdCBpbnZhbGlkX2Vycm9yc1tdID0geworICAgIiIsCisgICAgImNvbSIsCisgICAgImNvbS5leGFtcGxlLiIsCisgICAgImNvbS5leGFtcGxlLi5hMCIsCisgICAgImNvbS5leGFtcGxlLjBhIiwKKyAgICAiY29tLmV4YW1wbGUuYSQiLAorICAgICJjb20uZXhhbXBsZS5hXHhhOSIsCisgICAgImNvbS5leGFtcGxlLmFceGMyXHhhOSIsCisgICAgTlVMTAorfTsKKworY29uc3QgY2hhciAqIGNvbnN0IHZhbGlkX2J1c19uYW1lc1tdID0geworICAgICJjb20uZXhhbXBsZSIsCisgICAgImNvbS5leGFtcGxlLmEwIiwKKyAgICAiY29tLmV4YW1wbGUuXyIsCisgICAgIjoxLjQyIiwKKyAgICAiOjEuMi4zLjQuNSIsCisgICAgIjpjb20uZXhhbXBsZSIsCisgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzIiwKKyAgICBOVUxMCit9OworCitjb25zdCBjaGFyICogY29uc3QgaW52YWxpZF9idXNfbmFtZXNbXSA9IHsKKyAgICIiLAorICAgICJjb20iLAorICAgICJjb20uZXhhbXBsZS4iLAorICAgICJjb20uZXhhbXBsZS4uYTAiLAorICAgICJjb20uZXhhbXBsZS4wYSIsCisgICAgImNvbS5leGFtcGxlLmE6YiIsCisgICAgImNvbS5leGFtcGxlLmFceGE5IiwKKyAgICAiY29tLmV4YW1wbGUuYVx4YzJceGE5IiwKKyAgICBOVUxMCit9OworCitjb25zdCBjaGFyICogY29uc3QgdmFsaWRfc2lnbmF0dXJlc1tdID0geworICAgICIiLAorICAgICJhe3N2fSIsCisgICAgTlVMTAorfTsKKworY29uc3QgY2hhciAqIGNvbnN0IGludmFsaWRfc2lnbmF0dXJlc1tdID0geworICAgICJhIiwKKyAgICAiYXtzX30iLAorICAgIE5VTEwKK307CisKK2NvbnN0IGNoYXIgKiBjb25zdCB2YWxpZF9zaW5nbGVfc2lnbmF0dXJlc1tdID0geworICAgICJzIiwKKyAgICAiYXtzdn0iLAorICAgIE5VTEwKK307CisKK2NvbnN0IGNoYXIgKiBjb25zdCBpbnZhbGlkX3NpbmdsZV9zaWduYXR1cmVzW10gPSB7CisgICAgIiIsCisgICAgImEiLAorICAgICJzdiIsCisgICAgImF7c3Z9YXMiLAorICAgIE5VTEwKK307CisKK2NvbnN0IGNoYXIgKiBjb25zdCB2YWxpZF9zdHJpbmdzW10gPSB7CisgICAgIiIsCisgICAgIlx4YzJceGE5IiwKKyAgICBOVUxMCit9OworCitjb25zdCBjaGFyICogY29uc3QgaW52YWxpZF9zdHJpbmdzW10gPSB7CisgICAgIlx4YTkiLAorICAgIE5VTEwKK307CisKK3N0YXRpYyB2b2lkCitzZXR1cCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGFyZyBHX0dOVUNfVU5VU0VEKQoreworICBkYnVzX2Vycm9yX2luaXQgKCZmLT5lKTsKKworI2RlZmluZSBGSUxMX1RFU1QobmFtZSwgZnVuYykgXAorICBkbyB7IFwKKyAgICAobmFtZSkuZnVuY3Rpb24gPSAoZnVuYyk7IFwKKyAgICAobmFtZSkudmFsaWQgPSB2YWxpZF8gIyMgbmFtZTsgXAorICAgIChuYW1lKS5pbnZhbGlkID0gaW52YWxpZF8gIyMgbmFtZTsgXAorICB9IHdoaWxlICgwKQorCisgIEZJTExfVEVTVCAocGF0aHMsIGRidXNfdmFsaWRhdGVfcGF0aCk7CisgIEZJTExfVEVTVCAoaW50ZXJmYWNlcywgZGJ1c192YWxpZGF0ZV9pbnRlcmZhY2UpOworICBGSUxMX1RFU1QgKG1lbWJlcnMsIGRidXNfdmFsaWRhdGVfbWVtYmVyKTsKKyAgRklMTF9URVNUIChlcnJvcnMsIGRidXNfdmFsaWRhdGVfZXJyb3JfbmFtZSk7CisgIEZJTExfVEVTVCAoYnVzX25hbWVzLCBkYnVzX3ZhbGlkYXRlX2J1c19uYW1lKTsKKyAgRklMTF9URVNUIChzaWduYXR1cmVzLCBkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSk7CisgIEZJTExfVEVTVCAoc2luZ2xlX3NpZ25hdHVyZXMsIGRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlX3NpbmdsZSk7CisgIEZJTExfVEVTVCAoc3RyaW5ncywgZGJ1c192YWxpZGF0ZV91dGY4KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3ludGF4IChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgYXJnKQoreworICBjb25zdCBUZXN0ICp0ZXN0ID0gYXJnOworICBpbnQgaTsKKworICBnX2Fzc2VydCAodGVzdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKHRlc3QtPmZ1bmN0aW9uICE9IE5VTEwpOworICBnX2Fzc2VydCAodGVzdC0+dmFsaWQgIT0gTlVMTCk7CisgIGdfYXNzZXJ0ICh0ZXN0LT5pbnZhbGlkICE9IE5VTEwpOworCisgIGZvciAoaSA9IDA7IHRlc3QtPnZhbGlkW2ldICE9IE5VTEw7IGkrKykKKyAgICB7CisgICAgICBkYnVzX2Jvb2xfdCBvayA9IHRlc3QtPmZ1bmN0aW9uICh0ZXN0LT52YWxpZFtpXSwgJmYtPmUpOworCisgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZmLT5lKSkKKyAgICAgICAgZ19lcnJvciAoIiVzIHdhcyBjb25zaWRlcmVkIGludmFsaWQ6ICVzOiAlcyIsIHRlc3QtPnZhbGlkW2ldLAorICAgICAgICAgICAgZi0+ZS5uYW1lLCBmLT5lLm1lc3NhZ2UpOworCisgICAgICBpZiAoIW9rKQorICAgICAgICBnX2Vycm9yICgiJXMgd2FzIGNvbnNpZGVyZWQgaW52YWxpZCB3aXRob3V0IGFuIGVycm9yIiwgdGVzdC0+dmFsaWRbaV0pOworICAgIH0KKworICBmb3IgKGkgPSAwOyB0ZXN0LT5pbnZhbGlkW2ldICE9IE5VTEw7IGkrKykKKyAgICB7CisgICAgICBkYnVzX2Jvb2xfdCBvayA9IHRlc3QtPmZ1bmN0aW9uICh0ZXN0LT5pbnZhbGlkW2ldLCAmZi0+ZSk7CisKKyAgICAgIGlmIChvaykKKyAgICAgICAgZ19lcnJvciAoIiVzIHNob3VsZCBoYXZlIGJlZW4gY29uc2lkZXJlZCBpbnZhbGlkIiwgdGVzdC0+aW52YWxpZFtpXSk7CisKKyAgICAgIGlmICghZGJ1c19lcnJvcl9pc19zZXQgKCZmLT5lKSkKKyAgICAgICAgZ19lcnJvciAoIiVzIHNob3VsZCBoYXZlIGFuIGVycm9yIHNldCIsIHRlc3QtPmludmFsaWRbaV0pOworCisgICAgICBpZiAoIWRidXNfdmFsaWRhdGVfZXJyb3JfbmFtZSAoZi0+ZS5uYW1lLCBOVUxMKSkKKyAgICAgICAgZ19lcnJvciAoIiVzIHByb2R1Y2VkIGFuIGludmFsaWQgZXJyb3IgbmFtZTogJXMiLAorICAgICAgICAgICAgdGVzdC0+aW52YWxpZFtpXSwgZi0+ZS5uYW1lKTsKKworICAgICAgaWYgKCFkYnVzX3ZhbGlkYXRlX3V0ZjggKGYtPmUubWVzc2FnZSwgTlVMTCkpCisgICAgICAgIGdfZXJyb3IgKCIlcyBwcm9kdWNlZCBhbiBpbnZhbGlkIGVycm9yIG1lc3NhZ2U6ICVzIiwKKyAgICAgICAgICAgIHRlc3QtPmludmFsaWRbaV0sIGYtPmUubWVzc2FnZSk7CisKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmYtPmUpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3RlYXJkb3duIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgYXJnIEdfR05VQ19VTlVTRUQpCit7CisgIGRidXNfZXJyb3JfZnJlZSAoJmYtPmUpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLAorICAgIGNoYXIgKiphcmd2KQoreworICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICBnX3Rlc3RfYWRkICgiL3N5bnRheC9wYXRoIiwgRml4dHVyZSwgJnBhdGhzLCBzZXR1cCwgdGVzdF9zeW50YXgsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9zeW50YXgvaW50ZXJmYWNlIiwgRml4dHVyZSwgJmludGVyZmFjZXMsCisgICAgICBzZXR1cCwgdGVzdF9zeW50YXgsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9zeW50YXgvZXJyb3IiLCBGaXh0dXJlLCAmZXJyb3JzLAorICAgICAgc2V0dXAsIHRlc3Rfc3ludGF4LCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvc3ludGF4L21lbWJlciIsIEZpeHR1cmUsICZtZW1iZXJzLAorICAgICAgc2V0dXAsIHRlc3Rfc3ludGF4LCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvc3ludGF4L2J1cy1uYW1lIiwgRml4dHVyZSwgJmJ1c19uYW1lcywKKyAgICAgIHNldHVwLCB0ZXN0X3N5bnRheCwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL3N5bnRheC9zaWduYXR1cmUiLCBGaXh0dXJlLCAmc2lnbmF0dXJlcywKKyAgICAgIHNldHVwLCB0ZXN0X3N5bnRheCwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL3N5bnRheC9zaW5nbGUtc2lnbmF0dXJlIiwgRml4dHVyZSwgJnNpbmdsZV9zaWduYXR1cmVzLAorICAgICAgc2V0dXAsIHRlc3Rfc3ludGF4LCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvc3ludGF4L3V0ZjgiLCBGaXh0dXJlLCAmc3RyaW5ncywKKyAgICAgIHNldHVwLCB0ZXN0X3N5bnRheCwgdGVhcmRvd24pOworCisgIHJldHVybiBnX3Rlc3RfcnVuICgpOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L3Rlc3QtZXhpdC5jIGIvZGJ1cy90ZXN0L3Rlc3QtZXhpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMzU4MTgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rlc3QvdGVzdC1leGl0LmMKQEAgLTAsMCArMSw3IEBACisvKiBUaGlzIGlzIGEgcHJvY2VzcyB0aGF0IGp1c3QgZXhpdHMgd2l0aCBhIGZhaWx1cmUgY29kZSAqLworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvdGVzdC1uYW1lcy5jIGIvZGJ1cy90ZXN0L3Rlc3QtbmFtZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzM2NjM1Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L3Rlc3QtbmFtZXMuYwpAQCAtMCwwICsxLDc4IEBACisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAidGVzdC11dGlscy5oIgorCitzdGF0aWMgREJ1c0xvb3AgKmxvb3A7CisKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisgIGZwcmludGYgKHN0ZGVyciwgIioqKiB0ZXN0LW5hbWVzOiAlcyIsIG1lc3NhZ2UpOworICBleGl0ICgxKTsKK30KKworc3RhdGljIHZvaWQKK1Rlc3ROYW1lKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZXhwZWN0ZWRTdWNjZXNzKQoreworICBEQnVzRXJyb3IgZXJyb3I7CisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICAodm9pZCkgZGJ1c19idXNfcmVxdWVzdF9uYW1lIChjb25uZWN0aW9uLCBuYW1lLCAwLCAmZXJyb3IpOworICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgeworICAgICAgaWYgKGV4cGVjdGVkU3VjY2VzcykKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgYWNxdWlyaW5nIG5hbWUgJyVzJzogJXNcbiIsIG5hbWUsIGVycm9yLm1lc3NhZ2UpOworICAgICAgZWxzZQorICAgICAgICBmcHJpbnRmIChzdGRvdXQsICJFeHBlY3RlZCBFcnJvciBhY3F1aXJpbmcgbmFtZSAnJXMnOiAlc1xuIiwgbmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICBfZGJ1c192ZXJib3NlICgiKioqIEZhaWxlZCB0byBhY3F1aXJlIG5hbWUgJyVzJzogJXNcbiIsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGlmIChleHBlY3RlZFN1Y2Nlc3MpCisgICAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgZWxzZSAKKyAgICB7CisgICAgICBpZiAoIWV4cGVjdGVkU3VjY2VzcykKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVW5leHBlY3RlZCBTdWNjZXNzIGFjcXVpcmluZyBuYW1lICclcydcbiIsIG5hbWUpOworICAgICAgZWxzZQorICAgICAgICBmcHJpbnRmIChzdGRvdXQsICJTdWNjZXNzZnVsbHkgYWNxdWlyZWQgbmFtZSAnJXMnXG4iLCBuYW1lKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIqKiogTWFuYWdlZCB0byBhY3F1aXJlIG5hbWUgJyVzJ1xuIiwgbmFtZSk7CisgICAgICBpZiAoIWV4cGVjdGVkU3VjY2VzcykKKyAgICAgICAgZXhpdCAoMSk7CisgICAgfQorfQorCitpbnQKK21haW4gKGludCAgICBhcmdjLAorICAgICAgY2hhciAqKmFyZ3YpCit7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIAorICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIGNvbm5lY3Rpb24gPSBkYnVzX2J1c19nZXQgKERCVVNfQlVTX1NFU1NJT04sICZlcnJvcik7CisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiKioqIEZhaWxlZCB0byBvcGVuIGNvbm5lY3Rpb24gdG8gc3lzdGVtIGJ1czogJXNcbiIsCisgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBsb29wID0gX2RidXNfbG9vcF9uZXcgKCk7CisgIGlmIChsb29wID09IE5VTEwpCisgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKyAgCisgIGlmICghdGVzdF9jb25uZWN0aW9uX3NldHVwIChsb29wLCBjb25uZWN0aW9uKSkKKyAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgIFRlc3ROYW1lKGNvbm5lY3Rpb24sICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0IiwgVFJVRSk7CisgIFRlc3ROYW1lKGNvbm5lY3Rpb24sICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0LTIiLCBUUlVFKTsKKyAgVGVzdE5hbWUoY29ubmVjdGlvbiwgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RfMiIsIFRSVUUpOworI2lmIDAKKyAgVGVzdE5hbWUoY29ubmVjdGlvbiwgIlRlc3RfMiIsIFRSVUUpOworI2VuZGlmCisKKyAgX2RidXNfdmVyYm9zZSAoIioqKiBUZXN0IHNlcnZpY2UgbmFtZSBleGl0aW5nXG4iKTsKKyAgCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L3Rlc3Qtc2VnZmF1bHQuYyBiL2RidXMvdGVzdC90ZXN0LXNlZ2ZhdWx0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI5YTIxZgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC90ZXN0LXNlZ2ZhdWx0LmMKQEAgLTAsMCArMSwzMCBAQAorLyogVGhpcyBpcyBzaW1wbHkgYSBwcm9jZXNzIHRoYXQgc2VnZmF1bHRzICovCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWZkZWYgSEFWRV9TSUdOQUxfSAorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NFVFJMSU1JVAorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2VuZGlmCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBjaGFyICpwOyAgCisKKyNpZiBIQVZFX1NFVFJMSU1JVAorICBzdHJ1Y3QgcmxpbWl0IHIgPSB7IDAsIH07CisgIAorICBnZXRybGltaXQgKFJMSU1JVF9DT1JFLCAmcik7CisgIHIucmxpbV9jdXIgPSAwOworICBzZXRybGltaXQgKFJMSU1JVF9DT1JFLCAmcik7CisgIAorICByYWlzZSAoU0lHU0VHVik7CisjZW5kaWYKKyAgcCA9IE5VTEw7CisgICpwID0gJ2EnOworICAKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvdGVzdC1zZXJ2aWNlLmMgYi9kYnVzL3Rlc3QvdGVzdC1zZXJ2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE4MWZhMwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC90ZXN0LXNlcnZpY2UuYwpAQCAtMCwwICsxLDUwNSBAQAorI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSAidGVzdC11dGlscy5oIgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCitzdGF0aWMgREJ1c0xvb3AgKmxvb3A7CitzdGF0aWMgZGJ1c19ib29sX3QgYWxyZWFkeV9xdWl0ID0gRkFMU0U7CitzdGF0aWMgZGJ1c19ib29sX3QgaGVsbG9fZnJvbV9zZWxmX3JlcGx5X3JlY2VpdmVkID0gRkFMU0U7CisKK3N0YXRpYyB2b2lkCitxdWl0ICh2b2lkKQoreworICBpZiAoIWFscmVhZHlfcXVpdCkKKyAgICB7CisgICAgICBfZGJ1c19sb29wX3F1aXQgKGxvb3ApOworICAgICAgYWxyZWFkeV9xdWl0ID0gVFJVRTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisgIGZwcmludGYgKHN0ZGVyciwgIioqKiB0ZXN0LXNlcnZpY2U6ICVzIiwgbWVzc2FnZSk7CisgIGV4aXQgKDEpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfaGVsbG9fZnJvbV9zZWxmX3JlcGx5IChEQnVzUGVuZGluZ0NhbGwgKnBjYWxsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKQoreworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIERCdXNNZXNzYWdlICplY2hvX21lc3NhZ2UsICplY2hvX3JlcGx5ID0gTlVMTDsKKyAgREJ1c0Vycm9yIGVycm9yOworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgCisgIGludCB0eXBlOworICAKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworIAorICBjb25uZWN0aW9uID0gZGJ1c19idXNfZ2V0IChEQlVTX0JVU19TVEFSVEVSLCAmZXJyb3IpOworICBpZiAoY29ubmVjdGlvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIioqKiBGYWlsZWQgdG8gb3BlbiBjb25uZWN0aW9uIHRvIGFjdGl2YXRpbmcgbWVzc2FnZSBidXM6ICVzXG4iLAorICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBkaWUoIm5vIG1lbW9yeSIpOworICAgIH0KKworICAKKyAgZWNob19tZXNzYWdlID0gKERCdXNNZXNzYWdlICopdXNlcl9kYXRhOworICAgIAorICByZXBseSA9IGRidXNfcGVuZGluZ19jYWxsX3N0ZWFsX3JlcGx5IChwY2FsbCk7CisgICAgCisgIHR5cGUgPSBkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKHJlcGx5KTsKKyAgICAKKyAgaWYgKHR5cGUgPT0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTikKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpzOworICAgICAgcHJpbnRmICgiUmVwbHkgZnJvbSBIZWxsb0Zyb21TZWxmIHJlY2VpdmVkXG4iKTsKKyAgICAgCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAoZWNob19tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVjaG9fcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X2Vycm9yIChlY2hvX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworCisgICAgICAgICAgICBpZiAoZWNob19yZXBseSA9PSBOVUxMKQorICAgICAgICAgICAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgICAgICAgIH0gCisgICAgICBlbHNlCisgICAgICAgIHsgIAorICAgICAgICAgIGVjaG9fcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKGVjaG9fbWVzc2FnZSk7CisgICAgICAgICAgaWYgKGVjaG9fcmVwbHkgPT0gTlVMTCkKKyAgICAgICAgICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisgIAorICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChlY2hvX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgICAgICBkaWUgKCJObyBtZW1vcnkiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIGVjaG9fcmVwbHksIE5VTEwpKQorICAgICAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworICAgICAgCisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKGVjaG9fcmVwbHkpOworICAgIH0KKyAgZWxzZSBpZiAodHlwZSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgKCZlcnJvciwgcmVwbHkpOworICAgICAgcHJpbnRmICgiRXJyb3IgdHlwZSBpbiByZXBseTogJXNcbiIsIGVycm9yLm1lc3NhZ2UpOworCisgICAgICBpZiAoc3RyY21wIChlcnJvci5uYW1lLCBEQlVTX0VSUk9SX05PX01FTU9SWSkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZWNob19yZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfZXJyb3IgKGVjaG9fcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworCisgICAgICAgICAgICBpZiAoZWNob19yZXBseSA9PSBOVUxMKQorICAgICAgICAgICAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgICAgICAgICAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBlY2hvX3JlcGx5LCBOVUxMKSkKKyAgICAgICAgICAgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKworICAgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChlY2hvX3JlcGx5KTsKKyAgICAgICAgfQorICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgIH0KKyAgZWxzZQorICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJVbmV4cGVjdGVkIG1lc3NhZ2UgcmVjZWl2ZWRcbiIpOworCisgIGhlbGxvX2Zyb21fc2VsZl9yZXBseV9yZWNlaXZlZCA9IFRSVUU7CisgIAorICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChlY2hvX21lc3NhZ2UpOworICBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiAocGNhbGwpOworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworfQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK2hhbmRsZV9ydW5faGVsbG9fZnJvbV9zZWxmIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqbWVzc2FnZSkKK3sKKyAgREJ1c0Vycm9yIGVycm9yOworICBEQnVzTWVzc2FnZSAqcmVwbHksICpzZWxmX21lc3NhZ2U7CisgIERCdXNQZW5kaW5nQ2FsbCAqcGNhbGw7CisgIGNoYXIgKnM7CisKKyAgX2RidXNfdmVyYm9zZSAoInNlbmRpbmcgcmVwbHkgdG8gRWNobyBtZXRob2RcbiIpOworICAKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICAKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworCisgICAgICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICAgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKworICAgICAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgcmVwbHksIE5VTEwpKQorICAgICAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworICAgIH0KKyAgICBwcmludGYgKCJTZW5kaW5nIEhlbGxvRnJvbVNlbGZcbiIpOworCisgX2RidXNfdmVyYm9zZSAoIioqKiBTZW5kaW5nIG1lc3NhZ2UgdG8gc2VsZlxuIik7Cisgc2VsZl9tZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL1Rlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsbG9Gcm9tU2VsZiIpOworICAKKyAgaWYgKHNlbGZfbWVzc2FnZSA9PSBOVUxMKQorICAgIGRpZSAoIk5vIG1lbW9yeSIpOworICAKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5IChjb25uZWN0aW9uLCBzZWxmX21lc3NhZ2UsICZwY2FsbCwgLTEpKQorICAgIGRpZSgiTm8gbWVtb3J5Iik7CisgIAorICBkYnVzX21lc3NhZ2VfcmVmIChtZXNzYWdlKTsKKyAgaWYgKCFkYnVzX3BlbmRpbmdfY2FsbF9zZXRfbm90aWZ5IChwY2FsbCwgY2hlY2tfaGVsbG9fZnJvbV9zZWxmX3JlcGx5LCAodm9pZCAqKW1lc3NhZ2UsIE5VTEwpKQorICAgIGRpZSgiTm8gbWVtb3J5Iik7CisgICAgCisgIHByaW50ZiAoIlNlbnQgSGVsbG9Gcm9tU2VsZlxuIik7CisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAoraGFuZGxlX2VjaG8gKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UpCit7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBjaGFyICpzOworCisgIF9kYnVzX3ZlcmJvc2UgKCJzZW5kaW5nIHJlcGx5IHRvIEVjaG8gbWV0aG9kXG4iKTsKKyAgCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgCisgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKworICAgICAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisKKyAgICAgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIHJlcGx5LCBOVUxMKSkKKyAgICAgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKKyAgICB9CisKKyAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworICAKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKHJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgZGllICgiTm8gbWVtb3J5Iik7CisgIAorICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCByZXBseSwgTlVMTCkpCisgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKworICBmcHJpbnRmIChzdGRlcnIsICJFY2hvIHNlcnZpY2UgZWNob2VkIHN0cmluZzogXCIlc1wiXG4iLCBzKTsKKyAgCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgIAorICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworfQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK2hhbmRsZV9kZWxheV9lY2hvIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlKQoreworICBEQnVzRXJyb3IgZXJyb3I7CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgY2hhciAqczsKKworICBfZGJ1c192ZXJib3NlICgic2xlZXBpbmcgZm9yIGEgc2hvcnQgdGltZVxuIik7CisKKyAgX2RidXNfc2xlZXBfbWlsbGlzZWNvbmRzICg1MCk7CisKKyAgX2RidXNfdmVyYm9zZSAoInNlbmRpbmcgcmVwbHkgdG8gRGVsYXlFY2hvIG1ldGhvZFxuIik7CisgIAorICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIAorICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisKKyAgICAgIGlmIChyZXBseSA9PSBOVUxMKQorICAgICAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgICAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCByZXBseSwgTlVMTCkpCisgICAgICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisgICAgfQorCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKyAgCisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIGRpZSAoIk5vIG1lbW9yeSIpOworICAKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgcmVwbHksIE5VTEwpKQorICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisKKyAgZnByaW50ZiAoc3RkZXJyLCAiRGVsYXlFY2hvIHNlcnZpY2UgZWNob2VkIHN0cmluZzogXCIlc1wiXG4iLCBzKTsKKyAgCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgIAorICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworfQorCisKK3N0YXRpYyB2b2lkCitwYXRoX3VucmVnaXN0ZXJlZF9mdW5jIChEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgLyogY29ubmVjdGlvbiB3YXMgZmluYWxpemVkICovCit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorcGF0aF9tZXNzYWdlX2Z1bmMgKERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIGlmIChkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVjaG8iKSkKKyAgICByZXR1cm4gaGFuZGxlX2VjaG8gKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZWxheUVjaG8iKSkKKyAgICByZXR1cm4gaGFuZGxlX2RlbGF5X2VjaG8gKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeGl0IikpCisgICAgeworICAgICAgcXVpdCAoKTsKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisgICAgfQorICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbWl0Rm9vIikpCisgICAgeworICAgICAgLyogRW1pdCB0aGUgRm9vIHNpZ25hbCAqLworICAgICAgREJ1c01lc3NhZ2UgKnNpZ25hbDsKKyAgICAgIGRvdWJsZSB2X0RPVUJMRTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoImVtaXR0aW5nIHNpZ25hbCBGb29cbiIpOworICAgICAgCisgICAgICBzaWduYWwgPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvbyIpOworICAgICAgaWYgKHNpZ25hbCA9PSBOVUxMKQorICAgICAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgICAgICB2X0RPVUJMRSA9IDQyLjY7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAoc2lnbmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9ET1VCTEUsICZ2X0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIGRpZSAoIk5vIG1lbW9yeSIpOworICAKKyAgICAgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIHNpZ25hbCwgTlVMTCkpCisgICAgICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisgICAgICAKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisgICAgfQorICAgIAorICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJ1bkhlbGxvRnJvbVNlbGYiKSkKKyAgICB7CisgICAgICByZXR1cm4gaGFuZGxlX3J1bl9oZWxsb19mcm9tX3NlbGYgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICAgIH0KKyAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX21ldGhvZF9jYWxsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsbG9Gcm9tU2VsZiIpKQorICAgIHsKKyAgICAgICAgREJ1c01lc3NhZ2UgKnJlcGx5OworICAgICAgICBwcmludGYgKCJSZWNlaXZlZCB0aGUgSGVsbG9Gcm9tU2VsZiBtZXNzYWdlXG4iKTsKKyAgICAgICAgCisgICAgICAgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgICAgICAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgICAgICAgZGllICgiTm8gbWVtb3J5Iik7CisgICAgICAgIAorICAgICAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCByZXBseSwgTlVMTCkpCisgICAgICAgICAgZGllICgiTm8gbWVtb3J5Iik7CisKKyAgICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBEQnVzT2JqZWN0UGF0aFZUYWJsZQorZWNob192dGFibGUgPSB7CisgIHBhdGhfdW5yZWdpc3RlcmVkX2Z1bmMsCisgIHBhdGhfbWVzc2FnZV9mdW5jLAorICBOVUxMLAorfTsKKworCitzdGF0aWMgY29uc3QgY2hhciogZWNob19wYXRoID0gIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiA7CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorZmlsdGVyX2Z1bmMgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfTE9DQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlzY29ubmVjdGVkIikpCisgICAgeworICAgICAgcXVpdCAoKTsKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworICAgIH0KK30KKworaW50CittYWluIChpbnQgICAgYXJnYywKKyAgICAgIGNoYXIgKiphcmd2KQoreworICBEQnVzRXJyb3IgZXJyb3I7CisgIGludCByZXN1bHQ7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICBjb25zdCBjaGFyICpuYW1lOworICBkYnVzX2Jvb2xfdCBkb19mb3JrOworCisgIGlmIChhcmdjICE9IDMpCisgICAgeworICAgICAgbmFtZSA9ICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZSI7CisgICAgICBkb19mb3JrID0gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbmFtZSA9IGFyZ3ZbMV07CisjaWZuZGVmIERCVVNfV0lOCisgICAgICBkb19mb3JrID0gc3RyY21wIChhcmd2WzJdLCAiZm9yayIpID09IDA7CisjZWxzZQorICAgICAgZG9fZm9yayA9IEZBTFNFOworI2VuZGlmCisgICAgfQorCisgIC8qIFRoZSBiYXJlIG1pbmltdW0gZm9yIHNpbXVsYXRpbmcgYSBwcm9ncmFtICJkYWVtb25pemluZyI7IHRoZSBpbnRlbnQKKyAgICogaXMgdG8gdGVzdCBzZXJ2aWNlcyB3aGljaCBtb3ZlIGZyb20gYmVpbmcgbGVnYWN5IGluaXQgc2NyaXB0cyB0bworICAgKiBhY3RpdmF0ZWQgc2VydmljZXMuCisgICAqIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9NTQ1MjY3CisgICAqLworI2lmbmRlZiBEQlVTX1dJTgorICAgaWYgKGRvX2ZvcmspCisgICAgeworICAgICAgcGlkX3QgcGlkID0gZm9yayAoKTsKKyAgICAgIGlmIChwaWQgIT0gMCkKKyAgICAgICAgZXhpdCAoMCk7CisgICAgICBzbGVlcCAoMSk7CisgICAgfQorI2VuZGlmCisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBjb25uZWN0aW9uID0gZGJ1c19idXNfZ2V0IChEQlVTX0JVU19TVEFSVEVSLCAmZXJyb3IpOworICBpZiAoY29ubmVjdGlvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIioqKiBGYWlsZWQgdG8gb3BlbiBjb25uZWN0aW9uIHRvIGFjdGl2YXRpbmcgbWVzc2FnZSBidXM6ICVzXG4iLAorICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgbG9vcCA9IF9kYnVzX2xvb3BfbmV3ICgpOworICBpZiAobG9vcCA9PSBOVUxMKQorICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisgIAorICBpZiAoIXRlc3RfY29ubmVjdGlvbl9zZXR1cCAobG9vcCwgY29ubmVjdGlvbikpCisgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfZnVuYywgTlVMTCwgTlVMTCkpCisgICAgZGllICgiTm8gbWVtb3J5Iik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfb2JqZWN0X3BhdGggKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZWNob192dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopIDB4ZGVhZGJlZWYpKQorICAgIGRpZSAoIk5vIG1lbW9yeSIpOworCisgIHsKKyAgICB2b2lkICpkOworICAgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9vYmplY3RfcGF0aF9kYXRhIChjb25uZWN0aW9uLCBlY2hvX3BhdGgsICZkKSkKKyAgICAgIGRpZSAoIk5vIG1lbW9yeSIpOworICAgIGlmIChkICE9ICh2b2lkKikgMHhkZWFkYmVlZikKKyAgICAgIGRpZSAoImRidXNfY29ubmVjdGlvbl9nZXRfb2JqZWN0X3BhdGhfZGF0YSgpIGRvZXNuJ3Qgc2VlbSB0byB3b3JrIHJpZ2h0XG4iKTsKKyAgfQorCisgIHJlc3VsdCA9IGRidXNfYnVzX3JlcXVlc3RfbmFtZSAoY29ubmVjdGlvbiwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAmZXJyb3IpOworICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgJXNcbiIsIGVycm9yLm1lc3NhZ2UpOworICAgICAgX2RidXNfdmVyYm9zZSAoIioqKiBGYWlsZWQgdG8gYWNxdWlyZSBzZXJ2aWNlOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChyZXN1bHQgIT0gREJVU19SRVFVRVNUX05BTUVfUkVQTFlfUFJJTUFSWV9PV05FUikKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJVbmFibGUgdG8gYWNxdWlyZSBzZXJ2aWNlOiBjb2RlICVkXG4iLCByZXN1bHQpOworICAgICAgX2RidXNfdmVyYm9zZSAoIioqKiBGYWlsZWQgdG8gYWNxdWlyZSBzZXJ2aWNlOiAlZFxuIiwgcmVzdWx0KTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiKioqIFRlc3Qgc2VydmljZSBlbnRlcmluZyBtYWluIGxvb3BcbiIpOworICBfZGJ1c19sb29wX3J1biAobG9vcCk7CisgIAorICB0ZXN0X2Nvbm5lY3Rpb25fc2h1dGRvd24gKGxvb3AsIGNvbm5lY3Rpb24pOworCisgIGRidXNfY29ubmVjdGlvbl9yZW1vdmVfZmlsdGVyIChjb25uZWN0aW9uLCBmaWx0ZXJfZnVuYywgTlVMTCk7CisgIAorICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2xvb3BfdW5yZWYgKGxvb3ApOworICBsb29wID0gTlVMTDsKKyAgCisgIGRidXNfc2h1dGRvd24gKCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIioqKiBUZXN0IHNlcnZpY2UgZXhpdGluZ1xuIik7CisgIAorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RidXMvdGVzdC90ZXN0LXNoZWxsLXNlcnZpY2UuYyBiL2RidXMvdGVzdC90ZXN0LXNoZWxsLXNlcnZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmE4ODMyCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L3Rlc3Qtc2hlbGwtc2VydmljZS5jCkBAIC0wLDAgKzEsMjAzIEBACisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlICJ0ZXN0LXV0aWxzLmgiCisKK3N0YXRpYyBEQnVzTG9vcCAqbG9vcDsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBhbHJlYWR5X3F1aXQgPSBGQUxTRTsKK3N0YXRpYyBjb25zdCBjaGFyKiBlY2hvX3BhdGggPSAiL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUiOworCit0eXBlZGVmIHN0cnVjdAoreworICBpbnQgYXJnYzsKKyAgY2hhciAqKmFyZ3Y7Cit9IEVjaG9EYXRhOworCitzdGF0aWMgdm9pZAorcXVpdCAodm9pZCkKK3sKKyAgaWYgKCFhbHJlYWR5X3F1aXQpCisgICAgeworICAgICAgX2RidXNfbG9vcF9xdWl0IChsb29wKTsKKyAgICAgIGFscmVhZHlfcXVpdCA9IFRSVUU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorZGllIChjb25zdCBjaGFyICptZXNzYWdlKQoreworICBmcHJpbnRmIChzdGRlcnIsICIqKiogdGVzdC1zZXJ2aWNlOiAlcyIsIG1lc3NhZ2UpOworICBleGl0ICgxKTsKK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitoYW5kbGVfZWNobyAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqbWVzc2FnZSkKK3sKKyAgREJ1c0Vycm9yIGVycm9yOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIERCdXNNZXNzYWdlSXRlciBpdGVyOworICBpbnQgaTsKKyAgRWNob0RhdGEgKmQ7CisKKyAgX2RidXNfdmVyYm9zZSAoInNlbmRpbmcgcmVwbHkgdG8gRWNobyBtZXRob2RcbiIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9vYmplY3RfcGF0aF9kYXRhIChjb25uZWN0aW9uLCBlY2hvX3BhdGgsICh2b2lkICoqKSZkKSkKKyAgICAgIGRpZSAoIk5vIG1lbW9yeSIpOworCisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKyAgCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChyZXBseSwgJml0ZXIpOworICBmb3IgKGkgPSAwOyBpIDwgZC0+YXJnYzsgKytpKQorICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmaXRlciwgREJVU19UWVBFX1NUUklORywgJihkLT5hcmd2W2ldKSkpCisgICAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIHJlcGx5LCBOVUxMKSkKKyAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgIGZwcmludGYgKHN0ZGVyciwgIlNoZWxsIGVjaG8gc2VydmljZSBlY2hvZWQgdGhlIGNvbW1hbmQgbGluZVxuIik7CisgIAorICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQKK3BhdGhfdW5yZWdpc3RlcmVkX2Z1bmMgKERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqdXNlcl9kYXRhKQoreworICAvKiBjb25uZWN0aW9uIHdhcyBmaW5hbGl6ZWQgKi8KK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitwYXRoX21lc3NhZ2VfZnVuYyAoREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgaWYgKGRidXNfbWVzc2FnZV9pc19tZXRob2RfY2FsbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWNobyIpKQorICAgIHJldHVybiBoYW5kbGVfZWNobyAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9pc19tZXRob2RfY2FsbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4aXQiKSkKKyAgICB7CisgICAgICBxdWl0ICgpOworICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBEQnVzT2JqZWN0UGF0aFZUYWJsZQorZWNob192dGFibGUgPSB7CisgIHBhdGhfdW5yZWdpc3RlcmVkX2Z1bmMsCisgIHBhdGhfbWVzc2FnZV9mdW5jLAorICBOVUxMLAorfTsKKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitmaWx0ZXJfZnVuYyAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgaWYgKGRidXNfbWVzc2FnZV9pc19zaWduYWwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9MT0NBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXNjb25uZWN0ZWQiKSkKKyAgICB7CisgICAgICBxdWl0ICgpOworICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisgICAgfQorfQorCitpbnQKK21haW4gKGludCAgICBhcmdjLAorICAgICAgY2hhciAqKmFyZ3YpCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICBEQnVzRXJyb3IgZXJyb3I7CisgIEVjaG9EYXRhIGVjaG9fZGF0YTsKKyAgaW50IHJlc3VsdDsKKyAgCisgIGVjaG9fZGF0YS5hcmdjID0gYXJnYzsKKyAgZWNob19kYXRhLmFyZ3YgPSBhcmd2OworICAKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBjb25uZWN0aW9uID0gZGJ1c19idXNfZ2V0IChEQlVTX0JVU19TVEFSVEVSLCAmZXJyb3IpOworICBpZiAoY29ubmVjdGlvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIioqKiBGYWlsZWQgdG8gb3BlbiBjb25uZWN0aW9uIHRvIGFjdGl2YXRpbmcgbWVzc2FnZSBidXM6ICVzXG4iLAorICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgbG9vcCA9IF9kYnVzX2xvb3BfbmV3ICgpOworICBpZiAobG9vcCA9PSBOVUxMKQorICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisgIAorICBpZiAoIXRlc3RfY29ubmVjdGlvbl9zZXR1cCAobG9vcCwgY29ubmVjdGlvbikpCisgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfZnVuYywgTlVMTCwgTlVMTCkpCisgICAgZGllICgiTm8gbWVtb3J5Iik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfb2JqZWN0X3BhdGggKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZWNob192dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopICZlY2hvX2RhdGEpKQorICAgIGRpZSAoIk5vIG1lbW9yeSIpOworCisgIHsKKyAgICB2b2lkICpkOworICAgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9vYmplY3RfcGF0aF9kYXRhIChjb25uZWN0aW9uLCBlY2hvX3BhdGgsICZkKSkKKyAgICAgIGRpZSAoIk5vIG1lbW9yeSIpOworICAgIGlmIChkICE9ICh2b2lkKikgJmVjaG9fZGF0YSkKKyAgICAgIGRpZSAoImRidXNfY29ubmVjdGlvbl9nZXRfb2JqZWN0X3BhdGhfZGF0YSgpIGRvZXNuJ3Qgc2VlbSB0byB3b3JrIHJpZ2h0XG4iKTsKKyAgfQorICAKKyAgcmVzdWx0ID0gZGJ1c19idXNfcmVxdWVzdF9uYW1lIChjb25uZWN0aW9uLCAib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZVN1Y2Nlc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICZlcnJvcik7CisgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciAlc1xuIiwgZXJyb3IubWVzc2FnZSk7CisgICAgICBfZGJ1c192ZXJib3NlICgiKioqIEZhaWxlZCB0byBhY3F1aXJlIHNlcnZpY2U6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKHJlc3VsdCAhPSBEQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9QUklNQVJZX09XTkVSKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlVuYWJsZSB0byBhY3F1aXJlIHNlcnZpY2U6IGNvZGUgJWRcbiIsIHJlc3VsdCk7CisgICAgICBfZGJ1c192ZXJib3NlICgiKioqIEZhaWxlZCB0byBhY3F1aXJlIHNlcnZpY2U6ICVkXG4iLCByZXN1bHQpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCIqKiogVGVzdCBzZXJ2aWNlIGVudGVyaW5nIG1haW4gbG9vcFxuIik7CisgIF9kYnVzX2xvb3BfcnVuIChsb29wKTsKKworICB0ZXN0X2Nvbm5lY3Rpb25fc2h1dGRvd24gKGxvb3AsIGNvbm5lY3Rpb24pOworCisgIGRidXNfY29ubmVjdGlvbl9yZW1vdmVfZmlsdGVyIChjb25uZWN0aW9uLCBmaWx0ZXJfZnVuYywgTlVMTCk7CisgIAorICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2xvb3BfdW5yZWYgKGxvb3ApOworICBsb29wID0gTlVMTDsKKyAgCisgIGRidXNfc2h1dGRvd24gKCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIioqKiBUZXN0IHNlcnZpY2UgZXhpdGluZ1xuIik7CisgIAorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RidXMvdGVzdC90ZXN0LXNsZWVwLWZvcmV2ZXIuYyBiL2RidXMvdGVzdC90ZXN0LXNsZWVwLWZvcmV2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTQ3NjlhCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L3Rlc3Qtc2xlZXAtZm9yZXZlci5jCkBAIC0wLDAgKzEsMjIgQEAKKy8qIFRoaXMgaXMgYSBwcm9jZXNzIHRoYXQganVzdCBzbGVlcHMgaW5maW5pdGVseS4gKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaWZkZWYgREJVU19XSU4KKyMgaW5jbHVkZSA8d2luZG93cy5oPgorIyBkZWZpbmUgc2xlZXAgU2xlZXAKKyNlbmRpZgorCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICB3aGlsZSAoMSkKKyAgICBzbGVlcCAoMTAwMDAwMDApOworCisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy90ZXN0L3Rlc3QtdXRpbHMuYyBiL2RidXMvdGVzdC90ZXN0LXV0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNjM2VkMwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdGVzdC90ZXN0LXV0aWxzLmMKQEAgLTAsMCArMSwzMTUgQEAKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJ0ZXN0LXV0aWxzLmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIERCdXNMb29wICpsb29wOworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworfSBDRGF0YTsKKworc3RhdGljIGRidXNfYm9vbF90CithZGRfd2F0Y2ggKERCdXNXYXRjaCAqd2F0Y2gsCisJICAgdm9pZCAgICAgICpkYXRhKQoreworICBDRGF0YSAqY2QgPSBkYXRhOworCisgIHJldHVybiBfZGJ1c19sb29wX2FkZF93YXRjaCAoY2QtPmxvb3AsIHdhdGNoKTsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV93YXRjaCAoREJ1c1dhdGNoICp3YXRjaCwKKwkgICAgICB2b2lkICAgICAgKmRhdGEpCit7CisgIENEYXRhICpjZCA9IGRhdGE7CisgIAorICBfZGJ1c19sb29wX3JlbW92ZV93YXRjaCAoY2QtPmxvb3AsIHdhdGNoKTsKK30KKworc3RhdGljIHZvaWQKK3RvZ2dsZV93YXRjaCAoREJ1c1dhdGNoICAqd2F0Y2gsCisgICAgICAgICAgICAgIHZvaWQgICAgICAgKmRhdGEpCit7CisgIENEYXRhICpjZCA9IGRhdGE7CisKKyAgX2RidXNfbG9vcF90b2dnbGVfd2F0Y2ggKGNkLT5sb29wLCB3YXRjaCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWRkX3RpbWVvdXQgKERCdXNUaW1lb3V0ICp0aW1lb3V0LAorCSAgICAgdm9pZCAgICAgICAgKmRhdGEpCit7CisgIENEYXRhICpjZCA9IGRhdGE7CisKKyAgcmV0dXJuIF9kYnVzX2xvb3BfYWRkX3RpbWVvdXQgKGNkLT5sb29wLCB0aW1lb3V0KTsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV90aW1lb3V0IChEQnVzVGltZW91dCAqdGltZW91dCwKKwkJdm9pZCAgICAgICAgKmRhdGEpCit7CisgIENEYXRhICpjZCA9IGRhdGE7CisKKyAgX2RidXNfbG9vcF9yZW1vdmVfdGltZW91dCAoY2QtPmxvb3AsIHRpbWVvdXQpOworfQorCitzdGF0aWMgdm9pZAorZGlzcGF0Y2hfc3RhdHVzX2Z1bmN0aW9uIChEQnVzQ29ubmVjdGlvbiAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Rpc3BhdGNoU3RhdHVzIG5ld19zdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICpkYXRhKQoreworICBEQnVzTG9vcCAqbG9vcCA9IGRhdGE7CisgIAorICBpZiAobmV3X3N0YXR1cyAhPSBEQlVTX0RJU1BBVENIX0NPTVBMRVRFKQorICAgIHsKKyAgICAgIHdoaWxlICghX2RidXNfbG9vcF9xdWV1ZV9kaXNwYXRjaCAobG9vcCwgY29ubmVjdGlvbikpCisgICAgICAgIF9kYnVzX3dhaXRfZm9yX21lbW9yeSAoKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitjZGF0YV9mcmVlICh2b2lkICpkYXRhKQoreworICBDRGF0YSAqY2QgPSBkYXRhOworCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY2QtPmNvbm5lY3Rpb24pOworICBfZGJ1c19sb29wX3VucmVmIChjZC0+bG9vcCk7CisgIAorICBkYnVzX2ZyZWUgKGNkKTsKK30KKworc3RhdGljIENEYXRhKgorY2RhdGFfbmV3IChEQnVzTG9vcCAgICAgICAqbG9vcCwKKyAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIENEYXRhICpjZDsKKworICBjZCA9IGRidXNfbmV3MCAoQ0RhdGEsIDEpOworICBpZiAoY2QgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBjZC0+bG9vcCA9IGxvb3A7CisgIGNkLT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKworICBkYnVzX2Nvbm5lY3Rpb25fcmVmIChjZC0+Y29ubmVjdGlvbik7CisgIF9kYnVzX2xvb3BfcmVmIChjZC0+bG9vcCk7CisKKyAgcmV0dXJuIGNkOworfQorCitkYnVzX2Jvb2xfdAordGVzdF9jb25uZWN0aW9uX3NldHVwIChEQnVzTG9vcCAgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIENEYXRhICpjZDsKKworICBjZCA9IE5VTEw7CisgIAorICBkYnVzX2Nvbm5lY3Rpb25fc2V0X2Rpc3BhdGNoX3N0YXR1c19mdW5jdGlvbiAoY29ubmVjdGlvbiwgZGlzcGF0Y2hfc3RhdHVzX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcCwgTlVMTCk7CisgIAorICBjZCA9IGNkYXRhX25ldyAobG9vcCwgY29ubmVjdGlvbik7CisgIGlmIChjZCA9PSBOVUxMKQorICAgIGdvdG8gbm9tZW07CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2V0X3dhdGNoX2Z1bmN0aW9ucyAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZV93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2QsIGNkYXRhX2ZyZWUpKQorICAgIGdvdG8gbm9tZW07CisKKworICBjZCA9IGNkYXRhX25ldyAobG9vcCwgY29ubmVjdGlvbik7CisgIGlmIChjZCA9PSBOVUxMKQorICAgIGdvdG8gbm9tZW07CisgIAorICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZXRfdGltZW91dF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZCwgY2RhdGFfZnJlZSkpCisgICAgZ290byBub21lbTsKKworICBpZiAoZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXMgKGNvbm5lY3Rpb24pICE9IERCVVNfRElTUEFUQ0hfQ09NUExFVEUpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19sb29wX3F1ZXVlX2Rpc3BhdGNoIChsb29wLCBjb25uZWN0aW9uKSkKKyAgICAgICAgZ290byBub21lbTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKKyAgCisgbm9tZW06CisgIGlmIChjZCkKKyAgICBjZGF0YV9mcmVlIChjZCk7CisgIAorICBkYnVzX2Nvbm5lY3Rpb25fc2V0X2Rpc3BhdGNoX3N0YXR1c19mdW5jdGlvbiAoY29ubmVjdGlvbiwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGRidXNfY29ubmVjdGlvbl9zZXRfd2F0Y2hfZnVuY3Rpb25zIChjb25uZWN0aW9uLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NldF90aW1lb3V0X2Z1bmN0aW9ucyAoY29ubmVjdGlvbiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIAorICByZXR1cm4gRkFMU0U7Cit9CisKK3ZvaWQKK3Rlc3RfY29ubmVjdGlvbl9zaHV0ZG93biAoREJ1c0xvb3AgICAgICAgKmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZXRfd2F0Y2hfZnVuY3Rpb25zIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzZXR0aW5nIHdhdGNoIGZ1bmN0aW9ucyB0byBOVUxMIGZhaWxlZCIpOworICAKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2V0X3RpbWVvdXRfZnVuY3Rpb25zIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNldHRpbmcgdGltZW91dCBmdW5jdGlvbnMgdG8gTlVMTCBmYWlsZWQiKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X2Rpc3BhdGNoX3N0YXR1c19mdW5jdGlvbiAoY29ubmVjdGlvbiwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIERCdXNMb29wICpsb29wOworICBEQnVzU2VydmVyICpzZXJ2ZXI7Cit9IFNlcnZlckRhdGE7CisKK3N0YXRpYyB2b2lkCitzZXJ2ZXJkYXRhX2ZyZWUgKHZvaWQgKmRhdGEpCit7CisgIFNlcnZlckRhdGEgKnNkID0gZGF0YTsKKworICBkYnVzX3NlcnZlcl91bnJlZiAoc2QtPnNlcnZlcik7CisgIF9kYnVzX2xvb3BfdW5yZWYgKHNkLT5sb29wKTsKKyAgCisgIGRidXNfZnJlZSAoc2QpOworfQorCitzdGF0aWMgU2VydmVyRGF0YSoKK3NlcnZlcmRhdGFfbmV3IChEQnVzTG9vcCAgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICBEQnVzU2VydmVyICAgICAqc2VydmVyKQoreworICBTZXJ2ZXJEYXRhICpzZDsKKworICBzZCA9IGRidXNfbmV3MCAoU2VydmVyRGF0YSwgMSk7CisgIGlmIChzZCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHNkLT5sb29wID0gbG9vcDsKKyAgc2QtPnNlcnZlciA9IHNlcnZlcjsKKworICBkYnVzX3NlcnZlcl9yZWYgKHNkLT5zZXJ2ZXIpOworICBfZGJ1c19sb29wX3JlZiAoc2QtPmxvb3ApOworCisgIHJldHVybiBzZDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithZGRfc2VydmVyX3dhdGNoIChEQnVzV2F0Y2ggICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgKmRhdGEpCit7CisgIFNlcnZlckRhdGEgKmNvbnRleHQgPSBkYXRhOworCisgIHJldHVybiBfZGJ1c19sb29wX2FkZF93YXRjaCAoY29udGV4dC0+bG9vcCwgd2F0Y2gpOworfQorCitzdGF0aWMgdm9pZAordG9nZ2xlX3NlcnZlcl93YXRjaCAoREJ1c1dhdGNoICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICpkYXRhKQoreworICBTZXJ2ZXJEYXRhICpjb250ZXh0ID0gZGF0YTsKKworICBfZGJ1c19sb29wX3RvZ2dsZV93YXRjaCAoY29udGV4dC0+bG9vcCwgd2F0Y2gpOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX3NlcnZlcl93YXRjaCAoREJ1c1dhdGNoICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICpkYXRhKQoreworICBTZXJ2ZXJEYXRhICpjb250ZXh0ID0gZGF0YTsKKyAgCisgIF9kYnVzX2xvb3BfcmVtb3ZlX3dhdGNoIChjb250ZXh0LT5sb29wLCB3YXRjaCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWRkX3NlcnZlcl90aW1lb3V0IChEQnVzVGltZW91dCAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgKmRhdGEpCit7CisgIFNlcnZlckRhdGEgKmNvbnRleHQgPSBkYXRhOworCisgIHJldHVybiBfZGJ1c19sb29wX2FkZF90aW1lb3V0IChjb250ZXh0LT5sb29wLCB0aW1lb3V0KTsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9zZXJ2ZXJfdGltZW91dCAoREJ1c1RpbWVvdXQgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICpkYXRhKQoreworICBTZXJ2ZXJEYXRhICpjb250ZXh0ID0gZGF0YTsKKyAgCisgIF9kYnVzX2xvb3BfcmVtb3ZlX3RpbWVvdXQgKGNvbnRleHQtPmxvb3AsIHRpbWVvdXQpOworfQorCitkYnVzX2Jvb2xfdAordGVzdF9zZXJ2ZXJfc2V0dXAgKERCdXNMb29wICAgICAgKmxvb3AsCisgICAgICAgICAgICAgICAgICAgREJ1c1NlcnZlciAgICAqc2VydmVyKQoreworICBTZXJ2ZXJEYXRhICpzZDsKKworICBzZCA9IHNlcnZlcmRhdGFfbmV3IChsb29wLCBzZXJ2ZXIpOworICBpZiAoc2QgPT0gTlVMTCkKKyAgICBnb3RvIG5vbWVtOworCisgIGlmICghZGJ1c19zZXJ2ZXJfc2V0X3dhdGNoX2Z1bmN0aW9ucyAoc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9zZXJ2ZXJfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX3NlcnZlcl93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVfc2VydmVyX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcmRhdGFfZnJlZSkpCisgICAgeworICAgICAgZ290byBub21lbTsKKyAgICB9CisKKyAgc2QgPSBzZXJ2ZXJkYXRhX25ldyAobG9vcCwgc2VydmVyKTsKKyAgaWYgKHNkID09IE5VTEwpCisgICAgZ290byBub21lbTsKKworICBpZiAoIWRidXNfc2VydmVyX3NldF90aW1lb3V0X2Z1bmN0aW9ucyAoc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3NlcnZlcl90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX3NlcnZlcl90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkLCBzZXJ2ZXJkYXRhX2ZyZWUpKQorICAgIHsKKyAgICAgIGdvdG8gbm9tZW07CisgICAgfSAgIAorICByZXR1cm4gVFJVRTsKKworIG5vbWVtOgorICBpZiAoc2QpCisgICAgc2VydmVyZGF0YV9mcmVlIChzZCk7CisgIAorICB0ZXN0X3NlcnZlcl9zaHV0ZG93biAobG9vcCwgc2VydmVyKTsKKyAgCisgIHJldHVybiBGQUxTRTsKK30KKwordm9pZAordGVzdF9zZXJ2ZXJfc2h1dGRvd24gKERCdXNMb29wICAgICAgICAgKmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c1NlcnZlciAgICAgICAqc2VydmVyKQoreworICBkYnVzX3NlcnZlcl9kaXNjb25uZWN0IChzZXJ2ZXIpOworCisgIGlmICghZGJ1c19zZXJ2ZXJfc2V0X3dhdGNoX2Z1bmN0aW9ucyAoc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzZXR0aW5nIHdhdGNoIGZ1bmN0aW9ucyB0byBOVUxMIGZhaWxlZCIpOworICAKKyAgaWYgKCFkYnVzX3NlcnZlcl9zZXRfdGltZW91dF9mdW5jdGlvbnMgKHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2V0dGluZyB0aW1lb3V0IGZ1bmN0aW9ucyB0byBOVUxMIGZhaWxlZCIpOyAgCit9CmRpZmYgLS1naXQgYS9kYnVzL3Rlc3QvdGVzdC11dGlscy5oIGIvZGJ1cy90ZXN0L3Rlc3QtdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTFlNTVlCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L3Rlc3QtdXRpbHMuaApAQCAtMCwwICsxLDI1IEBACisjaWZuZGVmIFRFU1RfVVRJTFNfSAorI2RlZmluZSBURVNUX1VUSUxTX0gKKyNpZm5kZWYgREJVU19DT01QSUxBVElPTgorI2RlZmluZSBEQlVTX0NPTVBJTEFUSU9OIC8qIENoZWF0IGFuZCB1c2UgcHJpdmF0ZSBzdHVmZiAqLworI2VuZGlmCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFpbmxvb3AuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjdW5kZWYgREJVU19DT01QSUxBVElPTgorCitkYnVzX2Jvb2xfdCB0ZXN0X2Nvbm5lY3Rpb25fc2V0dXAgICAgICAgICAgICAgICAgIChEQnVzTG9vcCAgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK3ZvaWQgICAgICAgIHRlc3RfY29ubmVjdGlvbl9zaHV0ZG93biAgICAgICAgICAgICAgKERCdXNMb29wICAgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOwordm9pZCAgICAgICAgdGVzdF9jb25uZWN0aW9uX2Rpc3BhdGNoX2FsbF9tZXNzYWdlcyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworZGJ1c19ib29sX3QgdGVzdF9jb25uZWN0aW9uX2Rpc3BhdGNoX29uZV9tZXNzYWdlICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCitkYnVzX2Jvb2xfdCB0ZXN0X3NlcnZlcl9zZXR1cCAgICAgICAgICAgICAgICAgICAgIChEQnVzTG9vcCAgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NlcnZlciAgICAqc2VydmVyKTsKK3ZvaWQgICAgICAgIHRlc3Rfc2VydmVyX3NodXRkb3duICAgICAgICAgICAgICAgICAgKERCdXNMb29wICAgICAgKmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU2VydmVyICAgICpzZXJ2ZXIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RidXMvdGVzdC91bnVzZWQtY29kZS1nYy5weSBiL2RidXMvdGVzdC91bnVzZWQtY29kZS1nYy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNTg1OTdmCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90ZXN0L3VudXNlZC1jb2RlLWdjLnB5CkBAIC0wLDAgKzEsMjQyIEBACisjISAvdXNyL2Jpbi9weXRob24KKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgc3RyaW5nCitpbXBvcnQgcmUKKworIyMgaGFzaCBmcm9tIHN5bWJvbCBuYW1lIHRvIGxpc3Qgb2Ygc3ltYm9scyB3aXRoIHRoYXQgbmFtZSwKKyMjIHdoZXJlIHRoZSBsaXN0IG9mIHN5bWJvbHMgY29udGFpbnMgYSBsaXN0IHJlcHJlc2VudGluZyBlYWNoIHN5bWJvbAorc3ltYm9scyA9IHt9Cityb290cyA9IHt9CisKK2RlZiBjcmVhdGVCYWNrbGlua3MobmFtZSwgc3ltcyk6CisgICAgZm9yIHMgaW4gc3ltczoKKyAgICAgICAgcmVmcyA9IHNbMl0KKyAgICAgICAgZm9yIHIgaW4gcmVmczoKKyAgICAgICAgICAgICMjIGZvciBlYWNoIHJlZiwgYWRkIG91cnNlbHZlcyBhcyBhIHJlZmVyZW5jZXIKKyAgICAgICAgICAgIGlmIHN5bWJvbHMuaGFzX2tleShyKToKKyAgICAgICAgICAgICAgICB0YXJnZXRzID0gc3ltYm9sc1tyXQorICAgICAgICAgICAgICAgIGZvciB0IGluIHRhcmdldHM6CisgICAgICAgICAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIHRbNV06CisgICAgICAgICAgICAgICAgICAgICAgICB0WzVdLmFwcGVuZChuYW1lKQorCitkZWYgbWFya1N5bWJvbChmcm0sIG5hbWUpOgorICAgIGlmIG5vdCBzeW1ib2xzLmhhc19rZXkobmFtZSk6CisgICAgICAgIHByaW50ICIlcyByZWZlcmVuY2VkIGJ1dCB3YXMgbm90IGluIHRoZSBvYmpkdW1wIgorICAgIHN5bXMgPSBzeW1ib2xzW25hbWVdCisgICAgIyMgcHJpbnQgYW1iaWd1b3VzIHJlZmVyZW5jZXMgdW5sZXNzIHRoZXkgYXJlIGludGVybmFsIG5vaXNlIGxpa2UgIi5MMTI5IgorICAgIGlmIGxlbihzeW1zKSA+IDEgYW5kIG5hbWVbMF0gIT0gJy4nOgorICAgICAgICBwcmludCAiUmVmZXJlbmNlIHRvIHN5bWJvbCAnJXMnIGZyb20gJyVzJyBpcyBhbWJpZ3VvdXMsIG1hcmtpbmcgYWxsICclcyciICUgKG5hbWUsIGZybSwgbmFtZSkKKyAgICAgICAgcHJpbnQgc3ltcworICAgIGZvciBzIGluIHN5bXM6CisgICAgICAgIGlmIHNbNF06CisgICAgICAgICAgICBwYXNzICMjIGFscmVhZHkgbWFya2VkCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzWzRdID0gMQorICAgICAgICAgICAgcmVmcyA9IHNbMl0KKyAgICAgICAgICAgIGZvciByIGluIHJlZnM6CisgICAgICAgICAgICAgICAgbWFya1N5bWJvbChzWzBdLCByKQorCitkZWYgY21wRmlsZW5hbWUoYSwgYik6CisgICAgdiA9IGNtcChhWzFdLCBiWzFdKQorICAgIGlmIHYgPT0gMDoKKyAgICAgICAgdiA9IGNtcChhWzBdLCBiWzBdKQorICAgIHJldHVybiB2CisKK2RlZiBzaXplQXNTdHJpbmcoYnl0ZXMpOgorICAgIGlmIGJ5dGVzIDwgMTAyNDoKKyAgICAgICAgcmV0dXJuICIlZCBieXRlcyIgJSBieXRlcworICAgIGVsaWYgYnl0ZXMgPCAxMDI0KjEwMjQ6CisgICAgICAgIHJldHVybiAiJS4yZ0siICUgKGJ5dGVzIC8gMTAyNC4wKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiAiJS4yZ00iICUgKGJ5dGVzIC8gMTAyNC4wIC8gMTAyNC4wKQorCitkZWYgcHJpbnRMb3N0KCk6CisgICAgbGlzdCA9IFtdCisgICAgZmlsZW5hbWUgPSBOb25lCisgICAgZm9yIChuYW1lLCBzeW1zKSBpbiBzeW1ib2xzLml0ZW1zKCk6CisgICAgICAgIHMgPSBzeW1zWzBdICMjIHdlIGFsd2F5cyBtYXJrIGFsbCBvciBub25lIGZvciBub3cKKyAgICAgICAgaWYgbm90IHNbNF0gYW5kIG5hbWVbMF0gIT0gJy4nOiAjIyBza2lwIC5MMTI5IHR5cGUgc3ltYm9scworICAgICAgICAgICAgZmlsZW5hbWUgPSBzWzNdCisgICAgICAgICAgICBpZiBub3QgZmlsZW5hbWU6CisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSAidW5rbm93biBmaWxlIgorICAgICAgICAgICAgbGlzdC5hcHBlbmQgKChuYW1lLCBmaWxlbmFtZSwgc1s1XSwgc1s3XSkpCisKKyAgICBmaWxlX3N1bW1hcmllcyA9IFtdCisgICAgdG90YWxfdW51c2VkID0gMAorICAgIHRvdGFsX3RoaXNfZmlsZSA9IDAKKyAgICBmaWxlbmFtZSA9IE5vbmUKKyAgICBsaXN0LnNvcnQoY21wRmlsZW5hbWUpCisgICAgZm9yIGwgaW4gbGlzdDoKKyAgICAgICAgbmV4dF9maWxlbmFtZSA9IGxbMV0KKyAgICAgICAgaWYgbmV4dF9maWxlbmFtZSAhPSBmaWxlbmFtZToKKyAgICAgICAgICAgIGlmIHRvdGFsX3RoaXNfZmlsZSA+IDA6CisgICAgICAgICAgICAgICAgZmlsZV9zdW1tYXJpZXMuYXBwZW5kICgiICAlcyBtYXkgYmUgdW51c2VkIGluICVzIiAlIChzaXplQXNTdHJpbmcodG90YWxfdGhpc19maWxlKSwgZmlsZW5hbWUpKQorICAgICAgICAgICAgcHJpbnQgIiVzIGhhcyB0aGVzZSBzeW1ib2xzIG5vdCByZWFjaGFibGUgZnJvbSBleHBvcnRlZCBzeW1ib2xzOiIgJSBuZXh0X2ZpbGVuYW1lCisgICAgICAgICAgICBmaWxlbmFtZSA9IG5leHRfZmlsZW5hbWUKKyAgICAgICAgICAgIHRvdGFsX3RoaXNfZmlsZSA9IDAKKyAgICAgICAgcHJpbnQgIiAgICAlcyAlcyIgJSAobFswXSwgc2l6ZUFzU3RyaW5nKGxbM10pKQorICAgICAgICB0b3RhbF91bnVzZWQgPSB0b3RhbF91bnVzZWQgKyBsWzNdCisgICAgICAgIHRvdGFsX3RoaXNfZmlsZSA9IHRvdGFsX3RoaXNfZmlsZSArIGxbM10KKyAgICAgICAgZm9yIHRyYWNlIGluIGxbMl06CisgICAgICAgICAgICBwcmludCAiICAgICAgIHJlZmVyZW5jZWQgZnJvbSAlcyIgJSB0cmFjZQorCisgICAgZm9yIGZzIGluIGZpbGVfc3VtbWFyaWVzOgorICAgICAgICBwcmludCBmcworICAgIHByaW50ICIlcyB0b3RhbCBtYXkgYmUgdW51c2VkIiAlIHNpemVBc1N0cmluZyh0b3RhbF91bnVzZWQpCisKK2RlZiBtYWluKCk6CisKKyAgICAjIyAwMDAxYWE0NCA8X2RidXNfbWVzc2FnZV9nZXRfbmV0d29ya19kYXRhPjoKKyAgICBzeW1fcmUgPSByZS5jb21waWxlICgnKFswLTlhLWZdKykgPChbXj5dKyk+OicpCisgICAgIyMgMWFhNDk6ICAgICAgIGU4IDAwIDAwIDAwIDAwICAgICAgICAgIGNhbGwgICAxYWE0ZSA8X2RidXNfbWVzc2FnZV9nZXRfbmV0d29ya19kYXRhKzB4YT4KKyAgICByZWZfcmUgPSByZS5jb21waWxlICgnIDwoW14+XSspPiAqJCcpCisgICAgIyMgL2hvbWUvaHAvZGJ1cy1jdnMvZGJ1cy9kYnVzL2RidXMtbWVzc2FnZS5jOjEzOQorICAgIGZpbGVfcmUgPSByZS5jb21waWxlICgnXihcL1teOl0uKik6WzAtOV0rJCcpCisgICAgIyMgX2RidXNfbWVzc2FnZV9nZXRfbmV0d29ya19kYXRhKzB4YQorICAgIGZ1bmNuYW1lX3JlID0gcmUuY29tcGlsZSAoJyhbXitdKylcK1swLTlhLWZ4XSsnKQorICAgICMjIDAwMDA1NDEwIFQgZGJ1c19hZGRyZXNzX2VudHJpZXNfZnJlZQorICAgIGR5bnN5bV9yZSA9IHJlLmNvbXBpbGUgKCdUIChbXiBcbl0rKSQnKQorICAgIAorICAgIGZpbGVuYW1lID0gc3lzLmFyZ3ZbMV0KKworICAgIGNvbW1hbmQgPSAiIiIKKyAgICBvYmpkdW1wIC1EIC0tZGVtYW5nbGUgLWwgJXMKKyAgICAiIiIgJSBmaWxlbmFtZQorCisgICAgY29tbWFuZCA9IHN0cmluZy5zdHJpcCAoY29tbWFuZCkKKworICAgIHByaW50ICJSdW5uaW5nOiAlcyIgJSBjb21tYW5kCisgICAgCisgICAgZiA9IG9zLnBvcGVuKGNvbW1hbmQpICAgIAorCisgICAgIyMgZmlyc3Qgd2UgZmluZCB3aGljaCBmdW5jdGlvbnMgcmVmZXJlbmNlIHdoaWNoIG90aGVyIGZ1bmN0aW9ucworICAgIGN1cnJlbnRfc3ltID0gTm9uZQorICAgIGxpbmVzID0gZi5yZWFkbGluZXMoKQorICAgIGZvciBsIGluIGxpbmVzOgorICAgICAgICBhZGRyID0gTm9uZQorICAgICAgICBuYW1lID0gTm9uZQorICAgICAgICB0YXJnZXQgPSBOb25lCisgICAgICAgIGZpbGUgPSBOb25lCisgICAgICAgIAorICAgICAgICBtYXRjaCA9IHN5bV9yZS5tYXRjaChsKQorICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgIGFkZHIgPSBtYXRjaC5ncm91cCgxKQorICAgICAgICAgICAgbmFtZSA9IG1hdGNoLmdyb3VwKDIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtYXRjaCA9IHJlZl9yZS5zZWFyY2gobCkKKyAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgICAgIHRhcmdldCA9IG1hdGNoLmdyb3VwKDEpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1hdGNoID0gZmlsZV9yZS5tYXRjaChsKQorICAgICAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgICAgICAgICBmaWxlID0gbWF0Y2guZ3JvdXAoMSkKKworICAgICAgICBpZiBuYW1lOgorICAgICAgICAgICAgIyMgMCBzeW1uYW1lLCAxIGFkZHJlc3MsIDIgcmVmZXJlbmNlcywgMyBmaWxlbmFtZSwgNCByZWFjaGVkLCA1IHJlZmVyZW5jZWQtYnkgNiBiYWNrbGlua2VkIDcgYXBwcm94IHNpemUKKyAgICAgICAgICAgIGl0ZW0gPSBbbmFtZSwgYWRkciwgW10sIE5vbmUsIDAsIFtdLCAwLCAwXQorICAgICAgICAgICAgaWYgc3ltYm9scy5oYXNfa2V5KG5hbWUpOgorICAgICAgICAgICAgICAgIHN5bWJvbHNbbmFtZV0uYXBwZW5kKGl0ZW0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN5bWJvbHNbbmFtZV0gPSBbaXRlbV0KKworICAgICAgICAgICAgaWYgY3VycmVudF9zeW06CisgICAgICAgICAgICAgICAgcHJldl9hZGRyID0gbG9uZyhjdXJyZW50X3N5bVsxXSwgMTYpCisgICAgICAgICAgICAgICAgb3VyX2FkZHIgPSBsb25nKGl0ZW1bMV0sIDE2KQorICAgICAgICAgICAgICAgIGl0ZW1bN10gPSBvdXJfYWRkciAtIHByZXZfYWRkcgorICAgICAgICAgICAgICAgIGlmIGl0ZW1bN10gPCAwOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiQ29tcHV0ZWQgbmVnYXRpdmUgc2l6ZSAlZCBmb3IgJXMiICUgKGl0ZW1bN10sIGl0ZW1bMF0pCisgICAgICAgICAgICAgICAgICAgIGl0ZW1bN10gPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBjdXJyZW50X3N5bSA9IGl0ZW0KKyAgICAgICAgICAgIAorICAgICAgICBlbGlmIHRhcmdldCBhbmQgY3VycmVudF9zeW06CisgICAgICAgICAgICBtYXRjaCA9IGZ1bmNuYW1lX3JlLm1hdGNoKHRhcmdldCkKKyAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgICAgICMjIGR1bXAgdGhlICIrYWRkcmVzcyIKKyAgICAgICAgICAgICAgICB0YXJnZXQgPSBtYXRjaC5ncm91cCgxKQorICAgICAgICAgICAgaWYgdGFyZ2V0ID09IGN1cnJlbnRfc3ltWzBdOgorICAgICAgICAgICAgICAgIHBhc3MgIyMgc2tpcCBzZWxmLXJlZmVyZW5jZXMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY3VycmVudF9zeW1bMl0uYXBwZW5kICh0YXJnZXQpCisKKyAgICAgICAgZWxpZiBmaWxlIGFuZCBjdXJyZW50X3N5bToKKyAgICAgICAgICAgIGlmIGZpbGUuc3RhcnRzd2l0aCgnL3Vzci9pbmNsdWRlJyk6CisgICAgICAgICAgICAgICAgIyMgaW5saW5lZCBsaWJjIHRoaW5neQorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsaWYgY3VycmVudF9zeW1bMF0uc3RhcnRzd2l0aCgnLmRlYnVnJyk6CisgICAgICAgICAgICAgICAgIyMgZGVidWcgaW5mbworICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsaWYgY3VycmVudF9zeW1bM10gYW5kIGN1cnJlbnRfc3ltWzNdICE9IGZpbGU6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uICgiJXMgaW4gYm90aCAlcyBhbmQgJXMiICUgKGN1cnJlbnRfc3ltWzBdLCBjdXJyZW50X3N5bVszXSwgZmlsZSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGN1cnJlbnRfc3ltWzNdID0gZmlsZQorCisgICAgIyMgbm93IHdlIG5lZWQgdG8gZmluZCB0aGUgcm9vdHMgKGV4cG9ydGVkIHN5bWJvbHMpCisgICAgY29tbWFuZCA9ICJubSAtRCAlcyIgJSBmaWxlbmFtZQorICAgIHByaW50ICJSdW5uaW5nOiAlcyIgJSBjb21tYW5kCisgICAgZiA9IG9zLnBvcGVuKGNvbW1hbmQpCisgICAgbGluZXMgPSBmLnJlYWRsaW5lcyAoKQorICAgIGZvciBsIGluIGxpbmVzOgorICAgICAgICBtYXRjaCA9IGR5bnN5bV9yZS5zZWFyY2gobCkKKyAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICBuYW1lID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgICAgIGlmIHJvb3RzLmhhc19rZXkobmFtZSk6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJzeW1ib2wgJXMgZXhwb3J0ZWQgdHdpY2U/IiAlIG5hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJvb3RzW25hbWVdID0gMQorCisgICAgcHJpbnQgIiVkIHN5bWJvbHMgZXhwb3J0ZWQgZnJvbSB0aGlzIG9iamVjdCIgJSBsZW4ocm9vdHMpCisKKyAgICAjIyB0aGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgb25seSBpbmRpcmVjdGx5LCBzbyB3ZSBkb24ndAorICAgICMjIG5vdGljZSB0aGV5IGFyZSB1c2VkLiBNYW51YWxseSBhZGQgdGhlbSBhcyByb290cy4uLgorICAgIHZ0YWJsZV9yb290cyA9IFsndW5peF9maW5hbGl6ZScsCisgICAgICAgICAgICAgICAgICAgICd1bml4X2hhbmRsZV93YXRjaCcsCisgICAgICAgICAgICAgICAgICAgICd1bml4X2Rpc2Nvbm5lY3QnLAorICAgICAgICAgICAgICAgICAgICAndW5peF9jb25uZWN0aW9uX3NldCcsCisgICAgICAgICAgICAgICAgICAgICd1bml4X2RvX2l0ZXJhdGlvbicsCisgICAgICAgICAgICAgICAgICAgICd1bml4X2xpdmVfbWVzc2FnZXNfY2hhbmdlZCcsCisgICAgICAgICAgICAgICAgICAgICd1bml4X2dldF91bml4X2ZkJywKKyAgICAgICAgICAgICAgICAgICAgJ2hhbmRsZV9jbGllbnRfZGF0YV9jb29raWVfc2hhMV9tZWNoJywKKyAgICAgICAgICAgICAgICAgICAgJ2hhbmRsZV9jbGllbnRfZGF0YV9leHRlcm5hbF9tZWNoJywKKyAgICAgICAgICAgICAgICAgICAgJ2hhbmRsZV9zZXJ2ZXJfZGF0YV9jb29raWVfc2hhMV9tZWNoJywKKyAgICAgICAgICAgICAgICAgICAgJ2hhbmRsZV9zZXJ2ZXJfZGF0YV9leHRlcm5hbF9tZWNoJywKKyAgICAgICAgICAgICAgICAgICAgJ2hhbmRsZV9jbGllbnRfaW5pdGlhbF9yZXNwb25zZV9jb29raWVfc2hhMV9tZWNoJywgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgJ2hhbmRsZV9jbGllbnRfaW5pdGlhbF9yZXNwb25zZV9leHRlcm5hbF9tZWNoJywKKyAgICAgICAgICAgICAgICAgICAgJ2hhbmRsZV9jbGllbnRfc2h1dGRvd25fY29va2llX3NoYTFfbWVjaCcsCisgICAgICAgICAgICAgICAgICAgICdoYW5kbGVfY2xpZW50X3NodXRkb3duX2V4dGVybmFsX21lY2gnLAorICAgICAgICAgICAgICAgICAgICAnaGFuZGxlX3NlcnZlcl9zaHV0ZG93bl9jb29raWVfc2hhMV9tZWNoJywKKyAgICAgICAgICAgICAgICAgICAgJ2hhbmRsZV9zZXJ2ZXJfc2h1dGRvd25fZXh0ZXJuYWxfbWVjaCcKKyAgICAgICAgICAgICAgICAgICAgXQorCisgICAgZm9yIHZyIGluIHZ0YWJsZV9yb290czoKKyAgICAgICAgaWYgcm9vdHMuaGFzX2tleSh2cik6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIiVzIGlzIGFscmVhZHkgYSByb290IiAlIHZyKQorICAgICAgICByb290c1t2cl0gPSAxCisKKyAgICBmb3IgayBpbiByb290cy5rZXlzKCk6CisgICAgICAgIG1hcmtTeW1ib2woInJvb3QiLCBrKQorCisgICAgZm9yIChrLCB2KSBpbiBzeW1ib2xzLml0ZW1zKCk6CisgICAgICAgIGNyZWF0ZUJhY2tsaW5rcyhrLCB2KQorCisgICAgcHJpbnQgIiIiCisKK1RoZSBzeW1ib2xzIG1lbnRpb25lZCBiZWxvdyBkb24ndCBhcHBlYXIgdG8gYmUgcmVhY2hhYmxlIHN0YXJ0aW5nIGZyb20KK3RoZSBkeW5hbWljIGV4cG9ydHMgb2YgdGhlIGxpYnJhcnkuIEhvd2V2ZXIsIHRoaXMgcHJvZ3JhbSBpcyBwcmV0dHkKK2R1bWI7IGEgbGltaXRhdGlvbiB0aGF0IGNyZWF0ZXMgZmFsc2UgcG9zaXRpdmVzIGlzIHRoYXQgaXQgY2FuIG9ubHkKK3RyYWNlICdyZWFjaGFibGUnIHRocm91Z2ggaGFyZGNvZGVkIGZ1bmN0aW9uIGNhbGxzLCBpZiBhIGZ1bmN0aW9uIGlzCitjYWxsZWQgb25seSB0aHJvdWdoIGEgdnRhYmxlLCBpdCB3b24ndCBiZSBtYXJrZWQgcmVhY2hhYmxlIChhbmQKK25laXRoZXIgd2lsbCBpdHMgY2hpbGRyZW4gaW4gdGhlIGNhbGwgZ3JhcGgpLgorCitBbHNvLCB0aGUgc2l6ZXMgbWVudGlvbmVkIGFyZSBtb3JlIG9yIGxlc3MgY29tcGxldGVseSBib2d1cy4KKworIiIiCisgICAgCisgICAgcHJpbnQgIlRoZSBmb2xsb3dpbmcgYXJlIGhhcmRjb2RlZCBpbiBhcyB2dGFibGUgcm9vdHM6ICVzIiAlIHZ0YWJsZV9yb290cworICAgIAorICAgIHByaW50TG9zdCgpCisgICAgICAgIAoraWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2RidXMvdG9vbHMvQW5kcm9pZC5tayBiL2RidXMvdG9vbHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWQzM2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90b29scy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzkgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworZGJ1c1Rvb2xzQ29tbW9uQ0ZsYWdzIDo9IFwKKwktRERCVVNfQ09NUElMQVRJT04gXAorCS1EREJVU19NQUNISU5FX1VVSURfRklMRT1cIi9ldGMvbWFjaGluZS1pZFwiIFwKKwktV25vLXVudXNlZC1wYXJhbWV0ZXIKKworIyBjb21tb24KKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBkYnVzLXByaW50LW1lc3NhZ2UuYworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkYnVzCitMT0NBTF9DRkxBR1MgKz0gJChkYnVzVG9vbHNDb21tb25DRmxhZ3MpCitMT0NBTF9NT0RVTEUgOj0gbGliZGJ1cy10b29scy1jb21tb24KK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKKworIyBkYnVzLW1vbml0b3IKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBkYnVzLW1vbml0b3IuYworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkYnVzCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYmRidXMtdG9vbHMtY29tbW9uCitMT0NBTF9DRkxBR1MgKz0gJChkYnVzVG9vbHNDb21tb25DRmxhZ3MpCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfT1BUSU9OQUxfRVhFQ1VUQUJMRVMpCitMT0NBTF9NT0RVTEUgOj0gZGJ1cy1tb25pdG9yCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworIyBkYnVzLXNlbmQKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBkYnVzLXNlbmQuYworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkYnVzCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYmRidXMtdG9vbHMtY29tbW9uCitMT0NBTF9DRkxBR1MgKz0gJChkYnVzVG9vbHNDb21tb25DRmxhZ3MpCitMT0NBTF9NT0RVTEUgOj0gZGJ1cy1zZW5kCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2RidXMvdG9vbHMvTWFrZWZpbGUuYW0gYi9kYnVzL3Rvb2xzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZDU0YjgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rvb2xzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsODAgQEAKK2NvbmZpZ2Rpcj0kKHN5c2NvbmZkaXIpL2RidXMtMQorCitBTV9DUFBGTEFHUyA9IFwKKwktSSQodG9wX3NyY2RpcikgXAorCSQoREJVU19TVEFUSUNfQlVJTERfQ1BQRkxBR1MpIFwKKwkkKERCVVNfWF9DRkxBR1MpIFwKKwktRERCVVNfQ09NUElMQVRJT04gXAorCS1EREJVU19NQUNISU5FX1VVSURfRklMRT1cIiIkKGxvY2Fsc3RhdGVkaXIpL2xpYi9kYnVzL21hY2hpbmUtaWQiXCIgXAorCSQoTlVMTCkKKworIyBpZiBhc3NlcnRpb25zIGFyZSBlbmFibGVkLCBpbXByb3ZlIGJhY2t0cmFjZXMKK0FNX0xERkxBR1MgPSBAUl9EWU5BTUlDX0xERkxBR0AKKworYmluX1BST0dSQU1TID0gXAorCWRidXMtbGF1bmNoIFwKKwlkYnVzLW1vbml0b3IgXAorCWRidXMtc2VuZCBcCisJJChOVUxMKQorCitpZiBEQlVTX1VOSVgKK2Jpbl9QUk9HUkFNUyArPSBcCisJZGJ1cy1jbGVhbnVwLXNvY2tldHMgXAorCWRidXMtdXVpZGdlbiBcCisJJChOVUxMKQorZW5kaWYKKworZGJ1c19zZW5kX1NPVVJDRVM9CQkJCVwKKwlkYnVzLXByaW50LW1lc3NhZ2UuYwkJCVwKKwlkYnVzLXByaW50LW1lc3NhZ2UuaAkJCVwKKwlkYnVzLXNlbmQuYworCitkYnVzX21vbml0b3JfU09VUkNFUz0JCQkJXAorCWRidXMtbW9uaXRvci5jCQkJCVwKKwlkYnVzLXByaW50LW1lc3NhZ2UuYwkJCVwKKwlkYnVzLXByaW50LW1lc3NhZ2UuaAorCitpZiBEQlVTX1dJTgorZGJ1c19sYXVuY2hfU09VUkNFUz0JCQkJXAorCWRidXMtbGF1bmNoLXdpbi5jCQkJXAorCWRidXMtbGF1bmNoLmgKK2Vsc2UKK2RidXNfbGF1bmNoX1NPVVJDRVM9CQkJCVwKKwlkYnVzLWxhdW5jaC5jCQkJCVwKKwlkYnVzLWxhdW5jaC14MTEuYwkJCVwKKwlkYnVzLWxhdW5jaC5oCitlbmRpZgorCitkYnVzX2NsZWFudXBfc29ja2V0c19TT1VSQ0VTPQkJCVwKKwlkYnVzLWNsZWFudXAtc29ja2V0cy5jCisKK2RidXNfdXVpZGdlbl9TT1VSQ0VTPQkJCQlcCisJZGJ1cy11dWlkZ2VuLmMKKworZGJ1c19zZW5kX0xEQUREID0gXAorCSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtMS5sYSBcCisJJChOVUxMKQorCitkYnVzX21vbml0b3JfTERBREQgPSBcCisJJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy0xLmxhIFwKKwkkKE5FVFdPUktfbGlicykgXAorCSQoTlVMTCkKKworZGJ1c191dWlkZ2VuX0xEQUREID0gXAorCSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtMS5sYSBcCisJJChOVUxMKQorCitkYnVzX2xhdW5jaF9MREFERCA9IFwKKwkkKERCVVNfWF9MSUJTKSBcCisJJChOVUxMKQorCitFWFRSQV9ESVNUID0gcnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLnNoIHN0cnRvbGwuYyBzdHJ0b3VsbC5jCitDTEVBTkZJTEVTID0gCQkJCVwKKwlydW4td2l0aC10bXAtc2Vzc2lvbi1idXMuY29uZgorCisjIGNyZWF0ZSB0aGUgL3Zhci9saWIvZGJ1cyBkaXJlY3RvcnkgZm9yIGRidXMtdXVpZGdlbgoraW5zdGFsbC1kYXRhLWxvY2FsOgorCSQoTUtESVJfUCkgJChERVNURElSKSQobG9jYWxzdGF0ZWRpcikvbGliL2RidXMKKworaW5zdGFsbGNoZWNrLWxvY2FsOgorCXRlc3QgLWQgJChERVNURElSKSQobG9jYWxzdGF0ZWRpcikvbGliL2RidXMKZGlmZiAtLWdpdCBhL2RidXMvdG9vbHMvTk9USUNFIGIvZGJ1cy90b29scy9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkxY2ExZAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdG9vbHMvTk9USUNFCkBAIC0wLDAgKzEsNTUxIEBACitELUJ1cyBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgeW91ciBjaG9pY2Ugb2YgdGhlIEFjYWRlbWljIEZyZWUKK0xpY2Vuc2UgdmVyc2lvbiAyLjEsIG9yIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCitCb3RoIGxpY2Vuc2VzIGFyZSBpbmNsdWRlZCBoZXJlLiBTb21lIG9mIHRoZSBzdGFuZGFsb25lIGJpbmFyaWVzIGFyZQordW5kZXIgdGhlIEdQTCBvbmx5OyBpbiBwYXJ0aWN1bGFyLCBidXQgbm90IGxpbWl0ZWQgdG8sCit0b29scy9kYnVzLWNsZWFudXAtc29ja2V0cy5jIGFuZCB0ZXN0L2RlY29kZS1nY292LmMuIEVhY2ggc291cmNlIGNvZGUKK2ZpbGUgaXMgbWFya2VkIHdpdGggdGhlIHByb3BlciBjb3B5cmlnaHQgaW5mb3JtYXRpb24gLSBpZiB5b3UgZmluZCBhCitmaWxlIHRoYXQgaXNuJ3QgbWFya2VkIHBsZWFzZSBicmluZyBpdCB0byBvdXIgYXR0ZW50aW9uLgorCisKK1RoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UKK3YuIDIuMQorCitUaGlzIEFjYWRlbWljIEZyZWUgTGljZW5zZSAodGhlICJMaWNlbnNlIikgYXBwbGllcyB0byBhbnkgb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwICh0aGUgIk9yaWdpbmFsIFdvcmsiKSB3aG9zZSBvd25lciAodGhlICJMaWNlbnNvciIpIGhhcyBwbGFjZWQgdGhlIGZvbGxvd2luZyBub3RpY2UgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgT3JpZ2luYWwgV29yazoKKworTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorCisxKSBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gTGljZW5zb3IgaGVyZWJ5IGdyYW50cyBZb3UgYQord29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlLCBwZXJwZXR1YWwsIHN1YmxpY2Vuc2VhYmxlCitsaWNlbnNlIHRvIGRvIHRoZSBmb2xsb3dpbmc6CisKK2EpIHRvIHJlcHJvZHVjZSB0aGUgT3JpZ2luYWwgV29yayBpbiBjb3BpZXM7CisKK2IpIHRvIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyAoIkRlcml2YXRpdmUgV29ya3MiKSBiYXNlZCB1cG9uIHRoZSBPcmlnaW5hbCBXb3JrOworCitjKSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgT3JpZ2luYWwgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0byB0aGUgcHVibGljOworCitkKSB0byBwZXJmb3JtIHRoZSBPcmlnaW5hbCBXb3JrIHB1YmxpY2x5OyBhbmQKKworZSkgdG8gZGlzcGxheSB0aGUgT3JpZ2luYWwgV29yayBwdWJsaWNseS4KKworMikgR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIExpY2Vuc29yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwKK3JveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSwgcGVycGV0dWFsLCBzdWJsaWNlbnNlYWJsZSBsaWNlbnNlLCB1bmRlcgorcGF0ZW50IGNsYWltcyBvd25lZCBvciBjb250cm9sbGVkIGJ5IHRoZSBMaWNlbnNvciB0aGF0IGFyZSBlbWJvZGllZCBpbgordGhlIE9yaWdpbmFsIFdvcmsgYXMgZnVybmlzaGVkIGJ5IHRoZSBMaWNlbnNvciwgdG8gbWFrZSwgdXNlLCBzZWxsIGFuZAorb2ZmZXIgZm9yIHNhbGUgdGhlIE9yaWdpbmFsIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MuCisKKzMpIEdyYW50IG9mIFNvdXJjZSBDb2RlIExpY2Vuc2UuIFRoZSB0ZXJtICJTb3VyY2UgQ29kZSIgbWVhbnMgdGhlCitwcmVmZXJyZWQgZm9ybSBvZiB0aGUgT3JpZ2luYWwgV29yayBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQgYW5kCithbGwgYXZhaWxhYmxlIGRvY3VtZW50YXRpb24gZGVzY3JpYmluZyBob3cgdG8gbW9kaWZ5IHRoZSBPcmlnaW5hbAorV29yay4gTGljZW5zb3IgaGVyZWJ5IGFncmVlcyB0byBwcm92aWRlIGEgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZQorU291cmNlIENvZGUgb2YgdGhlIE9yaWdpbmFsIFdvcmsgYWxvbmcgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIE9yaWdpbmFsCitXb3JrIHRoYXQgTGljZW5zb3IgZGlzdHJpYnV0ZXMuIExpY2Vuc29yIHJlc2VydmVzIHRoZSByaWdodCB0byBzYXRpc2Z5Cit0aGlzIG9ibGlnYXRpb24gYnkgcGxhY2luZyBhIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgU291cmNlIENvZGUKK2luIGFuIGluZm9ybWF0aW9uIHJlcG9zaXRvcnkgcmVhc29uYWJseSBjYWxjdWxhdGVkIHRvIHBlcm1pdAoraW5leHBlbnNpdmUgYW5kIGNvbnZlbmllbnQgYWNjZXNzIGJ5IFlvdSBmb3IgYXMgbG9uZyBhcyBMaWNlbnNvcgorY29udGludWVzIHRvIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsIFdvcmssIGFuZCBieSBwdWJsaXNoaW5nIHRoZQorYWRkcmVzcyBvZiB0aGF0IGluZm9ybWF0aW9uIHJlcG9zaXRvcnkgaW4gYSBub3RpY2UgaW1tZWRpYXRlbHkKK2ZvbGxvd2luZyB0aGUgY29weXJpZ2h0IG5vdGljZSB0aGF0IGFwcGxpZXMgdG8gdGhlIE9yaWdpbmFsIFdvcmsuCisKKzQpIEV4Y2x1c2lvbnMgRnJvbSBMaWNlbnNlIEdyYW50LiBOZWl0aGVyIHRoZSBuYW1lcyBvZiBMaWNlbnNvciwgbm9yCit0aGUgbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyB0byB0aGUgT3JpZ2luYWwgV29yaywgbm9yIGFueSBvZiB0aGVpcgordHJhZGVtYXJrcyBvciBzZXJ2aWNlIG1hcmtzLCBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKK3Byb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIE9yaWdpbmFsIFdvcmsgd2l0aG91dCBleHByZXNzIHByaW9yIHdyaXR0ZW4KK3Blcm1pc3Npb24gb2YgdGhlIExpY2Vuc29yLiBOb3RoaW5nIGluIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBkZWVtZWQgdG8KK2dyYW50IGFueSByaWdodHMgdG8gdHJhZGVtYXJrcywgY29weXJpZ2h0cywgcGF0ZW50cywgdHJhZGUgc2VjcmV0cyBvcgorYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBMaWNlbnNvciBleGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAoraGVyZWluLiBObyBwYXRlbnQgbGljZW5zZSBpcyBncmFudGVkIHRvIG1ha2UsIHVzZSwgc2VsbCBvciBvZmZlciB0bworc2VsbCBlbWJvZGltZW50cyBvZiBhbnkgcGF0ZW50IGNsYWltcyBvdGhlciB0aGFuIHRoZSBsaWNlbnNlZCBjbGFpbXMKK2RlZmluZWQgaW4gU2VjdGlvbiAyLiBObyByaWdodCBpcyBncmFudGVkIHRvIHRoZSB0cmFkZW1hcmtzIG9mCitMaWNlbnNvciBldmVuIGlmIHN1Y2ggbWFya3MgYXJlIGluY2x1ZGVkIGluIHRoZSBPcmlnaW5hbCBXb3JrLiBOb3RoaW5nCitpbiB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgaW50ZXJwcmV0ZWQgdG8gcHJvaGliaXQgTGljZW5zb3IgZnJvbQorbGljZW5zaW5nIHVuZGVyIGRpZmZlcmVudCB0ZXJtcyBmcm9tIHRoaXMgTGljZW5zZSBhbnkgT3JpZ2luYWwgV29yawordGhhdCBMaWNlbnNvciBvdGhlcndpc2Ugd291bGQgaGF2ZSBhIHJpZ2h0IHRvIGxpY2Vuc2UuCisKKzUpIFRoaXMgc2VjdGlvbiBpbnRlbnRpb25hbGx5IG9taXR0ZWQuCisKKzYpIEF0dHJpYnV0aW9uIFJpZ2h0cy4gWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIENvZGUgb2YgYW55CitEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGNyZWF0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50IG9yIHRyYWRlbWFyaworbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgQ29kZSBvZiB0aGUgT3JpZ2luYWwgV29yaywgYXMgd2VsbCBhcyBhbnkKK25vdGljZXMgb2YgbGljZW5zaW5nIGFuZCBhbnkgZGVzY3JpcHRpdmUgdGV4dCBpZGVudGlmaWVkIHRoZXJlaW4gYXMgYW4KKyJBdHRyaWJ1dGlvbiBOb3RpY2UuIiBZb3UgbXVzdCBjYXVzZSB0aGUgU291cmNlIENvZGUgZm9yIGFueQorRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBjcmVhdGUgdG8gY2FycnkgYSBwcm9taW5lbnQgQXR0cmlidXRpb24KK05vdGljZSByZWFzb25hYmx5IGNhbGN1bGF0ZWQgdG8gaW5mb3JtIHJlY2lwaWVudHMgdGhhdCBZb3UgaGF2ZQorbW9kaWZpZWQgdGhlIE9yaWdpbmFsIFdvcmsuCisKKzcpIFdhcnJhbnR5IG9mIFByb3ZlbmFuY2UgYW5kIERpc2NsYWltZXIgb2YgV2FycmFudHkuIExpY2Vuc29yCit3YXJyYW50cyB0aGF0IHRoZSBjb3B5cmlnaHQgaW4gYW5kIHRvIHRoZSBPcmlnaW5hbCBXb3JrIGFuZCB0aGUgcGF0ZW50CityaWdodHMgZ3JhbnRlZCBoZXJlaW4gYnkgTGljZW5zb3IgYXJlIG93bmVkIGJ5IHRoZSBMaWNlbnNvciBvciBhcmUKK3N1YmxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIHdpdGggdGhlIHBlcm1pc3Npb24KK29mIHRoZSBjb250cmlidXRvcihzKSBvZiB0aG9zZSBjb3B5cmlnaHRzIGFuZCBwYXRlbnQgcmlnaHRzLiBFeGNlcHQgYXMKK2V4cHJlc3NseSBzdGF0ZWQgaW4gdGhlIGltbWVkaWF0ZWx5IHByb2NlZWRpbmcgc2VudGVuY2UsIHRoZSBPcmlnaW5hbAorV29yayBpcyBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2Ugb24gYW4gIkFTIElTIiBCQVNJUyBhbmQgV0lUSE9VVAorV0FSUkFOVFksIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLAordGhlIHdhcnJhbnRpZXMgb2YgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIE9GIFRIRSBPUklHSU5BTAorV09SSyBJUyBXSVRIIFlPVS4gVGhpcyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIGNvbnN0aXR1dGVzIGFuIGVzc2VudGlhbAorcGFydCBvZiB0aGlzIExpY2Vuc2UuIE5vIGxpY2Vuc2UgdG8gT3JpZ2luYWwgV29yayBpcyBncmFudGVkIGhlcmV1bmRlcgorZXhjZXB0IHVuZGVyIHRoaXMgZGlzY2xhaW1lci4KKworOCkgTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgYW5kIHVuZGVyIG5vIGxlZ2FsCit0aGVvcnksIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3IKK290aGVyd2lzZSwgc2hhbGwgdGhlIExpY2Vuc29yIGJlIGxpYWJsZSB0byBhbnkgcGVyc29uIGZvciBhbnkgZGlyZWN0LAoraW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkKK2NoYXJhY3RlciBhcmlzaW5nIGFzIGEgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciB0aGUgdXNlIG9mIHRoZQorT3JpZ2luYWwgV29yayBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgZGFtYWdlcyBmb3IgbG9zcyBvZgorZ29vZHdpbGwsIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQKK2FsbCBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzLiBUaGlzIGxpbWl0YXRpb24gb2YgbGlhYmlsaXR5CitzaGFsbCBub3QgYXBwbHkgdG8gbGlhYmlsaXR5IGZvciBkZWF0aCBvciBwZXJzb25hbCBpbmp1cnkgcmVzdWx0aW5nCitmcm9tIExpY2Vuc29yJ3MgbmVnbGlnZW5jZSB0byB0aGUgZXh0ZW50IGFwcGxpY2FibGUgbGF3IHByb2hpYml0cyBzdWNoCitsaW1pdGF0aW9uLiBTb21lIGp1cmlzZGljdGlvbnMgZG8gbm90IGFsbG93IHRoZSBleGNsdXNpb24gb3IKK2xpbWl0YXRpb24gb2YgaW5jaWRlbnRhbCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHNvIHRoaXMgZXhjbHVzaW9uCithbmQgbGltaXRhdGlvbiBtYXkgbm90IGFwcGx5IHRvIFlvdS4KKworOSkgQWNjZXB0YW5jZSBhbmQgVGVybWluYXRpb24uIElmIFlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKK09yaWdpbmFsIFdvcmsgb3IgYSBEZXJpdmF0aXZlIFdvcmssIFlvdSBtdXN0IG1ha2UgYSByZWFzb25hYmxlIGVmZm9ydAordW5kZXIgdGhlIGNpcmN1bXN0YW5jZXMgdG8gb2J0YWluIHRoZSBleHByZXNzIGFzc2VudCBvZiByZWNpcGllbnRzIHRvCit0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBOb3RoaW5nIGVsc2UgYnV0IHRoaXMgTGljZW5zZSAob3IgYW5vdGhlcgord3JpdHRlbiBhZ3JlZW1lbnQgYmV0d2VlbiBMaWNlbnNvciBhbmQgWW91KSBncmFudHMgWW91IHBlcm1pc3Npb24gdG8KK2NyZWF0ZSBEZXJpdmF0aXZlIFdvcmtzIGJhc2VkIHVwb24gdGhlIE9yaWdpbmFsIFdvcmsgb3IgdG8gZXhlcmNpc2UKK2FueSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaW4gU2VjdGlvbiAxIGhlcmVpbiwgYW5kIGFueSBhdHRlbXB0IHRvIGRvCitzbyBleGNlcHQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSAob3IgYW5vdGhlciB3cml0dGVuCithZ3JlZW1lbnQgYmV0d2VlbiBMaWNlbnNvciBhbmQgWW91KSBpcyBleHByZXNzbHkgcHJvaGliaXRlZCBieQorVS5TLiBjb3B5cmlnaHQgbGF3LCB0aGUgZXF1aXZhbGVudCBsYXdzIG9mIG90aGVyIGNvdW50cmllcywgYW5kIGJ5CitpbnRlcm5hdGlvbmFsIHRyZWF0eS4gVGhlcmVmb3JlLCBieSBleGVyY2lzaW5nIGFueSBvZiB0aGUgcmlnaHRzCitncmFudGVkIHRvIFlvdSBpbiBTZWN0aW9uIDEgaGVyZWluLCBZb3UgaW5kaWNhdGUgWW91ciBhY2NlcHRhbmNlIG9mCit0aGlzIExpY2Vuc2UgYW5kIGFsbCBvZiBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMuCisKKzEwKSBUZXJtaW5hdGlvbiBmb3IgUGF0ZW50IEFjdGlvbi4gVGhpcyBMaWNlbnNlIHNoYWxsIHRlcm1pbmF0ZQorYXV0b21hdGljYWxseSBhbmQgWW91IG1heSBubyBsb25nZXIgZXhlcmNpc2UgYW55IG9mIHRoZSByaWdodHMgZ3JhbnRlZAordG8gWW91IGJ5IHRoaXMgTGljZW5zZSBhcyBvZiB0aGUgZGF0ZSBZb3UgY29tbWVuY2UgYW4gYWN0aW9uLAoraW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltLCBhZ2FpbnN0IExpY2Vuc29yIG9yIGFueQorbGljZW5zZWUgYWxsZWdpbmcgdGhhdCB0aGUgT3JpZ2luYWwgV29yayBpbmZyaW5nZXMgYSBwYXRlbnQuIFRoaXMKK3Rlcm1pbmF0aW9uIHByb3Zpc2lvbiBzaGFsbCBub3QgYXBwbHkgZm9yIGFuIGFjdGlvbiBhbGxlZ2luZyBwYXRlbnQKK2luZnJpbmdlbWVudCBieSBjb21iaW5hdGlvbnMgb2YgdGhlIE9yaWdpbmFsIFdvcmsgd2l0aCBvdGhlciBzb2Z0d2FyZQorb3IgaGFyZHdhcmUuCisKKzExKSBKdXJpc2RpY3Rpb24sIFZlbnVlIGFuZCBHb3Zlcm5pbmcgTGF3LiBBbnkgYWN0aW9uIG9yIHN1aXQgcmVsYXRpbmcKK3RvIHRoaXMgTGljZW5zZSBtYXkgYmUgYnJvdWdodCBvbmx5IGluIHRoZSBjb3VydHMgb2YgYSBqdXJpc2RpY3Rpb24KK3doZXJlaW4gdGhlIExpY2Vuc29yIHJlc2lkZXMgb3IgaW4gd2hpY2ggTGljZW5zb3IgY29uZHVjdHMgaXRzIHByaW1hcnkKK2J1c2luZXNzLCBhbmQgdW5kZXIgdGhlIGxhd3Mgb2YgdGhhdCBqdXJpc2RpY3Rpb24gZXhjbHVkaW5nIGl0cworY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuIFRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMKK0NvbnZlbnRpb24gb24gQ29udHJhY3RzIGZvciB0aGUgSW50ZXJuYXRpb25hbCBTYWxlIG9mIEdvb2RzIGlzCitleHByZXNzbHkgZXhjbHVkZWQuIEFueSB1c2Ugb2YgdGhlIE9yaWdpbmFsIFdvcmsgb3V0c2lkZSB0aGUgc2NvcGUgb2YKK3RoaXMgTGljZW5zZSBvciBhZnRlciBpdHMgdGVybWluYXRpb24gc2hhbGwgYmUgc3ViamVjdCB0byB0aGUKK3JlcXVpcmVtZW50cyBhbmQgcGVuYWx0aWVzIG9mIHRoZSBVLlMuIENvcHlyaWdodCBBY3QsIDE3IFUuUy5DLiDDgsKnIDEwMQorZXQgc2VxLiwgdGhlIGVxdWl2YWxlbnQgbGF3cyBvZiBvdGhlciBjb3VudHJpZXMsIGFuZCBpbnRlcm5hdGlvbmFsCit0cmVhdHkuIFRoaXMgc2VjdGlvbiBzaGFsbCBzdXJ2aXZlIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UuCisKKzEyKSBBdHRvcm5leXMgRmVlcy4gSW4gYW55IGFjdGlvbiB0byBlbmZvcmNlIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UKK29yIHNlZWtpbmcgZGFtYWdlcyByZWxhdGluZyB0aGVyZXRvLCB0aGUgcHJldmFpbGluZyBwYXJ0eSBzaGFsbCBiZQorZW50aXRsZWQgdG8gcmVjb3ZlciBpdHMgY29zdHMgYW5kIGV4cGVuc2VzLCBpbmNsdWRpbmcsIHdpdGhvdXQKK2xpbWl0YXRpb24sIHJlYXNvbmFibGUgYXR0b3JuZXlzJyBmZWVzIGFuZCBjb3N0cyBpbmN1cnJlZCBpbgorY29ubmVjdGlvbiB3aXRoIHN1Y2ggYWN0aW9uLCBpbmNsdWRpbmcgYW55IGFwcGVhbCBvZiBzdWNoIGFjdGlvbi4gVGhpcworc2VjdGlvbiBzaGFsbCBzdXJ2aXZlIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UuCisKKzEzKSBNaXNjZWxsYW5lb3VzLiBUaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50Citjb25jZXJuaW5nIHRoZSBzdWJqZWN0IG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlCitpcyBoZWxkIHRvIGJlIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8KK3RoZSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgZW5mb3JjZWFibGUuCisKKzE0KSBEZWZpbml0aW9uIG9mICJZb3UiIGluIFRoaXMgTGljZW5zZS4gIllvdSIgdGhyb3VnaG91dCB0aGlzCitMaWNlbnNlLCB3aGV0aGVyIGluIHVwcGVyIG9yIGxvd2VyIGNhc2UsIG1lYW5zIGFuIGluZGl2aWR1YWwgb3IgYQorbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyLCBhbmQgY29tcGx5aW5nIHdpdGggYWxsIG9mIHRoZQordGVybXMgb2YsIHRoaXMgTGljZW5zZS4gRm9yIGxlZ2FsIGVudGl0aWVzLCAiWW91IiBpbmNsdWRlcyBhbnkgZW50aXR5Cit0aGF0IGNvbnRyb2xzLCBpcyBjb250cm9sbGVkIGJ5LCBvciBpcyB1bmRlciBjb21tb24gY29udHJvbCB3aXRoCit5b3UuIEZvciBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLAorZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaAorZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkKK3BlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsCitvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKzE1KSBSaWdodCB0byBVc2UuIFlvdSBtYXkgdXNlIHRoZSBPcmlnaW5hbCBXb3JrIGluIGFsbCB3YXlzIG5vdAorb3RoZXJ3aXNlIHJlc3RyaWN0ZWQgb3IgY29uZGl0aW9uZWQgYnkgdGhpcyBMaWNlbnNlIG9yIGJ5IGxhdywgYW5kCitMaWNlbnNvciBwcm9taXNlcyBub3QgdG8gaW50ZXJmZXJlIHdpdGggb3IgYmUgcmVzcG9uc2libGUgZm9yIHN1Y2gKK3VzZXMgYnkgWW91LgorCitUaGlzIGxpY2Vuc2UgaXMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgTGF3cmVuY2UgRS4gUm9zZW4uIEFsbCByaWdodHMKK3Jlc2VydmVkLiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhpcworbGljZW5zZSB3aXRob3V0IG1vZGlmaWNhdGlvbi4gVGhpcyBsaWNlbnNlIG1heSBub3QgYmUgbW9kaWZpZWQgd2l0aG91dAordGhlIGV4cHJlc3Mgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIGl0cyBjb3B5cmlnaHQgb3duZXIuCisKKworLS0gCitFTkQgT0YgQUNBREVNSUMgRlJFRSBMSUNFTlNFLiBUaGUgZm9sbG93aW5nIGlzIGludGVuZGVkIHRvIGRlc2NyaWJlIHRoZSBlc3NlbnRpYWwgCitkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgKEFGTCkgdmVyc2lvbiAxLjAgYW5kIG90aGVyIAorb3BlbiBzb3VyY2UgbGljZW5zZXM6CisKK1RoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgaXMgc2ltaWxhciB0byB0aGUgQlNELCBNSVQsIFVvSS9OQ1NBIGFuZCBBcGFjaGUgCitsaWNlbnNlcyBpbiBtYW55IHJlc3BlY3RzIGJ1dCBpdCBpcyBpbnRlbmRlZCB0byBzb2x2ZSBhIGZldyBwcm9ibGVtcyB3aXRoIAordGhvc2UgbGljZW5zZXMuCisgICAgCisqIFRoZSBBRkwgaXMgd3JpdHRlbiBzbyBhcyB0byBtYWtlIGl0IGNsZWFyIHdoYXQgc29mdHdhcmUgaXMgYmVpbmcgCitsaWNlbnNlZCAoYnkgdGhlIGluY2x1c2lvbiBvZiBhIHN0YXRlbWVudCBmb2xsb3dpbmcgdGhlIGNvcHlyaWdodCBub3RpY2UgCitpbiB0aGUgc29mdHdhcmUpLiBUaGlzIHdheSwgdGhlIGxpY2Vuc2UgZnVuY3Rpb25zIGJldHRlciB0aGFuIGEgdGVtcGxhdGUgCitsaWNlbnNlLiBUaGUgQlNELCBNSVQgYW5kIFVvSS9OQ1NBIGxpY2Vuc2VzIGFwcGx5IHRvIHVuaWRlbnRpZmllZCBzb2Z0d2FyZS4KKyAgICAKKyogVGhlIEFGTCBjb250YWlucyBhIGNvbXBsZXRlIGNvcHlyaWdodCBncmFudCB0byB0aGUgc29mdHdhcmUuIFRoZSBCU0QgCithbmQgQXBhY2hlIGxpY2Vuc2VzIGFyZSB2YWd1ZSBhbmQgaW5jb21wbGV0ZSBpbiB0aGF0IHJlc3BlY3QuCisgICAgCisqIFRoZSBBRkwgY29udGFpbnMgYSBjb21wbGV0ZSBwYXRlbnQgZ3JhbnQgdG8gdGhlIHNvZnR3YXJlLiBUaGUgQlNELCBNSVQsIAorVW9JL05DU0EgYW5kIEFwYWNoZSBsaWNlbnNlcyByZWx5IG9uIGFuIGltcGxpZWQgcGF0ZW50IGxpY2Vuc2UgYW5kIGNvbnRhaW4gCitubyBleHBsaWNpdCBwYXRlbnQgZ3JhbnQuCisgICAgCisqIFRoZSBBRkwgbWFrZXMgaXQgY2xlYXIgdGhhdCBubyB0cmFkZW1hcmsgcmlnaHRzIGFyZSBncmFudGVkIHRvIHRoZSAKK2xpY2Vuc29yJ3MgdHJhZGVtYXJrcy4gVGhlIEFwYWNoZSBsaWNlbnNlIGNvbnRhaW5zIHN1Y2ggYSBwcm92aXNpb24sIGJ1dCB0aGUgCitCU0QsIE1JVCBhbmQgVW9JL05DU0EgbGljZW5zZXMgZG8gbm90LgorICAgIAorKiBUaGUgQUZMIGluY2x1ZGVzIHRoZSB3YXJyYW50eSBieSB0aGUgbGljZW5zb3IgdGhhdCBpdCBlaXRoZXIgb3ducyB0aGUgCitjb3B5cmlnaHQgb3IgdGhhdCBpdCBpcyBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlIHVuZGVyIGEgbGljZW5zZS4gTm9uZSBvZiAKK3RoZSBvdGhlciBsaWNlbnNlcyBjb250YWluIHRoYXQgd2FycmFudHkuIEFsbCBvdGhlciB3YXJyYW50aWVzIGFyZSBkaXNjbGFpbWVkLCAKK2FzIGlzIHRoZSBjYXNlIGZvciB0aGUgb3RoZXIgbGljZW5zZXMuCisKKyogVGhlIEFGTCBpcyBpdHNlbGYgY29weXJpZ2h0ZWQgKHdpdGggdGhlIHJpZ2h0IGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSAKK3dpdGhvdXQgbW9kaWZpY2F0aW9uKS4gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIG93bmVyIG9mIHRoZSBjb3B5cmlnaHQgdG8gdGhlIAorbGljZW5zZSB3aWxsIGNvbnRyb2wgY2hhbmdlcy4gVGhlIEFwYWNoZSBsaWNlbnNlIGNvbnRhaW5zIGEgY29weXJpZ2h0IG5vdGljZSwgCitidXQgdGhlIEJTRCwgTUlUIGFuZCBVb0kvTkNTQSBsaWNlbnNlcyBkbyBub3QuIAorLS0KK1NUQVJUIE9GIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCistLQorCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwordXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQordGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCit5b3VyIHByb2dyYW1zLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0CitpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAoraW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2FueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KK1RoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91CitkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Cit5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQorc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgorcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKKygyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCitkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgorCisgIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwordGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKK2F1dGhvcnMnIHJlcHV0YXRpb25zLgorCisgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCitwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCitwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCitwcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKK3BhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisMCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucworYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKK3JlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgorbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKK3RoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCitlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgorbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgordGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCitpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KK1doZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncworc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Citjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCitub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7CithbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQorICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCisgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKKyAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCisgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCisgICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgorICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCisgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKKyAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCisgICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisMCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCit3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCisgICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQorICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCisgICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKKyAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KK2NvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKK3NwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQorYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKK2Zvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCithY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50CithY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKwwKKyAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0CitvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKK3ZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KK0hvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAorcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KK3RoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwordGhpcyBMaWNlbnNlLgorCisgIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KK2FwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCitjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKwwKKyAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCit0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CitsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCitlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgordGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4KKworICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCit0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcworbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKK29mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKK29mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgorT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCitUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCitQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKK1JFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKK1JFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKK09VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQorWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKK1BST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisJICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2RidXMvdG9vbHMvZGJ1cy1jbGVhbnVwLXNvY2tldHMuYyBiL2RidXMvdG9vbHMvZGJ1cy1jbGVhbnVwLXNvY2tldHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjY3MDlhCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90b29scy9kYnVzLWNsZWFudXAtc29ja2V0cy5jCkBAIC0wLDAgKzEsNDQ4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtY2xlYW51cC1zb2NrZXRzLmMgIGRidXMtY2xlYW51cC1zb2NrZXRzIHV0aWxpdHkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAyIE1pY2hhZWwgTWVla3MKKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBmaWxlIGlzIE5PVCBsaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlLAorICogYXMgaXQgaXMgYmFzZWQgb24gbGluYy1jbGVhbnVwLXNvY2tldHMgd2hpY2ggaXMgTEdQTC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgKDEpCisjZW5kaWYKKworI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAoMCkKKyNlbmRpZgorCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAoKHZvaWQqKSAwKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkKgoreG1hbGxvYyAoc2l6ZV90IGJ5dGVzKQoreworICB2b2lkICptZW07CisKKyAgaWYgKGJ5dGVzID09IDApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbWVtID0gbWFsbG9jIChieXRlcyk7CisKKyAgaWYgKG1lbSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkFsbG9jYXRpb24gb2YgJWQgYnl0ZXMgZmFpbGVkXG4iLAorICAgICAgICAgICAgICAgKGludCkgYnl0ZXMpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIHJldHVybiBtZW07Cit9CisKK3N0YXRpYyB2b2lkKgoreHJlYWxsb2MgKHZvaWQgKm9sZCwgc2l6ZV90IGJ5dGVzKQoreworICB2b2lkICptZW07CisKKyAgaWYgKGJ5dGVzID09IDApCisgICAgeworICAgICAgZnJlZSAob2xkKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBtZW0gPSByZWFsbG9jIChvbGQsIGJ5dGVzKTsKKworICBpZiAobWVtID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUmVhbGxvY2F0aW9uIG9mICVkIGJ5dGVzIGZhaWxlZFxuIiwKKyAgICAgICAgICAgICAgIChpbnQpIGJ5dGVzKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICByZXR1cm4gbWVtOworfQorCisjaWZkZWYgQUZfVU5JWAorCit0eXBlZGVmIGVudW0KKyAgeworICAgIFNPQ0tFVF9VTktOT1dOLAorICAgIFNPQ0tFVF9GQUlMRURfVE9fSEFORExFLAorICAgIFNPQ0tFVF9ERUFELAorICAgIFNPQ0tFVF9BTElWRSwKKyAgICBTT0NLRVRfVU5MSU5LRUQKKyAgfSBTb2NrZXRTdGF0dXM7CisKK3N0YXRpYyBpbnQgYWxpdmVfY291bnQgPSAwOworc3RhdGljIGludCBjbGVhbmVkX2NvdW50ID0gMDsKK3N0YXRpYyBpbnQgdW5oYW5kbGVkX2NvdW50ID0gMDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY2hhciAqbmFtZTsKKyAgaW50ICAgZmQ7CisgIFNvY2tldFN0YXR1cyBzdGF0dXM7CisgIGludCAgIG5fcmV0cmllczsKK30gU29ja2V0RW50cnk7CisKK3N0YXRpYyBTb2NrZXRFbnRyeSoKK3NvY2tldF9lbnRyeV9uZXcgKGNvbnN0IGNoYXIgKmRpciwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZuYW1lKQoreworICBTb2NrZXRFbnRyeSAqc2U7CisgIGludCBsZW47CisKKyAgc2UgPSB4bWFsbG9jIChzaXplb2YgKFNvY2tldEVudHJ5KSk7CisKKyAgbGVuID0gc3RybGVuIChkaXIpICsgc3RybGVuIChmbmFtZSkgKyAyOyAvKiAyID0gbnVsIGFuZCAnLycgKi8KKyAgc2UtPm5hbWUgPSB4bWFsbG9jIChsZW4pOworCisgIHN0cmNweSAoc2UtPm5hbWUsIGRpcik7CisgIHN0cmNhdCAoc2UtPm5hbWUsICIvIik7CisgIHN0cmNhdCAoc2UtPm5hbWUsIGZuYW1lKTsKKworICBzZS0+ZmQgPSAtMTsKKworICBzZS0+c3RhdHVzID0gU09DS0VUX1VOS05PV047CisKKyAgc2UtPm5fcmV0cmllcyA9IDA7CisKKyAgcmV0dXJuIHNlOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9zb2NrZXRfZW50cnkgKFNvY2tldEVudHJ5ICpzZSkKK3sKKyAgaWYgKHNlKQorICAgIHsKKyAgICAgIGZyZWUgKHNlLT5uYW1lKTsKKyAgICAgIGlmIChzZS0+ZmQgPj0gMCkKKyAgICAgICAgY2xvc2UgKHNlLT5mZCk7CisgICAgICBmcmVlIChzZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorZnJlZV9zb2NrZXRfZW50cmllcyAoU29ja2V0RW50cnkqKiBlbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICBuX2VudHJpZXMpCit7CisgIGludCBpOworCisgIGlmIChlbnRyaWVzKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuX2VudHJpZXM7ICsraSkKKyAgICAgICAgZnJlZV9zb2NrZXRfZW50cnkgKGVudHJpZXNbaV0pOworICAgICAgZnJlZSAoZW50cmllcyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcmVhZF9zb2NrZXRzIChjb25zdCBjaGFyICAgICpkaXIsCisgICAgICAgICAgICAgIFNvY2tldEVudHJ5ICoqKmVudHJpZXNfcCwKKyAgICAgICAgICAgICAgaW50ICAgICAgICAgICAqbl9lbnRyaWVzX3ApCit7CisgIERJUiAgICpkaXJoOworICBzdHJ1Y3QgZGlyZW50ICpkZW50OworICBTb2NrZXRFbnRyeSAqKmVudHJpZXM7CisgIGludCBuX2VudHJpZXM7CisgIGludCBhbGxvY2F0ZWQ7CisKKyAgbl9lbnRyaWVzID0gMDsKKyAgYWxsb2NhdGVkID0gMjsKKyAgZW50cmllcyA9IHhtYWxsb2MgKHNpemVvZiAoU29ja2V0RW50cnkqKSAqIGFsbG9jYXRlZCk7CisKKyAgZGlyaCA9IG9wZW5kaXIgKGRpcik7CisgIGlmIChkaXJoID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRmFpbGVkIHRvIG9wZW4gZGlyZWN0b3J5ICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGRpciwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgd2hpbGUgKChkZW50ID0gcmVhZGRpciAoZGlyaCkpKQorICAgIHsKKyAgICAgIFNvY2tldEVudHJ5ICpzZTsKKworICAgICAgaWYgKHN0cm5jbXAgKGRlbnQtPmRfbmFtZSwgImRidXMtIiwgNSkgIT0gMCkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIHNlID0gc29ja2V0X2VudHJ5X25ldyAoZGlyLCBkZW50LT5kX25hbWUpOworCisgICAgICBpZiAobl9lbnRyaWVzID09IGFsbG9jYXRlZCkKKyAgICAgICAgeworICAgICAgICAgIGFsbG9jYXRlZCAqPSAyOworICAgICAgICAgIGVudHJpZXMgPSB4cmVhbGxvYyAoZW50cmllcywgc2l6ZW9mIChTb2NrZXRFbnRyeSopICogYWxsb2NhdGVkKTsKKyAgICAgICAgfQorCisgICAgICBlbnRyaWVzW25fZW50cmllc10gPSBzZTsKKyAgICAgIG5fZW50cmllcyArPSAxOworICAgIH0KKworICBjbG9zZWRpciAoZGlyaCk7CisKKyAgKmVudHJpZXNfcCA9IGVudHJpZXM7CisgICpuX2VudHJpZXNfcCA9IG5fZW50cmllczsKK30KKworc3RhdGljIFNvY2tldFN0YXR1cworb3Blbl9zb2NrZXQgKFNvY2tldEVudHJ5ICpzZSkKK3sKKyAgaW50IHJldDsKKyAgc3RydWN0IHNvY2thZGRyX3VuIHNhZGRyOworCisgIGlmIChzZS0+bl9yZXRyaWVzID4gNSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJXYXJuaW5nOiBnaXZpbmcgdXAgb24gc29ja2V0ICVzIGFmdGVyIHNldmVyYWwgcmV0cmllczsgdW5hYmxlIHRvIGRldGVybWluZSBzb2NrZXQncyBzdGF0dXNcbiIsCisgICAgICAgICAgICAgICBzZS0+bmFtZSk7CisgICAgICByZXR1cm4gU09DS0VUX0ZBSUxFRF9UT19IQU5ETEU7CisgICAgfQorCisgIHNlLT5uX3JldHJpZXMgKz0gMTsKKworICBzZS0+ZmQgPSBzb2NrZXQgKEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTsKKyAgaWYgKHNlLT5mZCA8IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiV2FybmluZzogZmFpbGVkIHRvIG9wZW4gYSBzb2NrZXQgdG8gdXNlIGZvciBjb25uZWN0aW5nOiAlc1xuIiwKKyAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIFNPQ0tFVF9VTktOT1dOOworICAgIH0KKworICBpZiAoZmNudGwgKHNlLT5mZCwgRl9TRVRGTCwgT19OT05CTE9DSykgPCAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIldhcm5pbmc6IGZhaWxlZCBzZXQgc29ja2V0ICVzIG5vbmJsb2NraW5nOiAlc1xuIiwKKyAgICAgICAgICAgICAgIHNlLT5uYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBTT0NLRVRfVU5LTk9XTjsKKyAgICB9CisKKworICBtZW1zZXQgKCZzYWRkciwgJ1wwJywgc2l6ZW9mIChzYWRkcikpOyAvKiBudWwtdGVybWluYXRlcyB0aGUgc3VuX3BhdGggKi8KKworICBzYWRkci5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKyAgc3RybmNweSAoc2FkZHIuc3VuX3BhdGgsIHNlLT5uYW1lLCBzaXplb2YgKHNhZGRyLnN1bl9wYXRoKSAtIDEpOworCisgIGRvCisgICAgeworICAgICAgcmV0ID0gY29ubmVjdCAoc2UtPmZkLCAoc3RydWN0IHNvY2thZGRyKikgJnNhZGRyLCBzaXplb2YgKHNhZGRyKSk7CisgICAgfQorICB3aGlsZSAocmV0IDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgaWYgKHJldCA+PSAwKQorICAgIHJldHVybiBTT0NLRVRfQUxJVkU7CisgIGVsc2UKKyAgICB7CisgICAgICBzd2l0Y2ggKGVycm5vKQorICAgICAgICB7CisgICAgICAgIGNhc2UgRUlOUFJPR1JFU1M6CisgICAgICAgIGNhc2UgRUFHQUlOOgorICAgICAgICAgIHJldHVybiBTT0NLRVRfVU5LTk9XTjsKKyAgICAgICAgY2FzZSBFQ09OTlJFRlVTRUQ6CisgICAgICAgICAgcmV0dXJuIFNPQ0tFVF9ERUFEOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIldhcm5pbmc6IHVuZXhwZWN0ZWQgZXJyb3IgY29ubmVjdGluZyB0byBzb2NrZXQgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgIHNlLT5uYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICByZXR1cm4gU09DS0VUX0ZBSUxFRF9UT19IQU5ETEU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK2hhbmRsZV9zb2NrZXRzIChTb2NrZXRFbnRyeSAqKmVudHJpZXMsCisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICBuX2VudHJpZXMpCit7CisgIGludCBpOworICBpbnQgbl91bmtub3duOworCisgIG5fdW5rbm93biA9IDA7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbl9lbnRyaWVzKQorICAgIHsKKyAgICAgIFNvY2tldEVudHJ5ICpzZTsKKyAgICAgIFNvY2tldFN0YXR1cyBzdGF0dXM7CisKKyAgICAgIHNlID0gZW50cmllc1tpXTsKKyAgICAgICsraTsKKworICAgICAgaWYgKHNlLT5mZCA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiSW50ZXJuYWwgZXJyb3IsIHNvY2tldCBoYXMgZmQgIGtlcHQgb3BlbiB3aGlsZSBzdGF0dXMgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBzZS0+c3RhdHVzKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoc2UtPnN0YXR1cyAhPSBTT0NLRVRfVU5LTk9XTikKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIHN0YXR1cyA9IG9wZW5fc29ja2V0IChzZSk7CisKKyAgICAgIHN3aXRjaCAoc3RhdHVzKQorICAgICAgICB7CisgICAgICAgIGNhc2UgU09DS0VUX0RFQUQ6CisgICAgICAgICAgY2xlYW5lZF9jb3VudCArPSAxOworICAgICAgICAgIGlmICh1bmxpbmsgKHNlLT5uYW1lKSA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIldhcm5pbmc6IEZhaWxlZCB0byBkZWxldGUgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBzZS0+bmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgICAgICAgICAgICAgc2UtPnN0YXR1cyA9IFNPQ0tFVF9GQUlMRURfVE9fSEFORExFOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNlLT5zdGF0dXMgPSBTT0NLRVRfVU5MSU5LRUQ7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTT0NLRVRfQUxJVkU6CisgICAgICAgICAgYWxpdmVfY291bnQgKz0gMTsKKyAgICAgICAgICAvKiBGQUxMIFRIUlUgKi8KKworICAgICAgICBjYXNlIFNPQ0tFVF9GQUlMRURfVE9fSEFORExFOgorICAgICAgICBjYXNlIFNPQ0tFVF9VTktOT1dOOgorICAgICAgICAgIHNlLT5zdGF0dXMgPSBzdGF0dXM7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTT0NLRVRfVU5MSU5LRUQ6CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQmFkIHN0YXR1cyBmcm9tIG9wZW5fc29ja2V0KCksIHNob3VsZCBub3QgaGFwcGVuXG4iKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICBpZiAoc2UtPmZkID49IDApCisgICAgICAgIHsKKyAgICAgICAgICBjbG9zZSAoc2UtPmZkKTsKKyAgICAgICAgICBzZS0+ZmQgPSAtMTsKKyAgICAgICAgfQorCisgICAgICBpZiAoc2UtPnN0YXR1cyA9PSBTT0NLRVRfVU5LTk9XTikKKyAgICAgICAgbl91bmtub3duICs9IDE7CisgICAgfQorCisgIHJldHVybiBuX3Vua25vd24gPT0gMDsKK30KKworc3RhdGljIHZvaWQKK2NsZWFuX2RpciAoY29uc3QgY2hhciAqZGlyKQoreworICBTb2NrZXRFbnRyeSAqKmVudHJpZXM7CisgIGludCBuX2VudHJpZXM7CisKKyAgcmVhZF9zb2NrZXRzIChkaXIsICZlbnRyaWVzLCAmbl9lbnRyaWVzKTsKKworICAvKiBvcGVuX3NvY2tldCgpIHdpbGwgZmFpbCBjb25jbHVzaXZlbHkgYWZ0ZXIKKyAgICogc2V2ZXJhbCByZXRyaWVzLCBzbyB0aGlzIGxvb3AgaXMgZ3VhcmFudGVlZAorICAgKiB0byB0ZXJtaW5hdGUgZXZlbnR1YWxseQorICAgKi8KKyAgd2hpbGUgKCFoYW5kbGVfc29ja2V0cyAoZW50cmllcywgbl9lbnRyaWVzKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJVbmFibGUgdG8gZGV0ZXJtaW5lIHN0YXRlIG9mIHNvbWUgc29ja2V0cywgcmV0cnlpbmcgaW4gMiBzZWNvbmRzXG4iKTsKKyAgICAgIHNsZWVwICgyKTsKKyAgICB9CisKKyAgdW5oYW5kbGVkX2NvdW50ICs9IChuX2VudHJpZXMgLSBhbGl2ZV9jb3VudCAtIGNsZWFuZWRfY291bnQpOworCisgIGZyZWVfc29ja2V0X2VudHJpZXMgKGVudHJpZXMsIG5fZW50cmllcyk7Cit9CisKKyNlbmRpZiAvKiBBRl9VTklYICovCisKK3N0YXRpYyB2b2lkCit1c2FnZSAoaW50IGVjb2RlKQoreworICBmcHJpbnRmIChzdGRlcnIsICJkYnVzLWNsZWFudXAtc29ja2V0cyBbLS12ZXJzaW9uXSBbLS1oZWxwXSA8c29ja2V0ZGlyPlxuIik7CisgIGV4aXQgKGVjb2RlKTsKK30KKworc3RhdGljIHZvaWQKK3ZlcnNpb24gKHZvaWQpCit7CisgIHByaW50ZiAoIkQtQnVzIFNvY2tldCBDbGVhbnVwIFV0aWxpdHkgJXNcbiIKKyAgICAgICAgICAiQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy5cbiIKKyAgICAgICAgICAiQ29weXJpZ2h0IChDKSAyMDAyIE1pY2hhZWwgTWVla3NcbiIKKyAgICAgICAgICAiVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLlxuIgorICAgICAgICAgICJUaGVyZSBpcyBOTyB3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5cbiIsCisgICAgICAgICAgVkVSU0lPTik7CisgIGV4aXQgKDApOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaW50IGk7CisgIGludCBzYXdfZG91YmxlZGFzaDsKKyAgY29uc3QgY2hhciAqZGlybmFtZTsKKworICBzYXdfZG91YmxlZGFzaCA9IEZBTFNFOworICBkaXJuYW1lID0gTlVMTDsKKyAgaSA9IDE7CisgIHdoaWxlIChpIDwgYXJnYykKKyAgICB7CisgICAgICBjb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCisgICAgICBpZiAoc3RyY21wIChhcmcsICItLWhlbHAiKSA9PSAwIHx8CisgICAgICAgICAgc3RyY21wIChhcmcsICItaCIpID09IDAgfHwKKyAgICAgICAgICBzdHJjbXAgKGFyZywgIi0/IikgPT0gMCkKKyAgICAgICAgdXNhZ2UgKDApOworICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLXZlcnNpb24iKSA9PSAwKQorICAgICAgICB2ZXJzaW9uICgpOworICAgICAgZWxzZSBpZiAoIXNhd19kb3VibGVkYXNoKQorCXsKKyAgICAgICAgICBpZiAoc3RyY21wIChhcmcsICItLSIpID09IDApCisgICAgICAgICAgICBzYXdfZG91YmxlZGFzaCA9IFRSVUU7CisgICAgICAgICAgZWxzZSBpZiAoKmFyZyA9PSAnLScpCisgICAgICAgICAgICB1c2FnZSAoMSk7CisJfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRpcm5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZGJ1cy1jbGVhbnVwLXNvY2tldHMgb25seSBzdXBwb3J0cyBhIHNpbmdsZSBkaXJlY3RvcnkgbmFtZVxuIik7CisgICAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgZGlybmFtZSA9IGFyZzsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIC8qIERlZmF1bHQgdG8gc2Vzc2lvbiBzb2NrZXQgZGlyLCB1c3VhbGx5IC90bXAgKi8KKyAgaWYgKGRpcm5hbWUgPT0gTlVMTCkKKyAgICBkaXJuYW1lID0gREJVU19TRVNTSU9OX1NPQ0tFVF9ESVI7CisKKyNpZmRlZiBBRl9VTklYCisgIGNsZWFuX2RpciAoZGlybmFtZSk7CisKKyAgcHJpbnRmICgiQ2xlYW5lZCB1cCAlZCBzb2NrZXRzIGluICVzOyAlZCBzb2NrZXRzIGFyZSBzdGlsbCBpbiB1c2U7ICVkIGluIHVua25vd24gc3RhdGVcbiIsCisgICAgICAgICAgY2xlYW5lZF9jb3VudCwgZGlybmFtZSwgYWxpdmVfY291bnQsIHVuaGFuZGxlZF9jb3VudCk7CisjZWxzZQorICBwcmludGYgKCJUaGlzIHN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IFVOSVggZG9tYWluIHNvY2tldHMsIHNvIGRidXMtY2xlYW51cC1zb2NrZXRzIGRvZXMgbm90aGluZ1xuIik7CisjZW5kaWYKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RidXMvdG9vbHMvZGJ1cy1sYXVuY2gtd2luLmMgYi9kYnVzL3Rvb2xzL2RidXMtbGF1bmNoLXdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNWZhYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rvb2xzL2RidXMtbGF1bmNoLXdpbi5jCkBAIC0wLDAgKzEsMTcxIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbGF1bmNoLXdpbi5jICBkYnVzLWxhdW5jaCB1dGlsaXR5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJhbGYgSGFiYWNrZXIgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2lmbmRlZiBVTklDT0RFCisjZGVmaW5lIFVOSUNPREUgMQorI2VuZGlmCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKy8qIFNhdmUgc3RyaW5nIGZ1bmN0aW9ucy4gIEluc3RlYWQgb2YgZmlndXJpbmcgb3V0IHRoZSBleGFjdCBfTVNDX1ZFUgorICAgdGhhdCB3b3JrLCBvdmVycmlkZSBmb3IgZXZlcnlib2R5LiAgKi8KKworI2RlZmluZSBlcnJub190IGludAorI2RlZmluZSB3Y3NjYXRfcyBteV93Y3NjYXRfcworI2RlZmluZSB3Y3NjcHlfcyBteV93Y3NjcHlfcworCitzdGF0aWMgZXJybm9fdAord2NzY2F0X3MgKHdjaGFyX3QgKmRlc3QsIHNpemVfdCBzaXplLCB3Y2hhcl90ICpzcmMpIAoreworICBhc3NlcnQgKHNpemVvZiAod2NoYXJfdCkgKiAod2NzbGVuIChkZXN0KSArIHdjc2xlbiAoc3JjKSArIDEpIDw9IHNpemUpOworICB3Y3NjYXQgKGRlc3QsIHNyYyk7CisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBlcnJub190Cit3Y3NjcHlfcyAod2NoYXJfdCAqZGVzdCwgc2l6ZV90IHNpemUsIHdjaGFyX3QgKnNyYykKK3sKKyAgYXNzZXJ0IChzaXplb2YgKHdjaGFyX3QpICogKHdjc2xlbiAoc3JjKSArIDEpIDw9IHNpemUpOworICB3Y3NjcHkgKGRlc3QsIHNyYyk7CisgIHJldHVybiAwOworfQorCisvKiBUT0RPICh0bCk6IFRoaXMgV2luZG93cyB2ZXJzaW9uIG9mIGRidXMtbGF1bmNoIGlzIGN1cnJldGx5IHJhdGhlcgorICogcG9pbnRsZXNzIGFzIGl0IGRvZXNuJ3QgdGFrZSB0aGUgc2FtZSBjb21tYW5kLWxpbmUgb3B0aW9ucyBhcyB0aGUKKyAqIFVOSVggZGJ1cy1sYXVuY2ggZG9lcy4gQSBtYWluIHBvaW50IG9mIHRoZSBkYnVzLWxhdW5jaCBjb21tYW5kIGlzCisgKiB0byBwYXNzIGl0IGZvciBpbnN0YW5jZSBhIC0tY29uZmlnLWZpbGUgb3B0aW9uIHRvIG1ha2UgdGhlIHN0YXJ0ZWQKKyAqIGRidXMtZGFlbW9uIHVzZSB0aGF0IGNvbmZpZyBmaWxlLgorICogCisgKiBUaGlzIHZlcnNpb24gYWxzbyBkb2Vzbid0IHByaW50IG91dCBhbnkgaW5mb3JtYXRpb24sIHdoaWNoIGlzIGEKKyAqIG1haW4gcG9pbnQgb2YgdGhlIFVOSVggb25lLiBJdCBzaG91bGQgYXQgbGVhc3Qgc3VwcG9ydCB0aGUKKyAqIC0tc2gtc3ludGF4IG9wdGlvbiwgYW5kIG1heWJlIGFsc28gYSAtLWNtZC1zeW50YXggdG8gcHJpbnQgb3V0IHRoZQorICogdmFyaWFibGUgc2V0dGluZ3MgaW4gY21kLmV4ZSBzeW50YXg/CisgKiAKKyAqIE5PVEUgKHJoKTogVGhlIG1haW4gdGFzayBvZiBkYnVzLWxhdW5jaCBpcyAoZnJvbSB0aGUgbWFuIHBhZ2UpIHRvIHN0YXJ0IAorICogYSBzZXNzaW9uIGJ1cyBhbmQgdGhpcyBpcyBhcmNoaWV2ZWQgYnkgdGhlIGN1cnJlbnQgaW1wbGVtZW50aW9uLiAKKyAqIAorICogQWRkaXRpb25hbCBvbiB3aW5kb3dzIHRoZSBzZXNzaW9uIGJ1cyBzdGFydGluZyBpbiBub3QgaW50ZWdyYXRlZCAKKyAqIGludG8gdGhlIGxvZ29uIHByb2Nlc3MsIHNvIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGFueSAtLXN5bnRheCBvcHRpb24uIAorICogSW4gZmFjdCAoYXQgbGVhc3QgZm9yIGtkZSBvbiB3aW5kb3dzKSB0aGUgc2Vzc2lvbiBidXMgaXMgYXV0b3N0YXJ0ZWQgCisgKiB3aXRoIHRoZSBmaXJzdCBhcHBsaWNhdGlvbiByZXF1ZXN0aW5nIGEgc2Vzc2lvbiBidXMuIAorICoKKyAqLworCisjZGVmaW5lIEFVVE9fQUNUSVZBVEVfQ09OU09MRV9XSEVOX1ZFUkJPU0VfTU9ERSAxCisKKyNkZWZpbmUgRElNKHgpIChzaXplb2YoeCkgLyBzaXplb2YoeFswXSkpCisjZGVmaW5lIFdDU1RSSU5HSUZZXyh4KSBMICMjIHgKKyNkZWZpbmUgV0NTVFJJTkdJRlkoeCkgV0NTVFJJTkdJRllfKHgpCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICB3Y2hhcl90IGRidXNEYWVtb25QYXRoW01BWF9QQVRIICogMiArIDFdOworICB3Y2hhcl90IGNvbW1hbmRbTUFYX1BBVEggKiAyICsgMV07CisgIHdjaGFyX3QgKnA7CisgIHdjaGFyX3QgKmRhZW1vbl9uYW1lOworICBpbnQgcmVzdWx0OworICBpbnQgc2hvd0NvbnNvbGUgPSAwOworI2lmZGVmIERCVVNfV0lOQ0UKKyAgY2hhciAqcyA9IE5VTEw7CisjZWxzZQorICBjaGFyICpzID0gZ2V0ZW52KCJEQlVTX1ZFUkJPU0UiKTsKKyNlbmRpZgorICBpbnQgdmVyYm9zZSA9IHMgJiYgKnMgIT0gJ1wwJyA/IDEgOiAwOworCisgIFBST0NFU1NfSU5GT1JNQVRJT04gcGk7CisgIFNUQVJUVVBJTkZPVyBzaTsKKyAgQk9PTCBpbmhlcml0ID0gVFJVRTsKKyAgRFdPUkQgZmxhZ3MgPSAwOworCisjaWZkZWYgQVVUT19BQ1RJVkFURV9DT05TT0xFX1dIRU5fVkVSQk9TRV9NT0RFCisgIGlmICh2ZXJib3NlKQorICAgICAgc2hvd0NvbnNvbGUgPSAxOyAKKyNlbmRpZgorICBHZXRNb2R1bGVGaWxlTmFtZVcgKE5VTEwsIGRidXNEYWVtb25QYXRoLCBESU0gKGRidXNEYWVtb25QYXRoKSk7CisgIAorICBkYWVtb25fbmFtZSA9IFdDU1RSSU5HSUZZKERCVVNfREFFTU9OX05BTUUpIEwiLmV4ZSI7CisgIAorICBpZiAoKHAgPSB3Y3NyY2hyIChkYnVzRGFlbW9uUGF0aCwgTCdcXCcpKSkgCisgICAgeworICAgICAgcFsxXSA9IEwnXDAnOworICAgICAgd2NzY2F0X3MgKGRidXNEYWVtb25QYXRoLCBzaXplb2YgKGRidXNEYWVtb25QYXRoKSwgZGFlbW9uX25hbWUpOworICAgIH0KKyAgZWxzZSAKKyAgICB7CisgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJlcnJvcjogY291bGQgbm90IGV4dHJhY3QgcGF0aCBmcm9tIGN1cnJlbnQgIgorICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbnMgbW9kdWxlIGZpbGVuYW1lXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0gCisKKyNpZmRlZiBEQlVTX1dJTkNFCisgICAvKiBXaW5kb3dzIENFIGhhcyBhIGRpZmZlcmVudCBpbnRlcnByZXRhdGlvbiBvZiBjbWRsaW5lOiBTdGFydCB3aXRoIGFyZ3ZbMV0uICAqLworICAgd2NzY3B5X3MgKGNvbW1hbmQsIHNpemVvZiAoY29tbWFuZCksIEwiLS1zZXNzaW9uIik7CisgICBpZiAodmVyYm9zZSkKKyAgICAgZnByaW50ZiAoc3RkZXJyLCAiJWxzICVsc1xuIiwgZGJ1c0RhZW1vblBhdGgsIGNvbW1hbmQpOworI2Vsc2UKKyAgIGNvbW1hbmRbMF0gPSBMJ1wwJzsKKyAgIC8qIFdpbmRvd3MgY21kbGluZSBzdGFydHMgd2l0aCBwYXRoLCB3aGljaCBjYW4gY29udGFpbiBzcGFjZXMuICAqLworICAgd2NzY3B5X3MgKGNvbW1hbmQsIHNpemVvZiAoY29tbWFuZCksIEwiXCIiKTsKKyAgIHdjc2NhdF9zIChjb21tYW5kLCBzaXplb2YgKGNvbW1hbmQpLCBkYnVzRGFlbW9uUGF0aCk7CisgICB3Y3NjYXRfcyAoY29tbWFuZCwgc2l6ZW9mIChjb21tYW5kKSwgTCJcIiAtLXNlc3Npb24iKTsKKyAgIGlmICh2ZXJib3NlKQorICAgICBmcHJpbnRmIChzdGRlcnIsICIlbHNcbiIsIGNvbW1hbmQpOworI2VuZGlmCisgIAorICBtZW1zZXQgKCZzaSwgMCwgc2l6ZW9mIChzaSkpOworICBtZW1zZXQgKCZwaSwgMCwgc2l6ZW9mIChwaSkpOworICBzaS5jYiA9IHNpemVvZiAoc2kpOworICAKKyAgaWYgKHZlcmJvc2UpCisgICAgZmxhZ3MgfD0gQ1JFQVRFX05FV19DT05TT0xFOworCisjaWZkZWYgREJVU19XSU5DRQorICBpbmhlcml0ID0gRkFMU0U7CisjZWxzZQorICBmbGFncyB8PSBOT1JNQUxfUFJJT1JJVFlfQ0xBU1M7CisgIGlmICghdmVyYm9zZSkKKyAgICBmbGFncyB8PSBERVRBQ0hFRF9QUk9DRVNTOworI2VuZGlmCisKKyAgcmVzdWx0ID0gQ3JlYXRlUHJvY2Vzc1cgKGRidXNEYWVtb25QYXRoLCBjb21tYW5kLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdCwgZmxhZ3MsIDAsIDAsICZzaSwgJnBpKTsKKworICBpZiAocmVzdWx0ID09IDApIAorICAgIHsKKyAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJDb3VsZCBub3Qgc3RhcnQgIiBEQlVTX0RBRU1PTl9OQU1FICIuIGVycm9yPSVkXG4iLAorICAgICAgICAgICAgICAgICBHZXRMYXN0RXJyb3IgKCkpOworICAgICAgcmV0dXJuIDQ7CisgICAgfQorICAgCisgIENsb3NlSGFuZGxlIChwaS5oUHJvY2Vzcyk7CisgIENsb3NlSGFuZGxlIChwaS5oVGhyZWFkKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RidXMvdG9vbHMvZGJ1cy1sYXVuY2gteDExLmMgYi9kYnVzL3Rvb2xzL2RidXMtbGF1bmNoLXgxMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZTMzMzAKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rvb2xzL2RidXMtbGF1bmNoLXgxMS5jCkBAIC0wLDAgKzEsNDY4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbGF1bmNoLmggIGRidXMtbGF1bmNoIHV0aWxpdHkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhpYWdvIE1hY2llaXJhIDx0aGlhZ29Aa2RlLm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtbGF1bmNoLmgiCisKKyNpZmRlZiBEQlVTX0JVSUxEX1gxMQorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlIDxYMTEvWGF0b20uaD4KKworRGlzcGxheSAqeGRpc3BsYXkgPSBOVUxMOworc3RhdGljIEF0b20gc2VsZWN0aW9uX2F0b207CitzdGF0aWMgQXRvbSBhZGRyZXNzX2F0b207CitzdGF0aWMgQXRvbSBwaWRfYXRvbTsKKworc3RhdGljIGludAoreF9pb19lcnJvcl9oYW5kbGVyIChEaXNwbGF5ICp4ZGlzcGxheSkKK3sKKyAgdmVyYm9zZSAoIlggSU8gZXJyb3JcbiIpOworICBraWxsX2J1c19hbmRfZXhpdCAoMCk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX3ByZWZpeCAoY2hhciAqcywKKyAgICAgICAgICAgICAgIGNoYXIgKnByZWZpeCkKK3sKKyAgaW50IHBsZW47CisKKyAgcGxlbiA9IHN0cmxlbiAocHJlZml4KTsKKworICBpZiAoc3RybmNtcCAocywgcHJlZml4LCBwbGVuKSA9PSAwKQorICAgIHsKKyAgICAgIG1lbW1vdmUgKHMsIHMgKyBwbGVuLCBzdHJsZW4gKHMpIC0gcGxlbiArIDEpOworICAgIH0KK30KKworc3RhdGljIGNvbnN0IGNoYXIqCitnZXRfaG9tZWRpciAodm9pZCkKK3sKKyAgY29uc3QgY2hhciAqaG9tZTsKKyAgCisgIGhvbWUgPSBnZXRlbnYgKCJIT01FIik7CisgIGlmIChob21lID09IE5VTEwpCisgICAgeworICAgICAgLyogdHJ5IGZyb20gdGhlIHVzZXIgZGF0YWJhc2UgKi8KKyAgICAgIHN0cnVjdCBwYXNzd2QgKnVzZXIgPSBnZXRwd3VpZCAoZ2V0dWlkKCkpOworICAgICAgaWYgKHVzZXIgIT0gTlVMTCkKKyAgICAgICAgaG9tZSA9IHVzZXItPnB3X2RpcjsKKyAgICB9CisKKyAgaWYgKGhvbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJDYW4ndCBnZXQgdXNlciBob21lIGRpcmVjdG9yeVxuIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgcmV0dXJuIGhvbWU7Cit9CisKKyNkZWZpbmUgREJVU19ESVIgIi5kYnVzIgorI2RlZmluZSBEQlVTX1NFU1NJT05fQlVTX0RJUiAic2Vzc2lvbi1idXMiCisKK3N0YXRpYyBjaGFyICoKK2dldF9zZXNzaW9uX2ZpbGUgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBjaGFyIHByZWZpeFtdID0gIi8iIERCVVNfRElSICIvIiBEQlVTX1NFU1NJT05fQlVTX0RJUiAiLyI7CisgIGNvbnN0IGNoYXIgKm1hY2hpbmU7CisgIGNvbnN0IGNoYXIgKmhvbWU7CisgIGNoYXIgKmRpc3BsYXk7CisgIGNoYXIgKnJlc3VsdDsKKyAgY2hhciAqcDsKKworICBtYWNoaW5lID0gZ2V0X21hY2hpbmVfdXVpZCAoKTsKKyAgaWYgKG1hY2hpbmUgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBkaXNwbGF5ID0geHN0cmR1cCAoZ2V0ZW52ICgiRElTUExBWSIpKTsKKyAgaWYgKGRpc3BsYXkgPT0gTlVMTCkKKyAgICB7CisgICAgICB2ZXJib3NlICgiWDExIGludGVncmF0aW9uIGRpc2FibGVkIGJlY2F1c2UgWDExIGlzIG5vdCBydW5uaW5nXG4iKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiByZW1vdmUgdGhlIHNjcmVlbiBwYXJ0IG9mIHRoZSBkaXNwbGF5IG5hbWUgKi8KKyAgcCA9IHN0cnJjaHIgKGRpc3BsYXksICc6Jyk7CisgIGlmIChwICE9IE5VTEwpCisgICAgeworICAgICAgZm9yICggOyAqcDsgKytwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCpwID09ICcuJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgKnAgPSAnXDAnOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAvKiBOb3RlIHRoYXQgd2UgbGVhdmUgdGhlIGhvc3RuYW1lIGluIHRoZSBkaXNwbGF5IG1vc3Qgb2YgdGhlCisgICAqIHRpbWUuIFRoZSBpZGVhIGlzIHRoYXQgd2Ugd2FudCB0byBiZSBwZXItKG1hY2hpbmUsZGlzcGxheSx1c2VyKQorICAgKiB0cmlwbGV0IHRvIGJlIGV4dHJhLXN1cmUgd2UgZ2V0IGEgYnVzIHdlIGNhbiBjb25uZWN0IHRvLiBJZGVhbGx5CisgICAqIHdlJ2QgcmVjb2duaXplIHdoZW4gdGhlIGhvc3RuYW1lIG1hdGNoZXMgdGhlIG1hY2hpbmUgd2UncmUgb24gaW4KKyAgICogYWxsIGNhc2VzOyB3ZSBkbyB0cnkgdG8gZHJvcCBsb2NhbGhvc3QgYW5kIGxvY2FsaG9zdC5sb2NhbGRvbWFpbgorICAgKiBhcyBhIHNwZWNpYWwgY29tbW9uIGNhc2Ugc28gdGhhdCBhbHRlcm5hdGUgc3BlbGxpbmdzIG9mIERJU1BMQVkKKyAgICogZG9uJ3QgcmVzdWx0IGluIGV4dHJhIGJ1cyBpbnN0YW5jZXMuCisgICAqCisgICAqIFdlIGFsc28ga2lsbCB0aGUgIjoiIGlmIHRoZXJlJ3Mgbm90aGluZyBpbiBmcm9udCBvZiBpdC4gVGhpcworICAgKiBhdm9pZHMgYW4gdWdseSBkb3VibGUgdW5kZXJzY29yZSBpbiB0aGUgZmlsZW5hbWUuCisgICAqLworICByZW1vdmVfcHJlZml4IChkaXNwbGF5LCAibG9jYWxob3N0LmxvY2FsZG9tYWluOiIpOworICByZW1vdmVfcHJlZml4IChkaXNwbGF5LCAibG9jYWxob3N0OiIpOworICByZW1vdmVfcHJlZml4IChkaXNwbGF5LCAiOiIpOworCisgIC8qIHJlcGxhY2UgdGhlIDogaW4gdGhlIGRpc3BsYXkgd2l0aCBfIGlmIHRoZSA6IGlzIHN0aWxsIHRoZXJlLgorICAgKiB1c2UgXyBpbnN0ZWFkIG9mIC0gc2luY2UgaXQgY2FuJ3QgYmUgaW4gaG9zdG5hbWVzLgorICAgKi8KKyAgZm9yIChwID0gZGlzcGxheTsgKnA7ICsrcCkKKyAgICB7CisgICAgICBpZiAoKnAgPT0gJzonKQorICAgICAgICAqcCA9ICdfJzsKKyAgICB9CisgIAorICBob21lID0gZ2V0X2hvbWVkaXIgKCk7CisgIAorICByZXN1bHQgPSBtYWxsb2MgKHN0cmxlbiAoaG9tZSkgKyBzdHJsZW4gKHByZWZpeCkgKyBzdHJsZW4gKG1hY2hpbmUpICsKKyAgICAgICAgICAgICAgICAgICBzdHJsZW4gKGRpc3BsYXkpICsgMik7CisgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBvdXQgb2YgbWVtb3J5ICovCisgICAgICBmcmVlIChkaXNwbGF5KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBzdHJjcHkgKHJlc3VsdCwgaG9tZSk7CisgIHN0cmNhdCAocmVzdWx0LCBwcmVmaXgpOworICBzdHJjYXQgKHJlc3VsdCwgbWFjaGluZSk7CisgIHN0cmNhdCAocmVzdWx0LCAiLSIpOworICBzdHJjYXQgKHJlc3VsdCwgZGlzcGxheSk7CisgIGZyZWUgKGRpc3BsYXkpOworCisgIHZlcmJvc2UgKCJzZXNzaW9uIGZpbGU6ICVzXG4iLCByZXN1bHQpOworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZAorZW5zdXJlX3Nlc3Npb25fZGlyZWN0b3J5ICh2b2lkKQoreworICBjb25zdCBjaGFyICpob21lOworICBjaGFyICpkaXI7CisgIAorICBob21lID0gZ2V0X2hvbWVkaXIgKCk7CisKKyAgLyogYmUgc3VyZSB3ZSBoYXZlIHNwYWNlIGZvciAvIGFuZCBudWwgKi8KKyAgZGlyID0gbWFsbG9jIChzdHJsZW4gKGhvbWUpICsgc3RybGVuIChEQlVTX0RJUikgKyBzdHJsZW4gKERCVVNfU0VTU0lPTl9CVVNfRElSKSArIDMpOworICBpZiAoZGlyID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAibm8gbWVtb3J5XG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgCisgIHN0cmNweSAoZGlyLCBob21lKTsKKyAgc3RyY2F0IChkaXIsICIvIik7CisgIHN0cmNhdCAoZGlyLCBEQlVTX0RJUik7CisKKyAgaWYgKG1rZGlyIChkaXIsIDA3MDApIDwgMCkKKyAgICB7CisgICAgICAvKiBvbmx5IHByaW50IGEgd2FybmluZyBoZXJlLCB3cml0aW5nIHRoZSBzZXNzaW9uIGZpbGUgaXRzZWxmIHdpbGwgZmFpbCBsYXRlciAqLworICAgICAgaWYgKGVycm5vICE9IEVFWElTVCkKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVW5hYmxlIHRvIGNyZWF0ZSAlc1xuIiwgZGlyKTsKKyAgICB9CisKKyAgc3RyY2F0IChkaXIsICIvIik7CisgIHN0cmNhdCAoZGlyLCBEQlVTX1NFU1NJT05fQlVTX0RJUik7CisKKyAgaWYgKG1rZGlyIChkaXIsIDA3MDApIDwgMCkKKyAgICB7CisgICAgICAvKiBvbmx5IHByaW50IGEgd2FybmluZyBoZXJlLCB3cml0aW5nIHRoZSBzZXNzaW9uIGZpbGUgaXRzZWxmIHdpbGwgZmFpbCBsYXRlciAqLworICAgICAgaWYgKGVycm5vICE9IEVFWElTVCkKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVW5hYmxlIHRvIGNyZWF0ZSAlc1xuIiwgZGlyKTsKKyAgICB9CisgIAorICBmcmVlIChkaXIpOworfQorCitzdGF0aWMgRGlzcGxheSAqCitvcGVuX3gxMSAodm9pZCkKK3sKKyAgaWYgKHhkaXNwbGF5ICE9IE5VTEwpCisgICAgcmV0dXJuIHhkaXNwbGF5OworCisgIHhkaXNwbGF5ID0gWE9wZW5EaXNwbGF5IChOVUxMKTsKKyAgaWYgKHhkaXNwbGF5ICE9IE5VTEwpCisgICAgeworICAgICAgdmVyYm9zZSAoIkNvbm5lY3RlZCB0byBYMTEgZGlzcGxheSAnJXMnXG4iLCBEaXNwbGF5U3RyaW5nICh4ZGlzcGxheSkpOworICAgICAgWFNldElPRXJyb3JIYW5kbGVyICh4X2lvX2Vycm9yX2hhbmRsZXIpOworICAgIH0KKyAgcmV0dXJuIHhkaXNwbGF5OworfQorCitzdGF0aWMgaW50Citpbml0X3hfYXRvbXMgKERpc3BsYXkgKmRpc3BsYXkpCit7CisgIHN0YXRpYyBjb25zdCBjaGFyIHNlbGVjdGlvbl9wcmVmaXhbXSA9ICJfREJVU19TRVNTSU9OX0JVU19TRUxFQ1RJT05fIjsKKyAgc3RhdGljIGNvbnN0IGNoYXIgYWRkcmVzc19wcmVmaXhbXSA9ICJfREJVU19TRVNTSU9OX0JVU19BRERSRVNTIjsKKyAgc3RhdGljIGNvbnN0IGNoYXIgcGlkX3ByZWZpeFtdID0gIl9EQlVTX1NFU1NJT05fQlVTX1BJRCI7CisgIHN0YXRpYyBpbnQgaW5pdCA9IEZBTFNFOworICBjaGFyICphdG9tX25hbWU7CisgIGNvbnN0IGNoYXIgKm1hY2hpbmU7CisgIGNoYXIgKnVzZXJfbmFtZTsKKyAgc3RydWN0IHBhc3N3ZCAqdXNlcjsKKworICBpZiAoaW5pdCkKKyAgICByZXR1cm4gVFJVRTsKKworICBtYWNoaW5lID0gZ2V0X21hY2hpbmVfdXVpZCAoKTsKKyAgaWYgKG1hY2hpbmUgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgdXNlciA9IGdldHB3dWlkIChnZXR1aWQgKCkpOworICBpZiAodXNlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIHZlcmJvc2UgKCJDb3VsZCBub3QgZGV0ZXJtaW5lIHVzZXIgaW5mb3JtYXRpb247IGFib3J0aW5nIFgxMSBpbnRlZ3JhdGlvbi5cbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgdXNlcl9uYW1lID0geHN0cmR1cCh1c2VyLT5wd19uYW1lKTsKKworICBhdG9tX25hbWUgPSBtYWxsb2MgKHN0cmxlbiAobWFjaGluZSkgKyBzdHJsZW4gKHVzZXJfbmFtZSkgKyAyICsKKyAgICAgICAgICAgICAgICAgICAgICBNQVggKHN0cmxlbiAoc2VsZWN0aW9uX3ByZWZpeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVggKHN0cmxlbiAoYWRkcmVzc19wcmVmaXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4gKHBpZF9wcmVmaXgpKSkpOworICBpZiAoYXRvbV9uYW1lID09IE5VTEwpCisgICAgeworICAgICAgdmVyYm9zZSAoIkNvdWxkIG5vdCBjcmVhdGUgWDExIGF0b21zOyBhYm9ydGluZyBYMTEgaW50ZWdyYXRpb24uXG4iKTsKKyAgICAgIGZyZWUgKHVzZXJfbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIGNyZWF0ZSB0aGUgc2VsZWN0aW9uIGF0b20gKi8KKyAgc3RyY3B5IChhdG9tX25hbWUsIHNlbGVjdGlvbl9wcmVmaXgpOworICBzdHJjYXQgKGF0b21fbmFtZSwgdXNlcl9uYW1lKTsKKyAgc3RyY2F0IChhdG9tX25hbWUsICJfIik7CisgIHN0cmNhdCAoYXRvbV9uYW1lLCBtYWNoaW5lKTsKKyAgc2VsZWN0aW9uX2F0b20gPSBYSW50ZXJuQXRvbSAoZGlzcGxheSwgYXRvbV9uYW1lLCBGQUxTRSk7CisKKyAgLyogY3JlYXRlIHRoZSBhZGRyZXNzIHByb3BlcnR5IGF0b20gKi8KKyAgc3RyY3B5IChhdG9tX25hbWUsIGFkZHJlc3NfcHJlZml4KTsKKyAgYWRkcmVzc19hdG9tID0gWEludGVybkF0b20gKGRpc3BsYXksIGF0b21fbmFtZSwgRkFMU0UpOworCisgIC8qIGNyZWF0ZSB0aGUgUElEIHByb3BlcnR5IGF0b20gKi8KKyAgc3RyY3B5IChhdG9tX25hbWUsIHBpZF9wcmVmaXgpOworICBwaWRfYXRvbSA9IFhJbnRlcm5BdG9tIChkaXNwbGF5LCBhdG9tX25hbWUsIEZBTFNFKTsKKworICBmcmVlIChhdG9tX25hbWUpOworICBmcmVlICh1c2VyX25hbWUpOworICBpbml0ID0gVFJVRTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBHZXRzIHRoZSBkYWVtb24gYWRkcmVzcyBmcm9tIHRoZSBYMTEgZGlzcGxheS4KKyAqIFJldHVybnMgRkFMU0UgaWYgdGhlcmUgd2FzIGFuIGVycm9yLiBSZXR1cm5pbmcKKyAqIFRSVUUgZG9lcyBub3QgbWVhbiB0aGUgYWRkcmVzcyBleGlzdHMuCisgKi8KK2ludAoreDExX2dldF9hZGRyZXNzIChjaGFyICoqcGFkZHJlc3MsIHBpZF90ICpwaWQsIGxvbmcgKndpZCkKK3sKKyAgaW50IHJlc3VsdDsKKyAgQXRvbSB0eXBlOworICBXaW5kb3cgb3duZXI7CisgIGludCBmb3JtYXQ7CisgIHVuc2lnbmVkIGxvbmcgaXRlbXM7CisgIHVuc2lnbmVkIGxvbmcgYWZ0ZXI7CisgIGNoYXIgKmRhdGE7CisKKyAgKnBhZGRyZXNzID0gTlVMTDsKKworICAvKiBsb2NhdGUgdGhlIHNlbGVjdGlvbiBvd25lciAqLworICBvd25lciA9IFhHZXRTZWxlY3Rpb25Pd25lciAoeGRpc3BsYXksIHNlbGVjdGlvbl9hdG9tKTsKKyAgaWYgKG93bmVyID09IE5vbmUpCisgICAgcmV0dXJuIFRSVUU7ICAgICAgICAgICAgICAgIC8qIG5vIG93bmVyICovCisgIGlmICh3aWQgIT0gTlVMTCkKKyAgICAqd2lkID0gKGxvbmcpIG93bmVyOworCisgIC8qIGdldCB0aGUgYnVzIGFkZHJlc3MgKi8KKyAgcmVzdWx0ID0gWEdldFdpbmRvd1Byb3BlcnR5ICh4ZGlzcGxheSwgb3duZXIsIGFkZHJlc3NfYXRvbSwgMCwgMTAyNCwgRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYQV9TVFJJTkcsICZ0eXBlLCAmZm9ybWF0LCAmaXRlbXMsICZhZnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICoqKSAmZGF0YSk7CisgIGlmIChyZXN1bHQgIT0gU3VjY2VzcyB8fCB0eXBlID09IE5vbmUgfHwgYWZ0ZXIgIT0gMCB8fCBkYXRhID09IE5VTEwgfHwgZm9ybWF0ICE9IDgpCisgICAgcmV0dXJuIEZBTFNFOyAgICAgICAgICAgICAgIC8qIGVycm9yICovCisKKyAgKnBhZGRyZXNzID0geHN0cmR1cCAoZGF0YSk7CisgIFhGcmVlIChkYXRhKTsKKworICAvKiBnZXQgdGhlIFBJRCAqLworICBpZiAocGlkICE9IE5VTEwpCisgICAgeworICAgICAgKnBpZCA9IDA7CisgICAgICByZXN1bHQgPSBYR2V0V2luZG93UHJvcGVydHkgKHhkaXNwbGF5LCBvd25lciwgcGlkX2F0b20sIDAsIHNpemVvZiBwaWQsIEZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYQV9DQVJESU5BTCwgJnR5cGUsICZmb3JtYXQsICZpdGVtcywgJmFmdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKikgJmRhdGEpOworICAgICAgaWYgKHJlc3VsdCA9PSBTdWNjZXNzICYmIHR5cGUgIT0gTm9uZSAmJiBhZnRlciA9PSAwICYmIGRhdGEgIT0gTlVMTCAmJiBmb3JtYXQgPT0gMzIpCisgICAgICAgICpwaWQgPSAocGlkX3QpICoobG9uZyopIGRhdGE7CisgICAgICBYRnJlZSAoZGF0YSk7CisgICAgfQorCisgIHJldHVybiBUUlVFOyAgICAgICAgICAgICAgICAgIC8qIHN1Y2Nlc3MgKi8KK30KKworLyoKKyAqIFNhdmVzIHRoZSBhZGRyZXNzIGluIHRoZSBYMTEgZGlzcGxheS4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKiBJZiBhbiBlcnJvciBvY2N1cnMsIHJldHVybnMgLTEuIElmIHRoZSBzZWxlY3Rpb24gYWxyZWFkeSBleGlzdHMsCisgKiByZXR1cm5zIDEuIChpLmUuIGFub3RoZXIgZGFlbW9uIGlzIGFscmVhZHkgcnVubmluZykKKyAqLworc3RhdGljIFdpbmRvdworc2V0X2FkZHJlc3NfaW5feDExKGNoYXIgKmFkZHJlc3MsIHBpZF90IHBpZCkKK3sKKyAgY2hhciAqY3VycmVudF9hZGRyZXNzOworICBXaW5kb3cgd2lkID0gTm9uZTsKKyAgdW5zaWduZWQgbG9uZyBwaWQzMjsgLyogWGxpYiBwcm9wZXJ0eSBmdW5jdGlvbnMgd2FudCBfbG9uZ18gbm90IDMyLWJpdCBmb3IgZm9ybWF0ICIzMiIgKi8KKyAgCisgIC8qIGxvY2sgdGhlIFgxMSBkaXNwbGF5IHRvIG1ha2Ugc3VyZSB3ZSdyZSBkb2luZyB0aGlzIGF0b21pY2FsbHkgKi8KKyAgWEdyYWJTZXJ2ZXIgKHhkaXNwbGF5KTsKKworICBpZiAoIXgxMV9nZXRfYWRkcmVzcyAoJmN1cnJlbnRfYWRkcmVzcywgTlVMTCwgTlVMTCkpCisgICAgeworICAgICAgLyogZXJyb3IhICovCisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKGN1cnJlbnRfYWRkcmVzcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIHNvbWVvbmUgc2F2ZWQgdGhlIGFkZHJlc3MgaW4gdGhlIG1lYW50aW1lICovCisgICAgICBmcmVlIChjdXJyZW50X2FkZHJlc3MpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIC8qIENyZWF0ZSBvdXIgd2luZG93ICovCisgIHdpZCA9IFhDcmVhdGVXaW5kb3cgKHhkaXNwbGF5LCBSb290V2luZG93ICh4ZGlzcGxheSwgMCksIC0yMCwgLTIwLCAxMCwgMTAsCisgICAgICAgICAgICAgICAgICAgICAgIDAsIENvcHlGcm9tUGFyZW50LCBJbnB1dE9ubHksIENvcHlGcm9tUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMKTsKKyAgdmVyYm9zZSAoIkNyZWF0ZWQgd2luZG93ICVkXG4iLCB3aWQpOworCisgIC8qIFNhdmUgdGhlIHByb3BlcnR5IGluIHRoZSB3aW5kb3cgKi8KKyAgWENoYW5nZVByb3BlcnR5ICh4ZGlzcGxheSwgd2lkLCBhZGRyZXNzX2F0b20sIFhBX1NUUklORywgOCwgUHJvcE1vZGVSZXBsYWNlLAorICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopYWRkcmVzcywgc3RybGVuIChhZGRyZXNzKSk7CisgIHBpZDMyID0gcGlkOworICBYQ2hhbmdlUHJvcGVydHkgKHhkaXNwbGF5LCB3aWQsIHBpZF9hdG9tLCBYQV9DQVJESU5BTCwgMzIsIFByb3BNb2RlUmVwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKSZwaWQzMiwgMSk7CisKKyAgLyogTm93IGdyYWIgdGhlIHNlbGVjdGlvbiAqLworICBYU2V0U2VsZWN0aW9uT3duZXIgKHhkaXNwbGF5LCBzZWxlY3Rpb25fYXRvbSwgd2lkLCBDdXJyZW50VGltZSk7CisKKyBvdXQ6CisgIC8qIFVuZ3JhYiB0aGUgc2VydmVyIHRvIGxldCBvdGhlciBwZW9wbGUgdXNlIGl0IHRvbyAqLworICBYVW5ncmFiU2VydmVyICh4ZGlzcGxheSk7CisKKyAgLyogQW5kIG1ha2Ugc3VyZSB0aGF0IHRoZSB1bmdyYWIgZ2V0cyBzZW50IHRvIFgxMSAqLworICBYRmx1c2ggKHhkaXNwbGF5KTsKKworICByZXR1cm4gd2lkOworfQorCisvKgorICogU2F2ZXMgdGhlIHNlc3Npb24gYWRkcmVzcyBpbiBzZXNzaW9uIGZpbGUuIFJldHVybnMgVFJVRSBvbgorICogc3VjY2VzcywgRkFMU0UgaWYgYW4gZXJyb3Igb2NjdXJzLgorICovCitzdGF0aWMgaW50CitzZXRfYWRkcmVzc19pbl9maWxlIChjaGFyICphZGRyZXNzLCBwaWRfdCBwaWQsIFdpbmRvdyB3aWQpCit7CisgIGNoYXIgKnNlc3Npb25fZmlsZTsKKyAgRklMRSAqZjsKKworICBlbnN1cmVfc2Vzc2lvbl9kaXJlY3RvcnkgKCk7CisgIHNlc3Npb25fZmlsZSA9IGdldF9zZXNzaW9uX2ZpbGUoKTsKKyAgaWYgKHNlc3Npb25fZmlsZSA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBmID0gZm9wZW4gKHNlc3Npb25fZmlsZSwgInciKTsKKyAgZnJlZSAoc2Vzc2lvbl9maWxlKTsKKyAgaWYgKGYgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7ICAgICAgICAgICAgICAgLyogc29tZSBraW5kIG9mIGVycm9yICovCisgIGZwcmludGYgKGYsCisgICAgICAgICAgICIjIFRoaXMgZmlsZSBhbGxvd3MgcHJvY2Vzc2VzIG9uIHRoZSBtYWNoaW5lIHdpdGggaWQgJXMgdXNpbmcgXG4iCisgICAgICAgICAgICIjIGRpc3BsYXkgJXMgdG8gZmluZCB0aGUgRC1CdXMgc2Vzc2lvbiBidXMgd2l0aCB0aGUgYmVsb3cgYWRkcmVzcy5cbiIKKyAgICAgICAgICAgIiMgSWYgdGhlIERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQsIGl0IHdpbGxcbiIKKyAgICAgICAgICAgIiMgYmUgdXNlZCByYXRoZXIgdGhhbiB0aGlzIGZpbGUuXG4iCisgICAgICAgICAgICIjIFNlZSBcIm1hbiBkYnVzLWxhdW5jaFwiIGZvciBtb3JlIGRldGFpbHMuXG4iCisgICAgICAgICAgICJEQlVTX1NFU1NJT05fQlVTX0FERFJFU1M9JXNcbiIKKyAgICAgICAgICAgIkRCVVNfU0VTU0lPTl9CVVNfUElEPSVsZFxuIgorICAgICAgICAgICAiREJVU19TRVNTSU9OX0JVU19XSU5ET1dJRD0lbGRcbiIsCisgICAgICAgICAgIGdldF9tYWNoaW5lX3V1aWQgKCksCisgICAgICAgICAgIGdldGVudiAoIkRJU1BMQVkiKSwKKyAgICAgICAgICAgYWRkcmVzcywgKGxvbmcpcGlkLCAobG9uZyl3aWQpOworCisgIGZjbG9zZSAoZik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludAoreDExX3NhdmVfYWRkcmVzcyAoY2hhciAqYWRkcmVzcywgcGlkX3QgcGlkLCBsb25nICp3aWQpCit7CisgIFdpbmRvdyBpZCA9IHNldF9hZGRyZXNzX2luX3gxMSAoYWRkcmVzcywgcGlkKTsKKyAgaWYgKGlkICE9IE5vbmUpCisgICAgeworICAgICAgaWYgKCFzZXRfYWRkcmVzc19pbl9maWxlIChhZGRyZXNzLCBwaWQsIGlkKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAod2lkICE9IE5VTEwpCisgICAgICAgICp3aWQgPSAobG9uZykgaWQ7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIHJldHVybiBGQUxTRTsKK30KKworaW50Cit4MTFfaW5pdCAodm9pZCkKK3sKKyAgcmV0dXJuIG9wZW5feDExICgpICE9IE5VTEwgJiYgaW5pdF94X2F0b21zICh4ZGlzcGxheSk7Cit9CisKK3ZvaWQKK3gxMV9oYW5kbGVfZXZlbnQgKHZvaWQpCit7CisgIGlmICh4ZGlzcGxheSAhPSBOVUxMKQorICAgIHsgICAgICAKKyAgICAgIHdoaWxlIChYUGVuZGluZyAoeGRpc3BsYXkpKQorICAgICAgICB7CisgICAgICAgICAgWEV2ZW50IGlnbm9yZWQ7CisgICAgICAgICAgWE5leHRFdmVudCAoeGRpc3BsYXksICZpZ25vcmVkKTsKKyAgICAgICAgfQorICAgIH0KK30gIAorCisjZWxzZQordm9pZCBkdW1teV9kYnVzX2xhdW5jaF94MTEgKHZvaWQpOworCit2b2lkIGR1bW15X2RidXNfbGF1bmNoX3gxMSAodm9pZCkgeyB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RidXMvdG9vbHMvZGJ1cy1sYXVuY2guYyBiL2RidXMvdG9vbHMvZGJ1cy1sYXVuY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWM5YWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90b29scy9kYnVzLWxhdW5jaC5jCkBAIC0wLDAgKzEsMTI3OCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWxhdW5jaC5jICBkYnVzLWxhdW5jaCB1dGlsaXR5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA2IFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaGlhZ28gTWFjaWVpcmEgPHRoaWFnb0BrZGUub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1sYXVuY2guaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2lmZGVmIERCVVNfQlVJTERfWDExCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KK2V4dGVybiBEaXNwbGF5ICp4ZGlzcGxheTsKKyNlbmRpZgorCisvKiBQUk9DRVNTRVMKKyAqCisgKiBJZiB5b3UgYXJlIGluIGEgc2hlbGwgYW5kIHJ1biAiZGJ1cy1sYXVuY2ggbXlhcHAiLCBoZXJlIGlzIHdoYXQgaGFwcGVuczoKKyAqCisgKiBzaGVsbCBbKl0KKyAqICAgXC0gbWFpbigpICAgICAgICAgICAgICAgLS1leGVjLS0+IG15YXBwWypdCisgKiAgICAgIFwtICJpbnRlcm1lZGlhdGUgcGFyZW50IgorICogICAgICAgICBcLSBidXMtcnVubmVyICAgICAtLWV4ZWMtLT4gZGJ1cy1kYWVtb24gLS1mb3JrCisgKiAgICAgICAgIFwtIGJhYnlzaXR0ZXJbKl0gICAgICAgICAgICBcLSBmaW5hbCBkYnVzLWRhZW1vblsqXQorICoKKyAqIFByb2Nlc3NlcyBtYXJrZWQgWypdIHN1cnZpdmUgdGhlIGluaXRpYWwgZmx1cnJ5IG9mIGFjdGl2aXR5LgorICoKKyAqIElmIHlvdSBydW4gImRidXMtbGF1bmNoIC0tc2gtc3ludGF4IiB0aGVuIHRoZSBkaWFncmFtIGlzIHRoZSBzYW1lLCBleGNlcHQKKyAqIHRoYXQgbWFpbigpIHByaW50cyB2YXJpYWJsZXMgYW5kIGV4aXRzIDAgaW5zdGVhZCBvZiBleGVjJ2luZyBteWFwcC4KKyAqCisgKiBQSVBFUworICoKKyAqIGRidXMtZGFlbW9uIC0tcHJpbnQtcGlkICAgICAtPiBidXNfcGlkX3RvX2xhdW5jaGVyX3BpcGUgICAgIC0+IG1haW4KKyAqIGRidXMtZGFlbW9uIC0tcHJpbnQtYWRkcmVzcyAtPiBidXNfYWRkcmVzc190b19sYXVuY2hlcl9waXBlIC0+IG1haW4KKyAqIG1haW4gICAgICAgICAgICAgICAgICAgICAgICAtPiBidXNfcGlkX3RvX2JhYnlzaXR0ZXJfcGlwZSAgIC0+IGJhYnlzaXR0ZXIKKyAqCisgKiBUaGUgaW50ZXJtZWRpYXRlIHBhcmVudCBsb29rcyBwcmV0dHkgdXNlbGVzcyBhdCBmaXJzdCBnbGFuY2UuIEl0cyBwdXJwb3NlCisgKiBpcyB0byBhdm9pZCB0aGUgYnVzLXJ1bm5lciBiZWNvbWluZyBhIHpvbWJpZTogd2hlbiB0aGUgaW50ZXJtZWRpYXRlIHBhcmVudAorICogdGVybWluYXRlcywgdGhlIGJ1cy1ydW5uZXIgYW5kIGJhYnlzaXR0ZXIgYXJlIHJlcGFyZW50ZWQgdG8gaW5pdCwgd2hpY2gKKyAqIHJlYXBzIHRoZW0gaWYgdGhleSBoYXZlIGZpbmlzaGVkLiBXZSBjYW4ndCByZWx5IG9uIG1haW4oKSB0byByZWFwIGFyYml0cmFyeQorICogY2hpbGRyZW4gYmVjYXVzZSBpdCBtaWdodCBleGVjIG15YXBwLCBhZnRlciB3aGljaCBpdCBjYW4ndCBiZSByZWxpZWQgb24gdG8KKyAqIHJlYXAgaXRzIGNoaWxkcmVuLiBXZSAqY2FuKiByZWx5IG9uIG1haW4oKSB0byByZWFwIHRoZSBpbnRlcm1lZGlhdGUgcGFyZW50LAorICogYmVjYXVzZSB0aGF0IGhhcHBlbnMgYmVmb3JlIGl0IGV4ZWNzIG15YXBwLgorICoKKyAqIEl0J3MgdW5jbGVhciB3aHkgZGJ1cy1kYWVtb24gbmVlZHMgdG8gZm9yaywgYnV0IHdlIGV4cGxpY2l0bHkgdGVsbCBpdCB0bworICogZm9yIHNvbWUgcmVhc29uLCB0aGVuIHdhaXQgZm9yIGl0LiBJZiB3ZSBsZWZ0IGl0IHVuZGVmaW5lZCwgYSBmb3JraW5nCisgKiBkYnVzLWRhZW1vbiB3b3VsZCBnZXQgdGhlIHBhcmVudCBwcm9jZXNzIHJlcGFyZW50ZWQgdG8gaW5pdCBhbmQgcmVhcGVkCisgKiB3aGVuIHRoZSBpbnRlcm1lZGlhdGUgcGFyZW50IHRlcm1pbmF0ZWQsIGFuZCBhIG5vbi1mb3JraW5nIGRidXMtZGFlbW9uCisgKiB3b3VsZCBnZXQgcmVwYXJlbnRlZCB0byBpbml0IGFuZCBjYXJyeSBvbiB0aGVyZS4KKyAqCisgKiBteWFwcCBpcyBleGVjJ2QgYnkgdGhlIHByb2Nlc3MgdGhhdCBpbml0aWFsbHkgcmFuIG1haW4oKSBzbyB0aGF0IGl0J3MKKyAqIHRoZSBzaGVsbCdzIGNoaWxkLCBzbyB0aGUgc2hlbGwga25vd3MgaG93IHRvIGRvIGpvYiBjb250cm9sIGFuZCBzdHVmZi4KKyAqIFRoaXMgaXMgZGVzaXJhYmxlIGZvciB0aGUgImRidXMtbGF1bmNoIGFuIGFwcGxpY2F0aW9uIiB1c2UtY2FzZSwgbGVzcyBzbworICogZm9yIHRoZSAiZGJ1cy1sYXVuY2ggYSB0ZXN0IHN1aXRlIGluIGFuIGlzb2xhdGVkIHNlc3Npb24iIHVzZS1jYXNlLgorICovCisKK3N0YXRpYyBjaGFyKiBtYWNoaW5lX3V1aWQgPSBOVUxMOworCitjb25zdCBjaGFyKgorZ2V0X21hY2hpbmVfdXVpZCAodm9pZCkKK3sKKyAgcmV0dXJuIG1hY2hpbmVfdXVpZDsKK30KKworc3RhdGljIHZvaWQKK3NhdmVfbWFjaGluZV91dWlkIChjb25zdCBjaGFyICp1dWlkX2FyZykKK3sKKyAgaWYgKHN0cmxlbiAodXVpZF9hcmcpICE9IDMyKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIm1hY2hpbmUgSUQgJyVzJyBsb29rcyBsaWtlIGl0J3MgdGhlIHdyb25nIGxlbmd0aCwgc2hvdWxkIGJlIDMyIGhleCBkaWdpdHMiLAorICAgICAgICAgICAgICAgdXVpZF9hcmcpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIG1hY2hpbmVfdXVpZCA9IHhzdHJkdXAgKHV1aWRfYXJnKTsKK30KKworI2RlZmluZSBVVUlEX01BWExFTiA0MAorLyogUmVhZCB0aGUgbWFjaGluZSB1dWlkIGZyb20gZmlsZSBpZiBuZWVkZWQuIFJldHVybnMgVFJVRSBpZiBtYWNoaW5lX3V1aWQgaXMKKyAqIHNldCBhZnRlciB0aGlzIGZ1bmN0aW9uICovCitzdGF0aWMgaW50CityZWFkX21hY2hpbmVfdXVpZF9pZl9uZWVkZWQgKHZvaWQpCit7CisgIEZJTEUgKmY7CisgIGNoYXIgdXVpZFtVVUlEX01BWExFTl07CisgIHNpemVfdCBsZW47CisgIGludCByZXQgPSBGQUxTRTsKKworICBpZiAobWFjaGluZV91dWlkICE9IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgZiA9IGZvcGVuIChEQlVTX01BQ0hJTkVfVVVJRF9GSUxFLCAiciIpOworICBpZiAoZiA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoZmdldHMgKHV1aWQsIFVVSURfTUFYTEVOLCBmKSA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworCisgIGxlbiA9IHN0cmxlbiAodXVpZCk7CisgIGlmIChsZW4gPCAzMikKKyAgICBnb3RvIG91dDsKKworICAvKiByc3RyaXAgdGhlIHJlYWQgdXVpZCAqLworICB3aGlsZSAobGVuID4gMzEgJiYgaXNzcGFjZSh1dWlkW2xlbiAtIDFdKSkKKyAgICBsZW4tLTsKKworICBpZiAobGVuICE9IDMyKQorICAgIGdvdG8gb3V0OworCisgIHV1aWRbbGVuXSA9ICdcMCc7CisgIG1hY2hpbmVfdXVpZCA9IHhzdHJkdXAgKHV1aWQpOworICB2ZXJib3NlICgiVUlEOiAlc1xuIiwgbWFjaGluZV91dWlkKTsKKyAgcmV0ID0gVFJVRTsKKworb3V0OgorICBmY2xvc2UoZik7CisgIHJldHVybiByZXQ7Cit9CisKKwordm9pZAordmVyYm9zZSAoY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisgIHN0YXRpYyBpbnQgdmVyYm9zZSA9IFRSVUU7CisgIHN0YXRpYyBpbnQgdmVyYm9zZV9pbml0dGVkID0gRkFMU0U7CisgIAorICAvKiB0aGluZ3MgYXJlIHdyaXR0ZW4gYSBiaXQgb2RkbHkgaGVyZSBzbyB0aGF0CisgICAqIGluIHRoZSBub24tdmVyYm9zZSBjYXNlIHdlIGp1c3QgaGF2ZSB0aGUgb25lCisgICAqIGNvbmRpdGlvbmFsIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkuCisgICAqLworICBpZiAoIXZlcmJvc2UpCisgICAgcmV0dXJuOworICAKKyAgaWYgKCF2ZXJib3NlX2luaXR0ZWQpCisgICAgeworICAgICAgdmVyYm9zZSA9IGdldGVudiAoIkRCVVNfVkVSQk9TRSIpICE9IE5VTEw7CisgICAgICB2ZXJib3NlX2luaXR0ZWQgPSBUUlVFOworICAgICAgaWYgKCF2ZXJib3NlKQorICAgICAgICByZXR1cm47CisgICAgfQorCisgIGZwcmludGYgKHN0ZGVyciwgIiVsdTogIiwgKHVuc2lnbmVkIGxvbmcpIGdldHBpZCAoKSk7CisgIAorICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKK30KKworc3RhdGljIHZvaWQKK3VzYWdlIChpbnQgZWNvZGUpCit7CisgIGZwcmludGYgKHN0ZGVyciwgImRidXMtbGF1bmNoIFstLXZlcnNpb25dIFstLWhlbHBdIFstLXNoLXN5bnRheF0gWy0tY3NoLXN5bnRheF0gWy0tYXV0by1zeW50YXhdIFstLWV4aXQtd2l0aC1zZXNzaW9uXVxuIik7CisgIGV4aXQgKGVjb2RlKTsKK30KKworc3RhdGljIHZvaWQKK3ZlcnNpb24gKHZvaWQpCit7CisgIHByaW50ZiAoIkQtQnVzIE1lc3NhZ2UgQnVzIExhdW5jaGVyICVzXG4iCisgICAgICAgICAgIkNvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuXG4iCisgICAgICAgICAgIlRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy5cbiIKKyAgICAgICAgICAiVGhlcmUgaXMgTk8gd2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuXG4iLAorICAgICAgICAgIFZFUlNJT04pOworICBleGl0ICgwKTsKK30KKworY2hhciAqCit4c3RyZHVwIChjb25zdCBjaGFyICpzdHIpCit7CisgIGludCBsZW47CisgIGNoYXIgKmNvcHk7CisgIAorICBpZiAoc3RyID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBsZW4gPSBzdHJsZW4gKHN0cik7CisKKyAgY29weSA9IG1hbGxvYyAobGVuICsgMSk7CisgIGlmIChjb3B5ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbWVtY3B5IChjb3B5LCBzdHIsIGxlbiArIDEpOworICAKKyAgcmV0dXJuIGNvcHk7Cit9CisKK3R5cGVkZWYgZW51bQoreworICBSRUFEX1NUQVRVU19PSywgICAgLyoqPCBSZWFkIHN1Y2NlZWRlZCAqLworICBSRUFEX1NUQVRVU19FUlJPUiwgLyoqPCBTb21lIGtpbmQgb2YgZXJyb3IgKi8KKyAgUkVBRF9TVEFUVVNfRU9GICAgIC8qKjwgRU9GIHJldHVybmVkICovCit9IFJlYWRTdGF0dXM7CisKK3N0YXRpYyBSZWFkU3RhdHVzCityZWFkX2xpbmUgKGludCAgICAgICAgZmQsCisgICAgICAgICAgIGNoYXIgICAgICAqYnVmLAorICAgICAgICAgICBzaXplX3QgICAgIG1heGxlbikKK3sKKyAgc2l6ZV90IGJ5dGVzID0gMDsKKyAgUmVhZFN0YXR1cyByZXR2YWw7CisKKyAgbWVtc2V0IChidWYsICdcMCcsIG1heGxlbik7CisgIG1heGxlbiAtPSAxOyAvKiBlbnN1cmUgbnVsIHRlcm0gKi8KKyAgCisgIHJldHZhbCA9IFJFQURfU1RBVFVTX09LOworICAKKyAgd2hpbGUgKFRSVUUpCisgICAgeworICAgICAgc3NpemVfdCBjaHVuazsgICAgCisgICAgICBzaXplX3QgdG9fcmVhZDsKKyAgICAgIAorICAgIGFnYWluOgorICAgICAgdG9fcmVhZCA9IG1heGxlbiAtIGJ5dGVzOworCisgICAgICBpZiAodG9fcmVhZCA9PSAwKQorICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgY2h1bmsgPSByZWFkIChmZCwKKyAgICAgICAgICAgICAgICAgICAgYnVmICsgYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgIHRvX3JlYWQpOworICAgICAgaWYgKGNodW5rIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgICAgICAKKyAgICAgIGlmIChjaHVuayA8IDApCisgICAgICAgIHsKKyAgICAgICAgICByZXR2YWwgPSBSRUFEX1NUQVRVU19FUlJPUjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoY2h1bmsgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHJldHZhbCA9IFJFQURfU1RBVFVTX0VPRjsKKyAgICAgICAgICBicmVhazsgLyogRU9GICovCisgICAgICAgIH0KKyAgICAgIGVsc2UgLyogY2h1bmsgPiAwICovCisJYnl0ZXMgKz0gY2h1bms7CisgICAgfQorCisgIGlmIChyZXR2YWwgPT0gUkVBRF9TVEFUVVNfRU9GICYmCisgICAgICBieXRlcyA+IDApCisgICAgcmV0dmFsID0gUkVBRF9TVEFUVVNfT0s7CisgIAorICAvKiB3aGFjayBuZXdsaW5lICovCisgIGlmIChyZXR2YWwgIT0gUkVBRF9TVEFUVVNfRVJST1IgJiYKKyAgICAgIGJ5dGVzID4gMCAmJgorICAgICAgYnVmW2J5dGVzLTFdID09ICdcbicpCisgICAgYnVmW2J5dGVzLTFdID0gJ1wwJzsKKyAgCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBSZWFkU3RhdHVzCityZWFkX3BpZCAoaW50ICAgICAgICBmZCwKKyAgICAgICAgICBwaWRfdCAgICAgKmJ1ZikKK3sKKyAgc2l6ZV90IGJ5dGVzID0gMDsKKyAgUmVhZFN0YXR1cyByZXR2YWw7CisKKyAgcmV0dmFsID0gUkVBRF9TVEFUVVNfT0s7CisgIAorICB3aGlsZSAoVFJVRSkKKyAgICB7CisgICAgICBzc2l6ZV90IGNodW5rOyAgICAKKyAgICAgIHNpemVfdCB0b19yZWFkOworICAgICAgCisgICAgYWdhaW46CisgICAgICB0b19yZWFkID0gc2l6ZW9mIChwaWRfdCkgLSBieXRlczsKKworICAgICAgaWYgKHRvX3JlYWQgPT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGNodW5rID0gcmVhZCAoZmQsCisgICAgICAgICAgICAgICAgICAgICgoY2hhciopYnVmKSArIGJ5dGVzLAorICAgICAgICAgICAgICAgICAgICB0b19yZWFkKTsKKyAgICAgIGlmIChjaHVuayA8IDAgJiYgZXJybm8gPT0gRUlOVFIpCisgICAgICAgIGdvdG8gYWdhaW47CisgICAgICAgICAgCisgICAgICBpZiAoY2h1bmsgPCAwKQorICAgICAgICB7CisgICAgICAgICAgcmV0dmFsID0gUkVBRF9TVEFUVVNfRVJST1I7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGNodW5rID09IDApCisgICAgICAgIHsKKyAgICAgICAgICByZXR2YWwgPSBSRUFEX1NUQVRVU19FT0Y7CisgICAgICAgICAgYnJlYWs7IC8qIEVPRiAqLworICAgICAgICB9CisgICAgICBlbHNlIC8qIGNodW5rID4gMCAqLworCWJ5dGVzICs9IGNodW5rOworICAgIH0KKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZAorZG9fd3JpdGUgKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCit7CisgIHNpemVfdCBieXRlc193cml0dGVuOworICBpbnQgcmV0OworICAKKyAgYnl0ZXNfd3JpdHRlbiA9IDA7CisgIAorIGFnYWluOgorICAKKyAgcmV0ID0gd3JpdGUgKGZkLCAoKGNvbnN0IGNoYXIqKWJ1ZikgKyBieXRlc193cml0dGVuLCBjb3VudCAtIGJ5dGVzX3dyaXR0ZW4pOworCisgIGlmIChyZXQgPCAwKQorICAgIHsKKyAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkZhaWxlZCB0byB3cml0ZSBkYXRhIHRvIHBpcGUhICVzXG4iLAorICAgICAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgICAgIGV4aXQgKDEpOyAvKiBnaXZlIHVwLCB3ZSBzdWNrICovCisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICBieXRlc193cml0dGVuICs9IHJldDsKKyAgCisgIGlmIChieXRlc193cml0dGVuIDwgY291bnQpCisgICAgZ290byBhZ2FpbjsKK30KKworc3RhdGljIHZvaWQKK3dyaXRlX3BpZCAoaW50ICAgZmQsCisgICAgICAgICAgIHBpZF90IHBpZCkKK3sKKyAgZG9fd3JpdGUgKGZkLCAmcGlkLCBzaXplb2YgKHBpZCkpOworfQorCitzdGF0aWMgaW50Citkb193YWl0cGlkIChwaWRfdCBwaWQpCit7CisgIGludCByZXQ7CisgIAorIGFnYWluOgorICByZXQgPSB3YWl0cGlkIChwaWQsIE5VTEwsIDApOworCisgIGlmIChyZXQgPCAwICYmCisgICAgICBlcnJubyA9PSBFSU5UUikKKyAgICBnb3RvIGFnYWluOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBwaWRfdCBidXNfcGlkX3RvX2tpbGwgPSAtMTsKKworc3RhdGljIHZvaWQKK2tpbGxfYnVzKHZvaWQpCit7CisgIHZlcmJvc2UgKCJLaWxsaW5nIG1lc3NhZ2UgYnVzIGFuZCBleGl0aW5nIGJhYnlzaXR0ZXJcbiIpOworICBraWxsIChidXNfcGlkX3RvX2tpbGwsIFNJR1RFUk0pOworICBzbGVlcCAoMyk7CisgIGtpbGwgKGJ1c19waWRfdG9fa2lsbCwgU0lHS0lMTCk7Cit9CisKK3ZvaWQKK2tpbGxfYnVzX2FuZF9leGl0IChpbnQgZXhpdGNvZGUpCit7CisgIC8qIGluIGNhc2UgdGhlc2UgcG9pbnQgdG8gYW55IE5GUyBtb3VudHMsIGdldCByaWQgb2YgdGhlbSBpbW1lZGlhdGVseSAqLworICBjbG9zZSAoMCk7CisgIGNsb3NlICgxKTsKKyAgY2xvc2UgKDIpOworCisgIGtpbGxfYnVzKCk7CisKKyAgZXhpdCAoZXhpdGNvZGUpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfdmFyaWFibGVzIChjb25zdCBjaGFyICpidXNfYWRkcmVzcywgcGlkX3QgYnVzX3BpZCwgbG9uZyBidXNfd2lkLAorCQkgaW50IGNfc2hlbGxfc3ludGF4LCBpbnQgYm91cm5lX3NoZWxsX3N5bnRheCwKKwkJIGludCBiaW5hcnlfc3ludGF4KQoreworICBpZiAoYmluYXJ5X3N5bnRheCkKKyAgICB7CisgICAgICBkb193cml0ZSAoMSwgYnVzX2FkZHJlc3MsIHN0cmxlbiAoYnVzX2FkZHJlc3MpICsgMSk7CisgICAgICBkb193cml0ZSAoMSwgJmJ1c19waWQsIHNpemVvZiBidXNfcGlkKTsKKyAgICAgIGRvX3dyaXRlICgxLCAmYnVzX3dpZCwgc2l6ZW9mIGJ1c193aWQpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgZWxzZSBpZiAoY19zaGVsbF9zeW50YXgpCisgICAgeworICAgICAgcHJpbnRmICgic2V0ZW52IERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyAnJXMnO1xuIiwgYnVzX2FkZHJlc3MpOwkKKyAgICAgIHByaW50ZiAoInNldCBEQlVTX1NFU1NJT05fQlVTX1BJRD0lbGQ7XG4iLCAobG9uZykgYnVzX3BpZCk7CisgICAgICBpZiAoYnVzX3dpZCkKKyAgICAgICAgcHJpbnRmICgic2V0IERCVVNfU0VTU0lPTl9CVVNfV0lORE9XSUQ9JWxkO1xuIiwgKGxvbmcpIGJ1c193aWQpOworICAgICAgZmZsdXNoIChzdGRvdXQpOworICAgIH0KKyAgZWxzZSBpZiAoYm91cm5lX3NoZWxsX3N5bnRheCkKKyAgICB7CisgICAgICBwcmludGYgKCJEQlVTX1NFU1NJT05fQlVTX0FERFJFU1M9JyVzJztcbiIsIGJ1c19hZGRyZXNzKTsKKyAgICAgIHByaW50ZiAoImV4cG9ydCBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1M7XG4iKTsKKyAgICAgIHByaW50ZiAoIkRCVVNfU0VTU0lPTl9CVVNfUElEPSVsZDtcbiIsIChsb25nKSBidXNfcGlkKTsKKyAgICAgIGlmIChidXNfd2lkKQorICAgICAgICBwcmludGYgKCJEQlVTX1NFU1NJT05fQlVTX1dJTkRPV0lEPSVsZDtcbiIsIChsb25nKSBidXNfd2lkKTsKKyAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwcmludGYgKCJEQlVTX1NFU1NJT05fQlVTX0FERFJFU1M9JXNcbiIsIGJ1c19hZGRyZXNzKTsKKyAgICAgIHByaW50ZiAoIkRCVVNfU0VTU0lPTl9CVVNfUElEPSVsZFxuIiwgKGxvbmcpIGJ1c19waWQpOworICAgICAgaWYgKGJ1c193aWQpCisJcHJpbnRmICgiREJVU19TRVNTSU9OX0JVU19XSU5ET1dJRD0lbGRcbiIsIChsb25nKSBidXNfd2lkKTsKKyAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZ290X3NpZ2h1cCA9IEZBTFNFOworCitzdGF0aWMgdm9pZAorc2lnbmFsX2hhbmRsZXIgKGludCBzaWcpCit7CisgIHN3aXRjaCAoc2lnKQorICAgIHsKKyNpZmRlZiBTSUdIVVAKKyAgICBjYXNlIFNJR0hVUDoKKyNlbmRpZgorICAgIGNhc2UgU0lHSU5UOgorICAgIGNhc2UgU0lHVEVSTToKKyAgICAgIGdvdF9zaWdodXAgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAora2lsbF9idXNfd2hlbl9zZXNzaW9uX2VuZHMgKHZvaWQpCit7CisgIGludCB0dHlfZmQ7CisgIGludCB4X2ZkOworICBmZF9zZXQgcmVhZF9zZXQ7CisgIGZkX3NldCBlcnJfc2V0OworICBzdHJ1Y3Qgc2lnYWN0aW9uIGFjdDsKKyAgc2lnc2V0X3QgZW1wdHlfbWFzazsKKyAgCisgIC8qIGluc3RhbGwgU0lHSFVQIGhhbmRsZXIgKi8KKyAgZ290X3NpZ2h1cCA9IEZBTFNFOworICBzaWdlbXB0eXNldCAoJmVtcHR5X21hc2spOworICBhY3Quc2FfaGFuZGxlciA9IHNpZ25hbF9oYW5kbGVyOworICBhY3Quc2FfbWFzayAgICA9IGVtcHR5X21hc2s7CisgIGFjdC5zYV9mbGFncyAgID0gMDsKKyAgc2lnYWN0aW9uIChTSUdIVVAsICAmYWN0LCBOVUxMKTsKKyAgc2lnYWN0aW9uIChTSUdURVJNLCAgJmFjdCwgTlVMTCk7CisgIHNpZ2FjdGlvbiAoU0lHSU5ULCAgJmFjdCwgTlVMTCk7CisgIAorI2lmZGVmIERCVVNfQlVJTERfWDExCisgIHgxMV9pbml0KCk7CisgIGlmICh4ZGlzcGxheSAhPSBOVUxMKQorICAgIHsKKyAgICAgIHhfZmQgPSBDb25uZWN0aW9uTnVtYmVyICh4ZGlzcGxheSk7CisgICAgfQorICBlbHNlCisgICAgeF9mZCA9IC0xOworI2Vsc2UKKyAgeF9mZCA9IC0xOworI2VuZGlmCisKKyAgaWYgKGlzYXR0eSAoMCkpCisgICAgdHR5X2ZkID0gMDsKKyAgZWxzZQorICAgIHR0eV9mZCA9IC0xOworCisgIGlmICh4X2ZkID49IDApCisgICAgeworICAgICAgdmVyYm9zZSAoInNlc3Npb24gbGlmZXRpbWUgaXMgZGVmaW5lZCBieSBYLCBub3QgbW9uaXRvcmluZyBzdGRpblxuIik7CisgICAgICB0dHlfZmQgPSAtMTsKKyAgICB9CisgIGVsc2UgaWYgKHR0eV9mZCA+PSAwKQorICAgIHsKKyAgICAgIHZlcmJvc2UgKCJzdGRpbiBpc2F0dHkoKSwgbW9uaXRvcmluZyBpdFxuIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdmVyYm9zZSAoInN0ZGluIHdhcyBub3QgYSBUVFksIG5vdCBtb25pdG9yaW5nIGl0XG4iKTsKKyAgICB9CisKKyAgaWYgKHR0eV9mZCA8IDAgJiYgeF9mZCA8IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiTm8gdGVybWluYWwgb24gc3RhbmRhcmQgaW5wdXQgYW5kIG5vIFggZGlzcGxheTsgY2Fubm90IGF0dGFjaCBtZXNzYWdlIGJ1cyB0byBzZXNzaW9uIGxpZmV0aW1lXG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgCisgIHdoaWxlIChUUlVFKQorICAgIHsKKyNpZmRlZiBEQlVTX0JVSUxEX1gxMQorICAgICAgLyogRHVtcCBldmVudHMgb24gdGhlIGZsb29yLCBhbmQgbGV0CisgICAgICAgKiBJTyBlcnJvciBoYW5kbGVyIHJ1biBpZiB3ZSBsb3NlCisgICAgICAgKiB0aGUgWCBjb25uZWN0aW9uLiBJdCdzIGltcG9ydGFudCB0bworICAgICAgICogcnVuIHRoaXMgYmVmb3JlIGdvaW5nIGludG8gc2VsZWN0KCkgc2luY2UKKyAgICAgICAqIHdlIG1pZ2h0IGhhdmUgcXVldWVkIG91dGdvaW5nIG1lc3NhZ2VzIG9yCisgICAgICAgKiBldmVudHMuCisgICAgICAgKi8KKyAgICAgIHgxMV9oYW5kbGVfZXZlbnQgKCk7CisjZW5kaWYKKyAgICAgIAorICAgICAgRkRfWkVSTyAoJnJlYWRfc2V0KTsKKyAgICAgIEZEX1pFUk8gKCZlcnJfc2V0KTsKKworICAgICAgaWYgKHR0eV9mZCA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgRkRfU0VUICh0dHlfZmQsICZyZWFkX3NldCk7CisgICAgICAgICAgRkRfU0VUICh0dHlfZmQsICZlcnJfc2V0KTsKKyAgICAgICAgfQorCisgICAgICBpZiAoeF9mZCA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgRkRfU0VUICh4X2ZkLCAmcmVhZF9zZXQpOworICAgICAgICAgIEZEX1NFVCAoeF9mZCwgJmVycl9zZXQpOworICAgICAgICB9CisKKyAgICAgIHNlbGVjdCAoTUFYICh0dHlfZmQsIHhfZmQpICsgMSwKKyAgICAgICAgICAgICAgJnJlYWRfc2V0LCBOVUxMLCAmZXJyX3NldCwgTlVMTCk7CisKKyAgICAgIGlmIChnb3Rfc2lnaHVwKQorICAgICAgICB7CisgICAgICAgICAgdmVyYm9zZSAoIkdvdCBTSUdIVVAsIGV4aXRpbmdcbiIpOworICAgICAgICAgIGtpbGxfYnVzX2FuZF9leGl0ICgwKTsKKyAgICAgICAgfQorICAgICAgCisjaWZkZWYgREJVU19CVUlMRF9YMTEKKyAgICAgIC8qIEV2ZW50cyB3aWxsIGJlIHByb2Nlc3NlZCBiZWZvcmUgd2Ugc2VsZWN0IGFnYWluCisgICAgICAgKi8KKyAgICAgIGlmICh4X2ZkID49IDApCisgICAgICAgIHZlcmJvc2UgKCJYIGZkIGNvbmRpdGlvbiByZWFkaW5nID0gJWQgZXJyb3IgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgRkRfSVNTRVQgKHhfZmQsICZyZWFkX3NldCksCisgICAgICAgICAgICAgICAgIEZEX0lTU0VUICh4X2ZkLCAmZXJyX3NldCkpOworI2VuZGlmCisKKyAgICAgIGlmICh0dHlfZmQgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChGRF9JU1NFVCAodHR5X2ZkLCAmcmVhZF9zZXQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpbnQgYnl0ZXNfcmVhZDsKKyAgICAgICAgICAgICAgY2hhciBkaXNjYXJkWzUxMl07CisKKyAgICAgICAgICAgICAgdmVyYm9zZSAoIlRUWSByZWFkeSBmb3IgcmVhZGluZ1xuIik7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBieXRlc19yZWFkID0gcmVhZCAodHR5X2ZkLCBkaXNjYXJkLCBzaXplb2YgKGRpc2NhcmQpKTsKKworICAgICAgICAgICAgICB2ZXJib3NlICgiUmVhZCAlZCBieXRlcyBmcm9tIFRUWSBlcnJubyA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBieXRlc19yZWFkLCBlcnJubyk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoYnl0ZXNfcmVhZCA9PSAwKQorICAgICAgICAgICAgICAgIGtpbGxfYnVzX2FuZF9leGl0ICgwKTsgLyogRU9GICovCisgICAgICAgICAgICAgIGVsc2UgaWYgKGJ5dGVzX3JlYWQgPCAwICYmIGVycm5vICE9IEVJTlRSKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbiBJIGRvbid0IHRoaW5rOyB0byBhdm9pZAorICAgICAgICAgICAgICAgICAgICogc3Bpbm5pbmcgb24gdGhlIGZkIGZvcmV2ZXIgd2UgZXhpdC4KKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZGJ1cy1sYXVuY2g6IGVycm9yIHJlYWRpbmcgZnJvbSBzdGRpbjogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICAgICAgICAgIGtpbGxfYnVzX2FuZF9leGl0ICgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoRkRfSVNTRVQgKHR0eV9mZCwgJmVycl9zZXQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB2ZXJib3NlICgiVFRZIGhhcyBlcnJvciBjb25kaXRpb25cbiIpOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAga2lsbF9idXNfYW5kX2V4aXQgKDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorYmFieXNpdCAoaW50ICAgZXhpdF93aXRoX3Nlc3Npb24sCisgICAgICAgICBwaWRfdCBjaGlsZF9waWQsCisgICAgICAgICBpbnQgICByZWFkX2J1c19waWRfZmQpICAvKiByZWFkIHBpZCBmcm9tIGhlcmUgKi8KK3sKKyAgaW50IHJldDsKKyAgaW50IGRldl9udWxsX2ZkOworICBjb25zdCBjaGFyICpzOworCisgIHZlcmJvc2UgKCJiYWJ5c2l0dGluZywgZXhpdF93aXRoX3Nlc3Npb24gPSAlZCwgY2hpbGRfcGlkID0gJWxkLCByZWFkX2J1c19waWRfZmQgPSAlZFxuIiwKKyAgICAgICAgICAgZXhpdF93aXRoX3Nlc3Npb24sIChsb25nKSBjaGlsZF9waWQsIHJlYWRfYnVzX3BpZF9mZCk7CisgIAorICAvKiBXZSBjaGRpciAoIi8iKSBzaW5jZSB3ZSBhcmUgcGVyc2lzdGVudCBhbmQgZGFlbW9uLWxpa2UsIGFuZCBmb3JrCisgICAqIGFnYWluIHNvIGRidXMtbGF1bmNoIGNhbiByZWFwIHRoZSBwYXJlbnQuICBIb3dldmVyLCB3ZSBkb24ndAorICAgKiBzZXRzaWQoKSBvciBjbG9zZSBmZCAwIGJlY2F1c2UgdGhlIGlkZWEgaXMgdG8gcmVtYWluIGF0dGFjaGVkCisgICAqIHRvIHRoZSB0dHkgYW5kIHRoZSBYIHNlcnZlciBpbiBvcmRlciB0byBraWxsIHRoZSBtZXNzYWdlIGJ1cworICAgKiB3aGVuIHRoZSBzZXNzaW9uIGVuZHMuCisgICAqLworCisgIGlmIChjaGRpciAoIi8iKSA8IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQ291bGQgbm90IGNoYW5nZSB0byByb290IGRpcmVjdG9yeTogJXNcbiIsCisgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICAvKiBDbG9zZSBzdGRvdXQvc3RkZXJyIHNvIHdlIGRvbid0IGJsb2NrIGFuICJldmFsIiBvciBvdGhlcndpc2UKKyAgICogbG9jayB1cC4gc3Rkb3V0IGlzIHN0aWxsIGNoYWluaW5nIHRocm91Z2ggdG8gZGJ1cy1sYXVuY2gKKyAgICogYW5kIGluIHR1cm4gdG8gdGhlIHBhcmVudCBzaGVsbC4KKyAgICovCisgIGRldl9udWxsX2ZkID0gb3BlbiAoIi9kZXYvbnVsbCIsIE9fUkRXUik7CisgIGlmIChkZXZfbnVsbF9mZCA+PSAwKQorICAgIHsKKyAgICAgIGlmICghZXhpdF93aXRoX3Nlc3Npb24pCisgICAgICAgIGR1cDIgKGRldl9udWxsX2ZkLCAwKTsKKyAgICAgIGR1cDIgKGRldl9udWxsX2ZkLCAxKTsKKyAgICAgIHMgPSBnZXRlbnYgKCJEQlVTX0RFQlVHX09VVFBVVCIpOworICAgICAgaWYgKHMgPT0gTlVMTCB8fCAqcyA9PSAnXDAnKQorICAgICAgICBkdXAyIChkZXZfbnVsbF9mZCwgMik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRmFpbGVkIHRvIG9wZW4gL2Rldi9udWxsOiAlc1xuIiwKKyAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgLyogY29udGludWUsIHdoeSBub3QgKi8KKyAgICB9CisgIAorICByZXQgPSBmb3JrICgpOworCisgIGlmIChyZXQgPCAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgImZvcmsoKSBmYWlsZWQgaW4gYmFieXNpdHRlcjogJXNcbiIsCisgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBpZiAocmV0ID4gMCkKKyAgICB7CisgICAgICAvKiBQYXJlbnQgcmVhcHMgcHJlLWZvcmsgcGFydCBvZiBidXMgZGFlbW9uLCB0aGVuIGV4aXRzIGFuZCBpcworICAgICAgICogcmVhcGVkIHNvIHRoZSBiYWJ5c2l0dGVyIGlzbid0IGEgem9tYmllCisgICAgICAgKi8KKworICAgICAgdmVyYm9zZSAoIj09PSBCYWJ5c2l0dGVyJ3MgaW50ZXJtZWRpYXRlIHBhcmVudCBjb250aW51ZXMgYWdhaW5cbiIpOworICAgICAgCisgICAgICBpZiAoZG9fd2FpdHBpZCAoY2hpbGRfcGlkKSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBzaG91bGRuJ3QgaGFwcGVuICovCisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRmFpbGVkIHdhaXRwaWQoKSB3YWl0aW5nIGZvciBidXMgZGFlbW9uJ3MgcGFyZW50XG4iKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorCisgICAgICB2ZXJib3NlICgiQmFieXNpdHRlcidzIGludGVybWVkaWF0ZSBwYXJlbnQgZXhpdGluZ1xuIik7CisgICAgICAKKyAgICAgIGV4aXQgKDApOworICAgIH0KKworICAvKiBDaGlsZCBjb250aW51ZXMgKi8KKyAgdmVyYm9zZSAoIj09PSBCYWJ5c2l0dGVyIHByb2Nlc3MgY3JlYXRlZFxuIik7CisKKyAgdmVyYm9zZSAoIlJlYWRpbmcgUElEIGZyb20gYnVzXG4iKTsKKyAgICAgIAorICBzd2l0Y2ggKHJlYWRfcGlkIChyZWFkX2J1c19waWRfZmQsICZidXNfcGlkX3RvX2tpbGwpKQorICAgIHsKKyAgICBjYXNlIFJFQURfU1RBVFVTX09LOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBSRUFEX1NUQVRVU19FT0Y6CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJFT0YgaW4gZGJ1cy1sYXVuY2ggcmVhZGluZyBQSUQgZnJvbSBidXMgZGFlbW9uXG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSRUFEX1NUQVRVU19FUlJPUjoKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIGRidXMtbGF1bmNoIHJlYWRpbmcgUElEIGZyb20gYnVzIGRhZW1vbjogJXNcbiIsCisJICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgdmVyYm9zZSAoIkdvdCBQSUQgJWxkIGZyb20gZGFlbW9uXG4iLAorICAgICAgICAgICAobG9uZykgYnVzX3BpZF90b19raWxsKTsKKyAgCisgIGlmIChleGl0X3dpdGhfc2Vzc2lvbikKKyAgICB7CisgICAgICAvKiBCdXMgaXMgbm93IHN0YXJ0ZWQgYW5kIGxhdW5jaGVyIGhhcyBuZWVkZWQgaW5mbzsKKyAgICAgICAqIHdlIGNvbm5lY3QgdG8gWCBkaXNwbGF5IGFuZCB0dHkgYW5kIHdhaXQgdG8KKyAgICAgICAqIGtpbGwgYnVzIGlmIHJlcXVlc3RlZC4KKyAgICAgICAqLworICAgICAgCisgICAgICBraWxsX2J1c193aGVuX3Nlc3Npb25fZW5kcyAoKTsKKyAgICB9CisKKyAgdmVyYm9zZSAoIkJhYnlzaXR0ZXIgZXhpdGluZ1xuIik7CisgIAorICBleGl0ICgwKTsKK30KKworc3RhdGljIHZvaWQKK2RvX2Nsb3NlX3N0ZGVyciAodm9pZCkKK3sKKyAgaW50IGZkOworCisgIGZmbHVzaCAoc3RkZXJyKTsKKworICAvKiBkYnVzLWxhdW5jaCBpcyBhIFVuaXgtb25seSBwcm9ncmFtLCBzbyB3ZSBjYW4gcmVseSBvbiAvZGV2L251bGwgYmVpbmcgdGhlcmUuCisgICAqIFdlJ3JlIGluY2x1ZGluZyB1bmlzdGQuaCBhbmQgd2UncmUgZGVhbGluZyB3aXRoIHNoL2NzaCBsYXVuY2ggc2VxdWVuY2VzLi4uCisgICAqLworICBmZCA9IG9wZW4gKCIvZGV2L251bGwiLCBPX1JEV1IpOworICBpZiAoZmQgPT0gLTEpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiSW50ZXJuYWwgZXJyb3I6IGNhbm5vdCBvcGVuIC9kZXYvbnVsbDogJXMiLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBjbG9zZSAoMik7CisgIGlmIChkdXAyIChmZCwgMikgPT0gLTEpCisgICAgeworICAgICAgLyogZXJyb3I7IHdlIGNhbid0IHJlcG9ydCBhbiBlcnJvciBhbnltb3JlLi4uICovCisgICAgICBleGl0ICgxKTsKKyAgICB9CisgIGNsb3NlIChmZCk7Cit9CisKK3N0YXRpYyB2b2lkCitwYXNzX2luZm8gKGNvbnN0IGNoYXIgKnJ1bnByb2csIGNvbnN0IGNoYXIgKmJ1c19hZGRyZXNzLCBwaWRfdCBidXNfcGlkLAorICAgICAgICAgICBsb25nIGJ1c193aWQsIGludCBjX3NoZWxsX3N5bnRheCwgaW50IGJvdXJuZV9zaGVsbF9zeW50YXgsCisgICAgICAgICAgIGludCBiaW5hcnlfc3ludGF4LAorICAgICAgICAgICBpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGludCByZW1haW5pbmdfYXJncykKK3sKKyAgY2hhciAqZW52dmFyID0gTlVMTDsKKyAgY2hhciAqKmFyZ3MgPSBOVUxMOworCisgIGlmIChydW5wcm9nKQorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICBlbnZ2YXIgPSBtYWxsb2MgKHN0cmxlbiAoIkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUz0iKSArCisgICAgICAgICAgc3RybGVuIChidXNfYWRkcmVzcykgKyAxKTsKKyAgICAgIGFyZ3MgPSBtYWxsb2MgKHNpemVvZiAoY2hhciAqKSAqICgoYXJnYy1yZW1haW5pbmdfYXJncykrMikpOworCisgICAgICBpZiAoZW52dmFyID09IE5VTEwgfHwgYXJncyA9PSBOVUxMKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICBhcmdzWzBdID0geHN0cmR1cCAocnVucHJvZyk7CisgICAgICBpZiAoIWFyZ3NbMF0pCisgICAgICAgIGdvdG8gb29tOworICAgICBmb3IgKGkgPSAxOyBpIDw9IChhcmdjLXJlbWFpbmluZ19hcmdzKTsgaSsrKQorICAgICAgeworICAgICAgICBzaXplX3QgbGVuID0gc3RybGVuIChhcmd2W3JlbWFpbmluZ19hcmdzK2ktMV0pKzE7CisgICAgICAgIGFyZ3NbaV0gPSBtYWxsb2MgKGxlbik7CisgICAgICAgIGlmICghYXJnc1tpXSkKKyAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgc3RybmNweSAoYXJnc1tpXSwgYXJndltyZW1haW5pbmdfYXJncytpLTFdLCBsZW4pOworICAgICAgIH0KKyAgICAgYXJnc1tpXSA9IE5VTEw7CisKKyAgICAgc3RyY3B5IChlbnZ2YXIsICJEQlVTX1NFU1NJT05fQlVTX0FERFJFU1M9Iik7CisgICAgIHN0cmNhdCAoZW52dmFyLCBidXNfYWRkcmVzcyk7CisgICAgIHB1dGVudiAoZW52dmFyKTsKKworICAgICBleGVjdnAgKHJ1bnByb2csIGFyZ3MpOworICAgICBmcHJpbnRmIChzdGRlcnIsICJDb3VsZG4ndCBleGVjICVzOiAlc1xuIiwgcnVucHJvZywgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgIGV4aXQgKDEpOworICAgIH0KKyAgIGVsc2UKKyAgICB7CisgICAgICBwcmludF92YXJpYWJsZXMgKGJ1c19hZGRyZXNzLCBidXNfcGlkLCBidXNfd2lkLCBjX3NoZWxsX3N5bnRheCwKKyAgICAgICAgIGJvdXJuZV9zaGVsbF9zeW50YXgsIGJpbmFyeV9zeW50YXgpOworICAgIH0KKyAgdmVyYm9zZSAoImRidXMtbGF1bmNoIGV4aXRpbmdcbiIpOworCisgIGZmbHVzaCAoc3Rkb3V0KTsKKyAgZmZsdXNoIChzdGRlcnIpOworICBjbG9zZSAoMSk7CisgIGNsb3NlICgyKTsKKyAgZXhpdCAoMCk7Citvb206CisgIGlmIChlbnZ2YXIpCisgICAgZnJlZSAoZW52dmFyKTsKKworICBpZiAoYXJncykKKyAgICBmcmVlIChhcmdzKTsKKworICBmcHJpbnRmIChzdGRlcnIsICJPdXQgb2YgbWVtb3J5ISIpOworICBleGl0ICgxKTsKK30KKworI2RlZmluZSBSRUFEX0VORCAgMAorI2RlZmluZSBXUklURV9FTkQgMQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgY29uc3QgY2hhciAqcHJldl9hcmc7CisgIGNvbnN0IGNoYXIgKnNobmFtZTsKKyAgY29uc3QgY2hhciAqcnVucHJvZyA9IE5VTEw7CisgIGludCByZW1haW5pbmdfYXJncyA9IDA7CisgIGludCBleGl0X3dpdGhfc2Vzc2lvbjsKKyAgaW50IGJpbmFyeV9zeW50YXggPSBGQUxTRTsKKyAgaW50IGNfc2hlbGxfc3ludGF4ID0gRkFMU0U7CisgIGludCBib3VybmVfc2hlbGxfc3ludGF4ID0gRkFMU0U7CisgIGludCBhdXRvX3NoZWxsX3N5bnRheCA9IEZBTFNFOworICBpbnQgYXV0b2xhdW5jaCA9IEZBTFNFOworICBpbnQgcmVxdWlyZXNfYXJnID0gRkFMU0U7CisgIGludCBjbG9zZV9zdGRlcnIgPSBGQUxTRTsKKyAgaW50IGk7CisgIGludCByZXQ7CisgIGludCBidXNfcGlkX3RvX2xhdW5jaGVyX3BpcGVbMl07CisgIGludCBidXNfcGlkX3RvX2JhYnlzaXR0ZXJfcGlwZVsyXTsKKyAgaW50IGJ1c19hZGRyZXNzX3RvX2xhdW5jaGVyX3BpcGVbMl07CisgIGNoYXIgKmNvbmZpZ19maWxlOworICAKKyAgZXhpdF93aXRoX3Nlc3Npb24gPSBGQUxTRTsKKyAgY29uZmlnX2ZpbGUgPSBOVUxMOworICAKKyAgcHJldl9hcmcgPSBOVUxMOworICBpID0gMTsKKyAgd2hpbGUgKGkgPCBhcmdjKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisgCisgICAgICBpZiAoc3RyY21wIChhcmcsICItLWhlbHAiKSA9PSAwIHx8CisgICAgICAgICAgc3RyY21wIChhcmcsICItaCIpID09IDAgfHwKKyAgICAgICAgICBzdHJjbXAgKGFyZywgIi0/IikgPT0gMCkKKyAgICAgICAgdXNhZ2UgKDApOworICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLWF1dG8tc3ludGF4IikgPT0gMCkKKyAgICAgICAgYXV0b19zaGVsbF9zeW50YXggPSBUUlVFOworICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItYyIpID09IDAgfHwKKyAgICAgICAgICAgICAgIHN0cmNtcCAoYXJnLCAiLS1jc2gtc3ludGF4IikgPT0gMCkKKyAgICAgICAgY19zaGVsbF9zeW50YXggPSBUUlVFOworICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItcyIpID09IDAgfHwKKyAgICAgICAgICAgICAgIHN0cmNtcCAoYXJnLCAiLS1zaC1zeW50YXgiKSA9PSAwKQorICAgICAgICBib3VybmVfc2hlbGxfc3ludGF4ID0gVFJVRTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1iaW5hcnktc3ludGF4IikgPT0gMCkKKyAgICAgICAgYmluYXJ5X3N5bnRheCA9IFRSVUU7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tdmVyc2lvbiIpID09IDApCisgICAgICAgIHZlcnNpb24gKCk7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tZXhpdC13aXRoLXNlc3Npb24iKSA9PSAwKQorICAgICAgICBleGl0X3dpdGhfc2Vzc2lvbiA9IFRSVUU7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tY2xvc2Utc3RkZXJyIikgPT0gMCkKKyAgICAgICAgY2xvc2Vfc3RkZXJyID0gVFJVRTsKKyAgICAgIGVsc2UgaWYgKHN0cnN0ciAoYXJnLCAiLS1hdXRvbGF1bmNoPSIpID09IGFyZykKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGNoYXIgKnM7CisKKyAgICAgICAgICBpZiAoYXV0b2xhdW5jaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiLS1hdXRvbGF1bmNoIGdpdmVuIHR3aWNlXG4iKTsKKyAgICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgYXV0b2xhdW5jaCA9IFRSVUU7CisKKyAgICAgICAgICBzID0gc3RyY2hyIChhcmcsICc9Jyk7CisgICAgICAgICAgKytzOworCisgICAgICAgICAgc2F2ZV9tYWNoaW5lX3V1aWQgKHMpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChwcmV2X2FyZyAmJgorICAgICAgICAgICAgICAgc3RyY21wIChwcmV2X2FyZywgIi0tYXV0b2xhdW5jaCIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoYXV0b2xhdW5jaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiLS1hdXRvbGF1bmNoIGdpdmVuIHR3aWNlXG4iKTsKKyAgICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgYXV0b2xhdW5jaCA9IFRSVUU7CisKKyAgICAgICAgICBzYXZlX21hY2hpbmVfdXVpZCAoYXJnKTsKKwkgIHJlcXVpcmVzX2FyZyA9IEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tYXV0b2xhdW5jaCIpID09IDApCisJcmVxdWlyZXNfYXJnID0gVFJVRTsKKyAgICAgIGVsc2UgaWYgKHN0cnN0ciAoYXJnLCAiLS1jb25maWctZmlsZT0iKSA9PSBhcmcpCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBjaGFyICpmaWxlOworCisgICAgICAgICAgaWYgKGNvbmZpZ19maWxlICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIi0tY29uZmlnLWZpbGUgZ2l2ZW4gdHdpY2VcbiIpOworICAgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBmaWxlID0gc3RyY2hyIChhcmcsICc9Jyk7CisgICAgICAgICAgKytmaWxlOworCisgICAgICAgICAgY29uZmlnX2ZpbGUgPSB4c3RyZHVwIChmaWxlKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAocHJldl9hcmcgJiYKKyAgICAgICAgICAgICAgIHN0cmNtcCAocHJldl9hcmcsICItLWNvbmZpZy1maWxlIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChjb25maWdfZmlsZSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICItLWNvbmZpZy1maWxlIGdpdmVuIHR3aWNlXG4iKTsKKyAgICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBjb25maWdfZmlsZSA9IHhzdHJkdXAgKGFyZyk7CisJICByZXF1aXJlc19hcmcgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLWNvbmZpZy1maWxlIikgPT0gMCkKKwlyZXF1aXJlc19hcmcgPSBUUlVFOworICAgICAgZWxzZSBpZiAoYXJnWzBdID09ICctJykKKyAgICAgICAgeworICAgICAgICAgIGlmIChzdHJjbXAgKGFyZywgIi0tIikgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiT3B0aW9uIGAlcycgaXMgdW5rbm93bi5cbiIsIGFyZyk7CisgICAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcnVucHJvZyA9IGFyZ3ZbaSsxXTsKKyAgICAgICAgICAgICAgcmVtYWluaW5nX2FyZ3MgPSBpKzI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisJeworCSAgcnVucHJvZyA9IGFyZzsKKwkgIHJlbWFpbmluZ19hcmdzID0gaSsxOworCSAgYnJlYWs7CisJfQorICAgICAgCisgICAgICBwcmV2X2FyZyA9IGFyZzsKKyAgICAgIAorICAgICAgKytpOworICAgIH0KKyAgaWYgKHJlcXVpcmVzX2FyZykKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJPcHRpb24gYCVzJyByZXF1aXJlcyBhbiBhcmd1bWVudC5cbiIsIHByZXZfYXJnKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBpZiAoYXV0b19zaGVsbF9zeW50YXgpCisgICAgeworICAgICAgaWYgKChzaG5hbWUgPSBnZXRlbnYgKCJTSEVMTCIpKSAhPSBOVUxMKQorICAgICAgIHsKKyAgICAgICAgIGlmICghc3RybmNtcCAoc2huYW1lICsgc3RybGVuIChzaG5hbWUpIC0gMywgImNzaCIsIDMpKQorICAgICAgICAgICBjX3NoZWxsX3N5bnRheCA9IFRSVUU7CisgICAgICAgICBlbHNlCisgICAgICAgICAgIGJvdXJuZV9zaGVsbF9zeW50YXggPSBUUlVFOworICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICBib3VybmVfc2hlbGxfc3ludGF4ID0gVFJVRTsKKyAgICB9ICAKKworICBpZiAoZXhpdF93aXRoX3Nlc3Npb24pCisgICAgdmVyYm9zZSAoIi0tZXhpdC13aXRoLXNlc3Npb24gZW5hYmxlZFxuIik7CisKKyAgaWYgKGF1dG9sYXVuY2gpCisgICAgeyAgICAgIAorI2lmbmRlZiBEQlVTX0JVSUxEX1gxMQorICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQXV0b2xhdW5jaCByZXF1ZXN0ZWQsIGJ1dCBYMTEgc3VwcG9ydCBub3QgY29tcGlsZWQgaW4uXG4iCisJICAgICAgICJDYW5ub3QgY29udGludWUuXG4iKTsKKyAgICAgIGV4aXQgKDEpOworI2Vsc2UgLyogREJVU19CVUlMRF9YMTEgKi8KKyNpZm5kZWYgREJVU19FTkFCTEVfWDExX0FVVE9MQVVOQ0gKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlgxMSBhdXRvbGF1bmNoIHN1cHBvcnQgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lLlxuIik7CisgICAgICBleGl0ICgxKTsKKyNlbHNlIC8qIERCVVNfRU5BQkxFX1gxMV9BVVRPTEFVTkNIICovCisgICAgICBjaGFyICphZGRyZXNzOworICAgICAgcGlkX3QgcGlkOworICAgICAgbG9uZyB3aWQ7CisgICAgICAKKyAgICAgIGlmIChnZXRfbWFjaGluZV91dWlkICgpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJNYWNoaW5lIFVVSUQgbm90IHByb3ZpZGVkIGFzIGFyZyB0byAtLWF1dG9sYXVuY2hcbiIpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisKKyAgICAgIHZlcmJvc2UgKCJBdXRvbGF1bmNoIGVuYWJsZWQgKHVzaW5nIFgxMSkuXG4iKTsKKyAgICAgIGlmICghZXhpdF93aXRoX3Nlc3Npb24pCisJeworCSAgdmVyYm9zZSAoIi0tZXhpdC13aXRoLXNlc3Npb24gYXV0b21hdGljYWxseSBlbmFibGVkXG4iKTsKKwkgIGV4aXRfd2l0aF9zZXNzaW9uID0gVFJVRTsKKwl9CisKKyAgICAgIGlmICgheDExX2luaXQgKCkpCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCAiQXV0b2xhdW5jaCBlcnJvcjogWDExIGluaXRpYWxpemF0aW9uIGZhaWxlZC5cbiIpOworCSAgZXhpdCAoMSk7CisJfQorCisgICAgICBpZiAoIXgxMV9nZXRfYWRkcmVzcyAoJmFkZHJlc3MsICZwaWQsICZ3aWQpKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgIkF1dG9sYXVuY2ggZXJyb3I6IFgxMSBjb21tdW5pY2F0aW9uIGVycm9yLlxuIik7CisJICBleGl0ICgxKTsKKwl9CisKKyAgICAgIGlmIChhZGRyZXNzICE9IE5VTEwpCisJeworCSAgdmVyYm9zZSAoImRidXMtZGFlbW9uIGlzIGFscmVhZHkgcnVubmluZy4gUmV0dXJuaW5nIGV4aXN0aW5nIHBhcmFtZXRlcnMuXG4iKTsKKwkgIHBhc3NfaW5mbyAocnVucHJvZywgYWRkcmVzcywgcGlkLCB3aWQsIGNfc2hlbGxfc3ludGF4LAorCQkJICAgYm91cm5lX3NoZWxsX3N5bnRheCwgYmluYXJ5X3N5bnRheCwgYXJnYywgYXJndiwgcmVtYWluaW5nX2FyZ3MpOworCSAgZXhpdCAoMCk7CisJfQorI2VuZGlmIC8qIERCVVNfRU5BQkxFX1gxMV9BVVRPTEFVTkNIICovCisgICAgfQorICBlbHNlIGlmIChyZWFkX21hY2hpbmVfdXVpZF9pZl9uZWVkZWQoKSkKKyAgICB7CisgICAgICB4MTFfaW5pdCgpOworI2VuZGlmIC8qIERCVVNfQlVJTERfWDExICovCisgICAgfQorCisKKyAgaWYgKHBpcGUgKGJ1c19waWRfdG9fbGF1bmNoZXJfcGlwZSkgPCAwIHx8CisgICAgICBwaXBlIChidXNfYWRkcmVzc190b19sYXVuY2hlcl9waXBlKSA8IDAgfHwKKyAgICAgIHBpcGUgKGJ1c19waWRfdG9fYmFieXNpdHRlcl9waXBlKSA8IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgcGlwZTogJXNcbiIsCisgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICByZXQgPSBmb3JrICgpOworICBpZiAocmV0IDwgMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJGYWlsZWQgdG8gZm9yazogJXNcbiIsCisgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBpZiAocmV0ID09IDApCisgICAgeworICAgICAgLyogQ2hpbGQgKi8KKyNkZWZpbmUgTUFYX0ZEX0xFTiA2NAorICAgICAgY2hhciB3cml0ZV9waWRfZmRfYXNfc3RyaW5nW01BWF9GRF9MRU5dOworICAgICAgY2hhciB3cml0ZV9hZGRyZXNzX2ZkX2FzX3N0cmluZ1tNQVhfRkRfTEVOXTsKKworI2lmZGVmIERCVVNfQlVJTERfWDExCisgICAgICB4ZGlzcGxheSA9IE5VTEw7CisjZW5kaWYKKworICAgICAgaWYgKGNsb3NlX3N0ZGVycikKKwlkb19jbG9zZV9zdGRlcnIgKCk7CisKKyAgICAgIHZlcmJvc2UgKCI9PT0gQmFieXNpdHRlcidzIGludGVybWVkaWF0ZSBwYXJlbnQgY3JlYXRlZFxuIik7CisKKyAgICAgIC8qIEZvcmsgb25jZSBtb3JlIHRvIGNyZWF0ZSBiYWJ5c2l0dGVyICovCisgICAgICAKKyAgICAgIHJldCA9IGZvcmsgKCk7CisgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkZhaWxlZCB0byBmb3JrOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAocmV0ID4gMCkKKyAgICAgICAgeworICAgICAgICAgIC8qIEluIGJhYnlzaXR0ZXIgKi8KKyAgICAgICAgICB2ZXJib3NlICgiPT09IEJhYnlzaXR0ZXIncyBpbnRlcm1lZGlhdGUgcGFyZW50IGNvbnRpbnVlc1xuIik7CisgICAgICAgICAgCisgICAgICAgICAgY2xvc2UgKGJ1c19waWRfdG9fbGF1bmNoZXJfcGlwZVtSRUFEX0VORF0pOworCSAgY2xvc2UgKGJ1c19waWRfdG9fbGF1bmNoZXJfcGlwZVtXUklURV9FTkRdKTsKKyAgICAgICAgICBjbG9zZSAoYnVzX2FkZHJlc3NfdG9fbGF1bmNoZXJfcGlwZVtSRUFEX0VORF0pOworICAgICAgICAgIGNsb3NlIChidXNfYWRkcmVzc190b19sYXVuY2hlcl9waXBlW1dSSVRFX0VORF0pOworICAgICAgICAgIGNsb3NlIChidXNfcGlkX3RvX2JhYnlzaXR0ZXJfcGlwZVtXUklURV9FTkRdKTsKKworICAgICAgICAgIC8qIGJhYnlzaXQoKSB3aWxsIGZvcmsgKmFnYWluKgorICAgICAgICAgICAqIGFuZCB3aWxsIGFsc28gcmVhcCB0aGUgcHJlLWZvcmtlZCBidXMKKyAgICAgICAgICAgKiBkYWVtb24KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBiYWJ5c2l0IChleGl0X3dpdGhfc2Vzc2lvbiwgcmV0LAorICAgICAgICAgICAgICAgICAgIGJ1c19waWRfdG9fYmFieXNpdHRlcl9waXBlW1JFQURfRU5EXSk7CisgICAgICAgICAgZXhpdCAoMCk7CisgICAgICAgIH0KKworICAgICAgdmVyYm9zZSAoIj09PSBCdXMgZXhlYyBwcm9jZXNzIGNyZWF0ZWRcbiIpOworICAgICAgCisgICAgICAvKiBOb3cgd2UgYXJlIHRoZSBidXMgcHJvY2VzcyAod2VsbCwgYWxtb3N0OworICAgICAgICogZGJ1cy1kYWVtb24gaXRzZWxmIGZvcmtzIGFnYWluKQorICAgICAgICovCisgICAgICBjbG9zZSAoYnVzX3BpZF90b19sYXVuY2hlcl9waXBlW1JFQURfRU5EXSk7CisgICAgICBjbG9zZSAoYnVzX2FkZHJlc3NfdG9fbGF1bmNoZXJfcGlwZVtSRUFEX0VORF0pOworICAgICAgY2xvc2UgKGJ1c19waWRfdG9fYmFieXNpdHRlcl9waXBlW1JFQURfRU5EXSk7CisgICAgICBjbG9zZSAoYnVzX3BpZF90b19iYWJ5c2l0dGVyX3BpcGVbV1JJVEVfRU5EXSk7CisKKyAgICAgIHNwcmludGYgKHdyaXRlX3BpZF9mZF9hc19zdHJpbmcsCisgICAgICAgICAgICAgICAiJWQiLCBidXNfcGlkX3RvX2xhdW5jaGVyX3BpcGVbV1JJVEVfRU5EXSk7CisKKyAgICAgIHNwcmludGYgKHdyaXRlX2FkZHJlc3NfZmRfYXNfc3RyaW5nLAorICAgICAgICAgICAgICAgIiVkIiwgYnVzX2FkZHJlc3NfdG9fbGF1bmNoZXJfcGlwZVtXUklURV9FTkRdKTsKKworICAgICAgdmVyYm9zZSAoIkNhbGxpbmcgZXhlYygpXG4iKTsKKyAKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTIAorICAgICAgLyogZXhlYyBmcm9tIHRlc3RkaXIgKi8KKyAgICAgIGlmIChnZXRlbnYoIkRCVVNfVVNFX1RFU1RfQklOQVJZIikgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGV4ZWNsIChURVNUX0JVU19CSU5BUlksCisgICAgICAgICAgICAgICAgIFRFU1RfQlVTX0JJTkFSWSwKKyAgICAgICAgICAgICAgICAgIi0tZm9yayIsCisgICAgICAgICAgICAgICAgICItLXByaW50LXBpZCIsIHdyaXRlX3BpZF9mZF9hc19zdHJpbmcsCisgICAgICAgICAgICAgICAgICItLXByaW50LWFkZHJlc3MiLCB3cml0ZV9hZGRyZXNzX2ZkX2FzX3N0cmluZywKKyAgICAgICAgICAgICAgICAgY29uZmlnX2ZpbGUgPyAiLS1jb25maWctZmlsZSIgOiAiLS1zZXNzaW9uIiwKKyAgICAgICAgICAgICAgICAgY29uZmlnX2ZpbGUsIC8qIGhhcyB0byBiZSBsYXN0IGluIHRoaXMgdmFyYXJncyBsaXN0ICovCisgICAgICAgICAgICAgICAgIE5VTEwpOyAKKworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGV4ZWN1dGUgdGVzdCBtZXNzYWdlIGJ1cyBkYWVtb24gJXM6ICVzLiBXaWxsIHRyeSBhZ2FpbiB3aXRoIHRoZSBzeXN0ZW0gcGF0aC5cbiIsCisgICAgICAgICAgICAgICAgICAgVEVTVF9CVVNfQklOQVJZLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgfQorICNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCisKKyAgICAgIGV4ZWNsIChEQlVTX0RBRU1PTkRJUiIvZGJ1cy1kYWVtb24iLAorICAgICAgICAgICAgIERCVVNfREFFTU9ORElSIi9kYnVzLWRhZW1vbiIsCisgICAgICAgICAgICAgIi0tZm9yayIsCisgICAgICAgICAgICAgIi0tcHJpbnQtcGlkIiwgd3JpdGVfcGlkX2ZkX2FzX3N0cmluZywKKyAgICAgICAgICAgICAiLS1wcmludC1hZGRyZXNzIiwgd3JpdGVfYWRkcmVzc19mZF9hc19zdHJpbmcsCisgICAgICAgICAgICAgY29uZmlnX2ZpbGUgPyAiLS1jb25maWctZmlsZSIgOiAiLS1zZXNzaW9uIiwKKyAgICAgICAgICAgICBjb25maWdfZmlsZSwgLyogaGFzIHRvIGJlIGxhc3QgaW4gdGhpcyB2YXJhcmdzIGxpc3QgKi8KKyAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgICAgICAgICAgIkZhaWxlZCB0byBleGVjdXRlIG1lc3NhZ2UgYnVzIGRhZW1vbiAlczogJXMuICBXaWxsIHRyeSBhZ2FpbiB3aXRob3V0IGZ1bGwgcGF0aC5cbiIsCisgICAgICAgICAgICAgICBEQlVTX0RBRU1PTkRJUiIvZGJ1cy1kYWVtb24iLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIAorICAgICAgLyoKKyAgICAgICAqIElmIGl0IGZhaWxlZCwgdHJ5IHJ1bm5pbmcgd2l0aG91dCBmdWxsIFBBVEguICBOb3RlIHRoaXMgaXMgbmVlZGVkCisgICAgICAgKiBiZWNhdXNlIHRoZSBidWlsZCBwcm9jZXNzIGJ1aWxkcyB0aGUgcnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLmNvbmYKKyAgICAgICAqIGZpbGUgYW5kIHRoZSBkYnVzLWRhZW1vbiB3aWxsIG5vdCBiZSBpbiB0aGUgaW5zdGFsbCBsb2NhdGlvbiBkdXJpbmcKKyAgICAgICAqIGJ1aWxkIHRpbWUuCisgICAgICAgKi8KKyAgICAgIGV4ZWNscCAoImRidXMtZGFlbW9uIiwKKyAgICAgICAgICAgICAgImRidXMtZGFlbW9uIiwKKyAgICAgICAgICAgICAgIi0tZm9yayIsCisgICAgICAgICAgICAgICItLXByaW50LXBpZCIsIHdyaXRlX3BpZF9mZF9hc19zdHJpbmcsCisgICAgICAgICAgICAgICItLXByaW50LWFkZHJlc3MiLCB3cml0ZV9hZGRyZXNzX2ZkX2FzX3N0cmluZywKKyAgICAgICAgICAgICAgY29uZmlnX2ZpbGUgPyAiLS1jb25maWctZmlsZSIgOiAiLS1zZXNzaW9uIiwKKyAgICAgICAgICAgICAgY29uZmlnX2ZpbGUsIC8qIGhhcyB0byBiZSBsYXN0IGluIHRoaXMgdmFyYXJncyBsaXN0ICovCisgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICBmcHJpbnRmIChzdGRlcnIsCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGV4ZWN1dGUgbWVzc2FnZSBidXMgZGFlbW9uOiAlc1xuIiwKKyAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogUGFyZW50ICovCisjZGVmaW5lIE1BWF9QSURfTEVOIDY0CisgICAgICBwaWRfdCBidXNfcGlkOyAgCisgICAgICBjaGFyIGJ1c19hZGRyZXNzW01BWF9BRERSX0xFTl07CisgICAgICBjaGFyIGJ1ZltNQVhfUElEX0xFTl07CisgICAgICBjaGFyICplbmQ7CisgICAgICBsb25nIHdpZCA9IDA7CisgICAgICBsb25nIHZhbDsKKyAgICAgIGludCByZXQyOworCisgICAgICB2ZXJib3NlICgiPT09IFBhcmVudCBkYnVzLWxhdW5jaCBjb250aW51ZXNcbiIpOworICAgICAgCisgICAgICBjbG9zZSAoYnVzX3BpZF90b19sYXVuY2hlcl9waXBlW1dSSVRFX0VORF0pOworICAgICAgY2xvc2UgKGJ1c19hZGRyZXNzX3RvX2xhdW5jaGVyX3BpcGVbV1JJVEVfRU5EXSk7CisgICAgICBjbG9zZSAoYnVzX3BpZF90b19iYWJ5c2l0dGVyX3BpcGVbUkVBRF9FTkRdKTsKKworICAgICAgdmVyYm9zZSAoIldhaXRpbmcgZm9yIGJhYnlzaXR0ZXIncyBpbnRlcm1lZGlhdGUgcGFyZW50XG4iKTsKKyAgICAgIAorICAgICAgLyogSW1tZWRpYXRlbHkgcmVhcCBwYXJlbnQgb2YgYmFieXNpdHRlcgorICAgICAgICogKHdoaWNoIHdhcyBjcmVhdGVkIGp1c3QgZm9yIHVzIHRvIHJlYXApCisgICAgICAgKi8KKyAgICAgIGlmIChkb193YWl0cGlkIChyZXQpIDwgMCkKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkZhaWxlZCB0byB3YWl0cGlkKCkgZm9yIGJhYnlzaXR0ZXIgaW50ZXJtZWRpYXRlIHByb2Nlc3M6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisKKyAgICAgIHZlcmJvc2UgKCJSZWFkaW5nIGFkZHJlc3MgZnJvbSBidXNcbiIpOworICAgICAgCisgICAgICAvKiBSZWFkIHRoZSBwaXBlIGRhdGEsIHByaW50LCBhbmQgZXhpdCAqLworICAgICAgc3dpdGNoIChyZWFkX2xpbmUgKGJ1c19hZGRyZXNzX3RvX2xhdW5jaGVyX3BpcGVbUkVBRF9FTkRdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19hZGRyZXNzLCBNQVhfQUREUl9MRU4pKQorICAgICAgICB7CisgICAgICAgIGNhc2UgUkVBRF9TVEFUVVNfT0s6CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVBRF9TVEFUVVNfRU9GOgorICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVPRiBpbiBkYnVzLWxhdW5jaCByZWFkaW5nIGFkZHJlc3MgZnJvbSBidXMgZGFlbW9uXG4iKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRUFEX1NUQVRVU19FUlJPUjoKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBkYnVzLWxhdW5jaCByZWFkaW5nIGFkZHJlc3MgZnJvbSBidXMgZGFlbW9uOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgIGNsb3NlIChidXNfYWRkcmVzc190b19sYXVuY2hlcl9waXBlW1JFQURfRU5EXSk7CisKKyAgICAgIHZlcmJvc2UgKCJSZWFkaW5nIFBJRCBmcm9tIGRhZW1vblxuIik7CisgICAgICAvKiBOb3cgcmVhZCBkYXRhICovCisgICAgICBzd2l0Y2ggKHJlYWRfbGluZSAoYnVzX3BpZF90b19sYXVuY2hlcl9waXBlW1JFQURfRU5EXSwgYnVmLCBNQVhfUElEX0xFTikpCisJeworCWNhc2UgUkVBRF9TVEFUVVNfT0s6CisJICBicmVhazsKKwljYXNlIFJFQURfU1RBVFVTX0VPRjoKKwkgIGZwcmludGYgKHN0ZGVyciwgIkVPRiByZWFkaW5nIFBJRCBmcm9tIGJ1cyBkYWVtb25cbiIpOworCSAgZXhpdCAoMSk7CisJICBicmVhazsKKwljYXNlIFJFQURfU1RBVFVTX0VSUk9SOgorCSAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgcmVhZGluZyBQSUQgZnJvbSBidXMgZGFlbW9uOiAlc1xuIiwKKwkJICAgc3RyZXJyb3IgKGVycm5vKSk7CisJICBleGl0ICgxKTsKKwkgIGJyZWFrOworCX0KKworICAgICAgZW5kID0gTlVMTDsKKyAgICAgIHZhbCA9IHN0cnRvbCAoYnVmLCAmZW5kLCAwKTsKKyAgICAgIGlmIChidWYgPT0gZW5kIHx8IGVuZCA9PSBOVUxMKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgIkZhaWxlZCB0byBwYXJzZSBidXMgUElEIFwiJXNcIjogJXNcbiIsCisJCSAgIGJ1Ziwgc3RyZXJyb3IgKGVycm5vKSk7CisJICBleGl0ICgxKTsKKwl9CisKKyAgICAgIGJ1c19waWQgPSB2YWw7CisKKyAgICAgIGNsb3NlIChidXNfcGlkX3RvX2xhdW5jaGVyX3BpcGVbUkVBRF9FTkRdKTsKKworI2lmZGVmIERCVVNfRU5BQkxFX1gxMV9BVVRPTEFVTkNICisgICAgICBpZiAoeGRpc3BsYXkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIHZlcmJvc2UoIlNhdmluZyB4MTEgYWRkcmVzc1xuIik7CisgICAgICAgICAgcmV0MiA9IHgxMV9zYXZlX2FkZHJlc3MgKGJ1c19hZGRyZXNzLCBidXNfcGlkLCAmd2lkKTsKKyAgICAgICAgICAvKiBPbmx5IGdldCBhbiBleGlzdGluZyBkYnVzIHNlc3Npb24gd2hlbiBhdXRvbGF1bmNoaW5nICovCisgICAgICAgICAgaWYgKGF1dG9sYXVuY2gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChyZXQyID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY2hhciAqYWRkcmVzcyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAvKiBhbm90aGVyIHdpbmRvdyBnb3QgYWRkZWQuIFJldHVybiBpdHMgYWRkcmVzcyAqLworICAgICAgICAgICAgICAgICAgYnVzX3BpZF90b19raWxsID0gYnVzX3BpZDsKKyAgICAgICAgICAgICAgICAgIGlmICh4MTFfZ2V0X2FkZHJlc3MgKCZhZGRyZXNzLCAmYnVzX3BpZCwgJndpZCkKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgYWRkcmVzcyAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSAoImRidXMtZGFlbW9uIGlzIGFscmVhZHkgcnVubmluZy4gUmV0dXJuaW5nIGV4aXN0aW5nIHBhcmFtZXRlcnMuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAvKiBLaWxsIHRoZSBvbGQgYnVzICovCisgICAgICAgICAgICAgICAgICAgICAga2lsbF9idXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICBwYXNzX2luZm8gKHJ1bnByb2csIGFkZHJlc3MsIGJ1c19waWQsIHdpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjX3NoZWxsX3N5bnRheCwgYm91cm5lX3NoZWxsX3N5bnRheCwgYmluYXJ5X3N5bnRheCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhcmdjLCBhcmd2LCByZW1haW5pbmdfYXJncyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKHJldDIgPCAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIHNhdmluZyBidXMgaW5mb3JtYXRpb24uXG4iKTsKKyAgICAgICAgICAgICAgICAgIGJ1c19waWRfdG9fa2lsbCA9IGJ1c19waWQ7CisgICAgICAgICAgICAgICAgICBraWxsX2J1c19hbmRfZXhpdCAoMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKworICAgICAgLyogRm9yd2FyZCB0aGUgcGlkIHRvIHRoZSBiYWJ5c2l0dGVyICovCisgICAgICB3cml0ZV9waWQgKGJ1c19waWRfdG9fYmFieXNpdHRlcl9waXBlW1dSSVRFX0VORF0sIGJ1c19waWQpOworICAgICAgY2xvc2UgKGJ1c19waWRfdG9fYmFieXNpdHRlcl9waXBlW1dSSVRFX0VORF0pOworCisgICAgICAgcGFzc19pbmZvIChydW5wcm9nLCBidXNfYWRkcmVzcywgYnVzX3BpZCwgd2lkLCBjX3NoZWxsX3N5bnRheCwKKyAgICAgICAgICAgICAgYm91cm5lX3NoZWxsX3N5bnRheCwgYmluYXJ5X3N5bnRheCwgYXJnYywgYXJndiwgcmVtYWluaW5nX2FyZ3MpOworICAgIH0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RidXMvdG9vbHMvZGJ1cy1sYXVuY2guaCBiL2RidXMvdG9vbHMvZGJ1cy1sYXVuY2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjIwYmI4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90b29scy9kYnVzLWxhdW5jaC5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1sYXVuY2guaCAgZGJ1cy1sYXVuY2ggdXRpbGl0eQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaGlhZ28gTWFjaWVpcmEgPHRoaWFnb0BrZGUub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfTEFVTkNIX0gKKyNkZWZpbmUgREJVU19MQVVOQ0hfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpZm5kZWYgVFJVRQorI2RlZmluZSBUUlVFICgxKQorI2VuZGlmCisKKyNpZm5kZWYgRkFMU0UKKyNkZWZpbmUgRkFMU0UgKDApCisjZW5kaWYKKworI3VuZGVmICBNQVgKKyNkZWZpbmUgTUFYKGEsIGIpICAoKChhKSA+IChiKSkgPyAoYSkgOiAoYikpCisKKyNkZWZpbmUgTUFYX0FERFJfTEVOIDUxMgorCisvKiBkZWZpbmVkIGluIGRidXMtbGF1bmNoLmMgKi8KK3ZvaWQgdmVyYm9zZSAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworY2hhciAqeHN0cmR1cCAoY29uc3QgY2hhciAqc3RyKTsKK3ZvaWQga2lsbF9idXNfYW5kX2V4aXQgKGludCBleGl0Y29kZSk7CisKK2NvbnN0IGNoYXIqIGdldF9tYWNoaW5lX3V1aWQgKHZvaWQpOworCisjaWZkZWYgREJVU19CVUlMRF9YMTEKKy8qIGRlZmluZWQgaW4gZGJ1cy1sYXVuY2gteDExLmMgKi8KK2ludCB4MTFfaW5pdCAodm9pZCk7CitpbnQgeDExX2dldF9hZGRyZXNzIChjaGFyICoqcGFkZHJlc3MsIHBpZF90ICpwaWQsIGxvbmcgKndpZCk7CitpbnQgeDExX3NhdmVfYWRkcmVzcyAoY2hhciAqYWRkcmVzcywgcGlkX3QgcGlkLCBsb25nICp3aWQpOwordm9pZCB4MTFfaGFuZGxlX2V2ZW50ICh2b2lkKTsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RidXMvdG9vbHMvZGJ1cy1tb25pdG9yLmMgYi9kYnVzL3Rvb2xzL2RidXMtbW9uaXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YjU0NzgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rvb2xzL2RidXMtbW9uaXRvci5jCkBAIC0wLDAgKzEsNDE2IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbW9uaXRvci5jICBVdGlsaXR5IHByb2dyYW0gdG8gbW9uaXRvciBtZXNzYWdlcyBvbiB0aGUgYnVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFBoaWxpcCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBEQlVTX1dJTgorI2luY2x1ZGUgPHdpbnNvY2syLmg+CisjdW5kZWYgaW50ZXJmYWNlCisjZWxzZQorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgImRidXMtcHJpbnQtbWVzc2FnZS5oIgorCisjZGVmaW5lIEVBVkVTRFJPUFBJTkdfUlVMRSAiZWF2ZXNkcm9wPXRydWUiCisKKyNpZmRlZiBEQlVTX1dJTgorCisvKiBnZXR0aW1lb2ZkYXkgaXMgbm90IGRlZmluZWQgb24gd2luZG93cyAqLworI2RlZmluZSBEQlVTX1NFQ09ORFNfU0lOQ0VfMTYwMSAxMTY0NDQ3MzYwMExMCisjZGVmaW5lIERCVVNfVVNFQ19JTl9TRUMgICAgICAgIDEwMDAwMDBMTAorCisjaWZkZWYgREJVU19XSU5DRQorCisjaWZuZGVmIF9JT0xCRgorI2RlZmluZSBfSU9MQkYgMHg0MAorI2VuZGlmCisjaWZuZGVmIF9JT05CRgorI2RlZmluZSBfSU9OQkYgMHgwNAorI2VuZGlmCisKK3ZvaWQKK0dldFN5c3RlbVRpbWVBc0ZpbGVUaW1lIChMUEZJTEVUSU1FIGZ0cCkKK3sKKyAgU1lTVEVNVElNRSBzdDsKKyAgR2V0U3lzdGVtVGltZSAoJnN0KTsKKyAgU3lzdGVtVGltZVRvRmlsZVRpbWUgKCZzdCwgZnRwKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50CitnZXR0aW1lb2ZkYXkgKHN0cnVjdCB0aW1ldmFsICpfX3AsCisJICAgICAgdm9pZCAqX190KQoreworICB1bmlvbiB7CisgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgbnMxMDA7IC8qdGltZSBzaW5jZSAxIEphbiAxNjAxIGluIDEwMG5zIHVuaXRzICovCisgICAgICBGSUxFVElNRSAgICAgICAgICAgZnQ7CisgICAgfSBub3c7CisKKyAgR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUgKCZub3cuZnQpOworICBfX3AtPnR2X3VzZWMgPSAobG9uZykgKChub3cubnMxMDAgLyAxMExMKSAlIERCVVNfVVNFQ19JTl9TRUMpOworICBfX3AtPnR2X3NlYyAgPSAobG9uZykoKChub3cubnMxMDAgLyAxMExMKSAvIERCVVNfU0VDT05EU19TSU5DRV8xNjAxKSAtIERCVVNfU0VDT05EU19TSU5DRV8xNjAxKTsKKworICByZXR1cm4gMDsKK30KKyNlbmRpZgorCitpbmxpbmUgc3RhdGljIHZvaWQKK29vbSAoY29uc3QgY2hhciAqZG9pbmcpCit7CisgIGZwcmludGYgKHN0ZGVyciwgIk9PTSB3aGlsZSAlc1xuIiwgZG9pbmcpOworICBleGl0ICgxKTsKK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0Cittb25pdG9yX2ZpbHRlcl9mdW5jIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisJCSAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlLAorCQkgICAgIHZvaWQgICAgICAgICAgICAgICAqdXNlcl9kYXRhKQoreworICBwcmludF9tZXNzYWdlIChtZXNzYWdlLCBGQUxTRSk7CisgIAorICBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0xPQ0FMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpc2Nvbm5lY3RlZCIpKQorICAgIGV4aXQgKDApOworICAKKyAgLyogQ29uY2VwdHVhbGx5IHdlIHdhbnQgdGhpcyB0byBiZQorICAgKiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRCwgYnV0IHRoaXMgcmFpc2VzCisgICAqIHNvbWUgcHJvYmxlbXMuICBTZWUgYnVnIDE3MTkuCisgICAqLworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworfQorCisjaWZkZWYgX19BUFBMRV9fCisjZGVmaW5lIFBST0ZJTEVfVElNRURfRk9STUFUICIlc1x0JWx1XHQlZCIKKyNlbHNlCisjZGVmaW5lIFBST0ZJTEVfVElNRURfRk9STUFUICIlc1x0JWx1XHQlbHUiCisjZW5kaWYKKyNkZWZpbmUgVFJBUF9OVUxMX1NUUklORyhzdHIpICgoc3RyKSA/IChzdHIpIDogIjxub25lPiIpCisKK3R5cGVkZWYgZW51bQoreworICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX1NFUklBTCA9IDEsCisgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfUkVQTFlfU0VSSUFMID0gMiwKKyAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19TRU5ERVIgPSA0LAorICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX0RFU1RJTkFUSU9OID0gOCwKKyAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19QQVRIID0gMTYsCisgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfSU5URVJGQUNFID0gMzIsCisgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfTUVNQkVSID0gNjQsCisgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfRVJST1JfTkFNRSA9IDEyOAorfSBQcm9maWxlQXR0cmlidXRlRmxhZ3M7CisKK3N0YXRpYyB2b2lkCitwcm9maWxlX3ByaW50X3dpdGhfYXR0cnMgKGNvbnN0IGNoYXIgKnR5cGUsIERCdXNNZXNzYWdlICptZXNzYWdlLAorICBzdHJ1Y3QgdGltZXZhbCAqdCwgUHJvZmlsZUF0dHJpYnV0ZUZsYWdzIGF0dHJzKQoreworICBwcmludGYgKFBST0ZJTEVfVElNRURfRk9STUFULCB0eXBlLCB0LT50dl9zZWMsIHQtPnR2X3VzZWMpOworCisgIGlmIChhdHRycyAmIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfU0VSSUFMKQorICAgIHByaW50ZiAoIlx0JXUiLCBkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAobWVzc2FnZSkpOworCisgIGlmIChhdHRycyAmIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfUkVQTFlfU0VSSUFMKQorICAgIHByaW50ZiAoIlx0JXUiLCBkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSkpOworCisgIGlmIChhdHRycyAmIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfU0VOREVSKQorICAgIHByaW50ZiAoIlx0JXMiLCBUUkFQX05VTExfU1RSSU5HIChkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkpKTsKKworICBpZiAoYXR0cnMgJiBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX0RFU1RJTkFUSU9OKQorICAgIHByaW50ZiAoIlx0JXMiLCBUUkFQX05VTExfU1RSSU5HIChkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChtZXNzYWdlKSkpOworCisgIGlmIChhdHRycyAmIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfUEFUSCkKKyAgICBwcmludGYgKCJcdCVzIiwgVFJBUF9OVUxMX1NUUklORyAoZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtZXNzYWdlKSkpOworCisgIGlmIChhdHRycyAmIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfSU5URVJGQUNFKQorICAgIHByaW50ZiAoIlx0JXMiLCBUUkFQX05VTExfU1RSSU5HIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkpKTsKKworICBpZiAoYXR0cnMgJiBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX01FTUJFUikKKyAgICBwcmludGYgKCJcdCVzIiwgVFJBUF9OVUxMX1NUUklORyAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpKSk7CisKKyAgaWYgKGF0dHJzICYgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19FUlJPUl9OQU1FKQorICAgIHByaW50ZiAoIlx0JXMiLCBUUkFQX05VTExfU1RSSU5HIChkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpKSk7CisKKyAgcHJpbnRmICgiXG4iKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X21lc3NhZ2VfcHJvZmlsZSAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIHN0cnVjdCB0aW1ldmFsIHQ7CisKKyAgaWYgKGdldHRpbWVvZmRheSAoJnQsIE5VTEwpIDwgMCkKKyAgICB7CisgICAgICBwcmludGYgKCJ1blxuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHN3aXRjaCAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSkKKyAgICB7CisgICAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMOgorCXByb2ZpbGVfcHJpbnRfd2l0aF9hdHRycyAoIm1jIiwgbWVzc2FnZSwgJnQsCisJICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX1NFUklBTCB8CisJICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX1NFTkRFUiB8CisJICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX1BBVEggfAorCSAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19JTlRFUkZBQ0UgfAorCSAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19NRU1CRVIpOworCWJyZWFrOworICAgICAgY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOOgorCXByb2ZpbGVfcHJpbnRfd2l0aF9hdHRycyAoIm1yIiwgbWVzc2FnZSwgJnQsCisJICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX1NFUklBTCB8CisJICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX0RFU1RJTkFUSU9OIHwKKwkgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfUkVQTFlfU0VSSUFMKTsKKwlicmVhazsKKyAgICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfRVJST1I6CisJcHJvZmlsZV9wcmludF93aXRoX2F0dHJzICgiZXJyIiwgbWVzc2FnZSwgJnQsCisJICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX1NFUklBTCB8CisJICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX0RFU1RJTkFUSU9OIHwKKwkgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfUkVQTFlfU0VSSUFMKTsKKwlicmVhazsKKyAgICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMOgorCXByb2ZpbGVfcHJpbnRfd2l0aF9hdHRycyAoInNpZyIsIG1lc3NhZ2UsICZ0LAorCSAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19TRVJJQUwgfAorCSAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19QQVRIIHwKKwkgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfSU5URVJGQUNFIHwKKwkgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfTUVNQkVSKTsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJcHJpbnRmIChQUk9GSUxFX1RJTUVEX0ZPUk1BVCAiXG4iLCAidHVuIiwgdC50dl9zZWMsIHQudHZfdXNlYyk7CisJYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK3Byb2ZpbGVfZmlsdGVyX2Z1bmMgKERCdXNDb25uZWN0aW9uCSpjb25uZWN0aW9uLAorCQkgICAgIERCdXNNZXNzYWdlCSptZXNzYWdlLAorCQkgICAgIHZvaWQJCSp1c2VyX2RhdGEpCit7CisgIHByaW50X21lc3NhZ2VfcHJvZmlsZSAobWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9pc19zaWduYWwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9MT0NBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXNjb25uZWN0ZWQiKSkKKyAgICBleGl0ICgwKTsKKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZAordXNhZ2UgKGNoYXIgKm5hbWUsIGludCBlY29kZSkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiVXNhZ2U6ICVzIFstLXN5c3RlbSB8IC0tc2Vzc2lvbiB8IC0tYWRkcmVzcyBBRERSRVNTXSBbLS1tb25pdG9yIHwgLS1wcm9maWxlIF0gW3dhdGNoIGV4cHJlc3Npb25zXVxuIiwgbmFtZSk7CisgIGV4aXQgKGVjb2RlKTsKK30KKworc3RhdGljIHZvaWQKK29ubHlfb25lX3R5cGUgKGRidXNfYm9vbF90ICpzZWVuX2J1c190eXBlLAorICAgICAgICAgICAgICAgY2hhciAgICAgICAgKm5hbWUpCit7CisgIGlmICgqc2Vlbl9idXNfdHlwZSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJJIG9ubHkgc3VwcG9ydCBtb25pdG9yaW5nIG9uZSBidXMgYXQgYSB0aW1lIVxuIik7CisgICAgICB1c2FnZSAobmFtZSwgMSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgKnNlZW5fYnVzX3R5cGUgPSBUUlVFOworICAgIH0KK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgREJ1c0Vycm9yIGVycm9yOworICBEQnVzQnVzVHlwZSB0eXBlID0gREJVU19CVVNfU0VTU0lPTjsKKyAgREJ1c0hhbmRsZU1lc3NhZ2VGdW5jdGlvbiBmaWx0ZXJfZnVuYyA9IG1vbml0b3JfZmlsdGVyX2Z1bmM7CisgIGNoYXIgKmFkZHJlc3MgPSBOVUxMOworICBkYnVzX2Jvb2xfdCBzZWVuX2J1c190eXBlID0gRkFMU0U7CisgIAorICBpbnQgaSA9IDAsIGogPSAwLCBudW1GaWx0ZXJzID0gMDsKKyAgY2hhciAqKmZpbHRlcnMgPSBOVUxMOworCisgIC8qIFNldCBzdGRvdXQgdG8gYmUgdW5idWZmZXJlZDsgdGhpcyBpcyBiYXNpY2FsbHkgc28gdGhhdCBpZiBwZW9wbGUKKyAgICogZG8gZGJ1cy1tb25pdG9yID4gZmlsZSwgdGhlbiBzZW5kIFNJR0lOVCB2aWEgQ29udHJvbC1DLCB0aGV5CisgICAqIGRvbid0IGxvc2UgdGhlIGxhc3QgY2h1bmsgb2YgbWVzc2FnZXMuCisgICAqLworCisjaWZkZWYgREJVU19XSU4KKyAgc2V0dmJ1ZiAoc3Rkb3V0LCBOVUxMLCBfSU9OQkYsIDApOworI2Vsc2UKKyAgc2V0dmJ1ZiAoc3Rkb3V0LCBOVUxMLCBfSU9MQkYsIDApOworI2VuZGlmCisKKyAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKKyAgICB7CisgICAgICBjaGFyICphcmcgPSBhcmd2W2ldOworCisgICAgICBpZiAoIXN0cmNtcCAoYXJnLCAiLS1zeXN0ZW0iKSkKKyAgICAgICAgeworICAgICAgICAgIG9ubHlfb25lX3R5cGUgKCZzZWVuX2J1c190eXBlLCBhcmd2WzBdKTsKKyAgICAgICAgICB0eXBlID0gREJVU19CVVNfU1lTVEVNOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghc3RyY21wIChhcmcsICItLXNlc3Npb24iKSkKKyAgICAgICAgeworICAgICAgICAgIG9ubHlfb25lX3R5cGUgKCZzZWVuX2J1c190eXBlLCBhcmd2WzBdKTsKKyAgICAgICAgICB0eXBlID0gREJVU19CVVNfU0VTU0lPTjsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAiLS1hZGRyZXNzIikpCisgICAgICAgIHsKKyAgICAgICAgICBvbmx5X29uZV90eXBlICgmc2Vlbl9idXNfdHlwZSwgYXJndlswXSk7CisKKyAgICAgICAgICBpZiAoaSsxIDwgYXJnYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYWRkcmVzcyA9IGFyZ3ZbaSsxXTsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHVzYWdlIChhcmd2WzBdLCAxKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAiLS1oZWxwIikpCisJdXNhZ2UgKGFyZ3ZbMF0sIDApOworICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAiLS1tb25pdG9yIikpCisJZmlsdGVyX2Z1bmMgPSBtb25pdG9yX2ZpbHRlcl9mdW5jOworICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAiLS1wcm9maWxlIikpCisJZmlsdGVyX2Z1bmMgPSBwcm9maWxlX2ZpbHRlcl9mdW5jOworICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAiLS0iKSkKKwljb250aW51ZTsKKyAgICAgIGVsc2UgaWYgKGFyZ1swXSA9PSAnLScpCisJdXNhZ2UgKGFyZ3ZbMF0sIDEpOworICAgICAgZWxzZSB7CisgICAgICAgICAgdW5zaWduZWQgaW50IGZpbHRlcl9sZW47CisgICAgICAgICAgbnVtRmlsdGVycysrOworICAgICAgICAgIC8qIFByZXBlbmQgYSBydWxlIChhbmQgYSBjb21tYSkgdG8gZW5hYmxlIHRoZSBtb25pdG9yIHRvIGVhdmVzZHJvcC4KKyAgICAgICAgICAgKiBQcmVwZW5kaW5nIGFsbG93cyB0aGUgdXNlciB0byBhZGQgZWF2ZXNkcm9wPWZhbHNlIGF0IGNvbW1hbmQgbGluZQorICAgICAgICAgICAqIGluIG9yZGVyIHRvIGRpc2FibGUgZWF2ZXNkcm9wcGluZyB3aGVuIG5lZWRlZCAqLworICAgICAgICAgIGZpbHRlcl9sZW4gPSBzdHJsZW4gKEVBVkVTRFJPUFBJTkdfUlVMRSkgKyAxICsgc3RybGVuIChhcmcpICsgMTsKKworICAgICAgICAgIGZpbHRlcnMgPSAoY2hhciAqKikgcmVhbGxvYyAoZmlsdGVycywgbnVtRmlsdGVycyAqIHNpemVvZiAoY2hhciAqKSk7CisgICAgICAgICAgaWYgKGZpbHRlcnMgPT0gTlVMTCkKKyAgICAgICAgICAgIG9vbSAoImFkZGluZyBhIG5ldyBmaWx0ZXIgc2xvdCIpOworICAgICAgICAgIGZpbHRlcnNbal0gPSAoY2hhciAqKSBtYWxsb2MgKGZpbHRlcl9sZW4gKiBzaXplb2YgKGNoYXIgKikpOworICAgICAgICAgIGlmIChmaWx0ZXJzW2pdID09IE5VTEwpCisgICAgICAgICAgICBvb20gKCJhZGRpbmcgYSBuZXcgZmlsdGVyIik7CisgICAgICAgICAgc25wcmludGYgKGZpbHRlcnNbal0sIGZpbHRlcl9sZW4sICIlcywlcyIsIEVBVkVTRFJPUFBJTkdfUlVMRSwgYXJnKTsKKyAgICAgICAgICBqKys7CisgICAgICB9CisgICAgfQorCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgCisgIGlmIChhZGRyZXNzICE9IE5VTEwpCisgICAgeworICAgICAgY29ubmVjdGlvbiA9IGRidXNfY29ubmVjdGlvbl9vcGVuIChhZGRyZXNzLCAmZXJyb3IpOworICAgICAgaWYgKGNvbm5lY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIWRidXNfYnVzX3JlZ2lzdGVyIChjb25uZWN0aW9uLCAmZXJyb3IpKQorICAgICAgCSAgICB7CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkZhaWxlZCB0byByZWdpc3RlciBjb25uZWN0aW9uIHRvIGJ1cyBhdCAlczogJXNcbiIsCisgICAgICAJICAgICAgICAgICAgICAgYWRkcmVzcywgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAJICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIGNvbm5lY3Rpb24gPSBkYnVzX2J1c19nZXQgKHR5cGUsICZlcnJvcik7CisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgeworICAgICAgY29uc3QgY2hhciAqd2hlcmU7CisgICAgICBpZiAoYWRkcmVzcyAhPSBOVUxMKQorICAgICAgICB3aGVyZSA9IGFkZHJlc3M7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBzd2l0Y2ggKHR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIERCVVNfQlVTX1NZU1RFTToKKyAgICAgICAgICAgICAgd2hlcmUgPSAic3lzdGVtIGJ1cyI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEQlVTX0JVU19TRVNTSU9OOgorICAgICAgICAgICAgICB3aGVyZSA9ICJzZXNzaW9uIGJ1cyI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgd2hlcmUgPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRmFpbGVkIHRvIG9wZW4gY29ubmVjdGlvbiB0byAlczogJXNcbiIsCisgICAgICAgICAgICAgICB3aGVyZSwKKyAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChudW1GaWx0ZXJzKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBqOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2J1c19hZGRfbWF0Y2ggKGNvbm5lY3Rpb24sIGZpbHRlcnNbaV0sICZlcnJvcik7CisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJGYWlsZWQgdG8gc2V0dXAgbWF0Y2ggXCIlc1wiOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyc1tpXSwgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgICAgICB9CisJICBmcmVlKGZpbHRlcnNbaV0pOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19idXNfYWRkX21hdGNoIChjb25uZWN0aW9uLAorCQkgICAgICAgICAgRUFWRVNEUk9QUElOR19SVUxFICIsdHlwZT0nc2lnbmFsJyIsCisJCSAgICAgICAgICAmZXJyb3IpOworICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgICAgICBnb3RvIGxvc2U7CisgICAgICBkYnVzX2J1c19hZGRfbWF0Y2ggKGNvbm5lY3Rpb24sCisJCSAgICAgICAgICBFQVZFU0RST1BQSU5HX1JVTEUgIix0eXBlPSdtZXRob2RfY2FsbCciLAorCQkgICAgICAgICAgJmVycm9yKTsKKyAgICAgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICAgICAgZ290byBsb3NlOworICAgICAgZGJ1c19idXNfYWRkX21hdGNoIChjb25uZWN0aW9uLAorCQkgICAgICAgICAgRUFWRVNEUk9QUElOR19SVUxFICIsdHlwZT0nbWV0aG9kX3JldHVybiciLAorCQkgICAgICAgICAgJmVycm9yKTsKKyAgICAgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICAgICAgZ290byBsb3NlOworICAgICAgZGJ1c19idXNfYWRkX21hdGNoIChjb25uZWN0aW9uLAorCQkgICAgICAgICAgRUFWRVNEUk9QUElOR19SVUxFICIsdHlwZT0nZXJyb3InIiwKKwkJICAgICAgICAgICZlcnJvcik7CisgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgICAgIGdvdG8gbG9zZTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlciAoY29ubmVjdGlvbiwgZmlsdGVyX2Z1bmMsIE5VTEwsIE5VTEwpKSB7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiQ291bGRuJ3QgYWRkIGZpbHRlciFcbiIpOworICAgIGV4aXQgKDEpOworICB9CisKKyAgd2hpbGUgKGRidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlX2Rpc3BhdGNoKGNvbm5lY3Rpb24sIC0xKSkKKyAgICA7CisgIGV4aXQgKDApOworIGxvc2U6CisgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yOiAlc1xuIiwgZXJyb3IubWVzc2FnZSk7CisgIGV4aXQgKDEpOworfQorCmRpZmYgLS1naXQgYS9kYnVzL3Rvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5jIGIvZGJ1cy90b29scy9kYnVzLXByaW50LW1lc3NhZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWQwMGFjCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90b29scy9kYnVzLXByaW50LW1lc3NhZ2UuYwpAQCAtMCwwICsxLDQwOSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXByaW50LW1lc3NhZ2UuaCAgVXRpbGl0eSBmdW5jdGlvbiB0byBwcmludCBvdXQgYSBtZXNzYWdlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFBoaWxpcCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXByaW50LW1lc3NhZ2UuaCIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImNvbmZpZy5oIgorCitzdGF0aWMgY29uc3QgY2hhcioKK3R5cGVfdG9fbmFtZSAoaW50IG1lc3NhZ2VfdHlwZSkKK3sKKyAgc3dpdGNoIChtZXNzYWdlX3R5cGUpCisgICAgeworICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMOgorICAgICAgcmV0dXJuICJzaWduYWwiOworICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEw6CisgICAgICByZXR1cm4gIm1ldGhvZCBjYWxsIjsKKyAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk46CisgICAgICByZXR1cm4gIm1ldGhvZCByZXR1cm4iOworICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfRVJST1I6CisgICAgICByZXR1cm4gImVycm9yIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICIodW5rbm93biBtZXNzYWdlIHR5cGUpIjsKKyAgICB9Cit9CisKKyNkZWZpbmUgSU5ERU5UIDMKKworc3RhdGljIHZvaWQKK2luZGVudCAoaW50IGRlcHRoKQoreworICB3aGlsZSAoZGVwdGgtLSA+IDApCisgICAgcHJpbnRmICgiICAgIik7IC8qIElOREVOVCBzcGFjZXMuICovCit9CisKK3N0YXRpYyB2b2lkCitwcmludF9oZXggKHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCB1bnNpZ25lZCBpbnQgbGVuLCBpbnQgZGVwdGgpCit7CisgIHVuc2lnbmVkIGludCBpLCBjb2x1bW5zOworCisgIHByaW50ZiAoImFycmF5IG9mIGJ5dGVzIFtcbiIpOworCisgIGluZGVudCAoZGVwdGggKyAxKTsKKworICAvKiBFYWNoIGJ5dGUgdGFrZXMgMyBjZWxscyAodHdvIGhleGl0cywgYW5kIGEgc3BhY2UpLCBleGNlcHQgdGhlIGxhc3Qgb25lLiAqLworICBjb2x1bW5zID0gKDgwIC0gKChkZXB0aCArIDEpICogSU5ERU5UKSkgLyAzOworCisgIGlmIChjb2x1bW5zIDwgOCkKKyAgICBjb2x1bW5zID0gODsKKworICBpID0gMDsKKworICB3aGlsZSAoaSA8IGxlbikKKyAgICB7CisgICAgICBwcmludGYgKCIlMDJ4IiwgYnl0ZXNbaV0pOworICAgICAgaSsrOworCisgICAgICBpZiAoaSAhPSBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoaSAlIGNvbHVtbnMgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHJpbnRmICgiXG4iKTsKKyAgICAgICAgICAgICAgaW5kZW50IChkZXB0aCArIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHJpbnRmICgiICIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIHByaW50ZiAoIlxuIik7CisgIGluZGVudCAoZGVwdGgpOworICBwcmludGYgKCJdXG4iKTsKK30KKworI2RlZmluZSBERUZBVUxUX1NJWkUgMTAwCisKK3N0YXRpYyB2b2lkCitwcmludF9heSAoREJ1c01lc3NhZ2VJdGVyICppdGVyLCBpbnQgZGVwdGgpCit7CisgIC8qIE5vdCB1c2luZyBEQnVzU3RyaW5nIGJlY2F1c2UgaXQncyBub3QgcHVibGljIEFQSS4gSXQncyAyMDA5LCBhbmQgSSdtCisgICAqIG1hbnVhbGx5IGdyb3dpbmcgYSBzdHJpbmcgY2h1bmsgYnkgY2h1bmsuCisgICAqLworICB1bnNpZ25lZCBjaGFyICpieXRlcyA9IG1hbGxvYyAoREVGQVVMVF9TSVpFICsgMSk7CisgIHVuc2lnbmVkIGludCBsZW4gPSAwOworICB1bnNpZ25lZCBpbnQgbWF4ID0gREVGQVVMVF9TSVpFOworICBkYnVzX2Jvb2xfdCBhbGxfYXNjaWkgPSBUUlVFOworICBpbnQgY3VycmVudF90eXBlOworCisgIHdoaWxlICgoY3VycmVudF90eXBlID0gZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlIChpdGVyKSkKKyAgICAgICAgICAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyIHZhbDsKKworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljIChpdGVyLCAmdmFsKTsKKyAgICAgIGJ5dGVzW2xlbl0gPSB2YWw7CisgICAgICBsZW4rKzsKKworICAgICAgaWYgKHZhbCA8IDMyIHx8IHZhbCA+IDEyNikKKyAgICAgICAgYWxsX2FzY2lpID0gRkFMU0U7CisKKyAgICAgIGlmIChsZW4gPT0gbWF4KQorICAgICAgICB7CisgICAgICAgICAgbWF4ICo9IDI7CisgICAgICAgICAgYnl0ZXMgPSByZWFsbG9jIChieXRlcywgbWF4ICsgMSk7CisgICAgICAgIH0KKworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoaXRlcik7CisgICAgfQorCisgIGlmIChhbGxfYXNjaWkpCisgICAgeworICAgICAgYnl0ZXNbbGVuXSA9ICdcMCc7CisgICAgICBwcmludGYgKCJhcnJheSBvZiBieXRlcyBcIiVzXCJcbiIsIGJ5dGVzKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwcmludF9oZXggKGJ5dGVzLCBsZW4sIGRlcHRoKTsKKyAgICB9CisKKyAgZnJlZSAoYnl0ZXMpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfaXRlciAoREJ1c01lc3NhZ2VJdGVyICppdGVyLCBkYnVzX2Jvb2xfdCBsaXRlcmFsLCBpbnQgZGVwdGgpCit7CisgIGRvCisgICAgeworICAgICAgaW50IHR5cGUgPSBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKGl0ZXIpOworCisgICAgICBpZiAodHlwZSA9PSBEQlVTX1RZUEVfSU5WQUxJRCkKKwlicmVhazsKKyAgICAgIAorICAgICAgaW5kZW50KGRlcHRoKTsKKworICAgICAgc3dpdGNoICh0eXBlKQorCXsKKwljYXNlIERCVVNfVFlQRV9TVFJJTkc6CisJICB7CisJICAgIGNoYXIgKnZhbDsKKwkgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljIChpdGVyLCAmdmFsKTsKKwkgICAgaWYgKCFsaXRlcmFsKQorCSAgICAgIHByaW50ZiAoInN0cmluZyBcIiIpOworCSAgICBwcmludGYgKCIlcyIsIHZhbCk7CisJICAgIGlmICghbGl0ZXJhbCkKKwkgICAgICBwcmludGYgKCJcIlxuIik7CisJICAgIGJyZWFrOworCSAgfQorCisJY2FzZSBEQlVTX1RZUEVfU0lHTkFUVVJFOgorCSAgeworCSAgICBjaGFyICp2YWw7CisJICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoaXRlciwgJnZhbCk7CisJICAgIGlmICghbGl0ZXJhbCkKKwkgICAgICBwcmludGYgKCJzaWduYXR1cmUgXCIiKTsKKwkgICAgcHJpbnRmICgiJXMiLCB2YWwpOworCSAgICBpZiAoIWxpdGVyYWwpCisJICAgICAgcHJpbnRmICgiXCJcbiIpOworCSAgICBicmVhazsKKwkgIH0KKworCWNhc2UgREJVU19UWVBFX09CSkVDVF9QQVRIOgorCSAgeworCSAgICBjaGFyICp2YWw7CisJICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoaXRlciwgJnZhbCk7CisJICAgIGlmICghbGl0ZXJhbCkKKwkgICAgICBwcmludGYgKCJvYmplY3QgcGF0aCBcIiIpOworCSAgICBwcmludGYgKCIlcyIsIHZhbCk7CisJICAgIGlmICghbGl0ZXJhbCkKKwkgICAgICBwcmludGYgKCJcIlxuIik7CisJICAgIGJyZWFrOworCSAgfQorCisJY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisJICB7CisJICAgIGRidXNfaW50MTZfdCB2YWw7CisJICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoaXRlciwgJnZhbCk7CisJICAgIHByaW50ZiAoImludDE2ICVkXG4iLCB2YWwpOworCSAgICBicmVhazsKKwkgIH0KKworCWNhc2UgREJVU19UWVBFX1VJTlQxNjoKKwkgIHsKKwkgICAgZGJ1c191aW50MTZfdCB2YWw7CisJICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoaXRlciwgJnZhbCk7CisJICAgIHByaW50ZiAoInVpbnQxNiAldVxuIiwgdmFsKTsKKwkgICAgYnJlYWs7CisJICB9CisKKwljYXNlIERCVVNfVFlQRV9JTlQzMjoKKwkgIHsKKwkgICAgZGJ1c19pbnQzMl90IHZhbDsKKwkgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljIChpdGVyLCAmdmFsKTsKKwkgICAgcHJpbnRmICgiaW50MzIgJWRcbiIsIHZhbCk7CisJICAgIGJyZWFrOworCSAgfQorCisJY2FzZSBEQlVTX1RZUEVfVUlOVDMyOgorCSAgeworCSAgICBkYnVzX3VpbnQzMl90IHZhbDsKKwkgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljIChpdGVyLCAmdmFsKTsKKwkgICAgcHJpbnRmICgidWludDMyICV1XG4iLCB2YWwpOworCSAgICBicmVhazsKKwkgIH0KKworCWNhc2UgREJVU19UWVBFX0lOVDY0OgorCSAgeworCSAgICBkYnVzX2ludDY0X3QgdmFsOworCSAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKGl0ZXIsICZ2YWwpOworI2lmZGVmIERCVVNfSU5UNjRfUFJJTlRGX01PRElGSUVSCisgICAgICAgIHByaW50ZiAoImludDY0ICUiIERCVVNfSU5UNjRfUFJJTlRGX01PRElGSUVSICJkXG4iLCB2YWwpOworI2Vsc2UKKyAgICAgICAgcHJpbnRmICgiaW50NjQgKG9taXR0ZWQpXG4iKTsKKyNlbmRpZgorCSAgICBicmVhazsKKwkgIH0KKworCWNhc2UgREJVU19UWVBFX1VJTlQ2NDoKKwkgIHsKKwkgICAgZGJ1c191aW50NjRfdCB2YWw7CisJICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoaXRlciwgJnZhbCk7CisjaWZkZWYgREJVU19JTlQ2NF9QUklOVEZfTU9ESUZJRVIKKyAgICAgICAgcHJpbnRmICgidWludDY0ICUiIERCVVNfSU5UNjRfUFJJTlRGX01PRElGSUVSICJ1XG4iLCB2YWwpOworI2Vsc2UKKyAgICAgICAgcHJpbnRmICgidWludDY0IChvbWl0dGVkKVxuIik7CisjZW5kaWYKKwkgICAgYnJlYWs7CisJICB9CisKKwljYXNlIERCVVNfVFlQRV9ET1VCTEU6CisJICB7CisJICAgIGRvdWJsZSB2YWw7CisJICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoaXRlciwgJnZhbCk7CisJICAgIHByaW50ZiAoImRvdWJsZSAlZ1xuIiwgdmFsKTsKKwkgICAgYnJlYWs7CisJICB9CisKKwljYXNlIERCVVNfVFlQRV9CWVRFOgorCSAgeworCSAgICB1bnNpZ25lZCBjaGFyIHZhbDsKKwkgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljIChpdGVyLCAmdmFsKTsKKwkgICAgcHJpbnRmICgiYnl0ZSAlZFxuIiwgdmFsKTsKKwkgICAgYnJlYWs7CisJICB9CisKKwljYXNlIERCVVNfVFlQRV9CT09MRUFOOgorCSAgeworCSAgICBkYnVzX2Jvb2xfdCB2YWw7CisJICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoaXRlciwgJnZhbCk7CisJICAgIHByaW50ZiAoImJvb2xlYW4gJXNcbiIsIHZhbCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCSAgICBicmVhazsKKwkgIH0KKworCWNhc2UgREJVU19UWVBFX1ZBUklBTlQ6CisJICB7CisJICAgIERCdXNNZXNzYWdlSXRlciBzdWJpdGVyOworCisJICAgIGRidXNfbWVzc2FnZV9pdGVyX3JlY3Vyc2UgKGl0ZXIsICZzdWJpdGVyKTsKKworCSAgICBwcmludGYgKCJ2YXJpYW50ICIpOworCSAgICBwcmludF9pdGVyICgmc3ViaXRlciwgbGl0ZXJhbCwgZGVwdGgrMSk7CisJICAgIGJyZWFrOworCSAgfQorCWNhc2UgREJVU19UWVBFX0FSUkFZOgorCSAgeworCSAgICBpbnQgY3VycmVudF90eXBlOworCSAgICBEQnVzTWVzc2FnZUl0ZXIgc3ViaXRlcjsKKworCSAgICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlIChpdGVyLCAmc3ViaXRlcik7CisKKwkgICAgY3VycmVudF90eXBlID0gZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmc3ViaXRlcik7CisKKwkgICAgaWYgKGN1cnJlbnRfdHlwZSA9PSBEQlVTX1RZUEVfQllURSkKKwkgICAgICB7CisJCXByaW50X2F5ICgmc3ViaXRlciwgZGVwdGgpOworCQlicmVhazsKKwkgICAgICB9CisKKwkgICAgcHJpbnRmKCJhcnJheSBbXG4iKTsKKwkgICAgd2hpbGUgKGN1cnJlbnRfdHlwZSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKwkgICAgICB7CisJCXByaW50X2l0ZXIgKCZzdWJpdGVyLCBsaXRlcmFsLCBkZXB0aCsxKTsKKworCQlkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmc3ViaXRlcik7CisJCWN1cnJlbnRfdHlwZSA9IGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJnN1Yml0ZXIpOworCisJCWlmIChjdXJyZW50X3R5cGUgIT0gREJVU19UWVBFX0lOVkFMSUQpCisJCSAgcHJpbnRmICgiLCIpOworCSAgICAgIH0KKwkgICAgaW5kZW50KGRlcHRoKTsKKwkgICAgcHJpbnRmKCJdXG4iKTsKKwkgICAgYnJlYWs7CisJICB9CisJY2FzZSBEQlVTX1RZUEVfRElDVF9FTlRSWToKKwkgIHsKKwkgICAgREJ1c01lc3NhZ2VJdGVyIHN1Yml0ZXI7CisKKwkgICAgZGJ1c19tZXNzYWdlX2l0ZXJfcmVjdXJzZSAoaXRlciwgJnN1Yml0ZXIpOworCisJICAgIHByaW50ZigiZGljdCBlbnRyeShcbiIpOworCSAgICBwcmludF9pdGVyICgmc3ViaXRlciwgbGl0ZXJhbCwgZGVwdGgrMSk7CisJICAgIGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZzdWJpdGVyKTsKKwkgICAgcHJpbnRfaXRlciAoJnN1Yml0ZXIsIGxpdGVyYWwsIGRlcHRoKzEpOworCSAgICBpbmRlbnQoZGVwdGgpOworCSAgICBwcmludGYoIilcbiIpOworCSAgICBicmVhazsKKwkgIH0KKwkgICAgCisJY2FzZSBEQlVTX1RZUEVfU1RSVUNUOgorCSAgeworCSAgICBpbnQgY3VycmVudF90eXBlOworCSAgICBEQnVzTWVzc2FnZUl0ZXIgc3ViaXRlcjsKKworCSAgICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlIChpdGVyLCAmc3ViaXRlcik7CisKKwkgICAgcHJpbnRmKCJzdHJ1Y3Qge1xuIik7CisJICAgIHdoaWxlICgoY3VycmVudF90eXBlID0gZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmc3ViaXRlcikpICE9IERCVVNfVFlQRV9JTlZBTElEKQorCSAgICAgIHsKKwkJcHJpbnRfaXRlciAoJnN1Yml0ZXIsIGxpdGVyYWwsIGRlcHRoKzEpOworCQlkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmc3ViaXRlcik7CisJCWlmIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZzdWJpdGVyKSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKwkJICBwcmludGYgKCIsIik7CisJICAgICAgfQorCSAgICBpbmRlbnQoZGVwdGgpOworCSAgICBwcmludGYoIn1cbiIpOworCSAgICBicmVhazsKKwkgIH0KKwkgICAgCisJZGVmYXVsdDoKKwkgIHByaW50ZiAoIiAoZGJ1cy1tb25pdG9yIHRvbyBkdW1iIHRvIGRlY2lwaGVyIGFyZyB0eXBlICclYycpXG4iLCB0eXBlKTsKKwkgIGJyZWFrOworCX0KKyAgICB9IHdoaWxlIChkYnVzX21lc3NhZ2VfaXRlcl9uZXh0IChpdGVyKSk7Cit9CisKK3ZvaWQKK3ByaW50X21lc3NhZ2UgKERCdXNNZXNzYWdlICptZXNzYWdlLCBkYnVzX2Jvb2xfdCBsaXRlcmFsKQoreworICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjsKKyAgY29uc3QgY2hhciAqc2VuZGVyOworICBjb25zdCBjaGFyICpkZXN0aW5hdGlvbjsKKyAgaW50IG1lc3NhZ2VfdHlwZTsKKworICBtZXNzYWdlX3R5cGUgPSBkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpOworICBzZW5kZXIgPSBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSk7CisgIGRlc3RpbmF0aW9uID0gZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSk7CisgIAorICBpZiAoIWxpdGVyYWwpCisgICAgeworICAgICAgcHJpbnRmICgiJXMgc2VuZGVyPSVzIC0+IGRlc3Q9JXMiLAorCSAgICAgIHR5cGVfdG9fbmFtZSAobWVzc2FnZV90eXBlKSwKKwkgICAgICBzZW5kZXIgPyBzZW5kZXIgOiAiKG51bGwgc2VuZGVyKSIsCisJICAgICAgZGVzdGluYXRpb24gPyBkZXN0aW5hdGlvbiA6ICIobnVsbCBkZXN0aW5hdGlvbikiKTsKKyAgCisgICAgICBzd2l0Y2ggKG1lc3NhZ2VfdHlwZSkKKwl7CisJY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTDoKKwljYXNlIERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTDoKKwkgIHByaW50ZiAoIiBzZXJpYWw9JXUgcGF0aD0lczsgaW50ZXJmYWNlPSVzOyBtZW1iZXI9JXNcbiIsCisgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAobWVzc2FnZSksCisJCSAgZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtZXNzYWdlKSwKKwkJICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSksCisJCSAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpKTsKKwkgIGJyZWFrOworICAgICAgCisJY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOOgorCSAgcHJpbnRmICgiIHJlcGx5X3NlcmlhbD0ldVxuIiwKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSkpOworCSAgYnJlYWs7CisKKwljYXNlIERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SOgorCSAgcHJpbnRmICgiIGVycm9yX25hbWU9JXMgcmVwbHlfc2VyaWFsPSV1XG4iLAorCQkgIGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSksCisgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpKTsKKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIHByaW50ZiAoIlxuIik7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXQgKG1lc3NhZ2UsICZpdGVyKTsKKyAgcHJpbnRfaXRlciAoJml0ZXIsIGxpdGVyYWwsIDEpOworICBmZmx1c2ggKHN0ZG91dCk7CisgIAorfQorCmRpZmYgLS1naXQgYS9kYnVzL3Rvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5oIGIvZGJ1cy90b29scy9kYnVzLXByaW50LW1lc3NhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjcwMGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90b29scy9kYnVzLXByaW50LW1lc3NhZ2UuaApAQCAtMCwwICsxLDMxIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtcHJpbnQtbWVzc2FnZS5oICBVdGlsaXR5IGZ1bmN0aW9uIHRvIHByaW50IG91dCBhIG1lc3NhZ2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUGhpbGlwIEJsdW5kZWxsIDxwaGlsYkBnbnUub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZm5kZWYgREJVU19QUklOVF9NRVNTQUdFX0gKKyNkZWZpbmUgREJVU19QUklOVF9NRVNTQUdFX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisKK3ZvaWQgcHJpbnRfbWVzc2FnZSAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsIGRidXNfYm9vbF90IGxpdGVyYWwpOworCisjZW5kaWYgLyogREJVU19QUklOVF9NRVNTQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvdG9vbHMvZGJ1cy1zZW5kLmMgYi9kYnVzL3Rvb2xzL2RidXMtc2VuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MDNhNTgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL3Rvb2xzL2RidXMtc2VuZC5jCkBAIC0wLDAgKzEsNTQyIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc2VuZC5jICBVdGlsaXR5IHByb2dyYW0gdG8gc2VuZCBtZXNzYWdlcyBmcm9tIHRoZSBjb21tYW5kIGxpbmUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUGhpbGlwIEJsdW5kZWxsIDxwaGlsYkBnbnUub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorCisjaWZuZGVmIEhBVkVfU1RSVE9MTAorI3VuZGVmIHN0cnRvbGwKKyNkZWZpbmUgc3RydG9sbCBteXN0cnRvbGwKKyNpbmNsdWRlICJzdHJ0b2xsLmMiCisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUlRPVUxMCisjdW5kZWYgc3RydG91bGwKKyNkZWZpbmUgc3RydG91bGwgbXlzdHJ0b3VsbAorI2luY2x1ZGUgInN0cnRvdWxsLmMiCisjZW5kaWYKKworI2lmZGVmIERCVVNfV0lOQ0UKKyNpZm5kZWYgc3RyZHVwCisjZGVmaW5lIHN0cmR1cCBfc3RyZHVwCisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSAiZGJ1cy1wcmludC1tZXNzYWdlLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICphcHBuYW1lOworCitzdGF0aWMgdm9pZAordXNhZ2UgKGludCBlY29kZSkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiVXNhZ2U6ICVzIFstLWhlbHBdIFstLXN5c3RlbSB8IC0tc2Vzc2lvbiB8IC0tYWRkcmVzcz1BRERSRVNTXSBbLS1kZXN0PU5BTUVdIFstLXR5cGU9VFlQRV0gWy0tcHJpbnQtcmVwbHlbPWxpdGVyYWxdXSBbLS1yZXBseS10aW1lb3V0PU1TRUNdIDxkZXN0aW5hdGlvbiBvYmplY3QgcGF0aD4gPG1lc3NhZ2UgbmFtZT4gW2NvbnRlbnRzIC4uLl1cbiIsIGFwcG5hbWUpOworICBleGl0IChlY29kZSk7Cit9CisKK3N0YXRpYyB2b2lkCithcHBlbmRfYXJnIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsIGludCB0eXBlLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgZGJ1c191aW50MTZfdCB1aW50MTY7CisgIGRidXNfaW50MTZfdCBpbnQxNjsKKyAgZGJ1c191aW50MzJfdCB1aW50MzI7CisgIGRidXNfaW50MzJfdCBpbnQzMjsKKyAgZGJ1c191aW50NjRfdCB1aW50NjQ7CisgIGRidXNfaW50NjRfdCBpbnQ2NDsKKyAgZG91YmxlIGQ7CisgIHVuc2lnbmVkIGNoYXIgYnl0ZTsKKyAgZGJ1c19ib29sX3Qgdl9CT09MRUFOOworICAKKyAgLyogRklYTUUgLSB3ZSBhcmUgaWdub3JpbmcgT09NIHJldHVybnMgb24gYWxsIHRoZXNlIGZ1bmN0aW9ucyAqLworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgREJVU19UWVBFX0JZVEU6CisgICAgICBieXRlID0gc3RydG91bCAodmFsdWUsIE5VTEwsIDApOworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljIChpdGVyLCBEQlVTX1RZUEVfQllURSwgJmJ5dGUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfVFlQRV9ET1VCTEU6CisgICAgICBkID0gc3RydG9kICh2YWx1ZSwgTlVMTCk7CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKGl0ZXIsIERCVVNfVFlQRV9ET1VCTEUsICZkKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgICBpbnQxNiA9IHN0cnRvbCAodmFsdWUsIE5VTEwsIDApOworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljIChpdGVyLCBEQlVTX1RZUEVfSU5UMTYsICZpbnQxNik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgREJVU19UWVBFX1VJTlQxNjoKKyAgICAgIHVpbnQxNiA9IHN0cnRvdWwgKHZhbHVlLCBOVUxMLCAwKTsKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoaXRlciwgREJVU19UWVBFX1VJTlQxNiwgJnVpbnQxNik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgREJVU19UWVBFX0lOVDMyOgorICAgICAgaW50MzIgPSBzdHJ0b2wgKHZhbHVlLCBOVUxMLCAwKTsKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoaXRlciwgREJVU19UWVBFX0lOVDMyLCAmaW50MzIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UMzI6CisgICAgICB1aW50MzIgPSBzdHJ0b3VsICh2YWx1ZSwgTlVMTCwgMCk7CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKGl0ZXIsIERCVVNfVFlQRV9VSU5UMzIsICZ1aW50MzIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQ2NDoKKyAgICAgIGludDY0ID0gc3RydG9sbCAodmFsdWUsIE5VTEwsIDApOworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljIChpdGVyLCBEQlVTX1RZUEVfSU5UNjQsICZpbnQ2NCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgREJVU19UWVBFX1VJTlQ2NDoKKyAgICAgIHVpbnQ2NCA9IHN0cnRvdWxsICh2YWx1ZSwgTlVMTCwgMCk7CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKGl0ZXIsIERCVVNfVFlQRV9VSU5UNjQsICZ1aW50NjQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfVFlQRV9TVFJJTkc6CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKGl0ZXIsIERCVVNfVFlQRV9TVFJJTkcsICZ2YWx1ZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgREJVU19UWVBFX09CSkVDVF9QQVRIOgorICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljIChpdGVyLCBEQlVTX1RZUEVfT0JKRUNUX1BBVEgsICZ2YWx1ZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgREJVU19UWVBFX0JPT0xFQU46CisgICAgICBpZiAoc3RyY21wICh2YWx1ZSwgInRydWUiKSA9PSAwKQorCXsKKwkgIHZfQk9PTEVBTiA9IFRSVUU7CisJICBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKGl0ZXIsIERCVVNfVFlQRV9CT09MRUFOLCAmdl9CT09MRUFOKTsKKwl9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKHZhbHVlLCAiZmFsc2UiKSA9PSAwKQorCXsKKwkgIHZfQk9PTEVBTiA9IEZBTFNFOworCSAgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljIChpdGVyLCBEQlVTX1RZUEVfQk9PTEVBTiwgJnZfQk9PTEVBTik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBFeHBlY3RlZCBcInRydWVcIiBvciBcImZhbHNlXCIgaW5zdGVhZCBvZiBcIiVzXCJcbiIsIGFwcG5hbWUsIHZhbHVlKTsKKwkgIGV4aXQgKDEpOworCX0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBVbnN1cHBvcnRlZCBkYXRhIHR5cGUgJWNcbiIsIGFwcG5hbWUsIChjaGFyKSB0eXBlKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2FwcGVuZF9hcnJheSAoREJ1c01lc3NhZ2VJdGVyICppdGVyLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgIGNvbnN0IGNoYXIgKnZhbDsKKyAgY2hhciAqZHVwdmFsID0gc3RyZHVwICh2YWx1ZSk7CisKKyAgdmFsID0gc3RydG9rIChkdXB2YWwsICIsIik7CisgIHdoaWxlICh2YWwgIT0gTlVMTCkKKyAgICB7CisgICAgICBhcHBlbmRfYXJnIChpdGVyLCB0eXBlLCB2YWwpOworICAgICAgdmFsID0gc3RydG9rIChOVUxMLCAiLCIpOworICAgIH0KKyAgZnJlZSAoZHVwdmFsKTsKK30KKworc3RhdGljIHZvaWQKK2FwcGVuZF9kaWN0IChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsIGludCBrZXl0eXBlLCBpbnQgdmFsdHlwZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgIGNvbnN0IGNoYXIgKnZhbDsKKyAgY2hhciAqZHVwdmFsID0gc3RyZHVwICh2YWx1ZSk7CisKKyAgdmFsID0gc3RydG9rIChkdXB2YWwsICIsIik7CisgIHdoaWxlICh2YWwgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTWVzc2FnZUl0ZXIgc3ViaXRlcjsKKyAgICAgIAorICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKGl0ZXIsCisJCQkJCURCVVNfVFlQRV9ESUNUX0VOVFJZLAorCQkJCQlOVUxMLAorCQkJCQkmc3ViaXRlcik7CisKKyAgICAgIGFwcGVuZF9hcmcgKCZzdWJpdGVyLCBrZXl0eXBlLCB2YWwpOworICAgICAgdmFsID0gc3RydG9rIChOVUxMLCAiLCIpOworICAgICAgaWYgKHZhbCA9PSBOVUxMKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBNYWxmb3JtZWQgZGljdGlvbmFyeVxuIiwgYXBwbmFtZSk7CisJICBleGl0ICgxKTsKKwl9CisgICAgICBhcHBlbmRfYXJnICgmc3ViaXRlciwgdmFsdHlwZSwgdmFsKTsKKworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyIChpdGVyLCAmc3ViaXRlcik7CisgICAgICB2YWwgPSBzdHJ0b2sgKE5VTEwsICIsIik7CisgICAgfSAKKyAgZnJlZSAoZHVwdmFsKTsKK30KKworc3RhdGljIGludAordHlwZV9mcm9tX25hbWUgKGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgaW50IHR5cGU7CisgIGlmICghc3RyY21wIChhcmcsICJzdHJpbmciKSkKKyAgICB0eXBlID0gREJVU19UWVBFX1NUUklORzsKKyAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAiaW50MTYiKSkKKyAgICB0eXBlID0gREJVU19UWVBFX0lOVDE2OworICBlbHNlIGlmICghc3RyY21wIChhcmcsICJ1aW50MTYiKSkKKyAgICB0eXBlID0gREJVU19UWVBFX1VJTlQxNjsKKyAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAiaW50MzIiKSkKKyAgICB0eXBlID0gREJVU19UWVBFX0lOVDMyOworICBlbHNlIGlmICghc3RyY21wIChhcmcsICJ1aW50MzIiKSkKKyAgICB0eXBlID0gREJVU19UWVBFX1VJTlQzMjsKKyAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAiaW50NjQiKSkKKyAgICB0eXBlID0gREJVU19UWVBFX0lOVDY0OworICBlbHNlIGlmICghc3RyY21wIChhcmcsICJ1aW50NjQiKSkKKyAgICB0eXBlID0gREJVU19UWVBFX1VJTlQ2NDsKKyAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAiZG91YmxlIikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9ET1VCTEU7CisgIGVsc2UgaWYgKCFzdHJjbXAgKGFyZywgImJ5dGUiKSkKKyAgICB0eXBlID0gREJVU19UWVBFX0JZVEU7CisgIGVsc2UgaWYgKCFzdHJjbXAgKGFyZywgImJvb2xlYW4iKSkKKyAgICB0eXBlID0gREJVU19UWVBFX0JPT0xFQU47CisgIGVsc2UgaWYgKCFzdHJjbXAgKGFyZywgIm9ianBhdGgiKSkKKyAgICB0eXBlID0gREJVU19UWVBFX09CSkVDVF9QQVRIOworICBlbHNlCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IFVua25vd24gdHlwZSBcIiVzXCJcbiIsIGFwcG5hbWUsIGFyZyk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisgIHJldHVybiB0eXBlOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICBEQnVzRXJyb3IgZXJyb3I7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBpbnQgcHJpbnRfcmVwbHk7CisgIGludCBwcmludF9yZXBseV9saXRlcmFsOworICBpbnQgcmVwbHlfdGltZW91dDsKKyAgREJ1c01lc3NhZ2VJdGVyIGl0ZXI7CisgIGludCBpOworICBEQnVzQnVzVHlwZSB0eXBlID0gREJVU19CVVNfU0VTU0lPTjsKKyAgY29uc3QgY2hhciAqZGVzdCA9IE5VTEw7CisgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworICBjb25zdCBjaGFyICpwYXRoID0gTlVMTDsKKyAgaW50IG1lc3NhZ2VfdHlwZSA9IERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTDsKKyAgY29uc3QgY2hhciAqdHlwZV9zdHIgPSBOVUxMOworICBjb25zdCBjaGFyICphZGRyZXNzID0gTlVMTDsKKyAgaW50IHNlc3Npb25fb3Jfc3lzdGVtID0gRkFMU0U7CisKKyAgYXBwbmFtZSA9IGFyZ3ZbMF07CisgIAorICBpZiAoYXJnYyA8IDMpCisgICAgdXNhZ2UgKDEpOworCisgIHByaW50X3JlcGx5ID0gRkFMU0U7CisgIHByaW50X3JlcGx5X2xpdGVyYWwgPSBGQUxTRTsKKyAgcmVwbHlfdGltZW91dCA9IC0xOworICAKKyAgZm9yIChpID0gMTsgaSA8IGFyZ2MgJiYgbmFtZSA9PSBOVUxMOyBpKyspCisgICAgeworICAgICAgY2hhciAqYXJnID0gYXJndltpXTsKKworICAgICAgaWYgKHN0cmNtcCAoYXJnLCAiLS1zeXN0ZW0iKSA9PSAwKQorICAgICAgICB7CisJICB0eXBlID0gREJVU19CVVNfU1lTVEVNOworICAgICAgICAgIHNlc3Npb25fb3Jfc3lzdGVtID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLXNlc3Npb24iKSA9PSAwKQorICAgICAgICB7CisJICB0eXBlID0gREJVU19CVVNfU0VTU0lPTjsKKyAgICAgICAgICBzZXNzaW9uX29yX3N5c3RlbSA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cnN0ciAoYXJnLCAiLS1hZGRyZXNzIikgPT0gYXJnKQorICAgICAgICB7CisgICAgICAgICAgYWRkcmVzcyA9IHN0cmNociAoYXJnLCAnPScpOworCisgICAgICAgICAgaWYgKGFkZHJlc3MgPT0gTlVMTCkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIlwiLS1hZGRyZXNzPVwiIHJlcXVpcmVzIGFuIEFERFJFU1NcbiIpOworICAgICAgICAgICAgICB1c2FnZSAoMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBhZGRyZXNzID0gYWRkcmVzcyArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGFyZywgIi0tcHJpbnQtcmVwbHkiLCAxMykgPT0gMCkKKwl7CisJICBwcmludF9yZXBseSA9IFRSVUU7CisJICBtZXNzYWdlX3R5cGUgPSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTDsKKwkgIGlmICgqKGFyZyArIDEzKSAhPSAnXDAnKQorCSAgICBwcmludF9yZXBseV9saXRlcmFsID0gVFJVRTsKKwl9CisgICAgICBlbHNlIGlmIChzdHJzdHIgKGFyZywgIi0tcmVwbHktdGltZW91dD0iKSA9PSBhcmcpCisJeworCSAgcmVwbHlfdGltZW91dCA9IHN0cnRvbCAoc3RyY2hyIChhcmcsICc9JykgKyAxLAorCQkJCSAgTlVMTCwgMTApOworCX0KKyAgICAgIGVsc2UgaWYgKHN0cnN0ciAoYXJnLCAiLS1kZXN0PSIpID09IGFyZykKKwlkZXN0ID0gc3RyY2hyIChhcmcsICc9JykgKyAxOworICAgICAgZWxzZSBpZiAoc3Ryc3RyIChhcmcsICItLXR5cGU9IikgPT0gYXJnKQorCXR5cGVfc3RyID0gc3RyY2hyIChhcmcsICc9JykgKyAxOworICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLWhlbHAiKSkKKwl1c2FnZSAoMCk7CisgICAgICBlbHNlIGlmIChhcmdbMF0gPT0gJy0nKQorCXVzYWdlICgxKTsKKyAgICAgIGVsc2UgaWYgKHBhdGggPT0gTlVMTCkKKyAgICAgICAgcGF0aCA9IGFyZzsKKyAgICAgIGVsc2UgLyogbmFtZSA9PSBOVUxMIGd1YXJhbnRlZWQgYnkgdGhlICd3aGlsZScgbG9vcCAqLworICAgICAgICBuYW1lID0gYXJnOworICAgIH0KKworICBpZiAobmFtZSA9PSBOVUxMKQorICAgIHVzYWdlICgxKTsKKworICBpZiAoc2Vzc2lvbl9vcl9zeXN0ZW0gJiYKKyAgICAgIChhZGRyZXNzICE9IE5VTEwpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlwiLS1hZGRyZXNzXCIgbWF5IG5vdCBiZSB1c2VkIHdpdGggXCItLXN5c3RlbVwiIG9yIFwiLS1zZXNzaW9uXCJcbiIpOworICAgICAgdXNhZ2UgKDEpOworICAgIH0KKworICBpZiAodHlwZV9zdHIgIT0gTlVMTCkKKyAgICB7CisgICAgICBtZXNzYWdlX3R5cGUgPSBkYnVzX21lc3NhZ2VfdHlwZV9mcm9tX3N0cmluZyAodHlwZV9zdHIpOworICAgICAgaWYgKCEobWVzc2FnZV90eXBlID09IERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMIHx8CisgICAgICAgICAgICBtZXNzYWdlX3R5cGUgPT0gREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKSkKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIk1lc3NhZ2UgdHlwZSBcIiVzXCIgaXMgbm90IHN1cHBvcnRlZFxuIiwKKyAgICAgICAgICAgICAgICAgICB0eXBlX3N0cik7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKyAgICB9CisgIAorICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgaWYgKGFkZHJlc3MgIT0gTlVMTCkKKyAgICB7CisgICAgICBjb25uZWN0aW9uID0gZGJ1c19jb25uZWN0aW9uX29wZW4gKGFkZHJlc3MsICZlcnJvcik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY29ubmVjdGlvbiA9IGRidXNfYnVzX2dldCAodHlwZSwgJmVycm9yKTsKKyAgICB9CisKKyAgaWYgKGNvbm5lY3Rpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJGYWlsZWQgdG8gb3BlbiBjb25uZWN0aW9uIHRvIFwiJXNcIiBtZXNzYWdlIGJ1czogJXNcbiIsCisgICAgICAgICAgICAgICAoYWRkcmVzcyAhPSBOVUxMKSA/IGFkZHJlc3MgOgorICAgICAgICAgICAgICAgICAoKHR5cGUgPT0gREJVU19CVVNfU1lTVEVNKSA/ICJzeXN0ZW0iIDogInNlc3Npb24iKSwKKyAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChtZXNzYWdlX3R5cGUgPT0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwpCisgICAgeworICAgICAgY2hhciAqbGFzdF9kb3Q7CisKKyAgICAgIGxhc3RfZG90ID0gc3RycmNociAobmFtZSwgJy4nKTsKKyAgICAgIGlmIChsYXN0X2RvdCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiTXVzdCB1c2Ugb3JnLm15ZG9tYWluLkludGVyZmFjZS5NZXRob2Qgbm90YXRpb24sIG5vIGRvdCBpbiBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKyAgICAgICpsYXN0X2RvdCA9ICdcMCc7CisgICAgICAKKyAgICAgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2RvdCArIDEpOworICAgICAgZGJ1c19tZXNzYWdlX3NldF9hdXRvX3N0YXJ0IChtZXNzYWdlLCBUUlVFKTsKKyAgICB9CisgIGVsc2UgaWYgKG1lc3NhZ2VfdHlwZSA9PSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpCisgICAgeworICAgICAgY2hhciAqbGFzdF9kb3Q7CisKKyAgICAgIGxhc3RfZG90ID0gc3RycmNociAobmFtZSwgJy4nKTsKKyAgICAgIGlmIChsYXN0X2RvdCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiTXVzdCB1c2Ugb3JnLm15ZG9tYWluLkludGVyZmFjZS5TaWduYWwgbm90YXRpb24sIG5vIGRvdCBpbiBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKyAgICAgICpsYXN0X2RvdCA9ICdcMCc7CisgICAgICAKKyAgICAgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAocGF0aCwgbmFtZSwgbGFzdF9kb3QgKyAxKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJJbnRlcm5hbCBlcnJvciwgdW5rbm93biBtZXNzYWdlIHR5cGVcbiIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQ291bGRuJ3QgYWxsb2NhdGUgRC1CdXMgbWVzc2FnZVxuIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKGRlc3QgJiYgIWRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24gKG1lc3NhZ2UsIGRlc3QpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIk5vdCBlbm91Z2ggbWVtb3J5XG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtZXNzYWdlLCAmaXRlcik7CisKKyAgd2hpbGUgKGkgPCBhcmdjKQorICAgIHsKKyAgICAgIGNoYXIgKmFyZzsKKyAgICAgIGNoYXIgKmM7CisgICAgICBpbnQgdHlwZTsKKyAgICAgIGludCBzZWNvbmRhcnlfdHlwZTsKKyAgICAgIGludCBjb250YWluZXJfdHlwZTsKKyAgICAgIERCdXNNZXNzYWdlSXRlciAqdGFyZ2V0X2l0ZXI7CisgICAgICBEQnVzTWVzc2FnZUl0ZXIgY29udGFpbmVyX2l0ZXI7CisKKyAgICAgIHR5cGUgPSBEQlVTX1RZUEVfSU5WQUxJRDsKKyAgICAgIGFyZyA9IGFyZ3ZbaSsrXTsKKyAgICAgIGMgPSBzdHJjaHIgKGFyZywgJzonKTsKKworICAgICAgaWYgKGMgPT0gTlVMTCkKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsICIlczogRGF0YSBpdGVtIFwiJXNcIiBpcyBiYWRseSBmb3JtZWRcbiIsIGFyZ3ZbMF0sIGFyZyk7CisJICBleGl0ICgxKTsKKwl9CisKKyAgICAgICooYysrKSA9IDA7CisKKyAgICAgIGNvbnRhaW5lcl90eXBlID0gREJVU19UWVBFX0lOVkFMSUQ7CisKKyAgICAgIGlmIChzdHJjbXAgKGFyZywgInZhcmlhbnQiKSA9PSAwKQorCWNvbnRhaW5lcl90eXBlID0gREJVU19UWVBFX1ZBUklBTlQ7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgImFycmF5IikgPT0gMCkKKwljb250YWluZXJfdHlwZSA9IERCVVNfVFlQRV9BUlJBWTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiZGljdCIpID09IDApCisJY29udGFpbmVyX3R5cGUgPSBEQlVTX1RZUEVfRElDVF9FTlRSWTsKKworICAgICAgaWYgKGNvbnRhaW5lcl90eXBlICE9IERCVVNfVFlQRV9JTlZBTElEKQorCXsKKwkgIGFyZyA9IGM7CisJICBjID0gc3RyY2hyIChhcmcsICc6Jyk7CisJICBpZiAoYyA9PSBOVUxMKQorCSAgICB7CisJICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IERhdGEgaXRlbSBcIiVzXCIgaXMgYmFkbHkgZm9ybWVkXG4iLCBhcmd2WzBdLCBhcmcpOworCSAgICAgIGV4aXQgKDEpOworCSAgICB9CisJICAqKGMrKykgPSAwOworCX0KKworICAgICAgaWYgKGFyZ1swXSA9PSAwKQorCXR5cGUgPSBEQlVTX1RZUEVfU1RSSU5HOworICAgICAgZWxzZQorCXR5cGUgPSB0eXBlX2Zyb21fbmFtZSAoYXJnKTsKKworICAgICAgaWYgKGNvbnRhaW5lcl90eXBlID09IERCVVNfVFlQRV9ESUNUX0VOVFJZKQorCXsKKwkgIGNoYXIgc2lnWzVdOworCSAgYXJnID0gYzsKKwkgIGMgPSBzdHJjaHIgKGMsICc6Jyk7CisJICBpZiAoYyA9PSBOVUxMKQorCSAgICB7CisJICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IERhdGEgaXRlbSBcIiVzXCIgaXMgYmFkbHkgZm9ybWVkXG4iLCBhcmd2WzBdLCBhcmcpOworCSAgICAgIGV4aXQgKDEpOworCSAgICB9CisJICAqKGMrKykgPSAwOworCSAgc2Vjb25kYXJ5X3R5cGUgPSB0eXBlX2Zyb21fbmFtZSAoYXJnKTsKKwkgIHNpZ1swXSA9IERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSOworCSAgc2lnWzFdID0gdHlwZTsKKwkgIHNpZ1syXSA9IHNlY29uZGFyeV90eXBlOworCSAgc2lnWzNdID0gREJVU19ESUNUX0VOVFJZX0VORF9DSEFSOworCSAgc2lnWzRdID0gJ1wwJzsKKwkgIGRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmaXRlciwKKwkJCQkJICAgIERCVVNfVFlQRV9BUlJBWSwKKwkJCQkJICAgIHNpZywKKwkJCQkJICAgICZjb250YWluZXJfaXRlcik7CisJICB0YXJnZXRfaXRlciA9ICZjb250YWluZXJfaXRlcjsKKwl9CisgICAgICBlbHNlIGlmIChjb250YWluZXJfdHlwZSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKwl7CisJICBjaGFyIHNpZ1syXTsKKwkgIHNpZ1swXSA9IHR5cGU7CisJICBzaWdbMV0gPSAnXDAnOworCSAgZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZpdGVyLAorCQkJCQkgICAgY29udGFpbmVyX3R5cGUsCisJCQkJCSAgICBzaWcsCisJCQkJCSAgICAmY29udGFpbmVyX2l0ZXIpOworCSAgdGFyZ2V0X2l0ZXIgPSAmY29udGFpbmVyX2l0ZXI7CisJfQorICAgICAgZWxzZQorCXRhcmdldF9pdGVyID0gJml0ZXI7CisKKyAgICAgIGlmIChjb250YWluZXJfdHlwZSA9PSBEQlVTX1RZUEVfQVJSQVkpCisJeworCSAgYXBwZW5kX2FycmF5ICh0YXJnZXRfaXRlciwgdHlwZSwgYyk7CisJfQorICAgICAgZWxzZSBpZiAoY29udGFpbmVyX3R5cGUgPT0gREJVU19UWVBFX0RJQ1RfRU5UUlkpCisJeworCSAgYXBwZW5kX2RpY3QgKHRhcmdldF9pdGVyLCB0eXBlLCBzZWNvbmRhcnlfdHlwZSwgYyk7CisJfQorICAgICAgZWxzZQorCWFwcGVuZF9hcmcgKHRhcmdldF9pdGVyLCB0eXBlLCBjKTsKKworICAgICAgaWYgKGNvbnRhaW5lcl90eXBlICE9IERCVVNfVFlQRV9JTlZBTElEKQorCXsKKwkgIGRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJml0ZXIsCisJCQkJCSAgICAgJmNvbnRhaW5lcl9pdGVyKTsKKwl9CisgICAgfQorCisgIGlmIChwcmludF9yZXBseSkKKyAgICB7CisgICAgICBEQnVzTWVzc2FnZSAqcmVwbHk7CisKKyAgICAgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgICAgIHJlcGx5ID0gZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2sgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCByZXBseV90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKTsKKyAgICAgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yICVzOiAlc1xuIiwKKwkJICAgZXJyb3IubmFtZSwKKyAgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorCisgICAgICBpZiAocmVwbHkpCisgICAgICAgIHsKKyAgICAgICAgICBwcmludF9tZXNzYWdlIChyZXBseSwgcHJpbnRfcmVwbHlfbGl0ZXJhbCk7CisgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgTlVMTCk7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fZmx1c2ggKGNvbm5lY3Rpb24pOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS9kYnVzL3Rvb2xzL2RidXMtdXVpZGdlbi5jIGIvZGJ1cy90b29scy9kYnVzLXV1aWRnZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGJhMWNmCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90b29scy9kYnVzLXV1aWRnZW4uYwpAQCAtMCwwICsxLDE2MSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXV1aWRnZW4uYyAgVXRpbGl0eSBwcm9ncmFtIHRvIGNyZWF0ZSBVVUlEcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXV1aWRnZW4uaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKworc3RhdGljIHZvaWQKK3VzYWdlIChjaGFyICpuYW1lLCBpbnQgZWNvZGUpCit7CisgIGlmIChuYW1lID09IE5VTEwpCisgICAgbmFtZSA9ICJkYnVzLXV1aWRnZW4iOworICAKKyAgZnByaW50ZiAoc3RkZXJyLCAiVXNhZ2U6ICVzIFstLWVuc3VyZVs9RklMRU5BTUVdXSBbLS1nZXRbPUZJTEVOQU1FXV1cbiIsIG5hbWUpOworICBleGl0IChlY29kZSk7Cit9CisKK3N0YXRpYyB2b2lkCit2ZXJzaW9uICh2b2lkKQoreworICBwcmludGYgKCJELUJ1cyBVVUlEIEdlbmVyYXRvciAlc1xuIgorICAgICAgICAgICJDb3B5cmlnaHQgKEMpIDIwMDYgUmVkIEhhdCwgSW5jLlxuIgorICAgICAgICAgICJUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuXG4iCisgICAgICAgICAgIlRoZXJlIGlzIE5PIHdhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLlxuIiwKKyAgICAgICAgICBWRVJTSU9OKTsKKyAgZXhpdCAoMCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2V0X2FyZyAoY29uc3QgY2hhciAgKmFyZywKKyAgICAgICAgIGNvbnN0IGNoYXIgICpvcHRpb24sCisgICAgICAgICBjb25zdCBjaGFyICoqdmFsdWVfcCkKK3sKKyAgY29uc3QgY2hhciAqZm47CisKKyAgaWYgKHN0cmxlbihhcmcpIDwgc3RybGVuKG9wdGlvbikpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgZm4gPSBhcmcgKyBzdHJsZW4ob3B0aW9uKTsKKworICBpZiAoISgqZm4gPT0gJz0nIHx8ICpmbiA9PSAnICcgfHwgKmZuID09ICdcMCcpKQorICAgIHsKKyAgICAgIHVzYWdlIChOVUxMLCAxKTsKKyAgICB9CisgIAorICBpZiAoKmZuID09ICc9JykKKyAgICArK2ZuOworICAKKyAgd2hpbGUgKCpmbiA9PSAnICcgJiYgKmZuICE9ICdcMCcpCisgICAgKytmbjsKKyAgCisgIGlmICgqZm4gIT0gJ1wwJykKKyAgICB7CisgICAgICAqdmFsdWVfcCA9IGZuOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBpbnQgaTsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgIGRidXNfYm9vbF90IGVuc3VyZV91dWlkOworICBkYnVzX2Jvb2xfdCBnZXRfdXVpZDsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIGVuc3VyZV91dWlkID0gRkFMU0U7CisgIGdldF91dWlkID0gRkFMU0U7CisgIAorICBmaWxlbmFtZSA9IE5VTEw7CisKKyAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKKyAgICB7CisgICAgICBjaGFyICphcmcgPSBhcmd2W2ldOworCisgICAgICBpZiAoc3RybmNtcCAoYXJnLCAiLS1lbnN1cmUiLCBzdHJsZW4oIi0tZW5zdXJlIikpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBnZXRfYXJnIChhcmcsICItLWVuc3VyZSIsICZmaWxlbmFtZSk7CisgICAgICAgICAgZW5zdXJlX3V1aWQgPSBUUlVFOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJuY21wIChhcmcsICItLWdldCIsIHN0cmxlbigiLS1nZXQiKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGdldF9hcmcgKGFyZywgIi0tZ2V0IiwgJmZpbGVuYW1lKTsKKyAgICAgICAgICBnZXRfdXVpZCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1oZWxwIikgPT0gMCkKKwl1c2FnZSAoYXJndlswXSwgMCk7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tdmVyc2lvbiIpID09IDApCisgICAgICAgIHZlcnNpb24gKCk7CisgICAgICBlbHNlCisgICAgICAgIHVzYWdlIChhcmd2WzBdLCAxKTsKKyAgICB9CisKKyAgaWYgKGdldF91dWlkICYmIGVuc3VyZV91dWlkKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkNhbid0IHNwZWNpZnkgYm90aCAtLWdldCBhbmQgLS1lbnN1cmVcbiIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgCisgIGlmIChnZXRfdXVpZCB8fCBlbnN1cmVfdXVpZCkKKyAgICB7CisgICAgICBjaGFyICp1dWlkOworICAgICAgaWYgKGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9nZXRfdXVpZCAoZmlsZW5hbWUsICZ1dWlkLCBlbnN1cmVfdXVpZCwgJmVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChnZXRfdXVpZCkgLyogcHJpbnQgbm90aGluZyBvbiAtLWVuc3VyZSAqLworICAgICAgICAgICAgcHJpbnRmICgiJXNcbiIsIHV1aWQpOworICAgICAgICAgIGRidXNfZnJlZSAodXVpZCk7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBjaGFyICp1dWlkOworICAgICAgaWYgKGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9jcmVhdGVfdXVpZCAoJnV1aWQpKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICgiJXNcbiIsIHV1aWQpOworICAgICAgICAgIGRidXNfZnJlZSAodXVpZCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCAiTm8gbWVtb3J5Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzXG4iLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGV4aXQgKDApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2RidXMvdG9vbHMvbGNvdi5hbSBiL2RidXMvdG9vbHMvbGNvdi5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmE0OTkxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90b29scy9sY292LmFtCkBAIC0wLDAgKzEsNDMgQEAKKyMgQ29weXJpZ2h0IMKpIDIwMDgtMjAxMSBDb2xsYWJvcmEgTHRkLgorIyBDb3B5cmlnaHQgwqkgMjAwOC0yMDExIE5va2lhIENvcnBvcmF0aW9uCisjCisjIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworIyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyMgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworIyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisjIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworIyBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyMgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIworIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorIyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyMKKyMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisjIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorIyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisjIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisjIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisjIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisjIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitsY292LXJlc2V0OgorCWxjb3YgLS1kaXJlY3RvcnkgQGFic190b3Bfc3JjZGlyQCAtLXplcm9jb3VudGVycworCitsY292LXJlcG9ydDoKKwlsY292IC0tZGlyZWN0b3J5IEBhYnNfdG9wX3NyY2RpckAgLS1jYXB0dXJlIFwKKwkJLS1vdXRwdXQtZmlsZSBAYWJzX3RvcF9idWlsZGRpckAvbGNvdi5pbmZvCisJJChta2Rpcl9wKSBAYWJzX3RvcF9idWlsZGRpckAvbGNvdi5odG1sCisJZ2l0X2NvbW1pdD1gR0lUX0RJUj1AYWJzX3RvcF9zcmNkaXJALy5naXQgZ2l0IGxvZyAtMSAtLXByZXR0eT1mb3JtYXQ6JWggMj4vZGV2L251bGxgO1wKKwlnZW5odG1sIC0tdGl0bGUgIkBQQUNLQUdFX1NUUklOR0AgJCRnaXRfY29tbWl0IiBcCisJCS0tb3V0cHV0LWRpcmVjdG9yeSBAYWJzX3RvcF9idWlsZGRpckAvbGNvdi5odG1sIGxjb3YuaW5mbworCUBlY2hvCisJQGVjaG8gJ2xjb3YgcmVwb3J0IGNhbiBiZSBmb3VuZCBpbjonCisJQGVjaG8gJ2ZpbGU6Ly9AYWJzX3RvcF9idWlsZGRpckAvbGNvdi5odG1sL2luZGV4Lmh0bWwnCisJQGVjaG8KKworbGNvdi1jaGVjazoKKwkkKE1BS0UpIGxjb3YtcmVzZXQKKwkkKE1BS0UpIGNoZWNrICQoTENPVl9DSEVDS19BUkdTKQorCSQoTUFLRSkgbGNvdi1yZXBvcnQKKworIyMgdmltOnNldCBmdD1hdXRvbWFrZToKZGlmZiAtLWdpdCBhL2RidXMvdG9vbHMvcnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLnNoIGIvZGJ1cy90b29scy9ydW4td2l0aC10bXAtc2Vzc2lvbi1idXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM5OTk5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdG9vbHMvcnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLnNoCkBAIC0wLDAgKzEsNzYgQEAKKyMhIC9iaW4vc2gKKworU0NSSVBUTkFNRT0kMAorV1JBUFBFRF9TQ1JJUFQ9JDEKK3NoaWZ0CisKK2RpZSgpIAoreworICAgIGlmICEgdGVzdCAteiAiJERCVVNfU0VTU0lPTl9CVVNfUElEIiA7IHRoZW4KKyAgICAgICAgZWNobyAia2lsbGluZyBtZXNzYWdlIGJ1cyAiJERCVVNfU0VTU0lPTl9CVVNfUElEID4mMgorICAgICAgICBraWxsIC05ICREQlVTX1NFU1NJT05fQlVTX1BJRAorICAgIGZpCisgICAgZWNobyAkU0NSSVBUTkFNRTogJCogPiYyCisgICAgZXhpdCAxCit9CisKK2lmIHRlc3QgLXogIiREQlVTX1RPUF9CVUlMRERJUiIgOyB0aGVuCisgICAgZGllICJNdXN0IHNldCBEQlVTX1RPUF9CVUlMRERJUiIKK2ZpCisKKyMjIGNvbnZlbmllbnQgdG8gYmUgYWJsZSB0byBjdHJsK0Mgd2l0aG91dCBsZWFraW5nIHRoZSBtZXNzYWdlIGJ1cyBwcm9jZXNzCit0cmFwICdkaWUgIlJlY2VpdmVkIFNJR0lOVCInIElOVAorCitDT05GSUdfRklMRT0uL3J1bi13aXRoLXRtcC1zZXNzaW9uLWJ1cy5jb25mCitTRVJWSUNFX0RJUj0iJERCVVNfVE9QX0JVSUxERElSL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzIgorRVNDQVBFRF9TRVJWSUNFX0RJUj1gZWNobyAkU0VSVklDRV9ESVIgfCBzZWQgLWUgJ3MvXC8vXFxcXFxcLy9nJ2AKK2VjaG8gImVzY2FwZWQgc2VydmljZSBkaXIgaXM6ICRFU0NBUEVEX1NFUlZJQ0VfRElSIiA+JjIKKworaWYgdGVzdCAteiAiJFNPVVJDRV9DT05GSUdfRklMRSI7IHRoZW4KKyAgICBTT1VSQ0VfQ09ORklHX0ZJTEU9IiREQlVTX1RPUF9CVUlMRERJUi9idXMvc2Vzc2lvbi5jb25mIjsKK2ZpCisjIyBjcmVhdGUgYSBjb25maWd1cmF0aW9uIGZpbGUgYmFzZWQgb24gdGhlIHN0YW5kYXJkIHNlc3Npb24uY29uZgorY2F0ICRTT1VSQ0VfQ09ORklHX0ZJTEUgfCAgXAorICAgIHNlZCAtZSAncy88c3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycy4qJC88c2VydmljZWRpcj4nJEVTQ0FQRURfU0VSVklDRV9ESVInPFwvc2VydmljZWRpcj4vZycgfCAgXAorICAgIHNlZCAtZSAncy88aW5jbHVkZS4qJC8vZycgICAgICAgICAgICAgICAgXAorICA+ICRDT05GSUdfRklMRQorCitlY2hvICJDcmVhdGVkIGNvbmZpZ3VyYXRpb24gZmlsZSAkQ09ORklHX0ZJTEUiID4mMgorCitpZiAhIHRlc3QgLWUgIiREQlVTX1RPUF9CVUlMRERJUiIvYnVzL2RidXMtZGFlbW9uIDsgdGhlbgorICAgIGRpZSAiJERCVVNfVE9QX0JVSUxERElSL2J1cy9kYnVzLWRhZW1vbiBkb2VzIG5vdCBleGlzdCIKK2ZpCisKK1BBVEg9IiREQlVTX1RPUF9CVUlMRERJUiIvYnVzOiRQQVRICitleHBvcnQgUEFUSAorCisjIyB0aGUgbGlidG9vbCBzY3JpcHQgZm91bmQgYnkgdGhlIHBhdGggc2VhcmNoIHNob3VsZCBhbHJlYWR5IGRvIHRoaXMsIGJ1dAorTERfTElCUkFSWV9QQVRIPSREQlVTX1RPUF9CVUlMRERJUi9kYnVzLy5saWJzOiRMRF9MSUJSQVJZX1BBVEgKK2V4cG9ydCBMRF9MSUJSQVJZX1BBVEgKK3Vuc2V0IERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUwordW5zZXQgREJVU19TRVNTSU9OX0JVU19QSUQKKworZWNobyAiUnVubmluZyAkREJVU19UT1BfQlVJTERESVIvdG9vbHMvZGJ1cy1sYXVuY2ggLS1zaC1zeW50YXggLS1jb25maWctZmlsZT0kQ09ORklHX0ZJTEUiID4mMgorCitEQlVTX1VTRV9URVNUX0JJTkFSWT0xIAorZXhwb3J0IERCVVNfVVNFX1RFU1RfQklOQVJZCitldmFsIGAkREJVU19UT1BfQlVJTERESVIvdG9vbHMvZGJ1cy1sYXVuY2ggLS1zaC1zeW50YXggLS1jb25maWctZmlsZT0kQ09ORklHX0ZJTEVgCisKK2lmIHRlc3QgLXogIiREQlVTX1NFU1NJT05fQlVTX1BJRCIgOyB0aGVuCisgICAgZGllICJGYWlsZWQgdG8gbGF1bmNoIG1lc3NhZ2UgYnVzIGZvciB0ZXN0IHNjcmlwdCB0byBydW4iCitmaQorCitlY2hvICJTdGFydGVkIGJ1cyBwaWQgJERCVVNfU0VTU0lPTl9CVVNfUElEIGF0ICREQlVTX1NFU1NJT05fQlVTX0FERFJFU1MiID4mMgorCisjIEV4ZWN1dGUgd3JhcHBlZCBzY3JpcHQKK2VjaG8gIlJ1bm5pbmcgJFdSQVBQRURfU0NSSVBUICRAIiA+JjIKKyRXUkFQUEVEX1NDUklQVCAiJEAiIHx8IGRpZSAic2NyaXB0IFwiJFdSQVBQRURfU0NSSVBUXCIgZmFpbGVkIgorCitraWxsIC1URVJNICREQlVTX1NFU1NJT05fQlVTX1BJRCB8fCBkaWUgIk1lc3NhZ2UgYnVzIHZhbmlzaGVkISBzaG91bGQgbm90IGhhdmUgaGFwcGVuZWQiICYmIGVjaG8gIktpbGxlZCBkYWVtb24gJERCVVNfU0VTU0lPTl9CVVNfUElEIiA+JjIKKworc2xlZXAgMgorCisjIyBiZSBzdXJlIGl0IHJlYWxseSBkaWVkIAora2lsbCAtOSAkREJVU19TRVNTSU9OX0JVU19QSUQgPiAvZGV2L251bGwgMj4mMSB8fCB0cnVlCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvZGJ1cy90b29scy9zdHJ0b2xsLmMgYi9kYnVzL3Rvb2xzL3N0cnRvbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGY1NzcwCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90b29scy9zdHJ0b2xsLmMKQEAgLTAsMCArMSwxNjYgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lmZGVmIERCVVNfV0lOQ0UKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2lmbmRlZiBpc3NwYWNlCisjZGVmaW5lIGlzc3BhY2UoYykgKChjKSA9PSAnICcgfHwgKGMpID09ICdcdCcgfHwgKGMpID09ICdccicgfHwgKGMpID09ICdcbicpCisjZW5kaWYKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIGxvbmcgbG9uZyBpbnQnIGNhbiBob2xkLiAgKi8KKyNpZm5kZWYgTExPTkdfTUFYCisjICAgZGVmaW5lIExMT05HX01BWAk5MjIzMzcyMDM2ODU0Nzc1ODA3TEwKKyNlbmRpZgorCisjaWZuZGVmIExMT05HX01JTgorIyAgIGRlZmluZSBMTE9OR19NSU4JKC1MTE9OR19NQVggLSAxTEwpCisjZW5kaWYKKy8qIE1heGltdW0gdmFsdWUgYW4gYHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQnIGNhbiBob2xkLiAgKE1pbmltdW0gaXMgMC4pICAqLworI2lmbmRlZiBVTExPTkdfTUFYCisjICAgZGVmaW5lIFVMTE9OR19NQVgJMTg0NDY3NDQwNzM3MDk1NTE2MTVVTEwKKyNlbmRpZgorLyoKKyAqIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBsb25nIGxvbmcgaW50ZWdlci4KKyAqCisgKiBBc3N1bWVzIHRoYXQgdGhlIHVwcGVyIGFuZCBsb3dlciBjYXNlCisgKiBhbHBoYWJldHMgYW5kIGRpZ2l0cyBhcmUgZWFjaCBjb250aWd1b3VzLgorICovCitsb25nIGxvbmcgc3RydG9sbCAoY29uc3QgY2hhciosIGNoYXIgKiosIGludCk7CisKK2xvbmcgbG9uZworc3RydG9sbChjb25zdCBjaGFyICogbnB0ciwgY2hhciAqKiBlbmRwdHIsIGludCBiYXNlKQoreworCWNvbnN0IGNoYXIgKnM7CisJdW5zaWduZWQgbG9uZyBsb25nIGFjYzsKKwljaGFyIGM7CisJdW5zaWduZWQgbG9uZyBsb25nIGN1dG9mZjsKKwlpbnQgbmVnLCBhbnksIGN1dGxpbTsKKworCS8qCisJICogU2tpcCB3aGl0ZSBzcGFjZSBhbmQgcGljayB1cCBsZWFkaW5nICsvLSBzaWduIGlmIGFueS4KKwkgKiBJZiBiYXNlIGlzIDAsIGFsbG93IDB4IGZvciBoZXggYW5kIDAgZm9yIG9jdGFsLCBlbHNlCisJICogYXNzdW1lIGRlY2ltYWw7IGlmIGJhc2UgaXMgYWxyZWFkeSAxNiwgYWxsb3cgMHguCisJICovCisJcyA9IG5wdHI7CisJZG8geworCQljID0gKnMrKzsKKwl9IHdoaWxlIChpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKWMpKTsKKwlpZiAoYyA9PSAnLScpIHsKKwkJbmVnID0gMTsKKwkJYyA9ICpzKys7CisJfSBlbHNlIHsKKwkJbmVnID0gMDsKKwkJaWYgKGMgPT0gJysnKQorCQkJYyA9ICpzKys7CisJfQorCWlmICgoYmFzZSA9PSAwIHx8IGJhc2UgPT0gMTYpICYmCisJICAgIGMgPT0gJzAnICYmICgqcyA9PSAneCcgfHwgKnMgPT0gJ1gnKSAmJgorCSAgICAoKHNbMV0gPj0gJzAnICYmIHNbMV0gPD0gJzknKSB8fAorCSAgICAoc1sxXSA+PSAnQScgJiYgc1sxXSA8PSAnRicpIHx8CisJICAgIChzWzFdID49ICdhJyAmJiBzWzFdIDw9ICdmJykpKSB7CisJCWMgPSBzWzFdOworCQlzICs9IDI7CisJCWJhc2UgPSAxNjsKKwl9CisJaWYgKGJhc2UgPT0gMCkKKwkJYmFzZSA9IGMgPT0gJzAnID8gOCA6IDEwOworCWFjYyA9IGFueSA9IDA7CisJaWYgKGJhc2UgPCAyIHx8IGJhc2UgPiAzNikKKwkJZ290byBub2NvbnY7CisKKwkvKgorCSAqIENvbXB1dGUgdGhlIGN1dG9mZiB2YWx1ZSBiZXR3ZWVuIGxlZ2FsIG51bWJlcnMgYW5kIGlsbGVnYWwKKwkgKiBudW1iZXJzLiAgVGhhdCBpcyB0aGUgbGFyZ2VzdCBsZWdhbCB2YWx1ZSwgZGl2aWRlZCBieSB0aGUKKwkgKiBiYXNlLiAgQW4gaW5wdXQgbnVtYmVyIHRoYXQgaXMgZ3JlYXRlciB0aGFuIHRoaXMgdmFsdWUsIGlmCisJICogZm9sbG93ZWQgYnkgYSBsZWdhbCBpbnB1dCBjaGFyYWN0ZXIsIGlzIHRvbyBiaWcuICBPbmUgdGhhdAorCSAqIGlzIGVxdWFsIHRvIHRoaXMgdmFsdWUgbWF5IGJlIHZhbGlkIG9yIG5vdDsgdGhlIGxpbWl0CisJICogYmV0d2VlbiB2YWxpZCBhbmQgaW52YWxpZCBudW1iZXJzIGlzIHRoZW4gYmFzZWQgb24gdGhlIGxhc3QKKwkgKiBkaWdpdC4gIEZvciBpbnN0YW5jZSwgaWYgdGhlIHJhbmdlIGZvciBxdWFkcyBpcworCSAqIFstOTIyMzM3MjAzNjg1NDc3NTgwOC4uOTIyMzM3MjAzNjg1NDc3NTgwN10gYW5kIHRoZSBpbnB1dCBiYXNlCisJICogaXMgMTAsIGN1dG9mZiB3aWxsIGJlIHNldCB0byA5MjIzMzcyMDM2ODU0Nzc1ODAgYW5kIGN1dGxpbSB0bworCSAqIGVpdGhlciA3IChuZWc9PTApIG9yIDggKG5lZz09MSksIG1lYW5pbmcgdGhhdCBpZiB3ZSBoYXZlCisJICogYWNjdW11bGF0ZWQgYSB2YWx1ZSA+IDkyMjMzNzIwMzY4NTQ3NzU4MCwgb3IgZXF1YWwgYnV0IHRoZQorCSAqIG5leHQgZGlnaXQgaXMgPiA3IChvciA4KSwgdGhlIG51bWJlciBpcyB0b28gYmlnLCBhbmQgd2Ugd2lsbAorCSAqIHJldHVybiBhIHJhbmdlIGVycm9yLgorCSAqCisJICogU2V0ICdhbnknIGlmIGFueSBgZGlnaXRzJyBjb25zdW1lZDsgbWFrZSBpdCBuZWdhdGl2ZSB0byBpbmRpY2F0ZQorCSAqIG92ZXJmbG93LgorCSAqLworCWN1dG9mZiA9IG5lZyA/ICh1bnNpZ25lZCBsb25nIGxvbmcpLShMTE9OR19NSU4gKyBMTE9OR19NQVgpICsgTExPTkdfTUFYCisJICAgIDogTExPTkdfTUFYOworCWN1dGxpbSA9IGN1dG9mZiAlIGJhc2U7CisJY3V0b2ZmIC89IGJhc2U7CisJZm9yICggOyA7IGMgPSAqcysrKSB7CisJCWlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKKwkJCWMgLT0gJzAnOworCQllbHNlIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykKKwkJCWMgLT0gJ0EnIC0gMTA7CisJCWVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKQorCQkJYyAtPSAnYScgLSAxMDsKKwkJZWxzZQorCQkJYnJlYWs7CisJCWlmIChjID49IGJhc2UpCisJCQlicmVhazsKKwkJaWYgKGFueSA8IDAgfHwgYWNjID4gY3V0b2ZmIHx8IChhY2MgPT0gY3V0b2ZmICYmIGMgPiBjdXRsaW0pKQorCQkJYW55ID0gLTE7CisJCWVsc2UgeworCQkJYW55ID0gMTsKKwkJCWFjYyAqPSBiYXNlOworCQkJYWNjICs9IGM7CisJCX0KKwl9CisJaWYgKGFueSA8IDApIHsKKwkJYWNjID0gbmVnID8gTExPTkdfTUlOIDogTExPTkdfTUFYOworI2lmZGVmIERCVVNfV0lOQ0UKKwkJU2V0TGFzdEVycm9yIChFUlJPUl9BUklUSE1FVElDX09WRVJGTE9XKTsKKyNlbHNlCisJCWVycm5vID0gRVJBTkdFOworI2VuZGlmCisJfSBlbHNlIGlmICghYW55KSB7Citub2NvbnY6CisjaWZkZWYgREJVU19XSU5DRQorCQlTZXRMYXN0RXJyb3IgKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKKyNlbHNlCisJCWVycm5vID0gRUlOVkFMOworI2VuZGlmCisJfSBlbHNlIGlmIChuZWcpCisJCWFjYyA9IC1hY2M7CisJaWYgKGVuZHB0ciAhPSBOVUxMKQorCQkqZW5kcHRyID0gKGNoYXIgKikoYW55ID8gcyAtIDEgOiBucHRyKTsKKwlyZXR1cm4gKGFjYyk7Cit9CisKZGlmZiAtLWdpdCBhL2RidXMvdG9vbHMvc3RydG91bGwuYyBiL2RidXMvdG9vbHMvc3RydG91bGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTljNTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy90b29scy9zdHJ0b3VsbC5jCkBAIC0wLDAgKzEsMTQ0IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MiwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2lmZGVmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZmRlZiBEQlVTX1dJTkNFCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKyNpZm5kZWYgaXNzcGFjZQorI2RlZmluZSBpc3NwYWNlKGMpICgoYykgPT0gJyAnIHx8IChjKSA9PSAnXHQnIHx8IChjKSA9PSAnXHInIHx8IChjKSA9PSAnXG4nKQorI2VuZGlmCisKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYHNpZ25lZCBsb25nIGxvbmcgaW50JyBjYW4gaG9sZC4gICovCisjaWZuZGVmIExMT05HX01BWAorIyAgIGRlZmluZSBMTE9OR19NQVgJOTIyMzM3MjAzNjg1NDc3NTgwN0xMCisjZW5kaWYKKworI2lmbmRlZiBMTE9OR19NSU4KKyMgICBkZWZpbmUgTExPTkdfTUlOCSgtTExPTkdfTUFYIC0gMUxMKQorI2VuZGlmCisvKiBNYXhpbXVtIHZhbHVlIGFuIGB1bnNpZ25lZCBsb25nIGxvbmcgaW50JyBjYW4gaG9sZC4gIChNaW5pbXVtIGlzIDAuKSAgKi8KKyNpZm5kZWYgVUxMT05HX01BWAorIyAgIGRlZmluZSBVTExPTkdfTUFYCTE4NDQ2NzQ0MDczNzA5NTUxNjE1VUxMCisjZW5kaWYKKworLyoKKyAqIENvbnZlcnQgYSBzdHJpbmcgdG8gYW4gdW5zaWduZWQgbG9uZyBsb25nIGludGVnZXIuCisgKgorICogQXNzdW1lcyB0aGF0IHRoZSB1cHBlciBhbmQgbG93ZXIgY2FzZQorICogYWxwaGFiZXRzIGFuZCBkaWdpdHMgYXJlIGVhY2ggY29udGlndW91cy4KKyAqLwordW5zaWduZWQgbG9uZyBsb25nIHN0cnRvdWxsIChjb25zdCBjaGFyICosIGNoYXIgKiosIGludCk7CisKK3Vuc2lnbmVkIGxvbmcgbG9uZworc3RydG91bGwoY29uc3QgY2hhciAqIG5wdHIsIGNoYXIgKiogZW5kcHRyLCBpbnQgYmFzZSkKK3sKKwljb25zdCBjaGFyICpzOworCXVuc2lnbmVkIGxvbmcgbG9uZyBhY2M7CisJY2hhciBjOworCXVuc2lnbmVkIGxvbmcgbG9uZyBjdXRvZmY7CisJaW50IG5lZywgYW55LCBjdXRsaW07CisKKwkvKgorCSAqIFNlZSBzdHJ0b3EgZm9yIGNvbW1lbnRzIGFzIHRvIHRoZSBsb2dpYyB1c2VkLgorCSAqLworCXMgPSBucHRyOworCWRvIHsKKwkJYyA9ICpzKys7CisJfSB3aGlsZSAoaXNzcGFjZSgodW5zaWduZWQgY2hhciljKSk7CisJaWYgKGMgPT0gJy0nKSB7CisJCW5lZyA9IDE7CisJCWMgPSAqcysrOworCX0gZWxzZSB7CisJCW5lZyA9IDA7CisJCWlmIChjID09ICcrJykKKwkJCWMgPSAqcysrOworCX0KKwlpZiAoKGJhc2UgPT0gMCB8fCBiYXNlID09IDE2KSAmJgorCSAgICBjID09ICcwJyAmJiAoKnMgPT0gJ3gnIHx8ICpzID09ICdYJykgJiYKKwkgICAgKChzWzFdID49ICcwJyAmJiBzWzFdIDw9ICc5JykgfHwKKwkgICAgKHNbMV0gPj0gJ0EnICYmIHNbMV0gPD0gJ0YnKSB8fAorCSAgICAoc1sxXSA+PSAnYScgJiYgc1sxXSA8PSAnZicpKSkgeworCQljID0gc1sxXTsKKwkJcyArPSAyOworCQliYXNlID0gMTY7CisJfQorCWlmIChiYXNlID09IDApCisJCWJhc2UgPSBjID09ICcwJyA/IDggOiAxMDsKKwlhY2MgPSBhbnkgPSAwOworCWlmIChiYXNlIDwgMiB8fCBiYXNlID4gMzYpCisJCWdvdG8gbm9jb252OworCisJY3V0b2ZmID0gVUxMT05HX01BWCAvIGJhc2U7CisJY3V0bGltID0gVUxMT05HX01BWCAlIGJhc2U7CisJZm9yICggOyA7IGMgPSAqcysrKSB7CisJCWlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKKwkJCWMgLT0gJzAnOworCQllbHNlIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykKKwkJCWMgLT0gJ0EnIC0gMTA7CisJCWVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKQorCQkJYyAtPSAnYScgLSAxMDsKKwkJZWxzZQorCQkJYnJlYWs7CisJCWlmIChjID49IGJhc2UpCisJCQlicmVhazsKKwkJaWYgKGFueSA8IDAgfHwgYWNjID4gY3V0b2ZmIHx8IChhY2MgPT0gY3V0b2ZmICYmIGMgPiBjdXRsaW0pKQorCQkJYW55ID0gLTE7CisJCWVsc2UgeworCQkJYW55ID0gMTsKKwkJCWFjYyAqPSBiYXNlOworCQkJYWNjICs9IGM7CisJCX0KKwl9CisJaWYgKGFueSA8IDApIHsKKwkJYWNjID0gVUxMT05HX01BWDsKKyNpZmRlZiBEQlVTX1dJTkNFCisJCVNldExhc3RFcnJvciAoRVJST1JfQVJJVEhNRVRJQ19PVkVSRkxPVyk7CisjZWxzZQorCQllcnJubyA9IEVSQU5HRTsKKyNlbmRpZgorCX0gZWxzZSBpZiAoIWFueSkgeworbm9jb252OgorI2lmZGVmIERCVVNfV0lOQ0UKKwkJU2V0TGFzdEVycm9yIChFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CisjZWxzZQorCQllcnJubyA9IEVJTlZBTDsKKyNlbmRpZgorCX0gZWxzZSBpZiAobmVnKQorCQlhY2MgPSAtYWNjOworCWlmIChlbmRwdHIgIT0gTlVMTCkKKwkJKmVuZHB0ciA9IChjaGFyICopKGFueSA/IHMgLSAxIDogbnB0cik7CisJcmV0dXJuIChhY2MpOworfQo=